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/anna.h"
24 
25 #include "lastexpress/entities/vesna.h"
26 
27 #include "lastexpress/fight/fight.h"
28 
29 #include "lastexpress/game/action.h"
30 #include "lastexpress/game/entities.h"
31 #include "lastexpress/game/inventory.h"
32 #include "lastexpress/game/logic.h"
33 #include "lastexpress/game/object.h"
34 #include "lastexpress/game/savepoint.h"
35 #include "lastexpress/game/scenes.h"
36 #include "lastexpress/game/state.h"
37 
38 #include "lastexpress/sound/queue.h"
39 
40 #include "lastexpress/lastexpress.h"
41 
42 namespace LastExpress {
43 
Anna(LastExpressEngine * engine)44 Anna::Anna(LastExpressEngine *engine) : Entity(engine, kEntityAnna) {
45 	ADD_CALLBACK_FUNCTION(Anna, reset);
46 	ADD_CALLBACK_FUNCTION_S(Anna, draw);
47 	ADD_CALLBACK_FUNCTION_SII(Anna, updatePosition);
48 	ADD_CALLBACK_FUNCTION_SI(Anna, enterExitCompartment);
49 	ADD_CALLBACK_FUNCTION(Anna, callbackActionOnDirection);
50 	ADD_CALLBACK_FUNCTION_SIIS(Anna, callSavepoint);
51 	ADD_CALLBACK_FUNCTION_S(Anna, playSound);
52 	ADD_CALLBACK_FUNCTION(Anna, callbackActionRestaurantOrSalon);
53 	ADD_CALLBACK_FUNCTION_II(Anna, savegame);
54 	ADD_CALLBACK_FUNCTION_II(Anna, updateEntity);
55 	ADD_CALLBACK_FUNCTION_I(Anna, updateFromTime);
56 	ADD_CALLBACK_FUNCTION(Anna, practiceMusic);
57 	ADD_CALLBACK_FUNCTION_SSI(Anna, draw2);
58 	ADD_CALLBACK_FUNCTION_I(Anna, updateFromTicks);
59 	ADD_CALLBACK_FUNCTION_IS(Anna, compartmentLogic);
60 	ADD_CALLBACK_FUNCTION(Anna, chapter1);
61 	ADD_CALLBACK_FUNCTION_II(Anna, doWalkP1);
62 	ADD_CALLBACK_FUNCTION_I(Anna, diningLogic);
63 	ADD_CALLBACK_FUNCTION(Anna, fleeTyler);
64 	ADD_CALLBACK_FUNCTION(Anna, waitDinner);
65 	ADD_CALLBACK_FUNCTION(Anna, goDinner);
66 	ADD_CALLBACK_FUNCTION(Anna, function22);
67 	ADD_CALLBACK_FUNCTION(Anna, waitingDinner);
68 	ADD_CALLBACK_FUNCTION(Anna, waitingDinner2);
69 	ADD_CALLBACK_FUNCTION(Anna, eatingDinner);
70 	ADD_CALLBACK_FUNCTION(Anna, leaveDinner);
71 	ADD_CALLBACK_FUNCTION(Anna, freshenUp);
72 	ADD_CALLBACK_FUNCTION(Anna, goSalon);
73 	ADD_CALLBACK_FUNCTION(Anna, waitAugust);
74 	ADD_CALLBACK_FUNCTION(Anna, function30);
75 	ADD_CALLBACK_FUNCTION(Anna, leaveAugust);
76 	ADD_CALLBACK_FUNCTION(Anna, returnCompartment);
77 	ADD_CALLBACK_FUNCTION(Anna, readyForBed);
78 	ADD_CALLBACK_FUNCTION(Anna, asleep);
79 	ADD_CALLBACK_FUNCTION(Anna, wakeNight);
80 	ADD_CALLBACK_FUNCTION(Anna, goVassili);
81 	ADD_CALLBACK_FUNCTION(Anna, function37);
82 	ADD_CALLBACK_FUNCTION(Anna, speakTatiana);
83 	ADD_CALLBACK_FUNCTION_II(Anna, doWalk1019);
84 	ADD_CALLBACK_FUNCTION(Anna, leaveTatiana);
85 	ADD_CALLBACK_FUNCTION(Anna, goBackToSleep);
86 	ADD_CALLBACK_FUNCTION(Anna, chapter2);
87 	ADD_CALLBACK_FUNCTION(Anna, inPart2);
88 	ADD_CALLBACK_FUNCTION(Anna, chapter3);
89 	ADD_CALLBACK_FUNCTION_I(Anna, exitCompartment);
90 	ADD_CALLBACK_FUNCTION(Anna, practicing);
91 	ADD_CALLBACK_FUNCTION(Anna, goLunch);
92 	ADD_CALLBACK_FUNCTION(Anna, lunch);
93 	ADD_CALLBACK_FUNCTION(Anna, leaveTableWithAugust);
94 	ADD_CALLBACK_FUNCTION(Anna, leaveLunch);
95 	ADD_CALLBACK_FUNCTION(Anna, afterLunch);
96 	ADD_CALLBACK_FUNCTION(Anna, returnCompartment3);
97 	ADD_CALLBACK_FUNCTION(Anna, dressing);
98 	ADD_CALLBACK_FUNCTION(Anna, giveMaxToConductor2);
99 	ADD_CALLBACK_FUNCTION(Anna, goConcert);
100 	ADD_CALLBACK_FUNCTION(Anna, concert);
101 	ADD_CALLBACK_FUNCTION(Anna, leaveConcert);
102 	ADD_CALLBACK_FUNCTION(Anna, leaveConcertCathInCompartment);
103 	ADD_CALLBACK_FUNCTION(Anna, afterConcert);
104 	ADD_CALLBACK_FUNCTION(Anna, giveMaxBack);
105 	ADD_CALLBACK_FUNCTION(Anna, goBaggageCompartment);
106 	ADD_CALLBACK_FUNCTION(Anna, function62);
107 	ADD_CALLBACK_FUNCTION(Anna, deadBaggageCompartment);
108 	ADD_CALLBACK_FUNCTION(Anna, baggageFight);
109 	ADD_CALLBACK_FUNCTION(Anna, prepareVienna);
110 	ADD_CALLBACK_FUNCTION(Anna, chapter4);
111 	ADD_CALLBACK_FUNCTION(Anna, reading);
112 	ADD_CALLBACK_FUNCTION(Anna, sulking);
113 	ADD_CALLBACK_FUNCTION(Anna, goSalon4);
114 	ADD_CALLBACK_FUNCTION(Anna, returnCompartment4);
115 	ADD_CALLBACK_FUNCTION(Anna, enterCompartmentCathFollowsAnna);
116 	ADD_CALLBACK_FUNCTION_II(Anna, doWalkCathFollowsAnna);
117 	ADD_CALLBACK_FUNCTION(Anna, letDownHair);
118 	ADD_CALLBACK_FUNCTION(Anna, chapter5);
119 	ADD_CALLBACK_FUNCTION(Anna, tiedUp);
120 	ADD_CALLBACK_FUNCTION(Anna, function76);
121 	ADD_CALLBACK_FUNCTION(Anna, readyToScore);
122 	ADD_CALLBACK_FUNCTION(Anna, kidnapped);
123 	ADD_CALLBACK_FUNCTION(Anna, waiting);
124 	ADD_CALLBACK_FUNCTION(Anna, finalSequence);
125 	ADD_CALLBACK_FUNCTION(Anna, openFirebird);
126 }
127 
128 //////////////////////////////////////////////////////////////////////////
129 IMPLEMENT_FUNCTION(1, Anna, reset)
130 	Entity::reset(savepoint, kClothes3, true);
131 IMPLEMENT_FUNCTION_END
132 
133 //////////////////////////////////////////////////////////////////////////
134 IMPLEMENT_FUNCTION_S(2, Anna, draw)
135 	Entity::draw(savepoint);
136 IMPLEMENT_FUNCTION_END
137 
138 //////////////////////////////////////////////////////////////////////////
139 IMPLEMENT_FUNCTION_SII(3, Anna, updatePosition, CarIndex, Position)
140 	Entity::updatePosition(savepoint);
141 IMPLEMENT_FUNCTION_END
142 
143 //////////////////////////////////////////////////////////////////////////
144 IMPLEMENT_FUNCTION_SI(4, Anna, enterExitCompartment, ObjectIndex)
145 	Entity::enterExitCompartment(savepoint);
146 IMPLEMENT_FUNCTION_END
147 
148 //////////////////////////////////////////////////////////////////////////
149 IMPLEMENT_FUNCTION(5, Anna, callbackActionOnDirection)
150 	Entity::callbackActionOnDirection(savepoint);
151 IMPLEMENT_FUNCTION_END
152 
153 //////////////////////////////////////////////////////////////////////////
154 IMPLEMENT_FUNCTION_SIIS(6, Anna, callSavepoint, EntityIndex, ActionIndex)
155 	Entity::callSavepoint(savepoint);
156 IMPLEMENT_FUNCTION_END
157 
158 //////////////////////////////////////////////////////////////////////////
159 IMPLEMENT_FUNCTION_S(7, Anna, playSound)
160 	Entity::playSound(savepoint);
161 IMPLEMENT_FUNCTION_END
162 
163 //////////////////////////////////////////////////////////////////////////
164 IMPLEMENT_FUNCTION(8, Anna, callbackActionRestaurantOrSalon)
165 	Entity::callbackActionRestaurantOrSalon(savepoint);
166 IMPLEMENT_FUNCTION_END
167 
168 //////////////////////////////////////////////////////////////////////////
169 IMPLEMENT_FUNCTION_II(9, Anna, savegame, SavegameType, uint32)
170 	Entity::savegame(savepoint);
171 IMPLEMENT_FUNCTION_END
172 
173 //////////////////////////////////////////////////////////////////////////
174 IMPLEMENT_FUNCTION_II(10, Anna, updateEntity, CarIndex, EntityPosition)
175 	if (savepoint.action == kActionExcuseMeCath) {
176 		if (getEvent(kEventAugustPresentAnna) || getEvent(kEventAugustPresentAnnaFirstIntroduction) || getProgress().chapter >= kChapter2)
177 			getSound()->playSound(kEntityPlayer, "CAT1001");
178 		else
179 			getSound()->excuseMeCath();
180 
181 		return;
182 	}
183 
184 	Entity::updateEntity(savepoint, true);
185 IMPLEMENT_FUNCTION_END
186 
187 //////////////////////////////////////////////////////////////////////////
188 IMPLEMENT_FUNCTION_I(11, Anna, updateFromTime, uint32)
189 	Entity::updateFromTime(savepoint);
190 IMPLEMENT_FUNCTION_END
191 
192 //////////////////////////////////////////////////////////////////////////
193 IMPLEMENT_FUNCTION(12, Anna, practiceMusic)
194 	switch (savepoint.action) {
195 	default:
196 		break;
197 
198 	case kActionNone:
199 		if (!params->param2 && ENTITY_PARAM(0, 1))
200 			params->param2 = 1;
201 
202 		if (params->param6) {
203 			if (Entity::updateParameter(params->param7, getState()->timeTicks, 75)) {
204 				getSavePoints()->push(kEntityAnna, kEntityAnna, kActionEndSound);
205 
206 				params->param6 = 0;
207 				params->param7 = 0;
208 			}
209 		}
210 
211 		if (params->param4) {
212 			if (!Entity::updateParameter(params->param8, getState()->timeTicks, 75))
213 				break;
214 
215 			params->param4 = 0;
216 			params->param5 = 1;
217 
218 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorHand);
219 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorHand);
220 
221 			--params->param1;
222 
223 			getSavePoints()->push(kEntityAnna, kEntityAnna, kActionEndSound);
224 		}
225 
226 		params->param8 = 0;
227 		break;
228 
229 	case kActionEndSound:
230 		if (params->param2) {
231 			callbackAction();
232 			break;
233 		}
234 
235 		++params->param1;
236 
237 		switch (params->param1) {
238 		default:
239 			break;
240 
241 		case 1:
242 			getSound()->playSound(kEntityAnna, "ANN2135A");
243 			break;
244 
245 		case 2:
246 			getSound()->playSound(kEntityAnna, "ANN2135B");
247 			break;
248 
249 		case 3:
250 			getSound()->playSound(kEntityAnna, "ANN2135C");
251 			break;
252 
253 		case 4:
254 			getSound()->playSound(kEntityAnna, "ANN2135C");
255 			break;
256 
257 		case 5:
258 			getSound()->playSound(kEntityAnna, "ANN2135L");
259 			break;
260 
261 		case 6:
262 			getSound()->playSound(kEntityAnna, "ANN2135K");
263 			break;
264 
265 		case 7:
266 			getSound()->playSound(kEntityAnna, "ANN2135H");
267 			break;
268 
269 		case 8:
270 			getSound()->playSound(kEntityAnna, "ANN2135K");
271 			break;
272 
273 		case 9:
274 			getSound()->playSound(kEntityAnna, "ANN2135I");
275 			break;
276 
277 		case 10:
278 			getSound()->playSound(kEntityAnna, "ANN2135J");
279 			break;
280 
281 		case 11:
282 			getSound()->playSound(kEntityAnna, "ANN2135M");
283 			break;
284 
285 		case 12:
286 			getSound()->playSound(kEntityAnna, "ANN2135L");
287 			break;
288 
289 		case 13:
290 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
291 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
292 
293 			callbackAction();
294 			break;
295 		}
296 		break;
297 
298 	case kActionKnock:
299 		if (params->param4) {
300 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorHand);
301 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorHand);
302 
303 			if (savepoint.param.intValue == 53) {
304 				getSound()->playSound(kEntityPlayer, getSound()->justAMinuteCath());
305 			} else if (getInventory()->hasItem(kItemPassengerList)) {
306 				if (rnd(2)) {
307 					getSound()->playSound(kEntityPlayer, getSound()->wrongDoorCath());
308 				} else {
309 					getSound()->playSound(kEntityPlayer, rnd(2) ? "CAT1506A" : "CAT1506");
310 				}
311 			} else {
312 				getSound()->playSound(kEntityPlayer, getSound()->wrongDoorCath());
313 			}
314 
315 			params->param4 = 0;
316 			params->param5 = 1;
317 		} else {
318 			getSoundQueue()->stop(kEntityAnna);
319 
320 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
321 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
322 
323 			setCallback(1);
324 			setup_playSound("LIB012");
325 		}
326 		break;
327 
328 	case kActionOpenDoor:
329 		getSoundQueue()->stop(kEntityAnna);
330 		setCallback(3);
331 		setup_playSound("LIB013");
332 		break;
333 
334 	case kActionDefault:
335 		params->param1 = 1;
336 		getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
337 		getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
338 		getObjects()->update(kObjectOutsideAnnaCompartment, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
339 
340 		if (getEntities()->isPlayerPosition(kCarRedSleeping, 78))
341 			getScenes()->loadSceneFromPosition(kCarRedSleeping, 49);
342 
343 		getEntities()->drawSequenceLeft(kEntityAnna, "418C");
344 
345 		if (getSoundQueue()->isBuffered(kEntityAnna))
346 			getSoundQueue()->fade(kEntityAnna);
347 
348 		getSound()->playSound(kEntityAnna, "ANN2135A");
349 		break;
350 
351 	case kActionDrawScene:
352 		if (params->param5 || params->param4) {
353 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
354 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
355 			params->param4 = 0;
356 			params->param5 = 0;
357 		}
358 
359 		if (getEntities()->isPlayerPosition(kCarRedSleeping, 60)) {
360 			++params->param3;
361 			if (params->param3 == 2) {
362 				setCallback(5);
363 				setup_draw("418B");
364 			}
365 		}
366 		break;
367 
368 	case kActionCallback:
369 		switch (getCallback()) {
370 		default:
371 			break;
372 
373 		case 1:
374 			setCallback(2);
375 			setup_playSound("Ann1016");
376 			break;
377 
378 		case 2:
379 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorTalk, kCursorHand);
380 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorTalk, kCursorHand);
381 			params->param4 = 1;
382 			break;
383 
384 		case 3:
385 			if (!getSoundQueue()->isBuffered(kEntityMax)) {
386 				setCallback(4);
387 				setup_playSound("MAX1120");
388 				break;
389 			}
390 			// fall through
391 
392 		case 4:
393 			--params->param1;
394 			params->param6 = 1;
395 			break;
396 
397 		case 5:
398 			getEntities()->drawSequenceLeft(kEntityAnna, "418A");
399 			break;
400 		}
401 		break;
402 	}
403 IMPLEMENT_FUNCTION_END
404 
405 //////////////////////////////////////////////////////////////////////////
406 IMPLEMENT_FUNCTION_SSI(13, Anna, draw2, EntityIndex)
407 	Entity::draw2(savepoint);
408 IMPLEMENT_FUNCTION_END
409 
410 //////////////////////////////////////////////////////////////////////////
411 IMPLEMENT_FUNCTION_I(14, Anna, updateFromTicks, uint32)
412 	Entity::updateFromTicks(savepoint);
413 IMPLEMENT_FUNCTION_END
414 
415 //////////////////////////////////////////////////////////////////////////
416 IMPLEMENT_FUNCTION_IS(15, Anna, compartmentLogic, TimeValue)
417 	switch (savepoint.action) {
418 	default:
419 		break;
420 
421 	case kActionNone:
422 		if (params->param1 < getState()->time && !params->param7) {
423 			params->param7 = 1;
424 
425 			getObjects()->update(kObjectCompartmentF, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
426 			getObjects()->update(kObject53, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
427 
428 			callbackAction();
429 			break;
430 		}
431 
432 		if (params->param5) {
433 			if (!Entity::updateParameter(params->param8, getState()->timeTicks, 75))
434 				break;
435 
436 			params->param5 = 0;
437 			params->param6 = 1;
438 
439 			CursorStyle cursor = getEntities()->isInsideCompartment(kEntityMax, kCarRedSleeping, kPosition_4070) ? kCursorHand : kCursorNormal;
440 
441 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorNormal, cursor);
442 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorNormal, cursor);
443 		}
444 
445 		params->param8 = 0;
446 		break;
447 
448 	case kActionOpenDoor:
449 		if (getEntities()->isInsideCompartment(kEntityMax, kCarRedSleeping, kPosition_4070)) {
450 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
451 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
452 
453 			setCallback(1);
454 			setup_playSound("LIB013");
455 			break;
456 		}
457 		// fall through
458 
459 	case kActionKnock:
460 		if (params->param5) {
461 			CursorStyle cursor = getEntities()->isInsideCompartment(kEntityMax, kCarRedSleeping, kPosition_4070) ? kCursorHand : kCursorNormal;
462 
463 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorNormal, cursor);
464 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorNormal, cursor);
465 
466 			if (savepoint.param.intValue == kObject53) {
467 				setCallback(6);
468 				setup_playSound(getSound()->justAMinuteCath());
469 			} else {
470 				if (getInventory()->hasItem(kItemPassengerList)) {
471 					setCallback(7);
472 					setup_playSound(rnd(2) ? getSound()->wrongDoorCath() : (rnd(2) ? "CAT1506" : "CAT1506A"));
473 				} else {
474 					setCallback(8);
475 					setup_playSound(getSound()->wrongDoorCath());
476 				}
477 			}
478 		} else {
479 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
480 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
481 
482 			setCallback(savepoint.action == kActionKnock ? 3 : 4);
483 			setup_playSound(savepoint.action == kActionKnock ? "LIB012" : "LIB013");
484 		}
485 		break;
486 
487 
488 	case kActionDefault:
489 		getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
490 		getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
491 		getEntities()->drawSequenceLeft(kEntityAnna, (char *)&params->seq);
492 		break;
493 
494 	case kActionDrawScene:
495 		if (params->param6 || params->param5) {
496 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
497 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
498 
499 			params->param5 = 0;
500 			params->param6 = 0;
501 		}
502 		break;
503 
504 	case kActionCallback:
505 		switch (getCallback()) {
506 		default:
507 			break;
508 
509 		case 1:
510 			if (!getSoundQueue()->isBuffered(kEntityMax)) {
511 				setCallback(2);
512 				setup_playSound("MAX1120");
513 				break;
514 			}
515 			// fall through
516 
517 		case 2:
518 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
519 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
520 			break;
521 
522 		case 3:
523 		case 4:
524 			setCallback(5);
525 			setup_playSound("ANN1016");
526 			break;
527 
528 		case 5:
529 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorTalk, kCursorNormal);
530 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorTalk, kCursorNormal);
531 			params->param5 = 1;
532 			break;
533 
534 		case 6:
535 		case 7:
536 		case 8:
537 			params->param5 = 0;
538 			params->param6 = 1;
539 			break;
540 		}
541 		break;
542 	}
543 IMPLEMENT_FUNCTION_END
544 
545 //////////////////////////////////////////////////////////////////////////
546 IMPLEMENT_FUNCTION(16, Anna, chapter1)
547 	switch (savepoint.action) {
548 	default:
549 		break;
550 
551 	case kActionNone:
552 		Entity::timeCheck(kTimeChapter1, params->param1, WRAP_SETUP_FUNCTION(Anna, setup_fleeTyler));
553 		break;
554 
555 	case kActionDefault:
556 		getSavePoints()->addData(kEntityAnna, kAction291662081, 0);
557 		getSavePoints()->addData(kEntityAnna, kAction238936000, 1);
558 
559 		getObjects()->update(kObjectCompartmentF, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
560 		getObjects()->update(kObject53, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
561 		getObjects()->update(kObjectOutsideAnnaCompartment, kEntityPlayer, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
562 
563 		getData()->entityPosition = kPosition_8200;
564 		getData()->location = kLocationInsideCompartment;
565 		getData()->car = kCarGreenSleeping;
566 		getData()->clothes = kClothesDefault;
567 		break;
568 	}
569 IMPLEMENT_FUNCTION_END
570 
571 //////////////////////////////////////////////////////////////////////////
572 IMPLEMENT_FUNCTION_II(17, Anna, doWalkP1, uint32, uint32)
573 	switch (savepoint.action) {
574 	default:
575 		break;
576 
577 	case kActionNone:
578 		getData()->inventoryItem = (params->param3 && getEntities()->isDistanceBetweenEntities(kEntityAnna, kEntityPlayer, 2000)) ? (InventoryItem)LOW_BYTE(params->param3) : kItemNone;
579 
580 		if (getEntities()->updateEntity(kEntityAnna, (CarIndex)params->param1, (EntityPosition)params->param2)) {
581 			getData()->inventoryItem = kItemNone;
582 			callbackAction();
583 		}
584 		break;
585 
586 	case kAction1:
587 		if (savepoint.param.intValue == 8) {
588 			getData()->inventoryItem = (InventoryItem)(getData()->inventoryItem & kItemToggleLow);
589 			params->param3 &= 0xFFFFFFF7;
590 
591 			setCallback(1);
592 			setup_savegame(kSavegameTypeEvent, kEventAnnaGiveScarf);
593 		} else {
594 			setCallback(2);
595 			setup_savegame(kSavegameTypeEvent, kEventGotALight);
596 		}
597 		break;
598 
599 	case kActionExcuseMeCath:
600 		if (getEvent(kEventAugustPresentAnna) || getEvent(kEventAugustPresentAnnaFirstIntroduction) || getProgress().chapter >= kChapter2)
601 			getSound()->playSound(kEntityPlayer, "CAT1001");
602 		else
603 			getSound()->excuseMeCath();
604 		break;
605 
606 	case kActionExcuseMe:
607 		getSound()->excuseMe(kEntityAnna);
608 		break;
609 
610 	case kActionDefault:
611 		getData()->inventoryItem = kItemNone;
612 		if (getProgress().jacket == kJacketGreen) {
613 			if (!getEvent(kEventGotALight) && !getEvent(kEventGotALightD) && !getEvent(kEventAugustPresentAnna) && !getEvent(kEventAugustPresentAnnaFirstIntroduction))
614 				params->param3 = kItemInvalid;
615 
616 			if (!params->param3 && !getEvent(kEventAnnaGiveScarfAsk) && !getEvent(kEventAnnaGiveScarfDinerAsk) && !getEvent(kEventAnnaGiveScarfSalonAsk))
617 				params->param3 |= 8;
618 		}
619 
620 		if (getEntities()->updateEntity(kEntityAnna, (CarIndex)params->param1, (EntityPosition)params->param2))
621 			callbackAction();
622 		break;
623 
624 	case kActionCallback:
625 		switch (getCallback()) {
626 		default:
627 			break;
628 
629 		case 1:
630 			if (getEvent(kEventAnnaGiveScarf)
631 			 || getEvent(kEventAnnaGiveScarfDiner)
632 			 || getEvent(kEventAnnaGiveScarfSalon)
633 			 || getEvent(kEventAnnaGiveScarfMonogram)
634 			 || getEvent(kEventAnnaGiveScarfDinerMonogram)
635 			 || getEvent(kEventAnnaGiveScarfSalonMonogram))
636 				getAction()->playAnimation(kEventAnnaGiveScarfAsk);
637 			else if (getEvent(kEventAugustPresentAnna)
638 				  || getEvent(kEventAugustPresentAnnaFirstIntroduction))
639 				getAction()->playAnimation(kEventAnnaGiveScarfMonogram);
640 			else
641 				getAction()->playAnimation(kEventAnnaGiveScarf);
642 
643 			getEntities()->loadSceneFromEntityPosition(getData()->car, (EntityPosition)(getData()->entityPosition + (750 * (getData()->direction == kDirectionUp ? -1 : 1))), getData()->direction == kDirectionUp);
644 			break;
645 
646 		case 2:
647 			getAction()->playAnimation(getData()->direction == kDirectionUp ? kEventGotALightD : kEventGotALight);
648 			getData()->inventoryItem = (InventoryItem)(getData()->inventoryItem & kItemToggleHigh);
649 			params->param3 &= 0xFFFFFF7F;
650 
651 			if (getProgress().jacket == kJacketGreen && !getEvent(kEventAnnaGiveScarfAsk) && !getEvent(kEventAnnaGiveScarfDinerAsk) && !getEvent(kEventAnnaGiveScarfSalonAsk))
652 				params->param3 |= 8;
653 
654 			getEntities()->loadSceneFromEntityPosition(getData()->car, (EntityPosition)(getData()->entityPosition + (750 * (getData()->direction == kDirectionUp ? -1 : 1))), getData()->direction == kDirectionUp);
655 			break;
656 		}
657 		break;
658 	}
659 IMPLEMENT_FUNCTION_END
660 
661 //////////////////////////////////////////////////////////////////////////
662 IMPLEMENT_FUNCTION_I(18, Anna, diningLogic, TimeValue)
663 	switch (savepoint.action) {
664 	default:
665 		break;
666 
667 	case kActionNone:
668 		if (params->param1 && params->param1 < getState()->time && getEntities()->isSomebodyInsideRestaurantOrSalon()) {
669 			getData()->inventoryItem = kItemNone;
670 			callbackAction();
671 			break;
672 		}
673 
674 		if (params->param5 && !params->param4) {
675 			if (Entity::updateParameter(params->param6, getState()->time, 900)) {
676 				params->param2 |= kItemScarf;
677 				params->param5 = 0;
678 				params->param6 = 0;
679 			}
680 		}
681 
682 		if (params->param3) {
683 			if (!Entity::updateParameter(params->param7, getState()->timeTicks, 90))
684 				break;
685 
686 			getScenes()->loadSceneFromPosition(kCarRestaurant, 61);
687 		} else {
688 			params->param7 = 0;
689 		}
690 		break;
691 
692 	case kAction1:
693 		setCallback(savepoint.param.intValue == 8 ? 1 : 2);
694 		setup_savegame(kSavegameTypeEvent, savepoint.param.intValue == 8 ? kEventAnnaGiveScarf : kEventDinerMindJoin);
695 		break;
696 
697 	case kActionDefault:
698 		if (getProgress().jacket == kJacketGreen) {
699 			if (!getEvent(kEventDinerMindJoin) && !getEvent(kEventAugustPresentAnna) && !getEvent(kEventAugustPresentAnnaFirstIntroduction))
700 				params->param2 |= kItemInvalid;
701 
702 			if (!params->param2 && !getEvent(kEventAnnaGiveScarfAsk) && !getEvent(kEventAnnaGiveScarfDinerAsk) && !getEvent(kEventAnnaGiveScarfSalonAsk))
703 				params->param2 |= 8;
704 		}
705 
706 		getData()->inventoryItem = (InventoryItem)LOW_BYTE(params->param2);
707 		break;
708 
709 	case kActionDrawScene:
710 		params->param3 = getEntities()->isPlayerPosition(kCarRestaurant, 62);
711 		break;
712 
713 	case kActionCallback:
714 		switch (getCallback()) {
715 		default:
716 			break;
717 
718 		case 1:
719 			if (getEvent(kEventAnnaGiveScarf) || getEvent(kEventAnnaGiveScarfDiner) || getEvent(kEventAnnaGiveScarfSalon)
720 			 || getEvent(kEventAnnaGiveScarfMonogram) || getEvent(kEventAnnaGiveScarfDinerMonogram) || getEvent(kEventAnnaGiveScarfSalonMonogram)) {
721 				getAction()->playAnimation(kEventAnnaGiveScarfDinerAsk);
722 			} else {
723 				getAction()->playAnimation((getEvent(kEventAugustPresentAnna) || getEvent(kEventAugustPresentAnnaFirstIntroduction)) ? kEventAnnaGiveScarfDinerMonogram : kEventAnnaGiveScarfDiner);
724 				params->param5 = 1;
725 			}
726 
727 			params->param2 &= 0xFFFFFFF7;
728 			getData()->inventoryItem = (InventoryItem)params->param2;
729 			getScenes()->loadSceneFromPosition(kCarRestaurant, 61);
730 			break;
731 
732 		case 2:
733 			getAction()->playAnimation(kEventDinerMindJoin);
734 
735 			params->param2 &= 0xFFFFFF7F;
736 
737 			if (getProgress().jacket == kJacketGreen
738 			 && !getEvent(kEventAnnaGiveScarfAsk)
739 			 && !getEvent(kEventAnnaGiveScarfDinerAsk)
740 			 && !getEvent(kEventAnnaGiveScarfSalonAsk)) {
741 				params->param2 |= 8;
742 			}
743 
744 			getData()->inventoryItem = (InventoryItem)LOW_BYTE(params->param2);
745 			getScenes()->loadSceneFromPosition(kCarRestaurant, 61);
746 			break;
747 		}
748 		break;
749 
750 	case kAction168046720:
751 		getData()->inventoryItem = kItemNone;
752 		params->param4 = 1;
753 		break;
754 
755 	case kAction168627977:
756 		getData()->inventoryItem = (InventoryItem)LOW_BYTE(params->param2);
757 		params->param4 = 0;
758 		break;
759 
760 	case kAction170016384:
761 	case kAction259136835:
762 	case kAction268773672:
763 		getData()->inventoryItem = kItemNone;
764 		callbackAction();
765 		break;
766 	}
767 IMPLEMENT_FUNCTION_END
768 
769 //////////////////////////////////////////////////////////////////////////
770 IMPLEMENT_FUNCTION(19, Anna, fleeTyler)
771 	switch (savepoint.action) {
772 	default:
773 		break;
774 
775 	case kActionDefault:
776 		setCallback(1);
777 		setup_enterExitCompartment("618Ca", kObjectCompartment1);
778 		break;
779 
780 	case kActionCallback:
781 		switch (getCallback()) {
782 		default:
783 			break;
784 
785 		case 1:
786 			getData()->entityPosition = kPosition_8514;
787 			getData()->location = kLocationOutsideCompartment;
788 
789 			setCallback(2);
790 			setup_updateEntity(kCarRedSleeping, kPosition_4070);
791 			break;
792 
793 		case 2:
794 			setCallback(3);
795 			setup_enterExitCompartment("618Af", kObjectCompartmentF);
796 			break;
797 
798 		case 3:
799 			getEntities()->clearSequences(kEntityAnna);
800 			getData()->entityPosition = kPosition_4070;
801 			getData()->location = kLocationInsideCompartment;
802 
803 			setup_waitDinner();
804 			break;
805 		}
806 		break;
807 	}
808 IMPLEMENT_FUNCTION_END
809 
810 //////////////////////////////////////////////////////////////////////////
811 IMPLEMENT_FUNCTION(20, Anna, waitDinner)
812 	switch (savepoint.action) {
813 	default:
814 		break;
815 
816 	case kActionDefault:
817 		setCallback(1);
818 		setup_compartmentLogic(kTime1093500, "NONE");
819 		break;
820 
821 	case kActionCallback:
822 		switch (getCallback()) {
823 		default:
824 			break;
825 
826 		case 1:
827 			setCallback(2);
828 			setup_enterExitCompartment("618Bf", kObjectCompartmentF);
829 			break;
830 
831 		case 2:
832 			getData()->location = kLocationOutsideCompartment;
833 			getSavePoints()->push(kEntityAnna, kEntityMax, kAction71277948);
834 			setup_goDinner();
835 			break;
836 		}
837 		break;
838 	}
839 IMPLEMENT_FUNCTION_END
840 
841 //////////////////////////////////////////////////////////////////////////
842 IMPLEMENT_FUNCTION(21, Anna, goDinner)
843 	switch (savepoint.action) {
844 	default:
845 		break;
846 
847 	case kActionDefault:
848 		setCallback(1);
849 		setup_doWalkP1(kCarRestaurant, kPosition_850);
850 		break;
851 
852 	case kActionCallback:
853 		switch (getCallback()) {
854 		default:
855 			break;
856 
857 		case 1:
858 			setCallback(2);
859 			setup_callbackActionRestaurantOrSalon();
860 			break;
861 
862 		case 2:
863 			getData()->entityPosition = kPosition_1540;
864 			getData()->location = kLocationOutsideCompartment;
865 
866 			setCallback(3);
867 			setup_draw("801US");
868 			break;
869 
870 		case 3:
871 			getEntities()->drawSequenceRight(kEntityAnna, "001B");
872 			if (getEntities()->isInSalon(kEntityPlayer))
873 				getEntities()->updateFrame(kEntityAnna);
874 
875 			setCallback(4);
876 			setup_callbackActionOnDirection();
877 			break;
878 
879 		case 4:
880 			setup_function22();
881 			break;
882 		}
883 		break;
884 	}
885 IMPLEMENT_FUNCTION_END
886 
887 //////////////////////////////////////////////////////////////////////////
888 IMPLEMENT_FUNCTION(22, Anna, function22)
889 	switch (savepoint.action) {
890 	default:
891 		break;
892 
893 	case kActionDefault:
894 		getEntities()->drawSequenceLeft(kEntityAnna, "001A");
895 		getSavePoints()->push(kEntityAnna, kEntityPascale, kAction223262556);
896 		break;
897 
898 	case kAction157370960:
899 		getData()->location = kLocationInsideCompartment;
900 		setup_waitingDinner();
901 		break;
902 	}
903 IMPLEMENT_FUNCTION_END
904 
905 //////////////////////////////////////////////////////////////////////////
906 IMPLEMENT_FUNCTION(23, Anna, waitingDinner)
907 	switch (savepoint.action) {
908 	default:
909 		break;
910 
911 	case kActionDefault:
912 		getEntities()->drawSequenceLeft(kEntityAnna, "001D");
913 		getSavePoints()->push(kEntityAnna, kEntityWaiter1, kAction270410280);
914 		getSavePoints()->push(kEntityAnna, kEntityTables0, kAction136455232);
915 
916 		setCallback(1);
917 		setup_diningLogic(kTimeNone);
918 		break;
919 
920 	case kActionCallback:
921 		switch (getCallback()) {
922 		default:
923 			break;
924 
925 		case 1:
926 			getEntities()->drawSequenceLeft(kEntityAnna, "001E");
927 			setCallback(2);
928 			setup_playSound("ANN1048");
929 			break;
930 
931 		case 2:
932 			setCallback(3);
933 			setup_draw("001F");
934 			break;
935 
936 		case 3:
937 			getSavePoints()->push(kEntityAnna, kEntityWaiter1, kAction203859488);
938 			setup_waitingDinner2();
939 			break;
940 		}
941 		break;
942 	}
943 IMPLEMENT_FUNCTION_END
944 
945 //////////////////////////////////////////////////////////////////////////
946 IMPLEMENT_FUNCTION(24, Anna, waitingDinner2)
947 	switch (savepoint.action) {
948 	default:
949 		break;
950 
951 	case kActionDefault:
952 		getEntities()->drawSequenceLeft(kEntityAnna, "001G");
953 
954 		setCallback(1);
955 		setup_diningLogic(kTimeNone);
956 		break;
957 
958 	case kActionCallback:
959 		switch (getCallback()) {
960 		default:
961 			break;
962 
963 		case 1:
964 			getEntities()->drawSequenceLeft(kEntityAnna, "001H");
965 			setCallback(2);
966 			setup_playSound("ANN1049");
967 			break;
968 
969 		case 2:
970 			getSavePoints()->push(kEntityAnna, kEntityWaiter1, kAction136702400);
971 			setup_eatingDinner();
972 			break;
973 		}
974 		break;
975 	}
976 IMPLEMENT_FUNCTION_END
977 
978 //////////////////////////////////////////////////////////////////////////
979 IMPLEMENT_FUNCTION(25, Anna, eatingDinner)
980 	switch (savepoint.action) {
981 	default:
982 		break;
983 
984 	case kActionDefault:
985 		getEntities()->drawSequenceLeft(kEntityAnna, "001J");
986 		getProgress().field_28 = 1;
987 
988 		setCallback(1);
989 		setup_diningLogic(kTimeNone);
990 		break;
991 
992 	case kActionCallback:
993 		switch (getCallback()) {
994 		default:
995 			break;
996 
997 		case 2:
998 			setCallback(3);
999 			setup_callbackActionRestaurantOrSalon();
1000 			break;
1001 
1002 		case 3:
1003 			setup_leaveDinner();
1004 			break;
1005 		}
1006 		break;
1007 
1008 	case kAction122358304:
1009 		getEntities()->drawSequenceLeft(kEntityAnna, "BLANK");
1010 		break;
1011 
1012 	case kAction201437056:
1013 		getEntities()->drawSequenceLeft(kEntityAnna, "001J");
1014 		setCallback(2);
1015 		setup_diningLogic(kTime1138500);
1016 		break;
1017 	}
1018 IMPLEMENT_FUNCTION_END
1019 
1020 //////////////////////////////////////////////////////////////////////////
1021 IMPLEMENT_FUNCTION(26, Anna, leaveDinner)
1022 	switch (savepoint.action) {
1023 	default:
1024 		break;
1025 
1026 	case kActionDefault:
1027 		getData()->location = kLocationOutsideCompartment;
1028 		getEntities()->updatePositionEnter(kEntityAnna, kCarRestaurant, 62);
1029 
1030 		setCallback(1);
1031 		setup_callSavepoint("001L", kEntityTables0, kActionDrawTablesWithChairs, "001M");
1032 		break;
1033 
1034 	case kActionCallback:
1035 		switch (getCallback()) {
1036 		default:
1037 			break;
1038 
1039 		case 1:
1040 			getEntities()->updatePositionExit(kEntityAnna, kCarRestaurant, 62);
1041 			getSavePoints()->push(kEntityAnna, kEntityWaiter1, kAction237485916);
1042 			getEntities()->drawSequenceRight(kEntityAnna, "801DS");
1043 
1044 			if (getEntities()->isInRestaurant(kEntityPlayer))
1045 				getEntities()->updateFrame(kEntityAnna);
1046 
1047 			setCallback(2);
1048 			setup_callbackActionOnDirection();
1049 			break;
1050 
1051 		case 2:
1052 			setCallback(3);
1053 			setup_doWalkP1(kCarRedSleeping, kPosition_4070);
1054 			break;
1055 
1056 		case 3:
1057 			setCallback(4);
1058 			setup_enterExitCompartment("618Af", kObjectCompartmentF);
1059 			break;
1060 
1061 		case 4:
1062 			getEntities()->clearSequences(kEntityAnna);
1063 			getData()->entityPosition = kPosition_4070;
1064 			getData()->location = kLocationInsideCompartment;
1065 
1066 			setup_freshenUp();
1067 			break;
1068 		}
1069 		break;
1070 	}
1071 IMPLEMENT_FUNCTION_END
1072 
1073 //////////////////////////////////////////////////////////////////////////
1074 IMPLEMENT_FUNCTION(27, Anna, freshenUp)
1075 	switch (savepoint.action) {
1076 	default:
1077 		break;
1078 
1079 	case kActionDefault:
1080 		getSavePoints()->push(kEntityAnna, kEntityMax, kAction101687594);
1081 		setCallback(1);
1082 		setup_compartmentLogic(kTime1156500, "NONE");
1083 		break;
1084 
1085 	case kActionCallback:
1086 		switch (getCallback()) {
1087 		default:
1088 			break;
1089 
1090 		case 1:
1091 		case 2:
1092 			if (getProgress().field_14 == 29) {
1093 				params->param1 = (uint)(getState()->time + 900);
1094 				setCallback(2);
1095 				setup_compartmentLogic((TimeValue)params->param1, "NONE");
1096 			} else {
1097 				setCallback(3);
1098 				setup_enterExitCompartment("618Bf", kObjectCompartmentF);
1099 			}
1100 			break;
1101 
1102 		case 3:
1103 			getData()->location = kLocationOutsideCompartment;
1104 			getSavePoints()->push(kEntityAnna, kEntityMax, kAction71277948);
1105 			setup_goSalon();
1106 			break;
1107 		}
1108 		break;
1109 	}
1110 IMPLEMENT_FUNCTION_END
1111 
1112 //////////////////////////////////////////////////////////////////////////
1113 IMPLEMENT_FUNCTION(28, Anna, goSalon)
1114 	switch (savepoint.action) {
1115 	default:
1116 		break;
1117 
1118 	case kActionDefault:
1119 		setCallback(1);
1120 		setup_doWalkP1(kCarRestaurant, kPosition_850);
1121 		break;
1122 
1123 	case kActionCallback:
1124 		switch (getCallback()) {
1125 		default:
1126 			break;
1127 
1128 		case 1:
1129 			setCallback(2);
1130 			setup_callbackActionRestaurantOrSalon();
1131 			break;
1132 
1133 		case 2:
1134 			getData()->location = kLocationOutsideCompartment;
1135 			getData()->entityPosition = kPosition_1540;
1136 			getScenes()->loadSceneFromItemPosition(kItem3);
1137 
1138 			setCallback(3);
1139 			setup_updatePosition("104A", kCarRestaurant, 56);
1140 			break;
1141 
1142 		case 3:
1143 			getData()->location = kLocationInsideCompartment;
1144 			setup_waitAugust();
1145 			break;
1146 		}
1147 		break;
1148 	}
1149 IMPLEMENT_FUNCTION_END
1150 
1151 //////////////////////////////////////////////////////////////////////////
1152 IMPLEMENT_FUNCTION(29, Anna, waitAugust)
1153 	switch (savepoint.action) {
1154 	default:
1155 		break;
1156 
1157 	case kActionNone:
1158 		if (params->param2) {
1159 			if (Entity::updateParameter(params->param3, getState()->time, 900)) {
1160 				getData()->inventoryItem = (InventoryItem)(getData()->inventoryItem | kItemScarf);
1161 				params->param2 = 0;
1162 				params->param3 = 0;
1163 			}
1164 		}
1165 
1166 		if (params->param1) {
1167 			if (!Entity::updateParameter(params->param4, getState()->timeTicks, 90))
1168 				break;
1169 
1170 			getScenes()->loadSceneFromPosition(kCarRestaurant, 55);
1171 		} else {
1172 			params->param4 = 0;
1173 		}
1174 		break;
1175 
1176 	case kAction1:
1177 		setCallback(savepoint.param.intValue == 8 ? 1 : 2);
1178 		setup_savegame(kSavegameTypeEvent, savepoint.param.intValue == 8 ? kEventAnnaGiveScarf : kEventAnnaIntroductionRejected);
1179 		break;
1180 
1181 	case kActionDefault:
1182 		getData()->inventoryItem = kItemNone;
1183 
1184 		if (getProgress().jacket == kJacketGreen
1185 		 && !getEvent(kEventAnnaConversationGoodNight)
1186 		 && !getEvent(kEventAnnaIntroductionRejected))
1187 			getData()->inventoryItem = kItemInvalid;
1188 
1189 		if (getProgress().jacket == kJacketGreen
1190 		 && getData()->inventoryItem == kItemNone
1191 		 && !getEvent(kEventAnnaGiveScarfAsk)
1192 		 && !getEvent(kEventAnnaGiveScarfDinerAsk)
1193 		 && !getEvent(kEventAnnaGiveScarfSalonAsk))
1194 			getData()->inventoryItem = (InventoryItem)(getData()->inventoryItem | kItemScarf);
1195 
1196 		getEntities()->drawSequenceLeft(kEntityAnna, "104B");
1197 		break;
1198 
1199 	case kActionDrawScene:
1200 		params->param1 = getEntities()->isPlayerPosition(kCarRestaurant, 56);
1201 		break;
1202 
1203 	case kActionCallback:
1204 		switch (getCallback()) {
1205 		default:
1206 			break;
1207 
1208 		case 1:
1209 			if (getEvent(kEventAnnaGiveScarf)
1210 			 || getEvent(kEventAnnaGiveScarfDiner)
1211 			 || getEvent(kEventAnnaGiveScarfSalon)
1212 			 || getEvent(kEventAnnaGiveScarfMonogram)
1213 			 || getEvent(kEventAnnaGiveScarfDinerMonogram)
1214 			 || getEvent(kEventAnnaGiveScarfSalonMonogram)) {
1215 				getAction()->playAnimation(kEventAnnaGiveScarfSalonAsk);
1216 			} else {
1217 				getAction()->playAnimation((getEvent(kEventAugustPresentAnna) || getEvent(kEventAugustPresentAnnaFirstIntroduction)) ? kEventAnnaGiveScarfSalonMonogram : kEventAnnaGiveScarfSalon);
1218 				params->param2 = 1;
1219 			}
1220 
1221 			getData()->inventoryItem = (InventoryItem)(getData()->inventoryItem & kItemToggleLow);
1222 
1223 			getScenes()->loadSceneFromPosition(kCarRestaurant, 51);
1224 			break;
1225 
1226 		case 2:
1227 			getAction()->playAnimation((getEvent(kEventAugustPresentAnna) || getEvent(kEventAugustPresentAnnaFirstIntroduction)) ? kEventAnnaConversationGoodNight : kEventAnnaIntroductionRejected);
1228 
1229 			getData()->inventoryItem = (InventoryItem)(getData()->inventoryItem & kItemToggleHigh);
1230 
1231 			if (getProgress().jacket == kJacketGreen
1232 			 && !getEvent(kEventAnnaGiveScarfAsk)
1233 			 && !getEvent(kEventAnnaGiveScarfDinerAsk)
1234 			 && !getEvent(kEventAnnaGiveScarfSalonAsk))
1235 				 getData()->inventoryItem = (InventoryItem)(getData()->inventoryItem | kItemScarf);
1236 
1237 			getScenes()->loadSceneFromPosition(kCarRestaurant, 51);
1238 			break;
1239 		}
1240 		break;
1241 
1242 	case kAction123712592:
1243 		getData()->inventoryItem = kItemNone;
1244 		setup_function30();
1245 		break;
1246 	}
1247 IMPLEMENT_FUNCTION_END
1248 
1249 //////////////////////////////////////////////////////////////////////////
1250 IMPLEMENT_FUNCTION(30, Anna, function30)
1251 	switch (savepoint.action) {
1252 	default:
1253 		break;
1254 
1255 	case kActionNone:
1256 		if (params->param3 != kTimeInvalid && getState()->time) {
1257 			if (getState()->time > kTime1188000) {
1258 				params->param3 = kTimeInvalid;
1259 				getSound()->playSound(kEntityAnna, "AUG1004");
1260 			} else {
1261 				if (!getEntities()->isInSalon(kEntityPlayer) || !params->param3)
1262 					params->param3 = (uint)(getState()->time + 450);
1263 
1264 				if (params->param3 < getState()->time) {
1265 					params->param3 = kTimeInvalid;
1266 					getSound()->playSound(kEntityAnna, "AUG1004");
1267 				}
1268 			}
1269 		}
1270 
1271 		if (params->param2 && params->param4 != kTimeInvalid && getState()->time > kTime1179000) {
1272 
1273 			if (getState()->time > kTime1192500) {
1274 				params->param4 = kTimeInvalid;
1275 				setup_leaveAugust();
1276 				break;
1277 			}
1278 
1279 			if (!getEntities()->isInSalon(kEntityPlayer) || !params->param4)
1280 				params->param4 = (uint)(getState()->time + 150);
1281 
1282 			if (params->param4 < getState()->time) {
1283 				params->param4 = kTimeInvalid;
1284 				setup_leaveAugust();
1285 				break;
1286 			}
1287 		}
1288 
1289 		if (params->param1) {
1290 			if (!Entity::updateParameter(params->param5, getState()->timeTicks, 90))
1291 				break;
1292 
1293 			getScenes()->loadSceneFromPosition(kCarRestaurant, 55);
1294 		} else {
1295 			params->param5 = 0;
1296 		}
1297 		break;
1298 
1299 	case kActionEndSound:
1300 		params->param2 = 1;
1301 		break;
1302 
1303 	case kActionDefault:
1304 		getSavePoints()->push(kEntityAnna, kEntityAugust, kAction122358304);
1305 		getEntities()->drawSequenceLeft(kEntityAnna, "106B");
1306 		break;
1307 
1308 	case kActionDrawScene:
1309 		params->param1 = getEntities()->isPlayerPosition(kCarRestaurant, 56);
1310 		break;
1311 	}
1312 IMPLEMENT_FUNCTION_END
1313 
1314 //////////////////////////////////////////////////////////////////////////
1315 IMPLEMENT_FUNCTION(31, Anna, leaveAugust)
1316 	switch (savepoint.action) {
1317 	default:
1318 		break;
1319 
1320 	case kActionDefault:
1321 		setCallback(1);
1322 		setup_callbackActionRestaurantOrSalon();
1323 		break;
1324 
1325 	case kActionCallback:
1326 		switch (getCallback()) {
1327 		default:
1328 			break;
1329 
1330 		case 1:
1331 			getData()->location = kLocationOutsideCompartment;
1332 			getSound()->playSound(kEntityAnna, "AUG1005");
1333 
1334 			setCallback(2);
1335 			setup_updateFromTicks(150);
1336 			break;
1337 
1338 		case 2:
1339 			getEntities()->updatePositionEnter(kEntityAnna, kCarRestaurant, 56);
1340 
1341 			setCallback(3);
1342 			setup_draw2("106C1", "106C2", kEntityAugust);
1343 			break;
1344 
1345 		case 3:
1346 			getEntities()->updatePositionExit(kEntityAnna, kCarRestaurant, 56);
1347 			getInventory()->setLocationAndProcess(kItem3, kObjectLocation1);
1348 			getSavePoints()->push(kEntityAnna, kEntityAugust, kAction159332865);
1349 
1350 			setup_returnCompartment();
1351 			break;
1352 		}
1353 		break;
1354 	}
1355 IMPLEMENT_FUNCTION_END
1356 
1357 //////////////////////////////////////////////////////////////////////////
1358 IMPLEMENT_FUNCTION(32, Anna, returnCompartment)
1359 	switch (savepoint.action) {
1360 	default:
1361 		break;
1362 
1363 	case kActionDefault:
1364 		setCallback(1);
1365 		setup_doWalkP1(kCarRedSleeping, kPosition_4070);
1366 		break;
1367 
1368 	case kActionCallback:
1369 		switch (getCallback()) {
1370 		default:
1371 			break;
1372 
1373 		case 1:
1374 			setCallback(2);
1375 			setup_enterExitCompartment("618Af", kObjectCompartmentF);
1376 			break;
1377 
1378 		case 2:
1379 			getEntities()->clearSequences(kEntityAnna);
1380 
1381 			getData()->entityPosition = kPosition_4070;
1382 			getData()->location = kLocationInsideCompartment;
1383 
1384 			setup_readyForBed();
1385 			break;
1386 		}
1387 		break;
1388 	}
1389 IMPLEMENT_FUNCTION_END
1390 
1391 //////////////////////////////////////////////////////////////////////////
1392 IMPLEMENT_FUNCTION(33, Anna, readyForBed)
1393 	switch (savepoint.action) {
1394 	default:
1395 		break;
1396 
1397 	case kActionDefault:
1398 		getSavePoints()->push(kEntityAnna, kEntityMax, kAction101687594);
1399 
1400 		params->param1 = (uint)(getState()->time + 4500);
1401 		setCallback(1);
1402 		setup_compartmentLogic((TimeValue)params->param1, "NONE");
1403 		break;
1404 
1405 	case kActionCallback:
1406 		if (getCallback() == 1) {
1407 			getObjects()->updateModel(kObjectCompartmentF, kObjectModel1);
1408 			setup_asleep();
1409 		}
1410 		break;
1411 	}
1412 IMPLEMENT_FUNCTION_END
1413 
1414 //////////////////////////////////////////////////////////////////////////
1415 IMPLEMENT_FUNCTION(34, Anna, asleep)
1416 	switch (savepoint.action) {
1417 	default:
1418 		break;
1419 
1420 	case kActionNone:
1421 		if (!params->param1 && getEntities()->isPlayerPosition(kCarRedSleeping, 60)) {
1422 			if (Entity::updateParameter(params->param2, getState()->time, 150)) {
1423 				setCallback(1);
1424 				setup_draw("419B");
1425 				break;
1426 			}
1427 		}
1428 
1429 label_callback_1:
1430 		Entity::timeCheck(kTime1489500, params->param3, WRAP_SETUP_FUNCTION(Anna, setup_wakeNight));
1431 		break;
1432 
1433 	case kActionKnock:
1434 	case kActionOpenDoor:
1435 		getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
1436 		getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
1437 
1438 		setCallback(savepoint.action == kActionKnock ? 2 : 3);
1439 		setup_playSound(savepoint.action == kActionKnock ? "LIB012" : "LIB013");
1440 		break;
1441 
1442 	case kActionDefault:
1443 		getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
1444 		getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
1445 		getObjects()->update(kObjectOutsideAnnaCompartment, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
1446 
1447 		if (getEntities()->isPlayerPosition(kCarRedSleeping, 78))
1448 			getScenes()->loadSceneFromPosition(kCarRedSleeping, 49);
1449 
1450 		getData()->car = kCarRedSleeping;
1451 		getData()->entityPosition = kPosition_4070;
1452 		getData()->location = kLocationOutsideCompartment;
1453 
1454 		getEntities()->drawSequenceLeft(kEntityAnna, "419A");
1455 		break;
1456 
1457 	case kActionCallback:
1458 		switch (getCallback()) {
1459 		default:
1460 			break;
1461 
1462 		case 1:
1463 			getEntities()->drawSequenceLeft(kEntityAnna, "419C");
1464 			params->param1 = 1;
1465 			goto label_callback_1;
1466 
1467 		case 2:
1468 		case 3:
1469 			if (!getSoundQueue()->isBuffered(kEntityMax)) {
1470 				setCallback(4);
1471 				setup_playSound("MAX1120");
1472 				break;
1473 			}
1474 			// fall through
1475 
1476 		case 4:
1477 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
1478 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
1479 
1480 			break;
1481 		}
1482 		break;
1483 	}
1484 IMPLEMENT_FUNCTION_END
1485 
1486 //////////////////////////////////////////////////////////////////////////
1487 IMPLEMENT_FUNCTION(35, Anna, wakeNight)
1488 	switch (savepoint.action) {
1489 	default:
1490 		break;
1491 
1492 	case kActionNone:
1493 		if (!params->param1)
1494 			break;
1495 
1496 		if (!Entity::updateParameter(params->param3, getState()->timeTicks, 75))
1497 			break;
1498 
1499 		switch (params->param2) {
1500 		default:
1501 			break;
1502 
1503 		case 0:
1504 			getSound()->playSound(kEntityAnna, "ANN2135E");
1505 			break;
1506 
1507 		case 1:
1508 			getSound()->playSound(kEntityAnna, "ANN2135F");
1509 			break;
1510 
1511 		case 2:
1512 			getSound()->playSound(kEntityAnna, "ANN2135G");
1513 			break;
1514 
1515 		case 3:
1516 			getSound()->playSound(kEntityAnna, "ANN2135D");
1517 			break;
1518 		}
1519 
1520 		params->param1 = 0;
1521 		params->param3 = 0;
1522 		break;
1523 
1524 	case kActionEndSound:
1525 		++params->param2;
1526 
1527 		if (params->param2 > 3)
1528 			params->param2 = 0;
1529 
1530 		params->param1 = 1;
1531 		break;
1532 
1533 	case kActionKnock:
1534 	case kActionOpenDoor:
1535 		if (getSoundQueue()->isBuffered(kEntityAnna))
1536 			getSoundQueue()->fade(kEntityAnna);
1537 
1538 		if (savepoint.action == kActionKnock)
1539 			getSound()->playSound(kEntityPlayer, "LIB012");
1540 
1541 		setCallback(1);
1542 		setup_savegame(kSavegameTypeEvent, kEventAnnaVisitToCompartmentGun);
1543 		break;
1544 
1545 	case kActionDefault:
1546 		getData()->clothes = kClothes1;
1547 		params->param1 = 1;
1548 		break;
1549 
1550 	case kActionCallback:
1551 		switch (getCallback()) {
1552 		default:
1553 			break;
1554 
1555 		case 1:
1556 			getAction()->playAnimation(kEventAnnaVisitToCompartmentGun);
1557 			getSound()->playSound(kEntityPlayer, "LIB015");
1558 			getData()->location = kLocationOutsideCompartment;
1559 			getData()->entityPosition = kPosition_4840;
1560 
1561 			getEntities()->updateEntity(kEntityAnna, kCarRedSleeping, kPosition_8200);
1562 			getScenes()->loadSceneFromObject(kObjectCompartmentF, true);
1563 			getSavePoints()->push(kEntityAnna, kEntityVassili, kAction339669520);
1564 			getSavePoints()->push(kEntityAnna, kEntityVerges, kAction339669520);
1565 			getSavePoints()->push(kEntityAnna, kEntityCoudert, kAction339669520);
1566 			getSavePoints()->push(kEntityAnna, kEntityMax, kAction71277948);
1567 
1568 			setup_goVassili();
1569 			break;
1570 
1571 		case 2:
1572 			setup_goVassili();
1573 			break;
1574 		}
1575 		break;
1576 
1577 	case kAction226031488:
1578 		if (getSoundQueue()->isBuffered(kEntityAnna))
1579 			getSoundQueue()->fade(kEntityAnna);
1580 
1581 		getSavePoints()->push(kEntityAnna, kEntityMax, kAction71277948);
1582 		break;
1583 
1584 	case kAction238358920:
1585 		setCallback(2);
1586 		setup_enterExitCompartment("608Cf", kObjectCompartmentF);
1587 		break;
1588 	}
1589 IMPLEMENT_FUNCTION_END
1590 
1591 //////////////////////////////////////////////////////////////////////////
1592 IMPLEMENT_FUNCTION(36, Anna, goVassili)
1593 	switch (savepoint.action) {
1594 	default:
1595 		break;
1596 
1597 	case kActionDefault:
1598 		getObjects()->update(kObjectCompartmentF, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
1599 
1600 		setCallback(1);
1601 		setup_updateEntity(kCarRedSleeping, kPosition_8200);
1602 		break;
1603 
1604 	case kActionCallback:
1605 		switch (getCallback()) {
1606 		default:
1607 			break;
1608 
1609 		case 1:
1610 			getObjects()->update(kObjectCompartmentA, kEntityPlayer, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
1611 
1612 			setCallback(2);
1613 			setup_enterExitCompartment("608Aa", kObjectCompartmentA);
1614 			break;
1615 
1616 		case 2:
1617 			getObjects()->update(kObjectCompartmentA, kEntityPlayer, kObjectLocation2, kCursorKeepValue, kCursorKeepValue);
1618 			getData()->location = kLocationInsideCompartment;
1619 			getEntities()->clearSequences(kEntityAnna);
1620 
1621 			setup_function37();
1622 			break;
1623 		}
1624 		break;
1625 	}
1626 IMPLEMENT_FUNCTION_END
1627 
1628 //////////////////////////////////////////////////////////////////////////
1629 IMPLEMENT_FUNCTION(37, Anna, function37)
1630 	switch (savepoint.action) {
1631 	default:
1632 		break;
1633 
1634 	case kActionDefault:
1635 		getData()->entityPosition = kPosition_8200;
1636 		getData()->location = kLocationOutsideCompartment;
1637 		getData()->car = kCarRedSleeping;
1638 		break;
1639 
1640 	case kAction191477936:
1641 		setup_speakTatiana();
1642 		break;
1643 	}
1644 IMPLEMENT_FUNCTION_END
1645 
1646 //////////////////////////////////////////////////////////////////////////
1647 IMPLEMENT_FUNCTION(38, Anna, speakTatiana)
1648 	switch (savepoint.action) {
1649 	default:
1650 		break;
1651 
1652 	case kActionDefault:
1653 		getData()->entityPosition = kPosition_7500;
1654 
1655 		setCallback(1);
1656 		setup_playSound("ANN1010");
1657 		break;
1658 
1659 	case kActionCallback:
1660 		if (getCallback() == 1) {
1661 			getSound()->playSound(kEntityPlayer, "MUS043");
1662 			setup_leaveTatiana();
1663 		}
1664 		break;
1665 	}
1666 IMPLEMENT_FUNCTION_END
1667 
1668 //////////////////////////////////////////////////////////////////////////
1669 IMPLEMENT_FUNCTION_II(39, Anna, doWalk1019, CarIndex, EntityPosition)
1670 	switch (savepoint.action) {
1671 	default:
1672 		break;
1673 
1674 	case kActionNone:
1675 		if (getEntities()->updateEntity(kEntityAnna, (CarIndex)params->param1, (EntityPosition)params->param2)) {
1676 			getData()->inventoryItem = kItemNone;
1677 
1678 			callbackAction();
1679 		}
1680 		break;
1681 
1682 	case kAction1:
1683 		setCallback(1);
1684 		setup_savegame(kSavegameTypeEvent, kEventAnnaGoodNight);
1685 		break;
1686 
1687 	case kActionExcuseMe:
1688 		getSound()->playSound(kEntityAnna, "ANN1107A");
1689 		break;
1690 
1691 	case kActionDefault:
1692 		getData()->inventoryItem = kItemNone;
1693 		if (!getEvent(kEventAnnaGoodNight) && !getEvent(kEventAnnaGoodNightInverse))
1694 			getData()->inventoryItem = kItemInvalid;
1695 
1696 		if (getEntities()->updateEntity(kEntityAnna, (CarIndex)params->param1, (EntityPosition)params->param2)) {
1697 			getData()->inventoryItem = kItemNone;
1698 
1699 			callbackAction();
1700 		}
1701 		break;
1702 
1703 	case kActionCallback:
1704 		if (getCallback() == 1) {
1705 			getAction()->playAnimation(getData()->direction == kDirectionUp ? kEventAnnaGoodNight : kEventAnnaGoodNightInverse);
1706 			getData()->inventoryItem = kItemNone;
1707 
1708 			getEntities()->loadSceneFromEntityPosition(getData()->car, (EntityPosition)(getData()->entityPosition + (750 * (getData()->direction == kDirectionUp ? -1 : 1))), getData()->direction == kDirectionUp);
1709 		}
1710 		break;
1711 	}
1712 IMPLEMENT_FUNCTION_END
1713 
1714 //////////////////////////////////////////////////////////////////////////
1715 IMPLEMENT_FUNCTION(40, Anna, leaveTatiana)
1716 	switch (savepoint.action) {
1717 	default:
1718 		break;
1719 
1720 	case kActionDefault:
1721 		setCallback(1);
1722 		setup_enterExitCompartment("608Cb", kObjectCompartmentB);
1723 		break;
1724 
1725 	case kActionCallback:
1726 		switch (getCallback()) {
1727 		default:
1728 			break;
1729 
1730 		case 1:
1731 			getData()->location = kLocationOutsideCompartment;
1732 
1733 			setCallback(2);
1734 			setup_doWalk1019(kCarRedSleeping, kPosition_4070);
1735 			break;
1736 
1737 		case 2:
1738 			setCallback(3);
1739 			setup_enterExitCompartment("608Bf", kObjectCompartmentF);
1740 			break;
1741 
1742 		case 3:
1743 			getEntities()->clearSequences(kEntityAnna);
1744 			getData()->location = kLocationInsideCompartment;
1745 
1746 			setCallback(4);
1747 			setup_updateFromTime(150);
1748 			break;
1749 
1750 		case 4:
1751 			setCallback(5);
1752 			setup_enterExitCompartment("608Cf", kObjectCompartmentF);
1753 			break;
1754 
1755 		case 5:
1756 			getData()->location = kLocationOutsideCompartment;
1757 
1758 			setCallback(6);
1759 			setup_doWalk1019(kCarRedSleeping, kPosition_7500);
1760 			break;
1761 
1762 		case 6:
1763 			setCallback(7);
1764 			setup_enterExitCompartment("608Bb", kObjectCompartmentB);
1765 			break;
1766 
1767 		case 7:
1768 			getEntities()->clearSequences(kEntityAnna);
1769 			getData()->location = kLocationInsideCompartment;
1770 
1771 			setCallback(8);
1772 			setup_updateFromTime(150);
1773 			break;
1774 
1775 		case 8:
1776 			setCallback(9);
1777 			setup_enterExitCompartment("608Cb", kObjectCompartmentB);
1778 			break;
1779 
1780 		case 9:
1781 			getData()->location = kLocationOutsideCompartment;
1782 
1783 			setCallback(10);
1784 			setup_doWalk1019(kCarRedSleeping, kPosition_4070);
1785 			break;
1786 
1787 		case 10:
1788 			setCallback(11);
1789 			setup_enterExitCompartment("608Bf", kObjectCompartmentF);
1790 			break;
1791 
1792 		case 11:
1793 			getEntities()->clearSequences(kEntityAnna);
1794 			getData()->location = kLocationInsideCompartment;
1795 			getData()->entityPosition = kPosition_4070;
1796 
1797 			setup_goBackToSleep();
1798 			break;
1799 		}
1800 		break;
1801 	}
1802 IMPLEMENT_FUNCTION_END
1803 
1804 //////////////////////////////////////////////////////////////////////////
1805 IMPLEMENT_FUNCTION(41, Anna, goBackToSleep)
1806 	switch (savepoint.action) {
1807 	default:
1808 		break;
1809 
1810 	case kActionNone:
1811 		if (!Entity::updateParameter(params->param2, getState()->time, 2700))
1812 			break;
1813 
1814 		params->param1++;
1815 		switch (params->param1) {
1816 		default:
1817 			break;
1818 
1819 		case 1:
1820 			getEntities()->drawSequenceLeft(kEntityAnna, "419A");
1821 			break;
1822 
1823 		case 2:
1824 			getEntities()->drawSequenceLeft(kEntityAnna, "419B");
1825 			break;
1826 
1827 		case 3:
1828 			getEntities()->drawSequenceLeft(kEntityAnna, "419C");
1829 			params->param1 = 0;
1830 			break;
1831 		}
1832 
1833 		params->param2 = 0;
1834 		break;
1835 
1836 	case kActionKnock:
1837 	case kActionOpenDoor:
1838 		getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
1839 		getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
1840 
1841 		setCallback(savepoint.action == kActionKnock ? 1 : 2);
1842 		setup_playSound(savepoint.action == kActionKnock ? "LIB012" : "LIB013");
1843 		break;
1844 
1845 	case kActionDefault:
1846 		getSavePoints()->push(kEntityAnna, kEntityMax, kAction101687594);
1847 		getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
1848 		getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
1849 		getEntities()->drawSequenceLeft(kEntityAnna, "419C");
1850 		break;
1851 
1852 	case kActionCallback:
1853 		switch (getCallback()) {
1854 		default:
1855 			break;
1856 
1857 		case 1:
1858 		case 2:
1859 			if (!getSoundQueue()->isBuffered(kEntityMax)) {
1860 				setCallback(3);
1861 				setup_playSound("MAX1120");
1862 				break;
1863 			}
1864 			// fall through
1865 
1866 		case 3:
1867 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
1868 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
1869 			break;
1870 		}
1871 		break;
1872 	}
1873 IMPLEMENT_FUNCTION_END
1874 
1875 //////////////////////////////////////////////////////////////////////////
1876 IMPLEMENT_FUNCTION(42, Anna, chapter2)
1877 	switch (savepoint.action) {
1878 	default:
1879 		break;
1880 
1881 	case kActionNone:
1882 		setup_inPart2();
1883 		break;
1884 
1885 	case kActionDefault:
1886 		getEntities()->clearSequences(kEntityAnna);
1887 
1888 		getData()->entityPosition = kPosition_4070;
1889 		getData()->location = kLocationInsideCompartment;
1890 		getData()->car = kCarRedSleeping;
1891 		getData()->clothes = kClothes1;
1892 		getData()->inventoryItem = kItemNone;
1893 
1894 		break;
1895 	}
1896 IMPLEMENT_FUNCTION_END
1897 
1898 //////////////////////////////////////////////////////////////////////////
1899 IMPLEMENT_FUNCTION(43, Anna, inPart2)
1900 	switch (savepoint.action) {
1901 	default:
1902 		break;
1903 
1904 	case kActionDefault:
1905 		getObjects()->update(kObjectOutsideAnnaCompartment, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
1906 
1907 		setCallback(1);
1908 		setup_practiceMusic();
1909 		break;
1910 
1911 	case kActionCallback:
1912 		switch (getCallback()) {
1913 		default:
1914 			break;
1915 
1916 		case 1:
1917 			setCallback(2);
1918 			setup_compartmentLogic(kTime1786500, "418C");
1919 			break;
1920 
1921 		case 2:
1922 			setCallback(3);
1923 			setup_practiceMusic();
1924 			break;
1925 
1926 		case 3:
1927 			setCallback(4);
1928 			setup_compartmentLogic(kTime1818000, "418C");
1929 			break;
1930 
1931 		case 4:
1932 			setCallback(5);
1933 			setup_practiceMusic();
1934 			break;
1935 
1936 		case 5:
1937 			setCallback(6);
1938 			setup_compartmentLogic(kTimeEnd, "418C");
1939 			break;
1940 		}
1941 		break;
1942 	}
1943 IMPLEMENT_FUNCTION_END
1944 
1945 //////////////////////////////////////////////////////////////////////////
1946 IMPLEMENT_FUNCTION(44, Anna, chapter3)
1947 	switch (savepoint.action) {
1948 	default:
1949 		break;
1950 
1951 	case kActionNone:
1952 		setup_practicing();
1953 		break;
1954 
1955 	case kActionDefault:
1956 		getEntities()->clearSequences(kEntityAnna);
1957 
1958 		getData()->entityPosition = kPosition_4070;
1959 		getData()->location = kLocationInsideCompartment;
1960 		getData()->car = kCarRedSleeping;
1961 		getData()->clothes = kClothes3;
1962 		getData()->inventoryItem = kItemNone;
1963 
1964 		getObjects()->update(kObjectCompartmentF, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
1965 		getObjects()->update(kObjectOutsideAnnaCompartment, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
1966 		getObjects()->update(kObject53, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
1967 		break;
1968 	}
1969 IMPLEMENT_FUNCTION_END
1970 
1971 //////////////////////////////////////////////////////////////////////////
1972 IMPLEMENT_FUNCTION_I(45, Anna, exitCompartment, bool)
1973 	switch (savepoint.action) {
1974 	default:
1975 		break;
1976 
1977 	case kActionDefault:
1978 		getData()->location = kLocationOutsideCompartment;
1979 
1980 		setCallback(1);
1981 		setup_enterExitCompartment("625Bf", kObjectCompartmentF);
1982 		break;
1983 
1984 	case kActionCallback:
1985 		switch (getCallback()) {
1986 		default:
1987 			break;
1988 
1989 		case 1:
1990 			getSavePoints()->push(kEntityAnna, kEntityCoudert, params->param1 ? kAction185737168 : kAction185671840);
1991 			getSound()->playSound(kEntityAnna, "Ann3147");
1992 			getEntities()->drawSequenceLeft(kEntityAnna, "625EF");
1993 			getEntities()->enterCompartment(kEntityAnna, kObjectCompartmentF, true);
1994 			break;
1995 
1996 		case 2:
1997 			getEntities()->exitCompartment(kEntityAnna, kObjectCompartmentF, true);
1998 			callbackAction();
1999 			break;
2000 		}
2001 		break;
2002 
2003 	case kAction157894320:
2004 		setCallback(2);
2005 		setup_updateFromTime(75);
2006 		break;
2007 	}
2008 IMPLEMENT_FUNCTION_END
2009 
2010 //////////////////////////////////////////////////////////////////////////
2011 IMPLEMENT_FUNCTION(46, Anna, practicing)
2012 	switch (savepoint.action) {
2013 	default:
2014 		break;
2015 
2016 	case kActionDefault:
2017 		if (getEntities()->isPlayerPosition(kCarRedSleeping, 60))
2018 			getScenes()->loadSceneFromPosition(kCarRedSleeping, 49);
2019 
2020 		setCallback(1);
2021 		setup_practiceMusic();
2022 		break;
2023 
2024 	case kActionCallback:
2025 		if (getCallback() == 1 || getCallback() == 2) {
2026 			if (ENTITY_PARAM(0, 1)) {
2027 				setup_goLunch();
2028 			} else {
2029 				setCallback(2);
2030 				setup_compartmentLogic((TimeValue) (getState()->time + 4500), "418C");
2031 			}
2032 		}
2033 		break;
2034 	}
2035 IMPLEMENT_FUNCTION_END
2036 
2037 //////////////////////////////////////////////////////////////////////////
2038 IMPLEMENT_FUNCTION(47, Anna, goLunch)
2039 	switch (savepoint.action) {
2040 	default:
2041 		break;
2042 
2043 	case kActionDefault:
2044 		getObjects()->update(kObjectCompartmentF, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
2045 		getObjects()->update(kObject53, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
2046 
2047 		setCallback(1);
2048 		setup_enterExitCompartment("688Bf", kObjectCompartmentF);
2049 		break;
2050 
2051 	case kActionCallback:
2052 		switch (getCallback()) {
2053 		default:
2054 			break;
2055 
2056 		case 1:
2057 			getData()->location = kLocationOutsideCompartment;
2058 			getSavePoints()->push(kEntityAnna, kEntityMax, kAction71277948);
2059 
2060 			setCallback(2);
2061 			setup_updateEntity(kCarRestaurant, kPosition_850);
2062 			break;
2063 
2064 		case 2:
2065 			setCallback(3);
2066 			setup_callbackActionRestaurantOrSalon();
2067 			break;
2068 
2069 		case 3:
2070 			getData()->entityPosition = kPosition_1540;
2071 			getData()->location = kLocationOutsideCompartment;
2072 
2073 			setCallback(4);
2074 			setup_draw("801VS");
2075 			break;
2076 
2077 		case 4:
2078 			getSound()->playSound(kEntityAnna, getEvent(kEventAugustLunch) ? "Ann3136" : "Ann3136A", kSoundVolumeEntityDefault, 30);
2079 			getSavePoints()->push(kEntityAnna, kEntityAugust, kAction122358304);
2080 
2081 			setCallback(5);
2082 			setup_draw2("026B1", "026B2", kEntityAugust);
2083 			break;
2084 
2085 		case 5:
2086 			getEntities()->drawSequenceLeft(kEntityAugust, "BLANK");
2087 			setup_lunch();
2088 			break;
2089 		}
2090 		break;
2091 	}
2092 IMPLEMENT_FUNCTION_END
2093 
2094 //////////////////////////////////////////////////////////////////////////
2095 IMPLEMENT_FUNCTION(48, Anna, lunch)
2096 	switch (savepoint.action) {
2097 	default:
2098 		break;
2099 
2100 	case kActionNone:
2101 		if (!params->param1)
2102 			break;
2103 
2104 		if (params->param3 != kTimeInvalid && getState()->time > kTime1969200) {
2105 			if (Entity::updateParameterTime(kTime1983600, (!getEntities()->isInRestaurant(kEntityPlayer) || getSoundQueue()->isBuffered(kEntityBoutarel)), params->param3, 150)) {
2106 				setCallback(3);
2107 				setup_playSound("Aug3007A");
2108 				break;
2109 			}
2110 		}
2111 
2112 label_callback_4:
2113 		if (ENTITY_PARAM(0, 2)) {
2114 			if (!params->param2)
2115 				params->param2 = (uint)(getState()->time + 4500);
2116 
2117 			if (params->param4 != kTimeInvalid) {
2118 				if (params->param2 >= getState()->time) {
2119 					if (!getEntities()->isInRestaurant(kEntityPlayer) || !params->param4)
2120 						params->param4 = (uint)(getState()->time + 450);
2121 
2122 					if (params->param4 >= getState()->time)
2123 						break;
2124 				}
2125 
2126 				params->param4 = kTimeInvalid;
2127 
2128 				setup_leaveLunch();
2129 			}
2130 		}
2131 		break;
2132 
2133 	case kActionDefault:
2134 		getEntities()->drawSequenceLeft(kEntityAnna, "026c");
2135 		getData()->location = kLocationInsideCompartment;
2136 
2137 		setCallback(1);
2138 		setup_updateFromTime(450);
2139 		break;
2140 
2141 	case kActionCallback:
2142 		switch (getCallback()) {
2143 		default:
2144 			break;
2145 
2146 		case 1:
2147 			setCallback(2);
2148 			setup_playSound("Ann3137B");
2149 			break;
2150 
2151 		case 2:
2152 			getSavePoints()->push(kEntityAnna, kEntityWaiter1, kAction218983616);
2153 			break;
2154 
2155 		case 3:
2156 			setCallback(4);
2157 			setup_playSound("Aug3006A");
2158 			break;
2159 
2160 		case 4:
2161 			goto label_callback_4;
2162 
2163 		case 5:
2164 			setCallback(6);
2165 			setup_updateFromTime(900);
2166 			break;
2167 
2168 		case 6:
2169 			setCallback(7);
2170 			setup_playSound("Aug3006");
2171 			break;
2172 
2173 		case 7:
2174 			setCallback(8);
2175 			setup_updateFromTime(2700);
2176 			break;
2177 
2178 		case 8:
2179 			getEntities()->drawSequenceLeft(kEntityAnna, "026H");
2180 			params->param1 = 1;
2181 			break;
2182 		}
2183 		break;
2184 
2185 	case kAction122288808:
2186 		getEntities()->drawSequenceLeft(kEntityAnna, "026C");
2187 
2188 		setCallback(5);
2189 		setup_playSound("Ann3138A");
2190 		break;
2191 
2192 	case kAction122358304:
2193 		getEntities()->drawSequenceLeft(kEntityAnna, "BLANK");
2194 		break;
2195 	}
2196 IMPLEMENT_FUNCTION_END
2197 
2198 //////////////////////////////////////////////////////////////////////////
2199 IMPLEMENT_FUNCTION(49, Anna, leaveTableWithAugust)
2200 	switch (savepoint.action) {
2201 	default:
2202 		break;
2203 
2204 	case kActionExitCompartment:
2205 		getSavePoints()->push(kEntityAnna, kEntityTables3, kActionDrawTablesWithChairs, "010M");
2206 		getEntities()->clearSequences(kEntityAugust);
2207 
2208 		callbackAction();
2209 		break;
2210 
2211 	case kActionDefault:
2212 		getEntities()->drawSequenceRight(kEntityTables3, "026J3");
2213 		getEntities()->drawSequenceRight(kEntityAugust, "026J2");
2214 		getEntities()->drawSequenceRight(kEntityAnna, "026J1");
2215 		break;
2216 	}
2217 IMPLEMENT_FUNCTION_END
2218 
2219 //////////////////////////////////////////////////////////////////////////
2220 IMPLEMENT_FUNCTION(50, Anna, leaveLunch)
2221 	switch (savepoint.action) {
2222 	default:
2223 		break;
2224 
2225 	case kActionDefault:
2226 		setCallback(1);
2227 		setup_playSound("Ann3141");
2228 		break;
2229 
2230 	case kActionCallback:
2231 		switch (getCallback()) {
2232 		default:
2233 			break;
2234 
2235 		case 1:
2236 			setCallback(2);
2237 			setup_callbackActionRestaurantOrSalon();
2238 			break;
2239 
2240 		case 2:
2241 			getData()->location = kLocationOutsideCompartment;
2242 			setCallback(3);
2243 			setup_leaveTableWithAugust();
2244 			break;
2245 
2246 		case 3:
2247 			setup_afterLunch();
2248 			break;
2249 		}
2250 		break;
2251 	}
2252 IMPLEMENT_FUNCTION_END
2253 
2254 //////////////////////////////////////////////////////////////////////////
2255 IMPLEMENT_FUNCTION(51, Anna, afterLunch)
2256 	switch (savepoint.action) {
2257 	default:
2258 		break;
2259 
2260 	case kActionNone:
2261 		if (params->param1) {
2262 			if (getEntities()->isSomebodyInsideRestaurantOrSalon()) {
2263 				getSound()->playSound(kEntityAnna, "Aug3008");
2264 				getData()->location = kLocationOutsideCompartment;
2265 
2266 				setCallback(2);
2267 				setup_draw2("112E1", "112E2", kEntityAugust);
2268 			}
2269 		}
2270 		break;
2271 
2272 	case kActionDefault:
2273 		getSound()->playSound(kEntityAnna, "Ann3142", kSoundVolumeEntityDefault, 30);
2274 		getEntities()->updatePositionEnter(kEntityAnna, kCarRestaurant, 57);
2275 		getEntities()->drawSequenceRight(kEntityAnna, "112A");
2276 		if (getEntities()->isInRestaurant(kEntityPlayer))
2277 			getEntities()->updateFrame(kEntityAnna);
2278 
2279 		setCallback(1);
2280 		setup_callbackActionOnDirection();
2281 		break;
2282 
2283 	case kActionCallback:
2284 		switch (getCallback()) {
2285 		default:
2286 			break;
2287 
2288 		case 1:
2289 			getData()->location = kLocationInsideCompartment;
2290 			getEntities()->drawSequenceLeft(kEntityAnna, "112B");
2291 			getEntities()->updatePositionExit(kEntityAnna, kCarRestaurant, 57);
2292 			getSavePoints()->push(kEntityAnna, kEntityWaiter2, kAction219377792);
2293 			break;
2294 
2295 		case 2:
2296 			getSavePoints()->push(kEntityAnna, kEntityAugust, kAction122288808);
2297 
2298 			setup_returnCompartment3();
2299 			break;
2300 
2301 		case 3:
2302 			getEntities()->drawSequenceLeft(kEntityAnna, "112D");
2303 
2304 			if (getState()->time >= kTimeEnterAttnangPuchheim) {
2305 				params->param1 = 1;
2306 			} else {
2307 				setCallback(4);
2308 				setup_playSound("Ann3142A");
2309 			}
2310 			break;
2311 
2312 		case 4:
2313 			setCallback(5);
2314 			setup_updateFromTime(1800);
2315 			break;
2316 
2317 		case 5:
2318 			setCallback(6);
2319 			setup_playSound("Aug3007");
2320 			break;
2321 
2322 		case 6:
2323 			params->param1 = 1;
2324 			break;
2325 		}
2326 		break;
2327 
2328 	case kAction101169422:
2329 		if (getEvent(kEventKronosVisit)) {
2330 			setCallback(3);
2331 			setup_updatePosition("112J", kCarRestaurant, 57);
2332 			break;
2333 		}
2334 
2335 		if (getState()->time >= kTimeEnterAttnangPuchheim) {
2336 			params->param1 = 1;
2337 		} else {
2338 			setCallback(4);
2339 			setup_playSound("Ann3142A");
2340 		}
2341 		break;
2342 
2343 	case kAction122288808:
2344 		getEntities()->drawSequenceLeft(kEntityAnna, "112D");
2345 		getSavePoints()->push(kEntityAnna, kEntityKronos, kAction157159392);
2346 		break;
2347 
2348 	case kAction122358304:
2349 		getEntities()->drawSequenceLeft(kEntityAnna, "BLANK");
2350 		break;
2351 	}
2352 IMPLEMENT_FUNCTION_END
2353 
2354 //////////////////////////////////////////////////////////////////////////
2355 IMPLEMENT_FUNCTION(52, Anna, returnCompartment3)
2356 	switch (savepoint.action) {
2357 	default:
2358 		break;
2359 
2360 	case kActionExitCompartment:
2361 		getEntities()->exitCompartment(kEntityAnna, kObjectCompartmentF);
2362 		getData()->entityPosition = kPosition_4070;
2363 		getData()->location = kLocationInsideCompartment;
2364 
2365 		getEntities()->clearSequences(kEntityAnna);
2366 
2367 		setup_dressing();
2368 		break;
2369 
2370 	case kActionDefault:
2371 		setCallback(1);
2372 		setup_updateEntity(kCarRedSleeping, kPosition_4070);
2373 		break;
2374 
2375 	case kActionCallback:
2376 		if (getCallback() == 1) {
2377 			getEntities()->drawSequenceRight(kEntityAnna, "688Af");
2378 			getEntities()->enterCompartment(kEntityAnna, kObjectCompartmentF);
2379 			getData()->location = kLocationInsideCompartment;
2380 
2381 			if (getEntities()->isInsideCompartment(kEntityPlayer, kCarRedSleeping, kPosition_4070) || getEntities()->isInsideCompartment(kEntityPlayer, kCarRedSleeping, kPosition_4455)) {
2382 				getAction()->playAnimation(isNight() ? kEventCathTurningNight : kEventCathTurningDay);
2383 				getSound()->playSound(kEntityPlayer, "BUMP");
2384 				getScenes()->loadSceneFromObject(kObjectCompartmentF);
2385 			}
2386 		}
2387 		break;
2388 	}
2389 IMPLEMENT_FUNCTION_END
2390 
2391 //////////////////////////////////////////////////////////////////////////
2392 IMPLEMENT_FUNCTION(53, Anna, dressing)
2393 	switch (savepoint.action) {
2394 	default:
2395 		break;
2396 
2397 	case kActionNone:
2398 		if (getProgress().field_48 && params->param5 != kTimeInvalid) {
2399 			if (Entity::updateParameterTime(kTime2065500, !getEntities()->isPlayerInCar(kCarRedSleeping), params->param5, 150)) {
2400 				setup_giveMaxToConductor2();
2401 				break;
2402 			}
2403 		}
2404 
2405 		if (params->param3) {
2406 			if (Entity::updateParameter(params->param6, getState()->time, 9000)) {
2407 				params->param4 = !params->param4;
2408 				getEntities()->drawSequenceLeft(kEntityAnna, params->param4 ? "417A" : "417B");
2409 				params->param6 = 0;
2410 			}
2411 		}
2412 
2413 		if (params->param1) {
2414 			if (!Entity::updateParameter(params->param7, getState()->timeTicks, 75))
2415 				break;
2416 
2417 			CursorStyle cursor = getEntities()->isInsideCompartment(kEntityMax, kCarRedSleeping, kPosition_4070) ? kCursorHand : kCursorNormal;
2418 
2419 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorNormal, cursor);
2420 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorNormal, cursor);
2421 
2422 			params->param1 = 0;
2423 			params->param2 = 1;
2424 		}
2425 
2426 		params->param7 = 0;
2427 		break;
2428 
2429 	case kActionOpenDoor:
2430 		if (getEntities()->isInsideCompartment(kEntityMax, kCarRedSleeping, kPosition_4070)) {
2431 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
2432 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
2433 
2434 			setCallback(1);
2435 			setup_playSound("LIB013");
2436 			break;
2437 		}
2438 		// fall through
2439 
2440 	case kActionKnock:
2441 		getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
2442 		getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
2443 
2444 		if (params->param1) {
2445 			if (savepoint.param.intValue == 53) {
2446 				setCallback(6);
2447 				setup_playSound(getSound()->justAMinuteCath());
2448 				break;
2449 			}
2450 
2451 			if (getInventory()->hasItem(kItemPassengerList)) {
2452 				setCallback(7);
2453 				setup_playSound(rnd(2) ? getSound()->wrongDoorCath() : (rnd(2) ? "CAT1506" : "CAT1506A"));
2454 				break;
2455 			}
2456 
2457 			setCallback(8);
2458 			setup_playSound(getSound()->wrongDoorCath());
2459 			break;
2460 		}
2461 
2462 		setCallback(savepoint.action == kActionKnock ? 3 : 4);
2463 		setup_playSound(savepoint.action == kActionKnock ? "LIB012" : "LIB013");
2464 		break;
2465 
2466 	case kActionDefault:
2467 		getSavePoints()->push(kEntityAnna, kEntityMax, kAction101687594);
2468 		getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
2469 		getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
2470 
2471 		getData()->clothes = kClothes2;
2472 		break;
2473 
2474 	case kActionDrawScene:
2475 		if (params->param1 || params->param2) {
2476 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
2477 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
2478 
2479 			params->param1 = 0;
2480 			params->param2 = 0;
2481 		}
2482 
2483 		if (!params->param3 && (getEntities()->isPlayerPosition(kCarRedSleeping, 60) || getState()->time > kTime2034000)) {
2484 			params->param3 = 1;
2485 
2486 			setCallback(9);
2487 			setup_draw("416");
2488 		}
2489 		break;
2490 
2491 	case kActionCallback:
2492 		switch (getCallback()) {
2493 		default:
2494 			break;
2495 
2496 		case 1:
2497 			if (!getSoundQueue()->isBuffered(kEntityMax)) {
2498 				setCallback(2);
2499 				setup_playSound("MAX1120");
2500 				break;
2501 			}
2502 			// fall through
2503 
2504 		case 2:
2505 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
2506 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
2507 			break;
2508 
2509 		case 3:
2510 		case 4:
2511 			setCallback(5);
2512 			setup_playSound("ANN1016");
2513 			break;
2514 
2515 		case 5:
2516 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorTalk, kCursorNormal);
2517 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorTalk, kCursorNormal);
2518 			params->param1 = 1;
2519 			break;
2520 
2521 		case 6:
2522 		case 7:
2523 		case 8:
2524 			if (getEntities()->isInsideCompartment(kEntityMax, kCarRedSleeping, kPosition_4070)) {
2525 				getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorHand);
2526 				getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorHand);
2527 			}
2528 
2529 			params->param1 = 0;
2530 			params->param2 = 1;
2531 			break;
2532 
2533 		case 9:
2534 			if (getEntities()->isPlayerPosition(kCarRedSleeping, 60))
2535 				getScenes()->loadSceneFromPosition(kCarRedSleeping, 78);
2536 			getEntities()->drawSequenceLeft(kEntityAnna, "417B");
2537 			break;
2538 		}
2539 		break;
2540 	}
2541 IMPLEMENT_FUNCTION_END
2542 
2543 //////////////////////////////////////////////////////////////////////////
2544 IMPLEMENT_FUNCTION(54, Anna, giveMaxToConductor2)
2545 	switch (savepoint.action) {
2546 	default:
2547 		break;
2548 
2549 	case kActionNone:
2550 		if (params->param3) {
2551 			if (Entity::timeCheck(kTime2079000, params->param5, WRAP_SETUP_FUNCTION(Anna, setup_goConcert)))
2552 				break;
2553 
2554 			if (Entity::updateParameter(params->param6, getState()->time, 9000)) {
2555 				params->param4 = !params->param4;
2556 				getEntities()->drawSequenceLeft(kEntityAnna, params->param4 ? "417A" : "417B");
2557 				params->param6 = 0;
2558 			}
2559 		}
2560 
2561 		if (params->param1) {
2562 			if (!Entity::updateParameter(params->param7, getState()->timeTicks, 75))
2563 				break;
2564 
2565 			CursorStyle cursor = getEntities()->isInsideCompartment(kEntityMax, kCarRedSleeping, kPosition_4070) ? kCursorHand : kCursorNormal;
2566 
2567 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorNormal, cursor);
2568 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorNormal, cursor);
2569 
2570 			params->param1 = 0;
2571 			params->param2 = 1;
2572 		}
2573 
2574 		params->param7 = 0;
2575 		break;
2576 
2577 	case kActionOpenDoor:
2578 		if (getEntities()->isInsideCompartment(kEntityMax, kCarRedSleeping, kPosition_4070)) {
2579 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
2580 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
2581 
2582 			setCallback(1);
2583 			setup_playSound("LIB013");
2584 			break;
2585 		}
2586 		// fall through
2587 
2588 	case kActionKnock:
2589 		getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
2590 		getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
2591 
2592 		if (params->param1) {
2593 			if (savepoint.param.intValue == 53) {
2594 				setCallback(6);
2595 				setup_playSound(getSound()->justAMinuteCath());
2596 				break;
2597 			}
2598 
2599 			if (getInventory()->hasItem(kItemPassengerList)) {
2600 				setCallback(7);
2601 				setup_playSound(rnd(2) ? getSound()->wrongDoorCath() : (rnd(2) ? "CAT1506" : "CAT1506A"));
2602 				break;
2603 			}
2604 
2605 			setCallback(8);
2606 			setup_playSound(getSound()->wrongDoorCath());
2607 			break;
2608 		}
2609 
2610 		setCallback(savepoint.action == kActionKnock ? 3 : 4);
2611 		setup_playSound(savepoint.action == kActionKnock ? "LIB012" : "LIB013");
2612 		break;
2613 
2614 	case kActionDefault:
2615 		getObjects()->update(kObjectOutsideAnnaCompartment, kEntityPlayer, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
2616 		if (getEntities()->isPlayerPosition(kCarRedSleeping, 60))
2617 			getScenes()->loadSceneFromPosition(kCarRedSleeping, 78);
2618 
2619 		getSavePoints()->push(kEntityAnna, kEntityCoudert, kAction189750912);
2620 		break;
2621 
2622 	case kActionDrawScene:
2623 		if (params->param1 || params->param2) {
2624 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
2625 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
2626 
2627 			params->param1 = 0;
2628 			params->param2 = 0;
2629 		}
2630 		break;
2631 
2632 	case kActionCallback:
2633 		switch (getCallback()) {
2634 		default:
2635 			break;
2636 
2637 		case 1:
2638 			if (!getSoundQueue()->isBuffered(kEntityMax)) {
2639 				setCallback(2);
2640 				setup_playSound("MAX1120");
2641 				break;
2642 			}
2643 			// fall through
2644 
2645 		case 2:
2646 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
2647 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
2648 			break;
2649 
2650 		case 3:
2651 		case 4:
2652 			setCallback(5);
2653 			setup_playSound("ANN1016");
2654 			break;
2655 
2656 		case 5:
2657 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorTalk, kCursorNormal);
2658 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorTalk, kCursorNormal);
2659 			params->param1 = 1;
2660 			break;
2661 
2662 		case 6:
2663 		case 7:
2664 		case 8:
2665 			if (getEntities()->isInsideCompartment(kEntityMax, kCarRedSleeping, kPosition_4070)) {
2666 				getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorHand);
2667 				getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorHand);
2668 			}
2669 
2670 			params->param1 = 0;
2671 			params->param2 = 1;
2672 			break;
2673 
2674 		case 9:
2675 			getEntities()->exitCompartment(kEntityAnna, kObjectCompartmentF, true);
2676 			getEntities()->clearSequences(kEntityAnna);
2677 
2678 			getData()->location = kLocationInsideCompartment;
2679 			getData()->entityPosition = kPosition_4070;
2680 			params->param3 = 1;
2681 
2682 			getObjects()->update(kObjectOutsideAnnaCompartment, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
2683 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
2684 
2685 			if (getEntities()->isPlayerPosition(kCarRedSleeping, 78))
2686 				getScenes()->loadSceneFromPosition(kCarRedSleeping, 49);
2687 			getEntities()->drawSequenceLeft(kEntityAnna, "417B");
2688 			break;
2689 		}
2690 		break;
2691 
2692 	case kAction123733488:
2693 		setCallback(9);
2694 		setup_enterExitCompartment("629Ef", kObjectCompartmentF);
2695 		break;
2696 
2697 	case kAction156049968:
2698 		getEntities()->drawSequenceLeft(kEntityAnna, "629DF");
2699 		getEntities()->enterCompartment(kEntityAnna, kObjectCompartmentF, true);
2700 		break;
2701 
2702 	case kAction253868128:
2703 		getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
2704 		break;
2705 	}
2706 IMPLEMENT_FUNCTION_END
2707 
2708 //////////////////////////////////////////////////////////////////////////
2709 IMPLEMENT_FUNCTION(55, Anna, goConcert)
2710 	switch (savepoint.action) {
2711 	default:
2712 		break;
2713 
2714 	case kActionDefault:
2715 		getObjects()->update(kObjectOutsideAnnaCompartment, kEntityPlayer, kObjectLocation2, kCursorKeepValue, kCursorKeepValue);
2716 
2717 		if (getEntities()->isPlayerPosition(kCarRedSleeping, 78))
2718 			getScenes()->loadSceneFromPosition(kCarRedSleeping, 49);
2719 
2720 		getObjects()->update(kObjectCompartmentF, kEntityPlayer, kObjectLocation1, kCursorNormal, kCursorNormal);
2721 		getObjects()->update(kObject53, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
2722 		getInventory()->setLocationAndProcess(kItemKey, kObjectLocation1);
2723 
2724 		setCallback(1);
2725 		setup_exitCompartment(true);
2726 		break;
2727 
2728 	case kActionCallback:
2729 		switch (getCallback()) {
2730 		default:
2731 			break;
2732 
2733 		case 1:
2734 			getObjects()->update(kObjectCompartmentF, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
2735 			setCallback(2);
2736 			setup_updateEntity(kCarKronos, kPosition_9270);
2737 			break;
2738 
2739 		case 2:
2740 			setup_concert();
2741 			break;
2742 		}
2743 		break;
2744 	}
2745 IMPLEMENT_FUNCTION_END
2746 
2747 //////////////////////////////////////////////////////////////////////////
2748 IMPLEMENT_FUNCTION(56, Anna, concert)
2749 	switch (savepoint.action) {
2750 	default:
2751 		break;
2752 
2753 	case kActionDefault:
2754 		getEntities()->clearSequences(kEntityAnna);
2755 		getData()->entityPosition = kPosition_6000;
2756 		getData()->location = kLocationInsideCompartment;
2757 		getData()->car = kCarKronos;
2758 		break;
2759 
2760 	case kAction191668032:
2761 		setup_leaveConcert();
2762 		break;
2763 	}
2764 IMPLEMENT_FUNCTION_END
2765 
2766 //////////////////////////////////////////////////////////////////////////
2767 IMPLEMENT_FUNCTION(57, Anna, leaveConcert)
2768 	switch (savepoint.action) {
2769 	default:
2770 		break;
2771 
2772 	case kActionDefault:
2773 		getData()->car = kCarGreenSleeping;
2774 		getData()->entityPosition = kPosition_850;
2775 		getData()->location = kLocationOutsideCompartment;
2776 
2777 		setCallback(1);
2778 		setup_updateEntity(kCarGreenSleeping, kPosition_5790);
2779 		break;
2780 
2781 	case kActionCallback:
2782 		switch (getCallback()) {
2783 		default:
2784 			break;
2785 
2786 		case 1:
2787 			getSavePoints()->push(kEntityAnna, kEntityAugust, kAction191668032);
2788 
2789 			setCallback(2);
2790 			setup_updateEntity(kCarRedSleeping, kPosition_4070);
2791 			break;
2792 
2793 		case 2:
2794 			getObjects()->update(kObjectCompartmentF, kEntityPlayer, kObjectLocation1, kCursorNormal, kCursorNormal);
2795 			getSavePoints()->push(kEntityAnna, kEntityCoudert, kAction205033696);
2796 			getEntities()->drawSequenceLeft(kEntityAnna, "625Ef");
2797 			getEntities()->enterCompartment(kEntityAnna, kObjectCompartmentF, true);
2798 			break;
2799 
2800 		case 3:
2801 			getEntities()->drawSequenceLeft(kEntityAnna, "625Gf");
2802 			getEntities()->enterCompartment(kEntityAnna, kObjectCompartmentF, true);
2803 			getSavePoints()->push(kEntityAnna, kEntityAugust, kAction169032608);
2804 			break;
2805 
2806 		case 4:
2807 			if (getSoundQueue()->isBuffered(kEntityAugust)) {
2808 				setCallback(4);
2809 				setup_updateFromTime(75);
2810 			} else {
2811 				setCallback(5);
2812 				setup_playSound("Aug3009");
2813 			}
2814 			break;
2815 
2816 		case 5:
2817 			getSound()->playSound(kEntityAnna, "Aug3009A");
2818 
2819 			setCallback(6);
2820 			setup_enterExitCompartment("628Bf", kObjectCompartmentF);
2821 			break;
2822 
2823 		case 6:
2824 			getEntities()->exitCompartment(kEntityAnna, kObjectCompartmentF, true);
2825 			getSavePoints()->push(kEntityAnna, kEntityAugust, kAction122288808);
2826 
2827 			setup_afterConcert();
2828 			break;
2829 		}
2830 		break;
2831 
2832 	case kAction123712592:
2833 		getEntities()->drawSequenceLeft(kEntityAnna, "628Af");
2834 
2835 		if (getSoundQueue()->isBuffered(kEntityAugust)) {
2836 			setCallback(4);
2837 			setup_updateFromTime(75);
2838 		} else {
2839 			setCallback(5);
2840 			setup_playSound("Aug3009");
2841 		}
2842 		break;
2843 
2844 	case kAction192063264:
2845 		if (getEntities()->isInsideCompartment(kEntityPlayer, kCarRedSleeping, kPosition_4070)
2846 		 || getEntities()->isInsideCompartment(kEntityPlayer, kCarRedSleeping, kPosition_4455)) {
2847 			getEntities()->exitCompartment(kEntityAnna, kObjectCompartmentF, true);
2848 			setup_leaveConcertCathInCompartment();
2849 		} else {
2850 			setCallback(3);
2851 			setup_enterExitCompartment("625Ff", kObjectCompartmentF);
2852 		}
2853 		break;
2854 	}
2855 IMPLEMENT_FUNCTION_END
2856 
2857 //////////////////////////////////////////////////////////////////////////
2858 IMPLEMENT_FUNCTION(58, Anna, leaveConcertCathInCompartment)
2859 	switch (savepoint.action) {
2860 	default:
2861 		break;
2862 
2863 	case kActionDefault:
2864 		setCallback(1);
2865 		setup_savegame(kSavegameTypeEvent, kEventAnnaSearchingCompartment);
2866 		break;
2867 
2868 	case kActionCallback:
2869 		if (getCallback() == 1) {
2870 			getAction()->playAnimation(kEventAnnaSearchingCompartment);
2871 			getEntities()->clearSequences(kEntityAnna);
2872 			getScenes()->loadSceneFromPosition(kCarRedSleeping, 8);
2873 			getSound()->playSound(kEntityAnna, "lib015");
2874 			getSavePoints()->push(kEntityAnna, kEntityAugust, kAction122288808);
2875 			setup_afterConcert();
2876 		}
2877 		break;
2878 	}
2879 IMPLEMENT_FUNCTION_END
2880 
2881 //////////////////////////////////////////////////////////////////////////
2882 IMPLEMENT_FUNCTION(59, Anna, afterConcert)
2883 	switch (savepoint.action) {
2884 	default:
2885 		break;
2886 
2887 	case kActionNone:
2888 		if (getInventory()->hasItem(kItemKey) && params->param4 != kTimeInvalid && getState()->time > kTime2218500) {
2889 			if (getState()->time > kTime2248200) {
2890 				params->param4 = kTimeInvalid;
2891 				setup_goBaggageCompartment();
2892 				break;
2893 			}
2894 
2895 			if (!params->param3
2896 			 || (!getEntities()->isPlayerInCar(kCarRedSleeping)
2897 			 && !getEntities()->isInSalon(kEntityPlayer)
2898 			 && !getEntities()->isInRestaurant(kEntityPlayer))
2899 			 || !params->param4)
2900 				params->param4 = (uint)getState()->time;
2901 
2902 			if (params->param4 < getState()->time) {
2903 				params->param4 = kTimeInvalid;
2904 				setup_goBaggageCompartment();
2905 				break;
2906 			}
2907 		}
2908 
2909 		if (params->param1) {
2910 			if (!Entity::updateParameter(params->param5, getState()->timeTicks, 75))
2911 				break;
2912 
2913 			CursorStyle style = getEntities()->isInsideCompartment(kEntityMax, kCarRedSleeping, kPosition_4070) ? kCursorHand : kCursorNormal;
2914 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorNormal, style);
2915 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorNormal, style);
2916 
2917 			params->param1= 0;
2918 			params->param2 = 1;
2919 		}
2920 
2921 		params->param5 = 0;
2922 		break;
2923 
2924 	case kActionKnock:
2925 	case kActionOpenDoor:
2926 		getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
2927 		getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
2928 
2929 		if (params->param1) {
2930 			if (savepoint.param.intValue == 53) {
2931 				setCallback(4);
2932 				setup_playSound(getSound()->justAMinuteCath());
2933 			} else if (getInventory()->hasItem(kItemPassengerList)) {
2934 				setCallback(5);
2935 				setup_playSound(rnd(2) ? getSound()->wrongDoorCath() : (rnd(2) ? "CAT1506" : "CAT1506A"));
2936 			} else {
2937 				setCallback(6);
2938 				setup_playSound(getSound()->wrongDoorCath());
2939 			}
2940 		} else {
2941 			setCallback(savepoint.action == kActionKnock ? 1 : 2);
2942 			setup_playSound(savepoint.action == kActionKnock ? "LIB012" : "LIB013");
2943 		}
2944 
2945 		break;
2946 
2947 	case kActionDefault:
2948 		getData()->entityPosition = kPosition_4070;
2949 		getData()->location = kLocationInsideCompartment;
2950 		getEntities()->clearSequences(kEntityAnna);
2951 
2952 		getObjects()->update(kObject107, kEntityPlayer, kObjectLocation2, kCursorKeepValue, kCursorKeepValue);
2953 		getObjects()->update(kObjectOutsideAnnaCompartment, kEntityPlayer, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
2954 		getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
2955 		getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
2956 
2957 		if (getEntities()->isPlayerPosition(kCarRedSleeping, 60))
2958 			getScenes()->loadSceneFromPosition(kCarRedSleeping, 78);
2959 		break;
2960 
2961 	case kActionDrawScene:
2962 		if (params->param1 || params->param2) {
2963 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
2964 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
2965 			params->param1 = 0;
2966 			params->param2 = 0;
2967 		}
2968 		break;
2969 
2970 	case kActionCallback:
2971 		switch (getCallback()) {
2972 		default:
2973 			break;
2974 
2975 		case 1:
2976 		case 2:
2977 			setCallback(3);
2978 			setup_playSound("ANN1016");
2979 			break;
2980 
2981 		case 3:
2982 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorTalk, kCursorNormal);
2983 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorTalk, kCursorNormal);
2984 			params->param1 = 1;
2985 			break;
2986 
2987 		case 4:
2988 		case 5:
2989 		case 6:
2990 			params->param1 = 0;
2991 			params->param2 = 1;
2992 			break;
2993 
2994 		case 7:
2995 			getSavePoints()->push(kEntityAnna, kEntityTatiana, kAction100906246);
2996 			break;
2997 		}
2998 		break;
2999 
3000 	case kAction156622016:
3001 		if (params->param3) {
3002 			setCallback(8);
3003 			setup_giveMaxBack();
3004 		}
3005 		break;
3006 
3007 	case kAction236241630:
3008 		getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
3009 		getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
3010 
3011 		setCallback(7);
3012 		setup_playSound("Ann1016A");
3013 		break;
3014 
3015 	case kAction236517970:
3016 		params->param3 = 1;
3017 		getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
3018 		getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
3019 		break;
3020 	}
3021 IMPLEMENT_FUNCTION_END
3022 
3023 //////////////////////////////////////////////////////////////////////////
3024 IMPLEMENT_FUNCTION(60, Anna, giveMaxBack)
3025 	switch (savepoint.action) {
3026 	default:
3027 		break;
3028 
3029 	case kActionDefault:
3030 		getSavePoints()->push(kEntityAnna, kEntityMax, kAction122358304);
3031 		getSound()->playSound(kEntityAnna, rnd(2) ? "Ann3126" : "Ann3127");
3032 
3033 		setCallback(1);
3034 		setup_enterExitCompartment("630Cf", kObjectCompartmentF);
3035 		break;
3036 
3037 	case kActionCallback:
3038 		switch (getCallback()) {
3039 		default:
3040 			break;
3041 
3042 		case 1:
3043 			setCallback(2);
3044 			setup_enterExitCompartment("630Df", kObjectCompartmentF);
3045 			break;
3046 
3047 		case 2:
3048 			getEntities()->clearSequences(kEntityAnna);
3049 			getSavePoints()->push(kEntityAnna, kEntityCoudert, kAction189026624);
3050 			break;
3051 
3052 		case 3:
3053 			getData()->entityPosition = kPosition_4070;
3054 			getData()->location = kLocationInsideCompartment;
3055 			getEntities()->clearSequences(kEntityAnna);
3056 
3057 			callbackAction();
3058 			break;
3059 		}
3060 		break;
3061 
3062 	case kAction156049968:
3063 		setCallback(3);
3064 		setup_enterExitCompartment("629EF", kObjectCompartmentF);
3065 		break;
3066 	}
3067 IMPLEMENT_FUNCTION_END
3068 
3069 //////////////////////////////////////////////////////////////////////////
3070 IMPLEMENT_FUNCTION(61, Anna, goBaggageCompartment)
3071 	switch (savepoint.action) {
3072 	default:
3073 		break;
3074 
3075 	case kActionDefault:
3076 		getState()->timeDelta = 3;
3077 
3078 		setCallback(1);
3079 		setup_savegame(kSavegameTypeTime, 0);
3080 		break;
3081 
3082 	case kActionCallback:
3083 		switch (getCallback()) {
3084 		default:
3085 			break;
3086 
3087 		case 1:
3088 			getObjects()->update(kObject53, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
3089 
3090 			setCallback(2);
3091 			setup_exitCompartment(false);
3092 			break;
3093 
3094 		case 2:
3095 			getObjects()->update(kObjectCompartmentF, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
3096 
3097 			setCallback(3);
3098 			setup_updateEntity(kCarRestaurant, kPosition_850);
3099 			break;
3100 
3101 		case 3:
3102 			setCallback(4);
3103 			setup_callbackActionRestaurantOrSalon();
3104 			break;
3105 
3106 		case 4:
3107 			getData()->entityPosition = kPosition_1540;
3108 			getData()->location = kLocationOutsideCompartment;
3109 
3110 			setCallback(5);
3111 			setup_draw("802US");
3112 			break;
3113 
3114 		case 5:
3115 			getEntities()->drawSequenceRight(kEntityAnna, "802UD");
3116 			if (getEntities()->isInSalon(kEntityPlayer))
3117 				getEntities()->updateFrame(kEntityAnna);
3118 
3119 			setCallback(6);
3120 			setup_callbackActionOnDirection();
3121 			break;
3122 
3123 		case 6:
3124 			getEntities()->clearSequences(kEntityAnna);
3125 			setup_function62();
3126 			break;
3127 		}
3128 		break;
3129 	}
3130 IMPLEMENT_FUNCTION_END
3131 
3132 //////////////////////////////////////////////////////////////////////////
3133 IMPLEMENT_FUNCTION(62, Anna, function62)
3134 	switch (savepoint.action) {
3135 	default:
3136 		break;
3137 
3138 	case kActionNone:
3139 		if (params->param1 && getState()->time > kTime2259000 && !params->param2) {
3140 			params->param2 = 1;
3141 			getSavePoints()->push(kEntityAnna, kEntityVesna, kAction189299008);
3142 			setup_deadBaggageCompartment();
3143 		}
3144 		break;
3145 
3146 	case kActionDefault:
3147 		getData()->car = kCarBaggage;
3148 		getProgress().field_54 = 1;
3149 		break;
3150 
3151 	case kAction235856512:
3152 		params->param1 = 1;
3153 		break;
3154 	}
3155 IMPLEMENT_FUNCTION_END
3156 
3157 //////////////////////////////////////////////////////////////////////////
3158 IMPLEMENT_FUNCTION(63, Anna, deadBaggageCompartment)
3159 	switch (savepoint.action) {
3160 	default:
3161 		break;
3162 
3163 	case kActionDefault:
3164 		getSavePoints()->push(kEntityAnna, kEntityChapters, kAction171843264);
3165 		break;
3166 
3167 	// Game over with Anna killed!
3168 	case kActionCallback:
3169 		if (getCallback() == 1) {
3170 			getAction()->playAnimation(kEventAnnaKilled);
3171 			getLogic()->gameOver(kSavegameTypeTime, kTime2250000, kSceneGameOverAnnaDied, true);
3172 		}
3173 		break;
3174 
3175 	// Anna will get killed...
3176 	case kAction272177921:
3177 		if (getSoundQueue()->isBuffered("MUS012"))
3178 			getSoundQueue()->fade("MUS012");
3179 
3180 		setCallback(1);
3181 		setup_savegame(kSavegameTypeEvent, kEventAnnaKilled);
3182 		break;
3183 	}
3184 IMPLEMENT_FUNCTION_END
3185 
3186 //////////////////////////////////////////////////////////////////////////
3187 IMPLEMENT_FUNCTION(64, Anna, baggageFight)
3188 	switch (savepoint.action) {
3189 	default:
3190 		break;
3191 
3192 	case kActionDefault:
3193 		getEntities()->clearSequences(kEntityAnna);
3194 
3195 		setCallback(1);
3196 		setup_savegame(kSavegameTypeEvent, kEventAnnaBaggageArgument);
3197 		break;
3198 
3199 	case kActionCallback:
3200 		switch (getCallback()) {
3201 		default:
3202 			break;
3203 
3204 		case 1:
3205 			getAction()->playAnimation(kEventAnnaBaggageArgument);
3206 
3207 			setCallback(2);
3208 			setup_savegame(kSavegameTypeTime, (EventIndex)kTimeNone);
3209 			break;
3210 
3211 		case 2:
3212 			params->param1 = getFight()->setup(kFightAnna);
3213 
3214 			if (params->param1)
3215 				getLogic()->gameOver(kSavegameTypeIndex, 0, kSceneNone, params->param1 == Fight::kFightEndLost);
3216 			else {
3217 				getState()->time = (TimeValue)(getState()->time + 1800);
3218 
3219 				setCallback(3);
3220 				setup_savegame(kSavegameTypeEvent, kEventAnnaBagagePart2);
3221 			}
3222 			break;
3223 
3224 		case 3:
3225 			getAction()->playAnimation(kEventAnnaBagagePart2);
3226 			getScenes()->loadSceneFromPosition(kCarBaggage, 96);
3227 
3228 			getProgress().field_54 = 0;
3229 			RESET_ENTITY_STATE(kEntityVesna, Vesna, setup_inCompartment);
3230 			getState()->time = kTime2266200;
3231 
3232 			setup_prepareVienna();
3233 			break;
3234 		}
3235 		break;
3236 	}
3237 IMPLEMENT_FUNCTION_END
3238 
3239 //////////////////////////////////////////////////////////////////////////
3240 IMPLEMENT_FUNCTION(65, Anna, prepareVienna)
3241 	if (savepoint.action == kActionDefault) {
3242 		getData()->entityPosition = kPosition_4070;
3243 		getData()->location = kLocationInsideCompartment;
3244 		getData()->car = kCarRedSleeping;
3245 		getData()->clothes = kClothes3;
3246 		getData()->inventoryItem = kItemNone;
3247 
3248 		getObjects()->update(kObjectOutsideAnnaCompartment, kEntityPlayer, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
3249 
3250 		setCallback(1);
3251 		setup_compartmentLogic(kTimeEnd, "NONE");
3252 	}
3253 IMPLEMENT_FUNCTION_END
3254 
3255 //////////////////////////////////////////////////////////////////////////
3256 IMPLEMENT_FUNCTION(66, Anna, chapter4)
3257 	switch (savepoint.action) {
3258 	default:
3259 		break;
3260 
3261 	case kActionNone:
3262 		setup_reading();
3263 		break;
3264 
3265 	case kActionDefault:
3266 		getEntities()->clearSequences(kEntityAnna);
3267 
3268 		getData()->entityPosition = kPosition_4070;
3269 		getData()->location = kLocationInsideCompartment;
3270 		getData()->car = kCarRedSleeping;
3271 		getData()->clothes = kClothes2;
3272 		getData()->inventoryItem = kItemNone;
3273 
3274 		break;
3275 	}
3276 IMPLEMENT_FUNCTION_END
3277 
3278 //////////////////////////////////////////////////////////////////////////
3279 IMPLEMENT_FUNCTION(67, Anna, reading)
3280 	switch (savepoint.action) {
3281 	default:
3282 		break;
3283 
3284 	case kActionNone:
3285 		if (getEntities()->isPlayerPosition(kCarRedSleeping, 46)) {
3286 			if (!Entity::updateParameter(params->param4, getState()->timeTicks, 30))
3287 				goto label_next;
3288 
3289 			getScenes()->loadSceneFromPosition(kCarRedSleeping, 8);
3290 		}
3291 
3292 		params->param4 = 0;
3293 
3294 label_next:
3295 		if (params->param1) {
3296 			if (!Entity::updateParameter(params->param5, getState()->timeTicks, 75))
3297 				break;
3298 
3299 			params->param1 = 0;
3300 			params->param2 = 1;
3301 
3302 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorNormal, getEntities()->isInsideCompartment(kEntityMax, kCarRedSleeping, kPosition_4070) ? kCursorHand : kCursorNormal);
3303 		}
3304 
3305 		params->param5 = 0;
3306 		break;
3307 
3308 	case kAction1:
3309 		getData()->inventoryItem = kItemNone;
3310 		getEntityData(kEntityPlayer)->location = kLocationInsideCompartment;
3311 
3312 		setCallback(1);
3313 		setup_savegame(kSavegameTypeEvent, kEventAnnaConversation_34);
3314 		break;
3315 
3316 	case kActionKnock:
3317 	case kActionOpenDoor:
3318 		getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorNormal, kCursorNormal);
3319 
3320 		if (params->param1) {
3321 			setCallback(5);
3322 			setup_playSound(getSound()->justAMinuteCath());
3323 		} else {
3324 			setCallback(savepoint.action == kActionKnock ? 2 : 3);
3325 			setup_playSound(savepoint.action == kActionKnock ? "LIB012" : "LIB013");
3326 		}
3327 		break;
3328 
3329 	case kActionDefault:
3330 		getObjects()->update(kObjectCompartmentF, kEntityPlayer, kObjectLocation2, kCursorNormal, kCursorNormal);
3331 		getObjects()->update(kObjectOutsideAnnaCompartment, kEntityPlayer, kObjectLocation1, kCursorKeepValue, kCursorKeepValue);
3332 		getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
3333 		getEntities()->drawSequenceLeft(kEntityAnna, "511B");
3334 		break;
3335 
3336 	case kActionDrawScene:
3337 		if (params->param1 || params->param2) {
3338 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
3339 			params->param1 = 0;
3340 			params->param2 = 0;
3341 		}
3342 		break;
3343 
3344 	case kActionCallback:
3345 		switch (getCallback()) {
3346 		default:
3347 			break;
3348 
3349 		case 1:
3350 			getAction()->playAnimation(kEventAnnaConversation_34);
3351 			getSound()->playSound(kEntityPlayer, "LIB015");
3352 			getScenes()->loadSceneFromPosition(kCarRedSleeping, 8);
3353 
3354 			setup_sulking();
3355 			break;
3356 
3357 		case 2:
3358 		case 3:
3359 			setCallback(4);
3360 			setup_playSound("ANN1016");
3361 			break;
3362 
3363 		case 4:
3364 			getObjects()->update(kObject53, kEntityAnna, kObjectLocation1, kCursorTalk, kCursorNormal);
3365 			params->param1 = 1;
3366 			break;
3367 
3368 		case 5:
3369 			params->param1 = 0;
3370 			params->param2 = 1;
3371 			break;
3372 		}
3373 		break;
3374 
3375 	case kAction191001984:
3376 		getObjects()->update(kObjectCompartmentF, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
3377 		getData()->inventoryItem = kItemNone;
3378 
3379 		setup_goSalon4();
3380 		break;
3381 
3382 	case kAction219971920:
3383 		params->param3 = 1;
3384 		getData()->inventoryItem = kItemInvalid;
3385 	}
3386 IMPLEMENT_FUNCTION_END
3387 
3388 //////////////////////////////////////////////////////////////////////////
3389 IMPLEMENT_FUNCTION(68, Anna, sulking)
3390 	switch (savepoint.action) {
3391 	default:
3392 		break;
3393 
3394 	case kActionNone:
3395 		if (!params->param1) {
3396 			setCallback(1);
3397 			setup_compartmentLogic(kTime2511900, "NONE");
3398 		}
3399 		break;
3400 
3401 	case kActionDefault:
3402 		getObjects()->update(kObjectCompartmentF, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
3403 		getObjects()->update(kObject53, kEntityPlayer, kObjectLocation1, kCursorHandKnock, kCursorHand);
3404 
3405 		getData()->car = kCarRedSleeping;
3406 		getData()->entityPosition = kPosition_4070;
3407 		getData()->location = kLocationInsideCompartment;
3408 		break;
3409 
3410 	case kAction191001984:
3411 		getObjects()->update(kObjectCompartmentF, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
3412 		setup_goSalon4();
3413 		break;
3414 
3415 	case kAction201431954:
3416 		params->param1 = 1;
3417 		break;
3418 	}
3419 IMPLEMENT_FUNCTION_END
3420 
3421 //////////////////////////////////////////////////////////////////////////
3422 IMPLEMENT_FUNCTION(69, Anna, goSalon4)
3423 	switch (savepoint.action) {
3424 	default:
3425 		break;
3426 
3427 	case kActionNone:
3428 		if (params->param1) {
3429 			if (!Entity::updateParameter(params->param2, getState()->time, 4500))
3430 				break;
3431 
3432 			getData()->car = kCarRedSleeping;
3433 			getData()->entityPosition = kPosition_9270;
3434 			getData()->location = kLocationOutsideCompartment;
3435 
3436 			setup_returnCompartment4();
3437 			break;
3438 		}
3439 
3440 		Entity::timeCheckCallback(kTime2535300, params->param3, 4, WRAP_SETUP_FUNCTION(Anna, setup_callbackActionRestaurantOrSalon));
3441 		break;
3442 
3443 	case kActionDefault:
3444 		getData()->car = kCarRedSleeping;
3445 		getData()->entityPosition = kPosition_4070;
3446 		getData()->location = kLocationOutsideCompartment;
3447 
3448 		setCallback(1);
3449 		setup_updateEntity(kCarRestaurant, kPosition_850);
3450 		break;
3451 
3452 	case kActionDrawScene:
3453 		if (params->param1 && getEntities()->isInsideTrainCar(kEntityPlayer, kCarRedSleeping)) {
3454 			getData()->car = kCarRedSleeping;
3455 			getData()->entityPosition = kPosition_8200;
3456 			getData()->location = kLocationOutsideCompartment;
3457 
3458 			setup_returnCompartment4();
3459 		}
3460 		break;
3461 
3462 	case kActionCallback:
3463 		switch (getCallback()) {
3464 		default:
3465 			break;
3466 
3467 		case 1:
3468 			setCallback(2);
3469 			setup_callbackActionRestaurantOrSalon();
3470 			break;
3471 
3472 		case 2:
3473 			getData()->entityPosition = kPosition_1540;
3474 			getData()->location = kLocationOutsideCompartment;
3475 
3476 			setCallback(3);
3477 			setup_updatePosition("127A", kCarRestaurant, 56);
3478 			break;
3479 
3480 		case 3:
3481 			getData()->location = kLocationInsideCompartment;
3482 			getEntities()->drawSequenceLeft(kEntityAnna, "127B");
3483 			getSavePoints()->push(kEntityAnna, kEntityWaiter2, kAction258136010);
3484 			break;
3485 
3486 		case 4:
3487 			getData()->location = kLocationOutsideCompartment;
3488 
3489 			setCallback(5);
3490 			setup_updatePosition("127G", kCarRestaurant, 56);
3491 			break;
3492 
3493 		case 5:
3494 			setup_returnCompartment4();
3495 			break;
3496 		}
3497 		break;
3498 
3499 	case kAction100969180:
3500 		getEntities()->clearSequences(kEntityAnna);
3501 		params->param1 = 1;
3502 		break;
3503 
3504 	case kAction122288808:
3505 		getEntities()->drawSequenceLeft(kEntityAnna, "127E");
3506 		getSavePoints()->push(kEntityAnna, kEntityAbbot, kAction203073664);
3507 		break;
3508 
3509 	case kAction122358304:
3510 		getEntities()->drawSequenceLeft(kEntityAnna, "BLANK");
3511 		break;
3512 	}
3513 IMPLEMENT_FUNCTION_END
3514 
3515 //////////////////////////////////////////////////////////////////////////
3516 IMPLEMENT_FUNCTION(70, Anna, returnCompartment4)
3517 	switch (savepoint.action) {
3518 	default:
3519 		break;
3520 
3521 	case kActionDefault:
3522 		setCallback(1);
3523 		setup_doWalkCathFollowsAnna(kCarRedSleeping, kPosition_4070);
3524 		break;
3525 
3526 	case kActionCallback:
3527 		switch (getCallback()) {
3528 		default:
3529 			break;
3530 
3531 		case 1:
3532 			setCallback(2);
3533 			setup_enterCompartmentCathFollowsAnna();
3534 			break;
3535 
3536 		case 2:
3537 			getData()->location = kLocationOutsideCompartment;
3538 			getEntities()->clearSequences(kEntityAnna);
3539 			setup_letDownHair();
3540 			break;
3541 		}
3542 		break;
3543 	}
3544 IMPLEMENT_FUNCTION_END
3545 
3546 //////////////////////////////////////////////////////////////////////////
3547 IMPLEMENT_FUNCTION(71, Anna, enterCompartmentCathFollowsAnna)
3548 	switch (savepoint.action) {
3549 	default:
3550 		break;
3551 
3552 	case kActionExitCompartment:
3553 		getEntities()->exitCompartment(kEntityAnna, kObjectCompartmentF);
3554 		getData()->entityPosition = kPosition_4070;
3555 
3556 		callbackAction();
3557 		break;
3558 
3559 	case kActionDefault:
3560 		getEntities()->drawSequenceRight(kEntityAnna, "625Af");
3561 
3562 		if (getEntities()->isPlayerPosition(kCarRedSleeping, 7)
3563 		 || getEntities()->isPlayerPosition(kCarRedSleeping, 28)
3564 		 || getEntities()->isPlayerPosition(kCarRedSleeping, 56))
3565 			getScenes()->loadScene(getScenes()->processIndex(getState()->scene));
3566 
3567 		getEntities()->enterCompartment(kEntityAnna, kObjectCompartmentF);
3568 
3569 		getData()->location = kLocationInsideCompartment;
3570 
3571 		if (getEntities()->isInsideCompartment(kEntityPlayer, kCarRedSleeping, kPosition_4070)
3572 		 || getEntities()->isInsideCompartment(kEntityPlayer, kCarRedSleeping, kPosition_4455)) {
3573 			getAction()->playAnimation(isNight() ? kEventCathTurningNight : kEventCathTurningDay);
3574 			getSound()->playSound(kEntityPlayer, "BUMP");
3575 			getScenes()->loadSceneFromObject(kObjectCompartmentF, true);
3576 		}
3577 		break;
3578 
3579 	case kActionDrawScene:
3580 		if (!getEvent(kEventAnnaTiredKiss)
3581 		 && getEntities()->isDistanceBetweenEntities(kEntityPlayer, kEntityAnna, 2000)
3582 		 && getEntities()->hasValidFrame(kEntityAnna)
3583 		 && getData()->entityPosition < getEntityData(kEntityPlayer)->entityPosition) {
3584 			setCallback(1);
3585 			setup_savegame(kSavegameTypeEvent, kEventAnnaTiredKiss);
3586 		}
3587 		break;
3588 
3589 	case kActionCallback:
3590 		if (getCallback() == 1) {
3591 			getAction()->playAnimation(kEventAnnaTiredKiss);
3592 			getScenes()->loadSceneFromPosition(kCarRestaurant, 29);
3593 		}
3594 		break;
3595 	}
3596 IMPLEMENT_FUNCTION_END
3597 
3598 //////////////////////////////////////////////////////////////////////////
3599 IMPLEMENT_FUNCTION_II(72, Anna, doWalkCathFollowsAnna, CarIndex, EntityPosition)
3600 	switch (savepoint.action) {
3601 	default:
3602 		break;
3603 
3604 	case kActionNone:
3605 		if (getEvent(kEventAnnaTired) || getEntities()->isWalkingOppositeToPlayer(kEntityAnna))
3606 			getData()->inventoryItem = kItemNone;
3607 		else
3608 			getData()->inventoryItem = kItemInvalid;
3609 
3610 		if (getEntities()->updateEntity(kEntityAnna, (CarIndex)params->param1, (EntityPosition)params->param2)) {
3611 			getData()->inventoryItem = kItemNone;
3612 			callbackAction();
3613 		}
3614 		break;
3615 
3616 	case kAction1:
3617 		getData()->inventoryItem = kItemNone;
3618 
3619 		setCallback(1);
3620 		setup_savegame(kSavegameTypeEvent, kEventAnnaTired);
3621 		break;
3622 
3623 	case kActionDefault:
3624 		if (getEntities()->updateEntity(kEntityAnna, (CarIndex)params->param1, (EntityPosition)params->param2)) {
3625 			callbackAction();
3626 		} else if (!getEvent(kEventAnnaTired))
3627 			getData()->inventoryItem = kItemInvalid;
3628 		break;
3629 
3630 	case kActionCallback:
3631 		if (getCallback() == 1) {
3632 			getAction()->playAnimation(kEventAnnaTired);
3633 
3634 			getEntities()->loadSceneFromEntityPosition(getData()->car, (EntityPosition)(getData()->entityPosition + (750 * (getData()->direction == kDirectionUp ? -1 : 1))), getData()->direction == kDirectionUp);
3635 		}
3636 		break;
3637 	}
3638 IMPLEMENT_FUNCTION_END
3639 
3640 //////////////////////////////////////////////////////////////////////////
3641 IMPLEMENT_FUNCTION(73, Anna, letDownHair)
3642 	switch (savepoint.action) {
3643 	default:
3644 		break;
3645 
3646 	case kActionNone:
3647 		if (params->param3 == kTimeInvalid || params->param1 >= getState()->time)
3648 			break;
3649 
3650 		if (params->param2 >= getState()->time) {
3651 			if (!((getEntities()->isPlayerInCar(kCarGreenSleeping) || getEntities()->isPlayerInCar(kCarRedSleeping)) && params->param3))
3652 				params->param3 = (uint)getState()->time;
3653 
3654 			if (params->param3 >= getState()->time)
3655 				break;
3656 		}
3657 
3658 		params->param3 = kTimeInvalid;
3659 
3660 		if (!getEntities()->isPlayerInCar(kCarGreenSleeping) && !getEntities()->isPlayerInCar(kCarRedSleeping))
3661 			getSound()->playSound(kEntityPlayer, "BUMP");
3662 
3663 		setCallback(1);
3664 		setup_savegame(kSavegameTypeEvent, kEventTrainHijacked);
3665 		break;
3666 
3667 	case kActionKnock:
3668 		getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocationNone, kCursorNormal, kCursorNormal);
3669 
3670 		setCallback(2);
3671 		setup_playSound("LIB012");
3672 		break;
3673 
3674 	case kActionOpenDoor:
3675 		setCallback(4);
3676 		setup_savegame(kSavegameTypeEvent, kEventAnnaKissTrainHijacked);
3677 		break;
3678 
3679 	case kActionDefault:
3680 		getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocationNone, kCursorHandKnock, kCursorHand);
3681 		getState()->timeDelta = 1;
3682 
3683 		params->param1 = (uint)(getState()->time + 4500);
3684 		params->param2 = (uint)(getState()->time + 9000);
3685 		break;
3686 
3687 	case kActionCallback:
3688 		switch (getCallback()) {
3689 		default:
3690 			break;
3691 
3692 		case 1:
3693 			getAction()->playAnimation(kEventTrainHijacked);
3694 			getSavePoints()->push(kEntityAnna, kEntityChapters, kAction139254416);
3695 			break;
3696 
3697 		case 2:
3698 			setCallback(3);
3699 			setup_playSound("Ann4200");
3700 			break;
3701 
3702 		case 3:
3703 			getObjects()->update(kObjectCompartmentF, kEntityAnna, kObjectLocationNone, kCursorHandKnock, kCursorHand);
3704 			break;
3705 
3706 		case 4:
3707 			getAction()->playAnimation(kEventAnnaKissTrainHijacked);
3708 			getSavePoints()->push(kEntityAnna, kEntityChapters, kAction139254416);
3709 			break;
3710 		}
3711 		break;
3712 	}
3713 IMPLEMENT_FUNCTION_END
3714 
3715 //////////////////////////////////////////////////////////////////////////
3716 IMPLEMENT_FUNCTION(74, Anna, chapter5)
3717 	switch (savepoint.action) {
3718 	default:
3719 		break;
3720 
3721 	case kActionNone:
3722 		setup_tiedUp();
3723 		break;
3724 
3725 	case kActionDefault:
3726 		getEntities()->clearSequences(kEntityAnna);
3727 
3728 		getData()->entityPosition = kPosition_3969;
3729 		getData()->location = kLocationInsideCompartment;
3730 		getData()->car = kCarBaggageRear;
3731 		getData()->clothes = kClothes3;
3732 		getData()->inventoryItem = kItemNone;
3733 
3734 		getObjects()->update(kObjectOutsideAnnaCompartment, kEntityPlayer, kObjectLocationNone, kCursorKeepValue, kCursorKeepValue);
3735 
3736 		break;
3737 	}
3738 IMPLEMENT_FUNCTION_END
3739 
3740 //////////////////////////////////////////////////////////////////////////
3741 IMPLEMENT_FUNCTION(75, Anna, tiedUp)
3742 	switch (savepoint.action) {
3743 	default:
3744 		break;
3745 
3746 	case kActionCallback:
3747 		if (getCallback() == 1) {
3748 			if (getProgress().field_C)
3749 				getAction()->playAnimation(getEvent(kEventAnnaKissTrainHijacked) ? kEventAnnaBaggageTies2 : kEventAnnaBaggageTies);
3750 			else
3751 				getAction()->playAnimation(getEvent(kEventAnnaKissTrainHijacked) ? kEventAnnaBaggageTies3 : kEventAnnaBaggageTies4);
3752 
3753 			getScenes()->loadSceneFromPosition(kCarBaggageRear, 88);
3754 			setup_function76();
3755 		}
3756 		break;
3757 
3758 	case kAction272177921:
3759 		setCallback(1);
3760 		setup_savegame(kSavegameTypeEvent, kEventAnnaBaggageTies);
3761 		break;
3762 	}
3763 IMPLEMENT_FUNCTION_END
3764 
3765 //////////////////////////////////////////////////////////////////////////
3766 IMPLEMENT_FUNCTION(76, Anna, function76)
3767 	if (savepoint.action == kAction158480160)
3768 		setup_readyToScore();
3769 IMPLEMENT_FUNCTION_END
3770 
3771 //////////////////////////////////////////////////////////////////////////
3772 IMPLEMENT_FUNCTION(77, Anna, readyToScore)
3773 	switch (savepoint.action) {
3774 	default:
3775 		break;
3776 
3777 	case kActionNone:
3778 		if (getState()->time > kTime3645000 && !params->param2) {
3779 			params->param2 = 1;
3780 			getState()->timeDelta = 0;
3781 		}
3782 		break;
3783 
3784 	case kActionKnock:
3785 	case kActionOpenDoor:
3786 		getSound()->playSound(kEntityPlayer, savepoint.action == kActionKnock ? "LIB012" : "LIB014");
3787 
3788 		setCallback(2);
3789 		setup_savegame(kSavegameTypeEvent, kEventAnnaDialogGoToJerusalem);
3790 		break;
3791 
3792 	case kActionDefault:
3793 		getObjects()->update(kObject106, kEntityAnna, kObjectLocation1, kCursorHandKnock, kCursorHand);
3794 		break;
3795 
3796 	case kActionDrawScene:
3797 		if (!params->param1 && getEntities()->isInsideTrainCar(kEntityPlayer, kCarBaggage)) {
3798 			setCallback(1);
3799 			setup_savegame(kSavegameTypeTime, kTimeNone);
3800 		}
3801 		break;
3802 
3803 	case kActionCallback:
3804 		switch (getCallback()) {
3805 		default:
3806 			break;
3807 
3808 		case 1:
3809 			params->param1 = 1;
3810 			break;
3811 
3812 		case 2:
3813 			getObjects()->update(kObject106, kEntityPlayer, kObjectLocationNone, kCursorHandKnock, kCursorHand);
3814 			getAction()->playAnimation(kEventAnnaDialogGoToJerusalem);
3815 
3816 			getState()->time = kTime4914000;
3817 			getState()->timeDelta = 0;
3818 
3819 			getSavePoints()->push(kEntityAnna, kEntityTatiana, kAction236060709);
3820 
3821 			getScenes()->loadSceneFromPosition(kCarBaggage, 97, 1);
3822 
3823 			setCallback(3);
3824 			setup_savegame(kSavegameTypeTime, kTimeNone);
3825 			break;
3826 
3827 		case 3:
3828 			setup_kidnapped();
3829 			break;
3830 		}
3831 		break;
3832 	}
3833 IMPLEMENT_FUNCTION_END
3834 
3835 //////////////////////////////////////////////////////////////////////////
3836 IMPLEMENT_FUNCTION(78, Anna, kidnapped)
3837 	switch (savepoint.action) {
3838 	default:
3839 		break;
3840 
3841 	case kActionDrawScene:
3842 		if ((getEntities()->isInRestaurant(kEntityPlayer) || getEntities()->isInSalon(kEntityPlayer)) && getInventory()->hasItem(kItemFirebird)) {
3843 			setup_finalSequence();
3844 			break;
3845 		}
3846 
3847 		if (getEntities()->isInSalon(kEntityPlayer)) {
3848 			getState()->time = kTime4920300;
3849 
3850 			setCallback(getInventory()->get(kItemFirebird)->location == kObjectLocation4 ? 2 : 1);
3851 			setup_savegame(kSavegameTypeEvent, getInventory()->get(kItemFirebird)->location == kObjectLocation4 ? kEventKronosHostageAnna : kEventKronosHostageAnnaNoFirebird);
3852 		}
3853 		break;
3854 
3855 	case kActionCallback:
3856 		switch (getCallback()) {
3857 		default:
3858 			break;
3859 
3860 		case 1:
3861 			getAction()->playAnimation(kEventKronosHostageAnnaNoFirebird);
3862 			getLogic()->gameOver(kSavegameTypeEvent2, kEventAugustUnhookCarsBetrayal, kSceneNone, true);
3863 			break;
3864 
3865 		case 2:
3866 			getAction()->playAnimation(kEventKronosHostageAnna);
3867 			getScenes()->loadSceneFromPosition(kCarRestaurant, 61, 1);
3868 			getSound()->playSound(kEntityAnna, "Mus024", kVolumeFull);
3869 			setup_waiting();
3870 			break;
3871 		}
3872 		break;
3873 	}
3874 IMPLEMENT_FUNCTION_END
3875 
3876 //////////////////////////////////////////////////////////////////////////
3877 IMPLEMENT_FUNCTION(79, Anna, waiting)
3878 	switch (savepoint.action) {
3879 	default:
3880 		break;
3881 
3882 	case kActionEndSound:
3883 		getState()->time = kTime4923000;
3884 		setCallback(1);
3885 		setup_savegame(kSavegameTypeEvent, kEventKahinaPunchBaggageCarEntrance);
3886 		break;
3887 
3888 	case kActionDrawScene:
3889 		if (getEntities()->isInRestaurant(kEntityPlayer) && getInventory()->hasItem(kItemFirebird)) {
3890 			setup_finalSequence();
3891 			break;
3892 		}
3893 
3894 		if (getEntities()->isInSalon(kEntityPlayer) && !getEvent(kEventKahinaPunch)) {
3895 			getState()->time = kTime4923000;
3896 			setCallback(2);
3897 			setup_savegame(kSavegameTypeEvent, kEventKahinaPunch);
3898 		}
3899 		break;
3900 
3901 	case kActionCallback:
3902 		switch (getCallback()) {
3903 		default:
3904 			break;
3905 
3906 		case 1:
3907 			if (getEntities()->isInSalon(kEntityPlayer))
3908 				getAction()->playAnimation(kEventKahinaPunchSalon);
3909 			else if (getEntities()->isInRestaurant(kEntityPlayer))
3910 				getAction()->playAnimation(kEventKahinaPunchRestaurant);
3911 			else if (getEntities()->isInKitchen(kEntityPlayer))
3912 				getAction()->playAnimation(kEventKahinaPunchKitchen);
3913 			else if (getEntities()->isInBaggageCarEntrance(kEntityPlayer))
3914 				getAction()->playAnimation(kEventKahinaPunchBaggageCarEntrance);
3915 			else if (getEntities()->isInsideTrainCar(kEntityPlayer, kCarBaggage))
3916 				getAction()->playAnimation(kEventKahinaPunchBaggageCar);
3917 			break;
3918 
3919 		case 2:
3920 			getAction()->playAnimation(kEventKahinaPunch);
3921 			break;
3922 		}
3923 
3924 		getLogic()->gameOver(kSavegameTypeIndex, 1, kSceneNone, true);
3925 		break;
3926 	}
3927 IMPLEMENT_FUNCTION_END
3928 
3929 //////////////////////////////////////////////////////////////////////////
3930 IMPLEMENT_FUNCTION(80, Anna, finalSequence)
3931 	switch (savepoint.action) {
3932 	default:
3933 		break;
3934 
3935 	case kActionNone:
3936 		if (!Entity::updateParameter(params->param1, getState()->timeTicks, 450))
3937 			break;
3938 
3939 		getSound()->playSound(kEntityPlayer, "Kro5001", kVolumeFull);
3940 		break;
3941 
3942 	case kActionEndSound:
3943 		getSound()->playSound(kEntityPlayer, "Kro5002", kVolumeFull);
3944 		getState()->time = kTime4929300;
3945 
3946 		setCallback(2);
3947 		setup_savegame(kSavegameTypeEvent, kEventKahinaPunch);
3948 		break;
3949 
3950 	case kActionDefault:
3951 		getState()->time = kTime4923000;
3952 
3953 		setCallback(1);
3954 		setup_savegame(kSavegameTypeEvent, kEventKronosBringFirebird);
3955 		break;
3956 
3957 	case kActionCallback:
3958 		switch (getCallback()) {
3959 		default:
3960 			break;
3961 
3962 		case 1:
3963 			if (getSoundQueue()->isBuffered(kEntityAnna))
3964 				getSoundQueue()->fade(kEntityAnna);
3965 
3966 			getAction()->playAnimation(kEventKronosBringFirebird);
3967 			getScenes()->loadSceneFromItem(kItemFirebird);
3968 			getSound()->playSound(kEntityAnna, "Mus025", kVolumeFull);
3969 			break;
3970 
3971 		case 2:
3972 			getAction()->playAnimation(kEventKahinaPunch);
3973 			getLogic()->gameOver(kSavegameTypeIndex, 1, kSceneNone, true);
3974 			break;
3975 
3976 		case 3:
3977 			getProgress().isEggOpen = true;
3978 
3979 			if (getSoundQueue()->isBuffered(kEntityAnna))
3980 				getSoundQueue()->fade(kEntityAnna);
3981 
3982 			getAction()->playAnimation(kEventKronosOpenFirebird);
3983 			getScenes()->loadSceneFromPosition(kCarRestaurant, 3);
3984 
3985 			setup_openFirebird();
3986 			break;
3987 		}
3988 		break;
3989 
3990 	case kAction205294778:
3991 		getState()->time = kTime4929300;
3992 
3993 		setCallback(3);
3994 		setup_savegame(kSavegameTypeEvent, kEventKronosOpenFirebird);
3995 		break;
3996 	}
3997 IMPLEMENT_FUNCTION_END
3998 
3999 //////////////////////////////////////////////////////////////////////////
4000 IMPLEMENT_FUNCTION(81, Anna, openFirebird)
4001 	switch (savepoint.action) {
4002 	default:
4003 		break;
4004 
4005 	case kActionNone:
4006 		if (!Entity::updateParameter(params->param1, getState()->timeTicks, 180))
4007 			break;
4008 
4009 		getSound()->playSound(kEntityTrain, "LIB069", kVolumeFull);
4010 		getLogic()->gameOver(kSavegameTypeIndex, 0, kSceneNone, true);
4011 		break;
4012 
4013 	case kActionCallback:
4014 		switch (getCallback()) {
4015 		default:
4016 			break;
4017 
4018 		case 1:
4019 			getAction()->playAnimation(kEventCathCloseEggNoBackground);
4020 			getAction()->playAnimation(kEventKronosGiveFirebird);
4021 
4022 			if (getInventory()->hasItem(kItemWhistle))
4023 				getLogic()->gameOver(kSavegameTypeIndex, 1, kSceneGameOverTrainExplosion, true);
4024 			else if (getInventory()->get(kItemWhistle)->location == kObjectLocation1)
4025 				getLogic()->gameOver(kSavegameTypeEvent2, kEventAnnaDialogGoToJerusalem, kSceneNone, true);
4026 			else
4027 				getLogic()->gameOver(kSavegameTypeEvent2, kEventAugustUnhookCarsBetrayal, kSceneGameOverTrainExplosion2, true);
4028 			break;
4029 
4030 		case 2:
4031 			getInventory()->removeItem(kItemWhistle);
4032 			getLogic()->playFinalSequence();
4033 			break;
4034 		}
4035 		break;
4036 
4037 	case kAction224309120:
4038 		getProgress().isEggOpen = false;
4039 		getState()->time = kTimeCityConstantinople;
4040 
4041 		setCallback(1);
4042 		setup_savegame(kSavegameTypeEvent, kEventKronosGiveFirebird);
4043 		break;
4044 
4045 	case kActionUseWhistle:
4046 		getProgress().isEggOpen = false;
4047 		setGlobalTimer(0);
4048 		getState()->time = kTimeCityConstantinople;
4049 
4050 		setCallback(2);
4051 		setup_savegame(kSavegameTypeEvent, kEventFinalSequence);
4052 		break;
4053 	}
4054 IMPLEMENT_FUNCTION_END
4055 
4056 } // End of namespace LastExpress
4057