Full CPager
This commit is contained in:
parent
383f70d1e7
commit
c97a28b385
@ -13,8 +13,6 @@ COnscreenTimer& CUserDisplay::OnscnTimer = *(COnscreenTimer*)0x862238;
|
|||||||
CPager& CUserDisplay::Pager = *(CPager*)0x8F2744;
|
CPager& CUserDisplay::Pager = *(CPager*)0x8F2744;
|
||||||
CCurrentVehicle& CUserDisplay::CurrentVehicle = *(CCurrentVehicle*)0x8F5FE8;
|
CCurrentVehicle& CUserDisplay::CurrentVehicle = *(CCurrentVehicle*)0x8F5FE8;
|
||||||
|
|
||||||
WRAPPER void CPager::AddMessage(wchar*, uint16, uint16, uint16) { EAXJMP(0x52B940); }
|
|
||||||
|
|
||||||
WRAPPER void CUserDisplay::Process(void) { EAXJMP(0x4AD690); }
|
WRAPPER void CUserDisplay::Process(void) { EAXJMP(0x4AD690); }
|
||||||
|
|
||||||
void COnscreenTimer::Init() {
|
void COnscreenTimer::Init() {
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "Pager.h"
|
||||||
|
|
||||||
class COnscreenTimerEntry
|
class COnscreenTimerEntry
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -50,12 +52,6 @@ class CCurrentVehicle
|
|||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
class CPager
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
void AddMessage(wchar*, uint16, uint16, uint16);
|
|
||||||
};
|
|
||||||
|
|
||||||
class CUserDisplay
|
class CUserDisplay
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
194
src/text/Pager.cpp
Normal file
194
src/text/Pager.cpp
Normal file
@ -0,0 +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 < 7) {
|
||||||
|
if (m_messages[i + 1].m_pText == nil) break;
|
||||||
|
m_messages[i] = m_messages[i + 1];
|
||||||
|
}
|
||||||
|
m_messages[i].m_pText = nil;
|
||||||
|
if (m_messages[0].m_pText)
|
||||||
|
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) {
|
||||||
|
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 (int i = 0; i < 8; i++) {
|
||||||
|
if (m_messages[i].m_pText) {
|
||||||
|
if (m_messages[i].m_nPriority >= priority)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for (int j = 7; 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 (int i = 0; i < 8; i++) {
|
||||||
|
if (m_messages[i].m_pText) {
|
||||||
|
if (m_messages[i].m_nPriority >= priority)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for (int j = 7; 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 (int i = 0; i < 8; i++)
|
||||||
|
m_messages[i].m_pText = nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CPager::RestartCurrentMessage()
|
||||||
|
{
|
||||||
|
if (m_messages[0].m_pText) {
|
||||||
|
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
|
29
src/text/Pager.h
Normal file
29
src/text/Pager.h
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#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;
|
||||||
|
private:
|
||||||
|
char _pad12[2];
|
||||||
|
public:
|
||||||
|
int32 m_nNumber[6];
|
||||||
|
};
|
||||||
|
|
||||||
|
class CPager
|
||||||
|
{
|
||||||
|
int16 m_nNumDisplayLetters;
|
||||||
|
PagerMessage m_messages[8];
|
||||||
|
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();
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user