mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-03 17:33:05 +00:00
FULLPIPE: Continued loading CInteraction
This commit is contained in:
parent
72aeac3f36
commit
e9fa2e52df
@ -66,15 +66,7 @@ struct CNode {
|
||||
void *data;
|
||||
};
|
||||
|
||||
class CPtrList {
|
||||
//CObject obj;
|
||||
CNode *m_pNodeHead;
|
||||
int m_pNodeTail;
|
||||
int m_nCount;
|
||||
int m_pNodeFree;
|
||||
int m_pBlocks;
|
||||
int m_nBlockSize;
|
||||
};
|
||||
typedef Common::Array<void *> CPtrList;
|
||||
|
||||
class SceneTag : public CObject {
|
||||
int _field_4;
|
||||
@ -112,36 +104,40 @@ class GameProject : public CObject {
|
||||
};
|
||||
|
||||
class MessageQueue : public CObject {
|
||||
int _id;
|
||||
int _flags;
|
||||
char *_stringObj;
|
||||
int16 _dataId;
|
||||
int16 _field_12;
|
||||
int _field_14;
|
||||
CPtrList _exCommands;
|
||||
int _counter;
|
||||
int _field_38;
|
||||
int _isFinished;
|
||||
int _parId;
|
||||
int _flag1;
|
||||
int _id;
|
||||
int _flags;
|
||||
char *_stringObj;
|
||||
int16 _dataId;
|
||||
int16 _field_12;
|
||||
int _field_14;
|
||||
CPtrList _exCommands;
|
||||
int _counter;
|
||||
int _field_38;
|
||||
int _isFinished;
|
||||
int _parId;
|
||||
int _flag1;
|
||||
|
||||
public:
|
||||
MessageQueue();
|
||||
virtual bool load(MfcArchive &file);
|
||||
};
|
||||
|
||||
class CInteraction : public CObject {
|
||||
int16 _objectId1;
|
||||
int16 _objectId2;
|
||||
int16 _objectId3;
|
||||
int16 _staticsId1;
|
||||
int16 _staticsId2;
|
||||
int16 _field_E;
|
||||
int _objectState1;
|
||||
int _objectState2;
|
||||
int _xOffs;
|
||||
int _yOffs;
|
||||
MessageQueue *_messageQueue;
|
||||
int _sceneId;
|
||||
int _field_28;
|
||||
int _flags;
|
||||
char *_stringObj;
|
||||
int16 _objectId1;
|
||||
int16 _objectId2;
|
||||
int16 _objectId3;
|
||||
int16 _staticsId1;
|
||||
int16 _staticsId2;
|
||||
int16 _field_E;
|
||||
int _objectState1;
|
||||
int _objectState2;
|
||||
int _xOffs;
|
||||
int _yOffs;
|
||||
MessageQueue *_messageQueue;
|
||||
int _sceneId;
|
||||
int _field_28;
|
||||
int _flags;
|
||||
char *_stringObj;
|
||||
|
||||
public:
|
||||
CInteraction();
|
||||
@ -188,35 +184,42 @@ class Sc2Array {
|
||||
};
|
||||
|
||||
union VarValue {
|
||||
int floatValue;
|
||||
int intValue;
|
||||
int stringValue;
|
||||
int floatValue;
|
||||
int intValue;
|
||||
int stringValue;
|
||||
};
|
||||
|
||||
class Message {
|
||||
//CObject obj;
|
||||
int messageKind;
|
||||
int16 parentId;
|
||||
char gap_A[2];
|
||||
int x;
|
||||
int y;
|
||||
int field_14;
|
||||
int sceneClickX;
|
||||
int sceneClickY;
|
||||
int field_20;
|
||||
int field_24;
|
||||
int param28;
|
||||
int field_2C;
|
||||
int field_30;
|
||||
int field_34;
|
||||
public:
|
||||
int _messageKind;
|
||||
int16 _parentId;
|
||||
int _x;
|
||||
int _y;
|
||||
int _field_14;
|
||||
int _sceneClickX;
|
||||
int _sceneClickY;
|
||||
int _field_20;
|
||||
int _field_24;
|
||||
int _param28;
|
||||
int _field_2C;
|
||||
int _field_30;
|
||||
int _field_34;
|
||||
|
||||
public:
|
||||
Message();
|
||||
};
|
||||
|
||||
class ExCommand {
|
||||
Message msg;
|
||||
int messageNum;
|
||||
int field_3C;
|
||||
int flags;
|
||||
int parId;
|
||||
class ExCommand : public CObject {
|
||||
Message _msg;
|
||||
int _messageNum;
|
||||
int _field_3C;
|
||||
int _flags;
|
||||
int _parId;
|
||||
|
||||
public:
|
||||
ExCommand();
|
||||
|
||||
virtual bool load(MfcArchive &file);
|
||||
};
|
||||
|
||||
class CGameVar {
|
||||
@ -396,4 +399,3 @@ class CGameLoader {
|
||||
} // End of namespace Fullpipe
|
||||
|
||||
#endif /* FULLPIPE_OBJECTS_H */
|
||||
|
||||
|
@ -116,6 +116,10 @@ GameProject::GameProject() {
|
||||
}
|
||||
|
||||
bool GameProject::load(MfcArchive &file) {
|
||||
_field_4 = 0;
|
||||
_headerFilename = 0;
|
||||
_field_10 = 12;
|
||||
|
||||
g_gameProjectVersion = file.readUint32LE();
|
||||
g_gameProjectValue = file.readUint16LE();
|
||||
g_scrollSpeed = file.readUint32LE();
|
||||
@ -166,6 +170,9 @@ SceneTag::SceneTag() {
|
||||
}
|
||||
|
||||
bool SceneTag::load(MfcArchive &file) {
|
||||
_field_4 = 0;
|
||||
_scene = 0;
|
||||
|
||||
_sceneId = file.readUint16LE();
|
||||
|
||||
_tag = file.readPascalString();
|
||||
@ -287,8 +294,94 @@ bool CInteraction::load(MfcArchive &file) {
|
||||
|
||||
// messageQueue
|
||||
_messageQueue = (MessageQueue *)file.parseClass();
|
||||
_messageQueue->load(file);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
MessageQueue::MessageQueue() {
|
||||
_field_14 = 0;
|
||||
_parId = 0;
|
||||
_dataId = 0;
|
||||
_id = 0;
|
||||
_isFinished = 0;
|
||||
_flags = 0;
|
||||
}
|
||||
|
||||
bool MessageQueue::load(MfcArchive &file) {
|
||||
_dataId = file.readUint16LE();
|
||||
|
||||
int count = file.readUint16LE();
|
||||
|
||||
_stringObj = file.readPascalString();
|
||||
debug(0, "MessageQueue::count = %d", count);
|
||||
debug(0, "MessageQueue::_stringObj = %s", _stringObj);
|
||||
|
||||
for (int i = 0; i < count; i++) {
|
||||
CObject *tmp = file.parseClass();
|
||||
tmp->load(file);
|
||||
|
||||
_exCommands.push_back(tmp);
|
||||
}
|
||||
|
||||
_id = -1;
|
||||
_field_14 = 0;
|
||||
_parId = 0;
|
||||
_isFinished = 0;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
ExCommand::ExCommand() {
|
||||
_field_3C = 1;
|
||||
_messageNum = 0;
|
||||
_flags = 0;
|
||||
_parId = 0;
|
||||
}
|
||||
|
||||
bool ExCommand::load(MfcArchive &file) {
|
||||
debug(0, "ExCommand::load");
|
||||
|
||||
_msg._parentId = file.readUint16LE();
|
||||
_msg._messageKind = file.readUint32LE();
|
||||
_msg._x = file.readUint32LE();
|
||||
_msg._y = file.readUint32LE();
|
||||
_msg._field_14 = file.readUint32LE();
|
||||
_msg._sceneClickX = file.readUint32LE();
|
||||
_msg._sceneClickY = file.readUint32LE();
|
||||
_msg._field_20 = file.readUint32LE();
|
||||
_msg._field_24 = file.readUint32LE();
|
||||
_msg._param28 = file.readUint32LE();
|
||||
_msg._field_2C = file.readUint32LE();
|
||||
_msg._field_30 = file.readUint32LE();
|
||||
_msg._field_34 = file.readUint32LE();
|
||||
|
||||
_messageNum = file.readUint32LE();
|
||||
|
||||
_field_3C = 0;
|
||||
|
||||
if (g_gameProjectVersion >= 12) {
|
||||
_flags = file.readUint32LE();
|
||||
_parId = file.readUint32LE();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Message::Message() {
|
||||
_messageKind = 0;
|
||||
_parentId = 0;
|
||||
_x = 0;
|
||||
_y = 0;
|
||||
_field_14 = 0;
|
||||
_sceneClickX = 0;
|
||||
_sceneClickY = 0;
|
||||
_field_20 = 0;
|
||||
_field_24 = 0;
|
||||
_param28 = 0;
|
||||
_field_2C = 0;
|
||||
_field_30 = 0;
|
||||
_field_34 = 0;
|
||||
}
|
||||
|
||||
} // End of namespace Fullpipe
|
||||
|
@ -54,14 +54,18 @@ int MfcArchive::readCount() {
|
||||
}
|
||||
|
||||
enum {
|
||||
kCInteraction = 0
|
||||
kCInteraction = 0,
|
||||
kMessageQueue = 1,
|
||||
kExCommand = 2
|
||||
};
|
||||
|
||||
const struct {
|
||||
const char *name;
|
||||
int id;
|
||||
} classMap[] = {
|
||||
{ "CInteraction", kCInteraction },
|
||||
{ "CInteraction", kCInteraction },
|
||||
{ "MessageQueue", kMessageQueue },
|
||||
{ "ExCommand", kExCommand },
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
@ -79,7 +83,7 @@ CObject *MfcArchive::parseClass() {
|
||||
|
||||
uint obTag = readUint16LE();
|
||||
|
||||
debug(0, "parseClass::obTag = %d", obTag);
|
||||
debug(0, "parseClass::obTag = %d (%04x)", obTag, obTag);
|
||||
|
||||
if (obTag == 0xffff) {
|
||||
int schema = readUint16LE();
|
||||
@ -87,6 +91,7 @@ CObject *MfcArchive::parseClass() {
|
||||
debug(0, "parseClass::schema = %d", schema);
|
||||
|
||||
name = readPascalString(true);
|
||||
debug(0, "parseClass::class <%s>", name);
|
||||
|
||||
if (!_classMap.contains(name)) {
|
||||
error("Unknown class in MfcArchive: <%s>", name);
|
||||
@ -94,14 +99,18 @@ CObject *MfcArchive::parseClass() {
|
||||
|
||||
objectId = _classMap[name];
|
||||
_objectMap.push_back(objectId);
|
||||
|
||||
debug(0, "tag: %d", _objectMap.size());
|
||||
} else {
|
||||
obTag &= ~0x8000;
|
||||
|
||||
debug(0, "parseClass::obTag <%d>", obTag);
|
||||
|
||||
if (_objectMap.size() < obTag) {
|
||||
error("Object index too big: %d", obTag);
|
||||
error("Object index too big: %d at 0x%08x", obTag, pos() - 2);
|
||||
}
|
||||
|
||||
objectId = _objectMap[obTag];
|
||||
objectId = _objectMap[obTag - 1];
|
||||
}
|
||||
|
||||
debug(0, "objectId: %d", objectId);
|
||||
@ -109,6 +118,10 @@ CObject *MfcArchive::parseClass() {
|
||||
switch (objectId) {
|
||||
case kCInteraction:
|
||||
return new CInteraction();
|
||||
case kMessageQueue:
|
||||
return new MessageQueue();
|
||||
case kExCommand:
|
||||
return new ExCommand();
|
||||
default:
|
||||
error("Unknown objectId: %d", objectId);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user