From 03b19f301bf385e57464229c579352ea2dd5a854 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Fri, 26 Apr 2024 10:16:14 -0400 Subject: [PATCH] Improve Paint match --- .../lego/legoomni/include/pizzamissionstate.h | 10 +-- LEGO1/lego/legoomni/include/racestate.h | 2 +- LEGO1/lego/legoomni/include/score.h | 21 +++--- .../legoomni/include/towtrackmissionstate.h | 11 ++- LEGO1/lego/legoomni/src/race/racestate.cpp | 1 + .../src/towtrack/towtrackmissionstate.cpp | 10 +-- LEGO1/lego/legoomni/src/worlds/score.cpp | 73 +++++++++---------- LEGO1/lego/sources/misc/legocontainer.h | 3 +- 8 files changed, 63 insertions(+), 68 deletions(-) diff --git a/LEGO1/lego/legoomni/include/pizzamissionstate.h b/LEGO1/lego/legoomni/include/pizzamissionstate.h index ddbfa30c..e421b9fe 100644 --- a/LEGO1/lego/legoomni/include/pizzamissionstate.h +++ b/LEGO1/lego/legoomni/include/pizzamissionstate.h @@ -6,11 +6,11 @@ // SIZE 0x20 struct PizzaMissionStateEntry { public: - undefined2 m_unk0x00; - MxU8 m_id; - undefined m_unk0x03[0x15]; - MxU16 m_color; - undefined m_unk0x18[6]; + undefined2 m_unk0x00; // 0x00 + MxU8 m_id; // 0x02 + undefined m_unk0x03[0x15]; // 0x03 + MxU16 m_color; // 0x18 + undefined m_unk0x18[6]; // 0x1a }; // VTABLE: LEGO1 0x100d7408 diff --git a/LEGO1/lego/legoomni/include/racestate.h b/LEGO1/lego/legoomni/include/racestate.h index 4d980b58..e86cb3f1 100644 --- a/LEGO1/lego/legoomni/include/racestate.h +++ b/LEGO1/lego/legoomni/include/racestate.h @@ -7,6 +7,7 @@ struct RaceStateEntry { public: inline MxS16 GetUnknown0x02() { return m_unk0x02; } + inline MxU16 GetColor() { return m_color; } // TODO: Possibly private MxU8 m_id; // 0x00 @@ -37,7 +38,6 @@ class RaceState : public LegoState { RaceStateEntry* GetState(MxU8 p_id); - inline MxU16 GetColor(MxU8 p_id) { return GetState(p_id)->m_color; } inline undefined4 GetUnknown0x28() { return m_unk0x28; } // SYNTHETIC: LEGO1 0x1000f6f0 diff --git a/LEGO1/lego/legoomni/include/score.h b/LEGO1/lego/legoomni/include/score.h index 2244523c..67a2a30b 100644 --- a/LEGO1/lego/legoomni/include/score.h +++ b/LEGO1/lego/legoomni/include/score.h @@ -13,7 +13,7 @@ class Score : public LegoWorld { public: Score(); - ~Score() override; // vtable+0x00 + ~Score() override; MxLong Notify(MxParam& p_param) override; // vtable+0x04 // FUNCTION: LEGO1 0x100010c0 @@ -32,11 +32,11 @@ class Score : public LegoWorld { // SYNTHETIC: LEGO1 0x100011e0 // Score::`scalar deleting destructor' - MxResult Create(MxDSAction& p_dsAction) override; // vtable+18 - void ReadyWorld() override; // vtable+50 - MxBool VTable0x5c() override; // vtable+5c - MxBool VTable0x64() override; // vtable+64 - void Enable(MxBool p_enable) override; // vtable+68 + MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + void ReadyWorld() override; // vtable+0x50 + MxBool VTable0x5c() override; // vtable+0x5c + MxBool VTable0x64() override; // vtable+0x64 + void Enable(MxBool p_enable) override; // vtable+0x68 void Paint(); MxLong FUN_10001510(MxEndActionNotificationParam& p_param); @@ -44,12 +44,11 @@ class Score : public LegoWorld { void FillArea(MxU32 p_x, MxU32 p_y, MxS16 p_color); protected: - LegoGameState::Area m_destLocation; - ScoreState* m_state; - MxU8* m_surface; - -private: void DeleteScript(); + + LegoGameState::Area m_destLocation; // 0xf8 + ScoreState* m_state; // 0xfc + MxU8* m_surface; // 0x100 }; #endif // SCORE_H diff --git a/LEGO1/lego/legoomni/include/towtrackmissionstate.h b/LEGO1/lego/legoomni/include/towtrackmissionstate.h index 9a58ea58..053be7d8 100644 --- a/LEGO1/lego/legoomni/include/towtrackmissionstate.h +++ b/LEGO1/lego/legoomni/include/towtrackmissionstate.h @@ -54,12 +54,11 @@ class TowTrackMissionState : public LegoState { MxU16 m_unk0x16; // 0x16 MxU16 m_unk0x18; // 0x18 MxU16 m_unk0x1a; // 0x1a - MxU16 m_unk0x1c; // 0x1c - MxU16 m_color1; // 0x1e - MxU16 m_color2; // 0x20 - MxU16 m_color3; // 0x22 - MxU16 m_color4; // 0x24 - MxU16 m_color5; // 0x26 + MxU16 m_color1; // 0x1c + MxU16 m_color2; // 0x1e + MxU16 m_color3; // 0x20 + MxU16 m_color4; // 0x22 + MxU16 m_color5; // 0x24 }; #endif // TOWTRACKMISSIONSTATE_H diff --git a/LEGO1/lego/legoomni/src/race/racestate.cpp b/LEGO1/lego/legoomni/src/race/racestate.cpp index db4776e8..897190f7 100644 --- a/LEGO1/lego/legoomni/src/race/racestate.cpp +++ b/LEGO1/lego/legoomni/src/race/racestate.cpp @@ -25,6 +25,7 @@ RaceStateEntry* RaceState::GetState(MxU8 p_id) if (i >= 5) { return NULL; } + if (m_state[i].m_id == p_id) { return m_state + i; } diff --git a/LEGO1/lego/legoomni/src/towtrack/towtrackmissionstate.cpp b/LEGO1/lego/legoomni/src/towtrack/towtrackmissionstate.cpp index 83c32b36..327286a6 100644 --- a/LEGO1/lego/legoomni/src/towtrack/towtrackmissionstate.cpp +++ b/LEGO1/lego/legoomni/src/towtrack/towtrackmissionstate.cpp @@ -13,11 +13,11 @@ TowTrackMissionState::TowTrackMissionState() m_unk0x0c = 0; m_unk0x1a = 0; m_unk0x10 = 0; - m_unk0x1c = 0; m_color1 = 0; m_color2 = 0; m_color3 = 0; m_color4 = 0; + m_color5 = 0; } // FUNCTION: LEGO1 0x1004dde0 @@ -31,11 +31,11 @@ MxResult TowTrackMissionState::Serialize(LegoFile* p_legoFile) p_legoFile->Read(&m_unk0x16, sizeof(m_unk0x16)); p_legoFile->Read(&m_unk0x18, sizeof(m_unk0x18)); p_legoFile->Read(&m_unk0x1a, sizeof(m_unk0x1a)); - p_legoFile->Read(&m_unk0x1c, sizeof(m_unk0x1c)); p_legoFile->Read(&m_color1, sizeof(m_color1)); p_legoFile->Read(&m_color2, sizeof(m_color2)); p_legoFile->Read(&m_color3, sizeof(m_color3)); p_legoFile->Read(&m_color4, sizeof(m_color4)); + p_legoFile->Read(&m_color5, sizeof(m_color5)); } else if (p_legoFile->IsWriteMode()) { MxU16 write = m_unk0x12; @@ -53,9 +53,6 @@ MxResult TowTrackMissionState::Serialize(LegoFile* p_legoFile) write = m_unk0x1a; p_legoFile->Write(&write, sizeof(m_unk0x12)); - write = m_unk0x1c; - p_legoFile->Write(&write, sizeof(m_unk0x12)); - write = m_color1; p_legoFile->Write(&write, sizeof(m_unk0x12)); @@ -67,6 +64,9 @@ MxResult TowTrackMissionState::Serialize(LegoFile* p_legoFile) write = m_color4; p_legoFile->Write(&write, sizeof(m_unk0x12)); + + write = m_color5; + p_legoFile->Write(&write, sizeof(m_unk0x12)); } return SUCCESS; diff --git a/LEGO1/lego/legoomni/src/worlds/score.cpp b/LEGO1/lego/legoomni/src/worlds/score.cpp index 8241bef4..31537d06 100644 --- a/LEGO1/lego/legoomni/src/worlds/score.cpp +++ b/LEGO1/lego/legoomni/src/worlds/score.cpp @@ -1,7 +1,9 @@ #include "score.h" #include "ambulancemissionstate.h" +#include "carracestate.h" #include "infoscor_actions.h" +#include "jetskiracestate.h" #include "jukebox.h" #include "jukebox_actions.h" #include "legocontrolmanager.h" @@ -234,58 +236,53 @@ void Score::Enable(MxBool p_enable) } // FUNCTION: LEGO1 0x100019d0 +// FUNCTION: BETA10 0x100f47d8 void Score::Paint() { - LegoTextureInfo* gd = TextureContainer()->Get("bigcube.gif"); + LegoTextureInfo* cube = TextureContainer()->Get("bigcube.gif"); - if (gd) { - RaceState* l78 = (RaceState*) GameState()->GetState("JetskiRaceState"); - RaceState* l70 = (RaceState*) GameState()->GetState("CarRaceState"); - TowTrackMissionState* lesi = (TowTrackMissionState*) GameState()->GetState("TowTrackMissionState"); - PizzaMissionState* l74 = (PizzaMissionState*) GameState()->GetState("PizzaMissionState"); - AmbulanceMissionState* lebp = (AmbulanceMissionState*) GameState()->GetState("AmbulanceMissionState"); + if (cube != NULL) { + JetskiRaceState* jetskiRaceState = (JetskiRaceState*) GameState()->GetState("JetskiRaceState"); + CarRaceState* carRaceState = (CarRaceState*) GameState()->GetState("CarRaceState"); + TowTrackMissionState* towTrackMissionState = + (TowTrackMissionState*) GameState()->GetState("TowTrackMissionState"); + PizzaMissionState* pizzaMissionState = (PizzaMissionState*) GameState()->GetState("PizzaMissionState"); + AmbulanceMissionState* ambulanceMissionState = + (AmbulanceMissionState*) GameState()->GetState("AmbulanceMissionState"); DDSURFACEDESC desc; memset(&desc, 0, sizeof(desc)); desc.dwSize = sizeof(desc); - if (gd->m_surface->Lock(NULL, &desc, 0, NULL) == DD_OK) { + + if (cube->m_surface->Lock(NULL, &desc, 0, NULL) == DD_OK) { if (desc.lPitch != desc.dwWidth) { - gd->m_surface->Unlock(desc.lpSurface); + cube->m_surface->Unlock(desc.lpSurface); return; } + m_surface = (MxU8*) desc.lpSurface; + for (MxU8 id = 1; id <= 5; id++) { - m_surface = (MxU8*) desc.lpSurface; - MxU16 color = 0; - if (l70) { - color = l70->GetColor(id); - } - MxU32 row = id - 1; - FillArea(0, row, color); - color = 0; - if (l78) { - color = l78->GetColor(id); - } - FillArea(1, row, color); - color = 0; - if (l74) { - color = l74->GetColor(id); - } - FillArea(2, row, color); - color = 0; - if (lesi) { - color = lesi->GetColor(id); - } - FillArea(3, row, color); - color = 0; - if (lebp) { - color = lebp->GetColor(id); - } - FillArea(4, row, color); + MxU16 color; + + color = carRaceState ? carRaceState->GetState(id)->GetColor() : 0; + FillArea(0, id - 1, color); + + color = jetskiRaceState ? jetskiRaceState->GetState(id)->GetColor() : 0; + FillArea(1, id - 1, color); + + color = pizzaMissionState ? pizzaMissionState->GetColor(id) : 0; + FillArea(2, id - 1, color); + + color = towTrackMissionState ? towTrackMissionState->GetColor(id) : 0; + FillArea(3, id - 1, color); + + color = ambulanceMissionState ? ambulanceMissionState->GetColor(id) : 0; + FillArea(4, id - 1, color); } - gd->m_surface->Unlock(desc.lpSurface); - gd->m_texture->Changed(TRUE, FALSE); + cube->m_surface->Unlock(desc.lpSurface); + cube->m_texture->Changed(TRUE, FALSE); m_surface = NULL; } } diff --git a/LEGO1/lego/sources/misc/legocontainer.h b/LEGO1/lego/sources/misc/legocontainer.h index 05732367..2b5fc0e1 100644 --- a/LEGO1/lego/sources/misc/legocontainer.h +++ b/LEGO1/lego/sources/misc/legocontainer.h @@ -45,10 +45,9 @@ class LegoContainer { } } + // FUNCTION: BETA10 0x1007bc00 inline T* Get(const char* p_name) { - // TODO: Score::Paint matches better with no `value` on the stack, - // while LegoModelPresenter::CreateROI only matches with `value` T* value = NULL; #ifdef COMPAT_MODE