ScummVM API documentation
inter.h
1/* ScummVM - Graphic Adventure Engine
2 *
3 * ScummVM is the legal property of its developers, whose names
4 * are too numerous to list here. Please refer to the COPYRIGHT
5 * file distributed with this source distribution.
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (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, see <http://www.gnu.org/licenses/>.
19 *
20 *
21 * This file is dual-licensed.
22 * In addition to the GPLv3 license mentioned above, this code is also
23 * licensed under LGPL 2.1. See LICENSES/COPYING.LGPL file for the
24 * full text of the license.
25 *
26 */
27
28#ifndef GOB_INTER_H
29#define GOB_INTER_H
30
31#include "common/func.h"
32#include "common/hashmap.h"
33
34#include "gob/goblin.h"
35#include "gob/variables.h"
36#include "gob/html_parser.h"
37#include "gob/iniconfig.h"
38#include "gob/databases.h"
39
40namespace Common {
41 class WinResources;
42}
43
44namespace Gob {
45
46class Cheater_Geisha;
47
48namespace Geisha {
49 class Diving;
50 class Penetration;
51}
52
53// This is to help devices with small memory (PDA, smartphones, ...)
54// to save a bit of memory used by opcode names in the Gob engine.
55#ifndef REDUCE_MEMORY_USAGE
56 #define _OPCODEDRAW(ver, x) setProc(new Common::Functor0Mem<void, ver>(this, &ver::x), #x)
57 #define _OPCODEFUNC(ver, x) setProc(new Common::Functor1Mem<OpFuncParams &, void, ver>(this, &ver::x), #x)
58 #define _OPCODEGOB(ver, x) setProc(new Common::Functor1Mem<OpGobParams &, void, ver>(this, &ver::x), #x)
59#else
60 #define _OPCODEDRAW(ver, x) setProc(new Common::Functor0Mem<void, ver>(this, &ver::x), "")
61 #define _OPCODEFUNC(ver, x) setProc(new Common::Functor1Mem<OpFuncParams &, void, ver>(this, &ver::x), "")
62 #define _OPCODEGOB(ver, x) setProc(new Common::Functor1Mem<OpGobParams &, void, ver>(this, &ver::x), "")
63#endif
64
65#define CLEAROPCODEDRAW(i) _opcodesDraw[i].setProc(0, 0)
66#define CLEAROPCODEFUNC(i) _opcodesFunc[i].setProc(0, 0)
67#define CLEAROPCODEGOB(i) _opcodesGob.erase(i)
68
69typedef Common::Functor0<void> OpcodeDraw;
72
74 byte cmdCount;
75 byte counter;
76 int16 retFlag;
77 bool doReturn;
78};
80 int16 extraData;
81 int16 paramCount;
82 VariableReference retVarPtr;
83 Goblin::Gob_Object *objDesc;
84};
85
86template<typename T>
88 T *proc;
89 const char *desc;
90
91 OpcodeEntry() : proc(0), desc(0) {}
92 ~OpcodeEntry() {
93 setProc(0, 0);
94 }
95
96 void setProc(T *p, const char *d) {
97 if (proc != p) {
98 delete proc;
99 proc = p;
100 }
101 desc = d;
102 }
103};
104
105class Inter {
106public:
107 uint8 _terminate;
108
109 int16 *_breakFromLevel;
110 int16 *_nestLevel;
111
112 uint32 _soundEndTimeKey;
113 int16 _soundStopVal;
114
115 Variables *_variables;
116
117 void setupOpcodes();
118
119 void initControlVars(char full);
120 void renewTimeInVars();
121 void storeMouse();
122 void storeKey(int16 key);
123
124 void writeVar(uint32 offset, uint16 type, uint32 value);
125
126 void funcBlock(int16 retFlag);
127 void callSub(int16 retFlag);
128
129 void allocateVars(uint32 count);
130 void delocateVars();
131
132 virtual int16 loadSound(int16 slot) = 0;
133 virtual void animPalette() = 0;
134
135 Inter(GobEngine *vm);
136 virtual ~Inter();
137
138protected:
139 OpcodeEntry<OpcodeDraw> _opcodesDraw[256];
140 OpcodeEntry<OpcodeFunc> _opcodesFunc[256];
142
143 bool _break;
144
145 int16 _animPalLowIndex[8];
146 int16 _animPalHighIndex[8];
147 int16 _animPalDir[8];
148
149 VariableStack _varStack;
150
151 // Busy-wait detection
152 bool _noBusyWait;
153 uint32 _lastBusyWait;
154
155 GobEngine *_vm;
156
157 void executeOpcodeDraw(byte i);
158 void executeOpcodeFunc(byte i, byte j, OpFuncParams &params);
159 void executeOpcodeGob(int i, OpGobParams &params);
160
161 const char *getDescOpcodeDraw(byte i);
162 const char *getDescOpcodeFunc(byte i, byte j);
163 const char *getDescOpcodeGob(int i);
164
165 virtual void setupOpcodesDraw() = 0;
166 virtual void setupOpcodesFunc() = 0;
167 virtual void setupOpcodesGob() = 0;
168
169 virtual void checkSwitchTable(uint32 &offset) = 0;
170
171 void o_drawNOP() {}
172 void o_funcNOP(OpFuncParams &params) {}
173 void o_gobNOP(OpGobParams &params) {}
174
175 void storeValue(uint16 index, uint16 type, uint32 value);
176 void storeValue(uint32 value);
177
178 void storeString(uint16 index, uint16 type, const char *value);
179 void storeString(const char *value);
180
181 uint32 readValue(uint16 index, uint16 type);
182
183 void handleBusyWait();
184};
185
186class Inter_v1 : public Inter {
187public:
188 Inter_v1(GobEngine *vm);
189 ~Inter_v1() override {}
190
191 int16 loadSound(int16 slot) override;
192 void animPalette() override;
193
194protected:
195 void setupOpcodesDraw() override;
196 void setupOpcodesFunc() override;
197 void setupOpcodesGob() override;
198
199 void checkSwitchTable(uint32 &offset) override;
200
201 void o1_loadMult();
202 void o1_playMult();
203 void o1_freeMultKeys();
204 void o1_initCursor();
205 void o1_initCursorAnim();
206 void o1_clearCursorAnim();
207 void o1_setRenderFlags();
208 void o1_loadAnim();
209 void o1_freeAnim();
210 void o1_updateAnim();
211 void o1_initMult();
212 void o1_freeMult();
213 void o1_animate();
214 void o1_loadMultObject();
215 void o1_getAnimLayerInfo();
216 void o1_getObjAnimSize();
217 void o1_loadStatic();
218 void o1_freeStatic();
219 void o1_renderStatic();
220 void o1_loadCurLayer();
221 void o1_playCDTrack();
222 void o1_getCDTrackPos();
223 void o1_stopCD();
224 void o1_loadFontToSprite();
225 void o1_freeFontToSprite();
226 void o1_callSub(OpFuncParams &params);
227 void o1_printTotText(OpFuncParams &params);
228 void o1_loadCursor(OpFuncParams &params);
229 void o1_switch (OpFuncParams &params);
230 void o1_repeatUntil(OpFuncParams &params);
231 void o1_whileDo(OpFuncParams &params);
232 void o1_if(OpFuncParams &params);
233 void o1_assign(OpFuncParams &params);
234 void o1_loadSpriteToPos(OpFuncParams &params);
235 void o1_printText(OpFuncParams &params);
236 void o1_loadTot(OpFuncParams &params);
237 void o1_palLoad(OpFuncParams &params);
238 void o1_keyFunc(OpFuncParams &params);
239 void o1_capturePush(OpFuncParams &params);
240 void o1_capturePop(OpFuncParams &params);
241 void o1_animPalInit(OpFuncParams &params);
242 void o1_drawOperations(OpFuncParams &params);
243 void o1_setcmdCount(OpFuncParams &params);
244 void o1_return(OpFuncParams &params);
245 void o1_renewTimeInVars(OpFuncParams &params);
246 void o1_speakerOn(OpFuncParams &params);
247 void o1_speakerOff(OpFuncParams &params);
248 void o1_putPixel(OpFuncParams &params);
249 void o1_goblinFunc(OpFuncParams &params);
250 void o1_createSprite(OpFuncParams &params);
251 void o1_freeSprite(OpFuncParams &params);
252 void o1_returnTo(OpFuncParams &params);
253 void o1_loadSpriteContent(OpFuncParams &params);
254 void o1_copySprite(OpFuncParams &params);
255 void o1_fillRect(OpFuncParams &params);
256 void o1_drawLine(OpFuncParams &params);
257 void o1_strToLong(OpFuncParams &params);
258 void o1_invalidate(OpFuncParams &params);
259 void o1_setBackDelta(OpFuncParams &params);
260 void o1_playSound(OpFuncParams &params);
261 void o1_stopSound(OpFuncParams &params);
262 void o1_loadSound(OpFuncParams &params);
263 void o1_freeSoundSlot(OpFuncParams &params);
264 void o1_waitEndPlay(OpFuncParams &params);
265 void o1_playComposition(OpFuncParams &params);
266 void o1_getFreeMem(OpFuncParams &params);
267 void o1_checkData(OpFuncParams &params);
268 void o1_cleanupStr(OpFuncParams &params);
269 void o1_insertStr(OpFuncParams &params);
270 void o1_cutStr(OpFuncParams &params);
271 void o1_strstr(OpFuncParams &params);
272 void o1_istrlen(OpFuncParams &params);
273 void o1_setMousePos(OpFuncParams &params);
274 void o1_setFrameRate(OpFuncParams &params);
275 void o1_animatePalette(OpFuncParams &params);
276 void o1_animateCursor(OpFuncParams &params);
277 void o1_blitCursor(OpFuncParams &params);
278 void o1_loadFont(OpFuncParams &params);
279 void o1_freeFont(OpFuncParams &params);
280 void o1_readData(OpFuncParams &params);
281 void o1_writeData(OpFuncParams &params);
282 void o1_manageDataFile(OpFuncParams &params);
283 void o1_setState(OpGobParams &params);
284 void o1_setCurFrame(OpGobParams &params);
285 void o1_setNextState(OpGobParams &params);
286 void o1_setMultState(OpGobParams &params);
287 void o1_setOrder(OpGobParams &params);
288 void o1_setActionStartState(OpGobParams &params);
289 void o1_setCurLookDir(OpGobParams &params);
290 void o1_setType(OpGobParams &params);
291 void o1_setNoTick(OpGobParams &params);
292 void o1_setPickable(OpGobParams &params);
293 void o1_setXPos(OpGobParams &params);
294 void o1_setYPos(OpGobParams &params);
295 void o1_setDoAnim(OpGobParams &params);
296 void o1_setRelaxTime(OpGobParams &params);
297 void o1_setMaxTick(OpGobParams &params);
298 void o1_getState(OpGobParams &params);
299 void o1_getCurFrame(OpGobParams &params);
300 void o1_getNextState(OpGobParams &params);
301 void o1_getMultState(OpGobParams &params);
302 void o1_getOrder(OpGobParams &params);
303 void o1_getActionStartState(OpGobParams &params);
304 void o1_getCurLookDir(OpGobParams &params);
305 void o1_getType(OpGobParams &params);
306 void o1_getNoTick(OpGobParams &params);
307 void o1_getPickable(OpGobParams &params);
308 void o1_getObjMaxFrame(OpGobParams &params);
309 void o1_getXPos(OpGobParams &params);
310 void o1_getYPos(OpGobParams &params);
311 void o1_getDoAnim(OpGobParams &params);
312 void o1_getRelaxTime(OpGobParams &params);
313 void o1_getMaxTick(OpGobParams &params);
314 void o1_manipulateMap(OpGobParams &params);
315 void o1_getItem(OpGobParams &params);
316 void o1_manipulateMapIndirect(OpGobParams &params);
317 void o1_getItemIndirect(OpGobParams &params);
318 void o1_setPassMap(OpGobParams &params);
319 void o1_setGoblinPosH(OpGobParams &params);
320 void o1_getGoblinPosXH(OpGobParams &params);
321 void o1_getGoblinPosYH(OpGobParams &params);
322 void o1_setGoblinMultState(OpGobParams &params);
323 void o1_setGoblinUnk14(OpGobParams &params);
324 void o1_setItemIdInPocket(OpGobParams &params);
325 void o1_setItemIndInPocket(OpGobParams &params);
326 void o1_getItemIdInPocket(OpGobParams &params);
327 void o1_getItemIndInPocket(OpGobParams &params);
328 void o1_setGoblinPos(OpGobParams &params);
329 void o1_setGoblinState(OpGobParams &params);
330 void o1_setGoblinStateRedraw(OpGobParams &params);
331 void o1_decRelaxTime(OpGobParams &params);
332 void o1_getGoblinPosX(OpGobParams &params);
333 void o1_getGoblinPosY(OpGobParams &params);
334 void o1_clearPathExistence(OpGobParams &params);
335 void o1_setGoblinVisible(OpGobParams &params);
336 void o1_setGoblinInvisible(OpGobParams &params);
337 void o1_getObjectIntersect(OpGobParams &params);
338 void o1_getGoblinIntersect(OpGobParams &params);
339 void o1_setItemPos(OpGobParams &params);
340 void o1_loadObjects(OpGobParams &params);
341 void o1_freeObjects(OpGobParams &params);
342 void o1_animateObjects(OpGobParams &params);
343 void o1_drawObjects(OpGobParams &params);
344 void o1_loadMap(OpGobParams &params);
345 void o1_moveGoblin(OpGobParams &params);
346 void o1_switchGoblin(OpGobParams &params);
347 void o1_loadGoblin(OpGobParams &params);
348 void o1_writeTreatItem(OpGobParams &params);
349 void o1_moveGoblin0(OpGobParams &params);
350 void o1_setGoblinTarget(OpGobParams &params);
351 void o1_setGoblinObjectsPos(OpGobParams &params);
352 void o1_initGoblin(OpGobParams &params);
353
354 void manipulateMap(int16 xPos, int16 yPos, int16 item);
355
356private:
357 bool _ignoreSpeakerOff = false;
358};
359
360class Inter_Geisha : public Inter_v1 {
361public:
363 ~Inter_Geisha() override;
364
365protected:
366 void setupOpcodesDraw() override;
367 void setupOpcodesFunc() override;
368 void setupOpcodesGob() override;
369
370 void oGeisha_loadCursor(OpFuncParams &params);
371 void oGeisha_loadTot(OpFuncParams &params);
372 void oGeisha_goblinFunc(OpFuncParams &params);
373 void oGeisha_loadSound(OpFuncParams &params);
374 void oGeisha_checkData(OpFuncParams &params);
375 void oGeisha_readData(OpFuncParams &params);
376 void oGeisha_writeData(OpFuncParams &params);
377
378 void oGeisha_gamePenetration(OpGobParams &params);
379 void oGeisha_gameDiving(OpGobParams &params);
380 void oGeisha_loadTitleMusic(OpGobParams &params);
381 void oGeisha_playMusic(OpGobParams &params);
382 void oGeisha_stopMusic(OpGobParams &params);
383
384 void oGeisha_caress1(OpGobParams &params);
385 void oGeisha_caress2(OpGobParams &params);
386
387 int16 loadSound(int16 slot) override;
388
389private:
390 Geisha::Diving *_diving;
391 Geisha::Penetration *_penetration;
392
393 Cheater_Geisha *_cheater;
394};
395
396class Inter_v2 : public Inter_v1 {
397public:
398 Inter_v2(GobEngine *vm);
399 ~Inter_v2() override {}
400
401 int16 loadSound(int16 search) override;
402 void animPalette() override;
403
404protected:
405 void setupOpcodesDraw() override;
406 void setupOpcodesFunc() override;
407 void setupOpcodesGob() override;
408
409 void checkSwitchTable(uint32 &offset) override;
410
411 void o2_playMult();
412 void o2_freeMultKeys();
413 void o2_setRenderFlags();
414 void o2_multSub();
415 void o2_initMult();
416 void o2_loadMultObject();
417 void o2_renderStatic();
418 void o2_loadCurLayer();
419 void o2_playCDTrack();
420 void o2_waitCDTrackEnd();
421 void o2_stopCD();
422 void o2_readLIC();
423 void o2_freeLIC();
424 void o2_getCDTrackPos();
425 void o2_loadFontToSprite();
426 void o2_totSub();
427 void o2_switchTotSub();
428 void o2_pushVars();
429 void o2_popVars();
430 void o2_loadMapObjects();
431 void o2_freeGoblins();
432 void o2_moveGoblin();
433 void o2_writeGoblinPos();
434 void o2_stopGoblin();
435 void o2_setGoblinState();
436 void o2_placeGoblin();
437 void o2_initScreen();
438 void o2_scroll();
439 void o2_setScrollOffset();
440 void o2_playImd();
441 void o2_getImdInfo();
442 void o2_openItk();
443 void o2_closeItk();
444 void o2_setImdFrontSurf();
445 void o2_resetImdFrontSurf();
446 void o2_assign(OpFuncParams &params);
447 void o2_printText(OpFuncParams &params);
448 void o2_animPalInit(OpFuncParams &params);
449 void o2_addHotspot(OpFuncParams &params);
450 void o2_removeHotspot(OpFuncParams &params);
451 void o2_getTotTextItemPart(OpFuncParams &params);
452 void o2_goblinFunc(OpFuncParams &params);
453 void o2_stopSound(OpFuncParams &params);
454 void o2_loadSound(OpFuncParams &params);
455 void o2_getFreeMem(OpFuncParams &params);
456 void o2_checkData(OpFuncParams &params);
457 void o2_readData(OpFuncParams &params);
458 void o2_writeData(OpFuncParams &params);
459 void o2_loadInfogramesIns(OpGobParams &params);
460 void o2_playInfogrames(OpGobParams &params);
461 void o2_startInfogrames(OpGobParams &params);
462 void o2_stopInfogrames(OpGobParams &params);
463 void o2_handleGoblins(OpGobParams &params);
464 void o2_playProtracker(OpGobParams &params);
465 void o2_stopProtracker(OpGobParams &params);
466};
467
468class Inter_Bargon : public Inter_v2 {
469public:
471 ~Inter_Bargon() override {}
472
473protected:
474 void setupOpcodesDraw() override;
475 void setupOpcodesFunc() override;
476 void setupOpcodesGob() override;
477
478 void oBargon_intro0(OpGobParams &params);
479 void oBargon_intro1(OpGobParams &params);
480 void oBargon_intro2(OpGobParams &params);
481 void oBargon_intro3(OpGobParams &params);
482 void oBargon_intro4(OpGobParams &params);
483 void oBargon_intro5(OpGobParams &params);
484 void oBargon_intro6(OpGobParams &params);
485 void oBargon_intro7(OpGobParams &params);
486 void oBargon_intro8(OpGobParams &params);
487 void oBargon_intro9(OpGobParams &params);
488};
489
491public:
493 ~Inter_Fascination() override {}
494
495protected:
496 void setupOpcodesDraw() override;
497 void setupOpcodesFunc() override;
498 void setupOpcodesGob() override;
499
500 void oFascin_playProtracker(OpGobParams &params);
501
502 void oFascin_repeatUntil(OpFuncParams &params);
503 void oFascin_assign(OpFuncParams &params);
504 void oFascin_copySprite(OpFuncParams &params);
505 void oFascin_keyFunc(OpFuncParams &params);
506
507 void oFascin_playTirb(OpGobParams &params);
508 void oFascin_playTira(OpGobParams &params);
509 void oFascin_loadExtasy(OpGobParams &params);
510 void oFascin_adlibPlay(OpGobParams &params);
511 void oFascin_adlibStop(OpGobParams &params);
512 void oFascin_adlibUnload(OpGobParams &params);
513 void oFascin_loadMus1(OpGobParams &params);
514 void oFascin_loadMus2(OpGobParams &params);
515 void oFascin_loadMus3(OpGobParams &params);
516 void oFascin_loadBatt1(OpGobParams &params);
517 void oFascin_loadBatt2(OpGobParams &params);
518 void oFascin_loadBatt3(OpGobParams &params);
519 void oFascin_loadMod(OpGobParams &params);
520 void oFascin_setWinSize();
521 void oFascin_closeWin();
522 void oFascin_activeWin();
523 void oFascin_openWin();
524 void oFascin_initCursorAnim();
525 void oFascin_setRenderFlags();
526 void oFascin_setWinFlags();
527};
528
529class Inter_LittleRed : public Inter_v2 {
530public:
532 ~Inter_LittleRed() override {}
533
534protected:
535 void setupOpcodesDraw() override;
536 void setupOpcodesFunc() override;
537 void setupOpcodesGob() override;
538
539 void oLittleRed_keyFunc(OpFuncParams &params);
540 void oLittleRed_playComposition(OpFuncParams &params);
541};
542
543class Inter_Adibou1 : public Inter_v2 {
544public:
546 ~Inter_Adibou1() override {}
547
548protected:
549 void setupOpcodesDraw() override;
550 void setupOpcodesFunc() override;
551 void setupOpcodesGob() override;
552
553 void oAdibou1_writeSprite(OpGobParams &params);
554 void oAdibou1_readSprite(OpGobParams &params);
555 void oAdibou1_fillAreaAtPoint(OpGobParams &params);
556 void oAdibou1_getAppliNameFromId(OpGobParams &params);
557 void oAdibou1_listApplications(OpGobParams &params);
558};
559
560class Inter_v3 : public Inter_v2 {
561public:
562 Inter_v3(GobEngine *vm);
563 ~Inter_v3() override {}
564
565protected:
566 void setupOpcodesDraw() override;
567 void setupOpcodesFunc() override;
568 void setupOpcodesGob() override;
569
570 void o3_speakerOn(OpFuncParams &params);
571 void o3_speakerOff(OpFuncParams &params);
572 void o3_copySprite(OpFuncParams &params);
573
574 void o3_wobble(OpGobParams &params);
575
576private:
577 bool _ignoreSpeakerOff;
578};
579
580class Inter_Inca2 : public Inter_v3 {
581public:
583 ~Inter_Inca2() override {}
584
585protected:
586 void setupOpcodesDraw() override;
587 void setupOpcodesFunc() override;
588 void setupOpcodesGob() override;
589
590 void oInca2_spaceShooter(OpFuncParams &params);
591 void oInca2_goblinFunc(OpFuncParams &params);
592};
593
594class Inter_v4 : public Inter_v3 {
595public:
596 Inter_v4(GobEngine *vm);
597 ~Inter_v4() override {}
598
599protected:
600 void setupOpcodesDraw() override;
601 void setupOpcodesFunc() override;
602 void setupOpcodesGob() override;
603
604 void o4_initScreen();
605 void o4_playVmdOrMusic();
606};
607
608class Inter_v5 : public Inter_v4 {
609public:
610 Inter_v5(GobEngine *vm);
611 ~Inter_v5() override {}
612
613protected:
614 byte _gob_97_98_val;
615
616 void setupOpcodesDraw() override;
617 void setupOpcodesFunc() override;
618 void setupOpcodesGob() override;
619
620 void o5_deleteFile();
621 void o5_initScreen();
622
623 void o5_istrlen(OpFuncParams &params);
624
625 void o5_spaceShooter(OpGobParams &params);
626 void o5_getSystemCDSpeed(OpGobParams &params);
627 void o5_getSystemRAM(OpGobParams &params);
628 void o5_getSystemCPUSpeed(OpGobParams &params);
629 void o5_getSystemDrawSpeed(OpGobParams &params);
630 void o5_totalSystemSpecs(OpGobParams &params);
631 void o5_saveSystemSpecs(OpGobParams &params);
632 void o5_loadSystemSpecs(OpGobParams &params);
633
634 void o5_gob92(OpGobParams &params);
635 void o5_gob95(OpGobParams &params);
636 void o5_gob96(OpGobParams &params);
637 void o5_gob97(OpGobParams &params);
638 void o5_gob98(OpGobParams &params);
639 void o5_gob100(OpGobParams &params);
640 void o5_gob200(OpGobParams &params);
641};
642
643class Inter_v6 : public Inter_v5 {
644public:
645 Inter_v6(GobEngine *vm);
646 ~Inter_v6() override {}
647
648protected:
649 bool _gotFirstPalette;
650
651 void setupOpcodesDraw() override;
652 void setupOpcodesFunc() override;
653 void setupOpcodesGob() override;
654
655 void o6_totSub();
656 void o6_playVmdOrMusic();
657
658 void o6_loadCursor(OpFuncParams &params);
659 void o6_assign(OpFuncParams &params);
660 void o6_removeHotspot(OpFuncParams &params);
661 void o6_fillRect(OpFuncParams &params);
662
663 void probe16bitMusic(Common::String &fileName);
664
665 Common::String getFile(const char *path, bool stripPath = true, bool *isCd = nullptr);
666};
667
668class Inter_Playtoons : public Inter_v6 {
669public:
671 ~Inter_Playtoons() override {}
672
673protected:
674 void setupOpcodesDraw() override;
675 void setupOpcodesFunc() override;
676 void setupOpcodesGob() override;
677
678 void oPlaytoons_printText(OpFuncParams &params);
679 void oPlaytoons_createButton(OpFuncParams &params);
680 void oPlaytoons_putPixel(OpFuncParams &params);
681 void oPlaytoons_freeSprite(OpFuncParams &params);
682 void oPlaytoons_checkData(OpFuncParams &params);
683 void oPlaytoons_readData(OpFuncParams &params);
684 void oPlaytoons_writeData(OpFuncParams &params);
685
686 void oPlaytoons_loadMultObject();
687 void oPlaytoons_getObjAnimSize();
688 void oPlaytoons_CD_20_23();
689 void oPlaytoons_CD_25();
690 void oPlaytoons_copyFile();
691 void oPlaytoons_openItk();
692
693 bool readSprite(Common::String file, int32 dataVar, int32 size, int32 offset);
694};
695
696class Inter_v7 : public Inter_Playtoons {
697public:
698 Inter_v7(GobEngine *vm);
699 ~Inter_v7() override {};
700
701protected:
702 void setupOpcodesDraw() override;
703 void setupOpcodesFunc() override;
704 void setupOpcodesGob() override;
705
706 Common::String ansiToOEM(Common::String string);
707 Common::String oemToANSI(Common::String string);
708 void xorObfuscate(byte *str, int len);
709 void xorDeobfuscate(byte *str, int len);
710
711 void o7_draw0x0C();
712 void o7_setCursorToLoadFromExec();
713 void o7_freeMult();
714 void o7_loadMultObject();
715 void o7_getFreeMem(OpFuncParams &params);
716 void o7_displayWarning();
717 void o7_logString();
718 void o7_moveGoblin();
719 void o7_setGoblinState();
720 void o7_intToString();
721 void o7_callFunction();
722 void o7_loadFunctions();
723 void o7_moveFile();
724 void o7_copyFile();
725 void o7_deleteFile();
726 void o7_playVmdOrMusic();
727 void o7_openItk();
728 void o7_initScreen();
729 void o7_setActiveCD();
730 void o7_findFile();
731 void o7_findNextFile();
732 void o7_getFileInfo();
733 void o7_getSystemProperty();
734 void o7_getVmdCurrentFrameRect();
735 void o7_loadImage();
736 void o7_copyDataToClipboard();
737 void o7_setVolume();
738 void o7_zeroVar();
739 void o7_draw0xA0();
740 void o7_getINIValue();
741 void o7_setINIValue();
742 void o7_loadIFFPalette();
743 void o7_openDatabase();
744 void o7_openDatabaseTable();
745 void o7_closeDatabaseTable();
746 void o7_draw0xAE();
747 void o7_openDatabaseIndex();
748 void o7_findDatabaseRecord();
749 void o7_findNextDatabaseRecord();
750 void o7_getDatabaseRecordValue();
751 void o7_checkAnyDatabaseRecordFound();
752 void o7_seekHtmlFile();
753 void o7_nextKeywordHtmlFile();
754 void o7_draw0xC3();
755 void o7_openTranslationDB();
756 void o7_closeTranslationDB();
757 void o7_getDBString();
758 void o7_draw0xCC();
759 void o7_draw0xCD();
760 void o7_draw0xCE();
761 void o7_openHtmlFile();
762 void o7_closeHtmlFile();
763 void o7_draw0xDC();
764 void o7_draw0xDD();
765 void o7_draw0xDE();
766 void o7_draw0xDF();
767 void o7_draw0xE0();
768 void o7_draw0xE1();
769 void o7_draw0xE2();
770 void o7_draw0xE3();
771 void o7_draw0xE4();
772 void o7_draw0xE6();
773 void o7_draw0xE7();
774 void o7_draw0xE8();
775 void o7_draw0xE9();
776 void o7_draw0xF0();
777 void o7_executeModAddEvent();
778 void o7_executeModSetLength();
779 void o7_executeModGetPosition();
780 void o7_executeModStart();
781 void o7_vmdGetSoundBuffer();
782 void o7_vmdReleaseSoundBuffer();
783
784 void o7_keyFunc(OpFuncParams &params);
785 void o7_loadCursor(OpFuncParams &params);
786 void o7_printText(OpFuncParams &params);
787 void o7_fillRect(OpFuncParams &params);
788 void o7_drawLine(OpFuncParams &params);
789 void o7_invalidate(OpFuncParams &params);
790 void o7_checkData(OpFuncParams &params);
791 void o7_readData(OpFuncParams &params);
792 void o7_manageDataFile(OpFuncParams &params);
793
794 bool readAdi4InfDataForChild(Common::Array<byte> &dest, uint32 childNumber, uint32 offset, uint32 size);
795 bool readAdi4InstalledAppsData(Common::Array<byte> &generalChildData,
796 Common::Array<byte> &appChildData,
797 uint32 childNbr, uint32 appliNbr);
798 bool writeAdi4InfDataForChild(const Common::Array<byte> &data, uint32 childNumber, uint32 offset, uint32 size);
799 bool writeAdi4InstalledAppsData(const Common::Array<byte> &generalChildData,
800 const Common::Array<byte> &appChildData,
801 uint32 childNbr, uint32 appliNbr);
802
803 void o7_saveAdi4ExerciseAttemptsCount(OpGobParams &params);
804 void o7_saveAdi4ExerciseResults(OpGobParams &params);
805 void o7_writeUnknownChildDataToGameVariables(OpGobParams &params);
806 void o7_writeUnknownAppChildDataToGameVariables(OpGobParams &params);
807 void o7_writeChildScoreToGameVariables(OpGobParams &params);
808
809 void o7_startAdi4Application(OpGobParams &params);
810
811 void o7_xorDeobfuscate(OpGobParams &params);
812 void o7_xorObfuscate(OpGobParams &params);
813 void o7_resolvePath(OpGobParams &params);
814 void o7_ansiToOEM(OpGobParams &params);
815 void o7_oemToANSI(OpGobParams &params);
816 void o7_setDBStringEncoding(OpGobParams &params);
817 void o7_gob0x201(OpGobParams &params);
818 void o7_getFreeDiskSpace(OpGobParams &params);
819 void o7_calculator(OpGobParams &params);
820 void o7_dummy(OpGobParams &params);
821
822private:
823 const uint32 kAdi4InfChildDataSize = 7406;
824 const uint32 kAdi4InfGeneralChildDataSize = 3406;
825 const uint32 kAdi4InfAppChildDataSize = 200;
826
827 uint32 _adi4CurrentAppNbr = 0;
828 uint32 _adi4CurrentChildNbr = 0;
829 uint32 _adi4CurrentSectionInGeneralChildData = 0;
830 uint32 _adi4CurrentSectionInAppChildData = 0;
831 Common::Array<byte> _adi4GeneralChildData;
832 Common::Array<byte> _adi4CurrentAppChildData;
833
834 INIConfig _inis;
835 TranslationDatabases _translationDatabases;
837
838 Common::List<Common::Path> _findFileMatches;
839 Common::Path _currentCDPath;
840
841 Common::String _currentHtmlFile;
842 HtmlContext *_currentHtmlContext;
843
844 void copyFile(const Common::String &sourceFile, bool sourceIsCd, const Common::String &destFile);
845
846 bool setCurrentCDPath(const Common::String &dir);
847 Common::Array<uint32> getAdibou2InstalledApplications();
848};
849
850} // End of namespace Gob
851
852#endif // GOB_INTER_H
Definition: hashmap.h:85
Definition: noncopyable.h:39
Definition: path.h:52
Definition: str.h:59
Definition: cheater.h:55
Definition: diving.h:52
Definition: penetration.h:51
Definition: gob.h:166
Definition: html_parser.h:53
Definition: iniconfig.h:39
Definition: inter.h:543
Definition: inter.h:468
Definition: inter.h:490
Definition: inter.h:360
Definition: inter.h:580
Definition: inter.h:529
Definition: inter.h:668
Definition: inter.h:186
Definition: inter.h:396
Definition: inter.h:560
Definition: inter.h:594
Definition: inter.h:608
Definition: inter.h:643
Definition: inter.h:696
Definition: inter.h:105
Definition: databases.h:40
Definition: variables.h:133
Definition: variables.h:166
Definition: variables.h:33
Definition: algorithm.h:29
Definition: func.h:437
Definition: goblin.h:63
Definition: inter.h:73
Definition: inter.h:79
Definition: inter.h:87