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 "titanic/npcs/barbot.h"
24 #include "titanic/support/files_manager.h"
25 #include "titanic/titanic.h"
26 #include "titanic/translation.h"
27
28 namespace Titanic {
29
30 int CBarbot::_timesCalled;
31
BEGIN_MESSAGE_MAP(CBarbot,CTrueTalkNPC)32 BEGIN_MESSAGE_MAP(CBarbot, CTrueTalkNPC)
33 ON_MESSAGE(ActMsg)
34 ON_MESSAGE(EnterViewMsg)
35 ON_MESSAGE(TurnOn)
36 ON_MESSAGE(TurnOff)
37 ON_MESSAGE(LeaveViewMsg)
38 ON_MESSAGE(MovieEndMsg)
39 ON_MESSAGE(TrueTalkSelfQueueAnimSetMsg)
40 ON_MESSAGE(TrueTalkQueueUpAnimSetMsg)
41 ON_MESSAGE(TrueTalkGetStateValueMsg)
42 ON_MESSAGE(TrueTalkTriggerActionMsg)
43 ON_MESSAGE(FrameMsg)
44 ON_MESSAGE(LoadSuccessMsg)
45 ON_MESSAGE(MovieFrameMsg)
46 ON_MESSAGE(EnterRoomMsg)
47 ON_MESSAGE(TimerMsg)
48 END_MESSAGE_MAP()
49
50 CBarbot::FrameRanges::FrameRanges() : Common::Array<FrameRange>() {
51 resize(60);
52 Common::SeekableReadStream *stream = g_vm->_filesManager->getResource("FRAMES/BARBOT");
53 for (int idx = 0; idx < 60; ++idx) {
54 (*this)[idx]._startFrame = stream->readUint32LE();
55 (*this)[idx]._endFrame = stream->readUint32LE();
56 }
57
58 delete stream;
59 }
60
61 /*------------------------------------------------------------------------*/
62
CBarbot()63 CBarbot::CBarbot() : CTrueTalkNPC() {
64 _field108 = 0;
65 _field10C = 0;
66 _field110 = 0;
67 _addedLemon = false;
68 _addedTV = false;
69 _addedPuret = false;
70 _field120 = 0;
71 _field124 = 0;
72 _visCenterOnCounter = false;
73 _addedVodka = false;
74 _gottenDrunk = false;
75 _field134 = 0;
76 _field138 = 0;
77 _field13C = -1;
78 _volume = 30;
79 _frameNum = -1;
80 _field148 = -1;
81 _field14C = 0;
82 _field150 = 0;
83 _field154 = 0;
84 _glassContent = GG_DEFAULT;
85 _drunkFlag = false;
86 _field160 = 0;
87 }
88
save(SimpleFile * file,int indent)89 void CBarbot::save(SimpleFile *file, int indent) {
90 file->writeNumberLine(1, indent);
91 file->writeNumberLine(_field108, indent);
92 file->writeNumberLine(_field10C, indent);
93 file->writeNumberLine(_field110, indent);
94 file->writeNumberLine(_addedLemon, indent);
95 file->writeNumberLine(_addedTV, indent);
96 file->writeNumberLine(_addedPuret, indent);
97 file->writeNumberLine(_field120, indent);
98 file->writeNumberLine(_field124, indent);
99 file->writeNumberLine(_visCenterOnCounter, indent);
100
101 file->writeNumberLine(_timesCalled, indent);
102 file->writeNumberLine(_addedVodka, indent);
103 file->writeNumberLine(_gottenDrunk, indent);
104 file->writeNumberLine(_field134, indent);
105 file->writeNumberLine(_field138, indent);
106 file->writeNumberLine(_field13C, indent);
107 file->writeNumberLine(_volume, indent);
108 file->writeNumberLine(_frameNum, indent);
109 file->writeNumberLine(_field148, indent);
110 file->writeNumberLine(_field14C, indent);
111 file->writeNumberLine(_field150, indent);
112 file->writeNumberLine(_field154, indent);
113 file->writeNumberLine(_glassContent, indent);
114 file->writeNumberLine(_drunkFlag, indent);
115 file->writeNumberLine(_field160, indent);
116
117 CTrueTalkNPC::save(file, indent);
118 }
119
load(SimpleFile * file)120 void CBarbot::load(SimpleFile *file) {
121 file->readNumber();
122 _field108 = file->readNumber();
123 _field10C = file->readNumber();
124 _field110 = file->readNumber();
125 _addedLemon = file->readNumber();
126 _addedTV = file->readNumber();
127 _addedPuret = file->readNumber();
128 _field120 = file->readNumber();
129 _field124 = file->readNumber();
130 _visCenterOnCounter = file->readNumber();
131
132 _timesCalled = file->readNumber();
133 _addedVodka = file->readNumber();
134 _gottenDrunk = file->readNumber();
135 _field134 = file->readNumber();
136 _field138 = file->readNumber();
137 _field13C = file->readNumber();
138 _volume = file->readNumber();
139 _frameNum = file->readNumber();
140 _field148 = file->readNumber();
141 _field14C = file->readNumber();
142 _field150 = file->readNumber();
143 _field154 = file->readNumber();
144 _glassContent = (GlassGiven)file->readNumber();
145 _drunkFlag = file->readNumber();
146 _field160 = file->readNumber();
147
148 CTrueTalkNPC::load(file);
149 }
150
ActMsg(CActMsg * msg)151 bool CBarbot::ActMsg(CActMsg *msg) {
152 if (msg->_action == "Vodka") {
153 if (!_addedVodka) {
154 playRange(_frames[47], MOVIE_NOTIFY_OBJECT);
155 playRange(_frames[46], MOVIE_NOTIFY_OBJECT);
156 playRange(_frames[40]);
157 playRange(_frames[7]);
158 playRange(_frames[13]);
159 playRange(_frames[8]);
160 playRange(_frames[40]);
161 playRange(_frames[7]);
162 playRange(_frames[13]);
163 playRange(_frames[8]);
164 playRange(_frames[7]);
165 playRange(_frames[40]);
166 playRange(_frames[13]);
167 playRange(_frames[40]);
168 playRange(_frames[7]);
169 playRange(_frames[8]);
170 playRange(_frames[13]);
171 playRange(_frames[40], MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH);
172 _frameNum = _frames[40]._endFrame;
173 }
174 } else if (msg->_action == "GiveBackVisCentre") {
175 if (_field134) {
176 playRange(_frames[27]);
177 _frameNum = _frames[27]._endFrame;
178 }
179 } else if (msg->_action == "Bird") {
180 CStatusChangeMsg statusMsg;
181 statusMsg._newStatus = 2;
182 statusMsg.execute("PickUpGlass");
183 _glassContent = GG_BIRD;
184
185 playRange(_frames[32], MOVIE_NOTIFY_OBJECT);
186 movieEvent();
187 playRange(_frames[30], MOVIE_NOTIFY_OBJECT);
188 _frameNum = _frames[30]._endFrame;
189
190 if (areIngredientsMissing()) {
191 playRange(_frames[42], MOVIE_NOTIFY_OBJECT);
192 _frameNum = _frames[42]._endFrame;
193 }
194
195 CActMsg actMsg("InTitilator");
196 actMsg.execute("BeerGlass");
197 } else if (msg->_action == "None") {
198 CStatusChangeMsg statusMsg;
199 statusMsg._newStatus = 2;
200 statusMsg.execute("PickUpGlass");
201 _glassContent = GG_EMPTY;
202
203 playRange(_frames[55], MOVIE_NOTIFY_OBJECT);
204 movieEvent();
205 playRange(_frames[54], MOVIE_NOTIFY_OBJECT);
206 _frameNum = _frames[54]._endFrame;
207 } else if (msg->_action == "Mustard" || msg->_action == "Tomato") {
208 CStatusChangeMsg statusMsg;
209 statusMsg._newStatus = 2;
210 statusMsg.execute("PickUpGlass");
211 _glassContent = GG_CONDIMENT;
212
213 playRange(_frames[55], MOVIE_NOTIFY_OBJECT);
214 movieEvent();
215 playRange(_frames[54], MOVIE_NOTIFY_OBJECT);
216 _frameNum = _frames[54]._endFrame;
217
218 CActMsg actMsg("InTitilator");
219 actMsg.execute("BeerGlass");
220 } else if (msg->_action == "Fruit") {
221 if (!_addedLemon) {
222 CActMsg visibleMsg;
223 visibleMsg.execute("LemonOnBar");
224 startTalking(this, 250576);
225 _addedLemon = true;
226
227 playRange(_frames[36], MOVIE_NOTIFY_OBJECT);
228 movieEvent();
229 _frameNum = _frames[36]._endFrame;
230
231 if (areIngredientsMissing()) {
232 playRange(_frames[43], MOVIE_NOTIFY_OBJECT);
233 _frameNum = _frames[43]._endFrame;
234 }
235
236 CRemoveFromGameMsg removeMsg;
237 removeMsg.execute("Lemon");
238 }
239 } else if (msg->_action == "CrushedTV") {
240 if (!_addedTV) {
241 CVisibleMsg visibleMsg;
242 visibleMsg.execute("TVOnBar");
243 startTalking(this, 250584);
244 _field160 = 1;
245 _addedTV = true;
246
247 playSound(TRANSLATE("c#5.wav", "c#65.wav"), _volume);
248 playRange(_frames[35], MOVIE_NOTIFY_OBJECT);
249 movieEvent();
250 playRange(_frames[34]);
251 playRange(_frames[33], MOVIE_NOTIFY_OBJECT);
252 _frameNum = _frames[33]._endFrame;
253
254 if (areIngredientsMissing()) {
255 playRange(_frames[41], MOVIE_NOTIFY_OBJECT);
256 _frameNum = _frames[41]._endFrame;
257 }
258
259 CRemoveFromGameMsg removeMsg;
260 removeMsg.execute("CrushedTV");
261 }
262 } else if (msg->_action == "PlayerTakesGlass") {
263 playRange(_frames[53]);
264 _field124 = 0;
265
266 CStatusChangeMsg statusMsg;
267 statusMsg._newStatus = 0;
268 statusMsg.execute("PickUpGlass");
269 } else if (msg->_action == "PlayerTakesVisCentre") {
270 _visCenterOnCounter = false;
271 loadFrame(0);
272 CStatusChangeMsg statusMsg;
273 statusMsg._newStatus = 0;
274 statusMsg.execute("PickUpVisCentre");
275 } else if (msg->_action == "BellRing1") {
276 startTalking(this, 251105);
277 } else if (msg->_action == "BellRing2") {
278 startTalking(this, 251107);
279 } else if (msg->_action == "BellRing3") {
280 startTalking(this, 250285);
281 } else if (msg->_action == "GoRingBell") {
282 startTalking(this, 250285);
283 } else if (msg->_action == "ClickOnVision") {
284 startTalking(this, 251858);
285 }
286
287 return true;
288 }
289
EnterViewMsg(CEnterViewMsg * msg)290 bool CBarbot::EnterViewMsg(CEnterViewMsg *msg) {
291 // I think this is a remnant of early debugging code
292 if (getName() != "Barbot")
293 playMovie(MOVIE_REPEAT);
294
295 return true;
296 }
297
EnterRoomMsg(CEnterRoomMsg * msg)298 bool CBarbot::EnterRoomMsg(CEnterRoomMsg *msg) {
299 // I think this is a remnant of early debugging code
300 if (getName() != "Barbot")
301 addTimer(g_vm->getRandomNumber(20000));
302
303 return true;
304 }
305
TurnOn(CTurnOn * msg)306 bool CBarbot::TurnOn(CTurnOn *msg) {
307 if (!_fieldC4) {
308 _field13C = -1;
309 setVisible(true);
310
311 CGameObject *glass = findInRoom("BeerGlass");
312 if (!_gottenDrunk) {
313 CVisibleMsg visibleMsg(false);
314 visibleMsg.execute("BarShelfVisCentre");
315 }
316
317 if (glass && !_addedPuret) {
318 playRange(_frames[38], MOVIE_NOTIFY_OBJECT);
319 playRange(_frames[58], MOVIE_NOTIFY_OBJECT);
320 playRange(_frames[57], MOVIE_NOTIFY_OBJECT);
321 playRange(_frames[56], MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH);
322 _frameNum = _frames[56]._endFrame;
323 } else {
324 playRange(_frames[38]);
325 playRange(_frames[23], MOVIE_NOTIFY_OBJECT);
326 playRange(_frames[21], MOVIE_NOTIFY_OBJECT);
327 _frameNum = _frames[21]._endFrame;
328
329 switch (g_vm->getRandomNumber(2)) {
330 case 0:
331 playRange(_frames[10], MOVIE_NOTIFY_OBJECT);
332 _frameNum = _frames[10]._endFrame;
333 break;
334 case 1:
335 playRange(_frames[12], MOVIE_NOTIFY_OBJECT);
336 _frameNum = _frames[12]._endFrame;
337 break;
338 default:
339 break;
340 }
341 _field124 = 0;
342 }
343
344 _fieldC4 = 1;
345 ++_timesCalled;
346 petSetArea(PET_CONVERSATION);
347 setTalking(this, true);
348 }
349
350 return true;
351 }
352
TurnOff(CTurnOff * msg)353 bool CBarbot::TurnOff(CTurnOff *msg) {
354 if (_fieldC4) {
355 CStatusChangeMsg statusMsg;
356 statusMsg._newStatus = 0;
357 statusMsg.execute("PickUpGlass");
358 statusMsg.execute("PickUpVisCentre");
359
360 if (_field124) {
361 playRange(_frames[17], MOVIE_NOTIFY_OBJECT);
362 _frameNum = _frames[17]._endFrame;
363 _field124 = 0;
364 }
365
366 if (_visCenterOnCounter) {
367 // Barbot will put away the vision center
368 playRange(_frames[28], MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH);
369 _frameNum = _frames[28]._endFrame;
370 _visCenterOnCounter = false;
371 _field134 = 1;
372 }
373
374 playRange(_frames[29], MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH);
375 movieEvent(_frames[29]._startFrame);
376 _frameNum = _frames[29]._endFrame;
377 _fieldC4 = 0;
378 }
379
380 return true;
381 }
382
LeaveViewMsg(CLeaveViewMsg * msg)383 bool CBarbot::LeaveViewMsg(CLeaveViewMsg *msg) {
384 CTurnOff offMsg;
385 offMsg.execute(this);
386 return true;
387 }
388
MovieEndMsg(CMovieEndMsg * msg)389 bool CBarbot::MovieEndMsg(CMovieEndMsg *msg) {
390 if (msg->_endFrame == _frameNum) {
391 _frameNum = -1;
392 _field14C = getTicksCount();
393 }
394
395 if (msg->_endFrame == _field148) {
396 _field148 = -1;
397 _field150 = getTicksCount();
398 }
399
400 if (msg->_endFrame == _field13C) {
401 if (_field124)
402 playMovie(_frames[53]._startFrame, _frames[53]._startFrame, 0);
403 else if (_visCenterOnCounter)
404 playMovie(_frames[27]._endFrame, _frames[27]._endFrame, 0);
405
406 _field13C = -1;
407 return true;
408 }
409
410 if (msg->_endFrame == _frames[58]._endFrame || msg->_endFrame == _frames[21]._endFrame) {
411 if (!_gottenDrunk) {
412 CVisibleMsg visibleMsg(true);
413 visibleMsg.execute("BarShelfVisCentre");
414 }
415 }
416
417 if (msg->_endFrame == _frames[57]._endFrame) {
418 startTalking(this, 250575);
419 playSound(TRANSLATE("c#10.wav", "c#70.wav"), _volume);
420 return true;
421 }
422
423 if (msg->_endFrame == _frames[55]._endFrame) {
424 playSound(TRANSLATE("c#10.wav", "c#70.wav"), _volume);
425 return true;
426 }
427
428 if (msg->_endFrame == _frames[56]._endFrame
429 || msg->_endFrame == _frames[54]._endFrame) {
430 CStatusChangeMsg statusMsg;
431 statusMsg._newStatus = 1;
432 statusMsg.execute("PickUpGlass");
433 CMoveToStartPosMsg moveMsg;
434 moveMsg.execute("BeerGlass");
435 return true;
436 }
437
438 if (msg->_endFrame == _frames[30]._endFrame) {
439 _field124 = 0;
440 CStatusChangeMsg statusMsg;
441 statusMsg._newStatus = 0;
442 statusMsg.execute("PickUpGlass");
443 }
444
445 if (msg->_endFrame == _frames[45]._endFrame) {
446 if (!_gottenDrunk) {
447 CVisibleMsg visibleMsg(false);
448 visibleMsg.execute("BarShelfVisCentre");
449 }
450
451 return true;
452 }
453
454 if (msg->_endFrame == _frames[44]._endFrame) {
455 _visCenterOnCounter = true;
456 _gottenDrunk = true;
457 startTalking(this, 250586);
458 CStatusChangeMsg statusMsg;
459 statusMsg._newStatus = 1;
460 statusMsg.execute("PickUpVisCentre");
461 CPuzzleSolvedMsg solvedMsg;
462 solvedMsg.execute("VisionCentre");
463 }
464
465 if (msg->_endFrame == _frames[46]._endFrame) {
466 if (!_gottenDrunk && !areIngredientsMissing())
467 startTalking(this, 250571);
468 return true;
469 }
470
471 if (msg->_endFrame == _frames[43]._endFrame
472 || msg->_endFrame == _frames[42]._endFrame
473 || msg->_endFrame == _frames[41]._endFrame) {
474 if (_field124)
475 playMovie(_frames[53]._startFrame, _frames[53]._startFrame, 0);
476 return true;
477 }
478
479 if (msg->_endFrame == _frames[38]._endFrame || msg->_endFrame == _frames[23]._endFrame) {
480 playSound(TRANSLATE("c#3.wav", "c#63.wav"), _volume);
481 } else if (msg->_endFrame == _frames[36]._endFrame) {
482 playSound(TRANSLATE("c#6.wav", "c#66.wav"), _volume);
483 } else if (msg->_endFrame == _frames[35]._endFrame) {
484 playSound(TRANSLATE("c#8.wav", "c#68.wav"), _volume);
485 } else if (msg->_endFrame == _frames[33]._endFrame) {
486 playSound(TRANSLATE("c#4.wav", "c#64.wav"), _volume);
487 } else if (msg->_endFrame == _frames[32]._endFrame) {
488 startTalking(this, 145);
489 playSound(TRANSLATE("c#9.wav", "c#69.wav"), _volume);
490 } else if (msg->_endFrame == _frames[47]._endFrame) {
491 playSound(TRANSLATE("c#9.wav", "c#69.wav"), _volume);
492 _addedVodka = true;
493 _drunkFlag = true;
494 } else if (msg->_endFrame == _frames[30]._endFrame) {
495 playSound(TRANSLATE("c#4.wav", "c#64.wav"), 60);
496 } else if (msg->_endFrame == _frames[29]._endFrame) {
497 if (!_fieldC4) {
498 performAction(true, nullptr);
499 setVisible(false);
500 CActMsg actMsg("ResetCount");
501 actMsg.execute("BarBell");
502 }
503 } else if (msg->_endFrame == _frames[27]._endFrame) {
504 CStatusChangeMsg statusMsg;
505 statusMsg._newStatus = 1;
506 statusMsg.execute("PickUpVisCentre");
507 _visCenterOnCounter = true;
508 _field134 = 0;
509 startTalking(this, 250586);
510 }
511
512 return true;
513 }
514
TrueTalkSelfQueueAnimSetMsg(CTrueTalkSelfQueueAnimSetMsg * msg)515 bool CBarbot::TrueTalkSelfQueueAnimSetMsg(CTrueTalkSelfQueueAnimSetMsg *msg) {
516 return true;
517 }
518
TrueTalkQueueUpAnimSetMsg(CTrueTalkQueueUpAnimSetMsg * msg)519 bool CBarbot::TrueTalkQueueUpAnimSetMsg(CTrueTalkQueueUpAnimSetMsg *msg) {
520 return true;
521 }
522
TrueTalkGetStateValueMsg(CTrueTalkGetStateValueMsg * msg)523 bool CBarbot::TrueTalkGetStateValueMsg(CTrueTalkGetStateValueMsg *msg) {
524 switch (msg->_stateNum) {
525 case 2:
526 if (!_gottenDrunk) {
527 if (_drunkFlag) {
528 msg->_stateVal = _field134 | 1;
529 return true;
530 }
531 }
532
533 msg->_stateVal = _field134;
534 break;
535
536 case 3:
537 msg->_stateVal = 0;
538 if (_addedLemon)
539 msg->_stateVal = 1;
540 if (_addedVodka)
541 msg->_stateVal |= 2;
542 if (_addedPuret)
543 msg->_stateVal |= 4;
544 if (_addedTV)
545 msg->_stateVal |= 8;
546 break;
547
548 case 9:
549 msg->_stateVal = _drunkFlag ? 1 : 0;
550 break;
551
552 default:
553 break;
554 }
555
556 return true;
557 }
558
TrueTalkTriggerActionMsg(CTrueTalkTriggerActionMsg * msg)559 bool CBarbot::TrueTalkTriggerActionMsg(CTrueTalkTriggerActionMsg *msg) {
560 switch (msg->_action) {
561 case 6:
562 if (_field134) {
563 playRange(_frames[27], MOVIE_NOTIFY_OBJECT);
564 _frameNum = _frames[27]._endFrame;
565 } else if (!_gottenDrunk && _drunkFlag) {
566 playRange(_frames[45], MOVIE_NOTIFY_OBJECT);
567 playRange(_frames[44], MOVIE_NOTIFY_OBJECT | MOVIE_WAIT_FOR_FINISH);
568 _frameNum = _frames[44]._endFrame;
569 }
570 break;
571
572 case 7: {
573 // "add vodka"
574 CActMsg actMsg("Vodka");
575 actMsg.execute(this);
576 break;
577 }
578
579 case 30:
580 // "starling puret"
581 _addedPuret = true;
582 break;
583
584 default:
585 break;
586 }
587
588 return true;
589 }
590
FrameMsg(CFrameMsg * msg)591 bool CBarbot::FrameMsg(CFrameMsg *msg) {
592 if (!_fieldC4 || _frameNum != -1 || _field148 != -1
593 || (msg->_ticks - _field14C) <= 5000
594 || (msg->_ticks - _field150) <= 1000)
595 return true;
596
597 if (!_drunkFlag) {
598 if (++_field154 > 2) {
599 playRange(_frames[0]);
600 playRange(_frames[1], MOVIE_NOTIFY_OBJECT);
601 _field148 = _frames[1]._endFrame;
602 _field154 = 0;
603
604 return true;
605 }
606
607 switch (g_vm->getRandomNumber(5)) {
608 case 0:
609 playRange(_frames[4], MOVIE_NOTIFY_OBJECT);
610 _field148 = _frames[4]._endFrame;
611 break;
612
613 case 1:
614 playRange(_frames[10], MOVIE_NOTIFY_OBJECT);
615 _field148 = _frames[10]._endFrame;
616 break;
617
618 case 2:
619 playRange(_frames[7], MOVIE_NOTIFY_OBJECT);
620 _field148 = _frames[7]._endFrame;
621 break;
622
623 case 3:
624 playRange(_frames[0]);
625 playRange(_frames[1], MOVIE_NOTIFY_OBJECT);
626 _field148 = _frames[1]._endFrame;
627 break;
628
629 case 4:
630 playRange(_frames[3], MOVIE_NOTIFY_OBJECT);
631 _field148 = _frames[3]._endFrame;
632 break;
633
634 case 5:
635 if (!_field160 && !_visCenterOnCounter) {
636 playRange(_frames[15], MOVIE_NOTIFY_OBJECT);
637 _field148 = _frames[15]._endFrame;
638 }
639 break;
640
641 default:
642 break;
643 }
644 } else {
645 static const int CASES[23] = {
646 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7
647 };
648 switch (CASES[g_vm->getRandomNumber(22)]) {
649 case 0:
650 playRange(_frames[13], MOVIE_NOTIFY_OBJECT);
651 _field148 = _frames[13]._endFrame;
652 break;
653
654 case 1:
655 playRange(_frames[4], MOVIE_NOTIFY_OBJECT);
656 _field148 = _frames[4]._endFrame;
657 break;
658
659 case 2:
660 playRange(_frames[8], MOVIE_NOTIFY_OBJECT);
661 _field148 = _frames[8]._endFrame;
662 break;
663
664 case 3:
665 playRange(_frames[7], MOVIE_NOTIFY_OBJECT);
666 _field148 = _frames[7]._endFrame;
667 break;
668
669 case 4:
670 playRange(_frames[10], MOVIE_NOTIFY_OBJECT);
671 _field148 = _frames[10]._endFrame;
672 break;
673
674 case 5:
675 playRange(_frames[2], MOVIE_NOTIFY_OBJECT);
676 _field148 = _frames[2]._endFrame;
677 break;
678
679 case 6:
680 playRange(_frames[6], MOVIE_NOTIFY_OBJECT);
681 _field148 = _frames[6]._endFrame;
682 break;
683
684 default:
685 playRange(_frames[3], MOVIE_NOTIFY_OBJECT);
686 _field148 = _frames[3]._endFrame;
687 break;
688 }
689 }
690
691 return true;
692 }
693
LoadSuccessMsg(CLoadSuccessMsg * msg)694 bool CBarbot::LoadSuccessMsg(CLoadSuccessMsg *msg) {
695 _field14C = _field150 = getTicksCount();
696 _frameNum = -1;
697 _field148 = -1;
698
699 return true;
700 }
701
MovieFrameMsg(CMovieFrameMsg * msg)702 bool CBarbot::MovieFrameMsg(CMovieFrameMsg *msg) {
703 if (msg->_frameNumber == _frames[29]._startFrame) {
704 playSound(TRANSLATE("c#2.wav", "c#62.wav"), _volume);
705
706 } else if (msg->_frameNumber == _frames[55]._startFrame
707 || msg->_frameNumber == _frames[32]._startFrame) {
708 // Finished giving the Barbot a glass
709 CStatusChangeMsg statusMsg;
710 statusMsg._newStatus = 0;
711 statusMsg.execute("PickUpGlass");
712
713 if (_glassContent == GG_EMPTY) {
714 // I'd rather see that full of Starling Puret
715 startTalking(this, 250574);
716 } else if (_glassContent > GG_EMPTY) {
717 // What's this?
718 startTalking(this, 250580);
719 petSetArea(PET_CONVERSATION);
720 }
721
722 _glassContent = GG_DEFAULT;
723
724 } else if (msg->_frameNumber == _frames[36]._startFrame) {
725 CVisibleMsg visibleMsg(false);
726 visibleMsg.execute("LemonOnBar");
727
728 } else if (msg->_frameNumber == _frames[35]._startFrame) {
729 CVisibleMsg visibleMsg(false);
730 visibleMsg.execute("TVOnBar");
731 }
732
733 return true;
734 }
735
TimerMsg(CTimerMsg * msg)736 bool CBarbot::TimerMsg(CTimerMsg *msg) {
737 if (!_fieldC4 && compareRoomNameTo("Bar")) {
738 CParrotSpeakMsg speakMsg("Barbot", "AskForDrink");
739 speakMsg.execute("PerchedParrot");
740 addTimer(10000 + getRandomNumber(20000));
741 }
742
743 return true;
744 }
745
playRange(const FrameRange & range,uint flags)746 void CBarbot::playRange(const FrameRange &range, uint flags) {
747 playMovie(range._startFrame, range._endFrame, flags);
748 }
749
750 } // End of namespace Titanic
751