summaryrefslogtreecommitdiff
path: root/src/uqm/comm/spahome/spahome.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/uqm/comm/spahome/spahome.c')
-rw-r--r--src/uqm/comm/spahome/spahome.c1018
1 files changed, 1018 insertions, 0 deletions
diff --git a/src/uqm/comm/spahome/spahome.c b/src/uqm/comm/spahome/spahome.c
new file mode 100644
index 0000000..190e3bb
--- /dev/null
+++ b/src/uqm/comm/spahome/spahome.c
@@ -0,0 +1,1018 @@
+//Copyright Paul Reiche, Fred Ford. 1992-2002
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "../commall.h"
+#include "../spathi/resinst.h"
+#include "strings.h"
+
+#include "uqm/build.h"
+#include "uqm/gameev.h"
+
+
+static LOCDATA spahome_desc =
+{
+ NULL, /* init_encounter_func */
+ NULL, /* post_encounter_func */
+ NULL, /* uninit_encounter_func */
+ SPATHI_HOME_PMAP_ANIM, /* AlienFrame */
+ SPATHI_FONT, /* AlienFont */
+ WHITE_COLOR_INIT, /* AlienTextFColor */
+ BLACK_COLOR_INIT, /* AlienTextBColor */
+ {0, 0}, /* AlienTextBaseline */
+ 0, /* SIS_TEXT_WIDTH - 16, */ /* AlienTextWidth */
+ ALIGN_CENTER, /* AlienTextAlign */
+ VALIGN_TOP, /* AlienTextValign */
+ SPATHI_HOME_COLOR_MAP, /* AlienColorMap */
+ SPATHI_MUSIC, /* AlienSong */
+ NULL_RESOURCE, /* AlienAltSong */
+ 0, /* AlienSongFlags */
+ SPATHI_HOME_CONVERSATION_PHRASES, /* PlayerPhrases */
+ 14, /* NumAnimations */
+ { /* AlienAmbientArray (ambient animations) */
+ {
+ 1, /* StartIndex */
+ 3, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND / 20, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 4, /* StartIndex */
+ 5, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND / 20, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 9, /* StartIndex */
+ 4, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND / 20, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ (1 << 10) | (1 << 11), /* BlockMask */
+ },
+ {
+ 13, /* StartIndex */
+ 6, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND / 20, 0, /* FrameRate */
+ ONE_SECOND / 20, 0, /* RestartRate */
+ (1 << 4) | (1 << 5) /* BlockMask */
+ },
+ {
+ 19, /* StartIndex */
+ 3, /* NumFrames */
+ YOYO_ANIM, /* AnimFlags */
+ ONE_SECOND / 20, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ (1 << 3) | (1 << 5), /* BlockMask */
+ },
+ {
+ 22, /* StartIndex */
+ 4, /* NumFrames */
+ YOYO_ANIM, /* AnimFlags */
+ ONE_SECOND / 10, ONE_SECOND / 30, /* FrameRate */
+ ONE_SECOND / 10, ONE_SECOND / 30, /* RestartRate */
+ (1 << 3) | (1 << 4)
+ | (1 << 10), /* BlockMask */
+ },
+ {
+ 26, /* StartIndex */
+ 3, /* NumFrames */
+ YOYO_ANIM, /* AnimFlags */
+ ONE_SECOND / 10, ONE_SECOND / 30, /* FrameRate */
+ ONE_SECOND * 10, ONE_SECOND * 3, /* RestartRate */
+ (1 << 10), /* BlockMask */
+ },
+ {
+ 29, /* StartIndex */
+ 3, /* NumFrames */
+ YOYO_ANIM, /* AnimFlags */
+ ONE_SECOND / 10, ONE_SECOND / 30, /* FrameRate */
+ ONE_SECOND * 10, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 32, /* StartIndex */
+ 7, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND / 20, 0, /* FrameRate */
+ ONE_SECOND / 20, 0, /* RestartRate */
+ (1 << 9) | (1 << 10), /* BlockMask */
+ },
+ {
+ 39, /* StartIndex */
+ 3, /* NumFrames */
+ YOYO_ANIM, /* AnimFlags */
+ ONE_SECOND / 20, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ (1 << 8) | (1 << 10), /* BlockMask */
+ },
+ {
+ 42, /* StartIndex */
+ 4, /* NumFrames */
+ YOYO_ANIM, /* AnimFlags */
+ ONE_SECOND / 10, ONE_SECOND / 30, /* FrameRate */
+ ONE_SECOND / 30, 0, /* RestartRate */
+ (1 << 8) | (1 << 9)
+ | (1 << 6) | (1 << 2)
+ | (1 << 11) | (1 << 5), /* BlockMask */
+ },
+ {
+ 46, /* StartIndex */
+ 4, /* NumFrames */
+ YOYO_ANIM, /* AnimFlags */
+ ONE_SECOND / 10, ONE_SECOND / 30, /* FrameRate */
+ ONE_SECOND / 10, ONE_SECOND / 30, /* RestartRate */
+ (1 << 2) | (1 << 10), /* BlockMask */
+ },
+ {
+ 50, /* StartIndex */
+ 6, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND / 20, 0, /* FrameRate */
+ ONE_SECOND / 20, 0, /* RestartRate */
+ (1 << 13), /* BlockMask */
+ },
+ {
+ 56, /* StartIndex */
+ 3, /* NumFrames */
+ YOYO_ANIM, /* AnimFlags */
+ ONE_SECOND / 20, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ (1 << 12), /* BlockMask */
+ },
+ },
+ { /* AlienTransitionDesc - empty */
+ 0, /* StartIndex */
+ 0, /* NumFrames */
+ 0, /* AnimFlags */
+ 0, 0, /* FrameRate */
+ 0, 0, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ { /* AlienTalkDesc - empty */
+ 0, /* StartIndex */
+ 0, /* NumFrames */
+ 0, /* AnimFlags */
+ 0, 0, /* FrameRate */
+ 0, 0, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ NULL, /* AlienNumberSpeech - none */
+ /* Filler for loaded resources */
+ NULL, NULL, NULL,
+ NULL,
+ NULL,
+};
+
+static void
+ExitConversation (RESPONSE_REF R)
+{
+ setSegue (Segue_peace);
+ if (PLAYER_SAID (R, we_attack_again))
+ {
+ NPCPhrase (WE_FIGHT_AGAIN);
+
+ setSegue (Segue_hostile);
+ }
+ else if (PLAYER_SAID (R, surrender_or_die))
+ {
+ NPCPhrase (DEFEND_OURSELVES);
+
+ setSegue (Segue_hostile);
+ }
+ else if (PLAYER_SAID (R, we_are_vindicator0))
+ {
+ NPCPhrase (NO_PASSWORD);
+
+ setSegue (Segue_hostile);
+ }
+ else if (PLAYER_SAID (R, gort_merenga)
+ || PLAYER_SAID (R, guph_florp)
+ || PLAYER_SAID (R, wagngl_fthagn)
+ || PLAYER_SAID (R, pleeese))
+ {
+ NPCPhrase (WRONG_PASSWORD);
+
+ setSegue (Segue_hostile);
+ }
+ else if (PLAYER_SAID (R, screw_password))
+ {
+ NPCPhrase (NO_PASSWORD);
+
+ setSegue (Segue_hostile);
+ }
+ else if (PLAYER_SAID (R, bye_no_ally_offer))
+ NPCPhrase (GOODBYE_NO_ALLY_OFFER);
+ else if (PLAYER_SAID (R, bye_angry_spathi))
+ NPCPhrase (GOODBYE_ANGRY_SPATHI);
+ else if (PLAYER_SAID (R, bye_ally))
+ NPCPhrase (GOODBYE_ALLY);
+ else if (PLAYER_SAID (R, already_got_them))
+ {
+ NPCPhrase (EARLY_BIRD_CHECK);
+
+ SET_GAME_STATE (SPATHI_HOME_VISITS, 0);
+ SET_GAME_STATE (SPATHI_VISITS, 0);
+ SET_GAME_STATE (SPATHI_PARTY, 1);
+ SET_GAME_STATE (SPATHI_MANNER, 3);
+ }
+ else if (PLAYER_SAID (R, too_dangerous))
+ NPCPhrase (WE_AGREE);
+ else if (PLAYER_SAID (R, think_more))
+ NPCPhrase (COWARD);
+ else if (PLAYER_SAID (R, i_accept))
+ {
+ NPCPhrase (AWAIT_RETURN);
+
+ SET_GAME_STATE (SPATHI_QUEST, 1);
+ SET_GAME_STATE (SPATHI_MANNER, 3);
+ SET_GAME_STATE (SPATHI_VISITS, 0);
+ }
+ else if (PLAYER_SAID (R, do_as_we_say))
+ {
+ NPCPhrase (DEPART_FOR_EARTH);
+
+ SetRaceAllied (SPATHI_SHIP, TRUE);
+ AddEvent (RELATIVE_EVENT, 6, 0, 0, SPATHI_SHIELD_EVENT);
+ SET_GAME_STATE (SPATHI_HOME_VISITS, 0);
+ SET_GAME_STATE (SPATHI_VISITS, 0);
+ }
+ else if (PLAYER_SAID (R, killed_them_all_1))
+ {
+ NPCPhrase (WILL_CHECK_1);
+
+ if (!GET_GAME_STATE (SPATHI_CREATURES_ELIMINATED))
+ {
+ SET_GAME_STATE (LIED_ABOUT_CREATURES, 1);
+ }
+ else
+ {
+ SET_GAME_STATE (SPATHI_HOME_VISITS, 0);
+ SET_GAME_STATE (SPATHI_VISITS, 0);
+ SET_GAME_STATE (SPATHI_PARTY, 1);
+ SET_GAME_STATE (SPATHI_MANNER, 3);
+ }
+ }
+ else if (PLAYER_SAID (R, killed_them_all_2))
+ {
+ NPCPhrase (WILL_CHECK_2);
+
+ if (!GET_GAME_STATE (SPATHI_CREATURES_ELIMINATED))
+ {
+ SET_GAME_STATE (LIED_ABOUT_CREATURES, 2);
+ }
+ else
+ {
+ SET_GAME_STATE (SPATHI_HOME_VISITS, 0);
+ SET_GAME_STATE (SPATHI_VISITS, 0);
+ SET_GAME_STATE (SPATHI_PARTY, 1);
+ SET_GAME_STATE (SPATHI_MANNER, 3);
+ }
+ }
+ else if (PLAYER_SAID (R, bye_before_party))
+ {
+ NPCPhrase (GOODBYE_BEFORE_PARTY);
+ }
+ else if (PLAYER_SAID (R, bye_from_party_1)
+ || PLAYER_SAID (R, bye_from_party_2)
+ || PLAYER_SAID (R, bye_from_party_3))
+ {
+ NPCPhrase (GOODBYE_FROM_PARTY);
+ }
+}
+
+static void SpathiAllies (RESPONSE_REF R);
+
+static void
+SpathiInfo (RESPONSE_REF R)
+{
+ BYTE InfoLeft;
+
+ InfoLeft = FALSE;
+ if (PLAYER_SAID (R, like_some_info))
+ NPCPhrase (WHAT_ABOUT);
+ else if (PLAYER_SAID (R, what_about_hierarchy))
+ {
+ NPCPhrase (ABOUT_HIERARCHY);
+
+ DISABLE_PHRASE (what_about_hierarchy);
+ }
+ else if (PLAYER_SAID (R, what_about_history))
+ {
+ NPCPhrase (ABOUT_HISTORY);
+
+ DISABLE_PHRASE (what_about_history);
+ }
+ else if (PLAYER_SAID (R, what_about_alliance))
+ {
+ NPCPhrase (ABOUT_ALLIANCE);
+
+ DISABLE_PHRASE (what_about_alliance);
+ }
+ else if (PLAYER_SAID (R, what_about_other))
+ {
+ NPCPhrase (ABOUT_OTHER);
+
+ DISABLE_PHRASE (what_about_other);
+ }
+ else if (PLAYER_SAID (R, what_about_precursors))
+ {
+ NPCPhrase (ABOUT_PRECURSORS);
+
+ DISABLE_PHRASE (what_about_precursors);
+ }
+
+ if (PHRASE_ENABLED (what_about_hierarchy))
+ {
+ InfoLeft = TRUE;
+ Response (what_about_hierarchy, SpathiInfo);
+ }
+ if (PHRASE_ENABLED (what_about_history))
+ {
+ InfoLeft = TRUE;
+ Response (what_about_history, SpathiInfo);
+ }
+ if (PHRASE_ENABLED (what_about_alliance))
+ {
+ InfoLeft = TRUE;
+ Response (what_about_alliance, SpathiInfo);
+ }
+ if (PHRASE_ENABLED (what_about_other))
+ {
+ InfoLeft = TRUE;
+ Response (what_about_other, SpathiInfo);
+ }
+ if (PHRASE_ENABLED (what_about_precursors))
+ {
+ InfoLeft = TRUE;
+ Response (what_about_precursors, SpathiInfo);
+ }
+ Response (enough_info, SpathiAllies);
+
+ if (!InfoLeft)
+ {
+ DISABLE_PHRASE (like_some_info);
+ }
+}
+
+static void
+SpathiAllies (RESPONSE_REF R)
+{
+ BYTE NumVisits;
+
+ if (R == 0)
+ {
+ NumVisits = GET_GAME_STATE (SPATHI_HOME_VISITS);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (HELLO_ALLIES_1);
+ break;
+ case 1:
+ NPCPhrase (HELLO_ALLIES_2);
+ break;
+ case 2:
+ NPCPhrase (HELLO_ALLIES_3);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (SPATHI_HOME_VISITS, NumVisits);
+ }
+ else if (PLAYER_SAID (R, whats_up))
+ {
+ NumVisits = GET_GAME_STATE (SPATHI_INFO);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (GENERAL_INFO_1);
+ break;
+ case 1:
+ NPCPhrase (GENERAL_INFO_2);
+ break;
+ case 2:
+ NPCPhrase (GENERAL_INFO_3);
+ SET_GAME_STATE (KNOW_URQUAN_STORY, 1);
+ SET_GAME_STATE (KNOW_KOHR_AH_STORY, 1);
+ break;
+ case 3:
+ NPCPhrase (GENERAL_INFO_4);
+ break;
+ case 4:
+ NPCPhrase (GENERAL_INFO_5);
+ --NumVisits;
+ break;
+ case 5:
+ NPCPhrase (GENERAL_INFO_5);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (SPATHI_INFO, NumVisits);
+
+ DISABLE_PHRASE (whats_up);
+ }
+ else if (PLAYER_SAID (R, resources_please))
+ {
+ NPCPhrase (SORRY_NO_RESOURCES);
+
+ DISABLE_PHRASE (resources_please);
+ }
+ else if (PLAYER_SAID (R, something_fishy))
+ {
+ NPCPhrase (NOTHING_FISHY);
+
+ SET_GAME_STATE (SPATHI_INFO, 5);
+ }
+ else if (PLAYER_SAID (R, enough_info))
+ NPCPhrase (OK_ENOUGH_INFO);
+
+ if (GET_GAME_STATE (SPATHI_INFO) == 4)
+ Response (something_fishy, SpathiAllies);
+ if (PHRASE_ENABLED (whats_up))
+ Response (whats_up, SpathiAllies);
+ if (PHRASE_ENABLED (resources_please))
+ Response (resources_please, SpathiAllies);
+ if (PHRASE_ENABLED (like_some_info))
+ Response (like_some_info, SpathiInfo);
+ Response (bye_ally, ExitConversation);
+}
+
+static void
+SpathiQuest (RESPONSE_REF R)
+{
+ if (R == 0)
+ {
+ if (!GET_GAME_STATE (LIED_ABOUT_CREATURES))
+ NPCPhrase (HOW_GO_EFFORTS);
+ else
+ NPCPhrase (YOU_LIED_1);
+ }
+ else if (PLAYER_SAID (R, little_mistake))
+ {
+ NPCPhrase (BIG_MISTAKE);
+
+ DISABLE_PHRASE (little_mistake);
+ }
+ else if (PLAYER_SAID (R, talk_test))
+ {
+ NPCPhrase (TEST_AGAIN);
+
+ DISABLE_PHRASE (talk_test);
+ }
+ else if (PLAYER_SAID (R, zapped_a_few))
+ {
+ NPCPhrase (YOU_FORTUNATE);
+
+ DISABLE_PHRASE (zapped_a_few);
+ }
+
+ if (!GET_GAME_STATE (LIED_ABOUT_CREATURES))
+ Response (killed_them_all_1, ExitConversation);
+ else
+ {
+ if (PHRASE_ENABLED (little_mistake))
+ {
+ Response (little_mistake, SpathiQuest);
+ }
+ Response (killed_them_all_2, ExitConversation);
+ }
+ if (!GET_GAME_STATE (SPATHI_CREATURES_ELIMINATED))
+ {
+ if (PHRASE_ENABLED (talk_test))
+ {
+ Response (talk_test, SpathiQuest);
+ }
+ if (PHRASE_ENABLED (zapped_a_few)
+ && GET_GAME_STATE (SPATHI_CREATURES_EXAMINED))
+ {
+ Response (zapped_a_few, SpathiQuest);
+ }
+ Response (bye_before_party, ExitConversation);
+ }
+}
+
+static void
+LearnQuest (RESPONSE_REF R)
+{
+ if (R == 0)
+ {
+ NPCPhrase (QUEST_AGAIN);
+
+ DISABLE_PHRASE (what_test);
+ if (GET_GAME_STATE (KNOW_SPATHI_EVIL))
+ {
+ DISABLE_PHRASE (tell_evil);
+ }
+ }
+ else if (PLAYER_SAID (R, how_prove))
+ NPCPhrase (BETTER_IDEA);
+ else if (PLAYER_SAID (R, what_test))
+ {
+ NPCPhrase (WIPE_EVIL);
+
+ SET_GAME_STATE (KNOW_SPATHI_QUEST, 1);
+ DISABLE_PHRASE (what_test);
+ }
+ else if (PLAYER_SAID (R, tell_evil))
+ {
+ NPCPhrase (BEFORE_ACCEPT);
+
+ SET_GAME_STATE (KNOW_SPATHI_EVIL, 1);
+ DISABLE_PHRASE (tell_evil);
+ DISABLE_PHRASE (prove_strength);
+ }
+ else if (PLAYER_SAID (R, prove_strength))
+ {
+ NPCPhrase (YOUR_BEHAVIOR);
+
+ DISABLE_PHRASE (prove_strength);
+ }
+ else if (PLAYER_SAID (R, why_dont_you_do_it))
+ {
+ NPCPhrase (WE_WONT_BECAUSE);
+
+ DISABLE_PHRASE (why_dont_you_do_it);
+ }
+
+ if (PHRASE_ENABLED (what_test))
+ Response (what_test, LearnQuest);
+ else if (GET_GAME_STATE (SPATHI_CREATURES_ELIMINATED))
+ {
+ Response (already_got_them, ExitConversation);
+ }
+ else if (PHRASE_ENABLED (tell_evil))
+ {
+ Response (too_dangerous, ExitConversation);
+ Response (tell_evil, LearnQuest);
+ }
+ else
+ {
+ Response (too_dangerous, ExitConversation);
+ Response (think_more, ExitConversation);
+ Response (i_accept, ExitConversation);
+ }
+ if (PHRASE_ENABLED (prove_strength) && !GET_GAME_STATE (KNOW_SPATHI_QUEST))
+ Response (prove_strength, LearnQuest);
+ if (PHRASE_ENABLED (why_dont_you_do_it))
+ Response (why_dont_you_do_it, LearnQuest);
+}
+
+static void
+AllianceOffer (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, misunderstanding))
+ {
+ NPCPhrase (JUST_MISUNDERSTANDING);
+ XFormColorMap (GetColorMapAddress (
+ SetAbsColorMapIndex (CommData.AlienColorMap, 1)
+ ), ONE_SECOND / 4);
+
+ SET_GAME_STATE (SPATHI_MANNER, 3);
+ SET_GAME_STATE (SPATHI_VISITS, 0);
+ }
+ else if (PLAYER_SAID (R, we_come_in_peace))
+ NPCPhrase (OF_COURSE);
+ else if (PLAYER_SAID (R, hand_in_friendship))
+ {
+ NPCPhrase (TOO_AFRAID);
+
+ DISABLE_PHRASE (hand_in_friendship);
+ }
+ else if (PLAYER_SAID (R, stronger))
+ {
+ NPCPhrase (YOURE_NOT);
+
+ DISABLE_PHRASE (stronger);
+ }
+ else if (PLAYER_SAID (R, yes_we_are))
+ {
+ NPCPhrase (NO_YOURE_NOT);
+
+ DISABLE_PHRASE (yes_we_are);
+ }
+ else if (PLAYER_SAID (R, share_info))
+ {
+ NPCPhrase (NO_INFO);
+
+ DISABLE_PHRASE (share_info);
+ }
+ else if (PLAYER_SAID (R, give_us_resources))
+ {
+ NPCPhrase (NO_RESOURCES);
+
+ DISABLE_PHRASE (give_us_resources);
+ }
+
+ if (PHRASE_ENABLED (hand_in_friendship))
+ Response (hand_in_friendship, AllianceOffer);
+ else if (PHRASE_ENABLED (stronger))
+ Response (stronger, AllianceOffer);
+ else if (PHRASE_ENABLED (yes_we_are))
+ Response (yes_we_are, AllianceOffer);
+ else
+ {
+ Response (how_prove, LearnQuest);
+ }
+ if (PHRASE_ENABLED (share_info))
+ Response (share_info, AllianceOffer);
+ if (PHRASE_ENABLED (give_us_resources))
+ Response (give_us_resources, AllianceOffer);
+}
+
+static void
+SpathiAngry (RESPONSE_REF R)
+{
+ if (R == 0)
+ {
+ NPCPhrase (MEAN_GUYS_RETURN);
+
+ Response (we_apologize, SpathiAngry);
+ }
+ else /* if (R == we_apologize) */
+ {
+ NPCPhrase (DONT_BELIEVE);
+
+ Response (misunderstanding, AllianceOffer);
+ }
+
+ Response (we_attack_again, ExitConversation);
+ Response (bye_angry_spathi, ExitConversation);
+}
+
+static void
+SpathiParty (RESPONSE_REF R)
+{
+ if (R == 0)
+ {
+ BYTE NumVisits;
+
+ NumVisits = GET_GAME_STATE (SPATHI_HOME_VISITS);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (MUST_PARTY_1);
+ break;
+ case 1:
+ NPCPhrase (MUST_PARTY_2);
+ break;
+ case 2:
+ NPCPhrase (MUST_PARTY_3);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (SPATHI_HOME_VISITS, NumVisits);
+ }
+ else if (PLAYER_SAID (R, deals_a_deal))
+ {
+ NPCPhrase (WAIT_A_WHILE);
+
+ DISABLE_PHRASE (deals_a_deal);
+ }
+ else if (PLAYER_SAID (R, how_long))
+ {
+ NPCPhrase (TEN_YEARS);
+
+ DISABLE_PHRASE (how_long);
+ }
+ else if (PLAYER_SAID (R, reneging))
+ {
+ NPCPhrase (ADULT_VIEW);
+
+ DISABLE_PHRASE (reneging);
+ }
+ else if (PLAYER_SAID (R, return_beasts))
+ {
+ NPCPhrase (WHAT_RELATIONSHIP);
+
+ DISABLE_PHRASE (return_beasts);
+ }
+ else if (PLAYER_SAID (R, minds_and_might))
+ {
+ NPCPhrase (HUH);
+
+ DISABLE_PHRASE (minds_and_might);
+ }
+ else if (PLAYER_SAID (R, fellowship))
+ {
+ NPCPhrase (WHAT);
+
+ DISABLE_PHRASE (fellowship);
+ }
+
+ if (PHRASE_ENABLED (deals_a_deal))
+ Response (deals_a_deal, SpathiParty);
+ else if (PHRASE_ENABLED (how_long))
+ Response (how_long, SpathiParty);
+ else if (PHRASE_ENABLED (reneging))
+ Response (reneging, SpathiParty);
+ else if (PHRASE_ENABLED (return_beasts))
+ Response (return_beasts, SpathiParty);
+ else
+ {
+ if (PHRASE_ENABLED (minds_and_might))
+ Response (minds_and_might, SpathiParty);
+ if (PHRASE_ENABLED (fellowship))
+ Response (fellowship, SpathiParty);
+ Response (do_as_we_say, ExitConversation);
+
+ return;
+ }
+ switch (GET_GAME_STATE (SPATHI_HOME_VISITS) - 1)
+ {
+ case 0:
+ Response (bye_from_party_1, ExitConversation);
+ break;
+ case 1:
+ Response (bye_from_party_2, ExitConversation);
+ break;
+ default:
+ Response (bye_from_party_3, ExitConversation);
+ break;
+ }
+}
+
+static void
+SpathiCouncil (RESPONSE_REF R)
+{
+ if (R == 0)
+ NPCPhrase (HELLO_AGAIN);
+ else if (PLAYER_SAID (R, good_password))
+ {
+ NPCPhrase (YES_GOOD_PASSWORD);
+ XFormColorMap (GetColorMapAddress (
+ SetAbsColorMapIndex (CommData.AlienColorMap, 1)
+ ), ONE_SECOND / 4);
+
+ SET_GAME_STATE (KNOW_SPATHI_PASSWORD, 1);
+ SET_GAME_STATE (SPATHI_HOME_VISITS, 0);
+ }
+ else if (PLAYER_SAID (R, we_come_in_peace))
+ {
+ NPCPhrase (KILLED_SPATHI);
+
+ DISABLE_PHRASE (we_come_in_peace);
+ }
+ else if (PLAYER_SAID (R, spathi_on_pluto))
+ {
+ NPCPhrase (WHERE_SPATHI);
+
+ DISABLE_PHRASE (spathi_on_pluto);
+ }
+ else if (PLAYER_SAID (R, hostage))
+ {
+ NPCPhrase (GUN_TO_HEAD);
+
+ SET_GAME_STATE (FOUND_PLUTO_SPATHI, 3);
+ DISABLE_PHRASE (hostage);
+ }
+ else if (PLAYER_SAID (R, killed_fwiffo))
+ {
+ NPCPhrase (POOR_FWIFFO);
+
+ SET_GAME_STATE (FOUND_PLUTO_SPATHI, 3);
+ DISABLE_PHRASE (killed_fwiffo);
+ }
+ else if (PLAYER_SAID (R, fwiffo_fine))
+ {
+ NPCPhrase (NOT_LIKELY);
+
+ R = killed_fwiffo;
+ DISABLE_PHRASE (fwiffo_fine);
+ }
+ else if (PLAYER_SAID (R, surrender))
+ {
+ NPCPhrase (NO_SURRENDER);
+
+ DISABLE_PHRASE (surrender);
+ }
+
+ if (GET_GAME_STATE (SPATHI_MANNER) == 0)
+ {
+ Response (we_come_in_peace, AllianceOffer);
+ }
+ else if (PHRASE_ENABLED (we_come_in_peace))
+ {
+ Response (we_come_in_peace, SpathiCouncil);
+ }
+ else
+ {
+ Response (misunderstanding, AllianceOffer);
+ }
+ if (GET_GAME_STATE (FOUND_PLUTO_SPATHI)
+ && GET_GAME_STATE (FOUND_PLUTO_SPATHI) < 3)
+ {
+ if (PHRASE_ENABLED (spathi_on_pluto))
+ Response (spathi_on_pluto, SpathiCouncil);
+ else if (HaveEscortShip (SPATHI_SHIP))
+ {
+ if (PHRASE_ENABLED (hostage))
+ Response (hostage, SpathiCouncil);
+ }
+ else if (PHRASE_ENABLED (killed_fwiffo))
+ {
+ Response (killed_fwiffo, SpathiCouncil);
+ if (PHRASE_ENABLED (fwiffo_fine))
+ Response (fwiffo_fine, SpathiCouncil);
+ }
+ }
+ if (PHRASE_ENABLED (surrender))
+ Response (surrender, SpathiCouncil);
+ else
+ {
+ Response (surrender_or_die, ExitConversation);
+ }
+ Response (bye_no_ally_offer, ExitConversation);
+}
+
+static void
+SpathiPassword (RESPONSE_REF R)
+{
+ if (R == 0)
+ {
+ BYTE NumVisits;
+
+ NumVisits = GET_GAME_STATE (SPATHI_HOME_VISITS);
+ switch (NumVisits++)
+ {
+ default:
+ NPCPhrase (WHAT_IS_PASSWORD);
+ NumVisits = 1;
+ break;
+ case 1:
+ NPCPhrase (WHAT_IS_PASSWORD_AGAIN);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (SPATHI_HOME_VISITS, NumVisits);
+ }
+ else if (PLAYER_SAID (R, what_do_i_get))
+ {
+ NPCPhrase (YOU_GET_TO_LIVE);
+
+ DISABLE_PHRASE (what_do_i_get);
+ }
+
+ if (GET_GAME_STATE (FOUND_PLUTO_SPATHI)
+ || GET_GAME_STATE (KNOW_SPATHI_PASSWORD))
+ {
+ Response (good_password, SpathiCouncil);
+ if (PHRASE_ENABLED (what_do_i_get))
+ {
+ Response (what_do_i_get, SpathiPassword);
+ }
+ }
+ else
+ {
+ construct_response (shared_phrase_buf,
+ we_are_vindicator0,
+ GLOBAL_SIS (CommanderName),
+ we_are_vindicator1,
+ GLOBAL_SIS (ShipName),
+ we_are_vindicator2,
+ (UNICODE*)NULL);
+ DoResponsePhrase (we_are_vindicator0, ExitConversation, shared_phrase_buf);
+ Response (gort_merenga, ExitConversation);
+ Response (guph_florp, ExitConversation);
+ Response (wagngl_fthagn, ExitConversation);
+ Response (pleeese, ExitConversation);
+ Response (screw_password, ExitConversation);
+ }
+}
+
+static void
+Intro (void)
+{
+ BYTE Manner;
+
+ Manner = GET_GAME_STATE (SPATHI_MANNER);
+ if (Manner == 2)
+ {
+ NPCPhrase (HATE_YOU_FOREVER);
+ setSegue (Segue_hostile);
+ }
+ else if (Manner == 1
+ && GET_GAME_STATE (KNOW_SPATHI_PASSWORD)
+ && (GET_GAME_STATE (FOUND_PLUTO_SPATHI)
+ || GET_GAME_STATE (SPATHI_HOME_VISITS) != 7))
+ {
+ SpathiAngry ((RESPONSE_REF)0);
+ }
+ else if (CheckAlliance (SPATHI_SHIP) == GOOD_GUY)
+ {
+ CommData.AlienColorMap =
+ SetAbsColorMapIndex (CommData.AlienColorMap, 1);
+ SpathiAllies ((RESPONSE_REF)0);
+ }
+ else if (GET_GAME_STATE (SPATHI_PARTY))
+ {
+ CommData.AlienColorMap =
+ SetAbsColorMapIndex (CommData.AlienColorMap, 1);
+ SpathiParty ((RESPONSE_REF)0);
+ }
+ else if (GET_GAME_STATE (SPATHI_QUEST))
+ {
+ if (GET_GAME_STATE (LIED_ABOUT_CREATURES) < 2)
+ {
+ CommData.AlienColorMap =
+ SetAbsColorMapIndex (CommData.AlienColorMap, 1);
+ SpathiQuest ((RESPONSE_REF)0);
+ }
+ else
+ {
+ NPCPhrase (YOU_LIED_2);
+
+ SET_GAME_STATE (SPATHI_MANNER, 2);
+ setSegue (Segue_hostile);
+ }
+ }
+ else if (GET_GAME_STATE (KNOW_SPATHI_QUEST))
+ {
+ CommData.AlienColorMap =
+ SetAbsColorMapIndex (CommData.AlienColorMap, 1);
+ LearnQuest ((RESPONSE_REF)0);
+ }
+ else if (GET_GAME_STATE (KNOW_SPATHI_PASSWORD)
+ && (GET_GAME_STATE (FOUND_PLUTO_SPATHI)
+ || GET_GAME_STATE (SPATHI_HOME_VISITS) != 7))
+ {
+ CommData.AlienColorMap =
+ SetAbsColorMapIndex (CommData.AlienColorMap, 1);
+ SpathiCouncil ((RESPONSE_REF)0);
+ }
+ else
+ {
+ SpathiPassword ((RESPONSE_REF)0);
+ }
+}
+
+static COUNT
+uninit_spahome (void)
+{
+ return (0);
+}
+
+static void
+post_spahome_enc (void)
+{
+ BYTE Manner;
+
+ if (getSegue () == Segue_hostile
+ && (Manner = GET_GAME_STATE (SPATHI_MANNER)) != 2)
+ {
+ SET_GAME_STATE (SPATHI_MANNER, 1);
+ if (Manner != 1)
+ {
+ SET_GAME_STATE (SPATHI_VISITS, 0);
+ SET_GAME_STATE (SPATHI_HOME_VISITS, 0);
+ }
+ }
+}
+
+LOCDATA*
+init_spahome_comm ()
+{
+ LOCDATA *retval;
+
+ spahome_desc.init_encounter_func = Intro;
+ spahome_desc.post_encounter_func = post_spahome_enc;
+ spahome_desc.uninit_encounter_func = uninit_spahome;
+
+ spahome_desc.AlienTextBaseline.x = TEXT_X_OFFS + (SIS_TEXT_WIDTH >> 1);
+ spahome_desc.AlienTextBaseline.y = 0;
+ spahome_desc.AlienTextWidth = SIS_TEXT_WIDTH - 16;
+
+ // use alternate "Safe Ones" track if available
+ spahome_desc.AlienAltSongRes = SPAHOME_MUSIC;
+ spahome_desc.AlienSongFlags |= LDASF_USE_ALTERNATE;
+
+ if (GET_GAME_STATE (SPATHI_MANNER) == 3)
+ {
+ setSegue (Segue_peace);
+ }
+ else
+ {
+ setSegue (Segue_hostile);
+ }
+
+ retval = &spahome_desc;
+
+ return (retval);
+}