d_mesg work

This commit is contained in:
LagoLunatic
2025-06-26 18:40:45 -04:00
parent 9d0608a6a4
commit 3bb95dd90c
19 changed files with 757 additions and 645 deletions
+14 -6
View File
@@ -52,15 +52,23 @@ struct TControl {
const char* getMessageData(u16, u16) const;
void reset_();
void getMessageCode() const {}
u32 getMessageCode() const { return (getMessageGroupID() << 16) | getMessageIndex(); }
void getMessageData(u32) const {}
void getMessageEntry(u32) const {}
void getMessageEntry(u16, u16) const {}
void getMessageGroupID() const {}
void getMessageIndex() const {}
void* getMessageEntry(u32 messageCode) const {
return getMessageEntry(messageCode >> 16, messageCode & 0xFFFF);
}
void* getMessageEntry(u16 messageGroupID, u16 messageIndex) const {
TResource* resource = getResource_groupID(messageGroupID);
if (resource == NULL) {
return NULL;
}
return resource->getMessageEntry(messageIndex);
}
u16 getMessageGroupID() const { return mGroupID; }
u16 getMessageIndex() const { return mMessageIndex; }
void setMessageIndex(u16) {}
void on_isLeadByte(int) {}
void on_word(u32) {}
void setMessageIndex(u16) {}
void setResourceContainer(const JMessage::TResourceContainer*) {}
/* 0x04 */ TResourceContainer* mResourceContainer;
+8 -3
View File
@@ -11,6 +11,7 @@ extern const int ga4cSignature;
struct TParse_THeader : public JGadget::binary::TParseData_aligned<4> {
TParse_THeader(const void* data) : TParseData_aligned(data) {}
// TODO: create a struct for this content (BMG header)
char* get() const { return (char*)getRaw(); }
const void* getContent() const { return (char*)getRaw() + 0x20; }
@@ -24,6 +25,7 @@ struct TParse_TBlock : public JGadget::binary::TParseData_aligned<4> {
TParse_TBlock(const void* data) : TParseData_aligned(data) {}
};
// INF1
struct JUTMesgInfo {
public:
/* 0x00 */ JUTDataBlockHeader header;
@@ -32,19 +34,21 @@ public:
/* 0x0C */ u16 groupID;
/* 0x0E */ u8 defaultColor;
/* 0x0F */ u8 reserved;
/* 0x10 */ char messageEntryTable[];
};
struct TParse_TBlock_info : public TParse_TBlock {
TParse_TBlock_info(const void* data) : TParse_TBlock(data) {}
JUTMesgInfo* get() const { return (JUTMesgInfo*)getRaw(); }
char* getContent() const { return (char*)&get()[1]; }
char* getContent() const { return get()->messageEntryTable; }
u16 get_messageEntryNumber() const { return get()->messageEntryNumber; }
u16 get_messageEntrySize() const { return get()->messageEntrySize; }
u32 get_messageEntryNumber() const { return get()->messageEntryNumber; }
u32 get_messageEntrySize() const { return get()->messageEntrySize; }
u16 get_groupID() const { return get()->groupID; }
};
// MID1
struct JUTMesgIDData {
public:
/* 0x00 */ JUTDataBlockHeader mHeader;
@@ -52,6 +56,7 @@ public:
/* 0x0A */ u8 format;
/* 0x0B */ u8 info;
/* 0x0C */ u8 reserved[4];
/* 0x10 */ u32 messageIDTable[];
};
inline u16 getTagCode(u32 tag) { return tag & 0xFFFF; }
+21 -9
View File
@@ -25,17 +25,28 @@ namespace JMessage {
void setData_block_stringAttribute(const void* p) { mStringAttribute = (const char*)p; }
void setData_block_messageID(const void* p) { mMessageID = (data::JUTMesgIDData*)p; }
u16 getMessageEntryNumber() const { return mInfo.get_messageEntryNumber(); }
u16 getMessageEntrySize() const { return mInfo.get_messageEntrySize(); }
u32 getMessageEntryNumber() const { return mInfo.get_messageEntryNumber(); }
u32 getMessageEntrySize() const { return mInfo.get_messageEntrySize(); }
u16 getGroupID() const { return mInfo.get_groupID(); }
bool isContained_messageIndex(u16 messageIndex) const {
return messageIndex < getMessageEntryNumber();
}
void* getMessageData_messageIndex(u16 messageIndex) const {
if (messageIndex >= getMessageEntryNumber())
void* getMessageEntry(u16 messageIndex) const {
// Fakematch?
// Debug maps suggest the isMessageIndexContained inline was used for this check, but
// using it here causes various issues with matching from instruction order to regalloc
// and even completely wrong codegen on demo. Writing the check directly fixes this.
if (messageIndex >= getMessageEntryNumber()) {
return NULL;
}
return getMessageEntry_(messageIndex);
}
void* getMessageEntry_(u16 messageIndex) const {
return mInfo.getContent() + (messageIndex * getMessageEntrySize());
}
bool isMessageIndexContained(u16 messageIndex) const {
// wrong somehow?
return messageIndex < getMessageEntryNumber();
}
void getMessageData_messageEntry(const void*) const {} // TODO
public:
/* 0x00 */ JGadget::TLinkListNode mLinkNode;
@@ -47,11 +58,12 @@ namespace JMessage {
};
#ifdef __MWERKS__
class TResourceContainer : public JGadget::TLinkList_factory<TResource, -offsetof(TResource, mLinkNode)> {
class TResourceContainer : public JGadget::TLinkList_factory<TResource, -offsetof(TResource, mLinkNode)>
#else
// clangd does not support offsetof in template arguments.
class TResourceContainer : public JGadget::TLinkList_factory<TResource, -0x00> {
class TResourceContainer : public JGadget::TLinkList_factory<TResource, -0x00>
#endif
{
public:
TResourceContainer();
virtual TResource* Do_create();