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