Isle
Loading...
Searching...
No Matches
mxdsmultiaction.cpp
Go to the documentation of this file.
1#include "mxdsmultiaction.h"
2
3#include <assert.h>
4
8
9// FUNCTION: LEGO1 0x100c9b90
10// FUNCTION: BETA10 0x10159410
12{
13 m_type = e_multiAction;
14 m_actionList = new MxDSActionList;
15 assert(m_actionList);
16 m_actionList->SetDestroy(MxDSActionList::Destroy);
17}
18
19// FUNCTION: LEGO1 0x100ca060
20// FUNCTION: BETA10 0x10159518
22{
23 delete m_actionList;
24}
25
26// FUNCTION: LEGO1 0x100ca0d0
27// FUNCTION: BETA10 0x101595ad
29{
31
32 MxDSActionListCursor cursor(p_dsMultiAction.m_actionList);
33 MxDSAction* action;
34 while (cursor.Next(action)) {
35 m_actionList->Append(action->Clone());
36 }
37}
38
39// FUNCTION: BETA10 0x10159660
41{
42 CopyFrom(p_dsMultiAction);
43}
44
45// FUNCTION: LEGO1 0x100ca260
46// FUNCTION: BETA10 0x101596e1
48{
49 if (this == &p_dsMultiAction) {
50 return *this;
51 }
52
53 MxDSAction::operator=(p_dsMultiAction);
54 CopyFrom(p_dsMultiAction);
55 return *this;
56}
57
58// FUNCTION: LEGO1 0x100ca290
59// FUNCTION: BETA10 0x10159728
61{
62 m_unk0x90 = p_unk0x90;
63
65 MxDSAction* action;
66 while (cursor.Next(action)) {
67 action->SetUnknown90(p_unk0x90);
68 }
69}
70
71// FUNCTION: LEGO1 0x100ca370
72// FUNCTION: BETA10 0x101597ce
74{
75 MxDSAction::MergeFrom(p_dsMultiAction);
76
78 MxDSAction* action;
79 while (cursor.Next(action)) {
80 action->MergeFrom(p_dsMultiAction);
81 }
82}
83
84// FUNCTION: LEGO1 0x100ca450
85// FUNCTION: BETA10 0x10159874
87{
88 if (GetObjectId() == p_objectId) {
89 return TRUE;
90 }
91
93 MxDSAction* action;
94 while (cursor.Next(action)) {
95 if (action->HasId(p_objectId)) {
96 return TRUE;
97 }
98 }
99
100 return FALSE;
101}
102
103// FUNCTION: LEGO1 0x100ca550
104// FUNCTION: BETA10 0x10159959
106{
107 MxDSMultiAction* clone = new MxDSMultiAction();
108
109 if (clone) {
110 *clone = *this;
111 }
112
113 return clone;
114}
115
116// FUNCTION: LEGO1 0x100ca5e0
117// FUNCTION: BETA10 0x10159a03
119{
121
123 MxDSAction* action;
124 while (cursor.Next(action)) {
125 result += action->VTable0x14();
126 }
127
128 return result;
129}
130
131// FUNCTION: LEGO1 0x100ca6c0
132// FUNCTION: BETA10 0x10159aaf
134{
135 MxU32 totalSizeOnDisk = MxDSAction::GetSizeOnDisk();
136 totalSizeOnDisk += 12;
137 totalSizeOnDisk += 4;
138
140 MxDSAction* action;
141 while (cursor.Next(action)) {
142 totalSizeOnDisk += action->GetSizeOnDisk();
143 }
144
145 m_sizeOnDisk = totalSizeOnDisk - MxDSAction::GetSizeOnDisk();
146
147 return totalSizeOnDisk;
148}
149
150// FUNCTION: LEGO1 0x100ca7b0
151// FUNCTION: BETA10 0x10159b79
152void MxDSMultiAction::Deserialize(MxU8*& p_source, MxS16 p_flags)
153{
154 MxDSAction::Deserialize(p_source, p_flags);
155
156 MxU32 extraFlag = *(MxU32*) (p_source + 4) & 1;
157 p_source += 12;
158
159 MxU32 count = *(MxU32*) p_source;
160 p_source += sizeof(count);
161
162 if (count) {
163 while (count--) {
164 MxU32 extraFlag = *(MxU32*) (p_source + 4) & 1;
165 p_source += 8;
166
167 MxDSAction* action = (MxDSAction*) DeserializeDSObjectDispatch(p_source, p_flags);
168 p_source += extraFlag;
169
170 m_actionList->Append(action);
171 }
172 }
173
174 p_source += extraFlag;
175}
176
177// FUNCTION: LEGO1 0x100ca8c0
178// FUNCTION: BETA10 0x10159c37
180{
181 MxDSAction::SetAtomId(p_atomId);
182
184 MxDSAction* action;
185 while (cursor.Next(action)) {
186 action->SetAtomId(p_atomId);
187 }
188}
[AI] Atomized (unique) string identifier, managed by reference counting.
Definition: mxatom.h:124
[AI] Convenience cursor class for iterating over an MxDSActionList.
[AI] A list (collection) of pointers to MxDSAction objects, supporting comparison,...
static void Destroy(MxDSAction *p_action)
[AI] Destroys/deletes a given MxDSAction pointer.
[AI] Represents an action deserialized from SI chunks, holding key animation or script parameters suc...
Definition: mxdsaction.h:17
undefined4 VTable0x14() override
[AI] Unknown virtual placeholder, possibly for additional interfaces.
Definition: mxdsaction.cpp:106
MxU32 GetSizeOnDisk() override
[AI] Serializes the size on disk of this action (all fields + extra data length)
Definition: mxdsaction.cpp:113
MxDSAction & operator=(MxDSAction &p_dsAction)
[AI] Assignment operator: deep-copy from a different MxDSAction, including base class data and extra ...
Definition: mxdsaction.cpp:133
virtual MxBool HasId(MxU32 p_objectId)
[AI] Checks if this action contains/was created for a specific SI object id.
Definition: mxdsaction.cpp:53
void Deserialize(MxU8 *&p_source, MxS16 p_unk0x24) override
[AI] Deserializes this action's data from a binary buffer.
Definition: mxdsaction.cpp:259
virtual void SetUnknown90(MxLong p_unk0x90)
[AI] Set unknown value at offset 0x90, used as baseline in GetElapsedTime.
Definition: mxdsaction.cpp:60
virtual MxDSAction * Clone()
[AI] Clones (deep-copies) this action and returns a new pointer.
Definition: mxdsaction.cpp:146
virtual void MergeFrom(MxDSAction &p_dsAction)
[AI] Copies/merges properties from another action.
Definition: mxdsaction.cpp:166
MxLong m_unk0x90
[AI] Unknown field, appears to store a timestamp for GetElapsedTime logics.
Definition: mxdsaction.h:350
[AI] Represents a container for multiple MxDSAction objects, facilitating the grouping and management...
~MxDSMultiAction() override
[AI] Destructor.
void CopyFrom(MxDSMultiAction &p_dsMultiAction)
[AI] Deeply copies all actions from another MxDSMultiAction.
MxDSAction * Clone() override
[AI] Constructs a deep clone of this multi-action, including all subactions.
MxDSMultiAction()
[AI] Constructs an MxDSMultiAction, initializing its type and instantiating an empty action list.
void SetAtomId(MxAtomId p_atomId) override
[AI] Propagates the given AtomId to this and all subactions.
void MergeFrom(MxDSAction &p_dsAction) override
[AI] Propagates a merge operation from the provided MxDSAction to all subactions, as well as self.
void Deserialize(MxU8 *&p_source, MxS16 p_unk0x24) override
[AI] Reads the object's data from a raw byte buffer.
MxU32 GetSizeOnDisk() override
[AI] Calculates the total disk size occupied by this multi-action and all its subactions.
undefined4 VTable0x14() override
[AI] Hook for vtable entry 0x14.
MxDSActionList * m_actionList
[AI] List of contained actions (ownership: this owns and deletes subactions).
MxBool HasId(MxU32 p_objectId) override
[AI] Returns whether this action or any contained subaction matches the provided object id.
MxU32 m_sizeOnDisk
[AI] Stores the last-computed disk storage size for m_actionList and metadata.
MxDSMultiAction & operator=(MxDSMultiAction &p_dsMultiAction)
[AI] Assignment operator, deeply copies all state and actions from another MxDSMultiAction.
void SetUnknown90(MxLong p_unk0x90) override
[AI] Propagates an unknown value to this and all subactions.
virtual void SetAtomId(MxAtomId p_atomId)
[AI] Sets the atom id for this object instance, used for indexing or lookup.
Definition: mxdsobject.h:118
MxU32 GetObjectId()
[AI] Returns the object id numeric value.
Definition: mxdsobject.h:130
MxBool Next()
[AI]
void DeleteAll()
[AI]
void Append(T p_obj)
[AI]
Definition: mxlist.h:100
#define TRUE
Definition: d3drmdef.h:28
#define FALSE
Definition: d3drmdef.h:27
#define DECOMP_SIZE_ASSERT(T, S)
Definition: decomp.h:19
unsigned int undefined4
Definition: decomp.h:28
MxDSObject * DeserializeDSObjectDispatch(MxU8 *&, MxS16)
[AI] Reads and deserializes a DS object of the specific type from an SI buffer.
Definition: mxdsobject.cpp:210
MxU8 MxBool
[AI]
Definition: mxtypes.h:124
int MxLong
[AI]
Definition: mxtypes.h:83
signed short MxS16
[AI]
Definition: mxtypes.h:26
unsigned char MxU8
[AI]
Definition: mxtypes.h:8
unsigned int MxU32
[AI]
Definition: mxtypes.h:32