summaryrefslogtreecommitdiff
path: root/src/uqm/comm/druuge/druugec.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/uqm/comm/druuge/druugec.c')
-rw-r--r--src/uqm/comm/druuge/druugec.c926
1 files changed, 926 insertions, 0 deletions
diff --git a/src/uqm/comm/druuge/druugec.c b/src/uqm/comm/druuge/druugec.c
new file mode 100644
index 0000000..9a082c1
--- /dev/null
+++ b/src/uqm/comm/druuge/druugec.c
@@ -0,0 +1,926 @@
+//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/build.h"
+#include "uqm/setup.h"
+#include "uqm/sis.h"
+ // for DeltaSISGauges()
+
+
+static LOCDATA druuge_desc =
+{
+ NULL, /* init_encounter_func */
+ NULL, /* post_encounter_func */
+ NULL, /* uninit_encounter_func */
+ DRUUGE_PMAP_ANIM, /* AlienFrame */
+ DRUUGE_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 */
+ DRUUGE_COLOR_MAP, /* AlienColorMap */
+ DRUUGE_MUSIC, /* AlienSong */
+ NULL_RESOURCE, /* AlienAltSong */
+ 0, /* AlienSongFlags */
+ DRUUGE_CONVERSATION_PHRASES, /* PlayerPhrases */
+ 11, /* NumAnimations */
+ { /* AlienAmbientArray (ambient animations) */
+ {
+ 5, /* StartIndex */
+ 4, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND * 3 / 40, 0, /* FrameRate */
+ ONE_SECOND * 3 / 40, 0, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 9, /* StartIndex */
+ 4, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND * 3 / 40, 0, /* FrameRate */
+ ONE_SECOND * 3 / 40, 0, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 13, /* StartIndex */
+ 6, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND * 3 / 40, 0, /* FrameRate */
+ ONE_SECOND * 3 / 40, 0, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 19, /* StartIndex */
+ 3, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND / 20, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 22, /* StartIndex */
+ 3, /* NumFrames */
+ RANDOM_ANIM, /* AnimFlags */
+ ONE_SECOND / 12, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 25, /* StartIndex */
+ 3, /* NumFrames */
+ RANDOM_ANIM, /* AnimFlags */
+ ONE_SECOND / 12, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 28, /* StartIndex */
+ 3, /* NumFrames */
+ RANDOM_ANIM, /* AnimFlags */
+ ONE_SECOND / 12, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 31, /* StartIndex */
+ 2, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND / 12, 0, /* FrameRate */
+ ONE_SECOND, ONE_SECOND * 3, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 33, /* StartIndex */
+ 7, /* NumFrames */
+ CIRCULAR_ANIM | WAIT_TALKING, /* AnimFlags */
+ ONE_SECOND / 12, 0, /* FrameRate */
+ ONE_SECOND * 7, ONE_SECOND * 3,/* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 40, /* StartIndex */
+ 4, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND * 3 / 10, 0, /* FrameRate */
+ ONE_SECOND * 3 / 10, 0, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ {
+ 44, /* StartIndex */
+ 4, /* NumFrames */
+ CIRCULAR_ANIM, /* AnimFlags */
+ ONE_SECOND / 5, 0, /* FrameRate */
+ ONE_SECOND / 5, 0, /* RestartRate */
+ 0, /* 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 / 15, ONE_SECOND / 15, /* FrameRate */
+ ONE_SECOND / 12, ONE_SECOND / 12, /* RestartRate */
+ 0, /* BlockMask */
+ },
+ NULL, /* AlienNumberSpeech - none */
+ /* Filler for loaded resources */
+ NULL, NULL, NULL,
+ NULL,
+ NULL,
+};
+
+static COUNT SlaveryCount = 0;
+static BOOLEAN AttemptedSalvage = FALSE;
+
+static void
+ExitConversation (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, bye))
+ {
+ setSegue (Segue_peace);
+
+ if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 7))
+ {
+ if (SlaveryCount)
+ {
+ UWORD PreviousSlaves;
+
+ PreviousSlaves = MAKE_WORD (
+ GET_GAME_STATE (CREW_SOLD_TO_DRUUGE0),
+ GET_GAME_STATE (CREW_SOLD_TO_DRUUGE1)
+ );
+ SlaveryCount += PreviousSlaves;
+ if (SlaveryCount > 250 && PreviousSlaves <= 250)
+ {
+ if (PreviousSlaves > 100)
+ GLOBAL (CrewCost) += (22 - 7);
+ else
+ GLOBAL (CrewCost) += 22;
+ }
+ else if (SlaveryCount > 100 && PreviousSlaves <= 100)
+ GLOBAL (CrewCost) += 7;
+
+ SET_GAME_STATE (CREW_SOLD_TO_DRUUGE0, LOBYTE (SlaveryCount));
+ SET_GAME_STATE (CREW_SOLD_TO_DRUUGE1, HIBYTE (SlaveryCount));
+ }
+
+ switch (GET_GAME_STATE (DRUUGE_HOME_VISITS))
+ {
+ case 1:
+ NPCPhrase (BYE_FROM_TRADE_WORLD_1);
+ break;
+ default:
+ NPCPhrase (BYE_FROM_TRADE_WORLD_2);
+ break;
+ }
+ }
+ else if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 6))
+ NPCPhrase (GOODBYE_FROM_BOMB_PLANET);
+ else
+ NPCPhrase (GOODBYE_FROM_SPACE);
+ }
+ else /* if (R == then_we_take_bomb) */
+ {
+ setSegue (Segue_hostile);
+
+ NPCPhrase (FIGHT_FOR_BOMB);
+ }
+}
+
+static void TradeWorld (RESPONSE_REF R);
+
+static void
+Buy (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, want_to_buy)
+ || PLAYER_SAID (R, im_ready_to_buy))
+ {
+ NPCPhrase (READY_TO_SELL);
+ if (!GET_GAME_STATE (ROSY_SPHERE))
+ NPCPhrase (HAVE_SPHERE);
+ if (!GET_GAME_STATE (ARTIFACT_2_ON_SHIP))
+ NPCPhrase (HAVE_ART_1);
+ if (!GET_GAME_STATE (ARTIFACT_3_ON_SHIP))
+ NPCPhrase (HAVE_ART_2);
+ NPCPhrase (SHIPS_AND_FUEL);
+
+ SET_GAME_STATE (KNOW_DRUUGE_SLAVERS, 3);
+ }
+ else if (PLAYER_SAID (R, buy_druuge_ship))
+ {
+#define SHIP_CREW_COST 100
+ if (GLOBAL_SIS (CrewEnlisted) < SHIP_CREW_COST)
+ NPCPhrase (NOT_ENOUGH_CREW);
+ else if (EscortFeasibilityStudy (DRUUGE_SHIP) == 0)
+ NPCPhrase (NOT_ENOUGH_ROOM);
+ else
+ {
+ DeltaSISGauges (-SHIP_CREW_COST, 0, 0);
+ SlaveryCount += SHIP_CREW_COST;
+ AddEscortShips (DRUUGE_SHIP, 1);
+
+ NPCPhrase (BOUGHT_SHIP);
+ }
+ }
+#define ARTIFACT_CREW_COST 100
+ else if (PLAYER_SAID (R, buy_rosy_sphere))
+ {
+ if (GLOBAL_SIS (CrewEnlisted) < ARTIFACT_CREW_COST)
+ NPCPhrase (NOT_ENOUGH_CREW);
+ else
+ {
+ DeltaSISGauges (-ARTIFACT_CREW_COST, 0, 0);
+ SlaveryCount += ARTIFACT_CREW_COST;
+ SET_GAME_STATE (ROSY_SPHERE_ON_SHIP, 1);
+ SET_GAME_STATE (ROSY_SPHERE, 1);
+
+ NPCPhrase (BOUGHT_SPHERE);
+ }
+ }
+ else if (PLAYER_SAID (R, buy_art_1))
+ {
+ if (GLOBAL_SIS (CrewEnlisted) < ARTIFACT_CREW_COST)
+ NPCPhrase (NOT_ENOUGH_CREW);
+ else
+ {
+ DeltaSISGauges (-ARTIFACT_CREW_COST, 0, 0);
+ SlaveryCount += ARTIFACT_CREW_COST;
+ SET_GAME_STATE (ARTIFACT_2_ON_SHIP, 1);
+
+ NPCPhrase (BOUGHT_ART_1);
+ }
+ }
+ else if (PLAYER_SAID (R, buy_art_2))
+ {
+ if (GLOBAL_SIS (CrewEnlisted) < ARTIFACT_CREW_COST)
+ NPCPhrase (NOT_ENOUGH_CREW);
+ else
+ {
+ DeltaSISGauges (-ARTIFACT_CREW_COST, 0, 0);
+ SlaveryCount += ARTIFACT_CREW_COST;
+ SET_GAME_STATE (ARTIFACT_3_ON_SHIP, 1);
+
+ NPCPhrase (BOUGHT_ART_2);
+ }
+ }
+ else if (PLAYER_SAID (R, buy_fuel))
+ {
+#define FUEL_CREW_COST 10
+ if (GLOBAL_SIS (CrewEnlisted) < FUEL_CREW_COST)
+ NPCPhrase (NOT_ENOUGH_CREW);
+ else
+ {
+ DeltaSISGauges (-FUEL_CREW_COST,
+ FUEL_CREW_COST * FUEL_TANK_SCALE, 0);
+ SlaveryCount += FUEL_CREW_COST;
+
+ NPCPhrase (BOUGHT_FUEL);
+ }
+ }
+
+ Response (buy_druuge_ship, Buy);
+ if (!GET_GAME_STATE (ROSY_SPHERE))
+ Response (buy_rosy_sphere, Buy);
+ if (!GET_GAME_STATE (ARTIFACT_2_ON_SHIP))
+ Response (buy_art_1, Buy);
+ if (!GET_GAME_STATE (ARTIFACT_3_ON_SHIP))
+ Response (buy_art_2, Buy);
+ Response (buy_fuel, Buy);
+ Response (done_buying, TradeWorld);
+}
+
+static void Sell (RESPONSE_REF R);
+
+static RESPONSE_REF LastResponse = 0;
+
+static void
+Trade (RESPONSE_REF R)
+{
+ if (!PLAYER_SAID (R, whats_the_sphere_again))
+ {
+ NPCPhrase (TRADE_FOR_SPHERE);
+ LastResponse = R;
+ }
+ else
+ {
+ NPCPhrase (SPHERE_IS);
+
+ DISABLE_PHRASE (whats_the_sphere_again);
+ }
+
+ Response (no_way, Sell);
+ Response (way, Sell);
+ if (PHRASE_ENABLED (whats_the_sphere_again))
+ {
+ Response (whats_the_sphere_again, Trade);
+ }
+}
+
+static void
+DoTransaction (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, sell_maidens))
+ {
+ SET_GAME_STATE (MAIDENS_ON_SHIP, 0);
+ }
+ else if (PLAYER_SAID (R, sell_fragments))
+ {
+ BYTE num_frags;
+
+ if (GET_GAME_STATE (EGG_CASE0_ON_SHIP))
+ {
+ SET_GAME_STATE (EGG_CASE0_ON_SHIP, 0);
+ }
+ else if (GET_GAME_STATE (EGG_CASE1_ON_SHIP))
+ {
+ SET_GAME_STATE (EGG_CASE1_ON_SHIP, 0);
+ }
+ else if (GET_GAME_STATE (EGG_CASE2_ON_SHIP))
+ {
+ SET_GAME_STATE (EGG_CASE2_ON_SHIP, 0);
+ }
+
+ num_frags = GET_GAME_STATE (FRAGMENTS_BOUGHT) + 1;
+ SET_GAME_STATE (FRAGMENTS_BOUGHT, num_frags);
+ }
+ else if (PLAYER_SAID (R, sell_caster))
+ {
+ SET_GAME_STATE (BURV_BROADCASTERS_ON_SHIP, 0);
+ }
+ else if (PLAYER_SAID (R, sell_spawner))
+ {
+ SET_GAME_STATE (PORTAL_SPAWNER_ON_SHIP, 0);
+ }
+
+ if (!GET_GAME_STATE (ROSY_SPHERE)
+ && GET_GAME_STATE (ROSY_SPHERE_ON_SHIP))
+ {
+ SET_GAME_STATE (ROSY_SPHERE, 1);
+ }
+ else
+ {
+ BYTE trade_gas;
+ BYTE ship_slots, ships_to_trade;
+
+ trade_gas = 0;
+ ships_to_trade = 0;
+ ship_slots = EscortFeasibilityStudy (DRUUGE_SHIP);
+ if (PLAYER_SAID (R, sell_maidens))
+ {
+ NPCPhrase (BOUGHT_MAIDENS);
+ ships_to_trade = 6;
+ }
+ else if (PLAYER_SAID (R, sell_fragments))
+ {
+ NPCPhrase (BOUGHT_FRAGMENTS);
+ ships_to_trade = 1;
+ }
+ else if (PLAYER_SAID (R, sell_caster))
+ {
+ NPCPhrase (BOUGHT_CASTER);
+ ships_to_trade = 0;
+ trade_gas = 1;
+ }
+ else if (PLAYER_SAID (R, sell_spawner))
+ {
+ NPCPhrase (BOUGHT_SPAWNER);
+ ships_to_trade = 3;
+ trade_gas = 1;
+ }
+
+ NPCPhrase (YOU_GET);
+ if (ships_to_trade)
+ {
+ AddEscortShips (DRUUGE_SHIP, ships_to_trade);
+
+ if (ship_slots >= ships_to_trade)
+ NPCPhrase (DEAL_FOR_STATED_SHIPS);
+ else if (ship_slots == 0)
+ NPCPhrase (DEAL_FOR_NO_SHIPS);
+ else
+ NPCPhrase (DEAL_FOR_LESS_SHIPS);
+
+ if (trade_gas)
+ NPCPhrase (YOU_ALSO_GET);
+ }
+
+ if (trade_gas)
+ {
+ BYTE slot;
+ COUNT f;
+ DWORD capacity;
+
+ capacity = FUEL_RESERVE;
+ slot = NUM_MODULE_SLOTS - 1;
+ do
+ {
+ if (GLOBAL_SIS (ModuleSlots[slot]) == FUEL_TANK
+ || GLOBAL_SIS (ModuleSlots[slot]) == HIGHEFF_FUELSYS)
+ {
+ COUNT volume;
+
+ volume = GLOBAL_SIS (ModuleSlots[slot]) == FUEL_TANK
+ ? FUEL_TANK_CAPACITY : HEFUEL_TANK_CAPACITY;
+ capacity += volume;
+ }
+ } while (slot--);
+ capacity -= GLOBAL_SIS (FuelOnBoard);
+ f = (COUNT)((capacity + (FUEL_TANK_SCALE >> 1)) / FUEL_TANK_SCALE);
+
+ while (capacity > 0x3FFFL)
+ {
+ DeltaSISGauges (0, 0x3FFF, 0);
+ capacity -= 0x3FFF;
+ }
+ DeltaSISGauges (0, (SIZE)capacity, 0);
+
+ NPCPhrase (FUEL0);
+ NPCNumber (f, NULL);
+ NPCPhrase (FUEL1);
+
+ if (f >= 250)
+ NPCPhrase (HIDEOUS_DEAL);
+ else if (f >= 100)
+ NPCPhrase (BAD_DEAL);
+ else if (f >= 50)
+ NPCPhrase (FAIR_DEAL);
+ else if (f >= 10)
+ NPCPhrase (GOOD_DEAL);
+ else
+ NPCPhrase (FINE_DEAL);
+ }
+ }
+}
+
+static void
+Sell (RESPONSE_REF R)
+{
+ RESPONSE_FUNC RespFunc;
+
+ if (PLAYER_SAID (R, want_to_sell))
+ NPCPhrase (READY_TO_BUY);
+ else if (PLAYER_SAID (R, no_way)
+ || PLAYER_SAID (R, way))
+ {
+ if (PLAYER_SAID (R, no_way))
+ NPCPhrase (OK_REGULAR_DEAL);
+ else
+ {
+ NPCPhrase (OK_HERES_SPHERE);
+
+ SET_GAME_STATE (ROSY_SPHERE_ON_SHIP, 1);
+ }
+
+ DoTransaction (LastResponse);
+ }
+ else if (PLAYER_SAID (R, sell_maidens)
+ || PLAYER_SAID (R, sell_fragments)
+ || PLAYER_SAID (R, sell_caster)
+ || PLAYER_SAID (R, sell_spawner))
+ {
+ DoTransaction (R);
+ }
+
+ if (!GET_GAME_STATE (ROSY_SPHERE))
+ RespFunc = (RESPONSE_FUNC)Trade;
+ else
+ RespFunc = (RESPONSE_FUNC)Sell;
+ if (GET_GAME_STATE (MAIDENS_ON_SHIP))
+ Response (sell_maidens, RespFunc);
+ if ((GET_GAME_STATE (EGG_CASE0_ON_SHIP)
+ || GET_GAME_STATE (EGG_CASE1_ON_SHIP)
+ || GET_GAME_STATE (EGG_CASE2_ON_SHIP))
+ && GET_GAME_STATE (FRAGMENTS_BOUGHT) < 2)
+ Response (sell_fragments, RespFunc);
+ if (GET_GAME_STATE (BURV_BROADCASTERS_ON_SHIP))
+ Response (sell_caster, RespFunc);
+ if (GET_GAME_STATE (PORTAL_SPAWNER_ON_SHIP))
+ Response (sell_spawner, RespFunc);
+ Response (done_selling, TradeWorld);
+}
+
+static void
+ExplainSlaveTrade (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, want_to_buy))
+ NPCPhrase (WE_SELL_FOR_CREW);
+ else if (PLAYER_SAID (R, isnt_this_slave_trading))
+ {
+ NPCPhrase (NO_SLAVE_TRADE);
+
+ SET_GAME_STATE (KNOW_DRUUGE_SLAVERS, 1);
+ }
+ else if (PLAYER_SAID (R, what_do_with_crew))
+ {
+ NPCPhrase (HAVE_FUN);
+
+ SET_GAME_STATE (KNOW_DRUUGE_SLAVERS, 2);
+ }
+
+ switch (GET_GAME_STATE (KNOW_DRUUGE_SLAVERS))
+ {
+ case 0:
+ Response (isnt_this_slave_trading, ExplainSlaveTrade);
+ break;
+ case 1:
+ Response (what_do_with_crew, ExplainSlaveTrade);
+ break;
+ }
+ Response (i_will_never_trade_crew, TradeWorld);
+ Response (im_ready_to_buy, Buy);
+}
+
+static void
+TradeWorld (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, whats_up_at_trade_world))
+ {
+ BYTE NumVisits;
+
+ NumVisits = GET_GAME_STATE (DRUUGE_HOME_INFO);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (GEN_INFO_AT_TRADE_WORLD_1);
+ break;
+ case 1:
+ NPCPhrase (GEN_INFO_AT_TRADE_WORLD_2);
+ break;
+ case 2:
+ NPCPhrase (GEN_INFO_AT_TRADE_WORLD_3);
+ if (GET_GAME_STATE (KNOW_ABOUT_SHATTERED) < 2)
+ {
+ SET_GAME_STATE (KNOW_ABOUT_SHATTERED, 2);
+ }
+ break;
+ case 3:
+ NPCPhrase (GEN_INFO_AT_TRADE_WORLD_4);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (DRUUGE_HOME_INFO, NumVisits);
+ DISABLE_PHRASE (whats_up_at_trade_world);
+ }
+ else if (PLAYER_SAID (R, done_selling))
+ NPCPhrase (OK_DONE_SELLING);
+ else if (PLAYER_SAID (R, done_buying))
+ NPCPhrase (OK_DONE_BUYING);
+ else if (PLAYER_SAID (R, i_will_never_trade_crew))
+ NPCPhrase (YOUR_LOSS);
+
+ if (PHRASE_ENABLED (whats_up_at_trade_world))
+ {
+ Response (whats_up_at_trade_world, TradeWorld);
+ }
+ Response (want_to_sell, Sell);
+ if (GET_GAME_STATE (KNOW_DRUUGE_SLAVERS) == 3)
+ Response (want_to_buy, Buy);
+ else
+ Response (want_to_buy, ExplainSlaveTrade);
+ Response (bye, ExitConversation);
+}
+
+static void
+BombAmbush (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, whats_up_at_bomb_planet))
+ {
+ NPCPhrase (GEN_INFO_AT_BOMB_PLANET);
+ SET_GAME_STATE (BOMB_VISITS, 2);
+ }
+ else if (PLAYER_SAID (R, we_get_bomb))
+ {
+ NPCPhrase (NOT_GET_BOMB);
+ SET_GAME_STATE (BOMB_VISITS, 3);
+ }
+
+ switch (GET_GAME_STATE (BOMB_VISITS))
+ {
+ case 1:
+ Response (whats_up_at_bomb_planet, BombAmbush);
+ break;
+ case 2:
+ Response (we_get_bomb, BombAmbush);
+ break;
+ default:
+ Response (then_we_take_bomb, ExitConversation);
+ break;
+ }
+ Response (bye, ExitConversation);
+}
+
+static void
+Space (RESPONSE_REF R)
+{
+ if (PLAYER_SAID (R, whats_up_in_space))
+ {
+ BYTE NumVisits;
+
+ NumVisits = GET_GAME_STATE (DRUUGE_SPACE_INFO);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (GENERAL_INFO_IN_SPACE_1);
+ break;
+ case 1:
+ NPCPhrase (GENERAL_INFO_IN_SPACE_2);
+ break;
+ case 2:
+ NPCPhrase (GENERAL_INFO_IN_SPACE_3);
+ break;
+ case 3:
+ NPCPhrase (GENERAL_INFO_IN_SPACE_4);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (DRUUGE_SPACE_INFO, NumVisits);
+
+ DISABLE_PHRASE (whats_up_in_space);
+ }
+
+ if (PHRASE_ENABLED (whats_up_in_space))
+ {
+ Response (whats_up_in_space, Space);
+ }
+ Response (bye, ExitConversation);
+}
+
+static void
+Intro (void)
+{
+ BYTE NumVisits;
+
+ if (LOBYTE (GLOBAL (CurrentActivity)) == WON_LAST_BATTLE)
+ {
+ NPCPhrase (OUT_TAKES);
+
+ setSegue (Segue_peace);
+ return;
+ }
+
+ if (GET_GAME_STATE (DRUUGE_MANNER))
+ {
+ if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 7))
+ {
+ NumVisits = GET_GAME_STATE (DRUUGE_HOME_VISITS);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (HSTL_TRADE_WORLD_HELLO_1);
+ break;
+ case 1:
+ NPCPhrase (HSTL_TRADE_WORLD_HELLO_2);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (DRUUGE_HOME_VISITS, NumVisits);
+ }
+ else
+ {
+ NumVisits = GET_GAME_STATE (DRUUGE_VISITS);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (HOSTILE_SPACE_HELLO_1);
+ break;
+ case 1:
+ NPCPhrase (HOSTILE_SPACE_HELLO_2);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (DRUUGE_VISITS, NumVisits);
+ }
+
+ setSegue (Segue_hostile);
+ }
+ else if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 7))
+ {
+ {
+ NumVisits = GET_GAME_STATE (DRUUGE_HOME_VISITS);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (INITIAL_TRADE_WORLD_HELLO);
+ break;
+ case 1:
+ NPCPhrase (SSQ_TRADE_WORLD_HELLO_1);
+ break;
+ case 2:
+ NPCPhrase (SSQ_TRADE_WORLD_HELLO_2);
+ break;
+ case 3:
+ NPCPhrase (SSQ_TRADE_WORLD_HELLO_3);
+ break;
+ case 4:
+ NPCPhrase (SSQ_TRADE_WORLD_HELLO_4);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (DRUUGE_HOME_VISITS, NumVisits);
+ }
+ if (GET_GAME_STATE (ATTACKED_DRUUGE)
+ && !GET_GAME_STATE (DRUUGE_DISCLAIMER))
+ {
+ // There is no HOSTILE_TRADE voice track that we know of
+ // so this is currently disabled
+ //NPCPhrase (HOSTILE_TRADE);
+ SET_GAME_STATE (DRUUGE_DISCLAIMER, 1);
+ }
+ if (GET_GAME_STATE (MAIDENS_ON_SHIP)
+ && !GET_GAME_STATE (SCANNED_MAIDENS))
+ {
+ NPCPhrase (SCAN_MAIDENS);
+ SET_GAME_STATE (SCANNED_MAIDENS, 1);
+ }
+ if ((GET_GAME_STATE (EGG_CASE0_ON_SHIP)
+ || GET_GAME_STATE (EGG_CASE1_ON_SHIP)
+ || GET_GAME_STATE (EGG_CASE2_ON_SHIP))
+ && !GET_GAME_STATE (SCANNED_FRAGMENTS))
+ {
+ if (GET_GAME_STATE (FRAGMENTS_BOUGHT) < 2)
+ NPCPhrase (SCAN_FRAGMENTS);
+ else
+ NPCPhrase (ENOUGH_FRAGMENTS);
+ SET_GAME_STATE (SCANNED_FRAGMENTS, 1);
+ }
+ if (GET_GAME_STATE (BURV_BROADCASTERS_ON_SHIP)
+ && !GET_GAME_STATE (SCANNED_CASTER))
+ {
+ NPCPhrase (SCAN_DRUUGE_CASTER);
+ SET_GAME_STATE (SCANNED_CASTER, 1);
+ }
+ if (GET_GAME_STATE (PORTAL_SPAWNER_ON_SHIP)
+ && !GET_GAME_STATE (SCANNED_SPAWNER))
+ {
+ NPCPhrase (SCAN_ARILOU_SPAWNER);
+ SET_GAME_STATE (SCANNED_SPAWNER, 1);
+ }
+
+ TradeWorld ((RESPONSE_REF)0);
+ }
+ else if (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 6))
+ {
+ if (GET_GAME_STATE (BOMB_VISITS))
+ NPCPhrase (SUBSEQ_BOMB_WORLD_HELLO);
+ else
+ {
+ NPCPhrase (INIT_BOMB_WORLD_HELLO);
+ SET_GAME_STATE (BOMB_VISITS, 1);
+ }
+
+ BombAmbush ((RESPONSE_REF)0);
+ }
+ else if (GET_GAME_STATE (ATTACKED_DRUUGE))
+ {
+ NumVisits = GET_GAME_STATE (DRUUGE_VISITS);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (HOSTILE_SPACE_HELLO_1);
+ break;
+ case 1:
+ NPCPhrase (HOSTILE_SPACE_HELLO_2);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (DRUUGE_VISITS, NumVisits);
+
+ setSegue (Segue_hostile);
+ }
+ else
+ {
+ NumVisits = 0;
+ if (GetHeadLink (&GLOBAL (built_ship_q)) == 0)
+ {
+ for (NumVisits = 0; NumVisits < NUM_MODULE_SLOTS; ++NumVisits)
+ {
+ BYTE which_module;
+
+ which_module = GLOBAL_SIS (ModuleSlots[NumVisits]);
+ if (which_module >= GUN_WEAPON
+ && which_module <= CANNON_WEAPON)
+ {
+ NumVisits = 0;
+ break;
+ }
+ }
+ }
+
+ if (NumVisits)
+ {
+ NumVisits = GET_GAME_STATE (DRUUGE_SALVAGE);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (SALVAGE_YOUR_SHIP_1);
+ break;
+ case 1:
+ NPCPhrase (SALVAGE_YOUR_SHIP_2);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (DRUUGE_SALVAGE, NumVisits);
+
+ setSegue (Segue_hostile);
+ AttemptedSalvage = TRUE;
+ }
+ else
+ {
+ NumVisits = GET_GAME_STATE (DRUUGE_VISITS);
+ switch (NumVisits++)
+ {
+ case 0:
+ NPCPhrase (INIT_SPACE_HELLO);
+ break;
+ case 1:
+ NPCPhrase (SUBSEQUENT_SPACE_HELLO);
+ --NumVisits;
+ break;
+ }
+ SET_GAME_STATE (DRUUGE_VISITS, NumVisits);
+
+ Space ((RESPONSE_REF)0);
+ }
+ }
+}
+
+static COUNT
+uninit_druuge (void)
+{
+ return (0);
+}
+
+static void
+post_druuge_enc (void)
+{
+ if (getSegue () == Segue_hostile
+ && !AttemptedSalvage
+ && !GET_GAME_STATE (DRUUGE_MANNER))
+ {
+ if (!GET_GAME_STATE (ATTACKED_DRUUGE))
+ {
+ SET_GAME_STATE (ATTACKED_DRUUGE, 1);
+ SET_GAME_STATE (DRUUGE_VISITS, 0);
+ }
+ }
+}
+
+LOCDATA*
+init_druuge_comm (void)
+{
+ LOCDATA *retval;
+
+ SlaveryCount = 0;
+ AttemptedSalvage = FALSE;
+
+ druuge_desc.init_encounter_func = Intro;
+ druuge_desc.post_encounter_func = post_druuge_enc;
+ druuge_desc.uninit_encounter_func = uninit_druuge;
+
+ druuge_desc.AlienTextBaseline.x = TEXT_X_OFFS + (SIS_TEXT_WIDTH >> 1);
+ druuge_desc.AlienTextBaseline.y = 70;
+ druuge_desc.AlienTextWidth = SIS_TEXT_WIDTH - 16;
+
+ if ((GET_GAME_STATE (DRUUGE_MANNER) == 0
+ && (GET_GAME_STATE (GLOBAL_FLAGS_AND_DATA) & (1 << 7)))
+ || LOBYTE (GLOBAL (CurrentActivity)) == WON_LAST_BATTLE)
+ {
+ setSegue (Segue_peace);
+ }
+ else
+ {
+ setSegue (Segue_hostile);
+ }
+ retval = &druuge_desc;
+
+ return (retval);
+}