mirror of
https://github.com/halpz/re3.git
synced 2025-07-21 17:19:42 +00:00
normalized line endings to LF
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@ -1,194 +1,194 @@
|
||||
#include "common.h"
|
||||
#include "patcher.h"
|
||||
#include "Pager.h"
|
||||
#include "Timer.h"
|
||||
#include "Messages.h"
|
||||
#include "Hud.h"
|
||||
#include "Camera.h"
|
||||
|
||||
void
|
||||
CPager::Init()
|
||||
{
|
||||
ClearMessages();
|
||||
m_nNumDisplayLetters = 8;
|
||||
}
|
||||
|
||||
void
|
||||
CPager::Process()
|
||||
{
|
||||
if (m_messages[0].m_pText != nil && m_messages[0].m_nCurrentPosition >= (int32)m_messages[0].m_nStringLength) {
|
||||
m_messages[0].m_pText = nil;
|
||||
uint16 i = 0;
|
||||
while (i < NUMPAGERMESSAGES-1) {
|
||||
if (m_messages[i + 1].m_pText == nil) break;
|
||||
m_messages[i] = m_messages[i + 1];
|
||||
i++;
|
||||
}
|
||||
m_messages[i].m_pText = nil;
|
||||
if (m_messages[0].m_pText != nil)
|
||||
CMessages::AddToPreviousBriefArray(
|
||||
m_messages[0].m_pText,
|
||||
m_messages[0].m_nNumber[0],
|
||||
m_messages[0].m_nNumber[1],
|
||||
m_messages[0].m_nNumber[2],
|
||||
m_messages[0].m_nNumber[3],
|
||||
m_messages[0].m_nNumber[4],
|
||||
m_messages[0].m_nNumber[5],
|
||||
0);
|
||||
}
|
||||
Display();
|
||||
if (m_messages[0].m_pText != nil) {
|
||||
if (TheCamera.m_WideScreenOn || !CHud::m_Wants_To_Draw_Hud || CHud::m_BigMessage[0][0] || CHud::m_BigMessage[2][0]) {
|
||||
RestartCurrentMessage();
|
||||
} else {
|
||||
if (CTimer::GetTimeInMilliseconds() > m_messages[0].m_nTimeToChangePosition) {
|
||||
m_messages[0].m_nCurrentPosition++;
|
||||
m_messages[0].m_nTimeToChangePosition = CTimer::GetTimeInMilliseconds() + m_messages[0].m_nSpeedMs;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CPager::Display()
|
||||
{
|
||||
wchar outstr1[256];
|
||||
wchar outstr2[260];
|
||||
|
||||
wchar *pText = m_messages[0].m_pText;
|
||||
uint16 i = 0;
|
||||
if (pText != nil) {
|
||||
CMessages::InsertNumberInString(
|
||||
pText,
|
||||
m_messages[0].m_nNumber[0],
|
||||
m_messages[0].m_nNumber[1],
|
||||
m_messages[0].m_nNumber[2],
|
||||
m_messages[0].m_nNumber[3],
|
||||
m_messages[0].m_nNumber[4],
|
||||
m_messages[0].m_nNumber[5],
|
||||
outstr1);
|
||||
for (; i < m_nNumDisplayLetters; i++) {
|
||||
int pos = m_messages[0].m_nCurrentPosition + i;
|
||||
if (pos >= 0) {
|
||||
if (!outstr1[pos]) break;
|
||||
|
||||
outstr2[i] = outstr1[pos];
|
||||
} else {
|
||||
outstr2[i] = ' ';
|
||||
}
|
||||
}
|
||||
}
|
||||
outstr2[i] = '\0';
|
||||
CHud::SetPagerMessage(outstr2);
|
||||
}
|
||||
|
||||
void
|
||||
CPager::AddMessage(wchar *str, uint16 speed, uint16 priority, uint16 a5)
|
||||
{
|
||||
uint16 size = CMessages::GetWideStringLength(str);
|
||||
for (int32 i = 0; i < NUMPAGERMESSAGES; i++) {
|
||||
if (m_messages[i].m_pText) {
|
||||
if (m_messages[i].m_nPriority >= priority)
|
||||
continue;
|
||||
|
||||
for (int j = NUMPAGERMESSAGES-1; j > i; j--)
|
||||
m_messages[j] = m_messages[j-1];
|
||||
|
||||
}
|
||||
m_messages[i].m_pText = str;
|
||||
m_messages[i].m_nSpeedMs = speed;
|
||||
m_messages[i].m_nPriority = priority;
|
||||
m_messages[i].field_10 = a5;
|
||||
m_messages[i].m_nCurrentPosition = -(m_nNumDisplayLetters + 10);
|
||||
m_messages[i].m_nTimeToChangePosition = CTimer::GetTimeInMilliseconds() + speed;
|
||||
m_messages[i].m_nStringLength = size;
|
||||
m_messages[i].m_nNumber[0] = -1;
|
||||
m_messages[i].m_nNumber[1] = -1;
|
||||
m_messages[i].m_nNumber[2] = -1;
|
||||
m_messages[i].m_nNumber[3] = -1;
|
||||
m_messages[i].m_nNumber[4] = -1;
|
||||
m_messages[i].m_nNumber[5] = -1;
|
||||
|
||||
if (i == 0)
|
||||
CMessages::AddToPreviousBriefArray(
|
||||
m_messages[0].m_pText,
|
||||
m_messages[0].m_nNumber[0],
|
||||
m_messages[0].m_nNumber[1],
|
||||
m_messages[0].m_nNumber[2],
|
||||
m_messages[0].m_nNumber[3],
|
||||
m_messages[0].m_nNumber[4],
|
||||
m_messages[0].m_nNumber[5],
|
||||
nil);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CPager::AddMessageWithNumber(wchar *str, int32 n1, int32 n2, int32 n3, int32 n4, int32 n5, int32 n6, uint16 speed, uint16 priority, uint16 a11)
|
||||
{
|
||||
wchar nstr[520];
|
||||
|
||||
CMessages::InsertNumberInString(str, n1, n2, n3, n4, n5, n6, nstr);
|
||||
uint16 size = CMessages::GetWideStringLength(nstr);
|
||||
for (int32 i = 0; i < NUMPAGERMESSAGES; i++) {
|
||||
if (m_messages[i].m_pText) {
|
||||
if (m_messages[i].m_nPriority >= priority)
|
||||
continue;
|
||||
|
||||
for (int j = NUMPAGERMESSAGES-1; j > i; j--)
|
||||
m_messages[j] = m_messages[j - 1];
|
||||
|
||||
}
|
||||
m_messages[i].m_pText = str;
|
||||
m_messages[i].m_nSpeedMs = speed;
|
||||
m_messages[i].m_nPriority = priority;
|
||||
m_messages[i].field_10 = a11;
|
||||
m_messages[i].m_nCurrentPosition = -(m_nNumDisplayLetters + 10);
|
||||
m_messages[i].m_nTimeToChangePosition = CTimer::GetTimeInMilliseconds() + speed;
|
||||
m_messages[i].m_nStringLength = size;
|
||||
m_messages[i].m_nNumber[0] = n1;
|
||||
m_messages[i].m_nNumber[1] = n2;
|
||||
m_messages[i].m_nNumber[2] = n3;
|
||||
m_messages[i].m_nNumber[3] = n4;
|
||||
m_messages[i].m_nNumber[4] = n5;
|
||||
m_messages[i].m_nNumber[5] = n6;
|
||||
|
||||
if (i == 0)
|
||||
CMessages::AddToPreviousBriefArray(
|
||||
m_messages[0].m_pText,
|
||||
m_messages[0].m_nNumber[0],
|
||||
m_messages[0].m_nNumber[1],
|
||||
m_messages[0].m_nNumber[2],
|
||||
m_messages[0].m_nNumber[3],
|
||||
m_messages[0].m_nNumber[4],
|
||||
m_messages[0].m_nNumber[5],
|
||||
nil);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CPager::ClearMessages()
|
||||
{
|
||||
for (int32 i = 0; i < NUMPAGERMESSAGES; i++)
|
||||
m_messages[i].m_pText = nil;
|
||||
}
|
||||
|
||||
void
|
||||
CPager::RestartCurrentMessage()
|
||||
{
|
||||
if (m_messages[0].m_pText != nil) {
|
||||
m_messages[0].m_nCurrentPosition = -(m_nNumDisplayLetters + 10);
|
||||
m_messages[0].m_nTimeToChangePosition = CTimer::GetTimeInMilliseconds() + m_messages[0].m_nSpeedMs;
|
||||
}
|
||||
}
|
||||
|
||||
STARTPATCHES
|
||||
InjectHook(0x52B6F0, &CPager::Init, PATCH_JUMP);
|
||||
InjectHook(0x52B740, &CPager::Process, PATCH_JUMP);
|
||||
InjectHook(0x52B890, &CPager::Display, PATCH_JUMP);
|
||||
InjectHook(0x52B940, &CPager::AddMessage, PATCH_JUMP);
|
||||
InjectHook(0x52BB50, &CPager::AddMessageWithNumber, PATCH_JUMP);
|
||||
InjectHook(0x52BE50, &CPager::RestartCurrentMessage, PATCH_JUMP);
|
||||
InjectHook(0x52BE00, &CPager::ClearMessages, PATCH_JUMP);
|
||||
#include "common.h"
|
||||
#include "patcher.h"
|
||||
#include "Pager.h"
|
||||
#include "Timer.h"
|
||||
#include "Messages.h"
|
||||
#include "Hud.h"
|
||||
#include "Camera.h"
|
||||
|
||||
void
|
||||
CPager::Init()
|
||||
{
|
||||
ClearMessages();
|
||||
m_nNumDisplayLetters = 8;
|
||||
}
|
||||
|
||||
void
|
||||
CPager::Process()
|
||||
{
|
||||
if (m_messages[0].m_pText != nil && m_messages[0].m_nCurrentPosition >= (int32)m_messages[0].m_nStringLength) {
|
||||
m_messages[0].m_pText = nil;
|
||||
uint16 i = 0;
|
||||
while (i < NUMPAGERMESSAGES-1) {
|
||||
if (m_messages[i + 1].m_pText == nil) break;
|
||||
m_messages[i] = m_messages[i + 1];
|
||||
i++;
|
||||
}
|
||||
m_messages[i].m_pText = nil;
|
||||
if (m_messages[0].m_pText != nil)
|
||||
CMessages::AddToPreviousBriefArray(
|
||||
m_messages[0].m_pText,
|
||||
m_messages[0].m_nNumber[0],
|
||||
m_messages[0].m_nNumber[1],
|
||||
m_messages[0].m_nNumber[2],
|
||||
m_messages[0].m_nNumber[3],
|
||||
m_messages[0].m_nNumber[4],
|
||||
m_messages[0].m_nNumber[5],
|
||||
0);
|
||||
}
|
||||
Display();
|
||||
if (m_messages[0].m_pText != nil) {
|
||||
if (TheCamera.m_WideScreenOn || !CHud::m_Wants_To_Draw_Hud || CHud::m_BigMessage[0][0] || CHud::m_BigMessage[2][0]) {
|
||||
RestartCurrentMessage();
|
||||
} else {
|
||||
if (CTimer::GetTimeInMilliseconds() > m_messages[0].m_nTimeToChangePosition) {
|
||||
m_messages[0].m_nCurrentPosition++;
|
||||
m_messages[0].m_nTimeToChangePosition = CTimer::GetTimeInMilliseconds() + m_messages[0].m_nSpeedMs;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CPager::Display()
|
||||
{
|
||||
wchar outstr1[256];
|
||||
wchar outstr2[260];
|
||||
|
||||
wchar *pText = m_messages[0].m_pText;
|
||||
uint16 i = 0;
|
||||
if (pText != nil) {
|
||||
CMessages::InsertNumberInString(
|
||||
pText,
|
||||
m_messages[0].m_nNumber[0],
|
||||
m_messages[0].m_nNumber[1],
|
||||
m_messages[0].m_nNumber[2],
|
||||
m_messages[0].m_nNumber[3],
|
||||
m_messages[0].m_nNumber[4],
|
||||
m_messages[0].m_nNumber[5],
|
||||
outstr1);
|
||||
for (; i < m_nNumDisplayLetters; i++) {
|
||||
int pos = m_messages[0].m_nCurrentPosition + i;
|
||||
if (pos >= 0) {
|
||||
if (!outstr1[pos]) break;
|
||||
|
||||
outstr2[i] = outstr1[pos];
|
||||
} else {
|
||||
outstr2[i] = ' ';
|
||||
}
|
||||
}
|
||||
}
|
||||
outstr2[i] = '\0';
|
||||
CHud::SetPagerMessage(outstr2);
|
||||
}
|
||||
|
||||
void
|
||||
CPager::AddMessage(wchar *str, uint16 speed, uint16 priority, uint16 a5)
|
||||
{
|
||||
uint16 size = CMessages::GetWideStringLength(str);
|
||||
for (int32 i = 0; i < NUMPAGERMESSAGES; i++) {
|
||||
if (m_messages[i].m_pText) {
|
||||
if (m_messages[i].m_nPriority >= priority)
|
||||
continue;
|
||||
|
||||
for (int j = NUMPAGERMESSAGES-1; j > i; j--)
|
||||
m_messages[j] = m_messages[j-1];
|
||||
|
||||
}
|
||||
m_messages[i].m_pText = str;
|
||||
m_messages[i].m_nSpeedMs = speed;
|
||||
m_messages[i].m_nPriority = priority;
|
||||
m_messages[i].field_10 = a5;
|
||||
m_messages[i].m_nCurrentPosition = -(m_nNumDisplayLetters + 10);
|
||||
m_messages[i].m_nTimeToChangePosition = CTimer::GetTimeInMilliseconds() + speed;
|
||||
m_messages[i].m_nStringLength = size;
|
||||
m_messages[i].m_nNumber[0] = -1;
|
||||
m_messages[i].m_nNumber[1] = -1;
|
||||
m_messages[i].m_nNumber[2] = -1;
|
||||
m_messages[i].m_nNumber[3] = -1;
|
||||
m_messages[i].m_nNumber[4] = -1;
|
||||
m_messages[i].m_nNumber[5] = -1;
|
||||
|
||||
if (i == 0)
|
||||
CMessages::AddToPreviousBriefArray(
|
||||
m_messages[0].m_pText,
|
||||
m_messages[0].m_nNumber[0],
|
||||
m_messages[0].m_nNumber[1],
|
||||
m_messages[0].m_nNumber[2],
|
||||
m_messages[0].m_nNumber[3],
|
||||
m_messages[0].m_nNumber[4],
|
||||
m_messages[0].m_nNumber[5],
|
||||
nil);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CPager::AddMessageWithNumber(wchar *str, int32 n1, int32 n2, int32 n3, int32 n4, int32 n5, int32 n6, uint16 speed, uint16 priority, uint16 a11)
|
||||
{
|
||||
wchar nstr[520];
|
||||
|
||||
CMessages::InsertNumberInString(str, n1, n2, n3, n4, n5, n6, nstr);
|
||||
uint16 size = CMessages::GetWideStringLength(nstr);
|
||||
for (int32 i = 0; i < NUMPAGERMESSAGES; i++) {
|
||||
if (m_messages[i].m_pText) {
|
||||
if (m_messages[i].m_nPriority >= priority)
|
||||
continue;
|
||||
|
||||
for (int j = NUMPAGERMESSAGES-1; j > i; j--)
|
||||
m_messages[j] = m_messages[j - 1];
|
||||
|
||||
}
|
||||
m_messages[i].m_pText = str;
|
||||
m_messages[i].m_nSpeedMs = speed;
|
||||
m_messages[i].m_nPriority = priority;
|
||||
m_messages[i].field_10 = a11;
|
||||
m_messages[i].m_nCurrentPosition = -(m_nNumDisplayLetters + 10);
|
||||
m_messages[i].m_nTimeToChangePosition = CTimer::GetTimeInMilliseconds() + speed;
|
||||
m_messages[i].m_nStringLength = size;
|
||||
m_messages[i].m_nNumber[0] = n1;
|
||||
m_messages[i].m_nNumber[1] = n2;
|
||||
m_messages[i].m_nNumber[2] = n3;
|
||||
m_messages[i].m_nNumber[3] = n4;
|
||||
m_messages[i].m_nNumber[4] = n5;
|
||||
m_messages[i].m_nNumber[5] = n6;
|
||||
|
||||
if (i == 0)
|
||||
CMessages::AddToPreviousBriefArray(
|
||||
m_messages[0].m_pText,
|
||||
m_messages[0].m_nNumber[0],
|
||||
m_messages[0].m_nNumber[1],
|
||||
m_messages[0].m_nNumber[2],
|
||||
m_messages[0].m_nNumber[3],
|
||||
m_messages[0].m_nNumber[4],
|
||||
m_messages[0].m_nNumber[5],
|
||||
nil);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CPager::ClearMessages()
|
||||
{
|
||||
for (int32 i = 0; i < NUMPAGERMESSAGES; i++)
|
||||
m_messages[i].m_pText = nil;
|
||||
}
|
||||
|
||||
void
|
||||
CPager::RestartCurrentMessage()
|
||||
{
|
||||
if (m_messages[0].m_pText != nil) {
|
||||
m_messages[0].m_nCurrentPosition = -(m_nNumDisplayLetters + 10);
|
||||
m_messages[0].m_nTimeToChangePosition = CTimer::GetTimeInMilliseconds() + m_messages[0].m_nSpeedMs;
|
||||
}
|
||||
}
|
||||
|
||||
STARTPATCHES
|
||||
InjectHook(0x52B6F0, &CPager::Init, PATCH_JUMP);
|
||||
InjectHook(0x52B740, &CPager::Process, PATCH_JUMP);
|
||||
InjectHook(0x52B890, &CPager::Display, PATCH_JUMP);
|
||||
InjectHook(0x52B940, &CPager::AddMessage, PATCH_JUMP);
|
||||
InjectHook(0x52BB50, &CPager::AddMessageWithNumber, PATCH_JUMP);
|
||||
InjectHook(0x52BE50, &CPager::RestartCurrentMessage, PATCH_JUMP);
|
||||
InjectHook(0x52BE00, &CPager::ClearMessages, PATCH_JUMP);
|
||||
ENDPATCHES
|
@ -1,28 +1,28 @@
|
||||
#pragma once
|
||||
|
||||
struct PagerMessage {
|
||||
wchar *m_pText;
|
||||
uint16 m_nSpeedMs;
|
||||
int16 m_nCurrentPosition;
|
||||
uint16 m_nStringLength;
|
||||
uint16 m_nPriority;
|
||||
uint32 m_nTimeToChangePosition;
|
||||
int16 field_10;
|
||||
int32 m_nNumber[6];
|
||||
};
|
||||
|
||||
#define NUMPAGERMESSAGES 8
|
||||
|
||||
class CPager
|
||||
{
|
||||
int16 m_nNumDisplayLetters;
|
||||
PagerMessage m_messages[NUMPAGERMESSAGES];
|
||||
public:
|
||||
void Init();
|
||||
void Process();
|
||||
void Display();
|
||||
void AddMessage(wchar*, uint16, uint16, uint16);
|
||||
void AddMessageWithNumber(wchar *str, int32 n1, int32 n2, int32 n3, int32 n4, int32 n5, int32 n6, uint16 speed, uint16 priority, uint16 a11);
|
||||
void ClearMessages();
|
||||
void RestartCurrentMessage();
|
||||
#pragma once
|
||||
|
||||
struct PagerMessage {
|
||||
wchar *m_pText;
|
||||
uint16 m_nSpeedMs;
|
||||
int16 m_nCurrentPosition;
|
||||
uint16 m_nStringLength;
|
||||
uint16 m_nPriority;
|
||||
uint32 m_nTimeToChangePosition;
|
||||
int16 field_10;
|
||||
int32 m_nNumber[6];
|
||||
};
|
||||
|
||||
#define NUMPAGERMESSAGES 8
|
||||
|
||||
class CPager
|
||||
{
|
||||
int16 m_nNumDisplayLetters;
|
||||
PagerMessage m_messages[NUMPAGERMESSAGES];
|
||||
public:
|
||||
void Init();
|
||||
void Process();
|
||||
void Display();
|
||||
void AddMessage(wchar*, uint16, uint16, uint16);
|
||||
void AddMessageWithNumber(wchar *str, int32 n1, int32 n2, int32 n3, int32 n4, int32 n5, int32 n6, uint16 speed, uint16 priority, uint16 a11);
|
||||
void ClearMessages();
|
||||
void RestartCurrentMessage();
|
||||
};
|
@ -1,324 +1,324 @@
|
||||
#include "common.h"
|
||||
#include "patcher.h"
|
||||
#include "FileMgr.h"
|
||||
#include "Frontend.h"
|
||||
#include "Messages.h"
|
||||
#include "Text.h"
|
||||
|
||||
static wchar WideErrorString[25];
|
||||
|
||||
CText &TheText = *(CText*)0x941520;
|
||||
|
||||
CText::CText(void)
|
||||
{
|
||||
encoding = 'e';
|
||||
memset(WideErrorString, 0, sizeof(WideErrorString));
|
||||
}
|
||||
|
||||
void
|
||||
CText::Load(void)
|
||||
{
|
||||
uint8 *filedata;
|
||||
char filename[32], type[4];
|
||||
int length;
|
||||
int offset, sectlen;
|
||||
|
||||
Unload();
|
||||
filedata = new uint8[0x40000];
|
||||
|
||||
CFileMgr::SetDir("TEXT");
|
||||
switch(CMenuManager::m_PrefsLanguage){
|
||||
case LANGUAGE_AMERICAN:
|
||||
sprintf(filename, "AMERICAN.GXT");
|
||||
break;
|
||||
case LANGUAGE_FRENCH:
|
||||
sprintf(filename, "FRENCH.GXT");
|
||||
break;
|
||||
case LANGUAGE_GERMAN:
|
||||
sprintf(filename, "GERMAN.GXT");
|
||||
break;
|
||||
case LANGUAGE_ITALIAN:
|
||||
sprintf(filename, "ITALIAN.GXT");
|
||||
break;
|
||||
case LANGUAGE_SPANISH:
|
||||
sprintf(filename, "SPANISH.GXT");
|
||||
break;
|
||||
#ifdef MORE_LANGUAGES
|
||||
case LANGUAGE_RUSSIAN:
|
||||
sprintf(filename, "RUSSIAN.GXT");
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
||||
length = CFileMgr::LoadFile(filename, filedata, 0x40000, "rb");
|
||||
CFileMgr::SetDir("");
|
||||
|
||||
offset = 0;
|
||||
while(offset < length){
|
||||
type[0] = filedata[offset++];
|
||||
type[1] = filedata[offset++];
|
||||
type[2] = filedata[offset++];
|
||||
type[3] = filedata[offset++];
|
||||
sectlen = (int)filedata[offset+3]<<24 | (int)filedata[offset+2]<<16 |
|
||||
(int)filedata[offset+1]<<8 | (int)filedata[offset+0];
|
||||
offset += 4;
|
||||
if(sectlen != 0){
|
||||
if(strncmp(type, "TKEY", 4) == 0)
|
||||
keyArray.Load(sectlen, filedata, &offset);
|
||||
else if(strncmp(type, "TDAT", 4) == 0)
|
||||
data.Load(sectlen, filedata, &offset);
|
||||
else
|
||||
offset += sectlen;
|
||||
}
|
||||
}
|
||||
|
||||
keyArray.Update(data.chars);
|
||||
|
||||
delete[] filedata;
|
||||
}
|
||||
|
||||
void
|
||||
CText::Unload(void)
|
||||
{
|
||||
CMessages::ClearAllMessagesDisplayedByGame();
|
||||
data.Unload();
|
||||
keyArray.Unload();
|
||||
}
|
||||
|
||||
wchar*
|
||||
CText::Get(const char *key)
|
||||
{
|
||||
return keyArray.Search(key);
|
||||
}
|
||||
|
||||
wchar UpperCaseTable[128] = {
|
||||
128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138,
|
||||
139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
|
||||
150, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137,
|
||||
138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148,
|
||||
149, 173, 173, 175, 176, 177, 178, 179, 180, 181, 182,
|
||||
183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193,
|
||||
194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204,
|
||||
205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215,
|
||||
216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226,
|
||||
227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237,
|
||||
238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248,
|
||||
249, 250, 251, 252, 253, 254, 255
|
||||
};
|
||||
|
||||
wchar FrenchUpperCaseTable[128] = {
|
||||
128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138,
|
||||
139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
|
||||
150, 65, 65, 65, 65, 132, 133, 69, 69, 69, 69, 73, 73,
|
||||
73, 73, 79, 79, 79, 79, 85, 85, 85, 85, 173, 173, 175,
|
||||
176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186,
|
||||
187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197,
|
||||
198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208,
|
||||
209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
|
||||
220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230,
|
||||
231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241,
|
||||
242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252,
|
||||
253, 254, 255
|
||||
};
|
||||
|
||||
wchar
|
||||
CText::GetUpperCase(wchar c)
|
||||
{
|
||||
switch (encoding)
|
||||
{
|
||||
case 'e':
|
||||
if (c >= 'a' && c <= 'z')
|
||||
return c - 32;
|
||||
break;
|
||||
case 'f':
|
||||
if (c >= 'a' && c <= 'z')
|
||||
return c - 32;
|
||||
|
||||
if (c >= 128 && c <= 255)
|
||||
return FrenchUpperCaseTable[c-128];
|
||||
break;
|
||||
case 'g':
|
||||
case 'i':
|
||||
case 's':
|
||||
if (c >= 'a' && c <= 'z')
|
||||
return c - 32;
|
||||
|
||||
if (c >= 128 && c <= 255)
|
||||
return UpperCaseTable[c-128];
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
void
|
||||
CText::UpperCase(wchar *s)
|
||||
{
|
||||
while(*s){
|
||||
*s = GetUpperCase(*s);
|
||||
s++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
CKeyArray::Load(uint32 length, uint8 *data, int *offset)
|
||||
{
|
||||
uint32 i;
|
||||
uint8 *rawbytes;
|
||||
|
||||
numEntries = length / sizeof(CKeyEntry);
|
||||
entries = new CKeyEntry[numEntries];
|
||||
rawbytes = (uint8*)entries;
|
||||
|
||||
for(i = 0; i < length; i++)
|
||||
rawbytes[i] = data[(*offset)++];
|
||||
}
|
||||
|
||||
void
|
||||
CKeyArray::Unload(void)
|
||||
{
|
||||
delete[] entries;
|
||||
entries = nil;
|
||||
numEntries = 0;
|
||||
}
|
||||
|
||||
void
|
||||
CKeyArray::Update(wchar *chars)
|
||||
{
|
||||
int i;
|
||||
for(i = 0; i < numEntries; i++)
|
||||
entries[i].value = (wchar*)((uint8*)chars + (uintptr)entries[i].value);
|
||||
}
|
||||
|
||||
CKeyEntry*
|
||||
CKeyArray::BinarySearch(const char *key, CKeyEntry *entries, int16 low, int16 high)
|
||||
{
|
||||
int mid;
|
||||
int diff;
|
||||
|
||||
if(low > high)
|
||||
return nil;
|
||||
|
||||
mid = (low + high)/2;
|
||||
diff = strcmp(key, entries[mid].key);
|
||||
if(diff == 0)
|
||||
return &entries[mid];
|
||||
if(diff < 0)
|
||||
return BinarySearch(key, entries, low, mid-1);
|
||||
if(diff > 0)
|
||||
return BinarySearch(key, entries, mid+1, high);
|
||||
return nil;
|
||||
}
|
||||
|
||||
wchar*
|
||||
CKeyArray::Search(const char *key)
|
||||
{
|
||||
CKeyEntry *found;
|
||||
char errstr[25];
|
||||
int i;
|
||||
|
||||
found = BinarySearch(key, entries, 0, numEntries-1);
|
||||
if(found)
|
||||
return found->value;
|
||||
sprintf(errstr, "%s missing", key);
|
||||
for(i = 0; i < 25; i++)
|
||||
WideErrorString[i] = errstr[i];
|
||||
return WideErrorString;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
CData::Load(uint32 length, uint8 *data, int *offset)
|
||||
{
|
||||
uint32 i;
|
||||
uint8 *rawbytes;
|
||||
|
||||
numChars = length / sizeof(wchar);
|
||||
chars = new wchar[numChars];
|
||||
rawbytes = (uint8*)chars;
|
||||
|
||||
for(i = 0; i < length; i++)
|
||||
rawbytes[i] = data[(*offset)++];
|
||||
}
|
||||
|
||||
void
|
||||
CData::Unload(void)
|
||||
{
|
||||
delete[] chars;
|
||||
chars = nil;
|
||||
numChars = 0;
|
||||
}
|
||||
|
||||
void
|
||||
AsciiToUnicode(const char *src, wchar *dst)
|
||||
{
|
||||
while((*dst++ = *src++) != '\0');
|
||||
}
|
||||
|
||||
char*
|
||||
UnicodeToAscii(wchar *src)
|
||||
{
|
||||
static char aStr[256];
|
||||
int len;
|
||||
for(len = 0; *src != '\0' && len < 256-1; len++, src++)
|
||||
if(*src < 128)
|
||||
aStr[len] = *src;
|
||||
else
|
||||
aStr[len] = '#';
|
||||
aStr[len] = '\0';
|
||||
return aStr;
|
||||
}
|
||||
|
||||
char*
|
||||
UnicodeToAsciiForSaveLoad(wchar *src)
|
||||
{
|
||||
static char aStr[256];
|
||||
int len;
|
||||
for(len = 0; *src != '\0' && len < 256-1; len++, src++)
|
||||
if(*src < 256)
|
||||
aStr[len] = *src;
|
||||
else
|
||||
aStr[len] = '#';
|
||||
aStr[len] = '\0';
|
||||
return aStr;
|
||||
}
|
||||
|
||||
void
|
||||
UnicodeStrcpy(wchar *dst, const wchar *src)
|
||||
{
|
||||
while((*dst++ = *src++) != '\0');
|
||||
}
|
||||
|
||||
int
|
||||
UnicodeStrlen(const wchar *str)
|
||||
{
|
||||
int len;
|
||||
for(len = 0; *str != '\0'; len++, str++);
|
||||
return len;
|
||||
}
|
||||
|
||||
void
|
||||
TextCopy(wchar *dst, const wchar *src)
|
||||
{
|
||||
while((*dst++ = *src++) != '\0');
|
||||
}
|
||||
|
||||
|
||||
STARTPATCHES
|
||||
InjectHook(0x52C3C0, &CText::Load, PATCH_JUMP);
|
||||
InjectHook(0x52C580, &CText::Unload, PATCH_JUMP);
|
||||
InjectHook(0x52C5A0, &CText::Get, PATCH_JUMP);
|
||||
InjectHook(0x52C220, &CText::GetUpperCase, PATCH_JUMP);
|
||||
InjectHook(0x52C2C0, &CText::UpperCase, PATCH_JUMP);
|
||||
|
||||
InjectHook(0x52BE70, &CKeyArray::Load, PATCH_JUMP);
|
||||
InjectHook(0x52BF60, &CKeyArray::Unload, PATCH_JUMP);
|
||||
InjectHook(0x52BF80, &CKeyArray::Update, PATCH_JUMP);
|
||||
InjectHook(0x52C060, &CKeyArray::BinarySearch, PATCH_JUMP);
|
||||
InjectHook(0x52BFB0, &CKeyArray::Search, PATCH_JUMP);
|
||||
|
||||
InjectHook(0x52C120, &CData::Load, PATCH_JUMP);
|
||||
InjectHook(0x52C200, &CData::Unload, PATCH_JUMP);
|
||||
ENDPATCHES
|
||||
#include "common.h"
|
||||
#include "patcher.h"
|
||||
#include "FileMgr.h"
|
||||
#include "Frontend.h"
|
||||
#include "Messages.h"
|
||||
#include "Text.h"
|
||||
|
||||
static wchar WideErrorString[25];
|
||||
|
||||
CText &TheText = *(CText*)0x941520;
|
||||
|
||||
CText::CText(void)
|
||||
{
|
||||
encoding = 'e';
|
||||
memset(WideErrorString, 0, sizeof(WideErrorString));
|
||||
}
|
||||
|
||||
void
|
||||
CText::Load(void)
|
||||
{
|
||||
uint8 *filedata;
|
||||
char filename[32], type[4];
|
||||
int length;
|
||||
int offset, sectlen;
|
||||
|
||||
Unload();
|
||||
filedata = new uint8[0x40000];
|
||||
|
||||
CFileMgr::SetDir("TEXT");
|
||||
switch(CMenuManager::m_PrefsLanguage){
|
||||
case LANGUAGE_AMERICAN:
|
||||
sprintf(filename, "AMERICAN.GXT");
|
||||
break;
|
||||
case LANGUAGE_FRENCH:
|
||||
sprintf(filename, "FRENCH.GXT");
|
||||
break;
|
||||
case LANGUAGE_GERMAN:
|
||||
sprintf(filename, "GERMAN.GXT");
|
||||
break;
|
||||
case LANGUAGE_ITALIAN:
|
||||
sprintf(filename, "ITALIAN.GXT");
|
||||
break;
|
||||
case LANGUAGE_SPANISH:
|
||||
sprintf(filename, "SPANISH.GXT");
|
||||
break;
|
||||
#ifdef MORE_LANGUAGES
|
||||
case LANGUAGE_RUSSIAN:
|
||||
sprintf(filename, "RUSSIAN.GXT");
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
||||
length = CFileMgr::LoadFile(filename, filedata, 0x40000, "rb");
|
||||
CFileMgr::SetDir("");
|
||||
|
||||
offset = 0;
|
||||
while(offset < length){
|
||||
type[0] = filedata[offset++];
|
||||
type[1] = filedata[offset++];
|
||||
type[2] = filedata[offset++];
|
||||
type[3] = filedata[offset++];
|
||||
sectlen = (int)filedata[offset+3]<<24 | (int)filedata[offset+2]<<16 |
|
||||
(int)filedata[offset+1]<<8 | (int)filedata[offset+0];
|
||||
offset += 4;
|
||||
if(sectlen != 0){
|
||||
if(strncmp(type, "TKEY", 4) == 0)
|
||||
keyArray.Load(sectlen, filedata, &offset);
|
||||
else if(strncmp(type, "TDAT", 4) == 0)
|
||||
data.Load(sectlen, filedata, &offset);
|
||||
else
|
||||
offset += sectlen;
|
||||
}
|
||||
}
|
||||
|
||||
keyArray.Update(data.chars);
|
||||
|
||||
delete[] filedata;
|
||||
}
|
||||
|
||||
void
|
||||
CText::Unload(void)
|
||||
{
|
||||
CMessages::ClearAllMessagesDisplayedByGame();
|
||||
data.Unload();
|
||||
keyArray.Unload();
|
||||
}
|
||||
|
||||
wchar*
|
||||
CText::Get(const char *key)
|
||||
{
|
||||
return keyArray.Search(key);
|
||||
}
|
||||
|
||||
wchar UpperCaseTable[128] = {
|
||||
128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138,
|
||||
139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
|
||||
150, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137,
|
||||
138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148,
|
||||
149, 173, 173, 175, 176, 177, 178, 179, 180, 181, 182,
|
||||
183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193,
|
||||
194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204,
|
||||
205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215,
|
||||
216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226,
|
||||
227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237,
|
||||
238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248,
|
||||
249, 250, 251, 252, 253, 254, 255
|
||||
};
|
||||
|
||||
wchar FrenchUpperCaseTable[128] = {
|
||||
128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138,
|
||||
139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
|
||||
150, 65, 65, 65, 65, 132, 133, 69, 69, 69, 69, 73, 73,
|
||||
73, 73, 79, 79, 79, 79, 85, 85, 85, 85, 173, 173, 175,
|
||||
176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186,
|
||||
187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197,
|
||||
198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208,
|
||||
209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
|
||||
220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230,
|
||||
231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241,
|
||||
242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252,
|
||||
253, 254, 255
|
||||
};
|
||||
|
||||
wchar
|
||||
CText::GetUpperCase(wchar c)
|
||||
{
|
||||
switch (encoding)
|
||||
{
|
||||
case 'e':
|
||||
if (c >= 'a' && c <= 'z')
|
||||
return c - 32;
|
||||
break;
|
||||
case 'f':
|
||||
if (c >= 'a' && c <= 'z')
|
||||
return c - 32;
|
||||
|
||||
if (c >= 128 && c <= 255)
|
||||
return FrenchUpperCaseTable[c-128];
|
||||
break;
|
||||
case 'g':
|
||||
case 'i':
|
||||
case 's':
|
||||
if (c >= 'a' && c <= 'z')
|
||||
return c - 32;
|
||||
|
||||
if (c >= 128 && c <= 255)
|
||||
return UpperCaseTable[c-128];
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
void
|
||||
CText::UpperCase(wchar *s)
|
||||
{
|
||||
while(*s){
|
||||
*s = GetUpperCase(*s);
|
||||
s++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
CKeyArray::Load(uint32 length, uint8 *data, int *offset)
|
||||
{
|
||||
uint32 i;
|
||||
uint8 *rawbytes;
|
||||
|
||||
numEntries = length / sizeof(CKeyEntry);
|
||||
entries = new CKeyEntry[numEntries];
|
||||
rawbytes = (uint8*)entries;
|
||||
|
||||
for(i = 0; i < length; i++)
|
||||
rawbytes[i] = data[(*offset)++];
|
||||
}
|
||||
|
||||
void
|
||||
CKeyArray::Unload(void)
|
||||
{
|
||||
delete[] entries;
|
||||
entries = nil;
|
||||
numEntries = 0;
|
||||
}
|
||||
|
||||
void
|
||||
CKeyArray::Update(wchar *chars)
|
||||
{
|
||||
int i;
|
||||
for(i = 0; i < numEntries; i++)
|
||||
entries[i].value = (wchar*)((uint8*)chars + (uintptr)entries[i].value);
|
||||
}
|
||||
|
||||
CKeyEntry*
|
||||
CKeyArray::BinarySearch(const char *key, CKeyEntry *entries, int16 low, int16 high)
|
||||
{
|
||||
int mid;
|
||||
int diff;
|
||||
|
||||
if(low > high)
|
||||
return nil;
|
||||
|
||||
mid = (low + high)/2;
|
||||
diff = strcmp(key, entries[mid].key);
|
||||
if(diff == 0)
|
||||
return &entries[mid];
|
||||
if(diff < 0)
|
||||
return BinarySearch(key, entries, low, mid-1);
|
||||
if(diff > 0)
|
||||
return BinarySearch(key, entries, mid+1, high);
|
||||
return nil;
|
||||
}
|
||||
|
||||
wchar*
|
||||
CKeyArray::Search(const char *key)
|
||||
{
|
||||
CKeyEntry *found;
|
||||
char errstr[25];
|
||||
int i;
|
||||
|
||||
found = BinarySearch(key, entries, 0, numEntries-1);
|
||||
if(found)
|
||||
return found->value;
|
||||
sprintf(errstr, "%s missing", key);
|
||||
for(i = 0; i < 25; i++)
|
||||
WideErrorString[i] = errstr[i];
|
||||
return WideErrorString;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
CData::Load(uint32 length, uint8 *data, int *offset)
|
||||
{
|
||||
uint32 i;
|
||||
uint8 *rawbytes;
|
||||
|
||||
numChars = length / sizeof(wchar);
|
||||
chars = new wchar[numChars];
|
||||
rawbytes = (uint8*)chars;
|
||||
|
||||
for(i = 0; i < length; i++)
|
||||
rawbytes[i] = data[(*offset)++];
|
||||
}
|
||||
|
||||
void
|
||||
CData::Unload(void)
|
||||
{
|
||||
delete[] chars;
|
||||
chars = nil;
|
||||
numChars = 0;
|
||||
}
|
||||
|
||||
void
|
||||
AsciiToUnicode(const char *src, wchar *dst)
|
||||
{
|
||||
while((*dst++ = *src++) != '\0');
|
||||
}
|
||||
|
||||
char*
|
||||
UnicodeToAscii(wchar *src)
|
||||
{
|
||||
static char aStr[256];
|
||||
int len;
|
||||
for(len = 0; *src != '\0' && len < 256-1; len++, src++)
|
||||
if(*src < 128)
|
||||
aStr[len] = *src;
|
||||
else
|
||||
aStr[len] = '#';
|
||||
aStr[len] = '\0';
|
||||
return aStr;
|
||||
}
|
||||
|
||||
char*
|
||||
UnicodeToAsciiForSaveLoad(wchar *src)
|
||||
{
|
||||
static char aStr[256];
|
||||
int len;
|
||||
for(len = 0; *src != '\0' && len < 256-1; len++, src++)
|
||||
if(*src < 256)
|
||||
aStr[len] = *src;
|
||||
else
|
||||
aStr[len] = '#';
|
||||
aStr[len] = '\0';
|
||||
return aStr;
|
||||
}
|
||||
|
||||
void
|
||||
UnicodeStrcpy(wchar *dst, const wchar *src)
|
||||
{
|
||||
while((*dst++ = *src++) != '\0');
|
||||
}
|
||||
|
||||
int
|
||||
UnicodeStrlen(const wchar *str)
|
||||
{
|
||||
int len;
|
||||
for(len = 0; *str != '\0'; len++, str++);
|
||||
return len;
|
||||
}
|
||||
|
||||
void
|
||||
TextCopy(wchar *dst, const wchar *src)
|
||||
{
|
||||
while((*dst++ = *src++) != '\0');
|
||||
}
|
||||
|
||||
|
||||
STARTPATCHES
|
||||
InjectHook(0x52C3C0, &CText::Load, PATCH_JUMP);
|
||||
InjectHook(0x52C580, &CText::Unload, PATCH_JUMP);
|
||||
InjectHook(0x52C5A0, &CText::Get, PATCH_JUMP);
|
||||
InjectHook(0x52C220, &CText::GetUpperCase, PATCH_JUMP);
|
||||
InjectHook(0x52C2C0, &CText::UpperCase, PATCH_JUMP);
|
||||
|
||||
InjectHook(0x52BE70, &CKeyArray::Load, PATCH_JUMP);
|
||||
InjectHook(0x52BF60, &CKeyArray::Unload, PATCH_JUMP);
|
||||
InjectHook(0x52BF80, &CKeyArray::Update, PATCH_JUMP);
|
||||
InjectHook(0x52C060, &CKeyArray::BinarySearch, PATCH_JUMP);
|
||||
InjectHook(0x52BFB0, &CKeyArray::Search, PATCH_JUMP);
|
||||
|
||||
InjectHook(0x52C120, &CData::Load, PATCH_JUMP);
|
||||
InjectHook(0x52C200, &CData::Unload, PATCH_JUMP);
|
||||
ENDPATCHES
|
||||
|
Reference in New Issue
Block a user