diff options
author | Peter Kohaut | 2017-03-20 22:55:31 +0100 |
---|---|---|
committer | Peter Kohaut | 2017-03-20 22:55:31 +0100 |
commit | dd7498544f60ecf32d89c19b95eee105fbfb79ab (patch) | |
tree | a2c3b9fae78c1de665b75e64d992031c8b263fe2 | |
parent | ccc6cbfb9106d17777422aa4b3c10d19d5330328 (diff) | |
download | scummvm-rg350-dd7498544f60ecf32d89c19b95eee105fbfb79ab.tar.gz scummvm-rg350-dd7498544f60ecf32d89c19b95eee105fbfb79ab.tar.bz2 scummvm-rg350-dd7498544f60ecf32d89c19b95eee105fbfb79ab.zip |
BLADERUNNER: added Runciter character (petshop owner)
-rw-r--r-- | engines/bladerunner/actor.cpp | 27 | ||||
-rw-r--r-- | engines/bladerunner/actor.h | 1 | ||||
-rw-r--r-- | engines/bladerunner/bladerunner.cpp | 65 | ||||
-rw-r--r-- | engines/bladerunner/bladerunner.h | 1 | ||||
-rw-r--r-- | engines/bladerunner/module.mk | 1 | ||||
-rw-r--r-- | engines/bladerunner/script/ai_00_mccoy.cpp | 6 | ||||
-rw-r--r-- | engines/bladerunner/script/ai_00_mccoy.h | 6 | ||||
-rw-r--r-- | engines/bladerunner/script/ai_15_runciter.cpp | 656 | ||||
-rw-r--r-- | engines/bladerunner/script/ai_15_runciter.h | 65 | ||||
-rw-r--r-- | engines/bladerunner/script/ai_23_officer_leroy.cpp | 6 | ||||
-rw-r--r-- | engines/bladerunner/script/ai_23_officer_leroy.h | 6 | ||||
-rw-r--r-- | engines/bladerunner/script/script.cpp | 89 | ||||
-rw-r--r-- | engines/bladerunner/script/script.h | 30 |
13 files changed, 899 insertions, 60 deletions
diff --git a/engines/bladerunner/actor.cpp b/engines/bladerunner/actor.cpp index 96a76bf4be..bdcef02e92 100644 --- a/engines/bladerunner/actor.cpp +++ b/engines/bladerunner/actor.cpp @@ -530,16 +530,16 @@ void Actor::setSetId(int setId) { if (_setId > 0) { for (i = 0; i < (int)_vm->_gameInfo->getActorCount(); i++) { if (_vm->_actors[i]->_id != _id && _vm->_actors[i]->_setId == _setId) { - // TODO: _vm->_aiScripts->OtherAgentExitedThisScene( i, _id); + _vm->_aiScripts->OtherAgentExitedThisScene(i, _id); } } } _setId = setId; - // TODO: _vm->_aiScripts->EnteredScene(_id, set); + _vm->_aiScripts->EnteredScene(_id, _setId); if (_setId > 0) { for (i = 0; i < (int)_vm->_gameInfo->getActorCount(); i++) { if (_vm->_actors[i]->_id != _id && _vm->_actors[i]->_setId == _setId) { - // TODO: _vm->_aiScripts->OtherAgentEnteredThisScene(i, _id); + _vm->_aiScripts->OtherAgentEnteredThisScene(i, _id); } } } @@ -851,11 +851,11 @@ int Actor::getAnimationMode() { } void Actor::setGoal(int goalNumber) { - if (goalNumber == _goalNumber) + if (goalNumber == _goalNumber) { return; + } - //TODO: _vm->actorScript->GoalChanged(_id, _goalNumber, goalNumber); - + _vm->_aiScripts->GoalChanged(_id, _goalNumber, goalNumber); _vm->_script->ActorChangedGoal(_id, goalNumber, _goalNumber, _vm->_scene->getSetId() == _setId); } @@ -943,6 +943,12 @@ int Actor::countdownTimerGetRemainingTime(int timerId) { return _timersRemain[timerId]; } +void Actor::countdownTimersUpdate() { + for (int i = 0; i <= 6; i++) { + countdownTimerUpdate(i); + } +} + void Actor::countdownTimerUpdate(int timerId) { if (_timersRemain[timerId] == 0) return; @@ -959,7 +965,14 @@ void Actor::countdownTimerUpdate(int timerId) { case 0: case 1: case 2: - // AI timers, call AI dll + if (!_vm->_aiScripts->IsInsideScript() && !_vm->_script->IsInsideScript()) { + _vm->_aiScripts->TimerExpired(this->_id, timerId); + this->_timersRemain[timerId] = 0; + //return false; + } else { + this->_timersRemain[timerId] = 1; + //return true; + } break; case 3: // Movement track timer diff --git a/engines/bladerunner/actor.h b/engines/bladerunner/actor.h index b2b52c623d..a14139cf3d 100644 --- a/engines/bladerunner/actor.h +++ b/engines/bladerunner/actor.h @@ -136,6 +136,7 @@ public: void countdownTimerStart(int timerId, int interval); void countdownTimerReset(int timerId); int countdownTimerGetRemainingTime(int timerId); + void countdownTimersUpdate(); void countdownTimerUpdate(int timerId); int getSetId(); diff --git a/engines/bladerunner/bladerunner.cpp b/engines/bladerunner/bladerunner.cpp index e60fe77d26..b2f7abc744 100644 --- a/engines/bladerunner/bladerunner.cpp +++ b/engines/bladerunner/bladerunner.cpp @@ -60,7 +60,7 @@ #include "engines/util.h" #include "graphics/pixelformat.h" -#include "suspects_database.h" +#include "suspects_database.h" namespace BladeRunner { @@ -337,7 +337,7 @@ bool BladeRunnerEngine::startup(bool hasSavegames) { initScript.SCRIPT_Initialize_Game(); // TODO: Load AI-ACT1.DLL - _aiScripts = new AIScripts(this); + _aiScripts = new AIScripts(this, actorCount); initChapterAndScene(); @@ -619,17 +619,20 @@ void BladeRunnerEngine::gameTick() { #endif // TODO: Render overlays - // TODO: Tick Actor AI and Timers - if (_settings->getNewScene() == -1 || _script->_inScriptCounter /* || in_ai */) { + //if (!dialogueMenu) + actorsUpdate(); + + if (_settings->getNewScene() == -1 || _script->IsInsideScript() || _aiScripts->IsInsideScript()) { _sliceRenderer->setView(*_view); // Tick and draw all actors in current set - //int setId = _scene->_setId; + int setId = _scene->getSetId(); for (int i = 0, end = _gameInfo->getActorCount(); i != end; ++i) { - //if (_actors[i]->getSetId() == setId) { - if (i == 0 || i == 23) { // Currently limited to McCoy and Officer Leroy - _actors[i]->tick(backgroundChanged); + if (_actors[i]->getSetId() == setId) { + if (i == 0 || i == 15 || i == 23) { // Currently limited to McCoy, Runciter and Officer Leroy + _actors[i]->tick(backgroundChanged); + } } } @@ -724,16 +727,30 @@ void BladeRunnerEngine::gameTick() { } - for (int i = 0; i < (int)_lights->_lights.size(); i++) { - Light *light = _lights->_lights[i]; - Matrix4x3 m = light->_matrix; - Vector3 pos = Vector3(m(0, 3), m(1, 3), m(2, 3)); +// for (int i = 0; i < (int)_lights->_lights.size(); i++) { +// Light *light = _lights->_lights[i]; +// Matrix4x3 m = light->_matrix; +// Vector3 pos = Vector3(m(0, 3), m(1, 3), m(2, 3)); +// Vector3 size = Vector3(5.0f, 5.0f, 5.0f); +// int colorR = (light->_color.r * 31.0f); +// int colorG = (light->_color.g * 31.0f); +// int colorB = (light->_color.b * 31.0f); +// int color = (colorR << 10) + (colorG << 5) + colorB; +// drawBBox(pos - size, pos + size, _view, &_surface2, color); +// } + + for(int i = 0; i < _waypoints->_count; i++) { + Waypoint *waypoint = &_waypoints->_waypoints[i]; + if(waypoint->_setId != _scene->getSetId()) + continue; + Vector3 pos = waypoint->_position; Vector3 size = Vector3(5.0f, 5.0f, 5.0f); - int colorR = (light->_color.r * 31.0f); - int colorG = (light->_color.g * 31.0f); - int colorB = (light->_color.b * 31.0f); - int color = (colorR << 10) + (colorG << 5) + colorB; + int color = 0b111111111111111; drawBBox(pos - size, pos + size, _view, &_surface2, color); + Vector3 spos = _view->calculateScreenPosition(pos); + char waypointText[40]; + sprintf(waypointText, "waypoint %i", i); + _mainFont->drawColor(waypointText, _surface2, spos.x, spos.y, color); } #endif @@ -745,6 +762,22 @@ void BladeRunnerEngine::gameTick() { } } +void BladeRunnerEngine::actorsUpdate() { + int actorCount = (int)_gameInfo->getActorCount(); + int setId = _scene->getSetId(); + + //TODO: original game updates every non-visible characters by updating only one character in one frame + if (setId != 89 || _gameVars[1] != 4 || _gameFlags->query(670) != 1 || !_aiScripts->IsInsideScript()) { + for (int i = 0; i < actorCount; i++) { + Actor *actor = _actors[i]; + if (actor->getSetId() == setId) { + _aiScripts->Update(i); + actor->countdownTimersUpdate(); + } + } + } +} + void BladeRunnerEngine::handleEvents() { if (shouldQuit()) { _gameIsRunning = false; diff --git a/engines/bladerunner/bladerunner.h b/engines/bladerunner/bladerunner.h index 23ea88b43a..0aab57625b 100644 --- a/engines/bladerunner/bladerunner.h +++ b/engines/bladerunner/bladerunner.h @@ -155,6 +155,7 @@ public: void gameLoop(); void gameTick(); + void actorsUpdate(); void handleEvents(); void handleMouseClick(int x, int y); void handleMouseClickExit(int x, int y, int exitIndex); diff --git a/engines/bladerunner/module.mk b/engines/bladerunner/module.mk index 31577da2b6..f8394e9318 100644 --- a/engines/bladerunner/module.mk +++ b/engines/bladerunner/module.mk @@ -39,6 +39,7 @@ MODULE_OBJS = \ scene.o \ scene_objects.o \ script/ai_00_mccoy.o \ + script/ai_15_runciter.o \ script/ai_23_officer_leroy.o \ script/init.o \ script/kia.o \ diff --git a/engines/bladerunner/script/ai_00_mccoy.cpp b/engines/bladerunner/script/ai_00_mccoy.cpp index f0081a528e..52f9c4009e 100644 --- a/engines/bladerunner/script/ai_00_mccoy.cpp +++ b/engines/bladerunner/script/ai_00_mccoy.cpp @@ -211,13 +211,13 @@ void AIScript_McCoy::ClickedByPlayer() { void AIScript_McCoy::EnteredScene(int sceneId) { } -void AIScript_McCoy::OtherAgentEnteredThisScene() { +void AIScript_McCoy::OtherAgentEnteredThisScene(int otherActorId) { } -void AIScript_McCoy::OtherAgentExitedThisScene() { +void AIScript_McCoy::OtherAgentExitedThisScene(int otherActorId) { } -void AIScript_McCoy::OtherAgentEnteredCombatMode() { +void AIScript_McCoy::OtherAgentEnteredCombatMode(int otherActorId, int combatMode) { } void AIScript_McCoy::ShotAtAndMissed() { diff --git a/engines/bladerunner/script/ai_00_mccoy.h b/engines/bladerunner/script/ai_00_mccoy.h index 43fa049cda..2fda82f2de 100644 --- a/engines/bladerunner/script/ai_00_mccoy.h +++ b/engines/bladerunner/script/ai_00_mccoy.h @@ -54,9 +54,9 @@ public: void ReceivedClue(int clueId, int fromActorId); void ClickedByPlayer(); void EnteredScene(int sceneId); - void OtherAgentEnteredThisScene(); - void OtherAgentExitedThisScene(); - void OtherAgentEnteredCombatMode(); + void OtherAgentEnteredThisScene(int otherActorId); + void OtherAgentExitedThisScene(int otherActorId); + void OtherAgentEnteredCombatMode(int otherActorId, int combatMode); void ShotAtAndMissed(); void ShotAtAndHit(); void Retired(int byActorId); diff --git a/engines/bladerunner/script/ai_15_runciter.cpp b/engines/bladerunner/script/ai_15_runciter.cpp new file mode 100644 index 0000000000..f4cffd834f --- /dev/null +++ b/engines/bladerunner/script/ai_15_runciter.cpp @@ -0,0 +1,656 @@ +/* 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_15_runciter.h" + +namespace BladeRunner { + +AIScript_Runciter::AIScript_Runciter(BladeRunnerEngine *vm) + : AIScriptBase(vm) {} + +void AIScript_Runciter::Initialize() { + var_45CD70_animation_state = 0; + var_45CD74_animation_frame = 0; + var_462800 = 0; + var_45CD78 = 0; + var_45CD7C = 6; + var_45CD80 = 1; + var_45CD84 = 0; + var_45CD88 = 0; + Actor_Set_Goal_Number(15, 0); +} + +bool AIScript_Runciter::Update() { + if (Actor_Query_Goal_Number(15) == 0 && Game_Flag_Query(186)) { + Actor_Set_Goal_Number(15, 2); + } + if (Global_Variable_Query(1) == 4 && Actor_Query_Goal_Number(15) < 300) { + Actor_Set_Goal_Number(15, 300); + } + return false; +} + +void AIScript_Runciter::TimerExpired(int timer) {} + +void AIScript_Runciter::CompletedMovementTrack() { + if (Actor_Query_Goal_Number(15) == 1) { + if (Player_Query_Current_Scene() == 79) { + switch (Random_Query(1, 5)) { + case 2: + case 3: + ADQ_Add(15, 530, -1); + break; + case 1: + case 5: + ADQ_Add(15, 80, -1); + break; + case 4: + ADQ_Add(15, 930, -1); + break; + } + } + Actor_Set_Goal_Number(15, 99); + Actor_Set_Goal_Number(15, 1); + //return true; + } + //return false; +} + +void AIScript_Runciter::ReceivedClue(int clueId, int fromActorId) {} + +void AIScript_Runciter::ClickedByPlayer() {} + +void AIScript_Runciter::EnteredScene(int sceneId) {} + +void AIScript_Runciter::OtherAgentEnteredThisScene(int otherActorId) {} + +void AIScript_Runciter::OtherAgentExitedThisScene(int otherActorId) {} + +void AIScript_Runciter::OtherAgentEnteredCombatMode(int otherActorId, int combatMode) { + if (Actor_Query_Goal_Number(15) == 300 && combatMode == 1 && !Game_Flag_Query(705)) { + Actor_Set_Targetable(15, true); + Actor_Face_Actor(15, 0, true); + Actor_Says(15, 420, 12); + Actor_Face_Actor(0, 15, true); + Actor_Change_Animation_Mode(0, 5); + if (Actor_Clue_Query(0, 158)) { + Actor_Says(0, 4770, -1); + Actor_Says(15, 590, 13); + Actor_Says(0, 4775, -1); + Actor_Says(15, 600, 17); + Sound_Play(492, 100, 0, 100, 50); + Actor_Says(0, 4780, -1); + Actor_Says(15, 610, 18); + Actor_Says(0, 4785, -1); + Actor_Says(15, 620, 15); + if (Game_Flag_Query(46)) { + Actor_Says(15, 630, 12); + Actor_Says(15, 640, 17); + Actor_Says(0, 4790, -1); + Actor_Says(15, 650, 18); + Actor_Says(15, 660, 19); + Actor_Clue_Acquire(0, 280, 1, 15); + } else { + Actor_Says(15, 670, 18); + Actor_Says(0, 4795, -1); + Actor_Says(15, 730, 17); + } + } else if (Actor_Clue_Query(0, 76)) { + Actor_Says(0, 4730, -1); + Actor_Says(15, 480, 17); + Actor_Says(0, 4735, -1); + Actor_Says(15, 490, 16); + Sound_Play(492, 100, 0, 100, 50); + Actor_Says(0, 4740, -1); + Actor_Says(15, 500, 18); + Actor_Says(15, 510, 19); + Actor_Says(0, 4745, -1); + Actor_Says(0, 4750, -1); + Actor_Says(15, 520, 17); + Actor_Says(15, 530, 18); + Actor_Says(15, 540, 16); + } + Game_Flag_Set(705); + } +} + +void AIScript_Runciter::ShotAtAndMissed() {} + +void AIScript_Runciter::ShotAtAndHit() { + Actor_Set_Targetable(15, false); + Actor_Change_Animation_Mode(15, 48); + Actor_Set_Goal_Number(15, 599); + Delay(2000); + if (Actor_Clue_Query(0, 158)) { + Actor_Voice_Over(2050, 99); + Actor_Voice_Over(2060, 99); + } else { + Actor_Voice_Over(2070, 99); + Actor_Voice_Over(2080, 99); + Actor_Voice_Over(2090, 99); + } + Actor_Modify_Friendliness_To_Other(5, 0, 3); +} + +void AIScript_Runciter::Retired(int byActorId) {} + +int AIScript_Runciter::GetFriendlinessModifierIfGetsClue(int otherActorId, int clueId) { + return 0; +} + +bool AIScript_Runciter::GoalChanged(int currentGoalNumber, int newGoalNumber) { + if (newGoalNumber == 0) { + Actor_Put_In_Set(15, 16); + Actor_Set_At_Waypoint(15, 92, 567); + return false; + } + if (newGoalNumber == 1) { + AI_Movement_Track_Flush(15); + if (Random_Query(0, 1) == 1) { + if (Random_Query(0, 1) == 0) { + AI_Movement_Track_Append_With_Facing(15, 89, Random_Query(6, 10), 567); + } + AI_Movement_Track_Append_With_Facing(15, 93, Random_Query(2, 6), 1002); + AI_Movement_Track_Append(15, 92, 5); + } else { + AI_Movement_Track_Append_With_Facing(15, 91, Random_Query(3, 10), 120); + if (Random_Query(1, 3) == 1) { + AI_Movement_Track_Append_With_Facing(15, 93, Random_Query(2, 6), 1002); + } + AI_Movement_Track_Append_With_Facing(15, 90, Random_Query(5, 10), 170); + } + AI_Movement_Track_Repeat(15); + return true; + } + if (newGoalNumber == 2) { + AI_Movement_Track_Flush(15); + AI_Movement_Track_Append(15, 39, 120); + AI_Movement_Track_Append(15, 40, 0); + AI_Movement_Track_Repeat(15); + return false; + } + if (newGoalNumber == 300) { + Actor_Put_In_Set(15, 16); + Actor_Set_At_Waypoint(15, 93, 1007); + return false; + } + return false; +} + +bool AIScript_Runciter::UpdateAnimation(int *animation, int *frame) { + + switch (var_45CD70_animation_state) { + case 15: + *animation = 528; + var_45CD74_animation_frame = Slice_Animation_Query_Number_Of_Frames(528) - 1; + *frame = var_45CD74_animation_frame; + break; + case 14: + *animation = 528; + var_45CD74_animation_frame++; + if (var_45CD74_animation_frame >= Slice_Animation_Query_Number_Of_Frames(528) - 1) { + *animation = 528; + var_45CD70_animation_state = 15; + } + *frame = var_45CD74_animation_frame; + break; + case 13: + if (var_45CD78 == 0) { + var_45CD74_animation_frame = 0; + var_45CD70_animation_state = var_462800; + *animation = var_462804; + } else if (var_45CD78 == 1) { + *animation = 530; + var_45CD74_animation_frame += 3; + if (var_45CD74_animation_frame >= Slice_Animation_Query_Number_Of_Frames(530)) { + var_45CD74_animation_frame = 0; + var_45CD70_animation_state = var_462800; + *animation = var_462804; + } + } else if (var_45CD78 == 2) { + *animation = 531; + var_45CD74_animation_frame -= 3; + if (var_45CD74_animation_frame - 3 < 0) { + var_45CD74_animation_frame = 0; + var_45CD70_animation_state = var_462800; + *animation = var_462804; + } + } + *frame = var_45CD74_animation_frame; + break; + case 12: + *animation = 532; + var_45CD74_animation_frame++; + if (var_45CD74_animation_frame >= Slice_Animation_Query_Number_Of_Frames(532)) { + *animation = 529; + var_45CD70_animation_state = 0; + var_45CD74_animation_frame = 0; + var_45CD78 = 0; + Actor_Change_Animation_Mode(15, 0); + } + *frame = var_45CD74_animation_frame; + break; + case 11: + *animation = 541; + if (var_45CD74_animation_frame >= Slice_Animation_Query_Number_Of_Frames(541)) { + var_45CD74_animation_frame = 0; + if (var_45CD88) { + *animation = 529; + var_45CD70_animation_state = 0; + var_45CD78 = 0; + } else { + *animation = 533; + var_45CD70_animation_state = 2; + } + } + *frame = var_45CD74_animation_frame; + break; + case 10: + *animation = 540; + var_45CD74_animation_frame++; + if (var_45CD74_animation_frame >= Slice_Animation_Query_Number_Of_Frames(540)) { + var_45CD74_animation_frame = 0; + if (var_45CD88) { + *animation = 529; + var_45CD70_animation_state = 0; + var_45CD78 = 0; + } else { + *animation = 533; + var_45CD70_animation_state = 2; + } + } + *frame = var_45CD74_animation_frame; + break; + case 9: + *animation = 539; + var_45CD74_animation_frame++; + if (var_45CD74_animation_frame >= Slice_Animation_Query_Number_Of_Frames(539)) { + var_45CD74_animation_frame = 0; + if (var_45CD88) { + *animation = 529; + var_45CD70_animation_state = 0; + var_45CD78 = 0; + } else { + *animation = 533; + var_45CD70_animation_state = 2; + } + } + *frame = var_45CD74_animation_frame; + break; + case 8: + *animation = 538; + var_45CD74_animation_frame++; + if (var_45CD74_animation_frame >= Slice_Animation_Query_Number_Of_Frames(538)) { + var_45CD74_animation_frame = 0; + if (var_45CD88) { + *animation = 529; + var_45CD70_animation_state = 0; + var_45CD78 = 0; + } else { + *animation = 533; + var_45CD70_animation_state = 2; + } + } + *frame = var_45CD74_animation_frame; + break; + case 7: + *animation = 537; + var_45CD74_animation_frame++; + if (var_45CD74_animation_frame >= Slice_Animation_Query_Number_Of_Frames(537)) { + var_45CD74_animation_frame = 0; + if (var_45CD88) { + *animation = 529; + var_45CD70_animation_state = 0; + var_45CD78 = 0; + } else { + *animation = 533; + var_45CD70_animation_state = 2; + } + } + *frame = var_45CD74_animation_frame; + break; + case 6: + *animation = 536; + var_45CD74_animation_frame++; + if (var_45CD74_animation_frame >= Slice_Animation_Query_Number_Of_Frames(536)) { + var_45CD74_animation_frame = 0; + if (var_45CD88) { + *animation = 529; + var_45CD70_animation_state = 0; + var_45CD78 = 0; + } else { + *animation = 533; + var_45CD70_animation_state = 2; + } + } + *frame = var_45CD74_animation_frame; + break; + case 5: + *animation = 535; + var_45CD74_animation_frame++; + if (var_45CD74_animation_frame >= Slice_Animation_Query_Number_Of_Frames(535)) { + var_45CD74_animation_frame = 0; + if (var_45CD88) { + *animation = 529; + var_45CD70_animation_state = 0; + var_45CD78 = 0; + } else { + *animation = 533; + var_45CD70_animation_state = 2; + } + } + *frame = var_45CD74_animation_frame; + break; + case 4: + *animation = 534; + var_45CD74_animation_frame++; + if (var_45CD74_animation_frame >= Slice_Animation_Query_Number_Of_Frames(534)) { + var_45CD74_animation_frame = 0; + if (var_45CD88) { + *animation = 529; + var_45CD70_animation_state = 0; + var_45CD78 = 0; + } else { + *animation = 533; + var_45CD70_animation_state = 2; + } + } + *frame = var_45CD74_animation_frame; + break; + case 2: + *animation = 533; + var_45CD74_animation_frame++; + if (var_45CD74_animation_frame >= Slice_Animation_Query_Number_Of_Frames(533)) { + var_45CD74_animation_frame = 0; + if (var_45CD88) { + *animation = 529; + var_45CD70_animation_state = 0; + var_45CD78 = 0; + } else { + var_45CD70_animation_state = 4; + } + } + *frame = var_45CD74_animation_frame; + break; + case 1: + *animation = 526; + var_45CD74_animation_frame++; + if (var_45CD74_animation_frame >= Slice_Animation_Query_Number_Of_Frames(526)) { + var_45CD74_animation_frame = 0; + } + *frame = var_45CD74_animation_frame; + break; + case 0: + if (var_45CD78 == 0) { + *animation = 529; + if (var_45CD84) { + var_45CD84--; + } else { + var_45CD74_animation_frame += var_45CD80; + if (var_45CD74_animation_frame >= Slice_Animation_Query_Number_Of_Frames(529)) { + var_45CD74_animation_frame = 0; + } + if (var_45CD74_animation_frame < 0) { + var_45CD74_animation_frame = Slice_Animation_Query_Number_Of_Frames(529) - 1; + } + --var_45CD7C; + if (var_45CD7C == 0) { + var_45CD80 = 2 * Random_Query(0, 1) - 1; + var_45CD7C = Random_Query(6, 14); + var_45CD84 = Random_Query(0, 4); + } + if (var_45CD74_animation_frame == 0) { + if (Random_Query(0, 1) == 1) { + var_45CD78 = Random_Query(1, 2); + var_45CD80 = 1; + var_45CD84 = 0; + } + } + } + } else if (var_45CD78 == 1) { + *animation = 530; + var_45CD74_animation_frame++; + if (var_45CD74_animation_frame >= Slice_Animation_Query_Number_Of_Frames(530)) { + var_45CD74_animation_frame = 0; + var_45CD78 = 0; + *animation = 529; + var_45CD7C = Random_Query(6, 14); + var_45CD80 = 2 * Random_Query(0, 1) - 1; + } + } else if (var_45CD78 == 2) { + *animation = 531; + if (var_45CD84) { + var_45CD84--; + } else { + var_45CD74_animation_frame += var_45CD80; + if (var_45CD74_animation_frame >= Slice_Animation_Query_Number_Of_Frames(*animation) - 1) { + var_45CD84 = Random_Query(5, 15); + var_45CD80 = -1; + } + if (var_45CD74_animation_frame <= 0) { + var_45CD74_animation_frame = 0; + var_45CD78 = 0; + *animation = 529; + var_45CD7C = Random_Query(6, 14); + var_45CD80 = 2 * Random_Query(0, 1) - 1; + } + } + } + *frame = var_45CD74_animation_frame; + break; + default: + *animation = 399; + var_45CD74_animation_frame = 0; + *frame = var_45CD74_animation_frame; + break; + } + return true; +} + +bool AIScript_Runciter::ChangeAnimationMode(int mode) { + + switch (mode) { + case 23: + var_45CD70_animation_state = 12; + var_45CD74_animation_frame = 0; + break; + case 19: + if (var_45CD70_animation_state) { + var_45CD70_animation_state = 2; + var_45CD74_animation_frame = 0; + } else { + var_45CD70_animation_state = 13; + var_462800 = 11; + var_462804 = 541; + } + var_45CD88 = 0; + break; + case 18: + if (var_45CD70_animation_state) { + var_45CD70_animation_state = 2; + var_45CD74_animation_frame = 0; + } else { + var_45CD70_animation_state = 13; + var_462800 = 10; + var_462804 = 540; + } + var_45CD88 = 0; + break; + case 17: + if (var_45CD70_animation_state) { + var_45CD70_animation_state = 2; + var_45CD74_animation_frame = 0; + } else { + var_45CD70_animation_state = 13; + var_462800 = 9; + var_462804 = 539; + } + var_45CD88 = 0; + break; + case 16: + if (var_45CD70_animation_state) { + var_45CD70_animation_state = 2; + var_45CD74_animation_frame = 0; + } else { + var_45CD70_animation_state = 13; + var_462800 = 8; + var_462804 = 538; + } + var_45CD88 = 0; + break; + case 15: + if (var_45CD70_animation_state) { + var_45CD70_animation_state = 2; + var_45CD74_animation_frame = 0; + } else { + var_45CD70_animation_state = 13; + var_462800 = 7; + var_462804 = 537; + } + var_45CD88 = 0; + break; + case 14: + if (var_45CD70_animation_state) { + var_45CD70_animation_state = 2; + var_45CD74_animation_frame = 0; + } else { + var_45CD70_animation_state = 13; + var_462800 = 6; + var_462804 = 536; + } + var_45CD88 = 0; + break; + case 13: + if (var_45CD70_animation_state) { + var_45CD70_animation_state = 2; + var_45CD74_animation_frame = 0; + } else { + var_45CD70_animation_state = 13; + var_462800 = 5; + var_462804 = 535; + } + var_45CD88 = 0; + break; + case 12: + if (var_45CD70_animation_state) { + var_45CD70_animation_state = 2; + var_45CD74_animation_frame = 0; + } else { + var_45CD70_animation_state = 13; + var_462800 = 4; + var_462804 = 534; + } + var_45CD88 = 0; + break; + case 3: + if (var_45CD70_animation_state) { + var_45CD70_animation_state = 2; + var_45CD74_animation_frame = 0; + } else { + var_45CD70_animation_state = 13; + var_462800 = 2; + var_462804 = 526; + } + var_45CD88 = 0; + break; + case 1: + if (var_45CD70_animation_state > 1) { + var_45CD70_animation_state = 1; + var_45CD74_animation_frame = 0; + } else if (!var_45CD70_animation_state) { + var_45CD70_animation_state = 13; + var_462800 = 1; + var_462804 = 526; + } + break; + case 0: + if (var_45CD70_animation_state >= 2 && var_45CD70_animation_state <= 11) { + var_45CD88 = 1; + } else { + var_45CD70_animation_state = 0; + var_45CD74_animation_frame = 0; + var_45CD78 = 0; + } + break; + case 2: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 20: + case 21: + case 22: + break; + default: + if (mode == 48) { + var_45CD70_animation_state = 14; + var_45CD74_animation_frame = 0; + } + break; + } + return true; +} + +void AIScript_Runciter::QueryAnimationState(int *animationState, int *animationFrame, int *a3, int *a4) { + *animationState = var_45CD70_animation_state; + *animationFrame = var_45CD74_animation_frame; + *a3 = var_462800; + *a4 = var_462804; +} + +void AIScript_Runciter::SetAnimationState(int animationState, int animationFrame, int a3, int a4) { + var_45CD70_animation_state = animationState; + var_45CD74_animation_frame = animationFrame; + var_462800 = a3; + var_462804 = a4; +} + +bool AIScript_Runciter::ReachedMovementTrackWaypoint(int a1) { + switch (a1) { + case 93: + Actor_Face_Heading(15, 1002, true); + break; + case 92: + Actor_Face_Heading(15, 664, true); + break; + case 91: + Actor_Face_Heading(15, 120, true); + break; + case 90: + Actor_Face_Heading(15, 170, true); + break; + case 89: + Actor_Face_Heading(15, 567, true); + break; + default: + return true; + } + return true; +} + +void AIScript_Runciter::FledCombat() {} + +} // End of namespace BladeRunner diff --git a/engines/bladerunner/script/ai_15_runciter.h b/engines/bladerunner/script/ai_15_runciter.h new file mode 100644 index 0000000000..b2cb70d2f8 --- /dev/null +++ b/engines/bladerunner/script/ai_15_runciter.h @@ -0,0 +1,65 @@ +/* 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_Runciter : public AIScriptBase { + int var_45CD70_animation_state; + int var_45CD74_animation_frame; + int var_462800; + int var_462804; + int var_45CD78; + int var_45CD7C; + int var_45CD80; + int var_45CD84; + int var_45CD88; +public: + AIScript_Runciter(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(int otherActorId); + void OtherAgentExitedThisScene(int otherActorId); + void OtherAgentEnteredCombatMode(int otherActorId, int combatMode); + 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(); +}; + +} // End of namespace BladeRunner diff --git a/engines/bladerunner/script/ai_23_officer_leroy.cpp b/engines/bladerunner/script/ai_23_officer_leroy.cpp index 6699b358d9..daf1ea9d73 100644 --- a/engines/bladerunner/script/ai_23_officer_leroy.cpp +++ b/engines/bladerunner/script/ai_23_officer_leroy.cpp @@ -203,11 +203,11 @@ void AIScript_Officer_Leroy::ClickedByPlayer() {} void AIScript_Officer_Leroy::EnteredScene(int sceneId) {} -void AIScript_Officer_Leroy::OtherAgentEnteredThisScene() {} +void AIScript_Officer_Leroy::OtherAgentEnteredThisScene(int otherActorId) {} -void AIScript_Officer_Leroy::OtherAgentExitedThisScene() {} +void AIScript_Officer_Leroy::OtherAgentExitedThisScene(int otherActorId) {} -void AIScript_Officer_Leroy::OtherAgentEnteredCombatMode() {} +void AIScript_Officer_Leroy::OtherAgentEnteredCombatMode(int otherActorId, int combatMode) {} void AIScript_Officer_Leroy::ShotAtAndMissed() {} diff --git a/engines/bladerunner/script/ai_23_officer_leroy.h b/engines/bladerunner/script/ai_23_officer_leroy.h index a38d869ac1..c78d80db4e 100644 --- a/engines/bladerunner/script/ai_23_officer_leroy.h +++ b/engines/bladerunner/script/ai_23_officer_leroy.h @@ -43,9 +43,9 @@ public: void ReceivedClue(int clueId, int fromActorId); void ClickedByPlayer(); void EnteredScene(int sceneId); - void OtherAgentEnteredThisScene(); - void OtherAgentExitedThisScene(); - void OtherAgentEnteredCombatMode(); + void OtherAgentEnteredThisScene(int otherActorId); + void OtherAgentExitedThisScene(int otherActorId); + void OtherAgentEnteredCombatMode(int otherActorId, int combatMode); void ShotAtAndMissed(); void ShotAtAndHit(); void Retired(int byActorId); diff --git a/engines/bladerunner/script/script.cpp b/engines/bladerunner/script/script.cpp index b631058f36..320373a058 100644 --- a/engines/bladerunner/script/script.cpp +++ b/engines/bladerunner/script/script.cpp @@ -48,6 +48,7 @@ #include "bladerunner/waypoints.h" #include "bladerunner/script/ai_00_mccoy.h" +#include "bladerunner/script/ai_15_runciter.h" #include "bladerunner/script/ai_23_officer_leroy.h" namespace BladeRunner { @@ -190,7 +191,7 @@ void ScriptBase::Actor_Set_At_XYZ(int actorId, float x, float y, float z, int di } void ScriptBase::Actor_Set_At_Waypoint(int actorId, int waypointId, int angle) { - _vm->_actors[actorId]->setAtWaypoint(waypointId, angle, 0, 0); + _vm->_actors[actorId]->setAtWaypoint(waypointId, angle, 0, false); } bool ScriptBase::Region_Check(int left, int top, int right, int down) { @@ -1105,28 +1106,21 @@ void ScriptBase::Scene_2D_Region_Remove(int index) { _vm->_scene->_regions->remove(index); } -void ScriptBase::World_Waypoint_Set(int waypointId, int sceneId, float x, float y, float z) { - //TODO - warning("World_Waypoint_Set(%d, %d, %f, %f, %f)", waypointId, sceneId, x, y, z); +void ScriptBase::World_Waypoint_Set(int waypointId, int setId, float x, float y, float z) { + _vm->_waypoints->set(waypointId, setId, Vector3(x, y, z)); } // ScriptBase::World_Waypoint_Reset float ScriptBase::World_Waypoint_Query_X(int waypointId) { - //TODO - warning("World_Waypoint_Query_X(%d)", waypointId); - return 0.0f; + return _vm->_waypoints->getX(waypointId); } float ScriptBase::World_Waypoint_Query_Y(int waypointId) { - //TODO - warning("World_Waypoint_Query_Y(%d)", waypointId); - return 0.0f; + return _vm->_waypoints->getY(waypointId); } float ScriptBase::World_Waypoint_Query_Z(int waypointId) { - //TODO - warning("World_Waypoint_Query_Z(%d)", waypointId); - return 0.0f; + return _vm->_waypoints->getZ(waypointId); } void ScriptBase::Combat_Cover_Waypoint_Set_Data(int combatCoverId, int a2, int sceneId, int a4, float x, float y, float z) { @@ -1458,27 +1452,89 @@ void ScriptBase::VK_Play_Speech_Line(int actorIndex, int a2, float a3) { warning("VK_Play_Speech_Line(%d, %d, %g)", actorIndex, a2, a3); } -AIScripts::AIScripts(BladeRunnerEngine *vm) : _vm(vm), _inScriptCounter(0) { - for (int i = 0; i != 100; ++i) +AIScripts::AIScripts(BladeRunnerEngine *vm, int actorsCount) : _vm(vm), _inScriptCounter(0) { + _actorsCount = actorsCount; + _actorUpdating = new bool[actorsCount]; + _AIScripts = new AIScriptBase*[actorsCount]; + for (int i = 0; i < actorsCount; ++i) { _AIScripts[i] = nullptr; + _actorUpdating[i] = false; + } _AIScripts[0] = new AIScript_McCoy(_vm); + _AIScripts[15] = new AIScript_Runciter(_vm); _AIScripts[23] = new AIScript_Officer_Leroy(_vm); } AIScripts::~AIScripts() { - for (int i = 0; i != 100; ++i) { + for (int i = 0; i < _actorsCount; ++i) { delete _AIScripts[i]; _AIScripts[i] = nullptr; } + delete _AIScripts; + delete _actorUpdating; } void AIScripts::Initialize(int actor) { + assert(actor < _actorsCount); if (_AIScripts[actor]) _AIScripts[actor]->Initialize(); } +void AIScripts::Update(int actor) { + assert(actor < _actorsCount); + if (this->_actorUpdating[actor] != 1) { + this->_actorUpdating[actor] = true; + ++this->_inScriptCounter; + if (_AIScripts[actor]) + _AIScripts[actor]->Update(); + --this->_inScriptCounter; + this->_actorUpdating[actor] = false; + } +} + +void AIScripts::TimerExpired(int actor, int timer) { + assert(actor < _actorsCount); + _inScriptCounter++; + if (_AIScripts[actor]) + _AIScripts[actor]->TimerExpired(timer); + _inScriptCounter--; +} + +void AIScripts::EnteredScene(int actor, int setId) { + assert(actor < _actorsCount); + _inScriptCounter++; + if (_AIScripts[actor]) + _AIScripts[actor]->EnteredScene(setId); + _inScriptCounter--; +} + +void AIScripts::OtherAgentEnteredThisScene(int actor, int otherActorId) { + assert(actor < _actorsCount); + _inScriptCounter++; + if (_AIScripts[actor]) + _AIScripts[actor]->OtherAgentEnteredThisScene(otherActorId); + _inScriptCounter--; +} + +void AIScripts::OtherAgentExitedThisScene(int actor, int otherActorId) { + assert(actor < _actorsCount); + _inScriptCounter++; + if (_AIScripts[actor]) + _AIScripts[actor]->OtherAgentExitedThisScene(otherActorId); + _inScriptCounter--; +} + +void AIScripts::GoalChanged(int actor, int currentGoalNumber, int newGoalNumber) { + assert(actor < _actorsCount); + _inScriptCounter++; + if (_AIScripts[actor]) + _AIScripts[actor]->GoalChanged(currentGoalNumber, newGoalNumber); + _inScriptCounter--; +} + void AIScripts::UpdateAnimation(int actor, int *animation, int *frame) { + assert(actor < _actorsCount); _inScriptCounter++; if (_AIScripts[actor]) _AIScripts[actor]->UpdateAnimation(animation, frame); @@ -1486,6 +1542,7 @@ void AIScripts::UpdateAnimation(int actor, int *animation, int *frame) { } void AIScripts::ChangeAnimationMode(int actor, int mode) { + assert(actor < _actorsCount); _inScriptCounter++; if (_AIScripts[actor]) _AIScripts[actor]->ChangeAnimationMode(mode); diff --git a/engines/bladerunner/script/script.h b/engines/bladerunner/script/script.h index 40f1f12a2c..bf787e78c4 100644 --- a/engines/bladerunner/script/script.h +++ b/engines/bladerunner/script/script.h @@ -304,11 +304,12 @@ public: */ class Script { -public: +protected: BladeRunnerEngine *_vm; int _inScriptCounter; SceneScriptBase *_currentScript; +public: Script(BladeRunnerEngine *vm) : _vm(vm), _inScriptCounter(0), @@ -331,6 +332,7 @@ public: void PlayerWalkedIn(); void PlayerWalkedOut(); void DialogueQueueFlushed(int a1); + bool IsInsideScript() { return _inScriptCounter > 0; } }; #define DECLARE_SCRIPT(name) \ @@ -820,10 +822,10 @@ public: virtual void CompletedMovementTrack() = 0; virtual void ReceivedClue(int clueId, int fromActorId) = 0; virtual void ClickedByPlayer() = 0; - virtual void EnteredScene(int sceneId) = 0; - virtual void OtherAgentEnteredThisScene() = 0; - virtual void OtherAgentExitedThisScene() = 0; - virtual void OtherAgentEnteredCombatMode() = 0; + virtual void EnteredScene(int setId) = 0; + virtual void OtherAgentEnteredThisScene(int otherActorId) = 0; + virtual void OtherAgentExitedThisScene(int otherActorId) = 0; + virtual void OtherAgentEnteredCombatMode(int otherActorId, int combatMode) = 0; virtual void ShotAtAndMissed() = 0; virtual void ShotAtAndHit() = 0; virtual void Retired(int byActorId) = 0; @@ -838,17 +840,27 @@ public: }; class AIScripts { -public: +private: BladeRunnerEngine *_vm; int _inScriptCounter; - AIScriptBase *_AIScripts[100]; - - AIScripts(BladeRunnerEngine *vm); + int _actorsCount; + AIScriptBase **_AIScripts; + bool *_actorUpdating; +public: + AIScripts(BladeRunnerEngine *vm, int actorsCount); ~AIScripts(); void Initialize(int actor); + void Update(int actor); + void TimerExpired(int actor, int timer); + void EnteredScene(int actor, int setId); + void OtherAgentEnteredThisScene(int actor, int otherActorId); + void OtherAgentExitedThisScene(int actor, int otherActorId); + void GoalChanged(int actor, int currentGoalNumber, int newGoalNumber); void UpdateAnimation(int actor, int *animation, int *frame); void ChangeAnimationMode(int actor, int mode); + + bool IsInsideScript() { return _inScriptCounter > 0; } }; } // End of namespace BladeRunner |