ScummVM API documentation
scumm.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_SCUMM_H
23 #define SCUMM_SCUMM_H
24 
25 #include "engines/engine.h"
26 
27 #include "common/endian.h"
28 #include "common/events.h"
29 #include "common/file.h"
30 #include "common/savefile.h"
31 #include "common/keyboard.h"
32 #include "common/mutex.h"
33 #include "common/random.h"
34 #include "common/rect.h"
35 #include "common/rendermode.h"
36 #include "common/serializer.h"
37 #include "common/str.h"
38 #include "common/textconsole.h"
39 #include "graphics/surface.h"
40 #include "graphics/sjis.h"
41 #include "graphics/palette.h"
42 
43 #include "scumm/gfx.h"
44 #include "scumm/detection.h"
45 #include "scumm/script.h"
46 
47 #ifdef __DS__
48 /* This disables the dual layer mode which is used in FM-Towns versions
49  * of SCUMM games and which emulates the behavior of the original code.
50  * The only purpose is code size reduction for certain backends.
51  * SCUMM 3 (FM-Towns) games will run in English in normal (DOS VGA) mode,
52  * which should work just fine in most situations. Some glitches might
53  * occur. Japanese mode and SCUMM 5 FM-Towns games will not work without
54  * dual layer (and 16 bit color) support.
55  */
56 #define DISABLE_TOWNS_DUAL_LAYER_MODE
57 #endif
58 
59 namespace GUI {
60 class Dialog;
61 }
62 using GUI::Dialog;
63 namespace Common {
64 class SeekableReadStream;
65 class WriteStream;
66 class SeekableWriteStream;
67 }
68 namespace Graphics {
69 class FontSJIS;
70 }
71 
84 namespace Scumm {
85 
86 class Actor;
87 class BaseCostumeLoader;
88 class BaseCostumeRenderer;
89 class BaseScummFile;
90 class CharsetRenderer;
91 class IMuse;
92 class IMuseDigital;
93 class MacGui;
94 class MusicEngine;
95 class Player_Towns;
96 class ScummEngine;
97 class ScummDebugger;
98 class Sound;
99 class Localizer;
100 class GlyphRenderer_v7;
101 
102 struct Box;
103 struct BoxCoords;
104 struct FindObjectInRoom;
105 
106 // Use g_scumm from error() ONLY
107 extern ScummEngine *g_scumm;
108 
109 /* System Wide Constants */
110 enum {
111  NUM_SENTENCE = 6,
112  NUM_SHADOW_PALETTE = 8
113 };
114 
115 /* SCUMM Debug Channels */
116 void debugC(int level, MSVC_PRINTF const char *s, ...) GCC_PRINTF(2, 3);
117 
118 enum {
119  DEBUG_GENERAL = 1 << 0, // General debug
120  DEBUG_SCRIPTS = 1 << 2, // Track script execution (start/stop/pause)
121  DEBUG_OPCODES = 1 << 3, // Track opcode invocations
122  DEBUG_VARS = 1 << 4, // Track variable changes
123  DEBUG_RESOURCE = 1 << 5, // Track resource loading / allocation
124  DEBUG_IMUSE = 1 << 6, // Track iMUSE events
125  DEBUG_SOUND = 1 << 7, // General Sound Debug
126  DEBUG_ACTORS = 1 << 8, // General Actor Debug
127  DEBUG_INSANE = 1 << 9, // Track INSANE
128  DEBUG_SMUSH = 1 << 10, // Track SMUSH
129  DEBUG_MOONBASE_AI = 1 << 11, // Moonbase AI
130  DEBUG_NETWORK = 1 << 12 // Track Networking
131 };
132 
133 struct VerbSlot;
134 struct ObjectData;
135 
136 enum {
144 
150 
157 
166  //
167 };
168 
169 enum {
170  MBS_LEFT_CLICK = 0x8000,
171  MBS_RIGHT_CLICK = 0x4000,
172  MBS_MOUSE_MASK = (MBS_LEFT_CLICK | MBS_RIGHT_CLICK),
173  MBS_MAX_KEY = 0x0200
174 };
175 
176 struct SentenceTab {
177  byte verb;
178  byte preposition;
179  uint16 objectA;
180  uint16 objectB;
181  uint8 freezeCount;
182 };
183 
184 struct StringSlot {
185  int16 xpos;
186  int16 ypos;
187  int16 right;
188  int16 height;
189  byte color;
190  byte charset;
191  bool center;
192  bool overhead;
193  bool no_talk_anim;
194  bool wrapping;
195 };
196 
198  // The 'default' values for this string slot. This is used so that the
199  // string slot can temporarily be set to different values, and then be
200  // easily reset to a previously set default.
201  StringSlot _default;
202 
203  void saveDefault() {
204  StringSlot &s = *this;
205  _default = s;
206  }
207 
208  void loadDefault() {
209  StringSlot &s = *this;
210  s = _default;
211  }
212 };
213 
215  bool _screenScroll;
216  uint _objectRedrawCount;
217  uint _objectStripRedrawCount;
218  uint _actorRedrawCount;
219  uint _actorLimbRedrawDrawCount;
220 
221 };
222 
223 enum WhereIsObject {
224  WIO_NOT_FOUND = -1,
225  WIO_INVENTORY = 0,
226  WIO_ROOM = 1,
227  WIO_GLOBAL = 2,
228  WIO_LOCAL = 3,
229  WIO_FLOBJECT = 4
230 };
231 
233  uint32 date;
234  uint16 time;
235  uint32 playtime;
236 };
237 
238 enum UserStates {
239  USERSTATE_SET_FREEZE = 0x01, // freeze scripts if USERSTATE_FREEZE_ON is set, unfreeze otherwise
240  USERSTATE_SET_CURSOR = 0x02, // shows cursor if USERSTATE_CURSOR_ON is set, hides it otherwise
241  USERSTATE_SET_IFACE = 0x04, // change user-interface (sentence-line, inventory, verb-area)
242  USERSTATE_FREEZE_ON = 0x08, // only interpreted if USERSTATE_SET_FREEZE is set
243  USERSTATE_CURSOR_ON = 0x10, // only interpreted if USERSTATE_SET_CURSOR is set
244  USERSTATE_IFACE_SENTENCE = 0x20, // only interpreted if USERSTATE_SET_IFACE is set
245  USERSTATE_IFACE_INVENTORY = 0x40, // only interpreted if USERSTATE_SET_IFACE is set
246  USERSTATE_IFACE_VERBS = 0x80 // only interpreted if USERSTATE_SET_IFACE is set
247 };
248 
249 #define USERSTATE_IFACE_ALL (USERSTATE_IFACE_SENTENCE | USERSTATE_IFACE_INVENTORY | USERSTATE_IFACE_VERBS)
250 
256 enum ResType {
257  rtInvalid = 0,
258  rtFirst = 1,
259  rtRoom = 1,
260  rtScript = 2,
261  rtCostume = 3,
262  rtSound = 4,
263  rtInventory = 5,
264  rtCharset = 6,
265  rtString = 7,
266  rtVerb = 8,
267  rtActorName = 9,
268  rtBuffer = 10,
269  rtScaleTable = 11,
270  rtTemp = 12,
271  rtFlObject = 13,
272  rtMatrix = 14,
273  rtBox = 15,
274  rtObjectName = 16,
275  rtRoomScripts = 17,
276  rtRoomImage = 18,
277  rtImage = 19,
278  rtTalkie = 20,
279  rtSpoolBuffer = 21,
280  rtLast = 21
281 };
282 
283 typedef uint16 ResId;
284 
285 class ResourceManager;
286 
327 #define PIT_BASE_FREQUENCY 1193182.0 // In Hz
328 #define PIT_V1_DIVISOR 65536.0
329 #define PIT_V2_4_DIVISOR 5041.0
330 #define PIT_V5_6_ORCHESTRATOR_DIVISOR 4096.0
331 #define PIT_V5_6_SUBTIMER_INC 3433.0
332 #define PIT_V5_SUBTIMER_THRESH 4167.0
333 #define PIT_V6_SAMNMAX_SUBTIMER_THRESH 4167.0
334 #define PIT_V6_DOTT_SUBTIMER_THRESH 4237.0
335 #define PIT_V7_ORCHESTRATOR_DIVISOR 3977.0
336 #define PIT_V7_SUBTIMER_INC 3977.0
337 #define PIT_V7_SUBTIMER_THRESH 4971.0
338 
339 #define LOOM_STEAM_CDDA_RATE 240.0
340 
354 #define AMIGA_NTSC_VBLANK_RATE 240.0
355 #define AMIGA_PAL_VBLANK_RATE 200.0
356 
361 #define GAME_PROPER_SAVE 201
362 #define GAME_FAILED_SAVE 202
363 #define GAME_PROPER_LOAD 203
364 #define GAME_FAILED_LOAD 204
365 
370 #define GUI_PAGE_MAIN 0
371 #define GUI_PAGE_SAVE 1
372 #define GUI_PAGE_LOAD 2
373 #define GUI_PAGE_RESTART 3 // Sega CD
374 #define GUI_PAGE_CODE_CONFIRM 4 // Sega CD
375 #define GUI_PAGE_INVALID_CODE 5 // Sega CD
376 
377 #define GUI_CTRL_FIRST_SG 1
378 #define GUI_CTRL_LAST_SG 9
379 #define GUI_CTRL_SAVE_BUTTON 10
380 #define GUI_CTRL_LOAD_BUTTON 11
381 #define GUI_CTRL_PLAY_BUTTON 12
382 #define GUI_CTRL_QUIT_BUTTON 13
383 #define GUI_CTRL_OK_BUTTON 14
384 #define GUI_CTRL_CANCEL_BUTTON 15
385 #define GUI_CTRL_ARROW_UP_BUTTON 16
386 #define GUI_CTRL_ARROW_DOWN_BUTTON 17
387 #define GUI_CTRL_PATH_BUTTON 18
388 #define GUI_CTRL_MUSIC_SLIDER 19
389 #define GUI_CTRL_SPEECH_SLIDER 20
390 #define GUI_CTRL_SFX_SLIDER 21
391 #define GUI_CTRL_TEXT_SPEED_SLIDER 22
392 #define GUI_CTRL_DISPLAY_TEXT_CHECKBOX 23
393 #define GUI_CTRL_SPOOLED_MUSIC_CHECKBOX 24
394 #define GUI_CTRL_OUTER_BOX 26
395 #define GUI_CTRL_INNER_BOX 27
396 
397 // Sega CD
398 #define GUI_CTRL_NUMPAD_1 1
399 #define GUI_CTRL_NUMPAD_2 2
400 #define GUI_CTRL_NUMPAD_3 3
401 #define GUI_CTRL_NUMPAD_4 4
402 #define GUI_CTRL_NUMPAD_5 5
403 #define GUI_CTRL_NUMPAD_6 6
404 #define GUI_CTRL_NUMPAD_7 7
405 #define GUI_CTRL_NUMPAD_8 8
406 #define GUI_CTRL_NUMPAD_9 9
407 #define GUI_CTRL_NUMPAD_0 10
408 #define GUI_CTRL_RESTART_BUTTON 13
409 #define GUI_CTRL_ARROW_LEFT_BUTTON 16
410 #define GUI_CTRL_ARROW_RIGHT_BUTTON 17
411 #define GUI_CTRL_NUMPAD_BACK 23
412 
413 enum GUIString {
414  gsPause = 0,
415  gsVersion = 1,
416  gsTextSpeedSlider = 2,
417  gsRestart = 3,
418  gsQuitPrompt = 4,
419  gsSave = 5,
420  gsLoad = 6,
421  gsPlay = 7,
422  gsCancel = 8,
423  gsQuit = 9,
424  gsOK = 10,
425  gsMustName = 11,
426  gsGameNotSaved = 12,
427  gsGameNotLoaded = 13,
428  gsSaving = 14,
429  gsLoading = 15,
430  gsNamePrompt = 16,
431  gsSelectLoadPrompt = 17,
432  gsReplacePrompt = 18,
433  gsYes = 20,
434  gsNo = 21,
435  gsIMuseBuffer = 22,
436  gsVoiceAndText = 23,
437  gsTextDisplayOnly = 24,
438  gsVoiceOnly = 25,
439  gsYesKey = 26,
440  gsMusicVolumeSlider = 27,
441  gsVoiceVolumeSlider = 28,
442  gsSfxVolumeSlider = 29,
443  gsHeap = 30,
444  gsSavePath = 31,
445  gsTitle = 32,
446  gsDisabled = 33,
447  gsMusic = 34,
448  gsVoice = 35,
449  gsSfx = 36,
450  gsTextSpeed = 37,
451  gsDisplayText = 38,
452  gsSpooledMusic = 39,
453  gsInsertSaveDisk = 40,
454  gsSnapOn = 41,
455  gsSnapOff = 42,
456  gsRecalJoystick = 43,
457  gsMouseMode = 44,
458  gsMouseOn = 45,
459  gsMouseOff = 46,
460  gsJoystickOn = 47,
461  gsJoystickOff = 48,
462  gsSoundsOn = 49,
463  gsSoundsOff = 50,
464  gsVGAMode = 51,
465  gsEGAMode = 52,
466  gsCGAMode = 53,
467  gsHerculesMode = 54,
468  gsTandyMode = 55,
469  gsCurrentPasscode = 56,
470  gsEnterPasscode = 57,
471  gsConfirmPasscode = 58,
472  gsInvalidPasscode = 59,
473  gsSlowFast = 60,
474  gsRestartGame = 61,
475  gsHeapExt = 62,
476 };
477 
479  int relativeCenterX;
480  int relativeCenterY;
481  int xPos;
482  int yPos;
483  int normalFillColor;
484  int topLineColor;
485  int bottomLineColor;
486  int leftLineColor;
487  int rightLineColor;
488  int normalTextColor;
489  int highlightedTextColor;
490  int highlightedFillColor;
491  bool centerText;
492  Common::String label;
493  bool doubleLinesFlag;
494 };
495 
496 enum ScummAction {
497  kScummActionNone,
498  kScummActionInsaneDownLeft,
499  kScummActionInsaneDown,
500  kScummActionInsaneDownRight,
501  kScummActionInsaneLeft,
502  kScummActionInsaneRight,
503  kScummActionInsaneUpLeft,
504  kScummActionInsaneUp,
505  kScummActionInsaneUpRight,
506  kScummActionInsaneAttack,
507  kScummActionInsaneSwitch,
508  kScummActionInsaneCheat,
509 
510  kScummActionCount
511 };
512 
513 extern const char *const insaneKeymapId;
514 
518 class ScummEngine : public Engine, public Common::Serializable {
519  friend class ScummDebugger;
520  friend class CharsetRenderer;
521  friend class CharsetRendererClassic;
522  friend class CharsetRendererTownsClassic;
523  friend class ResourceManager;
524  friend class MacGuiImpl;
525  friend class MacIndy3Gui;
526  friend class MacLoomGui;
527 
528 public:
529  /* Put often used variables at the top.
530  * That results in a shorter form of the opcode
531  * on some architectures. */
532  IMuse *_imuse = nullptr;
533  IMuseDigital *_imuseDigital = nullptr;
534  MusicEngine *_musicEngine = nullptr;
535  Player_Towns *_townsPlayer = nullptr;
536  Sound *_sound = nullptr;
537 
538  VerbSlot *_verbs = nullptr;
539  ObjectData *_objs = nullptr;
540 
541  // Core variables
542  GameSettings _game;
543  uint8 _gameMD5[16];
544 
547 
549  Gdi *_gdi = nullptr;
550 
552  ResourceManager *_res = nullptr;
553  int _insideCreateResource = 0; // Counter for HE sound
554 
555  int32 _activeEnhancements = kEnhGameBreakingBugFixes;
556  bool _useOriginalGUI = true;
557  bool _enableAudioOverride = false;
558  bool _enableCOMISong = false;
559  bool _isAmigaPALSystem = false;
560  bool _quitFromScriptCmd = false;
561 
562  Common::Keymap *_insaneKeymap;
563 
564 protected:
566 
567  bool _oldSoundsPaused = false;
568 
569 public:
570  // Constructor / Destructor
571  ScummEngine(OSystem *syst, const DetectorResult &dr);
572  ~ScummEngine() override;
573 
574  // Engine APIs
575  Common::Error init();
576  Common::Error go();
577  Common::Error run() override {
578  Common::Error err;
579  err = init();
580  if (err.getCode() != Common::kNoError)
581  return err;
582  return go();
583  }
584 
585  void errorString(const char *buf_input, char *buf_output, int buf_output_size) override;
586  bool hasFeature(EngineFeature f) const override;
587  bool enhancementEnabled(int32 cls);
588  void syncSoundSettings() override;
589 
590  Common::Error loadGameState(int slot) override;
591  bool canLoadGameStateCurrently(Common::U32String *msg = nullptr) override;
592  Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
593  bool canSaveGameStateCurrently(Common::U32String *msg = nullptr) override;
594 
595  void pauseEngineIntern(bool pause) override;
596 
597 protected:
598  virtual void setupScumm(const Common::Path &macResourceFile);
599  virtual void resetScumm();
600 
601  virtual void setupScummVars();
602  virtual void resetScummVars();
603  void setVideoModeVarToCurrentConfig();
604  void setSoundCardVarToCurrentConfig();
605 
606  void setupCharsetRenderer(const Common::Path &macFontFile);
607  void setupCostumeRenderer();
608 
609  virtual void loadLanguageBundle();
610  void loadCJKFont();
611  void loadKorFont();
612  void setupMusic(int midi);
613  void setTalkSpeed(int talkspeed);
614  int getTalkSpeed();
615 
616  // Scumm main loop & helper functions.
617  virtual void scummLoop(int delta);
618  virtual void scummLoop_updateScummVars();
619  virtual void scummLoop_handleSaveLoad();
620  virtual void scummLoop_handleDrawing();
621  virtual void scummLoop_handleActors() = 0;
622  virtual void scummLoop_handleEffects();
623  virtual void scummLoop_handleSound();
624 
625  virtual void runBootscript();
626 
627  virtual void terminateSaveMenuScript() {};
628 
629  // Event handling
630 public:
631  void parseEvents(); // Used by IMuseDigital::startSound
632 protected:
633  virtual void parseEvent(Common::Event event);
634 
635  void waitForTimer(int quarterFrames, bool freezeMacGui = false);
636  uint32 _lastWaitTime;
637 
638  void setTimerAndShakeFrequency();
639 
645  uint32 getIntegralTime(double fMsecs);
646  double _msecFractParts = 0.0;
647 
648  virtual void processInput();
649  virtual void processKeyboard(Common::KeyState lastKeyHit);
650  virtual void clearClickedStatus();
651 
652  // Cursor/palette
653  virtual void updateCursor();
654  virtual void animateCursor() {}
655  virtual void updatePalette();
656  virtual void setDefaultCursor() {};
657  virtual void setCursorTransparency(int a) {};
658  virtual void resetCursors() {}
659  virtual void setCursorHotspot(int x, int y) {}
660  virtual void setCursorFromBuffer(const byte *ptr, int width, int height, int pitch, bool preventScale = false) {}
661 
662 
663 public:
664  void pauseGame();
665  void restart();
666  bool isUsingOriginalGUI();
667  bool isMessageBannerActive(); // For Indy4 Jap character shadows
668 
669  bool _isIndy4Jap = false;
670 
671 protected:
672  Dialog *_pauseDialog = nullptr;
673  Dialog *_messageDialog = nullptr;
674  Dialog *_versionDialog = nullptr;
675 
676  void confirmExitDialog();
677  void confirmRestartDialog();
678  void pauseDialog();
679  void messageDialog(const Common::U32String &message);
680  void versionDialog();
681 
682  // Original GUI
683  int32 _bannerColors[50]; // Colors for the original GUI
684  byte *_bannerMem = nullptr;
685  uint32 _bannerMemSize = 0;
686  int _bannerSaveYStart = 0;
687 
688  bool _messageBannerActive = false;
689  bool _comiQuitMenuIsOpen = false;
690  bool _closeBannerAndQueryQuitFlag = false;
691 
692  // The followings are needed for MI1 FM-Towns
693  byte *_textSurfBannerMem = nullptr;
694  uint32 _textSurfBannerMemSize = 0;
695 
696  InternalGUIControl _internalGUIControls[30];
697 
698  // Special GUI strings
699  const char _emptyMsg[1] = {'\0'};
700  const char _uncheckedBox[2] = {' ', '\0'};
701  const char _checkedBox[2] = {'x', '\0'};
702  const char _arrowUp[2] = {'\x18', '\0'};
703  const char _arrowDown[2] = {'\x19', '\0'};
704  const char _arrowLeft[2] = {'\x3c', '\0'};
705  const char _arrowRight[2] = {'\x3d', '\0'};
706 
707  Common::StringArray _savegameNames;
708  int _menuPage = 0;
709  int _mainMenuSavegameLabel = 1;
710  int _curDisplayedSaveSlotPage = 0;
711  int _firstSaveStateOfList = 0; // For LOOM VGA
712  bool _mainMenuIsActive = false;
713  bool _quitByGUIPrompt = false;
714  char _mainMenuMusicSlider[17];
715  char _mainMenuSpeechSlider[17];
716  char _mainMenuSfxSlider[17];
717  char _mainMenuTextSpeedSlider[17];
718  char _mainMenuSegaCDPasscode[5];
719  int _spooledMusicIsToBeEnabled = 1;
720  int _saveScriptParam = 0;
721  int _guiCursorAnimCounter = 0;
722  int _v5VoiceMode = 0;
723 
724  // Fake flags just for sub v5 GUIs
725  int _internalSpeakerSoundsAreOn = 1;
726  int _guiMouseFlag = 1;
727  int _guiJoystickFlag = 1;
728 
729  bool _mixerMutedByGUI = false;
730 
731  Graphics::Surface _savegameThumbnail;
732  byte *_tempTextSurface = nullptr;
733  byte *_tempMainSurface = nullptr;
734  byte *_tempVerbSurface = nullptr;
735  bool _postGUICharMask = false;
736 
737  // Saved cursor pre and post GUI
738  byte *_curGrabbedCursor = nullptr;
739  int8 _oldCursorState = 0;
740  int _curCursorState = 0;
741  int _curCursorWidth = 0;
742  int _curCursorHeight = 0;
743  int _curCursorHotspotX = 0;
744  int _curCursorHotspotY = 0;
745 
746  virtual void setSnailCursor() {}
747 
748  void initBanners();
749  Common::KeyState showBannerAndPause(int bannerId, int32 waitTime, const char *msg, ...);
750  Common::KeyState showOldStyleBannerAndPause(const char *msg, int color, int32 waitTime);
751  Common::KeyState printMessageAndPause(const char *msg, int color, int32 waitTime, bool drawOnSentenceLine);
752 
753  void clearBanner();
754  void setBannerColors(int bannerId, byte r, byte g, byte b);
755  virtual int getBannerColor(int bannerId);
756  void setUpInternalGUIControl(int id, int normalFillColor, int normalTextColor,
757  int topLineColor, int bottomLineColor, int leftLineColor, int rightLineColor,
758  int highlightedTextColor, int highlightedFillColor,
759  int anchorPointX, int anchorPointY, int x, int y, const char *label, bool centerFlag, bool unknownFlag);
760  void drawInternalGUIControl(int id, bool highlightColor);
761  int getInternalGUIControlFromCoordinates(int x, int y);
762  virtual bool isSmushActive() { return false; }
763  virtual bool isInsaneActive() { return false; }
764 
765  virtual void queryQuit(bool returnToLauncher);
766  virtual void queryRestart();
767  virtual const char *getGUIString(int stringId);
768  void waitForBannerInput(int32 waitTime, Common::KeyState &ks, bool &leftBtnClicked, bool &rightBtnClicked, bool handleMouseWheel = false);
769  virtual int getGUIStringHeight(const char *str);
770  virtual int getGUIStringWidth(const char *str);
771  virtual void drawGUIText(const char *buttonString, Common::Rect *clipRect, int textXPos, int textYPos, int textColor, bool centerFlag);
772  void getSliderString(int stringId, int value, char *sliderString, int size);
773  virtual int getMusicVolume();
774  virtual int getSpeechVolume();
775  virtual int getSFXVolume();
776  virtual void setMusicVolume(int volume);
777  virtual void setSpeechVolume(int volume);
778  virtual void setSFXVolume(int volume);
779  virtual void toggleVoiceMode();
780  virtual void handleLoadDuringSmush() {}
781  virtual void setSkipVideo(int value) {}
782 
783  void showMainMenu();
784  virtual void setUpMainMenuControls();
785  void setUpMainMenuControlsSegaCD();
786  void setUpMainMenuControlsIndy4Jap();
787  void drawMainMenuControls();
788  void drawMainMenuControlsSegaCD();
789  void updateMainMenuControls();
790  void updateMainMenuControlsSegaCD();
791  void drawMainMenuTitle(const char *title);
792  bool executeMainMenuOperation(int op, int mouseX, int mouseY, bool &hasLoadedState);
793  bool executeMainMenuOperationSegaCD(int op, int mouseX, int mouseY, bool &hasLoadedState);
794  bool shouldHighlightLabelAndWait(int clickedControl);
795  void fillSavegameLabels();
796  bool canWriteGame(int slotId);
797  bool userWriteLabelRoutine(Common::KeyState &ks, bool &leftMsClicked, bool &rightMsClicked);
798  void saveCursorPreMenu();
799  void restoreCursorPostMenu();
800  void saveSurfacesPreGUI();
801  void restoreSurfacesPostGUI();
802  void showDraftsInventory();
803  void setUpDraftsInventory();
804  void drawDraftsInventory();
805 
806 public:
807  char displayMessage(const char *altButton, MSVC_PRINTF const char *message, ...) GCC_PRINTF(3, 4);
808  bool displayMessageYesNo(MSVC_PRINTF const char *message, ...) GCC_PRINTF(2, 3);
809 
810 protected:
811  byte _fastMode = 0;
812 
813  byte _numActors = 0;
814  Actor **_actors = nullptr; // Has _numActors elements
815  Actor **_sortedActors = nullptr;
816 
817  byte *_arraySlot = nullptr;
818  uint16 *_inventory = nullptr;
819  uint16 *_newNames = nullptr;
820 public:
821  // VAR is a wrapper around scummVar, which attempts to include additional
822  // useful information should an illegal var access be detected.
823  #define VAR(x) scummVar(x, #x, __FILE__, __LINE__)
824  int32& scummVar(byte var, const char *varName, const char *file, int line) {
825  if (var == 0xFF) {
826  error("Illegal access to variable %s in file %s, line %d", varName, file, line);
827  }
828  return _scummVars[var];
829  }
830  int32 scummVar(byte var, const char *varName, const char *file, int line) const {
831  if (var == 0xFF) {
832  error("Illegal access to variable %s in file %s, line %d", varName, file, line);
833  }
834  return _scummVars[var];
835  }
836 
837 protected:
838  int16 _varwatch = 0;
839  int32 *_roomVars = nullptr;
840  int32 *_scummVars = nullptr;
841  byte *_bitVars = nullptr;
842 
843  /* Global resource tables */
844  int _numVariables = 0;
845  int _numBitVariables = 0;
846  int _numLocalObjects = 0;
847  int _numGlobalObjects = 0;
848  int _numArray = 0;
849  int _numVerbs = 0;
850  int _numFlObject = 0;
851  int _numInventory = 0;
852  int _numNewNames = 0;
853  int _numGlobalScripts = 0;
854  int _numRoomVariables = 0;
855  int _numPalettes = 0;
856  int _numSprites = 0;
857  int _numTalkies = 0;
858  int _numUnk = 0;
859  int _HEHeapSize = 0;
860 public:
861  int _numLocalScripts = 60, _numImages = 0, _numRooms = 0, _numScripts = 0, _numSounds = 0; // Used by HE games
862  int _numCostumes = 0; // FIXME - should be protected, used by Actor::remapActorPalette
863  int32 _numCharsets = 0; // FIXME - should be protected, used by CharsetRenderer
864 
865  BaseCostumeLoader *_costumeLoader = nullptr;
866  BaseCostumeRenderer *_costumeRenderer = nullptr;
867 
868  int _NESCostumeSet = 0;
869  void NES_loadCostumeSet(int n);
870  byte *_NEScostdesc = nullptr, *_NEScostlens = nullptr, *_NEScostoffs = nullptr, *_NEScostdata = nullptr;
871  byte _NESPatTable[2][4096];
872  byte _NESPalette[2][16];
873  byte _NESBaseTiles = 0;
874 
875  int _NESStartStrip = 0;
876 
877 protected:
878  int _curPalIndex = 0;
879 
880 public:
881  byte _currentRoom = 0; // FIXME - should be protected but Actor::isInCurrentRoom uses it
882  int _roomResource = 0; // FIXME - should be protected but Sound::pauseSounds uses it
883  bool _egoPositioned = false; // Used by Actor::putActor, hence public
884 
885  FilenamePattern _filenamePattern;
886 
887  virtual Common::Path generateFilename(const int room) const;
888 
889 protected:
890  Common::KeyState _keyPressed;
891  bool _keyDownMap[512]; // FIXME - 512 is a guess. it's max(kbd.ascii)
892  bool _actionMap[kScummActionCount];
893 
894  Common::Point _mouse;
895  Common::Point _virtualMouse;
896 
897  uint16 _mouseAndKeyboardStat = 0;
898  byte _leftBtnPressed = 0, _rightBtnPressed = 0;
899 
900  int _mouseWheelFlag = 0; // For original save/load dialog only
901 
902  bool _setupIsComplete = false;
903 
908  uint32 _lastInputScriptTime = 0;
909 
911  int _bootParam = 0;
912 
913  // Various options useful for debugging
914  bool _dumpScripts = false;
915  bool _hexdumpScripts = false;
916  bool _showStack = false;
917  bool _debugMode = false;
918 
919  // Save/Load class - some of this may be GUI
920  byte _saveLoadFlag = 0, _saveLoadSlot = 0;
921  uint32 _lastSaveTime = 0;
922  bool _saveTemporaryState = false;
923  bool _pauseSoundsDuringSave = true;
924  bool _loadFromLauncher = false;
925  bool _videoModeChanged = false;
926  Common::String _saveLoadFileName;
927  Common::String _saveLoadDescription;
928 
929  bool saveState(Common::WriteStream *out, bool writeHeader = true);
930  bool saveState(int slot, bool compat, Common::String &fileName);
931  bool loadState(int slot, bool compat);
932  bool loadState(int slot, bool compat, Common::String &fileName);
933  void saveLoadWithSerializer(Common::Serializer &s) override;
934  void saveResource(Common::Serializer &ser, ResType type, ResId idx);
935  void loadResource(Common::Serializer &ser, ResType type, ResId idx);
936  void loadResourceOLD(Common::Serializer &ser, ResType type, ResId idx); // "Obsolete"
937 
938  void copyHeapSaveGameToFile(int slot, const char *saveName);
939  bool changeSavegameName(int slot, char *newName);
940  virtual Common::SeekableReadStream *openSaveFileForReading(int slot, bool compat, Common::String &fileName);
941  virtual Common::SeekableWriteStream *openSaveFileForWriting(int slot, bool compat, Common::String &fileName);
942 
943  Common::String makeSavegameName(int slot, bool temporary) const {
944  return makeSavegameName(_targetName, slot, temporary);
945  }
946 
947  int getKeyState(int key);
948  int getActionState(ScummAction action);
949 
950 public:
951  static Common::String makeSavegameName(const Common::String &target, int slot, bool temporary);
952 
953  bool getSavegameName(int slot, Common::String &desc);
954  void listSavegames(bool *marks, int num);
955 
956  void requestSave(int slot, const Common::String &name);
957  void requestLoad(int slot);
958 
959  Common::String getTargetName() const { return _targetName; }
960  bool canPauseSoundsDuringSave() const { return _pauseSoundsDuringSave; }
961 
962 // thumbnail + info stuff
963 public:
964  static bool querySaveMetaInfos(const char *target, int slot, int heversion, Common::String &desc, Graphics::Surface *&thumbnail, SaveStateMetaInfos *&timeInfos);
965 
966 protected:
967  void saveInfos(Common::WriteStream *file);
968  static bool loadInfos(Common::SeekableReadStream *file, SaveStateMetaInfos *stuff);
969 
970 protected:
971  /* Script VM - should be in Script class */
972  uint32 _localScriptOffsets[1024];
973  const byte *_scriptPointer = nullptr;
974  const byte *_scriptOrgPointer = nullptr;
975  const byte * const *_lastCodePtr = nullptr;
976  byte _opcode = 0;
977  bool _debug = false;
978  byte _currentScript = 0xFF; // Let debug() work on init stage
979  int _scummStackPos = 0;
980  int _vmStack[256];
981 
982  char _engineVersionString[50];
983  char _dataFileVersionString[50];
984 
985  OpcodeEntry _opcodes[256];
986 
987  virtual void setupOpcodes() = 0;
988  void executeOpcode(byte i);
989  const char *getOpcodeDesc(byte i);
990 
991  void initializeLocals(int slot, int *vars);
992  int getScriptSlot();
993 
994  void startScene(int room, Actor *a, int b);
995  bool startManiac();
996 
997 public:
998  void runScript(int script, bool freezeResistant, bool recursive, int *lvarptr, int cycle = 0);
999  void stopScript(int script);
1000  void nukeArrays(byte scriptSlot);
1001 
1002 protected:
1003  void runObjectScript(int script, int entry, bool freezeResistant, bool recursive, int *vars, int slot = -1, int cycle = 0);
1004  void runScriptNested(int script);
1005  void executeScript();
1006  void updateScriptPtr();
1007  virtual void runInventoryScript(int i);
1008  virtual void checkAndRunSentenceScript();
1009  void runExitScript();
1010  void runEntryScript();
1011  void runQuitScript();
1012  void runAllScripts();
1013  void freezeScripts(int scr);
1014  void unfreezeScripts();
1015 
1016  bool isScriptInUse(int script) const;
1017  bool isRoomScriptRunning(int script) const;
1018  bool isScriptRunning(int script) const;
1019 
1020  void killAllScriptsExceptCurrent();
1021  void killScriptsAndResources();
1022  void decreaseScriptDelay(int amount);
1023 
1024  void stopObjectCode();
1025  void stopObjectScript(int script);
1026 
1027  void getScriptBaseAddress();
1028  void resetScriptPointer();
1029  int getVerbEntrypoint(int obj, int entry);
1030 
1031  void refreshScriptPointer();
1032  byte fetchScriptByte();
1033  virtual uint fetchScriptWord();
1034  virtual int fetchScriptWordSigned();
1035  uint fetchScriptDWord();
1036  int fetchScriptDWordSigned();
1037  void ignoreScriptWord() { fetchScriptWord(); }
1038  void ignoreScriptByte() { fetchScriptByte(); }
1039  void push(int a);
1040  int pop();
1041  virtual int readVar(uint var);
1042  virtual void writeVar(uint var, int value);
1043  // SCUMM 1/2
1044  virtual void resetSentence() {}
1045 
1046 protected:
1047  virtual void beginCutscene(int *args);
1048  virtual void endCutscene();
1049  void abortCutscene();
1050  void beginOverride();
1051  void endOverride();
1052 
1053  void copyScriptString(byte *dst);
1054  int resStrLen(const byte *src);
1055  void doSentence(int c, int b, int a);
1056 
1057  /* Should be in Resource class */
1058  BaseScummFile *_fileHandle = nullptr;
1059  uint32 _fileOffset = 0;
1060 public:
1063  Common::Path _macCursorFile;
1064 
1065  bool openFile(BaseScummFile &file, const Common::Path &filename, bool resourceFile = false);
1066 
1068  bool isMacM68kIMuse() const;
1069 
1070 protected:
1071  int _resourceHeaderSize = 8;
1072  byte _resourceMapper[128];
1073  const byte *_resourceLastSearchBuf; // FIXME: need to put it to savefile?
1074  uint32 _resourceLastSearchSize; // FIXME: need to put it to savefile?
1075 
1076  virtual void allocateArrays();
1077  void openRoom(int room);
1078  void closeRoom();
1079  void deleteRoomOffsets();
1080  virtual void readRoomsOffsets();
1081  void askForDisk(const Common::Path &filename, int disknum);
1082  bool openResourceFile(const Common::Path &filename, byte encByte);
1083 
1084  void loadPtrToResource(ResType type, ResId idx, const byte *ptr);
1085  virtual int readResTypeList(ResType type);
1086 // void allocResTypeData(ResType type, uint32 tag, int num, int mode);
1087 // byte *createResource(int type, int index, uint32 size);
1088  int loadResource(ResType type, ResId idx);
1089 // void nukeResource(ResType type, ResId idx);
1090  int getResourceRoomNr(ResType type, ResId idx);
1091  virtual uint32 getResourceRoomOffset(ResType type, ResId idx);
1092 
1093 public:
1094  int getResourceSize(ResType type, ResId idx);
1095  byte *getResourceAddress(ResType type, ResId idx);
1096  virtual byte *getStringAddress(ResId idx);
1097  byte *getStringAddressVar(int i);
1098  void ensureResourceLoaded(ResType type, ResId idx);
1099 
1100 protected:
1101  Common::Mutex _resourceAccessMutex; // Used in getResourceSize(), getResourceAddress() and findResource()
1102  // to avoid race conditions between the audio thread of Digital iMUSE
1103  // and the main SCUMM thread
1104 
1105  int readSoundResource(ResId idx);
1106  int readSoundResourceSmallHeader(ResId idx);
1107  bool isResourceInUse(ResType type, ResId idx) const;
1108 
1109  virtual void setupRoomSubBlocks();
1110  virtual void resetRoomSubBlocks();
1111 
1112  virtual void clearRoomObjects();
1113  virtual void resetRoomObjects();
1114  virtual void resetRoomObject(ObjectData *od, const byte *room, const byte *searchptr = NULL);
1115 
1116  virtual void readArrayFromIndexFile();
1117  virtual void readMAXS(int blockSize) = 0;
1118  virtual void readGlobalObjects();
1119  virtual void readIndexFile();
1120  virtual void readIndexBlock(uint32 block, uint32 itemsize);
1121  virtual void loadCharset(int i);
1122  void nukeCharset(int i);
1123 
1124  int _lastLoadedRoom = 0;
1125 public:
1126  const byte *findResourceData(uint32 tag, const byte *ptr);
1127  const byte *findResource(uint32 tag, const byte *ptr);
1128  void applyWorkaroundIfNeeded(ResType type, int idx);
1129  bool verifyMI2MacBootScript();
1130  bool verifyMI2MacBootScript(byte *buf, int size);
1131  bool tryPatchMI1CannibalScript(byte *buf, int size);
1132 
1133  int getResourceDataSize(const byte *ptr) const;
1134  void dumpResource(const char *tag, int index, const byte *ptr, int length = -1);
1135 
1136 public:
1137  /* Should be in Object class */
1138  byte OF_OWNER_ROOM = 0;
1139  int getInventorySlot();
1140  int findInventory(int owner, int index);
1141  int getInventoryCount(int owner);
1142 
1143 protected:
1144  byte *_objectOwnerTable = nullptr, *_objectRoomTable = nullptr, *_objectStateTable = nullptr;
1145  int _numObjectsInRoom = 0;
1146 
1147 public:
1148  uint32 *_classData = nullptr;
1149 
1150 protected:
1151  void markObjectRectAsDirty(int obj);
1152  virtual void loadFlObject(uint object, uint room);
1153  void nukeFlObjects(int min, int max);
1154  int findFlObjectSlot();
1155  int findLocalObjectSlot();
1156  void addObjectToInventory(uint obj, uint room);
1157  void updateObjectStates();
1158 public:
1159  bool getClass(int obj, int cls) const; // Used in actor.cpp, hence public
1160 protected:
1161  void putClass(int obj, int cls, bool set);
1162  int getState(int obj);
1163  void putState(int obj, int state);
1164  void setObjectState(int obj, int state, int x, int y);
1165  int getOwner(int obj) const;
1166  void putOwner(int obj, int owner);
1167  void setOwnerOf(int obj, int owner);
1168  void clearOwnerOf(int obj);
1169  int getObjectRoom(int obj) const;
1170  virtual bool objIsActor(int obj);
1171  virtual int objToActor(int obj);
1172  virtual int actorToObj(int actor);
1173  int getObjX(int obj);
1174  int getObjY(int obj);
1175  void getObjectWidth(int object, int &width) { int x, y, dir; getObjectXYPos(object, x, y, dir, width); }
1176  void getObjectXYPos(int object, int &x, int &y) { int dir, width; getObjectXYPos(object, x, y, dir, width); }
1177  void getObjectXYPos(int object, int &x, int &y, int &dir) { int width; getObjectXYPos(object, x, y, dir, width); }
1178  void getObjectXYPos(int object, int &x, int &y, int &dir, int &width);
1179  int getObjOldDir(int obj);
1180  int getObjNewDir(int obj);
1181  int getObjectIndex(int object) const;
1182  int getObjectImageCount(int object);
1183  int whereIsObject(int object) const;
1184  int findObject(int x, int y);
1185  void findObjectInRoom(FindObjectInRoom *fo, byte findWhat, uint object, uint room);
1186 public:
1187  int getObjectOrActorWidth(int object, int &width); // Used in v4 and below
1188  int getObjectOrActorXY(int object, int &x, int &y); // Used in actor.cpp, hence public
1189  int getDist(int x, int y, int x2, int y2); // Also used in actor.cpp
1190 protected:
1191 
1192  int getObjActToObjActDist(int a, int b); // Not sure how to handle
1193  const byte *getObjOrActorName(int obj); // these three..
1194  void setObjectName(int obj);
1195 
1196  void addObjectToDrawQue(int object);
1197  void removeObjectFromDrawQue(int object);
1198  void clearDrawObjectQueue();
1199  void processDrawQue();
1200 
1201  virtual void clearDrawQueues();
1202 
1203  uint32 getOBCDOffs(int object) const;
1204  byte *getOBCDFromObject(int obj, bool v0CheckInventory = true);
1205  const byte *getOBIMFromObjectData(const ObjectData &od);
1206  const byte *getObjectImage(const byte *ptr, int state);
1207  virtual int getObjectIdFromOBIM(const byte *obim);
1208 
1209 protected:
1210  /* Should be in Verb class */
1211  uint16 _verbMouseOver = 0;
1212  int8 _userPut = 0;
1213  uint16 _userState = 0;
1214 
1215  virtual void handleMouseOver(bool updateInventory);
1216  virtual void redrawVerbs();
1217  virtual void checkExecVerbs();
1218 
1219  void verbMouseOver(int verb);
1220  int findVerbAtPos(int x, int y) const;
1221  virtual void drawVerb(int verb, int mode);
1222  virtual void runInputScript(int clickArea, int val, int mode);
1223  void restoreVerbBG(int verb);
1224  void drawVerbBitmap(int verb, int x, int y);
1225  int getVerbSlot(int id, int mode) const;
1226  void killVerb(int slot);
1227  void setVerbObject(uint room, uint object, uint verb);
1228 
1229 public:
1230  bool isValidActor(int id) const;
1231 
1232  /* Should be in Actor class */
1233  Actor *derefActor(int id, const char *errmsg = 0) const;
1234  Actor *derefActorSafe(int id, const char *errmsg) const;
1235 
1236 protected:
1237  void walkActors();
1238  void playActorSounds();
1239  void redrawAllActors();
1240  void setActorRedrawFlags();
1241  void putActors();
1242  void showActors();
1243  void resetV1ActorTalkColor();
1244  void resetActorBgs();
1245  virtual void processActors();
1246  void processUpperActors();
1247  virtual int getActorFromPos(int x, int y);
1248 
1249 public:
1250  /* Actor talking stuff */
1251  byte _actorToPrintStrFor = 0, _V1TalkingActor = 0;
1252  int _sentenceNum = 0;
1253  SentenceTab _sentence[NUM_SENTENCE];
1254  StringTab _string[6];
1255  byte _haveMsg = 0;
1256  int16 _talkDelay = 0;
1257  int _NES_lastTalkingActor = 0;
1258  int _NES_talkColor = 0;
1259 
1260  virtual void actorTalk(const byte *msg);
1261  void stopTalk();
1262  int getTalkingActor(); // Wrapper around VAR_TALK_ACTOR for V1 Maniac
1263  void setTalkingActor(int variable);
1264 
1265  // Generic costume code
1266  bool isCostumeInUse(int i) const;
1267 
1268 protected:
1269  /* Should be in Graphics class? */
1270  uint16 _screenB = 0, _screenH = 0;
1271 public:
1272  int _roomHeight = 0, _roomWidth = 0;
1273  int _screenHeight = 0, _screenWidth = 0;
1274  VirtScreen _virtscr[4]; // Virtual screen areas
1275  CameraData camera; // 'Camera' - viewport
1276  bool _cameraIsFrozen = false;
1277 
1278  int _screenStartStrip = 0, _screenEndStrip = 0;
1279  int _screenTop = 0;
1280 
1281  // For Mac versions of 320x200 games:
1282  // these versions rendered at 640x480 without any aspect ratio correction;
1283  // in order to correctly display the games as they should be, we perform some
1284  // offset corrections within the various rendering pipelines.
1285  //
1286  // The only reason I've made _useMacScreenCorrectHeight toggleable is because
1287  // maybe someday the screen correction can be activated or deactivated from the
1288  // ScummVM GUI; but currently I'm not taking that responsibility, after all the
1289  // work done on ensuring that old savegames translate correctly to the new setting... :-P
1290  bool _useMacScreenCorrectHeight = true;
1291  int _screenDrawOffset = 0;
1292 
1293  Common::RenderMode _renderMode;
1294  uint8 _bytesPerPixel = 1;
1295  Graphics::PixelFormat _outputPixelFormat;
1296 
1297 protected:
1298  ColorCycle _colorCycle[16]; // Palette cycles
1299  uint8 _colorUsedByCycle[256];
1300  Graphics::PaletteLookup _pl; // Used by the internal GUI
1301 
1302  uint32 _ENCD_offs = 0, _EXCD_offs = 0;
1303  uint32 _CLUT_offs = 0, _EPAL_offs = 0;
1304  uint32 _IM00_offs = 0, _PALS_offs = 0;
1305 
1306  //ender: fullscreen
1307  bool _fullRedraw = false, _bgNeedsRedraw = false;
1308  bool _screenEffectFlag = false, _completeScreenRedraw = false;
1309  bool _disableFadeInEffect = false;
1310 
1311  struct {
1312  int hotspotX, hotspotY, width, height;
1313  byte animate, animateIndex;
1314  int8 state;
1315  } _cursor;
1316 
1317  // HACK Double the array size to handle 16-bit images.
1318  // this should be dynamically allocated based on game depth instead.
1319  byte _grabbedCursor[16384];
1320  byte _currentCursor = 0;
1321 
1322  byte _newEffect = 0, _switchRoomEffect2 = 0, _switchRoomEffect = 0;
1323  bool _doEffect = false;
1324 
1325  bool _snapScroll = false;
1326 
1327  virtual void setBuiltinCursor(int index) {}
1328 public:
1329  bool isLightOn() const;
1330 
1331  virtual int getCurrentLights() const;
1332 
1333 protected:
1334  void initScreens(int b, int h);
1335  void initVirtScreen(VirtScreenNumber slot, int top, int width, int height, bool twobufs, bool scrollable);
1336  void initBGBuffers(int height);
1337  void initCycl(const byte *ptr); // Color cycle
1338 
1339  void decodeNESBaseTiles();
1340 
1341  void drawObject(int obj, int arg);
1342  void drawRoomObjects(int arg);
1343  void drawRoomObject(int i, int arg);
1344  void drawBox(int x, int y, int x2, int y2, int color);
1345  void drawLine(int x1, int y1, int x2, int y2, int color);
1346  void drawPixel(VirtScreen *vs, int x, int y, int16 color, bool useBackbuffer = false);
1347 
1348  void moveScreen(int dx, int dy, int height);
1349 
1350  void restoreBackground(Common::Rect rect, byte backcolor = 0);
1351  void redrawBGStrip(int start, int num);
1352  virtual void redrawBGAreas();
1353 
1354  void cameraMoved();
1355  void setCameraAtEx(int at);
1356  virtual void setCameraAt(int pos_x, int pos_y);
1357  virtual void setCameraFollows(Actor *a, bool setCamera = false);
1358  virtual void moveCamera();
1359  virtual void panCameraTo(int x, int y);
1360  void clampCameraPos(Common::Point *pt);
1361  void actorFollowCamera(int act);
1362 
1363  const byte *getPalettePtr(int palindex, int room);
1364 
1365  void setPaletteFromTable(const byte *ptr, int numcolor, int firstIndex = 0);
1366  void resetPalette();
1367 
1368  void setCurrentPalette(int pal);
1369  void setRoomPalette(int pal, int room);
1370  void setPCEPaletteFromPtr(const byte *ptr);
1371  void setAmigaPaletteFromPtr(const byte *ptr);
1372  virtual void setPaletteFromPtr(const byte *ptr, int numcolor = -1);
1373  void setV1ColorTable(int renderMode);
1374 
1375  virtual void setPalColor(int index, int r, int g, int b);
1376  void setDirtyColors(int min, int max);
1377  const byte *findPalInPals(const byte *pal, int index);
1378  void swapPalColors(int a, int b);
1379  virtual void copyPalColor(int dst, int src);
1380  void cyclePalette();
1381  void stopCycle(int i);
1382  virtual void palManipulateInit(int resID, int start, int end, int time);
1383  void palManipulate();
1384  uint32 findClosestPaletteColor(byte *palette, int paletteLength, byte r, byte g, byte b);
1385 
1386 public:
1387  uint8 *getHEPaletteSlot(uint16 palSlot);
1388  uint16 get16BitColor(uint8 r, uint8 g, uint8 b);
1389  uint32 getPaletteColorFromRGB(byte *palette, byte r, byte g, byte b);
1390  uint32 getPackedRGBColorFromPalette(byte *palette, uint32 color);
1391  void fetchBlackAndWhite(uint32 &black, uint32 &white, byte *palette, int paletteEntries);
1392  int remapPaletteColor(int r, int g, int b, int threshold); // Used by Actor::remapActorPalette
1393  void readPCEPalette(const byte **ptr, byte **dest, int numEntries);
1394  void colorPCEToRGB(uint16 color, byte *r, byte *g, byte *b);
1395  void setPCETextPalette(uint8 color);
1396 protected:
1397  void moveMemInPalRes(int start, int end, byte direction);
1398  void setShadowPalette(int slot, int redScale, int greenScale, int blueScale, int startColor, int endColor);
1399  void setShadowPalette(int redScale, int greenScale, int blueScale, int startColor, int endColor, int start, int end);
1400  virtual void darkenPalette(int redScale, int greenScale, int blueScale, int startColor, int endColor);
1401 
1402 public:
1403  void markRectAsDirty(VirtScreenNumber virt, int left, int right, int top, int bottom, int dirtybit = 0);
1404  void markRectAsDirty(VirtScreenNumber virt, const Common::Rect& rect, int dirtybit = 0) {
1405  markRectAsDirty(virt, rect.left, rect.right, rect.top, rect.bottom, dirtybit);
1406  }
1407 protected:
1408  // Screen rendering
1409  byte *_compositeBuf;
1410  byte *_hercCGAScaleBuf = nullptr;
1411  bool _enableEGADithering = false;
1412  bool _supportsEGADithering = false;
1413 
1414  virtual void drawDirtyScreenParts();
1415  void updateDirtyScreen(VirtScreenNumber slot);
1416  void drawStripToScreen(VirtScreen *vs, int x, int width, int top, int bottom);
1417 
1418  void mac_markScreenAsDirty(int x, int y, int w, int h);
1419  void mac_drawStripToScreen(VirtScreen *vs, int top, int x, int y, int width, int height);
1420  void mac_drawIndy3TextBox();
1421  void mac_undrawIndy3TextBox();
1422  void mac_undrawIndy3CreditsText();
1423  Common::KeyState mac_showOldStyleBannerAndPause(const char *msg, int32 waitTime);
1424 
1425  const byte *postProcessDOSGraphics(VirtScreen *vs, int &pitch, int &x, int &y, int &width, int &height) const;
1426  const byte *ditherVGAtoEGA(int &pitch, int &x, int &y, int &width, int &height) const;
1427 
1428 public:
1429  VirtScreen *findVirtScreen(int y);
1430  byte *getMaskBuffer(int x, int y, int z);
1431 
1432 protected:
1433  void fadeIn(int effect);
1434  void fadeOut(int effect);
1435 
1436  void dissolveEffectSelector();
1437  void transitionEffect(int a);
1438  void dissolveEffect(int width, int height);
1439  void scrollEffect(int dir);
1440 
1441  void updateScreenShakeEffect();
1442 
1443 public:
1444  double getTimerFrequency();
1445  double getAmigaMusicTimerFrequency(); // For setting up Players v2 and v3
1446 
1447 protected:
1448  bool _shakeEnabled = false;
1449  bool _shakeTempSavedState = false; // For saving and restoring before and after GUI calls
1450  uint _shakeFrame = 0;
1451  uint32 _shakeNextTick = 0;
1452  uint32 _shakeTickCounter = 0;
1453  double _shakeTimerRate;
1454  double _timerFrequency;
1455 
1456  void setShake(int mode);
1457 
1458  int _drawObjectQueNr = 0;
1459  byte _drawObjectQue[200];
1460 
1461  /* For each of the 410 screen strips, gfxUsageBits contains a
1462  * bitmask. The lower 80 bits each correspond to one actor and
1463  * signify if any part of that actor is currently contained in
1464  * that strip.
1465  *
1466  * If the leftmost bit is set, the strip (background) is dirty
1467  * needs to be redrawn.
1468  *
1469  * The second leftmost bit is set by restoreBlastObjectsRect() and
1470  * restoreBackground(), but I'm not yet sure why.
1471  */
1472  uint32 gfxUsageBits[410 * 3];
1473 
1474  void upgradeGfxUsageBits();
1475  void setGfxUsageBit(int strip, int bit);
1476  void clearGfxUsageBit(int strip, int bit);
1477 
1478  // speed optimization: inline due to frequent calling
1479  bool testGfxUsageBit(int strip, int bit) {
1480  assert(strip >= 0 && strip < ARRAYSIZE(gfxUsageBits) / 3);
1481  assert(1 <= bit && bit <= 96);
1482  bit--;
1483  return (gfxUsageBits[3 * strip + bit / 32] & (1 << (bit % 32))) != 0;
1484  }
1485 
1486  bool testGfxAnyUsageBits(int strip);
1487  bool testGfxOtherUsageBits(int strip, int bit);
1488 
1489 public:
1490  byte _roomPalette[256];
1491  byte *_shadowPalette = nullptr;
1492  bool _skipDrawObject = 0;
1493  int _voiceMode = 0;
1494 
1495  // HE specific
1496  byte _HEV7ActorPalette[256];
1497  uint8 *_hePalettes = nullptr;
1498  uint16 _hePaletteSlot = 0;
1499  uint16 *_16BitPalette = nullptr;
1500 
1501  // Indy4 Amiga specific
1502  byte *_verbPalette = nullptr;
1503 
1504  ScummEngine_v0_Delays _V0Delay;
1505 
1506 protected:
1507  int _shadowPaletteSize = 0;
1508  byte _currentPalette[3 * 256];
1509  byte _darkenPalette[3 * 256];
1510 
1511  int _palDirtyMin = 0, _palDirtyMax = 0;
1512 
1513  byte _palManipStart = 0, _palManipEnd = 0;
1514  uint16 _palManipCounter = 0;
1515  byte *_palManipPalette = nullptr;
1516  byte *_palManipIntermediatePal = nullptr;
1517 
1518  bool _haveActorSpeechMsg = false;
1519  bool _useTalkAnims = false;
1520  uint16 _defaultTextSpeed = 0;
1521  int _saveSound = 0;
1522  bool _native_mt32 = false;
1523  bool _copyProtection = false;
1524  bool _shadowPalRemap = false;
1525 
1526  // Indy4 Amiga specific
1527  uint16 _amigaFirstUsedColor = 0;
1528  byte _amigaPalette[3 * 64];
1529  void amigaPaletteFindFirstUsedColor();
1530  void mapRoomPalette(int idx);
1531  int remapRoomPaletteColor(int r, int g, int b);
1532  void mapVerbPalette(int idx);
1533  int remapVerbPaletteColor(int r, int g, int b);
1534 
1535  // EGA dithering mode color tables for certain VGA games like MI2, LOOM Talkie...
1536  byte *_egaColorMap[2];
1537 
1538 public:
1539  uint16 _extraBoxFlags[65];
1540 
1541  byte getNumBoxes();
1542  byte *getBoxMatrixBaseAddr();
1543  byte *getBoxConnectionBase(int box);
1544 
1545  int getNextBox(byte from, byte to);
1546 
1547  void setBoxFlags(int box, int val);
1548  void setBoxScale(int box, int b);
1549 
1550  bool checkXYInBoxBounds(int box, int x, int y);
1551 
1552  BoxCoords getBoxCoordinates(int boxnum);
1553 
1554  byte getMaskFromBox(int box);
1555  Box *getBoxBaseAddr(int box);
1556  byte getBoxFlags(int box);
1557  int getBoxScale(int box);
1558 
1559  int getScale(int box, int x, int y);
1560  int getScaleFromSlot(int slot, int x, int y);
1561 
1562 protected:
1563  // Scaling slots/items
1564  struct ScaleSlot {
1565  int x1, y1, scale1;
1566  int x2, y2, scale2;
1567  };
1568  friend void syncWithSerializer(Common::Serializer &, ScaleSlot &);
1569  ScaleSlot _scaleSlots[20];
1570  void setScaleSlot(int slot, int x1, int y1, int scale1, int x2, int y2, int scale2);
1571  void setBoxScaleSlot(int box, int slot);
1572  void convertScaleTableToScaleSlot(int slot);
1573 
1574  void calcItineraryMatrix(byte *itineraryMatrix, int num);
1575  void createBoxMatrix();
1576  virtual bool areBoxesNeighbors(int i, int j);
1577 
1578  /* String class */
1579 public:
1580  CharsetRenderer *_charset = nullptr;
1581  byte _charsetColorMap[16];
1582 
1588  int _textSurfaceMultiplier = 0;
1589 
1590  Graphics::Surface *_macScreen = nullptr;
1591  MacGui *_macGui = nullptr;
1592 
1593 protected:
1594  byte _charsetColor = 0;
1595  byte _charsetData[23][16];
1596 
1597  int _charsetBufPos = 0;
1598  byte _charsetBuffer[512];
1599 
1600  bool _keepText = false;
1601  byte _msgCount = 0;
1602 
1603  int _nextLeft = 0, _nextTop = 0;
1604 
1605  Localizer *_localizer = nullptr;
1606 
1607  void restoreCharsetBg();
1608  void clearCharsetMask();
1609  void clearTextSurface();
1610 
1611  virtual void initCharset(int charset);
1612 
1613  virtual void printString(int m, const byte *msg);
1614 
1615  virtual bool handleNextCharsetCode(Actor *a, int *c);
1616  virtual void drawSentence() {}
1617  virtual void CHARSET_1();
1618  bool newLine();
1619  void drawString(int a, const byte *msg);
1620  virtual void fakeBidiString(byte *ltext, bool ignoreVerb, int ltextSize) const;
1621  void wrapSegaCDText();
1622  void debugMessage(const byte *msg);
1623  virtual void showMessageDialog(const byte *msg);
1624 
1625  virtual int convertMessageToString(const byte *msg, byte *dst, int dstSize);
1626  int convertIntMessage(byte *dst, int dstSize, int var);
1627  int convertVerbMessage(byte *dst, int dstSize, int var);
1628  int convertNameMessage(byte *dst, int dstSize, int var);
1629  int convertStringMessage(byte *dst, int dstSize, int var);
1630 
1631 public:
1632  Common::Language _language; // Accessed by a hack in NutRenderer::loadFont
1633 
1634  // Used by class ScummDialog:
1635  virtual void translateText(const byte *text, byte *trans_buff, int transBufferSize);
1636  // Old Hebrew games require reversing the dialog text.
1637  bool reverseIfNeeded(const byte *text, byte *reverseBuf, int reverseBufSize) const;
1638  // Returns codepage that matches the game for languages that require it.
1639  Common::CodePage getDialogCodePage() const;
1640 
1641  // Somewhat hackish stuff for 2 byte support (Chinese/Japanese/Korean)
1642  bool _useCJKMode = false;
1643  bool _useMultiFont = false;
1644  int _numLoadedFont = 0;
1645  int _2byteShadow = 0;
1646  bool _force2ByteCharHeight = false;
1647 
1648  int _2byteHeight = 0;
1649  int _2byteWidth = 0;
1650  int _krStrPost = 0;
1651  byte _newLineCharacter = 0;
1652  byte *get2byteCharPtr(int idx);
1653 
1654  bool isScummvmKorTarget();
1655  bool hasLocalizer();
1656 
1657 //protected:
1658  byte *_2byteFontPtr = nullptr;
1659  byte *_2byteMultiFontPtr[20];
1660  int _2byteMultiHeight[20];
1661  int _2byteMultiWidth[20];
1662  int _2byteMultiShadow[20];
1663 
1664 private:
1665  struct TranslatedLine {
1666  uint32 originalTextOffset;
1667  uint32 translatedTextOffset;
1668  };
1669 
1670  struct TranslationRange {
1671  uint32 left;
1672  uint32 right;
1673 
1674  TranslationRange(uint32 left_, uint32 right_) : left(left_), right(right_) {}
1675  TranslationRange() : left(0), right(0) {}
1676  };
1677 
1678  struct TranslationRoom {
1680  };
1681 
1682  bool _existLanguageFile = false;
1683  bool _isRTL = false;
1684  byte *_languageBuffer = nullptr;
1685  int _numTranslatedLines = 0;
1686  TranslatedLine *_translatedLines = nullptr;
1687  uint16 *_languageLineIndex = nullptr;
1689 
1690  const byte *searchTranslatedLine(const byte *text, const TranslationRange &range, bool useIndex);
1691 
1692  virtual void createTextRenderer(GlyphRenderer_v7 *gr) {}
1693 
1694 public:
1695 
1696  /* Scumm Vars */
1697  byte VAR_KEYPRESS = 0xFF;
1698  byte VAR_SYNC = 0xFF;
1699  byte VAR_EGO = 0xFF;
1700  byte VAR_CAMERA_POS_X = 0xFF;
1701  byte VAR_HAVE_MSG = 0xFF;
1702  byte VAR_ROOM = 0xFF;
1703  byte VAR_OVERRIDE = 0xFF;
1704  byte VAR_MACHINE_SPEED = 0xFF;
1705  byte VAR_ME = 0xFF;
1706  byte VAR_NUM_ACTOR = 0xFF;
1707  byte VAR_CURRENT_LIGHTS = 0xFF;
1708  byte VAR_CURRENTDRIVE = 0xFF; // How about merging this with VAR_CURRENTDISK?
1709  byte VAR_CURRENTDISK = 0xFF;
1710  byte VAR_TMR_1 = 0xFF;
1711  byte VAR_TMR_2 = 0xFF;
1712  byte VAR_TMR_3 = 0xFF;
1713  byte VAR_MUSIC_TIMER = 0xFF;
1714  byte VAR_ACTOR_RANGE_MIN = 0xFF;
1715  byte VAR_ACTOR_RANGE_MAX = 0xFF;
1716  byte VAR_CAMERA_MIN_X = 0xFF;
1717  byte VAR_CAMERA_MAX_X = 0xFF;
1718  byte VAR_TIMER_NEXT = 0xFF;
1719  byte VAR_VIRT_MOUSE_X = 0xFF;
1720  byte VAR_VIRT_MOUSE_Y = 0xFF;
1721  byte VAR_ROOM_RESOURCE = 0xFF;
1722  byte VAR_LAST_SOUND = 0xFF;
1723  byte VAR_CUTSCENEEXIT_KEY = 0xFF;
1724  byte VAR_OPTIONS_KEY = 0xFF;
1725  byte VAR_TALK_ACTOR = 0xFF;
1726  byte VAR_CAMERA_FAST_X = 0xFF;
1727  byte VAR_SCROLL_SCRIPT = 0xFF;
1728  byte VAR_ENTRY_SCRIPT = 0xFF;
1729  byte VAR_ENTRY_SCRIPT2 = 0xFF;
1730  byte VAR_EXIT_SCRIPT = 0xFF;
1731  byte VAR_EXIT_SCRIPT2 = 0xFF;
1732  byte VAR_VERB_SCRIPT = 0xFF;
1733  byte VAR_SENTENCE_SCRIPT = 0xFF;
1734  byte VAR_INVENTORY_SCRIPT = 0xFF;
1735  byte VAR_CUTSCENE_START_SCRIPT = 0xFF;
1736  byte VAR_CUTSCENE_END_SCRIPT = 0xFF;
1737  byte VAR_CHARINC = 0xFF;
1738  byte VAR_WALKTO_OBJ = 0xFF;
1739  byte VAR_DEBUGMODE = 0xFF;
1740  byte VAR_HEAPSPACE = 0xFF;
1741  byte VAR_RESTART_KEY = 0xFF;
1742  byte VAR_PAUSE_KEY = 0xFF;
1743  byte VAR_MOUSE_X = 0xFF;
1744  byte VAR_MOUSE_Y = 0xFF;
1745  byte VAR_TIMER = 0xFF;
1746  byte VAR_TIMER_TOTAL = 0xFF;
1747  byte VAR_SOUNDCARD = 0xFF;
1748  byte VAR_VIDEOMODE = 0xFF;
1749  byte VAR_MAINMENU_KEY = 0xFF;
1750  byte VAR_FIXEDDISK = 0xFF;
1751  byte VAR_CURSORSTATE = 0xFF;
1752  byte VAR_USERPUT = 0xFF;
1753  byte VAR_SOUNDRESULT = 0xFF;
1754  byte VAR_TALKSTOP_KEY = 0xFF;
1755  byte VAR_FADE_DELAY = 0xFF;
1756  byte VAR_NOSUBTITLES = 0xFF;
1757 
1758  // V5+
1759  byte VAR_SOUNDPARAM = 0xFF;
1760  byte VAR_SOUNDPARAM2 = 0xFF;
1761  byte VAR_SOUNDPARAM3 = 0xFF;
1762  byte VAR_INPUTMODE = 0xFF;
1763  byte VAR_MEMORY_PERFORMANCE = 0xFF;
1764  byte VAR_VIDEO_PERFORMANCE = 0xFF;
1765  byte VAR_ROOM_FLAG = 0xFF;
1766  byte VAR_GAME_LOADED = 0xFF;
1767  byte VAR_NEW_ROOM = 0xFF;
1768 
1769  // V4/V5
1770  byte VAR_V5_TALK_STRING_Y = 0xFF;
1771 
1772  // V6+
1773  byte VAR_ROOM_WIDTH = 0xFF;
1774  byte VAR_ROOM_HEIGHT = 0xFF;
1775  byte VAR_SUBTITLES = 0xFF;
1776  byte VAR_V6_EMSSPACE = 0xFF;
1777 
1778  // V7/V8 specific variables
1779  byte VAR_CAMERA_POS_Y = 0xFF;
1780  byte VAR_CAMERA_MIN_Y = 0xFF;
1781  byte VAR_CAMERA_MAX_Y = 0xFF;
1782  byte VAR_CAMERA_THRESHOLD_X = 0xFF;
1783  byte VAR_CAMERA_THRESHOLD_Y = 0xFF;
1784  byte VAR_CAMERA_SPEED_X = 0xFF;
1785  byte VAR_CAMERA_SPEED_Y = 0xFF;
1786  byte VAR_CAMERA_ACCEL_X = 0xFF;
1787  byte VAR_CAMERA_ACCEL_Y = 0xFF;
1788  byte VAR_CAMERA_DEST_X = 0xFF;
1789  byte VAR_CAMERA_DEST_Y = 0xFF;
1790  byte VAR_CAMERA_FOLLOWED_ACTOR = 0xFF;
1791 
1792  // V7/V8 specific variables
1793  byte VAR_VERSION_KEY = 0xFF;
1794  byte VAR_DEFAULT_TALK_DELAY = 0xFF;
1795  byte VAR_CUSTOMSCALETABLE = 0xFF;
1796  byte VAR_BLAST_ABOVE_TEXT = 0xFF;
1797  byte VAR_VOICE_MODE = 0xFF;
1798  byte VAR_MUSIC_BUNDLE_LOADED = 0xFF;
1799  byte VAR_VOICE_BUNDLE_LOADED = 0xFF;
1800 
1801  byte VAR_LEFTBTN_DOWN = 0xFF; // V7/V8
1802  byte VAR_RIGHTBTN_DOWN = 0xFF; // V7/V8
1803  byte VAR_LEFTBTN_HOLD = 0xFF; // V6/V72HE/V7/V8
1804  byte VAR_RIGHTBTN_HOLD = 0xFF; // V6/V72HE/V7/V8
1805  byte VAR_PRE_SAVELOAD_SCRIPT = 0xFF; // V6/V7 (not HE)
1806  byte VAR_POST_SAVELOAD_SCRIPT = 0xFF; // V6/V7 (not HE)
1807  byte VAR_SAVELOAD_PAGE = 0xFF; // V8
1808  byte VAR_OBJECT_LABEL_FLAG = 0xFF; // V8
1809 
1810  // V6/V7 specific variables (FT & Sam & Max specific)
1811  byte VAR_CHARSET_MASK = 0xFF;
1812 
1813  // V6 specific variables
1814  byte VAR_V6_SOUNDMODE = 0xFF;
1815 
1816  // V1/V2 specific variables
1817  byte VAR_CHARCOUNT = 0xFF;
1818  byte VAR_VERB_ALLOWED = 0xFF;
1819  byte VAR_ACTIVE_VERB = 0xFF;
1820  byte VAR_ACTIVE_OBJECT1 = 0xFF;
1821  byte VAR_ACTIVE_OBJECT2 = 0xFF;
1822 
1823  // HE specific variables
1824  byte VAR_REDRAW_ALL_ACTORS = 0xFF; // Used in setActorRedrawFlags()
1825  byte VAR_SKIP_RESET_TALK_ACTOR = 0xFF; // Used in setActorCostume()
1826 
1827  byte VAR_SOUND_CHANNEL = 0xFF; // Used in o_startSound()
1828  byte VAR_TALK_CHANNEL = 0xFF; // Used in playVoice()
1829  byte VAR_SOUND_TOKEN_OFFSET = 0xFF; // Used in handleSoundFrame()
1830  byte VAR_START_DYN_SOUND_CHANNELS = 0xFF; // Used in getNextDynamicChannel()
1831  byte VAR_SOUND_CALLBACK_SCRIPT = 0xFF;
1832 
1833  byte VAR_EARLY_TALKIE_CALLBACK = 0xFF;
1834  byte VAR_EARLY_CHAN_0_CALLBACK = 0xFF;
1835  byte VAR_EARLY_CHAN_1_CALLBACK = 0xFF;
1836  byte VAR_EARLY_CHAN_2_CALLBACK = 0xFF;
1837  byte VAR_EARLY_CHAN_3_CALLBACK = 0xFF;
1838 
1839  byte VAR_MAIN_SCRIPT = 0xFF; // Used in scummLoop()
1840 
1841  byte VAR_DEFAULT_SCRIPT_PRIORITY = 0xFF; // Used in runScript()/runObjectScript()
1842  byte VAR_LAST_SCRIPT_PRIORITY = 0xFF; // Used in runAllScripts()
1843 
1844  byte VAR_QUIT_SCRIPT = 0xFF; // Used in confirmExitDialog()
1845  byte VAR_ERROR_FLAG = 0xFF; // HE70-90
1846  byte VAR_OPERATION_FAILURE = 0xFF; // HE99+
1847 
1848  // Exists both in V7 and in V72HE:
1849  byte VAR_NUM_GLOBAL_OBJS = 0xFF;
1850 
1851 #ifdef USE_RGB_COLOR
1852  // FM-Towns / PC-Engine specific
1853  Graphics::FontSJIS *_cjkFont = nullptr;
1854 #endif
1855 
1856  // FM-Towns specific
1857 #ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
1858 public:
1859  bool towns_isRectInStringBox(int x1, int y1, int x2, int y2);
1860  byte _townsPaletteFlags = 0;
1861  byte _townsCharsetColorMap[16];
1862 
1863 protected:
1864  void towns_drawStripToScreen(VirtScreen *vs, int dstX, int dstY, int srcX, int srcY, int w, int h);
1865  void towns_clearStrip(int strip);
1866 #ifdef USE_RGB_COLOR
1867  void towns_setPaletteFromPtr(const byte *ptr, int numcolor = -1);
1868  void towns_setTextPaletteFromPtr(const byte *ptr);
1869 #endif
1870  void towns_setupPalCycleField(int x1, int y1, int x2, int y2);
1871  void towns_processPalCycleField();
1872  void towns_resetPalCycleFields();
1873  void towns_restoreCharsetBg();
1874  void towns_scriptScrollEffect(int dir);
1875 
1876  void requestScroll(int dir);
1877  void scrollLeft() { requestScroll(-1); }
1878  void scrollRight() { requestScroll(1); }
1879  void towns_waitForScroll(int waitForDirection, int threshold = 0);
1880  void towns_updateGfx();
1881 
1882  Common::Rect _cyclRects[10];
1883  int _numCyclRects = 0;
1884  int _scrollRequest = 0;
1885  int _scrollDeltaAdjust = 0;
1886  bool _scrollNeedDeltaAdjust = 0;
1887  int _refreshDuration[20];
1888  int _refreshArrayPos = 0;
1889  bool _refreshNeedCatchUp = false;
1890  bool _enableSmoothScrolling = false;
1891  uint32 _scrollTimer = 0;
1892  uint32 _scrollDestOffset = 0;
1893  uint16 _scrollFeedStrips[3];
1894 
1895  Common::Rect _curStringRect;
1896 
1897  byte _townsOverrideShadowColor = 0;
1898  byte _textPalette[48];
1899  byte _townsClearLayerFlag = 1;
1900  byte _townsActiveLayerFlags = 3;
1901  static const uint8 _townsLayer2Mask[];
1902 
1903  TownsScreen *_townsScreen = nullptr;
1904 #else
1905  void scrollLeft() { redrawBGStrip(_gdi->_numStrips - 1, 1); }
1906  void scrollRight() { redrawBGStrip(0, 1); }
1907  void towns_updateGfx() {}
1908  void towns_waitForScroll(int waitForDirection, int threshold = 0) {}
1909 #endif // DISABLE_TOWNS_DUAL_LAYER_MODE
1910 };
1911 
1912 } // End of namespace Scumm
1913 
1914 #endif
#define ARRAYSIZE(x)
Definition: util.h:91
Definition: charset.h:70
Definition: macgui_impl.h:47
Definition: keymap.h:66
VirtScreenNumber
Definition: gfx.h:161
Definition: gfx.h:569
Definition: str.h:59
Definition: boxes.h:44
Definition: surface.h:66
EngineFeature
Definition: engine.h:250
Definition: stream.h:77
Definition: error.h:84
ErrorCode getCode() const
Definition: error.h:115
Definition: detection.h:264
Definition: script.h:31
Definition: gfx.h:138
Definition: pixelformat.h:138
Definition: script.h:119
Definition: random.h:44
int16 right
Definition: rect.h:146
Definition: palette.h:141
RenderMode
Definition: rendermode.h:48
No error occurred.
Definition: error.h:48
Definition: rect.h:144
Common::Path _containerFile
Definition: scumm.h:1062
Definition: path.h:52
Definition: scumm.h:184
Definition: resource.h:75
Definition: music.h:40
ResType
Definition: scumm.h:256
Definition: stream.h:745
Definition: macgui_indy3.h:35
Definition: sound.h:59
Definition: scumm.h:165
Definition: system.h:45
Definition: serializer.h:79
Definition: scumm.h:176
Definition: scumm.h:518
Definition: gfx.h:191
Graphics::Surface _textSurface
Definition: scumm.h:1587
Definition: scumm.h:197
int FORCEINLINE GCC_PRINTF(2, 0) int vsprintf_s(T(&dst)[N]
Definition: detection.h:191
Definition: scumm.h:156
Definition: ustr.h:57
Definition: scumm.h:232
Definition: player_towns.h:32
Definition: scumm.h:214
Definition: debugger.h:33
Definition: object.h:196
Definition: object.h:71
Definition: imuse.h:50
Definition: events.h:198
Definition: algorithm.h:29
Definition: formatinfo.h:28
Definition: mutex.h:67
Definition: scumm.h:149
Definition: rect.h:45
int16 left
Definition: rect.h:145
Definition: serializer.h:308
Definition: charset.h:155
Definition: scumm.h:478
void NORETURN_PRE error(MSVC_PRINTF const char *s,...) GCC_PRINTF(1
Definition: actor.h:91
Definition: localizer.h:31
Definition: dialog.h:49
Definition: gfx.h:298
Definition: stream.h:351
Definition: base-costume.h:68
Definition: scumm.h:1564
Definition: macgui.h:39
Definition: keyboard.h:294
Common::Error run() override
Definition: scumm.h:577
Common::RandomSource _rnd
Definition: scumm.h:546
Definition: macgui_loom.h:33
Definition: system.h:167
void void void void void debugC(int level, uint32 debugChannels, MSVC_PRINTF const char *s,...) GCC_PRINTF(3
Definition: base-costume.h:49
Definition: engine.h:143
Definition: actor.h:30
Definition: gfx.h:285
Definition: verbs.h:47
Definition: detection.h:278
Definition: file.h:34
Language
Definition: language.h:45