Untangling ship queues, stage 3: Fully unaliased STARSHIP, SHIP_FRAGMENT and EXTENDED_SHIP_FRAGMENT
git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@2782 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
+64
-43
@@ -26,29 +26,40 @@
|
|||||||
|
|
||||||
// Allocate a new STARSHIP and put it in the queue.
|
// Allocate a new STARSHIP and put it in the queue.
|
||||||
HSTARSHIP
|
HSTARSHIP
|
||||||
Build (QUEUE *pQueue, DWORD RaceResIndex, COUNT which_player, BYTE
|
Build (QUEUE *pQueue, DWORD RaceResIndex)
|
||||||
captains_name_index)
|
|
||||||
{
|
{
|
||||||
HSTARSHIP hNewShip;
|
HSTARSHIP hNewShip;
|
||||||
|
void *LinkPtr;
|
||||||
|
|
||||||
hNewShip = AllocStarShip (pQueue);
|
hNewShip = AllocStarShip (pQueue);
|
||||||
if (hNewShip != 0)
|
if (!hNewShip)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
LinkPtr = LockStarShip (pQueue, hNewShip);
|
||||||
|
memset (LinkPtr, 0, GetLinkSize (pQueue));
|
||||||
|
|
||||||
|
if (GetLinkSize (pQueue) == sizeof (STARSHIP))
|
||||||
{
|
{
|
||||||
STARSHIP *StarShipPtr;
|
STARSHIP *StarShipPtr = (STARSHIP *) LinkPtr;
|
||||||
|
|
||||||
// XXX: STARSHIP refactor; The last remaining aliasing between
|
|
||||||
// STARSHIP and SHIP_FRAGMENT structs
|
|
||||||
StarShipPtr = LockStarShip (pQueue, hNewShip);
|
|
||||||
memset (StarShipPtr, 0, GetLinkSize (pQueue));
|
|
||||||
|
|
||||||
StarShipPtr->RaceResIndex = RaceResIndex;
|
StarShipPtr->RaceResIndex = RaceResIndex;
|
||||||
OwnStarShip (StarShipPtr, which_player, captains_name_index);
|
|
||||||
|
|
||||||
UnlockStarShip (pQueue, hNewShip);
|
|
||||||
PutQueue (pQueue, hNewShip);
|
|
||||||
}
|
}
|
||||||
|
else if (GetLinkSize (pQueue) == sizeof (SHIP_FRAGMENT))
|
||||||
|
{
|
||||||
|
SHIP_FRAGMENT *FragPtr = (SHIP_FRAGMENT *) LinkPtr;
|
||||||
|
FragPtr->RaceResIndex = RaceResIndex;
|
||||||
|
}
|
||||||
|
else if (GetLinkSize (pQueue) == sizeof (EXTENDED_SHIP_FRAGMENT))
|
||||||
|
{
|
||||||
|
EXTENDED_SHIP_FRAGMENT *FragPtr = (EXTENDED_SHIP_FRAGMENT *) LinkPtr;
|
||||||
|
FragPtr->RaceResIndex = RaceResIndex;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
assert (0 && "Build(): unknown queue type!");
|
||||||
|
|
||||||
return (hNewShip);
|
UnlockStarShip (pQueue, hNewShip);
|
||||||
|
PutQueue (pQueue, hNewShip);
|
||||||
|
|
||||||
|
return hNewShip;
|
||||||
}
|
}
|
||||||
|
|
||||||
HLINK
|
HLINK
|
||||||
@@ -325,39 +336,43 @@ BYTE
|
|||||||
NameCaptain (QUEUE *pQueue, DWORD RaceResIndex)
|
NameCaptain (QUEUE *pQueue, DWORD RaceResIndex)
|
||||||
{
|
{
|
||||||
BYTE name_index;
|
BYTE name_index;
|
||||||
HSTARSHIP hStarShip;
|
HLINK hStarShip;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
HSTARSHIP hNextShip;
|
HLINK hNextShip;
|
||||||
|
|
||||||
name_index = PickCaptainName ();
|
name_index = PickCaptainName ();
|
||||||
for (hStarShip = GetHeadLink (pQueue); hStarShip; hStarShip = hNextShip)
|
for (hStarShip = GetHeadLink (pQueue); hStarShip; hStarShip = hNextShip)
|
||||||
{
|
{
|
||||||
STARSHIP *TestShipPtr;
|
LINK *LinkPtr;
|
||||||
|
BYTE test_name_index;
|
||||||
|
|
||||||
TestShipPtr = LockStarShip (pQueue, hStarShip);
|
LinkPtr = LockLink (pQueue, hStarShip);
|
||||||
hNextShip = _GetSuccLink (TestShipPtr);
|
hNextShip = _GetSuccLink (LinkPtr);
|
||||||
if (TestShipPtr->RaceResIndex == RaceResIndex)
|
if (GetLinkSize (pQueue) == sizeof (STARSHIP))
|
||||||
{
|
{
|
||||||
BOOLEAN SameName;
|
STARSHIP *TestShipPtr = (STARSHIP *) LinkPtr;
|
||||||
|
if (TestShipPtr->RaceResIndex != RaceResIndex)
|
||||||
// XXX: STARSHIP refactor; The last remaining aliasing between
|
continue;
|
||||||
// STARSHIP and SHIP_FRAGMENT structs
|
test_name_index = TestShipPtr->captains_name_index;
|
||||||
// This hack will not be needed once
|
|
||||||
// STARSHIP maintains captain/side permanently
|
|
||||||
if (LOBYTE (GLOBAL (CurrentActivity)) == SUPER_MELEE)
|
|
||||||
SameName = (name_index == TestShipPtr->captains_name_index);
|
|
||||||
else
|
|
||||||
SameName = (name_index == StarShipCaptain (TestShipPtr));
|
|
||||||
|
|
||||||
if (SameName)
|
|
||||||
{
|
|
||||||
UnlockStarShip (pQueue, hStarShip);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
UnlockStarShip (pQueue, hStarShip);
|
else if (GetLinkSize (pQueue) == sizeof (SHIP_FRAGMENT))
|
||||||
|
{
|
||||||
|
SHIP_FRAGMENT *TestShipPtr = (SHIP_FRAGMENT *) LinkPtr;
|
||||||
|
if (TestShipPtr->RaceResIndex != RaceResIndex)
|
||||||
|
continue;
|
||||||
|
test_name_index = TestShipPtr->captains_name_index;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
assert (0 && "NameCaptain(): unknown queue type!");
|
||||||
|
|
||||||
|
if (name_index == test_name_index)
|
||||||
|
{
|
||||||
|
UnlockLink (pQueue, hStarShip);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
UnlockLink (pQueue, hStarShip);
|
||||||
}
|
}
|
||||||
} while (hStarShip);
|
} while (hStarShip);
|
||||||
|
|
||||||
@@ -371,6 +386,7 @@ CloneShipFragment (COUNT shipIndex, QUEUE *pDstQueue, COUNT crew_level)
|
|||||||
{
|
{
|
||||||
HSTARSHIP hStarShip, hBuiltShip;
|
HSTARSHIP hStarShip, hBuiltShip;
|
||||||
EXTENDED_SHIP_FRAGMENT *TemplatePtr;
|
EXTENDED_SHIP_FRAGMENT *TemplatePtr;
|
||||||
|
BYTE captains_name_index;
|
||||||
|
|
||||||
hStarShip = GetStarShipFromIndex (&GLOBAL (avail_race_q), shipIndex);
|
hStarShip = GetStarShipFromIndex (&GLOBAL (avail_race_q), shipIndex);
|
||||||
if (hStarShip == 0)
|
if (hStarShip == 0)
|
||||||
@@ -378,15 +394,20 @@ CloneShipFragment (COUNT shipIndex, QUEUE *pDstQueue, COUNT crew_level)
|
|||||||
|
|
||||||
TemplatePtr = (EXTENDED_SHIP_FRAGMENT *) LockStarShip (
|
TemplatePtr = (EXTENDED_SHIP_FRAGMENT *) LockStarShip (
|
||||||
&GLOBAL (avail_race_q), hStarShip);
|
&GLOBAL (avail_race_q), hStarShip);
|
||||||
hBuiltShip = Build (pDstQueue, TemplatePtr->RaceResIndex,
|
if (shipIndex == SAMATRA_SHIP)
|
||||||
TemplatePtr->ShipInfo.ship_flags & (GOOD_GUY | BAD_GUY),
|
captains_name_index = 0;
|
||||||
(BYTE)(shipIndex == SAMATRA_SHIP ?
|
else
|
||||||
0 : NameCaptain (pDstQueue, TemplatePtr->RaceResIndex)));
|
captains_name_index = NameCaptain (pDstQueue,
|
||||||
|
TemplatePtr->RaceResIndex);
|
||||||
|
hBuiltShip = Build (pDstQueue, TemplatePtr->RaceResIndex);
|
||||||
if (hBuiltShip)
|
if (hBuiltShip)
|
||||||
{
|
{
|
||||||
SHIP_FRAGMENT *ShipFragPtr;
|
SHIP_FRAGMENT *ShipFragPtr;
|
||||||
|
|
||||||
ShipFragPtr = (SHIP_FRAGMENT*) LockStarShip (pDstQueue, hBuiltShip);
|
ShipFragPtr = (SHIP_FRAGMENT*) LockStarShip (pDstQueue, hBuiltShip);
|
||||||
|
ShipFragPtr->which_side = TemplatePtr->ShipInfo.ship_flags &
|
||||||
|
(GOOD_GUY | BAD_GUY);
|
||||||
|
ShipFragPtr->captains_name_index = captains_name_index;
|
||||||
// XXX: SHIP_INFO struct copy
|
// XXX: SHIP_INFO struct copy
|
||||||
ShipFragPtr->ShipInfo.race_strings = TemplatePtr->ShipInfo.race_strings;
|
ShipFragPtr->ShipInfo.race_strings = TemplatePtr->ShipInfo.race_strings;
|
||||||
ShipFragPtr->ShipInfo.icons = TemplatePtr->ShipInfo.icons;
|
ShipFragPtr->ShipInfo.icons = TemplatePtr->ShipInfo.icons;
|
||||||
@@ -445,7 +466,7 @@ SetEscortCrewComplement (COUNT which_ship, COUNT crew_level, BYTE captain)
|
|||||||
if (hStarShip)
|
if (hStarShip)
|
||||||
{
|
{
|
||||||
StarShipPtr->ShipInfo.crew_level = crew_level;
|
StarShipPtr->ShipInfo.crew_level = crew_level;
|
||||||
OwnStarShip (StarShipPtr, StarShipPlayer (StarShipPtr), captain);
|
StarShipPtr->captains_name_index = captain;
|
||||||
UnlockStarShip (&GLOBAL (built_ship_q), hStarShip);
|
UnlockStarShip (&GLOBAL (built_ship_q), hStarShip);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
+1
-10
@@ -33,20 +33,11 @@
|
|||||||
#define NAME_OFFSET 5
|
#define NAME_OFFSET 5
|
||||||
#define NUM_CAPTAINS_NAMES 16
|
#define NUM_CAPTAINS_NAMES 16
|
||||||
|
|
||||||
// XXX: STARSHIP refactor; These three alias STARSHIP and SHIP_FRAGMENT
|
|
||||||
#define OwnStarShip(S,p,n) \
|
|
||||||
(S)->s.Player = (p); \
|
|
||||||
(S)->s.Captain = (n);
|
|
||||||
#define StarShipCaptain(S) \
|
|
||||||
(S)->s.Captain
|
|
||||||
#define StarShipPlayer(S) \
|
|
||||||
(S)->s.Player
|
|
||||||
#define PickCaptainName() (((COUNT)TFB_Random () \
|
#define PickCaptainName() (((COUNT)TFB_Random () \
|
||||||
& (NUM_CAPTAINS_NAMES - 1)) \
|
& (NUM_CAPTAINS_NAMES - 1)) \
|
||||||
+ NAME_OFFSET)
|
+ NAME_OFFSET)
|
||||||
|
|
||||||
extern HSTARSHIP Build (QUEUE *pQueue, DWORD RaceResIndex, COUNT
|
extern HSTARSHIP Build (QUEUE *pQueue, DWORD RaceResIndex);
|
||||||
which_player, BYTE captains_name_index);
|
|
||||||
extern HSTARSHIP CloneShipFragment (COUNT shipIndex, QUEUE *pDstQueue,
|
extern HSTARSHIP CloneShipFragment (COUNT shipIndex, QUEUE *pDstQueue,
|
||||||
COUNT crew_level);
|
COUNT crew_level);
|
||||||
extern HLINK GetStarShipFromIndex (QUEUE *pShipQ, COUNT Index);
|
extern HLINK GetStarShipFromIndex (QUEUE *pShipQ, COUNT Index);
|
||||||
|
|||||||
@@ -131,13 +131,12 @@ BuildBattle (COUNT which_player)
|
|||||||
|
|
||||||
hBuiltShip = Build (&race_q[which_player],
|
hBuiltShip = Build (&race_q[which_player],
|
||||||
GET_RACE_ID (FragPtr) == SAMATRA_SHIP ?
|
GET_RACE_ID (FragPtr) == SAMATRA_SHIP ?
|
||||||
SAMATRA_RES_INDEX : FragPtr->RaceResIndex,
|
SAMATRA_RES_INDEX : FragPtr->RaceResIndex);
|
||||||
1 << which_player, StarShipCaptain (FragPtr));
|
|
||||||
if (hBuiltShip)
|
if (hBuiltShip)
|
||||||
{
|
{
|
||||||
BuiltShipPtr = LockStarShip (&race_q[which_player], hBuiltShip);
|
BuiltShipPtr = LockStarShip (&race_q[which_player], hBuiltShip);
|
||||||
BuiltShipPtr->captains_name_index = StarShipCaptain (BuiltShipPtr);
|
BuiltShipPtr->captains_name_index = FragPtr->captains_name_index;
|
||||||
BuiltShipPtr->which_side = StarShipPlayer (BuiltShipPtr);
|
BuiltShipPtr->which_side = 1 << which_player;
|
||||||
if (FragPtr->ShipInfo.crew_level != INFINITE_FLEET)
|
if (FragPtr->ShipInfo.crew_level != INFINITE_FLEET)
|
||||||
BuiltShipPtr->crew_level = FragPtr->ShipInfo.crew_level;
|
BuiltShipPtr->crew_level = FragPtr->ShipInfo.crew_level;
|
||||||
else /* if infinite ships */
|
else /* if infinite ships */
|
||||||
@@ -157,11 +156,11 @@ BuildBattle (COUNT which_player)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (which_player == 0
|
if (which_player == 0
|
||||||
&& (hBuiltShip = Build (&race_q[0], SIS_RES_INDEX, GOOD_GUY, 0)))
|
&& (hBuiltShip = Build (&race_q[0], SIS_RES_INDEX)))
|
||||||
{
|
{
|
||||||
BuiltShipPtr = LockStarShip (&race_q[0], hBuiltShip);
|
BuiltShipPtr = LockStarShip (&race_q[0], hBuiltShip);
|
||||||
BuiltShipPtr->captains_name_index = StarShipCaptain (BuiltShipPtr);
|
BuiltShipPtr->captains_name_index = 0;
|
||||||
BuiltShipPtr->which_side = StarShipPlayer (BuiltShipPtr);
|
BuiltShipPtr->which_side = GOOD_GUY;
|
||||||
BuiltShipPtr->crew_level = 0;
|
BuiltShipPtr->crew_level = 0;
|
||||||
BuiltShipPtr->max_crew = 0;
|
BuiltShipPtr->max_crew = 0;
|
||||||
// Crew will be copied directly from
|
// Crew will be copied directly from
|
||||||
|
|||||||
@@ -224,7 +224,7 @@ InitSIS (void)
|
|||||||
ship_ref = YEHAT_SHIP_INDEX;
|
ship_ref = YEHAT_SHIP_INDEX;
|
||||||
else /* (i == num_ships - 1) */
|
else /* (i == num_ships - 1) */
|
||||||
ship_ref = PROBE_RES_INDEX;
|
ship_ref = PROBE_RES_INDEX;
|
||||||
hStarShip = Build (&GLOBAL (avail_race_q), ship_ref, 0, 0);
|
hStarShip = Build (&GLOBAL (avail_race_q), ship_ref);
|
||||||
if (hStarShip)
|
if (hStarShip)
|
||||||
{
|
{
|
||||||
EXTENDED_SHIP_FRAGMENT *FleetPtr;
|
EXTENDED_SHIP_FRAGMENT *FleetPtr;
|
||||||
|
|||||||
@@ -91,8 +91,8 @@ ReadShipFragment (void *fp, SHIP_FRAGMENT *FragPtr)
|
|||||||
BYTE tmpb;
|
BYTE tmpb;
|
||||||
|
|
||||||
// Read SHIP_FRAGMENT elements
|
// Read SHIP_FRAGMENT elements
|
||||||
sread_16 (fp, &FragPtr->s.Player);
|
sread_16 (fp, &FragPtr->which_side);
|
||||||
sread_8 (fp, &FragPtr->s.Captain);
|
sread_8 (fp, &FragPtr->captains_name_index);
|
||||||
sread_8 (fp, NULL); /* padding */
|
sread_8 (fp, NULL); /* padding */
|
||||||
// Read SHIP_INFO elements
|
// Read SHIP_INFO elements
|
||||||
sread_16 (fp, &FragPtr->ShipInfo.ship_flags);
|
sread_16 (fp, &FragPtr->ShipInfo.ship_flags);
|
||||||
@@ -112,8 +112,8 @@ static void
|
|||||||
WriteShipFragment (void *fp, const SHIP_FRAGMENT *FragPtr)
|
WriteShipFragment (void *fp, const SHIP_FRAGMENT *FragPtr)
|
||||||
{
|
{
|
||||||
// Write SHIP_FRAGMENT elements
|
// Write SHIP_FRAGMENT elements
|
||||||
swrite_16 (fp, FragPtr->s.Player);
|
swrite_16 (fp, FragPtr->which_side);
|
||||||
swrite_8 (fp, FragPtr->s.Captain);
|
swrite_8 (fp, FragPtr->captains_name_index);
|
||||||
swrite_8 (fp, 0); /* padding */
|
swrite_8 (fp, 0); /* padding */
|
||||||
// Write SHIP_INFO elements
|
// Write SHIP_INFO elements
|
||||||
swrite_16 (fp, FragPtr->ShipInfo.ship_flags);
|
swrite_16 (fp, FragPtr->ShipInfo.ship_flags);
|
||||||
@@ -492,6 +492,7 @@ GetGroupInfo (DWORD offset, BYTE which_group)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
/* Read IP groups into npc_built_ship_q */
|
||||||
for (which_group = 1; which_group <= GH.NumGroups;
|
for (which_group = 1; which_group <= GH.NumGroups;
|
||||||
++which_group)
|
++which_group)
|
||||||
{
|
{
|
||||||
@@ -511,10 +512,13 @@ GetGroupInfo (DWORD offset, BYTE which_group)
|
|||||||
&GLOBAL (npc_built_ship_q), 0);
|
&GLOBAL (npc_built_ship_q), 0);
|
||||||
FragPtr = (SHIP_FRAGMENT*) LockStarShip (
|
FragPtr = (SHIP_FRAGMENT*) LockStarShip (
|
||||||
&GLOBAL (npc_built_ship_q), hStarShip);
|
&GLOBAL (npc_built_ship_q), hStarShip);
|
||||||
// XXX: STARSHIP refactor; this is probably needed
|
// XXX: STARSHIP refactor; Cannot find what might be
|
||||||
// because SHIP_INFO.ship_flags is used for
|
// using this info. Looks unused.
|
||||||
// group_counter
|
FragPtr->which_side = BAD_GUY;
|
||||||
OwnStarShip (FragPtr, BAD_GUY, 0);
|
FragPtr->captains_name_index = 0;
|
||||||
|
// XXX: CloneShipFragment() may set ship_flags in the
|
||||||
|
// future, and it will collide with group_counter,
|
||||||
|
// but it is reset a few lines below
|
||||||
SET_GROUP_ID (FragPtr, which_group);
|
SET_GROUP_ID (FragPtr, which_group);
|
||||||
|
|
||||||
rand_val = TFB_Random ();
|
rand_val = TFB_Random ();
|
||||||
|
|||||||
+18
-2
@@ -133,6 +133,23 @@ UninitSpace (void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HSTARSHIP
|
||||||
|
BuildSIS (void)
|
||||||
|
{
|
||||||
|
HSTARSHIP hStarShip;
|
||||||
|
STARSHIP *StarShipPtr;
|
||||||
|
|
||||||
|
hStarShip = Build (&race_q[0], SIS_RES_INDEX);
|
||||||
|
if (!hStarShip)
|
||||||
|
return 0;
|
||||||
|
StarShipPtr = LockStarShip (&race_q[0], hStarShip);
|
||||||
|
StarShipPtr->which_side = GOOD_GUY;
|
||||||
|
StarShipPtr->captains_name_index = 0;
|
||||||
|
UnlockStarShip (&race_q[0], hStarShip);
|
||||||
|
|
||||||
|
return hStarShip;
|
||||||
|
}
|
||||||
|
|
||||||
SIZE
|
SIZE
|
||||||
InitShips (void)
|
InitShips (void)
|
||||||
{
|
{
|
||||||
@@ -151,8 +168,7 @@ InitShips (void)
|
|||||||
ReinitQueue (&race_q[0]);
|
ReinitQueue (&race_q[0]);
|
||||||
ReinitQueue (&race_q[1]);
|
ReinitQueue (&race_q[1]);
|
||||||
|
|
||||||
Build (&race_q[0], SIS_RES_INDEX, GOOD_GUY, 0);
|
BuildSIS ();
|
||||||
|
|
||||||
LoadHyperspace ();
|
LoadHyperspace ();
|
||||||
|
|
||||||
num_ships = 1;
|
num_ships = 1;
|
||||||
|
|||||||
@@ -153,8 +153,8 @@ LoadShipQueue (DECODE_REF fh, QUEUE *pQueue)
|
|||||||
FragPtr = (SHIP_FRAGMENT*) LockStarShip (pQueue, hStarShip);
|
FragPtr = (SHIP_FRAGMENT*) LockStarShip (pQueue, hStarShip);
|
||||||
|
|
||||||
// Read SHIP_FRAGMENT elements
|
// Read SHIP_FRAGMENT elements
|
||||||
cread_16 (fh, &FragPtr->s.Player);
|
cread_16 (fh, &FragPtr->which_side);
|
||||||
cread_8 (fh, &FragPtr->s.Captain);
|
cread_8 (fh, &FragPtr->captains_name_index);
|
||||||
cread_8 (fh, NULL); /* padding */
|
cread_8 (fh, NULL); /* padding */
|
||||||
// Read SHIP_INFO elements
|
// Read SHIP_INFO elements
|
||||||
cread_16 (fh, &FragPtr->ShipInfo.ship_flags);
|
cread_16 (fh, &FragPtr->ShipInfo.ship_flags);
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ LoadMasterShipList (void (* YieldProcessing)(void))
|
|||||||
SHIP_FRAGMENT *BuiltFragPtr;
|
SHIP_FRAGMENT *BuiltFragPtr;
|
||||||
RACE_DESC *RDPtr;
|
RACE_DESC *RDPtr;
|
||||||
|
|
||||||
hBuiltShip = Build (&master_q, MAKE_RESOURCE (rp++, rt, ri++), 0, 0);
|
hBuiltShip = Build (&master_q, MAKE_RESOURCE (rp++, rt, ri++));
|
||||||
if (!hBuiltShip)
|
if (!hBuiltShip)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|||||||
@@ -2121,12 +2121,13 @@ BuildAndDrawShipList (MELEE_STATE *pMS)
|
|||||||
HSTARSHIP hStarShip, hBuiltShip;
|
HSTARSHIP hStarShip, hBuiltShip;
|
||||||
SHIP_FRAGMENT *FragPtr;
|
SHIP_FRAGMENT *FragPtr;
|
||||||
STARSHIP *BuiltShipPtr;
|
STARSHIP *BuiltShipPtr;
|
||||||
|
BYTE captains_name_index;
|
||||||
|
|
||||||
hStarShip = GetStarShipFromIndex (&master_q, StarShip);
|
hStarShip = GetStarShipFromIndex (&master_q, StarShip);
|
||||||
FragPtr = (SHIP_FRAGMENT *) LockStarShip (&master_q, hStarShip);
|
FragPtr = (SHIP_FRAGMENT *) LockStarShip (&master_q, hStarShip);
|
||||||
hBuiltShip = Build (&race_q[side], FragPtr->RaceResIndex,
|
captains_name_index = NameCaptain (&race_q[side],
|
||||||
1 << side,
|
FragPtr->RaceResIndex);
|
||||||
NameCaptain (&race_q[side], FragPtr->RaceResIndex));
|
hBuiltShip = Build (&race_q[side], FragPtr->RaceResIndex);
|
||||||
|
|
||||||
// Draw the icon.
|
// Draw the icon.
|
||||||
row = GetShipRow (index);
|
row = GetShipRow (index);
|
||||||
@@ -2143,8 +2144,7 @@ BuildAndDrawShipList (MELEE_STATE *pMS)
|
|||||||
BuiltShipPtr->index = index;
|
BuiltShipPtr->index = index;
|
||||||
BuiltShipPtr->ship_cost = ship_cost;
|
BuiltShipPtr->ship_cost = ship_cost;
|
||||||
BuiltShipPtr->which_side = 1 << side;
|
BuiltShipPtr->which_side = 1 << side;
|
||||||
BuiltShipPtr->captains_name_index =
|
BuiltShipPtr->captains_name_index = captains_name_index;
|
||||||
StarShipCaptain (BuiltShipPtr);
|
|
||||||
// The next ones are not used in Melee
|
// The next ones are not used in Melee
|
||||||
BuiltShipPtr->crew_level = 0;
|
BuiltShipPtr->crew_level = 0;
|
||||||
BuiltShipPtr->max_crew = 0;
|
BuiltShipPtr->max_crew = 0;
|
||||||
|
|||||||
@@ -30,8 +30,6 @@
|
|||||||
#include "netplay/proto/ready.h"
|
#include "netplay/proto/ready.h"
|
||||||
#include "netplay/proto/reset.h"
|
#include "netplay/proto/reset.h"
|
||||||
|
|
||||||
#include "build.h"
|
|
||||||
// for StarShipPlayer()
|
|
||||||
#include "controls.h"
|
#include "controls.h"
|
||||||
// for BATTLE_INPUT_STATE
|
// for BATTLE_INPUT_STATE
|
||||||
#include "init.h"
|
#include "init.h"
|
||||||
|
|||||||
@@ -660,24 +660,6 @@ GetMeleeStarShips (COUNT playerMask, HSTARSHIP *ships)
|
|||||||
// Aborting.
|
// Aborting.
|
||||||
GLOBAL (CurrentActivity) &= ~IN_BATTLE;
|
GLOBAL (CurrentActivity) &= ~IN_BATTLE;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
STARSHIP *StarShipPtr;
|
|
||||||
|
|
||||||
// XXX: STARSHIP refactor; This whole thing is probably not needed
|
|
||||||
// once captain/side are maintained permanently in STARSHIP
|
|
||||||
for (playerI = 0; playerI < NUM_PLAYERS; playerI++)
|
|
||||||
{
|
|
||||||
if (!gmstate.player[playerI].selecting)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
StarShipPtr = LockStarShip (&race_q[playerI], ships[playerI]);
|
|
||||||
OwnStarShip (StarShipPtr, 1 << playerI,
|
|
||||||
StarShipPtr->captains_name_index);
|
|
||||||
StarShipPtr->captains_name_index = 0;
|
|
||||||
UnlockStarShip (&race_q[playerI], ships[playerI]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef NETPLAY
|
#ifdef NETPLAY
|
||||||
for (playerI = 0; playerI < NUM_PLAYERS; playerI++)
|
for (playerI = 0; playerI < NUM_PLAYERS; playerI++)
|
||||||
|
|||||||
@@ -434,16 +434,6 @@ GetEncounterStarShip (STARSHIP *LastStarShipPtr, COUNT which_player)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// XXX: STARSHIP refactor; this whole thing is not really needed
|
|
||||||
// once STARSHIP maintains captain/side permanently
|
|
||||||
if (hBattleShip)
|
|
||||||
{
|
|
||||||
SPtr = LockStarShip (&race_q[which_player], hBattleShip);
|
|
||||||
OwnStarShip (SPtr, SPtr->which_side,
|
|
||||||
SPtr->captains_name_index);
|
|
||||||
UnlockStarShip (&race_q[which_player], hBattleShip);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return (hBattleShip);
|
return (hBattleShip);
|
||||||
|
|||||||
@@ -53,11 +53,10 @@ GenerateColony (BYTE control)
|
|||||||
SET_GROUP_MISSION (FragPtr, IN_ORBIT);
|
SET_GROUP_MISSION (FragPtr, IN_ORBIT);
|
||||||
SET_GROUP_LOC (FragPtr, 0 + 1); /* orbitting colony */
|
SET_GROUP_LOC (FragPtr, 0 + 1); /* orbitting colony */
|
||||||
SET_GROUP_DEST (FragPtr, 0 + 1); /* orbitting colony */
|
SET_GROUP_DEST (FragPtr, 0 + 1); /* orbitting colony */
|
||||||
FragPtr->ShipInfo.loc.x = FragPtr->ShipInfo.loc.y = 0;
|
FragPtr->ShipInfo.loc.x = 0;
|
||||||
|
FragPtr->ShipInfo.loc.y = 0;
|
||||||
FragPtr->ShipInfo.group_counter = 0;
|
FragPtr->ShipInfo.group_counter = 0;
|
||||||
UnlockStarShip (
|
UnlockStarShip (&GLOBAL (npc_built_ship_q), hStarShip);
|
||||||
&GLOBAL (npc_built_ship_q), hStarShip
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,11 +72,10 @@ GenerateShofixti (BYTE control)
|
|||||||
{ /* Set old Shofixti name; his brother if Tanaka died */
|
{ /* Set old Shofixti name; his brother if Tanaka died */
|
||||||
SHIP_FRAGMENT *FragPtr = (SHIP_FRAGMENT *) LockStarShip (
|
SHIP_FRAGMENT *FragPtr = (SHIP_FRAGMENT *) LockStarShip (
|
||||||
&GLOBAL (npc_built_ship_q), hStarShip);
|
&GLOBAL (npc_built_ship_q), hStarShip);
|
||||||
// XXX: STARSHIP refactor; setting BAD_GUY here is redundant
|
/* Name Tanaka or Katana (+1) */
|
||||||
// only the captain is needed
|
FragPtr->captains_name_index = NAME_OFFSET +
|
||||||
OwnStarShip (FragPtr, BAD_GUY, NAME_OFFSET +
|
|
||||||
NUM_CAPTAINS_NAMES +
|
NUM_CAPTAINS_NAMES +
|
||||||
(GET_GAME_STATE (SHOFIXTI_KIA) & 1));
|
(GET_GAME_STATE (SHOFIXTI_KIA) & 1);
|
||||||
UnlockStarShip (&GLOBAL (npc_built_ship_q), hStarShip);
|
UnlockStarShip (&GLOBAL (npc_built_ship_q), hStarShip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -779,18 +779,13 @@ PickPlanetSide (MENU_STATE *pMS)
|
|||||||
&GLOBAL (npc_built_ship_q), 1);
|
&GLOBAL (npc_built_ship_q), 1);
|
||||||
if (hStarShip)
|
if (hStarShip)
|
||||||
{
|
{
|
||||||
BYTE captains_name_index;
|
|
||||||
COUNT which_player;
|
|
||||||
SHIP_FRAGMENT *StarShipPtr;
|
SHIP_FRAGMENT *StarShipPtr;
|
||||||
|
|
||||||
StarShipPtr = (SHIP_FRAGMENT *) LockStarShip (
|
StarShipPtr = (SHIP_FRAGMENT *) LockStarShip (
|
||||||
&GLOBAL (npc_built_ship_q), hStarShip);
|
&GLOBAL (npc_built_ship_q), hStarShip);
|
||||||
// XXX: GOOD_GUY/BAD_GUY was set by CloneShipFragment()
|
// Name Fwiffo
|
||||||
// according to avail_race_q Spathi alliance state
|
StarShipPtr->captains_name_index = NAME_OFFSET +
|
||||||
which_player = StarShipPlayer (StarShipPtr);
|
NUM_CAPTAINS_NAMES;
|
||||||
captains_name_index = NAME_OFFSET + NUM_CAPTAINS_NAMES;
|
|
||||||
// XXX: STARSHIP refactor; only the captain is needed
|
|
||||||
OwnStarShip (StarShipPtr, which_player, captains_name_index);
|
|
||||||
UnlockStarShip (&GLOBAL (npc_built_ship_q), hStarShip);
|
UnlockStarShip (&GLOBAL (npc_built_ship_q), hStarShip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+8
-41
@@ -241,8 +241,6 @@ typedef void (UNINIT_FUNC) (RACE_DESC *pRaceDesc);
|
|||||||
|
|
||||||
struct race_desc
|
struct race_desc
|
||||||
{
|
{
|
||||||
/* XXX: SHIP_INFO *must* currently be the first field in the struct.
|
|
||||||
* See why in comments of EXTENDED_SHIP_FRAGMENT. */
|
|
||||||
SHIP_INFO ship_info _ALIGNED_ANY;
|
SHIP_INFO ship_info _ALIGNED_ANY;
|
||||||
CHARACTERISTIC_STUFF characteristics _ALIGNED_ANY;
|
CHARACTERISTIC_STUFF characteristics _ALIGNED_ANY;
|
||||||
DATA_STUFF ship_data _ALIGNED_ANY;
|
DATA_STUFF ship_data _ALIGNED_ANY;
|
||||||
@@ -263,39 +261,21 @@ struct race_desc
|
|||||||
|
|
||||||
typedef HLINK HSTARSHIP;
|
typedef HLINK HSTARSHIP;
|
||||||
|
|
||||||
/* XXX: STARSHIP and SHIP_FRAGMENT are inter-cast
|
|
||||||
* to each other in some places. Some of those are unsafe and potentially
|
|
||||||
* destructive if the code is changed later.
|
|
||||||
* Currently, the first 4 members of each struct MUST remain the same,
|
|
||||||
* the first 2 being the queue links. Functions Build() and CloneShipFragment()
|
|
||||||
* expect these 4 members to be there.
|
|
||||||
*/
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
// LINK elements; must be first
|
||||||
HSTARSHIP pred;
|
HSTARSHIP pred;
|
||||||
HSTARSHIP succ;
|
HSTARSHIP succ;
|
||||||
|
|
||||||
DWORD RaceResIndex;
|
DWORD RaceResIndex;
|
||||||
|
RACE_DESC *RaceDescPtr;
|
||||||
/* This field is abused to store other data when the ship
|
|
||||||
* is in GLOBAL(built_ship_q), GLOBDATA(npc_built_ship_q),
|
|
||||||
* or race_q[], namely the side this ship is on (accessed
|
|
||||||
* through StarShipPlayer()), and the captains name for
|
|
||||||
* the ship (accessed through StarShipCaptain()).
|
|
||||||
* These values are set using OwnStarShip(). */
|
|
||||||
union {
|
|
||||||
RACE_DESC *RaceDescPtr;
|
|
||||||
struct {
|
|
||||||
COUNT Player;
|
|
||||||
BYTE Captain;
|
|
||||||
} s;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Ship information
|
// Ship information
|
||||||
|
UWORD which_side;
|
||||||
|
// In race_q: side the ship is on
|
||||||
BYTE captains_name_index;
|
BYTE captains_name_index;
|
||||||
// Also used in full-game to detect if a STARSHIP is an escort
|
// Also used in full-game to detect if a STARSHIP is an escort
|
||||||
// or the flagship (captains_name_index == 0)
|
// or the flagship (captains_name_index == 0)
|
||||||
|
|
||||||
COUNT crew_level;
|
COUNT crew_level;
|
||||||
// In full-game battles: crew left
|
// In full-game battles: crew left
|
||||||
// In SuperMelee: irrelevant
|
// In SuperMelee: irrelevant
|
||||||
@@ -303,8 +283,6 @@ typedef struct
|
|||||||
BYTE ship_cost;
|
BYTE ship_cost;
|
||||||
// In Super Melee ship queue: ship cost
|
// In Super Melee ship queue: ship cost
|
||||||
// In full-game: irrelevant
|
// In full-game: irrelevant
|
||||||
UWORD which_side;
|
|
||||||
// In race_q: side the ship is on
|
|
||||||
COUNT index;
|
COUNT index;
|
||||||
// original queue index
|
// original queue index
|
||||||
STRING race_strings;
|
STRING race_strings;
|
||||||
@@ -328,32 +306,21 @@ typedef struct
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
// LINK elements; must be first
|
||||||
HSTARSHIP pred;
|
HSTARSHIP pred;
|
||||||
HSTARSHIP succ;
|
HSTARSHIP succ;
|
||||||
|
|
||||||
DWORD RaceResIndex;
|
DWORD RaceResIndex;
|
||||||
|
|
||||||
/* This field is used to store other data when the ship
|
COUNT which_side;
|
||||||
* is in GLOBAL(built_ship_q) or GLOBDATA(npc_built_ship_q),
|
BYTE captains_name_index;
|
||||||
* namely the side this ship is on (accessed
|
|
||||||
* through StarShipPlayer()), and the captains name for
|
|
||||||
* the ship (accessed through StarShipCaptain()).
|
|
||||||
* These values are set using OwnStarShip(). */
|
|
||||||
union {
|
|
||||||
// XXX: only needed temporarily to maintain binary compat
|
|
||||||
// with STARSHIP for Build()
|
|
||||||
void *__tmp;
|
|
||||||
struct {
|
|
||||||
COUNT Player;
|
|
||||||
BYTE Captain;
|
|
||||||
} s;
|
|
||||||
};
|
|
||||||
|
|
||||||
SHIP_INFO ShipInfo;
|
SHIP_INFO ShipInfo;
|
||||||
} SHIP_FRAGMENT;
|
} SHIP_FRAGMENT;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
// LINK elements; must be first
|
||||||
HSTARSHIP pred;
|
HSTARSHIP pred;
|
||||||
HSTARSHIP succ;
|
HSTARSHIP succ;
|
||||||
|
|
||||||
|
|||||||
@@ -135,8 +135,8 @@ SaveShipQueue (DECODE_REF fh, QUEUE *pQueue)
|
|||||||
cwrite_16 (fh, Index);
|
cwrite_16 (fh, Index);
|
||||||
|
|
||||||
// Write SHIP_FRAGMENT elements
|
// Write SHIP_FRAGMENT elements
|
||||||
cwrite_16 (fh, FragPtr->s.Player);
|
cwrite_16 (fh, FragPtr->which_side);
|
||||||
cwrite_8 (fh, FragPtr->s.Captain);
|
cwrite_8 (fh, FragPtr->captains_name_index);
|
||||||
cwrite_8 (fh, 0); /* padding */
|
cwrite_8 (fh, 0); /* padding */
|
||||||
// Write SHIP_INFO elements
|
// Write SHIP_INFO elements
|
||||||
cwrite_16 (fh, FragPtr->ShipInfo.ship_flags);
|
cwrite_16 (fh, FragPtr->ShipInfo.ship_flags);
|
||||||
|
|||||||
@@ -385,11 +385,7 @@ spawn_ship (STARSHIP *StarShipPtr)
|
|||||||
if (!RDPtr)
|
if (!RDPtr)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
// XXX: Ship captain and side are stored in RaceDescPtr, so
|
RDPtr->ship_info.ship_flags |= StarShipPtr->which_side;
|
||||||
// get them first
|
|
||||||
StarShipPtr->captains_name_index = StarShipCaptain (StarShipPtr);
|
|
||||||
RDPtr->ship_info.ship_flags |= StarShipPlayer (StarShipPtr);
|
|
||||||
|
|
||||||
StarShipPtr->RaceDescPtr = RDPtr;
|
StarShipPtr->RaceDescPtr = RDPtr;
|
||||||
|
|
||||||
StarShipPtr->ship_input_state = 0;
|
StarShipPtr->ship_input_state = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user