Implement/match LegoPlantManager::FUN_10026c50 (#1043)

* Minor fixes

* Implement/match LegoPlantManager::FUN_10026c50
This commit is contained in:
Christian Semmler 2024-06-25 08:28:10 -07:00 committed by GitHub
parent c9c130eb87
commit 62307e1819
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 65 additions and 13 deletions

View file

@ -66,7 +66,7 @@ class LegoBuildingManager : public MxCore {
static void SetCustomizeAnimFile(const char* p_value); static void SetCustomizeAnimFile(const char* p_value);
void Init(); void Init();
void FUN_1002fa00(); void LoadWorldInfo();
void CreateBuilding(MxS32 p_index, LegoWorld* p_world); void CreateBuilding(MxS32 p_index, LegoWorld* p_world);
void Reset(); void Reset();
MxResult Write(LegoStorage* p_storage); MxResult Write(LegoStorage* p_storage);
@ -77,7 +77,7 @@ class LegoBuildingManager : public MxCore {
MxBool SwitchMove(LegoEntity* p_entity); MxBool SwitchMove(LegoEntity* p_entity);
MxBool SwitchMood(LegoEntity* p_entity); MxBool SwitchMood(LegoEntity* p_entity);
MxU32 GetAnimationId(LegoEntity* p_entity); MxU32 GetAnimationId(LegoEntity* p_entity);
MxU32 GetSoundId(LegoEntity* p_entity, MxBool); MxU32 GetSoundId(LegoEntity* p_entity, MxBool p_state);
MxBool FUN_10030000(LegoEntity* p_entity); MxBool FUN_10030000(LegoEntity* p_entity);
MxBool FUN_10030030(MxS32 p_index); MxBool FUN_10030030(MxS32 p_index);
MxBool FUN_10030110(LegoBuildingInfo* p_data); MxBool FUN_10030110(LegoBuildingInfo* p_data);

View file

@ -39,7 +39,7 @@ class LegoPlantManager : public MxCore {
MxBool SwitchMood(LegoEntity* p_entity); MxBool SwitchMood(LegoEntity* p_entity);
MxU32 GetAnimationId(LegoEntity* p_entity); MxU32 GetAnimationId(LegoEntity* p_entity);
MxU32 GetSoundId(LegoEntity* p_entity, MxBool p_state); MxU32 GetSoundId(LegoEntity* p_entity, MxBool p_state);
void FUN_10026c50(LegoEntity* p_entity); MxBool FUN_10026c50(LegoEntity* p_entity);
void FUN_10027120(); void FUN_10027120();
static void SetCustomizeAnimFile(const char* p_value); static void SetCustomizeAnimFile(const char* p_value);
@ -53,6 +53,7 @@ class LegoPlantManager : public MxCore {
void RemovePlant(MxS32 p_index, MxS32 p_worldId); void RemovePlant(MxS32 p_index, MxS32 p_worldId);
void FUN_10026860(MxS32 p_index); void FUN_10026860(MxS32 p_index);
LegoPlantInfo* GetInfo(LegoEntity* p_entity); LegoPlantInfo* GetInfo(LegoEntity* p_entity);
MxBool FUN_10026c80(MxS32 p_index);
static char* g_customizeAnimFile; static char* g_customizeAnimFile;
static MxS32 g_maxMove[4]; static MxS32 g_maxMove[4];

View file

@ -10,7 +10,7 @@ class LegoPathBoundary;
// SIZE 0x54 // SIZE 0x54
struct LegoPlantInfo { struct LegoPlantInfo {
// See LegoOmni::RegisterWorlds for IDs // See LegoOmni::RegisterWorlds for IDs
enum Worlds { enum World {
c_act1 = 1 << 0, c_act1 = 1 << 0,
c_imain = 1 << 1, c_imain = 1 << 1,
c_ielev = 1 << 4, c_ielev = 1 << 4,

View file

@ -257,7 +257,7 @@ void LegoBuildingManager::Init()
// FUNCTION: LEGO1 0x1002fa00 // FUNCTION: LEGO1 0x1002fa00
// FUNCTION: BETA10 0x10063ad1 // FUNCTION: BETA10 0x10063ad1
void LegoBuildingManager::FUN_1002fa00() void LegoBuildingManager::LoadWorldInfo()
{ {
MxS32 i; MxS32 i;
LegoWorld* world = CurrentWorld(); LegoWorld* world = CurrentWorld();

View file

@ -424,6 +424,7 @@ MxU32 LegoPlantManager::GetSoundId(LegoEntity* p_entity, MxBool p_state)
} }
// FUNCTION: LEGO1 0x10026be0 // FUNCTION: LEGO1 0x10026be0
// FUNCTION: BETA10 0x100c62bc
void LegoPlantManager::SetCustomizeAnimFile(const char* p_value) void LegoPlantManager::SetCustomizeAnimFile(const char* p_value)
{ {
if (g_customizeAnimFile != NULL) { if (g_customizeAnimFile != NULL) {
@ -442,10 +443,60 @@ void LegoPlantManager::SetCustomizeAnimFile(const char* p_value)
} }
} }
// STUB: LEGO1 0x10026c50 // FUNCTION: LEGO1 0x10026c50
void LegoPlantManager::FUN_10026c50(LegoEntity* p_entity) // FUNCTION: BETA10 0x100c6349
MxBool LegoPlantManager::FUN_10026c50(LegoEntity* p_entity)
{ {
// TODO LegoPlantInfo* info = GetInfo(p_entity);
if (info == NULL) {
return FALSE;
}
return FUN_10026c80(info - g_plantInfo);
}
// FUNCTION: LEGO1 0x10026c80
// FUNCTION: BETA10 0x100c63eb
MxBool LegoPlantManager::FUN_10026c80(MxS32 p_index)
{
if (p_index >= sizeOfArray(g_plantInfo)) {
return FALSE;
}
LegoPlantInfo* info = &g_plantInfo[p_index];
if (info == NULL) {
return FALSE;
}
MxBool result = TRUE;
if (info->m_unk0x16 < 0) {
info->m_unk0x16 = g_unk0x100f16c0[info->m_variant];
}
if (info->m_unk0x16 > 0) {
LegoROI* roi = info->m_entity->GetROI();
info->m_unk0x16--;
if (info->m_unk0x16 == 1) {
info->m_unk0x16 = 0;
}
if (info->m_unk0x16 == 0) {
roi->SetVisibility(FALSE);
}
else {
FUN_10026860(info - g_plantInfo);
info->m_entity->SetLocation(info->m_position, info->m_direction, info->m_up, FALSE);
}
}
else {
result = FALSE;
}
return result;
} }
// STUB: LEGO1 0x10026e00 // STUB: LEGO1 0x10026e00

View file

@ -694,7 +694,7 @@ void LegoWorld::Enable(MxBool p_enable)
if (m_worldId != -1) { if (m_worldId != -1) {
PlantManager()->LoadWorldInfo(m_worldId); PlantManager()->LoadWorldInfo(m_worldId);
AnimationManager()->LoadWorldInfo(m_worldId); AnimationManager()->LoadWorldInfo(m_worldId);
BuildingManager()->FUN_1002fa00(); BuildingManager()->LoadWorldInfo();
AnimationManager()->Resume(); AnimationManager()->Resume();
} }

View file

@ -57,7 +57,7 @@ LegoWorldPresenter::~LegoWorldPresenter()
MxS32 worldId = ((LegoWorld*) m_entity)->GetWorldId(); MxS32 worldId = ((LegoWorld*) m_entity)->GetWorldId();
PlantManager()->LoadWorldInfo(worldId); PlantManager()->LoadWorldInfo(worldId);
AnimationManager()->LoadWorldInfo(worldId); AnimationManager()->LoadWorldInfo(worldId);
BuildingManager()->FUN_1002fa00(); BuildingManager()->LoadWorldInfo();
result = ((LegoWorld*) m_entity)->VTable0x5c(); result = ((LegoWorld*) m_entity)->VTable0x5c();
} }

View file

@ -135,7 +135,7 @@ void ElevatorBottom::Enable(MxBool p_enable)
// FUNCTION: LEGO1 0x10018310 // FUNCTION: LEGO1 0x10018310
MxBool ElevatorBottom::Escape() MxBool ElevatorBottom::Escape()
{ {
DeleteObjects(&m_atom, 500, 999); DeleteObjects(&m_atom, ElevbottScript::c_iica31in_PlayWav, 999);
m_destLocation = LegoGameState::e_infomain; m_destLocation = LegoGameState::e_infomain;
return TRUE; return TRUE;
} }

View file

@ -95,7 +95,7 @@ MxLong InfocenterDoor::HandleControl(LegoControlManagerNotificationParam& p_para
MxLong result = 0; MxLong result = 0;
if (p_param.GetUnknown0x28() == 1) { if (p_param.GetUnknown0x28() == 1) {
DeleteObjects(&m_atom, 500, 510); DeleteObjects(&m_atom, InfodoorScript::c_iic037in_PlayWav, 510);
switch (p_param.GetClickedObjectId()) { switch (p_param.GetClickedObjectId()) {
case InfodoorScript::c_LeftArrow_Ctl: case InfodoorScript::c_LeftArrow_Ctl:
@ -167,7 +167,7 @@ void InfocenterDoor::Enable(MxBool p_enable)
// FUNCTION: LEGO1 0x10037cd0 // FUNCTION: LEGO1 0x10037cd0
MxBool InfocenterDoor::Escape() MxBool InfocenterDoor::Escape()
{ {
DeleteObjects(&m_atom, 500, 510); DeleteObjects(&m_atom, InfodoorScript::c_iic037in_PlayWav, 510);
m_destLocation = LegoGameState::e_infomain; m_destLocation = LegoGameState::e_infomain;
return TRUE; return TRUE;
} }