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/waiter2.h"
24
25 #include "lastexpress/game/entities.h"
26 #include "lastexpress/game/logic.h"
27 #include "lastexpress/game/object.h"
28 #include "lastexpress/game/savepoint.h"
29 #include "lastexpress/game/state.h"
30
31 #include "lastexpress/lastexpress.h"
32
33 namespace LastExpress {
34
Waiter2(LastExpressEngine * engine)35 Waiter2::Waiter2(LastExpressEngine *engine) : Entity(engine, kEntityWaiter2) {
36 ADD_CALLBACK_FUNCTION_I(Waiter2, updateFromTime);
37 ADD_CALLBACK_FUNCTION_S(Waiter2, draw);
38 ADD_CALLBACK_FUNCTION_SII(Waiter2, updatePosition);
39 ADD_CALLBACK_FUNCTION(Waiter2, callbackActionOnDirection);
40 ADD_CALLBACK_FUNCTION_SIIS(Waiter2, callSavepoint);
41 ADD_CALLBACK_FUNCTION_S(Waiter2, playSound);
42 ADD_CALLBACK_FUNCTION(Waiter2, monsieurServeUs);
43 ADD_CALLBACK_FUNCTION(Waiter2, chapter1);
44 ADD_CALLBACK_FUNCTION(Waiter2, milosOrder);
45 ADD_CALLBACK_FUNCTION(Waiter2, monsieurOrder);
46 ADD_CALLBACK_FUNCTION(Waiter2, clearAlexei);
47 ADD_CALLBACK_FUNCTION(Waiter2, clearMilos);
48 ADD_CALLBACK_FUNCTION(Waiter2, clearMonsieur);
49 ADD_CALLBACK_FUNCTION(Waiter2, servingDinner);
50 ADD_CALLBACK_FUNCTION(Waiter2, function15);
51 ADD_CALLBACK_FUNCTION(Waiter2, function16);
52 ADD_CALLBACK_FUNCTION(Waiter2, chapter2);
53 ADD_CALLBACK_FUNCTION(Waiter2, inKitchen);
54 ADD_CALLBACK_FUNCTION(Waiter2, tatianaClearTableB);
55 ADD_CALLBACK_FUNCTION(Waiter2, ivoComeHere);
56 ADD_CALLBACK_FUNCTION(Waiter2, ivoClearTableC);
57 ADD_CALLBACK_FUNCTION(Waiter2, chapter3);
58 ADD_CALLBACK_FUNCTION(Waiter2, serving3);
59 ADD_CALLBACK_FUNCTION(Waiter2, annaBringTea3);
60 ADD_CALLBACK_FUNCTION(Waiter2, chapter4);
61 ADD_CALLBACK_FUNCTION(Waiter2, serving4);
62 ADD_CALLBACK_FUNCTION(Waiter2, augustNeedsADrink);
63 ADD_CALLBACK_FUNCTION(Waiter2, serveAugustADrink);
64 ADD_CALLBACK_FUNCTION(Waiter2, annaNeedsADrink);
65 ADD_CALLBACK_FUNCTION(Waiter2, chapter5);
66 ADD_CALLBACK_FUNCTION(Waiter2, chapter5Handler);
67 ADD_NULL_FUNCTION()
68 }
69
70 //////////////////////////////////////////////////////////////////////////
71 IMPLEMENT_FUNCTION_NOSETUP(1, Waiter2, updateFromTime)
72 Entity::updateFromTime(savepoint);
73 IMPLEMENT_FUNCTION_END
74
75 //////////////////////////////////////////////////////////////////////////
76 IMPLEMENT_FUNCTION_S(2, Waiter2, draw)
77 Entity::draw(savepoint, true);
78 IMPLEMENT_FUNCTION_END
79
80 //////////////////////////////////////////////////////////////////////////
81 IMPLEMENT_FUNCTION_SII(3, Waiter2, updatePosition, CarIndex, Position)
82 Entity::updatePosition(savepoint, true);
83 IMPLEMENT_FUNCTION_END
84
85 //////////////////////////////////////////////////////////////////////////
86 IMPLEMENT_FUNCTION(4, Waiter2, callbackActionOnDirection)
87 if (savepoint.action == kActionExcuseMeCath) {
88 if (!params->param1) {
89 getSound()->excuseMe(kEntityWaiter2);
90 params->param1 = 1;
91 }
92 }
93
94 Entity::callbackActionOnDirection(savepoint);
95 IMPLEMENT_FUNCTION_END
96
97 //////////////////////////////////////////////////////////////////////////
98 IMPLEMENT_FUNCTION_SIIS(5, Waiter2, callSavepoint, EntityIndex, ActionIndex)
99 Entity::callSavepoint(savepoint, true);
100 IMPLEMENT_FUNCTION_END
101
102 //////////////////////////////////////////////////////////////////////////
103 IMPLEMENT_FUNCTION_S(6, Waiter2, playSound)
104 Entity::playSound(savepoint);
105 IMPLEMENT_FUNCTION_END
106
107 //////////////////////////////////////////////////////////////////////////
108 IMPLEMENT_FUNCTION(7, Waiter2, monsieurServeUs)
109 switch (savepoint.action) {
110 default:
111 break;
112
113 case kActionDefault:
114 getData()->entityPosition = kPosition_5800;
115 getData()->location = kLocationOutsideCompartment;
116
117 setCallback(1);
118 setup_draw("924");
119 break;
120
121 case kActionCallback:
122 switch (getCallback()) {
123 default:
124 break;
125
126 case 1:
127 getSavePoints()->push(kEntityWaiter2, kEntityBoutarel, kAction122358304);
128 setCallback(2);
129 setup_draw("008C");
130 break;
131
132 case 2:
133 getSavePoints()->push(kEntityWaiter2, kEntityBoutarel, kAction122288808);
134 setCallback(3);
135 setup_draw("926");
136 break;
137
138 case 3:
139 getEntities()->clearSequences(kEntityWaiter2);
140 getData()->entityPosition = kPosition_5900;
141 ENTITY_PARAM(1, 2) = 0;
142
143 callbackAction();
144 break;
145 }
146 break;
147 }
148 IMPLEMENT_FUNCTION_END
149
150 //////////////////////////////////////////////////////////////////////////
151 IMPLEMENT_FUNCTION(8, Waiter2, chapter1)
152 switch (savepoint.action) {
153 default:
154 break;
155
156 case kActionNone:
157 setup_servingDinner();
158 break;
159
160 case kActionDefault:
161 getSavePoints()->addData(kEntityWaiter2, kAction223002560, 0);
162 getSavePoints()->addData(kEntityWaiter2, kAction302996448, 2);
163 getSavePoints()->addData(kEntityWaiter2, kAction269485588, 3);
164 getSavePoints()->addData(kEntityWaiter2, kAction326144276, 4);
165 getSavePoints()->addData(kEntityWaiter2, kAction302203328, 5);
166 getSavePoints()->addData(kEntityWaiter2, kAction189688608, 6);
167 getSavePoints()->addData(kEntityWaiter2, kAction236237423, 7);
168 getSavePoints()->addData(kEntityWaiter2, kAction219377792, 8);
169 getSavePoints()->addData(kEntityWaiter2, kAction256200848, 9);
170 getSavePoints()->addData(kEntityWaiter2, kAction291721418, 10);
171 getSavePoints()->addData(kEntityWaiter2, kAction258136010, 11);
172
173 getData()->entityPosition = kPosition_5900;
174 getData()->location = kLocationOutsideCompartment;
175 getData()->car = kCarRestaurant;
176 break;
177 }
178 IMPLEMENT_FUNCTION_END
179
180 //////////////////////////////////////////////////////////////////////////
181 IMPLEMENT_FUNCTION(9, Waiter2, milosOrder)
182 switch (savepoint.action) {
183 default:
184 break;
185
186 case kActionDefault:
187 getData()->entityPosition = kPosition_5800;
188 getData()->location = kLocationOutsideCompartment;
189
190 setCallback(1);
191 setup_draw("924");
192 break;
193
194 case kActionCallback:
195 switch (getCallback()) {
196 default:
197 break;
198
199 case 1:
200 getEntities()->drawSequenceLeft(kEntityMilos, "BLANK");
201 getEntities()->drawSequenceLeft(kEntityWaiter2, "009B");
202
203 setCallback(2);
204 setup_playSound("WAT1001");
205 break;
206
207 case 2:
208 getEntities()->drawSequenceLeft(kEntityMilos, "009A");
209
210 setCallback(3);
211 setup_draw("926");
212 break;
213
214 case 3:
215 getEntities()->clearSequences(kEntityWaiter2);
216 getData()->entityPosition = kPosition_5900;
217 ENTITY_PARAM(0, 1) = 0;
218
219 callbackAction();
220 break;
221 }
222 break;
223 }
224 IMPLEMENT_FUNCTION_END
225
226 //////////////////////////////////////////////////////////////////////////
227 IMPLEMENT_FUNCTION(10, Waiter2, monsieurOrder)
228 switch (savepoint.action) {
229 default:
230 break;
231
232 case kActionDefault:
233 getData()->entityPosition = kPosition_5800;
234 getData()->location = kLocationOutsideCompartment;
235
236 setCallback(1);
237 setup_draw("924");
238 break;
239
240 case kActionCallback:
241 switch (getCallback()) {
242 default:
243 break;
244
245 case 1:
246 getEntities()->drawSequenceLeft(kEntityBoutarel, "BLANK");
247 getEntities()->drawSequenceLeft(kEntityWaiter2, "008C");
248
249 setCallback(2);
250 setup_playSound("MRB1077");
251 break;
252
253 case 2:
254 getSavePoints()->push(kEntityWaiter2, kEntityBoutarel, kAction168717392);
255
256 setCallback(3);
257 setup_draw("926");
258 break;
259
260 case 3:
261 getEntities()->clearSequences(kEntityWaiter2);
262 getData()->entityPosition = kPosition_5900;
263 ENTITY_PARAM(1, 2) = 0;
264
265 callbackAction();
266 break;
267 }
268 break;
269 }
270 IMPLEMENT_FUNCTION_END
271
272 //////////////////////////////////////////////////////////////////////////
273 IMPLEMENT_FUNCTION(11, Waiter2, clearAlexei)
274 serveTable(savepoint, "919", kEntityTables1, "005H", "005J", "921", &ENTITY_PARAM(0, 3), 63);
275 IMPLEMENT_FUNCTION_END
276
277 //////////////////////////////////////////////////////////////////////////
278 IMPLEMENT_FUNCTION(12, Waiter2, clearMilos)
279 serveTable(savepoint, "923", kEntityTables2, "009F", "009G", "926", &ENTITY_PARAM(0, 4));
280 IMPLEMENT_FUNCTION_END
281
282 //////////////////////////////////////////////////////////////////////////
283 IMPLEMENT_FUNCTION(13, Waiter2, clearMonsieur)
284 serveTable(savepoint, "923", kEntityTables2, "009F", "009G", "926", &ENTITY_PARAM(0, 5));
285 IMPLEMENT_FUNCTION_END
286
287 //////////////////////////////////////////////////////////////////////////
288 IMPLEMENT_FUNCTION(14, Waiter2, servingDinner)
289 switch (savepoint.action) {
290 default:
291 break;
292
293 case kActionNone:
294 if (!getEntities()->isInKitchen(kEntityWaiter2) || !getEntities()->isSomebodyInsideRestaurantOrSalon())
295 break;
296
297 if (ENTITY_PARAM(0, 1)) {
298 setCallback(1);
299 setup_milosOrder();
300 break;
301 }
302
303 if (ENTITY_PARAM(1, 2)) {
304 setCallback(2);
305 setup_monsieurOrder();
306 break;
307 }
308
309 if (ENTITY_PARAM(0, 3)) {
310 setCallback(3);
311 setup_clearAlexei();
312 break;
313 }
314
315 if (ENTITY_PARAM(0, 4)) {
316 setCallback(4);
317 setup_clearMilos();
318 break;
319 }
320
321 if (ENTITY_PARAM(0, 5)) {
322 setCallback(5);
323 setup_clearMonsieur();
324 }
325 break;
326
327 case kActionCallback:
328 if (getCallback() == 5) {
329 getSavePoints()->push(kEntityWaiter2, kEntityPascale, kAction352768896);
330 setup_function15();
331 }
332 break;
333 }
334 IMPLEMENT_FUNCTION_END
335
336 //////////////////////////////////////////////////////////////////////////
337 IMPLEMENT_FUNCTION(15, Waiter2, function15)
338 switch (savepoint.action) {
339 default:
340 break;
341
342 case kActionDefault:
343 getData()->entityPosition = kPosition_5900;
344 break;
345
346 case kAction101632192:
347 setup_function16();
348 break;
349 }
350 IMPLEMENT_FUNCTION_END
351
352 //////////////////////////////////////////////////////////////////////////
353 IMPLEMENT_FUNCTION(16, Waiter2, function16)
354 if (savepoint.action == kActionDefault) {
355 getData()->entityPosition = kPosition_5900;
356 getData()->location = kLocationOutsideCompartment;
357 getData()->car = kCarRestaurant;
358
359 getEntities()->clearSequences(kEntityWaiter2);
360 }
361 IMPLEMENT_FUNCTION_END
362
363 //////////////////////////////////////////////////////////////////////////
364 IMPLEMENT_FUNCTION(17, Waiter2, chapter2)
365 switch (savepoint.action) {
366 default:
367 break;
368
369 case kActionNone:
370 setup_inKitchen();
371 break;
372
373 case kActionDefault:
374 getEntities()->clearSequences(kEntityWaiter2);
375
376 getData()->entityPosition = kPosition_5900;
377 getData()->location = kLocationOutsideCompartment;
378 getData()->car = kCarRestaurant;
379 getData()->clothes = kClothes1;
380 getData()->inventoryItem = kItemNone;
381
382 ENTITY_PARAM(0, 6) = 0;
383 ENTITY_PARAM(0, 7) = 0;
384 ENTITY_PARAM(0, 8) = 0;
385 break;
386 }
387 IMPLEMENT_FUNCTION_END
388
389 //////////////////////////////////////////////////////////////////////////
390 IMPLEMENT_FUNCTION(18, Waiter2, inKitchen)
391 switch (savepoint.action) {
392 default:
393 break;
394
395 case kActionNone:
396 if (!getEntities()->isInKitchen(kEntityWaiter2) || !getEntities()->isSomebodyInsideRestaurantOrSalon())
397 break;
398
399 if (ENTITY_PARAM(0, 6)) {
400 setCallback(1);
401 setup_tatianaClearTableB();
402 break;
403 }
404
405 label_callback_1:
406 if (ENTITY_PARAM(0, 7)) {
407 setCallback(2);
408 setup_ivoComeHere();
409 break;
410 }
411
412 label_callback_2:
413 if (ENTITY_PARAM(0, 8) || ENTITY_PARAM(0, 5)) {
414 setCallback(3);
415 setup_ivoClearTableC();
416 }
417 break;
418
419 case kActionCallback:
420 switch (getCallback()) {
421 default:
422 break;
423
424 case 1:
425 goto label_callback_1;
426
427 case 2:
428 goto label_callback_2;
429
430 case 4:
431 getEntities()->clearSequences(kEntityWaiter2);
432 getData()->entityPosition = kPosition_5900;
433 break;
434 }
435 break;
436
437 case kAction101106391:
438 setCallback(4);
439 setup_draw("975");
440 break;
441 }
442 IMPLEMENT_FUNCTION_END
443
444 //////////////////////////////////////////////////////////////////////////
445 IMPLEMENT_FUNCTION(19, Waiter2, tatianaClearTableB)
446 serveTable(savepoint, "969", kEntityTables1, "005H2", "018A", "971", &ENTITY_PARAM(0, 6), 63);
447 IMPLEMENT_FUNCTION_END
448
449 //////////////////////////////////////////////////////////////////////////
450 IMPLEMENT_FUNCTION(20, Waiter2, ivoComeHere)
451 switch (savepoint.action) {
452 default:
453 break;
454
455 case kActionDefault:
456 getData()->entityPosition = kPosition_5800;
457 getData()->location = kLocationOutsideCompartment;
458
459 setCallback(1);
460 setup_draw("973");
461 break;
462
463 case kActionCallback:
464 if (getCallback() == 1) {
465 getSavePoints()->push(kEntityWaiter2, kEntityIvo, kAction123712592);
466 getEntities()->drawSequenceLeft(kEntityWaiter2, "BLANK");
467 ENTITY_PARAM(0, 7) = 0;
468
469 callbackAction();
470 }
471 break;
472 }
473 IMPLEMENT_FUNCTION_END
474
475 //////////////////////////////////////////////////////////////////////////
476 IMPLEMENT_FUNCTION(21, Waiter2, ivoClearTableC)
477 serveTable(savepoint, "974", kEntityTables2, "009F2", "009G", "976", &ENTITY_PARAM(0, 8), 0, true, &ENTITY_PARAM(0, 5));
478 IMPLEMENT_FUNCTION_END
479
480 //////////////////////////////////////////////////////////////////////////
481 IMPLEMENT_FUNCTION(22, Waiter2, chapter3)
482 switch (savepoint.action) {
483 default:
484 break;
485
486 case kActionNone:
487 setup_serving3();
488 break;
489
490 case kActionDefault:
491 getEntities()->clearSequences(kEntityWaiter2);
492
493 getData()->entityPosition = kPosition_5900;
494 getData()->location = kLocationOutsideCompartment;
495 getData()->car = kCarRestaurant;
496 getData()->clothes = kClothes1;
497 getData()->inventoryItem = kItemNone;
498
499 ENTITY_PARAM(1, 1) = 0;
500 ENTITY_PARAM(1, 2) = 0;
501 break;
502 }
503 IMPLEMENT_FUNCTION_END
504
505 //////////////////////////////////////////////////////////////////////////
506 IMPLEMENT_FUNCTION(23, Waiter2, serving3)
507 if (savepoint.action != kActionNone)
508 return;
509
510 if (!getEntities()->isInKitchen(kEntityWaiter2) || !getEntities()->isSomebodyInsideRestaurantOrSalon())
511 return;
512
513 if (ENTITY_PARAM(1, 1)) {
514 setCallback(1);
515 setup_annaBringTea3();
516 return;
517 }
518
519 if (ENTITY_PARAM(1, 2)) {
520 setCallback(2);
521 setup_monsieurServeUs();
522 }
523 IMPLEMENT_FUNCTION_END
524
525 //////////////////////////////////////////////////////////////////////////
526 IMPLEMENT_FUNCTION(24, Waiter2, annaBringTea3)
527 serveSalon(savepoint, "927", "Ann3143A", kEntityAnna, "Ann3144", "112C", kAction122288808, "928", &ENTITY_PARAM(1, 1));
528 IMPLEMENT_FUNCTION_END
529
530 //////////////////////////////////////////////////////////////////////////
531 IMPLEMENT_FUNCTION(25, Waiter2, chapter4)
532 switch (savepoint.action) {
533 default:
534 break;
535
536 case kActionNone:
537 setup_serving4();
538 break;
539
540 case kActionDefault:
541 getEntities()->clearSequences(kEntityWaiter2);
542
543 getData()->entityPosition = kPosition_5900;
544 getData()->location = kLocationOutsideCompartment;
545 getData()->car = kCarRestaurant;
546 getData()->inventoryItem = kItemNone;
547
548 getEntities()->clearSequences(kEntityWaiter2);
549
550 ENTITY_PARAM(1, 2) = 0;
551 ENTITY_PARAM(1, 3) = 0;
552 ENTITY_PARAM(1, 4) = 0;
553 ENTITY_PARAM(1, 5) = 0;
554 break;
555 }
556 IMPLEMENT_FUNCTION_END
557
558 //////////////////////////////////////////////////////////////////////////
559 IMPLEMENT_FUNCTION(26, Waiter2, serving4)
560 switch (savepoint.action) {
561 default:
562 break;
563
564 case kActionNone:
565 if (params->param1) {
566 if (Entity::updateParameter(params->param2, getState()->time, 900)) {
567 ENTITY_PARAM(1, 5) = 1;
568 params->param1 = 0;
569 }
570 }
571
572 if (!getEntities()->isInKitchen(kEntityWaiter2) || !getEntities()->isSomebodyInsideRestaurantOrSalon())
573 break;
574
575 if (ENTITY_PARAM(1, 3)) {
576 setCallback(1);
577 setup_augustNeedsADrink();
578 break;
579 }
580
581 if (ENTITY_PARAM(1, 5)) {
582 setCallback(2);
583 setup_serveAugustADrink();
584 break;
585 }
586
587 if (ENTITY_PARAM(1, 4)) {
588 setCallback(3);
589 setup_annaNeedsADrink();
590 break;
591 }
592
593 if (ENTITY_PARAM(1, 2)) {
594 setCallback(4);
595 setup_monsieurServeUs();
596 }
597 break;
598
599 case kActionCallback:
600 if (getCallback() == 1)
601 params->param1 = 1;
602 break;
603
604 case kAction201431954:
605 ENTITY_PARAM(1, 2) = 0;
606 ENTITY_PARAM(1, 3) = 0;
607 ENTITY_PARAM(1, 4) = 0;
608 ENTITY_PARAM(1, 5) = 0;
609
610 getData()->entityPosition = kPosition_5900;
611 getData()->location = kLocationOutsideCompartment;
612 break;
613 }
614 IMPLEMENT_FUNCTION_END
615
616 //////////////////////////////////////////////////////////////////////////
617 IMPLEMENT_FUNCTION(27, Waiter2, augustNeedsADrink)
618 serveSalon(savepoint, "929", "", kEntityAugust, "Aug4003", "122D", kAction134486752, "930", &ENTITY_PARAM(1, 3));
619 IMPLEMENT_FUNCTION_END
620
621 //////////////////////////////////////////////////////////////////////////
622 IMPLEMENT_FUNCTION(28, Waiter2, serveAugustADrink)
623 serveSalon(savepoint, "931", "", kEntityAugust, "Aug4004", "122E", kAction125826561, "930", &ENTITY_PARAM(1, 5));
624 IMPLEMENT_FUNCTION_END
625
626 //////////////////////////////////////////////////////////////////////////
627 IMPLEMENT_FUNCTION(29, Waiter2, annaNeedsADrink)
628 serveSalon(savepoint, "932", "", kEntityAnna, "Ann4151", "127D", kAction122288808, "930", &ENTITY_PARAM(1, 4));
629 IMPLEMENT_FUNCTION_END
630
631 //////////////////////////////////////////////////////////////////////////
632 IMPLEMENT_FUNCTION(30, Waiter2, chapter5)
633 switch (savepoint.action) {
634 default:
635 break;
636
637 case kActionNone:
638 setup_chapter5Handler();
639 break;
640
641 case kActionDefault:
642 getEntities()->clearSequences(kEntityWaiter2);
643
644 getData()->entityPosition = kPosition_3969;
645 getData()->location = kLocationInsideCompartment;
646 getData()->car = kCarRestaurant;
647 getData()->inventoryItem = kItemNone;
648 break;
649 }
650 IMPLEMENT_FUNCTION_END
651
652 //////////////////////////////////////////////////////////////////////////
653 IMPLEMENT_FUNCTION(31, Waiter2, chapter5Handler)
654 if (savepoint.action == kActionProceedChapter5)
655 setup_nullfunction();
656 IMPLEMENT_FUNCTION_END
657
658 //////////////////////////////////////////////////////////////////////////
659 IMPLEMENT_NULL_FUNCTION(32, Waiter2)
660
661
662 //////////////////////////////////////////////////////////////////////////
663 // Private functions
664 //////////////////////////////////////////////////////////////////////////
serveTable(const SavePoint & savepoint,const char * seq1,EntityIndex entity,const char * seq2,const char * seq3,const char * seq4,uint * parameter,Position position,bool shouldUpdatePosition,uint * parameter2)665 void Waiter2::serveTable(const SavePoint &savepoint, const char *seq1, EntityIndex entity, const char *seq2, const char *seq3, const char *seq4, uint *parameter, Position position, bool shouldUpdatePosition, uint *parameter2) {
666 switch (savepoint.action) {
667 default:
668 break;
669
670 case kActionDefault:
671 if (shouldUpdatePosition) {
672 getData()->entityPosition = kPosition_5800;
673 getData()->location = kLocationOutsideCompartment;
674 }
675
676 setCallback(1);
677 setup_draw(seq1);
678 break;
679
680 case kActionCallback:
681 switch (getCallback()) {
682 default:
683 break;
684
685 case 1:
686 if (position)
687 getEntities()->updatePositionEnter(kEntityWaiter2, kCarRestaurant, position);
688
689 getSavePoints()->push(kEntityWaiter2, entity, kAction136455232);
690
691 setCallback(2);
692 setup_callSavepoint(seq2, entity, kActionDrawTablesWithChairs, seq3);
693 break;
694
695 case 2:
696 if (position)
697 getEntities()->updatePositionExit(kEntityWaiter2, kCarRestaurant, position);
698
699 setCallback(3);
700 setup_draw(seq4);
701 break;
702
703 case 3:
704 getData()->entityPosition = kPosition_5900;
705 getEntities()->clearSequences(kEntityWaiter2);
706 *parameter = 0;
707
708 if (parameter2 != NULL)
709 *parameter2 = 0;
710
711 callbackAction();
712 break;
713 }
714 break;
715 }
716 }
717
718 //////////////////////////////////////////////////////////////////////////
serveSalon(const SavePoint & savepoint,const char * seq1,const char * snd1,EntityIndex entity,const char * snd2,const char * seq2,ActionIndex action,const char * seq3,uint * parameter)719 void Waiter2::serveSalon(const SavePoint &savepoint, const char *seq1, const char *snd1, EntityIndex entity, const char *snd2, const char *seq2, ActionIndex action, const char *seq3, uint *parameter) {
720 switch (savepoint.action) {
721 default:
722 break;
723
724 case kActionDefault:
725 getData()->entityPosition = kPosition_5800;
726 getData()->location = kLocationOutsideCompartment;
727
728 setCallback(1);
729 setup_draw("816DD");
730 break;
731
732 case kActionCallback:
733 switch (getCallback()) {
734 default:
735 break;
736
737 case 1:
738 getEntities()->drawSequenceRight(kEntityWaiter2, seq1);
739
740 if (getEntities()->isInRestaurant(kEntityPlayer))
741 getEntities()->updateFrame(kEntityWaiter2);
742
743 if (strcmp(snd1, ""))
744 getSound()->playSound(kEntityWaiter2, snd1);
745
746 setCallback(2);
747 setup_callbackActionOnDirection();
748 break;
749
750 case 2:
751 getSavePoints()->push(kEntityWaiter2, entity, kAction122358304);
752
753 getSound()->playSound(kEntityWaiter2, snd2);
754
755 setCallback(3);
756 // the last arg is actually a constant varying between calls,
757 // but this function already has too many args to add yet another one
758 setup_updatePosition(seq2, kCarRestaurant, strcmp(seq2, "127D") ? 57 : 56);
759 break;
760
761 case 3:
762 getSavePoints()->push(kEntityWaiter2, entity, action);
763
764 setCallback(4);
765 setup_draw(seq3);
766 break;
767
768 case 4:
769 getEntities()->drawSequenceRight(kEntityWaiter2, "816UD");
770
771 if (getEntities()->isInSalon(kEntityPlayer))
772 getEntities()->updateFrame(kEntityWaiter2);
773
774 setCallback(5);
775 setup_callbackActionOnDirection();
776 break;
777
778 case 5:
779 getEntities()->clearSequences(kEntityWaiter2);
780 getData()->entityPosition = kPosition_5900;
781 *parameter = 0;
782
783 callbackAction();
784 break;
785 }
786 break;
787 }
788 }
789
790 } // End of namespace LastExpress
791