summaryrefslogtreecommitdiff
path: root/src/uqm/comm/urquan/urquanc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/uqm/comm/urquan/urquanc.c')
-rw-r--r--src/uqm/comm/urquan/urquanc.c555
1 files changed, 555 insertions, 0 deletions
diff --git a/src/uqm/comm/urquan/urquanc.c b/src/uqm/comm/urquan/urquanc.c
new file mode 100644
index 0000000..efdf710
--- /dev/null
+++ b/src/uqm/comm/urquan/urquanc.c
@@ -0,0 +1,555 @@
+//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"
+
+static LOCDATA urquan_desc =
+{
+ NULL, /* init_encounter_func */
+ NULL, /* post_encounter_func */
+ NULL, /* uninit_encounter_func */
+ URQUAN_PMAP_ANIM, /* AlienFrame */
+ URQUAN_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 */
+ URQUAN_COLOR_MAP, /* AlienColorMap */
+ URQUAN_MUSIC, /* AlienSong */
+ NULL_RESOURCE, /* AlienAltSong */
+ 0, /* AlienSongFlags */
+ URQUAN_CONVERSATION_PHRASES, /* PlayerPhrases */
+ 7, /* NumAnimations */
+ { /* AlienAmbientArray (ambient animations) */
+ {
+ 7, /* StartIndex */
+ 6, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND / 10, 0, /* FrameRate */
+ ONE_SECOND / 10, 0, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 13, /* StartIndex */
+ 3, /* NumFrames */
+ YOYO_ANIM, /* AnimFlags */
+ ONE_SECOND / 20, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 16, /* StartIndex */
+ 3, /* NumFrames */
+ YOYO_ANIM, /* AnimFlags */
+ ONE_SECOND / 20, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 19, /* StartIndex */
+ 3, /* NumFrames */
+ YOYO_ANIM, /* AnimFlags */
+ ONE_SECOND / 20, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 22, /* StartIndex */
+ 7, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND / 15, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 29, /* StartIndex */
+ 7, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND / 15, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 36, /* StartIndex */
+ 8, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND / 15, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ },
+ { /* AlienTransitionDesc */
+ 1, /* StartIndex */
+ 2, /* NumFrames */
+ 0, /* AnimFlags */
+ ONE_SECOND / 6, 0, /* FrameRate */
+ 0, 0, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ { /* AlienTalkDesc */
+ 2, /* StartIndex */
+ 5, /* 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
+CombatIsInevitable (RESPONSE_REF R)
+{
+ setSegue (Segue_hostile);
+
+ if (PLAYER_SAID (R, you_must_surrender))
+ NPCPhrase (NOPE);
+ else if (PLAYER_SAID (R, whats_up_1)
+ || PLAYER_SAID (R, whats_up_2)
+ || PLAYER_SAID (R, whats_up_3)
+ || PLAYER_SAID (R, whats_up_4))
+ {
+ BYTE NumVisits;
+
+ NumVisits = GET_GAME_STATE (URQUAN_INFO);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (GENERAL_INFO_1);
+ break;
+ case 1:
+ NPCPhrase (GENERAL_INFO_2);
+ break;
+ case 2:
+ NPCPhrase (GENERAL_INFO_3);
+ break;
+ case 3:
+ NPCPhrase (GENERAL_INFO_4);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (URQUAN_INFO, NumVisits);
+ }
+ else if (PLAYER_SAID (R, i_wont_surrender))
+ NPCPhrase (BAD_CHOICE);
+ else if (PLAYER_SAID (R, i_will_surrender))
+ {
+ NPCPhrase (GOOD_CHOICE);
+
+ setSegue (Segue_defeat);
+ }
+ else if (PLAYER_SAID (R, like_to_leave))
+ NPCPhrase (INDEPENDENCE_IS_BAD);
+ else if (PLAYER_SAID (R, bye_wars_over))
+ {
+ NPCPhrase (GOODBYE_WARS_OVER);
+
+ setSegue (Segue_peace);
+ }
+ else if (PLAYER_SAID (R, bye_sub_hypno))
+ NPCPhrase (GOODBYE_AND_DIE_SUB_HYPNO);
+ else if (PLAYER_SAID (R, bye_init_hypno))
+ {
+ NPCPhrase (GOODBYE_AND_DIE_INIT_HYPNO);
+
+ SET_GAME_STATE (URQUAN_HYPNO_VISITS, 1);
+ }
+ else if (PLAYER_SAID (R, terran_amphibian)
+ || PLAYER_SAID (R, talking_pet_on_steroids))
+ {
+ NPCPhrase (BAD_NEWS);
+
+ setSegue (Segue_peace);
+ SET_GAME_STATE (URQUAN_HYPNO_VISITS, 1);
+ }
+ else if (PLAYER_SAID (R, falling_asleep)
+ || PLAYER_SAID (R, someone_else_controlled))
+ {
+ NPCPhrase (SOUNDS_FAMILIAR);
+
+ setSegue (Segue_peace);
+ SET_GAME_STATE (URQUAN_HYPNO_VISITS, 1);
+ }
+}
+
+static void
+DescribePet (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, wascally_little_guy))
+ NPCPhrase (WHAT_IT_LOOK_LIKE);
+ else if (PLAYER_SAID (R, turd_and_toad))
+ {
+ NPCPhrase (WHAT_IS_TURD_AND_TOAD);
+
+ DISABLE_PHRASE (turd_and_toad);
+ }
+
+ Response (terran_amphibian, CombatIsInevitable);
+ Response (talking_pet_on_steroids, CombatIsInevitable);
+ if (PHRASE_ENABLED (turd_and_toad))
+ {
+ Response (turd_and_toad, DescribePet);
+ }
+}
+
+static void
+DescribeCompulsion (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, alien_mind_control))
+ NPCPhrase (WHAT_FELT_LIKE);
+ else if (PLAYER_SAID (R, before_coffee))
+ {
+ NPCPhrase (EXPLAIN);
+
+ DISABLE_PHRASE (before_coffee);
+ }
+
+ Response (falling_asleep, CombatIsInevitable);
+ Response (someone_else_controlled, CombatIsInevitable);
+ if (PHRASE_ENABLED (before_coffee))
+ {
+ Response (before_coffee, DescribeCompulsion);
+ }
+}
+
+static void
+MentionCompulsion (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, compulsion))
+ {
+ NPCPhrase (WHAT_COMPULSION);
+
+ SET_GAME_STATE (MENTIONED_PET_COMPULSION, 1);
+ }
+ else if (PLAYER_SAID (R, possessed_by_devil))
+ {
+ NPCPhrase (STUPID_DEVIL);
+
+ DISABLE_PHRASE (possessed_by_devil);
+ }
+ else if (PLAYER_SAID (R, why_explain))
+ {
+ NPCPhrase (MUST_EXPLAIN);
+
+ DISABLE_PHRASE (why_explain);
+ }
+
+ Response (wascally_little_guy, DescribePet);
+ Response (alien_mind_control, DescribeCompulsion);
+ if (PHRASE_ENABLED (possessed_by_devil))
+ Response (possessed_by_devil, MentionCompulsion);
+ if (PHRASE_ENABLED (why_explain))
+ Response (why_explain, MentionCompulsion);
+}
+
+static void
+UrquanHypno (RESPONSE_REF R)
+{
+ if (GET_GAME_STATE (URQUAN_HYPNO_VISITS) == 0)
+ {
+ if (R == 0)
+ NPCPhrase (INIT_URQUAN_WAKE_UP);
+ else if (PLAYER_SAID (R, where_am_i))
+ {
+ NPCPhrase (YOU_ARE_HERE);
+
+ DISABLE_PHRASE (where_am_i);
+ }
+ else if (PLAYER_SAID (R, why_does_my_head_hurt))
+ {
+ NPCPhrase (HURTS_BECAUSE);
+
+ DISABLE_PHRASE (why_does_my_head_hurt);
+ }
+ else if (PLAYER_SAID (R, what_about_2_weeks))
+ {
+ NPCPhrase (ABOUT_2_WEEKS);
+
+ DISABLE_PHRASE (what_about_2_weeks);
+ }
+
+ if (PHRASE_ENABLED (where_am_i))
+ Response (where_am_i, UrquanHypno);
+ if (PHRASE_ENABLED (why_does_my_head_hurt))
+ Response (why_does_my_head_hurt, UrquanHypno);
+ if (PHRASE_ENABLED (what_about_2_weeks))
+ Response (what_about_2_weeks, UrquanHypno);
+ Response (compulsion, MentionCompulsion);
+ Response (bye_init_hypno, CombatIsInevitable);
+ }
+ else
+ {
+ if (R == 0)
+ NPCPhrase (SUBSEQUENT_URQUAN_WAKE_UP);
+ else if (PLAYER_SAID (R, uh_oh))
+ {
+ NPCPhrase (NO_UH_OH);
+
+ DISABLE_PHRASE (uh_oh);
+ }
+ else if (PLAYER_SAID (R, stop_meeting))
+ {
+ NPCPhrase (NO_STOP_MEETING);
+
+ DISABLE_PHRASE (stop_meeting);
+ }
+
+ if (PHRASE_ENABLED (uh_oh))
+ Response (uh_oh, UrquanHypno);
+ if (PHRASE_ENABLED (stop_meeting))
+ Response (stop_meeting, UrquanHypno);
+ if (!GET_GAME_STATE (MENTIONED_PET_COMPULSION))
+ {
+ Response (compulsion, MentionCompulsion);
+ }
+ Response (bye_sub_hypno, CombatIsInevitable);
+ }
+}
+
+static void
+NormalUrquan (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, i_surrender))
+ {
+ NPCPhrase (DISOBEDIENCE_PUNISHED);
+
+ Response (i_wont_surrender, CombatIsInevitable);
+ Response (i_will_surrender, CombatIsInevitable);
+ }
+ else
+ {
+ if (PLAYER_SAID (R, key_phrase))
+ {
+ NPCPhrase (URQUAN_STORY);
+
+ SET_GAME_STATE (KNOW_URQUAN_STORY, 2);
+ }
+
+ Response (you_must_surrender, CombatIsInevitable);
+ if (GET_GAME_STATE (KNOW_URQUAN_STORY) == 1)
+ {
+ Response (key_phrase, NormalUrquan);
+ }
+ switch (GET_GAME_STATE (URQUAN_INFO))
+ {
+ case 0:
+ Response (whats_up_1, CombatIsInevitable);
+ break;
+ case 1:
+ Response (whats_up_2, CombatIsInevitable);
+ break;
+ case 2:
+ Response (whats_up_3, CombatIsInevitable);
+ break;
+ case 3:
+ Response (whats_up_4, CombatIsInevitable);
+ break;
+ }
+ Response (i_surrender, NormalUrquan);
+ Response (like_to_leave, CombatIsInevitable);
+ }
+}
+
+static void
+LoserUrquan (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, why_flee))
+ {
+ NPCPhrase (FLEE_BECAUSE);
+
+ DISABLE_PHRASE (why_flee);
+ }
+ else if (PLAYER_SAID (R, what_happens_now))
+ {
+ NPCPhrase (HAPPENS_NOW);
+
+ DISABLE_PHRASE (what_happens_now);
+ }
+ else if (PLAYER_SAID (R, what_about_you))
+ {
+ NPCPhrase (ABOUT_US);
+
+ DISABLE_PHRASE (what_about_you);
+ }
+
+ if (PHRASE_ENABLED (why_flee))
+ Response (why_flee, LoserUrquan);
+ if (PHRASE_ENABLED (what_happens_now))
+ Response (what_happens_now, LoserUrquan);
+ if (PHRASE_ENABLED (what_about_you))
+ Response (what_about_you, LoserUrquan);
+ Response (bye_wars_over, CombatIsInevitable);
+}
+
+static void
+Intro (void)
+{
+ DWORD GrpOffs;
+
+ if (LOBYTE (GLOBAL (CurrentActivity)) == WON_LAST_BATTLE)
+ {
+ NPCPhrase (OUT_TAKES);
+
+ setSegue (Segue_peace);
+ return;
+ }
+
+ GrpOffs = GET_GAME_STATE_32 (URQUAN_PROBE_GRPOFFS0);
+ if (LOBYTE (GLOBAL (CurrentActivity)) == IN_INTERPLANETARY
+ && GLOBAL (BattleGroupRef)
+ && GLOBAL (BattleGroupRef) == GrpOffs)
+ {
+ NPCPhrase (SEND_MESSAGE);
+ SET_GAME_STATE (PROBE_MESSAGE_DELIVERED, 1);
+ }
+ else if (GET_GAME_STATE (PLAYER_HYPNOTIZED))
+ {
+ SetCommIntroMode (CIM_FADE_IN_SCREEN, ONE_SECOND * 5);
+ UrquanHypno ((RESPONSE_REF)0);
+ }
+ else
+ {
+ BYTE NumVisits;
+
+ if (!GET_GAME_STATE (URQUAN_SENSES_EVIL)
+ && GET_GAME_STATE (TALKING_PET_ON_SHIP))
+ {
+ NPCPhrase (SENSE_EVIL);
+ SET_GAME_STATE (URQUAN_SENSES_EVIL, 1);
+ }
+
+ GrpOffs = GET_GAME_STATE_32 (COLONY_GRPOFFS0);
+ if (LOBYTE (GLOBAL (CurrentActivity)) == IN_INTERPLANETARY
+ && GLOBAL (BattleGroupRef)
+ && GLOBAL (BattleGroupRef) == GrpOffs)
+ {
+ NPCPhrase (CAUGHT_YA);
+
+ setSegue (Segue_hostile);
+ return;
+ }
+
+ GrpOffs = GET_GAME_STATE_32 (SAMATRA_GRPOFFS0);
+ if (LOBYTE (GLOBAL (CurrentActivity)) == IN_INTERPLANETARY
+ && GLOBAL (BattleGroupRef)
+ && GLOBAL (BattleGroupRef) == GrpOffs)
+ {
+ NPCPhrase (HELLO_SAMATRA);
+
+ SET_GAME_STATE (AWARE_OF_SAMATRA, 1);
+ setSegue (Segue_hostile);
+ }
+ else
+ {
+ NumVisits = GET_GAME_STATE (URQUAN_VISITS);
+ if (!GET_GAME_STATE (KOHR_AH_FRENZY))
+ {
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (INIT_HELLO);
+ break;
+ case 1:
+ NPCPhrase (SUBSEQUENT_HELLO_1);
+ break;
+ case 2:
+ NPCPhrase (SUBSEQUENT_HELLO_2);
+ break;
+ case 3:
+ NPCPhrase (SUBSEQUENT_HELLO_3);
+ break;
+ case 4:
+ NPCPhrase (SUBSEQUENT_HELLO_4);
+ --NumVisits;
+ break;
+ }
+
+ NormalUrquan ((RESPONSE_REF)0);
+ }
+ else
+ {
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (INIT_FLEE_HUMAN);
+ LoserUrquan ((RESPONSE_REF)0);
+ break;
+ case 1:
+ NPCPhrase (SUBSEQUENT_FLEE_HUMAN);
+ setSegue (Segue_peace);
+ --NumVisits;
+ break;
+ }
+ }
+ SET_GAME_STATE (URQUAN_VISITS, NumVisits);
+ }
+ }
+}
+
+static COUNT
+uninit_urquan (void)
+{
+ return (0);
+}
+
+static void
+post_urquan_enc (void)
+{
+ SET_GAME_STATE (PLAYER_HYPNOTIZED, 0);
+}
+
+LOCDATA*
+init_urquan_comm (void)
+{
+ LOCDATA *retval;
+
+ DWORD GrpOffs;
+
+ urquan_desc.init_encounter_func = Intro;
+ urquan_desc.post_encounter_func = post_urquan_enc;
+ urquan_desc.uninit_encounter_func = uninit_urquan;
+
+ urquan_desc.AlienTextBaseline.x = TEXT_X_OFFS + (SIS_TEXT_WIDTH >> 1);
+ urquan_desc.AlienTextBaseline.y = 0;
+ urquan_desc.AlienTextWidth = SIS_TEXT_WIDTH - 16;
+
+ GrpOffs = GET_GAME_STATE_32 (URQUAN_PROBE_GRPOFFS0);
+ if (GET_GAME_STATE (PLAYER_HYPNOTIZED)
+ || LOBYTE (GLOBAL (CurrentActivity)) == WON_LAST_BATTLE
+ || (LOBYTE (GLOBAL (CurrentActivity)) == IN_INTERPLANETARY
+ && GLOBAL (BattleGroupRef)
+ && GLOBAL (BattleGroupRef) == GrpOffs))
+ {
+ setSegue (Segue_peace);
+ }
+ else
+ {
+ setSegue (Segue_hostile);
+ }
+ retval = &urquan_desc;
+
+ return (retval);
+}