[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