mirror of
https://github.com/isledecomp/isle-portable.git
synced 2025-02-16 19:50:52 -05:00
Implement remaining MxDSSelectAction functions (#183)
* Implement remaining MxDSSelectAction functions * Fix match
This commit is contained in:
parent
23b9d47e8a
commit
93ce1ccfe8
3 changed files with 83 additions and 6 deletions
|
@ -37,10 +37,8 @@ public:
|
|||
virtual MxBool HasId(MxU32 p_objectId) override; // vtable+34;
|
||||
virtual void SetSomeTimingField(MxLong p_someTimingField) override; // vtable+38;
|
||||
|
||||
private:
|
||||
MxU32 m_sizeOnDisk;
|
||||
|
||||
protected:
|
||||
MxU32 m_sizeOnDisk;
|
||||
MxDSActionList *m_actions;
|
||||
};
|
||||
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
#include "mxdsselectaction.h"
|
||||
#include "mxvariabletable.h"
|
||||
#include "mxtimer.h"
|
||||
#include "mxomni.h"
|
||||
|
||||
DECOMP_SIZE_ASSERT(MxDSSelectAction, 0xb0)
|
||||
|
||||
|
@ -48,4 +51,81 @@ MxDSAction *MxDSSelectAction::Clone()
|
|||
*clone = *this;
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
// OFFSET: LEGO1 0x100cbe10
|
||||
MxU32 MxDSSelectAction::GetSizeOnDisk()
|
||||
{
|
||||
MxU32 totalSizeOnDisk = MxDSParallelAction::GetSizeOnDisk();
|
||||
|
||||
totalSizeOnDisk += strlen(this->m_unk0x9c.GetData()) + 1;
|
||||
|
||||
MxStringListCursor cursor(this->m_unk0xac);
|
||||
MxString string;
|
||||
while (cursor.Next(string))
|
||||
totalSizeOnDisk += strlen(string.GetData()) + 1;
|
||||
|
||||
// Note: unlike the other classes, MxDSSelectAction does not have its own
|
||||
// sizeOnDisk member. Instead, it overrides the one from MxDSMultiAction.
|
||||
this->m_sizeOnDisk = totalSizeOnDisk;
|
||||
|
||||
return totalSizeOnDisk;
|
||||
}
|
||||
|
||||
// OFFSET: LEGO1 0x100cbf60
|
||||
void MxDSSelectAction::Deserialize(char **p_source, MxS16 p_unk24)
|
||||
{
|
||||
MxString string;
|
||||
MxDSAction::Deserialize(p_source, p_unk24);
|
||||
|
||||
MxU32 extraFlag = *(MxU32*)(*p_source + 4) & 1;
|
||||
*p_source += 12;
|
||||
|
||||
this->m_unk0x9c = *p_source;
|
||||
|
||||
if (!strnicmp(this->m_unk0x9c.GetData(), "RANDOM_", strlen("RANDOM_"))) {
|
||||
char buffer[10];
|
||||
MxS16 value = atoi(&this->m_unk0x9c.GetData()[strlen("RANDOM_")]);
|
||||
|
||||
srand(Timer()->GetTime());
|
||||
MxS32 random = rand() % value;
|
||||
string = itoa((MxS16) random, buffer, 10);
|
||||
}
|
||||
else
|
||||
string = VariableTable()->GetVariable(*p_source);
|
||||
|
||||
*p_source += strlen(*p_source) + 1;
|
||||
|
||||
MxU32 count = *(MxU32*) *p_source;
|
||||
*p_source += sizeof(MxU32);
|
||||
|
||||
if (count) {
|
||||
MxS32 index = -1;
|
||||
this->m_unk0xac->DeleteAll();
|
||||
|
||||
MxU32 i;
|
||||
for (i = 0; i < count; i++) {
|
||||
if (!strcmp(string.GetData(), *p_source))
|
||||
index = i;
|
||||
|
||||
this->m_unk0xac->OtherAppend(*p_source);
|
||||
*p_source += strlen(*p_source) + 1;
|
||||
}
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
MxU32 extraFlag = *(MxU32*)(*p_source + 4) & 1;
|
||||
*p_source += 8;
|
||||
|
||||
MxDSAction *action = (MxDSAction*) DeserializeDSObjectDispatch(p_source, p_unk24);
|
||||
|
||||
if (index == i)
|
||||
this->m_actions->Append(action);
|
||||
else
|
||||
delete action;
|
||||
|
||||
*p_source += extraFlag;
|
||||
}
|
||||
}
|
||||
|
||||
*p_source += extraFlag;
|
||||
}
|
|
@ -29,9 +29,8 @@ public:
|
|||
return !strcmp(name, MxDSSelectAction::ClassName()) || MxDSParallelAction::IsA(name);
|
||||
}
|
||||
|
||||
//virtual MxU32 GetSizeOnDisk() override; // vtable+18;
|
||||
//virtual void Deserialize(char **p_source, MxS16 p_unk24) override; // vtable+1c;
|
||||
//virtual MxLong GetDuration() override; // vtable+24;
|
||||
virtual MxU32 GetSizeOnDisk() override; // vtable+18;
|
||||
virtual void Deserialize(char **p_source, MxS16 p_unk24) override; // vtable+1c;
|
||||
virtual MxDSAction *Clone() override; // vtable+2c;
|
||||
|
||||
private:
|
||||
|
|
Loading…
Reference in a new issue