diff options
Diffstat (limited to 'engines/toon/script_func.cpp')
-rw-r--r-- | engines/toon/script_func.cpp | 78 |
1 files changed, 64 insertions, 14 deletions
diff --git a/engines/toon/script_func.cpp b/engines/toon/script_func.cpp index 821a8971de..e2c9540fb2 100644 --- a/engines/toon/script_func.cpp +++ b/engines/toon/script_func.cpp @@ -34,13 +34,12 @@ namespace Toon { -typedef Common::Functor1Mem<EMCState *, int32, ScriptFunc> OpcodeV2; #define SetOpcodeTable(x) table = &x; #define Opcode(x) table->push_back(new OpcodeV2(this, &ScriptFunc::x)) #define OpcodeUnImpl() table->push_back(new OpcodeV2(this, 0)) ScriptFunc::ScriptFunc(ToonEngine *vm) { - Common::Array<const Opcode *> *table = 0; + Common::Array<const OpcodeV2 *> *table = 0; _vm = vm; _opcodes.reserve(176); @@ -224,7 +223,11 @@ ScriptFunc::ScriptFunc(ToonEngine *vm) { } ScriptFunc::~ScriptFunc(void) { - + while(!_opcodes.empty()) { + const OpcodeV2 *temp = _opcodes.back(); + _opcodes.pop_back(); + delete temp; + } } char *GetText(int32 i, EMCState *state) { @@ -239,7 +242,7 @@ int32 ScriptFunc::sys_Cmd_Dummy(EMCState *state) { } int32 ScriptFunc::sys_Cmd_Change_Actor_X_And_Y(EMCState *state) { - _vm->getDrew()->setPosition(stackPos(0), stackPos(1)); + _vm->getDrew()->forcePosition(stackPos(0), stackPos(1)); return 0; } @@ -344,7 +347,7 @@ int32 ScriptFunc::sys_Cmd_Set_Sack_Visible(EMCState *state) { } int32 ScriptFunc::sys_Cmd_Set_Actor_Facing(EMCState *state) { - _vm->getDrew()->setFacing(stackPos(0)); + _vm->getDrew()->forceFacing(stackPos(0)); _vm->getDrew()->playStandingAnim(); return 0; } @@ -474,6 +477,14 @@ int32 ScriptFunc::sys_Cmd_Empty_Inventory(EMCState *state) { } int32 ScriptFunc::sys_Cmd_Set_Anim_Scale_Size(EMCState *state) { + int32 animID = stackPos(0); + int32 scale = stackPos(1); + + SceneAnimation *sceneAnim = _vm->getSceneAnimation(animID); + if (sceneAnim) { + sceneAnim->_animInstance->setUseMask(true); + sceneAnim->_animInstance->setScale(scale,true); + } return 0; } int32 ScriptFunc::sys_Cmd_Delete_Item_From_Inventory(EMCState *state) { @@ -541,7 +552,11 @@ int32 ScriptFunc::sys_Cmd_Exit_Conversation(EMCState *state) { } int32 ScriptFunc::sys_Cmd_Set_Mouse_Pos(EMCState *state) { - _vm->getSystem()->warpMouse(stackPos(0) - _vm->state()->_currentScrollValue, stackPos(1)); + if (_vm->state()->_inCloseUp) { + _vm->getSystem()->warpMouse(stackPos(0), stackPos(1)); + } else { + _vm->getSystem()->warpMouse(stackPos(0) - _vm->state()->_currentScrollValue, stackPos(1)); + } return 0; } @@ -621,7 +636,7 @@ int32 ScriptFunc::sys_Cmd_Character_Talking(EMCState *state) { int32 characterId = stackPos(0); Character *character = _vm->getCharacterById(characterId); if (character) - return (character->getFlag() & 4) && (character->getFlag() & 8); + return character->isTalking(); return 0; } @@ -634,14 +649,14 @@ int32 ScriptFunc::sys_Cmd_Set_Flux_Facing_Point(EMCState *state) { } int32 ScriptFunc::sys_Cmd_Set_Flux_Facing(EMCState *state) { - _vm->getFlux()->setFacing(stackPos(0)); + _vm->getFlux()->forceFacing(stackPos(0)); _vm->getFlux()->playStandingAnim(); return 0; } int32 ScriptFunc::sys_Cmd_Set_Flux_Coords(EMCState *state) { _vm->getFlux()->stopWalk(); - _vm->getFlux()->setPosition(stackPos(0), stackPos(1)); + _vm->getFlux()->forcePosition(stackPos(0), stackPos(1)); return 0; } @@ -702,7 +717,7 @@ int32 ScriptFunc::sys_Cmd_Place_Scene_Anim(EMCState *state) { int32 frame = stackPos(5); SceneAnimation *sceneAnim = _vm->getSceneAnimation(sceneId); - sceneAnim->_animInstance->setPosition(x, y, 0, false); + sceneAnim->_animInstance->setPosition(x, y, sceneAnim->_animInstance->getZ(), false); sceneAnim->_animInstance->forceFrame(frame); _vm->setSceneAnimationScriptUpdate(false); return 0; @@ -874,6 +889,12 @@ int32 ScriptFunc::sys_Cmd_Set_Scene_Anim_Wait(EMCState *state) { _vm->setSceneAnimationScriptUpdate(false); } + // WORKAROUND : Slow down just a little the guards dance animation so that the voices don't cut + if (_vm->state()->_currentScene == 2 && (sceneId == 2 || sceneId == 3)) { + waitTicks = 7; + _vm->setSceneAnimationScriptUpdate(false); + } + waitTicks *= _vm->getTickLength(); if (sceneId >= 0 && sceneId < 40) { @@ -895,9 +916,13 @@ int32 ScriptFunc::sys_Cmd_Init_Scene_Anim(EMCState *state) { if (sceneAnim->_active) return 0; + delete sceneAnim->_animation; + delete sceneAnim->_animInstance; + sceneAnim->_animation = new Animation(_vm); sceneAnim->_animation->loadAnimation(GetText(12, state)); sceneAnim->_animInstance = _vm->getAnimationManager()->createNewInstance(kAnimationScene); + sceneAnim->_originalAnimInstance = sceneAnim->_animInstance; sceneAnim->_animInstance->setAnimation(sceneAnim->_animation); sceneAnim->_animInstance->setVisible((flags & 1) != 0); sceneAnim->_animInstance->setAnimationRange(stackPos(11), stackPos(11)); @@ -910,10 +935,14 @@ int32 ScriptFunc::sys_Cmd_Init_Scene_Anim(EMCState *state) { int32 dx = stackPos(4); int32 dy = stackPos(5); + int32 x = stackPos(2); int32 layerZ = stackPos(3); if (dx == -2) sceneAnim->_animInstance->moveRelative(640, 0, 0); + else if (dx < 0) { + dx = sceneAnim->_animation->_x1; + } else if (dx >= 0) sceneAnim->_animInstance->setX(dx); @@ -922,8 +951,10 @@ int32 ScriptFunc::sys_Cmd_Init_Scene_Anim(EMCState *state) { else dy = sceneAnim->_animation->_y1; - if (flags & 0x20) - sceneAnim->_animInstance->setZ(_vm->getLayerAtPoint(dx, dy)); + if (flags & 0x20) { + sceneAnim->_animInstance->setZ(_vm->getLayerAtPoint(x, layerZ)); + sceneAnim->_animInstance->setUseMask(true); + } if (layerZ >= 0) { sceneAnim->_animInstance->setLayerZ(layerZ); @@ -961,6 +992,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(); @@ -1048,18 +1080,26 @@ int32 ScriptFunc::sys_Cmd_Play_Sfx(EMCState *state) { } int32 ScriptFunc::sys_Cmd_Set_Ambient_Sfx(EMCState *state) { + //debug("Ambient Sfx : %d %d %d %d", stackPos(0), stackPos(1), stackPos(2), stackPos(3)); + _vm->getAudioManager()->startAmbientSFX(stackPos(0), stackPos(1), stackPos(2), stackPos(3)); return 0; } int32 ScriptFunc::sys_Cmd_Kill_Ambient_Sfx(EMCState *state) { + //debug("Kill Sfx : %d", stackPos(0)); + _vm->getAudioManager()->killAmbientSFX(stackPos(0)); return 0; } int32 ScriptFunc::sys_Cmd_Set_Ambient_Sfx_Plus(EMCState *state) { + //debug("Ambient Sfx Plus: %d %d %d %d %d %d %d %d", stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7)); + _vm->getAudioManager()->startAmbientSFX(stackPos(0), stackPos(1), stackPos(2), stackPos(3)); return 0; } int32 ScriptFunc::sys_Cmd_Set_Ambient_Volume(EMCState *state) { + //debug("Ambient Volume : %d %d", stackPos(0), stackPos(1)); + _vm->getAudioManager()->setAmbientSFXVolume(stackPos(0), stackPos(1)); return 0; } @@ -1119,8 +1159,18 @@ int32 ScriptFunc::sys_Cmd_Remove_Scene_Anim(EMCState *state) { SceneAnimation *sceneAnim = _vm->getSceneAnimation(sceneId); sceneAnim->_active = false; _vm->getAnimationManager()->removeInstance(sceneAnim->_animInstance); - sceneAnim->_animation = 0; - sceneAnim->_animInstance = 0; + delete sceneAnim->_animation; + sceneAnim->_animation = NULL; + + // see if one character shares this instance + for (int32 c = 0; c < 32; c++) { + if (_vm->getCharacter(c) && _vm->getCharacter(c)->getAnimationInstance() == sceneAnim->_originalAnimInstance) { + _vm->getCharacter(c)->setAnimationInstance(NULL); + } + } + delete sceneAnim->_originalAnimInstance; + sceneAnim->_originalAnimInstance = NULL; + sceneAnim->_animInstance = NULL; return 0; } |