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/serializer.h" 37 #include "common/str.h" 38 #include "common/textconsole.h" 39 #include "graphics/surface.h" 40 #include "graphics/sjis.h" 41 #include "graphics/palette.h" 43 #include "scumm/gfx.h" 44 #include "scumm/detection.h" 45 #include "scumm/script.h" 56 #define DISABLE_TOWNS_DUAL_LAYER_MODE 64 class SeekableReadStream;
66 class SeekableWriteStream;
87 class BaseCostumeLoader;
88 class BaseCostumeRenderer;
90 class CharsetRenderer;
100 class GlyphRenderer_v7;
104 struct FindObjectInRoom;
107 extern ScummEngine *g_scumm;
112 NUM_SHADOW_PALETTE = 8
119 DEBUG_GENERAL = 1 << 0,
120 DEBUG_SCRIPTS = 1 << 2,
121 DEBUG_OPCODES = 1 << 3,
123 DEBUG_RESOURCE = 1 << 5,
124 DEBUG_IMUSE = 1 << 6,
125 DEBUG_SOUND = 1 << 7,
126 DEBUG_ACTORS = 1 << 8,
127 DEBUG_INSANE = 1 << 9,
128 DEBUG_SMUSH = 1 << 10,
129 DEBUG_MOONBASE_AI = 1 << 11,
130 DEBUG_NETWORK = 1 << 12
170 MBS_LEFT_CLICK = 0x8000,
171 MBS_RIGHT_CLICK = 0x4000,
172 MBS_MOUSE_MASK = (MBS_LEFT_CLICK | MBS_RIGHT_CLICK),
216 uint _objectRedrawCount;
217 uint _objectStripRedrawCount;
218 uint _actorRedrawCount;
219 uint _actorLimbRedrawDrawCount;
239 USERSTATE_SET_FREEZE = 0x01,
240 USERSTATE_SET_CURSOR = 0x02,
241 USERSTATE_SET_IFACE = 0x04,
242 USERSTATE_FREEZE_ON = 0x08,
243 USERSTATE_CURSOR_ON = 0x10,
244 USERSTATE_IFACE_SENTENCE = 0x20,
245 USERSTATE_IFACE_INVENTORY = 0x40,
246 USERSTATE_IFACE_VERBS = 0x80
249 #define USERSTATE_IFACE_ALL (USERSTATE_IFACE_SENTENCE | USERSTATE_IFACE_INVENTORY | USERSTATE_IFACE_VERBS) 283 typedef uint16 ResId;
327 #define PIT_BASE_FREQUENCY 1193182.0 // In Hz 328 #define PIT_V1_DIVISOR 65536.0 329 #define PIT_V2_4_DIVISOR 5041.0 330 #define PIT_V5_6_ORCHESTRATOR_DIVISOR 4096.0 331 #define PIT_V5_6_SUBTIMER_INC 3433.0 332 #define PIT_V5_SUBTIMER_THRESH 4167.0 333 #define PIT_V6_SAMNMAX_SUBTIMER_THRESH 4167.0 334 #define PIT_V6_DOTT_SUBTIMER_THRESH 4237.0 335 #define PIT_V7_ORCHESTRATOR_DIVISOR 3977.0 336 #define PIT_V7_SUBTIMER_INC 3977.0 337 #define PIT_V7_SUBTIMER_THRESH 4971.0 339 #define LOOM_STEAM_CDDA_RATE 240.0 354 #define AMIGA_NTSC_VBLANK_RATE 240.0 355 #define AMIGA_PAL_VBLANK_RATE 200.0 361 #define GAME_PROPER_SAVE 201 362 #define GAME_FAILED_SAVE 202 363 #define GAME_PROPER_LOAD 203 364 #define GAME_FAILED_LOAD 204 370 #define GUI_PAGE_MAIN 0 371 #define GUI_PAGE_SAVE 1 372 #define GUI_PAGE_LOAD 2 373 #define GUI_PAGE_RESTART 3 // Sega CD 374 #define GUI_PAGE_CODE_CONFIRM 4 // Sega CD 375 #define GUI_PAGE_INVALID_CODE 5 // Sega CD 377 #define GUI_CTRL_FIRST_SG 1 378 #define GUI_CTRL_LAST_SG 9 379 #define GUI_CTRL_SAVE_BUTTON 10 380 #define GUI_CTRL_LOAD_BUTTON 11 381 #define GUI_CTRL_PLAY_BUTTON 12 382 #define GUI_CTRL_QUIT_BUTTON 13 383 #define GUI_CTRL_OK_BUTTON 14 384 #define GUI_CTRL_CANCEL_BUTTON 15 385 #define GUI_CTRL_ARROW_UP_BUTTON 16 386 #define GUI_CTRL_ARROW_DOWN_BUTTON 17 387 #define GUI_CTRL_PATH_BUTTON 18 388 #define GUI_CTRL_MUSIC_SLIDER 19 389 #define GUI_CTRL_SPEECH_SLIDER 20 390 #define GUI_CTRL_SFX_SLIDER 21 391 #define GUI_CTRL_TEXT_SPEED_SLIDER 22 392 #define GUI_CTRL_DISPLAY_TEXT_CHECKBOX 23 393 #define GUI_CTRL_SPOOLED_MUSIC_CHECKBOX 24 394 #define GUI_CTRL_OUTER_BOX 26 395 #define GUI_CTRL_INNER_BOX 27 398 #define GUI_CTRL_NUMPAD_1 1 399 #define GUI_CTRL_NUMPAD_2 2 400 #define GUI_CTRL_NUMPAD_3 3 401 #define GUI_CTRL_NUMPAD_4 4 402 #define GUI_CTRL_NUMPAD_5 5 403 #define GUI_CTRL_NUMPAD_6 6 404 #define GUI_CTRL_NUMPAD_7 7 405 #define GUI_CTRL_NUMPAD_8 8 406 #define GUI_CTRL_NUMPAD_9 9 407 #define GUI_CTRL_NUMPAD_0 10 408 #define GUI_CTRL_RESTART_BUTTON 13 409 #define GUI_CTRL_ARROW_LEFT_BUTTON 16 410 #define GUI_CTRL_ARROW_RIGHT_BUTTON 17 411 #define GUI_CTRL_NUMPAD_BACK 23 416 gsTextSpeedSlider = 2,
427 gsGameNotLoaded = 13,
431 gsSelectLoadPrompt = 17,
432 gsReplacePrompt = 18,
437 gsTextDisplayOnly = 24,
440 gsMusicVolumeSlider = 27,
441 gsVoiceVolumeSlider = 28,
442 gsSfxVolumeSlider = 29,
453 gsInsertSaveDisk = 40,
456 gsRecalJoystick = 43,
469 gsCurrentPasscode = 56,
470 gsEnterPasscode = 57,
471 gsConfirmPasscode = 58,
472 gsInvalidPasscode = 59,
489 int highlightedTextColor;
490 int highlightedFillColor;
493 bool doubleLinesFlag;
498 kScummActionInsaneDownLeft,
499 kScummActionInsaneDown,
500 kScummActionInsaneDownRight,
501 kScummActionInsaneLeft,
502 kScummActionInsaneRight,
503 kScummActionInsaneUpLeft,
504 kScummActionInsaneUp,
505 kScummActionInsaneUpRight,
506 kScummActionInsaneAttack,
507 kScummActionInsaneSwitch,
508 kScummActionInsaneCheat,
513 extern const char *
const insaneKeymapId;
522 friend class CharsetRendererTownsClassic;
528 friend class LogicHEBasketball;
534 IMuse *_imuse =
nullptr;
535 IMuseDigital *_imuseDigital =
nullptr;
538 Sound *_sound =
nullptr;
555 int _insideCreateResource = 0;
557 bool _useOriginalGUI =
true;
558 bool _enableAudioOverride =
false;
559 bool _enableCOMISong =
false;
560 bool _isAmigaPALSystem =
false;
561 bool _quitFromScriptCmd =
false;
562 bool _isHE995 =
false;
563 bool _enableHECompetitiveOnlineMods =
false;
570 bool _needsSoundUnpause =
false;
588 void errorString(
const char *buf_input,
char *buf_output,
int buf_output_size)
override;
590 bool gameSupportsQuitDialogOverride()
const;
591 void syncSoundSettings()
override;
598 void pauseEngineIntern(
bool pause)
override;
601 virtual void setupScumm(
const Common::Path &macResourceFile);
602 virtual void resetScumm();
604 virtual void setupScummVars();
605 virtual void resetScummVars();
606 void setVideoModeVarToCurrentConfig();
607 void setSoundCardVarToCurrentConfig();
609 void setupCharsetRenderer(
const Common::Path &macFontFile);
610 void setupCostumeRenderer();
612 virtual void loadLanguageBundle();
615 void setupMusic(
int midi);
616 void setTalkSpeed(
int talkspeed);
620 virtual void scummLoop(
int delta);
621 virtual void scummLoop_updateScummVars();
622 virtual void scummLoop_handleSaveLoad();
623 virtual void scummLoop_handleDrawing();
624 virtual void scummLoop_handleActors() = 0;
625 virtual void scummLoop_handleEffects();
626 virtual void scummLoop_handleSound();
628 virtual void runBootscript();
630 virtual void terminateSaveMenuScript() {};
634 void beginTextInput();
641 void waitForTimer(
int quarterFrames,
bool freezeMacGui =
false);
642 uint32 _lastWaitTime;
644 void setTimerAndShakeFrequency();
651 uint32 getIntegralTime(
double fMsecs);
652 double _msecFractParts = 0.0;
654 virtual void processInput();
656 virtual void clearClickedStatus();
659 virtual void updateCursor();
660 virtual void animateCursor() {}
661 virtual void updatePalette();
662 virtual void setDefaultCursor() {};
663 virtual void setCursorTransparency(
int a) {};
664 virtual void resetCursors() {}
665 virtual void setCursorHotspot(
int x,
int y) {}
666 virtual void setCursorFromBuffer(
const byte *ptr,
int width,
int height,
int pitch,
bool preventScale =
false) {}
669 byte _macGammaCorrectionLookUp[256] = {
670 0x00, 0x05, 0x09, 0x0B, 0x0E, 0x10, 0x13, 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1E, 0x20, 0x22, 0x24,
671 0x25, 0x27, 0x28, 0x2A, 0x2C, 0x2D, 0x2F, 0x30, 0x31, 0x33, 0x34, 0x36, 0x37, 0x38, 0x3A, 0x3B,
672 0x3C, 0x3E, 0x3F, 0x40, 0x42, 0x43, 0x44, 0x45, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4D, 0x4E, 0x4F,
673 0x50, 0x51, 0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5E, 0x5F, 0x60, 0x61,
674 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71,
675 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81,
676 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8C, 0x8D, 0x8E, 0x8F,
677 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9B, 0x9C, 0x9D,
678 0x9E, 0x9F, 0xA0, 0xA1, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB,
679 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8,
680 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC0, 0xC1, 0xC2, 0xC3, 0xC3, 0xC4,
681 0xC5, 0xC6, 0xC7, 0xC7, 0xC8, 0xC9, 0xCA, 0xCA, 0xCB, 0xCC, 0xCD, 0xCD, 0xCE, 0xCF, 0xD0, 0xD0,
682 0xD1, 0xD2, 0xD3, 0xD3, 0xD4, 0xD5, 0xD6, 0xD6, 0xD7, 0xD8, 0xD9, 0xD9, 0xDA, 0xDB, 0xDC, 0xDC,
683 0xDD, 0xDE, 0xDF, 0xDF, 0xE0, 0xE1, 0xE1, 0xE2, 0xE3, 0xE4, 0xE4, 0xE5, 0xE6, 0xE7, 0xE7, 0xE8,
684 0xE9, 0xE9, 0xEA, 0xEB, 0xEC, 0xEC, 0xED, 0xEE, 0xEE, 0xEF, 0xF0, 0xF1, 0xF1, 0xF2, 0xF3, 0xF3,
685 0xF4, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC, 0xFC, 0xFD, 0xFE, 0xFF
691 bool isUsingOriginalGUI()
const;
692 bool isMessageBannerActive();
694 bool _isIndy4Jap =
false;
697 Dialog *_pauseDialog =
nullptr;
698 Dialog *_messageDialog =
nullptr;
699 Dialog *_versionDialog =
nullptr;
701 void confirmExitDialog();
702 void confirmRestartDialog();
705 void versionDialog();
708 int32 _bannerColors[50];
709 byte *_bannerMem =
nullptr;
710 uint32 _bannerMemSize = 0;
711 int _bannerSaveYStart = 0;
713 bool _messageBannerActive =
false;
714 bool _comiQuitMenuIsOpen =
false;
715 bool _closeBannerAndQueryQuitFlag =
false;
718 byte *_textSurfBannerMem =
nullptr;
719 uint32 _textSurfBannerMemSize = 0;
724 const char _emptyMsg[1] = {
'\0'};
725 const char _uncheckedBox[2] = {
' ',
'\0'};
726 const char _checkedBox[2] = {
'x',
'\0'};
727 const char _arrowUp[2] = {
'\x18',
'\0'};
728 const char _arrowDown[2] = {
'\x19',
'\0'};
729 const char _arrowLeft[2] = {
'\x3c',
'\0'};
730 const char _arrowRight[2] = {
'\x3d',
'\0'};
734 int _mainMenuSavegameLabel = 1;
735 int _curDisplayedSaveSlotPage = 0;
736 int _firstSaveStateOfList = 0;
737 bool _mainMenuIsActive =
false;
738 bool _quitByGUIPrompt =
false;
739 char _mainMenuMusicSlider[17];
740 char _mainMenuSpeechSlider[17];
741 char _mainMenuSfxSlider[17];
742 char _mainMenuTextSpeedSlider[17];
743 char _mainMenuSegaCDPasscode[5];
744 int _spooledMusicIsToBeEnabled = 1;
745 int _saveScriptParam = 0;
746 int _guiCursorAnimCounter = 0;
747 int _v5VoiceMode = 0;
750 int _internalSpeakerSoundsAreOn = 1;
751 int _guiMouseFlag = 1;
752 int _guiJoystickFlag = 1;
754 bool _mixerMutedByGUI =
false;
757 byte *_tempTextSurface =
nullptr;
758 byte *_tempMainSurface =
nullptr;
759 byte *_tempVerbSurface =
nullptr;
760 bool _postGUICharMask =
false;
763 byte *_curGrabbedCursor =
nullptr;
764 int8 _oldCursorState = 0;
765 int _curCursorState = 0;
766 int _curCursorWidth = 0;
767 int _curCursorHeight = 0;
768 int _curCursorHotspotX = 0;
769 int _curCursorHotspotY = 0;
771 virtual void setSnailCursor() {}
774 Common::KeyState showBannerAndPause(
int bannerId, int32 waitTime,
const char *msg, ...);
775 Common::KeyState showOldStyleBannerAndPause(
const char *msg,
int color, int32 waitTime);
776 Common::KeyState printMessageAndPause(
const char *msg,
int color, int32 waitTime,
bool drawOnSentenceLine);
779 void setBannerColors(
int bannerId, byte r, byte g, byte b);
780 virtual int getBannerColor(
int bannerId);
781 void setUpInternalGUIControl(
int id,
int normalFillColor,
int normalTextColor,
782 int topLineColor,
int bottomLineColor,
int leftLineColor,
int rightLineColor,
783 int highlightedTextColor,
int highlightedFillColor,
784 int anchorPointX,
int anchorPointY,
int x,
int y,
const char *label,
bool centerFlag,
bool unknownFlag);
785 void drawInternalGUIControl(
int id,
bool highlightColor);
786 int getInternalGUIControlFromCoordinates(
int x,
int y);
787 virtual bool isSmushActive() {
return false; }
788 virtual bool isInsaneActive() {
return false; }
790 virtual void queryQuit(
bool returnToLauncher);
791 virtual void queryRestart();
792 virtual const char *getGUIString(
int stringId);
793 void waitForBannerInput(int32 waitTime,
Common::KeyState &ks,
bool &leftBtnClicked,
bool &rightBtnClicked,
bool handleMouseWheel =
false);
794 virtual int getGUIStringHeight(
const char *str);
795 virtual int getGUIStringWidth(
const char *str);
796 virtual void drawGUIText(
const char *buttonString,
Common::Rect *clipRect,
int textXPos,
int textYPos,
int textColor,
bool centerFlag);
797 void getSliderString(
int stringId,
int value,
char *sliderString,
int size);
798 virtual int getMusicVolume();
799 virtual int getSpeechVolume();
800 virtual int getSFXVolume();
801 virtual void setMusicVolume(
int volume);
802 virtual void setSpeechVolume(
int volume);
803 virtual void setSFXVolume(
int volume);
804 virtual void toggleVoiceMode();
805 virtual void handleLoadDuringSmush() {}
806 virtual void setSkipVideo(
int value) {}
809 virtual void setUpMainMenuControls();
810 void setUpMainMenuControlsSegaCD();
811 void setUpMainMenuControlsIndy4Jap();
812 void drawMainMenuControls();
813 void drawMainMenuControlsSegaCD();
814 void updateMainMenuControls();
815 void updateMainMenuControlsSegaCD();
816 void drawMainMenuTitle(
const char *title);
817 bool executeMainMenuOperation(
int op,
int mouseX,
int mouseY,
bool &hasLoadedState);
818 bool executeMainMenuOperationSegaCD(
int op,
int mouseX,
int mouseY,
bool &hasLoadedState);
819 bool shouldHighlightLabelAndWait(
int clickedControl);
820 void fillSavegameLabels();
821 bool canWriteGame(
int slotId);
822 bool userWriteLabelRoutine(
Common::KeyState &ks,
bool &leftMsClicked,
bool &rightMsClicked);
823 void saveCursorPreMenu();
824 void restoreCursorPostMenu();
825 void saveSurfacesPreGUI();
826 void restoreSurfacesPostGUI();
827 void showDraftsInventory();
828 void setUpDraftsInventory();
829 void drawDraftsInventory();
832 char displayMessage(
const char *altButton, MSVC_PRINTF
const char *message, ...)
GCC_PRINTF(3, 4);
833 bool displayMessageYesNo(MSVC_PRINTF
const char *message, ...)
GCC_PRINTF(2, 3);
839 Actor **_actors =
nullptr;
840 Actor **_sortedActors =
nullptr;
842 byte *_arraySlot =
nullptr;
843 uint16 *_inventory =
nullptr;
844 uint16 *_newNames =
nullptr;
848 #define VAR(x) scummVar(x, #x, __FILE__, __LINE__) 849 int32& scummVar(byte var,
const char *varName,
const char *file,
int line) {
851 error(
"Illegal access to variable %s in file %s, line %d", varName, file, line);
853 return _scummVars[var];
855 int32 scummVar(byte var,
const char *varName,
const char *file,
int line)
const {
857 error(
"Illegal access to variable %s in file %s, line %d", varName, file, line);
859 return _scummVars[var];
864 int32 *_roomVars =
nullptr;
865 int32 *_scummVars =
nullptr;
866 byte *_bitVars =
nullptr;
869 int _numVariables = 0;
870 int _numBitVariables = 0;
871 int _numLocalObjects = 0;
872 int _numGlobalObjects = 0;
875 int _numFlObject = 0;
876 int _numInventory = 0;
877 int _numNewNames = 0;
878 int _numGlobalScripts = 0;
879 int _numRoomVariables = 0;
880 int _numPalettes = 0;
886 int _numLocalScripts = 60, _numImages = 0, _numRooms = 0, _numScripts = 0, _numSounds = 0;
887 int _numCostumes = 0;
888 int32 _numCharsets = 0;
893 int _NESCostumeSet = 0;
894 void NES_loadCostumeSet(
int n);
895 byte *_NEScostdesc =
nullptr, *_NEScostlens =
nullptr, *_NEScostoffs =
nullptr, *_NEScostdata =
nullptr;
896 byte _NESPatTable[2][4096];
897 byte _NESPalette[2][16];
898 byte _NESBaseTiles = 0;
900 int _NESStartStrip = 0;
903 int _curPalIndex = 0;
906 byte _currentRoom = 0;
907 int _roomResource = 0;
908 bool _egoPositioned =
false;
912 virtual Common::Path generateFilename(
const int room)
const;
916 bool _keyDownMap[512];
917 bool _actionMap[kScummActionCount];
922 uint16 _mouseAndKeyboardStat = 0;
923 byte _leftBtnPressed = 0, _rightBtnPressed = 0;
925 int _mouseWheelFlag = 0;
927 bool _setupIsComplete =
false;
933 uint32 _lastInputScriptTime = 0;
939 bool _dumpScripts =
false;
940 bool _hexdumpScripts =
false;
941 bool _showStack =
false;
942 bool _debugMode =
false;
945 byte _saveLoadFlag = 0, _saveLoadSlot = 0;
946 uint32 _lastSaveTime = 0;
947 bool _saveTemporaryState =
false;
948 bool _pauseSoundsDuringSave =
true;
949 bool _loadFromLauncher =
false;
950 bool _videoModeChanged =
false;
956 bool loadState(
int slot,
bool compat);
963 void copyHeapSaveGameToFile(
int slot,
const char *saveName);
964 bool changeSavegameName(
int slot,
char *newName);
969 return makeSavegameName(_targetName, slot, temporary);
972 int getKeyState(
int key);
973 int getActionState(ScummAction action);
979 void listSavegames(
bool *marks,
int num);
982 void requestLoad(
int slot);
985 bool canPauseSoundsDuringSave()
const {
return _pauseSoundsDuringSave; }
997 uint32 _localScriptOffsets[1024];
998 const byte *_scriptPointer =
nullptr;
999 const byte *_scriptOrgPointer =
nullptr;
1000 const byte *
const *_lastCodePtr =
nullptr;
1002 bool _debug =
false;
1003 byte _currentScript = 0xFF;
1004 int _scummStackPos = 0;
1007 char _engineVersionString[50];
1008 char _dataFileVersionString[50];
1012 virtual void setupOpcodes() = 0;
1013 void executeOpcode(byte i);
1014 const char *getOpcodeDesc(byte i);
1016 void initializeLocals(
int slot,
int *vars);
1017 int getScriptSlot();
1019 void startScene(
int room,
Actor *a,
int b);
1023 void runScript(
int script,
bool freezeResistant,
bool recursive,
int *lvarptr,
int cycle = 0);
1024 void stopScript(
int script);
1025 void nukeArrays(byte scriptSlot);
1028 void runObjectScript(
int script,
int entry,
bool freezeResistant,
bool recursive,
int *vars,
int slot = -1,
int cycle = 0);
1029 void runScriptNested(
int script);
1030 void executeScript();
1031 void updateScriptPtr();
1032 virtual void runInventoryScript(
int i);
1033 virtual void runInventoryScriptEx(
int i);
1034 virtual void checkAndRunSentenceScript();
1035 void runExitScript();
1036 void runEntryScript();
1037 void runQuitScript();
1038 void runAllScripts();
1039 void freezeScripts(
int scr);
1040 void unfreezeScripts();
1042 bool isScriptInUse(
int script)
const;
1043 bool isRoomScriptRunning(
int script)
const;
1044 bool isScriptRunning(
int script)
const;
1046 void killAllScriptsExceptCurrent();
1047 void killScriptsAndResources();
1048 void decreaseScriptDelay(
int amount);
1050 void stopObjectCode();
1051 void stopObjectScript(
int script);
1053 void getScriptBaseAddress();
1054 void resetScriptPointer();
1055 int getVerbEntrypoint(
int obj,
int entry);
1057 void refreshScriptPointer();
1058 byte fetchScriptByte();
1059 virtual uint fetchScriptWord();
1060 virtual int fetchScriptWordSigned();
1061 uint fetchScriptDWord();
1062 int fetchScriptDWordSigned();
1063 void ignoreScriptWord() { fetchScriptWord(); }
1064 void ignoreScriptByte() { fetchScriptByte(); }
1067 virtual int readVar(uint var);
1068 virtual void writeVar(uint var,
int value);
1070 virtual void resetSentence() {}
1073 virtual void beginCutscene(
int *args);
1074 virtual void endCutscene();
1075 void abortCutscene();
1076 void beginOverride();
1079 void copyScriptString(byte *dst);
1080 int resStrLen(
const byte *src);
1081 void doSentence(
int c,
int b,
int a);
1085 uint32 _fileOffset = 0;
1094 bool isMacM68kIMuse()
const;
1097 int _resourceHeaderSize = 8;
1098 byte _resourceMapper[128];
1099 const byte *_resourceLastSearchBuf;
1100 uint32 _resourceLastSearchSize;
1102 virtual void allocateArrays();
1103 void openRoom(
int room);
1105 void deleteRoomOffsets();
1106 virtual void readRoomsOffsets();
1107 void askForDisk(
const Common::Path &filename,
int disknum);
1108 bool openResourceFile(
const Common::Path &filename, byte encByte);
1110 void loadPtrToResource(
ResType type, ResId idx,
const byte *ptr);
1111 virtual int readResTypeList(
ResType type);
1114 int loadResource(
ResType type, ResId idx);
1116 int getResourceRoomNr(
ResType type, ResId idx);
1117 virtual uint32 getResourceRoomOffset(
ResType type, ResId idx);
1120 int getResourceSize(
ResType type, ResId idx);
1121 byte *getResourceAddress(
ResType type, ResId idx);
1122 virtual byte *getStringAddress(ResId idx);
1123 byte *getStringAddressVar(
int i);
1124 void ensureResourceLoaded(
ResType type, ResId idx);
1131 int readSoundResource(ResId idx);
1132 int readSoundResourceSmallHeader(ResId idx);
1133 bool isResourceInUse(
ResType type, ResId idx)
const;
1135 virtual void setupRoomSubBlocks();
1136 virtual void resetRoomSubBlocks();
1138 virtual void clearRoomObjects();
1139 virtual void resetRoomObjects();
1140 virtual void resetRoomObject(
ObjectData *od,
const byte *room,
const byte *searchptr = NULL);
1142 virtual void readArrayFromIndexFile();
1143 virtual void readMAXS(
int blockSize) = 0;
1144 virtual void readGlobalObjects();
1145 virtual void readIndexFile();
1146 virtual void readIndexBlock(uint32 block, uint32 itemsize);
1147 virtual void loadCharset(
int i);
1148 void nukeCharset(
int i);
1150 int _lastLoadedRoom = 0;
1152 const byte *findResourceData(uint32 tag,
const byte *ptr);
1153 const byte *findResource(uint32 tag,
const byte *ptr);
1154 void applyWorkaroundIfNeeded(
ResType type,
int idx);
1155 bool verifyMI2MacBootScript();
1156 bool verifyMI2MacBootScript(byte *buf,
int size);
1157 bool tryPatchMI1CannibalScript(byte *buf,
int size);
1159 int getResourceDataSize(
const byte *ptr)
const;
1160 void dumpResource(
const char *tag,
int index,
const byte *ptr,
int length = -1);
1164 byte OF_OWNER_ROOM = 0;
1165 int getInventorySlot();
1166 int findInventory(
int owner,
int index);
1167 int getInventoryCount(
int owner);
1170 byte *_objectOwnerTable =
nullptr, *_objectRoomTable =
nullptr, *_objectStateTable =
nullptr;
1171 int _numObjectsInRoom = 0;
1174 uint32 *_classData =
nullptr;
1177 void markObjectRectAsDirty(
int obj);
1178 virtual void loadFlObject(uint
object, uint room);
1179 void nukeFlObjects(
int min,
int max);
1180 int findFlObjectSlot();
1181 int findLocalObjectSlot();
1182 void addObjectToInventory(uint obj, uint room);
1183 void updateObjectStates();
1185 bool getClass(
int obj,
int cls)
const;
1187 void putClass(
int obj,
int cls,
bool set);
1188 int getState(
int obj);
1189 void putState(
int obj,
int state);
1190 void setObjectState(
int obj,
int state,
int x,
int y);
1191 int getOwner(
int obj)
const;
1192 void putOwner(
int obj,
int owner);
1193 void setOwnerOf(
int obj,
int owner);
1194 void clearOwnerOf(
int obj);
1195 int getObjectRoom(
int obj)
const;
1196 virtual bool objIsActor(
int obj);
1197 virtual int objToActor(
int obj);
1198 virtual int actorToObj(
int actor);
1199 int getObjX(
int obj);
1200 int getObjY(
int obj);
1201 void getObjectWidth(
int object,
int &width) {
int x, y, dir; getObjectXYPos(
object, x, y, dir, width); }
1202 void getObjectXYPos(
int object,
int &x,
int &y) {
int dir, width; getObjectXYPos(
object, x, y, dir, width); }
1203 void getObjectXYPos(
int object,
int &x,
int &y,
int &dir) {
int width; getObjectXYPos(
object, x, y, dir, width); }
1204 void getObjectXYPos(
int object,
int &x,
int &y,
int &dir,
int &width);
1205 int getObjOldDir(
int obj);
1206 int getObjNewDir(
int obj);
1207 int getObjectIndex(
int object)
const;
1208 int getObjectImageCount(
int object);
1209 int whereIsObject(
int object)
const;
1210 int findObject(
int x,
int y);
1211 void findObjectInRoom(
FindObjectInRoom *fo, byte findWhat, uint
object, uint room);
1213 int getObjectOrActorWidth(
int object,
int &width);
1214 int getObjectOrActorXY(
int object,
int &x,
int &y);
1215 int getDist(
int x,
int y,
int x2,
int y2);
1218 int getObjActToObjActDist(
int a,
int b);
1219 const byte *getObjOrActorName(
int obj);
1220 void setObjectName(
int obj);
1222 void addObjectToDrawQue(
int object);
1223 void removeObjectFromDrawQue(
int object);
1224 void clearDrawObjectQueue();
1225 void processDrawQue();
1227 virtual void clearDrawQueues();
1229 uint32 getOBCDOffs(
int object)
const;
1230 byte *getOBCDFromObject(
int obj,
bool v0CheckInventory =
true);
1231 const byte *getOBIMFromObjectData(
const ObjectData &od);
1232 const byte *getObjectImage(
const byte *ptr,
int state);
1233 virtual int getObjectIdFromOBIM(
const byte *obim);
1237 uint16 _verbMouseOver = 0;
1239 uint16 _userState = 0;
1241 virtual void handleMouseOver(
bool updateInventory);
1242 virtual void redrawVerbs();
1243 virtual void checkExecVerbs();
1245 void verbMouseOver(
int verb);
1246 int findVerbAtPos(
int x,
int y)
const;
1247 virtual void drawVerb(
int verb,
int mode);
1248 virtual void runInputScript(
int clickArea,
int val,
int mode);
1249 void restoreVerbBG(
int verb);
1250 void drawVerbBitmap(
int verb,
int x,
int y);
1251 int getVerbSlot(
int id,
int mode)
const;
1252 void killVerb(
int slot);
1253 void setVerbObject(uint room, uint
object, uint verb);
1256 bool isValidActor(
int id)
const;
1259 Actor *derefActor(
int id,
const char *errmsg = 0)
const;
1260 Actor *derefActorSafe(
int id,
const char *errmsg)
const;
1264 void playActorSounds();
1265 void redrawAllActors();
1266 virtual void setActorRedrawFlags();
1269 void resetV1ActorTalkColor();
1270 virtual void resetActorBgs();
1271 virtual void processActors();
1272 void processUpperActors();
1273 virtual int getActorFromPos(
int x,
int y);
1277 byte _actorToPrintStrFor = 0, _V1TalkingActor = 0;
1278 int _sentenceNum = 0;
1282 int16 _talkDelay = 0;
1283 int _NES_lastTalkingActor = 0;
1284 int _NES_talkColor = 0;
1286 virtual void actorTalk(
const byte *msg);
1288 int getTalkingActor();
1289 void setTalkingActor(
int variable);
1292 bool isCostumeInUse(
int i)
const;
1296 uint16 _screenB = 0, _screenH = 0;
1298 int _roomHeight = 0, _roomWidth = 0;
1299 int _screenHeight = 0, _screenWidth = 0;
1302 bool _cameraIsFrozen =
false;
1304 int _screenStartStrip = 0, _screenEndStrip = 0;
1306 bool _forceBannerVirtScreen =
false;
1317 bool _useMacScreenCorrectHeight =
true;
1318 int _macScreenDrawOffset = 20;
1321 uint8 _bytesPerPixel = 1;
1326 uint8 _colorUsedByCycle[256];
1329 uint32 _ENCD_offs = 0, _EXCD_offs = 0;
1330 uint32 _CLUT_offs = 0, _EPAL_offs = 0;
1331 uint32 _IM00_offs = 0, _PALS_offs = 0;
1334 bool _fullRedraw =
false, _bgNeedsRedraw =
false;
1335 bool _screenEffectFlag =
false, _completeScreenRedraw =
false;
1336 bool _disableFadeInEffect =
false;
1339 int hotspotX, hotspotY, width, height;
1340 byte animate, animateIndex;
1346 byte _grabbedCursor[16384];
1347 byte _macGrabbedCursor[16384 * 4];
1348 byte _currentCursor = 0;
1350 byte _newEffect = 0, _switchRoomEffect2 = 0, _switchRoomEffect = 0;
1351 bool _doEffect =
false;
1353 bool _snapScroll =
false;
1355 virtual void setBuiltinCursor(
int index) {}
1357 bool isLightOn()
const;
1359 virtual int getCurrentLights()
const;
1362 void initScreens(
int b,
int h);
1363 void initVirtScreen(
VirtScreenNumber slot,
int top,
int width,
int height,
bool twobufs,
bool scrollable);
1364 void initBGBuffers(
int height);
1365 void initCycl(
const byte *ptr);
1367 void decodeNESBaseTiles();
1369 void drawObject(
int obj,
int scrollType);
1370 void drawRoomObjects(
int arg);
1371 void drawRoomObject(
int i,
int arg);
1372 void drawBox(
int x,
int y,
int x2,
int y2,
int color);
1373 void drawLine(
int x1,
int y1,
int x2,
int y2,
int color);
1374 void drawPixel(
VirtScreen *vs,
int x,
int y, int16 color,
bool useBackbuffer =
false);
1376 void moveScreen(
int dx,
int dy,
int height);
1378 void restoreBackground(
Common::Rect rect, byte backcolor = 0);
1379 void redrawBGStrip(
int start,
int num);
1380 virtual void redrawBGAreas();
1383 void setCameraAtEx(
int at);
1384 virtual void setCameraAt(
int pos_x,
int pos_y);
1385 virtual void setCameraFollows(
Actor *a,
bool setCamera =
false);
1386 virtual void moveCamera();
1387 virtual void panCameraTo(
int x,
int y);
1389 void actorFollowCamera(
int act);
1391 const byte *getPalettePtr(
int palindex,
int room);
1393 void setPaletteFromTable(
const byte *ptr,
int numcolor,
int firstIndex = 0);
1394 void resetPalette();
1396 void setCurrentPalette(
int pal);
1397 void setRoomPalette(
int pal,
int room);
1398 void setPCEPaletteFromPtr(
const byte *ptr);
1399 void setAmigaPaletteFromPtr(
const byte *ptr);
1400 virtual void setPaletteFromPtr(
const byte *ptr,
int numcolor = -1);
1401 void setV1ColorTable(
int renderMode);
1403 virtual void setPalColor(
int index,
int r,
int g,
int b);
1404 void setDirtyColors(
int min,
int max);
1405 const byte *findPalInPals(
const byte *pal,
int index);
1406 void swapPalColors(
int a,
int b);
1407 virtual void copyPalColor(
int dst,
int src);
1408 void cyclePalette();
1409 void stopCycle(
int i);
1410 virtual void palManipulateInit(
int resID,
int start,
int end,
int time);
1411 void palManipulate();
1412 uint32 findClosestPaletteColor(byte *palette,
int paletteLength, byte r, byte g, byte b);
1413 void applyGrayscaleToPaletteRange(
int min,
int max);
1414 bool haveToApplyMonkey1PaletteFix();
1417 uint8 *getHEPaletteSlot(uint16 palSlot);
1418 uint16 get16BitColor(uint8 r, uint8 g, uint8 b);
1419 uint32 getPaletteColorFromRGB(byte *palette, byte r, byte g, byte b);
1420 uint32 getPackedRGBColorFromPalette(byte *palette, uint32 color);
1421 void fetchBlackAndWhite(uint32 &black, uint32 &white, byte *palette,
int paletteEntries);
1422 int remapPaletteColor(
int r,
int g,
int b,
int threshold);
1423 void readPCEPalette(
const byte **ptr, byte **dest,
int numEntries);
1424 void colorPCEToRGB(uint16 color, byte *r, byte *g, byte *b);
1425 void setPCETextPalette(uint8 color);
1427 void moveMemInPalRes(
int start,
int end, byte direction);
1428 void setShadowPalette(
int slot,
int redScale,
int greenScale,
int blueScale,
int startColor,
int endColor);
1429 void setShadowPalette(
int redScale,
int greenScale,
int blueScale,
int startColor,
int endColor,
int start,
int end);
1430 virtual void darkenPalette(
int redScale,
int greenScale,
int blueScale,
int startColor,
int endColor);
1433 void markRectAsDirty(
VirtScreenNumber virt,
int left,
int right,
int top,
int bottom,
int dirtybit = 0);
1435 markRectAsDirty(virt, rect.
left, rect.
right, rect.top, rect.bottom, dirtybit);
1439 byte *_compositeBuf;
1440 byte *_hercCGAScaleBuf =
nullptr;
1441 bool _enableEGADithering =
false;
1442 bool _supportsEGADithering =
false;
1444 virtual void drawDirtyScreenParts();
1446 void drawStripToScreen(
VirtScreen *vs,
int x,
int width,
int top,
int bottom);
1448 void mac_markScreenAsDirty(
int x,
int y,
int w,
int h);
1449 void mac_drawStripToScreen(
VirtScreen *vs,
int top,
int x,
int y,
int width,
int height);
1450 void mac_drawIndy3TextBox();
1451 void mac_undrawIndy3TextBox();
1452 void mac_undrawIndy3CreditsText();
1453 void mac_drawBufferToScreen(
const byte *buffer,
int pitch,
int x,
int y,
int width,
int height,
bool epxRectangleExpansion =
true);
1454 void mac_updateCompositeBuffer(
const byte *buffer,
int pitch,
int x,
int y,
int width,
int height);
1455 void mac_blitDoubleResImage(
const byte *buffer,
int pitch,
int x,
int y,
int width,
int height);
1456 void mac_applyDoubleResToBuffer(
const byte *inputBuffer, byte *outputBuffer,
int width,
int height,
int inputPitch,
int outputPitch);
1457 void mac_blitEPXImage(
const byte *buffer,
int pitch,
int x,
int y,
int width,
int height,
bool epxRectangleExpansion =
true);
1458 void mac_applyEPXToBuffer(
const byte *inputBuffer, byte *outputBuffer,
int width,
int height,
int inputPitch,
int outputPitch,
int xOffset,
int yOffset,
int bufferWidth,
int bufferHeight);
1459 void mac_scaleCursor(byte *&outCursor,
int &outHotspotX,
int &outHotspotY,
int &outWidth,
int &outHeight);
1460 void mac_toggleSmoothing();
1462 Common::KeyState mac_showOldStyleBannerAndPause(
const char *msg, int32 waitTime);
1464 const byte *postProcessDOSGraphics(
VirtScreen *vs,
int &pitch,
int &x,
int &y,
int &width,
int &height)
const;
1465 const byte *ditherVGAtoEGA(
int &pitch,
int &x,
int &y,
int &width,
int &height)
const;
1469 byte *getMaskBuffer(
int x,
int y,
int z);
1472 void fadeIn(
int effect);
1473 void fadeOut(
int effect);
1475 void dissolveEffectSelector();
1476 void transitionEffect(
int a);
1477 void dissolveEffect(
int width,
int height);
1478 void scrollEffect(
int dir);
1480 void updateScreenShakeEffect();
1483 double getTimerFrequency();
1484 double getAmigaMusicTimerFrequency();
1487 bool _shakeEnabled =
false;
1488 bool _shakeTempSavedState =
false;
1489 uint _shakeFrame = 0;
1490 uint32 _shakeNextTick = 0;
1491 uint32 _shakeTickCounter = 0;
1492 double _shakeTimerRate;
1493 double _timerFrequency;
1495 void setShake(
int mode);
1497 int _drawObjectQueNr = 0;
1498 byte _drawObjectQue[200];
1511 uint32 gfxUsageBits[410 * 3];
1513 void upgradeGfxUsageBits();
1514 void setGfxUsageBit(
int strip,
int bit);
1515 void clearGfxUsageBit(
int strip,
int bit);
1518 bool testGfxUsageBit(
int strip,
int bit) {
1519 assert(strip >= 0 && strip <
ARRAYSIZE(gfxUsageBits) / 3);
1520 assert(1 <= bit && bit <= 96);
1522 return (gfxUsageBits[3 * strip + bit / 32] & (1 << (bit % 32))) != 0;
1525 bool testGfxAnyUsageBits(
int strip);
1526 bool testGfxObjectUsageBits(
int strip);
1527 bool testGfxOtherUsageBits(
int strip,
int bit);
1530 byte _roomPalette[256];
1531 byte *_shadowPalette =
nullptr;
1532 bool _skipDrawObject = 0;
1536 byte _HEV7ActorPalette[256];
1537 uint8 *_hePalettes =
nullptr;
1538 uint16 _hePaletteSlot = 0;
1539 uint16 *_16BitPalette =
nullptr;
1542 byte *_verbPalette =
nullptr;
1547 int _shadowPaletteSize = 0;
1548 byte _currentPalette[3 * 256];
1549 byte _darkenPalette[3 * 256];
1550 int _paletteChangedCounter = 1;
1552 int _palDirtyMin = 0, _palDirtyMax = 0;
1554 byte _palManipStart = 0, _palManipEnd = 0;
1555 uint16 _palManipCounter = 0;
1556 byte *_palManipPalette =
nullptr;
1557 byte *_palManipIntermediatePal =
nullptr;
1559 bool _haveActorSpeechMsg =
false;
1560 bool _useTalkAnims =
false;
1561 uint16 _defaultTextSpeed = 0;
1563 bool _native_mt32 =
false;
1564 bool _copyProtection =
false;
1565 bool _shadowPalRemap =
false;
1568 uint16 _amigaFirstUsedColor = 0;
1569 byte _amigaPalette[3 * 64];
1570 void amigaPaletteFindFirstUsedColor();
1571 void mapRoomPalette(
int idx);
1572 int remapRoomPaletteColor(
int r,
int g,
int b);
1573 void mapVerbPalette(
int idx);
1574 int remapVerbPaletteColor(
int r,
int g,
int b);
1577 byte *_egaColorMap[2];
1580 uint16 _extraBoxFlags[65];
1583 byte *getBoxMatrixBaseAddr();
1584 byte *getBoxConnectionBase(
int box);
1586 int getNextBox(byte from, byte to);
1588 void setBoxFlags(
int box,
int val);
1589 void setBoxScale(
int box,
int b);
1591 bool checkXYInBoxBounds(
int box,
int x,
int y);
1593 BoxCoords getBoxCoordinates(
int boxnum);
1595 byte getMaskFromBox(
int box);
1596 Box *getBoxBaseAddr(
int box);
1597 byte getBoxFlags(
int box);
1598 int getBoxScale(
int box);
1600 int getScale(
int box,
int x,
int y);
1601 int getScaleFromSlot(
int slot,
int x,
int y);
1611 void setScaleSlot(
int slot,
int x1,
int y1,
int scale1,
int x2,
int y2,
int scale2);
1612 void setBoxScaleSlot(
int box,
int slot);
1613 void convertScaleTableToScaleSlot(
int slot);
1615 void calcItineraryMatrix(byte *itineraryMatrix,
int num);
1616 void createBoxMatrix();
1617 virtual bool areBoxesNeighbors(
int i,
int j);
1622 byte _charsetColorMap[16];
1629 int _textSurfaceMultiplier = 0;
1632 MacGui *_macGui =
nullptr;
1633 bool _useMacGraphicsSmoothing =
true;
1634 byte _completeScreenBuffer[320 * 200];
1637 byte _charsetColor = 0;
1638 byte _charsetData[23][16];
1640 int _charsetBufPos = 0;
1641 byte _charsetBuffer[512];
1643 bool _keepText =
false;
1646 int _nextLeft = 0, _nextTop = 0;
1650 void restoreCharsetBg();
1651 void clearCharsetMask();
1652 void clearTextSurface();
1654 virtual void initCharset(
int charset);
1656 virtual void printString(
int m,
const byte *msg);
1658 virtual bool handleNextCharsetCode(
Actor *a,
int *c);
1659 virtual void drawSentence() {}
1660 virtual void displayDialog();
1662 void drawString(
int a,
const byte *msg);
1663 virtual void fakeBidiString(byte *ltext,
bool ignoreVerb,
int ltextSize)
const;
1664 void wrapSegaCDText();
1665 void debugMessage(
const byte *msg);
1666 virtual void showMessageDialog(
const byte *msg);
1668 virtual int convertMessageToString(
const byte *msg, byte *dst,
int dstSize);
1669 int convertIntMessage(byte *dst,
int dstSize,
int var);
1670 int convertVerbMessage(byte *dst,
int dstSize,
int var);
1671 int convertNameMessage(byte *dst,
int dstSize,
int var);
1672 int convertStringMessage(byte *dst,
int dstSize,
int var);
1678 virtual void translateText(
const byte *text, byte *trans_buff,
int transBufferSize);
1680 bool reverseIfNeeded(
const byte *text, byte *reverseBuf,
int reverseBufSize)
const;
1682 Common::CodePage getDialogCodePage()
const;
1685 bool _useCJKMode =
false;
1686 bool _useMultiFont =
false;
1687 int _numLoadedFont = 0;
1688 int _2byteShadow = 0;
1689 bool _force2ByteCharHeight =
false;
1691 int _2byteHeight = 0;
1692 int _2byteWidth = 0;
1694 byte _newLineCharacter = 0;
1695 byte *get2byteCharPtr(
int idx);
1697 bool isScummvmKorTarget();
1698 bool hasLocalizer();
1701 byte *_2byteFontPtr =
nullptr;
1702 byte *_2byteMultiFontPtr[20];
1703 int _2byteMultiHeight[20];
1704 int _2byteMultiWidth[20];
1705 int _2byteMultiShadow[20];
1708 struct TranslatedLine {
1709 uint32 originalTextOffset;
1710 uint32 translatedTextOffset;
1713 struct TranslationRange {
1717 TranslationRange(uint32 left_, uint32 right_) : left(left_), right(right_) {}
1718 TranslationRange() : left(0), right(0) {}
1721 struct TranslationRoom {
1725 bool _existLanguageFile =
false;
1726 bool _isRTL =
false;
1727 byte *_languageBuffer =
nullptr;
1728 int _numTranslatedLines = 0;
1729 TranslatedLine *_translatedLines =
nullptr;
1730 uint16 *_languageLineIndex =
nullptr;
1733 const byte *searchTranslatedLine(
const byte *text,
const TranslationRange &range,
bool useIndex);
1735 virtual void createTextRenderer(GlyphRenderer_v7 *gr) {}
1740 byte VAR_KEYPRESS = 0xFF;
1741 byte VAR_SYNC = 0xFF;
1742 byte VAR_EGO = 0xFF;
1743 byte VAR_CAMERA_POS_X = 0xFF;
1744 byte VAR_HAVE_MSG = 0xFF;
1745 byte VAR_ROOM = 0xFF;
1746 byte VAR_OVERRIDE = 0xFF;
1747 byte VAR_MACHINE_SPEED = 0xFF;
1749 byte VAR_NUM_ACTOR = 0xFF;
1750 byte VAR_CURRENT_LIGHTS = 0xFF;
1751 byte VAR_CURRENTDRIVE = 0xFF;
1752 byte VAR_CURRENTDISK = 0xFF;
1753 byte VAR_TMR_1 = 0xFF;
1754 byte VAR_TMR_2 = 0xFF;
1755 byte VAR_TMR_3 = 0xFF;
1756 byte VAR_MUSIC_TIMER = 0xFF;
1757 byte VAR_ACTOR_RANGE_MIN = 0xFF;
1758 byte VAR_ACTOR_RANGE_MAX = 0xFF;
1759 byte VAR_CAMERA_MIN_X = 0xFF;
1760 byte VAR_CAMERA_MAX_X = 0xFF;
1761 byte VAR_TIMER_NEXT = 0xFF;
1762 byte VAR_VIRT_MOUSE_X = 0xFF;
1763 byte VAR_VIRT_MOUSE_Y = 0xFF;
1764 byte VAR_ROOM_RESOURCE = 0xFF;
1765 byte VAR_LAST_SOUND = 0xFF;
1766 byte VAR_CUTSCENEEXIT_KEY = 0xFF;
1767 byte VAR_OPTIONS_KEY = 0xFF;
1768 byte VAR_TALK_ACTOR = 0xFF;
1769 byte VAR_CAMERA_FAST_X = 0xFF;
1770 byte VAR_SCROLL_SCRIPT = 0xFF;
1771 byte VAR_ENTRY_SCRIPT = 0xFF;
1772 byte VAR_ENTRY_SCRIPT2 = 0xFF;
1773 byte VAR_EXIT_SCRIPT = 0xFF;
1774 byte VAR_EXIT_SCRIPT2 = 0xFF;
1775 byte VAR_VERB_SCRIPT = 0xFF;
1776 byte VAR_SENTENCE_SCRIPT = 0xFF;
1777 byte VAR_INVENTORY_SCRIPT = 0xFF;
1778 byte VAR_CUTSCENE_START_SCRIPT = 0xFF;
1779 byte VAR_CUTSCENE_END_SCRIPT = 0xFF;
1780 byte VAR_CHARINC = 0xFF;
1781 byte VAR_WALKTO_OBJ = 0xFF;
1782 byte VAR_DEBUGMODE = 0xFF;
1783 byte VAR_HEAPSPACE = 0xFF;
1784 byte VAR_RESTART_KEY = 0xFF;
1785 byte VAR_PAUSE_KEY = 0xFF;
1786 byte VAR_MOUSE_X = 0xFF;
1787 byte VAR_MOUSE_Y = 0xFF;
1788 byte VAR_TIMER = 0xFF;
1789 byte VAR_TIMER_TOTAL = 0xFF;
1790 byte VAR_SOUNDCARD = 0xFF;
1791 byte VAR_VIDEOMODE = 0xFF;
1792 byte VAR_MAINMENU_KEY = 0xFF;
1793 byte VAR_FIXEDDISK = 0xFF;
1794 byte VAR_CURSORSTATE = 0xFF;
1795 byte VAR_USERPUT = 0xFF;
1796 byte VAR_SOUNDRESULT = 0xFF;
1797 byte VAR_TALKSTOP_KEY = 0xFF;
1798 byte VAR_FADE_DELAY = 0xFF;
1799 byte VAR_NOSUBTITLES = 0xFF;
1802 byte VAR_SOUNDPARAM = 0xFF;
1803 byte VAR_SOUNDPARAM2 = 0xFF;
1804 byte VAR_SOUNDPARAM3 = 0xFF;
1805 byte VAR_INPUTMODE = 0xFF;
1806 byte VAR_MEMORY_PERFORMANCE = 0xFF;
1807 byte VAR_VIDEO_PERFORMANCE = 0xFF;
1808 byte VAR_ROOM_FLAG = 0xFF;
1809 byte VAR_GAME_LOADED = 0xFF;
1810 byte VAR_NEW_ROOM = 0xFF;
1813 byte VAR_V5_TALK_STRING_Y = 0xFF;
1816 byte VAR_ROOM_WIDTH = 0xFF;
1817 byte VAR_ROOM_HEIGHT = 0xFF;
1818 byte VAR_SUBTITLES = 0xFF;
1819 byte VAR_V6_EMSSPACE = 0xFF;
1822 byte VAR_CAMERA_POS_Y = 0xFF;
1823 byte VAR_CAMERA_MIN_Y = 0xFF;
1824 byte VAR_CAMERA_MAX_Y = 0xFF;
1825 byte VAR_CAMERA_THRESHOLD_X = 0xFF;
1826 byte VAR_CAMERA_THRESHOLD_Y = 0xFF;
1827 byte VAR_CAMERA_SPEED_X = 0xFF;
1828 byte VAR_CAMERA_SPEED_Y = 0xFF;
1829 byte VAR_CAMERA_ACCEL_X = 0xFF;
1830 byte VAR_CAMERA_ACCEL_Y = 0xFF;
1831 byte VAR_CAMERA_DEST_X = 0xFF;
1832 byte VAR_CAMERA_DEST_Y = 0xFF;
1833 byte VAR_CAMERA_FOLLOWED_ACTOR = 0xFF;
1836 byte VAR_VERSION_KEY = 0xFF;
1837 byte VAR_DEFAULT_TALK_DELAY = 0xFF;
1838 byte VAR_CUSTOMSCALETABLE = 0xFF;
1839 byte VAR_BLAST_ABOVE_TEXT = 0xFF;
1840 byte VAR_VOICE_MODE = 0xFF;
1841 byte VAR_MUSIC_BUNDLE_LOADED = 0xFF;
1842 byte VAR_VOICE_BUNDLE_LOADED = 0xFF;
1844 byte VAR_LEFTBTN_DOWN = 0xFF;
1845 byte VAR_RIGHTBTN_DOWN = 0xFF;
1846 byte VAR_LEFTBTN_HOLD = 0xFF;
1847 byte VAR_RIGHTBTN_HOLD = 0xFF;
1848 byte VAR_PRE_SAVELOAD_SCRIPT = 0xFF;
1849 byte VAR_POST_SAVELOAD_SCRIPT = 0xFF;
1850 byte VAR_SAVELOAD_PAGE = 0xFF;
1851 byte VAR_OBJECT_LABEL_FLAG = 0xFF;
1854 byte VAR_CHARSET_MASK = 0xFF;
1857 byte VAR_V6_SOUNDMODE = 0xFF;
1860 byte VAR_CHARCOUNT = 0xFF;
1861 byte VAR_VERB_ALLOWED = 0xFF;
1862 byte VAR_ACTIVE_VERB = 0xFF;
1863 byte VAR_ACTIVE_OBJECT1 = 0xFF;
1864 byte VAR_ACTIVE_OBJECT2 = 0xFF;
1867 byte VAR_ALWAYS_REDRAW_ACTORS = 0xFF;
1868 byte VAR_SKIP_RESET_TALK_ACTOR = 0xFF;
1870 byte VAR_SOUND_CHANNEL = 0xFF;
1871 byte VAR_TALK_CHANNEL = 0xFF;
1872 byte VAR_SOUND_TOKEN_OFFSET = 0xFF;
1873 byte VAR_START_DYN_SOUND_CHANNELS = 0xFF;
1874 byte VAR_SOUND_CALLBACK_SCRIPT = 0xFF;
1876 byte VAR_EARLY_TALKIE_CALLBACK = 0xFF;
1877 byte VAR_EARLY_CHAN_0_CALLBACK = 0xFF;
1878 byte VAR_EARLY_CHAN_1_CALLBACK = 0xFF;
1879 byte VAR_EARLY_CHAN_2_CALLBACK = 0xFF;
1880 byte VAR_EARLY_CHAN_3_CALLBACK = 0xFF;
1882 byte VAR_MAIN_SCRIPT = 0xFF;
1884 byte VAR_DEFAULT_SCRIPT_PRIORITY = 0xFF;
1885 byte VAR_LAST_SCRIPT_PRIORITY = 0xFF;
1887 byte VAR_QUIT_SCRIPT = 0xFF;
1888 byte VAR_ERROR_FLAG = 0xFF;
1889 byte VAR_OPERATION_FAILURE = 0xFF;
1891 byte VAR_COLOR_BLACK = 0xFF;
1894 byte VAR_NUM_GLOBAL_OBJS = 0xFF;
1896 #ifdef USE_RGB_COLOR 1898 Graphics::FontSJIS *_cjkFont =
nullptr;
1902 #ifndef DISABLE_TOWNS_DUAL_LAYER_MODE 1904 bool towns_isRectInStringBox(
int x1,
int y1,
int x2,
int y2);
1905 byte _townsPaletteFlags = 0;
1906 byte _townsCharsetColorMap[16];
1909 void towns_drawStripToScreen(
VirtScreen *vs,
int dstX,
int dstY,
int srcX,
int srcY,
int w,
int h);
1910 void towns_fillTopLayerRect(
int x1,
int y1,
int x2,
int y2,
int col);
1911 void towns_swapVirtScreenArea(
VirtScreen *vs,
int x,
int y,
int w,
int h);
1912 void towns_clearStrip(
int strip);
1913 #ifdef USE_RGB_COLOR 1914 void towns_setPaletteFromPtr(
const byte *ptr,
int numcolor = -1);
1915 void towns_setTextPaletteFromPtr(
const byte *ptr);
1917 void towns_setupPalCycleField(
int x1,
int y1,
int x2,
int y2);
1918 void towns_processPalCycleField();
1919 void towns_resetPalCycleFields();
1920 void towns_restoreCharsetBg();
1921 void towns_scriptScrollEffect(
int dir);
1923 void requestScroll(
int dir);
1924 void scrollLeft() { requestScroll(-1); }
1925 void scrollRight() { requestScroll(1); }
1926 void towns_waitForScroll(
int waitForDirection,
int threshold = 0);
1927 void towns_updateGfx();
1930 int _numCyclRects = 0;
1931 int _scrollRequest = 0;
1932 int _scrollDeltaAdjust = 0;
1933 bool _scrollNeedDeltaAdjust = 0;
1934 int _refreshDuration[20];
1935 int _refreshArrayPos = 0;
1936 bool _refreshNeedCatchUp =
false;
1937 bool _enableSmoothScrolling =
false;
1938 bool _forceFMTownsHiResMode =
false;
1939 uint32 _scrollTimer = 0;
1940 uint32 _scrollDestOffset = 0;
1941 uint16 _scrollFeedStrips[3];
1945 byte _townsOverrideShadowColor = 0;
1946 byte _textPalette[48];
1947 byte _townsClearLayerFlag = 1;
1948 byte _townsActiveLayerFlags = 3;
1949 static const uint8 _townsLayer2Mask[];
1953 void scrollLeft() { redrawBGStrip(_gdi->_numStrips - 1, 1); }
1954 void scrollRight() { redrawBGStrip(0, 1); }
1955 void towns_updateGfx() {}
1956 void towns_waitForScroll(
int waitForDirection,
int threshold = 0) {}
1957 void towns_fillTopLayerRect(
int x1,
int y1,
int x2,
int y2,
int col) {}
1958 void towns_swapVirtScreenArea(
VirtScreen *vs,
int x,
int y,
int w,
int h) {}
1959 #endif // DISABLE_TOWNS_DUAL_LAYER_MODE #define ARRAYSIZE(x)
Definition: util.h:91
Definition: macgui_impl.h:55
VirtScreenNumber
Definition: gfx.h:161
EngineFeature
Definition: engine.h:253
ErrorCode getCode() const
Definition: error.h:115
Definition: detection.h:117
int16 right
Definition: rect.h:146
Definition: palette.h:153
RenderMode
Definition: rendermode.h:48
No error occurred.
Definition: error.h:48
Common::Path _containerFile
Definition: scumm.h:1088
Definition: resource.h:75
ResType
Definition: scumm.h:256
Definition: macgui_indy3.h:37
Definition: serializer.h:79
Graphics::Surface _textSurface
Definition: scumm.h:1628
int FORCEINLINE GCC_PRINTF(2, 0) int vsprintf_s(T(&dst)[N]
Definition: detection.h:44
Definition: player_towns.h:32
Definition: debugger.h:33
Definition: algorithm.h:29
Definition: formatinfo.h:28
Definition: macgui_v5.h:33
int16 left
Definition: rect.h:145
Definition: serializer.h:308
Definition: charset.h:155
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
Common::Error run() override
Definition: scumm.h:580
Common::RandomSource _rnd
Definition: scumm.h:548
Definition: macgui_loom.h:33
void void void void void debugC(int level, uint32 debugChannels, MSVC_PRINTF const char *s,...) GCC_PRINTF(3
Definition: base-costume.h:49
Definition: detection.h:131
Language
Definition: language.h:45