Evgeny Grechnikov 54562554f9 LASTEXPRESS: better names in sound code
Refactoring, no changes in behaviour.
2018-10-18 00:38:01 +03:00

2279 lines
64 KiB
C++

/* 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.
*
*/
#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/state.h"
#include "lastexpress/sound/queue.h"
#include "lastexpress/lastexpress.h"
namespace LastExpress {
Tatiana::Tatiana(LastExpressEngine *engine) : Entity(engine, kEntityTatiana) {
ADD_CALLBACK_FUNCTION(Tatiana, reset);
ADD_CALLBACK_FUNCTION_S(Tatiana, playSound);
ADD_CALLBACK_FUNCTION_S(Tatiana, draw);
ADD_CALLBACK_FUNCTION_SII(Tatiana, updatePosition);
ADD_CALLBACK_FUNCTION_SI(Tatiana, enterExitCompartment);
ADD_CALLBACK_FUNCTION_SI(Tatiana, enterExitCompartment2);
ADD_CALLBACK_FUNCTION_SIIS(Tatiana, callSavepoint);
ADD_CALLBACK_FUNCTION(Tatiana, callbackActionOnDirection);
ADD_CALLBACK_FUNCTION_I(Tatiana, updateFromTicks);
ADD_CALLBACK_FUNCTION_I(Tatiana, updateFromTime);
ADD_CALLBACK_FUNCTION(Tatiana, callbackActionRestaurantOrSalon);
ADD_CALLBACK_FUNCTION_II(Tatiana, savegame);
ADD_CALLBACK_FUNCTION_II(Tatiana, updateEntity);
ADD_CALLBACK_FUNCTION(Tatiana, enterCompartment);
ADD_CALLBACK_FUNCTION(Tatiana, exitCompartment);
ADD_CALLBACK_FUNCTION_I(Tatiana, handleCompartment);
ADD_CALLBACK_FUNCTION(Tatiana, chapter1);
ADD_CALLBACK_FUNCTION(Tatiana, function18);
ADD_CALLBACK_FUNCTION(Tatiana, chapter1Handler);
ADD_CALLBACK_FUNCTION(Tatiana, exitDining);
ADD_CALLBACK_FUNCTION(Tatiana, returnToCompartment);
ADD_CALLBACK_FUNCTION(Tatiana, getSomeAir);
ADD_CALLBACK_FUNCTION(Tatiana, returnToCompartmentAgain);
ADD_CALLBACK_FUNCTION(Tatiana, function24);
ADD_CALLBACK_FUNCTION(Tatiana, chapter2);
ADD_CALLBACK_FUNCTION(Tatiana, chapter2Handler);
ADD_CALLBACK_FUNCTION(Tatiana, breakfastClick);
ADD_CALLBACK_FUNCTION(Tatiana, joinAlexei);
ADD_CALLBACK_FUNCTION(Tatiana, leaveBreakfast);
ADD_CALLBACK_FUNCTION(Tatiana, returnToCompartment2);
ADD_CALLBACK_FUNCTION(Tatiana, chapter3);
ADD_CALLBACK_FUNCTION_TYPE2(Tatiana, playChess, EntityParametersI5S, EntityParametersSIII);
ADD_CALLBACK_FUNCTION(Tatiana, returnToCompartment3);
ADD_CALLBACK_FUNCTION(Tatiana, beforeConcert);
ADD_CALLBACK_FUNCTION(Tatiana, concert);
ADD_CALLBACK_FUNCTION(Tatiana, leaveConcert);
ADD_CALLBACK_FUNCTION(Tatiana, afterConcert);
ADD_CALLBACK_FUNCTION(Tatiana, cryAnna);
ADD_CALLBACK_FUNCTION(Tatiana, function39);
ADD_CALLBACK_FUNCTION(Tatiana, function40);
ADD_CALLBACK_FUNCTION(Tatiana, trapCath);
ADD_CALLBACK_FUNCTION_II(Tatiana, function42);
ADD_CALLBACK_FUNCTION(Tatiana, chapter4);
ADD_CALLBACK_FUNCTION(Tatiana, inCompartment4);
ADD_CALLBACK_FUNCTION(Tatiana, meetAlexei);
ADD_CALLBACK_FUNCTION_TYPE(Tatiana, withAlexei, EntityParametersI5S);
ADD_CALLBACK_FUNCTION(Tatiana, thinking);
ADD_CALLBACK_FUNCTION(Tatiana, seekCath);
ADD_CALLBACK_FUNCTION(Tatiana, function49);
ADD_CALLBACK_FUNCTION(Tatiana, alexeiDead);
ADD_CALLBACK_FUNCTION(Tatiana, function51);
ADD_CALLBACK_FUNCTION(Tatiana, chapter5);
ADD_CALLBACK_FUNCTION(Tatiana, chapter5Handler);
ADD_CALLBACK_FUNCTION(Tatiana, autistic);
ADD_CALLBACK_FUNCTION(Tatiana, function55);
}
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION(1, Tatiana, reset)
Entity::reset(savepoint, kClothes3, 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, enterCompartment)
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);
callbackAction();
}
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, exitCompartment)
switch (savepoint.action) {
default:
break;
case kActionDefault:
setCallback(getProgress().chapter == kChapter1 ? 1 : 2);
setup_enterExitCompartment(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);
callbackAction();
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION_I(16, Tatiana, handleCompartment, 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);
callbackAction();
break;
}
if (params->param2) {
if (!Entity::updateParameter(params->param5, getState()->timeTicks, 75))
break;
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:
Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Tatiana, 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) {
if (Entity::updateParameter(params->param3, getState()->time, 4500)) {
getEntities()->drawSequenceRight(kEntityTatiana, "806DS");
params->param1 = 1;
}
}
}
if (getData()->entityPosition <= kPosition_2330) {
getSavePoints()->push(kEntityTatiana, kEntityAlexei, kAction157159392);
getEntities()->clearSequences(kEntityTatiana);
callbackAction();
}
break;
case kActionExitCompartment:
getSavePoints()->push(kEntityTatiana, kEntityAlexei, kAction188784532);
callbackAction();
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 (getSoundQueue()->isBuffered(kEntityTatiana) || !params->param4 || params->param3 >= 2 || getSoundQueue()->isBuffered("TAT1066"))
goto label_tatiana_chapter1_2;
if (Entity::updateParameter(params->param5, getState()->timeTicks, 450)) {
getSound()->playSound(kEntityTatiana, params->param3 ? "TAT1069B" : "TAT1069A");
getProgress().field_64 = 1;
params->param3++;
params->param5 = 0;
}
if (getEntities()->isPlayerPosition(kCarRestaurant, 71)) {
if (Entity::updateParameter(params->param6, getState()->timeTicks, 75)) {
getSound()->playSound(kEntityTatiana, params->param3 ? "TAT1069B" : "TAT1069A");
getProgress().field_64 = 1;
params->param3++;
params->param6 = 0;
}
}
label_tatiana_chapter1_2:
Entity::timeCheckSavepoint(kTime1084500, params->param7, kEntityTatiana, kEntityPascale, kAction257489762);
if (params->param1) {
if (!Entity::updateParameter(params->param8, getState()->timeTicks, 90))
break;
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_exitDining();
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION(20, Tatiana, exitDining)
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, kEntityWaiter1, kAction188893625);
setCallback(3);
setup_function18();
break;
case 3:
getSavePoints()->push(kEntityTatiana, kEntityAugust, kAction268620864);
setup_returnToCompartment();
break;
}
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION(21, Tatiana, returnToCompartment)
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);
// fall through
case 3:
if (getSoundQueue()->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_handleCompartment(kTime1156500);
break;
case 5:
case 6:
if (getProgress().field_14 == 29) {
setCallback(6);
setup_handleCompartment((uint)getState()->time + 900);
} else {
getObjects()->update(kObject49, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
setup_getSomeAir();
}
break;
}
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION(22, Tatiana, getSomeAir)
switch (savepoint.action) {
default:
break;
case kActionNone:
if (params->param1 == kTimeInvalid || getState()->time <= kTime1179000)
goto label_update;
if (!Entity::updateParameterTime(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);
}
break;
}
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_returnToCompartmentAgain();
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_exitCompartment();
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, returnToCompartmentAgain)
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_enterCompartment();
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_joinAlexei();
}
break;
case kAction1:
getData()->inventoryItem = kItemNone;
setup_breakfastClick();
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_breakfastClick();
}
break;
case kAction290869168:
params->param1 = 1;
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION(27, Tatiana, breakfastClick)
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_atBreakfast);
getAction()->playAnimation(kEventTatianaBreakfastAlexei);
getInventory()->addItem(kItemParchemin);
getInventory()->setLocationAndProcess(kItem11, kObjectLocation1);
setup_joinAlexei();
break;
case 2:
RESET_ENTITY_STATE(kEntityAlexei, Alexei, setup_atBreakfast);
getAction()->playAnimation(kEventTatianaBreakfast);
if (getInventory()->hasItem(kItemParchemin)) {
getAction()->playAnimation(kEventTatianaBreakfastGivePoem);
getInventory()->removeItem(kItemParchemin);
} else {
getAction()->playAnimation(kEventTatianaAlexei);
}
setup_joinAlexei();
break;
}
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION(28, Tatiana, joinAlexei)
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_leaveBreakfast();
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, leaveBreakfast)
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, kEntityWaiter2, kAction302203328);
getEntities()->drawSequenceRight(kEntityTatiana, "805DS");
if (getEntities()->isInRestaurant(kEntityPlayer))
getEntities()->updateFrame(kEntityTatiana);
setCallback(3);
setup_callbackActionOnDirection();
break;
case 3:
setup_returnToCompartment2();
break;
}
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION(30, Tatiana, returnToCompartment2)
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_enterCompartment();
break;
case 2:
setCallback(3);
setup_handleCompartment(kTimeEnd);
break;
}
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION(31, Tatiana, chapter3)
switch (savepoint.action) {
default:
break;
case kActionNone:
setup_playChess();
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, playChess)
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 *)&parameters1->seq);
getSound()->playSound(kEntityTatiana, (char *)&parameters->seq);
if (parameters->param3 == 4 && getEntities()->isInSalon(kEntityPlayer))
getProgress().field_90 = 1;
parameters->param2 = 1;
}
}
if (parameters->param4 && parameters->param5) {
if (Entity::updateParameterCheck(parameters1->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 *)&parameters->seq, "Tat3160B");
strcpy((char *)&parameters1->seq, "110A");
break;
case 2:
parameters->param1 = 9000;
strcpy((char *)&parameters->seq, "Tat3160C");
strcpy((char *)&parameters1->seq, "110C");
break;
case 3:
parameters->param1 = 13500;
getEntities()->drawSequenceLeft(kEntityTatiana, "110B");
strcpy((char *)&parameters->seq, "Tat3160D");
strcpy((char *)&parameters1->seq, "110D");
break;
case 4:
parameters->param1 = 9000;
getEntities()->drawSequenceLeft(kEntityTatiana, "110B");
strcpy((char *)&parameters->seq, "Tat3160E");
strcpy((char *)&parameters1->seq, "110D");
break;
case 5:
parameters->param1 = 4500;
getEntities()->drawSequenceLeft(kEntityTatiana, "110B");
strcpy((char *)&parameters->seq, "Tat3160G");
strcpy((char *)&parameters1->seq, "110D");
break;
case 6:
parameters->param1 = 4500;
getEntities()->drawSequenceLeft(kEntityTatiana, "110B");
strcpy((char *)&parameters->seq, "Tat3160F");
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_returnToCompartment3();
}
break;
case kAction101169422:
parameters->param4 = 1;
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION(33, Tatiana, returnToCompartment3)
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_enterCompartment();
break;
case 3:
setup_beforeConcert();
break;
}
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION(34, Tatiana, beforeConcert)
switch (savepoint.action) {
default:
break;
case kActionDefault:
setCallback(1);
setup_handleCompartment(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);
setCallback(2);
setup_exitCompartment();
break;
case 2:
setCallback(3);
setup_updateEntity(kCarKronos, kPosition_9270);
break;
case 3:
setup_concert();
break;
}
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION(35, Tatiana, concert)
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_trapCath();
break;
}
label_callback_1:
if (getState()->time > kTime2133000) {
if (getEntityData(kEntityAugust)->car >= kCarRedSleeping || (getEntityData(kEntityAugust)->car == kCarGreenSleeping && getEntityData(kEntityAugust)->entityPosition > kPosition_5790))
setup_leaveConcert();
}
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_leaveConcert();
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION(36, Tatiana, leaveConcert)
switch (savepoint.action) {
default:
break;
case kActionDefault:
getData()->car = kCarGreenSleeping;
getData()->entityPosition = kPosition_850;
getData()->location = kLocationOutsideCompartment;
setCallback(1);
setup_updateEntity(kCarRedSleeping, kPosition_7500);
break;
case kActionCallback:
switch (getCallback()) {
default:
break;
case 1:
if (!getEntities()->checkFields19(kEntityPlayer, kCarRedSleeping, kPosition_7850) || getEntities()->isInsideCompartment(kEntityPlayer, kCarRedSleeping, kPosition_8200)) {
setCallback(2);
setup_enterCompartment();
break;
}
if (getInventory()->hasItem(kItemFirebird)) {
getAction()->playAnimation(kEventTatianaCompartmentStealEgg);
getInventory()->removeItem(kItemFirebird);
getInventory()->get(kItemFirebird)->location = kObjectLocation2;
} else {
getAction()->playAnimation(kEventTatianaCompartment);
}
getScenes()->loadSceneFromObject(kObjectCompartmentB);
setup_afterConcert();
break;
case 2:
setup_afterConcert();
break;
}
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION(37, Tatiana, afterConcert)
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) {
if (Entity::updateParameterTime(kTime2227500, !getEntities()->isPlayerInCar(kCarRedSleeping), params->param4, 450)) {
getProgress().field_5C = 1;
if (getEntities()->isInsideCompartment(kEntityAnna, kCarRedSleeping, kPosition_4070)) {
setup_cryAnna();
break;
}
}
}
}
if (params->param1) {
if (!Entity::updateParameter(params->param5, getState()->timeTicks, 75))
break;
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, cryAnna)
switch (savepoint.action) {
default:
break;
case kActionNone:
if (!Entity::updateParameter(params->param1, getState()->time, 450))
break;
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))
callbackAction();
break;
case kActionExcuseMe:
if (getEvent(kEventTatianaAskMatchSpeakRussian) || getEvent(kEventTatianaAskMatch) || getEvent(kEventVassiliSeizure))
getSound()->playSound(kEntityPlayer, rnd(2) ? "CAT1010A" : "CAT1010");
else
getSound()->excuseMeCath();
break;
case kActionDefault:
if (getEntities()->updateEntity(kEntityTatiana, kCarKronos, kPosition_9270))
callbackAction();
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION(41, Tatiana, trapCath)
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);
callbackAction();
}
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);
callbackAction();
break;
case 4:
setCallback(5);
setup_exitCompartment();
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_inCompartment4();
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, inCompartment4)
switch (savepoint.action) {
default:
break;
case kActionDefault:
setCallback(1);
setup_handleCompartment(kTime2362500);
break;
case kActionCallback:
if (getCallback() == 1)
setup_meetAlexei();
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION(45, Tatiana, meetAlexei)
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(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);
}
getSavePoints()->push(kEntityTatiana, kEntityAlexei, kAction123712592);
setup_withAlexei();
break;
}
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION(46, Tatiana, withAlexei)
// 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 *)&parameters->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_thinking();
break;
case kActionEndSound:
parameters->param2 = 0;
++parameters->param4;
switch(parameters->param4) {
default:
parameters->param1 = 162000;
break;
case 1:
parameters->param1 = 900;
strcpy((char *)&parameters->seq, "Tat4165F");
break;
case 2:
parameters->param1 = 900;
strcpy((char *)&parameters->seq, "Tat4165B");
break;
case 3:
parameters->param1 = 1800;
strcpy((char *)&parameters->seq, "Tat4165G");
break;
case 4:
parameters->param1 = 900;
strcpy((char *)&parameters->seq, "Tat4165H");
break;
case 5:
parameters->param1 = 2700;
strcpy((char *)&parameters->seq, "Tat4165C");
break;
case 6:
parameters->param1 = 900;
strcpy((char *)&parameters->seq, "Tat4165D");
break;
case 7:
parameters->param1 = 900;
strcpy((char *)&parameters->seq, "Tat4165E");
break;
}
break;
case kActionDefault:
getEntities()->drawSequenceLeft(kEntityTatiana, "306E");
parameters->param1 = 450;
strcpy((char *)&parameters->seq, "Tat4165A");
break;
case kActionDrawScene:
if (getEntities()->isInGreenCarEntrance(kEntityPlayer)) {
parameters->param3 = 1;
if (parameters->param2) {
getSoundQueue()->stop(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, thinking)
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_handleCompartment(kTime2407500);
break;
case 3:
case 4:
if (ENTITY_PARAM(0, 1) && getObjects()->get(kObjectCompartment1).model == kObjectModel1) {
setup_seekCath();
} else {
setCallback(4);
setup_handleCompartment(900);
}
break;
}
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION(48, Tatiana, seekCath)
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).status, kCursorNormal, kCursorHand);
}
if (!params->param1)
goto label_end;
}
if (!getEntities()->checkFields19(kEntityPlayer, kCarGreenSleeping, kPosition_7850)) {
getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).status, kCursorHandKnock, kCursorHand);
params->param1 = 0;
}
if (!params->param1 || getSoundQueue()->isBuffered(kEntityTatiana))
goto label_end;
if (!Entity::updateParameter(params->param2, getState()->timeTicks, 5 * (3 * rnd(5) + 30)))
goto label_end;
getSound()->playSound(kEntityTatiana, "LIB012", kVolumeFull);
params->param2 = 0;
label_end:
if (getEvent(kEventTatianaTylerCompartment) || getState()->time > kTime2475000) {
if (params->param1)
getObjects()->update(kObjectCompartment1, kEntityPlayer, getObjects()->get(kObjectCompartment1).status, 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).status, 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_alexeiDead();
break;
}
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION(50, Tatiana, alexeiDead)
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 (!getSoundQueue()->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 (!getSoundQueue()->isBuffered(kEntityTatiana))
getSound()->playSound(kEntityTatiana, "Tat4166");
break;
case kActionCallback:
if (getCallback() == 1) {
if (getSoundQueue()->isBuffered("MUS013"))
getSoundQueue()->fade("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_autistic();
IMPLEMENT_FUNCTION_END
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_FUNCTION(54, Tatiana, autistic)
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) {
if (!Entity::updateParameter(params->param3, getState()->timeTicks, 225))
break;
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 (getSoundQueue()->isBuffered("MUS050"))
getSoundQueue()->fade("MUS050");
if (getSoundQueue()->isBuffered(kEntityTatiana))
getSoundQueue()->fade(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 through
case kActionDrawScene:
if (getEntities()->isPlayerPosition(kCarRestaurant, 72))
getScenes()->loadSceneFromPosition(kCarRestaurant, 86);
break;
}
IMPLEMENT_FUNCTION_END
} // End of namespace LastExpress