aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSylvain Dupont2010-10-22 20:53:25 +0000
committerSylvain Dupont2010-10-22 20:53:25 +0000
commit66e3815963564b1070bad56e25e2f9fb5e2a039e (patch)
tree647713f73375d3252706be28b3dbb055684cfc04
parent4a0ba817e58c5a1c7d17af5a79f91570dd98ca16 (diff)
downloadscummvm-rg350-66e3815963564b1070bad56e25e2f9fb5e2a039e.tar.gz
scummvm-rg350-66e3815963564b1070bad56e25e2f9fb5e2a039e.tar.bz2
scummvm-rg350-66e3815963564b1070bad56e25e2f9fb5e2a039e.zip
TOON: Fixed Bug #3089974 and #3086015
Bug #3089974: "TOON: Two Drews when exiting King's bedroom" Bug #3086015: "TOON: Woof doesn't idle correctly" Most talking animation bugs are fixed with this. The mouse is now hidden when entering a room. svn-id: r53706
-rw-r--r--engines/toon/character.cpp36
-rw-r--r--engines/toon/character.h3
-rw-r--r--engines/toon/script_func.cpp6
-rw-r--r--engines/toon/toon.cpp34
-rw-r--r--engines/toon/toon.h2
5 files changed, 56 insertions, 25 deletions
diff --git a/engines/toon/character.cpp b/engines/toon/character.cpp
index 378cd11a9f..860b106837 100644
--- a/engines/toon/character.cpp
+++ b/engines/toon/character.cpp
@@ -47,6 +47,7 @@ Character::Character(ToonEngine *vm) : _vm(vm) {
_facing = 0;
_flags = 0;
_animFlags = 0;
+ _isTalking = false;
_id = 0;
_scale = 1024;
_blockingWalk = false;
@@ -249,8 +250,8 @@ void Character::stopSpecialAnim() {
if (_animScriptId != -1)
_vm->getSceneAnimationScript(_animScriptId)->_frozen = false;
- if (_sceneAnimationId != -1)
- _animationInstance->setAnimation(_vm->getSceneAnimation(_sceneAnimationId)->_animation);
+ //if (_sceneAnimationId != -1)
+ // _animationInstance->setAnimation(_vm->getSceneAnimation(_sceneAnimationId)->_animation);
bool needStandingAnim = (_animFlags & 0x40) != 0;
@@ -348,10 +349,12 @@ void Character::update(int32 timeIncrement) {
if (_animScriptId != -1)
_vm->getSceneAnimationScript(_animScriptId)->_frozen = true;
-
+
+
// TODO setup backup //
_animFlags |= 0x10;
+ _animationInstance->setAnimation(_specialAnim);
_animationInstance->setFrame(0);
_time = _vm->getOldMilli() + 8 * _vm->getTickLength();
}
@@ -359,14 +362,11 @@ void Character::update(int32 timeIncrement) {
}
if ((_animFlags & 3) == 2) {
- if (_vm->getCurrentLineToSay() != _lineToSayId || !_vm->getAudioManager()->voiceStillPlaying()) // || (_flags & 8)) && _vm->getAudioManager()->voiceStillPlaying())
+ if ((((_animFlags & 8) == 8) && _vm->getCurrentLineToSay() != _lineToSayId) || !_vm->getAudioManager()->voiceStillPlaying()) // || (_flags & 8)) && _vm->getAudioManager()->voiceStillPlaying())
_animFlags |= 1;
-// Strangerke - Commented (not used)
-// } else {
}
- // label29 :
if (_time > _vm->getOldMilli())
return;
@@ -439,13 +439,13 @@ void Character::update(int32 timeIncrement) {
// skipped all this part.
//label78
+
+
#if 0
if (_id == 0)
- debugC(0, 0xfff, " drew animation flag %d / frame %d", _animFlags, nextFrame);
-
+ printf(" drew animation name %s / flag %d / frame %d \n", _specialAnim->_name, _animFlags, nextFrame);
if (_id == 1)
debugC(0, 0xfff, " flux animation flag %d / frame %d", _animFlags, nextFrame);
-
if (_id == 7)
debugC(0, 0xfff, " footman animation flag %d / frame %d", _animFlags, nextFrame);
#endif
@@ -954,12 +954,9 @@ void Character::playAnim(int32 animId, int32 unused, int32 flags) {
strcat(animName, ".CAF");
- if (_animScriptId != -1)
+ if (_animScriptId != -1 && (flags & 8) == 0)
_vm->getSceneAnimationScript(_animScriptId)->_frozen = true;
- if (_sceneAnimationId > -1)
- setAnimationInstance(_vm->getSceneAnimation(_sceneAnimationId)->_animInstance);
-
stopSpecialAnim();
if (flags & 8) {
@@ -968,7 +965,18 @@ void Character::playAnim(int32 animId, int32 unused, int32 flags) {
// make the talker busy
_flags |= 1;
+
+ // wait for the character to be ready
+ while (_animScriptId != -1 && _animationInstance->getFrame() > 0 && _animationInstance->getAnimation() != _specialAnim) {
+ _vm->simpleUpdate(false);
+ }
}
+
+
+ if (_sceneAnimationId > -1)
+ setAnimationInstance(_vm->getSceneAnimation(_sceneAnimationId)->_animInstance);
+
+
_animFlags |= flags;
if (_specialAnim)
diff --git a/engines/toon/character.h b/engines/toon/character.h
index c6cb3011f2..e4f53e731c 100644
--- a/engines/toon/character.h
+++ b/engines/toon/character.h
@@ -96,6 +96,8 @@ public:
virtual void updateIdle();
virtual int32 getRandomIdleAnim() { return 0; }
virtual void updateTimers(int32 relativeAdd);
+ virtual void setTalking(bool talking) { _isTalking = true; }
+ virtual bool isTalking() { return _isTalking; }
int32 getFacingFromDirection(int32 dx, int32 dy);
static const SpecialCharacterAnimation *getSpecialAnimation(int32 characterId, int32 animationId);
@@ -126,6 +128,7 @@ protected:
int32 _speed;
int32 _lastWalkTime;
int32 _numPixelToWalk;
+ bool _isTalking;
AnimationInstance *_animationInstance;
AnimationInstance *_shadowAnimationInstance;
diff --git a/engines/toon/script_func.cpp b/engines/toon/script_func.cpp
index bc7a234a86..1f463d065b 100644
--- a/engines/toon/script_func.cpp
+++ b/engines/toon/script_func.cpp
@@ -618,7 +618,10 @@ int32 ScriptFunc::sys_Cmd_In_Conversation(EMCState *state) {
int32 ScriptFunc::sys_Cmd_Character_Talking(EMCState *state) {
int32 characterId = stackPos(0);
- return (_vm->getCurrentCharacterTalking() == characterId);
+ Character *character = _vm->getCharacterById(characterId);
+ if (character)
+ return character->isTalking();
+ return 0;
}
int32 ScriptFunc::sys_Cmd_Set_Flux_Facing_Point(EMCState *state) {
@@ -963,6 +966,7 @@ int32 ScriptFunc::sys_Cmd_Draw_Scene_Anim_WSA_Frame(EMCState *state) {
SceneAnimation *sceneAnim = _vm->getSceneAnimation(animId);
if (sceneAnim->_active) {
+ sceneAnim->_animInstance->setAnimation(sceneAnim->_animation);
sceneAnim->_animInstance->setFrame(frame);
sceneAnim->_animInstance->setAnimationRange(frame, frame);
sceneAnim->_animInstance->stopAnimation();
diff --git a/engines/toon/toon.cpp b/engines/toon/toon.cpp
index fdb69c4cf3..3a823071e0 100644
--- a/engines/toon/toon.cpp
+++ b/engines/toon/toon.cpp
@@ -801,21 +801,23 @@ void ToonEngine::setPaletteEntries(uint8 *palette, int32 offset, int32 num) {
_system->setPalette(vmpalette, offset, num);
}
-void ToonEngine::simpleUpdate() {
+void ToonEngine::simpleUpdate(bool waitCharacterToTalk) {
int32 elapsedTime = _system->getMillis() - _oldTimer2;
_oldTimer2 = _system->getMillis();
_oldTimer = _oldTimer2;
+ if (!_audioManager->voiceStillPlaying() && !waitCharacterToTalk) {
+ _currentTextLine = 0;
+ _currentTextLineId = -1;
+ }
+
updateCharacters(elapsedTime);
updateAnimationSceneScripts(elapsedTime);
updateTimer(elapsedTime);
_animationManager->update(elapsedTime);
render();
- if (!_audioManager->voiceStillPlaying()) {
- _currentTextLine = 0;
- _currentTextLineId = -1;
- }
+
}
void ToonEngine::fixPaletteEntries(uint8 *palette, int num) {
@@ -1067,7 +1069,7 @@ void ToonEngine::loadScene(int32 SceneId, bool forGameLoad) {
setupGeneralPalette();
createShadowLUT();
-
+ state()->_mouseHidden = false;
if (!forGameLoad) {
@@ -1086,7 +1088,7 @@ void ToonEngine::loadScene(int32 SceneId, bool forGameLoad) {
_gameState->_nextSpecialEnterX = -1;
_gameState->_nextSpecialEnterY = -1;
}
-
+
_script->start(&_scriptState[0], 3);
while (_script->run(&_scriptState[0]))
@@ -1098,8 +1100,6 @@ void ToonEngine::loadScene(int32 SceneId, bool forGameLoad) {
waitForScriptStep();
}
-
- state()->_mouseHidden = false;
}
void ToonEngine::setupGeneralPalette() {
@@ -1911,7 +1911,19 @@ int32 ToonEngine::characterTalk(int32 dialogid, bool blocking) {
_currentTextLineId = dialogid;
if (blocking) {
+ Character *character = getCharacterById(talkerId);
+ if (character)
+ character->setTalking(true);
+
playTalkAnimOnCharacter(talkerAnimId, talkerId, true);
+
+ // set once more the values, they may have been overwritten when the engine
+ // waits for the character to be ready.
+ _currentTextLine = myLine;
+ _currentTextLineCharacterId = talkerId;
+ _currentTextLineId = dialogid;
+
+
} else {
Character *character = getCharacterById(talkerId);
if (character)
@@ -1935,6 +1947,10 @@ int32 ToonEngine::characterTalk(int32 dialogid, bool blocking) {
while (_audioManager->voiceStillPlaying() && !_shouldQuit)
doFrame();
_gameState->_mouseHidden = oldMouseHidden && _gameState->_mouseHidden;
+
+ Character *character = getCharacterById(talkerId);
+ if (character)
+ character->setTalking(false);
}
diff --git a/engines/toon/toon.h b/engines/toon/toon.h
index 76425b09ca..299cb403b1 100644
--- a/engines/toon/toon.h
+++ b/engines/toon/toon.h
@@ -144,7 +144,7 @@ public:
int32 runConversationCommand(int16 **command);
void prepareConversations();
void drawConversationIcons();
- void simpleUpdate();
+ void simpleUpdate(bool waitCharacterToTalk = false);
int32 waitTicks(int32 numTicks, bool breakOnMouseClick);
void copyToVirtualScreen(bool updateScreen = true);
void getMouseEvent();