From 20aaf8f6650644d147c60cb1f9a710a20138e826 Mon Sep 17 00:00:00 2001 From: Misha <106913236+MishaProductions@users.noreply.github.com> Date: Wed, 20 Mar 2024 10:50:26 -0400 Subject: [PATCH] Implement a few registrationbook methods --- .../lego/legoomni/include/registrationbook.h | 27 ++-- .../legoomni/src/worlds/registrationbook.cpp | 134 ++++++++++++++++-- 2 files changed, 135 insertions(+), 26 deletions(-) diff --git a/LEGO1/lego/legoomni/include/registrationbook.h b/LEGO1/lego/legoomni/include/registrationbook.h index 41fadc0f..ef2f5c99 100644 --- a/LEGO1/lego/legoomni/include/registrationbook.h +++ b/LEGO1/lego/legoomni/include/registrationbook.h @@ -45,24 +45,24 @@ class RegistrationBook : public LegoWorld { // RegistrationBook::`scalar deleting destructor' private: - undefined4 m_unk0xf8; // 0xf8 + MxS32 m_registerDialogueTimer; // 0xf8 undefined m_unk0xfc; // 0xfc undefined m_unk0xfd[3]; // 0xfd MxStillPresenter* m_alphabet[26]; // 0x100 MxStillPresenter* m_name[10][7]; // 0x168 struct { - MxS16 m_letters[7]; // 0x00 - undefined2 m_unk0x0e; // 0x0e - } m_unk0x280; // 0x280 - MxControlPresenter* m_checkmark[10]; // 0x290 - undefined2 m_unk0x2b8; // 0x2b8 - InfocenterState* m_infocenterState; // 0x2bc - undefined m_unk0x2c0; // 0x2c0 - undefined m_unk0x2c1; // 0x2c1 - undefined m_unk0x2c2[0x02]; // 0x2c2 - undefined4 m_unk0x2c4; // 0x2c4 - undefined4 m_unk0x2c8; // 0x2c8 - LPDIRECTDRAWSURFACE m_unk0x2cc; // 0x2cc + MxS16 m_letters[7]; // 0x00 + undefined2 m_unk0x0e; // 0x0e + } m_unk0x280; // 0x280 + MxControlPresenter* m_checkmark[10]; // 0x290 + undefined2 m_unk0x2b8; // 0x2b8 + InfocenterState* m_infocenterState; // 0x2bc + undefined m_unk0x2c0; // 0x2c0 + undefined m_unk0x2c1; // 0x2c1 + undefined m_unk0x2c2[0x02]; // 0x2c2 + LPDIRECTDRAWSURFACE m_checkboxHilite; // 0x2c4 + LPDIRECTDRAWSURFACE m_checkboxSurface; // 0x2c8 + LPDIRECTDRAWSURFACE m_checkboxNormal; // 0x2cc MxLong HandleEndAction(MxEndActionNotificationParam& p_param); MxLong HandleKeyPress(MxS8 p_key); @@ -71,6 +71,7 @@ class RegistrationBook : public LegoWorld { void FUN_100775c0(MxS16 p_playerIndex); void WriteInfocenterLetters(MxS16); void FUN_100778c0(); + MxBool CreateSurface(); }; #endif // REGISTRATIONBOOK_H diff --git a/LEGO1/lego/legoomni/src/worlds/registrationbook.cpp b/LEGO1/lego/legoomni/src/worlds/registrationbook.cpp index 3f0a6108..c5a3b30a 100644 --- a/LEGO1/lego/legoomni/src/worlds/registrationbook.cpp +++ b/LEGO1/lego/legoomni/src/worlds/registrationbook.cpp @@ -9,6 +9,7 @@ #include "misc.h" #include "mxactionnotificationparam.h" #include "mxbackgroundaudiomanager.h" +#include "mxdisplaysurface.h" #include "mxmisc.h" #include "mxnotificationmanager.h" #include "mxtimer.h" @@ -20,8 +21,14 @@ DECOMP_SIZE_ASSERT(RegistrationBook, 0x2d0) // GLOBAL: LEGO1 0x100d9924 const char* g_infoman = "infoman"; +// GLOBAL: LEGO1 0x100f7964 +MxLong g_checkboxBlinkTimer = 0; + +// GLOBAL: LEGO1 0x100f7968 +MxBool g_nextCheckbox = 0; + // FUNCTION: LEGO1 0x10076d20 -RegistrationBook::RegistrationBook() : m_unk0xf8(0x80000000), m_unk0xfc(1) +RegistrationBook::RegistrationBook() : m_registerDialogueTimer(0x80000000), m_unk0xfc(1) { memset(m_alphabet, 0, sizeof(m_alphabet)); memset(m_name, 0, sizeof(m_name)); @@ -36,9 +43,9 @@ RegistrationBook::RegistrationBook() : m_unk0xf8(0x80000000), m_unk0xfc(1) NotificationManager()->Register(this); m_unk0x2c1 = 0; - m_unk0x2c4 = 0; - m_unk0x2c8 = 0; - m_unk0x2cc = 0; + m_checkboxHilite = 0; + m_checkboxSurface = NULL; + m_checkboxNormal = 0; } // FUNCTION: LEGO1 0x10076f50 @@ -62,8 +69,8 @@ RegistrationBook::~RegistrationBook() ControlManager()->Unregister(this); NotificationManager()->Unregister(this); - if (m_unk0x2cc) { - m_unk0x2cc->Release(); + if (m_checkboxNormal) { + m_checkboxNormal->Release(); } } @@ -99,11 +106,11 @@ MxLong RegistrationBook::Notify(MxParam& p_param) result = HandleEndAction((MxEndActionNotificationParam&) p_param); break; case c_notificationKeyPress: - m_unk0xf8 = Timer()->GetTime(); + m_registerDialogueTimer = Timer()->GetTime(); result = HandleKeyPress(((LegoEventNotificationParam&) p_param).GetKey()); break; case c_notificationButtonDown: - m_unk0xf8 = Timer()->GetTime(); + m_registerDialogueTimer = Timer()->GetTime(); break; case c_notificationClick: result = HandleClick((LegoControlManagerEvent&) p_param); @@ -139,17 +146,71 @@ MxLong RegistrationBook::HandleEndAction(MxEndActionNotificationParam& p_param) case RegbookScript::c_iic007in_PlayWav: case RegbookScript::c_iic008in_PlayWav: BackgroundAudioManager()->RaiseVolume(); - m_unk0xf8 = Timer()->GetTime(); + m_registerDialogueTimer = Timer()->GetTime(); break; } return 1; } -// STUB: LEGO1 0x100772d0 +// FUNCTION: LEGO1 0x100772d0 MxLong RegistrationBook::HandleKeyPress(MxS8 p_key) { - return 0; + MxS8 key; + if (p_key < 'a' || 'z' < p_key) { + key = p_key; + } + else { + key = p_key - ' '; + } + + switch (key) { + case ' ': + if (key < 'A' || key > 'Z') { + DeleteObjects(&m_atom, RegbookScript::c_iic006in_RunAnim, RegbookScript::c_iic008in_PlayWav); + BackgroundAudioManager()->RaiseVolume(); + return 1; + } + case 8: + if (0 < m_unk0x280.m_unk0x0e) { + m_unk0x280.m_unk0x0e--; + + m_name[0][m_unk0x280.m_unk0x0e]->Enable(FALSE); + + delete m_name[0][m_unk0x280.m_unk0x0e]; + m_name[0][m_unk0x280.m_unk0x0e] = NULL; + + if (m_unk0x280.m_unk0x0e == 0) { + m_checkmark[0]->Enable(FALSE); + } + + m_unk0x280.m_letters[m_unk0x280.m_unk0x0e] = -1; + } + break; + default: + if (m_unk0x280.m_unk0x0e < 7) { + MxStillPresenter* presenter = m_alphabet[key - 65]; + m_name[0][m_unk0x280.m_unk0x0e] = presenter->Clone(); + + if (m_name[0][m_unk0x280.m_unk0x0e] == NULL) { + return 1; + } + + presenter->GetAction()->SetUnknown24(presenter->GetAction()->GetUnknown24() + 1); + m_name[0][m_unk0x280.m_unk0x0e]->Enable(TRUE); + m_name[0][m_unk0x280.m_unk0x0e]->SetTickleState(MxPresenter::e_repeating); + m_name[0][m_unk0x280.m_unk0x0e]->SetPosition(m_unk0x280.m_unk0x0e * 23 + 343, 121); + + if (m_unk0x280.m_unk0x0e == 0) { + m_checkmark[0]->Enable(TRUE); + } + + m_unk0x280.m_letters[m_unk0x280.m_unk0x0e] = key - 'A'; + m_unk0x280.m_unk0x0e++; + } + break; + } + return 1; } // FUNCTION: LEGO1 0x100774a0 @@ -342,14 +403,38 @@ inline void RegistrationBook::PlayAction(MxU32 p_objectId) Start(&action); } -// STUB: LEGO1 0x10077fd0 +// FUNCTION: LEGO1 0x10077fd0 MxResult RegistrationBook::Tickle() { if (!m_worldStarted) { LegoWorld::Tickle(); } else { - // TODO + MxLong time = Timer()->GetTime(); + if (m_registerDialogueTimer != 0x80000000 && m_registerDialogueTimer + 30000 <= time) { + m_registerDialogueTimer = 0x80000000; + PlayAction(RegbookScript::c_iic007in_PlayWav); + } + + if (g_checkboxBlinkTimer + 500 <= time) { + g_checkboxBlinkTimer = time; + + if (m_checkboxHilite) { + DDBLTFX op; + op.dwSize = sizeof(op); + op.dwROP = 0xcc0020; + if (g_nextCheckbox) { + m_checkboxSurface->Blt(NULL, m_checkboxHilite, NULL, DDBLT_ROP, &op); + } + else { + m_checkboxSurface->Blt(NULL, m_checkboxNormal, NULL, DDBLT_ROP, &op); + } + } + else { + CreateSurface(); + } + g_nextCheckbox = !g_nextCheckbox; + } } return SUCCESS; @@ -377,6 +462,29 @@ MxLong RegistrationBook::HandleNotification19(MxParam& p_param) return 0; } +// FUNCTION: LEGO1 0x10078350 +MxBool RegistrationBook::CreateSurface() +{ + if (m_checkmark[0]) { + MxStillPresenter* back = (MxStillPresenter*) m_checkmark[0]->GetList().front(); + if (back) { + m_checkboxSurface = back->VTable0x78(); + } + + MxStillPresenter* checkHilite = (MxStillPresenter*) Find("MxStillPresenter", "CheckHiLite_Bitmap"); + if (checkHilite) { + m_checkboxHilite = checkHilite->VTable0x78(); + } + + if (m_checkboxSurface && m_checkboxHilite) { + m_checkboxNormal = MxDisplaySurface::CopySurface(m_checkboxSurface); + return TRUE; + } + } + + return FALSE; +} + // FUNCTION: LEGO1 0x100783e0 MxBool RegistrationBook::VTable0x64() {