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" 44 #include "scumm/gfx.h" 45 #include "scumm/detection.h" 46 #include "scumm/script.h" 47 #include "scumm/serializer.h" 58 #define DISABLE_TOWNS_DUAL_LAYER_MODE 66 class SeekableReadStream;
68 class SeekableWriteStream;
89 class BaseCostumeLoader;
90 class BaseCostumeRenderer;
92 class CharsetRenderer;
102 class GlyphRenderer_v7;
106 struct FindObjectInRoom;
109 extern 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) 270 typedef uint16 ResId;
314 #define PIT_BASE_FREQUENCY 1193182.0 // In Hz 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 351 #define GAME_PROPER_SAVE 201 352 #define GAME_FAILED_SAVE 202 353 #define GAME_PROPER_LOAD 203 354 #define GAME_FAILED_LOAD 204 360 #define GUI_PAGE_MAIN 0 361 #define GUI_PAGE_SAVE 1 362 #define GUI_PAGE_LOAD 2 363 #define GUI_PAGE_RESTART 3 // Sega CD 364 #define GUI_PAGE_CODE_CONFIRM 4 // Sega CD 365 #define GUI_PAGE_INVALID_CODE 5 // Sega CD 367 #define GUI_CTRL_FIRST_SG 1 368 #define GUI_CTRL_LAST_SG 9 369 #define GUI_CTRL_SAVE_BUTTON 10 370 #define GUI_CTRL_LOAD_BUTTON 11 371 #define GUI_CTRL_PLAY_BUTTON 12 372 #define GUI_CTRL_QUIT_BUTTON 13 373 #define GUI_CTRL_OK_BUTTON 14 374 #define GUI_CTRL_CANCEL_BUTTON 15 375 #define GUI_CTRL_ARROW_UP_BUTTON 16 376 #define GUI_CTRL_ARROW_DOWN_BUTTON 17 377 #define GUI_CTRL_PATH_BUTTON 18 378 #define GUI_CTRL_MUSIC_SLIDER 19 379 #define GUI_CTRL_SPEECH_SLIDER 20 380 #define GUI_CTRL_SFX_SLIDER 21 381 #define GUI_CTRL_TEXT_SPEED_SLIDER 22 382 #define GUI_CTRL_DISPLAY_TEXT_CHECKBOX 23 383 #define GUI_CTRL_SPOOLED_MUSIC_CHECKBOX 24 384 #define GUI_CTRL_OUTER_BOX 26 385 #define GUI_CTRL_INNER_BOX 27 388 #define GUI_CTRL_NUMPAD_1 1 389 #define GUI_CTRL_NUMPAD_2 2 390 #define GUI_CTRL_NUMPAD_3 3 391 #define GUI_CTRL_NUMPAD_4 4 392 #define GUI_CTRL_NUMPAD_5 5 393 #define GUI_CTRL_NUMPAD_6 6 394 #define GUI_CTRL_NUMPAD_7 7 395 #define GUI_CTRL_NUMPAD_8 8 396 #define GUI_CTRL_NUMPAD_9 9 397 #define GUI_CTRL_NUMPAD_0 10 398 #define GUI_CTRL_RESTART_BUTTON 13 399 #define GUI_CTRL_ARROW_LEFT_BUTTON 16 400 #define GUI_CTRL_ARROW_RIGHT_BUTTON 17 401 #define GUI_CTRL_NUMPAD_BACK 23 406 gsTextSpeedSlider = 2,
417 gsGameNotLoaded = 13,
421 gsSelectLoadPrompt = 17,
422 gsReplacePrompt = 18,
427 gsTextDisplayOnly = 24,
430 gsMusicVolumeSlider = 27,
431 gsVoiceVolumeSlider = 28,
432 gsSfxVolumeSlider = 29,
443 gsInsertSaveDisk = 40,
446 gsRecalJoystick = 43,
459 gsCurrentPasscode = 56,
460 gsEnterPasscode = 57,
461 gsConfirmPasscode = 58,
462 gsInvalidPasscode = 59,
479 int highlightedTextColor;
480 int highlightedFillColor;
486 bool doubleLinesFlag;
491 kScummActionInsaneDownLeft,
492 kScummActionInsaneDown,
493 kScummActionInsaneDownRight,
494 kScummActionInsaneLeft,
495 kScummActionInsaneRight,
496 kScummActionInsaneUpLeft,
497 kScummActionInsaneUp,
498 kScummActionInsaneUpRight,
499 kScummActionInsaneAttack,
500 kScummActionInsaneSwitch,
501 kScummActionInsaneCheat,
502 kScummActionInsaneBack,
503 kScummActionInsaneSkip,
508 enum ScummBackendAction {
509 kScummBackendActionRebel1AxisUp = 11000,
510 kScummBackendActionRebel1AxisDown,
511 kScummBackendActionRebel1AxisLeft,
512 kScummBackendActionRebel1AxisRight,
513 kScummBackendActionRebel2AxisUp,
514 kScummBackendActionRebel2AxisDown,
515 kScummBackendActionRebel2AxisLeft,
516 kScummBackendActionRebel2AxisRight
519 extern const char *
const insaneKeymapId;
528 friend class CharsetRendererTownsClassic;
535 friend class LogicHEBasketball;
542 IMuse *_imuse =
nullptr;
543 IMuseDigital *_imuseDigital =
nullptr;
546 Sound *_sound =
nullptr;
563 int _insideCreateResource = 0;
565 bool _useOriginalGUI =
true;
566 bool _enableAudioOverride =
false;
567 bool _enableCOMISong =
false;
568 bool _isAmigaPALSystem =
false;
569 bool _quitFromScriptCmd =
false;
570 bool _isHE995 =
false;
571 bool _enableHECompetitiveOnlineMods =
false;
578 bool _needsSoundUnpause =
false;
596 void errorString(
const char *buf_input,
char *buf_output,
int buf_output_size)
override;
598 bool gameSupportsQuitDialogOverride()
const;
599 void syncSoundSettings()
override;
606 void pauseEngineIntern(
bool pause)
override;
609 virtual void setupScumm(
const Common::Path &macResourceFile);
610 virtual void resetScumm();
612 virtual void setupScummVars();
613 virtual void resetScummVars();
614 void setVideoModeVarToCurrentConfig();
615 void setSoundCardVarToCurrentConfig();
617 void setupCharsetRenderer(
const Common::Path &macFontFile);
618 void setupCostumeRenderer();
620 virtual void loadLanguageBundle();
623 void setupMusic(
int midi);
624 void setTalkSpeed(
int talkspeed);
628 virtual void scummLoop(
int delta);
629 virtual void scummLoop_updateScummVars();
630 virtual void scummLoop_handleSaveLoad();
631 virtual void scummLoop_handleDrawing();
632 virtual void scummLoop_handleActors() = 0;
633 virtual void scummLoop_handleEffects();
634 virtual void scummLoop_handleSound();
636 virtual void runBootscript();
638 virtual void terminateSaveMenuScript() {};
642 void beginTextInput();
649 void waitForTimer(
int quarterFrames,
bool freezeMacGui =
false);
650 uint32 _lastWaitTime;
652 void setTimerAndShakeFrequency();
659 uint32 getIntegralTime(
double fMsecs);
660 double _msecFractParts = 0.0;
662 virtual void processInput();
664 virtual void clearClickedStatus();
667 virtual void updateCursor();
668 virtual void animateCursor() {}
669 virtual void updatePalette();
670 virtual void setDefaultCursor() {};
671 virtual void setCursorTransparency(
int a) {};
672 virtual void resetCursors() {}
673 virtual void setCursorHotspot(
int x,
int y) {}
674 virtual void setCursorFromBuffer(
const byte *ptr,
int width,
int height,
int pitch,
bool preventScale =
false) {}
679 bool isUsingOriginalGUI()
const;
680 bool isMessageBannerActive();
682 bool _isIndy4Jap =
false;
685 Dialog *_pauseDialog =
nullptr;
686 Dialog *_messageDialog =
nullptr;
687 Dialog *_versionDialog =
nullptr;
689 void confirmExitDialog();
690 void confirmRestartDialog();
693 void versionDialog();
696 int32 _bannerColors[50];
697 byte *_bannerMem =
nullptr;
698 uint32 _bannerMemSize = 0;
699 int _bannerSaveYStart = 0;
701 bool _messageBannerActive =
false;
702 bool _comiQuitMenuIsOpen =
false;
703 bool _closeBannerAndQueryQuitFlag =
false;
706 byte *_textSurfBannerMem =
nullptr;
707 uint32 _textSurfBannerMemSize = 0;
712 const char _emptyMsg[1] = {
'\0'};
713 const char _uncheckedBox[2] = {
' ',
'\0'};
714 const char _checkedBox[2] = {
'x',
'\0'};
715 const char _arrowUp[2] = {
'\x18',
'\0'};
716 const char _arrowDown[2] = {
'\x19',
'\0'};
717 const char _arrowLeft[2] = {
'\x3c',
'\0'};
718 const char _arrowRight[2] = {
'\x3d',
'\0'};
722 int _mainMenuSavegameLabel = 1;
723 int _curDisplayedSaveSlotPage = 0;
724 int _firstSaveStateOfList = 0;
725 bool _mainMenuIsActive =
false;
726 bool _quitByGUIPrompt =
false;
727 char _mainMenuMusicSlider[17];
728 char _mainMenuSpeechSlider[17];
729 char _mainMenuSfxSlider[17];
730 char _mainMenuTextSpeedSlider[17];
731 char _mainMenuSegaCDPasscode[5];
732 int _spooledMusicIsToBeEnabled = 1;
733 int _saveScriptParam = 0;
734 int _guiCursorAnimCounter = 0;
735 int _v5VoiceMode = 0;
738 int _internalSpeakerSoundsAreOn = 1;
739 int _guiMouseFlag = 1;
740 int _guiJoystickFlag = 1;
742 bool _mixerMutedByGUI =
false;
745 byte *_tempTextSurface =
nullptr;
746 byte *_tempMainSurface =
nullptr;
747 byte *_tempVerbSurface =
nullptr;
748 bool _postGUICharMask =
false;
751 byte *_curGrabbedCursor =
nullptr;
752 int8 _oldCursorState = 0;
753 int _curCursorState = 0;
754 int _curCursorWidth = 0;
755 int _curCursorHeight = 0;
756 int _curCursorHotspotX = 0;
757 int _curCursorHotspotY = 0;
759 virtual void setSnailCursor() {}
762 Common::KeyState showBannerAndPause(
int bannerId, int32 waitTime,
const char *msg, ...);
763 bool showBannerAndPauseForTextInput(
int bannerId,
const char *prompt,
Common::String &input, uint maxLength = 255);
764 Common::KeyState showOldStyleBannerAndPause(
const char *msg,
int color, int32 waitTime);
765 Common::KeyState printMessageAndPause(
const char *msg,
int color, int32 waitTime,
bool drawOnSentenceLine);
768 void setBannerColors(
int bannerId, byte r, byte g, byte b);
769 virtual int getBannerColor(
int bannerId);
770 void setUpInternalGUIControl(
int id,
int normalFillColor,
int normalTextColor,
771 int topLineColor,
int bottomLineColor,
int leftLineColor,
int rightLineColor,
772 int highlightedTextColor,
int highlightedFillColor,
773 int anchorPointX,
int anchorPointY,
int x,
int y,
const char *label,
bool centerFlag,
bool unknownFlag);
774 void drawInternalGUIControl(
int id,
bool highlightColor);
775 int getInternalGUIControlFromCoordinates(
int x,
int y);
776 virtual bool isSmushActive() {
return false; }
777 virtual bool isInsaneActive() {
return false; }
779 virtual void queryQuit(
bool returnToLauncher);
780 virtual void queryRestart();
781 virtual const char *getGUIString(
int stringId);
782 void waitForBannerInput(int32 waitTime,
Common::KeyState &ks,
bool &leftBtnClicked,
bool &rightBtnClicked,
bool handleMouseWheel =
false);
783 virtual int getGUIStringHeight(
const char *str);
784 virtual int getGUIStringWidth(
const char *str);
785 virtual void drawGUIText(
const char *buttonString,
Common::Rect *clipRect,
int textXPos,
int textYPos,
int textColor,
bool centerFlag);
786 void getSliderString(
int stringId,
int value,
char *sliderString,
int size);
787 virtual int getMusicVolume();
788 virtual int getSpeechVolume();
789 virtual int getSFXVolume();
790 virtual void setMusicVolume(
int volume);
791 virtual void setSpeechVolume(
int volume);
792 virtual void setSFXVolume(
int volume);
793 virtual void toggleVoiceMode();
794 virtual void handleLoadDuringSmush() {}
795 virtual void setSkipVideo(
int value) {}
798 virtual void setUpMainMenuControls();
799 void setUpMainMenuControlsSegaCD();
800 void setUpMainMenuControlsIndy4Jap();
801 void drawMainMenuControls();
802 void drawMainMenuControlsSegaCD();
803 void updateMainMenuControls();
804 void updateMainMenuControlsSegaCD();
805 void drawMainMenuTitle(
const char *title);
806 bool executeMainMenuOperation(
int op,
int mouseX,
int mouseY,
bool &hasLoadedState);
807 bool executeMainMenuOperationSegaCD(
int op,
int mouseX,
int mouseY,
bool &hasLoadedState);
808 bool shouldHighlightLabelAndWait(
int clickedControl);
809 void fillSavegameLabels();
810 bool canWriteGame(
int slotId);
811 bool userWriteLabelRoutine(
Common::KeyState &ks,
bool &leftMsClicked,
bool &rightMsClicked);
812 void saveCursorPreMenu();
813 void restoreCursorPostMenu();
814 void saveSurfacesPreGUI();
815 void restoreSurfacesPostGUI();
816 void showDraftsInventory();
817 void setUpDraftsInventory();
818 void drawDraftsInventory();
821 char displayMessage(MSVC_PRINTF
const char *message, ...)
GCC_PRINTF(2, 3);
822 bool displayMessageYesNo(MSVC_PRINTF
const char *message, ...)
GCC_PRINTF(2, 3);
823 bool displayMessageOKQuit(MSVC_PRINTF
const char *message, ...)
GCC_PRINTF(2, 3);
829 Actor **_actors =
nullptr;
830 Actor **_sortedActors =
nullptr;
832 byte *_arraySlot =
nullptr;
833 uint16 *_inventory =
nullptr;
834 uint16 *_newNames =
nullptr;
838 #define VAR(x) scummVar(x, #x, __FILE__, __LINE__) 839 int32& scummVar(byte var,
const char *varName,
const char *file,
int line) {
841 error(
"Illegal access to variable %s in file %s, line %d", varName, file, line);
843 return _scummVars[var];
845 int32 scummVar(byte var,
const char *varName,
const char *file,
int line)
const {
847 error(
"Illegal access to variable %s in file %s, line %d", varName, file, line);
849 return _scummVars[var];
852 bool applyMi2NiDemoOverride();
865 bool _loaded =
false;
866 bool _attempted =
false;
867 bool _active =
false;
869 bool _mi2DemoVarsApplied =
false;
873 uint32 _streamOff = 0;
874 uint32 _streamBytes = 0;
876 uint32 _nextIndex = 0;
879 bool _hasPrevMbs =
false;
881 uint32 _firstInteractIndex = 0;
882 bool _firstInteractValid =
false;
886 bool _pendingLUp =
false;
887 bool _pendingRUp =
false;
889 bool _sputmCmdActive =
false;
890 byte _sputmCmdEnterCount = 0;
900 void mi2DemoArmPlaybackByRoom(
ScummEngine *engine);
901 void mi2DemoPlaybackJumpRoom(
ScummEngine *engine,
int room);
902 bool handleMi2NIDemoSputmDebugKey(
ScummEngine *engine, uint16 rawKey);
909 int32 *_roomVars =
nullptr;
910 int32 *_scummVars =
nullptr;
911 byte *_bitVars =
nullptr;
914 int _numVariables = 0;
915 int _numBitVariables = 0;
916 int _numLocalObjects = 0;
917 int _numGlobalObjects = 0;
920 int _numFlObject = 0;
921 int _numInventory = 0;
922 int _numNewNames = 0;
923 int _numGlobalScripts = 0;
924 int _numRoomVariables = 0;
925 int _numPalettes = 0;
932 int _numLocalScripts = 60, _numImages = 0, _numRooms = 0, _numScripts = 0, _numSounds = 0;
933 int _numCostumes = 0;
934 int32 _numCharsets = 0;
939 int _NESCostumeSet = 0;
940 void NES_loadCostumeSet(
int n);
941 byte *_NEScostdesc =
nullptr, *_NEScostlens =
nullptr, *_NEScostoffs =
nullptr, *_NEScostdata =
nullptr;
942 byte _NESPatTable[2][4096];
943 byte _NESPalette[2][16];
944 byte _NESBaseTiles = 0;
946 int _NESStartStrip = 0;
949 int _curPalIndex = 0;
952 byte _currentRoom = 0;
953 int _roomResource = 0;
954 bool _egoPositioned =
false;
958 virtual Common::Path generateFilename(
const int room)
const;
962 bool _keyDownMap[512];
963 bool _actionMap[kScummActionCount];
968 uint16 _mouseAndKeyboardStat = 0;
969 byte _leftBtnPressed = 0, _rightBtnPressed = 0;
971 int _mouseWheelFlag = 0;
973 bool _setupIsComplete =
false;
979 uint32 _lastInputScriptTime = 0;
985 bool _dumpScripts =
false;
986 bool _hexdumpScripts =
false;
987 bool _showStack =
false;
988 bool _debugMode =
false;
991 byte _saveLoadFlag = 0, _saveLoadSlot = 0;
992 uint32 _lastSaveTime = 0;
993 bool _saveTemporaryState =
false;
994 bool _pauseSoundsDuringSave =
true;
995 bool _loadFromLauncher =
false;
996 bool _videoModeChanged =
false;
1002 bool loadState(
int slot,
bool compat);
1009 virtual int checkSoundEngineSaveDataSize(
Serializer &s);
1011 void copyHeapSaveGameToFile(
int slot,
const char *saveName);
1012 bool changeSavegameName(
int slot,
char *newName);
1016 Common::String makeSavegameName(
int slot,
bool temporary)
const {
1017 return makeSavegameName(_targetName, slot, temporary);
1020 int getKeyState(
int key);
1021 int getActionState(ScummAction action);
1027 void listSavegames(
bool *marks,
int num);
1030 void requestLoad(
int slot);
1033 bool canPauseSoundsDuringSave()
const {
return _pauseSoundsDuringSave; }
1044 uint32 _localScriptOffsets[1024];
1045 const byte *_scriptPointer =
nullptr;
1046 const byte *_scriptOrgPointer =
nullptr;
1047 const byte *
const *_lastCodePtr =
nullptr;
1049 bool _debug =
false;
1050 byte _currentScript = 0xFF;
1051 int _scummStackPos = 0;
1054 char _engineVersionString[50];
1055 char _dataFileVersionString[50];
1064 return _currentScript != 0xFF && vm.slot[_currentScript].number == script;
1067 virtual void setupOpcodes() = 0;
1068 void executeOpcode(byte i);
1069 const char *getOpcodeDesc(byte i);
1071 void initializeLocals(
int slot,
int *vars);
1072 int getScriptSlot();
1074 void startScene(
int room,
Actor *a,
int b);
1078 void runScript(
int script,
bool freezeResistant,
bool recursive,
int *lvarptr,
int cycle = 0);
1079 void stopScript(
int script);
1080 void nukeArrays(byte scriptSlot);
1083 void runObjectScript(
int script,
int entry,
bool freezeResistant,
bool recursive,
int *vars,
int slot = -1,
int cycle = 0);
1084 void runScriptNested(
int script);
1085 void executeScript();
1086 void updateScriptPtr();
1087 virtual void runInventoryScript(
int i);
1088 virtual void runInventoryScriptEx(
int i);
1089 virtual void checkAndRunSentenceScript();
1090 bool monkey1HermanNoteWorkaround(
const SentenceTab &st);
1091 void runExitScript();
1092 void runEntryScript();
1093 void runQuitScript();
1094 void runAllScripts();
1095 void freezeScripts(
int scr);
1096 void unfreezeScripts();
1098 bool isScriptInUse(
int script)
const;
1099 bool isRoomScriptRunning(
int script)
const;
1100 bool isScriptRunning(
int script)
const;
1102 void killAllScriptsExceptCurrent();
1103 void killScriptsAndResources();
1104 void decreaseScriptDelay(
int amount);
1106 void stopObjectCode();
1107 void stopObjectScript(
int script);
1109 void getScriptBaseAddress();
1110 void resetScriptPointer();
1111 int getVerbEntrypoint(
int obj,
int entry);
1113 void refreshScriptPointer();
1114 byte fetchScriptByte();
1115 virtual uint fetchScriptWord();
1116 virtual int fetchScriptWordSigned();
1117 uint fetchScriptDWord();
1118 int fetchScriptDWordSigned();
1119 void ignoreScriptWord() { fetchScriptWord(); }
1120 void ignoreScriptByte() { fetchScriptByte(); }
1123 virtual int readVar(uint var);
1124 virtual void writeVar(uint var,
int value);
1126 virtual void resetSentence() {}
1129 virtual void beginCutscene(
int *args);
1130 virtual void endCutscene();
1131 void abortCutscene();
1132 void beginOverride();
1135 void copyScriptString(byte *dst);
1136 int resStrLen(
const byte *src);
1137 void doSentence(
int c,
int b,
int a);
1141 uint32 _fileOffset = 0;
1148 ScummFile *instantiateScummFile(
bool indexPAKFiles =
true);
1151 int _resourceHeaderSize = 8;
1152 byte _resourceMapper[128];
1153 const byte *_resourceLastSearchBuf;
1154 uint32 _resourceLastSearchSize;
1156 virtual void allocateArrays();
1157 void openRoom(
int room);
1159 void deleteRoomOffsets();
1160 virtual void readRoomsOffsets();
1161 void askForDisk(
const Common::Path &filename,
int disknum);
1162 byte getEncByte(
int room);
1163 bool openResourceFile(
const Common::Path &filename, byte encByte);
1165 void loadPtrToResource(
ResType type, ResId idx,
const byte *ptr);
1166 virtual int readResTypeList(
ResType type);
1169 int loadResource(
ResType type, ResId idx);
1171 int getResourceRoomNr(
ResType type, ResId idx);
1172 virtual uint32 getResourceRoomOffset(
ResType type, ResId idx);
1175 int getResourceSize(
ResType type, ResId idx);
1176 byte *getResourceAddress(
ResType type, ResId idx);
1177 virtual byte *getStringAddress(ResId idx);
1178 byte *getStringAddressVar(
int i);
1179 void ensureResourceLoaded(
ResType type, ResId idx);
1186 int readSoundResource(ResId idx);
1187 int readSoundResourceSmallHeader(ResId idx);
1188 bool isResourceInUse(
ResType type, ResId idx)
const;
1190 virtual void setupRoomSubBlocks();
1191 virtual void resetRoomSubBlocks();
1193 virtual void clearRoomObjects();
1194 virtual void resetRoomObjects();
1195 virtual void resetRoomObject(
ObjectData *od,
const byte *room,
const byte *searchptr = NULL);
1197 virtual void readArrayFromIndexFile();
1198 virtual void readMAXS(
int blockSize) = 0;
1199 virtual void readGlobalObjects();
1200 virtual void readIndexFile();
1201 virtual void readIndexBlock(uint32 block, uint32 itemsize);
1202 virtual void loadCharset(
int i);
1203 void nukeCharset(
int i);
1205 int _lastLoadedRoom = 0;
1207 const byte *findResourceData(uint32 tag,
const byte *ptr);
1208 const byte *findResource(uint32 tag,
const byte *ptr);
1209 void applyWorkaroundIfNeeded(
ResType type,
int idx);
1210 bool verifyMI2MacBootScript();
1211 bool verifyMI2MacBootScript(byte *buf,
int size);
1212 bool tryPatchMI1CannibalScript(byte *buf,
int size);
1214 int getResourceDataSize(
const byte *ptr)
const;
1215 void dumpResource(
const char *tag,
int index,
const byte *ptr,
int length = -1);
1219 byte OF_OWNER_ROOM = 0;
1220 int getInventorySlot();
1221 int findInventory(
int owner,
int index);
1222 int getInventoryCount(
int owner);
1225 byte *_objectOwnerTable =
nullptr, *_objectRoomTable =
nullptr, *_objectStateTable =
nullptr;
1226 int _numObjectsInRoom = 0;
1229 uint32 *_classData =
nullptr;
1232 void markObjectRectAsDirty(
int obj);
1233 virtual void loadFlObject(uint
object, uint room);
1234 void nukeFlObjects(
int min,
int max);
1235 int findFlObjectSlot();
1236 int findLocalObjectSlot();
1237 void addObjectToInventory(uint obj, uint room);
1238 void updateObjectStates();
1240 bool getClass(
int obj,
int cls)
const;
1242 void putClass(
int obj,
int cls,
bool set);
1243 int getState(
int obj);
1244 void putState(
int obj,
int state);
1245 void setObjectState(
int obj,
int state,
int x,
int y);
1246 int getOwner(
int obj)
const;
1247 void putOwner(
int obj,
int owner);
1248 void setOwnerOf(
int obj,
int owner);
1249 void clearOwnerOf(
int obj);
1250 int getObjectRoom(
int obj)
const;
1251 virtual bool objIsActor(
int obj);
1252 virtual int objToActor(
int obj);
1253 virtual int actorToObj(
int actor);
1254 int getObjX(
int obj);
1255 int getObjY(
int obj);
1256 void getObjectWidth(
int object,
int &width) {
int x, y, dir; getObjectXYPos(
object, x, y, dir, width); }
1257 void getObjectXYPos(
int object,
int &x,
int &y) {
int dir, width; getObjectXYPos(
object, x, y, dir, width); }
1258 void getObjectXYPos(
int object,
int &x,
int &y,
int &dir) {
int width; getObjectXYPos(
object, x, y, dir, width); }
1259 void getObjectXYPos(
int object,
int &x,
int &y,
int &dir,
int &width);
1260 int getObjOldDir(
int obj);
1261 int getObjNewDir(
int obj);
1262 int getObjectIndex(
int object)
const;
1263 int getObjectImageCount(
int object);
1264 int whereIsObject(
int object)
const;
1265 int findObject(
int x,
int y);
1266 void findObjectInRoom(
FindObjectInRoom *fo, byte findWhat, uint
object, uint room);
1268 int getObjectOrActorWidth(
int object,
int &width);
1269 int getObjectOrActorXY(
int object,
int &x,
int &y);
1270 int getDist(
int x,
int y,
int x2,
int y2);
1273 int getObjActToObjActDist(
int a,
int b);
1274 const byte *getObjOrActorName(
int obj);
1275 void setObjectName(
int obj);
1277 void addObjectToDrawQue(
int object);
1278 void removeObjectFromDrawQue(
int object);
1279 void clearDrawObjectQueue();
1280 void processDrawQue();
1282 virtual void clearDrawQueues();
1284 uint32 getOBCDOffs(
int object)
const;
1285 byte *getOBCDFromObject(
int obj,
bool v0CheckInventory =
true);
1286 const byte *getOBIMFromObjectData(
const ObjectData &od);
1287 const byte *getObjectImage(
const byte *ptr,
int state);
1288 virtual int getObjectIdFromOBIM(
const byte *obim);
1292 uint16 _verbMouseOver = 0;
1294 uint16 _userState = 0;
1296 virtual void handleMouseOver(
bool updateInventory);
1297 virtual void redrawVerbs();
1298 virtual void checkExecVerbs();
1300 void verbMouseOver(
int verb);
1301 int findVerbAtPos(
int x,
int y)
const;
1302 virtual void drawVerb(
int verb,
int mode, Common::TextToSpeechManager::Action ttsAction = Common::TextToSpeechManager::INTERRUPT);
1303 virtual void runInputScript(
int clickArea,
int val,
int mode);
1304 void restoreVerbBG(
int verb);
1305 void drawVerbBitmap(
int verb,
int x,
int y);
1306 int getVerbSlot(
int id,
int mode)
const;
1307 void killVerb(
int slot);
1308 void setVerbObject(uint room, uint
object, uint verb);
1311 bool isValidActor(
int id)
const;
1314 Actor *derefActor(
int id,
const char *errmsg = 0)
const;
1315 Actor *derefActorSafe(
int id,
const char *errmsg)
const;
1319 void playActorSounds();
1320 void redrawAllActors();
1321 virtual void setActorRedrawFlags();
1324 void resetV1ActorTalkColor();
1325 virtual void resetActorBgs();
1326 virtual void processActors();
1327 void processUpperActors();
1328 virtual int getActorFromPos(
int x,
int y);
1332 byte _actorToPrintStrFor = 0, _V1TalkingActor = 0;
1333 int _sentenceNum = 0;
1337 int16 _talkDelay = 0;
1338 int _NES_lastTalkingActor = 0;
1339 int _NES_talkColor = 0;
1341 virtual void actorTalk(
const byte *msg);
1343 int getTalkingActor();
1344 void setTalkingActor(
int variable);
1347 bool isCostumeInUse(
int i)
const;
1351 uint16 _screenB = 0, _screenH = 0;
1353 int _roomHeight = 0, _roomWidth = 0;
1354 int _screenHeight = 0, _screenWidth = 0;
1357 bool _cameraIsFrozen =
false;
1359 int _screenStartStrip = 0, _screenEndStrip = 0;
1361 bool _forceBannerVirtScreen =
false;
1372 bool _useMacScreenCorrectHeight =
true;
1373 int _macScreenDrawOffset = 20;
1376 uint8 _bytesPerPixel = 1;
1381 uint8 _colorUsedByCycle[256];
1384 uint32 _ENCD_offs = 0, _EXCD_offs = 0;
1385 uint32 _CLUT_offs = 0, _EPAL_offs = 0;
1386 uint32 _IM00_offs = 0, _PALS_offs = 0;
1389 bool _fullRedraw =
false, _bgNeedsRedraw =
false;
1390 bool _screenEffectFlag =
false, _completeScreenRedraw =
false;
1391 bool _disableFadeInEffect =
false;
1394 int hotspotX, hotspotY, width, height;
1395 byte animate, animateIndex;
1401 byte _grabbedCursor[16384];
1402 byte _macGrabbedCursor[16384 * 4];
1403 byte _currentCursor = 0;
1405 byte _newEffect = 0, _switchRoomEffect2 = 0, _switchRoomEffect = 0;
1406 bool _doEffect =
false;
1408 bool _snapScroll =
false;
1410 virtual void setBuiltinCursor(
int index) {}
1412 bool isLightOn()
const;
1414 virtual int getCurrentLights()
const;
1417 void initScreens(
int b,
int h);
1418 void initVirtScreen(
VirtScreenNumber slot,
int top,
int width,
int height,
bool twobufs,
bool scrollable);
1419 void initBGBuffers(
int height);
1420 void initCycl(
const byte *ptr);
1422 void decodeNESBaseTiles();
1423 void playNESTitleScreens();
1425 void drawObject(
int obj,
int scrollType);
1426 void drawRoomObjects(
int arg);
1427 void drawRoomObject(
int i,
int arg);
1428 void drawBox(
int x,
int y,
int x2,
int y2,
int color);
1429 void drawLine(
int x1,
int y1,
int x2,
int y2,
int color);
1430 void drawPixel(
VirtScreen *vs,
int x,
int y, int16 color,
bool useBackbuffer =
false);
1432 void moveScreen(
int dx,
int dy,
int height);
1434 void restoreBackground(
Common::Rect rect, byte backcolor = 0);
1435 void redrawBGStrip(
int start,
int num);
1436 virtual void redrawBGAreas();
1439 void setCameraAtEx(
int at);
1440 virtual void setCameraAt(
int pos_x,
int pos_y);
1441 virtual void setCameraFollows(
Actor *a,
bool setCamera =
false);
1442 virtual void moveCamera();
1443 virtual void panCameraTo(
int x,
int y);
1445 void actorFollowCamera(
int act);
1447 const byte *getPalettePtr(
int palindex,
int room);
1449 void setPaletteFromTable(
const byte *ptr,
int numcolor,
int firstIndex = 0);
1450 void resetPalette(
bool isBootUp =
false);
1452 void setCurrentPalette(
int pal);
1453 void setRoomPalette(
int pal,
int room);
1454 void setPCEPaletteFromPtr(
const byte *ptr);
1455 void setAmigaPaletteFromPtr(
const byte *ptr);
1456 virtual void setPaletteFromPtr(
const byte *ptr,
int numcolor = -1);
1457 void setV1ColorTable(
int renderMode);
1459 virtual void setPalColor(
int index,
int r,
int g,
int b);
1460 void setDirtyColors(
int min,
int max);
1461 const byte *findPalInPals(
const byte *pal,
int index);
1462 void swapPalColors(
int a,
int b);
1463 virtual void copyPalColor(
int dst,
int src);
1464 void cyclePalette();
1465 void stopCycle(
int i);
1466 virtual void palManipulateInit(
int resID,
int start,
int end,
int time);
1467 void palManipulate();
1468 uint32 findClosestPaletteColor(byte *palette,
int paletteLength, byte r, byte g, byte b);
1469 void applyGrayscaleToPaletteRange(
int min,
int max);
1470 bool haveToApplyMonkey1PaletteFix();
1473 uint8 *getHEPaletteSlot(uint16 palSlot);
1474 uint16 get16BitColor(uint8 r, uint8 g, uint8 b);
1475 uint32 getPaletteColorFromRGB(byte *palette, byte r, byte g, byte b);
1476 uint32 getPackedRGBColorFromPalette(byte *palette, uint32 color);
1477 void fetchBlackAndWhite(uint32 &black, uint32 &white, byte *palette,
int paletteEntries);
1478 int remapPaletteColor(
int r,
int g,
int b,
int threshold);
1479 void readPCEPalette(
const byte **ptr, byte **dest,
int numEntries);
1480 void colorPCEToRGB(uint16 color, byte *r, byte *g, byte *b);
1481 void setPCETextPalette(uint8 color);
1483 void moveMemInPalRes(
int start,
int end, byte direction);
1484 void setShadowPalette(
int slot,
int redScale,
int greenScale,
int blueScale,
int startColor,
int endColor);
1485 void setShadowPalette(
int redScale,
int greenScale,
int blueScale,
int startColor,
int endColor,
int start,
int end);
1486 virtual void darkenPalette(
int redScale,
int greenScale,
int blueScale,
int startColor,
int endColor);
1489 void markRectAsDirty(
VirtScreenNumber virt,
int left,
int right,
int top,
int bottom,
int dirtybit = 0);
1491 markRectAsDirty(virt, rect.
left, rect.
right, rect.top, rect.bottom, dirtybit);
1495 byte *_compositeBuf;
1496 byte *_hercCGAScaleBuf =
nullptr;
1497 bool _enableEGADithering =
false;
1498 bool _supportsEGADithering =
false;
1499 bool _enableSegaShadowMode =
false;
1501 virtual void drawDirtyScreenParts();
1503 void drawStripToScreen(
VirtScreen *vs,
int x,
int width,
int top,
int bottom);
1505 void mac_markScreenAsDirty(
int x,
int y,
int w,
int h);
1506 void mac_drawStripToScreen(
VirtScreen *vs,
int top,
int x,
int y,
int width,
int height);
1507 void mac_drawIndy3TextBox();
1508 void mac_undrawIndy3TextBox();
1509 void mac_undrawIndy3CreditsText();
1510 void mac_drawBufferToScreen(
const byte *buffer,
int pitch,
int x,
int y,
int width,
int height,
bool epxRectangleExpansion =
true);
1511 void mac_updateCompositeBuffer(
const byte *buffer,
int pitch,
int x,
int y,
int width,
int height);
1512 void mac_blitDoubleResImage(
const byte *buffer,
int pitch,
int x,
int y,
int width,
int height);
1513 void mac_applyDoubleResToBuffer(
const byte *inputBuffer, byte *outputBuffer,
int width,
int height,
int inputPitch,
int outputPitch);
1514 void mac_blitEPXImage(
const byte *buffer,
int pitch,
int x,
int y,
int width,
int height,
bool epxRectangleExpansion =
true);
1515 void mac_applyEPXToBuffer(
const byte *inputBuffer, byte *outputBuffer,
int width,
int height,
int inputPitch,
int outputPitch,
int xOffset,
int yOffset,
int bufferWidth,
int bufferHeight);
1516 void mac_scaleCursor(byte *&outCursor,
int &outHotspotX,
int &outHotspotY,
int &outWidth,
int &outHeight);
1517 void mac_toggleSmoothing();
1519 Common::KeyState mac_showOldStyleBannerAndPause(
const char *msg, int32 waitTime);
1521 const byte *postProcessDOSGraphics(
VirtScreen *vs,
int &pitch,
int &x,
int &y,
int &width,
int &height)
const;
1522 const byte *ditherVGAtoEGA(
int &pitch,
int &x,
int &y,
int &width,
int &height)
const;
1526 byte *getMaskBuffer(
int x,
int y,
int z);
1529 void fadeIn(
int effect);
1530 void fadeOut(
int effect);
1532 void dissolveEffectSelector();
1533 void transitionEffect(
int a);
1534 void dissolveEffect(
int width,
int height);
1535 void scrollEffect(
int dir);
1537 void updateScreenShakeEffect();
1540 double getTimerFrequency();
1541 double getAmigaMusicTimerFrequency();
1544 bool _shakeEnabled =
false;
1545 bool _shakeTempSavedState =
false;
1546 uint _shakeFrame = 0;
1547 uint32 _shakeNextTick = 0;
1548 uint32 _shakeTickCounter = 0;
1549 double _shakeTimerRate;
1550 double _timerFrequency;
1552 void setShake(
int mode);
1554 int _drawObjectQueNr = 0;
1555 byte _drawObjectQue[200];
1568 uint32 gfxUsageBits[410 * 3];
1570 void upgradeGfxUsageBits();
1571 void setGfxUsageBit(
int strip,
int bit);
1572 void clearGfxUsageBit(
int strip,
int bit);
1575 bool testGfxUsageBit(
int strip,
int bit) {
1576 assert(strip >= 0 && strip <
ARRAYSIZE(gfxUsageBits) / 3);
1577 assert(1 <= bit && bit <= 96);
1579 return (gfxUsageBits[3 * strip + bit / 32] & (1 << (bit % 32))) != 0;
1582 bool testGfxAnyUsageBits(
int strip);
1583 bool testGfxObjectUsageBits(
int strip);
1584 bool testGfxOtherUsageBits(
int strip,
int bit);
1587 byte _roomPalette[256];
1588 byte *_shadowPalette =
nullptr;
1589 bool _skipDrawObject = 0;
1591 int _soundEnabled = 0;
1594 byte _HEV7ActorPalette[256];
1595 uint8 *_hePalettes =
nullptr;
1596 uint16 _hePaletteSlot = 0;
1597 uint16 *_16BitPalette =
nullptr;
1600 byte *_verbPalette =
nullptr;
1605 int _shadowPaletteSize = 0;
1606 byte _currentPalette[3 * 256];
1607 byte _darkenPalette[3 * 256];
1608 int _paletteChangedCounter = 1;
1610 int _palDirtyMin = 0, _palDirtyMax = 0;
1612 byte _palManipStart = 0, _palManipEnd = 0;
1613 uint16 _palManipCounter = 0;
1614 byte *_palManipPalette =
nullptr;
1615 byte *_palManipIntermediatePal =
nullptr;
1617 bool _haveActorSpeechMsg =
false;
1618 bool _useTalkAnims =
false;
1619 uint16 _defaultTextSpeed = 0;
1621 bool _native_mt32 =
false;
1622 bool _copyProtection =
false;
1623 bool _shadowPalRemap =
false;
1626 uint16 _amigaFirstUsedColor = 0;
1627 byte _amigaPalette[3 * 64];
1628 void amigaPaletteFindFirstUsedColor();
1629 void mapRoomPalette(
int idx);
1630 int remapRoomPaletteColor(
int r,
int g,
int b);
1631 void mapVerbPalette(
int idx);
1632 int remapVerbPaletteColor(
int r,
int g,
int b);
1635 byte *_egaColorMap[2];
1638 uint16 _extraBoxFlags[65];
1641 byte *getBoxMatrixBaseAddr();
1642 byte *getBoxConnectionBase(
int box);
1644 int getNextBox(byte from, byte to);
1646 void setBoxFlags(
int box,
int val);
1647 void setBoxScale(
int box,
int b);
1649 bool checkXYInBoxBounds(
int box,
int x,
int y);
1651 BoxCoords getBoxCoordinates(
int boxnum);
1653 byte getMaskFromBox(
int box);
1654 Box *getBoxBaseAddr(
int box);
1655 byte getBoxFlags(
int box);
1656 int getBoxScale(
int box);
1658 int getScale(
int box,
int x,
int y);
1659 int getScaleFromSlot(
int slot,
int x,
int y);
1669 void setScaleSlot(
int slot,
int x1,
int y1,
int scale1,
int x2,
int y2,
int scale2);
1670 void setBoxScaleSlot(
int box,
int slot);
1671 void convertScaleTableToScaleSlot(
int slot);
1673 void calcItineraryMatrix(byte *itineraryMatrix,
int num);
1674 void createBoxMatrix();
1675 virtual bool areBoxesNeighbors(
int i,
int j);
1680 byte _charsetColorMap[16];
1687 int _textSurfaceMultiplier = 0;
1689 bool _isModernMacVersion =
false;
1690 bool _useGammaCorrection =
true;
1693 MacGui *_macGui =
nullptr;
1694 bool _useMacGraphicsSmoothing =
true;
1695 byte _completeScreenBuffer[320 * 200];
1698 byte _charsetColor = 0;
1699 byte _charsetData[23][16];
1701 int _charsetBufPos = 0;
1702 byte _charsetBuffer[512];
1704 bool _keepText =
false;
1707 int _nextLeft = 0, _nextTop = 0;
1712 bool _voiceNextString =
false;
1713 bool _checkPreviousSaid =
false;
1714 bool _voicePassHelpButtons =
false;
1715 int _previousVerb = -1;
1716 int _previousControl = -1;
1721 void restoreCharsetBg();
1722 void clearCharsetMask();
1723 void clearTextSurface();
1725 virtual void initCharset(
int charset);
1727 virtual void printString(
int m,
const byte *msg);
1729 virtual bool handleNextCharsetCode(
Actor *a,
int *c);
1730 virtual void drawSentence() {}
1731 virtual void displayDialog();
1732 int countNumberOfWaits();
1734 void drawString(
int a,
const byte *msg, Common::TextToSpeechManager::Action ttsAction = Common::TextToSpeechManager::QUEUE);
1735 virtual void fakeBidiString(byte *ltext,
bool ignoreVerb,
int ltextSize)
const;
1736 void wrapSegaCDText();
1737 void debugMessage(
const byte *msg);
1738 virtual void showMessageDialog(
const byte *msg);
1741 void sayText(
const Common::String &text, Common::TextToSpeechManager::Action action = Common::TextToSpeechManager::QUEUE)
const;
1742 void stopTextToSpeech()
const;
1743 void sayButtonText();
1746 virtual int convertMessageToString(
const byte *msg, byte *dst,
int dstSize);
1747 int convertIntMessage(byte *dst,
int dstSize,
int var);
1748 int convertVerbMessage(byte *dst,
int dstSize,
int var);
1749 int convertNameMessage(byte *dst,
int dstSize,
int var);
1750 int convertStringMessage(byte *dst,
int dstSize,
int var);
1756 virtual void translateText(
const byte *text, byte *trans_buff,
int transBufferSize);
1758 bool reverseIfNeeded(
const byte *text, byte *reverseBuf,
int reverseBufSize)
const;
1760 Common::CodePage getDialogCodePage()
const;
1763 bool _useCJKMode =
false;
1764 bool _useMultiFont =
false;
1765 int _numLoadedFont = 0;
1766 int _2byteShadow = 0;
1767 bool _force2ByteCharHeight =
false;
1769 int _2byteHeight = 0;
1770 int _2byteWidth = 0;
1772 byte _newLineCharacter = 0;
1773 byte *get2byteCharPtr(
int idx);
1775 bool isScummvmKorTarget();
1776 bool hasLocalizer();
1779 byte *_2byteFontPtr =
nullptr;
1780 byte *_2byteMultiFontPtr[20];
1781 int _2byteMultiHeight[20];
1782 int _2byteMultiWidth[20];
1783 int _2byteMultiShadow[20];
1786 struct TranslatedLine {
1787 uint32 originalTextOffset;
1788 uint32 translatedTextOffset;
1791 struct TranslationRange {
1795 TranslationRange(uint32 left_, uint32 right_) : left(left_), right(right_) {}
1796 TranslationRange() : left(0), right(0) {}
1799 struct TranslationRoom {
1803 bool _existLanguageFile =
false;
1804 bool _isRTL =
false;
1805 byte *_languageBuffer =
nullptr;
1806 int _numTranslatedLines = 0;
1807 TranslatedLine *_translatedLines =
nullptr;
1808 uint16 *_languageLineIndex =
nullptr;
1811 const byte *searchTranslatedLine(
const byte *text,
const TranslationRange &range,
bool useIndex);
1813 virtual void createTextRenderer(GlyphRenderer_v7 *gr) {}
1818 byte VAR_KEYPRESS = 0xFF;
1819 byte VAR_SYNC = 0xFF;
1820 byte VAR_EGO = 0xFF;
1821 byte VAR_CAMERA_POS_X = 0xFF;
1822 byte VAR_HAVE_MSG = 0xFF;
1823 byte VAR_ROOM = 0xFF;
1824 byte VAR_OVERRIDE = 0xFF;
1825 byte VAR_MACHINE_SPEED = 0xFF;
1827 byte VAR_NUM_ACTOR = 0xFF;
1828 byte VAR_CURRENT_LIGHTS = 0xFF;
1829 byte VAR_CURRENTDRIVE = 0xFF;
1830 byte VAR_CURRENTDISK = 0xFF;
1831 byte VAR_TMR_1 = 0xFF;
1832 byte VAR_TMR_2 = 0xFF;
1833 byte VAR_TMR_3 = 0xFF;
1834 byte VAR_MUSIC_TIMER = 0xFF;
1835 byte VAR_ACTOR_RANGE_MIN = 0xFF;
1836 byte VAR_ACTOR_RANGE_MAX = 0xFF;
1837 byte VAR_CAMERA_MIN_X = 0xFF;
1838 byte VAR_CAMERA_MAX_X = 0xFF;
1839 byte VAR_TIMER_NEXT = 0xFF;
1840 byte VAR_VIRT_MOUSE_X = 0xFF;
1841 byte VAR_VIRT_MOUSE_Y = 0xFF;
1842 byte VAR_ROOM_RESOURCE = 0xFF;
1843 byte VAR_LAST_SOUND = 0xFF;
1844 byte VAR_CUTSCENEEXIT_KEY = 0xFF;
1845 byte VAR_OPTIONS_KEY = 0xFF;
1846 byte VAR_TALK_ACTOR = 0xFF;
1847 byte VAR_CAMERA_FAST_X = 0xFF;
1848 byte VAR_SCROLL_SCRIPT = 0xFF;
1849 byte VAR_ENTRY_SCRIPT = 0xFF;
1850 byte VAR_ENTRY_SCRIPT2 = 0xFF;
1851 byte VAR_EXIT_SCRIPT = 0xFF;
1852 byte VAR_EXIT_SCRIPT2 = 0xFF;
1853 byte VAR_VERB_SCRIPT = 0xFF;
1854 byte VAR_SENTENCE_SCRIPT = 0xFF;
1855 byte VAR_INVENTORY_SCRIPT = 0xFF;
1856 byte VAR_CUTSCENE_START_SCRIPT = 0xFF;
1857 byte VAR_CUTSCENE_END_SCRIPT = 0xFF;
1858 byte VAR_CHARINC = 0xFF;
1859 byte VAR_WALKTO_OBJ = 0xFF;
1860 byte VAR_DEBUGMODE = 0xFF;
1861 byte VAR_HEAPSPACE = 0xFF;
1862 byte VAR_RESTART_KEY = 0xFF;
1863 byte VAR_PAUSE_KEY = 0xFF;
1864 byte VAR_MOUSE_X = 0xFF;
1865 byte VAR_MOUSE_Y = 0xFF;
1866 byte VAR_TIMER = 0xFF;
1867 byte VAR_TIMER_TOTAL = 0xFF;
1868 byte VAR_SOUNDCARD = 0xFF;
1869 byte VAR_VIDEOMODE = 0xFF;
1870 byte VAR_MAINMENU_KEY = 0xFF;
1871 byte VAR_FIXEDDISK = 0xFF;
1872 byte VAR_CURSORSTATE = 0xFF;
1873 byte VAR_USERPUT = 0xFF;
1874 byte VAR_SOUNDRESULT = 0xFF;
1875 byte VAR_TALKSTOP_KEY = 0xFF;
1876 byte VAR_FADE_DELAY = 0xFF;
1877 byte VAR_NOSUBTITLES = 0xFF;
1880 byte VAR_SOUNDPARAM = 0xFF;
1881 byte VAR_SOUNDPARAM2 = 0xFF;
1882 byte VAR_SOUNDPARAM3 = 0xFF;
1883 byte VAR_INPUTMODE = 0xFF;
1884 byte VAR_MEMORY_PERFORMANCE = 0xFF;
1885 byte VAR_VIDEO_PERFORMANCE = 0xFF;
1886 byte VAR_ROOM_FLAG = 0xFF;
1887 byte VAR_GAME_LOADED = 0xFF;
1888 byte VAR_NEW_ROOM = 0xFF;
1891 byte VAR_V5_TALK_STRING_Y = 0xFF;
1894 byte VAR_ROOM_WIDTH = 0xFF;
1895 byte VAR_ROOM_HEIGHT = 0xFF;
1896 byte VAR_SUBTITLES = 0xFF;
1897 byte VAR_V6_EMSSPACE = 0xFF;
1900 byte VAR_CAMERA_POS_Y = 0xFF;
1901 byte VAR_CAMERA_MIN_Y = 0xFF;
1902 byte VAR_CAMERA_MAX_Y = 0xFF;
1903 byte VAR_CAMERA_THRESHOLD_X = 0xFF;
1904 byte VAR_CAMERA_THRESHOLD_Y = 0xFF;
1905 byte VAR_CAMERA_SPEED_X = 0xFF;
1906 byte VAR_CAMERA_SPEED_Y = 0xFF;
1907 byte VAR_CAMERA_ACCEL_X = 0xFF;
1908 byte VAR_CAMERA_ACCEL_Y = 0xFF;
1909 byte VAR_CAMERA_DEST_X = 0xFF;
1910 byte VAR_CAMERA_DEST_Y = 0xFF;
1911 byte VAR_CAMERA_FOLLOWED_ACTOR = 0xFF;
1914 byte VAR_VERSION_KEY = 0xFF;
1915 byte VAR_DEFAULT_TALK_DELAY = 0xFF;
1916 byte VAR_CUSTOMSCALETABLE = 0xFF;
1917 byte VAR_BLAST_ABOVE_TEXT = 0xFF;
1918 byte VAR_VOICE_MODE = 0xFF;
1919 byte VAR_MUSIC_BUNDLE_LOADED = 0xFF;
1920 byte VAR_VOICE_BUNDLE_LOADED = 0xFF;
1922 byte VAR_LEFTBTN_DOWN = 0xFF;
1923 byte VAR_RIGHTBTN_DOWN = 0xFF;
1924 byte VAR_LEFTBTN_HOLD = 0xFF;
1925 byte VAR_RIGHTBTN_HOLD = 0xFF;
1926 byte VAR_PRE_SAVELOAD_SCRIPT = 0xFF;
1927 byte VAR_POST_SAVELOAD_SCRIPT = 0xFF;
1928 byte VAR_SAVELOAD_PAGE = 0xFF;
1929 byte VAR_OBJECT_LABEL_FLAG = 0xFF;
1932 byte VAR_CHARSET_MASK = 0xFF;
1935 byte VAR_V6_SOUNDMODE = 0xFF;
1938 byte VAR_CHARCOUNT = 0xFF;
1939 byte VAR_VERB_ALLOWED = 0xFF;
1940 byte VAR_ACTIVE_VERB = 0xFF;
1941 byte VAR_ACTIVE_OBJECT1 = 0xFF;
1942 byte VAR_ACTIVE_OBJECT2 = 0xFF;
1945 byte VAR_ALWAYS_REDRAW_ACTORS = 0xFF;
1946 byte VAR_SKIP_RESET_TALK_ACTOR = 0xFF;
1948 byte VAR_SOUND_CHANNEL = 0xFF;
1949 byte VAR_TALK_CHANNEL = 0xFF;
1950 byte VAR_SOUND_TOKEN_OFFSET = 0xFF;
1951 byte VAR_START_DYN_SOUND_CHANNELS = 0xFF;
1952 byte VAR_SOUND_CALLBACK_SCRIPT = 0xFF;
1954 byte VAR_EARLY_TALKIE_CALLBACK = 0xFF;
1955 byte VAR_EARLY_CHAN_0_CALLBACK = 0xFF;
1956 byte VAR_EARLY_CHAN_1_CALLBACK = 0xFF;
1957 byte VAR_EARLY_CHAN_2_CALLBACK = 0xFF;
1958 byte VAR_EARLY_CHAN_3_CALLBACK = 0xFF;
1960 byte VAR_MAIN_SCRIPT = 0xFF;
1962 byte VAR_DEFAULT_SCRIPT_PRIORITY = 0xFF;
1963 byte VAR_LAST_SCRIPT_PRIORITY = 0xFF;
1965 byte VAR_QUIT_SCRIPT = 0xFF;
1966 byte VAR_ERROR_FLAG = 0xFF;
1967 byte VAR_OPERATION_FAILURE = 0xFF;
1969 byte VAR_COLOR_BLACK = 0xFF;
1972 byte VAR_NUM_GLOBAL_OBJS = 0xFF;
1974 byte VAR_LAST_FRAME_BURN_TIME = 0xFF;
1975 byte VAR_LAST_FRAME_SCUMM_TIME = 0xFF;
1977 byte VAR_WINDEX_RUNNING = 0xFF;
1979 #ifdef USE_RGB_COLOR 1981 Graphics::FontSJIS *_cjkFont =
nullptr;
1985 #ifndef DISABLE_TOWNS_DUAL_LAYER_MODE 1987 bool towns_isRectInStringBox(
int x1,
int y1,
int x2,
int y2);
1988 byte _townsPaletteFlags = 0;
1989 byte _townsCharsetColorMap[16];
1992 void towns_drawStripToScreen(
VirtScreen *vs,
int dstX,
int dstY,
int srcX,
int srcY,
int w,
int h);
1993 void towns_fillTopLayerRect(
int x1,
int y1,
int x2,
int y2,
int col);
1994 void towns_swapVirtScreenArea(
VirtScreen *vs,
int x,
int y,
int w,
int h);
1995 void towns_clearStrip(
int strip);
1996 #ifdef USE_RGB_COLOR 1997 void towns_setPaletteFromPtr(
const byte *ptr,
int numcolor = -1);
1998 void towns_setTextPaletteFromPtr(
const byte *ptr);
2000 void towns_setupPalCycleField(
int x1,
int y1,
int x2,
int y2);
2001 void towns_processPalCycleField();
2002 void towns_resetPalCycleFields();
2003 void towns_restoreCharsetBg();
2004 void towns_scriptScrollEffect(
int dir);
2006 void requestScroll(
int dir);
2007 void scrollLeft() { requestScroll(-1); }
2008 void scrollRight() { requestScroll(1); }
2009 void towns_waitForScroll(
int waitForDirection,
int threshold = 0);
2010 void towns_updateGfx();
2013 int _numCyclRects = 0;
2014 int _scrollRequest = 0;
2015 int _scrollDeltaAdjust = 0;
2016 bool _scrollNeedDeltaAdjust = 0;
2017 int _refreshDuration[20];
2018 int _refreshArrayPos = 0;
2019 bool _refreshNeedCatchUp =
false;
2020 bool _enableSmoothScrolling =
false;
2021 bool _forceFMTownsHiResMode =
false;
2022 uint32 _scrollTimer = 0;
2023 uint32 _scrollDestOffset = 0;
2024 uint16 _scrollFeedStrips[3];
2028 byte _townsOverrideShadowColor = 0;
2029 byte _textPalette[48];
2030 byte _townsClearLayerFlag = 1;
2031 byte _townsActiveLayerFlags = 3;
2032 static const uint8 _townsLayer2Mask[];
2036 void scrollLeft() { redrawBGStrip(_gdi->_numStrips - 1, 1); }
2037 void scrollRight() { redrawBGStrip(0, 1); }
2038 void towns_updateGfx() {}
2039 void towns_waitForScroll(
int waitForDirection,
int threshold = 0) {}
2040 void towns_fillTopLayerRect(
int x1,
int y1,
int x2,
int y2,
int col) {}
2041 void towns_swapVirtScreenArea(
VirtScreen *vs,
int x,
int y,
int w,
int h) {}
2042 #endif // DISABLE_TOWNS_DUAL_LAYER_MODE #define ARRAYSIZE(x)
Definition: util.h:112
Definition: macgui_impl.h:52
VirtScreenNumber
Definition: gfx.h:161
EngineFeature
Definition: engine.h:258
T left
Definition: rect.h:170
ErrorCode getCode() const
Definition: error.h:112
Definition: detection.h:123
Definition: macgui_v6.h:33
Definition: palette.h:195
RenderMode
Definition: rendermode.h:48
No error occurred.
Definition: error.h:48
Common::Path _containerFile
Definition: scumm.h:1144
Definition: resource.h:80
ResType
Definition: scumm.h:243
Definition: macgui_indy3.h:39
Definition: printman.h:30
void void void void void debugC(int level, uint32 debugChannel, MSVC_PRINTF const char *s,...) GCC_PRINTF(3
Definition: serializer.h:80
Graphics::Surface _textSurface
Definition: scumm.h:1686
int FORCEINLINE GCC_PRINTF(2, 0) int vsprintf_s(T(&dst)[N]
Definition: detection.h:50
T right
Definition: rect.h:171
bool currentScriptSlotIs(uint16 script) const
Definition: scumm.h:1063
Definition: player_towns.h:32
Definition: debugger.h:33
Definition: algorithm.h:29
Definition: formatinfo.h:28
Definition: macgui_v5.h:33
Definition: serializer.h:352
Definition: charset.h:159
void NORETURN_PRE error(MSVC_PRINTF const char *s,...) GCC_PRINTF(1
Definition: localizer.h:31
Definition: base-costume.h:68
Definition: keyboard.h:294
Definition: serializer.h:33
Common::Error run() override
Definition: scumm.h:588
Common::RandomSource _rnd
Definition: scumm.h:556
Definition: macgui_loom.h:33
Definition: base-costume.h:49
Definition: detection.h:137
Language
Definition: language.h:45