summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Clock.h8
-rw-r--r--src/Streaming.cpp20
-rw-r--r--src/Streaming.h2
-rw-r--r--src/config.h8
-rw-r--r--src/control/PathFind.cpp2
-rw-r--r--src/control/PathFind.h1
-rw-r--r--src/main.cpp9
-rw-r--r--src/modelinfo/ModelInfo.cpp7
-rw-r--r--src/modelinfo/ModelInfo.h2
-rw-r--r--src/re3.cpp140
10 files changed, 187 insertions, 12 deletions
diff --git a/src/Clock.h b/src/Clock.h
index 0b6ba304..e11b2293 100644
--- a/src/Clock.h
+++ b/src/Clock.h
@@ -21,7 +21,11 @@ public:
static void StoreClock(void);
static void RestoreClock(void);
- static int8 GetHours(void) { return ms_nGameClockHours; }
- static int8 GetMinutes(void) { return ms_nGameClockMinutes; }
+ static uint8 GetHours(void) { return ms_nGameClockHours; }
+ static uint8 GetMinutes(void) { return ms_nGameClockMinutes; }
static int16 GetSeconds(void) { return ms_nGameClockSeconds; }
+
+
+ static uint8 &GetHoursRef(void) { return ms_nGameClockHours; }
+ static uint8 &GetMinutesRef(void) { return ms_nGameClockMinutes; }
};
diff --git a/src/Streaming.cpp b/src/Streaming.cpp
index 967b3ec8..65c0b0b8 100644
--- a/src/Streaming.cpp
+++ b/src/Streaming.cpp
@@ -187,6 +187,7 @@ CStreaming::Init(void)
debug("Streaming buffer size is %d sectors", ms_streamingBufferSize);
// PC only, figure out how much memory we got
+#ifdef GTA_PC
#define MB (1024*1024)
extern DWORD &_dwMemAvailPhys;
ms_memoryAvailable = (_dwMemAvailPhys - 10*MB)/2;
@@ -197,6 +198,7 @@ CStreaming::Init(void)
desiredNumVehiclesLoaded = MAXVEHICLESLOADED;
debug("Memory allocated to Streaming is %dMB", ms_memoryAvailable/MB);
#undef MB
+#endif
// find island LODs
@@ -243,14 +245,22 @@ CStreaming::LoadCdDirectory(void)
char dirname[132];
int i;
- // PC specific stuff
+#ifdef GTA_PC
ms_imageOffsets[0] = 0;
- for(i = 1; i < NUMCDIMAGES; i++)
- ms_imageOffsets[i] = -1;
+ ms_imageOffsets[1] = -1;
+ ms_imageOffsets[2] = -1;
+ ms_imageOffsets[3] = -1;
+ ms_imageOffsets[4] = -1;
+ ms_imageOffsets[5] = -1;
+ ms_imageOffsets[6] = -1;
+ ms_imageOffsets[7] = -1;
+ ms_imageOffsets[8] = -1;
+ ms_imageOffsets[9] = -1;
+ ms_imageOffsets[10] = -1;
+ ms_imageOffsets[11] = -1;
ms_imageSize = GetGTA3ImgSize();
-
// PS2 uses CFileMgr::GetCdFile on all IMG files to fill the array
-
+#endif
i = CdStreamGetNumImages();
while(i-- >= 1){
diff --git a/src/Streaming.h b/src/Streaming.h
index a2ff2f5b..f35c56d5 100644
--- a/src/Streaming.h
+++ b/src/Streaming.h
@@ -170,4 +170,6 @@ public:
static void LoadInitialVehicles(void);
static void LoadScene(const CVector &pos);
+
+ static bool IsModelLoaded(int32 id) { return ms_aInfoForModel[id].m_loadState == STREAMSTATE_LOADED; }
};
diff --git a/src/config.h b/src/config.h
index 83aa7b8f..53a7ad11 100644
--- a/src/config.h
+++ b/src/config.h
@@ -62,6 +62,12 @@ enum Config {
NUMPICKUPS = 336,
};
+// We don't expect to compile for PS2 or Xbox
+// but it might be interesting for documentation purposes
+#define GTA_PC
+//#define GTA_PS2
+//#define GTA_XBOX
+
#define GTA3_1_1_PATCH
#define USE_PS2_RAND
#define RANDOMSPLASH
@@ -70,4 +76,4 @@ enum Config {
//#define NO_CDCHECK
#define NO_MOVIES
//#define USE_MY_DOCUMENTS
-#define NASTY_GAME \ No newline at end of file
+#define NASTY_GAME
diff --git a/src/control/PathFind.cpp b/src/control/PathFind.cpp
index c3af2e30..f511b5dc 100644
--- a/src/control/PathFind.cpp
+++ b/src/control/PathFind.cpp
@@ -4,6 +4,8 @@
CPathFind &ThePaths = *(CPathFind*)0x8F6754;
+WRAPPER int32 CPathFind::FindNodeClosestToCoors(CVector coors, uint8 type, float distLimit, bool disabled, bool betweenLevels) { EAXJMP(0x42CC30); }
+
int TempListLength;
enum
diff --git a/src/control/PathFind.h b/src/control/PathFind.h
index 83b89953..cc0b0a2f 100644
--- a/src/control/PathFind.h
+++ b/src/control/PathFind.h
@@ -128,6 +128,7 @@ public:
void StoreNodeInfoPed(int16 id, int16 node, int8 type, int8 next, int16 x, int16 y, int16 z, int16 width, bool crossing);
void StoreNodeInfoCar(int16 id, int16 node, int8 type, int8 next, int16 x, int16 y, int16 z, int16 width, int8 numLeft, int8 numRight);
void RegisterMapObject(CTreadable *mapObject);
+ int32 FindNodeClosestToCoors(CVector coors, uint8 type, float distLimit, bool disabled, bool betweenLevels);
bool IsPathObject(int id) { return id < PATHNODESIZE && (InfoForTileCars[id*12].type != 0 || InfoForTilePeds[id*12].type != 0); }
};
diff --git a/src/main.cpp b/src/main.cpp
index 0dadc131..d1ffbe6b 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -84,6 +84,7 @@ void DestroySplashScreen(void);
extern void (*DebugMenuProcess)(void);
extern void (*DebugMenuRender)(void);
void DebugMenuInit(void);
+void DebugMenuPopulate(void);
void PrintGameVersion();
@@ -115,6 +116,13 @@ Idle(void *arg)
if((!FrontEndMenuManager.m_bMenuActive || FrontEndMenuManager.field_452 == 1) &&
TheCamera.GetScreenFadeStatus() != FADE_2){
+#ifdef GTA_PC
+ // This is from SA, but it's nice for windowed mode
+ RwV2d pos;
+ pos.x = SCREENW/2.0f;
+ pos.y = SCREENH/2.0f;
+ RsMouseSetPos(&pos);
+#endif
CRenderer::ConstructRenderList();
CRenderer::PreRender();
@@ -677,6 +685,7 @@ Initialise3D(void *param)
{
//
DebugMenuInit();
+ DebugMenuPopulate();
//
return CGame::InitialiseRenderWare();
diff --git a/src/modelinfo/ModelInfo.cpp b/src/modelinfo/ModelInfo.cpp
index ca36aa61..acc40824 100644
--- a/src/modelinfo/ModelInfo.cpp
+++ b/src/modelinfo/ModelInfo.cpp
@@ -168,6 +168,13 @@ CModelInfo::GetModelInfo(const char *name, int *id)
return nil;
}
+bool
+CModelInfo::IsBoatModel(int32 id)
+{
+ return GetModelInfo(id)->m_type == MITYPE_VEHICLE &&
+ ((CVehicleModelInfo*)GetModelInfo(id))->m_vehicleType == VEHICLE_TYPE_BOAT;
+}
+
STARTPATCHES
InjectHook(0x50B310, CModelInfo::Initialise, PATCH_JUMP);
InjectHook(0x50B5B0, CModelInfo::ShutDown, PATCH_JUMP);
diff --git a/src/modelinfo/ModelInfo.h b/src/modelinfo/ModelInfo.h
index 4ab633bf..30be96ca 100644
--- a/src/modelinfo/ModelInfo.h
+++ b/src/modelinfo/ModelInfo.h
@@ -34,4 +34,6 @@ public:
static CBaseModelInfo *GetModelInfo(int id){
return ms_modelInfoPtrs[id];
}
+
+ static bool IsBoatModel(int32 id);
};
diff --git a/src/re3.cpp b/src/re3.cpp
index 948d9aa0..284b88de 100644
--- a/src/re3.cpp
+++ b/src/re3.cpp
@@ -6,6 +6,14 @@
#include "Renderer.h"
#include "Credits.h"
#include "Camera.h"
+#include "Weather.h"
+#include "Clock.h"
+#include "World.h"
+#include "Vehicle.h"
+#include "Streaming.h"
+#include "PathFind.h"
+#include "Boat.h"
+#include "Automobile.h"
#include "debugmenu_public.h"
void **rwengine = *(void***)0x5A10E1;
@@ -49,12 +57,20 @@ int (*open_script_orig)(const char *path, const char *mode);
int
open_script(const char *path, const char *mode)
{
+ static int scriptToLoad = 1;
+
if(GetAsyncKeyState('G') & 0x8000)
- return open_script_orig("main.scm", mode);
+ scriptToLoad = 0;
+ if(GetAsyncKeyState('R') & 0x8000)
+ scriptToLoad = 1;
if(GetAsyncKeyState('D') & 0x8000)
- return open_script_orig("main_d.scm", mode);
-// if(GetAsyncKeyState('R') & 0x8000)
- return open_script_orig("main_freeroam.scm", mode);
+ scriptToLoad = 2;
+
+ switch(scriptToLoad){
+ case 0: return open_script_orig(path, mode);
+ case 1: return open_script_orig("main_freeroam.scm", mode);
+ case 2: return open_script_orig("main_d.scm", mode);
+ }
return open_script_orig(path, mode);
}
@@ -78,10 +94,126 @@ DebugMenuInit(void)
}
+void WeaponCheat();
+void HealthCheat();
+void TankCheat();
+void BlowUpCarsCheat();
+void ChangePlayerCheat();
+void MayhemCheat();
+void EverybodyAttacksPlayerCheat();
+void WeaponsForAllCheat();
+void FastTimeCheat();
+void SlowTimeCheat();
+void MoneyCheat();
+void ArmourCheat();
+void WantedLevelUpCheat();
+void WantedLevelDownCheat();
+void SunnyWeatherCheat();
+void CloudyWeatherCheat();
+void RainyWeatherCheat();
+void FoggyWeatherCheat();
+void FastWeatherCheat();
+void OnlyRenderWheelsCheat();
+void ChittyChittyBangBangCheat();
+void StrongGripCheat();
+void NastyLimbsCheat();
+
+// needs too much stuff for now
+#if 0
+void
+spawnCar(int id)
+{
+ CVector playerpos;
+ CStreaming::RequestModel(id, 0);
+ CStreaming::LoadAllRequestedModels(false);
+ if(CStreaming::IsModelLoaded(id)){
+ FindPlayerCoors(playerpos);
+ int node = ThePaths.FindNodeClosestToCoors(playerpos, 0, 100.0f, false, false);
+ if(node < 0)
+ return;
+
+ CVehicle *v;
+ if(CModelInfo::IsBoatModel(id)){
+// CBoat* boat = (CBoat*)CVehicle__new(0x484);
+// boat = boat->ctor(id, 1);
+// v = (CVehicle*)(boat);
+ }else{
+// CAutomobile *au = (CAutomobile*)CVehicle__new(0x5A8);
+// au = au->ctor(id, 1);
+// v = (CVehicle*)au;
+ }
+/*
+ // unlock doors
+ FIELD(int, v, 0x224) = 1;
+ // set player owned
+ FIELD(uint8, v, 0x1F7) |= 4;
+
+ DebugMenuEntrySetAddress(carCol1, &FIELD(uchar, v, 0x19C));
+ DebugMenuEntrySetAddress(carCol2, &FIELD(uchar, v, 0x19D));
+ //if(id == MODELID_ESPERANTO)
+ // FIELD(uchar, v, 0x19C) = 54;
+
+ v->matrix.matrix.pos.x = ThePaths.nodes[node].x;
+ v->matrix.matrix.pos.y = ThePaths.nodes[node].y;
+ v->matrix.matrix.pos.z = ThePaths.nodes[node].z + 4.0f;
+ float x = v->matrix.matrix.pos.x;
+ float y = v->matrix.matrix.pos.y;
+ float z = v->matrix.matrix.pos.z;
+ v->matrix.SetRotate(0.0f, 0.0f, 3.49f);
+ v->matrix.matrix.pos.x += x;
+ v->matrix.matrix.pos.y += y;
+ v->matrix.matrix.pos.z += z;
+ v->bfTypeStatus = v->bfTypeStatus & 7 | 0x20;
+ FIELD(int, v, 0x224) = 1;
+*/
+ CWorld::Add(v);
+ }
+}
+#endif
+
void
DebugMenuPopulate(void)
{
if(DebugMenuLoad()){
+ static const char *weathers[] = {
+ "Sunny", "Cloudy", "Rainy", "Foggy"
+ };
+ DebugMenuEntry *e;
+ e = DebugMenuAddVar("Time & Weather", "Current Hour", &CClock::GetHoursRef(), nil, 1, 0, 23, nil);
+ DebugMenuEntrySetWrap(e, true);
+ e = DebugMenuAddVar("Time & Weather", "Current Minute", &CClock::GetMinutesRef(),
+ [](){ CWeather::InterpolationValue = CClock::GetMinutes()/60.0f; }, 1, 0, 59, nil);
+ DebugMenuEntrySetWrap(e, true);
+ e = DebugMenuAddVar("Time & Weather", "Old Weather", (int16*)&CWeather::OldWeatherType, nil, 1, 0, 3, weathers);
+ DebugMenuEntrySetWrap(e, true);
+ e = DebugMenuAddVar("Time & Weather", "New Weather", (int16*)&CWeather::NewWeatherType, nil, 1, 0, 3, weathers);
+ DebugMenuEntrySetWrap(e, true);
+ DebugMenuAddVar("Time & Weather", "Time scale", (float*)0x8F2C20, nil, 0.1f, 0.0f, 10.0f);
+
+ DebugMenuAddCmd("Cheats", "Weapons", WeaponCheat);
+ DebugMenuAddCmd("Cheats", "Money", MoneyCheat);
+ DebugMenuAddCmd("Cheats", "Health", HealthCheat);
+ DebugMenuAddCmd("Cheats", "Wanted level up", WantedLevelUpCheat);
+ DebugMenuAddCmd("Cheats", "Wanted level down", WantedLevelDownCheat);
+ DebugMenuAddCmd("Cheats", "Tank", TankCheat);
+ DebugMenuAddCmd("Cheats", "Blow up cars", BlowUpCarsCheat);
+ DebugMenuAddCmd("Cheats", "Change player", ChangePlayerCheat);
+ DebugMenuAddCmd("Cheats", "Mayhem", MayhemCheat);
+ DebugMenuAddCmd("Cheats", "Everybody attacks player", EverybodyAttacksPlayerCheat);
+ DebugMenuAddCmd("Cheats", "Weapons for all", WeaponsForAllCheat);
+ DebugMenuAddCmd("Cheats", "Fast time", FastTimeCheat);
+ DebugMenuAddCmd("Cheats", "Slow time", SlowTimeCheat);
+ DebugMenuAddCmd("Cheats", "Armour", ArmourCheat);
+ DebugMenuAddCmd("Cheats", "Sunny weather", SunnyWeatherCheat);
+ DebugMenuAddCmd("Cheats", "Cloudy weather", CloudyWeatherCheat);
+ DebugMenuAddCmd("Cheats", "Rainy weather", RainyWeatherCheat);
+ DebugMenuAddCmd("Cheats", "Foggy weather", FoggyWeatherCheat);
+ DebugMenuAddCmd("Cheats", "Fast weather", FastWeatherCheat);
+ DebugMenuAddCmd("Cheats", "Only render wheels", OnlyRenderWheelsCheat);
+ DebugMenuAddCmd("Cheats", "Chitty chitty bang bang", ChittyChittyBangBangCheat);
+ DebugMenuAddCmd("Cheats", "Strong grip", StrongGripCheat);
+ DebugMenuAddCmd("Cheats", "Nasty limbs", NastyLimbsCheat);
+
DebugMenuAddVarBool8("Debug", "Show Ped Road Groups", (int8*)&gbShowPedRoadGroups, nil);
DebugMenuAddVarBool8("Debug", "Show Car Road Groups", (int8*)&gbShowCarRoadGroups, nil);
DebugMenuAddVarBool8("Debug", "Show Collision Polys", (int8*)&gbShowCollisionPolys, nil);