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