Merge pull request #4 from GTAmodding/master

upd
This commit is contained in:
Fire_Head 2019-06-12 12:58:11 +03:00 committed by GitHub
commit ea7d5d93b0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 258 additions and 25 deletions

View File

@ -56,7 +56,7 @@ There are a couple of things that have been reversed for other projects
already that could probably be put into this project without too much effort. already that could probably be put into this project without too much effort.
Again, the list is not complete: Again, the list is not complete:
* Animation (https://github.com/aap/iii_anim) * ~~Animation (https://github.com/aap/iii_anim)~~
* File Loader (https://github.com/aap/librwgta/tree/master/tools/IIItest) * File Loader (https://github.com/aap/librwgta/tree/master/tools/IIItest)
* ... * ...

View File

@ -1,10 +1,175 @@
#include "User.h"
#include "common.h" #include "common.h"
#include "patcher.h" #include "patcher.h"
#include "User.h"
CPlaceName &CUserDisplay::PlaceName = *(CPlaceName*)0x8F29BC; #include "DMAudio.h"
COnscreenTimer &CUserDisplay::OnscnTimer = *(COnscreenTimer*)0x862238; #include "Hud.h"
CPager &CUserDisplay::Pager = *(CPager*)0x8F2744; #include "Replay.h"
CCurrentVehicle &CUserDisplay::CurrentVehicle = *(CCurrentVehicle*)0x8F5FE8; #include "Timer.h"
WRAPPER void COnscreenTimer::ProcessForDisplay(void) { EAXJMP(0x4292E0); } CPlaceName& CUserDisplay::PlaceName = *(CPlaceName*)0x8F29BC;
COnscreenTimer& CUserDisplay::OnscnTimer = *(COnscreenTimer*)0x862238;
CPager& CUserDisplay::Pager = *(CPager*)0x8F2744;
CCurrentVehicle& CUserDisplay::CurrentVehicle = *(CCurrentVehicle*)0x8F5FE8;
char* CTheScripts::ScriptSpace = (char*)0x74B248;
int COnscreenTimer::Init() {
m_bDisabled = false;
for(uint32 i = 0; i < NUMONSCREENTIMERENTRIES; i++) {
m_sEntries[i].m_nTimerOffset = 0;
m_sEntries[i].m_nCounterOffset = 0;
for(uint32 j = 0; j < 10; j++) {
m_sEntries[i].m_aTimerText[j] = 0;
m_sEntries[i].m_aCounterText[j] = 0;
}
m_sEntries[i].m_nType = 0;
m_sEntries[i].m_bTimerProcessed = 0;
m_sEntries[i].m_bCounterProcessed = 0;
}
return 1;
}
void COnscreenTimer::Process() {
if(CReplay::Mode != 1 && !m_bDisabled) {
for(uint32 i = 0; i < NUMONSCREENTIMERENTRIES; i++) {
m_sEntries[i].Process();
}
}
}
void COnscreenTimer::ProcessForDisplay() {
if(CHud::m_Wants_To_Draw_Hud) {
m_bProcessed = false;
for(uint32 i = 0; i < NUMONSCREENTIMERENTRIES; i++) {
if(m_sEntries[i].ProcessForDisplay()) {
m_bProcessed = true;
}
}
}
}
void COnscreenTimer::ClearCounter(uint32 offset) {
for(uint32 i = 0; i < NUMONSCREENTIMERENTRIES; i++) {
if(offset == m_sEntries[i].m_nCounterOffset) {
m_sEntries[i].m_nCounterOffset = 0;
m_sEntries[i].m_aCounterText[0] = 0;
m_sEntries[i].m_nType = 0;
m_sEntries[i].m_bCounterProcessed = 0;
}
}
}
void COnscreenTimer::ClearClock(uint32 offset) {
for(uint32 i = 0; i < NUMONSCREENTIMERENTRIES; i++) {
if(offset == m_sEntries[i].m_nTimerOffset) {
m_sEntries[i].m_nTimerOffset = 0;
m_sEntries[i].m_aTimerText[0] = 0;
m_sEntries[i].m_bTimerProcessed = 0;
}
}
}
void COnscreenTimer::AddCounter(uint32 offset, uint16 type, char* text) {
uint32 i = 0;
for(uint32 i = 0; i < NUMONSCREENTIMERENTRIES; i++) {
if(m_sEntries[i].m_nCounterOffset == 0) {
break;
}
return;
}
m_sEntries[i].m_nCounterOffset = offset;
if(text) {
strncpy((char*)m_sEntries[i].m_aCounterText, text, 10);
} else {
m_sEntries[i].m_aCounterText[0] = 0;
}
m_sEntries[i].m_nType = type;
}
void COnscreenTimer::AddClock(uint32 offset, char* text) {
uint32 i = 0;
for(uint32 i = 0; i < NUMONSCREENTIMERENTRIES; i++) {
if(m_sEntries[i].m_nTimerOffset == 0) {
break;
}
return;
}
m_sEntries[i].m_nTimerOffset = offset;
if(text) {
strncpy((char*)m_sEntries[i].m_aTimerText, text, 10u);
} else {
m_sEntries[i].m_aTimerText[0] = 0;
}
}
void COnscreenTimerEntry::Process() {
if(m_nTimerOffset) {
uint32* timerPtr = (uint32*)&CTheScripts::ScriptSpace[m_nTimerOffset];
uint32 oldTime = *timerPtr;
int32 newTime = int32(oldTime - uint32(20.0f * CTimer::GetTimeStep()));
if(newTime < 0) {
*timerPtr = 0;
m_bTimerProcessed = 0;
m_nTimerOffset = 0;
m_aTimerText[0] = 0;
} else {
*timerPtr = (uint32)newTime;
uint32 oldTimeSeconds = oldTime / 1000;
if(oldTimeSeconds <= 11 && newTime / 1000 != oldTimeSeconds) {
DMAudio.PlayFrontEndSound(0x93u, newTime / 1000);
}
}
}
}
bool COnscreenTimerEntry::ProcessForDisplay() {
m_bTimerProcessed = false;
m_bCounterProcessed = false;
if(!m_nTimerOffset && !m_nCounterOffset) {
return false;
}
if(m_nTimerOffset) {
m_bTimerProcessed = true;
ProcessForDisplayTimer();
}
if(m_nCounterOffset) {
m_bCounterProcessed = true;
ProcessForDisplayCounter();
}
return true;
}
int COnscreenTimerEntry::ProcessForDisplayTimer() {
uint32 time = *(uint32*)&CTheScripts::ScriptSpace[m_nTimerOffset];
return sprintf(m_bTimerBuffer, "%02d:%02d", time / 1000 / 60,
time / 1000 % 60);
}
int COnscreenTimerEntry::ProcessForDisplayCounter() {
uint32 counter = *(uint32*)&CTheScripts::ScriptSpace[m_nCounterOffset];
return sprintf(m_bCounterBuffer, "%d", counter);
}
STARTPATCHES
InjectHook(0x429160, &COnscreenTimerEntry::Process, PATCH_JUMP);
InjectHook(0x429110, &COnscreenTimerEntry::ProcessForDisplay, PATCH_JUMP);
InjectHook(0x429080, &COnscreenTimerEntry::ProcessForDisplayTimer, PATCH_JUMP);
InjectHook(0x4290F0, &COnscreenTimerEntry::ProcessForDisplayCounter, PATCH_JUMP);
InjectHook(0x429220, &COnscreenTimer::Init, PATCH_JUMP);
InjectHook(0x429320, &COnscreenTimer::Process, PATCH_JUMP);
InjectHook(0x4292E0, &COnscreenTimer::ProcessForDisplay, PATCH_JUMP);
InjectHook(0x429450, &COnscreenTimer::ClearCounter, PATCH_JUMP);
InjectHook(0x429410, &COnscreenTimer::ClearClock, PATCH_JUMP);
InjectHook(0x4293B0, &COnscreenTimer::AddCounter, PATCH_JUMP);
InjectHook(0x429350, &COnscreenTimer::AddClock, PATCH_JUMP);
ENDPATCHES

View File

@ -1,11 +1,55 @@
#pragma once #pragma once
#include "common.h"
class COnscreenTimerEntry
{
public:
uint32 m_nTimerOffset;
uint32 m_nCounterOffset;
uint8 m_aTimerText[10];
uint8 m_aCounterText[10];
uint16 m_nType;
char m_bCounterBuffer[42];
char m_bTimerBuffer[42];
bool m_bTimerProcessed;
bool m_bCounterProcessed;
void Process();
bool ProcessForDisplay();
int ProcessForDisplayTimer();
int ProcessForDisplayCounter();
};
static_assert(sizeof(COnscreenTimerEntry) == 0x74, "COnscreenTimerEntry: error");
class CTheScripts{
public:
static char *ScriptSpace;//[163840]
};
class COnscreenTimer class COnscreenTimer
{ {
public: public:
void ProcessForDisplay(void); COnscreenTimerEntry m_sEntries[NUMONSCREENTIMERENTRIES];
bool m_bProcessed;
bool m_bDisabled;
char field_119[2];
int Init();
void Process();
void ProcessForDisplay();
void ClearCounter(uint32 offset);
void ClearClock(uint32 offset);
void AddCounter(uint32 offset, uint16 type, char* text);
void AddClock(uint32 offset, char* text);
}; };
static_assert(sizeof(COnscreenTimer) == 0x78, "COnscreenTimer: error");
class CPlaceName class CPlaceName
{ {
}; };

View File

@ -1,9 +1,12 @@
#include "common.h" #include "common.h"
#include "patcher.h" #include "patcher.h"
#include "World.h"
#include "Clock.h"
#include "Zones.h" #include "Zones.h"
#include "Clock.h"
#include "Text.h"
#include "World.h"
eLevelName &CTheZones::m_CurrLevel = *(eLevelName*)0x8F2BC8; eLevelName &CTheZones::m_CurrLevel = *(eLevelName*)0x8F2BC8;
CZone *&CTheZones::m_pPlayersZone = *(CZone**)0x8F254C; CZone *&CTheZones::m_pPlayersZone = *(CZone**)0x8F254C;
int16 &CTheZones::FindIndex = *(int16*)0x95CC40; int16 &CTheZones::FindIndex = *(int16*)0x95CC40;
@ -40,6 +43,10 @@ CheckZoneInfo(CZoneInfo *info)
assert(info->gangThreshold[7] <= info->gangThreshold[8]); assert(info->gangThreshold[7] <= info->gangThreshold[8]);
} }
wchar* CZone::GetTranslatedName() {
return TheText.Get(name);
}
void void
CTheZones::Init(void) CTheZones::Init(void)
{ {
@ -615,6 +622,7 @@ CTheZones::InitialiseAudioZoneArray(void)
} }
STARTPATCHES STARTPATCHES
InjectHook(0x4B5DD0, &CZone::GetTranslatedName, PATCH_JUMP);
InjectHook(0x4B5DE0, CTheZones::Init, PATCH_JUMP); InjectHook(0x4B5DE0, CTheZones::Init, PATCH_JUMP);
InjectHook(0x4B61D0, CTheZones::Update, PATCH_JUMP); InjectHook(0x4B61D0, CTheZones::Update, PATCH_JUMP);
InjectHook(0x4B6210, CTheZones::CreateZone, PATCH_JUMP); InjectHook(0x4B6210, CTheZones::CreateZone, PATCH_JUMP);

View File

@ -27,6 +27,8 @@ public:
CZone *child; CZone *child;
CZone *parent; CZone *parent;
CZone *next; CZone *next;
wchar *GetTranslatedName();
}; };
class CZoneInfo class CZoneInfo

View File

@ -93,7 +93,7 @@ GetModelFromName(const char *name)
for(i = 0; i < MODELINFOSIZE; i++){ for(i = 0; i < MODELINFOSIZE; i++){
mi = CModelInfo::GetModelInfo(i); mi = CModelInfo::GetModelInfo(i);
if(mi->GetRwObject() && RwObjectGetType(mi->GetRwObject()) == rpCLUMP && if(mi && mi->GetRwObject() && RwObjectGetType(mi->GetRwObject()) == rpCLUMP &&
strcmpIgnoringDigits(mi->GetName(), name)) strcmpIgnoringDigits(mi->GetName(), name))
return mi; return mi;
} }
@ -152,6 +152,7 @@ CAnimBlendAssocGroup::CreateAssociations(const char *blockName, RpClump *clump,
STARTPATCHES STARTPATCHES
InjectHook(0x4012D0, &CAnimBlendAssocGroup::DestroyAssociations, PATCH_JUMP);
InjectHook(0x4013D0, (CAnimBlendAssociation *(CAnimBlendAssocGroup::*)(uint32))&CAnimBlendAssocGroup::GetAnimation, PATCH_JUMP); InjectHook(0x4013D0, (CAnimBlendAssociation *(CAnimBlendAssocGroup::*)(uint32))&CAnimBlendAssocGroup::GetAnimation, PATCH_JUMP);
InjectHook(0x401300, (CAnimBlendAssociation *(CAnimBlendAssocGroup::*)(const char*))&CAnimBlendAssocGroup::GetAnimation, PATCH_JUMP); InjectHook(0x401300, (CAnimBlendAssociation *(CAnimBlendAssocGroup::*)(const char*))&CAnimBlendAssocGroup::GetAnimation, PATCH_JUMP);
InjectHook(0x401420, (CAnimBlendAssociation *(CAnimBlendAssocGroup::*)(uint32))&CAnimBlendAssocGroup::CopyAnimation, PATCH_JUMP); InjectHook(0x401420, (CAnimBlendAssociation *(CAnimBlendAssocGroup::*)(uint32))&CAnimBlendAssocGroup::CopyAnimation, PATCH_JUMP);

View File

@ -15,3 +15,5 @@ WRAPPER Bool cDMAudio::IsAudioInitialised() { EAXJMP(0x57CAB0); }
WRAPPER Char cDMAudio::GetCDAudioDriveLetter() { EAXJMP(0x57CA90); } WRAPPER Char cDMAudio::GetCDAudioDriveLetter() { EAXJMP(0x57CA90); }
WRAPPER Bool cDMAudio::CheckForAnAudioFileOnCD() { EAXJMP(0x57CA70); } WRAPPER Bool cDMAudio::CheckForAnAudioFileOnCD() { EAXJMP(0x57CA70); }
WRAPPER void cDMAudio::ChangeMusicMode(UInt8 mode) { EAXJMP(0x57CCF0); } WRAPPER void cDMAudio::ChangeMusicMode(UInt8 mode) { EAXJMP(0x57CCF0); }
WRAPPER void cDMAudio::PlayFrontEndSound(uint32, uint32) { EAXJMP(0x57CC20); }

View File

@ -9,11 +9,13 @@ public:
void ReleaseDigitalHandle(void); void ReleaseDigitalHandle(void);
void ReacquireDigitalHandle(void); void ReacquireDigitalHandle(void);
void Service(void); void Service(void);
void ReportCollision(CEntity *A, CEntity *B, uint8 surfA, uint8 surfB, float impulse, float speed); void ReportCollision(CEntity* A, CEntity* B, uint8 surfA, uint8 surfB,
void ResetTimers(UInt32 timerval); float impulse, float speed);
void ResetTimers(UInt32 timerval);
Bool IsAudioInitialised(void); Bool IsAudioInitialised(void);
Char GetCDAudioDriveLetter(void); Char GetCDAudioDriveLetter(void);
Bool CheckForAnAudioFileOnCD(void); Bool CheckForAnAudioFileOnCD(void);
void ChangeMusicMode(UInt8 mode); void ChangeMusicMode(UInt8 mode);
void PlayFrontEndSound(uint32, uint32);
}; };
extern cDMAudio &DMAudio; extern cDMAudio& DMAudio;

View File

@ -1,7 +1,7 @@
#pragma once #pragma once
enum Config { enum Config {
NUMCDIMAGES = 50, // was 12 NUMCDIMAGES = 50, // was 12
MODELINFOSIZE = 5500, MODELINFOSIZE = 5500,
TXDSTORESIZE = 850, TXDSTORESIZE = 850,
@ -14,17 +14,17 @@ enum Config {
VEHICLEMODELSIZE = 120, VEHICLEMODELSIZE = 120,
TWODFXSIZE = 2000, TWODFXSIZE = 2000,
NUMOBJECTINFO = 168, // object.dat NUMOBJECTINFO = 168, // object.dat
// Pool sizes // Pool sizes
NUMPTRNODES = 30000, // 26000 on PS2 NUMPTRNODES = 30000, // 26000 on PS2
NUMENTRYINFOS = 5400, // 3200 on PS2 NUMENTRYINFOS = 5400, // 3200 on PS2
NUMPEDS = 140, // 90 on PS2 NUMPEDS = 140, // 90 on PS2
NUMVEHICLES = 110, // 70 on PS2 NUMVEHICLES = 110, // 70 on PS2
NUMBUILDINGS = 5500, // 4915 on PS2 NUMBUILDINGS = 5500, // 4915 on PS2
NUMTREADABLES = 1214, NUMTREADABLES = 1214,
NUMOBJECTS = 450, NUMOBJECTS = 450,
NUMDUMMIES = 2802, // 2368 on PS2 NUMDUMMIES = 2802, // 2368 on PS2
NUMAUDIOSCRIPTOBJECTS = 256, NUMAUDIOSCRIPTOBJECTS = 256,
// Link list lengths // Link list lengths
@ -42,7 +42,6 @@ enum Config {
NUMATTRIBZONES = 288, NUMATTRIBZONES = 288,
NUMZONEINDICES = 55000, NUMZONEINDICES = 55000,
NUMPEDSTATS = 35, NUMPEDSTATS = 35,
NUMHANDLINGS = 57, NUMHANDLINGS = 57,
@ -54,7 +53,9 @@ enum Config {
NUMEXTRADIRECTIONALS = 4, NUMEXTRADIRECTIONALS = 4,
NUMANTENNAS = 8, NUMANTENNAS = 8,
NUMCORONAS = 56, NUMCORONAS = 56,
NUMPOINTLIGHTS = 32 NUMPOINTLIGHTS = 32,
NUMONSCREENTIMERENTRIES = 1
}; };
#define GTA3_1_1_PATCH #define GTA3_1_1_PATCH

View File

@ -2,4 +2,6 @@
#include "patcher.h" #include "patcher.h"
#include "Replay.h" #include "Replay.h"
WRAPPER void CReplay::Display(void) { EAXJMP(0x595EE0); } uint8 &CReplay::Mode = *(uint8*)0x95CD5B;
WRAPPER void CReplay::Display(void) { EAXJMP(0x595EE0); }

View File

@ -4,4 +4,6 @@ class CReplay
{ {
public: public:
static void Display(void); static void Display(void);
static uint8 &Mode;
}; };

View File

@ -2,5 +2,7 @@
#include "patcher.h" #include "patcher.h"
#include "Hud.h" #include "Hud.h"
bool &CHud::m_Wants_To_Draw_Hud = *(bool*)0x95CD89;
WRAPPER void CHud::Draw(void) { EAXJMP(0x5052A0); } WRAPPER void CHud::Draw(void) { EAXJMP(0x5052A0); }
WRAPPER void CHud::DrawAfterFade(void) { EAXJMP(0x509030); } WRAPPER void CHud::DrawAfterFade(void) { EAXJMP(0x509030); }

View File

@ -5,4 +5,6 @@ class CHud
public: public:
static void Draw(void); static void Draw(void);
static void DrawAfterFade(void); static void DrawAfterFade(void);
static bool &m_Wants_To_Draw_Hud;
}; };