[Scummvm-git-logs] scummvm master -> 02185fbcf52a406fb6a381ccfdfdd46077c24127

peterkohaut peterkohaut at users.noreply.github.com
Mon Mar 20 00:31:10 CET 2017


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
25e5143f99 BLADERUNNER: added full office leroy ai script
02185fbcf5 Merge branch 'master' of https://github.com/scummvm/scummvm


Commit: 25e5143f99dab91d53eb52de703ef1b4c9ee2656
    https://github.com/scummvm/scummvm/commit/25e5143f99dab91d53eb52de703ef1b4c9ee2656
Author: Peter Kohaut (peter.kohaut at gmail.com)
Date: 2017-03-20T00:28:51+01:00

Commit Message:
BLADERUNNER: added full office leroy ai script
fix sceneobject remove

Changed paths:
  A engines/bladerunner/script/ai_23_officer_leroy.cpp
  A engines/bladerunner/script/ai_23_officer_leroy.h
  R engines/bladerunner/script/aiscript_officer_leroy.cpp
  R engines/bladerunner/script/aiscript_officer_leroy.h
    engines/bladerunner/actor.cpp
    engines/bladerunner/actor_walk.cpp
    engines/bladerunner/gameflags.cpp
    engines/bladerunner/module.mk
    engines/bladerunner/scene.cpp
    engines/bladerunner/scene_objects.cpp
    engines/bladerunner/script/ai_00_mccoy.cpp
    engines/bladerunner/script/ai_00_mccoy.h
    engines/bladerunner/script/script.cpp
    engines/bladerunner/script/script.h


diff --git a/engines/bladerunner/actor.cpp b/engines/bladerunner/actor.cpp
index 9a8892c..96a76bf 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 556f7b9..6287ac8 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 db4271d..0e04a1c 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 fb656ef..31577da 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 c29a634..abf0285 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 c550973..b66467e 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 fa37efb..f0081a5 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 eedae2f..43fa049 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 0000000..6699b35
--- /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 0000000..a38d869
--- /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 7881984..0000000
--- 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 152ba83..0000000
--- 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 45b2312..b631058 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 5966b67..40f1f12 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 {


Commit: 02185fbcf52a406fb6a381ccfdfdd46077c24127
    https://github.com/scummvm/scummvm/commit/02185fbcf52a406fb6a381ccfdfdd46077c24127
Author: Peter Kohaut (peter.kohaut at gmail.com)
Date: 2017-03-20T00:30:41+01:00

Commit Message:
Merge branch 'master' of https://github.com/scummvm/scummvm

Changed paths:
  A engines/titanic/star_control/frange.cpp
  A engines/titanic/star_control/frange.h
  A engines/titanic/star_control/star_ref.cpp
  A engines/titanic/star_control/star_ref.h
  R engines/titanic/star_control/star_control_sub4.cpp
  R engines/titanic/star_control/star_control_sub4.h
    AUTHORS
    NEWS
    configure
    devtools/credits.pl
    devtools/encode-macbinary.sh
    dists/androidsdl/scummvm/AndroidAppSettings.cfg
    dists/androidsdl/scummvm/AndroidAppSettings.cfg.in
    dists/androidsdl/scummvm/AndroidBuild.sh
    dists/psp2/readme-psp2.md
    engines/chewy/console.cpp
    engines/chewy/console.h
    engines/chewy/cursor.cpp
    engines/chewy/cursor.h
    engines/chewy/events.cpp
    engines/chewy/graphics.cpp
    engines/chewy/graphics.h
    engines/chewy/scene.cpp
    engines/chewy/scene.h
    engines/chewy/text.cpp
    engines/director/cast.h
    engines/director/director.cpp
    engines/director/director.h
    engines/director/events.cpp
    engines/director/frame.cpp
    engines/director/frame.h
    engines/director/graphics.cpp
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo-code.cpp
    engines/director/lingo/lingo-the.cpp
    engines/director/lingo/lingo.cpp
    engines/director/resource.cpp
    engines/director/score.cpp
    engines/director/score.h
    engines/director/sprite.cpp
    engines/director/sprite.h
    engines/director/util.cpp
    engines/mohawk/detection_tables.h
    engines/mohawk/myst_scripts.cpp
    engines/mohawk/myst_stacks/channelwood.cpp
    engines/mohawk/myst_stacks/myst.cpp
    engines/sci/engine/script_patches.cpp
    engines/sci/engine/script_patches.h
    engines/titanic/module.mk
    engines/titanic/star_control/base_star.cpp
    engines/titanic/star_control/base_star.h
    engines/titanic/star_control/dmatrix.cpp
    engines/titanic/star_control/dmatrix.h
    engines/titanic/star_control/dvector.cpp
    engines/titanic/star_control/dvector.h
    engines/titanic/star_control/fmatrix.cpp
    engines/titanic/star_control/fmatrix.h
    engines/titanic/star_control/fvector.cpp
    engines/titanic/star_control/fvector.h
    engines/titanic/star_control/star_control_sub12.cpp
    engines/titanic/star_control/star_control_sub12.h
    engines/titanic/star_control/star_control_sub13.cpp
    engines/titanic/star_control/star_control_sub13.h
    engines/titanic/star_control/star_control_sub2.cpp
    engines/titanic/star_control/star_control_sub2.h
    engines/titanic/star_control/star_control_sub20.cpp
    engines/titanic/star_control/star_control_sub20.h
    engines/titanic/star_control/star_control_sub21.cpp
    engines/titanic/star_control/star_control_sub21.h
    engines/titanic/star_control/star_control_sub22.cpp
    engines/titanic/star_control/star_control_sub22.h
    engines/titanic/star_control/star_control_sub23.cpp
    engines/titanic/star_control/star_control_sub23.h
    engines/titanic/star_control/star_control_sub24.cpp
    engines/titanic/star_control/star_control_sub24.h
    engines/titanic/star_control/star_control_sub25.cpp
    engines/titanic/star_control/star_control_sub25.h
    engines/titanic/star_control/star_control_sub26.cpp
    engines/titanic/star_control/star_control_sub26.h
    engines/titanic/star_control/star_control_sub27.cpp
    engines/titanic/star_control/star_control_sub27.h
    engines/titanic/star_control/star_control_sub5.cpp
    engines/titanic/star_control/star_control_sub5.h
    engines/titanic/star_control/star_control_sub6.cpp
    engines/titanic/star_control/star_control_sub6.h
    engines/titanic/star_control/star_control_sub7.cpp
    engines/titanic/star_control/star_control_sub8.cpp
    engines/titanic/star_control/star_control_sub8.h
    engines/titanic/star_control/star_field.cpp
    engines/titanic/star_control/star_points1.cpp
    engines/titanic/star_control/star_points2.cpp
    engines/titanic/star_control/star_view.cpp
    engines/titanic/star_control/surface_area.cpp
    engines/titanic/titanic.h
    graphics/macgui/macfontmanager.cpp
    gui/credits.h
    gui/gui-manager.cpp
    gui/gui-manager.h
    gui/launcher.cpp
    gui/options.cpp
    gui/themes/translations.dat
    po/be_BY.po
    po/ca_ES.po
    po/cs_CZ.po
    po/da_DK.po
    po/de_DE.po
    po/el.po
    po/es_ES.po
    po/eu.po
    po/fi_FI.po
    po/fr_FR.po
    po/gl_ES.po
    po/hu_HU.po
    po/it_IT.po
    po/nb_NO.po
    po/nl_NL.po
    po/nn_NO.po
    po/pl_PL.po
    po/pt_BR.po
    po/pt_PT.po
    po/ru_RU.po
    po/scummvm.pot
    po/sv_SE.po
    po/uk_UA.po
    po/zh-Latn_CN.po







More information about the Scummvm-git-logs mailing list