/* 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_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION_S(2, Tatiana, playSound) Entity::playSound(savepoint); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION_S(3, Tatiana, draw) Entity::draw(savepoint); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION_SII(4, Tatiana, updatePosition, CarIndex, Position) Entity::updatePosition(savepoint); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION_SI(5, Tatiana, enterExitCompartment, ObjectIndex) Entity::enterExitCompartment(savepoint); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION_SI(6, Tatiana, enterExitCompartment2, ObjectIndex) Entity::enterExitCompartment(savepoint, kPosition_7500, kPosition_7850, kCarRedSleeping, kObjectCompartmentB); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION_SIIS(7, Tatiana, callSavepoint, EntityIndex, ActionIndex) Entity::callSavepoint(savepoint); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION(8, Tatiana, callbackActionOnDirection) Entity::callbackActionOnDirection(savepoint); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION_NOSETUP(9, Tatiana, updateFromTicks) Entity::updateFromTicks(savepoint); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION_I(10, Tatiana, updateFromTime, uint32) Entity::updateFromTime(savepoint); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION(11, Tatiana, callbackActionRestaurantOrSalon) Entity::callbackActionRestaurantOrSalon(savepoint); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION_II(12, Tatiana, savegame, SavegameType, uint32) Entity::savegame(savepoint); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// IMPLEMENT_FUNCTION(53, Tatiana, chapter5Handler) if (savepoint.action == kActionProceedChapter5) setup_function54(); IMPLEMENT_FUNCTION_END ////////////////////////////////////////////////////////////////////////// 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_END ////////////////////////////////////////////////////////////////////////// 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; } IMPLEMENT_FUNCTION_END } // End of namespace LastExpress