aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Brown2002-04-05 16:41:02 +0000
committerJames Brown2002-04-05 16:41:02 +0000
commit2e0443e7415e44ae1e68a0f80cd86daae35a06b9 (patch)
treea354e778188354e7e9dd19e5fe0ca4d9cca8228e
parent53b3cf6838132df901c89d14929a1d6ece783257 (diff)
downloadscummvm-rg350-2e0443e7415e44ae1e68a0f80cd86daae35a06b9.tar.gz
scummvm-rg350-2e0443e7415e44ae1e68a0f80cd86daae35a06b9.tar.bz2
scummvm-rg350-2e0443e7415e44ae1e68a0f80cd86daae35a06b9.zip
Fix Indy3/Loom override bugs. THIS MAY BREAK OTHER GAMES. Please test.
svn-id: r3876
-rw-r--r--gfx.cpp3
-rw-r--r--script.cpp37
-rw-r--r--script_v1.cpp10
3 files changed, 24 insertions, 26 deletions
diff --git a/gfx.cpp b/gfx.cpp
index 34e4dd2f20..4818e66de3 100644
--- a/gfx.cpp
+++ b/gfx.cpp
@@ -2084,7 +2084,8 @@ void Scumm::setCursorHotspot2(int x,int y) {
byte Scumm::isMaskActiveAt(int l, int t, int r, int b, byte *mem) {
int w,h,i;
-
+ if(_features & GF_SMALL_HEADER)
+ return 0;
l>>=3;
if (l<0) l = 0;
if (t<0) t = 0;
diff --git a/script.cpp b/script.cpp
index 9a5f843cdf..d94d985bab 100644
--- a/script.cpp
+++ b/script.cpp
@@ -440,17 +440,9 @@ void Scumm::stopObjectCode() {
if (ss->where!=WIO_GLOBAL && ss->where!=WIO_LOCAL) {
if (ss->cutsceneOverride)
error("Object %d ending with active cutscene/override", ss->number);
-
- /* I wonder if the removal of this breaks anything.
- * put ss->number and ss->status at another place if using this
- * stopObjectScript(ss->number); */
} else {
- if (ss->cutsceneOverride)
- // FIXME: Loom workaround, fix properly :) - khalek
- if ((_gameId == GID_LOOM256) && (ss->number==44))
- this->exitCutscene();
- else
- error("Script %d ending with active cutscene/override", ss->number);
+ if (ss->cutsceneOverride)
+ error("Script %d ending with active cutscene/override (%d)", ss->number, ss->cutsceneOverride);
}
ss->number = 0;
ss->status = 0;
@@ -759,10 +751,10 @@ void Scumm::endCutscene() {
uint32 *csptr;
int16 args[16];
- memset(args, 0, sizeof(args));
-
- ss->cutsceneOverride--;
+ memset(args, 0, sizeof(args));
+ ss->cutsceneOverride--;
+ printf("Ending cs(%d) from %d\n", ss->cutsceneOverride, _currentScript);
args[0] = vm.cutSceneData[vm.cutSceneStackPointer];
_vars[VAR_OVERRIDE] = 0;
@@ -781,7 +773,7 @@ void Scumm::endCutscene() {
void Scumm::cutscene(int16 *args) {
int scr = _currentScript;
vm.slot[scr].cutsceneOverride++;
-
+ printf("Starting cs(%d) from %d\n", vm.slot[scr].cutsceneOverride, _currentScript);
if (++vm.cutSceneStackPointer > sizeof(vm.cutSceneData)/sizeof(vm.cutSceneData[0]))
error("Cutscene stack overflow");
@@ -898,9 +890,10 @@ void Scumm::beginOverride() {
idx = vm.cutSceneStackPointer;
ptr = &vm.cutScenePtr[idx];
- if (!*ptr) {
+/* if (!*ptr) { // ENDER - FIXME - We don't need this?
vm.slot[_currentScript].cutsceneOverride++;
- }
+ }
+*/
*ptr = _scriptPointer - _scriptOrgPointer;
vm.cutSceneScript[idx] = _currentScript;
@@ -915,9 +908,10 @@ void Scumm::endOverride() {
idx = vm.cutSceneStackPointer;
ptr = &vm.cutScenePtr[idx];
- if (*ptr) {
- vm.slot[_currentScript].cutsceneOverride--;
- }
+/* if (!*ptr) { // ENDER - FIXME - We don't need this?
+ // vm.slot[_currentScript].cutsceneOverride--;
+ //printf("ending override: %d on script %d\n", vm.slot[_currentScript].cutsceneOverride, _currentScript);
+ } */
*ptr = 0;
vm.cutSceneScript[idx] = 0;
_vars[VAR_OVERRIDE] = 0;
@@ -1026,7 +1020,10 @@ void Scumm::exitCutscene() {
ss->offs = offs;
ss->status = 2;
ss->freezeCount = 0;
- ss->cutsceneOverride--;
+
+ if (ss->cutsceneOverride > 0)
+ ss->cutsceneOverride--;
+
_vars[VAR_OVERRIDE] = 1;
vm.cutScenePtr[vm.cutSceneStackPointer] = 0;
}
diff --git a/script_v1.cpp b/script_v1.cpp
index 559876628a..7f758ee62a 100644
--- a/script_v1.cpp
+++ b/script_v1.cpp
@@ -874,9 +874,8 @@ void Scumm::o5_chainScript() {
cur = _currentScript;
- if (vm.slot[cur].cutsceneOverride != 0) {
- error("Script %d chaining with active cutscene/override");
- }
+ if (vm.slot[cur].cutsceneOverride != 0)
+ error("Script %d chaining with active cutscene/override");
vm.slot[cur].number = 0;
vm.slot[cur].status = 0;
@@ -2105,8 +2104,9 @@ void Scumm::o5_stopScript() {
int script;
script = getVarOrDirectByte(0x80);
- if (script==0)
- stopObjectCode();
+ if (!script)
+ // stopObjectCode(); // ENDER - wrong?
+ stopScriptNr(_currentScript);
else
stopScriptNr(script);
}