diff options
Diffstat (limited to 'src/uqm/comm/vux/vuxc.c')
-rw-r--r-- | src/uqm/comm/vux/vuxc.c | 796 |
1 files changed, 796 insertions, 0 deletions
diff --git a/src/uqm/comm/vux/vuxc.c b/src/uqm/comm/vux/vuxc.c new file mode 100644 index 0000000..7f7419c --- /dev/null +++ b/src/uqm/comm/vux/vuxc.c @@ -0,0 +1,796 @@ +//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 vux_desc = +{ + NULL, /* init_encounter_func */ + NULL, /* post_encounter_func */ + NULL, /* uninit_encounter_func */ + VUX_PMAP_ANIM, /* AlienFrame */ + VUX_FONT, /* AlienFont */ + WHITE_COLOR_INIT, /* AlienTextFColor */ + BLACK_COLOR_INIT, /* AlienTextBColor */ + {0, 0}, /* AlienTextBaseline */ + 0, /* (SIS_TEXT_WIDTH - 16) >> 1, */ /* AlienTextWidth */ + ALIGN_CENTER, /* AlienTextAlign */ + VALIGN_TOP, /* AlienTextValign */ + VUX_COLOR_MAP, /* AlienColorMap */ + VUX_MUSIC, /* AlienSong */ + NULL_RESOURCE, /* AlienAltSong */ + 0, /* AlienSongFlags */ + VUX_CONVERSATION_PHRASES, /* PlayerPhrases */ + 17, /* NumAnimations */ + { /* AlienAmbientArray (ambient animations) */ + { + 12, /* StartIndex */ + 3, /* NumFrames */ + RANDOM_ANIM, /* AnimFlags */ + ONE_SECOND / 30, ONE_SECOND / 30, /* FrameRate */ + ONE_SECOND / 30, ONE_SECOND / 30, /* RestartRate */ + 0, /* BlockMask */ + }, + { + 15, /* StartIndex */ + 5, /* NumFrames */ + RANDOM_ANIM, /* AnimFlags */ + ONE_SECOND / 30, ONE_SECOND / 30, /* FrameRate */ + ONE_SECOND / 30, ONE_SECOND / 30, /* RestartRate */ + 0, /* BlockMask */ + }, + { + 20, /* StartIndex */ + 14, /* NumFrames */ + CIRCULAR_ANIM, /* AnimFlags */ + ONE_SECOND / 30, 0, /* FrameRate */ + ONE_SECOND / 30, 0, /* RestartRate */ + 0, /* BlockMask */ + }, + { + 34, /* StartIndex */ + 7, /* NumFrames */ + CIRCULAR_ANIM, /* AnimFlags */ + ONE_SECOND / 30, ONE_SECOND / 30, /* FrameRate */ + ONE_SECOND / 30, ONE_SECOND / 30, /* RestartRate */ + 0, /* BlockMask */ + }, + { + 41, /* StartIndex */ + 6, /* NumFrames */ + RANDOM_ANIM, /* AnimFlags */ + ONE_SECOND / 30, ONE_SECOND / 30, /* FrameRate */ + ONE_SECOND / 30, ONE_SECOND / 30, /* RestartRate */ + 0, /* BlockMask */ + }, + { + 47, /* StartIndex */ + 11, /* NumFrames */ + CIRCULAR_ANIM, /* AnimFlags */ + ONE_SECOND / 30, ONE_SECOND / 30, /* FrameRate */ + ONE_SECOND / 30, ONE_SECOND / 30, /* RestartRate */ + 0, /* BlockMask */ + }, + { + 58, /* StartIndex */ + 3, /* NumFrames */ + RANDOM_ANIM, /* AnimFlags */ + ONE_SECOND / 30, ONE_SECOND / 30, /* FrameRate */ + ONE_SECOND / 30, ONE_SECOND / 30, /* RestartRate */ + 0, /* BlockMask */ + }, + { + 61, /* StartIndex */ + 4, /* NumFrames */ + RANDOM_ANIM, /* AnimFlags */ + ONE_SECOND / 30, ONE_SECOND / 30, /* FrameRate */ + ONE_SECOND / 30, ONE_SECOND / 30, /* RestartRate */ + 0, /* BlockMask */ + }, + { + 65, /* StartIndex */ + 4, /* NumFrames */ + RANDOM_ANIM, /* AnimFlags */ + ONE_SECOND / 30, ONE_SECOND / 30, /* FrameRate */ + ONE_SECOND / 30, ONE_SECOND / 30, /* RestartRate */ + 0, /* BlockMask */ + }, + { + 69, /* StartIndex */ + 2, /* NumFrames */ + RANDOM_ANIM, /* AnimFlags */ + ONE_SECOND / 30, ONE_SECOND / 30, /* FrameRate */ + ONE_SECOND / 30, ONE_SECOND / 30, /* RestartRate */ + 0, /* BlockMask */ + }, + { + 71, /* StartIndex */ + 3, /* NumFrames */ + YOYO_ANIM, /* AnimFlags */ + ONE_SECOND / 20, 0, /* FrameRate */ + ONE_SECOND, ONE_SECOND * 3, /* RestartRate */ + 0, /* BlockMask */ + }, + { + 74, /* StartIndex */ + 6, /* NumFrames */ + YOYO_ANIM, /* AnimFlags */ + ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */ + ONE_SECOND / 15, ONE_SECOND / 15, /* RestartRate */ + 0, /* BlockMask */ + }, + { + 80, /* StartIndex */ + 5, /* NumFrames */ + YOYO_ANIM, /* AnimFlags */ + ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */ + ONE_SECOND / 15, ONE_SECOND / 15, /* RestartRate */ + (1 << 14), /* BlockMask */ + }, + { + 85, /* StartIndex */ + 5, /* NumFrames */ + YOYO_ANIM, /* AnimFlags */ + ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */ + ONE_SECOND / 15, ONE_SECOND / 15, /* RestartRate */ + 0, /* BlockMask */ + }, + { + 90, /* StartIndex */ + 5, /* NumFrames */ + YOYO_ANIM, /* AnimFlags */ + ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */ + ONE_SECOND / 15, ONE_SECOND / 15, /* RestartRate */ + (1 << 12), /* BlockMask */ + }, + { + 95, /* StartIndex */ + 4, /* NumFrames */ + YOYO_ANIM, /* AnimFlags */ + ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */ + ONE_SECOND * 5, ONE_SECOND * 5,/* RestartRate */ + 0, /* BlockMask */ + }, + { + 99, /* StartIndex */ + 4, /* NumFrames */ + YOYO_ANIM, /* AnimFlags */ + ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */ + ONE_SECOND * 5, ONE_SECOND * 5,/* RestartRate */ + 0, /* BlockMask */ + }, + }, + { /* AlienTransitionDesc */ + 0, /* StartIndex */ + 0, /* NumFrames */ + 0, /* AnimFlags */ + 0, 0, /* FrameRate */ + 0, 0, /* RestartRate */ + 0, /* BlockMask */ + }, + { /* AlienTalkDesc */ + 1, /* StartIndex */ + 11, /* 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) +{ + BYTE NumVisits; + + setSegue (Segue_hostile); + + if (PLAYER_SAID (R, ok_take_beast)) + { + NPCPhrase (FOOL_AIEE0); + NPCPhrase (FOOL_AIEE1); + + AlienTalkSegue (1); + XFormColorMap (GetColorMapAddress ( + SetAbsColorMapIndex (CommData.AlienColorMap, 1) + ), ONE_SECOND / 4); + AlienTalkSegue ((COUNT)~0); + + SET_GAME_STATE (VUX_BEAST_ON_SHIP, 0); + SET_GAME_STATE (ZEX_IS_DEAD, 1); + setSegue (Segue_peace); + } + else if (PLAYER_SAID (R, try_any_way)) + { + NPCPhrase (NOPE); + + SET_GAME_STATE (VUX_STACK_1, 4); + } + else if (PLAYER_SAID (R, kill_you_squids_1) + || PLAYER_SAID (R, kill_you_squids_2) + || PLAYER_SAID (R, kill_you_squids_3) + || PLAYER_SAID (R, kill_you_squids_4)) + { + NPCPhrase (WE_FIGHT); + + NumVisits = GET_GAME_STATE (VUX_STACK_2) + 1; + if (NumVisits <= 3) + { + SET_GAME_STATE (VUX_STACK_2, NumVisits); + } + } + else if (PLAYER_SAID (R, cant_we_be_friends_1) + || PLAYER_SAID (R, cant_we_be_friends_2) + || PLAYER_SAID (R, cant_we_be_friends_3) + || PLAYER_SAID (R, cant_we_be_friends_4)) + { + NumVisits = GET_GAME_STATE (VUX_STACK_3); + switch (NumVisits++) + { + case 0: + NPCPhrase (NEVER_UGLY_HUMANS_1); + break; + case 1: + NPCPhrase (NEVER_UGLY_HUMANS_2); + break; + case 2: + NPCPhrase (NEVER_UGLY_HUMANS_3); + break; + case 3: + NPCPhrase (NEVER_UGLY_HUMANS_4); + --NumVisits; + break; + } + SET_GAME_STATE (VUX_STACK_3, NumVisits); + } + else if (PLAYER_SAID (R, bye_hostile_space)) + { + NumVisits = GET_GAME_STATE (VUX_STACK_4); + switch (NumVisits++) + { + case 0: + NPCPhrase (GOODBYE_AND_DIE_HOSTILE_SPACE_1); + break; + case 1: + NPCPhrase (GOODBYE_AND_DIE_HOSTILE_SPACE_2); + break; + case 2: + NPCPhrase (GOODBYE_AND_DIE_HOSTILE_SPACE_3); + break; + case 3: + NPCPhrase (GOODBYE_AND_DIE_HOSTILE_SPACE_4); + --NumVisits; + break; + } + SET_GAME_STATE (VUX_STACK_4, NumVisits); + } + else if (PLAYER_SAID (R, bye_zex)) + { + NPCPhrase (GOODBYE_ZEX); + + setSegue (Segue_peace); + } + else + { + NumVisits = GET_GAME_STATE (VUX_STACK_1); + switch (NumVisits++) + { + case 4: + NPCPhrase (NOT_ACCEPTED_1); + break; + case 5: + NPCPhrase (NOT_ACCEPTED_2); + break; + case 6: + NPCPhrase (NOT_ACCEPTED_3); + break; + case 7: + NPCPhrase (NOT_ACCEPTED_4); + break; + case 8: + NPCPhrase (NOT_ACCEPTED_5); + break; + case 9: + NPCPhrase (NOT_ACCEPTED_6); + break; + case 10: + NPCPhrase (NOT_ACCEPTED_7); + break; + case 11: + NPCPhrase (NOT_ACCEPTED_8); + break; + case 12: + NPCPhrase (NOT_ACCEPTED_9); + break; + case 13: + NPCPhrase (TRUTH); + break; + } + SET_GAME_STATE (VUX_STACK_1, NumVisits); + } +} + +static void +Menagerie (RESPONSE_REF R) +{ + BYTE i, LastStack; + RESPONSE_REF pStr[3]; + + if (PLAYER_SAID (R, i_have_beast) + || PLAYER_SAID (R, why_trust_1) + || PLAYER_SAID (R, why_trust_2) + || PLAYER_SAID (R, why_trust_3)) + { + if (PLAYER_SAID (R, i_have_beast)) + NPCPhrase (GIVE_BEAST); + else if (PLAYER_SAID (R, why_trust_1)) + { + NPCPhrase (TRUST_1); + + DISABLE_PHRASE (why_trust_1); + } + else if (PLAYER_SAID (R, why_trust_2)) + { + NPCPhrase (TRUST_2); + + DISABLE_PHRASE (why_trust_2); + } + else if (PLAYER_SAID (R, why_trust_3)) + { + NPCPhrase (TRUST_3); + + DISABLE_PHRASE (why_trust_3); + } + + if (PHRASE_ENABLED (why_trust_1)) + Response (why_trust_1, Menagerie); + else if (PHRASE_ENABLED (why_trust_2)) + Response (why_trust_2, Menagerie); + else if (PHRASE_ENABLED (why_trust_3)) + Response (why_trust_3, Menagerie); + Response (ok_take_beast, CombatIsInevitable); + } + else if (PLAYER_SAID (R, kill_you)) + { + NPCPhrase (FIGHT_AGAIN); + + setSegue (Segue_hostile); + } + else if (PLAYER_SAID (R, regardless)) + { + NPCPhrase (THEN_FIGHT); + + setSegue (Segue_hostile); + SET_GAME_STATE (ZEX_STACK_3, 2); + SET_GAME_STATE (ZEX_VISITS, 0); + } + else + { + LastStack = 0; + pStr[0] = pStr[1] = pStr[2] = 0; + if (R == 0) + { + BYTE NumVisits; + + NumVisits = GET_GAME_STATE (ZEX_VISITS); + if (GET_GAME_STATE (ZEX_STACK_3) >= 2) + { + switch (NumVisits++) + { + case 0: + NPCPhrase (FIGHT_OR_TRADE_1); + break; + case 1: + NPCPhrase (FIGHT_OR_TRADE_2); + --NumVisits; + break; + } + } + else + { + switch (NumVisits++) + { + case 0: + NPCPhrase (ZEX_HELLO_1); + break; + case 1: + NPCPhrase (ZEX_HELLO_2); + break; + case 2: + NPCPhrase (ZEX_HELLO_3); + break; + case 3: + NPCPhrase (ZEX_HELLO_4); + --NumVisits; + break; + } + } + SET_GAME_STATE (ZEX_VISITS, NumVisits); + } + else if (PLAYER_SAID (R, what_you_do_here)) + { + NPCPhrase (MY_MENAGERIE); + + SET_GAME_STATE (ZEX_STACK_1, 1); + } + else if (PLAYER_SAID (R, what_about_menagerie)) + { + NPCPhrase (NEED_NEW_CREATURE); + + SET_GAME_STATE (ZEX_STACK_1, 2); + } + else if (PLAYER_SAID (R, what_about_creature)) + { + NPCPhrase (ABOUT_CREATURE); + + SET_GAME_STATE (KNOW_ZEX_WANTS_MONSTER, 1); + SET_GAME_STATE (ZEX_STACK_1, 3); + + R = about_creature_again; + DISABLE_PHRASE (what_about_creature); + } + else if (PLAYER_SAID (R, about_creature_again)) + { + NPCPhrase (CREATURE_AGAIN); + + DISABLE_PHRASE (about_creature_again); + } + else if (PLAYER_SAID (R, why_dont_you_attack)) + { + NPCPhrase (LIKE_YOU); + + LastStack = 1; + SET_GAME_STATE (ZEX_STACK_2, 1); + } + else if (PLAYER_SAID (R, why_like_me)) + { + NPCPhrase (LIKE_BECAUSE); + + LastStack = 1; + SET_GAME_STATE (ZEX_STACK_2, 2); + } + else if (PLAYER_SAID (R, are_you_a_pervert)) + { + NPCPhrase (CALL_ME_WHAT_YOU_WISH); + + SET_GAME_STATE (ZEX_STACK_2, 3); + } + else if (PLAYER_SAID (R, take_by_force)) + { + NPCPhrase (PRECURSOR_DEVICE); + + LastStack = 2; + SET_GAME_STATE (ZEX_STACK_3, 1); + } + else if (PLAYER_SAID (R, you_lied)) + { + NPCPhrase (YUP_LIED); + + LastStack = 2; + SET_GAME_STATE (ZEX_STACK_3, 3); + } + + if (GET_GAME_STATE (KNOW_ZEX_WANTS_MONSTER) + && GET_GAME_STATE (VUX_BEAST_ON_SHIP)) + pStr[0] = i_have_beast; + else + { + switch (GET_GAME_STATE (ZEX_STACK_1)) + { + case 0: + pStr[0] = what_you_do_here; + break; + case 1: + pStr[0] = what_about_menagerie; + break; + case 2: + pStr[0] = what_about_creature; + break; + case 3: + if (PHRASE_ENABLED (about_creature_again)) + pStr[0] = about_creature_again; + break; + } + } + switch (GET_GAME_STATE (ZEX_STACK_2)) + { + case 0: + pStr[1] = why_dont_you_attack; + break; + case 1: + pStr[1] = why_like_me; + break; + case 2: + pStr[1] = are_you_a_pervert; + break; + } + switch (GET_GAME_STATE (ZEX_STACK_3)) + { + case 0: + pStr[2] = take_by_force; + break; + case 1: + pStr[2] = regardless; + break; + case 2: + pStr[2] = you_lied; + break; + case 3: + pStr[2] = kill_you; + break; + } + + if (pStr[LastStack]) + Response (pStr[LastStack], Menagerie); + for (i = 0; i < 3; ++i) + { + if (i != LastStack && pStr[i]) + Response (pStr[i], Menagerie); + } + Response (bye_zex, CombatIsInevitable); + } +} + +static void +NormalVux (RESPONSE_REF R) +{ + if (PLAYER_SAID (R, why_so_mean)) + { + NPCPhrase (URQUAN_SLAVES); + + SET_GAME_STATE (VUX_STACK_1, 1); + } + else if (PLAYER_SAID (R, deeper_reason)) + { + NPCPhrase (OLD_INSULT); + + SET_GAME_STATE (VUX_STACK_1, 2); + } + else if (PLAYER_SAID (R, if_we_apologize)) + { + NPCPhrase (PROBABLY_NOT); + + SET_GAME_STATE (VUX_STACK_1, 3); + } + else if (PLAYER_SAID (R, whats_up_hostile)) + { + BYTE NumVisits; + + NumVisits = GET_GAME_STATE (VUX_INFO); + switch (NumVisits++) + { + case 0: + NPCPhrase (GENERAL_INFO_HOSTILE_1); + break; + case 1: + NPCPhrase (GENERAL_INFO_HOSTILE_2); + break; + case 2: + NPCPhrase (GENERAL_INFO_HOSTILE_3); + break; + case 3: + NPCPhrase (GENERAL_INFO_HOSTILE_4); + --NumVisits; + break; + } + SET_GAME_STATE (VUX_INFO, NumVisits); + + DISABLE_PHRASE (whats_up_hostile); + } + + switch (GET_GAME_STATE (VUX_STACK_1)) + { + case 0: + Response (why_so_mean, NormalVux); + break; + case 1: + Response (deeper_reason, NormalVux); + break; + case 2: + Response (if_we_apologize, NormalVux); + break; + case 3: + Response (try_any_way, CombatIsInevitable); + break; + case 4: + Response (apology_1, CombatIsInevitable); + break; + case 5: + Response (apology_2, CombatIsInevitable); + break; + case 6: + Response (apology_3, CombatIsInevitable); + break; + case 7: + Response (apology_4, CombatIsInevitable); + break; + case 8: + Response (apology_5, CombatIsInevitable); + break; + case 9: + Response (apology_6, CombatIsInevitable); + break; + case 10: + Response (apology_7, CombatIsInevitable); + break; + case 11: + Response (apology_8, CombatIsInevitable); + break; + case 12: + Response (apology_9, CombatIsInevitable); + break; + case 13: + Response (apology_10, CombatIsInevitable); + break; + } + + switch (GET_GAME_STATE (VUX_STACK_2)) + { + case 0: + Response (kill_you_squids_1, CombatIsInevitable); + break; + case 1: + Response (kill_you_squids_2, CombatIsInevitable); + break; + case 2: + Response (kill_you_squids_3, CombatIsInevitable); + break; + case 3: + Response (kill_you_squids_4, CombatIsInevitable); + break; + } + + if (PHRASE_ENABLED (whats_up_hostile)) + { + Response (whats_up_hostile, NormalVux); + } + + if (GET_GAME_STATE (VUX_STACK_1) > 13) + { + switch (GET_GAME_STATE (VUX_STACK_3)) + { + case 0: + Response (cant_we_be_friends_1, CombatIsInevitable); + break; + case 1: + Response (cant_we_be_friends_2, CombatIsInevitable); + break; + case 2: + Response (cant_we_be_friends_3, CombatIsInevitable); + break; + case 3: + Response (cant_we_be_friends_4, CombatIsInevitable); + break; + } + } + + Response (bye_hostile_space, CombatIsInevitable); +} + +static void +Intro (void) +{ + if (LOBYTE (GLOBAL (CurrentActivity)) == WON_LAST_BATTLE) + { + NPCPhrase (OUT_TAKES); + + setSegue (Segue_peace); + return; + } + + if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 6)) + { + Menagerie ((RESPONSE_REF)0); + } + else + { + BYTE NumVisits; + + if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 7)) + { + NumVisits = GET_GAME_STATE (VUX_HOME_VISITS); + switch (NumVisits++) + { + case 0: + NPCPhrase (HOMEWORLD_HELLO_1); + break; + case 1: + NPCPhrase (HOMEWORLD_HELLO_2); + break; + case 2: + NPCPhrase (HOMEWORLD_HELLO_3); + break; + case 3: + NPCPhrase (HOMEWORLD_HELLO_4); + --NumVisits; + break; + } + SET_GAME_STATE (VUX_HOME_VISITS, NumVisits); + } + else + { + NumVisits = GET_GAME_STATE (VUX_VISITS); + switch (NumVisits++) + { + case 0: + NPCPhrase (SPACE_HELLO_1); + break; + case 1: + NPCPhrase (SPACE_HELLO_2); + break; + case 2: + NPCPhrase (SPACE_HELLO_3); + break; + case 3: + NPCPhrase (SPACE_HELLO_4); + --NumVisits; + break; + } + SET_GAME_STATE (VUX_VISITS, NumVisits); + } + + NormalVux ((RESPONSE_REF)0); + } +} + +static COUNT +uninit_vux (void) +{ + return (0); +} + +static void +post_vux_enc (void) +{ + // nothing defined so far +} + +LOCDATA* +init_vux_comm (void) +{ + LOCDATA *retval; + + vux_desc.init_encounter_func = Intro; + vux_desc.post_encounter_func = post_vux_enc; + vux_desc.uninit_encounter_func = uninit_vux; + + vux_desc.AlienTextBaseline.x = TEXT_X_OFFS + (SIS_TEXT_WIDTH >> 1) + + (SIS_TEXT_WIDTH >> 2); + vux_desc.AlienTextBaseline.y = 0; + vux_desc.AlienTextWidth = (SIS_TEXT_WIDTH - 16) >> 1; + + if ((GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 6)) + || LOBYTE (GLOBAL (CurrentActivity)) == WON_LAST_BATTLE) + { + setSegue (Segue_peace); + } + else + { + setSegue (Segue_hostile); + } + retval = &vux_desc; + + return (retval); +} |