mirror of
https://github.com/GTAmodding/re3.git
synced 2024-11-15 07:09:00 +00:00
CText encoding fixes
This commit is contained in:
parent
0759dbc1e1
commit
bc0ddc6b18
3 changed files with 71 additions and 23 deletions
|
@ -15,6 +15,7 @@ workspace "re3"
|
||||||
files { "src/render/*.*" }
|
files { "src/render/*.*" }
|
||||||
files { "src/skel/*.*" }
|
files { "src/skel/*.*" }
|
||||||
files { "src/skel/win/*.*" }
|
files { "src/skel/win/*.*" }
|
||||||
|
files { "src/text/*.*" }
|
||||||
files { "src/vehicles/*.*" }
|
files { "src/vehicles/*.*" }
|
||||||
files { "src/weapons/*.*" }
|
files { "src/weapons/*.*" }
|
||||||
files { "eax/*.*" }
|
files { "eax/*.*" }
|
||||||
|
@ -32,6 +33,7 @@ workspace "re3"
|
||||||
includedirs { "src/render" }
|
includedirs { "src/render" }
|
||||||
includedirs { "src/skel/" }
|
includedirs { "src/skel/" }
|
||||||
includedirs { "src/skel/win" }
|
includedirs { "src/skel/win" }
|
||||||
|
includedirs { "src/text" }
|
||||||
includedirs { "src/vehicles" }
|
includedirs { "src/vehicles" }
|
||||||
includedirs { "src/weapons" }
|
includedirs { "src/weapons" }
|
||||||
includedirs { "eax" }
|
includedirs { "eax" }
|
||||||
|
|
|
@ -11,20 +11,10 @@ CText &TheText = *(CText*)0x941520;
|
||||||
|
|
||||||
CText::CText(void)
|
CText::CText(void)
|
||||||
{
|
{
|
||||||
keyArray.entries = nil;
|
encoding = 'e';
|
||||||
keyArray.numEntries = 0;
|
|
||||||
data.chars = nil;
|
|
||||||
data.numChars = 0;
|
|
||||||
encoding = 101;
|
|
||||||
memset(WideErrorString, 0, sizeof(WideErrorString));
|
memset(WideErrorString, 0, sizeof(WideErrorString));
|
||||||
}
|
}
|
||||||
|
|
||||||
CText::~CText(void)
|
|
||||||
{
|
|
||||||
data.Unload();
|
|
||||||
keyArray.Unload();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
CText::Load(void)
|
CText::Load(void)
|
||||||
{
|
{
|
||||||
|
@ -96,12 +86,64 @@ CText::Get(const char *key)
|
||||||
return keyArray.Search(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
|
wchar
|
||||||
CText::GetUpperCase(wchar c)
|
CText::GetUpperCase(wchar c)
|
||||||
{
|
{
|
||||||
// TODO: do this depending on encoding
|
switch (encoding)
|
||||||
if(islower(c))
|
{
|
||||||
return toupper(c);
|
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;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -205,7 +247,7 @@ CData::Unload(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
AsciiToUnicode(const char *src, uint16 *dst)
|
AsciiToUnicode(const char *src, wchar *dst)
|
||||||
{
|
{
|
||||||
while((*dst++ = *src++) != '\0');
|
while((*dst++ = *src++) != '\0');
|
||||||
}
|
}
|
||||||
|
@ -215,8 +257,8 @@ UnicodeToAscii(wchar *src)
|
||||||
{
|
{
|
||||||
static char aStr[256];
|
static char aStr[256];
|
||||||
int len;
|
int len;
|
||||||
for(len = 0; src && *src != 0 && len < 256-1; len++, src++)
|
for(len = 0; *src != '\0' && len < 256-1; len++, src++)
|
||||||
if(*src < 256)
|
if(*src < 128)
|
||||||
aStr[len] = *src;
|
aStr[len] = *src;
|
||||||
else
|
else
|
||||||
aStr[len] = '#';
|
aStr[len] = '#';
|
||||||
|
@ -227,10 +269,9 @@ UnicodeToAscii(wchar *src)
|
||||||
char*
|
char*
|
||||||
UnicodeToAsciiForSaveLoad(wchar *src)
|
UnicodeToAsciiForSaveLoad(wchar *src)
|
||||||
{
|
{
|
||||||
// exact same code as above
|
|
||||||
static char aStr[256];
|
static char aStr[256];
|
||||||
int len;
|
int len;
|
||||||
for(len = 0; src && *src != 0 && len < 256-1; len++, src++)
|
for(len = 0; *src != '\0' && len < 256-1; len++, src++)
|
||||||
if(*src < 256)
|
if(*src < 256)
|
||||||
aStr[len] = *src;
|
aStr[len] = *src;
|
||||||
else
|
else
|
||||||
|
@ -249,7 +290,7 @@ int
|
||||||
UnicodeStrlen(const wchar *str)
|
UnicodeStrlen(const wchar *str)
|
||||||
{
|
{
|
||||||
int len;
|
int len;
|
||||||
for(len = 0; *str != 0; len++, str++);
|
for(len = 0; *str != '\0'; len++, str++);
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -264,6 +305,8 @@ 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);
|
||||||
InjectHook(0x52C5A0, &CText::Get, 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(0x52BE70, &CKeyArray::Load, PATCH_JUMP);
|
||||||
InjectHook(0x52BF60, &CKeyArray::Unload, PATCH_JUMP);
|
InjectHook(0x52BF60, &CKeyArray::Unload, PATCH_JUMP);
|
|
@ -21,6 +21,8 @@ public:
|
||||||
CKeyEntry *entries;
|
CKeyEntry *entries;
|
||||||
int numEntries;
|
int numEntries;
|
||||||
|
|
||||||
|
CKeyArray(void) : entries(nil), numEntries(0) {}
|
||||||
|
~CKeyArray(void) { Unload(); }
|
||||||
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 *chars);
|
void Update(wchar *chars);
|
||||||
|
@ -34,6 +36,8 @@ public:
|
||||||
wchar *chars;
|
wchar *chars;
|
||||||
int numChars;
|
int numChars;
|
||||||
|
|
||||||
|
CData(void) : chars(nil), numChars(0) {}
|
||||||
|
~CData(void) { Unload(); }
|
||||||
void Load(uint32 length, uint8 *data, int *offset);
|
void Load(uint32 length, uint8 *data, int *offset);
|
||||||
void Unload(void);
|
void Unload(void);
|
||||||
};
|
};
|
||||||
|
@ -42,10 +46,9 @@ class CText
|
||||||
{
|
{
|
||||||
CKeyArray keyArray;
|
CKeyArray keyArray;
|
||||||
CData data;
|
CData data;
|
||||||
int8 encoding;
|
char encoding;
|
||||||
public:
|
public:
|
||||||
CText(void);
|
CText(void);
|
||||||
~CText(void);
|
|
||||||
void Load(void);
|
void Load(void);
|
||||||
void Unload(void);
|
void Unload(void);
|
||||||
wchar *Get(const char *key);
|
wchar *Get(const char *key);
|
Loading…
Reference in a new issue