Untangling ship queues, stage 2: Unaliasing STARSHIP, SHIP_FRAGMENT and EXTENDED_SHIP_FRAGMENT (incomplete; Build, OwnStarShip and Co still aliased)

git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@2780 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
avolkov
2007-06-22 21:29:44 +00:00
parent e08a6cb5a1
commit 6276e33e2f
30 changed files with 376 additions and 331 deletions
+39 -22
View File
@@ -36,6 +36,8 @@ Build (QUEUE *pQueue, DWORD RaceResIndex, COUNT which_player, BYTE
{ {
STARSHIP *StarShipPtr; STARSHIP *StarShipPtr;
// XXX: STARSHIP refactor; The last remaining aliasing between
// STARSHIP and SHIP_FRAGMENT structs
StarShipPtr = LockStarShip (pQueue, hNewShip); StarShipPtr = LockStarShip (pQueue, hNewShip);
memset (StarShipPtr, 0, GetLinkSize (pQueue)); memset (StarShipPtr, 0, GetLinkSize (pQueue));
@@ -49,19 +51,19 @@ Build (QUEUE *pQueue, DWORD RaceResIndex, COUNT which_player, BYTE
return (hNewShip); return (hNewShip);
} }
HSTARSHIP HLINK
GetStarShipFromIndex (QUEUE *pShipQ, COUNT Index) GetStarShipFromIndex (QUEUE *pShipQ, COUNT Index)
{ {
HSTARSHIP hStarShip, hNextShip; HLINK hStarShip, hNextShip;
for (hStarShip = GetHeadLink (pShipQ); for (hStarShip = GetHeadLink (pShipQ);
Index > 0 && hStarShip; hStarShip = hNextShip, --Index) Index > 0 && hStarShip; hStarShip = hNextShip, --Index)
{ {
STARSHIP *StarShipPtr; LINK *StarShipPtr;
StarShipPtr = LockStarShip (pShipQ, hStarShip); StarShipPtr = LockLink (pShipQ, hStarShip);
hNextShip = _GetSuccLink (StarShipPtr); hNextShip = _GetSuccLink (StarShipPtr);
UnlockStarShip (pShipQ, hStarShip); UnlockLink (pShipQ, hStarShip);
} }
return (hStarShip); return (hStarShip);
@@ -183,8 +185,8 @@ ActivateStarShip (COUNT which_ship, SIZE state)
case CHECK_ALLIANCE: case CHECK_ALLIANCE:
{ {
COUNT flags; COUNT flags;
SHIP_FRAGMENT *StarShipPtr = (SHIP_FRAGMENT*) LockStarShip ( EXTENDED_SHIP_FRAGMENT *StarShipPtr = (EXTENDED_SHIP_FRAGMENT*)
&GLOBAL (avail_race_q), hStarShip); LockStarShip (&GLOBAL (avail_race_q), hStarShip);
flags = StarShipPtr->ShipInfo.ship_flags & (GOOD_GUY | BAD_GUY); flags = StarShipPtr->ShipInfo.ship_flags & (GOOD_GUY | BAD_GUY);
UnlockStarShip (&GLOBAL (avail_race_q), hStarShip); UnlockStarShip (&GLOBAL (avail_race_q), hStarShip);
return flags; return flags;
@@ -192,8 +194,8 @@ ActivateStarShip (COUNT which_ship, SIZE state)
case SET_ALLIED: case SET_ALLIED:
case SET_NOT_ALLIED: case SET_NOT_ALLIED:
{ {
SHIP_FRAGMENT *StarShipPtr = (SHIP_FRAGMENT*) LockStarShip ( EXTENDED_SHIP_FRAGMENT *StarShipPtr = (EXTENDED_SHIP_FRAGMENT*)
&GLOBAL (avail_race_q), hStarShip); LockStarShip (&GLOBAL (avail_race_q), hStarShip);
if (!(StarShipPtr->ShipInfo.ship_flags & (GOOD_GUY | BAD_GUY))) if (!(StarShipPtr->ShipInfo.ship_flags & (GOOD_GUY | BAD_GUY)))
{ /* Strange request, silently ignore it */ { /* Strange request, silently ignore it */
@@ -272,6 +274,8 @@ ActivateStarShip (COUNT which_ship, SIZE state)
StarShipPtr = (SHIP_FRAGMENT*) LockStarShip ( StarShipPtr = (SHIP_FRAGMENT*) LockStarShip (
&GLOBAL (built_ship_q), hOldShip); &GLOBAL (built_ship_q), hOldShip);
// XXX: hack; escort window is not group loc,
// should just use queue index (already var2)
win_loc = GET_GROUP_LOC (StarShipPtr); win_loc = GET_GROUP_LOC (StarShipPtr);
UnlockStarShip (&GLOBAL (built_ship_q), hOldShip); UnlockStarShip (&GLOBAL (built_ship_q), hOldShip);
if (which_window <= win_loc) if (which_window <= win_loc)
@@ -280,6 +284,8 @@ ActivateStarShip (COUNT which_ship, SIZE state)
StarShipPtr = (SHIP_FRAGMENT*) LockStarShip ( StarShipPtr = (SHIP_FRAGMENT*) LockStarShip (
&GLOBAL (built_ship_q), hStarShip); &GLOBAL (built_ship_q), hStarShip);
// XXX: hack; escort window is not group loc,
// should just use queue index (already var2)
SET_GROUP_LOC (StarShipPtr, which_window - 1); SET_GROUP_LOC (StarShipPtr, which_window - 1);
UnlockStarShip (&GLOBAL (built_ship_q), hStarShip); UnlockStarShip (&GLOBAL (built_ship_q), hStarShip);
@@ -298,19 +304,19 @@ ActivateStarShip (COUNT which_ship, SIZE state)
} }
COUNT COUNT
GetIndexFromStarShip (QUEUE *pShipQ, HSTARSHIP hStarShip) GetIndexFromStarShip (QUEUE *pShipQ, HLINK hStarShip)
{ {
COUNT Index; COUNT Index;
Index = 0; Index = 0;
while (hStarShip != GetHeadLink (pShipQ)) while (hStarShip != GetHeadLink (pShipQ))
{ {
HSTARSHIP hNextShip; HLINK hNextShip;
STARSHIP *StarShipPtr; LINK *StarShipPtr;
StarShipPtr = LockStarShip (pShipQ, hStarShip); StarShipPtr = LockLink (pShipQ, hStarShip);
hNextShip = _GetPredLink (StarShipPtr); hNextShip = _GetPredLink (StarShipPtr);
UnlockStarShip (pShipQ, hStarShip); UnlockLink (pShipQ, hStarShip);
hStarShip = hNextShip; hStarShip = hNextShip;
++Index; ++Index;
@@ -320,7 +326,7 @@ GetIndexFromStarShip (QUEUE *pShipQ, HSTARSHIP hStarShip)
} }
BYTE BYTE
NameCaptain (QUEUE *pQueue, STARSHIP *StarShipPtr) NameCaptain (QUEUE *pQueue, DWORD RaceResIndex)
{ {
BYTE name_index; BYTE name_index;
HSTARSHIP hStarShip; HSTARSHIP hStarShip;
@@ -336,10 +342,14 @@ NameCaptain (QUEUE *pQueue, STARSHIP *StarShipPtr)
TestShipPtr = LockStarShip (pQueue, hStarShip); TestShipPtr = LockStarShip (pQueue, hStarShip);
hNextShip = _GetSuccLink (TestShipPtr); hNextShip = _GetSuccLink (TestShipPtr);
if (TestShipPtr->RaceResIndex == StarShipPtr->RaceResIndex) if (TestShipPtr->RaceResIndex == RaceResIndex)
{ {
BOOLEAN SameName; BOOLEAN SameName;
// XXX: STARSHIP refactor; The last remaining aliasing between
// STARSHIP and SHIP_FRAGMENT structs
// This hack will not be needed once
// STARSHIP maintains captain/side permanently
if (LOBYTE (GLOBAL (CurrentActivity)) == SUPER_MELEE) if (LOBYTE (GLOBAL (CurrentActivity)) == SUPER_MELEE)
SameName = (name_index == TestShipPtr->captains_name_index); SameName = (name_index == TestShipPtr->captains_name_index);
else else
@@ -364,27 +374,34 @@ HSTARSHIP
CloneShipFragment (COUNT shipIndex, QUEUE *pDstQueue, COUNT crew_level) CloneShipFragment (COUNT shipIndex, QUEUE *pDstQueue, COUNT crew_level)
{ {
HSTARSHIP hStarShip, hBuiltShip; HSTARSHIP hStarShip, hBuiltShip;
SHIP_FRAGMENT *TemplatePtr; EXTENDED_SHIP_FRAGMENT *TemplatePtr;
hStarShip = GetStarShipFromIndex (&GLOBAL (avail_race_q), shipIndex); hStarShip = GetStarShipFromIndex (&GLOBAL (avail_race_q), shipIndex);
if (hStarShip == 0) if (hStarShip == 0)
return 0; return 0;
TemplatePtr = (SHIP_FRAGMENT*) LockStarShip ( TemplatePtr = (EXTENDED_SHIP_FRAGMENT *) LockStarShip (
&GLOBAL (avail_race_q), hStarShip); &GLOBAL (avail_race_q), hStarShip);
hBuiltShip = Build (pDstQueue, TemplatePtr->RaceResIndex, hBuiltShip = Build (pDstQueue, TemplatePtr->RaceResIndex,
TemplatePtr->ShipInfo.ship_flags & (GOOD_GUY | BAD_GUY), TemplatePtr->ShipInfo.ship_flags & (GOOD_GUY | BAD_GUY),
(BYTE)(shipIndex == SAMATRA_SHIP ? (BYTE)(shipIndex == SAMATRA_SHIP ?
0 : NameCaptain (pDstQueue, (STARSHIP*)TemplatePtr))); 0 : NameCaptain (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->ShipInfo = TemplatePtr->ShipInfo; // XXX: SHIP_INFO struct copy
ShipFragPtr->ShipInfo.race_strings = TemplatePtr->ShipInfo.race_strings;
ShipFragPtr->ShipInfo.icons = TemplatePtr->ShipInfo.icons;
ShipFragPtr->ShipInfo.melee_icon = TemplatePtr->ShipInfo.melee_icon;
if (crew_level) if (crew_level)
ShipFragPtr->ShipInfo.crew_level = crew_level; ShipFragPtr->ShipInfo.crew_level = crew_level;
else
ShipFragPtr->ShipInfo.crew_level = TemplatePtr->ShipInfo.crew_level;
ShipFragPtr->ShipInfo.max_crew = TemplatePtr->ShipInfo.max_crew;
ShipFragPtr->ShipInfo.energy_level = 0; ShipFragPtr->ShipInfo.energy_level = 0;
ShipFragPtr->ShipInfo.max_energy = TemplatePtr->ShipInfo.max_energy;
ShipFragPtr->ShipInfo.ship_flags = 0; ShipFragPtr->ShipInfo.ship_flags = 0;
ShipFragPtr->ShipInfo.var1 = 0; ShipFragPtr->ShipInfo.var1 = 0;
ShipFragPtr->ShipInfo.var2 = 0; ShipFragPtr->ShipInfo.var2 = 0;
@@ -404,7 +421,7 @@ int
SetEscortCrewComplement (COUNT which_ship, COUNT crew_level, BYTE captain) SetEscortCrewComplement (COUNT which_ship, COUNT crew_level, BYTE captain)
{ {
HSTARSHIP hTemplateShip; HSTARSHIP hTemplateShip;
SHIP_FRAGMENT *TemplatePtr; EXTENDED_SHIP_FRAGMENT *TemplatePtr;
HSTARSHIP hStarShip; HSTARSHIP hStarShip;
HSTARSHIP hNextShip; HSTARSHIP hNextShip;
SHIP_FRAGMENT *StarShipPtr = 0; SHIP_FRAGMENT *StarShipPtr = 0;
@@ -413,7 +430,7 @@ SetEscortCrewComplement (COUNT which_ship, COUNT crew_level, BYTE captain)
hTemplateShip = GetStarShipFromIndex (&GLOBAL (avail_race_q), which_ship); hTemplateShip = GetStarShipFromIndex (&GLOBAL (avail_race_q), which_ship);
if (!hTemplateShip) if (!hTemplateShip)
return -1; return -1;
TemplatePtr = (SHIP_FRAGMENT*) LockStarShip ( TemplatePtr = (EXTENDED_SHIP_FRAGMENT*) LockStarShip (
&GLOBAL (avail_race_q), hTemplateShip); &GLOBAL (avail_race_q), hTemplateShip);
/* Find first ship of which_ship race */ /* Find first ship of which_ship race */
+8 -6
View File
@@ -33,6 +33,7 @@
#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) \ #define OwnStarShip(S,p,n) \
(S)->s.Player = (p); \ (S)->s.Player = (p); \
(S)->s.Captain = (n); (S)->s.Captain = (n);
@@ -48,8 +49,8 @@ extern HSTARSHIP Build (QUEUE *pQueue, DWORD RaceResIndex, COUNT
which_player, BYTE captains_name_index); 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 HSTARSHIP GetStarShipFromIndex (QUEUE *pShipQ, COUNT Index); extern HLINK GetStarShipFromIndex (QUEUE *pShipQ, COUNT Index);
extern BYTE NameCaptain (QUEUE *pQueue, STARSHIP *StarShipPtr); extern BYTE NameCaptain (QUEUE *pQueue, DWORD RaceResIndex);
/* Possible values for the 'state' argument of /* Possible values for the 'state' argument of
* COUNT ActivateStarShip (COUNT which_ship, SIZE state) * COUNT ActivateStarShip (COUNT which_ship, SIZE state)
@@ -67,7 +68,7 @@ extern BYTE NameCaptain (QUEUE *pQueue, STARSHIP *StarShipPtr);
/* Check for how many escort ships there's still space */ /* Check for how many escort ships there's still space */
extern COUNT ActivateStarShip (COUNT which_ship, SIZE state); extern COUNT ActivateStarShip (COUNT which_ship, SIZE state);
extern COUNT GetIndexFromStarShip (QUEUE *pShipQ, HSTARSHIP hStarShip); extern COUNT GetIndexFromStarShip (QUEUE *pShipQ, HLINK hStarShip);
extern int SetEscortCrewComplement (COUNT which_ship, COUNT crew_level, extern int SetEscortCrewComplement (COUNT which_ship, COUNT crew_level,
BYTE captain); BYTE captain);
@@ -78,10 +79,11 @@ extern void free_ship (RACE_DESC *RaceDescPtr, BOOLEAN FreeIconData,
extern void DrawCrewFuelString (COORD y, SIZE state); extern void DrawCrewFuelString (COORD y, SIZE state);
extern void ClearShipStatus (COORD y); extern void ClearShipStatus (COORD y);
extern void OutlineShipStatus (COORD y); extern void OutlineShipStatus (COORD y);
extern void InitShipStatus (STARSHIP *StarShipPtr, RECT *pClipRect); extern void InitShipStatus (SHIP_INFO *ShipInfoPtr, BYTE captains_name_index,
extern void DeltaStatistics (STARSHIP *StarShipPtr, SIZE crew_delta, RECT *pClipRect);
extern void DeltaStatistics (SHIP_INFO *ShipInfoPtr, SIZE crew_delta,
SIZE energy_delta); SIZE energy_delta);
extern void DrawBattleCrewAmount (STARSHIP *StarShipPtr); extern void DrawBattleCrewAmount (SHIP_INFO *ShipInfoPtr);
#endif /* _BUILD_H */ #endif /* _BUILD_H */
+1 -1
View File
@@ -42,7 +42,7 @@ typedef struct
/* Queue element is EVENT */ /* Queue element is EVENT */
} CLOCK_STATE; } CLOCK_STATE;
typedef QUEUE_HANDLE HEVENT; typedef HLINK HEVENT;
typedef struct event typedef struct event
{ {
+24 -15
View File
@@ -1595,6 +1595,7 @@ RaceCommunication (void)
COUNT i, status; COUNT i, status;
HSTARSHIP hStarShip; HSTARSHIP hStarShip;
SHIP_FRAGMENT *FragPtr; SHIP_FRAGMENT *FragPtr;
HENCOUNTER hEncounter = 0;
RESOURCE RaceComm[] = RESOURCE RaceComm[] =
{ {
RACE_COMMUNICATION RACE_COMMUNICATION
@@ -1650,8 +1651,8 @@ RaceCommunication (void)
} }
else else
{ {
/* Encounter with a black globe in HS, prepare enemy ship list */
COUNT NumShips; COUNT NumShips;
HENCOUNTER hEncounter;
ENCOUNTER *EncounterPtr; ENCOUNTER *EncounterPtr;
hEncounter = GetHeadEncounter (); hEncounter = GetHeadEncounter ();
@@ -1660,11 +1661,15 @@ RaceCommunication (void)
NumShips = LONIBBLE (EncounterPtr->SD.Index); NumShips = LONIBBLE (EncounterPtr->SD.Index);
for (i = 0; i < NumShips; ++i) for (i = 0; i < NumShips; ++i)
{ {
// XXX: Bug 996 lives here: crew is set to default (0)
// None of ship info is actually used!
CloneShipFragment (EncounterPtr->SD.Type, CloneShipFragment (EncounterPtr->SD.Type,
&GLOBAL (npc_built_ship_q), 0); &GLOBAL (npc_built_ship_q), 0);
} }
CurStarDescPtr = (STAR_DESC*)&EncounterPtr->SD; // XXX: Bug: CurStarDescPtr was abused to point within
// an ENCOUNTER struct, which is immediately unlocked
//CurStarDescPtr = (STAR_DESC*)&EncounterPtr->SD;
UnlockEncounter (hEncounter); UnlockEncounter (hEncounter);
} }
} }
@@ -1689,38 +1694,42 @@ RaceCommunication (void)
if (i == SLYLANDRO_SHIP && status == 0) if (i == SLYLANDRO_SHIP && status == 0)
ReinitQueue (&GLOBAL (npc_built_ship_q)); ReinitQueue (&GLOBAL (npc_built_ship_q));
} }
else else if (hEncounter)
{
EXTENDED_STAR_DESC *pESD;
pESD = (EXTENDED_STAR_DESC*)CurStarDescPtr;
if (pESD)
{ {
/* Update HSpace encounter info, ships lefts, etc. */
BYTE i, NumShips; BYTE i, NumShips;
ENCOUNTER *EncounterPtr;
LockEncounter (hEncounter, &EncounterPtr);
NumShips = (BYTE)CountLinks (&GLOBAL (npc_built_ship_q)); NumShips = (BYTE)CountLinks (&GLOBAL (npc_built_ship_q));
pESD->Index = MAKE_BYTE (NumShips, HINIBBLE (pESD->Index)); EncounterPtr->SD.Index = MAKE_BYTE (NumShips,
pESD->Index |= ENCOUNTER_REFORMING; HINIBBLE (EncounterPtr->SD.Index));
EncounterPtr->SD.Index |= ENCOUNTER_REFORMING;
if (status == 0) if (status == 0)
pESD->Index |= ONE_SHOT_ENCOUNTER; EncounterPtr->SD.Index |= ONE_SHOT_ENCOUNTER;
for (i = 0; i < NumShips; ++i) for (i = 0; i < NumShips; ++i)
{ {
HSTARSHIP hStarShip; HSTARSHIP hStarShip;
SHIP_FRAGMENT *TemplatePtr; SHIP_FRAGMENT *TemplatePtr;
BRIEF_SHIP_INFO *BSIPtr;
hStarShip = GetStarShipFromIndex ( hStarShip = GetStarShipFromIndex (
&GLOBAL (npc_built_ship_q), i); &GLOBAL (npc_built_ship_q), i);
TemplatePtr = (SHIP_FRAGMENT*) LockStarShip ( TemplatePtr = (SHIP_FRAGMENT*) LockStarShip (
&GLOBAL (npc_built_ship_q), hStarShip); &GLOBAL (npc_built_ship_q), hStarShip);
pESD->ShipList[i] = TemplatePtr->ShipInfo; // XXX: SHIP_INFO struct copy
pESD->ShipList[i].var1 = GET_RACE_ID (TemplatePtr); BSIPtr = &EncounterPtr->ShipList[i];
BSIPtr->race_id = GET_RACE_ID (TemplatePtr);
BSIPtr->crew_level = TemplatePtr->ShipInfo.crew_level;
BSIPtr->max_crew = TemplatePtr->ShipInfo.max_crew;
BSIPtr->max_energy = TemplatePtr->ShipInfo.max_energy;
UnlockStarShip (&GLOBAL (npc_built_ship_q), hStarShip); UnlockStarShip (&GLOBAL (npc_built_ship_q), hStarShip);
} }
UnlockEncounter (hEncounter);
ReinitQueue (&GLOBAL (npc_built_ship_q)); ReinitQueue (&GLOBAL (npc_built_ship_q));
CurStarDescPtr = 0;
}
} }
} }
+1 -1
View File
@@ -41,7 +41,7 @@
#define NORMAL_LIFE 1 #define NORMAL_LIFE 1
typedef QUEUE_HANDLE HELEMENT; typedef HLINK HELEMENT;
// Bits for ELEMENT_FLAGS: // Bits for ELEMENT_FLAGS:
#define GOOD_GUY (1 << 0) #define GOOD_GUY (1 << 0)
+9 -6
View File
@@ -25,7 +25,7 @@
#include "races.h" #include "races.h"
typedef QUEUE_HANDLE HENCOUNTER; typedef HLINK HENCOUNTER;
#define MAX_HYPER_SHIPS 7 #define MAX_HYPER_SHIPS 7
#define ONE_SHOT_ENCOUNTER (1 << 7) #define ONE_SHOT_ENCOUNTER (1 << 7)
@@ -33,10 +33,12 @@ typedef QUEUE_HANDLE HENCOUNTER;
typedef struct typedef struct
{ {
POINT star_pt; BYTE race_id;
BYTE Type, Index; COUNT crew_level;
SHIP_INFO ShipList[MAX_HYPER_SHIPS]; COUNT max_crew;
} EXTENDED_STAR_DESC; BYTE max_energy;
} BRIEF_SHIP_INFO;
typedef struct typedef struct
{ {
@@ -48,7 +50,8 @@ typedef struct
POINT origin; POINT origin;
COUNT radius; COUNT radius;
EXTENDED_STAR_DESC SD; STAR_DESC SD;
BRIEF_SHIP_INFO ShipList[MAX_HYPER_SHIPS];
SDWORD log_x, log_y; SDWORD log_x, log_y;
} ENCOUNTER; } ENCOUNTER;
+46 -27
View File
@@ -172,6 +172,23 @@ LoadSC2Data (void)
return TRUE; return TRUE;
} }
static void
copyFleetInfo (EXTENDED_SHIP_INFO *dst, SHIP_INFO *src, BYTE *fleet_strength)
{
*fleet_strength = src->var2;
// other leading fields are irrelevant
dst->crew_level = src->crew_level;
dst->max_crew = src->max_crew;
dst->energy_level = src->energy_level;
dst->max_energy = src->max_energy;
dst->loc = src->loc;
dst->race_strings = src->race_strings;
dst->icons = src->icons;
dst->melee_icon = src->melee_icon;
}
BOOLEAN BOOLEAN
InitSIS (void) InitSIS (void)
{ {
@@ -210,10 +227,10 @@ InitSIS (void)
hStarShip = Build (&GLOBAL (avail_race_q), ship_ref, 0, 0); hStarShip = Build (&GLOBAL (avail_race_q), ship_ref, 0, 0);
if (hStarShip) if (hStarShip)
{ {
SHIP_FRAGMENT *FragPtr; EXTENDED_SHIP_FRAGMENT *FleetPtr;
EXTENDED_SHIP_FRAGMENT *ExtFragPtr; BYTE fleet_strength = 0;
FragPtr = (SHIP_FRAGMENT*) LockStarShip ( FleetPtr = (EXTENDED_SHIP_FRAGMENT*) LockStarShip (
&GLOBAL (avail_race_q), hStarShip); &GLOBAL (avail_race_q), hStarShip);
if (i < num_ships - 1) if (i < num_ships - 1)
{ {
@@ -224,38 +241,41 @@ InitSIS (void)
MasterShipPtr = (SHIP_FRAGMENT *) LockStarShip (&master_q, MasterShipPtr = (SHIP_FRAGMENT *) LockStarShip (&master_q,
hMasterShip); hMasterShip);
// Grab a copy of loaded icons and strings (not owned) // Grab a copy of loaded icons and strings (not owned)
FragPtr->ShipInfo = MasterShipPtr->ShipInfo; // XXX: SHIP_INFO struct copy
copyFleetInfo (&FleetPtr->ShipInfo, &MasterShipPtr->ShipInfo,
&fleet_strength);
UnlockStarShip (&master_q, hMasterShip); UnlockStarShip (&master_q, hMasterShip);
} }
else else
{ {
// Ur-Quan probe. // Ur-Quan probe.
RACE_DESC *RDPtr = load_ship (FragPtr->RaceResIndex, RACE_DESC *RDPtr = load_ship (FleetPtr->RaceResIndex,
FALSE); FALSE);
if (RDPtr) if (RDPtr)
{ // Grab a copy of loaded icons and strings { // Grab a copy of loaded icons and strings
// XXX: SHIP_INFO struct copy
copyFleetInfo (&FleetPtr->ShipInfo, &RDPtr->ship_info,
&fleet_strength);
// avail_race_q owns these resources now // avail_race_q owns these resources now
FragPtr->ShipInfo = RDPtr->ship_info;
free_ship (RDPtr, FALSE, FALSE); free_ship (RDPtr, FALSE, FALSE);
} }
} }
ExtFragPtr = (EXTENDED_SHIP_FRAGMENT*)FragPtr; FleetPtr->ShipInfo.ship_flags = BAD_GUY;
ExtFragPtr->ShipInfo.ship_flags = BAD_GUY; FleetPtr->ShipInfo.known_strength = 0;
ExtFragPtr->ShipInfo.known_strength = 0; FleetPtr->ShipInfo.known_loc = FleetPtr->ShipInfo.loc;
ExtFragPtr->ShipInfo.known_loc = ExtFragPtr->ShipInfo.loc; if (fleet_strength == (BYTE)~0)
if (FragPtr->ShipInfo.var2 == (BYTE)~0) FleetPtr->ShipInfo.actual_strength = (COUNT)~0;
ExtFragPtr->ShipInfo.actual_strength = (COUNT)~0;
else if (i == YEHAT_REBEL_SHIP) else if (i == YEHAT_REBEL_SHIP)
ExtFragPtr->ShipInfo.actual_strength = 0; FleetPtr->ShipInfo.actual_strength = 0;
else else
ExtFragPtr->ShipInfo.actual_strength = FleetPtr->ShipInfo.actual_strength =
(COUNT)FragPtr->ShipInfo.var2 << 1; (COUNT)fleet_strength << 1;
ExtFragPtr->ShipInfo.growth_fract = 0; FleetPtr->ShipInfo.growth_fract = 0;
ExtFragPtr->ShipInfo.growth_err_term = 255 >> 1; FleetPtr->ShipInfo.growth_err_term = 255 >> 1;
ExtFragPtr->ShipInfo.energy_level = 0; FleetPtr->ShipInfo.energy_level = 0;
ExtFragPtr->ShipInfo.days_left = 0; FleetPtr->ShipInfo.days_left = 0;
ExtFragPtr->ExtShipInfoPtr = &ExtFragPtr->ShipInfo; FleetPtr->ShipInfo.func_index = ~0;
UnlockStarShip (&GLOBAL (avail_race_q), hStarShip); UnlockStarShip (&GLOBAL (avail_race_q), hStarShip);
} }
@@ -388,15 +408,14 @@ UninitSIS (void)
hStarShip = GetTailLink (&GLOBAL (avail_race_q)); hStarShip = GetTailLink (&GLOBAL (avail_race_q));
if (hStarShip) if (hStarShip)
{ {
STARSHIP *StarShipPtr; EXTENDED_SHIP_FRAGMENT *FragPtr;
StarShipPtr = LockStarShip (&GLOBAL (avail_race_q), hStarShip); FragPtr = (EXTENDED_SHIP_FRAGMENT *) LockStarShip (
DestroyDrawable (ReleaseDrawable ( &GLOBAL (avail_race_q), hStarShip);
StarShipPtr->RaceDescPtr->ship_info.melee_icon)); DestroyDrawable (ReleaseDrawable (FragPtr->ShipInfo.melee_icon));
DestroyDrawable (ReleaseDrawable ( DestroyDrawable (ReleaseDrawable (FragPtr->ShipInfo.icons));
StarShipPtr->RaceDescPtr->ship_info.icons));
DestroyStringTable (ReleaseStringTable ( DestroyStringTable (ReleaseStringTable (
StarShipPtr->RaceDescPtr->ship_info.race_strings)); FragPtr->ShipInfo.race_strings));
UnlockStarShip (&GLOBAL (avail_race_q), hStarShip); UnlockStarShip (&GLOBAL (avail_race_q), hStarShip);
} }
+3
View File
@@ -511,6 +511,9 @@ 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
// because SHIP_INFO.ship_flags is used for
// group_counter
OwnStarShip (FragPtr, BAD_GUY, 0); OwnStarShip (FragPtr, BAD_GUY, 0);
SET_GROUP_ID (FragPtr, which_group); SET_GROUP_ID (FragPtr, which_group);
+8 -4
View File
@@ -952,13 +952,17 @@ AddEncounterElement (ENCOUNTER *EncounterPtr, POINT *puniverse)
for (i = 0; i < NumShips; ++i) for (i = 0; i < NumShips; ++i)
{ {
HSTARSHIP hStarShip; HSTARSHIP hStarShip;
SHIP_FRAGMENT *TemplatePtr; EXTENDED_SHIP_FRAGMENT *TemplatePtr;
BRIEF_SHIP_INFO *BSIPtr = &EncounterPtr->ShipList[i];
hStarShip = GetStarShipFromIndex (&GLOBAL (avail_race_q), Type); hStarShip = GetStarShipFromIndex (&GLOBAL (avail_race_q), Type);
TemplatePtr = (SHIP_FRAGMENT*) LockStarShip ( TemplatePtr = (EXTENDED_SHIP_FRAGMENT*) LockStarShip (
&GLOBAL (avail_race_q), hStarShip); &GLOBAL (avail_race_q), hStarShip);
EncounterPtr->SD.ShipList[i] = TemplatePtr->ShipInfo; // XXX: SHIP_INFO struct copy
EncounterPtr->SD.ShipList[i].var1 = Type; BSIPtr->race_id = Type;
BSIPtr->crew_level = TemplatePtr->ShipInfo.crew_level;
BSIPtr->max_crew = TemplatePtr->ShipInfo.max_crew;
BSIPtr->max_energy = TemplatePtr->ShipInfo.max_energy;
UnlockStarShip (&GLOBAL (avail_race_q), hStarShip); UnlockStarShip (&GLOBAL (avail_race_q), hStarShip);
} }
+9 -33
View File
@@ -234,36 +234,33 @@ LoadEncounter (ENCOUNTER *EncounterPtr, DECODE_REF fh)
cread_16 (fh, &EncounterPtr->origin.x); cread_16 (fh, &EncounterPtr->origin.x);
cread_16 (fh, &EncounterPtr->origin.y); cread_16 (fh, &EncounterPtr->origin.y);
cread_16 (fh, &EncounterPtr->radius); cread_16 (fh, &EncounterPtr->radius);
// EXTENDED_STAR_DESC fields // STAR_DESC fields
cread_16 (fh, &EncounterPtr->SD.star_pt.x); cread_16 (fh, &EncounterPtr->SD.star_pt.x);
cread_16 (fh, &EncounterPtr->SD.star_pt.y); cread_16 (fh, &EncounterPtr->SD.star_pt.y);
cread_8 (fh, &EncounterPtr->SD.Type); cread_8 (fh, &EncounterPtr->SD.Type);
cread_8 (fh, &EncounterPtr->SD.Index); cread_8 (fh, &EncounterPtr->SD.Index);
cread_16 (fh, NULL); /* alignment padding */ cread_16 (fh, NULL); /* alignment padding */
// Load each entry in the SHIP_INFO array: // Load each entry in the BRIEF_SHIP_INFO array
for (i = 0; i < MAX_HYPER_SHIPS; i++) for (i = 0; i < MAX_HYPER_SHIPS; i++)
{ {
SHIP_INFO *ShipInfo = &EncounterPtr->SD.ShipList[i]; BRIEF_SHIP_INFO *ShipInfo = &EncounterPtr->ShipList[i];
BYTE tmpb; BYTE tmpb;
cread_16 (fh, &ShipInfo->ship_flags); cread_16 (fh, NULL); /* useless; was SHIP_INFO.ship_flags */
cread_8 (fh, &ShipInfo->var1); cread_8 (fh, &ShipInfo->race_id);
cread_8 (fh, &ShipInfo->var2); cread_8 (fh, NULL); /* useless; was SHIP_INFO.var2 */
cread_8 (fh, &tmpb); cread_8 (fh, &tmpb);
ShipInfo->crew_level = tmpb; ShipInfo->crew_level = tmpb;
cread_8 (fh, &tmpb); cread_8 (fh, &tmpb);
ShipInfo->max_crew = tmpb; ShipInfo->max_crew = tmpb;
cread_8 (fh, &ShipInfo->energy_level); cread_8 (fh, NULL); /* useless; was SHIP_INFO.energy_level */
cread_8 (fh, &ShipInfo->max_energy); cread_8 (fh, &ShipInfo->max_energy);
cread_16 (fh, &ShipInfo->loc.x); cread_16 (fh, NULL); /* useless; was SHIP_INFO.loc.x */
cread_16 (fh, &ShipInfo->loc.y); cread_16 (fh, NULL); /* useless; was SHIP_INFO.loc.y */
cread_32 (fh, NULL); /* useless val; STRING race_strings */ cread_32 (fh, NULL); /* useless val; STRING race_strings */
ShipInfo->race_strings = 0;
cread_ptr (fh); /* useless ptr; FRAME icons */ cread_ptr (fh); /* useless ptr; FRAME icons */
ShipInfo->icons = 0;
cread_ptr (fh); /* useless ptr; FRAME melee_icon */ cread_ptr (fh); /* useless ptr; FRAME melee_icon */
ShipInfo->melee_icon = 0;
} }
// Load the stuff after the SHIP_INFO array: // Load the stuff after the SHIP_INFO array:
@@ -555,7 +552,6 @@ LoadGame (COUNT which_game, SUMMARY_DESC *SummPtr)
{ {
while (num_links--) while (num_links--)
{ {
BYTE i, NumShips;
HENCOUNTER hEncounter; HENCOUNTER hEncounter;
ENCOUNTER *EncounterPtr; ENCOUNTER *EncounterPtr;
@@ -564,26 +560,6 @@ LoadGame (COUNT which_game, SUMMARY_DESC *SummPtr)
LoadEncounter (EncounterPtr, fh); LoadEncounter (EncounterPtr, fh);
NumShips = LONIBBLE (EncounterPtr->SD.Index);
for (i = 0; i < NumShips; ++i)
{
HSTARSHIP hStarShip;
SHIP_FRAGMENT *TemplatePtr;
hStarShip = GetStarShipFromIndex (
&GLOBAL (avail_race_q),
EncounterPtr->SD.ShipList[i].var1);
TemplatePtr = (SHIP_FRAGMENT*) LockStarShip (
&GLOBAL (avail_race_q), hStarShip);
EncounterPtr->SD.ShipList[i].race_strings =
TemplatePtr->ShipInfo.race_strings;
EncounterPtr->SD.ShipList[i].icons =
TemplatePtr->ShipInfo.icons;
EncounterPtr->SD.ShipList[i].melee_icon =
TemplatePtr->ShipInfo.melee_icon;
UnlockStarShip (&GLOBAL (avail_race_q), hStarShip);
}
UnlockEncounter (hEncounter); UnlockEncounter (hEncounter);
PutEncounter (hEncounter); PutEncounter (hEncounter);
} }
+26 -2
View File
@@ -65,10 +65,9 @@ LoadMasterShipList (void (* YieldProcessing)(void))
continue; continue;
} }
// Grab a copy of loaded icons and strings // Grab a copy of loaded icons, strings and info
BuiltFragPtr->ShipInfo = RDPtr->ship_info; BuiltFragPtr->ShipInfo = RDPtr->ship_info;
free_ship (RDPtr, FALSE, FALSE); free_ship (RDPtr, FALSE, FALSE);
BuiltFragPtr->ShipInfoPtr = &BuiltFragPtr->ShipInfo;
GetStringContents (SetAbsStringTableIndex ( GetStringContents (SetAbsStringTableIndex (
BuiltFragPtr->ShipInfo.race_strings, 2 BuiltFragPtr->ShipInfo.race_strings, 2
@@ -145,3 +144,28 @@ FindMasterShip (DWORD ship_ref)
return (hStarShip); return (hStarShip);
} }
int
FindMasterShipIndex (DWORD ship_ref)
{
HSTARSHIP hStarShip;
HSTARSHIP hNextShip;
int index;
for (index = 0, hStarShip = GetHeadLink (&master_q); hStarShip;
++index, hStarShip = hNextShip)
{
DWORD ref;
SHIP_FRAGMENT *FragPtr;
FragPtr = (SHIP_FRAGMENT *) LockStarShip (&master_q, hStarShip);
hNextShip = _GetSuccLink (FragPtr);
ref = FragPtr->RaceResIndex;
UnlockStarShip (&master_q, hStarShip);
if (ref == ship_ref)
break;
}
return hStarShip ? index : -1;
}
+2
View File
@@ -27,6 +27,8 @@ extern QUEUE master_q;
extern void LoadMasterShipList (void (* YieldProcessing)(void)); extern void LoadMasterShipList (void (* YieldProcessing)(void));
extern void FreeMasterShipList (void); extern void FreeMasterShipList (void);
extern HSTARSHIP FindMasterShip (DWORD ship_ref); extern HSTARSHIP FindMasterShip (DWORD ship_ref);
extern int FindMasterShipIndex (DWORD ship_ref);
#endif /* _MASTER_H */ #endif /* _MASTER_H */
+77 -65
View File
@@ -256,6 +256,60 @@ GetShipColumn (int index)
return index % NUM_MELEE_COLUMNS; return index % NUM_MELEE_COLUMNS;
} }
static COUNT
GetShipCostFromIndex (unsigned Index)
{
HSTARSHIP hStarShip;
SHIP_FRAGMENT *FragPtr;
COUNT val;
hStarShip = GetStarShipFromIndex (&master_q, Index);
if (!hStarShip)
return 0;
FragPtr = (SHIP_FRAGMENT *) LockStarShip (&master_q, hStarShip);
val = FragPtr->ShipInfo.ship_cost;
UnlockStarShip (&master_q, hStarShip);
return val;
}
static FRAME
GetShipIconsFromIndex (unsigned Index)
{
HSTARSHIP hStarShip;
SHIP_FRAGMENT *FragPtr;
FRAME val;
hStarShip = GetStarShipFromIndex (&master_q, Index);
if (!hStarShip)
return 0;
FragPtr = (SHIP_FRAGMENT *) LockStarShip (&master_q, hStarShip);
val = FragPtr->ShipInfo.icons;
UnlockStarShip (&master_q, hStarShip);
return val;
}
static FRAME
GetShipMeleeIconsFromIndex (unsigned Index)
{
HSTARSHIP hStarShip;
SHIP_FRAGMENT *FragPtr;
FRAME val;
hStarShip = GetStarShipFromIndex (&master_q, Index);
if (!hStarShip)
return 0;
FragPtr = (SHIP_FRAGMENT *) LockStarShip (&master_q, hStarShip);
val = FragPtr->ShipInfo.melee_icon;
UnlockStarShip (&master_q, hStarShip);
return val;
}
static void static void
DrawShipBox (COUNT side, COUNT row, COUNT col, BYTE ship, BOOLEAN HiLite) DrawShipBox (COUNT side, COUNT row, COUNT col, BYTE ship, BOOLEAN HiLite)
{ {
@@ -280,17 +334,11 @@ DrawShipBox (COUNT side, COUNT row, COUNT col, BYTE ship, BOOLEAN HiLite)
if (ship != MELEE_NONE) if (ship != MELEE_NONE)
{ {
STAMP s; STAMP s;
HSTARSHIP hStarShip;
STARSHIP *StarShipPtr;
hStarShip = GetStarShipFromIndex (&master_q, ship);
StarShipPtr = LockStarShip (&master_q, hStarShip);
s.origin.x = r.corner.x + (r.extent.width >> 1); s.origin.x = r.corner.x + (r.extent.width >> 1);
s.origin.y = r.corner.y + (r.extent.height >> 1); s.origin.y = r.corner.y + (r.extent.height >> 1);
s.frame = StarShipPtr->RaceDescPtr->ship_info.melee_icon; s.frame = GetShipMeleeIconsFromIndex (ship);
DrawStamp (&s); DrawStamp (&s);
UnlockStarShip (&master_q, hStarShip);
} }
UnbatchGraphics (); UnbatchGraphics ();
} }
@@ -556,17 +604,13 @@ static void
DrawPickIcon (COUNT iship, BYTE DrawErase) DrawPickIcon (COUNT iship, BYTE DrawErase)
{ {
STAMP s; STAMP s;
HSTARSHIP hStarShip;
STARSHIP *StarShipPtr;
RECT r; RECT r;
GetFrameRect (BuildPickFrame, &r); GetFrameRect (BuildPickFrame, &r);
hStarShip = GetStarShipFromIndex (&master_q, iship);
StarShipPtr = LockStarShip (&master_q, hStarShip);
s.origin.x = r.corner.x + 20 + (iship % NUM_PICK_COLS) * 18; s.origin.x = r.corner.x + 20 + (iship % NUM_PICK_COLS) * 18;
s.origin.y = r.corner.y + 5 + (iship / NUM_PICK_COLS) * 18; s.origin.y = r.corner.y + 5 + (iship / NUM_PICK_COLS) * 18;
s.frame = StarShipPtr->RaceDescPtr->ship_info.icons; s.frame = GetShipIconsFromIndex (iship);
if (DrawErase) if (DrawErase)
{ // draw icon { // draw icon
DrawStamp (&s); DrawStamp (&s);
@@ -579,7 +623,6 @@ DrawPickIcon (COUNT iship, BYTE DrawErase)
DrawFilledStamp (&s); DrawFilledStamp (&s);
SetContextForeGroundColor (OldColor); SetContextForeGroundColor (OldColor);
} }
UnlockStarShip (&master_q, hStarShip);
} }
#ifdef NETPLAY #ifdef NETPLAY
@@ -899,8 +942,6 @@ static void
DrawMeleeShipStrings (MELEE_STATE *pMS, BYTE NewStarShip) DrawMeleeShipStrings (MELEE_STATE *pMS, BYTE NewStarShip)
{ {
RECT r, OldRect; RECT r, OldRect;
HSTARSHIP hStarShip;
STARSHIP *StarShipPtr;
CONTEXT OldContext; CONTEXT OldContext;
LockMutex (GraphicsLock); LockMutex (GraphicsLock);
@@ -950,10 +991,13 @@ DrawMeleeShipStrings (MELEE_STATE *pMS, BYTE NewStarShip)
} }
else else
{ {
hStarShip = GetStarShipFromIndex (&master_q, NewStarShip); HSTARSHIP hStarShip;
StarShipPtr = LockStarShip (&master_q, hStarShip); SHIP_FRAGMENT *FragPtr;
InitShipStatus (StarShipPtr, NULL); hStarShip = GetStarShipFromIndex (&master_q, NewStarShip);
FragPtr = (SHIP_FRAGMENT *) LockStarShip (&master_q, hStarShip);
InitShipStatus (&FragPtr->ShipInfo, ~0, NULL);
UnlockStarShip (&master_q, hStarShip); UnlockStarShip (&master_q, hStarShip);
} }
@@ -981,24 +1025,16 @@ UpdateCurrentShip (MELEE_STATE *pMS)
static COUNT static COUNT
GetShipValue (BYTE StarShip) GetShipValue (BYTE StarShip)
{ {
HSTARSHIP hStarShip; COUNT val;
if (StarShip == MELEE_NONE) if (StarShip == MELEE_NONE)
return 0; return 0;
hStarShip = GetStarShipFromIndex (&master_q, StarShip); val = GetShipCostFromIndex (StarShip);
if (hStarShip == 0) if (val == 0)
return (COUNT)~0; val = (COUNT)~0;
{
STARSHIP *StarShipPtr;
COUNT val;
StarShipPtr = LockStarShip (&master_q, hStarShip);
val = StarShipPtr->RaceDescPtr->ship_info.ship_cost;
UnlockStarShip (&master_q, hStarShip);
return val; return val;
}
} }
static COUNT static COUNT
@@ -1187,15 +1223,9 @@ DrawFileStrings (MELEE_STATE *pMS, int HiLiteState)
StarShip = pMS->FileList[bot - top].ShipList[index]; StarShip = pMS->FileList[bot - top].ShipList[index];
if (StarShip != MELEE_NONE) if (StarShip != MELEE_NONE)
{ {
HSTARSHIP hStarShip; s.frame = GetShipIconsFromIndex (StarShip);
STARSHIP *StarShipPtr;
hStarShip = GetStarShipFromIndex (&master_q, StarShip);
StarShipPtr = LockStarShip (&master_q, hStarShip);
s.frame = StarShipPtr->RaceDescPtr->ship_info.icons;
DrawStamp (&s); DrawStamp (&s);
s.origin.x += 17; s.origin.x += 17;
UnlockStarShip (&master_q, hStarShip);
} }
} }
@@ -1444,31 +1474,20 @@ static void
DeleteCurrentShip (MELEE_STATE *pMS) DeleteCurrentShip (MELEE_STATE *pMS)
{ {
RECT r; RECT r;
HSTARSHIP hStarShip;
STARSHIP *StarShipPtr;
FleetShipIndex fleetShipIndex; FleetShipIndex fleetShipIndex;
int CurIndex; int CurIndex;
fleetShipIndex = GetShipIndex (pMS->row, pMS->col); fleetShipIndex = GetShipIndex (pMS->row, pMS->col);
CurIndex = pMS->SideState[pMS->side].TeamImage.ShipList[fleetShipIndex]; CurIndex = pMS->SideState[pMS->side].TeamImage.ShipList[fleetShipIndex];
hStarShip = GetStarShipFromIndex (&master_q, CurIndex); pMS->SideState[pMS->side].star_bucks -= GetShipCostFromIndex (CurIndex);
StarShipPtr = LockStarShip (&master_q, hStarShip); pMS->SideState[pMS->side].TeamImage.ShipList[fleetShipIndex] = MELEE_NONE;
if (StarShipPtr)
{
pMS->SideState[pMS->side].star_bucks -=
StarShipPtr->RaceDescPtr->ship_info.ship_cost;
UnlockStarShip (&master_q, hStarShip);
pMS->SideState[pMS->side].TeamImage.ShipList[fleetShipIndex] =
MELEE_NONE;
}
LockMutex (GraphicsLock); LockMutex (GraphicsLock);
GetShipBox (&r, pMS->side, pMS->row, pMS->col); GetShipBox (&r, pMS->side, pMS->row, pMS->col);
RepairMeleeFrame (&r); RepairMeleeFrame (&r);
DrawTeamString (pMS, pMS->side, DTSHS_REPAIR); DrawTeamString (pMS, pMS->side, DTSHS_REPAIR);
UnlockMutex (GraphicsLock); UnlockMutex (GraphicsLock);
} }
static void static void
@@ -1672,8 +1691,6 @@ DoEdit (MELEE_STATE *pMS)
static BOOLEAN static BOOLEAN
DoPickShip (MELEE_STATE *pMS) DoPickShip (MELEE_STATE *pMS)
{ {
STARSHIP *StarShipPtr;
if (GLOBAL (CurrentActivity) & CHECK_ABORT) if (GLOBAL (CurrentActivity) & CHECK_ABORT)
return (FALSE); return (FALSE);
@@ -1718,14 +1735,8 @@ DoPickShip (MELEE_STATE *pMS)
if (!PulsedInputState.menu[KEY_MENU_CANCEL]) if (!PulsedInputState.menu[KEY_MENU_CANCEL])
{ {
// Add the currently selected ship to the fleet. // Add the currently selected ship to the fleet.
HSTARSHIP hStarShip;
hStarShip = GetStarShipFromIndex (&master_q, pMS->CurIndex);
StarShipPtr = LockStarShip (&master_q, hStarShip);
pMS->SideState[pMS->side].star_bucks += pMS->SideState[pMS->side].star_bucks +=
StarShipPtr->RaceDescPtr->ship_info.ship_cost; GetShipCostFromIndex (pMS->CurIndex);
UnlockStarShip (&master_q, hStarShip);
pMS->SideState[pMS->side].TeamImage.ShipList[index] = pMS->SideState[pMS->side].TeamImage.ShipList[index] =
pMS->CurIndex; pMS->CurIndex;
LockMutex (GraphicsLock); LockMutex (GraphicsLock);
@@ -2108,23 +2119,24 @@ BuildAndDrawShipList (MELEE_STATE *pMS)
BYTE row, col; BYTE row, col;
BYTE ship_cost; BYTE ship_cost;
HSTARSHIP hStarShip, hBuiltShip; HSTARSHIP hStarShip, hBuiltShip;
STARSHIP *StarShipPtr; SHIP_FRAGMENT *FragPtr;
STARSHIP *BuiltShipPtr; STARSHIP *BuiltShipPtr;
hStarShip = GetStarShipFromIndex (&master_q, StarShip); hStarShip = GetStarShipFromIndex (&master_q, StarShip);
StarShipPtr = LockStarShip (&master_q, hStarShip); FragPtr = (SHIP_FRAGMENT *) LockStarShip (&master_q, hStarShip);
hBuiltShip = Build (&race_q[side], StarShipPtr->RaceResIndex, hBuiltShip = Build (&race_q[side], FragPtr->RaceResIndex,
1 << side, NameCaptain (&race_q[side], StarShipPtr)); 1 << side,
NameCaptain (&race_q[side], FragPtr->RaceResIndex));
// Draw the icon. // Draw the icon.
row = GetShipRow (index); row = GetShipRow (index);
col = GetShipColumn (index); col = GetShipColumn (index);
s.origin.x = 4 + ((ICON_WIDTH + 2) * col); s.origin.x = 4 + ((ICON_WIDTH + 2) * col);
s.origin.y = 10 + ((ICON_HEIGHT + 2) * row); s.origin.y = 10 + ((ICON_HEIGHT + 2) * row);
s.frame = StarShipPtr->RaceDescPtr->ship_info.icons; s.frame = FragPtr->ShipInfo.icons;
DrawStamp (&s); DrawStamp (&s);
ship_cost = StarShipPtr->RaceDescPtr->ship_info.ship_cost; ship_cost = FragPtr->ShipInfo.ship_cost;
UnlockStarShip (&master_q, hStarShip); UnlockStarShip (&master_q, hStarShip);
BuiltShipPtr = LockStarShip (&race_q[side], hBuiltShip); BuiltShipPtr = LockStarShip (&race_q[side], hBuiltShip);
+2
View File
@@ -664,6 +664,8 @@ GetMeleeStarShips (COUNT playerMask, HSTARSHIP *ships)
{ {
STARSHIP *StarShipPtr; 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++) for (playerI = 0; playerI < NUM_PLAYERS; playerI++)
{ {
if (!gmstate.player[playerI].selecting) if (!gmstate.player[playerI].selecting)
+2 -1
View File
@@ -435,7 +435,8 @@ GetEncounterStarShip (STARSHIP *LastStarShipPtr, COUNT which_player)
} }
} }
// XXX: STARSHIP refactor; this whole thing is not really needed anymore // XXX: STARSHIP refactor; this whole thing is not really needed
// once STARSHIP maintains captain/side permanently
if (hBattleShip) if (hBattleShip)
{ {
SPtr = LockStarShip (&race_q[which_player], hBattleShip); SPtr = LockStarShip (&race_q[which_player], hBattleShip);
+8 -6
View File
@@ -38,6 +38,7 @@ ZapToUrquanEncounter (void)
ENCOUNTER *EncounterPtr; ENCOUNTER *EncounterPtr;
HSTARSHIP hStarShip; HSTARSHIP hStarShip;
EXTENDED_SHIP_FRAGMENT *TemplatePtr; EXTENDED_SHIP_FRAGMENT *TemplatePtr;
BRIEF_SHIP_INFO *BSIPtr;
LockEncounter (hEncounter, &EncounterPtr); LockEncounter (hEncounter, &EncounterPtr);
@@ -54,18 +55,19 @@ ZapToUrquanEncounter (void)
EncounterPtr->radius = TemplatePtr->ShipInfo.actual_strength; EncounterPtr->radius = TemplatePtr->ShipInfo.actual_strength;
EncounterPtr->SD.Type = URQUAN_SHIP; EncounterPtr->SD.Type = URQUAN_SHIP;
EncounterPtr->SD.Index = MAKE_BYTE (1, 0) | ONE_SHOT_ENCOUNTER; EncounterPtr->SD.Index = MAKE_BYTE (1, 0) | ONE_SHOT_ENCOUNTER;
EncounterPtr->SD.ShipList[0] = ((SHIP_FRAGMENT*)TemplatePtr)->ShipInfo; // XXX: SHIP_INFO struct copy
EncounterPtr->SD.ShipList[0].var1 = URQUAN_SHIP; BSIPtr = &EncounterPtr->ShipList[0];
BSIPtr->race_id = URQUAN_SHIP;
BSIPtr->crew_level = TemplatePtr->ShipInfo.crew_level;
BSIPtr->max_crew = TemplatePtr->ShipInfo.max_crew;
BSIPtr->max_energy = TemplatePtr->ShipInfo.max_energy;
EncounterPtr->SD.star_pt.x = 5288; EncounterPtr->SD.star_pt.x = 5288;
EncounterPtr->SD.star_pt.y = 4892; EncounterPtr->SD.star_pt.y = 4892;
EncounterPtr->log_x = UNIVERSE_TO_LOGX (EncounterPtr->SD.star_pt.x); EncounterPtr->log_x = UNIVERSE_TO_LOGX (EncounterPtr->SD.star_pt.x);
EncounterPtr->log_y = UNIVERSE_TO_LOGY (EncounterPtr->SD.star_pt.y); EncounterPtr->log_y = UNIVERSE_TO_LOGY (EncounterPtr->SD.star_pt.y);
GLOBAL_SIS (log_x) = EncounterPtr->log_x; GLOBAL_SIS (log_x) = EncounterPtr->log_x;
GLOBAL_SIS (log_y) = EncounterPtr->log_y; GLOBAL_SIS (log_y) = EncounterPtr->log_y;
UnlockStarShip ( UnlockStarShip (&GLOBAL (avail_race_q), hStarShip);
&GLOBAL (avail_race_q),
hStarShip
);
{ {
#define LOST_DAYS 15 #define LOST_DAYS 15
+3 -9
View File
@@ -93,9 +93,7 @@ BuildUrquanGuard (void)
+ COSINE (b1, STATION_RADIUS); + COSINE (b1, STATION_RADIUS);
FragPtr->ShipInfo.loc.y = org.y FragPtr->ShipInfo.loc.y = org.y
+ SINE (b1, STATION_RADIUS); + SINE (b1, STATION_RADIUS);
UnlockStarShip ( UnlockStarShip (&GLOBAL (npc_built_ship_q), hStarShip);
&GLOBAL (npc_built_ship_q), hStarShip
);
hStarShip = hNextShip; hStarShip = hNextShip;
} }
@@ -118,9 +116,7 @@ BuildUrquanGuard (void)
+ COSINE (b1, STATION_RADIUS); + COSINE (b1, STATION_RADIUS);
FragPtr->ShipInfo.loc.y = org.y FragPtr->ShipInfo.loc.y = org.y
+ SINE (b1, STATION_RADIUS); + SINE (b1, STATION_RADIUS);
UnlockStarShip ( UnlockStarShip (&GLOBAL (npc_built_ship_q), hStarShip);
&GLOBAL (npc_built_ship_q), hStarShip
);
hStarShip = hNextShip; hStarShip = hNextShip;
} }
} }
@@ -173,9 +169,7 @@ GenerateSamatra (BYTE control)
GuardEngaged = TRUE; GuardEngaged = TRUE;
} }
UnlockStarShip ( UnlockStarShip (&GLOBAL (npc_built_ship_q), hStarShip);
&GLOBAL (npc_built_ship_q), hStarShip
);
} }
if (GuardEngaged) if (GuardEngaged)
+2
View File
@@ -72,6 +72,8 @@ 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
// only the captain is needed
OwnStarShip (FragPtr, BAD_GUY, 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));
+1 -3
View File
@@ -32,9 +32,7 @@ check_scout (void)
HSTARSHIP hStarShip; HSTARSHIP hStarShip;
if (GLOBAL (BattleGroupRef) if (GLOBAL (BattleGroupRef)
&& (hStarShip = GetHeadLink ( && (hStarShip = GetHeadLink (&GLOBAL (npc_built_ship_q))))
&GLOBAL (npc_built_ship_q)
)))
{ {
BYTE task; BYTE task;
SHIP_FRAGMENT *FragPtr; SHIP_FRAGMENT *FragPtr;
+2 -6
View File
@@ -448,9 +448,7 @@ DrawStarMap (COUNT race_update, RECT *pClipRect)
} }
} }
UnlockStarShip ( UnlockStarShip (&GLOBAL (avail_race_q), hStarShip);
&GLOBAL (avail_race_q), hStarShip
);
} }
} }
@@ -1572,9 +1570,7 @@ DoneSphereGrowth:
} }
} }
UnlockStarShip ( UnlockStarShip (&GLOBAL (avail_race_q), hStarShip);
&GLOBAL (avail_race_q), hStarShip
);
} }
} }
+5 -5
View File
@@ -103,13 +103,13 @@ DeltaSupportCrew (SIZE crew_delta)
UNICODE buf[40]; UNICODE buf[40];
HSTARSHIP hTemplate; HSTARSHIP hTemplate;
SHIP_FRAGMENT *StarShipPtr; SHIP_FRAGMENT *StarShipPtr;
SHIP_FRAGMENT *TemplatePtr; EXTENDED_SHIP_FRAGMENT *TemplatePtr;
StarShipPtr = (SHIP_FRAGMENT*) LockStarShip ( StarShipPtr = (SHIP_FRAGMENT*) LockStarShip (
&GLOBAL (built_ship_q), (HSTARSHIP)pMenuState->CurFrame); &GLOBAL (built_ship_q), (HSTARSHIP)pMenuState->CurFrame);
hTemplate = GetStarShipFromIndex (&GLOBAL (avail_race_q), hTemplate = GetStarShipFromIndex (&GLOBAL (avail_race_q),
GET_RACE_ID (StarShipPtr)); GET_RACE_ID (StarShipPtr));
TemplatePtr = (SHIP_FRAGMENT*) LockStarShip ( TemplatePtr = (EXTENDED_SHIP_FRAGMENT*) LockStarShip (
&GLOBAL (avail_race_q), hTemplate); &GLOBAL (avail_race_q), hTemplate);
StarShipPtr->ShipInfo.crew_level += crew_delta; StarShipPtr->ShipInfo.crew_level += crew_delta;
@@ -117,18 +117,18 @@ DeltaSupportCrew (SIZE crew_delta)
if (StarShipPtr->ShipInfo.crew_level == 0) if (StarShipPtr->ShipInfo.crew_level == 0)
StarShipPtr->ShipInfo.crew_level = 1; StarShipPtr->ShipInfo.crew_level = 1;
else if (StarShipPtr->ShipInfo.crew_level > else if (StarShipPtr->ShipInfo.crew_level >
TemplatePtr->RaceDescPtr->ship_info.crew_level && TemplatePtr->ShipInfo.crew_level &&
crew_delta > 0) crew_delta > 0)
StarShipPtr->ShipInfo.crew_level -= crew_delta; StarShipPtr->ShipInfo.crew_level -= crew_delta;
else else
{ {
if (StarShipPtr->ShipInfo.crew_level >= if (StarShipPtr->ShipInfo.crew_level >=
TemplatePtr->RaceDescPtr->ship_info.crew_level) TemplatePtr->ShipInfo.crew_level)
sprintf (buf, "%u", StarShipPtr->ShipInfo.crew_level); sprintf (buf, "%u", StarShipPtr->ShipInfo.crew_level);
else else
sprintf (buf, "%u/%u", sprintf (buf, "%u/%u",
StarShipPtr->ShipInfo.crew_level, StarShipPtr->ShipInfo.crew_level,
TemplatePtr->RaceDescPtr->ship_info.crew_level); TemplatePtr->ShipInfo.crew_level);
DrawStatusMessage (buf); DrawStatusMessage (buf);
DeltaSISGauges (-crew_delta, 0, 0); DeltaSISGauges (-crew_delta, 0, 0);
+8 -7
View File
@@ -759,6 +759,7 @@ PickPlanetSide (MENU_STATE *pMS)
if (GET_GAME_STATE (FOUND_PLUTO_SPATHI) == 1) if (GET_GAME_STATE (FOUND_PLUTO_SPATHI) == 1)
{ {
/* Create Fwiffo group and go into comm with it */
HSTARSHIP hStarShip; HSTARSHIP hStarShip;
if (pMenuState->flash_task) if (pMenuState->flash_task)
@@ -780,17 +781,17 @@ PickPlanetSide (MENU_STATE *pMS)
{ {
BYTE captains_name_index; BYTE captains_name_index;
COUNT which_player; COUNT which_player;
STARSHIP *StarShipPtr; SHIP_FRAGMENT *StarShipPtr;
StarShipPtr = 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()
// according to avail_race_q Spathi alliance state
which_player = StarShipPlayer (StarShipPtr); which_player = StarShipPlayer (StarShipPtr);
captains_name_index = NAME_OFFSET + 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); OwnStarShip (StarShipPtr, which_player, captains_name_index);
UnlockStarShip ( UnlockStarShip (&GLOBAL (npc_built_ship_q), hStarShip);
&GLOBAL (npc_built_ship_q), hStarShip
);
} }
SaveFlagshipState (); SaveFlagshipState ();
+14 -26
View File
@@ -111,6 +111,8 @@ typedef struct
BYTE ship_mass; BYTE ship_mass;
} CHARACTERISTIC_STUFF; } CHARACTERISTIC_STUFF;
// XXX: This struct is also used to store group info
// Groups should get an own struct
typedef struct typedef struct
{ {
UWORD ship_flags; UWORD ship_flags;
@@ -118,7 +120,9 @@ typedef struct
BYTE var1; BYTE var1;
/* Also: ship_cost, race_id */ /* Also: ship_cost, race_id */
BYTE var2; BYTE var2;
/* Also: group loc and mission, ship's queue index */ /* Also: group loc and mission, ship's queue index,
* escort window number in built_ship_q,
* fleet strength in loaded ship descriptors */
COUNT crew_level; COUNT crew_level;
/* For ships in npc_built_ship_q, the value INFINITE_FLEET for /* For ships in npc_built_ship_q, the value INFINITE_FLEET for
* crew_level indicates an infinite number of ships. */ * crew_level indicates an infinite number of ships. */
@@ -175,7 +179,6 @@ enum
#define STATION_RADIUS 1600 #define STATION_RADIUS 1600
#define ORBIT_RADIUS 2400 #define ORBIT_RADIUS 2400
/* XXX: overloads SHIP_INFO */
typedef struct typedef struct
{ {
UWORD ship_flags; UWORD ship_flags;
@@ -183,8 +186,6 @@ typedef struct
/* Days left before the fleet reachers 'dest_loc'. */ /* Days left before the fleet reachers 'dest_loc'. */
BYTE growth_fract; BYTE growth_fract;
COUNT crew_level; COUNT crew_level;
/* For ships in npc_built_ship_q, the value INFINITE_FLEET for
* crew_level indicates an infinite number of ships. */
COUNT max_crew; COUNT max_crew;
BYTE energy_level; BYTE energy_level;
BYTE max_energy; BYTE max_energy;
@@ -260,10 +261,10 @@ struct race_desc
}; };
typedef QUEUE_HANDLE HSTARSHIP; typedef HLINK HSTARSHIP;
/* XXX: STARSHIP, SHIP_FRAGMENT and EXTENDED_SHIP_FRAGMENT are inter-cast /* XXX: STARSHIP and SHIP_FRAGMENT are inter-cast
* to each other in many places. Some of those are unsafe and potentially * to each other in some places. Some of those are unsafe and potentially
* destructive if the code is changed later. * destructive if the code is changed later.
* Currently, the first 4 members of each struct MUST remain the same, * Currently, the first 4 members of each struct MUST remain the same,
* the first 2 being the queue links. Functions Build() and CloneShipFragment() * the first 2 being the queue links. Functions Build() and CloneShipFragment()
@@ -332,17 +333,16 @@ typedef struct
DWORD RaceResIndex; DWORD RaceResIndex;
/* This field is abused to store other data when the ship /* This field is used to store other data when the ship
* is in GLOBAL(built_ship_q), GLOBDATA(npc_built_ship_q), * is in GLOBAL(built_ship_q) or GLOBDATA(npc_built_ship_q),
* or race_q[], namely the side this ship is on (accessed * namely the side this ship is on (accessed
* through StarShipPlayer()), and the captains name for * through StarShipPlayer()), and the captains name for
* the ship (accessed through StarShipCaptain()). * the ship (accessed through StarShipCaptain()).
* These values are set using OwnStarShip(). */ * These values are set using OwnStarShip(). */
union { union {
// TODO: make RaceDescPtr inaccessible // XXX: only needed temporarily to maintain binary compat
RACE_DESC *RaceDescPtr; // with STARSHIP for Build()
SHIP_INFO *ShipInfoPtr; void *__tmp;
EXTENDED_SHIP_INFO *ExtShipInfoPtr;
struct { struct {
COUNT Player; COUNT Player;
BYTE Captain; BYTE Captain;
@@ -352,7 +352,6 @@ typedef struct
SHIP_INFO ShipInfo; SHIP_INFO ShipInfo;
} SHIP_FRAGMENT; } SHIP_FRAGMENT;
/* XXX: overloads SHIP_FRAGMENT */
typedef struct typedef struct
{ {
HSTARSHIP pred; HSTARSHIP pred;
@@ -360,17 +359,6 @@ typedef struct
DWORD RaceResIndex; DWORD RaceResIndex;
/* This field is set to actually point to struct's own EXTENDED_SHIP_INFO
* instead of a RACE_DESC when GLOBAL(avail_race_q) is initialized
* [see InitSIS]. For this reason, RACE_DESC must maintain a SHIP_INFO
* as the first member. */
union {
// TODO: make RaceDescPtr inaccessible
RACE_DESC *RaceDescPtr;
SHIP_INFO *ShipInfoPtr;
EXTENDED_SHIP_INFO *ExtShipInfoPtr;
};
EXTENDED_SHIP_INFO ShipInfo; EXTENDED_SHIP_INFO ShipInfo;
} EXTENDED_SHIP_FRAGMENT; } EXTENDED_SHIP_FRAGMENT;
+9 -9
View File
@@ -216,27 +216,27 @@ SaveEncounter (const ENCOUNTER *EncounterPtr, DECODE_REF fh)
cwrite_16 (fh, EncounterPtr->origin.x); cwrite_16 (fh, EncounterPtr->origin.x);
cwrite_16 (fh, EncounterPtr->origin.y); cwrite_16 (fh, EncounterPtr->origin.y);
cwrite_16 (fh, EncounterPtr->radius); cwrite_16 (fh, EncounterPtr->radius);
// EXTENDED_STAR_DESC fields // STAR_DESC fields
cwrite_16 (fh, EncounterPtr->SD.star_pt.x); cwrite_16 (fh, EncounterPtr->SD.star_pt.x);
cwrite_16 (fh, EncounterPtr->SD.star_pt.y); cwrite_16 (fh, EncounterPtr->SD.star_pt.y);
cwrite_8 (fh, EncounterPtr->SD.Type); cwrite_8 (fh, EncounterPtr->SD.Type);
cwrite_8 (fh, EncounterPtr->SD.Index); cwrite_8 (fh, EncounterPtr->SD.Index);
cwrite_16 (fh, 0); /* alignment padding */ cwrite_16 (fh, 0); /* alignment padding */
// Save each entry in the SHIP_INFO array: // Save each entry in the BRIEF_SHIP_INFO array
for (i = 0; i < MAX_HYPER_SHIPS; i++) for (i = 0; i < MAX_HYPER_SHIPS; i++)
{ {
const SHIP_INFO *ShipInfo = &EncounterPtr->SD.ShipList[i]; const BRIEF_SHIP_INFO *ShipInfo = &EncounterPtr->ShipList[i];
cwrite_16 (fh, ShipInfo->ship_flags); cwrite_16 (fh, 0); /* useless; was SHIP_INFO.ship_flags */
cwrite_8 (fh, ShipInfo->var1); cwrite_8 (fh, ShipInfo->race_id);
cwrite_8 (fh, ShipInfo->var2); cwrite_8 (fh, 0); /* useless; was SHIP_INFO.var2 */
cwrite_8 (fh, ShipInfo->crew_level); cwrite_8 (fh, ShipInfo->crew_level);
cwrite_8 (fh, ShipInfo->max_crew); cwrite_8 (fh, ShipInfo->max_crew);
cwrite_8 (fh, ShipInfo->energy_level); cwrite_8 (fh, 0); /* useless; was SHIP_INFO.energy_level */
cwrite_8 (fh, ShipInfo->max_energy); cwrite_8 (fh, ShipInfo->max_energy);
cwrite_16 (fh, ShipInfo->loc.x); cwrite_16 (fh, 0); /* useless; was SHIP_INFO.loc.x */
cwrite_16 (fh, ShipInfo->loc.y); cwrite_16 (fh, 0); /* useless; was SHIP_INFO.loc.y */
cwrite_32 (fh, 0); /* useless val; STRING race_strings */ cwrite_32 (fh, 0); /* useless val; STRING race_strings */
cwrite_ptr (fh); /* useless ptr; FRAME icons */ cwrite_ptr (fh); /* useless ptr; FRAME icons */
cwrite_ptr (fh); /* useless ptr; FRAME melee_icon */ cwrite_ptr (fh); /* useless ptr; FRAME melee_icon */
+2 -1
View File
@@ -176,7 +176,8 @@ ship_preprocess (ELEMENT *ElementPtr)
{ {
CONTEXT OldContext; CONTEXT OldContext;
InitShipStatus (StarShipPtr, NULL); InitShipStatus (&RDPtr->ship_info,
StarShipPtr->captains_name_index, NULL);
OldContext = SetContext (StatusContext); OldContext = SetContext (StatusContext);
DrawCaptainsWindow (StarShipPtr); DrawCaptainsWindow (StarShipPtr);
SetContext (OldContext); SetContext (OldContext);
+10 -16
View File
@@ -133,15 +133,13 @@ OutlineShipStatus (COORD y)
} }
void void
InitShipStatus (STARSHIP *StarShipPtr, RECT *pClipRect) InitShipStatus (SHIP_INFO *SIPtr, BYTE captains_name_index, RECT *pClipRect)
{ {
RECT r; RECT r;
COORD y, y_stat; COORD y, y_stat;
STAMP Stamp; STAMP Stamp;
CONTEXT OldContext; CONTEXT OldContext;
SHIP_INFO *SIPtr;
SIPtr = &StarShipPtr->RaceDescPtr->ship_info;
y_stat = (SIPtr->ship_flags & GOOD_GUY) ? y_stat = (SIPtr->ship_flags & GOOD_GUY) ?
GOOD_GUY_YOFFS : BAD_GUY_YOFFS; GOOD_GUY_YOFFS : BAD_GUY_YOFFS;
@@ -227,8 +225,7 @@ InitShipStatus (STARSHIP *StarShipPtr, RECT *pClipRect)
DrawFilledRectangle (&r); DrawFilledRectangle (&r);
} }
if (StarShipPtr->captains_name_index if (captains_name_index)
|| LOBYTE (GLOBAL (CurrentActivity)) == SUPER_MELEE)
{ {
STRING locString; STRING locString;
@@ -255,7 +252,7 @@ InitShipStatus (STARSHIP *StarShipPtr, RECT *pClipRect)
else else
{ {
locString = SetAbsStringTableIndex (SIPtr->race_strings, locString = SetAbsStringTableIndex (SIPtr->race_strings,
StarShipPtr->captains_name_index); captains_name_index);
Text.pStr = (UNICODE *)GetStringAddress (locString); Text.pStr = (UNICODE *)GetStringAddress (locString);
Text.CharCount = GetStringLength (locString); Text.CharCount = GetStringLength (locString);
} }
@@ -270,8 +267,8 @@ InitShipStatus (STARSHIP *StarShipPtr, RECT *pClipRect)
SetContextFont (OldFont); SetContextFont (OldFont);
} }
} }
else if (StarShipPtr->captains_name_index == 0) else /* if (captains_name_index == 0) */
{ { /* Only SIS or Sa-Matra */
if (SIPtr->ship_flags & GOOD_GUY) if (SIPtr->ship_flags & GOOD_GUY)
{ {
DrawCrewFuelString (y, 0); DrawCrewFuelString (y, 0);
@@ -285,7 +282,7 @@ InitShipStatus (STARSHIP *StarShipPtr, RECT *pClipRect)
crew_delta = SIPtr->crew_level; crew_delta = SIPtr->crew_level;
energy_delta = SIPtr->energy_level; energy_delta = SIPtr->energy_level;
SIPtr->crew_level = SIPtr->energy_level = 0; SIPtr->crew_level = SIPtr->energy_level = 0;
DeltaStatistics (StarShipPtr, crew_delta, energy_delta); DeltaStatistics (SIPtr, crew_delta, energy_delta);
} }
UnbatchGraphics (); UnbatchGraphics ();
@@ -303,20 +300,17 @@ InitShipStatus (STARSHIP *StarShipPtr, RECT *pClipRect)
SetContext (OldContext); SetContext (OldContext);
} }
// Pre: -crew_delta <= StarShipPtr->crew_level // Pre: -crew_delta <= ShipInfoPtr->crew_level
// crew_delta <= StarShipPtr->max_crew - StarShipPtr->crew_level // crew_delta <= ShipInfoPtr->max_crew - ShipInfoPtr->crew_level
void void
DeltaStatistics (STARSHIP *StarShipPtr, SIZE crew_delta, SIZE energy_delta) DeltaStatistics (SHIP_INFO *ShipInfoPtr, SIZE crew_delta, SIZE energy_delta)
{ {
COORD x, y; COORD x, y;
RECT r; RECT r;
SHIP_INFO *ShipInfoPtr;
if (crew_delta == 0 && energy_delta == 0) if (crew_delta == 0 && energy_delta == 0)
return; return;
ShipInfoPtr = &StarShipPtr->RaceDescPtr->ship_info;
x = 0; x = 0;
y = GAUGE_YOFFS + ((ShipInfoPtr->ship_flags & GOOD_GUY) ? y = GAUGE_YOFFS + ((ShipInfoPtr->ship_flags & GOOD_GUY) ?
GOOD_GUY_YOFFS : BAD_GUY_YOFFS); GOOD_GUY_YOFFS : BAD_GUY_YOFFS);
@@ -394,7 +388,7 @@ DeltaStatistics (STARSHIP *StarShipPtr, SIZE crew_delta, SIZE energy_delta)
{ {
// All crew doesn't fit in the graphics; print a number. // All crew doesn't fit in the graphics; print a number.
// Always print a number for the SIS in the full game. // Always print a number for the SIS in the full game.
DrawBattleCrewAmount (StarShipPtr); DrawBattleCrewAmount (ShipInfoPtr);
} }
} }
+28 -35
View File
@@ -126,27 +126,15 @@ hangar_anim_func (void *data)
static void static void
SpinStarShip (HSTARSHIP hStarShip) SpinStarShip (HSTARSHIP hStarShip)
{ {
COUNT Index; int Index;
HSTARSHIP hNextShip, hShip; SHIP_FRAGMENT *StarShipPtr;
STARSHIP *StarShipPtr;
StarShipPtr = LockStarShip (&GLOBAL (built_ship_q), hStarShip);
for (Index = 0, hShip = GetHeadLink (&master_q);
hShip; hShip = hNextShip, ++Index)
{
STARSHIP *SSPtr;
SSPtr = LockStarShip (&master_q, hShip);
if (StarShipPtr->RaceResIndex == SSPtr->RaceResIndex)
break;
hNextShip = _GetSuccLink (SSPtr);
UnlockStarShip (&master_q, hShip);
}
StarShipPtr = (SHIP_FRAGMENT *) LockStarShip (&GLOBAL (built_ship_q),
hStarShip);
Index = FindMasterShipIndex (StarShipPtr->RaceResIndex);
UnlockStarShip (&GLOBAL (built_ship_q), hStarShip); UnlockStarShip (&GLOBAL (built_ship_q), hStarShip);
if (Index < NUM_MELEE_SHIPS) if (Index >= 0 && Index < NUM_MELEE_SHIPS)
{ {
UnlockMutex (GraphicsLock); UnlockMutex (GraphicsLock);
DoShipSpin (Index, pMenuState->hMusic); DoShipSpin (Index, pMenuState->hMusic);
@@ -166,9 +154,9 @@ GetAvailableRaceCount (void)
for (hStarShip = GetHeadLink (&GLOBAL (avail_race_q)); for (hStarShip = GetHeadLink (&GLOBAL (avail_race_q));
hStarShip; hStarShip = hNextShip) hStarShip; hStarShip = hNextShip)
{ {
SHIP_FRAGMENT *StarShipPtr; EXTENDED_SHIP_FRAGMENT *StarShipPtr;
StarShipPtr = (SHIP_FRAGMENT*) LockStarShip ( StarShipPtr = (EXTENDED_SHIP_FRAGMENT*) LockStarShip (
&GLOBAL (avail_race_q), hStarShip); &GLOBAL (avail_race_q), hStarShip);
if (StarShipPtr->ShipInfo.ship_flags & GOOD_GUY) if (StarShipPtr->ShipInfo.ship_flags & GOOD_GUY)
++Index; ++Index;
@@ -188,10 +176,10 @@ GetAvailableRaceFromIndex (BYTE Index)
for (hStarShip = GetHeadLink (&GLOBAL (avail_race_q)); for (hStarShip = GetHeadLink (&GLOBAL (avail_race_q));
hStarShip; hStarShip = hNextShip) hStarShip; hStarShip = hNextShip)
{ {
SHIP_FRAGMENT *StarShipPtr; EXTENDED_SHIP_FRAGMENT *StarShipPtr;
StarShipPtr = (SHIP_FRAGMENT*) LockStarShip (&GLOBAL (avail_race_q), StarShipPtr = (EXTENDED_SHIP_FRAGMENT*) LockStarShip (
hStarShip); &GLOBAL (avail_race_q), hStarShip);
if ((StarShipPtr->ShipInfo.ship_flags & GOOD_GUY) && Index-- == 0) if ((StarShipPtr->ShipInfo.ship_flags & GOOD_GUY) && Index-- == 0)
{ {
UnlockStarShip (&GLOBAL (avail_race_q), hStarShip); UnlockStarShip (&GLOBAL (avail_race_q), hStarShip);
@@ -237,7 +225,7 @@ DrawRaceStrings (BYTE NewRaceItem)
{ {
TEXT t; TEXT t;
HSTARSHIP hStarShip; HSTARSHIP hStarShip;
STARSHIP *StarShipPtr; EXTENDED_SHIP_FRAGMENT *FragPtr;
UNICODE buf[30]; UNICODE buf[30];
COUNT ShipCost[] = COUNT ShipCost[] =
{ {
@@ -250,8 +238,9 @@ DrawRaceStrings (BYTE NewRaceItem)
s.frame = SetAbsFrameIndex (pMenuState->ModuleFrame, s.frame = SetAbsFrameIndex (pMenuState->ModuleFrame,
3 + NewRaceItem); 3 + NewRaceItem);
DrawStamp (&s); DrawStamp (&s);
StarShipPtr = LockStarShip (&GLOBAL (avail_race_q), hStarShip); FragPtr = (EXTENDED_SHIP_FRAGMENT *) LockStarShip (
s.frame = StarShipPtr->RaceDescPtr->ship_info.melee_icon; &GLOBAL (avail_race_q), hStarShip);
s.frame = FragPtr->ShipInfo.melee_icon;
UnlockStarShip (&GLOBAL (avail_race_q), hStarShip); UnlockStarShip (&GLOBAL (avail_race_q), hStarShip);
t.baseline.x = s.origin.x + RADAR_WIDTH - 2; t.baseline.x = s.origin.x + RADAR_WIDTH - 2;
@@ -287,21 +276,21 @@ ShowShipCrew (SHIP_FRAGMENT *StarShipPtr, RECT *pRect)
TEXT t; TEXT t;
UNICODE buf[80]; UNICODE buf[80];
HSTARSHIP hTemplate; HSTARSHIP hTemplate;
SHIP_FRAGMENT *TemplatePtr; EXTENDED_SHIP_FRAGMENT *TemplatePtr;
hTemplate = GetStarShipFromIndex (&GLOBAL (avail_race_q), hTemplate = GetStarShipFromIndex (&GLOBAL (avail_race_q),
GET_RACE_ID (StarShipPtr)); GET_RACE_ID (StarShipPtr));
TemplatePtr = (SHIP_FRAGMENT*) LockStarShip ( TemplatePtr = (EXTENDED_SHIP_FRAGMENT*) LockStarShip (
&GLOBAL (avail_race_q), hTemplate); &GLOBAL (avail_race_q), hTemplate);
if (StarShipPtr->ShipInfo.crew_level >= if (StarShipPtr->ShipInfo.crew_level >=
TemplatePtr->RaceDescPtr->ship_info.crew_level) TemplatePtr->ShipInfo.crew_level)
sprintf (buf, "%u", StarShipPtr->ShipInfo.crew_level); sprintf (buf, "%u", StarShipPtr->ShipInfo.crew_level);
else if (StarShipPtr->ShipInfo.crew_level == 0) else if (StarShipPtr->ShipInfo.crew_level == 0)
utf8StringCopy (buf, sizeof (buf), "SCRAP"); utf8StringCopy (buf, sizeof (buf), "SCRAP");
else else
sprintf (buf, "%u/%u", sprintf (buf, "%u/%u",
StarShipPtr->ShipInfo.crew_level, StarShipPtr->ShipInfo.crew_level,
TemplatePtr->RaceDescPtr->ship_info.crew_level); TemplatePtr->ShipInfo.crew_level);
UnlockStarShip (&GLOBAL (avail_race_q), hTemplate); UnlockStarShip (&GLOBAL (avail_race_q), hTemplate);
r = *pRect; r = *pRect;
@@ -396,6 +385,8 @@ ShowCombatShip (COUNT which_window, SHIP_FRAGMENT *YankedStarShipPtr)
hStarShip = hTailShip; hStarShip = hTailShip;
StarShipPtr = (SHIP_FRAGMENT*) LockStarShip ( StarShipPtr = (SHIP_FRAGMENT*) LockStarShip (
&GLOBAL (built_ship_q), hStarShip); &GLOBAL (built_ship_q), hStarShip);
// XXX: hack; escort window is not group loc,
// should just use queue index (already var2)
SET_GROUP_LOC (StarShipPtr, which_window); SET_GROUP_LOC (StarShipPtr, which_window);
UnlockStarShip (&GLOBAL (built_ship_q), hStarShip); UnlockStarShip (&GLOBAL (built_ship_q), hStarShip);
} }
@@ -665,6 +656,8 @@ DoModifyShips (MENU_STATE *pMS)
StarShipPtr = (SHIP_FRAGMENT*) LockStarShip ( StarShipPtr = (SHIP_FRAGMENT*) LockStarShip (
&GLOBAL (built_ship_q), hStarShip); &GLOBAL (built_ship_q), hStarShip);
// XXX: hack; escort window is not group loc,
// should just use queue index (already var2)
if (GET_GROUP_LOC (StarShipPtr) == pMS->CurState) if (GET_GROUP_LOC (StarShipPtr) == pMS->CurState)
{ {
UnlockStarShip (&GLOBAL (built_ship_q), hStarShip); UnlockStarShip (&GLOBAL (built_ship_q), hStarShip);
@@ -927,20 +920,20 @@ DoModifyShips (MENU_STATE *pMS)
else else
{ {
HSTARSHIP hTemplate; HSTARSHIP hTemplate;
SHIP_FRAGMENT *TemplatePtr; EXTENDED_SHIP_FRAGMENT *TemplatePtr;
hTemplate = GetStarShipFromIndex ( hTemplate = GetStarShipFromIndex (
&GLOBAL (avail_race_q), &GLOBAL (avail_race_q),
GET_RACE_ID (StarShipPtr)); GET_RACE_ID (StarShipPtr));
TemplatePtr = (SHIP_FRAGMENT*) LockStarShip ( TemplatePtr = (EXTENDED_SHIP_FRAGMENT*)
&GLOBAL (avail_race_q), hTemplate); LockStarShip (&GLOBAL (avail_race_q),
hTemplate);
if (GLOBAL_SIS (ResUnits) >= if (GLOBAL_SIS (ResUnits) >=
(DWORD)GLOBAL (CrewCost) (DWORD)GLOBAL (CrewCost)
&& StarShipPtr->ShipInfo.crew_level < && StarShipPtr->ShipInfo.crew_level <
StarShipPtr->ShipInfo.max_crew && StarShipPtr->ShipInfo.max_crew &&
StarShipPtr->ShipInfo.crew_level < StarShipPtr->ShipInfo.crew_level <
TemplatePtr->RaceDescPtr->ship_info. TemplatePtr->ShipInfo.crew_level)
crew_level)
{ {
if (StarShipPtr->ShipInfo.crew_level > 0) if (StarShipPtr->ShipInfo.crew_level > 0)
DeltaSISGauges (0, 0, -GLOBAL (CrewCost)); DeltaSISGauges (0, 0, -GLOBAL (CrewCost));
+1
View File
@@ -109,6 +109,7 @@ enum
#define FUEL_RESERVE FUEL_VOLUME_PER_ROW #define FUEL_RESERVE FUEL_VOLUME_PER_ROW
#define MAX_COMBAT_SHIPS 12 #define MAX_COMBAT_SHIPS 12
// XXX: Only half of this number if actually used
#define MAX_BATTLE_GROUPS 64 #define MAX_BATTLE_GROUPS 64
#define IP_SHIP_THRUST_INCREMENT 8 #define IP_SHIP_THRUST_INCREMENT 8
+8 -8
View File
@@ -114,7 +114,7 @@ CaptainsWindow (CAPTAIN_STUFF *CSPtr, COORD y, ELEMENT_FLAGS
} }
void void
DrawBattleCrewAmount (STARSHIP *StarShipPtr) DrawBattleCrewAmount (SHIP_INFO *ShipInfoPtr)
{ {
#define MAX_CREW_DIGITS 3 #define MAX_CREW_DIGITS 3
RECT r; RECT r;
@@ -125,7 +125,7 @@ DrawBattleCrewAmount (STARSHIP *StarShipPtr)
if (optWhichMenu == OPT_PC) if (optWhichMenu == OPT_PC)
t.baseline.x -= 8; t.baseline.x -= 8;
t.baseline.y = BATTLE_CREW_Y + t.baseline.y = BATTLE_CREW_Y +
((StarShipPtr->RaceDescPtr->ship_info.ship_flags & GOOD_GUY) ? ((ShipInfoPtr->ship_flags & GOOD_GUY) ?
GOOD_GUY_YOFFS : BAD_GUY_YOFFS); GOOD_GUY_YOFFS : BAD_GUY_YOFFS);
t.align = ALIGN_LEFT; t.align = ALIGN_LEFT;
t.pStr = buf; t.pStr = buf;
@@ -136,7 +136,7 @@ DrawBattleCrewAmount (STARSHIP *StarShipPtr)
r.extent.width = 6 * MAX_CREW_DIGITS + 6; r.extent.width = 6 * MAX_CREW_DIGITS + 6;
r.extent.height = 5; r.extent.height = 5;
sprintf (buf, "%u", StarShipPtr->RaceDescPtr->ship_info.crew_level); sprintf (buf, "%u", ShipInfoPtr->crew_level);
SetContextFont (StarConFont); SetContextFont (StarConFont);
SetContextForeGroundColor ( SetContextForeGroundColor (
@@ -272,7 +272,7 @@ DrawCaptainsWindow (STARSHIP *StarShipPtr)
{ {
// All crew doesn't fit in the graphics; print a number. // All crew doesn't fit in the graphics; print a number.
// Always print a number for the SIS in the full game. // Always print a number for the SIS in the full game.
DrawBattleCrewAmount (StarShipPtr); DrawBattleCrewAmount (&RDPtr->ship_info);
} }
UnbatchGraphics (); UnbatchGraphics ();
@@ -312,7 +312,7 @@ DeltaEnergy (ELEMENT *ElementPtr, SIZE energy_delta)
StarShipPtr->energy_counter = StarShipPtr->energy_counter =
StarShipPtr->RaceDescPtr->characteristics.energy_wait; StarShipPtr->RaceDescPtr->characteristics.energy_wait;
DeltaStatistics (StarShipPtr, 0, energy_delta); DeltaStatistics (ShipInfoPtr, 0, energy_delta);
} }
return (retval); return (retval);
@@ -323,6 +323,7 @@ DeltaCrew (ELEMENT *ElementPtr, SIZE crew_delta)
{ {
BOOLEAN retval; BOOLEAN retval;
STARSHIP *StarShipPtr; STARSHIP *StarShipPtr;
SHIP_INFO *ShipInfoPtr;
if (LOBYTE (GLOBAL (CurrentActivity)) == IN_LAST_BATTLE if (LOBYTE (GLOBAL (CurrentActivity)) == IN_LAST_BATTLE
&& (ElementPtr->state_flags & BAD_GUY)) && (ElementPtr->state_flags & BAD_GUY))
@@ -330,10 +331,9 @@ DeltaCrew (ELEMENT *ElementPtr, SIZE crew_delta)
retval = TRUE; retval = TRUE;
GetElementStarShip (ElementPtr, &StarShipPtr); GetElementStarShip (ElementPtr, &StarShipPtr);
ShipInfoPtr = &StarShipPtr->RaceDescPtr->ship_info;
if (crew_delta > 0) if (crew_delta > 0)
{ {
SHIP_INFO *ShipInfoPtr = &StarShipPtr->RaceDescPtr->ship_info;
ElementPtr->crew_level += crew_delta; ElementPtr->crew_level += crew_delta;
if (ElementPtr->crew_level > ShipInfoPtr->max_crew) if (ElementPtr->crew_level > ShipInfoPtr->max_crew)
{ {
@@ -353,7 +353,7 @@ DeltaCrew (ELEMENT *ElementPtr, SIZE crew_delta)
} }
} }
DeltaStatistics (StarShipPtr, crew_delta, 0); DeltaStatistics (ShipInfoPtr, crew_delta, 0);
return (retval); return (retval);
} }
+2 -1
View File
@@ -285,7 +285,8 @@ ModifySilhouette (ELEMENT *ElementPtr, STAMP *modify_stamp,
{ {
or.corner.x += ObjectIntersect.IntersectStamp.origin.x; or.corner.x += ObjectIntersect.IntersectStamp.origin.x;
or.corner.y += ObjectIntersect.IntersectStamp.origin.y; or.corner.y += ObjectIntersect.IntersectStamp.origin.y;
InitShipStatus (StarShipPtr, &or); InitShipStatus (&StarShipPtr->RaceDescPtr->ship_info,
StarShipPtr->captains_name_index, &or);
} }
else else
{ {