From da2c7142ce2513b8464c30ed4872eeff69987d6e Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Fri, 23 Mar 2018 22:02:49 +0100 Subject: BLADERUNNER: Implement Item_Spin_In_World() --- engines/bladerunner/item.cpp | 13 +++++++++++++ engines/bladerunner/item.h | 2 ++ engines/bladerunner/items.cpp | 16 ++++++++++++++++ engines/bladerunner/items.h | 3 +++ engines/bladerunner/script/script.cpp | 7 ++++++- 5 files changed, 40 insertions(+), 1 deletion(-) diff --git a/engines/bladerunner/item.cpp b/engines/bladerunner/item.cpp index af7b2ef4c2..7fca4d108c 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 89bec5590b..baabdb8890 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 9d9efd6a38..d526477b1f 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 1aac82e8da..20f51b93b3 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 f4818b1e0f..26e87cb497 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) { -- cgit v1.2.3