aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKari Salminen2009-09-03 20:56:44 +0000
committerKari Salminen2009-09-03 20:56:44 +0000
commit9b2104db32d074886daa0ec48624193351d6ed51 (patch)
tree77240182c933fe6983c1d40fcf536d6b36f4a473
parent9aa7546a3491acbbace93729efed2dc62a1f1855 (diff)
downloadscummvm-rg350-9b2104db32d074886daa0ec48624193351d6ed51.tar.gz
scummvm-rg350-9b2104db32d074886daa0ec48624193351d6ed51.tar.bz2
scummvm-rg350-9b2104db32d074886daa0ec48624193351d6ed51.zip
Workaround for bug #2848940 (ScummVM crashes with Future wars): getZoneFromPositionRaw accessed data outside its 320x200 buffer because Y values in range 200-232 were given to it. Original doesn't properly handle this either so trying this workaround of returning zero for positions outside the 320x200 buffer. Hopefully nothing else breaks in Future Wars because of this (More testing is direly needed!).
svn-id: r43920
-rw-r--r--engines/cine/script_fw.cpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/engines/cine/script_fw.cpp b/engines/cine/script_fw.cpp
index a9824674e6..e926027f68 100644
--- a/engines/cine/script_fw.cpp
+++ b/engines/cine/script_fw.cpp
@@ -1841,6 +1841,20 @@ int16 getZoneFromPosition(byte *page, int16 x, int16 y, int16 width) {
}
int16 getZoneFromPositionRaw(byte *page, int16 x, int16 y, int16 width) {
+ // WORKAROUND for bug #2848940 ("ScummVM crashes with Future wars"):
+ // Vertical positions outside the 320x200 screen (e.g. in range 200-232)
+ // are accessed after teleporting Lo'Ann to the future using the pendant
+ // and walking down the slope and out of the screen (This causes a crash
+ // at least on Mac OS X). The original PC version of Future Wars doesn't
+ // clip its coordinates in this function or in checkCollision-function
+ // according to reverse engineering but instead just happily reads outside
+ // the 320x200 buffer. Not really knowing how to properly fix this I simply
+ // hope that the area outside the 320x200 part is full of zero and not of
+ // some random values and thus I return zero here and hope nothing breaks.
+ if (g_cine->getGameType() == Cine::GType_FW && !Common::Rect(320, 200).contains(x, y)) {
+ return 0;
+ }
+
byte *ptr = page + (y * width) + x;
byte zoneVar;