1 /* ScummVM Tools
2 *
3 * ScummVM Tools is the legal property of its developers, whose
4 * names are too numerous to list here. Please refer to the
5 * COPYRIGHT file distributed with this source distribution.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 */
21
22 /* GobEngine Script disassembler */
23
24 #include "degob_script.h"
25 #include "common/util.h"
26
27 #define OPCODET(x) _OPCODET(Script_LittleRed, x)
28 #define OPCODEF(x) _OPCODEF(Script_LittleRed, x)
29 #define OPCODEB(x) _OPCODEB(Script_LittleRed, x)
30
31 const int Script_LittleRed::_goblinFuncLookUp[][2] = {
32 {1, 0},
33 {2, 1},
34 {500, 2},
35 {501, 3}
36 };
37
Script_LittleRed(byte * totData,uint32 totSize,ExtTable * extTable)38 Script_LittleRed::Script_LittleRed(byte *totData, uint32 totSize, ExtTable *extTable) :
39 Script_v2(totData, totSize, extTable) {
40
41 setupOpcodes();
42 }
43
~Script_LittleRed()44 Script_LittleRed::~Script_LittleRed() {
45 }
46
setupOpcodes()47 void Script_LittleRed::setupOpcodes() {
48 static const OpcodeDrawEntryLittleRed opcodesDraw[256] = {
49
50 /* 00 */
51 {OPCODEF(o2_loadMult), {PARAM_NONE}},
52 {OPCODEF(o2_playMult), {PARAM_NONE}},
53 {OPCODET(o2_freeMultKeys), {PARAM_UINT16}},
54 {OPCODET(oLittleRed_setWinSize), {PARAM_UINT16, PARAM_UINT16, PARAM_VARINDEX, PARAM_VARINDEX, PARAM_VARINDEX, PARAM_VARINDEX, PARAM_VARINDEX, PARAM_VARINDEX, PARAM_VARINDEX}},
55 /* 04 */
56 {OPCODET(oLittleRed_closeWin), {PARAM_EXPR}},
57 {OPCODET(oLittleRed_activeWin), {PARAM_EXPR}},
58 {OPCODET(oLittleRed_openWin), {PARAM_EXPR, PARAM_VARINDEX}},
59 {OPCODET(o1_initCursor), {PARAM_VARINDEX, PARAM_VARINDEX, PARAM_INT16, PARAM_INT16, PARAM_INT16}},
60 /* 08 */
61 {OPCODET(o1_initCursorAnim), {PARAM_EXPR, PARAM_INT16, PARAM_INT16, PARAM_INT16}},
62 {OPCODET(o1_clearCursorAnim), {PARAM_EXPR}},
63 {OPCODET(oLittleRed_setRenderFlags), {PARAM_EXPR}},
64 {OPCODET(oLittleRed_setWinFlags), {PARAM_EXPR}},
65 /* 0C */
66 {TYPE_NONE, 0, 0, {PARAM_NONE}},
67 {TYPE_NONE, 0, 0, {PARAM_NONE}},
68 {TYPE_NONE, 0, 0, {PARAM_NONE}},
69 {TYPE_NONE, 0, 0, {PARAM_NONE}},
70 /* 10 */
71 {OPCODEF(o1_loadAnim), {PARAM_NONE}},
72 {OPCODET(o1_freeAnim), {PARAM_EXPR}},
73 {OPCODET(o1_updateAnim), {PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_UINT16}},
74 {OPCODET(o2_multSub), {PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
75 /* 14 */
76 {OPCODET(o2_initMult), {PARAM_INT16, PARAM_INT16, PARAM_INT16, PARAM_INT16, PARAM_INT16, PARAM_VARINDEX, PARAM_VARINDEX, PARAM_VARINDEX}},
77 {OPCODET(o1_freeMult), {PARAM_NONE}},
78 {OPCODET(o1_animate), {PARAM_NONE}},
79 {OPCODEF(o2_loadMultObject), {PARAM_NONE}},
80 /* 18 */
81 {OPCODET(o1_getAnimLayerInfo), {PARAM_EXPR, PARAM_EXPR, PARAM_VARINDEX, PARAM_VARINDEX, PARAM_VARINDEX, PARAM_VARINDEX}},
82 {OPCODET(o1_getObjAnimSize), {PARAM_EXPR, PARAM_VARINDEX, PARAM_VARINDEX, PARAM_VARINDEX, PARAM_VARINDEX}},
83 {OPCODEF(o1_loadStatic), {PARAM_NONE}},
84 {OPCODET(o1_freeStatic), {PARAM_EXPR}},
85 /* 1C */
86 {OPCODET(o2_renderStatic), {PARAM_EXPR, PARAM_EXPR}},
87 {OPCODET(o2_loadCurLayer), {PARAM_EXPR, PARAM_EXPR}},
88 {TYPE_NONE, 0, 0, {PARAM_NONE}},
89 {TYPE_NONE, 0, 0, {PARAM_NONE}},
90 /* 20 */
91 {OPCODET(o2_playCDTrack), {PARAM_EXPR}},
92 {OPCODET(o2_waitCDTrackEnd), {PARAM_NONE}},
93 {OPCODET(o2_stopCD), {PARAM_NONE}},
94 {OPCODET(o2_readLIC), {PARAM_EXPR}},
95 /* 24 */
96 {OPCODET(o2_freeLIC), {PARAM_NONE}},
97 {OPCODET(o2_getCDTrackPos), {PARAM_VARINDEX, PARAM_VARINDEX}},
98 {TYPE_NONE, 0, 0, {PARAM_NONE}},
99 {TYPE_NONE, 0, 0, {PARAM_NONE}},
100 /* 28 */
101 {TYPE_NONE, 0, 0, {PARAM_NONE}},
102 {TYPE_NONE, 0, 0, {PARAM_NONE}},
103 {TYPE_NONE, 0, 0, {PARAM_NONE}},
104 {TYPE_NONE, 0, 0, {PARAM_NONE}},
105 /* 2C */
106 {TYPE_NONE, 0, 0, {PARAM_NONE}},
107 {TYPE_NONE, 0, 0, {PARAM_NONE}},
108 {TYPE_NONE, 0, 0, {PARAM_NONE}},
109 {TYPE_NONE, 0, 0, {PARAM_NONE}},
110 /* 30 */
111 {OPCODET(o2_loadFontToSprite), {PARAM_INT16, PARAM_INT16, PARAM_INT16, PARAM_INT16, PARAM_INT16}},
112 {OPCODET(o1_freeFontToSprite), {PARAM_INT16}},
113 {TYPE_NONE, 0, 0, {PARAM_NONE}},
114 {TYPE_NONE, 0, 0, {PARAM_NONE}},
115 /* 34 */
116 {TYPE_NONE, 0, 0, {PARAM_NONE}},
117 {TYPE_NONE, 0, 0, {PARAM_NONE}},
118 {TYPE_NONE, 0, 0, {PARAM_NONE}},
119 {TYPE_NONE, 0, 0, {PARAM_NONE}},
120 /* 38 */
121 {TYPE_NONE, 0, 0, {PARAM_NONE}},
122 {TYPE_NONE, 0, 0, {PARAM_NONE}},
123 {TYPE_NONE, 0, 0, {PARAM_NONE}},
124 {TYPE_NONE, 0, 0, {PARAM_NONE}},
125 /* 3C */
126 {TYPE_NONE, 0, 0, {PARAM_NONE}},
127 {TYPE_NONE, 0, 0, {PARAM_NONE}},
128 {TYPE_NONE, 0, 0, {PARAM_NONE}},
129 {TYPE_NONE, 0, 0, {PARAM_NONE}},
130 /* 40 */
131 {OPCODEF(o2_totSub), {PARAM_NONE}},
132 {OPCODET(o2_switchTotSub), {PARAM_UINT16, PARAM_UINT16}},
133 {OPCODEF(o2_pushVars), {PARAM_NONE}},
134 {OPCODEF(o2_popVars), {PARAM_NONE}},
135 /* 44 */
136 {TYPE_NONE, 0, 0, {PARAM_NONE}},
137 {TYPE_NONE, 0, 0, {PARAM_NONE}},
138 {TYPE_NONE, 0, 0, {PARAM_NONE}},
139 {TYPE_NONE, 0, 0, {PARAM_NONE}},
140 /* 48 */
141 {TYPE_NONE, 0, 0, {PARAM_NONE}},
142 {TYPE_NONE, 0, 0, {PARAM_NONE}},
143 {TYPE_NONE, 0, 0, {PARAM_NONE}},
144 {TYPE_NONE, 0, 0, {PARAM_NONE}},
145 /* 4C */
146 {TYPE_NONE, 0, 0, {PARAM_NONE}},
147 {TYPE_NONE, 0, 0, {PARAM_NONE}},
148 {TYPE_NONE, 0, 0, {PARAM_NONE}},
149 {TYPE_NONE, 0, 0, {PARAM_NONE}},
150 /* 50 */
151 {TYPE_NONE, 0, 0, {PARAM_NONE}},
152 {TYPE_NONE, 0, 0, {PARAM_NONE}},
153 {TYPE_NONE, 0, 0, {PARAM_NONE}},
154 {TYPE_NONE, 0, 0, {PARAM_NONE}},
155 /* 54 */
156 {TYPE_NONE, 0, 0, {PARAM_NONE}},
157 {TYPE_NONE, 0, 0, {PARAM_NONE}},
158 {TYPE_NONE, 0, 0, {PARAM_NONE}},
159 {TYPE_NONE, 0, 0, {PARAM_NONE}},
160 /* 58 */
161 {TYPE_NONE, 0, 0, {PARAM_NONE}},
162 {TYPE_NONE, 0, 0, {PARAM_NONE}},
163 {TYPE_NONE, 0, 0, {PARAM_NONE}},
164 {TYPE_NONE, 0, 0, {PARAM_NONE}},
165 /* 5C */
166 {TYPE_NONE, 0, 0, {PARAM_NONE}},
167 {TYPE_NONE, 0, 0, {PARAM_NONE}},
168 {TYPE_NONE, 0, 0, {PARAM_NONE}},
169 {TYPE_NONE, 0, 0, {PARAM_NONE}},
170 /* 60 */
171 {TYPE_NONE, 0, 0, {PARAM_NONE}},
172 {TYPE_NONE, 0, 0, {PARAM_NONE}},
173 {TYPE_NONE, 0, 0, {PARAM_NONE}},
174 {TYPE_NONE, 0, 0, {PARAM_NONE}},
175 /* 64 */
176 {TYPE_NONE, 0, 0, {PARAM_NONE}},
177 {TYPE_NONE, 0, 0, {PARAM_NONE}},
178 {TYPE_NONE, 0, 0, {PARAM_NONE}},
179 {TYPE_NONE, 0, 0, {PARAM_NONE}},
180 /* 68 */
181 {TYPE_NONE, 0, 0, {PARAM_NONE}},
182 {TYPE_NONE, 0, 0, {PARAM_NONE}},
183 {TYPE_NONE, 0, 0, {PARAM_NONE}},
184 {TYPE_NONE, 0, 0, {PARAM_NONE}},
185 /* 6C */
186 {TYPE_NONE, 0, 0, {PARAM_NONE}},
187 {TYPE_NONE, 0, 0, {PARAM_NONE}},
188 {TYPE_NONE, 0, 0, {PARAM_NONE}},
189 {TYPE_NONE, 0, 0, {PARAM_NONE}},
190 /* 70 */
191 {TYPE_NONE, 0, 0, {PARAM_NONE}},
192 {TYPE_NONE, 0, 0, {PARAM_NONE}},
193 {TYPE_NONE, 0, 0, {PARAM_NONE}},
194 {TYPE_NONE, 0, 0, {PARAM_NONE}},
195 /* 74 */
196 {TYPE_NONE, 0, 0, {PARAM_NONE}},
197 {TYPE_NONE, 0, 0, {PARAM_NONE}},
198 {TYPE_NONE, 0, 0, {PARAM_NONE}},
199 {TYPE_NONE, 0, 0, {PARAM_NONE}},
200 /* 78 */
201 {TYPE_NONE, 0, 0, {PARAM_NONE}},
202 {TYPE_NONE, 0, 0, {PARAM_NONE}},
203 {TYPE_NONE, 0, 0, {PARAM_NONE}},
204 {TYPE_NONE, 0, 0, {PARAM_NONE}},
205 /* 7C */
206 {TYPE_NONE, 0, 0, {PARAM_NONE}},
207 {TYPE_NONE, 0, 0, {PARAM_NONE}},
208 {TYPE_NONE, 0, 0, {PARAM_NONE}},
209 {TYPE_NONE, 0, 0, {PARAM_NONE}},
210 /* 80 */
211 {TYPE_NONE, 0, 0, {PARAM_NONE}},
212 {TYPE_NONE, 0, 0, {PARAM_NONE}},
213 {TYPE_NONE, 0, 0, {PARAM_NONE}},
214 {TYPE_NONE, 0, 0, {PARAM_NONE}},
215 /* 84 */
216 {TYPE_NONE, 0, 0, {PARAM_NONE}},
217 {TYPE_NONE, 0, 0, {PARAM_NONE}},
218 {TYPE_NONE, 0, 0, {PARAM_NONE}},
219 {TYPE_NONE, 0, 0, {PARAM_NONE}},
220 /* 88 */
221 {TYPE_NONE, 0, 0, {PARAM_NONE}},
222 {TYPE_NONE, 0, 0, {PARAM_NONE}},
223 {TYPE_NONE, 0, 0, {PARAM_NONE}},
224 {TYPE_NONE, 0, 0, {PARAM_NONE}},
225 /* 8C */
226 {TYPE_NONE, 0, 0, {PARAM_NONE}},
227 {TYPE_NONE, 0, 0, {PARAM_NONE}},
228 {TYPE_NONE, 0, 0, {PARAM_NONE}},
229 {TYPE_NONE, 0, 0, {PARAM_NONE}},
230 /* 90 */
231 {TYPE_NONE, 0, 0, {PARAM_NONE}},
232 {TYPE_NONE, 0, 0, {PARAM_NONE}},
233 {TYPE_NONE, 0, 0, {PARAM_NONE}},
234 {TYPE_NONE, 0, 0, {PARAM_NONE}},
235 /* 94 */
236 {TYPE_NONE, 0, 0, {PARAM_NONE}},
237 {TYPE_NONE, 0, 0, {PARAM_NONE}},
238 {TYPE_NONE, 0, 0, {PARAM_NONE}},
239 {TYPE_NONE, 0, 0, {PARAM_NONE}},
240 /* 98 */
241 {TYPE_NONE, 0, 0, {PARAM_NONE}},
242 {TYPE_NONE, 0, 0, {PARAM_NONE}},
243 {TYPE_NONE, 0, 0, {PARAM_NONE}},
244 {TYPE_NONE, 0, 0, {PARAM_NONE}},
245 /* 9C */
246 {TYPE_NONE, 0, 0, {PARAM_NONE}},
247 {TYPE_NONE, 0, 0, {PARAM_NONE}},
248 {TYPE_NONE, 0, 0, {PARAM_NONE}},
249 {TYPE_NONE, 0, 0, {PARAM_NONE}},
250 /* A0 */
251 {TYPE_NONE, 0, 0, {PARAM_NONE}},
252 {TYPE_NONE, 0, 0, {PARAM_NONE}},
253 {TYPE_NONE, 0, 0, {PARAM_NONE}},
254 {TYPE_NONE, 0, 0, {PARAM_NONE}},
255 /* A4 */
256 {TYPE_NONE, 0, 0, {PARAM_NONE}},
257 {TYPE_NONE, 0, 0, {PARAM_NONE}},
258 {TYPE_NONE, 0, 0, {PARAM_NONE}},
259 {TYPE_NONE, 0, 0, {PARAM_NONE}},
260 /* A8 */
261 {TYPE_NONE, 0, 0, {PARAM_NONE}},
262 {TYPE_NONE, 0, 0, {PARAM_NONE}},
263 {TYPE_NONE, 0, 0, {PARAM_NONE}},
264 {TYPE_NONE, 0, 0, {PARAM_NONE}},
265 /* AC */
266 {TYPE_NONE, 0, 0, {PARAM_NONE}},
267 {TYPE_NONE, 0, 0, {PARAM_NONE}},
268 {TYPE_NONE, 0, 0, {PARAM_NONE}},
269 {TYPE_NONE, 0, 0, {PARAM_NONE}},
270 /* B0 */
271 {TYPE_NONE, 0, 0, {PARAM_NONE}},
272 {TYPE_NONE, 0, 0, {PARAM_NONE}},
273 {TYPE_NONE, 0, 0, {PARAM_NONE}},
274 {TYPE_NONE, 0, 0, {PARAM_NONE}},
275 /* B4 */
276 {TYPE_NONE, 0, 0, {PARAM_NONE}},
277 {TYPE_NONE, 0, 0, {PARAM_NONE}},
278 {TYPE_NONE, 0, 0, {PARAM_NONE}},
279 {TYPE_NONE, 0, 0, {PARAM_NONE}},
280 /* B8 */
281 {TYPE_NONE, 0, 0, {PARAM_NONE}},
282 {TYPE_NONE, 0, 0, {PARAM_NONE}},
283 {TYPE_NONE, 0, 0, {PARAM_NONE}},
284 {TYPE_NONE, 0, 0, {PARAM_NONE}},
285 /* BC */
286 {TYPE_NONE, 0, 0, {PARAM_NONE}},
287 {TYPE_NONE, 0, 0, {PARAM_NONE}},
288 {TYPE_NONE, 0, 0, {PARAM_NONE}},
289 {TYPE_NONE, 0, 0, {PARAM_NONE}},
290 /* C0 */
291 {TYPE_NONE, 0, 0, {PARAM_NONE}},
292 {TYPE_NONE, 0, 0, {PARAM_NONE}},
293 {TYPE_NONE, 0, 0, {PARAM_NONE}},
294 {TYPE_NONE, 0, 0, {PARAM_NONE}},
295 /* C4 */
296 {TYPE_NONE, 0, 0, {PARAM_NONE}},
297 {TYPE_NONE, 0, 0, {PARAM_NONE}},
298 {TYPE_NONE, 0, 0, {PARAM_NONE}},
299 {TYPE_NONE, 0, 0, {PARAM_NONE}},
300 /* C8 */
301 {TYPE_NONE, 0, 0, {PARAM_NONE}},
302 {TYPE_NONE, 0, 0, {PARAM_NONE}},
303 {TYPE_NONE, 0, 0, {PARAM_NONE}},
304 {TYPE_NONE, 0, 0, {PARAM_NONE}},
305 /* CC */
306 {TYPE_NONE, 0, 0, {PARAM_NONE}},
307 {TYPE_NONE, 0, 0, {PARAM_NONE}},
308 {TYPE_NONE, 0, 0, {PARAM_NONE}},
309 {TYPE_NONE, 0, 0, {PARAM_NONE}},
310 /* D0 */
311 {TYPE_NONE, 0, 0, {PARAM_NONE}},
312 {TYPE_NONE, 0, 0, {PARAM_NONE}},
313 {TYPE_NONE, 0, 0, {PARAM_NONE}},
314 {TYPE_NONE, 0, 0, {PARAM_NONE}},
315 /* D4 */
316 {TYPE_NONE, 0, 0, {PARAM_NONE}},
317 {TYPE_NONE, 0, 0, {PARAM_NONE}},
318 {TYPE_NONE, 0, 0, {PARAM_NONE}},
319 {TYPE_NONE, 0, 0, {PARAM_NONE}},
320 /* D8 */
321 {TYPE_NONE, 0, 0, {PARAM_NONE}},
322 {TYPE_NONE, 0, 0, {PARAM_NONE}},
323 {TYPE_NONE, 0, 0, {PARAM_NONE}},
324 {TYPE_NONE, 0, 0, {PARAM_NONE}},
325 /* DC */
326 {TYPE_NONE, 0, 0, {PARAM_NONE}},
327 {TYPE_NONE, 0, 0, {PARAM_NONE}},
328 {TYPE_NONE, 0, 0, {PARAM_NONE}},
329 {TYPE_NONE, 0, 0, {PARAM_NONE}},
330 /* E0 */
331 {TYPE_NONE, 0, 0, {PARAM_NONE}},
332 {TYPE_NONE, 0, 0, {PARAM_NONE}},
333 {TYPE_NONE, 0, 0, {PARAM_NONE}},
334 {TYPE_NONE, 0, 0, {PARAM_NONE}},
335 /* E4 */
336 {TYPE_NONE, 0, 0, {PARAM_NONE}},
337 {TYPE_NONE, 0, 0, {PARAM_NONE}},
338 {TYPE_NONE, 0, 0, {PARAM_NONE}},
339 {TYPE_NONE, 0, 0, {PARAM_NONE}},
340 /* E8 */
341 {TYPE_NONE, 0, 0, {PARAM_NONE}},
342 {TYPE_NONE, 0, 0, {PARAM_NONE}},
343 {TYPE_NONE, 0, 0, {PARAM_NONE}},
344 {TYPE_NONE, 0, 0, {PARAM_NONE}},
345 /* EC */
346 {TYPE_NONE, 0, 0, {PARAM_NONE}},
347 {TYPE_NONE, 0, 0, {PARAM_NONE}},
348 {TYPE_NONE, 0, 0, {PARAM_NONE}},
349 {TYPE_NONE, 0, 0, {PARAM_NONE}},
350 /* F0 */
351 {TYPE_NONE, 0, 0, {PARAM_NONE}},
352 {TYPE_NONE, 0, 0, {PARAM_NONE}},
353 {TYPE_NONE, 0, 0, {PARAM_NONE}},
354 {TYPE_NONE, 0, 0, {PARAM_NONE}},
355 /* F4 */
356 {TYPE_NONE, 0, 0, {PARAM_NONE}},
357 {TYPE_NONE, 0, 0, {PARAM_NONE}},
358 {TYPE_NONE, 0, 0, {PARAM_NONE}},
359 {TYPE_NONE, 0, 0, {PARAM_NONE}},
360 /* F8 */
361 {TYPE_NONE, 0, 0, {PARAM_NONE}},
362 {TYPE_NONE, 0, 0, {PARAM_NONE}},
363 {TYPE_NONE, 0, 0, {PARAM_NONE}},
364 {TYPE_NONE, 0, 0, {PARAM_NONE}},
365 /* FC */
366 {TYPE_NONE, 0, 0, {PARAM_NONE}},
367 {TYPE_NONE, 0, 0, {PARAM_NONE}},
368 {TYPE_NONE, 0, 0, {PARAM_NONE}},
369 {TYPE_NONE, 0, 0, {PARAM_NONE}},
370 };
371
372 static const OpcodeFuncEntryLittleRed opcodesFunc[80] = {
373 /* 00 */
374 {OPCODEF(o1_callSub), {PARAM_NONE}},
375 {OPCODEF(o1_callSub), {PARAM_NONE}},
376 {OPCODET(o1_printTotText), {PARAM_INT16}},
377 {OPCODET(o1_loadCursor), {PARAM_INT16, PARAM_INT8}},
378 /* 04 */
379 {TYPE_NONE, 0, 0, {PARAM_NONE}},
380 {OPCODEF(o1_switch), {PARAM_NONE}},
381 {OPCODEF(o1_repeatUntil), {PARAM_NONE}},
382 {OPCODEF(o1_whileDo), {PARAM_NONE}},
383 /* 08 */
384 {OPCODEF(o1_if), {PARAM_NONE}},
385 {OPCODEF(o2_assign), {PARAM_NONE}},
386 {OPCODEF(o1_loadSpriteToPos), {PARAM_NONE}},
387 {TYPE_NONE, 0, 0, {PARAM_NONE}},
388 /* 0C */
389 {TYPE_NONE, 0, 0, {PARAM_NONE}},
390 {TYPE_NONE, 0, 0, {PARAM_NONE}},
391 {TYPE_NONE, 0, 0, {PARAM_NONE}},
392 {TYPE_NONE, 0, 0, {PARAM_NONE}},
393 /* 10 */
394 {TYPE_NONE, 0, 0, {PARAM_NONE}},
395 {OPCODEF(o2_printText), {PARAM_NONE}},
396 {OPCODEF(o1_loadTot), {PARAM_NONE}},
397 {OPCODEF(o1_palLoad), {PARAM_NONE}},
398 /* 14 */
399 {OPCODET(o1_keyFunc), {PARAM_INT16}},
400 {OPCODET(o1_capturePush), {PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
401 {OPCODET(o1_capturePop), {PARAM_NONE}},
402 {OPCODET(o2_animPalInit), {PARAM_INT16, PARAM_EXPR, PARAM_EXPR}},
403 /* 18 */
404 {OPCODET(o2_addHotspot), {PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_UINT16}},
405 {OPCODET(o2_removeHotspot), {PARAM_EXPR}},
406 {TYPE_NONE, 0, 0, {PARAM_NONE}},
407 {TYPE_NONE, 0, 0, {PARAM_NONE}},
408 /* 1C */
409 {TYPE_NONE, 0, 0, {PARAM_NONE}},
410 {TYPE_NONE, 0, 0, {PARAM_NONE}},
411 {OPCODEF(o1_drawOperations), {PARAM_NONE}},
412 {OPCODEF(o1_setcmdCount), {PARAM_NONE}},
413 /* 20 */
414 {OPCODEF(o1_return), {PARAM_NONE}},
415 {OPCODET(o1_renewTimeInVars), {PARAM_NONE}},
416 {OPCODET(o1_speakerOn), {PARAM_EXPR}},
417 {OPCODET(o1_speakerOff), {PARAM_NONE}},
418 /* 24 */
419 {OPCODET(o1_putPixel), {PARAM_INT16, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
420 {OPCODEF(o2_goblinFunc), {PARAM_NONE}},
421 {OPCODET(o2_createSprite), {PARAM_INT16, PARAM_INT16, PARAM_INT16, PARAM_INT16}},
422 {OPCODET(o1_freeSprite), {PARAM_INT16}},
423 /* 28 */
424 {TYPE_NONE, 0, 0, {PARAM_NONE}},
425 {TYPE_NONE, 0, 0, {PARAM_NONE}},
426 {TYPE_NONE, 0, 0, {PARAM_NONE}},
427 {TYPE_NONE, 0, 0, {PARAM_NONE}},
428 /* 2C */
429 {TYPE_NONE, 0, 0, {PARAM_NONE}},
430 {TYPE_NONE, 0, 0, {PARAM_NONE}},
431 {TYPE_NONE, 0, 0, {PARAM_NONE}},
432 {TYPE_NONE, 0, 0, {PARAM_NONE}},
433 /* 30 */
434 {OPCODEF(o1_returnTo), {PARAM_NONE}},
435 {OPCODET(o1_loadSpriteContent), {PARAM_INT16, PARAM_INT16, PARAM_INT16}},
436 {OPCODET(oLittleRed_copySprite), {PARAM_INT16, PARAM_INT16, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_INT16}},
437 {OPCODET(o1_fillRect), {PARAM_INT16, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
438 /* 34 */
439 {OPCODET(o1_drawLine), {PARAM_INT16, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
440 {OPCODET(o1_strToLong), {PARAM_VARINDEX, PARAM_VARINDEX}},
441 {OPCODET(o1_invalidate), {PARAM_INT16, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
442 {OPCODET(o1_setBackDelta), {PARAM_EXPR, PARAM_EXPR}},
443 /* 38 */
444 {OPCODET(o1_playSound), {PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
445 {OPCODET(o2_stopSound), {PARAM_EXPR}},
446 {OPCODEF(o2_loadSound), {PARAM_NONE}},
447 {OPCODET(o1_freeSoundSlot), {PARAM_EXPR}},
448 /* 3C */
449 {OPCODET(o1_waitEndPlay), {PARAM_NONE}},
450 {OPCODET(o1_playComposition), {PARAM_VARINDEX, PARAM_EXPR}},
451 {OPCODET(o2_getFreeMem), {PARAM_VARINDEX, PARAM_VARINDEX}},
452 {OPCODET(o2_checkData), {PARAM_EXPR, PARAM_VARINDEX}},
453 /* 40 */
454 {TYPE_NONE, 0, 0, {PARAM_NONE}},
455 {OPCODET(o1_cleanupStr), {PARAM_VARINDEX}},
456 {OPCODET(o1_insertStr), {PARAM_VARINDEX, PARAM_EXPR}},
457 {OPCODET(o1_cutStr), {PARAM_VARINDEX, PARAM_EXPR, PARAM_EXPR}},
458 /* 44 */
459 {OPCODET(o1_strstr), {PARAM_VARINDEX, PARAM_EXPR, PARAM_VARINDEX}},
460 {OPCODET(o1_istrlen), {PARAM_VARINDEX, PARAM_VARINDEX}},
461 {OPCODET(o1_setMousePos), {PARAM_EXPR, PARAM_EXPR}},
462 {OPCODET(o1_setFrameRate), {PARAM_EXPR}},
463 /* 48 */
464 {OPCODET(o1_animatePalette), {PARAM_NONE}},
465 {OPCODET(o1_animateCursor), {PARAM_NONE}},
466 {OPCODET(o1_blitCursor), {PARAM_NONE}},
467 {OPCODET(o1_loadFont), {PARAM_EXPR, PARAM_INT16}},
468 /* 4C */
469 {OPCODET(o1_freeFont), {PARAM_INT16}},
470 {OPCODET(o2_readData), {PARAM_EXPR, PARAM_VARINDEX, PARAM_EXPR, PARAM_EXPR}},
471 {OPCODET(o2_writeData), {PARAM_EXPR, PARAM_VARINDEX, PARAM_EXPR, PARAM_EXPR}},
472 {OPCODET(o1_manageDataFile), {PARAM_EXPR}},
473 };
474
475 static const OpcodeGoblinEntryLittleRed opcodesGoblin[15] = {
476 /* 00 */
477 {OPCODET(oLittleRed_DOSInterrupt1), {PARAM_NONE}},
478 {OPCODET(oLittleRed_DOSInterrupt2), {PARAM_NONE}},
479 {OPCODET(oLittleRed_playProtracker), {PARAM_NONE}},
480 {OPCODET(o2_stopProtracker), {PARAM_NONE}},
481 {TYPE_NONE, 0, 0, {PARAM_NONE}},
482 {TYPE_NONE, 0, 0, {PARAM_NONE}},
483 {TYPE_NONE, 0, 0, {PARAM_NONE}},
484 {TYPE_NONE, 0, 0, {PARAM_NONE}},
485 {TYPE_NONE, 0, 0, {PARAM_NONE}},
486 {TYPE_NONE, 0, 0, {PARAM_NONE}},
487 {TYPE_NONE, 0, 0, {PARAM_NONE}},
488 {TYPE_NONE, 0, 0, {PARAM_NONE}},
489 {TYPE_NONE, 0, 0, {PARAM_NONE}},
490 {TYPE_NONE, 0, 0, {PARAM_NONE}},
491 {TYPE_NONE, 0, 0, {PARAM_NONE}}
492 };
493
494 _opcodesDrawLittleRed = opcodesDraw;
495 _opcodesFuncLittleRed = opcodesFunc;
496 _opcodesGoblinLittleRed = opcodesGoblin;
497 }
498
drawOpcode(byte i,FuncParams & params)499 void Script_LittleRed::drawOpcode(byte i, FuncParams ¶ms) {
500 FuncType type = _opcodesDrawLittleRed[i].type;
501 params.desc = _opcodesDrawLittleRed[i].desc;
502 OpcodeDrawProcLittleRed op = _opcodesDrawLittleRed[i].proc;
503
504 if (type == TYPE_NONE)
505 error("No such opcodeDraw: %d", i);
506 if ((type == TYPE_TEXTDESC) || (type == TYPE_BOTHDESC))
507 printFuncDesc(params, _opcodesDrawLittleRed[i].params);
508 if ((type == TYPE_FUNCDESC) || (type == TYPE_BOTHDESC))
509 (this->*op)(params);
510 }
511
funcOpcode(byte i,byte j,FuncParams & params)512 void Script_LittleRed::funcOpcode(byte i, byte j, FuncParams ¶ms) {
513 int n = i*16 + j;
514 FuncType type = TYPE_NONE;
515 OpcodeFuncProcLittleRed op = 0;
516
517 if ((i <= 4) && (j <= 15)) {
518 op = _opcodesFuncLittleRed[n].proc;
519 params.desc = _opcodesFuncLittleRed[n].desc;
520 type = _opcodesFuncLittleRed[n].type;
521 }
522
523 if (type == TYPE_NONE)
524 error("No such opcodeFunc: %d.%d", i, j);
525 if ((type == TYPE_TEXTDESC) || (type == TYPE_BOTHDESC))
526 printFuncDesc(params, _opcodesFuncLittleRed[n].params);
527 if ((type == TYPE_FUNCDESC) || (type == TYPE_BOTHDESC))
528 (this->*op)(params);
529 }
530
goblinOpcode(int i,FuncParams & params)531 void Script_LittleRed::goblinOpcode(int i, FuncParams ¶ms) {
532 int n = -1;
533 for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
534 if (_goblinFuncLookUp[j][0] == i) {
535 n = _goblinFuncLookUp[j][1];
536 break;
537 }
538
539 FuncType type = TYPE_NONE;
540 OpcodeGoblinProcLittleRed op = 0;
541
542 if (n >= 0) {
543 op = _opcodesGoblinLittleRed[n].proc;
544 params.desc = _opcodesGoblinLittleRed[n].desc;
545 type = _opcodesGoblinLittleRed[n].type;
546 }
547
548 if (type == TYPE_NONE)
549 error("No such opcodeGoblin: %d (%d)", i, n);
550 if ((type == TYPE_TEXTDESC) || (type == TYPE_BOTHDESC)) {
551 const Param *param = _opcodesGoblinLittleRed[n].params;
552 if (*param == PARAM_GOB)
553 printFuncDesc(params);
554 else
555 printFuncDesc(params, param);
556 }
557 if ((type == TYPE_FUNCDESC) || (type == TYPE_BOTHDESC))
558 (this->*op)(params);
559 }
560