From 25e5143f99dab91d53eb52de703ef1b4c9ee2656 Mon Sep 17 00:00:00 2001 From: Peter Kohaut Date: Mon, 20 Mar 2017 00:28:51 +0100 Subject: BLADERUNNER: added full office leroy ai script fix sceneobject remove --- engines/bladerunner/actor.cpp | 6 +- engines/bladerunner/actor_walk.cpp | 10 +- engines/bladerunner/gameflags.cpp | 2 +- engines/bladerunner/module.mk | 2 +- engines/bladerunner/scene.cpp | 12 +- engines/bladerunner/scene_objects.cpp | 10 +- engines/bladerunner/script/ai_00_mccoy.cpp | 7 +- engines/bladerunner/script/ai_00_mccoy.h | 5 +- engines/bladerunner/script/ai_23_officer_leroy.cpp | 1217 ++++++++++++++++++++ engines/bladerunner/script/ai_23_officer_leroy.h | 66 ++ .../bladerunner/script/aiscript_officer_leroy.cpp | 134 --- .../bladerunner/script/aiscript_officer_leroy.h | 58 - engines/bladerunner/script/script.cpp | 65 +- engines/bladerunner/script/script.h | 5 +- 14 files changed, 1366 insertions(+), 233 deletions(-) create mode 100644 engines/bladerunner/script/ai_23_officer_leroy.cpp create mode 100644 engines/bladerunner/script/ai_23_officer_leroy.h delete mode 100644 engines/bladerunner/script/aiscript_officer_leroy.cpp delete mode 100644 engines/bladerunner/script/aiscript_officer_leroy.h diff --git a/engines/bladerunner/actor.cpp b/engines/bladerunner/actor.cpp index 9a8892cf6c..96a76bf4be 100644 --- a/engines/bladerunner/actor.cpp +++ b/engines/bladerunner/actor.cpp @@ -203,10 +203,10 @@ void Actor::setAtXYZ(const Vector3 &position, int facing, bool snapFacing, bool setBoundingBox(_position, retired); - _vm->_sceneObjects->remove(_id); + _vm->_sceneObjects->remove(_id + SCENE_OBJECTS_ACTORS_OFFSET); if (_vm->_scene->getSetId() == _setId) { - _vm->_sceneObjects->addActor(_id, _bbox, &_screenRectangle, 1, moving, _isTargetable, retired); + _vm->_sceneObjects->addActor(_id + SCENE_OBJECTS_ACTORS_OFFSET, _bbox, &_screenRectangle, 1, moving, _isTargetable, retired); } } @@ -477,7 +477,7 @@ bool Actor::tick(bool forceDraw) { this->_position.z = this->_position.z + positionChange.x * sinx + positionChange.y * cosx; this->_position.y = this->_position.y + positionChange.z; - if (_vm->_sceneObjects->existsOnXZ(this->_id, this->_position.x, this->_position.z, false, false) == 1 && !this->_isImmuneToObstacles) { + if (_vm->_sceneObjects->existsOnXZ(this->_id + SCENE_OBJECTS_ACTORS_OFFSET, this->_position.x, this->_position.z, false, false) == 1 && !this->_isImmuneToObstacles) { this->_position.x = originalX; this->_position.y = originalY; this->_position.z = originalZ; diff --git a/engines/bladerunner/actor_walk.cpp b/engines/bladerunner/actor_walk.cpp index 556f7b9afa..6287ac8ad0 100644 --- a/engines/bladerunner/actor_walk.cpp +++ b/engines/bladerunner/actor_walk.cpp @@ -146,7 +146,7 @@ void ActorWalk::setRunning() { } void ActorWalk::stop(int actorId, bool unknown, int combatAnimationMode, int animationMode) { - _vm->_sceneObjects->setMoving(actorId, false); + _vm->_sceneObjects->setMoving(actorId + SCENE_OBJECTS_ACTORS_OFFSET, false); _vm->_actors[actorId]->setMoving(false); if (_vm->_actors[actorId]->inCombat()) { @@ -173,7 +173,7 @@ bool ActorWalk::isXYZEmpty(float x, float y, float z, int actorId) { if (_vm->_actors[actorId]->isImmuneToObstacles()) { return false; } - return _vm->_sceneObjects->existsOnXZ(actorId, x, z, false, false); + return _vm->_sceneObjects->existsOnXZ(actorId + SCENE_OBJECTS_ACTORS_OFFSET, x, z, false, false); } int ActorWalk::findU1(int actorId, const Vector3 &to, int dist, Vector3 *out) { @@ -206,14 +206,14 @@ int ActorWalk::findU1(int actorId, const Vector3 &to, int dist, Vector3 *out) { x = to.x + sin_1024(v24) * dist; z = to.z + cos_1024(v24) * dist; - if (!_vm->_sceneObjects->existsOnXZ(actorId, x, z, true, true) && _vm->_scene->_set->findWalkbox(x, z) >= 0) { + if (!_vm->_sceneObjects->existsOnXZ(actorId + SCENE_OBJECTS_ACTORS_OFFSET, x, z, true, true) && _vm->_scene->_set->findWalkbox(x, z) >= 0) { break; } x = to.x + sin_1024(v23) * dist; z = to.z + cos_1024(v23) * dist; - if (!_vm->_sceneObjects->existsOnXZ(actorId, x, z, true, true) && _vm->_scene->_set->findWalkbox(x, z) >= 0) { + if (!_vm->_sceneObjects->existsOnXZ(actorId + SCENE_OBJECTS_ACTORS_OFFSET, x, z, true, true) && _vm->_scene->_set->findWalkbox(x, z) >= 0) { break; } @@ -252,7 +252,7 @@ int ActorWalk::nextOnPath(int actorId, const Vector3 &from, const Vector3 &to, V if (_vm->_scene->_set->findWalkbox(to.x, to.z) == -1) { return 0; } - if (_vm->_sceneObjects->existsOnXZ(actorId, to.x, to.z, false, false)) { + if (_vm->_sceneObjects->existsOnXZ(actorId + SCENE_OBJECTS_ACTORS_OFFSET, to.x, to.z, false, false)) { return 0; } Vector3 next1; diff --git a/engines/bladerunner/gameflags.cpp b/engines/bladerunner/gameflags.cpp index db4271d9d5..0e04a1c49d 100644 --- a/engines/bladerunner/gameflags.cpp +++ b/engines/bladerunner/gameflags.cpp @@ -59,7 +59,7 @@ void GameFlags::reset(int flag) { } bool GameFlags::query(int flag) { - debug("GameFlags::query(%d): %d", flag, !!(flags[flag / 32] & (1 << (flag % 32)))); + //debug("GameFlags::query(%d): %d", flag, !!(flags[flag / 32] & (1 << (flag % 32)))); assert(flag >= 0 && flag <= flagCount); return !!(flags[flag / 32] & (1 << (flag % 32))); diff --git a/engines/bladerunner/module.mk b/engines/bladerunner/module.mk index fb656efac1..31577da2b6 100644 --- a/engines/bladerunner/module.mk +++ b/engines/bladerunner/module.mk @@ -39,7 +39,7 @@ MODULE_OBJS = \ scene.o \ scene_objects.o \ script/ai_00_mccoy.o \ - script/aiscript_officer_leroy.o \ + script/ai_23_officer_leroy.o \ script/init.o \ script/kia.o \ script/vk.o \ diff --git a/engines/bladerunner/scene.cpp b/engines/bladerunner/scene.cpp index c29a6345cc..abf0285660 100644 --- a/engines/bladerunner/scene.cpp +++ b/engines/bladerunner/scene.cpp @@ -108,7 +108,7 @@ bool Scene::open(int setId, int sceneId, bool isLoadingGame) { _vm->_scene->advanceFrame(_vm->_surface1, _vm->_zBuffer1); _vm->_playerActor->setAtXYZ(_actorStartPosition, _actorStartFacing); - //_vm->_playerActor->setSetId(setId); + _vm->_playerActor->setSetId(setId); _vm->_script->SceneLoaded(); @@ -120,7 +120,7 @@ bool Scene::open(int setId, int sceneId, bool isLoadingGame) { Actor *actor = _vm->_actors[i]; if (actor->getSetId() == setId) { _vm->_sceneObjects->addActor( - i, + i + SCENE_OBJECTS_ACTORS_OFFSET, actor->getBoundingBox(), actor->getScreenRectangle(), 1, @@ -251,14 +251,14 @@ bool Scene::objectGetBoundingBox(int objectId, BoundingBox *boundingBox) { void Scene::objectSetIsClickable(int objectId, bool isClickable, bool sceneLoaded) { _set->objectSetIsClickable(objectId, isClickable); if (sceneLoaded) { - _vm->_sceneObjects->setIsClickable(objectId + 198, isClickable); + _vm->_sceneObjects->setIsClickable(objectId + SCENE_OBJECTS_OBJECTS_OFFSET, isClickable); } } void Scene::objectSetIsObstacle(int objectId, bool isObstacle, bool sceneLoaded, bool updateWalkpath) { _set->objectSetIsObstacle(objectId, isObstacle); if (sceneLoaded) { - _vm->_sceneObjects->setIsObstacle(objectId + 198, isObstacle); + _vm->_sceneObjects->setIsObstacle(objectId + SCENE_OBJECTS_OBJECTS_OFFSET, isObstacle); if (updateWalkpath) { _vm->_sceneObjects->updateObstacles(); } @@ -270,7 +270,7 @@ void Scene::objectSetIsObstacleAll(bool isObstacle, bool sceneLoaded) { for (i = 0; i < (int)_set->getObjectCount(); i++) { _set->objectSetIsObstacle(i, isObstacle); if (sceneLoaded) { - _vm->_sceneObjects->setIsObstacle(i + 198, isObstacle); + _vm->_sceneObjects->setIsObstacle(i + SCENE_OBJECTS_OBJECTS_OFFSET, isObstacle); } } } @@ -278,7 +278,7 @@ void Scene::objectSetIsObstacleAll(bool isObstacle, bool sceneLoaded) { void Scene::objectSetIsTarget(int objectId, bool isTarget, bool sceneLoaded) { _set->objectSetIsTarget(objectId, isTarget); if (sceneLoaded) { - _vm->_sceneObjects->setIsTarget(objectId + 198, isTarget); + _vm->_sceneObjects->setIsTarget(objectId + SCENE_OBJECTS_OBJECTS_OFFSET, isTarget); } } diff --git a/engines/bladerunner/scene_objects.cpp b/engines/bladerunner/scene_objects.cpp index c55097358d..b66467e859 100644 --- a/engines/bladerunner/scene_objects.cpp +++ b/engines/bladerunner/scene_objects.cpp @@ -86,7 +86,7 @@ bool SceneObjects::remove(int sceneObjectId) { if (i == -1) { return false; } - + _sceneObjects[i]._present = 0; int j; for (j = 0; j < _count; ++j) { if (_sceneObjectsSortedByDistance[j] == i) { @@ -107,7 +107,7 @@ int SceneObjects::findByXYZ(int *isClickable, int *isObstacle, int *isTarget, fl *isTarget = 0; for (int i = 0; i < _count; ++i) { - assert(_sceneObjectsSortedByDistance[i] < _count); + assert(_sceneObjectsSortedByDistance[i] < SCENE_OBJECTS_COUNT); SceneObject &sceneObject = _sceneObjects[_sceneObjectsSortedByDistance[i]]; @@ -171,8 +171,10 @@ bool SceneObjects::existsOnXZ(int exceptSceneObjectId, float x, float z, bool a5 int SceneObjects::findById(int sceneObjectId) { for (int i = 0; i < _count; ++i) { - if (_sceneObjects[i]._present && _sceneObjects[i]._sceneObjectId == sceneObjectId) { - return i; + int j = this->_sceneObjectsSortedByDistance[i]; + + if (_sceneObjects[j]._present && _sceneObjects[j]._sceneObjectId == sceneObjectId) { + return j; } } return -1; diff --git a/engines/bladerunner/script/ai_00_mccoy.cpp b/engines/bladerunner/script/ai_00_mccoy.cpp index fa37efb63e..f0081a528e 100644 --- a/engines/bladerunner/script/ai_00_mccoy.cpp +++ b/engines/bladerunner/script/ai_00_mccoy.cpp @@ -248,7 +248,8 @@ void AIScript_McCoy::Retired(int byActorId) { } } -void AIScript_McCoy::GetFriendlinessModifierIfGetsClue() { +int AIScript_McCoy::GetFriendlinessModifierIfGetsClue(int otherActorId, int clueId) { + return 0; } bool AIScript_McCoy::GoalChanged(int currentGoalNumber, int newGoalNumber) { @@ -1660,10 +1661,12 @@ void AIScript_McCoy::SetAnimationState(int animationState, int a2, int a3, int a dword_46271C = a4; } -bool AIScript_McCoy::ReachedMovementTrackWaypoint() { +bool AIScript_McCoy::ReachedMovementTrackWaypoint(int a1) { return true; } +void AIScript_McCoy::FledCombat() {} + void AIScript_McCoy::sub_4053E0() { float x, y, z; Actor_Query_XYZ(0, &x, &y, &z); diff --git a/engines/bladerunner/script/ai_00_mccoy.h b/engines/bladerunner/script/ai_00_mccoy.h index eedae2f99b..43fa049cda 100644 --- a/engines/bladerunner/script/ai_00_mccoy.h +++ b/engines/bladerunner/script/ai_00_mccoy.h @@ -60,13 +60,14 @@ public: void ShotAtAndMissed(); void ShotAtAndHit(); void Retired(int byActorId); - void GetFriendlinessModifierIfGetsClue(); + int GetFriendlinessModifierIfGetsClue(int otherActorId, int clueId); bool GoalChanged(int currentGoalNumber, int newGoalNumber); bool UpdateAnimation(int *animation, int *frame); bool ChangeAnimationMode(int mode); void QueryAnimationState(int *animationState, int *a2, int *a3, int *a4); void SetAnimationState(int animationState, int a2, int a3, int a4); - bool ReachedMovementTrackWaypoint(); + bool ReachedMovementTrackWaypoint(int a1); + void FledCombat(); private: void sub_4053E0(); diff --git a/engines/bladerunner/script/ai_23_officer_leroy.cpp b/engines/bladerunner/script/ai_23_officer_leroy.cpp new file mode 100644 index 0000000000..6699b358d9 --- /dev/null +++ b/engines/bladerunner/script/ai_23_officer_leroy.cpp @@ -0,0 +1,1217 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "bladerunner/script/ai_23_officer_leroy.h" + +namespace BladeRunner { + +AIScript_Officer_Leroy::AIScript_Officer_Leroy(BladeRunnerEngine *vm) + : AIScriptBase(vm), var_45D5B0_animation_state(0), var_45D5B4_animation_frame(0), var_45D5B8(0), var_45D5BC(0), var_462880(0), var_462884(0) {} + +void AIScript_Officer_Leroy::Initialize() { + var_45D5B0_animation_state = 0; + var_45D5B4_animation_frame = 0; + var_462880 = 0; + var_45D5B8 = 0; + var_45D5BC = 0; + + Actor_Put_In_Set(23, 69); + Actor_Set_At_XYZ(23, -261.80f, 6.00f, 79.58f, 512); + Actor_Set_Goal_Number(23, 0); + Actor_Set_Frame_Rate_FPS(23, 8); +} + +bool AIScript_Officer_Leroy::Update() { + if (Global_Variable_Query(1) == 4 && Actor_Query_Goal_Number(23) < 300) { + AI_Movement_Track_Flush(23); + Actor_Set_Goal_Number(23, 300); + } else if (Global_Variable_Query(1) == 5 && Actor_Query_Goal_Number(23) < 400) { + AI_Movement_Track_Flush(23); + Actor_Set_Goal_Number(23, 400); + } else if (!Game_Flag_Query(182) && Game_Flag_Query(147) == 1 && Game_Flag_Query(163) == 1 && Player_Query_Current_Scene() != 78 && Global_Variable_Query(1) < 3) { + Game_Flag_Set(186); + Actor_Set_Goal_Number(23, 3); + } else if (Actor_Query_Goal_Number(23) != 1 && Actor_Query_Goal_Number(23) != 2 && Game_Flag_Query(199) == 1) { + Game_Flag_Reset(199); + } else if (Global_Variable_Query(15) > 4 && !Actor_Clue_Query(23, 239)) { + Actor_Clue_Acquire(23, 239, 1, -1); + } else if (Game_Flag_Query(629) == 1) { + Game_Flag_Reset(629); + } else if (Game_Flag_Query(623) == 1 && !Game_Flag_Query(664)) { + Game_Flag_Set(664); + Actor_Set_Goal_Number(23, 305); + } else if (Actor_Query_Goal_Number(23) == 310 && Actor_Query_Which_Set_In(23) != Player_Query_Current_Set()) { + Non_Player_Actor_Combat_Mode_Off(23); + Actor_Set_Goal_Number(23, 305); + } else if (Actor_Query_Goal_Number(23) == 599 && Actor_Query_Which_Set_In(23) != Player_Query_Current_Set()) { + Actor_Set_Health(23, 40, 40); + Actor_Set_Goal_Number(23, 305); + } else if (Actor_Query_Goal_Number(23) == 305) { + switch (Actor_Query_Which_Set_In(23)) { + case 7: + if (Actor_Query_Which_Set_In(23) == Player_Query_Current_Set()) { + Actor_Set_Goal_Number(23, 310); + Non_Player_Actor_Combat_Mode_On(23, 0, 1, 0, 0, 4, 7, 8, -1, -1, -1, 10, 300, 0); + } + break; + case 20: + if (Actor_Query_Which_Set_In(23) == Player_Query_Current_Set()) { + Actor_Set_Goal_Number(23, 310); + Non_Player_Actor_Combat_Mode_On(23, 0, 1, 0, 1, 4, 7, 8, -1, -1, -1, 10, 300, 0); + } + break; + case 33: + if (Actor_Query_Which_Set_In(23) == Player_Query_Current_Set()) { + Actor_Set_Goal_Number(23, 310); + Non_Player_Actor_Combat_Mode_On(23, 0, 1, 0, 5, 4, 7, 8, -1, -1, -1, 10, 300, 0); + } + break; + case 53: + if (Actor_Query_Which_Set_In(23) == Player_Query_Current_Set()) { + Actor_Set_Goal_Number(23, 310); + Non_Player_Actor_Combat_Mode_On(23, 0, 1, 0, 7, 4, 7, 8, -1, -1, -1, 10, 300, 0); + } + break; + case 54: + if (Actor_Query_Which_Set_In(23) == Player_Query_Current_Set()) { + Actor_Set_Goal_Number(23, 310); + Non_Player_Actor_Combat_Mode_On(23, 0, 1, 0, 3, 4, 7, 8, -1, -1, -1, 10, 300, 0); + } + break; + case 70: + if (Actor_Query_Which_Set_In(23) == Player_Query_Current_Set()) { + Actor_Set_Goal_Number(23, 310); + Non_Player_Actor_Combat_Mode_On(23, 0, 1, 0, 18, 4, 7, 8, -1, -1, -1, 10, 300, 0); + } + break; + case 74: + if (Actor_Query_Which_Set_In(23) == Player_Query_Current_Set()) { + Actor_Set_Goal_Number(23, 310); + Non_Player_Actor_Combat_Mode_On(23, 0, 1, 0, 11, 4, 7, 8, -1, -1, -1, 10, 300, 0); + } + break; + case 77: + case 78: + case 79: + if (Actor_Query_Which_Set_In(23) == Player_Query_Current_Set()) { + Actor_Set_Goal_Number(23, 310); + Non_Player_Actor_Combat_Mode_On(23, 0, 1, 0, 10, 4, 7, 8, -1, -1, -1, 10, 300, 0); + } + break; + case 81: + if (Actor_Query_Which_Set_In(23) == Player_Query_Current_Set()) { + Actor_Set_Goal_Number(23, 310); + Non_Player_Actor_Combat_Mode_On(23, 0, 1, 0, 13, 4, 7, 8, -1, -1, -1, 10, 300, 0); + } + break; + case 83: + if (Actor_Query_Which_Set_In(23) == Player_Query_Current_Set()) { + Actor_Set_Goal_Number(23, 310); + Non_Player_Actor_Combat_Mode_On(23, 0, 1, 0, 14, 4, 7, 8, -1, -1, -1, 10, 300, 0); + } + break; + case 84: + if (Actor_Query_Which_Set_In(23) == Player_Query_Current_Set()) { + Actor_Set_Goal_Number(23, 310); + Non_Player_Actor_Combat_Mode_On(23, 0, 1, 0, 16, 4, 7, 8, -1, -1, -1, 10, 300, 0); + } + break; + case 86: + if (Actor_Query_Which_Set_In(23) == Player_Query_Current_Set()) { + Actor_Set_Goal_Number(23, 310); + Non_Player_Actor_Combat_Mode_On(23, 0, 1, 0, 17, 4, 7, 8, -1, -1, -1, 10, 300, 0); + } + break; + } + } + return false; +} + +void AIScript_Officer_Leroy::TimerExpired(int timer) { + if (timer == 1) { + AI_Countdown_Timer_Reset(23, 1); + if (Actor_Query_In_Set(0, 41)) { + Actor_Set_Goal_Number(23, 430); + Actor_Set_Goal_Number(24, 430); + } else { + Game_Flag_Set(684); + } + } else if (timer == 2) { + AI_Countdown_Timer_Reset(23, 2); + sub_431420(); + } +} + +void AIScript_Officer_Leroy::CompletedMovementTrack() { + int v0; + unsigned int v1; + + v0 = Actor_Query_Goal_Number(23); + if (v0 == 1) { + Actor_Set_Goal_Number(23, 2); + return; + } + //todo: tidyup + v1 = v0 - 305; + if (v1 > 3) { + return; + } + if (!v1) { + Actor_Set_Goal_Number(23, 306); + return; + } + if (v1 != 2) { + if (v1 == 3) { + Actor_Change_Animation_Mode(23, 4); + Actor_Face_Actor(23, 0, true); + Actor_Set_Goal_Number(23, 309); + } + return; + } + Non_Player_Actor_Combat_Mode_On(23, 0, 1, 0, 12, 4, 7, 8, 0, -1, -1, 15, 300, 0); +} + +void AIScript_Officer_Leroy::ReceivedClue(int clueId, int fromActorId) { + if (clueId == 222) { + Actor_Modify_Friendliness_To_Other(23, 0, 5); + } + if (clueId == 215) { + Actor_Modify_Friendliness_To_Other(23, 0, -4); + } +} + +void AIScript_Officer_Leroy::ClickedByPlayer() {} + +void AIScript_Officer_Leroy::EnteredScene(int sceneId) {} + +void AIScript_Officer_Leroy::OtherAgentEnteredThisScene() {} + +void AIScript_Officer_Leroy::OtherAgentExitedThisScene() {} + +void AIScript_Officer_Leroy::OtherAgentEnteredCombatMode() {} + +void AIScript_Officer_Leroy::ShotAtAndMissed() {} + +void AIScript_Officer_Leroy::ShotAtAndHit() { + if (Actor_Query_Goal_Number(23) == 307) { + Actor_Set_Health(23, 50, 50); + } +} + +void AIScript_Officer_Leroy::Retired(int byActorId) { + Actor_Set_Goal_Number(23, 599); + Game_Flag_Set(607); +} + +int AIScript_Officer_Leroy::GetFriendlinessModifierIfGetsClue(int otherActorId, int clueId) { + if (otherActorId) { + return 0; + } + switch (clueId) { + case 242: + return -6; + case 240: + return -2; + case 239: + return -5; + case 228: + return 2; + case 227: + return 4; + case 226: + return 4; + case 225: + return 3; + case 224: + return 3; + case 223: + return 2; + case 222: + return 3; + case 215: + return -5; + } + return 0; +} + +bool AIScript_Officer_Leroy::GoalChanged(int currentGoalNumber, int newGoalNumber) { + switch (newGoalNumber) { + case 1: + AI_Movement_Track_Flush(23); + if (Random_Query(1, 2) == 1) { + AI_Movement_Track_Append(23, 57, 7); + AI_Movement_Track_Append(23, 58, 7); + } else { + AI_Movement_Track_Append(23, 58, 7); + AI_Movement_Track_Append(23, 57, 7); + } + AI_Movement_Track_Repeat(23); + return true; + case 2: + if (Random_Query(1, 3) == 1) { + if (Random_Query(1, 2) == 1 && !Actor_Clue_Query(23, 16)) { + Actor_Clue_Acquire(23, 16, 0, -1); + } else if (!Actor_Clue_Query(23, 17)) { + Actor_Clue_Acquire(23, 17, 0, -1); + } + } + if (Game_Flag_Query(182)) { + if (Actor_Clue_Query(23, 16) && Actor_Clue_Query(23, 17)) { + Actor_Set_Goal_Number(23, 0); + } else { + Actor_Set_Goal_Number(23, 1); + } + } else { + Actor_Set_Goal_Number(23, 0); + } + return true; + case 3: + AI_Movement_Track_Flush(23); + AI_Movement_Track_Append(23, 39, Random_Query(120, 240)); + AI_Movement_Track_Append(23, 35, 0); + AI_Movement_Track_Repeat(23); + return true; + case 99: + AI_Movement_Track_Flush(23); + return false; + case 102: + AI_Movement_Track_Flush(23); + AI_Movement_Track_Append(23, 107, 0); + AI_Movement_Track_Append(23, 108, 0); + AI_Movement_Track_Repeat(23); + return true; + case 300: + Actor_Set_Goal_Number(23, 305); + return true; + case 305: + AI_Movement_Track_Flush(23); + switch (Random_Query(1, 10)) { + case 1: + AI_Movement_Track_Append(23, 398, 15); + AI_Movement_Track_Append(23, 399, 0); + AI_Movement_Track_Append(23, 400, 0); + AI_Movement_Track_Append(23, 401, 0); + AI_Movement_Track_Append_With_Facing(23, 402, 3, 276); + AI_Movement_Track_Append(23, 403, 0); + AI_Movement_Track_Append(23, 404, 15); + AI_Movement_Track_Repeat(23); + break; + case 2: + AI_Movement_Track_Append(23, 385, 10); + AI_Movement_Track_Append(23, 242, 2); + AI_Movement_Track_Append(23, 386, 2); + AI_Movement_Track_Append(23, 387, 15); + AI_Movement_Track_Repeat(23); + break; + case 3: + AI_Movement_Track_Append(23, 390, 10); + AI_Movement_Track_Append(23, 391, 0); + AI_Movement_Track_Append(23, 392, 5); + AI_Movement_Track_Append(23, 345, 0); + AI_Movement_Track_Append(23, 393, 15); + AI_Movement_Track_Repeat(23); + break; + case 4: + AI_Movement_Track_Append(23, 381, 15); + AI_Movement_Track_Append(23, 382, 0); + AI_Movement_Track_Append(23, 383, 15); + AI_Movement_Track_Append(23, 382, 3); + AI_Movement_Track_Append(23, 384, 0); + AI_Movement_Track_Append(23, 35, 30); + AI_Movement_Track_Repeat(23); + break; + case 5: + AI_Movement_Track_Append(23, 388, 10); + AI_Movement_Track_Append(23, 389, 10); + AI_Movement_Track_Append(23, 35, 30); + AI_Movement_Track_Repeat(23); + break; + case 6: + AI_Movement_Track_Append(23, 385, 10); + AI_Movement_Track_Append(23, 242, 2); + AI_Movement_Track_Append(23, 386, 2); + AI_Movement_Track_Append(23, 387, 15); + AI_Movement_Track_Repeat(23); + break; + case 7: + AI_Movement_Track_Append(23, 394, 15); + AI_Movement_Track_Append(23, 395, 0); + AI_Movement_Track_Append(23, 396, 0); + AI_Movement_Track_Append(23, 397, 15); + AI_Movement_Track_Append(23, 396, 0); + AI_Movement_Track_Append(23, 395, 0); + AI_Movement_Track_Append(23, 430, 15); + AI_Movement_Track_Append(23, 35, 30); + AI_Movement_Track_Repeat(23); + break; + case 8: + switch (Random_Query(1, 7)) { + case 1: + AI_Movement_Track_Append(23, 302, 0); + AI_Movement_Track_Append(23, 407, 0); + AI_Movement_Track_Append(23, 408, 0); + AI_Movement_Track_Append(23, 35, 30); + AI_Movement_Track_Repeat(23); + break; + case 2: + AI_Movement_Track_Append(23, 536, 0); + AI_Movement_Track_Append(23, 537, 0); + AI_Movement_Track_Append(23, 538, 1); + AI_Movement_Track_Append(23, 537, 0); + AI_Movement_Track_Append(23, 536, 0); + AI_Movement_Track_Repeat(23); + break; + case 3: + AI_Movement_Track_Append(23, 296, 10); + AI_Movement_Track_Append(23, 409, 2); + AI_Movement_Track_Append(23, 296, 10); + AI_Movement_Track_Append(23, 35, 30); + AI_Movement_Track_Repeat(23); + break; + case 4: + AI_Movement_Track_Append(23, 411, 10); + AI_Movement_Track_Append(23, 412, 5); + AI_Movement_Track_Append(23, 411, 0); + AI_Movement_Track_Append(23, 35, 30); + AI_Movement_Track_Repeat(23); + break; + case 5: + AI_Movement_Track_Append(23, 413, 10); + AI_Movement_Track_Append(23, 414, 0); + AI_Movement_Track_Append_With_Facing(23, 431, 0, 1017); + AI_Movement_Track_Append(23, 432, 10); + AI_Movement_Track_Append(23, 35, 30); + AI_Movement_Track_Repeat(23); + break; + case 6: + AI_Movement_Track_Append(23, 415, 0); + AI_Movement_Track_Append_With_Facing(23, 416, 0, 620); + AI_Movement_Track_Append(23, 417, 0); + AI_Movement_Track_Append(23, 418, 0); + AI_Movement_Track_Append(23, 35, 30); + AI_Movement_Track_Repeat(23); + break; + case 7: + AI_Movement_Track_Append(23, 405, 10); + AI_Movement_Track_Append(23, 406, 0); + AI_Movement_Track_Append(23, 35, 30); + AI_Movement_Track_Repeat(23); + return false; + default: + return false; + } + //no break + case 9: + if (Random_Query(1, 2) - 1 == 1) { + AI_Movement_Track_Append(23, 433, 10); + AI_Movement_Track_Append(23, 434, 0); + AI_Movement_Track_Append(23, 435, 0); + AI_Movement_Track_Append(23, 35, 30); + AI_Movement_Track_Repeat(23); + return false; + } + AI_Movement_Track_Append(23, 420, 10); + AI_Movement_Track_Append(23, 422, 2); + AI_Movement_Track_Append(23, 421, 1); + AI_Movement_Track_Append_With_Facing(23, 422, 4, 182); + AI_Movement_Track_Append(23, 420, 10); + AI_Movement_Track_Append(23, 35, 30); + AI_Movement_Track_Repeat(23); + //no break + case 10: + AI_Movement_Track_Append(23, 310, 0); + AI_Movement_Track_Append(23, 307, 0); + AI_Movement_Track_Append(23, 309, 0); + AI_Movement_Track_Append(23, 310, 0); + AI_Movement_Track_Append(23, 35, 30); + AI_Movement_Track_Repeat(23); + return false; + default: + return false; + } + //no break + case 306: + Actor_Set_Goal_Number(23, 305); + return true; + case 307: + AI_Movement_Track_Flush(23); + AI_Movement_Track_Append_With_Facing(23, 416, 0, 556); + Actor_Change_Animation_Mode(23, 4); + AI_Movement_Track_Repeat(23); + return true; + case 308: + AI_Movement_Track_Flush(23); + AI_Movement_Track_Append_Run_With_Facing(23, 440, 2, 355); + AI_Movement_Track_Append_Run_With_Facing(23, 441, 0, 825); + AI_Movement_Track_Repeat(23); + return true; + case 400: + AI_Movement_Track_Flush(23); + AI_Movement_Track_Append(23, 35, 0); + AI_Movement_Track_Repeat(23); + Actor_Set_Goal_Number(23, 410); + return true; + case 420: + AI_Countdown_Timer_Reset(23, 1); + AI_Countdown_Timer_Start(23, 1, 120); + Actor_Set_Goal_Number(23, 410); + return true; + case 425: + AI_Countdown_Timer_Reset(23, 1); + AI_Countdown_Timer_Start(23, 1, 60); + Actor_Set_Goal_Number(23, 410); + return true; + case 430: + Actor_Set_Goal_Number(23, 410); + Actor_Set_Goal_Number(24, 410); + return false; + default: + return false; + } +} + +bool AIScript_Officer_Leroy::UpdateAnimation(int *animation, int *frame) { + int v57; + int a1; + + switch (var_45D5B0_animation_state) { + case 32: + *animation = 603; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(603)) { + *animation = 589; + var_45D5B0_animation_state = 0; + var_45D5B8 = 0; + var_45D5B4_animation_frame = 0; + } + *frame = var_45D5B4_animation_frame; + return true; + case 31: + *animation = 604; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(604)) { + *animation = 601; + var_45D5B0_animation_state = 1; + var_45D5B4_animation_frame = 0; + } + *frame = var_45D5B4_animation_frame; + return true; + case 30: + *animation = 587; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(587)) { + *animation = 589; + var_45D5B0_animation_state = 0; + var_45D5B4_animation_frame = 0; + Actor_Change_Animation_Mode(23, 0); + } + *frame = var_45D5B4_animation_frame; + return true; + case 29: + *animation = 586; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(586)) { + *animation = 589; + var_45D5B0_animation_state = 0; + var_45D5B4_animation_frame = 0; + Actor_Change_Animation_Mode(23, 0); + } + *frame = var_45D5B4_animation_frame; + return true; + case 28: + *animation = 576; + if (var_45D5B4_animation_frame < Slice_Animation_Query_Number_Of_Frames(576) - 1) { + ++var_45D5B4_animation_frame; + } + *frame = var_45D5B4_animation_frame; + return true; + case 27: + *animation = 588; + if (var_45D5B4_animation_frame < Slice_Animation_Query_Number_Of_Frames(588) - 1) { + ++var_45D5B4_animation_frame; + } + *frame = var_45D5B4_animation_frame; + return true; + case 26: + *animation = 573; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(573)) { + var_45D5B0_animation_state = 21; + var_45D5B4_animation_frame = 0; + *animation = 571; + Actor_Change_Animation_Mode(23, 4); + } + *frame = var_45D5B4_animation_frame; + return true; + case 25: + *animation = 572; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(572)) { + var_45D5B0_animation_state = 21; + var_45D5B4_animation_frame = 0; + *animation = 571; + Actor_Change_Animation_Mode(23, 4); + } + *frame = var_45D5B4_animation_frame; + return true; + case 24: + *animation = 581; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame == 4) { + if (Random_Query(1, 2) == 1) { + Sound_Play_Speech_Line(23, 9010, 75, 0, 99); + } else { + Sound_Play_Speech_Line(23, 9015, 75, 0, 99); + } + } + if (var_45D5B4_animation_frame == 5) { + Actor_Combat_AI_Hit_Attempt(23); + } + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(581)) { + var_45D5B0_animation_state = 21; + var_45D5B4_animation_frame = 0; + *animation = 571; + Actor_Change_Animation_Mode(23, 4); + } + *frame = var_45D5B4_animation_frame; + return true; + case 23: + *animation = 580; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(580)) { + *animation = 589; + var_45D5B0_animation_state = 0; + var_45D5B4_animation_frame = 0; + } + *frame = var_45D5B4_animation_frame; + return true; + case 22: + *animation = 579; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(579)) { + var_45D5B0_animation_state = 21; + var_45D5B4_animation_frame = 0; + *animation = 571; + } + *frame = var_45D5B4_animation_frame; + return true; + case 21: + *animation = 571; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(571)) { + var_45D5B4_animation_frame = 0; + } + *frame = var_45D5B4_animation_frame; + return true; + case 20: + *animation = 571; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame > Slice_Animation_Query_Number_Of_Frames(571) - 1) { + var_45D5B4_animation_frame = 0; + } + *frame = var_45D5B4_animation_frame; + return true; + case 19: + *animation = 600; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(600)) { + var_45D5B0_animation_state = 11; + var_45D5B4_animation_frame = 0; + *animation = 592; + } + *frame = var_45D5B4_animation_frame; + return true; + case 18: + *animation = 599; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(599)) { + var_45D5B0_animation_state = 11; + var_45D5B4_animation_frame = 0; + *animation = 592; + } + *frame = var_45D5B4_animation_frame; + return true; + case 17: + *animation = 598; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(598)) { + var_45D5B0_animation_state = 11; + var_45D5B4_animation_frame = 0; + *animation = 592; + } + *frame = var_45D5B4_animation_frame; + return true; + case 16: + *animation = 597; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(597)) { + var_45D5B0_animation_state = 11; + var_45D5B4_animation_frame = 0; + *animation = 592; + } + *frame = var_45D5B4_animation_frame; + return true; + case 15: + *animation = 596; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(596)) { + var_45D5B0_animation_state = 11; + var_45D5B4_animation_frame = 0; + *animation = 592; + } + *frame = var_45D5B4_animation_frame; + return true; + case 14: + *animation = 595; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(595)) { + var_45D5B0_animation_state = 11; + var_45D5B4_animation_frame = 0; + *animation = 592; + } + *frame = var_45D5B4_animation_frame; + return true; + case 13: + *animation = 594; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(594)) { + var_45D5B0_animation_state = 11; + var_45D5B4_animation_frame = 0; + *animation = 592; + } + *frame = var_45D5B4_animation_frame; + return true; + case 12: + *animation = 593; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(593)) { + var_45D5B0_animation_state = 11; + var_45D5B4_animation_frame = 0; + *animation = 592; + } + *frame = var_45D5B4_animation_frame; + return true; + case 11: + if (var_45D5BC && var_45D5B4_animation_frame <= 2) { + var_45D5BC = 0; + var_45D5B0_animation_state = 0; + var_45D5B4_animation_frame = 0; + *animation = 589; + var_45D5B8 = Random_Query(0, 1); + *frame = var_45D5B4_animation_frame; + return true; + } + + *animation = 592; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(592)) { + var_45D5B4_animation_frame = 0; + if (var_45D5BC) { + var_45D5BC = 0; + var_45D5B0_animation_state = 0; + var_45D5B4_animation_frame = 0; + *animation = 589; + var_45D5B8 = Random_Query(0, 1); + } else { + var_45D5B0_animation_state = Random_Query(0, 8) + 11; + } + var_45D5B4_animation_frame = 0; + } + *frame = var_45D5B4_animation_frame; + return true; + case 10: + *animation = 578; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(578)) { + var_45D5B4_animation_frame = 0; + } + *frame = var_45D5B4_animation_frame; + return true; + case 9: + *animation = 577; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(577)) { + var_45D5B4_animation_frame = 0; + } + *frame = var_45D5B4_animation_frame; + return true; + case 8: + *animation = 575; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(575)) { + var_45D5B4_animation_frame = 0; + } + *frame = var_45D5B4_animation_frame; + return true; + case 7: + *animation = 574; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(574)) { + var_45D5B4_animation_frame = 0; + } + *frame = var_45D5B4_animation_frame; + return true; + case 6: + *animation = 585; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(585)) { + var_45D5B4_animation_frame = 0; + } + *frame = var_45D5B4_animation_frame; + return true; + case 5: + *animation = 584; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(584)) { + var_45D5B4_animation_frame = 0; + } + *frame = var_45D5B4_animation_frame; + return true; + case 4: + *animation = 583; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(583)) { + var_45D5B4_animation_frame = 0; + } + *frame = var_45D5B4_animation_frame; + return true; + case 3: + *animation = 582; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(582)) { + var_45D5B4_animation_frame = 0; + } + *frame = var_45D5B4_animation_frame; + return true; + case 2: + if (Game_Flag_Query(199)) { + *animation = 603; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame > Slice_Animation_Query_Number_Of_Frames(603) - 1) { + Game_Flag_Reset(199); + var_45D5B4_animation_frame = 0; + var_45D5B0_animation_state = var_462880; + *animation = var_462884; + } + } else { + if (var_45D5B8 == 0) { + *animation = 589; + } + if (var_45D5B8 == 1) { + *animation = 590; + } + if (var_45D5B8 == 2) { + *animation = 591; + } + if (var_45D5B4_animation_frame > Slice_Animation_Query_Number_Of_Frames(*animation) / 2) { + a1 = *animation; + var_45D5B4_animation_frame += 3; + v57 = var_45D5B4_animation_frame; + if (v57 > Slice_Animation_Query_Number_Of_Frames(a1) - 1) { + var_45D5B4_animation_frame = 0; + var_45D5B0_animation_state = var_462880; + *animation = var_462884; + } + } else { + var_45D5B4_animation_frame -= 3; + if (var_45D5B4_animation_frame < 0) { + var_45D5B4_animation_frame = 0; + var_45D5B0_animation_state = var_462880; + *animation = var_462884; + } + } + } + *frame = var_45D5B4_animation_frame; + return true; + case 1: + *animation = 601; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(601)) { + var_45D5B4_animation_frame = 0; + } + if (!Game_Flag_Query(199)) { + var_45D5B0_animation_state = 32; + var_45D5B4_animation_frame = 0; + *animation = 603; + } + *frame = var_45D5B4_animation_frame; + return true; + case 0: + if (Game_Flag_Query(199) && !Game_Flag_Query(392)) { + var_45D5B0_animation_state = 31; + var_45D5B4_animation_frame = 0; + *animation = 604; + } else if (var_45D5B8 == 1) { + *animation = 590; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(590)) { + var_45D5B8 = Random_Query(0, 2); + var_45D5B4_animation_frame = 0; + } + } else if (var_45D5B8 == 2) { + *animation = 591; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(591)) { + var_45D5B8 = Random_Query(0, 2); + var_45D5B4_animation_frame = 0; + } + } else if (var_45D5B8 == 0) { + *animation = 589; + var_45D5B4_animation_frame++; + if (var_45D5B4_animation_frame >= Slice_Animation_Query_Number_Of_Frames(589)) { + var_45D5B8 = Random_Query(0, 2); + var_45D5B4_animation_frame = 0; + } + } + *frame = var_45D5B4_animation_frame; + return true; + default: + *animation = 399; + *frame = var_45D5B4_animation_frame; + return true; + } +} + +bool AIScript_Officer_Leroy::ChangeAnimationMode(int mode) { + int v1; + + switch (mode) { + case 28: + Game_Flag_Set(199); + break; + case 27: + Game_Flag_Reset(199); + break; + case 22: + if (Random_Query(0, 1)) { + var_45D5B0_animation_state = 25; + } else { + var_45D5B0_animation_state = 26; + } + var_45D5B4_animation_frame = 0; + break; + case 21: + if (var_45D5B0_animation_state == 21 || var_45D5B0_animation_state == 24) { + if (Random_Query(0, 1)) { + var_45D5B0_animation_state = 25; + } else { + var_45D5B0_animation_state = 26; + } + var_45D5B4_animation_frame = 0; + } else { + if (Random_Query(0, 1)) { + var_45D5B0_animation_state = 29; + } else { + var_45D5B0_animation_state = 30; + } + var_45D5B4_animation_frame = 0; + } + break; + case 19: + if (var_45D5B0_animation_state == 0 || var_45D5B0_animation_state == 1) { + var_45D5B0_animation_state = 2; + var_462880 = 19; + var_462884 = 600; + if (Game_Flag_Query(199) == 1) { + var_45D5B4_animation_frame = 0; + } + } else if (var_45D5B0_animation_state < 11 || var_45D5B0_animation_state > 19) { + var_45D5B0_animation_state = 19; + var_45D5B4_animation_frame = 0; + var_45D5BC = 0; + } + break; + case 18: + if (var_45D5B0_animation_state == 0 || var_45D5B0_animation_state == 1) { + var_45D5B0_animation_state = 2; + var_462880 = 18; + var_462884 = 599; + if (Game_Flag_Query(199) == 1) { + var_45D5B4_animation_frame = 0; + } + } else if (var_45D5B0_animation_state < 11 || var_45D5B0_animation_state > 19) { + var_45D5B0_animation_state = 18; + var_45D5B4_animation_frame = 0; + var_45D5BC = 0; + } + break; + case 17: + if (var_45D5B0_animation_state == 0 || var_45D5B0_animation_state == 1) { + var_45D5B0_animation_state = 2; + var_462880 = 17; + var_462884 = 598; + if (Game_Flag_Query(199) == 1) { + var_45D5B4_animation_frame = 0; + } + } else if (var_45D5B0_animation_state < 11 || var_45D5B0_animation_state > 19) { + var_45D5B0_animation_state = 17; + var_45D5B4_animation_frame = 0; + var_45D5BC = 0; + } + break; + case 16: + if (var_45D5B0_animation_state == 0 || var_45D5B0_animation_state == 1) { + var_45D5B0_animation_state = 2; + var_462880 = 16; + var_462884 = 597; + if (Game_Flag_Query(199) == 1) { + var_45D5B4_animation_frame = 0; + } + } else if (var_45D5B0_animation_state < 11 || var_45D5B0_animation_state > 19) { + var_45D5B0_animation_state = 16; + var_45D5B4_animation_frame = 0; + var_45D5BC = 0; + } + break; + case 15: + if (var_45D5B0_animation_state == 0 || var_45D5B0_animation_state == 1) { + var_45D5B0_animation_state = 2; + var_462880 = 15; + var_462884 = 596; + if (Game_Flag_Query(199) == 1) { + var_45D5B4_animation_frame = 0; + } + } else if (var_45D5B0_animation_state < 11 || var_45D5B0_animation_state > 19) { + var_45D5B0_animation_state = 15; + var_45D5B4_animation_frame = 0; + var_45D5BC = 0; + } + break; + case 14: + if (var_45D5B0_animation_state == 0 || var_45D5B0_animation_state == 1) { + var_45D5B0_animation_state = 2; + var_462880 = 14; + var_462884 = 595; + if (Game_Flag_Query(199) == 1) { + var_45D5B4_animation_frame = 0; + } + } else if (var_45D5B0_animation_state < 11 || var_45D5B0_animation_state > 19) { + var_45D5B0_animation_state = 14; + var_45D5B4_animation_frame = 0; + var_45D5BC = 0; + } + break; + case 13: + if (var_45D5B0_animation_state == 0 || var_45D5B0_animation_state == 1) { + var_45D5B0_animation_state = 2; + var_462880 = 13; + var_462884 = 594; + if (Game_Flag_Query(199) == 1) { + var_45D5B4_animation_frame = 0; + } + } else if (var_45D5B0_animation_state < 11 || var_45D5B0_animation_state > 19) { + var_45D5B0_animation_state = 13; + var_45D5B4_animation_frame = 0; + var_45D5BC = 0; + } + break; + case 12: + if (var_45D5B0_animation_state == 0 || var_45D5B0_animation_state == 1) { + var_45D5B0_animation_state = 2; + var_462880 = 12; + var_462884 = 593; + if (Game_Flag_Query(199) == 1) { + var_45D5B4_animation_frame = 0; + } + } else if (var_45D5B0_animation_state < 11 || var_45D5B0_animation_state > 19) { + var_45D5B0_animation_state = 12; + var_45D5B4_animation_frame = 0; + var_45D5BC = 0; + } + break; + case 8: + var_45D5B0_animation_state = 8; + var_45D5B4_animation_frame = 0; + break; + case 7: + var_45D5B0_animation_state = 7; + var_45D5B4_animation_frame = 0; + break; + case 6: + var_45D5B0_animation_state = 24; + var_45D5B4_animation_frame = 0; + break; + case 4: + switch (var_45D5B0_animation_state) { + case 21: + case 22: + case 24: + return true; + case 7: + case 8: + case 9: + case 10: + var_45D5B0_animation_state = 21; + var_45D5B4_animation_frame = 0; + break; + case 0: + var_45D5B0_animation_state = 22; + var_45D5B4_animation_frame = 0; + break; + default: + var_45D5B0_animation_state = 21; + var_45D5B4_animation_frame = 0; + break; + } + break; + case 3: + if (var_45D5B0_animation_state == 0 || var_45D5B0_animation_state == 1) { + var_45D5B0_animation_state = 2; + var_462880 = 11; + var_462884 = 592; + if (Game_Flag_Query(199) == 1) { + var_45D5B4_animation_frame = 0; + } + } else if (var_45D5B0_animation_state < 11 || var_45D5B0_animation_state > 19) { + var_45D5B0_animation_state = 11; + var_45D5B4_animation_frame = 0; + var_45D5BC = 0; + } + break; + case 2: + var_45D5B0_animation_state = 4; + var_45D5B4_animation_frame = 0; + break; + case 1: + var_45D5B0_animation_state = 3; + var_45D5B4_animation_frame = 0; + break; + case 0: + switch (var_45D5B0_animation_state) { + case 21: + case 24: + var_45D5B0_animation_state = 23; + var_45D5B4_animation_frame = 0; + break; + case 20: + v1 = var_45D5B4_animation_frame; + Actor_Change_Animation_Mode(23, 4); + var_45D5B4_animation_frame = v1; + var_45D5B0_animation_state = 21; + break; + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + var_45D5BC = 1; + break; + case 0: + case 23: + return true; + default: + var_45D5B0_animation_state = 0; + var_45D5B4_animation_frame = 0; + var_45D5B8 = Random_Query(0, 1); + break; + } + break; + case 5: + case 9: + case 10: + case 11: + case 20: + case 23: + case 24: + case 25: + case 26: + return true; + default: + switch (mode) { + case 58: + var_45D5B0_animation_state = 20; + var_45D5B4_animation_frame = 0; + break; + case 48: + if (var_45D5B0_animation_state == 21 || var_45D5B0_animation_state == 22 || var_45D5B0_animation_state == 24) { + var_45D5B0_animation_state = 28; + var_45D5B4_animation_frame = 0; + } else { + var_45D5B0_animation_state = 27; + var_45D5B4_animation_frame = 0; + } + break; + case 47: + var_45D5B0_animation_state = 10; + var_45D5B4_animation_frame = 0; + break; + case 46: + var_45D5B0_animation_state = 9; + var_45D5B4_animation_frame = 0; + break; + case 45: + var_45D5B0_animation_state = 6; + var_45D5B4_animation_frame = 0; + break; + case 44: + var_45D5B0_animation_state = 5; + var_45D5B4_animation_frame = 0; + break; + default: + return true; + } + break; + } + return true; +} + +void AIScript_Officer_Leroy::QueryAnimationState(int *animationState, int *animationFrame, int *a3, int *a4) { + *animationState = var_45D5B0_animation_state; + *animationFrame = var_45D5B4_animation_frame; + *a3 = var_462880; + *a4 = var_462884; +} + +void AIScript_Officer_Leroy::SetAnimationState(int animationState, int animationFrame, int a3, int a4) { + var_45D5B0_animation_state = animationState; + var_45D5B4_animation_frame = animationFrame; + var_462880 = a3; + var_462884 = a4; +} + +bool AIScript_Officer_Leroy::ReachedMovementTrackWaypoint(int a1) { + if (a1 == 57 || a1 == 58) { + sub_431408(); + AI_Countdown_Timer_Reset(23, 2); + AI_Countdown_Timer_Start(23, 2, 6); + } + return true; +} + +void AIScript_Officer_Leroy::FledCombat() { + Actor_Set_Goal_Number(23, 300); +} + +bool AIScript_Officer_Leroy::sub_431408() { + Game_Flag_Set(199); + return true; +} + +bool AIScript_Officer_Leroy::sub_431420() { + Game_Flag_Reset(199); + return true; +} +} // End of namespace BladeRunner diff --git a/engines/bladerunner/script/ai_23_officer_leroy.h b/engines/bladerunner/script/ai_23_officer_leroy.h new file mode 100644 index 0000000000..a38d869ac1 --- /dev/null +++ b/engines/bladerunner/script/ai_23_officer_leroy.h @@ -0,0 +1,66 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "bladerunner/script/script.h" + +#include "bladerunner/bladerunner.h" + +namespace BladeRunner { + +class AIScript_Officer_Leroy : public AIScriptBase { + int var_45D5B0_animation_state; + int var_45D5B4_animation_frame; + int var_45D5B8; + int var_45D5BC; + int var_462880; + int var_462884; +public: + AIScript_Officer_Leroy(BladeRunnerEngine *vm); + + void Initialize(); + bool Update(); + void TimerExpired(int timer); + void CompletedMovementTrack(); + void ReceivedClue(int clueId, int fromActorId); + void ClickedByPlayer(); + void EnteredScene(int sceneId); + void OtherAgentEnteredThisScene(); + void OtherAgentExitedThisScene(); + void OtherAgentEnteredCombatMode(); + void ShotAtAndMissed(); + void ShotAtAndHit(); + void Retired(int byActorId); + int GetFriendlinessModifierIfGetsClue(int otherActorId, int clueId); + bool GoalChanged(int currentGoalNumber, int newGoalNumber); + bool UpdateAnimation(int *animation, int *frame); + bool ChangeAnimationMode(int mode); + void QueryAnimationState(int *animationState, int *animationFrame, int *a3, int *a4); + void SetAnimationState(int animationState, int animationFrame, int a3, int a4); + bool ReachedMovementTrackWaypoint(int a1); + void FledCombat(); + +private: + bool sub_431408(); + bool sub_431420(); +}; + +} // End of namespace BladeRunner diff --git a/engines/bladerunner/script/aiscript_officer_leroy.cpp b/engines/bladerunner/script/aiscript_officer_leroy.cpp deleted file mode 100644 index 7881984154..0000000000 --- a/engines/bladerunner/script/aiscript_officer_leroy.cpp +++ /dev/null @@ -1,134 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "bladerunner/script/aiscript_officer_leroy.h" - -namespace BladeRunner { - -AIScript_Officer_Leroy::AIScript_Officer_Leroy(BladeRunnerEngine *vm) - : AIScriptBase(vm) { -} - -void AIScript_Officer_Leroy::Initialize() { - var_45D5B0_animation_state = 0; - var_45D5B4_frame = 0; - var_45D5B8 = 0; - - Actor_Put_In_Set(23, 69); - Actor_Set_At_XYZ(23, -261.80f, 6.00f, 79.58f, 512); - // Actor_Set_Goal_Number(23, 0); - // Actor_Set_Frame_Rate_FPS(23, 8); -} - -bool AIScript_Officer_Leroy::Update() { - return false; -} - -void AIScript_Officer_Leroy::TimerExpired(int timer) { -} - -void AIScript_Officer_Leroy::CompletedMovementTrack() { -} - -void AIScript_Officer_Leroy::ReceivedClue(int clueId, int fromActorId) { -} - -void AIScript_Officer_Leroy::ClickedByPlayer() { -} - -void AIScript_Officer_Leroy::EnteredScene(int sceneId) { -} - -void AIScript_Officer_Leroy::OtherAgentEnteredThisScene() { -} - -void AIScript_Officer_Leroy::OtherAgentExitedThisScene() { -} - -void AIScript_Officer_Leroy::OtherAgentEnteredCombatMode() { -} - -void AIScript_Officer_Leroy::ShotAtAndMissed() { -} - -void AIScript_Officer_Leroy::ShotAtAndHit() { -} - -void AIScript_Officer_Leroy::Retired(int byActorId) { -} - -void AIScript_Officer_Leroy::GetFriendlinessModifierIfGetsClue() { -} - -bool AIScript_Officer_Leroy::GoalChanged(int currentGoalNumber, int newGoalNumber) { - return false; -} - -bool AIScript_Officer_Leroy::UpdateAnimation(int *animation, int *frame) { - if (var_45D5B8 == 0) { - *animation = 589; - var_45D5B4_frame++; - - if (var_45D5B4_frame >= Slice_Animation_Query_Number_Of_Frames(589)) { - var_45D5B4_frame = 0; - var_45D5B8 = Random_Query(0, 2); - } - } else if (var_45D5B8 == 1) { - *animation = 590; - var_45D5B4_frame++; - - if (var_45D5B4_frame >= Slice_Animation_Query_Number_Of_Frames(590)) { - var_45D5B4_frame = 0; - var_45D5B8 = Random_Query(0, 2); - } - } else if (var_45D5B8 == 2) { - *animation = 591; - var_45D5B4_frame++; - - if (var_45D5B4_frame >= Slice_Animation_Query_Number_Of_Frames(591)) { - var_45D5B4_frame = 0; - var_45D5B8 = Random_Query(0, 2); - } - } - *frame = var_45D5B4_frame; - return true; -} - -bool AIScript_Officer_Leroy::ChangeAnimationMode(int mode) { - switch (mode) { - case 1: - var_45D5B0_animation_state = 32; - break; - } - return true; -} - -void AIScript_Officer_Leroy::QueryAnimationState(int *animationState, int *a2, int *a3, int *a4) { -} - -void AIScript_Officer_Leroy::SetAnimationState(int animationState, int a2, int a3, int a4) { -} - -bool AIScript_Officer_Leroy::ReachedMovementTrackWaypoint() { - return false; -} -} // End of namespace BladeRunner diff --git a/engines/bladerunner/script/aiscript_officer_leroy.h b/engines/bladerunner/script/aiscript_officer_leroy.h deleted file mode 100644 index 152ba83463..0000000000 --- a/engines/bladerunner/script/aiscript_officer_leroy.h +++ /dev/null @@ -1,58 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "bladerunner/script/script.h" - -#include "bladerunner/bladerunner.h" - -namespace BladeRunner { - -class AIScript_Officer_Leroy : public AIScriptBase { - int var_45D5B0_animation_state; - int var_45D5B4_frame; - int var_45D5B8; -public: - AIScript_Officer_Leroy(BladeRunnerEngine *vm); - - void Initialize(); - bool Update(); - void TimerExpired(int timer); - void CompletedMovementTrack(); - void ReceivedClue(int clueId, int fromActorId); - void ClickedByPlayer(); - void EnteredScene(int sceneId); - void OtherAgentEnteredThisScene(); - void OtherAgentExitedThisScene(); - void OtherAgentEnteredCombatMode(); - void ShotAtAndMissed(); - void ShotAtAndHit(); - void Retired(int byActorId); - void GetFriendlinessModifierIfGetsClue(); - bool GoalChanged(int currentGoalNumber, int newGoalNumber); - bool UpdateAnimation(int *animation, int *frame); - bool ChangeAnimationMode(int mode); - void QueryAnimationState(int *animationState, int *a2, int *a3, int *a4); - void SetAnimationState(int animationState, int a2, int a3, int a4); - bool ReachedMovementTrackWaypoint(); -}; - -} // End of namespace BladeRunner diff --git a/engines/bladerunner/script/script.cpp b/engines/bladerunner/script/script.cpp index 45b23120d5..b631058f36 100644 --- a/engines/bladerunner/script/script.cpp +++ b/engines/bladerunner/script/script.cpp @@ -48,7 +48,7 @@ #include "bladerunner/waypoints.h" #include "bladerunner/script/ai_00_mccoy.h" -#include "bladerunner/script/aiscript_officer_leroy.h" +#include "bladerunner/script/ai_23_officer_leroy.h" namespace BladeRunner { @@ -500,11 +500,11 @@ bool ScriptBase::Actor_Query_In_Between_Two_Actors(int actorId, int otherActor1I float z1 = _vm->_actors[otherActor1Id]->getZ(); float x2 = _vm->_actors[otherActor2Id]->getX(); float z2 = _vm->_actors[otherActor2Id]->getZ(); - return _vm->_sceneObjects->isBetweenTwoXZ(actorId, x1, z1, x2, z1) - || _vm->_sceneObjects->isBetweenTwoXZ(actorId, x1 - 12.0f, z1 - 12.0f, x2 - 12.0f, z2 - 12.0f) - || _vm->_sceneObjects->isBetweenTwoXZ(actorId, x1 + 12.0f, z1 - 12.0f, x2 + 12.0f, z2 - 12.0f) - || _vm->_sceneObjects->isBetweenTwoXZ(actorId, x1 + 12.0f, z1 + 12.0f, x2 + 12.0f, z2 + 12.0f) - || _vm->_sceneObjects->isBetweenTwoXZ(actorId, x1 - 12.0f, z1 + 12.0f, x2 - 12.0f, z2 + 12.0f); + return _vm->_sceneObjects->isBetweenTwoXZ(actorId + SCENE_OBJECTS_ACTORS_OFFSET, x1, z1, x2, z1) + || _vm->_sceneObjects->isBetweenTwoXZ(actorId + SCENE_OBJECTS_ACTORS_OFFSET, x1 - 12.0f, z1 - 12.0f, x2 - 12.0f, z2 - 12.0f) + || _vm->_sceneObjects->isBetweenTwoXZ(actorId + SCENE_OBJECTS_ACTORS_OFFSET, x1 + 12.0f, z1 - 12.0f, x2 + 12.0f, z2 - 12.0f) + || _vm->_sceneObjects->isBetweenTwoXZ(actorId + SCENE_OBJECTS_ACTORS_OFFSET, x1 + 12.0f, z1 + 12.0f, x2 + 12.0f, z2 + 12.0f) + || _vm->_sceneObjects->isBetweenTwoXZ(actorId + SCENE_OBJECTS_ACTORS_OFFSET, x1 - 12.0f, z1 + 12.0f, x2 - 12.0f, z2 + 12.0f); } void ScriptBase::Actor_Set_Goal_Number(int actorId, int goalNumber) { @@ -542,26 +542,61 @@ int ScriptBase::Actor_Query_Animation_Mode(int actorId) { } bool ScriptBase::Loop_Actor_Walk_To_Actor(int actorId, int otherActorId, int a3, int a4, bool run) { - //TODO - warning("Loop_Actor_Walk_To_Actor(%d, %d, %d, %d, %d)", actorId, otherActorId, a3, a4, run); - return false; + _vm->gameWaitForActive(); + + if (actorId == _vm->_walkingActorId) { + run = true; + } + _vm->_playerActorIdle = false; + bool isRunning; + bool result = _vm->_actors[actorId]->loopWalkToActor(otherActorId, a3, a4, run, true, &isRunning); + if (_vm->_playerActorIdle) { + result = true; + _vm->_playerActorIdle = false; + } + if (isRunning == 1) { + _vm->_walkingActorId = actorId; + } + Global_Variable_Set(37, actorId); + Global_Variable_Set(38, isRunning); + return result; } bool ScriptBase::Loop_Actor_Walk_To_Item(int actorId, int itemId, int a3, int a4, bool run) { - //TODO - warning("Loop_Actor_Walk_To_Item(%d, %d, %d, %d, %d)", actorId, itemId, a3, a4, run); - return false; + _vm->gameWaitForActive(); + + if (_vm->_walkingActorId == actorId) { + run = true; + } + _vm->_playerActorIdle = false; + bool isRunning; + bool result = _vm->_actors[actorId]->loopWalkToItem(itemId, a3, a4, run, true, &isRunning); + if (_vm->_playerActorIdle == 1) { + result = true; + _vm->_playerActorIdle = false; + } + if (isRunning == 1) { + _vm->_walkingActorId = actorId; + } + Global_Variable_Set(37, actorId); + Global_Variable_Set(38, isRunning); + return result; } bool ScriptBase::Loop_Actor_Walk_To_Scene_Object(int actorId, const char *objectName, int destinationOffset, bool a4, bool run) { _vm->gameWaitForActive(); - if(_vm->_walkingActorId == actorId) { + if (_vm->_walkingActorId == actorId) { run = true; } + _vm->_playerActorIdle = false; bool isRunning; bool result = _vm->_actors[actorId]->loopWalkToSceneObject(objectName, destinationOffset, a4, run, true, &isRunning); - if(isRunning == 1) { + if (_vm->_playerActorIdle) { + result = true; + _vm->_playerActorIdle = false; + } + if (isRunning == 1) { _vm->_walkingActorId = actorId; } Global_Variable_Set(37, actorId); @@ -1243,7 +1278,7 @@ void ScriptBase::Actor_Retired_Here(int actorId, int width, int height, int reti actor->getXYZ(&actorPosition.x, &actorPosition.y, &actorPosition.z); actor->retire(retired, width, height, retiredByActorId); actor->setAtXYZ(actorPosition, actor->getFacing(), true, 0, true); - _vm->_sceneObjects->setRetired(actorId, true); + _vm->_sceneObjects->setRetired(actorId + SCENE_OBJECTS_ACTORS_OFFSET, true); } void ScriptBase::Clickable_Object(const char *objectName) { diff --git a/engines/bladerunner/script/script.h b/engines/bladerunner/script/script.h index 5966b67868..40f1f12a2c 100644 --- a/engines/bladerunner/script/script.h +++ b/engines/bladerunner/script/script.h @@ -827,13 +827,14 @@ public: virtual void ShotAtAndMissed() = 0; virtual void ShotAtAndHit() = 0; virtual void Retired(int byActorId) = 0; - virtual void GetFriendlinessModifierIfGetsClue() = 0; + virtual int GetFriendlinessModifierIfGetsClue(int otherActorId, int clueId) = 0; virtual bool GoalChanged(int currentGoalNumber, int newGoalNumber) = 0; virtual bool UpdateAnimation(int *animation, int *frame) = 0; virtual bool ChangeAnimationMode(int mode) = 0; virtual void QueryAnimationState(int *animationState, int *a2, int *a3, int *a4) = 0; virtual void SetAnimationState(int animationState, int a2, int a3, int a4) = 0; - virtual bool ReachedMovementTrackWaypoint() = 0; + virtual bool ReachedMovementTrackWaypoint(int a1) = 0; + virtual void FledCombat() = 0; }; class AIScripts { -- cgit v1.2.3