summaryrefslogblamecommitdiffstats
path: root/src/text/Pager.cpp
blob: d20be45dbe250bbb0b2450f47da4e0df8518c438 (plain) (tree)

































































































































































































                                                                                                                                                
#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