ScummVM API documentation
intern_he.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 
22 #ifndef SCUMM_HE_INTERN_HE_H
23 #define SCUMM_HE_INTERN_HE_H
24 
25 #include "scumm/scumm_v6.h"
26 #ifdef ENABLE_HE
27 #include "scumm/he/floodfill_he.h"
28 #include "scumm/he/wiz_he.h"
29 #endif
30 #include "scumm/actor_he.h" // For AuxBlock & AuxEntry
31 
32 namespace Common {
33 class SeekableReadStream;
34 class SeekableWriteStream;
35 }
36 
37 namespace Scumm {
38 
39 class ActorHE;
40 class ResExtractor;
41 #ifdef ENABLE_HE
42 class LogicHE;
43 class MoviePlayer;
44 class Sprite;
45 class CUP_Player;
46 #endif
47 
49 protected:
50  enum SubOpType {
51  SO_ACTOR_DEFAULT_CLIPPED = 30,
52  SO_BACKGROUND_ON = 218,
53  SO_BACKGROUND_OFF = 219,
54  SO_ROOM_COPY_PALETTE = 220,
55  SO_ROOM_SAVEGAME_BY_NAME = 221,
56  SO_SOUND_START_VOLUME = 222,
57  SO_SOUND_VOLUME_RAMP = 223,
58  SO_SOUND_FREQUENCY = 224,
59  SO_TALKIE = 225,
60  SO_OBJECT_ORDER = 234,
61  SO_ROOM_PALETTE_IN_ROOM = 236,
62  SO_COLOR_LIST = 249,
63  };
64 
65 public:
66  Common::SeekableReadStream *_hInFileTable[17];
67  Common::SeekableWriteStream *_hOutFileTable[17];
68 
69  Common::Rect _actorClipOverride; // HE specific
70 
71  int _heTimers[16];
72  uint32 _pauseStartTime = 0;
73 
74  int getHETimer(int timer);
75  void setHETimer(int timer);
76  void pauseHETimers(bool pause);
77 
78 public:
79  ScummEngine_v60he(OSystem *syst, const DetectorResult &dr);
80  ~ScummEngine_v60he() override;
81 
82  Common::Path generateFilename(const int room) const override;
83 
84  void resetScumm() override;
85 
86 protected:
87  void setupOpcodes() override;
88 
89  void saveLoadWithSerializer(Common::Serializer &s) override;
90 
91  void localizeArray(int slot, byte scriptSlot);
92  void redimArray(int arrayId, int newX, int newY, int d);
93  int readFileToArray(int slot, int32 size);
94  void writeFileFromArray(int slot, int resID);
95 
96  int virtScreenSave(byte *dst, int x1, int y1, int x2, int y2);
97  void virtScreenLoad(int resIdx, int x1, int y1, int x2, int y2);
98 
99  void decodeParseString(int a, int b) override;
100  void swapObjects(int object1, int object2);
101 
102  Common::Path convertFilePath(const byte *src);
103  Common::String convertSavePath(const byte *src);
104  Common::String convertSavePathOld(const byte *src);
105 
106  Common::SeekableReadStream *openFileForReading(const byte *fileName);
107  Common::SeekableReadStream *openSaveFileForReading(const byte *fileName);
108  Common::SeekableWriteStream *openSaveFileForWriting(const byte *fileName);
109  Common::SeekableWriteStream *openSaveFileForAppending(const byte *fileName);
110  void deleteSaveFile(const byte *fileName);
111  void renameSaveFile(const byte *from, const byte *to);
112  void pauseEngineIntern(bool pause) override;
113 
114  Common::SeekableReadStream *openSaveFileForReading(int slot, bool compat, Common::String &fileName) override;
115  Common::SeekableWriteStream *openSaveFileForWriting(int slot, bool compat, Common::String &fileName) override;
116 
117  /* HE version 60 script opcodes */
118  void o60_setState();
119  void o60_roomOps();
120  void o60_actorOps();
121  void o60_kernelSetFunctions();
122  void o60_kernelGetFunctions();
123  void o60_openFile();
124  void o60_closeFile();
125  void o60_deleteFile();
126  void o60_readFile();
127  void o60_rename();
128  void o60_writeFile();
129  void o60_soundOps();
130  void o60_isSoundRunning();
131  void o60_seekFilePos();
132  void o60_localizeArrayToScript();
133  void o60_redimArray();
134  void o60_readFilePos();
135 };
136 
138  friend class ResExtractor;
139  friend class SoundHE;
140 
141 public:
142  // Used in akos.cpp
143  enum HESndFlags {
144  HE_SND_LOOP = 1,
145  HE_SND_APPEND = 2,
146  HE_SND_SOFT_SOUND = 4,
147  HE_SND_QUICK_START = 8,
148  HE_SND_OFFSET = 16,
149  HE_SND_VOL = 32,
150  HE_SND_FREQUENCY = 64,
151  HE_SND_PAN = 128
152  };
153 
154 
155 protected:
156  enum SubOpType {
157  SO_SOFT = 9,
158  SO_IMAGE_LOADED = 18,
159  SO_VARIABLE = 23,
160  SO_SOUND_VOLUME = 25,
161  SO_NOW = 56,
162  SO_PRELOAD_SCRIPT = 120,
163  SO_PRELOAD_SOUND = 121,
164  SO_PRELOAD_COSTUME = 122,
165  SO_PRELOAD_ROOM = 123,
166  SO_UNLOCK_IMAGE = 159,
167  SO_SOUND_ADD = 164,
168  SO_NUKE_IMAGE = 192,
169  SO_LOAD_IMAGE = 201,
170  SO_LOCK_IMAGE = 202,
171  SO_PRELOAD_IMAGE = 203,
172  SO_ROOM_LOADED = 226,
173  SO_COSTUME_LOADED = 227,
174  SO_SOUND_LOADED = 228,
175  SO_SCRIPT_LOADED = 229,
176  SO_SOUND_CHANNEL = 230,
177  SO_AT = 231,
178  SO_SOUND_START = 232,
179  SO_LOCK_FLOBJECT = 233,
180  SO_UNLOCK_FLOBJECT = 235,
181  SO_PRELOAD_FLUSH = 239,
182  SO_PAUSE_MESSAGE = 240,
183  SO_PAUSE_TITLE = 241,
184  SO_PAUSE_OPTION = 242,
185  SO_TITLE_BAR = 243,
186  SO_QUIT_QUIT = 244,
187  SO_SOUND_LOOPING = 245,
188  SO_START_SYSTEM = 250,
189  SO_START_SYSTEM_STRING = 251,
190  SO_RESTART_STRING = 252,
191  SO_RESTART_ARRAY = 253,
192  };
193 
194  ResExtractor *_resExtractor;
195 
196  byte *_heV7DiskOffsets;
197  byte *_heV7RoomOffsets;
198  uint32 *_heV7RoomIntOffsets;
199 
200  int32 _heSndSoundId, _heSndOffset, _heSndChannel, _heSndFlags,
201  _heSndFrequency, _heSndFrequencyShift, _heSndPan, _heSndVol;
202  bool _heSndStartNewSoundFlag;
203 
204  int _numStoredFlObjects;
205  ObjectData *_storedFlObjects;
206 
207 public:
208  ScummEngine_v70he(OSystem *syst, const DetectorResult &dr);
209  ~ScummEngine_v70he() override;
210 
211  Common::Path generateFilename(const int room) const override;
212 
213  void restoreBackgroundHE(Common::Rect rect, int dirtybit = 0);
214 
215 protected:
216  void allocateArrays() override;
217  int readResTypeList(ResType type) override;
218  uint32 getResourceRoomOffset(ResType type, ResId idx) override;
219  void setupOpcodes() override;
220 
221  void setupScummVars() override;
222  void resetScummVars() override;
223 
224  void saveLoadWithSerializer(Common::Serializer &s) override;
225 
226  void readRoomsOffsets() override;
227  void readGlobalObjects() override;
228  void readIndexBlock(uint32 blocktype, uint32 itemsize) override;
229 
230  void clearRoomObjects() override;
231  void resetRoomObjects() override;
232 
233  int getActorFromPos(int x, int y) override;
234 
235  void loadFlObject(uint object, uint room) override;
236  void storeFlObject(int slot);
237  void restoreFlObjects();
238 
239  void setCursorFromImg(uint img, uint room, uint imgindex) override;
240  void setDefaultCursor() override;
241 
242  /* HE version 70 script opcodes */
243  void o70_soundOps();
244  void o70_pickupObject();
245  void o70_getActorRoom();
246  void o70_resourceRoutines();
247  void o70_systemOps();
248  void o70_getStringLen();
249  void o70_isResourceLoaded();
250  void o70_readINI();
251  void o70_writeINI();
252  void o70_createDirectory();
253  void o70_setSystemMessage();
254 
255  byte VAR_NUM_SOUND_CHANNELS;
256 };
257 
258 #ifdef ENABLE_HE
259 
260 #ifdef USE_ENET
261 class Net;
262 #ifdef USE_LIBCURL
263 class Lobby;
264 #endif
265 #endif
266 class Moonbase;
267 
268 class ScummEngine_v71he : public ScummEngine_v70he {
269  friend class Wiz;
270  friend class Moonbase;
271 
272 protected:
273  enum SubOpType {
274  SO_SET_POLYGON = 246,
275  SO_DELETE_POLYGON = 247,
276  SO_SET_POLYGON_LOCAL = 248,
277  };
278 
279  bool _skipProcessActors;
280 
281 public:
282  ScummEngine_v71he(OSystem *syst, const DetectorResult &dr);
283  ~ScummEngine_v71he() override;
284 
285  byte *heFindResourceData(uint32 tag, byte *ptr);
286  byte *heFindResource(uint32 tag, byte *ptr);
287  byte *findWrappedBlock(uint32 tag, byte *ptr, int state, bool flagError);
288 
289  Wiz *_wiz;
290 
291  virtual int setupStringArray(int size);
292 
293 protected:
294  void setupOpcodes() override;
295 
296  void saveLoadWithSerializer(Common::Serializer &s) override;
297 
298  void redrawBGAreas() override;
299 
300  void processActors() override;
301  void preProcessAuxQueue();
302  void postProcessAuxQueue();
303 
304  void clearDrawQueues() override;
305 
306  int getStringCharWidth(byte chr);
307  void appendSubstring(int dst, int src, int len2, int len);
308  void adjustRect(Common::Rect &rect);
309 
310  /* HE version 71 script opcodes */
311  void o71_kernelSetFunctions();
312  void o71_copyString();
313  void o71_getStringWidth();
314  void o71_appendString();
315  void o71_concatString();
316  void o71_compareString();
317  void o71_getStringLenForWidth();
318  void o71_getCharIndexInString();
319  void o71_findBox();
320  void o71_polygonOps();
321  void o71_polygonHit();
322 
323  byte VAR_WIZ_TCOLOR;
324 public:
325  /* Actor AuxQueue stuff (HE) */
326  AuxBlock _auxBlocks[16];
327  uint16 _auxBlocksNum;
328  AuxEntry _auxEntries[16];
329  uint16 _auxEntriesNum;
330 
331  void queueAuxBlock(ActorHE *a);
332  void queueAuxEntry(int actorNum, int subIndex);
333 
334  void remapHEPalette(const uint8 *src, uint8 *dst);
335 };
336 
337 class ScummEngine_v72he : public ScummEngine_v71he {
338 protected:
339  enum SubOpType {
340  SO_NONE = 1,
341  SO_BIT = 2, // SO_INT1
342  SO_NIBBLE = 3, // SO_INT4
343  SO_BYTE = 4, // SO_INT8
344  SO_INT = 5, // SO_INT16
345  SO_DWORD = 6, // SO_INT32
346  SO_STRING = 7,
347  SO_ARRAY = 8,
348  SO_SOUND_SIZE = 13,
349  SO_ROOM_SIZE = 14,
350  SO_IMAGE_SIZE = 15,
351  SO_COSTUME_SIZE = 16,
352  SO_SCRIPT_SIZE = 17,
353  SO_CONDITION = 21,
354  SO_FLUSH_OBJECT_DRAW_QUE = 22,
355  SO_TALK_CONDITION = 24,
356  SO_UPDATE_SCREEN = 26,
357  SO_PRIORITY = 43,
358  SO_AT_IMAGE = 62,
359  SO_IMAGE = 63,
360  SO_ACTOR_DEFAULT_CLIPPED = 64,
361  SO_ERASE = 68,
362  SO_COMPLEX_ARRAY_ASSIGNMENT = 126,
363  SO_COMPLEX_ARRAY_COPY_OPERATION = 127,
364  SO_RANGE_ARRAY_ASSIGNMENT = 128,
365  SO_COMPLEX_ARRAY_MATH_OPERATION = 138,
366  SO_FORMATTED_STRING = 194,
367  SO_UNDIM_ARRAY = 204,
368  };
369 
370 #include "common/pack-start.h" // START STRUCT PACKING
371 
372  struct ArrayHeader {
373  int32 type; //0
374  int32 dim1start; //4
375  int32 dim1end; //8
376  int32 dim2start; //0C
377  int32 dim2end; //10
378  byte data[1]; //14
379  } PACKED_STRUCT;
380 
381 #include "common/pack-end.h" // END STRUCT PACKING
382 
383  int _stringLength = 1;
384  byte _stringBuffer[4096];
385 
386  WizParameters _wizParams;
387 
388 public:
389  ScummEngine_v72he(OSystem *syst, const DetectorResult &dr);
390 
391  void resetScumm() override;
392 
393  byte *getStringAddress(ResId idx) override;
394  int setupStringArray(int size) override;
395  virtual int setupStringArrayFromString(const char *cStr);
396  virtual void getStringFromArray(int arrayNumber, char *buffer, int maxLength);
397 
398 protected:
399  void setupOpcodes() override;
400 
401  void setupScummVars() override;
402  void resetScummVars() override;
403  void readArrayFromIndexFile() override;
404 
405  void readMAXS(int blockSize) override;
406 
407  void redrawBGAreas() override;
408  void checkExecVerbs() override;
409 
410  byte *defineArray(int array, int type, int dim2start, int dim2end, int dim1start, int dim1end, bool newArray = false, int *newid = NULL);
411  int readArray(int array, int idx2, int idx1) override;
412  void writeArray(int array, int idx2, int idx1, int value) override;
413  void redimArray(int arrayId, int newDim2start, int newDim2end,
414  int newDim1start, int newDim1end, int type);
415  void checkArrayLimits(int array, int dim2start, int dim2end, int dim1start, int dim1end);
416  void copyArray(int array1, int a1_dim2start, int a1_dim2end, int a1_dim1start, int a1_dim1end,
417  int array2, int a2_dim2start, int a2_dim2end, int a2_dim1start, int a2_dim1end);
418  void copyArrayHelper(ArrayHeader *ah, int idx2, int idx1, int len1, byte **data, int *size, int *num);
419  int readFileToArray(int slot, int32 size);
420  void writeFileFromArray(int slot, int32 resID);
421 
422  void decodeParseString(int a, int b) override;
423  void decodeScriptString(byte *dst, bool scriptString = false);
424  void copyScriptString(byte *dst, int dstSize);
425 
426  int findObject(int x, int y, int num, int *args);
427  int getSoundResourceSize(ResId idx);
428 
429  bool handleNextCharsetCode(Actor *a, int *c) override;
430  int convertMessageToString(const byte *msg, byte *dst, int dstSize) override;
431  void fakeBidiString(byte *ltext, bool ignoreVerb, int ltextSize) const override;
432 
433  void debugInput(byte *string);
434 
435  /* HE version 72 script opcodes */
436  void o72_pushDWord();
437  void o72_getScriptString();
438  void o72_isAnyOf();
439  void o72_resetCutscene();
440  void o72_findObjectWithClassOf();
441  void o72_getObjectImageX();
442  void o72_getObjectImageY();
443  void o72_captureWizImage();
444  void o72_getTimer();
445  void o72_setTimer();
446  void o72_getSoundPosition();
447  void o72_startScript();
448  void o72_startObject();
449  void o72_drawObject();
450  void o72_printWizImage();
451  void o72_getArrayDimSize();
452  void o72_getNumFreeArrays();
453  void o72_roomOps();
454  void o72_actorOps();
455  void o72_verbOps();
456  void o72_findObject();
457  void o72_arrayOps();
458  void o72_systemOps();
459  void o72_talkActor();
460  void o72_talkEgo();
461  void o72_dimArray();
462  void o72_dim2dimArray();
463  void o72_traceStatus();
464  void o72_debugInput();
465  void o72_drawWizImage();
466  void o72_kernelGetFunctions();
467  void o72_jumpToScript();
468  void o72_openFile();
469  void o72_readFile();
470  void o72_writeFile();
471  void o72_findAllObjects();
472  void o72_deleteFile();
473  void o72_rename();
474  void o72_getPixel();
475  void o72_pickVarRandom();
476  void o72_redimArray();
477  void o72_readINI();
478  void o72_writeINI();
479  void o72_getResourceSize();
480  void o72_createDirectory();
481  void o72_setSystemMessage();
482 
483  byte VAR_NUM_ROOMS;
484  byte VAR_NUM_SCRIPTS;
485  byte VAR_NUM_SOUNDS;
486  byte VAR_NUM_COSTUMES;
487  byte VAR_NUM_IMAGES;
488  byte VAR_NUM_CHARSETS;
489 
490  byte VAR_SOUND_ENABLED;
491 
492  byte VAR_POLYGONS_ONLY;
493 
494  byte VAR_MOUSE_STATE; // Used in checkExecVerbs();
495  byte VAR_PLATFORM;
496 };
497 
498 class ScummEngine_v80he : public ScummEngine_v72he {
499 protected:
500  int32 _heSndResId = 0;
501 
502  enum SubOpType {
503  SO_CURSOR_IMAGE = 19,
504  SO_CURSOR_COLOR_IMAGE = 20,
505  SO_ADD = 27,
506  SO_ACTOR = 55,
507  SO_BUTTON = 60,
508  };
509 
510 public:
511  ScummEngine_v80he(OSystem *syst, const DetectorResult &dr);
512 
513 protected:
514  void setupOpcodes() override;
515 
516  void setupScummVars() override;
517  void resetScummVars() override;
518 
519  void parseEvent(Common::Event event) override;
520 
521  void initCharset(int charset) override;
522 
523  void clearDrawQueues() override;
524 
525  void drawLine(int x1, int y1, int x, int unk1, int unk2, int type, int id);
526  void drawPixel(int x, int y, int flags);
527 
528  void setDefaultCursor() override;
529 
530  /* HE version 80 script opcodes */
531  void o80_createSound();
532  void o80_getFileSize();
533  void o80_stringToInt();
534  void o80_getSoundVar();
535  void o80_localizeArrayToRoom();
536  void o80_sourceDebug();
537  void o80_readConfigFile();
538  void o80_writeConfigFile();
539  void o80_cursorCommand();
540  void o80_setState();
541  void o80_drawWizPolygon();
542  void o80_drawLine();
543  void o80_pickVarRandom();
544 
545  byte VAR_PLATFORM_VERSION;
546  byte VAR_CURRENT_CHARSET;
547  byte VAR_KEY_STATE;
548  byte VAR_COLOR_DEPTH;
549 };
550 
551 class ScummEngine_v90he : public ScummEngine_v80he {
552  friend class LogicHE;
553 #ifdef USE_ENET
554  friend class Net;
555 #ifdef USE_LIBCURL
556  friend class Lobby;
557 #endif
558 #endif
559  friend class Moonbase;
560  friend class MoviePlayer;
561  friend class Sprite;
562 
563 protected:
564  FloodFillParameters _floodFillParams;
565  enum SubOpType {
566  SO_COORD_2D = 28,
567  SO_COORD_3D = 29,
568  SO_XPOS = 30,
569  SO_YPOS = 31,
570  SO_WIDTH = 32,
571  SO_HEIGHT = 33,
572  SO_STEP_DIST_X = 34,
573  SO_STEP_DIST_Y = 35,
574  SO_COUNT = 36,
575  SO_GROUP = 37,
576  SO_DRAW_XPOS = 38,
577  SO_DRAW_YPOS = 39,
578  SO_PROPERTY = 42,
579  SO_MOVE = 44,
580  SO_FIND = 45,
581  SO_GENERAL_CLIP_STATE = 46,
582  SO_GENERAL_CLIP_RECT = 47,
583  SO_DRAW = 48,
584  SO_LOAD = 49,
585  SO_SAVE = 50,
586  SO_CAPTURE = 51,
587  SO_STATE = 52,
588  SO_ANGLE = 53,
589  SO_SET_FLAGS = 54,
590  SO_INIT = 57,
591  SO_STEP_DIST = 77,
592  SO_ANIMATION = 82,
593  SO_PALETTE = 86,
594  SO_UPDATE = 124,
595  SO_CLASS = 125,
596  SO_SORT = 129,
597  SO_HISTOGRAM = 130,
598  SO_POLY_POLYGON = 131,
599  SO_CHANNEL = 132,
600  SO_RENDER_RECTANGLE = 133,
601  SO_RENDER_LINE = 134,
602  SO_RENDER_PIXEL = 135,
603  SO_RENDER_FLOOD_FILL = 136,
604  SO_RENDER_INTO_IMAGE = 137,
605  SO_NEW_GENERAL_PROPERTY = 139,
606  SO_MASK = 140,
607  SO_FONT_START = 141,
608  SO_FONT_CREATE = 142,
609  SO_FONT_RENDER = 143,
610  SO_CLOSE = 165,
611  SO_RENDER_ELLIPSE = 189,
612  SO_FONT_END = 196,
613  };
614 
615  struct VideoParameters {
616  byte filename[260];
617  int32 status;
618  int32 flags;
619  int32 number;
620  int32 wizResNum;
621  };
622 
623  VideoParameters _videoParams;
624 
625  int32 _heObject, _heObjectNum;
626  int32 _hePaletteNum;
627 
628  int32 _curMaxSpriteId;
629  int32 _curSpriteId;
630  int32 _curSpriteGroupId;
631 
632  LogicHE *_logicHE;
633  MoviePlayer *_moviePlay;
634  Sprite *_sprite;
635 
636 #ifdef USE_ENET
637 public:
638  Net *_net;
639 #ifdef USE_LIBCURL
640  Lobby *_lobby;
641 #endif
642 #endif
643 
644 public:
645  ScummEngine_v90he(OSystem *syst, const DetectorResult &dr);
646  ~ScummEngine_v90he() override;
647 
648 protected:
649  void allocateArrays() override;
650  void setupOpcodes() override;
651 
652  void resetScumm() override;
653 
654  void setupScummVars() override;
655  void resetScummVars() override;
656 
657  void scummLoop(int delta) override;
658  void scummLoop_handleDrawing() override;
659  void runBootscript() override;
660 
661  void processInput() override;
662  void clearClickedStatus() override;
663 
664  void saveLoadWithSerializer(Common::Serializer &s) override;
665 
666  void readMAXS(int blockSize) override;
667  void setResourceOffHeap(int typeId, int resId, int val);
668 
669  void processActors() override;
670 
671  int computeWizHistogram(int resnum, int state, int x, int y, int w, int h);
672  void getArrayDim(int array, int *dim2start, int *dim2end, int *dim1start, int *dim1end);
673  void sortArray(int array, int dim2start, int dim2end, int dim1start, int dim1end, int sortOrder);
674 
675 public:
676  int getGroupSpriteArray(int spriteGroupId);
677 
678 protected:
679  uint8 *getHEPaletteIndex(int palSlot);
680  int getHEPaletteColor(int palSlot, int color);
681  int getHEPaletteSimilarColor(int palSlot, int red, int green, int start, int end);
682  int getHEPalette16BitColorComponent(int component, int type);
683  int getHEPaletteColorComponent(int palSlot, int color, int component);
684  void setHEPaletteColor(int palSlot, uint8 color, uint8 r, uint8 g, uint8 b);
685  void setHEPaletteFromPtr(int palSlot, const uint8 *palData);
686  void setHEPaletteFromCostume(int palSlot, int resId);
687  void setHEPaletteFromImage(int palSlot, int resId, int state);
688  void setHEPaletteFromRoom(int palSlot, int resId, int state);
689  void restoreHEPalette(int palSlot);
690  void copyHEPalette(int dstPalSlot, int srcPalSlot);
691  void copyHEPaletteColor(int palSlot, uint8 dstColor, uint16 srcColor);
692 
693 protected:
694  /* HE version 90 script opcodes */
695  void o90_dup_n();
696  void o90_min();
697  void o90_max();
698  void o90_sin();
699  void o90_cos();
700  void o90_sqrt();
701  void o90_atan2();
702  void o90_getSegmentAngle();
703  void o90_getActorData();
704  void o90_startScriptUnk();
705  void o90_jumpToScriptUnk();
706  void o90_videoOps();
707  void o90_getVideoData();
708  void o90_wizImageOps();
709  void o90_getDistanceBetweenPoints();
710  void o90_getSpriteInfo();
711  void o90_setSpriteInfo();
712  void o90_getSpriteGroupInfo();
713  void o90_setSpriteGroupInfo();
714  void o90_getWizData();
715  void o90_floodFill();
716  void o90_mod();
717  void o90_shl();
718  void o90_shr();
719  void o90_xor();
720  void o90_findAllObjectsWithClassOf();
721  void o90_getPolygonOverlap();
722  void o90_cond();
723  void o90_dim2dim2Array();
724  void o90_redim2dimArray();
725  void o90_getLinesIntersectionPoint();
726  void o90_sortArray();
727  void o90_getObjectData();
728  void o90_getPaletteData();
729  void o90_paletteOps();
730  void o90_fontUnk();
731  void o90_getActorAnimProgress();
732  void o90_kernelGetFunctions();
733  void o90_kernelSetFunctions();
734 
735  byte VAR_NUM_SPRITE_GROUPS;
736  byte VAR_NUM_SPRITES;
737  byte VAR_NUM_PALETTES;
738  byte VAR_NUM_UNK;
739 
740  byte VAR_U32_VERSION;
741  byte VAR_U32_ARRAY_UNK;
742 
743 #ifdef USE_ENET
744  byte VAR_REMOTE_START_SCRIPT;
745  byte VAR_NETWORK_AVAILABLE;
746  byte VAR_NETWORK_RECEIVE_ARRAY_SCRIPT;
747 
748 public:
749  int networkSessionDialog();
750 #endif
751 };
752 
753 class ScummEngine_v99he : public ScummEngine_v90he {
754 public:
755  ScummEngine_v99he(OSystem *syst, const DetectorResult &dr) : ScummEngine_v90he(syst, dr) {}
756 
757  void resetScumm() override;
758 
759 protected:
760  void resetScummVars() override;
761 
762  void readMAXS(int blockSize) override;
763 
764  void saveLoadWithSerializer(Common::Serializer &s) override;
765 
766  void copyPalColor(int dst, int src) override;
767  void darkenPalette(int redScale, int greenScale, int blueScale, int startColor, int endColor) override;
768  void setPaletteFromPtr(const byte *ptr, int numcolor = -1) override;
769  void setPalColor(int index, int r, int g, int b) override;
770  void updatePalette() override;
771 };
772 
773 class ScummEngine_v100he : public ScummEngine_v99he {
774 friend class AI;
775 friend class Moonbase;
776 friend class Net;
777 
778 // The following engine versions use sub opcodes from this version
779 friend class ScummEngine_v71he;
780 friend class ScummEngine_v72he;
781 friend class ScummEngine_v90he;
782 friend class ScummEngine_v80he;
783 
784 protected:
785  ResType _heResType;
786  int32 _heResId;
787 
788  byte _debugInputBuffer[256];
789  enum SubOpType {
790  // COMMON
791  SO_INIT = 0,
792  SO_ACTOR = 1,
793  SO_ANGLE = 2,
794  SO_ANIMATION = 3,
795  SO_ANIMATION_SPEED = 4,
796  SO_ARRAY = 5,
797  SO_AT = 6,
798  SO_AT_IMAGE = 7,
799  SO_BACKGROUND_OFF = 8,
800  SO_BACKGROUND_ON = 9,
801  SO_CAPTURE = 11,
802  SO_CENTER = 12,
803  SO_CHANNEL = 13,
804  SO_CHARSET_SET = 14, // SO_CHARSET
805  SO_CHARSET_COLOR = 15,
806  SO_CLASS = 16,
807  SO_CLIPPED = 18,
808  SO_CLOSE = 19,
809  SO_COLOR = 20,
810  SO_COLOR_LIST = 21,
811  SO_CONDITION = 22,
812  SO_COORD_2D = 23,
813  SO_COORD_3D = 24,
814  SO_COSTUME = 25,
815  SO_COUNT = 26,
816  SO_DEFAULT = 27,
817  SO_DELETE_POLYGON = 28,
818  SO_DRAW = 29,
819  SO_DRAW_XPOS = 30,
820  SO_DRAW_YPOS = 31,
821  SO_ERASE = 32,
822  SO_FIND = 33,
823  SO_FLOBJECT = 34,
824  SO_FORMATTED_STRING = 35,
825  SO_GENERAL_CLIP_RECT = 36,
826  SO_GENERAL_CLIP_STATE = 37,
827  SO_GROUP = 38,
828  SO_HEIGHT = 39,
829  SO_IMAGE = 40,
830  SO_BIT = 41, // SO_INT1
831  SO_INT = 42, // SO_INT16
832  SO_DWORD = 43, // SO_INT32
833  SO_NIBBLE = 44, // SO_INT4
834  SO_BYTE = 45, // SO_INT8
835  SO_LEFT = 46,
836  SO_LOAD = 47,
837  SO_MASK = 48,
838  SO_MOVE = 49,
839  SO_MUMBLE = 51,
840  SO_NAME = 52,
841  SO_NEW = 53,
842  SO_NEW_GENERAL_PROPERTY = 54,
843  SO_NOW = 55,
844  SO_OVERHEAD = 56,
845  SO_PALETTE = 57,
846  SO_POLY_TO_POLY = 58,
847  SO_PRIORITY = 59,
848  SO_PROPERTY = 60,
849  SO_RESTART = 61,
850  SO_ROOM = 62,
851  SO_ROOM_PALETTE = 63,
852  SO_SAVE = 64,
853  SO_SCALE = 65,
854  SO_SCRIPT = 66,
855  SO_SET_FLAGS = 67,
856  SO_SET_POLYGON = 68,
857  SO_SET_POLYGON_LOCAL = 69,
858  SO_SHADOW = 70,
859  SO_SOUND = 72,
860  SO_STATE = 73,
861  SO_STEP_DIST = 74,
862  SO_STEP_DIST_X = 75,
863  SO_STEP_DIST_Y = 76,
864  SO_STRING = 77,
865  SO_TALKIE = 78,
866  SO_TEXTSTRING = 79,
867  SO_TITLE_BAR = 80,
868  SO_TO = 81,
869  SO_UPDATE = 82,
870  SO_VARIABLE = 83,
871  SO_WIDTH = 84,
872  SO_XPOS = 85,
873  SO_YPOS = 86,
874  SO_ALWAYS_ZCLIP = 87,
875  SO_IMAGE_ZCLIP = 88,
876  SO_NEVER_ZCLIP = 89,
877  SO_BASEOP = 91,
878  SO_END = 92,
879 
880  // ACTOR
881  SO_ACTOR_DEFAULT_CLIPPED = 128,
882  SO_ACTOR_INIT = 129,
883  SO_ACTOR_SOUNDS = 130,
884  SO_ACTOR_WIDTH = 131,
885  SO_ANIMATION_DEFAULT = 132,
886  SO_ELEVATION = 133,
887  SO_FOLLOW_BOXES = 134,
888  SO_IGNORE_BOXES = 135,
889  SO_ACTOR_IGNORE_TURNS_OFF = 136, // SO_IGNORE_TURNS_OFF
890  SO_ACTOR_IGNORE_TURNS_ON = 137, // SO_IGNORE_TURNS_ON
891  SO_INIT_ANIMATION = 138,
892  SO_STAND_ANIMATION = 139,
893  SO_TALK_ANIMATION = 140,
894  SO_TALK_COLOR = 141,
895  SO_TALK_CONDITION = 142,
896  SO_TEXT_OFFSET = 143,
897  SO_WALK_ANIMATION = 144,
898 
899  // ARRAY
900  SO_ASSIGN_2DIM_LIST = 128,
901  SO_ASSIGN_INT_LIST = 129,
902  SO_COMPLEX_ARRAY_ASSIGNMENT = 130,
903  SO_COMPLEX_ARRAY_COPY_OPERATION = 131,
904  SO_COMPLEX_ARRAY_MATH_OPERATION = 132,
905  SO_RANGE_ARRAY_ASSIGNMENT = 133,
906  SO_SORT = 134,
907  SO_UNDIM_ARRAY = 135,
908 
909  // HEAP
910  SO_CLEAR_HEAP = 128,
911  SO_PRELOAD_FLUSH = 129,
912  SO_LOCK = 132,
913  SO_NUKE = 133,
914  SO_OFF_HEAP = 134,
915  SO_ON_HEAP = 135,
916  SO_PRELOAD = 136,
917  SO_UNLOCK = 137,
918 
919  // IMAGE
920  SO_FONT_CREATE = 128,
921  SO_FONT_END = 129,
922  SO_FONT_RENDER = 130,
923  SO_FONT_START = 131,
924  SO_HISTOGRAM = 132,
925  SO_RENDER_ELLIPSE = 133,
926  SO_RENDER_FLOOD_FILL = 134,
927  SO_RENDER_INTO_IMAGE = 135,
928  SO_RENDER_LINE = 136,
929  SO_RENDER_PIXEL = 137,
930  SO_RENDER_RECTANGLE = 138,
931 
932  // CURSOR
933  SO_CURSOR_IMAGE = 128,
934  SO_CURSOR_COLOR_IMAGE = 129,
935  SO_CURSOR_COLOR_PAL_IMAGE = 130,
936  SO_CURSOR_HOTSPOT = 132,
937  SO_CURSOR_ON = 134,
938  SO_CURSOR_OFF = 135,
939  SO_CURSOR_SOFT_ON = 136,
940  SO_CURSOR_SOFT_OFF = 137,
941  SO_USERPUT_ON = 139,
942  SO_USERPUT_OFF = 140,
943  SO_USERPUT_SOFT_ON = 141,
944  SO_USERPUT_SOFT_OFF = 142,
945 
946  // ROOM
947  SO_OBJECT_ORDER = 129,
948  SO_ROOM_COPY_PALETTE = 130,
949  SO_ROOM_FADE = 131,
950  SO_ROOM_INTENSITY = 132,
951  SO_ROOM_INTENSITY_RGB = 133,
952  SO_ROOM_NEW_PALETTE = 134,
953  SO_ROOM_PALETTE_IN_ROOM = 135,
954  SO_ROOM_SAVEGAME = 136,
955  SO_ROOM_SAVEGAME_BY_NAME = 137,
956  SO_ROOM_SCREEN = 138,
957  SO_ROOM_SCROLL = 139,
958 
959  // SYSTEM
960  SO_FLUSH_OBJECT_DRAW_QUEUE = 128,
961  SO_PAUSE_TITLE = 131,
962  SO_QUIT = 132,
963  SO_QUIT_QUIT = 133,
964  SO_RESTART_STRING = 134,
965  SO_START_SYSTEM_STRING = 135,
966  SO_UPDATE_SCREEN = 136,
967 
968  // SOUND
969  SO_SOUND_ADD = 128,
970  SO_SOUND_CHANNEL = 129,
971  SO_SOUND_FREQUENCY = 130,
972  SO_SOUND_LOOPING = 131,
973  SO_SOUND_MODIFY = 132,
974  SO_SOUND_PAN = 133,
975  SO_SOUND_START = 134,
976  SO_SOUND_SOFT = 135,
977  SO_SOUND_VOLUME = 136,
978 
979  // WAIT
980  SO_WAIT_FOR_ACTOR = 128,
981  SO_WAIT_FOR_CAMERA = 129,
982  SO_WAIT_FOR_MESSAGE = 130,
983  SO_WAIT_FOR_SENTENCE = 131,
984  };
985 
986 public:
987  Moonbase *_moonbase;
988 
989 public:
990  ScummEngine_v100he(OSystem *syst, const DetectorResult &dr);
991  ~ScummEngine_v100he() override;
992 
993  void resetScumm() override;
994 
995  void setupScummVars() override;
996  void resetScummVars() override;
997 
998 protected:
999  void setupOpcodes() override;
1000 
1001  void saveLoadWithSerializer(Common::Serializer &s) override;
1002 
1003  void decodeParseString(int a, int b) override;
1004 
1005  /* HE version 100 script opcodes */
1006  void o100_actorOps();
1007  void o100_arrayOps();
1008  void o100_dim2dimArray();
1009  void o100_redim2dimArray();
1010  void o100_dimArray();
1011  void o100_drawLine();
1012  void o100_drawObject();
1013  void o100_floodFill();
1014  void o100_setSpriteGroupInfo();
1015  void o100_resourceRoutines();
1016  void o100_wizImageOps();
1017  void o100_jumpToScript();
1018  void o100_createSound();
1019  void o100_dim2dim2Array();
1020  void o100_paletteOps();
1021  void o100_jumpToScriptUnk();
1022  void o100_startScriptUnk();
1023  void o100_redimArray();
1024  void o100_roomOps();
1025  void o100_setSystemMessage();
1026  void o100_soundOps();
1027  void o100_setSpriteInfo();
1028  void o100_startScript();
1029  void o100_systemOps();
1030  void o100_cursorCommand();
1031  void o100_videoOps();
1032  void o100_wait();
1033  void o100_writeFile();
1034  void o100_debugInput();
1035  void o100_isResourceLoaded();
1036  void o100_getResourceSize();
1037  void o100_getSpriteGroupInfo();
1038  void o100_getPaletteData();
1039  void o100_readFile();
1040  void o100_getSpriteInfo();
1041  void o100_getWizData();
1042  void o100_getVideoData();
1043 
1044 protected:
1045  byte VAR_U32_USER_VAR_A;
1046  byte VAR_U32_USER_VAR_B;
1047  byte VAR_U32_USER_VAR_C;
1048  byte VAR_U32_USER_VAR_D;
1049  byte VAR_U32_USER_VAR_E;
1050  byte VAR_U32_USER_VAR_F;
1051 
1052  byte VAR_REMOTE_START_SCRIPT;
1053  byte VAR_NETWORK_AVAILABLE;
1054  byte VAR_NETWORK_RECEIVE_ARRAY_SCRIPT;
1055 };
1056 
1057 class ScummEngine_vCUPhe : public Engine {
1058 protected:
1059  CUP_Player *_cupPlayer;
1060  FilenamePattern _filenamePattern;
1061 
1062 public:
1063  ScummEngine_vCUPhe(OSystem *syst, const DetectorResult &dr);
1064  ~ScummEngine_vCUPhe() override;
1065 
1066  Common::Error run() override;
1067 
1068  void parseEvents();
1069 
1070  OSystem *_syst;
1071 
1072  GameSettings _game;
1073 };
1074 
1075 #endif
1076 
1077 
1078 } // End of namespace Scumm
1079 
1080 #endif
Definition: str.h:59
Definition: error.h:84
Definition: scumm_v6.h:193
Definition: detection.h:264
Definition: ai_main.h:85
Definition: net_main.h:33
Definition: sound_he.h:147
Definition: rect.h:144
Definition: path.h:52
ResType
Definition: scumm.h:256
Definition: stream.h:745
Definition: serializer.h:79
Definition: net_lobby.h:85
Definition: actor_he.h:47
Definition: intern_he.h:48
Definition: intern_he.h:137
Definition: actor_he.h:52
Definition: detection.h:191
Definition: object.h:71
Definition: events.h:198
Definition: algorithm.h:29
Definition: actor.h:91
Definition: resource_he.h:35
Definition: stream.h:351
Definition: scumm_v6.h:29
Definition: actor_he.h:30
Definition: system.h:167
Definition: engine.h:143
Definition: actor.h:30
Definition: detection.h:278