[Scummvm-git-logs] scummvm master -> f057ac75ce86db465a75193a40358b3226bcf099

grechnik diamondaz at yandex.ru
Mon Sep 24 00:58:49 CEST 2018


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

Summary:
f057ac75ce LASTEXPRESS: more fixes in NPC logic


Commit: f057ac75ce86db465a75193a40358b3226bcf099
    https://github.com/scummvm/scummvm/commit/f057ac75ce86db465a75193a40358b3226bcf099
Author: Evgeny Grechnikov (diamondaz at yandex.ru)
Date: 2018-09-24T01:57:44+03:00

Commit Message:
LASTEXPRESS: more fixes in NPC logic

Changed paths:
    engines/lastexpress/entities/mahmud.cpp
    engines/lastexpress/entities/mertens.cpp
    engines/lastexpress/entities/milos.cpp
    engines/lastexpress/entities/mmeboutarel.cpp
    engines/lastexpress/entities/rebecca.cpp
    engines/lastexpress/entities/salko.cpp
    engines/lastexpress/entities/tatiana.cpp
    engines/lastexpress/entities/vassili.cpp
    engines/lastexpress/entities/verges.cpp
    engines/lastexpress/entities/vesna.cpp
    engines/lastexpress/entities/waiter2.cpp


diff --git a/engines/lastexpress/entities/mahmud.cpp b/engines/lastexpress/entities/mahmud.cpp
index 9f43c69..1468bce 100644
--- a/engines/lastexpress/entities/mahmud.cpp
+++ b/engines/lastexpress/entities/mahmud.cpp
@@ -664,15 +664,15 @@ IMPLEMENT_FUNCTION(14, Mahmud, chaptersHandler)
 			break;
 
 		case 5: {
-			CursorStyle cursor = kCursorHand;
-			CursorStyle cursor2 = kCursorHandKnock;
+			CursorStyle cursor = kCursorHandKnock;
+			CursorStyle cursor2 = kCursorHand;
 
 			if (getProgress().jacket == kJacketBlood
 			 || getEvent(kEventMahmudWrongDoor)
 			 || getEvent(kEventMahmudWrongDoorOriginalJacket)
 			 || getEvent(kEventMahmudWrongDoorDay)) {
-				cursor = kCursorNormal;
-				cursor2 = kCursorTalk;
+				cursor = kCursorTalk;
+				cursor2 = kCursorNormal;
 			}
 
 			getObjects()->update(kObjectCompartment4, kEntityMahmud, kObjectLocation1, cursor, cursor2);
@@ -825,7 +825,7 @@ IMPLEMENT_FUNCTION(19, Mahmud, chapter4)
 		getData()->location = kLocationInsideCompartment;
 		getData()->car = kCarGreenSleeping;
 		getData()->clothes = kClothesDefault;
-		getData()->inventoryItem = kItemNone;
+		getData()->inventoryItem = kItemNone; // not in the original game, but it does no harm, I suppose?
 
 		break;
 	}
diff --git a/engines/lastexpress/entities/mertens.cpp b/engines/lastexpress/entities/mertens.cpp
index 573a350..cb2311f 100644
--- a/engines/lastexpress/entities/mertens.cpp
+++ b/engines/lastexpress/entities/mertens.cpp
@@ -400,6 +400,10 @@ IMPLEMENT_FUNCTION_II(10, Mertens, updateEntity, CarIndex, EntityPosition)
 
 			if (params->param1 != 3 || (params->param2 != kPosition_8200 && params->param2 != kPosition_9510)) {
 				loadSceneFromPosition();
+				if (getEntities()->updateEntity(kEntityMertens, (CarIndex)params->param1, (EntityPosition)params->param2)) {
+					getData()->inventoryItem = kItemNone;
+					callbackAction();
+				}
 				break;
 			}
 
@@ -432,6 +436,10 @@ IMPLEMENT_FUNCTION_II(10, Mertens, updateEntity, CarIndex, EntityPosition)
 			}
 
 			loadSceneFromPosition();
+			if (getEntities()->updateEntity(kEntityMertens, (CarIndex)params->param1, (EntityPosition)params->param2)) {
+				getData()->inventoryItem = kItemNone;
+				callbackAction();
+			}
 			break;
 
 		case 4:
@@ -439,6 +447,10 @@ IMPLEMENT_FUNCTION_II(10, Mertens, updateEntity, CarIndex, EntityPosition)
 			ENTITY_PARAM(2, 4) = 0;
 
 			loadSceneFromPosition();
+			if (getEntities()->updateEntity(kEntityMertens, (CarIndex)params->param1, (EntityPosition)params->param2)) {
+				getData()->inventoryItem = kItemNone;
+				callbackAction();
+			}
 			break;
 
 		case 5:
@@ -501,7 +513,6 @@ IMPLEMENT_FUNCTION_I(12, Mertens, bonsoir, EntityIndex)
 				getSound()->playSound(kEntityMertens, "CON1112F");
 			} else {
 				switch (rnd(3)) {
-				default:
 				case 0:
 					getSound()->playSound(kEntityMertens, "CON1061");
 					break;
@@ -1964,6 +1975,7 @@ label_callback11:
 		case 27:
 			getAction()->playAnimation(kEventMertensBloodJacket);
 			getLogic()->gameOver(kSavegameTypeIndex, 1, kSceneGameOverBloodJacket, true);
+			// BUG: for [case 13] the original game continues executing code here
 			break;
 
 		case 14:
@@ -3040,10 +3052,10 @@ IMPLEMENT_FUNCTION(42, Mertens, function42)
 					}
 
 					if (params->param4 >= getState()->time)
-						break;
+						goto label_callback_8;
 				}
 
-				ENTITY_PARAM(0, 4) = kTimeInvalid;
+				params->param4 = kTimeInvalid;
 				getData()->inventoryItem = kItemNone;
 
 				setCallback(8);
@@ -3240,7 +3252,7 @@ label_callback_5_6:
 			goto label_callback_2_4;
 
 		case 3:
-			getAction()->playAnimation(getProgress().jacket == kJacketOriginal ? kEventMertensLastCarOriginalJacket : kEventMertensLastCar);
+			getAction()->playAnimation(getProgress().jacket == kJacketGreen ? kEventMertensLastCar : kEventMertensLastCarOriginalJacket);
 			getEntities()->drawSequenceRight(kEntityMertens, "601A");
 			getScenes()->loadSceneFromPosition(kCarGreenSleeping, 6);
 			getScenes()->loadSceneFromItemPosition(kItem7);
diff --git a/engines/lastexpress/entities/milos.cpp b/engines/lastexpress/entities/milos.cpp
index 8177f99..d982b55 100644
--- a/engines/lastexpress/entities/milos.cpp
+++ b/engines/lastexpress/entities/milos.cpp
@@ -141,7 +141,6 @@ IMPLEMENT_FUNCTION_II(10, Milos, enterCompartmentDialog, CarIndex, EntityPositio
 		if (getEvent(kEventMilosTylerCompartmentDefeat)) {
 			// Robert saying: "Milos"
 			switch(rnd(3)) {
-			default:
 			case 0:
 				getSound()->playSound(kEntityPlayer, "CAT1014");
 				break;
@@ -443,7 +442,7 @@ IMPLEMENT_FUNCTION(14, Milos, function14)
 					++params->param5;
 					switch (params->param5) {
 					default:
-						getObjects()->update(kObjectCompartment1, kEntityMilos, getObjects()->get(kObjectCompartment1).status, params->param3 < 1 ? kCursorTalk : kCursorNormal, kCursorHand);
+						getObjects()->update(kObjectCompartment1, kEntityMilos, getObjects()->get(kObjectCompartment1).status, params->param3 == 0 ? kCursorTalk : kCursorNormal, kCursorHand);
 						CURRENT_PARAM(1, 2) = 0;
 						break;
 
@@ -467,7 +466,7 @@ IMPLEMENT_FUNCTION(14, Milos, function14)
 
 						if (params->param7 < 3) {
 							params->param5 = 1;
-							getObjects()->update(kObjectCompartment1, kEntityMilos, getObjects()->get(kObjectCompartment1).status, params->param3 < 1 ? kCursorTalk : kCursorNormal, kCursorHand);
+							getObjects()->update(kObjectCompartment1, kEntityMilos, getObjects()->get(kObjectCompartment1).status, params->param3 == 0 ? kCursorTalk : kCursorNormal, kCursorHand);
 							CURRENT_PARAM(1, 2) = 0;
 							break;
 						}
@@ -645,7 +644,7 @@ label_callback_12:
 		case 7:
 		case 9:
 		case 11:
-			getObjects()->update(kObjectCompartment1, kEntityMilos, getObjects()->get(kObjectCompartment1).status, params->param3 < 1 ? kCursorTalk : kCursorNormal, kCursorHand);
+			getObjects()->update(kObjectCompartment1, kEntityMilos, getObjects()->get(kObjectCompartment1).status, params->param3 == 0 ? kCursorTalk : kCursorNormal, kCursorHand);
 			CURRENT_PARAM(1, 2) = 0;
 			break;
 
@@ -1367,9 +1366,13 @@ IMPLEMENT_FUNCTION(25, Milos, function25)
 
 		case 3:
 			getObjects()->update(kObjectCompartmentG, kEntityMilos, kObjectLocation1, kCursorTalk, kCursorNormal);
-			getObjects()->update(kObjectCompartmentG, kEntityMilos, kObjectLocation1, kCursorHandKnock, kCursorHand);
 
 			params->param1 = 1;
+			// BUG: the original game executes the last line of [case 4:] here too, resetting cursor once again.
+			// We get here when Cath knocks or tries to enter the compartment G when Vesna is there,
+			// after Vesna says VES1015A (in Serbian, supposedly a variant of "Who is it?").
+			// The action for next knock / attempt to enter is saying CAT1505/CAT1505A,
+			// so the cursor should be kCursorTalk and not kCursorHandKnock as in the original game.
 			break;
 
 		case 4:
@@ -1524,7 +1527,6 @@ IMPLEMENT_FUNCTION(29, Milos, chapter4Handler)
 		getSound()->playSound(kEntityMilos, sound); \
 		if (getEntities()->isDistanceBetweenEntities(kEntityMilos, kEntityPlayer, 2000)) \
 			getProgress().field_94 = 1; \
-		break; \
 	}
 
 	switch (savepoint.action) {
diff --git a/engines/lastexpress/entities/mmeboutarel.cpp b/engines/lastexpress/entities/mmeboutarel.cpp
index 994a0ce..d9a7ea1 100644
--- a/engines/lastexpress/entities/mmeboutarel.cpp
+++ b/engines/lastexpress/entities/mmeboutarel.cpp
@@ -887,7 +887,7 @@ IMPLEMENT_FUNCTION(21, MmeBoutarel, chapter3Handler)
 			if (getState()->time <= kTime2038500) {
 				if (!getEntities()->isPlayerInCar(kCarRedSleeping)
 				 || !params->param1
-				 || getSoundQueue()->isBuffered("FRA2012")
+				 || getSoundQueue()->isBuffered("FRA2012") // the original game tests this sound twice. Maybe a bug?
 				 || getSoundQueue()->isBuffered("FRA2010")
 				 ||!params->param2)
 					params->param2 = (uint)getState()->time;
diff --git a/engines/lastexpress/entities/rebecca.cpp b/engines/lastexpress/entities/rebecca.cpp
index acb58f7..fec0891 100644
--- a/engines/lastexpress/entities/rebecca.cpp
+++ b/engines/lastexpress/entities/rebecca.cpp
@@ -309,7 +309,7 @@ IMPLEMENT_FUNCTION_I(17, Rebecca, function17, bool)
 			break;
 
 		case 2:
-			getEntities()->clearSequences(kEntitySophie);
+			getEntities()->clearSequences(kEntityRebecca);
 			break;
 
 		case 3:
@@ -1371,7 +1371,7 @@ IMPLEMENT_FUNCTION(36, Rebecca, function36)
 				getSound()->playSound(kEntityRebecca, "Reb3007");
 
 				setCallback(2);
-				setup_updatePosition("118E", kCarRedSleeping, 52);
+				setup_updatePosition("118E", kCarRestaurant, 52);
 				break;
 			}
 		}
@@ -1726,7 +1726,7 @@ label_callback_2:
 		break;
 
 	case kAction123712592:
-		getEntities()->drawSequenceLeft(kEntityRebecca, "BLANK");
+		getEntities()->drawSequenceLeft(kEntityWaiter1, "BLANK");
 		getSound()->playSound(kEntityRebecca, "Reb4003");
 
 		setCallback(4);
diff --git a/engines/lastexpress/entities/salko.cpp b/engines/lastexpress/entities/salko.cpp
index f93d13c..f1595d6 100644
--- a/engines/lastexpress/entities/salko.cpp
+++ b/engines/lastexpress/entities/salko.cpp
@@ -181,7 +181,7 @@ IMPLEMENT_FUNCTION(10, Salko, chapter1Handler)
 
 	case kActionCallback:
 		if (getCallback() == 1) {
-			getEntities()->clearSequences(kEntitySalko);
+			getEntities()->drawSequenceLeft(kEntitySalko, "BLANK");
 			setup_function8();
 		}
 		break;
diff --git a/engines/lastexpress/entities/tatiana.cpp b/engines/lastexpress/entities/tatiana.cpp
index 5dd61e3..31de491 100644
--- a/engines/lastexpress/entities/tatiana.cpp
+++ b/engines/lastexpress/entities/tatiana.cpp
@@ -209,7 +209,7 @@ IMPLEMENT_FUNCTION(15, Tatiana, exitCompartment)
 
 	case kActionDefault:
 		setCallback(getProgress().chapter == kChapter1 ? 1 : 2);
-		setup_enterExitCompartment2(getProgress().chapter == kChapter1 ? "603Bb" : "673Bb", kObjectCompartmentB);
+		setup_enterExitCompartment(getProgress().chapter == kChapter1 ? "603Bb" : "673Bb", kObjectCompartmentB);
 		break;
 
 	case kActionCallback:
@@ -615,8 +615,7 @@ IMPLEMENT_FUNCTION(22, Tatiana, getSomeAir)
 		if (params->param1 == kTimeInvalid || getState()->time <= kTime1179000)
 			goto label_update;
 
-		if (Entity::updateParameterTime(kTime1233000, ((!getEvent(kEventTatianaAskMatchSpeakRussian) && !getEvent(kEventTatianaAskMatch)) || getEntities()->isInGreenCarEntrance(kEntityPlayer)), params->param1, 0)) {
-			params->param1 = kTimeInvalid;
+		if (!Entity::updateParameterTime(kTime1233000, ((!getEvent(kEventTatianaAskMatchSpeakRussian) && !getEvent(kEventTatianaAskMatch)) || getEntities()->isInGreenCarEntrance(kEntityPlayer)), params->param1, 0)) {
 
 label_update:
 			if (!getEvent(kEventTatianaAskMatchSpeakRussian)
@@ -1036,6 +1035,7 @@ IMPLEMENT_FUNCTION(32, Tatiana, playChess)
 		break;
 
 	case  kActionEndSound:
+		parameters->param2 = 0;
 		++parameters->param3;
 
 		switch (parameters->param3) {
@@ -1200,7 +1200,7 @@ IMPLEMENT_FUNCTION(35, Tatiana, concert)
 
 label_callback_1:
 		if (getState()->time > kTime2133000) {
-			if (getData()->car >= kCarRedSleeping || (getData()->car == kCarGreenSleeping && getData()->entityPosition > kPosition_5790))
+			if (getEntityData(kEntityAugust)->car >= kCarRedSleeping || (getEntityData(kEntityAugust)->car == kCarGreenSleeping && getEntityData(kEntityAugust)->entityPosition > kPosition_5790))
 				setup_leaveConcert();
 		}
 		break;
diff --git a/engines/lastexpress/entities/vassili.cpp b/engines/lastexpress/entities/vassili.cpp
index 1c25ce2..cff6ec4 100644
--- a/engines/lastexpress/entities/vassili.cpp
+++ b/engines/lastexpress/entities/vassili.cpp
@@ -108,7 +108,7 @@ IMPLEMENT_FUNCTION(5, Vassili, chapter1Handler)
 			if (!Entity::updateParameterCheck(params->param3, getState()->time, 450))
 				break;
 
-			if (!params->param2 && getObjects()->get(kObjectCompartmentA).status == kObjectLocation1) {
+			if (!params->param2 && getObjects()->get(kObjectCompartmentA).model == kObjectLocation1) {
 				params->param2 = 1;
 				getEntities()->drawSequenceLeft(kEntityVassili, "303A");
 				getObjects()->update(kObjectCompartmentA, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
@@ -313,19 +313,19 @@ IMPLEMENT_FUNCTION(10, Vassili, seizure)
 		// Check that we have removed the body from the train and changed jacket
 		if (!getProgress().eventCorpseMovedFromFloor) {
 			getAction()->playAnimation(kEventMertensCorpseFloor);
-			getLogic()->gameOver(kSavegameTypeIndex, 0, kSceneNone, false);
+			getLogic()->gameOver(kSavegameTypeIndex, 0, kSceneNone, true);
 			break;
 		}
 
 		if (!getProgress().eventCorpseThrown) {
 			getAction()->playAnimation(kEventMertensCorpseBed);
-			getLogic()->gameOver(kSavegameTypeIndex, 0, kSceneNone, false);
+			getLogic()->gameOver(kSavegameTypeIndex, 0, kSceneNone, true);
 			break;
 		}
 
 		if (getProgress().jacket == kJacketBlood) {
 			getAction()->playAnimation(kEventMertensBloodJacket);
-			getLogic()->gameOver(kSavegameTypeIndex, 0, kSceneNone, false);
+			getLogic()->gameOver(kSavegameTypeIndex, 0, kSceneNone, true);
 			break;
 		}
 
@@ -410,7 +410,7 @@ IMPLEMENT_FUNCTION(13, Vassili, sleeping)
 		break;
 
 	case kActionDefault:
-		params->param5 = 5 * (3 * rnd(25) + 15);
+		params->param1 = 5 * (3 * rnd(25) + 15);
 		getEntities()->drawSequenceLeft(kEntityVassili, "303A");
 		break;
 
@@ -475,7 +475,7 @@ IMPLEMENT_FUNCTION(15, Vassili, stealEgg)
 		break;
 
 	case kActionDefault:
-		params->param5 = 5 * (3 * rnd(25) + 15);
+		params->param1 = 5 * (3 * rnd(25) + 15);
 		getEntities()->drawSequenceLeft(kEntityVassili, "303A");
 		break;
 
@@ -555,7 +555,7 @@ IMPLEMENT_FUNCTION(17, Vassili, chapter4Handler)
 		break;
 
 	case kActionDefault:
-		params->param5 = 5 * (3 * rnd(25) + 15);
+		params->param1 = 5 * (3 * rnd(25) + 15);
 		getEntities()->drawSequenceLeft(kEntityVassili, "303A");
 		break;
 
diff --git a/engines/lastexpress/entities/verges.cpp b/engines/lastexpress/entities/verges.cpp
index c3e56d9..7811aa8 100644
--- a/engines/lastexpress/entities/verges.cpp
+++ b/engines/lastexpress/entities/verges.cpp
@@ -1083,6 +1083,7 @@ IMPLEMENT_FUNCTION(28, Verges, chapter2Handler)
 		if (getEntities()->isInBaggageCarEntrance(kEntityPlayer)) {
 			setCallback(1);
 			setup_baggageCar(false);
+			break;
 		}
 
 label_callback_1:
@@ -1708,7 +1709,7 @@ IMPLEMENT_FUNCTION(38, Verges, resetState)
 
 		getData()->entityPosition = kPosition_6469;
 		getData()->location = kLocationOutsideCompartment;
-		getData()->car = kCarGreenSleeping;
+		getData()->car = kCarRedSleeping;
 		break;
 
 	case kActionCallback:
diff --git a/engines/lastexpress/entities/vesna.cpp b/engines/lastexpress/entities/vesna.cpp
index 7ac53ce..af7adfa 100644
--- a/engines/lastexpress/entities/vesna.cpp
+++ b/engines/lastexpress/entities/vesna.cpp
@@ -1049,8 +1049,6 @@ IMPLEMENT_FUNCTION(29, Vesna, guarding)
 
 	case kActionOpenDoor:
 		setCallback(1);
-
-		getData()->currentCall++;
 		setup_savegame(kSavegameTypeEvent, kEventCathVesnaRestaurantKilled);
 		break;
 
@@ -1118,6 +1116,7 @@ IMPLEMENT_FUNCTION(30, Vesna, climbing)
 				getLogic()->gameOver(kSavegameTypeIndex, 0, kSceneNone, params->param2 == Fight::kFightEndLost);
 			} else {
 				getSound()->playSound(kEntityPlayer, "TUNNEL");
+				// TODO: fade to black screen
 
 				getState()->time = (TimeValue)(getState()->time + 1800);
 
diff --git a/engines/lastexpress/entities/waiter2.cpp b/engines/lastexpress/entities/waiter2.cpp
index 2be7b4e..f009551 100644
--- a/engines/lastexpress/entities/waiter2.cpp
+++ b/engines/lastexpress/entities/waiter2.cpp
@@ -131,7 +131,7 @@ IMPLEMENT_FUNCTION(7, Waiter2, monsieurServeUs)
 
 		case 2:
 			getSavePoints()->push(kEntityWaiter2, kEntityBoutarel, kAction122288808);
-			setCallback(2);
+			setCallback(3);
 			setup_draw("926");
 			break;
 





More information about the Scummvm-git-logs mailing list