From 7f6002caba3f0a6749820c2772161caf55b8d267 Mon Sep 17 00:00:00 2001 From: neonloop Date: Fri, 7 May 2021 20:00:12 +0000 Subject: Initial commit (uqm-0.8.0) --- src/uqm/comm/shofixt/shofixt.c | 652 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 652 insertions(+) create mode 100644 src/uqm/comm/shofixt/shofixt.c (limited to 'src/uqm/comm/shofixt/shofixt.c') 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); +} -- cgit v1.2.3