diff --git a/engines/scumm/actor.cpp b/engines/scumm/actor.cpp index 2d0e498f482..89e4133adeb 100644 --- a/engines/scumm/actor.cpp +++ b/engines/scumm/actor.cpp @@ -323,11 +323,11 @@ int Actor::actorWalkStep() { int nextFacing; if( _vm->_game.version == 0 ) - ((ActorC64*) this)->_AnimFrameRepeat = -1; + ((ActorC64*) this)->_animFrameRepeat = -1; _needRedraw = true; - nextFacing = updateActorDirection(true);; + nextFacing = updateActorDirection(true); if (!(_moving & MF_IN_LEG) || _facing != nextFacing) { if (_walkFrame != _frame || _facing != nextFacing) { @@ -420,9 +420,6 @@ void Actor::startWalkActor(int destX, int destY, int dir) { } } - if( _vm->_game.version == 0 ) - ((ActorC64*) this)->animateActor(dir); - _walkdata.dest.x = abr.x; _walkdata.dest.y = abr.y; _walkdata.destbox = abr.box; @@ -448,6 +445,7 @@ void Actor::startWalkAnim(int cmd, int angle) { args[2] = angle; _vm->runScript(_walkScript, 1, 0, args); } else { + switch (cmd) { case 1: /* start walk */ setDirection(angle); @@ -564,7 +562,9 @@ void Actor_v2::walkActor() { } if( _vm->_game.version == 0 ) - ((ActorC64*)this)->setCmdFromDirection( newDirToOldDir(new_dir) ); + if( _moving == 0 ) + ((ActorC64*)this)->setCmdFromDirection( newDirToOldDir(new_dir) ); + return; } @@ -573,8 +573,10 @@ void Actor_v2::walkActor() { if (_moving & MF_IN_LEG) { actorWalkStep(); + if( _vm->_game.version == 0 ) ((ActorC64*) this)->animateActor( newDirToOldDir( _facing ) ); + } else { if (_moving & MF_LAST_LEG) { _moving = 0; @@ -884,13 +886,9 @@ void Actor::setDirection(int direction) { } void ActorC64::setDirection(int cmd) { + + setCmdFromDirection( newDirToOldDir( cmd ) ); - // Normalize the angle - _facing = normalizeAngle( cmd ); - - // If there is no costume set for this actor, we are finished - if (_costume == 0) - return; } // based on 0x2BCA, doesn't match disassembly because 'oldDir' variable @@ -916,8 +914,7 @@ int ActorC64::setCmdFromDirection(int direction) { break; } - - _AnimFrameRepeat = -1; + _animFrameRepeat = -1; animateActor(res); animateCostume(); @@ -951,6 +948,9 @@ void Actor::turnToDirection(int newdir) { _targetFacing = newdir; } } + + if (_vm->_game.version == 0) + ((ActorC64*)this)->setCmdFromDirection( newDirToOldDir(newdir) ); } @@ -999,6 +999,7 @@ void Actor::putActor(int dstX, int dstY, int newRoom) { } adjustActorPos(); + } else { #ifdef ENABLE_HE if (_vm->_game.heversion >= 71) @@ -1010,6 +1011,9 @@ void Actor::putActor(int dstX, int dstY, int newRoom) { if (isInCurrentRoom()) showActor(); } + + if( _vm->_game.version == 0 && _costume != 0x13 ) + turnToDirection( oldDirToNewDir(2)); } static bool inBoxQuickReject(const BoxCoords &box, int x, int y, int threshold) { @@ -1261,8 +1265,6 @@ void Actor::adjustActorPos() { if (flags & 7) { turnToDirection(_facing); } - if (_vm->_game.version == 0) - ((ActorC64*)this)->setCmdFromDirection( newDirToOldDir(_facing) ); } } @@ -1335,20 +1337,26 @@ void Actor::showActor() { _vm->ensureResourceLoaded(rtCostume, _costume); if (_vm->_game.version == 0) { + ActorC64 *a = ((ActorC64*) this); a->_costCommand = a->_costCommandNew = 0xFF; for( int i = 0; i < 8; ++i ) { + a->_limbFrameRepeat[i] = 0; a->_limbFrameRepeatNew[i] = 0; - } - // 0x39DF - a->_AnimFrameRepeat = 1; - _cost.reset(); - a->setCmdFromDirection( newDirToOldDir(_facing) ); + + // 0x39DF + a->_animFrameRepeat = 1; + a->_speaking = 0; + + if( a->_costume != 0x13 ) + startAnimActor(_standFrame); + _visible = true; + return; } else if (_vm->_game.version <= 2) { _cost.reset(); @@ -1974,8 +1982,6 @@ void ActorC64::animateCostume() { _cost.soundPos = (_cost.soundPos + 1) % 3; } - _vm->_costumeLoader->loadCostume(_costume); - speakCheck(); for( _limb_current = 0; _limb_current < 8; ++_limb_current ) { @@ -1998,7 +2004,7 @@ void ActorC64::speakCheck() { else cmd += 0x10; - _AnimFrameRepeat = -1; + _animFrameRepeat = -1; animateActor( cmd ); } @@ -2788,18 +2794,22 @@ void ActorC64::animateActor(int anim) { int dir = -1; switch( anim ) { + case 0x00: case 0x04: dir = 0; break; + case 0x01: case 0x05: dir = 1; break; + case 0x02: case 0x06: dir = 2; break; + case 0x03: case 0x07: dir = 3; break; @@ -2816,12 +2826,12 @@ void ActorC64::animateActor(int anim) { if( dir == -1 ) return; - setDirection( oldDirToNewDir(dir) ); + _facing = normalizeAngle( oldDirToNewDir(dir) ); } else { if( anim > 4 && anim <= 7 ) - setDirection( oldDirToNewDir(dir) ); + _facing = normalizeAngle( oldDirToNewDir(dir) ); } } @@ -2830,11 +2840,12 @@ void ActorC64::saveLoadWithSerializer(Serializer *ser) { static const SaveLoadEntry actorEntries[] = { MKLINE(ActorC64, _costCommand, sleByte, VER(84)), - MKLINE(ActorC64, _costFrame, sleByte, VER(84)), + MKLINE_OLD(ActorC64, _costFrame, sleByte, VER(84), VER(89)), MKLINE(ActorC64, _miscflags, sleByte, VER(84)), MKLINE(ActorC64, _speaking, sleByte, VER(84)), - MKLINE(ActorC64, _AnimFrameRepeat, sleByte, VER(89)), + MKLINE(ActorC64, _animFrameRepeat, sleByte, VER(89)), MKARRAY(ActorC64, _limbFrameRepeatNew[0], sleInt8, 8, VER(89)), + MKARRAY(ActorC64, _limbFrameRepeat[0], sleInt8, 8, VER(89)), MKEND() }; diff --git a/engines/scumm/actor.h b/engines/scumm/actor.h index 35ff657fa76..a93b75c6e76 100644 --- a/engines/scumm/actor.h +++ b/engines/scumm/actor.h @@ -352,7 +352,7 @@ public: byte _miscflags; byte _speaking; - int8 _AnimFrameRepeat; + int8 _animFrameRepeat; int8 _limbFrameRepeatNew[8], _limbFrameRepeat[8]; byte _limb_current; @@ -361,10 +361,9 @@ public: public: ActorC64(ScummEngine *scumm, int id) : Actor_v2(scumm, id) { _costCommand = 0xFF; - _costFrame = 0; _speaking = 0; - _AnimFrameRepeat = 0; - _costCommandNew = 0; + _animFrameRepeat = 0; + _costCommandNew = 0xFF; for( int i = 0; i < 8; ++i ) { _limbFrameRepeatNew[i] = 0; diff --git a/engines/scumm/costume.cpp b/engines/scumm/costume.cpp index c7285ead566..cfb1e8690f0 100644 --- a/engines/scumm/costume.cpp +++ b/engines/scumm/costume.cpp @@ -1288,6 +1288,9 @@ void C64CostumeLoader::loadCostume(int id) { void C64CostumeLoader::costumeDecodeData(Actor *a, int frame, uint usemask) { ActorC64 *A = (ActorC64 *)a; + if( !a->_costume ) + return; + loadCostume(a->_costume); if( A->_costCommandNew == 0xFF || (A->_costCommand == A->_costCommandNew) ) @@ -1330,14 +1333,14 @@ void C64CostumeLoader::costumeDecodeData(Actor *a, int frame, uint usemask) { } // 0x2679 - A->_limbFrameRepeatNew[limb] = A->_AnimFrameRepeat; + A->_limbFrameRepeatNew[limb] = A->_animFrameRepeat; } } byte C64CostumeLoader::increaseAnims(Actor *a) { ActorC64 *A = (ActorC64 *)a; - if( _frameOffsets == 0 ) + if( _frameOffsets == 0 || (a->_cost.active[A->_limb_current] == 0xFFFF) ) return 0; uint16 limbPrevious = a->_cost.curpos[A->_limb_current]++; diff --git a/engines/scumm/script_v0.cpp b/engines/scumm/script_v0.cpp index 0bdefd660b4..054d861db46 100644 --- a/engines/scumm/script_v0.cpp +++ b/engines/scumm/script_v0.cpp @@ -674,13 +674,11 @@ void ScummEngine_v0::o_lights() { void ScummEngine_v0::o_animateActor() { int act = getVarOrDirectByte(PARAM_1); int anim = getVarOrDirectByte(PARAM_2); - int8 animFrameRepeat = (int8) fetchScriptByte(); - - debug(0,"o_animateActor: animFrameRepeat %d", animFrameRepeat); + int8 repeat = (int8) fetchScriptByte(); ActorC64 *a = (ActorC64*) derefActor(act, "o_animateActor"); - a->_AnimFrameRepeat = animFrameRepeat; + a->_animFrameRepeat = repeat; switch( anim ) {