[Scummvm-git-logs] scummvm master -> 55245a8ccab7b31f6c5158b1f980903bc6234205

sev- sev at scummvm.org
Sat Mar 24 02:48:01 CET 2018


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

Summary:
740ea803bb BLADERUNNER: Added Police Maze skeleton
f4a34b58f9 BLADERUNNER: Added struct definitions to PoliceMaze
a284213aa0 BLADERUNNER: Implement PoliceMaze hooks
da2c7142ce BLADERUNNER: Implement Item_Spin_In_World()
05144ab3ca BLADERUNNER: Implement setting items as target
5a94c42e80 BLADERUNNER: Implement PoliceMaze::tick()
540567d1d8 BLADERUNNER: Hook PoliceMaze to Scene class
967de5d4aa BLADERUNNER: Implement PoliceMazeTargetTrack::readdObject()
bb492da8aa BLADERUNNER: Unstub PoliceMazeTargetTrack::add()
ff11cee480 BLADERUNNER: Added WIP code for PoliceMazeTargetTrack::tick()
55245a8cca BLADERUNNER: Moved PoliceMaze to script/


Commit: 740ea803bbd9e7489955f1437a669274780e6857
    https://github.com/scummvm/scummvm/commit/740ea803bbd9e7489955f1437a669274780e6857
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-03-24T02:45:26+01:00

Commit Message:
BLADERUNNER: Added Police Maze skeleton

Changed paths:
  A engines/bladerunner/police_maze.cpp
  A engines/bladerunner/police_maze.h
    engines/bladerunner/bladerunner.cpp
    engines/bladerunner/bladerunner.h
    engines/bladerunner/module.mk


diff --git a/engines/bladerunner/bladerunner.cpp b/engines/bladerunner/bladerunner.cpp
index 055c77c..aa1fb97 100644
--- a/engines/bladerunner/bladerunner.cpp
+++ b/engines/bladerunner/bladerunner.cpp
@@ -45,6 +45,7 @@
 #include "bladerunner/outtake.h"
 #include "bladerunner/obstacles.h"
 #include "bladerunner/overlays.h"
+#include "bladerunner/police_maze.h"
 #include "bladerunner/regions.h"
 #include "bladerunner/scene.h"
 #include "bladerunner/scene_objects.h"
@@ -238,7 +239,7 @@ bool BladeRunnerEngine::startup(bool hasSavegames) {
 
 	// TODO: outtake player - but this is done bit differently
 
-	// TODO: police maze
+	_policeMaze = new PoliceMaze(this);
 
 	_obstacles = new Obstacles(this);
 
@@ -647,6 +648,9 @@ void BladeRunnerEngine::shutdown() {
 	delete _itemPickup;
 	_itemPickup = nullptr;
 
+	delete _policeMaze;
+	_policeMaze = nullptr;
+
 	delete _obstacles;
 	_obstacles = nullptr;
 
@@ -760,6 +764,8 @@ void BladeRunnerEngine::gameTick() {
 			}
 		}
 
+		_policeMaze->tick();
+
 		// TODO: Gun range announcements
 		_zbuffer->clean();
 
diff --git a/engines/bladerunner/bladerunner.h b/engines/bladerunner/bladerunner.h
index 6d15a1c..2c3b7c6 100644
--- a/engines/bladerunner/bladerunner.h
+++ b/engines/bladerunner/bladerunner.h
@@ -75,6 +75,7 @@ class Mouse;
 class Music;
 class Obstacles;
 class Overlays;
+class PoliceMaze;
 class Scene;
 class SceneObjects;
 class SceneScript;
@@ -132,6 +133,7 @@ public:
 	Music              *_music;
 	Obstacles          *_obstacles;
 	Overlays           *_overlays;
+	PoliceMaze         *_policeMaze;
 	Scene              *_scene;
 	SceneObjects       *_sceneObjects;
 	SceneScript        *_sceneScript;
diff --git a/engines/bladerunner/module.mk b/engines/bladerunner/module.mk
index aa1fe01..f7f7984 100644
--- a/engines/bladerunner/module.mk
+++ b/engines/bladerunner/module.mk
@@ -40,6 +40,7 @@ MODULE_OBJS = \
 	obstacles.o \
 	outtake.o \
 	overlays.o \
+	police_maze.o \
 	regions.o \
 	scene.o \
 	scene_objects.o \
diff --git a/engines/bladerunner/police_maze.cpp b/engines/bladerunner/police_maze.cpp
new file mode 100644
index 0000000..9a7d052
--- /dev/null
+++ b/engines/bladerunner/police_maze.cpp
@@ -0,0 +1,40 @@
+/* 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/bladerunner.h"
+
+#include "bladerunner/police_maze.h"
+
+namespace BladeRunner {
+
+PoliceMaze::PoliceMaze(BladeRunnerEngine *vm) {
+	_vm = vm;
+}
+
+PoliceMaze::~PoliceMaze() {
+}
+
+void PoliceMaze::tick() {
+}
+
+
+} // End of namespace BladeRunner
diff --git a/engines/bladerunner/police_maze.h b/engines/bladerunner/police_maze.h
new file mode 100644
index 0000000..5959648
--- /dev/null
+++ b/engines/bladerunner/police_maze.h
@@ -0,0 +1,42 @@
+/* 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.
+ *
+ */
+
+#ifndef BLADERUNNER_POLICE_MAZE_H
+#define BLADERUNNER_POLICE_MAZE_H
+
+namespace BladeRunner {
+
+class BladeRunnerEngine;
+
+class PoliceMaze {
+	BladeRunnerEngine *_vm;
+
+public:
+	PoliceMaze(BladeRunnerEngine *vm);
+	~PoliceMaze();
+
+	void tick();
+};
+
+} // End of namespace BladeRunner
+
+#endif


Commit: f4a34b58f9b6eefe41f1b1896ddefd9f3bff62c9
    https://github.com/scummvm/scummvm/commit/f4a34b58f9b6eefe41f1b1896ddefd9f3bff62c9
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-03-24T02:45:26+01:00

Commit Message:
BLADERUNNER: Added struct definitions to PoliceMaze

Changed paths:
    engines/bladerunner/police_maze.cpp
    engines/bladerunner/police_maze.h


diff --git a/engines/bladerunner/police_maze.cpp b/engines/bladerunner/police_maze.cpp
index 9a7d052..a4d95c7 100644
--- a/engines/bladerunner/police_maze.cpp
+++ b/engines/bladerunner/police_maze.cpp
@@ -28,13 +28,62 @@ namespace BladeRunner {
 
 PoliceMaze::PoliceMaze(BladeRunnerEngine *vm) {
 	_vm = vm;
+
+	reset();
+
+	for (int i = 0; i < kNumMazeTracks; i++) {
+		_tracks[i] = new PoliceMazeTargetTrack;
+	}
 }
 
 PoliceMaze::~PoliceMaze() {
+	for (int i = 0; i < kNumMazeTracks; i++) {
+		delete _tracks[i];
+	}
+
+	reset();
+}
+
+void PoliceMaze::reset() {
+	_isActive = false;
+	_needAnnouncement = false;
+	_announcementRead = false;
+
+	for (int i = 0; i < kNumMazeTracks; i++) {
+		_tracks[i] = 0;
+	}
+
+	_pm_var1 = 0;
+	_pm_var2 = 0;
 }
 
 void PoliceMaze::tick() {
 }
 
+PoliceMazeTargetTrack::PoliceMazeTargetTrack() {
+	reset();
+}
+
+PoliceMazeTargetTrack::~PoliceMazeTargetTrack() {
+}
+
+void PoliceMazeTargetTrack::reset() {
+	_isPresent = 0;
+	_itemId = -1;
+	_count = 0;
+	_data = 0;
+	_dataIndex = 0;
+	_pmt_var1 = 0;
+	_pmt_var2 = 0;
+	_time = 0;
+	_pmt_var3 = 0;
+	_pmt_var4 = 0;
+	_pointIndex = 0;
+	_pmt_var5 = 0;
+	_rotating = 0;
+	_maxAngle = 0;
+	_angleChange = 0;
+	_visible = true;
+}
 
 } // End of namespace BladeRunner
diff --git a/engines/bladerunner/police_maze.h b/engines/bladerunner/police_maze.h
index 5959648..20f22c3 100644
--- a/engines/bladerunner/police_maze.h
+++ b/engines/bladerunner/police_maze.h
@@ -23,18 +23,59 @@
 #ifndef BLADERUNNER_POLICE_MAZE_H
 #define BLADERUNNER_POLICE_MAZE_H
 
+#include "bladerunner/vector.h"
+
 namespace BladeRunner {
 
+enum {
+	kNumMazeTracks = 64,
+	kNumTrackPoints = 100
+};
+
 class BladeRunnerEngine;
 
+class PoliceMazeTargetTrack {
+	int _time;
+	bool _isPresent;
+	int _itemId;
+	int _count;
+	Vector3 _points[kNumTrackPoints];
+	int *_data;
+	int _dataIndex;
+	int _pmt_var1;
+	int _pmt_var2;
+	int _pmt_var3;
+	int _pmt_var4;
+	int _pointIndex;
+	int _pmt_var5;
+	int _rotating;
+	int _maxAngle;
+	int _angleChange;
+	bool _visible;
+
+public:
+	PoliceMazeTargetTrack();
+	~PoliceMazeTargetTrack();
+
+	void reset();
+};
+
 class PoliceMaze {
 	BladeRunnerEngine *_vm;
 
+	PoliceMazeTargetTrack *_tracks[kNumMazeTracks];
+	bool _isActive;
+	bool _needAnnouncement;
+	bool _announcementRead;
+	int _pm_var1;
+	int _pm_var2;
+
 public:
 	PoliceMaze(BladeRunnerEngine *vm);
 	~PoliceMaze();
 
 	void tick();
+	void reset();
 };
 
 } // End of namespace BladeRunner


Commit: a284213aa0d54dda9677aac4f1d6946ddd4b3a3b
    https://github.com/scummvm/scummvm/commit/a284213aa0d54dda9677aac4f1d6946ddd4b3a3b
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-03-24T02:45:26+01:00

Commit Message:
BLADERUNNER: Implement PoliceMaze hooks

Changed paths:
    engines/bladerunner/game_constants.h
    engines/bladerunner/police_maze.cpp
    engines/bladerunner/police_maze.h
    engines/bladerunner/script/scene/ps10.cpp
    engines/bladerunner/script/scene/ps11.cpp
    engines/bladerunner/script/scene/ps12.cpp
    engines/bladerunner/script/scene/ps13.cpp
    engines/bladerunner/script/script.cpp
    engines/bladerunner/script/script.h


diff --git a/engines/bladerunner/game_constants.h b/engines/bladerunner/game_constants.h
index 4aa72c1..cf5e3fb 100644
--- a/engines/bladerunner/game_constants.h
+++ b/engines/bladerunner/game_constants.h
@@ -535,6 +535,7 @@ enum Flags {
 enum Variables {
 	kVariableChapter = 1,
 	kVariableChinyen = 2,
+	kVariablePoliceMazeScore = 9,
 	kVariableGenericWalkerAModel = 32,
 	kVariableGenericWalkerBModel = 33,
 	kVariableGenericWalkerCModel = 34,
diff --git a/engines/bladerunner/police_maze.cpp b/engines/bladerunner/police_maze.cpp
index a4d95c7..8c79fc7 100644
--- a/engines/bladerunner/police_maze.cpp
+++ b/engines/bladerunner/police_maze.cpp
@@ -57,6 +57,15 @@ void PoliceMaze::reset() {
 	_pm_var2 = 0;
 }
 
+void PoliceMaze::activate() {
+	_needAnnouncement = true;
+	_announcementRead = false;
+}
+
+void PoliceMaze::setPauseState(bool state) {
+	warning("PoliceMaze::setPauseState(%d)", state);
+}
+
 void PoliceMaze::tick() {
 }
 
@@ -86,4 +95,9 @@ void PoliceMazeTargetTrack::reset() {
 	_visible = true;
 }
 
+void PoliceMazeTargetTrack::add(int trackId, float startX, float startY, float startZ, float endX, float endY, float endZ, int count, void *list, bool a11) {
+	warning("PoliceMazeTargetTrack::add(%d, %f, %f, %f, %f, %f, %f, %d, %p, %d)", trackId,  startX,  startY,  startZ,  endX,  endY,  endZ,  count,  (void *)list, a11);
+}
+
+
 } // End of namespace BladeRunner
diff --git a/engines/bladerunner/police_maze.h b/engines/bladerunner/police_maze.h
index 20f22c3..ef49161 100644
--- a/engines/bladerunner/police_maze.h
+++ b/engines/bladerunner/police_maze.h
@@ -58,12 +58,12 @@ public:
 	~PoliceMazeTargetTrack();
 
 	void reset();
+	void add(int trackId, float startX, float startY, float startZ, float endX, float endY, float endZ, int count, void *list, bool a11);
 };
 
 class PoliceMaze {
 	BladeRunnerEngine *_vm;
 
-	PoliceMazeTargetTrack *_tracks[kNumMazeTracks];
 	bool _isActive;
 	bool _needAnnouncement;
 	bool _announcementRead;
@@ -71,11 +71,16 @@ class PoliceMaze {
 	int _pm_var2;
 
 public:
+	PoliceMazeTargetTrack *_tracks[kNumMazeTracks];
+
+public:
 	PoliceMaze(BladeRunnerEngine *vm);
 	~PoliceMaze();
 
 	void tick();
 	void reset();
+	void setPauseState(bool state);
+	void activate();
 };
 
 } // End of namespace BladeRunner
diff --git a/engines/bladerunner/script/scene/ps10.cpp b/engines/bladerunner/script/scene/ps10.cpp
index d45a4b8..8a1677f 100644
--- a/engines/bladerunner/script/scene/ps10.cpp
+++ b/engines/bladerunner/script/scene/ps10.cpp
@@ -25,7 +25,7 @@
 namespace BladeRunner {
 
 void SceneScriptPS10::InitializeScene() {
-	Police_Maze_Set_Pause_State(1);
+	Police_Maze_Set_Pause_State(true);
 	if (Game_Flag_Query(15)) {
 		float x = World_Waypoint_Query_X(4);
 		float y = World_Waypoint_Query_Y(4);
@@ -211,7 +211,7 @@ void SceneScriptPS10::ActorChangedGoal(int actorId, int newGoal, int oldGoal, bo
 void SceneScriptPS10::PlayerWalkedIn() {
 	if (Game_Flag_Query(15)) {
 		Loop_Actor_Walk_To_XYZ(kActorMcCoy, -352.09f, -9.23f, 267.95f, 0, 0, true, 0);
-		Police_Maze_Set_Pause_State(0);
+		Police_Maze_Set_Pause_State(false);
 		Game_Flag_Reset(15);
 		//return true;
 		return;
@@ -221,7 +221,7 @@ void SceneScriptPS10::PlayerWalkedIn() {
 		Actor_Says(kActorAnsweringMachine, 280, 3);
 		Actor_Says(kActorAnsweringMachine, 290, 3);
 		Actor_Says(kActorAnsweringMachine, 300, 3);
-		Police_Maze_Set_Pause_State(0);
+		Police_Maze_Set_Pause_State(false);
 		//return true;
 		return;
 	}
diff --git a/engines/bladerunner/script/scene/ps11.cpp b/engines/bladerunner/script/scene/ps11.cpp
index 1aa227b..e6311b3 100644
--- a/engines/bladerunner/script/scene/ps11.cpp
+++ b/engines/bladerunner/script/scene/ps11.cpp
@@ -254,7 +254,7 @@ void SceneScriptPS11::ActorChangedGoal(int actorId, int newGoal, int oldGoal, bo
 }
 
 void SceneScriptPS11::PlayerWalkedIn() {
-	Police_Maze_Set_Pause_State(0);
+	Police_Maze_Set_Pause_State(false);
 }
 
 void SceneScriptPS11::PlayerWalkedOut() {
diff --git a/engines/bladerunner/script/scene/ps12.cpp b/engines/bladerunner/script/scene/ps12.cpp
index 2e6f54e..d4d771a 100644
--- a/engines/bladerunner/script/scene/ps12.cpp
+++ b/engines/bladerunner/script/scene/ps12.cpp
@@ -25,7 +25,7 @@
 namespace BladeRunner {
 
 void SceneScriptPS12::InitializeScene() {
-	Police_Maze_Set_Pause_State(1);
+	Police_Maze_Set_Pause_State(true);
 	if (Game_Flag_Query(16)) {
 		Scene_Loop_Start_Special(0, 0, 0);
 		Scene_Loop_Set_Default(1);
@@ -270,7 +270,7 @@ void SceneScriptPS12::PlayerWalkedIn() {
 		Loop_Actor_Walk_To_XYZ(kActorMcCoy, -546.0f, -9.06f, 570.0f, 0, 1, false, 0);
 		Game_Flag_Reset(16);
 	}
-	Police_Maze_Set_Pause_State(0);
+	Police_Maze_Set_Pause_State(false);
 }
 
 void SceneScriptPS12::PlayerWalkedOut() {
diff --git a/engines/bladerunner/script/scene/ps13.cpp b/engines/bladerunner/script/scene/ps13.cpp
index 736df76..f525d48 100644
--- a/engines/bladerunner/script/scene/ps13.cpp
+++ b/engines/bladerunner/script/scene/ps13.cpp
@@ -25,7 +25,7 @@
 namespace BladeRunner {
 
 void SceneScriptPS13::InitializeScene() {
-	Police_Maze_Set_Pause_State(1);
+	Police_Maze_Set_Pause_State(true);
 	if (Game_Flag_Query(18)) {
 		Scene_Loop_Start_Special(0, 0, 0);
 		Scene_Loop_Set_Default(1);
@@ -255,7 +255,7 @@ void SceneScriptPS13::ActorChangedGoal(int actorId, int newGoal, int oldGoal, bo
 }
 
 void SceneScriptPS13::PlayerWalkedIn() {
-	Police_Maze_Set_Pause_State(0);
+	Police_Maze_Set_Pause_State(false);
 }
 
 void SceneScriptPS13::PlayerWalkedOut() {
diff --git a/engines/bladerunner/script/script.cpp b/engines/bladerunner/script/script.cpp
index fc595bc..f4818b1 100644
--- a/engines/bladerunner/script/script.cpp
+++ b/engines/bladerunner/script/script.cpp
@@ -39,6 +39,7 @@
 #include "bladerunner/movement_track.h"
 #include "bladerunner/music.h"
 #include "bladerunner/overlays.h"
+#include "bladerunner/police_maze.h"
 #include "bladerunner/regions.h"
 #include "bladerunner/set.h"
 #include "bladerunner/settings.h"
@@ -1100,20 +1101,32 @@ void ScriptBase::Combat_Flee_Waypoint_Set_Data(int fleeWaypointId, int type, int
 }
 
 void ScriptBase::Police_Maze_Target_Track_Add(int itemId, float startX, float startY, float startZ, float endX, float endY, float endZ, int steps, signed int data[], bool a10) {
-	//TODO
-	warning("Police_Maze_Target_Track_Add(%d, %f, %f, %f, %f, %f, %f, %d, %p, %d)", itemId,  startX,  startY,  startZ,  endX,  endY,  endZ,  steps,  (void *)data,  a10);
+	_vm->_policeMaze->_tracks[itemId]->add(itemId, startX, startY, startZ, endX, endY, endZ, steps, data, a10);
+	_vm->_policeMaze->activate();
+}
 
+int ScriptBase::Police_Maze_Query_Score() {
+	return Global_Variable_Query(kVariablePoliceMazeScore);
 }
 
-// ScriptBase::Police_Maze_Query_Score
-// ScriptBase::Police_Maze_Zero_Score
-// ScriptBase::Police_Maze_Increment_Score
-// ScriptBase::Police_Maze_Decrement_Score
-// ScriptBase::Police_Maze_Set_Score
+void ScriptBase::Police_Maze_Zero_Score() {
+	Global_Variable_Reset(kVariablePoliceMazeScore);
+}
 
-void ScriptBase::Police_Maze_Set_Pause_State(int a1) {
-	//TODO
-	warning("Police_Maze_Set_Pause_State(%d)", a1);
+void ScriptBase::Police_Maze_Increment_Score(int delta) {
+	Global_Variable_Set(kVariablePoliceMazeScore, Global_Variable_Query(kVariablePoliceMazeScore) + delta);
+}
+
+void ScriptBase::Police_Maze_Decrement_Score(int delta) {
+	Global_Variable_Set(kVariablePoliceMazeScore, Global_Variable_Query(kVariablePoliceMazeScore) - delta);
+}
+
+void ScriptBase::Police_Maze_Set_Score(int value) {
+	Global_Variable_Set(kVariablePoliceMazeScore, value);
+}
+
+void ScriptBase::Police_Maze_Set_Pause_State(bool state) {
+	_vm->_policeMaze->setPauseState(state);
 }
 
 void ScriptBase::CDB_Set_Crime(int clueId, int crimeId) {
diff --git a/engines/bladerunner/script/script.h b/engines/bladerunner/script/script.h
index 3940c45..07b5039 100644
--- a/engines/bladerunner/script/script.h
+++ b/engines/bladerunner/script/script.h
@@ -208,12 +208,12 @@ protected:
 	void Combat_Cover_Waypoint_Set_Data(int coverWaypointId, int a2, int setId, int a4, float x, float y, float z);
 	void Combat_Flee_Waypoint_Set_Data(int fleeWaypointId, int a2, int setId, int a4, float x, float y, float z, int a8);
 	void Police_Maze_Target_Track_Add(int itemId, float startX, float startY, float startZ, float endX, float endY, float endZ, int steps, signed int data[], bool a10);
-	// Police_Maze_Query_Score
-	// Police_Maze_Zero_Score
-	// Police_Maze_Increment_Score
-	// Police_Maze_Decrement_Score
-	// Police_Maze_Set_Score
-	void Police_Maze_Set_Pause_State(int a1);
+	int Police_Maze_Query_Score();
+	void Police_Maze_Zero_Score();
+	void Police_Maze_Increment_Score(int delta);
+	void Police_Maze_Decrement_Score(int delta);
+	void Police_Maze_Set_Score(int value);
+	void Police_Maze_Set_Pause_State(bool state);
 	void CDB_Set_Crime(int clueId, int crimeId);
 	void CDB_Set_Clue_Asset_Type(int clueId, int assetType);
 	void SDB_Set_Actor(int suspectId, int actorId);


Commit: da2c7142ce2513b8464c30ed4872eeff69987d6e
    https://github.com/scummvm/scummvm/commit/da2c7142ce2513b8464c30ed4872eeff69987d6e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-03-24T02:45:26+01:00

Commit Message:
BLADERUNNER: Implement Item_Spin_In_World()

Changed paths:
    engines/bladerunner/item.cpp
    engines/bladerunner/item.h
    engines/bladerunner/items.cpp
    engines/bladerunner/items.h
    engines/bladerunner/script/script.cpp


diff --git a/engines/bladerunner/item.cpp b/engines/bladerunner/item.cpp
index af7b2ef..7fca4d1 100644
--- a/engines/bladerunner/item.cpp
+++ b/engines/bladerunner/item.cpp
@@ -73,6 +73,10 @@ bool Item::isTarget() const {
 	return _isTarget;
 }
 
+bool Item::isPoliceMazeEnemy() const {
+	return _isPoliceMazeEnemy;
+}
+
 bool Item::tick(Common::Rect *screenRect, bool special) {
 	if (!_isVisible) {
 		*screenRect = Common::Rect();
@@ -152,6 +156,15 @@ void Item::setup(int itemId, int setId, int animationId, Vector3 position, int f
 	_screenRectangle.left = -1;
 }
 
+void Item::spinInWorld() {
+	_isSpinning = true;
+	if (_vm->_rnd.getRandomNumberRng(1, 2) == 1) {
+		_facingChange = -340;
+	} else {
+		_facingChange = 340;
+	}
+}
+
 bool Item::isUnderMouse(int mouseX, int mouseY) const {
 	return _isVisible
 	    && mouseX >= _screenRectangle.left   - 10
diff --git a/engines/bladerunner/item.h b/engines/bladerunner/item.h
index 89bec55..baabdb8 100644
--- a/engines/bladerunner/item.h
+++ b/engines/bladerunner/item.h
@@ -66,6 +66,8 @@ public:
 	void getWidthHeight(int *width, int *height) const;
 
 	bool isTarget() const;
+	bool isPoliceMazeEnemy() const;
+	void spinInWorld();
 	bool tick(Common::Rect *screenRect, bool special);
 
 	void setup(int itemId, int setId, int animationId, Vector3 position, int facing, int height, int width, bool isTargetFlag, bool isVisible, bool isPoliceMazeEnemy);
diff --git a/engines/bladerunner/items.cpp b/engines/bladerunner/items.cpp
index 9d9efd6..d526477 100644
--- a/engines/bladerunner/items.cpp
+++ b/engines/bladerunner/items.cpp
@@ -126,6 +126,22 @@ bool Items::isTarget(int itemId) const {
 	return _items[itemIndex]->isTarget();
 }
 
+bool Items::isPoliceMazeEnemy(int itemId) const {
+	int itemIndex = findItem(itemId);
+	if (itemIndex == -1) {
+		return false;
+	}
+	return _items[itemIndex]->isTarget();
+}
+
+void Items::spinInWorld(int itemId) {
+	int itemIndex = findItem(itemId);
+	if (itemIndex == -1) {
+		return;
+	}
+	_items[itemIndex]->spinInWorld();
+}
+
 int Items::findTargetUnderMouse(int mouseX, int mouseY) const {
 	int setId = _vm->_scene->getSetId();
 	for (int i = 0 ; i < (int)_items.size(); ++i) {
diff --git a/engines/bladerunner/items.h b/engines/bladerunner/items.h
index 1aac82e..20f51b9 100644
--- a/engines/bladerunner/items.h
+++ b/engines/bladerunner/items.h
@@ -48,8 +48,11 @@ public:
 	bool remove(int itemId);
 
 	bool isTarget(int itemId) const;
+	bool isPoliceMazeEnemy(int itemId) const;
 	int findTargetUnderMouse(int mouseX, int mouseY) const;
 
+	void spinInWorld(int itemId);
+
 private:
 	int findItem(int itemId) const;
 };
diff --git a/engines/bladerunner/script/script.cpp b/engines/bladerunner/script/script.cpp
index f4818b1..26e87cb 100644
--- a/engines/bladerunner/script/script.cpp
+++ b/engines/bladerunner/script/script.cpp
@@ -681,7 +681,12 @@ void ScriptBase::Item_Remove_From_World(int itemId) {
 }
 
 void ScriptBase::Item_Spin_In_World(int itemId) {
-	warning("Item_Spin_In_World(%d)", itemId);
+	_vm->_items->spinInWorld(itemId);
+	if (_vm->_items->isPoliceMazeEnemy(itemId)) {
+		Police_Maze_Increment_Score(1);
+	} else {
+		Police_Maze_Decrement_Score(1);
+	}
 }
 
 void ScriptBase::Item_Flag_As_Target(int itemId) {


Commit: 05144ab3cae69dd2438dd3442c0157ae3a07deaf
    https://github.com/scummvm/scummvm/commit/05144ab3cae69dd2438dd3442c0157ae3a07deaf
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-03-24T02:45:26+01:00

Commit Message:
BLADERUNNER: Implement setting items as target

Changed paths:
    engines/bladerunner/item.h
    engines/bladerunner/items.cpp
    engines/bladerunner/items.h
    engines/bladerunner/script/script.cpp


diff --git a/engines/bladerunner/item.h b/engines/bladerunner/item.h
index baabdb8..6842df1 100644
--- a/engines/bladerunner/item.h
+++ b/engines/bladerunner/item.h
@@ -65,6 +65,8 @@ public:
 	void setXYZ(Vector3 position);
 	void getWidthHeight(int *width, int *height) const;
 
+	void setIsTarget(bool isTarget) { _isTarget = isTarget; }
+
 	bool isTarget() const;
 	bool isPoliceMazeEnemy() const;
 	void spinInWorld();
diff --git a/engines/bladerunner/items.cpp b/engines/bladerunner/items.cpp
index d526477..81164e3 100644
--- a/engines/bladerunner/items.cpp
+++ b/engines/bladerunner/items.cpp
@@ -118,6 +118,15 @@ bool Items::remove(int itemId) {
 	return true;
 }
 
+void Items::setIsTarget(int itemId, bool isTarget) {
+	int itemIndex = findItem(itemId);
+	if (itemIndex == -1) {
+		return;
+	}
+	_items[itemIndex]->setIsTarget(isTarget);
+	_vm->_sceneObjects->setIsTarget(itemId + kSceneObjectOffsetItems, isTarget);
+}
+
 bool Items::isTarget(int itemId) const {
 	int itemIndex = findItem(itemId);
 	if (itemIndex == -1) {
diff --git a/engines/bladerunner/items.h b/engines/bladerunner/items.h
index 20f51b9..1c68eb6 100644
--- a/engines/bladerunner/items.h
+++ b/engines/bladerunner/items.h
@@ -47,6 +47,7 @@ public:
 	bool addToSet(int itemId);
 	bool remove(int itemId);
 
+	void setIsTarget(int itemId, bool isTarget);
 	bool isTarget(int itemId) const;
 	bool isPoliceMazeEnemy(int itemId) const;
 	int findTargetUnderMouse(int mouseX, int mouseY) const;
diff --git a/engines/bladerunner/script/script.cpp b/engines/bladerunner/script/script.cpp
index 26e87cb..3c1f041 100644
--- a/engines/bladerunner/script/script.cpp
+++ b/engines/bladerunner/script/script.cpp
@@ -690,11 +690,11 @@ void ScriptBase::Item_Spin_In_World(int itemId) {
 }
 
 void ScriptBase::Item_Flag_As_Target(int itemId) {
-	warning("Item_Flag_As_Target(%d)", itemId);
+	_vm->_items->setIsTarget(itemId, true);
 }
 
 void ScriptBase::Item_Flag_As_Non_Target(int itemId) {
-	warning("Item_Flag_As_Non_Target(%d)", itemId);
+	_vm->_items->setIsTarget(itemId, false);
 }
 
 void ScriptBase::Item_Pickup_Spin_Effect(int animationId, int x, int y) {


Commit: 5a94c42e80c5454d06614a3c294aa5f28f01303d
    https://github.com/scummvm/scummvm/commit/5a94c42e80c5454d06614a3c294aa5f28f01303d
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-03-24T02:45:26+01:00

Commit Message:
BLADERUNNER: Implement PoliceMaze::tick()

Changed paths:
    engines/bladerunner/police_maze.cpp
    engines/bladerunner/police_maze.h
    engines/bladerunner/script/scene_script.h
    engines/bladerunner/script/script.h


diff --git a/engines/bladerunner/police_maze.cpp b/engines/bladerunner/police_maze.cpp
index 8c79fc7..52521ca 100644
--- a/engines/bladerunner/police_maze.cpp
+++ b/engines/bladerunner/police_maze.cpp
@@ -21,8 +21,10 @@
  */
 
 #include "bladerunner/bladerunner.h"
-
+#include "bladerunner/game_constants.h"
 #include "bladerunner/police_maze.h"
+#include "bladerunner/scene.h"
+#include "bladerunner/script/scene_script.h"
 
 namespace BladeRunner {
 
@@ -45,7 +47,7 @@ PoliceMaze::~PoliceMaze() {
 }
 
 void PoliceMaze::reset() {
-	_isActive = false;
+	_isPaused = false;
 	_needAnnouncement = false;
 	_announcementRead = false;
 
@@ -67,6 +69,39 @@ void PoliceMaze::setPauseState(bool state) {
 }
 
 void PoliceMaze::tick() {
+	if (_isPaused)
+		return;
+
+	if (_vm->_scene->getSetId() != kSetPS10_PS11_PS12_PS13)
+		return;
+
+	if (_announcementRead) {
+		_needAnnouncement = false;
+
+		return;
+	}
+
+	for (int i = 0; i < kNumMazeTracks; i++)
+		_tracks[i]->tick();
+
+	bool notFound = true;
+	for (int i = 0; i < kNumMazeTracks; i++) {
+		if (!_tracks[i]->isVisible()) {
+			notFound = false;
+			break;
+		}
+	}
+
+	if (notFound && _needAnnouncement && !_announcementRead) {
+		_needAnnouncement = false;
+		_announcementRead = true;
+
+		if (_vm->_scene->getSceneId() == kScenePS13) {
+			_vm->_sceneScript->actorVoiceOver(320, kActorAnsweringMachine);
+		} else {
+			_vm->_sceneScript->actorVoiceOver(310, kActorAnsweringMachine);
+		}
+	}
 }
 
 PoliceMazeTargetTrack::PoliceMazeTargetTrack() {
@@ -99,5 +134,7 @@ void PoliceMazeTargetTrack::add(int trackId, float startX, float startY, float s
 	warning("PoliceMazeTargetTrack::add(%d, %f, %f, %f, %f, %f, %f, %d, %p, %d)", trackId,  startX,  startY,  startZ,  endX,  endY,  endZ,  count,  (void *)list, a11);
 }
 
+void PoliceMazeTargetTrack::tick() {
+}
 
 } // End of namespace BladeRunner
diff --git a/engines/bladerunner/police_maze.h b/engines/bladerunner/police_maze.h
index ef49161..96fac2f 100644
--- a/engines/bladerunner/police_maze.h
+++ b/engines/bladerunner/police_maze.h
@@ -59,12 +59,15 @@ public:
 
 	void reset();
 	void add(int trackId, float startX, float startY, float startZ, float endX, float endY, float endZ, int count, void *list, bool a11);
+
+	void tick();
+	bool isVisible() { return _visible; }
 };
 
 class PoliceMaze {
 	BladeRunnerEngine *_vm;
 
-	bool _isActive;
+	bool _isPaused;
 	bool _needAnnouncement;
 	bool _announcementRead;
 	int _pm_var1;
diff --git a/engines/bladerunner/script/scene_script.h b/engines/bladerunner/script/scene_script.h
index 54047ed..f9f0805 100644
--- a/engines/bladerunner/script/scene_script.h
+++ b/engines/bladerunner/script/scene_script.h
@@ -546,6 +546,8 @@ public:
 	void playerWalkedOut();
 	void dialogueQueueFlushed(int a1);
 	bool isInsideScript() const { return _inScriptCounter > 0; }
+
+	void actorVoiceOver(int sentenceId, int actorId) { _currentScript->Actor_Voice_Over(sentenceId, actorId); }
 };
 
 } // End of namespace BladeRunner
diff --git a/engines/bladerunner/script/script.h b/engines/bladerunner/script/script.h
index 07b5039..8e7ac9e 100644
--- a/engines/bladerunner/script/script.h
+++ b/engines/bladerunner/script/script.h
@@ -33,6 +33,8 @@ namespace BladeRunner {
 class BladeRunnerEngine;
 
 class ScriptBase {
+friend class SceneScript;
+
 protected:
 	BladeRunnerEngine *_vm;
 


Commit: 540567d1d8a8446d42c5340c357f5f38c70c05cc
    https://github.com/scummvm/scummvm/commit/540567d1d8a8446d42c5340c357f5f38c70c05cc
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-03-24T02:45:26+01:00

Commit Message:
BLADERUNNER: Hook PoliceMaze to Scene class

Changed paths:
    engines/bladerunner/police_maze.cpp
    engines/bladerunner/police_maze.h
    engines/bladerunner/scene.cpp


diff --git a/engines/bladerunner/police_maze.cpp b/engines/bladerunner/police_maze.cpp
index 52521ca..11eeb86 100644
--- a/engines/bladerunner/police_maze.cpp
+++ b/engines/bladerunner/police_maze.cpp
@@ -59,13 +59,25 @@ void PoliceMaze::reset() {
 	_pm_var2 = 0;
 }
 
+void PoliceMaze::clear(bool isLoadingGame) {
+	for (int i = 0; i < kNumMazeTracks; i++) {
+		if (_tracks[i]->isPresent())
+			_tracks[i]->clear(isLoadingGame);
+	}
+}
+
 void PoliceMaze::activate() {
 	_needAnnouncement = true;
 	_announcementRead = false;
 }
 
 void PoliceMaze::setPauseState(bool state) {
-	warning("PoliceMaze::setPauseState(%d)", state);
+	_isPaused = state;
+
+	uint32 t = _vm->getTotalPlayTime();
+
+	for (int i = 0; i < kNumMazeTracks; i++)
+		_tracks[i]->setTime(t);
 }
 
 void PoliceMaze::tick() {
@@ -109,6 +121,7 @@ PoliceMazeTargetTrack::PoliceMazeTargetTrack() {
 }
 
 PoliceMazeTargetTrack::~PoliceMazeTargetTrack() {
+	reset();
 }
 
 void PoliceMazeTargetTrack::reset() {
@@ -130,6 +143,10 @@ void PoliceMazeTargetTrack::reset() {
 	_visible = true;
 }
 
+void PoliceMazeTargetTrack::clear(bool isLoadingGame) {
+	reset();
+}
+
 void PoliceMazeTargetTrack::add(int trackId, float startX, float startY, float startZ, float endX, float endY, float endZ, int count, void *list, bool a11) {
 	warning("PoliceMazeTargetTrack::add(%d, %f, %f, %f, %f, %f, %f, %d, %p, %d)", trackId,  startX,  startY,  startZ,  endX,  endY,  endZ,  count,  (void *)list, a11);
 }
diff --git a/engines/bladerunner/police_maze.h b/engines/bladerunner/police_maze.h
index 96fac2f..ce1a40f 100644
--- a/engines/bladerunner/police_maze.h
+++ b/engines/bladerunner/police_maze.h
@@ -35,7 +35,7 @@ enum {
 class BladeRunnerEngine;
 
 class PoliceMazeTargetTrack {
-	int _time;
+	uint32 _time;
 	bool _isPresent;
 	int _itemId;
 	int _count;
@@ -58,10 +58,15 @@ public:
 	~PoliceMazeTargetTrack();
 
 	void reset();
+	void clear(bool isLoadingGame);
 	void add(int trackId, float startX, float startY, float startZ, float endX, float endY, float endZ, int count, void *list, bool a11);
 
 	void tick();
+	bool isPresent() { return _isPresent; }
+	void setVisible() { _visible = true; }
+	void resetVisible() { _visible = false; }
 	bool isVisible() { return _visible; }
+	void setTime(uint32 t) { _time = t; }
 };
 
 class PoliceMaze {
@@ -82,6 +87,7 @@ public:
 
 	void tick();
 	void reset();
+	void clear(bool isLoadingGame);
 	void setPauseState(bool state);
 	void activate();
 };
diff --git a/engines/bladerunner/scene.cpp b/engines/bladerunner/scene.cpp
index 123134e..6b0404d 100644
--- a/engines/bladerunner/scene.cpp
+++ b/engines/bladerunner/scene.cpp
@@ -29,6 +29,7 @@
 #include "bladerunner/game_info.h"
 #include "bladerunner/items.h"
 #include "bladerunner/overlays.h"
+#include "bladerunner/police_maze.h"
 #include "bladerunner/regions.h"
 #include "bladerunner/scene_objects.h"
 #include "bladerunner/screen_effects.h"
@@ -187,7 +188,8 @@ bool Scene::close(bool isLoadingGame) {
 		return true;
 	}
 
-	//_vm->_policeMaze->clear(!isLoadingGame);
+	_vm->_policeMaze->clear(!isLoadingGame);
+
 	if (isLoadingGame) {
 		_vm->_sceneScript->playerWalkedOut();
 	}


Commit: 967de5d4aa400608cd586bb585d9e0904f44cd20
    https://github.com/scummvm/scummvm/commit/967de5d4aa400608cd586bb585d9e0904f44cd20
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-03-24T02:45:26+01:00

Commit Message:
BLADERUNNER: Implement PoliceMazeTargetTrack::readdObject()

Changed paths:
    engines/bladerunner/item.h
    engines/bladerunner/items.cpp
    engines/bladerunner/items.h
    engines/bladerunner/police_maze.cpp
    engines/bladerunner/police_maze.h


diff --git a/engines/bladerunner/item.h b/engines/bladerunner/item.h
index 6842df1..fcb2f22 100644
--- a/engines/bladerunner/item.h
+++ b/engines/bladerunner/item.h
@@ -65,9 +65,13 @@ public:
 	void setXYZ(Vector3 position);
 	void getWidthHeight(int *width, int *height) const;
 
+	BoundingBox *getBoundingBox() { return &_boundingBox; }
+	Common::Rect *getScreenRectangle() { return &_screenRectangle; }
+
 	void setIsTarget(bool isTarget) { _isTarget = isTarget; }
 
 	bool isTarget() const;
+	bool isVisible() const { return _isVisible; }
 	bool isPoliceMazeEnemy() const;
 	void spinInWorld();
 	bool tick(Common::Rect *screenRect, bool special);
diff --git a/engines/bladerunner/items.cpp b/engines/bladerunner/items.cpp
index 81164e3..7de1300 100644
--- a/engines/bladerunner/items.cpp
+++ b/engines/bladerunner/items.cpp
@@ -135,6 +135,14 @@ bool Items::isTarget(int itemId) const {
 	return _items[itemIndex]->isTarget();
 }
 
+bool Items::isVisible(int itemId) const {
+	int itemIndex = findItem(itemId);
+	if (itemIndex == -1) {
+		return false;
+	}
+	return _items[itemIndex]->isVisible();
+}
+
 bool Items::isPoliceMazeEnemy(int itemId) const {
 	int itemIndex = findItem(itemId);
 	if (itemIndex == -1) {
@@ -143,6 +151,22 @@ bool Items::isPoliceMazeEnemy(int itemId) const {
 	return _items[itemIndex]->isTarget();
 }
 
+BoundingBox *Items::getBoundingBox(int itemId) {
+	int itemIndex = findItem(itemId);
+	if (itemIndex == -1) {
+		return nullptr;
+	}
+	return _items[itemIndex]->getBoundingBox();
+}
+
+Common::Rect *Items::getScreenRectangle(int itemId) {
+	int itemIndex = findItem(itemId);
+	if (itemIndex == -1) {
+		return nullptr;
+	}
+	return _items[itemIndex]->getScreenRectangle();
+}
+
 void Items::spinInWorld(int itemId) {
 	int itemIndex = findItem(itemId);
 	if (itemIndex == -1) {
diff --git a/engines/bladerunner/items.h b/engines/bladerunner/items.h
index 1c68eb6..1c6f488 100644
--- a/engines/bladerunner/items.h
+++ b/engines/bladerunner/items.h
@@ -50,8 +50,12 @@ public:
 	void setIsTarget(int itemId, bool isTarget);
 	bool isTarget(int itemId) const;
 	bool isPoliceMazeEnemy(int itemId) const;
+	bool isVisible(int itemId) const;
 	int findTargetUnderMouse(int mouseX, int mouseY) const;
 
+	BoundingBox *getBoundingBox(int itemId);
+	Common::Rect *getScreenRectangle(int itemId);
+
 	void spinInWorld(int itemId);
 
 private:
diff --git a/engines/bladerunner/police_maze.cpp b/engines/bladerunner/police_maze.cpp
index 11eeb86..395804d 100644
--- a/engines/bladerunner/police_maze.cpp
+++ b/engines/bladerunner/police_maze.cpp
@@ -22,8 +22,10 @@
 
 #include "bladerunner/bladerunner.h"
 #include "bladerunner/game_constants.h"
+#include "bladerunner/items.h"
 #include "bladerunner/police_maze.h"
 #include "bladerunner/scene.h"
+#include "bladerunner/scene_objects.h"
 #include "bladerunner/script/scene_script.h"
 
 namespace BladeRunner {
@@ -34,7 +36,7 @@ PoliceMaze::PoliceMaze(BladeRunnerEngine *vm) {
 	reset();
 
 	for (int i = 0; i < kNumMazeTracks; i++) {
-		_tracks[i] = new PoliceMazeTargetTrack;
+		_tracks[i] = new PoliceMazeTargetTrack(vm);
 	}
 }
 
@@ -116,7 +118,9 @@ void PoliceMaze::tick() {
 	}
 }
 
-PoliceMazeTargetTrack::PoliceMazeTargetTrack() {
+PoliceMazeTargetTrack::PoliceMazeTargetTrack(BladeRunnerEngine *vm) {
+	_vm = vm;
+
 	reset();
 }
 
@@ -154,4 +158,16 @@ void PoliceMazeTargetTrack::add(int trackId, float startX, float startY, float s
 void PoliceMazeTargetTrack::tick() {
 }
 
+void PoliceMazeTargetTrack::readdObject(int itemId) {
+	if (_vm->_sceneObjects->remove(itemId + kSceneObjectOffsetItems)) {
+		BoundingBox *boundingBox = _vm->_items->getBoundingBox(itemId);
+		Common::Rect *screenRect = _vm->_items->getScreenRectangle(itemId);
+		bool targetable = _vm->_items->isTarget(itemId);
+		bool obstacle = _vm->_items->isVisible(itemId);
+
+		_vm->_sceneObjects->addItem(itemId + kSceneObjectOffsetItems, boundingBox, screenRect, targetable, obstacle);
+	}
+}
+
+
 } // End of namespace BladeRunner
diff --git a/engines/bladerunner/police_maze.h b/engines/bladerunner/police_maze.h
index ce1a40f..adf857c 100644
--- a/engines/bladerunner/police_maze.h
+++ b/engines/bladerunner/police_maze.h
@@ -35,6 +35,8 @@ enum {
 class BladeRunnerEngine;
 
 class PoliceMazeTargetTrack {
+	BladeRunnerEngine *_vm;
+
 	uint32 _time;
 	bool _isPresent;
 	int _itemId;
@@ -54,7 +56,7 @@ class PoliceMazeTargetTrack {
 	bool _visible;
 
 public:
-	PoliceMazeTargetTrack();
+	PoliceMazeTargetTrack(BladeRunnerEngine *vm);
 	~PoliceMazeTargetTrack();
 
 	void reset();
@@ -67,6 +69,8 @@ public:
 	void resetVisible() { _visible = false; }
 	bool isVisible() { return _visible; }
 	void setTime(uint32 t) { _time = t; }
+
+	void readdObject(int itemId);
 };
 
 class PoliceMaze {


Commit: bb492da8aaf5e072cd22eea44c2344309e92be4f
    https://github.com/scummvm/scummvm/commit/bb492da8aaf5e072cd22eea44c2344309e92be4f
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-03-24T02:45:26+01:00

Commit Message:
BLADERUNNER: Unstub PoliceMazeTargetTrack::add()

Changed paths:
    engines/bladerunner/police_maze.cpp


diff --git a/engines/bladerunner/police_maze.cpp b/engines/bladerunner/police_maze.cpp
index 395804d..7345dc0 100644
--- a/engines/bladerunner/police_maze.cpp
+++ b/engines/bladerunner/police_maze.cpp
@@ -152,7 +152,32 @@ void PoliceMazeTargetTrack::clear(bool isLoadingGame) {
 }
 
 void PoliceMazeTargetTrack::add(int trackId, float startX, float startY, float startZ, float endX, float endY, float endZ, int count, void *list, bool a11) {
-	warning("PoliceMazeTargetTrack::add(%d, %f, %f, %f, %f, %f, %f, %d, %p, %d)", trackId,  startX,  startY,  startZ,  endX,  endY,  endZ,  count,  (void *)list, a11);
+	_data = (int *)list;
+
+	if (true /* !GameIsLoading */) { // FIXME
+		_itemId = trackId;
+		_count = count;
+		_dataIndex = 0;
+
+		double coef = 1.0f / (long double)count;
+
+		double coefX = (endX - startX) * coef;
+		double coefY = (endY - startY) * coef;
+		double coefZ = (endZ - startZ) * coef;
+
+		for (int i = 0; i < count; i++) {
+			_points[i].x = i * coefX + startX;
+			_points[i].y = i * coefY + startY;
+			_points[i].z = i * coefZ + startZ;
+		}
+
+		_points[count].x = endX;
+		_points[count].y = endY;
+		_points[count].z = endZ;
+
+		_visible = !a11;
+	}
+	_isPresent = true;
 }
 
 void PoliceMazeTargetTrack::tick() {


Commit: ff11cee4808019c3304f0a298274554a68d78dcf
    https://github.com/scummvm/scummvm/commit/ff11cee4808019c3304f0a298274554a68d78dcf
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-03-24T02:45:26+01:00

Commit Message:
BLADERUNNER: Added WIP code for PoliceMazeTargetTrack::tick()

Changed paths:
    engines/bladerunner/mouse.cpp
    engines/bladerunner/mouse.h
    engines/bladerunner/police_maze.cpp
    engines/bladerunner/police_maze.h
    engines/bladerunner/script/scene_script.h


diff --git a/engines/bladerunner/mouse.cpp b/engines/bladerunner/mouse.cpp
index 7d67e98..a3a52b7 100644
--- a/engines/bladerunner/mouse.cpp
+++ b/engines/bladerunner/mouse.cpp
@@ -51,6 +51,11 @@ Mouse::Mouse(BladeRunnerEngine *vm) {
 	_disabledCounter = 0;
 	_lastFrameTime = 0;
 	_animCounter = 0;
+
+	_randomCountdownX = 0;
+	_randomCountdownY = 0;
+	_randomX = 0;
+	_randomY = 0;
 }
 
 Mouse::~Mouse() {
@@ -161,6 +166,28 @@ void Mouse::getXY(int *x, int *y) const {
 	*y = _y;
 }
 
+void Mouse::setRandomY() {
+	switch (_vm->_settings->getDifficulty()) {
+	case 0:
+		_randomCountdownY = 2;
+		_randomX = _vm->_rnd.getRandomNumberRng(-3, 3);
+		_randomY = _vm->_rnd.getRandomNumberRng(10, 20);
+		break;
+
+	case 1:
+		_randomCountdownY = 3;
+		_randomX = _vm->_rnd.getRandomNumberRng(-4, 4);
+		_randomY = _vm->_rnd.getRandomNumberRng(15, 25);
+		break;
+
+	case 2:
+		_randomCountdownY = 4;
+		_randomX = _vm->_rnd.getRandomNumberRng(-5, 5);
+		_randomY = _vm->_rnd.getRandomNumberRng(20, 30);
+		break;
+	}
+}
+
 void Mouse::disable() {
 	++_disabledCounter;
 }
diff --git a/engines/bladerunner/mouse.h b/engines/bladerunner/mouse.h
index 2f33d72..e63c101 100644
--- a/engines/bladerunner/mouse.h
+++ b/engines/bladerunner/mouse.h
@@ -46,6 +46,11 @@ class Mouse {
 	int _lastFrameTime;
 	int _animCounter;
 
+	int _randomCountdownX;
+	int _randomCountdownY;
+	int _randomX;
+	int _randomY;
+
 public:
 	Mouse(BladeRunnerEngine *vm);
 	~Mouse();
@@ -53,6 +58,7 @@ public:
 	void setCursor(int cursor);
 
 	void getXY(int *x, int *y) const;
+	void setRandomY();
 
 	void disable();
 	void enable();
diff --git a/engines/bladerunner/police_maze.cpp b/engines/bladerunner/police_maze.cpp
index 7345dc0..43e4457 100644
--- a/engines/bladerunner/police_maze.cpp
+++ b/engines/bladerunner/police_maze.cpp
@@ -23,6 +23,7 @@
 #include "bladerunner/bladerunner.h"
 #include "bladerunner/game_constants.h"
 #include "bladerunner/items.h"
+#include "bladerunner/mouse.h"
 #include "bladerunner/police_maze.h"
 #include "bladerunner/scene.h"
 #include "bladerunner/scene_objects.h"
@@ -30,9 +31,7 @@
 
 namespace BladeRunner {
 
-PoliceMaze::PoliceMaze(BladeRunnerEngine *vm) {
-	_vm = vm;
-
+PoliceMaze::PoliceMaze(BladeRunnerEngine *vm) : ScriptBase(vm) {
 	reset();
 
 	for (int i = 0; i < kNumMazeTracks; i++) {
@@ -111,16 +110,14 @@ void PoliceMaze::tick() {
 		_announcementRead = true;
 
 		if (_vm->_scene->getSceneId() == kScenePS13) {
-			_vm->_sceneScript->actorVoiceOver(320, kActorAnsweringMachine);
+			Actor_Voice_Over(320, kActorAnsweringMachine);
 		} else {
-			_vm->_sceneScript->actorVoiceOver(310, kActorAnsweringMachine);
+			Actor_Voice_Over(310, kActorAnsweringMachine);
 		}
 	}
 }
 
-PoliceMazeTargetTrack::PoliceMazeTargetTrack(BladeRunnerEngine *vm) {
-	_vm = vm;
-
+PoliceMazeTargetTrack::PoliceMazeTargetTrack(BladeRunnerEngine *vm) : ScriptBase(vm) {
 	reset();
 }
 
@@ -134,14 +131,14 @@ void PoliceMazeTargetTrack::reset() {
 	_count = 0;
 	_data = 0;
 	_dataIndex = 0;
-	_pmt_var1 = 0;
-	_pmt_var2 = 0;
+	_updateDelay = 0;
+	_waitTime = 0;
 	_time = 0;
-	_pmt_var3 = 0;
+	_haveToWait = false;
 	_pmt_var4 = 0;
 	_pointIndex = 0;
 	_pmt_var5 = 0;
-	_rotating = 0;
+	_rotating = false;
 	_maxAngle = 0;
 	_angleChange = 0;
 	_visible = true;
@@ -180,7 +177,308 @@ void PoliceMazeTargetTrack::add(int trackId, float startX, float startY, float s
 	_isPresent = true;
 }
 
-void PoliceMazeTargetTrack::tick() {
+bool PoliceMazeTargetTrack::tick() {
+	if (!_isPresent) {
+		return false;
+	}
+
+#if 0
+
+	uint32 oldTime = _time;
+	_time = _vm->getTotalPlayTime();
+	int32 timeDiff = _time - oldTime;
+	_updateDelay -= timeDiff;
+
+	if (_updateDelay > 0)
+		return false;
+
+	_updateDelay = 66;
+
+	if (_visible)
+		return false;
+
+	if (_haveToWait) {
+		_waitTime -= timeDiff;
+
+		if (_waitTime > 0)
+			return true;
+
+		_haveToWait = false;
+		_waitTime = 0;
+	}
+
+	if (_vm->_items->isTarget(_itemId))
+		return true;
+
+	if (_rotating) {
+		float angle = _vm->_items->getFacing(_itemId) + _angleChange;
+
+		if (_angleChange > 0) {
+			if (angle >= _maxAngle) {
+				angle = _maxAngle;
+				_rotating = false;
+			}
+		} else if (_angleChange < 0) {
+			if (angle <= _maxAngle) {
+				angle = _maxAngle;
+				_rotating = false;
+			}
+		} else {
+			_rotating = false;
+		}
+
+		_vm->_items->setFacing(_itemId, angle);
+
+		if (_rotating)
+			return false;
+	}
+
+	bool advancePoint = false;
+
+	if (_pmt_var4) {
+		if (_pointIndex < _pmt_var5) {
+			_pointIndex++;
+			advancePoint = true;
+		} else if (_pointIndex > _pmt_var5) {
+			_pointIndex--;
+			advancePoint = true;
+		} else {
+			_pmt_var4 = 0;
+		}
+	}
+
+	if (advancePoint) {
+		_vm->_items->setXYZ(_itemId, _points[_pointIndex].x, _points[_pointIndex].y, _points[_pointIndex].z);
+		readdObject(_itemId);
+
+		return true;
+	}
+
+	bool cont = true;
+	int var1 = 0, var2 = 0, var3 = 0, varRes = 0;
+
+	while (cont) {
+		_dataIndex++;
+
+		switch (_data[_dataIndex - 1] + 26) {
+		case 0:
+			var1 = _data[_dataIndex++];
+			var2 = _data[_dataIndex++];
+
+			if (Global_Variable_Query(var1) >= Global_Variable_Query(var2)) {
+				setVisible();
+				cont = false;
+			} else {
+				cont = true;
+			}
+			break;
+
+		case 1:
+			if (!_vm->_items->isPoliceMazeEnemy(_itemId) && _vm->_items->isTarget(_itemId)) {
+				Police_Maze_Increment_Score(1);
+			}
+			break;
+
+		case 2:
+			var1 = _data[_dataIndex++];
+			_dataIndex++;
+
+			if (_vm->_items->isTarget(_itemId)) {
+				Sound_Play(var1, 90, 0, 0, 50, 0);
+				Police_Maze_Decrement_Score(1);
+				Actor_Force_Stop_Walking(0);
+
+				if (Player_Query_Combat_Mode() == 1) {
+					Actor_Change_Animation_Mode(0, 22);
+				} else {
+					Actor_Change_Animation_Mode(0, 21);
+				}
+
+				int snd;
+
+				if (Random_Query(1, 2) == 1) {
+					snd = 9900;
+				} else {
+					snd = 9905;
+				}
+				Sound_Play_Speech_Line(0, snd, 75, 0, 99);
+
+				_vm->_mouse->setRandomY();
+			}
+
+			cont = false;
+			break;
+
+		case 3:
+			var1 = _data[_dataIndex++];
+			_vm->_items->setPoliceMazeEnemy(var1, 0);
+			break;
+
+		case 4:
+			var1 = _data[_dataIndex++];
+			_vm->_items->setPoliceMazeEnemy(var1, 1);
+			break;
+
+		case 5:
+			var1 = _data[_dataIndex++];
+			Game_Flag_Reset(var1);
+			break;
+
+		case 6:
+			var1 = _data[_dataIndex++];
+			Game_Flag_Set(var1);
+			break;
+
+		case 7:
+			var1 = _data[_dataIndex++];
+			Global_Variable_Decrement(var1, 1);
+			break;
+
+		case 8:
+			var1 = _data[_dataIndex++];
+			var2 = _data[_dataIndex++];
+			if (Global_Variable_Query(var1) < var2) {
+				Global_Variable_Increment(var1, 1);
+			}
+			break;
+
+		case 9:
+			var1 = _data[_dataIndex++];
+			Global_Variable_Reset(var1);
+			break;
+
+		case 10:
+			var1 = _data[_dataIndex++];
+			var2 = _data[_dataIndex++];
+			Global_Variable_Set(var1, var2);
+			break;
+
+		case 11:
+			var1 = _data[_dataIndex++];
+			var2 = _data[_dataIndex++];
+			_vm->_items->setIsTarget(var1, var2);
+			break;
+
+		case 12:
+			var1 = _data[_dataIndex++];
+			var2 = _data[_dataIndex++];
+			var3 = _data[_dataIndex++];
+
+			switch (Random_Query(1, 3)) {
+			case 1:
+				varRes = var1;
+				break;
+
+			case 2:
+				varRes = var2;
+				break;
+
+			case 3:
+				varRes = var3;
+				break;
+			}
+
+			_vm->_policeMaze->_tracks[varRes]->resetVisible();
+			break;
+
+		case 13:
+			var1 = _data[_dataIndex++];
+			var2 = _data[_dataIndex++];
+
+			if (Random_Query(1, 2) == 1) {
+				varRes = var1;
+			} else {
+				varRes = var2;
+			}
+			_vm->_policeMaze->_tracks[varRes]->resetVisible();
+			break;
+
+		case 14:
+			var1 = _data[_dataIndex++];
+			_vm->_policeMaze->_tracks[var1]->setVisible();
+			break;
+
+		case 15:
+			var1 = _data[_dataIndex++];
+			_vm->_policeMaze->_tracks[var1]->resetVisible();
+			break;
+
+		case 16:
+			var1 = _data[_dataIndex++];
+			var2 = _data[_dataIndex++];
+			Sound_Play(var1, var2, 0, 0, 50, 0);
+			break;
+
+		case 17:
+			var1 = _data[_dataIndex++];
+			_vm->_items->setIsObstacle(var1, 0);
+			break;
+
+		case 18:
+			var1 = _data[_dataIndex++];
+			_vm->_items->setIsObstacle(var1, 1);
+			break;
+
+		case 19:
+			var1 = _data[_dataIndex++];
+			var2 = _data[_dataIndex++];
+			_waitTime = Random_Query(var1, var2);
+			_haveToWait = true;
+
+			cont = false;
+			break;
+
+		case 20:
+			_maxAngle = _data[_dataIndex++];
+			_angleChange = _data[_dataIndex++];
+			_rotating = true;
+
+			cont = false;
+			break;
+
+		case 21:
+			var1 = _data[_dataIndex++];
+			_vm->_items->setFacing(_itemId, var1);
+			break;
+
+		case 22:
+			_dataIndex = 0;
+
+			cont = false;
+			break;
+
+		case 23:
+			_waitTime = _data[_dataIndex++];
+			_haveToWait = true;
+
+			cont = false;
+			break;
+
+		case 24:
+			_pmt_var5 = _data[_dataIndex++];
+			_pmt_var4 = 1;
+
+			cont = false;
+			break;
+
+		case 25:
+			_pointIndex = _data[_dataIndex++];
+			_pmt_var4 = 0;
+			_vm->_items->setXYZ(_itemId, _points[_pointIndex].x, _points[_pointIndex].y, _points[_pointIndex].z);
+			readdObject(_itemId);
+			break;
+
+		default:
+			return false;
+		}
+
+		if (_visible || _haveToWait) {
+			cont = false;
+		}
+	}
+#endif
+
+	return true;
 }
 
 void PoliceMazeTargetTrack::readdObject(int itemId) {
diff --git a/engines/bladerunner/police_maze.h b/engines/bladerunner/police_maze.h
index adf857c..1cb9da5 100644
--- a/engines/bladerunner/police_maze.h
+++ b/engines/bladerunner/police_maze.h
@@ -23,6 +23,7 @@
 #ifndef BLADERUNNER_POLICE_MAZE_H
 #define BLADERUNNER_POLICE_MAZE_H
 
+#include "bladerunner/script/script.h"
 #include "bladerunner/vector.h"
 
 namespace BladeRunner {
@@ -34,7 +35,7 @@ enum {
 
 class BladeRunnerEngine;
 
-class PoliceMazeTargetTrack {
+class PoliceMazeTargetTrack : ScriptBase {
 	BladeRunnerEngine *_vm;
 
 	uint32 _time;
@@ -44,13 +45,13 @@ class PoliceMazeTargetTrack {
 	Vector3 _points[kNumTrackPoints];
 	int *_data;
 	int _dataIndex;
-	int _pmt_var1;
-	int _pmt_var2;
-	int _pmt_var3;
+	int32 _updateDelay;
+	int32 _waitTime;
+	bool _haveToWait;
 	int _pmt_var4;
 	int _pointIndex;
 	int _pmt_var5;
-	int _rotating;
+	bool _rotating;
 	int _maxAngle;
 	int _angleChange;
 	bool _visible;
@@ -63,7 +64,7 @@ public:
 	void clear(bool isLoadingGame);
 	void add(int trackId, float startX, float startY, float startZ, float endX, float endY, float endZ, int count, void *list, bool a11);
 
-	void tick();
+	bool tick();
 	bool isPresent() { return _isPresent; }
 	void setVisible() { _visible = true; }
 	void resetVisible() { _visible = false; }
@@ -73,7 +74,7 @@ public:
 	void readdObject(int itemId);
 };
 
-class PoliceMaze {
+class PoliceMaze : ScriptBase {
 	BladeRunnerEngine *_vm;
 
 	bool _isPaused;
diff --git a/engines/bladerunner/script/scene_script.h b/engines/bladerunner/script/scene_script.h
index f9f0805..54047ed 100644
--- a/engines/bladerunner/script/scene_script.h
+++ b/engines/bladerunner/script/scene_script.h
@@ -546,8 +546,6 @@ public:
 	void playerWalkedOut();
 	void dialogueQueueFlushed(int a1);
 	bool isInsideScript() const { return _inScriptCounter > 0; }
-
-	void actorVoiceOver(int sentenceId, int actorId) { _currentScript->Actor_Voice_Over(sentenceId, actorId); }
 };
 
 } // End of namespace BladeRunner


Commit: 55245a8ccab7b31f6c5158b1f980903bc6234205
    https://github.com/scummvm/scummvm/commit/55245a8ccab7b31f6c5158b1f980903bc6234205
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-03-24T02:45:26+01:00

Commit Message:
BLADERUNNER: Moved PoliceMaze to script/

Changed paths:
  A engines/bladerunner/script/police_maze.cpp
  A engines/bladerunner/script/police_maze.h
  R engines/bladerunner/police_maze.cpp
  R engines/bladerunner/police_maze.h
    engines/bladerunner/bladerunner.cpp
    engines/bladerunner/module.mk
    engines/bladerunner/scene.cpp
    engines/bladerunner/script/script.cpp


diff --git a/engines/bladerunner/bladerunner.cpp b/engines/bladerunner/bladerunner.cpp
index aa1fb97..0fd7663 100644
--- a/engines/bladerunner/bladerunner.cpp
+++ b/engines/bladerunner/bladerunner.cpp
@@ -45,7 +45,6 @@
 #include "bladerunner/outtake.h"
 #include "bladerunner/obstacles.h"
 #include "bladerunner/overlays.h"
-#include "bladerunner/police_maze.h"
 #include "bladerunner/regions.h"
 #include "bladerunner/scene.h"
 #include "bladerunner/scene_objects.h"
@@ -54,6 +53,7 @@
 #include "bladerunner/script/ai_script.h"
 #include "bladerunner/script/init_script.h"
 #include "bladerunner/script/kia_script.h"
+#include "bladerunner/script/police_maze.h"
 #include "bladerunner/script/scene_script.h"
 #include "bladerunner/settings.h"
 #include "bladerunner/shape.h"
diff --git a/engines/bladerunner/module.mk b/engines/bladerunner/module.mk
index f7f7984..bf90922 100644
--- a/engines/bladerunner/module.mk
+++ b/engines/bladerunner/module.mk
@@ -40,7 +40,6 @@ MODULE_OBJS = \
 	obstacles.o \
 	outtake.o \
 	overlays.o \
-	police_maze.o \
 	regions.o \
 	scene.o \
 	scene_objects.o \
@@ -50,6 +49,7 @@ MODULE_OBJS = \
 	script/kia_script.o \
 	script/vk_script.o \
 	script/esper_script.o \
+	script/police_maze.o \
 	script/ai_script.o \
 	script/ai/answering_machine.o \
 	script/ai/baker.o \
diff --git a/engines/bladerunner/police_maze.cpp b/engines/bladerunner/police_maze.cpp
deleted file mode 100644
index 43e4457..0000000
--- a/engines/bladerunner/police_maze.cpp
+++ /dev/null
@@ -1,496 +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/bladerunner.h"
-#include "bladerunner/game_constants.h"
-#include "bladerunner/items.h"
-#include "bladerunner/mouse.h"
-#include "bladerunner/police_maze.h"
-#include "bladerunner/scene.h"
-#include "bladerunner/scene_objects.h"
-#include "bladerunner/script/scene_script.h"
-
-namespace BladeRunner {
-
-PoliceMaze::PoliceMaze(BladeRunnerEngine *vm) : ScriptBase(vm) {
-	reset();
-
-	for (int i = 0; i < kNumMazeTracks; i++) {
-		_tracks[i] = new PoliceMazeTargetTrack(vm);
-	}
-}
-
-PoliceMaze::~PoliceMaze() {
-	for (int i = 0; i < kNumMazeTracks; i++) {
-		delete _tracks[i];
-	}
-
-	reset();
-}
-
-void PoliceMaze::reset() {
-	_isPaused = false;
-	_needAnnouncement = false;
-	_announcementRead = false;
-
-	for (int i = 0; i < kNumMazeTracks; i++) {
-		_tracks[i] = 0;
-	}
-
-	_pm_var1 = 0;
-	_pm_var2 = 0;
-}
-
-void PoliceMaze::clear(bool isLoadingGame) {
-	for (int i = 0; i < kNumMazeTracks; i++) {
-		if (_tracks[i]->isPresent())
-			_tracks[i]->clear(isLoadingGame);
-	}
-}
-
-void PoliceMaze::activate() {
-	_needAnnouncement = true;
-	_announcementRead = false;
-}
-
-void PoliceMaze::setPauseState(bool state) {
-	_isPaused = state;
-
-	uint32 t = _vm->getTotalPlayTime();
-
-	for (int i = 0; i < kNumMazeTracks; i++)
-		_tracks[i]->setTime(t);
-}
-
-void PoliceMaze::tick() {
-	if (_isPaused)
-		return;
-
-	if (_vm->_scene->getSetId() != kSetPS10_PS11_PS12_PS13)
-		return;
-
-	if (_announcementRead) {
-		_needAnnouncement = false;
-
-		return;
-	}
-
-	for (int i = 0; i < kNumMazeTracks; i++)
-		_tracks[i]->tick();
-
-	bool notFound = true;
-	for (int i = 0; i < kNumMazeTracks; i++) {
-		if (!_tracks[i]->isVisible()) {
-			notFound = false;
-			break;
-		}
-	}
-
-	if (notFound && _needAnnouncement && !_announcementRead) {
-		_needAnnouncement = false;
-		_announcementRead = true;
-
-		if (_vm->_scene->getSceneId() == kScenePS13) {
-			Actor_Voice_Over(320, kActorAnsweringMachine);
-		} else {
-			Actor_Voice_Over(310, kActorAnsweringMachine);
-		}
-	}
-}
-
-PoliceMazeTargetTrack::PoliceMazeTargetTrack(BladeRunnerEngine *vm) : ScriptBase(vm) {
-	reset();
-}
-
-PoliceMazeTargetTrack::~PoliceMazeTargetTrack() {
-	reset();
-}
-
-void PoliceMazeTargetTrack::reset() {
-	_isPresent = 0;
-	_itemId = -1;
-	_count = 0;
-	_data = 0;
-	_dataIndex = 0;
-	_updateDelay = 0;
-	_waitTime = 0;
-	_time = 0;
-	_haveToWait = false;
-	_pmt_var4 = 0;
-	_pointIndex = 0;
-	_pmt_var5 = 0;
-	_rotating = false;
-	_maxAngle = 0;
-	_angleChange = 0;
-	_visible = true;
-}
-
-void PoliceMazeTargetTrack::clear(bool isLoadingGame) {
-	reset();
-}
-
-void PoliceMazeTargetTrack::add(int trackId, float startX, float startY, float startZ, float endX, float endY, float endZ, int count, void *list, bool a11) {
-	_data = (int *)list;
-
-	if (true /* !GameIsLoading */) { // FIXME
-		_itemId = trackId;
-		_count = count;
-		_dataIndex = 0;
-
-		double coef = 1.0f / (long double)count;
-
-		double coefX = (endX - startX) * coef;
-		double coefY = (endY - startY) * coef;
-		double coefZ = (endZ - startZ) * coef;
-
-		for (int i = 0; i < count; i++) {
-			_points[i].x = i * coefX + startX;
-			_points[i].y = i * coefY + startY;
-			_points[i].z = i * coefZ + startZ;
-		}
-
-		_points[count].x = endX;
-		_points[count].y = endY;
-		_points[count].z = endZ;
-
-		_visible = !a11;
-	}
-	_isPresent = true;
-}
-
-bool PoliceMazeTargetTrack::tick() {
-	if (!_isPresent) {
-		return false;
-	}
-
-#if 0
-
-	uint32 oldTime = _time;
-	_time = _vm->getTotalPlayTime();
-	int32 timeDiff = _time - oldTime;
-	_updateDelay -= timeDiff;
-
-	if (_updateDelay > 0)
-		return false;
-
-	_updateDelay = 66;
-
-	if (_visible)
-		return false;
-
-	if (_haveToWait) {
-		_waitTime -= timeDiff;
-
-		if (_waitTime > 0)
-			return true;
-
-		_haveToWait = false;
-		_waitTime = 0;
-	}
-
-	if (_vm->_items->isTarget(_itemId))
-		return true;
-
-	if (_rotating) {
-		float angle = _vm->_items->getFacing(_itemId) + _angleChange;
-
-		if (_angleChange > 0) {
-			if (angle >= _maxAngle) {
-				angle = _maxAngle;
-				_rotating = false;
-			}
-		} else if (_angleChange < 0) {
-			if (angle <= _maxAngle) {
-				angle = _maxAngle;
-				_rotating = false;
-			}
-		} else {
-			_rotating = false;
-		}
-
-		_vm->_items->setFacing(_itemId, angle);
-
-		if (_rotating)
-			return false;
-	}
-
-	bool advancePoint = false;
-
-	if (_pmt_var4) {
-		if (_pointIndex < _pmt_var5) {
-			_pointIndex++;
-			advancePoint = true;
-		} else if (_pointIndex > _pmt_var5) {
-			_pointIndex--;
-			advancePoint = true;
-		} else {
-			_pmt_var4 = 0;
-		}
-	}
-
-	if (advancePoint) {
-		_vm->_items->setXYZ(_itemId, _points[_pointIndex].x, _points[_pointIndex].y, _points[_pointIndex].z);
-		readdObject(_itemId);
-
-		return true;
-	}
-
-	bool cont = true;
-	int var1 = 0, var2 = 0, var3 = 0, varRes = 0;
-
-	while (cont) {
-		_dataIndex++;
-
-		switch (_data[_dataIndex - 1] + 26) {
-		case 0:
-			var1 = _data[_dataIndex++];
-			var2 = _data[_dataIndex++];
-
-			if (Global_Variable_Query(var1) >= Global_Variable_Query(var2)) {
-				setVisible();
-				cont = false;
-			} else {
-				cont = true;
-			}
-			break;
-
-		case 1:
-			if (!_vm->_items->isPoliceMazeEnemy(_itemId) && _vm->_items->isTarget(_itemId)) {
-				Police_Maze_Increment_Score(1);
-			}
-			break;
-
-		case 2:
-			var1 = _data[_dataIndex++];
-			_dataIndex++;
-
-			if (_vm->_items->isTarget(_itemId)) {
-				Sound_Play(var1, 90, 0, 0, 50, 0);
-				Police_Maze_Decrement_Score(1);
-				Actor_Force_Stop_Walking(0);
-
-				if (Player_Query_Combat_Mode() == 1) {
-					Actor_Change_Animation_Mode(0, 22);
-				} else {
-					Actor_Change_Animation_Mode(0, 21);
-				}
-
-				int snd;
-
-				if (Random_Query(1, 2) == 1) {
-					snd = 9900;
-				} else {
-					snd = 9905;
-				}
-				Sound_Play_Speech_Line(0, snd, 75, 0, 99);
-
-				_vm->_mouse->setRandomY();
-			}
-
-			cont = false;
-			break;
-
-		case 3:
-			var1 = _data[_dataIndex++];
-			_vm->_items->setPoliceMazeEnemy(var1, 0);
-			break;
-
-		case 4:
-			var1 = _data[_dataIndex++];
-			_vm->_items->setPoliceMazeEnemy(var1, 1);
-			break;
-
-		case 5:
-			var1 = _data[_dataIndex++];
-			Game_Flag_Reset(var1);
-			break;
-
-		case 6:
-			var1 = _data[_dataIndex++];
-			Game_Flag_Set(var1);
-			break;
-
-		case 7:
-			var1 = _data[_dataIndex++];
-			Global_Variable_Decrement(var1, 1);
-			break;
-
-		case 8:
-			var1 = _data[_dataIndex++];
-			var2 = _data[_dataIndex++];
-			if (Global_Variable_Query(var1) < var2) {
-				Global_Variable_Increment(var1, 1);
-			}
-			break;
-
-		case 9:
-			var1 = _data[_dataIndex++];
-			Global_Variable_Reset(var1);
-			break;
-
-		case 10:
-			var1 = _data[_dataIndex++];
-			var2 = _data[_dataIndex++];
-			Global_Variable_Set(var1, var2);
-			break;
-
-		case 11:
-			var1 = _data[_dataIndex++];
-			var2 = _data[_dataIndex++];
-			_vm->_items->setIsTarget(var1, var2);
-			break;
-
-		case 12:
-			var1 = _data[_dataIndex++];
-			var2 = _data[_dataIndex++];
-			var3 = _data[_dataIndex++];
-
-			switch (Random_Query(1, 3)) {
-			case 1:
-				varRes = var1;
-				break;
-
-			case 2:
-				varRes = var2;
-				break;
-
-			case 3:
-				varRes = var3;
-				break;
-			}
-
-			_vm->_policeMaze->_tracks[varRes]->resetVisible();
-			break;
-
-		case 13:
-			var1 = _data[_dataIndex++];
-			var2 = _data[_dataIndex++];
-
-			if (Random_Query(1, 2) == 1) {
-				varRes = var1;
-			} else {
-				varRes = var2;
-			}
-			_vm->_policeMaze->_tracks[varRes]->resetVisible();
-			break;
-
-		case 14:
-			var1 = _data[_dataIndex++];
-			_vm->_policeMaze->_tracks[var1]->setVisible();
-			break;
-
-		case 15:
-			var1 = _data[_dataIndex++];
-			_vm->_policeMaze->_tracks[var1]->resetVisible();
-			break;
-
-		case 16:
-			var1 = _data[_dataIndex++];
-			var2 = _data[_dataIndex++];
-			Sound_Play(var1, var2, 0, 0, 50, 0);
-			break;
-
-		case 17:
-			var1 = _data[_dataIndex++];
-			_vm->_items->setIsObstacle(var1, 0);
-			break;
-
-		case 18:
-			var1 = _data[_dataIndex++];
-			_vm->_items->setIsObstacle(var1, 1);
-			break;
-
-		case 19:
-			var1 = _data[_dataIndex++];
-			var2 = _data[_dataIndex++];
-			_waitTime = Random_Query(var1, var2);
-			_haveToWait = true;
-
-			cont = false;
-			break;
-
-		case 20:
-			_maxAngle = _data[_dataIndex++];
-			_angleChange = _data[_dataIndex++];
-			_rotating = true;
-
-			cont = false;
-			break;
-
-		case 21:
-			var1 = _data[_dataIndex++];
-			_vm->_items->setFacing(_itemId, var1);
-			break;
-
-		case 22:
-			_dataIndex = 0;
-
-			cont = false;
-			break;
-
-		case 23:
-			_waitTime = _data[_dataIndex++];
-			_haveToWait = true;
-
-			cont = false;
-			break;
-
-		case 24:
-			_pmt_var5 = _data[_dataIndex++];
-			_pmt_var4 = 1;
-
-			cont = false;
-			break;
-
-		case 25:
-			_pointIndex = _data[_dataIndex++];
-			_pmt_var4 = 0;
-			_vm->_items->setXYZ(_itemId, _points[_pointIndex].x, _points[_pointIndex].y, _points[_pointIndex].z);
-			readdObject(_itemId);
-			break;
-
-		default:
-			return false;
-		}
-
-		if (_visible || _haveToWait) {
-			cont = false;
-		}
-	}
-#endif
-
-	return true;
-}
-
-void PoliceMazeTargetTrack::readdObject(int itemId) {
-	if (_vm->_sceneObjects->remove(itemId + kSceneObjectOffsetItems)) {
-		BoundingBox *boundingBox = _vm->_items->getBoundingBox(itemId);
-		Common::Rect *screenRect = _vm->_items->getScreenRectangle(itemId);
-		bool targetable = _vm->_items->isTarget(itemId);
-		bool obstacle = _vm->_items->isVisible(itemId);
-
-		_vm->_sceneObjects->addItem(itemId + kSceneObjectOffsetItems, boundingBox, screenRect, targetable, obstacle);
-	}
-}
-
-
-} // End of namespace BladeRunner
diff --git a/engines/bladerunner/police_maze.h b/engines/bladerunner/police_maze.h
deleted file mode 100644
index 1cb9da5..0000000
--- a/engines/bladerunner/police_maze.h
+++ /dev/null
@@ -1,102 +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.
- *
- */
-
-#ifndef BLADERUNNER_POLICE_MAZE_H
-#define BLADERUNNER_POLICE_MAZE_H
-
-#include "bladerunner/script/script.h"
-#include "bladerunner/vector.h"
-
-namespace BladeRunner {
-
-enum {
-	kNumMazeTracks = 64,
-	kNumTrackPoints = 100
-};
-
-class BladeRunnerEngine;
-
-class PoliceMazeTargetTrack : ScriptBase {
-	BladeRunnerEngine *_vm;
-
-	uint32 _time;
-	bool _isPresent;
-	int _itemId;
-	int _count;
-	Vector3 _points[kNumTrackPoints];
-	int *_data;
-	int _dataIndex;
-	int32 _updateDelay;
-	int32 _waitTime;
-	bool _haveToWait;
-	int _pmt_var4;
-	int _pointIndex;
-	int _pmt_var5;
-	bool _rotating;
-	int _maxAngle;
-	int _angleChange;
-	bool _visible;
-
-public:
-	PoliceMazeTargetTrack(BladeRunnerEngine *vm);
-	~PoliceMazeTargetTrack();
-
-	void reset();
-	void clear(bool isLoadingGame);
-	void add(int trackId, float startX, float startY, float startZ, float endX, float endY, float endZ, int count, void *list, bool a11);
-
-	bool tick();
-	bool isPresent() { return _isPresent; }
-	void setVisible() { _visible = true; }
-	void resetVisible() { _visible = false; }
-	bool isVisible() { return _visible; }
-	void setTime(uint32 t) { _time = t; }
-
-	void readdObject(int itemId);
-};
-
-class PoliceMaze : ScriptBase {
-	BladeRunnerEngine *_vm;
-
-	bool _isPaused;
-	bool _needAnnouncement;
-	bool _announcementRead;
-	int _pm_var1;
-	int _pm_var2;
-
-public:
-	PoliceMazeTargetTrack *_tracks[kNumMazeTracks];
-
-public:
-	PoliceMaze(BladeRunnerEngine *vm);
-	~PoliceMaze();
-
-	void tick();
-	void reset();
-	void clear(bool isLoadingGame);
-	void setPauseState(bool state);
-	void activate();
-};
-
-} // End of namespace BladeRunner
-
-#endif
diff --git a/engines/bladerunner/scene.cpp b/engines/bladerunner/scene.cpp
index 6b0404d..84d0dd4 100644
--- a/engines/bladerunner/scene.cpp
+++ b/engines/bladerunner/scene.cpp
@@ -29,13 +29,13 @@
 #include "bladerunner/game_info.h"
 #include "bladerunner/items.h"
 #include "bladerunner/overlays.h"
-#include "bladerunner/police_maze.h"
 #include "bladerunner/regions.h"
 #include "bladerunner/scene_objects.h"
 #include "bladerunner/screen_effects.h"
 #include "bladerunner/set.h"
 #include "bladerunner/settings.h"
 #include "bladerunner/slice_renderer.h"
+#include "bladerunner/script/police_maze.h"
 #include "bladerunner/script/scene_script.h"
 #include "bladerunner/ui/spinner.h"
 #include "bladerunner/vqa_player.h"
diff --git a/engines/bladerunner/script/police_maze.cpp b/engines/bladerunner/script/police_maze.cpp
new file mode 100644
index 0000000..41a33ff
--- /dev/null
+++ b/engines/bladerunner/script/police_maze.cpp
@@ -0,0 +1,496 @@
+/* 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/bladerunner.h"
+#include "bladerunner/game_constants.h"
+#include "bladerunner/items.h"
+#include "bladerunner/mouse.h"
+#include "bladerunner/scene.h"
+#include "bladerunner/scene_objects.h"
+#include "bladerunner/script/police_maze.h"
+#include "bladerunner/script/scene_script.h"
+
+namespace BladeRunner {
+
+PoliceMaze::PoliceMaze(BladeRunnerEngine *vm) : ScriptBase(vm) {
+	reset();
+
+	for (int i = 0; i < kNumMazeTracks; i++) {
+		_tracks[i] = new PoliceMazeTargetTrack(vm);
+	}
+}
+
+PoliceMaze::~PoliceMaze() {
+	for (int i = 0; i < kNumMazeTracks; i++) {
+		delete _tracks[i];
+	}
+
+	reset();
+}
+
+void PoliceMaze::reset() {
+	_isPaused = false;
+	_needAnnouncement = false;
+	_announcementRead = false;
+
+	for (int i = 0; i < kNumMazeTracks; i++) {
+		_tracks[i] = 0;
+	}
+
+	_pm_var1 = 0;
+	_pm_var2 = 0;
+}
+
+void PoliceMaze::clear(bool isLoadingGame) {
+	for (int i = 0; i < kNumMazeTracks; i++) {
+		if (_tracks[i]->isPresent())
+			_tracks[i]->clear(isLoadingGame);
+	}
+}
+
+void PoliceMaze::activate() {
+	_needAnnouncement = true;
+	_announcementRead = false;
+}
+
+void PoliceMaze::setPauseState(bool state) {
+	_isPaused = state;
+
+	uint32 t = _vm->getTotalPlayTime();
+
+	for (int i = 0; i < kNumMazeTracks; i++)
+		_tracks[i]->setTime(t);
+}
+
+void PoliceMaze::tick() {
+	if (_isPaused)
+		return;
+
+	if (_vm->_scene->getSetId() != kSetPS10_PS11_PS12_PS13)
+		return;
+
+	if (_announcementRead) {
+		_needAnnouncement = false;
+
+		return;
+	}
+
+	for (int i = 0; i < kNumMazeTracks; i++)
+		_tracks[i]->tick();
+
+	bool notFound = true;
+	for (int i = 0; i < kNumMazeTracks; i++) {
+		if (!_tracks[i]->isVisible()) {
+			notFound = false;
+			break;
+		}
+	}
+
+	if (notFound && _needAnnouncement && !_announcementRead) {
+		_needAnnouncement = false;
+		_announcementRead = true;
+
+		if (_vm->_scene->getSceneId() == kScenePS13) {
+			Actor_Voice_Over(320, kActorAnsweringMachine);
+		} else {
+			Actor_Voice_Over(310, kActorAnsweringMachine);
+		}
+	}
+}
+
+PoliceMazeTargetTrack::PoliceMazeTargetTrack(BladeRunnerEngine *vm) : ScriptBase(vm) {
+	reset();
+}
+
+PoliceMazeTargetTrack::~PoliceMazeTargetTrack() {
+	reset();
+}
+
+void PoliceMazeTargetTrack::reset() {
+	_isPresent = 0;
+	_itemId = -1;
+	_count = 0;
+	_data = 0;
+	_dataIndex = 0;
+	_updateDelay = 0;
+	_waitTime = 0;
+	_time = 0;
+	_haveToWait = false;
+	_pmt_var4 = 0;
+	_pointIndex = 0;
+	_pmt_var5 = 0;
+	_rotating = false;
+	_maxAngle = 0;
+	_angleChange = 0;
+	_visible = true;
+}
+
+void PoliceMazeTargetTrack::clear(bool isLoadingGame) {
+	reset();
+}
+
+void PoliceMazeTargetTrack::add(int trackId, float startX, float startY, float startZ, float endX, float endY, float endZ, int count, void *list, bool a11) {
+	_data = (int *)list;
+
+	if (true /* !GameIsLoading */) { // FIXME
+		_itemId = trackId;
+		_count = count;
+		_dataIndex = 0;
+
+		double coef = 1.0f / (long double)count;
+
+		double coefX = (endX - startX) * coef;
+		double coefY = (endY - startY) * coef;
+		double coefZ = (endZ - startZ) * coef;
+
+		for (int i = 0; i < count; i++) {
+			_points[i].x = i * coefX + startX;
+			_points[i].y = i * coefY + startY;
+			_points[i].z = i * coefZ + startZ;
+		}
+
+		_points[count].x = endX;
+		_points[count].y = endY;
+		_points[count].z = endZ;
+
+		_visible = !a11;
+	}
+	_isPresent = true;
+}
+
+bool PoliceMazeTargetTrack::tick() {
+	if (!_isPresent) {
+		return false;
+	}
+
+#if 0
+
+	uint32 oldTime = _time;
+	_time = _vm->getTotalPlayTime();
+	int32 timeDiff = _time - oldTime;
+	_updateDelay -= timeDiff;
+
+	if (_updateDelay > 0)
+		return false;
+
+	_updateDelay = 66;
+
+	if (_visible)
+		return false;
+
+	if (_haveToWait) {
+		_waitTime -= timeDiff;
+
+		if (_waitTime > 0)
+			return true;
+
+		_haveToWait = false;
+		_waitTime = 0;
+	}
+
+	if (_vm->_items->isTarget(_itemId))
+		return true;
+
+	if (_rotating) {
+		float angle = _vm->_items->getFacing(_itemId) + _angleChange;
+
+		if (_angleChange > 0) {
+			if (angle >= _maxAngle) {
+				angle = _maxAngle;
+				_rotating = false;
+			}
+		} else if (_angleChange < 0) {
+			if (angle <= _maxAngle) {
+				angle = _maxAngle;
+				_rotating = false;
+			}
+		} else {
+			_rotating = false;
+		}
+
+		_vm->_items->setFacing(_itemId, angle);
+
+		if (_rotating)
+			return false;
+	}
+
+	bool advancePoint = false;
+
+	if (_pmt_var4) {
+		if (_pointIndex < _pmt_var5) {
+			_pointIndex++;
+			advancePoint = true;
+		} else if (_pointIndex > _pmt_var5) {
+			_pointIndex--;
+			advancePoint = true;
+		} else {
+			_pmt_var4 = 0;
+		}
+	}
+
+	if (advancePoint) {
+		_vm->_items->setXYZ(_itemId, _points[_pointIndex].x, _points[_pointIndex].y, _points[_pointIndex].z);
+		readdObject(_itemId);
+
+		return true;
+	}
+
+	bool cont = true;
+	int var1 = 0, var2 = 0, var3 = 0, varRes = 0;
+
+	while (cont) {
+		_dataIndex++;
+
+		switch (_data[_dataIndex - 1] + 26) {
+		case 0:
+			var1 = _data[_dataIndex++];
+			var2 = _data[_dataIndex++];
+
+			if (Global_Variable_Query(var1) >= Global_Variable_Query(var2)) {
+				setVisible();
+				cont = false;
+			} else {
+				cont = true;
+			}
+			break;
+
+		case 1:
+			if (!_vm->_items->isPoliceMazeEnemy(_itemId) && _vm->_items->isTarget(_itemId)) {
+				Police_Maze_Increment_Score(1);
+			}
+			break;
+
+		case 2:
+			var1 = _data[_dataIndex++];
+			_dataIndex++;
+
+			if (_vm->_items->isTarget(_itemId)) {
+				Sound_Play(var1, 90, 0, 0, 50, 0);
+				Police_Maze_Decrement_Score(1);
+				Actor_Force_Stop_Walking(0);
+
+				if (Player_Query_Combat_Mode() == 1) {
+					Actor_Change_Animation_Mode(0, 22);
+				} else {
+					Actor_Change_Animation_Mode(0, 21);
+				}
+
+				int snd;
+
+				if (Random_Query(1, 2) == 1) {
+					snd = 9900;
+				} else {
+					snd = 9905;
+				}
+				Sound_Play_Speech_Line(0, snd, 75, 0, 99);
+
+				_vm->_mouse->setRandomY();
+			}
+
+			cont = false;
+			break;
+
+		case 3:
+			var1 = _data[_dataIndex++];
+			_vm->_items->setPoliceMazeEnemy(var1, 0);
+			break;
+
+		case 4:
+			var1 = _data[_dataIndex++];
+			_vm->_items->setPoliceMazeEnemy(var1, 1);
+			break;
+
+		case 5:
+			var1 = _data[_dataIndex++];
+			Game_Flag_Reset(var1);
+			break;
+
+		case 6:
+			var1 = _data[_dataIndex++];
+			Game_Flag_Set(var1);
+			break;
+
+		case 7:
+			var1 = _data[_dataIndex++];
+			Global_Variable_Decrement(var1, 1);
+			break;
+
+		case 8:
+			var1 = _data[_dataIndex++];
+			var2 = _data[_dataIndex++];
+			if (Global_Variable_Query(var1) < var2) {
+				Global_Variable_Increment(var1, 1);
+			}
+			break;
+
+		case 9:
+			var1 = _data[_dataIndex++];
+			Global_Variable_Reset(var1);
+			break;
+
+		case 10:
+			var1 = _data[_dataIndex++];
+			var2 = _data[_dataIndex++];
+			Global_Variable_Set(var1, var2);
+			break;
+
+		case 11:
+			var1 = _data[_dataIndex++];
+			var2 = _data[_dataIndex++];
+			_vm->_items->setIsTarget(var1, var2);
+			break;
+
+		case 12:
+			var1 = _data[_dataIndex++];
+			var2 = _data[_dataIndex++];
+			var3 = _data[_dataIndex++];
+
+			switch (Random_Query(1, 3)) {
+			case 1:
+				varRes = var1;
+				break;
+
+			case 2:
+				varRes = var2;
+				break;
+
+			case 3:
+				varRes = var3;
+				break;
+			}
+
+			_vm->_policeMaze->_tracks[varRes]->resetVisible();
+			break;
+
+		case 13:
+			var1 = _data[_dataIndex++];
+			var2 = _data[_dataIndex++];
+
+			if (Random_Query(1, 2) == 1) {
+				varRes = var1;
+			} else {
+				varRes = var2;
+			}
+			_vm->_policeMaze->_tracks[varRes]->resetVisible();
+			break;
+
+		case 14:
+			var1 = _data[_dataIndex++];
+			_vm->_policeMaze->_tracks[var1]->setVisible();
+			break;
+
+		case 15:
+			var1 = _data[_dataIndex++];
+			_vm->_policeMaze->_tracks[var1]->resetVisible();
+			break;
+
+		case 16:
+			var1 = _data[_dataIndex++];
+			var2 = _data[_dataIndex++];
+			Sound_Play(var1, var2, 0, 0, 50, 0);
+			break;
+
+		case 17:
+			var1 = _data[_dataIndex++];
+			_vm->_items->setIsObstacle(var1, 0);
+			break;
+
+		case 18:
+			var1 = _data[_dataIndex++];
+			_vm->_items->setIsObstacle(var1, 1);
+			break;
+
+		case 19:
+			var1 = _data[_dataIndex++];
+			var2 = _data[_dataIndex++];
+			_waitTime = Random_Query(var1, var2);
+			_haveToWait = true;
+
+			cont = false;
+			break;
+
+		case 20:
+			_maxAngle = _data[_dataIndex++];
+			_angleChange = _data[_dataIndex++];
+			_rotating = true;
+
+			cont = false;
+			break;
+
+		case 21:
+			var1 = _data[_dataIndex++];
+			_vm->_items->setFacing(_itemId, var1);
+			break;
+
+		case 22:
+			_dataIndex = 0;
+
+			cont = false;
+			break;
+
+		case 23:
+			_waitTime = _data[_dataIndex++];
+			_haveToWait = true;
+
+			cont = false;
+			break;
+
+		case 24:
+			_pmt_var5 = _data[_dataIndex++];
+			_pmt_var4 = 1;
+
+			cont = false;
+			break;
+
+		case 25:
+			_pointIndex = _data[_dataIndex++];
+			_pmt_var4 = 0;
+			_vm->_items->setXYZ(_itemId, _points[_pointIndex].x, _points[_pointIndex].y, _points[_pointIndex].z);
+			readdObject(_itemId);
+			break;
+
+		default:
+			return false;
+		}
+
+		if (_visible || _haveToWait) {
+			cont = false;
+		}
+	}
+#endif
+
+	return true;
+}
+
+void PoliceMazeTargetTrack::readdObject(int itemId) {
+	if (_vm->_sceneObjects->remove(itemId + kSceneObjectOffsetItems)) {
+		BoundingBox *boundingBox = _vm->_items->getBoundingBox(itemId);
+		Common::Rect *screenRect = _vm->_items->getScreenRectangle(itemId);
+		bool targetable = _vm->_items->isTarget(itemId);
+		bool obstacle = _vm->_items->isVisible(itemId);
+
+		_vm->_sceneObjects->addItem(itemId + kSceneObjectOffsetItems, boundingBox, screenRect, targetable, obstacle);
+	}
+}
+
+
+} // End of namespace BladeRunner
diff --git a/engines/bladerunner/script/police_maze.h b/engines/bladerunner/script/police_maze.h
new file mode 100644
index 0000000..5c5da09
--- /dev/null
+++ b/engines/bladerunner/script/police_maze.h
@@ -0,0 +1,102 @@
+/* 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.
+ *
+ */
+
+#ifndef BLADERUNNER_SCRIPT_POLICE_MAZE_H
+#define BLADERUNNER_SCRIPT_POLICE_MAZE_H
+
+#include "bladerunner/script/script.h"
+#include "bladerunner/vector.h"
+
+namespace BladeRunner {
+
+enum {
+	kNumMazeTracks = 64,
+	kNumTrackPoints = 100
+};
+
+class BladeRunnerEngine;
+
+class PoliceMazeTargetTrack : ScriptBase {
+	BladeRunnerEngine *_vm;
+
+	uint32 _time;
+	bool _isPresent;
+	int _itemId;
+	int _count;
+	Vector3 _points[kNumTrackPoints];
+	int *_data;
+	int _dataIndex;
+	int32 _updateDelay;
+	int32 _waitTime;
+	bool _haveToWait;
+	int _pmt_var4;
+	int _pointIndex;
+	int _pmt_var5;
+	bool _rotating;
+	int _maxAngle;
+	int _angleChange;
+	bool _visible;
+
+public:
+	PoliceMazeTargetTrack(BladeRunnerEngine *vm);
+	~PoliceMazeTargetTrack();
+
+	void reset();
+	void clear(bool isLoadingGame);
+	void add(int trackId, float startX, float startY, float startZ, float endX, float endY, float endZ, int count, void *list, bool a11);
+
+	bool tick();
+	bool isPresent() { return _isPresent; }
+	void setVisible() { _visible = true; }
+	void resetVisible() { _visible = false; }
+	bool isVisible() { return _visible; }
+	void setTime(uint32 t) { _time = t; }
+
+	void readdObject(int itemId);
+};
+
+class PoliceMaze : ScriptBase {
+	BladeRunnerEngine *_vm;
+
+	bool _isPaused;
+	bool _needAnnouncement;
+	bool _announcementRead;
+	int _pm_var1;
+	int _pm_var2;
+
+public:
+	PoliceMazeTargetTrack *_tracks[kNumMazeTracks];
+
+public:
+	PoliceMaze(BladeRunnerEngine *vm);
+	~PoliceMaze();
+
+	void tick();
+	void reset();
+	void clear(bool isLoadingGame);
+	void setPauseState(bool state);
+	void activate();
+};
+
+} // End of namespace BladeRunner
+
+#endif
diff --git a/engines/bladerunner/script/script.cpp b/engines/bladerunner/script/script.cpp
index 3c1f041..5f39646 100644
--- a/engines/bladerunner/script/script.cpp
+++ b/engines/bladerunner/script/script.cpp
@@ -39,13 +39,13 @@
 #include "bladerunner/movement_track.h"
 #include "bladerunner/music.h"
 #include "bladerunner/overlays.h"
-#include "bladerunner/police_maze.h"
 #include "bladerunner/regions.h"
 #include "bladerunner/set.h"
 #include "bladerunner/settings.h"
 #include "bladerunner/set_effects.h"
 #include "bladerunner/scene.h"
 #include "bladerunner/scene_objects.h"
+#include "bladerunner/script/police_maze.h"
 #include "bladerunner/slice_animations.h"
 #include "bladerunner/slice_renderer.h"
 #include "bladerunner/suspects_database.h"





More information about the Scummvm-git-logs mailing list