1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
|
//
// Generated By: dol2asm
// Translation Unit: resource
//
#include "JSystem/JMessage/resource.h"
#include "JSystem/JGadget/search.h"
#include "JSystem/JGadget/define.h"
#include <algorithm.h>
#include "string.h"
/* 802A8CDC-802A8EC0 2A361C 01E4+00 0/0 1/1 0/0 .text
* toMessageIndex_messageID__Q28JMessage9TResourceCFUlUlPb */
u16 JMessage::TResource::toMessageIndex_messageID(u32 lowerHalf, u32 upperHalf,
bool* isMsgValid) const {
if (!mMessageID.getRaw()) {
return 0xFFFF;
}
u32 val = -1;
bool check = true;
u8 sp0A = mMessageID.get_formSupplement();
switch (sp0A) {
case 0:
if (upperHalf) {
check = false;
}
val = lowerHalf;
break;
case 1:
if (lowerHalf > 0xFFFFFF || upperHalf > 0xFF) {
check = false;
}
val = ((lowerHalf << 8) & 0xFFFFFF00) | (upperHalf & 0xFF);
break;
case 2:
if (lowerHalf > 0xFFFF || upperHalf > 0xFFFF) {
check = false;
}
val = ((lowerHalf << 16) & 0xFFFF0000) | (upperHalf & 0xFFFF);
break;
case 3:
if (lowerHalf > 0xFF || upperHalf > 0xFFFFFF) {
check = false;
}
val = ((lowerHalf << 24) & 0xFF000000) | (upperHalf & 0x00FFFFFF);
break;
case 4:
if (lowerHalf) {
check = false;
}
val = upperHalf;
break;
default:
return 0xFFFF;
}
if (isMsgValid) {
*isMsgValid = check;
}
if (val == 0xFFFFFFFF) {
return 0xFFFF;
}
int number = mMessageID.get_number();
const u32* first = mMessageID.getContent();
const u32* last = first + number;
const u32* lower;
if (mMessageID.get_isOrdered()) {
lower = std::lower_bound(first, last, val);
if (lower == last || *lower != val) {
return 0xFFFF;
}
} else {
lower = std::find(first, last, val);
if (lower == last) {
return 0xFFFF;
}
}
return (lower - first);
}
/* 803C9C80-803C9C94 -00001 0014+00 1/1 0/0 0/0 .data
* sapfnParseCharacter___Q28JMessage18TResourceContainer */
JMessage::locale::parseCharacter_function JMessage::TResourceContainer::sapfnParseCharacter_[5] = {
NULL,
JMessage::locale::parseCharacter_1Byte,
JMessage::locale::parseCharacter_2Byte,
JMessage::locale::parseCharacter_ShiftJIS,
JMessage::locale::parseCharacter_UTF8,
};
/* 802A8EC0-802A8EF8 2A3800 0038+00 1/1 0/0 0/0 .text
* __ct__Q38JMessage18TResourceContainer10TCResourceFv */
JMessage::TResourceContainer::TCResource::TCResource() {}
/* 802A8EF8-802A8F6C 2A3838 0074+00 1/0 2/2 0/0 .text
* __dt__Q38JMessage18TResourceContainer10TCResourceFv */
JMessage::TResourceContainer::TCResource::~TCResource() {}
/* 802A8F6C-802A8FFC 2A38AC 0090+00 0/0 1/1 0/0 .text
* Get_groupID__Q38JMessage18TResourceContainer10TCResourceFUs */
// NONMATCHING
JMessage::TResource* JMessage::TResourceContainer::TCResource::Get_groupID(u16 groupID) {
JGadget::TContainerEnumerator<TResource, 0> enumerator(this);
while (enumerator) {
const TResource* res = &(*enumerator);
if (res->field_0xc.get_groupID() == groupID)
return (TResource*)res;
}
return NULL;
}
/* 802A8FFC-802A9048 2A393C 004C+00 1/0 0/0 0/0 .text
* Do_create__Q38JMessage18TResourceContainer10TCResourceFv */
JMessage::TResource* JMessage::TResourceContainer::TCResource::Do_create() {
TResource* new_res = new TResource();
return new_res;
}
/* 802A9048-802A906C 2A3988 0024+00 1/0 0/0 0/0 .text
* Do_destroy__Q38JMessage18TResourceContainer10TCResourceFPQ28JMessage9TResource */
// NONMATCHING extra null comparison
void JMessage::TResourceContainer::TCResource::Do_destroy(JMessage::TResource* param_0) {
delete param_0;
}
/* 802A906C-802A90B8 2A39AC 004C+00 0/0 2/2 0/0 .text __ct__Q28JMessage18TResourceContainerFv */
JMessage::TResourceContainer::TResourceContainer() : mEncodingType(0), pfnParseCharacter_(NULL) {}
/* 802A90B8-802A90F0 2A39F8 0038+00 1/1 0/0 0/0 .text
* setEncoding__Q28JMessage18TResourceContainerFUc */
void JMessage::TResourceContainer::setEncoding(u8 e) {
if (e == 0) {
mEncodingType = e;
pfnParseCharacter_ = NULL;
} else {
setEncoding_(e);
}
}
/* 802A90F0-802A9130 2A3A30 0040+00 1/1 0/0 0/0 .text
* setEncoding___Q28JMessage18TResourceContainerFUc */
void JMessage::TResourceContainer::setEncoding_(u8 e) {
mEncodingType = e;
pfnParseCharacter_ = JGadget::toValueFromIndex<JMessage::locale::parseCharacter_function>(
e, sapfnParseCharacter_, 5, NULL);
}
/* 802A9130-802A9158 2A3A70 0028+00 0/0 2/2 0/0 .text
* __ct__Q28JMessage6TParseFPQ28JMessage18TResourceContainer */
JMessage::TParse::TParse(JMessage::TResourceContainer* pContainer) {
pContainer_ = pContainer;
pResource_ = NULL;
}
/* 802A9158-802A91B8 2A3A98 0060+00 1/0 0/0 0/0 .text __dt__Q28JMessage6TParseFv */
JMessage::TParse::~TParse() {}
/* 802A91B8-802A92F4 2A3AF8 013C+00 1/0 0/0 0/0 .text
* parseHeader_next__Q28JMessage6TParseFPPCvPUlUl */
// NONMATCHING regalloc, missing clrlwi
bool JMessage::TParse::parseHeader_next(void const** ppData_inout, u32* puBlock_out, u32 param_2) {
const void* pData = *ppData_inout;
data::TParse_THeader header(pData);
*ppData_inout = header.getContent();
*puBlock_out = header.get_blockNumber();
if (memcmp(header.get_signature(), &data::ga4cSignature, sizeof(data::ga4cSignature))) {
return 0;
}
if (header.get_type() != 'bmg1') {
return 0;
}
u8 encoding = header.get_encoding();
if (encoding != 0) {
if (!pContainer_->isEncodingSettable(encoding)) {
return 0;
}
pContainer_->setEncoding(encoding);
}
if (param_2 & 0x10) {
return 1;
}
TResourceContainer::TCResource* resContainer = &pContainer_->resContainer_;
pResource_ = resContainer->Do_create();
if (pResource_ == NULL) {
return param_2 & 0x20;
} else {
resContainer->Push_back(pResource_);
pResource_->setData_header(header.getRaw());
return 1;
}
}
/* 802A92F4-802A9490 2A3C34 019C+00 1/0 0/0 0/0 .text
* parseBlock_next__Q28JMessage6TParseFPPCvPUlUl */
bool JMessage::TParse::parseBlock_next(void const** ppData_inout, u32* puData_out, u32 param_2) {
JUT_ASSERT(401, ppData_inout!=0);
JUT_ASSERT(402, puData_out!=0);
const void* pData = *ppData_inout;
JUT_ASSERT(404, pData!=0);
data::TParse_TBlock sp34(pData);
*ppData_inout = sp34.getNext();
*puData_out = sp34.get_size();
TResourceContainer::TCResource& rcResource = pContainer_->resContainer_;
JUT_ASSERT(412, pResource_==&*--(rcResource.end()));
u32 sp30 = sp34.get_type();
switch (sp30) {
case 'INF1':
pResource_->setData_block_info(pData);
break;
case 'FLI1':
break;
case 'FLW1':
break;
case 'DAT1':
pResource_->setData_block_messageText(pData);
u16 temp_r26 = pResource_->getGroupID();
if (param_2 & 0x80) {
JGadget::TLinkList<JMessage::TResource, 0>::iterator sp2C(rcResource.begin());
JMessage::TResource* sp28;
while ((sp28 = &*sp2C) != pResource_) {
if ((u16)temp_r26 != sp28->getGroupID()) {
++sp2C;
} else {
sp2C = rcResource.Erase_destroy(sp28);
}
}
} else {
#ifdef DEBUG
JMessage::TResource* sp24 = rcResource.Get_groupID(temp_r26);
if (sp24 != pResource_) {
JGadget_outMessage sp148(JGadget_outMessage::warning, __FILE__, 444);
sp148 << "group-ID already exist : " << temp_r26;
}
#endif
}
break;
case 'STR1':
pResource_->setData_block_stringAttribute(pData);
break;
case 'MID1':
pResource_->setData_block_messageID(pData);
break;
default:
#ifdef DEBUG
JGadget_outMessage sp148(JGadget_outMessage::warning, __FILE__, 463);
sp148 << "unknown block : " << sp30;
#endif
if (!(param_2 & 0x40)) {
return 0;
}
break;
}
return 1;
}
/* 802A9490-802A94A8 2A3DD0 0018+00 1/0 0/0 0/0 .text
* parseCharacter_1Byte__Q28JMessage6localeFPPCc */
int JMessage::locale::parseCharacter_1Byte(char const** string) {
u8 parse_char = **string;
*string = *string + 1;
return parse_char;
}
/* 802A94A8-802A94D4 2A3DE8 002C+00 1/0 0/0 0/0 .text
* parseCharacter_2Byte__Q28JMessage6localeFPPCc */
int JMessage::locale::parseCharacter_2Byte(char const** string) {
u8** tmp_str = (u8**)string;
u8 hi = **tmp_str;
*tmp_str = *tmp_str + 1;
u8 lo = **tmp_str;
int parse_char = (hi << 8) | lo;
*tmp_str = *tmp_str + 1;
return parse_char;
}
|