diff options
author | Thanasis Antoniou | 2019-05-04 17:24:20 +0300 |
---|---|---|
committer | Thanasis Antoniou | 2019-05-04 17:25:34 +0300 |
commit | d666eb154a027b34302a34d090abbda2cf69ce58 (patch) | |
tree | 0db83225c2be71eed8bead048aa81e20367f0b9f /engines | |
parent | 7d2777e1d7f1abef54272ffb4287e26738a8a554 (diff) | |
download | scummvm-rg350-d666eb154a027b34302a34d090abbda2cf69ce58.tar.gz scummvm-rg350-d666eb154a027b34302a34d090abbda2cf69ce58.tar.bz2 scummvm-rg350-d666eb154a027b34302a34d090abbda2cf69ce58.zip |
BLADERUNNER: Fix rats re-spawn and UG09, UG13 bad paths
UG09 bad path allowed McCoy to teleport to the pipe top left. UG13, when elevator was up McCoy could walk in the empty chute
Diffstat (limited to 'engines')
23 files changed, 215 insertions, 108 deletions
diff --git a/engines/bladerunner/actor.cpp b/engines/bladerunner/actor.cpp index fa8a5d9643..f0153f8618 100644 --- a/engines/bladerunner/actor.cpp +++ b/engines/bladerunner/actor.cpp @@ -1122,6 +1122,10 @@ int Actor::getAnimationMode() const { return _animationMode; } +int Actor::getAnimationId() const { + return _animationId; +} + void Actor::setGoal(int goalNumber) { int oldGoalNumber = _goalNumber; _goalNumber = goalNumber; diff --git a/engines/bladerunner/actor.h b/engines/bladerunner/actor.h index 1177e655a2..186468be2a 100644 --- a/engines/bladerunner/actor.h +++ b/engines/bladerunner/actor.h @@ -134,6 +134,7 @@ public: Vector3 getXYZ() const; int getFacing() const; int getAnimationMode() const; + int getAnimationId() const; Vector3 getPosition() const { return _position; } diff --git a/engines/bladerunner/actor_combat.cpp b/engines/bladerunner/actor_combat.cpp index 47c575f7c1..400e3e704e 100644 --- a/engines/bladerunner/actor_combat.cpp +++ b/engines/bladerunner/actor_combat.cpp @@ -273,6 +273,11 @@ void ActorCombat::hitAttempt() { if (enemyHp <= 0) { if (!enemy->isRetired()) { +#if BLADERUNNER_ORIGINAL_BUGS +#else + // make sure the dead enemy won't pick a pending movement track and re-spawn + enemy->_movementTrack->flush(); +#endif if (enemy->inCombat()) { enemy->changeAnimationMode(kAnimationModeCombatDie, false); } else { diff --git a/engines/bladerunner/debugger.cpp b/engines/bladerunner/debugger.cpp index 153d8fa306..3558659dce 100644 --- a/engines/bladerunner/debugger.cpp +++ b/engines/bladerunner/debugger.cpp @@ -1560,7 +1560,7 @@ bool Debugger::cmdList(int argc, const char **argv) { SceneObjects::SceneObject *sceneObject = &_vm->_sceneObjects->_sceneObjects[_vm->_sceneObjects->_sceneObjectsSortedByDistance[i]]; if (sceneObject->type == kSceneObjectTypeActor) { - debugPrintf("%d: %s (Clk: %s, Trg: %s, Prs: %s, Obs: %s, Mvg: %s), Goal: %d, Pos(%02.2f,%02.2f,%02.2f)\n", + debugPrintf("%d: %s (Clk: %s, Trg: %s, Prs: %s, Obs: %s, Mvg: %s), Goal: %d, Animation: %d:%d\n Pos(%02.2f,%02.2f,%02.2f)\n", sceneObject->id - kSceneObjectOffsetActors, _vm->_textActorNames->getText(sceneObject->id - kSceneObjectOffsetActors), sceneObject->isClickable? "T" : "F", @@ -1569,6 +1569,8 @@ bool Debugger::cmdList(int argc, const char **argv) { sceneObject->isObstacle? "T" : "F", sceneObject->isMoving? "T" : "F", _vm->_actors[sceneObject->id - kSceneObjectOffsetActors]->getGoal(), + _vm->_actors[sceneObject->id - kSceneObjectOffsetActors]->getAnimationMode(), + _vm->_actors[sceneObject->id - kSceneObjectOffsetActors]->getAnimationId(), _vm->_actors[sceneObject->id - kSceneObjectOffsetActors]->getPosition().x, _vm->_actors[sceneObject->id - kSceneObjectOffsetActors]->getPosition().y, _vm->_actors[sceneObject->id - kSceneObjectOffsetActors]->getPosition().z); diff --git a/engines/bladerunner/script/ai/bullet_bob.cpp b/engines/bladerunner/script/ai/bullet_bob.cpp index f49462492a..ee5410a263 100644 --- a/engines/bladerunner/script/ai/bullet_bob.cpp +++ b/engines/bladerunner/script/ai/bullet_bob.cpp @@ -531,7 +531,7 @@ bool AIScriptBulletBob::ChangeAnimationMode(int mode) { } break; - case 48: + case kAnimationModeDie: _animationState = 4; _animationFrame = 0; break; diff --git a/engines/bladerunner/script/ai/chew.cpp b/engines/bladerunner/script/ai/chew.cpp index 65403920b7..fb60c3607c 100644 --- a/engines/bladerunner/script/ai/chew.cpp +++ b/engines/bladerunner/script/ai/chew.cpp @@ -457,7 +457,7 @@ bool AIScriptChew::ChangeAnimationMode(int mode) { } break; - case 48: + case kAnimationModeDie: _animationFrame = 0; _animationState = 11; break; diff --git a/engines/bladerunner/script/ai/crazylegs.cpp b/engines/bladerunner/script/ai/crazylegs.cpp index c2031fc0ab..b4ed739844 100644 --- a/engines/bladerunner/script/ai/crazylegs.cpp +++ b/engines/bladerunner/script/ai/crazylegs.cpp @@ -36,7 +36,7 @@ void AIScriptCrazylegs::Initialize() { _flag = false; - World_Waypoint_Set(360, 41, -103.0f, 40.63f, -53.0f); + World_Waypoint_Set(360, kSetHF05, -103.0f, 40.63f, -53.0f); Actor_Put_In_Set(kActorCrazylegs, kSetHF05); Actor_Set_At_XYZ(kActorCrazylegs, -33.0f, 40.63f, 16.0f, 845); } diff --git a/engines/bladerunner/script/ai/free_slot_a.cpp b/engines/bladerunner/script/ai/free_slot_a.cpp index 5491f2eef7..9281e3a32e 100644 --- a/engines/bladerunner/script/ai/free_slot_a.cpp +++ b/engines/bladerunner/script/ai/free_slot_a.cpp @@ -44,8 +44,8 @@ void AIScriptFreeSlotA::Initialize() { _fallHeightCurrent = 0.0f; // not initialized in original _fallHeightTarget = 0.0f; // not initialized in original - World_Waypoint_Set(525, 45, -780.0f, -615.49f, 2611.0f); - World_Waypoint_Set(526, 45, -780.0f, -615.49f, 2759.0f); + World_Waypoint_Set(525, kSetKP02, -780.0f, -615.49f, 2611.0f); + World_Waypoint_Set(526, kSetKP02, -780.0f, -615.49f, 2759.0f); } bool AIScriptFreeSlotA::Update() { @@ -97,7 +97,7 @@ bool AIScriptFreeSlotA::Update() { if (Actor_Query_Which_Set_In(kActorFreeSlotA) != Player_Query_Current_Set()) { Game_Flag_Reset(kFlagRatWalkingAround); Game_Flag_Reset(kFlagUG15BridgeWillBreak); - Actor_Set_Goal_Number(kActorFreeSlotA, false); + Actor_Set_Goal_Number(kActorFreeSlotA, 0); } break; @@ -118,7 +118,7 @@ bool AIScriptFreeSlotA::Update() { } else if (Actor_Query_Goal_Number(kActorFreeSlotA) == 405 && Actor_Query_Which_Set_In(kActorMcCoy) == kSceneKP05 ) { - Actor_Set_Targetable(kActorFreeSlotA, 1); + Actor_Set_Targetable(kActorFreeSlotA, true); Actor_Set_Goal_Number(kActorFreeSlotA, 406); } return true; @@ -213,7 +213,6 @@ bool AIScriptFreeSlotA::ShotAtAndHit() { Actor_Set_Goal_Number(kActorFreeSlotA, kGoalFreeSlotAUG15Die); return true; } - return false; } @@ -236,14 +235,14 @@ bool AIScriptFreeSlotA::GoalChanged(int currentGoalNumber, int newGoalNumber) { case kGoalFreeSlotAUG15WalkOut: Actor_Force_Stop_Walking(kActorMcCoy); AI_Movement_Track_Flush(kActorFreeSlotA); - World_Waypoint_Set(444, 87, -48.75f, 44.66f, 87.57f); + World_Waypoint_Set(444, kSetUG15, -48.75f, 44.66f, 87.57f); AI_Movement_Track_Append(kActorFreeSlotA, 444, 1); AI_Movement_Track_Repeat(kActorFreeSlotA); break; case kGoalFreeSlotAUG15RunToOtherSide: AI_Movement_Track_Flush(kActorFreeSlotA); - World_Waypoint_Set(444, 87, -237.0f, 48.07f, 208.0f); + World_Waypoint_Set(444, kSetUG15, -237.0f, 48.07f, 208.0f); AI_Movement_Track_Append(kActorFreeSlotA, 444, 1); AI_Movement_Track_Repeat(kActorFreeSlotA); Actor_Set_Targetable(kActorFreeSlotA, true); @@ -251,7 +250,7 @@ bool AIScriptFreeSlotA::GoalChanged(int currentGoalNumber, int newGoalNumber) { case kGoalFreeSlotAUG15RunBack: AI_Movement_Track_Flush(kActorFreeSlotA); - World_Waypoint_Set(444, 87, 3.52f, 52.28f, 90.68f); + World_Waypoint_Set(444, kSetUG15, 3.52f, 52.28f, 90.68f); AI_Movement_Track_Append(kActorFreeSlotA, 444, 0); AI_Movement_Track_Repeat(kActorFreeSlotA); break; @@ -407,9 +406,10 @@ bool AIScriptFreeSlotA::UpdateAnimation(int *animation, int *frame) { break; case 5: + // a bug? This is an animation for Maggie (exploding) *animation = 874; _animationFrame++; - if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(874) - 1) { // bug? shuld not be '-1' + if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(874) - 1) { Actor_Change_Animation_Mode(kActorFreeSlotA, kAnimationModeIdle); } break; @@ -430,10 +430,11 @@ bool AIScriptFreeSlotA::UpdateAnimation(int *animation, int *frame) { case 7: *animation = 859; _animationFrame++; - if (_animationFrame == 0) { + if (_animationFrame == 1) { Ambient_Sounds_Play_Sound(kSfxRATTY5, 99, 0, 0, 25); } - if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(859) - 1) { // bug? shuld not be '-1' + if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(859) - 1) { + // -1 in the clause is ok here since the next _animationState is 8 which will maintain the last frame (Slice_Animation_Query_Number_Of_Frames(859) - 1) _animationFrame = Slice_Animation_Query_Number_Of_Frames(859) - 1; _animationState = 8; Actor_Set_Goal_Number(kActorFreeSlotA, kGoalFreeSlotAGone); @@ -444,7 +445,6 @@ bool AIScriptFreeSlotA::UpdateAnimation(int *animation, int *frame) { *animation = 859; _animationFrame = Slice_Animation_Query_Number_Of_Frames(859) - 1; break; - default: break; } @@ -502,7 +502,7 @@ bool AIScriptFreeSlotA::ChangeAnimationMode(int mode) { _animationFrame = 0; break; - case 48: + case kAnimationModeDie: _animationState = 7; _animationFrame = 0; break; @@ -558,9 +558,9 @@ void AIScriptFreeSlotA::goToRandomUGxx() { break; case 2: - World_Waypoint_Set(463, 74, 144.98f, -50.13f, -175.75f); - World_Waypoint_Set(464, 74, 105.6f, -50.13f, -578.46f); - World_Waypoint_Set(465, 74, 62.0f, -50.13f, -574.0f); + World_Waypoint_Set(463, kSetUG01, 144.98f, -50.13f, -175.75f); + World_Waypoint_Set(464, kSetUG01, 105.6f, -50.13f, -578.46f); + World_Waypoint_Set(465, kSetUG01, 62.0f, -50.13f, -574.0f); AI_Movement_Track_Append(kActorFreeSlotA, 463, 1); AI_Movement_Track_Append(kActorFreeSlotA, 464, 1); AI_Movement_Track_Append(kActorFreeSlotA, 465, 5); @@ -576,9 +576,9 @@ void AIScriptFreeSlotA::goToRandomUGxx() { break; case 4: - World_Waypoint_Set(463, 77, -22.7f, 6.39f, 33.12f); - World_Waypoint_Set(464, 77, -6.70f, -1.74f, -362.88f); - World_Waypoint_Set(465, 77, 164.0f, 11.87f, -1013.0f); + World_Waypoint_Set(463, kSetUG04, -22.7f, 6.39f, 33.12f); + World_Waypoint_Set(464, kSetUG04, -6.70f, -1.74f, -362.88f); + World_Waypoint_Set(465, kSetUG04, 164.0f, 11.87f, -1013.0f); AI_Movement_Track_Append(kActorFreeSlotA, 463, 2); AI_Movement_Track_Append(kActorFreeSlotA, 464, 0); AI_Movement_Track_Append(kActorFreeSlotA, 465, 0); @@ -600,64 +600,75 @@ void AIScriptFreeSlotA::goToRandomUGxx() { if (Actor_Query_In_Set(kActorClovis, kSetUG07)) { AI_Movement_Track_Append(kActorFreeSlotA, 39, 10); } else { - World_Waypoint_Set(463, 80, -88.78f, -12.21f, -184.08f); - World_Waypoint_Set(464, 80, 250.0f, -12.21f, -342.0f); - World_Waypoint_Set(465, 80, -164.78f, -12.21f, -832.08f); + World_Waypoint_Set(463, kSetUG07, -88.78f, -12.21f, -184.08f); + World_Waypoint_Set(464, kSetUG07, 250.0f, -12.21f, -342.0f); + World_Waypoint_Set(465, kSetUG07, -164.78f, -12.21f, -832.08f); AI_Movement_Track_Append(kActorFreeSlotA, 463, 5); AI_Movement_Track_Append(kActorFreeSlotA, 464, 1); } break; case 8: - World_Waypoint_Set(463, 80, -88.78f, -12.21f, -184.08f); - World_Waypoint_Set(464, 80, 250.0f, -12.21f, -342.0f); - World_Waypoint_Set(465, 80, -164.78f, -12.21f, -832.08f); + World_Waypoint_Set(463, kSetUG07, -88.78f, -12.21f, -184.08f); + World_Waypoint_Set(464, kSetUG07, 250.0f, -12.21f, -342.0f); + World_Waypoint_Set(465, kSetUG07, -164.78f, -12.21f, -832.08f); AI_Movement_Track_Append(kActorFreeSlotA, 464, 5); AI_Movement_Track_Append(kActorFreeSlotA, 463, 1); break; case 9: - World_Waypoint_Set(463, 80, -88.78f, -12.21f, -184.08f); - World_Waypoint_Set(464, 80, 250.0f, -12.21f, -342.0f); - World_Waypoint_Set(465, 80, -164.78f, -12.21f, -832.08f); + World_Waypoint_Set(463, kSetUG07, -88.78f, -12.21f, -184.08f); + World_Waypoint_Set(464, kSetUG07, 250.0f, -12.21f, -342.0f); + World_Waypoint_Set(465, kSetUG07, -164.78f, -12.21f, -832.08f); AI_Movement_Track_Append(kActorFreeSlotA, 464, 5); AI_Movement_Track_Append(kActorFreeSlotA, 465, 1); break; case 10: - World_Waypoint_Set(463, 80, -88.78f, -12.21f, -184.08f); - World_Waypoint_Set(464, 80, 250.0f, -12.21f, -342.0f); - World_Waypoint_Set(465, 80, -164.78f, -12.21f, -832.08f); + World_Waypoint_Set(463, kSetUG07, -88.78f, -12.21f, -184.08f); + World_Waypoint_Set(464, kSetUG07, 250.0f, -12.21f, -342.0f); + World_Waypoint_Set(465, kSetUG07, -164.78f, -12.21f, -832.08f); AI_Movement_Track_Append(kActorFreeSlotA, 465, 5); AI_Movement_Track_Append(kActorFreeSlotA, 464, 1); break; case 11: - World_Waypoint_Set(463, 82, 91.0f, 156.94f, -498.0f); - World_Waypoint_Set(464, 82, -149.0f, 156.94f, -498.0f); + World_Waypoint_Set(463, kSetUG09, 91.0f, 156.94f, -498.0f); + World_Waypoint_Set(464, kSetUG09, -149.0f, 156.94f, -498.0f); AI_Movement_Track_Append(kActorFreeSlotA, 463, 5); AI_Movement_Track_Append(kActorFreeSlotA, 464, 1); break; case 12: - World_Waypoint_Set(463, 82, 91.0f, 156.94f, -498.0f); - World_Waypoint_Set(464, 82, -149.0f, 156.94f, -498.0f); + World_Waypoint_Set(463, kSetUG09, 91.0f, 156.94f, -498.0f); + World_Waypoint_Set(464, kSetUG09, -149.0f, 156.94f, -498.0f); AI_Movement_Track_Append(kActorFreeSlotA, 464, 5); AI_Movement_Track_Append(kActorFreeSlotA, 463, 1); break; case 13: - World_Waypoint_Set(463, 82, -152.51f, 277.31f, 311.98f); - World_Waypoint_Set(464, 82, -124.51f, 275.08f, 319.98f); +#if BLADERUNNER_ORIGINAL_BUGS + // this makes the rat appear on the pipe (top left) but this is buggy + // since it appears floating there + World_Waypoint_Set(463, kSetUG09, -152.51f, 277.31f, 311.98f); + World_Waypoint_Set(464, kSetUG09, -124.51f, 275.08f, 319.98f); AI_Movement_Track_Append(kActorFreeSlotA, 463, 1); AI_Movement_Track_Append(kActorFreeSlotA, 464, 8); AI_Movement_Track_Append(kActorFreeSlotA, 463, 1); +#else + // replacing with something more normal + World_Waypoint_Set(463, kSetUG09, 91.0f, 156.94f, -498.0f); + World_Waypoint_Set(464, kSetUG09, -29.60f, 156.94f, -498.0f); + AI_Movement_Track_Append(kActorFreeSlotA, 463, 4); + AI_Movement_Track_Append(kActorFreeSlotA, 464, 1); + AI_Movement_Track_Append(kActorFreeSlotA, 463, 1); +#endif break; case 14: - World_Waypoint_Set(463, 84, -360.67f, 21.39f, 517.55f); - World_Waypoint_Set(464, 84, -250.67f, 21.39f, 477.55f); - World_Waypoint_Set(465, 84, -248.67f, 21.39f, -1454.45f); + World_Waypoint_Set(463, kSetUG12, -360.67f, 21.39f, 517.55f); + World_Waypoint_Set(464, kSetUG12, -250.67f, 21.39f, 477.55f); + World_Waypoint_Set(465, kSetUG12, -248.67f, 21.39f, -1454.45f); AI_Movement_Track_Append(kActorFreeSlotA, 463, 1); AI_Movement_Track_Append(kActorFreeSlotA, 464, 8); AI_Movement_Track_Append(kActorFreeSlotA, 465, 1); diff --git a/engines/bladerunner/script/ai/free_slot_b.cpp b/engines/bladerunner/script/ai/free_slot_b.cpp index e7bdfc7f11..cbaecb0ac3 100644 --- a/engines/bladerunner/script/ai/free_slot_b.cpp +++ b/engines/bladerunner/script/ai/free_slot_b.cpp @@ -38,9 +38,9 @@ void AIScriptFreeSlotB::Initialize() { _var1 = 0; _var2 = 1; - World_Waypoint_Set(527, 45, -468.46f, -616.58f, 2840.60f); - World_Waypoint_Set(528, 45, -1024.46f, -615.49f, 2928.60f); - World_Waypoint_Set(529, 45, -1024.46f, -615.49f, 2788.60f); + World_Waypoint_Set(527, kSetKP02, -468.46f, -616.58f, 2840.60f); + World_Waypoint_Set(528, kSetKP02, -1024.46f, -615.49f, 2928.60f); + World_Waypoint_Set(529, kSetKP02, -1024.46f, -615.49f, 2788.60f); } bool AIScriptFreeSlotB::Update() { @@ -52,7 +52,7 @@ bool AIScriptFreeSlotB::Update() { switch (Actor_Query_Goal_Number(kActorFreeSlotB)) { case 300: Actor_Set_Goal_Number(kActorFreeSlotB, 301); - Actor_Set_Targetable(kActorFreeSlotB, 1); + Actor_Set_Targetable(kActorFreeSlotB, true); break; case 301: @@ -97,7 +97,7 @@ bool AIScriptFreeSlotB::Update() { return false; } Actor_Set_Goal_Number(kActorFreeSlotB, 406); - Actor_Set_Targetable(kActorFreeSlotB, 1); + Actor_Set_Targetable(kActorFreeSlotB, true); return true; } } @@ -194,7 +194,7 @@ bool AIScriptFreeSlotB::GoalChanged(int currentGoalNumber, int newGoalNumber) { break; case 302: - Actor_Set_Targetable(kActorFreeSlotB, 1); + Actor_Set_Targetable(kActorFreeSlotB, true); Non_Player_Actor_Combat_Mode_On(kActorFreeSlotB, 0, 0, 0, 8, 4, 7, 8, 25, 0, 75, 5, 300, 0); break; @@ -292,6 +292,7 @@ bool AIScriptFreeSlotB::UpdateAnimation(int *animation, int *frame) { break; case 5: + // a bug? This is an animation for Maggie (exploding) *animation = 874; _animationFrame++; if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(874) - 1) { @@ -319,10 +320,17 @@ bool AIScriptFreeSlotB::UpdateAnimation(int *animation, int *frame) { if (_animationFrame == 1) { Ambient_Sounds_Play_Sound(kSfxRATTY5, 99, 0, 0, 25); } - if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(859)) { - _animationFrame = Slice_Animation_Query_Number_Of_Frames(859); +#if BLADERUNNER_ORIGINAL_BUGS + if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(859) - 1) { + _animationFrame = Slice_Animation_Query_Number_Of_Frames(859) - 1; } _animationState = 8; +#else + if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(859) - 1) { + _animationFrame = Slice_Animation_Query_Number_Of_Frames(859) - 1; + _animationState = 8; + } +#endif // BLADERUNNER_ORIGINAL_BUGS break; case 8: @@ -387,7 +395,7 @@ bool AIScriptFreeSlotB::ChangeAnimationMode(int mode) { _animationFrame = 0; break; - case 48: + case kAnimationModeDie: _animationState = 7; _animationFrame = 0; break; @@ -427,9 +435,9 @@ void AIScriptFreeSlotB::processGoal301() { break; case 2: - World_Waypoint_Set(466, 74, 144.98f, -50.13f, -175.75f); - World_Waypoint_Set(547, 74, 105.6f, -50.13f, -578.46f); - World_Waypoint_Set(548, 74, 62.0f, -50.13f, -574.0f); + World_Waypoint_Set(466, kSetUG01, 144.98f, -50.13f, -175.75f); + World_Waypoint_Set(547, kSetUG01, 105.6f, -50.13f, -578.46f); + World_Waypoint_Set(548, kSetUG01, 62.0f, -50.13f, -574.0f); AI_Movement_Track_Append(kActorFreeSlotB, 466, 1); AI_Movement_Track_Append(kActorFreeSlotB, 547, 1); AI_Movement_Track_Append(kActorFreeSlotB, 548, 5); @@ -445,9 +453,9 @@ void AIScriptFreeSlotB::processGoal301() { break; case 4: - World_Waypoint_Set(466, 77, -22.70f, 6.39f, 33.12f); - World_Waypoint_Set(547, 77, -6.70f, -1.74f, -362.88f); - World_Waypoint_Set(548, 77, 164.0f, 11.87f, -1013.0f); + World_Waypoint_Set(466, kSetUG04, -22.70f, 6.39f, 33.12f); + World_Waypoint_Set(547, kSetUG04, -6.70f, -1.74f, -362.88f); + World_Waypoint_Set(548, kSetUG04, 164.0f, 11.87f, -1013.0f); AI_Movement_Track_Append(kActorFreeSlotB, 466, 2); AI_Movement_Track_Append(kActorFreeSlotB, 547, 0); AI_Movement_Track_Append(kActorFreeSlotB, 548, 0); @@ -469,64 +477,75 @@ void AIScriptFreeSlotB::processGoal301() { if (Actor_Query_In_Set(kActorClovis, kSetUG07)) { AI_Movement_Track_Append(kActorFreeSlotB, 39, 10); } else { - World_Waypoint_Set(466, 80, -88.78f, -12.21f, -184.08f); - World_Waypoint_Set(547, 80, 250.0f, -12.21f, -342.0f); - World_Waypoint_Set(548, 80, -164.78f, -12.21f, -832.08f); + World_Waypoint_Set(466, kSetUG07, -88.78f, -12.21f, -184.08f); + World_Waypoint_Set(547, kSetUG07, 250.0f, -12.21f, -342.0f); + World_Waypoint_Set(548, kSetUG07, -164.78f, -12.21f, -832.08f); AI_Movement_Track_Append(kActorFreeSlotB, 466, 5); AI_Movement_Track_Append(kActorFreeSlotB, 547, 1); } break; case 8: - World_Waypoint_Set(466, 80, -88.78f, -12.21f, -184.08f); - World_Waypoint_Set(547, 80, 250.0f, -12.21f, -342.0f); - World_Waypoint_Set(548, 80, -164.78f, -12.21f, -832.08f); + World_Waypoint_Set(466, kSetUG07, -88.78f, -12.21f, -184.08f); + World_Waypoint_Set(547, kSetUG07, 250.0f, -12.21f, -342.0f); + World_Waypoint_Set(548, kSetUG07, -164.78f, -12.21f, -832.08f); AI_Movement_Track_Append(kActorFreeSlotB, 547, 5); AI_Movement_Track_Append(kActorFreeSlotB, 466, 1); break; case 9: - World_Waypoint_Set(466, 80, -88.78f, -12.21f, -184.08f); - World_Waypoint_Set(547, 80, 250.0f, -12.21f, -342.0f); - World_Waypoint_Set(548, 80, -164.78f, -12.21f, -832.08f); + World_Waypoint_Set(466, kSetUG07, -88.78f, -12.21f, -184.08f); + World_Waypoint_Set(547, kSetUG07, 250.0f, -12.21f, -342.0f); + World_Waypoint_Set(548, kSetUG07, -164.78f, -12.21f, -832.08f); AI_Movement_Track_Append(kActorFreeSlotB, 547, 5); AI_Movement_Track_Append(kActorFreeSlotB, 548, 1); break; case 10: - World_Waypoint_Set(466, 80, -88.78f, -12.21f, -184.08f); - World_Waypoint_Set(547, 80, 250.0f, -12.21f, -342.0f); - World_Waypoint_Set(548, 80, -164.78f, -12.21f, -832.08f); + World_Waypoint_Set(466, kSetUG07, -88.78f, -12.21f, -184.08f); + World_Waypoint_Set(547, kSetUG07, 250.0f, -12.21f, -342.0f); + World_Waypoint_Set(548, kSetUG07, -164.78f, -12.21f, -832.08f); AI_Movement_Track_Append(kActorFreeSlotB, 548, 5); AI_Movement_Track_Append(kActorFreeSlotB, 547, 1); break; case 11: - World_Waypoint_Set(466, 82, 91.0f, 156.94f, -498.0f); - World_Waypoint_Set(547, 82, -149.0f, 156.94f, -498.0f); + World_Waypoint_Set(466, kSetUG09, 91.0f, 156.94f, -498.0f); + World_Waypoint_Set(547, kSetUG09, -149.0f, 156.94f, -498.0f); AI_Movement_Track_Append(kActorFreeSlotB, 466, 5); AI_Movement_Track_Append(kActorFreeSlotB, 547, 1); break; case 12: - World_Waypoint_Set(466, 82, 91.0f, 156.94f, -498.0f); - World_Waypoint_Set(547, 82, -149.0f, 156.94f, -498.0f); + World_Waypoint_Set(466, kSetUG09, 91.0f, 156.94f, -498.0f); + World_Waypoint_Set(547, kSetUG09, -149.0f, 156.94f, -498.0f); AI_Movement_Track_Append(kActorFreeSlotB, 547, 5); AI_Movement_Track_Append(kActorFreeSlotB, 466, 1); break; case 13: - World_Waypoint_Set(466, 82, -152.51f, 277.31f, 311.98f); - World_Waypoint_Set(547, 82, -124.51f, 275.08f, 319.98f); +#if BLADERUNNER_ORIGINAL_BUGS + // this makes the rat appear on the pipe (top left) + // but this is buggy since it will appear floating there + World_Waypoint_Set(466, kSetUG09, -152.51f, 277.31f, 311.98f); + World_Waypoint_Set(547, kSetUG09, -124.51f, 275.08f, 319.98f); AI_Movement_Track_Append(kActorFreeSlotB, 466, 1); AI_Movement_Track_Append(kActorFreeSlotB, 547, 8); AI_Movement_Track_Append(kActorFreeSlotB, 466, 1); +#else + // replacing with something more normal + World_Waypoint_Set(466, kSetUG09, -152.51f, 156.94f, -498.0f); + World_Waypoint_Set(547, kSetUG09, -32.60f, 156.94f, -498.0f); + AI_Movement_Track_Append(kActorFreeSlotB, 466, 4); + AI_Movement_Track_Append(kActorFreeSlotB, 547, 1); + AI_Movement_Track_Append(kActorFreeSlotB, 466, 1); +#endif // BLADERUNNER_ORIGINAL_BUGS break; case 14: - World_Waypoint_Set(466, 84, -360.67f, 21.39f, 517.55f); - World_Waypoint_Set(547, 84, -250.67f, 21.39f, 477.55f); - World_Waypoint_Set(548, 84, -248.67f, 21.39f, -1454.45f); + World_Waypoint_Set(466, kSetUG12, -360.67f, 21.39f, 517.55f); + World_Waypoint_Set(547, kSetUG12, -250.67f, 21.39f, 477.55f); + World_Waypoint_Set(548, kSetUG12, -248.67f, 21.39f, -1454.45f); AI_Movement_Track_Append(kActorFreeSlotB, 466, 1); AI_Movement_Track_Append(kActorFreeSlotB, 547, 8); AI_Movement_Track_Append(kActorFreeSlotB, 548, 1); diff --git a/engines/bladerunner/script/ai/general_doll.cpp b/engines/bladerunner/script/ai/general_doll.cpp index eb82c54ba2..f5739fee89 100644 --- a/engines/bladerunner/script/ai/general_doll.cpp +++ b/engines/bladerunner/script/ai/general_doll.cpp @@ -366,7 +366,7 @@ bool AIScriptGeneralDoll::ChangeAnimationMode(int mode) { _animationFrame = 0; break; - case 48: + case kAnimationModeDie: _animationState = 4; _animationFrame = 0; break; diff --git a/engines/bladerunner/script/ai/guzza.cpp b/engines/bladerunner/script/ai/guzza.cpp index d76ee3ee73..5c36beea1b 100644 --- a/engines/bladerunner/script/ai/guzza.cpp +++ b/engines/bladerunner/script/ai/guzza.cpp @@ -953,7 +953,7 @@ bool AIScriptGuzza::ChangeAnimationMode(int mode) { _animationFrame = 0; break; - case 48: + case kAnimationModeDie: _animationState = 28; _animationFrame = 0; break; diff --git a/engines/bladerunner/script/ai/izo.cpp b/engines/bladerunner/script/ai/izo.cpp index 13615d62e5..2fed274f50 100644 --- a/engines/bladerunner/script/ai/izo.cpp +++ b/engines/bladerunner/script/ai/izo.cpp @@ -47,7 +47,7 @@ void AIScriptIzo::Initialize() { Actor_Set_Goal_Number(kActorIzo, 0); Actor_Put_In_Set(kActorIzo, kSetHC01_HC02_HC03_HC04); Actor_Set_At_XYZ(kActorIzo, 591.0f, 0.14f, 25.0f, 540); - World_Waypoint_Set(349, 70, -14.7f, -4.01f, 224.5f); + World_Waypoint_Set(349, kSetRC03, -14.7f, -4.01f, 224.5f); } bool AIScriptIzo::Update() { @@ -984,7 +984,7 @@ bool AIScriptIzo::ChangeAnimationMode(int mode) { _animationFrame = 0; break; - case 48: + case kAnimationModeDie: _animationState = 19; _animationFrame = 0; break; @@ -1080,10 +1080,10 @@ void AIScriptIzo::dialogueWithIzo() { void AIScriptIzo::modifyWaypoints() { switch (Random_Query(1, 10) - 1) { case 0: - World_Waypoint_Set(484, 54, -212.58f, 23.38f, -1859.45f); - World_Waypoint_Set(485, 54, 355.49f, 31.66f, -859.81f); - World_Waypoint_Set(486, 11, -323.89f, -24.0f, 35.58f); - World_Waypoint_Set(487, 11, -211.89f, -24.0f, 35.58f); + World_Waypoint_Set(484, kSetNR01, -212.58f, 23.38f, -1859.45f); + World_Waypoint_Set(485, kSetNR01, 355.49f, 31.66f, -859.81f); + World_Waypoint_Set(486, kSetNR02, -323.89f, -24.0f, 35.58f); + World_Waypoint_Set(487, kSetNR02, -211.89f, -24.0f, 35.58f); AI_Movement_Track_Append(kActorIzo, 484, 1); AI_Movement_Track_Append(kActorIzo, 485, 10); AI_Movement_Track_Append(kActorIzo, 486, 1); @@ -1094,25 +1094,25 @@ void AIScriptIzo::modifyWaypoints() { break; case 1: - World_Waypoint_Set(484, 13, -1335.0f, 0.0f, -542.0f); - World_Waypoint_Set(485, 13, -1027.0f, 0.0f, -542.0f); + World_Waypoint_Set(484, kSetNR05_NR08, -1335.0f, 0.0f, -542.0f); + World_Waypoint_Set(485, kSetNR05_NR08, -1027.0f, 0.0f, -542.0f); AI_Movement_Track_Append(kActorIzo, 484, 1); AI_Movement_Track_Append(kActorIzo, 485, 20); AI_Movement_Track_Append(kActorIzo, 484, 1); break; case 2: - World_Waypoint_Set(484, 37, -352.16f, 8.0f, -379.24f); - World_Waypoint_Set(485, 37, 108.2f, 8.0f, -934.80f); + World_Waypoint_Set(484, kSetHF01, -352.16f, 8.0f, -379.24f); + World_Waypoint_Set(485, kSetHF01, 108.2f, 8.0f, -934.80f); AI_Movement_Track_Append(kActorIzo, 484, 1); AI_Movement_Track_Append(kActorIzo, 485, 1); break; case 3: - World_Waypoint_Set(484, 39, 589.59f, 47.76f, -1153.76f); - World_Waypoint_Set(485, 39, 481.59f, 47.76f, -429.76f); - World_Waypoint_Set(486, 38, 524.0f, 47.76f, -562.0f); - World_Waypoint_Set(487, 38, -10.0f, 47.76f, -327.0f); + World_Waypoint_Set(484, kSetHF03, 589.59f, 47.76f, -1153.76f); + World_Waypoint_Set(485, kSetHF03, 481.59f, 47.76f, -429.76f); + World_Waypoint_Set(486, kSetHF02, 524.0f, 47.76f, -562.0f); + World_Waypoint_Set(487, kSetHF02, -10.0f, 47.76f, -327.0f); AI_Movement_Track_Append(kActorIzo, 484, 1); AI_Movement_Track_Append(kActorIzo, 485, 1); AI_Movement_Track_Append(kActorIzo, 486, 1); diff --git a/engines/bladerunner/script/ai/lucy.cpp b/engines/bladerunner/script/ai/lucy.cpp index e4b92ab4a9..c6b26a533e 100644 --- a/engines/bladerunner/script/ai/lucy.cpp +++ b/engines/bladerunner/script/ai/lucy.cpp @@ -817,7 +817,7 @@ bool AIScriptLucy::ChangeAnimationMode(int mode) { _animationFrame = 0; break; - case 48: + case kAnimationModeDie: _animationState = 7; _animationFrame = 0; break; diff --git a/engines/bladerunner/script/ai/luther.cpp b/engines/bladerunner/script/ai/luther.cpp index 4ad0e5639d..2298f40b02 100644 --- a/engines/bladerunner/script/ai/luther.cpp +++ b/engines/bladerunner/script/ai/luther.cpp @@ -447,7 +447,7 @@ bool AIScriptLuther::ChangeAnimationMode(int mode) { _animationFrame = 0; break; - case 48: + case kAnimationModeDie: _animationState = 12; _animationFrame = 0; break; diff --git a/engines/bladerunner/script/ai/mccoy.cpp b/engines/bladerunner/script/ai/mccoy.cpp index cafca8a1a7..432c75f7d9 100644 --- a/engines/bladerunner/script/ai/mccoy.cpp +++ b/engines/bladerunner/script/ai/mccoy.cpp @@ -1092,7 +1092,7 @@ bool AIScriptMcCoy::UpdateAnimation(int *animation, int *frame) { } break; - case 48: + case kAnimationModeDie: *animation = 33; _animationFrame++; if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation)) { @@ -1102,7 +1102,7 @@ bool AIScriptMcCoy::UpdateAnimation(int *animation, int *frame) { } break; - case 49: + case kAnimationModeCombatDie: *animation = 34; _animationFrame++; if (_animationFrame >= Slice_Animation_Query_Number_Of_Frames(*animation)) { diff --git a/engines/bladerunner/script/ai/mutant1.cpp b/engines/bladerunner/script/ai/mutant1.cpp index 51c9c705cd..fcc46cdbc2 100644 --- a/engines/bladerunner/script/ai/mutant1.cpp +++ b/engines/bladerunner/script/ai/mutant1.cpp @@ -580,7 +580,7 @@ bool AIScriptMutant1::ChangeAnimationMode(int mode) { _animationFrame = 0; break; - case 48: + case kAnimationModeDie: _animationState = 8; _animationFrame = 0; break; diff --git a/engines/bladerunner/script/ai/mutant2.cpp b/engines/bladerunner/script/ai/mutant2.cpp index e1e851a381..6f7f4924a4 100644 --- a/engines/bladerunner/script/ai/mutant2.cpp +++ b/engines/bladerunner/script/ai/mutant2.cpp @@ -525,7 +525,7 @@ bool AIScriptMutant2::ChangeAnimationMode(int mode) { _var1 = 1; break; - case 48: + case kAnimationModeDie: _animationState = 6; _animationFrame = 0; break; diff --git a/engines/bladerunner/script/ai/mutant3.cpp b/engines/bladerunner/script/ai/mutant3.cpp index b612cba7bd..393cf01a2c 100644 --- a/engines/bladerunner/script/ai/mutant3.cpp +++ b/engines/bladerunner/script/ai/mutant3.cpp @@ -586,7 +586,7 @@ bool AIScriptMutant3::ChangeAnimationMode(int mode) { } break; - case 48: + case kAnimationModeDie: _animationState = 6; _animationFrame = 0; break; diff --git a/engines/bladerunner/script/ai/sadik.cpp b/engines/bladerunner/script/ai/sadik.cpp index c4a2b99fa8..4dc36f85b9 100644 --- a/engines/bladerunner/script/ai/sadik.cpp +++ b/engines/bladerunner/script/ai/sadik.cpp @@ -330,7 +330,7 @@ bool AIScriptSadik::GoalChanged(int currentGoalNumber, int newGoalNumber) { case kGoalSadikUG18Move: Actor_Set_Targetable(kActorSadik, true); - World_Waypoint_Set(436, 89, -356.11f, 0.0f, 652.42f); + World_Waypoint_Set(436, kSetUG18, -356.11f, 0.0f, 652.42f); AI_Movement_Track_Flush(kActorSadik); AI_Movement_Track_Append_Run(kActorSadik, 436, 0); AI_Movement_Track_Repeat(kActorSadik); diff --git a/engines/bladerunner/script/ai/taffy_patron.cpp b/engines/bladerunner/script/ai/taffy_patron.cpp index 0bf6861d12..975aa1df91 100644 --- a/engines/bladerunner/script/ai/taffy_patron.cpp +++ b/engines/bladerunner/script/ai/taffy_patron.cpp @@ -154,7 +154,7 @@ bool AIScriptTaffyPatron::ChangeAnimationMode(int mode) { _animationFrame = 0; break; - case 48: + case kAnimationModeDie: _animationState = 2; _animationFrame = 0; break; diff --git a/engines/bladerunner/script/scene/ug13.cpp b/engines/bladerunner/script/scene/ug13.cpp index f2e43c88e3..ee1d364e4a 100644 --- a/engines/bladerunner/script/scene/ug13.cpp +++ b/engines/bladerunner/script/scene/ug13.cpp @@ -82,9 +82,18 @@ void SceneScriptUG13::SceneLoaded() { Unobstacle_Object("BOX FOR ARCHWAY 02", true); Unobstacle_Object("STAIR_RAIL", true); Unobstacle_Object("DISC_LEFT", true); +#if BLADERUNNER_ORIGINAL_BUGS +#else + if (Game_Flag_Query(kFlagUG08ElevatorUp)) { + Obstacle_Object("ELEVBLOCK", true); + } else { + Unobstacle_Object("ELEVBLOCK", true); + } +#endif // BLADERUNNER_ORIGINAL_BUGS Clickable_Object("BASKET"); Clickable_Object("BOLLARD"); Unclickable_Object("BASKET"); + if ( Global_Variable_Query(kVariableChapter) >= 3 && !Actor_Clue_Query(kActorMcCoy, kClueOriginalRequisitionForm) && Game_Flag_Query(kFlagCT04HomelessKilledByMcCoy) @@ -115,12 +124,20 @@ bool SceneScriptUG13::ClickedOn3DObject(const char *objectName, bool a2) { Scene_Loop_Start_Special(kSceneLoopModeOnce, 0, false); Game_Flag_Reset(kFlagUG08ElevatorUp); Game_Flag_Set(kFlagUG13CallElevator); +#if BLADERUNNER_ORIGINAL_BUGS +#else + Unobstacle_Object("ELEVBLOCK", true); +#endif // BLADERUNNER_ORIGINAL_BUGS return true; } else { Scene_Loop_Set_Default(4); Scene_Loop_Start_Special(kSceneLoopModeOnce, 3, false); Game_Flag_Set(kFlagUG08ElevatorUp); Scene_Exit_Remove(0); +#if BLADERUNNER_ORIGINAL_BUGS +#else + Obstacle_Object("ELEVBLOCK", true); +#endif // BLADERUNNER_ORIGINAL_BUGS return true; } } diff --git a/engines/bladerunner/set.cpp b/engines/bladerunner/set.cpp index 1e441f68db..6d898bdc80 100644 --- a/engines/bladerunner/set.cpp +++ b/engines/bladerunner/set.cpp @@ -90,6 +90,7 @@ bool Set::open(const Common::String &name) { _objects[i].isTarget = 0; s->skip(4); } + patchInAdditionalObjectsInSet(); _walkboxCount = s->readUint32LE(); assert(_walkboxCount <= 95); @@ -424,12 +425,58 @@ void Set::load(SaveFileReadStream &f) { * 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 objectId) const { // For bugfixes with respect to clickable/targetable box positioning/bounding box - if (_vm->_scene->getSceneId() == kSceneBB06) { /// Sebastian's room with doll - if (_objects[objectId].name == "BOX31") { // dollhouse box in BB06 +void Set::overrideSceneObjectInfo(int objectId) const { + switch (_vm->_scene->getSceneId()) { + case kSceneBB06: + // Sebastian's room with doll + if (objectId == 3 && _objects[objectId].name == "BOX31") { + // dollhouse box in BB06 _objects[objectId].bbox.setXYZ(-161.47f, 30.0f, 53.75f, -110.53f, 69.81f, 90.90f); } + break; + case kSceneUG09: + // block passage to buggy pipe + if (objectId == 7 && _objects[objectId].name == "BOXS FOR ARCHWAY 01") { + _objects[objectId].bbox.setXYZ(-168.99f, 151.38f, -139.10f, -105.95f, 239.59f, 362.70); + } + break; + default: + return; } } +/** +* Used for adding objects in a Set mainly to fix a few "McCoy walking to places he should not" issues +* This is called in Set::open() +* Note: +* - ScummVM (post fix) save games will have the extra objects information +* - Original save games will not have the extra objects if the save game room scene was an affected scene +* but they will get them if the player exits and re-enters. The code anticipates not finding an object in a scene +* so this should not be an issue. +*/ +void Set::patchInAdditionalObjectsInSet() { + Common::String custObjName; + int objectId = _objectCount; + BoundingBox bbox; + switch (_vm->_scene->getSceneId()) { + case kSceneUG13: + // Underground homeless place + // block passage to empty elevator chute + bbox = BoundingBox(-80.00f, 35.78f, -951.75f, 74.36f, 364.36f, -810.56f); + custObjName = "ELEVBLOCK"; + break; + default: + return; + } + + _objectCount++; + _objects[objectId].name = custObjName.c_str(); + _objects[objectId].bbox = bbox; + _objects[objectId].isObstacle = 0; // init as false - Can be changed in Scene script eg. SceneLoaded() with (Un)Obstacle_Object() + _objects[objectId].isClickable = 0; // init as false - Can be changed in Scene script eg. SceneLoaded() with (Un)Clickable_Object() + _objects[objectId].isHotMouse = 0; + _objects[objectId].unknown1 = 0; + _objects[objectId].isTarget = 0; // init as false - Can be changed in Scene script eg. SceneLoaded() with (Un_)Combat_Target_Object +} + } // End of namespace BladeRunner diff --git a/engines/bladerunner/set.h b/engines/bladerunner/set.h index 661d38eec1..b2aca931eb 100644 --- a/engines/bladerunner/set.h +++ b/engines/bladerunner/set.h @@ -108,6 +108,7 @@ public: private: static bool isXZInWalkbox(float x, float z, const Walkbox &walkbox); void overrideSceneObjectInfo(int objectId) const; + void patchInAdditionalObjectsInSet(); }; } // End of namespace BladeRunner |