diff options
author | Max Horn | 2004-10-07 21:23:29 +0000 |
---|---|---|
committer | Max Horn | 2004-10-07 21:23:29 +0000 |
commit | f488f4c15fbdc1342f1729b5701a01de6a483fea (patch) | |
tree | c18bfbaea91b95e266747a87c07ff59f9b1da0f0 | |
parent | 186201c68f9910fa3001e668024339cb8e2a7244 (diff) | |
download | scummvm-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
-rw-r--r-- | scumm/actor.cpp | 48 | ||||
-rw-r--r-- | scumm/saveload.cpp | 7 | ||||
-rw-r--r-- | scumm/saveload.h | 2 |
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 |