mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-13 21:31:53 +00:00
2c601ad06a
Indeed, we were missing some code from the original which handled overlapping actors in which some moved and some did not, which caused the latter to be erased. Thanks eriktorbjorn for the great pointers on this.
897 lines
20 KiB
C++
897 lines
20 KiB
C++
/* ScummVM - Graphic Adventure Engine
|
|
*
|
|
* ScummVM is the legal property of its developers, whose names
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
* file distributed with this source distribution.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
|
|
|
|
#include "common/config-manager.h"
|
|
#include "scumm/music.h"
|
|
#include "scumm/scumm.h"
|
|
#include "scumm/scumm_v0.h"
|
|
#include "scumm/scumm_v8.h"
|
|
#include "scumm/sound.h"
|
|
#include "scumm/he/intern_he.h"
|
|
#include "scumm/he/logic_he.h"
|
|
|
|
#include "audio/mididrv.h"
|
|
|
|
namespace Scumm {
|
|
|
|
void ScummEngine::setupScummVars() {
|
|
VAR_KEYPRESS = 0;
|
|
VAR_EGO = 1;
|
|
VAR_CAMERA_POS_X = 2;
|
|
VAR_HAVE_MSG = 3;
|
|
VAR_ROOM = 4;
|
|
VAR_OVERRIDE = 5;
|
|
VAR_MACHINE_SPEED = 6;
|
|
VAR_ME = 7;
|
|
VAR_NUM_ACTOR = 8;
|
|
VAR_CURRENTDRIVE = 10;
|
|
VAR_TMR_1 = 11;
|
|
VAR_TMR_2 = 12;
|
|
VAR_TMR_3 = 13;
|
|
VAR_MUSIC_TIMER = 14;
|
|
VAR_ACTOR_RANGE_MIN = 15;
|
|
VAR_ACTOR_RANGE_MAX = 16;
|
|
VAR_CAMERA_MIN_X = 17;
|
|
VAR_CAMERA_MAX_X = 18;
|
|
VAR_TIMER_NEXT = 19;
|
|
VAR_VIRT_MOUSE_X = 20;
|
|
VAR_VIRT_MOUSE_Y = 21;
|
|
VAR_ROOM_RESOURCE = 22;
|
|
VAR_LAST_SOUND = 23;
|
|
VAR_CUTSCENEEXIT_KEY = 24;
|
|
VAR_TALK_ACTOR = 25;
|
|
VAR_CAMERA_FAST_X = 26;
|
|
VAR_ENTRY_SCRIPT = 28;
|
|
VAR_ENTRY_SCRIPT2 = 29;
|
|
VAR_EXIT_SCRIPT = 30;
|
|
VAR_EXIT_SCRIPT2 = 31;
|
|
VAR_VERB_SCRIPT = 32;
|
|
VAR_SENTENCE_SCRIPT = 33;
|
|
VAR_INVENTORY_SCRIPT = 34;
|
|
VAR_CUTSCENE_START_SCRIPT = 35;
|
|
VAR_CUTSCENE_END_SCRIPT = 36;
|
|
VAR_CHARINC = 37;
|
|
VAR_WALKTO_OBJ = 38;
|
|
VAR_HEAPSPACE = 40;
|
|
VAR_RESTART_KEY = 42;
|
|
VAR_PAUSE_KEY = 43;
|
|
VAR_MOUSE_X = 44;
|
|
VAR_MOUSE_Y = 45;
|
|
VAR_TIMER = 46;
|
|
VAR_TIMER_TOTAL = 47;
|
|
VAR_SOUNDCARD = 48;
|
|
VAR_VIDEOMODE = 49;
|
|
|
|
if (_game.id == GID_LOOM && _game.platform == Common::kPlatformPCEngine) {
|
|
VAR_MAINMENU_KEY = 50;
|
|
}
|
|
|
|
if (_game.version >= 4) {
|
|
VAR_SCROLL_SCRIPT = 27;
|
|
VAR_DEBUGMODE = 39;
|
|
VAR_MAINMENU_KEY = 50;
|
|
VAR_FIXEDDISK = 51;
|
|
VAR_CURSORSTATE = 52;
|
|
VAR_USERPUT = 53;
|
|
}
|
|
|
|
if (_game.version >= 5) {
|
|
VAR_SOUNDRESULT = 56;
|
|
VAR_TALKSTOP_KEY = 57;
|
|
VAR_FADE_DELAY = 59;
|
|
VAR_SOUNDPARAM = 64;
|
|
VAR_SOUNDPARAM2 = 65;
|
|
VAR_SOUNDPARAM3 = 66;
|
|
VAR_INPUTMODE = 67; // 1 is keyboard, 2 is joystick, 3 is mouse
|
|
VAR_MEMORY_PERFORMANCE = 68;
|
|
VAR_VIDEO_PERFORMANCE = 69;
|
|
VAR_ROOM_FLAG = 70;
|
|
VAR_GAME_LOADED = 71;
|
|
VAR_NEW_ROOM = 72;
|
|
}
|
|
}
|
|
|
|
void ScummEngine_v0::setupScummVars() {
|
|
VAR_EGO = 0;
|
|
VAR_CAMERA_POS_X = 2;
|
|
VAR_HAVE_MSG = 3;
|
|
VAR_ROOM = 4;
|
|
VAR_ACTIVE_OBJECT2 = 5;
|
|
VAR_OVERRIDE = 6;
|
|
VAR_IS_SOUND_RUNNING = 8;
|
|
VAR_ACTIVE_VERB = 9;
|
|
VAR_CHARCOUNT = 10;
|
|
}
|
|
|
|
void ScummEngine_v2::setupScummVars() {
|
|
VAR_EGO = 0;
|
|
VAR_CAMERA_POS_X = 2;
|
|
VAR_HAVE_MSG = 3;
|
|
VAR_ROOM = 4;
|
|
VAR_OVERRIDE = 5;
|
|
VAR_MACHINE_SPEED = 6;
|
|
VAR_CHARCOUNT = 7;
|
|
VAR_ACTIVE_VERB = 8;
|
|
VAR_ACTIVE_OBJECT1 = 9;
|
|
VAR_ACTIVE_OBJECT2 = 10;
|
|
VAR_NUM_ACTOR = 11;
|
|
VAR_CURRENT_LIGHTS = 12;
|
|
VAR_CURRENTDRIVE = 13;
|
|
VAR_MUSIC_TIMER = 17;
|
|
VAR_VERB_ALLOWED = 18;
|
|
VAR_ACTOR_RANGE_MIN = 19;
|
|
VAR_ACTOR_RANGE_MAX = 20;
|
|
VAR_CURSORSTATE = 21;
|
|
VAR_CAMERA_MIN_X = 23;
|
|
VAR_CAMERA_MAX_X = 24;
|
|
VAR_TIMER_NEXT = 25;
|
|
VAR_SENTENCE_VERB = 26;
|
|
VAR_SENTENCE_OBJECT1 = 27;
|
|
VAR_SENTENCE_OBJECT2 = 28;
|
|
VAR_SENTENCE_PREPOSITION = 29;
|
|
VAR_VIRT_MOUSE_X = 30;
|
|
VAR_VIRT_MOUSE_Y = 31;
|
|
VAR_CLICK_AREA = 32;
|
|
VAR_CLICK_VERB = 33;
|
|
VAR_CLICK_OBJECT = 35;
|
|
VAR_ROOM_RESOURCE = 36;
|
|
VAR_LAST_SOUND = 37;
|
|
VAR_BACKUP_VERB = 38;
|
|
VAR_KEYPRESS = 39;
|
|
VAR_CUTSCENEEXIT_KEY = 40;
|
|
VAR_TALK_ACTOR = 41;
|
|
}
|
|
|
|
void ScummEngine_v5::setupScummVars() {
|
|
// Many vars are the same as in V5 & V6 games, so just call the inherited method first
|
|
ScummEngine::setupScummVars();
|
|
|
|
VAR_CURRENT_LIGHTS = 9;
|
|
|
|
if (_game.version >= 4) {
|
|
VAR_V5_TALK_STRING_Y = 54;
|
|
}
|
|
if ((_game.id == GID_LOOM && _game.version == 4) || _game.version >= 5) {
|
|
VAR_NOSUBTITLES = 60;
|
|
}
|
|
}
|
|
|
|
void ScummEngine_v6::setupScummVars() {
|
|
// Many vars are the same as in V5 & V6 games, so just call the inherited method first
|
|
ScummEngine::setupScummVars();
|
|
|
|
VAR_ROOM_WIDTH = 41;
|
|
VAR_ROOM_HEIGHT = 54;
|
|
|
|
if (_game.heversion >= 60) {
|
|
VAR_NOSUBTITLES = 60;
|
|
} else {
|
|
VAR_VOICE_MODE = 60; // 0 is voice, 1 is voice+text, 2 is text only
|
|
VAR_PRE_SAVELOAD_SCRIPT = 61;
|
|
VAR_POST_SAVELOAD_SCRIPT = 62;
|
|
}
|
|
|
|
VAR_LEFTBTN_HOLD = 74;
|
|
VAR_RIGHTBTN_HOLD = 75;
|
|
|
|
VAR_V6_EMSSPACE = 76;
|
|
VAR_RANDOM_NR = 118;
|
|
|
|
VAR_TIMEDATE_YEAR = 119;
|
|
VAR_TIMEDATE_MONTH = 129;
|
|
VAR_TIMEDATE_DAY = 128;
|
|
VAR_TIMEDATE_HOUR = 125;
|
|
VAR_TIMEDATE_MINUTE = 126;
|
|
|
|
// Sam & Max specific
|
|
if (_game.id == GID_SAMNMAX) {
|
|
VAR_V6_SOUNDMODE = 9;
|
|
VAR_CHARSET_MASK = 123;
|
|
}
|
|
}
|
|
|
|
void ScummEngine_v70he::setupScummVars() {
|
|
ScummEngine_v6::setupScummVars();
|
|
|
|
VAR_CURRENTDRIVE = 0xFF;
|
|
VAR_MUSIC_TIMER = 0xFF;
|
|
|
|
VAR_ERROR_FLAG = 8;
|
|
VAR_NUM_SOUND_CHANNELS = 9;
|
|
VAR_TALK_CHANNEL = 10;
|
|
VAR_SOUND_CHANNEL = 14;
|
|
VAR_EARLY_TALKIE_CALLBACK = 66;
|
|
}
|
|
|
|
#ifdef ENABLE_HE
|
|
void ScummEngine_v72he::setupScummVars() {
|
|
VAR_KEYPRESS = 0;
|
|
VAR_DEBUGMODE = 1;
|
|
VAR_TIMER_NEXT = 2;
|
|
VAR_OVERRIDE = 3;
|
|
VAR_WALKTO_OBJ = 4;
|
|
VAR_RANDOM_NR = 5;
|
|
|
|
VAR_ERROR_FLAG = 8; // Alias of VAR_GAME_LOADED for now, which will get removed later
|
|
VAR_GAME_LOADED = 8;
|
|
VAR_EGO = 9;
|
|
VAR_NUM_ACTOR = 10;
|
|
|
|
VAR_VIRT_MOUSE_X = 13;
|
|
VAR_VIRT_MOUSE_Y = 14;
|
|
VAR_MOUSE_X = 15;
|
|
VAR_MOUSE_Y = 16;
|
|
VAR_LEFTBTN_HOLD = 17;
|
|
VAR_RIGHTBTN_HOLD = 18;
|
|
|
|
VAR_CURSORSTATE = 19;
|
|
VAR_USERPUT = 20;
|
|
VAR_ROOM = 21;
|
|
VAR_ROOM_WIDTH = 22;
|
|
VAR_ROOM_HEIGHT = 23;
|
|
VAR_CAMERA_POS_X = 24;
|
|
VAR_CAMERA_MIN_X = 25;
|
|
VAR_CAMERA_MAX_X = 26;
|
|
VAR_ROOM_RESOURCE = 27;
|
|
VAR_SCROLL_SCRIPT = 28;
|
|
VAR_ENTRY_SCRIPT = 29;
|
|
VAR_ENTRY_SCRIPT2 = 30;
|
|
VAR_EXIT_SCRIPT = 31;
|
|
VAR_EXIT_SCRIPT2 = 32;
|
|
VAR_VERB_SCRIPT = 33;
|
|
VAR_SENTENCE_SCRIPT = 34;
|
|
VAR_INVENTORY_SCRIPT = 35;
|
|
VAR_CUTSCENE_START_SCRIPT = 36;
|
|
VAR_CUTSCENE_END_SCRIPT = 37;
|
|
|
|
VAR_RESTART_KEY = 42;
|
|
VAR_PAUSE_KEY = 43;
|
|
VAR_CUTSCENEEXIT_KEY = 44;
|
|
VAR_TALKSTOP_KEY = 45;
|
|
VAR_HAVE_MSG = 46;
|
|
VAR_SUBTITLES = 47;
|
|
VAR_CHARINC = 48;
|
|
VAR_TALK_ACTOR = 49;
|
|
VAR_LAST_SOUND = 50;
|
|
VAR_TALK_CHANNEL = 51;
|
|
VAR_SOUND_CHANNEL = 52;
|
|
VAR_EARLY_CHAN_0_CALLBACK = 53;
|
|
VAR_EARLY_CHAN_1_CALLBACK = 54;
|
|
VAR_EARLY_TALKIE_CALLBACK = 55;
|
|
VAR_EARLY_CHAN_2_CALLBACK = 55;
|
|
VAR_EARLY_CHAN_3_CALLBACK = 56;
|
|
VAR_MEMORY_PERFORMANCE = 57;
|
|
VAR_VIDEO_PERFORMANCE = 58;
|
|
VAR_NEW_ROOM = 59;
|
|
VAR_TMR_1 = 60;
|
|
VAR_TMR_2 = 61;
|
|
VAR_TMR_3 = 62;
|
|
VAR_TIMEDATE_HOUR = 63;
|
|
VAR_TIMEDATE_MINUTE = 64;
|
|
VAR_TIMEDATE_DAY = 65;
|
|
VAR_TIMEDATE_MONTH = 66;
|
|
VAR_TIMEDATE_YEAR = 67;
|
|
|
|
VAR_NUM_ROOMS = 68;
|
|
VAR_NUM_SCRIPTS = 69;
|
|
VAR_NUM_SOUNDS = 70;
|
|
VAR_NUM_COSTUMES = 71;
|
|
VAR_NUM_IMAGES = 72;
|
|
VAR_NUM_CHARSETS = 73;
|
|
VAR_NUM_GLOBAL_OBJS = 74;
|
|
VAR_MOUSE_STATE = 75;
|
|
VAR_POLYGONS_ONLY = 76;
|
|
|
|
if (_game.heversion <= 74) {
|
|
VAR_SOUND_ENABLED = 54;
|
|
VAR_NUM_SOUND_CHANNELS = 56;
|
|
}
|
|
|
|
if (_game.heversion >= 74) {
|
|
VAR_PLATFORM = 78;
|
|
}
|
|
}
|
|
|
|
void ScummEngine_v80he::setupScummVars() {
|
|
ScummEngine_v72he::setupScummVars();
|
|
|
|
VAR_PLATFORM_VERSION = 79;
|
|
VAR_CURRENT_CHARSET = 80;
|
|
VAR_SOUND_TOKEN_OFFSET = 84;
|
|
VAR_KEY_STATE = 86;
|
|
VAR_SOUND_CALLBACK_SCRIPT = 87;
|
|
VAR_NUM_SOUND_CHANNELS = 88;
|
|
VAR_COLOR_DEPTH = 89;
|
|
VAR_COLOR_BLACK = 93;
|
|
VAR_ALWAYS_REDRAW_ACTORS = 95;
|
|
}
|
|
|
|
void ScummEngine_v90he::setupScummVars() {
|
|
ScummEngine_v80he::setupScummVars();
|
|
|
|
VAR_TIMER = 97;
|
|
VAR_QUIT_SCRIPT = 102;
|
|
VAR_DEFAULT_SCRIPT_PRIORITY = 103;
|
|
VAR_LAST_SCRIPT_PRIORITY = 104;
|
|
|
|
if (_game.heversion >= 95) {
|
|
VAR_NUM_SPRITE_GROUPS = 105;
|
|
VAR_NUM_SPRITES = 106;
|
|
VAR_U32_VERSION = 107;
|
|
VAR_U32_ARRAY_UNK = 116;
|
|
VAR_WIZ_TRANSPARENT_COLOR = 117;
|
|
VAR_OPERATION_FAILURE = 119;
|
|
VAR_START_DYN_SOUND_CHANNELS = 120;
|
|
}
|
|
if (_game.heversion >= 98) {
|
|
VAR_SKIP_RESET_TALK_ACTOR = 125;
|
|
}
|
|
if (_game.heversion >= 99) {
|
|
#ifdef USE_ENET
|
|
if (_game.id == GID_FOOTBALL || _game.id == GID_BASEBALL2001 || _game.id == GID_FOOTBALL2002 ||
|
|
_game.id == GID_MOONBASE) {
|
|
VAR_REMOTE_START_SCRIPT = 98;
|
|
VAR_NETWORK_AVAILABLE = 100;
|
|
VAR_NETWORK_RECEIVE_ARRAY_SCRIPT = 101;
|
|
}
|
|
#endif
|
|
VAR_MAIN_SCRIPT = 127;
|
|
VAR_NUM_PALETTES = 130;
|
|
VAR_NUM_UNK = 131;
|
|
VAR_SPRITE_IMAGE_CHANGE_DOES_NOT_RESET_SETTINGS = 139;
|
|
}
|
|
}
|
|
|
|
void ScummEngine_v100he::setupScummVars() {
|
|
ScummEngine_v90he::setupScummVars();
|
|
|
|
if (_game.id == GID_MOONBASE) {
|
|
VAR_REMOTE_START_SCRIPT = 98;
|
|
VAR_NETWORK_AVAILABLE = 100;
|
|
VAR_NETWORK_RECEIVE_ARRAY_SCRIPT = 101;
|
|
VAR_U32_USER_VAR_A = 108;
|
|
VAR_U32_USER_VAR_B = 109;
|
|
VAR_U32_USER_VAR_C = 110;
|
|
VAR_U32_USER_VAR_D = 111;
|
|
VAR_U32_USER_VAR_E = 112;
|
|
VAR_U32_USER_VAR_F = 113;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef ENABLE_SCUMM_7_8
|
|
void ScummEngine_v7::setupScummVars() {
|
|
VAR_MOUSE_X = 1;
|
|
VAR_MOUSE_Y = 2;
|
|
VAR_VIRT_MOUSE_X = 3;
|
|
VAR_VIRT_MOUSE_Y = 4;
|
|
VAR_ROOM_WIDTH = 5;
|
|
VAR_ROOM_HEIGHT = 6;
|
|
VAR_CAMERA_POS_X = 7;
|
|
VAR_CAMERA_POS_Y = 8;
|
|
VAR_OVERRIDE = 9;
|
|
VAR_ROOM = 10;
|
|
VAR_ROOM_RESOURCE = 11;
|
|
VAR_TALK_ACTOR = 12;
|
|
VAR_HAVE_MSG = 13;
|
|
VAR_TIMER = 14;
|
|
VAR_TIMER_TOTAL = 15;
|
|
|
|
VAR_TIMEDATE_YEAR = 16;
|
|
VAR_TIMEDATE_MONTH = 17;
|
|
VAR_TIMEDATE_DAY = 18;
|
|
VAR_TIMEDATE_HOUR = 19;
|
|
VAR_TIMEDATE_MINUTE = 20;
|
|
VAR_TIMEDATE_SECOND = 21;
|
|
|
|
VAR_LEFTBTN_DOWN = 22;
|
|
VAR_RIGHTBTN_DOWN = 23;
|
|
VAR_LEFTBTN_HOLD = 24;
|
|
VAR_RIGHTBTN_HOLD = 25;
|
|
|
|
VAR_MEMORY_PERFORMANCE = 26;
|
|
VAR_VIDEO_PERFORMANCE = 27;
|
|
VAR_GAME_LOADED = 29;
|
|
VAR_V6_EMSSPACE = 32;
|
|
VAR_VOICE_MODE = 33; // 0 is voice, 1 is voice+text, 2 is text only
|
|
VAR_RANDOM_NR = 34;
|
|
VAR_NEW_ROOM = 35;
|
|
VAR_WALKTO_OBJ = 36;
|
|
|
|
VAR_NUM_GLOBAL_OBJS = 37;
|
|
|
|
VAR_CAMERA_DEST_X = 38;
|
|
VAR_CAMERA_DEST_Y = 39;
|
|
VAR_CAMERA_FOLLOWED_ACTOR = 40;
|
|
|
|
VAR_SCROLL_SCRIPT = 50;
|
|
VAR_ENTRY_SCRIPT = 51;
|
|
VAR_ENTRY_SCRIPT2 = 52;
|
|
VAR_EXIT_SCRIPT = 53;
|
|
VAR_EXIT_SCRIPT2 = 54;
|
|
VAR_VERB_SCRIPT = 55;
|
|
VAR_SENTENCE_SCRIPT = 56;
|
|
VAR_INVENTORY_SCRIPT = 57;
|
|
VAR_CUTSCENE_START_SCRIPT = 58;
|
|
VAR_CUTSCENE_END_SCRIPT = 59;
|
|
VAR_PRE_SAVELOAD_SCRIPT = 60;
|
|
VAR_POST_SAVELOAD_SCRIPT = 61;
|
|
|
|
VAR_CUTSCENEEXIT_KEY = 62;
|
|
VAR_RESTART_KEY = 63;
|
|
VAR_PAUSE_KEY = 64;
|
|
VAR_MAINMENU_KEY = 65;
|
|
VAR_VERSION_KEY = 66;
|
|
VAR_TALKSTOP_KEY = 67;
|
|
VAR_KEYPRESS = 118;
|
|
|
|
VAR_TIMER_NEXT = 97;
|
|
VAR_TMR_1 = 98;
|
|
VAR_TMR_2 = 99;
|
|
VAR_TMR_3 = 100;
|
|
|
|
VAR_CAMERA_MIN_X = 101;
|
|
VAR_CAMERA_MAX_X = 102;
|
|
VAR_CAMERA_MIN_Y = 103;
|
|
VAR_CAMERA_MAX_Y = 104;
|
|
VAR_CAMERA_THRESHOLD_X = 105;
|
|
VAR_CAMERA_THRESHOLD_Y = 106;
|
|
VAR_CAMERA_SPEED_X = 107;
|
|
VAR_CAMERA_SPEED_Y = 108;
|
|
VAR_CAMERA_ACCEL_X = 109;
|
|
VAR_CAMERA_ACCEL_Y = 110;
|
|
|
|
VAR_EGO = 111;
|
|
|
|
VAR_CURSORSTATE = 112;
|
|
VAR_USERPUT = 113;
|
|
VAR_DEFAULT_TALK_DELAY = 114;
|
|
VAR_CHARINC = 115;
|
|
VAR_DEBUGMODE = 116;
|
|
VAR_FADE_DELAY = 117;
|
|
|
|
// Full Throttle specific
|
|
if (_game.id == GID_FT) {
|
|
VAR_CHARSET_MASK = 119;
|
|
}
|
|
|
|
VAR_VIDEONAME = 123;
|
|
|
|
VAR_STRING2DRAW = 130;
|
|
VAR_CUSTOMSCALETABLE = 131;
|
|
|
|
VAR_BLAST_ABOVE_TEXT = 133;
|
|
|
|
VAR_MUSIC_BUNDLE_LOADED = 135;
|
|
VAR_VOICE_BUNDLE_LOADED = 136;
|
|
|
|
}
|
|
|
|
void ScummEngine_v8::setupScummVars() {
|
|
VAR_ROOM_WIDTH = 1;
|
|
VAR_ROOM_HEIGHT = 2;
|
|
|
|
VAR_MOUSE_X = 3;
|
|
VAR_MOUSE_Y = 4;
|
|
VAR_VIRT_MOUSE_X = 5;
|
|
VAR_VIRT_MOUSE_Y = 6;
|
|
|
|
VAR_CURSORSTATE = 7;
|
|
VAR_USERPUT = 8;
|
|
|
|
VAR_CAMERA_POS_X = 9;
|
|
VAR_CAMERA_POS_Y = 10;
|
|
VAR_CAMERA_DEST_X = 11;
|
|
VAR_CAMERA_DEST_Y = 12;
|
|
VAR_CAMERA_FOLLOWED_ACTOR = 13;
|
|
|
|
VAR_TALK_ACTOR = 14;
|
|
VAR_HAVE_MSG = 15;
|
|
|
|
VAR_LEFTBTN_DOWN = 16;
|
|
VAR_RIGHTBTN_DOWN = 17;
|
|
VAR_LEFTBTN_HOLD = 18;
|
|
VAR_RIGHTBTN_HOLD = 19;
|
|
|
|
VAR_TIMEDATE_YEAR = 24;
|
|
VAR_TIMEDATE_MONTH = 25;
|
|
VAR_TIMEDATE_DAY = 26;
|
|
VAR_TIMEDATE_HOUR = 27;
|
|
VAR_TIMEDATE_MINUTE = 28;
|
|
VAR_TIMEDATE_SECOND = 29;
|
|
|
|
VAR_OVERRIDE = 30;
|
|
VAR_ROOM = 31;
|
|
VAR_NEW_ROOM = 32;
|
|
VAR_WALKTO_OBJ = 33;
|
|
VAR_TIMER = 34;
|
|
|
|
VAR_VOICE_MODE = 39; // 0 is voice, 1 is voice+text, 2 is text only
|
|
VAR_GAME_LOADED = 40;
|
|
VAR_LANGUAGE = 41;
|
|
|
|
VAR_CURRENTDISK = 42;
|
|
VAR_MUSIC_BUNDLE_LOADED = 45;
|
|
VAR_VOICE_BUNDLE_LOADED = 46;
|
|
|
|
VAR_SCROLL_SCRIPT = 50;
|
|
VAR_ENTRY_SCRIPT = 51;
|
|
VAR_ENTRY_SCRIPT2 = 52;
|
|
VAR_EXIT_SCRIPT = 53;
|
|
VAR_EXIT_SCRIPT2 = 54;
|
|
VAR_VERB_SCRIPT = 55;
|
|
VAR_SENTENCE_SCRIPT = 56;
|
|
VAR_INVENTORY_SCRIPT = 57;
|
|
VAR_CUTSCENE_START_SCRIPT = 58;
|
|
VAR_CUTSCENE_END_SCRIPT = 59;
|
|
|
|
VAR_CUTSCENEEXIT_KEY = 62;
|
|
|
|
VAR_PAUSE_KEY = 64;
|
|
VAR_MAINMENU_KEY = 65;
|
|
VAR_VERSION_KEY = 66;
|
|
VAR_TALKSTOP_KEY = 67;
|
|
|
|
VAR_CUSTOMSCALETABLE = 111;
|
|
|
|
VAR_TIMER_NEXT = 112;
|
|
VAR_TMR_1 = 113;
|
|
VAR_TMR_2 = 114;
|
|
VAR_TMR_3 = 115;
|
|
|
|
VAR_CAMERA_MIN_X = 116;
|
|
VAR_CAMERA_MAX_X = 117;
|
|
VAR_CAMERA_MIN_Y = 118;
|
|
VAR_CAMERA_MAX_Y = 119;
|
|
VAR_CAMERA_SPEED_X = 120;
|
|
VAR_CAMERA_SPEED_Y = 121;
|
|
VAR_CAMERA_ACCEL_X = 122;
|
|
VAR_CAMERA_ACCEL_Y = 123;
|
|
VAR_CAMERA_THRESHOLD_X = 124;
|
|
VAR_CAMERA_THRESHOLD_Y = 125;
|
|
|
|
VAR_EGO = 126;
|
|
|
|
VAR_DEFAULT_TALK_DELAY = 128;
|
|
VAR_CHARINC = 129;
|
|
|
|
VAR_DEBUGMODE = 130;
|
|
VAR_KEYPRESS = 132;
|
|
VAR_BLAST_ABOVE_TEXT = 133;
|
|
VAR_SYNC = 134;
|
|
|
|
VAR_SAVELOAD_PAGE = 175;
|
|
VAR_OBJECT_LABEL_FLAG = 176;
|
|
}
|
|
#endif
|
|
|
|
void ScummEngine_v0::resetScummVars() {
|
|
resetSentence();
|
|
|
|
VAR(VAR_EGO) = 3;
|
|
|
|
// Setup light
|
|
_currentLights = LIGHTMODE_actor_use_base_palette | LIGHTMODE_actor_use_colors | LIGHTMODE_room_lights_on;
|
|
}
|
|
|
|
void ScummEngine_v2::resetScummVars() {
|
|
// This needs to be at least greater than 40 to get the more
|
|
// elaborate version of the EGA Zak into. I don't know where
|
|
// else it makes any difference.
|
|
if (_game.id == GID_ZAK)
|
|
VAR(VAR_MACHINE_SPEED) = 0x7FFF;
|
|
}
|
|
|
|
void ScummEngine_v5::resetScummVars() {
|
|
ScummEngine::resetScummVars();
|
|
|
|
if (_game.version >= 4 && _game.version <= 5)
|
|
VAR(VAR_V5_TALK_STRING_Y) = -0x50;
|
|
|
|
// Setup light
|
|
VAR(VAR_CURRENT_LIGHTS) = LIGHTMODE_actor_use_base_palette | LIGHTMODE_actor_use_colors | LIGHTMODE_room_lights_on;
|
|
|
|
if (_game.id == GID_MONKEY)
|
|
_scummVars[74] = 1225;
|
|
}
|
|
|
|
#ifdef ENABLE_SCUMM_7_8
|
|
void ScummEngine_v7::resetScummVars() {
|
|
ScummEngine::resetScummVars();
|
|
|
|
if (_game.version != 8) {
|
|
VAR(VAR_V6_EMSSPACE) = 10000;
|
|
VAR(VAR_NUM_GLOBAL_OBJS) = _numGlobalObjects - 1;
|
|
}
|
|
|
|
VAR(VAR_DEFAULT_TALK_DELAY) = 60;
|
|
}
|
|
|
|
void ScummEngine_v8::resetScummVars() {
|
|
ScummEngine_v7::resetScummVars();
|
|
|
|
// FIXME: How do we deal with non-cd installs?
|
|
VAR(VAR_CURRENTDISK) = 1;
|
|
|
|
switch (_language) {
|
|
case Common::EN_ANY:
|
|
case Common::EN_USA:
|
|
case Common::EN_GRB:
|
|
VAR(VAR_LANGUAGE) = 0;
|
|
break;
|
|
case Common::DE_DEU:
|
|
VAR(VAR_LANGUAGE) = 1;
|
|
break;
|
|
case Common::FR_FRA:
|
|
VAR(VAR_LANGUAGE) = 2;
|
|
break;
|
|
case Common::IT_ITA:
|
|
VAR(VAR_LANGUAGE) = 3;
|
|
break;
|
|
case Common::PT_BRA:
|
|
VAR(VAR_LANGUAGE) = 4;
|
|
break;
|
|
case Common::ES_ESP:
|
|
VAR(VAR_LANGUAGE) = 5;
|
|
break;
|
|
case Common::JA_JPN:
|
|
VAR(VAR_LANGUAGE) = 6;
|
|
break;
|
|
case Common::ZH_TWN:
|
|
VAR(VAR_LANGUAGE) = 7;
|
|
break;
|
|
case Common::KO_KOR:
|
|
VAR(VAR_LANGUAGE) = 8;
|
|
break;
|
|
default:
|
|
VAR(VAR_LANGUAGE) = 0; // Default to english
|
|
}
|
|
}
|
|
#endif
|
|
|
|
void ScummEngine_v70he::resetScummVars() {
|
|
ScummEngine::resetScummVars();
|
|
|
|
if (VAR_MACHINE_SPEED != 0xFF)
|
|
VAR(VAR_MACHINE_SPEED) = 13;
|
|
|
|
VAR(VAR_NUM_SOUND_CHANNELS) = 8;
|
|
VAR(VAR_SOUND_CHANNEL) = 1;
|
|
VAR(VAR_TALK_CHANNEL) = 2;
|
|
}
|
|
|
|
#ifdef ENABLE_HE
|
|
void ScummEngine_v72he::resetScummVars() {
|
|
ScummEngine_v70he::resetScummVars();
|
|
|
|
VAR(VAR_VIDEO_PERFORMANCE) = 26;
|
|
|
|
VAR(VAR_NUM_ROOMS) = _numRooms - 1;
|
|
VAR(VAR_NUM_SCRIPTS) = _numScripts - 1;
|
|
VAR(VAR_NUM_SOUNDS) = _numSounds - 1;
|
|
VAR(VAR_NUM_COSTUMES) = _numCostumes - 1;
|
|
VAR(VAR_NUM_IMAGES) = _numImages - 1;
|
|
VAR(VAR_NUM_CHARSETS) = _numCharsets - 1;
|
|
VAR(VAR_NUM_GLOBAL_OBJS) = _numGlobalObjects - 1;
|
|
|
|
if (_game.heversion <= 74) {
|
|
// Songs are disabled, if sound is disabled.
|
|
VAR(VAR_SOUND_ENABLED) = 1;
|
|
}
|
|
|
|
if (_game.heversion == 74) {
|
|
// Uses different values, compared to later HE80+ games.
|
|
if (_game.platform == Common::kPlatformMacintosh) {
|
|
VAR(VAR_PLATFORM) = 3;
|
|
} else {
|
|
VAR(VAR_PLATFORM) = 2;
|
|
}
|
|
}
|
|
}
|
|
|
|
void ScummEngine_v80he::resetScummVars() {
|
|
ScummEngine_v72he::resetScummVars();
|
|
|
|
if (_game.platform == Common::kPlatformMacintosh) {
|
|
VAR(VAR_PLATFORM) = 2;
|
|
VAR(VAR_PLATFORM_VERSION) = 70;
|
|
} else {
|
|
VAR(VAR_PLATFORM) = 1;
|
|
VAR(VAR_PLATFORM_VERSION) = 40; // 31 is Windows 3.1, 40 is Windows 95+
|
|
}
|
|
VAR(VAR_COLOR_DEPTH) = 256;
|
|
}
|
|
|
|
void ScummEngine_v90he::resetScummVars() {
|
|
ScummEngine_v80he::resetScummVars();
|
|
|
|
VAR(VAR_DEFAULT_SCRIPT_PRIORITY) = 1;
|
|
VAR(VAR_LAST_SCRIPT_PRIORITY) = 1;
|
|
|
|
if (_game.heversion >= 95) {
|
|
VAR(VAR_NUM_SPRITE_GROUPS) = MAX(64, _numSprites / 4) - 1;
|
|
VAR(VAR_NUM_SPRITES) = _numSprites - 1;
|
|
VAR(VAR_WIZ_TRANSPARENT_COLOR) = 5;
|
|
VAR(VAR_START_DYN_SOUND_CHANNELS) = 9;
|
|
}
|
|
if (_game.heversion >= 98) {
|
|
VAR(VAR_U32_VERSION) = _logicHE->versionID();
|
|
VAR(VAR_U32_ARRAY_UNK) = 0;
|
|
}
|
|
}
|
|
|
|
void ScummEngine_v99he::resetScummVars() {
|
|
ScummEngine_v90he::resetScummVars();
|
|
|
|
VAR(VAR_NUM_PALETTES) = _numPalettes;
|
|
VAR(VAR_NUM_UNK) = _numUnk;
|
|
|
|
if (_game.heversion >= 100 && (_game.features & GF_16BIT_COLOR)) {
|
|
// Enable Bink video in 16bit color games
|
|
#ifdef USE_BINK
|
|
VAR(140) = 1;
|
|
#else
|
|
VAR(140) = 0;
|
|
#endif
|
|
}
|
|
|
|
if (_game.id == GID_PUTTZOO && _game.heversion == 100 && _game.platform == Common::kPlatformWindows) {
|
|
// Specific to Nimbus Games version.
|
|
VAR(156) = 1;
|
|
VAR(157) = 0;
|
|
}
|
|
}
|
|
|
|
void ScummEngine_v100he::resetScummVars() {
|
|
ScummEngine_v99he::resetScummVars();
|
|
|
|
if (_game.id == GID_MOONBASE) {
|
|
#ifdef USE_LIBCURL
|
|
VAR(VAR_NETWORK_AVAILABLE) = 1;
|
|
#else
|
|
VAR(VAR_NETWORK_AVAILABLE) = 0;
|
|
#endif
|
|
}
|
|
}
|
|
#endif
|
|
|
|
void ScummEngine::resetScummVars() {
|
|
if (_game.heversion < 70 && _game.version <= 6) {
|
|
setSoundCardVarToCurrentConfig();
|
|
setVideoModeVarToCurrentConfig();
|
|
|
|
if (_game.platform == Common::kPlatformMacintosh && (_game.features & GF_OLD_BUNDLE)) {
|
|
// Set screen size for the Macintosh version of Indy3/Loom
|
|
VAR(39) = 320;
|
|
}
|
|
if (_game.platform == Common::kPlatformDOS && _game.id == GID_LOOM && _game.version == 3) {
|
|
// Set number of sound resources
|
|
VAR(39) = 80;
|
|
}
|
|
|
|
if (_game.id == GID_LOOM || _game.version >= 4)
|
|
VAR(VAR_HEAPSPACE) = 1400;
|
|
if (_game.version >= 4)
|
|
VAR(VAR_FIXEDDISK) = 1;
|
|
if (_game.version >= 5)
|
|
VAR(VAR_INPUTMODE) = 3;
|
|
if (_game.version == 6)
|
|
VAR(VAR_V6_EMSSPACE) = 10000;
|
|
|
|
if (_game.heversion >= 60) {
|
|
// Set fast speed, to enable all animations
|
|
VAR(VAR_MACHINE_SPEED) = 2;
|
|
|
|
VAR(VAR_SOUNDPARAM) = 1; // Soundblaster for music
|
|
VAR(VAR_SOUNDPARAM2) = 1; // Soundblaster for sound effects
|
|
}
|
|
}
|
|
|
|
if (VAR_ROOM_WIDTH != 0xFF && VAR_ROOM_HEIGHT != 0xFF) {
|
|
VAR(VAR_ROOM_WIDTH) = _screenWidth;
|
|
VAR(VAR_ROOM_HEIGHT) = _screenHeight;
|
|
}
|
|
|
|
if (VAR_DEBUGMODE != 0xFF) {
|
|
VAR(VAR_DEBUGMODE) = (_debugMode ? 1 : 0);
|
|
if (_game.heversion >= 80 && _debugMode)
|
|
VAR(85) = 1;
|
|
}
|
|
|
|
if (VAR_FADE_DELAY != 0xFF)
|
|
VAR(VAR_FADE_DELAY) = 3;
|
|
|
|
VAR(VAR_CHARINC) = 4;
|
|
setTalkingActor(0);
|
|
}
|
|
|
|
void ScummEngine::setVideoModeVarToCurrentConfig() {
|
|
if (VAR_VIDEOMODE == 0xFF)
|
|
return;
|
|
|
|
if (_game.platform == Common::kPlatformFMTowns)
|
|
VAR(VAR_VIDEOMODE) = 42;
|
|
// Value only used by the Macintosh version of Indiana Jones and the Last Crusade
|
|
else if (_game.platform == Common::kPlatformMacintosh && _game.version == 3)
|
|
VAR(VAR_VIDEOMODE) = 50;
|
|
// Value only used by the Amiga version of Monkey Island 2
|
|
else if (_game.platform == Common::kPlatformAmiga)
|
|
VAR(VAR_VIDEOMODE) = 82;
|
|
else if (_renderMode == Common::kRenderCGA || _renderMode == Common::kRenderCGAComp)
|
|
VAR(VAR_VIDEOMODE) = 4;
|
|
else if (_renderMode == Common::kRenderCGA_BW)
|
|
VAR(VAR_VIDEOMODE) = 6;
|
|
else if (_renderMode == Common::kRenderHercA || _renderMode == Common::kRenderHercG)
|
|
VAR(VAR_VIDEOMODE) = 30;
|
|
else if (_renderMode == Common::kRenderEGA)
|
|
VAR(VAR_VIDEOMODE) = 13;
|
|
else
|
|
VAR(VAR_VIDEOMODE) = 19;
|
|
}
|
|
|
|
void ScummEngine::setSoundCardVarToCurrentConfig() {
|
|
if (VAR_SOUNDCARD == 0xFF)
|
|
return;
|
|
|
|
// VAR_SOUNDCARD modes
|
|
// 0 PC Speaker
|
|
// 1 Tandy
|
|
// 2 CMS
|
|
// 3 AdLib
|
|
// 4 Roland
|
|
switch (_sound->_musicType) {
|
|
case MDT_MACINTOSH:
|
|
if (_game.id == GID_INDY3)
|
|
VAR(VAR_SOUNDCARD) = (ConfMan.hasKey("mac_v3_low_quality_music") && ConfMan.getBool("mac_v3_low_quality_music")) ? 10 : 11;
|
|
else if (_game.id == GID_LOOM)
|
|
VAR(VAR_SOUNDCARD) = (ConfMan.hasKey("mac_snd_quality") && ConfMan.getInt("mac_snd_quality") > 0 && ConfMan.getInt("mac_snd_quality") < 4) ? 10 : 11;
|
|
else if (_game.id == GID_MONKEY)
|
|
VAR(VAR_SOUNDCARD) = 0xffff;
|
|
else
|
|
VAR(VAR_SOUNDCARD) = 3;
|
|
break;
|
|
case MDT_NONE:
|
|
case MDT_PCSPK:
|
|
VAR(VAR_SOUNDCARD) = 0;
|
|
break;
|
|
case MDT_PCJR:
|
|
VAR(VAR_SOUNDCARD) = 1;
|
|
break;
|
|
case MDT_CMS:
|
|
VAR(VAR_SOUNDCARD) = 2;
|
|
break;
|
|
case MDT_ADLIB:
|
|
VAR(VAR_SOUNDCARD) = 3;
|
|
break;
|
|
default:
|
|
if ((_game.id == GID_MONKEY_EGA || _game.id == GID_MONKEY_VGA || (_game.id == GID_LOOM && _game.version == 3))
|
|
&& (_game.platform == Common::kPlatformDOS)) {
|
|
VAR(VAR_SOUNDCARD) = 4;
|
|
} else {
|
|
VAR(VAR_SOUNDCARD) = 3;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
} // End of namespace Scumm
|