From 79fcbff236dd4cf4e252982ca7af3afb74f0f052 Mon Sep 17 00:00:00 2001 From: avolkov Date: Mon, 2 Nov 2009 05:23:06 +0000 Subject: [PATCH] Cleanup of IP display code: GOOD_GUY/BAD_GUY removed; several bugs removed (some previously fixed); special-case hack code moved where it belongs; some comments git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@3271 8092fc87-c524-0410-9efc-e669fe64eaf9 --- sc2/src/uqm/encount.h | 3 + sc2/src/uqm/ipdisp.c | 211 +++++++++++++++------------------ sc2/src/uqm/ipdisp.h | 4 + sc2/src/uqm/planets/gendru.c | 2 +- sc2/src/uqm/planets/genilw.c | 2 +- sc2/src/uqm/planets/genmyc.c | 2 +- sc2/src/uqm/planets/genorz.c | 2 +- sc2/src/uqm/planets/genpet.c | 2 +- sc2/src/uqm/planets/genpku.c | 2 +- sc2/src/uqm/planets/gensam.c | 2 + sc2/src/uqm/planets/genshof.c | 25 ++-- sc2/src/uqm/planets/gensol.c | 30 +++++ sc2/src/uqm/planets/genspa.c | 2 +- sc2/src/uqm/planets/gensup.c | 2 +- sc2/src/uqm/planets/genthrad.c | 2 +- sc2/src/uqm/planets/genutw.c | 2 +- sc2/src/uqm/planets/genvux.c | 2 +- sc2/src/uqm/planets/genyeh.c | 2 +- sc2/src/uqm/planets/genzoq.c | 29 +++-- sc2/src/uqm/planets/solarsys.c | 42 +++++++ 20 files changed, 222 insertions(+), 148 deletions(-) diff --git a/sc2/src/uqm/encount.h b/sc2/src/uqm/encount.h index f9255d674..5b40bf4eb 100644 --- a/sc2/src/uqm/encount.h +++ b/sc2/src/uqm/encount.h @@ -178,6 +178,9 @@ extern void GenerateSupox (BYTE control); extern void GenerateRainbow (BYTE control); extern void GenerateIlwrath (BYTE control); +// Last race the player battled with, or -1 if no battle took place. +// Set to -1 by some funcs to inhibit IP groups from intercepting +// the flagship. extern SIZE EncounterRace; extern BYTE EncounterGroup; diff --git a/sc2/src/uqm/ipdisp.c b/sc2/src/uqm/ipdisp.c index d4a573d7e..9b8698599 100644 --- a/sc2/src/uqm/ipdisp.c +++ b/sc2/src/uqm/ipdisp.c @@ -33,6 +33,8 @@ NotifyOthers (COUNT which_race, BYTE target_loc) { HSHIPFRAG hGroup, hNextGroup; + // NOTE: "Others" includes the group causing the notification too. + for (hGroup = GetHeadLink (&GLOBAL (ip_group_q)); hGroup; hGroup = hNextGroup) { @@ -41,44 +43,52 @@ NotifyOthers (COUNT which_race, BYTE target_loc) GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup); hNextGroup = _GetSuccLink (GroupPtr); - if (GroupPtr->race_id == which_race) + if (GroupPtr->race_id != which_race) { - BYTE task; + UnlockIpGroup (&GLOBAL (ip_group_q), hGroup); + continue; + } - task = GroupPtr->task | IGNORE_FLAGSHIP; - - if (target_loc == 0) - { - task &= ~IGNORE_FLAGSHIP; - // XXX: orbit_pos is abused here to store the previous + if (target_loc == IPNL_INTERCEPT_PLAYER) + { + GroupPtr->task &= ~IGNORE_FLAGSHIP; + // XXX: orbit_pos is abused here to store the previous + // group destination, before the intercept task. + // Returned to dest_loc below. + GroupPtr->orbit_pos = GroupPtr->dest_loc; + GroupPtr->dest_loc = IPNL_INTERCEPT_PLAYER; + } + else if (target_loc == IPNL_ALL_CLEAR) + { + GroupPtr->task |= IGNORE_FLAGSHIP; + + if (GroupPtr->dest_loc == IPNL_INTERCEPT_PLAYER) + { // The group was intercepting, so send it back where it came + // XXX: orbit_pos was abused to store the previous // group destination, before the intercept task. - // Returned to dest_loc below. - GroupPtr->orbit_pos = GroupPtr->dest_loc; -/* task = FLEE | IGNORE_FLAGSHIP; */ - } - else if ((target_loc = GroupPtr->dest_loc) == 0) - { - // XXX: orbit_pos is abused to store the previous - // group destination, before the intercept task. - target_loc = GroupPtr->orbit_pos; + GroupPtr->dest_loc = GroupPtr->orbit_pos; GroupPtr->orbit_pos = NORMALIZE_FACING (TFB_Random ()); #ifdef OLD - target_loc = (BYTE)(( - (COUNT)TFB_Random () + GroupPtr->dest_loc = (BYTE)(((COUNT)TFB_Random () % pSolarSysState->SunDesc[0].NumPlanets) + 1); #endif /* OLD */ - if (!(task & REFORM_GROUP)) - { - if ((task & ~IGNORE_FLAGSHIP) != EXPLORE) - GroupPtr->group_counter = 0; - else - GroupPtr->group_counter = - ((COUNT) TFB_Random () % MAX_REVOLUTIONS) - << FACING_SHIFT; - } } + // If the group wasn't intercepting, it will just continue + // going about its business. - GroupPtr->task = task; + if (!(GroupPtr->task & REFORM_GROUP)) + { + if ((GroupPtr->task & ~IGNORE_FLAGSHIP) != EXPLORE) + GroupPtr->group_counter = 0; + else + GroupPtr->group_counter = ((COUNT) TFB_Random () + % MAX_REVOLUTIONS) << FACING_SHIFT; + } + } + else + { // Send the group to the location. + // XXX: There is currently no use of such notify that I know of. + GroupPtr->task |= IGNORE_FLAGSHIP; GroupPtr->dest_loc = target_loc; } @@ -99,14 +109,11 @@ ip_group_preprocess (ELEMENT *ElementPtr) IP_GROUP *GroupPtr; EPtr = ElementPtr; - EPtr->state_flags &= - ~(DISAPPEARING | NONSOLID); /* "I'm not quite dead." */ - ++EPtr->life_span; /* so that it will 'die' - * again next time. - */ + EPtr->state_flags &= ~(DISAPPEARING | NONSOLID); // "I'm not quite dead" + ++EPtr->life_span; // so that it will 'die' again next time + GetElementStarShip (EPtr, &GroupPtr); - group_loc = GroupPtr->sys_loc; - /* save old location */ + group_loc = GroupPtr->sys_loc; // save old location DisplayArray[EPtr->PrimIndex].Object.Point = GroupPtr->loc; if (group_loc != 0) @@ -140,7 +147,7 @@ ip_group_preprocess (ELEMENT *ElementPtr) goto ExitIPProcess; if ((task & REFORM_GROUP) && --GroupPtr->group_counter == 0) - { + { // Finished reforming the group task &= ~REFORM_GROUP; GroupPtr->task = task; if ((task & ~IGNORE_FLAGSHIP) != EXPLORE) @@ -150,26 +157,17 @@ ip_group_preprocess (ELEMENT *ElementPtr) % MAX_REVOLUTIONS) << FACING_SHIFT; } - if (!(task & REFORM_GROUP)) - { - if ((task & ~(IGNORE_FLAGSHIP | REFORM_GROUP)) != FLEE) - { - if (EPtr->state_flags & BAD_GUY) - EPtr->state_flags &= ~GOOD_GUY; - else - EPtr->state_flags |= BAD_GUY; - } - else if (!(task & IGNORE_FLAGSHIP) - && !(EPtr->state_flags & (GOOD_GUY | BAD_GUY))) - { // fleeing yehat ship collisions after menu fix - EPtr->state_flags |= BAD_GUY; - } + // If fleeing *and* ignoring flagship + if ((task & ~(IGNORE_FLAGSHIP | REFORM_GROUP)) == FLEE + && (task & IGNORE_FLAGSHIP)) + { // Make fleeing groups non-collidable + EPtr->state_flags |= NONSOLID; } target_loc = GroupPtr->dest_loc; if (!(task & (IGNORE_FLAGSHIP | REFORM_GROUP))) { - if (target_loc == 0 && task != FLEE) + if (target_loc == IPNL_INTERCEPT_PLAYER && task != FLEE) { /* if intercepting flagship */ target_loc = flagship_loc; @@ -198,9 +196,10 @@ ip_group_preprocess (ELEMENT *ElementPtr) EPtr->thrust_wait = 0; ZeroVelocityComponents (&EPtr->velocity); - NotifyOthers (GroupPtr->race_id, 0); + NotifyOthers (GroupPtr->race_id, IPNL_INTERCEPT_PLAYER); task = GroupPtr->task; - if ((target_loc = GroupPtr->dest_loc) == 0) + target_loc = GroupPtr->dest_loc; + if (target_loc == IPNL_INTERCEPT_PLAYER) target_loc = flagship_loc; } } @@ -209,10 +208,10 @@ ip_group_preprocess (ELEMENT *ElementPtr) GetCurrentVelocityComponents (&EPtr->velocity, &vdx, &vdy); task &= ~IGNORE_FLAGSHIP; - if (task <= ON_STATION) #ifdef NEVER - if (task <= FLEE || (task == ON_STATION - && GroupPtr->dest_loc == 0)) + if (task <= FLEE || (task == ON_STATION && GroupPtr->dest_loc == 0)) +#else + if (task <= ON_STATION) #endif /* NEVER */ { BOOLEAN Transition; @@ -226,12 +225,14 @@ ip_group_preprocess (ELEMENT *ElementPtr) dest_pt.x = GroupPtr->loc.x << 1; dest_pt.y = GroupPtr->loc.y << 1; } - else if (((task != ON_STATION || GroupPtr->dest_loc == 0) + else if (((task != ON_STATION || + GroupPtr->dest_loc == IPNL_INTERCEPT_PLAYER) && group_loc == target_loc) - || (task == ON_STATION && GroupPtr->dest_loc + || (task == ON_STATION && + GroupPtr->dest_loc != IPNL_INTERCEPT_PLAYER && group_loc == 0)) { - if (GroupPtr->dest_loc == 0) + if (GroupPtr->dest_loc == IPNL_INTERCEPT_PLAYER) dest_pt = GLOBAL (ip_location); else { @@ -312,7 +313,8 @@ ip_group_preprocess (ELEMENT *ElementPtr) { SIZE speed; - if (EPtr->thrust_wait && GroupPtr->dest_loc != 0) + if (EPtr->thrust_wait && + GroupPtr->dest_loc != IPNL_INTERCEPT_PLAYER) { #define ORBIT_SPEED 60 speed = ORBIT_SPEED; @@ -476,6 +478,8 @@ ExitIPProcess: + (COORD)(LOG_SPACE_HEIGHT >> 1) - (LOG_SPACE_HEIGHT >> (MAX_REDUCTION + 1)); + // Don't draw the group if it's not at flagship location, + // or flash the group while it's reforming if (group_loc != flagship_loc || ((task & REFORM_GROUP) && (GroupPtr->group_counter & 1))) @@ -497,15 +501,16 @@ static void flag_ship_collision (ELEMENT *ElementPtr0, POINT *pPt0, ELEMENT *ElementPtr1, POINT *pPt1) { - if ((GLOBAL (CurrentActivity) & START_ENCOUNTER) - || pSolarSysState->MenuState.CurState - || (ElementPtr1->state_flags & GOOD_GUY)) - return; + if (GLOBAL (CurrentActivity) & START_ENCOUNTER) + return; // ignore the rest of the collisions - if (!(ElementPtr1->state_flags & COLLISION)) /* not processed yet */ + if (!(ElementPtr1->state_flags & COLLISION)) + { // The other element's collision has not been processed yet + // Defer starting the encounter until it is. ElementPtr0->state_flags |= COLLISION | NONSOLID; + } else - { + { // Both element's collisions have now been processed ElementPtr1->state_flags &= ~COLLISION; GLOBAL (CurrentActivity) |= START_ENCOUNTER; } @@ -518,52 +523,49 @@ ip_group_collision (ELEMENT *ElementPtr0, POINT *pPt0, ELEMENT *ElementPtr1, POINT *pPt1) { IP_GROUP *GroupPtr; + void *OtherPtr; - if ((GLOBAL (CurrentActivity) & START_ENCOUNTER) - || pSolarSysState->MenuState.CurState - || (ElementPtr0->state_flags & GOOD_GUY)) - { - ElementPtr0->state_flags &= ~BAD_GUY; - return; - } + if (GLOBAL (CurrentActivity) & START_ENCOUNTER) + return; // ignore the rest of the collisions GetElementStarShip (ElementPtr0, &GroupPtr); - if (ElementPtr0->state_flags & ElementPtr1->state_flags & BAD_GUY) - { + GetElementStarShip (ElementPtr1, &OtherPtr); + if (OtherPtr) + { // Collision with another group + // Prevent the groups from coalescing into a single ship icon if ((ElementPtr0->state_flags & COLLISION) || (ElementPtr1->current.location.x == ElementPtr1->next.location.x && ElementPtr1->current.location.y == ElementPtr1->next.location.y)) + { ElementPtr0->state_flags &= ~COLLISION; + } else { ElementPtr1->state_flags |= COLLISION; - GroupPtr->loc = - DisplayArray[ElementPtr0->PrimIndex].Object.Point; + GroupPtr->loc = DisplayArray[ElementPtr0->PrimIndex].Object.Point; ElementPtr0->next.location = ElementPtr0->current.location; InitIntersectEndPoint (ElementPtr0); } } - else - { + else // if (!OtherPtr) + { // Collision with a flagship EncounterGroup = GroupPtr->group_id; - if (GroupPtr->race_id == URQUAN_DRONE_SHIP) - { - GroupPtr->task = FLEE | IGNORE_FLAGSHIP; - GroupPtr->dest_loc = 0; - } - else - { - GroupPtr->task |= REFORM_GROUP; - GroupPtr->group_counter = 100; - NotifyOthers (GroupPtr->race_id, (BYTE)~0); - } + GroupPtr->task |= REFORM_GROUP; + GroupPtr->group_counter = 100; + // Send "all clear" for the time being. After the encounter, if + // the player battles the group, the "intercept" notify will be + // resent. + NotifyOthers (GroupPtr->race_id, IPNL_ALL_CLEAR); - if (!(ElementPtr1->state_flags & COLLISION)) /* not processed yet */ + if (!(ElementPtr1->state_flags & COLLISION)) + { // The other element's collision has not been processed yet + // Defer starting the encounter until it is. ElementPtr0->state_flags |= COLLISION | NONSOLID; + } else - { + { // Both element's collisions have now been processed ElementPtr1->state_flags &= ~COLLISION; GLOBAL (CurrentActivity) |= START_ENCOUNTER; } @@ -580,7 +582,6 @@ spawn_ip_group (IP_GROUP *GroupPtr) hIPSHIPElement = AllocElement (); if (hIPSHIPElement) { - BYTE task; ELEMENT *IPSHIPElementPtr; LockElement (hIPSHIPElement, &IPSHIPElementPtr); @@ -591,21 +592,6 @@ spawn_ip_group (IP_GROUP *GroupPtr) IPSHIPElementPtr->state_flags = CHANGING | FINITE_LIFE | IGNORE_VELOCITY; - task = GroupPtr->task; - if (!(task & IGNORE_FLAGSHIP)) - IPSHIPElementPtr->state_flags |= BAD_GUY; - else - { - IPSHIPElementPtr->state_flags |= GOOD_GUY; - // XXX: Hack: Yehat revolution start, fleeing groups - if (GroupPtr->race_id == YEHAT_SHIP - && GET_GAME_STATE (YEHAT_CIVIL_WAR)) - { - GroupPtr->task = FLEE | (task & REFORM_GROUP); - GroupPtr->dest_loc = 0; - } - } - SetPrimType (&DisplayArray[IPSHIPElementPtr->PrimIndex], STAMP_PRIM); // XXX: Hack: farray points to FRAME[3] and given FRAME IPSHIPElementPtr->current.image.farray = &GroupPtr->melee_icon; @@ -790,8 +776,7 @@ spawn_flag_ship (void) FlagShipElementPtr->sys_loc = (BYTE)(pSolarSysState->pBaseDesc->pPrevDesc - pSolarSysState->PlanetDesc + 2); - FlagShipElementPtr->state_flags = - APPEARING | GOOD_GUY | IGNORE_VELOCITY; + FlagShipElementPtr->state_flags = APPEARING | IGNORE_VELOCITY; if (GET_GAME_STATE (ESCAPE_COUNTER)) FlagShipElementPtr->state_flags |= NONSOLID; FlagShipElementPtr->life_span = NORMAL_LIFE; @@ -827,8 +812,8 @@ DoMissions (void) spawn_flag_ship (); if (EncounterRace >= 0) - { - NotifyOthers (EncounterRace, 0); + { // There was a battle. Call in reinforcements. + NotifyOthers (EncounterRace, IPNL_INTERCEPT_PLAYER); EncounterRace = -1; } diff --git a/sc2/src/uqm/ipdisp.h b/sc2/src/uqm/ipdisp.h index 85c3d3ae4..1321e2fa6 100644 --- a/sc2/src/uqm/ipdisp.h +++ b/sc2/src/uqm/ipdisp.h @@ -20,6 +20,10 @@ #include "libs/compiler.h" extern void NotifyOthers (COUNT which_race, BYTE target_loc); +// Special target locations for NotifyOthers() +#define IPNL_INTERCEPT_PLAYER 0 +#define IPNL_ALL_CLEAR ((BYTE)-1) + extern void DoMissions (void); #endif /* UQM_IPDISP_H_INCL_ */ diff --git a/sc2/src/uqm/planets/gendru.c b/sc2/src/uqm/planets/gendru.c index 1862f610b..a93db7fdd 100644 --- a/sc2/src/uqm/planets/gendru.c +++ b/sc2/src/uqm/planets/gendru.c @@ -111,7 +111,7 @@ GenerateDruuge (BYTE control) { if (ActivateStarShip (DRUUGE_SHIP, SPHERE_TRACKING)) { - NotifyOthers (DRUUGE_SHIP, (BYTE)~0); + NotifyOthers (DRUUGE_SHIP, IPNL_ALL_CLEAR); PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP); ReinitQueue (&GLOBAL (ip_group_q)); assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0); diff --git a/sc2/src/uqm/planets/genilw.c b/sc2/src/uqm/planets/genilw.c index 73eb0c7d2..1e06c1623 100644 --- a/sc2/src/uqm/planets/genilw.c +++ b/sc2/src/uqm/planets/genilw.c @@ -84,7 +84,7 @@ GenerateIlwrath (BYTE control) { if (ActivateStarShip (ILWRATH_SHIP, SPHERE_TRACKING)) { - NotifyOthers (ILWRATH_SHIP, (BYTE)~0); + NotifyOthers (ILWRATH_SHIP, IPNL_ALL_CLEAR); PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP); ReinitQueue (&GLOBAL (ip_group_q)); assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0); diff --git a/sc2/src/uqm/planets/genmyc.c b/sc2/src/uqm/planets/genmyc.c index 5430fe865..27264d76d 100644 --- a/sc2/src/uqm/planets/genmyc.c +++ b/sc2/src/uqm/planets/genmyc.c @@ -131,7 +131,7 @@ GenerateMycon (BYTE control) if (CurStarDescPtr->Index == MYCON_DEFINED || !GET_GAME_STATE (SUN_DEVICE_UNGUARDED)) { - NotifyOthers (MYCON_SHIP, (BYTE)~0); + NotifyOthers (MYCON_SHIP, IPNL_ALL_CLEAR); PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP); ReinitQueue (&GLOBAL (ip_group_q)); assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0); diff --git a/sc2/src/uqm/planets/genorz.c b/sc2/src/uqm/planets/genorz.c index f731c7ff3..014ec73e5 100644 --- a/sc2/src/uqm/planets/genorz.c +++ b/sc2/src/uqm/planets/genorz.c @@ -288,7 +288,7 @@ GenerateOrz (BYTE control) || !GET_GAME_STATE (TAALO_UNPROTECTED)) && ActivateStarShip (ORZ_SHIP, SPHERE_TRACKING)) { - NotifyOthers (ORZ_SHIP, (BYTE)~0); + NotifyOthers (ORZ_SHIP, IPNL_ALL_CLEAR); PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP); ReinitQueue (&GLOBAL (ip_group_q)); assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0); diff --git a/sc2/src/uqm/planets/genpet.c b/sc2/src/uqm/planets/genpet.c index abbbad8bb..aeed1d31b 100644 --- a/sc2/src/uqm/planets/genpet.c +++ b/sc2/src/uqm/planets/genpet.c @@ -166,7 +166,7 @@ GenerateTalkingPet (BYTE control) || !GET_GAME_STATE (TALKING_PET) || ActivateStarShip (UMGAH_SHIP, SPHERE_TRACKING))) { - NotifyOthers (UMGAH_SHIP, (BYTE)~0); + NotifyOthers (UMGAH_SHIP, IPNL_ALL_CLEAR); PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP); ReinitQueue (&GLOBAL (ip_group_q)); assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0); diff --git a/sc2/src/uqm/planets/genpku.c b/sc2/src/uqm/planets/genpku.c index 999b3df43..ca3ee6dad 100644 --- a/sc2/src/uqm/planets/genpku.c +++ b/sc2/src/uqm/planets/genpku.c @@ -103,7 +103,7 @@ GeneratePkunk (BYTE control) { if (ActivateStarShip (PKUNK_SHIP, SPHERE_TRACKING)) { - NotifyOthers (PKUNK_SHIP, (BYTE)~0); + NotifyOthers (PKUNK_SHIP, IPNL_ALL_CLEAR); PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP); ReinitQueue (&GLOBAL (ip_group_q)); assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0); diff --git a/sc2/src/uqm/planets/gensam.c b/sc2/src/uqm/planets/gensam.c index 7013e1e41..e6f8ec253 100644 --- a/sc2/src/uqm/planets/gensam.c +++ b/sc2/src/uqm/planets/gensam.c @@ -151,6 +151,8 @@ GenerateSamatra (BYTE control) } else if (GroupPtr->task & REFORM_GROUP) { + // REFORM_GROUP was set in ipdisp.c:ip_group_collision + // during a collision with the flagship. GroupPtr->task &= ~REFORM_GROUP; GroupPtr->group_counter = 0; diff --git a/sc2/src/uqm/planets/genshof.c b/sc2/src/uqm/planets/genshof.c index d1a582413..40b30d4c3 100644 --- a/sc2/src/uqm/planets/genshof.c +++ b/sc2/src/uqm/planets/genshof.c @@ -26,21 +26,26 @@ static void check_old_shofixti (void) { HIPGROUP hGroup; + IP_GROUP *GroupPtr; - if (GLOBAL (BattleGroupRef) - && (hGroup = GetHeadLink (&GLOBAL (ip_group_q))) + if (!GLOBAL (BattleGroupRef)) + return; // nothing to check + + hGroup = GetHeadLink (&GLOBAL (ip_group_q)); + if (!hGroup) + return; // still nothing to check + + GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup); + // REFORM_GROUP was set in ipdisp.c:ip_group_collision() + // during a collision with the flagship. + if (GroupPtr->race_id == SHOFIXTI_SHIP + && (GroupPtr->task & REFORM_GROUP) && GET_GAME_STATE (SHOFIXTI_RECRUITED)) { - IP_GROUP *GroupPtr; - - GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup); - - GroupPtr->task &= REFORM_GROUP; - GroupPtr->task |= FLEE | IGNORE_FLAGSHIP; + GroupPtr->task = FLEE | IGNORE_FLAGSHIP | REFORM_GROUP; GroupPtr->dest_loc = 0; - - UnlockIpGroup (&GLOBAL (ip_group_q), hGroup); } + UnlockIpGroup (&GLOBAL (ip_group_q), hGroup); } void diff --git a/sc2/src/uqm/planets/gensol.c b/sc2/src/uqm/planets/gensol.c index df9ae69f8..420b527f5 100644 --- a/sc2/src/uqm/planets/gensol.c +++ b/sc2/src/uqm/planets/gensol.c @@ -54,6 +54,33 @@ init_probe (void) return 0; } +static void +check_probe (void) +{ + HIPGROUP hGroup; + IP_GROUP *GroupPtr; + + if (!GLOBAL (BattleGroupRef)) + return; // nothing to check + + hGroup = GetHeadLink (&GLOBAL (ip_group_q)); + if (!hGroup) + return; // still nothing to check + + GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup); + // REFORM_GROUP was set in ipdisp.c:ip_group_collision() + // during a collision with the flagship. + if (GroupPtr->race_id == URQUAN_DRONE_SHIP + && (GroupPtr->task & REFORM_GROUP)) + { + // We just want the probe to take off as fast as possible, + // so clear out REFORM_GROUP + GroupPtr->task = FLEE | IGNORE_FLAGSHIP; + GroupPtr->dest_loc = 0; + } + UnlockIpGroup (&GLOBAL (ip_group_q), hGroup); +} + static void generate_energy_nodes (void) { @@ -422,7 +449,10 @@ GenerateSOL (BYTE control) break; case REINIT_NPCS: if (GET_GAME_STATE (CHMMR_BOMB_STATE) != 3) + { GenerateRandomIP (REINIT_NPCS); + check_probe (); + } else { GLOBAL (BattleGroupRef) = 0; diff --git a/sc2/src/uqm/planets/genspa.c b/sc2/src/uqm/planets/genspa.c index 01e9daf5f..5ad25e300 100644 --- a/sc2/src/uqm/planets/genspa.c +++ b/sc2/src/uqm/planets/genspa.c @@ -156,7 +156,7 @@ GenerateSpathi (BYTE control) if (!GET_GAME_STATE (SPATHI_SHIELDED_SELVES) && ActivateStarShip (SPATHI_SHIP, SPHERE_TRACKING)) { - NotifyOthers (SPATHI_SHIP, (BYTE)~0); + NotifyOthers (SPATHI_SHIP, IPNL_ALL_CLEAR); PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP); ReinitQueue (&GLOBAL (ip_group_q)); assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0); diff --git a/sc2/src/uqm/planets/gensup.c b/sc2/src/uqm/planets/gensup.c index 7299b2f7c..fa97ed921 100644 --- a/sc2/src/uqm/planets/gensup.c +++ b/sc2/src/uqm/planets/gensup.c @@ -101,7 +101,7 @@ GenerateSupox (BYTE control) { if (ActivateStarShip (SUPOX_SHIP, SPHERE_TRACKING)) { - NotifyOthers (SUPOX_SHIP, (BYTE)~0); + NotifyOthers (SUPOX_SHIP, IPNL_ALL_CLEAR); PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP); ReinitQueue (&GLOBAL (ip_group_q)); assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0); diff --git a/sc2/src/uqm/planets/genthrad.c b/sc2/src/uqm/planets/genthrad.c index 830cd410f..3b326ffe1 100644 --- a/sc2/src/uqm/planets/genthrad.c +++ b/sc2/src/uqm/planets/genthrad.c @@ -142,7 +142,7 @@ GenerateThradd (BYTE control) || (!GET_GAME_STATE (HELIX_UNPROTECTED) && (BYTE)(GET_GAME_STATE (THRADD_MISSION) - 1) >= 3))) { - NotifyOthers (THRADDASH_SHIP, (BYTE)~0); + NotifyOthers (THRADDASH_SHIP, IPNL_ALL_CLEAR); PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP); ReinitQueue (&GLOBAL (ip_group_q)); assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0); diff --git a/sc2/src/uqm/planets/genutw.c b/sc2/src/uqm/planets/genutw.c index cbe9bbc18..1d9c8d865 100644 --- a/sc2/src/uqm/planets/genutw.c +++ b/sc2/src/uqm/planets/genutw.c @@ -146,7 +146,7 @@ GenerateUtwig (BYTE control) || !GET_GAME_STATE (UTWIG_HAVE_ULTRON)) && ActivateStarShip (UTWIG_SHIP, SPHERE_TRACKING)) { - NotifyOthers (UTWIG_SHIP, (BYTE)~0); + NotifyOthers (UTWIG_SHIP, IPNL_ALL_CLEAR); PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP); ReinitQueue (&GLOBAL (ip_group_q)); assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0); diff --git a/sc2/src/uqm/planets/genvux.c b/sc2/src/uqm/planets/genvux.c index 2b8a3e995..99636d826 100644 --- a/sc2/src/uqm/planets/genvux.c +++ b/sc2/src/uqm/planets/genvux.c @@ -156,7 +156,7 @@ GenerateVUX (BYTE control) && !GET_GAME_STATE (ZEX_IS_DEAD)))) && ActivateStarShip (VUX_SHIP, SPHERE_TRACKING)) { - NotifyOthers (VUX_SHIP, (BYTE)~0); + NotifyOthers (VUX_SHIP, IPNL_ALL_CLEAR); PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP); ReinitQueue (&GLOBAL (ip_group_q)); assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0); diff --git a/sc2/src/uqm/planets/genyeh.c b/sc2/src/uqm/planets/genyeh.c index 6b1b88123..910b37b5a 100644 --- a/sc2/src/uqm/planets/genyeh.c +++ b/sc2/src/uqm/planets/genyeh.c @@ -85,7 +85,7 @@ GenerateYehat (BYTE control) { if (ActivateStarShip (YEHAT_SHIP, SPHERE_TRACKING)) { - NotifyOthers (YEHAT_SHIP, (BYTE)~0); + NotifyOthers (YEHAT_SHIP, IPNL_ALL_CLEAR); PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP); ReinitQueue (&GLOBAL (ip_group_q)); assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0); diff --git a/sc2/src/uqm/planets/genzoq.c b/sc2/src/uqm/planets/genzoq.c index 0a873bc61..d9db2a300 100644 --- a/sc2/src/uqm/planets/genzoq.c +++ b/sc2/src/uqm/planets/genzoq.c @@ -28,22 +28,25 @@ static void check_scout (void) { HIPGROUP hGroup; + IP_GROUP *GroupPtr; - if (GLOBAL (BattleGroupRef) - && (hGroup = GetHeadLink (&GLOBAL (ip_group_q)))) + if (!GLOBAL (BattleGroupRef)) + return; // nothing to check + + hGroup = GetHeadLink (&GLOBAL (ip_group_q)); + if (!hGroup) + return; // still nothing to check + + GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup); + // REFORM_GROUP was set in ipdisp.c:ip_group_collision() + // during a collision with the flagship. + if (GroupPtr->race_id == ZOQFOTPIK_SHIP + && (GroupPtr->task & REFORM_GROUP)) { - IP_GROUP *GroupPtr; - - GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup); - - if (GroupPtr->task & REFORM_GROUP) - { - GroupPtr->task = FLEE | IGNORE_FLAGSHIP | REFORM_GROUP; - GroupPtr->dest_loc = 0; - } - - UnlockIpGroup (&GLOBAL (ip_group_q), hGroup); + GroupPtr->task = FLEE | IGNORE_FLAGSHIP | REFORM_GROUP; + GroupPtr->dest_loc = 0; } + UnlockIpGroup (&GLOBAL (ip_group_q), hGroup); } static void diff --git a/sc2/src/uqm/planets/solarsys.c b/sc2/src/uqm/planets/solarsys.c index a2113a304..68124ae40 100644 --- a/sc2/src/uqm/planets/solarsys.c +++ b/sc2/src/uqm/planets/solarsys.c @@ -27,6 +27,7 @@ #include "../resinst.h" #include "../settings.h" #include "../ipdisp.h" +#include "../grpinfo.h" #include "../process.h" #include "../load.h" #include "../setup.h" @@ -1653,6 +1654,42 @@ GenerateOrbital (void) { LoadPlanet (NULL); } +static void +check_yehat_rebellion (void) +{ + HIPGROUP hGroup, hNextGroup; + + // XXX: Is there a better way to do this? I could not find one. + // When you talk to a Yehat ship (YEHAT_SHIP) and start the rebellion, + // there is no battle following the comm. There is *never* a battle in + // an encounter with Rebels, but the group race_id (YEHAT_REBEL_SHIP) + // is different from Royalists (YEHAT_SHIP). There is *always* a battle + // in an encounter with Royalists. + // TRANSLATION: "If the civil war has not started yet, or the player + // battled a ship -- bail." + if (!GET_GAME_STATE (YEHAT_CIVIL_WAR) || EncounterRace >= 0) + return; // not this time + + // Send Yehat groups to flee the system, but only if the player + // has actually talked to a ship. + for (hGroup = GetHeadLink (&GLOBAL (ip_group_q)); hGroup; + hGroup = hNextGroup) + { + IP_GROUP *GroupPtr = LockIpGroup (&GLOBAL (ip_group_q), hGroup); + hNextGroup = _GetSuccLink (GroupPtr); + // IGNORE_FLAGSHIP was set in ipdisp.c:ip_group_collision() + // during a collision with the flagship. + if (GroupPtr->race_id == YEHAT_SHIP + && (GroupPtr->task & IGNORE_FLAGSHIP)) + { + GroupPtr->task &= REFORM_GROUP; + GroupPtr->task |= FLEE | IGNORE_FLAGSHIP; + GroupPtr->dest_loc = 0; + } + UnlockIpGroup (&GLOBAL (ip_group_q), hGroup); + } +} + void GenerateRandomIP (BYTE control) { @@ -1667,6 +1704,11 @@ GenerateRandomIP (BYTE control) break; case REINIT_NPCS: GetGroupInfo (GROUPS_RANDOM, GROUP_LOAD_IP); + // This is not a great place to do the Yehat rebellion check, but + // since you can start the rebellion in any star system (not just + // the Homeworld), I could not find a better place for it. + // At least it is better than where it was originally. + check_yehat_rebellion (); break; case UNINIT_NPCS: PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);