2020-04-26 20:49:24 +00:00
|
|
|
#include "common.h"
|
|
|
|
|
|
|
|
#include "Messages.h"
|
|
|
|
#include "RwHelper.h"
|
|
|
|
#include "Hud.h"
|
|
|
|
#include "User.h"
|
|
|
|
#include "Timer.h"
|
|
|
|
#include "Text.h"
|
|
|
|
|
|
|
|
#include "ControllerConfig.h"
|
|
|
|
|
|
|
|
#include "Font.h"
|
|
|
|
|
|
|
|
tMessage CMessages::BriefMessages[NUMBRIEFMESSAGES];
|
|
|
|
tPreviousBrief CMessages::PreviousBriefs[NUMPREVIOUSBRIEFS];
|
|
|
|
tBigMessage CMessages::BIGMessages[NUMBIGMESSAGES];
|
|
|
|
char CMessages::PreviousMissionTitle[16]; // unused
|
|
|
|
|
|
|
|
void
|
|
|
|
CMessages::Init()
|
|
|
|
{
|
|
|
|
ClearMessages();
|
|
|
|
|
|
|
|
for (int32 i = 0; i < NUMPREVIOUSBRIEFS; i++) {
|
|
|
|
PreviousBriefs[i].m_pText = nil;
|
|
|
|
PreviousBriefs[i].m_pString = nil;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
uint16
|
|
|
|
CMessages::GetWideStringLength(wchar *src)
|
|
|
|
{
|
|
|
|
uint16 length = 0;
|
|
|
|
while (*(src++)) length++;
|
|
|
|
return length;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMessages::WideStringCopy(wchar *dst, wchar *src, uint16 size)
|
|
|
|
{
|
|
|
|
int32 i = 0;
|
|
|
|
if (src) {
|
|
|
|
while (i < size - 1) {
|
|
|
|
if (!src[i]) break;
|
|
|
|
dst[i] = src[i];
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
while (i < size - 1)
|
|
|
|
dst[i++] = '\0';
|
|
|
|
}
|
|
|
|
dst[i] = '\0';
|
|
|
|
}
|
|
|
|
|
|
|
|
wchar FixupChar(wchar c)
|
|
|
|
{
|
|
|
|
#ifdef MORE_LANGUAGES
|
|
|
|
if (CFont::IsJapanese())
|
|
|
|
return c & 0x7fff;
|
|
|
|
#endif
|
|
|
|
return c;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
CMessages::WideStringCompare(wchar *str1, wchar *str2, uint16 size)
|
|
|
|
{
|
|
|
|
uint16 len1 = GetWideStringLength(str1);
|
|
|
|
uint16 len2 = GetWideStringLength(str2);
|
|
|
|
if (len1 != len2 && (len1 < size || len2 < size))
|
|
|
|
return false;
|
|
|
|
|
2020-10-21 00:11:10 +00:00
|
|
|
for (int32 i = 0; FixupChar(str1[i]) != '\0' && i < size; i++) {
|
2020-04-26 20:49:24 +00:00
|
|
|
if (FixupChar(str1[i]) != FixupChar(str2[i]))
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMessages::Process()
|
|
|
|
{
|
|
|
|
for (int32 style = 0; style < 6; style++) {
|
|
|
|
if (BIGMessages[style].m_Stack[0].m_pText != nil && CTimer::GetTimeInMilliseconds() > BIGMessages[style].m_Stack[0].m_nTime + BIGMessages[style].m_Stack[0].m_nStartTime) {
|
|
|
|
BIGMessages[style].m_Stack[0].m_pText = nil;
|
|
|
|
|
|
|
|
int32 i = 0;
|
|
|
|
while (i < 3) {
|
|
|
|
if (BIGMessages[style].m_Stack[i + 1].m_pText == nil) break;
|
|
|
|
BIGMessages[style].m_Stack[i] = BIGMessages[style].m_Stack[i + 1];
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
|
|
|
|
BIGMessages[style].m_Stack[i].m_pText = nil;
|
|
|
|
BIGMessages[style].m_Stack[0].m_nStartTime = CTimer::GetTimeInMilliseconds();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (BriefMessages[0].m_pText != nil && CTimer::GetTimeInMilliseconds() > BriefMessages[0].m_nTime + BriefMessages[0].m_nStartTime) {
|
|
|
|
BriefMessages[0].m_pText = nil;
|
|
|
|
int32 i = 0;
|
|
|
|
while (i < NUMBRIEFMESSAGES-1) {
|
|
|
|
if (BriefMessages[i + 1].m_pText == nil)
|
|
|
|
break;
|
|
|
|
|
|
|
|
BriefMessages[i] = BriefMessages[i + 1];
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
CMessages::BriefMessages[i].m_pText = nil;
|
|
|
|
CMessages::BriefMessages[0].m_nStartTime = CTimer::GetTimeInMilliseconds();
|
|
|
|
if (BriefMessages[0].m_pText != nil)
|
|
|
|
AddToPreviousBriefArray(
|
|
|
|
BriefMessages[0].m_pText,
|
|
|
|
BriefMessages[0].m_nNumber[0],
|
|
|
|
BriefMessages[0].m_nNumber[1],
|
|
|
|
BriefMessages[0].m_nNumber[2],
|
|
|
|
BriefMessages[0].m_nNumber[3],
|
|
|
|
BriefMessages[0].m_nNumber[4],
|
|
|
|
BriefMessages[0].m_nNumber[5],
|
|
|
|
BriefMessages[0].m_pString);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMessages::Display()
|
|
|
|
{
|
|
|
|
wchar outstr[256];
|
|
|
|
|
|
|
|
DefinedState();
|
|
|
|
|
|
|
|
for (int32 i = 0; i < NUMBIGMESSAGES; i++) {
|
|
|
|
InsertNumberInString(
|
|
|
|
BIGMessages[i].m_Stack[0].m_pText,
|
|
|
|
BIGMessages[i].m_Stack[0].m_nNumber[0],
|
|
|
|
BIGMessages[i].m_Stack[0].m_nNumber[1],
|
|
|
|
BIGMessages[i].m_Stack[0].m_nNumber[2],
|
|
|
|
BIGMessages[i].m_Stack[0].m_nNumber[3],
|
|
|
|
BIGMessages[i].m_Stack[0].m_nNumber[4],
|
|
|
|
BIGMessages[i].m_Stack[0].m_nNumber[5],
|
|
|
|
outstr);
|
|
|
|
InsertStringInString(outstr, BIGMessages[i].m_Stack[0].m_pString);
|
|
|
|
InsertPlayerControlKeysInString(outstr);
|
|
|
|
CHud::SetBigMessage(outstr, i);
|
|
|
|
}
|
|
|
|
|
|
|
|
InsertNumberInString(
|
|
|
|
BriefMessages[0].m_pText,
|
|
|
|
BriefMessages[0].m_nNumber[0],
|
|
|
|
BriefMessages[0].m_nNumber[1],
|
|
|
|
BriefMessages[0].m_nNumber[2],
|
|
|
|
BriefMessages[0].m_nNumber[3],
|
|
|
|
BriefMessages[0].m_nNumber[4],
|
|
|
|
BriefMessages[0].m_nNumber[5],
|
|
|
|
outstr);
|
|
|
|
InsertStringInString(outstr, BriefMessages[0].m_pString);
|
|
|
|
InsertPlayerControlKeysInString(outstr);
|
|
|
|
CHud::SetMessage(outstr);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMessages::AddMessage(wchar *msg, uint32 time, uint16 flag)
|
|
|
|
{
|
|
|
|
wchar outstr[512]; // unused
|
|
|
|
WideStringCopy(outstr, msg, 256);
|
|
|
|
InsertPlayerControlKeysInString(outstr);
|
|
|
|
GetWideStringLength(outstr);
|
|
|
|
|
|
|
|
int32 i = 0;
|
|
|
|
while (i < NUMBRIEFMESSAGES && BriefMessages[i].m_pText != nil)
|
|
|
|
i++;
|
|
|
|
if (i >= NUMBRIEFMESSAGES) return;
|
|
|
|
|
|
|
|
BriefMessages[i].m_pText = msg;
|
|
|
|
BriefMessages[i].m_nFlag = flag;
|
|
|
|
BriefMessages[i].m_nTime = time;
|
|
|
|
BriefMessages[i].m_nStartTime = CTimer::GetTimeInMilliseconds();
|
|
|
|
BriefMessages[i].m_nNumber[0] = -1;
|
|
|
|
BriefMessages[i].m_nNumber[1] = -1;
|
|
|
|
BriefMessages[i].m_nNumber[2] = -1;
|
|
|
|
BriefMessages[i].m_nNumber[3] = -1;
|
|
|
|
BriefMessages[i].m_nNumber[4] = -1;
|
|
|
|
BriefMessages[i].m_nNumber[5] = -1;
|
|
|
|
BriefMessages[i].m_pString = nil;
|
|
|
|
if (i == 0)
|
|
|
|
AddToPreviousBriefArray(
|
|
|
|
BriefMessages[0].m_pText,
|
|
|
|
BriefMessages[0].m_nNumber[0],
|
|
|
|
BriefMessages[0].m_nNumber[1],
|
|
|
|
BriefMessages[0].m_nNumber[2],
|
|
|
|
BriefMessages[0].m_nNumber[3],
|
|
|
|
BriefMessages[0].m_nNumber[4],
|
|
|
|
BriefMessages[0].m_nNumber[5],
|
|
|
|
BriefMessages[0].m_pString);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMessages::AddMessageJumpQ(wchar *msg, uint32 time, uint16 flag)
|
|
|
|
{
|
|
|
|
wchar outstr[512]; // unused
|
|
|
|
WideStringCopy(outstr, msg, 256);
|
|
|
|
InsertPlayerControlKeysInString(outstr);
|
|
|
|
GetWideStringLength(outstr);
|
|
|
|
|
|
|
|
BriefMessages[0].m_pText = msg;
|
|
|
|
BriefMessages[0].m_nFlag = flag;
|
|
|
|
BriefMessages[0].m_nTime = time;
|
|
|
|
BriefMessages[0].m_nStartTime = CTimer::GetTimeInMilliseconds();
|
|
|
|
BriefMessages[0].m_nNumber[0] = -1;
|
|
|
|
BriefMessages[0].m_nNumber[1] = -1;
|
|
|
|
BriefMessages[0].m_nNumber[2] = -1;
|
|
|
|
BriefMessages[0].m_nNumber[3] = -1;
|
|
|
|
BriefMessages[0].m_nNumber[4] = -1;
|
|
|
|
BriefMessages[0].m_nNumber[5] = -1;
|
|
|
|
BriefMessages[0].m_pString = nil;
|
|
|
|
AddToPreviousBriefArray(msg, -1, -1, -1, -1, -1, -1, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMessages::AddMessageSoon(wchar *msg, uint32 time, uint16 flag)
|
|
|
|
{
|
|
|
|
wchar outstr[512]; // unused
|
|
|
|
WideStringCopy(outstr, msg, 256);
|
|
|
|
InsertPlayerControlKeysInString(outstr);
|
|
|
|
GetWideStringLength(outstr);
|
|
|
|
|
|
|
|
if (BriefMessages[0].m_pText != nil) {
|
|
|
|
for (int i = NUMBRIEFMESSAGES-1; i > 1; i--)
|
|
|
|
BriefMessages[i] = BriefMessages[i-1];
|
|
|
|
|
|
|
|
BriefMessages[1].m_pText = msg;
|
|
|
|
BriefMessages[1].m_nFlag = flag;
|
|
|
|
BriefMessages[1].m_nTime = time;
|
|
|
|
BriefMessages[1].m_nStartTime = CTimer::GetTimeInMilliseconds();
|
|
|
|
BriefMessages[1].m_nNumber[0] = -1;
|
|
|
|
BriefMessages[1].m_nNumber[1] = -1;
|
|
|
|
BriefMessages[1].m_nNumber[2] = -1;
|
|
|
|
BriefMessages[1].m_nNumber[3] = -1;
|
|
|
|
BriefMessages[1].m_nNumber[4] = -1;
|
|
|
|
BriefMessages[1].m_nNumber[5] = -1;
|
|
|
|
BriefMessages[1].m_pString = nil;
|
|
|
|
}else{
|
|
|
|
BriefMessages[0].m_pText = msg;
|
|
|
|
BriefMessages[0].m_nFlag = flag;
|
|
|
|
BriefMessages[0].m_nTime = time;
|
|
|
|
BriefMessages[0].m_nStartTime = CTimer::GetTimeInMilliseconds();
|
|
|
|
BriefMessages[0].m_nNumber[0] = -1;
|
|
|
|
BriefMessages[0].m_nNumber[1] = -1;
|
|
|
|
BriefMessages[0].m_nNumber[2] = -1;
|
|
|
|
BriefMessages[0].m_nNumber[3] = -1;
|
|
|
|
BriefMessages[0].m_nNumber[4] = -1;
|
|
|
|
BriefMessages[0].m_nNumber[5] = -1;
|
|
|
|
BriefMessages[0].m_pString = nil;
|
|
|
|
AddToPreviousBriefArray(msg, -1, -1, -1, -1, -1, -1, nil);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMessages::ClearMessages()
|
|
|
|
{
|
|
|
|
for (int32 i = 0; i < NUMBIGMESSAGES; i++) {
|
|
|
|
for (int32 j = 0; j < 4; j++) {
|
|
|
|
BIGMessages[i].m_Stack[j].m_pText = nil;
|
|
|
|
BIGMessages[i].m_Stack[j].m_pString = nil;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ClearSmallMessagesOnly();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMessages::ClearSmallMessagesOnly()
|
|
|
|
{
|
|
|
|
for (int32 i = 0; i < NUMBRIEFMESSAGES; i++) {
|
|
|
|
BriefMessages[i].m_pText = nil;
|
|
|
|
BriefMessages[i].m_pString = nil;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMessages::AddBigMessage(wchar *msg, uint32 time, uint16 style)
|
|
|
|
{
|
|
|
|
wchar outstr[512]; // unused
|
|
|
|
WideStringCopy(outstr, msg, 256);
|
|
|
|
InsertPlayerControlKeysInString(outstr);
|
|
|
|
GetWideStringLength(outstr);
|
|
|
|
|
|
|
|
BIGMessages[style].m_Stack[0].m_pText = msg;
|
|
|
|
BIGMessages[style].m_Stack[0].m_nFlag = 0;
|
|
|
|
BIGMessages[style].m_Stack[0].m_nTime = time;
|
|
|
|
BIGMessages[style].m_Stack[0].m_nStartTime = CTimer::GetTimeInMilliseconds();
|
|
|
|
BIGMessages[style].m_Stack[0].m_nNumber[0] = -1;
|
|
|
|
BIGMessages[style].m_Stack[0].m_nNumber[1] = -1;
|
|
|
|
BIGMessages[style].m_Stack[0].m_nNumber[2] = -1;
|
|
|
|
BIGMessages[style].m_Stack[0].m_nNumber[3] = -1;
|
|
|
|
BIGMessages[style].m_Stack[0].m_nNumber[4] = -1;
|
|
|
|
BIGMessages[style].m_Stack[0].m_nNumber[5] = -1;
|
|
|
|
BIGMessages[style].m_Stack[0].m_pString = nil;
|
|
|
|
}
|
|
|
|
void
|
|
|
|
CMessages::AddBigMessageQ(wchar *msg, uint32 time, uint16 style)
|
|
|
|
{
|
|
|
|
wchar outstr[512]; // unused
|
|
|
|
WideStringCopy(outstr, msg, 256);
|
|
|
|
InsertPlayerControlKeysInString(outstr);
|
|
|
|
GetWideStringLength(outstr);
|
|
|
|
|
|
|
|
int32 i = 0;
|
|
|
|
while (i < 4 && BIGMessages[style].m_Stack[i].m_pText != nil)
|
|
|
|
i++;
|
|
|
|
|
|
|
|
if (i >= 4) return;
|
|
|
|
|
|
|
|
BIGMessages[style].m_Stack[i].m_pText = msg;
|
|
|
|
BIGMessages[style].m_Stack[i].m_nFlag = 0;
|
|
|
|
BIGMessages[style].m_Stack[i].m_nTime = time;
|
|
|
|
BIGMessages[style].m_Stack[i].m_nStartTime = CTimer::GetTimeInMilliseconds();
|
|
|
|
BIGMessages[style].m_Stack[i].m_nNumber[0] = -1;
|
|
|
|
BIGMessages[style].m_Stack[i].m_nNumber[1] = -1;
|
|
|
|
BIGMessages[style].m_Stack[i].m_nNumber[2] = -1;
|
|
|
|
BIGMessages[style].m_Stack[i].m_nNumber[3] = -1;
|
|
|
|
BIGMessages[style].m_Stack[i].m_nNumber[4] = -1;
|
|
|
|
BIGMessages[style].m_Stack[i].m_nNumber[5] = -1;
|
|
|
|
BIGMessages[style].m_Stack[i].m_pString = nil;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMessages::AddToPreviousBriefArray(wchar *text, int32 n1, int32 n2, int32 n3, int32 n4, int32 n5, int32 n6, wchar *string)
|
|
|
|
{
|
|
|
|
int32 i = 0;
|
2020-10-21 00:11:10 +00:00
|
|
|
for (i = 0; PreviousBriefs[i].m_pText && i < NUMPREVIOUSBRIEFS; i++) {
|
2020-04-26 20:49:24 +00:00
|
|
|
if (PreviousBriefs[i].m_nNumber[0] == n1
|
|
|
|
&& PreviousBriefs[i].m_nNumber[1] == n2
|
|
|
|
&& PreviousBriefs[i].m_nNumber[2] == n3
|
|
|
|
&& PreviousBriefs[i].m_nNumber[3] == n4
|
|
|
|
&& PreviousBriefs[i].m_nNumber[4] == n5
|
|
|
|
&& PreviousBriefs[i].m_nNumber[5] == n6
|
|
|
|
&& PreviousBriefs[i].m_pText == text
|
|
|
|
&& PreviousBriefs[i].m_pString == string)
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (i != 0) {
|
|
|
|
if (i == NUMPREVIOUSBRIEFS) i -= 2;
|
|
|
|
else i--;
|
|
|
|
|
|
|
|
while (i >= 0) {
|
|
|
|
PreviousBriefs[i + 1] = PreviousBriefs[i];
|
|
|
|
i--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
PreviousBriefs[0].m_pText = text;
|
|
|
|
PreviousBriefs[0].m_nNumber[0] = n1;
|
|
|
|
PreviousBriefs[0].m_nNumber[1] = n2;
|
|
|
|
PreviousBriefs[0].m_nNumber[2] = n3;
|
|
|
|
PreviousBriefs[0].m_nNumber[3] = n4;
|
|
|
|
PreviousBriefs[0].m_nNumber[4] = n5;
|
|
|
|
PreviousBriefs[0].m_nNumber[5] = n6;
|
|
|
|
PreviousBriefs[0].m_pString = string;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMessages::InsertNumberInString(wchar *str, int32 n1, int32 n2, int32 n3, int32 n4, int32 n5, int32 n6, wchar *outstr)
|
|
|
|
{
|
|
|
|
char numStr[10];
|
|
|
|
wchar wNumStr[10];
|
|
|
|
|
|
|
|
if (str == nil) {
|
|
|
|
*outstr = '\0';
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-10-21 00:11:10 +00:00
|
|
|
sprintf(numStr, "%d", n1);
|
|
|
|
size_t outLen = strlen(numStr);
|
|
|
|
AsciiToUnicode(numStr, wNumStr);
|
|
|
|
if (str[0] == 0) {
|
|
|
|
*outstr = '\0';
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-04-26 20:49:24 +00:00
|
|
|
int32 size = GetWideStringLength(str);
|
|
|
|
|
|
|
|
int32 i = 0;
|
|
|
|
|
|
|
|
for (int32 c = 0; c < size;) {
|
|
|
|
#ifdef MORE_LANGUAGES
|
|
|
|
if ((CFont::IsJapanese() && str[c] == (0x8000 | '~') && str[c + 1] == (0x8000 | '1') && str[c + 2] == (0x8000 | '~')) ||
|
|
|
|
(!CFont::IsJapanese() && str[c] == '~' && str[c + 1] == '1' && str[c + 2] == '~')) {
|
|
|
|
#else
|
|
|
|
if (str[c] == '~' && str[c + 1] == '1' && str[c + 2] == '~') {
|
|
|
|
#endif
|
2020-10-21 00:11:10 +00:00
|
|
|
c += 3;
|
|
|
|
for (int j = 0; j < outLen; j++)
|
|
|
|
*(outstr++) = wNumStr[j++];
|
|
|
|
|
|
|
|
i++;
|
2020-04-26 20:49:24 +00:00
|
|
|
switch (i) {
|
|
|
|
case 0: sprintf(numStr, "%d", n1); break;
|
|
|
|
case 1: sprintf(numStr, "%d", n2); break;
|
|
|
|
case 2: sprintf(numStr, "%d", n3); break;
|
|
|
|
case 3: sprintf(numStr, "%d", n4); break;
|
|
|
|
case 4: sprintf(numStr, "%d", n5); break;
|
|
|
|
case 5: sprintf(numStr, "%d", n6); break;
|
|
|
|
}
|
2020-10-21 00:11:10 +00:00
|
|
|
outLen = strlen(numStr);
|
2020-04-26 20:49:24 +00:00
|
|
|
AsciiToUnicode(numStr, wNumStr);
|
|
|
|
} else {
|
|
|
|
*(outstr++) = str[c++];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*outstr = '\0';
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMessages::InsertStringInString(wchar *str1, wchar *str2)
|
|
|
|
{
|
|
|
|
wchar tempstr[256];
|
|
|
|
|
|
|
|
if (!str1 || !str2) return;
|
|
|
|
|
|
|
|
int32 str1_size = GetWideStringLength(str1);
|
|
|
|
int32 str2_size = GetWideStringLength(str2);
|
|
|
|
int32 total_size = str1_size + str2_size;
|
|
|
|
|
|
|
|
wchar *_str1 = str1;
|
|
|
|
uint16 i;
|
|
|
|
for (i = 0; i < total_size; ) {
|
|
|
|
#ifdef MORE_LANGUAGES
|
|
|
|
if ((CFont::IsJapanese() && *_str1 == (0x8000 | '~') && *(_str1 + 1) == (0x8000 | 'a') && *(_str1 + 2) == (0x8000 | '~'))
|
2020-05-02 22:40:37 +00:00
|
|
|
|| (*_str1 == '~' && *(_str1 + 1) == 'a' && *(_str1 + 2) == '~'))
|
2020-04-26 20:49:24 +00:00
|
|
|
{
|
|
|
|
#else
|
|
|
|
if (*_str1 == '~' && *(_str1 + 1) == 'a' && *(_str1 + 2) == '~') {
|
|
|
|
#endif
|
|
|
|
_str1 += 3;
|
|
|
|
for (int j = 0; j < str2_size; j++) {
|
|
|
|
tempstr[i++] = str2[j];
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
tempstr[i++] = *(_str1++);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
tempstr[i] = '\0';
|
|
|
|
|
|
|
|
for (i = 0; i < total_size; i++)
|
|
|
|
str1[i] = tempstr[i];
|
|
|
|
|
|
|
|
while (i < 256)
|
|
|
|
str1[i++] = '\0';
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMessages::InsertPlayerControlKeysInString(wchar *str)
|
|
|
|
{
|
|
|
|
uint16 i;
|
|
|
|
wchar outstr[256];
|
|
|
|
wchar keybuf[256];
|
|
|
|
|
|
|
|
if (!str) return;
|
|
|
|
uint16 strSize = GetWideStringLength(str);
|
|
|
|
memset(keybuf, 0, 256*sizeof(wchar));
|
|
|
|
|
|
|
|
wchar *_outstr = outstr;
|
|
|
|
for (i = 0; i < strSize;) {
|
|
|
|
#ifdef MORE_LANGUAGES
|
|
|
|
if ((CFont::IsJapanese() && str[i] == (0x8000 | '~') && str[i + 1] == (0x8000 | 'k') && str[i + 2] == (0x8000 | '~')) ||
|
|
|
|
(!CFont::IsJapanese() && str[i] == '~' && str[i + 1] == 'k' && str[i + 2] == '~')) {
|
|
|
|
#else
|
|
|
|
if (str[i] == '~' && str[i + 1] == 'k' && str[i + 2] == '~') {
|
|
|
|
#endif
|
|
|
|
i += 4;
|
2020-10-21 00:11:10 +00:00
|
|
|
bool done = false;
|
|
|
|
for (int32 cont = 0; cont < MAX_CONTROLLERACTIONS && !done; cont++) {
|
2020-04-26 20:49:24 +00:00
|
|
|
uint16 contSize = GetWideStringLength(ControlsManager.m_aActionNames[cont]);
|
|
|
|
if (contSize != 0) {
|
|
|
|
if (WideStringCompare(&str[i], ControlsManager.m_aActionNames[cont], contSize)) {
|
2020-10-21 00:11:10 +00:00
|
|
|
done = true;
|
2020-04-26 20:49:24 +00:00
|
|
|
ControlsManager.GetWideStringOfCommandKeys(cont, keybuf, 256);
|
|
|
|
uint16 keybuf_size = GetWideStringLength(keybuf);
|
|
|
|
for (uint16 j = 0; j < keybuf_size; j++) {
|
|
|
|
*(_outstr++) = keybuf[j];
|
|
|
|
keybuf[j] = '\0';
|
|
|
|
}
|
|
|
|
i += contSize + 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
*(_outstr++) = str[i++];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*_outstr = '\0';
|
|
|
|
|
|
|
|
for (i = 0; i < GetWideStringLength(outstr); i++)
|
|
|
|
str[i] = outstr[i];
|
|
|
|
|
|
|
|
while (i < 256)
|
|
|
|
str[i++] = '\0';
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMessages::AddMessageWithNumber(wchar *str, uint32 time, uint16 flag, int32 n1, int32 n2, int32 n3, int32 n4, int32 n5, int32 n6)
|
|
|
|
{
|
|
|
|
wchar outstr[512]; // unused
|
|
|
|
InsertNumberInString(str, n1, n2, n3, n4, n5, n6, outstr);
|
|
|
|
InsertPlayerControlKeysInString(outstr);
|
|
|
|
GetWideStringLength(outstr);
|
|
|
|
|
|
|
|
uint16 i = 0;
|
|
|
|
while (i < NUMBRIEFMESSAGES && BriefMessages[i].m_pText)
|
|
|
|
i++;
|
|
|
|
|
|
|
|
if (i >= NUMBRIEFMESSAGES) return;
|
|
|
|
|
|
|
|
BriefMessages[i].m_pText = str;
|
|
|
|
BriefMessages[i].m_nFlag = flag;
|
|
|
|
BriefMessages[i].m_nTime = time;
|
|
|
|
BriefMessages[i].m_nStartTime = CTimer::GetTimeInMilliseconds();
|
|
|
|
BriefMessages[i].m_nNumber[0] = n1;
|
|
|
|
BriefMessages[i].m_nNumber[1] = n2;
|
|
|
|
BriefMessages[i].m_nNumber[2] = n3;
|
|
|
|
BriefMessages[i].m_nNumber[3] = n4;
|
|
|
|
BriefMessages[i].m_nNumber[4] = n5;
|
|
|
|
BriefMessages[i].m_nNumber[5] = n6;
|
|
|
|
BriefMessages[i].m_pString = nil;
|
|
|
|
if (i == 0)
|
|
|
|
AddToPreviousBriefArray(
|
|
|
|
BriefMessages[0].m_pText,
|
|
|
|
BriefMessages[0].m_nNumber[0],
|
|
|
|
BriefMessages[0].m_nNumber[1],
|
|
|
|
BriefMessages[0].m_nNumber[2],
|
|
|
|
BriefMessages[0].m_nNumber[3],
|
|
|
|
BriefMessages[0].m_nNumber[4],
|
|
|
|
BriefMessages[0].m_nNumber[5],
|
|
|
|
BriefMessages[0].m_pString);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMessages::AddMessageJumpQWithNumber(wchar *str, uint32 time, uint16 flag, int32 n1, int32 n2, int32 n3, int32 n4, int32 n5, int32 n6)
|
|
|
|
{
|
|
|
|
wchar outstr[512]; // unused
|
|
|
|
InsertNumberInString(str, n1, n2, n3, n4, n5, n6, outstr);
|
|
|
|
InsertPlayerControlKeysInString(outstr);
|
|
|
|
GetWideStringLength(outstr);
|
|
|
|
|
|
|
|
BriefMessages[0].m_pText = str;
|
|
|
|
BriefMessages[0].m_nFlag = flag;
|
|
|
|
BriefMessages[0].m_nTime = time;
|
|
|
|
BriefMessages[0].m_nStartTime = CTimer::GetTimeInMilliseconds();
|
|
|
|
BriefMessages[0].m_nNumber[0] = n1;
|
|
|
|
BriefMessages[0].m_nNumber[1] = n2;
|
|
|
|
BriefMessages[0].m_nNumber[2] = n3;
|
|
|
|
BriefMessages[0].m_nNumber[3] = n4;
|
|
|
|
BriefMessages[0].m_nNumber[4] = n5;
|
|
|
|
BriefMessages[0].m_nNumber[5] = n6;
|
|
|
|
BriefMessages[0].m_pString = nil;
|
|
|
|
AddToPreviousBriefArray(str, n1, n2, n3, n4, n5, n6, nil);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMessages::AddMessageSoonWithNumber(wchar *str, uint32 time, uint16 flag, int32 n1, int32 n2, int32 n3, int32 n4, int32 n5, int32 n6)
|
|
|
|
{
|
|
|
|
wchar outstr[512]; // unused
|
|
|
|
InsertNumberInString(str, n1, n2, n3, n4, n5, n6, outstr);
|
|
|
|
InsertPlayerControlKeysInString(outstr);
|
|
|
|
GetWideStringLength(outstr);
|
|
|
|
|
|
|
|
if (BriefMessages[0].m_pText != nil) {
|
|
|
|
for (int32 i = NUMBRIEFMESSAGES-1; i > 1; i--)
|
|
|
|
BriefMessages[i] = BriefMessages[i-1];
|
|
|
|
|
|
|
|
BriefMessages[1].m_pText = str;
|
|
|
|
BriefMessages[1].m_nFlag = flag;
|
|
|
|
BriefMessages[1].m_nTime = time;
|
|
|
|
BriefMessages[1].m_nStartTime = CTimer::GetTimeInMilliseconds();
|
|
|
|
BriefMessages[1].m_nNumber[0] = n1;
|
|
|
|
BriefMessages[1].m_nNumber[1] = n2;
|
|
|
|
BriefMessages[1].m_nNumber[2] = n3;
|
|
|
|
BriefMessages[1].m_nNumber[3] = n4;
|
|
|
|
BriefMessages[1].m_nNumber[4] = n5;
|
|
|
|
BriefMessages[1].m_nNumber[5] = n6;
|
|
|
|
BriefMessages[1].m_pString = nil;
|
|
|
|
} else {
|
|
|
|
BriefMessages[0].m_pText = str;
|
|
|
|
BriefMessages[0].m_nFlag = flag;
|
|
|
|
BriefMessages[0].m_nTime = time;
|
|
|
|
BriefMessages[0].m_nStartTime = CTimer::GetTimeInMilliseconds();
|
|
|
|
BriefMessages[0].m_nNumber[0] = n1;
|
|
|
|
BriefMessages[0].m_nNumber[1] = n2;
|
|
|
|
BriefMessages[0].m_nNumber[2] = n3;
|
|
|
|
BriefMessages[0].m_nNumber[3] = n4;
|
|
|
|
BriefMessages[0].m_nNumber[4] = n5;
|
|
|
|
BriefMessages[0].m_nNumber[5] = n6;
|
|
|
|
BriefMessages[0].m_pString = nil;
|
|
|
|
AddToPreviousBriefArray(str, n1, n2, n3, n4, n5, n6, nil);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMessages::AddBigMessageWithNumber(wchar *str, uint32 time, uint16 style, int32 n1, int32 n2, int32 n3, int32 n4, int32 n5, int32 n6)
|
|
|
|
{
|
|
|
|
wchar outstr[512]; // unused
|
|
|
|
InsertNumberInString(str, n1, n2, n3, n4, n5, n6, outstr);
|
|
|
|
InsertPlayerControlKeysInString(outstr);
|
|
|
|
GetWideStringLength(outstr);
|
|
|
|
|
|
|
|
BIGMessages[style].m_Stack[0].m_pText = str;
|
|
|
|
BIGMessages[style].m_Stack[0].m_nFlag = 0;
|
|
|
|
BIGMessages[style].m_Stack[0].m_nTime = time;
|
|
|
|
BIGMessages[style].m_Stack[0].m_nStartTime = CTimer::GetTimeInMilliseconds();
|
|
|
|
BIGMessages[style].m_Stack[0].m_nNumber[0] = n1;
|
|
|
|
BIGMessages[style].m_Stack[0].m_nNumber[1] = n2;
|
|
|
|
BIGMessages[style].m_Stack[0].m_nNumber[2] = n3;
|
|
|
|
BIGMessages[style].m_Stack[0].m_nNumber[3] = n4;
|
|
|
|
BIGMessages[style].m_Stack[0].m_nNumber[4] = n5;
|
|
|
|
BIGMessages[style].m_Stack[0].m_nNumber[5] = n6;
|
|
|
|
BIGMessages[style].m_Stack[0].m_pString = nil;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMessages::AddBigMessageWithNumberQ(wchar *str, uint32 time, uint16 style, int32 n1, int32 n2, int32 n3, int32 n4, int32 n5, int32 n6)
|
|
|
|
{
|
|
|
|
wchar outstr[512]; // unused
|
|
|
|
InsertNumberInString(str, n1, n2, n3, n4, n5, n6, outstr);
|
|
|
|
InsertPlayerControlKeysInString(outstr);
|
|
|
|
GetWideStringLength(outstr);
|
|
|
|
|
|
|
|
int32 i = 0;
|
|
|
|
|
|
|
|
while (i < 4 && BIGMessages[style].m_Stack[i].m_pText != nil)
|
|
|
|
i++;
|
|
|
|
|
|
|
|
if (i >= 4) return;
|
|
|
|
|
|
|
|
BIGMessages[style].m_Stack[i].m_pText = str;
|
|
|
|
BIGMessages[style].m_Stack[i].m_nFlag = 0;
|
|
|
|
BIGMessages[style].m_Stack[i].m_nTime = time;
|
|
|
|
BIGMessages[style].m_Stack[i].m_nStartTime = CTimer::GetTimeInMilliseconds();
|
|
|
|
BIGMessages[style].m_Stack[i].m_nNumber[0] = n1;
|
|
|
|
BIGMessages[style].m_Stack[i].m_nNumber[1] = n2;
|
|
|
|
BIGMessages[style].m_Stack[i].m_nNumber[2] = n3;
|
|
|
|
BIGMessages[style].m_Stack[i].m_nNumber[3] = n4;
|
|
|
|
BIGMessages[style].m_Stack[i].m_nNumber[4] = n5;
|
|
|
|
BIGMessages[style].m_Stack[i].m_nNumber[5] = n6;
|
|
|
|
BIGMessages[style].m_Stack[i].m_pString = nil;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMessages::AddMessageWithString(wchar *text, uint32 time, uint16 flag, wchar *str)
|
|
|
|
{
|
|
|
|
wchar outstr[512]; // unused
|
|
|
|
WideStringCopy(outstr, text, 256);
|
|
|
|
InsertStringInString(outstr, str);
|
|
|
|
InsertPlayerControlKeysInString(outstr);
|
|
|
|
GetWideStringLength(outstr);
|
|
|
|
|
|
|
|
int32 i = 0;
|
|
|
|
while (i < NUMBRIEFMESSAGES && BriefMessages[i].m_pText != nil)
|
|
|
|
i++;
|
|
|
|
|
|
|
|
if (i >= NUMBRIEFMESSAGES) return;
|
|
|
|
|
|
|
|
BriefMessages[i].m_pText = text;
|
|
|
|
BriefMessages[i].m_nFlag = flag;
|
|
|
|
BriefMessages[i].m_nTime = time;
|
|
|
|
BriefMessages[i].m_nStartTime = CTimer::GetTimeInMilliseconds();
|
|
|
|
BriefMessages[i].m_nNumber[0] = -1;
|
|
|
|
BriefMessages[i].m_nNumber[1] = -1;
|
|
|
|
BriefMessages[i].m_nNumber[2] = -1;
|
|
|
|
BriefMessages[i].m_nNumber[3] = -1;
|
|
|
|
BriefMessages[i].m_nNumber[4] = -1;
|
|
|
|
BriefMessages[i].m_nNumber[5] = -1;
|
|
|
|
BriefMessages[i].m_pString = str;
|
|
|
|
if (i == 0)
|
|
|
|
AddToPreviousBriefArray(
|
|
|
|
BriefMessages[0].m_pText,
|
|
|
|
BriefMessages[0].m_nNumber[0],
|
|
|
|
BriefMessages[0].m_nNumber[1],
|
|
|
|
BriefMessages[0].m_nNumber[2],
|
|
|
|
BriefMessages[0].m_nNumber[3],
|
|
|
|
BriefMessages[0].m_nNumber[4],
|
|
|
|
BriefMessages[0].m_nNumber[5],
|
|
|
|
BriefMessages[0].m_pString);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMessages::AddMessageJumpQWithString(wchar *text, uint32 time, uint16 flag, wchar *str)
|
|
|
|
{
|
|
|
|
wchar outstr[512]; // unused
|
|
|
|
WideStringCopy(outstr, text, 256);
|
|
|
|
InsertStringInString(outstr, str);
|
|
|
|
InsertPlayerControlKeysInString(outstr);
|
|
|
|
GetWideStringLength(outstr);
|
|
|
|
|
|
|
|
BriefMessages[0].m_pText = text;
|
|
|
|
BriefMessages[0].m_nFlag = flag;
|
|
|
|
BriefMessages[0].m_nTime = time;
|
|
|
|
BriefMessages[0].m_nStartTime = CTimer::GetTimeInMilliseconds();
|
|
|
|
BriefMessages[0].m_nNumber[0] = -1;
|
|
|
|
BriefMessages[0].m_nNumber[1] = -1;
|
|
|
|
BriefMessages[0].m_nNumber[2] = -1;
|
|
|
|
BriefMessages[0].m_nNumber[3] = -1;
|
|
|
|
BriefMessages[0].m_nNumber[4] = -1;
|
|
|
|
BriefMessages[0].m_nNumber[5] = -1;
|
|
|
|
BriefMessages[0].m_pString = str;
|
|
|
|
AddToPreviousBriefArray(text, -1, -1, -1, -1, -1, -1, str);
|
|
|
|
}
|
|
|
|
|
|
|
|
inline bool
|
|
|
|
FastWideStringComparison(wchar *str1, wchar *str2)
|
|
|
|
{
|
|
|
|
while (*str1 == *str2) {
|
|
|
|
++str1;
|
|
|
|
++str2;
|
|
|
|
if (!*str1 && !*str2) return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMessages::ClearThisPrint(wchar *str)
|
|
|
|
{
|
|
|
|
bool equal;
|
|
|
|
|
|
|
|
do {
|
|
|
|
equal = false;
|
|
|
|
uint16 i = 0;
|
|
|
|
while (i < NUMBRIEFMESSAGES) {
|
|
|
|
if (BriefMessages[i].m_pText == nil)
|
|
|
|
break;
|
|
|
|
|
|
|
|
equal = FastWideStringComparison(str, BriefMessages[i].m_pText);
|
|
|
|
|
|
|
|
if (equal) break;
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (equal) {
|
|
|
|
if (i != 0) {
|
|
|
|
BriefMessages[i].m_pText = nil;
|
|
|
|
while (i < NUMBRIEFMESSAGES-1) {
|
|
|
|
if (BriefMessages[i + 1].m_pText == nil)
|
|
|
|
break;
|
|
|
|
|
|
|
|
BriefMessages[i] = BriefMessages[i + 1];
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
BriefMessages[i].m_pText = nil;
|
|
|
|
} else {
|
|
|
|
BriefMessages[0].m_pText = nil;
|
|
|
|
while (i < NUMBRIEFMESSAGES-1) {
|
|
|
|
if (BriefMessages[i + 1].m_pText == nil)
|
|
|
|
break;
|
|
|
|
BriefMessages[i] = BriefMessages[i + 1];
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
BriefMessages[i].m_pText = nil;
|
|
|
|
BriefMessages[0].m_nStartTime = CTimer::GetTimeInMilliseconds();
|
2020-10-21 00:11:10 +00:00
|
|
|
if (BriefMessages[0].m_pText != nil)
|
2020-04-26 20:49:24 +00:00
|
|
|
AddToPreviousBriefArray(
|
|
|
|
BriefMessages[0].m_pText,
|
|
|
|
BriefMessages[0].m_nNumber[0],
|
|
|
|
BriefMessages[0].m_nNumber[1],
|
|
|
|
BriefMessages[0].m_nNumber[2],
|
|
|
|
BriefMessages[0].m_nNumber[3],
|
|
|
|
BriefMessages[0].m_nNumber[4],
|
|
|
|
BriefMessages[0].m_nNumber[5],
|
|
|
|
BriefMessages[0].m_pString);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} while (equal);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMessages::ClearThisBigPrint(wchar *str)
|
|
|
|
{
|
|
|
|
bool equal;
|
|
|
|
|
|
|
|
do {
|
|
|
|
uint16 i = 0;
|
|
|
|
equal = false;
|
|
|
|
uint16 style = 0;
|
|
|
|
while (style < NUMBIGMESSAGES)
|
|
|
|
{
|
|
|
|
if (i >= 4)
|
|
|
|
break;
|
|
|
|
|
|
|
|
if (CMessages::BIGMessages[style].m_Stack[i].m_pText == nil || equal)
|
|
|
|
break;
|
|
|
|
|
|
|
|
equal = FastWideStringComparison(str, BIGMessages[style].m_Stack[i].m_pText);
|
|
|
|
|
|
|
|
if (!equal && ++i == 4) {
|
|
|
|
i = 0;
|
|
|
|
style++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (equal) {
|
|
|
|
if (i != 0) {
|
|
|
|
BIGMessages[style].m_Stack[i].m_pText = nil;
|
|
|
|
while (i < 3) {
|
|
|
|
if (BIGMessages[style].m_Stack[i + 1].m_pText == nil)
|
|
|
|
break;
|
|
|
|
BIGMessages[style].m_Stack[i] = BIGMessages[style].m_Stack[i + 1];
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
BIGMessages[style].m_Stack[i].m_pText = nil;
|
|
|
|
} else {
|
|
|
|
BIGMessages[style].m_Stack[0].m_pText = 0;
|
|
|
|
i = 0;
|
|
|
|
while (i < 3) {
|
|
|
|
if (BIGMessages[style].m_Stack[i + 1].m_pText == nil)
|
|
|
|
break;
|
|
|
|
BIGMessages[style].m_Stack[i] = BIGMessages[style].m_Stack[i + 1];
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
BIGMessages[style].m_Stack[i].m_pText = nil;
|
|
|
|
BIGMessages[style].m_Stack[0].m_nStartTime = CTimer::GetTimeInMilliseconds();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} while (equal);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CMessages::ClearAllMessagesDisplayedByGame()
|
|
|
|
{
|
|
|
|
ClearMessages();
|
|
|
|
for (int32 i = 0; i < NUMPREVIOUSBRIEFS; i++) {
|
|
|
|
PreviousBriefs[i].m_pText = nil;
|
|
|
|
PreviousBriefs[i].m_pString = nil;
|
|
|
|
}
|
|
|
|
CHud::GetRidOfAllHudMessages();
|
|
|
|
CUserDisplay::Pager.ClearMessages();
|
|
|
|
}
|