summaryrefslogtreecommitdiff
path: root/src/uqm/comm/syreen/syreenc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/uqm/comm/syreen/syreenc.c')
-rw-r--r--src/uqm/comm/syreen/syreenc.c878
1 files changed, 878 insertions, 0 deletions
diff --git a/src/uqm/comm/syreen/syreenc.c b/src/uqm/comm/syreen/syreenc.c
new file mode 100644
index 0000000..8884ad6
--- /dev/null
+++ b/src/uqm/comm/syreen/syreenc.c
@@ -0,0 +1,878 @@
+//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 "resinst.h"
+#include "strings.h"
+
+#include "uqm/build.h"
+#include "uqm/setup.h"
+
+
+static LOCDATA syreen_desc =
+{
+ NULL, /* init_encounter_func */
+ NULL, /* post_encounter_func */
+ NULL, /* uninit_encounter_func */
+ SYREEN_PMAP_ANIM, /* AlienFrame */
+ SYREEN_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 */
+ SYREEN_COLOR_MAP, /* AlienColorMap */
+ SYREEN_MUSIC, /* AlienSong */
+ NULL_RESOURCE, /* AlienAltSong */
+ 0, /* AlienSongFlags */
+ SYREEN_CONVERSATION_PHRASES, /* PlayerPhrases */
+ 15, /* NumAnimations */
+ { /* AlienAmbientArray (ambient animations) */
+ {
+ 5, /* StartIndex */
+ 2, /* NumFrames */
+ RANDOM_ANIM, /* AnimFlags */
+ ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 7, /* StartIndex */
+ 2, /* NumFrames */
+ RANDOM_ANIM, /* AnimFlags */
+ ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 9, /* StartIndex */
+ 2, /* NumFrames */
+ RANDOM_ANIM, /* AnimFlags */
+ ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 11, /* StartIndex */
+ 2, /* NumFrames */
+ RANDOM_ANIM, /* AnimFlags */
+ ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 13, /* StartIndex */
+ 2, /* NumFrames */
+ RANDOM_ANIM, /* AnimFlags */
+ ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 15, /* StartIndex */
+ 2, /* NumFrames */
+ RANDOM_ANIM, /* AnimFlags */
+ ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ (1 << 12), /* BlockMask */
+ },
+ {
+ 17, /* StartIndex */
+ 2, /* NumFrames */
+ RANDOM_ANIM, /* AnimFlags */
+ ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 19, /* StartIndex */
+ 2, /* NumFrames */
+ RANDOM_ANIM, /* AnimFlags */
+ ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ (1 << 13),
+ },
+ {
+ 21, /* StartIndex */
+ 6, /* NumFrames */
+ RANDOM_ANIM, /* AnimFlags */
+ ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 27, /* StartIndex */
+ 4, /* NumFrames */
+ YOYO_ANIM, /* AnimFlags */
+ ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */
+ ONE_SECOND * 10, ONE_SECOND * 3, /* RestartRate */
+ (1 << 14), /* BlockMask */
+ },
+ {
+ 31, /* StartIndex */
+ 6, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 37, /* StartIndex */
+ 4, /* NumFrames */
+ RANDOM_ANIM, /* AnimFlags */
+ ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */
+ ONE_SECOND / 15, ONE_SECOND / 15, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 41, /* StartIndex */
+ 3, /* NumFrames */
+ YOYO_ANIM, /* AnimFlags */
+ ONE_SECOND / 10, ONE_SECOND / 15, /* FrameRate */
+ ONE_SECOND * 10, ONE_SECOND * 3, /* RestartRate */
+ (1 << 5), /* BlockMask */
+ },
+ {
+ 44, /* StartIndex */
+ 4, /* NumFrames */
+ YOYO_ANIM
+ | WAIT_TALKING, /* AnimFlags */
+ ONE_SECOND / 6, 0, /* FrameRate */
+ ONE_SECOND * 3, ONE_SECOND, /* RestartRate */
+ (1 << 7) | (1 << 14), /* BlockMask */
+ },
+ {
+ 48, /* StartIndex */
+ 3, /* NumFrames */
+ YOYO_ANIM
+ | WAIT_TALKING, /* AnimFlags */
+ ONE_SECOND * 2 / 15, ONE_SECOND / 15, /* FrameRate */
+ ONE_SECOND * 10, ONE_SECOND,/* RestartRate */
+ (1 << 9) | (1 << 13), /* BlockMask */
+ },
+ },
+ { /* AlienTransitionDesc */
+ 0, /* StartIndex */
+ 0, /* NumFrames */
+ 0, /* AnimFlags */
+ 0, 0, /* FrameRate */
+ 0, 0, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ { /* AlienTalkDesc */
+ 1, /* StartIndex */
+ 4, /* NumFrames */
+ 0, /* AnimFlags */
+ ONE_SECOND / 15, 0, /* FrameRate */
+ ONE_SECOND / 12, 0, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ NULL, /* AlienNumberSpeech - none */
+ /* Filler for loaded resources */
+ NULL, NULL, NULL,
+ NULL,
+ NULL,
+};
+
+static void
+FriendlyExit (RESPONSE_REF R)
+{
+ setSegue (Segue_peace);
+
+ if (PLAYER_SAID (R, bye))
+ NPCPhrase (GOODBYE);
+ else if (PLAYER_SAID (R, im_on_my_way)
+ || PLAYER_SAID (R, doing_this_for_you)
+ || PLAYER_SAID (R, if_i_die))
+ NPCPhrase (GOOD_LUCK);
+ else if (PLAYER_SAID (R, bye_before_vault))
+ NPCPhrase (GOODBYE_BEFORE_VAULT);
+ else if (PLAYER_SAID (R, bye_after_vault))
+ NPCPhrase (GOODBYE_AFTER_VAULT);
+ else if (PLAYER_SAID (R, bye_before_ambush))
+ NPCPhrase (GOODBYE_BEFORE_AMBUSH);
+ else if (PLAYER_SAID (R, bye_after_ambush))
+ NPCPhrase (GOODBYE_AFTER_AMBUSH);
+ else
+ {
+ if (PLAYER_SAID (R, hands_off))
+ NPCPhrase (OK_WONT_USE_HANDS);
+ else if (PLAYER_SAID (R, not_much_more_to_say))
+ NPCPhrase (THEN_STOP_TALKING);
+ NPCPhrase (LATER);
+ NPCPhrase (SEX_GOODBYE);
+
+ AlienTalkSegue (2);
+ XFormColorMap (GetColorMapAddress (
+ SetAbsColorMapIndex (CommData.AlienColorMap, 0)
+ ), ONE_SECOND / 2);
+ AlienTalkSegue ((COUNT)~0);
+
+ SET_GAME_STATE (PLAYER_HAD_SEX, 1);
+ SET_GAME_STATE (PLAYER_HAVING_SEX, 0);
+ }
+}
+
+static void
+Sex (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, in_the_spirit))
+ NPCPhrase (OK_SPIRIT);
+ else if (PLAYER_SAID (R, what_in_mind))
+ NPCPhrase (SOMETHING_LIKE_THIS);
+ else if (PLAYER_SAID (R, disease))
+ NPCPhrase (JUST_RELAX);
+ else if (PLAYER_SAID (R, what_happens_if_i_touch_this))
+ {
+ NPCPhrase (THIS_HAPPENS);
+
+ DISABLE_PHRASE (what_happens_if_i_touch_this);
+ }
+ else if (PLAYER_SAID (R, are_you_sure_this_is_ok))
+ {
+ NPCPhrase (YES_SURE);
+
+ DISABLE_PHRASE (are_you_sure_this_is_ok);
+ }
+ else if (PLAYER_SAID (R, boy_they_never_taught))
+ {
+ NPCPhrase (THEN_LET_ME_TEACH);
+
+ DISABLE_PHRASE (boy_they_never_taught);
+ }
+
+ if (!PHRASE_ENABLED (what_happens_if_i_touch_this)
+ && !PHRASE_ENABLED (are_you_sure_this_is_ok)
+ && !PHRASE_ENABLED (boy_they_never_taught))
+ Response (not_much_more_to_say, FriendlyExit);
+ else
+ {
+ if (PHRASE_ENABLED (what_happens_if_i_touch_this))
+ Response (what_happens_if_i_touch_this, Sex);
+ if (PHRASE_ENABLED (are_you_sure_this_is_ok))
+ Response (are_you_sure_this_is_ok, Sex);
+ if (PHRASE_ENABLED (boy_they_never_taught))
+ Response (boy_they_never_taught, Sex);
+ }
+}
+
+static void
+Foreplay (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, whats_my_reward)
+ || PLAYER_SAID (R, what_about_us))
+ {
+ if (PLAYER_SAID (R, whats_my_reward))
+ NPCPhrase (HERES_REWARD);
+ else
+ NPCPhrase (ABOUT_US);
+ NPCPhrase (MORE_COMFORTABLE);
+ AlienTalkSegue (1);
+ XFormColorMap (GetColorMapAddress (
+ SetAbsColorMapIndex (CommData.AlienColorMap, 1)
+ ), ONE_SECOND);
+ AlienTalkSegue ((COUNT)~0);
+
+ SET_GAME_STATE (PLAYER_HAVING_SEX, 1);
+ }
+ else if (PLAYER_SAID (R, why_lights_off))
+ {
+ NPCPhrase (LIGHTS_OFF_BECAUSE);
+
+ DISABLE_PHRASE (why_lights_off);
+ }
+ else if (PLAYER_SAID (R, evil_monster))
+ {
+ NPCPhrase (NOT_EVIL_MONSTER);
+
+ DISABLE_PHRASE (evil_monster);
+ }
+
+ if (PHRASE_ENABLED (why_lights_off))
+ Response (why_lights_off, Foreplay);
+ else if (PHRASE_ENABLED (evil_monster))
+ Response (evil_monster, Foreplay);
+ else
+ Response (disease, Sex);
+ Response (in_the_spirit, Sex);
+ Response (what_in_mind, Sex);
+ Response (hands_off, FriendlyExit);
+}
+
+static void
+AfterAmbush (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, what_now_after_ambush))
+ {
+ NPCPhrase (DO_THIS_AFTER_AMBUSH);
+
+ DISABLE_PHRASE (what_now_after_ambush);
+ }
+ else if (PLAYER_SAID (R, what_about_you))
+ {
+ NPCPhrase (ABOUT_ME);
+
+ DISABLE_PHRASE (what_about_you);
+ }
+ else if (PLAYER_SAID (R, whats_up_after_ambush))
+ {
+ BYTE NumVisits;
+
+ NumVisits = GET_GAME_STATE (SYREEN_INFO);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (GENERAL_INFO_AFTER_AMBUSH_1);
+ break;
+ case 1:
+ NPCPhrase (GENERAL_INFO_AFTER_AMBUSH_2);
+ break;
+ case 2:
+ NPCPhrase (GENERAL_INFO_AFTER_AMBUSH_3);
+ break;
+ case 3:
+ NPCPhrase (GENERAL_INFO_AFTER_AMBUSH_4);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (SYREEN_INFO, NumVisits);
+
+ DISABLE_PHRASE (whats_up_after_ambush);
+ }
+
+ if (PHRASE_ENABLED (what_about_you))
+ Response (what_about_you, AfterAmbush);
+ else if (!GET_GAME_STATE (PLAYER_HAD_SEX))
+ {
+ Response (what_about_us, Foreplay);
+ }
+ if (PHRASE_ENABLED (what_now_after_ambush))
+ Response (what_now_after_ambush, AfterAmbush);
+ if (PHRASE_ENABLED (whats_up_after_ambush))
+ Response (whats_up_after_ambush, AfterAmbush);
+ Response (bye_after_ambush, FriendlyExit);
+}
+
+static void
+AmbushReady (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, repeat_plan))
+ {
+ NPCPhrase (OK_REPEAT_PLAN);
+
+ DISABLE_PHRASE (repeat_plan);
+ }
+
+ if (PHRASE_ENABLED (repeat_plan))
+ Response (repeat_plan, AmbushReady);
+ Response (bye_before_ambush, FriendlyExit);
+}
+
+static void
+SyreenShuttle (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, whats_next_step))
+ {
+ NPCPhrase (OPEN_VAULT);
+
+ DISABLE_PHRASE (whats_next_step);
+ }
+ else if (PLAYER_SAID (R, what_do_i_get_for_this))
+ {
+ NPCPhrase (GRATITUDE);
+
+ DISABLE_PHRASE (what_do_i_get_for_this);
+ }
+ else if (PLAYER_SAID (R, not_sure))
+ {
+ NPCPhrase (PLEASE);
+
+ DISABLE_PHRASE (not_sure);
+ }
+ else if (PLAYER_SAID (R, where_is_it))
+ {
+ NPCPhrase (DONT_KNOW_WHERE);
+ NPCPhrase (GIVE_SHUTTLE);
+
+ SET_GAME_STATE (SYREEN_SHUTTLE, 1);
+ SET_GAME_STATE (SYREEN_SHUTTLE_ON_SHIP, 1);
+
+ DISABLE_PHRASE (where_is_it);
+ }
+ else if (PLAYER_SAID (R, been_there))
+ {
+ NPCPhrase (GREAT);
+ NPCPhrase (GIVE_SHUTTLE);
+
+ SET_GAME_STATE (SYREEN_SHUTTLE, 1);
+ SET_GAME_STATE (SYREEN_SHUTTLE_ON_SHIP, 1);
+
+ DISABLE_PHRASE (been_there);
+ }
+
+ if (PHRASE_ENABLED (whats_next_step))
+ Response (whats_next_step, SyreenShuttle);
+ else
+ {
+ if (!GET_GAME_STATE (KNOW_SYREEN_VAULT))
+ {
+ if (PHRASE_ENABLED (where_is_it))
+ Response (where_is_it, SyreenShuttle);
+ }
+ else
+ {
+ if (PHRASE_ENABLED (been_there))
+ Response (been_there, SyreenShuttle);
+ }
+ if (!PHRASE_ENABLED (where_is_it)
+ || !PHRASE_ENABLED (been_there))
+ {
+ Response (im_on_my_way, FriendlyExit);
+ Response (doing_this_for_you, FriendlyExit);
+ Response (if_i_die, FriendlyExit);
+ }
+ }
+ if (PHRASE_ENABLED (what_do_i_get_for_this))
+ Response (what_do_i_get_for_this, SyreenShuttle);
+ if (PHRASE_ENABLED (not_sure))
+ Response (not_sure, SyreenShuttle);
+}
+
+static void
+NormalSyreen (RESPONSE_REF R)
+{
+ BYTE i, LastStack;
+ RESPONSE_REF pStr[4];
+
+ LastStack = 0;
+ pStr[0] = pStr[1] = pStr[2] = pStr[3] = 0;
+ if (PLAYER_SAID (R, we_here_to_help))
+ NPCPhrase (NO_NEED_HELP);
+ else if (PLAYER_SAID (R, we_need_help))
+ NPCPhrase (CANT_GIVE_HELP);
+ else if (PLAYER_SAID (R, know_about_deep_children))
+ {
+ NPCPhrase (WHAT_ABOUT_DEEP_CHILDREN);
+
+ DISABLE_PHRASE (know_about_deep_children);
+ }
+ else if (PLAYER_SAID (R, mycons_involved))
+ {
+ NPCPhrase (WHAT_PROOF);
+
+ SET_GAME_STATE (KNOW_ABOUT_SHATTERED, 3);
+ }
+ else if (PLAYER_SAID (R, have_no_proof))
+ {
+ NPCPhrase (NEED_PROOF);
+
+ SET_GAME_STATE (SYREEN_WANT_PROOF, 1);
+ }
+ else if (PLAYER_SAID (R, have_proof))
+ {
+ NPCPhrase (SEE_PROOF);
+
+ DISABLE_PHRASE (have_proof);
+ }
+ else if (PLAYER_SAID (R, what_doing_here))
+ {
+ NPCPhrase (OUR_NEW_WORLD);
+
+ SET_GAME_STATE (SYREEN_STACK0, 1);
+ LastStack = 1;
+ }
+ else if (PLAYER_SAID (R, what_about_war))
+ {
+ NPCPhrase (ABOUT_WAR);
+
+ SET_GAME_STATE (SYREEN_STACK0, 2);
+ LastStack = 1;
+ }
+ else if (PLAYER_SAID (R, help_us))
+ {
+ NPCPhrase (WONT_HELP);
+
+ SET_GAME_STATE (SYREEN_STACK0, 3);
+ }
+ else if (PLAYER_SAID (R, what_about_history))
+ {
+ NPCPhrase (BEFORE_WAR);
+
+ SET_GAME_STATE (SYREEN_STACK1, 1);
+ LastStack = 2;
+ }
+ else if (PLAYER_SAID (R, what_about_homeworld))
+ {
+ NPCPhrase (ABOUT_HOMEWORLD);
+
+ SET_GAME_STATE (SYREEN_STACK1, 2);
+ LastStack = 2;
+ }
+ else if (PLAYER_SAID (R, what_happened))
+ {
+ NPCPhrase (DONT_KNOW_HOW);
+
+ SET_GAME_STATE (KNOW_SYREEN_WORLD_SHATTERED, 1);
+ SET_GAME_STATE (SYREEN_STACK1, 3);
+ }
+ else if (PLAYER_SAID (R, what_about_outfit))
+ {
+ NPCPhrase (HOPE_YOU_LIKE_IT);
+
+ SET_GAME_STATE (SYREEN_STACK2, 1);
+ LastStack = 3;
+ }
+ else if (PLAYER_SAID (R, where_mates))
+ {
+ NPCPhrase (MATES_KILLED);
+
+ SET_GAME_STATE (SYREEN_STACK2, 2);
+ LastStack = 3;
+ }
+ else if (PLAYER_SAID (R, get_lonely))
+ {
+ NPCPhrase (MAKE_OUT_ALL_RIGHT);
+
+ SET_GAME_STATE (SYREEN_STACK2, 3);
+ }
+ else if (PLAYER_SAID (R, look_at_egg_sacks))
+ {
+ NPCPhrase (HORRIBLE_TRUTH);
+
+ setSegue (Segue_peace);
+ SET_GAME_STATE (SYREEN_HOME_VISITS, 0);
+ SET_GAME_STATE (SYREEN_KNOW_ABOUT_MYCON, 1);
+
+ SyreenShuttle ((RESPONSE_REF)0);
+ return;
+ }
+
+ if (GET_GAME_STATE (KNOW_ABOUT_SHATTERED) < 3)
+ {
+ if (GET_GAME_STATE (KNOW_ABOUT_SHATTERED) == 2
+ && GET_GAME_STATE (KNOW_SYREEN_WORLD_SHATTERED))
+ {
+ if (PHRASE_ENABLED (know_about_deep_children))
+ pStr[0] = know_about_deep_children;
+ else
+ pStr[0] = mycons_involved;
+ }
+ }
+ else
+ {
+ if (GET_GAME_STATE (EGG_CASE0_ON_SHIP)
+ || GET_GAME_STATE (EGG_CASE1_ON_SHIP)
+ || GET_GAME_STATE (EGG_CASE2_ON_SHIP))
+ {
+ if (PHRASE_ENABLED (have_proof))
+ pStr[0] = have_proof;
+ else
+ pStr[0] = look_at_egg_sacks;
+ }
+ else if (!GET_GAME_STATE (SYREEN_WANT_PROOF))
+ {
+ pStr[0] = have_no_proof;
+ }
+ }
+ switch (GET_GAME_STATE (SYREEN_STACK0))
+ {
+ case 0:
+ pStr[1] = what_doing_here;
+ break;
+ case 1:
+ pStr[1] = what_about_war;
+ break;
+ case 2:
+ pStr[1] = help_us;
+ break;
+ }
+ switch (GET_GAME_STATE (SYREEN_STACK1))
+ {
+ case 0:
+ pStr[2] = what_about_history;
+ break;
+ case 1:
+ pStr[2] = what_about_homeworld;
+ break;
+ case 2:
+ pStr[2] = what_happened;
+ break;
+ }
+ switch (GET_GAME_STATE (SYREEN_STACK2))
+ {
+ case 0:
+ pStr[3] = what_about_outfit;
+ break;
+ case 1:
+ pStr[3] = where_mates;
+ break;
+ case 2:
+ pStr[3] = get_lonely;
+ break;
+ }
+ if (pStr[LastStack])
+ Response (pStr[LastStack], NormalSyreen);
+ for (i = 0; i < 4; ++i)
+ {
+ if (i != LastStack && pStr[i])
+ Response (pStr[i], NormalSyreen);
+ }
+ Response (bye, FriendlyExit);
+}
+
+static void
+InitialSyreen (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, we_are_vice_squad))
+ {
+ NPCPhrase (OK_VICE);
+ NPCPhrase (HOW_CAN_YOU_BE_HERE);
+ }
+ else if (PLAYER_SAID (R, we_are_the_one_for_you_baby))
+ {
+ NPCPhrase (MAYBE_CAPTAIN);
+ NPCPhrase (HOW_CAN_YOU_BE_HERE);
+ }
+ else if (PLAYER_SAID (R, we_are_vindicator0))
+ {
+ NPCPhrase (WELCOME_VINDICATOR0);
+ if (!usingSpeech)
+ {
+ NPCPhrase (GLOBAL_PLAYER_NAME);
+ NPCPhrase (WELCOME_VINDICATOR1);
+ NPCPhrase (GLOBAL_SHIP_NAME);
+ NPCPhrase (WELCOME_VINDICATOR2);
+ }
+ NPCPhrase (HOW_CAN_YOU_BE_HERE);
+ }
+ else if (PLAYER_SAID (R, we_are_impressed))
+ {
+ NPCPhrase (SO_AM_I_CAPTAIN);
+ NPCPhrase (HOW_CAN_YOU_BE_HERE);
+ }
+ else if (PLAYER_SAID (R, i_need_you))
+ {
+ NPCPhrase (OK_NEED);
+
+ DISABLE_PHRASE (i_need_you);
+ DISABLE_PHRASE (i_need_touch_o_vision);
+ }
+ else if (PLAYER_SAID (R, i_need_touch_o_vision))
+ {
+ NPCPhrase (TOUCH_O_VISION);
+
+ DISABLE_PHRASE (i_need_you);
+ DISABLE_PHRASE (i_need_touch_o_vision);
+ }
+
+ Response (we_here_to_help, NormalSyreen);
+ Response (we_need_help, NormalSyreen);
+ if (PHRASE_ENABLED (i_need_you))
+ Response (i_need_you, InitialSyreen);
+ if (PHRASE_ENABLED (i_need_touch_o_vision))
+ Response (i_need_touch_o_vision, InitialSyreen);
+}
+
+static void
+PlanAmbush (RESPONSE_REF R)
+{
+ (void) R; // ignored
+ NPCPhrase (OK_FOUND_VAULT);
+
+ SET_GAME_STATE (MYCON_AMBUSH, 1);
+ // This is redundant but left here for clarity
+ SET_GAME_STATE (SYREEN_HOME_VISITS, 0);
+
+ Response (whats_my_reward, Foreplay);
+ Response (bye_after_vault, FriendlyExit);
+}
+
+static void
+SyreenVault (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, vault_hint))
+ {
+ NPCPhrase (OK_HINT);
+
+ DISABLE_PHRASE (vault_hint);
+ }
+
+ if (PHRASE_ENABLED (vault_hint))
+ {
+ Response (vault_hint, SyreenVault);
+ }
+ Response (bye_before_vault, FriendlyExit);
+}
+
+static void
+Intro (void)
+{
+ BYTE NumVisits;
+
+ if (LOBYTE (GLOBAL (CurrentActivity)) == WON_LAST_BATTLE)
+ {
+ NPCPhrase (OUT_TAKES);
+
+ setSegue (Segue_peace);
+ return;
+ }
+
+ NumVisits = GET_GAME_STATE (SYREEN_HOME_VISITS);
+ if (GET_GAME_STATE (MYCON_KNOW_AMBUSH))
+ {
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (HELLO_AFTER_AMBUSH_1);
+ SetRaceAllied (SYREEN_SHIP, TRUE);
+ break;
+ case 1:
+ NPCPhrase (HELLO_AFTER_AMBUSH_2);
+ break;
+ case 2:
+ NPCPhrase (HELLO_AFTER_AMBUSH_3);
+ break;
+ case 3:
+ NPCPhrase (HELLO_AFTER_AMBUSH_3);
+ --NumVisits;
+ break;
+ }
+
+ AfterAmbush ((RESPONSE_REF)0);
+ }
+ else if (GET_GAME_STATE (MYCON_AMBUSH))
+ {
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (READY_FOR_AMBUSH);
+ --NumVisits;
+ break;
+ }
+
+ AmbushReady ((RESPONSE_REF)0);
+ }
+ else if (!GET_GAME_STATE (SYREEN_KNOW_ABOUT_MYCON))
+ {
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (HELLO_BEFORE_AMBUSH_1);
+ break;
+ case 1:
+ NPCPhrase (HELLO_BEFORE_AMBUSH_2);
+ break;
+ case 2:
+ NPCPhrase (HELLO_BEFORE_AMBUSH_3);
+ break;
+ case 3:
+ NPCPhrase (HELLO_BEFORE_AMBUSH_4);
+ --NumVisits;
+ break;
+ }
+
+ if (NumVisits > 1)
+ NormalSyreen ((RESPONSE_REF)0);
+ else
+ {
+ construct_response (shared_phrase_buf,
+ we_are_vindicator0,
+ GLOBAL_SIS (CommanderName),
+ we_are_vindicator1,
+ GLOBAL_SIS (ShipName),
+ we_are_vindicator2,
+ (UNICODE*)NULL);
+ Response (we_are_vice_squad, InitialSyreen);
+ Response (we_are_the_one_for_you_baby, InitialSyreen);
+ DoResponsePhrase (we_are_vindicator0, InitialSyreen, shared_phrase_buf);
+ Response (we_are_impressed, InitialSyreen);
+ }
+ }
+#ifdef NEVER
+ else if (!GET_GAME_STATE (SYREEN_SHUTTLE))
+ {
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (MUST_ACT);
+ --NumVisits;
+ break;
+ }
+
+ SyreenShuttle ((RESPONSE_REF)0);
+ }
+#endif /* NEVER */
+ else if (GET_GAME_STATE (SHIP_VAULT_UNLOCKED))
+ {
+ PlanAmbush ((RESPONSE_REF)0);
+ // XXX: PlanAmbush() sets SYREEN_HOME_VISITS=0, but then this value
+ // is immediately reset to NumVisits just below. The intent was to
+ // reset the HELLO stack so that is what we will do here as well.
+ // Note that it is completely redundant because genvault.c resets
+ // SYREEN_HOME_VISITS when it sets SHIP_VAULT_UNLOCKED=1.
+ NumVisits = 0;
+ }
+ else
+ {
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (FOUND_VAULT_YET_1);
+ break;
+ case 1:
+ NPCPhrase (FOUND_VAULT_YET_2);
+ --NumVisits;
+ break;
+ }
+
+ SyreenVault ((RESPONSE_REF)0);
+ }
+ SET_GAME_STATE (SYREEN_HOME_VISITS, NumVisits);
+}
+
+static COUNT
+uninit_syreen (void)
+{
+ return (0);
+}
+
+static void
+post_syreen_enc (void)
+{
+ // nothing defined so far
+}
+
+LOCDATA*
+init_syreen_comm (void)
+{
+ LOCDATA *retval;
+
+ syreen_desc.init_encounter_func = Intro;
+ syreen_desc.post_encounter_func = post_syreen_enc;
+ syreen_desc.uninit_encounter_func = uninit_syreen;
+
+ syreen_desc.AlienTextBaseline.x = TEXT_X_OFFS + (SIS_TEXT_WIDTH >> 1);
+ syreen_desc.AlienTextBaseline.y = 0;
+ syreen_desc.AlienTextWidth = SIS_TEXT_WIDTH - 16;
+
+ setSegue (Segue_peace);
+ retval = &syreen_desc;
+
+ return (retval);
+}