diff options
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 |