mirror of
https://github.com/isledecomp/isle.git
synced 2024-11-25 17:18:16 -05:00
Implement/match more LegoPlantManager functions (#1040)
This commit is contained in:
parent
e507f42717
commit
656e7fc674
5 changed files with 132 additions and 21 deletions
|
@ -68,7 +68,7 @@ class LegoBuildingManager : public MxCore {
|
||||||
void Init();
|
void Init();
|
||||||
void FUN_1002fa00();
|
void FUN_1002fa00();
|
||||||
void CreateBuilding(MxS32 p_index, LegoWorld* p_world);
|
void CreateBuilding(MxS32 p_index, LegoWorld* p_world);
|
||||||
void FUN_1002fb30();
|
void Reset();
|
||||||
MxResult Write(LegoStorage* p_storage);
|
MxResult Write(LegoStorage* p_storage);
|
||||||
MxResult Read(LegoStorage* p_storage);
|
MxResult Read(LegoStorage* p_storage);
|
||||||
LegoBuildingInfo* GetInfo(LegoEntity* p_entity);
|
LegoBuildingInfo* GetInfo(LegoEntity* p_entity);
|
||||||
|
|
|
@ -28,7 +28,7 @@ class LegoPlantManager : public MxCore {
|
||||||
|
|
||||||
void Init();
|
void Init();
|
||||||
void LoadWorldInfo(MxS32 p_worldId);
|
void LoadWorldInfo(MxS32 p_worldId);
|
||||||
void FUN_100263a0(undefined4 p_und);
|
void Reset(MxS32 p_worldId);
|
||||||
MxResult Write(LegoStorage* p_storage);
|
MxResult Write(LegoStorage* p_storage);
|
||||||
MxResult Read(LegoStorage* p_storage);
|
MxResult Read(LegoStorage* p_storage);
|
||||||
MxBool SwitchColor(LegoEntity* p_entity);
|
MxBool SwitchColor(LegoEntity* p_entity);
|
||||||
|
@ -49,13 +49,15 @@ class LegoPlantManager : public MxCore {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
LegoEntity* CreatePlant(MxS32 p_index, LegoWorld* p_world, MxS32 p_worldId);
|
LegoEntity* CreatePlant(MxS32 p_index, LegoWorld* p_world, MxS32 p_worldId);
|
||||||
|
void RemovePlant(MxS32 p_index, MxS32 p_worldId);
|
||||||
|
void FUN_10026860(MxS32 p_index);
|
||||||
|
|
||||||
static char* g_customizeAnimFile;
|
static char* g_customizeAnimFile;
|
||||||
|
|
||||||
MxS32 m_worldId; // 0x08
|
MxS32 m_worldId; // 0x08
|
||||||
undefined m_unk0x0c; // 0x0c
|
undefined m_unk0x0c; // 0x0c
|
||||||
undefined m_unk0x10[0x17]; // 0x10
|
undefined* m_unk0x10[5]; // 0x10
|
||||||
undefined m_unk0x24; // 0x24
|
MxS8 m_unk0x24; // 0x24
|
||||||
undefined4 m_unk0x28; // 0x28
|
undefined4 m_unk0x28; // 0x28
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -304,7 +304,7 @@ void LegoBuildingManager::CreateBuilding(MxS32 p_index, LegoWorld* p_world)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x1002fb30
|
// FUNCTION: LEGO1 0x1002fb30
|
||||||
void LegoBuildingManager::FUN_1002fb30()
|
void LegoBuildingManager::Reset()
|
||||||
{
|
{
|
||||||
MxU32 i;
|
MxU32 i;
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,9 @@
|
||||||
#include "legoplants.h"
|
#include "legoplants.h"
|
||||||
#include "legoworld.h"
|
#include "legoworld.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
|
#include "misc/legostorage.h"
|
||||||
|
#include "scripts.h"
|
||||||
|
#include "sndanim_actions.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
@ -18,6 +21,12 @@ const char* g_plantLodNames[4][5] = {
|
||||||
{"palmwht", "palmblk", "palmyel", "palmred", "palm"}
|
{"palmwht", "palmblk", "palmyel", "palmred", "palm"}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// GLOBAL: LEGO1 0x100f16b0
|
||||||
|
float g_unk0x100f16b0[] = {0.1f, 0.7f, 0.5f, 0.9f};
|
||||||
|
|
||||||
|
// GLOBAL: LEGO1 0x100f16c0
|
||||||
|
MxU8 g_unk0x100f16c0[] = {1, 2, 2, 3};
|
||||||
|
|
||||||
// GLOBAL: LEGO1 0x100f3188
|
// GLOBAL: LEGO1 0x100f3188
|
||||||
char* LegoPlantManager::g_customizeAnimFile = NULL;
|
char* LegoPlantManager::g_customizeAnimFile = NULL;
|
||||||
|
|
||||||
|
@ -63,10 +72,24 @@ void LegoPlantManager::LoadWorldInfo(MxS32 p_worldId)
|
||||||
m_unk0x0c = 0;
|
m_unk0x0c = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// STUB: LEGO1 0x100263a0
|
// FUNCTION: LEGO1 0x100263a0
|
||||||
void LegoPlantManager::FUN_100263a0(undefined4 p_und)
|
void LegoPlantManager::Reset(MxS32 p_worldId)
|
||||||
{
|
{
|
||||||
// TODO
|
MxU32 i;
|
||||||
|
DeleteObjects(g_sndAnimScript, SndanimScript::c_AnimC1, SndanimScript::c_AnimBld18);
|
||||||
|
|
||||||
|
for (i = 0; i < m_unk0x24; i++) {
|
||||||
|
delete m_unk0x10[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
m_unk0x24 = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < sizeOfArray(g_plantInfo); i++) {
|
||||||
|
RemovePlant(i, p_worldId);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_worldId = -1;
|
||||||
|
m_unk0x0c = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x10026590
|
// FUNCTION: LEGO1 0x10026590
|
||||||
|
@ -108,20 +131,106 @@ LegoEntity* LegoPlantManager::CreatePlant(MxS32 p_index, LegoWorld* p_world, MxS
|
||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
// STUB: LEGO1 0x10026720
|
// FUNCTION: LEGO1 0x100266c0
|
||||||
|
// FUNCTION: BETA10 0x100c5859
|
||||||
|
void LegoPlantManager::RemovePlant(MxS32 p_index, MxS32 p_worldId)
|
||||||
|
{
|
||||||
|
if (p_index < sizeOfArray(g_plantInfo)) {
|
||||||
|
MxU32 world = 1 << (MxU8) p_worldId;
|
||||||
|
|
||||||
|
if (g_plantInfo[p_index].m_worlds & world && g_plantInfo[p_index].m_entity != NULL) {
|
||||||
|
CharacterManager()->ReleaseAutoROI(g_plantInfo[p_index].m_entity->GetROI());
|
||||||
|
g_plantInfo[p_index].m_entity = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FUNCTION: LEGO1 0x10026720
|
||||||
// FUNCTION: BETA10 0x100c5918
|
// FUNCTION: BETA10 0x100c5918
|
||||||
MxResult LegoPlantManager::Write(LegoStorage* p_storage)
|
MxResult LegoPlantManager::Write(LegoStorage* p_storage)
|
||||||
{
|
{
|
||||||
// TODO
|
MxResult result = FAILURE;
|
||||||
return SUCCESS;
|
|
||||||
|
for (MxS32 i = 0; i < sizeOfArray(g_plantInfo); i++) {
|
||||||
|
LegoPlantInfo* info = &g_plantInfo[i];
|
||||||
|
|
||||||
|
if (p_storage->Write(&info->m_variant, sizeof(info->m_variant)) != SUCCESS) {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
if (p_storage->Write(&info->m_sound, sizeof(info->m_sound)) != SUCCESS) {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
if (p_storage->Write(&info->m_move, sizeof(info->m_move)) != SUCCESS) {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
if (p_storage->Write(&info->m_mood, sizeof(info->m_mood)) != SUCCESS) {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
if (p_storage->Write(&info->m_color, sizeof(info->m_color)) != SUCCESS) {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
if (p_storage->Write(&info->m_initialUnk0x16, sizeof(info->m_initialUnk0x16)) != SUCCESS) {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// STUB: LEGO1 0x100267b0
|
result = SUCCESS;
|
||||||
|
|
||||||
|
done:
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// FUNCTION: LEGO1 0x100267b0
|
||||||
// FUNCTION: BETA10 0x100c5a76
|
// FUNCTION: BETA10 0x100c5a76
|
||||||
MxResult LegoPlantManager::Read(LegoStorage* p_storage)
|
MxResult LegoPlantManager::Read(LegoStorage* p_storage)
|
||||||
{
|
{
|
||||||
// TODO
|
MxResult result = FAILURE;
|
||||||
return SUCCESS;
|
|
||||||
|
for (MxS32 i = 0; i < sizeOfArray(g_plantInfo); i++) {
|
||||||
|
LegoPlantInfo* info = &g_plantInfo[i];
|
||||||
|
|
||||||
|
if (p_storage->Read(&info->m_variant, sizeof(info->m_variant)) != SUCCESS) {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
if (p_storage->Read(&info->m_sound, sizeof(info->m_sound)) != SUCCESS) {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
if (p_storage->Read(&info->m_move, sizeof(info->m_move)) != SUCCESS) {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
if (p_storage->Read(&info->m_mood, sizeof(info->m_mood)) != SUCCESS) {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
if (p_storage->Read(&info->m_color, sizeof(info->m_color)) != SUCCESS) {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
if (p_storage->Read(&info->m_unk0x16, sizeof(info->m_unk0x16)) != SUCCESS) {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
info->m_initialUnk0x16 = info->m_unk0x16;
|
||||||
|
FUN_10026860(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
result = SUCCESS;
|
||||||
|
|
||||||
|
done:
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// FUNCTION: LEGO1 0x10026860
|
||||||
|
// FUNCTION: BETA10 0x100c5be0
|
||||||
|
void LegoPlantManager::FUN_10026860(MxS32 p_index)
|
||||||
|
{
|
||||||
|
MxU8 variant = g_plantInfo[p_index].m_variant;
|
||||||
|
|
||||||
|
if (g_plantInfo[p_index].m_unk0x16 >= 0) {
|
||||||
|
float value = g_unk0x100f16c0[variant] - g_plantInfo[p_index].m_unk0x16;
|
||||||
|
g_plantInfo[p_index].m_position[1] = g_plantInfoInit[p_index].m_position[1] - value * g_unk0x100f16b0[variant];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
g_plantInfo[p_index].m_position[1] = g_plantInfoInit[p_index].m_position[1];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// STUB: LEGO1 0x10026920
|
// STUB: LEGO1 0x10026920
|
||||||
|
|
|
@ -178,8 +178,8 @@ void LegoWorld::Destroy(MxBool p_fromDestructor)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_worldId != -1 && m_set0xd0.empty()) {
|
if (m_worldId != -1 && m_set0xd0.empty()) {
|
||||||
PlantManager()->FUN_100263a0(m_worldId);
|
PlantManager()->Reset(m_worldId);
|
||||||
BuildingManager()->FUN_1002fb30();
|
BuildingManager()->Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_entityList) {
|
if (m_entityList) {
|
||||||
|
@ -715,8 +715,8 @@ void LegoWorld::Enable(MxBool p_enable)
|
||||||
m_set0xd0.insert(this);
|
m_set0xd0.insert(this);
|
||||||
|
|
||||||
if (m_worldId != -1) {
|
if (m_worldId != -1) {
|
||||||
PlantManager()->FUN_100263a0(m_worldId);
|
PlantManager()->Reset(m_worldId);
|
||||||
BuildingManager()->FUN_1002fb30();
|
BuildingManager()->Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
MxPresenterListCursor controlPresenterCursor(&m_controlPresenters);
|
MxPresenterListCursor controlPresenterCursor(&m_controlPresenters);
|
||||||
|
|
Loading…
Reference in a new issue