aboutsummaryrefslogtreecommitdiff
path: root/scumm
diff options
context:
space:
mode:
authorMax Horn2004-10-07 21:23:29 +0000
committerMax Horn2004-10-07 21:23:29 +0000
commitf488f4c15fbdc1342f1729b5701a01de6a483fea (patch)
treec18bfbaea91b95e266747a87c07ff59f9b1da0f0 /scumm
parent186201c68f9910fa3001e668024339cb8e2a7244 (diff)
downloadscummvm-rg350-f488f4c15fbdc1342f1729b5701a01de6a483fea.tar.gz
scummvm-rg350-f488f4c15fbdc1342f1729b5701a01de6a483fea.tar.bz2
scummvm-rg350-f488f4c15fbdc1342f1729b5701a01de6a483fea.zip
Another attempt at a fix for bug #1032964 (INDY3-VGA: actors walking in wrong places), by making sure all actor walkdata is saved
svn-id: r15455
Diffstat (limited to 'scumm')
-rw-r--r--scumm/actor.cpp48
-rw-r--r--scumm/saveload.cpp7
-rw-r--r--scumm/saveload.h2
3 files changed, 36 insertions, 21 deletions
diff --git a/scumm/actor.cpp b/scumm/actor.cpp
index c95968986e..f0da57d535 100644
--- a/scumm/actor.cpp
+++ b/scumm/actor.cpp
@@ -46,31 +46,36 @@ void Actor::initActorClass(ScummEngine *scumm) {
Actor::Actor() {
assert(_vm != 0);
- _offsX = _offsY = 0;
- top = bottom = 0;
number = 0;
- needRedraw = needBgReset = costumeNeedsInit = visible = false;
- flip = false;
- speedx = 8;
- speedy = 2;
- frame = 0;
- _walkbox = 0;
- animProgress = 0;
- skipLimb = false;
- drawToBackBuf = false;
- memset(animVariable, 0, sizeof(animVariable));
- memset(palette, 0, sizeof(palette));
- memset(sound, 0, sizeof(sound));
- memset(&cost, 0, sizeof(CostumeData));
- memset(&walkdata, 0, sizeof(ActorWalkData));
- walkdata.point3.x = 32000;
- walkScript = 0;
- memset(talkQueue, 0, sizeof(talkQueue));
- initActor(1);
+ initActor(-1);
}
void Actor::initActor(int mode) {
+ if (mode == -1) {
+ _offsX = _offsY = 0;
+ top = bottom = 0;
+ needRedraw = needBgReset = costumeNeedsInit = visible = false;
+ flip = false;
+ speedx = 8;
+ speedy = 2;
+ frame = 0;
+ _walkbox = 0;
+ animProgress = 0;
+ skipLimb = false;
+ drawToBackBuf = false;
+ memset(animVariable, 0, sizeof(animVariable));
+ memset(palette, 0, sizeof(palette));
+ memset(sound, 0, sizeof(sound));
+ memset(&cost, 0, sizeof(CostumeData));
+ memset(&walkdata, 0, sizeof(ActorWalkData));
+ walkdata.point3.x = 32000;
+ walkScript = 0;
+ memset(talkQueue, 0, sizeof(talkQueue));
+
+ mode = 1;
+ }
+
if (mode == 1) {
costume = 0;
room = 0;
@@ -2055,6 +2060,9 @@ const SaveLoadEntry *Actor::getSaveLoadEntries() {
MKLINE(Actor, walkdata.deltaYFactor, sleInt32, VER(8)),
MKLINE(Actor, walkdata.xfrac, sleUint16, VER(8)),
MKLINE(Actor, walkdata.yfrac, sleUint16, VER(8)),
+
+ MKLINE(Actor, walkdata.point3.x, sleUint16, VER(42)),
+ MKLINE(Actor, walkdata.point3.y, sleUint16, VER(42)),
MKARRAY(Actor, cost.active[0], sleByte, 16, VER(8)),
MKLINE(Actor, cost.stopped, sleUint16, VER(8)),
diff --git a/scumm/saveload.cpp b/scumm/saveload.cpp
index 944bf59996..38a339da8d 100644
--- a/scumm/saveload.cpp
+++ b/scumm/saveload.cpp
@@ -707,6 +707,13 @@ void ScummEngine::saveOrLoad(Serializer *s, uint32 savegameVersion) {
_system->warpMouse(_mouse.x, _mouse.y);
}
+ if (s->isLoading()) {
+ // Not all actor data is saved; so when loading, we first reset
+ // all actors, to ensure completely reproducible behaviour (else,
+ // some not saved value in the actor class can cause odd things)
+ for (i = 0; i < _numActors; i++)
+ _actors[i].initActor(-1);
+ }
s->saveLoadArrayOf(_actors, _numActors, sizeof(_actors[0]), actorEntries);
s->saveLoadEntries(_sound, soundEntries);
diff --git a/scumm/saveload.h b/scumm/saveload.h
index 4a06c6104e..eb4acab072 100644
--- a/scumm/saveload.h
+++ b/scumm/saveload.h
@@ -32,7 +32,7 @@ namespace Scumm {
// Can be useful for other ports too :)
#define VER(x) x
-#define CURRENT_VER 41
+#define CURRENT_VER 42
// To work around a warning in GCC 3.2 (and 3.1 ?) regarding non-POD types,
// we use a small trick: instead of 0 we use 42. Why? Well, it seems newer GCC