25#include "engines/engine.h"
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/str.h"
37#include "common/textconsole.h"
38#include "common/text-to-speech.h"
39#include "graphics/surface.h"
40#include "graphics/sjis.h"
41#include "graphics/palette.h"
43#include "scumm/file.h"
45#include "scumm/detection.h"
46#include "scumm/script.h"
47#include "scumm/serializer.h"
58#define DISABLE_TOWNS_DUAL_LAYER_MODE
66class SeekableReadStream;
68class SeekableWriteStream;
89class BaseCostumeLoader;
90class BaseCostumeRenderer;
102class GlyphRenderer_v7;
106struct FindObjectInRoom;
109extern ScummEngine *g_scumm;
114 NUM_SHADOW_PALETTE = 8
157 MBS_LEFT_CLICK = 0x8000,
158 MBS_RIGHT_CLICK = 0x4000,
159 MBS_MOUSE_MASK = (MBS_LEFT_CLICK | MBS_RIGHT_CLICK),
203 uint _objectRedrawCount;
204 uint _objectStripRedrawCount;
205 uint _actorRedrawCount;
206 uint _actorLimbRedrawDrawCount;
226 USERSTATE_SET_FREEZE = 0x01,
227 USERSTATE_SET_CURSOR = 0x02,
228 USERSTATE_SET_IFACE = 0x04,
229 USERSTATE_FREEZE_ON = 0x08,
230 USERSTATE_CURSOR_ON = 0x10,
231 USERSTATE_IFACE_SENTENCE = 0x20,
232 USERSTATE_IFACE_INVENTORY = 0x40,
233 USERSTATE_IFACE_VERBS = 0x80
236#define USERSTATE_IFACE_ALL (USERSTATE_IFACE_SENTENCE | USERSTATE_IFACE_INVENTORY | USERSTATE_IFACE_VERBS)
272class ResourceManager;
314#define PIT_BASE_FREQUENCY 1193182.0
315#define PIT_V1_DIVISOR 65536.0
316#define PIT_V2_4_DIVISOR 5041.0
317#define PIT_V5_6_ORCHESTRATOR_DIVISOR 4096.0
318#define PIT_V5_6_SUBTIMER_INC 3433.0
319#define PIT_V5_SUBTIMER_THRESH 4167.0
320#define PIT_V6_SAMNMAX_SUBTIMER_THRESH 4167.0
321#define PIT_V6_DOTT_SUBTIMER_THRESH 4237.0
322#define PIT_V7_ORCHESTRATOR_DIVISOR 3977.0
323#define PIT_V7_SUBTIMER_INC 3977.0
324#define PIT_V7_SUBTIMER_THRESH 4971.0
326#define PIT_HE_PUTT_PUTT_DIVISOR 9362.0
327#define PIT_HE_FATTY_BEAR_DIVISOR 21845.0
329#define LOOM_STEAM_CDDA_RATE 240.0
344#define AMIGA_NTSC_VBLANK_RATE 240.0
345#define AMIGA_PAL_VBLANK_RATE 200.0
356#define C64_NTSC_VBLANK_RATE 240.0
357#define C64_PAL_VBLANK_RATE 200.0
363#define GAME_PROPER_SAVE 201
364#define GAME_FAILED_SAVE 202
365#define GAME_PROPER_LOAD 203
366#define GAME_FAILED_LOAD 204
372#define GUI_PAGE_MAIN 0
373#define GUI_PAGE_SAVE 1
374#define GUI_PAGE_LOAD 2
375#define GUI_PAGE_RESTART 3
376#define GUI_PAGE_CODE_CONFIRM 4
377#define GUI_PAGE_INVALID_CODE 5
379#define GUI_CTRL_FIRST_SG 1
380#define GUI_CTRL_LAST_SG 9
381#define GUI_CTRL_SAVE_BUTTON 10
382#define GUI_CTRL_LOAD_BUTTON 11
383#define GUI_CTRL_PLAY_BUTTON 12
384#define GUI_CTRL_QUIT_BUTTON 13
385#define GUI_CTRL_OK_BUTTON 14
386#define GUI_CTRL_CANCEL_BUTTON 15
387#define GUI_CTRL_ARROW_UP_BUTTON 16
388#define GUI_CTRL_ARROW_DOWN_BUTTON 17
389#define GUI_CTRL_PATH_BUTTON 18
390#define GUI_CTRL_MUSIC_SLIDER 19
391#define GUI_CTRL_SPEECH_SLIDER 20
392#define GUI_CTRL_SFX_SLIDER 21
393#define GUI_CTRL_TEXT_SPEED_SLIDER 22
394#define GUI_CTRL_DISPLAY_TEXT_CHECKBOX 23
395#define GUI_CTRL_SPOOLED_MUSIC_CHECKBOX 24
396#define GUI_CTRL_OUTER_BOX 26
397#define GUI_CTRL_INNER_BOX 27
400#define GUI_CTRL_NUMPAD_1 1
401#define GUI_CTRL_NUMPAD_2 2
402#define GUI_CTRL_NUMPAD_3 3
403#define GUI_CTRL_NUMPAD_4 4
404#define GUI_CTRL_NUMPAD_5 5
405#define GUI_CTRL_NUMPAD_6 6
406#define GUI_CTRL_NUMPAD_7 7
407#define GUI_CTRL_NUMPAD_8 8
408#define GUI_CTRL_NUMPAD_9 9
409#define GUI_CTRL_NUMPAD_0 10
410#define GUI_CTRL_RESTART_BUTTON 13
411#define GUI_CTRL_ARROW_LEFT_BUTTON 16
412#define GUI_CTRL_ARROW_RIGHT_BUTTON 17
413#define GUI_CTRL_NUMPAD_BACK 23
418 gsTextSpeedSlider = 2,
429 gsGameNotLoaded = 13,
433 gsSelectLoadPrompt = 17,
434 gsReplacePrompt = 18,
439 gsTextDisplayOnly = 24,
442 gsMusicVolumeSlider = 27,
443 gsVoiceVolumeSlider = 28,
444 gsSfxVolumeSlider = 29,
455 gsInsertSaveDisk = 40,
458 gsRecalJoystick = 43,
471 gsCurrentPasscode = 56,
472 gsEnterPasscode = 57,
473 gsConfirmPasscode = 58,
474 gsInvalidPasscode = 59,
491 int highlightedTextColor;
492 int highlightedFillColor;
498 bool doubleLinesFlag;
503 kScummActionInsaneDownLeft,
504 kScummActionInsaneDown,
505 kScummActionInsaneDownRight,
506 kScummActionInsaneLeft,
507 kScummActionInsaneRight,
508 kScummActionInsaneUpLeft,
509 kScummActionInsaneUp,
510 kScummActionInsaneUpRight,
511 kScummActionInsaneAttack,
512 kScummActionInsaneSwitch,
513 kScummActionInsaneCheat,
514 kScummActionInsaneBack,
515 kScummActionInsaneSkip,
520enum ScummBackendAction {
521 kScummBackendActionRebel1AxisUp = 11000,
522 kScummBackendActionRebel1AxisDown,
523 kScummBackendActionRebel1AxisLeft,
524 kScummBackendActionRebel1AxisRight,
525 kScummBackendActionRebel2AxisUp,
526 kScummBackendActionRebel2AxisDown,
527 kScummBackendActionRebel2AxisLeft,
528 kScummBackendActionRebel2AxisRight
531extern const char *
const insaneKeymapId;
540 friend class CharsetRendererTownsClassic;
547 friend class LogicHEBasketball;
554 IMuse *_imuse =
nullptr;
555 IMuseDigital *_imuseDigital =
nullptr;
558 Sound *_sound =
nullptr;
575 int _insideCreateResource = 0;
577 bool _useOriginalGUI =
true;
578 bool _enableAudioOverride =
false;
579 bool _enableCOMISong =
false;
580 bool _isAmigaPALSystem =
false;
581 bool _isC64PALSystem =
false;
582 bool _quitFromScriptCmd =
false;
583 bool _isHE995 =
false;
584 bool _enableHECompetitiveOnlineMods =
false;
591 bool _needsSoundUnpause =
false;
609 void errorString(
const char *buf_input,
char *buf_output,
int buf_output_size)
override;
611 bool gameSupportsQuitDialogOverride()
const;
623 virtual void setupScumm(
const Common::Path &macResourceFile);
624 virtual void resetScumm();
626 virtual void setupScummVars();
627 virtual void resetScummVars();
628 void setVideoModeVarToCurrentConfig();
629 void setSoundCardVarToCurrentConfig();
631 void setupCharsetRenderer(
const Common::Path &macFontFile);
632 void setupCostumeRenderer();
634 virtual void loadLanguageBundle();
637 void setupMusic(
int midi);
638 void setTalkSpeed(
int talkspeed);
642 virtual void scummLoop(
int delta);
643 virtual void scummLoop_updateScummVars();
644 virtual void scummLoop_handleSaveLoad();
645 virtual void scummLoop_handleDrawing();
646 virtual void scummLoop_handleActors() = 0;
647 virtual void scummLoop_handleEffects();
648 virtual void scummLoop_handleSound();
650 virtual void runBootscript();
652 virtual void terminateSaveMenuScript() {};
656 void beginTextInput();
663 void waitForTimer(
int quarterFrames,
bool freezeMacGui =
false);
664 uint32 _lastWaitTime;
666 void setTimerAndShakeFrequency();
674 double _msecFractParts = 0.0;
676 virtual void processInput();
678 virtual void clearClickedStatus();
681 virtual void updateCursor();
682 virtual void animateCursor() {}
683 virtual void updatePalette();
684 virtual void setDefaultCursor() {};
685 virtual void setCursorTransparency(
int a) {};
686 virtual void resetCursors() {}
687 virtual void setCursorHotspot(
int x,
int y) {}
688 virtual void setCursorFromBuffer(
const byte *ptr,
int width,
int height,
int pitch,
bool preventScale =
false) {}
693 bool isUsingOriginalGUI()
const;
694 bool isMessageBannerActive();
696 bool _isIndy4Jap =
false;
699 Dialog *_pauseDialog =
nullptr;
700 Dialog *_messageDialog =
nullptr;
701 Dialog *_versionDialog =
nullptr;
703 void confirmExitDialog();
704 void confirmRestartDialog();
707 void versionDialog();
710 int32 _bannerColors[50];
711 byte *_bannerMem =
nullptr;
712 uint32 _bannerMemSize = 0;
713 int _bannerSaveYStart = 0;
715 bool _messageBannerActive =
false;
716 bool _comiQuitMenuIsOpen =
false;
717 bool _closeBannerAndQueryQuitFlag =
false;
720 byte *_textSurfBannerMem =
nullptr;
721 uint32 _textSurfBannerMemSize = 0;
723 InternalGUIControl _internalGUIControls[30];
726 const char _emptyMsg[1] = {
'\0'};
727 const char _uncheckedBox[2] = {
' ',
'\0'};
728 const char _checkedBox[2] = {
'x',
'\0'};
729 const char _arrowUp[2] = {
'\x18',
'\0'};
730 const char _arrowDown[2] = {
'\x19',
'\0'};
731 const char _arrowLeft[2] = {
'\x3c',
'\0'};
732 const char _arrowRight[2] = {
'\x3d',
'\0'};
736 int _mainMenuSavegameLabel = 1;
737 int _curDisplayedSaveSlotPage = 0;
738 int _firstSaveStateOfList = 0;
739 bool _mainMenuIsActive =
false;
740 bool _quitByGUIPrompt =
false;
741 char _mainMenuMusicSlider[17];
742 char _mainMenuSpeechSlider[17];
743 char _mainMenuSfxSlider[17];
744 char _mainMenuTextSpeedSlider[17];
745 char _mainMenuSegaCDPasscode[5];
746 int _spooledMusicIsToBeEnabled = 1;
747 int _saveScriptParam = 0;
748 int _guiCursorAnimCounter = 0;
749 int _v5VoiceMode = 0;
752 int _internalSpeakerSoundsAreOn = 1;
753 int _guiMouseFlag = 1;
754 int _guiJoystickFlag = 1;
756 bool _mixerMutedByGUI =
false;
759 byte *_tempTextSurface =
nullptr;
760 byte *_tempMainSurface =
nullptr;
761 byte *_tempVerbSurface =
nullptr;
762 bool _postGUICharMask =
false;
765 byte *_curGrabbedCursor =
nullptr;
766 int8 _oldCursorState = 0;
767 int _curCursorState = 0;
768 int _curCursorWidth = 0;
769 int _curCursorHeight = 0;
770 int _curCursorHotspotX = 0;
771 int _curCursorHotspotY = 0;
773 virtual void setSnailCursor() {}
776 Common::KeyState showBannerAndPause(
int bannerId, int32 waitTime,
const char *msg, ...);
777 bool showBannerAndPauseForTextInput(
int bannerId,
const char *prompt,
Common::String &input, uint maxLength = 255);
778 Common::KeyState showOldStyleBannerAndPause(
const char *msg,
int color, int32 waitTime);
779 Common::KeyState printMessageAndPause(
const char *msg,
int color, int32 waitTime,
bool drawOnSentenceLine);
782 void setBannerColors(
int bannerId,
byte r,
byte g,
byte b);
783 virtual int getBannerColor(
int bannerId);
784 void setUpInternalGUIControl(
int id,
int normalFillColor,
int normalTextColor,
785 int topLineColor,
int bottomLineColor,
int leftLineColor,
int rightLineColor,
786 int highlightedTextColor,
int highlightedFillColor,
787 int anchorPointX,
int anchorPointY,
int x,
int y,
const char *label,
bool centerFlag,
bool unknownFlag);
788 void drawInternalGUIControl(
int id,
bool highlightColor);
789 int getInternalGUIControlFromCoordinates(
int x,
int y);
790 virtual bool isSmushActive() {
return false; }
791 virtual bool isInsaneActive() {
return false; }
793 virtual void queryQuit(
bool returnToLauncher);
794 virtual void queryRestart();
795 virtual const char *getGUIString(
int stringId);
796 void waitForBannerInput(int32 waitTime,
Common::KeyState &ks,
bool &leftBtnClicked,
bool &rightBtnClicked,
bool handleMouseWheel =
false);
797 virtual int getGUIStringHeight(
const char *str);
798 virtual int getGUIStringWidth(
const char *str);
799 virtual void drawGUIText(
const char *buttonString,
Common::Rect *clipRect,
int textXPos,
int textYPos,
int textColor,
bool centerFlag);
800 void getSliderString(
int stringId,
int value,
char *sliderString,
int size);
801 virtual int getMusicVolume();
802 virtual int getSpeechVolume();
803 virtual int getSFXVolume();
804 virtual void setMusicVolume(
int volume);
805 virtual void setSpeechVolume(
int volume);
806 virtual void setSFXVolume(
int volume);
807 virtual void toggleVoiceMode();
808 virtual void handleLoadDuringSmush() {}
809 virtual void setSkipVideo(
int value) {}
812 virtual void setUpMainMenuControls();
813 void setUpMainMenuControlsSegaCD();
814 void setUpMainMenuControlsIndy4Jap();
815 void drawMainMenuControls();
816 void drawMainMenuControlsSegaCD();
817 void updateMainMenuControls();
818 void updateMainMenuControlsSegaCD();
819 void drawMainMenuTitle(
const char *title);
820 bool executeMainMenuOperation(
int op,
int mouseX,
int mouseY,
bool &hasLoadedState);
821 bool executeMainMenuOperationSegaCD(
int op,
int mouseX,
int mouseY,
bool &hasLoadedState);
822 bool shouldHighlightLabelAndWait(
int clickedControl);
823 void fillSavegameLabels();
824 bool canWriteGame(
int slotId);
825 bool userWriteLabelRoutine(
Common::KeyState &ks,
bool &leftMsClicked,
bool &rightMsClicked);
826 void saveCursorPreMenu();
827 void restoreCursorPostMenu();
828 void saveSurfacesPreGUI();
829 void restoreSurfacesPostGUI();
830 void showDraftsInventory();
831 void setUpDraftsInventory();
832 void drawDraftsInventory();
835 char displayMessage(MSVC_PRINTF
const char *message, ...)
GCC_PRINTF(2, 3);
836 bool displayMessageYesNo(MSVC_PRINTF const
char *message, ...)
GCC_PRINTF(2, 3);
837 bool displayMessageOKQuit(MSVC_PRINTF const
char *message, ...)
GCC_PRINTF(2, 3);
843 Actor **_actors =
nullptr;
844 Actor **_sortedActors =
nullptr;
846 byte *_arraySlot =
nullptr;
847 uint16 *_inventory =
nullptr;
848 uint16 *_newNames =
nullptr;
852 #define VAR(x) scummVar(x, #x, __FILE__, __LINE__)
853 int32& scummVar(
byte var,
const char *varName,
const char *file,
int line) {
855 error(
"Illegal access to variable %s in file %s, line %d", varName, file, line);
857 return _scummVars[var];
859 int32 scummVar(
byte var,
const char *varName,
const char *file,
int line)
const {
861 error(
"Illegal access to variable %s in file %s, line %d", varName, file, line);
863 return _scummVars[var];
866 bool applyMi2NiDemoOverride();
879 bool _loaded =
false;
880 bool _attempted =
false;
881 bool _active =
false;
883 bool _mi2DemoVarsApplied =
false;
887 uint32 _streamOff = 0;
888 uint32 _streamBytes = 0;
890 uint32 _nextIndex = 0;
893 bool _hasPrevMbs =
false;
895 uint32 _firstInteractIndex = 0;
896 bool _firstInteractValid =
false;
900 bool _pendingLUp =
false;
901 bool _pendingRUp =
false;
903 bool _sputmCmdActive =
false;
904 byte _sputmCmdEnterCount = 0;
914 void mi2DemoArmPlaybackByRoom(
ScummEngine *engine);
915 void mi2DemoPlaybackJumpRoom(
ScummEngine *engine,
int room);
916 bool handleMi2NIDemoSputmDebugKey(
ScummEngine *engine, uint16 rawKey);
923 int32 *_roomVars =
nullptr;
924 int32 *_scummVars =
nullptr;
925 byte *_bitVars =
nullptr;
928 int _numVariables = 0;
929 int _numBitVariables = 0;
930 int _numLocalObjects = 0;
931 int _numGlobalObjects = 0;
934 int _numFlObject = 0;
935 int _numInventory = 0;
936 int _numNewNames = 0;
937 int _numGlobalScripts = 0;
938 int _numRoomVariables = 0;
939 int _numPalettes = 0;
946 int _numLocalScripts = 60, _numImages = 0, _numRooms = 0, _numScripts = 0, _numSounds = 0;
947 int _numCostumes = 0;
948 int32 _numCharsets = 0;
953 int _NESCostumeSet = 0;
954 void NES_loadCostumeSet(
int n);
955 byte *_NEScostdesc =
nullptr, *_NEScostlens =
nullptr, *_NEScostoffs =
nullptr, *_NEScostdata =
nullptr;
956 byte _NESPatTable[2][4096];
957 byte _NESPalette[2][16];
958 byte _NESBaseTiles = 0;
960 int _NESStartStrip = 0;
963 int _curPalIndex = 0;
966 byte _currentRoom = 0;
967 int _roomResource = 0;
968 bool _egoPositioned =
false;
972 virtual Common::Path generateFilename(
const int room)
const;
976 bool _keyDownMap[512];
977 bool _actionMap[kScummActionCount];
982 uint16 _mouseAndKeyboardStat = 0;
983 byte _leftBtnPressed = 0, _rightBtnPressed = 0;
985 int _mouseWheelFlag = 0;
987 bool _setupIsComplete =
false;
999 bool _dumpScripts =
false;
1000 bool _hexdumpScripts =
false;
1001 bool _showStack =
false;
1002 bool _debugMode =
false;
1005 byte _saveLoadFlag = 0, _saveLoadSlot = 0;
1006 uint32 _lastSaveTime = 0;
1007 bool _saveTemporaryState =
false;
1008 bool _pauseSoundsDuringSave =
true;
1009 bool _loadFromLauncher =
false;
1010 bool _videoModeChanged =
false;
1016 bool loadState(
int slot,
bool compat);
1023 virtual int checkSoundEngineSaveDataSize(
Serializer &s);
1025 void copyHeapSaveGameToFile(
int slot,
const char *saveName);
1026 bool changeSavegameName(
int slot,
char *newName);
1030 Common::String makeSavegameName(
int slot,
bool temporary)
const {
1031 return makeSavegameName(
_targetName, slot, temporary);
1034 int getKeyState(
int key);
1035 int getActionState(ScummAction action);
1041 void listSavegames(
bool *marks,
int num);
1044 void requestLoad(
int slot);
1047 bool canPauseSoundsDuringSave()
const {
return _pauseSoundsDuringSave; }
1051 static bool querySaveMetaInfos(
const char *target,
int slot,
int heversion,
Common::String &desc,
Graphics::Surface *&thumbnail, SaveStateMetaInfos *&timeInfos);
1058 uint32 _localScriptOffsets[1024];
1060 const byte *_scriptPointer =
nullptr;
1061 const byte *_scriptOrgPointer =
nullptr;
1062 const byte *
const *_lastCodePtr =
nullptr;
1064 bool _debug =
false;
1065 byte _currentScript = 0xFF;
1066 int _scummStackPos = 0;
1069 char _engineVersionString[50];
1070 char _dataFileVersionString[50];
1072 OpcodeEntry _opcodes[256];
1079 return _currentScript != 0xFF && vm.slot[_currentScript].number == script;
1082 virtual void setupOpcodes() = 0;
1083 void executeOpcode(
byte i);
1084 const char *getOpcodeDesc(
byte i);
1086 void initializeLocals(
int slot,
int *vars);
1087 int getScriptSlot();
1089 void startScene(
int room,
Actor *a,
int b);
1093 void runScript(
int script,
bool freezeResistant,
bool recursive,
int *lvarptr,
int cycle = 0);
1094 void stopScript(
int script);
1095 void nukeArrays(
byte scriptSlot);
1098 void runObjectScript(
int script,
int entry,
bool freezeResistant,
bool recursive,
int *vars,
int slot = -1,
int cycle = 0);
1099 void runScriptNested(
int script);
1100 void executeScript();
1101 void updateScriptPtr();
1102 virtual void runInventoryScript(
int i);
1103 virtual void runInventoryScriptEx(
int i);
1104 virtual void checkAndRunSentenceScript();
1105 bool monkey1HermanNoteWorkaround(
const SentenceTab &st);
1106 void runExitScript();
1107 void runEntryScript();
1108 void runQuitScript();
1109 void runAllScripts();
1110 void freezeScripts(
int scr);
1111 void unfreezeScripts();
1113 bool isScriptInUse(
int script)
const;
1114 bool isRoomScriptRunning(
int script)
const;
1115 bool isScriptRunning(
int script)
const;
1117 void killAllScriptsExceptCurrent();
1118 void killScriptsAndResources();
1119 void decreaseScriptDelay(
int amount);
1121 void stopObjectCode();
1122 void stopObjectScript(
int script);
1124 void getScriptBaseAddress();
1125 void resetScriptPointer();
1126 int getVerbEntrypoint(
int obj,
int entry);
1128 void refreshScriptPointer();
1129 byte fetchScriptByte();
1130 virtual uint fetchScriptWord();
1131 virtual int fetchScriptWordSigned();
1132 uint fetchScriptDWord();
1133 int fetchScriptDWordSigned();
1134 void ignoreScriptWord() { fetchScriptWord(); }
1135 void ignoreScriptByte() { fetchScriptByte(); }
1138 virtual int readVar(uint var);
1139 virtual void writeVar(uint var,
int value);
1141 virtual void resetSentence() {}
1144 virtual void beginCutscene(
int *args);
1145 virtual void endCutscene();
1146 void abortCutscene();
1147 void beginOverride();
1150 void copyScriptString(
byte *dst);
1151 int resStrLen(
const byte *src);
1152 void doSentence(
int c,
int b,
int a);
1155 BaseScummFile *_fileHandle =
nullptr;
1156 uint32 _fileOffset = 0;
1163 ScummFile *instantiateScummFile(
bool indexPAKFiles =
true);
1166 int _resourceHeaderSize = 8;
1167 byte _resourceMapper[128];
1168 const byte *_resourceLastSearchBuf;
1169 uint32 _resourceLastSearchSize;
1171 virtual void allocateArrays();
1172 void openRoom(
int room);
1174 void deleteRoomOffsets();
1175 virtual void readRoomsOffsets();
1176 void askForDisk(
const Common::Path &filename,
int disknum);
1177 byte getEncByte(
int room);
1178 bool openResourceFile(
const Common::Path &filename,
byte encByte);
1180 void loadPtrToResource(
ResType type, ResId idx,
const byte *ptr);
1181 virtual int readResTypeList(
ResType type);
1184 int loadResource(
ResType type, ResId idx);
1186 int getResourceRoomNr(
ResType type, ResId idx);
1187 virtual uint32 getResourceRoomOffset(
ResType type, ResId idx);
1189 void scriptOverride(ResId room,
int script);
1192 int getResourceSize(
ResType type, ResId idx);
1193 byte *getResourceAddress(
ResType type, ResId idx);
1194 virtual byte *getStringAddress(ResId idx);
1195 byte *getStringAddressVar(
int i);
1196 void ensureResourceLoaded(
ResType type, ResId idx);
1203 int readSoundResource(ResId idx);
1204 int readSoundResourceSmallHeader(ResId idx);
1205 bool isResourceInUse(
ResType type, ResId idx)
const;
1207 virtual void setupRoomSubBlocks();
1208 virtual void resetRoomSubBlocks();
1210 virtual void clearRoomObjects();
1211 virtual void resetRoomObjects();
1212 virtual void resetRoomObject(
ObjectData *od,
const byte *room,
const byte *searchptr = NULL);
1214 virtual void readArrayFromIndexFile();
1215 virtual void readMAXS(
int blockSize) = 0;
1216 virtual void readGlobalObjects();
1217 virtual void readIndexFile();
1218 virtual void readIndexBlock(uint32 block, uint32 itemsize);
1219 virtual void loadCharset(
int i);
1220 void nukeCharset(
int i);
1222 int _lastLoadedRoom = 0;
1224 const byte *findResourceData(uint32 tag,
const byte *ptr);
1225 const byte *findResource(uint32 tag,
const byte *ptr);
1226 void applyWorkaroundIfNeeded(
ResType type,
int idx);
1227 bool verifyMI2MacBootScript();
1228 bool verifyMI2MacBootScript(
byte *buf,
int size);
1229 bool tryPatchMI1CannibalScript(
byte *buf,
int size);
1231 int getResourceDataSize(
const byte *ptr)
const;
1232 void dumpResource(
const char *tag,
int index,
const byte *ptr,
int length = -1);
1236 byte OF_OWNER_ROOM = 0;
1237 int getInventorySlot();
1238 int findInventory(
int owner,
int index);
1239 int getInventoryCount(
int owner);
1242 byte *_objectOwnerTable =
nullptr, *_objectRoomTable =
nullptr, *_objectStateTable =
nullptr;
1243 int _numObjectsInRoom = 0;
1246 uint32 *_classData =
nullptr;
1249 void markObjectRectAsDirty(
int obj);
1250 virtual void loadFlObject(uint
object, uint room);
1251 void nukeFlObjects(
int min,
int max);
1252 int findFlObjectSlot();
1253 int findLocalObjectSlot();
1254 void addObjectToInventory(uint obj, uint room);
1255 void updateObjectStates();
1257 bool getClass(
int obj,
int cls)
const;
1259 void putClass(
int obj,
int cls,
bool set);
1260 int getState(
int obj);
1261 void putState(
int obj,
int state);
1262 void setObjectState(
int obj,
int state,
int x,
int y);
1263 int getOwner(
int obj)
const;
1264 void putOwner(
int obj,
int owner);
1265 void setOwnerOf(
int obj,
int owner);
1266 void clearOwnerOf(
int obj);
1267 int getObjectRoom(
int obj)
const;
1268 virtual bool objIsActor(
int obj);
1269 virtual int objToActor(
int obj);
1270 virtual int actorToObj(
int actor);
1271 int getObjX(
int obj);
1272 int getObjY(
int obj);
1273 void getObjectWidth(
int object,
int &width) {
int x, y, dir; getObjectXYPos(
object, x, y, dir, width); }
1274 void getObjectXYPos(
int object,
int &x,
int &y) {
int dir, width; getObjectXYPos(
object, x, y, dir, width); }
1275 void getObjectXYPos(
int object,
int &x,
int &y,
int &dir) {
int width; getObjectXYPos(
object, x, y, dir, width); }
1276 void getObjectXYPos(
int object,
int &x,
int &y,
int &dir,
int &width);
1277 int getObjOldDir(
int obj);
1278 int getObjNewDir(
int obj);
1279 int getObjectIndex(
int object)
const;
1280 int getObjectImageCount(
int object);
1281 int whereIsObject(
int object)
const;
1282 int findObject(
int x,
int y);
1283 void findObjectInRoom(FindObjectInRoom *fo,
byte findWhat, uint
object, uint room);
1285 int getObjectOrActorWidth(
int object,
int &width);
1286 int getObjectOrActorXY(
int object,
int &x,
int &y);
1287 int getDist(
int x,
int y,
int x2,
int y2);
1290 int getObjActToObjActDist(
int a,
int b);
1291 const byte *getObjOrActorName(
int obj);
1292 void setObjectName(
int obj);
1294 void addObjectToDrawQue(
int object);
1295 void removeObjectFromDrawQue(
int object);
1296 void clearDrawObjectQueue();
1297 void processDrawQue();
1299 virtual void clearDrawQueues();
1301 uint32 getOBCDOffs(
int object)
const;
1302 byte *getOBCDFromObject(
int obj,
bool v0CheckInventory =
true);
1303 const byte *getOBIMFromObjectData(
const ObjectData &od);
1304 const byte *getObjectImage(
const byte *ptr,
int state);
1305 virtual int getObjectIdFromOBIM(
const byte *obim);
1309 uint16 _verbMouseOver = 0;
1311 uint16 _userState = 0;
1313 virtual void handleMouseOver(
bool updateInventory);
1314 virtual void redrawVerbs();
1315 virtual void checkExecVerbs();
1317 void verbMouseOver(
int verb);
1318 int findVerbAtPos(
int x,
int y)
const;
1319 virtual void drawVerb(
int verb,
int mode, Common::TextToSpeechManager::Action ttsAction = Common::TextToSpeechManager::INTERRUPT);
1320 virtual void runInputScript(
int clickArea,
int val,
int mode);
1321 void restoreVerbBG(
int verb);
1322 void drawVerbBitmap(
int verb,
int x,
int y);
1323 int getVerbSlot(
int id,
int mode)
const;
1324 void killVerb(
int slot);
1325 void setVerbObject(uint room, uint
object, uint verb);
1328 bool isValidActor(
int id)
const;
1331 Actor *derefActor(
int id,
const char *errmsg = 0)
const;
1332 Actor *derefActorSafe(
int id,
const char *errmsg)
const;
1336 void playActorSounds();
1337 void redrawAllActors();
1338 virtual void setActorRedrawFlags();
1341 void resetV1ActorTalkColor();
1342 virtual void resetActorBgs();
1343 virtual void processActors();
1344 void processUpperActors();
1345 virtual int getActorFromPos(
int x,
int y);
1349 byte _actorToPrintStrFor = 0, _V1TalkingActor = 0;
1350 int _sentenceNum = 0;
1351 SentenceTab _sentence[NUM_SENTENCE];
1352 StringTab _string[6];
1354 int16 _talkDelay = 0;
1355 int _NES_lastTalkingActor = 0;
1356 int _NES_talkColor = 0;
1358 virtual void actorTalk(
const byte *msg);
1360 int getTalkingActor();
1361 void setTalkingActor(
int variable);
1364 bool isCostumeInUse(
int i)
const;
1368 uint16 _screenB = 0, _screenH = 0;
1370 int _roomHeight = 0, _roomWidth = 0;
1371 int _screenHeight = 0, _screenWidth = 0;
1372 VirtScreen _virtscr[4];
1374 bool _cameraIsFrozen =
false;
1376 int _screenStartStrip = 0, _screenEndStrip = 0;
1378 bool _forceBannerVirtScreen =
false;
1389 bool _useMacScreenCorrectHeight =
true;
1390 int _macScreenDrawOffset = 20;
1393 uint8 _bytesPerPixel = 1;
1397 ColorCycle _colorCycle[16];
1398 uint8 _colorUsedByCycle[256];
1401 uint32 _ENCD_offs = 0, _EXCD_offs = 0;
1402 uint32 _CLUT_offs = 0, _EPAL_offs = 0;
1403 uint32 _IM00_offs = 0, _PALS_offs = 0;
1406 bool _fullRedraw =
false, _bgNeedsRedraw =
false;
1407 bool _screenEffectFlag =
false, _completeScreenRedraw =
false;
1408 bool _disableFadeInEffect =
false;
1411 int hotspotX, hotspotY, width, height;
1412 byte animate, animateIndex;
1418 byte _grabbedCursor[16384];
1419 byte _macGrabbedCursor[16384 * 4];
1420 byte _currentCursor = 0;
1422 byte _newEffect = 0, _switchRoomEffect2 = 0, _switchRoomEffect = 0;
1423 bool _doEffect =
false;
1425 bool _snapScroll =
false;
1427 virtual void setBuiltinCursor(
int index) {}
1429 bool isLightOn()
const;
1431 virtual int getCurrentLights()
const;
1434 void initScreens(
int b,
int h);
1435 void initVirtScreen(
VirtScreenNumber slot,
int top,
int width,
int height,
bool twobufs,
bool scrollable);
1436 void initBGBuffers(
int height);
1437 void initCycl(
const byte *ptr);
1439 void decodeNESBaseTiles();
1440 void playNESTitleScreens();
1442 void drawObject(
int obj,
int scrollType);
1443 void drawRoomObjects(
int arg);
1444 void drawRoomObject(
int i,
int arg);
1445 void drawBox(
int x,
int y,
int x2,
int y2,
int color);
1446 void drawLine(
int x1,
int y1,
int x2,
int y2,
int color);
1447 void drawPixel(VirtScreen *vs,
int x,
int y, int16 color,
bool useBackbuffer =
false);
1449 void moveScreen(
int dx,
int dy,
int height);
1451 void restoreBackground(
Common::Rect rect,
byte backcolor = 0);
1452 void redrawBGStrip(
int start,
int num);
1453 virtual void redrawBGAreas();
1456 void setCameraAtEx(
int at);
1457 virtual void setCameraAt(
int pos_x,
int pos_y);
1458 virtual void setCameraFollows(Actor *a,
bool setCamera =
false);
1459 virtual void moveCamera();
1460 virtual void panCameraTo(
int x,
int y);
1462 void actorFollowCamera(
int act);
1464 const byte *getPalettePtr(
int palindex,
int room);
1466 void setPaletteFromTable(
const byte *ptr,
int numcolor,
int firstIndex = 0);
1467 void resetPalette(
bool isBootUp =
false);
1469 void setCurrentPalette(
int pal);
1470 void setRoomPalette(
int pal,
int room);
1471 void setPCEPaletteFromPtr(
const byte *ptr);
1472 void setAmigaPaletteFromPtr(
const byte *ptr);
1473 virtual void setPaletteFromPtr(
const byte *ptr,
int numcolor = -1);
1474 void setV1ColorTable(
int renderMode);
1476 virtual void setPalColor(
int index,
int r,
int g,
int b);
1477 void setDirtyColors(
int min,
int max);
1478 const byte *findPalInPals(
const byte *pal,
int index);
1479 void swapPalColors(
int a,
int b);
1480 virtual void copyPalColor(
int dst,
int src);
1481 void cyclePalette();
1482 void stopCycle(
int i);
1483 virtual void palManipulateInit(
int resID,
int start,
int end,
int time);
1484 void palManipulate();
1485 uint32 findClosestPaletteColor(
byte *palette,
int paletteLength,
byte r,
byte g,
byte b);
1486 void applyGrayscaleToPaletteRange(
int min,
int max);
1487 bool haveToApplyMonkey1PaletteFix();
1490 uint8 *getHEPaletteSlot(uint16 palSlot);
1491 uint16 get16BitColor(uint8 r, uint8 g, uint8 b);
1492 uint32 getPaletteColorFromRGB(
byte *palette,
byte r,
byte g,
byte b);
1493 uint32 getPackedRGBColorFromPalette(
byte *palette, uint32 color);
1494 void fetchBlackAndWhite(uint32 &black, uint32 &white,
byte *palette,
int paletteEntries);
1495 int remapPaletteColor(
int r,
int g,
int b,
int threshold);
1496 void readPCEPalette(
const byte **ptr,
byte **dest,
int numEntries);
1497 void colorPCEToRGB(uint16 color,
byte *r,
byte *g,
byte *b);
1498 void setPCETextPalette(uint8 color);
1500 void moveMemInPalRes(
int start,
int end,
byte direction);
1501 void setShadowPalette(
int slot,
int redScale,
int greenScale,
int blueScale,
int startColor,
int endColor);
1502 void setShadowPalette(
int redScale,
int greenScale,
int blueScale,
int startColor,
int endColor,
int start,
int end);
1503 virtual void darkenPalette(
int redScale,
int greenScale,
int blueScale,
int startColor,
int endColor);
1506 void markRectAsDirty(
VirtScreenNumber virt,
int left,
int right,
int top,
int bottom,
int dirtybit = 0);
1508 markRectAsDirty(virt, rect.left, rect.right, rect.top, rect.bottom, dirtybit);
1512 byte *_compositeBuf;
1513 byte *_hercCGAScaleBuf =
nullptr;
1514 bool _enableEGADithering =
false;
1515 bool _supportsEGADithering =
false;
1516 bool _enableSegaShadowMode =
false;
1518 virtual void drawDirtyScreenParts();
1520 void drawStripToScreen(VirtScreen *vs,
int x,
int width,
int top,
int bottom);
1522 void mac_markScreenAsDirty(
int x,
int y,
int w,
int h);
1523 void mac_drawStripToScreen(VirtScreen *vs,
int top,
int x,
int y,
int width,
int height);
1524 void mac_drawIndy3TextBox();
1525 void mac_undrawIndy3TextBox();
1526 void mac_undrawIndy3CreditsText();
1527 void mac_drawBufferToScreen(
const byte *buffer,
int pitch,
int x,
int y,
int width,
int height,
bool epxRectangleExpansion =
true);
1528 void mac_updateCompositeBuffer(
const byte *buffer,
int pitch,
int x,
int y,
int width,
int height);
1529 void mac_blitDoubleResImage(
const byte *buffer,
int pitch,
int x,
int y,
int width,
int height);
1530 void mac_applyDoubleResToBuffer(
const byte *inputBuffer,
byte *outputBuffer,
int width,
int height,
int inputPitch,
int outputPitch);
1531 void mac_blitEPXImage(
const byte *buffer,
int pitch,
int x,
int y,
int width,
int height,
bool epxRectangleExpansion =
true);
1532 void mac_applyEPXToBuffer(
const byte *inputBuffer,
byte *outputBuffer,
int width,
int height,
int inputPitch,
int outputPitch,
int xOffset,
int yOffset,
int bufferWidth,
int bufferHeight);
1533 void mac_scaleCursor(
byte *&outCursor,
int &outHotspotX,
int &outHotspotY,
int &outWidth,
int &outHeight);
1534 void mac_toggleSmoothing();
1536 Common::KeyState mac_showOldStyleBannerAndPause(
const char *msg, int32 waitTime);
1538 const byte *postProcessDOSGraphics(VirtScreen *vs,
int &pitch,
int &x,
int &y,
int &width,
int &height)
const;
1539 const byte *ditherVGAtoEGA(
int &pitch,
int &x,
int &y,
int &width,
int &height)
const;
1542 VirtScreen *findVirtScreen(
int y);
1543 byte *getMaskBuffer(
int x,
int y,
int z);
1546 void fadeIn(
int effect);
1547 void fadeOut(
int effect);
1549 void dissolveEffectSelector();
1550 void transitionEffect(
int a);
1551 void dissolveEffect(
int width,
int height);
1552 void scrollEffect(
int dir);
1554 void updateScreenShakeEffect();
1557 double getTimerFrequency();
1558 double getAmigaMusicTimerFrequency();
1561 bool _shakeEnabled =
false;
1562 bool _shakeTempSavedState =
false;
1563 uint _shakeFrame = 0;
1564 uint32 _shakeNextTick = 0;
1565 uint32 _shakeTickCounter = 0;
1566 double _shakeTimerRate;
1567 double _timerFrequency;
1569 void setShake(
int mode);
1571 int _drawObjectQueNr = 0;
1572 byte _drawObjectQue[200];
1585 uint32 gfxUsageBits[410 * 3];
1587 void upgradeGfxUsageBits();
1588 void setGfxUsageBit(
int strip,
int bit);
1589 void clearGfxUsageBit(
int strip,
int bit);
1592 bool testGfxUsageBit(
int strip,
int bit) {
1593 assert(strip >= 0 && strip <
ARRAYSIZE(gfxUsageBits) / 3);
1594 assert(1 <= bit && bit <= 96);
1596 return (gfxUsageBits[3 * strip + bit / 32] & (1 << (bit % 32))) != 0;
1599 bool testGfxAnyUsageBits(
int strip);
1600 bool testGfxObjectUsageBits(
int strip);
1601 bool testGfxOtherUsageBits(
int strip,
int bit);
1604 byte _roomPalette[256];
1605 byte *_shadowPalette =
nullptr;
1606 bool _skipDrawObject = 0;
1608 int _soundEnabled = 0;
1611 byte _HEV7ActorPalette[256];
1612 uint8 *_hePalettes =
nullptr;
1613 uint16 _hePaletteSlot = 0;
1614 uint16 *_16BitPalette =
nullptr;
1617 byte *_verbPalette =
nullptr;
1619 ScummEngine_v0_Delays _V0Delay;
1622 int _shadowPaletteSize = 0;
1623 byte _currentPalette[3 * 256];
1624 byte _darkenPalette[3 * 256];
1625 int _paletteChangedCounter = 1;
1627 int _palDirtyMin = 0, _palDirtyMax = 0;
1629 byte _palManipStart = 0, _palManipEnd = 0;
1630 uint16 _palManipCounter = 0;
1631 byte *_palManipPalette =
nullptr;
1632 byte *_palManipIntermediatePal =
nullptr;
1634 bool _haveActorSpeechMsg =
false;
1635 bool _useTalkAnims =
false;
1636 uint16 _defaultTextSpeed = 0;
1638 bool _native_mt32 =
false;
1639 bool _copyProtection =
false;
1640 bool _shadowPalRemap =
false;
1643 uint16 _amigaFirstUsedColor = 0;
1644 byte _amigaPalette[3 * 64];
1645 void amigaPaletteFindFirstUsedColor();
1646 void mapRoomPalette(
int idx);
1647 int remapRoomPaletteColor(
int r,
int g,
int b);
1648 void mapVerbPalette(
int idx);
1649 int remapVerbPaletteColor(
int r,
int g,
int b);
1652 byte *_egaColorMap[2];
1655 uint16 _extraBoxFlags[65];
1658 byte *getBoxMatrixBaseAddr();
1659 byte *getBoxConnectionBase(
int box);
1661 int getNextBox(
byte from,
byte to);
1663 void setBoxFlags(
int box,
int val);
1664 void setBoxScale(
int box,
int b);
1666 bool checkXYInBoxBounds(
int box,
int x,
int y);
1668 BoxCoords getBoxCoordinates(
int boxnum);
1670 byte getMaskFromBox(
int box);
1671 Box *getBoxBaseAddr(
int box);
1672 byte getBoxFlags(
int box);
1673 int getBoxScale(
int box);
1675 int getScale(
int box,
int x,
int y);
1676 int getScaleFromSlot(
int slot,
int x,
int y);
1686 void setScaleSlot(
int slot,
int x1,
int y1,
int scale1,
int x2,
int y2,
int scale2);
1687 void setBoxScaleSlot(
int box,
int slot);
1688 void convertScaleTableToScaleSlot(
int slot);
1690 void calcItineraryMatrix(
byte *itineraryMatrix,
int num);
1691 void createBoxMatrix();
1692 virtual bool areBoxesNeighbors(
int i,
int j);
1697 byte _charsetColorMap[16];
1704 int _textSurfaceMultiplier = 0;
1706 bool _isModernMacVersion =
false;
1707 bool _useGammaCorrection =
true;
1710 MacGui *_macGui =
nullptr;
1711 bool _useMacGraphicsSmoothing =
true;
1712 byte _completeScreenBuffer[320 * 200];
1715 byte _charsetColor = 0;
1716 byte _charsetData[23][16];
1718 int _charsetBufPos = 0;
1719 byte _charsetBuffer[512];
1721 bool _keepText =
false;
1724 int _nextLeft = 0, _nextTop = 0;
1729 bool _voiceNextString =
false;
1730 bool _checkPreviousSaid =
false;
1731 bool _voicePassHelpButtons =
false;
1732 int _previousVerb = -1;
1733 int _previousControl = -1;
1738 void restoreCharsetBg();
1739 void clearCharsetMask();
1740 void clearTextSurface();
1742 virtual void initCharset(
int charset);
1744 virtual void printString(
int m,
const byte *msg);
1746 virtual bool handleNextCharsetCode(
Actor *a,
int *c);
1747 virtual void drawSentence() {}
1748 virtual void displayDialog();
1749 int countNumberOfWaits();
1751 void drawString(
int a,
const byte *msg, Common::TextToSpeechManager::Action ttsAction = Common::TextToSpeechManager::QUEUE);
1752 virtual void fakeBidiString(
byte *ltext,
bool ignoreVerb,
int ltextSize)
const;
1753 void wrapSegaCDText();
1754 void debugMessage(
const byte *msg);
1755 virtual void showMessageDialog(
const byte *msg);
1758 void sayText(
const Common::String &text, Common::TextToSpeechManager::Action action = Common::TextToSpeechManager::QUEUE)
const;
1759 void stopTextToSpeech()
const;
1760 void sayButtonText();
1763 virtual int convertMessageToString(
const byte *msg,
byte *dst,
int dstSize);
1764 int convertIntMessage(
byte *dst,
int dstSize,
int var);
1765 int convertVerbMessage(
byte *dst,
int dstSize,
int var);
1766 int convertNameMessage(
byte *dst,
int dstSize,
int var);
1767 int convertStringMessage(
byte *dst,
int dstSize,
int var);
1773 virtual void translateText(
const byte *text,
byte *trans_buff,
int transBufferSize);
1775 bool reverseIfNeeded(
const byte *text,
byte *reverseBuf,
int reverseBufSize)
const;
1777 Common::CodePage getDialogCodePage()
const;
1780 bool _useCJKMode =
false;
1781 bool _useMultiFont =
false;
1782 int _numLoadedFont = 0;
1783 int _2byteShadow = 0;
1784 bool _force2ByteCharHeight =
false;
1786 int _2byteHeight = 0;
1787 int _2byteWidth = 0;
1789 byte _newLineCharacter = 0;
1790 byte *get2byteCharPtr(
int idx);
1792 bool isScummvmKorTarget();
1793 bool hasLocalizer();
1796 byte *_2byteFontPtr =
nullptr;
1797 byte *_2byteMultiFontPtr[20];
1798 int _2byteMultiHeight[20];
1799 int _2byteMultiWidth[20];
1800 int _2byteMultiShadow[20];
1803 struct TranslatedLine {
1804 uint32 originalTextOffset;
1805 uint32 translatedTextOffset;
1808 struct TranslationRange {
1812 TranslationRange(uint32 left_, uint32 right_) : left(left_), right(right_) {}
1813 TranslationRange() : left(0), right(0) {}
1816 struct TranslationRoom {
1820 bool _existLanguageFile =
false;
1821 bool _isRTL =
false;
1822 byte *_languageBuffer =
nullptr;
1823 int _numTranslatedLines = 0;
1824 TranslatedLine *_translatedLines =
nullptr;
1825 uint16 *_languageLineIndex =
nullptr;
1828 const byte *searchTranslatedLine(
const byte *text,
const TranslationRange &range,
bool useIndex);
1830 virtual void createTextRenderer(GlyphRenderer_v7 *gr) {}
1835 byte VAR_KEYPRESS = 0xFF;
1836 byte VAR_SYNC = 0xFF;
1837 byte VAR_EGO = 0xFF;
1838 byte VAR_CAMERA_POS_X = 0xFF;
1839 byte VAR_HAVE_MSG = 0xFF;
1840 byte VAR_ROOM = 0xFF;
1841 byte VAR_OVERRIDE = 0xFF;
1842 byte VAR_MACHINE_SPEED = 0xFF;
1844 byte VAR_NUM_ACTOR = 0xFF;
1845 byte VAR_CURRENT_LIGHTS = 0xFF;
1846 byte VAR_CURRENTDRIVE = 0xFF;
1847 byte VAR_CURRENTDISK = 0xFF;
1848 byte VAR_TMR_1 = 0xFF;
1849 byte VAR_TMR_2 = 0xFF;
1850 byte VAR_TMR_3 = 0xFF;
1851 byte VAR_MUSIC_TIMER = 0xFF;
1852 byte VAR_ACTOR_RANGE_MIN = 0xFF;
1853 byte VAR_ACTOR_RANGE_MAX = 0xFF;
1854 byte VAR_CAMERA_MIN_X = 0xFF;
1855 byte VAR_CAMERA_MAX_X = 0xFF;
1856 byte VAR_TIMER_NEXT = 0xFF;
1857 byte VAR_VIRT_MOUSE_X = 0xFF;
1858 byte VAR_VIRT_MOUSE_Y = 0xFF;
1859 byte VAR_ROOM_RESOURCE = 0xFF;
1860 byte VAR_LAST_SOUND = 0xFF;
1861 byte VAR_CUTSCENEEXIT_KEY = 0xFF;
1862 byte VAR_OPTIONS_KEY = 0xFF;
1863 byte VAR_TALK_ACTOR = 0xFF;
1864 byte VAR_CAMERA_FAST_X = 0xFF;
1865 byte VAR_SCROLL_SCRIPT = 0xFF;
1866 byte VAR_ENTRY_SCRIPT = 0xFF;
1867 byte VAR_ENTRY_SCRIPT2 = 0xFF;
1868 byte VAR_EXIT_SCRIPT = 0xFF;
1869 byte VAR_EXIT_SCRIPT2 = 0xFF;
1870 byte VAR_VERB_SCRIPT = 0xFF;
1871 byte VAR_SENTENCE_SCRIPT = 0xFF;
1872 byte VAR_INVENTORY_SCRIPT = 0xFF;
1873 byte VAR_CUTSCENE_START_SCRIPT = 0xFF;
1874 byte VAR_CUTSCENE_END_SCRIPT = 0xFF;
1875 byte VAR_CHARINC = 0xFF;
1876 byte VAR_WALKTO_OBJ = 0xFF;
1877 byte VAR_DEBUGMODE = 0xFF;
1878 byte VAR_HEAPSPACE = 0xFF;
1879 byte VAR_RESTART_KEY = 0xFF;
1880 byte VAR_PAUSE_KEY = 0xFF;
1881 byte VAR_MOUSE_X = 0xFF;
1882 byte VAR_MOUSE_Y = 0xFF;
1883 byte VAR_TIMER = 0xFF;
1884 byte VAR_TIMER_TOTAL = 0xFF;
1885 byte VAR_SOUNDCARD = 0xFF;
1886 byte VAR_VIDEOMODE = 0xFF;
1887 byte VAR_MAINMENU_KEY = 0xFF;
1888 byte VAR_FIXEDDISK = 0xFF;
1889 byte VAR_CURSORSTATE = 0xFF;
1890 byte VAR_USERPUT = 0xFF;
1891 byte VAR_SOUNDRESULT = 0xFF;
1892 byte VAR_TALKSTOP_KEY = 0xFF;
1893 byte VAR_FADE_DELAY = 0xFF;
1894 byte VAR_NOSUBTITLES = 0xFF;
1897 byte VAR_SOUNDPARAM = 0xFF;
1898 byte VAR_SOUNDPARAM2 = 0xFF;
1899 byte VAR_SOUNDPARAM3 = 0xFF;
1900 byte VAR_INPUTMODE = 0xFF;
1901 byte VAR_MEMORY_PERFORMANCE = 0xFF;
1902 byte VAR_VIDEO_PERFORMANCE = 0xFF;
1903 byte VAR_ROOM_FLAG = 0xFF;
1904 byte VAR_GAME_LOADED = 0xFF;
1905 byte VAR_NEW_ROOM = 0xFF;
1908 byte VAR_V5_TALK_STRING_Y = 0xFF;
1911 byte VAR_ROOM_WIDTH = 0xFF;
1912 byte VAR_ROOM_HEIGHT = 0xFF;
1913 byte VAR_SUBTITLES = 0xFF;
1914 byte VAR_V6_EMSSPACE = 0xFF;
1917 byte VAR_CAMERA_POS_Y = 0xFF;
1918 byte VAR_CAMERA_MIN_Y = 0xFF;
1919 byte VAR_CAMERA_MAX_Y = 0xFF;
1920 byte VAR_CAMERA_THRESHOLD_X = 0xFF;
1921 byte VAR_CAMERA_THRESHOLD_Y = 0xFF;
1922 byte VAR_CAMERA_SPEED_X = 0xFF;
1923 byte VAR_CAMERA_SPEED_Y = 0xFF;
1924 byte VAR_CAMERA_ACCEL_X = 0xFF;
1925 byte VAR_CAMERA_ACCEL_Y = 0xFF;
1926 byte VAR_CAMERA_DEST_X = 0xFF;
1927 byte VAR_CAMERA_DEST_Y = 0xFF;
1928 byte VAR_CAMERA_FOLLOWED_ACTOR = 0xFF;
1931 byte VAR_VERSION_KEY = 0xFF;
1932 byte VAR_DEFAULT_TALK_DELAY = 0xFF;
1933 byte VAR_CUSTOMSCALETABLE = 0xFF;
1934 byte VAR_BLAST_ABOVE_TEXT = 0xFF;
1935 byte VAR_VOICE_MODE = 0xFF;
1936 byte VAR_MUSIC_BUNDLE_LOADED = 0xFF;
1937 byte VAR_VOICE_BUNDLE_LOADED = 0xFF;
1939 byte VAR_LEFTBTN_DOWN = 0xFF;
1940 byte VAR_RIGHTBTN_DOWN = 0xFF;
1941 byte VAR_LEFTBTN_HOLD = 0xFF;
1942 byte VAR_RIGHTBTN_HOLD = 0xFF;
1943 byte VAR_PRE_SAVELOAD_SCRIPT = 0xFF;
1944 byte VAR_POST_SAVELOAD_SCRIPT = 0xFF;
1945 byte VAR_SAVELOAD_PAGE = 0xFF;
1946 byte VAR_OBJECT_LABEL_FLAG = 0xFF;
1949 byte VAR_CHARSET_MASK = 0xFF;
1952 byte VAR_V6_SOUNDMODE = 0xFF;
1955 byte VAR_CHARCOUNT = 0xFF;
1956 byte VAR_VERB_ALLOWED = 0xFF;
1957 byte VAR_ACTIVE_VERB = 0xFF;
1958 byte VAR_ACTIVE_OBJECT1 = 0xFF;
1959 byte VAR_ACTIVE_OBJECT2 = 0xFF;
1962 byte VAR_ALWAYS_REDRAW_ACTORS = 0xFF;
1963 byte VAR_SKIP_RESET_TALK_ACTOR = 0xFF;
1965 byte VAR_SOUND_CHANNEL = 0xFF;
1966 byte VAR_TALK_CHANNEL = 0xFF;
1967 byte VAR_SOUND_TOKEN_OFFSET = 0xFF;
1968 byte VAR_START_DYN_SOUND_CHANNELS = 0xFF;
1969 byte VAR_SOUND_CALLBACK_SCRIPT = 0xFF;
1971 byte VAR_EARLY_TALKIE_CALLBACK = 0xFF;
1972 byte VAR_EARLY_CHAN_0_CALLBACK = 0xFF;
1973 byte VAR_EARLY_CHAN_1_CALLBACK = 0xFF;
1974 byte VAR_EARLY_CHAN_2_CALLBACK = 0xFF;
1975 byte VAR_EARLY_CHAN_3_CALLBACK = 0xFF;
1977 byte VAR_MAIN_SCRIPT = 0xFF;
1979 byte VAR_DEFAULT_SCRIPT_PRIORITY = 0xFF;
1980 byte VAR_LAST_SCRIPT_PRIORITY = 0xFF;
1982 byte VAR_QUIT_SCRIPT = 0xFF;
1983 byte VAR_ERROR_FLAG = 0xFF;
1984 byte VAR_OPERATION_FAILURE = 0xFF;
1986 byte VAR_COLOR_BLACK = 0xFF;
1989 byte VAR_NUM_GLOBAL_OBJS = 0xFF;
1991 byte VAR_LAST_FRAME_BURN_TIME = 0xFF;
1992 byte VAR_LAST_FRAME_SCUMM_TIME = 0xFF;
1994 byte VAR_WINDEX_RUNNING = 0xFF;
1998 Graphics::FontSJIS *_cjkFont =
nullptr;
2002#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
2004 bool towns_isRectInStringBox(
int x1,
int y1,
int x2,
int y2);
2005 byte _townsPaletteFlags = 0;
2006 byte _townsCharsetColorMap[16];
2009 void towns_drawStripToScreen(VirtScreen *vs,
int dstX,
int dstY,
int srcX,
int srcY,
int w,
int h);
2010 void towns_fillTopLayerRect(
int x1,
int y1,
int x2,
int y2,
int col);
2011 void towns_swapVirtScreenArea(VirtScreen *vs,
int x,
int y,
int w,
int h);
2012 void towns_clearStrip(
int strip);
2014 void towns_setPaletteFromPtr(
const byte *ptr,
int numcolor = -1);
2015 void towns_setTextPaletteFromPtr(
const byte *ptr);
2017 void towns_setupPalCycleField(
int x1,
int y1,
int x2,
int y2);
2018 void towns_processPalCycleField();
2019 void towns_resetPalCycleFields();
2020 void towns_restoreCharsetBg();
2021 void towns_scriptScrollEffect(
int dir);
2023 void requestScroll(
int dir);
2024 void scrollLeft() { requestScroll(-1); }
2025 void scrollRight() { requestScroll(1); }
2026 void towns_waitForScroll(
int waitForDirection,
int threshold = 0);
2027 void towns_updateGfx();
2030 int _numCyclRects = 0;
2031 int _scrollRequest = 0;
2032 int _scrollDeltaAdjust = 0;
2033 bool _scrollNeedDeltaAdjust = 0;
2034 int _refreshDuration[20];
2035 int _refreshArrayPos = 0;
2036 bool _refreshNeedCatchUp =
false;
2037 bool _enableSmoothScrolling =
false;
2038 bool _forceFMTownsHiResMode =
false;
2039 uint32 _scrollTimer = 0;
2040 uint32 _scrollDestOffset = 0;
2041 uint16 _scrollFeedStrips[3];
2045 byte _townsOverrideShadowColor = 0;
2046 byte _textPalette[48];
2047 byte _townsClearLayerFlag = 1;
2048 byte _townsActiveLayerFlags = 3;
2049 static const uint8 _townsLayer2Mask[];
2051 TownsScreen *_townsScreen =
nullptr;
2053 void scrollLeft() { redrawBGStrip(
_gdi->_numStrips - 1, 1); }
2054 void scrollRight() { redrawBGStrip(0, 1); }
2055 void towns_updateGfx() {}
2056 void towns_waitForScroll(
int waitForDirection,
int threshold = 0) {}
2057 void towns_fillTopLayerRect(
int x1,
int y1,
int x2,
int y2,
int col) {}
2058 void towns_swapVirtScreenArea(VirtScreen *vs,
int x,
int y,
int w,
int h) {}
ErrorCode getCode() const
Definition: error.h:112
Definition: serializer.h:352
Definition: serializer.h:80
const Common::String _targetName
Definition: engine.h:192
EngineFeature
Definition: engine.h:293
Definition: palette.h:195
Definition: base-costume.h:49
Definition: base-costume.h:68
Definition: charset.h:159
Definition: localizer.h:31
Definition: macgui_impl.h:52
Definition: macgui_indy3.h:39
Definition: macgui_loom.h:33
Definition: macgui_v5.h:33
Definition: macgui_v6.h:33
Definition: player_towns.h:32
Definition: resource.h:80
Definition: debugger.h:33
bool canLoadGameStateCurrently(Common::U32String *msg=nullptr) override
bool canSaveGameStateCurrently(Common::U32String *msg=nullptr) override
Gdi * _gdi
Definition: scumm.h:571
uint32 _lastInputScriptTime
Definition: scumm.h:993
ResourceManager * _res
Definition: scumm.h:574
void pauseEngineIntern(bool pause) override
bool currentScriptSlotIs(uint16 script) const
Definition: scumm.h:1078
void syncSoundSettings() override
bool hasFeature(EngineFeature f) const override
Graphics::Surface _textSurface
Definition: scumm.h:1703
Common::Error loadGameState(int slot) override
void errorString(const char *buf_input, char *buf_output, int buf_output_size) override
uint32 getIntegralTime(double fMsecs)
Common::Path _containerFile
Definition: scumm.h:1159
int _bootParam
Definition: scumm.h:996
Common::Error run() override
Definition: scumm.h:601
Common::RandomSource _rnd
Definition: scumm.h:568
Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave=false) override
Common::String getSaveStateName(int slot) const override
Definition: scumm.h:618
Definition: serializer.h:33
void void void void void debugC(int level, uint32 debugChannel, MSVC_PRINTF const char *s,...) GCC_PRINTF(3
@ kNoError
No error occurred.
Definition: error.h:48
Language
Definition: language.h:45
RenderMode
Definition: rendermode.h:48
int FORCEINLINE GCC_PRINTF(2, 0) int vsprintf_s(T(&dst)[N]
void NORETURN_PRE error(MSVC_PRINTF const char *s,...) GCC_PRINTF(1
#define ARRAYSIZE(x)
Definition: util.h:114
Definition: algorithm.h:29
Definition: formatinfo.h:28
@ LIGHTMODE_actor_use_colors
Definition: scumm.h:152
@ LIGHTMODE_room_lights_on
Definition: scumm.h:136
@ LIGHTMODE_actor_use_base_palette
Definition: scumm.h:130
@ LIGHTMODE_flashlight_on
Definition: scumm.h:143
VirtScreenNumber
Definition: gfx.h:161
ResType
Definition: scumm.h:243
Definition: keyboard.h:294
Definition: detection.h:144
Definition: detection.h:130
Definition: detection.h:57