From 571ddf46cdc52a0abb35e1efbcd0f8800e3419fe Mon Sep 17 00:00:00 2001 From: Thanasis Antoniou Date: Thu, 28 Feb 2019 15:24:37 +0200 Subject: BLADERUNNER: A better fix for Sebastian's doll Use just the existing box 31. Implement a way to override object placement. Remove the item 77 (Holden's badge) completely. --- engines/bladerunner/scene.cpp | 2 +- engines/bladerunner/script/scene/bb06.cpp | 45 ++++++++++++++++--------------- engines/bladerunner/set.cpp | 16 ++++++++++- engines/bladerunner/set.h | 3 ++- 4 files changed, 41 insertions(+), 25 deletions(-) diff --git a/engines/bladerunner/scene.cpp b/engines/bladerunner/scene.cpp index 78b1bb6da4..4ca5da495a 100644 --- a/engines/bladerunner/scene.cpp +++ b/engines/bladerunner/scene.cpp @@ -170,7 +170,7 @@ bool Scene::open(int setId, int sceneId, bool isLoadingGame) { } } - _set->addObjectsToScene(_vm->_sceneObjects); + _set->addObjectsToScene(_vm->_sceneObjects, _sceneId); _vm->_items->addToSet(setId); _vm->_sceneObjects->updateObstacles(); // TODO: add all items to scene diff --git a/engines/bladerunner/script/scene/bb06.cpp b/engines/bladerunner/script/scene/bb06.cpp index cef2a5a572..92fdefefd8 100644 --- a/engines/bladerunner/script/scene/bb06.cpp +++ b/engines/bladerunner/script/scene/bb06.cpp @@ -87,10 +87,8 @@ void SceneScriptBB06::SceneLoaded() { // otherwise the doll item is not placed in the current set Item_Add_To_World(kItemBB06ControlBox, 931, kSetBB06_BB07, -127.0f, 68.42f, 57.0f, 0, 8, 8, true, true, false, true); #else - // Add doll item based on which SET version of the "room" we are in - Item_Add_To_World(kItemBB06ControlBox, 931, Player_Query_Current_Set(), -117.24f, 46.41f, 76.66f, 256, 28, 16, true, true, false, true); - if (Game_Flag_Query(kFlagBB06AndroidDestroyed)) { - Item_Flag_As_Non_Target(kItemBB06ControlBox); + if (!Game_Flag_Query(kFlagBB06AndroidDestroyed)) { + Combat_Target_Object("BOX31"); // } #endif // BLADERUNNER_ORIGINAL_BUGS } @@ -101,6 +99,7 @@ bool SceneScriptBB06::MouseClick(int x, int y) { bool SceneScriptBB06::ClickedOn3DObject(const char *objectName, bool a2) { if (Object_Query_Click("BOX31", objectName)) { +#if BLADERUNNER_ORIGINAL_BUGS // Sebastian's Doll Fix if (!Loop_Actor_Walk_To_Scene_Object(kActorMcCoy, "BOX31", 24, true, false)) { Actor_Face_Object(kActorMcCoy, "BOX31", true); if (Game_Flag_Query(kFlagBB06AndroidDestroyed)) { @@ -110,6 +109,24 @@ bool SceneScriptBB06::ClickedOn3DObject(const char *objectName, bool a2) { Actor_Voice_Over(50, kActorVoiceOver); } } +#else + if (Player_Query_Combat_Mode()) { + Overlay_Play("BB06OVER", 0, false, true, 0); // explosion - don't loop + Game_Flag_Set(kFlagBB06AndroidDestroyed); + Un_Combat_Target_Object("BOX31"); + return true; + } else { + if (!Loop_Actor_Walk_To_Scene_Object(kActorMcCoy, "BOX31", 24, true, false)) { + Actor_Face_Object(kActorMcCoy, "BOX31", true); + if (Game_Flag_Query(kFlagBB06AndroidDestroyed)) { + Actor_Voice_Over(60, kActorVoiceOver); + Actor_Voice_Over(70, kActorVoiceOver); + } else { + Actor_Voice_Over(50, kActorVoiceOver); + } + } + } +#endif // BLADERUNNER_ORIGINAL_BUGS } return false; } @@ -119,26 +136,16 @@ bool SceneScriptBB06::ClickedOnActor(int actorId) { } bool SceneScriptBB06::ClickedOnItem(int itemId, bool a2) { - if (itemId == kItemBB06ControlBox) { #if BLADERUNNER_ORIGINAL_BUGS // Sebastian's Doll Fix + if (itemId == kItemBB06ControlBox) { if (Player_Query_Combat_Mode()) { Overlay_Play("BB06OVER", 1, true, true, 0); Game_Flag_Set(kFlagBB06AndroidDestroyed); Item_Remove_From_World(kItemBB06ControlBox); return true; } -#else - if (Player_Query_Combat_Mode()) { - Overlay_Play("BB06OVER", 0, false, true, 0); // explosion - don't loop - Game_Flag_Set(kFlagBB06AndroidDestroyed); - // flag item kItemBB06ControlBox as non-combat-target - Item_Flag_As_Non_Target(kItemBB06ControlBox); - return true; - } else { - ClickedOn3DObject("BOX31", false); // clone behavior of box31 - } -#endif // BLADERUNNER_ORIGINAL_BUGS } +#endif // BLADERUNNER_ORIGINAL_BUGS return false; } @@ -217,12 +224,6 @@ void SceneScriptBB06::PlayerWalkedIn() { } void SceneScriptBB06::PlayerWalkedOut() { -#if BLADERUNNER_ORIGINAL_BUGS // Sebastian's Doll Fix -#else - // this might be redundant -- the item is not visible in BB07 even if it was drawn in BB06 - Item_Remove_From_World(kItemBB06ControlBox); // this removes the item from the set so it won't exist in the next scene - // mainly to remove it completely from BB07 -#endif // BLADERUNNER_ORIGINAL_BUGS } void SceneScriptBB06::DialogueQueueFlushed(int a1) { diff --git a/engines/bladerunner/set.cpp b/engines/bladerunner/set.cpp index f53a635057..a257cee4fc 100644 --- a/engines/bladerunner/set.cpp +++ b/engines/bladerunner/set.cpp @@ -127,8 +127,9 @@ bool Set::open(const Common::String &name) { return true; } -void Set::addObjectsToScene(SceneObjects *sceneObjects) const { +void Set::addObjectsToScene(SceneObjects *sceneObjects, int sceneId) const { for (int i = 0; i < _objectCount; i++) { + overrideSceneObjectInfo(sceneId, i); // For bugfixes with respect to clickable/targetable box positioning/bounding box sceneObjects->addObject(i + kSceneObjectOffsetObjects, _objects[i].bbox, _objects[i].isClickable, _objects[i].isObstacle, _objects[i].unknown1, _objects[i].isTarget); } } @@ -396,4 +397,17 @@ void Set::load(SaveFileReadStream &f) { _footstepSoundOverride = f.readInt(); } +/** +* Used for bugfixes mainly with respect to bad box positioning / bounding box fixes +* TODO If we have many such cases, perhaps we could use a lookup table +* using sceneId, objectId (or name) as keys +*/ +void Set::overrideSceneObjectInfo(int sceneId, int objectId) const { // For bugfixes with respect to clickable/targetable box positioning/bounding box + if (sceneId == kSceneBB06) { /// Sebastian's room with doll + if (_objects[objectId].name == "BOX31") { // dollhouse box in BB06 + _objects[objectId].bbox.setXYZ(-161.47f, 30.0f, 53.75f, -110.53f, 69.81f, 90.90f); + } + } +} + } // End of namespace BladeRunner diff --git a/engines/bladerunner/set.h b/engines/bladerunner/set.h index c6c1081196..1097a53dd9 100644 --- a/engines/bladerunner/set.h +++ b/engines/bladerunner/set.h @@ -78,7 +78,7 @@ public: bool open(const Common::String &name); - void addObjectsToScene(SceneObjects *sceneObjects) const; + void addObjectsToScene(SceneObjects *sceneObjects, int sceneId) const; uint32 getObjectCount() const { return _objectCount; } float getAltitudeAtXZ(float x, float z, bool *inWalkbox) const; @@ -107,6 +107,7 @@ public: private: static bool isXZInWalkbox(float x, float z, const Walkbox &walkbox); + void overrideSceneObjectInfo(int sceneId, int objectId) const; }; } // End of namespace BladeRunner -- cgit v1.2.3