static bool GenerateColony_initNpcs (SOLARSYS_STATE *solarSys) { HIPGROUP hGroup; GLOBAL (BattleGroupRef) = GET_GAME_STATE_32 (COLONY_GRPOFFS0); if (GLOBAL (BattleGroupRef) == 0) { CloneShipFragment (URQUAN_SHIP, &GLOBAL (npc_built_ship_q), 0); GLOBAL (BattleGroupRef) = PutGroupInfo (GROUPS_ADD_NEW, 1); ReinitQueue (&GLOBAL (npc_built_ship_q)); SET_GAME_STATE_32 (COLONY_GRPOFFS0, GLOBAL (BattleGroupRef)); } GenerateDefault_initNpcs (solarSys); if (GLOBAL (BattleGroupRef) && (hGroup = GetHeadLink (&GLOBAL (ip_group_q)))) { IP_GROUP *GroupPtr; GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup); GroupPtr->task = IN_ORBIT; GroupPtr->sys_loc = 0 + 1; /* orbitting colony */ GroupPtr->dest_loc = 0 + 1; /* orbitting colony */ GroupPtr->loc.x = 0; GroupPtr->loc.y = 0; GroupPtr->group_counter = 0; UnlockIpGroup (&GLOBAL (ip_group_q), hGroup); } return true; }
LOCDATA* init_urquan_comm (void) { LOCDATA *retval; DWORD GrpOffs; urquan_desc.init_encounter_func = Intro; urquan_desc.post_encounter_func = post_urquan_enc; urquan_desc.uninit_encounter_func = uninit_urquan; urquan_desc.AlienTextBaseline.x = TEXT_X_OFFS + (SIS_TEXT_WIDTH >> 1); urquan_desc.AlienTextBaseline.y = 0; urquan_desc.AlienTextWidth = SIS_TEXT_WIDTH - 16; GrpOffs = GET_GAME_STATE_32 (URQUAN_PROBE_GRPOFFS0); if (GET_GAME_STATE (PLAYER_HYPNOTIZED) || LOBYTE (GLOBAL (CurrentActivity)) == WON_LAST_BATTLE || (LOBYTE (GLOBAL (CurrentActivity)) == IN_INTERPLANETARY && GLOBAL (BattleGroupRef) && GLOBAL (BattleGroupRef) == GrpOffs)) { SET_GAME_STATE (BATTLE_SEGUE, 0); } else { SET_GAME_STATE (BATTLE_SEGUE, 1); } retval = &urquan_desc; return (retval); }
static void Intro (void) { DWORD GrpOffs; if (LOBYTE (GLOBAL (CurrentActivity)) == WON_LAST_BATTLE) { NPCPhrase (OUT_TAKES); SET_GAME_STATE (BATTLE_SEGUE, 0); return; } if (GET_GAME_STATE (KOHR_AH_KILLED_ALL)) { NPCPhrase (GAME_OVER_DUDE); SET_GAME_STATE (BATTLE_SEGUE, 0); return; } if (!GET_GAME_STATE (KOHR_AH_SENSES_EVIL) && GET_GAME_STATE (TALKING_PET_ON_SHIP)) { NPCPhrase (SENSE_EVIL); SET_GAME_STATE (KOHR_AH_SENSES_EVIL, 1); } GrpOffs = GET_GAME_STATE_32 (SAMATRA_GRPOFFS0); if (LOBYTE (GLOBAL (CurrentActivity)) == IN_INTERPLANETARY && GLOBAL (BattleGroupRef) && GLOBAL (BattleGroupRef) == GrpOffs) { NPCPhrase (HELLO_SAMATRA); SET_GAME_STATE (AWARE_OF_SAMATRA, 1); SET_GAME_STATE (BATTLE_SEGUE, 1); } else { BYTE NumVisits; NumVisits = GET_GAME_STATE (KOHR_AH_VISITS); if (GET_GAME_STATE (KOHR_AH_FRENZY)) { switch (NumVisits++) { case 0: NPCPhrase (WE_KILL_ALL_1); break; case 1: NPCPhrase (WE_KILL_ALL_2); break; case 2: NPCPhrase (WE_KILL_ALL_3); break; case 3: NPCPhrase (WE_KILL_ALL_4); --NumVisits; break; } Frenzy ((RESPONSE_REF)0); } else { switch (NumVisits++) { case 0: NPCPhrase (HELLO_AND_DIE_1); break; case 1: NPCPhrase (HELLO_AND_DIE_2); break; case 2: NPCPhrase (HELLO_AND_DIE_3); break; case 3: NPCPhrase (HELLO_AND_DIE_4); --NumVisits; break; } DieHuman ((RESPONSE_REF)0); } SET_GAME_STATE (KOHR_AH_VISITS, NumVisits); } }
static void Intro (void) { DWORD GrpOffs; if (LOBYTE (GLOBAL (CurrentActivity)) == WON_LAST_BATTLE) { NPCPhrase (OUT_TAKES); SET_GAME_STATE (BATTLE_SEGUE, 0); return; } GrpOffs = GET_GAME_STATE_32 (URQUAN_PROBE_GRPOFFS0); if (LOBYTE (GLOBAL (CurrentActivity)) == IN_INTERPLANETARY && GLOBAL (BattleGroupRef) && GLOBAL (BattleGroupRef) == GrpOffs) { NPCPhrase (SEND_MESSAGE); SET_GAME_STATE (PROBE_MESSAGE_DELIVERED, 1); } else if (GET_GAME_STATE (PLAYER_HYPNOTIZED)) { SetCommIntroMode (CIM_FADE_IN_SCREEN, ONE_SECOND * 5); UrquanHypno ((RESPONSE_REF)0); } else { BYTE NumVisits; if (!GET_GAME_STATE (URQUAN_SENSES_EVIL) && GET_GAME_STATE (TALKING_PET_ON_SHIP)) { NPCPhrase (SENSE_EVIL); SET_GAME_STATE (URQUAN_SENSES_EVIL, 1); } GrpOffs = GET_GAME_STATE_32 (COLONY_GRPOFFS0); if (LOBYTE (GLOBAL (CurrentActivity)) == IN_INTERPLANETARY && GLOBAL (BattleGroupRef) && GLOBAL (BattleGroupRef) == GrpOffs) { NPCPhrase (CAUGHT_YA); SET_GAME_STATE (BATTLE_SEGUE, 1); return; } GrpOffs = GET_GAME_STATE_32 (SAMATRA_GRPOFFS0); if (LOBYTE (GLOBAL (CurrentActivity)) == IN_INTERPLANETARY && GLOBAL (BattleGroupRef) && GLOBAL (BattleGroupRef) == GrpOffs) { NPCPhrase (HELLO_SAMATRA); SET_GAME_STATE (AWARE_OF_SAMATRA, 1); SET_GAME_STATE (BATTLE_SEGUE, 1); } else { NumVisits = GET_GAME_STATE (URQUAN_VISITS); if (!GET_GAME_STATE (KOHR_AH_FRENZY)) { switch (NumVisits++) { case 0: NPCPhrase (INIT_HELLO); break; case 1: NPCPhrase (SUBSEQUENT_HELLO_1); break; case 2: NPCPhrase (SUBSEQUENT_HELLO_2); break; case 3: NPCPhrase (SUBSEQUENT_HELLO_3); break; case 4: NPCPhrase (SUBSEQUENT_HELLO_4); --NumVisits; break; } NormalUrquan ((RESPONSE_REF)0); } else { switch (NumVisits++) { case 0: NPCPhrase (INIT_FLEE_HUMAN); LoserUrquan ((RESPONSE_REF)0); break; case 1: NPCPhrase (SUBSEQUENT_FLEE_HUMAN); SET_GAME_STATE (BATTLE_SEGUE, 0); --NumVisits; break; } } SET_GAME_STATE (URQUAN_VISITS, NumVisits); } } }
static void BuildUrquanGuard (SOLARSYS_STATE *solarSys) { BYTE ship1, ship2; BYTE b0, b1; POINT org; HIPGROUP hGroup, hNextGroup; GLOBAL (BattleGroupRef) = GET_GAME_STATE_32 (SAMATRA_GRPOFFS0); if (!GET_GAME_STATE (KOHR_AH_FRENZY)) { ship1 = URQUAN_SHIP; ship2 = BLACK_URQUAN_SHIP; } else { ship1 = BLACK_URQUAN_SHIP; ship2 = URQUAN_SHIP; } assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0); for (b0 = 0; b0 < MAX_SHIPS_PER_SIDE; ++b0) CloneShipFragment (ship1, &GLOBAL (npc_built_ship_q), 0); if (GLOBAL (BattleGroupRef) == 0) { GLOBAL (BattleGroupRef) = PutGroupInfo (GROUPS_ADD_NEW, 1); SET_GAME_STATE_32 (SAMATRA_GRPOFFS0, GLOBAL (BattleGroupRef)); } #define NUM_URQUAN_GUARDS0 12 for (b0 = 1; b0 <= NUM_URQUAN_GUARDS0; ++b0) PutGroupInfo (GLOBAL (BattleGroupRef), b0); ReinitQueue (&GLOBAL (npc_built_ship_q)); for (b0 = 0; b0 < MAX_SHIPS_PER_SIDE; ++b0) CloneShipFragment (ship2, &GLOBAL (npc_built_ship_q), 0); #define NUM_URQUAN_GUARDS1 4 for (b0 = 1; b0 <= NUM_URQUAN_GUARDS1; ++b0) PutGroupInfo (GLOBAL (BattleGroupRef), (BYTE)(NUM_URQUAN_GUARDS0 + b0)); ReinitQueue (&GLOBAL (npc_built_ship_q)); GetGroupInfo (GLOBAL (BattleGroupRef), GROUP_INIT_IP); org = planetOuterLocation (4); hGroup = GetHeadLink (&GLOBAL (ip_group_q)); for (b0 = 0, b1 = 0; b0 < NUM_URQUAN_GUARDS0; ++b0, b1 += FULL_CIRCLE / (NUM_URQUAN_GUARDS0 + NUM_URQUAN_GUARDS1)) { IP_GROUP *GroupPtr; if (b1 % (FULL_CIRCLE / NUM_URQUAN_GUARDS1) == 0) b1 += FULL_CIRCLE / (NUM_URQUAN_GUARDS0 + NUM_URQUAN_GUARDS1); GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup); hNextGroup = _GetSuccLink (GroupPtr); GroupPtr->task = ON_STATION | IGNORE_FLAGSHIP; GroupPtr->sys_loc = 0; GroupPtr->dest_loc = 4 + 1; GroupPtr->orbit_pos = NORMALIZE_FACING (ANGLE_TO_FACING (b1)); GroupPtr->group_counter = 0; GroupPtr->loc.x = org.x + COSINE (b1, STATION_RADIUS); GroupPtr->loc.y = org.y + SINE (b1, STATION_RADIUS); UnlockIpGroup (&GLOBAL (ip_group_q), hGroup); hGroup = hNextGroup; } for (b0 = 0, b1 = 0; b0 < NUM_URQUAN_GUARDS1; ++b0, b1 += FULL_CIRCLE / NUM_URQUAN_GUARDS1) { IP_GROUP *GroupPtr; GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup); hNextGroup = _GetSuccLink (GroupPtr); GroupPtr->task = ON_STATION | IGNORE_FLAGSHIP; GroupPtr->sys_loc = 0; GroupPtr->dest_loc = 4 + 1; GroupPtr->orbit_pos = NORMALIZE_FACING (ANGLE_TO_FACING (b1)); GroupPtr->group_counter = 0; GroupPtr->loc.x = org.x + COSINE (b1, STATION_RADIUS); GroupPtr->loc.y = org.y + SINE (b1, STATION_RADIUS); UnlockIpGroup (&GLOBAL (ip_group_q), hGroup); hGroup = hNextGroup; } (void) solarSys; }