diff options
-rw-r--r-- | engines/scumm/camera.cpp | 12 | ||||
-rw-r--r-- | engines/scumm/costume.cpp | 10 | ||||
-rw-r--r-- | engines/scumm/gfx.cpp | 11 | ||||
-rw-r--r-- | engines/scumm/intern.h | 2 | ||||
-rw-r--r-- | engines/scumm/room.cpp | 6 | ||||
-rw-r--r-- | engines/scumm/script_c64.cpp | 43 | ||||
-rw-r--r-- | engines/scumm/scumm.cpp | 11 | ||||
-rw-r--r-- | engines/scumm/scumm.h | 3 | ||||
-rw-r--r-- | engines/scumm/vars.cpp | 16 |
9 files changed, 79 insertions, 35 deletions
diff --git a/engines/scumm/camera.cpp b/engines/scumm/camera.cpp index 70781063dd..8521bd96a2 100644 --- a/engines/scumm/camera.cpp +++ b/engines/scumm/camera.cpp @@ -43,10 +43,10 @@ void ScummEngine::setCameraAt(int pos_x, int pos_y) { } camera._dest.x = pos_x; - if (camera._cur.x < VAR(VAR_CAMERA_MIN_X)) + if (VAR_CAMERA_MIN_X != 0xFF && camera._cur.x < VAR(VAR_CAMERA_MIN_X)) camera._cur.x = (short) VAR(VAR_CAMERA_MIN_X); - if (camera._cur.x > VAR(VAR_CAMERA_MAX_X)) + if (VAR_CAMERA_MAX_X != 0xFF && camera._cur.x > VAR(VAR_CAMERA_MAX_X)) camera._cur.x = (short) VAR(VAR_CAMERA_MAX_X); if (VAR_SCROLL_SCRIPT != 0xFF && VAR(VAR_SCROLL_SCRIPT)) { @@ -106,7 +106,7 @@ void ScummEngine::moveCamera() { camera._cur.x &= 0xFFF8; - if (camera._cur.x < VAR(VAR_CAMERA_MIN_X)) { + if (VAR_CAMERA_MIN_X != 0xFF && camera._cur.x < VAR(VAR_CAMERA_MIN_X)) { if (VAR_CAMERA_FAST_X != 0xFF && VAR(VAR_CAMERA_FAST_X)) camera._cur.x = (short) VAR(VAR_CAMERA_MIN_X); else @@ -115,7 +115,7 @@ void ScummEngine::moveCamera() { return; } - if (camera._cur.x > VAR(VAR_CAMERA_MAX_X)) { + if (VAR_CAMERA_MAX_X != 0xFF && camera._cur.x > VAR(VAR_CAMERA_MAX_X)) { if (VAR_CAMERA_FAST_X != 0xFF && VAR(VAR_CAMERA_FAST_X)) camera._cur.x = (short) VAR(VAR_CAMERA_MAX_X); else @@ -146,10 +146,10 @@ void ScummEngine::moveCamera() { camera._dest.x = a->_pos.x; } - if (camera._dest.x < VAR(VAR_CAMERA_MIN_X)) + if (VAR_CAMERA_MIN_X != 0xFF && camera._dest.x < VAR(VAR_CAMERA_MIN_X)) camera._dest.x = (short) VAR(VAR_CAMERA_MIN_X); - if (camera._dest.x > VAR(VAR_CAMERA_MAX_X)) + if (VAR_CAMERA_MAX_X != 0xFF && camera._dest.x > VAR(VAR_CAMERA_MAX_X)) camera._dest.x = (short) VAR(VAR_CAMERA_MAX_X); if (VAR_CAMERA_FAST_X != 0xFF && VAR(VAR_CAMERA_FAST_X)) { diff --git a/engines/scumm/costume.cpp b/engines/scumm/costume.cpp index 3b893bde15..95bd0b598d 100644 --- a/engines/scumm/costume.cpp +++ b/engines/scumm/costume.cpp @@ -354,7 +354,7 @@ void ClassicCostumeRenderer::procC64(Codec1 &v1, int actor) { // Set up the palette data byte palette[4] = { 0, 0, 0, 0 }; - if (!(_vm->VAR(_vm->VAR_CURRENT_LIGHTS) & LIGHTMODE_actor_color)) { + if (!(_vm->getCurrentLights() & LIGHTMODE_actor_color)) { palette[2] = 11; palette[3] = 11; } else if (_vm->_game.id == GID_MANIAC) { @@ -614,7 +614,7 @@ byte NESCostumeRenderer::drawLimb(const Actor *a, int limb) { if (cost.curpos[limb] == 0xFFFF) return 0; - if (_vm->VAR(_vm->VAR_CURRENT_LIGHTS) & LIGHTMODE_actor_base) + if (_vm->getCurrentLights() & LIGHTMODE_actor_base) palette = _vm->_NESPalette[1]; else palette = darkpalette; @@ -837,7 +837,7 @@ void ClassicCostumeRenderer::setPalette(byte *palette) { if (_loaded._format == 0x57) { memcpy(_palette, palette, 13); } else if (_vm->_game.features & GF_OLD_BUNDLE) { - if ((_vm->VAR(_vm->VAR_CURRENT_LIGHTS) & LIGHTMODE_actor_color)) { + if ((_vm->getCurrentLights() & LIGHTMODE_actor_color)) { memcpy(_palette, palette, 16); } else { memset(_palette, 8, 16); @@ -845,7 +845,7 @@ void ClassicCostumeRenderer::setPalette(byte *palette) { } _palette[_loaded._palette[0]] = _palette[0]; } else { - if ((_vm->VAR_CURRENT_LIGHTS == 0xFF) || (_vm->VAR(_vm->VAR_CURRENT_LIGHTS) & LIGHTMODE_actor_color)) { + if (_vm->_game.version >= 6 || (_vm->getCurrentLights() & LIGHTMODE_actor_color)) { for (i = 0; i < _loaded._numColors; i++) { color = palette[i]; if (color == 255) @@ -1019,7 +1019,7 @@ byte C64CostumeRenderer::drawLimb(const Actor *a, int limb) { // Set up the palette data byte palette[4] = { 0, 0, 0, 0 }; - if (!(_vm->VAR(_vm->VAR_CURRENT_LIGHTS) & LIGHTMODE_actor_color)) { + if (!(_vm->getCurrentLights() & LIGHTMODE_actor_color)) { palette[2] = 11; palette[3] = 11; } else { diff --git a/engines/scumm/gfx.cpp b/engines/scumm/gfx.cpp index 5811ff6bed..e4ac7ff1a1 100644 --- a/engines/scumm/gfx.cpp +++ b/engines/scumm/gfx.cpp @@ -1170,8 +1170,17 @@ void ScummEngine::drawFlashlight() { _flashlight.isDrawn = true; } +// C64 Maniac doesn't have a ScummVar for VAR_CURRENT_LIGHTS, and just uses +// an internal variable. Emulate this to prevent overwriting script vars... +int ScummEngine::getCurrentLights() const { + if (_game.id == GID_MANIAC && _game.platform == Common::kPlatformC64) + return _currentLights; + else + return VAR(VAR_CURRENT_LIGHTS); +} + bool ScummEngine::isLightOn() const { - return (VAR_CURRENT_LIGHTS == 0xFF) || (VAR(VAR_CURRENT_LIGHTS) & LIGHTMODE_screen); + return (VAR_CURRENT_LIGHTS == 0xFF) || (getCurrentLights() & LIGHTMODE_screen); } void ScummEngine::setShake(int mode) { diff --git a/engines/scumm/intern.h b/engines/scumm/intern.h index e24ee432b5..b8a9926702 100644 --- a/engines/scumm/intern.h +++ b/engines/scumm/intern.h @@ -469,6 +469,8 @@ protected: void o_print_c64(); void o_unlockRoom(); void o_unlockSound(); + void o_cutscene(); + void o_endCutscene(); void o_beginOverride(); void o_isEqual(); void o_isGreater(); diff --git a/engines/scumm/room.cpp b/engines/scumm/room.cpp index 3468b19875..b2df1e993d 100644 --- a/engines/scumm/room.cpp +++ b/engines/scumm/room.cpp @@ -156,8 +156,10 @@ void ScummEngine::startScene(int room, Actor *a, int objectNr) { VAR(VAR_ROOM_HEIGHT) = _roomHeight; } - VAR(VAR_CAMERA_MIN_X) = _screenWidth / 2; - VAR(VAR_CAMERA_MAX_X) = _roomWidth - (_screenWidth / 2); + if (VAR_CAMERA_MIN_X != 0xFF) + VAR(VAR_CAMERA_MIN_X) = _screenWidth / 2; + if (VAR_CAMERA_MAX_X != 0xFF) + VAR(VAR_CAMERA_MAX_X) = _roomWidth - (_screenWidth / 2); if (_game.features & GF_NEW_CAMERA) { VAR(VAR_CAMERA_MIN_Y) = _screenHeight / 2; diff --git a/engines/scumm/script_c64.cpp b/engines/scumm/script_c64.cpp index eee67df259..3c0462e179 100644 --- a/engines/scumm/script_c64.cpp +++ b/engines/scumm/script_c64.cpp @@ -116,7 +116,7 @@ void ScummEngine_c64::setupOpcodes() { OPCODE(o2_walkActorTo), OPCODE(o2_ifState02), /* 40 */ - OPCODE(o2_cutscene), + OPCODE(o_cutscene), OPCODE(o2_putActor), OPCODE(o2_startScript), OPCODE(o_doSentence), @@ -276,7 +276,7 @@ void ScummEngine_c64::setupOpcodes() { OPCODE(o2_walkActorTo), OPCODE(o2_ifNotState02), /* C0 */ - OPCODE(o2_endCutscene), + OPCODE(o_endCutscene), OPCODE(o2_putActor), OPCODE(o2_startScript), OPCODE(o_doSentence), @@ -699,11 +699,11 @@ void ScummEngine_c64::o_lights() { // 1 Flashlight // 2 Lighted area if (a == 2) - VAR(VAR_CURRENT_LIGHTS) = 11; + _currentLights = 11; else if (a == 1) - VAR(VAR_CURRENT_LIGHTS) = 4; + _currentLights = 4; else - VAR(VAR_CURRENT_LIGHTS) = 0; + _currentLights = 0; _fullRedraw = true; } @@ -886,6 +886,39 @@ void ScummEngine_c64::o_getClosestObjActor() { setResult(closest_obj); } +void ScummEngine_c64::o_cutscene() { + vm.cutSceneData[0] = _userState | (_userPut ? 16 : 0); + vm.cutSceneData[2] = _currentRoom; + vm.cutSceneData[3] = camera._mode; + + // Hide inventory, freeze scripts, hide cursor + setUserState(15); + + _sentenceNum = 0; + stopScript(SENTENCE_SCRIPT); + resetSentence(); + + vm.cutScenePtr[0] = 0; +} + +void ScummEngine_c64::o_endCutscene() { + vm.cutSceneStackPointer = 0; + + VAR(VAR_OVERRIDE) = 0; + vm.cutSceneScript[0] = 0; + vm.cutScenePtr[0] = 0; + + // Reset user state to values before cutscene + setUserState(vm.cutSceneData[0] | 7); + + camera._mode = (byte) vm.cutSceneData[3]; + if (camera._mode == kFollowActorCameraMode) { + actorFollowCamera(VAR(VAR_EGO)); + } else if (vm.cutSceneData[2] != _currentRoom) { + startScene(vm.cutSceneData[2], 0, 0); + } +} + void ScummEngine_c64::o_beginOverride() { const int idx = vm.cutSceneStackPointer; assert(0 <= idx && idx < 5); diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp index 58b9c97dd7..65a60d1686 100644 --- a/engines/scumm/scumm.cpp +++ b/engines/scumm/scumm.cpp @@ -636,6 +636,7 @@ ScummEngine::ScummEngine(GameDetector *detector, OSystem *syst, const ScummGameS _scrollBuffer = NULL; _doEffect = false; + _currentLights = 0; memset(&_flashlight, 0, sizeof(_flashlight)); _bompActorPalettePtr = NULL; _shakeEnabled = false; @@ -1454,7 +1455,7 @@ void ScummEngine::scummInit() { virtscr[0].xstart = 0; - if (VAR_CURRENT_LIGHTS != 0xFF) { + if (_game.version <= 5) { // Setup light _flashlight.xStrips = 7; _flashlight.yStrips = 7; @@ -2059,9 +2060,9 @@ load_game: setActorRedrawFlags(); resetActorBgs(); - if (VAR_CURRENT_LIGHTS != 0xFF && - !(VAR(VAR_CURRENT_LIGHTS) & LIGHTMODE_screen) && - VAR(VAR_CURRENT_LIGHTS) & LIGHTMODE_flashlight) { + if (_game.version <= 5 && + !(getCurrentLights() & LIGHTMODE_screen) && + getCurrentLights() & LIGHTMODE_flashlight) { drawFlashlight(); setActorRedrawFlags(); } @@ -2128,7 +2129,7 @@ load_game: if (VAR_TIMER != 0xFF) VAR(VAR_TIMER) = 0; - return VAR(VAR_TIMER_NEXT); + return (VAR_TIMER_NEXT != 0xFF) ? VAR(VAR_TIMER_NEXT) : 4; } diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h index b59a3f4bef..c2d1e4aee0 100644 --- a/engines/scumm/scumm.h +++ b/engines/scumm/scumm.h @@ -1007,6 +1007,9 @@ protected: public: bool isLightOn() const; + byte _currentLights; + int getCurrentLights() const; + protected: void initScreens(int b, int h); void initVirtScreen(VirtScreenNumber slot, int top, int width, int height, bool twobufs, bool scrollable); diff --git a/engines/scumm/vars.cpp b/engines/scumm/vars.cpp index 06cea57028..3c4de18390 100644 --- a/engines/scumm/vars.cpp +++ b/engines/scumm/vars.cpp @@ -118,13 +118,6 @@ void ScummEngine_c64::setupScummVars() { //VAR_IS_SOUND_RUNNING = 8; //VAR_ACTIVE_VERB = 9; VAR_CHARCOUNT = 10; - - // FIXME: Should be removed - VAR_CURRENT_LIGHTS = 256; - VAR_CURSORSTATE = 257; - VAR_CAMERA_MIN_X = 258; - VAR_CAMERA_MAX_X = 259; - VAR_TIMER_NEXT = 260; } void ScummEngine_v2::setupScummVars() { @@ -551,6 +544,9 @@ void ScummEngine_c64::initScummVars() { _activeVerb = 13; VAR(VAR_EGO) = 3; + + // Setup light + _currentLights = LIGHTMODE_actor_base | LIGHTMODE_actor_color | LIGHTMODE_screen; } void ScummEngine_v2::initScummVars() { @@ -567,10 +563,8 @@ void ScummEngine_v5::initScummVars() { if (_game.version >= 4 && _game.version <= 5) VAR(VAR_V5_TALK_STRING_Y) = -0x50; - if (VAR_CURRENT_LIGHTS != 0xFF) { - // Setup light - VAR(VAR_CURRENT_LIGHTS) = LIGHTMODE_actor_base | LIGHTMODE_actor_color | LIGHTMODE_screen; - } + // Setup light + VAR(VAR_CURRENT_LIGHTS) = LIGHTMODE_actor_base | LIGHTMODE_actor_color | LIGHTMODE_screen; if (_game.id == GID_MONKEY) _scummVars[74] = 1225; |