aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTravis Howell2006-03-14 12:06:37 +0000
committerTravis Howell2006-03-14 12:06:37 +0000
commitbe7a28f65e35b8e8a7c8e60c9b0bcb1923a3d942 (patch)
treed5d6a02759ddcb0e4b4cbfefefb0ef90eeb98385
parent806ee522d12af62720d1870528b28293934a113a (diff)
downloadscummvm-rg350-be7a28f65e35b8e8a7c8e60c9b0bcb1923a3d942.tar.gz
scummvm-rg350-be7a28f65e35b8e8a7c8e60c9b0bcb1923a3d942.tar.bz2
scummvm-rg350-be7a28f65e35b8e8a7c8e60c9b0bcb1923a3d942.zip
Avoid all scumm var conflicts in C64 maniac
svn-id: r21277
-rw-r--r--engines/scumm/camera.cpp12
-rw-r--r--engines/scumm/costume.cpp10
-rw-r--r--engines/scumm/gfx.cpp11
-rw-r--r--engines/scumm/intern.h2
-rw-r--r--engines/scumm/room.cpp6
-rw-r--r--engines/scumm/script_c64.cpp43
-rw-r--r--engines/scumm/scumm.cpp11
-rw-r--r--engines/scumm/scumm.h3
-rw-r--r--engines/scumm/vars.cpp16
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;