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 &params) {
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 &params) {
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 &params) {
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