| 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 | * |
|---|
| 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. |
|---|
| 18 | * |
|---|
| 19 | */ |
|---|
| 20 | |
|---|
| 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> |
|---|
| 28 | |
|---|
| 29 | using namespace std; |
|---|
| 30 | |
|---|
| 31 | #include "system/file.h" |
|---|
| 32 | #include "system/file_impl.h" |
|---|
| 33 | |
|---|
| 34 | #include "scn2k.h" |
|---|
| 35 | |
|---|
| 36 | |
|---|
| 37 | #define SCN_DUMP |
|---|
| 38 | |
|---|
| 39 | class CmdD : public Cmd |
|---|
| 40 | { |
|---|
| 41 | public: |
|---|
| 42 | CmdD(const Flags& flags, int system_version) : Cmd(flags, system_version) {} |
|---|
| 43 | //CmdD(const Flags& f) : flags(f) { argc = 0; errorflag = false; cmdstr[0] = 0;} |
|---|
| 44 | bool ClearError() { /*errorflag = false;*/} |
|---|
| 45 | static map<int, struct CmdDescrItem*> cmd_descr; |
|---|
| 46 | const char* CmdDescr(int cmd1, int cmd2, int cmd3, int cmd4); |
|---|
| 47 | }; |
|---|
| 48 | |
|---|
| 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 | } |
|---|
| 87 | |
|---|
| 88 | extern int debug_flag; |
|---|
| 89 | |
|---|
| 90 | int main(int argc, char** argv) { |
|---|
| 91 | /* determine file names */ |
|---|
| 92 | debug_flag = true; |
|---|
| 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) { |
|---|
| 121 | ARCINFO* info = archive.Find(fname, ""); |
|---|
| 122 | if (info == NULL) continue; |
|---|
| 123 | char* data = info->CopyRead(); |
|---|
| 124 | char* d = data; |
|---|
| 125 | char* dend = d + info->Size(); |
|---|
| 126 | /* version ç¢ºèª */ |
|---|
| 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; |
|---|
| 153 | /* æåããæåŸãŸã§ã³ãã³ãååŸ -> åºåãç¹°ãè¿ã */ |
|---|
| 154 | while(dcur<dend) { |
|---|
| 155 | const char* dprev = dcur; |
|---|
| 156 | CmdD cmd(flags, system_version); cmd.ClearError(); |
|---|
| 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 |
|---|
| 213 | DrawGraphics(忝ç»ããïŒ |
|---|
| 214 | 0x23 - cmd 01-21:004b:00[ 1] |
|---|
| 215 | args:V<18>[1],10,kasane. #1 <args:V<18>[17],11> |
|---|
| 216 | |
|---|
| 217 | DrawGraphics(èæ¯ã®ã¿) |
|---|
| 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] |
|---|
| 223 | "çç±" |
|---|
| 224 | 0x23 - cmd 00-03:0078:00[ 1] |
|---|
| 225 | "ãã" |
|---|
| 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 |
|---|
| 232 | ChangeBGM æ°å€åŒæ°ã¯ãã§ãŒãã¢ãŠããã€ã³ã®æéãšæšæž¬ |
|---|
| 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"}, |
|---|
| 268 | // scn2k_cmd.cc; CmdD::GetCmd() |
|---|
| 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 | }; |
|---|
| 476 | map<int, CmdDescrItem*> CmdD::cmd_descr; |
|---|
| 477 | const char* CmdD::CmdDescr(int cmd1, int cmd2, int cmd3, int cmd4) { |
|---|
| 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 | } |
|---|