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/abbot.h"
24
25 #include "lastexpress/entities/verges.h"
26
27 #include "lastexpress/game/action.h"
28 #include "lastexpress/game/entities.h"
29 #include "lastexpress/game/inventory.h"
30 #include "lastexpress/game/logic.h"
31 #include "lastexpress/game/object.h"
32 #include "lastexpress/game/savepoint.h"
33 #include "lastexpress/game/scenes.h"
34 #include "lastexpress/game/state.h"
35
36 #include "lastexpress/sound/queue.h"
37
38 #include "lastexpress/lastexpress.h"
39
40 namespace LastExpress {
41
Abbot(LastExpressEngine * engine)42 Abbot::Abbot(LastExpressEngine *engine) : Entity(engine, kEntityAbbot) {
43 ADD_CALLBACK_FUNCTION(Abbot, reset);
44 ADD_CALLBACK_FUNCTION_S(Abbot, draw);
45 ADD_CALLBACK_FUNCTION_SI(Abbot, enterExitCompartment);
46 ADD_CALLBACK_FUNCTION_SI(Abbot, enterExitCompartment2);
47 ADD_CALLBACK_FUNCTION(Abbot, callbackActionOnDirection);
48 ADD_CALLBACK_FUNCTION_SSI(Abbot, draw2);
49 ADD_CALLBACK_FUNCTION_I(Abbot, updateFromTime);
50 ADD_CALLBACK_FUNCTION_I(Abbot, updateFromTicks);
51 ADD_CALLBACK_FUNCTION_S(Abbot, playSound);
52 ADD_CALLBACK_FUNCTION_II(Abbot, savegame);
53 ADD_CALLBACK_FUNCTION_II(Abbot, updateEntity);
54 ADD_CALLBACK_FUNCTION_SIIS(Abbot, callSavepoint);
55 ADD_CALLBACK_FUNCTION_SII(Abbot, updatePosition);
56 ADD_CALLBACK_FUNCTION(Abbot, callbackActionRestaurantOrSalon);
57 ADD_CALLBACK_FUNCTION(Abbot, chapter1);
58 ADD_CALLBACK_FUNCTION(Abbot, chapter2);
59 ADD_CALLBACK_FUNCTION(Abbot, chapter3);
60 ADD_CALLBACK_FUNCTION(Abbot, inKitchen);
61 ADD_CALLBACK_FUNCTION(Abbot, openCompartment);
62 ADD_CALLBACK_FUNCTION(Abbot, readPaper);
63 ADD_CALLBACK_FUNCTION(Abbot, goToLunch);
64 ADD_CALLBACK_FUNCTION(Abbot, haveLunch);
65 ADD_CALLBACK_FUNCTION(Abbot, leaveLunch);
66 ADD_CALLBACK_FUNCTION(Abbot, closedCompartment);
67 ADD_CALLBACK_FUNCTION(Abbot, goSalon1);
68 ADD_CALLBACK_FUNCTION(Abbot, inSalon1);
69 ADD_CALLBACK_FUNCTION(Abbot, goCompartment);
70 ADD_CALLBACK_FUNCTION(Abbot, openCompartment2);
71 ADD_CALLBACK_FUNCTION(Abbot, goWander);
72 ADD_CALLBACK_FUNCTION(Abbot, goSalon2);
73 ADD_CALLBACK_FUNCTION(Abbot, inSalon2);
74 ADD_CALLBACK_FUNCTION(Abbot, goCompartment3);
75 ADD_CALLBACK_FUNCTION(Abbot, openCompartment3);
76 ADD_CALLBACK_FUNCTION(Abbot, goSalon3);
77 ADD_CALLBACK_FUNCTION(Abbot, inSalon3);
78 ADD_CALLBACK_FUNCTION(Abbot, withAugust);
79 ADD_CALLBACK_FUNCTION(Abbot, goCompartment4);
80 ADD_CALLBACK_FUNCTION(Abbot, inCompartment4);
81 ADD_CALLBACK_FUNCTION(Abbot, chapter4);
82 ADD_CALLBACK_FUNCTION_II(Abbot, doWalkSearchingForCath);
83 ADD_CALLBACK_FUNCTION(Abbot, chapter4Handler);
84 ADD_CALLBACK_FUNCTION(Abbot, leaveDinner);
85 ADD_CALLBACK_FUNCTION(Abbot, inCompartment);
86 ADD_CALLBACK_FUNCTION(Abbot, function44);
87 ADD_CALLBACK_FUNCTION(Abbot, conferring);
88 ADD_CALLBACK_FUNCTION(Abbot, goSalon4);
89 ADD_CALLBACK_FUNCTION(Abbot, beforeBomb);
90 ADD_CALLBACK_FUNCTION(Abbot, afterBomb);
91 ADD_CALLBACK_FUNCTION(Abbot, catchCath);
92 ADD_CALLBACK_FUNCTION(Abbot, chapter5);
93 ADD_CALLBACK_FUNCTION(Abbot, chapter5Handler);
94 ADD_CALLBACK_FUNCTION(Abbot, function52);
95 ADD_CALLBACK_FUNCTION(Abbot, runningTrain);
96 }
97
98 //////////////////////////////////////////////////////////////////////////
99 IMPLEMENT_FUNCTION(1, Abbot, reset)
100 Entity::reset(savepoint);
101 IMPLEMENT_FUNCTION_END
102
103 //////////////////////////////////////////////////////////////////////////
104 IMPLEMENT_FUNCTION_S(2, Abbot, draw)
105 Entity::draw(savepoint);
106 IMPLEMENT_FUNCTION_END
107
108 //////////////////////////////////////////////////////////////////////////
109 IMPLEMENT_FUNCTION_SI(3, Abbot, enterExitCompartment, ObjectIndex)
110 Entity::enterExitCompartment(savepoint);
111 IMPLEMENT_FUNCTION_END
112
113 //////////////////////////////////////////////////////////////////////////
114 IMPLEMENT_FUNCTION_SI(4, Abbot, enterExitCompartment2, ObjectIndex)
115 Entity::enterExitCompartment(savepoint, kPosition_6470, kPosition_6130, kCarRedSleeping, kObjectCompartmentC, true, true);
116 IMPLEMENT_FUNCTION_END
117
118 //////////////////////////////////////////////////////////////////////////
119 IMPLEMENT_FUNCTION(5, Abbot, callbackActionOnDirection)
120 Entity::callbackActionOnDirection(savepoint);
121 IMPLEMENT_FUNCTION_END
122
123 //////////////////////////////////////////////////////////////////////////
124 IMPLEMENT_FUNCTION_SSI(6, Abbot, draw2, EntityIndex)
125 Entity::draw2(savepoint);
126 IMPLEMENT_FUNCTION_END
127
128 //////////////////////////////////////////////////////////////////////////
129 IMPLEMENT_FUNCTION_I(7, Abbot, updateFromTime, uint32)
130 Entity::updateFromTime(savepoint);
131 IMPLEMENT_FUNCTION_END
132
133 //////////////////////////////////////////////////////////////////////////
134 IMPLEMENT_FUNCTION_I(8, Abbot, updateFromTicks, uint32)
135 Entity::updateFromTicks(savepoint);
136 IMPLEMENT_FUNCTION_END
137
138 //////////////////////////////////////////////////////////////////////////
139 IMPLEMENT_FUNCTION_S(9, Abbot, playSound)
140 Entity::playSound(savepoint);
141 IMPLEMENT_FUNCTION_END
142
143 //////////////////////////////////////////////////////////////////////////
144 IMPLEMENT_FUNCTION_II(10, Abbot, savegame, SavegameType, uint32)
145 Entity::savegame(savepoint);
146 IMPLEMENT_FUNCTION_END
147
148 //////////////////////////////////////////////////////////////////////////
149 IMPLEMENT_FUNCTION_II(11, Abbot, updateEntity, CarIndex, EntityPosition)
150 if (savepoint.action == kActionExcuseMeCath) {
151 if (getEntities()->isPlayerPosition(kCarGreenSleeping, 18) || getEntities()->isPlayerPosition(kCarRedSleeping, 18)) {
152 getSound()->excuseMe(kEntityAbbot);
153 } else {
154 if (getEvent(kEventAbbotIntroduction))
155 getSound()->playSound(kEntityPlayer, "CAT1013");
156 else
157 getSound()->excuseMeCath();
158 }
159 return;
160 }
161
162 Entity::updateEntity(savepoint, true);
163 IMPLEMENT_FUNCTION_END
164
165 //////////////////////////////////////////////////////////////////////////
166 IMPLEMENT_FUNCTION_SIIS(12, Abbot, callSavepoint, EntityIndex, ActionIndex)
167 Entity::callSavepoint(savepoint);
168 IMPLEMENT_FUNCTION_END
169
170 //////////////////////////////////////////////////////////////////////////
171 IMPLEMENT_FUNCTION_SII(13, Abbot, updatePosition, CarIndex, Position)
172 Entity::updatePosition(savepoint);
173 IMPLEMENT_FUNCTION_END
174
175 //////////////////////////////////////////////////////////////////////////
176 IMPLEMENT_FUNCTION(14, Abbot, callbackActionRestaurantOrSalon)
177 Entity::callbackActionRestaurantOrSalon(savepoint);
178 IMPLEMENT_FUNCTION_END
179
180 //////////////////////////////////////////////////////////////////////////
181 IMPLEMENT_FUNCTION(15, Abbot, chapter1)
182 if (savepoint.action == kActionDefault)
183 getSavePoints()->addData(kEntityAbbot, kAction203073664, 0);
184 IMPLEMENT_FUNCTION_END
185
186 //////////////////////////////////////////////////////////////////////////
187 IMPLEMENT_FUNCTION(16, Abbot, chapter2)
188 if (savepoint.action == kActionDefault)
189 getEntities()->clearSequences(kEntityAbbot);
190 IMPLEMENT_FUNCTION_END
191
192 //////////////////////////////////////////////////////////////////////////
193 IMPLEMENT_FUNCTION(17, Abbot, chapter3)
194 switch (savepoint.action) {
195 default:
196 break;
197
198 case kActionNone:
199 setup_inKitchen();
200 break;
201
202 case kActionDefault:
203 getEntities()->clearSequences(kEntityAbbot);
204
205 getData()->entityPosition = kPosition_5900;
206 getData()->location = kLocationInsideCompartment;
207 getData()->car = kCarRestaurant;
208 getData()->inventoryItem = kItemNone;
209 getData()->clothes = kClothesDefault;
210
211 break;
212 }
213 IMPLEMENT_FUNCTION_END
214
215 //////////////////////////////////////////////////////////////////////////
216 IMPLEMENT_FUNCTION(18, Abbot, inKitchen)
217 switch (savepoint.action) {
218 default:
219 break;
220
221 case kActionCallback:
222 switch (getCallback()) {
223 default:
224 break;
225
226 case 1:
227 getData()->entityPosition = kPosition_5800;
228 getData()->location = kLocationOutsideCompartment;
229
230 setCallback(2);
231 setup_draw("804DD");
232 break;
233
234 case 2:
235 getSavePoints()->push(kEntityAbbot, kEntityCooks, kAction236976550);
236 getEntities()->drawSequenceRight(kEntityAbbot, "804DS");
237
238 if (getEntities()->isInRestaurant(kEntityPlayer))
239 getEntities()->updateFrame(kEntityAbbot);
240
241 setCallback(3);
242 setup_callbackActionOnDirection();
243 break;
244
245 case 3:
246 setCallback(4);
247 setup_updateEntity(kCarRedSleeping, kPosition_6470);
248 break;
249
250 case 4:
251 getObjects()->update(kObjectCompartmentC, kEntityPlayer, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
252
253 setCallback(5);
254 setup_enterExitCompartment("617AC", kObjectCompartmentC);
255 break;
256
257 case 5:
258 getObjects()->update(kObjectCompartmentC, kEntityPlayer, kObjectLocation2, kCursorKeepValue, kCursorKeepValue);
259 getData()->entityPosition = kPosition_6470;
260 getData()->location = kLocationInsideCompartment;
261
262 setup_openCompartment();
263 break;
264 }
265 break;
266
267 case kAction192054567:
268 setCallback(1);
269 setup_callbackActionRestaurantOrSalon();
270 break;
271 }
272 IMPLEMENT_FUNCTION_END
273
274 //////////////////////////////////////////////////////////////////////////
275 IMPLEMENT_FUNCTION(19, Abbot, openCompartment)
276 switch (savepoint.action) {
277 default:
278 break;
279
280 case kActionNone:
281 if (getState()->time > kTime1953000) {
282 if (!params->param1) {
283 params->param1 = 1;
284 setCallback(3);
285 setup_playSound("MrB3010");
286 }
287 }
288 break;
289
290 case kActionDefault:
291 getEntities()->drawSequenceLeft(kEntityAbbot, "508A");
292 getSavePoints()->push(kEntityAbbot, kEntityBoutarel, kAction122358304);
293
294 setCallback(1);
295 setup_playSound("Abb3010");
296 break;
297
298 case kActionCallback:
299 switch (getCallback()) {
300 default:
301 break;
302
303 case 1:
304 setCallback(2);
305 setup_updateFromTime(900);
306 break;
307
308 case 2:
309 getEntities()->drawSequenceLeft(kEntityAbbot, "508B");
310 break;
311
312 case 3:
313 getSavePoints()->push(kEntityAbbot, kEntityBoutarel, kAction122288808);
314 setup_readPaper();
315 break;
316 }
317 }
318 IMPLEMENT_FUNCTION_END
319
320 //////////////////////////////////////////////////////////////////////////
321 IMPLEMENT_FUNCTION(20, Abbot, readPaper)
322 switch (savepoint.action) {
323 default:
324 break;
325
326 case kActionNone:
327 if (getState()->time > kTime1966500 && getEntities()->isInRestaurant(kEntityBoutarel))
328 setup_goToLunch();
329 break;
330
331 case kActionDefault:
332 getEntities()->drawSequenceLeft(kEntityAbbot, "509A");
333 break;
334 }
335 IMPLEMENT_FUNCTION_END
336
337 //////////////////////////////////////////////////////////////////////////
338 IMPLEMENT_FUNCTION(21, Abbot, goToLunch)
339 switch (savepoint.action) {
340 default:
341 break;
342
343 case kActionDefault:
344 setCallback(1);
345 setup_draw("509B");
346 break;
347
348 case kActionCallback:
349 switch (getCallback()) {
350 default:
351 break;
352
353 case 1:
354 getObjects()->update(kObjectCompartmentC, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
355 getObjects()->update(kObject50, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
356
357 setCallback(2);
358 setup_enterExitCompartment("617Mc", kObjectCompartmentC);
359 break;
360
361 case 2:
362 getData()->location = kLocationOutsideCompartment;
363
364 setCallback(3);
365 setup_updateEntity(kCarRestaurant, kPosition_850);
366 break;
367
368 case 3:
369 setCallback(4);
370 setup_callbackActionRestaurantOrSalon();
371 break;
372
373 case 4:
374 getData()->entityPosition = kPosition_1540;
375 getData()->location = kLocationOutsideCompartment;
376
377 setCallback(5);
378 setup_draw("804US");
379 break;
380
381 case 5:
382 getEntities()->drawSequenceRight(kEntityAbbot, "029J");
383 if (getEntities()->isInSalon(kEntityPlayer))
384 getEntities()->updateFrame(kEntityAbbot);
385
386 setCallback(6);
387 setup_callbackActionOnDirection();
388 break;
389
390 case 6:
391 getEntities()->drawSequenceLeft(kEntityAbbot, "029H");
392 getSavePoints()->push(kEntityAbbot, kEntityPascale, kAction207769280);
393 break;
394
395 case 7:
396 setup_haveLunch();
397 break;
398 }
399 break;
400
401 case kAction122288808:
402 getSavePoints()->push(kEntityAbbot, kEntityTables4, kAction136455232);
403 getData()->location = kLocationInsideCompartment;
404
405 setCallback(7);
406 setup_draw("029B");
407 break;
408 }
409 IMPLEMENT_FUNCTION_END
410
411 //////////////////////////////////////////////////////////////////////////
412 IMPLEMENT_FUNCTION(22, Abbot, haveLunch)
413 switch (savepoint.action) {
414 default:
415 break;
416
417 case kActionNone:
418 Entity::timeCheckSavepoint(kTime1971000, params->param1, kEntityAbbot, kEntityWaiter1, kAction218586752);
419
420 if (getState()->time > kTime1989000 && getEntities()->isSomebodyInsideRestaurantOrSalon()) {
421 getData()->inventoryItem = kItemNone;
422 setup_leaveLunch();
423 }
424 break;
425
426 case kAction1:
427 getData()->inventoryItem = kItemNone;
428
429 setCallback(1);
430 setup_savegame(kSavegameTypeEvent, kEventAbbotIntroduction);
431 break;
432
433 case kActionDefault:
434 getEntities()->drawSequenceLeft(kEntityAbbot, "029E");
435 if (!getEvent(kEventAbbotIntroduction))
436 getData()->inventoryItem = (InventoryItem)kCursorProcess;
437 break;
438
439 case kActionCallback:
440 if (getCallback() != 1)
441 break;
442
443 getAction()->playAnimation(kEventAbbotIntroduction);
444 getSound()->playSound(kEntityPlayer, "LIB036");
445 getScenes()->loadSceneFromPosition(kCarRestaurant, 61);
446 break;
447
448 case kAction122288808:
449 getEntities()->drawSequenceLeft(kEntityAbbot, "029E");
450 break;
451
452 case kAction122358304:
453 getEntities()->drawSequenceLeft(kEntityAbbot, "BLANK");
454 break;
455 }
456 IMPLEMENT_FUNCTION_END
457
458 //////////////////////////////////////////////////////////////////////////
459 IMPLEMENT_FUNCTION(23, Abbot, leaveLunch)
460 switch (savepoint.action) {
461 default:
462 break;
463
464 case kActionDefault:
465 getData()->location = kLocationOutsideCompartment;
466 getEntities()->updatePositionEnter(kEntityAbbot, kCarRestaurant, 67);
467
468 setCallback(1);
469 setup_callSavepoint("029F", kEntityTables4, kActionDrawTablesWithChairs, "029G");
470 break;
471
472 case kActionCallback:
473 switch (getCallback()) {
474 default:
475 break;
476
477 case 1:
478 getEntities()->updatePositionExit(kEntityAbbot, kCarRestaurant, 67);
479 getSavePoints()->push(kEntityAbbot, kEntityWaiter1, kAction270068760);
480 getSavePoints()->push(kEntityAbbot, kEntityAnna, kAction238936000);
481 getEntities()->drawSequenceRight(kEntityAbbot, "804DS");
482
483 if (getEntities()->isInRestaurant(kEntityPlayer))
484 getEntities()->updateFrame(kEntityAbbot);
485
486 setCallback(2);
487 setup_callbackActionOnDirection();
488 break;
489
490 case 2:
491 setCallback(3);
492 setup_updateEntity(kCarRedSleeping, kPosition_6470);
493 break;
494
495 case 3:
496 setCallback(4);
497 setup_enterExitCompartment2("617Cc", kObjectCompartmentC);
498 break;
499
500 case 4:
501 getData()->location = kLocationInsideCompartment;
502
503 setup_closedCompartment();
504 break;
505 }
506 break;
507 }
508 IMPLEMENT_FUNCTION_END
509
510 //////////////////////////////////////////////////////////////////////////
511 IMPLEMENT_FUNCTION(24, Abbot, closedCompartment)
512 switch (savepoint.action) {
513 default:
514 break;
515
516 case kActionNone:
517 if (!Entity::updateParameter(params->param1, getState()->time, 900))
518 break;
519
520 setup_goSalon1();
521 break;
522
523 case kActionKnock:
524 case kActionOpenDoor:
525 getObjects()->update(kObjectCompartmentC, kEntityAbbot, kObjectLocation1, kCursorNormal, kCursorNormal);
526 getObjects()->update(kObject50, kEntityAbbot, kObjectLocation1, kCursorNormal, kCursorNormal);
527
528 if (savepoint.action == kActionKnock) {
529 setCallback(1);
530 setup_playSound("LIB012");
531 } else {
532 setCallback(2);
533 setup_playSound("LIB013");
534 }
535 break;
536
537 case kActionDefault:
538 getEntities()->clearSequences(kEntityAbbot);
539 getObjects()->update(kObjectCompartmentC, kEntityAbbot, kObjectLocationNone, kCursorHandKnock, kCursorHand);
540 getObjects()->update(kObject50, kEntityAbbot, kObjectLocationNone, kCursorHandKnock, kCursorHand);
541 break;
542
543 case kActionCallback:
544 switch (getCallback()) {
545 default:
546 break;
547
548 case 1:
549 case 2:
550 setCallback(3);
551 setup_playSound("Abb3001");
552 break;
553
554 case 3:
555 getObjects()->update(kObjectCompartmentC, kEntityAbbot, kObjectLocation1, kCursorHandKnock, kCursorHand);
556 getObjects()->update(kObject50, kEntityAbbot, kObjectLocation1, kCursorHandKnock, kCursorHand);
557 break;
558 }
559 break;
560 }
561 IMPLEMENT_FUNCTION_END
562
563 //////////////////////////////////////////////////////////////////////////
564 IMPLEMENT_FUNCTION(25, Abbot, goSalon1)
565 switch (savepoint.action) {
566 default:
567 break;
568
569 case kActionDefault:
570 setCallback(1);
571 setup_enterExitCompartment("617Dc", kObjectCompartmentC);
572 break;
573
574 case kActionCallback:
575 switch (getCallback()) {
576 default:
577 break;
578
579 case 1:
580 getData()->location = kLocationOutsideCompartment;
581 getObjects()->update(kObjectCompartmentC, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
582 getObjects()->update(kObject50, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
583
584 setCallback(2);
585 setup_updateEntity(kCarRestaurant, kPosition_850);
586 break;
587
588 case 2:
589 setCallback(3);
590 setup_callbackActionRestaurantOrSalon();
591 break;
592
593 case 3:
594 getData()->entityPosition = kPosition_1540;
595 getData()->location = kLocationOutsideCompartment;
596
597 setCallback(4);
598 setup_updatePosition("115A", kCarRestaurant, 56);
599 break;
600
601 case 4:
602 getData()->location = kLocationInsideCompartment;
603 getScenes()->loadSceneFromItemPosition(kItem3);
604
605 setup_inSalon1();
606 break;
607 }
608 break;
609 }
610 IMPLEMENT_FUNCTION_END
611
612 //////////////////////////////////////////////////////////////////////////
613 IMPLEMENT_FUNCTION(26, Abbot, inSalon1)
614 switch (savepoint.action) {
615 default:
616 break;
617
618 case kActionNone:
619 if (!params->param1 || !Entity::updateParameterCheck(params->param2, getState()->time, 4500))
620 break;
621
622 if (getEntities()->isSomebodyInsideRestaurantOrSalon())
623 setup_goCompartment();
624 break;
625
626 case kActionDefault:
627 getSavePoints()->push(kEntityAbbot, kEntityKronos, kAction157159392);
628 getEntities()->drawSequenceLeft(kEntityAbbot, "115B");
629 break;
630
631 case kAction101169422:
632 params->param1 = 1;
633 break;
634
635 }
636 IMPLEMENT_FUNCTION_END
637
638 //////////////////////////////////////////////////////////////////////////
639 IMPLEMENT_FUNCTION(27, Abbot, goCompartment)
640 switch (savepoint.action) {
641 default:
642 break;
643
644 case kActionDefault:
645 setCallback(1);
646 setup_callbackActionRestaurantOrSalon();
647 break;
648
649 case kActionCallback:
650 switch (getCallback()) {
651 default:
652 break;
653
654 case 1:
655 getData()->location = kLocationOutsideCompartment;
656
657 setCallback(2);
658 setup_updatePosition("115C", kCarRestaurant, 56);
659 break;
660
661 case 2:
662 getInventory()->setLocationAndProcess(kItem3, kObjectLocation1);
663
664 setCallback(3);
665 setup_updateEntity(kCarRedSleeping, kPosition_6470);
666 break;
667
668 case 3:
669 getObjects()->update(kObjectCompartmentC, kEntityPlayer, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
670
671 setCallback(4);
672 setup_enterExitCompartment("617Ac", kObjectCompartmentC);
673 break;
674
675 case 4:
676 getObjects()->update(kObjectCompartmentC, kEntityPlayer, kObjectLocation2, kCursorKeepValue, kCursorKeepValue);
677 getData()->entityPosition = kPosition_6470;
678 getData()->location = kLocationInsideCompartment;
679
680 setup_openCompartment2();
681 break;
682 }
683 break;
684 }
685 IMPLEMENT_FUNCTION_END
686
687 //////////////////////////////////////////////////////////////////////////
688 IMPLEMENT_FUNCTION(28, Abbot, openCompartment2)
689 switch (savepoint.action) {
690 default:
691 break;
692
693 case kActionNone:
694 Entity::timeCheckCallback(kTime2052000, params->param1, 2, WRAP_SETUP_FUNCTION(Abbot, setup_goWander));
695 break;
696
697 case kActionDefault:
698 getSavePoints()->push(kEntityAbbot, kEntityBoutarel, kAction122358304);
699 getEntities()->drawSequenceLeft(kEntityAbbot, "508A");
700
701 setCallback(1);
702 setup_playSound("Abb3013");
703 break;
704
705 case kActionCallback:
706 if (getCallback() == 1)
707 getEntities()->drawSequenceLeft(kEntityAbbot, "508B");
708 break;
709
710 case kAction222609266:
711 setup_goSalon2();
712 }
713 IMPLEMENT_FUNCTION_END
714
715 //////////////////////////////////////////////////////////////////////////
716 IMPLEMENT_FUNCTION(29, Abbot, goWander)
717 switch (savepoint.action) {
718 default:
719 break;
720
721 case kActionDefault:
722 getSavePoints()->push(kEntityAbbot, kEntityBoutarel, kAction122288808);
723 getObjects()->update(kObjectCompartmentC, kEntityPlayer, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
724
725 setCallback(1);
726 setup_enterExitCompartment("617Bc", kObjectCompartmentC);
727 break;
728
729 case kActionCallback:
730 switch (getCallback()) {
731 default:
732 break;
733
734 case 1:
735 getObjects()->update(kObjectCompartmentC, kEntityPlayer, kObjectLocation2, kCursorKeepValue, kCursorKeepValue);
736
737 setCallback(2);
738 setup_updateEntity(kCarRedSleeping, kPosition_9460);
739 break;
740
741 case 2:
742 setCallback(3);
743 setup_updateFromTicks(450);
744 break;
745
746 case 3:
747 setCallback(4);
748 setup_updateEntity(kCarGreenSleeping, kPosition_540);
749 break;
750
751 case 4:
752 // compare with callback 2.
753 // This is taken from the original game as is,
754 // but do we really want real-time 30s in case 2 but simulated-time 15s (aka real-time 5s) here?
755 setCallback(5);
756 setup_updateFromTime(225);
757 break;
758
759 case 5:
760 setCallback(6);
761 setup_updateEntity(kCarRedSleeping, kPosition_6470);
762 break;
763
764 case 6:
765 getObjects()->update(kObjectCompartmentC, kEntityPlayer, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
766
767 setCallback(7);
768 setup_enterExitCompartment("617Ac", kObjectCompartmentC);
769 break;
770
771 case 7:
772 getObjects()->update(kObjectCompartmentC, kEntityPlayer, kObjectLocation2, kCursorKeepValue, kCursorKeepValue);
773 getSavePoints()->push(kEntityAbbot, kEntityBoutarel, kAction122358304);
774 getEntities()->drawSequenceLeft(kEntityAbbot, "508B");
775
776 callbackAction();
777 break;
778 }
779 break;
780 }
781 IMPLEMENT_FUNCTION_END
782
783 //////////////////////////////////////////////////////////////////////////
784 IMPLEMENT_FUNCTION(30, Abbot, goSalon2)
785 switch (savepoint.action) {
786 default:
787 break;
788
789 case kActionDefault:
790 setCallback(1);
791 setup_playSound("Abb3030");
792 break;
793
794 case kActionCallback:
795 switch (getCallback()) {
796 default:
797 break;
798
799 case 1:
800 getSavePoints()->push(kEntityAbbot, kEntityBoutarel, kAction122288808);
801 getObjects()->update(kObjectCompartmentC, kEntityPlayer, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
802
803 setCallback(2);
804 setup_enterExitCompartment("617Bc", kObjectCompartmentC);
805 break;
806
807 case 2:
808 getObjects()->update(kObjectCompartmentC, kEntityPlayer, kObjectLocation2, kCursorKeepValue, kCursorKeepValue);
809 getData()->location = kLocationOutsideCompartment;
810
811 setCallback(3);
812 setup_updateEntity(kCarRestaurant, kPosition_850);
813 break;
814
815 case 3:
816 setCallback(4);
817 setup_callbackActionRestaurantOrSalon();
818 break;
819
820 case 4:
821 getData()->entityPosition = kPosition_1540;
822 getData()->location = kLocationOutsideCompartment;
823
824 setCallback(5);
825 setup_updatePosition("115A", kCarRestaurant, 56);
826 break;
827
828 case 5:
829 getScenes()->loadSceneFromItemPosition(kItem3);
830 getData()->location = kLocationInsideCompartment;
831
832 setup_inSalon2();
833 break;
834 }
835 break;
836 }
837 IMPLEMENT_FUNCTION_END
838
839 //////////////////////////////////////////////////////////////////////////
840 IMPLEMENT_FUNCTION(31, Abbot, inSalon2)
841 switch (savepoint.action) {
842 default:
843 break;
844
845 case kActionNone:
846 if (params->param4 != kTimeInvalid && params->param2 < getState()->time) {
847 if (params->param3 < getState()->time) {
848 params->param4 = kTimeInvalid;
849
850 setCallback(1);
851 setup_callbackActionRestaurantOrSalon();
852 break;
853 } else {
854 if (!getEntities()->isInSalon(kEntityPlayer) || !params->param4)
855 params->param4 = (uint)getState()->time + 450;
856
857 if (params->param4 < getState()->time) {
858 params->param4 = kTimeInvalid;
859
860 setCallback(1);
861 setup_callbackActionRestaurantOrSalon();
862 break;
863 }
864 }
865 }
866
867 if (!params->param1)
868 break;
869
870 if (!Entity::updateParameter(params->param5, getState()->time, 450))
871 break;
872
873 setCallback(6);
874 setup_callbackActionRestaurantOrSalon();
875 break;
876
877 case kActionDefault:
878 params->param2 = (uint)getState()->time + 4500;
879 params->param3 = (uint)getState()->time + 18000;
880
881 getEntities()->drawSequenceLeft(kEntityAbbot, "115B");
882 break;
883
884 case kActionCallback:
885 switch (getCallback()) {
886 default:
887 break;
888
889 case 1:
890 getData()->location = kLocationOutsideCompartment;
891
892 setCallback(2);
893 setup_updatePosition("115E", kCarRestaurant, 56);
894 break;
895
896 case 2:
897 getInventory()->setLocationAndProcess(kItem3, kObjectLocation1);
898 getSavePoints()->push(kEntityAbbot, kEntityAlexei, kAction122358304);
899 getSound()->playSound(kEntityAbbot, "Abb3020");
900
901 setCallback(3);
902 setup_updatePosition("125A", kCarRestaurant, 52);
903 break;
904
905 case 3:
906 getData()->location = kLocationInsideCompartment;
907 getEntities()->drawSequenceLeft(kEntityAbbot, "125B");
908
909 setCallback(4);
910 setup_playSound("Abb3021");
911 break;
912
913 case 4:
914 getSound()->playSound(kEntityAbbot, "Abb3023");
915 getEntities()->updatePositionEnter(kEntityAbbot, kCarRestaurant, 52);
916
917 setCallback(5);
918 setup_draw2("125C1", "125C2", kEntityAlexei);
919 break;
920
921 case 5:
922 getEntities()->updatePositionExit(kEntityAbbot, kCarRestaurant, 52);
923 getEntities()->drawSequenceLeft(kEntityAbbot, "125D");
924 getSavePoints()->push(kEntityAbbot, kEntityAlexei, kAction122288808);
925 params->param1 = 1;
926
927 if (!Entity::updateParameter(params->param5, getState()->time, 450))
928 break;
929
930 setCallback(6);
931 setup_callbackActionRestaurantOrSalon();
932 break;
933
934 case 6:
935 getData()->location = kLocationOutsideCompartment;
936
937 setCallback(7);
938 setup_updatePosition("125E", kCarRestaurant, 52);
939 break;
940
941 case 7:
942 setup_goCompartment3();
943 break;
944 }
945 break;
946 }
947 IMPLEMENT_FUNCTION_END
948
949 //////////////////////////////////////////////////////////////////////////
950 IMPLEMENT_FUNCTION(32, Abbot, goCompartment3)
951 switch (savepoint.action) {
952 default:
953 break;
954
955 case kActionDefault:
956 setCallback(1);
957 setup_updateEntity(kCarRedSleeping, kPosition_6470);
958 break;
959
960 case kActionCallback:
961 switch (getCallback()) {
962 default:
963 break;
964
965 case 1:
966 getObjects()->update(kObjectCompartmentC, kEntityPlayer, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
967
968 setCallback(2);
969 setup_enterExitCompartment("617Ac", kObjectCompartmentC);
970 break;
971
972 case 2:
973 getObjects()->update(kObjectCompartmentC, kEntityPlayer, kObjectLocation2, kCursorKeepValue, kCursorKeepValue);
974 getData()->entityPosition = kPosition_6470;
975 getData()->location = kLocationInsideCompartment;
976 getSavePoints()->push(kEntityAbbot, kEntityBoutarel, kAction122358304);
977
978 setup_openCompartment3();
979 break;
980 }
981 break;
982 }
983 IMPLEMENT_FUNCTION_END
984
985 //////////////////////////////////////////////////////////////////////////
986 IMPLEMENT_FUNCTION(33, Abbot, openCompartment3)
987 switch (savepoint.action) {
988 default:
989 break;
990
991 case kActionNone:
992 if (params->param1 != kTimeInvalid && getState()->time > kTime2115000) {
993 if (getState()->time <= kTime2124000) {
994 if (!getEntities()->isDistanceBetweenEntities(kEntityAbbot, kEntityPlayer, 2000) || !params->param1)
995 params->param1 = (uint)getState()->time;
996
997 if (params->param1 >= getState()->time)
998 break;
999 }
1000
1001 params->param1 = kTimeInvalid;
1002
1003 setCallback(1);
1004 setup_playSound("Abb3014");
1005 }
1006 break;
1007
1008 case kActionDefault:
1009 getEntities()->drawSequenceLeft(kEntityAbbot, "508A");
1010 break;
1011
1012 case kActionCallback:
1013 if (getCallback() == 1)
1014 getEntities()->drawSequenceLeft(kEntityAbbot, "508B");
1015 break;
1016
1017 case kAction123712592:
1018 setup_goSalon3();
1019 break;
1020 }
1021 IMPLEMENT_FUNCTION_END
1022
1023 //////////////////////////////////////////////////////////////////////////
1024 IMPLEMENT_FUNCTION(34, Abbot, goSalon3)
1025 switch (savepoint.action) {
1026 default:
1027 break;
1028
1029 case kActionDefault:
1030 setCallback(1);
1031 setup_playSound("Abb3031");
1032 break;
1033
1034 case kActionCallback:
1035 switch (getCallback()) {
1036 default:
1037 break;
1038
1039 case 1:
1040 getSavePoints()->push(kEntityAbbot, kEntityBoutarel, kAction122288808);
1041 getObjects()->update(kObjectCompartmentC, kEntityPlayer, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
1042
1043 setCallback(2);
1044 setup_enterExitCompartment("617Bc", kObjectCompartmentC);
1045 break;
1046
1047 case 2:
1048 getObjects()->update(kObjectCompartmentC, kEntityPlayer, kObjectLocation2, kCursorKeepValue, kCursorKeepValue);
1049 getData()->location = kLocationOutsideCompartment;
1050
1051 setCallback(3);
1052 setup_updateEntity(kCarRestaurant, kPosition_850);
1053 break;
1054
1055 case 3:
1056 setCallback(4);
1057 setup_callbackActionRestaurantOrSalon();
1058 break;
1059
1060 case 4:
1061 getData()->entityPosition = kPosition_1540;
1062 getData()->location = kLocationOutsideCompartment;
1063
1064 setCallback(5);
1065 setup_updatePosition("115A", kCarRestaurant, 56);
1066 break;
1067
1068 case 5:
1069 getScenes()->loadSceneFromItemPosition(kItem3);
1070
1071 getData()->location = kLocationInsideCompartment;
1072 setup_inSalon3();
1073 break;
1074 }
1075 break;
1076 }
1077 IMPLEMENT_FUNCTION_END
1078
1079 //////////////////////////////////////////////////////////////////////////
1080 IMPLEMENT_FUNCTION(35, Abbot, inSalon3)
1081 switch (savepoint.action) {
1082 default:
1083 break;
1084
1085 case kActionNone:
1086 if (params->param2 == kTimeInvalid)
1087 break;
1088
1089 if (params->param1 >= getState()->time) {
1090 if (!getEntities()->isInSalon(kEntityPlayer) || !params->param2)
1091 params->param2 = (uint)getState()->time + 450;
1092
1093 if (params->param2 >= getState()->time)
1094 break;
1095 }
1096
1097 params->param2 = kTimeInvalid;
1098
1099 getSavePoints()->push(kEntityAbbot, kEntityAugust, kAction136196244);
1100
1101 setCallback(1);
1102 setup_updateFromTime(0);
1103 break;
1104
1105 case kActionDefault:
1106 getEntities()->drawSequenceLeft(kEntityAbbot, "115B");
1107 params->param1 = (uint)getState()->time + 9000;
1108 break;
1109
1110 case kActionCallback:
1111 switch (getCallback()) {
1112 default:
1113 break;
1114
1115 case 1:
1116 setCallback(2);
1117 setup_callbackActionRestaurantOrSalon();
1118 break;
1119
1120 case 2:
1121 getData()->location = kLocationOutsideCompartment;
1122 getSound()->playSound(kEntityAbbot, "Abb3040", kSoundVolumeEntityDefault, 45);
1123 getEntities()->updatePositionEnter(kEntityAbbot, kCarRestaurant, 57);
1124
1125 setCallback(3);
1126 setup_callSavepoint("121A", kEntityAugust, kAction122358304, "BOGUS");
1127 break;
1128
1129 case 3:
1130 getEntities()->updatePositionExit(kEntityAbbot, kCarRestaurant, 57);
1131 getInventory()->setLocationAndProcess(kItem3, kObjectLocation1);
1132 getData()->location = kLocationInsideCompartment;
1133
1134 setup_withAugust();
1135 break;
1136 }
1137 break;
1138 }
1139 IMPLEMENT_FUNCTION_END
1140
1141 //////////////////////////////////////////////////////////////////////////
1142 IMPLEMENT_FUNCTION(36, Abbot, withAugust)
1143 switch (savepoint.action) {
1144 default:
1145 break;
1146
1147 case kActionNone:
1148 switch (params->param2) {
1149 default:
1150 break;
1151
1152 case 1:
1153 if (params->param3 == kTimeInvalid)
1154 break;
1155
1156 if (params->param1 >= getState()->time) {
1157
1158 if (!getEntities()->isInSalon(kEntityPlayer) || !params->param3)
1159 params->param3 = (uint)getState()->time + 675;
1160
1161 if (params->param3 >= getState()->time)
1162 break;
1163 }
1164
1165 params->param3 = kTimeInvalid;
1166
1167 getSound()->playSound(kEntityAbbot, "Abb3041");
1168 break;
1169
1170 case 2:
1171 if (!Entity::updateParameter(params->param4, getState()->time, 900))
1172 break;
1173
1174 getSound()->playSound(kEntityAbbot, "Abb3042");
1175 break;
1176
1177 case 3:
1178 getSound()->playSound(kEntityAbbot, "Abb3043");
1179 getEntities()->updatePositionEnter(kEntityAbbot, kCarRestaurant, 57);
1180
1181 setCallback(1);
1182 setup_callSavepoint("121D", kEntityAugust, kAction122288808, "BOGUS");
1183 break;
1184 }
1185 break;
1186
1187 case kActionEndSound:
1188 ++params->param2;
1189 break;
1190
1191 case kActionDefault:
1192 params->param1 = (uint)getState()->time + 4500;
1193 getEntities()->drawSequenceLeft(kEntityAbbot, "121B");
1194 break;
1195
1196 case kActionDrawScene:
1197 if (getEntities()->isPlayerPosition(kCarRestaurant, 57))
1198 getScenes()->loadSceneFromPosition(kCarRestaurant, 50);
1199 break;
1200
1201 case kActionCallback:
1202 if (getCallback() == 1) {
1203 getEntities()->updatePositionExit(kEntityAbbot, kCarRestaurant, 57);
1204 setup_goCompartment4();
1205 }
1206 break;
1207 }
1208 IMPLEMENT_FUNCTION_END
1209
1210 //////////////////////////////////////////////////////////////////////////
1211 IMPLEMENT_FUNCTION(37, Abbot, goCompartment4)
1212 switch (savepoint.action) {
1213 default:
1214 break;
1215
1216 case kActionDefault:
1217 setCallback(1);
1218 setup_updateEntity(kCarRedSleeping, kPosition_6470);
1219 break;
1220
1221 case kActionCallback:
1222 switch (getCallback()) {
1223 default:
1224 break;
1225
1226 case 1:
1227 getObjects()->update(kObjectCompartmentC, kEntityPlayer, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
1228
1229 setCallback(2);
1230 setup_enterExitCompartment("617Ac", kObjectCompartmentC);
1231 break;
1232
1233 case 2:
1234 getObjects()->update(kObjectCompartmentC, kEntityPlayer, kObjectLocation2, kCursorKeepValue, kCursorKeepValue);
1235 getData()->entityPosition = kPosition_6470;
1236 getData()->location = kLocationInsideCompartment;
1237 getSavePoints()->push(kEntityAbbot, kEntityBoutarel, kAction122358304);
1238
1239 setup_inCompartment4();
1240 break;
1241 }
1242 break;
1243 }
1244 IMPLEMENT_FUNCTION_END
1245
1246 //////////////////////////////////////////////////////////////////////////
1247 IMPLEMENT_FUNCTION(38, Abbot, inCompartment4)
1248 switch (savepoint.action) {
1249 default:
1250 break;
1251
1252 case kActionDefault:
1253 getEntities()->drawSequenceLeft(kEntityAbbot, "508A");
1254
1255 setCallback(1);
1256 setup_playSound("Abb3014A");
1257 break;
1258
1259 case kActionCallback:
1260 if (getCallback() == 1)
1261 getEntities()->drawSequenceLeft(kEntityAbbot, "508B");
1262 break;
1263 }
1264 IMPLEMENT_FUNCTION_END
1265
1266 //////////////////////////////////////////////////////////////////////////
1267 IMPLEMENT_FUNCTION(39, Abbot, chapter4)
1268 switch (savepoint.action) {
1269 default:
1270 break;
1271
1272 case kActionNone:
1273 setup_chapter4Handler();
1274 break;
1275
1276 case kActionDefault:
1277 getEntities()->clearSequences(kEntityAbbot);
1278
1279 getData()->car = kCarRestaurant;
1280 getData()->inventoryItem = kItemNone;
1281
1282 ENTITY_PARAM(0, 1) = 0;
1283
1284 break;
1285 }
1286 IMPLEMENT_FUNCTION_END
1287
1288 //////////////////////////////////////////////////////////////////////////
1289 IMPLEMENT_FUNCTION_II(40, Abbot, doWalkSearchingForCath, CarIndex, EntityPosition)
1290 switch (savepoint.action) {
1291 default:
1292 break;
1293
1294 case kActionNone:
1295 if (getEntities()->updateEntity(kEntityAbbot, (CarIndex)params->param1, (EntityPosition)params->param2)) {
1296 callbackAction();
1297 } else if (!getEvent(kEventAbbotInvitationDrink)
1298 && getEntities()->isDistanceBetweenEntities(kEntityAbbot, kEntityPlayer, 1000)
1299 && !getEntities()->isInsideCompartments(kEntityPlayer)
1300 && !getEntities()->checkFields10(kEntityPlayer)) {
1301
1302 if (getData()->car == kCarGreenSleeping || getData()->car == kCarRedSleeping) {
1303 setCallback(1);
1304 setup_savegame(kSavegameTypeEvent, kEventAbbotInvitationDrink);
1305 }
1306 }
1307 break;
1308
1309 case kActionDefault:
1310 if (getEntities()->updateEntity(kEntityAbbot, (CarIndex)params->param1, (EntityPosition)params->param2))
1311 callbackAction();
1312 break;
1313
1314 case kActionCallback:
1315 if (getCallback() == 1) {
1316 getAction()->playAnimation(kEventAbbotInvitationDrink);
1317 getEntities()->loadSceneFromEntityPosition(getData()->car, (EntityPosition)(getData()->entityPosition + (750 * (getData()->direction == kDirectionUp ? -1 : 1))), getData()->direction == kDirectionUp);
1318 }
1319 break;
1320 }
1321 IMPLEMENT_FUNCTION_END
1322
1323 //////////////////////////////////////////////////////////////////////////
1324 IMPLEMENT_FUNCTION(41, Abbot, chapter4Handler)
1325 switch (savepoint.action) {
1326 default:
1327 break;
1328
1329 case kActionNone:
1330 Entity::timeCheckSavepoint(kTime2358000, params->param1, kEntityAbbot, kEntityWaiter1, kAction218128129);
1331
1332 if (getState()->time > kTime2389500 && getEntities()->isSomebodyInsideRestaurantOrSalon())
1333 setup_leaveDinner();
1334
1335 break;
1336
1337 case kActionDefault:
1338 getSavePoints()->push(kEntityAbbot, kEntityTables4, kAction136455232);
1339 getEntities()->drawSequenceLeft(kEntityAbbot, "029E");
1340 getData()->location = kLocationInsideCompartment;
1341 break;
1342
1343 case kAction122288808:
1344 getEntities()->drawSequenceLeft(kEntityAbbot, "029E");
1345 break;
1346
1347 case kAction122358304:
1348 getEntities()->drawSequenceLeft(kEntityAbbot, "BLANK");
1349 break;
1350 }
1351 IMPLEMENT_FUNCTION_END
1352
1353 //////////////////////////////////////////////////////////////////////////
1354 IMPLEMENT_FUNCTION(42, Abbot, leaveDinner)
1355 switch (savepoint.action) {
1356 default:
1357 break;
1358
1359 case kActionDefault:
1360 getData()->location = kLocationOutsideCompartment;
1361 getEntities()->updatePositionEnter(kEntityAbbot, kCarRestaurant, 67);
1362
1363 setCallback(1);
1364 setup_callSavepoint("029F", kEntityTables4, kActionDrawTablesWithChairs, "029G");
1365 break;
1366
1367 case kActionCallback:
1368 switch (getCallback()) {
1369 default:
1370 break;
1371
1372 case 1:
1373 getEntities()->updatePositionExit(kEntityAbbot, kCarRestaurant, 67);
1374 getSavePoints()->push(kEntityAbbot, kEntityWaiter1, kAction270068760);
1375 getEntities()->drawSequenceRight(kEntityAbbot, "804DS");
1376
1377 if (getEntities()->isInRestaurant(kEntityPlayer))
1378 getEntities()->updateFrame(kEntityAbbot);
1379
1380 setCallback(2);
1381 setup_callbackActionOnDirection();
1382 break;
1383
1384 case 2:
1385 setCallback(3);
1386 setup_updateEntity(kCarRedSleeping, kPosition_6470);
1387 break;
1388
1389 case 3:
1390 setCallback(4);
1391 setup_enterExitCompartment2("617Cc", kObjectCompartmentC);
1392 break;
1393
1394 case 4:
1395 getData()->location = kLocationInsideCompartment;
1396 getEntities()->clearSequences(kEntityAbbot);
1397
1398 setup_inCompartment();
1399 break;
1400 }
1401 break;
1402 }
1403 IMPLEMENT_FUNCTION_END
1404
1405 //////////////////////////////////////////////////////////////////////////
1406 IMPLEMENT_FUNCTION(43, Abbot, inCompartment)
1407 switch (savepoint.action) {
1408 default:
1409 break;
1410
1411 case kActionNone:
1412 if (params->param1 && params->param4 != kTimeInvalid) {
1413 if (getState()->time > kTime2452500) {
1414 params->param4 = kTimeInvalid;
1415
1416 setCallback(1);
1417 setup_playSound("Abb4002");
1418 break;
1419 } else {
1420 if (!getEntities()->isDistanceBetweenEntities(kEntityAbbot, kEntityPlayer, 1000) || getSoundQueue()->isBuffered(kEntityBoutarel) || !params->param4)
1421 params->param4 = (uint)getState()->time;
1422
1423 if (params->param4 < getState()->time) {
1424 params->param4 = kTimeInvalid;
1425
1426 setCallback(1);
1427 setup_playSound("Abb4002");
1428 break;
1429 }
1430 }
1431 }
1432
1433 label_callback_1:
1434 if (Entity::timeCheck(kTime2466000, params->param5, WRAP_SETUP_FUNCTION(Abbot, setup_function44)))
1435 break;
1436
1437 if (params->param3) {
1438 if (!Entity::updateParameter(params->param6, getState()->timeTicks, 75))
1439 break;
1440
1441 params->param2 = 1;
1442 params->param3 = 0;
1443
1444 getObjects()->update(kObjectCompartmentC, kEntityAbbot, kObjectLocation1, kCursorNormal, kCursorNormal);
1445 getObjects()->update(kObject50, kEntityAbbot, kObjectLocation1, kCursorNormal, kCursorNormal);
1446 }
1447
1448 params->param6 = 0;
1449 break;
1450
1451 case kActionKnock:
1452 case kActionOpenDoor:
1453 getObjects()->update(kObjectCompartmentC, kEntityAbbot, kObjectLocation1, kCursorNormal, kCursorNormal);
1454 getObjects()->update(kObject50, kEntityAbbot, kObjectLocation1, kCursorNormal, kCursorNormal);
1455
1456 if (params->param3) {
1457 setCallback(savepoint.param.intValue == 50 ? 5 : 6);
1458 setup_playSound(savepoint.param.intValue == 50 ? getSound()->justAMinuteCath() : getSound()->wrongDoorCath());
1459 } else {
1460 setCallback(savepoint.action == kActionKnock ? 2 : 3);
1461 setup_playSound(savepoint.action == kActionKnock ? "LIB012" : "LIB013");
1462 }
1463 break;
1464
1465 case kActionDefault:
1466 getObjects()->update(kObjectCompartmentC, kEntityAbbot, kObjectLocation1, kCursorHandKnock, kCursorHand);
1467 getObjects()->update(kObject50, kEntityAbbot, kObjectLocation1, kCursorHandKnock, kCursorHand);
1468 break;
1469
1470 case kActionDrawScene:
1471 if (params->param2 || params->param3) {
1472 getObjects()->update(kObjectCompartmentC, kEntityAbbot, kObjectLocation1, kCursorHandKnock, kCursorHand);
1473 getObjects()->update(kObject50, kEntityAbbot, kObjectLocation1, kCursorHandKnock, kCursorHand);
1474
1475 params->param2 = 0;
1476 params->param3 = 0;
1477 }
1478 break;
1479
1480 case kActionCallback:
1481 switch (getCallback()) {
1482 default:
1483 break;
1484
1485 case 1:
1486 goto label_callback_1;
1487
1488 case 2:
1489 case 3:
1490 setCallback(4);
1491 setup_playSound("Abb3001");
1492 break;
1493
1494 case 4:
1495 getObjects()->update(kObjectCompartmentC, kEntityAbbot, kObjectLocation1, kCursorTalk, kCursorNormal);
1496 getObjects()->update(kObject50, kEntityAbbot, kObjectLocation1, kCursorTalk, kCursorNormal);
1497
1498 params->param3 = 1;
1499 break;
1500
1501 case 5:
1502 case 6:
1503 params->param2 = 1;
1504 params->param3 = 0;
1505 break;
1506 }
1507 break;
1508
1509 case kAction101687594:
1510 params->param1 = 1;
1511 break;
1512
1513 case kAction159003408:
1514 params->param1 = 0;
1515 break;
1516 }
1517 IMPLEMENT_FUNCTION_END
1518
1519 //////////////////////////////////////////////////////////////////////////
1520 IMPLEMENT_FUNCTION(44, Abbot, function44)
1521 switch (savepoint.action) {
1522 default:
1523 break;
1524
1525 case kActionDefault:
1526 getData()->entityPosition = kPosition_6470;
1527 getData()->location = kLocationInsideCompartment;
1528 getData()->car = kCarRedSleeping;
1529
1530 getEntities()->clearSequences(kEntityAbbot);
1531
1532 getObjects()->update(kObjectCompartmentC, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
1533 getObjects()->update(kObject50, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
1534 break;
1535
1536 case kAction104060776:
1537 setup_conferring();
1538 break;
1539 }
1540 IMPLEMENT_FUNCTION_END
1541
1542 //////////////////////////////////////////////////////////////////////////
1543 IMPLEMENT_FUNCTION(45, Abbot, conferring)
1544 switch (savepoint.action) {
1545 default:
1546 break;
1547
1548 case kActionDefault:
1549 getData()->entityPosition = kPosition_6471;
1550 getData()->car = kCarRedSleeping;
1551 getData()->location = kLocationOutsideCompartment;
1552
1553 RESET_ENTITY_STATE(kEntityVerges, Verges, setup_resetState);
1554
1555 getEntities()->drawSequenceLeft(kEntityAbbot, "617Ec");
1556 getEntities()->enterCompartment(kEntityAbbot, kObjectCompartmentC, true);
1557
1558 setCallback(1);
1559 setup_playSound("Abb4010");
1560 break;
1561
1562 case kActionCallback:
1563 switch (getCallback()) {
1564 default:
1565 break;
1566
1567 case 1:
1568 setCallback(2);
1569 setup_enterExitCompartment("617Kc", kObjectCompartmentC);
1570 break;
1571
1572 case 2:
1573 getEntities()->exitCompartment(kEntityAbbot, kObjectCompartmentC, true);
1574 getSavePoints()->push(kEntityAbbot, kEntityVerges, kAction125233040);
1575
1576 setup_goSalon4();
1577 break;
1578 }
1579 break;
1580 }
1581 IMPLEMENT_FUNCTION_END
1582
1583 //////////////////////////////////////////////////////////////////////////
1584 IMPLEMENT_FUNCTION(46, Abbot, goSalon4)
1585 switch (savepoint.action) {
1586 default:
1587 break;
1588
1589 case kActionDefault:
1590 getData()->entityPosition = kPosition_6471;
1591
1592 setCallback(1);
1593 setup_doWalkSearchingForCath(kCarRestaurant, kPosition_850);
1594 break;
1595
1596 case kActionCallback:
1597 if (getCallback() == 1)
1598 setup_beforeBomb();
1599 break;
1600 }
1601 IMPLEMENT_FUNCTION_END
1602
1603 //////////////////////////////////////////////////////////////////////////
1604 IMPLEMENT_FUNCTION(47, Abbot, beforeBomb)
1605 switch (savepoint.action) {
1606 default:
1607 break;
1608
1609 case kAction1:
1610 setCallback(3);
1611 setup_savegame(kSavegameTypeEvent, kEventAbbotDrinkGiveDetonator);
1612 break;
1613
1614 case kActionDefault:
1615 setCallback(1);
1616 setup_callbackActionRestaurantOrSalon();
1617 break;
1618
1619 case kActionCallback:
1620 switch (getCallback()) {
1621 default:
1622 break;
1623
1624 case 1:
1625 getData()->entityPosition = kPosition_1540;
1626 getData()->location = kLocationOutsideCompartment;
1627
1628 setCallback(2);
1629 setup_draw("126A");
1630 break;
1631
1632 case 2:
1633 getData()->location = kLocationInsideCompartment;
1634 getEntities()->drawSequenceLeft(kEntityAbbot, "126B");
1635 getData()->inventoryItem = kItemBomb;
1636 break;
1637
1638 case 3:
1639 getAction()->playAnimation(kEventAbbotDrinkGiveDetonator);
1640 getLogic()->gameOver(kSavegameTypeIndex, 1, kSceneNone, true);
1641 break;
1642 }
1643 break;
1644 }
1645 IMPLEMENT_FUNCTION_END
1646
1647 //////////////////////////////////////////////////////////////////////////
1648 IMPLEMENT_FUNCTION(48, Abbot, afterBomb)
1649 switch (savepoint.action) {
1650 default:
1651 break;
1652
1653 case kActionNone:
1654 if (ENTITY_PARAM(0, 1))
1655 getData()->inventoryItem = kItemInvalid;
1656
1657 if (Entity::updateParameter(params->param1, getState()->time, 1800)) {
1658 getData()->inventoryItem = kItemNone;
1659
1660 setCallback(4);
1661 setup_updatePosition("126C", kCarRestaurant, 52);
1662 break;
1663 }
1664
1665 Entity::timeCheckCallbackInventory(kTime2533500, params->param2, 5, WRAP_SETUP_FUNCTION(Abbot, setup_callbackActionRestaurantOrSalon));
1666 break;
1667
1668 case kAction1:
1669 getData()->inventoryItem = kItemNone;
1670
1671 setCallback(9);
1672 setup_savegame(kSavegameTypeEvent, kEventAbbotDrinkDefuse);
1673 break;
1674
1675 case kActionDefault:
1676 getData()->entityPosition = kPosition_850;
1677 getData()->location = kLocationOutsideCompartment;
1678 getData()->car = kCarRedSleeping;
1679 getData()->inventoryItem = kItemNone;
1680
1681 getSavePoints()->push(kEntityAbbot, kEntityVerges, kAction125233040);
1682
1683 setCallback(1);
1684 setup_updateEntity(kCarRestaurant, kPosition_850);
1685 break;
1686
1687 case kActionCallback:
1688 switch (getCallback()) {
1689 default:
1690 break;
1691
1692 case 1:
1693 setCallback(2);
1694 setup_callbackActionRestaurantOrSalon();
1695 break;
1696
1697 case 2:
1698 getData()->entityPosition = kPosition_1540;
1699 getData()->location = kLocationOutsideCompartment;
1700
1701 setCallback(3);
1702 setup_updatePosition("126A", kCarRestaurant, 52);
1703 break;
1704
1705 case 3:
1706 getData()->location = kLocationInsideCompartment;
1707 getEntities()->drawSequenceLeft(kEntityAbbot, "126B");
1708 break;
1709
1710 case 4:
1711 if (!getEvent(kEventAbbotDrinkDefuse) && ENTITY_PARAM(0, 1))
1712 getData()->inventoryItem = kItemInvalid;
1713
1714 getEntities()->drawSequenceLeft(kEntityAbbot, "126B");
1715 params->param1 = 0;
1716
1717 Entity::timeCheckCallbackInventory(kTime2533500, params->param2, 5, WRAP_SETUP_FUNCTION(Abbot, setup_callbackActionRestaurantOrSalon));
1718 break;
1719
1720 case 5:
1721 getData()->location = kLocationInsideCompartment;
1722
1723 setCallback(6);
1724 setup_updatePosition("126D", kCarRestaurant, 52);
1725 break;
1726
1727 case 6:
1728 setCallback(7);
1729 setup_updateEntity(kCarRedSleeping, kPosition_6470);
1730 break;
1731
1732 case 7:
1733 setCallback(8);
1734 setup_enterExitCompartment2("617Cc", kObjectCompartmentC);
1735 break;
1736
1737 case 8:
1738 getData()->location = kLocationInsideCompartment;
1739 getEntities()->clearSequences(kEntityAbbot);
1740
1741 setup_function44();
1742 break;
1743
1744 case 9:
1745 getAction()->playAnimation(kEventAbbotDrinkDefuse);
1746 getEntities()->drawSequenceLeft(kEntityAbbot, "126B");
1747 getSavePoints()->push(kEntityAbbot, kEntityAnna, kAction100969180);
1748 getScenes()->loadSceneFromPosition(kCarRestaurant, 58);
1749 break;
1750 }
1751 break;
1752 }
1753 IMPLEMENT_FUNCTION_END
1754
1755 //////////////////////////////////////////////////////////////////////////
1756 IMPLEMENT_FUNCTION(49, Abbot, catchCath)
1757 switch (savepoint.action) {
1758 default:
1759 break;
1760
1761 case kActionNone:
1762 if (!Entity::updateParameter(params->param1, getState()->timeTicks, 150))
1763 break;
1764
1765 getSavePoints()->push(kEntityAbbot, kEntityAbbot, kAction157489665);
1766 break;
1767
1768 case kActionKnock:
1769 if (!getSoundQueue()->isBuffered("LIB012", true))
1770 getSound()->playSound(kEntityPlayer, "LIB012");
1771 break;
1772
1773 case kActionOpenDoor:
1774 case kAction157489665:
1775 getSavePoints()->push(kEntityAbbot, kEntityTatiana, kAction238790488);
1776 getObjects()->update(kObjectCompartment2, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
1777 getObjects()->update(kObjectHandleInsideBathroom, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
1778
1779 setCallback(1);
1780 setup_savegame(kSavegameTypeEvent, kEventAbbotWrongCompartment);
1781 break;
1782
1783 case kActionDefault:
1784 getData()->car = kCarGreenSleeping;
1785 getData()->entityPosition = kPosition_7500;
1786 getData()->location = kLocationInsideCompartment;
1787
1788 getSavePoints()->call(kEntityAbbot, kEntityTables4, kActionDrawTablesWithChairs, "029G");
1789 getSavePoints()->push(kEntityAbbot, kEntityWaiter1, kAction270068760);
1790 getSavePoints()->push(kEntityAbbot, kEntityBoutarel, kAction125039808);
1791 getObjects()->update(kObjectCompartment2, kEntityAbbot, kObjectLocation1, kCursorHandKnock, kCursorHand);
1792 getObjects()->update(kObjectHandleInsideBathroom, kEntityAbbot, kObjectLocation1, kCursorHandKnock, kCursorHand);
1793 break;
1794
1795 case kActionCallback:
1796 switch (getCallback()) {
1797 default:
1798 break;
1799
1800 case 1:
1801 getAction()->playAnimation(getObjects()->get(kObjectCompartment2).model == kObjectModel1 ? kEventAbbotWrongCompartmentBed : kEventAbbotWrongCompartment);
1802 getEntities()->updateEntity(kEntityAbbot, kCarRedSleeping, kPosition_6470);
1803 getSound()->playSound(kEntityPlayer, "LIB015");
1804 getScenes()->loadSceneFromObject(kObjectCompartment2, true);
1805
1806 setCallback(2);
1807 setup_updateEntity(kCarRedSleeping, kPosition_6470);
1808 break;
1809
1810 case 2:
1811 setCallback(3);
1812 setup_enterExitCompartment2("617Cc", kObjectCompartmentC);
1813 break;
1814
1815 case 3:
1816 getData()->location = kLocationInsideCompartment;
1817 getEntities()->clearSequences(kEntityAbbot);
1818 getObjects()->update(kObjectCompartmentC, kEntityAbbot, kObjectLocation1, kCursorHandKnock, kCursorHand);
1819
1820 setup_inCompartment();
1821 break;
1822 }
1823 break;
1824 }
1825 IMPLEMENT_FUNCTION_END
1826
1827 //////////////////////////////////////////////////////////////////////////
1828 IMPLEMENT_FUNCTION(50, Abbot, chapter5)
1829 switch (savepoint.action) {
1830 default:
1831 break;
1832
1833 case kActionNone:
1834 setup_chapter5Handler();
1835 break;
1836
1837 case kActionDefault:
1838 getEntities()->clearSequences(kEntityAbbot);
1839
1840 getData()->entityPosition = kPosition_3969;
1841 getData()->location = kLocationInsideCompartment;
1842 getData()->car = kCarRestaurant;
1843 getData()->inventoryItem = kItemNone;
1844 getData()->clothes = kClothesDefault;
1845 break;
1846 }
1847 IMPLEMENT_FUNCTION_END
1848
1849 //////////////////////////////////////////////////////////////////////////
1850 IMPLEMENT_FUNCTION(51, Abbot, chapter5Handler)
1851 if (savepoint.action == kActionProceedChapter5)
1852 setup_function52();
1853 IMPLEMENT_FUNCTION_END
1854
1855 //////////////////////////////////////////////////////////////////////////
1856 IMPLEMENT_FUNCTION(52, Abbot, function52)
1857 switch (savepoint.action) {
1858 default:
1859 break;
1860
1861 case kActionDefault:
1862 getEntities()->clearSequences(kEntityAbbot);
1863
1864 getData()->entityPosition = kPositionNone;
1865 getData()->location = kLocationOutsideCompartment;
1866 getData()->car = kCarNone;
1867 break;
1868
1869 case kAction135600432:
1870 setup_runningTrain();
1871 break;
1872 }
1873 IMPLEMENT_FUNCTION_END
1874
1875 //////////////////////////////////////////////////////////////////////////
1876 IMPLEMENT_FUNCTION(53, Abbot, runningTrain)
1877 switch (savepoint.action) {
1878 default:
1879 break;
1880
1881 case kActionDefault:
1882 getInventory()->setLocationAndProcess(kItem25, kObjectLocation1);
1883 getSavePoints()->push(kEntityAbbot, kEntityAnna, kAction158480160);
1884 break;
1885
1886 case kActionCallback:
1887 switch (getCallback()) {
1888 default:
1889 break;
1890
1891 case 1:
1892 getAction()->playAnimation(kEventLocomotiveAbbotGetSomeRest);
1893 getScenes()->processScene();
1894 break;
1895
1896 case 2:
1897 getAction()->playAnimation(kEventLocomotiveAbbotShoveling);
1898 getScenes()->processScene();
1899 break;
1900 }
1901 break;
1902
1903 case kAction168646401:
1904 if (!getEvent(kEventLocomotiveAbbotGetSomeRest)) {
1905 setCallback(1);
1906 setup_savegame(kSavegameTypeEvent, kEventLocomotiveAbbotGetSomeRest);
1907 break;
1908 }
1909
1910 if (!getEvent(kEventLocomotiveAbbotShoveling)) {
1911 setCallback(2);
1912 setup_savegame(kSavegameTypeEvent, kEventLocomotiveAbbotShoveling);
1913 break;
1914 }
1915
1916 getAction()->playAnimation(kEventLocomotiveAbbotShoveling);
1917 getScenes()->processScene();
1918 break;
1919 }
1920 IMPLEMENT_FUNCTION_END
1921
1922 } // End of namespace LastExpress
1923