diff options
Diffstat (limited to 'engines/lastexpress/entities/tatiana.cpp')
-rw-r--r-- | engines/lastexpress/entities/tatiana.cpp | 2272 |
1 files changed, 2272 insertions, 0 deletions
diff --git a/engines/lastexpress/entities/tatiana.cpp b/engines/lastexpress/entities/tatiana.cpp new file mode 100644 index 0000000000..8e6be41ad4 --- /dev/null +++ b/engines/lastexpress/entities/tatiana.cpp @@ -0,0 +1,2272 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "lastexpress/entities/tatiana.h" + +#include "lastexpress/entities/alexei.h" +#include "lastexpress/entities/coudert.h" + +#include "lastexpress/game/action.h" +#include "lastexpress/game/entities.h" +#include "lastexpress/game/inventory.h" +#include "lastexpress/game/logic.h" +#include "lastexpress/game/object.h" +#include "lastexpress/game/savepoint.h" +#include "lastexpress/game/scenes.h" +#include "lastexpress/game/sound.h" +#include "lastexpress/game/state.h" + +#include "lastexpress/lastexpress.h" +#include "lastexpress/helpers.h" + +namespace LastExpress { + +Tatiana::Tatiana(LastExpressEngine *engine) : Entity(engine, kEntityTatiana) { + ADD_CALLBACK_FUNCTION(Tatiana, reset); + ADD_CALLBACK_FUNCTION(Tatiana, playSound); + ADD_CALLBACK_FUNCTION(Tatiana, draw); + ADD_CALLBACK_FUNCTION(Tatiana, updatePosition); + ADD_CALLBACK_FUNCTION(Tatiana, enterExitCompartment); + ADD_CALLBACK_FUNCTION(Tatiana, enterExitCompartment2); + ADD_CALLBACK_FUNCTION(Tatiana, callSavepoint); + ADD_CALLBACK_FUNCTION(Tatiana, callbackActionOnDirection); + ADD_CALLBACK_FUNCTION(Tatiana, updateFromTicks); + ADD_CALLBACK_FUNCTION(Tatiana, updateFromTime); + ADD_CALLBACK_FUNCTION(Tatiana, callbackActionRestaurantOrSalon); + ADD_CALLBACK_FUNCTION(Tatiana, savegame); + ADD_CALLBACK_FUNCTION(Tatiana, updateEntity); + ADD_CALLBACK_FUNCTION(Tatiana, function14); + ADD_CALLBACK_FUNCTION(Tatiana, function15); + ADD_CALLBACK_FUNCTION(Tatiana, function16); + ADD_CALLBACK_FUNCTION(Tatiana, chapter1); + ADD_CALLBACK_FUNCTION(Tatiana, function18); + ADD_CALLBACK_FUNCTION(Tatiana, chapter1Handler); + ADD_CALLBACK_FUNCTION(Tatiana, function20); + ADD_CALLBACK_FUNCTION(Tatiana, function21); + ADD_CALLBACK_FUNCTION(Tatiana, function22); + ADD_CALLBACK_FUNCTION(Tatiana, function23); + ADD_CALLBACK_FUNCTION(Tatiana, function24); + ADD_CALLBACK_FUNCTION(Tatiana, chapter2); + ADD_CALLBACK_FUNCTION(Tatiana, chapter2Handler); + ADD_CALLBACK_FUNCTION(Tatiana, function27); + ADD_CALLBACK_FUNCTION(Tatiana, function28); + ADD_CALLBACK_FUNCTION(Tatiana, function29); + ADD_CALLBACK_FUNCTION(Tatiana, function30); + ADD_CALLBACK_FUNCTION(Tatiana, chapter3); + ADD_CALLBACK_FUNCTION(Tatiana, chapter3Handler); + ADD_CALLBACK_FUNCTION(Tatiana, function33); + ADD_CALLBACK_FUNCTION(Tatiana, function34); + ADD_CALLBACK_FUNCTION(Tatiana, function35); + ADD_CALLBACK_FUNCTION(Tatiana, function36); + ADD_CALLBACK_FUNCTION(Tatiana, function37); + ADD_CALLBACK_FUNCTION(Tatiana, function38); + ADD_CALLBACK_FUNCTION(Tatiana, function39); + ADD_CALLBACK_FUNCTION(Tatiana, function40); + ADD_CALLBACK_FUNCTION(Tatiana, function41); + ADD_CALLBACK_FUNCTION(Tatiana, function42); + ADD_CALLBACK_FUNCTION(Tatiana, chapter4); + ADD_CALLBACK_FUNCTION(Tatiana, chapter4Handler); + ADD_CALLBACK_FUNCTION(Tatiana, function45); + ADD_CALLBACK_FUNCTION(Tatiana, function46); + ADD_CALLBACK_FUNCTION(Tatiana, function47); + ADD_CALLBACK_FUNCTION(Tatiana, function48); + ADD_CALLBACK_FUNCTION(Tatiana, function49); + ADD_CALLBACK_FUNCTION(Tatiana, function50); + ADD_CALLBACK_FUNCTION(Tatiana, function51); + ADD_CALLBACK_FUNCTION(Tatiana, chapter5); + ADD_CALLBACK_FUNCTION(Tatiana, chapter5Handler); + ADD_CALLBACK_FUNCTION(Tatiana, function54); + ADD_CALLBACK_FUNCTION(Tatiana, function55); +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(1, Tatiana, reset) + Entity::reset(savepoint, true); +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION_S(2, Tatiana, playSound) + Entity::playSound(savepoint); +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION_S(3, Tatiana, draw) + Entity::draw(savepoint); +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION_SII(4, Tatiana, updatePosition, CarIndex, Position) + Entity::updatePosition(savepoint); +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION_SI(5, Tatiana, enterExitCompartment, ObjectIndex) + Entity::enterExitCompartment(savepoint); +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION_SI(6, Tatiana, enterExitCompartment2, ObjectIndex) + Entity::enterExitCompartment(savepoint, kPosition_7500, kPosition_7850, kCarRedSleeping, kObjectCompartmentB); +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION_SIIS(7, Tatiana, callSavepoint, EntityIndex, ActionIndex) + Entity::callSavepoint(savepoint); +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(8, Tatiana, callbackActionOnDirection) + Entity::callbackActionOnDirection(savepoint); +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION_NOSETUP(9, Tatiana, updateFromTicks) + Entity::updateFromTicks(savepoint); +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION_I(10, Tatiana, updateFromTime, uint32) + Entity::updateFromTime(savepoint); +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(11, Tatiana, callbackActionRestaurantOrSalon) + Entity::callbackActionRestaurantOrSalon(savepoint); +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION_II(12, Tatiana, savegame, SavegameType, uint32) + Entity::savegame(savepoint); +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION_II(13, Tatiana, updateEntity, CarIndex, EntityPosition) + if (savepoint.action == kActionExcuseMeCath) { + if (getEvent(kEventTatianaAskMatchSpeakRussian) || getEvent(kEventTatianaAskMatch) || getEvent(kEventVassiliSeizure)) { + getSound()->playSound(kEntityPlayer, rnd(2) ? "CAT1010" : "CAT1010A"); + } else { + getSound()->excuseMeCath(); + } + return; + } + + Entity::updateEntity(savepoint, true); +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(14, Tatiana, function14) + switch (savepoint.action) { + default: + break; + + case kActionDefault: + getSavePoints()->push(kEntityTatiana, kEntityCoudert, kAction326348944); + getEntities()->drawSequenceLeft(kEntityTatiana, getProgress().chapter == kChapter1 ? "603Fb" : "673Fb"); + getEntities()->enterCompartment(kEntityTatiana, kObjectCompartmentB, true); + break; + + case kActionCallback: + if (getCallback() == 1 || getCallback() == 2) { + getEntities()->exitCompartment(kEntityTatiana, kObjectCompartmentB, true); + getData()->location = kLocationInsideCompartment; + getEntities()->clearSequences(kEntityTatiana); + + CALLBACK_ACTION(); + } + break; + + case kAction69239528: + setCallback(getProgress().chapter == kChapter1 ? 1 : 2); + setup_enterExitCompartment2(getProgress().chapter == kChapter1 ? "603Db" : "673Db", kObjectCompartmentB); + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(15, Tatiana, function15) + switch (savepoint.action) { + default: + break; + + case kActionDefault: + setCallback(getProgress().chapter == kChapter1 ? 1 : 2); + setup_enterExitCompartment2(getProgress().chapter == kChapter1 ? "603Bb" : "673Bb", kObjectCompartmentB); + break; + + case kActionCallback: + if (getCallback() == 1 || getCallback() == 2) { + getData()->location = kLocationOutsideCompartment; + getSavePoints()->push(kEntityTatiana, kEntityCoudert, kAction292048641); + + getEntities()->drawSequenceLeft(kEntityTatiana, getProgress().chapter == kChapter1 ? "603Fb" : "673Fb"); + getEntities()->enterCompartment(kEntityTatiana, kObjectCompartmentB, true); + } + break; + + case kAction69239528: + getEntities()->exitCompartment(kEntityTatiana, kObjectCompartmentB, true); + getObjects()->update(kObjectCompartmentB, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand); + + CALLBACK_ACTION(); + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION_I(16, Tatiana, function16, uint32) + switch (savepoint.action) { + default: + break; + + case kActionNone: + if (params->param1 < getState()->time && !params->param4) { + params->param4 = 1; + + getObjects()->update(kObjectCompartmentB, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); + getObjects()->update(kObject49, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); + + CALLBACK_ACTION(); + break; + } + + if (params->param2) { + UPDATE_PARAM(params->param5, getState()->timeTicks, 75); + + params->param2 = 0; + params->param3 = 1; + + getObjects()->update(kObjectCompartmentB, kEntityTatiana, kObjectLocation1, kCursorNormal, kCursorNormal); + getObjects()->update(kObject49, kEntityTatiana, kObjectLocation1, kCursorNormal, kCursorNormal); + } + + params->param5 = 0; + break; + + case kActionKnock: + case kActionOpenDoor: + if (params->param2) { + getObjects()->update(kObjectCompartmentB, kEntityTatiana, kObjectLocation1, kCursorNormal, kCursorNormal); + getObjects()->update(kObject49, kEntityTatiana, kObjectLocation1, kCursorNormal, kCursorNormal); + + if (savepoint.param.intValue == 49) { + setCallback(4); + setup_playSound(getSound()->justAMinuteCath()); + break; + } + + if (getInventory()->hasItem(kItemPassengerList)) { + setCallback(5); + setup_playSound(rnd(2) ? "CAT1512" : getSound()->wrongDoorCath()); + break; + } + + setCallback(6); + setup_playSound(getSound()->wrongDoorCath()); + } else { + getObjects()->update(kObjectCompartmentB, kEntityTatiana, kObjectLocation1, kCursorNormal, kCursorNormal); + getObjects()->update(kObject49, kEntityTatiana, kObjectLocation1, kCursorNormal, kCursorNormal); + + setCallback(savepoint.action == kActionKnock ? 1 : 2); + setup_playSound(savepoint.action == kActionKnock ? "LIB012" : "LIB013"); + } + break; + + case kActionDefault: + getObjects()->update(kObjectCompartmentB, kEntityTatiana, kObjectLocation1, kCursorHandKnock, kCursorHand); + getObjects()->update(kObject49, kEntityTatiana, kObjectLocation1, kCursorHandKnock, kCursorHand); + break; + + case kActionDrawScene: + if (params->param2 || params->param3) { + getObjects()->update(kObjectCompartmentB, kEntityTatiana, kObjectLocation1, kCursorHandKnock, kCursorHand); + getObjects()->update(kObject49, kEntityTatiana, kObjectLocation1, kCursorHandKnock, kCursorHand); + + params->param2 = 0; + params->param3 = 0; + } + break; + + case kActionCallback: + switch (getCallback()) { + default: + break; + + case 1: + case 2: + setCallback(3); + setup_playSound(rnd(2) ? "TAT1133A" : "TAT1133B"); + break; + + case 3: + getObjects()->update(kObjectCompartmentB, kEntityTatiana, kObjectLocation1, kCursorTalk, kCursorNormal); + getObjects()->update(kObject49, kEntityTatiana, kObjectLocation1, kCursorTalk, kCursorNormal); + params->param2 = 1; + break; + + case 4: + case 5: + case 6: + params->param2 = 0; + params->param3 = 1; + break; + } + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(17, Tatiana, chapter1) + switch (savepoint.action) { + default: + break; + + case kActionNone: + TIME_CHECK(kTimeChapter1, params->param1, setup_chapter1Handler); + break; + + case kActionDefault: + getSavePoints()->addData(kEntityTatiana, kAction191198209, 0); + + getObjects()->update(kObjectCompartmentB, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand); + getObjects()->update(kObject49, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand); + getObjects()->update(kObject41, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue); + + getData()->entityPosition = kPosition_5419; + getData()->location = kLocationInsideCompartment; + getData()->car = kCarRestaurant; + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(18, Tatiana, function18) + switch (savepoint.action) { + default: + break; + + case kActionNone: + if (!params->param1) { + + if (getState()->time > kTime1143000 && !params->param2) { + params->param2 = 1; + getEntities()->drawSequenceRight(kEntityTatiana, "806DS"); + params->param1 = 1; + } + + if (!params->param1) { + UPDATE_PARAM_PROC(params->param3, getState()->time, 4500) + getEntities()->drawSequenceRight(kEntityTatiana, "806DS"); + params->param1 = 1; + UPDATE_PARAM_PROC_END + } + } + + if (getData()->entityPosition <= kPosition_2330) { + getSavePoints()->push(kEntityTatiana, kEntityAlexei, kAction157159392); + getEntities()->clearSequences(kEntityTatiana); + + CALLBACK_ACTION(); + } + break; + + case kActionExitCompartment: + getSavePoints()->push(kEntityTatiana, kEntityAlexei, kAction188784532); + + CALLBACK_ACTION(); + break; + + case kActionDefault: + if (getEntities()->isInSalon(kEntityPlayer)) { + getEntities()->drawSequenceRight(kEntityTatiana, "806DS"); + params->param1 = 1; + } else { + getEntities()->clearSequences(kEntityTatiana); + } + break; + + case kActionDrawScene: + if (!params->param1 && getEntities()->isInSalon(kEntityPlayer)) { + getEntities()->drawSequenceRight(kEntityTatiana, "806DS"); + getEntities()->updateFrame(kEntityTatiana); + params->param1 = 1; + } + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(19, Tatiana, chapter1Handler) + switch (savepoint.action) { + default: + break; + + case kActionNone: + if (getSound()->isBuffered(kEntityTatiana) || !params->param4 || params->param3 == 2 || getSound()->isBuffered("TAT1066")) + goto label_tatiana_chapter1_2; + + UPDATE_PARAM_PROC(params->param5, getState()->timeTicks, 450) + getSound()->playSound(kEntityTatiana, params->param3 ? "TAT1069B" : "TAT1069A"); + getProgress().field_64 = 1; + params->param3++; + params->param5 = 0; + UPDATE_PARAM_PROC_END + + if (getEntities()->isPlayerPosition(kCarRestaurant, 71)) { + UPDATE_PARAM_PROC(params->param6, getState()->timeTicks, 75) + getSound()->playSound(kEntityTatiana, params->param3 ? "TAT1069B" : "TAT1069A"); + getProgress().field_64 = 1; + params->param3++; + params->param6 = 0; + UPDATE_PARAM_PROC_END + } + +label_tatiana_chapter1_2: + TIME_CHECK_SAVEPOINT(kTime1084500, params->param7, kEntityTatiana, kEntityPascale, kAction257489762); + + if (params->param1) { + UPDATE_PARAM(params->param8, getState()->timeTicks, 90); + getScenes()->loadSceneFromPosition(kCarRestaurant, 65); + } else { + params->param8 = 0; + } + break; + + case kActionDefault: + getSavePoints()->push(kEntityTatiana, kEntityTables4, kAction136455232); + getEntities()->drawSequenceLeft(kEntityTatiana, "014A"); + break; + + case kActionDrawScene: + params->param1 = getEntities()->isPlayerPosition(kCarRestaurant, 67) ? 1 : 0; + params->param4 = getEntities()->isPlayerPosition(kCarRestaurant, 69) + || getEntities()->isPlayerPosition(kCarRestaurant, 70) + || getEntities()->isPlayerPosition(kCarRestaurant, 71); + break; + + case kAction122288808: + getEntities()->drawSequenceLeft(kEntityTatiana, "014A"); + break; + + case kAction122358304: + getEntities()->drawSequenceLeft(kEntityTatiana, "BLANK"); + break; + + case kAction124973510: + setup_function20(); + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(20, Tatiana, function20) + switch (savepoint.action) { + default: + break; + + case kActionDefault: + setCallback(1); + setup_callbackActionRestaurantOrSalon(); + break; + + case kActionCallback: + switch (getCallback()) { + default: + break; + + case 1: + getData()->location = kLocationOutsideCompartment; + getSavePoints()->push(kEntityTatiana, kEntityAugust, kAction223183000); + getEntities()->updatePositionEnter(kEntityTatiana, kCarRestaurant, 67); + getSound()->playSound(kEntityTatiana, "TAT1070"); + + setCallback(2); + setup_callSavepoint("014C", kEntityTables4, kActionDrawTablesWithChairs, "014D"); + break; + + case 2: + getEntities()->updatePositionExit(kEntityTatiana, kCarRestaurant, 67); + getSavePoints()->push(kEntityTatiana, kEntityServers0, kAction188893625); + + setCallback(3); + setup_function18(); + break; + + case 3: + getSavePoints()->push(kEntityTatiana, kEntityAugust, kAction268620864); + setup_function21(); + break; + } + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(21, Tatiana, function21) + switch (savepoint.action) { + default: + break; + + case kActionDefault: + getData()->clothes = kClothes1; + + setCallback(1); + setup_updateEntity(kCarRedSleeping, kPosition_8513); + break; + + case kActionCallback: + switch (getCallback()) { + default: + break; + + case 1: + getData()->clothes = kClothesDefault; + + getSound()->playSound(kEntityTatiana, "TAT1071"); + getEntities()->drawSequenceRight(kEntityTatiana, "604Aa"); + getEntities()->enterCompartment(kEntityTatiana, kObjectCompartmentA); + + getData()->location = kLocationInsideCompartment; + + if (getEntities()->checkFields19(kEntityPlayer, kCarRedSleeping, kPosition_7850)) { + getAction()->playAnimation(isNight() ? kEventCathTurningNight : kEventCathTurningDay); + getSound()->playSound(kEntityPlayer, "BUMP"); + getScenes()->loadSceneFromObject(kObjectCompartmentA, true); + } + + setCallback(2); + setup_callbackActionOnDirection(); + break; + + case 2: + getEntities()->exitCompartment(kEntityTatiana, kObjectCompartmentA); + + getData()->location = kLocationInsideCompartment; + + getEntities()->clearSequences(kEntityTatiana); + getSavePoints()->push(kEntityTatiana, kEntityAlexei, kAction135854208); + getObjects()->update(kObjectCompartmentA, kEntityPlayer, kObjectLocation1, kCursorNormal, kCursorNormal); + getObjects()->update(kObjectCompartmentB, kEntityPlayer, kObjectLocation1, kCursorNormal, kCursorNormal); + // Fallback to next case + + case 3: + if (getSound()->isBuffered(kEntityTatiana)) { + setCallback(3); + setup_updateFromTime(75); + } else { + setCallback(4); + setup_playSound("TAT1071A"); + } + break; + + case 4: + getData()->entityPosition = kPosition_7500; + + getSavePoints()->push(kEntityTatiana, kEntityVassili, kAction168459827); + + setCallback(5); + setup_function16(kTime1156500); + break; + + case 5: + case 6: + if (getProgress().field_14 == 29) { + setCallback(6); + setup_function16((uint)getState()->time + 900); + } else { + getObjects()->update(kObject49, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand); + + setup_function22(); + } + break; + } + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(22, Tatiana, function22) + switch (savepoint.action) { + default: + break; + + case kActionNone: + if (params->param1 == kTimeInvalid || getState()->time <= kTime1179000) + goto label_update; + + UPDATE_PARAM_PROC_TIME(kTime1233000, ((!getEvent(kEventTatianaAskMatchSpeakRussian) && !getEvent(kEventTatianaAskMatch)) || getEntities()->isInGreenCarEntrance(kEntityPlayer)), params->param1, 0) +label_update: + if (!getEvent(kEventTatianaAskMatchSpeakRussian) + && !getEvent(kEventTatianaAskMatch) + && getInventory()->hasItem(kItemMatchBox) + && getEntities()->isInGreenCarEntrance(kEntityPlayer)) { + getObjects()->update(kObject25, kEntityTatiana, kObjectLocation1, kCursorNormal, kCursorForward); + getObjects()->update(kObjectTrainTimeTable, kEntityTatiana, kObjectLocation1, kCursorNormal, kCursorForward); + } + UPDATE_PARAM_PROC_END + + params->param1 = kTimeInvalid; + + getObjects()->update(kObject25, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue); + getObjects()->update(kObjectTrainTimeTable, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue); + getEntities()->updatePositionExit(kEntityTatiana, kCarGreenSleeping, 70); + getEntities()->updatePositionExit(kEntityTatiana, kCarGreenSleeping, 71); + + if (getEntities()->isInGreenCarEntrance(kEntityPlayer)) { + getSound()->excuseMe(kEntityTatiana); + + if (getEntities()->isPlayerPosition(kCarGreenSleeping, 62)) + getScenes()->loadSceneFromPosition(kCarGreenSleeping, 72); + } + + getData()->inventoryItem = kItemNone; + + setup_function23(); + break; + + case kAction1: + getData()->inventoryItem = kItemNone; + + setCallback(4); + setup_savegame(kSavegameTypeEvent, kEventTatianaGivePoem); + break; + + case kActionOpenDoor: + setCallback(3); + setup_savegame(kSavegameTypeEvent, kEventTatianaAskMatchSpeakRussian); + break; + + case kActionDefault: + getSavePoints()->push(kEntityTatiana, kEntityVassili, kAction122732000); + + setCallback(1); + setup_function15(); + break; + + case kActionCallback: + switch (getCallback()) { + default: + break; + + case 1: + setCallback(2); + setup_updateEntity(kCarGreenSleeping, kPosition_540); + break; + + case 2: + if (getEntities()->isInGreenCarEntrance(kEntityPlayer)) { + getSound()->excuseMe(kEntityTatiana); + + if (getEntities()->isPlayerPosition(kCarGreenSleeping, 62)) + getScenes()->loadSceneFromPosition(kCarGreenSleeping, 72); + } + + getEntities()->drawSequenceLeft(kEntityTatiana, "306B"); + getEntities()->updatePositionEnter(kEntityTatiana, kCarGreenSleeping, 70); + getEntities()->updatePositionEnter(kEntityTatiana, kCarGreenSleeping, 71); + break; + + case 3: + getAction()->playAnimation(getEvent(kEventAlexeiSalonVassili) ? kEventTatianaAskMatchSpeakRussian : kEventTatianaAskMatch); + getScenes()->loadSceneFromPosition(kCarGreenSleeping, 62); + getData()->inventoryItem = kItemParchemin; + + getObjects()->update(kObject25, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue); + getObjects()->update(kObjectTrainTimeTable, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue); + break; + + case 4: + getAction()->playAnimation(kEventTatianaGivePoem); + getInventory()->removeItem(kItemParchemin); + getScenes()->processScene(); + break; + } + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(23, Tatiana, function23) + switch (savepoint.action) { + default: + break; + + case kActionDefault: + setCallback(1); + setup_updateEntity(kCarRedSleeping, kPosition_7500); + break; + + case kActionCallback: + switch (getCallback()) { + default: + break; + + case 1: + setCallback(2); + setup_function14(); + break; + + case 2: + setup_function24(); + break; + } + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(24, Tatiana, function24) + if (savepoint.action == kActionDefault) { + + getData()->entityPosition = kPosition_7500; + getData()->location = kLocationInsideCompartment; + getData()->car = kCarRedSleeping; + + getObjects()->update(kObject25, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue); + getObjects()->update(kObjectTrainTimeTable, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue); + + getEntities()->updatePositionExit(kEntityTatiana, kCarGreenSleeping, 70); + getEntities()->updatePositionExit(kEntityTatiana, kCarGreenSleeping, 71); + getEntities()->clearSequences(kEntityTatiana); + + getObjects()->update(kObjectCompartmentB, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand); + getObjects()->update(kObject49, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand); + getObjects()->update(kObject41, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue); + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(25, Tatiana, chapter2) + switch (savepoint.action) { + default: + break; + + case kActionNone: + setup_chapter2Handler(); + break; + + case kActionDefault: + getEntities()->clearSequences(kEntityTatiana); + + getObjects()->update(kObjectCompartmentB, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand); + getObjects()->update(kObject49, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand); + getObjects()->update(kObject41, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue); + + getData()->entityPosition = kPosition_5420; + getData()->location = kLocationInsideCompartment; + getData()->car = kCarRestaurant; + getData()->clothes = kClothes2; + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(26, Tatiana, chapter2Handler) + switch (savepoint.action) { + default: + break; + + case kActionNone: + if (getState()->time > kTime1800000 && params->param1 && getEntities()->isSomebodyInsideRestaurantOrSalon()) { + getData()->inventoryItem = kItemNone; + setup_function28(); + } + break; + + case kAction1: + getData()->inventoryItem = kItemNone; + setup_function28(); + break; + + case kActionDefault: + getEntities()->drawSequenceLeft(kEntityTatiana, "024A"); + getSavePoints()->push(kEntityTatiana, kEntityTables5, kAction136455232); + getData()->inventoryItem = kItemInvalid; + break; + + case kActionDrawScene: + if (getEntities()->isPlayerPosition(kCarRestaurant, 64) || getEntities()->isPlayerPosition(kCarRestaurant, 65)) { + getData()->inventoryItem = kItemNone; + setup_function27(); + } + break; + + case kAction290869168: + params->param1 = 1; + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(27, Tatiana, function27) + switch (savepoint.action) { + default: + break; + + case kActionDefault: + setCallback(getEvent(kEventTatianaGivePoem) ? 1 : 2); + setup_savegame(kSavegameTypeEvent, getEvent(kEventTatianaGivePoem) ? kEventTatianaBreakfastAlexei : kEventTatianaBreakfast); + break; + + case kActionCallback: + switch (getCallback()) { + default: + break; + + case 1: + RESET_ENTITY_STATE(kEntityAlexei, Alexei, setup_function30); + getAction()->playAnimation(kEventTatianaBreakfastAlexei); + getInventory()->addItem(kItemParchemin); + getInventory()->setLocationAndProcess(kItem11, kObjectLocation1); + setup_function28(); + break; + + case 2: + RESET_ENTITY_STATE(kEntityAlexei, Alexei, setup_function30); + getAction()->playAnimation(kEventTatianaBreakfast); + if (getInventory()->hasItem(kItemParchemin)) { + getAction()->playAnimation(kEventTatianaBreakfastGivePoem); + getInventory()->removeItem(kItemParchemin); + } else { + getAction()->playAnimation(kEventTatianaAlexei); + } + setup_function28(); + break; + } + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(28, Tatiana, function28) + switch (savepoint.action) { + default: + break; + + case kActionDefault: + getData()->inventoryItem = kItemNone; + getData()->location = kLocationOutsideCompartment; + + getSavePoints()->push(kEntityTatiana, kEntityTables5, kActionDrawTablesWithChairs, "024D"); + getSavePoints()->push(kEntityTatiana, kEntityAlexei, kAction236053296, (getEvent(kEventTatianaBreakfastAlexei) || getEvent(kEventTatianaBreakfast)) ? 69 : 0); + break; + + case kActionCallback: + if (getCallback() == 1) + setup_function29(); + break; + + case kAction123857088: + getEntities()->drawSequenceLeft(kEntityTatiana, "018G"); + + setCallback(1); + setup_updateFromTime(1800); + break; + + case kAction156444784: + getData()->location = kLocationInsideCompartment; + getEntities()->drawSequenceLeft(kEntityTatiana, "BLANK"); + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(29, Tatiana, function29) + switch (savepoint.action) { + default: + break; + + case kActionDefault: + setCallback(1); + setup_callbackActionRestaurantOrSalon(); + break; + + case kActionCallback: + switch (getCallback()) { + default: + break; + + case 1: + getData()->location = kLocationOutsideCompartment; + getEntities()->updatePositionEnter(kEntityTatiana, kCarRestaurant, 63); + + setCallback(2); + setup_callSavepoint("018H", kEntityTables1, kActionDrawTablesWithChairs, "018A"); + break; + + case 2: + getEntities()->updatePositionExit(kEntityTatiana, kCarRestaurant, 63); + getSavePoints()->push(kEntityTatiana, kEntityServers1, kAction302203328); + getEntities()->drawSequenceRight(kEntityTatiana, "805DS"); + + if (getEntities()->isInRestaurant(kEntityPlayer)) + getEntities()->updateFrame(kEntityTatiana); + + setCallback(3); + setup_callbackActionOnDirection(); + break; + + case 3: + setup_function30(); + break; + } + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(30, Tatiana, function30) + switch (savepoint.action) { + default: + break; + + case kActionDefault: + setCallback(1); + setup_updateEntity(kCarRedSleeping, kPosition_7500); + break; + + case kActionCallback: + switch (getCallback()) { + default: + break; + + case 1: + setCallback(2); + setup_function14(); + break; + + case 2: + setCallback(3); + setup_function16(kTimeEnd); + break; + } + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(31, Tatiana, chapter3) + switch (savepoint.action) { + default: + break; + + case kActionNone: + setup_chapter3Handler(); + break; + + case kActionDefault: + getEntities()->clearSequences(kEntityTatiana); + + getObjects()->update(kObjectCompartmentB, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand); + getObjects()->update(kObject49, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand); + + getData()->entityPosition = kPosition_1750; + getData()->location = kLocationInsideCompartment; + getData()->car = kCarRestaurant; + getData()->clothes = kClothes2; + getData()->inventoryItem = kItemNone; + + // Update inventory + getInventory()->get(kItemFirebird)->location = kObjectLocation2; + + if (getEvent(kEventTatianaBreakfastGivePoem) || (getEvent(kEventTatianaGivePoem) && !getEvent(kEventTatianaBreakfastAlexei))) + getInventory()->get(kItemParchemin)->location = kObjectLocation2; + + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(32, Tatiana, chapter3Handler) + EntityData::EntityParametersI5S *parameters = (EntityData::EntityParametersI5S*)_data->getCurrentParameters(); + EntityData::EntityParametersSIII *parameters1 = (EntityData::EntityParametersSIII*)_data->getCurrentParameters(1); + + switch (savepoint.action) { + default: + break; + + case kActionNone: + if (!parameters->param2 && !parameters->param5) { + parameters->param1 -= getState()->timeDelta; + + if (getState()->timeDelta > parameters->param1) { + + getEntities()->drawSequenceLeft(kEntityTatiana, (char *)¶meters1->seq); + getSound()->playSound(kEntityTatiana, (char *)¶meters->seq); + + if (parameters->param3 == 4 && getEntities()->isInSalon(kEntityPlayer)) + getProgress().field_90 = 1; + + parameters->param2 = 1; + } + } + + if (parameters->param4 && parameters->param5) { + UPDATE_PARAM_CHECK(parameters->param4, getState()->time, 6300) + if (getEntities()->isSomebodyInsideRestaurantOrSalon()) { + getData()->location = kLocationOutsideCompartment; + + setCallback(1); + setup_updatePosition("110E", kCarRestaurant, 52); + } + } + } + break; + + case kActionEndSound: + parameters->param2 = 0; + ++parameters->param3; + + switch (parameters->param3) { + default: + parameters->param5 = 1; + break; + + case 1: + parameters->param1 = 900; + getEntities()->drawSequenceLeft(kEntityTatiana, "110A"); + strcpy((char *)¶meters->seq, "Tat3160B"); + strcpy((char *)¶meters1->seq, "110A"); + break; + + case 2: + parameters->param1 = 9000; + strcpy((char *)¶meters->seq, "Tat3160C"); + strcpy((char *)¶meters1->seq, "110C"); + break; + + case 3: + parameters->param1 = 13500; + getEntities()->drawSequenceLeft(kEntityTatiana, "110B"); + strcpy((char *)¶meters->seq, "Tat3160D"); + strcpy((char *)¶meters1->seq, "110D"); + break; + + case 4: + parameters->param1 = 9000; + getEntities()->drawSequenceLeft(kEntityTatiana, "110B"); + strcpy((char *)¶meters->seq, "Tat3160E"); + strcpy((char *)¶meters1->seq, "110D"); + break; + + case 5: + parameters->param1 = 4500; + getEntities()->drawSequenceLeft(kEntityTatiana, "110B"); + strcpy((char *)¶meters->seq, "Tat3160G"); + strcpy((char *)¶meters1->seq, "110D"); + break; + + case 6: + parameters->param1 = 4500; + getEntities()->drawSequenceLeft(kEntityTatiana, "110B"); + strcpy((char *)¶meters->seq, "Tat3160B"); + break; + } + break; + + case kActionDefault: + getSavePoints()->push(kEntityTatiana, kEntityAlexei, kAction122358304); + getSavePoints()->push(kEntityTatiana, kEntityKronos, kAction157159392); + getEntities()->drawSequenceLeft(kEntityTatiana, "110C"); + getSound()->playSound(kEntityTatiana, "Tat3160A"); + + parameters->param2 = 1; + break; + + case kActionCallback: + if (getCallback() == 1) { + getSavePoints()->push(kEntityTatiana, kEntityAlexei, kAction122288808); + setup_function33(); + } + break; + + case kAction101169422: + parameters->param4 = 1; + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(33, Tatiana, function33) + switch (savepoint.action) { + default: + break; + + case kActionDefault: + getEntities()->clearSequences(kEntityTatiana); + setCallback(1); + setup_updateFromTime(75); + break; + + case kActionCallback: + switch (getCallback()) { + default: + break; + + case 1: + setCallback(2); + setup_updateEntity(kCarRedSleeping, kPosition_7500); + break; + + case 2: + setCallback(3); + setup_function14(); + break; + + case 3: + setup_function34(); + break; + } + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(34, Tatiana, function34) + switch (savepoint.action) { + default: + break; + + case kActionDefault: + setCallback(1); + setup_function16(kTime2097000); + break; + + case kActionCallback: + switch (getCallback()) { + default: + break; + + case 1: + getInventory()->get(kItemFirebird)->location = kObjectLocation1; + if (getEntities()->checkFields19(kEntityPlayer, kCarRedSleeping, kPosition_7850)) + getScenes()->loadSceneFromObject(kObjectCompartmentB); + + getObjects()->update(kObjectCompartmentB, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand); + getObjects()->update(kObject49, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); + setup_function15(); + break; + + case 2: + setCallback(3); + setup_updateEntity(kCarKronos, kPosition_9270); + break; + + case 3: + setup_function35(); + break; + } + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(35, Tatiana, function35) + switch (savepoint.action) { + default: + break; + + case kActionNone: + if (!params->param1 + && getInventory()->hasItem(kItemFirebird) + && getEntities()->checkFields19(kEntityPlayer, kCarRedSleeping, kPosition_7850) + && (getState()->time < kTime2133000 || getProgress().field_40)) { + setCallback(1); + setup_function41(); + break; + } + +label_callback_1: + if (getState()->time > kTime2133000) { + if (getData()->car >= kCarRedSleeping || (getData()->car == kCarGreenSleeping && getData()->entityPosition > kPosition_5790)) + setup_function36(); + } + break; + + case kActionDefault: + getObjects()->update(kObjectCompartmentB, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand); + getObjects()->update(kObject49, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); + getEntities()->clearSequences(kEntityTatiana); + + getData()->car = kCarKronos; + getData()->entityPosition = kPosition_6000; + getData()->location = kLocationInsideCompartment; + break; + + case kActionCallback: + if (getCallback() == 1) { + params->param1 = 1; + goto label_callback_1; + } + break; + + case kAction191668032: + setup_function36(); + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(36, Tatiana, function36) + switch (savepoint.action) { + default: + break; + + case kActionDefault: + getData()->car = kCarGreenSleeping; + getData()->entityPosition = kPosition_850; + getData()->location = kLocationOutsideCompartment; + + setCallback(1); + setup_updateEntity(kCarGreenSleeping, kPosition_7500); + break; + + case kActionCallback: + switch (getCallback()) { + default: + break; + + case 1: + if (!getEntities()->checkFields19(kEntityPlayer, kCarGreenSleeping, kPosition_7850) || getEntities()->isInsideCompartment(kEntityPlayer, kCarRedSleeping, kPosition_8200)) { + setCallback(2); + setup_function14(); + break; + } + + if (getInventory()->hasItem(kItemFirebird)) { + getAction()->playAnimation(kEventTatianaCompartmentStealEgg); + getInventory()->removeItem(kItemFirebird); + getInventory()->get(kItemFirebird)->location = kObjectLocation2; + } else { + getAction()->playAnimation(kEventTatianaCompartment); + } + + getScenes()->loadSceneFromObject(kObjectCompartmentB); + break; + + case 2: + setup_function37(); + break; + } + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(37, Tatiana, function37) + switch (savepoint.action) { + default: + break; + + case kActionNone: + if (getInventory()->get(kItemFirebird)->location != kObjectLocation1 && getInventory()->get(kItemFirebird)->location != kObjectLocation2) { + if(!params->param3) + params->param3 = (uint)getState()->time + 900; + + if (params->param4 != kTimeInvalid && params->param3 < getState()->time) { + UPDATE_PARAM_PROC_TIME(kTime2227500, !getEntities()->isPlayerInCar(kCarRedSleeping), params->param4, 450) + getProgress().field_5C = 1; + if (getEntities()->isInsideCompartment(kEntityAnna, kCarRedSleeping, kPosition_4070)) { + setup_function38(); + break; + } + UPDATE_PARAM_PROC_END + } + } + + if (params->param1) { + UPDATE_PARAM(params->param5, getState()->timeTicks, 75); + + getObjects()->update(kObjectCompartmentB, kEntityTatiana, kObjectLocation1, kCursorNormal, kCursorNormal); + getObjects()->update(kObject49, kEntityTatiana, kObjectLocation1, kCursorNormal, kCursorNormal); + + params->param1 = 0; + params->param2 = 1; + } + + params->param5 = 0; + break; + + case kActionKnock: + case kActionOpenDoor: + if (params->param1) { + getObjects()->update(kObjectCompartmentB, kEntityTatiana, kObjectLocation1, kCursorNormal, kCursorNormal); + getObjects()->update(kObject49, kEntityTatiana, kObjectLocation1, kCursorNormal, kCursorNormal); + + if (savepoint.param.intValue == 49) { + setCallback(4); + setup_playSound(getSound()->justAMinuteCath()); + break; + } + + if (getInventory()->hasItem(kItemPassengerList)) { + setCallback(5); + setup_playSound(rnd(2) ? "CAT1512" : getSound()->wrongDoorCath()); + break; + } + + setCallback(6); + setup_playSound(getSound()->wrongDoorCath()); + break; + } + + if (savepoint.param.intValue == 49) { + + if (getInventory()->hasItem(kItemFirebird)) { + getAction()->playAnimation(kEventTatianaCompartmentStealEgg); + getInventory()->removeItem(kItemFirebird); + getInventory()->get(kItemFirebird)->location = kObjectLocation2; + } else { + getAction()->playAnimation(kEventTatianaCompartment); + } + + getScenes()->loadSceneFromObject(kObjectCompartmentB); + break; + } + + getObjects()->update(kObjectCompartmentB, kEntityTatiana, kObjectLocation1, kCursorNormal, kCursorNormal); + getObjects()->update(kObject49, kEntityTatiana, kObjectLocation1, kCursorNormal, kCursorNormal); + + setCallback(savepoint.action == kActionKnock ? 1 : 2); + setup_playSound(savepoint.action == kActionKnock ? "LIB012" : "LIB013"); + break; + + case kActionDefault: + getObjects()->update(kObjectCompartmentB, kEntityTatiana, kObjectLocation1, kCursorHandKnock, kCursorHand); + getObjects()->update(kObject49, kEntityTatiana, kObjectLocation1, kCursorNormal, kCursorHand); + + getData()->location = kLocationInsideCompartment; + getEntities()->clearSequences(kEntityTatiana); + break; + + case kActionDrawScene: + if (params->param1 || params->param2) { + getObjects()->update(kObjectCompartmentB, kEntityTatiana, kObjectLocation1, kCursorHandKnock, kCursorHand); + getObjects()->update(kObject49, kEntityTatiana, kObjectLocation1, kCursorNormal, kCursorHand); + + params->param1 = 0; + params->param2 = 0; + } + break; + + case kActionCallback: + switch (getCallback()) { + default: + break; + + case 1: + case 2: + setCallback(3); + setup_playSound(rnd(2) ? "TAT1133A" : "TAT1133B"); + break; + + case 3: + getObjects()->update(kObjectCompartmentB, kEntityTatiana, kObjectLocation1, kCursorTalk, kCursorNormal); + getObjects()->update(kObject49, kEntityTatiana, kObjectLocation1, kCursorTalk, kCursorNormal); + params->param1 = 1; + break; + + case 4: + case 5: + case 6: + params->param1 = 0; + params->param2 = 1; + break; + } + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(38, Tatiana, function38) + switch (savepoint.action) { + default: + break; + + case kActionNone: + UPDATE_PARAM(params->param1, getState()->time, 450); + + getEntities()->exitCompartment(kEntityTatiana, kObjectCompartmentF, true); + + setCallback(4); + setup_function42(kCarRedSleeping, kPosition_7500); + break; + + case kActionDefault: + getData()->clothes = kClothes3; + + setCallback(1); + setup_enterExitCompartment("673Jb", kObjectCompartmentB); + break; + + case kActionCallback: + switch (getCallback()) { + default: + break; + + case 1: + getData()->location = kLocationOutsideCompartment; + getObjects()->update(kObjectCompartmentB, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); + getObjects()->update(kObject49, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); + + setCallback(2); + setup_function42(kCarRedSleeping, kPosition_4070); + break; + + case 2: + getEntities()->drawSequenceLeft(kEntityTatiana, "673Gf"); + getEntities()->enterCompartment(kEntityTatiana, kObjectCompartmentF, true); + + setCallback(3); + setup_playSound("Tat3164"); + break; + + case 3: + getSavePoints()->push(kEntityTatiana, kEntityAnna, kAction236241630); + break; + + case 4: + setCallback(5); + setup_enterExitCompartment2("673Db", kObjectCompartmentB); + break; + + case 5: + getData()->location = kLocationInsideCompartment; + getEntities()->clearSequences(kEntityTatiana); + + setup_function39(); + break; + + case 6: + getEntities()->exitCompartment(kEntityTatiana, kObjectCompartmentF, true); + getEntities()->clearSequences(kEntityTatiana); + getData()->location = kLocationInsideCompartment; + + setCallback(7); + setup_playSound("ANN3011"); + break; + + case 7: + setCallback(8); + setup_updateFromTime(900); + break; + + case 8: + setCallback(9); + setup_enterExitCompartment("673Jf", kObjectCompartmentF); + break; + + case 9: + getData()->location = kLocationOutsideCompartment; + + setCallback(10); + setup_function42(kCarRedSleeping, kPosition_7500); + break; + + case 10: + getSavePoints()->push(kEntityTatiana, kEntityAnna, kAction236517970); + + setCallback(11); + setup_enterExitCompartment2("673Db", kObjectCompartmentB); + break; + + case 11: + getData()->location = kLocationInsideCompartment; + getEntities()->clearSequences(kEntityTatiana); + + setup_function39(); + break; + } + break; + + case kAction100906246: + setCallback(6); + setup_enterExitCompartment("673Df", kObjectCompartmentF); + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(39, Tatiana, function39) + switch (savepoint.action) { + default: + break; + + case kActionNone: + if (!params->param1 && getEntities()->isDistanceBetweenEntities(kEntityTatiana, kEntityPlayer, 1000)) { + params->param1 = 1; + getSound()->playSound(kEntityTatiana, "Tat3164"); // Tatiana weeping + } + break; + + case kActionDefault: + getObjects()->update(kObjectCompartmentB, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand); + getObjects()->update(kObject49, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand); + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(40, Tatiana, function40) + switch (savepoint.action) { + default: + break; + + case kActionNone: + if (getEntities()->isInsideTrainCar(kEntityPlayer, kCarKronos) + || getData()->car != getEntityData(kEntityPlayer)->car + || getEntities()->updateEntity(kEntityTatiana, kCarKronos, kPosition_9270)) + CALLBACK_ACTION(); + break; + + case kActionExcuseMe: + if (getEvent(kEventTatianaAskMatchSpeakRussian) || getEvent(kEventTatianaAskMatch) || getEvent(kEventVassiliSeizure)) + getSound()->playSound(kEntityPlayer, rnd(2) ? "CAT1001A" : "CAT1010"); + else + getSound()->excuseMeCath(); + break; + + case kActionDefault: + if (getEntities()->updateEntity(kEntityTatiana, kCarKronos, kPosition_9270)) + CALLBACK_ACTION(); + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(41, Tatiana, function41) + switch (savepoint.action) { + default: + break; + + case kActionNone: + if (!params->param1) + break; + + if (getEntities()->checkFields19(kEntityPlayer, kCarRedSleeping, kPosition_7850) + && !getEvent(kEventVassiliCompartmentStealEgg) + && (getState()->time <= kTime2133000 || getProgress().field_40)) { + if (getEntities()->isInsideCompartment(kEntityPlayer, kCarRedSleeping, kPosition_7500)) { + + getSavePoints()->push(kEntityTatiana, kEntityCoudert, kAction235061888); + getEntities()->clearSequences(kEntityTatiana); + getEntities()->exitCompartment(kEntityTatiana, kObjectCompartmentB, true); + getData()->location = kLocationInsideCompartment; + + if (getInventory()->hasItem(kItemFirebird)) { + getAction()->playAnimation(kEventTatianaCompartmentStealEgg); + getInventory()->removeItem(kItemFirebird); + getInventory()->get(kItemFirebird)->location = kObjectLocation2; + } else { + getAction()->playAnimation(kEventTatianaCompartment); + } + + getScenes()->loadSceneFromObject(kObjectCompartmentB); + + setCallback(4); + setup_updateFromTime(150); + } + } else { + getEntities()->exitCompartment(kEntityTatiana, kObjectCompartmentB, true); + + if (getState()->time < kTime2133000 || getProgress().field_40) { + setCallback(3); + setup_function40(); + break; + } + + getEntities()->clearSequences(kEntityTatiana); + CALLBACK_ACTION(); + } + break; + + case kActionDefault: + getData()->car = kCarRedSleeping; + getData()->entityPosition = kPosition_7500; + getData()->location = kLocationOutsideCompartment; + + RESET_ENTITY_STATE(kEntityCoudert, Coudert, setup_function51); + + getEntities()->drawSequenceLeft(kEntityTatiana, "673Fb"); + getEntities()->enterCompartment(kEntityTatiana, kObjectCompartmentB, true); + break; + + case kActionCallback: + switch (getCallback()) { + default: + break; + + case 1: + setCallback(2); + setup_playSound("Tat3161B"); + break; + + case 2: + getSavePoints()->push(kEntityTatiana, kEntityCoudert, kAction168316032); + params->param1 = 1; + break; + + case 3: + case 6: + getEntities()->clearSequences(kEntityTatiana); + + CALLBACK_ACTION(); + break; + + case 4: + setCallback(5); + setup_function15(); + break; + + case 5: + setCallback(6); + setup_function40(); + break; + } + break; + + case kAction154071333: + getObjects()->update(kObjectCompartmentB, kEntityPlayer, kObjectLocation1, kCursorNormal, kCursorNormal); + getObjects()->update(kObjectCompartmentA, kEntityPlayer, kObjectLocation1, kCursorNormal, kCursorNormal); + + setCallback(1); + setup_savegame(kSavegameTypeTime, kTimeNone); + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION_II(42, Tatiana, function42, CarIndex, EntityPosition) + if (savepoint.action == kActionExcuseMeCath || savepoint.action == kActionExcuseMe) { + getSound()->playSound(kEntityPlayer, "Tat3124", getSound()->getSoundFlag(kEntityTatiana)); + return; + } + + Entity::updateEntity(savepoint); +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(43, Tatiana, chapter4) + switch (savepoint.action) { + default: + break; + + case kActionNone: + setup_chapter4Handler(); + break; + + case kActionDefault: + getEntities()->clearSequences(kEntityTatiana); + + getObjects()->update(kObjectCompartmentB, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand); + getObjects()->update(kObject49, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand); + + getData()->entityPosition = kPosition_7500; + getData()->location = kLocationInsideCompartment; + getData()->car = kCarRedSleeping; + getData()->clothes = kClothes2; + getData()->inventoryItem = kItemNone; + + ENTITY_PARAM(0, 1) = 0; + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(44, Tatiana, chapter4Handler) + switch (savepoint.action) { + default: + break; + + case kActionDefault: + setCallback(1); + setup_function16(kTime2362500); + break; + + case kActionCallback: + if (getCallback() == 1) + setup_function45(); + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(45, Tatiana, function45) + switch (savepoint.action) { + default: + break; + + case kActionDefault: + setCallback(1); + setup_enterExitCompartment("673Bb", kObjectCompartmentB); + break; + + case kActionCallback: + switch (getCallback()) { + default: + break; + + case 1: + getObjects()->update(kObjectCompartmentB, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); + getData()->location = kLocationOutsideCompartment; + + setCallback(1); + setup_updateEntity(kCarGreenSleeping, kPosition_540); + break; + + case 2: + if (getEntities()->isInGreenCarEntrance(kEntityPlayer)) { + getSound()->excuseMe(kEntityTatiana); + + if (getEntities()->isPlayerPosition(kCarGreenSleeping, 62)) + getScenes()->loadSceneFromPosition(kCarGreenSleeping, 72); + } + + getSavePoints()->push(kEntityTatiana, kEntityAlexei, kAction123712592); + setup_function46(); + break; + } + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(46, Tatiana, function46) + // Expose parameters as IIIIIS and ignore the default exposed parameters + EntityData::EntityParametersI5S *parameters = (EntityData::EntityParametersI5S*)_data->getCurrentParameters(); + + switch (savepoint.action) { + default: + break; + + case kActionNone: + if (!parameters->param2 && !parameters->param3) { + parameters->param1 -= getState()->timeDelta; + + if (parameters->param1 < getState()->timeDelta) { + getSound()->playSound(kEntityTatiana, (char *)¶meters->seq); + + if (getEntities()->isDistanceBetweenEntities(kEntityTatiana, kEntityPlayer, 2000)) { + if (parameters->param4 == 4) + getProgress().field_8C = 1; + else if (parameters->param4 == 7) + getProgress().field_88 = 1; + } + + parameters->param2 = 1; + } + } + + if (CURRENT_PARAM(1, 1) == kTimeInvalid || getState()->time <= kTime2394000) + break; + + if (getState()->time >= kTime2398500) { + CURRENT_PARAM(1, 1) = kTimeInvalid; + } else { + if (getEntities()->isInGreenCarEntrance(kEntityPlayer) || !CURRENT_PARAM(1, 1)) + CURRENT_PARAM(1, 1) = (uint)getState()->time; + + if (CURRENT_PARAM(1, 1) >= getState()->time) + break; + + CURRENT_PARAM(1, 1) = kTimeInvalid; + } + + if (getEntities()->isInGreenCarEntrance(kEntityPlayer)) { + getSound()->excuseMe(kEntityTatiana); + + if (getEntities()->isPlayerPosition(kCarGreenSleeping, 62)) + getScenes()->loadSceneFromPosition(kCarGreenSleeping, 72); + } + + getSavePoints()->push(kEntityTatiana, kEntityAlexei, kAction123536024); + + setup_function47(); + break; + + case kActionEndSound: + parameters->param2 = 0; + ++parameters->param4; + + switch(parameters->param4) { + default: + parameters->param1 = 162000; + break; + + case 1: + parameters->param1 = 900; + strcpy((char *)¶meters->seq, "Tat4165F"); + break; + + case 2: + parameters->param1 = 900; + strcpy((char *)¶meters->seq, "Tat4165B"); + break; + + case 3: + parameters->param1 = 1800; + strcpy((char *)¶meters->seq, "Tat4165G"); + break; + + case 4: + parameters->param1 = 900; + strcpy((char *)¶meters->seq, "Tat4165H"); + break; + + case 5: + parameters->param1 = 2700; + strcpy((char *)¶meters->seq, "Tat4165C"); + break; + + case 6: + parameters->param1 = 900; + strcpy((char *)¶meters->seq, "Tat4165D"); + break; + + case 7: + parameters->param1 = 900; + strcpy((char *)¶meters->seq, "Tat4165E"); + break; + } + break; + + case kActionDefault: + getEntities()->drawSequenceLeft(kEntityTatiana, "306E"); + parameters->param1 = 450; + strcpy((char *)¶meters->seq, "Tat4165A"); + break; + + case kActionDrawScene: + if (getEntities()->isInGreenCarEntrance(kEntityPlayer)) { + parameters->param3 = 1; + + if (parameters->param2) { + getSound()->removeFromQueue(kEntityTatiana); + getSavePoints()->call(kEntityTatiana, kEntityTatiana, kActionEndSound); + } + } else { + parameters->param3 = 0; + parameters->param5 = 0; + } + + if (getEntities()->isPlayerPosition(kCarGreenSleeping, 62) && !parameters->param5) { + setCallback(1); + setup_draw("306D"); + } + break; + + case kActionCallback: + if (getCallback() == 1) { + getEntities()->drawSequenceLeft(kEntityTatiana, "306E"); + parameters->param5 = 1; + } + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(47, Tatiana, function47) + switch (savepoint.action) { + default: + break; + + case kActionDefault: + setCallback(1); + setup_updateEntity(kCarRedSleeping, kPosition_7500); + break; + + case kActionCallback: + switch (getCallback()) { + default: + break; + + case 1: + setCallback(2); + setup_enterExitCompartment2("673Db", kObjectCompartmentB); + break; + + case 2: + getData()->location = kLocationInsideCompartment; + getEntities()->clearSequences(kEntityTatiana); + + setCallback(3); + setup_function16(kTime2407500); + break; + + case 3: + case 4: + if (ENTITY_PARAM(0, 1) && getObjects()->get(kObjectCompartment1).location2 == kObjectLocation1) { + setup_function48(); + } else { + setCallback(4); + setup_function16(900); + } + break; + } + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(48, Tatiana, function48) + switch (savepoint.action) { + default: + break; + + case kActionNone: + if (!params->param1) { + if (!getEvent(kEventTatianaTylerCompartment) && getEntities()->isInsideCompartment(kEntityPlayer, kCarGreenSleeping, kPosition_8200)) { + params->param1 = 1; + getProgress().field_E4 = 1; + getObjects()->update(kObjectCompartment1, kEntityTatiana, getObjects()->get(kObjectCompartment1).location, kCursorNormal, kCursorHand); + } + + if (!params->param1) + goto label_end; + } + + if (!getEntities()->checkFields19(kEntityPlayer, kCarGreenSleeping, kPosition_7850)) { + getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).location, kCursorHandKnock, kCursorHand); + params->param1 = 0; + } + + if (!params->param1 || getSound()->isBuffered(kEntityTatiana)) + goto label_end; + + UPDATE_PARAM_GOTO(params->param2, getState()->timeTicks, 5 * (3 * rnd(5) + 30), label_end); + + getSound()->playSound(kEntityTatiana, "LIB012", SoundManager::kFlagDefault); + params->param2 = 0; + +label_end: + if (getEvent(kEventTatianaTylerCompartment) || getState()->time > kTime2475000) { + if (params->param1) + getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).location, kCursorHandKnock, kCursorHand); + + getProgress().field_E4 = 0; + getEntities()->exitCompartment(kEntityTatiana, kObjectCompartment2, true); + + setCallback(3); + setup_updateEntity(kCarRedSleeping, kPosition_7500); + } + break; + + case kActionOpenDoor: + params->param1 = 0; + + getObjects()->update(kObjectCompartment1, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); + + setCallback(5); + setup_savegame(kSavegameTypeEvent, kEventTatianaTylerCompartment); + break; + + case kActionDefault: + setCallback(1); + setup_enterExitCompartment("673Bb", kObjectCompartmentB); + break; + + case kActionCallback: + switch (getCallback()) { + default: + break; + + case 1: + getObjects()->update(kObjectCompartmentB, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); + getData()->location = kLocationOutsideCompartment; + + setCallback(2); + setup_updateEntity(kCarGreenSleeping, kPosition_7500); + break; + + case 2: + getEntities()->drawSequenceLeft(kEntityTatiana, "673Fb"); + getEntities()->enterCompartment(kEntityTatiana, kObjectCompartment2, true); + break; + + case 3: + setCallback(4); + setup_enterExitCompartment2("673Db", kObjectCompartmentB); + break; + + case 4: + getData()->location = kLocationInsideCompartment; + getEntities()->clearSequences(kEntityTatiana); + + setup_function49(); + break; + + case 5: + getObjects()->update(kObjectOutsideTylerCompartment, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue); + getAction()->playAnimation(kEventTatianaTylerCompartment); + getSound()->playSound(kEntityPlayer, "LIB015"); + getScenes()->loadScene(kScene41); + break; + + case 6: + setCallback(7); + setup_updateEntity(kCarGreenSleeping, kPosition_7500); + break; + + case 7: + getEntities()->drawSequenceLeft(kEntityTatiana, "673Fb"); + getEntities()->enterCompartment(kEntityTatiana, kObjectCompartment2, true); + break; + } + break; + + case kAction238790488: + params->param1 = 0; + + getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).location, kCursorHandKnock, kCursorHand); + getEntities()->exitCompartment(kEntityTatiana, kObjectCompartment2, true); + getEntities()->clearSequences(kEntityTatiana); + + getData()->car = kCarGreenSleeping; + getData()->entityPosition = kPosition_9460; + + setCallback(6); + setup_updateFromTime(1800); + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(49, Tatiana, function49) + switch (savepoint.action) { + default: + break; + + case kActionDefault: + getData()->entityPosition = kPosition_7500; + getData()->location = kLocationInsideCompartment; + getData()->car = kCarRedSleeping; + + getObjects()->update(kObjectCompartmentB, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand); + getObjects()->update(kObject49, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand); + break; + + case kAction169360385: + setup_function50(); + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(50, Tatiana, function50) + switch (savepoint.action) { + default: + break; + + case kActionNone: + if (getState()->time > kTime2520000 && !params->param1) { + params->param1 = 1; + setup_function51(); + } + break; + + case kActionEndSound: + getSound()->playSound(kEntityTatiana, "Tat4166"); + break; + + case kActionKnock: + if (!getSound()->isBuffered("LIB012", true)) + getSound()->playSound(kEntityPlayer, "LIB012"); + break; + + case kActionOpenDoor: + getSound()->playSound(kEntityPlayer, "LIB014"); + + setCallback(1); + setup_savegame(kSavegameTypeEvent, kEventVassiliDeadAlexei); + break; + + case kActionDefault: + getData()->entityPosition = kPosition_8200; + getData()->location = kLocationInsideCompartment; + getData()->car = kCarRedSleeping; + + getObjects()->update(kObjectCompartmentB, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); + getObjects()->update(kObject49, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand); + getObjects()->update(kObject48, kEntityTatiana, kObjectLocationNone, kCursorHandKnock, kCursorHand); + getObjects()->update(kObjectCompartmentA, kEntityTatiana, kObjectLocationNone, kCursorHandKnock, kCursorHand); + + if (!getSound()->isBuffered(kEntityTatiana)) + getSound()->playSound(kEntityTatiana, "Tat4166"); + break; + + case kActionCallback: + if (getCallback() == 1) { + if (getSound()->isBuffered("MUS013")) + getSound()->processEntry("MUS013"); + + getAction()->playAnimation(kEventVassiliDeadAlexei); + getSavePoints()->push(kEntityTatiana, kEntityAbbot, kAction104060776); + getScenes()->loadSceneFromPosition(kCarRedSleeping, 38); + + setup_function51(); + } + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(51, Tatiana, function51) + if (savepoint.action == kActionDefault) { + getObjects()->update(kObjectCompartmentA, kEntityPlayer, kObjectLocation1, kCursorNormal, kCursorNormal); + getObjects()->update(kObject48, kEntityPlayer, kObjectLocation1, kCursorNormal, kCursorNormal); + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(52, Tatiana, chapter5) + switch (savepoint.action) { + default: + break; + + case kActionNone: + setup_chapter5Handler(); + break; + + case kActionDefault: + getEntities()->clearSequences(kEntityTatiana); + + getData()->entityPosition = kPosition_3969; + getData()->location = kLocationInsideCompartment; + getData()->car = kCarRestaurant; + getData()->clothes = kClothesDefault; + getData()->inventoryItem = kItemNone; + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(53, Tatiana, chapter5Handler) + if (savepoint.action == kActionProceedChapter5) + setup_function54(); +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(54, Tatiana, function54) + switch (savepoint.action) { + default: + break; + + case kActionNone: + if (!params->param2) { + switch (params->param1) { + default: + break; + + case 0: + getSound()->playSound(kEntityTatiana, "Tat5167A"); + params->param2 = 1; + break; + + case 1: + getSound()->playSound(kEntityTatiana, "Tat5167B"); + params->param2 = 1; + break; + + case 2: + getSound()->playSound(kEntityTatiana, "Tat5167C"); + params->param2 = 1; + break; + + case 3: + getSound()->playSound(kEntityTatiana, "Tat5167D"); + params->param2 = 1; + break; + } + } + + if (params->param1 > 3) { + UPDATE_PARAM(params->param3, getState()->timeTicks, 225); + + params->param1 = 0; + params->param3 = 0; + } + break; + + case kAction1: + getData()->inventoryItem = kItemNone; + + setCallback(1); + setup_savegame(kSavegameTypeEvent, kEventTatianaVassiliTalk); + break; + + case kActionEndSound: + ++params->param1; + params->param2 = 0; + break; + + case kActionDefault: + getEntities()->drawSequenceLeft(kEntityTatiana, "033A"); + getData()->inventoryItem = kItemInvalid; + break; + + case kActionCallback: + if (getCallback() == 1) { + if (getSound()->isBuffered("MUS050")) + getSound()->processEntry("MUS050"); + + if (getSound()->isBuffered(kEntityTatiana)) + getSound()->processEntry(kEntityTatiana); + + getAction()->playAnimation(isNight() ? kEventTatianaVassiliTalkNight : kEventTatianaVassiliTalk); + getScenes()->processScene(); + + params->param1 = 4; + params->param2 = 0; + params->param3 = 0; + } + break; + + case kAction203078272: + getEntities()->drawSequenceLeft(kEntityTatiana, "033E"); + break; + + case kAction236060709: + getData()->inventoryItem = kItemNone; + setup_function55(); + break; + } +} + +////////////////////////////////////////////////////////////////////////// +IMPLEMENT_FUNCTION(55, Tatiana, function55) + switch (savepoint.action) { + default: + break; + + case kActionDefault: + getEntities()->clearSequences(kEntityTatiana); + // fall back to next action + + case kActionDrawScene: + if (getEntities()->isPlayerPosition(kCarRestaurant, 72)) + getScenes()->loadSceneFromPosition(kCarRestaurant, 86); + break; + } +} + +} // End of namespace LastExpress |