diff options
author | James Brown | 2002-04-05 16:41:02 +0000 |
---|---|---|
committer | James Brown | 2002-04-05 16:41:02 +0000 |
commit | 2e0443e7415e44ae1e68a0f80cd86daae35a06b9 (patch) | |
tree | a354e778188354e7e9dd19e5fe0ca4d9cca8228e | |
parent | 53b3cf6838132df901c89d14929a1d6ece783257 (diff) | |
download | scummvm-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.cpp | 3 | ||||
-rw-r--r-- | script.cpp | 37 | ||||
-rw-r--r-- | script_v1.cpp | 10 |
3 files changed, 24 insertions, 26 deletions
@@ -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); } |