[Scummvm-git-logs] scummvm master -> 7f6b9750d7c77afa469aac82f75bb46bf75ddf3e

antoniou79 antoniou at cti.gr
Mon May 13 02:40:33 CEST 2019


This automated email contains information about 6 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
0e112b964c BLADERUNNER: cut content now loads all TLK resources
b6f7ff77d3 BLADERUNNER: GPS talkie does not disable controls
c52cd1ea4c BLADERUNNER: Fixes for PS05
618d48dde8 BLADERUNNER: Mainframe talkie restored
9207f7270b BLADERUNNER: Hit and Run dispatch clue restored
7f6b9750d7 BLADERUNNER: Howie restored content


Commit: 0e112b964c4cde11dcdeb8ca809a8e8de496ab6e
    https://github.com/scummvm/scummvm/commit/0e112b964c4cde11dcdeb8ca809a8e8de496ab6e
Author: Thanasis Antoniou (a.antoniou79 at gmail.com)
Date: 2019-05-13T03:29:00+03:00

Commit Message:
BLADERUNNER: cut content now loads all TLK resources

Work-around for cut content stored in wrong TLK files

Changed paths:
    engines/bladerunner/chapters.cpp
    engines/bladerunner/script/kia_script.cpp
    engines/bladerunner/script/scene/rc01.cpp


diff --git a/engines/bladerunner/chapters.cpp b/engines/bladerunner/chapters.cpp
index 09ab94b..7cf7c5e 100644
--- a/engines/bladerunner/chapters.cpp
+++ b/engines/bladerunner/chapters.cpp
@@ -39,8 +39,18 @@ bool Chapters::enterChapter(int chapter) {
 	if (!_vm->openArchive(Common::String::format("VQA%d.MIX", MIN(id, 3))))
 		return false;
 
-	if (!_vm->openArchive(Common::String::format("%d.TLK", MIN(id, 3))))
-		return false;
+	if (_vm->_cutContent) {
+		for (int chi = 1; chi < 4; ++chi) {
+			if (!_vm->isArchiveOpen(Common::String::format("%d.TLK", chi))
+			    && !_vm->openArchive(Common::String::format("%d.TLK", chi))
+			){
+				return false;
+			}
+		}
+	} else {
+		if (!_vm->openArchive(Common::String::format("%d.TLK", MIN(id, 3))))
+			return false;
+	}
 
 	if (!_vm->openArchive(Common::String::format("OUTTAKE%d.MIX", id)))
 		return false;
@@ -61,7 +71,15 @@ void Chapters::closeResources() {
 	}
 #endif // BLADERUNNER_ORIGINAL_BUGS
 	_vm->closeArchive(Common::String::format("VQA%d.MIX", MIN(id, 3)));
-	_vm->closeArchive(Common::String::format("%d.TLK", MIN(id, 3)));
+	if (_vm->_cutContent) {
+		for (int chi = 1; chi < 4; ++chi) {
+			if (_vm->isArchiveOpen(Common::String::format("%d.TLK", chi))) {
+				_vm->closeArchive(Common::String::format("%d.TLK", chi));
+			}
+		}
+	} else {
+		_vm->closeArchive(Common::String::format("%d.TLK", MIN(id, 3)));
+	}
 	_vm->closeArchive(Common::String::format("OUTTAKE%d.MIX", id));
 	_hasOpenResources = false;
 }
diff --git a/engines/bladerunner/script/kia_script.cpp b/engines/bladerunner/script/kia_script.cpp
index a6416d2..10afa16 100644
--- a/engines/bladerunner/script/kia_script.cpp
+++ b/engines/bladerunner/script/kia_script.cpp
@@ -46,9 +46,9 @@ void KIAScript::SCRIPT_KIA_DLL_Play_Clue_Asset_Script(int notUsed, int clueId) {
 		KIA_Play_Actor_Dialogue(kActorOfficerLeary, 0);
 		break;
 	case kClueDoorForced1:
-		if (_vm->_cutContent && _vm->_gameVars[kVariableChapter] == 1) {
-			// unfortunately this line is only available in TLK1 (so only Act 1)
-			// it will be silent in subsequent Acts
+		if (_vm->_cutContent || _vm->_gameVars[kVariableChapter] == 1) {
+			// keep in mind, this line in only available in Act 1 (1.TLK) unless _vm->_cutContent is selected (provided that cut content now loads all TLKs)
+			// Without cut content it will be silent in subsequent Acts
 			KIA_Play_Actor_Dialogue(kActorVoiceOver, 1870);
 		}
 		break;
diff --git a/engines/bladerunner/script/scene/rc01.cpp b/engines/bladerunner/script/scene/rc01.cpp
index e35c231..c07ff46 100644
--- a/engines/bladerunner/script/scene/rc01.cpp
+++ b/engines/bladerunner/script/scene/rc01.cpp
@@ -278,7 +278,7 @@ bool SceneScriptRC01::ClickedOn3DObject(const char *objectName, bool a2) {
 			         && !Actor_Query_In_Set(kActorOfficerLeary, kSetRC01)
 			         && Global_Variable_Query(kVariableChapter) == 1) {
 				if (_vm->_cutContent) {
-					// keep in mind, this line in only available in Act 1
+					// keep in mind, this line in only available in Act 1 (1.TLK) unless _vm->_cutContent is selected (provided that cut content now loads all TLKs)
 					Actor_Voice_Over(1870, kActorVoiceOver);
 				} else {
 					Actor_Says(kActorMcCoy, 8570, 14);


Commit: b6f7ff77d3a464954536dd6dcdf97f1d13a5fc85
    https://github.com/scummvm/scummvm/commit/b6f7ff77d3a464954536dd6dcdf97f1d13a5fc85
Author: Thanasis Antoniou (a.antoniou79 at gmail.com)
Date: 2019-05-13T03:29:00+03:00

Commit Message:
BLADERUNNER: GPS talkie does not disable controls

Changed paths:
    engines/bladerunner/ui/spinner.cpp
    engines/bladerunner/ui/spinner.h


diff --git a/engines/bladerunner/ui/spinner.cpp b/engines/bladerunner/ui/spinner.cpp
index bb4f67b..0054e1b 100644
--- a/engines/bladerunner/ui/spinner.cpp
+++ b/engines/bladerunner/ui/spinner.cpp
@@ -163,8 +163,7 @@ int Spinner::chooseDestination(int loopId, bool immediately) {
 			mouseUpCallback,
 			this
 		);
-//		_vm->_ambientSounds->playSpeech(kActorAnsweringMachine, 480, 50, 0, 0, 100);
-		playSpeechLine(kActorAnsweringMachine, 480, 0.5f);
+		_vm->_actors[kActorAnsweringMachine]->speechPlay(480, false);
 		_vm->_ambientSounds->addSound(kSfxSPINAMB2,  5, 30, 30,  45,    0,   0, -101, -101, 0, 0);
 	} else {
 		_imagePicker->activate(
@@ -440,34 +439,4 @@ void Spinner::tickDescription() {
 	}
 }
 
-void Spinner::playSpeechLine(int actorId, int sentenceId, float duration) {
-	_vm->gameWaitForActive();
-
-	_vm->_mouse->disable();
-	Actor *actor = _vm->_actors[actorId];
-	actor->speechPlay(sentenceId, true);
-
-	while (_vm->_gameIsRunning) {
-		_vm->_actorIsSpeaking = true;
-		_vm->_actorSpeakStopIsRequested = false;
-		_vm->gameTick();
-		_vm->_actorIsSpeaking = false;
-		if (_vm->_actorSpeakStopIsRequested || !actor->isSpeeching()) {
-			actor->speechStop();
-			break;
-		}
-	}
-
-	if (duration > 0.0f && !_vm->_actorSpeakStopIsRequested) {
-		int timeEnd = duration * 1000.0f + _vm->_time->current();
-		while ((timeEnd > _vm->_time->current()) && _vm->_gameIsRunning) {
-			_vm->gameTick();
-		}
-	}
-
-	_vm->_actorSpeakStopIsRequested = false;
-
-	_vm->_mouse->enable();
-}
-
 } // End of namespace BladeRunner
diff --git a/engines/bladerunner/ui/spinner.h b/engines/bladerunner/ui/spinner.h
index a637cef..50a8be9 100644
--- a/engines/bladerunner/ui/spinner.h
+++ b/engines/bladerunner/ui/spinner.h
@@ -76,7 +76,6 @@ public:
 	void reset();
 	void resume();
 
-	void playSpeechLine(int actorId, int sentenceId, float duration);
 	void destinationFocus(int destination);
 	void setupDescription(int actorId, int sentenceId);
 	void resetDescription();


Commit: c52cd1ea4cde0a81623737f6f6382da059f36a67
    https://github.com/scummvm/scummvm/commit/c52cd1ea4cde0a81623737f6f6382da059f36a67
Author: Thanasis Antoniou (a.antoniou79 at gmail.com)
Date: 2019-05-13T03:29:00+03:00

Commit Message:
BLADERUNNER: Fixes for PS05

Pathfinding and spawn points fixes

Changed paths:
    engines/bladerunner/script/scene/ps05.cpp
    engines/bladerunner/set.cpp


diff --git a/engines/bladerunner/script/scene/ps05.cpp b/engines/bladerunner/script/scene/ps05.cpp
index 6adff84..8bb579c 100644
--- a/engines/bladerunner/script/scene/ps05.cpp
+++ b/engines/bladerunner/script/scene/ps05.cpp
@@ -29,8 +29,13 @@ void SceneScriptPS05::InitializeScene() {
 		Setup_Scene_Information(547.59f, 0.18f, -216.84f, 334);
 	} else if (Game_Flag_Query(kFlagPS02toPS05)) {
 		Setup_Scene_Information(635.0f, 0.0f, -598.0f, 475);
-	} else { // kFlagPS06toPS05 || kFlagPS15toPS05
+	} else { // kFlagPS06toPS05 || kFlagPS15toPS05, but for some reason kFlagPS06toPS05 is then set in PlayerWalkedIn
+#if BLADERUNNER_ORIGINAL_BUGS
 		Setup_Scene_Information(630.72f, 0.38f, -469.26f, 400);
+#else
+		// exiting from PS15
+		Setup_Scene_Information(553.24f, 0.37f, -422.97f, 400);
+#endif // BLADERUNNER_ORIGINAL_BUGS
 	}
 	Scene_Exit_Add_2D_Exit(0, 218, 98, 280, 246, 3);
 	Scene_Exit_Add_2D_Exit(1, 330, 90, 436, 198, 0);
@@ -49,6 +54,10 @@ void SceneScriptPS05::InitializeScene() {
 
 void SceneScriptPS05::SceneLoaded() {
 	Obstacle_Object("WATER FOUNTAIN", true);
+#if BLADERUNNER_ORIGINAL_BUGS
+#else
+	Obstacle_Object("MAINFBLOCK", true);
+#endif // BLADERUNNER_ORIGINAL_BUGS
 	Clickable_Object("WATER FOUNTAIN");
 	Clickable_Object("ASHTRAY");
 	Clickable_Object("FIRE EXTINGISHER");
@@ -57,6 +66,11 @@ void SceneScriptPS05::SceneLoaded() {
 	Clickable_Object("WANTED POSTERS");
 	Unclickable_Object("WATER FOUNTAIN");
 	Unclickable_Object("CUP");
+#if BLADERUNNER_ORIGINAL_BUGS
+#else
+	Unclickable_Object("FIRE EXTINGISHER");
+#endif // BLADERUNNER_ORIGINAL_BUGS
+
 }
 
 bool SceneScriptPS05::MouseClick(int x, int y) {
@@ -112,12 +126,21 @@ bool SceneScriptPS05::ClickedOnExit(int exitId) {
 		return true;
 	}
 	if (exitId == 2) {
+#if BLADERUNNER_ORIGINAL_BUGS
 		if (!Loop_Actor_Walk_To_XYZ(kActorMcCoy, 742.52f, 0.37f, -457.69f, 0, true, false, false)) {
 			Game_Flag_Set(kFlagPS05toPS06);
 			Ambient_Sounds_Remove_All_Non_Looping_Sounds(true);
 			Ambient_Sounds_Remove_All_Looping_Sounds(1);
 			Set_Enter(kSetPS06, kScenePS06);
 		}
+#else
+		if (!Loop_Actor_Walk_To_XYZ(kActorMcCoy, 715.52f, 0.37f, -457.69f, 0, true, false, false)) {
+			Game_Flag_Set(kFlagPS05toPS06);
+			Ambient_Sounds_Remove_All_Non_Looping_Sounds(true);
+			Ambient_Sounds_Remove_All_Looping_Sounds(1);
+			Set_Enter(kSetPS06, kScenePS06);
+		}
+#endif // BLADERUNNER_ORIGINAL_BUGS
 		return true;
 	}
 	return false;
@@ -143,7 +166,11 @@ void SceneScriptPS05::ActorChangedGoal(int actorId, int newGoal, int oldGoal, bo
 
 void SceneScriptPS05::PlayerWalkedIn() {
 	if (Game_Flag_Query(kFlagPS06toPS05)) {
+#if BLADERUNNER_ORIGINAL_BUGS
 		Actor_Set_At_XYZ(kActorMcCoy, 718.72f, 0.37f, -461.26f, 600);
+#else
+		Actor_Set_At_XYZ(kActorMcCoy, 710.14f, 0.37f, -455.48f, 600);
+#endif // BLADERUNNER_ORIGINAL_BUGS
 	} else if (Game_Flag_Query(kFlagPS02toPS05)) {
 		selectNextTvNews();
 		turnOnTV();
diff --git a/engines/bladerunner/set.cpp b/engines/bladerunner/set.cpp
index e03466b..5427858 100644
--- a/engines/bladerunner/set.cpp
+++ b/engines/bladerunner/set.cpp
@@ -480,6 +480,12 @@ void Set::patchInAdditionalObjectsInSet() {
 	int objectId = _objectCount;
 	BoundingBox bbox;
 	switch (_vm->_scene->getSceneId()) {
+	case kScenePS05:
+		// block actual passage to ESPER room because
+		// it causes McCoy to sometimes go behind the wall
+		bbox = BoundingBox(730.50f, -0.0f, -481.10f, 734.51f, 144.75f, -437.55f);
+		custObjName = "MAINFBLOCK";
+		break;
 	case kSceneUG13:
 		// Underground homeless place
 		// block passage to empty elevator chute


Commit: 618d48dde8a9e83f0cfa01d48cecd9cbfca6bf0d
    https://github.com/scummvm/scummvm/commit/618d48dde8a9e83f0cfa01d48cecd9cbfca6bf0d
Author: Thanasis Antoniou (a.antoniou79 at gmail.com)
Date: 2019-05-13T03:29:00+03:00

Commit Message:
BLADERUNNER: Mainframe talkie restored

Changed paths:
    engines/bladerunner/actor.cpp
    engines/bladerunner/actor.h
    engines/bladerunner/script/scene/ps06.cpp
    engines/bladerunner/script/script.cpp
    engines/bladerunner/script/script.h


diff --git a/engines/bladerunner/actor.cpp b/engines/bladerunner/actor.cpp
index 1987627..b00b870 100644
--- a/engines/bladerunner/actor.cpp
+++ b/engines/bladerunner/actor.cpp
@@ -1209,7 +1209,8 @@ bool Actor::hasClue(int clueId) const {
 	return _clues->isAcquired(clueId);
 }
 
-void Actor::copyClues(int actorId) {
+bool Actor::copyClues(int actorId) {
+	bool newCluesAcquired = false;
 	Actor *otherActor = _vm->_actors[actorId];
 	for (int i = 0; i < (int)_vm->_gameInfo->getClueCount(); i++) {
 		if (hasClue(i) && !_clues->isPrivate(i) && otherActor->canAcquireClue(i) && !otherActor->hasClue(i)) {
@@ -1218,8 +1219,10 @@ void Actor::copyClues(int actorId) {
 				fromActorId = _clues->getFromActorId(i);
 			}
 			otherActor->acquireClue(i, false, fromActorId);
+			newCluesAcquired = true;
 		}
 	}
+	return newCluesAcquired;
 }
 
 void Actor::acquireCluesByRelations() {
diff --git a/engines/bladerunner/actor.h b/engines/bladerunner/actor.h
index 186468b..9d84e57 100644
--- a/engines/bladerunner/actor.h
+++ b/engines/bladerunner/actor.h
@@ -254,7 +254,7 @@ public:
 	void acquireClue(int clueId, bool unknownFlag, int fromActorId);
 	void loseClue(int clueId);
 	bool hasClue(int clueId) const;
-	void copyClues(int actorId);
+	bool copyClues(int actorId);
 	void acquireCluesByRelations();
 
 	int soundVolume() const;
diff --git a/engines/bladerunner/script/scene/ps06.cpp b/engines/bladerunner/script/scene/ps06.cpp
index d0624ef..10797e3 100644
--- a/engines/bladerunner/script/scene/ps06.cpp
+++ b/engines/bladerunner/script/scene/ps06.cpp
@@ -53,7 +53,7 @@ bool SceneScriptPS06::ClickedOn3DObject(const char *objectName, bool a2) {
 	if (Object_Query_Click("E.SCREEN03", objectName)
 	 || Object_Query_Click("E.MONITOR3", objectName)
 	) {
-		Actor_Says(kActorAnsweringMachine, 330, 3);
+		Actor_Says(kActorAnsweringMachine, 330, kAnimationModeTalk); // uploading clues
 		if (Actor_Clue_Query(kActorMcCoy, kClueCar)
 		 && !Actor_Clue_Query(kActorMcCoy, kClueCarRegistration1)
 		 && !Actor_Clue_Query(kActorMcCoy, kClueCarRegistration2)
@@ -85,15 +85,27 @@ bool SceneScriptPS06::ClickedOn3DObject(const char *objectName, bool a2) {
 			Actor_Clues_Transfer_New_From_Mainframe(kActorMcCoy);
 			return true;
 		} else {
-			Actor_Clues_Transfer_New_To_Mainframe(kActorMcCoy);
-			Ambient_Sounds_Play_Sound(kSfxDATALOAD, 50, 0, 0, 99);
-			Delay(2000);
-			Actor_Says(kActorAnsweringMachine, 340,  kAnimationModeTalk);
-			Actor_Clues_Transfer_New_From_Mainframe(kActorMcCoy);
-			Ambient_Sounds_Play_Sound(kSfxDATALOAD, 50, 0, 0, 99);
-			Delay(2000);
+			bool tranferedClues = false;
+			tranferedClues = Actor_Clues_Transfer_New_To_Mainframe(kActorMcCoy);
+			if (_vm->_cutContent && !tranferedClues) {
+				Actor_Says(kActorAnsweringMachine, 370,  kAnimationModeTalk); // no clues transfered
+			} else {
+				Ambient_Sounds_Play_Sound(kSfxDATALOAD, 50, 0, 0, 99);
+				Delay(2000);
+			}
+			Actor_Says(kActorAnsweringMachine, 340,  kAnimationModeTalk);     // downloading clues
+			tranferedClues = Actor_Clues_Transfer_New_From_Mainframe(kActorMcCoy);
+			if (_vm->_cutContent && !tranferedClues) {
+				Actor_Says(kActorAnsweringMachine, 370,  kAnimationModeTalk); // no clues transfered
+			} else {
+				Ambient_Sounds_Play_Sound(kSfxDATALOAD, 50, 0, 0, 99);
+				Delay(2000);
+			}
 			Ambient_Sounds_Play_Sound(kSfxBEEPNEAT, 80, 0, 0, 99);
-			Actor_Says(kActorAnsweringMachine, 350, kAnimationModeTalk);
+			Actor_Says(kActorAnsweringMachine, 350, kAnimationModeTalk);          // db transfer complete
+			if (_vm->_cutContent && tranferedClues) {
+				Actor_Says(kActorAnsweringMachine, 360, kAnimationModeTalk);      // new clues added
+			}
 			return true;
 		}
 	}
diff --git a/engines/bladerunner/script/script.cpp b/engines/bladerunner/script/script.cpp
index 4ce5e89..e665916 100644
--- a/engines/bladerunner/script/script.cpp
+++ b/engines/bladerunner/script/script.cpp
@@ -740,14 +740,14 @@ bool ScriptBase::Actor_Clue_Query(int actorId, int clueId) {
 	return _vm->_actors[actorId]->hasClue(clueId);
 }
 
-void ScriptBase::Actor_Clues_Transfer_New_To_Mainframe(int actorId) {
+bool ScriptBase::Actor_Clues_Transfer_New_To_Mainframe(int actorId) {
 	debugC(kDebugScript, "Actor_Clues_Transfer_New_To_Mainframe(%d)", actorId);
-	_vm->_actors[actorId]->copyClues(kActorVoiceOver);
+	return _vm->_actors[actorId]->copyClues(kActorVoiceOver);
 }
 
-void ScriptBase::Actor_Clues_Transfer_New_From_Mainframe(int actorId) {
+bool ScriptBase::Actor_Clues_Transfer_New_From_Mainframe(int actorId) {
 	debugC(kDebugScript, "Actor_Clues_Transfer_New_From_Mainframe(%d)", actorId);
-	_vm->_actors[kActorVoiceOver]->copyClues(actorId);
+	return _vm->_actors[kActorVoiceOver]->copyClues(actorId);
 }
 
 void ScriptBase::Actor_Set_Invisible(int actorId, bool isInvisible) {
diff --git a/engines/bladerunner/script/script.h b/engines/bladerunner/script/script.h
index 7641b22..aca4507 100644
--- a/engines/bladerunner/script/script.h
+++ b/engines/bladerunner/script/script.h
@@ -117,8 +117,8 @@ protected:
 	void Actor_Clue_Acquire(int actorId, int clueId, bool unknownFlag, int fromActorId);
 	void Actor_Clue_Lose(int actorId, int clueId);
 	bool Actor_Clue_Query(int actorId, int clueId);
-	void Actor_Clues_Transfer_New_To_Mainframe(int actorId);
-	void Actor_Clues_Transfer_New_From_Mainframe(int actorId);
+	bool Actor_Clues_Transfer_New_To_Mainframe(int actorId);
+	bool Actor_Clues_Transfer_New_From_Mainframe(int actorId);
 	void Actor_Set_Invisible(int actorId, bool isInvisible);
 	void Actor_Set_Immunity_To_Obstacles(int actorId, bool isImmune);
 	void Item_Add_To_World(int itemId, int animationId, int setId, float x, float y, float z, signed int facing, int height, int width, bool isTargetable, bool isObstacle, bool isPoliceMazeEnemy, bool updateOnly);


Commit: 9207f7270b9be7b72f7b65f5df6957c56c3bdc31
    https://github.com/scummvm/scummvm/commit/9207f7270b9be7b72f7b65f5df6957c56c3bdc31
Author: Thanasis Antoniou (a.antoniou79 at gmail.com)
Date: 2019-05-13T03:29:00+03:00

Commit Message:
BLADERUNNER: Hit and Run dispatch clue restored

Changed paths:
    engines/bladerunner/script/ai/mccoy.cpp
    engines/bladerunner/script/scene/ma01.cpp
    engines/bladerunner/script/scene/ps01.cpp


diff --git a/engines/bladerunner/script/ai/mccoy.cpp b/engines/bladerunner/script/ai/mccoy.cpp
index 145743f..f5c6342 100644
--- a/engines/bladerunner/script/ai/mccoy.cpp
+++ b/engines/bladerunner/script/ai/mccoy.cpp
@@ -127,17 +127,22 @@ void AIScriptMcCoy::CompletedMovementTrack() {
 
 void AIScriptMcCoy::ReceivedClue(int clueId, int fromActorId) {
 	switch (clueId) {
+	case kClueDispatchHitAndRun: // added case for cut content
+		// fall through
 	case kClueChopstickWrapper:
+		// fall through
 	case kClueSushiMenu:
 		Spinner_Set_Selectable_Destination_Flag(kSpinnerDestinationChinatown, true);
 		break;
 
 	case kClueDragonflyEarring:
+		// fall through
 	case kClueBombingSuspect:
 		Spinner_Set_Selectable_Destination_Flag(kSpinnerDestinationAnimoidRow, true);
 		break;
 
 	case kClueKingstonKitchenBox1:
+		// fall through
 	case kClueKingstonKitchenBox2:
 		if (Query_Difficulty_Level() == kGameDifficultyEasy) {
 			Spinner_Set_Selectable_Destination_Flag(kSpinnerDestinationAnimoidRow, true);
@@ -149,17 +154,24 @@ void AIScriptMcCoy::ReceivedClue(int clueId, int fromActorId) {
 		break;
 
 	case kClueHysteriaToken:
+		// fall through
 	case kClueCarRegistration1:
+		// fall through
 	case kClueCarRegistration2:
+		// fall through
 	case kClueCarRegistration3:
+		// fall through
 	case kClueLichenDogWrapper:
 		Spinner_Set_Selectable_Destination_Flag(kSpinnerDestinationHysteriaHall, true);
 		Spinner_Set_Selectable_Destination_Flag(kSpinnerDestinationNightclubRow, true);
 		break;
 
 	case kClueWeaponsCache:
+		// fall through
 	case kClueWeaponsOrderForm:
+		// fall through
 	case kClueShippingForm:
+		// fall through
 	case kCluePoliceIssueWeapons:
 		Global_Variable_Increment(kVariableCorruptedGuzzaEvidence, 1);
 		break;
@@ -169,20 +181,27 @@ void AIScriptMcCoy::ReceivedClue(int clueId, int fromActorId) {
 		break;
 
 	case kClueHomelessManKid:
+		// fall through
 	case kClueOriginalRequisitionForm:
 		Global_Variable_Increment(kVariableCorruptedGuzzaEvidence, 3);
 		break;
 
 	case kClueScaryChair:
+		// fall through
 	case kClueIzosStashRaided:
 		Global_Variable_Increment(kVariableCorruptedGuzzaEvidence, 2);
 		break;
 
 	case kClueDNATyrell:
+		// fall through
 	case kClueDNASebastian:
+		// fall through
 	case kClueDNAChew:
+		// fall through
 	case kClueDNAMoraji:
+		// fall through
 	case kClueDNALutherLance:
+		// fall through
 	case kClueDNAMarcus:
 		Global_Variable_Increment(kVariableDNAEvidence, 1);
 		break;
@@ -196,10 +215,15 @@ void AIScriptMcCoy::ReceivedClue(int clueId, int fromActorId) {
 		Actor_Voice_Over(3320, kActorVoiceOver);
 		switch (clueId) {
 		case kClueWeaponsCache:
+			// fall through
 		case kClueWeaponsOrderForm:
+			// fall through
 		case kClueGuzzasCash:
+			// fall through
 		case kCluePoliceIssueWeapons:
+			// fall through
 		case kClueIzosStashRaided:
+			// fall through
 		case kClueOriginalRequisitionForm:
 			Actor_Voice_Over(3340, kActorVoiceOver);
 			Actor_Voice_Over(3350, kActorVoiceOver);
diff --git a/engines/bladerunner/script/scene/ma01.cpp b/engines/bladerunner/script/scene/ma01.cpp
index 9b4e8d2..d21ac5d 100644
--- a/engines/bladerunner/script/scene/ma01.cpp
+++ b/engines/bladerunner/script/scene/ma01.cpp
@@ -269,12 +269,41 @@ void SceneScriptMA01::ActorChangedGoal(int actorId, int newGoal, int oldGoal, bo
 }
 
 void SceneScriptMA01::PlayerWalkedIn() {
+	if (_vm->_cutContent) {
+		if (!Game_Flag_Query(kFlagCT01Visited) && !Actor_Clue_Query(kActorMcCoy, kClueDispatchHitAndRun)) {
+			Actor_Clue_Acquire(kActorMcCoy, kClueDispatchHitAndRun, false, kActorDispatcher);
+			ADQ_Add(kActorDispatcher, 80, kAnimationModeTalk);
+			if (Game_Flag_Query(kFlagRC01PoliceDone)) {
+				ADQ_Add(kActorOfficerLeary, 340, kAnimationModeTalk);  // sector 3 - go ahead
+			} else {
+				ADQ_Add(kActorOfficerGrayford, 360, kAnimationModeTalk);  // sector 3 - go ahead
+			}
+			ADQ_Add(kActorDispatcher, 90, kAnimationModeTalk);
+			ADQ_Add(kActorDispatcher, 100, kAnimationModeTalk);
+			ADQ_Add(kActorDispatcher, 110, kAnimationModeTalk);
+			if (Game_Flag_Query(kFlagRC01PoliceDone)) {
+				ADQ_Add(kActorOfficerLeary, 350, kAnimationModeTalk);  // sector 3 - responding code 3
+			} else {
+				ADQ_Add(kActorOfficerGrayford, 370, kAnimationModeTalk);  // sector 3 - responding code 3
+			}
+			ADQ_Add_Pause(1000);
+			ADQ_Add(kActorDispatcher, 120, kAnimationModeTalk);
+			ADQ_Add(kActorDispatcher, 130, kAnimationModeTalk);
+			ADQ_Add(kActorDispatcher, 140, kAnimationModeTalk);
+			ADQ_Add(kActorDispatcher, 150, kAnimationModeTalk);
+		}
+	}
 }
 
 void SceneScriptMA01::PlayerWalkedOut() {
 	Actor_Set_Invisible(kActorMcCoy, false);
 	Ambient_Sounds_Remove_All_Non_Looping_Sounds(true);
 	Ambient_Sounds_Remove_All_Looping_Sounds(1);
+
+	if (_vm->_cutContent) {
+		ADQ_Flush(); // for dispatcher queue cleanup
+	}
+
 	if (!Game_Flag_Query(kFlagMA01toMA06)) {
 		if (Global_Variable_Query(kVariableChapter) == 1) {
 			Outtake_Play(kOuttakeTowards2, true, -1);
diff --git a/engines/bladerunner/script/scene/ps01.cpp b/engines/bladerunner/script/scene/ps01.cpp
index bffcd0e..abe4a07 100644
--- a/engines/bladerunner/script/scene/ps01.cpp
+++ b/engines/bladerunner/script/scene/ps01.cpp
@@ -285,6 +285,30 @@ void SceneScriptPS01::PlayerWalkedIn() {
 		Actor_Set_At_XYZ(kActorMcCoy, 1920.0f, 16581.0f, -2653.0f, 150);
 		Game_Flag_Reset(kFlagPS02toPS01);
 	}
+	if (_vm->_cutContent) {
+		if (!Game_Flag_Query(kFlagCT01Visited) && !Actor_Clue_Query(kActorMcCoy, kClueDispatchHitAndRun)) {
+			Actor_Clue_Acquire(kActorMcCoy, kClueDispatchHitAndRun, false, kActorDispatcher);
+			ADQ_Add(kActorDispatcher, 80, kAnimationModeTalk);
+			if (Game_Flag_Query(kFlagRC01PoliceDone)) {
+				ADQ_Add(kActorOfficerLeary, 340, kAnimationModeTalk);  // sector 3 - go ahead
+			} else {
+				ADQ_Add(kActorOfficerGrayford, 360, kAnimationModeTalk);  // sector 3 - go ahead
+			}
+			ADQ_Add(kActorDispatcher, 90, kAnimationModeTalk);
+			ADQ_Add(kActorDispatcher, 100, kAnimationModeTalk);
+			ADQ_Add(kActorDispatcher, 110, kAnimationModeTalk);
+			if (Game_Flag_Query(kFlagRC01PoliceDone)) {
+				ADQ_Add(kActorOfficerLeary, 350, kAnimationModeTalk);  // sector 3 - responding code 3
+			} else {
+				ADQ_Add(kActorOfficerGrayford, 370, kAnimationModeTalk);  // sector 3 - responding code 3
+			}
+			ADQ_Add_Pause(1000);
+			ADQ_Add(kActorDispatcher, 120, kAnimationModeTalk);
+			ADQ_Add(kActorDispatcher, 130, kAnimationModeTalk);
+			ADQ_Add(kActorDispatcher, 140, kAnimationModeTalk);
+			ADQ_Add(kActorDispatcher, 150, kAnimationModeTalk);
+		}
+	}
 	//return false;
 }
 
@@ -293,6 +317,10 @@ void SceneScriptPS01::PlayerWalkedOut() {
 	Ambient_Sounds_Remove_All_Non_Looping_Sounds(true);
 	Ambient_Sounds_Remove_All_Looping_Sounds(1);
 
+	if (_vm->_cutContent) {
+		ADQ_Flush(); // for dispatcher queue cleanup
+	}
+
 	if (!Game_Flag_Query(kflagPS01toPS02)) {
 		if (Global_Variable_Query(kVariableChapter) == 1) {
 			Outtake_Play(kOuttakeTowards3, true, -1);


Commit: 7f6b9750d7c77afa469aac82f75bb46bf75ddf3e
    https://github.com/scummvm/scummvm/commit/7f6b9750d7c77afa469aac82f75bb46bf75ddf3e
Author: Thanasis Antoniou (a.antoniou79 at gmail.com)
Date: 2019-05-13T03:29:00+03:00

Commit Message:
BLADERUNNER: Howie restored content

Howie will now be in Chinatown in Acts 2 and 3, but won't always be in the diner

This gives him more probability to discover the homeless body if in dumpster and also enables some extra dialogue

Changed paths:
    engines/bladerunner/game_constants.h
    engines/bladerunner/script/ai/howie_lee.cpp
    engines/bladerunner/script/scene/ct01.cpp
    engines/bladerunner/script/scene/ct12.cpp
    engines/bladerunner/script/scene/ma02.cpp
    engines/bladerunner/script/scene/ma04.cpp


diff --git a/engines/bladerunner/game_constants.h b/engines/bladerunner/game_constants.h
index e412adf..a88693b 100644
--- a/engines/bladerunner/game_constants.h
+++ b/engines/bladerunner/game_constants.h
@@ -143,7 +143,7 @@ enum Clues {
 	kClueLicensePlate = 37,
 	kClueLicensePlateMatch = 38,
 	kClueLabPaintTransfer = 39,
-	kClueDispatchHitAndRun = 40, // is never acquired
+	kClueDispatchHitAndRun = 40, // is now acquired in restored Cut Content
 	kClueInceptShotRoy = 41,
 	kClueInceptShotsLeon = 42,
 	kCluePhoneCallGuzza = 43,
@@ -446,7 +446,7 @@ enum Flags {
 	kFlagRC02Left = 4,
 	// 5 is never used
 	kFlagRC02RunciterInterview = 6,
-	// 7 is never used
+	kFlagCT01TalkToHowieAboutDeadZuben = 7, // Re-purposed. Original: 7 is never used
 	kFlagRC01toRC02 = 8,
 	kFlagRC02toRC01 = 9,
 	kFlagDR01toDR04 = 10,
@@ -469,7 +469,7 @@ enum Flags {
 	kFlagCT01Evidence1Linked = 27,
 	kFlagCT01Evidence2Linked = 28,
 	kFlagCT01ZubenLeft = 29,
-	kFlagNotUsed30 = 30,  // is never set
+	kFlagCT01TalkToHowieAfterZubenMissing = 30,  // New, it is now set/unset to restore cut content there. Original: is never set
 	kFlagCT01ZubenGone = 31,
 	kFlagCT01GordoTalk = 32,
 	kFlagMA02toMA06 = 33,
@@ -2247,6 +2247,18 @@ enum GoalLuther {
 	kGoalLutherGone = 599
 };
 
+enum GoalHowieLee {
+	kGoalHowieLeeDefault              =   0,
+	kGoalHowieLeeMovesInDiner01       =   1,
+	kGoalHowieLeeMovesInDiner02       =   2,
+	kGoalHowieLeeMovesInDiner03       =   3,
+	kGoalHowieLeeGoesToCT04GarbageBin =   4,
+	kGoalHowieLeeGoesToFreeSlotH      =   5,
+	kGoalHowieLeeMovesInDiner06       =   6, // Unused goal?
+	kGoalHowieLeeStopMoving           =  50,
+	kGoalHowieLeeGoesToFreeSlotC      = 100
+};
+
 enum GoalTransient {
 	kGoalTransientDefault = 0,
 	kGoalTransientCT04Leave = 2
diff --git a/engines/bladerunner/script/ai/howie_lee.cpp b/engines/bladerunner/script/ai/howie_lee.cpp
index 3675fc1..8701230 100644
--- a/engines/bladerunner/script/ai/howie_lee.cpp
+++ b/engines/bladerunner/script/ai/howie_lee.cpp
@@ -36,47 +36,79 @@ void AIScriptHowieLee::Initialize() {
 	var_45DFB8 = false;
 
 	Actor_Put_In_Set(kActorHowieLee, kSetCT01_CT12);
-	Actor_Set_At_Waypoint(kActorHowieLee, 67, 605);
-	Actor_Set_Goal_Number(kActorHowieLee, 0);
+	Actor_Set_At_Waypoint(kActorHowieLee, 67, 605); // in kSetCT01_CT12
+	Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault);
 }
 
 bool AIScriptHowieLee::Update() {
-	if (Actor_Query_Goal_Number(kActorHowieLee) < 100
-	 && Global_Variable_Query(kVariableChapter) == 2
-	) {
-		Actor_Set_Goal_Number(kActorHowieLee, 100);
-	}
 
-	if (Global_Variable_Query(kVariableChapter) > 1) {
-		return true;
+	if (_vm->_cutContent) {
+		// keep Howie in Acts 2 and 3
+		// Howie in Acts 2 and 3 will have a routine with existing waypoints/goals,
+		// so no need to add new goals (> 100) for those Acts
+		if (Actor_Query_Goal_Number(kActorHowieLee) < 100
+		 && Global_Variable_Query(kVariableChapter) == 4
+		) {
+			Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeGoesToFreeSlotC);
+		}
+
+		if (Global_Variable_Query(kVariableChapter) > 3) {
+			return true;
+		}
+	} else {
+		if (Actor_Query_Goal_Number(kActorHowieLee) < 100
+		 && Global_Variable_Query(kVariableChapter) == 2
+		) {
+			Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeGoesToFreeSlotC);
+		}
+
+		if (Global_Variable_Query(kVariableChapter) > 1) {
+			return true;
+		}
 	}
 
-	if (Actor_Query_Goal_Number(kActorHowieLee) == 0) {
-		Actor_Set_Goal_Number(kActorHowieLee, 1);
+	if (Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeDefault) {
+		Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeMovesInDiner01);
 	}
 
+	// In the original code this is used (in Act 1) to get Howie back to the Diner
+	// from goals kGoalHowieLeeGoesToCT04GarbageBin or kGoalHowieLeeGoesToFreeSlotH
+	// It might cause a blink-in issue, depending when update() will be called for Howie
+	// This is kept as a backup while similar code is placed in the CT01 and CT02 scenes InitializeScene()
+	// that will handle Howie appearing there immediately (fix for blink in)
 	if ( Game_Flag_Query(kFlagMcCoyInChinaTown)
 	 && !Actor_Query_In_Set(kActorHowieLee, kSetCT01_CT12)
+	 && Global_Variable_Query(kVariableChapter) == 1 // added condition - in cut content don't force Howie to return to CT01 here after Act 1
 	) {
 		AI_Movement_Track_Flush(kActorHowieLee);
-		AI_Movement_Track_Append(kActorHowieLee, 67, 0);
-		Actor_Set_Goal_Number(kActorHowieLee, 0);
+		AI_Movement_Track_Append(kActorHowieLee, 67, 0); // in kSetCT01_CT12
+		Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault);
 	}
 
-	if ( Actor_Query_Goal_Number(kActorHowieLee) == 1
-	 &&  Game_Flag_Query(kFlagCT01BoughtHowieLeeFood)
-	 && !Game_Flag_Query(kFlagMcCoyInChinaTown)
 #if BLADERUNNER_ORIGINAL_BUGS
+	if ( Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeMovesInDiner01
+	 &&  Game_Flag_Query(kFlagCT01BoughtHowieLeeFood)
+	 && !Game_Flag_Query(kFlagMcCoyInChinaTown) ) {
+		Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeGoesToCT04GarbageBin);
+		return true;
+	}
 #else
 	// Prevents possibility of Howie Lee from blinking in/out of existence
-	// when the flyout loop is playing
-	// and when McCoy enters and exits the Spinner with the spinner doors animation restored
-	 &&  Player_Query_Current_Scene() != kSceneCT01
-#endif // BLADERUNNER_ORIGINAL_BUGS
+	// when the fly-out loop is playing and/or when McCoy enters and exits the Spinner with the spinner doors animation restored
+	if ((Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeMovesInDiner01
+	     || Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeMovesInDiner02
+	     || Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeMovesInDiner03
+	     || Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeMovesInDiner06
+	     || Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeDefault)
+	     &&  Game_Flag_Query(kFlagCT01BoughtHowieLeeFood)
+	     && !Game_Flag_Query(kFlagMcCoyInChinaTown)
+	     &&  Player_Query_Current_Scene() != kSceneCT01
+	     &&  Player_Query_Current_Scene() != kSceneCT12
 	) {
-		Actor_Set_Goal_Number(kActorHowieLee, 4);
+		Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeGoesToCT04GarbageBin);
 		return true;
 	}
+#endif // BLADERUNNER_ORIGINAL_BUGS
 
 	return false;
 }
@@ -86,36 +118,73 @@ void AIScriptHowieLee::TimerExpired(int timer) {
 }
 
 void AIScriptHowieLee::CompletedMovementTrack() {
-	if (Actor_Query_Goal_Number(kActorHowieLee) == 1) {
-		Actor_Set_Goal_Number(kActorHowieLee, 2);
+	if (Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeMovesInDiner01) {
+		Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeMovesInDiner02);
 		return; // true;
 	}
 
-	if (Actor_Query_Goal_Number(kActorHowieLee) == 2) {
-		Actor_Set_Goal_Number(kActorHowieLee, 3);
+	if (Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeMovesInDiner02) {
+		Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeMovesInDiner03);
 		return; // true;
 	}
 
-	if (Actor_Query_Goal_Number(kActorHowieLee) == 3) {
-		Actor_Set_Goal_Number(kActorHowieLee, 0);
-		return; // true;
+	if (Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeMovesInDiner03) {
+		if (_vm->_cutContent) {
+			//
+			// *after Act 1* Howie will be going to the Garbage Bin "regularly"
+			// if McCoy is not in scenes CT01 and CT12 (where Howie is visible working at the diner)
+			// otherwise he'll do the short cycle (goals 0, 1, 2, 3)
+			// This will result in Howie not being at the Diner sometimes even when McCoy is in Chinatown area
+			// This won't happen in Act 1, since he is most useful during that Act
+			if (Global_Variable_Query(kVariableChapter) > 1
+			    && Player_Query_Current_Scene() != kSceneCT01
+			    && Player_Query_Current_Scene() != kSceneCT12
+			    && Player_Query_Current_Scene() != kSceneCT04
+			) {
+				Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeGoesToCT04GarbageBin);
+				return; // true;
+			} else {
+				Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault);
+				return; // true;
+			}
+		} else {
+			Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault);
+			return; // true;
+		}
 	}
 
-	// Bug/intentional in original game?
-	if (Actor_Query_Goal_Number(kActorHowieLee) == 3) {
-		Actor_Set_Goal_Number(kActorHowieLee, 4);
-		return; // true;
+#if BLADERUNNER_ORIGINAL_BUGS
+	if (Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeMovesInDiner03) {
+			Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeGoesToCT04GarbageBin);
+			return; // true;
 	}
+#endif // BLADERUNNER_ORIGINAL_BUGS
 
-	if (Actor_Query_Goal_Number(kActorHowieLee) == 4) {
-		Actor_Set_Goal_Number(kActorHowieLee, 5);
+	if (Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeGoesToCT04GarbageBin) {
+		Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeGoesToFreeSlotH);
 		return; // true;
 	}
 
-	if (Actor_Query_Goal_Number(kActorHowieLee) == 5) {
-		Actor_Set_Goal_Number(kActorHowieLee, 0);
+	if (Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeGoesToFreeSlotH) {
+#if BLADERUNNER_ORIGINAL_BUGS
+		Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault);
 		return; // true;
+#else
+		// don't blink-in and also only return to diner routine if McCoy is actually in Chinatown
+		if (Game_Flag_Query(kFlagMcCoyInChinaTown)
+		    && Player_Query_Current_Scene() != kSceneCT01
+		    && Player_Query_Current_Scene() != kSceneCT12
+		) {
+			Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault);
+			return; // true;
+		} else {
+			// return to "garbage bin" goal instead of blinking in
+			Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeGoesToCT04GarbageBin);
+			return; // true;
+		}
+#endif // BLADERUNNER_ORIGINAL_BUGS
 	}
+
 	// return false;
 }
 
@@ -128,7 +197,7 @@ void AIScriptHowieLee::ClickedByPlayer() {
 }
 
 void AIScriptHowieLee::EnteredScene(int sceneId) {
-	if (Actor_Query_Goal_Number(kActorHowieLee) == 4
+	if (Actor_Query_Goal_Number(kActorHowieLee) == kGoalHowieLeeGoesToCT04GarbageBin
 	 && Actor_Query_In_Set(kActorHowieLee, kSetCT03_CT04)
 	) {
 		if ( Game_Flag_Query(kFlagCT04HomelessKilledByMcCoy)
@@ -139,7 +208,7 @@ void AIScriptHowieLee::EnteredScene(int sceneId) {
 			// return false;
 		}
 
-		if (!Game_Flag_Query(kFlagCT04HomelessKilledByMcCoy)
+		if (Game_Flag_Query(kFlagCT04HomelessKilledByMcCoy)
 		 &&  Game_Flag_Query(kFlagCT04HomelessBodyInDumpster)
 		 && !Game_Flag_Query(kFlagCT04HomelessBodyFound)
 		 &&  Random_Query(1, 10) == 1
@@ -152,6 +221,17 @@ void AIScriptHowieLee::EnteredScene(int sceneId) {
 }
 
 void AIScriptHowieLee::OtherAgentEnteredThisScene(int otherActorId) {
+#if BLADERUNNER_ORIGINAL_BUGS
+#else
+	// prevent player from actually meeting hovering Howie half-body in kSetCT03_CT04
+	if (otherActorId == kActorMcCoy
+	    && Actor_Query_In_Set(kActorHowieLee, kSetCT03_CT04)
+	) {
+		AI_Movement_Track_Flush(kActorHowieLee);
+		AI_Movement_Track_Append(kActorHowieLee, 67, 0); // in kSetCT01_CT12
+		Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault);
+	}
+#endif // BLADERUNNER_ORIGINAL_BUGS
 	// return false;
 }
 
@@ -181,55 +261,55 @@ int AIScriptHowieLee::GetFriendlinessModifierIfGetsClue(int otherActorId, int cl
 
 bool AIScriptHowieLee::GoalChanged(int currentGoalNumber, int newGoalNumber) {
 	switch (newGoalNumber) {
-	case 1:
+	case kGoalHowieLeeMovesInDiner01:
 		AI_Movement_Track_Flush(kActorHowieLee);
 		if (Random_Query(1, 2) == 1) {
-			AI_Movement_Track_Append_With_Facing(kActorHowieLee, 67, Random_Query(3, 10), 720);
+			AI_Movement_Track_Append_With_Facing(kActorHowieLee, 67, Random_Query(3, 10), 720); // in kSetCT01_CT12
 		} else {
-			AI_Movement_Track_Append_With_Facing(kActorHowieLee, 69, Random_Query(3, 10), 640);
+			AI_Movement_Track_Append_With_Facing(kActorHowieLee, 69, Random_Query(3, 10), 640); // in kSetCT01_CT12
 		}
 		AI_Movement_Track_Repeat(kActorHowieLee);
 		return true;
-	case 2:
+	case kGoalHowieLeeMovesInDiner02:
 		AI_Movement_Track_Flush(kActorHowieLee);
 		if (Random_Query(1, 2) == 1) {
-			AI_Movement_Track_Append_With_Facing(kActorHowieLee, 68, Random_Query(3, 10), 641);
+			AI_Movement_Track_Append_With_Facing(kActorHowieLee, 68, Random_Query(3, 10), 641); // in kSetCT01_CT12
 		} else {
-			AI_Movement_Track_Append_With_Facing(kActorHowieLee, 67, Random_Query(3, 10), 720);
+			AI_Movement_Track_Append_With_Facing(kActorHowieLee, 67, Random_Query(3, 10), 720); // in kSetCT01_CT12
 		}
 		AI_Movement_Track_Repeat(kActorHowieLee);
 		return true;
-	case 3:
+	case kGoalHowieLeeMovesInDiner03:
 		AI_Movement_Track_Flush(kActorHowieLee);
 		if (Random_Query(1, 2) == 1) {
-			AI_Movement_Track_Append_With_Facing(kActorHowieLee, 69, Random_Query(3, 10), 640);
+			AI_Movement_Track_Append_With_Facing(kActorHowieLee, 69, Random_Query(3, 10), 640); // in kSetCT01_CT12
 		} else {
-			AI_Movement_Track_Append_With_Facing(kActorHowieLee, 68, Random_Query(3, 10), 641);
+			AI_Movement_Track_Append_With_Facing(kActorHowieLee, 68, Random_Query(3, 10), 641); // in kSetCT01_CT12
 		}
 		AI_Movement_Track_Repeat(kActorHowieLee);
 		return true;
-	case 4:
+	case kGoalHowieLeeGoesToCT04GarbageBin:
 		AI_Movement_Track_Flush(kActorHowieLee);
-		AI_Movement_Track_Append(kActorHowieLee, 66, 30);
+		AI_Movement_Track_Append(kActorHowieLee, 66, 30);  // in kSetCT03_CT04
 		AI_Movement_Track_Repeat(kActorHowieLee);
 		return true;
-	case 5:
+	case kGoalHowieLeeGoesToFreeSlotH:
 		AI_Movement_Track_Flush(kActorHowieLee);
-		AI_Movement_Track_Append(kActorHowieLee, 40, 60);
+		AI_Movement_Track_Append(kActorHowieLee, 40, 60);  // in kSetFreeSlotH
 		AI_Movement_Track_Repeat(kActorHowieLee);
 		return true;
-	case 6:
+	case kGoalHowieLeeMovesInDiner06: // Unused goal?
 		AI_Movement_Track_Flush(kActorHowieLee);
-		AI_Movement_Track_Append(kActorHowieLee, 67, 90);
+		AI_Movement_Track_Append(kActorHowieLee, 67, 90); // in kSetCT01_CT12
 		AI_Movement_Track_Repeat(kActorHowieLee);
 		return true;
-	case 50:
+	case kGoalHowieLeeStopMoving:
 		AI_Movement_Track_Flush(kActorHowieLee);
 		return false;
-	case 100:
+	case kGoalHowieLeeGoesToFreeSlotC:
 		AI_Movement_Track_Flush(kActorHowieLee);
 		Actor_Put_In_Set(kActorHowieLee, kSetFreeSlotC);
-		Actor_Set_At_Waypoint(kActorHowieLee, 35, 0);
+		Actor_Set_At_Waypoint(kActorHowieLee, 35, 0); // in kSetFreeSlotC
 		return false;
 	}
 	return false;
diff --git a/engines/bladerunner/script/scene/ct01.cpp b/engines/bladerunner/script/scene/ct01.cpp
index 138fada..3eb06e2 100644
--- a/engines/bladerunner/script/scene/ct01.cpp
+++ b/engines/bladerunner/script/scene/ct01.cpp
@@ -72,7 +72,7 @@ void SceneScriptCT01::InitializeScene() {
 			//         so the loop will be prevented from playing when he is there.
 			if ( Global_Variable_Query(kVariableChapter) < 4
 			    && Actor_Query_Which_Set_In(kActorGordo) != kSetCT01_CT12
-			    && Random_Query(1, 3) == 1
+			    && Random_Query(1, 2) == 1
 			){
 				// enhancement: don't always play
 				Scene_Loop_Start_Special(kSceneLoopModeLoseControl, kCT01LoopInshot, false);
@@ -115,6 +115,17 @@ void SceneScriptCT01::InitializeScene() {
 	Ambient_Sounds_Add_Sound(kSfxTHNDER3, 20, 40, 33, 50, -100, 100, -101, -101, 0, 0);
 	Ambient_Sounds_Add_Sound(kSfxTHNDER4, 20, 40, 33, 50, -100, 100, -101, -101, 0, 0);
 
+#if BLADERUNNER_ORIGINAL_BUGS
+#else
+	if (!Actor_Query_In_Set(kActorHowieLee, kSetCT01_CT12)
+	    && Global_Variable_Query(kVariableChapter) == 1
+	) {
+		AI_Movement_Track_Flush(kActorHowieLee);
+		AI_Movement_Track_Append(kActorHowieLee, 67, 0); // in kSetCT01_CT12
+		Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault);
+	}
+#endif // BLADERUNNER_ORIGINAL_BUGS
+
 	if (Game_Flag_Query(kFlagSpinnerAtCT01)) {
 		Scene_Loop_Set_Default(kCT01LoopMainLoop);
 	} else {
@@ -146,8 +157,8 @@ bool SceneScriptCT01::ClickedOn3DObject(const char *objectName, bool a2) {
 //	if ("ASIANSITTINGANDEATI" == objectName) { //bug?
 	if (Object_Query_Click("ASIANSITTINGANDEATI", objectName)) {
 		Actor_Face_Object(kActorMcCoy, "ASIANSITTINGANDEATI", true);
-		Actor_Says(kActorMcCoy, 365, 13);
-		Actor_Says(kActorHowieLee, 160, 13);
+		Actor_Says(kActorMcCoy, 365, 13);    // Excuse me, pal!
+		Actor_Says(kActorHowieLee, 160, 13); // I take care of you soon, McCoy. Real busy tonight.
 		return true;
 	}
 	return false;
@@ -155,7 +166,7 @@ bool SceneScriptCT01::ClickedOn3DObject(const char *objectName, bool a2) {
 
 bool SceneScriptCT01::ClickedOnActor(int actorId) {
 	if (actorId == kActorHowieLee) {
-		Actor_Set_Goal_Number(kActorHowieLee, 50);
+		Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeStopMoving);
 		if (!Loop_Actor_Walk_To_XYZ(kActorMcCoy, -335.23f, -6.5f, 578.97f, 12, true, false, false)) {
 			Actor_Face_Actor(kActorMcCoy, kActorHowieLee, true);
 			Actor_Face_Actor(kActorHowieLee, kActorMcCoy, true);
@@ -163,30 +174,60 @@ bool SceneScriptCT01::ClickedOnActor(int actorId) {
 				Actor_Says(kActorMcCoy, 260, 18);
 				Actor_Says(kActorHowieLee, 0, 14);
 				Game_Flag_Set(kFlagCT01McCoyTalkedToHowieLee);
-				Actor_Set_Goal_Number(kActorHowieLee, 0);
-				return true;
-			}
-
-			if (!Game_Flag_Query(kFlagNotUsed30)
-			 && Actor_Query_Friendliness_To_Other(kActorHowieLee, kActorMcCoy) >= 40
-			) {
-				dialogueWithHowieLee();
-				Actor_Set_Goal_Number(kActorHowieLee, 0);
+				Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault);
 				return true;
 			}
 
-			if (Game_Flag_Query(kFlagCT01ZubenGone)) {
-				Actor_Says(kActorMcCoy, 330, 17);
-				Actor_Says(kActorHowieLee, 130, 13);
-				Actor_Says(kActorHowieLee, 140, 14);
-			} else if (Actor_Query_Friendliness_To_Other(kActorHowieLee, kActorMcCoy) < 50) {
-				Actor_Says(kActorMcCoy, 330, 13);
-				Actor_Says(kActorHowieLee, 160, 15);
+			if (_vm->_cutContent) {
+				// Howie begins with friendliness of 60
+				if (!Game_Flag_Query(kFlagCT01TalkToHowieAfterZubenMissing)) {
+					dialogueWithHowieLee();
+				} else {
+					if (Game_Flag_Query(kFlagCT01ZubenGone) && !Game_Flag_Query(kFlagCT01TalkToHowieAboutDeadZuben)) {
+						Game_Flag_Set(kFlagCT01TalkToHowieAboutDeadZuben);
+						Actor_Says(kActorMcCoy, 330, 17);
+						Actor_Says(kActorHowieLee, 130, 13);
+						Actor_Says(kActorHowieLee, 140, 14);
+						if (_vm->_cutContent) {
+							Actor_Says(kActorMcCoy, 315, 16);
+						}
+						Actor_Modify_Friendliness_To_Other(kActorHowieLee, kActorMcCoy, -10);
+					} else if (Actor_Query_Friendliness_To_Other(kActorHowieLee, kActorMcCoy) < 50) {
+						Actor_Says(kActorMcCoy, 310, 11);    // keeping out of trouble...?
+						Actor_Says(kActorHowieLee, 190, 13); // I look like I got time for chit-er chat-er?
+					} else if (Actor_Query_Friendliness_To_Other(kActorHowieLee, kActorMcCoy) <= 55) {
+						Actor_Says(kActorMcCoy, 330, 13);
+						Actor_Says(kActorHowieLee, 160, 15);  // real busy tonight
+					} else { // friendly > 55
+						Actor_Says(kActorMcCoy, 310, 11);
+						Actor_Says(kActorHowieLee, 10, 16);
+					}
+				}
 			} else {
-				Actor_Says(kActorMcCoy, 310, 11);
-				Actor_Says(kActorHowieLee, 10, 16);
+				// Original: Howie begins with friendliness of 60, max can be 65, lowest is 52
+				if (!Game_Flag_Query(kFlagCT01TalkToHowieAfterZubenMissing)
+				 && Actor_Query_Friendliness_To_Other(kActorHowieLee, kActorMcCoy) >= 40
+				) {
+					dialogueWithHowieLee();
+					Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault);
+					return true;
+				}
+				// In the original Howie's friendliness to McCoy can never go below 52
+				// and the flag kFlagCT01TalkToHowieAfterZubenMissing is never set
+				// so the code below was un-triggered
+				if (Game_Flag_Query(kFlagCT01ZubenGone)) {
+					Actor_Says(kActorMcCoy, 330, 17);
+					Actor_Says(kActorHowieLee, 130, 13);
+					Actor_Says(kActorHowieLee, 140, 14);
+				} else if (Actor_Query_Friendliness_To_Other(kActorHowieLee, kActorMcCoy) < 50) {
+					Actor_Says(kActorMcCoy, 330, 13);
+					Actor_Says(kActorHowieLee, 160, 15);
+				} else { // friendly >= 50
+					Actor_Says(kActorMcCoy, 310, 11);
+					Actor_Says(kActorHowieLee, 10, 16);
+				}
 			}
-			Actor_Set_Goal_Number(kActorHowieLee, 0);
+			Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault);
 			return true;
 		}
 	}
@@ -538,8 +579,9 @@ void SceneScriptCT01::dialogueWithHowieLee() {
 		DM_Add_To_List_Never_Repeat_Once_Selected(80, 3, 4, 8); // EMPLOYEE
 	}
 
-	if (Actor_Clue_Query(kActorMcCoy, kClueCarColorAndMake)
-	 && Actor_Clue_Query(kActorMcCoy, kClueDispatchHitAndRun) // this clue is never obtained
+	if ((Actor_Clue_Query(kActorMcCoy, kClueCarColorAndMake)
+	    || (_vm->_cutContent && Actor_Clue_Query(kActorMcCoy, kClueLabPaintTransfer)))
+	    && Actor_Clue_Query(kActorMcCoy, kClueDispatchHitAndRun) // this clue is now acquired in restored Cut Content
 	) {
 		DM_Add_To_List_Never_Repeat_Once_Selected(90, 5, 4, 5); // HIT AND RUN
 	}
@@ -586,9 +628,14 @@ void SceneScriptCT01::dialogueWithHowieLee() {
 	case 60: // MORE RUNCITER CLUES
 		if (Actor_Clue_Query(kActorMcCoy, kClueSushiMenu)) {
 			Actor_Says(kActorMcCoy, 270, 11);
-			Actor_Says(kActorHowieLee, 40, 15);
+			Actor_Says(kActorHowieLee, 40, 15); // You do Howie a favor? Distribute...
+			// TODO Possible YES/NO option for McCoy? -> and friendliness adjustment accordingly
 		} else {
+#if BLADERUNNER_ORIGINAL_BUGS
 			Actor_Says(kActorMcCoy, 270, 11);
+#else
+			Actor_Says(kActorMcCoy, 280, 11);
+#endif // BLADERUNNER_ORIGINAL_BUGS
 			Actor_Says(kActorHowieLee, 30, 14);
 		}
 		Actor_Modify_Friendliness_To_Other(kActorHowieLee, kActorMcCoy, 5);
@@ -596,14 +643,17 @@ void SceneScriptCT01::dialogueWithHowieLee() {
 		break;
 
 	case 70: // SMALL TALK
-		Actor_Says(kActorMcCoy, 290, 13);
-		if (Actor_Query_Friendliness_To_Other(kActorHowieLee, kActorMcCoy) > 49
-		 && (Global_Variable_Query(kVariableChinyen) > 10
-		  || Query_Difficulty_Level() == kGameDifficultyEasy
-		 )
+		Actor_Says(kActorMcCoy, 290, 13); // what's real fresh tonight
+		if (((!_vm->_cutContent && Actor_Query_Friendliness_To_Other(kActorHowieLee, kActorMcCoy) > 49)
+		     || Actor_Query_Friendliness_To_Other(kActorHowieLee, kActorMcCoy) > 59)
+		    && (Global_Variable_Query(kVariableChinyen) > 10
+		     || Query_Difficulty_Level() == kGameDifficultyEasy)
 		) {
 			Actor_Says(kActorHowieLee, 50, kAnimationModeTalk);
 			Actor_Says(kActorHowieLee, 60, kAnimationModeTalk);
+			if (_vm->_cutContent) {
+				Actor_Says(kActorMcCoy, 320, 13);
+			}
 			Actor_Face_Actor(kActorHowieLee, kActorMcCoy, true);
 			Actor_Says(kActorHowieLee, 70, 16);
 			Actor_Says(kActorMcCoy, 325, 13);
@@ -612,7 +662,11 @@ void SceneScriptCT01::dialogueWithHowieLee() {
 			}
 			Game_Flag_Set(kFlagCT01BoughtHowieLeeFood);
 		} else {
-			Actor_Says(kActorHowieLee, 130, 15);
+			Actor_Says(kActorHowieLee, 130, 15); // nothing now
+			if (_vm->_cutContent) {
+				Actor_Says(kActorMcCoy, 8565, 14); // really?
+				Actor_Says(kActorHowieLee, 80, 16); // No, sir. Any luck...
+			}
 		}
 		break;
 
diff --git a/engines/bladerunner/script/scene/ct12.cpp b/engines/bladerunner/script/scene/ct12.cpp
index 3419766..88b59ca 100644
--- a/engines/bladerunner/script/scene/ct12.cpp
+++ b/engines/bladerunner/script/scene/ct12.cpp
@@ -70,6 +70,17 @@ void SceneScriptCT12::InitializeScene() {
 		Game_Flag_Set(kFlagCT12GaffSpinner);
 	}
 
+#if BLADERUNNER_ORIGINAL_BUGS
+#else
+	if (!Actor_Query_In_Set(kActorHowieLee, kSetCT01_CT12)
+	    && Global_Variable_Query(kVariableChapter) == 1
+	) {
+		AI_Movement_Track_Flush(kActorHowieLee);
+		AI_Movement_Track_Append(kActorHowieLee, 67, 0); // in kSetCT01_CT12
+		Actor_Set_Goal_Number(kActorHowieLee, kGoalHowieLeeDefault);
+	}
+#endif // BLADERUNNER_ORIGINAL_BUGS
+
 	if (Game_Flag_Query(kFlagCT01toCT12)
 	 && Game_Flag_Query(kFlagSpinnerAtCT01)
 	) {
diff --git a/engines/bladerunner/script/scene/ma02.cpp b/engines/bladerunner/script/scene/ma02.cpp
index f10fd59..af95d8a 100644
--- a/engines/bladerunner/script/scene/ma02.cpp
+++ b/engines/bladerunner/script/scene/ma02.cpp
@@ -71,7 +71,7 @@ void SceneScriptMA02::InitializeScene() {
 	 &&  Game_Flag_Query(kFlagMcCoyIsHelpingReplicants)
 	 && !Actor_Clue_Query(kActorMcCoy, kClueCrystalsCigarette)
 	) {
-		Overlay_Play("MA02OVER", 0, 1, 0, 0);
+		Overlay_Play("MA02OVER", 0, true, false, 0);
 	}
 }
 
diff --git a/engines/bladerunner/script/scene/ma04.cpp b/engines/bladerunner/script/scene/ma04.cpp
index fc84ad9..9bf36a6 100644
--- a/engines/bladerunner/script/scene/ma04.cpp
+++ b/engines/bladerunner/script/scene/ma04.cpp
@@ -257,7 +257,7 @@ void SceneScriptMA04::PlayerWalkedIn() {
 		Player_Gains_Control();
 	}
 	if (isPhoneMessageWaiting() || isPhoneRinging()) {
-		Overlay_Play("MA04OVER", 0, 1, 0, 0);
+		Overlay_Play("MA04OVER", 0, true, false, 0);
 	}
 	if (Game_Flag_Query(kFlagMA04McCoySleeping)) {
 		Loop_Actor_Walk_To_XYZ(kActorMcCoy, -7139.0f, 954.0f, 1746.0f, 0, true, false, false);
@@ -272,7 +272,7 @@ void SceneScriptMA04::PlayerWalkedIn() {
 			Sound_Play(kSfxVIDFONE1, 100, 0, 0, 50);
 			Loop_Actor_Walk_To_XYZ(kActorMcCoy, -7176.0f, 954.0f, 1806.0f, 0, false, false, false);
 			Actor_Face_Heading(kActorMcCoy, 256, true);
-			Actor_Says(kActorMcCoy, 2680, 0);
+			Actor_Says(kActorMcCoy, 2680, kAnimationModeIdle);
 			Sound_Play(kSfxSPNBEEP9, 100, 0, 0, 50);
 			Delay(500);
 			Actor_Says(kActorGuzza, 0, 3);
@@ -311,6 +311,11 @@ void SceneScriptMA04::PlayerWalkedIn() {
 		}
 		Loop_Actor_Walk_To_XYZ(kActorMcCoy, -7199.0f, 955.0f, 1675.0f, 0, true, false, false);
 		Game_Flag_Set(kFlagChapter1Ending);
+
+		if (_vm->_cutContent) {
+			Game_Flag_Set(kFlagCT01TalkToHowieAfterZubenMissing);
+		}
+
 		Async_Actor_Walk_To_XYZ(kActorMcCoy, -7204.0f, 956.17f, 1568.0f, 0, false);
 		Set_Enter(kSetMA05, kSceneMA05);
 	}





More information about the Scummvm-git-logs mailing list