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 *)¶ms->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 *)¶ms->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