diff --git a/src/Game.cpp b/src/Game.cpp index aab7cf7b..d41e27d5 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -5,6 +5,8 @@ int &CGame::currLevel = *(int*)0x941514; bool &CGame::bDemoMode = *(bool*)0x5F4DD0; bool &CGame::nastyGame = *(bool*)0x5F4DD4; +bool &CGame::frenchGame = *(bool*)0x95CDCB; +bool &CGame::germanGame = *(bool*)0x95CD1E; WRAPPER void CGame::Process(void) { EAXJMP(0x48C850); } WRAPPER Bool CGame::InitialiseOnceBeforeRW(void) { EAXJMP(0x48BB80); } diff --git a/src/Game.h b/src/Game.h index 11e193e4..f1404347 100644 --- a/src/Game.h +++ b/src/Game.h @@ -14,6 +14,8 @@ public: static int &currLevel; static bool &bDemoMode; static bool &nastyGame; + static bool &frenchGame; + static bool &germanGame; static void Process(void); static Bool InitialiseOnceBeforeRW(void); diff --git a/src/Text.cpp b/src/Text.cpp index 0281043d..eeb46253 100644 --- a/src/Text.cpp +++ b/src/Text.cpp @@ -5,7 +5,7 @@ #include "Messages.h" #include "Text.h" -static wchar_t WideErrorString[25]; +static wchar WideErrorString[25]; CText &TheText = *(CText*)0x941520; @@ -90,7 +90,7 @@ CText::Unload(void) keyArray.Unload(); } -wchar_t* +wchar* CText::Get(const char *key) { return keyArray.Search(key); @@ -119,11 +119,11 @@ CKeyArray::Unload(void) } void -CKeyArray::Update(wchar_t *chars) +CKeyArray::Update(wchar *chars) { int i; for(i = 0; i < numEntries; i++) - entries[i].value = (wchar_t*)((uint8*)chars + (uintptr)entries[i].value); + entries[i].value = (wchar*)((uint8*)chars + (uintptr)entries[i].value); } CKeyEntry* @@ -146,7 +146,7 @@ CKeyArray::BinarySearch(const char *key, CKeyEntry *entries, int16 low, int16 hi return nil; } -wchar_t* +wchar* CKeyArray::Search(const char *key) { CKeyEntry *found; @@ -169,8 +169,8 @@ CData::Load(uint32 length, uint8 *data, int *offset) uint32 i; uint8 *rawbytes; - numChars = length / sizeof(wchar_t); - chars = new wchar_t[numChars]; + numChars = length / sizeof(wchar); + chars = new wchar[numChars]; rawbytes = (uint8*)chars; for(i = 0; i < length; i++) @@ -185,6 +185,12 @@ CData::Unload(void) numChars = 0; } +void +AsciiToUnicode(const char *cs, uint16 *ws) +{ + while((*ws++ = *cs++) != '\0'); +} + STARTPATCHES InjectHook(0x52C3C0, &CText::Load, PATCH_JUMP); InjectHook(0x52C580, &CText::Unload, PATCH_JUMP); diff --git a/src/Text.h b/src/Text.h index c8d4e8b7..1aaef3b6 100644 --- a/src/Text.h +++ b/src/Text.h @@ -1,8 +1,10 @@ #pragma once +void AsciiToUnicode(const char *cs, wchar *ws); + struct CKeyEntry { - wchar_t *value; + wchar *value; char key[8]; }; // If this fails, CKeyArray::Load will have to be fixed @@ -16,15 +18,15 @@ public: void Load(uint32 length, uint8 *data, int *offset); void Unload(void); - void Update(wchar_t *chars); + void Update(wchar *chars); CKeyEntry *BinarySearch(const char *key, CKeyEntry *entries, int16 low, int16 high); - wchar_t *Search(const char *key); + wchar *Search(const char *key); }; class CData { public: - wchar_t *chars; + wchar *chars; int numChars; void Load(uint32 length, uint8 *data, int *offset); @@ -41,7 +43,7 @@ public: ~CText(void); void Load(void); void Unload(void); - wchar_t *Get(const char *key); + wchar *Get(const char *key); }; extern CText &TheText; diff --git a/src/Zones.cpp b/src/Zones.cpp index 9b40db0f..741fff7d 100644 --- a/src/Zones.cpp +++ b/src/Zones.cpp @@ -19,6 +19,26 @@ CZoneInfo *CTheZones::ZoneInfoArray = (CZoneInfo*)0x714400; #define SWAPF(a, b) { float t; t = a; a = b; b = t; } +static void +CheckZoneInfo(CZoneInfo *info) +{ + assert(info->carThreshold[0] >= 0); + assert(info->carThreshold[0] <= info->carThreshold[1]); + assert(info->carThreshold[1] <= info->carThreshold[2]); + assert(info->carThreshold[2] <= info->carThreshold[3]); + assert(info->carThreshold[3] <= info->carThreshold[4]); + assert(info->carThreshold[4] <= info->carThreshold[5]); + assert(info->carThreshold[5] <= info->copThreshold); + assert(info->copThreshold <= info->gangThreshold[0]); + assert(info->gangThreshold[0] <= info->gangThreshold[1]); + assert(info->gangThreshold[1] <= info->gangThreshold[2]); + assert(info->gangThreshold[2] <= info->gangThreshold[3]); + assert(info->gangThreshold[3] <= info->gangThreshold[4]); + assert(info->gangThreshold[4] <= info->gangThreshold[5]); + assert(info->gangThreshold[5] <= info->gangThreshold[6]); + assert(info->gangThreshold[6] <= info->gangThreshold[7]); + assert(info->gangThreshold[7] <= info->gangThreshold[8]); +} void CTheZones::Init(void) @@ -49,6 +69,7 @@ CTheZones::Init(void) zonei->gangThreshold[6] = zonei->gangThreshold[5]; zonei->gangThreshold[7] = zonei->gangThreshold[6]; zonei->gangThreshold[8] = zonei->gangThreshold[7]; + CheckZoneInfo(zonei); } TotalNumberOfZoneInfos = 1; // why 1? @@ -361,11 +382,11 @@ CTheZones::GetZoneInfoForTimeOfDay(const CVector *pos, CZoneInfo *info) if(CClock::GetIsTimeInRange(19, 22)){ n = (CClock::GetHours() - 19) / 3.0f; assert(n >= 0.0f && n <= 1.0f); - d = n - 1.0f; + d = 1.0f - n; }else{ d = (CClock::GetHours() - 5) / 3.0f; assert(d >= 0.0f && d <= 1.0f); - n = d - 1.0f; + n = 1.0f - d; } info->carDensity = day->carDensity * d + night->carDensity * n; info->carThreshold[0] = day->carThreshold[0] * d + night->carThreshold[0] * n; @@ -402,28 +423,9 @@ CTheZones::GetZoneInfoForTimeOfDay(const CVector *pos, CZoneInfo *info) else info->pedGroup = night->pedGroup; - assert(info->carDensity >= 0); - assert(info->carThreshold[0] >= 0); - assert(info->carThreshold[1] >= 0); - assert(info->carThreshold[2] >= 0); - assert(info->carThreshold[3] >= 0); - assert(info->carThreshold[4] >= 0); - assert(info->carThreshold[5] >= 0); - assert(info->copThreshold >= 0); - assert(info->gangThreshold[0] >= 0); - assert(info->gangThreshold[1] >= 0); - assert(info->gangThreshold[2] >= 0); - assert(info->gangThreshold[3] >= 0); - assert(info->gangThreshold[4] >= 0); - assert(info->gangThreshold[5] >= 0); - assert(info->gangThreshold[6] >= 0); - assert(info->gangThreshold[7] >= 0); - assert(info->gangThreshold[8] >= 0); + CheckZoneInfo(info); } -// BUG: there might be a bug somewhere in there that causes -// thresholds to become negative so CCarCtrl::ChooseModel will hang - void CTheZones::SetZoneCarInfo(uint16 zoneid, uint8 day, int16 carDensity, int16 gang0Num, int16 gang1Num, int16 gang2Num, @@ -438,6 +440,8 @@ CTheZones::SetZoneCarInfo(uint16 zoneid, uint8 day, int16 carDensity, zone = GetZone(zoneid); info = &ZoneInfoArray[day ? zone->zoneinfoDay : zone->zoneinfoNight]; + CheckZoneInfo(info); + if(carDensity != -1) info->carDensity = carDensity; int16 oldCar1Num = info->carThreshold[1] - info->carThreshold[0]; int16 oldCar2Num = info->carThreshold[2] - info->carThreshold[1]; @@ -455,22 +459,6 @@ CTheZones::SetZoneCarInfo(uint16 zoneid, uint8 day, int16 carDensity, int16 oldGang7Num = info->gangThreshold[7] - info->gangThreshold[6]; int16 oldGang8Num = info->gangThreshold[8] - info->gangThreshold[7]; - assert(oldCar1Num >= 0); - assert(oldCar2Num >= 0); - assert(oldCar3Num >= 0); - assert(oldCar4Num >= 0); - assert(oldCar5Num >= 0); - assert(oldCopNum >= 0); - assert(oldGang0Num >= 0); - assert(oldGang1Num >= 0); - assert(oldGang2Num >= 0); - assert(oldGang3Num >= 0); - assert(oldGang4Num >= 0); - assert(oldGang5Num >= 0); - assert(oldGang6Num >= 0); - assert(oldGang7Num >= 0); - assert(oldGang8Num >= 0); - if(car0Num != -1) info->carThreshold[0] = car0Num; if(car1Num != -1) info->carThreshold[1] = info->carThreshold[0] + car1Num; else info->carThreshold[1] = info->carThreshold[0] + oldCar1Num; @@ -503,23 +491,7 @@ CTheZones::SetZoneCarInfo(uint16 zoneid, uint8 day, int16 carDensity, if(gang8Num != -1) info->gangThreshold[8] = info->gangThreshold[7] + gang8Num; else info->gangThreshold[8] = info->gangThreshold[7] + oldGang8Num; - assert(info->carDensity >= 0); - assert(info->carThreshold[0] >= 0); - assert(info->carThreshold[1] >= 0); - assert(info->carThreshold[2] >= 0); - assert(info->carThreshold[3] >= 0); - assert(info->carThreshold[4] >= 0); - assert(info->carThreshold[5] >= 0); - assert(info->copThreshold >= 0); - assert(info->gangThreshold[0] >= 0); - assert(info->gangThreshold[1] >= 0); - assert(info->gangThreshold[2] >= 0); - assert(info->gangThreshold[3] >= 0); - assert(info->gangThreshold[4] >= 0); - assert(info->gangThreshold[5] >= 0); - assert(info->gangThreshold[6] >= 0); - assert(info->gangThreshold[7] >= 0); - assert(info->gangThreshold[8] >= 0); + CheckZoneInfo(info); } void @@ -534,15 +506,15 @@ CTheZones::SetZonePedInfo(uint16 zoneid, uint8 day, int16 pedDensity, info = &ZoneInfoArray[day ? zone->zoneinfoDay : zone->zoneinfoNight]; if(pedDensity != -1) info->pedDensity = pedDensity; if(copDensity != -1) info->copDensity = copDensity; - if(gang0Density != -1) info->gangThreshold[0] = gang0Density; - if(gang1Density != -1) info->gangThreshold[1] = gang1Density; - if(gang2Density != -1) info->gangThreshold[2] = gang2Density; - if(gang3Density != -1) info->gangThreshold[3] = gang3Density; - if(gang4Density != -1) info->gangThreshold[4] = gang4Density; - if(gang5Density != -1) info->gangThreshold[5] = gang5Density; - if(gang6Density != -1) info->gangThreshold[6] = gang6Density; - if(gang7Density != -1) info->gangThreshold[7] = gang7Density; - if(gang8Density != -1) info->gangThreshold[8] = gang8Density; + if(gang0Density != -1) info->gangDensity[0] = gang0Density; + if(gang1Density != -1) info->gangDensity[1] = gang1Density; + if(gang2Density != -1) info->gangDensity[2] = gang2Density; + if(gang3Density != -1) info->gangDensity[3] = gang3Density; + if(gang4Density != -1) info->gangDensity[4] = gang4Density; + if(gang5Density != -1) info->gangDensity[5] = gang5Density; + if(gang6Density != -1) info->gangDensity[6] = gang6Density; + if(gang7Density != -1) info->gangDensity[7] = gang7Density; + if(gang8Density != -1) info->gangDensity[8] = gang8Density; } void diff --git a/src/Zones.h b/src/Zones.h index c7745e29..291e6f60 100644 --- a/src/Zones.h +++ b/src/Zones.h @@ -33,10 +33,10 @@ class CZoneInfo { public: // Car data - uint16 carDensity; - uint16 carThreshold[6]; - uint16 copThreshold; - uint16 gangThreshold[9]; + int16 carDensity; + int16 carThreshold[6]; + int16 copThreshold; + int16 gangThreshold[9]; // Ped data uint16 pedDensity; diff --git a/src/common.h b/src/common.h index 90244580..08eff455 100644 --- a/src/common.h +++ b/src/common.h @@ -40,12 +40,13 @@ typedef int32_t int32, Int32; typedef uintptr_t uintptr; typedef uint64_t uint64, UInt64; typedef int64_t int64, Int64; +// hardcode ucs-2 +typedef uint16_t wchar, WChar; typedef float Float; typedef double Double; typedef bool Bool; typedef char Char; -typedef wchar_t WChar; #define nil NULL diff --git a/src/config.h b/src/config.h index ebfc6cdb..3a4896a2 100644 --- a/src/config.h +++ b/src/config.h @@ -59,3 +59,5 @@ enum Config { #define GTA3_1_1_PATCH FALSE #define USE_PS2_RAND FALSE +#define RANDOMSPLASH +#define CHATTYSPLASH diff --git a/src/main.cpp b/src/main.cpp index ab0b94d7..8bef6038 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -39,6 +39,9 @@ #include "Credits.h" #include "CullZones.h" #include "TimeCycle.h" +#include "TxdStore.h" +#include "FileMgr.h" +#include "Text.h" #include "Frontend.h" #define DEFAULT_VIEWWINDOW (tan(CDraw::GetFOV() * (360.0f / PI))) @@ -72,6 +75,10 @@ void RenderMenus(void); void DoFade(void); void Render2dStuffAfterFade(void); +CSprite2d *LoadSplash(const char *name); +void DestroySplashScreen(void); + + extern void (*DebugMenuProcess)(void); extern void (*DebugMenuRender)(void); @@ -182,6 +189,30 @@ FrontendIdle(void) DoRWStuffEndOfFrame(); } +bool +DoRWStuffStartOfFrame(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 BottomRed, int16 BottomGreen, int16 BottomBlue, int16 Alpha) +{ + CRGBA TopColor(TopRed, TopGreen, TopBlue, Alpha); + CRGBA BottomColor(BottomRed, BottomGreen, BottomBlue, Alpha); + + float viewWindow = tan(DEGTORAD(CDraw::GetFOV() * 0.5f)); + // ASPECT + float aspectRatio = CMenuManager::m_PrefsUseWideScreen ? 16.0f/9.0f : 4.0f/3.0f; + CameraSize(Scene.camera, nil, viewWindow, aspectRatio); + CVisibilityPlugins::SetRenderWareCamera(Scene.camera); + RwCameraClear(Scene.camera, &gColourTop, rwCAMERACLEARZ); + + if(!RsCameraBeginUpdate(Scene.camera)) + return false; + + CSprite2d::InitPerFrame(); + + if(Alpha != 0) + CSprite2d::DrawRect(CRect(0.0f, 0.0f, SCREENW, SCREENH), BottomColor, BottomColor, TopColor, TopColor); + + return true; +} + bool DoRWStuffStartOfFrame_Horizon(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 BottomRed, int16 BottomGreen, int16 BottomBlue, int16 Alpha) { @@ -361,7 +392,7 @@ DoFade(void) } if(CDraw::FadeValue != 0 || CMenuManager::m_PrefsBrightness < 256){ - // LoadSplash + CSprite2d *splash = LoadSplash(nil); CRGBA fadeColor; CRect rect; @@ -411,7 +442,7 @@ DoFade(void) fadeColor.g = 255; fadeColor.b = 255; fadeColor.a = CDraw::FadeValue; - CSprite2d::DrawRect(CRect(0.0f, 0.0f, SCREENW, SCREENH), fadeColor, fadeColor, fadeColor, fadeColor); + splash->Draw(CRect(0.0f, 0.0f, SCREENW, SCREENH), fadeColor, fadeColor, fadeColor, fadeColor); } } } @@ -423,6 +454,130 @@ Render2dStuffAfterFade(void) CFont::DrawFonts(); } +CSprite2d splash; +int splashTxdId = -1; + +CSprite2d* +LoadSplash(const char *name) +{ + RwTexDictionary *txd; + char filename[140]; + RwTexture *tex = nil; + + if(name == nil) + return &splash; + if(splashTxdId == -1) + splashTxdId = CTxdStore::AddTxdSlot("splash"); + + txd = CTxdStore::GetSlot(splashTxdId)->texDict; + if(txd) + tex = RwTexDictionaryFindNamedTexture(txd, name); + // if texture is found, splash was already set up below + + if(tex == nil){ + CFileMgr::SetDir("TXD\\"); + sprintf(filename, "%s.txd", name); + if(splash.m_pTexture) + splash.Delete(); + if(txd) + CTxdStore::RemoveTxd(splashTxdId); + CTxdStore::LoadTxd(splashTxdId, filename); + CTxdStore::AddRef(splashTxdId); + CTxdStore::PushCurrentTxd(); + CTxdStore::SetCurrentTxd(splashTxdId); + splash.SetTexture(name); + CTxdStore::PopCurrentTxd(); + CFileMgr::SetDir(""); + } + + return &splash; +} + +void +DestroySplashScreen(void) +{ + splash.Delete(); + if(splashTxdId != -1) + CTxdStore::RemoveTxdSlot(splashTxdId); + splashTxdId = -1; +} + +float NumberOfChunksLoaded; +#define TOTALNUMCHUNKS 73.0f + +// TODO: compare with PS2 +void +LoadingScreen(char *str1, char *str2, char *splashscreen) +{ + CSprite2d *splash; + +#ifndef RANDOMSPLASH + if(CGame::frenchGame || CGame::germanGame || !CGame::nastyGame) + splashscreen = "mainsc2"; + else + splashscreen = "mainsc1"; +#endif + + splash = LoadSplash(splashscreen); + + if(RsGlobal.quit) + return; + + if(DoRWStuffStartOfFrame(0, 0, 0, 0, 0, 0, 255)){ + CSprite2d::SetRecipNearClip(); + CSprite2d::InitPerFrame(); + CFont::InitPerFrame(); + DefinedState(); + RwRenderStateSet(rwRENDERSTATETEXTUREADDRESS, (void*)rwTEXTUREADDRESSCLAMP); + splash->Draw(CRect(0.0f, 0.0f, SCREENW, SCREENH), CRGBA(255, 255, 255, 255)); + + if(str1){ + NumberOfChunksLoaded += 1; + + float hpos = SCREEN_STRETCH_X(40); + float length = SCREENW - SCREEN_STRETCH_X(100); + float vpos = SCREENH - SCREEN_STRETCH_Y(13); + float height = SCREEN_STRETCH_Y(7); + CSprite2d::DrawRect(CRect(hpos, vpos, hpos + length, vpos + height), CRGBA(40, 53, 68, 255)); + + length *= NumberOfChunksLoaded/TOTALNUMCHUNKS; + CSprite2d::DrawRect(CRect(hpos, vpos, hpos + length, vpos + height), CRGBA(81, 106, 137, 255)); + + // this is done by the game but is unused + CFont::SetScale(SCREEN_STRETCH_X(2), SCREEN_STRETCH_Y(2)); + CFont::SetPropOn(); + CFont::SetRightJustifyOn(); + CFont::SetFontStyle(FONT_HEADING); + +#ifdef CHATTYSPLASH + // my attempt + static wchar tmpstr[80]; + float scale = SCREEN_STRETCH_Y(0.8f); + vpos -= 50*scale; + CFont::SetScale(scale, scale); + CFont::SetPropOn(); + CFont::SetRightJustifyOff(); + CFont::SetFontStyle(FONT_BANK); + CFont::SetColor(CRGBA(255, 255, 255, 255)); + AsciiToUnicode(str1, tmpstr); + CFont::PrintString(hpos, vpos, tmpstr); + vpos += 25*scale; + AsciiToUnicode(str2, tmpstr); + CFont::PrintString(hpos, vpos, tmpstr); +#endif + } + + CFont::DrawFonts(); + DoRWStuffEndOfFrame(); + } +} + +void +ResetLoadingScreenBar(void) +{ + NumberOfChunksLoaded = 0.0f; +} + #include "rwcore.h" #include "rpworld.h" #include "rpmatfx.h" @@ -590,6 +745,7 @@ STARTPATCHES InjectHook(0x48E480, Idle, PATCH_JUMP); InjectHook(0x48E700, FrontendIdle, PATCH_JUMP); + InjectHook(0x48CF10, DoRWStuffStartOfFrame, PATCH_JUMP); InjectHook(0x48D040, DoRWStuffStartOfFrame_Horizon, PATCH_JUMP); InjectHook(0x48E030, RenderScene, PATCH_JUMP); InjectHook(0x48E080, RenderDebugShit, PATCH_JUMP); @@ -598,6 +754,11 @@ STARTPATCHES InjectHook(0x48E450, RenderMenus, PATCH_JUMP); InjectHook(0x48D120, DoFade, PATCH_JUMP); InjectHook(0x48E470, Render2dStuffAfterFade, PATCH_JUMP); + + InjectHook(0x48D550, LoadSplash, PATCH_JUMP); + InjectHook(0x48D670, DestroySplashScreen, PATCH_JUMP); + InjectHook(0x48D770, LoadingScreen, PATCH_JUMP); + InjectHook(0x48D760, ResetLoadingScreenBar, PATCH_JUMP); InjectHook(0x48D470, PluginAttach, PATCH_JUMP); InjectHook(0x48D520, Initialise3D, PATCH_JUMP); diff --git a/src/re3.cpp b/src/re3.cpp index e99384e1..b7404ba2 100644 --- a/src/re3.cpp +++ b/src/re3.cpp @@ -61,6 +61,8 @@ int (*open_script_orig)(const char *path, const char *mode); int open_script(const char *path, const char *mode) { + if(GetAsyncKeyState('G') & 0x8000) + return open_script_orig("main.scm", mode); if(GetAsyncKeyState('D') & 0x8000) return open_script_orig("main_d.scm", mode); // if(GetAsyncKeyState('R') & 0x8000) diff --git a/src/render/Credits.cpp b/src/render/Credits.cpp index a8b10634..8365d02b 100644 --- a/src/render/Credits.cpp +++ b/src/render/Credits.cpp @@ -37,7 +37,7 @@ CCredits::PrintCreditSpace(float space, uint32 &line) } void -CCredits::PrintCreditText(float scaleX, float scaleY, wchar_t *text, uint32 &lineoffset, float scrolloffset) +CCredits::PrintCreditText(float scaleX, float scaleY, wchar *text, uint32 &lineoffset, float scrolloffset) { float start = SCREENH + 50.0f; float y = lineoffset + start - scrolloffset; diff --git a/src/render/Credits.h b/src/render/Credits.h index ed7f8a74..cbe63172 100644 --- a/src/render/Credits.h +++ b/src/render/Credits.h @@ -11,5 +11,5 @@ public: static bool AreCreditsDone(void) { return bCreditsGoing; } static void Render(void); static void PrintCreditSpace(float space, uint32 &line); - static void PrintCreditText(float scaleX, float scaleY, wchar_t *text, uint32 &lineoffset, float scrolloffset); + static void PrintCreditText(float scaleX, float scaleY, wchar *text, uint32 &lineoffset, float scrolloffset); }; diff --git a/src/render/Sprite2d.cpp b/src/render/Sprite2d.cpp index 3c699650..fd5900b8 100644 --- a/src/render/Sprite2d.cpp +++ b/src/render/Sprite2d.cpp @@ -78,7 +78,7 @@ CSprite2d::Delete(void) } void -CSprite2d::SetTexture(char *name) +CSprite2d::SetTexture(const char *name) { Delete(); if(name) @@ -86,7 +86,7 @@ CSprite2d::SetTexture(char *name) } void -CSprite2d::SetTexture(char *name, char *mask) +CSprite2d::SetTexture(const char *name, const char *mask) { Delete(); if(name) @@ -468,8 +468,8 @@ STARTPATCHES InjectHook(0x51EA00, &CSprite2d::Delete, PATCH_JUMP); InjectHook(0x51F950, &CSprite2d::SetRenderState, PATCH_JUMP); - InjectHook(0x51EA40, (void (CSprite2d::*)(char*))&CSprite2d::SetTexture, PATCH_JUMP); - InjectHook(0x51EA70, (void (CSprite2d::*)(char*,char*))&CSprite2d::SetTexture, PATCH_JUMP); + InjectHook(0x51EA40, (void (CSprite2d::*)(const char*))&CSprite2d::SetTexture, PATCH_JUMP); + InjectHook(0x51EA70, (void (CSprite2d::*)(const char*,const char*))&CSprite2d::SetTexture, PATCH_JUMP); InjectHook(0x51EAA0, &CSprite2d::SetAddressing, PATCH_JUMP); InjectHook(0x51EE90, (void (*)(const CRect&, C4, uint32))CSprite2d::SetVertices, PATCH_JUMP); diff --git a/src/render/Sprite2d.h b/src/render/Sprite2d.h index 1813d4ee..d5f0a5ae 100644 --- a/src/render/Sprite2d.h +++ b/src/render/Sprite2d.h @@ -23,8 +23,8 @@ public: ~CSprite2d(void) { Delete(); }; void Delete(void); void SetRenderState(void); - void SetTexture(char *name); - void SetTexture(char *name, char *mask); + void SetTexture(const char *name); + void SetTexture(const char *name, const char *mask); void SetAddressing(RwTextureAddressMode addr); void Draw(float x, float y, float w, float h, const CRGBA &col); void Draw(const CRect &rect, const CRGBA &col);