Use a common SHIP_BASE for partially aliased ship structs
git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@2799 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
+21
-43
@@ -25,32 +25,23 @@
|
|||||||
#include "libs/mathlib.h"
|
#include "libs/mathlib.h"
|
||||||
|
|
||||||
|
|
||||||
// Allocate a new STARSHIP and put it in the queue.
|
// Allocate a new STARSHIP or SHIP_FRAGMENT and put it in the queue
|
||||||
HLINK
|
HLINK
|
||||||
Build (QUEUE *pQueue, DWORD RaceResIndex)
|
Build (QUEUE *pQueue, DWORD RaceResIndex)
|
||||||
{
|
{
|
||||||
HLINK hNewShip;
|
HLINK hNewShip;
|
||||||
void *LinkPtr;
|
SHIP_BASE *ShipPtr;
|
||||||
|
|
||||||
|
assert (GetLinkSize (pQueue) == sizeof (STARSHIP) ||
|
||||||
|
GetLinkSize (pQueue) == sizeof (SHIP_FRAGMENT));
|
||||||
|
|
||||||
hNewShip = AllocLink (pQueue);
|
hNewShip = AllocLink (pQueue);
|
||||||
if (!hNewShip)
|
if (!hNewShip)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
LinkPtr = LockLink (pQueue, hNewShip);
|
ShipPtr = (SHIP_BASE *) LockLink (pQueue, hNewShip);
|
||||||
memset (LinkPtr, 0, GetLinkSize (pQueue));
|
memset (ShipPtr, 0, GetLinkSize (pQueue));
|
||||||
|
ShipPtr->RaceResIndex = RaceResIndex;
|
||||||
if (GetLinkSize (pQueue) == sizeof (STARSHIP))
|
|
||||||
{
|
|
||||||
STARSHIP *StarShipPtr = (STARSHIP *) LinkPtr;
|
|
||||||
StarShipPtr->RaceResIndex = RaceResIndex;
|
|
||||||
}
|
|
||||||
else if (GetLinkSize (pQueue) == sizeof (SHIP_FRAGMENT))
|
|
||||||
{
|
|
||||||
SHIP_FRAGMENT *FragPtr = (SHIP_FRAGMENT *) LinkPtr;
|
|
||||||
FragPtr->RaceResIndex = RaceResIndex;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
assert (0 && "Build(): unknown queue type!");
|
|
||||||
|
|
||||||
UnlockLink (pQueue, hNewShip);
|
UnlockLink (pQueue, hNewShip);
|
||||||
PutQueue (pQueue, hNewShip);
|
PutQueue (pQueue, hNewShip);
|
||||||
@@ -334,43 +325,30 @@ NameCaptain (QUEUE *pQueue, DWORD RaceResIndex)
|
|||||||
BYTE name_index;
|
BYTE name_index;
|
||||||
HLINK hStarShip;
|
HLINK hStarShip;
|
||||||
|
|
||||||
|
assert (GetLinkSize (pQueue) == sizeof (STARSHIP) ||
|
||||||
|
GetLinkSize (pQueue) == sizeof (SHIP_FRAGMENT));
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
HLINK hNextShip;
|
HLINK hNextShip;
|
||||||
|
|
||||||
name_index = PickCaptainName ();
|
name_index = PickCaptainName ();
|
||||||
for (hStarShip = GetHeadLink (pQueue); hStarShip; hStarShip = hNextShip)
|
for (hStarShip = GetHeadLink (pQueue); hStarShip;
|
||||||
|
hStarShip = hNextShip)
|
||||||
{
|
{
|
||||||
LINK *LinkPtr;
|
SHIP_BASE *ShipPtr;
|
||||||
BYTE test_name_index;
|
BYTE test_name_index = -1;
|
||||||
|
|
||||||
LinkPtr = LockLink (pQueue, hStarShip);
|
ShipPtr = (SHIP_BASE *) LockLink (pQueue, hStarShip);
|
||||||
hNextShip = _GetSuccLink (LinkPtr);
|
hNextShip = _GetSuccLink (ShipPtr);
|
||||||
if (GetLinkSize (pQueue) == sizeof (STARSHIP))
|
if (ShipPtr->RaceResIndex == RaceResIndex)
|
||||||
{
|
test_name_index = ShipPtr->captains_name_index;
|
||||||
STARSHIP *TestShipPtr = (STARSHIP *) LinkPtr;
|
UnlockLink (pQueue, hStarShip);
|
||||||
if (TestShipPtr->RaceResIndex != RaceResIndex)
|
|
||||||
continue;
|
|
||||||
test_name_index = TestShipPtr->captains_name_index;
|
|
||||||
}
|
|
||||||
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)
|
if (name_index == test_name_index)
|
||||||
{
|
|
||||||
UnlockLink (pQueue, hStarShip);
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
UnlockLink (pQueue, hStarShip);
|
|
||||||
}
|
}
|
||||||
} while (hStarShip);
|
} while (hStarShip /* name matched another ship */);
|
||||||
|
|
||||||
return name_index;
|
return name_index;
|
||||||
}
|
}
|
||||||
|
|||||||
+16
-13
@@ -172,24 +172,32 @@ struct race_desc
|
|||||||
void *CodeRef _ALIGNED_ON(sizeof (void *));
|
void *CodeRef _ALIGNED_ON(sizeof (void *));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define SHIP_BASE_COMMON \
|
||||||
|
/* LINK elements; must be first */ \
|
||||||
|
HLINK pred; \
|
||||||
|
HLINK succ; \
|
||||||
|
\
|
||||||
|
DWORD RaceResIndex; \
|
||||||
|
BYTE captains_name_index \
|
||||||
|
/* Also used in full-game to detect if a STARSHIP is an escort
|
||||||
|
* or the flagship (captains_name_index == 0) */
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
SHIP_BASE_COMMON;
|
||||||
|
} SHIP_BASE;
|
||||||
|
|
||||||
typedef HLINK HSTARSHIP;
|
typedef HLINK HSTARSHIP;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
// LINK elements; must be first
|
SHIP_BASE_COMMON;
|
||||||
HSTARSHIP pred;
|
|
||||||
HSTARSHIP succ;
|
|
||||||
|
|
||||||
DWORD RaceResIndex;
|
|
||||||
RACE_DESC *RaceDescPtr;
|
RACE_DESC *RaceDescPtr;
|
||||||
|
|
||||||
// Ship information
|
// Ship information
|
||||||
UWORD which_side;
|
UWORD which_side;
|
||||||
// In race_q: side the ship is on
|
// In race_q: side the ship is on
|
||||||
BYTE captains_name_index;
|
|
||||||
// Also used in full-game to detect if a STARSHIP is an escort
|
|
||||||
// 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
|
||||||
@@ -233,14 +241,9 @@ typedef HLINK HSHIPFRAG;
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
// LINK elements; must be first
|
SHIP_BASE_COMMON;
|
||||||
HSHIPFRAG pred;
|
|
||||||
HSHIPFRAG succ;
|
|
||||||
|
|
||||||
DWORD RaceResIndex;
|
|
||||||
|
|
||||||
COUNT which_side;
|
COUNT which_side;
|
||||||
BYTE captains_name_index;
|
|
||||||
|
|
||||||
BYTE race_id;
|
BYTE race_id;
|
||||||
BYTE index;
|
BYTE index;
|
||||||
|
|||||||
Reference in New Issue
Block a user