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