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