[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