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:
avolkov
2007-07-09 01:47:21 +00:00
parent bda96e731e
commit b38f82f969
2 changed files with 38 additions and 57 deletions
+21 -43
View File
@@ -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 /* name matched another ship */);
}
} while (hStarShip);
return name_index; return name_index;
} }
+16 -13
View File
@@ -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;