LegoEntity parsing extra Action strings (#141)

* LegoEntity parse action string

* Reduced size assert for MxEntity

* remove override keyword for LegoEntity function

* Move global strings to new define.cpp file
This commit is contained in:
MS 2023-09-27 15:16:46 -04:00 committed by GitHub
parent e341afd411
commit 749c553325
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 124 additions and 11 deletions

View file

@ -21,6 +21,7 @@ add_library(lego1 SHARED
LEGO1/buildingentity.cpp LEGO1/buildingentity.cpp
LEGO1/bumpbouy.cpp LEGO1/bumpbouy.cpp
LEGO1/carrace.cpp LEGO1/carrace.cpp
LEGO1/define.cpp
LEGO1/dllmain.cpp LEGO1/dllmain.cpp
LEGO1/dunebuggy.cpp LEGO1/dunebuggy.cpp
LEGO1/elevatorbottom.cpp LEGO1/elevatorbottom.cpp

10
LEGO1/define.cpp Normal file
View file

@ -0,0 +1,10 @@
#include "define.h"
// 0x10101eac
const char *g_parseExtraTokens = ":;";
// 0x10101edc
const char *g_strWORLD = "WORLD";
// 0x10102040
const char *g_strACTION = "ACTION";

8
LEGO1/define.h Normal file
View file

@ -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

21
LEGO1/extra.h Normal file
View file

@ -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

View file

@ -1,5 +1,9 @@
#include "legoentity.h" #include "legoentity.h"
#include "legoomni.h"
#include "legoutil.h"
#include "define.h"
DECOMP_SIZE_ASSERT(LegoEntity, 0x68) DECOMP_SIZE_ASSERT(LegoEntity, 0x68)
// OFFSET: LEGO1 0x1000c290 // OFFSET: LEGO1 0x1000c290
@ -16,8 +20,37 @@ MxLong LegoEntity::Notify(MxParam &p)
return 0; return 0;
} }
// OFFSET: LEGO1 0x100107e0 STUB
void LegoEntity::vtable18()
{
}
// OFFSET: LEGO1 0x10010810 STUB // OFFSET: LEGO1 0x10010810 STUB
void LegoEntity::Destroy() void LegoEntity::Destroy()
{ {
// TODO // 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));
}
}
}
}

View file

@ -2,6 +2,7 @@
#define LEGOENTITY_H #define LEGOENTITY_H
#include "mxentity.h" #include "mxentity.h"
#include "extra.h"
// VTABLE 0x100d4858 // VTABLE 0x100d4858
// SIZE 0x68 (probably) // SIZE 0x68 (probably)
@ -31,7 +32,16 @@ class LegoEntity : public MxEntity
return !strcmp(name, LegoEntity::ClassName()) || MxEntity::IsA(name); 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
}; };

View file

@ -58,7 +58,7 @@ void MakeSourceName(char *p_output, const char *p_input)
} }
// OFFSET: LEGO1 0x100b7050 // 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; MxBool didMatch = FALSE;

View file

@ -113,6 +113,6 @@ __declspec(dllexport) MxLong Start(MxDSAction *a);
LegoBuildingManager* BuildingManager(); LegoBuildingManager* BuildingManager();
Isle* GetIsle(); Isle* GetIsle();
LegoPlantManager* PlantManager(); LegoPlantManager* PlantManager();
MxBool KeyValueStringParse(char *, char *, char *); MxBool KeyValueStringParse(char *, const char *, const char *);
#endif // LEGOOMNI_H #endif // LEGOOMNI_H

View file

@ -2,6 +2,36 @@
#include "mxtypes.h" #include "mxtypes.h"
#include <string.h>
// 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 // OFFSET: LEGO1 0x1003eae0
void ConvertHSVToRGB(float h, float s, float v, float *r_out, float *b_out, float *g_out) void ConvertHSVToRGB(float h, float s, float v, float *r_out, float *b_out, float *g_out)
{ {

View file

@ -1,6 +1,8 @@
#ifndef LEGOUTIL_H #ifndef LEGOUTIL_H
#define LEGOUTIL_H #define LEGOUTIL_H
#include "extra.h"
template <class T> template <class T>
inline T Abs(T p_t) 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; 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); void ConvertHSVToRGB(float r, float g, float b, float* out_r, float* out_g, float* out_b);
#endif // LEGOUTIL_H #endif // LEGOUTIL_H

View file

@ -1,6 +1,8 @@
#include "mxentity.h" #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 // OFFSET: LEGO1 0x1001d190
MxEntity::MxEntity() MxEntity::MxEntity()

View file

@ -31,7 +31,7 @@ class MxEntity : public MxCore
private: private:
MxS32 m_mxEntityId; // 0x8 MxS32 m_mxEntityId; // 0x8
MxAtomId m_atom; // 0xc MxAtomId m_atom; // 0xc
undefined m_unk10[0x58]; undefined m_unk10[76];
}; };
#endif // MXENTITY_H #endif // MXENTITY_H

View file

@ -7,15 +7,10 @@
#include <string.h> #include <string.h>
#include "decomp.h" #include "decomp.h"
#include "define.h"
DECOMP_SIZE_ASSERT(MxPresenter, 0x40); DECOMP_SIZE_ASSERT(MxPresenter, 0x40);
// 0x10101eac
char *g_parseExtraTokens = ":;";
// 0x10101edc
char *g_strWORLD = "WORLD";
// OFFSET: LEGO1 0x100b4d50 // OFFSET: LEGO1 0x100b4d50
void MxPresenter::Init() void MxPresenter::Init()
{ {