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