summaryrefslogtreecommitdiff
path: root/src/uqm/comm/shofixt/shofixt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/uqm/comm/shofixt/shofixt.c')
-rw-r--r--src/uqm/comm/shofixt/shofixt.c652
1 files changed, 652 insertions, 0 deletions
diff --git a/src/uqm/comm/shofixt/shofixt.c b/src/uqm/comm/shofixt/shofixt.c
new file mode 100644
index 0000000..e76d8d0
--- /dev/null
+++ b/src/uqm/comm/shofixt/shofixt.c
@@ -0,0 +1,652 @@
+//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 shofixti_desc =
+{
+ NULL, /* init_encounter_func */
+ NULL, /* post_encounter_func */
+ NULL, /* uninit_encounter_func */
+ SHOFIXTI_PMAP_ANIM, /* AlienFrame */
+ SHOFIXTI_FONT, /* AlienFont */
+ WHITE_COLOR_INIT, /* AlienTextFColor */
+ BLACK_COLOR_INIT, /* AlienTextBColor */
+ {0, 0}, /* AlienTextBaseline */
+ 0, /* SIS_TEXT_WIDTH, */ /* AlienTextWidth */
+ ALIGN_CENTER, /* AlienTextAlign */
+ VALIGN_TOP, /* AlienTextValign */
+ SHOFIXTI_COLOR_MAP, /* AlienColorMap */
+ SHOFIXTI_MUSIC, /* AlienSong */
+ NULL_RESOURCE, /* AlienAltSong */
+ 0, /* AlienSongFlags */
+ SHOFIXTI_CONVERSATION_PHRASES, /* PlayerPhrases */
+ 11, /* NumAnimations */
+ { /* AlienAmbientArray (ambient animations) */
+ {
+ 5, /* StartIndex */
+ 15, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND / 30, 0, /* FrameRate */
+ ONE_SECOND / 30, 0, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 20, /* StartIndex */
+ 3, /* NumFrames */
+ RANDOM_ANIM, /* AnimFlags */
+ ONE_SECOND / 10, 0, /* FrameRate */
+ (ONE_SECOND >> 1), (ONE_SECOND >> 1) * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 23, /* StartIndex */
+ 3, /* NumFrames */
+ RANDOM_ANIM, /* AnimFlags */
+ ONE_SECOND / 10, 0, /* FrameRate */
+ (ONE_SECOND >> 1), (ONE_SECOND >> 1) * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 26, /* StartIndex */
+ 3, /* NumFrames */
+ YOYO_ANIM, /* AnimFlags */
+ ONE_SECOND / 30, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 29, /* StartIndex */
+ 4, /* NumFrames */
+ YOYO_ANIM, /* AnimFlags */
+ ONE_SECOND / 15, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+
+ {
+ 33, /* StartIndex */
+ 6, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND / 20, ONE_SECOND / 30, /* FrameRate */
+ ONE_SECOND / 20, ONE_SECOND / 30, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 39, /* StartIndex */
+ 7, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND / 20, ONE_SECOND / 30, /* FrameRate */
+ ONE_SECOND / 20, ONE_SECOND / 30, /* RestartRate */
+ (1 << 7), /* BlockMask */
+ },
+ {
+ 46, /* StartIndex */
+ 6, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND / 20, ONE_SECOND / 30, /* FrameRate */
+ ONE_SECOND / 20, ONE_SECOND / 30, /* RestartRate */
+ (1 << 6), /* BlockMask */
+ },
+ {
+ 52, /* StartIndex */
+ 4, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND / 20, ONE_SECOND / 30, /* FrameRate */
+ ONE_SECOND / 20, ONE_SECOND / 30, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 56, /* StartIndex */
+ 7, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND / 20, ONE_SECOND / 30, /* FrameRate */
+ ONE_SECOND / 20, ONE_SECOND / 30, /* RestartRate */
+ (1 << 10), /* BlockMask */
+ },
+ {
+ 63, /* StartIndex */
+ 6, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND / 20, ONE_SECOND / 30, /* FrameRate */
+ ONE_SECOND / 20, ONE_SECOND / 30, /* RestartRate */
+ (1 << 9), /* 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 / 20, 0, /* FrameRate */
+ ONE_SECOND / 15, 0, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ NULL, /* AlienNumberSpeech - none */
+ /* Filler for loaded resources */
+ NULL, NULL, NULL,
+ NULL,
+ NULL,
+};
+
+static RESPONSE_REF shofixti_name;
+
+static void
+GetShofixtiName (void)
+{
+ if (GET_GAME_STATE (SHOFIXTI_KIA))
+ shofixti_name = katana;
+ else
+ shofixti_name = tanaka;
+}
+
+static void
+ExitConversation (RESPONSE_REF R)
+{
+ setSegue (Segue_hostile);
+
+ if (PLAYER_SAID (R, bye0))
+ {
+ NPCPhrase (GOODBYE);
+
+ setSegue (Segue_peace);
+ }
+ else if (PLAYER_SAID (R, go_ahead))
+ {
+ NPCPhrase (ON_SECOND_THOUGHT);
+
+ setSegue (Segue_peace);
+ }
+ else if (PLAYER_SAID (R, need_you_for_duty))
+ {
+ NPCPhrase (OK_WILL_BE_SENTRY);
+
+ setSegue (Segue_peace);
+ }
+ else if (PLAYER_SAID (R, females)
+ || PLAYER_SAID (R, nubiles)
+ || PLAYER_SAID (R, rat_babes))
+ {
+ NPCPhrase (LEAPING_HAPPINESS);
+
+ SET_GAME_STATE (SHOFIXTI_RECRUITED, 1);
+ SET_GAME_STATE (MAIDENS_ON_SHIP, 0);
+ setSegue (Segue_peace);
+
+ AddEvent (RELATIVE_EVENT, 2, 0, 0, SHOFIXTI_RETURN_EVENT);
+ }
+ else if (PLAYER_SAID (R, dont_attack))
+ {
+ NPCPhrase (TYPICAL_PLOY);
+
+ SET_GAME_STATE (SHOFIXTI_STACK1, 1);
+ }
+ else if (PLAYER_SAID (R, hey_stop))
+ {
+ NPCPhrase (ONLY_STOP);
+
+ SET_GAME_STATE (SHOFIXTI_STACK1, 2);
+ }
+ else if (PLAYER_SAID (R, look_you_are))
+ {
+ NPCPhrase (TOO_BAD);
+
+ SET_GAME_STATE (SHOFIXTI_STACK1, 3);
+ }
+ else if (PLAYER_SAID (R, no_one_insults))
+ {
+ NPCPhrase (YOU_LIMP);
+
+ SET_GAME_STATE (SHOFIXTI_STACK2, 1);
+ }
+ else if (PLAYER_SAID (R, mighty_words))
+ {
+ NPCPhrase (HANG_YOUR);
+
+ SET_GAME_STATE (SHOFIXTI_STACK2, 2);
+ }
+ else if (PLAYER_SAID (R, dont_know))
+ {
+ NPCPhrase (NEVER);
+
+ SET_GAME_STATE (SHOFIXTI_STACK3, 1);
+ }
+ else if (PLAYER_SAID (R, look0))
+ {
+ NPCPhrase (FOR_YOU);
+
+ SET_GAME_STATE (SHOFIXTI_STACK3, 2);
+ }
+ else if (PLAYER_SAID (R, no_bloodshed))
+ {
+ NPCPhrase (YES_BLOODSHED);
+
+ SET_GAME_STATE (SHOFIXTI_STACK3, 3);
+ }
+ else if (PLAYER_SAID (R, dont_want_to_fight))
+ {
+ BYTE NumVisits;
+
+ NumVisits = GET_GAME_STATE (SHOFIXTI_STACK4);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (MUST_FIGHT_YOU_URQUAN_1);
+ break;
+ case 1:
+ NPCPhrase (MUST_FIGHT_YOU_URQUAN_2);
+ break;
+ case 2:
+ NPCPhrase (MUST_FIGHT_YOU_URQUAN_3);
+ break;
+ case 3:
+ NPCPhrase (MUST_FIGHT_YOU_URQUAN_4);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (SHOFIXTI_STACK4, NumVisits);
+ }
+}
+
+static void
+GiveMaidens (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, important_duty))
+ {
+ NPCPhrase (WHAT_DUTY);
+
+ Response (procreating_wildly, GiveMaidens);
+ Response (replenishing_your_species, GiveMaidens);
+ Response (hope_you_have, GiveMaidens);
+ }
+ else
+ {
+ NPCPhrase (SOUNDS_GREAT_BUT_HOW);
+
+ Response (females, ExitConversation);
+ Response (nubiles, ExitConversation);
+ Response (rat_babes, ExitConversation);
+ }
+}
+
+static void
+ConsoleShofixti (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, dont_do_it))
+ {
+ NPCPhrase (YES_I_DO_IT);
+ DISABLE_PHRASE (dont_do_it);
+ }
+ else
+ NPCPhrase (VERY_SAD_KILL_SELF);
+
+ if (GET_GAME_STATE (MAIDENS_ON_SHIP))
+ {
+ Response (important_duty, GiveMaidens);
+ }
+ if (PHRASE_ENABLED (dont_do_it))
+ {
+ Response (dont_do_it, ConsoleShofixti);
+ }
+ Response (need_you_for_duty, ExitConversation);
+ Response (go_ahead, ExitConversation);
+}
+
+static void
+ExplainDefeat (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, i_am_nice))
+ NPCPhrase (MUST_UNDERSTAND);
+ else if (PLAYER_SAID (R, i_am_guy))
+ NPCPhrase (NICE_BUT_WHAT_IS_DONKEY);
+ else /* if (PLAYER_SAID (R, i_am_captain0)) */
+ NPCPhrase (SO_SORRY);
+ NPCPhrase (IS_DEFEAT_TRUE);
+
+ Response (yes_and_no, ConsoleShofixti);
+ Response (clobbered, ConsoleShofixti);
+ Response (butt_blasted, ConsoleShofixti);
+}
+
+static void
+RealizeMistake (RESPONSE_REF R)
+{
+ (void) R; // ignored
+ NPCPhrase (DGRUNTI);
+ SET_GAME_STATE (SHOFIXTI_STACK1, 0);
+ SET_GAME_STATE (SHOFIXTI_STACK3, 0);
+ SET_GAME_STATE (SHOFIXTI_STACK2, 3);
+
+ {
+ UNICODE buf[ALLIANCE_NAME_BUFSIZE];
+
+ GetAllianceName (buf, name_1);
+ construct_response (
+ shared_phrase_buf,
+ i_am_captain0,
+ GLOBAL_SIS (CommanderName),
+ i_am_captain1,
+ buf,
+ i_am_captain2,
+ GLOBAL_SIS (ShipName),
+ i_am_captain3,
+ (UNICODE*)NULL);
+ }
+ DoResponsePhrase (i_am_captain0, ExplainDefeat, shared_phrase_buf);
+ Response (i_am_nice, ExplainDefeat);
+ Response (i_am_guy, ExplainDefeat);
+}
+
+static void
+Hostile (RESPONSE_REF R)
+{
+ (void) R; // ignored
+ switch (GET_GAME_STATE (SHOFIXTI_STACK1))
+ {
+ case 0:
+ Response (dont_attack, ExitConversation);
+ break;
+ case 1:
+ Response (hey_stop, ExitConversation);
+ break;
+ case 2:
+ Response (look_you_are, ExitConversation);
+ break;
+ }
+ switch (GET_GAME_STATE (SHOFIXTI_STACK2))
+ {
+ case 0:
+ Response (no_one_insults, ExitConversation);
+ break;
+ case 1:
+ Response (mighty_words, ExitConversation);
+ break;
+ case 2:
+ Response (donkey_breath, RealizeMistake);
+ break;
+ }
+ switch (GET_GAME_STATE (SHOFIXTI_STACK3))
+ {
+ case 0:
+ Response (dont_know, ExitConversation);
+ break;
+ case 1:
+ {
+ construct_response (
+ shared_phrase_buf,
+ look0,
+ "",
+ shofixti_name,
+ "",
+ look1,
+ (UNICODE*)NULL);
+ DoResponsePhrase (look0, ExitConversation, shared_phrase_buf);
+ break;
+ }
+ case 2:
+ Response (look_you_are, ExitConversation);
+ break;
+ }
+ Response (dont_want_to_fight, ExitConversation);
+}
+
+static void
+Friendly (RESPONSE_REF R)
+{
+ BYTE i, LastStack;
+ struct
+ {
+ RESPONSE_REF pStr;
+ UNICODE *c_buf;
+ } Resp[3];
+ static UNICODE buf0[80], buf1[80];
+
+ LastStack = 0;
+ memset (Resp, 0, sizeof (Resp));
+ if (PLAYER_SAID (R, report0))
+ {
+ NPCPhrase (NOTHING_NEW);
+
+ DISABLE_PHRASE (report0);
+ }
+ else if (PLAYER_SAID (R, why_here0))
+ {
+ NPCPhrase (I_GUARD);
+
+ LastStack = 1;
+ SET_GAME_STATE (SHOFIXTI_STACK1, 1);
+ }
+ else if (PLAYER_SAID (R, what_happened))
+ {
+ NPCPhrase (MET_VUX);
+
+ LastStack = 1;
+ SET_GAME_STATE (SHOFIXTI_STACK1, 2);
+ }
+ else if (PLAYER_SAID (R, glory_device))
+ {
+ NPCPhrase (SWITCH_BROKE);
+
+ SET_GAME_STATE (SHOFIXTI_STACK1, 3);
+ }
+ else if (PLAYER_SAID (R, where_world))
+ {
+ NPCPhrase (BLEW_IT_UP);
+
+ LastStack = 2;
+ SET_GAME_STATE (SHOFIXTI_STACK3, 1);
+ }
+ else if (PLAYER_SAID (R, how_survive))
+ {
+ NPCPhrase (NOT_HERE);
+
+ SET_GAME_STATE (SHOFIXTI_STACK3, 2);
+ }
+
+ if (PHRASE_ENABLED (report0))
+ {
+ construct_response (
+ buf0,
+ report0,
+ "",
+ shofixti_name,
+ "",
+ report1,
+ (UNICODE*)NULL);
+ Resp[0].pStr = report0;
+ Resp[0].c_buf = buf0;
+ }
+
+ switch (GET_GAME_STATE (SHOFIXTI_STACK1))
+ {
+ case 0:
+ construct_response (
+ buf1,
+ why_here0,
+ "",
+ shofixti_name,
+ "",
+ why_here1,
+ (UNICODE*)NULL);
+ Resp[1].pStr = why_here0;
+ Resp[1].c_buf = buf1;
+ break;
+ case 1:
+ Resp[1].pStr = what_happened;
+ break;
+ case 2:
+ Resp[1].pStr = glory_device;
+ break;
+ }
+
+ switch (GET_GAME_STATE (SHOFIXTI_STACK3))
+ {
+ case 0:
+ Resp[2].pStr = where_world;
+ break;
+ case 1:
+ Resp[2].pStr = how_survive;
+ break;
+ }
+
+ if (Resp[LastStack].pStr)
+ DoResponsePhrase (Resp[LastStack].pStr, Friendly, Resp[LastStack].c_buf);
+ for (i = 0; i < 3; ++i)
+ {
+ if (i != LastStack && Resp[i].pStr)
+ DoResponsePhrase (Resp[i].pStr, Friendly, Resp[i].c_buf);
+ }
+ if (GET_GAME_STATE (MAIDENS_ON_SHIP))
+ {
+ Response (important_duty, GiveMaidens);
+ }
+
+ construct_response (
+ shared_phrase_buf,
+ bye0,
+ "",
+ shofixti_name,
+ "",
+ bye1,
+ (UNICODE*)NULL);
+ DoResponsePhrase (bye0, ExitConversation, shared_phrase_buf);
+}
+
+static void
+Intro (void)
+{
+ if (LOBYTE (GLOBAL (CurrentActivity)) == WON_LAST_BATTLE)
+ {
+ NPCPhrase (OUT_TAKES);
+
+ setSegue (Segue_peace);
+ return;
+ }
+
+ GetShofixtiName ();
+
+ if (GET_GAME_STATE (SHOFIXTI_STACK2) > 2)
+ {
+ NPCPhrase (FRIENDLY_HELLO);
+
+ Friendly ((RESPONSE_REF)0);
+ }
+ else
+ {
+ BYTE NumVisits;
+
+ NumVisits = GET_GAME_STATE (SHOFIXTI_VISITS);
+ if (GET_GAME_STATE (SHOFIXTI_KIA))
+ {
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (HOSTILE_KATANA_1);
+ break;
+ case 1:
+ NPCPhrase (HOSTILE_KATANA_2);
+ break;
+ case 2:
+ NPCPhrase (HOSTILE_KATANA_3);
+ break;
+ case 3:
+ NPCPhrase (HOSTILE_KATANA_4);
+ --NumVisits;
+ break;
+ }
+ }
+ else
+ {
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (HOSTILE_TANAKA_1);
+ break;
+ case 1:
+ NPCPhrase (HOSTILE_TANAKA_2);
+ break;
+ case 2:
+ NPCPhrase (HOSTILE_TANAKA_3);
+ break;
+ case 3:
+ NPCPhrase (HOSTILE_TANAKA_4);
+ break;
+ case 4:
+ NPCPhrase (HOSTILE_TANAKA_5);
+ break;
+ case 5:
+ NPCPhrase (HOSTILE_TANAKA_6);
+ break;
+ case 6:
+ NPCPhrase (HOSTILE_TANAKA_7);
+ break;
+ case 7:
+ NPCPhrase (HOSTILE_TANAKA_8);
+ --NumVisits;
+ break;
+ }
+ }
+ SET_GAME_STATE (SHOFIXTI_VISITS, NumVisits);
+
+ Hostile ((RESPONSE_REF)0);
+ }
+}
+
+static COUNT
+uninit_shofixti (void)
+{
+ return(0);
+}
+
+static void
+post_shofixti_enc (void)
+{
+ // nothing defined so far
+}
+
+LOCDATA*
+init_shofixti_comm (void)
+{
+ LOCDATA *retval;
+
+ shofixti_desc.init_encounter_func = Intro;
+ shofixti_desc.post_encounter_func = post_shofixti_enc;
+ shofixti_desc.uninit_encounter_func = uninit_shofixti;
+
+ shofixti_desc.AlienTextBaseline.x = TEXT_X_OFFS + (SIS_TEXT_WIDTH >> 1);
+ shofixti_desc.AlienTextBaseline.y = 0;
+ shofixti_desc.AlienTextWidth = SIS_TEXT_WIDTH;
+
+ setSegue (Segue_peace);
+
+ retval = &shofixti_desc;
+
+ return (retval);
+}