aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Sandulenko2004-01-28 04:07:54 +0000
committerEugene Sandulenko2004-01-28 04:07:54 +0000
commitece80a4a1f82abcef5c5aa0c12f665a89d7c85e2 (patch)
tree475b30f8b74d5f9c8b191c196b9e8871ea225620
parent4c430c9b4ae7e834968e7eef5c52649ae63d5c92 (diff)
downloadscummvm-rg350-ece80a4a1f82abcef5c5aa0c12f665a89d7c85e2.tar.gz
scummvm-rg350-ece80a4a1f82abcef5c5aa0c12f665a89d7c85e2.tar.bz2
scummvm-rg350-ece80a4a1f82abcef5c5aa0c12f665a89d7c85e2.zip
Partial fix for bug #885488 (Some INSANE trouble)
o Finally fixed seek error. Now I never encounter it, though there are weird SAUD errors in some cases. o Started to hunt cave-dude-only bug svn-id: r12653
-rw-r--r--scumm/insane/insane.cpp3
-rw-r--r--scumm/insane/insane_iact.cpp18
-rw-r--r--scumm/insane/insane_scenes.cpp2
-rw-r--r--scumm/smush/chunk.cpp1
-rw-r--r--scumm/smush/smush_player.cpp16
5 files changed, 23 insertions, 17 deletions
diff --git a/scumm/insane/insane.cpp b/scumm/insane/insane.cpp
index 6aa7003839..23b9ee7ae6 100644
--- a/scumm/insane/insane.cpp
+++ b/scumm/insane/insane.cpp
@@ -40,10 +40,7 @@
// TODO (in no particular order):
// o Ben's velocity don't get zeroed after crash
-// o Mine road used to have correct behaviour with ESC but now is not.
-// Instead of skipping portions of road it just restarts
// o Road signs are not aligned properly
-// o With goggles on there is a seek error
// o SAUD complaining again
// o Insane::postCase16() has workaround. Cockpit is not transparent so it is
// disabled now
diff --git a/scumm/insane/insane_iact.cpp b/scumm/insane/insane_iact.cpp
index 34469ea836..a0ff7153e0 100644
--- a/scumm/insane/insane_iact.cpp
+++ b/scumm/insane/insane_iact.cpp
@@ -200,7 +200,7 @@ void Insane::iactScene1(byte *renderBitmap, int32 codecparam, int32 setupsan12,
}
void Insane::proc62(void) {
- if (readArray(58) == 0)
+ if (readArray(58) != 0)
_enemy[EN_TORQUE].field_10 = 1;
if (_enemy[EN_TORQUE].field_8 == 0) {
@@ -217,15 +217,22 @@ void Insane::proc62(void) {
int32 en, edi, ebp, edx, esi, eax, ebx, ecx;
- for (en = 0; _enemy[en].field_10 == 0; en++);
- en -= 4;
+ edx = eax = 0;
+
+ for (eax = 0; eax < 9; eax++)
+ if (_enemy[eax].field_10 == 0)
+ edx++;
+
+ edx -= 4;
+
+ en = edx;
ebp = 0;
edi = 0;
_loop1:
edi++;
- if (edi > 14)
+ if (edi >= 14)
goto loc5;
edx = rand() / 11;
@@ -351,6 +358,9 @@ void Insane::proc63(void) {
}
void Insane::proc64(int32 enemy1) {
+ if (enemy1 >= _val215d)
+ return;
+
_val215d--;
for (int en = enemy1; en < _val215d; en++)
diff --git a/scumm/insane/insane_scenes.cpp b/scumm/insane/insane_scenes.cpp
index fce17465ad..aca375ce63 100644
--- a/scumm/insane/insane_scenes.cpp
+++ b/scumm/insane/insane_scenes.cpp
@@ -1052,7 +1052,7 @@ void Insane::postCase16(byte *renderBitmap, int32 codecparam, int32 setupsan12,
smlayer_showStatusMsg(-1, renderBitmap, codecparam, 140, 168, 1, 2, 0, "%s", buf);
smlayer_showStatusMsg(-1, renderBitmap, codecparam, 170, 43, 1, 2, 0, "%s", buf);
- // FIXME: it should be transparent
+ // FIXME: it should be transparent, so now it is disabled
//smlayer_drawSomething(renderBitmap, codecparam, 0, 0, 1, _smush_bensgoggNut, 0, 0, 0);
if (!_val124_)
diff --git a/scumm/smush/chunk.cpp b/scumm/smush/chunk.cpp
index 9962ef362e..6df6a7fb74 100644
--- a/scumm/smush/chunk.cpp
+++ b/scumm/smush/chunk.cpp
@@ -191,6 +191,7 @@ uint32 FileChunk::getDword() {
void FileChunk::reinit(uint32 offset) {
_offset = 0;
+ _data->seek(0);
_type = _data->readUint32BE();
_size = _data->readUint32BE();
_curPos = 0;
diff --git a/scumm/smush/smush_player.cpp b/scumm/smush/smush_player.cpp
index fa9dd24a15..227f3b601c 100644
--- a/scumm/smush/smush_player.cpp
+++ b/scumm/smush/smush_player.cpp
@@ -872,6 +872,9 @@ void SmushPlayer::parseNextFrame() {
case TYPE_FRME:
handleFrame(*sub);
break;
+ case TYPE_AHDR: // FT INSANE may seek file to the beginning
+ handleAnimHeader(*sub);
+ break;
default:
error("Unknown Chunk found at %x: %x, %d", _base->tell(), sub->getType(), sub->getSize());
}
@@ -964,28 +967,23 @@ void SmushPlayer::insanity(bool flag) {
}
void SmushPlayer::seekSan(const char *file, const char *directory, int32 pos, int32 contFrame) {
- Chunk *sub;
-
if (file) {
if (_base)
delete _base;
_base = new FileChunk(file, directory);
- pos = 0;
+ if (pos >= 8)
+ pos -= 8;
} else {
_base->reinit(pos);
}
if (pos != 8 && pos) {
- _base->seek(pos, FileChunk::seek_start);
_middleAudio = true;
- } else {
- _base->seek(pos, FileChunk::seek_start);
- sub = _base->subBlock();
- checkBlock(*sub, TYPE_AHDR);
- handleAnimHeader(*sub);
}
+ _base->seek(pos, FileChunk::seek_start);
+
_frame = contFrame;
}