From c274c05ce3253de50eaa934ac93dd898499edbaf Mon Sep 17 00:00:00 2001 From: RuesanG <34343052+RuesanG@users.noreply.github.com> Date: Fri, 19 Feb 2021 03:59:22 +0100 Subject: [PATCH 01/27] Update reVC German.txt --- utils/gxt/german.txt | 50 ++++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/utils/gxt/german.txt b/utils/gxt/german.txt index f5ff5e24..4d40e06b 100644 --- a/utils/gxt/german.txt +++ b/utils/gxt/german.txt @@ -14585,10 +14585,10 @@ GRAPHICS SETUP MIP MAPPING [FED_AAS] -ANTI ALIASING +KANTENGLÄTTUNG [FED_FIL] -TEXTURE FILTERING +TEXTURFILTERUNG [FED_BIL] BILINEAR @@ -14597,44 +14597,44 @@ BILINEAR TRILINEAR [FED_WND] -WINDOWED +FENSTERMODUS [FED_FLS] -FULLSCREEN +VOLLBILD [FEM_CSB] -CUTSCENE BORDERS +CUTSCENE BALKEN [FEM_SCF] -SCREEN FORMAT +BILDSCHIRMFORMAT [FEM_ISL] -MAP MEMORY USAGE +KARTENSPEICHERNUTZUNG [FEM_LOW] -LOW +NIEDRIG [FEM_MED] -MEDIUM +MITTEL [FEM_HIG] -HIGH +HOCH [FEM_2PR] PS2 ALPHA TEST [FEC_FRC] -FREE CAM +FREIE KAMERA { Linux joy detection } [FEC_JOD] -DETECT JOYSTICK +JOYSTICK ERKENNEN [FEC_JPR] -Press any key on the joystick of your choice that you want to use on the game, and it will be selected. +Drücken Sie eine beliebige Taste auf dem Joystick den Sie für das Spiel verwenden möchten, und er wird ausgewählt. [FEC_JDE] -Detected joystick +Joystick erkannt { mission restart } [FET_RMS] @@ -14644,25 +14644,25 @@ MISSION WIEDERHOLEN WIEDERHOLEN? [FED_VPL] -VEHICLE PIPELINE +FAHRZEUG-PIPELINE [FED_PRM] -PED RIM LIGHT +CHARAKTER KANTEN LICHT [FED_RGL] -ROAD GLOSS +GLÄNZENDE STRAßEN [FED_CLF] -COLOUR FILTER +FARBFILTER [FED_WLM] -WORLD LIGHTMAPS +WELT LIGHTMAPS [FED_MBL] -MOTION BLUR +BEWEGUNGSUNSCHÄRFE [FEM_SIM] -SIMPLE +SIMPEL [FEM_NRM] NORMAL @@ -14683,7 +14683,7 @@ PS2 XBOX [FEC_IVP] -INVERT PAD VERTICALLY +PAD VERTIKAL INVERTIEREN [FEM_NON] NONE @@ -14704,14 +14704,14 @@ XBOX 360 CONTROLLER XBOX ONE CONTROLLER [FEC_TYP] -GAMEPAD TYPE +GAMEPAD-TYP [FET_AGS] -GAMEPAD SETTINGS +KONTROLLEREINSTELLUNGEN [FEM_AUT] { aspect ratio related } AUTO [DUMMY] THIS LABEL NEEDS TO BE HERE !!! -AS THE LAST LABEL DOES NOT GET COMPILED \ No newline at end of file +AS THE LAST LABEL DOES NOT GET COMPILED From 79c010f08275a7152e920bd0a9e3dbf6493f5b4c Mon Sep 17 00:00:00 2001 From: withmorten Date: Thu, 8 Jul 2021 01:44:55 +0200 Subject: [PATCH 02/27] fix macro redefinition warnings on win-glfw build --- src/audio/sampman_miles.cpp | 1 + src/control/Script.cpp | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/audio/sampman_miles.cpp b/src/audio/sampman_miles.cpp index e8c28dc4..49f2f10f 100644 --- a/src/audio/sampman_miles.cpp +++ b/src/audio/sampman_miles.cpp @@ -1,3 +1,4 @@ +#define WITHWINDOWS #include "common.h" #ifdef AUDIO_MSS diff --git a/src/control/Script.cpp b/src/control/Script.cpp index 4b70a678..1eee1c9e 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -2209,8 +2209,9 @@ int scriptToLoad = 0; const char *scriptfile = "main.scm"; #ifdef _WIN32 -#include +extern "C" __declspec(dllimport) short __stdcall GetAsyncKeyState(int); #endif + int open_script() { // glfwGetKey doesn't work because of CGame::Initialise is blocking From 72f67809059c732588ac29eedf8a10f9156b27b4 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Thu, 8 Jul 2021 03:37:14 +0300 Subject: [PATCH 03/27] Use CPad functions to check key states in script loader --- src/control/Script.cpp | 15 +++++---------- src/core/Frontend.cpp | 10 +--------- 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/src/control/Script.cpp b/src/control/Script.cpp index 1eee1c9e..76ab9471 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -2208,21 +2208,16 @@ void CRunningScript::Init() int scriptToLoad = 0; const char *scriptfile = "main.scm"; -#ifdef _WIN32 -extern "C" __declspec(dllimport) short __stdcall GetAsyncKeyState(int); -#endif - int open_script() { - // glfwGetKey doesn't work because of CGame::Initialise is blocking -#ifdef _WIN32 - if (GetAsyncKeyState('G') & 0x8000) + // glfwGetKey doesn't work because of CGame::Initialise is blocking + CPad::UpdatePads(); + if (CPad::GetPad(0)->GetChar('G')) scriptToLoad = 0; - if (GetAsyncKeyState('R') & 0x8000) + if (CPad::GetPad(0)->GetChar('R')) scriptToLoad = 1; - if (GetAsyncKeyState('D') & 0x8000) + if (CPad::GetPad(0)->GetChar('D')) scriptToLoad = 2; -#endif switch (scriptToLoad) { case 0: scriptfile = "main.scm"; break; case 1: scriptfile = "freeroam_miami.scm"; break; diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp index 13db6b98..632a69ab 100644 --- a/src/core/Frontend.cpp +++ b/src/core/Frontend.cpp @@ -4558,19 +4558,11 @@ CMenuManager::ProcessUserInput(uint8 goDown, uint8 goUp, uint8 optionSelected, u #ifdef USE_DEBUG_SCRIPT_LOADER if (m_nCurrScreen == MENUPAGE_START_MENU || m_nCurrScreen == MENUPAGE_NEW_GAME || m_nCurrScreen == MENUPAGE_NEW_GAME_RELOAD) { -#ifdef RW_GL3 - if (glfwGetKey(PSGLOBAL(window), GLFW_KEY_R) == GLFW_PRESS) { + if (CPad::GetPad(0)->GetChar('R')) { scriptToLoad = 1; DoSettingsBeforeStartingAGame(); return; } -#elif defined _WIN32 - if (GetAsyncKeyState('R') & 0x8000) { - scriptToLoad = 1; - DoSettingsBeforeStartingAGame(); - return; - } -#endif } #endif From 0b269571d78487733d786d677e5f831d1781ef95 Mon Sep 17 00:00:00 2001 From: withmorten Date: Fri, 9 Jul 2021 18:05:26 +0200 Subject: [PATCH 04/27] add librw defines to vanilla defines undefs --- src/core/config.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/core/config.h b/src/core/config.h index ff44eef1..2a3b8e6d 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -464,6 +464,11 @@ static_assert(false, "SUPPORT_XBOX_SCRIPT and SUPPORT_MOBILE_SCRIPT are mutually #undef DISABLE_LOADING_SCREEN #undef DISABLE_VSYNC_ON_TEXTURE_CONVERSION +#undef EXTENDED_COLOURFILTER +#undef EXTENDED_PIPELINES +#undef SCREEN_DROPLETS +#undef NEW_RENDERER + #undef FIX_SPRITES #define PC_WATER From ffe199290bc2540d33d438c40f67157bdb0cb0a1 Mon Sep 17 00:00:00 2001 From: withmorten Date: Fri, 9 Jul 2021 18:51:27 +0200 Subject: [PATCH 05/27] fix jittery cars at 15fps --- src/vehicles/Vehicle.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/vehicles/Vehicle.cpp b/src/vehicles/Vehicle.cpp index a41e0fa0..932f4fbc 100644 --- a/src/vehicles/Vehicle.cpp +++ b/src/vehicles/Vehicle.cpp @@ -812,11 +812,12 @@ CVehicle::ProcessWheel(CVector &wheelFwd, CVector &wheelRight, CVector &wheelCon if(contactSpeedRight != 0.0f){ // exert opposing force right = -contactSpeedRight/wheelsOnGround; -#ifdef FIX_BUGS + // BUG? // contactSpeedRight is independent of framerate but right has timestep as a factor // so we probably have to fix this - right *= CTimer::GetTimeStepFix(); -#endif + // fixing this causes jittery cars at 15fps, and causes the car to move backwards slowly at 18fps + // at 19fps, the effects are gone ... + //right *= CTimer::GetTimeStepFix(); if(wheelStatus == WHEEL_STATUS_BURST){ float fwdspeed = Min(contactSpeedFwd, fBurstSpeedMax); From 026cd10f3fdbd92c089830e5067c4457c53c1b51 Mon Sep 17 00:00:00 2001 From: withmorten Date: Sat, 10 Jul 2021 00:43:26 +0200 Subject: [PATCH 06/27] Update german.txt --- utils/gxt/german.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/gxt/german.txt b/utils/gxt/german.txt index 4d40e06b..23047f03 100644 --- a/utils/gxt/german.txt +++ b/utils/gxt/german.txt @@ -14579,7 +14579,7 @@ RUSSISCH { new display menus } [FET_GFX] -GRAPHICS SETUP +GRAFIK-SETUP [FED_MIP] MIP MAPPING @@ -14631,7 +14631,7 @@ FREIE KAMERA JOYSTICK ERKENNEN [FEC_JPR] -Drücken Sie eine beliebige Taste auf dem Joystick den Sie für das Spiel verwenden möchten, und er wird ausgewählt. +Drücke eine beliebige Taste auf dem Joystick der für das Spiel verwendet werden soll, und er wird ausgewählt. [FEC_JDE] Joystick erkannt From ddf2b09e559025606440ef89446939f2a08e5988 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Sat, 10 Jul 2021 02:04:35 +0300 Subject: [PATCH 07/27] Update GXT compiler with fix of German --- utils/gxt/german.txt | 1130 +++++++++++++++++++++--------------------- utils/gxt/gxt.exe | Bin 125440 -> 307200 bytes 2 files changed, 565 insertions(+), 565 deletions(-) diff --git a/utils/gxt/german.txt b/utils/gxt/german.txt index f5ff5e24..3d0c7e36 100644 --- a/utils/gxt/german.txt +++ b/utils/gxt/german.txt @@ -15,7 +15,7 @@ AMOKLAUF FEHLGESCHLAGEN!! AMOKLAUF BESTANDEN!! [RAMP_A] -ALLE AMOKLÃUFE BESTANDEN!! +ALLE AMOKLÄUFE BESTANDEN!! [PAGE_01] Dein Job: ~1~ Gang-Mitglieder in 2 Minuten! @@ -108,7 +108,7 @@ Immobilie Pay 'n' Spray [LG_23] -Bekleidungsgeschãft +Bekleidungsgeschäft [LG_24] Tommys Villa @@ -198,7 +198,7 @@ Kaufman-Taxis Die Bootswerft [WANT_L] -Dein Fahndungslevel ist bis auf weiteres aufgehoben. Solltest du ein Verbrechen begehen, wãhrend die Sterne blinken, wird dein volles Fahndungslevel wieder aktiv. +Dein Fahndungslevel ist bis auf weiteres aufgehoben. Solltest du ein Verbrechen begehen, während die Sterne blinken, wird dein volles Fahndungslevel wieder aktiv. [PICK1] Kugelsichere Weste im Ocean View Hotel angeliefert! @@ -240,7 +240,7 @@ Ziel ~g~Hey! Zurück ins Auto!! [HEY] -~g~Keine Alleingãnge. Halt die Gang beisammen! +~g~Keine Alleingänge. Halt die Gang beisammen! [HELP3] Du kannst nur kurze Zeit sprinten, ohne müde zu werden. @@ -252,10 +252,10 @@ Drücke den~h~ rechten Analog-Stick nach oben, um zu ~h~beschleunigen. Zieh den ~h~rechten Analog-Stick~w~ zurück, um zu ~h~bremsen~w~, oder um ~h~zurückzusetzen~w~, wenn das Fahrzeug steht. [HELP7_A] -Halte die~h~ ~k~~PED_LOCK_TARGET~ ~w~gedrückt, um mit dem Prãzisionsgewehr zu zielen. +Halte die~h~ ~k~~PED_LOCK_TARGET~ ~w~gedrückt, um mit dem Präzisionsgewehr zu zielen. [HELP7_D] -Halte die~h~ ~k~~PED_LOCK_TARGET~ ~w~gedrückt, um mit dem Prãzisionsgewehr zu zielen. +Halte die~h~ ~k~~PED_LOCK_TARGET~ ~w~gedrückt, um mit dem Präzisionsgewehr zu zielen. [HELP10] Dieser Stern zeigt an, dass du von der Polizei gesucht wirst. @@ -354,7 +354,7 @@ drei... Steigt dein ~h~Fahndungslevel~w~, wirst du von besser ausgebildeten Polizisten gejagt. [WANT_G] -Wirst du ~h~verhaftet~w~, wirst du zum nãchsten Polizeirevier gebracht. +Wirst du ~h~verhaftet~w~, wirst du zum nächsten Polizeirevier gebracht. [WANT_H] Die Cops werden dir alle Waffen abnehmen und kassieren ein wenig Bestechungsgeld von dir. @@ -369,16 +369,16 @@ Im Verlauf des Spiels wirst du Möglichkeiten entdecken, deinen Fahndungslevel z Wenn du in einem Wagen sitzt, werden ~h~LACKIEREREIEN~w~ den Fahndungslevel ~h~annullieren. [HEAL_B] -Wenn du ~h~'außer Gefecht'~w~ bist, wirst du zur nãchsten Klinik gebracht. +Wenn du ~h~'außer Gefecht'~w~ bist, wirst du zur nächsten Klinik gebracht. [HEAL_C] -Du verlierst alle Waffen, und die Ãrzte knöpfen dir ein wenig Cash für die Behandlung ab. +Du verlierst alle Waffen, und die Ärzte knöpfen dir ein wenig Cash für die Behandlung ab. [HEAL_E] -Je lãnger du spielst, desto mehr Wege wirst du finden, dich selbst zu verarzten oder zu schützen. +Je länger du spielst, desto mehr Wege wirst du finden, dich selbst zu verarzten oder zu schützen. [SAVE1] -Stell dich in die Markierung. So kannst du dein ~h~Spiel speichern~w~. Wãhrend einer Mission kannst du nicht speichern. +Stell dich in die Markierung. So kannst du dein ~h~Spiel speichern~w~. Während einer Mission kannst du nicht speichern. [SAVE2] Jedes Fahrzeug, das in dieser Garage abgestellt wird, wird für dich aufbewahrt, wenn das Spiel gespeichert wird. @@ -393,7 +393,7 @@ ZEIT: Du hast nicht genug Cash für dieses Objekt. [PROP_2] -Wãhrend einer Mission kannst du keine Objekte kaufen. +Während einer Mission kannst du keine Objekte kaufen. [IND_ZON] Vice City Beach @@ -465,7 +465,7 @@ MP Kruger [SNIPE] -Prãzisionsgewehr +Präzisionsgewehr [GRENADE] Granaten @@ -477,16 +477,16 @@ Schrotflinte S.P.A.S. 12 [SHOTGN3] -Abgesãgte Schrotflinte +Abgesägte Schrotflinte [ARMOUR] Kugelsichere Weste [LASER] -.308 Prãzisionsgewehr +.308 Präzisionsgewehr [BASEBAT] -Baseballschlãger +Baseballschläger [HAMMER] Hammer @@ -507,7 +507,7 @@ Messer Katana [CHAINSA] -Kettensãge +Kettensäge [G_COST] $~1~ @@ -558,7 +558,7 @@ Die Geschworenen Aufruhr [COL_1] -Der Verrãter +Der Verräter [COL_2] Kugelhagel im Einkaufszentrum @@ -654,7 +654,7 @@ Eiscreme und andere Leckereien Schlagende Argumente [TEX_2] -Das Begrãbnis +Das Begräbnis [TEX_3] Schutt und Asche @@ -726,7 +726,7 @@ Gefeuert! Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um den Anruf auf deinem Handy entgegenzunehmen. [MOB_01A] -Hey, mein Alter! Paul hier. Ich hãtte da vielleicht was für dich, aber das müssen wir unter vier Augen besprechen. +Hey, mein Alter! Paul hier. Ich hätte da vielleicht was für dich, aber das müssen wir unter vier Augen besprechen. [MOB_01B] Ich bin im Malibu und lass es mir gutgehen. @@ -741,7 +741,7 @@ Hey! Hallo, Tommy? Tommy! In der Druckerei ist irgendwas im Busch. Fahr mal rüber und kümmere dich darum. [MOB_02C] -Es scheint ziemlichen Ãrger zu geben. Ich muss Schluss machen. +Es scheint ziemlichen Ärger zu geben. Ich muss Schluss machen. [MOB_03A] Mr. Vercetti? Ich habe hier einen unterschriebenen Wisch, @@ -768,7 +768,7 @@ Wie geht's, mein Alter? Ich hab vergessen, dir zu sagen, dass wir für das Konzert noch ein paar Ordner brauchen. [MOB_04C] -Da gibt's so 'ne Biker-Gang, die wãr super für die Publicity. +Da gibt's so 'ne Biker-Gang, die wär super für die Publicity. [MOB_04D] Wenn du mir das arrangierst, besorg ich dir 'n VIP-Pass für den Abend. Ok? @@ -795,7 +795,7 @@ Wenn du willst, kocht Tante Poulet dir ein leckeres Süppchen, dann kannst du ma Komm doch die Tage mal bei mir vorbei, ok, Tommy? [MOB_08A] -Tommy, ich dachte mir, du könntest meinen Rat als Geschãftsmann brauchen. +Tommy, ich dachte mir, du könntest meinen Rat als Geschäftsmann brauchen. [MOB_08B] Wenn du ein Unternehmen am Laufen hast, musst du einmal pro Woche die Einnahmen kassieren gehen. @@ -813,7 +813,7 @@ Ok, ok. Ich weiß ja, dass du Bescheid weißt. Ich meinte ja nur, damit du weißt, dass ich im Zweifelsfall auch Bescheid weiß. [MOB_08G] -Nur für alle Fãlle, mein Alter! +Nur für alle Fälle, mein Alter! [MOB_08H] Wenn du meinst, Ken... @@ -825,7 +825,7 @@ Hey, Leo! Ich hab Arbeit für dich! Hier ist nicht Leo. [MOB_09C] -Hey, wenn Leo erfãhrt, dass du mit seinem Handy telefonierst, bist du fãllig. +Hey, wenn Leo erfährt, dass du mit seinem Handy telefonierst, bist du fällig. [MOB_09E] Du hast Leo erledigt? Du musst Mumm haben - willst du für mich arbeiten? @@ -840,7 +840,7 @@ Tommy! Du musst mir einen Gefallen tun. Steve! Was machen die Dreharbeiten? [MOB_10C] -Gut. Ich- ãh, WIR brauchen noch eine Autoverfolgungsjagd, aber unser Budget ist knapp. +Gut. Ich- äh, WIR brauchen noch eine Autoverfolgungsjagd, aber unser Budget ist knapp. [MOB_10D] Ich hab in der Stadt verteilt ein paar Karren stehen. Du weißt, was zu tun ist. @@ -867,10 +867,10 @@ Also, halt die Augen offen, dann könnte sich dir die ideale Gelegenheit bieten. Ciao, Avery. [MOB12_A] -Hey, Tommy. Avery hier. Hör mal, ich hab gerade alle Hãnde voll zu tun, +Hey, Tommy. Avery hier. Hör mal, ich hab gerade alle Hände voll zu tun, [MOB12_B] -und ein Bevollmãchtigter von mir müsste zu den Gator Keys eskortiert werden. +und ein Bevollmächtigter von mir müsste zu den Gator Keys eskortiert werden. [MOB12_C] Ich will da ein Stück Land kaufen und schick ihn hin, um den Deal abzuschließen. @@ -903,7 +903,7 @@ Tja, war nett, mit Ihnen zu plaudern... WARTEN SIE! Vercetti - Tommy, kann ich Tommy zu Ihnen sagen? [MOB13_F] -Wir sind beide Geschãftsleute. Sie erkennen doch ein gutes Geschãft sofort, oder? +Wir sind beide Geschäftsleute. Sie erkennen doch ein gutes Geschäft sofort, oder? [MOB13_G] Ich hab keine Zeit für Palaver. Kommen Sie zum Punkt. @@ -957,7 +957,7 @@ würdest du dich sicher verpflichtet fühlen, mir 'n Stück davon abzugeben? Ich werd dich nicht vergessen. Danke, Kent. [MOB_14H] -'Paul'heiße ich, Scherzkeks. Ich KOMME aus Kent, Nãhe London. +'Paul'heiße ich, Scherzkeks. Ich KOMME aus Kent, Nähe London. [MOB_14I] Mein geographisches Wissen über England ist eben nicht mehr, was es war. @@ -990,7 +990,7 @@ Sehr witzig. Du weißt, dass ich mit getürkter Ware nichts am Hut habe. Wollte nur hören, ob ich nicht 'ne Rolle in einem von deinen Filmen kriegen könnte. [MOB16_E] -In England habe ich viel einschlãgiges Zeug gedreht. +In England habe ich viel einschlägiges Zeug gedreht. [MOB16_F] Ich hab mehr zu bieten als du, mein Alter. @@ -999,7 +999,7 @@ Ich hab mehr zu bieten als du, mein Alter. Paul, danke für das Angebot. Ich komm auf dich zurück. [MOB16_H] -Lass mich nicht hãngen. Denk dran, was ich alles für dich getan habe. +Lass mich nicht hängen. Denk dran, was ich alles für dich getan habe. [MOB16_I] Das versuch ich ja grade zu vergessen. @@ -1008,7 +1008,7 @@ Das versuch ich ja grade zu vergessen. Tommy Vercetti. Wie geht's, großer Meister? [MOB17_B] -Man hört so einiges über dich. Bist jetzt 'ne große Nummer in der Stadt, hã? +Man hört so einiges über dich. Bist jetzt 'ne große Nummer in der Stadt, hä? [MOB17_C] Paul, du bist betrunken. @@ -1026,10 +1026,10 @@ Und du brauchst mich nicht dumm anzureden. Ich bin nicht irgendwer. Wer hat dir denn in dieser Stadt den Weg geebnet? Ich! [MOB17_H] -Tatsãchlich? +Tatsächlich? [MOB17_I] -Tatsãchlich! +Tatsächlich! [MOB17_J] Paul, reg dich ab. Ich hatte viel zu tun. Sei kein Idiot. @@ -1038,7 +1038,7 @@ Paul, reg dich ab. Ich hatte viel zu tun. Sei kein Idiot. Ich bin kein Idiot. Das haben sie schon im Jugendknast gesagt. [MOB17_L] -Wenn du Ãrger haben willst, Freundchen, den kannst du haben! +Wenn du Ärger haben willst, Freundchen, den kannst du haben! [MOB17_M] Tommy, bitte! Du warst meine große Hoffnung. Bitte, mach dich nicht lustig über mich! @@ -1056,16 +1056,16 @@ Echt der Hammer. Du glaubst nicht, was mir für 'ne Puppe über den Weg gelaufen 'ne Bordsteinschwalbe, oder sowas. Unten in Little Havana. [MOB18_D] -Sagt, sie heißt Mercedes oder so ãhnlich. Wahnsinn, Alter. Die Puppe musst du dir geben. +Sagt, sie heißt Mercedes oder so ähnlich. Wahnsinn, Alter. Die Puppe musst du dir geben. [MOB18_E] -Da würde 'nen Toter Hormonkoller kriegen. Sie sagt, ich wãr der beste, den sie je hatte. +Da würde 'nen Toter Hormonkoller kriegen. Sie sagt, ich wär der beste, den sie je hatte. [MOB18_F] Halt die Augen nach ihr offen. Bis dann. [MOB19_A] -Tommy, hier KP - Kent Paul. Ich hab lãuten hören, dass jemand dich leimen will. +Tommy, hier KP - Kent Paul. Ich hab läuten hören, dass jemand dich leimen will. [MOB19_B] Also, sei wachsam, mein Freund. Und kein Sterbenswörtchen, dass du das von mir weißt. @@ -1077,7 +1077,7 @@ Hallo, Tommy. Hier Paul. Ich höre, dass du ein paar Leuten auf den Schlips getr Irgendjemand sieht es anscheinend nicht gern, dass du auf einmal den großen Zampano spielst. [MOB_20C] -Also, sag nicht, ich hãtte dich nicht gewarnt. Es rãcht sich, wenn man's übertreibt. +Also, sag nicht, ich hätte dich nicht gewarnt. Es rächt sich, wenn man's übertreibt. [MOB_20D] Jedenfalls ist angeblich ein Kopfgeld auf dich ausgesetzt und es ist schon jemand hinter dir her. @@ -1125,19 +1125,19 @@ sagen Sie mir nur eins, Tommy. Ist das wahr? Ist was wahr? [MOB71_N] -Die Geschichten, die ich höre? Will sie wirklich Anwãltin werden? +Die Geschichten, die ich höre? Will sie wirklich Anwältin werden? [MOB71_O] -Welche Schande, Tommy. Wir Cortez sind eine stolze Familie und würden nie einer Tochter erlauben, Anwãltin zu werden. +Welche Schande, Tommy. Wir Cortez sind eine stolze Familie und würden nie einer Tochter erlauben, Anwältin zu werden. [MOB71_P] Sagen Sie mir, dass es nicht wahr ist. Das ertrage ich nicht. [MOB71_Q] -Colonel, ich versichere Ihnen, dass Mercedes niemals Anwãltin wird. Keine Angst. +Colonel, ich versichere Ihnen, dass Mercedes niemals Anwältin wird. Keine Angst. [MOB71_R] -Danke, Tommy - das wãre zu viel der Schande. Sie ist eine Dame, keine Schmarotzerin. +Danke, Tommy - das wäre zu viel der Schande. Sie ist eine Dame, keine Schmarotzerin. [MOB71_S] Ich weiß, Colonel @@ -1164,10 +1164,10 @@ Sie haben mein Wort darauf. Einstweilen möchte ich Ihnen den Dank meines Volkes aussprechen, für das Sie so viel getan haben. [MOB_25A] -Tommy, hier Cortez. Die Franzosen machen mir Ãrger. Und wie. +Tommy, hier Cortez. Die Franzosen machen mir Ärger. Und wie. [MOB_25B] -Verdammte Heuchler! Jahrhundertelang beuten sie arme Lãnder aus und mich schimpfen sie einen Dieb! +Verdammte Heuchler! Jahrhundertelang beuten sie arme Länder aus und mich schimpfen sie einen Dieb! [MOB_25C] Ich brauche dingend Ihre Hilfe. @@ -1197,7 +1197,7 @@ Hallo? Spreche ich mit Mr. Tommy Vercetti? Ja. [MOB_29C] -Ich hab mir sagen lassen, du wãrst der richtige Mann, wenn man Kroppzeug am Hals hat. +Ich hab mir sagen lassen, du wärst der richtige Mann, wenn man Kroppzeug am Hals hat. [MOB_29D] Vielleicht... @@ -1206,10 +1206,10 @@ Vielleicht... Tja, ich hab 'ne regelrechte Plage am Hals. Haitianer, überall. [MOB_29F] -Mein Name ist Umberto Robina und es wãr mir recht, wenn du baldmöglichst ins Café Robina kãmst. +Mein Name ist Umberto Robina und es wär mir recht, wenn du baldmöglichst ins Café Robina kämst. [MOB_29G] -Diesmal haben's die Haitianer nãmlich zu weit getrieben. +Diesmal haben's die Haitianer nämlich zu weit getrieben. [MOB_29H] Test @@ -1218,10 +1218,10 @@ Test Tommy, hier Umberto Robina. [MOB_30B] -Wie lãuft das Café? +Wie läuft das Café? [MOB_30C] -Oh, bestens. Sagenhaft, Tommy, sagenhaft. Keine Memmen, Tommy, nur echte Mãnner. Und wunderschöne Frauen! +Oh, bestens. Sagenhaft, Tommy, sagenhaft. Keine Memmen, Tommy, nur echte Männer. Und wunderschöne Frauen! [MOB_30D] Ich wollte nur sagen, für mich und Paps bist du jetzt einer von uns. Ein Kubaner. @@ -1260,7 +1260,7 @@ Und ich kann dir bestimmt irgendwann helfen, ok? Tommy, die Wunde verheilt gut. Ist nur komisch: [MOB_35B] -da hab ich auf 6 Schlachtfeldern gekãmpft und nie 'n Kratzer abgekriegt und dann das! +da hab ich auf 6 Schlachtfeldern gekämpft und nie 'n Kratzer abgekriegt und dann das! [MOB_35C] Jetzt bin ich der einarmige Phil. Hab aber 'n gutes Arsenal an Handfeuerwaffen, also bin ich auch mit Arm ab nicht arm dran. @@ -1278,10 +1278,10 @@ Verdammte Vietnamesen. Wo du hinschaust ein Hinterhalt. Die Wunde heilt gut. Und jetzt kassiere ich meine Versehrtenrente endlich völlig zurecht. Danke, Kumpel. [MOB_40A] -Hey, Tommy, hier Sonny. Was macht die Sonnenbrãune? +Hey, Tommy, hier Sonny. Was macht die Sonnenbräune? [MOB_40B] -Ich hab keine Sonnenbrãune. +Ich hab keine Sonnenbräune. [MOB_40C] Naja, mein Geld hast du jedenfalls auch nicht. Daher frag ich mich, @@ -1296,10 +1296,10 @@ Ich bin auf der Suche nach deinem Geld, Sonny. Keine Sorge. Ich mach mir aber Sorgen, Tommy, ich kann nicht anders. [MOB_40G] -Ich hab nãmlich anscheinend mit zu viel unzuverlãssigen Menschen zu tun. +Ich hab nämlich anscheinend mit zu viel unzuverlässigen Menschen zu tun. [MOB_40H] -Sei du bitte kein unzuverlãssiger Mensch, Tommy. +Sei du bitte kein unzuverlässiger Mensch, Tommy. [MOB_40I] Tu dir und mir einen Gefallen. Ich freu mich, von dir zu hören. @@ -1317,16 +1317,16 @@ Ja genau, Sonny. Wir sind doch alte Freunde, aber du schreibst nie, rufst nie an. Willst du denn nicht mehr mein Freund sein? [MOB_41E] -Ich hab alle Hãnde voll zu tun, die Sache zu regeln. Und du bist auch keine große Hilfe. +Ich hab alle Hände voll zu tun, die Sache zu regeln. Und du bist auch keine große Hilfe. [MOB_41F] Ach, ich bin also schuld? Ja, ich hab gehört, dass du zu tun hast... [MOB_41G] -Musst Drogenbarone erledigen, ihre Geschãfte übernehmen. +Musst Drogenbarone erledigen, ihre Geschäfte übernehmen. [MOB_41H] -Vergiss mich nicht, Tommy. Ich verspreche dir nãmlich, dass ich dich nicht vergesse... +Vergiss mich nicht, Tommy. Ich verspreche dir nämlich, dass ich dich nicht vergesse... [MOB_42A] Tommy. @@ -1338,13 +1338,13 @@ Sonny. Anscheinend hörst du neuerdings schlecht, deshalb frag ich dich jetzt nochmal: [MOB_42D] -Tommy, wo ist die verdammte Kohle? Wo ist der verdammte Stoff und wo ist mein Anteil an deinem neuen Geschãft? +Tommy, wo ist die verdammte Kohle? Wo ist der verdammte Stoff und wo ist mein Anteil an deinem neuen Geschäft? [MOB_42E] -Du hãltst mich zum Narren, Tommy, ich find's bloß nicht zum Lachen. +Du hältst mich zum Narren, Tommy, ich find's bloß nicht zum Lachen. [MOB_43A] -Tommy, Tommy, Tommy, Sonny hat gerade angerufen, dãmmert dir was? +Tommy, Tommy, Tommy, Sonny hat gerade angerufen, dämmert dir was? [MOB_43B] Ich weiß nicht, wie das mit dir ist, aber wenn mir jemand droht, dass er meine Familie umbringt, @@ -1365,7 +1365,7 @@ Ken, ich muss mich gerade auf was anderes konzentrieren. Wir kümmern uns zu gegebener Zeit um Forelli. [MOB_43H] -Ich bin ruhig. Hör ich mich nicht ruhig an? Muss die Todesangst sein, die auf die Stimme schlãgt. +Ich bin ruhig. Hör ich mich nicht ruhig an? Muss die Todesangst sein, die auf die Stimme schlägt. [MOB45_A] Tommy, wir müssen miteinander reden. @@ -1437,7 +1437,7 @@ Wir stecken schon viel zu tief drin. Aber danke für den Anruf. Du hörst von mi Tommy - Lance. Wir stecken in der Patsche. Du musst sofort kommen. [MOB52_A] -Hey, Leo, ich glaube, wir haben einen Kãufer für Diaz' Ware. +Hey, Leo, ich glaube, wir haben einen Käufer für Diaz' Ware. [MOB52_B] Du musst ihn anrufen und den Deal in die Wege leiten, ok? @@ -1473,7 +1473,7 @@ Ich hab 'ne neue Wohnung in Vice Point. Vielleicht kommst du mich ja mal besuchen. [MOB54_E] -Klar, gern. Also, bis spãter. +Klar, gern. Also, bis später. [MOB55_A] Tommy, ich bin's. @@ -1539,13 +1539,13 @@ Selber hey, du toller Hecht. Ich bin sauer auf dich, Tommy. Schick mich nie mehr zu diesem Jezz Torrent. [MOB58_E] -So ein Jammerlappen. Mittendrin fãngt er an zu weinen wegen seinem Hündchen, +So ein Jammerlappen. Mittendrin fängt er an zu weinen wegen seinem Hündchen, [MOB58_F] das gestorben ist, als er 7 war, und dass seine Mama ihn nie lieb hatte. [MOB58_G] -Und Tommy - privat lãuft er in Perücke und BH rum. +Und Tommy - privat läuft er in Perücke und BH rum. [MOB58_H] Ich bin nicht gut auf dich zu sprechen! @@ -1587,7 +1587,7 @@ Geh zu der Telefonzelle vor Ort. +~1~ Sekunden [F_RANGE] -~g~Du bist außer Reichweite des Feuerwehrfunks. Fahr nãher an eine Feuerwache heran! +~g~Du bist außer Reichweite des Feuerwehrfunks. Fahr näher an eine Feuerwache heran! [DODO_FT] Du bist ~1~ Sekunden geflogen! @@ -1611,7 +1611,7 @@ Auf dich ist Verlass. Wenn du alle, die auf der Liste stehen, abgeliefert hast, Du hast alle georderten Karren geliefert. Sehr gut. Hier, für dich. [GA_15] -Hoffentlich gefãllt dir die neue Farbe. +Hoffentlich gefällt dir die neue Farbe. [GA_16] Das Umspritzen ist gratis. @@ -1620,7 +1620,7 @@ Das Umspritzen ist gratis. An dem Modell haben wir kein Interesse. [GA_20] -Von der Sorte haben wir schon mehr als genug. Sorry, da kommen wir nicht ins Geschãft. +Von der Sorte haben wir schon mehr als genug. Sorry, da kommen wir nicht ins Geschäft. [CHASE] Größtes Medieninteresse bisher @@ -1767,7 +1767,7 @@ Hupe Fahrzeugsteuerung [FEC_BRA] -Bremsen oder rückwãrts fahren +Bremsen oder rückwärts fahren [FEC_HAB] Handbremse @@ -1896,7 +1896,7 @@ Von dir gemachte Fotos Besuche von Kredithaien [ST_STOR] -Geknackte Lãden +Geknackte Läden [ST_MOVI] Film-Stunts @@ -1905,7 +1905,7 @@ Film-Stunts Gelieferte Pizzas [ST_GARB] -Getãtigte Müllfuhren +Getätigte Müllfuhren [ST_ICEC] Verkaufte Eiscreme @@ -1932,7 +1932,7 @@ Flugstunden Piloten-Rating [ST_RAN0] -Anfãnger +Anfänger [ST_RAN1] Navigator @@ -2037,7 +2037,7 @@ Monster-Stunts geschafft Begonnene Missionen [PASDRO] -Ans Ziel beförderte Fahrgãste +Ans Ziel beförderte Fahrgäste [MONTAX] Mit Taxi verdientes Geld @@ -2085,7 +2085,7 @@ von Geschützsteuerung [FEC_RS3] -Radiosender auswãhlen (L3-Taste) +Radiosender auswählen (L3-Taste) [FEC_HO3] Hupe (L3-Taste) @@ -2094,7 +2094,7 @@ Hupe (L3-Taste) Bürgerwehr-Mission beendet! [C_ESCP] -~r~Der Verdãchtige ist entwischt! +~r~Der Verdächtige ist entwischt! [C_VIGIL] BÜRGERWEHR BONUS!! @@ -2127,7 +2127,7 @@ Hey, so was heißes rühre ich nicht an! Komm wieder, wenn du nicht so viel zu tun hast... [HELP9_C] -Drücke die~h~ ~k~~PED_FIREWEAPON~~w~, um das Prãzisionsgewehr ~h~abzufeuern~w~. +Drücke die~h~ ~k~~PED_FIREWEAPON~~w~, um das Präzisionsgewehr ~h~abzufeuern~w~. [TAXI2] ~r~Die Zeit ist um! @@ -2136,7 +2136,7 @@ Drücke die~h~ ~k~~PED_FIREWEAPON~~w~, um das Prãzisionsgewehr ~h~abzufeuern~w~ Gesundheits-Powerups in Versteck angeliefert. [PAGEB14] -Adrenalin in Versteck vorrãtig. +Adrenalin in Versteck vorrätig. [FESZ_CA] Abbrechen @@ -2163,7 +2163,7 @@ Wirklich ein neues Spiel beginnen? Alle Daten seit dem letzten Speichern werden 'PCJ Rallye' [BMX_1] -'Krasses Gelãnde' +'Krasses Gelände' [BMX_2] 'Teststrecke' @@ -2559,7 +2559,7 @@ Informant Spitzel [RATNG11] -Verrãter +Verräter [RATNG12] Hochstapler @@ -2574,7 +2574,7 @@ Schieber Falschspieler [RATNG16] -Schlãger +Schläger [RATNG17] Straßengauner @@ -2625,7 +2625,7 @@ Soldat Gorilla [RATNG33] -Kopfgeldjãger +Kopfgeldjäger [RATNG34] Mann fürs Grobe @@ -2634,7 +2634,7 @@ Mann fürs Grobe Ronin [RATNG36] -Abrãumer +Abräumer [RATNG37] Hit-Man @@ -2649,7 +2649,7 @@ Butcher Troubleshooter [RATNG41] -Attentãter +Attentäter [RATNG42] Adjutant @@ -4077,10 +4077,10 @@ Wenn zu Fuß unterwegs, drücke die ~h~~k~~PED_LOOKBEHIND~~w~, um ~h~nach hinten Nach hinten sehen (R3-Taste) [PERPIC] -Versteckte Pãckchen gefunden +Versteckte Päckchen gefunden [CO_ONE] -Verstecktes Pãckchen ~1~ von ~1~ +Verstecktes Päckchen ~1~ von ~1~ [GA_21] In dieser Garage bringst du keine Autos mehr unter. @@ -4116,7 +4116,7 @@ Jan Feb [MAR] -Mãr +Mär [APR] Apr @@ -4173,7 +4173,7 @@ In Fahrzeug ein- und aussteigen. 'FEUERWEHRMANN' [AMBUL_M] -'SANITÃTER' +'SANITÄTER' [HJ_IS] IRRSINNS-STUNT-BONUS: $~1~ @@ -4218,7 +4218,7 @@ DIE ANWALTSMISSIONEN ~g~Besorge dir neue Sachen in Rafaels Shop. [LAW4_6] -Nieder mit der Geschãftsleitung! +Nieder mit der Geschäftsleitung! [LAW4_7] Tod den Bossen! @@ -4263,7 +4263,7 @@ Mist! Willst du mich umbringen?! ~g~Begib dich zum Übergabeort und pass auf Diaz auf. [GEN3_32] -~g~Begib dich zu deinem Beobachtungsposten auf dem Dach des Gebãudes gegenüber von Lance. +~g~Begib dich zu deinem Beobachtungsposten auf dem Dach des Gebäudes gegenüber von Lance. [COKE] DIE KOKS-BARON-MISSIONEN @@ -4470,10 +4470,10 @@ ZEIT: ~g~Du kannst immer nur 1 Bombe transportieren und kannst erfolgreich platzierten Bomben nicht wieder aufnehmen. [SEG3_7] -~g~Sobald du die ERSTE Bombe platziert hast, lãuft der Timer des Zeitzünders an. Du musst dann alle Bomben innerhalb dieses Zeitraums platzieren. +~g~Sobald du die ERSTE Bombe platziert hast, läuft der Timer des Zeitzünders an. Du musst dann alle Bomben innerhalb dieses Zeitraums platzieren. [SEG3_8] -~g~Alle 4 Bomben müssen in den 4 Zielzonen platziert werden, um die Mission zu erfüllen und das Gebãude zu demolieren. +~g~Alle 4 Bomben müssen in den 4 Zielzonen platziert werden, um die Mission zu erfüllen und das Gebäude zu demolieren. [SEG3_9] ~g~Zielzone getroffen! Noch 3 Bomben. @@ -4491,7 +4491,7 @@ ZEIT: ~g~Wirf die Bombe in einer Zielzone ab. [SEG3_14] -~r~Die Zeit ist um. Demolierung des Gebãudes fehlgeschlagen. +~r~Die Zeit ist um. Demolierung des Gebäudes fehlgeschlagen. [SEG3_15] ~r~Dein RC Raider ist zerstört. Wie willst du jetzt die Bomben transportieren? @@ -4500,13 +4500,13 @@ ZEIT: AVERY-MISSIONEN [ASM] -ATTENTÃTERMISSIONEN +ATTENTÄTERMISSIONEN [ASM_1] -ATTENTÃTERMISSION 1 +ATTENTÄTERMISSION 1 [ASM1_1] -~g~Mr. Teal, Ihre Hilfe bei der Beseitigung der Landeier war ãußerst wertvoll. Ich habe noch mehr Arbeit, die eine eher 'zupackende' Art verlangt. Ihr nãchster Job klebt unter dem Telefon. +~g~Mr. Teal, Ihre Hilfe bei der Beseitigung der Landeier war äußerst wertvoll. Ich habe noch mehr Arbeit, die eine eher 'zupackende' Art verlangt. Ihr nächster Job klebt unter dem Telefon. [ASM1_2] ~g~Begib zu dich dem Fernsprecher vor dem Einkaufszentrum in Washington. @@ -4518,16 +4518,16 @@ ATTENTÃTERMISSION 1 ~g~Schalte den Pizza-Lieferanten aus, bevor er seine Lieferungen abschließt. [ASM_2] -ATTENTÃTERMISSION 2 +ATTENTÄTERMISSION 2 [ASM_3] -ATTENTÃTERMISSION 3 +ATTENTÄTERMISSION 3 [ASM3_A] -Marcus Hammond, Franco Carter, Dick Tanner, Nick Kong und Stuntman Driver gehören zu einem europãischen Syndikat und planen einen Überfall. +Marcus Hammond, Franco Carter, Dick Tanner, Nick Kong und Stuntman Driver gehören zu einem europäischen Syndikat und planen einen Überfall. [ASM3_B] -Sie sind alle bereits in Position. Schalten Sie sie aus, bevor es losgeht. Sie haben 9 Minuten. Ich habe in der Nãhe Waffen deponiert, die Sie brauchen werden. +Sie sind alle bereits in Position. Schalten Sie sie aus, bevor es losgeht. Sie haben 9 Minuten. Ich habe in der Nähe Waffen deponiert, die Sie brauchen werden. [ASM3_1] ~g~Hol dir die Waffe, die Mr. Black für dich deponiert hat. @@ -4536,7 +4536,7 @@ Sie sind alle bereits in Position. Schalten Sie sie aus, bevor es losgeht. Sie h ~g~Geh nicht zu dicht an die Zielperson heran, sonst bemerkt sie dich. [ASM3_3] -~g~Es geht schneller, wenn du dir eine günstige Position nahe ihrem Standort suchst und zuschlãgst, ohne gesehen zu werden. +~g~Es geht schneller, wenn du dir eine günstige Position nahe ihrem Standort suchst und zuschlägst, ohne gesehen zu werden. [ASM3_4] ~g~Er hat dich gesehen. Du musst ihn irgendwie ausschalten! @@ -4548,10 +4548,10 @@ Sie sind alle bereits in Position. Schalten Sie sie aus, bevor es losgeht. Sie h ~g~Franco Carter befindet sich bei DBP Security nahe dem Ocean Drive. [ASM3_7] -~g~Dick Tanner ist in der Nãhe des Juweliers in Vice Point. +~g~Dick Tanner ist in der Nähe des Juweliers in Vice Point. [ASM3_8] -~g~Nick Kong befindet sich nãhe Washington Beach. +~g~Nick Kong befindet sich nähe Washington Beach. [ASM3_9] ~g~Stuntman Driver ist in Washington. @@ -4560,13 +4560,13 @@ Sie sind alle bereits in Position. Schalten Sie sie aus, bevor es losgeht. Sie h Du hast nicht alle ausgeschaltet. [ASM_4] -ATTENTÃTERMISSION 4 +ATTENTÄTERMISSION 4 [ASM4_1] ~g~Hol dir das Gewehr, das im Laub vor dem Flughafen-Terminal für dich deponiert wurde. [ASM4_2] -~g~Verfehle dein Ziel nicht, du alarmierst sonst die Leibwãchter. Und bleib auf Distanz, damit er dich nicht bemerkt. +~g~Verfehle dein Ziel nicht, du alarmierst sonst die Leibwächter. Und bleib auf Distanz, damit er dich nicht bemerkt. [ASM4_3] ~g~Beobachte die Frau über den Check-in-Schaltern im Terminal. TU IHR NICHTS. @@ -4599,7 +4599,7 @@ Hol dir den Aktenkoffer. ~g~Der Distanz-Balken am oberen rechten Bildschirmrand zeigt dir, wie nahe du der Zielperson bist. Lass ihn nicht voll werden, sonst sieht sie dich. [ASM_5] -ATTENTÃTERMISSION 5 +ATTENTÄTERMISSION 5 [KICK] KICKSTART @@ -4650,7 +4650,7 @@ Alles, was ich gern habe, geht kaputt! Verdammt! Da sind sie schon! [BNK4_32] -Spreng die Schließfãcher mit Sprengstoff auf. +Spreng die Schließfächer mit Sprengstoff auf. [BNK4_36] Wo ist Cam? @@ -4665,7 +4665,7 @@ Das ist der letzte! LOS! LOS! LOS! Shit! Wo bleibt Hilary? [BK4_40A] -Ich werd was für seine Verlustãngste tun! +Ich werd was für seine Verlustängste tun! [BNK4_42] Hey, Jungs! Los, rein! Ich geb euch Deckung! @@ -4686,7 +4686,7 @@ Ja. Andererseits, so bleibt mehr für uns! Sehr richtig! YEEEEHAAAH! [BNK4_48] -Tommy, eine Massage gefãllig? +Tommy, eine Massage gefällig? [BNK4_49] Hi, Mercedes. Ja, ich bin ein bisschen verspannt... @@ -4707,13 +4707,13 @@ KENT PAUL-MISSIONEN KENT PAUL-MISSION 1 [COUNT] -FÃLSCHER-MISSIONEN +FÄLSCHER-MISSIONEN [COUNT1] -FÃLSCHER-MISSION 1 +FÄLSCHER-MISSION 1 [COUNT2] -FÃLSCHER-MISSION 2 +FÄLSCHER-MISSION 2 [BIKE] DIE BIKER GANG-MISSIONEN @@ -4743,7 +4743,7 @@ HAITI-MISSION 2 HAITI-MISSION 3 [HAM3_6] -~g~Verwende das Prãzisionsgewehr, das ich für dich besorgt habe. +~g~Verwende das Präzisionsgewehr, das ich für dich besorgt habe. [ROCK] DIE ROCKBAND-GANG-MISSIONEN @@ -4806,7 +4806,7 @@ SCHUTZGELD-MISSIONEN ~g~Verlasse das Einkaufszentrum. [PRO3_06] -~g~Hãng die Cops ab. +~g~Häng die Cops ab. [PORN] PORNO-MISSIONEN @@ -4875,25 +4875,25 @@ Malibu Club gekauft: $ ~1~ Bootswerft gekauft: $ ~1~ [PRNT_NO] -Zurzeit kannst du die Druckerei nicht kaufen. Komm spãter wieder. +Zurzeit kannst du die Druckerei nicht kaufen. Komm später wieder. [CAR_NO] -Zurzeit kannst du das Autohaus nicht kaufen. Komm spãter wieder. +Zurzeit kannst du das Autohaus nicht kaufen. Komm später wieder. [PORN_NO] -Zurzeit kannst du das Filmstudio nicht kaufen. Komm spãter wieder. +Zurzeit kannst du das Filmstudio nicht kaufen. Komm später wieder. [ICE_NO] -Zurzeit kannst du die Eiscremefabrik nicht kaufen. Komm spãter wieder. +Zurzeit kannst du die Eiscremefabrik nicht kaufen. Komm später wieder. [TAXI_NO] -Zurzeit kannst du das Taxiunternehmen nicht kaufen. Komm spãter wieder. +Zurzeit kannst du das Taxiunternehmen nicht kaufen. Komm später wieder. [BANK_NO] -Zurzeit kannst du den Malibu Club nicht kaufen. Komm spãter wieder. +Zurzeit kannst du den Malibu Club nicht kaufen. Komm später wieder. [BOAT_NO] -Zurzeit kannst du die Bootswerft nicht kaufen. Komm spãter wieder. +Zurzeit kannst du die Bootswerft nicht kaufen. Komm später wieder. [PRNT_R3] Drücke R3, um die Druckerei zu kaufen. Preis: $~1~ @@ -4929,13 +4929,13 @@ Her damit! Thomas, schön, dass Sie da sind. [COL3_B] -Verzeihen Sie, dass ich direkt zum Geschãftlichen komme. +Verzeihen Sie, dass ich direkt zum Geschäftlichen komme. [COL3_C] Diaz bat mich, eine kleine Transaktion für ihn zu überwachen. [COL3_D] -Hoffentlich lãuft es diesmal besser als zuletzt. +Hoffentlich läuft es diesmal besser als zuletzt. [COL3_E] Deshalb wende ich mich ja an Sie, mein Freund. @@ -4944,7 +4944,7 @@ Deshalb wende ich mich ja an Sie, mein Freund. Ich habe im Parkhaus ein wenig Artillerie deponiert. [COL3_G] -Holen Sie sich die und beschützen Sie Diaz' Mãnner bei der Übergabe. +Holen Sie sich die und beschützen Sie Diaz' Männer bei der Übergabe. [COL4_2] Ich weiß nicht, Sir! @@ -4983,10 +4983,10 @@ Beschütze den Kurier! Ok, Jungs, macht ihn fertig! [FIN_1A] -Komm her, du hinterhãltiger Dreckskerl! +Komm her, du hinterhältiger Dreckskerl! [FIN_1B] -Jetzt bist du fãllig, du mieser Verrãter! +Jetzt bist du fällig, du mieser Verräter! [FIN_1C] Das wird dein letzter 'Dance', Lance Vance! @@ -4998,7 +4998,7 @@ Ach, wirklich? Der dumme Spruch war schon im Kindergarten alt! [FIN_3] -Keiner da, um dich rauszuhauen, diesmal, hã, Tommy? +Keiner da, um dich rauszuhauen, diesmal, hä, Tommy? [FIN_4] Du bist am Ende, Tommy. @@ -5010,7 +5010,7 @@ Du hast dich auf die falsche Seite geschlagen, Lance... Sonny ist oben am Safe mit MEINEM Geld... [FIN_10] -Sonny? SONNY! Jetzt bist du fãllig! +Sonny? SONNY! Jetzt bist du fällig! [FIN_11A] Du hast mir 15 Jahre gestohlen, Sonny. @@ -5142,16 +5142,16 @@ Spiel laden und weiterspielen? Feuern [FEC_NWE] -Nãchste Waffe +Nächste Waffe [FEC_PWE] Vorherige Waffe [FEC_FOR] -Vorwãrts +Vorwärts [FEC_BAC] -Rückwãrts +Rückwärts [FEC_LEF] Links @@ -5175,7 +5175,7 @@ Radio Spezialmission [FEC_CMR] -Blickwinkel ãndern +Blickwinkel ändern [FEC_JMP] Springen @@ -5193,7 +5193,7 @@ Nach links sehen Nach rechts sehen [FEC_NTR] -Nãchstes Ziel +Nächstes Ziel [FEC_PTT] Vorheriges Ziel @@ -5349,7 +5349,7 @@ WAVE 103 Helligkeit [FED_TRA] -Unschãrfe-FX +Unschärfe-FX [FED_SUB] Untertitel @@ -5388,7 +5388,7 @@ Spiel löschen Controller-Setup [FEC_RED] -Steuerung ãndern +Steuerung ändern [FEC_MOU] Maus-Einstellg. @@ -5409,7 +5409,7 @@ Unbeliebtester Radiosender Lieblingsfahrzeug [ST_STAR] -Anzahl angehãufter Fahndungssterne +Anzahl angehäufter Fahndungssterne [ST_HEAD] Anzahl Köpfe @@ -5430,7 +5430,7 @@ Aufgeschlitzte Reifen Erledigte Gegner im Chaos-Derby [ST_LTBR] -Lãngste Zeit im Chaos-Derby (Sekunden) +Längste Zeit im Chaos-Derby (Sekunden) [ST_GNG1] Kubaner @@ -5460,7 +5460,7 @@ Golfer ESPANTOSO [ST_ASSI] -Ausgeführte Attentãtermissionen +Ausgeführte Attentätermissionen [DISTBIK] Mit Motorrad zurückgel. Strecke (Meilen) @@ -5490,7 +5490,7 @@ Daten wurden gespeichert. Weiter mit OK. Daten wurden gelöscht. Weiter mit OK. [FESZ_QC] -Dieses beschãdigte Spiel überschreiben? +Dieses beschädigte Spiel überschreiben? [FES_CHE] Achtung! Ein oder mehrere Cheats sind aktiviert, dies kann sich auf die Speicherung auswirken. Es wird empfohlen, dieses Spiel nicht zu speichern. @@ -5598,7 +5598,7 @@ Schnellste Zeit bei 'Wheels of Steels' Schnellste Zeit bei 'Der Fahrer' [STFT_03] -Schnellste Zeit auf Gelãndemotorradstrecke +Schnellste Zeit auf Geländemotorradstrecke [STFT_04] Schnellste Zeit bei Modellflugzeug-Rennen @@ -5634,16 +5634,16 @@ High-Score bei Schießstand-Mission Beste Trefferquote am Schießstand (in Prozent) [STHC_03] -Anzahl getãtigter Drogendeals +Anzahl getätigter Drogendeals [HELP24] -Du kannst jetzt Auftrãge vom Colonel annehmen. +Du kannst jetzt Aufträge vom Colonel annehmen. [HELP25] -Du kannst jetzt Auftrãge von Avery Carrington annehmen. +Du kannst jetzt Aufträge von Avery Carrington annehmen. [HELP29] -Außerhalb eine Mision kannst du zu dem Bekleidungsgeschãft gehen. +Außerhalb eine Mision kannst du zu dem Bekleidungsgeschäft gehen. [HELP30] Wenn du neue Klamotten kaufst, reduziert sich dein Fahndungslevel auf null. @@ -5676,7 +5676,7 @@ Du brauchst eine Maschinenpistole für einen 'Drive-By'. ~k~~PED_SPRINT~ zum Beenden. [ASM1_B] -Ihr nãchster Auftrag klebt unter dem Telefon. +Ihr nächster Auftrag klebt unter dem Telefon. [ASM1_C] Ich habe noch mehr Arbeit, die eine eher 'zupackende' Art verlangt. @@ -5796,7 +5796,7 @@ Hier Cortez. Sie waren bei meiner Party. Ja. Ich erinnere mich. [MOB_24E] -Mr. Vercetti, es war höchst unglücklich, was da bei der Abwicklung Ihres Geschãfts vorgefallen ist. +Mr. Vercetti, es war höchst unglücklich, was da bei der Abwicklung Ihres Geschäfts vorgefallen ist. [MOB_24F] Ich weiß. @@ -5850,7 +5850,7 @@ Mafia Cruiser 'DONNER ÜBER VICE CITY' [BNK3_2] -Ich fahre nicht für dich, niemals. Das erzãhle ich in der Therapie. +Ich fahre nicht für dich, niemals. Das erzähle ich in der Therapie. [FEM_SL1] Datei 1 nicht vorhanden @@ -5940,7 +5940,7 @@ Havana Cop [OUTFT7] -Bankrãuber +Bankräuber [OUTFT8] Freizeit @@ -5958,7 +5958,7 @@ MC Tommy AUTOHAUS ERWORBEN [CAR_AS2] -~g~Sunshine Autos generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmãßig ab. +~g~Sunshine Autos generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmäßig ab. [BUYSAVE] ~g~Außerhalb einer Mission kannst du dein Spiel hier umsonst speichern. @@ -6003,13 +6003,13 @@ Sie finden mich auf dem Boot. .357 in Verstecken angeliefert! [PICK3] -Kettensãgen in Verstecken angeliefert! +Kettensägen in Verstecken angeliefert! [PICK4] Flammenwerfer in Verstecken angeliefert! [PICK5] -.308 Prãzisionsgewehr in Verstecken angeliefert! +.308 Präzisionsgewehr in Verstecken angeliefert! [PICK6] Mini-Kanonen in Verstecken angeliefert! @@ -6027,43 +6027,43 @@ Panzer jetzt in Army-Kaserne verfügbar! Hunter jetzt in Army-Kaserne verfügbar! [CLOTH1] -Abendgarderobe bei Rafaels in Ocean Beach erhãltlich. +Abendgarderobe bei Rafaels in Ocean Beach erhältlich. [CLOTH2] Straßenkleidung in Verstecken angeliefert. [CLOTH3] -Overall bei 'Tooled Up' im North Point Einkaufszentrum erhãltlich. +Overall bei 'Tooled Up' im North Point Einkaufszentrum erhältlich. [CLOTH4] -Country Club-Bekleidung beim Golf Club in Leaf Links erhãltlich. +Country Club-Bekleidung beim Golf Club in Leaf Links erhältlich. [CLOTH5] -Havana-Outfit bei 'Little Havana Streetwear' in Little Havana erhãltlich. +Havana-Outfit bei 'Little Havana Streetwear' in Little Havana erhältlich. [CLOTH6] -Polizeiuniform bei Polizeistation in Washington Beach erhãltlich. +Polizeiuniform bei Polizeistation in Washington Beach erhältlich. [CLOTH7] -Freizeitbekleidung bei 'Gash' im North Point Einkaufszentrum erhãltlich. +Freizeitbekleidung bei 'Gash' im North Point Einkaufszentrum erhältlich. [CLOTH8] -Mr. Vercetti-Outfit bei 'Collar & Cuffs'in Ocean Beach erhãltlich. +Mr. Vercetti-Outfit bei 'Collar & Cuffs'in Ocean Beach erhältlich. [CLOTH9] -Trainingsanzug bei 'Jocksport' in Downtown erhãltlich. +Trainingsanzug bei 'Jocksport' in Downtown erhältlich. [CLOTH10] -Bankrãuber-Outfit beim Malibu Club in Vice Point erhãltlich. +Bankräuber-Outfit beim Malibu Club in Vice Point erhältlich. [MOB_62A] Tommy, hier Ricardo Diaz. Ich wollte dir danken, dass du mich gerettet hast. [MOB_62B] -Ich hab den Trottel von Cortez gefragt. Er meint, du wãrst ein Mann für alle Fãlle. Komm doch mal bei mir vorbei. +Ich hab den Trottel von Cortez gefragt. Er meint, du wärst ein Mann für alle Fälle. Komm doch mal bei mir vorbei. [MOB_62C] -Ich brauche einen Kerl wie dich. Ich hab nãmlich nur Schwachköpfe. +Ich brauche einen Kerl wie dich. Ich hab nämlich nur Schwachköpfe. [MOB_62D] Nur lauter Schwachköpfe. Ich mache dich schwer reich. @@ -6081,7 +6081,7 @@ Lade... Schnellste Zeit bei 'PCJ Rallye' [STFT_18] -Schnellste Zeit bei 'Krasses Gelãnde' +Schnellste Zeit bei 'Krasses Gelände' [STFT_19] Schnellste Zeit bei 'Teststrecke' @@ -6090,7 +6090,7 @@ Schnellste Zeit bei 'Teststrecke' Neuer Rekord!! ~1~ Minuten und ~1~ Sekunden. [BMX_HOW] -~g~Fahr zwei Runden auf der Gelãndemotorradstrecke. ~y~Passiere dabei ~g~die ~y~CHECKPOINTS~g~! +~g~Fahr zwei Runden auf der Geländemotorradstrecke. ~y~Passiere dabei ~g~die ~y~CHECKPOINTS~g~! [BMXREW1] ~g~Jedes Mal wenn du deine bisherige Bestzeit für die zwei Runden verbesserst, @@ -6189,7 +6189,7 @@ Drück die ~h~~k~~PED_ANSWER_PHONE~~w~, um die augenblickliche Waffe in diesem S Drück die ~h~~k~~PED_ANSWER_PHONE~~w~, um die augenblickliche Waffe in diesem Slot auszutauschen. [HELP9_B] -Drücke die~h~ ~k~~PED_FIREWEAPON~~w~, um das Prãzisionsgewehr ~h~abzufeuern~w~. +Drücke die~h~ ~k~~PED_FIREWEAPON~~w~, um das Präzisionsgewehr ~h~abzufeuern~w~. [HELP37] Wenn du doch nicht in ein Auto einsteigen willst, das du im Begriff bist, zu klauen, drück die ~h~~k~~PED_SPRINT~. @@ -6279,7 +6279,7 @@ Nicht verfügbar Mesa Grande [STRP_NO] -Zurzeit kannst du die Stripper-Bar nicht kaufen. Komm spãter wieder. +Zurzeit kannst du die Stripper-Bar nicht kaufen. Komm später wieder. [CHSE] VERFOLGUNGSJAGD @@ -6411,13 +6411,13 @@ Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um den Pole Position Club zu kaufen. Pr Drücke die ~h~~k~~PED_ANSWER_PHONE~~w~, um den Pole Position Club zu kaufen. Preis: $~1~ [STOCK] -~r~nicht vorrãtig +~r~nicht vorrätig [HELP14] Um das Büro des Anwalts zu finden, folge dem ~h~'L'~w~ auf dem Radar. [BOAT_AS] -~g~Die Bootswerft generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmãßig ab. +~g~Die Bootswerft generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmäßig ab. [BOAT_A2] BOOTSWERFT-MISSIONEN ERFÜLLT @@ -6426,13 +6426,13 @@ BOOTSWERFT-MISSIONEN ERFÜLLT Checkpoint Charlie [BOAT_P] -~g~Sammle die Pãckchen ein, ehe die Zeit um ist. +~g~Sammle die Päckchen ein, ehe die Zeit um ist. [FEI_R1B] R1- \ R2-Taste - [HELP9_A] -Drücke die ~h~~k~~PED_FIREWEAPON~~w~-Taste, um das Prãzisionsgewehr abzufeuern. +Drücke die ~h~~k~~PED_FIREWEAPON~~w~-Taste, um das Präzisionsgewehr abzufeuern. [HELP21] Drücke die ~h~~k~~VEHICLE_ENTER_EXIT~~w~-Taste, um in ein Fahrzeug ein- oder auszusteigen. @@ -6501,7 +6501,7 @@ Schnellste Zeit bei 'Pylonen-Rallye' Halte in der ~q~rosa Markierung. [HELP45] -Drücke die ~h~~k~~PED_DUCK~~w~ um dich zu ducken. Dadurch erhöht sich die Treffsicherheit der Waffen, die du hãltst. +Drücke die ~h~~k~~PED_DUCK~~w~ um dich zu ducken. Dadurch erhöht sich die Treffsicherheit der Waffen, die du hältst. [RCR1_5] RC Bandit-Rennen @@ -6594,7 +6594,7 @@ Sieh dir diesen riesigen Helikopter an! Da kommt er wieder! [FEA_DSM] -Achtung! Dieses Spiel ist auf DTS-Tonausgabe eingestellt. Dazu muss DTS-kompatible Hardware angeschlossen sein. Bitte wãhlen Sie, ob Sie mit DTS oder STEREO-Tonausgabe fortfahren wollen. +Achtung! Dieses Spiel ist auf DTS-Tonausgabe eingestellt. Dazu muss DTS-kompatible Hardware angeschlossen sein. Bitte wählen Sie, ob Sie mit DTS oder STEREO-Tonausgabe fortfahren wollen. [STFT_23] Schnellste Zeit bei Checkpoint Carlie @@ -6624,25 +6624,25 @@ Du kannst von jedem Waffentyp immer nur eine bei dir tragen - also einen Typ Pis Drücke die ~h~~k~~PED_SPRINT~~w~-Taste, um zu ~h~sprinten. [HLPSN_A] -Das Prãzisionsgewehr ermöglicht dir, an dein Ziel heranzuzoomen und auf größere Distanz mit hoher Genauigkeit zu schießen. +Das Präzisionsgewehr ermöglicht dir, an dein Ziel heranzuzoomen und auf größere Distanz mit hoher Genauigkeit zu schießen. [HLPSN_B] -Halte die~h~ ~k~~PED_LOCK_TARGET~~w~-Taste gedrückt, um mit dem Prãzisionsgewehr zu ~h~zielen~w~. +Halte die~h~ ~k~~PED_LOCK_TARGET~~w~-Taste gedrückt, um mit dem Präzisionsgewehr zu ~h~zielen~w~. [HLPSN_C] -Halte die~h~ ~k~~PED_LOCK_TARGET~~w~-Taste gedrückt, um mit dem Prãzisionsgewehr zu ~h~zielen~w~. +Halte die~h~ ~k~~PED_LOCK_TARGET~~w~-Taste gedrückt, um mit dem Präzisionsgewehr zu ~h~zielen~w~. [HLPSN_D] Drücke die ~h~~k~~PED_SNIPER_ZOOM_IN~~w~-Taste, um ~h~an das Ziel heranzuzoomen ~w~und die~h~ ~k~~PED_SNIPER_ZOOM_OUT~~w~,um ~h~herauszuzoomen~w~. [HLPSN_E] -Drücke die ~h~~k~~PED_FIREWEAPON~~w~-Taste, um das Prãzisionsgewehr ~h~abzufeuern~w~. +Drücke die ~h~~k~~PED_FIREWEAPON~~w~-Taste, um das Präzisionsgewehr ~h~abzufeuern~w~. [HLPSN_F] -Drücke die ~h~~k~~PED_FIREWEAPON~~w~-Taste, um das Prãzisionsgewehr ~h~abzufeuern~w~. +Drücke die ~h~~k~~PED_FIREWEAPON~~w~-Taste, um das Präzisionsgewehr ~h~abzufeuern~w~. [HLPSN_G] -Drücke die ~h~~k~~PED_FIREWEAPON~~w~-Taste, um das Prãzisionsgewehr ~h~abzufeuern~w~. +Drücke die ~h~~k~~PED_FIREWEAPON~~w~-Taste, um das Präzisionsgewehr ~h~abzufeuern~w~. [PLANE_H] Benutze die ~h~~k~~VEHICLE_ACCELERATE~~w~-Taste, um zu beschleunigen. Links bzw. Rechts für Richtungswechsel. @@ -6739,19 +6739,19 @@ Echt der Hammer. Du glaubst nicht, was mir für 'ne Puppe über den Weg gelaufen 'ne Bordsteinschwalbe, oder sowas. Unten in Little Havana. [MOB_18D] -Sagt, sie heißt Mercedes oder so ãhnlich. +Sagt, sie heißt Mercedes oder so ähnlich. [MOB_18E] Wahnsinn, Alter. Die Puppe musst du dir geben. [MOB_18F] -Da würde 'nen Toter Hormonkoller kriegen. Sie sagt, ich wãr der beste, den sie je hatte. +Da würde 'nen Toter Hormonkoller kriegen. Sie sagt, ich wär der beste, den sie je hatte. [MOB_18G] Halt die Augen nach ihr offen. Bis dann. [MOB_72A] -Tommy, ich bin's, Lance. Du hãltst jetzt mal den Rand, Tommy, ich hab nãmlich keine Zeit für Geschwãtz. +Tommy, ich bin's, Lance. Du hältst jetzt mal den Rand, Tommy, ich hab nämlich keine Zeit für Geschwätz. [MOB_72B] Interessiert mich auch nicht, was du zu sagen hast. Warum auch? Ich bin dir doch sowieso scheißegal, stimmt's? @@ -6784,16 +6784,16 @@ Ganz gut. Werd zum Laufen 'nen Stock brauchen, müsste aber bald wieder arbeiten Gut. [MOB_63E] -Ich hab das mit Lance gehört. Was für ein Schwein, hã? +Ich hab das mit Lance gehört. Was für ein Schwein, hä? [MOB_63F] Ja. [MOB_63G] -Trau nie einem Mann, der im Pyjama auf der Straße herumlãuft. Gut, dass du ihn erledigt hast. Ich hoffe, es war nicht kurz und schmerzlos. +Trau nie einem Mann, der im Pyjama auf der Straße herumläuft. Gut, dass du ihn erledigt hast. Ich hoffe, es war nicht kurz und schmerzlos. [MOB_63H] -Eher nicht. Ich hãtte nur nicht gedacht, dass er so einer ist... +Eher nicht. Ich hätte nur nicht gedacht, dass er so einer ist... [MOB_63I] Tommy, für einen wildgewordenen Irren bist du ziemlich naiv. Ich bin bald wieder an der Arbeit, dann bring ich dir mal ein paar Sachen übers Leben bei, ok? @@ -6811,19 +6811,19 @@ Was willst du, Paul? Ich brauch keine getürkten Designer-Klamotten. Sehr witzig. Du weißt, dass ich mit getürkter Ware nichts am Hut habe. Wollte nur hören, ob ich nicht 'ne Rolle in einem von deinen Filmen kriegen könnte. [MOB_16D] -In England habe ich damals viel einschlãgiges Zeug gedreht. Ich hab mehr zu bieten als du, mein Alter. +In England habe ich damals viel einschlägiges Zeug gedreht. Ich hab mehr zu bieten als du, mein Alter. [MOB_16E] Paul, danke für das Angebot. Ich komm auf dich zurück. [MOB_16F] -Lass mich nicht hãngen. Denk dran, was ich alles für dich getan habe. +Lass mich nicht hängen. Denk dran, was ich alles für dich getan habe. [MOB_16G] Das versuch ich ja grade zu vergessen. [MOB_17A] -Tommy Vercetti. Wie geht's, großer Meister? Man hört so einiges über dich. Bist jetzt 'ne große Nummer in der Stadt, hã? +Tommy Vercetti. Wie geht's, großer Meister? Man hört so einiges über dich. Bist jetzt 'ne große Nummer in der Stadt, hä? [MOB_17B] Paul, du bist betrunken. @@ -6835,19 +6835,19 @@ Nein, du Trottel, ich bin nicht betrunken. Hab mir nur ein paar Ladungen Stoff g Und du brauchst mich nicht dumm anzureden. Ich bin nicht irgendwer. Wer hat dir denn in dieser Stadt den Weg geebnet? Ich! [MOB_17F] -Tatsãchlich? +Tatsächlich? [MOB_17G] -Komm mir nicht so! Ich hab dich mit den ganzen Leuten bekanntgemacht. Hab dir gezeigt, wie der Hase lãuft, hab alles mögliche für dich getan, und so dankst du es mir?! +Komm mir nicht so! Ich hab dich mit den ganzen Leuten bekanntgemacht. Hab dir gezeigt, wie der Hase läuft, hab alles mögliche für dich getan, und so dankst du es mir?! [MOB_17H] -Du ignorierst mich. Du gibst mir keine Chance, mitzumischen, nach allem, was ich für dich getan habe! Hãltst du mich für einen Schwachkopf? +Du ignorierst mich. Du gibst mir keine Chance, mitzumischen, nach allem, was ich für dich getan habe! Hältst du mich für einen Schwachkopf? [MOB_17I] Paul, reg dich ab. Ich hatte viel zu tun. Sei kein Idiot. [MOB_17J] -Ich bin kein Idiot. Das haben sie schon im Jugendknast gesagt. Wenn du Ãrger haben willst, Freundchen, den kannst du haben! +Ich bin kein Idiot. Das haben sie schon im Jugendknast gesagt. Wenn du Ärger haben willst, Freundchen, den kannst du haben! [MOB_17K] Tommy, bitte! Du warst meine große Hoffnung. Bitte, mach dich nicht lustig über mich! @@ -6868,10 +6868,10 @@ Hey, aber wie! Du bist ein Genie! Ich bin ein Genie! Sie lieben uns alle. Wir br Uns winken ganz große Filmpreise. Jetzt kann ich endlich meinen alten Herrn ins Heim stecken und ihm sagen, er soll die Klappe halten. [MOB_73E] -Ãh, das ist cool, Steve. +Äh, das ist cool, Steve. [MOB_73F] -Cool? Mann, das ist heiß! Heiß! H.E.I.ß! Er hat nie an mich geglaubt. Hat immer gedacht, ich wãre kein Künstler, und jetzt hab ich's geschafft! +Cool? Mann, das ist heiß! Heiß! H.E.I.ß! Er hat nie an mich geglaubt. Hat immer gedacht, ich wäre kein Künstler, und jetzt hab ich's geschafft! [MOB_73G] Ich bin der größte Porno-Regisseur aller Zeiten, mein Freund. Wollte dir nur sagen, es ist mir eine Freude, dich kennengelernt zu haben. @@ -6901,25 +6901,25 @@ Ziel POLE POSITION ERWORBEN! [ASSET_D] -~g~Der Pole Position Club sorgt nun für ein Einkommen von bis zu $~1~ pro Tag. Hol dir dein Geld regelmãssig! +~g~Der Pole Position Club sorgt nun für ein Einkommen von bis zu $~1~ pro Tag. Hol dir dein Geld regelmässig! [ST_WHEE] -Lãngste 'Wheelie' Zeit (sekunden) +Längste 'Wheelie' Zeit (sekunden) [ST_STOP] -Lãngste 'Stoppie' Zeit (sekunden) +Längste 'Stoppie' Zeit (sekunden) [ST_2WHE] -Lãngste 2 Rad Zeit (sekunden) +Längste 2 Rad Zeit (sekunden) [ST_WHED] -Lãngste 'Wheelie' Distanz (m) +Längste 'Wheelie' Distanz (m) [ST_STOD] -Lãngste 'Stoppie' Distanz (m) +Längste 'Stoppie' Distanz (m) [ST_2WHD] -Lãngste 2 Rad Distanz (m) +Längste 2 Rad Distanz (m) [OUTFT11] Trainer @@ -6928,7 +6928,7 @@ Trainer Frankie [RELOAD] -~g~Du hast die schnell Nachladefãhigkeit gewonnen! +~g~Du hast die schnell Nachladefähigkeit gewonnen! [APACHE] Hunter zur Heli Landeplattform am Ocean Beach geliefert. @@ -6961,10 +6961,10 @@ Neuer Kontaktpunkt am Jachthafen am Ocean Beach!! Feuerwehr-Mission Level ~1~ [HELP56] -Drücke die ~h~~k~~CAMERA_CHANGE_VIEW_ALL_SITUATIONS~~w~-Taste, um den Blickwinkel zu ãndern. +Drücke die ~h~~k~~CAMERA_CHANGE_VIEW_ALL_SITUATIONS~~w~-Taste, um den Blickwinkel zu ändern. [HELP57] -Drücke die ~h~~k~~CAMERA_CHANGE_VIEW_ALL_SITUATIONS~~w~-Taste, um den Blickwinkel zu ãndern. +Drücke die ~h~~k~~CAMERA_CHANGE_VIEW_ALL_SITUATIONS~~w~-Taste, um den Blickwinkel zu ändern. [HELP58] Beim Zielen kann durch Drücken der ~h~~k~~PED_CYCLE_TARGET_LEFT~~w~-Taste zwischen Zielen hin- und her gewechselt werden. @@ -6973,7 +6973,7 @@ Beim Zielen kann durch Drücken der ~h~~k~~PED_CYCLE_TARGET_LEFT~~w~-Taste zwisc Beim Zielen kann durch Drücken der ~h~~k~~PED_CYCLE_TARGET_LEFT~~w~-Taste zwischen Zielen hin- und her gewechselt werden. [HELP60] -Wenn du wãhrend eines Autodiebstahls die ~h~~k~~PED_SPRINT~ ~w~-Taste drückst, steigst du nicht in das Fahrzeug ein. +Wenn du während eines Autodiebstahls die ~h~~k~~PED_SPRINT~ ~w~-Taste drückst, steigst du nicht in das Fahrzeug ein. [HELP61] Du hast jetzt unbegrenzt Munition und doppelte Health für alle Fahrzeuge. @@ -7033,7 +7033,7 @@ Nach links Nach rechts [FEC_PWF] -Vorwãrts gehen +Vorwärts gehen [FEC_PWT] Auf Kamera zugehen @@ -7054,13 +7054,13 @@ Eine Waffe nach rechts Ziel fixieren [FEC_PJP] -Fußgãnger springen +Fußgänger springen [FEC_PSP] -Fußgãnger sprinten +Fußgänger sprinten [FEC_PSH] -Fußgãnger schießen +Fußgänger schießen [FEC_TLF] Ein Ziel nach links @@ -7072,10 +7072,10 @@ Ein Ziel nach rechts Kamera hinter Spieler zentrieren [FEC_SZI] -Mit Prãzisionsgewehr heranzoomen +Mit Präzisionsgewehr heranzoomen [FEC_SZO] -Mit Prãzisionsgewehr herauszoomen +Mit Präzisionsgewehr herauszoomen [FEC_LKL] First-Person nach links schauen @@ -7195,7 +7195,7 @@ Löschen fehlgeschlagen. Speichern fehlgeschlagen. [FEC_LUN] -Laden fehlgeschlagen. Datei beschãdigt. Bitte löschen. +Laden fehlgeschlagen. Datei beschädigt. Bitte löschen. [FEC_PAD] Gamepad @@ -7204,7 +7204,7 @@ Gamepad Joystick [FES_CSA] -Wãhlen Sie eine Skin aus der Liste aus: +Wählen Sie eine Skin aus der Liste aus: [FET_HRD] STANDARDEINSTLLG. WIEDERHERGESTELLT @@ -7219,7 +7219,7 @@ NUM STERN LINKS,RECHTS,MAUSRAD ZUR EINSTLLG. [FET_CIG] -RÜCKT. ZUM LÖSCHEN - LMT,RETURN ZUM ÃNDERN +RÜCKT. ZUM LÖSCHEN - LMT,RETURN ZUM ÄNDERN [FET_DSN] Standard-Player Skin.bmp @@ -7375,7 +7375,7 @@ LEERT. GTA VC [WIN_95] -GTA VC lãuft nicht unter Windows 95 +GTA VC läuft nicht unter Windows 95 [WIN_DX] GTA VC benötigt mind. DirectX Version 8.1 @@ -7480,19 +7480,19 @@ Geschütz + nach hinten neigen Geschütz + nach vorne neigen [FET_RIG] -WÃHLEN SIE EINE NEUE TASTENBELEGUNG FÜR DIESE AKTION +WÄHLEN SIE EINE NEUE TASTENBELEGUNG FÜR DIESE AKTION [FEA_NM3] KEINE MP3-DATEIEN GEFUNDEN [FEA_MPB] -MP3 LAUTSTÃRKE-BOOST +MP3 LAUTSTÄRKE-BOOST [FEA_MUS] -LAUTSTÃRKE MUSIK +LAUTSTÄRKE MUSIK [FEA_SFX] -LAUTSTÃRKE SFX +LAUTSTÄRKE SFX [FEA_ADP] AUTOMATISCHE HARDWARE ERKENNUNG @@ -7547,21 +7547,21 @@ Weitere Lieferungen: ~g~Carl Pearson, Pizza-Lieferant. Schalte ihn aus, bevor er seine Lieferungen abschließt. [ASM1_A:ASSIN1] -Mr. Teal, Ihre Hilfe bei der Beseitigung der Landeier war ãußerst wertvoll. Ich habe noch mehr Arbeit, die eine eher 'zupackende' Art verlangt. +Mr. Teal, Ihre Hilfe bei der Beseitigung der Landeier war äußerst wertvoll. Ich habe noch mehr Arbeit, die eine eher 'zupackende' Art verlangt. [ASM1_D:ASSIN1] -Mr. Teal, Ihre Hilfe bei der Beseitigung der Landeier war ãußerst wertvoll. +Mr. Teal, Ihre Hilfe bei der Beseitigung der Landeier war äußerst wertvoll. {=================================== MISSION TABLE ASSIN2 ===================================} [ASM2_1:ASSIN2] -~g~Mrs. Dawson verlãsst bald den Juwelier in Vice Point. Schalte sie aus. Es muss wie ein Autounfall aussehen. +~g~Mrs. Dawson verlässt bald den Juwelier in Vice Point. Schalte sie aus. Es muss wie ein Autounfall aussehen. [ASM2_3:ASSIN2] ~g~Das Fahrzeug wird explodieren! Hau ab! [ASM2_4:ASSIN2] -~r~Du hast ihr Auto beschãdigt, obwohl sie nicht drin saß! Jetzt wird sie nicht einsteigen! +~r~Du hast ihr Auto beschädigt, obwohl sie nicht drin saß! Jetzt wird sie nicht einsteigen! [ASM2_5:ASSIN2] ~r~Sie ist entwischt! @@ -7570,7 +7570,7 @@ Mr. Teal, Ihre Hilfe bei der Beseitigung der Landeier war ãußerst wertvoll. ~r~Du warst zu nah am Unfallort! [ASM2_7:ASSIN2] -~g~Keine Waffen! Es soll wie ein Unfall aussehen! Drãnge sie stattdessen von der Fahrbahn! +~g~Keine Waffen! Es soll wie ein Unfall aussehen! Dränge sie stattdessen von der Fahrbahn! [ASM2_8:ASSIN2] ~g~Das ganze muss wie ein Unfall aussehen. Benutze keine Waffen. @@ -7602,7 +7602,7 @@ Health: ZEIT: [ASM3_C:ASSIN3] -Eine europãische Gang plant einen Überfall auf eine Bank in Vice City. Meinen Arbeitgebern wãre sehr daran gelegen, dass das nicht passiert. +Eine europäische Gang plant einen Überfall auf eine Bank in Vice City. Meinen Arbeitgebern wäre sehr daran gelegen, dass das nicht passiert. [ASM3_D:ASSIN3] Alle Mitglieder der Gang haben eine Tarnung, solange sie sich hier in Vice City aufhalten. Manche haben Jobs, andere geben sich als Touristen aus. @@ -7611,13 +7611,13 @@ Alle Mitglieder der Gang haben eine Tarnung, solange sie sich hier in Vice City Infos über alle Zielpersonen und ihre wahrscheinlichen Aufenthaltsorte kleben unter dem Telefon. [ASM3_14:ASSIN3] -~g~Dick Tanner hãlt sich bei DBP Security am Ocean Drive auf. +~g~Dick Tanner hält sich bei DBP Security am Ocean Drive auf. [ASM3_15:ASSIN3] -~g~Marc Hammond und Franco Carter halten sich in der Nãhe des Juwelierladens in Vice Point auf. +~g~Marc Hammond und Franco Carter halten sich in der Nähe des Juwelierladens in Vice Point auf. [ASM3_16:ASSIN3] -~g~Nick Kong hãlt sich in der Nãhe von Washington Beach auf. +~g~Nick Kong hält sich in der Nähe von Washington Beach auf. [ASM3_18:ASSIN3] ~g~Geh nicht zu nahe an deine Zielperson heran, sonst entdeckt sie dich und du musst hinter ihr herjagen. @@ -7635,13 +7635,13 @@ Infos über alle Zielpersonen und ihre wahrscheinlichen Aufenthaltsorte kleben u ~g~Geh nicht zu nahe an deine Zielpersonen heran, sonst entdecken sie dich und versuchen zu fliehen. [ASM3_12:ASSIN3] -~g~In der Nãhe sind einige Waffen für dich deponiert worden, falls du sie brauchen solltest. Du hast ~h~9 MINUTEN~g~, um alle Gang-Mitglieder auszuschalten. +~g~In der Nähe sind einige Waffen für dich deponiert worden, falls du sie brauchen solltest. Du hast ~h~9 MINUTEN~g~, um alle Gang-Mitglieder auszuschalten. [ASM3_13:ASSIN3] ~g~Mike Griffin arbeitet an einer Plakatwand in Washington. [ASM3_17:ASSIN3] -~g~Charlie Dilson fãhrt mit dem Motorrad in Washington herum. +~g~Charlie Dilson fährt mit dem Motorrad in Washington herum. {=================================== MISSION TABLE ASSIN4 ===================================} @@ -7652,7 +7652,7 @@ Infos über alle Zielpersonen und ihre wahrscheinlichen Aufenthaltsorte kleben u Distanz: [ASM4_15:ASSIN4] -~g~Nimm das Prãzisionsgewehr zu deiner Rechten. +~g~Nimm das Präzisionsgewehr zu deiner Rechten. [ASM4_16:ASSIN4] ~g~Behalte die Frau auf der Empore im Auge. Sie wird die Rolltreppe hinuntergehen und die Zielperson nach der Uhrzeit fragen. @@ -7685,7 +7685,7 @@ Distanz: ~r~Die Zielperson hat das Flugzeug bestiegen! [ASM4_27:ASSIN4] -~r~Die Zielperson hat dich gesehen! Du hãttest Abstand halten sollen! +~r~Die Zielperson hat dich gesehen! Du hättest Abstand halten sollen! [ASM4_28:ASSIN4] ~r~Die Zielperson hat dich gesehen! Er hat gehört, wie du geschossen hast! @@ -7714,7 +7714,7 @@ Erledigen Sie alle Beteiligten, klauen Sie die Ware und bringen Sie sie zum Heli Links von Ihnen ist ein Tor, das zur Rückseite der Fabrik führt. [ASM5_1:ASSIN5] -~g~Geh auf das Gelãnde hinter der Cherry Popper-Eiscremefabrik und dann auf das Dach, wo der Deal abgewickelt wird. +~g~Geh auf das Gelände hinter der Cherry Popper-Eiscremefabrik und dann auf das Dach, wo der Deal abgewickelt wird. [ASM5_2:ASSIN5] ~g~Schnapp dir die Ware und bring sie zum Heliport am Flughafen. @@ -7737,7 +7737,7 @@ Wir haben unten eine ausgewachsene Bar, Ken. Ja, ja, wie auch immer. Tja, ich hab die Tafel besorgt, die du haben wolltest. [BJM1_D:BANKJ1] -Ah, das ist der Lohn des Jurastudiums: Die Fãhigkeit, Anweisungen auszuführen. +Ah, das ist der Lohn des Jurastudiums: Die Fähigkeit, Anweisungen auszuführen. [BJM1_E:BANKJ1] Also, ich brauche einen Safeknacker. @@ -7755,7 +7755,7 @@ Wo sitzt er denn? In einer Zelle in einem Polizeirevier. Er wartet auf seine Verlegung. [BJM1_J:BANKJ1] -Ich glaube fast, er kommt auf Bewãhrung raus... +Ich glaube fast, er kommt auf Bewährung raus... [BJM1_1:BANKJ1] ~g~Befreie Cam Jones aus der Haft! @@ -7788,10 +7788,10 @@ Besser als in 'ner Zelle zu verrotten! ~g~Bring Cam nach Hause! [BJM1_23:BANKJ1] -~g~Du brauchst zunãchst die Magnetkarte für die Tür! +~g~Du brauchst zunächst die Magnetkarte für die Tür! [BNK1_12:BANKJ1] -Hãng die Bullen ab und bring mich nach Hause! +Häng die Bullen ab und bring mich nach Hause! [BJM1_20:BANKJ1] Die Waffe weg oder es passiert was! @@ -7838,7 +7838,7 @@ Tja, der beste Schütze in der Stadt ist ein Kerl namens Cassidy. Ach ja? [BJM2_K:BANKJ2] -Ja. Soldat, oder wenigstens hãlt er sich dafür. +Ja. Soldat, oder wenigstens hält er sich dafür. [BJM2_L:BANKJ2] Ich bezweifle, dass er je bei der Army war, aber er kann mit der Knarre umgehen. @@ -7901,7 +7901,7 @@ GESAMTPUNKTZAHL FÜR DAS SCHIESSEN: ~1~ ~r~Einer der Schützen ist erledigt! [BJM2_14:BANKJ2] -~g~Begib dich zum nãchsten Areal! +~g~Begib dich zum nächsten Areal! [BJM2_15:BANKJ2] PUNKTE: @@ -7919,7 +7919,7 @@ ZU SCHLAGEN: ~r~Du hast den Schießstand verlassen! [BJM2_23:BANKJ2] -~g~Wenn du den Schießstand wãhrend des Wettbewerbs verlãsst, ist die Mission gescheitert. +~g~Wenn du den Schießstand während des Wettbewerbs verlässt, ist die Mission gescheitert. [BJM2_24:BANKJ2] ~g~Das nahegelegenste Ziel bringt 1 Punkt. @@ -7940,7 +7940,7 @@ AREAL KLAR! Huuuiii! [BNK2_5:BANKJ2] -Der trãfe nicht mal ein Scheunentor. +Der träfe nicht mal ein Scheunentor. [BNK2_7:BANKJ2] Also, was ist jetzt, hilfst du mir bei dem Job? @@ -7996,10 +7996,10 @@ Nimm Hilary, Boss, nicht diesen Labersack von einem Rechtverdreher. Hilary ist der beste. So schnell wie den hast noch keinen fahren sehen. Ich rufe ihn mal an. [BJM3_G:BANKJ3] -Hey, Hil, hier Phil. Wie lãuft's? Nein, sag nichts. Dazu haben wir spãter Zeit. Tust du mir einen Gefallen? +Hey, Hil, hier Phil. Wie läuft's? Nein, sag nichts. Dazu haben wir später Zeit. Tust du mir einen Gefallen? [BJM3_H:BANKJ3] -Ich hab hier einen Typ aus dem Norden. Nein, ich glaub, er war nicht beim Militãr. Aber er braucht einen Fahrer. +Ich hab hier einen Typ aus dem Norden. Nein, ich glaub, er war nicht beim Militär. Aber er braucht einen Fahrer. [BJM3_I:BANKJ3] Für einen Job. Ok, verstehe. @@ -8008,7 +8008,7 @@ Für einen Job. Ok, verstehe. Was hat er gesagt? [BJM3_K:BANKJ3] -Er macht's. Kein Problem. Na ja, ein kleines vielleicht: Er leidet unter Verlustãngsten. +Er macht's. Kein Problem. Na ja, ein kleines vielleicht: Er leidet unter Verlustängsten. [BJM3_L:BANKJ3] Er arbeitet anscheinend nicht für Leute, die ihn nicht schlagen können. Hat was mit seiner Mutter zu tun. @@ -8023,10 +8023,10 @@ Bist du Tommy? Klar bist du Tommy, ich meine, wieso sollte sonst einer mit mir reden wollen? [BJM3_2C:BANKJ3] -Ok. Das ganze lãuft so ab: +Ok. Das ganze läuft so ab: [BJM3_2D:BANKJ3] -Ich fahre für dich, WENN und NUR WENN du selbst anstãndig fãhrst. +Ich fahre für dich, WENN und NUR WENN du selbst anständig fährst. [BJM3_2E:BANKJ3] Verlierst du mich, verzeihe ich dir das nie. @@ -8044,7 +8044,7 @@ Ok, ich fahre für dich. Aber bitte, behandle mich schlecht. Illegales Straßenrennen bei Vice Point. [BNK3_3B:BANKJ3] -An alle Einsatzkrãfte. +An alle Einsatzkräfte. [BNK3_3C:BANKJ3] Straßenrennen sind verboten und illegal! @@ -8061,7 +8061,7 @@ Straßenrennen sind verboten und illegal! ~w~Was zum Geier rauchst du eigentlich, Mann? Das ist kein simpler Plan. [BNK4_D:BANKJ4] -~w~Ach, wer braucht schon simple Plãne? +~w~Ach, wer braucht schon simple Pläne? [BNK4_E:BANKJ4] ~w~Der Kommunismus, das war ein simpler Plan. Hat Russland aber nicht viel genützt, hah? @@ -8070,13 +8070,13 @@ Straßenrennen sind verboten und illegal! ~w~Ganz ruhig. Mit einem Team wie diesem ist das alles kein Problem. [BNK4_G:BANKJ4] -~w~Cam übernimmt den Safe. Phil? Wir beide kümmern uns um die Sicherheit, und Hilary fãhrt den Fluchtwagen. +~w~Cam übernimmt den Safe. Phil? Wir beide kümmern uns um die Sicherheit, und Hilary fährt den Fluchtwagen. [BNK4_H:BANKJ4] -~w~Ãh, hast du nicht jemanden vergessen? Jemanden, der dir unzãhlige Male geholfen hat in dieser Stadt? Jemanden...? +~w~Äh, hast du nicht jemanden vergessen? Jemanden, der dir unzählige Male geholfen hat in dieser Stadt? Jemanden...? [BNK4_I:BANKJ4] -~w~Ken...Ken, richtig. Ken wãscht das Geld für uns und stellt schon mal die Drinks kalt. +~w~Ken...Ken, richtig. Ken wäscht das Geld für uns und stellt schon mal die Drinks kalt. [BNK4_J:BANKJ4] ~w~Ich verstehe nicht, was ich hier soll. @@ -8100,7 +8100,7 @@ Straßenrennen sind verboten und illegal! ~r~Du hast Phil verloren! [C_HIND:BANKJ4] -~r~Cam wurde abgehãngt! +~r~Cam wurde abgehängt! [H_HIND:BANKJ4] ~r~Hilary wurde im Stich gelassen! @@ -8115,10 +8115,10 @@ Steig in den Fluchtwagen und führe den Plan aus! Ich fahre. [BNK4_2:BANKJ4] -Na prima. Beifahrer. Wenn ich das in der Therapie erzãhle. +Na prima. Beifahrer. Wenn ich das in der Therapie erzähle. [BNK4_3A:BANKJ4] -Hey, pass auf, wo du hinfãhrst, Tommy! +Hey, pass auf, wo du hinfährst, Tommy! [BNK4_3B:BANKJ4] Tommy, Hilary macht sich so breit! @@ -8145,7 +8145,7 @@ Ja, am Ende geht das noch ins Auge! Mein Baby! Alles Schrott! [BNK4_3O:BANKJ4] -Du hãngst zu sehr an der Illusion der Ewigkeit. +Du hängst zu sehr an der Illusion der Ewigkeit. [BNK4_3P:BANKJ4] Was? @@ -8277,7 +8277,7 @@ Die stürmen den Laden! In Deckung! [BNK4_94:BANKJ4] -~w~Ok, Jungs. Jeder hãlt sich an den Plan . +~w~Ok, Jungs. Jeder hält sich an den Plan . [BM_DEAD:BANKJ4] ~r~Du brauchst den Bank Manager lebend!! @@ -8286,7 +8286,7 @@ In Deckung! BANK-MISSIONEN ERFÜLLT! [ASSET_B:BANKJ4] -~g~Der Malibu Club generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmãßig ab. +~g~Der Malibu Club generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmäßig ab. [IDIOT:BANKJ4] ~r~Na super - angezogen wie ein Irrer durch die Gegend laufen und Aufmerksamkeit erregen, IDIOT! @@ -8297,7 +8297,7 @@ BANK-MISSIONEN ERFÜLLT! Komm schon, Brauner, komm! [COK1_B:BARON1] -Dãmlicher Klepper! Dich mach ich einen Kopf kürzer! +Dämlicher Klepper! Dich mach ich einen Kopf kürzer! [COK1_C:BARON1] Wer ist der Blödmann? @@ -8321,7 +8321,7 @@ Er denkt, ich weiß nicht, wie viel Geld mir zusteht. Aber 3% zu klauen ist gena Niemand haut mich übers Ohr. NIEMAND!! [COK1_K:BARON1] -Folge ihm von seiner Wohnung aus und sieh nach, wo er hin will. Spãter erledigen wir ihn. +Folge ihm von seiner Wohnung aus und sieh nach, wo er hin will. Später erledigen wir ihn. [COK1_1:BARON1] Oh, Shit! @@ -8377,13 +8377,13 @@ Das ist der Fehler an dieser Branche. Was soll denn das? Aaaaah! [COK2_H:BARON2] -Diese Mistkerle haben mich bitter enttãuscht. +Diese Mistkerle haben mich bitter enttäuscht. [COK2_I:BARON2] Bald denkt jeder Depp, er kann in Vice City Koks verkaufen. [COK2_J:BARON2] -Was kommt als nãchstes, hah? Die verstunkene Mafia?! +Was kommt als nächstes, hah? Die verstunkene Mafia?! [COK2_K:BARON2] Diese Bandengegend ist eine Festung ohne Mauern. @@ -8490,7 +8490,7 @@ Die Straßensperren zum Festland sind aufgehoben worden. {=================================== MISSION TABLE BARON3 ===================================} [COK3_A:BARON3] -Das gefãllt euch nicht, was?! +Das gefällt euch nicht, was?! [COK3_B:BARON3] Ahahahahaa, Ahahahahaa. @@ -8630,7 +8630,7 @@ Wieso spielen wir dann die Laufburschen für ihn? Je mehr wir jetzt lernen, desto weniger müssen wir lernen, wenn wir diese Stadt übernehmen! [COK4_5:BARON4] -Dein Stil gefãllt mir. Echt erfrischend. +Dein Stil gefällt mir. Echt erfrischend. [COK4_12:BARON4] Pass auf, die kommen von überall @@ -8707,7 +8707,7 @@ Zufrieden? Ja. Und wie! [ASS1_F:BARON5] -Ihr dãmlichen Idioten! +Ihr dämlichen Idioten! [ASS1_G:BARON5] Mein schönes Haus @@ -8722,7 +8722,7 @@ Das ist für meinen Bruder! Ich habe dir vertraut, Tommy. [ASS1_K:BARON5] -Ich hãtte was aus dir gemacht... +Ich hätte was aus dir gemacht... [ASS1_L:BARON5] Gute Nacht, Mr. Diaz. @@ -8737,7 +8737,7 @@ Keine Panik, Tommy, ich geb dir Deckung. DIAZ?! Ich bin hier, um deinen Laden zu übernehmen! [ASS1_14:BARON5] -TOMMY! Du Verrãter...Du Idiot! Dich mache ich fix und fertig... +TOMMY! Du Verräter...Du Idiot! Dich mache ich fix und fertig... [ASS1_16:BARON5] ~g~Erledige Diaz! @@ -8778,7 +8778,7 @@ Du siehst nicht wie ein Bulle aus, das heißt, du hast 1 Minute. Also drück auf die Tube. [BM1_H:BIKE1] -Kent Paul sagt, ihr wãrt interessiert, die Security für einen Gig zu übernehmen, den er plant. +Kent Paul sagt, ihr wärt interessiert, die Security für einen Gig zu übernehmen, den er plant. [BM1_I:BIKE1] Kent Paul? Pfff! Kein Wunder, dass er dich schickt. @@ -8790,7 +8790,7 @@ Als er das letzte Mal hier war, ist er durch Fenster wieder gegangen - und zwar Seid ihr nun interessiert oder nicht? [BM1_L:BIKE1] -Gefãlligkeiten gibt's nur für Mitglieder. +Gefälligkeiten gibt's nur für Mitglieder. [BM1_M:BIKE1] Wie kann ich beitreten? @@ -8802,7 +8802,7 @@ Wir sind hier kein Golfklub, Kleiner. Kannst du 'n Bike fahren? Kannst du auf 'm Barhocker sitzen und saufen? [BM1_P:BIKE1] -Cougar, Zeppelin, checkt mal ab, wie diese Sissy hier fãhrt. +Cougar, Zeppelin, checkt mal ab, wie diese Sissy hier fährt. [BM1_2:BIKE1] ~g~Du brauchst eine Freeway oder eine Angel, um mitzumachen! @@ -8834,13 +8834,13 @@ Ha, ha, ha, hab dich wieder erwischt. Hey, Vercetti. [BM2_C:BIKE2] -Cougar meint, du fãhrst ziemlich gut. +Cougar meint, du fährst ziemlich gut. [BM2_D:BIKE2] Ja, wie lange soll ich noch hier rumgurken? [BM2_E:BIKE2] -Ich bin ein sehr beschãftigter Mann. +Ich bin ein sehr beschäftigter Mann. [BM2_F:BIKE2] Wenn ich mich kloppen soll, damit das klar geht, dann los. @@ -8867,7 +8867,7 @@ Das hier ist die größte Familie von Außenseitern, Outlaws und Unruhestiftern. Ein paar von uns wurden sogar von ihrem eigenen Land verraten. [BM2_N:BIKE2] -Wãhrend des Vietnamkriegs war ich eingelocht. Miese Sache. +Während des Vietnamkriegs war ich eingelocht. Miese Sache. [BM2_O:BIKE2] Drum sollst du denen ja zeigen, was Sache ist. @@ -8893,7 +8893,7 @@ Hi, Mitch. Ah, sieh an, 'Outlaw' Vercetti. [BM3_C:BIKE3] -Jetzt will ich sehen, wie du für deine Kumpels kãmpfst. +Jetzt will ich sehen, wie du für deine Kumpels kämpfst. [BM3_D:BIKE3] Eine Straßengang von hier hat den Fehler gemacht, meinen Hobel zu klauen. @@ -8902,13 +8902,13 @@ Eine Straßengang von hier hat den Fehler gemacht, meinen Hobel zu klauen. Wollten wahrscheinlich zeigen, was für coole Machos sie sind. [BM3_F:BIKE3] -Ich und die Jungs wollten ihnen eigentlich ein bisschen Respekt einblãuen. +Ich und die Jungs wollten ihnen eigentlich ein bisschen Respekt einbläuen. [BM3_G:BIKE3] Aber- [BM3_H:BIKE3] --dann dachte ich mir, das wãre doch ein guter Test für dich. +-dann dachte ich mir, das wäre doch ein guter Test für dich. [BM3_I:BIKE3] Bring mir meine Maschine zurück und Paul kriegt seine Security. @@ -8943,7 +8943,7 @@ Bring mir meine Maschine zurück und Paul kriegt seine Security. {=================================== MISSION TABLE BMX_1 ===================================} [GETBIK2:BMX_1] -Du hast ~1~ Sekunden, um auf ein Gelãndemotorrad zu steigen! +Du hast ~1~ Sekunden, um auf ein Geländemotorrad zu steigen! {=================================== MISSION TABLE BOATBUY ===================================} @@ -9013,7 +9013,7 @@ Wer war das? Tommy... ein paar Mafia-Typen... sie wollen wiederkommen, ihren Anteil abkassieren. [CAP_04:CAP_1] -Ein gewisser Mr. Forello hãtte dir Geld gegeben. Mir geht's schlecht. +Ein gewisser Mr. Forello hätte dir Geld gegeben. Mir geht's schlecht. [CAP_05:CAP_1] Forelli? SONNY Forelli? @@ -9073,7 +9073,7 @@ Du wirst dran glauben, Vercetti. ~g~Du hast den Eintreiber verloren. [CAP1_B8:CAP_1] -~r~Der Eintreiber verlangt für all deine Geschãfte Schutzgeld. +~r~Der Eintreiber verlangt für all deine Geschäfte Schutzgeld. [CAP1_B9:CAP_1] ~g~Die Mafia verlangt Schutzgeld für das Malibu! @@ -9100,22 +9100,22 @@ Du wirst dran glauben, Vercetti. ~g~Die Mafia ist im Filmstudio angekommen! [CAP1_D2:CAP_1] -~g~Die Mafia verlãsst die Bootswerft! +~g~Die Mafia verlässt die Bootswerft! [CAP1_D3:CAP_1] -~g~Die Mafia verlãsst die Eiscremefabrik! +~g~Die Mafia verlässt die Eiscremefabrik! [CAP1_D4:CAP_1] -~g~Die Mafia verlãsst das Autohaus! +~g~Die Mafia verlässt das Autohaus! [CAP1_D5:CAP_1] -~g~Die Mafia verlãsst das Taxiunternehmen! +~g~Die Mafia verlässt das Taxiunternehmen! [CAP1_D9:CAP_1] -~g~Die Mafia verlãsst den Malibu Club! +~g~Die Mafia verlässt den Malibu Club! [CAP1_D0:CAP_1] -~g~Die Mafia verlãsst das Filmstudio! +~g~Die Mafia verlässt das Filmstudio! [CAP1B10:CAP_1] Du hast die Eintreiber erledigt. Es kommen weitere. @@ -9138,7 +9138,7 @@ Tja, ich verkaufe das Autohaus ja eigentlich nur ungern. War meine erste Investition, nachdem ich Football-Profi wurde. [CAR1_6:CARBUY] -Aber es wird Zeit für eine Luftverãnderung. +Aber es wird Zeit für eine Luftveränderung. [CAR1_7:CARBUY] Sie verlassen die Stadt? @@ -9150,7 +9150,7 @@ Nicht in allzu großer Eile, hoffe ich doch? Nein, ich bereite mich nur auf mein Comeback als Football-Profi vor. Ich hatte schon aufgehört. [CAR1_10:CARBUY] -Das Geschãft lief nicht allzu gut. +Das Geschäft lief nicht allzu gut. [CAR1_11:CARBUY] Da haben sich meine Angestellten was einfallen lassen, @@ -9174,7 +9174,7 @@ Machen Sie sich mal keine Gedanken. Der Laden ist genau das, was ich brauche. [CAR1_18:CARBUY] -Ja. Dann kommen wir also ins Geschãft? +Ja. Dann kommen wir also ins Geschäft? {=================================== MISSION TABLE CARPAR1 ===================================} @@ -9185,7 +9185,7 @@ Ja. Dann kommen wir also ins Geschãft? ~r~Du hast ein Hütchen umgefahren!! [MM_1_C:CARPAR1] -~y~PASSIERE~g~ einen Checkpoint, dann lãuft die Zeit. ~g~Jeder Checkpoint bringt dir ~y~~1~ SEKUNDEN~g~. +~y~PASSIERE~g~ einen Checkpoint, dann läuft die Zeit. ~g~Jeder Checkpoint bringt dir ~y~~1~ SEKUNDEN~g~. {=================================== MISSION TABLE COPCAR ===================================} @@ -9196,13 +9196,13 @@ Bürgerwehr-Mission Level 12 beendet: Deine max. Panzerung erhöht sich auf 150 Bürgerwehr-Mission Level ~1~ [C_PASS:COPCAR] -BEDROHUNG AUSGERÃUMT: $ ~1~ +BEDROHUNG AUSGERÄUMT: $ ~1~ [KILLS:COPCAR] HITS: [C_BREIF:COPCAR] -~g~Verdãchtiger wurde zuletzt in der Gegend von ~a~ gesichtet. +~g~Verdächtiger wurde zuletzt in der Gegend von ~a~ gesichtet. [COPCART:COPCAR] ~g~Du hast ~1~ Sekunden, um zu einem Polizeifahrzeug zurückzukehren, bevor die Mission endet. @@ -9237,13 +9237,13 @@ Ach, Blödsinn, absoluter Blödsinn. Ich drucke lieber Geld. Ist gar nicht so sc In kleinerem Umfang mache ich das schon seit Jahren. [CM1_H:COUNT1] -Tatsãchlich? +Tatsächlich? [CM1_I:COUNT1] -Klar. Aber wir brãuchten gute Platten. +Klar. Aber wir bräuchten gute Platten. [CM1_J:COUNT1] -Natürlich! In Florida gibt es schon ein Geldfãlscher-Syndikat. +Natürlich! In Florida gibt es schon ein Geldfälscher-Syndikat. [CM1_K:COUNT1] Ein Syndikat? @@ -9264,10 +9264,10 @@ Sieh dir diesen Hintern an! Tja, Kleine, du weißt nicht, was dir entgeht! [CM1_2C:COUNT1] -Na, alter Freund, wie lãuft's so? +Na, alter Freund, wie läuft's so? [CM1_2D:COUNT1] -Was weißt du über Geldfãlscherei? +Was weißt du über Geldfälscherei? [CM1_2E:COUNT1] 'Oh, alles bestens, Paul, und bei dir?' @@ -9276,7 +9276,7 @@ Was weißt du über Geldfãlscherei? Komm her! [CM1_2G:COUNT1] -Ist ja gut, ist ja gut. Anscheinend bist du schwer beschãftigt. +Ist ja gut, ist ja gut. Anscheinend bist du schwer beschäftigt. [CM1_2H:COUNT1] Über Falschgeld weiß ich nur, dass die Triaden die Platten liefern. @@ -9285,7 +9285,7 @@ Ist ja gut, ist ja gut. Anscheinend bist du schwer beschãftigt. Die haben eine Reederei unten bei den Docks. [CM1_2J:COUNT1] -Der Boss weiß, wann die nãchsten Platten reinkommen. +Der Boss weiß, wann die nächsten Platten reinkommen. [CM1_2K:COUNT1] Danke, Paul. @@ -9323,13 +9323,13 @@ Ok, ich rede ja! Ich rede! Ok, der Kurier holt die Druckplatten heute vom Hafen ab. [CNT2_B2:COUNT2] -Ich fange ihn ab, schnapp mir die Platten, hãng die Cops ab und komm wieder hierher. +Ich fange ihn ab, schnapp mir die Platten, häng die Cops ab und komm wieder hierher. [CNT2_B3:COUNT2] -Also, je nachdem wie es lãuft, haben wir +Also, je nachdem wie es läuft, haben wir [CNT2_B4:COUNT2] -entweder 5 Minuten zum Gelddrucken, bis das Fãlschersyndikat uns findet, oder wir haben alle Zeit der Welt. +entweder 5 Minuten zum Gelddrucken, bis das Fälschersyndikat uns findet, oder wir haben alle Zeit der Welt. [CNT2_B5:COUNT2] Jedenfalls will ich 5 Minuten nachdem ich hier bin, Scheinchen aus der Presse kommen sehen! @@ -9338,10 +9338,10 @@ Jedenfalls will ich 5 Minuten nachdem ich hier bin, Scheinchen aus der Presse ko Keine Sorge, Tommy. Wir sind bereit. [CNT2_B7:COUNT2] -Ich und die Jungs bleiben in der Nãhe, falls die Cops dir in die Quere kommen. +Ich und die Jungs bleiben in der Nähe, falls die Cops dir in die Quere kommen. [CNT2_B8:COUNT2] -Ok. Jeder weiß, was er zu tun hat? Gut. Bis spãter. +Ok. Jeder weiß, was er zu tun hat? Gut. Bis später. [CNT2_01:COUNT2] ~g~Der ~r~Kurier~g~ mit den Druckplatten kommt jeden Moment in einem Helikopter an den ~y~Docks~g~ an. @@ -9350,7 +9350,7 @@ Ok. Jeder weiß, was er zu tun hat? Gut. Bis spãter. ~r~Der Kurier mit den Platten ist im Helikopter geflohen. [CNT2_03:COUNT2] -~r~Der Kurier ist an seinem Ziel angekommen. Du kommst zu spãt! +~r~Der Kurier ist an seinem Ziel angekommen. Du kommst zu spät! [CNT2_04:COUNT2] ~r~Du hast die Platten in der Explosion zerstört! @@ -9374,7 +9374,7 @@ Privatangelegenheit. Du hast hier nichts verloren! DRUCKEREI ERWORBEN [CNT2_10:COUNT2] -~g~Die Druckerei generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmãßig ab. +~g~Die Druckerei generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmäßig ab. [CNT2_11:COUNT2] ~r~Die Platten liegen auf dem Meeresgrund! @@ -9409,7 +9409,7 @@ Nein, ich glaube, deine Blödheit reicht für uns beide. Hey, er sagt, du bist dumm, mein Sohn. [CUB1_J:CUBAN1] -Und ich sage, er ist ein kleines Mãdchen, Paps. +Und ich sage, er ist ein kleines Mädchen, Paps. [CUB1_K:CUBAN1] Sieh dir doch an, wie er angezogen ist. @@ -9424,7 +9424,7 @@ Du willst ein harter Kerl sein und ziehst dich an wie ein Weib? Hast du auch ein Höschen an, oder was? [CUB1_O:CUBAN1] -Was hast du gegen Frauen? Ziehst du Mãnner vor? +Was hast du gegen Frauen? Ziehst du Männer vor? [CUB1_P:CUBAN1] Ich liebe Frauen! Ich liebe alle Frauen! Ich liebe meine Mutter, Chico. @@ -9439,7 +9439,7 @@ Kannst du fahren, Amigo? Ja...wie eine Frau. [CUB1_T:CUBAN1] -Sehr witzig. Du gefãllst mir, Großer. Vielleicht kannst du mir helfen. +Sehr witzig. Du gefällst mir, Großer. Vielleicht kannst du mir helfen. [CUB1_U:CUBAN1] Vielleicht kannst du beweisen, dass du ein Mann bist. Hah? @@ -9451,7 +9451,7 @@ Schnapp dir das Boot. Zeig mir, dass du ein ganzer Kerl bist, [CUB1_X:CUBAN1] -und kein kleines Mãdchen. +und kein kleines Mädchen. [CUB1_02:CUBAN1] Ok Mann, behandle es wie eine Frau. @@ -9472,10 +9472,10 @@ Du willst ein Mann sein, Mann? Du bist ein feiges Würstchen, Kleiner, heul dich bei Mammi aus. [CUB1_08:CUBAN1] -Du bist zu nichts zu gebrauchen. Macht einen auf harter Mann, aber fãhrt wie ein Idiot. +Du bist zu nichts zu gebrauchen. Macht einen auf harter Mann, aber fährt wie ein Idiot. [CUB1_09:CUBAN1] -Mann, du bist der Hammer, Mann. Du gefãllst mir. Du gefãllst mir sehr. +Mann, du bist der Hammer, Mann. Du gefällst mir. Du gefällst mir sehr. [CUB1_10:CUBAN1] Du bist gut, Mann. Weil du ein ganzer Kerl bist. Alle meine Freunde sind ganze Kerle. @@ -9504,7 +9504,7 @@ Hi, ich bin Rico. Bist du der 'ganze Kerl'? ERLEDIGE ALLE HAITIANER!! [CUB2_M:CUBAN2] -Wer sich mit mir anlegt, hat sich den stãrksten der Stadt rausgesucht! +Wer sich mit mir anlegt, hat sich den stärksten der Stadt rausgesucht! [CUB2_A:CUBAN2] Eine Kaffee, bitte, Alberto. @@ -9534,7 +9534,7 @@ Aber dazu brauchen wir Hilfe. Ich hab dabei schon ein paar Brüder verloren. [CUB2_H:CUBAN2] -Amigo, du fãhrst gut! +Amigo, du fährst gut! [CUB2_I:CUBAN2] Für eine Frau, was? @@ -9552,7 +9552,7 @@ Bring meine Jungs da rüber, und dann erledigen wir diese Haitianer! Da ist nicht genug Platz, Mann, du brauchst ein größeres Auto. [CUB2_02:CUBAN2] -Wir brauchen Verstãrkung aus dem Café! +Wir brauchen Verstärkung aus dem Café! [CUB2_03:CUBAN2] ~g~Besorg dir ein Auto und hole die Kubaner vor Robinas Café ab. @@ -9564,13 +9564,13 @@ Wir brauchen Verstãrkung aus dem Café! Schalte den feigen Heckenschützen aus! [CUB2_07:CUBAN2] -Die kãmpfen wie Weiber! In Deckung! +Die kämpfen wie Weiber! In Deckung! [CUB2_09:CUBAN2] Heckenschütze auf dem Dach! [CUB2_11:CUBAN2] -~r~Du Idiot! Das Auto hãtten wir gebraucht! +~r~Du Idiot! Das Auto hätten wir gebraucht! [CUB2_12:CUBAN2] Hey, Amigo! Schön zu sehen, dass du's geschafft hast! @@ -9594,16 +9594,16 @@ Lass uns diesen Wagen voller Stoff nehmen und abhauen! ~g~Besorge dir ein Auto und hole die Kubaner ab. [CUB2_19:CUBAN2] -Wir werden kãmpfen wie Mãnner! +Wir werden kämpfen wie Männer! [CUB2_21:CUBAN2] -Kãmpfen wie ganze Kerle! +Kämpfen wie ganze Kerle! [CUB2_22:CUBAN2] ~g~Schalte die restlichen Haitianer aus, damit die Kubaner vorrücken können. [CUB2_23:CUBAN2] -~g~In Little Haiti wird es von Haitianern wimmeln, die sich an den Kubanern rãchen wollen. Sei vorsichtig. +~g~In Little Haiti wird es von Haitianern wimmeln, die sich an den Kubanern rächen wollen. Sei vorsichtig. [CUB2_24:CUBAN2] ~g~Kehre mit dem Van zu Robinas Café zurück und parke hinter dem Haus. @@ -9635,22 +9635,22 @@ Sie lachen mich aus, Tommy. Mich! Umberto Robina. Die tun, was sie wollen! [CUB3_I:CUBAN3] -Die tun nicht, was sie wollen, Umberto. Sie tun, was du sie tun lãsst. +Die tun nicht, was sie wollen, Umberto. Sie tun, was du sie tun lässt. [CUB3_J:CUBAN3] Was? [CUB3_K:CUBAN3] -Soll jemand aus dem Weg gerãumt werden? +Soll jemand aus dem Weg geräumt werden? [CUB3_L:CUBAN3] Ich kann das machen, aber es kostet. [CUB3_M:CUBAN3] -Ich weiß, wir sind Brüder und alles, aber hier geht's um ein Geschãft. +Ich weiß, wir sind Brüder und alles, aber hier geht's um ein Geschäft. [CUB3_N:CUBAN3] -Tommy. Du bist ein echter Mann. Ein Geschãftsmann, ein Gentleman. +Tommy. Du bist ein echter Mann. Ein Geschäftsmann, ein Gentleman. [CUB3_O:CUBAN3] Die Haitianer, sie erwarten eine Schiffladung Stoff, richtig gutes Zeug. @@ -9674,13 +9674,13 @@ Hey, Rico. Nettes Boot. Bist du bereit? ~g~Bringe die Drogen und das Geld zu Umberto. [CUB3_05:CUBAN3] -Ja, Tommy. Also, sei ein guter Kapitãn heute. +Ja, Tommy. Also, sei ein guter Kapitän heute. [CUB3_06:CUBAN3] Mein Boot nützt mir nichts, wenn es durchlöchert ist, ok? [CUB3_07:CUBAN3] -~g~Begib dich zu Rico. Er fãhrt dich zum Treffpunkt. +~g~Begib dich zu Rico. Er fährt dich zum Treffpunkt. [CUB3_02:CUBAN3] ~g~ERLEDIGE ALLE HAITIANER AUF DEN BOOTEN!! @@ -9808,7 +9808,7 @@ Ich kannte mal eine schöne Frau, die hat hier gewohnt. Die machen gute Pizza hier. [CUB4_22:CUBAN4] -Hey, Mann! Du fãhrst wie ein Verrückter! +Hey, Mann! Du fährst wie ein Verrückter! [CUB4_23:CUBAN4] Hast du dich verfahren, Mann? @@ -9817,7 +9817,7 @@ Hast du dich verfahren, Mann? Du hast Pepe vergessen, hole ihn. [CUB4_03:CUBAN4] -~g~Bleib im Wagen, bis er sicher auf dem Gelãnde geparkt ist. +~g~Bleib im Wagen, bis er sicher auf dem Gelände geparkt ist. [CUB4_26:CUBAN4] ~g~Nimm dir Pepe, fahr Richtung Norden nach Little Haiti und klaue einen Voodoo. @@ -9867,7 +9867,7 @@ Und jetzt kommen auf einmal deine italienischen Brüder an und wollen mir Zement Halt den Mund, Ken. Setz dich. [FIN1_08:FINALE] -Lance, was lãuft hier, verdammt? +Lance, was läuft hier, verdammt? [FIN1_09:FINALE] Deine Freunde aus dem Norden, Tommy. Die sind nicht sehr froh, dass du ihren Mann erledigt hast. @@ -9876,7 +9876,7 @@ Deine Freunde aus dem Norden, Tommy. Die sind nicht sehr froh, dass du ihren Man Sie kommen heute, um nach dem Rechten zu sehen. [FIN1_11:FINALE] -Sie haben lãnger gebraucht, als ich dachte... +Sie haben länger gebraucht, als ich dachte... [FIN1_12:FINALE] Jungs, wir müssen denen ein für alle Mal klar machen, dass das mein Laden ist. MEINER! @@ -9900,7 +9900,7 @@ Ich war 15 Jahre weg vom Fenster, bin nicht mehr auf dem Laufenden, was Manieren angeht. [FIN2_05:FINALE] -Immer Wut im Bauch, hã, Tommy? +Immer Wut im Bauch, hä, Tommy? [FIN2_06:FINALE] Ich sag's ja, dein Temperament wird dir nochmal schlecht bekommen. @@ -9909,7 +9909,7 @@ Ich sag's ja, dein Temperament wird dir nochmal schlecht bekommen. In den Koffern sind 20 Millionen... [FIN2_08:FINALE] -Wie viele waren es denn? Zehn? Nein, elf Mãnner. +Wie viele waren es denn? Zehn? Nein, elf Männer. [FIN2_09:FINALE] So kommt man zu dem Spitznamen 'Harwood-Butcher'! Hehehe! @@ -9933,19 +9933,19 @@ Holt das Geld! Weißt du, Tommy, ich hab für dich getan, was nur ging. Himmel und Hölle in Bewegung gesetzt. [FIN2_16:FINALE] -Ich war dein Freund. Ich dachte, du nimmst Vernunft an. Kapierst, was gut fürs Geschãft ist. +Ich war dein Freund. Ich dachte, du nimmst Vernunft an. Kapierst, was gut fürs Geschäft ist. [FIN2_17:FINALE] -Ich hab dir vertraut, Tommy, und du hast mich enttãuscht. +Ich hab dir vertraut, Tommy, und du hast mich enttäuscht. [FIN2_18:FINALE] -Aber wenigstens einer in deiner mickrigen Organisation weiß, wie man Geschãfte macht. +Aber wenigstens einer in deiner mickrigen Organisation weiß, wie man Geschäfte macht. [FIN2_19:FINALE] Stimmt's, Lance? [FIN2_20:FINALE] -Sorry, Tommy. So lãuft's in Vice City. So lãuft das Geschãft. +Sorry, Tommy. So läuft's in Vice City. So läuft das Geschäft. [FIN2_21:FINALE] Du hast uns verraten... @@ -9969,7 +9969,7 @@ Dass ich den Schwanz einziehe und abhaue, um nicht das Gesicht zu verlieren? Nein. [FIN2_28:FINALE] -Ich wollte dich nur noch ein bisschen ãrgern, bevor ich dich fertig mache. +Ich wollte dich nur noch ein bisschen ärgern, bevor ich dich fertig mache. [FIN3_01:FINALE] Tommy? @@ -9981,16 +9981,16 @@ Oh Gott, Tommy! Was ist passiert? Wonach sieht's denn aus? [FIN3_04:FINALE] -Sieht aus, als wãr dein Anzug ruiniert! +Sieht aus, als wär dein Anzug ruiniert! [FIN3_05:FINALE] Und das war ein wunderbarer Anzug! Tommy, Herrgott, was ist passiert? [FIN3_06:FINALE] -Kleine Meinungsverschiedenheit mit einem Geschãftsfreund. Wie das so ist. +Kleine Meinungsverschiedenheit mit einem Geschäftsfreund. Wie das so ist. [FIN3_07:FINALE] -Wenn ich eine Meinungsverschiedenheit mit einem Geschãftsfreund habe, schick ich ihm einen bösen Brief. +Wenn ich eine Meinungsverschiedenheit mit einem Geschäftsfreund habe, schick ich ihm einen bösen Brief. [FIN3_08:FINALE] Oder ich pinkle ihm in den Briefkasten, aber ich fang nicht den 3. Weltkrieg an. @@ -10011,10 +10011,10 @@ Er ist neurotisch, unsicher, selbstsüchtig - Er ist ein Arschloch! Gut, dass du ihn fertig gemacht hast! [FIN3_14:FINALE] -Ich glaub auch nicht, dass wir nochmal Ãrger mit denen aus dem Norden kriegen... +Ich glaub auch nicht, dass wir nochmal Ärger mit denen aus dem Norden kriegen... [FIN3_15:FINALE] -Die aus dem Norden gibt's nãmlich nicht mehr. +Die aus dem Norden gibt's nämlich nicht mehr. [FIN3_16:FINALE] Gibt nur noch die im Süden. @@ -10029,7 +10029,7 @@ Na, was meinst du, was das heißt? Dass wir jetzt die Herren im Haus sind... ich meine, dass DU der Herr im Haus bist. Oh, Tommy... [FIN3_20:FINALE] -Weißt du, Ken, das könnte der Beginn einer wunderbaren Geschãftsbeziehung sein... +Weißt du, Ken, das könnte der Beginn einer wunderbaren Geschäftsbeziehung sein... [FIN3_21:FINALE] Schließlich bist du ein hinterlistiger, mieser kleiner Dieb... @@ -10041,7 +10041,7 @@ und ich bin ein verurteilter Psychopath und Dealer. Ich weiß. Ist das nicht wunderbar? [FIN_B1:FINALE] -~g~Erledige den Verrãter ~y~Vance~g~. +~g~Erledige den Verräter ~y~Vance~g~. [FIN_B2:FINALE] ~g~Erledige ~p~Sonny~g~, um die Sache ein für alle Mal zuende zu bringen. @@ -10050,7 +10050,7 @@ Ich weiß. Ist das nicht wunderbar? ~g~Die Mafia will dein Geld stehlen. Verteidige den Safe. [FIN_B4:FINALE] -~g~Du hãltst nicht mehr lange durch. Hol dir unten ein wenig ~w~Energie~g~. +~g~Du hältst nicht mehr lange durch. Hol dir unten ein wenig ~w~Energie~g~. [FIN_B5:FINALE] ~g~Die Mafia stiehlt dein Geld. Verteidige den ~c~Safe. @@ -10067,7 +10067,7 @@ Ich weiß. Ist das nicht wunderbar? Feuer gelöscht! [F_FAIL2:FIRETRK] -~r~Du kommst zu spãt! +~r~Du kommst zu spät! [F_CANC:FIRETRK] ~r~Feuerwehr-Mission abgebrochen! @@ -10117,7 +10117,7 @@ Nein danke. Es ist mir peinlich, aber es scheint, unser Problem ist zum Teil auf das lose Mundwerk einer mir vertrauten Person zurückzuführen. [GEN1_F:GENERA1] -Seit Jahren schleppe ich Gonzalez mit, aber nun erreicht seine Unfãhigkeit einen neuen Höhepunkt. +Seit Jahren schleppe ich Gonzalez mit, aber nun erreicht seine Unfähigkeit einen neuen Höhepunkt. [GEN1_G:GENERA1] Es ist nur gerecht, wenn Sie Gonzalez erledigen. @@ -10129,7 +10129,7 @@ War er es? Mir geht es in erster Linie um das Geld. Er ist in seinem Penthouse, vermutlich halb betrunken. Nehmen Sie das hier. [GEN1_06:GENERA1] -Er hat eine Kettensãge!! +Er hat eine Kettensäge!! [GEN1_07:GENERA1] Bleib mir vom Leib, du elender Mistkerl! @@ -10209,7 +10209,7 @@ Tommy! Setzen Sie sich zu mir. Sieht das nicht köstlich aus? Tapirschnauze? [COL2_C:GENERA2] -Ãh... Nein. Nein, danke. +Äh... Nein. Nein, danke. [COL2_D:GENERA2] Tommy, Sie sind wie eine Pampas-Brise, die mich vom Gestank der Korruption befreit hat. @@ -10218,19 +10218,19 @@ Tommy, Sie sind wie eine Pampas-Brise, die mich vom Gestank der Korruption befre Natürlich muss ich so tun, als trauere ich um ihn und muss wie immer meine Arbeit machen. [COL2_F:GENERA2] -Das bringt mich meinem Geld nicht nãher... +Das bringt mich meinem Geld nicht näher... [COL2_G:GENERA2] Tommy, mein Freund, Sie sind hier nicht in Liberty. Hier regeln wir Dinge anders. [COL2_H:GENERA2] -Ich werde weiter nachforschen, zunãchst hãtte ich aber ein lukratives Geschãft abzuschließen. +Ich werde weiter nachforschen, zunächst hätte ich aber ein lukratives Geschäft abzuschließen. [COL2_I:GENERA2] Freunden tu ich gern einen Gefallen, Cortez... [COL2_J:GENERA2] -Sie sind ein guter Freund, Tommy. Ich wusste, ich kann auf Sie zãhlen. +Sie sind ein guter Freund, Tommy. Ich wusste, ich kann auf Sie zählen. [COL2_K:GENERA2] Sie müssen sich mit einem Kurier treffen, der wertvolle 'Technologie' für mich beschafft hat. @@ -10242,7 +10242,7 @@ Die Regen ist sich sehr nass um diese Jahreszeit... Was? [COL2_3:GENERA2] -Ãh, comment? +Äh, comment? [COL2_4:GENERA2] Hören Sie, Cortez schickt mich. Geben Sie mir die verdammten Mikrochips. @@ -10289,7 +10289,7 @@ Thomas, danke, dass Sie kommen. Verzeihen Sie, wenn ich gleich zur Sache komme. [GEN3_C:GENERA3] -Diaz bat mich, eine kleinere geschãftliche Transaktion zu überwachen. +Diaz bat mich, eine kleinere geschäftliche Transaktion zu überwachen. [GEN3_D:GENERA3] Wird hoffentlich besser laufen als die letzte, hah? @@ -10301,7 +10301,7 @@ Darum habe ich an Sie gedacht, mein Freund. Ich habe etwas zu Ihrem Schutz beim Parkhaus deponiert. [GEN3_G:GENERA3] -Holen Sie es ab. Und dann bewachen Sie Diaz' Mãnner bei dem Deal. +Holen Sie es ab. Und dann bewachen Sie Diaz' Männer bei dem Deal. [GEN3_H:GENERA3] Danke, Amigo. @@ -10346,7 +10346,7 @@ Tommy! Ich brauch Hilfe! Keine Sorge, ich hab alles im Griff! [GEN3_16:GENERA3] -Diaz' Mãnner werden umgemãht! +Diaz' Männer werden umgemäht! [GEN3_19:GENERA3] ~g~Haitianer! Sie greifen an! Beschütze Diaz! @@ -10373,7 +10373,7 @@ Diaz' Gesundheitszustand: ~r~Er ist mit dem Geld entwischt! Dafür macht Diaz dich kalt! [GEN3_33:GENERA3] -~r~Du sollst Diaz und seine Mãnner bewachen, nicht beschießen! +~r~Du sollst Diaz und seine Männer bewachen, nicht beschießen! [GEN3_34:GENERA3] ~r~Es gibt keinen Deal, wenn du die Kubaner erledigst! @@ -10415,7 +10415,7 @@ Tommy! Verdammt! [GEN3_50:GENERA3] -~r~Du hast Diaz' Geld verloren! Versuch das nãchste Mal, das Geld nicht zu vernichten! +~r~Du hast Diaz' Geld verloren! Versuch das nächste Mal, das Geld nicht zu vernichten! [GEN3_51:GENERA3] Noch mehr verdammte Haitianer in einem beschissenen Van! @@ -10427,10 +10427,10 @@ Steht nicht rum, ihr Idioten! Schnappt euch diesen haitianischen Mistkerl! Tommy! Ich bleibe hier und passe auf Diaz auf! [GEN3_18:GENERA3] -~g~Die Kubaner kommen. Bleib in Diaz' Nãhe. Überwache den Deal. Pass auf Diaz und Lance auf. +~g~Die Kubaner kommen. Bleib in Diaz' Nähe. Überwache den Deal. Pass auf Diaz und Lance auf. [GEN3_56:GENERA3] -~r~Diaz ist hinüber, er ist in einen Hinterhalt geraten. Pass das nãchste Mal auf ihn auf! +~r~Diaz ist hinüber, er ist in einen Hinterhalt geraten. Pass das nächste Mal auf ihn auf! [GEN3_57:GENERA3] Die Kruger ist ein Sturmgewehr, das einem erlaubt, in der subjektiven Kamera-Einstellung manuell zu zielen. @@ -10451,7 +10451,7 @@ Drücke die ~h~~k~~PED_FIREWEAPON~~w~-Taste, um das Sturmgewehr ~h~abzufeuern~w~ Drücke die ~h~~k~~PED_FIREWEAPON~~w~-Taste, um das Sturmgewehr ~h~abzufeuern~w~. [GEN3_63:GENERA3] -Auf~h~ Motorrãdern ~w~kann man nicht nur im Vorbeifahren seitlich auf Ziele schießen, man kann auch ~h~geradeaus feuern~w~. +Auf~h~ Motorrädern ~w~kann man nicht nur im Vorbeifahren seitlich auf Ziele schießen, man kann auch ~h~geradeaus feuern~w~. [GEN3_64:GENERA3] { reVC update } Um auf einem Motorrad sitzend geradeaus zu feuern, drücke die ~h~~k~~VEHICLE_FIREWEAPON~~w~-Taste. @@ -10498,7 +10498,7 @@ Schaffen Sie den Zivilisten aus dem Weg, Soldat! - Sir, zu Befehl, Sir! Zivilist im PANZER! HALTET IHN AUF! [COL4_13:GENERA4] -Dies ist ein Militãrkonvoi, machen Sie den Weg frei! +Dies ist ein Militärkonvoi, machen Sie den Weg frei! [COL4_14:GENERA4] Erledigen sie ihn, Soldat. @@ -10558,7 +10558,7 @@ Man erhebt keine Anschuldigungen gegen einen Mann wie Diaz. Ich habe nur laut na Egal. Ich habe einen Vorschlag, der lukrativ für Sie sein könnte... [COL4_07:GENERA4] -Ich habe keine Zeit für weitere Auftrãge, Cortez. +Ich habe keine Zeit für weitere Aufträge, Cortez. [COL4_08:GENERA4] Ein Mann mit solch bedrohlichen Schulden sollte doch um jede Verdienstmöglichkeit dankbar sein. Hören Sie mich wenigstens an. @@ -10567,7 +10567,7 @@ Ein Mann mit solch bedrohlichen Schulden sollte doch um jede Verdienstmöglichke Na gut... [COL410:GENERA4] -Ich habe einen Kãufer für ein 'Militãrgerãt', das durch die Stadt transportiert wird. Beschaffen Sie es! +Ich habe einen Käufer für ein 'Militärgerät', das durch die Stadt transportiert wird. Beschaffen Sie es! [COL411:GENERA4] Wenn Sie es haben, rufen Sie mich unverzüglich an... @@ -10582,7 +10582,7 @@ Was ist mit dem Kanonier? - Weiß nicht, Sir! Los, sehen Sie nach, Soldat! - Zu Befehl, Sir! [COL4_B1:GENERA4] -~g~Besorge das militãrische Fahrzeug, das durch die Stadt gefahren wird. +~g~Besorge das militärische Fahrzeug, das durch die Stadt gefahren wird. [COL4_B3:GENERA4] ~g~Liefere den Panzer in der Garage des Colonels ab, bevor er sich selbst zerstört. @@ -10611,10 +10611,10 @@ Die Franzosen wollen ihre Lenkwaffen-Chips wieder und nach dem letzten Zwischenf zieht es mich in sicherere Gefilde. [COL5A_5:GENERA5] -Wãre es nicht sicherer zu fliegen? +Wäre es nicht sicherer zu fliegen? [COL5A_6:GENERA5] -Ich wãre erledigt, bevor ich eingecheckt hãtte. Außerdem muss ich Ware außer Landes schaffen. +Ich wäre erledigt, bevor ich eingecheckt hätte. Außerdem muss ich Ware außer Landes schaffen. [COL5A_7:GENERA5] Brauchen Sie noch einen Bodyguard? @@ -10650,7 +10650,7 @@ Hören Sie auf, auf mich zu schießen! Tommy, die sollen aufhören, auf mich zu schießen! [COL5_10:GENERA5] -Ich genieße diplomatische Immunitãt. +Ich genieße diplomatische Immunität. [COL5_11:GENERA5] Nicht schießen, ich bin ein Colonel! @@ -10668,7 +10668,7 @@ Tommy, wo ich hinsehe, überall Franzosen! Wie ich es hasse! Tommy, alles in Ordnung? [COL5_16:GENERA5] -Das ist für Piaf und Gainesbourg und für euer dãmliches französisches Weißbrot! +Das ist für Piaf und Gainesbourg und für euer dämliches französisches Weißbrot! [COL5_1:GENERA5] Backbord! Backbord! @@ -10686,7 +10686,7 @@ Sie haben einen Helikopter! ~g~Beschütze den Colonel und seine Jacht um jeden Preis. [COL5_B2:GENERA5] -~g~Geh nach vorn und rãume der Jacht des Colonels den Weg frei. +~g~Geh nach vorn und räume der Jacht des Colonels den Weg frei. [COL5_B3:GENERA5] ~r~Der Colonel ist hinüber! @@ -10698,7 +10698,7 @@ Sie haben einen Helikopter! Ich werde meine Privatbarkasse zu Wasser lassen. Sie gehört Ihnen, als Ausdruck meiner Dankbarkeit. [COL5_B5:GENERA5] -~g~Schieß die Helikopter ab, gefãhrde nicht die Jacht. +~g~Schieß die Helikopter ab, gefährde nicht die Jacht. [COL5_B6:GENERA5] ~g~Du hast keine Munition mehr. Hol dir an der Treppe des Oberdecks Nachschub. @@ -10715,10 +10715,10 @@ Hallo? Hallo? Komm rein, mein Lieber, und ruh dich aus. [HAM1_C:HAIT1] -Du musst der große böse Mann sein, von dem mein Großvater erzãhlt hat. +Du musst der große böse Mann sein, von dem mein Großvater erzählt hat. [HAM1_D:HAIT1] -Er erzãhlte immer von dir, wenn er zu Besuch kam, +Er erzählte immer von dir, wenn er zu Besuch kam, [HAM1_E:HAIT1] und von den anderen, die auf dich warten. @@ -10745,25 +10745,25 @@ Aber wenn du der alten Tante Poulet hilfst, hilft sie dir vielleicht auch. Vielleicht kann sie dir danach einen kleinen Talisman schenken. [HAM1_M:HAIT1] -Ein bisschen Magie, die den Mãnnern des Gesetzes schlechte Augen macht, hmm? +Ein bisschen Magie, die den Männern des Gesetzes schlechte Augen macht, hmm? [HAM1_N:HAIT1] -Hören Sie, das ist alles sehr, ãh... Sie geben mir was? +Hören Sie, das ist alles sehr, äh... Sie geben mir was? [HAM1_O:HAIT1] Ich...ich...ich glaube, ich bin hier falsch. [HAM1_P:HAIT1] -Erweise mir ein paar Gefãlligkeiten, Tommy... +Erweise mir ein paar Gefälligkeiten, Tommy... [HAM1_Q:HAIT1] -Die Kubaner, miese, hochnãsige Narren, hmmm, +Die Kubaner, miese, hochnäsige Narren, hmmm, [HAM1_R:HAIT1] -haben meine lieben Haiti-Boys sehr geãrgert. +haben meine lieben Haiti-Boys sehr geärgert. [HAM1_S:HAIT1] -Jetzt haben sie den Polizisten erzãhlt, wo ich meine Pülverchen versteckt habe. +Jetzt haben sie den Polizisten erzählt, wo ich meine Pülverchen versteckt habe. [HAM1_T:HAIT1] Sie denken, das sind Drogen, diese Dummköpfe. @@ -10775,7 +10775,7 @@ Sei ein braver Bub, Tommy, und hole Tante Poulet die Pülverchen. Ja, ja. Sicher, sicher. [HAM1_1:HAIT1] -~g~Die Cops nãhern sich dem Zeug. Hol es, bevor sie dort sind. +~g~Die Cops nähern sich dem Zeug. Hol es, bevor sie dort sind. [HAM1_2:HAIT1] ~r~Die Cops waren schneller bei dem Zeug! @@ -10784,7 +10784,7 @@ Ja, ja. Sicher, sicher. ~g~Bring das Zeug zum Unterschlupf! [HAM1_4:HAIT1] -~g~Gut. Jetzt das nãchste! +~g~Gut. Jetzt das nächste! [HAM1_6:HAIT1] ~r~Das Zeug wurde vernichtet, du Idiot! @@ -10840,7 +10840,7 @@ Ja... Das kommt mir so bekannt vor hier. Ein Geruch aus meiner Kindheit - das muss ein Déjà-vu sein... [HAT2_6:HAIT2] -Tommy, du kannst was für mich tun, ich werd's dir erklãren. Hör gut zu, ja? +Tommy, du kannst was für mich tun, ich werd's dir erklären. Hör gut zu, ja? [HAT2_7:HAIT2] Sie sehen aus wie jemand, den... @@ -10866,7 +10866,7 @@ Um eine Bombe abzuwerfen, drück die ~h~~k~~VEHICLE_FIREWEAPON~~w~-Taste. ~h~~k~ {=================================== MISSION TABLE HAIT3 ===================================} [HAM3_A:HAIT3] -Hallo, hallo, ich, ãh, ich suche hier jemanden... +Hallo, hallo, ich, äh, ich suche hier jemanden... [HAM3_B:HAIT3] Du siehst hungrig aus, Tommy. @@ -10878,7 +10878,7 @@ Kenne ich Sie? Sei jetzt still. [HAM3_E:HAIT3] -Eine Gefãlligkeit noch, dann lasse ich dich gehen, Tommy. +Eine Gefälligkeit noch, dann lasse ich dich gehen, Tommy. [HAM3_F:HAIT3] Meine Jungs haben die Kubaner zum Kampf gefordert. @@ -10890,13 +10890,13 @@ Aber ohne Kanonen. Hmm, aber die Kubaner werden ihr blaues Wunder erleben. [HAM3_I:HAIT3] -Wenn sie in den Straßen kãmpfen, nimmst du dieses Gewehr und rãumst auf. +Wenn sie in den Straßen kämpfen, nimmst du dieses Gewehr und räumst auf. [HAM3_J:HAIT3] Keiner sieht dich, keiner hört dich. [HAM3_K:HAIT3] -Wenn du das für mich tust, Tommy, dann kommst frei aus meinen Schürzenbãndern. +Wenn du das für mich tust, Tommy, dann kommst frei aus meinen Schürzenbändern. [HAM3_1:HAIT3] ~g~Wir müssen gewinnen. Werden alle Haitianer erledigt, haben wir verloren. @@ -10914,7 +10914,7 @@ Wenn du das für mich tust, Tommy, dann kommst frei aus meinen Schürzenbãndern ~g~Es gibt Verluste unter den Haitianern! Du musst besser zielen! [HAM3_7:HAIT3] -~g~Vorsicht! Die Kubaner haben Verstãrkung mitgebracht. Schalte sie alle aus!! +~g~Vorsicht! Die Kubaner haben Verstärkung mitgebracht. Schalte sie alle aus!! [HAM3_2:HAIT3] ~r~Die Haitianer sind weg vom Fenster! @@ -10931,10 +10931,10 @@ Tommy! Tommy, wir haben uns lange nicht gesehen. Hallo, Sonny. [INTB_C:HOTEL] -Ich weiß, ich weiß. Dir kommen vor Rührung die Trãnen. +Ich weiß, ich weiß. Dir kommen vor Rührung die Tränen. [INTB_D:HOTEL] -15 Jahre ist es her - dabei kommt's mir vor, als wãr's gestern gewesen. +15 Jahre ist es her - dabei kommt's mir vor, als wär's gestern gewesen. [INTB_E:HOTEL] DU hast leicht reden. @@ -10976,7 +10976,7 @@ Und ich liefere dir die Kerle, die dahinterstecken. Das weiß ich doch. Du bist kein Idiot, Tommy, aber ich warne dich - ich bin auch keiner. [INTB_R:HOTEL] -Wenn du's nicht wãrst - ein anderer wãr lãngst fãllig! +Wenn du's nicht wärst - ein anderer wär längst fällig! [INTB_S:HOTEL] Aber uns beide verbindet eine alte Freundschaft. Ich lasse dich das regeln. @@ -10996,43 +10996,43 @@ Du hörst von mir. ~g~Parke den Eis-Wagen und drücke ~h~~k~~VEHICLE_HORN~~w~, um den Eiscreme-Jingle abzuspielen, damit deine Kunden wissen, dass du Ware zu verkaufen hast. [ICC1_3:ICECRE1] -~g~Für jede Transaktion bekommst du Geld. Aber je mehr Transaktionen du tãtigst, desto stãrker wird die Polizei auf dich aufmerksam. +~g~Für jede Transaktion bekommst du Geld. Aber je mehr Transaktionen du tätigst, desto stärker wird die Polizei auf dich aufmerksam. [ICC1_4:ICECRE1] ~g~In dieser Gegend sind keine Kunden. Versuche es woanders. [ICC1_5:ICECRE1] -Getãtigte Deals: +Getätigte Deals: [ICC1_6:ICECRE1] ~g~Nimm den Mr. Whopee, um in Vice City Cherry Popper-Produkte zu vertreiben. [ICC1_7:ICECRE1] -~g~Für jede Transaktion bekommst du Geld. Aber je mehr Transaktionen du tãtigst, desto stãrker wird die Polizei auf dich aufmerksam. +~g~Für jede Transaktion bekommst du Geld. Aber je mehr Transaktionen du tätigst, desto stärker wird die Polizei auf dich aufmerksam. [ICC1_8:ICECRE1] -~g~Um eine Transaktion zu tãtigen, ~h~parke deinen Wagen ~g~und drücke die ~h~~k~~VEHICLE_HORN~~g~, um den Eiscreme-Jingle abzuspielen, damit deine Kunden wissen, dass du Ware zu verkaufen hast. +~g~Um eine Transaktion zu tätigen, ~h~parke deinen Wagen ~g~und drücke die ~h~~k~~VEHICLE_HORN~~g~, um den Eiscreme-Jingle abzuspielen, damit deine Kunden wissen, dass du Ware zu verkaufen hast. [ICC1_9:ICECRE1] -~g~Andere Gangs werden es nicht gern sehen, dass du in ihrem Revier Geschãfte machst, du musst also mit Feindseligkeiten rechnen. +~g~Andere Gangs werden es nicht gern sehen, dass du in ihrem Revier Geschäfte machst, du musst also mit Feindseligkeiten rechnen. [ICC1_10:ICECRE1] -~g~Du hast ~1~ Deals getãtigt! +~g~Du hast ~1~ Deals getätigt! [ICC1_11:ICECRE1] -~g~Du hast ~1~ Deal getãtigt. +~g~Du hast ~1~ Deal getätigt. [ICC1_12:ICECRE1] OBJEKT ERWORBEN! [ICC1_13:ICECRE1] -~r~Du hast keine Deals getãtigt! +~r~Du hast keine Deals getätigt! [ICC1_14:ICECRE1] EISCREME-MISSIONEN ERFÜLLT [ICC1_15:ICECRE1] -~g~Die Eiscremefabrik generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmãßig ab. +~g~Die Eiscremefabrik generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmäßig ab. [ICC1_16:ICECRE1] ~g~Nimm den Mr. Whoopee, um in Vice City Cherry Popper-Produkte zu vertreiben. @@ -11041,7 +11041,7 @@ EISCREME-MISSIONEN ERFÜLLT EISCREMEFABRIK-MISSIONEN ERFÜLLT [ICE_AT2:ICECRE1] -~g~Die Cherry Popper-Fabrik generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmãßig ab. +~g~Die Cherry Popper-Fabrik generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmäßig ab. [ICC1_17:ICECRE1] Stoff-Auslieferungs-Mission beendet @@ -11050,7 +11050,7 @@ Stoff-Auslieferungs-Mission beendet Eiscremeverkauf insgesamt: $~1~ [ICC1_19:ICECRE1] -Insgesamt getãtigte Deals: ~1~ +Insgesamt getätigte Deals: ~1~ {=================================== MISSION TABLE ICECUT ===================================} @@ -11058,7 +11058,7 @@ Insgesamt getãtigte Deals: ~1~ Sie sind schmutzige, verrotzte, verlauste, eklige, sabbernde kleine... [ICC1_I:ICECUT] -Ein Baby... ein widerwãrtiges, grãßliches, ekelhaftes kleines Gör! +Ein Baby... ein widerwärtiges, gräßliches, ekelhaftes kleines Gör! [ICC1_J:ICECUT] Mammi liebt dich nicht. Du kleines Stück Scheiße! @@ -11103,10 +11103,10 @@ Sie stellen doch Softeis her, oder? Das essen doch nur Kinder. Sind Sie komplett irre? [ICC1_R:ICECUT] -Erklãren Sie mir das mal - warum Kinder glücklich machen, wenn Sie sie hassen? +Erklären Sie mir das mal - warum Kinder glücklich machen, wenn Sie sie hassen? [ICC1_S:ICECUT] -Oh, du dãmliches, verrotztes, verlaustes- +Oh, du dämliches, verrotztes, verlaustes- [ICC1_T:ICECUT] Schluss jetzt! @@ -11138,7 +11138,7 @@ OBJEKT ERWORBEN! Tommy Vercetti...Hah! Shit. [INT1_B:INTRO] -Hãtte nicht gedacht, dass der noch mal rauskommt. +Hätte nicht gedacht, dass der noch mal rauskommt. [INT1_C:INTRO] Er hat den Kopf eingezogen. War fast vergessen. @@ -11150,7 +11150,7 @@ Aber bald wird man sich an ihn erinnern. Wenn man ihn wieder durch ihre Viertel tigern sieht. [INT1_F:INTRO] -Wird schlecht fürs Geschãft sein. +Wird schlecht fürs Geschäft sein. [INT1_G:INTRO] Tja, was sollen wir machen, Sonny? @@ -11168,7 +11168,7 @@ In Vice City liegt zurzeit das Geld auf der Straße. Die Kolumbianer, die Mexikaner, [INT1_L:INTRO] -ja, sogar die kubanischen Flüchtlinge machen alle glãnzende Geschãfte. +ja, sogar die kubanischen Flüchtlinge machen alle glänzende Geschäfte. [INT1_M:INTRO] Aber das geht nur mit Drogen, Sonny. @@ -11177,10 +11177,10 @@ Aber das geht nur mit Drogen, Sonny. Aber keine der Familien rührt dieses Zeug an! [INT1_O:INTRO] -Die Zeiten ãndern sich. +Die Zeiten ändern sich. [INT1_P:INTRO] -Die Familien können nicht wegsehen, wãhrend unsere Feinde groß abkassieren. +Die Familien können nicht wegsehen, während unsere Feinde groß abkassieren. [INT1_Q:INTRO] Also schicken wir jemanden für die Drecksarbeit da runter @@ -11219,16 +11219,16 @@ und schauen mal bei ihm rein, klar? Mal sehen, wie er sich macht. [INT2_A:INTRO] -Hey, hey, Jungs! Ich bin, ãh, Ken Rosenberg. Ha, ha, sehr gut, hey! +Hey, hey, Jungs! Ich bin, äh, Ken Rosenberg. Ha, ha, sehr gut, hey! [INT2_B:INTRO] -Tja, ãh, ich soll euch zu dem Trefffen fahren, okay? +Tja, äh, ich soll euch zu dem Trefffen fahren, okay? [INT2_C:INTRO] Ich hab mit den Lieferanten geredet, und die würden, [INT2_D:INTRO] -liebend gern mit uns ins Geschãft kommen. Und, ãh, +liebend gern mit uns ins Geschäft kommen. Und, äh, [INT2_E:INTRO] wenn alles gut geht, dann dürfte da @@ -11243,7 +11243,7 @@ gut... Okay. Es sind zwei Brüder, ok? [INT2_I:INTRO] -Der eine schmeißt, ãh, den Laden, +Der eine schmeißt, äh, den Laden, [INT2_J:INTRO] der andere macht die Flüge. @@ -11276,10 +11276,10 @@ Ich pass auf den Wagen auf. Ok, das sind sie, da im Helikopter. [INT3_B:INTRO] -Ok, das ganze lãuft so ab: +Ok, das ganze läuft so ab: [INT3_C:INTRO] -Die wollen eine saubere Übergabe auf offenem Gelãnde. +Die wollen eine saubere Übergabe auf offenem Gelände. [INT3_D:INTRO] Alles klar? Ok, dann wollen wir mal. @@ -11288,7 +11288,7 @@ Alles klar? Ok, dann wollen wir mal. Ok, ganz ruhig jetzt. [INT3_F:INTRO] -Ich bin hier. Der Wagen lãuft, Baby! +Ich bin hier. Der Wagen läuft, Baby! [INT3_G:INTRO] Hast du's? @@ -11413,7 +11413,7 @@ Los, wir verschwinden von hier. Dank dir ist mein ganzer schöner Plan im Eimer. Das hast du sauber vermasselt, Lance. [RESC_5:KENT1] -Er hat meinen Bruder auf dem Gewissen. Soll ich ihm den Rasen mãhen? +Er hat meinen Bruder auf dem Gewissen. Soll ich ihm den Rasen mähen? [RESC_6:KENT1] Wir müssen diesen Diaz erledigen bevor er uns erledigt. @@ -11457,7 +11457,7 @@ BENÖTIGTE ZEIT: ~b~ZEIT: ~1~:0~1~ [GETBIKE:KICKSTT] -~g~Du hast ~1~ Sekunden, um zu einer Gelãndemaschine zurückzukehren, bevor die Mission endet. +~g~Du hast ~1~ Sekunden, um zu einer Geländemaschine zurückzukehren, bevor die Mission endet. [KICK1_1:KICKSTT] ~g~Absolviere den Kurs so schnell wie möglich. @@ -11507,7 +11507,7 @@ Gute Idee. SEHR gute Idee. Lass mich nachdenken, lass mich nachdenken. OH! Da gibt es diesen Colonel a.D., Colonel Juan Garcia Cortez. [LAW1_J:LAWYER1] -Der half mir, diesen Deal einzufãdeln, +Der half mir, diesen Deal einzufädeln, [LAW1_K:LAWYER1] und zwar ohne Vice Citys Gangster-Establishment. Ok? @@ -11549,10 +11549,10 @@ Guten Abend. Ich höre, Sie sind anstelle von Mr. Rosenberg hier. [LAWP_3:LAWYER1] -Ich hoffe, gewisse Vorfãlle haben seiner Gesundheit nicht geschadet, +Ich hoffe, gewisse Vorfälle haben seiner Gesundheit nicht geschadet, [LAWP_4:LAWYER1] -oder seiner Psyche, Mr...ãh? +oder seiner Psyche, Mr...äh? [LAWP_5:LAWYER1] Vercetti. Er leidet ein wenig an...Platzangst. @@ -11573,7 +11573,7 @@ Natürlich stelle ich selbst Nachforschungen an, aber bei solch heiklen Sachen dauert das ein wenig. [LAWP_11:LAWYER1] -Wir sprechen uns vielleicht spãter. Hm? +Wir sprechen uns vielleicht später. Hm? [LAWP_12:LAWYER1] Inzwischen möchte ich Ihnen meine Tochter vorstellen, @@ -11582,7 +11582,7 @@ Inzwischen möchte ich Ihnen meine Tochter vorstellen, Mercedes! [LAWP_14:LAWYER1] -Könntest du dich um unseren Gast kümmern, wãhrend ich mich um andere Dinge +Könntest du dich um unseren Gast kümmern, während ich mich um andere Dinge [LAWP_15:LAWYER1] Natürlich, Daddy. @@ -11597,7 +11597,7 @@ Mercedes!? Leb du mal mit so 'nem Namen. [LAWP_19:LAWYER1] -Na gut, ich zeig dir mal einige unserer bekannteren Gãste... +Na gut, ich zeig dir mal einige unserer bekannteren Gäste... [LAWP_20:LAWYER1] Das ist unser Abgeordneter Alex Shrub mit dem aufgehenden Sternchen Candy Suxx.. @@ -11627,7 +11627,7 @@ Tja, ich bin an einem super Grundstück dran. Und der Schleimbold dort ist Jezz Torrent, [LAWP_29:LAWYER1] -Der Sãnger von 'Love Fist'. +Der Sänger von 'Love Fist'. [LAWP_30:LAWYER1] Wisst ihr, wie sie in Thailand Pingpong spielen? @@ -11636,7 +11636,7 @@ Wisst ihr, wie sie in Thailand Pingpong spielen? Ich verrat's euch, [LAWP_32:LAWYER1] -man spielt ohne Schlãger, wenn ihr wisst, was ich meine! +man spielt ohne Schläger, wenn ihr wisst, was ich meine! [LAWP_33:LAWYER1] Impotent. @@ -11672,13 +11672,13 @@ Colonel! Ihre Party ist wie immer fantastisch, hahahaha! [LAWP_44:LAWYER1] -Ich entschuldige mich für die Verspãtung. +Ich entschuldige mich für die Verspätung. [LAWP_45:LAWYER1] Ah, nicht doch, Amigo. Wie geht es ihnen? [LAWP_46:LAWYER1] -Unsere Geschãfte laufen schwierig - die Barbaren stehen vor den Toren. +Unsere Geschäfte laufen schwierig - die Barbaren stehen vor den Toren. [LAWP_47:LAWYER1] Eine Zeit, Freunde zu belohnen und Feinde auszuschalten, Amigo. @@ -11723,7 +11723,7 @@ Darf ich meine Hand in deinen Schoß legen? Vielleicht... [LAW1_9:LAWYER1] -Es ist schwer, einen so reichen, mãchtigen Vater zu haben. Los. +Es ist schwer, einen so reichen, mächtigen Vater zu haben. Los. [LAW1_10:LAWYER1] Wir sehen uns, mein Hübscher! @@ -11752,7 +11752,7 @@ Ja, Baby, hab ich mir gerade bei Howlin' Pete's besorgt. {=================================== MISSION TABLE LAWYER2 ===================================} [LAW2_A:LAWYER2] -Ah! Tja, ich hoffe, du amüsierst dich gut, wãhrend ich hier vor Angst halb umkomme. Was hast du rausgefunden? +Ah! Tja, ich hoffe, du amüsierst dich gut, während ich hier vor Angst halb umkomme. Was hast du rausgefunden? [LAW2_B:LAWYER2] Dass es in dieser Stadt mehr Gangster gibt als im Knast. Wir brauchen einen Tipp von der Straße... @@ -11764,7 +11764,7 @@ Ok, lass mich nachdenken, lass mich nachdenken - - AH! Ich hab's! [LAW2_E:LAWYER2] -Ok, es gibt da so 'n Englãnder, so 'n Idiot aus der Musikbranche. +Ok, es gibt da so 'n Engländer, so 'n Idiot aus der Musikbranche. [LAW2_F:LAWYER2] Er nennt sich Kent Paul. @@ -11791,7 +11791,7 @@ Nach einer wie dir suche ich schon seit Ewigkeiten. Kent Paul. Ja, ich bin hier die Nummer Eins. [LAW2B_D:LAWYER2] -Ich suche einen Englãnder... +Ich suche einen Engländer... [LAW2B_E:LAWYER2] Ich ziehe hier die Strippen, verstehst du? @@ -11803,7 +11803,7 @@ Ich lade dich ein. Ich kann dir alles besorgen, Süße. Mach dir keine Gedanken. [LAW2B_H:LAWYER2] -Verzieh dich, Schãtzchen. +Verzieh dich, Schätzchen. [LAW2B_I:LAWYER2] Oi oi oi oi! @@ -11860,7 +11860,7 @@ Willst du auch ein paar? Hey, ruhig. Ich will das gleiche wie du, Bruder. [LAW2C_D:LAWYER2] -Ach ja? Und das wãre? +Ach ja? Und das wäre? [LAW2C_E:LAWYER2] Deine Kohle und den Stoff meines toten Bruders. Aber du hast gerade unsere Spur erledigt. @@ -11911,7 +11911,7 @@ Ich seh zu, was ich rausfinde. Ich behalte dich im Auge, Tommy. ~g~Nimm sein Handy. [LAW2_12:LAWYER2] -Du hast jetzt ein Handy und kannst Telefongesprãche entgegennehmen! +Du hast jetzt ein Handy und kannst Telefongespräche entgegennehmen! [LAW2_13:LAWYER2] ~g~Du hast Lance zurückgelassen! Geh ihn holen! @@ -11938,7 +11938,7 @@ Drücke die~h~ ~k~~PED_FIREWEAPON~~w~, um den Küchenchef anzugreifen. Stell dich in die ~q~rosa Markierung~w~, um zu sehen, was im Angebot ist. [LAW3_12:LAWYER2] -Du kannst Waffen auswãhlen, indem du die ~h~linke~w~ oder ~h~rechte~w~ ~h~Richtungstaste drückst. +Du kannst Waffen auswählen, indem du die ~h~linke~w~ oder ~h~rechte~w~ ~h~Richtungstaste drückst. [LAW3_13:LAWYER2] Wenn du genug Geld hast, kannst du Waffen durch Drücken der ~h~~k~~PED_SPRINT~~w~ kaufen. @@ -11959,7 +11959,7 @@ Nur die Ruhe. Eins musst du wissen: In dieser Stadt darfst du nie unbewaffnet sein. [LAW2_17:LAWYER2] -Komm, der nãchste Waffenladen ist ein paar Blocks von hier. +Komm, der nächste Waffenladen ist ein paar Blocks von hier. [LAW2_18:LAWYER2] Tommy, jeder Mann braucht ab und zu mal ein bisschen Entspannung. @@ -12012,10 +12012,10 @@ Nein, nein, nein! Das hab ich schon versucht. Das ist nicht gelaufen, ZWING sie dazu, umzudenken. [LAW3_1:LAWYER3] -Georgio lãsst grüßen. +Georgio lässt grüßen. [LAW3_2:LAWYER3] -Denk dran, 'Schuldig' ist ein hãssliches Wort. +Denk dran, 'Schuldig' ist ein hässliches Wort. [LAW3_3:LAWYER3] 'Unschuldig', bis ich was anderes sage. @@ -12036,7 +12036,7 @@ Nicht schuldig. Verstanden...gut. ~g~Schrotte das Auto des Geschworenen, damit er aussteigt! [HELP40:LAWYER3] -Du kannst Autos mit dem Hammer oder einer ãhnlichen Waffe zertrümmern. +Du kannst Autos mit dem Hammer oder einer ähnlichen Waffe zertrümmern. [HELP41:LAWYER3] Oder du kannst sie mit einem Fahrzeug rammen. @@ -12057,7 +12057,7 @@ Unglaublich! Ok! Ok! Ich hab kapiert! [LAW3_24:LAWYER3] -~g~Dieser Hammer wãre nützlich. +~g~Dieser Hammer wäre nützlich. [LAW3_7:LAWYER3] ~g~Schüchtere die 2 Geschworenen ein, aber erledige sie NICHT! @@ -12066,7 +12066,7 @@ Ok! Ok! Ich hab kapiert! Folge dem ~h~Hammer-Symbol~w~ auf dem Radar, wenn du beim Eisenwarenladen Nahkampfwaffen kaufen willst. [LAW3_16:LAWYER3] -Dãmlicher Florida-Idiot! +Dämlicher Florida-Idiot! [LAW3_17:LAWYER3] Aus dem Weg! @@ -12074,7 +12074,7 @@ Aus dem Weg! {=================================== MISSION TABLE LAWYER4 ===================================} [LAW4_A:LAWYER4] -Avery, es versteht sich von selbst... Tommy! Tommy! Fortschritte gemacht? Nein, erzãhl's mir spãter. +Avery, es versteht sich von selbst... Tommy! Tommy! Fortschritte gemacht? Nein, erzähl's mir später. [LAW4_B:LAWYER4] Tommy, das ist Avery Carrington. Kennt ihr euch nicht von der Party? @@ -12101,7 +12101,7 @@ Ich hab Angst. Aber wenn ich schon Ende der Woche sterbe, möchte ich wenigstens Jetzt beruhigt euch, ihr beiden. [LAW4_J:LAWYER4] -Junge, wenn du mir hilfst, sorge ich dafür, dass jeder, der dir Ãrger macht, unter die Erde kommt. +Junge, wenn du mir hilfst, sorge ich dafür, dass jeder, der dir Ärger macht, unter die Erde kommt. [LAW4_K:LAWYER4] Ok, was kann ich für Sie tun? @@ -12110,13 +12110,13 @@ Ok, was kann ich für Sie tun? Eine Spedition hat ihr Lager auf einem Top-Grundstück - und will nicht verkaufen. [LAW4_M:LAWYER4] -Die sitzen da drauf wie die Ratten in ihren Löchern. Also müssen wir dieses Ungeziefer ausrãuchern. +Die sitzen da drauf wie die Ratten in ihren Löchern. Also müssen wir dieses Ungeziefer ausräuchern. [LAW4_N:LAWYER4] Fahr hin und stich ein wenig ins Wespennest. [LAW4_O:LAWYER4] -Das wird die Security beschãftigen. Dann schleichst du dich rein und machst den Laden platt. +Das wird die Security beschäftigen. Dann schleichst du dich rein und machst den Laden platt. [LAW4_P:LAWYER4] Und du könntest dich bei Rafael's neu einkleiden. Kann 'ne Weile dauern, aber mach das ruhig mal. @@ -12125,10 +12125,10 @@ Und du könntest dich bei Rafael's neu einkleiden. Kann 'ne Weile dauern, aber m Das gibt ein Fest. [LAW4_R:LAWYER4] -Wenn alles lãuft wie geplant, komm mal zu mir ins Büro... +Wenn alles läuft wie geplant, komm mal zu mir ins Büro... [LAW4_1:LAWYER4] -Bitte, geht auseinander! Die Geschãftsleitung wird sich aller Probleme annehmen! +Bitte, geht auseinander! Die Geschäftsleitung wird sich aller Probleme annehmen! [LAW4_2:LAWYER4] Bitte, geht auseinander! Geht wieder nach Hause! @@ -12146,13 +12146,13 @@ Die Knüppel raus, Jungs! Diesen Kommis zeigten wir's! Fange mit mind. 4 Arbeitern Streit an, um einen Aufruhr zu starten. [LAW4_14:LAWYER4] -~g~Zerstöre die Transporter auf dem Gelãnde! +~g~Zerstöre die Transporter auf dem Gelände! [HELP38:LAWYER4] -Wenn du jemanden ausschaltest, der eine Waffe trãgt, lãsst er sie fallen. +Wenn du jemanden ausschaltest, der eine Waffe trägt, lässt er sie fallen. [HELP39:LAWYER4] -Du kannst explosive Fãsser anvisieren und abschießen, aber bleib auf Distanz. +Du kannst explosive Fässer anvisieren und abschießen, aber bleib auf Distanz. {=================================== MISSION TABLE MIAMI_1 ===================================} @@ -12160,7 +12160,7 @@ Du kannst explosive Fãsser anvisieren und abschießen, aber bleib auf Distanz. ~g~Du hast ~1~ Sekunden, um ~y~24~g~ Checkpoints abzufahren. ~g~Die ~y~REIHENFOLGE IST BELIEBIG. [T4X4_1B:MIAMI_1] -~y~PASSIERE~g~ den ersten Checkpoint, dann lãuft die ~r~STOPPUHR. +~y~PASSIERE~g~ den ersten Checkpoint, dann läuft die ~r~STOPPUHR. [T4X4_1C:MIAMI_1] ~1~ von 24! @@ -12195,7 +12195,7 @@ $~1~ SIEGER!! [BLOD_01:MM] -Fahr durch die Checkpoints, um deine Gesamtzeit zu verlãngern. +Fahr durch die Checkpoints, um deine Gesamtzeit zu verlängern. [BLOD_02:MM] Wenn die Gesamtzeit abgelaufen ist, hast du versagt. @@ -12206,13 +12206,13 @@ Um zu gewinnen, muss deine Gesamtzeit die Zielzeit überschreiten! {=================================== MISSION TABLE OVALRIG ===================================} [HOTR_01:OVALRIG] -~g~Das Rennen geht über 12 Runden. Nur die ersten drei Plãtze qualifizeren für einen Gewinn. +~g~Das Rennen geht über 12 Runden. Nur die ersten drei Plätze qualifizeren für einen Gewinn. [HOTR_02:OVALRIG] ~g~Wird dein Auto zerstört, wirst du disqualifiziert. [HOTR_03:OVALRIG] -~g~Wird dein Auto beschãdigt, kannst du es an der Box reparieren lassen. +~g~Wird dein Auto beschädigt, kannst du es an der Box reparieren lassen. [HOTR_04:OVALRIG] ~g~Da geht es aus dem Stadion raus. @@ -12352,19 +12352,19 @@ Tust mir einen großen Gefallen damit. Und dann mach ihn fertig. [PHI1_01:PHIL1] -~g~Ramme die Waffen von der Ladeflãche des Waffenschiebers. +~g~Ramme die Waffen von der Ladefläche des Waffenschiebers. [PHI1_02:PHIL1] -~g~Der Waffenhãndler hat die Ladung verloren. Schlag die Kiste kaputt und nimm die Waffe. +~g~Der Waffenhändler hat die Ladung verloren. Schlag die Kiste kaputt und nimm die Waffe. [PHI1_03:PHIL1] -~g~Sie haben anscheinend Verstãrkung gerufen. +~g~Sie haben anscheinend Verstärkung gerufen. [PHI1_04:PHIL1] ~g~Jetzt erledige die restlichen Waffenschieber. [PHI1_06:PHIL1] -Pass doch auf, wo du hinfãhrst! +Pass doch auf, wo du hinfährst! [PHI1_07:PHIL1] Hey! @@ -12373,7 +12373,7 @@ Hey! Huuuuhuuu! [PHIL1_D:PHIL1] -Komm nie mit 'ner offenen Flamme in die Nãhe von Phil Cassidys TNT-Whiskey! +Komm nie mit 'ner offenen Flamme in die Nähe von Phil Cassidys TNT-Whiskey! {=================================== MISSION TABLE PHIL2 ===================================} @@ -12393,7 +12393,7 @@ Das Zeug riecht ja wie Terpentin. Mir brennen schon die Augen. Lass stecken, Tommy. [PHIL2_F:PHIL2] -Komm hier rüber, ich will dir nãmlich was zeigen. +Komm hier rüber, ich will dir nämlich was zeigen. [PHIL2_G:PHIL2] Wahnsinn! Das rieche ich ja schon von hier. Mir ist schon ganz schwindlig. @@ -12420,13 +12420,13 @@ Oh, verflucht! Nicht ins Krankenhaus, Mann! Zu viele Cops und Vietcong! [PHI2_06:PHIL2] -Ich kenn 'nen Ex-Army-Arzt, der schuldet mir einen Gefallen und 'nen Rasenmãher. +Ich kenn 'nen Ex-Army-Arzt, der schuldet mir einen Gefallen und 'nen Rasenmäher. [PHI2_07:PHIL2] Er hat 'ne Praxis unten in Little Havana. Uh, guck mal, ein Riesenfisch. [PHI2_08:PHIL2] -Achtung! Da in den Bãumen - Vietcong! +Achtung! Da in den Bäumen - Vietcong! [PHI2_09:PHIL2] Spinn ich, oder ist die Straße aus Gummi? @@ -12461,7 +12461,7 @@ PHIL-MISSIONEN ERFÜLLT {=================================== MISSION TABLE PIZZA ===================================} [PIZ1_01:PIZZA] -~g~Liefere diese Pizzas aus. Du musst den Kunden die Pizzas zuwerfen, wãhrend du an ihnen vorbeifãhrst. +~g~Liefere diese Pizzas aus. Du musst den Kunden die Pizzas zuwerfen, während du an ihnen vorbeifährst. [PIZ1_02:PIZZA] ~g~Du hast alle Pizzas zugestellt. Fahr zurück und hole noch mehr. @@ -12548,7 +12548,7 @@ Du wirst nie befördert, wenn du diesmal nicht schneller machst. ~r~Ist dir die Pizza zu heiß? [PIZ1_33:PIZZA] -~g~Kehre zum Restaurant zurück, um weitere Auftrãge zu bekommen. +~g~Kehre zum Restaurant zurück, um weitere Aufträge zu bekommen. [PIZ1_34:PIZZA] ~g~Pizza geliefert, hier ist dein Geld. @@ -12559,7 +12559,7 @@ Pizza-Mission abgeschlossen. Deine max. Gesundheit erhöht sich auf 150 {=================================== MISSION TABLE PORN1 ===================================} [POR1_15:PORN1] -Hey, Tommy, kommst du auf eine Aufwãrmrunde mit rein!? +Hey, Tommy, kommst du auf eine Aufwärmrunde mit rein!? [POR1_14:PORN1] Du bist engagiert! @@ -12610,19 +12610,19 @@ Wir krempeln den Laden hier um. Ich mache dich reich. [POR1_P:PORN1] -Ãh, du...du bist Tommy Vercetti? Aber ich dachte, du wãrst... +Äh, du...du bist Tommy Vercetti? Aber ich dachte, du wärst... [POR1_Q:PORN1] Ganz recht. [POR1_R:PORN1] -Wir ãndern hier ein paar Dinge und dann machen wir richtig Kohle. +Wir ändern hier ein paar Dinge und dann machen wir richtig Kohle. [POR1_S:PORN1] Hast du dir schon mal überlegt... [POR1_T:PORN1] -Aber zuerst brauchen wir mal ein paar hübsche Mãdels hier. +Aber zuerst brauchen wir mal ein paar hübsche Mädels hier. [POR1_U:PORN1] Ja, Girls sind ok, aber du...wow! @@ -12640,7 +12640,7 @@ Klar! Aber da musst du mit meinem Agenten reden. Was zum Teufel soll das? [POR1_07:PORN1] -Du hãttest heute zu Hause bleiben sollen! +Du hättest heute zu Hause bleiben sollen! [POR1_7B:PORN1] Was sagt man zu so 'nem Arschloch? @@ -12676,13 +12676,13 @@ Wo willst du hin? Tommy, wann sehen wir uns mal ganz allein, nur du und ich? [POR1_01:PORN1] -~g~Candy Suxxx wãre perfekt für die Hauptrolle! +~g~Candy Suxxx wäre perfekt für die Hauptrolle! [POR1_12:PORN1] ~g~Nimm Candy mit zu deinem Treffen mit Mercedes. [POR1_16:PORN1] -Vielleicht spãter, Schãtzchen... +Vielleicht später, Schätzchen... [POR1_24:PORN1] ~g~Geh zurück und hole Candy. @@ -12691,7 +12691,7 @@ Vielleicht spãter, Schãtzchen... ~g~Du hast Candy vergessen. Geh sie holen. [POR1_23:PORN1] -~g~Candy wird sich um das Geschãft in ~h~Downtown~g~ kümmern. +~g~Candy wird sich um das Geschäft in ~h~Downtown~g~ kümmern. [POR1_26:PORN1] ~g~Da ist Candy. Sie scheint wieder mit dem Kongressabgeordneten Shrub zusammen gewesen zu sein. @@ -12709,7 +12709,7 @@ Das nennst du fahren? Danach kann ich keinen Porno mehr machen! [POR1_31:PORN1] -Was ist los? Willst du mich umbringen? Ich dachte, ich wãre der Star! +Was ist los? Willst du mich umbringen? Ich dachte, ich wäre der Star! {=================================== MISSION TABLE PORN2 ===================================} @@ -12717,7 +12717,7 @@ Was ist los? Willst du mich umbringen? Ich dachte, ich wãre der Star! Was macht die Filmerei, Steve? [POR2_B:PORN2] -Tja, Candy ist ein Naturtalent, und die Neue ist unersãttlich! +Tja, Candy ist ein Naturtalent, und die Neue ist unersättlich! [POR2_C:PORN2] Die hatte schon vor der ersten Probe das halbe Team durch. @@ -12738,7 +12738,7 @@ Was habe ich über den Riesenhai gesagt? Ich sagte, 'KEIN RIESENHAI', ok? [POR2_I:PORN2] -Halt die Kameras auf die Mãdels gerichtet! +Halt die Kameras auf die Mädels gerichtet! [POR2_J:PORN2] Ok, ok. Hey, Tommy, probieren kann ich's ja mal, oder? @@ -12750,7 +12750,7 @@ Habt ihr die Flyer drucken lassen? Ja, aber man wird uns die Dinger nicht verteilen lassen. Ich meine, [POR2_M:PORN2] -die sind einfach zu, ãh, zu deutlich. +die sind einfach zu, äh, zu deutlich. [POR2_N:PORN2] Mach dir darüber keine Gedanken. @@ -12759,7 +12759,7 @@ Mach dir darüber keine Gedanken. Ich hab da so meine Ideen, wie wir die verteilen. [POR2_P:PORN2] -Ok. Hey, Candy, ãh, in meinen Wohnwagen. +Ok. Hey, Candy, äh, in meinen Wohnwagen. [POR2_01:PORN2] ~g~Hinter den Studios steht ein altes Wasserflugzeug, das mal als Requisite für einen Indy-Film diente. @@ -12839,7 +12839,7 @@ Oh ja, oh ja, oh ja! Ja, ja, ja, JA, Oooooooh! Bitte sag, dass du das hast. [POR3_R:PORN3] -Gehörte das zum, ãh... oder war das die Antwort für... +Gehörte das zum, äh... oder war das die Antwort für... [POR3_S:PORN3] Hey, ich kann das nie unterscheiden. Jedenfalls... @@ -12955,7 +12955,7 @@ diesem Rumgenudle tobt unvermindert. Und bevor du fragst: Ja, alle vier Videos werden veröffentlicht, wenn... [POR4_J:PORN4] -Schãtzchen, kannst du BITTE die Anaconda im Bild halten, +Schätzchen, kannst du BITTE die Anaconda im Bild halten, [POR4_K:PORN4] die kostet pro Stunde mehr als du! @@ -12979,7 +12979,7 @@ Stars, Limos, riesige Suchscheinwerfer am Nachthimmel... Suchscheinwerfer? Ich hab eine Idee... [POR4_R:PORN4] -....ja, ja, ja. Die heißen Mãdels mit ihren Paillettenkleidern und die Limos, oh, Premieren. +....ja, ja, ja. Die heißen Mädels mit ihren Paillettenkleidern und die Limos, oh, Premieren. [POR4_S:PORN4] O ja, Ma'am, natürlich, Ma'am, @@ -12988,31 +12988,31 @@ O ja, Ma'am, natürlich, Ma'am, Und die Presse und die Lichter-Flut... [POR4_01:PORN4] -~g~Begib dich nach ~y~Downtown~g~und richte den Scheinwerfer auf dem Gebãude aus. +~g~Begib dich nach ~y~Downtown~g~und richte den Scheinwerfer auf dem Gebäude aus. [POR4_02:PORN4] -~g~Du brauchst ein schnelles Bike, um von Dach zu Dach zu springen. Der Wachmann fãhrt immer mit einer ~y~PCJ 600~g~zur Arbeit... +~g~Du brauchst ein schnelles Bike, um von Dach zu Dach zu springen. Der Wachmann fährt immer mit einer ~y~PCJ 600~g~zur Arbeit... [POR4_03:PORN4] -~g~Du wirst auf die Gebãudedãcher müssen. In eines der oberen Büros sollte ein Lift führen... +~g~Du wirst auf die Gebäudedächer müssen. In eines der oberen Büros sollte ein Lift führen... [POR4_06:PORN4] -~g~Kehre in das tiefer gelegene Büro zurück, wenn du noch mal auf die Dãcher musst. +~g~Kehre in das tiefer gelegene Büro zurück, wenn du noch mal auf die Dächer musst. [POR4_07:PORN4] -~g~Du brauchst ein Motorrad, um von Gebãude zu Gebãude zu springen. +~g~Du brauchst ein Motorrad, um von Gebäude zu Gebäude zu springen. [POR4_08:PORN4] ~g~Brich durch das Fenster, um zu starten. Du hast bis 07:00 Zeit. Dann wird es zu hell, um ungesehen hinaufzukommen. [POR4_09:PORN4] -~g~Die Pfeile zeigen dir, zu welchem Gebãude du als nãchstes springen musst. +~g~Die Pfeile zeigen dir, zu welchem Gebäude du als nächstes springen musst. [POR4_10:PORN4] ~r~Es ist zu hell, um ungesehen dort hinaufzukommen. [POR4_11:PORN4] -Kehre zur Leiter zurück, wenn du noch mal auf die Dãcher musst. +Kehre zur Leiter zurück, wenn du noch mal auf die Dächer musst. [POR4_05:PORN4] ~g~Diese Treppe führt zu einem tiefer gelegenen Büro. @@ -13021,12 +13021,12 @@ Kehre zur Leiter zurück, wenn du noch mal auf die Dãcher musst. FILMSTUDIO-MISSIONEN ERFÜLLT [POR_AS2:PORN4] -~g~Inter Global Films generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmãßig ab. +~g~Inter Global Films generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmäßig ab. {=================================== MISSION TABLE PROT1 ===================================} [PRO1_A:PROT1] -Oh, wir müssen diesen Laden umbauen. Das muss ãlter aussehen. +Oh, wir müssen diesen Laden umbauen. Das muss älter aussehen. [PRO1_B:PROT1] Ich kann diesen Look nicht ab, Tommy. Was meinst du, sollen wir eine Bar einbauen..? @@ -13044,7 +13044,7 @@ Wir müssen langsam Gebiete einnehmen. Vice City soll merken, dass wir die neuen Bosse sind, versteht ihr? [PRO1_H:PROT1] -Jetzt beruhigt euch mal kurz. Allmãhlich kapiere ich schon, wie das ganze hier lãuft. +Jetzt beruhigt euch mal kurz. Allmählich kapiere ich schon, wie das ganze hier läuft. [PRO1_I:PROT1] Was du brauchst, ist eine legale Fassade, Tommy, Immobilien. Hat mir nicht geschadet. @@ -13053,7 +13053,7 @@ Was du brauchst, ist eine legale Fassade, Tommy, Immobilien. Hat mir nicht gesch Wir müssen die Muskeln spielen lassen, sonst war die ganze harte Arbeit umsonst. [PRO1_K:PROT1] -Die Geschãftsleute hier wissen, dass Diaz weg ist und weigern sich, Schutzgeld zu zahlen. +Die Geschäftsleute hier wissen, dass Diaz weg ist und weigern sich, Schutzgeld zu zahlen. [PRO1_L:PROT1] Oh, wir könnten es mit Schmiergeld versuchen... @@ -13062,7 +13062,7 @@ Oh, wir könnten es mit Schmiergeld versuchen... Schmiergeld? Blödsinn! Ich zeig euch, wie man denen Angst macht. [PRO1_01:PROT1] -~g~Demoliere die Schaufenster der Lãden und die Inhaber werden darum betteln, zahlen zu dürfen. +~g~Demoliere die Schaufenster der Läden und die Inhaber werden darum betteln, zahlen zu dürfen. [PRO1_03:PROT1] ~r~Du sollst abhauen, nicht Kaffee trinken gehen. @@ -13092,7 +13092,7 @@ Ich bin jetzt der Boss in der Stadt. ICH! Du kannst jetzt in bestimmten Gegenden auf der Karte Objekte kaufen. [BUYP2:PROT1] -Wenn du ein Gebãude mit grüner Markierung siehst, kannst du dieses kaufen. +Wenn du ein Gebäude mit grüner Markierung siehst, kannst du dieses kaufen. [PRO1_N:PROT1] Ich bin in fünf Minuten zurück... @@ -13127,7 +13127,7 @@ Was gibt's für Probleme? Eine Bar weigert sich zu zahlen. [PRO2_C:PROT2] -Die glauben, die werden von so einer Schlãgerbande beschützt. +Die glauben, die werden von so einer Schlägerbande beschützt. [PRO2_D:PROT2] Aber keine Sorge, Tommy, ich regle das. @@ -13204,10 +13204,10 @@ Wir müssen unser Zeug holen und verschwinden! Langsam, ihr beiden, lasst mich kurz nachdenken! [PRO3_L:PROT3] -Tommy Vercetti lãuft nicht einfach weg. +Tommy Vercetti läuft nicht einfach weg. [PRO3_M:PROT3] -Die Cops werden das Gebãude sorgfãltig durchkãmmen, oder? +Die Cops werden das Gebäude sorgfältig durchkämmen, oder? [PRO3_N:PROT3] Aber das dauert. @@ -13219,7 +13219,7 @@ Wir müssen den Laden selbst abfackeln. Ja, aber... [PRO3_Q:PROT3] -Nur ein Cop kommt auch nur in die Nãhe von dem Laden! +Nur ein Cop kommt auch nur in die Nähe von dem Laden! [PRO3_R:PROT3] Dann gehen wir eben als Cops. @@ -13243,7 +13243,7 @@ Wir müssen die Cops hereinlocken, dann sperren wir sie ein [PRO3_Y:PROT3] -und überwãltigen sie. +und überwältigen sie. [PRO3_Z:PROT3] Guter Plan. Los geht's! @@ -13282,10 +13282,10 @@ Bisschen eng im Schritt vielleicht... Oh ja, ja. Meine auch, meine auch. [PRO3_13:PROT3] -Vorsicht, Bruder! Kein Cop fãhrt so schlecht! +Vorsicht, Bruder! Kein Cop fährt so schlecht! [PRO3_14:PROT3] -Denk dran, lãchle die anderen Cops an. +Denk dran, lächle die anderen Cops an. [PRO3_15:PROT3] Hallo, Officer. Hübsche Marke, hübsche Marke. @@ -13309,19 +13309,19 @@ Jetzt sind sie so richtig stocksauer. ~g~Beschaff dir einen Fahndungslevel, damit dir die Cops in die Garage folgen. [PRO3_22:PROT3] -~g~Das Garagentor ist blockiert! Du musst es freirãumen, damit es schließen kann. +~g~Das Garagentor ist blockiert! Du musst es freiräumen, damit es schließen kann. [PRO3_23:PROT3] ~g~Stell dich in die Markierung, um die Bombe zu platzieren. [PRO3_24:PROT3] -~g~Verschwinde aus der Nãhe des Cafés! +~g~Verschwinde aus der Nähe des Cafés! [PRO_AS1:PROT3] SCHUTZGELD-MISSIONEN ERFÜLLT [PRO_AS2:PROT3] -~g~Das Vercetti Estate generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmãßig ab. +~g~Das Vercetti Estate generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmäßig ab. [PRO3_08:PROT3] ~g~Du musst zurück zu ~h~Vercetti Estate~g~ auf ~h~Starfish Island~g~. @@ -13377,7 +13377,7 @@ Beste Platzierung: 3. Beste Platzierung: 4. [RACES13:RACES] -Streckenlãnge: ~1~.~1~ km +Streckenlänge: ~1~.~1~ km [RACES15:RACES] Bestzeit: Nicht verfügbar @@ -13392,13 +13392,13 @@ Du hast nicht genug Geld, um an diesem Rennen teilzunehmen. Bestzeit: ~1~:0~1~ [RACES23:RACES] -Streckenlãnge: ~1~.~1~ Meilen +Streckenlänge: ~1~.~1~ Meilen [RACES_1:RACES] ~g~Schnapp dir ein schnelles Fahrzeug und begib dich zur Startlinie. [RACEHLP:RACES] -~w~Drücke die~h~ ~k~~PED_SPRINT~~w~, um das ausgewãhlte Rennen zu starten. Drücke die~h~ ~k~~VEHICLE_ENTER_EXIT~~w~, um abzubrechen. +~w~Drücke die~h~ ~k~~PED_SPRINT~~w~, um das ausgewählte Rennen zu starten. Drücke die~h~ ~k~~VEHICLE_ENTER_EXIT~~w~, um abzubrechen. {=================================== MISSION TABLE RCHELI1 ===================================} @@ -13412,7 +13412,7 @@ Verbleibende Checkpoints: ~g~Es gibt insgesamt 20 Checkpoints. [RCH1_12:RCHELI1] -~g~Der ferngesteuerte Helikopter gerãt außer Reichweite! +~g~Der ferngesteuerte Helikopter gerät außer Reichweite! [RCH1_13:RCHELI1] ~r~Der ferngesteuerte Helikopter ist außer Reichweite! @@ -13432,7 +13432,7 @@ Verbleibende Checkpoints: ~g~Wenn du diese Mission abbrechen willst, drücke die ~h~~k~~VEHICLE_FIREWEAPON~~g~, um dein Flugzeug zu sprengen. [RCPL1_8:RCPLNE1] -~g~Dein ferngesteuertes Flugzeug gerãt außer Reichweite! +~g~Dein ferngesteuertes Flugzeug gerät außer Reichweite! [RCPL1_9:RCPLNE1] ~r~Dein ferngesteuertes Flugzeug ist außer Reichweite! @@ -13455,7 +13455,7 @@ Verbleibende Runden: ~g~Du musst als erster 2 volle Runden auf dem Kurs fahren! [RCR1_6:RCRACE1] -~g~Dein ferngesteuertes Auto gerãt außer Reichweite! +~g~Dein ferngesteuertes Auto gerät außer Reichweite! [RCR1_7:RCRACE1] ~r~Dein ferngesteuertes Auto ist außer Reichweite! @@ -13490,7 +13490,7 @@ Das ist Tommy. Wir kennen uns schon ewig. Alles paletti, Mann. [RBM1_K:ROCK1] -Und, ãh, wie war dein Name noch mal? +Und, äh, wie war dein Name noch mal? [RBM1_L:ROCK1] Lass das, Jezz. Merk dir eines, @@ -13523,7 +13523,7 @@ Love Juice, Mann! Love Juice? [RBM1_W:ROCK1] -Genau. 2 Teile TNT-Whiskey, 1 Teil Koks, 5 Pãckchen Brause und 1 Liter Sprit. +Genau. 2 Teile TNT-Whiskey, 1 Teil Koks, 5 Päckchen Brause und 1 Liter Sprit. [RBM1_X:ROCK1] Kannst du uns weiterhelfen, Alter? @@ -13562,7 +13562,7 @@ Da kenne ich genau die richtige. Hey, Mercedes! [ROK1_6:ROCK1] -Hi, Tommy. Na, wie lãuft's so? +Hi, Tommy. Na, wie läuft's so? [ROK1_7:ROCK1] Alles bestens. Hör mal, willst du die Jungs von Love Fist verführen? @@ -13586,7 +13586,7 @@ NICHT MEHR BENÖTIGT NICHT MEHR BENÖTIGT [MERC_39:ROCK1] -Wir sehen uns spãter, Big Boy. +Wir sehen uns später, Big Boy. [RBM1_C:ROCK1] Hey, Tommy! Schön, dass du kommen konntest. @@ -13621,7 +13621,7 @@ Da ist so 'n Typ, wir kennen ihn kaum, aber er kennt uns. So wie er da. Weiß alles über uns. [RBM2_G:ROCK2] -Weiß, dass Willy auf Damenunterwãsche steht, eh! +Weiß, dass Willy auf Damenunterwäsche steht, eh! [RBM2_H:ROCK2] Oder dass Percy auf Duran Duran steht! @@ -13695,19 +13695,19 @@ Tommy! Tommy! Tommy, Mann, der Irre ist wieder da! Was ist denn los? [RBM3_C:ROCK3] -Dieser Irre lãsst Love Fist nicht in Ruhe! +Dieser Irre lässt Love Fist nicht in Ruhe! [RBM3_D:ROCK3] Du hast ihn nicht erwischt, Mann. Und jetzt ist er wieder da. [RBM3_E:ROCK3] -Ja, ja, ja, und es ist nãmlich so... +Ja, ja, ja, und es ist nämlich so... [RBM3_F:ROCK3] wir brauchen für die Limo einen Fahrer, dem wir vertrauen können, [RBM3_G:ROCK3] -weil der Irre uns stãndig bedroht! +weil der Irre uns ständig bedroht! [RBM3_I:ROCK3] Wir scheißen uns alle in die Hosen, Mann. @@ -13761,7 +13761,7 @@ Den grünen. Da ist kein grüner. Oder ist der hier grün? [ROK3_44:ROCK3] -Sieht für dich einer von den Drãhten grün aus? +Sieht für dich einer von den Drähten grün aus? [ROK3_49:ROCK3] Ich hab euch doch jahrelang nur mitgeschleppt. @@ -13812,13 +13812,13 @@ Falls du versuchst, aus dem Auto auszusteigen, wenn die Bombe scharfgemacht ist, Ist der Detonations-Balken am Anschlag, explodiert die Bombe. [RBM3_8:ROCK3] -Je schneller du fãhrst, desto niedriger der Detonations-Balken. +Je schneller du fährst, desto niedriger der Detonations-Balken. [RBM3_7:ROCK3] -~g~BOMBE ENTSCHÃRFT! +~g~BOMBE ENTSCHÄRFT! [ROK3_6A:ROCK3] -~g~Love Fist. Ihr habt den Ãther lange genug verschmutzt! +~g~Love Fist. Ihr habt den Äther lange genug verschmutzt! [ROK3_6B:ROCK3] ~g~Ich wollte euer Freund sein. Jetzt will ich, dass ihr untergeht. @@ -13866,10 +13866,10 @@ Tommy, mein Freund, wir müssen die Band retten! Tommy, bleib auf dem Gas, Alter. [ROK3_31:ROCK3] -Ganz toll. 'Tu doch einer was.' Was ist denn das für eine Ansage? Da kenn ich mutigere Mãdels. +Ganz toll. 'Tu doch einer was.' Was ist denn das für eine Ansage? Da kenn ich mutigere Mädels. [ROK3_33:ROCK3] -Alter, ich bin Musiker. Vom Bomben-Entschãrfen hab ich keinen blassen Dunst. +Alter, ich bin Musiker. Vom Bomben-Entschärfen hab ich keinen blassen Dunst. [ROK3_35:ROCK3] Eben, so was liegt dir doch, was ich so höre. @@ -13881,7 +13881,7 @@ Einen Strohhalm?! Dies ist der Tour-Bus von Love Fist! Wo zum Geier sollte hier ein Strohhalm sein? [ROK3_46:ROCK3] -Ich hãtte euch alle rausschmeißen sollen, als es noch ging, Mann. +Ich hätte euch alle rausschmeißen sollen, als es noch ging, Mann. [ROK3_47:ROCK3] Kapitalist. @@ -13893,7 +13893,7 @@ Kameradenschwein. Jezz spielt das Band ab, [RBM3_9:ROCK3] -Wenn du angehalten wirst oder langsam fãhrst, wãchst der Detonations-Balken. +Wenn du angehalten wirst oder langsam fährst, wächst der Detonations-Balken. [ROK3_50:ROCK3] Halt die Klappe. Du bist ein Idiot. @@ -13908,7 +13908,7 @@ Ich scheiß mir in die Hose, Mann. Ich will zu meiner Mama! Oh nein. Im Angesicht des Todes sieht alles grün aus. [ROK3_6C:ROCK3] -~g~Wenn ihr langsamer werdet, geht eure Limo hoch, IHR UND EURE HAARIGEN ÃRSCHE mit dazu! +~g~Wenn ihr langsamer werdet, geht eure Limo hoch, IHR UND EURE HAARIGEN ÄRSCHE mit dazu! [ROK3_71:ROCK3] Wir müssen uns ranhalten. Danke nochmal, Tommy, du hast es echt drauf. Ciao. @@ -13920,13 +13920,13 @@ Endlich, Mann, Zeit für einen wohlverdienten Drink. Die Halle ist nur 100 Meter Mach mir mal einen großen. Hey, Tommy, leg mal 'nen anderen Sound auf, Mann. [ROK3_3:ROCK3] -Ich werd wirr im Kopf, wenn nichts zum Headbangen lãuft. Hey, Tommy, leg mal dieses Band ein. +Ich werd wirr im Kopf, wenn nichts zum Headbangen läuft. Hey, Tommy, leg mal dieses Band ein. [ROK3_4:ROCK3] -Love Fist. Ihr habt den Ãther lange genug verschmutzt! Ich wollte euer Freund sein. +Love Fist. Ihr habt den Äther lange genug verschmutzt! Ich wollte euer Freund sein. [ROK3_5:ROCK3] -Jetzt will ich, dass ihr untergeht. Wenn ihr langsamer werdet, geht eure Limo hoch, IHR UND EURE HAARIGEN ÃRSCHE mit dazu! +Jetzt will ich, dass ihr untergeht. Wenn ihr langsamer werdet, geht eure Limo hoch, IHR UND EURE HAARIGEN ÄRSCHE mit dazu! [ROK3_6:ROCK3] Tommy, mein Freund, du musst die Band retten! Langsam wird's langweilig. Halt bloß das Pedal durchgedrückt!! @@ -13941,13 +13941,13 @@ Könnte die Bombe nicht unter der Motorhaube sein? Da kommen wir nie ran, ohne a Hey, hier gibt's eine Warteschlange, Alter! Die Lösung liegt nicht in der Minibar! Weg da! [ROK3_10:ROCK3] -Hey, aus der Wodkapulle kommen Drãhte raus! Das ist kein Wodka, das ist TNT-WHISKEY! +Hey, aus der Wodkapulle kommen Drähte raus! Das ist kein Wodka, das ist TNT-WHISKEY! [ROK3_11:ROCK3] WAAAAAAGGGHHHH!!!! Das Ding ist scharfgemacht!! WAAAAAAAAAAGGGHHHHHH!!!! [ROK3_12:ROCK3] -Man hat mir immer gesagt, der Alk wird mich killen... Das kenn ich aus dem Fernsehen. Du musst einen der Drãhte rausziehen. Welchen Draht? Weiß ich doch nicht, Mann. +Man hat mir immer gesagt, der Alk wird mich killen... Das kenn ich aus dem Fernsehen. Du musst einen der Drähte rausziehen. Welchen Draht? Weiß ich doch nicht, Mann. [ROK3_13:ROCK3] Keinen Schimmer. Willy, sag doch mal was. Ich werd Bass in der Hölle spielen. @@ -13956,7 +13956,7 @@ Keinen Schimmer. Willy, sag doch mal was. Ich werd Bass in der Hölle spielen. Tommy, bleib auf dem Gas, Mann. Tu doch einer was! Ganz toll... [ROK3_15:ROCK3] -'Tu doch einer was.' Was ist denn das für eine Ansage? Da kenn ich mutigere Mãdchen. Ok, Obermacho, dann tu du doch was! +'Tu doch einer was.' Was ist denn das für eine Ansage? Da kenn ich mutigere Mädchen. Ok, Obermacho, dann tu du doch was! [ROK3_16:ROCK3] Alter, ich bin Musiker. Mit Bomben kenne ich mich nicht aus. Willy könnte den TNT-Whiskey mit einem Strohhalm raussaugen. @@ -13971,10 +13971,10 @@ Gebt Willy einen Strohhalm! Einen Strohhalm?! Wi sind im Band-Auto von Love Fist Wo zum Geier sollte hier ein Strohhalm sein? Welchen Draht, Tommy? Den grünen. Da ist kein grüner. [ROK3_20:ROCK3] -Oder ist der hier grün? Sieht für dich einer von den Drãhten grün aus? +Oder ist der hier grün? Sieht für dich einer von den Drähten grün aus? [ROK3_21:ROCK3] -Oh nein. Im Angesicht des Todes sieht alles grün aus. Ich hãtte euch alle rausschmeißen sollen, als es noch ging, Mann. +Oh nein. Im Angesicht des Todes sieht alles grün aus. Ich hätte euch alle rausschmeißen sollen, als es noch ging, Mann. [ROK3_22:ROCK3] Kameradenschwein. Kapitalist. Ich hab euch doch jahrelang nur mitgeschleppt. Halt die Klappe. Du bist ein Idiot. @@ -14006,16 +14006,16 @@ Komm rein und setz dich auf deinen Hintern, Junge. Mein Daddy hat immer gesagt, einem geschenkten Gaul schaut man nicht ins Maul. Hat's auch nie getan. [TEX1_C:SERG1] -Ein Glãschen alter Kentucky gefãllig? +Ein Gläschen alter Kentucky gefällig? [TEX1_D:SERG1] Nein danke. [TEX1_E:SERG1] -Ein nüchterner Denker, das gefãllt mir. +Ein nüchterner Denker, das gefällt mir. [TEX1_F:SERG1] -Im Immobiliengeschãft geht's nicht um hochtrabende Vertrãge. +Im Immobiliengeschäft geht's nicht um hochtrabende Verträge. [TEX1_G:SERG1] Es geht um Land. Und darum, dieses Land zu kriegen. Kannst du mir folgen? @@ -14057,7 +14057,7 @@ Hübscher Hintern, Baby! Bin ich das? [TEX1_8:SERG1] -Jedesmal wenn du in einen Golfwagen steigst, erhãltst du automatisch einen Golfschlãger, vorausgesetzt, du hast nicht schon eine Nahkampfwaffe. +Jedesmal wenn du in einen Golfwagen steigst, erhältst du automatisch einen Golfschläger, vorausgesetzt, du hast nicht schon eine Nahkampfwaffe. [TEX1_9:SERG1] Schnapp ihn dir! @@ -14077,7 +14077,7 @@ Mach den Irren fertig! ~g~Großartig! Sie haben dich bemerkt! [TEX_2B:SERG2] -~r~Narr! Die Leute müssen SEHEN, dass der Tãter ein Kubaner ist! +~r~Narr! Die Leute müssen SEHEN, dass der Täter ein Kubaner ist! [TEX_2C:SERG2] ~g~Besorge dir bei Rafael's Kleidung in den Farben der kubanischen Gang. @@ -14089,16 +14089,16 @@ Mach den Irren fertig! Tommy, das ist Donald Love. Donald, das ist Tommy Vercetti, [TEX2_B:SERG2] -der neueste Draufgãnger hier in der Stadt. +der neueste Draufgänger hier in der Stadt. [TEX2_C:SERG2] -Ja...ãh... +Ja...äh... [TEX2_D:SERG2] Donald, sei still und hör zu. Vielleicht kannst du was lernen. [TEX2_E:SERG2] -Also. Nichts lãsst Immobilienpreise schneller abstürzen als ein guter alter Bandenkrieg. +Also. Nichts lässt Immobilienpreise schneller abstürzen als ein guter alter Bandenkrieg. [TEX2_F:SERG2] Außer vielleicht eine Katastrophe, eine biblische Plage oder so, @@ -14154,7 +14154,7 @@ Gut mitgedacht. Also, ich verdrücke mich eine Weile aus der Stadt, [TEX3_I:SERG3] -und wenn dieses Bürogebãude urplötzlich irreparable Schãden aufweist, dann... +und wenn dieses Bürogebäude urplötzlich irreparable Schäden aufweist, dann... [TEX3_J:SERG3] ....fühlen Sie sich als guter Mensch verpflichtet, einzuspringen und @@ -14163,10 +14163,10 @@ und wenn dieses Bürogebãude urplötzlich irreparable Schãden aufweist, dann.. -für die Neugestaltung eines wichtigen Gebiets der Stadt zu sorgen? [TEX3_L:SERG3] -Wo finde ich mehr Mãnner wie dich? +Wo finde ich mehr Männer wie dich? [TEX3_1:SERG3] -~g~Benutze den ferngesteuerten Helikopter, um Bomben zu 4 Zielen an dem zur Sprengung vorgesehenen Gebãude zu transportieren. +~g~Benutze den ferngesteuerten Helikopter, um Bomben zu 4 Zielen an dem zur Sprengung vorgesehenen Gebäude zu transportieren. [TEX3_2:SERG3] ~g~Du musst an jedem Ziel eine Bombe abwerfen. Die Reihenfolge ist beliebig. @@ -14190,7 +14190,7 @@ Wo finde ich mehr Mãnner wie dich? Verbleibende Ziele: [TEX3_17:SERG3] -~r~Die Zeit ist um. Du hast es nicht geschafft, das Gebãude zu sprengen. +~r~Die Zeit ist um. Du hast es nicht geschafft, das Gebäude zu sprengen. [TEX3_18:SERG3] ~r~Dein Helikopter wurde zerstört! Wie willst du jetzt die Bomben transportieren? @@ -14211,7 +14211,7 @@ Drücke ~h~~k~~VEHICLE_LOOKLEFT~~w~, um den Helikopter gegen den Uhrzeigersinn z Drücke ~h~~k~~VEHICLE_LOOKLEFT~~w~, um den Helikopter im Uhrzeigersinn zu drehen. [TEX3_27:SERG3] -~g~Über eine Haupttreppe hat man Zugang zu allen Stockwerken des Gebãudes. +~g~Über eine Haupttreppe hat man Zugang zu allen Stockwerken des Gebäudes. [TEX3_31:SERG3] ~r~Du hast den Wagen mit den Bomben und dem ferngesteuerten Helikopter zerstört! @@ -14232,7 +14232,7 @@ Drücke die ~h~~k~~VEHICLE_BRAKE~~w~, um die Rotorgeschwindigkeit zu verringern, Drücke die ~h~~k~~VEHICLE_ACCELERATE~~w~, um die Rotorgeschwindigkeit zu erhöhen, der Helikopter ~h~gewinnt dann an Höhe. [TEX3_16:SERG3] -~g~Begib dich zu dem ~w~TOPFUN~g~-Wagen nahe dem zum Abriss vorgesehenen Gebãude. +~g~Begib dich zu dem ~w~TOPFUN~g~-Wagen nahe dem zum Abriss vorgesehenen Gebäude. [TEX3_33:SERG3] Wenn du eine Bombe aufgenommen hast, zeigt dir das Radar die Position des Ziels in Relation zu dem ferngesteuerten Helikopter. @@ -14256,13 +14256,13 @@ Um ~h~eine Bombe aufzunehmen~w~, steuere den Helikopter direkt über sie. Der He ~g~Um eine Bombe aufzunehmen, steuere den Helikopter direkt über sie. Der Helikopter kann immer nur eine Bombe tragen. [TEX3_12:SERG3] -~g~Bombe platziert! Es bleiben nur noch 3 Ziele! Hol die nãchste Bombe. +~g~Bombe platziert! Es bleiben nur noch 3 Ziele! Hol die nächste Bombe. [TEX3_13:SERG3] -~g~Bombe platziert! Es bleiben nur noch 2 Ziele! Hol die nãchste Bombe. +~g~Bombe platziert! Es bleiben nur noch 2 Ziele! Hol die nächste Bombe. [TEX3_14:SERG3] -~g~Bombe platziert! Es bleibt nur noch 1 Ziel! Hol die nãchste Bombe. +~g~Bombe platziert! Es bleibt nur noch 1 Ziel! Hol die nächste Bombe. [TEX3_15:SERG3] ~r~Zeitzünder aktiviert! ~g~ Du musst die ~w~4 Bomben ~g~in der verbleibenden Zeit platzieren. @@ -14313,7 +14313,7 @@ SPEED BONUS!! Taxi-Mission beendet [TAXIH1:TAXI1] -Halte neben einem markierten Fußgãnger, um ihn einsteigen zu lassen, dann bringe ihn rechtzeitig an sein Fahrtziel. +Halte neben einem markierten Fußgänger, um ihn einsteigen zu lassen, dann bringe ihn rechtzeitig an sein Fahrtziel. [FARE1:TAXI1] ~g~Fahrtziel ~w~'Pole Position Club' ~g~in Ocean Beach. @@ -14373,7 +14373,7 @@ Halte neben einem markierten Fußgãnger, um ihn einsteigen zu lassen, dann brin ~g~Fahrtziel ~w~'die Polizeistation' ~g~in Vice Point. [FARE15:TAXI1] -~g~Fahrtziel ~w~'die Pizzagaststãtte' ~g~in Vice Point. +~g~Fahrtziel ~w~'die Pizzagaststätte' ~g~in Vice Point. [WFARE7:TAXI1] ~g~Fahrtziel ~w~'die Polizeistation' ~g~in Little Havana. @@ -14391,10 +14391,10 @@ Halte neben einem markierten Fußgãnger, um ihn einsteigen zu lassen, dann brin ~g~Fahrtziel ~w~'der Stadium' ~g~in Downtown. [WFARE12:TAXI1] -~g~Fahrtziel ~w~'die Pizzagaststãtte' ~g~in Little Haiti. +~g~Fahrtziel ~w~'die Pizzagaststätte' ~g~in Little Haiti. [WFARE13:TAXI1] -~g~Fahrtziel ~w~'die Pizzagaststãtte' ~g~in Downtown. +~g~Fahrtziel ~w~'die Pizzagaststätte' ~g~in Downtown. [WFARE14:TAXI1] ~g~Fahrtziel ~w~'die Docks' ~g~in Viceport. @@ -14408,7 +14408,7 @@ Halte neben einem markierten Fußgãnger, um ihn einsteigen zu lassen, dann brin {=================================== MISSION TABLE TAXICUT ===================================} [TAXC_A:TAXICUT] -Schãtze, sie sind der neue Besitzer. +Schätze, sie sind der neue Besitzer. [TAXC_B:TAXICUT] Sind Sie 'n Mafioso? Oder vom Kartell? Sehen nicht aus wie ein Mexikaner. @@ -14423,7 +14423,7 @@ bedrohen Sie ein paar von den Fahrern- aber nicht Ted, der ist gerade an der Leiste operiert. [TAXC_F:TAXICUT] -Tja, also, hier wird sich einiges ãndern, Lady. +Tja, also, hier wird sich einiges ändern, Lady. [TAXC_G:TAXICUT] Aber nicht doch, Jungchen. Überlassen Sie das lieber mir - @@ -14435,10 +14435,10 @@ Ich mach das schon seit Jahren. Alles mal herhören. [TAXC_J:TAXICUT] -Wir haben eine neue Geschãftsleitung, und es wird sich wieder mal einiges ãndern hier. +Wir haben eine neue Geschäftsleitung, und es wird sich wieder mal einiges ändern hier. [TAXC_K:TAXICUT] -Unsere neue Geschãftsleitung, die- +Unsere neue Geschäftsleitung, die- [TAXC_L:TAXICUT] Von welcher Gang sind Sie? @@ -14453,10 +14453,10 @@ Und wie heißen Sie, junger Mann? Vercetti, Tommy Vercetti. [TAXC_P:TAXICUT] -Unsere neue Geschãftsleitung, die Vercetti Gang, +Unsere neue Geschäftsleitung, die Vercetti Gang, [TAXC_Q:TAXICUT] -wird dafür sorgen, dass wir keinen Ãrger kriegen. +wird dafür sorgen, dass wir keinen Ärger kriegen. [TAXC_R:TAXICUT] Capiche? Ende! @@ -14471,7 +14471,7 @@ Also, so ist das immer gelaufen: Wir führen die Firma weiter wie gewohnt. [TAXC_V:TAXICUT] -Wenn die Konkurrenz Ãrger macht, gebt ihr ihnen eines auf die Mütze. +Wenn die Konkurrenz Ärger macht, gebt ihr ihnen eines auf die Mütze. [TAXC_W:TAXICUT] Dann geben die uns eines auf die Mütze. @@ -14483,7 +14483,7 @@ Dann geben sie denen eines auf die Mütze. Und so weiter, und so fort. Kapiert? [TAXC_Z:TAXICUT] -Ãh, ja, ich glaub schon. +Äh, ja, ich glaub schon. [TAXC_A1:TAXICUT] Schnappen Sie sich ein Taxi aus der Garage, wenn Sie Lust haben. @@ -14526,13 +14526,13 @@ Ok, ok! Aber tun Sie mir nichts! {=================================== MISSION TABLE TAXIWA2 ===================================} [TAX2_1:TAXIWA2] -An alle Wagen. Wir kriegen nirgends Fahrgãste. Was ist los mit euch? +An alle Wagen. Wir kriegen nirgends Fahrgäste. Was ist los mit euch? [TAX2_2:TAXIWA2] VC-Taxi ist dauernd schneller als wir. Die haben einfach zu viele Autos. Keine Chance. [TAX2_3:TAXIWA2] -Mr. Vercetti, wenn Sie zufãllig mithören: Sie müssen ein paar VC-Taxis ausschalten, sonst sind wir pleite! +Mr. Vercetti, wenn Sie zufällig mithören: Sie müssen ein paar VC-Taxis ausschalten, sonst sind wir pleite! [TAXW2_1:TAXIWA2] ~g~Schalte 3 Taxis der Konkurrenz aus! @@ -14558,7 +14558,7 @@ Hmmm, keine Spur von Mercedes... TAXIUNTERNEHMEN ERWORBEN [TAX_AS2:TAXIWA3] -~g~Kaufman-Taxis generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmãßig ab. +~g~Kaufman-Taxis generiert nun bis zu $~1~ Einkünfte. Hol dir das Geld regelmäßig ab. [TAX3_4:TAXIWA3] Wird Zeit, dass der Schutzengel von Kaufman-Taxis eine vor den Latz kriegt! diff --git a/utils/gxt/gxt.exe b/utils/gxt/gxt.exe index ff264dadc8c8e716964fbbf61cf4d1842881c12b..0f55b7605a8a83400f2b7a64d7527cfa2457c6b5 100644 GIT binary patch literal 307200 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

wjK^`mnCeatS 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 G1pWsQQ@aHK delta 46670 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 From 41f3d4d9d78d44faf2e0d6908d75d1d3034027af Mon Sep 17 00:00:00 2001 From: withmorten Date: Sat, 10 Jul 2021 01:07:47 +0200 Subject: [PATCH 08/27] recompile german.gxt --- gamefiles/TEXT/german.gxt | Bin 461790 -> 461890 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gamefiles/TEXT/german.gxt b/gamefiles/TEXT/german.gxt index 772865dbc7c9e7a78c866d40e9656e923e9829c4..671ed18da6b7137f7a2d670349382e260316000c 100644 GIT binary patch delta 2220 zcmZ9MeQXnT7{{OM%V5ZiacDQGIANF|Z0wCqnY>)D*Y?)CYrVU!td3N0Q;<347@`nU z6$1X@3*o>nM08s)P67c^3=40;1q>#}V0?|?B^n{b5E6+RjU)K|{qAavZF={4-k;xd zPw!GbI6fHM9?bRK?N zWyGE_Tt@8Z(=H=+Z$D!r!D=nt&N-LR5%Be(Yd}EfsLKclA95MRuAKraaT&36?X1HH zrQjD1Bb0vo9;_|PGM|bc!3og{r8;N~EQv|3pSa4{U}~EBSB?uw(Ws|B@{yEC!iKIr zj8nRWOw&qSMzz>9a0+LJzV88-p+8jXGP)Rh%w-&4BI=`vqKm3bbp8p(hHM#en)kAg zqOvX*b z$tt+Z=O;yyB?Gg2@=k|S7E#l5KjjqNG7@katoBn}<_9Kq30RThre)EQn4eTJ-63N_ zqgs(0=#}S-+(?}}irhr!hy0`|qNZTjO$WgmlH>FFVLv6>Mb%KEbmoYkk}*Za0djQi zq$98s41Nk$G8qy4#+TrP!6r>7E<4P8R^4=%o${_*4r9{PR9-?!Bf+Qg`YeZ;e^-OU z%>VSGC1i+_Y=VOtSjxp@RY3`h2}xDQh%U4wuNOH z*(dO@HZ4iV>;rWH;Zosj-CB?EOJPCdZI9>f5xcp0cUk8i781^iqDi~$i_HOHr~P|# zYuQFuA5m2L!Curd>!EW)j;9tU3Dh@sJou73>sR%`EB7%0oQ8a0uoXYEfG24+v;U29n_5u!g&63?&W&(P=U z^@L6n_N|5UJ@ba`+SYr^rn)IiDMB~w$6Md_Gz}MiYV~+Lz9IYSqHjG9j}%TVo*@Vq z3Ky5mZ56sUmu}itx=A=%y2;bHXHtX|ic?KKTH&1?h?7V{56tPWi2dnsocu*J`2^I@BiO0xP1)B(uIFs{QsW-4Z zf*^x5sPQI%L4@QqV^R`s3W8&}8)%Ou%iziyC0rHg!>}k^)^KO7%P4@C5b{d-^_AW^ z&oQ?uo?7FH*uT0B<_>gb@d9z!Sqa`360=$0txx^5pPr&M)D3$#t)^a1D{<|C)J-dK zeTM5ST0!e*fVypQS9y6Gt)-W^yqd>XQJ1~s<3P^D%bmsbAm0nP_tOSkd#MZ80qB_2 z&!t{S>yV`f-+AEm+>3S5&;3?&zbaH+4?ot!2HH)l;5|UK{CxlK0FhI0lod$SO9T1i z_j%=91mlk3+!>rWg(22pZ|L#l`#_c>L_5hs?(s@Q5 z6J(QTQ#O#}9Y}1htg3-ch;$;bxLrhPn3?1xjH0Z?_ae!cD+DX^h`P_;`$UrIR9O#w delta 2222 zcmZXUe~1)i7{{O4A7_#W{q)q%ob-&uU-$d;F3q{w+1zN&kV_n!TIB%ul@WN2A0Ef|i0mI?)!GIBL@HkjcY4D}N zQ$E9$M!xkKuC(JE*zC@+=I~{(rDWPWdnogBm{i3U_Mz*{4x8!2(Y%=0ic?49C_<`b zV+~n{m^;%M?DT0gU_`t6Ah;7}hJD)PX>$w3?(8I*VBrj5%oXA>}VM$ zMPF@+P(n*b28+~!rXRgH6TRw9o z-uM%2Wi$g!ktpe^raGwIol2iOGel=5MJcbRGmZsKV@;G&nm91sSP0hDl$*(ros5#9 zWP3DJC}x(qo~mCga|4aOQ|3nMFGk7K6;nsC&wK(lIRm1VpGC>)QVd5=(9*+E?5i6% zK%V-J`4c`t<7u$Ic(DS0;ybYAaHXmHlFzJ({N^*C^5Z)`qtbNdfeNx6OH`$1n$N7K zdY@UpWPSxXimJKb5d*B|lbWH|(Xh)C+eo8CFLyDstd2%{z?PcgByKG6nKzZ!`OKTn zdZmI~%}KCk-T|LkQ#;}_Yd$zpK^dhRkvFW${Nfv$ZD~%DNEc#$HQsxF4 z9#c9R-a12CT~cO$E=`=eCq!{g&Bfe$YWb{gQC&Fm2l99jL96j+ai=t_w-;mYN#=4uy{H@tT|8uUxv5U1B*!ajEECY_5`$ z-XG0vm0JRPTsP>Px1eR(@da|$YW zQ*3AERJWZT+U9HGj!AuiK8b#t(s!RtK!^%>ZccQgw`iKZ)=1i-dMvsx$KaG!J zLa=|@O4EMtuhzMt^F?n?+xW`+f-PJ%PQ%{QZQDavilr-Up-|}jZtwbnA46yNl#VZa zRFV#rE!_u7;som6s3E~pd2)8{LcrVLCnDP&+&u%yG5 z;5H$Ry7BHL2P9J*D~7N-q!)Hi2+z)Eg*ZkQWg&^dDGs@TpNlB$reQMzcfyfvJm<~Y z;p4zV!<#>b|LQpuubM~){}N)f;bTH=ij^MBI?1hpAOR!({zM8akD?O%&do z7@m>mm@4FK=BRu)6>ph3;M#-uTn3d=Shs0CEvF6m$+V2t(g4Oau<*DJbD1{MO3YF2lPlk!h0%!Iq5>%5d8tly?Vu4yxy2 zp9KY{)Q54E*k=>Qe*9#5R`{`ZKb~H!E{AT8IPjF^Vp=x-FZ05+NntJDg`)TkVt`~6 zLdT<_y4(|7XP(8df(}3_WwDZg4_}jmLMmc4A@0K!7pua`x5Hg@cMlPohOgNWK8R8H z@{#cU)A)w@E-ZxPJ~4zVcL;~HG1m&w>aaG0bK;C0agBBmyKLdhk$VaG!1uxhMAwR3(knB-1_e8y_3UuB6y-ldM8(0y7>=bujP0E From 61c2398b6741667b11fb3ab2d6f0dc718635ca36 Mon Sep 17 00:00:00 2001 From: withmorten Date: Sat, 10 Jul 2021 01:17:38 +0200 Subject: [PATCH 09/27] readme: fix lto option --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 759993a1..0bfd955b 100644 --- a/README.md +++ b/README.md @@ -130,7 +130,7 @@ Microsoft recently discontinued its downloads of the DX9 SDK. You can download a **If you choose OpenAL on Windows** You must read [Running OpenAL build on Windows](https://github.com/GTAmodding/re3/wiki/Running-OpenAL-build-on-Windows). -> :information_source: premake has an `--lto` option if you want the project to be compiled with Link Time Optimization. +> :information_source: premake has an `--with-lto` option if you want the project to be compiled with Link Time Optimization. > :information_source: There are various settings in [config.h](https://github.com/GTAmodding/re3/tree/miami/src/core/config.h), you may want to take a look there. From 6f103a3b8246ed4a883abaea63c6682cdefc6752 Mon Sep 17 00:00:00 2001 From: withmorten Date: Wed, 7 Jul 2021 17:34:02 +0200 Subject: [PATCH 10/27] finish COMPATIBLE_SAVES and FIX_INCOMPATIBLE_SAVES --- src/control/AutoPilot.cpp | 66 ++-- src/control/Garages.cpp | 127 ++++++-- src/control/Garages.h | 15 +- src/control/Phones.cpp | 33 +- src/control/Pickups.cpp | 58 +++- src/control/Script5.cpp | 36 +-- src/core/Placeable.h | 2 +- src/core/Pools.cpp | 12 +- src/core/config.h | 4 +- src/entities/Entity.cpp | 4 +- src/objects/ParticleObject.cpp | 109 ++++++- src/peds/Ped.cpp | 10 +- src/peds/PlayerPed.cpp | 6 +- src/render/Fluff.cpp | 42 ++- src/save/GenericGameStorage.cpp | 519 ++++++++++++++++++++++++++++++++ src/save/GenericGameStorage.h | 5 + src/save/PCSave.cpp | 7 + src/save/PCSave.h | 2 +- src/save/SaveBuf.h | 8 + src/skel/crossplatform.cpp | 23 ++ src/skel/crossplatform.h | 3 + src/vehicles/Automobile.cpp | 2 +- src/vehicles/Bike.cpp | 2 +- src/vehicles/Boat.cpp | 2 +- src/vehicles/Cranes.cpp | 84 +++++- src/vehicles/Vehicle.cpp | 99 +++--- src/vehicles/Vehicle.h | 2 +- src/weapons/Weapon.cpp | 2 +- 28 files changed, 1118 insertions(+), 166 deletions(-) diff --git a/src/control/AutoPilot.cpp b/src/control/AutoPilot.cpp index db72548f..d7c17a68 100644 --- a/src/control/AutoPilot.cpp +++ b/src/control/AutoPilot.cpp @@ -50,45 +50,45 @@ void CAutoPilot::RemoveOnePathNode() #ifdef COMPATIBLE_SAVES void CAutoPilot::Save(uint8*& buf) { - WriteSaveBuf(buf, m_nCurrentRouteNode); - WriteSaveBuf(buf, m_nNextRouteNode); - WriteSaveBuf(buf, m_nPrevRouteNode); - WriteSaveBuf(buf, m_nTimeEnteredCurve); - WriteSaveBuf(buf, m_nTimeToSpendOnCurrentCurve); - WriteSaveBuf(buf, m_nCurrentPathNodeInfo); - WriteSaveBuf(buf, m_nNextPathNodeInfo); - WriteSaveBuf(buf, m_nPreviousPathNodeInfo); - WriteSaveBuf(buf, m_nAntiReverseTimer); - WriteSaveBuf(buf, m_nTimeToStartMission); - WriteSaveBuf(buf, m_nPreviousDirection); - WriteSaveBuf(buf, m_nCurrentDirection); - WriteSaveBuf(buf, m_nNextDirection); - WriteSaveBuf(buf, m_nCurrentLane); - WriteSaveBuf(buf, m_nNextLane); - WriteSaveBuf(buf, m_nDrivingStyle); - WriteSaveBuf(buf, m_nCarMission); - WriteSaveBuf(buf, m_nTempAction); - WriteSaveBuf(buf, m_nTimeTempAction); - WriteSaveBuf(buf, m_fMaxTrafficSpeed); - WriteSaveBuf(buf, m_nCruiseSpeed); - WriteSaveBuf(buf, m_nCruiseSpeedMultiplierType); - SkipSaveBuf(buf, 2); - WriteSaveBuf(buf, m_fCruiseSpeedMultiplier); + WriteSaveBuf(buf, m_nCurrentRouteNode); + WriteSaveBuf(buf, m_nNextRouteNode); + WriteSaveBuf(buf, m_nPrevRouteNode); + WriteSaveBuf(buf, m_nTimeEnteredCurve); + WriteSaveBuf(buf, m_nTimeToSpendOnCurrentCurve); + WriteSaveBuf(buf, m_nCurrentPathNodeInfo); + WriteSaveBuf(buf, m_nNextPathNodeInfo); + WriteSaveBuf(buf, m_nPreviousPathNodeInfo); + WriteSaveBuf(buf, m_nAntiReverseTimer); + WriteSaveBuf(buf, m_nTimeToStartMission); + WriteSaveBuf(buf, m_nPreviousDirection); + WriteSaveBuf(buf, m_nCurrentDirection); + WriteSaveBuf(buf, m_nNextDirection); + WriteSaveBuf(buf, m_nCurrentLane); + WriteSaveBuf(buf, m_nNextLane); + WriteSaveBuf(buf, m_nDrivingStyle); + WriteSaveBuf(buf, m_nCarMission); + WriteSaveBuf(buf, m_nTempAction); + WriteSaveBuf(buf, m_nTimeTempAction); + WriteSaveBuf(buf, m_fMaxTrafficSpeed); + WriteSaveBuf(buf, m_nCruiseSpeed); + WriteSaveBuf(buf, m_nCruiseSpeedMultiplierType); + ZeroSaveBuf(buf, 2); + WriteSaveBuf(buf, m_fCruiseSpeedMultiplier); uint8 flags = 0; if (m_bSlowedDownBecauseOfCars) flags |= BIT(0); if (m_bSlowedDownBecauseOfPeds) flags |= BIT(1); if (m_bStayInCurrentLevel) flags |= BIT(2); if (m_bStayInFastLane) flags |= BIT(3); if (m_bIgnorePathfinding) flags |= BIT(4); - WriteSaveBuf(buf, flags); - WriteSaveBuf(buf, m_nSwitchDistance); - SkipSaveBuf(buf, 2); - WriteSaveBuf(buf, m_vecDestinationCoors.x); - WriteSaveBuf(buf, m_vecDestinationCoors.y); - WriteSaveBuf(buf, m_vecDestinationCoors.z); - SkipSaveBuf(buf, 32); - WriteSaveBuf(buf, m_nPathFindNodesCount); - SkipSaveBuf(buf, 6); + WriteSaveBuf(buf, flags); + WriteSaveBuf(buf, m_nSwitchDistance); + ZeroSaveBuf(buf, 2); + WriteSaveBuf(buf, m_vecDestinationCoors.x); + WriteSaveBuf(buf, m_vecDestinationCoors.y); + WriteSaveBuf(buf, m_vecDestinationCoors.z); + ZeroSaveBuf(buf, 32); + WriteSaveBuf(buf, m_nPathFindNodesCount); + ZeroSaveBuf(buf, 6); } void CAutoPilot::Load(uint8*& buf) diff --git a/src/control/Garages.cpp b/src/control/Garages.cpp index 4c3ceb5c..d7394902 100644 --- a/src/control/Garages.cpp +++ b/src/control/Garages.cpp @@ -26,13 +26,6 @@ #include "VarConsole.h" #include "SaveBuf.h" -#define CRUSHER_GARAGE_X1 (1135.5f) -#define CRUSHER_GARAGE_Y1 (57.0f) -#define CRUSHER_GARAGE_Z1 (-1.0f) -#define CRUSHER_GARAGE_X2 (1149.5f) -#define CRUSHER_GARAGE_Y2 (63.7f) -#define CRUSHER_GARAGE_Z2 (3.5f) - #define ROTATED_DOOR_OPEN_SPEED (0.015f) #define ROTATED_DOOR_CLOSE_SPEED (0.02f) #define DEFAULT_DOOR_OPEN_SPEED (0.035f) @@ -1844,11 +1837,12 @@ void CStoredCar::StoreCar(CVehicle* pVehicle) m_nRadioStation = pVehicle->m_nRadioStation; m_nVariationA = pVehicle->m_aExtras[0]; m_nVariationB = pVehicle->m_aExtras[1]; - m_bBulletproof = pVehicle->bBulletProof; - m_bFireproof = pVehicle->bFireProof; - m_bExplosionproof = pVehicle->bExplosionProof; - m_bCollisionproof = pVehicle->bCollisionProof; - m_bMeleeproof = pVehicle->bMeleeProof; + m_nFlags = 0; + if (pVehicle->bBulletProof) m_nFlags |= FLAG_BULLETPROOF; + if (pVehicle->bFireProof) m_nFlags |= FLAG_FIREPROOF; + if (pVehicle->bExplosionProof) m_nFlags |= FLAG_EXPLOSIONPROOF; + if (pVehicle->bCollisionProof) m_nFlags |= FLAG_COLLISIONPROOF; + if (pVehicle->bMeleeProof) m_nFlags |= FLAG_MELEEPROOF; if (pVehicle->IsCar() || pVehicle->IsBike()) m_nCarBombType = ((CAutomobile*)pVehicle)->m_bombType; // NB: cast to CAutomobile is original behaviour } @@ -1897,11 +1891,11 @@ CVehicle* CStoredCar::RestoreCar() } pVehicle->bHasBeenOwnedByPlayer = true; pVehicle->m_nDoorLock = CARLOCK_UNLOCKED; - pVehicle->bBulletProof = m_bBulletproof; - pVehicle->bFireProof = m_bFireproof; - pVehicle->bExplosionProof = m_bExplosionproof; - pVehicle->bCollisionProof = m_bCollisionproof; - pVehicle->bMeleeProof = m_bMeleeproof; + if (m_nFlags & FLAG_BULLETPROOF) pVehicle->bBulletProof = true; + if (m_nFlags & FLAG_FIREPROOF) pVehicle->bFireProof = true; + if (m_nFlags & FLAG_EXPLOSIONPROOF) pVehicle->bExplosionProof = true; + if (m_nFlags & FLAG_COLLISIONPROOF) pVehicle->bCollisionProof = true; + if (m_nFlags & FLAG_MELEEPROOF) pVehicle->bMeleeProof = true; return pVehicle; } @@ -2280,8 +2274,53 @@ void CGarages::Save(uint8 * buf, uint32 * size) WriteSaveBuf(buf, aCarsInSafeHouses[j][i]); } } - for (int i = 0; i < NUM_GARAGES; i++) + for (int i = 0; i < NUM_GARAGES; i++) { +#ifdef COMPATIBLE_SAVES + WriteSaveBuf(buf, aGarages[i].m_eGarageType); + WriteSaveBuf(buf, aGarages[i].m_eGarageState); + WriteSaveBuf(buf, aGarages[i].m_nMaxStoredCars); + WriteSaveBuf(buf, aGarages[i].field_2); + WriteSaveBuf(buf, aGarages[i].m_bClosingWithoutTargetCar); + WriteSaveBuf(buf, aGarages[i].m_bDeactivated); + WriteSaveBuf(buf, aGarages[i].m_bResprayHappened); + ZeroSaveBuf(buf, 1); + WriteSaveBuf(buf, aGarages[i].m_nTargetModelIndex); + ZeroSaveBuf(buf, 4 + 4); + WriteSaveBuf(buf, aGarages[i].m_bDoor1PoolIndex); + WriteSaveBuf(buf, aGarages[i].m_bDoor2PoolIndex); + WriteSaveBuf(buf, aGarages[i].m_bDoor1IsDummy); + WriteSaveBuf(buf, aGarages[i].m_bDoor2IsDummy); + WriteSaveBuf(buf, aGarages[i].m_bRecreateDoorOnNextRefresh); + WriteSaveBuf(buf, aGarages[i].m_bRotatedDoor); + WriteSaveBuf(buf, aGarages[i].m_bCameraFollowsPlayer); + ZeroSaveBuf(buf, 1); + WriteSaveBuf(buf, aGarages[i].m_vecCorner1); + WriteSaveBuf(buf, aGarages[i].m_fInfZ); + WriteSaveBuf(buf, aGarages[i].m_vDir1); + WriteSaveBuf(buf, aGarages[i].m_vDir2); + WriteSaveBuf(buf, aGarages[i].m_fSupZ); + WriteSaveBuf(buf, aGarages[i].m_fDir1Len); + WriteSaveBuf(buf, aGarages[i].m_fDir2Len); + WriteSaveBuf(buf, aGarages[i].m_fInfX); + WriteSaveBuf(buf, aGarages[i].m_fSupX); + WriteSaveBuf(buf, aGarages[i].m_fInfY); + WriteSaveBuf(buf, aGarages[i].m_fSupY); + WriteSaveBuf(buf, aGarages[i].m_fDoorPos); + WriteSaveBuf(buf, aGarages[i].m_fDoorHeight); + WriteSaveBuf(buf, aGarages[i].m_fDoor1X); + WriteSaveBuf(buf, aGarages[i].m_fDoor1Y); + WriteSaveBuf(buf, aGarages[i].m_fDoor2X); + WriteSaveBuf(buf, aGarages[i].m_fDoor2Y); + WriteSaveBuf(buf, aGarages[i].m_fDoor1Z); + WriteSaveBuf(buf, aGarages[i].m_fDoor2Z); + WriteSaveBuf(buf, aGarages[i].m_nTimeToStartAction); + WriteSaveBuf(buf, aGarages[i].m_bCollectedCarsState); + ZeroSaveBuf(buf, 3 + 4); + ZeroSaveBuf(buf, sizeof(aGarages[i].m_sStoredCar)); +#else WriteSaveBuf(buf, aGarages[i]); +#endif + } //VALIDATESAVEBUF(*size); } @@ -2290,11 +2329,7 @@ const CStoredCar &CStoredCar::operator=(const CStoredCar & other) m_nModelIndex = other.m_nModelIndex; m_vecPos = other.m_vecPos; m_vecAngle = other.m_vecAngle; - m_bBulletproof = other.m_bBulletproof; - m_bFireproof = other.m_bFireproof; - m_bExplosionproof = other.m_bExplosionproof; - m_bCollisionproof = other.m_bCollisionproof; - m_bMeleeproof = other.m_bMeleeproof; + m_nFlags = other.m_nFlags; m_nPrimaryColor = other.m_nPrimaryColor; m_nSecondaryColor = other.m_nSecondaryColor; m_nRadioStation = other.m_nRadioStation; @@ -2307,7 +2342,7 @@ const CStoredCar &CStoredCar::operator=(const CStoredCar & other) void CGarages::Load(uint8* buf, uint32 size) { //INITSAVEBUF - assert(size = 7876); + assert(size == 7876); //assert(size == (6 * sizeof(uint32) + TOTAL_COLLECTCARS_GARAGES * sizeof(*CarTypesCollected) + sizeof(uint32) + TOTAL_HIDEOUT_GARAGES * NUM_GARAGE_STORED_CARS * sizeof(CStoredCar) + NUM_GARAGES * sizeof(CGarage))); CloseHideOutGaragesBeforeSave(); ReadSaveBuf(&NumGarages, buf); @@ -2328,7 +2363,51 @@ void CGarages::Load(uint8* buf, uint32 size) } } for (int i = 0; i < NUM_GARAGES; i++) { +#ifdef COMPATIBLE_SAVES + ReadSaveBuf(&aGarages[i].m_eGarageType, buf); + ReadSaveBuf(&aGarages[i].m_eGarageState, buf); + ReadSaveBuf(&aGarages[i].m_nMaxStoredCars, buf); + ReadSaveBuf(&aGarages[i].field_2, buf); + ReadSaveBuf(&aGarages[i].m_bClosingWithoutTargetCar, buf); + ReadSaveBuf(&aGarages[i].m_bDeactivated, buf); + ReadSaveBuf(&aGarages[i].m_bResprayHappened, buf); + SkipSaveBuf(buf, 1); + ReadSaveBuf(&aGarages[i].m_nTargetModelIndex, buf); + SkipSaveBuf(buf, 4 + 4); + ReadSaveBuf(&aGarages[i].m_bDoor1PoolIndex, buf); + ReadSaveBuf(&aGarages[i].m_bDoor2PoolIndex, buf); + ReadSaveBuf(&aGarages[i].m_bDoor1IsDummy, buf); + ReadSaveBuf(&aGarages[i].m_bDoor2IsDummy, buf); + ReadSaveBuf(&aGarages[i].m_bRecreateDoorOnNextRefresh, buf); + ReadSaveBuf(&aGarages[i].m_bRotatedDoor, buf); + ReadSaveBuf(&aGarages[i].m_bCameraFollowsPlayer, buf); + SkipSaveBuf(buf, 1); + ReadSaveBuf(&aGarages[i].m_vecCorner1, buf); + ReadSaveBuf(&aGarages[i].m_fInfZ, buf); + ReadSaveBuf(&aGarages[i].m_vDir1, buf); + ReadSaveBuf(&aGarages[i].m_vDir2, buf); + ReadSaveBuf(&aGarages[i].m_fSupZ, buf); + ReadSaveBuf(&aGarages[i].m_fDir1Len, buf); + ReadSaveBuf(&aGarages[i].m_fDir2Len, buf); + ReadSaveBuf(&aGarages[i].m_fInfX, buf); + ReadSaveBuf(&aGarages[i].m_fSupX, buf); + ReadSaveBuf(&aGarages[i].m_fInfY, buf); + ReadSaveBuf(&aGarages[i].m_fSupY, buf); + ReadSaveBuf(&aGarages[i].m_fDoorPos, buf); + ReadSaveBuf(&aGarages[i].m_fDoorHeight, buf); + ReadSaveBuf(&aGarages[i].m_fDoor1X, buf); + ReadSaveBuf(&aGarages[i].m_fDoor1Y, buf); + ReadSaveBuf(&aGarages[i].m_fDoor2X, buf); + ReadSaveBuf(&aGarages[i].m_fDoor2Y, buf); + ReadSaveBuf(&aGarages[i].m_fDoor1Z, buf); + ReadSaveBuf(&aGarages[i].m_fDoor2Z, buf); + ReadSaveBuf(&aGarages[i].m_nTimeToStartAction, buf); + ReadSaveBuf(&aGarages[i].m_bCollectedCarsState, buf); + SkipSaveBuf(buf, 3 + 4); + SkipSaveBuf(buf, sizeof(aGarages[i].m_sStoredCar)); +#else ReadSaveBuf(&aGarages[i], buf); +#endif aGarages[i].m_pDoor1 = nil; aGarages[i].m_pDoor2 = nil; aGarages[i].m_pTarget = nil; diff --git a/src/control/Garages.h b/src/control/Garages.h index 07d5f712..358d404d 100644 --- a/src/control/Garages.h +++ b/src/control/Garages.h @@ -63,14 +63,17 @@ enum class CStoredCar { + enum { + FLAG_BULLETPROOF = 0x1, + FLAG_FIREPROOF = 0x2, + FLAG_EXPLOSIONPROOF = 0x4, + FLAG_COLLISIONPROOF = 0x8, + FLAG_MELEEPROOF = 0x10, + }; int32 m_nModelIndex; CVector m_vecPos; CVector m_vecAngle; - int32 m_bBulletproof : 1; - int32 m_bFireproof : 1; - int32 m_bExplosionproof : 1; - int32 m_bCollisionproof : 1; - int32 m_bMeleeproof : 1; + int32 m_nFlags; int8 m_nPrimaryColor; int8 m_nSecondaryColor; int8 m_nRadioStation; @@ -100,7 +103,7 @@ public: bool m_bClosingWithoutTargetCar; bool m_bDeactivated; bool m_bResprayHappened; - int m_nTargetModelIndex; + int32 m_nTargetModelIndex; CEntity *m_pDoor1; CEntity *m_pDoor2; uint8 m_bDoor1PoolIndex; diff --git a/src/control/Phones.cpp b/src/control/Phones.cpp index a962052f..41f9d766 100644 --- a/src/control/Phones.cpp +++ b/src/control/Phones.cpp @@ -18,6 +18,12 @@ #include "Replay.h" #endif +#ifdef COMPATIBLE_SAVES +#define PHONEINFO_SAVE_SIZE 0xA30 +#else +#define PHONEINFO_SAVE_SIZE sizeof(CPhoneInfo) +#endif + CPhoneInfo gPhoneInfo; bool CPhoneInfo::bDisplayingPhoneMessage; // is phone picked up @@ -201,11 +207,24 @@ INITSAVEBUF ReadSaveBuf(&m_nMax, buf); ReadSaveBuf(&m_nScriptPhonesMax, buf); for (int i = 0; i < NUMPHONES; i++) { +#ifdef COMPATIBLE_SAVES + ReadSaveBuf(&m_aPhones[i].m_vecPos, buf); + SkipSaveBuf(buf, 6 * 4); + ReadSaveBuf(&m_aPhones[i].m_repeatedMessagePickupStart, buf); + int32 tmp; + ReadSaveBuf(&tmp, buf); + // It's saved as building pool index in save file, convert it to true entity + m_aPhones[i].m_pEntity = tmp != 0 ? CPools::GetBuildingPool()->GetSlot(tmp - 1) : nil; + ReadSaveBuf(&m_aPhones[i].m_nState, buf); + ReadSaveBuf(&m_aPhones[i].m_visibleToCam, buf); + SkipSaveBuf(buf, 3); +#else ReadSaveBuf(&m_aPhones[i], buf); // It's saved as building pool index in save file, convert it to true entity if (m_aPhones[i].m_pEntity) { m_aPhones[i].m_pEntity = CPools::GetBuildingPool()->GetSlot((uintptr)m_aPhones[i].m_pEntity - 1); } +#endif } VALIDATESAVEBUF(size) } @@ -299,17 +318,29 @@ CPhoneInfo::Initialise(void) void CPhoneInfo::Save(uint8 *buf, uint32 *size) { - *size = sizeof(CPhoneInfo); + *size = PHONEINFO_SAVE_SIZE; INITSAVEBUF WriteSaveBuf(buf, m_nMax); WriteSaveBuf(buf, m_nScriptPhonesMax); for(int phoneId = 0; phoneId < NUMPHONES; phoneId++) { +#ifdef COMPATIBLE_SAVES + WriteSaveBuf(buf, m_aPhones[phoneId].m_vecPos); + ZeroSaveBuf(buf, 6 * 4); + WriteSaveBuf(buf, m_aPhones[phoneId].m_repeatedMessagePickupStart); + // Convert entity pointer to building pool index while saving + int32 tmp = m_aPhones[phoneId].m_pEntity ? CPools::GetBuildingPool()->GetJustIndex_NoFreeAssert((CBuilding*)m_aPhones[phoneId].m_pEntity) + 1 : 0; + WriteSaveBuf(buf, tmp); + WriteSaveBuf(buf, m_aPhones[phoneId].m_nState); + WriteSaveBuf(buf, m_aPhones[phoneId].m_visibleToCam); + ZeroSaveBuf(buf, 3); +#else CPhone* phone = WriteSaveBuf(buf, m_aPhones[phoneId]); // Convert entity pointer to building pool index while saving if (phone->m_pEntity) { phone->m_pEntity = (CEntity*) (CPools::GetBuildingPool()->GetJustIndex_NoFreeAssert((CBuilding*)phone->m_pEntity) + 1); } +#endif } VALIDATESAVEBUF(*size) } diff --git a/src/control/Pickups.cpp b/src/control/Pickups.cpp index fd7bfe0e..ab3e0c7c 100644 --- a/src/control/Pickups.cpp +++ b/src/control/Pickups.cpp @@ -35,6 +35,12 @@ #include "Streaming.h" #include "SaveBuf.h" +#ifdef COMPATIBLE_SAVES +#define PICKUPS_SAVE_SIZE 0x4440 +#else +#define PICKUPS_SAVE_SIZE sizeof(aPickUps) +#endif + CPickup CPickups::aPickUps[NUMPICKUPS]; int16 CPickups::NumMessages; int32 CPickups::aPickUpsCollected[NUMCOLLECTEDPICKUPS]; @@ -1442,6 +1448,31 @@ CPickups::Load(uint8 *buf, uint32 size) INITSAVEBUF for (int32 i = 0; i < NUMPICKUPS; i++) { +#ifdef COMPATIBLE_SAVES + ReadSaveBuf(&aPickUps[i].m_vecPos, buf); + ReadSaveBuf(&aPickUps[i].m_fRevenue, buf); + int32 tmp_pObject; + ReadSaveBuf(&tmp_pObject, buf); + int32 tmp_pExtraObject; + ReadSaveBuf(&tmp_pExtraObject, buf); + ReadSaveBuf(&aPickUps[i].m_nQuantity, buf); + ReadSaveBuf(&aPickUps[i].m_nTimer, buf); + ReadSaveBuf(&aPickUps[i].m_nMoneySpeed, buf); + ReadSaveBuf(&aPickUps[i].m_eModelIndex, buf); + ReadSaveBuf(&aPickUps[i].m_nIndex, buf); + memcpy(aPickUps[i].m_sTextKey, buf, sizeof(aPickUps[i].m_sTextKey)); + SkipSaveBuf(buf, sizeof(aPickUps[i].m_sTextKey)); + ReadSaveBuf(&aPickUps[i].m_eType, buf); + ReadSaveBuf(&aPickUps[i].m_bRemoved, buf); + uint8 flags; + ReadSaveBuf(&flags, buf); + aPickUps[i].m_bWasAmmoCollected = !!(flags & BIT(0)); + aPickUps[i].m_bWasControlMessageShown = !!(flags & BIT(1)); + SkipSaveBuf(buf, 3); + + aPickUps[i].m_pObject = aPickUps[i].m_eType != PICKUP_NONE && tmp_pObject != 0 ? CPools::GetObjectPool()->GetSlot(tmp_pObject - 1) : nil; + aPickUps[i].m_pExtraObject = aPickUps[i].m_eType != PICKUP_NONE && tmp_pExtraObject != 0 ? CPools::GetObjectPool()->GetSlot(tmp_pExtraObject - 1) : nil; +#else ReadSaveBuf(&aPickUps[i], buf); if (aPickUps[i].m_eType != PICKUP_NONE) { @@ -1450,7 +1481,7 @@ INITSAVEBUF if (aPickUps[i].m_pExtraObject != nil) aPickUps[i].m_pExtraObject = CPools::GetObjectPool()->GetSlot((uintptr)aPickUps[i].m_pExtraObject - 1); } - +#endif } ReadSaveBuf(&CollectedPickUpIndex, buf); @@ -1466,12 +1497,34 @@ VALIDATESAVEBUF(size) void CPickups::Save(uint8 *buf, uint32 *size) { - *size = sizeof(aPickUps); + *size = PICKUPS_SAVE_SIZE; *size += sizeof(uint16) + sizeof(uint16) + sizeof(aPickUpsCollected); INITSAVEBUF for (int32 i = 0; i < NUMPICKUPS; i++) { +#ifdef COMPATIBLE_SAVES + WriteSaveBuf(buf, aPickUps[i].m_vecPos); + WriteSaveBuf(buf, aPickUps[i].m_fRevenue); + int32 tmp = aPickUps[i].m_eType != PICKUP_NONE && aPickUps[i].m_pObject != nil ? CPools::GetObjectPool()->GetJustIndex_NoFreeAssert(aPickUps[i].m_pObject) + 1 : 0; + WriteSaveBuf(buf, tmp); + tmp = aPickUps[i].m_eType != PICKUP_NONE && aPickUps[i].m_pExtraObject != nil ? CPools::GetObjectPool()->GetJustIndex_NoFreeAssert(aPickUps[i].m_pExtraObject) + 1 : 0; + WriteSaveBuf(buf, tmp); + WriteSaveBuf(buf, aPickUps[i].m_nQuantity); + WriteSaveBuf(buf, aPickUps[i].m_nTimer); + WriteSaveBuf(buf, aPickUps[i].m_nMoneySpeed); + WriteSaveBuf(buf, aPickUps[i].m_eModelIndex); + WriteSaveBuf(buf, aPickUps[i].m_nIndex); + memcpy(buf, aPickUps[i].m_sTextKey, sizeof(aPickUps[i].m_sTextKey)); + SkipSaveBuf(buf, sizeof(aPickUps[i].m_sTextKey)); + WriteSaveBuf(buf, aPickUps[i].m_eType); + WriteSaveBuf(buf, aPickUps[i].m_bRemoved); + uint8 flags = 0; + if (aPickUps[i].m_bWasAmmoCollected) flags |= BIT(0); + if (aPickUps[i].m_bWasControlMessageShown) flags |= BIT(1); + WriteSaveBuf(buf, flags); + ZeroSaveBuf(buf, 3); +#else CPickup *buf_pickup = WriteSaveBuf(buf, aPickUps[i]); if (buf_pickup->m_eType != PICKUP_NONE) { if (buf_pickup->m_pObject != nil) @@ -1479,6 +1532,7 @@ INITSAVEBUF if (buf_pickup->m_pExtraObject != nil) buf_pickup->m_pExtraObject = (CObject*)(CPools::GetObjectPool()->GetJustIndex_NoFreeAssert(buf_pickup->m_pExtraObject) + 1); } +#endif } WriteSaveBuf(buf, CollectedPickUpIndex); diff --git a/src/control/Script5.cpp b/src/control/Script5.cpp index 2806ee30..25b29256 100644 --- a/src/control/Script5.cpp +++ b/src/control/Script5.cpp @@ -2267,33 +2267,33 @@ VALIDATESAVEBUF(size) void CRunningScript::Save(uint8*& buf) { #ifdef COMPATIBLE_SAVES - SkipSaveBuf(buf, 8); + ZeroSaveBuf(buf, 8); for (int i = 0; i < 8; i++) - WriteSaveBuf(buf, m_abScriptName[i]); - WriteSaveBuf(buf, m_nIp); + WriteSaveBuf(buf, m_abScriptName[i]); + WriteSaveBuf(buf, m_nIp); #ifdef CHECK_STRUCT_SIZES static_assert(MAX_STACK_DEPTH == 6, "Compatibility loss: MAX_STACK_DEPTH != 6"); #endif for (int i = 0; i < MAX_STACK_DEPTH; i++) - WriteSaveBuf(buf, m_anStack[i]); - WriteSaveBuf(buf, m_nStackPointer); - SkipSaveBuf(buf, 2); + WriteSaveBuf(buf, m_anStack[i]); + WriteSaveBuf(buf, m_nStackPointer); + ZeroSaveBuf(buf, 2); #ifdef CHECK_STRUCT_SIZES static_assert(NUM_LOCAL_VARS + NUM_TIMERS == 18, "Compatibility loss: NUM_LOCAL_VARS + NUM_TIMERS != 18"); #endif for (int i = 0; i < NUM_LOCAL_VARS + NUM_TIMERS; i++) - WriteSaveBuf(buf, m_anLocalVariables[i]); - WriteSaveBuf(buf, m_bIsActive); - WriteSaveBuf(buf, m_bCondResult); - WriteSaveBuf(buf, m_bIsMissionScript); - WriteSaveBuf(buf, m_bSkipWakeTime); - WriteSaveBuf(buf, m_nWakeTime); - WriteSaveBuf(buf, m_nAndOrState); - WriteSaveBuf(buf, m_bNotFlag); - WriteSaveBuf(buf, m_bDeatharrestEnabled); - WriteSaveBuf(buf, m_bDeatharrestExecuted); - WriteSaveBuf(buf, m_bMissionFlag); - SkipSaveBuf(buf, 2); + WriteSaveBuf(buf, m_anLocalVariables[i]); + WriteSaveBuf(buf, m_bIsActive); + WriteSaveBuf(buf, m_bCondResult); + WriteSaveBuf(buf, m_bIsMissionScript); + WriteSaveBuf(buf, m_bSkipWakeTime); + WriteSaveBuf(buf, m_nWakeTime); + WriteSaveBuf(buf, m_nAndOrState); + WriteSaveBuf(buf, m_bNotFlag); + WriteSaveBuf(buf, m_bDeatharrestEnabled); + WriteSaveBuf(buf, m_bDeatharrestExecuted); + WriteSaveBuf(buf, m_bMissionFlag); + ZeroSaveBuf(buf, 2); #else WriteSaveBuf(buf, *this); #endif diff --git a/src/core/Placeable.h b/src/core/Placeable.h index 9c8c292a..94be3211 100644 --- a/src/core/Placeable.h +++ b/src/core/Placeable.h @@ -33,4 +33,4 @@ public: bool IsWithinArea(float x1, float y1, float z1, float x2, float y2, float z2); }; -VALIDATE_SIZE(CPlaceable, 0x4C); +VALIDATE_SIZE(CPlaceable, 0x48); diff --git a/src/core/Pools.cpp b/src/core/Pools.cpp index d1947813..a85d6846 100644 --- a/src/core/Pools.cpp +++ b/src/core/Pools.cpp @@ -310,9 +310,9 @@ INITSAVEBUF #else if ((pVehicle->IsCar() || pVehicle->IsBoat() || pVehicle->IsBike()) && pVehicle->VehicleCreatedBy == MISSION_VEHICLE) { #endif - WriteSaveBuf(buf, pVehicle->m_vehType); - WriteSaveBuf(buf, pVehicle->GetModelIndex()); - WriteSaveBuf(buf, GetVehicleRef(pVehicle)); + WriteSaveBuf(buf, pVehicle->m_vehType); + WriteSaveBuf(buf, pVehicle->GetModelIndex()); + WriteSaveBuf(buf, GetVehicleRef(pVehicle)); pVehicle->Save(buf); } #else @@ -321,7 +321,7 @@ INITSAVEBUF #else if (pVehicle->IsCar() && pVehicle->VehicleCreatedBy == MISSION_VEHICLE) { #endif - WriteSaveBuf(buf, (uint32)pVehicle->m_vehType); + WriteSaveBuf(buf, pVehicle->m_vehType); WriteSaveBuf(buf, pVehicle->GetModelIndex()); WriteSaveBuf(buf, GetVehicleRef(pVehicle)); memcpy(buf, pVehicle, sizeof(CAutomobile)); @@ -332,7 +332,7 @@ INITSAVEBUF #else if (pVehicle->IsBoat() && pVehicle->VehicleCreatedBy == MISSION_VEHICLE) { #endif - WriteSaveBuf(buf, (uint32)pVehicle->m_vehType); + WriteSaveBuf(buf, pVehicle->m_vehType); WriteSaveBuf(buf, pVehicle->GetModelIndex()); WriteSaveBuf(buf, GetVehicleRef(pVehicle)); memcpy(buf, pVehicle, sizeof(CBoat)); @@ -343,7 +343,7 @@ INITSAVEBUF #else if (pVehicle->IsBike() && pVehicle->VehicleCreatedBy == MISSION_VEHICLE) { #endif - WriteSaveBuf(buf, (uint32)pVehicle->m_vehType); + WriteSaveBuf(buf, pVehicle->m_vehType); WriteSaveBuf(buf, pVehicle->GetModelIndex()); WriteSaveBuf(buf, GetVehicleRef(pVehicle)); memcpy(buf, pVehicle, sizeof(CBike)); diff --git a/src/core/config.h b/src/core/config.h index ff44eef1..617a1302 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -246,7 +246,8 @@ enum Config { #define FIX_BUGS // fixes bugs that we've came across during reversing. You can undefine this only on release builds. #define MORE_LANGUAGES // Add more translations to the game -#define COMPATIBLE_SAVES // this allows changing structs while keeping saves compatible +#define COMPATIBLE_SAVES // this allows changing structs while keeping saves compatible, and keeps saves compatible between platforms +#define FIX_INCOMPATIBLE_SAVES // try to fix incompatible saves, requires COMPATIBLE_SAVES #define LOAD_INI_SETTINGS // as the name suggests. fundamental for CUSTOM_FRONTEND_OPTIONS #define NO_MOVIES // add option to disable intro videos @@ -454,6 +455,7 @@ static_assert(false, "SUPPORT_XBOX_SCRIPT and SUPPORT_MOBILE_SCRIPT are mutually #define THIS_IS_STUPID #undef MORE_LANGUAGES #undef COMPATIBLE_SAVES +#undef FIX_INCOMPATIBLE_SAVES #undef LOAD_INI_SETTINGS #undef ASPECT_RATIO_SCALE diff --git a/src/entities/Entity.cpp b/src/entities/Entity.cpp index 8d51cae7..b2fcfbc7 100644 --- a/src/entities/Entity.cpp +++ b/src/entities/Entity.cpp @@ -824,7 +824,7 @@ CEntity::SaveEntityFlags(uint8*& buf) if (bStreamingDontDelete) tmp |= BIT(30); if (bRemoveFromWorld) tmp |= BIT(31); - WriteSaveBuf(buf, tmp); + WriteSaveBuf(buf, tmp); tmp = 0; @@ -845,7 +845,7 @@ CEntity::SaveEntityFlags(uint8*& buf) if (bUnderwater) tmp |= BIT(13); if (bHasPreRenderEffects) tmp |= BIT(14); - WriteSaveBuf(buf, tmp); + WriteSaveBuf(buf, tmp); } void diff --git a/src/objects/ParticleObject.cpp b/src/objects/ParticleObject.cpp index d8aa3f60..28c5240f 100644 --- a/src/objects/ParticleObject.cpp +++ b/src/objects/ParticleObject.cpp @@ -10,6 +10,12 @@ #include "DMAudio.h" #include "screendroplets.h" +#ifdef COMPATIBLE_SAVES +#define PARTICLE_OBJECT_SIZEOF 0x84 +#else +#define PARTICLE_OBJECT_SIZEOF sizeof(CParticleObject) +#endif + CParticleObject gPObjectArray[MAX_PARTICLEOBJECTS]; @@ -1051,6 +1057,48 @@ CParticleObject::UpdateFar(void) } } +#ifdef COMPATIBLE_SAVES +static inline void +SaveOneParticle(CParticleObject *p, uint8 *&buffer) +{ +#define SkipBuf(buf, num) buf += num +#define ZeroBuf(buf, num) memset(buf, 0, num); SkipBuf(buf, num) +#define CopyToBuf(buf, data) memcpy(buf, &data, sizeof(data)); SkipBuf(buf, sizeof(data)) + // CPlaceable + { + CopyToBuf(buffer, p->GetMatrix().f); + ZeroBuf(buffer, 4); + CopyToBuf(buffer, p->GetMatrix().m_hasRwMatrix); + ZeroBuf(buffer, 3); + } + + // CParticleObject + { + ZeroBuf(buffer, 4); + ZeroBuf(buffer, 4); + ZeroBuf(buffer, 4); + CopyToBuf(buffer, p->m_nRemoveTimer); + CopyToBuf(buffer, p->m_Type); + CopyToBuf(buffer, p->m_ParticleType); + CopyToBuf(buffer, p->m_nNumEffectCycles); + CopyToBuf(buffer, p->m_nSkipFrames); + CopyToBuf(buffer, p->m_nFrameCounter); + CopyToBuf(buffer, p->m_nState); + ZeroBuf(buffer, 2); + CopyToBuf(buffer, p->m_vecTarget); + CopyToBuf(buffer, p->m_fRandVal); + CopyToBuf(buffer, p->m_fSize); + CopyToBuf(buffer, p->m_Color); + CopyToBuf(buffer, p->m_bRemove); + CopyToBuf(buffer, p->m_nCreationChance); + ZeroBuf(buffer, 2); + } +#undef SkipBuf +#undef ZeroBuf +#undef CopyToBuf +} +#endif + bool CParticleObject::SaveParticle(uint8 *buffer, uint32 *length) { @@ -1068,27 +1116,35 @@ CParticleObject::SaveParticle(uint8 *buffer, uint32 *length) *(int32 *)buffer = numObjects; buffer += sizeof(int32); - int32 objectsLength = sizeof(CParticleObject) * (numObjects + 1); + int32 objectsLength = PARTICLE_OBJECT_SIZEOF * (numObjects + 1); int32 dataLength = objectsLength + sizeof(int32); for ( CParticleObject *p = pCloseListHead; p != nil; p = p->m_pNext ) { -#if 0 // todo better +#ifdef COMPATIBLE_SAVES + SaveOneParticle(p, buffer); +#else +#ifdef THIS_IS_STUPID *(CParticleObject*)buffer = *p; #else memcpy(buffer, p, sizeof(CParticleObject)); #endif buffer += sizeof(CParticleObject); +#endif } for ( CParticleObject *p = pFarListHead; p != nil; p = p->m_pNext ) { -#if 0 // todo better +#ifdef COMPATIBLE_SAVES + SaveOneParticle(p, buffer); +#else +#ifdef THIS_IS_STUPID *(CParticleObject*)buffer = *p; #else memcpy(buffer, p, sizeof(CParticleObject)); #endif buffer += sizeof(CParticleObject); +#endif } *length = dataLength; @@ -1106,7 +1162,7 @@ CParticleObject::LoadParticle(uint8 *buffer, uint32 length) int32 numObjects = *(int32 *)buffer; buffer += sizeof(int32); - if ( length != sizeof(CParticleObject) * (numObjects + 1) + sizeof(int32) ) + if ( length != PARTICLE_OBJECT_SIZEOF * (numObjects + 1) + sizeof(int32) ) return false; if ( numObjects == 0 ) @@ -1117,14 +1173,17 @@ CParticleObject::LoadParticle(uint8 *buffer, uint32 length) while ( i < numObjects ) { CParticleObject *dst = pUnusedListHead; +#ifndef COMPATIBLE_SAVES CParticleObject *src = (CParticleObject *)buffer; buffer += sizeof(CParticleObject); +#endif if ( dst == nil ) return false; MoveToList(&pUnusedListHead, &pCloseListHead, dst); - + +#ifndef COMPATIBLE_SAVES dst->m_nState = POBJECTSTATE_UPDATE_CLOSE; dst->m_Type = src->m_Type; dst->m_ParticleType = src->m_ParticleType; @@ -1140,6 +1199,46 @@ CParticleObject::LoadParticle(uint8 *buffer, uint32 length) dst->m_nNumEffectCycles = src->m_nNumEffectCycles; dst->m_nSkipFrames = src->m_nSkipFrames; dst->m_nCreationChance = src->m_nCreationChance; +#else + dst->m_nState = POBJECTSTATE_UPDATE_CLOSE; + dst->m_pParticle = NULL; + +#define SkipBuf(buf, num) buf += num +#define CopyFromBuf(buf, data) memcpy(&data, buf, sizeof(data)); SkipBuf(buf, sizeof(data)) + // CPlaceable + { + CMatrix matrix; + CopyFromBuf(buffer, matrix.f); + SkipBuf(buffer, 4); + CopyFromBuf(buffer, matrix.m_hasRwMatrix); + SkipBuf(buffer, 3); + dst->SetPosition(matrix.GetPosition()); + } + + // CParticleObject + { + SkipBuf(buffer, 4); + SkipBuf(buffer, 4); + SkipBuf(buffer, 4); + CopyFromBuf(buffer, dst->m_nRemoveTimer); + CopyFromBuf(buffer, dst->m_Type); + CopyFromBuf(buffer, dst->m_ParticleType); + CopyFromBuf(buffer, dst->m_nNumEffectCycles); + CopyFromBuf(buffer, dst->m_nSkipFrames); + CopyFromBuf(buffer, dst->m_nFrameCounter); + SkipBuf(buffer, 2); + SkipBuf(buffer, 2); + CopyFromBuf(buffer, dst->m_vecTarget); + CopyFromBuf(buffer, dst->m_fRandVal); + CopyFromBuf(buffer, dst->m_fSize); + CopyFromBuf(buffer, dst->m_Color); + CopyFromBuf(buffer, dst->m_bRemove); + CopyFromBuf(buffer, dst->m_nCreationChance); + SkipBuf(buffer, 2); + } +#undef CopyFromBuf +#undef SkipBuf +#endif i++; } diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp index 44712fa0..7fe2520d 100644 --- a/src/peds/Ped.cpp +++ b/src/peds/Ped.cpp @@ -9585,19 +9585,19 @@ CPed::Say(uint16 audio, int32 time) void CPed::Save(uint8*& buf) { - SkipSaveBuf(buf, 52); + ZeroSaveBuf(buf, 52); CopyToBuf(buf, GetPosition().x); CopyToBuf(buf, GetPosition().y); CopyToBuf(buf, GetPosition().z); - SkipSaveBuf(buf, 288); + ZeroSaveBuf(buf, 288); CopyToBuf(buf, CharCreatedBy); - SkipSaveBuf(buf, 499); + ZeroSaveBuf(buf, 499); CopyToBuf(buf, m_fHealth); CopyToBuf(buf, m_fArmour); - SkipSaveBuf(buf, 172); + ZeroSaveBuf(buf, 172); for (int i = 0; i < 10; i++) // has to be hardcoded m_weapons[i].Save(buf); - SkipSaveBuf(buf, 252); + ZeroSaveBuf(buf, 252); } void diff --git a/src/peds/PlayerPed.cpp b/src/peds/PlayerPed.cpp index 9f75b155..8225189f 100644 --- a/src/peds/PlayerPed.cpp +++ b/src/peds/PlayerPed.cpp @@ -2188,14 +2188,14 @@ void CPlayerPed::Save(uint8*& buf) { CPed::Save(buf); - SkipSaveBuf(buf, 16); + ZeroSaveBuf(buf, 16); CopyToBuf(buf, m_fMaxStamina); - SkipSaveBuf(buf, 28); + ZeroSaveBuf(buf, 28); CopyToBuf(buf, m_nTargettableObjects[0]); CopyToBuf(buf, m_nTargettableObjects[1]); CopyToBuf(buf, m_nTargettableObjects[2]); CopyToBuf(buf, m_nTargettableObjects[3]); - SkipSaveBuf(buf, 164); + ZeroSaveBuf(buf, 164); } void diff --git a/src/render/Fluff.cpp b/src/render/Fluff.cpp index 13dba1a6..1e4d289b 100644 --- a/src/render/Fluff.cpp +++ b/src/render/Fluff.cpp @@ -25,6 +25,12 @@ #include "Coronas.h" #include "SaveBuf.h" +#ifdef COMPATIBLE_SAVES +#define SCRIPTPATHS_SAVE_SIZE 0x9C +#else +#define SCRIPTPATHS_SAVE_SIZE sizeof(aArray) +#endif + CPlaneTrail CPlaneTrails::aArray[6]; RwImVertexIndex TrailIndices[32] = { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, @@ -1268,14 +1274,34 @@ INITSAVEBUF aArray[i].Clear(); for (int32 i = 0; i < 3; i++) { +#ifdef COMPATIBLE_SAVES + ReadSaveBuf(&aArray[i].m_numNodes, buf); + SkipSaveBuf(buf, 4); + ReadSaveBuf(&aArray[i].m_fTotalLength, buf); + ReadSaveBuf(&aArray[i].m_fSpeed, buf); + ReadSaveBuf(&aArray[i].m_fPosition, buf); + ReadSaveBuf(&aArray[i].m_fObjectLength, buf); + ReadSaveBuf(&aArray[i].m_state, buf); +#else ReadSaveBuf(&aArray[i], buf); +#endif for (int32 j = 0; j < 6; j++) { +#ifdef COMPATIBLE_SAVES + aArray[i].m_pObjects[j] = nil; + int32 tmp; + ReadSaveBuf(&tmp, buf); + if (tmp != 0) { + aArray[i].m_pObjects[j] = CPools::GetObjectPool()->GetSlot(tmp - 1); + aArray[i].m_pObjects[j]->m_phy_flagA08 = false; + } +#else CScriptPath *pPath = &aArray[i]; if (pPath->m_pObjects[j] != nil) { pPath->m_pObjects[j] = CPools::GetObjectPool()->GetSlot((uintptr)pPath->m_pObjects[j] - 1); pPath->m_pObjects[j]->m_phy_flagA08 = false; } +#endif } aArray[i].m_pNode = new CPlaneNode[aArray[i].m_numNodes]; @@ -1287,14 +1313,28 @@ VALIDATESAVEBUF(size) } void CScriptPaths::Save(uint8 *buf, uint32 *size) { - *size = sizeof(aArray); + *size = SCRIPTPATHS_SAVE_SIZE; INITSAVEBUF for (int32 i = 0; i < 3; i++) { +#ifdef COMPATIBLE_SAVES + WriteSaveBuf(buf, aArray[i].m_numNodes); + ZeroSaveBuf(buf, 4); + WriteSaveBuf(buf, aArray[i].m_fTotalLength); + WriteSaveBuf(buf, aArray[i].m_fSpeed); + WriteSaveBuf(buf, aArray[i].m_fPosition); + WriteSaveBuf(buf, aArray[i].m_fObjectLength); + WriteSaveBuf(buf, aArray[i].m_state); +#else CScriptPath *pPath = WriteSaveBuf(buf, aArray[i]); +#endif for (int32 j = 0; j < 6; j++) { +#ifdef COMPATIBLE_SAVES + WriteSaveBuf(buf, aArray[i].m_pObjects[j] != nil ? CPools::GetObjectPool()->GetJustIndex_NoFreeAssert(aArray[i].m_pObjects[j]) + 1 : 0); +#else if (pPath->m_pObjects[j] != nil) pPath->m_pObjects[j] = (CObject*)(CPools::GetObjectPool()->GetJustIndex_NoFreeAssert(pPath->m_pObjects[j]) + 1); +#endif } for (int32 j = 0; j < aArray[i].m_numNodes; j++) { diff --git a/src/save/GenericGameStorage.cpp b/src/save/GenericGameStorage.cpp index a56ff2c3..12565e3f 100644 --- a/src/save/GenericGameStorage.cpp +++ b/src/save/GenericGameStorage.cpp @@ -643,6 +643,525 @@ align4bytes(int32 size) return (size + 3) & 0xFFFFFFFC; } +#ifdef FIX_INCOMPATIBLE_SAVES +#define LoadSaveDataBlockNoCheck(buf, file, size) \ +do { \ + CFileMgr::Read(file, (const char *)&size, sizeof(size)); \ + size = align4bytes(size); \ + CFileMgr::Read(file, (const char *)work_buff, size); \ + buf = work_buff; \ +} while(0) + +#define WriteSavaDataBlockNoFunc(buf, file, size) \ +do { \ + if (!PcSaveHelper.PcClassSaveRoutine(file, buf, size)) \ + goto fail; \ + totalSize += size; \ +} while(0) + +#define FixSaveDataBlock(fix_func, file, size) \ +do { \ + ReadDataFromBufferPointer(buf, size); \ + memset(work_buff2, 0, sizeof(work_buff2)); \ + buf2 = work_buff2; \ + reserved = 0; \ + MakeSpaceForSizeInBufferPointer(presize, buf2, postsize); \ + fix_func(save_type, buf, buf2, &size); \ + CopySizeAndPreparePointer(presize, buf2, postsize, reserved, size); \ + if (!PcSaveHelper.PcClassSaveRoutine(file, work_buff2, buf2 - work_buff2)) \ + goto fail; \ + totalSize += buf2 - work_buff2; \ +} while(0) + +#define ReadDataFromBufferPointerWithSize(buf, to, size) memcpy(&to, buf, size); buf += align4bytes(size) + +#define ReadBuf(buf, to) memcpy(&to, buf, sizeof(to)); buf += sizeof(to) +#define WriteBuf(buf, from) memcpy(buf, &from, sizeof(from)); buf += sizeof(from) +#define CopyBuf(from, to, size) memcpy(to, from, size); to += (size); from += (size) +#define CopyPtr(from, to) memcpy(to, from, 4); to += 4; from += 8 +#define SkipBuf(buf, size) buf += (size) +#define SkipBoth(from, to, size) to += (size); from += (size) +#define SkipPtr(from, to) to += 4; from += 8 + +// unfortunately we need a 2nd buffer of the same size to store the fixed output ... +static uint8 work_buff2[sizeof(work_buff)]; + +enum +{ + SAVE_TYPE_NONE = 0, + SAVE_TYPE_32_BIT = 1, + SAVE_TYPE_64_BIT = 2, + SAVE_TYPE_MSVC = 4, + SAVE_TYPE_GCC = 8, +}; + +uint8 +GetSaveType(char *savename) +{ + uint8 save_type = SAVE_TYPE_NONE; + int file = CFileMgr::OpenFile(savename, "rb"); + + uint32 size; + CFileMgr::Read(file, (const char *)&size, sizeof(size)); + + uint8 *buf = work_buff; + CFileMgr::Read(file, (const char *)work_buff, size); // simple vars + scripts + + LoadSaveDataBlockNoCheck(buf, file, size); // ped pool + + LoadSaveDataBlockNoCheck(buf, file, size); // garages + ReadDataFromBufferPointer(buf, size); + + // store for later after we know how much data we need to skip + ReadDataFromBufferPointerWithSize(buf, work_buff2, size); + + LoadSaveDataBlockNoCheck(buf, file, size); // game logic + LoadSaveDataBlockNoCheck(buf, file, size); // vehicle pool + LoadSaveDataBlockNoCheck(buf, file, size); // object pool + LoadSaveDataBlockNoCheck(buf, file, size); // paths + + LoadSaveDataBlockNoCheck(buf, file, size); // cranes + + CFileMgr::CloseFile(file); + + ReadDataFromBufferPointer(buf, size); + + if (size == 1000) + save_type |= SAVE_TYPE_32_BIT; + else if (size == 1160) + save_type |= SAVE_TYPE_64_BIT; + else + assert(0); // this should never happen + + buf = work_buff2; + + buf += 1964; // skip everything before the first garage + buf += save_type & SAVE_TYPE_32_BIT ? 28 : 40; // skip first garage up to m_vecCorner1 + + CVector2D vecCorner1; + float fInfZ, fSupZ; + + ReadBuf(buf, vecCorner1); + ReadBuf(buf, fInfZ); + SkipBuf(buf, sizeof(CVector2D)); + SkipBuf(buf, sizeof(CVector2D)); + ReadBuf(buf, fSupZ); + + // SET_GARAGE -914.129028 -1263.540039 10.706000 -907.137024 -1246.625977 -906.299988 -1266.900024 14.421000 + if (vecCorner1.x == -914.129028f && vecCorner1.y == -1263.540039f && + fInfZ == 10.706000f && fSupZ == 14.421000f) + save_type |= SAVE_TYPE_MSVC; + else + save_type |= SAVE_TYPE_GCC; + + return save_type; +} + +static void +FixGarages(uint8 save_type, uint8 *buf, uint8 *buf2, uint32 *size) +{ + // hardcoded: 7876 + // x86 msvc: 7340 + // x86 gcc: 7020 + // amd64 msvc: 7852 + // amd64 gcc: 7660 + + uint8 *buf_start = buf; + uint8 *buf2_start = buf2; + uint32 read; + uint32 written = 7340; + + if (save_type & SAVE_TYPE_32_BIT && save_type & SAVE_TYPE_GCC) + read = 7020; + else if (save_type & SAVE_TYPE_64_BIT && save_type & SAVE_TYPE_GCC) + read = 7660; + else + read = 7852; + + uint32 ptrsize = save_type & SAVE_TYPE_32_BIT ? 4 : 8; + + CopyBuf(buf, buf2, 4 * 6); + CopyBuf(buf, buf2, 4 * TOTAL_COLLECTCARS_GARAGES); + CopyBuf(buf, buf2, 4); + + if (save_type & SAVE_TYPE_GCC) + { + for (int32 i = 0; i < NUM_GARAGE_STORED_CARS; i++) + { + for (int32 j = 0; j < TOTAL_HIDEOUT_GARAGES; j++) + { + CopyBuf(buf, buf2, 4 + sizeof(CVector) + sizeof(CVector)); + uint8 nFlags8; + ReadBuf(buf, nFlags8); + int32 nFlags32 = nFlags8; + WriteBuf(buf2, nFlags32); + CopyBuf(buf, buf2, 1 * 6); + SkipBuf(buf, 1); + SkipBuf(buf2, 2); + } + } + } + else + { + CopyBuf(buf, buf2, sizeof(CStoredCar) * NUM_GARAGE_STORED_CARS * TOTAL_HIDEOUT_GARAGES); + } + + for (int32 i = 0; i < NUM_GARAGES; i++) + { + CopyBuf(buf, buf2, 1 * 7); + SkipBoth(buf, buf2, 1); + CopyBuf(buf, buf2, 4); + SkipBuf(buf, ptrsize - 4); // write 4 bytes padding if 8 byte pointer, if not, write 0 + SkipBuf(buf, ptrsize * 2); + SkipBuf(buf2, 4 * 2); + CopyBuf(buf, buf2, 1 * 7); + SkipBoth(buf, buf2, 1); + CopyBuf(buf, buf2, sizeof(CVector2D) * 3 + 4 * 17 + 1); + SkipBoth(buf, buf2, 3); + SkipBuf(buf, ptrsize); + SkipBuf(buf2, 4); + + if (save_type & SAVE_TYPE_GCC) + SkipBuf(buf, save_type & SAVE_TYPE_64_BIT ? 36 + 4 : 36); // sizeof(CStoredCar) on gcc 64/32 before fix + else + SkipBuf(buf, sizeof(CStoredCar)); + + SkipBuf(buf2, sizeof(CStoredCar)); + } +} + +static void +FixCranes(uint8 save_type, uint8 *buf, uint8 *buf2, uint32 *size) +{ + uint8 *buf_start = buf; + uint8 *buf2_start = buf2; + uint32 read = 2 * sizeof(uint32) + 0x480; // sizeof(aCranes) + uint32 written = 2 * sizeof(uint32) + 0x3E0; // see CRANES_SAVE_SIZE + + CopyBuf(buf, buf2, 4 + 4); + + for (int32 i = 0; i < NUM_CRANES; i++) + { + CopyPtr(buf, buf2); + CopyPtr(buf, buf2); + CopyBuf(buf, buf2, 14 * 4 + sizeof(CVector) * 3 + sizeof(CVector2D)); + SkipBuf(buf, 4); + CopyPtr(buf, buf2); + CopyBuf(buf, buf2, 4 + 7 * 1); + SkipBuf(buf, 5); + SkipBuf(buf2, 1); + } + + *size = 0; + + assert(buf - buf_start == read); + assert(buf2 - buf2_start == written); + + *size = written; +} + +static void +FixPickups(uint8 save_type, uint8 *buf, uint8 *buf2, uint32 *size) +{ + uint8 *buf_start = buf; + uint8 *buf2_start = buf2; + uint32 read = 0x5400 + sizeof(uint16) + sizeof(uint16) + sizeof(int32) * NUMCOLLECTEDPICKUPS; // sizeof(aPickUps) + uint32 written = 0x4440 + sizeof(uint16) + sizeof(uint16) + sizeof(int32) * NUMCOLLECTEDPICKUPS; // see PICKUPS_SAVE_SIZE + + for (int32 i = 0; i < NUMPICKUPS; i++) + { + CopyBuf(buf, buf2, sizeof(CVector) + 4); + CopyPtr(buf, buf2); + CopyPtr(buf, buf2); + CopyBuf(buf, buf2, 4 * 2 + 2 * 3 + 8 + 1 * 3); + SkipBuf(buf, 7); + SkipBuf(buf2, 3); + } + + CopyBuf(buf, buf2, 2); + SkipBoth(buf, buf2, 2); + + CopyBuf(buf, buf2, NUMCOLLECTEDPICKUPS * 4); + + *size = 0; + + assert(buf - buf_start == read); + assert(buf2 - buf2_start == written); + + *size = written; +} + +static void +FixPhoneInfo(uint8 save_type, uint8 *buf, uint8 *buf2, uint32 *size) +{ + uint8 *buf_start = buf; + uint8 *buf2_start = buf2; + uint32 read = 0x1138; // sizeof(CPhoneInfo) + uint32 written = 0xA30; // see PHONEINFO_SAVE_SIZE + + CopyBuf(buf, buf2, 4 + 4); + + for (int32 i = 0; i < NUMPHONES; i++) + { + CopyBuf(buf, buf2, sizeof(CVector)); + SkipBuf(buf, 4); + SkipPtr(buf, buf2); + SkipPtr(buf, buf2); + SkipPtr(buf, buf2); + SkipPtr(buf, buf2); + SkipPtr(buf, buf2); + SkipPtr(buf, buf2); + CopyBuf(buf, buf2, 4); + SkipBuf(buf, 4); + CopyPtr(buf, buf2); + CopyBuf(buf, buf2, 4 + 1); + SkipBoth(buf, buf2, 3); + } + + *size = 0; + + assert(buf - buf_start == read); + assert(buf2 - buf2_start == written); + + *size = written; +} + +static void +FixParticles(uint8 save_type, uint8 *buf, uint8 *buf2, uint32 *size) +{ + uint8 *buf_start = buf; + uint8 *buf2_start = buf2; + + int32 numObjects; + ReadBuf(buf, numObjects); + WriteBuf(buf2, numObjects); + + uint32 read = 0x98 * (numObjects + 1) + 4; // sizeof(CParticleObject) + uint32 written = 0x84 * (numObjects + 1) + 4; // see PARTICLE_OBJECT_SIZEOF + + for (int32 i = 0; i < numObjects; i++) + { + // CPlaceable + CopyBuf(buf, buf2, 4 * 4 * 4); + SkipPtr(buf, buf2); + CopyBuf(buf, buf2, 1); + SkipBuf(buf, 7); + SkipBuf(buf2, 3); + + // CParticleObject + SkipPtr(buf, buf2); + SkipPtr(buf, buf2); + SkipPtr(buf, buf2); + CopyBuf(buf, buf2, 4 * 3 + 2 * 1 + 2 * 2); + SkipBoth(buf, buf2, 2); + CopyBuf(buf, buf2, sizeof(CVector) + 2 * 4 + sizeof(CRGBA) + 2 * 1); + SkipBoth(buf, buf2, 2); + } + + SkipBuf(buf, 0x98); // sizeof(CParticleObject) + SkipBuf(buf2, 0x84); // see PARTICLE_OBJECT_SIZEOF + + *size = 0; + + assert(buf - buf_start == read); + assert(buf2 - buf2_start == written); + + *size = written; +} + +static void +FixScriptPaths(uint8 save_type, uint8 *buf, uint8 *buf2, uint32 *size) +{ + uint8 *buf_start = buf; + uint8 *buf2_start = buf2; + uint32 read = 0x108; // sizeof(CScriptPath) * 3 + uint32 written = 0x9C; // see SCRIPTPATHS_SAVE_SIZE + + for (int32 i = 0; i < 3; i++) + { + int32 numNodes; + ReadBuf(buf, numNodes); + WriteBuf(buf2, numNodes); + SkipBuf(buf, 4); + SkipPtr(buf, buf2); + CopyBuf(buf, buf2, 4 * 5); + SkipBuf(buf, 4); + + for (int32 i = 0; i < 6; i++) + { + CopyPtr(buf, buf2); + } + + for (int32 i = 0; i < numNodes; i++) + { + CopyBuf(buf, buf2, sizeof(CPlaneNode)); + read += sizeof(CPlaneNode); + written += sizeof(CPlaneNode); + } + } + + *size = 0; + + assert(buf - buf_start == read); + assert(buf2 - buf2_start == written); + + *size = written; +} + +bool +FixSave(int32 slot, uint8 save_type) +{ + if (save_type & SAVE_TYPE_32_BIT && save_type & SAVE_TYPE_MSVC) + return true; + + bool success = false; + + uint8 *buf, *presize, *postsize, *buf2; + uint32 size; + uint32 reserved; + + uint32 totalSize; + + char savename[MAX_PATH]; + char savename_bak[MAX_PATH]; + + sprintf(savename, "%s%i%s", DefaultPCSaveFileName, slot + 1, ".b"); + sprintf(savename_bak, "%s%i%s.%lld.bak", DefaultPCSaveFileName, slot + 1, ".b", time(nil)); + + assert(caserename(savename, savename_bak) == 0); + + int file_in = CFileMgr::OpenFile(savename_bak, "rb"); + int file_out = CFileMgr::OpenFileForWriting(savename); + + CheckSum = 0; + totalSize = 0; + + CFileMgr::Read(file_in, (const char *)&size, sizeof(size)); + + buf = work_buff; + CFileMgr::Read(file_in, (const char *)work_buff, size); // simple vars + scripts + + WriteSavaDataBlockNoFunc(buf, file_out, size); + + LoadSaveDataBlockNoCheck(buf, file_in, size); // ped pool + WriteSavaDataBlockNoFunc(buf, file_out, size); + + LoadSaveDataBlockNoCheck(buf, file_in, size); // garages + FixSaveDataBlock(FixGarages, file_out, size); // garages need to be fixed in either case + + LoadSaveDataBlockNoCheck(buf, file_in, size); // game logic + WriteSavaDataBlockNoFunc(buf, file_out, size); + + LoadSaveDataBlockNoCheck(buf, file_in, size); // vehicle pool + WriteSavaDataBlockNoFunc(buf, file_out, size); + + LoadSaveDataBlockNoCheck(buf, file_in, size); // object pool + WriteSavaDataBlockNoFunc(buf, file_out, size); + + LoadSaveDataBlockNoCheck(buf, file_in, size); // paths + WriteSavaDataBlockNoFunc(buf, file_out, size); + + LoadSaveDataBlockNoCheck(buf, file_in, size); // cranes + if (save_type & SAVE_TYPE_64_BIT) + FixSaveDataBlock(FixCranes, file_out, size); + else + WriteSavaDataBlockNoFunc(buf, file_out, size); + + LoadSaveDataBlockNoCheck(buf, file_in, size); // pickups + if (save_type & SAVE_TYPE_64_BIT) + FixSaveDataBlock(FixPickups, file_out, size); + else + WriteSavaDataBlockNoFunc(buf, file_out, size); + + LoadSaveDataBlockNoCheck(buf, file_in, size); // phoneinfo + if (save_type & SAVE_TYPE_64_BIT) + FixSaveDataBlock(FixPhoneInfo, file_out, size); + else + WriteSavaDataBlockNoFunc(buf, file_out, size); + + LoadSaveDataBlockNoCheck(buf, file_in, size); // restart + WriteSavaDataBlockNoFunc(buf, file_out, size); + + LoadSaveDataBlockNoCheck(buf, file_in, size); // radar blips + WriteSavaDataBlockNoFunc(buf, file_out, size); + + LoadSaveDataBlockNoCheck(buf, file_in, size); // zones + WriteSavaDataBlockNoFunc(buf, file_out, size); + + LoadSaveDataBlockNoCheck(buf, file_in, size); // gang data + WriteSavaDataBlockNoFunc(buf, file_out, size); + + LoadSaveDataBlockNoCheck(buf, file_in, size); // car generators + WriteSavaDataBlockNoFunc(buf, file_out, size); + + LoadSaveDataBlockNoCheck(buf, file_in, size); // particles + if (save_type & SAVE_TYPE_64_BIT) + FixSaveDataBlock(FixParticles, file_out, size); + else + WriteSavaDataBlockNoFunc(buf, file_out, size); + + LoadSaveDataBlockNoCheck(buf, file_in, size); // audio script objects + WriteSavaDataBlockNoFunc(buf, file_out, size); + + LoadSaveDataBlockNoCheck(buf, file_in, size); // script paths + if (save_type & SAVE_TYPE_64_BIT) + FixSaveDataBlock(FixScriptPaths, file_out, size); + else + WriteSavaDataBlockNoFunc(buf, file_out, size); + + LoadSaveDataBlockNoCheck(buf, file_in, size); // player info + WriteSavaDataBlockNoFunc(buf, file_out, size); + + LoadSaveDataBlockNoCheck(buf, file_in, size); // stats + WriteSavaDataBlockNoFunc(buf, file_out, size); + + LoadSaveDataBlockNoCheck(buf, file_in, size); // set pieces + WriteSavaDataBlockNoFunc(buf, file_out, size); + + LoadSaveDataBlockNoCheck(buf, file_in, size); // streaming + WriteSavaDataBlockNoFunc(buf, file_out, size); + + LoadSaveDataBlockNoCheck(buf, file_in, size); // ped type + WriteSavaDataBlockNoFunc(buf, file_out, size); + + memset(work_buff, 0, sizeof(work_buff)); + + for (int i = 0; i < 4; i++) { + size = align4bytes(SIZE_OF_ONE_GAME_IN_BYTES - totalSize - 4); + if (size > sizeof(work_buff)) + size = sizeof(work_buff); + if (size > 4) { + if (!PcSaveHelper.PcClassSaveRoutine(file_out, work_buff, size)) + goto fail; + totalSize += size; + } + } + + if (!CFileMgr::Write(file_out, (const char *)&CheckSum, sizeof(CheckSum))) + goto fail; + + success = true; + +fail:; + CFileMgr::CloseFile(file_in); + CFileMgr::CloseFile(file_out); + + return success; +} + +#undef LoadSaveDataBlockNoCheck +#undef WriteSavaDataBlockNoFunc +#undef FixSaveDataBlock +#undef ReadDataFromBufferPointerWithSize +#undef ReadBuf +#undef WriteBuf +#undef CopyBuf +#undef CopyPtr +#undef SkipBuf +#undef SkipBoth +#undef SkipPtr +#endif + #ifdef MISSION_REPLAY void DisplaySaveResult(int unk, char* name) diff --git a/src/save/GenericGameStorage.h b/src/save/GenericGameStorage.h index 65f1cc16..b2bf7a24 100644 --- a/src/save/GenericGameStorage.h +++ b/src/save/GenericGameStorage.h @@ -25,6 +25,11 @@ bool CheckDataNotCorrupt(int32 slot, char *name); bool RestoreForStartLoad(); int align4bytes(int32 size); +#ifdef FIX_INCOMPATIBLE_SAVES +uint8 GetSaveType(char *savename); +bool FixSave(int32 slot, uint8 save_type); +#endif + extern char DefaultPCSaveFileName[260]; extern char ValidSaveName[260]; extern char LoadFileName[256]; diff --git a/src/save/PCSave.cpp b/src/save/PCSave.cpp index c9045705..a33e9d90 100644 --- a/src/save/PCSave.cpp +++ b/src/save/PCSave.cpp @@ -122,6 +122,13 @@ C_PcSave::PopulateSlotInfo() } if (Slots[i] == SLOT_OK) { if (CheckDataNotCorrupt(i, savename)) { +#ifdef FIX_INCOMPATIBLE_SAVES + if (!FixSave(i, GetSaveType(savename))) { + CMessages::InsertNumberInString(TheText.Get("FEC_SLC"), i + 1, -1, -1, -1, -1, -1, SlotFileName[i]); + Slots[i] = SLOT_CORRUPTED; + continue; + } +#endif SYSTEMTIME st; memcpy(&st, &header.SaveDateTime, sizeof(SYSTEMTIME)); const char *month; diff --git a/src/save/PCSave.h b/src/save/PCSave.h index 2e85867a..2a29fa95 100644 --- a/src/save/PCSave.h +++ b/src/save/PCSave.h @@ -33,7 +33,7 @@ public: void PopulateSlotInfo(); bool DeleteSlot(int32 slot); int8 SaveSlot(int32 slot); - bool PcClassSaveRoutine(int32 a2, uint8 *data, uint32 size); + bool PcClassSaveRoutine(int32 file, uint8 *data, uint32 size); static void SetSaveDirectory(const char *path); }; diff --git a/src/save/SaveBuf.h b/src/save/SaveBuf.h index 6e9b3ae9..d0817e9a 100644 --- a/src/save/SaveBuf.h +++ b/src/save/SaveBuf.h @@ -64,6 +64,14 @@ WriteSaveBuf(uint8 *&buf, uint32 &length, const T &value) return p; } +#ifdef COMPATIBLE_SAVES +inline void +ZeroSaveBuf(uint8 *&buf, uint32 length) +{ + memset(buf, 0, length); + SkipSaveBuf(buf, length); +} +#endif #define SAVE_HEADER_SIZE (4*sizeof(char)+sizeof(uint32)) diff --git a/src/skel/crossplatform.cpp b/src/skel/crossplatform.cpp index 68df6704..f7016b21 100644 --- a/src/skel/crossplatform.cpp +++ b/src/skel/crossplatform.cpp @@ -155,6 +155,29 @@ FILE* _fcaseopen(char const* filename, char const* mode) return result; } +int _caserename(const char *old_filename, const char *new_filename) +{ + int result; + char *real_old = casepath(old_filename); + char *real_new = casepath(new_filename); + + // hack so we don't even try to rename it to new_filename if it already exists + if (!real_new) { + free(real_old); + return -1; + } + + if (!real_old) + result = rename(old_filename, real_new); + else + result = rename(real_old, real_new); + + free(real_old); + free(real_new); + + return result; +} + // Case-insensitivity on linux (from https://github.com/OneSadCookie/fcaseopen) // Returned string should freed manually (if exists) char* casepath(char const* path, bool checkPathFirst) diff --git a/src/skel/crossplatform.h b/src/skel/crossplatform.h index a073f854..f37e64a1 100644 --- a/src/skel/crossplatform.h +++ b/src/skel/crossplatform.h @@ -33,6 +33,7 @@ char *_strdate(char *buf); #endif extern DWORD _dwOperatingSystemVersion; #define fcaseopen fopen +#define caserename rename #else char *strupr(char *str); char *strlwr(char *str); @@ -55,6 +56,8 @@ extern long _dwOperatingSystemVersion; char *casepath(char const *path, bool checkPathFirst = true); FILE *_fcaseopen(char const *filename, char const *mode); #define fcaseopen _fcaseopen +int _caserename(const char *old_filename, const char *new_filename); +#define caserename _caserename #endif #ifdef RW_GL3 diff --git a/src/vehicles/Automobile.cpp b/src/vehicles/Automobile.cpp index 8a50ddcf..5e2b0c10 100644 --- a/src/vehicles/Automobile.cpp +++ b/src/vehicles/Automobile.cpp @@ -5871,7 +5871,7 @@ CAutomobile::Save(uint8*& buf) { CVehicle::Save(buf); WriteSaveBuf(buf, Damage); - SkipSaveBuf(buf, 1500 - 672 - sizeof(CDamageManager)); + ZeroSaveBuf(buf, 1500 - 672 - sizeof(CDamageManager)); } void diff --git a/src/vehicles/Bike.cpp b/src/vehicles/Bike.cpp index c42d342e..a65b64d2 100644 --- a/src/vehicles/Bike.cpp +++ b/src/vehicles/Bike.cpp @@ -2950,7 +2950,7 @@ void CBike::Save(uint8*& buf) { CVehicle::Save(buf); - SkipSaveBuf(buf, 1260 - 672); + ZeroSaveBuf(buf, 1260 - 672); } void diff --git a/src/vehicles/Boat.cpp b/src/vehicles/Boat.cpp index 85a41099..73957107 100644 --- a/src/vehicles/Boat.cpp +++ b/src/vehicles/Boat.cpp @@ -1477,7 +1477,7 @@ void CBoat::Save(uint8*& buf) { CVehicle::Save(buf); - SkipSaveBuf(buf, 1216 - 672); + ZeroSaveBuf(buf, 1216 - 672); } void diff --git a/src/vehicles/Cranes.cpp b/src/vehicles/Cranes.cpp index f217f055..934ccb08 100644 --- a/src/vehicles/Cranes.cpp +++ b/src/vehicles/Cranes.cpp @@ -37,6 +37,12 @@ #define MIN_VALID_POSITION (-10000.0f) #define DEFAULT_OFFSET (20.0f) +#ifdef COMPATIBLE_SAVES +#define CRANES_SAVE_SIZE 0x3E0 +#else +#define CRANES_SAVE_SIZE sizeof(aCranes) +#endif + uint32 TimerForCamInterpolation; uint32 CCranes::CarsCollectedMilitaryCrane; @@ -622,10 +628,45 @@ void CCranes::Save(uint8* buf, uint32* size) { INITSAVEBUF - *size = 2 * sizeof(uint32) + sizeof(aCranes); + *size = 2 * sizeof(uint32) + CRANES_SAVE_SIZE; WriteSaveBuf(buf, NumCranes); WriteSaveBuf(buf, CarsCollectedMilitaryCrane); for (int i = 0; i < NUM_CRANES; i++) { +#ifdef COMPATIBLE_SAVES + int32 tmp = aCranes[i].m_pCraneEntity != nil ? CPools::GetBuildingPool()->GetJustIndex_NoFreeAssert(aCranes[i].m_pCraneEntity) + 1 : 0; + WriteSaveBuf(buf, tmp); + tmp = aCranes[i].m_pHook != nil ? CPools::GetObjectPool()->GetJustIndex_NoFreeAssert(aCranes[i].m_pHook) + 1 : 0; + WriteSaveBuf(buf, tmp); + WriteSaveBuf(buf, aCranes[i].m_fPickupX1); + WriteSaveBuf(buf, aCranes[i].m_fPickupX2); + WriteSaveBuf(buf, aCranes[i].m_fPickupY1); + WriteSaveBuf(buf, aCranes[i].m_fPickupY2); + WriteSaveBuf(buf, aCranes[i].m_vecDropoffTarget); + WriteSaveBuf(buf, aCranes[i].m_fDropoffHeading); + WriteSaveBuf(buf, aCranes[i].m_fPickupAngle); + WriteSaveBuf(buf, aCranes[i].m_fDropoffAngle); + WriteSaveBuf(buf, aCranes[i].m_fPickupDistance); + WriteSaveBuf(buf, aCranes[i].m_fDropoffDistance); + WriteSaveBuf(buf, aCranes[i].m_fPickupHeight); + WriteSaveBuf(buf, aCranes[i].m_fDropoffHeight); + WriteSaveBuf(buf, aCranes[i].m_fHookAngle); + WriteSaveBuf(buf, aCranes[i].m_fHookOffset); + WriteSaveBuf(buf, aCranes[i].m_fHookHeight); + WriteSaveBuf(buf, aCranes[i].m_vecHookInitPos); + WriteSaveBuf(buf, aCranes[i].m_vecHookCurPos); + WriteSaveBuf(buf, aCranes[i].m_vecHookVelocity); + tmp = aCranes[i].m_pVehiclePickedUp != nil ? CPools::GetVehiclePool()->GetJustIndex_NoFreeAssert(aCranes[i].m_pVehiclePickedUp) + 1 : 0; + WriteSaveBuf(buf, tmp); + WriteSaveBuf(buf, aCranes[i].m_nTimeForNextCheck); + WriteSaveBuf(buf, aCranes[i].m_nCraneStatus); + WriteSaveBuf(buf, aCranes[i].m_nCraneState); + WriteSaveBuf(buf, aCranes[i].m_nVehiclesCollected); + WriteSaveBuf(buf, aCranes[i].m_bIsCrusher); + WriteSaveBuf(buf, aCranes[i].m_bIsMilitaryCrane); + WriteSaveBuf(buf, aCranes[i].m_bWasMilitaryCrane); + WriteSaveBuf(buf, aCranes[i].m_bIsTop); + ZeroSaveBuf(buf, 1); +#else CCrane *pCrane = WriteSaveBuf(buf, aCranes[i]); if (pCrane->m_pCraneEntity != nil) pCrane->m_pCraneEntity = (CBuilding*)(CPools::GetBuildingPool()->GetJustIndex_NoFreeAssert(pCrane->m_pCraneEntity) + 1); @@ -633,6 +674,7 @@ void CCranes::Save(uint8* buf, uint32* size) pCrane->m_pHook = (CObject*)(CPools::GetObjectPool()->GetJustIndex_NoFreeAssert(pCrane->m_pHook) + 1); if (pCrane->m_pVehiclePickedUp != nil) pCrane->m_pVehiclePickedUp = (CVehicle*)(CPools::GetVehiclePool()->GetJustIndex_NoFreeAssert(pCrane->m_pVehiclePickedUp) + 1); +#endif } VALIDATESAVEBUF(*size); @@ -644,8 +686,45 @@ void CCranes::Load(uint8* buf, uint32 size) ReadSaveBuf(&NumCranes, buf); ReadSaveBuf(&CarsCollectedMilitaryCrane, buf); - for (int i = 0; i < NUM_CRANES; i++) + for (int i = 0; i < NUM_CRANES; i++) { +#ifdef COMPATIBLE_SAVES + int32 tmp; + ReadSaveBuf(&tmp, buf); + aCranes[i].m_pCraneEntity = tmp != 0 ? CPools::GetBuildingPool()->GetSlot(tmp - 1) : nil; + ReadSaveBuf(&tmp, buf); + aCranes[i].m_pHook = tmp != 0 ? CPools::GetObjectPool()->GetSlot(tmp - 1) : nil; + ReadSaveBuf(&aCranes[i].m_fPickupX1, buf); + ReadSaveBuf(&aCranes[i].m_fPickupX2, buf); + ReadSaveBuf(&aCranes[i].m_fPickupY1, buf); + ReadSaveBuf(&aCranes[i].m_fPickupY2, buf); + ReadSaveBuf(&aCranes[i].m_vecDropoffTarget, buf); + ReadSaveBuf(&aCranes[i].m_fDropoffHeading, buf); + ReadSaveBuf(&aCranes[i].m_fPickupAngle, buf); + ReadSaveBuf(&aCranes[i].m_fDropoffAngle, buf); + ReadSaveBuf(&aCranes[i].m_fPickupDistance, buf); + ReadSaveBuf(&aCranes[i].m_fDropoffDistance, buf); + ReadSaveBuf(&aCranes[i].m_fPickupHeight, buf); + ReadSaveBuf(&aCranes[i].m_fDropoffHeight, buf); + ReadSaveBuf(&aCranes[i].m_fHookAngle, buf); + ReadSaveBuf(&aCranes[i].m_fHookOffset, buf); + ReadSaveBuf(&aCranes[i].m_fHookHeight, buf); + ReadSaveBuf(&aCranes[i].m_vecHookInitPos, buf); + ReadSaveBuf(&aCranes[i].m_vecHookCurPos, buf); + ReadSaveBuf(&aCranes[i].m_vecHookVelocity, buf); + ReadSaveBuf(&tmp, buf); + aCranes[i].m_pVehiclePickedUp = tmp != 0 ? CPools::GetVehiclePool()->GetSlot(tmp - 1) : nil; + ReadSaveBuf(&aCranes[i].m_nTimeForNextCheck, buf); + ReadSaveBuf(&aCranes[i].m_nCraneStatus, buf); + ReadSaveBuf(&aCranes[i].m_nCraneState, buf); + ReadSaveBuf(&aCranes[i].m_nVehiclesCollected, buf); + ReadSaveBuf(&aCranes[i].m_bIsCrusher, buf); + ReadSaveBuf(&aCranes[i].m_bIsMilitaryCrane, buf); + ReadSaveBuf(&aCranes[i].m_bWasMilitaryCrane, buf); + ReadSaveBuf(&aCranes[i].m_bIsTop, buf); + SkipSaveBuf(buf, 1); +#else ReadSaveBuf(&aCranes[i], buf); + } for (int i = 0; i < NUM_CRANES; i++) { CCrane *pCrane = &aCranes[i]; if (pCrane->m_pCraneEntity != nil) @@ -654,6 +733,7 @@ void CCranes::Load(uint8* buf, uint32 size) pCrane->m_pHook = CPools::GetObjectPool()->GetSlot((uintptr)pCrane->m_pHook - 1); if (pCrane->m_pVehiclePickedUp != nil) pCrane->m_pVehiclePickedUp = CPools::GetVehiclePool()->GetSlot((uintptr)pCrane->m_pVehiclePickedUp - 1); +#endif } VALIDATESAVEBUF(size); diff --git a/src/vehicles/Vehicle.cpp b/src/vehicles/Vehicle.cpp index a41e0fa0..610e63f3 100644 --- a/src/vehicles/Vehicle.cpp +++ b/src/vehicles/Vehicle.cpp @@ -2364,42 +2364,42 @@ DestroyVehicleAndDriverAndPassengers(CVehicle* pVehicle) void CVehicle::Save(uint8*& buf) { - SkipSaveBuf(buf, 4); - WriteSaveBuf(buf, GetRight().x); - WriteSaveBuf(buf, GetRight().y); - WriteSaveBuf(buf, GetRight().z); - SkipSaveBuf(buf, 4); - WriteSaveBuf(buf, GetForward().x); - WriteSaveBuf(buf, GetForward().y); - WriteSaveBuf(buf, GetForward().z); - SkipSaveBuf(buf, 4); - WriteSaveBuf(buf, GetUp().x); - WriteSaveBuf(buf, GetUp().y); - WriteSaveBuf(buf, GetUp().z); - SkipSaveBuf(buf, 4); - WriteSaveBuf(buf, GetPosition().x); - WriteSaveBuf(buf, GetPosition().y); - WriteSaveBuf(buf, GetPosition().z); - SkipSaveBuf(buf, 16); + ZeroSaveBuf(buf, 4); + WriteSaveBuf(buf, GetRight().x); + WriteSaveBuf(buf, GetRight().y); + WriteSaveBuf(buf, GetRight().z); + ZeroSaveBuf(buf, 4); + WriteSaveBuf(buf, GetForward().x); + WriteSaveBuf(buf, GetForward().y); + WriteSaveBuf(buf, GetForward().z); + ZeroSaveBuf(buf, 4); + WriteSaveBuf(buf, GetUp().x); + WriteSaveBuf(buf, GetUp().y); + WriteSaveBuf(buf, GetUp().z); + ZeroSaveBuf(buf, 4); + WriteSaveBuf(buf, GetPosition().x); + WriteSaveBuf(buf, GetPosition().y); + WriteSaveBuf(buf, GetPosition().z); + ZeroSaveBuf(buf, 16); SaveEntityFlags(buf); - SkipSaveBuf(buf, 208); + ZeroSaveBuf(buf, 208); AutoPilot.Save(buf); - WriteSaveBuf(buf, m_currentColour1); - WriteSaveBuf(buf, m_currentColour2); - SkipSaveBuf(buf, 2); - WriteSaveBuf(buf, m_nAlarmState); - SkipSaveBuf(buf, 42); - WriteSaveBuf(buf, m_nNumMaxPassengers); - SkipSaveBuf(buf, 3); - WriteSaveBuf(buf, field_1D0[0]); - WriteSaveBuf(buf, field_1D0[1]); - WriteSaveBuf(buf, field_1D0[2]); - WriteSaveBuf(buf, field_1D0[3]); - SkipSaveBuf(buf, 8); - WriteSaveBuf(buf, m_fSteerAngle); - WriteSaveBuf(buf, m_fGasPedal); - WriteSaveBuf(buf, m_fBrakePedal); - WriteSaveBuf(buf, VehicleCreatedBy); + WriteSaveBuf(buf, m_currentColour1); + WriteSaveBuf(buf, m_currentColour2); + ZeroSaveBuf(buf, 2); + WriteSaveBuf(buf, m_nAlarmState); + ZeroSaveBuf(buf, 42); + WriteSaveBuf(buf, m_nNumMaxPassengers); + ZeroSaveBuf(buf, 3); + WriteSaveBuf(buf, field_1D0[0]); + WriteSaveBuf(buf, field_1D0[1]); + WriteSaveBuf(buf, field_1D0[2]); + WriteSaveBuf(buf, field_1D0[3]); + ZeroSaveBuf(buf, 8); + WriteSaveBuf(buf, m_fSteerAngle); + WriteSaveBuf(buf, m_fGasPedal); + WriteSaveBuf(buf, m_fBrakePedal); + WriteSaveBuf(buf, VehicleCreatedBy); uint8 flags = 0; if (bIsLawEnforcer) flags |= BIT(0); if (bIsLocked) flags |= BIT(3); @@ -2407,19 +2407,19 @@ CVehicle::Save(uint8*& buf) if (bIsHandbrakeOn) flags |= BIT(5); if (bLightsOn) flags |= BIT(6); if (bFreebies) flags |= BIT(7); - WriteSaveBuf(buf, flags); - SkipSaveBuf(buf, 10); - WriteSaveBuf(buf, m_fHealth); - WriteSaveBuf(buf, m_nCurrentGear); - SkipSaveBuf(buf, 3); - WriteSaveBuf(buf, m_fChangeGearTime); - SkipSaveBuf(buf, 12); - WriteSaveBuf(buf, m_nTimeOfDeath); - SkipSaveBuf(buf, 2); - WriteSaveBuf(buf, m_nBombTimer); - SkipSaveBuf(buf, 12); - WriteSaveBuf(buf, m_nDoorLock); - SkipSaveBuf(buf, 111); + WriteSaveBuf(buf, flags); + ZeroSaveBuf(buf, 10); + WriteSaveBuf(buf, m_fHealth); + WriteSaveBuf(buf, m_nCurrentGear); + ZeroSaveBuf(buf, 3); + WriteSaveBuf(buf, m_fChangeGearTime); + ZeroSaveBuf(buf, 12); + WriteSaveBuf(buf, m_nTimeOfDeath); + ZeroSaveBuf(buf, 2); + WriteSaveBuf(buf, m_nBombTimer); + ZeroSaveBuf(buf, 12); + WriteSaveBuf(buf, m_nDoorLock); + ZeroSaveBuf(buf, 108); } void @@ -2481,9 +2481,8 @@ CVehicle::Load(uint8*& buf) SkipSaveBuf(buf, 2); ReadSaveBuf(&m_nBombTimer, buf); SkipSaveBuf(buf, 12); - ReadSaveBuf(&flags, buf); - m_nDoorLock = (eCarLock)flags; - SkipSaveBuf(buf, 111); + ReadSaveBuf(&m_nDoorLock, buf); + SkipSaveBuf(buf, 108); } #endif diff --git a/src/vehicles/Vehicle.h b/src/vehicles/Vehicle.h index 37b57944..31b52138 100644 --- a/src/vehicles/Vehicle.h +++ b/src/vehicles/Vehicle.h @@ -276,7 +276,7 @@ public: int8 m_comedyControlState; CStoredCollPoly m_aCollPolys[2]; // poly which is under front/rear part of car float m_fSteerInput; - uint8 m_vehType; + eVehicleType m_vehType; static void *operator new(size_t) throw(); static void *operator new(size_t sz, int slot) throw(); diff --git a/src/weapons/Weapon.cpp b/src/weapons/Weapon.cpp index 46ca4cc8..36303c2c 100644 --- a/src/weapons/Weapon.cpp +++ b/src/weapons/Weapon.cpp @@ -3285,7 +3285,7 @@ CWeapon::Save(uint8*& buf) CopyToBuf(buf, m_nAmmoTotal); CopyToBuf(buf, m_nTimer); CopyToBuf(buf, m_bAddRotOffset); - SkipSaveBuf(buf, 3); + ZeroSaveBuf(buf, 3); } void From 9f0a96ac896cec2e8d094738e23566652ac45f52 Mon Sep 17 00:00:00 2001 From: erorcun Date: Sat, 10 Jul 2021 23:24:27 +0300 Subject: [PATCH 11/27] Physical: division by zero fix --- src/entities/Physical.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/entities/Physical.cpp b/src/entities/Physical.cpp index 890e7876..e9ae3065 100644 --- a/src/entities/Physical.cpp +++ b/src/entities/Physical.cpp @@ -521,6 +521,10 @@ CPhysical::ApplySpringDampening(float damping, CVector &springDir, CVector &poin { float speedA = DotProduct(speed, springDir); float speedB = DotProduct(GetSpeed(point), springDir); +#ifdef FIX_BUGS + if (speedB == 0.0f) + return true; +#endif float step = Min(CTimer::GetTimeStep(), 3.0f); float impulse = -damping * (speedA + speedB)/2.0f * m_fMass * step * 0.53f; if(bIsHeavy) From 8a114514d9ea61815c2d391bc5edaa69d1648bfe Mon Sep 17 00:00:00 2001 From: withmorten Date: Sun, 11 Jul 2021 00:30:26 +0200 Subject: [PATCH 12/27] fix hotring flap stat line --- src/core/Stats.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/core/Stats.cpp b/src/core/Stats.cpp index 7ada0da9..8c6137f2 100644 --- a/src/core/Stats.cpp +++ b/src/core/Stats.cpp @@ -1229,7 +1229,11 @@ CStats::ConstructStatLine(int rowIdx) FASTEST_TIME(20, "STFT_21"); if (FastestTimes[21]) +#ifdef FIX_BUGS + STAT_LINE_1(float, "STFT_22", Floor(FastestTimes[21] / 10) / 100, 1); +#else STAT_LINE_1(float, "STFT_22", FastestTimes[21] / 1000, 1); +#endif if (TopShootingRangeScore > 0.0f) STAT_LINE_1(int, "TOP_SHO", TopShootingRangeScore, 0); From 58de524d70beff5d917bc9eaf72a0f8d3e18840d Mon Sep 17 00:00:00 2001 From: withmorten Date: Sun, 11 Jul 2021 03:26:59 +0200 Subject: [PATCH 13/27] tiny diff fix --- src/audio/oal/stream.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/audio/oal/stream.cpp b/src/audio/oal/stream.cpp index 7fc36acd..3789573e 100644 --- a/src/audio/oal/stream.cpp +++ b/src/audio/oal/stream.cpp @@ -1648,7 +1648,7 @@ void CStream::SetPlay(bool state) { ALint sourceState = AL_STOPPED; alGetSourcei(m_pAlSources[0], AL_SOURCE_STATE, &sourceState); - if (sourceState != AL_STOPPED ) + if (sourceState != AL_STOPPED) alSourceStop(m_pAlSources[0]); sourceState = AL_STOPPED; From f6860657692ded8e7dd3c569f1cf736f844c75c8 Mon Sep 17 00:00:00 2001 From: withmorten Date: Sun, 11 Jul 2021 03:59:37 +0200 Subject: [PATCH 14/27] get rid of // done comments in audiomanager.h --- src/audio/AudioManager.h | 332 +++++++++++++++++++-------------------- 1 file changed, 166 insertions(+), 166 deletions(-) diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index 2e3aeb6d..bba4b0d7 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -96,8 +96,8 @@ public: m_nCommentsInBank[i] = 0; m_nActiveBank = 0; } - void Add(tPedComment *com); // done - void Process(); // done + void Add(tPedComment *com); + void Process(); }; VALIDATE_SIZE(cPedComments, 0x490); @@ -251,34 +251,34 @@ public: ~cAudioManager(); // getters - uint32 GetFrameCounter() const { return m_FrameCounter; } // done - float GetReflectionsDistance(int32 idx) const { return m_afReflectionsDistances[idx]; } // done + uint32 GetFrameCounter() const { return m_FrameCounter; } + float GetReflectionsDistance(int32 idx) const { return m_afReflectionsDistances[idx]; } int32 GetRandomNumber(int32 idx) const { return m_anRandomTable[idx]; } int32 GetRandomNumberInRange(int32 idx, int32 low, int32 high) const { return (m_anRandomTable[idx] % (high - low + 1)) + low; } bool8 IsMissionAudioSamplePlaying(uint8 slot) const; // { return m_sMissionAudio.m_nPlayStatus == 1; } bool8 ShouldDuckMissionAudio(uint8 slot) const; // "Should" be in alphabetic order, except "getXTalkSfx" - void AddDetailsToRequestedOrderList(uint8 sample); // done (inlined in vc) - void AddPlayerCarSample(uint8 emittingVolume, int32 freq, uint32 sample, uint8 bank, uint8 counter, bool8 notLooping); // done - void AddReflectionsToRequestedQueue(); // done - void AddReleasingSounds(); // done - void AddSampleToRequestedQueue(); // done - void AgeCrimes(); // done (inlined in vc) + void AddDetailsToRequestedOrderList(uint8 sample); // inlined in vc + void AddPlayerCarSample(uint8 emittingVolume, int32 freq, uint32 sample, uint8 bank, uint8 counter, bool8 notLooping); + void AddReflectionsToRequestedQueue(); + void AddReleasingSounds(); + void AddSampleToRequestedQueue(); + void AgeCrimes(); // inlined in vc - void CalculateDistance(bool8 &condition, float dist); // done - bool8 CheckForAnAudioFileOnCD() const; // done - void ClearActiveSamples(); // done - void ClearMissionAudio(uint8 slot); // done (inlined in vc) - void ClearRequestedQueue(); // done (inlined in vc) - uint32 ComputeDopplerEffectedFrequency(uint32 oldFreq, float position1, float position2, float speedMultiplier) const; // done - int32 ComputePan(float, CVector *); // done - uint8 ComputeVolume(uint8 emittingVolume, float soundIntensity, float distance) const; // done - int32 CreateEntity(eAudioType type, void *entity); // done + void CalculateDistance(bool8 &condition, float dist); + bool8 CheckForAnAudioFileOnCD() const; + void ClearActiveSamples(); + void ClearMissionAudio(uint8 slot); // inlined in vc + void ClearRequestedQueue(); // inlined in vc + uint32 ComputeDopplerEffectedFrequency(uint32 oldFreq, float position1, float position2, float speedMultiplier) const; + int32 ComputePan(float, CVector *); + uint8 ComputeVolume(uint8 emittingVolume, float soundIntensity, float distance) const; + int32 CreateEntity(eAudioType type, void *entity); - void DestroyAllGameCreatedEntities(); // done - void DestroyEntity(int32 id); // done (inlined in vc) - void DoPoliceRadioCrackle(); // done + void DestroyAllGameCreatedEntities(); + void DestroyEntity(int32 id); // inlined in vc + void DoPoliceRadioCrackle(); // functions returning talk sfx, // order from GetPedCommentSfx @@ -295,8 +295,8 @@ public: uint32 GetHMYSTTalkSfx(CPed *ped, int16 sound); uint32 GetHMOSTTalkSfx(CPed *ped, int16 sound); uint32 GetHFYRITalkSfx(CPed *ped, int16 sound); - uint32 GetHFORITalkSfx(CPed *ped, int16 sound); - uint32 GetHMYRITalkSfx(CPed *ped, int16 sound); + uint32 GetHFORITalkSfx(CPed *ped, int16 sound); + uint32 GetHMYRITalkSfx(CPed *ped, int16 sound); uint32 GetHMORITalkSfx(CPed *ped, int16 sound); uint32 GetHFYBETalkSfx(CPed *ped, int16 sound); uint32 GetHFOBETalkSfx(CPed *ped, int16 sound); @@ -379,170 +379,170 @@ public: uint32 GetGenericFemaleTalkSfx(CPed *ped, int16 sound); // todo names (inlined in vc) // end of functions returning talk sfx - void GenerateIntegerRandomNumberTable(); // done - char *Get3DProviderName(uint8 id) const; // done - char GetCDAudioDriveLetter() const; // done - int8 GetCurrent3DProviderIndex() const; // done - int8 AutoDetect3DProviders() const; // done - float GetCollisionLoopingRatio(uint32 a, uint32 b, float c) const; // not used - float GetCollisionOneShotRatio(int32 a, float b) const; // done - float GetCollisionRatio(float a, float b, float c, float d) const; // done (inlined in vc) - float GetDistanceSquared(const CVector &v) const; // done (inlined in vc) - int32 GetJumboTaxiFreq() const; // done (inlined in vc) - uint8 GetMissionAudioLoadingStatus(uint8 slot) const; // done - int8 GetMissionScriptPoliceAudioPlayingStatus() const; // done - uint8 GetNum3DProvidersAvailable() const; // done - uint32 GetPedCommentSfx(CPed *ped, int32 sound); // done - void GetPhrase(uint32 &phrase, uint32 &prevPhrase, uint32 sample, uint32 maxOffset) const; // done + void GenerateIntegerRandomNumberTable(); + char *Get3DProviderName(uint8 id) const; + char GetCDAudioDriveLetter() const; + int8 GetCurrent3DProviderIndex() const; + int8 AutoDetect3DProviders() const; + float GetCollisionLoopingRatio(uint32 a, uint32 b, float c) const; // not used + float GetCollisionOneShotRatio(int32 a, float b) const; + float GetCollisionRatio(float a, float b, float c, float d) const; // inlined in vc + float GetDistanceSquared(const CVector &v) const; // inlined in vc + int32 GetJumboTaxiFreq() const; // inlined in vc + uint8 GetMissionAudioLoadingStatus(uint8 slot) const; + int8 GetMissionScriptPoliceAudioPlayingStatus() const; + uint8 GetNum3DProvidersAvailable() const; + uint32 GetPedCommentSfx(CPed *ped, int32 sound); + void GetPhrase(uint32 &phrase, uint32 &prevPhrase, uint32 sample, uint32 maxOffset) const; float GetVehicleDriveWheelSkidValue(CVehicle *veh, tWheelState wheelState, float gasPedalAudio, cTransmission *transmission, - float velocityChange); // done - float GetVehicleNonDriveWheelSkidValue(CVehicle *veh, tWheelState wheelState, cTransmission *transmission, float velocityChange); // done + float velocityChange); + float GetVehicleNonDriveWheelSkidValue(CVehicle *veh, tWheelState wheelState, cTransmission *transmission, float velocityChange); - bool8 HasAirBrakes(int32 model) const; // done + bool8 HasAirBrakes(int32 model) const; - void Initialise(); // done - void InitialisePoliceRadio(); // done - void InitialisePoliceRadioZones(); // done - void InterrogateAudioEntities(); // done (inlined) - bool8 IsAudioInitialised() const; // done - bool8 IsMissionAudioSampleFinished(uint8 slot); // done - bool8 IsMP3RadioChannelAvailable() const; // done + void Initialise(); + void InitialisePoliceRadio(); + void InitialisePoliceRadioZones(); + void InterrogateAudioEntities(); // inlined + bool8 IsAudioInitialised() const; + bool8 IsMissionAudioSampleFinished(uint8 slot); + bool8 IsMP3RadioChannelAvailable() const; - bool8 MissionScriptAudioUsesPoliceChannel(int32 soundMission) const; //done + bool8 MissionScriptAudioUsesPoliceChannel(int32 soundMission) const; - void PlayLoadedMissionAudio(uint8 slot); // done - void PlayOneShot(int32 index, uint16 sound, float vol); // done - void PlaySuspectLastSeen(float x, float y, float z); // done - void PlayerJustGotInCar() const; // done - void PlayerJustLeftCar() const; // done - void PostInitialiseGameSpecificSetup(); // done - void PostTerminateGameSpecificShutdown(); // done - void PreInitialiseGameSpecificSetup() const; // done - void PreloadMissionAudio(uint8 slot, Const char *name); // done - void PreTerminateGameSpecificShutdown(); // done + void PlayLoadedMissionAudio(uint8 slot); + void PlayOneShot(int32 index, uint16 sound, float vol); + void PlaySuspectLastSeen(float x, float y, float z); + void PlayerJustGotInCar() const; + void PlayerJustLeftCar() const; + void PostInitialiseGameSpecificSetup(); + void PostTerminateGameSpecificShutdown(); + void PreInitialiseGameSpecificSetup() const; + void PreloadMissionAudio(uint8 slot, Const char *name); + void PreTerminateGameSpecificShutdown(); /// processX - main logic of adding new sounds - void ProcessActiveQueues(); // done - bool8 ProcessAirBrakes(cVehicleParams& params); // done + void ProcessActiveQueues(); + bool8 ProcessAirBrakes(cVehicleParams& params); bool8 ProcessBoatEngine(cVehicleParams& params); - bool8 ProcessBoatMovingOverWater(cVehicleParams& params); //done + bool8 ProcessBoatMovingOverWater(cVehicleParams& params); #ifdef GTA_BRIDGE - void ProcessBridge(); // done(bcs not exists in VC) - void ProcessBridgeMotor(); // done(bcs not exists in VC) - void ProcessBridgeOneShots(); // done(bcs not exists in VC) - void ProcessBridgeWarning(); // done(bcs not exists in VC) + void ProcessBridge(); + void ProcessBridgeMotor(); + void ProcessBridgeOneShots(); + void ProcessBridgeWarning(); #endif - bool8 ProcessCarBombTick(cVehicleParams& params); // done - void ProcessCarHeli(cVehicleParams& params); // done - void ProcessCesna(cVehicleParams& params); // done - //void ProcessCrane(); // done(bcs not exists in VC) - bool8 ProcessEngineDamage(cVehicleParams& params); // done - void ProcessEntity(int32 sound); // done - void ProcessExplosions(int32 explosion); // done - void ProcessFireHydrant(); // done - void ProcessFires(int32 entity); // done - void ProcessFrontEnd(); // done - void ProcessGarages(); // done - void ProcessJumbo(cVehicleParams& params); // done - void ProcessJumboAccel(CPlane *plane); // done - void ProcessJumboDecel(CPlane *plane); // done - void ProcessJumboFlying(); // done - void ProcessJumboLanding(CPlane *plane); // done - void ProcessJumboTakeOff(CPlane *plane); // done - void ProcessJumboTaxi(); // done - void ProcessLoopingScriptObject(uint8 sound); // done - void ProcessMissionAudio(); // done - void ProcessMissionAudioSlot(uint8 slot); // done - void ProcessModelHeliVehicle(cVehicleParams& params); // done - void ProcessModelVehicle(cVehicleParams& params); // done - void ProcessOneShotScriptObject(uint8 sound); // - void ProcessPed(CPhysical *ped); // done - void ProcessPedOneShots(cPedParams ¶ms); // - void ProcessPhysical(int32 id); // done - void ProcessPlane(cVehicleParams& params); // done - void ProcessPlayerMood(); // done - void ProcessPlayersVehicleEngine(cVehicleParams& params, CVehicle* veh); // done - void ProcessProjectiles(); // done - void ProcessRainOnVehicle(cVehicleParams& params); // done - void ProcessReverb() const; // done - bool8 ProcessReverseGear(cVehicleParams& params); // done - void ProcessScriptObject(int32 id); // done - void ProcessSpecial(); // done + bool8 ProcessCarBombTick(cVehicleParams& params); + void ProcessCarHeli(cVehicleParams& params); + void ProcessCesna(cVehicleParams& params); + //void ProcessCrane(); + bool8 ProcessEngineDamage(cVehicleParams& params); + void ProcessEntity(int32 sound); + void ProcessExplosions(int32 explosion); + void ProcessFireHydrant(); + void ProcessFires(int32 entity); + void ProcessFrontEnd(); + void ProcessGarages(); + void ProcessJumbo(cVehicleParams& params); + void ProcessJumboAccel(CPlane *plane); + void ProcessJumboDecel(CPlane *plane); + void ProcessJumboFlying(); + void ProcessJumboLanding(CPlane *plane); + void ProcessJumboTakeOff(CPlane *plane); + void ProcessJumboTaxi(); + void ProcessLoopingScriptObject(uint8 sound); + void ProcessMissionAudio(); + void ProcessMissionAudioSlot(uint8 slot); + void ProcessModelHeliVehicle(cVehicleParams& params); + void ProcessModelVehicle(cVehicleParams& params); + void ProcessOneShotScriptObject(uint8 sound); + void ProcessPed(CPhysical *ped); + void ProcessPedOneShots(cPedParams ¶ms); + void ProcessPhysical(int32 id); + void ProcessPlane(cVehicleParams& params); + void ProcessPlayerMood(); + void ProcessPlayersVehicleEngine(cVehicleParams& params, CVehicle* veh); + void ProcessProjectiles(); + void ProcessRainOnVehicle(cVehicleParams& params); + void ProcessReverb() const; + bool8 ProcessReverseGear(cVehicleParams& params); + void ProcessScriptObject(int32 id); + void ProcessSpecial(); #ifdef GTA_TRAIN - bool8 ProcessTrainNoise(cVehicleParams *params); //done(bcs not exists in VC) + bool8 ProcessTrainNoise(cVehicleParams *params); #endif - void ProcessVehicle(CVehicle *vehicle); // done - bool8 ProcessVehicleDoors(cVehicleParams ¶ms); // done - void ProcessVehicleEngine(cVehicleParams ¶ms); // done - void ProcessVehicleFlatTyre(cVehicleParams ¶ms); // done - bool8 ProcessVehicleHorn(cVehicleParams ¶ms); // done - void ProcessVehicleOneShots(cVehicleParams ¶ms); // done - bool8 ProcessVehicleReverseWarning(cVehicleParams ¶ms); // done - bool8 ProcessVehicleRoadNoise(cVehicleParams ¶ms); // done - bool8 ProcessVehicleSirenOrAlarm(cVehicleParams ¶ms); // done - bool8 ProcessVehicleSkidding(cVehicleParams ¶ms); // done - void ProcessWaterCannon(int32); // done - void ProcessWeather(int32 id); // done - bool8 ProcessWetRoadNoise(cVehicleParams& params); // done - void ProcessEscalators(); // done - void ProcessExtraSounds(); // done + void ProcessVehicle(CVehicle *vehicle); + bool8 ProcessVehicleDoors(cVehicleParams ¶ms); + void ProcessVehicleEngine(cVehicleParams ¶ms); + void ProcessVehicleFlatTyre(cVehicleParams ¶ms); + bool8 ProcessVehicleHorn(cVehicleParams ¶ms); + void ProcessVehicleOneShots(cVehicleParams ¶ms); + bool8 ProcessVehicleReverseWarning(cVehicleParams ¶ms); + bool8 ProcessVehicleRoadNoise(cVehicleParams ¶ms); + bool8 ProcessVehicleSirenOrAlarm(cVehicleParams ¶ms); + bool8 ProcessVehicleSkidding(cVehicleParams ¶ms); + void ProcessWaterCannon(int32); + void ProcessWeather(int32 id); + bool8 ProcessWetRoadNoise(cVehicleParams& params); + void ProcessEscalators(); + void ProcessExtraSounds(); - int32 RandomDisplacement(uint32 seed) const; // done - void ReacquireDigitalHandle() const; // done - void ReleaseDigitalHandle() const; // done - void ReportCollision(CEntity *entity1, CEntity *entity2, uint8 surface1, uint8 surface2, float collisionPower, float intensity2); // done - void ReportCrime(eCrimeType crime, const CVector &pos); // done - void ResetAudioLogicTimers(uint32 timer); // done - void ResetPoliceRadio(); // done - void ResetTimers(uint32 time); // done + int32 RandomDisplacement(uint32 seed) const; + void ReacquireDigitalHandle() const; + void ReleaseDigitalHandle() const; + void ReportCollision(CEntity *entity1, CEntity *entity2, uint8 surface1, uint8 surface2, float collisionPower, float intensity2); + void ReportCrime(eCrimeType crime, const CVector &pos); + void ResetAudioLogicTimers(uint32 timer); + void ResetPoliceRadio(); + void ResetTimers(uint32 time); - void Service(); // done - void ServiceCollisions(); // done - void ServicePoliceRadio(); // done - void ServicePoliceRadioChannel(uint8 wantedLevel); // done - void ServiceSoundEffects(); // done - int8 SetCurrent3DProvider(uint8 which); // done - void SetDynamicAcousticModelingStatus(bool8 status); // done - void SetEffectsFadeVol(uint8 volume) const; // done - void SetEffectsMasterVolume(uint8 volume) const; // done - void SetMP3BoostVolume(uint8 volume) const; // done - void SetEntityStatus(int32 id, bool8 status); // done - uint32 SetLoopingCollisionRequestedSfxFreqAndGetVol(const cAudioCollision &audioCollision); // done - void SetMissionAudioLocation(uint8 slot, float x, float y, float z); // done - void SetMissionScriptPoliceAudio(int32 sfx) const; // inlined and optimized - void SetMonoMode(bool8 mono); // done - void SetMusicFadeVol(uint8 volume) const; // done - void SetMusicMasterVolume(uint8 volume) const; // done - void SetSpeakerConfig(int32 conf) const; // done - void SetUpLoopingCollisionSound(const cAudioCollision &col, uint8 counter); // done - void SetUpOneShotCollisionSound(const cAudioCollision &col); // done - bool8 SetupCrimeReport(); // done - bool8 SetupJumboEngineSound(uint8 vol, uint32 freq); // done - bool8 SetupJumboFlySound(uint8 emittingVol); // done - bool8 SetupJumboRumbleSound(uint8 emittingVol); // done - bool8 SetupJumboTaxiSound(uint8 vol); // done - bool8 SetupJumboWhineSound(uint8 emittingVol, uint32 freq); // done - void SetupPedComments(cPedParams ¶ms, uint16 sound); // done + void Service(); + void ServiceCollisions(); + void ServicePoliceRadio(); + void ServicePoliceRadioChannel(uint8 wantedLevel); + void ServiceSoundEffects(); + int8 SetCurrent3DProvider(uint8 which); + void SetDynamicAcousticModelingStatus(bool8 status); + void SetEffectsFadeVol(uint8 volume) const; + void SetEffectsMasterVolume(uint8 volume) const; + void SetMP3BoostVolume(uint8 volume) const; + void SetEntityStatus(int32 id, bool8 status); + uint32 SetLoopingCollisionRequestedSfxFreqAndGetVol(const cAudioCollision &audioCollision); + void SetMissionAudioLocation(uint8 slot, float x, float y, float z); + void SetMissionScriptPoliceAudio(int32 sfx) const; // inlined and optimized + void SetMonoMode(bool8 mono); + void SetMusicFadeVol(uint8 volume) const; + void SetMusicMasterVolume(uint8 volume) const; + void SetSpeakerConfig(int32 conf) const; + void SetUpLoopingCollisionSound(const cAudioCollision &col, uint8 counter); + void SetUpOneShotCollisionSound(const cAudioCollision &col); + bool8 SetupCrimeReport(); + bool8 SetupJumboEngineSound(uint8 vol, uint32 freq); + bool8 SetupJumboFlySound(uint8 emittingVol); + bool8 SetupJumboRumbleSound(uint8 emittingVol); + bool8 SetupJumboTaxiSound(uint8 vol); + bool8 SetupJumboWhineSound(uint8 emittingVol, uint32 freq); + void SetupPedComments(cPedParams ¶ms, uint16 sound); void SetupSuspectLastSeenReport(); - void Terminate(); // done - void TranslateEntity(Const CVector *v1, CVector *v2) const; // done + void Terminate(); + void TranslateEntity(Const CVector *v1, CVector *v2) const; - void UpdateGasPedalAudio(CVehicle *veh, int vehType); // done - void UpdateReflections(); // done - bool8 UsesReverseWarning(int32 model) const; // done - bool8 UsesSiren(cVehicleParams ¶ms) const; // done - bool8 UsesSirenSwitching(cVehicleParams ¶ms) const; // done + void UpdateGasPedalAudio(CVehicle *veh, int vehType); + void UpdateReflections(); + bool8 UsesReverseWarning(int32 model) const; + bool8 UsesSiren(cVehicleParams ¶ms) const; + bool8 UsesSirenSwitching(cVehicleParams ¶ms) const; - CVehicle *FindVehicleOfPlayer(); // done - void SetPedTalkingStatus(CPed *ped, bool8 status); // done - void SetPlayersMood(uint8 mood, uint32 time); // done + CVehicle *FindVehicleOfPlayer(); + void SetPedTalkingStatus(CPed *ped, bool8 status); + void SetPlayersMood(uint8 mood, uint32 time); float Sqrt(float v) const { return v <= 0.0f ? 0.0f : ::Sqrt(v); } #ifdef GTA_PC // only used in pc - void AdjustSamplesVolume(); // done (inlined) - uint8 ComputeEmittingVolume(uint8 emittingVolume, float intensity, float dist); // done (inlined) + void AdjustSamplesVolume(); // inlined + uint8 ComputeEmittingVolume(uint8 emittingVolume, float intensity, float dist); // inlined #endif }; From dc29e7c0441af00393364025ba57330292743544 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Sun, 11 Jul 2021 23:55:11 +0300 Subject: [PATCH 15/27] Add PED DENSITY and CAR DENSITY lines to GXT --- gamefiles/TEXT/american.gxt | Bin 423994 -> 424066 bytes gamefiles/TEXT/french.gxt | Bin 469996 -> 470068 bytes gamefiles/TEXT/german.gxt | Bin 461890 -> 461962 bytes gamefiles/TEXT/italian.gxt | Bin 458946 -> 459018 bytes gamefiles/TEXT/spanish.gxt | Bin 455278 -> 455350 bytes utils/gxt/american.txt | 6 ++++++ utils/gxt/french.txt | 6 ++++++ utils/gxt/german.txt | 6 ++++++ utils/gxt/italian.txt | 6 ++++++ utils/gxt/spanish.txt | 6 ++++++ 10 files changed, 30 insertions(+) diff --git a/gamefiles/TEXT/american.gxt b/gamefiles/TEXT/american.gxt index 4db81fc6e878ff9e43d0c1e18f6fae4364124bd9..39895b0cb4a188a34151cab7f938605a7edbc331 100644 GIT binary patch delta 1066 zcmZ9~Pe>F|90%~PyE7u$p+k_u2GSvxsKfrTLJEA&KG$hxXNK9?R!wjfk0L5Tdx%yl z(87b!pOc3UAwor#h9L$99$LIEWT*&&(V>HaL=aKGx9{zxfq~Ea&F}aA{N}A3G~YdJ zo{5xJw?bgqtm(vnwO!>naImMG0DgQ|P6FPcax1X@JA@AASl6g_`>!(9P8|!&IMo(T zD^u-p09iZtjj84;GHU~6KBl|q?Ekw^~NOOn#B^E;^ss=2M`Aan? zkTPmcVrZb|Rz$`%bTL!x4Sf^Rq7zT1r9~%-Pswh;ZSv-<2Gih%PrYlHlg@zEnw*~7DIM;0X8UFuURsCOW!iLr5(=&yh!aHfWV5%Ikv|WRU0-w>vm??Xr#K-k zPC4~ZnmUchbF%MNyK-Vdx|;t{TI3hjb@PpmLLJ@t&r|PvQK<#7N7UxV9^2B(v;P2ExcRdH delta 996 zcmXxiPe>F|90%~PyE7u;(ZdP`1rkeiaQ|2!1wO}VcbeImWp>to1*LfKAfm9)9->+5 zV8kAbtdr2CLP)SOuwo+viJ%T0mMAQAMWRCog$N>cyuRWvvUj4;SU!kP-sg6C7@d#(V3B8T0$WRDCr{6S)@AOZ?a@xH&!y?K zwYTIV^-S^pkJ1#s^i7)HV*IBxHSl>iit~oeEFGvt6|$>)u8FPV3NpH_yFN>x8kY-} z#FaClQ#j}gokquK=x)?!6l9sf-wkaQVLl0~D$FO*b&u?Lx<#H_P+(}f=F;re9tjsc z`ee@(_=fGd4kguIDKPb*Va(UbhGrH#4--EWSZr`urwRROgic~fRb@PdwiBV#SW2nL z87ybeuHZg{)5<5=p=S$LZ?tIkxhLVEAOI%r|)+5yja=kIXKs}c(YNSZIqi<8|BE8 TvDw;2gzhNa%4%&xeZTM@>@Dy) diff --git a/gamefiles/TEXT/french.gxt b/gamefiles/TEXT/french.gxt index 36f4225cc4cb9ee8724d84ad25b43a1f9322c13e..d20206516efc30260144ad07be737181fd6818c1 100644 GIT binary patch delta 1066 zcmZ9~O=uHA6bJBsn%x*|5fPP$!4D`{#7gtgASIyF?KD}l*fXX;P6Dw5WXq;^)bT;#vgy)Jn}?+7G`o{r zrk*KopOU6{G%roJ$PP$T1GNhZ`gM~ToZ=J04tJdbHXbO*ag#fBMh8EV3zkIJeBcyT zUj|O2y%D$@3qKU(nJ(^zj*#kEOyb!t-(nJoku8@S#KvJ2y2dq!W*0l|yX*oVk}B%D z={goAMYAdj+-n$yL)NuI$#t=HPKCh+hdE8?;b`C_-rowGLgPu`G`5yh6m?eAY1p%G z$VG7*VCbz1Yk(P!opR(U#H7*o$G6B?*%|TT zqRa99zG>3fdy?!}-c+)ueT)2Grf-oyHV}csG+rXRSIAmD&ka3+j;mr}8zzmYF(E9{ z68JhvwzPt{gi`e_Hl4cdTWngpA3=#bIgvB9>RaTDuK5-@yPFZXY=}+*R>M0yYxE7q zPwev-gY+LLM*}DEsXcHCE62zMKHN3`Iy{|ey|>(geqOB5k9s%P^P=^dT-&^Fe!J(} znb6Z4&FXZs8d_{tTdps6+TiHJ5qdaGl%T@}{rk|s;QSw-u4KaWDDjjRq+pV5D6NRoWlh%I?1ssvpMn*N2zpRZC>Gp` z#ftPG=pmqoB0a?7L2RK#3Pvbcq(Tl#J&5f=P@xyG3PlgT*_jP2{O0X@GxOeN{!?;u zE%_iBjO1cq<+A0bftfDl3{X9(oCQu8$~rLOD0cvbz8HF#YoDds#*i}AHZCetZQH0a z)hU`E){%upmtHmMfLb!jTa@;7NJh5n0N>_0DZ z&iy5O%gO$Sg)uuR^i!kc@f^bn{JdH*R*(=dI>iDp5#r0{YnIp<{T5~(O zLOoNwxl@_q^}I6OVymJ|4d@r*IAgiYF)4msn43PgG5t7>yy==eV07?PwO|>1e;GN8 ziPw>Jd|r>-fh#}bC@@Rh4I9uxi%DGCBP}Mec!=!zrbDhC)nFN>!D)7lq)8`9vgz5$aaiCM|MSHWKhzKb-_j#CC=@=o_R` z2jrrU{s&8~ku!MI7CDRYV`SSLXqkHxo6J4*yXNQicYi(IbnDLc*yQ$D)57-Hj@z#$ SXLB)n;`C?>v$@3m-~Rz4ChA=P diff --git a/gamefiles/TEXT/german.gxt b/gamefiles/TEXT/german.gxt index 671ed18da6b7137f7a2d670349382e260316000c..f96f87d546a6d68b1307163d095487bb8cf72d3f 100644 GIT binary patch delta 1066 zcmZA0Pe>F|90%~P?#!kr5#&K=r6@aT;r`Ks74n>Y?o7KoGtADms~C1zs*6Ms6uGg7 z0wp>uWsuM%@!-KoGI38u2GSv-AiUK)7t`Mvr5-k;yjuHFyb znhBLdrAkKtER(V9FrXb&jsWq)%2D8HmvRg+`;>cuDIHC3*;2UY8bL?mf}GBsIbR!u1=1UvWY zj-onScMRPx>+Z$Xbqyx7#MyBEo3!Xed0SeXA+|$ye4ZjNXgVx|8y@v;ez$bi2a5Z2 zlq}o#97@{k)RE-13uAhKY#GUn?_yF^n#k!-IyHj@z?GJUNEta;Z z*~Q1?G%Zd~+Y=qmDVFlA1X`DMxTck&3zV?unGD1YHrL43$Ot39e@Ava(P?O#(jsSZ zTUy*Q|5utijpE)QT+gX>_HcBQ>Sz(yI2;7uSE$Yk( zi?lEbBV@-&ibG7FmKKY?z920Y-MAJ+hIV>0e$H%vDDvZ9BgJqT8h7FoeU zMLZNgAc6-eJ>()*8fXqxv{dmRQboZ-K?Ey3h=(GASiv`$*}%f@&AvA??`3a2NUl_q zv&nF>BL-G33oi{Ur;IbecBgR`xOm7o2cXBe8|brR=x3gDifSkF##Fm1jj6VF-k56V zuP94joz*wnbm)6j@Ud!MP{CNumS9jZ7N0boi>%?*JpBZ_^is= z`<3jopuaML2H9q%=KA(`WvQ02^H10eN=&9Pi8yS(MDOUdO5|=F`4mTi33WFd*w9v!C~Rq~N&NUr_5<#c$Kw`+&234uJGV=_5&*e<7DC|# z(x;?qrv-;M8;09U7PeCk0@Mo@TsAbqX+pJP~tSD&MxhLcz zZBD`OIiEPv5fITKsjs>|K~ zv}w}F?Ma{{{pM6|9@JL(;~8z0|Kex@lG(gWP8P{_Sm3UpBLWqaT#rVyKB%nH(nyYy zecMr&aL;I~O{Xtut4(LGCQ#-wuW}wf)>b+98rmwSZ6$$#4XcyT*wD7=Kd5#6*1-^c z2SLk@X3`LS2V+)bDsLk@e57yjWo)VE?)0(x;=u9s-j?wjsi~RNRLfFos`bL$Ors-4 OPn;fWsnL=6@bf=vwdbAy diff --git a/gamefiles/TEXT/italian.gxt b/gamefiles/TEXT/italian.gxt index fd087c0dcd92a61c6f5a8acc941ed957557e58b8..407da68df450a77d75a2d738ff2aed163d3ed080 100644 GIT binary patch delta 1066 zcmZ9~Pe@cj90%~P?t4q2x0WJUC!>NCXvl(1hwxVc?R7ezP<0(qZ5;^M1dX`TgF!x|y83 zmAsn_XPRPQ#iH$|fXXrLG_Y}8I|B@*wOfF4n|3SE(H%o4bMraM9m;7_?pjHkaw`|K zDfj19Y2nGU*6-IGdM+h=exyH8!cJM65{yM{I&Ati+0Jvy#qD>>l#2ED%9M)TFXTes zpp40WC3`IBEcGL?6@$h6+WP8uX(5*}vK!VWJ`*W4#|&7WPv3wkQ@Z2^w3D${n@(## zKrT_uwC)_yru9>4ZMsEchc*?kku%V3yUgLV=Xq(t1Chs%F#|o^ZY$?ks z{ol&eX#{)X@P$|FigQp|#!nqpmhmem;}Fc^MRL+2TVa+vb_!>5a^gEKwa9R#WmpPt zeX?ieKEE_!6l_7i0p)A&?b#+0AO5wJcw37Gw;Y|%e>*!)dR zdg&cJ`x7~h@J&)O?#-9pdJLJ^w2|K z)gD@l2f+$KDk4a+kVB!tddNjB9wa9zB8azIL@z1|iaq!yGaFd=&Fp(`=Dp4G?ewc# z>3iwO?@xf0O2W+ob0@TO!0JiuJkXcZE&$a*?E&BqPhf<(_5|hjO=wf@-Lf|2&Ry1~ z+-I}WfhW(ZKj=8}TuNAZq+d|NMnjttT1{;_%y~@~Hm6(+zg4DG)ZZynDw?0j#mXfa zgFUjx!jbY6+GLCQo&BY6(t+GYWR^gv%UGHD{y)9tJj^E*Kc&E)OD>MPpenSPsV@#?Hf7 zi(SCVcI*LE-WwQaLf#Fj&&qNVjUUQ#5@-LBy^uTP{caP&;#NSjo9|IBhd}$FiAcC% z;8DRG5}Pi1Cw2h`>L!YU6$K4@X^mW@ z;`AF@H{o4mP9VlG*D&Fa3x^tru-jA%*@538i|J`bZoeUWft)mYc9dmIdrw(*nfj?r zlSWS}2|w^UQ!x%J%lOe_$}+xoDv5wuyhPp^AzRTncSIK7gQmyCLW);f9+gzGc&k5+!ZeL))sqfU0c1i?#cDVdVhi*gC29M J-k+TP_#e?*F|90%~P?jIsMba2UV4?!_sAt z0xLWeN^}r15Hb)FG_6Y%ED=OtU0TAZ!%9IRp85lY{ocMemlhs;es6xi_vg27v(~z@ z(RwTHmt!F?*VWA=Fuzwh1yth7X`r}IIRj)9%ALSgR|tK~%necP!ER-$UCSy{ZRwOU z)h?eGb}X@%aiebEGO6I?ZS{c)KF=ysLEF4CZT4q{tmin@;`=jcDn;$3G?n7+TXKGQ zOysnDAY07qD~w>7tTDSj|NN7%Bc_qv^6P=koFtlmk}aFQ0mHwA3#KPl`m0R4&F&0C zE6|;3{=yz*nqSzjOsAO3DANTNd%_sdO=fVQ>IysDb8;wN3S*F)-0@iwlUG#0Qs}rD zIF0h1z!@yB1nxxjRTx>O*UwgaFD*K;V?$bWqIZ*QdE6k!e}tiHTyv;*wQcEwM_t?% zfv=mMV^LBm7D0~73zrU)buH(59)5L2V6YP-oH|tP4xB>#OyD%^Yk@Opo{Au^v%F5t zUb|1u)8h1-oQuFZ&J0H%#FGaR*je46Ci<9Nl!3TG`6*c+9cAQFg={&Z(}=&57CF~9 zq{S`2Zb?(8u^x@WcC30=N-feNzj8oYPcb!z+QDZg@ zhV`rC<%#if!|Hgs@zG4e21h^IXmFTtp~C~ceQ02C{-2*n#6mQ}G$N~sSd@MI2bdlD AkpKVy delta 996 zcmXxiPe>F|90%~P?aUJ4p+ifCa|l|hgO&To5XtO0PVO|bGsDbmu2K{sQQ)EIvV<^) z0`<0)M8ZM_f(1c>qIQXb2#Gx;2>rpRgVG@iFNHx+zqjwr!ocVE=J$K={eH8Ho2@@L zTB};ro=SiPf$3y`i~FRrz^Epj1GEFuc>qVGJAlWX3G_0@IzzQzPe@bkctM(K)90nB zcH}Cz@A9*hiH0NBp@Kbkt-MQt zUZS39{qSCCS|2_rO}99gm!<};^e8xOI?OhJYQXIqp>ILEp`hPz3_oHS^xc#J%VJ|9 zb`I_LW9Kol7`p@26$J%m^1Gq-UYJkf<%Tey#P$!e8yYrw?Uw>mH*}w7SNkVi3TcYX zDk9SfeV3BbDHWE{Xc*~ZWK*|-FvMJ^3Y!fK8Z@D5ckC?IF2&Aa=k3^e)bFY&nyhHj zu*V;fi?liY`eszPXPNDr{kS%(!Yi0IH4vdZCj#C<`*X56G{ng1*JRh{lg8SrFwZ%) zDa^Z^-V&xsV=|e9=ev!mq+5h}{^%iLo?kthgwJ#%Ah+mbJt`QsnZdTn1J8D7MC&#; zPs?D%CA+%CFQEm(eAE4xh54q#*OLegzn|x{O$zfI?V&KwX?~JK$jWpQu>Mw9r*B}l zt&3oQ{s;ILJB#%9*g0rF$(Av=JpU@ubNpU&*TQ_gtKQx8^wv~mY^u_ Date: Sun, 11 Jul 2021 00:16:05 +0200 Subject: [PATCH 16/27] miami: switch out current ini_parser.hpp with pulzed/mINI --- src/core/re3.cpp | 111 +++--- src/extras/ini.h | 761 ++++++++++++++++++++++++++++++++++++++ src/extras/ini_parser.hpp | 333 ----------------- 3 files changed, 822 insertions(+), 383 deletions(-) create mode 100644 src/extras/ini.h delete mode 100644 src/extras/ini_parser.hpp diff --git a/src/core/re3.cpp b/src/core/re3.cpp index e2220467..37c0a7ae 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -189,16 +189,29 @@ CustomFrontendOptionsPopulate(void) #endif #ifdef LOAD_INI_SETTINGS -#include "ini_parser.hpp" +#define MINI_CASE_SENSITIVE +#include "ini.h" + +mINI::INIFile ini("reVC.ini"); +mINI::INIStructure cfg; -linb::ini cfg; bool ReadIniIfExists(const char *cat, const char *key, uint32 *out) { - std::string strval = cfg.get(cat, key, "\xBA"); - const char *value = strval.c_str(); - char *endPtr; - if (value && value[0] != '\xBA') { - *out = strtoul(value, &endPtr, 0); + mINI::INIMap section = cfg.get(cat); + if (section.has(key)) { + char *endPtr; + *out = strtoul(section.get(key).c_str(), &endPtr, 0); + return true; + } + return false; +} + +bool ReadIniIfExists(const char *cat, const char *key, uint8 *out) +{ + mINI::INIMap section = cfg.get(cat); + if (section.has(key)) { + char *endPtr; + *out = strtoul(section.get(key).c_str(), &endPtr, 0); return true; } return false; @@ -206,11 +219,10 @@ bool ReadIniIfExists(const char *cat, const char *key, uint32 *out) bool ReadIniIfExists(const char *cat, const char *key, bool *out) { - std::string strval = cfg.get(cat, key, "\xBA"); - const char *value = strval.c_str(); - char *endPtr; - if (value && value[0] != '\xBA') { - *out = strtoul(value, &endPtr, 0); + mINI::INIMap section = cfg.get(cat); + if (section.has(key)) { + char *endPtr; + *out = strtoul(section.get(key).c_str(), &endPtr, 0); return true; } return false; @@ -218,11 +230,10 @@ bool ReadIniIfExists(const char *cat, const char *key, bool *out) bool ReadIniIfExists(const char *cat, const char *key, int32 *out) { - std::string strval = cfg.get(cat, key, "\xBA"); - const char *value = strval.c_str(); - char *endPtr; - if (value && value[0] != '\xBA') { - *out = strtol(value, &endPtr, 0); + mINI::INIMap section = cfg.get(cat); + if (section.has(key)) { + char *endPtr; + *out = strtol(section.get(key).c_str(), &endPtr, 0); return true; } return false; @@ -230,11 +241,10 @@ bool ReadIniIfExists(const char *cat, const char *key, int32 *out) bool ReadIniIfExists(const char *cat, const char *key, int8 *out) { - std::string strval = cfg.get(cat, key, "\xBA"); - const char *value = strval.c_str(); - char *endPtr; - if (value && value[0] != '\xBA') { - *out = strtol(value, &endPtr, 0); + mINI::INIMap section = cfg.get(cat); + if (section.has(key)) { + char *endPtr; + *out = strtol(section.get(key).c_str(), &endPtr, 0); return true; } return false; @@ -242,10 +252,10 @@ bool ReadIniIfExists(const char *cat, const char *key, int8 *out) bool ReadIniIfExists(const char *cat, const char *key, float *out) { - std::string strval = cfg.get(cat, key, "\xBA"); - const char *value = strval.c_str(); - if (value && value[0] != '\xBA') { - *out = atof(value); + mINI::INIMap section = cfg.get(cat); + if (section.has(key)) { + char *endPtr; + *out = strtof(section.get(key).c_str(), &endPtr); return true; } return false; @@ -253,10 +263,10 @@ bool ReadIniIfExists(const char *cat, const char *key, float *out) bool ReadIniIfExists(const char *cat, const char *key, char *out, int size) { - std::string strval = cfg.get(cat, key, "\xBA"); - const char *value = strval.c_str(); - if (value && value[0] != '\xBA') { - strncpy(out, value, size); + mINI::INIMap section = cfg.get(cat); + if (section.has(key)) { + strncpy(out, section.get(key).c_str(), size - 1); + out[size - 1] = '\0'; return true; } return false; @@ -264,42 +274,42 @@ bool ReadIniIfExists(const char *cat, const char *key, char *out, int size) void StoreIni(const char *cat, const char *key, uint32 val) { - char temp[10]; -sprintf(temp, "%u", val); - cfg.set(cat, key, temp); + char temp[11]; + sprintf(temp, "%u", val); + cfg[cat][key] = temp; } void StoreIni(const char *cat, const char *key, uint8 val) { - char temp[10]; - sprintf(temp, "%u", (uint32)val); - cfg.set(cat, key, temp); + char temp[11]; + sprintf(temp, "%u", val); + cfg[cat][key] = temp; } void StoreIni(const char *cat, const char *key, int32 val) { - char temp[10]; + char temp[11]; sprintf(temp, "%d", val); - cfg.set(cat, key, temp); + cfg[cat][key] = temp; } void StoreIni(const char *cat, const char *key, int8 val) { - char temp[10]; - sprintf(temp, "%d", (int32)val); - cfg.set(cat, key, temp); + char temp[11]; + sprintf(temp, "%d", val); + cfg[cat][key] = temp; } void StoreIni(const char *cat, const char *key, float val) { - char temp[10]; + char temp[50]; sprintf(temp, "%f", val); - cfg.set(cat, key, temp); + cfg[cat][key] = temp; } void StoreIni(const char *cat, const char *key, char *val, int size) { - cfg.set(cat, key, val); + cfg[cat][key] = val; } const char *iniControllerActions[] = { "PED_FIREWEAPON", "PED_CYCLE_WEAPON_RIGHT", "PED_CYCLE_WEAPON_LEFT", "GO_FORWARD", "GO_BACK", "GO_LEFT", "GO_RIGHT", "PED_SNIPER_ZOOM_IN", @@ -361,7 +371,7 @@ void LoadINIControllerSettings() #endif // force to default GTA behaviour (never overwrite bindings on joy change/initialization) if user init'ed/set bindings before we introduced that if (!ReadIniIfExists("Controller", "PadButtonsInited", &ControlsManager.ms_padButtonsInited)) { - ControlsManager.ms_padButtonsInited = cfg.category_size("Bindings") != 0 ? 16 : 0; + ControlsManager.ms_padButtonsInited = cfg.get("Bindings").size() != 0 ? 16 : 0; } for (int32 i = 0; i < MAX_CONTROLLERACTIONS; i++) { @@ -463,12 +473,13 @@ void SaveINIControllerSettings() #endif #endif StoreIni("Controller", "PadButtonsInited", ControlsManager.ms_padButtonsInited); - cfg.write_file("reVC.ini"); + + ini.write(cfg); } bool LoadINISettings() { - if (!cfg.load_file("reVC.ini")) + if (!ini.read(cfg)) return false; #ifdef IMPROVED_VIDEOMODE @@ -540,7 +551,7 @@ bool LoadINISettings() #endif #ifdef CUSTOM_FRONTEND_OPTIONS - bool migrate = cfg.category_size("FrontendOptions") != 0; + bool migrate = cfg.get("FrontendOptions").size() != 0; for (int i = 0; i < MENUPAGES; i++) { for (int j = 0; j < NUM_MENUROWS; j++) { CMenuScreenCustom::CMenuEntry &option = aScreens[i].m_aEntries[j]; @@ -553,7 +564,7 @@ bool LoadINISettings() // Migrate from old .ini to new .ini if (migrate && ReadIniIfExists("FrontendOptions", option.m_CFO->save, option.m_CFO->value)) - cfg.remove("FrontendOptions", option.m_CFO->save); + cfg["FrontendOptions"].remove(option.m_CFO->save); else ReadIniIfExists(option.m_CFO->saveCat, option.m_CFO->save, option.m_CFO->value); @@ -652,7 +663,7 @@ void SaveINISettings() } #endif - cfg.write_file("reVC.ini"); + ini.write(cfg); } #endif diff --git a/src/extras/ini.h b/src/extras/ini.h new file mode 100644 index 00000000..44dd3d57 --- /dev/null +++ b/src/extras/ini.h @@ -0,0 +1,761 @@ +/* + * The MIT License (MIT) + * Copyright (c) 2018 Danijel Durakovic + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/////////////////////////////////////////////////////////////////////////////// +// +// /mINI/ v0.9.10 +// An INI file reader and writer for the modern age. +// +/////////////////////////////////////////////////////////////////////////////// +// +// A tiny utility library for manipulating INI files with a straightforward +// API and a minimal footprint. It conforms to the (somewhat) standard INI +// format - sections and keys are case insensitive and all leading and +// trailing whitespace is ignored. Comments are lines that begin with a +// semicolon. Trailing comments are allowed on section lines. +// +// Files are read on demand, upon which data is kept in memory and the file +// is closed. This utility supports lazy writing, which only writes changes +// and updates to a file and preserves custom formatting and comments. A lazy +// write invoked by a write() call will read the output file, find what +// changes have been made and update the file accordingly. If you only need to +// generate files, use generate() instead. Section and key order is preserved +// on read, write and insert. +// +/////////////////////////////////////////////////////////////////////////////// +// +// /* BASIC USAGE EXAMPLE: */ +// +// /* read from file */ +// mINI::INIFile file("myfile.ini"); +// mINI::INIStructure ini; +// file.read(ini); +// +// /* read value; gets a reference to actual value in the structure. +// if key or section don't exist, a new empty value will be created */ +// std::string& value = ini["section"]["key"]; +// +// /* read value safely; gets a copy of value in the structure. +// does not alter the structure */ +// std::string value = ini.get("section").get("key"); +// +// /* set or update values */ +// ini["section"]["key"] = "value"; +// +// /* set multiple values */ +// ini["section2"].set({ +// {"key1", "value1"}, +// {"key2", "value2"} +// }); +// +// /* write updates back to file, preserving comments and formatting */ +// file.write(ini); +// +// /* or generate a file (overwrites the original) */ +// file.generate(ini); +// +/////////////////////////////////////////////////////////////////////////////// +// +// Long live the INI file!!! +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef MINI_INI_H_ +#define MINI_INI_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace mINI +{ + namespace INIStringUtil + { + const char* const whitespaceDelimiters = " \t\n\r\f\v"; + inline void trim(std::string& str) + { + str.erase(str.find_last_not_of(whitespaceDelimiters) + 1); + str.erase(0, str.find_first_not_of(whitespaceDelimiters)); + } +#ifndef MINI_CASE_SENSITIVE + inline void toLower(std::string& str) + { + std::transform(str.begin(), str.end(), str.begin(), [](const char c) { + return static_cast(std::tolower(c)); + }); + } +#endif + inline void replace(std::string& str, std::string const& a, std::string const& b) + { + if (!a.empty()) + { + std::size_t pos = 0; + while ((pos = str.find(a, pos)) != std::string::npos) + { + str.replace(pos, a.size(), b); + pos += b.size(); + } + } + } +#ifdef _WIN32 + const char* const endl = "\r\n"; +#else + const char* const endl = "\n"; +#endif + }; + + template + class INIMap + { + private: + using T_DataIndexMap = std::unordered_map; + using T_DataItem = std::pair; + using T_DataContainer = std::vector; + using T_MultiArgs = typename std::vector>; + + T_DataIndexMap dataIndexMap; + T_DataContainer data; + + inline std::size_t setEmpty(std::string& key) + { + std::size_t index = data.size(); + dataIndexMap[key] = index; + data.emplace_back(key, T()); + return index; + } + + public: + using const_iterator = typename T_DataContainer::const_iterator; + + INIMap() { } + + INIMap(INIMap const& other) + { + std::size_t data_size = other.data.size(); + for (std::size_t i = 0; i < data_size; ++i) + { + auto const& key = other.data[i].first; + auto const& obj = other.data[i].second; + data.emplace_back(key, obj); + } + dataIndexMap = T_DataIndexMap(other.dataIndexMap); + } + + T& operator[](std::string key) + { + INIStringUtil::trim(key); +#ifndef MINI_CASE_SENSITIVE + INIStringUtil::toLower(key); +#endif + auto it = dataIndexMap.find(key); + bool hasIt = (it != dataIndexMap.end()); + std::size_t index = (hasIt) ? it->second : setEmpty(key); + return data[index].second; + } + T get(std::string key) const + { + INIStringUtil::trim(key); +#ifndef MINI_CASE_SENSITIVE + INIStringUtil::toLower(key); +#endif + auto it = dataIndexMap.find(key); + if (it == dataIndexMap.end()) + { + return T(); + } + return T(data[it->second].second); + } + bool has(std::string key) const + { + INIStringUtil::trim(key); +#ifndef MINI_CASE_SENSITIVE + INIStringUtil::toLower(key); +#endif + return (dataIndexMap.count(key) == 1); + } + void set(std::string key, T obj) + { + INIStringUtil::trim(key); +#ifndef MINI_CASE_SENSITIVE + INIStringUtil::toLower(key); +#endif + auto it = dataIndexMap.find(key); + if (it != dataIndexMap.end()) + { + data[it->second].second = obj; + } + else + { + dataIndexMap[key] = data.size(); + data.emplace_back(key, obj); + } + } + void set(T_MultiArgs const& multiArgs) + { + for (auto const& it : multiArgs) + { + auto const& key = it.first; + auto const& obj = it.second; + set(key, obj); + } + } + bool remove(std::string key) + { + INIStringUtil::trim(key); +#ifndef MINI_CASE_SENSITIVE + INIStringUtil::toLower(key); +#endif + auto it = dataIndexMap.find(key); + if (it != dataIndexMap.end()) + { + std::size_t index = it->second; + data.erase(data.begin() + index); + dataIndexMap.erase(it); + for (auto& it2 : dataIndexMap) + { + auto& vi = it2.second; + if (vi > index) + { + vi--; + } + } + return true; + } + return false; + } + void clear() + { + data.clear(); + dataIndexMap.clear(); + } + std::size_t size() const + { + return data.size(); + } + const_iterator begin() const { return data.begin(); } + const_iterator end() const { return data.end(); } + }; + + using INIStructure = INIMap>; + + namespace INIParser + { + using T_ParseValues = std::pair; + + enum class PDataType : char + { + PDATA_NONE, + PDATA_COMMENT, + PDATA_SECTION, + PDATA_KEYVALUE, + PDATA_UNKNOWN + }; + + inline PDataType parseLine(std::string line, T_ParseValues& parseData) + { + parseData.first.clear(); + parseData.second.clear(); + INIStringUtil::trim(line); + if (line.empty()) + { + return PDataType::PDATA_NONE; + } + char firstCharacter = line[0]; + if (firstCharacter == ';') + { + return PDataType::PDATA_COMMENT; + } + if (firstCharacter == '[') + { + auto commentAt = line.find_first_of(';'); + if (commentAt != std::string::npos) + { + line = line.substr(0, commentAt); + } + auto closingBracketAt = line.find_last_of(']'); + if (closingBracketAt != std::string::npos) + { + auto section = line.substr(1, closingBracketAt - 1); + INIStringUtil::trim(section); + parseData.first = section; + return PDataType::PDATA_SECTION; + } + } + auto lineNorm = line; + INIStringUtil::replace(lineNorm, "\\=", " "); + auto equalsAt = lineNorm.find_first_of('='); + if (equalsAt != std::string::npos) + { + auto key = line.substr(0, equalsAt); + INIStringUtil::trim(key); + INIStringUtil::replace(key, "\\=", "="); + auto value = line.substr(equalsAt + 1); + INIStringUtil::trim(value); + parseData.first = key; + parseData.second = value; + return PDataType::PDATA_KEYVALUE; + } + return PDataType::PDATA_UNKNOWN; + } + }; + + class INIReader + { + public: + using T_LineData = std::vector; + using T_LineDataPtr = std::shared_ptr; + + private: + std::ifstream fileReadStream; + T_LineDataPtr lineData; + + T_LineData readFile() + { + std::string fileContents; + fileReadStream.seekg(0, std::ios::end); + fileContents.resize(fileReadStream.tellg()); + fileReadStream.seekg(0, std::ios::beg); + std::size_t fileSize = fileContents.size(); + fileReadStream.read(&fileContents[0], fileSize); + fileReadStream.close(); + T_LineData output; + if (fileSize == 0) + { + return output; + } + std::string buffer; + buffer.reserve(50); + for (std::size_t i = 0; i < fileSize; ++i) + { + char& c = fileContents[i]; + if (c == '\n') + { + output.emplace_back(buffer); + buffer.clear(); + continue; + } + if (c != '\0' && c != '\r') + { + buffer += c; + } + } + output.emplace_back(buffer); + return output; + } + + public: + INIReader(std::string const& filename, bool keepLineData = false) + { + fileReadStream.open(filename, std::ios::in | std::ios::binary); + if (keepLineData) + { + lineData = std::make_shared(); + } + } + ~INIReader() { } + + bool operator>>(INIStructure& data) + { + if (!fileReadStream.is_open()) + { + return false; + } + T_LineData fileLines = readFile(); + std::string section; + bool inSection = false; + INIParser::T_ParseValues parseData; + for (auto const& line : fileLines) + { + auto parseResult = INIParser::parseLine(line, parseData); + if (parseResult == INIParser::PDataType::PDATA_SECTION) + { + inSection = true; + data[section = parseData.first]; + } + else if (inSection && parseResult == INIParser::PDataType::PDATA_KEYVALUE) + { + auto const& key = parseData.first; + auto const& value = parseData.second; + data[section][key] = value; + } + if (lineData && parseResult != INIParser::PDataType::PDATA_UNKNOWN) + { + if (parseResult == INIParser::PDataType::PDATA_KEYVALUE && !inSection) + { + continue; + } + lineData->emplace_back(line); + } + } + return true; + } + T_LineDataPtr getLines() + { + return lineData; + } + }; + + class INIGenerator + { + private: + std::ofstream fileWriteStream; + + public: + bool prettyPrint = false; + + INIGenerator(std::string const& filename) + { + fileWriteStream.open(filename, std::ios::out | std::ios::binary); + } + ~INIGenerator() { } + + bool operator<<(INIStructure const& data) + { + if (!fileWriteStream.is_open()) + { + return false; + } + if (!data.size()) + { + return true; + } + auto it = data.begin(); + for (;;) + { + auto const& section = it->first; + auto const& collection = it->second; + fileWriteStream + << "[" + << section + << "]"; + if (collection.size()) + { + fileWriteStream << INIStringUtil::endl; + auto it2 = collection.begin(); + for (;;) + { + auto key = it2->first; + INIStringUtil::replace(key, "=", "\\="); + auto value = it2->second; + INIStringUtil::trim(value); + fileWriteStream + << key + << ((prettyPrint) ? " = " : "=") + << value; + if (++it2 == collection.end()) + { + break; + } + fileWriteStream << INIStringUtil::endl; + } + } + if (++it == data.end()) + { + break; + } + fileWriteStream << INIStringUtil::endl; + if (prettyPrint) + { + fileWriteStream << INIStringUtil::endl; + } + } + return true; + } + }; + + class INIWriter + { + private: + using T_LineData = std::vector; + using T_LineDataPtr = std::shared_ptr; + + std::string filename; + + T_LineData getLazyOutput(T_LineDataPtr const& lineData, INIStructure& data, INIStructure& original) + { + T_LineData output; + INIParser::T_ParseValues parseData; + std::string sectionCurrent; + bool parsingSection = false; + bool continueToNextSection = false; + bool discardNextEmpty = false; + bool writeNewKeys = false; + std::size_t lastKeyLine = 0; + for (auto line = lineData->begin(); line != lineData->end(); ++line) + { + if (!writeNewKeys) + { + auto parseResult = INIParser::parseLine(*line, parseData); + if (parseResult == INIParser::PDataType::PDATA_SECTION) + { + if (parsingSection) + { + writeNewKeys = true; + parsingSection = false; + --line; + continue; + } + sectionCurrent = parseData.first; + if (data.has(sectionCurrent)) + { + parsingSection = true; + continueToNextSection = false; + discardNextEmpty = false; + output.emplace_back(*line); + lastKeyLine = output.size(); + } + else + { + continueToNextSection = true; + discardNextEmpty = true; + continue; + } + } + else if (parseResult == INIParser::PDataType::PDATA_KEYVALUE) + { + if (continueToNextSection) + { + continue; + } + if (data.has(sectionCurrent)) + { + auto& collection = data[sectionCurrent]; + auto const& key = parseData.first; + auto const& value = parseData.second; + if (collection.has(key)) + { + auto outputValue = collection[key]; + if (value == outputValue) + { + output.emplace_back(*line); + } + else + { + INIStringUtil::trim(outputValue); + auto lineNorm = *line; + INIStringUtil::replace(lineNorm, "\\=", " "); + auto equalsAt = lineNorm.find_first_of('='); + auto valueAt = lineNorm.find_first_not_of( + INIStringUtil::whitespaceDelimiters, + equalsAt + 1 + ); + std::string outputLine = line->substr(0, valueAt); + if (prettyPrint && equalsAt + 1 == valueAt) + { + outputLine += " "; + } + outputLine += outputValue; + output.emplace_back(outputLine); + } + lastKeyLine = output.size(); + } + } + } + else + { + if (discardNextEmpty && line->empty()) + { + discardNextEmpty = false; + } + else if (parseResult != INIParser::PDataType::PDATA_UNKNOWN) + { + output.emplace_back(*line); + } + } + } + if (writeNewKeys || std::next(line) == lineData->end()) + { + T_LineData linesToAdd; + if (data.has(sectionCurrent) && original.has(sectionCurrent)) + { + auto const& collection = data[sectionCurrent]; + auto const& collectionOriginal = original[sectionCurrent]; + for (auto const& it : collection) + { + auto key = it.first; + if (collectionOriginal.has(key)) + { + continue; + } + auto value = it.second; + INIStringUtil::replace(key, "=", "\\="); + INIStringUtil::trim(value); + linesToAdd.emplace_back( + key + ((prettyPrint) ? " = " : "=") + value + ); + } + } + if (!linesToAdd.empty()) + { + output.insert( + output.begin() + lastKeyLine, + linesToAdd.begin(), + linesToAdd.end() + ); + } + if (writeNewKeys) + { + writeNewKeys = false; + --line; + } + } + } + for (auto const& it : data) + { + auto const& section = it.first; + if (original.has(section)) + { + continue; + } + if (prettyPrint && output.size() > 0 && !output.back().empty()) + { + output.emplace_back(); + } + output.emplace_back("[" + section + "]"); + auto const& collection = it.second; + for (auto const& it2 : collection) + { + auto key = it2.first; + auto value = it2.second; + INIStringUtil::replace(key, "=", "\\="); + INIStringUtil::trim(value); + output.emplace_back( + key + ((prettyPrint) ? " = " : "=") + value + ); + } + } + return output; + } + + public: + bool prettyPrint = false; + + INIWriter(std::string const& filename) + : filename(filename) + { + } + ~INIWriter() { } + + bool operator<<(INIStructure& data) + { + struct stat buf; + bool fileExists = (stat(filename.c_str(), &buf) == 0); + if (!fileExists) + { + INIGenerator generator(filename); + generator.prettyPrint = prettyPrint; + return generator << data; + } + INIStructure originalData; + T_LineDataPtr lineData; + bool readSuccess = false; + { + INIReader reader(filename, true); + if ((readSuccess = reader >> originalData)) + { + lineData = reader.getLines(); + } + } + if (!readSuccess) + { + return false; + } + T_LineData output = getLazyOutput(lineData, data, originalData); + std::ofstream fileWriteStream(filename, std::ios::out | std::ios::binary); + if (fileWriteStream.is_open()) + { + if (output.size()) + { + auto line = output.begin(); + for (;;) + { + fileWriteStream << *line; + if (++line == output.end()) + { + break; + } + fileWriteStream << INIStringUtil::endl; + } + } + return true; + } + return false; + } + }; + + class INIFile + { + private: + std::string filename; + + public: + INIFile(std::string const& filename) + : filename(filename) + { } + + ~INIFile() { } + + bool read(INIStructure& data) const + { + if (data.size()) + { + data.clear(); + } + if (filename.empty()) + { + return false; + } + INIReader reader(filename); + return reader >> data; + } + bool generate(INIStructure const& data, bool pretty = false) const + { + if (filename.empty()) + { + return false; + } + INIGenerator generator(filename); + generator.prettyPrint = pretty; + return generator << data; + } + bool write(INIStructure& data, bool pretty = false) const + { + if (filename.empty()) + { + return false; + } + INIWriter writer(filename); + writer.prettyPrint = pretty; + return writer << data; + } + }; +} + +#endif // MINI_INI_H_ diff --git a/src/extras/ini_parser.hpp b/src/extras/ini_parser.hpp deleted file mode 100644 index 7bea024c..00000000 --- a/src/extras/ini_parser.hpp +++ /dev/null @@ -1,333 +0,0 @@ -/* - * Copyright (c) 2013-2015 Denilson das Mercês Amorim - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - * - */ -#ifndef LINB_INI_PARSER_HPP -#define LINB_INI_PARSER_HPP - -/* - * STL-like INI Container - */ - -#include // for std::string -#include // for std::map -#include // for std::FILE -#include // for std::find_if -#include // for std::function - -namespace linb -{ - template< - class CharT = char, /* Not compatible with other type here, since we're using C streams */ - class StringType = std::basic_string, - class KeyContainer = std::map, - class SectionContainer = std::map - > class basic_ini - { - public: - typedef CharT char_type; - typedef StringType string_type; - typedef KeyContainer key_container; - typedef SectionContainer section_container; - - // Typedef container values types - typedef typename section_container::value_type value_type; - typedef typename section_container::key_type key_type; - typedef typename section_container::mapped_type mapped_type; - - // Typedef common types - typedef typename section_container::size_type size_type; - typedef typename section_container::difference_type difference_type; - - // Typedef iterators - typedef typename section_container::iterator iterator; - typedef typename section_container::const_iterator const_iterator; - typedef typename section_container::reverse_iterator reverse_iterator; - typedef typename section_container::const_reverse_iterator const_reverse_iterator; - - // typedef References and pointers - typedef typename section_container::reference reference; - typedef typename section_container::const_reference const_reference; - typedef typename section_container::pointer pointer; - typedef typename section_container::const_pointer const_pointer; - - private: - section_container data; - - public: - - basic_ini() - { } - - basic_ini(const char_type* filename) - { this->read_file(filename); } - - /* Iterator methods */ - iterator begin() - { return data.begin(); } - const_iterator begin() const - { return data.begin(); } - iterator end() - { return data.end(); } - const_iterator end() const - { return data.end(); } - const_iterator cbegin() const - { return data.cbegin(); } - const_iterator cend() const - { return data.cend(); } - - /* Reverse iterator methods */ - reverse_iterator rbegin() - { return data.rbegin(); } - const_reverse_iterator rbegin() const - { return data.rbegin(); } - reverse_iterator rend() - { return data.rend(); } - const_reverse_iterator rend() const - { return data.rend(); } - const_reverse_iterator crbegin() const - { return data.crbegin(); } - const_reverse_iterator crend() const - { return data.crend(); } - - /* Acessing index methods */ - mapped_type& operator[](const string_type& sect) - { return data[sect]; } - mapped_type& operator[](string_type&& sect) - { return data[std::forward(sect)]; } - mapped_type& at( const string_type& sect) - { return data.at(sect); } - const mapped_type& at(const string_type& sect) const - { return data.at(sect); } - - /* Capacity information */ - bool empty() const - { return data.empty(); } - size_type size() const - { return data.size(); } - size_type max_size() const - { return data.max_size(); } - - /* Modifiers */ - void clear() - { return data.clear(); } - - /* Lookup */ - size_type count(const string_type& sect) - { return data.count(sect); } - iterator find(const string_type& sect) - { return data.find(sect); } - - /* Gets a value from the specified section & key, default_value is returned if the sect & key doesn't exist */ - string_type get(const string_type& sect, const key_type& key, const string_type& default_value) - { - auto it = this->find(sect); - if(it != this->end()) - { - auto itv = it->second.find(key); - if(itv != it->second.end()) - return itv->second; - } - return default_value; - } - - /* Sets the value of a value in the ini */ - void set(const string_type& sect, const key_type& key, const string_type& value) - { - (*this)[sect][key] = value; // no emplace since overwrite! - } - - /* Too lazy to continue this container... If you need more methods, just add it */ - - // re3 - void remove(const string_type& sect, const key_type& key) - { - auto it = this->find(sect); - if(it != this->end()) - { - it->second.erase(key); - } - } - - int category_size(const string_type& sect) - { - auto it = this->find(sect); - if(it != this->end()) - { - return it->second.size(); - } - return 0; - } - -#if 1 - bool read_file(const char_type* filename) - { - /* Using C stream in a STL-like container, funny? - */ - if(FILE* f = fopen(filename, "r")) - { - key_container* keys = nullptr; - char_type buf[2048]; - string_type line; - string_type key; - string_type value; - string_type null_string; - size_type pos; - - // Trims an string - auto trim = [](string_type& s, bool trimLeft, bool trimRight) -> string_type& - { - if(s.size()) - { - // Ignore UTF-8 BOM - while(s.size() >= 3 && s[0] == (char)(0xEF) && s[1] == (char)(0xBB) && s[2] == (char)(0xBF)) - s.erase(s.begin(), s.begin() + 3); - - if(trimLeft) - s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(std::function(::isspace)))); - if(trimRight) - s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::function(::isspace))).base(), s.end()); - } - return s; - }; - - // Start parsing - while(fgets(buf, sizeof(buf), f)) - { - // What a thing, reading into a char buffer and then putting in the string... - line = buf; - - // Find comment and remove anything after it from the line - if((pos = line.find_first_of(';')) != line.npos) - line.erase(pos); - - // Trim the string, and if it gets empty, skip this line - if(trim(line, true, true).empty()) - continue; - - // Find section name - if(line.front() == '[' && line.back() == ']') - { - pos = line.length() - 1; //line.find_first_of(']'); - if(pos != line.npos) - { - trim(key.assign(line, 1, pos-1), true, true); - keys = &data[std::move(key)]; // Create section - } - else - keys = nullptr; - } - else - { - // Find key and value positions - pos = line.find_first_of('='); - if(pos == line.npos) - { - // There's only the key - key = line; // No need for trim, line is already trimmed - value.clear(); - } - else - { - // There's the key and the value - trim(key.assign(line, 0, pos), false, true); // trim the right - trim(value.assign(line, pos + 1, line.npos), true, false); // trim the left - } - - // Put the key/value into the current keys object, or into the section "" if no section has been found - #if __cplusplus >= 201103L || _MSC_VER >= 1800 - (keys ? *keys : data[null_string]).emplace(std::move(key), std::move(value)); - #else - (keys ? *keys : data[null_string])[key] = value; - key.clear(); value.clear(); - #endif - } - } - - fclose(f); - return true; - } - return false; - } - - /* - * Dumps the content of this container into an ini file - */ - bool write_file(const char_type* filename) - { - if(FILE* f = fopen(filename, "w")) - { - bool first = true; - for(auto& sec : this->data) - { - fprintf(f, first? "[%s]\n" : "\n[%s]\n", sec.first.c_str()); - first = false; - for(auto& kv : sec.second) - { - if(kv.second.empty()) - fprintf(f, "%s\n", kv.first.c_str()); - else - fprintf(f, "%s = %s\n", kv.first.c_str(), kv.second.c_str()); - } - } - fclose(f); - return true; - } - return false; - } - - - /* - */ - bool load_file(const char_type* filename) - { - return read_file(filename); - } - - bool load_file(const StringType& filename) - { - return load_file(filename.c_str()); - } - - bool write_file(const StringType& filename) - { - return write_file(filename.c_str()); - } -#endif - - - - }; - - - /* Use default basic_ini - * - * Limitations: - * * Not unicode aware - * * Case sensitive - * * Sections must have unique keys - */ - typedef basic_ini<> ini; -} - -#endif - From 3f5fdc39a5fcdf06a8dbd8ba6003b979e21107a8 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Mon, 12 Jul 2021 03:56:07 +0300 Subject: [PATCH 17/27] Reorganize config.h --- .github/workflows/reVC_msvc_amd64.yml | 2 +- src/core/config.h | 180 ++++++++------------------ 2 files changed, 53 insertions(+), 129 deletions(-) diff --git a/.github/workflows/reVC_msvc_amd64.yml b/.github/workflows/reVC_msvc_amd64.yml index ad883d32..a00c5d2c 100644 --- a/.github/workflows/reVC_msvc_amd64.yml +++ b/.github/workflows/reVC_msvc_amd64.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: platform: [win-amd64-librw_d3d9-oal, win-amd64-librw_gl3_glfw-oal] - buildtype: [Debug, Release, Vanilla] + buildtype: [Debug, Release] steps: - name: Add msbuild to PATH uses: microsoft/setup-msbuild@v1.0.2 diff --git a/src/core/config.h b/src/core/config.h index c7d01861..caa6c3e4 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -1,7 +1,9 @@ #pragma once -// disables (most) stuff that wasn't in original gta-vc.exe - check section at the bottom of this file -//#define VANILLA_DEFINES +// disables (most) stuff that wasn't in original gta-vc.exe +#ifdef __MWERKS__ +#define VANILLA_DEFINES +#endif enum Config { NUMPLAYERS = 1, @@ -154,8 +156,33 @@ enum Config { //#define GTA_PS2 //#define GTA_XBOX -// This enables things from the PS2 version on PC -#define GTA_PS2_STUFF +// Version defines +#define GTAVC_PS2 400 +#define GTAVC_PC_10 410 +#define GTAVC_PC_11 411 +#define GTAVC_PC_JAP 412 +// TODO? maybe something for xbox or android? + +#define GTA_VERSION GTAVC_PC_11 + +// TODO(MIAMI): someone ought to find and check out uses of these defines: +//#define GTA3_STEAM_PATCH +//#define GTAVC_JP_PATCH + +#if defined GTA_PS2 +# define GTA_PS2_STUFF +# define RANDOMSPLASH +//# define USE_CUSTOM_ALLOCATOR +# define VU_COLLISION +# define PS2_MENU +#elif defined GTA_PC +# define PC_PLAYER_CONTROLS // mouse player/cam mode +# define GTA_REPLAY +# define GTA_SCENE_EDIT +# define PC_MENU +# define PC_WATER +#elif defined GTA_XBOX +#endif // This is enabled for all released games. // any debug stuff that isn't left in any game is not in FINAL @@ -174,22 +201,24 @@ enum Config { #define FINAL #endif -// Version defines -#define GTAVC_PS2 400 -#define GTAVC_PC_10 410 -#define GTAVC_PC_11 411 -#define GTAVC_PC_JAP 412 -// TODO? maybe something for xbox or android? +// these are placed here to work with VANILLA_DEFINES for compatibility +#define NO_CDCHECK // skip audio CD check +#define DEFAULT_NATIVE_RESOLUTION // Set default video mode to your native resolution (fixes Windows 10 launch) -#define GTA_VERSION GTAVC_PC_11 - -// TODO(MIAMI): someone ought to find and check out uses of these defines: -//#define GTA3_STEAM_PATCH -//#define GTAVC_JP_PATCH +#ifdef VANILLA_DEFINES +#define FINAL +#define MASTER +//#define USE_MY_DOCUMENTS +#define THIS_IS_STUPID +#define DONT_FIX_REPLAY_BUGS +#define USE_TXD_CDIMAGE // generate and load textures from txd.img +//#define USE_TEXTURE_POOL // not possible because R* used custom RW33 +#else +// This enables things from the PS2 version on PC +#define GTA_PS2_STUFF // quality of life fixes that should also be in FINAL #define NASTY_GAME // nasty game for all languages -#define NO_CDCHECK // those infamous texts #define DRAW_GAME_VERSION_TEXT @@ -204,21 +233,10 @@ enum Config { //#define COMPRESSED_COL_VECTORS // use compressed vectors for collision vertices //#define ANIM_COMPRESSION // only keep most recently used anims uncompressed -#if defined GTA_PS2 -# define GTA_PS2_STUFF -# define RANDOMSPLASH -//# define USE_CUSTOM_ALLOCATOR -# define VU_COLLISION -#elif defined GTA_PC -# ifdef GTA_PS2_STUFF -# define USE_PS2_RAND -# define RANDOMSPLASH // use random splash as on PS2 -# define PS2_MATFX -# endif -# define PC_PLAYER_CONTROLS // mouse player/cam mode -# define GTA_REPLAY -# define GTA_SCENE_EDIT -#elif defined GTA_XBOX +#if defined GTA_PC && defined GTA_PS2_STUFF +# define USE_PS2_RAND +# define RANDOMSPLASH // use random splash as on PS2 +# define PS2_MATFX #endif #ifdef VU_COLLISION @@ -258,7 +276,7 @@ enum Config { #define ASCII_STRCMP // use faster ascii str comparisons -#if !defined _WIN32 || defined __MWERKS__ || defined __MINGW32__ || defined VANILLA_DEFINES +#if !defined _WIN32 || defined __MINGW32__ #undef ASCII_STRCMP #endif @@ -293,7 +311,7 @@ enum Config { #endif // Water & Particle -// #define PC_WATER +#undef PC_WATER #define WATER_CHEATS //#define USE_CUTSCENE_SHADOW_FOR_PED @@ -429,98 +447,4 @@ static_assert(false, "SUPPORT_XBOX_SCRIPT and SUPPORT_MOBILE_SCRIPT are mutually #undef PS2_AUDIO_CHANNELS #endif -// ------- - -#if defined __MWERKS__ || defined VANILLA_DEFINES -#define FINAL -#undef CHATTYSPLASH -#undef TIMEBARS - -#define MASTER -#undef VALIDATE_SAVE_SIZE -#undef NO_MOVIES -#undef DEBUGMENU - -#undef DRAW_GAME_VERSION_TEXT - -//#undef NASTY_GAME -//#undef NO_CDCHECK - -#undef GTA_PS2_STUFF -#undef USE_PS2_RAND -#undef RANDOMSPLASH -#undef PS2_MATFX - -#undef FIX_BUGS -#define THIS_IS_STUPID -#undef MORE_LANGUAGES -#undef COMPATIBLE_SAVES -#undef FIX_INCOMPATIBLE_SAVES -#undef LOAD_INI_SETTINGS - -#undef ASPECT_RATIO_SCALE -#undef PROPER_SCALING -//#undef DEFAULT_NATIVE_RESOLUTION -#undef PS2_ALPHA_TEST -#undef IMPROVED_VIDEOMODE -#undef DISABLE_LOADING_SCREEN -#undef DISABLE_VSYNC_ON_TEXTURE_CONVERSION - -#undef EXTENDED_COLOURFILTER -#undef EXTENDED_PIPELINES -#undef SCREEN_DROPLETS -#undef NEW_RENDERER - -#undef FIX_SPRITES - -#define PC_WATER -#undef WATER_CHEATS - -#undef USE_CUTSCENE_SHADOW_FOR_PED -#undef DISABLE_CUTSCENE_SHADOWS - -#undef XINPUT -#undef DETECT_PAD_INPUT_SWITCH -#undef KANGAROO_CHEAT -#undef RESTORE_ALLCARSHELI_CHEAT -#undef BETTER_ALLCARSAREDODO_CHEAT -#undef WALLCLIMB_CHEAT -#undef REGISTER_START_BUTTON -#undef BIND_VEHICLE_FIREWEAPON -#undef BUTTON_ICONS - -#undef FIX_RADAR -#undef RADIO_OFF_TEXT - -#undef MAP_ENHANCEMENTS -#undef GAMEPAD_MENU -#undef MUCH_SHORTER_OUTRO_SCREEN -#undef CUSTOM_FRONTEND_OPTIONS - -#undef GRAPHICS_MENU_OPTIONS -#undef NO_ISLAND_LOADING -#undef CUTSCENE_BORDERS_SWITCH -#undef MULTISAMPLING -#undef INVERT_LOOK_FOR_PAD - -#undef USE_DEBUG_SCRIPT_LOADER -#undef USE_MEASUREMENTS_IN_METERS -#undef USE_PRECISE_MEASUREMENT_CONVERTION -#undef SUPPORT_JAPANESE_SCRIPT -#undef MISSION_REPLAY -#undef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT -#undef USE_BASIC_SCRIPT_DEBUG_OUTPUT - -#define DONT_FIX_REPLAY_BUGS - -#undef EXPLODING_AIRTRAIN -#undef CPLANE_ROTORS -#undef CAMERA_PICKUP -#undef CANCELLABLE_CAR_ENTER -#undef IMPROVED_CAMERA -#undef FREE_CAM -#undef BIG_IMG -#undef PS2_AUDIO_CHANNELS -#undef MULTITHREADED_AUDIO -#undef RADIO_SCROLL_TO_PREV_STATION -#endif +#endif // VANILLA_DEFINES From 2f7ae611edb389330d1022102aac4b7ce3e5709b Mon Sep 17 00:00:00 2001 From: withmorten Date: Mon, 12 Jul 2021 04:13:42 +0200 Subject: [PATCH 18/27] Vanilla config for Windows and win-x86 only --- premake5.lua | 9 +++++---- src/core/config.h | 4 ++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/premake5.lua b/premake5.lua index 69090d49..2535a53e 100644 --- a/premake5.lua +++ b/premake5.lua @@ -68,7 +68,7 @@ end workspace "reVC" language "C++" - configurations { "Debug", "Release", "Vanilla" } + configurations { "Debug", "Release" } startproject "reVC" location "build" symbols "Full" @@ -80,6 +80,7 @@ workspace "reVC" end filter { "system:windows" } + configurations { "Vanilla" } platforms { "win-x86-RW34_d3d8-mss", "win-x86-librw_d3d9-mss", @@ -123,9 +124,6 @@ workspace "reVC" flags { "LinkTimeOptimization" } end - filter "configurations:Vanilla" - defines { "VANILLA_DEFINES" } - filter { "platforms:win*" } system "windows" @@ -305,6 +303,9 @@ project "reVC" includedirs { "src/weapons" } includedirs { "src/extras" } + filter "configurations:Vanilla" + defines { "VANILLA_DEFINES" } + if(not _OPTIONS["no-git-hash"]) then defines { "USE_OUR_VERSIONING" } end diff --git a/src/core/config.h b/src/core/config.h index caa6c3e4..bdc8d534 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -206,6 +206,10 @@ enum Config { #define DEFAULT_NATIVE_RESOLUTION // Set default video mode to your native resolution (fixes Windows 10 launch) #ifdef VANILLA_DEFINES +#if !defined(_WIN32) || defined(__LP64__) || defined(_WIN64) +#error Vanilla can only be built for win-x86 +#endif + #define FINAL #define MASTER //#define USE_MY_DOCUMENTS From 6c097398d15979253633a0c36a4500321473d84b Mon Sep 17 00:00:00 2001 From: withmorten Date: Mon, 12 Jul 2021 22:47:17 +0200 Subject: [PATCH 19/27] fix FixGarages --- src/save/GenericGameStorage.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/save/GenericGameStorage.cpp b/src/save/GenericGameStorage.cpp index 12565e3f..d080512e 100644 --- a/src/save/GenericGameStorage.cpp +++ b/src/save/GenericGameStorage.cpp @@ -828,6 +828,13 @@ FixGarages(uint8 save_type, uint8 *buf, uint8 *buf2, uint32 *size) SkipBuf(buf2, sizeof(CStoredCar)); } + + *size = 0; + + assert(buf - buf_start == read); + assert(buf2 - buf2_start == written); + + *size = 7876; } static void From b69cee380141896494d18830994615b907ebb0da Mon Sep 17 00:00:00 2001 From: withmorten Date: Mon, 12 Jul 2021 23:26:49 +0200 Subject: [PATCH 20/27] fix premake --- premake5.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/premake5.lua b/premake5.lua index 2535a53e..f1287011 100644 --- a/premake5.lua +++ b/premake5.lua @@ -303,9 +303,6 @@ project "reVC" includedirs { "src/weapons" } includedirs { "src/extras" } - filter "configurations:Vanilla" - defines { "VANILLA_DEFINES" } - if(not _OPTIONS["no-git-hash"]) then defines { "USE_OUR_VERSIONING" } end @@ -316,6 +313,9 @@ project "reVC" includedirs { "vendor/opusfile/include" } end + filter "configurations:Vanilla" + defines { "VANILLA_DEFINES" } + filter "platforms:*mss" defines { "AUDIO_MSS" } includedirs { "vendor/milessdk/include" } From c982700a699b1f4cdc0eb7e49239658c5dba2124 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Tue, 13 Jul 2021 01:00:00 +0300 Subject: [PATCH 21/27] Enable cutscene shadows --- src/core/config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/config.h b/src/core/config.h index bdc8d534..244794d5 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -319,7 +319,7 @@ enum Config { #define WATER_CHEATS //#define USE_CUTSCENE_SHADOW_FOR_PED -#define DISABLE_CUTSCENE_SHADOWS +//#define DISABLE_CUTSCENE_SHADOWS // Pad #if !defined(RW_GL3) && defined(_WIN32) From 523b23339cd761d934501dcbcc059d131b5a28c4 Mon Sep 17 00:00:00 2001 From: withmorten Date: Tue, 13 Jul 2021 00:21:11 +0200 Subject: [PATCH 22/27] disable USE_CUTSCENE_SHADOW_FOR_PED if COMPATIBLE_SAVES isn't defined --- src/core/config.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/core/config.h b/src/core/config.h index 244794d5..9c318350 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -318,7 +318,7 @@ enum Config { #undef PC_WATER #define WATER_CHEATS -//#define USE_CUTSCENE_SHADOW_FOR_PED +//#define USE_CUTSCENE_SHADOW_FOR_PED // requires COMPATIBLE_SAVES //#define DISABLE_CUTSCENE_SHADOWS // Pad @@ -451,4 +451,9 @@ static_assert(false, "SUPPORT_XBOX_SCRIPT and SUPPORT_MOBILE_SCRIPT are mutually #undef PS2_AUDIO_CHANNELS #endif +// if these defines are enabled saves are not vanilla compatible without COMPATIBLE_SAVES +#ifndef COMPATIBLE_SAVES +#undef USE_CUTSCENE_SHADOW_FOR_PED +#endif + #endif // VANILLA_DEFINES From fb5a207abcdf7b76fdb719b46c5c706deb7026fa Mon Sep 17 00:00:00 2001 From: Magnus Larsen Date: Mon, 12 Jul 2021 23:51:28 -0700 Subject: [PATCH 23/27] Fix NearPed count going negative --- src/peds/Ped.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp index 7fe2520d..cad10d8a 100644 --- a/src/peds/Ped.cpp +++ b/src/peds/Ped.cpp @@ -421,6 +421,7 @@ CPed::~CPed(void) nearPed->m_nearPeds[k] = nearPed->m_nearPeds[k + 1]; nearPed->m_nearPeds[k + 1] = nil; } + nearPed->m_nearPeds[ARRAY_SIZE(m_nearPeds) - 1] = nil; nearPed->m_numNearPeds--; } else j++; From 02c4ada807887975d5c61b510e05d2c689118282 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Thu, 15 Jul 2021 00:49:46 +0300 Subject: [PATCH 24/27] Remove stupid cast --- src/core/Fire.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/Fire.cpp b/src/core/Fire.cpp index 8a6db0da..57315b15 100644 --- a/src/core/Fire.cpp +++ b/src/core/Fire.cpp @@ -457,7 +457,7 @@ CFireManager::StartScriptFire(const CVector &pos, CEntity *target, float strengt if (target) { if (target->IsPed()) { ped->m_pFire = fire; - if (target != (CVehicle *)FindPlayerPed()) { + if (target != FindPlayerPed()) { CVector2D pos = target->GetPosition(); ped->SetFlee(pos, 10000); ped->SetMoveAnim(); From 780cd225e967ce37dd5c5c787e516c48db28a71e Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Wed, 30 Jun 2021 15:33:18 +0300 Subject: [PATCH 25/27] Make PS2 VB files work together with PC audio files --- src/audio/sampman.h | 1165 +++++++++++++++++++++++++++++++++-- src/audio/sampman_miles.cpp | 100 ++- src/audio/sampman_oal.cpp | 38 +- src/core/config.h | 2 +- 4 files changed, 1234 insertions(+), 71 deletions(-) diff --git a/src/audio/sampman.h b/src/audio/sampman.h index 8243f342..9b21ddb3 100644 --- a/src/audio/sampman.h +++ b/src/audio/sampman.h @@ -245,43 +245,8 @@ public: extern cSampleManager SampleManager; extern uint32 BankStartOffset[MAX_SFX_BANKS]; -#if defined(OPUS_AUDIO_PATHS) -static char StreamedNameTable[][25] = { - "AUDIO\\HEAD.OPUS", "AUDIO\\CLASS.OPUS", "AUDIO\\KJAH.OPUS", "AUDIO\\RISE.OPUS", "AUDIO\\LIPS.OPUS", "AUDIO\\GAME.OPUS", - "AUDIO\\MSX.OPUS", "AUDIO\\FLASH.OPUS", "AUDIO\\CHAT.OPUS", "AUDIO\\HEAD.OPUS", "AUDIO\\POLICE.OPUS", "AUDIO\\CITY.OPUS", - "AUDIO\\WATER.OPUS", "AUDIO\\COMOPEN.OPUS", "AUDIO\\SUBOPEN.OPUS", "AUDIO\\JB.OPUS", "AUDIO\\BET.OPUS", "AUDIO\\L1_LG.OPUS", - "AUDIO\\L2_DSB.OPUS", "AUDIO\\L3_DM.OPUS", "AUDIO\\L4_PAP.OPUS", "AUDIO\\L5_TFB.OPUS", "AUDIO\\J0_DM2.OPUS", "AUDIO\\J1_LFL.OPUS", - "AUDIO\\J2_KCL.OPUS", "AUDIO\\J3_VH.OPUS", "AUDIO\\J4_ETH.OPUS", "AUDIO\\J5_DST.OPUS", "AUDIO\\J6_TBJ.OPUS", "AUDIO\\T1_TOL.OPUS", - "AUDIO\\T2_TPU.OPUS", "AUDIO\\T3_MAS.OPUS", "AUDIO\\T4_TAT.OPUS", "AUDIO\\T5_BF.OPUS", "AUDIO\\S0_MAS.OPUS", "AUDIO\\S1_PF.OPUS", - "AUDIO\\S2_CTG.OPUS", "AUDIO\\S3_RTC.OPUS", "AUDIO\\S5_LRQ.OPUS", "AUDIO\\S4_BDBA.OPUS", "AUDIO\\S4_BDBB.OPUS", "AUDIO\\S2_CTG2.OPUS", - "AUDIO\\S4_BDBD.OPUS", "AUDIO\\S5_LRQB.OPUS", "AUDIO\\S5_LRQC.OPUS", "AUDIO\\A1_SSO.OPUS", "AUDIO\\A2_PP.OPUS", "AUDIO\\A3_SS.OPUS", - "AUDIO\\A4_PDR.OPUS", "AUDIO\\A5_K2FT.OPUS", "AUDIO\\K1_KBO.OPUS", "AUDIO\\K2_GIS.OPUS", "AUDIO\\K3_DS.OPUS", "AUDIO\\K4_SHI.OPUS", - "AUDIO\\K5_SD.OPUS", "AUDIO\\R0_PDR2.OPUS", "AUDIO\\R1_SW.OPUS", "AUDIO\\R2_AP.OPUS", "AUDIO\\R3_ED.OPUS", "AUDIO\\R4_GF.OPUS", - "AUDIO\\R5_PB.OPUS", "AUDIO\\R6_MM.OPUS", "AUDIO\\D1_STOG.OPUS", "AUDIO\\D2_KK.OPUS", "AUDIO\\D3_ADO.OPUS", "AUDIO\\D5_ES.OPUS", - "AUDIO\\D7_MLD.OPUS", "AUDIO\\D4_GTA.OPUS", "AUDIO\\D4_GTA2.OPUS", "AUDIO\\D6_STS.OPUS", "AUDIO\\A6_BAIT.OPUS", "AUDIO\\A7_ETG.OPUS", - "AUDIO\\A8_PS.OPUS", "AUDIO\\A9_ASD.OPUS", "AUDIO\\K4_SHI2.OPUS", "AUDIO\\C1_TEX.OPUS", "AUDIO\\EL_PH1.OPUS", "AUDIO\\EL_PH2.OPUS", - "AUDIO\\EL_PH3.OPUS", "AUDIO\\EL_PH4.OPUS", "AUDIO\\YD_PH1.OPUS", "AUDIO\\YD_PH2.OPUS", "AUDIO\\YD_PH3.OPUS", "AUDIO\\YD_PH4.OPUS", - "AUDIO\\HD_PH1.OPUS", "AUDIO\\HD_PH2.OPUS", "AUDIO\\HD_PH3.OPUS", "AUDIO\\HD_PH4.OPUS", "AUDIO\\HD_PH5.OPUS", "AUDIO\\MT_PH1.OPUS", - "AUDIO\\MT_PH2.OPUS", "AUDIO\\MT_PH3.OPUS", "AUDIO\\MT_PH4.OPUS", "AUDIO\\MISCOM.OPUS", "AUDIO\\END.OPUS", "AUDIO\\lib_a1.OPUS", - "AUDIO\\lib_a2.OPUS", "AUDIO\\lib_a.OPUS", "AUDIO\\lib_b.OPUS", "AUDIO\\lib_c.OPUS", "AUDIO\\lib_d.OPUS", "AUDIO\\l2_a.OPUS", - "AUDIO\\j4t_1.OPUS", "AUDIO\\j4t_2.OPUS", "AUDIO\\j4t_3.OPUS", "AUDIO\\j4t_4.OPUS", "AUDIO\\j4_a.OPUS", "AUDIO\\j4_b.OPUS", - "AUDIO\\j4_c.OPUS", "AUDIO\\j4_d.OPUS", "AUDIO\\j4_e.OPUS", "AUDIO\\j4_f.OPUS", "AUDIO\\j6_1.OPUS", "AUDIO\\j6_a.OPUS", - "AUDIO\\j6_b.OPUS", "AUDIO\\j6_c.OPUS", "AUDIO\\j6_d.OPUS", "AUDIO\\t4_a.OPUS", "AUDIO\\s1_a.OPUS", "AUDIO\\s1_a1.OPUS", - "AUDIO\\s1_b.OPUS", "AUDIO\\s1_c.OPUS", "AUDIO\\s1_c1.OPUS", "AUDIO\\s1_d.OPUS", "AUDIO\\s1_e.OPUS", "AUDIO\\s1_f.OPUS", - "AUDIO\\s1_g.OPUS", "AUDIO\\s1_h.OPUS", "AUDIO\\s1_i.OPUS", "AUDIO\\s1_j.OPUS", "AUDIO\\s1_k.OPUS", "AUDIO\\s1_l.OPUS", - "AUDIO\\s3_a.OPUS", "AUDIO\\s3_b.OPUS", "AUDIO\\el3_a.OPUS", "AUDIO\\mf1_a.OPUS", "AUDIO\\mf2_a.OPUS", "AUDIO\\mf3_a.OPUS", - "AUDIO\\mf3_b.OPUS", "AUDIO\\mf3_b1.OPUS", "AUDIO\\mf3_c.OPUS", "AUDIO\\mf4_a.OPUS", "AUDIO\\mf4_b.OPUS", "AUDIO\\mf4_c.OPUS", - "AUDIO\\a1_a.OPUS", "AUDIO\\a3_a.OPUS", "AUDIO\\a5_a.OPUS", "AUDIO\\a4_a.OPUS", "AUDIO\\a4_b.OPUS", "AUDIO\\a4_c.OPUS", - "AUDIO\\a4_d.OPUS", "AUDIO\\k1_a.OPUS", "AUDIO\\k3_a.OPUS", "AUDIO\\r1_a.OPUS", "AUDIO\\r2_a.OPUS", "AUDIO\\r2_b.OPUS", - "AUDIO\\r2_c.OPUS", "AUDIO\\r2_d.OPUS", "AUDIO\\r2_e.OPUS", "AUDIO\\r2_f.OPUS", "AUDIO\\r2_g.OPUS", "AUDIO\\r2_h.OPUS", - "AUDIO\\r5_a.OPUS", "AUDIO\\r6_a.OPUS", "AUDIO\\r6_a1.OPUS", "AUDIO\\r6_b.OPUS", "AUDIO\\lo2_a.OPUS", "AUDIO\\lo6_a.OPUS", - "AUDIO\\yd2_a.OPUS", "AUDIO\\yd2_b.OPUS", "AUDIO\\yd2_c.OPUS", "AUDIO\\yd2_c1.OPUS", "AUDIO\\yd2_d.OPUS", "AUDIO\\yd2_e.OPUS", - "AUDIO\\yd2_f.OPUS", "AUDIO\\yd2_g.OPUS", "AUDIO\\yd2_h.OPUS", "AUDIO\\yd2_ass.OPUS", "AUDIO\\yd2_ok.OPUS", "AUDIO\\h5_a.OPUS", - "AUDIO\\h5_b.OPUS", "AUDIO\\h5_c.OPUS", "AUDIO\\ammu_a.OPUS", "AUDIO\\ammu_b.OPUS", "AUDIO\\ammu_c.OPUS", "AUDIO\\door_1.OPUS", - "AUDIO\\door_2.OPUS", "AUDIO\\door_3.OPUS", "AUDIO\\door_4.OPUS", "AUDIO\\door_5.OPUS", "AUDIO\\door_6.OPUS", "AUDIO\\t3_a.OPUS", - "AUDIO\\t3_b.OPUS", "AUDIO\\t3_c.OPUS", "AUDIO\\k1_b.OPUS", "AUDIO\\cat1.OPUS"}; -#elif defined(PS2_AUDIO_PATHS) -static char StreamedNameTable[][40] = +#ifdef PS2_AUDIO_PATHS +static char PS2StreamedNameTable[][40] = { "AUDIO\\MUSIC\\WILD.VB", "AUDIO\\MUSIC\\FLASH.VB", @@ -386,7 +351,1130 @@ static char StreamedNameTable[][40] = "AUDIO\\MUSIC\\MISCOM.VB", "AUDIO\\MUSIC\\MISCOM.VB", "AUDIO\\MUSIC\\MISCOM.VB", -#else + "AUDIO\\MOBR1.WAV", + "AUDIO\\PAGER.WAV", + "AUDIO\\CARREV.WAV", + "AUDIO\\BIKEREV.WAV", + "AUDIO\\LIFTOP.WAV", + "AUDIO\\LIFTCL.WAV", + "AUDIO\\LIFTRUN.WAV", + "AUDIO\\LIFTBEL.WAV", + "AUDIO\\INLIFT.WAV", + "AUDIO\\SFX_01.WAV", + "AUDIO\\SFX_02.WAV", + "AUDIO\\CAMERAL.WAV", + "AUDIO\\CAMERAR.WAV", + "AUDIO\\CHEER1.WAV", + "AUDIO\\CHEER2.WAV", + "AUDIO\\CHEER3.WAV", + "AUDIO\\CHEER4.WAV", + "AUDIO\\OOH1.WAV", + "AUDIO\\OOH2.WAV", + "AUDIO\\RACE1.WAV", + "AUDIO\\RACE2.WAV", + "AUDIO\\RACE3.WAV", + "AUDIO\\RACE4.WAV", + "AUDIO\\RACE5.WAV", + "AUDIO\\RACE6.WAV", + "AUDIO\\RACE7.WAV", + "AUDIO\\RACE8.WAV", + "AUDIO\\RACE9.WAV", + "AUDIO\\RACE10.WAV", + "AUDIO\\RACE11.WAV", + "AUDIO\\RACE12.WAV", + "AUDIO\\RACE13.WAV", + "AUDIO\\RACE14.WAV", + "AUDIO\\RACE15.WAV", + "AUDIO\\HOT1.WAV", + "AUDIO\\HOT2.WAV", + "AUDIO\\HOT3.WAV", + "AUDIO\\HOT4.WAV", + "AUDIO\\HOT5.WAV", + "AUDIO\\HOT6.WAV", + "AUDIO\\HOT7.WAV", + "AUDIO\\HOT8.WAV", + "AUDIO\\HOT9.WAV", + "AUDIO\\HOT10.WAV", + "AUDIO\\HOT11.WAV", + "AUDIO\\HOT12.WAV", + "AUDIO\\HOT13.WAV", + "AUDIO\\HOT14.WAV", + "AUDIO\\HOT15.WAV", + "AUDIO\\LANSTP1.WAV", + "AUDIO\\LANSTP2.WAV", + "AUDIO\\LANAMU1.WAV", + "AUDIO\\LANAMU2.WAV", + "AUDIO\\AIRHORNL.WAV", + "AUDIO\\AIRHORNR.WAV", + "AUDIO\\SNIPSCRL.WAV", + "AUDIO\\SNIPSHORT.WAV", + "AUDIO\\BLOWROOF.WAV", + "AUDIO\\ASS_1.WAV", + "AUDIO\\ASS_2.WAV", + "AUDIO\\ASS_3.WAV", + "AUDIO\\ASS_4.WAV", + "AUDIO\\ASS_5.WAV", + "AUDIO\\ASS_6.WAV", + "AUDIO\\ASS_7.WAV", + "AUDIO\\ASS_8.WAV", + "AUDIO\\ASS_9.WAV", + "AUDIO\\ASS_10.WAV", + "AUDIO\\ASS_11.WAV", + "AUDIO\\ASS_12.WAV", + "AUDIO\\ASS_13.WAV", + "AUDIO\\ASS_14.WAV", + "AUDIO\\BIKE1_1.WAV", + "AUDIO\\BIKE1_2.WAV", + "AUDIO\\BIKE1_3.WAV", + "AUDIO\\BNK1_1.WAV", + "AUDIO\\BNK1_2.WAV", + "AUDIO\\BNK1_3.WAV", + "AUDIO\\BNK1_4.WAV", + "AUDIO\\BNK1_5.WAV", + "AUDIO\\BNK1_6.WAV", + "AUDIO\\BNK1_7.WAV", + "AUDIO\\BNK1_8.WAV", + "AUDIO\\BNK1_10.WAV", + "AUDIO\\BNK1_11.WAV", + "AUDIO\\BNK1_12.WAV", + "AUDIO\\BNK1_13.WAV", + "AUDIO\\BNK1_14.WAV", + "AUDIO\\BNK2_1.WAV", + "AUDIO\\BNK2_2.WAV", + "AUDIO\\BNK2_3.WAV", + "AUDIO\\BNK2_4.WAV", + "AUDIO\\BNK2_5.WAV", + "AUDIO\\BNK2_6.WAV", + "AUDIO\\BNK2_7.WAV", + "AUDIO\\BNK2_8.WAV", + "AUDIO\\BNK2_9.WAV", + "AUDIO\\BNK3_1.WAV", + "AUDIO\\BNK3_2.WAV", + "AUDIO\\BNK3_3A.WAV", + "AUDIO\\BNK3_3B.WAV", + "AUDIO\\BNK3_3C.WAV", + "AUDIO\\BNK3_4A.WAV", + "AUDIO\\BNK3_4B.WAV", + "AUDIO\\BNK3_4C.WAV", + "AUDIO\\BNK4_1.WAV", + "AUDIO\\BNK4_2.WAV", + "AUDIO\\BNK4_3A.WAV", + "AUDIO\\BNK4_3B.WAV", + "AUDIO\\BNK4_3C.WAV", + "AUDIO\\BNK4_3D.WAV", + "AUDIO\\BNK4_3E.WAV", + "AUDIO\\BNK4_3F.WAV", + "AUDIO\\BNK4_3G.WAV", + "AUDIO\\BNK4_3H.WAV", + "AUDIO\\BNK4_3I.WAV", + "AUDIO\\BNK4_3J.WAV", + "AUDIO\\BNK4_3K.WAV", + "AUDIO\\BNK4_3M.WAV", + "AUDIO\\BNK4_3O.WAV", + "AUDIO\\BNK4_3P.WAV", + "AUDIO\\BNK4_3Q.WAV", + "AUDIO\\BNK4_3R.WAV", + "AUDIO\\BNK4_3S.WAV", + "AUDIO\\BNK4_3T.WAV", + "AUDIO\\BNK4_3U.WAV", + "AUDIO\\BNK4_3V.WAV", + "AUDIO\\BNK4_4A.WAV", + "AUDIO\\BNK4_4B.WAV", + "AUDIO\\BNK4_5.WAV", + "AUDIO\\BNK4_6.WAV", + "AUDIO\\BNK4_7.WAV", + "AUDIO\\BNK4_8.WAV", + "AUDIO\\BNK4_9.WAV", + "AUDIO\\BNK4_10.WAV", + "AUDIO\\BNK4_11.WAV", + "AUDIO\\BK4_12A.WAV", + "AUDIO\\BK4_12B.WAV", + "AUDIO\\BK4_12C.WAV", + "AUDIO\\BNK4_13.WAV", + "AUDIO\\BK4_14A.WAV", + "AUDIO\\BK4_14B.WAV", + "AUDIO\\BNK4_15.WAV", + "AUDIO\\BNK4_16.WAV", + "AUDIO\\BNK4_17.WAV", + "AUDIO\\BNK4_18.WAV", + "AUDIO\\BK4_19A.WAV", + "AUDIO\\BK4_19B.WAV", + "AUDIO\\BK4_20A.WAV", + "AUDIO\\BK4_20B.WAV", + "AUDIO\\BNK4_21.WAV", + "AUDIO\\BNK422A.WAV", + "AUDIO\\BNK422B.WAV", + "AUDIO\\BK4_23A.WAV", + "AUDIO\\BK4_23B.WAV", + "AUDIO\\BK4_23C.WAV", + "AUDIO\\BK4_23D.WAV", + "AUDIO\\BK4_24A.WAV", + "AUDIO\\BK4_24B.WAV", + "AUDIO\\BNK4_25.WAV", + "AUDIO\\BNK4_26.WAV", + "AUDIO\\BNK4_27.WAV", + "AUDIO\\BNK4_28.WAV", + "AUDIO\\BNK4_29.WAV", + "AUDIO\\BNK4_30.WAV", + "AUDIO\\BK4_31A.WAV", + "AUDIO\\BK4_31B.WAV", + "AUDIO\\BNK4_32.WAV", + "AUDIO\\BK4_34A.WAV", + "AUDIO\\BK4_34B.WAV", + "AUDIO\\BK4_35A.WAV", + "AUDIO\\BK4_35B.WAV", + "AUDIO\\BNK4_36.WAV", + "AUDIO\\BNK4_37.WAV", + "AUDIO\\BNK4_38.WAV", + "AUDIO\\BNK4_39.WAV", + "AUDIO\\BK4_40A.WAV", + "AUDIO\\BK4_40B.WAV", + "AUDIO\\BNK4_41.WAV", + "AUDIO\\BNK4_42.WAV", + "AUDIO\\BNK4_43.WAV", + "AUDIO\\BNK4_44.WAV", + "AUDIO\\BNK4_45.WAV", + "AUDIO\\BNK4_46.WAV", + "AUDIO\\BNK4_47.WAV", + "AUDIO\\BNK4_48.WAV", + "AUDIO\\BNK4_49.WAV", + "AUDIO\\BNK450A.WAV", + "AUDIO\\BNK450B.WAV", + "AUDIO\\BNK4_51.WAV", + "AUDIO\\BNK4_94.WAV", + "AUDIO\\BNK4_95.WAV", + "AUDIO\\BNK4_96.WAV", + "AUDIO\\BNK4_97.WAV", + "AUDIO\\BNK4_98.WAV", + "AUDIO\\BNK4_99.WAV", + "AUDIO\\BUD1_1.WAV", + "AUDIO\\BUD1_2.WAV", + "AUDIO\\BUD1_3.WAV", + "AUDIO\\BUD1_4.WAV", + "AUDIO\\BUD1_5.WAV", + "AUDIO\\BUD1_9.WAV", + "AUDIO\\BUD1_10.WAV", + "AUDIO\\BUD2_1.WAV", + "AUDIO\\BUD2_2.WAV", + "AUDIO\\BUD2_3.WAV", + "AUDIO\\BUD2_4.WAV", + "AUDIO\\BUD2_5.WAV", + "AUDIO\\BUD2_6.WAV", + "AUDIO\\BUD2_7.WAV", + "AUDIO\\BUD3_1.WAV", + "AUDIO\\BUD3_1A.WAV", + "AUDIO\\BUD3_1B.WAV", + "AUDIO\\BUD3_1C.WAV", + "AUDIO\\BUD3_2.WAV", + "AUDIO\\BUD3_3.WAV", + "AUDIO\\BUD3_4.WAV", + "AUDIO\\BUD3_5.WAV", + "AUDIO\\BUD3_6.WAV", + "AUDIO\\BUD3_7.WAV", + "AUDIO\\BUD3_8A.WAV", + "AUDIO\\BUD3_8B.WAV", + "AUDIO\\BUD3_8C.WAV", + "AUDIO\\BUD3_9A.WAV", + "AUDIO\\BUD3_9B.WAV", + "AUDIO\\BUD3_9C.WAV", + "AUDIO\\CAP1_2.WAV", + "AUDIO\\CAP1_3.WAV", + "AUDIO\\CAP1_4.WAV", + "AUDIO\\CAP1_5.WAV", + "AUDIO\\CAP1_6.WAV", + "AUDIO\\CAP1_7.WAV", + "AUDIO\\CAP1_8.WAV", + "AUDIO\\CAP1_9.WAV", + "AUDIO\\CAP1_10.WAV", + "AUDIO\\CAP1_11.WAV", + "AUDIO\\CAP1_12.WAV", + "AUDIO\\CNT1_1.WAV", + "AUDIO\\CNT1_2.WAV", + "AUDIO\\CNT1_3.WAV", + "AUDIO\\CNT1_4.WAV", + "AUDIO\\CNT1_5.WAV", + "AUDIO\\CNT2_1.WAV", + "AUDIO\\CNT2_2.WAV", + "AUDIO\\CNT2_3.WAV", + "AUDIO\\CNT2_4.WAV", + "AUDIO\\COK1_1.WAV", + "AUDIO\\COK1_2.WAV", + "AUDIO\\COK1_3.WAV", + "AUDIO\\COK1_4.WAV", + "AUDIO\\COK1_5.WAV", + "AUDIO\\COK1_6.WAV", + "AUDIO\\COK2_1.WAV", + "AUDIO\\COK2_2.WAV", + "AUDIO\\COK2_3.WAV", + "AUDIO\\COK2_4.WAV", + "AUDIO\\COK2_5.WAV", + "AUDIO\\COK2_6.WAV", + "AUDIO\\COK2_7A.WAV", + "AUDIO\\COK2_7B.WAV", + "AUDIO\\COK2_7C.WAV", + "AUDIO\\COK2_8A.WAV", + "AUDIO\\COK2_8B.WAV", + "AUDIO\\COK2_8C.WAV", + "AUDIO\\COK2_8D.WAV", + "AUDIO\\COK2_9.WAV", + "AUDIO\\COK210A.WAV", + "AUDIO\\COK210B.WAV", + "AUDIO\\COK210C.WAV", + "AUDIO\\COK212A.WAV", + "AUDIO\\COK212B.WAV", + "AUDIO\\COK2_13.WAV", + "AUDIO\\COK2_14.WAV", + "AUDIO\\COK2_15.WAV", + "AUDIO\\COK2_16.WAV", + "AUDIO\\COK2_20.WAV", + "AUDIO\\COK2_21.WAV", + "AUDIO\\COK2_2.WAV", // this is probably a typo of COK2_22 + "AUDIO\\COK3_1.WAV", + "AUDIO\\COK3_2.WAV", + "AUDIO\\COK3_3.WAV", + "AUDIO\\COK3_4.WAV", + "AUDIO\\COK4_1.WAV", + "AUDIO\\COK4_2.WAV", + "AUDIO\\COK4_3.WAV", + "AUDIO\\COK4_4.WAV", + "AUDIO\\COK4_5.WAV", + "AUDIO\\COK4_6.WAV", + "AUDIO\\COK4_7.WAV", + "AUDIO\\COK4_8.WAV", + "AUDIO\\COK4_9.WAV", + "AUDIO\\COK4_9A.WAV", + "AUDIO\\COK4_10.WAV", + "AUDIO\\COK4_11.WAV", + "AUDIO\\COK4_12.WAV", + "AUDIO\\COK4_13.WAV", + "AUDIO\\COK4_14.WAV", + "AUDIO\\COK4_15.WAV", + "AUDIO\\COK4_16.WAV", + "AUDIO\\COK4_17.WAV", + "AUDIO\\COK4_18.WAV", + "AUDIO\\COK4_19.WAV", + "AUDIO\\COK4_20.WAV", + "AUDIO\\COK4_21.WAV", + "AUDIO\\COK4_22.WAV", + "AUDIO\\COK4_23.WAV", + "AUDIO\\COK4_24.WAV", + "AUDIO\\COK4_25.WAV", + "AUDIO\\COK4_26.WAV", + "AUDIO\\COK4_27.WAV", + "AUDIO\\COL1_1.WAV", + "AUDIO\\COL1_2.WAV", + "AUDIO\\COL1_3.WAV", + "AUDIO\\COL1_4.WAV", + "AUDIO\\COL1_5.WAV", + "AUDIO\\COL1_6.WAV", + "AUDIO\\COL1_7.WAV", + "AUDIO\\COL1_8.WAV", + "AUDIO\\COL2_1.WAV", + "AUDIO\\COL2_2.WAV", + "AUDIO\\COL2_3.WAV", + "AUDIO\\COL2_4.WAV", + "AUDIO\\COL2_5.WAV", + "AUDIO\\COL2_6A.WAV", + "AUDIO\\COL2_7.WAV", + "AUDIO\\COL2_8.WAV", + "AUDIO\\COL2_9.WAV", + "AUDIO\\COL2_10.WAV", + "AUDIO\\COL2_11.WAV", + "AUDIO\\COL2_12.WAV", + "AUDIO\\COL2_13.WAV", + "AUDIO\\COL2_14.WAV", + "AUDIO\\COL2_15.WAV", + "AUDIO\\COL2_16.WAV", + "AUDIO\\COL3_1.WAV", + "AUDIO\\COL3_2.WAV", + "AUDIO\\COL3_2A.WAV", + "AUDIO\\COL3_2B.WAV", + "AUDIO\\COL3_3.WAV", + "AUDIO\\COL3_4.WAV", + "AUDIO\\COL3_5.WAV", + "AUDIO\\COL3_6.WAV", + "AUDIO\\COL3_7.WAV", + "AUDIO\\COL3_8.WAV", + "AUDIO\\COL3_9.WAV", + "AUDIO\\COL3_10.WAV", + "AUDIO\\COL3_11.WAV", + "AUDIO\\COL3_12.WAV", + "AUDIO\\COL3_13.WAV", + "AUDIO\\COL3_14.WAV", + "AUDIO\\COL3_15.WAV", + "AUDIO\\COL3_16.WAV", + "AUDIO\\COL3_17.WAV", + "AUDIO\\COL3_18.WAV", + "AUDIO\\COL3_19.WAV", + "AUDIO\\COL3_20.WAV", + "AUDIO\\COL3_21.WAV", + "AUDIO\\COL3_23.WAV", + "AUDIO\\COL3_24.WAV", + "AUDIO\\COL3_25.WAV", + "AUDIO\\COL4_1.WAV", + "AUDIO\\COL4_2.WAV", + "AUDIO\\COL4_3.WAV", + "AUDIO\\COL4_4.WAV", + "AUDIO\\COL4_5.WAV", + "AUDIO\\COL4_6.WAV", + "AUDIO\\COL4_7.WAV", + "AUDIO\\COL4_8.WAV", + "AUDIO\\COL4_9.WAV", + "AUDIO\\COL4_10.WAV", + "AUDIO\\COL4_11.WAV", + "AUDIO\\COL4_12.WAV", + "AUDIO\\COL4_13.WAV", + "AUDIO\\COL4_14.WAV", + "AUDIO\\COL4_15.WAV", + "AUDIO\\COL4_16.WAV", + "AUDIO\\COL4_17.WAV", + "AUDIO\\COL4_18.WAV", + "AUDIO\\COL4_19.WAV", + "AUDIO\\COL4_20.WAV", + "AUDIO\\COL4_21.WAV", + "AUDIO\\COL4_22.WAV", + "AUDIO\\COL4_23.WAV", + "AUDIO\\COL4_24.WAV", + "AUDIO\\COL4_25.WAV", + "AUDIO\\COL4_26.WAV", + "AUDIO\\COL5_1.WAV", + "AUDIO\\COL5_2.WAV", + "AUDIO\\COL5_3.WAV", + "AUDIO\\COL5_4.WAV", + "AUDIO\\COL5_5.WAV", + "AUDIO\\COL5_6.WAV", + "AUDIO\\COL5_7.WAV", + "AUDIO\\COL5_8.WAV", + "AUDIO\\COL5_9.WAV", + "AUDIO\\COL5_10.WAV", + "AUDIO\\COL5_11.WAV", + "AUDIO\\COL5_12.WAV", + "AUDIO\\COL5_13.WAV", + "AUDIO\\COL5_14.WAV", + "AUDIO\\COL5_15.WAV", + "AUDIO\\COL5_16.WAV", + "AUDIO\\COL5_17.WAV", + "AUDIO\\COL5_18.WAV", + "AUDIO\\COL5_19.WAV", + "AUDIO\\COL5_20.WAV", + "AUDIO\\COL5_21.WAV", + "AUDIO\\COL5_22.WAV", + "AUDIO\\CUB1_1.WAV", + "AUDIO\\CUB1_2.WAV", + "AUDIO\\CUB1_3.WAV", + "AUDIO\\CUB1_4.WAV", + "AUDIO\\CUB1_5.WAV", + "AUDIO\\CUB1_6.WAV", + "AUDIO\\CUB1_7.WAV", + "AUDIO\\CUB1_8.WAV", + "AUDIO\\CUB1_9.WAV", + "AUDIO\\CUB1_10.WAV", + "AUDIO\\CUB2_1.WAV", + "AUDIO\\CUB2_2.WAV", + "AUDIO\\CUB2_3A.WAV", + "AUDIO\\CUB2_3B.WAV", + "AUDIO\\CUB2_3C.WAV", + "AUDIO\\CUB2_4A.WAV", + "AUDIO\\CUB2_5.WAV", + "AUDIO\\CUB2_6.WAV", + "AUDIO\\CUB2_7.WAV", + "AUDIO\\CUB2_8.WAV", + "AUDIO\\CUB2_9.WAV", + "AUDIO\\CUB2_10.WAV", + "AUDIO\\CUB2_11.WAV", + "AUDIO\\CUB3_1.WAV", + "AUDIO\\CUB3_2.WAV", + "AUDIO\\CUB3_3.WAV", + "AUDIO\\CUB3_4.WAV", + "AUDIO\\CUB4_1.WAV", + "AUDIO\\CUB4_2.WAV", + "AUDIO\\CUB4_3.WAV", + "AUDIO\\CUB4_4.WAV", + "AUDIO\\CUB4_5.WAV", + "AUDIO\\CUB4_5A.WAV", + "AUDIO\\CUB4_6.WAV", + "AUDIO\\CUB4_7.WAV", + "AUDIO\\CUB4_8.WAV", + "AUDIO\\CUB4_9.WAV", + "AUDIO\\CUB4_10.WAV", + "AUDIO\\CUB4_11.WAV", + "AUDIO\\CUB4_12.WAV", + "AUDIO\\CUB4_13.WAV", + "AUDIO\\CUB4_14.WAV", + "AUDIO\\CUB4_15.WAV", + "AUDIO\\CUB4_16.WAV", + "AUDIO\\GOLF_1.WAV", + "AUDIO\\GOLF_2.WAV", + "AUDIO\\GOLF_3.WAV", + "AUDIO\\BAR_1.WAV", + "AUDIO\\BAR_2.WAV", + "AUDIO\\BAR_3.WAV", + "AUDIO\\BAR_4.WAV", + "AUDIO\\BAR_5.WAV", + "AUDIO\\BAR_6.WAV", + "AUDIO\\BAR_7.WAV", + "AUDIO\\BAR_8.WAV", + "AUDIO\\STRIP_1.WAV", + "AUDIO\\STRIP_2.WAV", + "AUDIO\\STRIP_3.WAV", + "AUDIO\\STRIP_4.WAV", + "AUDIO\\STRIP_5.WAV", + "AUDIO\\STRIP_6.WAV", + "AUDIO\\STRIP_7.WAV", + "AUDIO\\STRIP_8.WAV", + "AUDIO\\STRIP_9.WAV", + "AUDIO\\STAR_1.WAV", + "AUDIO\\STAR_2.WAV", + "AUDIO\\STAR_3.WAV", + "AUDIO\\STAR_4.WAV", + "AUDIO\\FIN_1A.WAV", + "AUDIO\\FIN_1B.WAV", + "AUDIO\\FIN_1C.WAV", + "AUDIO\\FIN_2B.WAV", + "AUDIO\\FIN_2C.WAV", + "AUDIO\\FIN_3.WAV", + "AUDIO\\FIN_4.WAV", + "AUDIO\\FIN_5.WAV", + "AUDIO\\FIN_6.WAV", + "AUDIO\\FIN_10.WAV", + "AUDIO\\FIN_11A.WAV", + "AUDIO\\FIN_11B.WAV", + "AUDIO\\FIN_12A.WAV", + "AUDIO\\FIN_12B.WAV", + "AUDIO\\FIN_12C.WAV", + "AUDIO\\FIN_13.WAV", + "AUDIO\\FINKILL.WAV", + "AUDIO\\LAW1_1.WAV", + "AUDIO\\LAW1_2.WAV", + "AUDIO\\LAW1_3.WAV", + "AUDIO\\LAW1_4.WAV", + "AUDIO\\LAW1_5.WAV", + "AUDIO\\LAW1_6.WAV", + "AUDIO\\LAW1_7.WAV", + "AUDIO\\LAW1_8.WAV", + "AUDIO\\LAW1_9.WAV", + "AUDIO\\LAW1_10.WAV", + "AUDIO\\LAW2_1.WAV", + "AUDIO\\LAW2_2.WAV", + "AUDIO\\LAW2_3.WAV", + "AUDIO\\LAW2_4.WAV", + "AUDIO\\LAW2_5.WAV", + "AUDIO\\LAW2_6.WAV", + "AUDIO\\LAW2_7.WAV", + "AUDIO\\LAW2_8.WAV", + "AUDIO\\LAW2_9.WAV", + "AUDIO\\LAW2_10.WAV", + "AUDIO\\LAW3_1.WAV", + "AUDIO\\LAW3_2.WAV", + "AUDIO\\LAW3_3.WAV", + "AUDIO\\LAW3_4.WAV", + "AUDIO\\LAW3_5.WAV", + "AUDIO\\LAW3_6.WAV", + "AUDIO\\LAW3_10.WAV", + "AUDIO\\LAW3_11.WAV", + "AUDIO\\LAW3_12.WAV", + "AUDIO\\LAW3_13.WAV", + "AUDIO\\LAW3_14.WAV", + "AUDIO\\LAW3_16.WAV", + "AUDIO\\LAW3_17.WAV", + "AUDIO\\LAW3_18.WAV", + "AUDIO\\LAW3_19.WAV", + "AUDIO\\LAW3_20.WAV", + "AUDIO\\LAW3_21.WAV", + "AUDIO\\LAW3_22.WAV", + "AUDIO\\LAW3_23.WAV", + "AUDIO\\LAW3_24.WAV", + "AUDIO\\LAW3_25.WAV", + "AUDIO\\LAW4_1A.WAV", + "AUDIO\\LAW4_1B.WAV", + "AUDIO\\LAW4_1C.WAV", + "AUDIO\\LAW4_1D.WAV", + "AUDIO\\LAW4_10.WAV", + "AUDIO\\LAW4_3.WAV", + "AUDIO\\LAW4_4.WAV", + "AUDIO\\LAW4_5.WAV", + "AUDIO\\LAW4_6.WAV", + "AUDIO\\LAW4_7.WAV", + "AUDIO\\LAW4_8.WAV", + "AUDIO\\LAW4_9.WAV", + "AUDIO\\PHIL1_2.WAV", + "AUDIO\\PHIL1_3.WAV", + "AUDIO\\PHIL2_1.WAV", + "AUDIO\\PHIL2_2.WAV", + "AUDIO\\PHIL2_3.WAV", + "AUDIO\\PHIL2_4.WAV", + "AUDIO\\PHIL2_5.WAV", + "AUDIO\\PHIL2_6.WAV", + "AUDIO\\PHIL2_7.WAV", + "AUDIO\\PHIL2_8.WAV", + "AUDIO\\PHIL2_9.WAV", + "AUDIO\\PHIL210.WAV", + "AUDIO\\PHIL211.WAV", + "AUDIO\\PORN1_1.WAV", + "AUDIO\\PORN1_2.WAV", + "AUDIO\\PORN1_3.WAV", + "AUDIO\\PRN1_3A.WAV", + "AUDIO\\PORN1_4.WAV", + "AUDIO\\PORN1_5.WAV", + "AUDIO\\PORN1_6.WAV", + "AUDIO\\PORN1_7.WAV", + "AUDIO\\PORN1_8.WAV", + "AUDIO\\PORN1_9.WAV", + "AUDIO\\PRN1_10.WAV", + "AUDIO\\PRN1_11.WAV", + "AUDIO\\PRN1_12.WAV", + "AUDIO\\PRN1_13.WAV", + "AUDIO\\PRN1_14.WAV", + "AUDIO\\PRN1_15.WAV", + "AUDIO\\PRN1_16.WAV", + "AUDIO\\PRN1_17.WAV", + "AUDIO\\PRN1_18.WAV", + "AUDIO\\PRN1_19.WAV", + "AUDIO\\PRN1_20.WAV", + "AUDIO\\PRN1_21.WAV", + "AUDIO\\PORN3_1.WAV", + "AUDIO\\PORN3_2.WAV", + "AUDIO\\PORN3_3.WAV", + "AUDIO\\PORN3_4.WAV", + "AUDIO\\PSYCH_1.WAV", + "AUDIO\\PSYCH_2.WAV", + "AUDIO\\ROK2_01.WAV", + "AUDIO\\ROK3_1.WAV", + "AUDIO\\ROK3_2.WAV", + "AUDIO\\ROK3_3.WAV", + "AUDIO\\ROK3_4.WAV", + "AUDIO\\ROK3_5.WAV", + "AUDIO\\ROK3_6.WAV", + "AUDIO\\ROK3_7.WAV", + "AUDIO\\ROK3_8.WAV", + "AUDIO\\ROK3_9.WAV", + "AUDIO\\ROK3_10.WAV", + "AUDIO\\ROK3_11.WAV", + "AUDIO\\ROK3_12.WAV", + "AUDIO\\ROK3_13.WAV", + "AUDIO\\ROK3_14.WAV", + "AUDIO\\ROK3_15.WAV", + "AUDIO\\ROK3_16.WAV", + "AUDIO\\ROK3_17.WAV", + "AUDIO\\ROK3_18.WAV", + "AUDIO\\ROK3_19.WAV", + "AUDIO\\ROK3_20.WAV", + "AUDIO\\ROK3_21.WAV", + "AUDIO\\ROK3_22.WAV", + "AUDIO\\ROK3_23.WAV", + "AUDIO\\ROK3_24.WAV", + "AUDIO\\ROK3_25.WAV", + "AUDIO\\ROK3_26.WAV", + "AUDIO\\ROK3_27.WAV", + "AUDIO\\ROK3_62.WAV", + "AUDIO\\ROK3_63.WAV", + "AUDIO\\ROK3_64.WAV", + "AUDIO\\ROK3_65.WAV", + "AUDIO\\ROK3_66.WAV", + "AUDIO\\ROK3_67.WAV", + "AUDIO\\ROK3_68.WAV", + "AUDIO\\ROK3_69.WAV", + "AUDIO\\ROK3_70.WAV", + "AUDIO\\ROK3_71.WAV", + "AUDIO\\ROK3_73.WAV", + "AUDIO\\RESC_1.WAV", + "AUDIO\\RESC_2.WAV", + "AUDIO\\RESC_3.WAV", + "AUDIO\\RESC_4.WAV", + "AUDIO\\RESC_5.WAV", + "AUDIO\\RESC_6.WAV", + "AUDIO\\RESC_7.WAV", + "AUDIO\\RESC_8.WAV", + "AUDIO\\RESC_9.WAV", + "AUDIO\\RESC_10.WAV", + "AUDIO\\ROK1_1A.WAV", + "AUDIO\\ROK1_1B.WAV", + "AUDIO\\ROK1_5.WAV", + "AUDIO\\ROK1_6.WAV", + "AUDIO\\ROK1_7.WAV", + "AUDIO\\ROK1_8.WAV", + "AUDIO\\ROK1_9.WAV", + "AUDIO\\TAX1_1.WAV", + "AUDIO\\TAX1_2.WAV", + "AUDIO\\TAX1_3.WAV", + "AUDIO\\TAX1_4.WAV", + "AUDIO\\TAX1_5.WAV", + "AUDIO\\TAX2_1.WAV", + "AUDIO\\TAX2_2.WAV", + "AUDIO\\TAX2_3.WAV", + "AUDIO\\TAX2_4.WAV", + "AUDIO\\TAX2_5.WAV", + "AUDIO\\TAX2_6.WAV", + "AUDIO\\TAX2_7.WAV", + "AUDIO\\TAX3_1.WAV", + "AUDIO\\TAX3_2.WAV", + "AUDIO\\TAX3_3.WAV", + "AUDIO\\TAX3_4.WAV", + "AUDIO\\TAX3_5.WAV", + "AUDIO\\TEX1_1.WAV", + "AUDIO\\TEX1_2.WAV", + "AUDIO\\TEX1_3.WAV", + "AUDIO\\TEX1_4.WAV", + "AUDIO\\TEX1_5.WAV", + "AUDIO\\TEX1_6.WAV", + "AUDIO\\TEX2_1.WAV", + "AUDIO\\TEX3_1.WAV", + "AUDIO\\TEX3_2.WAV", + "AUDIO\\TEX3_3.WAV", + "AUDIO\\TEX3_4.WAV", + "AUDIO\\TEX3_5.WAV", + "AUDIO\\TEX3_6.WAV", + "AUDIO\\TEX3_7.WAV", + "AUDIO\\TEX3_8.WAV", + "AUDIO\\HAT_1A.WAV", + "AUDIO\\INTRO1.WAV", + "AUDIO\\INTRO2.WAV", + "AUDIO\\INTRO3.WAV", + "AUDIO\\INTRO4.WAV", + "AUDIO\\MOB_01A.WAV", + "AUDIO\\MOB_01B.WAV", + "AUDIO\\MOB_01C.WAV", + "AUDIO\\MOB_02A.WAV", + "AUDIO\\MOB_02B.WAV", + "AUDIO\\MOB_02C.WAV", + "AUDIO\\MOB_03A.WAV", + "AUDIO\\MOB_03B.WAV", + "AUDIO\\MOB_03C.WAV", + "AUDIO\\MOB_03D.WAV", + "AUDIO\\MOB_03E.WAV", + "AUDIO\\SHARK_1.WAV", + "AUDIO\\SHARK_2.WAV", + "AUDIO\\SHARK_3.WAV", + "AUDIO\\SHARK_4.WAV", + "AUDIO\\SHARK_5.WAV", + "AUDIO\\MOB_04A.WAV", + "AUDIO\\MOB_04B.WAV", + "AUDIO\\MOB_04C.WAV", + "AUDIO\\MOB_04D.WAV", + "AUDIO\\MOB_05A.WAV", + "AUDIO\\MOB_05B.WAV", + "AUDIO\\MOB_05C.WAV", + "AUDIO\\MOB_05D.WAV", + "AUDIO\\MOB_06A.WAV", + "AUDIO\\MOB_06B.WAV", + "AUDIO\\MOB_06C.WAV", + "AUDIO\\MOB_07A.WAV", + "AUDIO\\MOB_07B.WAV", + "AUDIO\\MOB_08A.WAV", + "AUDIO\\MOB_08B.WAV", + "AUDIO\\MOB_08C.WAV", + "AUDIO\\MOB_08D.WAV", + "AUDIO\\MOB_08E.WAV", + "AUDIO\\MOB_08F.WAV", + "AUDIO\\MOB_08G.WAV", + "AUDIO\\MOB_09A.WAV", + "AUDIO\\MOB_09B.WAV", + "AUDIO\\MOB_09C.WAV", + "AUDIO\\MOB_09D.WAV", + "AUDIO\\MOB_09E.WAV", + "AUDIO\\MOB_09F.WAV", + "AUDIO\\MOB_10A.WAV", + "AUDIO\\MOB_10B.WAV", + "AUDIO\\MOB_10C.WAV", + "AUDIO\\MOB_10D.WAV", + "AUDIO\\MOB_10E.WAV", + "AUDIO\\MOB_11A.WAV", + "AUDIO\\MOB_11B.WAV", + "AUDIO\\MOB_11C.WAV", + "AUDIO\\MOB_11D.WAV", + "AUDIO\\MOB_11E.WAV", + "AUDIO\\MOB_11F.WAV", + "AUDIO\\MOB_14A.WAV", + "AUDIO\\MOB_14B.WAV", + "AUDIO\\MOB_14C.WAV", + "AUDIO\\MOB_14D.WAV", + "AUDIO\\MOB_14E.WAV", + "AUDIO\\MOB_14F.WAV", + "AUDIO\\MOB_14G.WAV", + "AUDIO\\MOB_14H.WAV", + "AUDIO\\MOB_16A.WAV", + "AUDIO\\MOB_16B.WAV", + "AUDIO\\MOB_16C.WAV", + "AUDIO\\MOB_16D.WAV", + "AUDIO\\MOB_16E.WAV", + "AUDIO\\MOB_16F.WAV", + "AUDIO\\MOB_16G.WAV", + "AUDIO\\MOB_17A.WAV", + "AUDIO\\MOB_17B.WAV", + "AUDIO\\MOB_17C.WAV", + "AUDIO\\MOB_17D.WAV", + "AUDIO\\MOB_17E.WAV", + "AUDIO\\MOB_17G.WAV", + "AUDIO\\MOB_17H.WAV", + "AUDIO\\MOB_17I.WAV", + "AUDIO\\MOB_17J.WAV", + "AUDIO\\MOB_17K.WAV", + "AUDIO\\MOB_17L.WAV", + "AUDIO\\MOB_18A.WAV", + "AUDIO\\MOB_18B.WAV", + "AUDIO\\MOB_18C.WAV", + "AUDIO\\MOB_18D.WAV", + "AUDIO\\MOB_18E.WAV", + "AUDIO\\MOB_18F.WAV", + "AUDIO\\MOB_18G.WAV", + "AUDIO\\MOB_20A.WAV", + "AUDIO\\MOB_20B.WAV", + "AUDIO\\MOB_20C.WAV", + "AUDIO\\MOB_20D.WAV", + "AUDIO\\MOB_20E.WAV", + "AUDIO\\MOB_24A.WAV", + "AUDIO\\MOB_24B.WAV", + "AUDIO\\MOB_24C.WAV", + "AUDIO\\MOB_24D.WAV", + "AUDIO\\MOB_24E.WAV", + "AUDIO\\MOB_24F.WAV", + "AUDIO\\MOB_24G.WAV", + "AUDIO\\MOB_24H.WAV", + "AUDIO\\MOB_25A.WAV", + "AUDIO\\MOB_25B.WAV", + "AUDIO\\MOB_25C.WAV", + "AUDIO\\MOB_25D.WAV", + "AUDIO\\MOB_26A.WAV", + "AUDIO\\MOB_26B.WAV", + "AUDIO\\MOB_26C.WAV", + "AUDIO\\MOB_26D.WAV", + "AUDIO\\MOB_26E.WAV", + "AUDIO\\MOB_29A.WAV", + "AUDIO\\MOB_29B.WAV", + "AUDIO\\MOB_29C.WAV", + "AUDIO\\MOB_29D.WAV", + "AUDIO\\MOB_29E.WAV", + "AUDIO\\MOB_29F.WAV", + "AUDIO\\MOB_29G.WAV", + "AUDIO\\MOB_30A.WAV", + "AUDIO\\MOB_30B.WAV", + "AUDIO\\MOB_30C.WAV", + "AUDIO\\MOB_30D.WAV", + "AUDIO\\MOB_30E.WAV", + "AUDIO\\MOB_30F.WAV", + "AUDIO\\MOB_33A.WAV", + "AUDIO\\MOB_33B.WAV", + "AUDIO\\MOB_33C.WAV", + "AUDIO\\MOB_33D.WAV", + "AUDIO\\MOB_34A.WAV", + "AUDIO\\MOB_34B.WAV", + "AUDIO\\MOB_34C.WAV", + "AUDIO\\MOB_34D.WAV", + "AUDIO\\MOB_35A.WAV", + "AUDIO\\MOB_35B.WAV", + "AUDIO\\MOB_35C.WAV", + "AUDIO\\MOB_35D.WAV", + "AUDIO\\MOB_36A.WAV", + "AUDIO\\MOB_36B.WAV", + "AUDIO\\MOB_36C.WAV", + "AUDIO\\MOB_40A.WAV", + "AUDIO\\MOB_40B.WAV", + "AUDIO\\MOB_40C.WAV", + "AUDIO\\MOB_40D.WAV", + "AUDIO\\MOB_40E.WAV", + "AUDIO\\MOB_40F.WAV", + "AUDIO\\MOB_40G.WAV", + "AUDIO\\MOB_40H.WAV", + "AUDIO\\MOB_40I.WAV", + "AUDIO\\MOB_41A.WAV", + "AUDIO\\MOB_41B.WAV", + "AUDIO\\MOB_41C.WAV", + "AUDIO\\MOB_41D.WAV", + "AUDIO\\MOB_41E.WAV", + "AUDIO\\MOB_41F.WAV", + "AUDIO\\MOB_41G.WAV", + "AUDIO\\MOB_41H.WAV", + "AUDIO\\MOB_42A.WAV", + "AUDIO\\MOB_42B.WAV", + "AUDIO\\MOB_42C.WAV", + "AUDIO\\MOB_42D.WAV", + "AUDIO\\MOB_42E.WAV", + "AUDIO\\MOB_43A.WAV", + "AUDIO\\MOB_43B.WAV", + "AUDIO\\MOB_43C.WAV", + "AUDIO\\MOB_43D.WAV", + "AUDIO\\MOB_43E.WAV", + "AUDIO\\MOB_43F.WAV", + "AUDIO\\MOB_43G.WAV", + "AUDIO\\MOB_43H.WAV", + "AUDIO\\MOB_45A.WAV", + "AUDIO\\MOB_45B.WAV", + "AUDIO\\MOB_45C.WAV", + "AUDIO\\MOB_45D.WAV", + "AUDIO\\MOB_45E.WAV", + "AUDIO\\MOB_45F.WAV", + "AUDIO\\MOB_45G.WAV", + "AUDIO\\MOB_45H.WAV", + "AUDIO\\MOB_45I.WAV", + "AUDIO\\MOB_45J.WAV", + "AUDIO\\MOB_45K.WAV", + "AUDIO\\MOB_45L.WAV", + "AUDIO\\MOB_45M.WAV", + "AUDIO\\MOB_45N.WAV", + "AUDIO\\MOB_46A.WAV", + "AUDIO\\MOB_46B.WAV", + "AUDIO\\MOB_46C.WAV", + "AUDIO\\MOB_46D.WAV", + "AUDIO\\MOB_46E.WAV", + "AUDIO\\MOB_46F.WAV", + "AUDIO\\MOB_46G.WAV", + "AUDIO\\MOB_46H.WAV", + "AUDIO\\MOB_47A.WAV", + "AUDIO\\MOB_52A.WAV", + "AUDIO\\MOB_52B.WAV", + "AUDIO\\MOB_52C.WAV", + "AUDIO\\MOB_52D.WAV", + "AUDIO\\MOB_52E.WAV", + "AUDIO\\MOB_52F.WAV", + "AUDIO\\MOB_52G.WAV", + "AUDIO\\MOB_52H.WAV", + "AUDIO\\MOB_54A.WAV", + "AUDIO\\MOB_54B.WAV", + "AUDIO\\MOB_54C.WAV", + "AUDIO\\MOB_54D.WAV", + "AUDIO\\MOB_54E.WAV", + "AUDIO\\MOB_55A.WAV", + "AUDIO\\MOB_55B.WAV", + "AUDIO\\MOB_55C.WAV", + "AUDIO\\MOB_55D.WAV", + "AUDIO\\MOB_55E.WAV", + "AUDIO\\MOB_55F.WAV", + "AUDIO\\MOB_56A.WAV", + "AUDIO\\MOB_56B.WAV", + "AUDIO\\MOB_56C.WAV", + "AUDIO\\MOB_56D.WAV", + "AUDIO\\MOB_56E.WAV", + "AUDIO\\MOB_56F.WAV", + "AUDIO\\MOB_57A.WAV", + "AUDIO\\MOB_57B.WAV", + "AUDIO\\MOB_57C.WAV", + "AUDIO\\MOB_57D.WAV", + "AUDIO\\MOB_57E.WAV", + "AUDIO\\MOB_58A.WAV", + "AUDIO\\MOB_58B.WAV", + "AUDIO\\MOB_58C.WAV", + "AUDIO\\MOB_58D.WAV", + "AUDIO\\MOB_58E.WAV", + "AUDIO\\MOB_58F.WAV", + "AUDIO\\MOB_58G.WAV", + "AUDIO\\MOB_61A.WAV", + "AUDIO\\MOB_61B.WAV", + "AUDIO\\MOB_62A.WAV", + "AUDIO\\MOB_62B.WAV", + "AUDIO\\MOB_62C.WAV", + "AUDIO\\MOB_62D.WAV", + "AUDIO\\MOB_63A.WAV", + "AUDIO\\MOB_63B.WAV", + "AUDIO\\MOB_63C.WAV", + "AUDIO\\MOB_63D.WAV", + "AUDIO\\MOB_63E.WAV", + "AUDIO\\MOB_63F.WAV", + "AUDIO\\MOB_63G.WAV", + "AUDIO\\MOB_63H.WAV", + "AUDIO\\MOB_63I.WAV", + "AUDIO\\MOB_63J.WAV", + "AUDIO\\MOB_66A.WAV", + "AUDIO\\MOB_66B.WAV", + "AUDIO\\MOB_68A.WAV", + "AUDIO\\MOB_68B.WAV", + "AUDIO\\MOB_68C.WAV", + "AUDIO\\MOB_68D.WAV", + "AUDIO\\MOB_70A.WAV", + "AUDIO\\MOB_70B.WAV", + "AUDIO\\MOB_71A.WAV", + "AUDIO\\MOB_71B.WAV", + "AUDIO\\MOB_71C.WAV", + "AUDIO\\MOB_71D.WAV", + "AUDIO\\MOB_71E.WAV", + "AUDIO\\MOB_71F.WAV", + "AUDIO\\MOB_71G.WAV", + "AUDIO\\MOB_71H.WAV", + "AUDIO\\MOB_71I.WAV", + "AUDIO\\MOB_71J.WAV", + "AUDIO\\MOB_71K.WAV", + "AUDIO\\MOB_71L.WAV", + "AUDIO\\MOB_71M.WAV", + "AUDIO\\MOB_71N.WAV", + "AUDIO\\MOB_72A.WAV", + "AUDIO\\MOB_72B.WAV", + "AUDIO\\MOB_72C.WAV", + "AUDIO\\MOB_72D.WAV", + "AUDIO\\MOB_72E.WAV", + "AUDIO\\MOB_72F.WAV", + "AUDIO\\MOB_72G.WAV", + "AUDIO\\MOB_73A.WAV", + "AUDIO\\MOB_73C.WAV", + "AUDIO\\MOB_73D.WAV", + "AUDIO\\MOB_73F.WAV", + "AUDIO\\MOB_73G.WAV", + "AUDIO\\MOB_73I.WAV", + "AUDIO\\MOB_95A.WAV", + "AUDIO\\MOB_96A.WAV", + "AUDIO\\MOB_98A.WAV", + "AUDIO\\MOB_99A.WAV", + "AUDIO\\JOB1_1B.WAV", + "AUDIO\\JOB1_1C.WAV", + "AUDIO\\JOB1_1D.WAV", + "AUDIO\\JOB2_1B.WAV", + "AUDIO\\JOB2_2.WAV", + "AUDIO\\JOB2_3.WAV", + "AUDIO\\JOB2_4.WAV", + "AUDIO\\JOB2_5.WAV", + "AUDIO\\JOB2_6.WAV", + "AUDIO\\JOB2_7.WAV", + "AUDIO\\JOB2_8.WAV", + "AUDIO\\JOB2_9.WAV", + "AUDIO\\JOB3_1.WAV", + "AUDIO\\JOB3_2.WAV", + "AUDIO\\JOB3_3.WAV", + "AUDIO\\JOB4_1.WAV", + "AUDIO\\JOB4_2.WAV", + "AUDIO\\JOB4_3.WAV", + "AUDIO\\JOB5_1.WAV", + "AUDIO\\JOB5_2.WAV", + "AUDIO\\JOB5_3.WAV", + "AUDIO\\BJM1_20.WAV", + "AUDIO\\BJM1_4.WAV", + "AUDIO\\BJM1_5.WAV", + "AUDIO\\MERC_39.WAV", + "AUDIO\\MONO_1.WAV", + "AUDIO\\MONO_2.WAV", + "AUDIO\\MONO_3.WAV", + "AUDIO\\MONO_4.WAV", + "AUDIO\\MONO_5.WAV", + "AUDIO\\MONO_6.WAV", + "AUDIO\\MONO_7.WAV", + "AUDIO\\MONO_8.WAV", + "AUDIO\\MONO_9.WAV", + "AUDIO\\MONO10.WAV", + "AUDIO\\MONO11.WAV", + "AUDIO\\MONO12.WAV", + "AUDIO\\MONO13.WAV", + "AUDIO\\MONO14.WAV", + "AUDIO\\MONO15.WAV", + "AUDIO\\MONO16.WAV", + "AUDIO\\FUD_01.WAV", + "AUDIO\\FUD_02.WAV", + "AUDIO\\FUD_03.WAV", + "AUDIO\\FUD_04.WAV", + "AUDIO\\FUD_05.WAV", + "AUDIO\\FUD_06.WAV", + "AUDIO\\FUD_07.WAV", + "AUDIO\\FUD_08.WAV", + "AUDIO\\FUD_09.WAV", + "AUDIO\\FUD_10.WAV", + "AUDIO\\FUD_11.WAV", + "AUDIO\\FUD_12.WAV", + "AUDIO\\FUD_13.WAV", + "AUDIO\\FUD_14.WAV", + "AUDIO\\FUD_15.WAV", + "AUDIO\\FUD_16.WAV", + "AUDIO\\FUD_17.WAV", + "AUDIO\\FUD_18.WAV", + "AUDIO\\FUD_19.WAV", + "AUDIO\\FUD_20.WAV", + "AUDIO\\BURG_01.WAV", + "AUDIO\\BURG_02.WAV", + "AUDIO\\BURG_03.WAV", + "AUDIO\\BURG_04.WAV", + "AUDIO\\BURG_05.WAV", + "AUDIO\\BURG_06.WAV", + "AUDIO\\BURG_07.WAV", + "AUDIO\\BURG_08.WAV", + "AUDIO\\BURG_09.WAV", + "AUDIO\\BURG_10.WAV", + "AUDIO\\BURG_11.WAV", + "AUDIO\\BURG_12.WAV", + "AUDIO\\CRUST01.WAV", + "AUDIO\\CRUST02.WAV", + "AUDIO\\CRUST03.WAV", + "AUDIO\\CRUST04.WAV", + "AUDIO\\CRUST05.WAV", + "AUDIO\\CRUST06.WAV", + "AUDIO\\CRUST07.WAV", + "AUDIO\\CRUST08.WAV", + "AUDIO\\CRUST09.WAV", + "AUDIO\\BAND_01.WAV", + "AUDIO\\BAND_02.WAV", + "AUDIO\\BAND_03.WAV", + "AUDIO\\BAND_04.WAV", + "AUDIO\\BAND_05.WAV", + "AUDIO\\BAND_06.WAV", + "AUDIO\\BAND_07.WAV", + "AUDIO\\BAND_08.WAV", + "AUDIO\\SHAFT01.WAV", + "AUDIO\\SHAFT02.WAV", + "AUDIO\\SHAFT03.WAV", + "AUDIO\\SHAFT04.WAV", + "AUDIO\\SHAFT05.WAV", + "AUDIO\\SHAFT06.WAV", + "AUDIO\\SHAFT07.WAV", + "AUDIO\\SHAFT08.WAV", + "AUDIO\\PISS_01.WAV", + "AUDIO\\PISS_02.WAV", + "AUDIO\\PISS_03.WAV", + "AUDIO\\PISS_04.WAV", + "AUDIO\\PISS_05.WAV", + "AUDIO\\PISS_06.WAV", + "AUDIO\\PISS_07.WAV", + "AUDIO\\PISS_08.WAV", + "AUDIO\\PISS_09.WAV", + "AUDIO\\PISS_10.WAV", + "AUDIO\\PISS_11.WAV", + "AUDIO\\PISS_12.WAV", + "AUDIO\\PISS_13.WAV", + "AUDIO\\PISS_14.WAV", + "AUDIO\\PISS_15.WAV", + "AUDIO\\PISS_16.WAV", + "AUDIO\\PISS_17.WAV", + "AUDIO\\PISS_18.WAV", + "AUDIO\\PISS_19.WAV", + "AUDIO\\GIMME01.WAV", + "AUDIO\\GIMME02.WAV", + "AUDIO\\GIMME03.WAV", + "AUDIO\\GIMME04.WAV", + "AUDIO\\GIMME05.WAV", + "AUDIO\\GIMME06.WAV", + "AUDIO\\GIMME07.WAV", + "AUDIO\\GIMME08.WAV", + "AUDIO\\GIMME09.WAV", + "AUDIO\\GIMME10.WAV", + "AUDIO\\GIMME11.WAV", + "AUDIO\\GIMME12.WAV", + "AUDIO\\GIMME13.WAV", + "AUDIO\\GIMME14.WAV", + "AUDIO\\GIMME15.WAV", + "AUDIO\\BUST_01.WAV", + "AUDIO\\BUST_02.WAV", + "AUDIO\\BUST_03.WAV", + "AUDIO\\BUST_04.WAV", + "AUDIO\\BUST_05.WAV", + "AUDIO\\BUST_06.WAV", + "AUDIO\\BUST_07.WAV", + "AUDIO\\BUST_08.WAV", + "AUDIO\\BUST_09.WAV", + "AUDIO\\BUST_10.WAV", + "AUDIO\\BUST_11.WAV", + "AUDIO\\BUST_12.WAV", + "AUDIO\\BUST_13.WAV", + "AUDIO\\BUST_14.WAV", + "AUDIO\\BUST_15.WAV", + "AUDIO\\BUST_16.WAV", + "AUDIO\\BUST_17.WAV", + "AUDIO\\BUST_18.WAV", + "AUDIO\\BUST_19.WAV", + "AUDIO\\BUST_20.WAV", + "AUDIO\\BUST_21.WAV", + "AUDIO\\BUST_22.WAV", + "AUDIO\\BUST_23.WAV", + "AUDIO\\BUST_24.WAV", + "AUDIO\\BUST_25.WAV", + "AUDIO\\BUST_26.WAV", + "AUDIO\\BUST_27.WAV", + "AUDIO\\BUST_28.WAV", +}; +#endif + static char StreamedNameTable[][25] = { "AUDIO\\WILD.ADF", @@ -492,7 +1580,6 @@ static char StreamedNameTable[][25] = "AUDIO\\MISCOM.MP3", "AUDIO\\MISCOM.MP3", "AUDIO\\MISCOM.MP3", -#endif "AUDIO\\MOBR1.WAV", "AUDIO\\PAGER.WAV", "AUDIO\\CARREV.WAV", diff --git a/src/audio/sampman_miles.cpp b/src/audio/sampman_miles.cpp index 49f2f10f..b77584d0 100644 --- a/src/audio/sampman_miles.cpp +++ b/src/audio/sampman_miles.cpp @@ -1061,10 +1061,20 @@ cSampleManager::Initialise(void) #endif for ( int32 i = STREAMED_SOUND_MISSION_MOBR1; i < TOTAL_STREAMED_SOUNDS; i++ ) { +#ifdef PS2_AUDIO_PATHS strcpy(filepath, m_szCDRomRootPath); - strcat(filepath, StreamedNameTable[i]); - + strcat(filepath, PS2StreamedNameTable[i]); + mp3Stream[0] = AIL_open_stream(DIG, filepath, 0); + + if ( !mp3Stream[0] ) +#endif + { + strcpy(filepath, m_szCDRomRootPath); + strcat(filepath, StreamedNameTable[i]); + + mp3Stream[0] = AIL_open_stream(DIG, filepath, 0); + } if ( mp3Stream[0] ) { @@ -1102,11 +1112,21 @@ cSampleManager::Initialise(void) for (int32 i = 0; i < STREAMED_SOUND_MISSION_MOBR1; i++) { +#ifdef PS2_AUDIO_PATHS strcpy(filepath, m_MP3FilesPath); - strcat(filepath, StreamedNameTable[i]); + strcat(filepath, PS2StreamedNameTable[i]); mp3Stream[0] = AIL_open_stream(DIG, filepath, 0); + if ( !mp3Stream[0] ) +#endif + { + strcpy(filepath, m_MP3FilesPath); + strcat(filepath, StreamedNameTable[i]); + + mp3Stream[0] = AIL_open_stream(DIG, filepath, 0); + } + if (mp3Stream[0]) { AIL_stream_ms_position(mp3Stream[0], &tatalms, NULL); @@ -1147,10 +1167,20 @@ cSampleManager::Initialise(void) #endif for ( int32 i = STREAMED_SOUND_MISSION_COMPLETED4; i < STREAMED_SOUND_MISSION_PAGER; i++ ) { +#ifdef PS2_AUDIO_PATHS strcpy(filepath, m_MiscomPath); - strcat(filepath, StreamedNameTable[i]); - + strcat(filepath, PS2StreamedNameTable[i]); + mp3Stream[0] = AIL_open_stream(DIG, filepath, 0); + + if ( !mp3Stream[0] ) +#endif + { + strcpy(filepath, m_MiscomPath); + strcat(filepath, StreamedNameTable[i]); + + mp3Stream[0] = AIL_open_stream(DIG, filepath, 0); + } if ( mp3Stream[0] ) { @@ -2043,11 +2073,20 @@ cSampleManager::PreloadStreamedFile(uint32 nFile, uint8 nStream) } char filepath[MAX_PATH]; - +#ifdef PS2_AUDIO_PATHS strcpy(filepath, nFile < STREAMED_SOUND_MISSION_COMPLETED4 ? m_MP3FilesPath : (nFile < STREAMED_SOUND_MISSION_MOBR1 ? m_MiscomPath : m_WavFilesPath)); - strcat(filepath, StreamedNameTable[nFile]); - + strcat(filepath, PS2StreamedNameTable[nFile]); + mp3Stream[nStream] = AIL_open_stream(DIG, filepath, 0); + + if ( !mp3Stream[nStream] ) +#endif + { + strcpy(filepath, nFile < STREAMED_SOUND_MISSION_COMPLETED4 ? m_MP3FilesPath : (nFile < STREAMED_SOUND_MISSION_MOBR1 ? m_MiscomPath : m_WavFilesPath)); + strcat(filepath, StreamedNameTable[nFile]); + + mp3Stream[nStream] = AIL_open_stream(DIG, filepath, 0); + } if ( mp3Stream[nStream] ) { @@ -2109,10 +2148,20 @@ cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream) // Try to continue from previous song, if already started if(!_GetMP3PosFromStreamPos(&position, &e) && !e) { nFile = 0; +#ifdef PS2_AUDIO_PATHS strcpy(filename, m_MiscomPath); - strcat(filename, StreamedNameTable[nFile]); - mp3Stream[nStream] = - AIL_open_stream(DIG, filename, 0); + strcat(filename, PS2StreamedNameTable[nFile]); + + mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0); + + if ( !mp3Stream[nStream] ) +#endif + { + strcpy(filename, m_MiscomPath); + strcat(filename, StreamedNameTable[nFile]); + mp3Stream[nStream] = + AIL_open_stream(DIG, filename, 0); + } if(mp3Stream[nStream]) { AIL_set_stream_loop_count(mp3Stream[nStream], nStreamLoopedFlag[nStream] ? 0 : 1); nStreamLoopedFlag[nStream] = TRUE; @@ -2156,11 +2205,20 @@ cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream) { nFile = 0; _bIsMp3Active = 0; +#ifdef PS2_AUDIO_PATHS strcpy(filename, m_MiscomPath); - strcat(filename, StreamedNameTable[nFile]); + strcat(filename, PS2StreamedNameTable[nFile]); - mp3Stream[nStream] = - AIL_open_stream(DIG, filename, 0); + mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0); + + if ( !mp3Stream[nStream] ) +#endif + { + strcpy(filename, m_MiscomPath); + strcat(filename, StreamedNameTable[nFile]); + mp3Stream[nStream] = + AIL_open_stream(DIG, filename, 0); + } if(mp3Stream[nStream]) { AIL_set_stream_loop_count( mp3Stream[nStream], nStreamLoopedFlag[nStream] ? 0 : 1); @@ -2201,10 +2259,20 @@ cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream) position = 0; nFile = 0; } +#ifdef PS2_AUDIO_PATHS strcpy(filename, m_MiscomPath); - strcat(filename, StreamedNameTable[nFile]); - + strcat(filename, PS2StreamedNameTable[nFile]); + mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0); + + if ( !mp3Stream[nStream] ) +#endif + { + strcpy(filename, m_MiscomPath); + strcat(filename, StreamedNameTable[nFile]); + mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0); + } + if ( mp3Stream[nStream] ) { AIL_set_stream_loop_count(mp3Stream[nStream], nStreamLoopedFlag[nStream] ? 0 : 1); diff --git a/src/audio/sampman_oal.cpp b/src/audio/sampman_oal.cpp index 6740f08f..73f6900b 100644 --- a/src/audio/sampman_oal.cpp +++ b/src/audio/sampman_oal.cpp @@ -920,7 +920,11 @@ cSampleManager::Initialise(void) for ( int32 i = 0; i < TOTAL_STREAMED_SOUNDS; i++ ) { - if ( aStream[0] && aStream[0]->Open(StreamedNameTable[i], IsThisTrackAt16KHz(i) ? 16000 : 32000) ) + if ( aStream[0] && ( +#ifdef PS2_AUDIO_PATHS + aStream[0]->Open(PS2StreamedNameTable[i], IsThisTrackAt16KHz(i) ? 16000 : 32000) || +#endif + aStream[0]->Open(StreamedNameTable[i], IsThisTrackAt16KHz(i) ? 16000 : 32000)) ) { uint32 tatalms = aStream[0]->GetLengthMS(); aStream[0]->Close(); @@ -1627,9 +1631,7 @@ cSampleManager::StopChannel(uint32 nChannel) void cSampleManager::PreloadStreamedFile(uint32 nFile, uint8 nStream) -{ - char filename[MAX_PATH]; - +{ ASSERT( nStream < MAX_STREAMS ); if ( nFile < TOTAL_STREAMED_SOUNDS ) @@ -1637,10 +1639,10 @@ cSampleManager::PreloadStreamedFile(uint32 nFile, uint8 nStream) CStream *stream = aStream[nStream]; stream->Close(); - - strcpy(filename, StreamedNameTable[nFile]); - - stream->Open(filename, IsThisTrackAt16KHz(nFile) ? 16000 : 32000); +#ifdef PS2_AUDIO_PATHS + if(!stream->Open(PS2StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000)) +#endif + stream->Open(StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000); if ( !stream->Setup() ) { stream->Close(); @@ -1701,10 +1703,11 @@ cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream) if(!_GetMP3PosFromStreamPos(&position, &e) && !e) { nFile = 0; - strcpy(filename, StreamedNameTable[nFile]); - CStream *stream = aStream[nStream]; - stream->Open(filename, IsThisTrackAt16KHz(nFile) ? 16000 : 32000); +#ifdef PS2_AUDIO_PATHS + if(!stream->Open(PS2StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000)) +#endif + stream->Open(StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000); if ( stream->Setup() ) { stream->SetLoopCount(nStreamLoopedFlag[nStream] ? 0 : 1); nStreamLoopedFlag[nStream] = TRUE; @@ -1756,10 +1759,12 @@ cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream) { nFile = 0; _bIsMp3Active = 0; - strcpy(filename, StreamedNameTable[nFile]); - CStream* stream = aStream[nStream]; - stream->Open(filename, IsThisTrackAt16KHz(nFile) ? 16000 : 32000); + CStream *stream = aStream[nStream]; +#ifdef PS2_AUDIO_PATHS + if(!stream->Open(PS2StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000)) +#endif + stream->Open(StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000); if (stream->Setup()) { stream->SetLoopCount(nStreamLoopedFlag[nStream] ? 0 : 1); @@ -1806,7 +1811,10 @@ cSampleManager::StartStreamedFile(uint32 nFile, uint32 nPos, uint8 nStream) CStream *stream = aStream[nStream]; - aStream[nStream]->Open(filename, IsThisTrackAt16KHz(nFile) ? 16000 : 32000); +#ifdef PS2_AUDIO_PATHS + if(!stream->Open(PS2StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000)) +#endif + stream->Open(StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000); if ( stream->Setup() ) { stream->SetLoopCount(nStreamLoopedFlag[nStream] ? 0 : 1); diff --git a/src/core/config.h b/src/core/config.h index 9c318350..307f55d3 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -419,7 +419,7 @@ static_assert(false, "SUPPORT_XBOX_SCRIPT and SUPPORT_MOBILE_SCRIPT are mutually #define RADIO_SCROLL_TO_PREV_STATION // Won't work without FIX_BUGS #define AUDIO_CACHE // cache sound lengths to speed up the cold boot #define PS2_AUDIO_CHANNELS // increases the maximum number of audio channels to PS2 value of 43 (PC has 28 originally) -//#define PS2_AUDIO_PATHS // changes audio paths for cutscenes and radio to PS2 paths (needs vbdec on MSS builds) +#define PS2_AUDIO_PATHS // changes audio paths for cutscenes and radio to PS2 paths (needs vbdec on MSS builds) //#define AUDIO_OAL_USE_SNDFILE // use libsndfile to decode WAVs instead of our internal decoder #define AUDIO_OAL_USE_MPG123 // use mpg123 to support mp3 files #define MULTITHREADED_AUDIO // for streams. requires C++11 or later From c937bdbfea8f522d14d7a41f24372bddf5bdafcc Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Sun, 18 Jul 2021 00:03:57 +0300 Subject: [PATCH 26/27] render -> renderer (original name) --- .vscode/settings.json | 2 +- codewarrior/reVC.mcp.xml | 6 +++--- premake5.lua | 4 ++-- src/{render => renderer}/2dEffect.h | 0 src/{render => renderer}/Antennas.cpp | 0 src/{render => renderer}/Antennas.h | 0 src/{render => renderer}/Clouds.cpp | 0 src/{render => renderer}/Clouds.h | 0 src/{render => renderer}/Console.cpp | 0 src/{render => renderer}/Console.h | 0 src/{render => renderer}/Coronas.cpp | 0 src/{render => renderer}/Coronas.h | 0 src/{render => renderer}/Credits.cpp | 0 src/{render => renderer}/Credits.h | 0 src/{render => renderer}/CutsceneShadow.cpp | 0 src/{render => renderer}/CutsceneShadow.h | 0 src/{render => renderer}/Draw.cpp | 0 src/{render => renderer}/Draw.h | 0 src/{render => renderer}/Fluff.cpp | 0 src/{render => renderer}/Fluff.h | 0 src/{render => renderer}/Font.cpp | 0 src/{render => renderer}/Font.h | 0 src/{render => renderer}/Glass.cpp | 0 src/{render => renderer}/Glass.h | 0 src/{render => renderer}/Hud.cpp | 0 src/{render => renderer}/Hud.h | 0 src/{render => renderer}/Instance.cpp | 0 src/{render => renderer}/Instance.h | 0 src/{render => renderer}/Lines.cpp | 0 src/{render => renderer}/Lines.h | 0 src/{render => renderer}/MBlur.cpp | 0 src/{render => renderer}/MBlur.h | 0 src/{render => renderer}/Occlusion.cpp | 0 src/{render => renderer}/Occlusion.h | 0 src/{render => renderer}/Particle.cpp | 0 src/{render => renderer}/Particle.h | 0 src/{render => renderer}/ParticleMgr.cpp | 0 src/{render => renderer}/ParticleMgr.h | 0 src/{render => renderer}/ParticleType.h | 0 src/{render => renderer}/PlayerSkin.cpp | 0 src/{render => renderer}/PlayerSkin.h | 0 src/{render => renderer}/PointLights.cpp | 0 src/{render => renderer}/PointLights.h | 0 src/{render => renderer}/RenderBuffer.cpp | 0 src/{render => renderer}/RenderBuffer.h | 0 src/{render => renderer}/Renderer.cpp | 0 src/{render => renderer}/Renderer.h | 0 src/{render => renderer}/Rubbish.cpp | 0 src/{render => renderer}/Rubbish.h | 0 src/{render => renderer}/ShadowCamera.cpp | 0 src/{render => renderer}/ShadowCamera.h | 0 src/{render => renderer}/Shadows.cpp | 0 src/{render => renderer}/Shadows.h | 0 src/{render => renderer}/Skidmarks.cpp | 0 src/{render => renderer}/Skidmarks.h | 0 src/{render => renderer}/SpecialFX.cpp | 0 src/{render => renderer}/SpecialFX.h | 0 src/{render => renderer}/Sprite.cpp | 0 src/{render => renderer}/Sprite.h | 0 src/{render => renderer}/Sprite2d.cpp | 0 src/{render => renderer}/Sprite2d.h | 0 src/{render => renderer}/TexList.cpp | 0 src/{render => renderer}/TexList.h | 0 src/{render => renderer}/Timecycle.cpp | 0 src/{render => renderer}/Timecycle.h | 0 src/{render => renderer}/VarConsole.cpp | 0 src/{render => renderer}/VarConsole.h | 0 src/{render => renderer}/WaterCannon.cpp | 0 src/{render => renderer}/WaterCannon.h | 0 src/{render => renderer}/WaterCreatures.cpp | 0 src/{render => renderer}/WaterCreatures.h | 0 src/{render => renderer}/WaterLevel.cpp | 0 src/{render => renderer}/WaterLevel.h | 0 src/{render => renderer}/Weather.cpp | 0 src/{render => renderer}/Weather.h | 0 src/{render => renderer}/WindModifiers.cpp | 0 src/{render => renderer}/WindModifiers.h | 0 77 files changed, 6 insertions(+), 6 deletions(-) rename src/{render => renderer}/2dEffect.h (100%) rename src/{render => renderer}/Antennas.cpp (100%) rename src/{render => renderer}/Antennas.h (100%) rename src/{render => renderer}/Clouds.cpp (100%) rename src/{render => renderer}/Clouds.h (100%) rename src/{render => renderer}/Console.cpp (100%) rename src/{render => renderer}/Console.h (100%) rename src/{render => renderer}/Coronas.cpp (100%) rename src/{render => renderer}/Coronas.h (100%) rename src/{render => renderer}/Credits.cpp (100%) rename src/{render => renderer}/Credits.h (100%) rename src/{render => renderer}/CutsceneShadow.cpp (100%) rename src/{render => renderer}/CutsceneShadow.h (100%) rename src/{render => renderer}/Draw.cpp (100%) rename src/{render => renderer}/Draw.h (100%) rename src/{render => renderer}/Fluff.cpp (100%) rename src/{render => renderer}/Fluff.h (100%) rename src/{render => renderer}/Font.cpp (100%) rename src/{render => renderer}/Font.h (100%) rename src/{render => renderer}/Glass.cpp (100%) rename src/{render => renderer}/Glass.h (100%) rename src/{render => renderer}/Hud.cpp (100%) rename src/{render => renderer}/Hud.h (100%) rename src/{render => renderer}/Instance.cpp (100%) rename src/{render => renderer}/Instance.h (100%) rename src/{render => renderer}/Lines.cpp (100%) rename src/{render => renderer}/Lines.h (100%) rename src/{render => renderer}/MBlur.cpp (100%) rename src/{render => renderer}/MBlur.h (100%) rename src/{render => renderer}/Occlusion.cpp (100%) rename src/{render => renderer}/Occlusion.h (100%) rename src/{render => renderer}/Particle.cpp (100%) rename src/{render => renderer}/Particle.h (100%) rename src/{render => renderer}/ParticleMgr.cpp (100%) rename src/{render => renderer}/ParticleMgr.h (100%) rename src/{render => renderer}/ParticleType.h (100%) rename src/{render => renderer}/PlayerSkin.cpp (100%) rename src/{render => renderer}/PlayerSkin.h (100%) rename src/{render => renderer}/PointLights.cpp (100%) rename src/{render => renderer}/PointLights.h (100%) rename src/{render => renderer}/RenderBuffer.cpp (100%) rename src/{render => renderer}/RenderBuffer.h (100%) rename src/{render => renderer}/Renderer.cpp (100%) rename src/{render => renderer}/Renderer.h (100%) rename src/{render => renderer}/Rubbish.cpp (100%) rename src/{render => renderer}/Rubbish.h (100%) rename src/{render => renderer}/ShadowCamera.cpp (100%) rename src/{render => renderer}/ShadowCamera.h (100%) rename src/{render => renderer}/Shadows.cpp (100%) rename src/{render => renderer}/Shadows.h (100%) rename src/{render => renderer}/Skidmarks.cpp (100%) rename src/{render => renderer}/Skidmarks.h (100%) rename src/{render => renderer}/SpecialFX.cpp (100%) rename src/{render => renderer}/SpecialFX.h (100%) rename src/{render => renderer}/Sprite.cpp (100%) rename src/{render => renderer}/Sprite.h (100%) rename src/{render => renderer}/Sprite2d.cpp (100%) rename src/{render => renderer}/Sprite2d.h (100%) rename src/{render => renderer}/TexList.cpp (100%) rename src/{render => renderer}/TexList.h (100%) rename src/{render => renderer}/Timecycle.cpp (100%) rename src/{render => renderer}/Timecycle.h (100%) rename src/{render => renderer}/VarConsole.cpp (100%) rename src/{render => renderer}/VarConsole.h (100%) rename src/{render => renderer}/WaterCannon.cpp (100%) rename src/{render => renderer}/WaterCannon.h (100%) rename src/{render => renderer}/WaterCreatures.cpp (100%) rename src/{render => renderer}/WaterCreatures.h (100%) rename src/{render => renderer}/WaterLevel.cpp (100%) rename src/{render => renderer}/WaterLevel.h (100%) rename src/{render => renderer}/Weather.cpp (100%) rename src/{render => renderer}/Weather.h (100%) rename src/{render => renderer}/WindModifiers.cpp (100%) rename src/{render => renderer}/WindModifiers.h (100%) diff --git a/.vscode/settings.json b/.vscode/settings.json index 10cb5627..fee80960 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -13,7 +13,7 @@ "src/modelinfo", "src/objects", "src/peds", - "src/render", + "src/renderer", "src/rw", "src/save", "src/skel", diff --git a/codewarrior/reVC.mcp.xml b/codewarrior/reVC.mcp.xml index 92638894..750fb675 100644 --- a/codewarrior/reVC.mcp.xml +++ b/codewarrior/reVC.mcp.xml @@ -187,7 +187,7 @@ SearchPath - Path..\src\render + Path..\src\renderer PathFormatWindows PathRootProject @@ -6712,7 +6712,7 @@ SearchPath - Path..\src\render + Path..\src\renderer PathFormatWindows PathRootProject @@ -14909,7 +14909,7 @@ Windows - render + renderer Debug Name diff --git a/premake5.lua b/premake5.lua index f1287011..4223b395 100644 --- a/premake5.lua +++ b/premake5.lua @@ -264,7 +264,7 @@ project "reVC" files { addSrcFiles("src/modelinfo") } files { addSrcFiles("src/objects") } files { addSrcFiles("src/peds") } - files { addSrcFiles("src/render") } + files { addSrcFiles("src/renderer") } files { addSrcFiles("src/rw") } files { addSrcFiles("src/save") } files { addSrcFiles("src/skel") } @@ -293,7 +293,7 @@ project "reVC" includedirs { "src/modelinfo" } includedirs { "src/objects" } includedirs { "src/peds" } - includedirs { "src/render" } + includedirs { "src/renderer" } includedirs { "src/rw" } includedirs { "src/save/" } includedirs { "src/skel/" } diff --git a/src/render/2dEffect.h b/src/renderer/2dEffect.h similarity index 100% rename from src/render/2dEffect.h rename to src/renderer/2dEffect.h diff --git a/src/render/Antennas.cpp b/src/renderer/Antennas.cpp similarity index 100% rename from src/render/Antennas.cpp rename to src/renderer/Antennas.cpp diff --git a/src/render/Antennas.h b/src/renderer/Antennas.h similarity index 100% rename from src/render/Antennas.h rename to src/renderer/Antennas.h diff --git a/src/render/Clouds.cpp b/src/renderer/Clouds.cpp similarity index 100% rename from src/render/Clouds.cpp rename to src/renderer/Clouds.cpp diff --git a/src/render/Clouds.h b/src/renderer/Clouds.h similarity index 100% rename from src/render/Clouds.h rename to src/renderer/Clouds.h diff --git a/src/render/Console.cpp b/src/renderer/Console.cpp similarity index 100% rename from src/render/Console.cpp rename to src/renderer/Console.cpp diff --git a/src/render/Console.h b/src/renderer/Console.h similarity index 100% rename from src/render/Console.h rename to src/renderer/Console.h diff --git a/src/render/Coronas.cpp b/src/renderer/Coronas.cpp similarity index 100% rename from src/render/Coronas.cpp rename to src/renderer/Coronas.cpp diff --git a/src/render/Coronas.h b/src/renderer/Coronas.h similarity index 100% rename from src/render/Coronas.h rename to src/renderer/Coronas.h diff --git a/src/render/Credits.cpp b/src/renderer/Credits.cpp similarity index 100% rename from src/render/Credits.cpp rename to src/renderer/Credits.cpp diff --git a/src/render/Credits.h b/src/renderer/Credits.h similarity index 100% rename from src/render/Credits.h rename to src/renderer/Credits.h diff --git a/src/render/CutsceneShadow.cpp b/src/renderer/CutsceneShadow.cpp similarity index 100% rename from src/render/CutsceneShadow.cpp rename to src/renderer/CutsceneShadow.cpp diff --git a/src/render/CutsceneShadow.h b/src/renderer/CutsceneShadow.h similarity index 100% rename from src/render/CutsceneShadow.h rename to src/renderer/CutsceneShadow.h diff --git a/src/render/Draw.cpp b/src/renderer/Draw.cpp similarity index 100% rename from src/render/Draw.cpp rename to src/renderer/Draw.cpp diff --git a/src/render/Draw.h b/src/renderer/Draw.h similarity index 100% rename from src/render/Draw.h rename to src/renderer/Draw.h diff --git a/src/render/Fluff.cpp b/src/renderer/Fluff.cpp similarity index 100% rename from src/render/Fluff.cpp rename to src/renderer/Fluff.cpp diff --git a/src/render/Fluff.h b/src/renderer/Fluff.h similarity index 100% rename from src/render/Fluff.h rename to src/renderer/Fluff.h diff --git a/src/render/Font.cpp b/src/renderer/Font.cpp similarity index 100% rename from src/render/Font.cpp rename to src/renderer/Font.cpp diff --git a/src/render/Font.h b/src/renderer/Font.h similarity index 100% rename from src/render/Font.h rename to src/renderer/Font.h diff --git a/src/render/Glass.cpp b/src/renderer/Glass.cpp similarity index 100% rename from src/render/Glass.cpp rename to src/renderer/Glass.cpp diff --git a/src/render/Glass.h b/src/renderer/Glass.h similarity index 100% rename from src/render/Glass.h rename to src/renderer/Glass.h diff --git a/src/render/Hud.cpp b/src/renderer/Hud.cpp similarity index 100% rename from src/render/Hud.cpp rename to src/renderer/Hud.cpp diff --git a/src/render/Hud.h b/src/renderer/Hud.h similarity index 100% rename from src/render/Hud.h rename to src/renderer/Hud.h diff --git a/src/render/Instance.cpp b/src/renderer/Instance.cpp similarity index 100% rename from src/render/Instance.cpp rename to src/renderer/Instance.cpp diff --git a/src/render/Instance.h b/src/renderer/Instance.h similarity index 100% rename from src/render/Instance.h rename to src/renderer/Instance.h diff --git a/src/render/Lines.cpp b/src/renderer/Lines.cpp similarity index 100% rename from src/render/Lines.cpp rename to src/renderer/Lines.cpp diff --git a/src/render/Lines.h b/src/renderer/Lines.h similarity index 100% rename from src/render/Lines.h rename to src/renderer/Lines.h diff --git a/src/render/MBlur.cpp b/src/renderer/MBlur.cpp similarity index 100% rename from src/render/MBlur.cpp rename to src/renderer/MBlur.cpp diff --git a/src/render/MBlur.h b/src/renderer/MBlur.h similarity index 100% rename from src/render/MBlur.h rename to src/renderer/MBlur.h diff --git a/src/render/Occlusion.cpp b/src/renderer/Occlusion.cpp similarity index 100% rename from src/render/Occlusion.cpp rename to src/renderer/Occlusion.cpp diff --git a/src/render/Occlusion.h b/src/renderer/Occlusion.h similarity index 100% rename from src/render/Occlusion.h rename to src/renderer/Occlusion.h diff --git a/src/render/Particle.cpp b/src/renderer/Particle.cpp similarity index 100% rename from src/render/Particle.cpp rename to src/renderer/Particle.cpp diff --git a/src/render/Particle.h b/src/renderer/Particle.h similarity index 100% rename from src/render/Particle.h rename to src/renderer/Particle.h diff --git a/src/render/ParticleMgr.cpp b/src/renderer/ParticleMgr.cpp similarity index 100% rename from src/render/ParticleMgr.cpp rename to src/renderer/ParticleMgr.cpp diff --git a/src/render/ParticleMgr.h b/src/renderer/ParticleMgr.h similarity index 100% rename from src/render/ParticleMgr.h rename to src/renderer/ParticleMgr.h diff --git a/src/render/ParticleType.h b/src/renderer/ParticleType.h similarity index 100% rename from src/render/ParticleType.h rename to src/renderer/ParticleType.h diff --git a/src/render/PlayerSkin.cpp b/src/renderer/PlayerSkin.cpp similarity index 100% rename from src/render/PlayerSkin.cpp rename to src/renderer/PlayerSkin.cpp diff --git a/src/render/PlayerSkin.h b/src/renderer/PlayerSkin.h similarity index 100% rename from src/render/PlayerSkin.h rename to src/renderer/PlayerSkin.h diff --git a/src/render/PointLights.cpp b/src/renderer/PointLights.cpp similarity index 100% rename from src/render/PointLights.cpp rename to src/renderer/PointLights.cpp diff --git a/src/render/PointLights.h b/src/renderer/PointLights.h similarity index 100% rename from src/render/PointLights.h rename to src/renderer/PointLights.h diff --git a/src/render/RenderBuffer.cpp b/src/renderer/RenderBuffer.cpp similarity index 100% rename from src/render/RenderBuffer.cpp rename to src/renderer/RenderBuffer.cpp diff --git a/src/render/RenderBuffer.h b/src/renderer/RenderBuffer.h similarity index 100% rename from src/render/RenderBuffer.h rename to src/renderer/RenderBuffer.h diff --git a/src/render/Renderer.cpp b/src/renderer/Renderer.cpp similarity index 100% rename from src/render/Renderer.cpp rename to src/renderer/Renderer.cpp diff --git a/src/render/Renderer.h b/src/renderer/Renderer.h similarity index 100% rename from src/render/Renderer.h rename to src/renderer/Renderer.h diff --git a/src/render/Rubbish.cpp b/src/renderer/Rubbish.cpp similarity index 100% rename from src/render/Rubbish.cpp rename to src/renderer/Rubbish.cpp diff --git a/src/render/Rubbish.h b/src/renderer/Rubbish.h similarity index 100% rename from src/render/Rubbish.h rename to src/renderer/Rubbish.h diff --git a/src/render/ShadowCamera.cpp b/src/renderer/ShadowCamera.cpp similarity index 100% rename from src/render/ShadowCamera.cpp rename to src/renderer/ShadowCamera.cpp diff --git a/src/render/ShadowCamera.h b/src/renderer/ShadowCamera.h similarity index 100% rename from src/render/ShadowCamera.h rename to src/renderer/ShadowCamera.h diff --git a/src/render/Shadows.cpp b/src/renderer/Shadows.cpp similarity index 100% rename from src/render/Shadows.cpp rename to src/renderer/Shadows.cpp diff --git a/src/render/Shadows.h b/src/renderer/Shadows.h similarity index 100% rename from src/render/Shadows.h rename to src/renderer/Shadows.h diff --git a/src/render/Skidmarks.cpp b/src/renderer/Skidmarks.cpp similarity index 100% rename from src/render/Skidmarks.cpp rename to src/renderer/Skidmarks.cpp diff --git a/src/render/Skidmarks.h b/src/renderer/Skidmarks.h similarity index 100% rename from src/render/Skidmarks.h rename to src/renderer/Skidmarks.h diff --git a/src/render/SpecialFX.cpp b/src/renderer/SpecialFX.cpp similarity index 100% rename from src/render/SpecialFX.cpp rename to src/renderer/SpecialFX.cpp diff --git a/src/render/SpecialFX.h b/src/renderer/SpecialFX.h similarity index 100% rename from src/render/SpecialFX.h rename to src/renderer/SpecialFX.h diff --git a/src/render/Sprite.cpp b/src/renderer/Sprite.cpp similarity index 100% rename from src/render/Sprite.cpp rename to src/renderer/Sprite.cpp diff --git a/src/render/Sprite.h b/src/renderer/Sprite.h similarity index 100% rename from src/render/Sprite.h rename to src/renderer/Sprite.h diff --git a/src/render/Sprite2d.cpp b/src/renderer/Sprite2d.cpp similarity index 100% rename from src/render/Sprite2d.cpp rename to src/renderer/Sprite2d.cpp diff --git a/src/render/Sprite2d.h b/src/renderer/Sprite2d.h similarity index 100% rename from src/render/Sprite2d.h rename to src/renderer/Sprite2d.h diff --git a/src/render/TexList.cpp b/src/renderer/TexList.cpp similarity index 100% rename from src/render/TexList.cpp rename to src/renderer/TexList.cpp diff --git a/src/render/TexList.h b/src/renderer/TexList.h similarity index 100% rename from src/render/TexList.h rename to src/renderer/TexList.h diff --git a/src/render/Timecycle.cpp b/src/renderer/Timecycle.cpp similarity index 100% rename from src/render/Timecycle.cpp rename to src/renderer/Timecycle.cpp diff --git a/src/render/Timecycle.h b/src/renderer/Timecycle.h similarity index 100% rename from src/render/Timecycle.h rename to src/renderer/Timecycle.h diff --git a/src/render/VarConsole.cpp b/src/renderer/VarConsole.cpp similarity index 100% rename from src/render/VarConsole.cpp rename to src/renderer/VarConsole.cpp diff --git a/src/render/VarConsole.h b/src/renderer/VarConsole.h similarity index 100% rename from src/render/VarConsole.h rename to src/renderer/VarConsole.h diff --git a/src/render/WaterCannon.cpp b/src/renderer/WaterCannon.cpp similarity index 100% rename from src/render/WaterCannon.cpp rename to src/renderer/WaterCannon.cpp diff --git a/src/render/WaterCannon.h b/src/renderer/WaterCannon.h similarity index 100% rename from src/render/WaterCannon.h rename to src/renderer/WaterCannon.h diff --git a/src/render/WaterCreatures.cpp b/src/renderer/WaterCreatures.cpp similarity index 100% rename from src/render/WaterCreatures.cpp rename to src/renderer/WaterCreatures.cpp diff --git a/src/render/WaterCreatures.h b/src/renderer/WaterCreatures.h similarity index 100% rename from src/render/WaterCreatures.h rename to src/renderer/WaterCreatures.h diff --git a/src/render/WaterLevel.cpp b/src/renderer/WaterLevel.cpp similarity index 100% rename from src/render/WaterLevel.cpp rename to src/renderer/WaterLevel.cpp diff --git a/src/render/WaterLevel.h b/src/renderer/WaterLevel.h similarity index 100% rename from src/render/WaterLevel.h rename to src/renderer/WaterLevel.h diff --git a/src/render/Weather.cpp b/src/renderer/Weather.cpp similarity index 100% rename from src/render/Weather.cpp rename to src/renderer/Weather.cpp diff --git a/src/render/Weather.h b/src/renderer/Weather.h similarity index 100% rename from src/render/Weather.h rename to src/renderer/Weather.h diff --git a/src/render/WindModifiers.cpp b/src/renderer/WindModifiers.cpp similarity index 100% rename from src/render/WindModifiers.cpp rename to src/renderer/WindModifiers.cpp diff --git a/src/render/WindModifiers.h b/src/renderer/WindModifiers.h similarity index 100% rename from src/render/WindModifiers.h rename to src/renderer/WindModifiers.h From 76558e9313c481c39f40b2c73c4a3f68bf560d4e Mon Sep 17 00:00:00 2001 From: withmorten Date: Mon, 19 Jul 2021 23:39:56 +0200 Subject: [PATCH 27/27] fix garbage data written in garage save block --- src/control/Garages.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/control/Garages.cpp b/src/control/Garages.cpp index d7394902..34ed11eb 100644 --- a/src/control/Garages.cpp +++ b/src/control/Garages.cpp @@ -2259,6 +2259,9 @@ void CGarages::Save(uint8 * buf, uint32 * size) //INITSAVEBUF *size = 7876; // for some reason it's not actual size again //*size = (6 * sizeof(uint32) + TOTAL_COLLECTCARS_GARAGES * sizeof(*CarTypesCollected) + sizeof(uint32) + TOTAL_HIDEOUT_GARAGES * NUM_GARAGE_STORED_CARS * sizeof(CStoredCar) + NUM_GARAGES * sizeof(CGarage)); +#if !defined THIS_IS_STUPID && defined COMPATIBLE_SAVES + memset(buf + 7340, 0, *size - 7340); // garbage data is written otherwise +#endif CloseHideOutGaragesBeforeSave(); WriteSaveBuf(buf, NumGarages); WriteSaveBuf(buf, (uint32)BombsAreFree);