1 //Copyright Paul Reiche, Fred Ford. 1992-2002
2 
3 /*
4  *  This program is free software; you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation; either version 2 of the License, or
7  *  (at your option) any later version.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with this program; if not, write to the Free Software
16  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17  */
18 
19 #include "../commall.h"
20 #include "../spathi/resinst.h"
21 #include "strings.h"
22 
23 #include "uqm/build.h"
24 #include "uqm/gameev.h"
25 
26 
27 static LOCDATA spahome_desc =
28 {
29 	NULL, /* init_encounter_func */
30 	NULL, /* post_encounter_func */
31 	NULL, /* uninit_encounter_func */
32 	SPATHI_HOME_PMAP_ANIM, /* AlienFrame */
33 	SPATHI_FONT, /* AlienFont */
34 	WHITE_COLOR_INIT, /* AlienTextFColor */
35 	BLACK_COLOR_INIT, /* AlienTextBColor */
36 	{0, 0}, /* AlienTextBaseline */
37 	0, /* SIS_TEXT_WIDTH - 16, */ /* AlienTextWidth */
38 	ALIGN_CENTER, /* AlienTextAlign */
39 	VALIGN_TOP, /* AlienTextValign */
40 	SPATHI_HOME_COLOR_MAP, /* AlienColorMap */
41 	SPATHI_MUSIC, /* AlienSong */
42 	NULL_RESOURCE, /* AlienAltSong */
43 	0, /* AlienSongFlags */
44 	SPATHI_HOME_CONVERSATION_PHRASES, /* PlayerPhrases */
45 	14, /* NumAnimations */
46 	{ /* AlienAmbientArray (ambient animations) */
47 		{
48 			1, /* StartIndex */
49 			3, /* NumFrames */
50 			CIRCULAR_ANIM, /* AnimFlags */
51 			ONE_SECOND / 20, 0, /* FrameRate */
52 			ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
53 			0, /* BlockMask */
54 		},
55 		{
56 			4, /* StartIndex */
57 			5, /* NumFrames */
58 			CIRCULAR_ANIM, /* AnimFlags */
59 			ONE_SECOND / 20, 0, /* FrameRate */
60 			ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
61 			0, /* BlockMask */
62 		},
63 		{
64 			9, /* StartIndex */
65 			4, /* NumFrames */
66 			CIRCULAR_ANIM, /* AnimFlags */
67 			ONE_SECOND / 20, 0, /* FrameRate */
68 			ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
69 			(1 << 10) | (1 << 11), /* BlockMask */
70 		},
71 		{
72 			13, /* StartIndex */
73 			6, /* NumFrames */
74 			CIRCULAR_ANIM, /* AnimFlags */
75 			ONE_SECOND / 20, 0, /* FrameRate */
76 			ONE_SECOND / 20, 0, /* RestartRate */
77 			(1 << 4) | (1 << 5) /* BlockMask */
78 		},
79 		{
80 			19, /* StartIndex */
81 			3, /* NumFrames */
82 			YOYO_ANIM, /* AnimFlags */
83 			ONE_SECOND / 20, 0, /* FrameRate */
84 			ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
85 			(1 << 3) | (1 << 5), /* BlockMask */
86 		},
87 		{
88 			22, /* StartIndex */
89 			4, /* NumFrames */
90 			YOYO_ANIM, /* AnimFlags */
91 			ONE_SECOND / 10, ONE_SECOND / 30, /* FrameRate */
92 			ONE_SECOND / 10, ONE_SECOND / 30, /* RestartRate */
93 			(1 << 3) | (1 << 4)
94 			| (1 << 10), /* BlockMask */
95 		},
96 		{
97 			26, /* StartIndex */
98 			3, /* NumFrames */
99 			YOYO_ANIM, /* AnimFlags */
100 			ONE_SECOND / 10, ONE_SECOND / 30, /* FrameRate */
101 			ONE_SECOND * 10, ONE_SECOND * 3, /* RestartRate */
102 			(1 << 10), /* BlockMask */
103 		},
104 		{
105 			29, /* StartIndex */
106 			3, /* NumFrames */
107 			YOYO_ANIM, /* AnimFlags */
108 			ONE_SECOND / 10, ONE_SECOND / 30, /* FrameRate */
109 			ONE_SECOND * 10, ONE_SECOND * 3, /* RestartRate */
110 			0, /* BlockMask */
111 		},
112 		{
113 			32, /* StartIndex */
114 			7, /* NumFrames */
115 			CIRCULAR_ANIM, /* AnimFlags */
116 			ONE_SECOND / 20, 0, /* FrameRate */
117 			ONE_SECOND / 20, 0, /* RestartRate */
118 			(1 << 9) | (1 << 10), /* BlockMask */
119 		},
120 		{
121 			39, /* StartIndex */
122 			3, /* NumFrames */
123 			YOYO_ANIM, /* AnimFlags */
124 			ONE_SECOND / 20, 0, /* FrameRate */
125 			ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
126 			(1 << 8) | (1 << 10), /* BlockMask */
127 		},
128 		{
129 			42, /* StartIndex */
130 			4, /* NumFrames */
131 			YOYO_ANIM, /* AnimFlags */
132 			ONE_SECOND / 10, ONE_SECOND / 30, /* FrameRate */
133 			ONE_SECOND / 30, 0, /* RestartRate */
134 			(1 << 8) | (1 << 9)
135 			| (1 << 6) | (1 << 2)
136 			| (1 << 11) | (1 << 5), /* BlockMask */
137 		},
138 		{
139 			46, /* StartIndex */
140 			4, /* NumFrames */
141 			YOYO_ANIM, /* AnimFlags */
142 			ONE_SECOND / 10, ONE_SECOND / 30, /* FrameRate */
143 			ONE_SECOND / 10, ONE_SECOND / 30, /* RestartRate */
144 			(1 << 2) | (1 << 10), /* BlockMask */
145 		},
146 		{
147 			50, /* StartIndex */
148 			6, /* NumFrames */
149 			CIRCULAR_ANIM, /* AnimFlags */
150 			ONE_SECOND / 20, 0, /* FrameRate */
151 			ONE_SECOND / 20, 0, /* RestartRate */
152 			(1 << 13), /* BlockMask */
153 		},
154 		{
155 			56, /* StartIndex */
156 			3, /* NumFrames */
157 			YOYO_ANIM, /* AnimFlags */
158 			ONE_SECOND / 20, 0, /* FrameRate */
159 			ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
160 			(1 << 12), /* BlockMask */
161 		},
162 	},
163 	{ /* AlienTransitionDesc - empty */
164 		0, /* StartIndex */
165 		0, /* NumFrames */
166 		0, /* AnimFlags */
167 		0, 0, /* FrameRate */
168 		0, 0, /* RestartRate */
169 		0, /* BlockMask */
170 	},
171 	{ /* AlienTalkDesc - empty */
172 		0, /* StartIndex */
173 		0, /* NumFrames */
174 		0, /* AnimFlags */
175 		0, 0, /* FrameRate */
176 		0, 0, /* RestartRate */
177 		0, /* BlockMask */
178 	},
179 	NULL, /* AlienNumberSpeech - none */
180 	/* Filler for loaded resources */
181 	NULL, NULL, NULL,
182 	NULL,
183 	NULL,
184 };
185 
186 static void
ExitConversation(RESPONSE_REF R)187 ExitConversation (RESPONSE_REF R)
188 {
189 	setSegue (Segue_peace);
190 	if (PLAYER_SAID (R, we_attack_again))
191 	{
192 		NPCPhrase (WE_FIGHT_AGAIN);
193 
194 		setSegue (Segue_hostile);
195 	}
196 	else if (PLAYER_SAID (R, surrender_or_die))
197 	{
198 		NPCPhrase (DEFEND_OURSELVES);
199 
200 		setSegue (Segue_hostile);
201 	}
202 	else if (PLAYER_SAID (R, we_are_vindicator0))
203 	{
204 		NPCPhrase (NO_PASSWORD);
205 
206 		setSegue (Segue_hostile);
207 	}
208 	else if (PLAYER_SAID (R, gort_merenga)
209 			|| PLAYER_SAID (R, guph_florp)
210 			|| PLAYER_SAID (R, wagngl_fthagn)
211 			|| PLAYER_SAID (R, pleeese))
212 	{
213 		NPCPhrase (WRONG_PASSWORD);
214 
215 		setSegue (Segue_hostile);
216 	}
217 	else if (PLAYER_SAID (R, screw_password))
218 	{
219 		NPCPhrase (NO_PASSWORD);
220 
221 		setSegue (Segue_hostile);
222 	}
223 	else if (PLAYER_SAID (R, bye_no_ally_offer))
224 		NPCPhrase (GOODBYE_NO_ALLY_OFFER);
225 	else if (PLAYER_SAID (R, bye_angry_spathi))
226 		NPCPhrase (GOODBYE_ANGRY_SPATHI);
227 	else if (PLAYER_SAID (R, bye_ally))
228 		NPCPhrase (GOODBYE_ALLY);
229 	else if (PLAYER_SAID (R, already_got_them))
230 	{
231 		NPCPhrase (EARLY_BIRD_CHECK);
232 
233 		SET_GAME_STATE (SPATHI_HOME_VISITS, 0);
234 		SET_GAME_STATE (SPATHI_VISITS, 0);
235 		SET_GAME_STATE (SPATHI_PARTY, 1);
236 		SET_GAME_STATE (SPATHI_MANNER, 3);
237 	}
238 	else if (PLAYER_SAID (R, too_dangerous))
239 		NPCPhrase (WE_AGREE);
240 	else if (PLAYER_SAID (R, think_more))
241 		NPCPhrase (COWARD);
242 	else if (PLAYER_SAID (R, i_accept))
243 	{
244 		NPCPhrase (AWAIT_RETURN);
245 
246 		SET_GAME_STATE (SPATHI_QUEST, 1);
247 		SET_GAME_STATE (SPATHI_MANNER, 3);
248 		SET_GAME_STATE (SPATHI_VISITS, 0);
249 	}
250 	else if (PLAYER_SAID (R, do_as_we_say))
251 	{
252 		NPCPhrase (DEPART_FOR_EARTH);
253 
254 		SetRaceAllied (SPATHI_SHIP, TRUE);
255 		AddEvent (RELATIVE_EVENT, 6, 0, 0, SPATHI_SHIELD_EVENT);
256 		SET_GAME_STATE (SPATHI_HOME_VISITS, 0);
257 		SET_GAME_STATE (SPATHI_VISITS, 0);
258 	}
259 	else if (PLAYER_SAID (R, killed_them_all_1))
260 	{
261 		NPCPhrase (WILL_CHECK_1);
262 
263 		if (!GET_GAME_STATE (SPATHI_CREATURES_ELIMINATED))
264 		{
265 			SET_GAME_STATE (LIED_ABOUT_CREATURES, 1);
266 		}
267 		else
268 		{
269 			SET_GAME_STATE (SPATHI_HOME_VISITS, 0);
270 			SET_GAME_STATE (SPATHI_VISITS, 0);
271 			SET_GAME_STATE (SPATHI_PARTY, 1);
272 			SET_GAME_STATE (SPATHI_MANNER, 3);
273 		}
274 	}
275 	else if (PLAYER_SAID (R, killed_them_all_2))
276 	{
277 		NPCPhrase (WILL_CHECK_2);
278 
279 		if (!GET_GAME_STATE (SPATHI_CREATURES_ELIMINATED))
280 		{
281 			SET_GAME_STATE (LIED_ABOUT_CREATURES, 2);
282 		}
283 		else
284 		{
285 			SET_GAME_STATE (SPATHI_HOME_VISITS, 0);
286 			SET_GAME_STATE (SPATHI_VISITS, 0);
287 			SET_GAME_STATE (SPATHI_PARTY, 1);
288 			SET_GAME_STATE (SPATHI_MANNER, 3);
289 		}
290 	}
291 	else if (PLAYER_SAID (R, bye_before_party))
292 	{
293 		NPCPhrase (GOODBYE_BEFORE_PARTY);
294 	}
295 	else if (PLAYER_SAID (R, bye_from_party_1)
296 		   || PLAYER_SAID (R, bye_from_party_2)
297 		   || PLAYER_SAID (R, bye_from_party_3))
298 	{
299 		NPCPhrase (GOODBYE_FROM_PARTY);
300 	}
301 }
302 
303 static void SpathiAllies (RESPONSE_REF R);
304 
305 static void
SpathiInfo(RESPONSE_REF R)306 SpathiInfo (RESPONSE_REF R)
307 {
308 	BYTE InfoLeft;
309 
310 	InfoLeft = FALSE;
311 	if (PLAYER_SAID (R, like_some_info))
312 		NPCPhrase (WHAT_ABOUT);
313 	else if (PLAYER_SAID (R, what_about_hierarchy))
314 	{
315 		NPCPhrase (ABOUT_HIERARCHY);
316 
317 		DISABLE_PHRASE (what_about_hierarchy);
318 	}
319 	else if (PLAYER_SAID (R, what_about_history))
320 	{
321 		NPCPhrase (ABOUT_HISTORY);
322 
323 		DISABLE_PHRASE (what_about_history);
324 	}
325 	else if (PLAYER_SAID (R, what_about_alliance))
326 	{
327 		NPCPhrase (ABOUT_ALLIANCE);
328 
329 		DISABLE_PHRASE (what_about_alliance);
330 	}
331 	else if (PLAYER_SAID (R, what_about_other))
332 	{
333 		NPCPhrase (ABOUT_OTHER);
334 
335 		DISABLE_PHRASE (what_about_other);
336 	}
337 	else if (PLAYER_SAID (R, what_about_precursors))
338 	{
339 		NPCPhrase (ABOUT_PRECURSORS);
340 
341 		DISABLE_PHRASE (what_about_precursors);
342 	}
343 
344 	if (PHRASE_ENABLED (what_about_hierarchy))
345 	{
346 		InfoLeft = TRUE;
347 		Response (what_about_hierarchy, SpathiInfo);
348 	}
349 	if (PHRASE_ENABLED (what_about_history))
350 	{
351 		InfoLeft = TRUE;
352 		Response (what_about_history, SpathiInfo);
353 	}
354 	if (PHRASE_ENABLED (what_about_alliance))
355 	{
356 		InfoLeft = TRUE;
357 		Response (what_about_alliance, SpathiInfo);
358 	}
359 	if (PHRASE_ENABLED (what_about_other))
360 	{
361 		InfoLeft = TRUE;
362 		Response (what_about_other, SpathiInfo);
363 	}
364 	if (PHRASE_ENABLED (what_about_precursors))
365 	{
366 		InfoLeft = TRUE;
367 		Response (what_about_precursors, SpathiInfo);
368 	}
369 	Response (enough_info, SpathiAllies);
370 
371 	if (!InfoLeft)
372 	{
373 		DISABLE_PHRASE (like_some_info);
374 	}
375 }
376 
377 static void
SpathiAllies(RESPONSE_REF R)378 SpathiAllies (RESPONSE_REF R)
379 {
380 	BYTE NumVisits;
381 
382 	if (R == 0)
383 	{
384 		NumVisits = GET_GAME_STATE (SPATHI_HOME_VISITS);
385 		switch (NumVisits++)
386 		{
387 			case 0:
388 				NPCPhrase (HELLO_ALLIES_1);
389 				break;
390 			case 1:
391 				NPCPhrase (HELLO_ALLIES_2);
392 				break;
393 			case 2:
394 				NPCPhrase (HELLO_ALLIES_3);
395 				--NumVisits;
396 				break;
397 		}
398 		SET_GAME_STATE (SPATHI_HOME_VISITS, NumVisits);
399 	}
400 	else if (PLAYER_SAID (R, whats_up))
401 	{
402 		NumVisits = GET_GAME_STATE (SPATHI_INFO);
403 		switch (NumVisits++)
404 		{
405 			case 0:
406 				NPCPhrase (GENERAL_INFO_1);
407 				break;
408 			case 1:
409 				NPCPhrase (GENERAL_INFO_2);
410 				break;
411 			case 2:
412 				NPCPhrase (GENERAL_INFO_3);
413 				SET_GAME_STATE (KNOW_URQUAN_STORY, 1);
414 				SET_GAME_STATE (KNOW_KOHR_AH_STORY, 1);
415 				break;
416 			case 3:
417 				NPCPhrase (GENERAL_INFO_4);
418 				break;
419 			case 4:
420 				NPCPhrase (GENERAL_INFO_5);
421 				--NumVisits;
422 				break;
423 			case 5:
424 				NPCPhrase (GENERAL_INFO_5);
425 				--NumVisits;
426 				break;
427 		}
428 		SET_GAME_STATE (SPATHI_INFO, NumVisits);
429 
430 		DISABLE_PHRASE (whats_up);
431 	}
432 	else if (PLAYER_SAID (R, resources_please))
433 	{
434 		NPCPhrase (SORRY_NO_RESOURCES);
435 
436 		DISABLE_PHRASE (resources_please);
437 	}
438 	else if (PLAYER_SAID (R, something_fishy))
439 	{
440 		NPCPhrase (NOTHING_FISHY);
441 
442 		SET_GAME_STATE (SPATHI_INFO, 5);
443 	}
444 	else if (PLAYER_SAID (R, enough_info))
445 		NPCPhrase (OK_ENOUGH_INFO);
446 
447 	if (GET_GAME_STATE (SPATHI_INFO) == 4)
448 		Response (something_fishy, SpathiAllies);
449 	if (PHRASE_ENABLED (whats_up))
450 		Response (whats_up, SpathiAllies);
451 	if (PHRASE_ENABLED (resources_please))
452 		Response (resources_please, SpathiAllies);
453 	if (PHRASE_ENABLED (like_some_info))
454 		Response (like_some_info, SpathiInfo);
455 	Response (bye_ally, ExitConversation);
456 }
457 
458 static void
SpathiQuest(RESPONSE_REF R)459 SpathiQuest (RESPONSE_REF R)
460 {
461 	if (R == 0)
462 	{
463 		if (!GET_GAME_STATE (LIED_ABOUT_CREATURES))
464 			NPCPhrase (HOW_GO_EFFORTS);
465 		else
466 			NPCPhrase (YOU_LIED_1);
467 	}
468 	else if (PLAYER_SAID (R, little_mistake))
469 	{
470 		NPCPhrase (BIG_MISTAKE);
471 
472 		DISABLE_PHRASE (little_mistake);
473 	}
474 	else if (PLAYER_SAID (R, talk_test))
475 	{
476 		NPCPhrase (TEST_AGAIN);
477 
478 		DISABLE_PHRASE (talk_test);
479 	}
480 	else if (PLAYER_SAID (R, zapped_a_few))
481 	{
482 		NPCPhrase (YOU_FORTUNATE);
483 
484 		DISABLE_PHRASE (zapped_a_few);
485 	}
486 
487 	if (!GET_GAME_STATE (LIED_ABOUT_CREATURES))
488 		Response (killed_them_all_1, ExitConversation);
489 	else
490 	{
491 		if (PHRASE_ENABLED (little_mistake))
492 		{
493 			Response (little_mistake, SpathiQuest);
494 		}
495 		Response (killed_them_all_2, ExitConversation);
496 	}
497 	if (!GET_GAME_STATE (SPATHI_CREATURES_ELIMINATED))
498 	{
499 		if (PHRASE_ENABLED (talk_test))
500 		{
501 			Response (talk_test, SpathiQuest);
502 		}
503 		if (PHRASE_ENABLED (zapped_a_few)
504 				&& GET_GAME_STATE (SPATHI_CREATURES_EXAMINED))
505 		{
506 			Response (zapped_a_few, SpathiQuest);
507 		}
508 		Response (bye_before_party, ExitConversation);
509 	}
510 }
511 
512 static void
LearnQuest(RESPONSE_REF R)513 LearnQuest (RESPONSE_REF R)
514 {
515 	if (R == 0)
516 	{
517 		NPCPhrase (QUEST_AGAIN);
518 
519 		DISABLE_PHRASE (what_test);
520 		if (GET_GAME_STATE (KNOW_SPATHI_EVIL))
521 		{
522 			DISABLE_PHRASE (tell_evil);
523 		}
524 	}
525 	else if (PLAYER_SAID (R, how_prove))
526 		NPCPhrase (BETTER_IDEA);
527 	else if (PLAYER_SAID (R, what_test))
528 	{
529 		NPCPhrase (WIPE_EVIL);
530 
531 		SET_GAME_STATE (KNOW_SPATHI_QUEST, 1);
532 		DISABLE_PHRASE (what_test);
533 	}
534 	else if (PLAYER_SAID (R, tell_evil))
535 	{
536 		NPCPhrase (BEFORE_ACCEPT);
537 
538 		SET_GAME_STATE (KNOW_SPATHI_EVIL, 1);
539 		DISABLE_PHRASE (tell_evil);
540 		DISABLE_PHRASE (prove_strength);
541 	}
542 	else if (PLAYER_SAID (R, prove_strength))
543 	{
544 		NPCPhrase (YOUR_BEHAVIOR);
545 
546 		DISABLE_PHRASE (prove_strength);
547 	}
548 	else if (PLAYER_SAID (R, why_dont_you_do_it))
549 	{
550 		NPCPhrase (WE_WONT_BECAUSE);
551 
552 		DISABLE_PHRASE (why_dont_you_do_it);
553 	}
554 
555 	if (PHRASE_ENABLED (what_test))
556 		Response (what_test, LearnQuest);
557 	else if (GET_GAME_STATE (SPATHI_CREATURES_ELIMINATED))
558 	{
559 		Response (already_got_them, ExitConversation);
560 	}
561 	else if (PHRASE_ENABLED (tell_evil))
562 	{
563 		Response (too_dangerous, ExitConversation);
564 		Response (tell_evil, LearnQuest);
565 	}
566 	else
567 	{
568 		Response (too_dangerous, ExitConversation);
569 		Response (think_more, ExitConversation);
570 		Response (i_accept, ExitConversation);
571 	}
572 	if (PHRASE_ENABLED (prove_strength) && !GET_GAME_STATE (KNOW_SPATHI_QUEST))
573 		Response (prove_strength, LearnQuest);
574 	if (PHRASE_ENABLED (why_dont_you_do_it))
575 		Response (why_dont_you_do_it, LearnQuest);
576 }
577 
578 static void
AllianceOffer(RESPONSE_REF R)579 AllianceOffer (RESPONSE_REF R)
580 {
581 	if (PLAYER_SAID (R, misunderstanding))
582 	{
583 		NPCPhrase (JUST_MISUNDERSTANDING);
584 		XFormColorMap (GetColorMapAddress (
585 				SetAbsColorMapIndex (CommData.AlienColorMap, 1)
586 				), ONE_SECOND / 4);
587 
588 		SET_GAME_STATE (SPATHI_MANNER, 3);
589 		SET_GAME_STATE (SPATHI_VISITS, 0);
590 	}
591 	else if (PLAYER_SAID (R, we_come_in_peace))
592 		NPCPhrase (OF_COURSE);
593 	else if (PLAYER_SAID (R, hand_in_friendship))
594 	{
595 		NPCPhrase (TOO_AFRAID);
596 
597 		DISABLE_PHRASE (hand_in_friendship);
598 	}
599 	else if (PLAYER_SAID (R, stronger))
600 	{
601 		NPCPhrase (YOURE_NOT);
602 
603 		DISABLE_PHRASE (stronger);
604 	}
605 	else if (PLAYER_SAID (R, yes_we_are))
606 	{
607 		NPCPhrase (NO_YOURE_NOT);
608 
609 		DISABLE_PHRASE (yes_we_are);
610 	}
611 	else if (PLAYER_SAID (R, share_info))
612 	{
613 		NPCPhrase (NO_INFO);
614 
615 		DISABLE_PHRASE (share_info);
616 	}
617 	else if (PLAYER_SAID (R, give_us_resources))
618 	{
619 		NPCPhrase (NO_RESOURCES);
620 
621 		DISABLE_PHRASE (give_us_resources);
622 	}
623 
624 	if (PHRASE_ENABLED (hand_in_friendship))
625 		Response (hand_in_friendship, AllianceOffer);
626 	else if (PHRASE_ENABLED (stronger))
627 		Response (stronger, AllianceOffer);
628 	else if (PHRASE_ENABLED (yes_we_are))
629 		Response (yes_we_are, AllianceOffer);
630 	else
631 	{
632 		Response (how_prove, LearnQuest);
633 	}
634 	if (PHRASE_ENABLED (share_info))
635 		Response (share_info, AllianceOffer);
636 	if (PHRASE_ENABLED (give_us_resources))
637 		Response (give_us_resources, AllianceOffer);
638 }
639 
640 static void
SpathiAngry(RESPONSE_REF R)641 SpathiAngry (RESPONSE_REF R)
642 {
643 	if (R == 0)
644 	{
645 		NPCPhrase (MEAN_GUYS_RETURN);
646 
647 		Response (we_apologize, SpathiAngry);
648 	}
649 	else /* if (R == we_apologize) */
650 	{
651 		NPCPhrase (DONT_BELIEVE);
652 
653 		Response (misunderstanding, AllianceOffer);
654 	}
655 
656 	Response (we_attack_again, ExitConversation);
657 	Response (bye_angry_spathi, ExitConversation);
658 }
659 
660 static void
SpathiParty(RESPONSE_REF R)661 SpathiParty (RESPONSE_REF R)
662 {
663 	if (R == 0)
664 	{
665 		BYTE NumVisits;
666 
667 		NumVisits = GET_GAME_STATE (SPATHI_HOME_VISITS);
668 		switch (NumVisits++)
669 		{
670 			case 0:
671 				NPCPhrase (MUST_PARTY_1);
672 				break;
673 			case 1:
674 				NPCPhrase (MUST_PARTY_2);
675 				break;
676 			case 2:
677 				NPCPhrase (MUST_PARTY_3);
678 				--NumVisits;
679 				break;
680 		}
681 		SET_GAME_STATE (SPATHI_HOME_VISITS, NumVisits);
682 	}
683 	else if (PLAYER_SAID (R, deals_a_deal))
684 	{
685 		NPCPhrase (WAIT_A_WHILE);
686 
687 		DISABLE_PHRASE (deals_a_deal);
688 	}
689 	else if (PLAYER_SAID (R, how_long))
690 	{
691 		NPCPhrase (TEN_YEARS);
692 
693 		DISABLE_PHRASE (how_long);
694 	}
695 	else if (PLAYER_SAID (R, reneging))
696 	{
697 		NPCPhrase (ADULT_VIEW);
698 
699 		DISABLE_PHRASE (reneging);
700 	}
701 	else if (PLAYER_SAID (R, return_beasts))
702 	{
703 		NPCPhrase (WHAT_RELATIONSHIP);
704 
705 		DISABLE_PHRASE (return_beasts);
706 	}
707 	else if (PLAYER_SAID (R, minds_and_might))
708 	{
709 		NPCPhrase (HUH);
710 
711 		DISABLE_PHRASE (minds_and_might);
712 	}
713 	else if (PLAYER_SAID (R, fellowship))
714 	{
715 		NPCPhrase (WHAT);
716 
717 		DISABLE_PHRASE (fellowship);
718 	}
719 
720 	if (PHRASE_ENABLED (deals_a_deal))
721 		Response (deals_a_deal, SpathiParty);
722 	else if (PHRASE_ENABLED (how_long))
723 		Response (how_long, SpathiParty);
724 	else if (PHRASE_ENABLED (reneging))
725 		Response (reneging, SpathiParty);
726 	else if (PHRASE_ENABLED (return_beasts))
727 		Response (return_beasts, SpathiParty);
728 	else
729 	{
730 		if (PHRASE_ENABLED (minds_and_might))
731 			Response (minds_and_might, SpathiParty);
732 		if (PHRASE_ENABLED (fellowship))
733 			Response (fellowship, SpathiParty);
734 		Response (do_as_we_say, ExitConversation);
735 
736 		return;
737 	}
738 	switch (GET_GAME_STATE (SPATHI_HOME_VISITS) - 1)
739 	{
740 		case 0:
741 			Response (bye_from_party_1, ExitConversation);
742 			break;
743 		case 1:
744 			Response (bye_from_party_2, ExitConversation);
745 			break;
746 		default:
747 			Response (bye_from_party_3, ExitConversation);
748 			break;
749 	}
750 }
751 
752 static void
SpathiCouncil(RESPONSE_REF R)753 SpathiCouncil (RESPONSE_REF R)
754 {
755 	if (R == 0)
756 		NPCPhrase (HELLO_AGAIN);
757 	else if (PLAYER_SAID (R, good_password))
758 	{
759 		NPCPhrase (YES_GOOD_PASSWORD);
760 		XFormColorMap (GetColorMapAddress (
761 				SetAbsColorMapIndex (CommData.AlienColorMap, 1)
762 				), ONE_SECOND / 4);
763 
764 		SET_GAME_STATE (KNOW_SPATHI_PASSWORD, 1);
765 		SET_GAME_STATE (SPATHI_HOME_VISITS, 0);
766 	}
767 	else if (PLAYER_SAID (R, we_come_in_peace))
768 	{
769 		NPCPhrase (KILLED_SPATHI);
770 
771 		DISABLE_PHRASE (we_come_in_peace);
772 	}
773 	else if (PLAYER_SAID (R, spathi_on_pluto))
774 	{
775 		NPCPhrase (WHERE_SPATHI);
776 
777 		DISABLE_PHRASE (spathi_on_pluto);
778 	}
779 	else if (PLAYER_SAID (R, hostage))
780 	{
781 		NPCPhrase (GUN_TO_HEAD);
782 
783 		SET_GAME_STATE (FOUND_PLUTO_SPATHI, 3);
784 		DISABLE_PHRASE (hostage);
785 	}
786 	else if (PLAYER_SAID (R, killed_fwiffo))
787 	{
788 		NPCPhrase (POOR_FWIFFO);
789 
790 		SET_GAME_STATE (FOUND_PLUTO_SPATHI, 3);
791 		DISABLE_PHRASE (killed_fwiffo);
792 	}
793 	else if (PLAYER_SAID (R, fwiffo_fine))
794 	{
795 		NPCPhrase (NOT_LIKELY);
796 
797 		R = killed_fwiffo;
798 		DISABLE_PHRASE (fwiffo_fine);
799 	}
800 	else if (PLAYER_SAID (R, surrender))
801 	{
802 		NPCPhrase (NO_SURRENDER);
803 
804 		DISABLE_PHRASE (surrender);
805 	}
806 
807 	if (GET_GAME_STATE (SPATHI_MANNER) == 0)
808 	{
809 		Response (we_come_in_peace, AllianceOffer);
810 	}
811 	else if (PHRASE_ENABLED (we_come_in_peace))
812 	{
813 		Response (we_come_in_peace, SpathiCouncil);
814 	}
815 	else
816 	{
817 		Response (misunderstanding, AllianceOffer);
818 	}
819 	if (GET_GAME_STATE (FOUND_PLUTO_SPATHI)
820 			&& GET_GAME_STATE (FOUND_PLUTO_SPATHI) < 3)
821 	{
822 		if (PHRASE_ENABLED (spathi_on_pluto))
823 			Response (spathi_on_pluto, SpathiCouncil);
824 		else if (HaveEscortShip (SPATHI_SHIP))
825 		{
826 			if (PHRASE_ENABLED (hostage))
827 				Response (hostage, SpathiCouncil);
828 		}
829 		else if (PHRASE_ENABLED (killed_fwiffo))
830 		{
831 			Response (killed_fwiffo, SpathiCouncil);
832 			if (PHRASE_ENABLED (fwiffo_fine))
833 				Response (fwiffo_fine, SpathiCouncil);
834 		}
835 	}
836 	if (PHRASE_ENABLED (surrender))
837 		Response (surrender, SpathiCouncil);
838 	else
839 	{
840 		Response (surrender_or_die, ExitConversation);
841 	}
842 	Response (bye_no_ally_offer, ExitConversation);
843 }
844 
845 static void
SpathiPassword(RESPONSE_REF R)846 SpathiPassword (RESPONSE_REF R)
847 {
848 	if (R == 0)
849 	{
850 		BYTE NumVisits;
851 
852 		NumVisits = GET_GAME_STATE (SPATHI_HOME_VISITS);
853 		switch (NumVisits++)
854 		{
855 			default:
856 				NPCPhrase (WHAT_IS_PASSWORD);
857 				NumVisits = 1;
858 				break;
859 			case 1:
860 				NPCPhrase (WHAT_IS_PASSWORD_AGAIN);
861 				--NumVisits;
862 				break;
863 		}
864 		SET_GAME_STATE (SPATHI_HOME_VISITS, NumVisits);
865 	}
866 	else if (PLAYER_SAID (R, what_do_i_get))
867 	{
868 		NPCPhrase (YOU_GET_TO_LIVE);
869 
870 		DISABLE_PHRASE (what_do_i_get);
871 	}
872 
873 	if (GET_GAME_STATE (FOUND_PLUTO_SPATHI)
874 			|| GET_GAME_STATE (KNOW_SPATHI_PASSWORD))
875 	{
876 		Response (good_password, SpathiCouncil);
877 		if (PHRASE_ENABLED (what_do_i_get))
878 		{
879 			Response (what_do_i_get, SpathiPassword);
880 		}
881 	}
882 	else
883 	{
884 		construct_response (shared_phrase_buf,
885 				we_are_vindicator0,
886 				GLOBAL_SIS (CommanderName),
887 				we_are_vindicator1,
888 				GLOBAL_SIS (ShipName),
889 				we_are_vindicator2,
890 				(UNICODE*)NULL);
891 		DoResponsePhrase (we_are_vindicator0, ExitConversation, shared_phrase_buf);
892 		Response (gort_merenga, ExitConversation);
893 		Response (guph_florp, ExitConversation);
894 		Response (wagngl_fthagn, ExitConversation);
895 		Response (pleeese, ExitConversation);
896 		Response (screw_password, ExitConversation);
897 	}
898 }
899 
900 static void
Intro(void)901 Intro (void)
902 {
903 	BYTE Manner;
904 
905 	Manner = GET_GAME_STATE (SPATHI_MANNER);
906 	if (Manner == 2)
907 	{
908 		NPCPhrase (HATE_YOU_FOREVER);
909 		setSegue (Segue_hostile);
910 	}
911 	else if (Manner == 1
912 			&& GET_GAME_STATE (KNOW_SPATHI_PASSWORD)
913 			&& (GET_GAME_STATE (FOUND_PLUTO_SPATHI)
914 			|| GET_GAME_STATE (SPATHI_HOME_VISITS) != 7))
915 	{
916 		SpathiAngry ((RESPONSE_REF)0);
917 	}
918 	else if (CheckAlliance (SPATHI_SHIP) == GOOD_GUY)
919 	{
920 		CommData.AlienColorMap =
921 				SetAbsColorMapIndex (CommData.AlienColorMap, 1);
922 		SpathiAllies ((RESPONSE_REF)0);
923 	}
924 	else if (GET_GAME_STATE (SPATHI_PARTY))
925 	{
926 		CommData.AlienColorMap =
927 				SetAbsColorMapIndex (CommData.AlienColorMap, 1);
928 		SpathiParty ((RESPONSE_REF)0);
929 	}
930 	else if (GET_GAME_STATE (SPATHI_QUEST))
931 	{
932 		if (GET_GAME_STATE (LIED_ABOUT_CREATURES) < 2)
933 		{
934 			CommData.AlienColorMap =
935 					SetAbsColorMapIndex (CommData.AlienColorMap, 1);
936 			SpathiQuest ((RESPONSE_REF)0);
937 		}
938 		else
939 		{
940 			NPCPhrase (YOU_LIED_2);
941 
942 			SET_GAME_STATE (SPATHI_MANNER, 2);
943 			setSegue (Segue_hostile);
944 		}
945 	}
946 	else if (GET_GAME_STATE (KNOW_SPATHI_QUEST))
947 	{
948 		CommData.AlienColorMap =
949 				SetAbsColorMapIndex (CommData.AlienColorMap, 1);
950 		LearnQuest ((RESPONSE_REF)0);
951 	}
952 	else if (GET_GAME_STATE (KNOW_SPATHI_PASSWORD)
953 			&& (GET_GAME_STATE (FOUND_PLUTO_SPATHI)
954 			|| GET_GAME_STATE (SPATHI_HOME_VISITS) != 7))
955 	{
956 		CommData.AlienColorMap =
957 				SetAbsColorMapIndex (CommData.AlienColorMap, 1);
958 		SpathiCouncil ((RESPONSE_REF)0);
959 	}
960 	else
961 	{
962 		SpathiPassword ((RESPONSE_REF)0);
963 	}
964 }
965 
966 static COUNT
uninit_spahome(void)967 uninit_spahome (void)
968 {
969 	return (0);
970 }
971 
972 static void
post_spahome_enc(void)973 post_spahome_enc (void)
974 {
975 	BYTE Manner;
976 
977 	if (getSegue () == Segue_hostile
978 			&& (Manner = GET_GAME_STATE (SPATHI_MANNER)) != 2)
979 	{
980 		SET_GAME_STATE (SPATHI_MANNER, 1);
981 		if (Manner != 1)
982 		{
983 			SET_GAME_STATE (SPATHI_VISITS, 0);
984 			SET_GAME_STATE (SPATHI_HOME_VISITS, 0);
985 		}
986 	}
987 }
988 
989 LOCDATA*
init_spahome_comm()990 init_spahome_comm ()
991 {
992 	LOCDATA *retval;
993 
994 	spahome_desc.init_encounter_func = Intro;
995 	spahome_desc.post_encounter_func = post_spahome_enc;
996 	spahome_desc.uninit_encounter_func = uninit_spahome;
997 
998 	spahome_desc.AlienTextBaseline.x = TEXT_X_OFFS + (SIS_TEXT_WIDTH >> 1);
999 	spahome_desc.AlienTextBaseline.y = 0;
1000 	spahome_desc.AlienTextWidth = SIS_TEXT_WIDTH - 16;
1001 
1002 	// use alternate "Safe Ones" track if available
1003 	spahome_desc.AlienAltSongRes = SPAHOME_MUSIC;
1004 	spahome_desc.AlienSongFlags |= LDASF_USE_ALTERNATE;
1005 
1006 	if (GET_GAME_STATE (SPATHI_MANNER) == 3)
1007 	{
1008 		setSegue (Segue_peace);
1009 	}
1010 	else
1011 	{
1012 		setSegue (Segue_hostile);
1013 	}
1014 
1015 	retval = &spahome_desc;
1016 
1017 	return (retval);
1018 }
1019