1
0
Fork 0
mirror of https://git.rip/DMCA_FUCKER/re3.git synced 2024-06-26 11:07:37 +00:00

sync with master

This commit is contained in:
Nikolay Korolev 2020-04-12 12:08:30 +03:00
commit cbb298c8dd
44 changed files with 2628 additions and 1091 deletions

View file

@ -35,7 +35,6 @@ to reverse at the time, calling the original functions is acceptable.
cAudioManager - WIP
CBoat
CBulletInfo
CMenuManager - WIP
CObject
CPacManPickups
CPedPath

Binary file not shown.

View file

@ -1,5 +1,5 @@
workspace "re3"
configurations { "Debug", "Release", "ReleaseFH" }
configurations { "Debug", "Release", "ReleaseFH", "DebugRW", "ReleaseRW" }
location "build"
files { "src/*.*" }
@ -13,6 +13,7 @@ workspace "re3"
files { "src/objects/*.*" }
files { "src/peds/*.*" }
files { "src/render/*.*" }
files { "src/rw/*.*" }
files { "src/save/*.*" }
files { "src/skel/*.*" }
files { "src/skel/win/*.*" }
@ -32,6 +33,7 @@ workspace "re3"
includedirs { "src/objects" }
includedirs { "src/peds" }
includedirs { "src/render" }
includedirs { "src/rw" }
includedirs { "src/save/" }
includedirs { "src/skel/" }
includedirs { "src/skel/win" }
@ -47,6 +49,12 @@ workspace "re3"
libdirs { "dxsdk/lib" }
libdirs { "milessdk/lib" }
filter "configurations:DebugRW or configurations:ReleaseRW"
defines { "RWLIBS" }
libdirs { "rwsdk/lib/d3d8/release" }
links { "rwcore", "rpworld", "rpmatfx", "rpskin", "rphanim", "rtbmp" }
filter {}
pbcommands = {
"setlocal EnableDelayedExpansion",
@ -102,3 +110,15 @@ project "re3"
staticruntime "on"
targetextension ".asi"
setpaths("$(GTA_III_RE_DIR)/", "gta3.exe", "scripts/")
filter "configurations:DebugRW"
defines { "DEBUG" }
staticruntime "on"
symbols "On"
setpaths("$(GTA_III_RE_DIR)/", "gta3.exe", "plugins/")
filter "configurations:ReleaseRW"
defines { "NDEBUG" }
optimize "On"
staticruntime "on"
setpaths("$(GTA_III_RE_DIR)/", "gta3.exe", "plugins/")

View file

@ -151,7 +151,7 @@ cAudioManager::SetUpLoopingCollisionSound(cAudioCollision *col, uint8 counter)
m_sQueueSample.m_bVolume =
ComputeVolume(emittingVol, CollisionSoundIntensity, m_sQueueSample.m_fDistance);
if(m_sQueueSample.m_bVolume) {
m_sQueueSample.m_counter = counter;
m_sQueueSample.m_nCounter = counter;
m_sQueueSample.m_vecPos = col->m_vecPosition;
m_sQueueSample.m_bBankIndex = SAMPLEBANK_MAIN;
m_sQueueSample.m_bIs2D = false;
@ -164,7 +164,7 @@ cAudioManager::SetUpLoopingCollisionSound(cAudioCollision *col, uint8 counter)
SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex);
m_sQueueSample.m_fSpeedMultiplier = 4.0f;
m_sQueueSample.m_fSoundIntensity = CollisionSoundIntensity;
m_sQueueSample.m_bReleasingSoundFlag = 0;
m_sQueueSample.m_bReleasingSoundFlag = false;
m_sQueueSample.m_nReleasingVolumeDivider = 5;
m_sQueueSample.m_bReverbFlag = true;
m_sQueueSample.m_bRequireReflection = false;
@ -270,7 +270,7 @@ cAudioManager::SetUpOneShotCollisionSound(cAudioCollision *col)
break;
}
m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency / 16);
m_sQueueSample.m_counter = counter++;
m_sQueueSample.m_nCounter = counter++;
if(counter >= 255) counter = 28;
m_sQueueSample.m_vecPos = col->m_vecPosition;
m_sQueueSample.m_bBankIndex = SAMPLEBANK_MAIN;
@ -282,7 +282,7 @@ cAudioManager::SetUpOneShotCollisionSound(cAudioCollision *col)
m_sQueueSample.m_nLoopEnd = -1;
m_sQueueSample.m_fSpeedMultiplier = 4.0f;
m_sQueueSample.m_fSoundIntensity = CollisionSoundIntensity;
m_sQueueSample.m_bReleasingSoundFlag = 1;
m_sQueueSample.m_bReleasingSoundFlag = true;
m_sQueueSample.m_bReverbFlag = true;
m_sQueueSample.m_bRequireReflection = false;
AddSampleToRequestedQueue();

File diff suppressed because it is too large Load diff

View file

@ -138,7 +138,7 @@ class tSound
{
public:
int32 m_nEntityIndex;
int32 m_counter;
int32 m_nCounter;
int32 m_nSampleIndex;
uint8 m_bBankIndex;
bool m_bIs2D;
@ -170,8 +170,8 @@ public:
bool m_bRequireReflection; // Used for oneshots
uint8 m_bOffset;
int32 m_nReleasingVolumeDivider;
uint8 m_bIsProcessed;
uint8 m_bLoopEnded;
bool m_bIsProcessed;
bool m_bLoopEnded;
uint8 field_82;
uint8 field_83;
int32 calculatedVolume;
@ -244,14 +244,14 @@ class cMissionAudio
{
public:
CVector m_vecPos;
uint8 field_12;
bool m_bPredefinedProperties;
uint8 gap_13[3];
int m_nSampleIndex;
uint8 m_bLoadingStatus;
uint8 m_bPlayStatus;
uint8 field_22;
uint8 field_23;
int field_24;
int32 m_nMissionAudioCounter;
bool m_bIsPlayed;
uint8 field_29;
uint8 field_30;
@ -328,7 +328,7 @@ public:
int32 m_nBridgeEntity;
cMissionAudio m_sMissionAudio;
int32 m_anRandomTable[5];
uint8 field_19192; // time?
uint8 m_bTimeSpent;
uint8 m_bUserPause;
uint8 m_bPreviousUserPause;
uint8 field_19195; // unused

View file

@ -125,7 +125,7 @@ void
cAudioManager::DoPoliceRadioCrackle()
{
m_sQueueSample.m_nEntityIndex = m_nPoliceChannelEntity;
m_sQueueSample.m_counter = 0;
m_sQueueSample.m_nCounter = 0;
m_sQueueSample.m_nSampleIndex = SFX_POLICE_RADIO_CRACKLE;
m_sQueueSample.m_bBankIndex = SAMPLEBANK_MAIN;
m_sQueueSample.m_bIs2D = true;
@ -136,7 +136,7 @@ cAudioManager::DoPoliceRadioCrackle()
m_sQueueSample.m_bEmittingVolume = m_sQueueSample.m_bVolume;
m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(SFX_POLICE_RADIO_CRACKLE);
m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(SFX_POLICE_RADIO_CRACKLE);
m_sQueueSample.m_bReleasingSoundFlag = 0;
m_sQueueSample.m_bReleasingSoundFlag = false;
m_sQueueSample.m_bReverbFlag = false;
m_sQueueSample.m_bOffset = 63;
m_sQueueSample.m_nReleasingVolumeDivider = 3;
@ -147,17 +147,20 @@ cAudioManager::DoPoliceRadioCrackle()
void
cAudioManager::ServicePoliceRadio()
{
int32 wantedLevel = 0; // bug?;
int32 wantedLevel = 0; // uninitialized variable
static uint32 nLastSeen = 300;
if (!m_bIsInitialised) return;
if(!m_bIsInitialised) return;
if (!m_bUserPause) {
if(!m_bUserPause) {
bool crimeReport = SetupCrimeReport();
#ifdef FIX_BUGS // Crash at 0x5fe6ef
if(!FindPlayerPed() || !FindPlayerPed()->m_pWanted) return;
#endif
wantedLevel = FindPlayerPed()->m_pWanted->m_nWantedLevel;
if (!crimeReport) {
if (wantedLevel) {
if (nLastSeen) {
if(!crimeReport) {
if(wantedLevel) {
if(nLastSeen) {
--nLastSeen;
} else {
nLastSeen = m_anRandomTable[1] % 1000 + 2000;

View file

@ -410,6 +410,8 @@ void CCrane::FindCarInSectorList(CPtrList* pList)
if (pVehicle->GetPosition().x < m_fPickupX1 || pVehicle->GetPosition().x > m_fPickupX2 ||
pVehicle->GetPosition().y < m_fPickupY1 || pVehicle->GetPosition().y > m_fPickupY2)
continue;
if (pVehicle->pDriver)
continue;
if (Abs(pVehicle->GetMoveSpeed().x) >= CAR_MOVING_SPEED_THRESHOLD ||
Abs(pVehicle->GetMoveSpeed().y) >= CAR_MOVING_SPEED_THRESHOLD ||
Abs(pVehicle->GetMoveSpeed().z) >= CAR_MOVING_SPEED_THRESHOLD)
@ -674,4 +676,4 @@ void CranesLoad(uint8* buf, uint32 size)
STARTPATCHES
InjectHook(0x5454D0, CranesLoad, PATCH_JUMP); // GenericLoad
ENDPATCHES
ENDPATCHES

View file

@ -111,7 +111,7 @@ CPickup::GiveUsAPickUpObject(int32 handle)
object->bUsesCollision = false;
object->bIsPickup = true;
object->field_172 = m_eModelIndex == MI_PICKUP_BONUS ? m_nQuantity : 0;
object->m_nBonusValue = m_eModelIndex == MI_PICKUP_BONUS ? m_nQuantity : 0;
switch (m_eType)
{
@ -671,9 +671,9 @@ void
CPickups::DoPickUpEffects(CEntity *entity)
{
if (entity->GetModelIndex() == MI_PICKUP_KILLFRENZY)
entity->m_flagD80 = CTheScripts::IsPlayerOnAMission() || CDarkel::FrenzyOnGoing() || !CGame::nastyGame;
entity->bDoNotRender = CTheScripts::IsPlayerOnAMission() || CDarkel::FrenzyOnGoing() || !CGame::nastyGame;
if (!entity->m_flagD80) {
if (!entity->bDoNotRender) {
float s = Sin((float)((CTimer::GetTimeInMilliseconds() + (uintptr)entity) & 0x7FF) * DEGTORAD(360.0f / 0x800));
float modifiedSin = 0.3f * (s + 1.0f);
@ -716,7 +716,7 @@ CPickups::DoPickUpEffects(CEntity *entity)
size, 65.0f, CCoronas::TYPE_RING, CCoronas::FLARE_NONE, CCoronas::REFLECTION_OFF, CCoronas::LOSCHECK_OFF, CCoronas::STREAK_OFF, 0.0f);
CObject *object = (CObject*)entity;
if (object->m_obj_flag2 || object->bOutOfStock || object->field_172) {
if (object->m_obj_flag2 || object->bOutOfStock || object->m_nBonusValue) {
float dist = (TheCamera.GetPosition() - pos).Magnitude();
const float MAXDIST = 12.0f;
@ -734,7 +734,7 @@ CPickups::DoPickUpEffects(CEntity *entity)
aMessages[NumMessages].m_color.blue = aWeaponBlues[colorId];
aMessages[NumMessages].m_color.alpha = (1.0f - dist / MAXDIST) * 128.0f;
aMessages[NumMessages].m_bOutOfStock = object->bOutOfStock;
aMessages[NumMessages].m_quantity = object->field_172;
aMessages[NumMessages].m_quantity = object->m_nBonusValue;
NumMessages++;
}
}

View file

@ -24,7 +24,7 @@ CDebug::DebugAddText(const char *str)
{
int32 i = 0;
if (*str != '\0') {
while (i < MAX_STR_LEN) {
while (i < MAX_STR_LEN - 1) {
ms_aTextBuffer[ms_nCurrentTextLine][i++] = *(str++);
if (*str == '\0')
break;

File diff suppressed because it is too large Load diff

View file

@ -7,28 +7,11 @@
#define MENUHEADER_WIDTH 0.84f
#define MENUHEADER_HEIGHT 1.6f
#define MENUACTION_X_MARGIN 40.0f
#define MENU_X_MARGIN 40.0f
#define MENUACTION_POS_Y 60.0f
#define MENUACTION_WIDTH 0.38f
#define MENUACTION_WIDTH 38.0f
#define MENUACTION_SCALE_MULT 0.9f
#define MENUCOLUMN_POS_X MENUHEADER_POS_X + 16.0f
#define MENUCOLUMN_MAX_Y 149.0f
#define MENUCOLUMN_MID_Y 100.0f
#define MENUCOLUMN_MIN_Y 110.0f
#define MENUCOLUMN_PAUSE_Y 25.0f
#define MENUCOLUMN_START_Y 9.0f
#define MENUCOLUMN_FEDS 139.0f
#define MENUCOLUMN_SAVE_X 121.0f
#define MENUCOLUMN_SAVE_Y 111.0f
#define MENUCOLUMN_SPACING_MAX 24.0f
#define MENUCOLUMN_SPACING_MIN 20.0f
#define MENUSELECT_BOX_MAX 20.5f
#define MENUSELECT_BOX_MIN 17.0f
#ifndef ASPECT_RATIO_SCALE
#define MENURADIO_ICON_X 31.5f
#else
@ -38,12 +21,13 @@
#define MENURADIO_ICON_W 60.0f
#define MENURADIO_ICON_H 60.0f
#define MENUDROP_COLOR_A 150
#define MENUDROP_COLOR_SIZE -1
#define MENUSLIDER_X 256.0f
#define MENUSLIDER_UNK 256.0f
#define BIGTEXT_X_SCALE 0.75f
#define BIGTEXT_Y_SCALE 0.9f
#define MEDIUMTEXT_X_SCALE 0.55f
#define MEDIUMTEXT_Y_SCALE 0.8f
#define SMALLTEXT_X_SCALE 0.45f
#define SMALLTEXT_Y_SCALE 0.7f
#define SMALLESTTEXT_X_SCALE 0.4f
@ -67,6 +51,33 @@
#define PLAYERSETUP_LIST_BODY_TOP 47
#define PLAYERSETUP_ROW_HEIGHT 9
#define STATS_SLIDE_Y_PER_SECOND 30.0f
#define STATS_ROW_HEIGHT 20.0f
#define STATS_ROW_X_MARGIN 50.0f
#define STATS_BOTTOM_MARGIN 135.0f
#define STATS_TOP_MARGIN 40.0f
#define STATS_TOP_DIMMING_AREA_LENGTH (93.0f - STATS_TOP_MARGIN)
#define STATS_BOTTOM_DIMMING_AREA_LENGTH 55.0f
#define STATS_PUT_BACK_TO_BOTTOM_Y 50.0f
#define STATS_RATING_X 24.0f
#define STATS_RATING_Y 20.0f
#define CONTSETUP_STANDARD_ROW_HEIGHT 10.7f
#define CONTSETUP_CLASSIC_ROW_HEIGHT 9.0f
#define CONTSETUP_BOUND_HIGHLIGHT_HEIGHT 10
#define CONTSETUP_BOUND_COLUMN_WIDTH 190.0f
#define CONTSETUP_LIST_HEADER_HEIGHT 20.0f
#define CONTSETUP_LIST_TOP 28.0f
#define CONTSETUP_LIST_RIGHT 18.0f
#define CONTSETUP_LIST_BOTTOM 120.0f
#define CONTSETUP_LIST_LEFT 18.0f
#define CONTSETUP_COLUMN_1_X 40.0f
#define CONTSETUP_COLUMN_2_X 210.0f
#define CONTSETUP_COLUMN_3_X (CONTSETUP_COLUMN_2_X + CONTSETUP_BOUND_COLUMN_WIDTH + 10.0f)
#define CONTSETUP_BACK_RIGHT 35.0f
#define CONTSETUP_BACK_BOTTOM 122.0f
#define CONTSETUP_BACK_HEIGHT 25.0f
enum eLanguages
{
LANGUAGE_AMERICAN,
@ -185,19 +196,19 @@ enum eMenuScreen
MENUPAGE_NEW_GAME_RELOAD = 10,
MENUPAGE_LOAD_SLOT_CONFIRM = 11,
MENUPAGE_DELETE_SLOT_CONFIRM = 12,
MENUPAGE_13 = 13,
MENUPAGE_NO_MEMORY_CARD = 13,
MENUPAGE_LOADING_IN_PROGRESS = 14,
MENUPAGE_DELETING_IN_PROGRESS = 15,
MENUPAGE_16 = 16,
MENUPAGE_PS2_LOAD_FAILED = 16,
MENUPAGE_DELETE_FAILED = 17,
MENUPAGE_DEBUG_MENU = 18,
MENUPAGE_MEMORY_CARD_1 = 19,
MENUPAGE_MEMORY_CARD_2 = 20,
MENUPAGE_MEMORY_CARD_DEBUG = 19,
MENUPAGE_MEMORY_CARD_TEST = 20,
MENUPAGE_MULTIPLAYER_MAIN = 21,
MENUPAGE_SAVE_FAILED_1 = 22,
MENUPAGE_SAVE_FAILED_2 = 23,
MENUPAGE_PS2_SAVE_FAILED = 22,
MENUPAGE_PS2_SAVE_FAILED_2 = 23,
MENUPAGE_SAVE = 24,
MENUPAGE_NO_MEMORY_CARD = 25,
MENUPAGE_NO_MEMORY_CARD_2 = 25,
MENUPAGE_CHOOSE_SAVE_SLOT = 26,
MENUPAGE_SAVE_OVERWRITE_CONFIRM = 27,
MENUPAGE_MULTIPLAYER_MAP = 28,
@ -438,7 +449,7 @@ struct BottomBarOption
struct CMenuScreen
{
char m_ScreenName[8];
int32 unk;
int32 unk; // 2 on MENUPAGE_MULTIPLAYER_START, 1 on everywhere else
int32 m_PreviousPage[2]; // eMenuScreen
int32 m_ParentEntry[2]; // row
@ -544,11 +555,12 @@ public:
static bool &m_bShutDownFrontEndRequested;
static bool &m_PrefsAllowNastyGame;
static float &menuXYpadding;
static float &actionTextScaleX;
static float &actionTextScaleY;
static int32 &sthWithButtons;
static int32 &sthWithButtons2;
static uint8 m_PrefsStereoMono;
static int32 m_SelectedMap;
static int32 m_SelectedGameType;
static uint8 m_PrefsPlayerRed;
static uint8 m_PrefsPlayerGreen;
static uint8 m_PrefsPlayerBlue;
#ifndef MASTER
static bool m_PrefsMarketing;
@ -557,6 +569,7 @@ public:
#ifdef MENU_MAP
static bool bMenuMapActive;
static bool bMapMouseShownOnce;
static float fMapSize;
static float fMapCenterY;
static float fMapCenterX;
@ -565,9 +578,9 @@ public:
#endif
public:
static void BuildStatLine(char *text, void *stat, uint8 aFloat, void *stat2);
static void BuildStatLine(char *text, void *stat, bool itsFloat, void *stat2);
static void CentreMousePointer();
int CheckCodesForControls(int32);
void CheckCodesForControls(int);
bool CheckHover(int x1, int x2, int y1, int y2);
void CheckSliderMovement(int);
int CostructStatLine(int);
@ -585,13 +598,13 @@ public:
#endif
void DrawPlayerSetupScreen();
int FadeIn(int alpha);
void FilterOutColorMarkersFromString(uint16, CRGBA &);
void FilterOutColorMarkersFromString(wchar*, CRGBA &);
int GetStartOptionsCntrlConfigScreens();
static void InitialiseChangedLanguageSettings();
void LoadAllTextures();
void LoadSettings();
static void MessageScreen(char *);
static void PickNewPlayerColour();
void MessageScreen(const char *);
void PickNewPlayerColour();
void PrintBriefs();
static void PrintErrorMessage();
void PrintStats();
@ -612,6 +625,7 @@ public:
void WaitForUserCD();
void PrintController();
int GetNumOptionsCntrlConfigScreens();
int ConstructStatLine(int);
// New (not in function or inlined in the game)
void ThingsToDoBeforeLeavingPage();

View file

@ -1,22 +1,22 @@
#pragma once
// There are some missing/wrong entries in here.
// TODO: There are some missing/wrong entries in here.
const CMenuScreen aScreens[] = {
// MENUPAGE_NONE = 0
{ "", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0, },
{ "", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0, },
// MENUPAGE_STATS = 1 - Both PrintStats and Draw were printing the page name, so deleted the string Draw looked for.
// MENUPAGE_STATS = 1
#ifdef MENU_MAP
{ ""/*"FET_STA"*/, MENUPAGE_NONE, MENUPAGE_NONE, MENUPAGE_NONE, 5, 3,
{ "FET_STA", 1, MENUPAGE_NONE, MENUPAGE_NONE, 5, 3,
#else
{ ""/*"FET_STA"*/, MENUPAGE_NONE, MENUPAGE_NONE, MENUPAGE_NONE, 5, 2,
{ "FET_STA", 1, MENUPAGE_NONE, MENUPAGE_NONE, 5, 2,
#endif
MENUACTION_CHANGEMENU, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE,
},
// MENUPAGE_NEW_GAME = 2
{ "FET_SGA", MENUPAGE_NONE, MENUPAGE_NONE, MENUPAGE_NONE, 0, 1,
{ "FET_SGA", 1, MENUPAGE_NONE, MENUPAGE_NONE, 0, 1,
MENUACTION_CHANGEMENU, "FES_SNG", SAVESLOT_NONE, MENUPAGE_NEW_GAME_RELOAD,
MENUACTION_POPULATESLOTS_CHANGEMENU, "GMLOAD", SAVESLOT_NONE, MENUPAGE_CHOOSE_LOAD_SLOT,
MENUACTION_POPULATESLOTS_CHANGEMENU, "FES_DGA", SAVESLOT_NONE, MENUPAGE_CHOOSE_DELETE_SLOT,
@ -25,15 +25,15 @@ const CMenuScreen aScreens[] = {
// MENUPAGE_BRIEFS = 3
#ifdef MENU_MAP
{ "FET_BRE", MENUPAGE_NONE, MENUPAGE_NONE, MENUPAGE_NONE, 6, 4,
{ "FET_BRE", 1, MENUPAGE_NONE, MENUPAGE_NONE, 6, 4,
#else
{ "FET_BRE", MENUPAGE_NONE, MENUPAGE_NONE, MENUPAGE_NONE, 6, 3,
{ "FET_BRE", 1, MENUPAGE_NONE, MENUPAGE_NONE, 6, 3,
#endif
MENUACTION_CHANGEMENU, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE,
},
// MENU_CONTROLLER_SETTINGS = 4
{ "FET_CON", MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, 0, 0,
{ "FET_CON", 1, MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, 0, 0,
MENUACTION_CTRLCONFIG, "FEC_CCF", SAVESLOT_NONE, MENUPAGE_CONTROLLER_SETTINGS,
MENUACTION_CTRLDISPLAY, "FEC_CDP", SAVESLOT_NONE, MENUPAGE_CONTROLLER_SETTINGS,
MENUACTION_CTRLVIBRATION, "FEC_VIB", SAVESLOT_NONE, MENUPAGE_CONTROLLER_SETTINGS,
@ -41,7 +41,7 @@ const CMenuScreen aScreens[] = {
},
// MENUPAGE_SOUND_SETTINGS = 5
{ "FET_AUD", MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, 1, 1,
{ "FET_AUD", 1, MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, 1, 1,
MENUACTION_MUSICVOLUME, "FEA_MUS", SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS,
MENUACTION_SFXVOLUME, "FEA_SFX", SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS,
MENUACTION_AUDIOHW, "FEA_3DH", SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS,
@ -53,7 +53,7 @@ const CMenuScreen aScreens[] = {
},
// MENUPAGE_GRAPHICS_SETTINGS = 6
{ "FET_DIS", MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, 2, 2,
{ "FET_DIS", 1, MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, 2, 2,
MENUACTION_BRIGHTNESS, "FED_BRI", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS,
MENUACTION_DRAWDIST, "FEM_LOD", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS,
MENUACTION_FRAMESYNC, "FEM_VSC", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS,
@ -67,7 +67,7 @@ const CMenuScreen aScreens[] = {
},
// MENUPAGE_LANGUAGE_SETTINGS = 7
{ "FET_LAN", MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, 3, 3,
{ "FET_LAN", 1, MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, 3, 3,
MENUACTION_LANG_ENG, "FEL_ENG", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_LANG_FRE, "FEL_FRE", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_LANG_GER, "FEL_GER", SAVESLOT_NONE, MENUPAGE_NONE,
@ -80,7 +80,7 @@ const CMenuScreen aScreens[] = {
},
// MENUPAGE_CHOOSE_LOAD_SLOT = 8
{ "FET_LG", MENUPAGE_NEW_GAME, MENUPAGE_NEW_GAME, MENUPAGE_NEW_GAME, 1, 1,
{ "FET_LG", 1, MENUPAGE_NEW_GAME, MENUPAGE_NEW_GAME, 1, 1,
MENUACTION_CHANGEMENU, "FESZ_CA", SAVESLOT_NONE, MENUPAGE_NEW_GAME,
MENUACTION_CHECKSAVE, "FEM_SL1", SAVESLOT_1, MENUPAGE_LOAD_SLOT_CONFIRM,
MENUACTION_CHECKSAVE, "FEM_SL2", SAVESLOT_2, MENUPAGE_LOAD_SLOT_CONFIRM,
@ -93,7 +93,7 @@ const CMenuScreen aScreens[] = {
},
// MENUPAGE_CHOOSE_DELETE_SLOT = 9
{ "FET_DG", MENUPAGE_NEW_GAME, MENUPAGE_NEW_GAME, MENUPAGE_NEW_GAME, 2, 2,
{ "FET_DG", 1, MENUPAGE_NEW_GAME, MENUPAGE_NEW_GAME, 2, 2,
MENUACTION_CHANGEMENU, "FESZ_CA", SAVESLOT_NONE, MENUPAGE_NEW_GAME,
MENUACTION_CHECKSAVE, "FEM_SL1", SAVESLOT_1, MENUPAGE_DELETE_SLOT_CONFIRM,
MENUACTION_CHECKSAVE, "FEM_SL2", SAVESLOT_2, MENUPAGE_DELETE_SLOT_CONFIRM,
@ -106,104 +106,123 @@ const CMenuScreen aScreens[] = {
},
// MENUPAGE_NEW_GAME_RELOAD = 10
{ "FET_NG", MENUPAGE_NEW_GAME, MENUPAGE_NEW_GAME, MENUPAGE_NEW_GAME, 0, 0,
{ "FET_NG", 1, MENUPAGE_NEW_GAME, MENUPAGE_NEW_GAME, 0, 0,
MENUACTION_LABEL, "FESZ_QR", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_CHANGEMENU, "FEM_NO", SAVESLOT_NONE, MENUPAGE_NEW_GAME,
MENUACTION_NEWGAME, "FEM_YES", SAVESLOT_NONE, MENUPAGE_NEW_GAME_RELOAD,
},
// MENUPAGE_LOAD_SLOT_CONFIRM = 11
{ "FET_LG", MENUPAGE_CHOOSE_LOAD_SLOT, MENUPAGE_CHOOSE_LOAD_SLOT, MENUPAGE_CHOOSE_LOAD_SLOT, 0, 0,
{ "FET_LG", 1, MENUPAGE_CHOOSE_LOAD_SLOT, MENUPAGE_CHOOSE_LOAD_SLOT, 0, 0,
MENUACTION_LABEL, "FESZ_QL", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_CHANGEMENU, "FEM_NO", SAVESLOT_NONE, MENUPAGE_CHOOSE_LOAD_SLOT,
MENUACTION_CHANGEMENU, "FEM_YES", SAVESLOT_NONE, MENUPAGE_LOADING_IN_PROGRESS,
},
// MENUPAGE_DELETE_SLOT_CONFIRM = 12
{ "FET_DG", MENUPAGE_CHOOSE_DELETE_SLOT, MENUPAGE_CHOOSE_DELETE_SLOT, MENUPAGE_CHOOSE_DELETE_SLOT, 0, 0,
{ "FET_DG", 1, MENUPAGE_CHOOSE_DELETE_SLOT, MENUPAGE_CHOOSE_DELETE_SLOT, 0, 0,
MENUACTION_LABEL, "FESZ_QD", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_CHANGEMENU, "FEM_NO", SAVESLOT_NONE, MENUPAGE_CHOOSE_DELETE_SLOT,
MENUACTION_CHANGEMENU, "FEM_YES", SAVESLOT_NONE, MENUPAGE_DELETING,
},
// MENUPAGE_13 = 13
{ "FES_NOC", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
// MENUPAGE_NO_MEMORY_CARD = 13
{ "FES_NOC", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
MENUACTION_LABEL, "FEC_OFI", SAVESLOT_NONE, MENUPAGE_NONE, // only in mobile. FEC_OFI is missing
},
// MENUPAGE_LOADING_IN_PROGRESS = 14
{ "FET_LG", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
{ "FET_LG", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
MENUACTION_LABEL, "FED_LDW", SAVESLOT_NONE, MENUPAGE_LOAD_SLOT_CONFIRM,
},
// MENUPAGE_DELETING_IN_PROGRESS = 15
{ "FET_DG", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
{ "FET_DG", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
MENUACTION_LABEL, "FEDL_WR", SAVESLOT_NONE, MENUPAGE_NONE,
},
// MENUPAGE_16 = 16
{ "FET_LG", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
// MENUPAGE_PS2_LOAD_FAILED = 16
{ "FET_LG", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
MENUACTION_LABEL, "FES_LOE", SAVESLOT_NONE, MENUPAGE_NONE,
},
// MENUPAGE_DELETE_FAILED = 17
{ "FET_DG", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
{ "FET_DG", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
MENUACTION_LABEL, "FES_DEE", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_CHANGEMENU, "FEC_OKK", SAVESLOT_NONE, MENUPAGE_CHOOSE_DELETE_SLOT,
},
// MENUPAGE_DEBUG_MENU = 18
{ "FED_DBG", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
{ "FED_DBG", 1, MENUPAGE_NONE, MENUPAGE_NONE, 4, 0,
MENUACTION_RELOADIDE, "FED_RID", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_RELOADIPL, "FED_RIP", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_SETDBGFLAG, "FED_DFL", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_SWITCHBIGWHITEDEBUGLIGHT, "FED_DLS", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_PEDROADGROUPS, "FED_SPR", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_CARROADGROUPS, "FED_SCR", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_COLLISIONPOLYS, "FED_SCP", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_PARSEHEAP, "FED_PAH", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_SHOWCULL, "FED_SCZ", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_DEBUGSTREAM, "FED_DSR", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_CHANGEMENU, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE,
},
// MENUPAGE_MEMORY_CARD_1 = 19
{ "FEM_MCM", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
// MENUPAGE_MEMORY_CARD_DEBUG = 19
{ "FEM_MCM", 1, MENUPAGE_NONE, MENUPAGE_NONE, 7, 0,
MENUACTION_REGMEMCARD1, "FEM_RMC", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_TESTFORMATMEMCARD1, "FEM_TFM", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_TESTUNFORMATMEMCARD1, "FEM_TUM", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_CREATEROOTDIR, "FEM_CRD", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_CREATELOADICONS, "FEM_CLI", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_FILLWITHGUFF, "FEM_FFF", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_SAVEONLYTHEGAME, "FEM_SOG", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_SAVEGAME, "FEM_STG", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_SAVEGAMEUNDERGTA, "FEM_STS", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_CREATECOPYPROTECTED, "FEM_CPD", SAVESLOT_NONE, MENUPAGE_NONE,
},
// MENUPAGE_MEMORY_CARD_2 = 20
{ "FEM_MC2", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
// MENUPAGE_MEMORY_CARD_TEST = 20
{ "FEM_MC2", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
},
// MENUPAGE_MULTIPLAYER_MAIN = 21
{ "FET_MP", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
{ "FET_MP", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
},
// MENUPAGE_SAVE_FAILED_1 = 22
{ "MCDNSP", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
// MENUPAGE_PS2_SAVE_FAILED = 22
{ "MCDNSP", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
MENUACTION_MEMCARDSAVECONFIRM, "JAILB_U", SAVESLOT_NONE, MENUPAGE_NONE,
},
// MENUPAGE_SAVE_FAILED_2 = 23
{ "MCGNSP", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
// MENUPAGE_PS2_SAVE_FAILED_2 = 23
{ "MCGNSP", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
MENUACTION_MEMCARDSAVECONFIRM, "JAILB_U", SAVESLOT_NONE, MENUPAGE_NONE,
},
// Unused in PC but anyway
// MENUPAGE_SAVE = 24
#ifdef PS2_SAVE_DIALOG
{ "FET_SG", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
{ "FET_SG", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
MENUACTION_CHANGEMENU, "FESZ_SA", SAVESLOT_NONE, MENUPAGE_CHOOSE_SAVE_SLOT,
MENUACTION_RESUME_FROM_SAVEZONE, "FESZ_CA", SAVESLOT_NONE, MENUPAGE_NONE,
},
#else
{ "FET_SG", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
{ "FET_SG", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
MENUACTION_LABEL, "FES_SCG", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_POPULATESLOTS_CHANGEMENU, "GMSAVE", SAVESLOT_NONE, MENUPAGE_CHOOSE_SAVE_SLOT,
MENUACTION_RESUME_FROM_SAVEZONE, "FESZ_CA", SAVESLOT_NONE, MENUPAGE_NONE,
},
#endif
// MENUPAGE_NO_MEMORY_CARD = 25
{ "FES_NOC", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
// MENUPAGE_NO_MEMORY_CARD_2 = 25
{ "FES_NOC", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
MENUACTION_CHANGEMENU, "FESZ_CA", SAVESLOT_NONE, MENUPAGE_NONE,
},
// MENUPAGE_CHOOSE_SAVE_SLOT = 26
{ "FET_SG", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
{ "FET_SG", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
MENUACTION_RESUME_FROM_SAVEZONE, "FESZ_CA", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_CHANGEMENU, "FEM_SL1", SAVESLOT_1, MENUPAGE_SAVE_OVERWRITE_CONFIRM,
MENUACTION_CHANGEMENU, "FEM_SL2", SAVESLOT_2, MENUPAGE_SAVE_OVERWRITE_CONFIRM,
@ -216,49 +235,49 @@ const CMenuScreen aScreens[] = {
},
// MENUPAGE_SAVE_OVERWRITE_CONFIRM = 27
{ "FET_SG", MENUPAGE_CHOOSE_SAVE_SLOT, MENUPAGE_CHOOSE_SAVE_SLOT, MENUPAGE_CHOOSE_SAVE_SLOT, 0, 0,
{ "FET_SG", 1, MENUPAGE_CHOOSE_SAVE_SLOT, MENUPAGE_CHOOSE_SAVE_SLOT, 0, 0,
MENUACTION_LABEL, "FESZ_QO", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_CHANGEMENU, "FEM_YES", SAVESLOT_NONE, MENUPAGE_SAVING_IN_PROGRESS,
MENUACTION_CHANGEMENU, "FEM_NO", SAVESLOT_NONE, MENUPAGE_CHOOSE_SAVE_SLOT,
},
// MENUPAGE_MULTIPLAYER_MAP = 28
{ "FET_MAP", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
{ "FET_MAP", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
},
// MENUPAGE_MULTIPLAYER_CONNECTION = 29
{ "FET_CON", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
{ "FET_CON", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
},
// MENUPAGE_MULTIPLAYER_FIND_GAME = 30
{ "FET_FG", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
{ "FET_FG", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
},
// MENUPAGE_MULTIPLAYER_MODE = 31
{ "FET_GT", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
{ "FET_GT", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
},
// MENUPAGE_MULTIPLAYER_CREATE = 32
{ "FET_HG", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
{ "FET_HG", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
},
// MENUPAGE_MULTIPLAYER_START = 33
{ "FEN_STA", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
{ "FEN_STA", 2, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
},
// MENUPAGE_SKIN_SELECT_OLD = 34
{ "FET_PS", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
{ "FET_PS", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
},
// MENUPAGE_CONTROLLER_PC = 35
{ "FET_CTL", MENUPAGE_DISABLED, MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, 0, 0,
{ "FET_CTL", 1, MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, 0, 0,
MENUACTION_CTRLMETHOD, "FET_CME", SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC,
MENUACTION_CHANGEMENU, "FET_RDK", SAVESLOT_NONE, MENUPAGE_KEYBOARD_CONTROLS,
MENUACTION_CHANGEMENU, "FET_AMS", SAVESLOT_NONE, MENUPAGE_MOUSE_CONTROLS,
@ -268,7 +287,7 @@ const CMenuScreen aScreens[] = {
},
// MENUPAGE_CONTROLLER_PC_OLD1 = 36
{ "FET_CTL", MENUPAGE_DISABLED, MENUPAGE_CONTROLLER_PC, MENUPAGE_CONTROLLER_PC, 0, 0,
{ "FET_CTL", 1, MENUPAGE_CONTROLLER_PC, MENUPAGE_CONTROLLER_PC, 0, 0,
MENUACTION_GETKEY, "FEC_PLB", SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD1,
MENUACTION_GETKEY, "FEC_CWL", SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD1,
MENUACTION_GETKEY, "FEC_CWR", SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD1,
@ -282,12 +301,12 @@ const CMenuScreen aScreens[] = {
},
// MENUPAGE_CONTROLLER_PC_OLD2 = 37
{ "FET_CTL", MENUPAGE_DISABLED, MENUPAGE_CONTROLLER_PC, MENUPAGE_CONTROLLER_PC, 1, 1,
{ "FET_CTL", 1, MENUPAGE_CONTROLLER_PC, MENUPAGE_CONTROLLER_PC, 1, 1,
},
// MENUPAGE_CONTROLLER_PC_OLD3 = 38
{ "FET_CTL", MENUPAGE_DISABLED, MENUPAGE_CONTROLLER_PC, MENUPAGE_CONTROLLER_PC, 2, 2,
{ "FET_CTL", 1, MENUPAGE_CONTROLLER_PC, MENUPAGE_CONTROLLER_PC, 2, 2,
MENUACTION_GETKEY, "FEC_LUP", SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD3,
MENUACTION_GETKEY, "FEC_LDN", SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD3,
MENUACTION_GETKEY, "FEC_SMS", SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC_OLD3,
@ -296,20 +315,24 @@ const CMenuScreen aScreens[] = {
},
// MENUPAGE_CONTROLLER_PC_OLD4 = 39
{ "FET_CTL", MENUPAGE_DISABLED, MENUPAGE_CONTROLLER_PC, MENUPAGE_CONTROLLER_PC, 3, 3,
{ "FET_CTL", 1, MENUPAGE_CONTROLLER_PC, MENUPAGE_CONTROLLER_PC, 3, 3,
},
// MENUPAGE_CONTROLLER_DEBUG = 40
{ "FEC_DBG", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
{ "FEC_DBG", 1, MENUPAGE_CONTROLLER_PC, MENUPAGE_CONTROLLER_PC, 3, 3,
MENUACTION_GETKEY, "FEC_TGD", SAVESLOT_NONE, MENUPAGE_CONTROLLER_DEBUG,
MENUACTION_GETKEY, "FEC_TDO", SAVESLOT_NONE, MENUPAGE_CONTROLLER_DEBUG,
MENUACTION_GETKEY, "FEC_TSS", SAVESLOT_NONE, MENUPAGE_CONTROLLER_DEBUG,
MENUACTION_GETKEY, "FEC_SMS", SAVESLOT_NONE, MENUPAGE_CONTROLLER_DEBUG,
MENUACTION_CHANGEMENU, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE,
},
// MENUPAGE_OPTIONS = 41
#ifdef MENU_MAP
{ "FET_OPT", MENUPAGE_NONE, MENUPAGE_NONE, MENUPAGE_NONE, 1, 5,
{ "FET_OPT", 1, MENUPAGE_NONE, MENUPAGE_NONE, 1, 5,
#else
{ "FET_OPT", MENUPAGE_NONE, MENUPAGE_NONE, MENUPAGE_NONE, 1, 4,
{ "FET_OPT", 1, MENUPAGE_NONE, MENUPAGE_NONE, 1, 4,
#endif
MENUACTION_CHANGEMENU, "FET_CTL", SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC,
MENUACTION_LOADRADIO, "FET_AUD", SAVESLOT_NONE, MENUPAGE_SOUND_SETTINGS,
@ -321,9 +344,9 @@ const CMenuScreen aScreens[] = {
// MENUPAGE_EXIT = 42
#ifdef MENU_MAP
{ "FET_QG", MENUPAGE_NONE, MENUPAGE_NONE, MENUPAGE_NONE, 2, 6,
{ "FET_QG", 1, MENUPAGE_NONE, MENUPAGE_NONE, 2, 6,
#else
{ "FET_QG", MENUPAGE_NONE, MENUPAGE_NONE, MENUPAGE_NONE, 2, 5,
{ "FET_QG", 1, MENUPAGE_NONE, MENUPAGE_NONE, 2, 5,
#endif
MENUACTION_LABEL, "FEQ_SRE", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_CHANGEMENU, "FEM_NO", SAVESLOT_NONE, MENUPAGE_NONE,
@ -331,58 +354,58 @@ const CMenuScreen aScreens[] = {
},
// MENUPAGE_SAVING_IN_PROGRESS = 43
{ "", MENUPAGE_CHOOSE_SAVE_SLOT, MENUPAGE_CHOOSE_SAVE_SLOT, MENUPAGE_CHOOSE_SAVE_SLOT, 0, 0,
{ "", 1, MENUPAGE_CHOOSE_SAVE_SLOT, MENUPAGE_CHOOSE_SAVE_SLOT, 0, 0,
MENUACTION_LABEL, "FES_WAR", SAVESLOT_NONE, MENUPAGE_NONE,
},
// MENUPAGE_SAVE_SUCCESSFUL = 44
{ "FET_SG", MENUPAGE_CHOOSE_SAVE_SLOT, MENUPAGE_CHOOSE_SAVE_SLOT, MENUPAGE_CHOOSE_SAVE_SLOT, 0, 0,
{ "FET_SG", 1, MENUPAGE_CHOOSE_SAVE_SLOT, MENUPAGE_CHOOSE_SAVE_SLOT, 0, 0,
MENUACTION_LABEL, "FES_SSC", SAVESLOT_LABEL, MENUPAGE_NONE,
MENUACTION_RESUME_FROM_SAVEZONE, "FEC_OKK", SAVESLOT_NONE, MENUPAGE_CHOOSE_SAVE_SLOT,
},
// MENUPAGE_DELETING = 45
{ "FET_DG", MENUPAGE_CHOOSE_DELETE_SLOT, MENUPAGE_CHOOSE_DELETE_SLOT, MENUPAGE_CHOOSE_DELETE_SLOT, 0, 0,
{ "FET_DG", 1, MENUPAGE_CHOOSE_DELETE_SLOT, MENUPAGE_CHOOSE_DELETE_SLOT, 0, 0,
MENUACTION_LABEL, "FED_DLW", SAVESLOT_NONE, MENUPAGE_NONE,
},
// MENUPAGE_DELETE_SUCCESS = 46
{ "FET_DG", MENUPAGE_CHOOSE_DELETE_SLOT, MENUPAGE_CHOOSE_DELETE_SLOT, MENUPAGE_CHOOSE_DELETE_SLOT, 0, 0,
{ "FET_DG", 1, MENUPAGE_CHOOSE_DELETE_SLOT, MENUPAGE_CHOOSE_DELETE_SLOT, 0, 0,
MENUACTION_LABEL, "DEL_FNM", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_CHANGEMENU, "FEC_OKK", SAVESLOT_NONE, MENUPAGE_CHOOSE_DELETE_SLOT,
},
// MENUPAGE_SAVE_FAILED = 47
{ "FET_SG", MENUPAGE_CHOOSE_SAVE_SLOT, MENUPAGE_CHOOSE_SAVE_SLOT, MENUPAGE_CHOOSE_SAVE_SLOT, 0, 0,
{ "FET_SG", 1, MENUPAGE_CHOOSE_SAVE_SLOT, MENUPAGE_CHOOSE_SAVE_SLOT, 0, 0,
MENUACTION_LABEL, "FEC_SVU", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_CHANGEMENU, "FEC_OKK", SAVESLOT_NONE, MENUPAGE_CHOOSE_SAVE_SLOT,
},
// MENUPAGE_LOAD_FAILED = 48
{ "FET_SG", MENUPAGE_CHOOSE_SAVE_SLOT, MENUPAGE_CHOOSE_SAVE_SLOT, MENUPAGE_CHOOSE_SAVE_SLOT, 0, 0,
{ "FET_SG", 1, MENUPAGE_CHOOSE_SAVE_SLOT, MENUPAGE_CHOOSE_SAVE_SLOT, 0, 0,
MENUACTION_LABEL, "FEC_SVU", SAVESLOT_NONE, MENUPAGE_NONE,
},
// MENUPAGE_LOAD_FAILED_2 = 49
{ "FET_LG", MENUPAGE_CHOOSE_SAVE_SLOT, MENUPAGE_CHOOSE_SAVE_SLOT, MENUPAGE_CHOOSE_SAVE_SLOT, 0, 0,
{ "FET_LG", 1, MENUPAGE_CHOOSE_SAVE_SLOT, MENUPAGE_CHOOSE_SAVE_SLOT, 0, 0,
MENUACTION_LABEL, "FEC_LUN", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_CHANGEMENU, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_CHOOSE_LOAD_SLOT,
},
// MENUPAGE_FILTER_GAME = 50
{ "FIL_FLT", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
{ "FIL_FLT", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
},
// MENUPAGE_START_MENU = 51
{ "FEM_MM", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
{ "FEM_MM", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
MENUACTION_CHANGEMENU, "FEN_STA", SAVESLOT_NONE, MENUPAGE_NEW_GAME,
MENUACTION_CHANGEMENU, "FET_OPT", SAVESLOT_NONE, MENUPAGE_OPTIONS,
MENUACTION_CHANGEMENU, "FEM_QT", SAVESLOT_NONE, MENUPAGE_EXIT,
},
// MENUPAGE_PAUSE_MENU = 52
{ "FET_PAU", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
{ "FET_PAU", 1, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
MENUACTION_RESUME, "FEM_RES", SAVESLOT_NONE, MENUPAGE_NONE,
MENUACTION_CHANGEMENU, "FEN_STA", SAVESLOT_NONE, MENUPAGE_NEW_GAME,
#ifdef MENU_MAP
@ -395,22 +418,24 @@ const CMenuScreen aScreens[] = {
},
// MENUPAGE_CHOOSE_MODE = 53
{ "FEN_STA", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
{ "FEN_STA", 1, MENUPAGE_NONE, MENUPAGE_NONE, 0, 1,
MENUACTION_CHANGEMENU, "FET_SP", SAVESLOT_NONE, MENUPAGE_NEW_GAME,
MENUACTION_INITMP, "FET_MP", SAVESLOT_NONE, MENUPAGE_MULTIPLAYER_MAIN,
MENUACTION_CHANGEMENU, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE,
},
// MENUPAGE_SKIN_SELECT = 54
{ "FET_PSU", MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, 4, 4,
MENUACTION_CHANGEMENU, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_MULTIPLAYER_MAIN,
{ "FET_PSU", 1, MENUPAGE_OPTIONS, MENUPAGE_OPTIONS, 4, 4,
MENUACTION_CHANGEMENU, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_MULTIPLAYER_MAIN,
},
// MENUPAGE_KEYBOARD_CONTROLS = 55
{ "FET_STI", MENUPAGE_CONTROLLER_PC, MENUPAGE_CONTROLLER_PC, MENUPAGE_CONTROLLER_PC, 1, 1,
MENUACTION_CHANGEMENU, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC,
{ "FET_STI", 1, MENUPAGE_CONTROLLER_PC, MENUPAGE_CONTROLLER_PC, 1, 1,
MENUACTION_CHANGEMENU, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_CONTROLLER_PC,
},
// MENUPAGE_MOUSE_CONTROLS = 56
{ "FET_MTI", MENUPAGE_CONTROLLER_PC, MENUPAGE_CONTROLLER_PC, MENUPAGE_CONTROLLER_PC, 2, 2,
{ "FET_MTI", 1, MENUPAGE_CONTROLLER_PC, MENUPAGE_CONTROLLER_PC, 2, 2,
MENUACTION_MOUSESENS, "FEC_MSH", SAVESLOT_NONE, MENUPAGE_MOUSE_CONTROLS,
MENUACTION_INVVERT, "FEC_IVV", SAVESLOT_NONE, MENUPAGE_MOUSE_CONTROLS,
MENUACTION_MOUSESTEER, "FET_MST", SAVESLOT_NONE, MENUPAGE_MOUSE_CONTROLS,
@ -418,18 +443,18 @@ const CMenuScreen aScreens[] = {
},
// MENUPAGE_57 = 57
{ "", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
{ "", 0, MENUPAGE_NONE, MENUPAGE_NONE, 0, 0,
},
// MENUPAGE_58 = 58
{ "", MENUPAGE_DISABLED, MENUPAGE_DISABLED, MENUPAGE_DISABLED, 0, 0,
{ "", 0, MENUPAGE_NONE, MENUPAGE_NONE, 0, 0,
},
#ifdef MENU_MAP
// MENUPAGE_MAP = 59
{ "FEG_MAP", MENUPAGE_NONE, MENUPAGE_NONE, MENUPAGE_NONE, 5, 2,
{ "FEG_MAP", 1, MENUPAGE_NONE, MENUPAGE_NONE, 5, 2,
},
#endif
};

View file

@ -1412,8 +1412,8 @@ CRadar::DrawYouAreHereSprite(float x, float y)
}
} else {
if (CTimer::GetTimeInMillisecondsPauseMode() - lastChange > 200) {
lastChange = CTimer::GetTimeInMillisecondsPauseMode();
show = !show;
lastChange = CTimer::GetTimeInMillisecondsPauseMode();
show = !show;
}
}
@ -1422,7 +1422,7 @@ CRadar::DrawYouAreHereSprite(float x, float y)
float top = y - SCREEN_SCALE_Y(2.0f);
float right = SCREEN_SCALE_X(12.0) + x;
float bottom = y - SCREEN_SCALE_Y(26.0f);
CentreSprite.Draw(CRect(left, top, right, bottom), CRGBA(255, 217, 106, 255));
CentreSprite.Draw(CRect(left, top, right, bottom), CRGBA(255, 255, 255, 255));
}
MapLegendList[MapLegendCounter++] = RADAR_SPRITE_CENTRE;
}
@ -1503,4 +1503,4 @@ STARTPATCHES
InjectHook(0x4A6F30, CRadar::LoadAllRadarBlips, PATCH_JUMP);
//InjectHook(0x4A7000, `global constructor keyed to'Radar.cpp, PATCH_JUMP);
//InjectHook(0x4A7260, sRadarTrace::sRadarTrace, PATCH_JUMP);
ENDPATCHES
ENDPATCHES

View file

@ -34,6 +34,10 @@ LARGE_INTEGER &perfSuspendCounter = *(LARGE_INTEGER*)0x62A318;
//UInt32 suspendDepth;
uint32 &suspendDepth = *(uint32*)0x62A320;
#ifdef FIX_BUGS
double frameTime;
#endif
void CTimer::Initialise(void)
{
debug("Initialising CTimer...\n");
@ -90,17 +94,21 @@ void CTimer::Update(void)
float updInCyclesScaled = updInCycles * ms_fTimeScale;
double upd = updInCyclesScaled / (double)_nCyclesPerMS;
// We need that real frame time to fix transparent menu bug.
#ifndef FIX_BUGS
double
#endif
frameTime = updInCyclesScaled / (double)_nCyclesPerMS;
m_snTimeInMillisecondsPauseMode = m_snTimeInMillisecondsPauseMode + upd;
m_snTimeInMillisecondsPauseMode = m_snTimeInMillisecondsPauseMode + frameTime;
if ( GetIsPaused() )
ms_fTimeStep = 0.0f;
else
{
m_snTimeInMilliseconds = m_snTimeInMilliseconds + upd;
m_snTimeInMillisecondsNonClipped = m_snTimeInMillisecondsNonClipped + upd;
ms_fTimeStep = updInCyclesScaled / (double)_nCyclesPerMS / 20.0f;
m_snTimeInMilliseconds = m_snTimeInMilliseconds + frameTime;
m_snTimeInMillisecondsNonClipped = m_snTimeInMillisecondsNonClipped + frameTime;
ms_fTimeStep = frameTime / 1000.0f * 50.0f;
}
}
else
@ -109,19 +117,23 @@ void CTimer::Update(void)
uint32 updInMs = timer - oldPcTimer;
double upd = (double)updInMs * ms_fTimeScale;
// We need that real frame time to fix transparent menu bug.
#ifndef FIX_BUGS
double
#endif
frameTime = (double)updInMs * ms_fTimeScale;
oldPcTimer = timer;
m_snTimeInMillisecondsPauseMode = m_snTimeInMillisecondsPauseMode + upd;
m_snTimeInMillisecondsPauseMode = m_snTimeInMillisecondsPauseMode + frameTime;
if ( GetIsPaused() )
ms_fTimeStep = 0.0f;
else
{
m_snTimeInMilliseconds = m_snTimeInMilliseconds + upd;
m_snTimeInMillisecondsNonClipped = m_snTimeInMillisecondsNonClipped + upd;
ms_fTimeStep = upd / 1000.0f * 50.0f;
m_snTimeInMilliseconds = m_snTimeInMilliseconds + frameTime;
m_snTimeInMillisecondsNonClipped = m_snTimeInMillisecondsNonClipped + frameTime;
ms_fTimeStep = frameTime / 1000.0f * 50.0f;
}
}

View file

@ -54,3 +54,7 @@ public:
static void StartUserPause(void);
static void EndUserPause(void);
};
#ifdef FIX_BUGS
extern double frameTime;
#endif

View file

@ -74,9 +74,11 @@ inline uint32 ldb(uint32 p, uint32 s, uint32 w)
}
#ifndef RWLIBS
// little hack
extern void **rwengine;
#define RwEngineInstance (*rwengine)
#endif
#include "skeleton.h"
#include "Draw.h"

View file

@ -21,10 +21,15 @@
#include "Particle.h"
#include "Console.h"
#include "Debug.h"
#include "Hud.h"
#include <list>
#ifndef RWLIBS
void **rwengine = *(void***)0x5A10E1;
#else
extern "C" int vsprintf(char* const _Buffer, char const* const _Format, va_list _ArgList);
#endif
DebugMenuAPI gDebugMenuAPI;
@ -338,6 +343,7 @@ DebugMenuPopulate(void)
DebugMenuAddCmd("Spawn", "Spawn Rhino", [](){ SpawnCar(MI_RHINO); });
DebugMenuAddCmd("Spawn", "Spawn Firetruck", [](){ SpawnCar(MI_FIRETRUCK); });
DebugMenuAddVarBool8("Debug", "Draw hud", (int8*)&CHud::m_Wants_To_Draw_Hud, nil);
DebugMenuAddVar("Debug", "Engine Status", &engineStatus, nil, 1, 0, 226, nil);
DebugMenuAddCmd("Debug", "Set Engine Status", SetEngineStatus);
DebugMenuAddCmd("Debug", "Fix Car", FixCar);

View file

@ -62,11 +62,11 @@ CEntity::CEntity(void)
bRemoveFromWorld = false;
bHasHitWall = false;
bImBeingRendered = false;
m_flagD8 = false;
bTouchingWater = false;
bIsSubway = false;
bDrawLast = false;
bNoBrightHeadLights = false;
m_flagD80 = false;
bDoNotRender = false;
bDistanceFade = false;
m_flagE2 = false;

View file

@ -73,11 +73,11 @@ public:
uint32 bRemoveFromWorld : 1;
uint32 bHasHitWall : 1;
uint32 bImBeingRendered : 1;
uint32 m_flagD8 : 1; // used by cBuoyancy::ProcessBuoyancy
uint32 bTouchingWater : 1; // used by cBuoyancy::ProcessBuoyancy
uint32 bIsSubway : 1; // set when subway, but maybe different meaning?
uint32 bDrawLast : 1;
uint32 bNoBrightHeadLights : 1;
uint32 m_flagD80 : 1; // CObject visibility?
uint32 bDoNotRender : 1;
// flagsE
uint32 bDistanceFade : 1;

View file

@ -6,13 +6,11 @@
#include "Radar.h"
#include "Object.h"
#include "DummyObject.h"
WRAPPER void CObject::ObjectDamage(float amount) { EAXJMP(0x4BB240); }
WRAPPER void CObject::DeleteAllTempObjectInArea(CVector, float) { EAXJMP(0x4BBED0); }
WRAPPER void CObject::Init(void) { EAXJMP(0x4BAEC0); }
WRAPPER void CObject::ProcessControl(void) { EAXJMP(0x4BB040); }
WRAPPER void CObject::Teleport(CVector) { EAXJMP(0x4BBDA0); }
WRAPPER void CObject::DeleteAllTempObjects() { EAXJMP(0x4BBDF0); }
#include "Particle.h"
#include "General.h"
#include "ObjectData.h"
#include "World.h"
#include "Floater.h"
int16 &CObject::nNoTempObjects = *(int16*)0x95CCA2;
int16 &CObject::nBodyCastHealth = *(int16*)0x5F7D4C; // 1000
@ -29,13 +27,13 @@ CObject::CObject(void)
m_nCollisionDamageEffect = 0;
m_nSpecialCollisionResponseCases = COLLRESPONSE_NONE;
m_bCameraToAvoidThisObject = false;
ObjectCreatedBy = 0;
ObjectCreatedBy = UNKNOWN_OBJECT;
m_nEndOfLifeTime = 0;
// m_nRefModelIndex = -1; // duplicate
// bUseVehicleColours = false; // duplicate
m_colour2 = 0;
m_colour1 = m_colour2;
field_172 = 0;
m_nBonusValue = 0;
bIsPickup = false;
m_obj_flag2 = false;
bOutOfStock = false;
@ -83,10 +81,46 @@ CObject::~CObject(void)
nNoTempObjects--;
}
void
CObject::ProcessControl(void)
{
CVector point, impulse;
if (m_nCollisionDamageEffect)
ObjectDamage(m_fDamageImpulse);
CPhysical::ProcessControl();
if (mod_Buoyancy.ProcessBuoyancy(this, m_fBuoyancy, &point, &impulse)) {
bIsInWater = true;
bIsStatic = false;
ApplyMoveForce(impulse);
ApplyTurnForce(impulse, point);
float fTimeStep = Pow(0.97f, CTimer::GetTimeStep());
m_vecMoveSpeed *= fTimeStep;
m_vecTurnSpeed *= fTimeStep;
}
if ((m_modelIndex == MI_EXPLODINGBARREL || m_modelIndex == MI_PETROLPUMP) && bHasBeenDamaged && bIsVisible
&& (CGeneral::GetRandomNumber() & 0x1F) == 10) {
bExplosionProof = true;
bIsVisible = false;
bUsesCollision = false;
bAffectedByGravity = false;
m_vecMoveSpeed = CVector(0.0f, 0.0f, 0.0f);
}
}
void
CObject::Teleport(CVector vecPos)
{
CWorld::Remove(this);
m_matrix.GetPosition() = vecPos;
m_matrix.UpdateRW();
UpdateRwFrame();
CWorld::Add(this);
}
void
CObject::Render(void)
{
if(m_flagD80)
if(bDoNotRender)
return;
if(m_nRefModelIndex != -1 && ObjectCreatedBy == TEMP_OBJECT && bUseVehicleColours){
@ -118,6 +152,152 @@ CObject::RemoveLighting(bool reset)
WorldReplaceScorchedLightsWithNormal(Scene.world);
}
void
CObject::ObjectDamage(float amount)
{
if (!m_nCollisionDamageEffect || !bUsesCollision)
return;
static int8 nFrameGen = 0;
bool bBodyCastDamageEffect = false;
if (m_modelIndex == MI_BODYCAST){
if (amount > 50.0f)
nBodyCastHealth = (int16)(nBodyCastHealth - 0.5f * amount);
if (nBodyCastHealth < 0)
nBodyCastHealth = 0;
if (nBodyCastHealth < 200)
bBodyCastDamageEffect = true;
amount = 0.0f;
}
if ((amount * m_fCollisionDamageMultiplier > 150.0f || bBodyCastDamageEffect) && m_nCollisionDamageEffect) {
const CVector& vecPos = m_matrix.GetPosition();
const float fDirectionZ = 0.0002f * amount;
switch (m_nCollisionDamageEffect)
{
case COLDAMAGE_EFFECT_CHANGE_MODEL:
bRenderDamaged = true;
break;
case COLDAMAGE_EFFECT_SPLIT_MODEL:
break;
case COLDAMAGE_EFFECT_SMASH_COMPLETELY:
bIsVisible = false;
bUsesCollision = false;
bIsStatic = true;
bExplosionProof = true;
SetMoveSpeed(0.0f, 0.0f, 0.0f);
SetTurnSpeed(0.0f, 0.0f, 0.0f);
break;
case COLDAMAGE_EFFECT_CHANGE_THEN_SMASH:
if (!bRenderDamaged) {
bRenderDamaged = true;
}
else {
bIsVisible = false;
bUsesCollision = false;
bIsStatic = true;
bExplosionProof = true;
SetMoveSpeed(0.0f, 0.0f, 0.0f);
SetTurnSpeed(0.0f, 0.0f, 0.0f);
}
break;
case COLDAMAGE_EFFECT_SMASH_CARDBOX_COMPLETELY: {
bIsVisible = false;
bUsesCollision = false;
bIsStatic = true;
bExplosionProof = true;
SetMoveSpeed(0.0f, 0.0f, 0.0f);
SetTurnSpeed(0.0f, 0.0f, 0.0f);
const RwRGBA color = { 96, 48, 0, 255 };
for (int32 i = 0; i < 25; i++) {
CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.7f),
CGeneral::GetRandomNumberInRange(-0.35f, 0.7f),
CGeneral::GetRandomNumberInRange(0.1f, 0.15f) + fDirectionZ);
++nFrameGen;
int32 currentFrame = nFrameGen & 3;
float fRandom = CGeneral::GetRandomNumberInRange(0.01f, 1.0f);
RwRGBA randomColor = { color.red * fRandom, color.green * fRandom , color.blue, color.alpha };
float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.18f);
int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 80);
CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, randomColor, nRotationSpeed, 0, currentFrame, 0);
}
PlayOneShotScriptObject(_SCRSOUND_CARDBOARD_BOX_SMASH, vecPos);
break;
}
case COLDAMAGE_EFFECT_SMASH_WOODENBOX_COMPLETELY: {
bIsVisible = false;
bUsesCollision = false;
bIsStatic = true;
bExplosionProof = true;
SetMoveSpeed(0.0f, 0.0f, 0.0f);
SetTurnSpeed(0.0f, 0.0f, 0.0f);
const RwRGBA color = { 128, 128, 128, 255 };
for (int32 i = 0; i < 45; i++) {
CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.7f),
CGeneral::GetRandomNumberInRange(-0.35f, 0.7f),
CGeneral::GetRandomNumberInRange(0.1f, 0.15f) + fDirectionZ);
++nFrameGen;
int32 currentFrame = nFrameGen & 3;
float fRandom = CGeneral::GetRandomNumberInRange(0.5f, 0.5f);
RwRGBA randomColor = { color.red * fRandom, color.green * fRandom , color.blue * fRandom, color.alpha };
float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.18f);
int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 80);
CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, randomColor, nRotationSpeed, 0, currentFrame, 0);
}
PlayOneShotScriptObject(_SCRSOUND_WOODEN_BOX_SMASH, vecPos);
break;
}
case COLDAMAGE_EFFECT_SMASH_TRAFFICCONE_COMPLETELY: {
bIsVisible = false;
bUsesCollision = false;
bIsStatic = true;
bExplosionProof = true;
SetMoveSpeed(0.0f, 0.0f, 0.0f);
SetTurnSpeed(0.0f, 0.0f, 0.0f);
const RwRGBA color1 = { 200, 0, 0, 255 };
const RwRGBA color2 = { 200, 200, 200, 255 };
for (int32 i = 0; i < 10; i++) {
CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.7f),
CGeneral::GetRandomNumberInRange(-0.35f, 0.7f),
CGeneral::GetRandomNumberInRange(0.1f, 0.15f) + fDirectionZ);
++nFrameGen;
int32 currentFrame = nFrameGen & 3;
RwRGBA color = color2;
if (nFrameGen & 1)
color = color1;
float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.18f);
int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 80);
CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, color, nRotationSpeed, 0, currentFrame, 0);
}
PlayOneShotScriptObject(_SCRSOUND_TYRE_BUMP, vecPos);
break;
}
case COLDAMAGE_EFFECT_SMASH_BARPOST_COMPLETELY: {
bIsVisible = false;
bUsesCollision = false;
bIsStatic = true;
bExplosionProof = true;
SetMoveSpeed(0.0f, 0.0f, 0.0f);
SetTurnSpeed(0.0f, 0.0f, 0.0f);
const RwRGBA color1 = { 200, 0, 0, 255 };
const RwRGBA color2 = { 200, 200, 200, 255 };
for (int32 i = 0; i < 32; i++) {
CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.7f),
CGeneral::GetRandomNumberInRange(-0.35f, 0.7f),
CGeneral::GetRandomNumberInRange(0.1f, 0.15f) + fDirectionZ);
++nFrameGen;
int32 currentFrame = nFrameGen & 3;
RwRGBA color = color2;
if (nFrameGen & 1)
color = color1;
float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.18f);
int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 80);
CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, color, nRotationSpeed, 0, currentFrame, 0);
}
PlayOneShotScriptObject(_SCRSOUND_COL_CAR, vecPos);
break;
}
}
}
}
void
CObject::RefModelInfo(int32 modelId)
@ -126,6 +306,39 @@ CObject::RefModelInfo(int32 modelId)
CModelInfo::GetModelInfo(modelId)->AddRef();
}
void
CObject::Init(void)
{
m_type = ENTITY_TYPE_OBJECT;;
CObjectData::SetObjectData(m_modelIndex, *this);
m_nEndOfLifeTime = 0;
ObjectCreatedBy = GAME_OBJECT;
bIsStatic = true;
bIsPickup = false;
m_obj_flag2 = false;
bOutOfStock = false;
bGlassCracked = false;
bGlassBroken = false;
bHasBeenDamaged = false;
bUseVehicleColours = false;
m_nRefModelIndex = -1;
m_colour1 = 0;
m_colour2 = 0;
m_nBonusValue = 0;
m_pCollidingEntity = nil;
CColPoint point;
CEntity* outEntity = nil;
const CVector& vecPos = m_matrix.GetPosition();
if (CWorld::ProcessVerticalLine(vecPos, vecPos.z - 10.0f, point, outEntity, true, false, false, false, false, false, nil))
m_pCurSurface = outEntity;
else
m_pCurSurface = nil;
if (m_modelIndex == MI_BODYCAST)
nBodyCastHealth = 1000;
else if (m_modelIndex == MI_BUOY)
bTouchingWater = true;
}
bool
CObject::CanBeDeleted(void)
{
@ -143,6 +356,45 @@ CObject::CanBeDeleted(void)
}
}
void
CObject::DeleteAllMissionObjects()
{
CObjectPool* objectPool = CPools::GetObjectPool();
for (int32 i = 0; i < objectPool->GetSize(); i++) {
CObject* pObject = objectPool->GetSlot(i);
if (pObject && pObject->ObjectCreatedBy == MISSION_OBJECT) {
CWorld::Remove(pObject);
delete pObject;
}
}
}
void
CObject::DeleteAllTempObjects()
{
CObjectPool* objectPool = CPools::GetObjectPool();
for (int32 i = 0; i < objectPool->GetSize(); i++) {
CObject* pObject = objectPool->GetSlot(i);
if (pObject && pObject->ObjectCreatedBy == TEMP_OBJECT) {
CWorld::Remove(pObject);
delete pObject;
}
}
}
void
CObject::DeleteAllTempObjectInArea(CVector point, float fRadius)
{
CObjectPool *objectPool = CPools::GetObjectPool();
for (int32 i = 0; i < objectPool->GetSize(); i++) {
CObject *pObject = objectPool->GetSlot(i);
if (pObject && pObject->ObjectCreatedBy == TEMP_OBJECT && fRadius * fRadius > pObject->GetPosition().MagnitudeSqr()) {
CWorld::Remove(pObject);
delete pObject;
}
}
}
#include <new>
class CObject_ : public CObject
@ -153,6 +405,9 @@ public:
CObject *ctor(CDummyObject *dummy) { return ::new (this) CObject(dummy); }
void dtor(void) { CObject::~CObject(); }
void Render_(void) { CObject::Render(); }
void ProcessControl_(void) { CObject::ProcessControl(); }
bool SetupLighting_(void) { return CObject::SetupLighting(); }
void RemoveLighting_(bool reset) { CObject::RemoveLighting(reset); }
};
STARTPATCHES
@ -160,5 +415,16 @@ STARTPATCHES
InjectHook(0x4BACE0, (CObject* (CObject::*)(int32, bool)) &CObject_::ctor, PATCH_JUMP);
InjectHook(0x4BAD50, (CObject* (CObject::*)(CDummyObject*)) &CObject_::ctor, PATCH_JUMP);
InjectHook(0x4BAE00, &CObject_::dtor, PATCH_JUMP);
InjectHook(0x4BB040, &CObject_::ProcessControl_, PATCH_JUMP);
InjectHook(0x4BBDA0, &CObject::Teleport, PATCH_JUMP);
InjectHook(0x4BB1E0, &CObject_::Render_, PATCH_JUMP);
InjectHook(0x4A7C90, &CObject_::SetupLighting_, PATCH_JUMP);
InjectHook(0x4A7CD0, &CObject_::RemoveLighting_, PATCH_JUMP);
InjectHook(0x4BB240, &CObject::ObjectDamage, PATCH_JUMP);
InjectHook(0x4BBD80, &CObject::RefModelInfo, PATCH_JUMP);
InjectHook(0x4BAEC0, &CObject::Init, PATCH_JUMP);
InjectHook(0x4BB010, &CObject::CanBeDeleted, PATCH_JUMP);
InjectHook(0x4BBE60, &CObject::DeleteAllMissionObjects, PATCH_JUMP);
InjectHook(0x4BBDF0, &CObject::DeleteAllTempObjects, PATCH_JUMP);
InjectHook(0x4BBED0, &CObject::DeleteAllTempObjectInArea, PATCH_JUMP);
ENDPATCHES

View file

@ -3,12 +3,25 @@
#include "Physical.h"
enum {
UNKNOWN_OBJECT = 0,
GAME_OBJECT = 1,
MISSION_OBJECT = 2,
TEMP_OBJECT = 3,
CUTSCENE_OBJECT = 4,
};
enum {
COLDAMAGE_EFFECT_NONE = 0,
COLDAMAGE_EFFECT_CHANGE_MODEL = 1,
COLDAMAGE_EFFECT_SPLIT_MODEL = 2,
COLDAMAGE_EFFECT_SMASH_COMPLETELY = 3,
COLDAMAGE_EFFECT_CHANGE_THEN_SMASH = 4,
COLDAMAGE_EFFECT_SMASH_CARDBOX_COMPLETELY = 50,
COLDAMAGE_EFFECT_SMASH_WOODENBOX_COMPLETELY = 60,
COLDAMAGE_EFFECT_SMASH_TRAFFICCONE_COMPLETELY = 70,
COLDAMAGE_EFFECT_SMASH_BARPOST_COMPLETELY = 80,
};
enum {
COLLRESPONSE_NONE,
COLLRESPONSE_CHANGE_MODEL,
@ -41,21 +54,21 @@ public:
int8 bHasBeenDamaged : 1;
int8 bUseVehicleColours : 1;
int8 m_obj_flag80 : 1;
int8 field_172; // car for a bonus pickup?
int8 field_173;
int8 m_nBonusValue;
int8 field_173;
float m_fCollisionDamageMultiplier;
uint8 m_nCollisionDamageEffect;
uint8 m_nSpecialCollisionResponseCases;
bool m_bCameraToAvoidThisObject;
int8 field_17B;
int8 field_17C;
int8 field_17D;
int8 field_17E;
int8 field_17F;
int8 field_17B;
int8 field_17C;
int8 field_17D;
int8 field_17E;
int8 field_17F;
uint32 m_nEndOfLifeTime;
int16 m_nRefModelIndex;
int8 field_186;
int8 field_187;
int8 field_186;
int8 field_187;
CEntity *m_pCurSurface;
CEntity *m_pCollidingEntity;
int8 m_colour1, m_colour2;
@ -74,7 +87,7 @@ public:
~CObject(void);
void ProcessControl(void);
void Teleport(CVector);
void Teleport(CVector vecPos);
void Render(void);
bool SetupLighting(void);
void RemoveLighting(bool reset);
@ -84,7 +97,8 @@ public:
void Init(void);
bool CanBeDeleted(void);
static void DeleteAllTempObjectInArea(CVector, float);
static void DeleteAllMissionObjects();
static void DeleteAllTempObjects();
static void DeleteAllTempObjectInArea(CVector point, float fRadius);
};
static_assert(sizeof(CObject) == 0x198, "CObject: error");

View file

@ -28,10 +28,8 @@ CCivilianPed::CivilianAI(void)
return;
if (m_objective == OBJECTIVE_KILL_CHAR_ON_FOOT || m_objective == OBJECTIVE_KILL_CHAR_ANY_MEANS) {
if (m_pedInObjective) {
if (m_pedInObjective->IsPlayer())
return;
}
if (m_pedInObjective && m_pedInObjective->IsPlayer())
return;
}
if (CTimer::GetTimeInMilliseconds() <= m_lookTimer)
return;
@ -75,7 +73,7 @@ CCivilianPed::CivilianAI(void)
} else {
SetMoveState(PEDMOVE_WALK);
}
} else if (threatPed->IsPlayer() && FindPlayerPed()->m_pWanted->m_CurrentCops) {
} else if (threatPed->IsPlayer() && FindPlayerPed()->m_pWanted->m_CurrentCops != 0) {
SetFindPathAndFlee(m_threatEntity, 5000);
if (threatDistSqr < sq(10.0f)) {
SetMoveState(PEDMOVE_RUN);
@ -170,8 +168,8 @@ CCivilianPed::CivilianAI(void)
if (m_threatEntity && m_threatEntity->IsPed()) {
CPed *threatPed = (CPed*)m_threatEntity;
if (m_pedStats->m_fear <= 100 - threatPed->m_pedStats->m_temper && threatPed->m_nPedType != PEDTYPE_COP) {
if (threatPed->GetWeapon()->IsTypeMelee() || !GetWeapon()->IsTypeMelee()) {
if (threatPed->IsPlayer() && FindPlayerPed()->m_pWanted->m_CurrentCops) {
if (threatPed->GetWeapon(m_currentWeapon).IsTypeMelee() || !GetWeapon()->IsTypeMelee()) {
if (threatPed->IsPlayer() && FindPlayerPed()->m_pWanted->m_CurrentCops != 0) {
if (m_objective == OBJECTIVE_KILL_CHAR_ON_FOOT || m_objective == OBJECTIVE_KILL_CHAR_ANY_MEANS) {
SetFindPathAndFlee(m_threatEntity, 10000);
}

View file

@ -15027,7 +15027,7 @@ CPed::ProcessBuoyancy(void)
#endif
if (mod_Buoyancy.ProcessBuoyancy(this, GRAVITY * m_fMass * buoyancyLevel, &buoyancyPoint, &buoyancyImpulse)) {
m_flagD8 = true;
bTouchingWater = true;
CEntity *entity;
CColPoint point;
if (CWorld::ProcessVerticalLine(GetPosition(), GetPosition().z - 3.0f, point, entity, false, true, false, false, false, false, false)
@ -15093,7 +15093,7 @@ CPed::ProcessBuoyancy(void)
} else
return;
} else
m_flagD8 = false;
bTouchingWater = false;
if (nGenerateWaterCircles && CTimer::GetTimeInMilliseconds() >= nGenerateWaterCircles) {
CVector pos = GetPosition();

View file

@ -967,7 +967,7 @@ CPopulation::ConvertToRealObject(CDummyObject *dummy)
} else if (obj->m_modelIndex == MI_BUOY) {
obj->bIsStatic = false;
obj->m_vecMoveSpeed = CVector(0.0f, 0.0f, -0.001f);
obj->m_flagD8 = true;
obj->bTouchingWater = true;
obj->AddToMovingList();
}
}

View file

@ -21,54 +21,52 @@
#include "User.h"
#include "World.h"
wchar *CHud::m_HelpMessage = (wchar*)0x86B888;
wchar *CHud::m_LastHelpMessage = (wchar*)0x6E8F28;
int32 &CHud::m_HelpMessageState = *(int32*)0x880E1C;
int32 &CHud::m_HelpMessageTimer = *(int32*)0x880FA4;
int32 &CHud::m_HelpMessageFadeTimer = *(int32*)0x8F6258;
wchar *CHud::m_HelpMessageToPrint = (wchar*)0x664480;
float &CHud::m_HelpMessageDisplayTime = *(float*)0x8E2C28;
float &CHud::m_fTextBoxNumLines = *(float*)0x8E2C28;
float &CHud::m_fHelpMessageTime = *(float *)0x8E2C28;
bool &CHud::m_HelpMessageQuick = *(bool *)0x95CCF7;
int32 CHud::m_ZoneState = *(int32*)0x8F29AC;
wchar CHud::m_HelpMessage[256]; // = (wchar*)0x86B888;
wchar CHud::m_LastHelpMessage[256]; // = (wchar*)0x6E8F28;
uint32 CHud::m_HelpMessageState; // = *(int32*)0x880E1C;
uint32 CHud::m_HelpMessageTimer; // = *(int32*)0x880FA4;
int32 CHud::m_HelpMessageFadeTimer; // = *(int32*)0x8F6258;
wchar CHud::m_HelpMessageToPrint[256]; // = (wchar*)0x664480;
float CHud::m_fHelpMessageTime; // *(float *)0x8E2C28;
bool CHud::m_HelpMessageQuick; // = *(bool*)0x95CCF7;
uint32 CHud::m_ZoneState; // = *(int32*)0x8F29AC;
int32 CHud::m_ZoneFadeTimer;
int32 CHud::m_ZoneNameTimer = *(int32*)0x8F1A50;
wchar *&CHud::m_pZoneName = *(wchar **)0x8E2C2C;
wchar *CHud::m_pLastZoneName = (wchar*)0x8F432C;
uint32 CHud::m_ZoneNameTimer; // = *(int32*)0x8F1A50;
wchar *CHud::m_pZoneName; // = *(wchar**)0x8E2C2C;
wchar *CHud::m_pLastZoneName; // = (wchar*)0x8F432C;
wchar *CHud::m_ZoneToPrint;
int32 CHud::m_VehicleState = *(int32*)0x940560;
uint32 CHud::m_VehicleState; // = *(int32*)0x940560;
int32 CHud::m_VehicleFadeTimer;
int32 CHud::m_VehicleNameTimer = *(int32*)0x8F2A14;
wchar *&CHud::m_VehicleName = *(wchar **)0x942FB4;
wchar *CHud::m_pLastVehicleName = *(wchar **)0x8E2DD8;
uint32 CHud::m_VehicleNameTimer; // = *(int32*)0x8F2A14;
wchar *CHud::m_VehicleName; // = *(wchar**)0x942FB4;
wchar *CHud::m_pLastVehicleName; // = *(wchar**)0x8E2DD8;
wchar *CHud::m_pVehicleNameToPrint;
wchar *CHud::m_Message = (wchar*)0x72E318;
wchar *CHud::m_PagerMessage = (wchar*)0x878840;
bool &CHud::m_Wants_To_Draw_Hud = *(bool*)0x95CD89;
bool &CHud::m_Wants_To_Draw_3dMarkers = *(bool*)0x95CD62;
wchar(&CHud::m_BigMessage)[6][128] = *(wchar(*)[6][128])*(uintptr*)0x664CE0;
int16 &CHud::m_ItemToFlash = *(int16*)0x95CC82;
wchar CHud::m_Message[256];// = (wchar*)0x72E318;
wchar CHud::m_PagerMessage[256]; // = (wchar*)0x878840;
bool CHud::m_Wants_To_Draw_Hud; // (bool*)0x95CD89;
bool CHud::m_Wants_To_Draw_3dMarkers; // = *(bool*)0x95CD62;
wchar CHud::m_BigMessage[6][128]; // = *(wchar(*)[6][128]) * (uintptr*)0x664CE0;
int16 CHud::m_ItemToFlash; // = *(int16*)0x95CC82;
// These aren't really in CHud
float CHud::BigMessageInUse[6];
float CHud::BigMessageAlpha[6];
float CHud::BigMessageX[6];
float &CHud::OddJob2OffTimer = *(float*)0x942FA0;
int8 &CHud::CounterOnLastFrame = *(int8*)0x95CD67;
float &CHud::OddJob2XOffset = *(float*)0x8F1B5C;
int16 &CHud::CounterFlashTimer = *(int16*)0x95CC20;
int16 &CHud::OddJob2Timer = *(int16*)0x95CC52;
int8 &CHud::TimerOnLastFrame = *(int8*)0x95CDA7;
int16 &CHud::OddJob2On = *(int16*)0x95CC78;
int16 &CHud::TimerFlashTimer = *(int16*)0x95CC6C;
int16 &CHud::PagerSoundPlayed = *(int16*)0x95CC4A;
int32 &CHud::SpriteBrightness = *(int32*)0x95CC54;
float &CHud::PagerXOffset = *(float*)0x941590;
int16 &CHud::PagerTimer = *(int16*)0x95CC3A;
int16 &CHud::PagerOn = *(int16*)0x95CCA0;
float CHud::OddJob2OffTimer; // = *(float*)0x942FA0;
bool CHud::CounterOnLastFrame; // = *(int8*)0x95CD67;
float CHud::OddJob2XOffset; // = *(float*)0x8F1B5C;
uint16 CHud::CounterFlashTimer; // = *(int16*)0x95CC20;
uint16 CHud::OddJob2Timer; // = *(int16*)0x95CC52;
bool CHud::TimerOnLastFrame; //= *(int8*)0x95CDA7;
int16 CHud::OddJob2On; //= *(int16*)0x95CC78;
uint16 CHud::TimerFlashTimer; //= *(int16*)0x95CC6C;
int16 CHud::PagerSoundPlayed; //= *(int16*)0x95CC4A;
int32 CHud::SpriteBrightness; //= *(int32*)0x95CC54;
float CHud::PagerXOffset; //= *(float*)0x941590;
int16 CHud::PagerTimer; //= *(int16*)0x95CC3A;
int16 CHud::PagerOn; //= *(int16*)0x95CCA0;
CSprite2d *CHud::Sprites = (CSprite2d*)0x95CB9C;
CSprite2d CHud::Sprites[NUM_HUD_SPRITES]; // = (CSprite2d*)0x95CB9C;
struct
{
@ -90,14 +88,14 @@ struct
{"detonator", "detonator_mask"},
{"", ""},
{"", ""},
{"radardisc", "radardiscm"},
{"radardisc", "radardisc"},
{"pager", "pagerm"},
{"", ""},
{"", ""},
{"bleeder", ""},
{"sitesniper", "sitesniperm"},
{"siteM16", "siteM16m"},
{"siterocket", "siterocketm"}
{"siterocket", "siterocket"}
};
RwTexture *&gpSniperSightTex = *(RwTexture**)0x8F5834;
@ -415,7 +413,7 @@ void CHud::Draw()
DrawZoneName
*/
if (m_pZoneName) {
float fZoneAlpha = 0.0f;
float fZoneAlpha = 255.0f;
if (m_pZoneName != m_pLastZoneName) {
switch (m_ZoneState) {
@ -429,7 +427,7 @@ void CHud::Draw()
case 2:
case 3:
case 4:
m_ZoneNameTimer = 0;
m_ZoneNameTimer = 5;
m_ZoneState = 4;
break;
default:
@ -441,6 +439,7 @@ void CHud::Draw()
if (m_ZoneState) {
switch (m_ZoneState) {
case 1:
m_ZoneFadeTimer = 1000;
if (m_ZoneNameTimer > 10000) {
m_ZoneFadeTimer = 1000;
m_ZoneState = 3;
@ -468,7 +467,6 @@ void CHud::Draw()
if (m_ZoneFadeTimer < 0) {
m_ZoneFadeTimer = 0;
m_ZoneToPrint = m_pLastZoneName;
m_ZoneNameTimer = 0;
m_ZoneState = 2;
}
fZoneAlpha = m_ZoneFadeTimer * 0.001f * 255.0f;
@ -500,12 +498,6 @@ void CHud::Draw()
}
}
}
/*else {
m_pLastZoneName = nil;
m_ZoneState = 0;
m_ZoneFadeTimer = 0;
m_ZoneNameTimer = 0;
}*/
/*
DrawVehicleName
@ -633,9 +625,9 @@ void CHud::Draw()
wchar sTimer[16];
if (!CUserDisplay::OnscnTimer.m_sEntries[0].m_bTimerProcessed)
TimerOnLastFrame = 0;
TimerOnLastFrame = false;
if (!CUserDisplay::OnscnTimer.m_sEntries[0].m_bCounterProcessed)
CounterOnLastFrame = 0;
CounterOnLastFrame = false;
#ifdef FIX_BUGS
#define TIMER_RIGHT_OFFSET 34.0f // Taken from VC frenzy timer
@ -647,7 +639,7 @@ void CHud::Draw()
if (!TimerOnLastFrame)
TimerFlashTimer = 1;
TimerOnLastFrame = 1;
TimerOnLastFrame = true;
if (TimerFlashTimer) {
if (++TimerFlashTimer > 50)
@ -685,7 +677,7 @@ void CHud::Draw()
if (!CounterOnLastFrame)
CounterFlashTimer = 1;
CounterOnLastFrame = 1;
CounterOnLastFrame = true;
if (CounterFlashTimer) {
if (++CounterFlashTimer > 50)
@ -739,11 +731,9 @@ void CHud::Draw()
/*
DrawPager
*/
if (!m_PagerMessage[0]) {
if (PagerOn == 1) {
PagerSoundPlayed = false;
PagerOn = 2;
}
if (!m_PagerMessage[0] && PagerOn == 1) {
PagerSoundPlayed = false;
PagerOn = 2;
}
if (m_PagerMessage[0] || PagerOn == 2) {
if (!PagerOn) {
@ -752,7 +742,7 @@ void CHud::Draw()
}
if (PagerOn == 1) {
if (PagerXOffset > 0.0f) {
float fStep = PagerXOffset * 0.05f;
float fStep = PagerXOffset * 0.1f;
if (fStep > 10.0f)
fStep = 10.0f;
PagerXOffset -= fStep * CTimer::GetTimeStep();
@ -763,10 +753,10 @@ void CHud::Draw()
}
}
else if (PagerOn == 2) {
float fStep = PagerXOffset * 0.05f;
float fStep = PagerXOffset * 0.1f;
if (fStep < 2.0f)
fStep = 2.0f;
PagerXOffset += fStep * CTimer::GetTimeStep();
PagerXOffset += fStep;
if (PagerXOffset > 150.0f) {
PagerXOffset = 150.0f;
PagerOn = 0;
@ -815,9 +805,7 @@ void CHud::Draw()
DrawScriptText
*/
if (!CTimer::GetIsUserPaused()) {
intro_text_line* IntroText = CTheScripts::IntroTextLines;
for (int i = 0; i < MAX_NUM_INTRO_TEXT_LINES; i++) {
for (int i = 0; i < ARRAY_SIZE(CTheScripts::IntroTextLines); i++) {
if (CTheScripts::IntroTextLines[i].m_Text[0] && CTheScripts::IntroTextLines[i].m_bTextBeforeFade) {
CFont::SetScale(SCREEN_SCALE_X(CTheScripts::IntroTextLines[i].m_fScaleX), SCREEN_SCALE_Y(CTheScripts::IntroTextLines[i].m_fScaleY * 0.5f));
CFont::SetColor(CTheScripts::IntroTextLines[i].m_sColor);
@ -858,31 +846,31 @@ void CHud::Draw()
CFont::SetPropOff();
CFont::SetFontStyle(CTheScripts::IntroTextLines[i].m_nFont);
CFont::PrintString(SCREEN_SCALE_X(640.0f - CTheScripts::IntroTextLines[i].m_fAtX), SCREEN_SCALE_Y(448.0f - CTheScripts::IntroTextLines[i].m_fAtY), IntroText->m_Text);
CFont::PrintString(SCREEN_SCALE_X(DEFAULT_SCREEN_WIDTH - CTheScripts::IntroTextLines[i].m_fAtX), SCREEN_SCALE_Y(DEFAULT_SCREEN_HEIGHT - CTheScripts::IntroTextLines[i].m_fAtY), CTheScripts::IntroTextLines[i].m_Text);
}
}
for (int i = 0; i < ARRAY_SIZE(CTheScripts::IntroRectangles); i++) {
intro_script_rectangle &IntroRect = CTheScripts::IntroRectangles[i];
intro_script_rectangle* IntroRect = CTheScripts::IntroRectangles;
for (int i = 0; i < 16; i++) {
if (CTheScripts::IntroRectangles[i].m_bIsUsed && CTheScripts::IntroRectangles[i].m_bBeforeFade) {
if (CTheScripts::IntroRectangles[i].m_nTextureId >= 0) {
// Yeah, top and bottom changed place. R* vision
if (IntroRect.m_bIsUsed && IntroRect.m_bBeforeFade) {
if (IntroRect.m_nTextureId >= 0) {
CRect rect = {
CTheScripts::IntroRectangles[i].m_sRect.left,
CTheScripts::IntroRectangles[i].m_sRect.bottom,
CTheScripts::IntroRectangles[i].m_sRect.right,
CTheScripts::IntroRectangles[i].m_sRect.bottom };
IntroRect.m_sRect.left,
IntroRect.m_sRect.top,
IntroRect.m_sRect.right,
IntroRect.m_sRect.bottom };
CTheScripts::ScriptSprites[CTheScripts::IntroRectangles[i].m_nTextureId].Draw(rect, IntroRect->m_sColor);
CTheScripts::ScriptSprites[IntroRect.m_nTextureId].Draw(rect, IntroRect.m_sColor);
}
else {
CRect rect = {
CTheScripts::IntroRectangles[i].m_sRect.left,
CTheScripts::IntroRectangles[i].m_sRect.bottom,
CTheScripts::IntroRectangles[i].m_sRect.right,
CTheScripts::IntroRectangles[i].m_sRect.bottom };
IntroRect.m_sRect.left,
IntroRect.m_sRect.top,
IntroRect.m_sRect.right,
IntroRect.m_sRect.bottom };
CSprite2d::DrawRect(rect, IntroRect->m_sColor);
CSprite2d::DrawRect(rect, IntroRect.m_sColor);
}
}
}
@ -928,7 +916,7 @@ void CHud::Draw()
CFont::SetCentreSize(SCREEN_SCALE_X(615.0f));
CFont::SetFontStyle(FONT_HEADING);
if (BigMessageX[0] >= (SCREEN_WIDTH - 20)) {
if (BigMessageX[0] >= SCREEN_SCALE_FROM_RIGHT(20.0f)) {
BigMessageInUse[0] += CTimer::GetTimeStep();
if (BigMessageInUse[0] >= 120.0f) {
@ -945,7 +933,7 @@ void CHud::Draw()
BigMessageX[0] += (CTimer::GetTimeStepInMilliseconds() * 0.3f);
BigMessageAlpha[0] += (CTimer::GetTimeStepInMilliseconds() * 0.3f);
if (BigMessageAlpha[0] >= 255.0f)
if (BigMessageAlpha[0] > 255.0f)
BigMessageAlpha[0] = 255.0f;
}
@ -989,7 +977,7 @@ void CHud::Draw()
CFont::SetFontStyle(FONT_HEADING);
CFont::SetColor(CRGBA(0, 0, 0, BigMessageAlpha[2]));
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(20.0f + 4.0f), SCREEN_SCALE_FROM_BOTTOM(78.0f), m_BigMessage[2]);
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(20.0f - 4.0f), SCREEN_SCALE_FROM_BOTTOM(78.0f), m_BigMessage[2]);
CFont::SetColor(CRGBA(170, 123, 87, BigMessageAlpha[2]));
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(20.0f), SCREEN_SCALE_FROM_BOTTOM(82.0f), m_BigMessage[2]);
@ -1018,7 +1006,7 @@ void CHud::DrawAfterFade()
m_HelpMessageState = 2;
m_HelpMessageTimer = 0;
CMessages::WideStringCopy(m_HelpMessageToPrint, m_HelpMessage, 256);
m_HelpMessageDisplayTime = CMessages::GetWideStringLength(m_HelpMessage) * 0.05f + 3.0f;
m_fHelpMessageTime = CMessages::GetWideStringLength(m_HelpMessage) * 0.05f + 3.0f;
if (TheCamera.m_ScreenReductionPercentage == 0.0f)
DMAudio.PlayFrontEndSound(SOUND_A0, 0);
@ -1036,14 +1024,14 @@ void CHud::DrawAfterFade()
CMessages::WideStringCopy(m_LastHelpMessage, m_HelpMessage, 256);
}
float fAlpha = 255.0f;
float fAlpha = 225.0f;
if (m_HelpMessageState) {
if (m_HelpMessageState != 0) {
switch (m_HelpMessageState) {
case 1:
fAlpha = 255.0f;
fAlpha = 225.0f;
m_HelpMessageFadeTimer = 600;
if (m_HelpMessageTimer > m_fHelpMessageTime * 1000 || m_HelpMessageQuick && m_HelpMessageTimer > 1500) {
if (m_HelpMessageTimer > m_fHelpMessageTime * 1000.0f || m_HelpMessageQuick && m_HelpMessageTimer > 1500.0f) {
m_HelpMessageFadeTimer = 600;
m_HelpMessageState = 3;
}
@ -1054,24 +1042,24 @@ void CHud::DrawAfterFade()
m_HelpMessageState = 1;
m_HelpMessageFadeTimer = 0;
}
fAlpha = m_HelpMessageFadeTimer * 0.001f * 255.0f;
fAlpha = m_HelpMessageFadeTimer * 0.001f * 225.0f;
break;
case 3:
m_HelpMessageFadeTimer -= 2 * CTimer::GetTimeStepInMilliseconds();
if (m_HelpMessageFadeTimer >= 0) {
if (m_HelpMessageFadeTimer < 0) {
m_HelpMessageState = 0;
m_HelpMessageFadeTimer = 0;
}
fAlpha = m_HelpMessageFadeTimer * 0.001f * 255.0f;
fAlpha = m_HelpMessageFadeTimer * 0.001f * 225.0f;
break;
case 4:
m_HelpMessageFadeTimer -= 2 * CTimer::GetTimeStepInMilliseconds();
if (m_HelpMessageFadeTimer >= 0) {
if (m_HelpMessageFadeTimer < 0) {
m_HelpMessageState = 2;
m_HelpMessageFadeTimer = 0;
CMessages::WideStringCopy(m_HelpMessageToPrint, m_LastHelpMessage, 400);
CMessages::WideStringCopy(m_HelpMessageToPrint, m_LastHelpMessage, 256);
}
fAlpha = m_HelpMessageFadeTimer * 0.001f * 255.0f;
fAlpha = m_HelpMessageFadeTimer * 0.001f * 225.0f;
break;
default:
break;
@ -1088,19 +1076,75 @@ void CHud::DrawAfterFade()
else
CFont::SetScale(SCREEN_SCALE_X(0.52f), SCREEN_SCALE_Y(1.1f));
CFont::SetColor(CRGBA(175, 175, 175, 255));
CFont::SetJustifyOff();
CFont::SetWrapx(SCREEN_SCALE_X(200.0f + 26.0f - 4.0f));
CFont::SetFontStyle(FONT_BANK);
CFont::SetBackgroundOn();
CFont::SetBackGroundOnlyTextOff();
CFont::SetBackgroundColor(CRGBA(0, 0, 0, fAlpha * 0.8f));
CFont::SetColor(CRGBA(175, 175, 175, 255));
CFont::SetBackgroundColor(CRGBA(0, 0, 0, fAlpha * 0.9f));
CFont::PrintString(SCREEN_SCALE_X(26.0f), SCREEN_SCALE_Y(28.0f + (150.0f - PagerXOffset) * 0.6f), CHud::m_HelpMessageToPrint);
CFont::SetAlphaFade(255.0f);
}
}
else
m_HelpMessageState = 0;
for (int i = 0; i < ARRAY_SIZE(CTheScripts::IntroTextLines); i++) {
intro_text_line &line = CTheScripts::IntroTextLines[i];
if (line.m_Text[0] != '\0' && !line.m_bTextBeforeFade) {
CFont::SetScale(SCREEN_SCALE_X(line.m_fScaleX), SCREEN_SCALE_Y(line.m_fScaleY) / 2);
CFont::SetColor(line.m_sColor);
if (line.m_bJustify)
CFont::SetJustifyOn();
else
CFont::SetJustifyOff();
if (line.m_bRightJustify)
CFont::SetRightJustifyOn();
else
CFont::SetRightJustifyOff();
if (line.m_bCentered)
CFont::SetCentreOn();
else
CFont::SetCentreOff();
CFont::SetWrapx(SCREEN_SCALE_X(line.m_fWrapX));
CFont::SetCentreSize(SCREEN_SCALE_X(line.m_fCenterSize));
if (line.m_bBackground)
CFont::SetBackgroundOn();
else
CFont::SetBackgroundOff();
CFont::SetBackgroundColor(line.m_sBackgroundColor);
if (line.m_bBackgroundOnly)
CFont::SetBackGroundOnlyTextOn();
else
CFont::SetBackGroundOnlyTextOff();
if (line.m_bTextProportional)
CFont::SetPropOn();
else
CFont::SetPropOff();
CFont::SetFontStyle(line.m_nFont);
CFont::PrintString(SCREEN_SCALE_X(DEFAULT_SCREEN_WIDTH - line.m_fAtX), SCREEN_SCALE_Y(DEFAULT_SCREEN_HEIGHT - line.m_fAtY), line.m_Text);
}
}
for (int i = 0; i < ARRAY_SIZE(CTheScripts::IntroRectangles); i++) {
intro_script_rectangle &rectangle = CTheScripts::IntroRectangles[i];
if (rectangle.m_bIsUsed && !rectangle.m_bBeforeFade) {
// Yeah, top and bottom changed place. R* vision
if (rectangle.m_nTextureId >= 0) {
CTheScripts::ScriptSprites[rectangle.m_nTextureId].Draw(CRect(rectangle.m_sRect.left, rectangle.m_sRect.bottom,
rectangle.m_sRect.right, rectangle.m_sRect.top), rectangle.m_sColor);
} else {
CSprite2d::DrawRect(CRect(rectangle.m_sRect.left, rectangle.m_sRect.bottom,
rectangle.m_sRect.right, rectangle.m_sRect.top), rectangle.m_sColor);
}
}
}
/*
DrawBigMessage2
@ -1142,10 +1186,9 @@ void CHud::DrawAfterFade()
if (OddJob2OffTimer > 0)
OddJob2OffTimer -= CTimer::GetTimeStepInMilliseconds();
static float fStep;
float fStep;
if (m_BigMessage[5][0] && OddJob2OffTimer <= 0.0f) {
if (OddJob2On <= 3) {
switch (OddJob2On) {
switch (OddJob2On) {
case 0:
OddJob2On = 1;
OddJob2XOffset = 380.0f;
@ -1156,9 +1199,7 @@ void CHud::DrawAfterFade()
OddJob2On = 2;
}
else {
fStep = 40.0f;
if ((OddJob2XOffset / 6.0f) <= 40.0f)
fStep = OddJob2XOffset / 6.0f;
fStep = min(40.0f, OddJob2XOffset / 6.0f);
OddJob2XOffset = OddJob2XOffset - fStep;
}
break;
@ -1169,9 +1210,7 @@ void CHud::DrawAfterFade()
}
break;
case 3:
fStep = 30.0f;
if ((OddJob2XOffset / 5.0f) >= 30.0f)
fStep = OddJob2XOffset / 5.0f;
fStep = max(30.0f, OddJob2XOffset / 5.0f);
OddJob2XOffset = OddJob2XOffset - fStep;
@ -1182,7 +1221,6 @@ void CHud::DrawAfterFade()
break;
default:
break;
}
}
if (!m_BigMessage[1][0]) {
@ -1216,10 +1254,10 @@ void CHud::DrawAfterFade()
CFont::SetScale(SCREEN_SCALE_X(1.04f), SCREEN_SCALE_Y(1.6f));
CFont::SetPropOn();
CFont::SetRightJustifyWrap(-500.0f);
CFont::SetRightJustifyWrap(SCREEN_SCALE_X(-500.0f));
CFont::SetRightJustifyOn();
CFont::SetFontStyle(FONT_HEADING);
if (BigMessageX[1] >= (SCREEN_WIDTH - 20)) {
if (BigMessageX[1] >= SCREEN_SCALE_FROM_RIGHT(20.0f)) {
BigMessageInUse[1] += CTimer::GetTimeStep();
if (BigMessageInUse[1] >= 120.0f) {
@ -1230,12 +1268,11 @@ void CHud::DrawAfterFade()
m_BigMessage[1][0] = 0;
BigMessageAlpha[1] = 0.0f;
}
}
else {
} else {
BigMessageX[1] += (CTimer::GetTimeStepInMilliseconds() * 0.3f);
BigMessageAlpha[1] += (CTimer::GetTimeStepInMilliseconds() * 0.3f);
if (BigMessageAlpha[1] >= 255.0f)
if (BigMessageAlpha[1] > 255.0f)
BigMessageAlpha[1] = 255.0f;
}
@ -1273,7 +1310,7 @@ void CHud::GetRidOfAllHudMessages()
m_HelpMessageFadeTimer = 0;
m_HelpMessageState = 0;
m_HelpMessageQuick = 0;
m_HelpMessageDisplayTime = 1.0f;
m_fHelpMessageTime = 1.0f;
m_VehicleName = nil;
m_pLastVehicleName = nil;
m_pVehicleNameToPrint = nil;
@ -1303,7 +1340,7 @@ void CHud::Initialise()
CTxdStore::PopCurrentTxd();
CTxdStore::SetCurrentTxd(HudTXD);
for (int i = 0; i < ARRAY_SIZE(WeaponFilenames); i++) {
for (int i = 0; i < NUM_HUD_SPRITES; i++) {
Sprites[i].SetTexture(WeaponFilenames[i].name, WeaponFilenames[i].mask);
}
@ -1314,14 +1351,14 @@ void CHud::Initialise()
if (gpRocketSightTex == nil)
gpRocketSightTex = RwTextureRead("siterocket", nil);
CounterOnLastFrame = 0;
CounterOnLastFrame = false;
m_ItemToFlash = ITEM_NONE;
OddJob2Timer = 0;
OddJob2OffTimer = 0.0f;
OddJob2On = 0;
OddJob2XOffset = 0.0f;
CounterFlashTimer = 0;
TimerOnLastFrame = 0;
TimerOnLastFrame = false;
TimerFlashTimer = 0;
SpriteBrightness = 0;
PagerOn = 0;
@ -1338,14 +1375,14 @@ void CHud::ReInitialise() {
GetRidOfAllHudMessages();
CounterOnLastFrame = 0;
CounterOnLastFrame = false;
m_ItemToFlash = ITEM_NONE;
OddJob2Timer = 0;
OddJob2OffTimer = 0.0f;
OddJob2On = 0;
OddJob2XOffset = 0.0f;
CounterFlashTimer = 0;
TimerOnLastFrame = 0;
TimerOnLastFrame = false;
TimerFlashTimer = 0;
SpriteBrightness = 0;
PagerOn = 0;
@ -1435,7 +1472,7 @@ void CHud::SetZoneName(wchar *name)
void CHud::Shutdown()
{
for (int i = 0; i < ARRAY_SIZE(WeaponFilenames); ++i) {
for (int i = 0; i < NUM_HUD_SPRITES; ++i) {
Sprites[i].Delete();
}

View file

@ -27,59 +27,60 @@ enum eSprites
HUD_RADARDISC = 15,
HUD_PAGER = 16,
HUD_SITESNIPER = 20,
HUD_SITEM16 = 21
HUD_SITEM16,
HUD_SITEROCKET,
NUM_HUD_SPRITES,
};
class CHud
{
public:
static CSprite2d *Sprites;
static int32 &SpriteBrightness;
static wchar *m_HelpMessage;
static wchar *m_LastHelpMessage;
static int32 &m_HelpMessageState;
static int32 &m_HelpMessageTimer;
static int32 &m_HelpMessageFadeTimer;
static wchar *m_HelpMessageToPrint;
static CSprite2d Sprites[NUM_HUD_SPRITES];
static wchar m_HelpMessage[256];
static wchar m_LastHelpMessage[256];
static uint32 m_HelpMessageState;
static uint32 m_HelpMessageTimer;
static int32 m_HelpMessageFadeTimer;
static wchar m_HelpMessageToPrint[256];
static float &m_HelpMessageDisplayTime;
static float &m_fTextBoxNumLines;
static float &m_fHelpMessageTime;
static bool &m_HelpMessageQuick;
static int32 m_ZoneState;
static float m_fHelpMessageTime;
static bool m_HelpMessageQuick;
static uint32 m_ZoneState;
static int32 m_ZoneFadeTimer;
static int32 m_ZoneNameTimer;
static wchar *&m_pZoneName;
static uint32 m_ZoneNameTimer;
static wchar *m_pZoneName;
static wchar *m_pLastZoneName;
static wchar *m_ZoneToPrint;
static wchar *&m_VehicleName;
static wchar *m_VehicleName;
static wchar *m_pLastVehicleName;
static wchar *m_pVehicleNameToPrint;
static int32 m_VehicleState;
static uint32 m_VehicleState;
static int32 m_VehicleFadeTimer;
static int32 m_VehicleNameTimer;
static wchar *m_Message;
static wchar *m_PagerMessage;
static bool &m_Wants_To_Draw_Hud;
static bool &m_Wants_To_Draw_3dMarkers;
static wchar(&m_BigMessage)[6][128];
static int16 &m_ItemToFlash;
static uint32 m_VehicleNameTimer;
static wchar m_Message[256];
static wchar m_PagerMessage[256];
static bool m_Wants_To_Draw_Hud;
static bool m_Wants_To_Draw_3dMarkers;
static wchar m_BigMessage[6][128];
static int16 m_ItemToFlash;
// These aren't really in CHud
static float BigMessageInUse[6];
static float BigMessageAlpha[6];
static float BigMessageX[6];
static float &OddJob2OffTimer;
static int8 &CounterOnLastFrame;
static float &OddJob2XOffset;
static int16 &CounterFlashTimer;
static int16 &OddJob2Timer;
static int8 &TimerOnLastFrame;
static int16 &OddJob2On;
static int16 &TimerFlashTimer;
static int16 &PagerSoundPlayed;
static float &PagerXOffset;
static int16 &PagerTimer;
static int16 &PagerOn;
static float OddJob2OffTimer;
static bool CounterOnLastFrame;
static float OddJob2XOffset;
static uint16 CounterFlashTimer;
static uint16 OddJob2Timer;
static bool TimerOnLastFrame;
static int16 OddJob2On;
static uint16 TimerFlashTimer;
static int16 PagerSoundPlayed;
static int32 SpriteBrightness;
static float PagerXOffset;
static int16 PagerTimer;
static int16 PagerOn;
public:
static void Draw();

View file

@ -147,7 +147,11 @@ RwTexDictionaryGtaStreamRead2(RwStream *stream, RwTexDictionary *texDict)
}
#ifdef GTA_PC
#ifdef RWLIBS
extern "C" RwInt32 _rwD3D8FindCorrectRasterFormat(RwRasterType type, RwInt32 flags);
#else
WRAPPER RwInt32 _rwD3D8FindCorrectRasterFormat(RwRasterType type, RwInt32 flags) { EAXJMP(0x59A350); }
#endif
void
ReadVideoCardCapsFile(uint32 &cap32, uint32 &cap24, uint32 &cap16, uint32 &cap8)

View file

@ -11,7 +11,8 @@ typedef RwV3d *(*rwVectorsMultFn) (RwV3d * pointsOut,
const RwV3d * pointsIn,
RwInt32 numPoints,
const RwMatrix * matrix);
#ifndef RWLIBS
WRAPPER void _rwObjectHasFrameSetFrame(void* object, RwFrame* frame) { EAXJMP(0x5BC950); }
WRAPPER RpAtomic* AtomicDefaultRenderCallBack(RpAtomic* atomic) { EAXJMP(0x59E690); }
@ -412,4 +413,427 @@ WRAPPER RxNodeDefinition* RxNodeDefinitionGetAtomicEnumerateLights() { EAXJMP(0x
WRAPPER RxNodeDefinition* RxNodeDefinitionGetMaterialScatter() { EAXJMP(0x5DDAA0); }
WRAPPER RxNodeDefinition* RxNodeDefinitionGetLight() { EAXJMP(0x5DF040); }
WRAPPER RxNodeDefinition* RxNodeDefinitionGetPostLight() { EAXJMP(0x5DF560); }
WRAPPER void RxD3D8AllInOneSetRenderCallBack(RxPipelineNode* node, RxD3D8AllInOneRenderCallBack callback) { EAXJMP(0x5DFC60); }
WRAPPER void RxD3D8AllInOneSetRenderCallBack(RxPipelineNode* node, RxD3D8AllInOneRenderCallBack callback) { EAXJMP(0x5DFC60); }
#else
extern "C"
{
void* _rwFrameOpen(void* instance, RwInt32 offset, RwInt32 size);
void* _rwFrameClose(void* instance, RwInt32 offset, RwInt32 size);
RwFrame* _rwFrameCloneAndLinkClones(RwFrame* root);
RwFrame* _rwFramePurgeClone(RwFrame* root);
RwBool RwFrameDirty(RwFrame const* frame);
void _rwFrameInit(RwFrame* frame);
RwBool _rwMatrixSetMultFn(rwMatrixMultFn multMat);
void* _rwMatrixClose(void* instance, RwInt32 offset, RwInt32 size);
void* _rwMatrixOpen(void* instance, RwInt32 offset, RwInt32 size);
RwBool _rwVectorSetMultFn(rwVectorMultFn multPoint, rwVectorsMultFn multPoints, rwVectorMultFn multVector, rwVectorsMultFn multVectors);
void* _rwVectorClose(void* instance, RwInt32 offset, RwInt32 size);
void* _rwVectorOpen(void* instance, RwInt32 offset, RwInt32 size);
RwBool _rwPluginRegistryOpen();
RwBool _rwPluginRegistryClose();
}
STARTPATCHES
InjectHook(0x5BC950, &_rwObjectHasFrameSetFrame, PATCH_JUMP);
InjectHook(0x59E690, &AtomicDefaultRenderCallBack, PATCH_JUMP);
InjectHook(0x59E6C0, &_rpAtomicResyncInterpolatedSphere, PATCH_JUMP);
InjectHook(0x59E800, &RpAtomicGetWorldBoundingSphere, PATCH_JUMP);
InjectHook(0x59ED50, &RpClumpGetNumAtomics, PATCH_JUMP);
InjectHook(0x59ED80, &RpClumpRender, PATCH_JUMP);
InjectHook(0x59EDD0, &RpClumpForAllAtomics, PATCH_JUMP);
InjectHook(0x59EE10, &RpClumpForAllCameras, PATCH_JUMP);
InjectHook(0x59EE60, &RpClumpForAllLights, PATCH_JUMP);
InjectHook(0x59EEB0, &RpAtomicCreate, PATCH_JUMP);
InjectHook(0x59EFA0, &RpAtomicSetGeometry, PATCH_JUMP);
InjectHook(0x59F020, &RpAtomicDestroy, PATCH_JUMP);
InjectHook(0x59F0A0, &RpAtomicClone, PATCH_JUMP);
InjectHook(0x59F1B0, &RpClumpClone, PATCH_JUMP);
InjectHook(0x59F490, &RpClumpCreate, PATCH_JUMP);
InjectHook(0x59F500, &RpClumpDestroy, PATCH_JUMP);
InjectHook(0x59F680, &RpClumpAddAtomic, PATCH_JUMP);
InjectHook(0x59F6B0, &RpClumpRemoveAtomic, PATCH_JUMP);
InjectHook(0x59F6E0, &RpClumpRemoveLight, PATCH_JUMP);
InjectHook(0x59FC50, &RpClumpStreamRead, PATCH_JUMP);
InjectHook(0x5A0510, &RpAtomicRegisterPlugin, PATCH_JUMP);
InjectHook(0x5A0540, &RpClumpRegisterPlugin, PATCH_JUMP);
InjectHook(0x5A0570, &RpAtomicRegisterPluginStream, PATCH_JUMP);
InjectHook(0x5A05A0, &RpAtomicSetStreamAlwaysCallBack, PATCH_JUMP);
InjectHook(0x5A05C0, &RpAtomicSetStreamRightsCallBack, PATCH_JUMP);
InjectHook(0x5A05E0, &RpAtomicGetPluginOffset, PATCH_JUMP);
InjectHook(0x5A0600, &RpAtomicSetFrame, PATCH_JUMP);
InjectHook(0x5A0DC0, &RwEngineRegisterPlugin, PATCH_JUMP);
InjectHook(0x5A0DF0, &RwEngineGetPluginOffset, PATCH_JUMP);
InjectHook(0x5A0E10, &RwEngineGetNumSubSystems, PATCH_JUMP);
InjectHook(0x5A0E40, &RwEngineGetSubSystemInfo, PATCH_JUMP);
InjectHook(0x5A0E70, &RwEngineGetCurrentSubSystem, PATCH_JUMP);
InjectHook(0x5A0EA0, &RwEngineSetSubSystem, PATCH_JUMP);
InjectHook(0x5A0ED0, &RwEngineGetNumVideoModes, PATCH_JUMP);
InjectHook(0x5A0F00, &RwEngineGetVideoModeInfo, PATCH_JUMP);
InjectHook(0x5A0F30, &RwEngineGetCurrentVideoMode, PATCH_JUMP);
InjectHook(0x5A0F60, &RwEngineSetVideoMode, PATCH_JUMP);
InjectHook(0x5A0F90, &RwEngineStop, PATCH_JUMP);
InjectHook(0x5A0FE0, &RwEngineStart, PATCH_JUMP);
InjectHook(0x5A1070, &RwEngineClose, PATCH_JUMP);
InjectHook(0x5A10E0, &RwEngineOpen, PATCH_JUMP);
InjectHook(0x5A1290, &RwEngineTerm, PATCH_JUMP);
InjectHook(0x5A12D0, &RwEngineInit, PATCH_JUMP);
InjectHook(0x5A15E0, &_rwFrameOpen, PATCH_JUMP);
InjectHook(0x5A1650, &_rwFrameClose, PATCH_JUMP);
InjectHook(0x5A1690, &_rwFrameCloneAndLinkClones, PATCH_JUMP);
InjectHook(0x5A1880, &_rwFramePurgeClone, PATCH_JUMP);
InjectHook(0x5A1930, &RwFrameDirty, PATCH_JUMP);
InjectHook(0x5A1950, &_rwFrameInit, PATCH_JUMP);
InjectHook(0x5A1A00, &RwFrameCreate, PATCH_JUMP);
InjectHook(0x5A1A30, &RwFrameDestroy, PATCH_JUMP);
InjectHook(0x5A1BF0, &RwFrameDestroyHierarchy, PATCH_JUMP);
InjectHook(0x5A1C60, &RwFrameUpdateObjects, PATCH_JUMP);
InjectHook(0x5A1CE0, &RwFrameGetLTM, PATCH_JUMP);
InjectHook(0x5A1D00, &RwFrameAddChild, PATCH_JUMP);
InjectHook(0x5A1ED0, &RwFrameRemoveChild, PATCH_JUMP);
InjectHook(0x5A1FC0, &RwFrameForAllChildren, PATCH_JUMP);
InjectHook(0x5A2000, &RwFrameTranslate, PATCH_JUMP);
InjectHook(0x5A20A0, &RwFrameScale, PATCH_JUMP);
InjectHook(0x5A2140, &RwFrameTransform, PATCH_JUMP);
InjectHook(0x5A21E0, &RwFrameRotate, PATCH_JUMP);
InjectHook(0x5A2280, &RwFrameSetIdentity, PATCH_JUMP);
InjectHook(0x5A2340, &RwFrameForAllObjects, PATCH_JUMP);
InjectHook(0x5A2380, &RwFrameRegisterPlugin, PATCH_JUMP);
InjectHook(0x5A23B0, &_rwMatrixSetMultFn, PATCH_JUMP);
InjectHook(0x5A2520, &_rwMatrixDeterminant, PATCH_JUMP);
InjectHook(0x5A2570, &_rwMatrixOrthogonalError, PATCH_JUMP);
InjectHook(0x5A25D0, &_rwMatrixNormalError, PATCH_JUMP);
InjectHook(0x5A2660, &_rwMatrixIdentityError, PATCH_JUMP);
InjectHook(0x5A2730, &_rwMatrixClose, PATCH_JUMP);
InjectHook(0x5A2770, &_rwMatrixOpen, PATCH_JUMP);
InjectHook(0x5A2820, &RwMatrixOptimize, PATCH_JUMP);
InjectHook(0x5A28E0, &RwMatrixUpdate, PATCH_JUMP);
InjectHook(0x5A28F0, &RwMatrixMultiply, PATCH_JUMP);
InjectHook(0x5A2960, &RwMatrixRotateOneMinusCosineSine, PATCH_JUMP);
InjectHook(0x5A2BF0, &RwMatrixRotate, PATCH_JUMP);
InjectHook(0x5A2C90, &RwMatrixInvert, PATCH_JUMP);
InjectHook(0x5A2EE0, &RwMatrixScale, PATCH_JUMP);
InjectHook(0x5A3070, &RwMatrixTranslate, PATCH_JUMP);
InjectHook(0x5A31C0, &RwMatrixTransform, PATCH_JUMP);
InjectHook(0x5A3300, &RwMatrixDestroy, PATCH_JUMP);
InjectHook(0x5A3330, &RwMatrixCreate, PATCH_JUMP);
InjectHook(0x5A3450, &_rwVectorSetMultFn, PATCH_JUMP);
InjectHook(0x5A3600, &_rwV3dNormalize, PATCH_JUMP);
InjectHook(0x5A36A0, &RwV3dLength, PATCH_JUMP);
InjectHook(0x5A3710, &_rwSqrt, PATCH_JUMP);
InjectHook(0x5A3770, &_rwInvSqrt, PATCH_JUMP);
InjectHook(0x5A37D0, &RwV3dTransformPoints, PATCH_JUMP);
InjectHook(0x5A37E0, &RwV3dTransformVectors, PATCH_JUMP);
InjectHook(0x5A37F0, &_rwVectorClose, PATCH_JUMP);
InjectHook(0x5A3860, &_rwVectorOpen, PATCH_JUMP);
InjectHook(0x5A3AD0, &RwStreamRead, PATCH_JUMP);
InjectHook(0x5A3C30, &RwStreamWrite, PATCH_JUMP);
InjectHook(0x5A3DF0, &RwStreamSkip, PATCH_JUMP);
InjectHook(0x5A3F10, &RwStreamClose, PATCH_JUMP);
InjectHook(0x5A3FE0, &RwStreamOpen, PATCH_JUMP);
InjectHook(0x5A43A0, &RwIm2DGetNearScreenZ, PATCH_JUMP);
InjectHook(0x5A43B0, &RwIm2DGetFarScreenZ, PATCH_JUMP);
InjectHook(0x5A43C0, &RwRenderStateSet, PATCH_JUMP);
InjectHook(0x5A4410, &RwRenderStateGet, PATCH_JUMP);
InjectHook(0x5A4420, &RwIm2DRenderLine, PATCH_JUMP);
InjectHook(0x5A4430, &RwIm2DRenderPrimitive, PATCH_JUMP);
InjectHook(0x5A4440, &RwIm2DRenderIndexedPrimitive, PATCH_JUMP);
InjectHook(0x5A5020, &RwCameraEndUpdate, PATCH_JUMP);
InjectHook(0x5A5030, &RwCameraBeginUpdate, PATCH_JUMP);
InjectHook(0x5A5040, &RwCameraSetViewOffset, PATCH_JUMP);
InjectHook(0x5A5070, &RwCameraSetNearClipPlane, PATCH_JUMP);
InjectHook(0x5A5140, &RwCameraSetFarClipPlane, PATCH_JUMP);
InjectHook(0x5A5170, &RwCameraFrustumTestSphere, PATCH_JUMP);
InjectHook(0x5A51E0, &RwCameraClear, PATCH_JUMP);
InjectHook(0x5A5210, &RwCameraShowRaster, PATCH_JUMP);
InjectHook(0x5A5240, &RwCameraSetProjection, PATCH_JUMP);
InjectHook(0x5A52B0, &RwCameraSetViewWindow, PATCH_JUMP);
InjectHook(0x5A52F0, &RwCameraRegisterPlugin, PATCH_JUMP);
InjectHook(0x5A5320, &RwCameraDestroy, PATCH_JUMP);
InjectHook(0x5A5360, &RwCameraCreate, PATCH_JUMP);
InjectHook(0x5A7100, &RwTextureSetMipmapping, PATCH_JUMP);
InjectHook(0x5A7120, &RwTextureGetMipmapping, PATCH_JUMP);
InjectHook(0x5A7130, &RwTextureSetAutoMipmapping, PATCH_JUMP);
InjectHook(0x5A7150, &RwTextureGetAutoMipmapping, PATCH_JUMP);
InjectHook(0x5A7160, &RwTexDictionaryCreate, PATCH_JUMP);
InjectHook(0x5A7200, &RwTexDictionaryDestroy, PATCH_JUMP);
InjectHook(0x5A7290, &RwTexDictionaryForAllTextures, PATCH_JUMP);
InjectHook(0x5A72D0, &RwTextureCreate, PATCH_JUMP);
InjectHook(0x5A7330, &RwTextureDestroy, PATCH_JUMP);
InjectHook(0x5A73B0, &RwTextureSetName, PATCH_JUMP);
InjectHook(0x5A7420, &RwTextureSetMaskName, PATCH_JUMP);
InjectHook(0x5A7490, &RwTexDictionaryAddTexture, PATCH_JUMP);
InjectHook(0x5A74D0, &RwTexDictionaryFindNamedTexture, PATCH_JUMP);
InjectHook(0x5A7550, &RwTexDictionarySetCurrent, PATCH_JUMP);
InjectHook(0x5A7570, &RwTexDictionaryGetCurrent, PATCH_JUMP);
InjectHook(0x5A7580, &RwTextureRead, PATCH_JUMP);
InjectHook(0x5A7780, &RwTextureRasterGenerateMipmaps, PATCH_JUMP);
InjectHook(0x5A9120, &RwImageCreate, PATCH_JUMP);
InjectHook(0x5A9180, &RwImageDestroy, PATCH_JUMP);
InjectHook(0x5A91E0, &RwImageAllocatePixels, PATCH_JUMP);
InjectHook(0x5A92A0, &RwImageFreePixels, PATCH_JUMP);
InjectHook(0x5A92D0, &RwImageMakeMask, PATCH_JUMP);
InjectHook(0x5A93A0, &RwImageApplyMask, PATCH_JUMP);
InjectHook(0x5A9750, &RwImageSetPath, PATCH_JUMP);
InjectHook(0x5A9810, &RwImageRead, PATCH_JUMP);
InjectHook(0x5A9B40, &RwImageFindFileType, PATCH_JUMP);
InjectHook(0x5A9C10, &RwImageReadMaskedImage, PATCH_JUMP);
InjectHook(0x5A9F50, &RwImageCopy, PATCH_JUMP);
InjectHook(0x5AA130, &RwImageGammaCorrect, PATCH_JUMP);
InjectHook(0x5AA2C0, &RwImageSetGamma, PATCH_JUMP);
InjectHook(0x5AA4E0, &_rwStreamWriteVersionedChunkHeader, PATCH_JUMP);
InjectHook(0x5AA540, &RwStreamFindChunk, PATCH_JUMP);
InjectHook(0x5AA640, &RwMemLittleEndian32, PATCH_JUMP);
InjectHook(0x5AA650, &RwMemNative32, PATCH_JUMP);
InjectHook(0x5AA660, &RwMemFloat32ToReal, PATCH_JUMP);
InjectHook(0x5AA680, &RwStreamWriteReal, PATCH_JUMP);
InjectHook(0x5AA720, &RwStreamWriteInt32, PATCH_JUMP);
InjectHook(0x5AA740, &RwStreamReadReal, PATCH_JUMP);
InjectHook(0x5AA7B0, &RwStreamReadInt32, PATCH_JUMP);
InjectHook(0x5AA800, &RwTextureStreamGetSize, PATCH_JUMP);
InjectHook(0x5AA870, &RwTextureStreamWrite, PATCH_JUMP);
InjectHook(0x5AAA40, &RwTextureStreamRead, PATCH_JUMP);
InjectHook(0x5AB020, &RwTexDictionaryStreamWrite, PATCH_JUMP);
InjectHook(0x5AC890, &RpMorphTargetCalcBoundingSphere, PATCH_JUMP);
InjectHook(0x5AC9A0, &RpGeometryAddMorphTargets, PATCH_JUMP);
InjectHook(0x5ACB60, &RpGeometryTriangleSetVertexIndices, PATCH_JUMP);
InjectHook(0x5ACB90, &RpGeometryTriangleSetMaterial, PATCH_JUMP);
InjectHook(0x5ACBF0, &RpGeometryForAllMaterials, PATCH_JUMP);
InjectHook(0x5ACC30, &RpGeometryLock, PATCH_JUMP);
InjectHook(0x5ACC60, &RpGeometryUnlock, PATCH_JUMP);
InjectHook(0x5ACD10, &RpGeometryCreate, PATCH_JUMP);
InjectHook(0x5ACF40, &_rpGeometryAddRef, PATCH_JUMP);
InjectHook(0x5ACF50, &RpGeometryDestroy, PATCH_JUMP);
InjectHook(0x5ACFF0, &RpGeometryRegisterPlugin, PATCH_JUMP);
InjectHook(0x5AD020, &RpGeometryRegisterPluginStream, PATCH_JUMP);
InjectHook(0x5AD050, &RpGeometryStreamRead, PATCH_JUMP);
InjectHook(0x5AD6D0, &RwRasterGetCurrentContext, PATCH_JUMP);
InjectHook(0x5AD6F0, &RwRasterUnlock, PATCH_JUMP);
InjectHook(0x5AD710, &RwRasterRenderFast, PATCH_JUMP);
InjectHook(0x5AD750, &RwRasterUnlockPalette, PATCH_JUMP);
InjectHook(0x5AD780, &RwRasterDestroy, PATCH_JUMP);
InjectHook(0x5AD7C0, &RwRasterPushContext, PATCH_JUMP);
InjectHook(0x5AD810, &RwRasterRegisterPlugin, PATCH_JUMP);
InjectHook(0x5AD840, &RwRasterLockPalette, PATCH_JUMP);
InjectHook(0x5AD870, &RwRasterPopContext, PATCH_JUMP);
InjectHook(0x5AD8C0, &RwRasterGetNumLevels, PATCH_JUMP);
InjectHook(0x5AD900, &RwRasterShowRaster, PATCH_JUMP);
InjectHook(0x5AD930, &RwRasterCreate, PATCH_JUMP);
InjectHook(0x5AD9D0, &RwRasterLock, PATCH_JUMP);
InjectHook(0x5ADC30, &RpMaterialCreate, PATCH_JUMP);
InjectHook(0x5ADCB0, &RpMaterialDestroy, PATCH_JUMP);
InjectHook(0x5ADD10, &RpMaterialSetTexture, PATCH_JUMP);
InjectHook(0x5ADD40, &RpMaterialRegisterPlugin, PATCH_JUMP);
InjectHook(0x5ADD70, &RpMaterialRegisterPluginStream, PATCH_JUMP);
InjectHook(0x5ADDA0, &RpMaterialStreamRead, PATCH_JUMP);
InjectHook(0x5AE0B0, &_rpSectorDefaultRenderCallBack, PATCH_JUMP);
InjectHook(0x5AE100, &_rpWorldForAllGlobalLights, PATCH_JUMP);
InjectHook(0x5AE150, &_rpWorldSectorForAllLocalLights, PATCH_JUMP);
InjectHook(0x5AE190, &RpWorldUnlock, PATCH_JUMP);
InjectHook(0x5AE2B0, &RpWorldSectorGetWorld, PATCH_JUMP);
InjectHook(0x5AE340, &RpWorldDestroy, PATCH_JUMP);
InjectHook(0x5AE6A0, &RpWorldCreate, PATCH_JUMP);
InjectHook(0x5AEA40, &RpWorldRegisterPlugin, PATCH_JUMP);
InjectHook(0x5AEA70, &RpWorldRegisterPluginStream, PATCH_JUMP);
InjectHook(0x5AEAA0, &RpWorldPluginAttach, PATCH_JUMP);
InjectHook(0x5AFB80, &RpWorldAddCamera, PATCH_JUMP);
InjectHook(0x5AFBB0, &RpWorldRemoveCamera, PATCH_JUMP);
InjectHook(0x5AFC10, &RpAtomicGetWorld, PATCH_JUMP);
InjectHook(0x5AFC20, &RpWorldAddClump, PATCH_JUMP);
InjectHook(0x5AFDA0, &RpWorldAddLight, PATCH_JUMP);
InjectHook(0x5AFDF0, &RpWorldRemoveLight, PATCH_JUMP);
InjectHook(0x5AFE70, &RtBMPImageRead, PATCH_JUMP);
InjectHook(0x5B07D0, &RpSkinPluginAttach, PATCH_JUMP);
InjectHook(0x5B1050, &RpSkinAtomicSetHAnimHierarchy, PATCH_JUMP);
InjectHook(0x5B1070, &RpSkinAtomicGetHAnimHierarchy, PATCH_JUMP);
InjectHook(0x5B1080, &RpSkinGeometryGetSkin, PATCH_JUMP);
InjectHook(0x5B1090, &RpSkinGeometrySetSkin, PATCH_JUMP);
InjectHook(0x5B10D0, &RpSkinGetSkinToBoneMatrices, PATCH_JUMP);
InjectHook(0x5B10E0, &RpHAnimHierarchyCreate, PATCH_JUMP);
InjectHook(0x5B11F0, &RpHAnimFrameGetHierarchy, PATCH_JUMP);
InjectHook(0x5B1200, &RpHAnimHierarchySetCurrentAnim, PATCH_JUMP);
InjectHook(0x5B12B0, &RpHAnimHierarchySubAnimTime, PATCH_JUMP);
InjectHook(0x5B1480, &RpHAnimHierarchyAddAnimTime, PATCH_JUMP);
InjectHook(0x5B1780, &RpHAnimHierarchyUpdateMatrices, PATCH_JUMP);
InjectHook(0x5B1C10, &RpHAnimAnimationStreamRead, PATCH_JUMP);
InjectHook(0x5B1D50, &RpHAnimPluginAttach, PATCH_JUMP);
InjectHook(0x5B2640, &RpMatFXPluginAttach, PATCH_JUMP);
InjectHook(0x5B3750, &RpMatFXAtomicEnableEffects, PATCH_JUMP);
InjectHook(0x5B3780, &RpMatFXMaterialSetEffects, PATCH_JUMP);
InjectHook(0x5B38D0, &RpMatFXMaterialSetupEnvMap, PATCH_JUMP);
InjectHook(0x5B3A40, &RpMatFXMaterialSetBumpMapTexture, PATCH_JUMP);
InjectHook(0x5B3CF0, &RwD3D8SetRenderState, PATCH_JUMP);
InjectHook(0x5B3D40, &RwD3D8GetRenderState, PATCH_JUMP);
InjectHook(0x5B3D60, &RwD3D8SetTextureStageState, PATCH_JUMP);
InjectHook(0x5B53A0, &RwD3D8SetTexture, PATCH_JUMP);
InjectHook(0x5B6720, &RwIm3DTransform, PATCH_JUMP);
InjectHook(0x5B67F0, &RwIm3DEnd, PATCH_JUMP);
InjectHook(0x5B6820, &RwIm3DRenderIndexedPrimitive, PATCH_JUMP);
InjectHook(0x5B6980, &RwIm3DRenderLine, PATCH_JUMP);
InjectHook(0x5B6A50, &RwIm3DSetTransformPipeline, PATCH_JUMP);
InjectHook(0x5B6AC0, &RwIm3DSetRenderPipeline, PATCH_JUMP);
InjectHook(0x5B95D0, &RwD3D8EngineSetRefreshRate, PATCH_JUMP);
InjectHook(0x5B9640, &RwD3D8CameraAttachWindow, PATCH_JUMP);
InjectHook(0x5BAEB0, &RwD3D8DeviceSupportsDXTTexture, PATCH_JUMP);
InjectHook(0x5BAF90, &RwD3D8SetVertexShader, PATCH_JUMP);
InjectHook(0x5BAFD0, &RwD3D8SetPixelShader, PATCH_JUMP);
InjectHook(0x5BB010, &RwD3D8SetStreamSource, PATCH_JUMP);
InjectHook(0x5BB060, &RwD3D8SetIndices, PATCH_JUMP);
InjectHook(0x5BB0B0, &RwD3D8DrawIndexedPrimitive, PATCH_JUMP);
InjectHook(0x5BB140, &RwD3D8DrawPrimitive, PATCH_JUMP);
InjectHook(0x5BB1D0, &RwD3D8SetTransform, PATCH_JUMP);
InjectHook(0x5BB310, &RwD3D8GetTransform, PATCH_JUMP);
InjectHook(0x5BB340, &RwD3D8SetTransformWorld, PATCH_JUMP);
InjectHook(0x5BB490, &RwD3D8SetSurfaceProperties, PATCH_JUMP);
InjectHook(0x5BB7A0, &RwD3D8SetLight, PATCH_JUMP);
InjectHook(0x5BB890, &RwD3D8EnableLight, PATCH_JUMP);
InjectHook(0x5BB9F0, &RwD3D8DynamicVertexBufferCreate, PATCH_JUMP);
InjectHook(0x5BBAE0, &RwD3D8DynamicVertexBufferDestroy, PATCH_JUMP);
InjectHook(0x5BBB10, &RwD3D8IndexBufferCreate, PATCH_JUMP);
InjectHook(0x5BBB40, &RwD3D8CreatePixelShader, PATCH_JUMP);
InjectHook(0x5BBB90, &RwD3D8DeletePixelShader, PATCH_JUMP);
InjectHook(0x5BBC00, &RwD3D8SetPixelShaderConstant, PATCH_JUMP);
InjectHook(0x5BBC30, &RwD3D8GetCaps, PATCH_JUMP);
InjectHook(0x5BBC40, &RwD3D8CameraIsSphereFullyInsideFrustum, PATCH_JUMP);
InjectHook(0x5BBCA0, &RwD3D8CameraIsBBoxFullyInsideFrustum, PATCH_JUMP);
InjectHook(0x5BBD30, &RwD3D8DynamicVertexBufferLock, PATCH_JUMP);
InjectHook(0x5BBEB0, &RwD3D8DynamicVertexBufferUnlock, PATCH_JUMP);
InjectHook(0x5BBED0, &_rwIntelSSEsupported, PATCH_JUMP);
InjectHook(0x5BBF10, &RwImageSetFromRaster, PATCH_JUMP);
InjectHook(0x5BBF50, &RwRasterSetFromImage, PATCH_JUMP);
InjectHook(0x5BBF80, &RwImageFindRasterFormat, PATCH_JUMP);
InjectHook(0x5BBFF0, &RwFrameRegisterPluginStream, PATCH_JUMP);
InjectHook(0x5BC020, &_rwFrameListDeinitialize, PATCH_JUMP);
InjectHook(0x5BC050, &_rwFrameListStreamRead, PATCH_JUMP);
InjectHook(0x5BC300, &RpLightSetRadius, PATCH_JUMP);
InjectHook(0x5BC320, &RpLightSetColor, PATCH_JUMP);
InjectHook(0x5BC370, &RpLightGetConeAngle, PATCH_JUMP);
InjectHook(0x5BC5B0, &RpLightRegisterPlugin, PATCH_JUMP);
InjectHook(0x5BC5E0, &RpLightStreamRead, PATCH_JUMP);
InjectHook(0x5BC780, &RpLightDestroy, PATCH_JUMP);
InjectHook(0x5BC7C0, &RpLightCreate, PATCH_JUMP);
InjectHook(0x5BE280, &_rwD3D8TexDictionaryEnableRasterFormatConversion, PATCH_JUMP);
InjectHook(0x5BF110, &RwOsGetFileInterface, PATCH_JUMP);
InjectHook(0x5C1720, &RwFreeListDestroy, PATCH_JUMP);
InjectHook(0x5C1790, &RwFreeListCreate, PATCH_JUMP);
InjectHook(0x5C19F0, &RwFreeListPurge, PATCH_JUMP);
InjectHook(0x5C1B90, &RwFreeListPurgeAllFreeLists, PATCH_JUMP);
InjectHook(0x5C1D40, &RwFreeListForAllUsed, PATCH_JUMP);
InjectHook(0x5C2780, &_rxPipelineClose, PATCH_JUMP);
InjectHook(0x5C27E0, &_rxPipelineOpen, PATCH_JUMP);
InjectHook(0x5C2AD0, &RxHeapGetGlobalHeap, PATCH_JUMP);
InjectHook(0x5C2AE0, &RxPacketCreate, PATCH_JUMP);
InjectHook(0x5C2B10, &RxClusterSetExternalData, PATCH_JUMP);
InjectHook(0x5C2B70, &RxClusterSetData, PATCH_JUMP);
InjectHook(0x5C2BD0, &RxClusterInitializeData, PATCH_JUMP);
InjectHook(0x5C2C40, &RxClusterResizeData, PATCH_JUMP);
InjectHook(0x5C2C90, &RxClusterLockWrite, PATCH_JUMP);
InjectHook(0x5C2D60, &RxPipelineExecute, PATCH_JUMP);
InjectHook(0x5C2E00, &RxPipelineCreate, PATCH_JUMP);
InjectHook(0x5C2E70, &_rxPipelineDestroy, PATCH_JUMP);
InjectHook(0x5C3080, &RwResourcesFreeResEntry, PATCH_JUMP);
InjectHook(0x5C30F0, &_rwResourcesPurge, PATCH_JUMP);
InjectHook(0x5C3170, &RwResourcesAllocateResEntry, PATCH_JUMP);
InjectHook(0x5C3360, &RwResourcesEmptyArena, PATCH_JUMP);
InjectHook(0x5C3450, &_rwPluginRegistryOpen, PATCH_JUMP);
InjectHook(0x5C3480, &_rwPluginRegistryClose, PATCH_JUMP);
InjectHook(0x5C3590, &_rwPluginRegistryGetPluginOffset, PATCH_JUMP);
InjectHook(0x5C35C0, &_rwPluginRegistryAddPlugin, PATCH_JUMP);
InjectHook(0x5C37F0, &_rwPluginRegistryInitObject, PATCH_JUMP);
InjectHook(0x5C3850, &_rwPluginRegistryDeInitObject, PATCH_JUMP);
InjectHook(0x5C3880, &_rwPluginRegistryCopyObject, PATCH_JUMP);
InjectHook(0x5C3910, &RwErrorSet, PATCH_JUMP);
InjectHook(0x5C3970, &_rwerror, PATCH_JUMP);
InjectHook(0x5C3980, &_rwPluginRegistryAddPluginStream, PATCH_JUMP);
InjectHook(0x5C39C0, &_rwPluginRegistryAddPlgnStrmlwysCB, PATCH_JUMP);
InjectHook(0x5C39F0, &_rwPluginRegistryAddPlgnStrmRightsCB, PATCH_JUMP);
InjectHook(0x5C3A20, & _rwPluginRegistryReadDataChunks, PATCH_JUMP);
InjectHook(0x5C3B50, & _rwPluginRegistryInvokeRights, PATCH_JUMP);
InjectHook(0x5C3BA0, &_rwPluginRegistryGetSize, PATCH_JUMP);
InjectHook(0x5C3BE0, &_rwPluginRegistryWriteDataChunks, PATCH_JUMP);
InjectHook(0x5C3CB0, &_rwPluginRegistrySkipDataChunks, PATCH_JUMP);
InjectHook(0x5C3D30, &RwCameraStreamRead, PATCH_JUMP);
InjectHook(0x5C5570, &RwBBoxCalculate, PATCH_JUMP);
InjectHook(0x5C72B0, &RwImageResample, PATCH_JUMP);
InjectHook(0x5C7B30, &RwImageCreateResample, PATCH_JUMP);
InjectHook(0x5D9240, &RxRenderStateVectorSetDefaultRenderStateVector, PATCH_JUMP);
InjectHook(0x5D9340, &RxRenderStateVectorCreate, PATCH_JUMP);
InjectHook(0x5D9410, &RxRenderStateVectorDestroy, PATCH_JUMP);
InjectHook(0x5D9460, &RxRenderStateVectorLoadDriverState, PATCH_JUMP);
InjectHook(0x5D95D0, &_rxEmbeddedPacketBetweenPipelines, PATCH_JUMP);
InjectHook(0x5D9740, &_rxEmbeddedPacketBetweenNodes, PATCH_JUMP);
InjectHook(0x5D9810, &_rxPacketDestroy, PATCH_JUMP);
InjectHook(0x5C8B10, &_rpMaterialListDeinitialize, PATCH_JUMP);
InjectHook(0x5C8B70, &_rpMaterialListInitialize, PATCH_JUMP);
InjectHook(0x5C8B80, &_rpMaterialListGetMaterial, PATCH_JUMP);
InjectHook(0x5C8B90, &_rpMaterialListAppendMaterial, PATCH_JUMP);
InjectHook(0x5C8C50, &_rpMaterialListFindMaterialIndex, PATCH_JUMP);
InjectHook(0x5C8C80, &_rpMaterialListStreamRead, PATCH_JUMP);
InjectHook(0x5C8FE0, &_rpMeshHeaderCreate, PATCH_JUMP);
InjectHook(0x5C8FF0, &_rpMeshClose, PATCH_JUMP);
InjectHook(0x5C9020, &_rpMeshOpen, PATCH_JUMP);
InjectHook(0x5C9140, &_rpBuildMeshCreate, PATCH_JUMP);
InjectHook(0x5C9220, &_rpBuildMeshDestroy, PATCH_JUMP);
InjectHook(0x5C9260, &_rpMeshDestroy, PATCH_JUMP);
InjectHook(0x5C92A0, &_rpBuildMeshAddTriangle, PATCH_JUMP);
InjectHook(0x5C9380, &_rpMeshHeaderForAllMeshes, PATCH_JUMP);
InjectHook(0x5C93C0, &_rpMeshWrite, PATCH_JUMP);
InjectHook(0x5C9510, &_rpMeshRead, PATCH_JUMP);
InjectHook(0x5C96E0, &_rpMeshSize, PATCH_JUMP);
InjectHook(0x5C9730, &RpBuildMeshGenerateDefaultTriStrip, PATCH_JUMP);
InjectHook(0x5CAE10, &_rpTriListMeshGenerate, PATCH_JUMP);
InjectHook(0x5CB230, &_rpMeshOptimise, PATCH_JUMP);
InjectHook(0x5CB2B0, &RpWorldSectorRegisterPlugin, PATCH_JUMP);
InjectHook(0x5CB2E0, &RpWorldSectorRegisterPluginStream, PATCH_JUMP);
InjectHook(0x5CB630, &RpWorldSetDefaultSectorPipeline, PATCH_JUMP);
InjectHook(0x5CB670, &RpAtomicSetDefaultPipeline, PATCH_JUMP);
InjectHook(0x5CDEE0, &RpHAnimStdKeyFrameToMatrix, PATCH_JUMP);
InjectHook(0x5CE000, &RpHAnimStdKeyFrameInterpolate, PATCH_JUMP);
InjectHook(0x5CE420, &RpHAnimStdKeyFrameBlend, PATCH_JUMP);
InjectHook(0x5CE820, &RpHAnimStdKeyFrameStreamRead, PATCH_JUMP);
InjectHook(0x5CE8C0, &RpHAnimStdKeyFrameStreamWrite, PATCH_JUMP);
InjectHook(0x5CE930, &RpHAnimStdKeyFrameStreamGetSize, PATCH_JUMP);
InjectHook(0x5CE950, &RpHAnimStdKeyFrameMulRecip, PATCH_JUMP);
InjectHook(0x5CEAB0, &RpHAnimStdKeyFrameAdd, PATCH_JUMP);
InjectHook(0x5D1070, &RxHeapFree, PATCH_JUMP);
InjectHook(0x5D1260, &RxHeapAlloc, PATCH_JUMP);
InjectHook(0x5D14D0, &RxHeapRealloc, PATCH_JUMP);
InjectHook(0x5D1680, &_rxHeapReset, PATCH_JUMP);
InjectHook(0x5D16F0, &RxHeapDestroy, PATCH_JUMP);
InjectHook(0x5D1750, &RxHeapCreate, PATCH_JUMP);
InjectHook(0x5D1EC0, &RxPipelineNodeFindOutputByName, PATCH_JUMP);
InjectHook(0x5D1F20, &RxPipelineNodeFindInput, PATCH_JUMP);
InjectHook(0x5D1F30, &RxPipelineNodeRequestCluster, PATCH_JUMP);
InjectHook(0x5D1FA0, &RxLockedPipeUnlock, PATCH_JUMP);
InjectHook(0x5D29F0, &RxPipelineLock, PATCH_JUMP);
InjectHook(0x5D2B10, &RxPipelineFindNodeByName, PATCH_JUMP);
InjectHook(0x5D2BA0, &RxLockedPipeAddFragment, PATCH_JUMP);
InjectHook(0x5D2EE0, &RxLockedPipeAddPath, PATCH_JUMP);
InjectHook(0x5D31C0, &RxNodeDefinitionGetImmRenderSetup, PATCH_JUMP);
InjectHook(0x5D35C0, &RxNodeDefinitionGetImmMangleTriangleIndices, PATCH_JUMP);
InjectHook(0x5D3C60, &RxNodeDefinitionGetCullTriangle, PATCH_JUMP);
InjectHook(0x5D4F80, &RxNodeDefinitionGetClipTriangle, PATCH_JUMP);
InjectHook(0x5D51C0, &RxNodeDefinitionGetSubmitTriangle, PATCH_JUMP);
InjectHook(0x5D5400, &RxNodeDefinitionGetImmInstance, PATCH_JUMP);
InjectHook(0x5D6000, &RxNodeDefinitionGetTransform, PATCH_JUMP);
InjectHook(0x5D61C0, &RxNodeDefinitionGetImmStash, PATCH_JUMP);
InjectHook(0x5D6470, &RxNodeDefinitionGetImmMangleLineIndices, PATCH_JUMP);
InjectHook(0x5D7230, &RxNodeDefinitionGetClipLine, PATCH_JUMP);
InjectHook(0x5D74C0, &RxNodeDefinitionGetSubmitLine, PATCH_JUMP);
InjectHook(0x5D9C90, &_rwD3D8LightsOpen, PATCH_JUMP);
InjectHook(0x5D9EF0, &_rwD3D8LightsClose, PATCH_JUMP);
InjectHook(0x5D9F80, &_rwD3D8LightsGlobalEnable, PATCH_JUMP);
InjectHook(0x5DA210, &_rwD3D8LightLocalEnable, PATCH_JUMP);
InjectHook(0x5DA450, &_rwD3D8LightsEnable, PATCH_JUMP);
InjectHook(0x5DAAC0, &RxNodeDefinitionGetD3D8WorldSectorAllInOne, PATCH_JUMP);
InjectHook(0x5DC500, &RxNodeDefinitionGetD3D8AtomicAllInOne, PATCH_JUMP);
InjectHook(0x5DCC50, &RxNodeDefinitionGetWorldSectorInstance, PATCH_JUMP);
InjectHook(0x5DCD80, &RxNodeDefinitionGetWorldSectorEnumerateLights, PATCH_JUMP);
InjectHook(0x5DD800, &RxNodeDefinitionGetAtomicInstance, PATCH_JUMP);
InjectHook(0x5DD9B0, &RxNodeDefinitionGetAtomicEnumerateLights, PATCH_JUMP);
InjectHook(0x5DDAA0, &RxNodeDefinitionGetMaterialScatter, PATCH_JUMP);
InjectHook(0x5DF040, &RxNodeDefinitionGetLight, PATCH_JUMP);
InjectHook(0x5DF560, &RxNodeDefinitionGetPostLight, PATCH_JUMP);
InjectHook(0x5DFC60, &RxD3D8AllInOneSetRenderCallBack, PATCH_JUMP);
ENDPATCHES
#endif

View file

@ -2814,7 +2814,7 @@ CAutomobile::ProcessBuoyancy(void)
CVector impulse, point;
if(mod_Buoyancy.ProcessBuoyancy(this, m_fBuoyancy, &point, &impulse)){
m_flagD8 = true;
bTouchingWater = true;
ApplyMoveForce(impulse);
ApplyTurnForce(impulse, point);
@ -2899,7 +2899,7 @@ CAutomobile::ProcessBuoyancy(void)
}
}else{
bIsInWater = false;
m_flagD8 = false;
bTouchingWater = false;
static RwRGBA splashCol = {155, 155, 185, 196};
static RwRGBA smokeCol = {255, 255, 255, 255};

View file

@ -70,7 +70,7 @@ CBoat::CBoat(int mi, uint8 owner) : CVehicle(owner)
unk1 = 0.0f;
m_bIsAnchored = true;
field_2C4 = -9999.99f;
m_flagD8 = true;
bTouchingWater = true;
field_2CC = 0.0f;
field_2D0 = 0;
m_nNumWakePoints = 0;

View file

@ -26,7 +26,7 @@ cBuoyancy::ProcessBuoyancy(CPhysical *phys, float buoyancy, CVector *point, CVec
{
m_numSteps = 2.0f;
if(!CWaterLevel::GetWaterLevel(phys->GetPosition(), &m_waterlevel, phys->m_flagD8))
if(!CWaterLevel::GetWaterLevel(phys->GetPosition(), &m_waterlevel, phys->bTouchingWater))
return false;
m_matrix = phys->GetMatrix();