diff --git a/CMakeLists.txt b/CMakeLists.txt index d62c2b2b..6c408d65 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,6 +21,7 @@ add_library(lego1 SHARED LEGO1/buildingentity.cpp LEGO1/bumpbouy.cpp LEGO1/carrace.cpp + LEGO1/define.cpp LEGO1/dllmain.cpp LEGO1/dunebuggy.cpp LEGO1/elevatorbottom.cpp diff --git a/LEGO1/define.cpp b/LEGO1/define.cpp new file mode 100644 index 00000000..84073b9d --- /dev/null +++ b/LEGO1/define.cpp @@ -0,0 +1,10 @@ +#include "define.h" + +// 0x10101eac +const char *g_parseExtraTokens = ":;"; + +// 0x10101edc +const char *g_strWORLD = "WORLD"; + +// 0x10102040 +const char *g_strACTION = "ACTION"; diff --git a/LEGO1/define.h b/LEGO1/define.h new file mode 100644 index 00000000..ec41943e --- /dev/null +++ b/LEGO1/define.h @@ -0,0 +1,8 @@ +#ifndef DEFINE_H +#define DEFINE_H + +extern const char *g_parseExtraTokens; +extern const char *g_strWORLD; +extern const char *g_strACTION; + +#endif // DEFINE_H \ No newline at end of file diff --git a/LEGO1/extra.h b/LEGO1/extra.h new file mode 100644 index 00000000..05ed5f07 --- /dev/null +++ b/LEGO1/extra.h @@ -0,0 +1,21 @@ +#ifndef EXTRA_H +#define EXTRA_H + +// Items related to the Extra string of key-value pairs found in MxOb + +enum ExtraActionType +{ + ExtraActionType_opendisk = 1, + ExtraActionType_openram = 2, + ExtraActionType_close = 3, + ExtraActionType_start = 4, + ExtraActionType_stop = 5, + ExtraActionType_run = 6, + ExtraActionType_exit = 7, + ExtraActionType_enable = 8, + ExtraActionType_disable = 9, + ExtraActionType_notify = 10, + ExtraActionType_unknown = 11, +}; + +#endif // EXTRA_H diff --git a/LEGO1/legoentity.cpp b/LEGO1/legoentity.cpp index b8ed69f9..d2062946 100644 --- a/LEGO1/legoentity.cpp +++ b/LEGO1/legoentity.cpp @@ -1,5 +1,9 @@ #include "legoentity.h" +#include "legoomni.h" +#include "legoutil.h" +#include "define.h" + DECOMP_SIZE_ASSERT(LegoEntity, 0x68) // OFFSET: LEGO1 0x1000c290 @@ -16,8 +20,37 @@ MxLong LegoEntity::Notify(MxParam &p) return 0; } +// OFFSET: LEGO1 0x100107e0 STUB +void LegoEntity::vtable18() +{ + +} + // OFFSET: LEGO1 0x10010810 STUB void LegoEntity::Destroy() { // TODO } + +// OFFSET: LEGO1 0x10010e10 +void LegoEntity::ParseAction(char *p_extra) +{ + char copy[1024]; + char actionValue[1024]; + strcpy(copy, p_extra); + + if (KeyValueStringParse(actionValue, g_strACTION, copy)) { + m_actionType = MatchActionString(strtok(actionValue, g_parseExtraTokens)); + + if (m_actionType != ExtraActionType_exit) { + char *token = strtok(NULL, g_parseExtraTokens); + + m_actionArgString = new char[strlen(token) + 1]; + strcpy(m_actionArgString, token); + + if (m_actionType != ExtraActionType_run) { + m_actionArgNumber = atoi(strtok(NULL, g_parseExtraTokens)); + } + } + } +} diff --git a/LEGO1/legoentity.h b/LEGO1/legoentity.h index fdfe997f..9fbbb5bb 100644 --- a/LEGO1/legoentity.h +++ b/LEGO1/legoentity.h @@ -2,6 +2,7 @@ #define LEGOENTITY_H #include "mxentity.h" +#include "extra.h" // VTABLE 0x100d4858 // SIZE 0x68 (probably) @@ -31,7 +32,16 @@ class LegoEntity : public MxEntity return !strcmp(name, LegoEntity::ClassName()) || MxEntity::IsA(name); } - virtual void Destroy() override; // vtable+0x1c + virtual void vtable18(); // vtable+0x18 + virtual void Destroy(); // vtable+0x1c + virtual void ParseAction(char *); // vtable+0x20 + +protected: + // For tokens from the extra string that look like this: + // "Action:openram;\lego\scripts\Race\CarRaceR;0" + ExtraActionType m_actionType; // 0x5c + char *m_actionArgString; // 0x60 + MxS32 m_actionArgNumber; // 0x64 }; diff --git a/LEGO1/legoomni.cpp b/LEGO1/legoomni.cpp index 0c84395e..bbc8258b 100644 --- a/LEGO1/legoomni.cpp +++ b/LEGO1/legoomni.cpp @@ -58,7 +58,7 @@ void MakeSourceName(char *p_output, const char *p_input) } // OFFSET: LEGO1 0x100b7050 -MxBool KeyValueStringParse(char *p_outputValue, char *p_key, char *p_source) +MxBool KeyValueStringParse(char *p_outputValue, const char *p_key, const char *p_source) { MxBool didMatch = FALSE; diff --git a/LEGO1/legoomni.h b/LEGO1/legoomni.h index be289769..a9cce9cf 100644 --- a/LEGO1/legoomni.h +++ b/LEGO1/legoomni.h @@ -113,6 +113,6 @@ __declspec(dllexport) MxLong Start(MxDSAction *a); LegoBuildingManager* BuildingManager(); Isle* GetIsle(); LegoPlantManager* PlantManager(); -MxBool KeyValueStringParse(char *, char *, char *); +MxBool KeyValueStringParse(char *, const char *, const char *); #endif // LEGOOMNI_H diff --git a/LEGO1/legoutil.cpp b/LEGO1/legoutil.cpp index bac8f284..9827b376 100644 --- a/LEGO1/legoutil.cpp +++ b/LEGO1/legoutil.cpp @@ -2,6 +2,36 @@ #include "mxtypes.h" +#include + +// OFFSET: LEGO1 0x1003e300 +ExtraActionType MatchActionString(const char *p_str) { + ExtraActionType result = ExtraActionType_unknown; + + if (!strcmpi("openram", p_str)) + result = ExtraActionType_openram; + else if (!strcmpi("opendisk", p_str)) + result = ExtraActionType_opendisk; + else if (!strcmpi("close", p_str)) + result = ExtraActionType_close; + else if (!strcmpi("start", p_str)) + result = ExtraActionType_start; + else if (!strcmpi("stop", p_str)) + result = ExtraActionType_stop; + else if (!strcmpi("run", p_str)) + result = ExtraActionType_run; + else if (!strcmpi("exit", p_str)) + result = ExtraActionType_exit; + else if (!strcmpi("enable", p_str)) + result = ExtraActionType_enable; + else if (!strcmpi("disable", p_str)) + result = ExtraActionType_disable; + else if (!strcmpi("notify", p_str)) + result = ExtraActionType_notify; + + return result; +} + // OFFSET: LEGO1 0x1003eae0 void ConvertHSVToRGB(float h, float s, float v, float *r_out, float *b_out, float *g_out) { diff --git a/LEGO1/legoutil.h b/LEGO1/legoutil.h index 6a0113e8..b736cd29 100644 --- a/LEGO1/legoutil.h +++ b/LEGO1/legoutil.h @@ -1,6 +1,8 @@ #ifndef LEGOUTIL_H #define LEGOUTIL_H +#include "extra.h" + template inline T Abs(T p_t) { @@ -19,6 +21,7 @@ inline T Max(T p_t1, T p_t2) return p_t1 > p_t2 ? p_t1 : p_t2; } +ExtraActionType MatchActionString(const char *); void ConvertHSVToRGB(float r, float g, float b, float* out_r, float* out_g, float* out_b); #endif // LEGOUTIL_H diff --git a/LEGO1/mxentity.cpp b/LEGO1/mxentity.cpp index 65adad67..54e854ab 100644 --- a/LEGO1/mxentity.cpp +++ b/LEGO1/mxentity.cpp @@ -1,6 +1,8 @@ #include "mxentity.h" -DECOMP_SIZE_ASSERT(MxEntity, 0x68) +// Size subject to change. It's not clear yet which members belong to +// MxEntity and which belong only the subclasses. +DECOMP_SIZE_ASSERT(MxEntity, 0x5c) // OFFSET: LEGO1 0x1001d190 MxEntity::MxEntity() diff --git a/LEGO1/mxentity.h b/LEGO1/mxentity.h index 25e74d1b..3d73292e 100644 --- a/LEGO1/mxentity.h +++ b/LEGO1/mxentity.h @@ -31,7 +31,7 @@ class MxEntity : public MxCore private: MxS32 m_mxEntityId; // 0x8 MxAtomId m_atom; // 0xc - undefined m_unk10[0x58]; + undefined m_unk10[76]; }; #endif // MXENTITY_H diff --git a/LEGO1/mxpresenter.cpp b/LEGO1/mxpresenter.cpp index 940248a0..b57af821 100644 --- a/LEGO1/mxpresenter.cpp +++ b/LEGO1/mxpresenter.cpp @@ -7,15 +7,10 @@ #include #include "decomp.h" +#include "define.h" DECOMP_SIZE_ASSERT(MxPresenter, 0x40); -// 0x10101eac -char *g_parseExtraTokens = ":;"; - -// 0x10101edc -char *g_strWORLD = "WORLD"; - // OFFSET: LEGO1 0x100b4d50 void MxPresenter::Init() {