aboutsummaryrefslogtreecommitdiff
path: root/engines/toon/script_func.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/toon/script_func.cpp')
-rw-r--r--engines/toon/script_func.cpp78
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;
}