summaryrefslogtreecommitdiff
path: root/src/uqm/comm/pkunk/pkunkc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/uqm/comm/pkunk/pkunkc.c')
-rw-r--r--src/uqm/comm/pkunk/pkunkc.c1148
1 files changed, 1148 insertions, 0 deletions
diff --git a/src/uqm/comm/pkunk/pkunkc.c b/src/uqm/comm/pkunk/pkunkc.c
new file mode 100644
index 0000000..5db575d
--- /dev/null
+++ b/src/uqm/comm/pkunk/pkunkc.c
@@ -0,0 +1,1148 @@
+//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/gameev.h"
+
+
+static LOCDATA pkunk_desc =
+{
+ NULL, /* init_encounter_func */
+ NULL, /* post_encounter_func */
+ NULL, /* uninit_encounter_func */
+ PKUNK_PMAP_ANIM, /* AlienFrame */
+ PKUNK_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 */
+ PKUNK_COLOR_MAP, /* AlienColorMap */
+ PKUNK_MUSIC, /* AlienSong */
+ NULL_RESOURCE, /* AlienAltSong */
+ 0, /* AlienSongFlags */
+ PKUNK_CONVERSATION_PHRASES, /* PlayerPhrases */
+ 3, /* NumAnimations */
+ { /* AlienAmbientArray (ambient animations) */
+ {
+ 3, /* StartIndex */
+ 4, /* NumFrames */
+ CIRCULAR_ANIM
+ | WAIT_TALKING, /* AnimFlags */
+ ONE_SECOND / 30, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 7, /* StartIndex */
+ 4, /* NumFrames */
+ YOYO_ANIM
+ | WAIT_TALKING, /* AnimFlags */
+ ONE_SECOND / 10, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ (1 << 2), /* BlockMask */
+ },
+ {
+ 11, /* StartIndex */
+ 3, /* NumFrames */
+ YOYO_ANIM
+ | WAIT_TALKING, /* AnimFlags */
+ ONE_SECOND / 30, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ (1 << 1), /* BlockMask */
+ },
+ },
+ { /* AlienTransitionDesc */
+ 0, /* StartIndex */
+ 0, /* NumFrames */
+ 0, /* AnimFlags */
+ 0, 0, /* FrameRate */
+ 0, 0, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ { /* AlienTalkDesc */
+ 1, /* StartIndex */
+ 2, /* NumFrames */
+ 0, /* AnimFlags */
+ ONE_SECOND / 15, ONE_SECOND / 6, /* FrameRate */
+ ONE_SECOND / 12, ONE_SECOND / 2, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ NULL, /* AlienNumberSpeech - none */
+ /* Filler for loaded resources */
+ NULL, NULL, NULL,
+ NULL,
+ NULL,
+};
+
+static BOOLEAN
+ShipsReady (void)
+{
+ SIZE i;
+
+ return (GET_GAME_STATE (PKUNK_MANNER) == 3
+ && !((i = (GLOBAL (GameClock.year_index) - START_YEAR) - GET_GAME_STATE (PKUNK_SHIP_YEAR)) < 0
+ || ((i == 0 && (i = GLOBAL (GameClock.month_index) - GET_GAME_STATE (PKUNK_SHIP_MONTH)) < 0)
+ || (i == 0 && GLOBAL (GameClock.day_index) < GET_GAME_STATE (PKUNK_SHIP_DAY)))));
+}
+
+static void
+PrepareShip (void)
+{
+#define MAX_PKUNK_SHIPS 4
+ if (AddEscortShips (PKUNK_SHIP, MAX_PKUNK_SHIPS))
+ {
+ BYTE mi, di, yi;
+
+ mi = GLOBAL (GameClock.month_index);
+ SET_GAME_STATE (PKUNK_SHIP_MONTH, mi);
+ if ((di = GLOBAL (GameClock.day_index)) > 28)
+ di = 28;
+ SET_GAME_STATE (PKUNK_SHIP_DAY, di);
+ yi = (BYTE)(GLOBAL (GameClock.year_index) - START_YEAR) + 1;
+ SET_GAME_STATE (PKUNK_SHIP_YEAR, yi);
+ }
+}
+
+#define GOOD_REASON_1 (1 << 0)
+#define GOOD_REASON_2 (1 << 1)
+#define BAD_REASON_1 (1 << 2)
+#define BAD_REASON_2 (1 << 3)
+
+static void
+ExitConversation (RESPONSE_REF R)
+{
+ setSegue (Segue_peace);
+
+ if (PLAYER_SAID (R, friendly_bye_space))
+ NPCPhrase (FRIENDLY_GOODBYE_SPACE);
+ else if (PLAYER_SAID (R, neutral_bye_space))
+ NPCPhrase (NEUTRAL_GOODBYE_SPACE);
+ else if (PLAYER_SAID (R, bye_angry))
+ NPCPhrase (GOODBYE_ANGRY);
+ else if (PLAYER_SAID (R, bye_friendly))
+ NPCPhrase (GOODBYE_FRIENDLY);
+ else if (PLAYER_SAID (R, we_here_to_help)
+ || PLAYER_SAID (R, we_need_help))
+ {
+ if (PLAYER_SAID (R, we_here_to_help))
+ NPCPhrase (NEED_HELP);
+ else
+ NPCPhrase (GIVE_HELP);
+ NPCPhrase (ALMOST_ALLIANCE);
+
+ SET_GAME_STATE (PKUNK_MANNER, 3);
+ SET_GAME_STATE (PKUNK_VISITS, 0);
+ SET_GAME_STATE (PKUNK_HOME_VISITS, 0);
+ SET_GAME_STATE (PKUNK_INFO, 0);
+
+ AddEvent (RELATIVE_EVENT, 6, 0, 0, ADVANCE_PKUNK_MISSION);
+ if (EscortFeasibilityStudy (PKUNK_SHIP) == 0)
+ NPCPhrase (INIT_NO_ROOM);
+ else
+ {
+ NPCPhrase (INIT_SHIP_GIFT);
+ AlienTalkSegue ((COUNT)~0);
+ PrepareShip ();
+ }
+ }
+ else if (PLAYER_SAID (R, try_to_be_nicer))
+ {
+ NPCPhrase (CANT_ASK_FOR_MORE);
+ NPCPhrase (VISIT_OUR_HOMEWORLD);
+
+ SET_GAME_STATE (PKUNK_MANNER, 3);
+ SET_GAME_STATE (PKUNK_VISITS, 0);
+ SET_GAME_STATE (PKUNK_HOME_VISITS, 0);
+ SET_GAME_STATE (PKUNK_INFO, 0);
+ }
+ else if (PLAYER_SAID (R, must_conquer)
+ || PLAYER_SAID (R, obey))
+ {
+ if (PLAYER_SAID (R, obey))
+ NPCPhrase (NO_OBEY);
+ else
+ {
+ NPCPhrase (BAD_IDEA);
+
+ SET_GAME_STATE (PKUNK_MANNER, 2);
+ }
+ setSegue (Segue_hostile);
+ }
+ else if (PLAYER_SAID (R, die_idiot_fools))
+ {
+ NPCPhrase (VERY_WELL);
+
+ setSegue (Segue_hostile);
+ }
+ else if (PLAYER_SAID (R, suit_yourself))
+ NPCPhrase (GOODBYE_MIGRATION);
+ else
+ {
+ BYTE ReasonMask;
+
+ ReasonMask = GET_GAME_STATE (PKUNK_REASONS);
+ if (PLAYER_SAID (R, good_reason_1))
+ {
+ NPCPhrase (WE_GO_HOME_1);
+ ReasonMask |= GOOD_REASON_1;
+ AddEvent (RELATIVE_EVENT, 0, 0, 0, ADVANCE_PKUNK_MISSION);
+ }
+ else if (PLAYER_SAID (R, good_reason_2))
+ {
+ NPCPhrase (WE_GO_HOME_2);
+ ReasonMask |= GOOD_REASON_2;
+ AddEvent (RELATIVE_EVENT, 0, 0, 0, ADVANCE_PKUNK_MISSION);
+ }
+ else if (PLAYER_SAID (R, bad_reason_1))
+ {
+ NPCPhrase (NO_GO_HOME_1);
+ ReasonMask |= BAD_REASON_1;
+ }
+ else if (PLAYER_SAID (R, bad_reason_2))
+ {
+ NPCPhrase (NO_GO_HOME_2);
+ ReasonMask |= BAD_REASON_2;
+ }
+ SET_GAME_STATE (PKUNK_REASONS, ReasonMask);
+ }
+}
+
+static void PkunkHome (RESPONSE_REF R);
+
+static void
+PkunkAngry (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, why_insults))
+ {
+ NPCPhrase (RELEASE_TENSION);
+
+ DISABLE_PHRASE (why_insults);
+ }
+ else if (PLAYER_SAID (R, what_about_you))
+ {
+ NPCPhrase (ABOUT_US);
+
+ DISABLE_PHRASE (what_about_you);
+ }
+ else if (PLAYER_SAID (R, should_be_friends))
+ {
+ NPCPhrase (YES_FRIENDS);
+
+ DISABLE_PHRASE (should_be_friends);
+ }
+
+ if (PHRASE_ENABLED (should_be_friends))
+ {
+ Response (should_be_friends, PkunkAngry);
+ }
+ else
+ {
+ if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 7))
+ Response (try_to_be_nicer, PkunkHome);
+ else
+ Response (try_to_be_nicer, ExitConversation);
+ }
+ Response (die_idiot_fools, ExitConversation);
+ if (PHRASE_ENABLED (why_insults))
+ Response (why_insults, PkunkAngry);
+ if (PHRASE_ENABLED (what_about_you))
+ Response (what_about_you, PkunkAngry);
+ Response (bye_angry, ExitConversation);
+}
+
+static void
+DiscussConquer (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, we_conquer))
+ {
+ NPCPhrase (WHY_CONQUER);
+
+ DISABLE_PHRASE (we_conquer);
+ }
+ else if (PLAYER_SAID (R, conquer_because_1))
+ {
+#if 0
+ NPCPhrase (NOT_CONQUER_10);
+ NPCPhrase (GLOBAL_ALLIANCE_NAME + name_1);
+ NPCPhrase (NOT_CONQUER_11);
+ NPCPhrase (GLOBAL_ALLIANCE_NAME + name_1);
+ NPCPhrase (NOT_CONQUER_12);
+#endif
+ NPCPhrase (NOT_CONQUER_1);
+
+ DISABLE_PHRASE (conquer_because_1);
+ }
+ else if (PLAYER_SAID (R, conquer_because_2))
+ {
+ NPCPhrase (NOT_CONQUER_2);
+
+ DISABLE_PHRASE (conquer_because_2);
+ }
+
+ if (PHRASE_ENABLED (conquer_because_1))
+ {
+#if 0
+ UNICODE buf[ALLIANCE_NAME_BUFSIZE];
+
+ GetAllianceName (buf, name_1);
+ construct_response (
+ shared_phrase_buf,
+ conquer_because_1,
+ buf,
+ (RESPONSE_REF)-1);
+ DoResponsePhrase (conquer_because_1, DiscussConquer, shared_phrase_buf);
+#endif
+ Response(conquer_because_1, DiscussConquer);
+ }
+ if (PHRASE_ENABLED (conquer_because_2))
+ Response (conquer_because_2, DiscussConquer);
+ Response (must_conquer, ExitConversation);
+ Response (no_conquest, PkunkHome);
+}
+
+static void
+OfferAlliance (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, we_are_vindicator0))
+ NPCPhrase (WHY_YOU_HERE);
+ else if (PLAYER_SAID (R, exploring_universe))
+ {
+ NPCPhrase (SENSE_DEEPER_CONFLICT);
+
+ DISABLE_PHRASE (exploring_universe);
+ }
+ else if (PLAYER_SAID (R, fun_cruise))
+ {
+ NPCPhrase (REPRESS);
+
+ DISABLE_PHRASE (fun_cruise);
+ }
+
+ Response (we_here_to_help, ExitConversation);
+ Response (we_need_help, ExitConversation);
+ if (PHRASE_ENABLED (exploring_universe))
+ Response (exploring_universe, OfferAlliance);
+ if (PHRASE_ENABLED (fun_cruise))
+ Response (fun_cruise, OfferAlliance);
+}
+
+static void
+AboutPkunk (RESPONSE_REF R)
+{
+ BYTE InfoLeft;
+
+ InfoLeft = FALSE;
+ if (PLAYER_SAID (R, what_about_you))
+ NPCPhrase (ABOUT_US);
+ else if (PLAYER_SAID (R, what_about_history))
+ {
+ NPCPhrase (ABOUT_HISTORY);
+
+ DISABLE_PHRASE (what_about_history);
+ }
+ else if (PLAYER_SAID (R, what_about_yehat))
+ {
+ NPCPhrase (ABOUT_YEHAT);
+
+ DISABLE_PHRASE (what_about_yehat);
+ }
+ else if (PLAYER_SAID (R, what_about_culture))
+ {
+ NPCPhrase (ABOUT_CULTURE);
+
+ DISABLE_PHRASE (what_about_culture);
+ }
+ else if (PLAYER_SAID (R, elaborate_culture))
+ {
+ NPCPhrase (OK_ELABORATE_CULTURE);
+
+ DISABLE_PHRASE (elaborate_culture);
+ }
+ else if (PLAYER_SAID (R, what_about_future))
+ {
+ NPCPhrase (ABOUT_FUTURE);
+
+ DISABLE_PHRASE (what_about_future);
+ }
+
+ if (PHRASE_ENABLED (what_about_history))
+ {
+ Response (what_about_history, AboutPkunk);
+ InfoLeft = TRUE;
+ }
+ else if (PHRASE_ENABLED (what_about_yehat))
+ {
+ Response (what_about_yehat, AboutPkunk);
+ InfoLeft = TRUE;
+ }
+ if (PHRASE_ENABLED (what_about_culture))
+ {
+ Response (what_about_culture, AboutPkunk);
+ InfoLeft = TRUE;
+ }
+ else if (PHRASE_ENABLED (elaborate_culture))
+ {
+ Response (elaborate_culture, AboutPkunk);
+ InfoLeft = TRUE;
+ }
+ if (PHRASE_ENABLED (what_about_future))
+ {
+ Response (what_about_future, AboutPkunk);
+ InfoLeft = TRUE;
+ }
+ Response (enough_about_you, PkunkHome);
+
+ if (!InfoLeft)
+ {
+ DISABLE_PHRASE (what_about_you);
+ }
+}
+
+static void
+AboutIlwrath (RESPONSE_REF R)
+{
+ BYTE InfoLeft;
+
+ InfoLeft = FALSE;
+ if (PLAYER_SAID (R, what_about_ilwrath))
+ NPCPhrase (ABOUT_ILWRATH);
+ else if (PLAYER_SAID (R, why_ilwrath_fight))
+ {
+ NPCPhrase (ILWRATH_FIGHT_BECAUSE);
+
+ DISABLE_PHRASE (why_ilwrath_fight);
+ }
+ else if (PLAYER_SAID (R, when_fight_start))
+ {
+ NPCPhrase (FIGHT_START_WHEN);
+
+ DISABLE_PHRASE (when_fight_start);
+ }
+ else if (PLAYER_SAID (R, how_goes_fight))
+ {
+ NPCPhrase (FIGHT_GOES);
+
+ DISABLE_PHRASE (how_goes_fight);
+ }
+ else if (PLAYER_SAID (R, how_stop_fight))
+ {
+ NPCPhrase (STOP_FIGHT_LIKE_SO);
+
+ DISABLE_PHRASE (how_stop_fight);
+ }
+
+ if (PHRASE_ENABLED (why_ilwrath_fight))
+ {
+ Response (why_ilwrath_fight, AboutIlwrath);
+ InfoLeft = TRUE;
+ }
+ if (PHRASE_ENABLED (when_fight_start))
+ {
+ Response (when_fight_start, AboutIlwrath);
+ InfoLeft = TRUE;
+ }
+ if (PHRASE_ENABLED (how_goes_fight))
+ {
+ Response (how_goes_fight, AboutIlwrath);
+ InfoLeft = TRUE;
+ }
+ if (PHRASE_ENABLED (how_stop_fight))
+ {
+ Response (how_stop_fight, AboutIlwrath);
+ InfoLeft = TRUE;
+ }
+ Response (enough_ilwrath, PkunkHome);
+
+ if (!InfoLeft)
+ {
+ DISABLE_PHRASE (what_about_ilwrath);
+ }
+}
+
+static void
+PkunkHome (RESPONSE_REF R)
+{
+ BYTE NumVisits;
+
+ if (PLAYER_SAID (R, no_conquest))
+ NPCPhrase (GOOD_IDEA);
+ else if (PLAYER_SAID (R, enough_ilwrath))
+ NPCPhrase (OK_ENOUGH_ILWRATH);
+ else if (PLAYER_SAID (R, enough_about_you))
+ NPCPhrase (OK_ENOUGH_ABOUT_US);
+ else if (PLAYER_SAID (R, where_fleet_1)
+ || PLAYER_SAID (R, where_fleet_2)
+ || PLAYER_SAID (R, where_fleet_3))
+ {
+ SET_GAME_STATE (PKUNK_SWITCH, 1);
+ if (!(GET_GAME_STATE (PKUNK_MISSION) & 1))
+ {
+ NumVisits = GET_GAME_STATE (PKUNK_RETURN);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (RETURNING_FROM_YEHAT_1);
+ break;
+ case 1:
+ NPCPhrase (RETURNING_FROM_YEHAT_2);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (PKUNK_RETURN, NumVisits);
+ }
+ else
+ {
+ NumVisits = GET_GAME_STATE (PKUNK_MIGRATE);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (MIGRATING_HOMEWORLD_1);
+ break;
+ case 1:
+ NPCPhrase (MIGRATING_HOMEWORLD_2);
+ break;
+ case 2:
+ NPCPhrase (MIGRATING_HOMEWORLD_3);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (PKUNK_MIGRATE, NumVisits);
+ }
+
+ NumVisits = GET_GAME_STATE (PKUNK_FLEET) + 1;
+ SET_GAME_STATE (PKUNK_FLEET, NumVisits);
+
+ DISABLE_PHRASE (where_fleet_1);
+ }
+ else if (PLAYER_SAID (R, am_worried_1)
+ || PLAYER_SAID (R, am_worried_2)
+ || PLAYER_SAID (R, am_worried_3))
+ {
+ NumVisits = GET_GAME_STATE (PKUNK_WORRY);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (DONT_WORRY_1);
+ break;
+ case 1:
+ NPCPhrase (DONT_WORRY_2);
+ break;
+ case 2:
+ NPCPhrase (DONT_WORRY_3);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (PKUNK_WORRY, NumVisits);
+
+ DISABLE_PHRASE (am_worried_1);
+ }
+ else if (PLAYER_SAID (R, try_to_be_nicer))
+ {
+ NPCPhrase (CANT_ASK_FOR_MORE);
+ if (!GET_GAME_STATE (CLEAR_SPINDLE))
+ {
+ NPCPhrase (GIVE_SPINDLE);
+
+ SET_GAME_STATE (CLEAR_SPINDLE, 1);
+ SET_GAME_STATE (CLEAR_SPINDLE_ON_SHIP, 1);
+ }
+ NPCPhrase (CAN_BE_FRIENDS);
+
+ SET_GAME_STATE (PKUNK_MANNER, 3);
+ SET_GAME_STATE (PKUNK_VISITS, 0);
+ SET_GAME_STATE (PKUNK_HOME_VISITS, 0);
+ }
+ else if (PLAYER_SAID (R, what_about_ilwrath))
+ {
+ NPCPhrase (ABOUT_ILWRATH /* ILWRATH_GONE */);
+
+ DISABLE_PHRASE (what_about_ilwrath);
+ }
+
+ if (PHRASE_ENABLED (we_conquer) && GET_GAME_STATE (PKUNK_MANNER) == 0)
+ {
+ Response (we_conquer, DiscussConquer);
+ }
+ if (GET_GAME_STATE (PKUNK_ON_THE_MOVE))
+ {
+ if (PHRASE_ENABLED (where_fleet_1) && !GET_GAME_STATE (PKUNK_SWITCH))
+ {
+ switch (GET_GAME_STATE (PKUNK_FLEET))
+ {
+ case 0:
+ Response (where_fleet_1, PkunkHome);
+ break;
+ case 1:
+ Response (where_fleet_2, PkunkHome);
+ break;
+ case 2:
+ Response (where_fleet_3, PkunkHome);
+ break;
+ }
+ }
+ else if (!PHRASE_ENABLED (where_fleet_1)
+ && PHRASE_ENABLED (am_worried_1)
+ && (GET_GAME_STATE (PKUNK_MISSION) & 1))
+ {
+ switch (GET_GAME_STATE (PKUNK_WORRY))
+ {
+ case 0:
+ Response (am_worried_1, PkunkHome);
+ break;
+ case 1:
+ Response (am_worried_2, PkunkHome);
+ break;
+ case 2:
+ Response (am_worried_3, PkunkHome);
+ break;
+ }
+ }
+ }
+ if (!GET_GAME_STATE (PKUNK_SHIP_MONTH))
+ {
+ 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, OfferAlliance, shared_phrase_buf);
+ }
+ if (PHRASE_ENABLED (what_about_you))
+ {
+ Response (what_about_you, AboutPkunk);
+ }
+ if (PHRASE_ENABLED (what_about_ilwrath))
+ {
+ if (!GET_GAME_STATE (ILWRATH_DECEIVED))
+ {
+ Response (what_about_ilwrath, AboutIlwrath);
+ }
+ else
+ {
+ Response (what_about_ilwrath, PkunkHome);
+ }
+ }
+ Response (bye_friendly, ExitConversation);
+}
+
+static void
+PkunkFriendlySpace (RESPONSE_REF R)
+{
+ BYTE NumVisits;
+
+ if (PLAYER_SAID (R, whats_up_space))
+ {
+ if (ShipsReady ())
+ NPCPhrase (SHIPS_AT_HOME);
+ else
+ {
+ NumVisits = GET_GAME_STATE (PKUNK_INFO);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (GENERAL_INFO_SPACE_1);
+ break;
+ case 1:
+ NPCPhrase (GENERAL_INFO_SPACE_2);
+ break;
+ case 2:
+ NPCPhrase (GENERAL_INFO_SPACE_3);
+ break;
+ case 3:
+ NPCPhrase (GENERAL_INFO_SPACE_4);
+ break;
+ case 4:
+ NPCPhrase (GENERAL_INFO_SPACE_5);
+ break;
+ case 5:
+ NPCPhrase (GENERAL_INFO_SPACE_6);
+ break;
+ case 6:
+ NPCPhrase (GENERAL_INFO_SPACE_7);
+ break;
+ case 7:
+ NPCPhrase (GENERAL_INFO_SPACE_8);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (PKUNK_INFO, NumVisits);
+ }
+
+ DISABLE_PHRASE (whats_up_space);
+ }
+ else if (PLAYER_SAID (R, how_goes_war))
+ {
+ NumVisits = GET_GAME_STATE (PKUNK_WAR);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (WAR_GOES_1);
+ SET_GAME_STATE (KNOW_URQUAN_STORY, 1);
+ SET_GAME_STATE (KNOW_KOHR_AH_STORY, 1);
+ break;
+ case 1:
+ NPCPhrase (WAR_GOES_2);
+ break;
+ case 2:
+ NPCPhrase (WAR_GOES_3);
+ break;
+ case 3:
+ NPCPhrase (WAR_GOES_4);
+ SET_GAME_STATE (PKUNK_DONE_WAR, 1);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (PKUNK_WAR, NumVisits);
+
+ DISABLE_PHRASE (how_goes_war);
+ }
+ else if (PLAYER_SAID (R, tell_my_fortune))
+ {
+ NumVisits = GET_GAME_STATE (PKUNK_FORTUNE);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (FORTUNE_IS_1);
+ break;
+ case 1:
+ NPCPhrase (FORTUNE_IS_2);
+ break;
+ case 2:
+ NPCPhrase (FORTUNE_IS_3);
+ break;
+ case 3:
+ NPCPhrase (FORTUNE_IS_4);
+ break;
+ case 4:
+ NPCPhrase (FORTUNE_IS_5);
+ break;
+ case 5:
+ NPCPhrase (FORTUNE_IS_6);
+ break;
+ case 6:
+ NPCPhrase (FORTUNE_IS_7);
+ break;
+ case 7:
+ NPCPhrase (FORTUNE_IS_8);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (PKUNK_FORTUNE, NumVisits);
+
+ DISABLE_PHRASE (tell_my_fortune);
+ }
+
+ if (PHRASE_ENABLED (whats_up_space))
+ Response (whats_up_space, PkunkFriendlySpace);
+ if (!GET_GAME_STATE (PKUNK_DONE_WAR) && PHRASE_ENABLED (how_goes_war))
+ Response (how_goes_war, PkunkFriendlySpace);
+ if (PHRASE_ENABLED (tell_my_fortune))
+ Response (tell_my_fortune, PkunkFriendlySpace);
+ Response (friendly_bye_space, ExitConversation);
+}
+
+static void
+PkunkNeutralSpace (RESPONSE_REF R)
+{
+ BYTE NumVisits;
+
+ if (PLAYER_SAID (R, form_alliance))
+ {
+ NPCPhrase (GO_TO_HOMEWORLD);
+
+ DISABLE_PHRASE (form_alliance);
+ }
+ else if (PLAYER_SAID (R, can_you_help))
+ {
+ NPCPhrase (GO_TO_HOMEWORLD_AGAIN);
+
+ DISABLE_PHRASE (can_you_help);
+ }
+ else if (PLAYER_SAID (R, hostile_greeting))
+ {
+ NPCPhrase (DONT_BE_HOSTILE);
+
+ DISABLE_PHRASE (hostile_greeting);
+ }
+ else if (PLAYER_SAID (R, whats_up_neutral))
+ {
+ NumVisits = GET_GAME_STATE (PKUNK_INFO);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (GENERAL_INFO_SPACE_1);
+ break;
+ case 1:
+ NPCPhrase (GENERAL_INFO_SPACE_2);
+ break;
+ case 2:
+ NPCPhrase (GENERAL_INFO_SPACE_6 /* was 3 */);
+ break;
+ case 3:
+ NPCPhrase (GENERAL_INFO_SPACE_7 /* was 4 */);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (PKUNK_INFO, NumVisits);
+
+ DISABLE_PHRASE (whats_up_neutral);
+ }
+
+ if (PHRASE_ENABLED (form_alliance))
+ Response (form_alliance, PkunkNeutralSpace);
+ else if (PHRASE_ENABLED (can_you_help))
+ Response (can_you_help, PkunkNeutralSpace);
+ if (PHRASE_ENABLED (hostile_greeting))
+ Response (hostile_greeting, PkunkNeutralSpace);
+ else
+ {
+ Response (obey, ExitConversation);
+ }
+ if (PHRASE_ENABLED (whats_up_neutral))
+ Response (whats_up_neutral, PkunkNeutralSpace);
+ Response (neutral_bye_space, ExitConversation);
+}
+
+static void
+PkunkMigrate (RESPONSE_REF R)
+{
+ BYTE ReasonMask;
+ (void) R; // ignored
+
+ ReasonMask = GET_GAME_STATE (PKUNK_REASONS);
+ if (!(ReasonMask & GOOD_REASON_1))
+ Response (good_reason_1, ExitConversation);
+ if (!(ReasonMask & BAD_REASON_1))
+ Response (bad_reason_1, ExitConversation);
+ if (!(ReasonMask & GOOD_REASON_2))
+ Response (good_reason_2, ExitConversation);
+ if (!(ReasonMask & BAD_REASON_2))
+ Response (bad_reason_2, ExitConversation);
+ Response (suit_yourself, ExitConversation);
+}
+
+static void
+Intro (void)
+{
+ BYTE NumVisits, Manner;
+
+ if (LOBYTE (GLOBAL (CurrentActivity)) == WON_LAST_BATTLE)
+ {
+ NPCPhrase (OUT_TAKES);
+
+ setSegue (Segue_peace);
+ return;
+ }
+
+ Manner = GET_GAME_STATE (PKUNK_MANNER);
+ if (Manner == 2)
+ {
+ // Irreparably Pissed off the Pkunk.
+ NumVisits = GET_GAME_STATE (PKUNK_VISITS);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (HATE_YOU_FOREVER_1);
+ break;
+ case 1:
+ NPCPhrase (HATE_YOU_FOREVER_2);
+ break;
+ case 2:
+ NPCPhrase (HATE_YOU_FOREVER_3);
+ break;
+ case 3:
+ NPCPhrase (HATE_YOU_FOREVER_4);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (PKUNK_VISITS, NumVisits);
+
+ setSegue (Segue_hostile);
+ }
+ else if (Manner == 1)
+ {
+ // Bad relations with the Pkunk, but not irreparably.
+ NumVisits = GET_GAME_STATE (PKUNK_VISITS);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (SPIRITUAL_PROBLEMS_1);
+ break;
+ case 1:
+ NPCPhrase (SPIRITUAL_PROBLEMS_2);
+ break;
+ case 2:
+ NPCPhrase (SPIRITUAL_PROBLEMS_3);
+ break;
+ case 3:
+ NPCPhrase (SPIRITUAL_PROBLEMS_4);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (PKUNK_VISITS, NumVisits);
+
+ PkunkAngry ((RESPONSE_REF)0);
+ }
+ else if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 7))
+ {
+ // Encountering the Pkunk at their home world.
+ if (!GET_GAME_STATE (CLEAR_SPINDLE))
+ {
+ NPCPhrase (GIVE_SPINDLE);
+
+ SET_GAME_STATE (CLEAR_SPINDLE, 1);
+ SET_GAME_STATE (CLEAR_SPINDLE_ON_SHIP, 1);
+ }
+ else if (!GET_GAME_STATE (PKUNK_SENSE_VICTOR)
+ && GLOBAL (GameClock.year_index) > START_YEAR
+ && !GET_GAME_STATE (KOHR_AH_FRENZY))
+ {
+ NPCPhrase (SENSE_KOHRAH_VICTORY);
+
+ SET_GAME_STATE (PKUNK_SENSE_VICTOR, 1);
+ }
+
+ NumVisits = GET_GAME_STATE (PKUNK_HOME_VISITS);
+ if (Manner == 0)
+ {
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (NEUTRAL_HOMEWORLD_HELLO_1);
+ break;
+ case 1:
+ NPCPhrase (NEUTRAL_HOMEWORLD_HELLO_2);
+ break;
+ case 2:
+ NPCPhrase (NEUTRAL_HOMEWORLD_HELLO_3);
+ break;
+ case 3:
+ NPCPhrase (NEUTRAL_HOMEWORLD_HELLO_4);
+ --NumVisits;
+ break;
+ }
+ }
+ else
+ {
+ if (NumVisits && ShipsReady ())
+ {
+ if (EscortFeasibilityStudy (PKUNK_SHIP) == 0)
+ NPCPhrase (NO_ROOM);
+ else
+ {
+ NPCPhrase (SHIP_GIFT);
+ PrepareShip ();
+ }
+ }
+ else switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (FRIENDLY_HOMEWORLD_HELLO_1);
+ break;
+ case 1:
+ NPCPhrase (FRIENDLY_HOMEWORLD_HELLO_2);
+ break;
+ case 2:
+ NPCPhrase (FRIENDLY_HOMEWORLD_HELLO_3);
+ break;
+ case 3:
+ NPCPhrase (FRIENDLY_HOMEWORLD_HELLO_4);
+ break;
+ case 4:
+ NPCPhrase (FRIENDLY_HOMEWORLD_HELLO_5);
+ break;
+ case 5:
+ NPCPhrase (FRIENDLY_HOMEWORLD_HELLO_6);
+ break;
+ case 6:
+ NPCPhrase (FRIENDLY_HOMEWORLD_HELLO_7);
+ break;
+ case 7:
+ NPCPhrase (FRIENDLY_HOMEWORLD_HELLO_8);
+ --NumVisits;
+ break;
+ }
+ }
+ SET_GAME_STATE (PKUNK_HOME_VISITS, NumVisits);
+
+ PkunkHome ((RESPONSE_REF)0);
+ }
+ else if ((NumVisits = GET_GAME_STATE (PKUNK_MISSION)) == 0
+ || !(NumVisits & 1))
+ {
+ // Encountering a Pkunk ship in space, while they are not
+ // migrating.
+ NumVisits = GET_GAME_STATE (PKUNK_VISITS);
+ if (Manner == 3)
+ {
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (FRIENDLY_SPACE_HELLO_1);
+ break;
+ case 1:
+ NPCPhrase (FRIENDLY_SPACE_HELLO_2);
+ break;
+ case 2:
+ NPCPhrase (FRIENDLY_SPACE_HELLO_3);
+ break;
+ case 3:
+ NPCPhrase (FRIENDLY_SPACE_HELLO_4);
+ break;
+ case 4:
+ NPCPhrase (FRIENDLY_SPACE_HELLO_5);
+ break;
+ case 5:
+ NPCPhrase (FRIENDLY_SPACE_HELLO_6);
+ break;
+ case 6:
+ NPCPhrase (FRIENDLY_SPACE_HELLO_7);
+ break;
+ case 7:
+ NPCPhrase (FRIENDLY_SPACE_HELLO_8);
+ --NumVisits;
+ break;
+ }
+
+ PkunkFriendlySpace ((RESPONSE_REF)0);
+ }
+ else
+ {
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (NEUTRAL_SPACE_HELLO_1);
+ break;
+ case 1:
+ NPCPhrase (NEUTRAL_SPACE_HELLO_2);
+ break;
+ case 2:
+ NPCPhrase (NEUTRAL_SPACE_HELLO_3);
+ break;
+ case 3:
+ NPCPhrase (NEUTRAL_SPACE_HELLO_4);
+ --NumVisits;
+ break;
+ }
+
+ PkunkNeutralSpace ((RESPONSE_REF)0);
+ }
+ SET_GAME_STATE (PKUNK_VISITS, NumVisits);
+
+ }
+ else
+ {
+ // Encountering a Pkunk ship in space, while they are
+ // migrating.
+ NumVisits = GET_GAME_STATE (PKUNK_MIGRATE_VISITS);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (MIGRATING_SPACE_1);
+ break;
+ case 1:
+ NPCPhrase (MIGRATING_SPACE_2);
+ break;
+ case 2:
+ NPCPhrase (MIGRATING_SPACE_3);
+ break;
+ case 3:
+ NPCPhrase (MIGRATING_SPACE_4);
+ break;
+ case 4:
+ NPCPhrase (MIGRATING_SPACE_5);
+ break;
+ case 5:
+ NPCPhrase (MIGRATING_SPACE_6);
+ break;
+ case 6:
+ NPCPhrase (MIGRATING_SPACE_7);
+ break;
+ case 7:
+ NPCPhrase (MIGRATING_SPACE_8);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (PKUNK_MIGRATE_VISITS, NumVisits);
+
+ PkunkMigrate ((RESPONSE_REF)0);
+ }
+}
+
+// Called after combat or communications
+static COUNT
+uninit_pkunk (void)
+{
+ return (0);
+}
+
+static void
+post_pkunk_enc (void)
+{
+ BYTE Manner;
+
+ if (getSegue () == Segue_hostile
+ && (Manner = GET_GAME_STATE (PKUNK_MANNER)) != 2)
+ {
+ SET_GAME_STATE (PKUNK_MANNER, 1);
+ if (Manner != 1)
+ {
+ SET_GAME_STATE (PKUNK_VISITS, 0);
+ SET_GAME_STATE (PKUNK_HOME_VISITS, 0);
+ }
+ }
+}
+
+LOCDATA*
+init_pkunk_comm (void)
+{
+ LOCDATA *retval;
+
+ pkunk_desc.init_encounter_func = Intro;
+ pkunk_desc.post_encounter_func = post_pkunk_enc;
+ pkunk_desc.uninit_encounter_func = uninit_pkunk;
+
+ pkunk_desc.AlienTextBaseline.x = TEXT_X_OFFS + (SIS_TEXT_WIDTH >> 1);
+ pkunk_desc.AlienTextBaseline.y = 0;
+ pkunk_desc.AlienTextWidth = SIS_TEXT_WIDTH - 16;
+
+ if (GET_GAME_STATE (PKUNK_MANNER) == 3
+ || LOBYTE (GLOBAL (CurrentActivity)) == WON_LAST_BATTLE)
+ {
+ // Enter communications immediately.
+ setSegue (Segue_peace);
+ }
+ else
+ {
+ // Ask the player whether to attack or talk.
+ setSegue (Segue_hostile);
+ }
+ retval = &pkunk_desc;
+
+ return (retval);
+}
+
+