diff options
Diffstat (limited to 'src/uqm/comm/rebel/rebel.c')
-rw-r--r-- | src/uqm/comm/rebel/rebel.c | 449 |
1 files changed, 449 insertions, 0 deletions
diff --git a/src/uqm/comm/rebel/rebel.c b/src/uqm/comm/rebel/rebel.c new file mode 100644 index 0000000..6366f20 --- /dev/null +++ b/src/uqm/comm/rebel/rebel.c @@ -0,0 +1,449 @@ +//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 "../yehat/resinst.h" +#include "strings.h" + +#include "uqm/build.h" + + +static LOCDATA yehat_desc = +{ + NULL, /* init_encounter_func */ + NULL, /* post_encounter_func */ + NULL, /* uninit_encounter_func */ + YEHAT_PMAP_ANIM, /* AlienFrame */ + YEHAT_FONT, /* AlienFont */ + WHITE_COLOR_INIT, /* AlienTextFColor */ + BLACK_COLOR_INIT, /* AlienTextBColor */ + {0, 0}, /* AlienTextBaseline */ + 0, /* (SIS_TEXT_WIDTH - 16) * 2 / 3, */ /* AlienTextWidth */ + ALIGN_CENTER, /* AlienTextAlign */ + VALIGN_MIDDLE, /* AlienTextValign */ + YEHAT_COLOR_MAP, /* AlienColorMap */ + YEHAT_MUSIC, /* AlienSong */ + NULL_RESOURCE, /* AlienAltSong */ + 0, /* AlienSongFlags */ + REBEL_CONVERSATION_PHRASES, /* PlayerPhrases */ + 15, /* NumAnimations */ + { /* AlienAmbientArray (ambient animations) */ + { /* right hand-wing tapping keyboard; front guy */ + 4, /* StartIndex */ + 3, /* NumFrames */ + YOYO_ANIM + | WAIT_TALKING, /* AnimFlags */ + ONE_SECOND / 10, ONE_SECOND / 10, /* FrameRate */ + ONE_SECOND, ONE_SECOND * 3, /* RestartRate */ + (1 << 6) | (1 << 7), + }, + { /* left hand-wing tapping keyboard; front guy */ + 7, /* StartIndex */ + 3, /* NumFrames */ + YOYO_ANIM + | WAIT_TALKING, /* AnimFlags */ + ONE_SECOND / 10, ONE_SECOND / 10, /* FrameRate */ + ONE_SECOND, ONE_SECOND * 3, /* RestartRate */ + (1 << 6) | (1 << 7), + }, + { + 10, /* StartIndex */ + 3, /* NumFrames */ + YOYO_ANIM, /* AnimFlags */ + ONE_SECOND / 20, 0, /* FrameRate */ + ONE_SECOND, ONE_SECOND * 3, /* RestartRate */ + (1 << 4) | (1 << 14), + }, + { + 13, /* StartIndex */ + 3, /* NumFrames */ + YOYO_ANIM, /* AnimFlags */ + ONE_SECOND / 20, 0, /* FrameRate */ + ONE_SECOND, ONE_SECOND * 3, /* RestartRate */ + (1 << 5), + }, + { + 16, /* StartIndex */ + 5, /* NumFrames */ + YOYO_ANIM, /* AnimFlags */ + ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */ + ONE_SECOND * 10, ONE_SECOND * 3,/* RestartRate */ + (1 << 2) | (1 << 14), + }, + { + 21, /* StartIndex */ + 5, /* NumFrames */ + YOYO_ANIM, /* AnimFlags */ + ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */ + ONE_SECOND * 10, ONE_SECOND * 3,/* RestartRate */ + (1 << 3), + }, + { /* right arm-wing rising; front guy */ + 26, /* StartIndex */ + 2, /* NumFrames */ + YOYO_ANIM + | WAIT_TALKING, /* AnimFlags */ + ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */ + ONE_SECOND * 10, ONE_SECOND * 3,/* RestartRate */ + (1 << 0) | (1 << 1), + }, + { /* left arm-wing rising; front guy */ + 28, /* StartIndex */ + 2, /* NumFrames */ + YOYO_ANIM + | WAIT_TALKING, /* AnimFlags */ + ONE_SECOND / 15, ONE_SECOND / 15, /* FrameRate */ + ONE_SECOND * 10, ONE_SECOND * 3,/* RestartRate */ + (1 << 0) | (1 << 1), + }, + { + 30, /* StartIndex */ + 3, /* NumFrames */ + YOYO_ANIM, /* AnimFlags */ + ONE_SECOND / 30, ONE_SECOND / 30, /* FrameRate */ + ONE_SECOND / 30, ONE_SECOND / 30, /* RestartRate */ + 0, /* BlockMask */ + }, + { + 33, /* StartIndex */ + 3, /* NumFrames */ + YOYO_ANIM, /* AnimFlags */ + ONE_SECOND / 30, ONE_SECOND / 30, /* FrameRate */ + ONE_SECOND / 30, ONE_SECOND / 30, /* RestartRate */ + 0, /* BlockMask */ + }, + { + 36, /* StartIndex */ + 3, /* NumFrames */ + YOYO_ANIM, /* AnimFlags */ + ONE_SECOND / 30, ONE_SECOND / 30, /* FrameRate */ + ONE_SECOND / 30, ONE_SECOND / 30, /* RestartRate */ + 0, /* BlockMask */ + }, + { + 39, /* StartIndex */ + 3, /* NumFrames */ + YOYO_ANIM, /* AnimFlags */ + ONE_SECOND / 30, ONE_SECOND / 30, /* FrameRate */ + ONE_SECOND / 30, ONE_SECOND / 30, /* RestartRate */ + 0, /* BlockMask */ + }, + { + 42, /* StartIndex */ + 3, /* NumFrames */ + YOYO_ANIM, /* AnimFlags */ + ONE_SECOND / 30, ONE_SECOND / 30, /* FrameRate */ + ONE_SECOND / 30, ONE_SECOND / 30, /* RestartRate */ + 0, /* BlockMask */ + }, + { + 45, /* StartIndex */ + 3, /* NumFrames */ + YOYO_ANIM, /* AnimFlags */ + ONE_SECOND / 30, ONE_SECOND / 30, /* FrameRate */ + ONE_SECOND / 30, ONE_SECOND / 30, /* RestartRate */ + 0, /* BlockMask */ + }, + { + 48, /* StartIndex */ + 4, /* NumFrames */ + YOYO_ANIM + | WAIT_TALKING, /* AnimFlags */ + ONE_SECOND / 30, 0, /* FrameRate */ + ONE_SECOND, ONE_SECOND * 3, /* RestartRate */ + (1 << 2) | (1 << 4), + }, + }, + { /* AlienTransitionDesc - empty */ + 0, /* StartIndex */ + 0, /* NumFrames */ + 0, /* AnimFlags */ + 0, 0, /* FrameRate */ + 0, 0, /* RestartRate */ + 0, /* BlockMask */ + }, + { /* AlienTalkDesc */ + 1, /* StartIndex */ + 3, /* 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 +PrepareShip (void) +{ + BYTE mi, di, yi; + + mi = (GLOBAL (GameClock.month_index) % 12) + 1; + SET_GAME_STATE (YEHAT_SHIP_MONTH, mi); + if ((di = GLOBAL (GameClock.day_index)) > 28) + di = 28; + SET_GAME_STATE (YEHAT_SHIP_DAY, di); + yi = (BYTE)(GLOBAL (GameClock.year_index) - START_YEAR); + if (mi == 1) + ++yi; + SET_GAME_STATE (YEHAT_SHIP_YEAR, yi); +} + +static void +ExitConversation (RESPONSE_REF R) +{ + if (PLAYER_SAID (R, bye_rebel)) + NPCPhrase (GOODBYE_REBEL); +} + +static void Rebels (RESPONSE_REF R); + +static void +RebelInfo (RESPONSE_REF R) +{ + BYTE InfoLeft; + + InfoLeft = FALSE; + if (PLAYER_SAID (R, give_info_rebels)) + NPCPhrase (WHAT_INFO); + else if (PLAYER_SAID (R, what_about_urquan)) + { + NPCPhrase (ABOUT_URQUAN); + + DISABLE_PHRASE (what_about_urquan); + } + else if (PLAYER_SAID (R, what_about_royalty)) + { + NPCPhrase (ABOUT_ROYALTY); + + DISABLE_PHRASE (what_about_royalty); + } + else if (PLAYER_SAID (R, what_about_war)) + { + NPCPhrase (ABOUT_WAR); + + DISABLE_PHRASE (what_about_war); + } + else if (PLAYER_SAID (R, what_about_vux)) + { + NPCPhrase (ABOUT_VUX); + + DISABLE_PHRASE (what_about_vux); + } + else if (PLAYER_SAID (R, what_about_clue)) + { + NPCPhrase (ABOUT_CLUE); + + DISABLE_PHRASE (what_about_clue); + } + + if (PHRASE_ENABLED (what_about_urquan)) + { + Response (what_about_urquan, RebelInfo); + InfoLeft = TRUE; + } + if (PHRASE_ENABLED (what_about_royalty)) + { + Response (what_about_royalty, RebelInfo); + InfoLeft = TRUE; + } + if (PHRASE_ENABLED (what_about_war)) + { + Response (what_about_war, RebelInfo); + InfoLeft = TRUE; + } + if (PHRASE_ENABLED (what_about_vux)) + { + Response (what_about_vux, RebelInfo); + InfoLeft = TRUE; + } + if (PHRASE_ENABLED (what_about_clue)) + { + Response (what_about_clue, RebelInfo); + InfoLeft = TRUE; + } + Response (enough_info, Rebels); + + if (!InfoLeft) + { + DISABLE_PHRASE (give_info_rebels); + } +} + +static void +Rebels (RESPONSE_REF R) +{ + SBYTE NumVisits; + + if (PLAYER_SAID (R, how_goes_revolution)) + { + NumVisits = GET_GAME_STATE (YEHAT_REBEL_INFO); + switch (NumVisits++) + { + case 0: + NPCPhrase (REBEL_REVOLUTION_1); + break; + case 1: + NPCPhrase (REBEL_REVOLUTION_2); + break; + case 2: + NPCPhrase (REBEL_REVOLUTION_3); + break; + case 3: + NPCPhrase (REBEL_REVOLUTION_4); + --NumVisits; + break; + } + SET_GAME_STATE (YEHAT_REBEL_INFO, NumVisits); + + DISABLE_PHRASE (how_goes_revolution); + } + else if (PLAYER_SAID (R, any_ships)) + { + if (GET_GAME_STATE (YEHAT_SHIP_MONTH) + && ((NumVisits = (GLOBAL (GameClock.year_index) - START_YEAR) - GET_GAME_STATE (YEHAT_SHIP_YEAR)) < 0 + || ((NumVisits == 0 && (NumVisits = GLOBAL (GameClock.month_index) - GET_GAME_STATE (YEHAT_SHIP_MONTH)) < 0) + || (NumVisits == 0 && GLOBAL (GameClock.day_index) < GET_GAME_STATE (YEHAT_SHIP_DAY))))) + NPCPhrase (NO_SHIPS_YET); + else if ((NumVisits = EscortFeasibilityStudy (YEHAT_SHIP)) == 0) + NPCPhrase (NO_ROOM); + else + { +#define NUM_YEHAT_SHIPS 4 + if (NumVisits < NUM_YEHAT_SHIPS) + NPCPhrase (HAVE_FEW_SHIPS); + else + { + NumVisits = NUM_YEHAT_SHIPS; + NPCPhrase (HAVE_ALL_SHIPS); + } + + AlienTalkSegue ((COUNT)~0); + AddEscortShips (YEHAT_SHIP, NumVisits); + PrepareShip (); + } + + DISABLE_PHRASE (any_ships); + } + else if (PLAYER_SAID (R, what_about_pkunk_rebel)) + { + if (GET_GAME_STATE (YEHAT_ABSORBED_PKUNK)) + NPCPhrase (PKUNK_ABSORBED_REBEL); + else + NPCPhrase (HATE_PKUNK_REBEL); + + SET_GAME_STATE (YEHAT_REBEL_TOLD_PKUNK, 1); + } + else if (PLAYER_SAID (R, enough_info)) + NPCPhrase (OK_ENOUGH_INFO); + + if (PHRASE_ENABLED (how_goes_revolution)) + Response (how_goes_revolution, Rebels); + if (!GET_GAME_STATE (YEHAT_REBEL_TOLD_PKUNK) + && GET_GAME_STATE (PKUNK_VISITS) + && GET_GAME_STATE (PKUNK_HOME_VISITS)) + Response (what_about_pkunk_rebel, Rebels); + if (PHRASE_ENABLED (any_ships)) + Response (any_ships, Rebels); + if (PHRASE_ENABLED (give_info_rebels)) + { + Response (give_info_rebels, RebelInfo); + } + Response (bye_rebel, ExitConversation); +} + +static void +Intro (void) +{ + BYTE NumVisits; + + setSegue (Segue_peace); + if (LOBYTE (GLOBAL (CurrentActivity)) == IN_LAST_BATTLE) + { + NPCPhrase (YEHAT_CAVALRY); + AlienTalkSegue ((COUNT)~0); + + NumVisits = (BYTE) EscortFeasibilityStudy (YEHAT_REBEL_SHIP); + if (NumVisits > 8) + NumVisits = 8; + AddEscortShips (YEHAT_REBEL_SHIP, NumVisits - (NumVisits >> 1)); + AddEscortShips (PKUNK_SHIP, NumVisits >> 1); + } + else + { + NumVisits = GET_GAME_STATE (YEHAT_REBEL_VISITS); + switch (NumVisits++) + { + case 0: + NPCPhrase (REBEL_HELLO_1); + break; + case 1: + NPCPhrase (REBEL_HELLO_2); + break; + case 2: + NPCPhrase (REBEL_HELLO_3); + break; + case 3: + NPCPhrase (REBEL_HELLO_4); + --NumVisits; + break; + } + SET_GAME_STATE (YEHAT_REBEL_VISITS, NumVisits); + + Rebels ((RESPONSE_REF)0); + } +} + +static COUNT +uninit_yehat (void) +{ + return (0); +} + +static void +post_yehat_enc (void) +{ + // nothing defined so far +} + +LOCDATA* +init_rebel_yehat_comm (void) +{ + LOCDATA *retval; + + yehat_desc.init_encounter_func = Intro; + yehat_desc.post_encounter_func = post_yehat_enc; + yehat_desc.uninit_encounter_func = uninit_yehat; + + yehat_desc.AlienTextBaseline.x = SIS_SCREEN_WIDTH * 2 / 3; + yehat_desc.AlienTextBaseline.y = 60; + yehat_desc.AlienTextWidth = (SIS_TEXT_WIDTH - 16) * 2 / 3; + + // use alternate "Rebels" track if available + yehat_desc.AlienAltSongRes = REBEL_MUSIC; + yehat_desc.AlienSongFlags |= LDASF_USE_ALTERNATE; + + setSegue (Segue_peace); + retval = &yehat_desc; + + return (retval); +} |