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 "tsage/ringworld2/ringworld2_speakers.h"
24 #include "tsage/scenes.h"
25 #include "tsage/tsage.h"
26 #include "tsage/graphics.h"
27 #include "tsage/staticres.h"
28 #include "tsage/ringworld2/ringworld2_scenes0.h"
29 #include "tsage/ringworld2/ringworld2_scenes1.h"
30 #include "tsage/ringworld2/ringworld2_scenes2.h"
31 #include "tsage/ringworld2/ringworld2_scenes3.h"
32 
33 namespace TsAGE {
34 
35 namespace Ringworld2 {
36 
VisualSpeaker()37 VisualSpeaker::VisualSpeaker(): Speaker() {
38 	_delayAmount = 0;
39 	_voiceDelayAmount = 0;
40 	_frameNumber = R2_GLOBALS._events.getFrameNumber();
41 	_color1 = 8;
42 	_color2 = 0;
43 	_displayMode = 0;
44 	_speakerMode = 0;
45 
46 	_object2 = nullptr;
47 	_fieldF8 = 0;
48 	_soundId = 0;
49 	_removeObject = false;
50 	_numFrames = 0;
51 	_voiceFrameNumber = 0;
52 }
53 
remove()54 void VisualSpeaker::remove() {
55 	_numFrames = 0;
56 	_delayAmount = 0;
57 	R2_GLOBALS._playStream.stop();
58 
59 	if (_object2) {
60 		if (_fieldF8) {
61 			_fieldF8 = 0;
62 			_object1.setStrip(_object1._strip - 1);
63 			_object1.setFrame(_object1.getFrameCount());
64 			_object1.animate(ANIM_MODE_6, (_speakerMode == 0xff) ? this : NULL);
65 		} else {
66 			_object1.animate(ANIM_MODE_6, (_speakerMode == 0xff) ? this : NULL);
67 		}
68 	}
69 
70 	Speaker::remove();
71 }
72 
signal()73 void VisualSpeaker::signal() {
74 	// TODO: Handle _field18 if used in Action. It looks only used in the original in remove()
75 	// _action->_field18 = 1;
76 	if (_speakerMode == 0xff)
77 		stopSpeaking();
78 
79 	_speakerMode = 0;
80 	if (_numFrames) {
81 		if (_object2) {
82 			_object1.setStrip(_object1._strip + 1);
83 			_object1.animate(ANIM_MODE_2, NULL);
84 			_fieldF8 = 1;
85 		}
86 
87 		if ((R2_GLOBALS._speechSubtitles & SPEECH_TEXT) || !_soundId)
88 			_sceneText.show();
89 
90 		if ((R2_GLOBALS._speechSubtitles & SPEECH_VOICE) && _soundId) {
91 			setVoiceFrame(1);
92 		}
93 	} else if (_action && _object2) {
94 		_action->setDelay(1);
95 		_sceneText.remove();
96 
97 		R2_GLOBALS._playStream.stop();
98 	}
99 }
100 
dispatch()101 void VisualSpeaker::dispatch() {
102 	uint32 frameNumber = R2_GLOBALS._events.getFrameNumber();
103 	assert(_action);
104 
105 	// Delay check for character animation
106 	if (_delayAmount) {
107 		if (frameNumber >= _frameNumber) {
108 			_delayAmount = _delayAmount - (_frameNumber - frameNumber);
109 			_frameNumber = frameNumber;
110 
111 			if (_delayAmount <= 0) {
112 				_delayAmount = 0;
113 				_object1.animate(ANIM_MODE_NONE, NULL);
114 				_object1.setFrame(1);
115 			}
116 		}
117 	}
118 
119 	// Delay check for voice
120 	if (_voiceDelayAmount) {
121 		if (frameNumber >= _voiceFrameNumber) {
122 			_voiceDelayAmount = _voiceDelayAmount - (frameNumber - _voiceFrameNumber);
123 			_voiceFrameNumber = frameNumber;
124 
125 			if (_voiceDelayAmount <= 0) {
126 				_voiceDelayAmount = 0;
127 				if (R2_GLOBALS._playStream.play(_soundId, NULL)) {
128 					_numFrames = 2;
129 					_soundId = 0;
130 				} else {
131 					_sceneText.show();
132 				}
133 			}
134 		}
135 	}
136 
137 	if ((R2_GLOBALS._speechSubtitles & SPEECH_VOICE) && (_numFrames == 2) &&
138 			!R2_GLOBALS._playStream.isPlaying()) {
139 		_numFrames = 0;
140 		_object1.animate(ANIM_MODE_NONE);
141 		_object1.setFrame(1);
142 
143 		if (!(R2_GLOBALS._speechSubtitles & SPEECH_TEXT)) {
144 			// Don't bother waiting for a mouse click to start the next speech segment
145 			_action->setDelay(1);
146 		}
147 	}
148 }
149 
synchronize(Serializer & s)150 void VisualSpeaker::synchronize(Serializer &s) {
151 	Speaker::synchronize(s);
152 
153 	SYNC_POINTER(_object2);
154 	s.syncAsSint16LE(_speakerMode);
155 	s.syncAsSint16LE(_fieldF8);
156 	s.syncAsSint16LE(_displayMode);
157 	s.syncAsSint16LE(_soundId);
158 	s.syncAsByte(_removeObject);
159 	s.syncAsSint16LE(_numFrames);
160 	s.syncAsSint16LE(_delayAmount);
161 	s.syncAsUint32LE(_frameNumber);
162 	s.syncAsSint16LE(_voiceDelayAmount);
163 	s.syncAsUint32LE(_voiceFrameNumber);
164 }
165 
setText(const Common::String & msg)166 void VisualSpeaker::setText(const Common::String &msg) {
167 	_sceneText.remove();
168 
169 	// Position the text depending on the specified display mode
170 	switch (_displayMode) {
171 	case 2:
172 		_textPos = Common::Point(60, 20);
173 		break;
174 	case 3:
175 		_textPos = Common::Point(110, 20);
176 		break;
177 	case 4:
178 		_textPos = Common::Point(10, 100);
179 		break;
180 	case 5:
181 		_textPos = Common::Point(60, 100);
182 		break;
183 	case 6:
184 		_textPos = Common::Point(110, 100);
185 		break;
186 	case 7:
187 		_textPos = Common::Point(170, 20);
188 		break;
189 	case 8:
190 		_textPos = Common::Point(170, 100);
191 		break;
192 	case 9:
193 		_textPos = Common::Point(330, 20);
194 		break;
195 	default:
196 		_textPos = Common::Point(10, 20);
197 		break;
198 	}
199 
200 	// Check if the message starts with a '!'. If so, it indicates a speech resource Id to be played,
201 	// in which case extract the resource number from the message.
202 	_soundId = 0;
203 	Common::String s = msg;
204 	if (s.hasPrefix("!")) {
205 		s.deleteChar(0);
206 		_soundId = atoi(s.c_str());
207 
208 		while (!s.empty() && (*s.c_str() >= '0' && *s.c_str() <= '9'))
209 			s.deleteChar(0);
210 	}
211 
212 	// Set up the text details
213 	_sceneText._color1 = _color1;
214 	_sceneText._color2 = _color2;
215 	_sceneText._color3 = _color3;
216 	_sceneText._width = _textWidth;
217 	_sceneText._fontNumber = _fontNumber;
218 	_sceneText._textMode = _textMode;
219 	_sceneText.setup(s);
220 
221 	_sceneText.setPosition(_textPos);
222 	_sceneText.fixPriority(256);
223 
224 	// If subtitles are turned off, don't show the text
225 	if ((R2_GLOBALS._speechSubtitles & SPEECH_VOICE) &&
226 			!(R2_GLOBALS._speechSubtitles & SPEECH_TEXT)) {
227 		_sceneText.hide();
228 	}
229 
230 	// Figure out the text delay if subtitles are turned on, or there's no speech resource specified
231 	if ((R2_GLOBALS._speechSubtitles & SPEECH_TEXT) || !_soundId) {
232 		const char *msgP = s.c_str();
233 		int numWords = 0;
234 		while (*msgP != '\0') {
235 			if (*msgP++ == ' ')
236 				++numWords;
237 		}
238 
239 		if (!numWords && !s.empty())
240 			++numWords;
241 
242 		_numFrames = numWords * 30 + 120;
243 		setDelay(_numFrames);
244 	} else {
245 		_numFrames = 1;
246 	}
247 
248 	// If the text is empty, no delay is needed
249 	if (s.empty())
250 		_numFrames = 0;
251 
252 	if (_speakerMode) {
253 		if ((R2_GLOBALS._speechSubtitles & SPEECH_TEXT) || !_soundId)
254 			_sceneText.hide();
255 	} else {
256 		if ((R2_GLOBALS._speechSubtitles & SPEECH_VOICE) && _soundId) {
257 			if (!R2_GLOBALS._playStream.play(_soundId, NULL)) {
258 				// Couldn't play voice, so fall back on showing text
259 				_sceneText.show();
260 			} else {
261 				_numFrames = 2;
262 				_soundId = 0;
263 			}
264 		}
265 	}
266 }
267 
stopSpeaking()268 void VisualSpeaker::stopSpeaking() {
269 	R2_GLOBALS._playStream.stop();
270 	_speakerMode = 0;
271 	_object1.remove();
272 
273 	if (_object2)
274 		_object2->show();
275 	_object2 = NULL;
276 	_fieldF8 = 0;
277 }
278 
setFrame(int numFrames)279 void VisualSpeaker::setFrame(int numFrames) {
280 	_delayAmount = numFrames;
281 	_frameNumber = R2_GLOBALS._events.getFrameNumber();
282 }
283 
setVoiceFrame(int numFrames)284 void VisualSpeaker::setVoiceFrame(int numFrames) {
285 	_voiceDelayAmount = numFrames;
286 	_voiceFrameNumber = R2_GLOBALS._events.getFrameNumber();
287 }
288 
setDelay(int delay)289 void VisualSpeaker::setDelay(int delay) {
290 	_delayAmount = delay;
291 	_frameNumber = R2_GLOBALS._events.getFrameNumber();
292 }
293 
294 //----------------------------------------------------------------------------
295 
SpeakerGameText()296 SpeakerGameText::SpeakerGameText(): VisualSpeaker() {
297 	_speakerName = "GAMETEXT";
298 	_color1 = 8;
299 	_color2 = 0;
300 	_textWidth = 300;
301 	_hideObjects = false;
302 	_object2 = NULL;
303 }
304 
305 //----------------------------------------------------------------------------
306 // Classes related to CAPTAIN
307 //----------------------------------------------------------------------------
308 
SpeakerCaptain3210()309 SpeakerCaptain3210::SpeakerCaptain3210() {
310 	_speakerName = "Captain";
311 	_color1 = 5;
312 	_color2 = 0;
313 	_speakerMode = 0;
314 	_textWidth = 300;
315 	_hideObjects = false;
316 	_object2 = NULL;
317 	_displayMode = 1;
318 	_numFrames = 0;
319 }
320 
animateSpeaker()321 void SpeakerCaptain3210::animateSpeaker() {
322 	int v = _speakerMode;
323 	Scene3210 *scene = (Scene3210 *)R2_GLOBALS._sceneManager._scene;
324 
325 	if (!_object2) {
326 		_object2 = &scene->_captain;
327 		_object2->hide();
328 		_object1.postInit();
329 		_object1.setPosition(_object2->_position);
330 
331 		if (_object2->_mover)
332 			_object2->addMover(NULL);
333 	}
334 
335 	if (v == 0) {
336 		_object1.animate(ANIM_MODE_2, NULL);
337 	} else {
338 		((StripManager *)_action)->_useless = 0;
339 
340 		_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
341 		_object1.animate(ANIM_MODE_5, this);
342 	}
343 }
344 
345 //----------------------------------------------------------------------------
346 // Classes related to CARETAKER
347 //----------------------------------------------------------------------------
348 
SpeakerCaretaker2450()349 SpeakerCaretaker2450::SpeakerCaretaker2450() {
350 	_speakerName = "CARETAKER";
351 	_color1 = 43;
352 	_color2 = 0;
353 	_speakerMode = 0;
354 	_textWidth = 300;
355 	_hideObjects = false;
356 	_object2 = NULL;
357 	_displayMode = 1;
358 	_numFrames = 0;
359 }
360 
361 //----------------------------------------------------------------------------
362 // Classes related to CHIEF
363 //----------------------------------------------------------------------------
364 
SpeakerChief1100()365 SpeakerChief1100::SpeakerChief1100() {
366 	_speakerName = "CHIEF";
367 	_color1 = 8;
368 	_color2 = 0;
369 	_speakerMode = 0;
370 	_textWidth = 300;
371 	_hideObjects = false;
372 	_object2 = NULL;
373 	_displayMode = 1;
374 	_numFrames = 0;
375 }
376 
animateSpeaker()377 void SpeakerChief1100::animateSpeaker() {
378 	int v = _speakerMode;
379 	Scene1100 *scene = (Scene1100 *)R2_GLOBALS._sceneManager._scene;
380 
381 	if (!_object2) {
382 		_object2 = &scene->_chief;
383 		_object2->hide();
384 		_object1.postInit();
385 		_object1.setPosition(_object2->_position);
386 		_object1._numFrames = 7;
387 
388 		if (_object2->_mover)
389 			_object2->addMover(NULL);
390 	}
391 
392 	switch (v) {
393 	case 0:
394 		_object1.animate(ANIM_MODE_2, NULL);
395 		break;
396 	case 1:
397 		((StripManager *)_action)->_useless = 0;
398 
399 		_object1.setup(4080, 1, 1);
400 		_object1.animate(ANIM_MODE_5, this);
401 		break;
402 	case 2:
403 		((StripManager *)_action)->_useless = 0;
404 
405 		_object1.setup(4080, 3, 1);
406 		_object1.animate(ANIM_MODE_5, this);
407 		break;
408 	case 100:
409 		_numFrames = 0;
410 		((StripManager *)_action)->_useless = 0;
411 
412 		_object1.setStrip(_object1._strip - 1);
413 		_object1.setFrame(_object1.getFrameCount());
414 		_object1.animate(ANIM_MODE_6, this);
415 		break;
416 	default:
417 		signal();
418 		break;
419 	}
420 }
421 
422 //----------------------------------------------------------------------------
423 // Classes related to GUARD
424 //----------------------------------------------------------------------------
425 
SpeakerGuard()426 SpeakerGuard::SpeakerGuard() {
427 	_speakerName = "GUARD";
428 	_color1 = 5;
429 	_color2 = 0;
430 	_speakerMode = 0;
431 	_textWidth = 300;
432 	_hideObjects = false;
433 	_object2 = NULL;
434 	_displayMode = 1;
435 	_numFrames = 0;
436 }
437 
animateSpeaker()438 void SpeakerGuard2800::animateSpeaker() {
439 	int v = _speakerMode;
440 	Scene2800 *scene = (Scene2800 *)R2_GLOBALS._sceneManager._scene;
441 
442 	if (!_object2) {
443 		_object2 = &scene->_guard;
444 		_object2->hide();
445 		_object1.postInit();
446 		_object1.setPosition(_object2->_position);
447 
448 		if (_object2->_mover)
449 			_object2->addMover(NULL);
450 	}
451 
452 	if (v == 0) {
453 		_object1.animate(ANIM_MODE_2, NULL);
454 	} else {
455 		((StripManager *)_action)->_useless = 0;
456 
457 		_object1.setZoom(75);
458 		_object1.setup(4060, 3, 1);
459 		_object1.animate(ANIM_MODE_5, this);
460 	}
461 }
462 
463 //----------------------------------------------------------------------------
464 // Classes related to JOCKO
465 //----------------------------------------------------------------------------
466 
SpeakerJocko()467 SpeakerJocko::SpeakerJocko() {
468 	_speakerName = "Jocko";
469 	_color1 = 45;
470 	_color2 = 0;
471 	_speakerMode = 0;
472 	_textWidth = 300;
473 	_hideObjects = false;
474 	_object2 = NULL;
475 	_displayMode = 1;
476 	_numFrames = 0;
477 }
478 
animateSpeaker()479 void SpeakerJocko3200::animateSpeaker() {
480 	int v = _speakerMode;
481 	Scene3200 *scene = (Scene3200 *)R2_GLOBALS._sceneManager._scene;
482 
483 	if (!_object2) {
484 		_object2 = &scene->_jocko;
485 		_object2->hide();
486 		_object1.postInit();
487 		_object1.setPosition(_object2->_position);
488 
489 		if (_object2->_mover)
490 			_object2->addMover(NULL);
491 	}
492 
493 	if (v == 0) {
494 		_object1.animate(ANIM_MODE_2, NULL);
495 	} else {
496 		((StripManager *)_action)->_useless = 0;
497 
498 		_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
499 		_object1.animate(ANIM_MODE_5, this);
500 	}
501 }
502 
animateSpeaker()503 void SpeakerJocko3220::animateSpeaker() {
504 	int v = _speakerMode;
505 	Scene3220 *scene = (Scene3220 *)R2_GLOBALS._sceneManager._scene;
506 
507 	if (!_object2) {
508 		_object2 = &scene->_jocko;
509 		_object2->hide();
510 		_object1.postInit();
511 		_object1.setPosition(_object2->_position);
512 
513 		if (_object2->_mover)
514 			_object2->addMover(NULL);
515 	}
516 
517 	if (v == 0) {
518 		_object1.animate(ANIM_MODE_2, NULL);
519 	} else {
520 		((StripManager *)_action)->_useless = 0;
521 
522 		_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
523 		_object1.animate(ANIM_MODE_5, this);
524 	}
525 }
526 
animateSpeaker()527 void SpeakerJocko3230::animateSpeaker() {
528 	int v = _speakerMode;
529 	Scene3230 *scene = (Scene3230 *)R2_GLOBALS._sceneManager._scene;
530 
531 	if (!_object2) {
532 		_object2 = &scene->_jocko;
533 		_object2->hide();
534 		_object1.postInit();
535 		_object1.setPosition(_object2->_position);
536 
537 		if (_object2->_mover)
538 			_object2->addMover(NULL);
539 	}
540 
541 	if (v == 0) {
542 		_object1.animate(ANIM_MODE_2, NULL);
543 	} else {
544 		((StripManager *)_action)->_useless = 0;
545 
546 		_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
547 		_object1.animate(ANIM_MODE_5, this);
548 	}
549 }
550 
551 //----------------------------------------------------------------------------
552 // Classes related to MIRANDA
553 //----------------------------------------------------------------------------
554 
SpeakerMiranda()555 SpeakerMiranda::SpeakerMiranda(): VisualSpeaker() {
556 	_speakerName = "MIRANDA";
557 	_color1 = 154;
558 	_color2 = 0;
559 	_speakerMode = 0;
560 	_textWidth = 300;
561 	_hideObjects = false;
562 	_object2 = NULL;
563 	_displayMode = 1;
564 	_numFrames = 0;
565 }
566 
animateSpeaker()567 void SpeakerMiranda300::animateSpeaker() {
568 	int v = _speakerMode;
569 
570 	if (!_object2) {
571 		if (R2_GLOBALS._player._characterIndex == R2_MIRANDA) {
572 			_object2 = &R2_GLOBALS._player;
573 		} else {
574 			Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
575 			_object2 = &scene->_miranda;
576 		}
577 
578 		_object2->hide();
579 		_object1.postInit();
580 		_object1.setPosition(_object2->_position);
581 
582 		if (_object2->_mover)
583 			_object2->addMover(NULL);
584 	}
585 
586 	if (v == 0) {
587 		_object1.animate(ANIM_MODE_2, NULL);
588 	} else if (v == 100) {
589 		_numFrames = 0;
590 		((StripManager *)_action)->_useless = 0;
591 
592 		_object1.setStrip(_object1._strip - 1);
593 		_object1.setFrame(_object1.getFrameCount());
594 		_object1.animate(ANIM_MODE_6, this);
595 	} else {
596 		((StripManager *)_action)->_useless = 0;
597 
598 		if (v == 4) {
599 			_object1.setup(304, 5, 1);
600 		} else {
601 			_object1.setup(305, v * 2 - 1, 1);
602 		}
603 		_object1.animate(ANIM_MODE_5, this);
604 	}
605 }
606 
animateSpeaker()607 void SpeakerMiranda1625::animateSpeaker() {
608 	int v = _speakerMode;
609 
610 	if (!_object2) {
611 		Scene1625 *scene = (Scene1625 *)R2_GLOBALS._sceneManager._scene;
612 		_object2 = &scene->_mirandaMouth;
613 		_object2->hide();
614 		_object1.postInit();
615 		_object1.setPosition(Common::Point(196, 65));
616 
617 		if (_object2->_mover)
618 			_object2->addMover(NULL);
619 	}
620 
621 	if (v == 0) {
622 		_object1.animate(ANIM_MODE_2, NULL);
623 	} else {
624 		((StripManager *)_action)->_useless = 0;
625 
626 		_object1.setup(1627, 3, 1);
627 		_object1.animate(ANIM_MODE_5, this);
628 	}
629 }
630 
animateSpeaker()631 void SpeakerMiranda3255::animateSpeaker() {
632 	int v = _speakerMode;
633 
634 	if (!_object2) {
635 		_object2 = &R2_GLOBALS._player;
636 		_object2->hide();
637 		_object1.postInit();
638 		_object1._effect = _object2->_effect;
639 		_object1._shade = _object2->_shade;
640 		_object1.setPosition(_object2->_position);
641 	}
642 
643 	if (v == 0) {
644 		_object1.animate(ANIM_MODE_2, NULL);
645 	} else {
646 		((StripManager *)_action)->_useless = 0;
647 
648 		_object1.setup(3257, 5, 1);
649 		_object1.animate(ANIM_MODE_5, this);
650 	}
651 }
652 
animateSpeaker()653 void SpeakerMiranda3375::animateSpeaker() {
654 	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
655 
656 	int v = _speakerMode;
657 
658 	if (!_object2) {
659 		if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
660 			_object2 = &R2_GLOBALS._player;
661 		else
662 			_object2 = &scene->_companion2;
663 
664 		_object2->hide();
665 		_object1.postInit();
666 		_object1.setPosition(_object2->_position);
667 		_object1._numFrames = 7;
668 		_object1._effect = EFFECT_SHADED;
669 		_object1.changeZoom(-1);
670 
671 		if (scene->_companion1._position.y != 163)
672 			R2_GLOBALS._player.setStrip(8);
673 		else
674 			R2_GLOBALS._player.setStrip(2);
675 
676 		R2_GLOBALS._player.disableControl();
677 
678 		if (R2_GLOBALS._player._mover)
679 			R2_GLOBALS._player.addMover(NULL);
680 
681 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
682 
683 		if (_object2->_mover)
684 			_object2->addMover(NULL);
685 	}
686 
687 
688 	switch (v) {
689 	case 0:
690 		_object1.animate(ANIM_MODE_2, NULL);
691 		break;
692 	case 1:
693 		((StripManager *)_action)->_useless = 0;
694 
695 		_object1.setup(4051, 5, 1);
696 		_object1.animate(ANIM_MODE_5, this);
697 		break;
698 	default:
699 		signal();
700 		break;
701 	}
702 }
703 
animateSpeaker()704 void SpeakerMiranda3385::animateSpeaker() {
705 	Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
706 
707 	int v = _speakerMode;
708 
709 	if (!_object2) {
710 		if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
711 			_object2 = &R2_GLOBALS._player;
712 		else
713 			_object2 = &scene->_companion2;
714 
715 		_object2->hide();
716 		_object1.postInit();
717 		_object1.setPosition(_object2->_position);
718 		_object1._numFrames = 7;
719 		_object1._effect = EFFECT_SHADED;
720 		_object1.changeZoom(-1);
721 
722 		if (R2_GLOBALS._sceneManager._previousScene == 3375)
723 			R2_GLOBALS._player.setStrip(4);
724 		else
725 			R2_GLOBALS._player.setStrip(3);
726 
727 		if (R2_GLOBALS._player._mover)
728 			R2_GLOBALS._player.addMover(NULL);
729 
730 		R2_GLOBALS._player.disableControl(CURSOR_TALK);
731 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
732 
733 		if (_object2->_mover)
734 			_object2->addMover(NULL);
735 	}
736 
737 
738 	switch (v) {
739 	case 0:
740 		_object1.animate(ANIM_MODE_2, NULL);
741 		break;
742 	case 1:
743 		((StripManager *)_action)->_useless = 0;
744 
745 		_object1.setup(4051, 5, 1);
746 		_object1.animate(ANIM_MODE_5, this);
747 		break;
748 	default:
749 		signal();
750 		break;
751 	}
752 }
753 
animateSpeaker()754 void SpeakerMiranda3395::animateSpeaker() {
755 	Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
756 
757 	int v = _speakerMode;
758 
759 	if (!_object2) {
760 		if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
761 			_object2 = &R2_GLOBALS._player;
762 		else
763 			_object2 = &scene->_companion2;
764 
765 		_object2->hide();
766 		_object1.postInit();
767 		_object1.setPosition(_object2->_position);
768 		_object1._numFrames = 7;
769 		_object1._effect = EFFECT_SHADED;
770 		_object1.changeZoom(-1);
771 
772 		if (R2_GLOBALS._sceneManager._previousScene == 3385)
773 			R2_GLOBALS._player.setStrip(4);
774 		else
775 			R2_GLOBALS._player.setStrip(3);
776 
777 		R2_GLOBALS._player.disableControl(CURSOR_TALK);
778 
779 		if (R2_GLOBALS._player._mover)
780 			R2_GLOBALS._player.addMover(NULL);
781 
782 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
783 
784 		if (_object2->_mover)
785 			_object2->addMover(NULL);
786 	}
787 
788 
789 	switch (v) {
790 	case 0:
791 		_object1.animate(ANIM_MODE_2, NULL);
792 		break;
793 	case 1:
794 		((StripManager *)_action)->_useless = 0;
795 
796 		_object1.setup(4051, 5, 1);
797 		_object1.animate(ANIM_MODE_5, this);
798 		break;
799 	default:
800 		signal();
801 		break;
802 	}
803 }
804 
animateSpeaker()805 void SpeakerMiranda3400::animateSpeaker() {
806 	Scene3400 *scene = (Scene3400 *)R2_GLOBALS._sceneManager._scene;
807 
808 	int v = _speakerMode;
809 
810 	if (!_object2) {
811 		if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
812 			_object2 = &R2_GLOBALS._player;
813 		else
814 			_object2 = &scene->_companion2;
815 
816 		_object2->hide();
817 		_object1.postInit();
818 		_object1.setPosition(_object2->_position);
819 		_object1._numFrames = 7;
820 		_object1._effect = EFFECT_SHADED;
821 		_object1.changeZoom(-1);
822 		R2_GLOBALS._player.disableControl();
823 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
824 
825 		if (_object2->_mover)
826 			_object2->addMover(NULL);
827 	}
828 
829 	switch (v) {
830 	case 0:
831 		_object1.animate(ANIM_MODE_2, NULL);
832 		break;
833 	case 1:
834 		((StripManager *)_action)->_useless = 0;
835 
836 		_object1.setup(4051, 5, 1);
837 		_object1.animate(ANIM_MODE_5, this);
838 		break;
839 	case 2:
840 		((StripManager *)_action)->_useless = 0;
841 
842 		_object1.setup(4050, 3, 1);
843 		_object1.animate(ANIM_MODE_5, this);
844 		break;
845 	default:
846 		signal();
847 		break;
848 	}
849 }
850 
animateSpeaker()851 void SpeakerMiranda3600::animateSpeaker() {
852 	Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
853 
854 	int v = _speakerMode;
855 
856 	if (!_object2) {
857 		if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
858 			_object2 = &R2_GLOBALS._player;
859 		else
860 			_object2 = &scene->_miranda;
861 
862 		_object2->hide();
863 		_object1.postInit();
864 		_object1.setPosition(_object2->_position);
865 		_object1._numFrames = 7;
866 		_object1._effect = EFFECT_SHADED;
867 		_object1.changeZoom(-1);
868 		R2_GLOBALS._player.disableControl();
869 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
870 
871 		if (_object2->_mover)
872 			_object2->addMover(NULL);
873 
874 		_object1.setPosition(_object2->_position);
875 	}
876 
877 	switch (v) {
878 	case 0:
879 		_object1.animate(ANIM_MODE_2, NULL);
880 		break;
881 	case 1:
882 		((StripManager *)_action)->_useless = 0;
883 
884 		_object1.setup(4051, 1, 1);
885 		_object1.animate(ANIM_MODE_5, this);
886 		break;
887 	case 2:
888 		((StripManager *)_action)->_useless = 0;
889 
890 		_object1.setup(4050, 1, 1);
891 		_object1.animate(ANIM_MODE_5, this);
892 		break;
893 	default:
894 		signal();
895 		break;
896 	}
897 }
898 
animateSpeaker()899 void SpeakerMiranda3700::animateSpeaker() {
900 	Scene3700 *scene = (Scene3700 *)R2_GLOBALS._sceneManager._scene;
901 
902 	int v = _speakerMode;
903 
904 	if (!_object2) {
905 		_object2 = &scene->_miranda;
906 		_object2->hide();
907 		_object1.postInit();
908 		_object1.setPosition(_object2->_position);
909 		_object1._numFrames = 7;
910 		R2_GLOBALS._player.disableControl();
911 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
912 
913 		if (_object2->_mover)
914 			_object2->addMover(NULL);
915 	}
916 
917 	_object1.setPosition(_object2->_position);
918 
919 	switch (v) {
920 	case 0:
921 		_object1.animate(ANIM_MODE_2, NULL);
922 		break;
923 	case 1:
924 		((StripManager *)_action)->_useless = 0;
925 
926 		scene->_quinn.setup(10, 6, 1);
927 		scene->_seeker.setup(20, 5, 1);
928 		_object2->setup(30, 1, 1);
929 		scene->_webbster.setup(40, 1, 1);
930 		_object1.setup(4050, 5, 1);
931 		_object1.animate(ANIM_MODE_5, this);
932 		break;
933 	case 2:
934 		((StripManager *)_action)->_useless = 0;
935 
936 		scene->_miranda.setup(30, 8, 1);
937 		_object1.setup(4052, 3, 1);
938 		_object1.animate(ANIM_MODE_5, this);
939 		break;
940 	case 3:
941 		((StripManager *)_action)->_useless = 0;
942 
943 		scene->_seeker.setup(20, 1, 1);
944 		scene->_miranda.setup(30, 1, 1);
945 		_object1.setup(4051, 7, 1);
946 		_object1.animate(ANIM_MODE_5, this);
947 		break;
948 	default:
949 		signal();
950 		break;
951 	}
952 }
953 
954 //----------------------------------------------------------------------------
955 // Classes related to NEJ
956 //----------------------------------------------------------------------------
957 
SpeakerNej()958 SpeakerNej::SpeakerNej() {
959 	_speakerName = "NEJ";
960 	_color1 = 171;
961 	_color2 = 0;
962 	_speakerMode = 0;
963 	_textWidth = 300;
964 	_hideObjects = false;
965 	_object2 = NULL;
966 	_displayMode = 1;
967 	_numFrames = 0;
968 }
969 
animateSpeaker()970 void SpeakerNej2700::animateSpeaker() {
971 	int v = _speakerMode;
972 	Scene2700 *scene = (Scene2700 *)R2_GLOBALS._sceneManager._scene;
973 
974 	if (!_object2) {
975 		_object2 = &scene->_nej;
976 		_object2->hide();
977 		_object1.postInit();
978 		_object1.setPosition(_object2->_position);
979 
980 		if (_object2->_mover)
981 			_object2->addMover(NULL);
982 	}
983 
984 	if (v == 0) {
985 		_object1.animate(ANIM_MODE_2, NULL);
986 	} else {
987 		((StripManager *)_action)->_useless = 0;
988 
989 		switch (_object2->_visage) {
990 		case 2701:
991 			_object1.setup(4022, 3, 1);
992 			_object1.setPosition(Common::Point(164, 163));
993 			_object2->setPosition(Common::Point(-10, -10));
994 			break;
995 		case 2705:
996 			_object1.setup(4022, 7, 1);
997 			_object1.fixPriority(162);
998 			break;
999 		default:
1000 			break;
1001 		}
1002 		_object1.animate(ANIM_MODE_5, this);
1003 	}
1004 }
1005 
animateSpeaker()1006 void SpeakerNej2750::animateSpeaker() {
1007 	int v = _speakerMode;
1008 	Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
1009 
1010 	if (!_object2) {
1011 		_object2 = &scene->_nej;
1012 		_object2->hide();
1013 		_object1.postInit();
1014 		_object1.setPosition(_object2->_position);
1015 
1016 		if (_object2->_mover)
1017 			_object2->addMover(NULL);
1018 	}
1019 
1020 	if (v == 0) {
1021 		_object1.animate(ANIM_MODE_2, NULL);
1022 	} else {
1023 		((StripManager *)_action)->_useless = 0;
1024 
1025 		switch (_object2->_visage) {
1026 		case 2705:
1027 			_object1.setup(4022, 7, 1);
1028 			break;
1029 		case 2752:
1030 			_object1.setup(2752, 1, 1);
1031 			break;
1032 		default:
1033 			break;
1034 		}
1035 		_object1.animate(ANIM_MODE_5, this);
1036 	}
1037 }
1038 
animateSpeaker()1039 void SpeakerNej2800::animateSpeaker() {
1040 	int v = _speakerMode;
1041 	Scene2800 *scene = (Scene2800 *)R2_GLOBALS._sceneManager._scene;
1042 
1043 	if (!_object2) {
1044 		_object2 = &scene->_nej;
1045 		_object2->hide();
1046 		_object1.postInit();
1047 		_object1.setPosition(_object2->_position);
1048 
1049 		if (_object2->_mover)
1050 			_object2->addMover(NULL);
1051 	}
1052 
1053 	if (v == 0) {
1054 		_object1.animate(ANIM_MODE_2, NULL);
1055 	} else {
1056 		((StripManager *)_action)->_useless = 0;
1057 
1058 		_object1.setup(4023, 3, 1);
1059 		if (_object2->_visage == 2801)
1060 			_object1.setPosition(Common::Point(_object2->_position.x - 12, _object2->_position.y));
1061 		_object1.animate(ANIM_MODE_5, this);
1062 	}
1063 }
1064 
1065 //----------------------------------------------------------------------------
1066 // Classes related to PHARISHA
1067 //----------------------------------------------------------------------------
1068 
SpeakerPharisha()1069 SpeakerPharisha::SpeakerPharisha(): VisualSpeaker() {
1070 	_speakerName = "PHARISHA";
1071 	_color1 = 151;
1072 	_color2 = 0;
1073 	_speakerMode = 0;
1074 	_textWidth = 300;
1075 	_hideObjects = false;
1076 	_object2 = NULL;
1077 	_displayMode = 1;
1078 	_numFrames = 0;
1079 }
1080 
animateSpeaker()1081 void SpeakerPharisha2435::animateSpeaker() {
1082 	int v = _speakerMode;
1083 	Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene;
1084 
1085 	if (!_object2) {
1086 		_object2 = &scene->_astor;
1087 		_object2->hide();
1088 		_object1.postInit();
1089 		_object1.setPosition(_object2->_position);
1090 	}
1091 
1092 	if (v == 0) {
1093 		_object1.animate(ANIM_MODE_2, NULL);
1094 	} else {
1095 		((StripManager *)_action)->_useless = 0;
1096 
1097 		_object1.setup(4098, 5, 1);
1098 		_object1.animate(ANIM_MODE_5, this);
1099 	}
1100 }
1101 
1102 //----------------------------------------------------------------------------
1103 // Classes related to PRIVATE
1104 //----------------------------------------------------------------------------
1105 
SpeakerPrivate3210()1106 SpeakerPrivate3210::SpeakerPrivate3210() {
1107 	_speakerName = "Private";
1108 	_color1 = 45;
1109 	_color2 = 0;
1110 	_speakerMode = 0;
1111 	_textWidth = 300;
1112 	_hideObjects = false;
1113 	_object2 = NULL;
1114 	_displayMode = 1;
1115 	_numFrames = 0;
1116 }
1117 
animateSpeaker()1118 void SpeakerPrivate3210::animateSpeaker() {
1119 	int v = _speakerMode;
1120 	Scene3210 *scene = (Scene3210 *)R2_GLOBALS._sceneManager._scene;
1121 
1122 	if (!_object2) {
1123 		_object2 = &scene->_private;
1124 		_object2->hide();
1125 		_object1.postInit();
1126 		_object1.setPosition(_object2->_position);
1127 
1128 		if (_object2->_mover)
1129 			_object2->addMover(NULL);
1130 	}
1131 
1132 	if (v == 0) {
1133 		_object1.animate(ANIM_MODE_2, NULL);
1134 	} else {
1135 		((StripManager *)_action)->_useless = 0;
1136 
1137 		_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
1138 		_object1.animate(ANIM_MODE_5, this);
1139 	}
1140 }
1141 
1142 //----------------------------------------------------------------------------
1143 // Classes related to PROTECTOR
1144 //----------------------------------------------------------------------------
1145 
SpeakerProtector3600()1146 SpeakerProtector3600::SpeakerProtector3600() {
1147 	_speakerName = "Protector";
1148 	_color1 = 170;
1149 	_color2 = 0;
1150 	_speakerMode = 0;
1151 	_textWidth = 300;
1152 	_hideObjects = false;
1153 	_object2 = NULL;
1154 	_displayMode = 7;
1155 	_numFrames = 0;
1156 }
1157 
animateSpeaker()1158 void SpeakerProtector3600::animateSpeaker() {
1159 	int v = _speakerMode;
1160 	Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
1161 
1162 	if (!_object2) {
1163 		_object2 = &scene->_protector;
1164 		_object2->hide();
1165 		_object1.postInit();
1166 		_object1.setPosition(_object2->_position);
1167 		_object1._numFrames = 7;
1168 		_object1._effect = EFFECT_SHADED;
1169 		_object1.changeZoom(-1);
1170 
1171 		R2_GLOBALS._player.disableControl();
1172 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
1173 
1174 		if (_object2->_mover)
1175 			_object2->addMover(NULL);
1176 	}
1177 
1178 	_object1.setPosition(_object2->_position);
1179 
1180 	switch (v) {
1181 	case 0:
1182 		_object1.animate(ANIM_MODE_2, NULL);
1183 		break;
1184 	case 1:
1185 		((StripManager *)_action)->_useless = 0;
1186 
1187 		if (scene->_sceneMode != 3324) {
1188 			_object1.setup(4125, 3, 1);
1189 			_object1.animate(ANIM_MODE_5, this);
1190 		} else {
1191 			_object1.setup(3258, 6, 1);
1192 			_object1.animate(ANIM_MODE_2, NULL);
1193 			_object1.hide();
1194 			_object2->setup(3258, 6, 1);
1195 			_object2->show();
1196 		}
1197 		break;
1198 	default:
1199 		signal();
1200 		break;
1201 	}
1202 }
1203 
1204 //----------------------------------------------------------------------------
1205 // Classes related to QUINN
1206 //----------------------------------------------------------------------------
1207 
SpeakerQuinn()1208 SpeakerQuinn::SpeakerQuinn(): VisualSpeaker() {
1209 	_speakerName = "QUINN";
1210 	_color1 = 60;
1211 	_color2 = 0;
1212 	_speakerMode = 0;
1213 	_textWidth = 300;
1214 	_hideObjects = false;
1215 	_object2 = NULL;
1216 	_displayMode = 1;
1217 	_numFrames = 0;
1218 }
1219 
animateSpeaker()1220 void SpeakerQuinn300::animateSpeaker() {
1221 	int v = _speakerMode;
1222 
1223 	if (!_object2) {
1224 		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
1225 			_object2 = &R2_GLOBALS._player;
1226 		} else {
1227 			assert(R2_GLOBALS._sceneManager._sceneNumber == 300);
1228 			Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
1229 			_object2 = &scene->_quinn;
1230 		}
1231 
1232 		_object2->hide();
1233 		_object1.postInit();
1234 		_object1.setPosition(_object2->_position);
1235 	}
1236 
1237 	if (v == 0) {
1238 		_object1.animate(ANIM_MODE_2, NULL);
1239 	} else if (v == 100) {
1240 		_numFrames = 0;
1241 		((StripManager *)_action)->_useless = 0;
1242 
1243 		_object1.setStrip(_object1._strip - 1);
1244 		_object1.setFrame(_object1.getFrameCount());
1245 		_object1.animate(ANIM_MODE_6, this);
1246 	} else {
1247 		((StripManager *)_action)->_useless = 0;
1248 
1249 		switch (_object2->_visage) {
1250 		case 10:
1251 			_object1.setup((v - 1) / 4 + 4010, ((v - ((v - 1) / 4 * 4) - 1) % 8) * 2 + 1, 1);
1252 			break;
1253 		case 302:
1254 			_object1.setup(308, (v - 1) % 8 + 1, 1);
1255 			break;
1256 		case 308:
1257 			_object1.setup(308, 5, 1);
1258 			break;
1259 		default:
1260 			break;
1261 		}
1262 
1263 		_object1.animate(ANIM_MODE_5, this);
1264 	}
1265 }
1266 
animateSpeaker()1267 void SpeakerQuinn500::animateSpeaker() {
1268 	int v = _speakerMode;
1269 
1270 	if (!_object2) {
1271 		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
1272 			_object2 = &R2_GLOBALS._player;
1273 		} else {
1274 			assert(R2_GLOBALS._sceneManager._sceneNumber == 500);
1275 			Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
1276 			_object2 = &scene->_seeker;
1277 		}
1278 
1279 		_object2->hide();
1280 
1281 		_object1.postInit();
1282 		_object1._effect = _object2->_effect;
1283 		_object1._shade = _object2->_shade;
1284 		_object1.setPosition(_object2->_position);
1285 
1286 		if (_object2->_mover)
1287 			_object2->addMover(NULL);
1288 	}
1289 
1290 	if (v == 0) {
1291 		_object1.animate(ANIM_MODE_2, NULL);
1292 	} else {
1293 		((StripManager *)_action)->_useless = 0;
1294 
1295 		switch (_object2->_visage) {
1296 		case 10:
1297 			_object1.setup(4021, (v == 1) ? 5 : 7, 1);
1298 			break;
1299 
1300 		case 1500:
1301 			_object1.setup(4021, (v == 1) ? 1 : 3, 1);
1302 			break;
1303 
1304 		default:
1305 			break;
1306 		}
1307 
1308 		_object1.animate(ANIM_MODE_5, this);
1309 	}
1310 }
1311 
animateSpeaker()1312 void SpeakerQuinn1100::animateSpeaker() {
1313 	int v = _speakerMode;
1314 
1315 	if (!_object2) {
1316 		if (v == 0)
1317 			return;
1318 
1319 		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
1320 			_object2 = &R2_GLOBALS._player;
1321 		} else {
1322 			assert(R2_GLOBALS._sceneManager._sceneNumber == 1100);
1323 			Scene1100 *scene = (Scene1100 *)R2_GLOBALS._sceneManager._scene;
1324 			_object2 = &scene->_seeker;
1325 		}
1326 
1327 		_object2->hide();
1328 		_object1.postInit();
1329 		_object1.setPosition(_object2->_position);
1330 		_object1._numFrames = 7;
1331 
1332 		if (_object2->_mover)
1333 			_object2->addMover(NULL);
1334 	}
1335 
1336 	switch (v) {
1337 	case 0:
1338 		_object1.animate(ANIM_MODE_2, NULL);
1339 		break;
1340 	case 1:
1341 		((StripManager *)_action)->_useless = 0;
1342 
1343 		_object1.setup(1108, 7, 1);
1344 		_object1.animate(ANIM_MODE_5, this);
1345 		break;
1346 	case 2:
1347 		((StripManager *)_action)->_useless = 0;
1348 
1349 		_object1.setup(1109, 1, 1);
1350 		_object1.animate(ANIM_MODE_5, this);
1351 		break;
1352 	case 3:
1353 		((StripManager *)_action)->_useless = 0;
1354 
1355 		_object1.setup(1109, 5, 1);
1356 		_object1.animate(ANIM_MODE_5, this);
1357 		break;
1358 	default:
1359 		signal();
1360 		break;
1361 	}
1362 }
1363 
animateSpeaker()1364 void SpeakerQuinn2435::animateSpeaker() {
1365 	int v = _speakerMode;
1366 
1367 	if (!_object2) {
1368 		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
1369 			_object2 = &R2_GLOBALS._player;
1370 		} else {
1371 			assert(R2_GLOBALS._sceneManager._sceneNumber == 2435);
1372 			Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene;
1373 			_object2 = &scene->_companion;
1374 		}
1375 
1376 		_object2->hide();
1377 		_object1.postInit();
1378 		_object1.setPosition(_object2->_position);
1379 	}
1380 
1381 	if (v == 0) {
1382 		_object1.animate(ANIM_MODE_2, NULL);
1383 	} else {
1384 		((StripManager *)_action)->_useless = 0;
1385 
1386 		_object2->setStrip(7);
1387 		_object1.setup(2020, 5, 1);
1388 		_object1.animate(ANIM_MODE_5, this);
1389 	}
1390 }
1391 
animateSpeaker()1392 void SpeakerQuinn2450::animateSpeaker() {
1393 	int v = _speakerMode;
1394 
1395 	if (!_object2) {
1396 		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
1397 			_object2 = &R2_GLOBALS._player;
1398 		} else {
1399 			assert(R2_GLOBALS._sceneManager._sceneNumber == 2435);
1400 			Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene;
1401 			_object2 = &scene->_companion;
1402 		}
1403 
1404 		_object2->hide();
1405 		_object1.postInit();
1406 		_object1.setPosition(_object2->_position);
1407 	}
1408 
1409 	if (v == 0) {
1410 		_object1.animate(ANIM_MODE_2, NULL);
1411 	} else {
1412 		((StripManager *)_action)->_useless = 0;
1413 
1414 		if (R2_GLOBALS.getFlag(61))
1415 			_object1.setup(2020, 3, 1);
1416 		else
1417 			_object1.setup(2020, 1, 1);
1418 		_object1.animate(ANIM_MODE_5, this);
1419 	}
1420 }
1421 
animateSpeaker()1422 void SpeakerQuinn2700::animateSpeaker() {
1423 	int v = _speakerMode;
1424 
1425 	if (!_object2) {
1426 		_object2 = &R2_GLOBALS._player;
1427 		_object2->hide();
1428 		_object1.postInit();
1429 		_object1.setPosition(_object2->_position);
1430 
1431 		if (_object2->_mover)
1432 			_object2->addMover(NULL);
1433 	}
1434 
1435 	if (v == 0) {
1436 		_object1.animate(ANIM_MODE_2, NULL);
1437 	} else {
1438 		((StripManager *)_action)->_useless = 0;
1439 
1440 		switch (_object2->_visage) {
1441 		case 19:
1442 			_object1.setup(4022, 5, 1);
1443 			break;
1444 		case 2701:
1445 			_object1.setup(4022, 1, 1);
1446 			break;
1447 		default:
1448 			break;
1449 		}
1450 		_object1.animate(ANIM_MODE_5, this);
1451 	}
1452 }
1453 
animateSpeaker()1454 void SpeakerQuinn2750::animateSpeaker() {
1455 	int v = _speakerMode;
1456 
1457 	if (!_object2) {
1458 		_object2 = &R2_GLOBALS._player;
1459 		_object2->hide();
1460 		_object1.postInit();
1461 		_object1.setPosition(_object2->_position);
1462 
1463 		if (_object2->_mover)
1464 			_object2->addMover(NULL);
1465 	}
1466 
1467 	if (v == 0) {
1468 		_object1.animate(ANIM_MODE_2, NULL);
1469 	} else {
1470 		((StripManager *)_action)->_useless = 0;
1471 
1472 		switch (_object2->_visage) {
1473 		case 19:
1474 			_object1.setup(4022, 5, 1);
1475 			break;
1476 		case 2752:
1477 			_object1.setup(2752, 3, 1);
1478 			break;
1479 		default:
1480 			break;
1481 		}
1482 		_object1.animate(ANIM_MODE_5, this);
1483 	}
1484 }
1485 
animateSpeaker()1486 void SpeakerQuinn2800::animateSpeaker() {
1487 	int v = _speakerMode;
1488 
1489 	if (!_object2) {
1490 		_object2 = &R2_GLOBALS._player;
1491 		_object2->hide();
1492 		_object1.postInit();
1493 		_object1.setPosition(_object2->_position);
1494 
1495 		if (_object2->_mover)
1496 			_object2->addMover(NULL);
1497 	}
1498 
1499 	if (v == 0) {
1500 		_object1.animate(ANIM_MODE_2, NULL);
1501 	} else {
1502 		((StripManager *)_action)->_useless = 0;
1503 
1504 		switch (_object2->_visage) {
1505 		case 16:
1506 			_object1.setZoom(75);
1507 			_object1.setup(4023, 5, 1);
1508 			break;
1509 		case 19:
1510 			_object1.setup(4023, 1, 1);
1511 			break;
1512 		case 3110:
1513 			_object1.setZoom(75);
1514 			if (_object2->_strip == 1)
1515 				_object1.setup(4061	, 1, 1);
1516 			else
1517 				_object1.setup(4061	, 3, 1);
1518 			break;
1519 		default:
1520 			break;
1521 		}
1522 		_object1.animate(ANIM_MODE_5, this);
1523 	}
1524 }
1525 
animateSpeaker()1526 void SpeakerQuinn3255::animateSpeaker() {
1527 	Scene3255 *scene = (Scene3255 *)R2_GLOBALS._sceneManager._scene;
1528 
1529 	int v = _speakerMode;
1530 
1531 	if (!_object2) {
1532 		_object2 = &scene->_quinn;
1533 		_object2->hide();
1534 		_object1.postInit();
1535 		_object1._effect = _object2->_effect;
1536 		_object1._shade = _object2->_shade;
1537 		_object1.setPosition(_object2->_position);
1538 	}
1539 
1540 	if (v == 0) {
1541 		_object1.animate(ANIM_MODE_2, NULL);
1542 	} else {
1543 		((StripManager *)_action)->_useless = 0;
1544 
1545 		_object1.setup(3257, 3, 1);
1546 		_object1.animate(ANIM_MODE_5, this);
1547 	}
1548 }
1549 
animateSpeaker()1550 void SpeakerQuinn3375::animateSpeaker() {
1551 	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
1552 
1553 	int v = _speakerMode;
1554 
1555 	if (!_object2) {
1556 		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
1557 			_object2 = &R2_GLOBALS._player;
1558 		else if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
1559 			_object2 = &scene->_companion1;
1560 		else
1561 			_object2 = &scene->_companion2;
1562 
1563 		_object2->hide();
1564 		_object1.postInit();
1565 		_object1.setPosition(_object2->_position);
1566 		_object1._numFrames = 7;
1567 		_object1._effect = EFFECT_SHADED;
1568 		_object1.changeZoom(-1);
1569 
1570 		if (scene->_companion1._position.y != 163)
1571 			R2_GLOBALS._player.setStrip(8);
1572 		else
1573 			R2_GLOBALS._player.setStrip(2);
1574 
1575 		if (R2_GLOBALS._player._mover)
1576 			R2_GLOBALS._player.addMover(NULL);
1577 
1578 		R2_GLOBALS._player.disableControl(CURSOR_TALK);
1579 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
1580 
1581 		if (_object2->_mover)
1582 			_object2->addMover(NULL);
1583 	}
1584 
1585 	switch (v) {
1586 	case 0:
1587 		_object1.animate(ANIM_MODE_2, NULL);
1588 		break;
1589 	case 1:
1590 		((StripManager *)_action)->_useless = 0;
1591 
1592 		_object1.setup(4010, 5, 1);
1593 		_object1.animate(ANIM_MODE_5, this);
1594 		break;
1595 	default:
1596 		signal();
1597 		break;
1598 	}
1599 }
1600 
animateSpeaker()1601 void SpeakerQuinn3385::animateSpeaker() {
1602 	Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
1603 
1604 	int v = _speakerMode;
1605 
1606 	if (!_object2) {
1607 		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
1608 			_object2 = &R2_GLOBALS._player;
1609 		else if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
1610 			_object2 = &scene->_companion1;
1611 		else
1612 			_object2 = &scene->_companion2;
1613 
1614 		_object2->hide();
1615 		_object1.postInit();
1616 		_object1.setPosition(_object2->_position);
1617 		_object1._numFrames = 7;
1618 		_object1._effect = EFFECT_SHADED;
1619 		_object1.changeZoom(-1);
1620 
1621 		if (R2_GLOBALS._sceneManager._previousScene == 3375)
1622 			R2_GLOBALS._player.setStrip(4);
1623 		else
1624 			R2_GLOBALS._player.setStrip(3);
1625 
1626 		if (R2_GLOBALS._player._mover)
1627 			R2_GLOBALS._player.addMover(NULL);
1628 
1629 		R2_GLOBALS._player.disableControl(CURSOR_TALK);
1630 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
1631 
1632 		if (_object2->_mover)
1633 			_object2->addMover(NULL);
1634 	}
1635 
1636 	switch (v) {
1637 	case 0:
1638 		_object1.animate(ANIM_MODE_2, NULL);
1639 		break;
1640 	case 1:
1641 		((StripManager *)_action)->_useless = 0;
1642 
1643 		if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
1644 			_object1.setup(4010, 3, 1);
1645 		else
1646 			_object1.setup(4010, 5, 1);
1647 
1648 		_object1.animate(ANIM_MODE_5, this);
1649 		break;
1650 	default:
1651 		signal();
1652 		break;
1653 	}
1654 }
1655 
animateSpeaker()1656 void SpeakerQuinn3395::animateSpeaker() {
1657 	Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
1658 
1659 	int v = _speakerMode;
1660 
1661 	if (!_object2) {
1662 		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
1663 			_object2 = &R2_GLOBALS._player;
1664 		else if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
1665 			_object2 = &scene->_companion1;
1666 		else
1667 			_object2 = &scene->_companion2;
1668 
1669 		_object2->hide();
1670 		_object1.postInit();
1671 		_object1.setPosition(_object2->_position);
1672 		_object1._numFrames = 7;
1673 		_object1._effect = EFFECT_SHADED;
1674 		_object1.changeZoom(-1);
1675 
1676 		if (R2_GLOBALS._sceneManager._previousScene == 3385)
1677 			R2_GLOBALS._player.setStrip(4);
1678 		else
1679 			R2_GLOBALS._player.setStrip(3);
1680 
1681 		if (R2_GLOBALS._player._mover)
1682 			R2_GLOBALS._player.addMover(NULL);
1683 
1684 		R2_GLOBALS._player.disableControl(CURSOR_TALK);
1685 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
1686 
1687 		if (_object2->_mover)
1688 			_object2->addMover(NULL);
1689 	}
1690 
1691 	switch (v) {
1692 	case 0:
1693 		_object1.animate(ANIM_MODE_2, NULL);
1694 		break;
1695 	case 1:
1696 		((StripManager *)_action)->_useless = 0;
1697 
1698 		if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
1699 			_object1.setup(4010, 3, 1);
1700 		else
1701 			_object1.setup(4010, 5, 1);
1702 
1703 		_object1.animate(ANIM_MODE_5, this);
1704 		break;
1705 	default:
1706 		signal();
1707 		break;
1708 	}
1709 }
1710 
animateSpeaker()1711 void SpeakerQuinn3400::animateSpeaker() {
1712 	Scene3400 *scene = (Scene3400 *)R2_GLOBALS._sceneManager._scene;
1713 
1714 	int v = _speakerMode;
1715 
1716 	if (!_object2) {
1717 		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
1718 			_object2 = &R2_GLOBALS._player;
1719 		else if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
1720 			_object2 = &scene->_companion1;
1721 		else
1722 			_object2 = &scene->_companion2;
1723 
1724 		_object2->hide();
1725 		_object1.postInit();
1726 		_object1.setPosition(_object2->_position);
1727 		_object1._numFrames = 7;
1728 		_object1._effect = EFFECT_SHADED;
1729 		_object1.changeZoom(-1);
1730 		R2_GLOBALS._player.disableControl();
1731 		if (_object2->_mover)
1732 			_object2->addMover(NULL);
1733 	}
1734 
1735 	switch (v) {
1736 	case 0:
1737 		_object1.animate(ANIM_MODE_2, NULL);
1738 		break;
1739 	case 1:
1740 		((StripManager *)_action)->_useless = 0;
1741 
1742 		_object1.setup(4010, 5, 1);
1743 		_object1.animate(ANIM_MODE_5, NULL);
1744 		break;
1745 	case 2:
1746 		((StripManager *)_action)->_useless = 0;
1747 
1748 		_object1.setup(4010, 3, 1);
1749 		_object1.animate(ANIM_MODE_5, this);
1750 		break;
1751 	case 3:
1752 		((StripManager *)_action)->_useless = 0;
1753 
1754 		_object1.setup(4012, 3, 1);
1755 		_object1.animate(ANIM_MODE_5, this);
1756 		break;
1757 	default:
1758 		signal();
1759 		break;
1760 	}
1761 }
1762 
animateSpeaker()1763 void SpeakerQuinn3600::animateSpeaker() {
1764 	Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
1765 
1766 	int v = _speakerMode;
1767 
1768 	if (!_object2) {
1769 		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
1770 			_object2 = &R2_GLOBALS._player;
1771 		else
1772 			_object2 = &scene->_quinn;
1773 		_object2->hide();
1774 		_object1.postInit();
1775 		_object1.setPosition(_object2->_position);
1776 		_object1._numFrames = 7;
1777 		_object1._effect = EFFECT_SHADED;
1778 		_object1.changeZoom(-1);
1779 		R2_GLOBALS._player.disableControl();
1780 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
1781 
1782 		if (_object2->_mover)
1783 			_object2->addMover(NULL);
1784 	}
1785 
1786 	switch (v) {
1787 	case 0:
1788 		_object1.animate(ANIM_MODE_2, NULL);
1789 		break;
1790 	case 1:
1791 		((StripManager *)_action)->_useless = 0;
1792 
1793 		_object1.setup(4021, 7, 1);
1794 		_object1.animate(ANIM_MODE_5, this);
1795 		break;
1796 	case 2:
1797 		((StripManager *)_action)->_useless = 0;
1798 
1799 		_object1.setup(4010, 1, 1);
1800 		_object1.animate(ANIM_MODE_5, this);
1801 		break;
1802 	case 3:
1803 		((StripManager *)_action)->_useless = 0;
1804 
1805 		_object1.setup(4012, 1, 1);
1806 		_object1.animate(ANIM_MODE_5, this);
1807 		break;
1808 	default:
1809 		signal();
1810 		break;
1811 	}
1812 }
1813 
setText(const Common::String & msg)1814 void SpeakerQuinn3700::setText(const Common::String &msg) {
1815 	Scene3700 *scene = (Scene3700 *)R2_GLOBALS._sceneManager._scene;
1816 
1817 	switch (_speakerMode) {
1818 	case 2:
1819 		scene->_miranda.setup(30, 1, 1);
1820 		R2_GLOBALS._sound2.play(44);
1821 		break;
1822 	case 3:
1823 		scene->_miranda.setup(30, 1, 1);
1824 		break;
1825 	default:
1826 		scene->_miranda.setup(30, 7, 1);
1827 		break;
1828 	}
1829 	VisualSpeaker::setText(msg);
1830 }
1831 
animateSpeaker()1832 void SpeakerQuinn3700::animateSpeaker() {
1833 	Scene3700 *scene = (Scene3700 *)R2_GLOBALS._sceneManager._scene;
1834 
1835 	int v = _speakerMode;
1836 
1837 	if (!_object2) {
1838 		_object2 = &scene->_quinn;
1839 		_object2->hide();
1840 		_object1.postInit();
1841 		_object1.setPosition(_object2->_position);
1842 		_object1._numFrames = 7;
1843 		R2_GLOBALS._player.disableControl();
1844 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
1845 
1846 		if (_object2->_mover)
1847 			_object2->addMover(NULL);
1848 	}
1849 
1850 	_object1.setPosition(_object2->_position);
1851 
1852 	switch (v) {
1853 	case 0:
1854 		_object1.animate(ANIM_MODE_2, NULL);
1855 		break;
1856 	case 1:
1857 		((StripManager *)_action)->_useless = 0;
1858 
1859 		R2_GLOBALS._sound2.stop();
1860 		scene->_quinn.setup(10, 4, 1);
1861 		scene->_miranda.setup(30, 7, 1);
1862 		_object1.setup(3701, 1, 1);
1863 		_object1.animate(ANIM_MODE_5, this);
1864 		break;
1865 	case 2:
1866 		((StripManager *)_action)->_useless = 0;
1867 
1868 		scene->_seeker.setup(20, 1, 1);
1869 		scene->_miranda.setup(30, 1, 1);
1870 		_object1.setup(3702, 1, 1);
1871 		_object1.animate(ANIM_MODE_5, this);
1872 		break;
1873 	case 3:
1874 		((StripManager *)_action)->_useless = 0;
1875 
1876 		scene->_quinn.setup(10, 2, 1);
1877 		scene->_miranda.setup(30, 1, 1);
1878 		_object1.setup(4011, 1, 1);
1879 		_object1.animate(ANIM_MODE_5, this);
1880 		break;
1881 	default:
1882 		signal();
1883 		break;
1884 	}
1885 }
1886 
1887 //----------------------------------------------------------------------------
1888 // Classes related to QUINNL
1889 //----------------------------------------------------------------------------
1890 
SpeakerQuinnL()1891 SpeakerQuinnL::SpeakerQuinnL(): SpeakerQuinn() {
1892 	_speakerName = "QUINNL";
1893 }
1894 
1895 //----------------------------------------------------------------------------
1896 // Classes related to RALF
1897 //----------------------------------------------------------------------------
1898 
SpeakerRalf3245()1899 SpeakerRalf3245::SpeakerRalf3245() {
1900 	_speakerName = "Ralf";
1901 	_color1 = 5;
1902 	_color2 = 0;
1903 	_speakerMode = 0;
1904 	_textWidth = 300;
1905 	_hideObjects = false;
1906 	_object2 = NULL;
1907 	_displayMode = 1;
1908 	_numFrames = 0;
1909 }
1910 
animateSpeaker()1911 void SpeakerRalf3245::animateSpeaker() {
1912 	int v = _speakerMode;
1913 	Scene3245 *scene = (Scene3245 *)R2_GLOBALS._sceneManager._scene;
1914 
1915 	if (!_object2) {
1916 		_object2 = &scene->_ralf;
1917 		_object2->hide();
1918 		_object1.postInit();
1919 		_object1.setPosition(_object2->_position);
1920 
1921 		if (_object2->_mover)
1922 			_object2->addMover(NULL);
1923 	}
1924 
1925 	if (v == 0) {
1926 		_object1.animate(ANIM_MODE_2, NULL);
1927 	} else {
1928 		((StripManager *)_action)->_useless = 0;
1929 
1930 		switch (_object2->_visage) {
1931 		case 3100:
1932 			_object1.setup(4105, (_object2->_strip * 2) - 1, 1);
1933 			break;
1934 		case 3101:
1935 			_object1.setup(4108, (_object2->_strip * 2) - 1, 1);
1936 			break;
1937 		case 3102:
1938 			_object1.setup(4109, (_object2->_strip * 2) - 1, 1);
1939 			break;
1940 		default:
1941 			break;
1942 		}
1943 
1944 		_object1.animate(ANIM_MODE_5, this);
1945 	}
1946 }
1947 
1948 //----------------------------------------------------------------------------
1949 // Classes related to ROCKO
1950 //----------------------------------------------------------------------------
1951 
SpeakerRocko()1952 SpeakerRocko::SpeakerRocko() {
1953 	_speakerName = "Rocko";
1954 	_color1 = 5;
1955 	_color2 = 0;
1956 	_speakerMode = 0;
1957 	_textWidth = 300;
1958 	_hideObjects = false;
1959 	_object2 = NULL;
1960 	_displayMode = 1;
1961 	_numFrames = 0;
1962 }
1963 
animateSpeaker()1964 void SpeakerRocko3200::animateSpeaker() {
1965 	int v = _speakerMode;
1966 	Scene3200 *scene = (Scene3200 *)R2_GLOBALS._sceneManager._scene;
1967 
1968 	if (!_object2) {
1969 		_object2 = &scene->_rocko;
1970 		_object2->hide();
1971 		_object1.postInit();
1972 		_object1.setPosition(_object2->_position);
1973 
1974 		if (_object2->_mover)
1975 			_object2->addMover(NULL);
1976 	}
1977 
1978 	if (v == 0) {
1979 		_object1.animate(ANIM_MODE_2, NULL);
1980 	} else {
1981 		((StripManager *)_action)->_useless = 0;
1982 
1983 		_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
1984 		_object1.animate(ANIM_MODE_5, this);
1985 	}
1986 }
1987 
animateSpeaker()1988 void SpeakerRocko3220::animateSpeaker() {
1989 	int v = _speakerMode;
1990 	Scene3220 *scene = (Scene3220 *)R2_GLOBALS._sceneManager._scene;
1991 
1992 	if (!_object2) {
1993 		_object2 = &scene->_rocko;
1994 		_object2->hide();
1995 		_object1.postInit();
1996 		_object1.setPosition(_object2->_position);
1997 
1998 		if (_object2->_mover)
1999 			_object2->addMover(NULL);
2000 	}
2001 
2002 	if (v == 0) {
2003 		_object1.animate(ANIM_MODE_2, NULL);
2004 	} else {
2005 		((StripManager *)_action)->_useless = 0;
2006 
2007 		_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
2008 		_object1.animate(ANIM_MODE_5, this);
2009 	}
2010 }
2011 
animateSpeaker()2012 void SpeakerRocko3230::animateSpeaker() {
2013 	int v = _speakerMode;
2014 	Scene3230 *scene = (Scene3230 *)R2_GLOBALS._sceneManager._scene;
2015 
2016 	if (!_object2) {
2017 		_object2 = &scene->_rocko;
2018 		_object2->hide();
2019 		_object1.postInit();
2020 		_object1.setPosition(_object2->_position);
2021 
2022 		if (_object2->_mover)
2023 			_object2->addMover(NULL);
2024 	}
2025 
2026 	if (v == 0) {
2027 		_object1.animate(ANIM_MODE_2, NULL);
2028 	} else {
2029 		((StripManager *)_action)->_useless = 0;
2030 
2031 		_object1.setup(4111, (_object2->_strip * 2) - 1, 1);
2032 		_object1.animate(ANIM_MODE_5, this);
2033 	}
2034 }
2035 
2036 //----------------------------------------------------------------------------
2037 // Classes related to SEEKER
2038 //----------------------------------------------------------------------------
2039 
SpeakerSeeker()2040 SpeakerSeeker::SpeakerSeeker(): VisualSpeaker() {
2041 	_speakerName = "SEEKER";
2042 	_color1 = 35;
2043 	_color2 = 0;
2044 	_speakerMode = 0;
2045 	_textWidth = 300;
2046 	_hideObjects = false;
2047 	_object2 = NULL;
2048 	_displayMode = 1;
2049 	_numFrames = 0;
2050 }
2051 
animateSpeaker()2052 void SpeakerSeeker300::animateSpeaker() {
2053 	int v = _speakerMode;
2054 
2055 	if (!_object2) {
2056 		if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
2057 			_object2 = &R2_GLOBALS._player;
2058 		} else {assert(R2_GLOBALS._sceneManager._sceneNumber == 300);
2059 			Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
2060 			_object2 = &scene->_seeker;
2061 		}
2062 
2063 		_object2->hide();
2064 		_object1.postInit();
2065 		_object1.fixPriority(140);
2066 		_object1.setPosition(_object2->_position);
2067 
2068 		if (_object2->_mover)
2069 			_object2->addMover(NULL);
2070 	}
2071 
2072 	if (v == 0) {
2073 		_object1.animate(ANIM_MODE_2, NULL);
2074 	} else if (v == 100) {
2075 		_numFrames = 0;
2076 		((StripManager *)_action)->_useless = 0;
2077 
2078 		_object1.setStrip(_object1._strip - 1);
2079 		_object1.setFrame(_object1.getFrameCount());
2080 		_object1.animate(ANIM_MODE_6, this);
2081 	} else {
2082 		((StripManager *)_action)->_useless = 0;
2083 
2084 		_object1.setup(306, v * 2 - 1, 1);
2085 		_object1.animate(ANIM_MODE_5, this);
2086 	}
2087 }
2088 
animateSpeaker()2089 void SpeakerSeeker500::animateSpeaker() {
2090 	int v = _speakerMode;
2091 
2092 	if (!_object2) {
2093 		if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
2094 			_object2 = &R2_GLOBALS._player;
2095 		} else {
2096 			assert(R2_GLOBALS._sceneManager._sceneNumber == 500);
2097 			Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
2098 			_object2 = &scene->_seeker;
2099 		}
2100 
2101 		_object2->hide();
2102 		_object1.postInit();
2103 
2104 		_object1._effect = _object2->_effect;
2105 		_object1._shade = _object2->_shade;
2106 		_object1.setPosition(_object2->_position);
2107 
2108 		if (_object2->_mover)
2109 			_object2->addMover(NULL);
2110 	}
2111 
2112 	if (v == 0) {
2113 		_object1.animate(ANIM_MODE_2, NULL);
2114 	} else {
2115 		((StripManager *)_action)->_useless = 0;
2116 
2117 		if (v == 1)
2118 			_object1.setup(4041, 3, 1);
2119 		else
2120 			_object1.setup(4041, 1, 1);
2121 
2122 		_object1.animate(ANIM_MODE_5, this);
2123 	}
2124 }
2125 
animateSpeaker()2126 void SpeakerSeeker1100::animateSpeaker() {
2127 	int v = _speakerMode;
2128 
2129 	if (!_object2) {
2130 		if (v == 0)
2131 			return;
2132 
2133 		if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
2134 			_object2 = &R2_GLOBALS._player;
2135 		} else {
2136 			assert(R2_GLOBALS._sceneManager._sceneNumber == 1100);
2137 			Scene1100 *scene = (Scene1100 *)R2_GLOBALS._sceneManager._scene;
2138 			_object2 = &scene->_seeker;
2139 		}
2140 
2141 		_object2->hide();
2142 		_object1.postInit();
2143 		_object1.setPosition(_object2->_position);
2144 		_object1._numFrames = 7;
2145 
2146 		if (_object2->_mover)
2147 			_object2->addMover(NULL);
2148 	}
2149 
2150 	switch (v) {
2151 	case 0:
2152 		_object1.animate(ANIM_MODE_2, NULL);
2153 		break;
2154 	case 1:
2155 		((StripManager *)_action)->_useless = 0;
2156 
2157 		_object1.setup(1108, 1, 1);
2158 		_object1.animate(ANIM_MODE_5, this);
2159 		break;
2160 	case 2:
2161 		((StripManager *)_action)->_useless = 0;
2162 
2163 		_object1.setup(1108, 3, 1);
2164 		_object1.animate(ANIM_MODE_5, this);
2165 		break;
2166 	case 3:
2167 		_object1.setPosition(Common::Point(197, 134));
2168 		((StripManager *)_action)->_useless = 0;
2169 
2170 		_object1.setup(1108, 5, 1);
2171 		_object1.animate(ANIM_MODE_5, this);
2172 		break;
2173 	case 4:
2174 		((StripManager *)_action)->_useless = 0;
2175 
2176 		_object1.setup(1109, 7, 1);
2177 		_object1.animate(ANIM_MODE_5, this);
2178 		break;
2179 	case 5:
2180 		((StripManager *)_action)->_useless = 0;
2181 
2182 		_object1.setup(1109, 3, 1);
2183 		_object1.animate(ANIM_MODE_5, this);
2184 		break;
2185 	default:
2186 		signal();
2187 		break;
2188 	}
2189 }
2190 
animateSpeaker()2191 void SpeakerSeeker1900::animateSpeaker() {
2192 	int v = _speakerMode;
2193 
2194 	if (!_object2) {
2195 		if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
2196 			_object2 = &R2_GLOBALS._player;
2197 		} else {
2198 			assert(R2_GLOBALS._sceneManager._sceneNumber == 1900);
2199 			Scene1900 *scene = (Scene1900 *)R2_GLOBALS._sceneManager._scene;
2200 			_object2 = &scene->_companion;
2201 		}
2202 
2203 		_object2->hide();
2204 		_object1.postInit();
2205 		_object1.setPosition(_object2->_position);
2206 		_object1._numFrames = 7;
2207 
2208 		if (_object2->_mover)
2209 			_object2->addMover(NULL);
2210 	}
2211 
2212 	if (v == 0) {
2213 		_object1.animate(ANIM_MODE_2, NULL);
2214 	} else if (v == 1) {
2215 		_object1.setup(4032, 1, 1);
2216 		_object1.animate(ANIM_MODE_5, this);
2217 	} else {
2218 		signal();
2219 	}
2220 }
2221 
animateSpeaker()2222 void SpeakerSeeker2435::animateSpeaker() {
2223 	int v = _speakerMode;
2224 
2225 	if (!_object2) {
2226 		if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
2227 			_object2 = &R2_GLOBALS._player;
2228 		} else {
2229 			assert(R2_GLOBALS._sceneManager._sceneNumber == 2435);
2230 			Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene;
2231 			_object2 = &scene->_companion;
2232 		}
2233 
2234 		_object2->hide();
2235 		_object1.postInit();
2236 		_object1.setPosition(_object2->_position);
2237 	}
2238 
2239 	if (v == 0) {
2240 		_object1.animate(ANIM_MODE_2, NULL);
2241 	} else {
2242 		((StripManager *)_action)->_useless = 0;
2243 
2244 		_object2->setStrip(7);
2245 		_object1.setup(4099, 1, 1);
2246 		_object1.animate(ANIM_MODE_5, this);
2247 	}
2248 }
2249 
animateSpeaker()2250 void SpeakerSeeker2450::animateSpeaker() {
2251 	int v = _speakerMode;
2252 
2253 	if (!_object2) {
2254 		if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
2255 			_object2 = &R2_GLOBALS._player;
2256 		} else {
2257 			assert(R2_GLOBALS._sceneManager._sceneNumber == 2450);
2258 			Scene2450 *scene = (Scene2450 *)R2_GLOBALS._sceneManager._scene;
2259 			_object2 = &scene->_companion;
2260 		}
2261 
2262 		_object2->hide();
2263 		_object1.postInit();
2264 		_object1.setPosition(_object2->_position);
2265 	}
2266 
2267 	if (v == 0) {
2268 		_object1.animate(ANIM_MODE_2, NULL);
2269 	} else {
2270 		((StripManager *)_action)->_useless = 0;
2271 
2272 		_object1.setup(4099, 3, 1);
2273 		_object1.animate(ANIM_MODE_5, this);
2274 	}
2275 }
2276 
animateSpeaker()2277 void SpeakerSeeker3375::animateSpeaker() {
2278 	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
2279 
2280 	int v = _speakerMode;
2281 
2282 	if (!_object2) {
2283 		if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2284 			_object2 = &R2_GLOBALS._player;
2285 		else
2286 			_object2 = &scene->_companion1;
2287 
2288 		_object2->hide();
2289 		_object1.postInit();
2290 		_object1.setPosition(_object2->_position);
2291 		_object1._numFrames = 7;
2292 		_object1._effect = EFFECT_SHADED;
2293 		_object1.changeZoom(-1);
2294 
2295 		if (scene->_companion1._position.y != 163)
2296 			R2_GLOBALS._player.setStrip(8);
2297 		else
2298 			R2_GLOBALS._player.setStrip(2);
2299 
2300 		if (R2_GLOBALS._player._mover)
2301 			R2_GLOBALS._player.addMover(NULL);
2302 
2303 		R2_GLOBALS._player.disableControl(CURSOR_TALK);
2304 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
2305 
2306 		if (_object2->_mover)
2307 			_object2->addMover(NULL);
2308 	}
2309 
2310 	switch (v) {
2311 	case 0:
2312 		_object1.animate(ANIM_MODE_2, NULL);
2313 		break;
2314 	case 1:
2315 		((StripManager *)_action)->_useless = 0;
2316 
2317 		_object1.setup(4031, 1, 1);
2318 		_object1.animate(ANIM_MODE_5, this);
2319 		break;
2320 	default:
2321 		signal();
2322 		break;
2323 	}
2324 }
2325 
animateSpeaker()2326 void SpeakerSeeker3385::animateSpeaker() {
2327 	Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
2328 
2329 	int v = _speakerMode;
2330 
2331 	if (!_object2) {
2332 		if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2333 			_object2 = &R2_GLOBALS._player;
2334 		else
2335 			_object2 = &scene->_companion1;
2336 
2337 		_object2->hide();
2338 		_object1.postInit();
2339 		_object1.setPosition(_object2->_position);
2340 		_object1._numFrames = 7;
2341 		_object1._effect = EFFECT_SHADED;
2342 		_object1.changeZoom(-1);
2343 
2344 		if (R2_GLOBALS._sceneManager._previousScene == 3375)
2345 			R2_GLOBALS._player.setStrip(4);
2346 		else
2347 			R2_GLOBALS._player.setStrip(3);
2348 
2349 		if (R2_GLOBALS._player._mover)
2350 			R2_GLOBALS._player.addMover(NULL);
2351 
2352 		R2_GLOBALS._player.disableControl(CURSOR_TALK);
2353 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
2354 
2355 		if (_object2->_mover)
2356 			_object2->addMover(NULL);
2357 	}
2358 
2359 
2360 	switch (v) {
2361 	case 0:
2362 		_object1.animate(ANIM_MODE_2, NULL);
2363 		break;
2364 	case 1:
2365 		((StripManager *)_action)->_useless = 0;
2366 
2367 		_object1.setup(4031, 3, 1);
2368 		_object1.animate(ANIM_MODE_5, this);
2369 		break;
2370 	default:
2371 		signal();
2372 		break;
2373 	}
2374 }
2375 
animateSpeaker()2376 void SpeakerSeeker3395::animateSpeaker() {
2377 	Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
2378 
2379 	int v = _speakerMode;
2380 
2381 	if (!_object2) {
2382 		if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2383 			_object2 = &R2_GLOBALS._player;
2384 		else
2385 			_object2 = &scene->_companion1;
2386 
2387 		_object2->hide();
2388 		_object1.postInit();
2389 		_object1.setPosition(_object2->_position);
2390 		_object1._numFrames = 7;
2391 		_object1._effect = EFFECT_SHADED;
2392 		_object1.changeZoom(-1);
2393 
2394 		if (R2_GLOBALS._sceneManager._previousScene == 3385)
2395 			R2_GLOBALS._player.setStrip(4);
2396 		else
2397 			R2_GLOBALS._player.setStrip(3);
2398 
2399 		if (R2_GLOBALS._player._mover)
2400 			R2_GLOBALS._player.addMover(NULL);
2401 
2402 		R2_GLOBALS._player.disableControl(CURSOR_TALK);
2403 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
2404 
2405 		if (_object2->_mover)
2406 			_object2->addMover(NULL);
2407 	}
2408 
2409 	switch (v) {
2410 	case 0:
2411 		_object1.animate(ANIM_MODE_2, NULL);
2412 		break;
2413 	case 1:
2414 		((StripManager *)_action)->_useless = 0;
2415 
2416 		_object1.setup(4031, 3, 1);
2417 		_object1.animate(ANIM_MODE_5, this);
2418 		break;
2419 	default:
2420 		signal();
2421 		break;
2422 	}
2423 }
2424 
animateSpeaker()2425 void SpeakerSeeker3400::animateSpeaker() {
2426 	Scene3400 *scene = (Scene3400 *)R2_GLOBALS._sceneManager._scene;
2427 
2428 	int v = _speakerMode;
2429 
2430 	if (!_object2) {
2431 		if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2432 			_object2 = &R2_GLOBALS._player;
2433 		else
2434 			_object2 = &scene->_companion1;
2435 
2436 		_object2->hide();
2437 		_object1.postInit();
2438 		_object1.setPosition(_object2->_position);
2439 		_object1._numFrames = 7;
2440 		_object1._effect = EFFECT_SHADED;
2441 		_object1.changeZoom(-1);
2442 		R2_GLOBALS._player.disableControl();
2443 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
2444 
2445 		if (_object2->_mover)
2446 			_object2->addMover(NULL);
2447 	}
2448 
2449 	switch (v) {
2450 	case 0:
2451 		_object1.animate(ANIM_MODE_2, NULL);
2452 		break;
2453 	case 1:
2454 		((StripManager *)_action)->_useless = 0;
2455 
2456 		_object1.setup(4031, 1, 1);
2457 		_object1.animate(ANIM_MODE_5, this);
2458 		break;
2459 	case 2:
2460 		((StripManager *)_action)->_useless = 0;
2461 
2462 		_object1.setup(4031, 3, 1);
2463 		_object1.animate(ANIM_MODE_5, this);
2464 		break;
2465 	case 3:
2466 		((StripManager *)_action)->_useless = 0;
2467 
2468 		_object1.setup(4030, 3, 1);
2469 		_object1.animate(ANIM_MODE_5, this);
2470 		break;
2471 	case 4:
2472 		((StripManager *)_action)->_useless = 0;
2473 
2474 		_object1.setup(4031, 7, 1);
2475 		_object1.animate(ANIM_MODE_5, this);
2476 		break;
2477 	case 5:
2478 		((StripManager *)_action)->_useless = 0;
2479 
2480 		_object1.setup(4033, 1, 1);
2481 		_object1.animate(ANIM_MODE_5, this);
2482 		break;
2483 	default:
2484 		signal();
2485 		break;
2486 	}
2487 }
2488 
animateSpeaker()2489 void SpeakerSeeker3600::animateSpeaker() {
2490 	Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
2491 
2492 	int v = _speakerMode;
2493 
2494 	if (!_object2) {
2495 		if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
2496 			_object2 = &R2_GLOBALS._player;
2497 		else
2498 			_object2 = &scene->_seeker;
2499 
2500 		_object2->hide();
2501 		_object1.postInit();
2502 		_object1.setPosition(_object2->_position);
2503 		_object1._numFrames = 7;
2504 		_object1._effect = EFFECT_SHADED;
2505 		_object1.changeZoom(-1);
2506 		R2_GLOBALS._player.disableControl();
2507 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
2508 
2509 		if (_object2->_mover)
2510 			_object2->addMover(NULL);
2511 
2512 		_object1.setPosition(_object2->_position);
2513 
2514 	}
2515 
2516 	switch (v) {
2517 	case 0:
2518 		_object1.animate(ANIM_MODE_2, NULL);
2519 		break;
2520 	case 1:
2521 		((StripManager *)_action)->_useless = 0;
2522 
2523 		_object1.setup(4031, 5, 1);
2524 		_object1.animate(ANIM_MODE_5, this);
2525 		break;
2526 	case 2:
2527 		((StripManager *)_action)->_useless = 0;
2528 
2529 		_object1.setup(4030, 1, 1);
2530 		_object1.animate(ANIM_MODE_5, this);
2531 		break;
2532 	default:
2533 		signal();
2534 		break;
2535 	}
2536 }
2537 
setText(const Common::String & msg)2538 void SpeakerSeeker3700::setText(const Common::String &msg) {
2539 	Scene3700 *scene = (Scene3700 *)R2_GLOBALS._sceneManager._scene;
2540 
2541 	if (_speakerMode == 1) {
2542 		R2_GLOBALS._sound2.play(44);
2543 		scene->_miranda.setup(30, 8, 1);
2544 	} else {
2545 		scene->_miranda.setup(30, 2, 1);
2546 	}
2547 
2548 	VisualSpeaker::setText(msg);
2549 }
2550 
animateSpeaker()2551 void SpeakerSeeker3700::animateSpeaker() {
2552 	Scene3700 *scene = (Scene3700 *)R2_GLOBALS._sceneManager._scene;
2553 
2554 	int v = _speakerMode;
2555 
2556 	if (!_object2) {
2557 		_object2 = &scene->_seeker;
2558 		_object2->hide();
2559 		_object1.postInit();
2560 		_object1.setPosition(_object2->_position);
2561 		_object1._numFrames = 7;
2562 		R2_GLOBALS._player.disableControl();
2563 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
2564 
2565 		if (_object2->_mover)
2566 			_object2->addMover(NULL);
2567 	}
2568 
2569 	_object1.setPosition(_object2->_position);
2570 
2571 	switch (v) {
2572 	case 0:
2573 		_object1.animate(ANIM_MODE_2, NULL);
2574 		break;
2575 	case 1:
2576 		((StripManager *)_action)->_useless = 0;
2577 
2578 		R2_GLOBALS._sound2.stop();
2579 		scene->_quinn.setup(10, 8, 1);
2580 		scene->_seeker.setup(20, 7, 1);
2581 		scene->_miranda.setup(30, 8, 1);
2582 		_object1.setup(3701, 3, 1);
2583 		_object1.animate(ANIM_MODE_5, this);
2584 		break;
2585 	case 2:
2586 		((StripManager *)_action)->_useless = 0;
2587 
2588 		scene->_quinn.setup(10, 2, 1);
2589 		scene->_seeker.setup(20, 1, 1);
2590 		scene->_miranda.setup(30, 1, 1);
2591 		_object1.setup(4031, 1, 1);
2592 		_object1.animate(ANIM_MODE_5, this);
2593 		break;
2594 	default:
2595 		signal();
2596 		break;
2597 	}
2598 }
2599 
2600 //----------------------------------------------------------------------------
2601 // Classes related to SEEKERL
2602 //----------------------------------------------------------------------------
2603 
SpeakerSeekerL()2604 SpeakerSeekerL::SpeakerSeekerL(): SpeakerSeeker() {
2605 	_speakerName = "SEEKERL";
2606 }
2607 
2608 //----------------------------------------------------------------------------
2609 // Classes related to SOCKO
2610 //----------------------------------------------------------------------------
2611 
SpeakerSocko3200()2612 SpeakerSocko3200::SpeakerSocko3200() {
2613 	_speakerName = "Socko";
2614 	_color1 = 10;
2615 	_color2 = 0;
2616 	_speakerMode = 0;
2617 	_textWidth = 300;
2618 	_hideObjects = false;
2619 	_object2 = NULL;
2620 	_displayMode = 1;
2621 	_numFrames = 0;
2622 }
2623 
animateSpeaker()2624 void SpeakerSocko3200::animateSpeaker() {
2625 	int v = _speakerMode;
2626 	Scene3200 *scene = (Scene3200 *)R2_GLOBALS._sceneManager._scene;
2627 
2628 	if (!_object2) {
2629 		_object2 = &scene->_socko;
2630 		_object2->hide();
2631 		_object1.postInit();
2632 		_object1.setPosition(_object2->_position);
2633 
2634 		if (_object2->_mover)
2635 			_object2->addMover(NULL);
2636 	}
2637 
2638 	if (v == 0) {
2639 		_object1.animate(ANIM_MODE_2, NULL);
2640 	} else {
2641 		((StripManager *)_action)->_useless = 0;
2642 
2643 		_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
2644 		_object1.animate(ANIM_MODE_5, this);
2645 	}
2646 }
2647 
2648 //----------------------------------------------------------------------------
2649 // Classes related to SOLDIER
2650 //----------------------------------------------------------------------------
2651 
SpeakerSoldier(int color)2652 SpeakerSoldier::SpeakerSoldier(int color) {
2653 	_speakerName = "SOLDIER";
2654 	_color1 = color;
2655 	_color2 = 0;
2656 	_speakerMode = 0;
2657 	_textWidth = 300;
2658 	_hideObjects = false;
2659 	_object2 = NULL;
2660 	_displayMode = 1;
2661 	_numFrames = 0;
2662 }
2663 
animateSpeaker()2664 void SpeakerSoldier300::animateSpeaker() {
2665 	int v = _speakerMode;
2666 
2667 	if (!_object2) {
2668 		Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
2669 		_object2 = &scene->_teal;
2670 		_object2->hide();
2671 
2672 		_object1.postInit();
2673 		_object1.setPosition(_object2->_position);
2674 
2675 		if (_object2->_mover)
2676 			_object2->addMover(NULL);
2677 	}
2678 
2679 	if (v == 0) {
2680 		_object1.animate(ANIM_MODE_2, NULL);
2681 	} else {
2682 		((StripManager *)_action)->_useless = 0;
2683 
2684 		_object1.setup(303, 3, 1);
2685 		_object1.animate(ANIM_MODE_5, this);
2686 	}
2687 }
2688 
2689 //----------------------------------------------------------------------------
2690 // Classes related to TEAL
2691 //----------------------------------------------------------------------------
2692 
SpeakerTeal()2693 SpeakerTeal::SpeakerTeal(): VisualSpeaker() {
2694 	_speakerName = "TEAL";
2695 	_color1 = 22;
2696 	_color2 = 0;
2697 	_speakerMode = 0;
2698 	_textWidth = 300;
2699 	_hideObjects = false;
2700 	_object2 = NULL;
2701 	_displayMode = 1;
2702 	_numFrames = 0;
2703 }
2704 
SpeakerTealMode7()2705 SpeakerTealMode7::SpeakerTealMode7(): SpeakerTeal() {
2706 	_displayMode = 7;
2707 }
2708 
animateSpeaker()2709 void SpeakerTeal180::animateSpeaker() {
2710 	int v = _speakerMode;
2711 
2712 	if (!_object2) {
2713 		Scene180 *scene = (Scene180 *)R2_GLOBALS._sceneManager._scene;
2714 		_object2 = &scene->_teal;
2715 		_object2->hide();
2716 
2717 		_object1.postInit();
2718 		_object1.setPosition(_object2->_position);
2719 
2720 		if (_object2->_mover)
2721 			_object2->addMover(NULL);
2722 	}
2723 
2724 	switch (v) {
2725 	case 0:
2726 		_object1.animate(ANIM_MODE_2, NULL);
2727 		break;
2728 	case 1:
2729 		((StripManager *)_action)->_useless = 0;
2730 
2731 		_object1.setup(75, 5, 1);
2732 		_object1.animate(ANIM_MODE_5, this);
2733 		break;
2734 	case 2:
2735 		((StripManager *)_action)->_useless = 0;
2736 
2737 		_object1.setup(77, 1, 1);
2738 		_object1.animate(ANIM_MODE_5, this);
2739 		break;
2740 	default:
2741 		signal();
2742 		break;
2743 	}
2744 }
2745 
animateSpeaker()2746 void SpeakerTeal300::animateSpeaker() {
2747 	int v = _speakerMode;
2748 
2749 	if (!_object2) {
2750 		Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
2751 		_object2 = &scene->_teal;
2752 		_object2->hide();
2753 
2754 		_object1.postInit();
2755 		_object1.setPosition(_object2->_position);
2756 
2757 		if (_object2->_mover)
2758 			_object2->addMover(NULL);
2759 	}
2760 
2761 	if (v == 0) {
2762 		_object1.animate(ANIM_MODE_2, NULL);
2763 	} else {
2764 		((StripManager *)_action)->_useless = 0;
2765 
2766 		_object1.setup(303, 1, 1);
2767 		_object1.animate(ANIM_MODE_5, this);
2768 	}
2769 }
2770 
animateSpeaker()2771 void SpeakerTeal1625::animateSpeaker() {
2772 	int v = _speakerMode;
2773 
2774 	if (!_object2) {
2775 		Scene1625 *scene = (Scene1625 *)R2_GLOBALS._sceneManager._scene;
2776 		_object2 = &scene->_tealHead;
2777 		_object2->hide();
2778 
2779 		_object1.postInit();
2780 		_object1.setPosition(Common::Point(68, 68));
2781 
2782 		if (_object2->_mover)
2783 			_object2->addMover(NULL);
2784 	}
2785 
2786 	if (v == 0) {
2787 		_object1.animate(ANIM_MODE_2, NULL);
2788 	} else {
2789 		((StripManager *)_action)->_useless = 0;
2790 
2791 		_object1.setup(1627, 1, 1);
2792 		_object1.animate(ANIM_MODE_5, this);
2793 	}
2794 }
2795 
animateSpeaker()2796 void SpeakerTeal3240::animateSpeaker() {
2797 	int v = _speakerMode;
2798 	Scene3240 *scene = (Scene3240 *)R2_GLOBALS._sceneManager._scene;
2799 
2800 	if (!_object2) {
2801 		_object2 = &scene->_teal;
2802 		_object2->hide();
2803 		_object1.postInit();
2804 		_object1.setPosition(_object2->_position);
2805 
2806 		if (_object2->_mover)
2807 			_object2->addMover(NULL);
2808 	}
2809 
2810 	if (v == 0) {
2811 		_object1.animate(ANIM_MODE_2, NULL);
2812 	} else {
2813 		((StripManager *)_action)->_useless = 0;
2814 
2815 		_object1.setup(4070, (_object2->_strip * 2) - 1, 1);
2816 		_object1.animate(ANIM_MODE_5, this);
2817 	}
2818 }
2819 
animateSpeaker()2820 void SpeakerTeal3400::animateSpeaker() {
2821 	Scene3400 *scene = (Scene3400 *)R2_GLOBALS._sceneManager._scene;
2822 
2823 	int v = _speakerMode;
2824 
2825 	if (!_object2) {
2826 		_object2 = &scene->_teal;
2827 		_object2->hide();
2828 		_object1.postInit();
2829 		_object1._numFrames = 7;
2830 		_object1._effect = EFFECT_SHADED;
2831 		_object1.changeZoom(-1);
2832 		R2_GLOBALS._player.disableControl();
2833 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
2834 
2835 		if (_object2->_mover)
2836 			_object2->addMover(NULL);
2837 	}
2838 	_object1.setPosition(_object2->_position);
2839 	_object1.show();
2840 
2841 	if (scene ->_sceneMode == 3305) {
2842 		R2_GLOBALS._player.setStrip(6);
2843 		scene->_companion1.setStrip(6);
2844 		scene->_companion2.setStrip(6);
2845 	}
2846 
2847 	switch (v) {
2848 	case 0:
2849 		_object1.animate(ANIM_MODE_2, NULL);
2850 		break;
2851 	case 1:
2852 		((StripManager *)_action)->_useless = 0;
2853 
2854 		_object1.setup(4107, 5, 1);
2855 		_object1.animate(ANIM_MODE_5, this);
2856 		break;
2857 	case 2:
2858 		((StripManager *)_action)->_useless = 0;
2859 
2860 		_object1.setup(4107, 1, 1);
2861 		_object1.animate(ANIM_MODE_5, this);
2862 		break;
2863 	case 3:
2864 		((StripManager *)_action)->_useless = 0;
2865 
2866 		_object1.setup(4107, 7, 1);
2867 		_object1.animate(ANIM_MODE_5, this);
2868 		break;
2869 	case 4:
2870 		((StripManager *)_action)->_useless = 0;
2871 
2872 		_object1.setup(4107, 3, 1);
2873 		_object1.animate(ANIM_MODE_5, this);
2874 		break;
2875 	default:
2876 		signal();
2877 		break;
2878 	}
2879 }
2880 
animateSpeaker()2881 void SpeakerTeal3600::animateSpeaker() {
2882 	Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;
2883 
2884 	int v = _speakerMode;
2885 
2886 	if (!_object2) {
2887 		_object2 = &scene->_teal;
2888 		_object2->hide();
2889 		_object1.postInit();
2890 		_object1.setPosition(_object2->_position);
2891 		_object1._numFrames = 7;
2892 		_object1._effect = EFFECT_SHADED;
2893 		_object1.changeZoom(-1);
2894 		R2_GLOBALS._player.disableControl();
2895 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
2896 
2897 		if (_object2->_mover)
2898 			_object2->addMover(NULL);
2899 	}
2900 	_object1.setPosition(_object2->_position);
2901 
2902 	if (scene ->_sceneMode == 3323) {
2903 		_object1.hide();
2904 		_object2->show();
2905 	}
2906 
2907 	switch (v) {
2908 	case 0:
2909 		_object1.animate(ANIM_MODE_2, NULL);
2910 		break;
2911 	case 1:
2912 		((StripManager *)_action)->_useless = 0;
2913 
2914 		_object1.setup(4107, 5, 1);
2915 		_object1.animate(ANIM_MODE_5, this);
2916 		break;
2917 	case 2:
2918 		((StripManager *)_action)->_useless = 0;
2919 
2920 		_object1.setup(4107, 1, 1);
2921 		_object1.animate(ANIM_MODE_5, this);
2922 		break;
2923 	case 3:
2924 		((StripManager *)_action)->_useless = 0;
2925 
2926 		_object1.setup(4107, 7, 1);
2927 		_object1.animate(ANIM_MODE_5, this);
2928 		break;
2929 	case 4:
2930 		((StripManager *)_action)->_useless = 0;
2931 
2932 		_object1.setup(4107, 3, 1);
2933 		_object1.animate(ANIM_MODE_5, this);
2934 		break;
2935 	default:
2936 		signal();
2937 		break;
2938 	}
2939 }
2940 
2941 //----------------------------------------------------------------------------
2942 // Classes related to TOMKO
2943 //----------------------------------------------------------------------------
2944 
SpeakerTomko3245()2945 SpeakerTomko3245::SpeakerTomko3245() {
2946 	_speakerName = "Tomko";
2947 	_color1 = 10;
2948 	_color2 = 0;
2949 	_speakerMode = 0;
2950 	_textWidth = 300;
2951 	_hideObjects = false;
2952 	_object2 = NULL;
2953 	_displayMode = 1;
2954 	_numFrames = 0;
2955 }
2956 
animateSpeaker()2957 void SpeakerTomko3245::animateSpeaker() {
2958 	int v = _speakerMode;
2959 	Scene3245 *scene = (Scene3245 *)R2_GLOBALS._sceneManager._scene;
2960 
2961 	if (!_object2) {
2962 		_object2 = &scene->_tomko;
2963 		_object2->hide();
2964 		_object1.postInit();
2965 		_object1.setPosition(_object2->_position);
2966 
2967 		if (_object2->_mover)
2968 			_object2->addMover(NULL);
2969 	}
2970 
2971 	if (v == 0) {
2972 		_object1.animate(ANIM_MODE_2, NULL);
2973 	} else {
2974 		((StripManager *)_action)->_useless = 0;
2975 
2976 		switch (_object2->_visage) {
2977 		case 3100:
2978 			_object1.setup(4105, (_object2->_strip * 2) - 1, 1);
2979 			break;
2980 		case 3101:
2981 			_object1.setup(4108, (_object2->_strip * 2) - 1, 1);
2982 			break;
2983 		case 3102:
2984 			_object1.setup(4109, (_object2->_strip * 2) - 1, 1);
2985 			break;
2986 		default:
2987 			break;
2988 		}
2989 
2990 		_object1.animate(ANIM_MODE_5, this);
2991 	}
2992 }
2993 
2994 //----------------------------------------------------------------------------
2995 // Classes related to WEBBSTER
2996 //----------------------------------------------------------------------------
2997 
SpeakerWebbster(int color)2998 SpeakerWebbster::SpeakerWebbster(int color) {
2999 	_speakerName = "WEBBSTER";
3000 	_color1 = color;
3001 	_color2 = 0;
3002 	_speakerMode = 0;
3003 	_textWidth = 300;
3004 	_hideObjects = false;
3005 	_object2 = NULL;
3006 	_displayMode = 1;
3007 	_numFrames = 0;
3008 }
3009 
animateSpeaker()3010 void SpeakerWebbster180::animateSpeaker() {
3011 	Scene180 *scene = (Scene180 *)R2_GLOBALS._sceneManager._scene;
3012 
3013 	int v = _speakerMode;
3014 
3015 	if (!_object2) {
3016 		_object2 = &scene->_webbster;
3017 		_object2->hide();
3018 		_object1.postInit();
3019 		_object1.setPosition(_object2->_position);
3020 		_object1._numFrames = 6;
3021 
3022 		if (_object2->_mover)
3023 			_object2->addMover(NULL);
3024 	}
3025 
3026 	switch (v) {
3027 	case 0:
3028 		_object1.animate(ANIM_MODE_2, NULL);
3029 		break;
3030 	case 1:
3031 		((StripManager *)_action)->_useless = 0;
3032 
3033 		_object1.setup(75, 7, 1);
3034 		_object1.animate(ANIM_MODE_5, this);
3035 		break;
3036 	case 2:
3037 		((StripManager *)_action)->_useless = 0;
3038 
3039 		_object1.setup(76, 4, 1);
3040 		_object1.animate(ANIM_MODE_5, this);
3041 		break;
3042 	case 3:
3043 		((StripManager *)_action)->_useless = 0;
3044 
3045 		_object1.setup(76, 6, 1);
3046 		_object1.animate(ANIM_MODE_5, this);
3047 		break;
3048 	default:
3049 		signal();
3050 		break;
3051 	}
3052 }
3053 
animateSpeaker()3054 void SpeakerWebbster3240::animateSpeaker() {
3055 	int v = _speakerMode;
3056 	Scene3240 *scene = (Scene3240 *)R2_GLOBALS._sceneManager._scene;
3057 
3058 	if (!_object2) {
3059 		_object2 = &scene->_webbster;
3060 		_object2->hide();
3061 		_object1.postInit();
3062 		_object1.setPosition(_object2->_position);
3063 
3064 		if (_object2->_mover)
3065 			_object2->addMover(NULL);
3066 	}
3067 
3068 	if (v == 0) {
3069 		_object1.animate(ANIM_MODE_2, NULL);
3070 	} else {
3071 		((StripManager *)_action)->_useless = 0;
3072 
3073 		_object1.setup(4110, 5, 1);
3074 		_object1.animate(ANIM_MODE_5, this);
3075 	}
3076 }
3077 
animateSpeaker()3078 void SpeakerWebbster3375::animateSpeaker() {
3079 	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
3080 
3081 	int v = _speakerMode;
3082 
3083 	if (!_object2) {
3084 		_object2 = &scene->_webbster;
3085 		_object2->hide();
3086 		_object1.postInit();
3087 		_object1.setPosition(_object2->_position);
3088 		_object1._numFrames = 7;
3089 		_object1._effect = EFFECT_SHADED;
3090 		_object1.changeZoom(-1);
3091 
3092 		if (scene->_companion1._position.y != 163)
3093 			R2_GLOBALS._player.setStrip(8);
3094 		else
3095 			R2_GLOBALS._player.setStrip(2);
3096 
3097 		if (R2_GLOBALS._player._mover)
3098 			R2_GLOBALS._player.addMover(NULL);
3099 
3100 		R2_GLOBALS._player.disableControl();
3101 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
3102 
3103 		if (_object2->_mover)
3104 			_object2->addMover(NULL);
3105 	}
3106 
3107 	switch (v) {
3108 	case 0:
3109 		_object1.animate(ANIM_MODE_2, NULL);
3110 		break;
3111 	case 1:
3112 		((StripManager *)_action)->_useless = 0;
3113 
3114 		_object1.setup(4110, 5, 1);
3115 		_object1.animate(ANIM_MODE_5, this);
3116 		break;
3117 	default:
3118 		signal();
3119 		break;
3120 	}
3121 }
3122 
animateSpeaker()3123 void SpeakerWebbster3385::animateSpeaker() {
3124 	Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
3125 
3126 	int v = _speakerMode;
3127 
3128 	if (!_object2) {
3129 		_object2 = &scene->_webbster;
3130 		_object2->hide();
3131 		_object1.postInit();
3132 		_object1.setPosition(_object2->_position);
3133 		_object1._numFrames = 7;
3134 		_object1._effect = EFFECT_SHADED;
3135 		_object1.changeZoom(-1);
3136 
3137 		if (R2_GLOBALS._sceneManager._previousScene == 3375)
3138 			R2_GLOBALS._player.setStrip(4);
3139 		else
3140 			R2_GLOBALS._player.setStrip(3);
3141 
3142 		if (R2_GLOBALS._player._mover)
3143 			R2_GLOBALS._player.addMover(NULL);
3144 
3145 		R2_GLOBALS._player.disableControl(CURSOR_TALK);
3146 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
3147 
3148 		if (_object2->_mover)
3149 			_object2->addMover(NULL);
3150 	}
3151 
3152 	switch (v) {
3153 	case 0:
3154 		_object1.animate(ANIM_MODE_2, NULL);
3155 		break;
3156 	case 1:
3157 		((StripManager *)_action)->_useless = 0;
3158 
3159 		_object1.setup(4110, 5, 1);
3160 		_object1.animate(ANIM_MODE_5, this);
3161 		break;
3162 	default:
3163 		signal();
3164 		break;
3165 	}
3166 }
3167 
animateSpeaker()3168 void SpeakerWebbster3395::animateSpeaker() {
3169 	Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;
3170 
3171 	int v = _speakerMode;
3172 
3173 	if (!_object2) {
3174 		_object2 = &scene->_webbster;
3175 		_object2->hide();
3176 		_object1.postInit();
3177 		_object1.setPosition(_object2->_position);
3178 		_object1._numFrames = 7;
3179 		_object1._effect = EFFECT_SHADED;
3180 		_object1.changeZoom(-1);
3181 
3182 		if (R2_GLOBALS._sceneManager._previousScene == 3385)
3183 			R2_GLOBALS._player.setStrip(4);
3184 		else
3185 			R2_GLOBALS._player.setStrip(3);
3186 
3187 		if (R2_GLOBALS._player._mover)
3188 			R2_GLOBALS._player.addMover(NULL);
3189 
3190 		R2_GLOBALS._player.disableControl(CURSOR_TALK);
3191 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
3192 
3193 		if (_object2->_mover)
3194 			_object2->addMover(NULL);
3195 	}
3196 
3197 	switch (v) {
3198 	case 0:
3199 		_object1.animate(ANIM_MODE_2, NULL);
3200 		break;
3201 	case 1:
3202 		((StripManager *)_action)->_useless = 0;
3203 
3204 		_object1.setup(4110, 5, 1);
3205 		_object1.animate(ANIM_MODE_5, this);
3206 		break;
3207 	default:
3208 		signal();
3209 		break;
3210 	}
3211 }
3212 
animateSpeaker()3213 void SpeakerWebbster3400::animateSpeaker() {
3214 	Scene3400 *scene = (Scene3400 *)R2_GLOBALS._sceneManager._scene;
3215 
3216 	int v = _speakerMode;
3217 
3218 	if (!_object2) {
3219 		_object2 = &scene->_webbster;
3220 		_object2->hide();
3221 		_object1.postInit();
3222 		_object1.setPosition(_object2->_position);
3223 		_object1._numFrames = 7;
3224 		_object1._effect = EFFECT_SHADED;
3225 		_object1.changeZoom(-1);
3226 		R2_GLOBALS._player.disableControl();
3227 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
3228 
3229 		if (_object2->_mover)
3230 			_object2->addMover(NULL);
3231 	}
3232 
3233 	switch (v) {
3234 	case 0:
3235 		_object1.animate(ANIM_MODE_2, NULL);
3236 		break;
3237 	case 1:
3238 		((StripManager *)_action)->_useless = 0;
3239 
3240 		_object1.setup(4110, 5, 1);
3241 		_object1.animate(ANIM_MODE_5, this);
3242 		break;
3243 	case 2:
3244 		((StripManager *)_action)->_useless = 0;
3245 
3246 		_object1.setup(4110, 7, 1);
3247 		_object1.animate(ANIM_MODE_5, this);
3248 		break;
3249 	case 3:
3250 		((StripManager *)_action)->_useless = 0;
3251 
3252 		_object1.setup(4110, 3, 1);
3253 		_object1.animate(ANIM_MODE_5, this);
3254 		break;
3255 	default:
3256 		signal();
3257 		break;
3258 	}
3259 }
3260 
3261 //----------------------------------------------------------------------------
3262 
SpeakerDutyOfficer180()3263 SpeakerDutyOfficer180::SpeakerDutyOfficer180(): VisualSpeaker() {
3264 	_speakerName = "DUTYOFFICER";
3265 	_color1 = 5;
3266 	_color2 = 0;
3267 	_speakerMode = 0;
3268 	_textWidth = 300;
3269 	_hideObjects = false;
3270 	_object2 = NULL;
3271 	_displayMode = 1;
3272 	_numFrames = 0;
3273 }
3274 
animateSpeaker()3275 void SpeakerDutyOfficer180::animateSpeaker() {
3276 	Scene180 *scene = (Scene180 *)R2_GLOBALS._sceneManager._scene;
3277 
3278 	int v = _speakerMode;
3279 
3280 	if (!_object2) {
3281 		_object2 = &scene->_dutyOfficer;
3282 		_object2->hide();
3283 		_object1.postInit();
3284 		_object1.setPosition(_object2->_position);
3285 
3286 		if (_object2->_mover)
3287 			_object2->addMover(NULL);
3288 	}
3289 
3290 	switch (v) {
3291 	case 0:
3292 		_object1.animate(ANIM_MODE_2, NULL);
3293 		break;
3294 	case 1:
3295 		_action->_action = NULL;
3296 		_object1.setup(76, 2, 1);
3297 		_object1.animate(ANIM_MODE_5, this);
3298 		break;
3299 	default:
3300 		signal();
3301 		break;
3302 	}
3303 }
3304 
3305 } // End of namespace Ringworld2
3306 } // End of namespace TsAGE
3307