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 
40 namespace Common {
41  class WinResources;
42 }
43 
44 namespace Gob {
45 
46 class Cheater_Geisha;
47 
48 namespace 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 
69 typedef Common::Functor0<void> OpcodeDraw;
72 
73 struct OpFuncParams {
74  byte cmdCount;
75  byte counter;
76  int16 retFlag;
77  bool doReturn;
78 };
79 struct OpGobParams {
80  int16 extraData;
81  int16 paramCount;
82  VariableReference retVarPtr;
83  Goblin::Gob_Object *objDesc;
84 };
85 
86 template<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 
105 class Inter {
106 public:
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 
138 protected:
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 
186 class Inter_v1 : public Inter {
187 public:
188  Inter_v1(GobEngine *vm);
189  ~Inter_v1() override {}
190 
191  int16 loadSound(int16 slot) override;
192  void animPalette() override;
193 
194 protected:
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 
356 private:
357  bool _ignoreSpeakerOff = false;
358 };
359 
360 class Inter_Geisha : public Inter_v1 {
361 public:
362  Inter_Geisha(GobEngine *vm);
363  ~Inter_Geisha() override;
364 
365 protected:
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 
389 private:
390  Geisha::Diving *_diving;
391  Geisha::Penetration *_penetration;
392 
393  Cheater_Geisha *_cheater;
394 };
395 
396 class Inter_v2 : public Inter_v1 {
397 public:
398  Inter_v2(GobEngine *vm);
399  ~Inter_v2() override {}
400 
401  int16 loadSound(int16 search) override;
402  void animPalette() override;
403 
404 protected:
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 
468 class Inter_Bargon : public Inter_v2 {
469 public:
470  Inter_Bargon(GobEngine *vm);
471  ~Inter_Bargon() override {}
472 
473 protected:
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 
490 class Inter_Fascination : public Inter_v2 {
491 public:
493  ~Inter_Fascination() override {}
494 
495 protected:
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 
529 class Inter_LittleRed : public Inter_v2 {
530 public:
532  ~Inter_LittleRed() override {}
533 
534 protected:
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 
543 class Inter_Adibou1 : public Inter_v2 {
544 public:
546  ~Inter_Adibou1() override {}
547 
548 protected:
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 
560 class Inter_v3 : public Inter_v2 {
561 public:
562  Inter_v3(GobEngine *vm);
563  ~Inter_v3() override {}
564 
565 protected:
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 
576 private:
577  bool _ignoreSpeakerOff;
578 };
579 
580 class Inter_Inca2 : public Inter_v3 {
581 public:
582  Inter_Inca2(GobEngine *vm);
583  ~Inter_Inca2() override {}
584 
585 protected:
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 
594 class Inter_v4 : public Inter_v3 {
595 public:
596  Inter_v4(GobEngine *vm);
597  ~Inter_v4() override {}
598 
599 protected:
600  void setupOpcodesDraw() override;
601  void setupOpcodesFunc() override;
602  void setupOpcodesGob() override;
603 
604  void o4_initScreen();
605  void o4_playVmdOrMusic();
606 };
607 
608 class Inter_v5 : public Inter_v4 {
609 public:
610  Inter_v5(GobEngine *vm);
611  ~Inter_v5() override {}
612 
613 protected:
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 
643 class Inter_v6 : public Inter_v5 {
644 public:
645  Inter_v6(GobEngine *vm);
646  ~Inter_v6() override {}
647 
648 protected:
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 
666 class Inter_Playtoons : public Inter_v6 {
667 public:
669  ~Inter_Playtoons() override {}
670 
671 protected:
672  void setupOpcodesDraw() override;
673  void setupOpcodesFunc() override;
674  void setupOpcodesGob() override;
675 
676  void oPlaytoons_printText(OpFuncParams &params);
677  void oPlaytoons_F_1B(OpFuncParams &params);
678  void oPlaytoons_putPixel(OpFuncParams &params);
679  void oPlaytoons_freeSprite(OpFuncParams &params);
680  void oPlaytoons_checkData(OpFuncParams &params);
681  void oPlaytoons_readData(OpFuncParams &params);
682 
683  void oPlaytoons_loadMultObject();
684  void oPlaytoons_getObjAnimSize();
685  void oPlaytoons_CD_20_23();
686  void oPlaytoons_CD_25();
687  void oPlaytoons_copyFile();
688  void oPlaytoons_openItk();
689 
690  Common::String getFile(const char *path, bool stripPath = true, bool *isCd = nullptr);
691 
692  bool readSprite(Common::String file, int32 dataVar, int32 size, int32 offset);
693 };
694 
695 class Inter_v7 : public Inter_Playtoons {
696 public:
697  Inter_v7(GobEngine *vm);
698  ~Inter_v7() override {};
699 
700 protected:
701  void setupOpcodesDraw() override;
702  void setupOpcodesFunc() override;
703  void setupOpcodesGob() override;
704 
705  Common::String ansiToOEM(Common::String string);
706  Common::String oemToANSI(Common::String string);
707  void xorObfuscate(byte *str, int len);
708  void xorDeobfuscate(byte *str, int len);
709 
710  void o7_draw0x0C();
711  void o7_setCursorToLoadFromExec();
712  void o7_freeMult();
713  void o7_loadMultObject();
714  void o7_getFreeMem(OpFuncParams &params);
715  void o7_displayWarning();
716  void o7_logString();
717  void o7_moveGoblin();
718  void o7_setGoblinState();
719  void o7_intToString();
720  void o7_callFunction();
721  void o7_loadFunctions();
722  void o7_moveFile();
723  void o7_copyFile();
724  void o7_deleteFile();
725  void o7_playVmdOrMusic();
726  void o7_openItk();
727  void o7_initScreen();
728  void o7_setActiveCD();
729  void o7_findFile();
730  void o7_findNextFile();
731  void o7_getFileInfo();
732  void o7_getSystemProperty();
733  void o7_loadImage();
734  void o7_setVolume();
735  void o7_zeroVar();
736  void o7_draw0xA0();
737  void o7_getINIValue();
738  void o7_setINIValue();
739  void o7_loadIFFPalette();
740  void o7_openDatabase();
741  void o7_openDatabaseTable();
742  void o7_closeDatabaseTable();
743  void o7_draw0xAE();
744  void o7_openDatabaseIndex();
745  void o7_findDatabaseRecord();
746  void o7_findNextDatabaseRecord();
747  void o7_getDatabaseRecordValue();
748  void o7_checkAnyDatabaseRecordFound();
749  void o7_seekHtmlFile();
750  void o7_nextKeywordHtmlFile();
751  void o7_draw0xC3();
752  void o7_openTranslationDB();
753  void o7_closeTranslationDB();
754  void o7_getDBString();
755  void o7_draw0xCC();
756  void o7_draw0xCD();
757  void o7_draw0xCE();
758  void o7_openHtmlFile();
759  void o7_closeHtmlFile();
760  void o7_draw0xDC();
761  void o7_draw0xDD();
762  void o7_draw0xDE();
763  void o7_draw0xDF();
764  void o7_draw0xE0();
765  void o7_draw0xE1();
766  void o7_draw0xE2();
767  void o7_draw0xE3();
768  void o7_draw0xE4();
769  void o7_draw0xE6();
770  void o7_draw0xE7();
771  void o7_draw0xE8();
772  void o7_draw0xE9();
773  void o7_draw0xF0();
774  void o7_executeModAddEvent();
775  void o7_executeModSetLength();
776  void o7_executeModGetPosition();
777  void o7_executeModStart();
778  void o7_vmdGetSoundBuffer();
779  void o7_vmdReleaseSoundBuffer();
780 
781  void o7_loadCursor(OpFuncParams &params);
782  void o7_printText(OpFuncParams &params);
783  void o7_fillRect(OpFuncParams &params);
784  void o7_drawLine(OpFuncParams &params);
785  void o7_invalidate(OpFuncParams &params);
786  void o7_checkData(OpFuncParams &params);
787  void o7_readData(OpFuncParams &params);
788  void o7_writeData(OpFuncParams &params);
789 
790  void o7_xorDeobfuscate(OpGobParams &params);
791  void o7_xorObfuscate(OpGobParams &params);
792  void o7_ansiToOEM(OpGobParams &params);
793  void o7_oemToANSI(OpGobParams &params);
794  void o7_setDBStringEncoding(OpGobParams &params);
795  void o7_gob0x201(OpGobParams &params);
796  void o7_getFreeDiskSpace(OpGobParams &params);
797  void o7_dummy(OpGobParams &params);
798 
799 private:
800  INIConfig _inis;
801  TranslationDatabases _translationDatabases;
803 
804  Common::List<Common::Path> _findFileMatches;
805  Common::Path _currentCDPath;
806 
807  Common::String _currentHtmlFile;
808  HtmlContext *_currentHtmlContext;
809 
810  void copyFile(const Common::String &sourceFile, bool sourceIsCd, const Common::String &destFile);
811 
812  bool setCurrentCDPath(const Common::String &dir);
813  Common::Array<uint32> getAdibou2InstalledApplications();
814 };
815 
816 } // End of namespace Gob
817 
818 #endif // GOB_INTER_H
Definition: inter.h:560
Definition: inter.h:360
Definition: gob.h:166
Definition: str.h:59
Definition: inter.h:666
Definition: inter.h:490
Definition: inter.h:543
Definition: inter.h:87
Definition: inter.h:695
Definition: variables.h:33
Definition: inter.h:643
Definition: diving.h:52
Definition: cheater.h:55
Definition: goblin.h:63
Definition: path.h:52
Definition: inter.h:529
Definition: variables.h:166
Definition: noncopyable.h:39
Definition: inter.h:468
Definition: inter.h:608
Definition: anifile.h:40
Definition: inter.h:73
Definition: html_parser.h:53
Definition: hashmap.h:85
Definition: inter.h:105
Definition: algorithm.h:29
Definition: inter.h:396
Definition: func.h:437
Definition: inter.h:79
Definition: variables.h:133
Definition: inter.h:594
Definition: penetration.h:51
Definition: inter.h:186
Definition: iniconfig.h:39
Definition: inter.h:580
Definition: databases.h:40