Files

187 lines
6.1 KiB
C++
Raw Permalink Normal View History

#ifndef JMESSAGE_PROCESSOR_H
#define JMESSAGE_PROCESSOR_H
#include "JSystem/JMessage/resource.h"
namespace JMessage {
struct TReference;
struct TControl;
struct TResource;
struct TProcessor {
2024-03-09 12:56:00 -08:00
public:
TProcessor(TControl *control) : mControl(control), mCurrent(NULL) {}
typedef bool (*ProcessorCallBack)(TProcessor*);
2024-03-05 16:48:54 -05:00
typedef const char* (*OnSelectBeginCallBack)(TProcessor*);
typedef const char* (*ProcessOnSelectCallBack)(TProcessor*);
2024-03-05 16:48:54 -05:00
struct TStack_ {
TStack_() { clear(); }
2024-03-09 12:56:00 -08:00
TStack_(const TStack_& other) {
for (int i = 0; i < mNum; i++) {
2024-03-05 16:48:54 -05:00
mStack[i] = mStack[i];
}
2024-03-09 12:56:00 -08:00
mNum = other.mNum;
2024-03-05 16:48:54 -05:00
}
2024-03-09 12:56:00 -08:00
inline void clear() { mNum = 0; }
inline void push(const char* str) {
2024-04-14 07:59:39 -07:00
mStack[mNum] = str;
2024-03-09 12:56:00 -08:00
mNum++;
2024-03-05 16:48:54 -05:00
}
2024-03-09 12:56:00 -08:00
inline bool IsStorable() const { return mNum < 4; }
inline void pop() { mNum--; }
2024-04-14 07:59:39 -07:00
inline const char* top() const { return mStack[mNum - 1]; }
2024-03-09 12:56:00 -08:00
inline bool empty() const { return mNum == 0; }
2024-03-13 16:34:05 -04:00
/* 0x00 */ const char* mStack[4];
/* 0x10 */ u32 mNum;
2024-03-05 16:48:54 -05:00
};
2024-03-09 12:56:00 -08:00
// XXX: None of this shows up in the debug map. Is this TStatusData?
2024-03-05 16:48:54 -05:00
struct TProcess {
TProcess() { reset_normal(); }
2024-03-09 12:56:00 -08:00
void reset_normal() { mCallBack = process_onCharacterEnd_normal_; }
void reset_select() { mCallBack = process_onCharacterEnd_select_; }
2024-03-09 12:56:00 -08:00
/* 0x00 */ ProcessorCallBack mCallBack;
/* 0x04 */ void* mCallBackWork[4];
2024-03-05 16:48:54 -05:00
};
2024-03-04 22:39:12 -05:00
~TProcessor();
2024-03-05 16:48:54 -05:00
virtual void do_character(int);
virtual bool do_tag(u32, const void*, u32);
virtual bool do_systemTagCode(u16, const void*, u32);
virtual void do_select_begin(u32);
virtual void do_select_end();
virtual void do_select_separate();
virtual void do_begin_(const void*, const char*) = 0;
virtual void do_end_() = 0;
virtual bool do_tag_(u32, const void*, u32) = 0;
virtual void do_systemTagCode_(u16, const void*, u32) = 0;
2024-03-05 16:48:54 -05:00
void setBegin_messageCode(u16, u16);
void setBegin_messageID(u32, u32, bool*);
void setBegin_messageCode(u32); // weak
TResource* getResource_groupID(u16) const;
u32 toMessageCode_messageID(u32, u32, bool*) const;
char* on_message(u32) const; // weak
char* getMessageText_messageCode(u32) const; // weak
static bool process_onCharacterEnd_normal_(TProcessor*);
static bool process_onCharacterEnd_select_(TProcessor*);
static const char* process_onSelect_limited_(TProcessor*);
static const char* process_onSelect_(TProcessor*);
void reset_(const char*);
2024-03-09 12:56:00 -08:00
static const char* process_select_limited_(TProcessor*);
static const char* process_select_(TProcessor*);
2024-03-04 22:39:12 -05:00
2024-03-05 16:48:54 -05:00
void pushCurrent(const char*);
const char* popCurrent();
void on_select_begin(OnSelectBeginCallBack, const void*, const char*, u32);
void on_select_end();
void on_select_separate();
void on_tag_();
2024-03-09 12:56:00 -08:00
bool process_character_();
const char* getCurrent() const { return mCurrent; }
2024-03-05 17:02:44 -05:00
/* 0x00 */ /* vtable */
2024-03-09 12:56:00 -08:00
/* 0x04 */ TControl* mControl;
/* 0x08 */ const char* mCurrent;
/* 0x0C */ TStack_ mStack;
/* 0x20 */ TProcess mProcess;
};
struct TSequenceProcessor : public TProcessor {
2024-03-05 16:48:54 -05:00
typedef bool OnJumpRegisterCallBack(TSequenceProcessor*);
typedef bool OnBranchRegisterCallBack(TSequenceProcessor*, u32);
typedef void* ProcessOnJumpCallBack(const TSequenceProcessor*);
2024-03-05 16:48:54 -05:00
TSequenceProcessor(const TReference*, TControl*);
2024-03-04 22:39:12 -05:00
TSequenceProcessor(TControl*);
2024-03-09 12:56:00 -08:00
/* 0x08 */ virtual ~TSequenceProcessor();
/* 0x30 */ virtual void do_begin_(const void*, const char*);
/* 0x34 */ virtual void do_end_();
/* 0x38 */ virtual bool do_tag_(u32, const void*, u32);
/* 0x3C */ virtual void do_systemTagCode_(u16, const void*, u32);
/* 0x40 */ virtual void do_begin(const void*, const char*);
/* 0x44 */ virtual void do_end();
/* 0x48 */ virtual bool do_isReady();
/* 0x4C */ virtual bool do_jump_isReady();
/* 0x50 */ virtual void do_jump(const void*, const char*);
/* 0x54 */ virtual void do_branch_query(u16);
/* 0x58 */ virtual int do_branch_queryResult();
/* 0x5C */ virtual void do_branch(const void*, const char*);
2024-03-09 14:38:41 -08:00
const char* process(const char*);
2024-03-05 16:48:54 -05:00
bool on_isReady();
2024-03-09 12:56:00 -08:00
bool on_jump_isReady();
2024-03-05 16:48:54 -05:00
void on_jump(const void*, const char*);
2024-03-09 12:56:00 -08:00
int on_branch_queryResult();
2024-03-05 16:48:54 -05:00
void on_branch(const void*, const char*);
2024-03-04 22:39:12 -05:00
void reset_(const char*);
2024-03-09 12:56:00 -08:00
static bool process_jump_limited_(TSequenceProcessor*);
static bool process_jump_(TSequenceProcessor*);
static bool process_branch_limited_(TSequenceProcessor*, u32);
static bool process_branch_(TSequenceProcessor*, u32);
2024-03-04 22:39:12 -05:00
2024-03-05 16:48:54 -05:00
// Unused/inlined:
const char* toString_status(int);
int toValue_status(const char*);
void on_jump_register(OnJumpRegisterCallBack*, u32);
void on_branch_register(OnBranchRegisterCallBack*, const void*, u32);
void on_branch_query(u16);
void process_setMessageIndex_reserved_(u16);
void process_setMessageCode_(const TSequenceProcessor*, u16, u16);
2024-03-04 22:39:12 -05:00
void reset() {}
void setBegin(const void* param_1, const char* param_2) {
reset_(param_2);
do_begin_(param_1, param_2);
}
2024-03-09 14:38:41 -08:00
enum {
kStatus_Begin,
kStatus_End,
kStatus_Normal,
kStatus_Jump,
kStatus_Branch,
};
2024-03-05 17:02:44 -05:00
/* 0x00 */ /* TProcessor */
2024-03-09 12:56:00 -08:00
/* 0x34 */ int mStatus;
};
struct TRenderingProcessor : public TProcessor {
2024-03-05 16:48:54 -05:00
TRenderingProcessor(const TReference*);
2024-03-04 22:39:12 -05:00
TRenderingProcessor(TControl*);
2024-03-09 14:38:41 -08:00
void setBegin(const void* entry, const char* data) {
reset_(data);
do_begin_(entry, data);
2024-03-09 12:56:00 -08:00
}
2024-03-05 16:48:54 -05:00
virtual void do_begin_(const void*, const char*);
virtual void do_end_();
virtual bool do_tag_(u32, const void*, u32);
virtual void do_systemTagCode_(u16, const void*, u32);
virtual ~TRenderingProcessor();
virtual void do_begin(const void*, const char*);
virtual void do_end();
2024-03-09 12:56:00 -08:00
2024-03-09 14:38:41 -08:00
const char* process(const char*);
2024-03-05 17:02:44 -05:00
/* 0x00 */ /* TProcessor */
};
} // namespace JMessage
#endif /* JMESSAGE_PROCESSOR_H */