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
31namespace Common {
32class SeekableReadStream;
33class SeekableWriteStream;
34}
35
36namespace Scumm {
37
38#define MAGIC_ARRAY_NUMBER 0x33539000
39
40class ActorHE;
41class ResExtractor;
42#ifdef ENABLE_HE
43class HEFont;
44class LogicHE;
45class MoviePlayer;
46class Sprite;
47class CUP_Player;
48
49class Moonbase;
50class Basketball;
51#endif
52
54#ifdef ENABLE_HE
55 friend class Moonbase;
56 friend class Basketball;
57#endif
58protected:
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
74public:
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
88public:
89 Moonbase *_moonbase;
90 Basketball *_basketball;
91#endif
92
93public:
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
103protected:
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
158public:
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
172protected:
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
224public:
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
233protected:
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
281class Net;
282#ifdef USE_BASIC_NET
283class Lobby;
284#endif
285#endif
286
287class ScummEngine_v71he : public ScummEngine_v70he {
288 friend class Wiz;
289 friend class Gdi;
290 friend class HEFont;
291
292protected:
293 enum SubOpType {
294 SO_SET_POLYGON = 246,
295 SO_DELETE_POLYGON = 247,
296 SO_SET_POLYGON_LOCAL = 248,
297 };
298
299public:
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
312protected:
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;
342public:
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
355class ScummEngine_v72he : public ScummEngine_v71he {
356 friend class Wiz;
357
358protected:
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
412public:
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
422protected:
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
527class ScummEngine_v80he : public ScummEngine_v72he {
528protected:
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
545public:
546 ScummEngine_v80he(OSystem *syst, const DetectorResult &dr);
547
548protected:
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
586class 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
601protected:
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
685public:
686 Net *_net;
687#ifdef USE_BASIC_NET
688 Lobby *_lobby;
689#endif
690#endif
691
692public:
693 ScummEngine_v90he(OSystem *syst, const DetectorResult &dr);
694 ~ScummEngine_v90he() override;
695
696protected:
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
728public:
729 int getGroupSpriteArray(int spriteGroupId);
730
731protected:
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
760protected:
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
816public:
817 int networkSessionDialog();
818#endif
819};
820
821class ScummEngine_v95he : public ScummEngine_v90he {
822public:
823 ScummEngine_v95he(OSystem *syst, const DetectorResult &dr) : ScummEngine_v90he(syst, dr) {}
824
825protected:
826 void resetActorBgs() override;
827 bool prepareForActorErase();
828};
829
830class ScummEngine_v99he : public ScummEngine_v95he {
831friend class ScummEngine_v72he;
832friend class ScummEngine_v90he;
833friend class Wiz;
834
835public:
836 ScummEngine_v99he(OSystem *syst, const DetectorResult &dr);
837 ~ScummEngine_v99he() override;
838
839 void resetScumm() override;
840
841protected:
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
857class ScummEngine_v100he : public ScummEngine_v99he {
858friend class AI;
859friend class Moonbase;
860friend class LogicHEBasketball;
861friend class Basketball;
862
863// The following engine versions use sub opcodes from this version
864friend class ScummEngine_v71he;
865friend class ScummEngine_v72he;
866friend class ScummEngine_v90he;
867friend class ScummEngine_v80he;
868
869protected:
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
1079public:
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
1088protected:
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
1134protected:
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
1148public:
1149 bool mapGeneratorDialog(bool demo);
1150};
1151
1152class ScummEngine_vCUPhe : public Engine {
1153protected:
1154 CUP_Player *_cupPlayer;
1155 FilenamePattern _filenamePattern;
1156
1157public:
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: error.h:81
Definition: path.h:52
Definition: stream.h:745
Definition: stream.h:351
Definition: serializer.h:80
Definition: str.h:59
Definition: engine.h:155
Definition: system.h:166
Definition: gfx.h:292
Definition: font_he.h:72
Definition: net_lobby.h:85
Definition: net_main.h:33
Definition: resource_he.h:35
Definition: intern_he.h:53
void pauseEngineIntern(bool pause) override
Definition: scumm_v6.h:29
Definition: intern_he.h:154
Definition: sound_he.h:147
Definition: algorithm.h:29
Definition: actor.h:30
ResType
Definition: scumm.h:243
Definition: events.h:218
Definition: rect.h:536
Definition: detection.h:144
Definition: object.h:64