Twilight Princess
Decompilation of The Legend of Zelda: Twilight Princess
Loading...
Searching...
No Matches
processor.h
Go to the documentation of this file.
1#ifndef JMESSAGE_PROCESSOR_H
2#define JMESSAGE_PROCESSOR_H
3
5#include <algorithm.h>
6#include "global.h"
7
8namespace JMessage {
9struct TResource;
10struct TResourceContainer;
11
16struct TReference {
17 TReference() { pcResource_ = NULL; }
18
19 virtual ~TReference();
20 virtual const char* do_word(u32) const;
21
22 int on_parseCharacter(const char** ppszText) const {
23 JUT_ASSERT(97, pcResource_!=NULL);
24 return pcResource_->parseCharacter(ppszText);
25 }
26
27 const char* on_word(u32 param_0) const { return do_word(param_0); }
28
29 TResource* getResource_groupID(u16 u16GroupID) const {
30 return pcResource_ == NULL ? NULL : pcResource_->getResource_groupID(u16GroupID);
31 }
32
34 void setResourceContainer(TResourceContainer* container) { pcResource_ = container; }
35
37};
38
43struct TProcessor {
44 TProcessor(const TReference* pReference)
45 : pReference_(pReference),
46 pResourceCache_(NULL),
47 pszCurrent_(NULL)
48 {
49 JUT_ASSERT(584, pReference_!=NULL);
50 }
51
52 typedef bool (*pfnProcess_func)(TProcessor*);
53
54 struct TStack_ {
55 TStack_() { clear(); }
56
57 bool empty() const { return upsz_ == 0; }
58 bool IsPushable() const { return size() < max_size(); }
59
60 void clear() { upsz_ = 0; }
61 u32 max_size() const { return 4; }
62 u32 size() const { return upsz_; }
63
64 const char* top() const {
65 JUT_ASSERT(181, upsz_>0);
66 return stack[upsz_ - 1];
67 }
68
69 void push(const char* pszText) {
70 JUT_ASSERT(186, IsPushable());
71 stack[upsz_] = pszText;
72 upsz_++;
73 }
74
75 void pop() {
76 JUT_ASSERT(192, upsz_>0);
77 upsz_--;
78
79 #if PLATFORM_SHIELD
80 stack[upsz_] = NULL;
81 #endif
82 }
83
84 TStack_& operator=(const TStack_& other) {
85 upsz_ = other.upsz_;
86 char** start = (char**)other.stack;
87 char** end = (char**)(other.stack + other.upsz_);
89 return *this;
90 }
91
92 /* 0x0 */ u32 upsz_; // stack size
93 /* 0x4 */ const char* stack[4];
94 }; // Size: 0x14
95
96 struct TProcess_ {
98
101
103 struct rdata {
104 /* 0x0 */ const char* (*pfn)(TProcessor*);
105 /* 0x4 */ const char* pcBase;
106 /* 0x8 */ const void* pOffset;
107 /* 0xC */ u32 uRest;
108 }
109 /* 0x4 */ rData;
110 }; // Size: 0x14
111
112 void reset();
113 void stack_pushCurrent(char const* pszText);
114 void stack_popCurrent();
115 const TResource* getResource_groupID(u16 u16GroupID) const;
116 u32 toMessageCode_messageID(u32 uMsgID, u32, bool* pbValid) const;
117 void on_select_begin(char const* (*pfn)(JMessage::TProcessor*), void const* pOffset,
118 char const* pcBase, u32 uNumber);
119 void on_select_end();
120 void on_select_separate();
121 void on_tag_();
122 bool process_character_();
125 static const char* process_onSelect_limited_(JMessage::TProcessor* pThis);
126 static const char* process_onSelect_(JMessage::TProcessor* pThis);
127 const char* on_message(u32 uCode) const { return getMessageText_messageCode(uCode); }
128 const char* getMessageText_messageCode(u32 uCode) const {
129 return getMessageText_messageCode(uCode >> 16, uCode & 0xFFFF);
130 }
131
132 virtual ~TProcessor();
133 virtual void do_reset();
134 virtual void do_begin(void const* pEntry, char const* pszText);
135 virtual void do_end();
136 virtual void do_character(int iCharacter);
137 virtual bool do_tag(u32 uTag, void const* pData, u32 uSize);
138 virtual void do_select_begin(u32 uNumber);
139 virtual void do_select_end();
140 virtual void do_select_separate();
141 virtual void do_resetStatus_(char const* pszText);
142 virtual bool do_setBegin_isReady_() const;
143 virtual void do_begin_(void const* pEntry, char const* pszText) = 0;
144 virtual void do_end_() = 0;
145 virtual void do_tag_(u32 uTag, void const* pData, u32 uSize) = 0;
146
147 void on_resetStatus_(const char* pszText) {
148 pszCurrent_ = pszText;
149 oStack_.clear();
151 do_resetStatus_(pszText);
152 }
153
154 void on_begin(const void* pEntry, const char* pszText) {
155 do_begin_(pEntry, pszText);
156 do_begin(pEntry, pszText);
157 }
158
159 void on_end() {
160 do_end_();
161 do_end();
162 }
163
164 void on_tag(u32 uTag, const void* pData, u32 uSize) {
165 if (!do_tag(uTag, pData, uSize)) {
166 do_tag_(uTag, pData, uSize);
167 }
168 }
169
170 const char* on_word(u32 param_0) const { return pReference_->on_word(param_0); }
171
172 int on_parseCharacter(const char** ppszText) const {
173 return pReference_->on_parseCharacter(ppszText);
174 }
175 void on_character(int iCharacter) { do_character(iCharacter); }
176
177 const char* on_message_limited(u16 u16Index) const {
178 JUT_ASSERT(482, pResourceCache_!=NULL);
180 }
181
183
184 int setBegin_messageEntryText(const TResource* pResource, const void* pEntry, const char* pszText) {
185 JUT_ASSERT(297, on_setBegin_isReady_());
186 pResourceCache_ = pResource;
187 on_resetStatus_(pszText);
188 on_begin(pEntry, pszText);
189 return 1;
190 }
191
192 int setBegin_messageEntryText(const TProcessor* pProcessor, const void* pEntry, const char* pszText) {
193 JUT_ASSERT(306, pProcessor!=NULL);
194 setBegin_messageEntryText(pProcessor->getResourceCache(), pEntry, pszText);
195 return 1;
196 }
197
198 void* getMessageEntry_messageCode(u16 u16Code, u16 u16Index) const {
199 const TResource* pResource = getResource_groupID(u16Code);
200
201 if (pResource == NULL) {
202 return NULL;
203 }
204
205 return pResource->getMessageEntry_messageIndex(u16Index);
206 }
207
208 const char* getMessageText_messageCode(u16 u16Code, u16 u16Index) const {
209 void* pEntry = getMessageEntry_messageCode(u16Code, u16Index);
210
211 if (pEntry == NULL) {
212 return NULL;
213 }
214
216 }
217
218 void stack_pushCurrent_(const char* pszText) {
220 pszCurrent_ = pszText;
221 }
222
225 oStack_.pop();
226 }
227
228 bool stack_isPushable() const { return oStack_.IsPushable(); }
229
230 const TResource* getResourceCache() const { return pResourceCache_; }
231 const char* getCurrent() const { return pszCurrent_; }
232 const TReference* getReference() const { return pReference_; }
233
234 const TResource* getResource_groupID_uncached(u16 u16GroupID) const {
235 return pReference_->getResource_groupID(u16GroupID);
236 }
237
238 bool isResourceCache_groupID(u16 u16GroupID) const {
239 return pResourceCache_ != NULL && u16GroupID == pResourceCache_->getGroupID();
240 }
241
245
246 void setResourceCache(TResource* pResource) { pResourceCache_ = pResource; }
248
249 /* 0x04 */ const TReference* pReference_;
250 /* 0x08 */ const mutable TResource* pResourceCache_;
251 /* 0x0C */ const char* pszCurrent_;
252 /* 0x10 */ TStack_ oStack_;
254};
255
256struct TControl;
257
263 typedef const void* (*branchPfn)(const TSequenceProcessor*, u32);
264 typedef const void* (*jumpPfn)(const TSequenceProcessor*);
265
266 struct TProcess_ {
268
269 void reset() {}
270
272 struct branchData {
274 /* 0x4 */ const void* pTarget;
275 /* 0x8 */ u32 uTarget;
277 struct jumpData {
278 /* 0x0 */ jumpPfn jumpFn;
279 /* 0x4 */ u32 u32Target;
281 }
282 /* 0x0 */ process;
283 };
284
292
293 TSequenceProcessor(JMessage::TReference const* pReference, JMessage::TControl* pControl);
294 const char* process(char const* pszText);
295 bool on_isReady();
296 void on_jump_register(jumpPfn pfn, u32 u32Target);
297 bool on_jump_isReady();
298 void on_jump(void const* pEntry, char const* pszText);
299 void on_branch_register(branchPfn pfn, void const* pTarget, u32 uTarget);
300 void on_branch_query(u32 uCode);
302 void on_branch(void const* pEntry, char const* pszText);
303 static void process_setMessageIndex_reserved_(u16 u16Index);
304 static void* process_setMessageCode_(TSequenceProcessor const* pProcessor, u16 u16GroupID, u16 u16Index);
305 static const void* process_onJump_limited_(TSequenceProcessor const* pProcessor);
306 static const void* process_onJump_(TSequenceProcessor const* pProcessor);
307 static const void* process_onBranch_limited_(TSequenceProcessor const* pProcessor, u32 uTargetIndex);
308 static const void* process_onBranch_(TSequenceProcessor const* pProcessor, u32 uTargetIndex);
309
310 virtual ~TSequenceProcessor();
311 virtual void do_resetStatus_(char const* pszText);
312 virtual bool do_setBegin_isReady_() const;
313 virtual void do_begin_(void const* pEntry, char const* pszText);
314 virtual void do_end_();
315 virtual void do_tag_(u32 uTag, void const* pData, u32 uSize);
316 virtual bool do_isReady();
317 virtual bool do_jump_isReady();
318 virtual void do_jump(void const* pEntry, char const* pszText);
319 virtual void do_branch_query(u32 uCode);
320 virtual s32 do_branch_queryResult();
321 virtual void do_branch(void const* pEntry, char const* pszText);
322
323 TControl* getControl() const { return pControl_; }
324
325 static const void* process_setMessageIndex_(const TSequenceProcessor* pProcessor, u16 u16Index) {
326 return process_setMessageCode_(pProcessor, pProcessor->getResourceCache()->getGroupID(),
327 u16Index);
328 }
329
330 static const void* process_setMessageCode_(const TSequenceProcessor* pProcessor, u32 uCode) {
331 return process_setMessageCode_(pProcessor, uCode >> 16, uCode & 0xFFFF);
332 }
333
334 /* 0x38 */ TControl* pControl_;
335 /* 0x3C */ SeqStatus eStatus_;
337};
338
344 TRenderingProcessor(JMessage::TReference const* pReference);
345 int process(char const* pszText);
346
347 virtual ~TRenderingProcessor();
348 virtual void do_begin_(void const* pEntry, char const* pszText);
349 virtual void do_end_();
350 virtual void do_tag_(u32 uTag, void const* pData, u32 uSize);
351
352 bool process_messageEntryText(const TProcessor* pProcessor, void const* pEntry, const char* pszText) {
353 if (!TProcessor::setBegin_messageEntryText(pProcessor, pEntry, pszText)) {
354 return false;
355 }
356
357 process(NULL);
358 return true;
359 }
360};
361}; // namespace JMessage
362
363#endif /* JMESSAGE_PROCESSOR_H */
static void end(b_oh_class *i_this)
Definition d_a_b_oh.cpp:344
static processFunc process[]
Definition d_menu_collect.cpp:52
unsigned long u32
Definition types.h:12
unsigned short int u16
Definition types.h:10
signed long s32
Definition types.h:11
Definition control.h:6
OutputIt copy(InputIt first, InputIt last, OutputIt d_first)
Definition algorithm.h:131
@ start
Definition strtoul.c:8
Definition control.h:12
Definition processor.h:103
const char * pcBase
Definition processor.h:105
u32 uRest
Definition processor.h:107
const void * pOffset
Definition processor.h:106
Definition processor.h:96
struct JMessage::TProcessor::TProcess_::rdata rData
void reset_normal()
Definition processor.h:99
void reset_select()
Definition processor.h:100
pfnProcess_func pfnProcess_onCharacterEnd
Definition processor.h:102
TProcess_()
Definition processor.h:97
Definition processor.h:54
const char * top() const
Definition processor.h:64
void pop()
Definition processor.h:75
TStack_ & operator=(const TStack_ &other)
Definition processor.h:84
const char * stack[4]
Definition processor.h:93
u32 size() const
Definition processor.h:62
u32 max_size() const
Definition processor.h:61
bool empty() const
Definition processor.h:57
bool IsPushable() const
Definition processor.h:58
void push(const char *pszText)
Definition processor.h:69
void clear()
Definition processor.h:60
u32 upsz_
Definition processor.h:92
TStack_()
Definition processor.h:55
Definition processor.h:43
virtual void do_end()
Definition processor.cpp:130
bool on_setBegin_isReady_() const
Definition processor.h:182
const char * getMessageText_messageCode(u16 u16Code, u16 u16Index) const
Definition processor.h:208
void setResourceCache(TResource *pResource)
Definition processor.h:246
bool isResourceCache_groupID(u16 u16GroupID) const
Definition processor.h:238
static const char * process_onSelect_(JMessage::TProcessor *pThis)
Definition processor.cpp:281
void stack_popCurrent_()
Definition processor.h:223
virtual void do_begin(void const *pEntry, char const *pszText)
Definition processor.cpp:128
static const char * process_onSelect_limited_(JMessage::TProcessor *pThis)
Definition processor.cpp:267
const char * pszCurrent_
Definition processor.h:251
virtual void do_resetStatus_(char const *pszText)
Definition processor.cpp:169
const TResource * getResource_groupID(u16 u16GroupID) const
Definition processor.cpp:37
virtual void do_begin_(void const *pEntry, char const *pszText)=0
virtual void do_reset()
Definition processor.cpp:126
virtual void do_select_end()
Definition processor.cpp:140
const char * on_word(u32 param_0) const
Definition processor.h:170
void on_tag(u32 uTag, const void *pData, u32 uSize)
Definition processor.h:164
const char * getCurrent() const
Definition processor.h:231
void reset()
Definition processor.cpp:16
bool stack_isPushable() const
Definition processor.h:228
virtual bool do_setBegin_isReady_() const
Definition processor.cpp:171
void on_tag_()
Definition processor.cpp:144
const TReference * getReference() const
Definition processor.h:232
virtual void do_select_separate()
Definition processor.cpp:142
void on_select_begin(char const *(*pfn)(JMessage::TProcessor *), void const *pOffset, char const *pcBase, u32 uNumber)
Definition processor.cpp:76
void resetResourceCache()
Definition processor.h:247
TProcessor(const TReference *pReference)
Definition processor.h:44
virtual void do_select_begin(u32 uNumber)
Definition processor.cpp:138
TStack_ oStack_
Definition processor.h:252
void on_character(int iCharacter)
Definition processor.h:175
virtual bool do_tag(u32 uTag, void const *pData, u32 uSize)
Definition processor.cpp:134
void * getMessageEntry_messageCode(u16 u16Code, u16 u16Index) const
Definition processor.h:198
void on_begin(const void *pEntry, const char *pszText)
Definition processor.h:154
const TResource * getResourceCache() const
Definition processor.h:230
const char * on_message(u32 uCode) const
Definition processor.h:127
const TResource * getResource_groupID_uncached(u16 u16GroupID) const
Definition processor.h:234
int setBegin_messageEntryText(const TProcessor *pProcessor, const void *pEntry, const char *pszText)
Definition processor.h:192
TResourceContainer * getResourceContainer() const
Definition processor.h:242
virtual void do_tag_(u32 uTag, void const *pData, u32 uSize)=0
Definition processor.cpp:175
int on_parseCharacter(const char **ppszText) const
Definition processor.h:172
const TReference * pReference_
Definition processor.h:249
void stack_pushCurrent(char const *pszText)
Definition processor.cpp:21
const char * getMessageText_messageCode(u32 uCode) const
Definition processor.h:128
static bool process_onCharacterEnd_normal_(JMessage::TProcessor *pThis)
Definition processor.cpp:238
bool(*) pfnProcess_func(TProcessor *)
Definition processor.h:52
virtual void do_character(int iCharacter)
Definition processor.cpp:132
void on_select_end()
Definition processor.cpp:99
const char * on_message_limited(u16 u16Index) const
Definition processor.h:177
void on_select_separate()
Definition processor.cpp:109
static bool process_onCharacterEnd_select_(JMessage::TProcessor *pThis)
Definition processor.cpp:250
virtual ~TProcessor()
Definition processor.cpp:14
void stack_popCurrent()
Definition processor.cpp:32
TProcess_ oProcess_
Definition processor.h:253
const TResource * pResourceCache_
Definition processor.h:250
int setBegin_messageEntryText(const TResource *pResource, const void *pEntry, const char *pszText)
Definition processor.h:184
void on_end()
Definition processor.h:159
void on_resetStatus_(const char *pszText)
Definition processor.h:147
bool process_character_()
Definition processor.cpp:218
u32 toMessageCode_messageID(u32 uMsgID, u32, bool *pbValid) const
Definition processor.cpp:46
void stack_pushCurrent_(const char *pszText)
Definition processor.h:218
virtual void do_end_()=0
Definition processor.h:16
TReference()
Definition processor.h:17
TResourceContainer * pcResource_
Definition processor.h:36
TResource * getResource_groupID(u16 u16GroupID) const
Definition processor.h:29
void setResourceContainer(TResourceContainer *container)
Definition processor.h:34
virtual const char * do_word(u32) const
Definition processor.cpp:10
TResourceContainer * getResourceContainer() const
Definition processor.h:33
int on_parseCharacter(const char **ppszText) const
Definition processor.h:22
virtual ~TReference()
Definition processor.cpp:8
const char * on_word(u32 param_0) const
Definition processor.h:27
Definition processor.h:343
virtual void do_begin_(void const *pEntry, char const *pszText)
Definition processor.cpp:627
bool process_messageEntryText(const TProcessor *pProcessor, void const *pEntry, const char *pszText)
Definition processor.h:352
virtual void do_tag_(u32 uTag, void const *pData, u32 uSize)
Definition processor.cpp:631
virtual ~TRenderingProcessor()
Definition processor.cpp:614
virtual void do_end_()
Definition processor.cpp:629
TRenderingProcessor(JMessage::TReference const *pReference)
Definition processor.cpp:611
Definition resource.h:112
TResource * getResource_groupID(u16 u16GroupID)
Definition resource.h:131
int parseCharacter(const char **ppszText) const
Definition resource.h:126
Definition resource.h:14
char * getMessageText_messageEntry(const void *pEntry) const
Definition resource.h:43
const char * getMessageText_messageIndex(u16 uMessageIndex) const
Definition resource.h:48
u16 getGroupID() const
Definition resource.h:32
void * getMessageEntry_messageIndex(u16 uMessageIndex) const
Definition resource.h:34
Definition processor.h:266
void reset()
Definition processor.h:269
TProcess_()
Definition processor.h:267
union JMessage::TSequenceProcessor::TProcess_::processData process
Definition processor.h:262
virtual void do_branch_query(u32 uCode)
Definition processor.cpp:448
virtual s32 do_branch_queryResult()
Definition processor.cpp:450
void on_jump_register(jumpPfn pfn, u32 u32Target)
Definition processor.cpp:382
static const void * process_onBranch_limited_(TSequenceProcessor const *pProcessor, u32 uTargetIndex)
Definition processor.cpp:590
virtual void do_jump(void const *pEntry, char const *pszText)
Definition processor.cpp:446
TControl * getControl() const
Definition processor.h:323
u32 on_branch_queryResult()
Definition processor.cpp:423
static const void * process_onBranch_(TSequenceProcessor const *pProcessor, u32 uTargetIndex)
Definition processor.cpp:601
static void * process_setMessageCode_(TSequenceProcessor const *pProcessor, u16 u16GroupID, u16 u16Index)
Definition processor.cpp:556
void on_branch_register(branchPfn pfn, void const *pTarget, u32 uTarget)
Definition processor.cpp:408
virtual void do_tag_(u32 uTag, void const *pData, u32 uSize)
Definition processor.cpp:477
virtual void do_begin_(void const *pEntry, char const *pszText)
Definition processor.cpp:468
virtual bool do_jump_isReady()
Definition processor.cpp:442
virtual void do_branch(void const *pEntry, char const *pszText)
Definition processor.cpp:454
virtual bool do_setBegin_isReady_() const
Definition processor.cpp:464
void on_branch(void const *pEntry, char const *pszText)
Definition processor.cpp:429
void on_branch_query(u32 uCode)
Definition processor.cpp:417
virtual bool do_isReady()
Definition processor.cpp:438
SeqStatus
Definition processor.h:285
@ STATUS_BRANCH
Definition processor.h:290
@ STATUS_ONE
Definition processor.h:287
@ STATUS_NORMAL
Definition processor.h:288
@ STATUS_JUMP
Definition processor.h:289
@ STATUS_READY
Definition processor.h:286
TSequenceProcessor(JMessage::TReference const *pReference, JMessage::TControl *pControl)
Definition processor.cpp:295
SeqStatus eStatus_
Definition processor.h:335
const void *(*) jumpPfn(const TSequenceProcessor *)
Definition processor.h:264
static const void * process_onJump_(TSequenceProcessor const *pProcessor)
Definition processor.cpp:584
bool on_isReady()
Definition processor.cpp:377
TProcess_ oProcess2_
Definition processor.h:336
virtual ~TSequenceProcessor()
Definition processor.cpp:302
const void *(*) branchPfn(const TSequenceProcessor *, u32)
Definition processor.h:263
void on_jump(void const *pEntry, char const *pszText)
Definition processor.cpp:396
static const void * process_setMessageCode_(const TSequenceProcessor *pProcessor, u32 uCode)
Definition processor.h:330
static const void * process_setMessageIndex_(const TSequenceProcessor *pProcessor, u16 u16Index)
Definition processor.h:325
TControl * pControl_
Definition processor.h:334
bool on_jump_isReady()
Definition processor.cpp:391
virtual void do_resetStatus_(char const *pszText)
Definition processor.cpp:456
virtual void do_end_()
Definition processor.cpp:472
static void process_setMessageIndex_reserved_(u16 u16Index)
Definition processor.cpp:546
static const void * process_onJump_limited_(TSequenceProcessor const *pProcessor)
Definition processor.cpp:576
struct JMessage::TSequenceProcessor::TProcess_::processData::jumpData jump_process
struct JMessage::TSequenceProcessor::TProcess_::processData::branchData branch_process