diff options
author | Evgeny Grechnikov | 2018-09-24 01:57:44 +0300 |
---|---|---|
committer | Evgeny Grechnikov | 2018-09-24 01:57:44 +0300 |
commit | f057ac75ce86db465a75193a40358b3226bcf099 (patch) | |
tree | 3fdab724ef78fa76864a4ff241203a52cc12cdcb /engines/lastexpress/entities | |
parent | 875ce8101c9c67d7c38bad9ddc263a46eb0c758a (diff) | |
download | scummvm-rg350-f057ac75ce86db465a75193a40358b3226bcf099.tar.gz scummvm-rg350-f057ac75ce86db465a75193a40358b3226bcf099.tar.bz2 scummvm-rg350-f057ac75ce86db465a75193a40358b3226bcf099.zip |
LASTEXPRESS: more fixes in NPC logic
Diffstat (limited to 'engines/lastexpress/entities')
-rw-r--r-- | engines/lastexpress/entities/mahmud.cpp | 10 | ||||
-rw-r--r-- | engines/lastexpress/entities/mertens.cpp | 20 | ||||
-rw-r--r-- | engines/lastexpress/entities/milos.cpp | 14 | ||||
-rw-r--r-- | engines/lastexpress/entities/mmeboutarel.cpp | 2 | ||||
-rw-r--r-- | engines/lastexpress/entities/rebecca.cpp | 6 | ||||
-rw-r--r-- | engines/lastexpress/entities/salko.cpp | 2 | ||||
-rw-r--r-- | engines/lastexpress/entities/tatiana.cpp | 8 | ||||
-rw-r--r-- | engines/lastexpress/entities/vassili.cpp | 14 | ||||
-rw-r--r-- | engines/lastexpress/entities/verges.cpp | 3 | ||||
-rw-r--r-- | engines/lastexpress/entities/vesna.cpp | 3 | ||||
-rw-r--r-- | engines/lastexpress/entities/waiter2.cpp | 2 |
11 files changed, 49 insertions, 35 deletions
diff --git a/engines/lastexpress/entities/mahmud.cpp b/engines/lastexpress/entities/mahmud.cpp index 9f43c695ea..1468bce5a7 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 573a35013e..cb2311fddd 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 8177f99ff6..d982b5585a 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 994a0ceda6..d9a7ea1db6 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 acb58f7870..fec0891ce9 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 f93d13c849..f1595d6d0f 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 5dd61e3f46..31de491983 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 1c25ce2cb0..cff6ec472c 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 c3e56d98c1..7811aa880f 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 7ac53ce6e7..af7adfa327 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 2be7b4e7c6..f009551498 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; |