1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  *
21  */
22 
23 #include "lastexpress/entities/alexei.h"
24 
25 #include "lastexpress/game/action.h"
26 #include "lastexpress/game/entities.h"
27 #include "lastexpress/game/inventory.h"
28 #include "lastexpress/game/logic.h"
29 #include "lastexpress/game/object.h"
30 #include "lastexpress/game/savepoint.h"
31 #include "lastexpress/game/scenes.h"
32 #include "lastexpress/game/state.h"
33 
34 #include "lastexpress/lastexpress.h"
35 
36 namespace LastExpress {
37 
Alexei(LastExpressEngine * engine)38 Alexei::Alexei(LastExpressEngine *engine) : Entity(engine, kEntityAlexei) {
39 	ADD_CALLBACK_FUNCTION(Alexei, reset);
40 	ADD_CALLBACK_FUNCTION_S(Alexei, playSound);
41 	ADD_CALLBACK_FUNCTION_I(Alexei, updateFromTime);
42 	ADD_CALLBACK_FUNCTION_S(Alexei, draw);
43 	ADD_CALLBACK_FUNCTION_SII(Alexei, updatePosition);
44 	ADD_CALLBACK_FUNCTION_SI(Alexei, enterExitCompartment);
45 	ADD_CALLBACK_FUNCTION(Alexei, callbackActionOnDirection);
46 	ADD_CALLBACK_FUNCTION_SIIS(Alexei, callSavepoint);
47 	ADD_CALLBACK_FUNCTION_II(Alexei, savegame);
48 	ADD_CALLBACK_FUNCTION_II(Alexei, updateEntity);
49 	ADD_CALLBACK_FUNCTION_SSI(Alexei, draw2);
50 	ADD_CALLBACK_FUNCTION(Alexei, callbackActionRestaurantOrSalon);
51 	ADD_CALLBACK_FUNCTION(Alexei, enterComparment);
52 	ADD_CALLBACK_FUNCTION(Alexei, exitCompartment);
53 	ADD_CALLBACK_FUNCTION(Alexei, pacingAtWindow);
54 	ADD_CALLBACK_FUNCTION_IS(Alexei, compartmentLogic);
55 	ADD_CALLBACK_FUNCTION(Alexei, chapter1);
56 	ADD_CALLBACK_FUNCTION(Alexei, atDinner);
57 	ADD_CALLBACK_FUNCTION(Alexei, returnCompartment);
58 	ADD_CALLBACK_FUNCTION(Alexei, goSalon);
59 	ADD_CALLBACK_FUNCTION(Alexei, sitting);
60 	ADD_CALLBACK_FUNCTION(Alexei, standingAtWindow);
61 	ADD_CALLBACK_FUNCTION(Alexei, waitingForTatiana);
62 	ADD_CALLBACK_FUNCTION(Alexei, upset);
63 	ADD_CALLBACK_FUNCTION(Alexei, returnCompartmentNight);
64 	ADD_CALLBACK_FUNCTION(Alexei, function26);
65 	ADD_CALLBACK_FUNCTION(Alexei, function27);
66 	ADD_CALLBACK_FUNCTION(Alexei, chapter2);
67 	ADD_CALLBACK_FUNCTION(Alexei, inCompartment2);
68 	ADD_CALLBACK_FUNCTION(Alexei, atBreakfast);
69 	ADD_CALLBACK_FUNCTION(Alexei, returnCompartment2);
70 	ADD_CALLBACK_FUNCTION(Alexei, chapter3);
71 	ADD_CALLBACK_FUNCTION(Alexei, playingChess);
72 	ADD_CALLBACK_FUNCTION(Alexei, inPart3);
73 	ADD_CALLBACK_FUNCTION(Alexei, pacing3);
74 	ADD_CALLBACK_FUNCTION(Alexei, goSalon3);
75 	ADD_CALLBACK_FUNCTION(Alexei, chapter4);
76 	ADD_CALLBACK_FUNCTION(Alexei, inCompartment4);
77 	ADD_CALLBACK_FUNCTION(Alexei, meetTatiana);
78 	ADD_CALLBACK_FUNCTION(Alexei, leavePlatform);
79 	ADD_CALLBACK_FUNCTION(Alexei, inCompartmentAgain);
80 	ADD_CALLBACK_FUNCTION(Alexei, goSalon4);
81 	ADD_CALLBACK_FUNCTION(Alexei, pacing);
82 	ADD_CALLBACK_FUNCTION(Alexei, goToPlatform);
83 	ADD_CALLBACK_FUNCTION(Alexei, returnCompartment4);
84 	ADD_CALLBACK_FUNCTION(Alexei, bombPlanB);
85 	ADD_CALLBACK_FUNCTION(Alexei, function47);
86 	ADD_CALLBACK_FUNCTION(Alexei, chapter5);
87 }
88 
89 //////////////////////////////////////////////////////////////////////////
90 IMPLEMENT_FUNCTION(1, Alexei, reset)
91 	Entity::reset(savepoint);
92 IMPLEMENT_FUNCTION_END
93 
94 //////////////////////////////////////////////////////////////////////////
95 IMPLEMENT_FUNCTION_S(2, Alexei, playSound)
96 	Entity::playSound(savepoint);
97 IMPLEMENT_FUNCTION_END
98 
99 //////////////////////////////////////////////////////////////////////////
100 IMPLEMENT_FUNCTION_I(3, Alexei, updateFromTime, uint32)
101 	Entity::updateFromTime(savepoint);
102 IMPLEMENT_FUNCTION_END
103 
104 //////////////////////////////////////////////////////////////////////////
105 IMPLEMENT_FUNCTION_S(4, Alexei, draw)
106 	Entity::draw(savepoint);
107 IMPLEMENT_FUNCTION_END
108 
109 //////////////////////////////////////////////////////////////////////////
110 IMPLEMENT_FUNCTION_SII(5, Alexei, updatePosition, CarIndex, Position)
111 	Entity::updatePosition(savepoint);
112 IMPLEMENT_FUNCTION_END
113 
114 //////////////////////////////////////////////////////////////////////////
115 IMPLEMENT_FUNCTION_SI(6, Alexei, enterExitCompartment, ObjectIndex)
116 	Entity::enterExitCompartment(savepoint);
117 IMPLEMENT_FUNCTION_END
118 
119 //////////////////////////////////////////////////////////////////////////
120 IMPLEMENT_FUNCTION(7, Alexei, callbackActionOnDirection)
121 	Entity::callbackActionOnDirection(savepoint);
122 IMPLEMENT_FUNCTION_END
123 
124 //////////////////////////////////////////////////////////////////////////
125 IMPLEMENT_FUNCTION_SIIS(8, Alexei, callSavepoint, EntityIndex, ActionIndex)
126 	Entity::callSavepoint(savepoint);
127 IMPLEMENT_FUNCTION_END
128 
129 //////////////////////////////////////////////////////////////////////////
130 IMPLEMENT_FUNCTION_II(9, Alexei, savegame, SavegameType, uint32)
131 	Entity::savegame(savepoint);
132 IMPLEMENT_FUNCTION_END
133 
134 //////////////////////////////////////////////////////////////////////////
135 IMPLEMENT_FUNCTION_II(10, Alexei, updateEntity, CarIndex, EntityPosition)
136 	switch (savepoint.action) {
137 	default:
138 		break;
139 
140 	case kActionExcuseMeCath:
141 		if (getEntities()->isPlayerPosition(kCarGreenSleeping, 18) || getEntities()->isPlayerPosition(kCarRedSleeping, 18)) {
142 			getSound()->excuseMe(kEntityAlexei);
143 		} else {
144 			if (getEvent(kEventAlexeiSalonVassili) || (getEvent(kEventTatianaAskMatchSpeakRussian) && getInventory()->hasItem(kItemPassengerList))) {
145 				getSound()->playSound(kEntityPlayer, rnd(2) ? "CAT1012" : "CAT1012A");
146 			} else {
147 				getSound()->excuseMeCath();
148 			}
149 		}
150 		// Stop execution here
151 		return;
152 
153 	case kActionDefault:
154 		getData()->inventoryItem = kItemNone;
155 		break;
156 	}
157 
158 	Entity::updateEntity(savepoint, true);
159 IMPLEMENT_FUNCTION_END
160 
161 //////////////////////////////////////////////////////////////////////////
162 IMPLEMENT_FUNCTION_NOSETUP(11, Alexei, draw2)
163 	Entity::draw2(savepoint);
164 IMPLEMENT_FUNCTION_END
165 
166 //////////////////////////////////////////////////////////////////////////
167 IMPLEMENT_FUNCTION(12, Alexei, callbackActionRestaurantOrSalon)
168 	Entity::callbackActionRestaurantOrSalon(savepoint);
169 IMPLEMENT_FUNCTION_END
170 
171 //////////////////////////////////////////////////////////////////////////
172 IMPLEMENT_FUNCTION(13, Alexei, enterComparment)
173 	switch (savepoint.action) {
174 	default:
175 		break;
176 
177 	case kActionDefault:
178 		setCallback(1);
179 		setup_updateEntity(kCarGreenSleeping, kPosition_7500);
180 		break;
181 
182 	case kActionCallback:
183 		switch (getCallback()) {
184 		default:
185 			break;
186 
187 		case 1:
188 			getSavePoints()->push(kEntityAlexei, kEntityMertens, kAction302614416);
189 			getEntities()->drawSequenceLeft(kEntityAlexei, "602DB");
190 			getEntities()->enterCompartment(kEntityAlexei, kObjectCompartment2, true);
191 
192 			getData()->location = kLocationInsideCompartment;
193 
194 			if (getEntities()->isInsideCompartment(kEntityPlayer, kCarGreenSleeping, kPosition_7500)) {
195 				getAction()->playAnimation(isNight() ? kEventCathTurningNight : kEventCathTurningDay);
196 				getSound()->playSound(kEntityPlayer, "BUMP");
197 				getScenes()->loadSceneFromObject(kObjectCompartment2, true);
198 			}
199 			break;
200 
201 		case 2:
202 			getEntities()->exitCompartment(kEntityAlexei, kObjectCompartment2, true);
203 			getData()->location = kLocationInsideCompartment;
204 			getData()->entityPosition = kPosition_7500;
205 			getEntities()->clearSequences(kEntityAlexei);
206 
207 			callbackAction();
208 			break;
209 		}
210 		break;
211 
212 	case kAction135664192:
213 		setCallback(2);
214 		setup_enterExitCompartment("602Eb", kObjectCompartment2);
215 	}
216 IMPLEMENT_FUNCTION_END
217 
218 //////////////////////////////////////////////////////////////////////////
219 IMPLEMENT_FUNCTION(14, Alexei, exitCompartment)
220 	switch (savepoint.action) {
221 	default:
222 		break;
223 
224 	case kActionDefault:
225 		setCallback(1);
226 		setup_enterExitCompartment("602Fb", kObjectCompartment2);
227 		break;
228 
229 	case kActionCallback:
230 		if (getCallback() == 1) {
231 			getData()->location = kLocationOutsideCompartment;
232 			getSavePoints()->push(kEntityAlexei, kEntityMertens, kAction302614416);
233 			getEntities()->drawSequenceLeft(kEntityAlexei, "602DB");
234 			getEntities()->enterCompartment(kEntityAlexei, kObjectCompartment2, true);
235 		}
236 		break;
237 
238 	case kAction135664192:
239 		getObjects()->update(kObjectCompartment2, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
240 		getEntities()->exitCompartment(kEntityAlexei, kObjectCompartment2, true);
241 
242 		callbackAction();
243 		break;
244 	}
245 IMPLEMENT_FUNCTION_END
246 
247 //////////////////////////////////////////////////////////////////////////
248 IMPLEMENT_FUNCTION(15, Alexei, pacingAtWindow)
249 	switch (savepoint.action) {
250 	default:
251 		break;
252 
253 	case kActionNone:
254 		if (Entity::updateParameterCheck(params->param2, getState()->time, params->param1)) {
255 			if (getEntities()->isSomebodyInsideRestaurantOrSalon()) {
256 				getData()->location = kLocationOutsideCompartment;
257 
258 				setCallback(3);
259 				setup_updatePosition("103D", kCarRestaurant, 52);
260 			}
261 		}
262 		break;
263 
264 	case kActionDefault:
265 		params->param1 = 5 * (3 * rnd(60) + 90);
266 
267 		setCallback(1);
268 		setup_callbackActionRestaurantOrSalon();
269 		break;
270 
271 	case kActionCallback:
272 		switch (getCallback()) {
273 		default:
274 			break;
275 
276 		case 1:
277 			getData()->location = kLocationOutsideCompartment;
278 
279 			setCallback(2);
280 			setup_updatePosition("103C", kCarRestaurant, 52);
281 			break;
282 
283 		case 2:
284 			getData()->location = kLocationInsideCompartment;
285 			getEntities()->drawSequenceLeft(kEntityAlexei, "103E");
286 			break;
287 
288 		case 3:
289 			getData()->location = kLocationInsideCompartment;
290 			getEntities()->drawSequenceLeft(kEntityAlexei, "103B");
291 
292 			callbackAction();
293 			break;
294 		}
295 		break;
296 	}
297 IMPLEMENT_FUNCTION_END
298 
299 //////////////////////////////////////////////////////////////////////////
300 IMPLEMENT_FUNCTION_IS(16, Alexei, compartmentLogic, TimeValue)
301 	switch (savepoint.action) {
302 	default:
303 		break;
304 
305 	case kActionNone:
306 		if (!params->param7 && params->param1 < getState()->time && !params->param8) {
307 			params->param8 = 1;
308 
309 			getObjects()->update(kObjectCompartment2, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
310 			getObjects()->update(kObjectHandleInsideBathroom, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
311 
312 			callbackAction();
313 			break;
314 		}
315 
316 		if (params->param5) {
317 			if (!Entity::updateParameter(CURRENT_PARAM(1, 1), getState()->timeTicks, 75))
318 				break;
319 
320 			params->param5 = 0;
321 			params->param6 = 1;
322 
323 			getObjects()->update(kObjectCompartment2, kEntityAlexei, kObjectLocation1, kCursorNormal, kCursorNormal);
324 			getObjects()->update(kObjectHandleInsideBathroom, kEntityAlexei, kObjectLocation1, kCursorNormal, kCursorNormal);
325 		}
326 
327 		CURRENT_PARAM(1, 1) = 0;
328 		break;
329 
330 	case kActionKnock:
331 	case kActionOpenDoor:
332 		getObjects()->update(kObjectCompartment2, kEntityAlexei, kObjectLocation1, kCursorNormal, kCursorNormal);
333 		getObjects()->update(kObjectHandleInsideBathroom, kEntityAlexei, kObjectLocation1, kCursorNormal, kCursorNormal);
334 
335 		if (params->param5) {
336 			if (savepoint.param.intValue == 18) {
337 				setCallback(4);
338 				setup_playSound(getSound()->justAMinuteCath());
339 				break;
340 			}
341 
342 			if (getInventory()->hasItem(kItemPassengerList)) {
343 				setCallback(5);
344 				setup_playSound(rnd(2) ? getSound()->wrongDoorCath() : "CAT1503");
345 			} else {
346 				setCallback(6);
347 				setup_playSound(getSound()->wrongDoorCath());
348 			}
349 		} else {
350 			setCallback(savepoint.action == kActionKnock ? 1 : 2);
351 			setup_playSound(savepoint.action == kActionKnock ? "LIB012" : "LIB013");
352 		}
353 		break;
354 
355 	case kActionDefault:
356 		getEntities()->drawSequenceLeft(kEntityAlexei, (char *)&params->seq);
357 		getObjects()->update(kObjectCompartment2, kEntityAlexei, kObjectLocation1, kCursorHandKnock, kCursorHand);
358 		getObjects()->update(kObjectHandleInsideBathroom, kEntityAlexei, kObjectLocation1, kCursorHandKnock, kCursorHand);
359 		break;
360 
361 	case kActionDrawScene:
362 		if (params->param6 || params->param5) {
363 			getObjects()->update(kObjectCompartment2, kEntityAlexei, kObjectLocation1, kCursorHandKnock, kCursorHand);
364 			getObjects()->update(kObjectHandleInsideBathroom, kEntityAlexei, kObjectLocation1, kCursorHandKnock, kCursorHand);
365 
366 			params->param5 = 0;
367 			params->param6 = 0;
368 		}
369 		break;
370 
371 	case kActionCallback:
372 		switch (getCallback()) {
373 		default:
374 			break;
375 
376 		case 1:
377 		case 2:
378 			setCallback(3);
379 			setup_playSound("ALX1134A");
380 			break;
381 
382 		case 3:
383 			getObjects()->update(kObjectCompartment2, kEntityAlexei, kObjectLocation1, kCursorTalk, kCursorNormal);
384 			getObjects()->update(kObjectHandleInsideBathroom, kEntityAlexei, kObjectLocation1, kCursorTalk, kCursorNormal);
385 			params->param5 = 1;
386 			break;
387 
388 		case 4:
389 		case 5:
390 		case 6:
391 			params->param5 = 0;
392 			params->param6 = 1;
393 			break;
394 
395 		case 7:
396 			setCallback(8);
397 			setup_updateFromTime(300);
398 			break;
399 
400 		case 8:
401 			setCallback(9);
402 			setup_enterExitCompartment("602Gb", kObjectCompartment2);
403 			break;
404 
405 		case 9:
406 			getData()->location = kLocationOutsideCompartment;
407 			getSavePoints()->push(kEntityAlexei, kEntityMertens, kAction156567128);
408 			getEntities()->drawSequenceLeft(kEntityAlexei, "602Hb");
409 			getEntities()->enterCompartment(kEntityAlexei, kObjectCompartment2, true);
410 			break;
411 
412 		case 10:
413 			getEntities()->exitCompartment(kEntityAlexei, kObjectCompartment2, true);
414 
415 			getData()->location = kLocationInsideCompartment;
416 			getData()->entityPosition = kPosition_7500;
417 
418 			getEntities()->drawSequenceLeft(kEntityAlexei, (char *)&params->seq);
419 			getObjects()->update(kObjectCompartment2, kEntityAlexei, kObjectLocation1, kCursorHandKnock, kCursorHand);
420 			getObjects()->update(kObjectHandleInsideBathroom, kEntityAlexei, kObjectLocation1, kCursorHandKnock, kCursorHand);
421 
422 			params->param7 = 0;
423 			break;
424 		}
425 		break;
426 
427 	case kAction124697504:
428 		setCallback(10);
429 		setup_enterExitCompartment("602Ib", kObjectCompartment2);
430 		break;
431 
432 	case kAction221617184:
433 		params->param7 = 1;
434 		getSavePoints()->push(kEntityAlexei, kEntityMertens, kAction100906246);
435 
436 		setCallback(7);
437 		setup_playSound("CON1024");
438 		break;
439 	}
440 IMPLEMENT_FUNCTION_END
441 
442 //////////////////////////////////////////////////////////////////////////
443 IMPLEMENT_FUNCTION(17, Alexei, chapter1)
444 	switch (savepoint.action) {
445 	default:
446 		break;
447 
448 	case kActionNone:
449 		Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Alexei, setup_atDinner));
450 		break;
451 
452 	case kActionDefault:
453 		getObjects()->update(kObjectCompartment2, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
454 		getObjects()->update(kObject10, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
455 		getObjects()->update(kObjectHandleInsideBathroom, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
456 
457 		getData()->entityPosition = kPosition_3969;
458 		getData()->location = kLocationInsideCompartment;
459 		getData()->car = kCarRestaurant;
460 		break;
461 	}
462 IMPLEMENT_FUNCTION_END
463 
464 //////////////////////////////////////////////////////////////////////////
465 IMPLEMENT_FUNCTION(18, Alexei, atDinner)
466 	switch (savepoint.action) {
467 	default:
468 		break;
469 
470 	case kActionNone:
471 		if (getState()->time > kTime1089000 && getEntities()->isSomebodyInsideRestaurantOrSalon()) {
472 			params->param2 = kItemNone;
473 
474 			getData()->location = kLocationOutsideCompartment;
475 			getData()->inventoryItem = kItemNone;
476 
477 			getEntities()->updatePositionEnter(kEntityAlexei, kCarRestaurant, 63);
478 			getInventory()->setLocationAndProcess(kItem17, kObjectLocation1);
479 
480 			setCallback(1);
481 			setup_callSavepoint("005D", kEntityTables1, kActionDrawTablesWithChairs, "005E");
482 			break;
483 		}
484 
485 		if (params->param1) {
486 			if (!Entity::updateParameter(params->param3, getState()->timeTicks, 90))
487 				break;
488 
489 			getScenes()->loadSceneFromPosition(kCarRestaurant, 61);
490 		} else {
491 			params->param3 = 0;
492 		}
493 		break;
494 
495 	case kAction1:
496 		params->param2 = kItemNone;
497 		getData()->inventoryItem = kItemNone;
498 
499 		setCallback(2);
500 		setup_savegame(kSavegameTypeEvent, kEventAlexeiDiner);
501 		break;
502 
503 	case kActionDefault:
504 		getSavePoints()->push(kEntityAlexei, kEntityTables1, kAction136455232);
505 		getEntities()->drawSequenceLeft(kEntityAlexei, "005B");
506 
507 		params->param2 = kItemInvalid;
508 		getData()->inventoryItem = kItemInvalid;
509 		break;
510 
511 	case kActionDrawScene:
512 		params->param1 = getEntities()->isPlayerPosition(kCarRestaurant, 63) ? 1 : 0;
513 		break;
514 
515 	case kActionCallback:
516 		switch (getCallback()) {
517 		default:
518 			break;
519 
520 		case 1:
521 			getEntities()->updatePositionExit(kEntityAlexei, kCarRestaurant, 63);
522 			setup_returnCompartment();
523 			break;
524 
525 		case 2:
526 			getAction()->playAnimation(getProgress().jacket == kJacketGreen ? kEventAlexeiDiner : kEventAlexeiDinerOriginalJacket);
527 			getSavePoints()->push(kEntityAlexei, kEntityTables1, kActionDrawTablesWithChairs, "005E");
528 
529 			getData()->entityPosition = kPosition_3650;
530 			getData()->location = kLocationOutsideCompartment;
531 
532 			getEntities()->clearSequences(kEntityAlexei);
533 			getInventory()->get(kItem17)->location = kObjectLocation1;
534 			getScenes()->loadSceneFromPosition(kCarRestaurant, 63);
535 
536 			setup_returnCompartment();
537 			break;
538 		}
539 		break;
540 
541 	case kAction168046720:
542 		getData()->inventoryItem = kItemNone;
543 		break;
544 
545 	case kAction168627977:
546 		getData()->inventoryItem = (InventoryItem)LOW_BYTE(params->param2);
547 		break;
548 
549 	case kAction225182640:
550 		getData()->inventoryItem = kItemNone;
551 		break;
552 	}
553 IMPLEMENT_FUNCTION_END
554 
555 //////////////////////////////////////////////////////////////////////////
556 IMPLEMENT_FUNCTION(19, Alexei, returnCompartment)
557 	switch (savepoint.action) {
558 	default:
559 		break;
560 
561 	case kActionDefault:
562 		setCallback(1);
563 		setup_draw("811DS");
564 		break;
565 
566 	case kActionCallback:
567 		switch (getCallback()) {
568 		default:
569 			break;
570 
571 		case 1:
572 			setCallback(2);
573 			setup_updateEntity(kCarGreenSleeping, kPosition_9460);
574 			break;
575 
576 		case 2:
577 			setCallback(3);
578 			setup_updateEntity(kCarRestaurant, kPosition_850);
579 			break;
580 
581 		case 3:
582 			setCallback(4);
583 			setup_callbackActionRestaurantOrSalon();
584 			break;
585 
586 		case 4:
587 			getData()->entityPosition = kPosition_1540;
588 			getData()->location = kLocationOutsideCompartment;
589 
590 			setCallback(5);
591 			setup_draw("811US");
592 			break;
593 
594 		case 5:
595 			setCallback(6);
596 			setup_draw("933");
597 			break;
598 
599 		case 6:
600 			getEntities()->updatePositionEnter(kEntityAlexei, kCarRestaurant, 63);
601 			getScenes()->loadSceneFromItemPosition(kItem17);
602 			getSavePoints()->push(kEntityAlexei, kEntityTables1, kAction136455232);
603 
604 			setCallback(7);
605 			setup_callSavepoint("005F", kEntityTables1, kActionDrawTablesWithChairs, "005G");
606 			break;
607 
608 		case 7:
609 			getEntities()->updatePositionExit(kEntityAlexei, kCarRestaurant, 63);
610 			getSavePoints()->push(kEntityAlexei, kEntityWaiter2, kAction302996448);
611 
612 			setCallback(8);
613 			setup_draw("934");
614 			break;
615 
616 		case 8:
617 			setCallback(9);
618 			setup_draw("811DS");
619 			break;
620 
621 		case 9:
622 			setCallback(10);
623 			setup_enterComparment();
624 			break;
625 
626 		case 10:
627 			if (getEntities()->isPlayerPosition(kCarGreenSleeping, 61))
628 				getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
629 
630 			setCallback(11);
631 			setup_compartmentLogic(kTime1098000, "411");
632 			break;
633 
634 		case 11:
635 			setup_goSalon();
636 			break;
637 		}
638 		break;
639 	}
640 IMPLEMENT_FUNCTION_END
641 
642 //////////////////////////////////////////////////////////////////////////
643 IMPLEMENT_FUNCTION(20, Alexei, goSalon)
644 	switch (savepoint.action) {
645 	default:
646 		break;
647 
648 	case kActionDefault:
649 		setCallback(1);
650 		setup_exitCompartment();
651 		break;
652 
653 	case kActionCallback:
654 		switch (getCallback()) {
655 		default:
656 			break;
657 
658 		case 1:
659 			setCallback(2);
660 			setup_updateEntity(kCarRestaurant, kPosition_850);
661 			break;
662 
663 		case 2:
664 			setCallback(3);
665 			setup_callbackActionRestaurantOrSalon();
666 			break;
667 
668 		case 3:
669 			getData()->entityPosition = kPosition_1540;
670 			getData()->location = kLocationOutsideCompartment;
671 
672 			setCallback(4);
673 			setup_updatePosition("103A", kCarRestaurant, 52);
674 			break;
675 
676 		case 4:
677 			getData()->location = kLocationInsideCompartment;
678 			setup_sitting();
679 			break;
680 		}
681 		break;
682 	}
683 IMPLEMENT_FUNCTION_END
684 
685 //////////////////////////////////////////////////////////////////////////
686 IMPLEMENT_FUNCTION(21, Alexei, sitting)
687 	switch (savepoint.action) {
688 	default:
689 		break;
690 
691 	case kActionNone:
692 		if (Entity::updateParameterCheck(params->param2, getState()->time, params->param1) && getEntities()->isSomebodyInsideRestaurantOrSalon()) {
693 			getData()->location = kLocationOutsideCompartment;
694 			getData()->inventoryItem = kItemNone;
695 
696 			setCallback(1);
697 			setup_updatePosition("103C", kCarRestaurant, 52);
698 		}
699 		break;
700 
701 	case kAction1:
702 		getData()->inventoryItem = kItemNone;
703 
704 		setCallback(2);
705 		setup_savegame(kSavegameTypeEvent, kEventAlexeiSalonPoem);
706 		break;
707 
708 	case kActionDefault:
709 		getEntities()->drawSequenceLeft(kEntityAlexei, "103B");
710 		params->param1 = 225 * (4 * rnd(3) + 4);
711 
712 		if (!getEvent(kEventAlexeiSalonPoem))
713 			getData()->inventoryItem = kItemParchemin;
714 		break;
715 
716 	case kActionCallback:
717 		switch (getCallback()) {
718 		default:
719 			break;
720 
721 		case 1:
722 			getData()->location = kLocationInsideCompartment;
723 			setup_standingAtWindow();
724 			break;
725 
726 		case 2:
727 			getAction()->playAnimation(kEventAlexeiSalonPoem);
728 			getData()->location = kLocationOutsideCompartment;
729 
730 			getEntities()->drawSequenceRight(kEntityAlexei, "103D");
731 			getScenes()->loadSceneFromPosition(kCarRestaurant, 55);
732 			getEntities()->updatePositionEnter(kEntityAlexei, kCarRestaurant, 52);
733 
734 			setCallback(3);
735 			setup_callbackActionOnDirection();
736 			break;
737 
738 		case 3:
739 			getEntities()->drawSequenceLeft(kEntityAlexei, "103B");
740 			getEntities()->updatePositionExit(kEntityAlexei, kCarRestaurant, 52);
741 			getData()->location = kLocationInsideCompartment;
742 			break;
743 		}
744 		break;
745 	}
746 IMPLEMENT_FUNCTION_END
747 
748 //////////////////////////////////////////////////////////////////////////
749 IMPLEMENT_FUNCTION(22, Alexei, standingAtWindow)
750 	switch (savepoint.action) {
751 	default:
752 		break;
753 
754 	case kActionNone:
755 		if (Entity::updateParameterCheck(params->param2, getState()->time, params->param1)) {
756 			if (getEntities()->isSomebodyInsideRestaurantOrSalon()) {
757 				getData()->location = kLocationOutsideCompartment;
758 				getData()->inventoryItem = kItemNone;
759 
760 				setCallback(1);
761 				setup_updatePosition("103D", kCarRestaurant, 52);
762 				break;
763 			}
764 		}
765 
766 		if (params->param3 == kTimeInvalid || getState()->time <= kTime1111500)
767 			break;
768 
769 		if (getState()->time > kTime1138500) {
770 			params->param3 = kTimeInvalid;
771 		} else {
772 			if ((!getEntities()->isInSalon(kEntityPlayer) && !getEntities()->isInRestaurant(kEntityPlayer)) || !params->param3)
773 				params->param3 = (uint)getState()->time;
774 
775 			if (params->param3 >= getState()->time)
776 				break;
777 
778 			params->param3 = kTimeInvalid;
779 		}
780 
781 		getData()->inventoryItem = kItemNone;
782 
783 		setup_waitingForTatiana();
784 		break;
785 
786 	case kAction1:
787 		setCallback(2);
788 		setup_savegame(kSavegameTypeEvent, kEventAlexeiSalonPoem);
789 		break;
790 
791 	case kActionDefault:
792 		params->param1 = 225 * (4 * rnd(4) + 8);
793 		getEntities()->drawSequenceLeft(kEntityAlexei, "103E");
794 		if (!getEvent(kEventAlexeiSalonPoem))
795 			getData()->inventoryItem = kItemParchemin;
796 		break;
797 
798 	case kActionCallback:
799 		switch (getCallback()) {
800 		default:
801 			break;
802 
803 		case 1:
804 			getData()->location = kLocationInsideCompartment;
805 			setup_sitting();
806 			break;
807 
808 		case 2:
809 			getAction()->playAnimation(kEventAlexeiSalonPoem);
810 			getData()->inventoryItem = kItemNone;
811 			getData()->location = kLocationOutsideCompartment;
812 
813 			getEntities()->drawSequenceRight(kEntityAlexei, "103D");
814 			getEntities()->updatePositionEnter(kEntityAlexei, kCarRestaurant, 52);
815 			getScenes()->loadSceneFromPosition(kCarRestaurant, 55);
816 
817 			setCallback(3);
818 			setup_callbackActionOnDirection();
819 			break;
820 
821 		case 3:
822 			getEntities()->updatePositionExit(kEntityAlexei, kCarRestaurant, 52);
823 			getData()->location = kLocationInsideCompartment;
824 
825 			setup_sitting();
826 			break;
827 		}
828 		break;
829 	}
830 IMPLEMENT_FUNCTION_END
831 
832 //////////////////////////////////////////////////////////////////////////
833 IMPLEMENT_FUNCTION(23, Alexei, waitingForTatiana)
834 	switch (savepoint.action) {
835 	default:
836 		break;
837 
838 	case kActionNone:
839 		getData()->inventoryItem = (!getEntities()->isInRestaurant(kEntityTatiana) || getEvent(kEventAlexeiSalonPoem)) ? kItemNone : kItemParchemin;
840 		break;
841 
842 	case kAction1:
843 		setCallback(2);
844 		setup_savegame(kSavegameTypeEvent, kEventAlexeiSalonPoem);
845 		break;
846 
847 	case kActionDefault:
848 		getData()->location = kLocationInsideCompartment;
849 		getSavePoints()->push(kEntityAlexei, kEntityTatiana, kAction124973510);
850 		break;
851 
852 	case kActionCallback:
853 		switch (getCallback()) {
854 		default:
855 			break;
856 
857 		case 1:
858 			getAction()->playAnimation(kEventAlexeiSalonVassili);
859 
860 			getData()->location = kLocationOutsideCompartment;
861 
862 			getEntities()->drawSequenceLeft(kEntityAlexei, "103F");
863 			getScenes()->processScene();
864 
865 			setup_upset();
866 			break;
867 
868 		case 2:
869 			getAction()->playAnimation(kEventAlexeiSalonPoem);
870 
871 			getData()->inventoryItem = kItemNone;
872 
873 			getScenes()->loadSceneFromPosition(kCarRestaurant, 55);
874 			break;
875 		}
876 		break;
877 
878 	case kAction157159392:
879 		if (getEntities()->isInSalon(kEntityPlayer)) {
880 			setCallback(1);
881 			setup_savegame(kSavegameTypeEvent, kEventAlexeiSalonVassili);
882 		} else {
883 			setup_upset();
884 		}
885 		break;
886 
887 	case kAction188784532:
888 		setup_upset();
889 		break;
890 	}
891 IMPLEMENT_FUNCTION_END
892 
893 //////////////////////////////////////////////////////////////////////////
894 IMPLEMENT_FUNCTION(24, Alexei, upset)
895 	switch (savepoint.action) {
896 	default:
897 		break;
898 
899 	case kAction1:
900 		getData()->inventoryItem = kItemNone;
901 		setCallback(1);
902 		setup_savegame(kSavegameTypeEvent, kEventAlexeiSalonCath);
903 		break;
904 
905 	case kActionDefault:
906 		if (getEvent(kEventAlexeiSalonVassili))
907 			getData()->inventoryItem = kItemInvalid;
908 		break;
909 
910 	case kActionCallback:
911 		switch (getCallback()) {
912 		default:
913 			break;
914 
915 		case 1:
916 			getAction()->playAnimation(kEventAlexeiSalonCath);
917 			getData()->car = kCarRedSleeping;
918 			getData()->entityPosition = kPosition_9460;
919 			getEntities()->clearSequences(kEntityAlexei);
920 			getScenes()->loadSceneFromPosition(kCarRestaurant, 55);
921 			setup_returnCompartmentNight();
922 			break;
923 
924 		case 2:
925 			setup_returnCompartmentNight();
926 			break;
927 		}
928 		break;
929 
930 	case kAction135854208:
931 		getData()->inventoryItem = kItemNone;
932 		setCallback(2);
933 		setup_draw("103G");
934 		break;
935 	}
936 IMPLEMENT_FUNCTION_END
937 
938 //////////////////////////////////////////////////////////////////////////
939 IMPLEMENT_FUNCTION(25, Alexei, returnCompartmentNight)
940 	switch (savepoint.action) {
941 	default:
942 		break;
943 
944 	case kActionDefault:
945 		setCallback(1);
946 		setup_enterComparment();
947 		break;
948 
949 	case kActionCallback:
950 		switch (getCallback()) {
951 		default:
952 			break;
953 
954 		case 1:
955 			if (getEntities()->isPlayerPosition(kCarGreenSleeping, 61))
956 				getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
957 
958 			setCallback(2);
959 			setup_compartmentLogic(kTime1179000, "411");
960 			break;
961 
962 		case 2:
963 			setCallback(3);
964 			setup_compartmentLogic(kTime1323000, "412");
965 			break;
966 
967 		case 3:
968 			setup_function26();
969 			break;
970 		}
971 		break;
972 	}
973 IMPLEMENT_FUNCTION_END
974 
975 //////////////////////////////////////////////////////////////////////////
976 IMPLEMENT_FUNCTION(26, Alexei, function26)
977 	switch (savepoint.action) {
978 	default:
979 		break;
980 
981 	case kActionNone:
982 		Entity::timeCheck(kTime1512000, params->param1, WRAP_SETUP_FUNCTION(Alexei, setup_function27));
983 		break;
984 
985 	case kActionDefault:
986 		getData()->entityPosition = kPosition_7500;
987 		getData()->car = kCarGreenSleeping;
988 		getData()->location = kLocationInsideCompartment;
989 
990 		getObjects()->update(kObjectCompartment2, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
991 		getObjects()->update(kObjectHandleInsideBathroom, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
992 		getObjects()->update(kObject10, kEntityPlayer, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
993 
994 		if (getEntities()->isPlayerPosition(kCarGreenSleeping, 61))
995 			getScenes()->loadSceneFromPosition(kCarGreenSleeping, 66);
996 
997 		getEntities()->clearSequences(kEntityAlexei);
998 		break;
999 	}
1000 IMPLEMENT_FUNCTION_END
1001 
1002 //////////////////////////////////////////////////////////////////////////
1003 IMPLEMENT_FUNCTION(27, Alexei, function27)
1004 	if (savepoint.action == kActionDefault) {
1005 		getObjects()->update(kObject10, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
1006 
1007 		if (getEntities()->isPlayerPosition(kCarGreenSleeping, 66))
1008 			getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
1009 
1010 		getEntities()->drawSequenceLeft(kEntityAlexei, "412");
1011 	}
1012 IMPLEMENT_FUNCTION_END
1013 
1014 //////////////////////////////////////////////////////////////////////////
1015 IMPLEMENT_FUNCTION(28, Alexei, chapter2)
1016 	switch (savepoint.action) {
1017 	default:
1018 		break;
1019 
1020 	case kActionNone:
1021 		setup_inCompartment2();
1022 		break;
1023 
1024 	case kActionDefault:
1025 		getEntities()->clearSequences(kEntityAlexei);
1026 
1027 		getObjects()->update(kObjectCompartment2, kEntityAlexei, kObjectLocation1, kCursorHandKnock, kCursorHand);
1028 		getObjects()->update(kObject10, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
1029 		getObjects()->update(kObjectHandleInsideBathroom, kEntityAlexei, kObjectLocation1, kCursorHandKnock, kCursorHand);
1030 
1031 		getData()->entityPosition = kPosition_7500;
1032 		getData()->location = kLocationInsideCompartment;
1033 		getData()->car = kCarGreenSleeping;
1034 		getData()->clothes = kClothesDefault;
1035 		getData()->inventoryItem = kItemNone;
1036 		break;
1037 	}
1038 IMPLEMENT_FUNCTION_END
1039 
1040 //////////////////////////////////////////////////////////////////////////
1041 IMPLEMENT_FUNCTION(29, Alexei, inCompartment2)
1042 	switch (savepoint.action) {
1043 	default:
1044 		break;
1045 
1046 	case kActionDefault:
1047 		setCallback(1);
1048 		setup_compartmentLogic(kTime1791000, "411");
1049 		break;
1050 
1051 	case kActionCallback:
1052 		switch (getCallback()) {
1053 		default:
1054 			break;
1055 
1056 		case 1:
1057 			setCallback(2);
1058 			setup_exitCompartment();
1059 			break;
1060 
1061 		case 2:
1062 			setCallback(3);
1063 			setup_updateEntity(kCarRestaurant, kPosition_850);
1064 			break;
1065 
1066 		case 3:
1067 			setCallback(4);
1068 			setup_callbackActionRestaurantOrSalon();
1069 			break;
1070 
1071 		case 4:
1072 			getData()->entityPosition = kPosition_1540;
1073 			getData()->location = kLocationOutsideCompartment;
1074 
1075 			setCallback(5);
1076 			setup_draw("811US");
1077 			break;
1078 
1079 		case 5:
1080 			getEntities()->updatePositionEnter(kEntityAlexei, kCarRestaurant, 63);
1081 
1082 			setCallback(6);
1083 			setup_callSavepoint("018B", kEntityTables1, kAction136455232, "BOGUS");
1084 			break;
1085 
1086 		case 6:
1087 			getEntities()->updatePositionExit(kEntityAlexei, kCarRestaurant, 63);
1088 			getSavePoints()->push(kEntityAlexei, kEntityTatiana, kAction290869168);
1089 			setup_atBreakfast();
1090 			break;
1091 		}
1092 		break;
1093 	}
1094 IMPLEMENT_FUNCTION_END
1095 
1096 //////////////////////////////////////////////////////////////////////////
1097 IMPLEMENT_FUNCTION(30, Alexei, atBreakfast)
1098 	switch (savepoint.action) {
1099 	default:
1100 		break;
1101 
1102 	case kActionDefault:
1103 		getObjects()->update(kObjectCompartment2, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
1104 		getData()->car = kCarRestaurant;
1105 		getData()->location = kLocationInsideCompartment;
1106 
1107 		getEntities()->drawSequenceLeft(kEntityAlexei, "018C");
1108 		getSavePoints()->push(kEntityAlexei, kEntityTables1, kAction136455232);
1109 		break;
1110 
1111 	case kActionCallback:
1112 		switch (getCallback()) {
1113 		default:
1114 			break;
1115 
1116 		case 1:
1117 			getEntities()->updatePositionExit(kEntityAlexei, kCarRestaurant, 63);
1118 			getSavePoints()->push(kEntityAlexei, kEntityTatiana, kAction156444784);
1119 			getEntities()->drawSequenceLeft(kEntityAlexei, "018E");
1120 
1121 			if (getEntities()->isInRestaurant(kEntityPlayer))
1122 				getProgress().field_68 = 1;
1123 
1124 			setCallback(2);
1125 			setup_playSound("TAT2116");
1126 			break;
1127 
1128 		case 2:
1129 			getSound()->playSound(kEntityAlexei, "TAT2116A");
1130 			getEntities()->updatePositionEnter(kEntityAlexei, kCarRestaurant, 63);
1131 
1132 			setCallback(3);
1133 			setup_callSavepoint("018F", kEntityTatiana, kAction123857088, "BOGUS");
1134 			break;
1135 
1136 		case 3:
1137 			getEntities()->updatePositionExit(kEntityAlexei, kCarRestaurant, 63);
1138 			setup_returnCompartment2();
1139 			break;
1140 		}
1141 		break;
1142 
1143 	case kAction236053296:
1144 		getEntities()->drawSequenceRight(kEntityAlexei, "018D1");
1145 		getEntities()->drawSequenceRight(kEntityTatiana, "018D2");
1146 		getEntities()->updatePositionEnter(kEntityAlexei, kCarRestaurant, 63);
1147 
1148 		if (savepoint.param.intValue)
1149 			getScenes()->loadSceneFromPosition(kCarRestaurant, (Position)savepoint.param.intValue);
1150 
1151 		setCallback(1);
1152 		setup_callbackActionOnDirection();
1153 		break;
1154 	}
1155 IMPLEMENT_FUNCTION_END
1156 
1157 //////////////////////////////////////////////////////////////////////////
1158 IMPLEMENT_FUNCTION(31, Alexei, returnCompartment2)
1159 	switch (savepoint.action) {
1160 	default:
1161 		break;
1162 
1163 	case kActionDefault:
1164 		getEntities()->drawSequenceRight(kEntityAlexei, "811DS");
1165 		if (getEntities()->isInRestaurant(kEntityPlayer))
1166 			getEntities()->updateFrame(kEntityAlexei);
1167 
1168 		setCallback(1);
1169 		setup_callbackActionOnDirection();
1170 		break;
1171 
1172 	case kActionCallback:
1173 		switch (getCallback()) {
1174 		default:
1175 			break;
1176 
1177 		case 1:
1178 			setCallback(2);
1179 			setup_enterComparment();
1180 			break;
1181 
1182 		case 2:
1183 			if (getEntities()->isPlayerPosition(kCarGreenSleeping, 61))
1184 				getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
1185 
1186 			setCallback(3);
1187 			setup_compartmentLogic(kTimeEnd, "411");
1188 			break;
1189 		}
1190 		break;
1191 	}
1192 IMPLEMENT_FUNCTION_END
1193 
1194 //////////////////////////////////////////////////////////////////////////
1195 IMPLEMENT_FUNCTION(32, Alexei, chapter3)
1196 	switch (savepoint.action) {
1197 	default:
1198 		break;
1199 
1200 	case kActionNone:
1201 		setup_playingChess();
1202 		break;
1203 
1204 	case kActionDefault:
1205 		getEntities()->clearSequences(kEntityAlexei);
1206 
1207 		getObjects()->update(kObjectCompartment2, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
1208 		getObjects()->update(kObject10, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
1209 		getObjects()->update(kObjectHandleInsideBathroom, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
1210 
1211 		getData()->location = kLocationInsideCompartment;
1212 		getData()->car = kCarRestaurant;
1213 		getData()->clothes = kClothesDefault;
1214 		getData()->inventoryItem = kItemNone;
1215 		break;
1216 	}
1217 IMPLEMENT_FUNCTION_END
1218 
1219 //////////////////////////////////////////////////////////////////////////
1220 IMPLEMENT_FUNCTION(33, Alexei, playingChess)
1221 	switch (savepoint.action) {
1222 	default:
1223 		break;
1224 
1225 	case kActionCallback:
1226 		if (getCallback() == 1)
1227 			setup_inPart3();
1228 		break;
1229 
1230 	case kAction122288808:
1231 		getData()->entityPosition = kPosition_9270;
1232 		getData()->location = kLocationOutsideCompartment;
1233 		getData()->car = kCarRedSleeping;
1234 
1235 		setCallback(1);
1236 		setup_enterComparment();
1237 		break;
1238 
1239 	case kAction122358304:
1240 		getEntities()->drawSequenceLeft(kEntityAlexei, "BLANK");
1241 		break;
1242 	}
1243 IMPLEMENT_FUNCTION_END
1244 
1245 //////////////////////////////////////////////////////////////////////////
1246 IMPLEMENT_FUNCTION(34, Alexei, inPart3)
1247 	switch (savepoint.action) {
1248 	default:
1249 		break;
1250 
1251 	case kActionDefault:
1252 		if (getEntities()->isPlayerPosition(kCarGreenSleeping, 61))
1253 			getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
1254 
1255 		setCallback(1);
1256 		setup_compartmentLogic(kTime2083500, "411");
1257 		break;
1258 
1259 	case kActionCallback:
1260 		switch (getCallback()) {
1261 		default:
1262 			break;
1263 
1264 		case 1:
1265 			setCallback(2);
1266 			setup_exitCompartment();
1267 			break;
1268 
1269 		case 2:
1270 			setCallback(3);
1271 			setup_updateEntity(kCarRestaurant, kPosition_850);
1272 			break;
1273 
1274 		case 3:
1275 			setCallback(4);
1276 			setup_callbackActionRestaurantOrSalon();
1277 			break;
1278 
1279 		case 4:
1280 			getData()->entityPosition = kPosition_1540;
1281 			getData()->location = kLocationOutsideCompartment;
1282 
1283 			setCallback(5);
1284 			setup_updatePosition("103A", kCarRestaurant, 52);
1285 			break;
1286 
1287 		case 5:
1288 			setCallback(6);
1289 			setup_pacing3();
1290 			break;
1291 
1292 		case 6:
1293 			setCallback(7);
1294 			setup_enterComparment();
1295 			break;
1296 
1297 		case 7:
1298 			getObjects()->update(kObject10, kEntityPlayer, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
1299 			if (getEntities()->isPlayerPosition(kCarGreenSleeping, 61))
1300 				getScenes()->loadSceneFromPosition(kCarGreenSleeping, 66);
1301 
1302 			setCallback(8);
1303 			setup_compartmentLogic(kTime2124000, "NONE");
1304 			break;
1305 
1306 		case 8:
1307 			setCallback(9);
1308 			setup_exitCompartment();
1309 			break;
1310 
1311 		case 9:
1312 			setCallback(10);
1313 			setup_goSalon3();
1314 			break;
1315 
1316 		case 10:
1317 			getObjects()->update(kObject10, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
1318 			if (getEntities()->isPlayerPosition(kCarGreenSleeping, 66))
1319 				getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
1320 
1321 			setCallback(11);
1322 			setup_compartmentLogic(kTime16451100, "411");
1323 			break;
1324 		}
1325 		break;
1326 	}
1327 IMPLEMENT_FUNCTION_END
1328 
1329 //////////////////////////////////////////////////////////////////////////
1330 IMPLEMENT_FUNCTION(35, Alexei, pacing3)
1331 	switch (savepoint.action) {
1332 	default:
1333 		break;
1334 
1335 	case kActionNone:
1336 		if (getEntities()->isInSalon(kEntityPlayer)) {
1337 			if (Entity::updateParameterCheck(params->param2, getState()->time, 2700)) {
1338 				setCallback(1);
1339 				setup_callbackActionRestaurantOrSalon();
1340 				break;
1341 			}
1342 		} else {
1343 			params->param2 = 0;
1344 		}
1345 
1346 		if (Entity::updateParameterCheck(params->param3, getState()->time, params->param1)) {
1347 			if (getEntities()->isSomebodyInsideRestaurantOrSalon()) {
1348 				setCallback(3);
1349 				setup_pacingAtWindow();
1350 				break;
1351 			}
1352 		}
1353 
1354 label_callback_3:
1355 		if (!Entity::updateParameter(params->param4, getState()->time, 9000))
1356 			break;
1357 
1358 		setCallback(4);
1359 		setup_callbackActionRestaurantOrSalon();
1360 		break;
1361 
1362 	case kActionDefault:
1363 		params->param1 = 15 * rnd(120);
1364 		getEntities()->drawSequenceLeft(kEntityAlexei, "103B");
1365 		getData()->location = kLocationInsideCompartment;
1366 		break;
1367 
1368 	case kActionCallback:
1369 		switch (getCallback()) {
1370 		default:
1371 			break;
1372 
1373 		case 1:
1374 		case 4:
1375 			getData()->location = kLocationOutsideCompartment;
1376 
1377 			setCallback(getCallback() + 1);
1378 			setup_updatePosition("124C", kCarRestaurant, 52);
1379 			break;
1380 
1381 		case 2:
1382 		case 5:
1383 			callbackAction();
1384 			break;
1385 
1386 		case 3:
1387 			params->param1 = 15 * rnd(120);
1388 			params->param3 = 0;
1389 			goto label_callback_3;
1390 		}
1391 		break;
1392 	}
1393 IMPLEMENT_FUNCTION_END
1394 
1395 //////////////////////////////////////////////////////////////////////////
1396 IMPLEMENT_FUNCTION(36, Alexei, goSalon3)
1397 	switch (savepoint.action) {
1398 	default:
1399 		break;
1400 
1401 	case kActionNone:
1402 		if (params->param3 || params->param2)
1403 			break;
1404 
1405 		if (!Entity::updateParameter(params->param4, getState()->timeTicks, params->param1))
1406 			break;
1407 
1408 		getEntities()->drawSequenceRight(kEntityAlexei, "124B");
1409 
1410 		params->param2 = 1;
1411 		params->param4 = 0;
1412 		break;
1413 
1414 	case kActionExitCompartment:
1415 		if (params->param2) {
1416 			getEntities()->drawSequenceLeft(kEntityAlexei, "124A");
1417 			params->param1 = 5 * (3 * rnd(15) + 15);
1418 			params->param2 = 0;
1419 		}
1420 		break;
1421 
1422 	case kActionDefault:
1423 		params->param1 = 5 * (3 * rnd(15) + 15);
1424 
1425 		setCallback(1);
1426 		setup_updateEntity(kCarRestaurant, kPosition_850);
1427 		break;
1428 
1429 	case kActionCallback:
1430 		switch (getCallback()) {
1431 		default:
1432 			break;
1433 
1434 		case 1:
1435 			setCallback(2);
1436 			setup_callbackActionRestaurantOrSalon();
1437 			break;
1438 
1439 		case 2:
1440 			getSavePoints()->push(kEntityAlexei, kEntityAbbot, kAction222609266);
1441 			getData()->entityPosition = kPosition_1540;
1442 			getData()->location = kLocationOutsideCompartment;
1443 
1444 			setCallback(3);
1445 			setup_updatePosition("103A", kCarRestaurant, 52);
1446 			break;
1447 
1448 		case 3:
1449 			getData()->location = kLocationInsideCompartment;
1450 			getEntities()->drawSequenceLeft(kEntityAlexei, "124A");
1451 			break;
1452 
1453 		case 4:
1454 			callbackAction();
1455 			break;
1456 		}
1457 		break;
1458 
1459 	case kAction122288808:
1460 		setCallback(4);
1461 		setup_enterComparment();
1462 		break;
1463 
1464 	case kAction122358304:
1465 		getEntities()->drawSequenceLeft(kEntityAlexei, "BLANK");
1466 		params->param3 = 1;
1467 		break;
1468 	}
1469 IMPLEMENT_FUNCTION_END
1470 
1471 //////////////////////////////////////////////////////////////////////////
1472 IMPLEMENT_FUNCTION(37, Alexei, chapter4)
1473 	switch (savepoint.action) {
1474 	default:
1475 		break;
1476 
1477 	case kActionNone:
1478 		setup_inCompartment4();
1479 		break;
1480 
1481 	case kActionDefault:
1482 		getEntities()->clearSequences(kEntityAlexei);
1483 
1484 		getObjects()->update(kObjectCompartment2, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
1485 		getObjects()->update(kObject10, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
1486 		getObjects()->update(kObjectHandleInsideBathroom, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
1487 
1488 		getData()->entityPosition = kPosition_7500;
1489 		getData()->location = kLocationInsideCompartment;
1490 		getData()->car = kCarGreenSleeping;
1491 		getData()->inventoryItem = kItemNone;
1492 		break;
1493 	}
1494 IMPLEMENT_FUNCTION_END
1495 
1496 //////////////////////////////////////////////////////////////////////////
1497 IMPLEMENT_FUNCTION(38, Alexei, inCompartment4)
1498 	switch (savepoint.action) {
1499 	default:
1500 		break;
1501 
1502 	case kActionDefault:
1503 		setCallback(1);
1504 		setup_compartmentLogic(kTime2354400, "411");
1505 		break;
1506 
1507 	case kActionCallback:
1508 		if (getCallback() == 1)
1509 			setup_meetTatiana();
1510 		break;
1511 	}
1512 IMPLEMENT_FUNCTION_END
1513 
1514 //////////////////////////////////////////////////////////////////////////
1515 IMPLEMENT_FUNCTION(39, Alexei, meetTatiana)
1516 	switch (savepoint.action) {
1517 	default:
1518 		break;
1519 
1520 	case kActionNone:
1521 		if (!params->param2)
1522 			break;
1523 
1524 		if (!params->param4) {
1525 			params->param3 = (uint)getState()->time + 4500;
1526 			params->param4 = (uint)getState()->time + 9000;
1527 		}
1528 
1529 		if (params->param5 != kTimeInvalid && params->param3 < getState()->time) {
1530 
1531 			if (params->param4 >= getState()->time) {
1532 				if (getEntities()->isInGreenCarEntrance(kEntityPlayer) || !params->param5)
1533 					params->param5 = (uint)getState()->time;
1534 
1535 				if (params->param5 >= getState()->time)
1536 					break;
1537 			}
1538 
1539 			params->param5 = kTimeInvalid;
1540 
1541 			getEntities()->updatePositionExit(kEntityAlexei, kCarGreenSleeping, 70);
1542 			getEntities()->updatePositionExit(kEntityAlexei, kCarGreenSleeping, 71);
1543 
1544 			if (getEntities()->isInGreenCarEntrance(kEntityPlayer)) {
1545 				getSound()->excuseMe(kEntityAlexei);
1546 
1547 				if (getEntities()->isPlayerPosition(kCarGreenSleeping, 62))
1548 					getScenes()->loadSceneFromPosition(kCarGreenSleeping, 72);
1549 			}
1550 
1551 			setup_leavePlatform();
1552 		}
1553 		break;
1554 
1555 	case kActionExitCompartment:
1556 		if (!params->param1 && !params->param2)
1557 			getEntities()->drawSequenceLeft(kEntityAlexei, "306F");
1558 		break;
1559 
1560 	case kActionDefault:
1561 		setCallback(1);
1562 		setup_enterExitCompartment("602FB", kObjectCompartment2);
1563 		break;
1564 
1565 	case kActionDrawScene:
1566 		if (getEntities()->isPlayerPosition(kCarGreenSleeping, 62)) {
1567 			if (params->param1) {
1568 				if (!params->param2)
1569 					break;
1570 			} else if (!params->param2) {
1571 				getEntities()->drawSequenceRight(kEntityAlexei, "306A");
1572 				break;
1573 			}
1574 
1575 			setup_leavePlatform();
1576 		}
1577 		break;
1578 
1579 	case kActionCallback:
1580 		switch (getCallback()) {
1581 		default:
1582 			break;
1583 
1584 		case 1:
1585 			getObjects()->update(kObjectCompartment2, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
1586 			getData()->location = kLocationOutsideCompartment;
1587 
1588 			setCallback(2);
1589 			setup_updateEntity(kCarGreenSleeping, kPosition_540);
1590 			break;
1591 
1592 		case 2:
1593 			getEntities()->clearSequences(kEntityAlexei);
1594 
1595 			if (getEntities()->isInGreenCarEntrance(kEntityPlayer)) {
1596 				getSound()->excuseMe(kEntityAlexei);
1597 
1598 				if (getEntities()->isPlayerPosition(kCarGreenSleeping, 62))
1599 					getScenes()->loadSceneFromPosition(kCarGreenSleeping, 72);
1600 			}
1601 
1602 			getEntities()->updatePositionEnter(kEntityAlexei, kCarGreenSleeping, 70);
1603 			getEntities()->updatePositionEnter(kEntityAlexei, kCarGreenSleeping, 71);
1604 			break;
1605 		}
1606 		break;
1607 
1608 	case kAction123536024:
1609 		params->param2 = 1;
1610 		break;
1611 
1612 	case kAction123712592:
1613 		getEntities()->clearSequences(kEntityAlexei);
1614 		params->param1 = 1;
1615 		break;
1616 	}
1617 IMPLEMENT_FUNCTION_END
1618 
1619 //////////////////////////////////////////////////////////////////////////
1620 IMPLEMENT_FUNCTION(40, Alexei, leavePlatform)
1621 	switch (savepoint.action) {
1622 	default:
1623 		break;
1624 
1625 	case kActionDefault:
1626 		setCallback(1);
1627 		setup_updateEntity(kCarGreenSleeping, kPosition_7500);
1628 		break;
1629 
1630 	case kActionCallback:
1631 		switch (getCallback()) {
1632 		default:
1633 			break;
1634 
1635 		case 1:
1636 			getEntities()->drawSequenceRight(kEntityAlexei, "602Eb");
1637 			getEntities()->enterCompartment(kEntityAlexei, kObjectCompartment2);
1638 
1639 			getData()->location = kLocationInsideCompartment;
1640 
1641 			if (getEntities()->isInsideCompartment(kEntityPlayer, kCarGreenSleeping, kPosition_7500)) {
1642 				getAction()->playAnimation(isNight() ? kEventCathTurningNight : kEventCathTurningDay);
1643 				getSound()->playSound(kEntityPlayer, "BUMP");
1644 				getScenes()->loadSceneFromObject(kObjectCompartment2);
1645 			}
1646 
1647 			setCallback(2);
1648 			setup_callbackActionOnDirection();
1649 			break;
1650 
1651 		case 2:
1652 			getEntities()->exitCompartment(kEntityAlexei, kObjectCompartment2);
1653 			getData()->entityPosition = kPosition_7500;
1654 			getData()->location = kLocationInsideCompartment;
1655 			getEntities()->clearSequences(kEntityAlexei);
1656 
1657 			setup_inCompartmentAgain();
1658 			break;
1659 		}
1660 		break;
1661 	}
1662 IMPLEMENT_FUNCTION_END
1663 
1664 //////////////////////////////////////////////////////////////////////////
1665 IMPLEMENT_FUNCTION(41, Alexei, inCompartmentAgain)
1666 	switch (savepoint.action) {
1667 	default:
1668 		break;
1669 
1670 	case kActionDefault:
1671 		if (getEntities()->isPlayerPosition(kCarGreenSleeping, 66))
1672 			getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
1673 
1674 		setCallback(1);
1675 		setup_compartmentLogic(kTime2403000, "411");
1676 		break;
1677 
1678 	case kActionCallback:
1679 		if (getCallback() == 1)
1680 			setup_goSalon4();
1681 		break;
1682 	}
1683 IMPLEMENT_FUNCTION_END
1684 
1685 //////////////////////////////////////////////////////////////////////////
1686 IMPLEMENT_FUNCTION(42, Alexei, goSalon4)
1687 	switch (savepoint.action) {
1688 	default:
1689 		break;
1690 
1691 	case kActionDefault:
1692 		setCallback(1);
1693 		setup_exitCompartment();
1694 		break;
1695 
1696 	case kActionCallback:
1697 		switch (getCallback()) {
1698 		default:
1699 			break;
1700 
1701 		case 1:
1702 			getSavePoints()->push(kEntityAlexei, kEntityTatiana, kAction191198209);
1703 
1704 			setCallback(2);
1705 			setup_updateEntity(kCarRestaurant, kPosition_850);
1706 			break;
1707 
1708 		case 2:
1709 			setCallback(3);
1710 			setup_updatePosition("103A", kCarRestaurant, 52);
1711 			break;
1712 
1713 		case 3:
1714 			getData()->location = kLocationInsideCompartment;
1715 			setup_pacing();
1716 			break;
1717 		}
1718 		break;
1719 	}
1720 IMPLEMENT_FUNCTION_END
1721 
1722 //////////////////////////////////////////////////////////////////////////
1723 IMPLEMENT_FUNCTION(43, Alexei, pacing)
1724 	switch (savepoint.action) {
1725 	default:
1726 		break;
1727 
1728 	case kActionNone:
1729 		if (getState()->time < kTime1806300 && Entity::updateParameterCheck(params->param2, getState()->time, params->param1)) {
1730 			if (getEntities()->isSomebodyInsideRestaurantOrSalon()) {
1731 				setCallback(1);
1732 				setup_pacingAtWindow();
1733 				break;
1734 			}
1735 		}
1736 
1737 label_callback_1:
1738 		if (getState()->time > kTime2457000 && !params->param3) {
1739 			params->param3 = 1;
1740 
1741 			setCallback(2);
1742 			setup_callbackActionRestaurantOrSalon();
1743 		}
1744 		break;
1745 
1746 	case kActionDefault:
1747 		params->param1 = 5 * (3 * rnd(120) + 180);
1748 		getEntities()->drawSequenceLeft(kEntityAlexei, "103B");
1749 		break;
1750 
1751 	case kActionCallback:
1752 		switch (getCallback()) {
1753 		default:
1754 			break;
1755 
1756 		case 1:
1757 			params->param1 = 5 * (3 * rnd(120) + 180);
1758 			params->param2 = 0;
1759 			goto label_callback_1;
1760 
1761 		case 2:
1762 			getData()->location = kLocationOutsideCompartment;
1763 
1764 			setCallback(3);
1765 			setup_updatePosition("124C", kCarRestaurant, 52);
1766 			break;
1767 
1768 		case 3:
1769 			setup_goToPlatform();
1770 			break;
1771 		}
1772 		break;
1773 	}
1774 IMPLEMENT_FUNCTION_END
1775 
1776 //////////////////////////////////////////////////////////////////////////
1777 IMPLEMENT_FUNCTION(44, Alexei, goToPlatform)
1778 	switch (savepoint.action) {
1779 	default:
1780 		break;
1781 
1782 	case kActionNone:
1783 		if (getState()->time > kTime2475000 && !params->param1) {
1784 			params->param1 = 1;
1785 
1786 			getEntities()->updatePositionExit(kEntityAlexei, kCarGreenSleeping, 70);
1787 			getEntities()->updatePositionExit(kEntityAlexei, kCarGreenSleeping, 71);
1788 
1789 			if (getEntities()->isInGreenCarEntrance(kEntityPlayer)) {
1790 				getSound()->excuseMe(kEntityAlexei);
1791 
1792 				if (getEntities()->isPlayerPosition(kCarGreenSleeping, 62))
1793 					getScenes()->loadSceneFromPosition(kCarGreenSleeping, 72);
1794 
1795 			}
1796 			setup_returnCompartment4();
1797 		}
1798 		break;
1799 
1800 	case kActionDefault:
1801 		getData()->car = kCarRedSleeping;
1802 		getData()->location = kLocationOutsideCompartment;
1803 		getData()->entityPosition = kPosition_9460;
1804 
1805 		setCallback(1);
1806 		setup_updateEntity(kCarGreenSleeping, kPosition_540);
1807 		break;
1808 
1809 	case kActionDrawScene:
1810 		if (getEntities()->isPlayerPosition(kCarGreenSleeping, 62)) {
1811 			setCallback(2);
1812 			setup_draw("306A");
1813 		}
1814 		break;
1815 
1816 	case kActionCallback:
1817 		switch (getCallback()) {
1818 		default:
1819 			break;
1820 
1821 		case 1:
1822 			getEntities()->clearSequences(kEntityAlexei);
1823 
1824 			if (getEntities()->isInGreenCarEntrance(kEntityPlayer)) {
1825 				getSound()->excuseMe(kEntityAlexei);
1826 
1827 				if (getEntities()->isPlayerPosition(kCarGreenSleeping, 62))
1828 					getScenes()->loadSceneFromPosition(kCarGreenSleeping, 72);
1829 			}
1830 
1831 			getEntities()->updatePositionEnter(kEntityAlexei, kCarGreenSleeping, 70);
1832 			getEntities()->updatePositionEnter(kEntityAlexei, kCarGreenSleeping, 71);
1833 			break;
1834 
1835 		case 2:
1836 			getEntities()->drawSequenceLeft(kEntityAlexei, "306F");
1837 			break;
1838 		}
1839 		break;
1840 	}
1841 IMPLEMENT_FUNCTION_END
1842 
1843 //////////////////////////////////////////////////////////////////////////
1844 IMPLEMENT_FUNCTION(45, Alexei, returnCompartment4)
1845 	switch (savepoint.action) {
1846 	default:
1847 		break;
1848 
1849 	case kActionDefault:
1850 		setCallback(1);
1851 		setup_enterComparment();
1852 		break;
1853 
1854 	case kActionCallback:
1855 		if (getCallback() == 1) {
1856 			if (getEntities()->isPlayerPosition(kCarGreenSleeping, 66))
1857 				getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
1858 
1859 			if (getInventory()->hasItem(kItemBomb)) {
1860 				setup_bombPlanB();
1861 			} else {
1862 				setCallback(2);
1863 				setup_compartmentLogic(kTimeEnd, "412");
1864 			}
1865 		}
1866 		break;
1867 	}
1868 IMPLEMENT_FUNCTION_END
1869 
1870 //////////////////////////////////////////////////////////////////////////
1871 IMPLEMENT_FUNCTION(46, Alexei, bombPlanB)
1872 	switch (savepoint.action) {
1873 	default:
1874 		break;
1875 
1876 	case kActionNone:
1877 		if (params->param1 == kTimeInvalid)
1878 			break;
1879 
1880 		if (getState()->time <= kTime2493000) {
1881 
1882 			if (getEntities()->isInSalon(kEntityPlayer) || getEntities()->isInSalon(kEntityAugust) || !params->param1)
1883 				params->param1 = (uint)getState()->time;
1884 
1885 			if (params->param1 >= getState()->time)
1886 				break;
1887 		}
1888 
1889 		params->param1 = kTimeInvalid;
1890 
1891 		getScenes()->loadSceneFromItemPosition(kItem22);
1892 
1893 		if (getEntities()->isInSalon(kEntityPlayer)) {
1894 			getSound()->excuseMe(kEntityAlexei);
1895 
1896 			getScenes()->loadSceneFromPosition(kCarRestaurant, getScenes()->get(getState()->scene)->position);
1897 		}
1898 
1899 		setCallback(4);
1900 		setup_enterComparment();
1901 		break;
1902 
1903 	case kActionDefault:
1904 		setCallback(1);
1905 		setup_compartmentLogic(kTime2488500, "411");
1906 		break;
1907 
1908 	case kActionCallback:
1909 		switch (getCallback()) {
1910 		default:
1911 			break;
1912 
1913 		case 1:
1914 			setCallback(2);
1915 			setup_exitCompartment();
1916 			break;
1917 
1918 		case 2:
1919 			setCallback(3);
1920 			setup_updateEntity(kCarRedSleeping, kPosition_9460);
1921 			break;
1922 
1923 		case 4:
1924 			if (getEntities()->isPlayerPosition(kCarGreenSleeping, 66))
1925 				getScenes()->loadSceneFromPosition(kCarGreenSleeping, 49);
1926 
1927 			setCallback(5);
1928 			setup_compartmentLogic(kTime2507400, "412");
1929 			break;
1930 
1931 		case 5:
1932 			setCallback(6);
1933 			setup_enterExitCompartment("602Fb", kObjectCompartment2);
1934 			break;
1935 
1936 		case 6:
1937 			getObjects()->update(kObjectCompartment2, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
1938 			getData()->location = kLocationOutsideCompartment;
1939 
1940 			setCallback(7);
1941 			setup_updateEntity(kCarRedSleeping, kPosition_7500);
1942 			break;
1943 
1944 		case 7:
1945 			getEntities()->drawSequenceRight(kEntityAlexei, "602Eb");
1946 			getEntities()->enterCompartment(kEntityAlexei, kObjectCompartmentB);
1947 			getData()->location = kLocationInsideCompartment;
1948 
1949 			if (getEntities()->checkFields19(kEntityPlayer, kCarRedSleeping, kPosition_7850)) {
1950 				getAction()->playAnimation(isNight() ? kEventCathTurningNight : kEventCathTurningDay);
1951 				getSound()->playSound(kEntityPlayer, "BUMP");
1952 				getScenes()->loadSceneFromObject(kObjectCompartmentB);
1953 			}
1954 
1955 			setCallback(8);
1956 			setup_callbackActionOnDirection();
1957 			break;
1958 
1959 		case 8:
1960 			getEntities()->exitCompartment(kEntityAlexei, kObjectCompartmentB);
1961 			getEntities()->clearSequences(kEntityAlexei);
1962 			getData()->entityPosition = kPosition_8200;
1963 			getData()->location = kLocationInsideCompartment;
1964 			getObjects()->update(kObjectCompartmentA, kEntityPlayer, kObjectLocation1, kCursorNormal, kCursorNormal);
1965 			getObjects()->update(kObject48, kEntityPlayer, kObjectLocation1, kCursorNormal, kCursorNormal);
1966 
1967 			setCallback(9);
1968 			setup_playSound("TAT4167");
1969 			break;
1970 
1971 		case 9:
1972 			getSavePoints()->push(kEntityAlexei, kEntityChapters, kAction156435676);
1973 			setup_function47();
1974 			break;
1975 		}
1976 		break;
1977 	}
1978 IMPLEMENT_FUNCTION_END
1979 
1980 //////////////////////////////////////////////////////////////////////////
1981 IMPLEMENT_FUNCTION(47, Alexei, function47)
1982 	if (savepoint.action == kActionDefault) {
1983 		getEntities()->clearSequences(kEntityAlexei);
1984 
1985 		getData()->entityPosition = kPositionNone;
1986 		getData()->location = kLocationOutsideCompartment;
1987 		getData()->car = kCarLocomotive;
1988 
1989 		getObjects()->update(kObjectCompartment2, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
1990 		getObjects()->update(kObjectHandleInsideBathroom, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
1991 	}
1992 IMPLEMENT_FUNCTION_END
1993 
1994 //////////////////////////////////////////////////////////////////////////
1995 IMPLEMENT_FUNCTION(48, Alexei, chapter5)
1996 	if (savepoint.action == kActionDefault)
1997 		getEntities()->clearSequences(kEntityAlexei);
1998 IMPLEMENT_FUNCTION_END
1999 
2000 } // End of namespace LastExpress
2001