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