Mercurial > otakunoraifu
annotate scn2k/scn2kdump.cc @ 66:d112357a0ec1
Fix a bug with savegames introduced with changeset c7bcc0ec2267.
Warning: savegames created since c7bcc0ec2267 are probably corrupted,
you may have to start the game over.
If you chose not to do so, you should replace all occurrences of 'TextWindow' by 'TextImplWindow',
and 'Text Window' by 'TextImpl Window' in your save files.
author | Thibaut Girka <thib@sitedethib.com> |
---|---|
date | Sat, 11 Dec 2010 18:36:20 +0100 |
parents | 4416cfac86ae |
children | 281dcd7217df |
rev | line source |
---|---|
0 | 1 /* |
2 * | |
3 * Copyright (C) 2002- Kazunori Ueno(JAGARL) <jagarl@creator.club.ne.jp> | |
4 * | |
5 * This program is free software; you can redistribute it and/or modify | |
6 * it under the terms of the GNU General Public License as published by | |
7 * the Free Software Foundation; either version 2 of the License, or | |
8 * (at your option) any later version. | |
9 * | |
10 * This program is distributed in the hope that it will be useful, | |
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 * GNU General Public License for more details. | |
14 * | |
27 | 15 * You should have received a copy of the GNU General Public License along |
16 * with this program; if not, write to the Free Software Foundation, Inc., | |
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
0 | 18 * |
19 */ | |
20 | |
52 | 21 #include <stdlib.h> |
22 #include <stdarg.h> | |
23 #include <stdio.h> | |
24 #include <string.h> | |
25 #include <string> | |
26 #include <vector> | |
27 #include <map> | |
0 | 28 |
29 using namespace std; | |
30 | |
52 | 31 #include "system/file.h" |
32 #include "system/file_impl.h" | |
0 | 33 |
29
d229cce98f50
* no more (or, at least, less) duplicate code between scn2kdump and the rest
thib
parents:
27
diff
changeset
|
34 #include "scn2k.h" |
0 | 35 |
36 | |
37 #define SCN_DUMP | |
38 | |
29
d229cce98f50
* no more (or, at least, less) duplicate code between scn2kdump and the rest
thib
parents:
27
diff
changeset
|
39 class CmdD : public Cmd |
d229cce98f50
* no more (or, at least, less) duplicate code between scn2kdump and the rest
thib
parents:
27
diff
changeset
|
40 { |
d229cce98f50
* no more (or, at least, less) duplicate code between scn2kdump and the rest
thib
parents:
27
diff
changeset
|
41 public: |
d229cce98f50
* no more (or, at least, less) duplicate code between scn2kdump and the rest
thib
parents:
27
diff
changeset
|
42 CmdD(const Flags& flags, int system_version) : Cmd(flags, system_version) {} |
d229cce98f50
* no more (or, at least, less) duplicate code between scn2kdump and the rest
thib
parents:
27
diff
changeset
|
43 //CmdD(const Flags& f) : flags(f) { argc = 0; errorflag = false; cmdstr[0] = 0;} |
d229cce98f50
* no more (or, at least, less) duplicate code between scn2kdump and the rest
thib
parents:
27
diff
changeset
|
44 bool ClearError() { /*errorflag = false;*/} |
d229cce98f50
* no more (or, at least, less) duplicate code between scn2kdump and the rest
thib
parents:
27
diff
changeset
|
45 static map<int, struct CmdDescrItem*> cmd_descr; |
d229cce98f50
* no more (or, at least, less) duplicate code between scn2kdump and the rest
thib
parents:
27
diff
changeset
|
46 const char* CmdDescr(int cmd1, int cmd2, int cmd3, int cmd4); |
d229cce98f50
* no more (or, at least, less) duplicate code between scn2kdump and the rest
thib
parents:
27
diff
changeset
|
47 }; |
d229cce98f50
* no more (or, at least, less) duplicate code between scn2kdump and the rest
thib
parents:
27
diff
changeset
|
48 |
0 | 49 int system_version = 0; |
50 bool ruby_flag = false; | |
51 bool ret_flag = false; | |
52 bool text_flag = false; | |
53 bool selection_flag = false; | |
54 | |
55 | |
56 inline int eval(int v1, int op, int v2) { | |
57 switch(op) { | |
58 case 0: return v1+v2; | |
59 case 1: return v1-v2; | |
60 case 2: return v1*v2; | |
61 case 3: return v2!=0 ? v1/v2 : v1; | |
62 case 4: return v2!=0 ? v1%v2 : v1; | |
63 case 5: return v1&v2; | |
64 case 6: return v1|v2; | |
65 case 7: return v1^v2; | |
66 case 8: return v1<<v2; | |
67 case 9: return v1>>v2; | |
68 case 40: return v1 == v2; | |
69 case 41: return v1 != v2; | |
70 case 42: return v1 <= v2; | |
71 case 43: return v1 < v2; | |
72 case 44: return v1 >= v2; | |
73 case 45: return v1 > v2; | |
74 case 60: return v1 && v2; | |
75 case 61: return v1 || v2; | |
76 } | |
77 return v2; | |
78 } | |
79 | |
80 | |
81 void usage(void) { | |
82 fprintf(stderr,"usage : scn2kdump [inputfile] [outputfile]\n"); | |
83 fprintf(stderr," inputfile: seen.txt(default)\n"); | |
84 fprintf(stderr," outputfile: seen.txt_out(default)\n"); | |
85 exit(-1); | |
86 } | |
29
d229cce98f50
* no more (or, at least, less) duplicate code between scn2kdump and the rest
thib
parents:
27
diff
changeset
|
87 |
d229cce98f50
* no more (or, at least, less) duplicate code between scn2kdump and the rest
thib
parents:
27
diff
changeset
|
88 extern int debug_flag; |
d229cce98f50
* no more (or, at least, less) duplicate code between scn2kdump and the rest
thib
parents:
27
diff
changeset
|
89 |
0 | 90 int main(int argc, char** argv) { |
91 /* determine file names */ | |
29
d229cce98f50
* no more (or, at least, less) duplicate code between scn2kdump and the rest
thib
parents:
27
diff
changeset
|
92 debug_flag = true; |
0 | 93 bool verbose = false; |
94 char* inname = "seen.txt"; | |
95 char* outname = 0; | |
96 if (argc > 2 && strcmp(argv[1],"-v") == 0) { | |
97 int i; for (i=1; i<argc; i++) argv[i] = argv[i+1]; | |
98 argc--; | |
99 verbose = true; | |
100 } | |
101 switch(argc) { | |
102 case 1: break; | |
103 case 2: inname = argv[1]; break; | |
104 case 3: inname = argv[1]; outname = argv[2]; break; | |
105 default: usage(); | |
106 } | |
107 /* open output file */ | |
108 FILE* outstream = stdout; | |
109 /* create archive instance */ | |
110 SCN2kFILE archive(inname); | |
111 archive.Init(); | |
112 if (archive.Deal() == 0) { | |
113 fprintf(stderr,"Cannot open / Invalid archive file %s\n",inname); | |
114 usage(); | |
115 } | |
116 /* dump files */ | |
117 archive.InitList(); | |
118 char* fname; | |
119 fprintf(stderr,"Dump start\n"); | |
120 while( (fname = archive.ListItem()) != 0) { | |
52 | 121 ARCINFO* info = archive.Find(fname, ""); |
122 if (info == NULL) continue; | |
0 | 123 char* data = info->CopyRead(); |
124 char* d = data; | |
125 char* dend = d + info->Size(); | |
65
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
126 /* version 確認 */ |
0 | 127 if (read_little_endian_int(d) == 0x1cc) { |
128 system_version = 0; | |
129 } else if (read_little_endian_int(d) == 0x1d0) { | |
130 system_version = 1; | |
131 } else { | |
132 continue; | |
133 } | |
134 if (read_little_endian_int(d+4) == 0x1adb2) ; // little busters! | |
135 else if (read_little_endian_int(d+4) != 0x2712) continue; | |
136 int header_size; | |
137 if (system_version == 0) { | |
138 header_size = 0x1cc + read_little_endian_int(d+0x20) * 4; | |
139 } else { | |
140 header_size = read_little_endian_int(d+0x20); | |
141 } | |
142 d += header_size; | |
143 | |
144 const char* dcur = d; | |
145 const char* dstart = d; | |
146 fprintf(stderr,"Dumping %s\n",fname); | |
147 fprintf(stdout,"Dumping %s\n",fname); | |
148 { int i; for (i=0; i<100; i++) { | |
149 int n = read_little_endian_int(data + 0x34 + i*4); | |
150 if (n != 6) fprintf(stdout,"subroutine table %2d: %6d\n",i,n); | |
151 }} | |
152 Flags flags; | |
65
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
153 /* 最初から最後までコマンド取得 -> 出力を繰り返す */ |
0 | 154 while(dcur<dend) { |
155 const char* dprev = dcur; | |
29
d229cce98f50
* no more (or, at least, less) duplicate code between scn2kdump and the rest
thib
parents:
27
diff
changeset
|
156 CmdD cmd(flags, system_version); cmd.ClearError(); |
0 | 157 |
158 /* end? */ | |
159 if (*dcur == -1) { | |
160 /* 0xff x 32byte + 0x00 : end sign */ | |
161 int i; for (i=0; i<0x20; i++) | |
162 if (dcur[i] != -1) break; | |
163 if (i == 0x20 && dcur[i] == 0) break; | |
164 } | |
165 dprintf("%d : ",dcur-dstart); | |
166 cmd.GetCmd(flags, dcur); | |
167 if (cmd.IsError()) { | |
168 fprintf(outstream, "Error at %6d\n",dprev-dstart); | |
169 while(dcur < dend) { | |
170 if (*dcur == 0x29 && dcur[1] == 0x0a) {dcur++;break;} | |
171 if (*dcur == 0 && dcur[1] == 0x0a) {dcur++;break;} | |
172 if (*dcur == 0 && dcur[1] == 0x23) {dcur++;break;} | |
173 dcur++; | |
174 } | |
175 dprev -= 2*16; | |
176 int ilen = (dcur-dprev+15)/16; | |
177 int i; for (i=0; i<ilen; i++) { | |
178 fprintf(outstream, "%6d: ",dprev-dstart); | |
179 int j; for (j=0; j<16; j++) { | |
180 if (dprev >= dend) break; | |
181 if (dprev < data) continue; | |
182 fprintf(outstream, "%02x ",*(unsigned char*)(dprev)); | |
183 dprev++; | |
184 } | |
185 fprintf(outstream, "\n"); | |
186 } | |
187 } | |
188 } | |
189 delete info; | |
190 } | |
191 return 0; | |
192 } | |
193 | |
194 /* | |
195 SetStr | |
196 0x23 - cmd 01-0a:0000:00[ 2] | |
197 args:V<18>[17],"PB47" | |
198 CatStr | |
199 0x23 - cmd 01-0a:0002:00[ 2] | |
200 args:V<18>[17],V<18>[20] | |
201 | |
202 WaitClick | |
203 0x23 - cmd 00-03:0011:00[ 0] | |
204 | |
205 ChangeFaceGraphics | |
206 0x23 - cmd 00-03:03e8:00[ 1] | |
207 args:V<18>[17] | |
208 DeleteFaceGraphics | |
209 0x23 - cmd 00-03:03e9:01[ 0] | |
210 KoePlay | |
211 0x23 - cmd 01-17:0000:01[ 2] | |
212 args:100000026,5 | |
65
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
213 DrawGraphics(前景画あり) |
0 | 214 0x23 - cmd 01-21:004b:00[ 1] |
215 args:V<18>[1],10,kasane. #1 <args:V<18>[17],11> | |
216 | |
65
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
217 DrawGraphics(背景のみ) |
0 | 218 0x23 - cmd 01-21:0049:00[ 2] |
219 args:V<18>[1],10 | |
220 | |
221 Ruby | |
222 0x23 - cmd 00-03:0078:01[ 0] | |
65
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
223 "理由" |
0 | 224 0x23 - cmd 00-03:0078:00[ 1] |
65
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
225 "わけ" |
0 | 226 SetTitle |
227 0x23 - cmd 01-04:0000:00[ 1] | |
228 args:"Long Long Time Ago..." | |
229 WaitTime | |
230 0x23 - cmd 01-14:0069:00[ 1] | |
231 args:3000 | |
65
4416cfac86ae
Convert EUC-JP files to UTF8
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
232 ChangeBGM 数値引数はフェードアウト、インの時間と推測 |
0 | 233 0x23 - cmd 01-14:0000:02[ 3] |
234 args:"BGM18",700,700 | |
235 */ | |
236 | |
237 struct CmdDescrItem { | |
238 CmdDescrItem* next; | |
239 int cmd4; | |
240 int cmd1; | |
241 int cmd2; | |
242 int cmd3; | |
243 const char* cmd_descr; | |
244 }; | |
245 CmdDescrItem cmd_descr_orig[] = { | |
246 // scn2k_impl.cc; Scn2k::SysExec() | |
247 {0,0,0x00,0x01,0x0a, "local return"}, | |
248 {0,0,0x00,0x01,0x0b, "global jump"}, | |
249 {0,0,0x00,0x01,0x0c, "global call"}, | |
250 {0,0,0x00,0x01,0x0d, "global return"}, | |
251 {0,0,0x00,0x01,0x12, "global call"}, | |
252 {0,0,0x00,0x01,0x13, "global return(?)"}, | |
253 {0,0,0x00,0x04,0x0d, "Menu_return"}, | |
254 {0,0,0x01,0x04,0x00, "SetWindowCaption"}, | |
255 {0,0,0x01,0x04,0x82, "ClearMousePress"}, | |
256 {0,0,0x01,0x04,0x83, "GetMouse(2)"}, | |
257 {0,0,0x01,0x04,0x85, "GetMouse"}, | |
258 {0,0,0x01,0x04,0x4b0,"QuitGame"}, | |
259 {0,0,0x01,0x04,0x58d,"PrevSaveNumber"}, | |
260 {0,0,0x01,0x04,0x585,"SavedDate"}, | |
261 {0,0,0x01,0x04,0xc23,"Save"}, | |
262 {0,0,0x01,0x04,0xc25,"Load"}, | |
263 {0,0,0x01,0x04,0x4b1,"GoMenu"}, | |
264 {0,0,0x01,0x04,0x4b3,"GoMenu_Badend"}, | |
265 {0,0,0x01,0x04,0xcc, "ShowMouseCursor"}, | |
266 {0,0,0x01,0x04,0xcd, "HideMouseCursor"}, | |
267 {0,0,0x01,0x04,0xcf, "SetCursorType"}, | |
29
d229cce98f50
* no more (or, at least, less) duplicate code between scn2kdump and the rest
thib
parents:
27
diff
changeset
|
268 // scn2k_cmd.cc; CmdD::GetCmd() |
0 | 269 {0,0,0x00,0x01,0, "local jump"}, |
270 {0,0,0x00,0x01,1, "local jump-if"}, | |
271 {0,0,0x00,0x01,2, "local jump-unless"}, | |
272 {0,0,0x00,0x01,3, "local jump-switch??"}, | |
273 {0,0,0x00,0x01,4, "local switch"}, | |
274 {0,0,0x00,0x01,5, "local call"}, | |
275 {0,0,0x00,0x01,8, "local switch(simple form)"}, | |
276 {0,0,0x01,0x0b,0, "set multiple variables"}, | |
277 {0,0,0x01,0x0b,1, "set variables in a range"}, | |
278 {0,0,0x01,0x0b,4, "clear variables in a range"}, | |
279 {0,0,0x01,0x0b,0x64, "get summation of variables in a range"}, | |
280 // scn2k_cmd.cc; Flags::Exec() | |
281 {0,0,0x01,0x0a,0, "SetStr"}, | |
282 {0,0,0x01,0x0a,1, "ClearStr"}, | |
283 {0,0,0x01,0x0a,2, "AppendStr"}, | |
284 {0,0,0x01,0x0a,3, "StrLen"}, | |
285 {0,0,0x01,0x0a,4, "StrCmp"}, | |
286 {0,0,0x01,0x0a,5, "SubStrL"}, | |
287 {0,0,0x01,0x0a,6, "SubStrR"}, | |
288 {0,0,0x01,0x0a,7, "StrLenWideChar"}, | |
289 {0,0,0x01,0x0a,8, "TrimStr"}, | |
290 {0,0,0x01,0x0a,0x0f, "IntToStr"}, | |
291 {0,0,0x01,0x0a,0x11, "IntToStr_Fill"}, | |
292 {0,0,0x01,0x0a,0x64, "ShowStr"}, | |
293 // scn2k_text.cc; TextImpl::Exec() | |
294 {0,0,0x01,0x21,0x49, "SetFaceGraphic"}, | |
295 {0,0,0x01,0x21,0x4b, "SetFaceGraphic"}, | |
296 {0,0,0x01,0x21,0x4c, "SetFaceGraphic"}, | |
297 {0,0,0x00,0x03,0x97, "CloseTextWindow"}, | |
298 {0,0,0x00,0x03,0x11, "WaitText"}, | |
299 {0,0,0x00,0x03,0x03, "TextReturn"}, | |
300 {0,0,0x00,0x03,0xc9, "TextReturn"}, | |
301 {0,0,0x00,0x03,0x3e8,"SetFaceGraphic"}, | |
302 {0,0,0x00,0x03,0x3e9,"SetFaceGraphic"}, | |
303 {0,0,0x00,0x03,0x78, "TextRuby"}, | |
304 {0,0,0x00,0x03,0x66, "SetTextWindowType"}, | |
305 {0,0,0x00,0x03,0x67, "OpenTextWindow"}, | |
306 {0,0,0x00,0x03,0x98, "ClearTextWindow"}, | |
307 {0,0,0x00,0x03,0x68, "ShowText"}, | |
308 {0,0,0x00,0x02,0x01, "Select"}, | |
309 {0,0,0x00,0x02,0x03, "Select"}, | |
310 {0,0,0x00,0x04,0x44c,"TextSkipStart"}, | |
311 {0,0,0x00,0x04,0x3e8,"CloseTextWindow"}, | |
312 {0,0,0x01,0x04,0x64, "WaitTime"}, | |
313 {0,0,0x01,0x04,0x6f, "WaitTime"}, | |
314 {0,0,0x01,0x04,0x79, "WaitTime"}, | |
315 {0,0,0x01,0x04,0x65, "WaitTime w/ Cancel"}, | |
316 {0,0,0x01,0x04,0x70, "WaitTime w/ Cancel"}, | |
317 {0,0,0x01,0x04,0x1fe,"GetTimer"}, | |
318 {0,0,0x01,0x04,0x201,"ResetTimer (unsupported; see rldev)"}, | |
319 {0,0,0x01,0x04,0x202,"ResetTimerAll (unsupported; see rldev)"}, | |
320 {0,0,0x01,0x04,0x72, "GetTimer"}, | |
321 {0,0,0x01,0x04,0x7c, "GetTimer(2)"}, | |
322 {0,0,0x01,0x04,0x6e, "ClearTimer"}, | |
323 {0,0,0x01,0x04,0x78, "ClearTimer(2)"}, | |
324 {0,0,0x01,0x04,0x26c,"ClearTimer(multi)"}, | |
325 {0,0,0x01,0x04,0x270,"ClearTimer(multi)"}, | |
326 {0,0,0x01,0x04,0x276,"GetTimer(multi)"}, | |
327 {0,0,0x01,0x04,0x1f4,"SetTimer"}, | |
328 {0,0,0x01,0x04,0x3e8,"rand(x,y)"}, | |
329 {0,0,0x01,0x04,0x3ec,"min(x,y)"}, | |
330 {0,0,0x01,0x04,0x3ef,"min(x,y)"}, | |
331 {0,0,0x01,0x04,0x320,"range conversion(V,?,ResultMin,ValMin,ValMax,ResultMax,?)"}, | |
332 {0,0,0x01,0x04,0x3f1,"in_range(x,y,a)"}, | |
333 {0,0,0x01,0x04,0x16c,"SetCursorType?"}, | |
334 {0,0,0x01,0x04,0xbc1,"LoadFromMenu"}, | |
335 {0,0,0x01,0x04,0x8d4,"SetTextWindowColor"}, | |
336 {0,0,0x01,0x04,0x8d5,"SetTextWindowColor"}, | |
337 {0,0,0x01,0x04,0x8d6,"SetTextWindowColor"}, | |
338 {0,0,0x01,0x04,0x8d7,"SetTextWindowColor"}, | |
339 {0,0,0x01,0x04,0x8d8,"SetTextWindowColor"}, | |
340 {0,0,0x01,0x04,0x8db,"SetTextWindowColor"}, | |
341 {0,0,0x01,0x04,0x93f,"SetTextWindowColor"}, | |
342 {0,0,0x01,0x04,0xa39,"SetTextWindowColor"}, | |
343 {0,0,0x01,0x04,0xa28,"Get #INIT_MESSAGE_SPEED (original) from gameexe.ini"}, | |
344 {0,0,0x01,0x04,0xa29,"Get #INIT_MESSAGE_SPEED (original) from gameexe.ini"}, | |
345 {0,0,0x01,0x04,0xa2c,"Get #MESSAGE_KEY_WAIT_USE (original) from gameexe.ini"}, | |
346 {0,0,0x01,0x04,0xa2d,"Get #INIT_MESSAGE_SPEED (original) from gameexe.ini"}, | |
347 {0,0,0x01,0x04,0xa2e,"Get #MESSAGE_KEY_WAIT_TIME (original) from gameexe.ini"}, | |
348 {0,0,0x01,0x04,0x913,"Get #INIT_MESSAGE_SPEED"}, | |
349 {0,0,0x01,0x04,0x914,"Get #INIT_MESSAGE_SPEED_MOD"}, | |
350 {0,0,0x01,0x04,0x92e,"Get #MESSAGE_KEY_WAIT_USE"}, | |
351 {0,0,0x01,0x04,0x92f,"Get #INIT_MESSAGE_SPEED_MOD"}, | |
352 {0,0,0x01,0x04,0x930,"Get #MESSAGE_KEY_WAIT_TIME"}, | |
353 {0,0,0x01,0x04,0x8af,"Set #INIT_MESSAGE_SPEED"}, | |
354 {0,0,0x01,0x04,0x8b0,"Set #INIT_MESSAGE_SPEED_MOD"}, | |
355 {0,0,0x01,0x04,0x8ca,"Set #MESSAGE_KEY_WAIT_USE"}, | |
356 {0,0,0x01,0x04,0x8cb,"Set #INIT_MESSAGE_SPEED_MOD"}, | |
357 {0,0,0x01,0x04,0x8cc,"Set #MESSAGE_KEY_WAIT_USE"}, | |
358 {0,0,0x01,0x04,0x51f,"Set Name Text"}, | |
359 {0,0,0x01,0x04,0x51e,"Get Name Text"}, | |
360 {0,0,0x01,0x04,0x514,"Get Name Text"}, | |
361 // scn2k_grp.cc; GrpImpl::Exec() | |
362 // music commands | |
363 {0,0,0x01,0x14,0, "PlayBGM"}, | |
364 {0,0,0x01,0x14,2, "PlayBGM"}, | |
365 {0,0,0x01,0x14,0x05, "StopBGM"}, | |
366 {0,0,0x01,0x14,0x69, "FadeBGM"}, | |
367 {0,0,0x01,0x15,0, "PlaySE"}, | |
368 {0,0,0x01,0x15,2, "PlaySE"}, | |
369 {0,0,0x01,0x17,0, "PlayKoe"}, | |
370 {0,0,0x01,0x1a,1, "PlayMovie"}, | |
371 {0,0,0x01,0x1a,0x14, "PlayMovie"}, | |
372 // graphic commands | |
373 {0,0,0x01,0x1e,0, "GraphicStackClear"}, | |
374 {0,0,0x01,0x1f,0, "GraphicStackClear"}, | |
375 {0,0,0x01,0x21,0x46, "LoadSurface"}, | |
376 {0,0,0x01,0x21,0x49, "LoadBackSurface"}, | |
377 {0,0,0x01,0x21,0x4b, "LoadForeSurface"}, | |
378 {0,0,0x01,0x21,0x4c, "LoadSurface"}, | |
379 {0,0,0x01,0x21,0x64, "CopySurface"}, | |
380 {0,0,0x01,0x21,0x4b1,"ClearSurface"}, | |
381 {0,0,0x01,0x21,0x44c,"AlphaCopy"}, | |
382 {0,0,0x01,0x21,0x640,"SaturateCopy"}, | |
383 {0,0,0x01,0x21,0x196,"??? grp"}, | |
384 {0,0,0x01,0x22,0xc30,"ScrollEffect (Princess Bride)"}, | |
385 {0,0,0x01,0x22,0xc1c,"FallEffect (Princess Bride)"}, | |
386 {0,0,0x01,0x22,0x835,"FallEffect (Princess Bride)"}, | |
387 // grphic object commands | |
388 {0,0,0x01,0x04,0xd2, "??? grp"}, | |
389 {0,0,0x01,0x04,0xd3, "??? grp"}, | |
390 {0,0,0x01,0x04,0xd7, "??? grp"}, | |
391 {0,0,0x01,0x04,0xd8, "??? grp"}, | |
392 {0,0,0x01,0x04,0x5e0,"GetShownGrpFlag"}, | |
393 {0,0,0x01,0x3d,0x0a, "ClearGrpObj"}, | |
394 {0,0,0x01,0x3d,0x0b, "ClearGrpObj"}, | |
395 {0,0,0x01,0x3e,0x0a, "ClearGrpObj"}, | |
396 {0,0,0x01,0x3e,0x0a, "ClearGrpObj"}, | |
397 {0,0,0x01,0x3c,0x01, "??? grp (CLANNAD)"}, | |
398 {0,0,0x01,0x47,0x3e8,"SetGrpObj_Fname"}, | |
399 {0,0,0x01,0x47,0x3eb,"SetGrpObj_GANname"}, | |
400 {0,0,0x01,0x47,0x4b0,"SetGrpObj_Text"}, | |
401 {0,0,0x01,0x48,0x3e8,"SetGrpObj_ForeGrp?"}, | |
402 {0,0,0x01,0x49,0, "StopAnimation"}, | |
403 {0,0,0x01,0x49,3, "QueryExecAnimation"}, | |
404 {0,0,0x01,0x49,0x7d3,"SetGrpObj_GAN?"}, | |
405 {0,0,0x01,0x49,0xbb9,"StartAnimation"}, | |
406 {0,0,0x01,0x49,0xbbb,"StartAnimation"}, | |
407 {0,0,0x01,0x49,0xbbd,"StartAnimation"}, | |
408 {0,0,0x01,0x51,0x3e8,"SetGrpObj_xy"}, | |
409 {0,0,0x01,0x51,0x3e9,"SetGrpObj_x"}, | |
410 {0,0,0x01,0x51,0x3ea,"SetGrpObj_y"}, | |
411 {0,0,0x01,0x51,0x3eb,"SetGrpObj_alpha"}, | |
412 {0,0,0x01,0x51,0x3ec,"SetGrpObj_visible"}, | |
413 {0,0,0x01,0x51,0x3ee,"SetGrpObj_xy?"}, | |
414 {0,0,0x01,0x51,0x3fd,"SetGrpObj_centering?"}, | |
415 {0,0,0x01,0x51,0x401,"SetGrpObj_textsize"}, | |
416 {0,0,0x01,0x51,0x40a,"SetGrpObj_clipregion"}, | |
417 {0,0,0x01,0x51,0x40f,"SetGrpObj_surfacenum"}, | |
418 {0,0,0x01,0x51,0x416,"SetGrpObj_expand"}, | |
419 {0,0,0x01,0x51,0x419,"SetGrpObj_rotate"}, | |
420 {0,0,0x01,0x52,0x3e8,"SetGrpObj_xy(2)"}, | |
421 {0,0,0x01,0x52,0x3ea,"SetGrpObj_y(2)"}, | |
422 {0,0,0x01,0x52,0x3eb,"SetGrpObj_alpha(2)"}, | |
423 {0,0,0x01,0x52,0x3ec,"SetGrpObj_visible(2)"}, | |
424 {0,0,0x01,0x52,0x3ee,"SetGrpObj_xy?(2)"}, | |
425 {0,0,0x01,0x52,0x3fd,"SetGrpObj_centering?(2)"}, | |
426 {0,0,0x01,0x52,0x401,"SetGrpObj_textsize(2)"}, | |
427 {0,0,0x01,0x52,0x408,"SetGrpObj_order (not supported)"}, | |
428 {0,0,0x01,0x52,0x40a,"SetGrpObj_clipregion(2)"}, | |
429 {0,0,0x01,0x52,0x40f,"SetGrpObj_surfacenum(2)"}, | |
430 {0,0,0x01,0x52,0x416,"SetGrpObj_expand(2)"}, | |
431 {0,0,0x01,0x52,0x419,"SetGrpObj_rotate(2)"}, | |
432 {0,0,0x01,0x54,0x3e8,"GetGrpObj_xy"}, | |
433 {0,0,0x01,0x54,0x44c,"GetGrpObj_wh"}, | |
434 | |
435 {0,0,0x02,0x3d,0x0a, "ClearGrpObj(2)"}, | |
436 {0,0,0x02,0x3d,0x0b, "ClearGrpObj(2)"}, | |
437 {0,0,0x02,0x3e,0x0a, "ClearGrpObj(2)"}, | |
438 {0,0,0x02,0x3e,0x0a, "ClearGrpObj(2)"}, | |
439 {0,0,0x02,0x3c,0x01, "??? grp (CLANNAD)(2)"}, | |
440 {0,0,0x02,0x47,0x3e8,"SetGrpObj_Fname(2)"}, | |
441 {0,0,0x02,0x47,0x3eb,"SetGrpObj_GANname(2)"}, | |
442 {0,0,0x02,0x47,0x4b0,"SetGrpObj_Text(2)"}, | |
443 {0,0,0x02,0x48,0x3e8,"SetGrpObj_ForeGrp?(2)"}, | |
444 {0,0,0x02,0x49,0, "StopAnimation(2)"}, | |
445 {0,0,0x02,0x49,3, "QueryExecAnimation(2)"}, | |
446 {0,0,0x02,0x49,0x7d3,"SetGrpObj_GAN?(2)"}, | |
447 {0,0,0x02,0x49,0xbb9,"StartAnimation(2)"}, | |
448 {0,0,0x02,0x49,0xbbb,"StartAnimation(2)"}, | |
449 {0,0,0x02,0x49,0xbbd,"StartAnimation(2)"}, | |
450 {0,0,0x02,0x51,0x3e8,"SetGrpObj_xy(2)"}, | |
451 {0,0,0x02,0x51,0x3ea,"SetGrpObj_y(2)"}, | |
452 {0,0,0x02,0x51,0x3eb,"SetGrpObj_alpha(2)"}, | |
453 {0,0,0x02,0x51,0x3ec,"SetGrpObj_visible(2)"}, | |
454 {0,0,0x02,0x51,0x3ee,"SetGrpObj_xy?(2)"}, | |
455 {0,0,0x02,0x51,0x3fd,"SetGrpObj_centering?(2)"}, | |
456 {0,0,0x02,0x51,0x401,"SetGrpObj_textsize(2)"}, | |
457 {0,0,0x02,0x51,0x40a,"SetGrpObj_clipregion(2)"}, | |
458 {0,0,0x02,0x51,0x40f,"SetGrpObj_surfacenum(2)"}, | |
459 {0,0,0x02,0x51,0x416,"SetGrpObj_expand(2)"}, | |
460 {0,0,0x02,0x51,0x419,"SetGrpObj_rotate(2)"}, | |
461 {0,0,0x02,0x52,0x3e8,"SetGrpObj_xy(2)(2)"}, | |
462 {0,0,0x02,0x52,0x3ea,"SetGrpObj_y(2)(2)"}, | |
463 {0,0,0x02,0x52,0x3eb,"SetGrpObj_alpha(2)(2)"}, | |
464 {0,0,0x02,0x52,0x3ec,"SetGrpObj_visible(2)(2)"}, | |
465 {0,0,0x02,0x52,0x3ee,"SetGrpObj_xy?(2)(2)"}, | |
466 {0,0,0x02,0x52,0x3fd,"SetGrpObj_centering?(2)(2)"}, | |
467 {0,0,0x02,0x52,0x401,"SetGrpObj_textsize(2)(2)"}, | |
468 {0,0,0x02,0x52,0x40a,"SetGrpObj_clipregion(2)(2)"}, | |
469 {0,0,0x02,0x52,0x40f,"SetGrpObj_surfacenum(2)(2)"}, | |
470 {0,0,0x02,0x52,0x416,"SetGrpObj_expand(2)(2)"}, | |
471 {0,0,0x02,0x52,0x419,"SetGrpObj_rotate(2)(2)"}, | |
472 {0,0,0x02,0x54,0x3e8,"GetGrpObj_xy(2)"}, | |
473 {0,0,0x02,0x54,0x44c,"GetGrpObj_wh(2)"}, | |
474 {0,0,0,0,0,0} | |
475 }; | |
29
d229cce98f50
* no more (or, at least, less) duplicate code between scn2kdump and the rest
thib
parents:
27
diff
changeset
|
476 map<int, CmdDescrItem*> CmdD::cmd_descr; |
d229cce98f50
* no more (or, at least, less) duplicate code between scn2kdump and the rest
thib
parents:
27
diff
changeset
|
477 const char* CmdD::CmdDescr(int cmd1, int cmd2, int cmd3, int cmd4) { |
0 | 478 if (cmd_descr.empty()) { |
479 int i; | |
480 for (i=0; cmd_descr_orig[i].cmd_descr != 0; i++) { | |
481 CmdDescrItem& cur = cmd_descr_orig[i]; | |
482 int item_num = cur.cmd1*1000000+cur.cmd2*10000+cur.cmd3; | |
483 map<int,CmdDescrItem*>::iterator it = cmd_descr.find(item_num); | |
484 if (it == cmd_descr.end()) cmd_descr[item_num] = &cur; | |
485 else { | |
486 cur.next = it->second; | |
487 it->second = &cur; | |
488 } | |
489 } | |
490 } | |
491 int item_num = cmd1*1000000+cmd2*10000+cmd3; | |
492 map<int,CmdDescrItem*>::iterator it = cmd_descr.find(item_num); | |
493 if (it == cmd_descr.end()) return "No descr (unsupported)"; | |
494 CmdDescrItem* cur = it->second; | |
495 do { | |
496 if (cur->cmd1 == cmd1 && cur->cmd2 == cmd2 && cur->cmd3 == cmd3) { | |
497 return cur->cmd_descr; | |
498 } | |
499 cur = cur->next; | |
500 } while(cur != 0); | |
501 return "No descr (unsupported)"; | |
502 } |