mirror of
https://github.com/zeldaret/tww.git
synced 2026-08-21 22:10:59 -04:00
d_mesg work
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user