summaryrefslogtreecommitdiff
path: root/src/uqm/comm/ilwrath/ilwrathc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/uqm/comm/ilwrath/ilwrathc.c')
-rw-r--r--src/uqm/comm/ilwrath/ilwrathc.c649
1 files changed, 649 insertions, 0 deletions
diff --git a/src/uqm/comm/ilwrath/ilwrathc.c b/src/uqm/comm/ilwrath/ilwrathc.c
new file mode 100644
index 0000000..1afd812
--- /dev/null
+++ b/src/uqm/comm/ilwrath/ilwrathc.c
@@ -0,0 +1,649 @@
+//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/gameev.h"
+
+
+static LOCDATA ilwrath_desc =
+{
+ NULL, /* init_encounter_func */
+ NULL, /* post_encounter_func */
+ NULL, /* uninit_encounter_func */
+ ILWRATH_PMAP_ANIM, /* AlienFrame */
+ ILWRATH_FONT, /* AlienFont */
+ WHITE_COLOR_INIT, /* AlienTextFColor */
+ BLACK_COLOR_INIT, /* AlienTextBColor */
+ {0, 0}, /* AlienTextBaseline */
+ 0, /* SIS_TEXT_WIDTH - 16, */ /* AlienTextWidth */
+ ALIGN_CENTER, /* AlienTextAlign */
+ VALIGN_MIDDLE, /* AlienTextValign */
+ ILWRATH_COLOR_MAP, /* AlienColorMap */
+ ILWRATH_MUSIC, /* AlienSong */
+ NULL_RESOURCE, /* AlienAltSong */
+ 0, /* AlienSongFlags */
+ ILWRATH_CONVERSATION_PHRASES, /* PlayerPhrases */
+ 4, /* NumAnimations */
+ { /* AlienAmbientArray (ambient animations) */
+ {
+ 6, /* StartIndex */
+ 5, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND / 20, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 11, /* StartIndex */
+ 5, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND / 20, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 16, /* StartIndex */
+ 5, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND / 20, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 21, /* StartIndex */
+ 6, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND / 20, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ },
+ { /* AlienTransitionDesc */
+ 0, /* StartIndex */
+ 0, /* NumFrames */
+ 0, /* AnimFlags */
+ 0, 0, /* FrameRate */
+ 0, 0, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ { /* AlienTalkDesc */
+ 1, /* 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_are_weak))
+ NPCPhrase (STRENGTH_NOT_ALL);
+ else if (PLAYER_SAID (R, slay_by_thousands))
+ NPCPhrase (NO_SLAY_BY_THOUSANDS);
+ else if (PLAYER_SAID (R, ease_up))
+ NPCPhrase (NO_EASE_UP);
+ else if (PLAYER_SAID (R, bye_space))
+ NPCPhrase (GOODBYE_AND_DIE_SPACE);
+ else if (PLAYER_SAID (R, bye_homeworld))
+ NPCPhrase (GOODBYE_AND_DIE_HOMEWORLD);
+ else if (PLAYER_SAID (R, want_peace))
+ NPCPhrase (NO_PEACE);
+ else if (PLAYER_SAID (R, want_alliance))
+ NPCPhrase (NO_ALLIANCE);
+ else if (PLAYER_SAID (R, but_evil_is_defined))
+ NPCPhrase (DONT_CONFUSE_US);
+ else if (PLAYER_SAID (R, bye_gods))
+ {
+ NPCPhrase (GOODBYE_GODS);
+
+ setSegue (Segue_peace);
+ }
+ if (PLAYER_SAID (R, whats_up))
+ {
+ NPCPhrase (GENERAL_INFO);
+ Response (bye, CombatIsInevitable);
+ }
+ else if (PLAYER_SAID (R, whats_up_space_1)
+ || PLAYER_SAID (R, whats_up_space_2)
+ || PLAYER_SAID (R, whats_up_space_3)
+ || PLAYER_SAID (R, whats_up_space_4)
+ || PLAYER_SAID (R, whats_up_space_5))
+ {
+ BYTE NumVisits;
+
+ NumVisits = GET_GAME_STATE (ILWRATH_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);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (ILWRATH_INFO, NumVisits);
+ }
+ else
+ {
+ if (PLAYER_SAID (R, bye))
+ NPCPhrase (GOODBYE_AND_DIE);
+ else if (PLAYER_SAID (R, where_you_come_from))
+ NPCPhrase (CAME_FROM);
+ if (PLAYER_SAID (R, it_will_be_a_pleasure))
+ NPCPhrase (WHO_BLASTS_WHO);
+ if (PLAYER_SAID (R, surrender))
+ NPCPhrase (NO_SURRENDER);
+ if (PLAYER_SAID (R, be_reasonable))
+ NPCPhrase (NOT_REASONABLE);
+ }
+}
+
+static void IlwrathHome (RESPONSE_REF R);
+
+static void
+IlwrathGods (RESPONSE_REF R)
+{
+ BYTE GodsLeft;
+
+ GodsLeft = FALSE;
+ if (PLAYER_SAID (R, want_info_on_gods))
+ NPCPhrase (SO_MUCH_TO_KNOW);
+ else if (PLAYER_SAID (R, when_start_worship))
+ {
+ NPCPhrase (LONG_AGO);
+
+ DISABLE_PHRASE (when_start_worship);
+ }
+ else if (PLAYER_SAID (R, any_good_gods))
+ {
+ NPCPhrase (KILLED_GOOD_GODS);
+
+ DISABLE_PHRASE (any_good_gods);
+ }
+ else if (PLAYER_SAID (R, how_talk_with_gods))
+ {
+ NPCPhrase (CHANNEL_44);
+
+ DISABLE_PHRASE (how_talk_with_gods);
+ }
+ else if (PLAYER_SAID (R, why_44))
+ {
+ NPCPhrase (BECAUSE_44);
+
+ DISABLE_PHRASE (why_44);
+ }
+
+ if (PHRASE_ENABLED (when_start_worship))
+ {
+ Response (when_start_worship, IlwrathGods);
+ GodsLeft = TRUE;
+ }
+ if (PHRASE_ENABLED (any_good_gods))
+ {
+ Response (any_good_gods, IlwrathGods);
+ GodsLeft = TRUE;
+ }
+ if (PHRASE_ENABLED (how_talk_with_gods))
+ {
+ Response (how_talk_with_gods, IlwrathGods);
+ GodsLeft = TRUE;
+ }
+ else if (PHRASE_ENABLED (why_44))
+ {
+ Response (why_44, IlwrathGods);
+ GodsLeft = TRUE;
+ }
+ Response (enough_gods, IlwrathHome);
+
+ if (!GodsLeft)
+ DISABLE_PHRASE (want_info_on_gods);
+}
+
+static void
+IlwrathInfo (RESPONSE_REF R)
+{
+ BYTE InfoLeft;
+
+ InfoLeft = FALSE;
+ if (PLAYER_SAID (R, want_info_on_ilwrath))
+ NPCPhrase (WHAT_ABOUT_ILWRATH);
+ else if (PLAYER_SAID (R, what_about_physio))
+ {
+ NPCPhrase (ABOUT_PHYSIO);
+
+ DISABLE_PHRASE (what_about_physio);
+ }
+ else if (PLAYER_SAID (R, what_about_history))
+ {
+ NPCPhrase (ABOUT_HISTORY);
+
+ DISABLE_PHRASE (what_about_history);
+ }
+ else if (PLAYER_SAID (R, what_about_culture))
+ {
+ NPCPhrase (ABOUT_CULTURE);
+
+ DISABLE_PHRASE (what_about_culture);
+ }
+ else if (PLAYER_SAID (R, what_about_urquan))
+ {
+ NPCPhrase (URQUAN_TOO_NICE);
+
+ DISABLE_PHRASE (what_about_urquan);
+ }
+ else if (PLAYER_SAID (R, are_you_evil))
+ {
+ NPCPhrase (OF_COURSE_WERE_EVIL);
+
+ DISABLE_PHRASE (are_you_evil);
+ }
+
+ if (PHRASE_ENABLED (what_about_physio))
+ {
+ Response (what_about_physio, IlwrathInfo);
+ InfoLeft = TRUE;
+ }
+ if (PHRASE_ENABLED (what_about_history))
+ {
+ Response (what_about_history, IlwrathInfo);
+ InfoLeft = TRUE;
+ }
+ if (PHRASE_ENABLED (what_about_culture))
+ {
+ Response (what_about_culture, IlwrathInfo);
+ InfoLeft = TRUE;
+ }
+ if (PHRASE_ENABLED (what_about_urquan))
+ {
+ Response (what_about_urquan, IlwrathInfo);
+ InfoLeft = TRUE;
+ }
+ if (PHRASE_ENABLED (are_you_evil))
+ {
+ Response (are_you_evil, IlwrathInfo);
+ InfoLeft = TRUE;
+ }
+ else
+ {
+ Response (but_evil_is_defined, CombatIsInevitable);
+ InfoLeft = TRUE;
+ }
+ Response (enough_ilwrath, IlwrathHome);
+
+ if (!InfoLeft)
+ DISABLE_PHRASE (want_info_on_ilwrath);
+}
+
+static void
+IlwrathHome (RESPONSE_REF R)
+{
+ if (R == 0)
+ {
+ BYTE NumVisits;
+
+ NumVisits = GET_GAME_STATE (ILWRATH_HOME_VISITS);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (INIT_HOME_HELLO);
+ break;
+ case 1:
+ NPCPhrase (SUBSEQUENT_HOME_HELLO);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (ILWRATH_HOME_VISITS, NumVisits);
+ }
+ else if (PLAYER_SAID (R, enough_gods))
+ NPCPhrase (OK_ENOUGH_GODS);
+ else if (PLAYER_SAID (R, enough_ilwrath))
+ NPCPhrase (OK_ENOUGH_ILWRATH);
+
+ if (PHRASE_ENABLED (want_info_on_gods))
+ {
+ Response (want_info_on_gods, IlwrathGods);
+ }
+ if (PHRASE_ENABLED (want_info_on_ilwrath))
+ {
+ Response (want_info_on_ilwrath, IlwrathInfo);
+ }
+ Response (want_peace, CombatIsInevitable);
+ Response (want_alliance, CombatIsInevitable);
+ Response (bye_homeworld, CombatIsInevitable);
+}
+
+static void GodsSpeak (RESPONSE_REF R);
+
+static void
+GodsOrder (RESPONSE_REF R)
+{
+ BYTE OrdersLeft;
+
+ OrdersLeft = FALSE;
+ if (PLAYER_SAID (R, other_divine_orders))
+ NPCPhrase (WHAT_ORDERS);
+ else if (PLAYER_SAID (R, say_warship))
+ {
+ NPCPhrase (OK_WARSHIP);
+
+ DISABLE_PHRASE (say_warship);
+ }
+ else if (PLAYER_SAID (R, say_dwe))
+ {
+ NPCPhrase (OK_DWE);
+
+ DISABLE_PHRASE (say_dwe);
+ }
+ else if (PLAYER_SAID (R, say_youboo))
+ {
+ NPCPhrase (OK_YOUBOO);
+
+ DISABLE_PHRASE (say_youboo);
+ }
+ else if (PLAYER_SAID (R, say_dillrat))
+ {
+ NPCPhrase (OK_DILRAT);
+
+ DISABLE_PHRASE (say_dillrat);
+ }
+
+ if (PHRASE_ENABLED (say_warship))
+ {
+ Response (say_warship, GodsOrder);
+ OrdersLeft = TRUE;
+ }
+ if (PHRASE_ENABLED (say_dwe))
+ {
+ Response (say_dwe, GodsOrder);
+ OrdersLeft = TRUE;
+ }
+ if (PHRASE_ENABLED (say_youboo))
+ {
+ Response (say_youboo, GodsOrder);
+ OrdersLeft = TRUE;
+ }
+ if (PHRASE_ENABLED (say_dillrat))
+ {
+ Response (say_dillrat, GodsOrder);
+ OrdersLeft = TRUE;
+ }
+ Response (enough_orders, GodsSpeak);
+
+ if (!OrdersLeft)
+ DISABLE_PHRASE (other_divine_orders);
+}
+
+static void
+GodsSpeak (RESPONSE_REF R)
+{
+ BYTE NumVisits;
+
+ if (R == 0)
+ {
+ if (GET_GAME_STATE (ILWRATH_FIGHT_THRADDASH))
+ NPCPhrase (GLORIOUS_WORSHIP);
+ else if (GET_GAME_STATE (ILWRATH_DECEIVED))
+ NPCPhrase (ON_WAY);
+ else
+ {
+ NumVisits = GET_GAME_STATE (ILWRATH_GODS_SPOKEN);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (ILWRATH_BELIEVE);
+ break;
+ case 1:
+ NPCPhrase (GODS_RETURN_1);
+ break;
+ case 2:
+ NPCPhrase (GODS_RETURN_2);
+ break;
+ case 3:
+ NPCPhrase (GODS_RETURN_3);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (ILWRATH_GODS_SPOKEN, NumVisits);
+ }
+ }
+ else if (PLAYER_SAID (R, go_kill_thraddash))
+ {
+ NPCPhrase (OK_KILL_THRADDASH);
+
+ SET_GAME_STATE (ILWRATH_DECEIVED, 1);
+ AddEvent (RELATIVE_EVENT, 0, 0, 0, ADVANCE_ILWRATH_MISSION);
+ }
+ else if (PLAYER_SAID (R, worship_us))
+ {
+ NumVisits = GET_GAME_STATE (ILWRATH_WORSHIP);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (WE_WORSHIP_1);
+ break;
+ case 1:
+ NPCPhrase (WE_WORSHIP_2);
+ break;
+ case 2:
+ NPCPhrase (WE_WORSHIP_3);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (ILWRATH_WORSHIP, NumVisits);
+
+ DISABLE_PHRASE (worship_us);
+ }
+ else if (PLAYER_SAID (R, enough_orders))
+ NPCPhrase (NEVER_ENOUGH);
+
+ if (!GET_GAME_STATE (ILWRATH_DECEIVED))
+ Response (go_kill_thraddash, GodsSpeak);
+ if (PHRASE_ENABLED (worship_us))
+ Response (worship_us, GodsSpeak);
+ if (PHRASE_ENABLED (other_divine_orders))
+ {
+ Response (other_divine_orders, GodsOrder);
+ }
+ Response (bye_gods, CombatIsInevitable);
+}
+
+static void
+IlwrathSpace (RESPONSE_REF R)
+{
+ BYTE NumVisits;
+
+ if (R == 0)
+ {
+ NumVisits = GET_GAME_STATE (ILWRATH_VISITS);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (INIT_HELLO_SPACE);
+ break;
+ case 1:
+ NPCPhrase (SUBSEQUENT_HELLO_SPACE_1);
+ break;
+ case 2:
+ NPCPhrase (SUBSEQUENT_HELLO_SPACE_2);
+ break;
+ case 3:
+ NPCPhrase (SUBSEQUENT_HELLO_SPACE_3);
+ break;
+ case 4:
+ NPCPhrase (SUBSEQUENT_HELLO_SPACE_4);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (ILWRATH_VISITS, NumVisits);
+ }
+
+ NumVisits = GET_GAME_STATE (ILWRATH_INFO);
+ switch (NumVisits)
+ {
+ case 0:
+ Response (whats_up_space_1, CombatIsInevitable);
+ break;
+ case 1:
+ Response (whats_up_space_2, CombatIsInevitable);
+ break;
+ case 2:
+ Response (whats_up_space_3, CombatIsInevitable);
+ break;
+ case 3:
+ Response (whats_up_space_4, CombatIsInevitable);
+ break;
+ case 4:
+ Response (whats_up_space_5, CombatIsInevitable);
+ break;
+ }
+ Response (you_are_weak, CombatIsInevitable);
+ Response (slay_by_thousands, CombatIsInevitable);
+ Response (ease_up, CombatIsInevitable);
+ Response (bye_space, CombatIsInevitable);
+}
+
+static void
+Intro (void)
+{
+ BYTE NumVisits;
+
+ if (GET_GAME_STATE (PROBE_ILWRATH_ENCOUNTER))
+ {
+ NPCPhrase (SEND_MESSAGE);
+
+ Response (where_you_come_from, CombatIsInevitable);
+ Response (it_will_be_a_pleasure, CombatIsInevitable);
+ Response (surrender, CombatIsInevitable);
+ Response (be_reasonable, CombatIsInevitable);
+ }
+ else if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 7))
+ {
+ IlwrathHome ((RESPONSE_REF)0);
+ }
+ else if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 6))
+ {
+ NumVisits = GET_GAME_STATE (ILWRATH_CHMMR_VISITS);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (INIT_CHMMR_HELLO);
+ break;
+ case 1:
+ NPCPhrase (SUBSEQUENT_CHMMR_HELLO);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (ILWRATH_CHMMR_VISITS, NumVisits);
+
+ Response (whats_up, CombatIsInevitable);
+ Response (bye, CombatIsInevitable);
+ }
+ else if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 5))
+ {
+ // Communicating with an Ilwrath ship using a HyperWave Broadcaster.
+ if (GET_GAME_STATE (ILWRATH_FIGHT_THRADDASH))
+ NPCPhrase (BIG_FUN);
+ else if (GET_GAME_STATE (ILWRATH_DECEIVED))
+ NPCPhrase (FAST_AS_CAN);
+ else
+ NPCPhrase (JUST_GRUNTS);
+
+ setSegue (Segue_peace);
+ }
+ else if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 4))
+ {
+ // Communicating with the Ilwrath homeworld using a
+ // Hyperwave Broadcaster.
+ GodsSpeak ((RESPONSE_REF)0);
+ }
+ else
+ {
+ setSegue (Segue_peace);
+
+ if (GET_GAME_STATE (ILWRATH_FIGHT_THRADDASH))
+ NPCPhrase (HAPPY_FIGHTING_THRADDASH);
+ else if (GET_GAME_STATE (ILWRATH_DECEIVED))
+ NPCPhrase (ON_WAY_TO_THRADDASH);
+ else
+ IlwrathSpace ((RESPONSE_REF)0);
+ }
+}
+
+static COUNT
+uninit_ilwrath (void)
+{
+ return (0);
+}
+
+static void
+post_ilwrath_enc (void)
+{
+ // nothing defined so far
+}
+
+LOCDATA*
+init_ilwrath_comm (void)
+{
+ LOCDATA *retval;
+
+ ilwrath_desc.init_encounter_func = Intro;
+ ilwrath_desc.post_encounter_func = post_ilwrath_enc;
+ ilwrath_desc.uninit_encounter_func = uninit_ilwrath;
+
+ ilwrath_desc.AlienTextBaseline.x = TEXT_X_OFFS + (SIS_TEXT_WIDTH >> 1);
+ ilwrath_desc.AlienTextBaseline.y = 70;
+ ilwrath_desc.AlienTextWidth = SIS_TEXT_WIDTH - 16;
+
+ if (GET_GAME_STATE (PROBE_ILWRATH_ENCOUNTER)
+ || (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA)
+ & ((1 << 4) | (1 << 5)))
+ || LOBYTE (GLOBAL (CurrentActivity)) == WON_LAST_BATTLE)
+ {
+ setSegue (Segue_peace);
+ }
+ else
+ {
+ setSegue (Segue_hostile);
+ }
+ retval = &ilwrath_desc;
+
+ return (retval);
+}