MxPresenter::ParseExtra and surrounding functions

This commit is contained in:
disinvite 2023-09-12 16:47:46 -04:00
parent 3e7cb6a7a8
commit 766d6001ff
7 changed files with 155 additions and 4 deletions

View File

@ -43,6 +43,42 @@ void MakeSourceName(char *, const char *)
// TODO // TODO
} }
// OFFSET: LEGO1 0x100b7050
MxBool KeyValueStringParse(char *p_outputValue, char *p_key, char *p_source)
{
MxBool didMatch = FALSE;
MxS16 len = strlen(p_source);
char *temp = new char[len + 1];
strcpy(temp, p_source);
char *token = strtok(temp, ", \t\r\n:");
while (token) {
len -= (strlen(token) + 1);
if (strcmpi(token, p_key) == 0) {
if (p_outputValue && len > 0) {
char *cur = &token[strlen(p_key)];
cur++;
while (*cur != ',') {
if (*cur == ' ' || *cur == '\0' || *cur == '\t' || *cur == '\n' || *cur == '\r')
break;
*p_outputValue++ = *cur++;
}
*p_outputValue = '\0';
}
didMatch = TRUE;
break;
}
token = strtok(NULL, ", \t\r\n:");
}
delete[] temp;
return didMatch;
}
// OFFSET: LEGO1 0x100b7210 // OFFSET: LEGO1 0x100b7210
void SetOmniUserMessage(void (*p_userMsg)(const char *,int)) void SetOmniUserMessage(void (*p_userMsg)(const char *,int))
{ {

View File

@ -113,5 +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 *);
#endif // LEGOOMNI_H #endif // LEGOOMNI_H

View File

@ -49,6 +49,9 @@ class MxDSAction : public MxDSObject
inline MxU32 GetFlags() { return this->m_flags; } inline MxU32 GetFlags() { return this->m_flags; }
inline void SetFlags(MxU32 m_flags) { this->m_flags = m_flags; } inline void SetFlags(MxU32 m_flags) { this->m_flags = m_flags; }
inline char *GetUnkData() { return m_unkData; }
inline MxU16 GetUnkLength() const { return m_unkLength; }
inline void SetOmni(MxOmni *p_omni) { m_omni = p_omni; }
private: private:
MxU32 m_sizeOnDisk; MxU32 m_sizeOnDisk;

View File

@ -42,6 +42,55 @@ void MxOmni::Init()
m_unk64 = NULL; m_unk64 = NULL;
} }
// OFFSET: LEGO1 0x100b0090 STUB
void MxOmni::vtable0x20()
{
// TODO
}
// OFFSET: LEGO1 0x100b00c0 STUB
void MxOmni::DeleteObject()
{
// TODO
}
// OFFSET: LEGO1 0x100b09a0 STUB
void MxOmni::DoesEntityExist()
{
// TODO
}
// OFFSET: LEGO1 0x100b00e0 STUB
void MxOmni::vtable0x2c()
{
// TODO
}
// OFFSET: LEGO1 0x100aefb0 STUB
int MxOmni::vtable0x30(char*, int, MxCore*)
{
// TODO
return 0;
}
// OFFSET: LEGO1 0x100aefc0 STUB
void MxOmni::NotifyCurrentEntity()
{
// TODO
}
// OFFSET: LEGO1 0x100b09d0 STUB
void MxOmni::StartTimer()
{
// TODO
}
// OFFSET: LEGO1 0x100b0a00 STUB
void MxOmni::vtable0x3c()
{
// TODO
}
// OFFSET: LEGO1 0x100b0690 // OFFSET: LEGO1 0x100b0690
void MxOmni::DestroyInstance() void MxOmni::DestroyInstance()
{ {

View File

@ -37,6 +37,14 @@ class MxOmni : public MxCore
virtual void Init(); // vtable+14 virtual void Init(); // vtable+14
virtual MxResult Create(MxOmniCreateParam &p); // vtable+18 virtual MxResult Create(MxOmniCreateParam &p); // vtable+18
virtual void Destroy(); // vtable+1c virtual void Destroy(); // vtable+1c
virtual void vtable0x20(); // vtable+20
virtual void DeleteObject(); // vtable+24
virtual void DoesEntityExist(); // vtable+28
virtual void vtable0x2c(); // vtable+2c
virtual int vtable0x30(char*, int, MxCore*); // vtable+30
virtual void NotifyCurrentEntity(); // vtable+34
virtual void StartTimer(); // vtable+38
virtual void vtable0x3c(); // vtable+3c
static void SetInstance(MxOmni* instance); static void SetInstance(MxOmni* instance);
HWND GetWindowHandle() const { return this->m_windowHandle; } HWND GetWindowHandle() const { return this->m_windowHandle; }
MxObjectFactory* GetObjectFactory() const { return this->m_objectFactory; } MxObjectFactory* GetObjectFactory() const { return this->m_objectFactory; }

View File

@ -1,26 +1,78 @@
#include "mxpresenter.h" #include "mxpresenter.h"
#include "mxautolocker.h" #include "mxautolocker.h"
#include "mxparam.h"
#include "legoomni.h"
#include <string.h>
#include "decomp.h" #include "decomp.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()
{ {
m_currentTickleState = TickleState_Idle; m_currentTickleState = TickleState_Idle;
m_action = NULL; m_action = NULL;
m_unk0x18 = 0; m_unk0x18 = 0;
m_unk0x3c = 0; m_unkPresenter = NULL;
m_previousTickleStates = 0; m_previousTickleStates = 0;
m_unk0x10 = 0; m_unk0x10 = 0;
m_unk0x14 = 0; m_unk0x14 = 0;
} }
// OFFSET: LEGO1 0x100b4fc0 STUB // OFFSET: LEGO1 0x100b4fc0
void MxPresenter::ParseExtra() void MxPresenter::ParseExtra()
{ {
// TODO
MxAutoLocker lock(&m_criticalSection);
MxU32 len = m_action->GetUnkLength();
char *unk_data = m_action->GetUnkData();
if (len) {
len &= MAXWORD;
char t_actionData[512];
memcpy(t_actionData, unk_data, len);
t_actionData[len] = '\0';
char t_worldValue[512];
if (KeyValueStringParse(t_worldValue, g_strWORLD, t_actionData)) {
char *token = strtok(t_worldValue, g_parseExtraTokens);
char t_token[256];
strcpy(t_token, token);
token = strtok(NULL, g_parseExtraTokens);
int val = token ? atoi(token) : 0;
int result = MxOmni::GetInstance()->vtable0x30(t_token, val, this);
// TODO: magic number for flag
m_action->SetFlags(m_action->GetFlags() | 128);
if (result)
SendTo_unkPresenter(MxOmni::GetInstance());
}
}
}
// OFFSET: LEGO1 0x100b5120
void MxPresenter::SendTo_unkPresenter(MxOmni *p_omni)
{
if (m_unkPresenter) {
MxAutoLocker lock(&m_criticalSection);
// TOOD: magic number used for notification type. replace with enum
NotificationManager()->Send(m_unkPresenter, &MxParam(5, this));
m_action->SetOmni(p_omni ? p_omni : MxOmni::GetInstance());
m_unkPresenter = NULL;
}
} }
// OFFSET: LEGO1 0x1000bf00 // OFFSET: LEGO1 0x1000bf00

View File

@ -4,6 +4,7 @@
#include "mxcore.h" #include "mxcore.h"
#include "mxdsaction.h" #include "mxdsaction.h"
#include "mxcriticalsection.h" #include "mxcriticalsection.h"
#include "mxomni.h"
#include "decomp.h" #include "decomp.h"
@ -68,6 +69,7 @@ class MxPresenter : public MxCore
protected: protected:
__declspec(dllexport) void Init(); __declspec(dllexport) void Init();
void SendTo_unkPresenter(MxOmni *);
private: private:
MxS32 m_currentTickleState; // 0x8 MxS32 m_currentTickleState; // 0x8
@ -77,7 +79,7 @@ class MxPresenter : public MxCore
undefined4 m_unk0x18; undefined4 m_unk0x18;
MxDSAction* m_action; // 0 MxDSAction* m_action; // 0
MxCriticalSection m_criticalSection; MxCriticalSection m_criticalSection;
undefined4 m_unk0x3c; MxPresenter *m_unkPresenter; // 0x3c
}; };
#endif // MXPRESENTER_H #endif // MXPRESENTER_H