mirror of
https://git.rip/DMCA_FUCKER/re3.git
synced 2024-12-23 00:50:00 +00:00
implemented splashes; fixed zones
This commit is contained in:
parent
c40c7acb96
commit
b63c87e8a6
|
@ -5,6 +5,8 @@
|
||||||
int &CGame::currLevel = *(int*)0x941514;
|
int &CGame::currLevel = *(int*)0x941514;
|
||||||
bool &CGame::bDemoMode = *(bool*)0x5F4DD0;
|
bool &CGame::bDemoMode = *(bool*)0x5F4DD0;
|
||||||
bool &CGame::nastyGame = *(bool*)0x5F4DD4;
|
bool &CGame::nastyGame = *(bool*)0x5F4DD4;
|
||||||
|
bool &CGame::frenchGame = *(bool*)0x95CDCB;
|
||||||
|
bool &CGame::germanGame = *(bool*)0x95CD1E;
|
||||||
|
|
||||||
WRAPPER void CGame::Process(void) { EAXJMP(0x48C850); }
|
WRAPPER void CGame::Process(void) { EAXJMP(0x48C850); }
|
||||||
WRAPPER Bool CGame::InitialiseOnceBeforeRW(void) { EAXJMP(0x48BB80); }
|
WRAPPER Bool CGame::InitialiseOnceBeforeRW(void) { EAXJMP(0x48BB80); }
|
||||||
|
|
|
@ -14,6 +14,8 @@ public:
|
||||||
static int &currLevel;
|
static int &currLevel;
|
||||||
static bool &bDemoMode;
|
static bool &bDemoMode;
|
||||||
static bool &nastyGame;
|
static bool &nastyGame;
|
||||||
|
static bool &frenchGame;
|
||||||
|
static bool &germanGame;
|
||||||
|
|
||||||
static void Process(void);
|
static void Process(void);
|
||||||
static Bool InitialiseOnceBeforeRW(void);
|
static Bool InitialiseOnceBeforeRW(void);
|
||||||
|
|
20
src/Text.cpp
20
src/Text.cpp
|
@ -5,7 +5,7 @@
|
||||||
#include "Messages.h"
|
#include "Messages.h"
|
||||||
#include "Text.h"
|
#include "Text.h"
|
||||||
|
|
||||||
static wchar_t WideErrorString[25];
|
static wchar WideErrorString[25];
|
||||||
|
|
||||||
CText &TheText = *(CText*)0x941520;
|
CText &TheText = *(CText*)0x941520;
|
||||||
|
|
||||||
|
@ -90,7 +90,7 @@ CText::Unload(void)
|
||||||
keyArray.Unload();
|
keyArray.Unload();
|
||||||
}
|
}
|
||||||
|
|
||||||
wchar_t*
|
wchar*
|
||||||
CText::Get(const char *key)
|
CText::Get(const char *key)
|
||||||
{
|
{
|
||||||
return keyArray.Search(key);
|
return keyArray.Search(key);
|
||||||
|
@ -119,11 +119,11 @@ CKeyArray::Unload(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
CKeyArray::Update(wchar_t *chars)
|
CKeyArray::Update(wchar *chars)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for(i = 0; i < numEntries; 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*
|
CKeyEntry*
|
||||||
|
@ -146,7 +146,7 @@ CKeyArray::BinarySearch(const char *key, CKeyEntry *entries, int16 low, int16 hi
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
wchar_t*
|
wchar*
|
||||||
CKeyArray::Search(const char *key)
|
CKeyArray::Search(const char *key)
|
||||||
{
|
{
|
||||||
CKeyEntry *found;
|
CKeyEntry *found;
|
||||||
|
@ -169,8 +169,8 @@ CData::Load(uint32 length, uint8 *data, int *offset)
|
||||||
uint32 i;
|
uint32 i;
|
||||||
uint8 *rawbytes;
|
uint8 *rawbytes;
|
||||||
|
|
||||||
numChars = length / sizeof(wchar_t);
|
numChars = length / sizeof(wchar);
|
||||||
chars = new wchar_t[numChars];
|
chars = new wchar[numChars];
|
||||||
rawbytes = (uint8*)chars;
|
rawbytes = (uint8*)chars;
|
||||||
|
|
||||||
for(i = 0; i < length; i++)
|
for(i = 0; i < length; i++)
|
||||||
|
@ -185,6 +185,12 @@ CData::Unload(void)
|
||||||
numChars = 0;
|
numChars = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
AsciiToUnicode(const char *cs, uint16 *ws)
|
||||||
|
{
|
||||||
|
while((*ws++ = *cs++) != '\0');
|
||||||
|
}
|
||||||
|
|
||||||
STARTPATCHES
|
STARTPATCHES
|
||||||
InjectHook(0x52C3C0, &CText::Load, PATCH_JUMP);
|
InjectHook(0x52C3C0, &CText::Load, PATCH_JUMP);
|
||||||
InjectHook(0x52C580, &CText::Unload, PATCH_JUMP);
|
InjectHook(0x52C580, &CText::Unload, PATCH_JUMP);
|
||||||
|
|
12
src/Text.h
12
src/Text.h
|
@ -1,8 +1,10 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
void AsciiToUnicode(const char *cs, wchar *ws);
|
||||||
|
|
||||||
struct CKeyEntry
|
struct CKeyEntry
|
||||||
{
|
{
|
||||||
wchar_t *value;
|
wchar *value;
|
||||||
char key[8];
|
char key[8];
|
||||||
};
|
};
|
||||||
// If this fails, CKeyArray::Load will have to be fixed
|
// If this fails, CKeyArray::Load will have to be fixed
|
||||||
|
@ -16,15 +18,15 @@ public:
|
||||||
|
|
||||||
void Load(uint32 length, uint8 *data, int *offset);
|
void Load(uint32 length, uint8 *data, int *offset);
|
||||||
void Unload(void);
|
void Unload(void);
|
||||||
void Update(wchar_t *chars);
|
void Update(wchar *chars);
|
||||||
CKeyEntry *BinarySearch(const char *key, CKeyEntry *entries, int16 low, int16 high);
|
CKeyEntry *BinarySearch(const char *key, CKeyEntry *entries, int16 low, int16 high);
|
||||||
wchar_t *Search(const char *key);
|
wchar *Search(const char *key);
|
||||||
};
|
};
|
||||||
|
|
||||||
class CData
|
class CData
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
wchar_t *chars;
|
wchar *chars;
|
||||||
int numChars;
|
int numChars;
|
||||||
|
|
||||||
void Load(uint32 length, uint8 *data, int *offset);
|
void Load(uint32 length, uint8 *data, int *offset);
|
||||||
|
@ -41,7 +43,7 @@ public:
|
||||||
~CText(void);
|
~CText(void);
|
||||||
void Load(void);
|
void Load(void);
|
||||||
void Unload(void);
|
void Unload(void);
|
||||||
wchar_t *Get(const char *key);
|
wchar *Get(const char *key);
|
||||||
};
|
};
|
||||||
|
|
||||||
extern CText &TheText;
|
extern CText &TheText;
|
||||||
|
|
100
src/Zones.cpp
100
src/Zones.cpp
|
@ -19,6 +19,26 @@ CZoneInfo *CTheZones::ZoneInfoArray = (CZoneInfo*)0x714400;
|
||||||
|
|
||||||
#define SWAPF(a, b) { float t; t = a; a = b; b = t; }
|
#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
|
void
|
||||||
CTheZones::Init(void)
|
CTheZones::Init(void)
|
||||||
|
@ -49,6 +69,7 @@ CTheZones::Init(void)
|
||||||
zonei->gangThreshold[6] = zonei->gangThreshold[5];
|
zonei->gangThreshold[6] = zonei->gangThreshold[5];
|
||||||
zonei->gangThreshold[7] = zonei->gangThreshold[6];
|
zonei->gangThreshold[7] = zonei->gangThreshold[6];
|
||||||
zonei->gangThreshold[8] = zonei->gangThreshold[7];
|
zonei->gangThreshold[8] = zonei->gangThreshold[7];
|
||||||
|
CheckZoneInfo(zonei);
|
||||||
}
|
}
|
||||||
TotalNumberOfZoneInfos = 1; // why 1?
|
TotalNumberOfZoneInfos = 1; // why 1?
|
||||||
|
|
||||||
|
@ -361,11 +382,11 @@ CTheZones::GetZoneInfoForTimeOfDay(const CVector *pos, CZoneInfo *info)
|
||||||
if(CClock::GetIsTimeInRange(19, 22)){
|
if(CClock::GetIsTimeInRange(19, 22)){
|
||||||
n = (CClock::GetHours() - 19) / 3.0f;
|
n = (CClock::GetHours() - 19) / 3.0f;
|
||||||
assert(n >= 0.0f && n <= 1.0f);
|
assert(n >= 0.0f && n <= 1.0f);
|
||||||
d = n - 1.0f;
|
d = 1.0f - n;
|
||||||
}else{
|
}else{
|
||||||
d = (CClock::GetHours() - 5) / 3.0f;
|
d = (CClock::GetHours() - 5) / 3.0f;
|
||||||
assert(d >= 0.0f && d <= 1.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->carDensity = day->carDensity * d + night->carDensity * n;
|
||||||
info->carThreshold[0] = day->carThreshold[0] * d + night->carThreshold[0] * n;
|
info->carThreshold[0] = day->carThreshold[0] * d + night->carThreshold[0] * n;
|
||||||
|
@ -402,28 +423,9 @@ CTheZones::GetZoneInfoForTimeOfDay(const CVector *pos, CZoneInfo *info)
|
||||||
else
|
else
|
||||||
info->pedGroup = night->pedGroup;
|
info->pedGroup = night->pedGroup;
|
||||||
|
|
||||||
assert(info->carDensity >= 0);
|
CheckZoneInfo(info);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// BUG: there might be a bug somewhere in there that causes
|
|
||||||
// thresholds to become negative so CCarCtrl::ChooseModel will hang
|
|
||||||
|
|
||||||
void
|
void
|
||||||
CTheZones::SetZoneCarInfo(uint16 zoneid, uint8 day, int16 carDensity,
|
CTheZones::SetZoneCarInfo(uint16 zoneid, uint8 day, int16 carDensity,
|
||||||
int16 gang0Num, int16 gang1Num, int16 gang2Num,
|
int16 gang0Num, int16 gang1Num, int16 gang2Num,
|
||||||
|
@ -438,6 +440,8 @@ CTheZones::SetZoneCarInfo(uint16 zoneid, uint8 day, int16 carDensity,
|
||||||
zone = GetZone(zoneid);
|
zone = GetZone(zoneid);
|
||||||
info = &ZoneInfoArray[day ? zone->zoneinfoDay : zone->zoneinfoNight];
|
info = &ZoneInfoArray[day ? zone->zoneinfoDay : zone->zoneinfoNight];
|
||||||
|
|
||||||
|
CheckZoneInfo(info);
|
||||||
|
|
||||||
if(carDensity != -1) info->carDensity = carDensity;
|
if(carDensity != -1) info->carDensity = carDensity;
|
||||||
int16 oldCar1Num = info->carThreshold[1] - info->carThreshold[0];
|
int16 oldCar1Num = info->carThreshold[1] - info->carThreshold[0];
|
||||||
int16 oldCar2Num = info->carThreshold[2] - info->carThreshold[1];
|
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 oldGang7Num = info->gangThreshold[7] - info->gangThreshold[6];
|
||||||
int16 oldGang8Num = info->gangThreshold[8] - info->gangThreshold[7];
|
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(car0Num != -1) info->carThreshold[0] = car0Num;
|
||||||
if(car1Num != -1) info->carThreshold[1] = info->carThreshold[0] + car1Num;
|
if(car1Num != -1) info->carThreshold[1] = info->carThreshold[0] + car1Num;
|
||||||
else info->carThreshold[1] = info->carThreshold[0] + oldCar1Num;
|
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;
|
if(gang8Num != -1) info->gangThreshold[8] = info->gangThreshold[7] + gang8Num;
|
||||||
else info->gangThreshold[8] = info->gangThreshold[7] + oldGang8Num;
|
else info->gangThreshold[8] = info->gangThreshold[7] + oldGang8Num;
|
||||||
|
|
||||||
assert(info->carDensity >= 0);
|
CheckZoneInfo(info);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -534,15 +506,15 @@ CTheZones::SetZonePedInfo(uint16 zoneid, uint8 day, int16 pedDensity,
|
||||||
info = &ZoneInfoArray[day ? zone->zoneinfoDay : zone->zoneinfoNight];
|
info = &ZoneInfoArray[day ? zone->zoneinfoDay : zone->zoneinfoNight];
|
||||||
if(pedDensity != -1) info->pedDensity = pedDensity;
|
if(pedDensity != -1) info->pedDensity = pedDensity;
|
||||||
if(copDensity != -1) info->copDensity = copDensity;
|
if(copDensity != -1) info->copDensity = copDensity;
|
||||||
if(gang0Density != -1) info->gangThreshold[0] = gang0Density;
|
if(gang0Density != -1) info->gangDensity[0] = gang0Density;
|
||||||
if(gang1Density != -1) info->gangThreshold[1] = gang1Density;
|
if(gang1Density != -1) info->gangDensity[1] = gang1Density;
|
||||||
if(gang2Density != -1) info->gangThreshold[2] = gang2Density;
|
if(gang2Density != -1) info->gangDensity[2] = gang2Density;
|
||||||
if(gang3Density != -1) info->gangThreshold[3] = gang3Density;
|
if(gang3Density != -1) info->gangDensity[3] = gang3Density;
|
||||||
if(gang4Density != -1) info->gangThreshold[4] = gang4Density;
|
if(gang4Density != -1) info->gangDensity[4] = gang4Density;
|
||||||
if(gang5Density != -1) info->gangThreshold[5] = gang5Density;
|
if(gang5Density != -1) info->gangDensity[5] = gang5Density;
|
||||||
if(gang6Density != -1) info->gangThreshold[6] = gang6Density;
|
if(gang6Density != -1) info->gangDensity[6] = gang6Density;
|
||||||
if(gang7Density != -1) info->gangThreshold[7] = gang7Density;
|
if(gang7Density != -1) info->gangDensity[7] = gang7Density;
|
||||||
if(gang8Density != -1) info->gangThreshold[8] = gang8Density;
|
if(gang8Density != -1) info->gangDensity[8] = gang8Density;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -33,10 +33,10 @@ class CZoneInfo
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// Car data
|
// Car data
|
||||||
uint16 carDensity;
|
int16 carDensity;
|
||||||
uint16 carThreshold[6];
|
int16 carThreshold[6];
|
||||||
uint16 copThreshold;
|
int16 copThreshold;
|
||||||
uint16 gangThreshold[9];
|
int16 gangThreshold[9];
|
||||||
|
|
||||||
// Ped data
|
// Ped data
|
||||||
uint16 pedDensity;
|
uint16 pedDensity;
|
||||||
|
|
|
@ -40,12 +40,13 @@ typedef int32_t int32, Int32;
|
||||||
typedef uintptr_t uintptr;
|
typedef uintptr_t uintptr;
|
||||||
typedef uint64_t uint64, UInt64;
|
typedef uint64_t uint64, UInt64;
|
||||||
typedef int64_t int64, Int64;
|
typedef int64_t int64, Int64;
|
||||||
|
// hardcode ucs-2
|
||||||
|
typedef uint16_t wchar, WChar;
|
||||||
|
|
||||||
typedef float Float;
|
typedef float Float;
|
||||||
typedef double Double;
|
typedef double Double;
|
||||||
typedef bool Bool;
|
typedef bool Bool;
|
||||||
typedef char Char;
|
typedef char Char;
|
||||||
typedef wchar_t WChar;
|
|
||||||
|
|
||||||
#define nil NULL
|
#define nil NULL
|
||||||
|
|
||||||
|
|
|
@ -59,3 +59,5 @@ enum Config {
|
||||||
|
|
||||||
#define GTA3_1_1_PATCH FALSE
|
#define GTA3_1_1_PATCH FALSE
|
||||||
#define USE_PS2_RAND FALSE
|
#define USE_PS2_RAND FALSE
|
||||||
|
#define RANDOMSPLASH
|
||||||
|
#define CHATTYSPLASH
|
||||||
|
|
165
src/main.cpp
165
src/main.cpp
|
@ -39,6 +39,9 @@
|
||||||
#include "Credits.h"
|
#include "Credits.h"
|
||||||
#include "CullZones.h"
|
#include "CullZones.h"
|
||||||
#include "TimeCycle.h"
|
#include "TimeCycle.h"
|
||||||
|
#include "TxdStore.h"
|
||||||
|
#include "FileMgr.h"
|
||||||
|
#include "Text.h"
|
||||||
#include "Frontend.h"
|
#include "Frontend.h"
|
||||||
|
|
||||||
#define DEFAULT_VIEWWINDOW (tan(CDraw::GetFOV() * (360.0f / PI)))
|
#define DEFAULT_VIEWWINDOW (tan(CDraw::GetFOV() * (360.0f / PI)))
|
||||||
|
@ -72,6 +75,10 @@ void RenderMenus(void);
|
||||||
void DoFade(void);
|
void DoFade(void);
|
||||||
void Render2dStuffAfterFade(void);
|
void Render2dStuffAfterFade(void);
|
||||||
|
|
||||||
|
CSprite2d *LoadSplash(const char *name);
|
||||||
|
void DestroySplashScreen(void);
|
||||||
|
|
||||||
|
|
||||||
extern void (*DebugMenuProcess)(void);
|
extern void (*DebugMenuProcess)(void);
|
||||||
extern void (*DebugMenuRender)(void);
|
extern void (*DebugMenuRender)(void);
|
||||||
|
|
||||||
|
@ -182,6 +189,30 @@ FrontendIdle(void)
|
||||||
DoRWStuffEndOfFrame();
|
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
|
bool
|
||||||
DoRWStuffStartOfFrame_Horizon(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 BottomRed, int16 BottomGreen, int16 BottomBlue, int16 Alpha)
|
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){
|
if(CDraw::FadeValue != 0 || CMenuManager::m_PrefsBrightness < 256){
|
||||||
// LoadSplash
|
CSprite2d *splash = LoadSplash(nil);
|
||||||
|
|
||||||
CRGBA fadeColor;
|
CRGBA fadeColor;
|
||||||
CRect rect;
|
CRect rect;
|
||||||
|
@ -411,7 +442,7 @@ DoFade(void)
|
||||||
fadeColor.g = 255;
|
fadeColor.g = 255;
|
||||||
fadeColor.b = 255;
|
fadeColor.b = 255;
|
||||||
fadeColor.a = CDraw::FadeValue;
|
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();
|
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 "rwcore.h"
|
||||||
#include "rpworld.h"
|
#include "rpworld.h"
|
||||||
#include "rpmatfx.h"
|
#include "rpmatfx.h"
|
||||||
|
@ -590,6 +745,7 @@ STARTPATCHES
|
||||||
InjectHook(0x48E480, Idle, PATCH_JUMP);
|
InjectHook(0x48E480, Idle, PATCH_JUMP);
|
||||||
InjectHook(0x48E700, FrontendIdle, PATCH_JUMP);
|
InjectHook(0x48E700, FrontendIdle, PATCH_JUMP);
|
||||||
|
|
||||||
|
InjectHook(0x48CF10, DoRWStuffStartOfFrame, PATCH_JUMP);
|
||||||
InjectHook(0x48D040, DoRWStuffStartOfFrame_Horizon, PATCH_JUMP);
|
InjectHook(0x48D040, DoRWStuffStartOfFrame_Horizon, PATCH_JUMP);
|
||||||
InjectHook(0x48E030, RenderScene, PATCH_JUMP);
|
InjectHook(0x48E030, RenderScene, PATCH_JUMP);
|
||||||
InjectHook(0x48E080, RenderDebugShit, PATCH_JUMP);
|
InjectHook(0x48E080, RenderDebugShit, PATCH_JUMP);
|
||||||
|
@ -598,6 +754,11 @@ STARTPATCHES
|
||||||
InjectHook(0x48E450, RenderMenus, PATCH_JUMP);
|
InjectHook(0x48E450, RenderMenus, PATCH_JUMP);
|
||||||
InjectHook(0x48D120, DoFade, PATCH_JUMP);
|
InjectHook(0x48D120, DoFade, PATCH_JUMP);
|
||||||
InjectHook(0x48E470, Render2dStuffAfterFade, 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(0x48D470, PluginAttach, PATCH_JUMP);
|
||||||
InjectHook(0x48D520, Initialise3D, PATCH_JUMP);
|
InjectHook(0x48D520, Initialise3D, PATCH_JUMP);
|
||||||
|
|
|
@ -61,6 +61,8 @@ int (*open_script_orig)(const char *path, const char *mode);
|
||||||
int
|
int
|
||||||
open_script(const char *path, const char *mode)
|
open_script(const char *path, const char *mode)
|
||||||
{
|
{
|
||||||
|
if(GetAsyncKeyState('G') & 0x8000)
|
||||||
|
return open_script_orig("main.scm", mode);
|
||||||
if(GetAsyncKeyState('D') & 0x8000)
|
if(GetAsyncKeyState('D') & 0x8000)
|
||||||
return open_script_orig("main_d.scm", mode);
|
return open_script_orig("main_d.scm", mode);
|
||||||
// if(GetAsyncKeyState('R') & 0x8000)
|
// if(GetAsyncKeyState('R') & 0x8000)
|
||||||
|
|
|
@ -37,7 +37,7 @@ CCredits::PrintCreditSpace(float space, uint32 &line)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
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 start = SCREENH + 50.0f;
|
||||||
float y = lineoffset + start - scrolloffset;
|
float y = lineoffset + start - scrolloffset;
|
||||||
|
|
|
@ -11,5 +11,5 @@ public:
|
||||||
static bool AreCreditsDone(void) { return bCreditsGoing; }
|
static bool AreCreditsDone(void) { return bCreditsGoing; }
|
||||||
static void Render(void);
|
static void Render(void);
|
||||||
static void PrintCreditSpace(float space, uint32 &line);
|
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);
|
||||||
};
|
};
|
||||||
|
|
|
@ -78,7 +78,7 @@ CSprite2d::Delete(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
CSprite2d::SetTexture(char *name)
|
CSprite2d::SetTexture(const char *name)
|
||||||
{
|
{
|
||||||
Delete();
|
Delete();
|
||||||
if(name)
|
if(name)
|
||||||
|
@ -86,7 +86,7 @@ CSprite2d::SetTexture(char *name)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
CSprite2d::SetTexture(char *name, char *mask)
|
CSprite2d::SetTexture(const char *name, const char *mask)
|
||||||
{
|
{
|
||||||
Delete();
|
Delete();
|
||||||
if(name)
|
if(name)
|
||||||
|
@ -468,8 +468,8 @@ STARTPATCHES
|
||||||
|
|
||||||
InjectHook(0x51EA00, &CSprite2d::Delete, PATCH_JUMP);
|
InjectHook(0x51EA00, &CSprite2d::Delete, PATCH_JUMP);
|
||||||
InjectHook(0x51F950, &CSprite2d::SetRenderState, PATCH_JUMP);
|
InjectHook(0x51F950, &CSprite2d::SetRenderState, PATCH_JUMP);
|
||||||
InjectHook(0x51EA40, (void (CSprite2d::*)(char*))&CSprite2d::SetTexture, PATCH_JUMP);
|
InjectHook(0x51EA40, (void (CSprite2d::*)(const char*))&CSprite2d::SetTexture, PATCH_JUMP);
|
||||||
InjectHook(0x51EA70, (void (CSprite2d::*)(char*,char*))&CSprite2d::SetTexture, PATCH_JUMP);
|
InjectHook(0x51EA70, (void (CSprite2d::*)(const char*,const char*))&CSprite2d::SetTexture, PATCH_JUMP);
|
||||||
InjectHook(0x51EAA0, &CSprite2d::SetAddressing, PATCH_JUMP);
|
InjectHook(0x51EAA0, &CSprite2d::SetAddressing, PATCH_JUMP);
|
||||||
|
|
||||||
InjectHook(0x51EE90, (void (*)(const CRect&, C4, uint32))CSprite2d::SetVertices, PATCH_JUMP);
|
InjectHook(0x51EE90, (void (*)(const CRect&, C4, uint32))CSprite2d::SetVertices, PATCH_JUMP);
|
||||||
|
|
|
@ -23,8 +23,8 @@ public:
|
||||||
~CSprite2d(void) { Delete(); };
|
~CSprite2d(void) { Delete(); };
|
||||||
void Delete(void);
|
void Delete(void);
|
||||||
void SetRenderState(void);
|
void SetRenderState(void);
|
||||||
void SetTexture(char *name);
|
void SetTexture(const char *name);
|
||||||
void SetTexture(char *name, char *mask);
|
void SetTexture(const char *name, const char *mask);
|
||||||
void SetAddressing(RwTextureAddressMode addr);
|
void SetAddressing(RwTextureAddressMode addr);
|
||||||
void Draw(float x, float y, float w, float h, const CRGBA &col);
|
void Draw(float x, float y, float w, float h, const CRGBA &col);
|
||||||
void Draw(const CRect &rect, const CRGBA &col);
|
void Draw(const CRect &rect, const CRGBA &col);
|
||||||
|
|
Loading…
Reference in a new issue