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 "startrek/room.h"
24 
25 #define OBJECT_MUDD 8
26 #define OBJECT_CAPSULE 9
27 #define OBJECT_NORTH_DOOR 10
28 #define OBJECT_ALIENDV 11
29 
30 #define HOTSPOT_CAPSULES 0x20
31 #define HOTSPOT_NORTH_DOOR 0x21
32 #define HOTSPOT_WEST_DOOR 0x22
33 #define HOTSPOT_CONTROL_PANEL 0x23
34 #define HOTSPOT_LEFT_BED 0x24
35 #define HOTSPOT_RIGHT_BED 0x25
36 
37 namespace StarTrek {
38 
39 extern const RoomAction mudd2ActionList[] = {
40 	{ {ACTION_WALK, 0x21, 0, 0}, &Room::mudd2WalkToNorthDoor },
41 	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::mudd2TouchedHotspot0 },
42 	{ {ACTION_WALK, 0x22, 0, 0}, &Room::mudd2WalkToSouthDoor },
43 	{ {ACTION_TOUCHED_HOTSPOT, 1, 0, 0}, &Room::mudd2TouchedHotspot1 },
44 	{ {ACTION_TICK, 1, 0, 0}, &Room::mudd2Tick1 },
45 	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::mudd2Timer1Expired },
46 	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff,   0}, &Room::mudd2UseSTricorderAnywhere },
47 	{ {ACTION_USE, OBJECT_SPOCK,    0x20, 0}, &Room::mudd2UseSpockOnCapsules },
48 	{ {ACTION_GET, 0x20, 0, 0}, &Room::mudd2GetCapsules },
49 	{ {ACTION_FINISHED_WALKING,   12, 0, 0}, &Room::mudd2MccoyReachedCapsules },
50 	{ {ACTION_FINISHED_ANIMATION, 13, 0, 0}, &Room::mudd2MccoyPickedUpCapsules },
51 	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::mudd2UseCommunicator },
52 
53 	// Common code (next 4 lines)
54 	{ {ACTION_USE, OBJECT_IDEGRIME, 0xff, 0}, &Room::muddaUseDegrimer },
55 	{ {ACTION_USE, OBJECT_ILENSES, OBJECT_IDEGRIME, 0}, &Room::muddaUseLenseOnDegrimer },
56 	{ {ACTION_USE, OBJECT_IALIENDV, 0xff, 0}, &Room::muddaUseAlienDevice },
57 	{ {ACTION_FINISHED_ANIMATION, 18, 0, 0}, &Room::muddaFiredAlienDevice },
58 
59 	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::mudd2LookAtCapsules },
60 	{ {ACTION_USE, OBJECT_IMTRICOR, 0x20, 0}, &Room::mudd2UseMTricorderOnCapsules },
61 	{ {ACTION_USE, OBJECT_ICAPSULE, 0x23, 0}, &Room::mudd2UseCapsuleOnControlPanel },
62 	{ {ACTION_FINISHED_WALKING,   15, 0, 0},  &Room::mudd2MccoyReachedControlPanel },
63 	{ {ACTION_FINISHED_ANIMATION, 15, 0, 0},  &Room::mudd2MccoyPutCapsuleInControlPanel },
64 	{ {ACTION_USE, OBJECT_KIRK, 0x24, 0},     &Room::mudd2UseKirkOnBed },
65 	{ {ACTION_USE, OBJECT_KIRK, 0x25, 0},     &Room::mudd2UseKirkOnBed },
66 	{ {ACTION_FINISHED_WALKING, 6, 0, 0},     &Room::mudd2KirkReachedBed },
67 	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0},   &Room::mudd2MuddNoticedKirk },
68 	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0},   &Room::mudd2MuddDroppedCapsule },
69 	{ {ACTION_USE, OBJECT_IPHASERS, 8, 0},    &Room::mudd2UsePhaserOnMudd },
70 	{ {ACTION_USE, OBJECT_IPHASERK, 8, 0},    &Room::mudd2UsePhaserOnMudd },
71 
72 	{ {ACTION_USE, OBJECT_SPOCK, 8, 0},       &Room::mudd2UseSpockOnMudd },
73 	{ {ACTION_FINISHED_WALKING, 4, 0, 0},     &Room::mudd2SpockReachedMudd },
74 	{ {ACTION_FINISHED_ANIMATION, 5, 0, 0},   &Room::mudd2SpockPinchedMudd },
75 	{ {ACTION_USE, OBJECT_KIRK, 8, 0},        &Room::mudd2UseKirkOnMudd },
76 
77 	{ {ACTION_USE, OBJECT_REDSHIRT, 8, 0},    &Room::mudd2UseRedshirtOnMudd },
78 	{ {ACTION_FINISHED_WALKING, 16, 0, 0},    &Room::mudd2RedshirtReachedMudd },
79 	{ {ACTION_TIMER_EXPIRED, 2, 0, 0},        &Room::mudd2Timer2Expired },
80 	{ {ACTION_FINISHED_ANIMATION, 17, 0, 0},  &Room::mudd2MuddFinishedPushingRedshirt },
81 	{ {ACTION_FINISHED_ANIMATION, 16, 0, 0},  &Room::mudd2RedshirtPushedAway },
82 	{ {ACTION_USE, OBJECT_IMTRICOR, 8, 0},    &Room::mudd2UseMTricorderOnMudd },
83 	{ {ACTION_USE, OBJECT_IMEDKIT, 8, 0},     &Room::mudd2UseMedkitOnMudd },
84 	{ {ACTION_USE, OBJECT_MCCOY, 8, 0},       &Room::mudd2UseMedkitOnMudd },
85 	{ {ACTION_FINISHED_WALKING, 10, 0, 0},    &Room::mudd2MccoyReachedMudd },
86 	{ {ACTION_FINISHED_ANIMATION, 11, 0, 0},  &Room::mudd2MccoyCuredMudd },
87 	{ {ACTION_LOOK, OBJECT_KIRK,     0, 0}, &Room::mudd2LookAtKirk },
88 	{ {ACTION_LOOK, OBJECT_SPOCK,    0, 0}, &Room::mudd2LookAtSpock },
89 	{ {ACTION_LOOK, OBJECT_MCCOY,    0, 0}, &Room::mudd2LookAtMccoy },
90 	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd2LookAtRedshirt },
91 	{ {ACTION_LOOK, 8,    0, 0}, &Room::mudd2LookAtMudd },
92 	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::mudd2LookAtControlPanel },
93 	{ {ACTION_LOOK, 0x25, 0, 0}, &Room::mudd2LookAtBed },
94 	{ {ACTION_LOOK, 0x24, 0, 0}, &Room::mudd2LookAtBed },
95 	{ {ACTION_TALK, OBJECT_KIRK,     0, 0}, &Room::mudd2TalkToKirk },
96 	{ {ACTION_TALK, OBJECT_SPOCK,    0, 0}, &Room::mudd2TalkToSpock },
97 	{ {ACTION_TALK, OBJECT_MCCOY,    0, 0}, &Room::mudd2TalkToMccoy },
98 	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd2TalkToRedshirt },
99 	{ {ACTION_TALK, 8,               0, 0}, &Room::mudd2TalkToMudd },
100 
101 	// Common code (countdown for losing atmosphere when life support malfunctioning)
102 	{ {ACTION_TICK, 0xff, 0xff, 0xff},           &Room::muddaTick },
103 	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
104 };
105 
106 enum mudd2TextIds {
107 	TX_SPEAKER_KIRK, TX_SPEAKER_MCCOY, TX_SPEAKER_SPOCK, TX_SPEAKER_UHURA, TX_SPEAKER_BUCHERT,
108 	TX_SPEAKER_MUDD,
109 	TX_MUD2_001, TX_MUD2_002, TX_MUD2_003, TX_MUD2_004, TX_MUD2_005,
110 	TX_MUD2_006, TX_MUD2_007, TX_MUD2_008, TX_MUD2_009, TX_MUD2_010,
111 	TX_MUD2_011, TX_MUD2_012, TX_MUD2_013, TX_MUD2_014, TX_MUD2_015,
112 	TX_MUD2_016, TX_MUD2_018, TX_MUD2_019, TX_MUD2_020, TX_MUD2_021,
113 	TX_MUD2_022, TX_MUD2_023, TX_MUD2_024, TX_MUD2_025, TX_MUD2_026,
114 	TX_MUD2_027, TX_MUD2_028, TX_MUD2_029, TX_MUD2_030, TX_MUD2_031,
115 	TX_MUD2_032, TX_MUD2_033, TX_MUD2_034, TX_MUD2_035, TX_MUD2_036,
116 	TX_MUD2_037, TX_MUD2_038, TX_MUD2_039, TX_MUD2_040, TX_MUD2_042,
117 	TX_MUD2_043, TX_MUD2_044, TX_MUD2_045, TX_MUD2_046, TX_MUD2_047,
118 	TX_MUD2_048, TX_MUD2_049, TX_MUD2_050, TX_MUD2_051, TX_MUD2_052,
119 	TX_MUD2_053, TX_MUD2_054, TX_MUD2_055, TX_MUD2N000, TX_MUD2N002,
120 	TX_MUD2N003, TX_MUD2N004, TX_MUD2N005, TX_MUD2N006, TX_MUD2N007,
121 	TX_MUD2N008, TX_MUD2N011, TX_STATICU1
122 };
123 
124 // TODO: Finish floppy offsets
125 extern const RoomTextOffsets mudd2TextOffsets[] = {
126 	{ TX_SPEAKER_KIRK, 333, 0 },
127 	{ TX_SPEAKER_MCCOY, 344, 0 },
128 	{ TX_SPEAKER_SPOCK, 354, 0 },
129 	{ TX_SPEAKER_UHURA, 376, 0 },
130 	{ TX_SPEAKER_BUCHERT, 364, 0 },
131 	{ TX_SPEAKER_MUDD, 386, 0 },
132 	{ TX_MUD2_001, 5240, 0 },
133 	{ TX_MUD2_002, 1977, 0 },
134 	{ TX_MUD2_003, 8694, 0 },
135 	{ TX_MUD2_004, 2392, 0 },
136 	{ TX_MUD2_005, 8288, 0 },
137 	{ TX_MUD2_006, 10058, 0 },
138 	{ TX_MUD2_007, 9467, 0 },
139 	{ TX_MUD2_008, 9763, 0 },
140 	{ TX_MUD2_009, 1719, 0 },
141 	{ TX_MUD2_010, 9121, 0 },
142 	{ TX_MUD2_011, 9266, 0 },
143 	{ TX_MUD2_012, 5126, 0 },
144 	{ TX_MUD2_013, 5690, 0 },
145 	{ TX_MUD2_014, 2729, 0 },
146 	{ TX_MUD2_015, 5973, 0 },
147 	{ TX_MUD2_016, 5875, 0 },
148 	{ TX_MUD2_018, 1307, 0 },
149 	{ TX_MUD2_019, 2458, 0 },
150 	{ TX_MUD2_020, 2937, 0 },
151 	{ TX_MUD2_021, 6114, 0 },
152 	{ TX_MUD2_022, 3515, 0 },
153 	{ TX_MUD2_023, 10226, 0 },
154 	{ TX_MUD2_024, 10113, 0 },
155 	{ TX_MUD2_025, 9366, 0 },
156 	{ TX_MUD2_026, 4089, 0 },
157 	{ TX_MUD2_027, 8547, 0 },
158 	{ TX_MUD2_028, 9050, 0 },
159 	{ TX_MUD2_029, 3045, 0 },
160 	{ TX_MUD2_030, 2232, 0 },
161 	{ TX_MUD2_031, 4278, 0 },
162 	{ TX_MUD2_032, 3764, 0 },
163 	{ TX_MUD2_033, 6423, 0 },
164 	{ TX_MUD2_034, 3292, 0 },
165 	{ TX_MUD2_035, 8400, 0 },
166 	{ TX_MUD2_036, 8737, 0 },
167 	{ TX_MUD2_037, 1165, 0 },
168 	{ TX_MUD2_038, 8446, 0 },
169 	{ TX_MUD2_039, 3202, 0 },
170 	{ TX_MUD2_040, 9223, 0 },
171 	{ TX_MUD2_042, 4656, 0 },
172 	{ TX_MUD2_043, 4831, 0 },
173 	{ TX_MUD2_044, 3575, 0 },
174 	{ TX_MUD2_045, 6564, 0 },
175 	{ TX_MUD2_046, 8342, 0 },
176 	{ TX_MUD2_047, 9841, 0 },
177 	{ TX_MUD2_048, 8883, 0 },
178 	{ TX_MUD2_049, 3917, 0 },
179 	{ TX_MUD2_050, 4442, 0 },
180 	{ TX_MUD2_051, 4190, 0 },
181 	{ TX_MUD2_052, 5521, 0 },
182 	{ TX_MUD2_053, 4525, 0 },
183 	{ TX_MUD2_054, 9535, 0 },
184 	{ TX_MUD2_055, 8611, 0 },
185 	{ TX_MUD2N000, 7954, 0 },
186 	{ TX_MUD2N002, 8128, 0 },
187 	{ TX_MUD2N003, 7795, 0 },
188 	{ TX_MUD2N004, 8028, 0 },
189 	{ TX_MUD2N005, 7449, 0 },
190 	{ TX_MUD2N006, 7899, 0 },
191 	{ TX_MUD2N007, 10590, 0 },
192 	{ TX_MUD2N008, 2122, 0 },
193 	{ TX_MUD2N011, 10479, 0 },
194 	{ TX_STATICU1, 1756, 0 },
195 	{          -1, 0,    0 }
196 };
197 
198 extern const RoomText mudd2Texts[] = {
199 	  { -1, Common::UNK_LANG, "" }
200 };
201 
mudd2WalkToNorthDoor()202 void Room::mudd2WalkToNorthDoor() {
203 	_roomVar.mudd.walkingToDoor = true;
204 	_awayMission->disableInput = true;
205 	walkCrewman(OBJECT_KIRK, 0xbc, 0x6a);
206 }
207 
mudd2TouchedHotspot0()208 void Room::mudd2TouchedHotspot0() { // Trigger north door
209 	if (_roomVar.mudd.walkingToDoor) {
210 		playVoc("SMADOOR3");
211 		loadActorAnim(OBJECT_NORTH_DOOR, "s4sbdo", 0xbe, 0x6b);
212 	}
213 }
214 
mudd2WalkToSouthDoor()215 void Room::mudd2WalkToSouthDoor() {
216 	_roomVar.mudd.walkingToDoor = true;
217 	_awayMission->disableInput = true;
218 	walkCrewman(OBJECT_KIRK, 0x46, 0x6f);
219 }
220 
mudd2TouchedHotspot1()221 void Room::mudd2TouchedHotspot1() {
222 	if (_roomVar.mudd.walkingToDoor) {
223 		playVoc("SMADOOR3");
224 	}
225 }
226 
mudd2Tick1()227 void Room::mudd2Tick1() {
228 	playVoc("MUD2LOOP");
229 	_awayMission->crewDirectionsAfterWalk[OBJECT_KIRK] = DIR_W;
230 	_awayMission->crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_W;
231 	_awayMission->crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_W;
232 	_awayMission->crewDirectionsAfterWalk[OBJECT_REDSHIRT] = DIR_W;
233 	_awayMission->mudd.muddCurrentlyInsane = false;
234 
235 	if (_awayMission->mudd.muddInsanityState == 0) { // First time entering room
236 		_awayMission->mudd.muddInsanityState = 1;
237 	} else if (_awayMission->mudd.muddInsanityState == 2) { // Currently insane
238 		_awayMission->mudd.muddCurrentlyInsane = true;
239 		if (!_awayMission->mudd.muddUnconscious) {
240 			_awayMission->mudd.muddUnconscious = false;
241 			loadActorAnim2(OBJECT_MUDD, "s4sbhn", 0x9f, 0xbf);
242 			loadActorAnim2(OBJECT_CAPSULE, "s4sbvp", 0x93, 0xc3);
243 		} else {
244 			loadActorAnim2(OBJECT_MUDD, "s4sbob", 0x9f, 0xba);
245 		}
246 	} else if (_awayMission->mudd.muddUnavailable) {
247 		_awayMission->mudd.muddInsanityState = 1;
248 	} else if (_awayMission->mudd.muddInsanityState == 1) { // Second time entering room, start cutscene
249 		playMidiMusicTracks(3);
250 		loadActorAnim2(OBJECT_MUDD, "s4sbhw", 0x99, 0xbf);
251 		_awayMission->disableInput = 2;
252 		_awayMission->mudd.muddInhaledGas = true;
253 		_awayMission->timers[1] = 70;
254 		_awayMission->mudd.muddInsanityState = 2;
255 		_awayMission->mudd.muddUnavailable = true;
256 	}
257 }
258 
mudd2Timer1Expired()259 void Room::mudd2Timer1Expired() {
260 	loadActorAnimC(OBJECT_MUDD, "s4sbmt", 0xa0, 0xbf, &Room::mudd2MuddNoticedKirk);
261 }
262 
mudd2UseSTricorderAnywhere()263 void Room::mudd2UseSTricorderAnywhere() {
264 	spockScan(DIR_S, TX_SPEAKER_SPOCK, TX_MUD2_037, false);
265 }
266 
mudd2UseSpockOnCapsules()267 void Room::mudd2UseSpockOnCapsules() {
268 	showText(TX_SPEAKER_MCCOY, TX_MUD2_018);
269 }
270 
mudd2GetCapsules()271 void Room::mudd2GetCapsules() {
272 	if (!_awayMission->mudd.muddInhaledGas || _awayMission->mudd.muddUnconscious) {
273 		if (!_awayMission->mudd.translatedAlienLanguage)
274 			showText(TX_SPEAKER_MCCOY, TX_MUD2_024);
275 		else
276 			walkCrewmanC(OBJECT_MCCOY, 0x9f, 0xbf, &Room::mudd2MccoyReachedCapsules);
277 	} else {
278 		showText(TX_SPEAKER_MCCOY, TX_MUD2_023);
279 	}
280 }
281 
mudd2MccoyReachedCapsules()282 void Room::mudd2MccoyReachedCapsules() {
283 	loadActorAnimC(OBJECT_MCCOY, "musehn", -1, -1, &Room::mudd2MccoyPickedUpCapsules);
284 	giveItem(OBJECT_ICAPSULE);
285 }
286 
mudd2MccoyPickedUpCapsules()287 void Room::mudd2MccoyPickedUpCapsules() {
288 	_awayMission->crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_W;
289 	walkCrewman(OBJECT_MCCOY, 0xfe, 0xb2);
290 }
291 
mudd2UseCommunicator()292 void Room::mudd2UseCommunicator() {
293 	showText(TX_SPEAKER_KIRK,  TX_MUD2_009);
294 	showText(TX_SPEAKER_UHURA, TX_STATICU1);
295 }
296 
mudd2LookAtCapsules()297 void Room::mudd2LookAtCapsules() {
298 	showDescription(TX_MUD2N008);
299 }
300 
mudd2UseMTricorderOnCapsules()301 void Room::mudd2UseMTricorderOnCapsules() {
302 	mccoyScan(DIR_W, TX_SPEAKER_MCCOY, TX_MUD2_030, false);
303 	showText(TX_SPEAKER_KIRK,  TX_MUD2_004);
304 	showText(TX_SPEAKER_MCCOY, TX_MUD2_019);
305 }
306 
mudd2UseCapsuleOnControlPanel()307 void Room::mudd2UseCapsuleOnControlPanel() {
308 	if (!_awayMission->mudd.muddInhaledGas || _awayMission->mudd.muddUnconscious)
309 		walkCrewmanC(OBJECT_MCCOY, 0x9f, 0xbf, &Room::mudd2MccoyReachedControlPanel);
310 	else
311 		showText(TX_SPEAKER_MCCOY, TX_MUD2_023);
312 }
313 
mudd2MccoyReachedControlPanel()314 void Room::mudd2MccoyReachedControlPanel() {
315 	if (_awayMission->mudd.translatedAlienLanguage)
316 		loadActorAnimC(OBJECT_MCCOY, "musehn", -1, -1, &Room::mudd2MccoyPutCapsuleInControlPanel);
317 	else // NOTE: Unused, since you can't get capsules without translating the language first
318 		showText(TX_SPEAKER_MCCOY, TX_MUD2_014);
319 }
320 
mudd2MccoyPutCapsuleInControlPanel()321 void Room::mudd2MccoyPutCapsuleInControlPanel() {
322 	_awayMission->crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_N;
323 	loadActorStandAnim(OBJECT_MCCOY);
324 	showText(TX_SPEAKER_MCCOY, TX_MUD2_020);
325 	showText(TX_SPEAKER_MCCOY, TX_MUD2_029);
326 	showText(TX_SPEAKER_SPOCK, TX_MUD2_039);
327 	if (_awayMission->mudd.muddUnconscious)
328 		showText(TX_SPEAKER_MCCOY, TX_MUD2_034);
329 
330 	_awayMission->mudd.putCapsuleInMedicalMachine = true;
331 
332 	loseItem(OBJECT_ICAPSULE);
333 	_awayMission->crewDirectionsAfterWalk[OBJECT_MCCOY] = DIR_W;
334 	walkCrewman(OBJECT_MCCOY, 0xfe, 0xb2);
335 }
336 
mudd2UseKirkOnBed()337 void Room::mudd2UseKirkOnBed() {
338 	if (!_awayMission->mudd.putCapsuleInMedicalMachine && !_awayMission->mudd.translatedAlienLanguage) {
339 		walkCrewmanC(OBJECT_KIRK, 0xd7, 0xbd, &Room::mudd2KirkReachedBed);
340 	} else if (_awayMission->mudd.translatedAlienLanguage) {
341 		walkCrewman(OBJECT_KIRK, 0xd7, 0xbd, 7); // BUG(?): no continuation?
342 	}
343 }
344 
mudd2KirkReachedBed()345 void Room::mudd2KirkReachedBed() {
346 	// BUGFIX: Speaker is mccoy, not none
347 	showText(TX_SPEAKER_MCCOY, TX_MUD2_022);
348 }
349 
350 
mudd2MuddNoticedKirk()351 void Room::mudd2MuddNoticedKirk() {
352 	showText(TX_SPEAKER_MUDD, TX_MUD2_044);
353 	playVoc("BATTYGAS");
354 	loadActorAnimC(OBJECT_MUDD, "s4sbhb", 0x9f, 0xbf, &Room::mudd2MuddDroppedCapsule); // Drops the capsule
355 	playMidiMusicTracks(0);
356 }
357 
mudd2MuddDroppedCapsule()358 void Room::mudd2MuddDroppedCapsule() {
359 	loadActorAnim2(OBJECT_MUDD, "s4sbhn", 0x9f, 0xbf, 3); // NOTE: no callback from this
360 	loadActorAnim2(OBJECT_CAPSULE, "s4sbvp", 0x93, 0xc3);
361 	_awayMission->mudd.muddCurrentlyInsane = true;
362 
363 	showText(TX_SPEAKER_MCCOY, TX_MUD2_032);
364 	showText(TX_SPEAKER_MUDD,  TX_MUD2_049);
365 	showText(TX_SPEAKER_MCCOY, TX_MUD2_026);
366 	showText(TX_SPEAKER_MUDD,  TX_MUD2_051);
367 	showText(TX_SPEAKER_MCCOY, TX_MUD2_031);
368 	showText(TX_SPEAKER_MUDD,  TX_MUD2_050);
369 
370 	_awayMission->disableInput = false;
371 }
372 
373 
mudd2UsePhaserOnMudd()374 void Room::mudd2UsePhaserOnMudd() {
375 	if (_awayMission->mudd.muddInhaledGas && !_awayMission->mudd.muddUnconscious) {
376 		showText(TX_SPEAKER_BUCHERT, TX_MUD2_053);
377 		showText(TX_SPEAKER_MUDD,    TX_MUD2_042);
378 		showText(TX_SPEAKER_MUDD,    TX_MUD2_043);
379 	}
380 }
381 
382 
383 // Spock neck-pinches Mudd
mudd2UseSpockOnMudd()384 void Room::mudd2UseSpockOnMudd() {
385 	if (_awayMission->mudd.muddInhaledGas && !_awayMission->mudd.muddUnconscious) {
386 		_awayMission->disableInput = true;
387 		walkCrewmanC(OBJECT_SPOCK, 0x8a, 0xbf, &Room::mudd2SpockReachedMudd);
388 	}
389 }
390 
mudd2SpockReachedMudd()391 void Room::mudd2SpockReachedMudd() {
392 	loadActorAnimC(OBJECT_SPOCK, "s4sbsp", 0x9f, 0xbf, &Room::mudd2SpockPinchedMudd);
393 	loadActorStandAnim(OBJECT_MUDD);
394 }
395 
mudd2SpockPinchedMudd()396 void Room::mudd2SpockPinchedMudd() {
397 	loadActorAnim2(OBJECT_MUDD, "s4sbob", 0x9f, 0xba);
398 	loadActorAnim2(OBJECT_SPOCK, "sstnde", 0xd0, 0xbd);
399 
400 	showText(TX_SPEAKER_SPOCK, TX_MUD2_012);
401 
402 	_awayMission->disableInput = false;
403 	_awayMission->mudd.muddUnconscious = true;
404 	_awayMission->crewDirectionsAfterWalk[OBJECT_SPOCK] = DIR_W;
405 	walkCrewman(OBJECT_SPOCK, 0x118, 0xc4);
406 }
407 
mudd2UseKirkOnMudd()408 void Room::mudd2UseKirkOnMudd() {
409 	if (_awayMission->mudd.muddInhaledGas && !_awayMission->mudd.muddUnconscious) {
410 		showText(TX_SPEAKER_KIRK, TX_MUD2_001);
411 		mudd2UseSpockOnMudd();
412 	}
413 }
414 
mudd2UseRedshirtOnMudd()415 void Room::mudd2UseRedshirtOnMudd() {
416 	if (_awayMission->mudd.muddInhaledGas && !_awayMission->mudd.muddUnconscious) {
417 		_awayMission->disableInput = true;
418 		walkCrewmanC(OBJECT_REDSHIRT, 0xc3, 0xbe, &Room::mudd2RedshirtReachedMudd);
419 	}
420 }
421 
mudd2RedshirtReachedMudd()422 void Room::mudd2RedshirtReachedMudd() {
423 	_awayMission->timers[2] = 8;
424 	loadActorAnimC(OBJECT_REDSHIRT, "s4sbrh", -1, -1, &Room::mudd2RedshirtPushedAway);
425 	playVoc("ROCKFACE");
426 	loadActorAnimC(OBJECT_MUDD, "s4sbhh", 0x9f, 0xbf, &Room::mudd2MuddFinishedPushingRedshirt);
427 }
428 
mudd2Timer2Expired()429 void Room::mudd2Timer2Expired() {
430 }
431 
mudd2MuddFinishedPushingRedshirt()432 void Room::mudd2MuddFinishedPushingRedshirt() {
433 	loadActorAnim2(OBJECT_MUDD, "s4sbhn");
434 }
435 
mudd2RedshirtPushedAway()436 void Room::mudd2RedshirtPushedAway() {
437 	showText(TX_SPEAKER_BUCHERT, TX_MUD2_052);
438 	loadActorAnim(OBJECT_REDSHIRT, "rstnds", 0xd8, 0xc3);
439 	_awayMission->disableInput = false;
440 	_awayMission->crewDirectionsAfterWalk[OBJECT_REDSHIRT] = DIR_W;
441 	walkCrewman(OBJECT_REDSHIRT, 0x117, 0xae);
442 }
443 
444 
445 // BUGFIX: This was originally "Action 0x45 on Mudd"; as far as I know, action 0x45
446 // doesn't exist. It's far more likely that 0x45 is supposed to correspond to
447 // OBJECT_IMTRICOR in a USE action.
448 // The function itself was also modified (ie. condition for showing text was inverted).
mudd2UseMTricorderOnMudd()449 void Room::mudd2UseMTricorderOnMudd() {
450 	if (_awayMission->mudd.muddInhaledGas && !_awayMission->mudd.muddUnconscious)
451 		mccoyScan(DIR_W, TX_SPEAKER_MCCOY, TX_MUD2_013, false);
452 }
453 
454 
mudd2UseMedkitOnMudd()455 void Room::mudd2UseMedkitOnMudd() {
456 	if (!_awayMission->mudd.muddInhaledGas)
457 		return;
458 	else if (_awayMission->mudd.muddUnconscious) {
459 		if (!_awayMission->mudd.translatedAlienLanguage)
460 			showText(TX_SPEAKER_MCCOY, TX_MUD2_015);
461 		else if (!_awayMission->mudd.putCapsuleInMedicalMachine)
462 			showText(TX_SPEAKER_MCCOY, TX_MUD2_021);
463 		else
464 			walkCrewmanC(OBJECT_MCCOY, 0xde, 0xaf, &Room::mudd2MccoyReachedMudd);
465 	} else // Can't get to him since he's busy being crazy
466 		showText(TX_SPEAKER_MCCOY, TX_MUD2_016);
467 }
468 
mudd2MccoyReachedMudd()469 void Room::mudd2MccoyReachedMudd() {
470 	_awayMission->mudd.missionScore += 2;
471 	loadActorAnimC(OBJECT_MCCOY, "s4sbms", -1, -1, &Room::mudd2MccoyCuredMudd);
472 }
473 
mudd2MccoyCuredMudd()474 void Room::mudd2MccoyCuredMudd() {
475 	_awayMission->mudd.muddUnavailable = false;
476 	_awayMission->mudd.muddInsanityState = 3;
477 	_awayMission->mudd.muddCurrentlyInsane = false;
478 	_awayMission->mudd.muddInhaledGas = false;
479 
480 	showText(TX_SPEAKER_MCCOY, TX_MUD2_033);
481 	showText(TX_SPEAKER_MUDD,  TX_MUD2_045);
482 
483 	_awayMission->mudd.muddUnconscious = false;
484 }
485 
486 
mudd2LookAtKirk()487 void Room::mudd2LookAtKirk() {
488 	showDescription(TX_MUD2N003);
489 }
490 
mudd2LookAtSpock()491 void Room::mudd2LookAtSpock() {
492 	showDescription(TX_MUD2N006);
493 }
494 
mudd2LookAtMccoy()495 void Room::mudd2LookAtMccoy() {
496 	showDescription(TX_MUD2N000);
497 }
498 
mudd2LookAtRedshirt()499 void Room::mudd2LookAtRedshirt() {
500 	showDescription(TX_MUD2N004);
501 }
502 
mudd2LookAtMudd()503 void Room::mudd2LookAtMudd() {
504 	showDescription(TX_MUD2N002);
505 }
506 
mudd2LookAtControlPanel()507 void Room::mudd2LookAtControlPanel() {
508 	showDescription(TX_MUD2N011);
509 }
510 
mudd2LookAtBed()511 void Room::mudd2LookAtBed() {
512 	showDescription(TX_MUD2N007);
513 }
514 
mudd2TalkToKirk()515 void Room::mudd2TalkToKirk() {
516 	// BUGFIX: second condition in if statement changed to "must be false" instead of
517 	// "must be true". (Same applies to below talk functions.)
518 	if (!_awayMission->mudd.muddCurrentlyInsane || !_awayMission->mudd.muddInhaledGas || _awayMission->mudd.muddUnconscious)
519 		showText(TX_SPEAKER_KIRK, TX_MUD2_010);
520 	else {
521 		showText(TX_SPEAKER_KIRK,  TX_MUD2_005);
522 		showText(TX_SPEAKER_MUDD,  TX_MUD2_046);
523 		showText(TX_SPEAKER_MCCOY, TX_MUD2_035);
524 	}
525 }
526 
mudd2TalkToSpock()527 void Room::mudd2TalkToSpock() {
528 	if (!_awayMission->mudd.muddCurrentlyInsane || !_awayMission->mudd.muddInhaledGas || _awayMission->mudd.muddUnconscious) {
529 		showText(TX_SPEAKER_SPOCK, TX_MUD2_040);
530 		showText(TX_SPEAKER_KIRK,  TX_MUD2_011);
531 	} else {
532 		showText(TX_SPEAKER_SPOCK, TX_MUD2_038);
533 	}
534 }
535 
mudd2TalkToMccoy()536 void Room::mudd2TalkToMccoy() {
537 	if (!_awayMission->mudd.muddCurrentlyInsane || !_awayMission->mudd.muddInhaledGas || _awayMission->mudd.muddUnconscious) {
538 		showText(TX_SPEAKER_MCCOY, TX_MUD2_025);
539 		showText(TX_SPEAKER_KIRK,  TX_MUD2_007);
540 	} else {
541 		showText(TX_SPEAKER_MCCOY, TX_MUD2_027);
542 	}
543 }
544 
mudd2TalkToRedshirt()545 void Room::mudd2TalkToRedshirt() {
546 	if (!_awayMission->mudd.muddCurrentlyInsane || !_awayMission->mudd.muddInhaledGas || _awayMission->mudd.muddUnconscious) {
547 		showText(TX_SPEAKER_BUCHERT, TX_MUD2_054);
548 		showText(TX_SPEAKER_KIRK,    TX_MUD2_008);
549 	} else {
550 		showText(TX_SPEAKER_BUCHERT, TX_MUD2_055);
551 		showText(TX_SPEAKER_KIRK,    TX_MUD2_003);
552 		showText(TX_SPEAKER_MCCOY,   TX_MUD2_036);
553 	}
554 }
555 
mudd2TalkToMudd()556 void Room::mudd2TalkToMudd() {
557 	if (!_awayMission->mudd.muddCurrentlyInsane || !_awayMission->mudd.muddInhaledGas || _awayMission->mudd.muddUnconscious)
558 		return;
559 	else if (_awayMission->mudd.muddInhaledGas) {
560 		showText(TX_SPEAKER_MUDD, TX_MUD2_048);
561 		showText(TX_SPEAKER_MCCOY, TX_MUD2_028);
562 	} else { // NOTE: Unused (assumes harry is in a normal state, which doesn't happen here)
563 		showText(TX_SPEAKER_MUDD, TX_MUD2_047);
564 		showText(TX_SPEAKER_KIRK, TX_MUD2_006);
565 	}
566 }
567 
568 }
569