More cleanups of DoModifyShips. We'll get to something comprehendible eventually.
git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@3729 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
+338
-228
@@ -593,7 +593,246 @@ DMS_SpinShip (MENU_STATE *pMS, HSHIPFRAG hStarShip)
|
|||||||
}
|
}
|
||||||
#endif /* WANT_SHIP_SPINS */
|
#endif /* WANT_SHIP_SPINS */
|
||||||
|
|
||||||
// Try to add the currently selected ship
|
// Helper function for DoModifyShips(), called when the player presses the
|
||||||
|
// up button when modifying the crew of the flagship.
|
||||||
|
// Buy crew for the flagship.
|
||||||
|
// Returns the change in crew (1 on success, 0 on failure).
|
||||||
|
static SIZE
|
||||||
|
DMS_HireFlagShipCrew (void)
|
||||||
|
{
|
||||||
|
RECT r;
|
||||||
|
|
||||||
|
if (GetCPodCapacity (&r.corner) <= GetCrewCount ())
|
||||||
|
{
|
||||||
|
// At capacity.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GLOBAL_SIS (ResUnits) < (DWORD)GLOBAL (CrewCost))
|
||||||
|
{
|
||||||
|
// Not enough RUs.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
DrawPoint (&r.corner);
|
||||||
|
DeltaSISGauges (1, 0, -GLOBAL (CrewCost));
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function for DoModifyShips(), called when the player presses the
|
||||||
|
// down button when modifying the crew of the flagship.
|
||||||
|
// Dismiss crew from the flagship.
|
||||||
|
// Returns the change in crew (-1 on success, 0 on failure).
|
||||||
|
static SIZE
|
||||||
|
DMS_DismissFlagShipCrew (void)
|
||||||
|
{
|
||||||
|
SIZE crew_bought;
|
||||||
|
RECT r;
|
||||||
|
|
||||||
|
if (GetCrewCount () == 0)
|
||||||
|
{
|
||||||
|
// No crew to dismiss.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
crew_bought = (SIZE)MAKE_WORD (
|
||||||
|
GET_GAME_STATE (CREW_PURCHASED0),
|
||||||
|
GET_GAME_STATE (CREW_PURCHASED1));
|
||||||
|
|
||||||
|
DeltaSISGauges (-1, 0, GLOBAL (CrewCost) -
|
||||||
|
(crew_bought == CREW_EXPENSE_THRESHOLD ? 2 : 0));
|
||||||
|
|
||||||
|
GetCPodCapacity (&r.corner);
|
||||||
|
SetContextForeGroundColor (BLACK_COLOR);
|
||||||
|
DrawPoint (&r.corner);
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function for DoModifyShips(), called when the player presses the
|
||||||
|
// up button when modifying the crew of an escort ship.
|
||||||
|
// Buy crew for an escort ship
|
||||||
|
// Returns the change in crew (1 on success, 0 on failure).
|
||||||
|
static SIZE
|
||||||
|
DMS_HireEscortShipCrew (MENU_STATE *pMS, SHIP_FRAGMENT *StarShipPtr)
|
||||||
|
{
|
||||||
|
COUNT templateMaxCrew;
|
||||||
|
|
||||||
|
{
|
||||||
|
// XXX Split this off into a separate function?
|
||||||
|
HFLEETINFO hTemplate = GetStarShipFromIndex (&GLOBAL (avail_race_q),
|
||||||
|
StarShipPtr->race_id);
|
||||||
|
FLEET_INFO *TemplatePtr =
|
||||||
|
LockFleetInfo (&GLOBAL (avail_race_q), hTemplate);
|
||||||
|
templateMaxCrew = TemplatePtr->crew_level;
|
||||||
|
UnlockFleetInfo (&GLOBAL (avail_race_q), hTemplate);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GLOBAL_SIS (ResUnits) < (DWORD)GLOBAL (CrewCost))
|
||||||
|
{
|
||||||
|
// Not enough money to hire a crew member.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StarShipPtr->crew_level >= StarShipPtr->max_crew)
|
||||||
|
{
|
||||||
|
// This ship cannot handle more crew.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StarShipPtr->crew_level >= templateMaxCrew)
|
||||||
|
{
|
||||||
|
// A ship of this type cannot handle more crew.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StarShipPtr->crew_level > 0)
|
||||||
|
{
|
||||||
|
DeltaSISGauges (0, 0, -GLOBAL (CrewCost));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Buy a ship.
|
||||||
|
DeltaSISGauges (0, 0, -(COUNT)ShipCost[StarShipPtr->race_id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
++StarShipPtr->crew_level;
|
||||||
|
ShowShipCrew (StarShipPtr, &pMS->flash_rect0);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function for DoModifyShips(), called when the player presses the
|
||||||
|
// down button when modifying the crew of an escort ship.
|
||||||
|
// Dismiss crew from an escort ship
|
||||||
|
// Returns the change in crew (-1 on success, 0 on failure).
|
||||||
|
static SIZE
|
||||||
|
DMS_DismissEscortShipCrew (MENU_STATE *pMS, SHIP_FRAGMENT *StarShipPtr)
|
||||||
|
{
|
||||||
|
SIZE crew_delta = 0;
|
||||||
|
|
||||||
|
if (StarShipPtr->crew_level > 0)
|
||||||
|
{
|
||||||
|
if (StarShipPtr->crew_level > 1)
|
||||||
|
{
|
||||||
|
// The ship was not at 'scrap'.
|
||||||
|
// Give one crew member worth of RU.
|
||||||
|
SIZE crew_bought = (SIZE)MAKE_WORD (
|
||||||
|
GET_GAME_STATE (CREW_PURCHASED0),
|
||||||
|
GET_GAME_STATE (CREW_PURCHASED1));
|
||||||
|
|
||||||
|
DeltaSISGauges (0, 0, GLOBAL (CrewCost)
|
||||||
|
- (crew_bought == CREW_EXPENSE_THRESHOLD ? 2 : 0));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// With the last crew member, the ship
|
||||||
|
// will be scrapped.
|
||||||
|
// Give RU for the ship.
|
||||||
|
DeltaSISGauges (0, 0, (COUNT)ShipCost[StarShipPtr->race_id]);
|
||||||
|
}
|
||||||
|
crew_delta = -1;
|
||||||
|
--StarShipPtr->crew_level;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ // no crew to dismiss
|
||||||
|
PlayMenuSound (MENU_SOUND_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
ShowShipCrew (StarShipPtr, &pMS->flash_rect0);
|
||||||
|
|
||||||
|
return crew_delta;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function for DoModifyShips(), called when the player presses the
|
||||||
|
// up or down button when modifying the crew of the flagship or of an escort
|
||||||
|
// ship.
|
||||||
|
// 'hStarShip' is the currently escort ship, or 0 if no ship is
|
||||||
|
// selected.
|
||||||
|
// 'dy' is -1 if the 'up' button was pressed, or '1' if the down button was
|
||||||
|
// pressed.
|
||||||
|
static void
|
||||||
|
DMS_ModifyCrew (MENU_STATE *pMS, HSHIPFRAG hStarShip, SBYTE dy)
|
||||||
|
{
|
||||||
|
SIZE crew_delta = 0;
|
||||||
|
SHIP_FRAGMENT *StarShipPtr = NULL;
|
||||||
|
|
||||||
|
if (hStarShip)
|
||||||
|
StarShipPtr = LockShipFrag (&GLOBAL (built_ship_q), hStarShip);
|
||||||
|
|
||||||
|
SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN,
|
||||||
|
MENU_SOUND_SELECT | MENU_SOUND_CANCEL);
|
||||||
|
|
||||||
|
if (hStarShip == 0)
|
||||||
|
{
|
||||||
|
// Add/Dismiss crew for the flagship.
|
||||||
|
if (dy < 0)
|
||||||
|
{
|
||||||
|
// Add crew for the flagship.
|
||||||
|
crew_delta = DMS_HireFlagShipCrew ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Dismiss crew from the flagship.
|
||||||
|
crew_delta = DMS_DismissFlagShipCrew ();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (crew_delta != 0)
|
||||||
|
{
|
||||||
|
RECT r;
|
||||||
|
SetContext (StatusContext);
|
||||||
|
GetGaugeRect (&r, TRUE);
|
||||||
|
SetFlashRect (&r);
|
||||||
|
SetContext (SpaceContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Add/Dismiss crew for an escort ship.
|
||||||
|
if (dy < 0)
|
||||||
|
{
|
||||||
|
// Add crew for an escort ship.
|
||||||
|
crew_delta = DMS_HireEscortShipCrew (pMS, StarShipPtr);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Dismiss crew from an escort ship.
|
||||||
|
crew_delta = DMS_DismissEscortShipCrew (pMS, StarShipPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (crew_delta != 0)
|
||||||
|
{
|
||||||
|
RECT r;
|
||||||
|
r.corner.x = pMS->flash_rect0.corner.x;
|
||||||
|
r.corner.y = pMS->flash_rect0.corner.y
|
||||||
|
+ pMS->flash_rect0.extent.height - 6;
|
||||||
|
r.extent.width = SHIP_WIN_WIDTH;
|
||||||
|
r.extent.height = 5;
|
||||||
|
|
||||||
|
SetContext (SpaceContext);
|
||||||
|
SetFlashRect (&r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (crew_delta == 0)
|
||||||
|
PlayMenuSound (MENU_SOUND_FAILURE);
|
||||||
|
|
||||||
|
if (hStarShip)
|
||||||
|
{
|
||||||
|
UnlockShipFrag (&GLOBAL (built_ship_q), hStarShip);
|
||||||
|
|
||||||
|
// Clear out the bought ship index so that flash rects work
|
||||||
|
// correctly.
|
||||||
|
pMS->delta_item &= MODIFY_CREW_FLAG;
|
||||||
|
}
|
||||||
|
|
||||||
|
CrewTransaction (crew_delta);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function for DoModifyShips(), called when the player presses the
|
||||||
|
// select button when the cursor is over an empty escort ship slot.
|
||||||
|
// Try to add the currently selected ship as an escort ship.
|
||||||
static void
|
static void
|
||||||
DMS_TryAddEscortShip (MENU_STATE *pMS)
|
DMS_TryAddEscortShip (MENU_STATE *pMS)
|
||||||
{
|
{
|
||||||
@@ -634,6 +873,64 @@ DMS_TryAddEscortShip (MENU_STATE *pMS)
|
|||||||
MENU_SOUND_SELECT | MENU_SOUND_CANCEL);
|
MENU_SOUND_SELECT | MENU_SOUND_CANCEL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Helper function for DoModifyShips(), called when the player is in the
|
||||||
|
// mode to add a new escort ship to the fleet (after pressing select on an
|
||||||
|
// empty slot).
|
||||||
|
static BOOLEAN
|
||||||
|
DMS_AddEscortShip (MENU_STATE *pMS, BOOLEAN select, BOOLEAN cancel,
|
||||||
|
SBYTE dx, SBYTE dy, BYTE *newStateOut)
|
||||||
|
{
|
||||||
|
BYTE NewState;
|
||||||
|
assert (select || cancel || dx || dy);
|
||||||
|
assert (pMS->delta_item & MODIFY_CREW_FLAG);
|
||||||
|
|
||||||
|
if (cancel)
|
||||||
|
{
|
||||||
|
// Cancel selecting an escort ship.
|
||||||
|
pMS->delta_item &= ~MODIFY_CREW_FLAG;
|
||||||
|
LockMutex (GraphicsLock);
|
||||||
|
SetFlashRect (SFR_MENU_3DO);
|
||||||
|
UnlockMutex (GraphicsLock);
|
||||||
|
DrawMenuStateStrings (PM_CREW, SHIPYARD_CREW);
|
||||||
|
SetMenuSounds (MENU_SOUND_ARROWS, MENU_SOUND_SELECT);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (select)
|
||||||
|
{
|
||||||
|
// Selected a ship to be inserted in an empty escort
|
||||||
|
// ship slot.
|
||||||
|
DMS_TryAddEscortShip (pMS);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// Motion key pressed while selecting a ship to be
|
||||||
|
// inserted in an empty escort ship slot.
|
||||||
|
COUNT Index = GetAvailableRaceCount ();
|
||||||
|
NewState = LOBYTE (pMS->delta_item);
|
||||||
|
if (dx < 0 || dy < 0)
|
||||||
|
{
|
||||||
|
if (NewState-- == 0)
|
||||||
|
NewState = Index - 1;
|
||||||
|
}
|
||||||
|
else if (dx > 0 || dy > 0)
|
||||||
|
{
|
||||||
|
if (++NewState == Index)
|
||||||
|
NewState = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NewState != LOBYTE (pMS->delta_item))
|
||||||
|
{
|
||||||
|
DrawRaceStrings (pMS, NewState);
|
||||||
|
pMS->delta_item = NewState | MODIFY_CREW_FLAG;
|
||||||
|
}
|
||||||
|
|
||||||
|
*newStateOut = NewState;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* in this routine, the least significant byte of pMS->CurState is used
|
/* in this routine, the least significant byte of pMS->CurState is used
|
||||||
* to store the current selected ship index
|
* to store the current selected ship index
|
||||||
* a special case for the row is hi-nibble == -1 (0xf), which specifies
|
* a special case for the row is hi-nibble == -1 (0xf), which specifies
|
||||||
@@ -644,14 +941,11 @@ DMS_TryAddEscortShip (MENU_STATE *pMS)
|
|||||||
static BOOLEAN
|
static BOOLEAN
|
||||||
DoModifyShips (MENU_STATE *pMS)
|
DoModifyShips (MENU_STATE *pMS)
|
||||||
{
|
{
|
||||||
BOOLEAN select, cancel;
|
|
||||||
#ifdef WANT_SHIP_SPINS
|
#ifdef WANT_SHIP_SPINS
|
||||||
BOOLEAN special;
|
BOOLEAN special = PulsedInputState.menu[KEY_MENU_SPECIAL];
|
||||||
|
|
||||||
special = PulsedInputState.menu[KEY_MENU_SPECIAL];
|
|
||||||
#endif /* WANT_SHIP_SPINS */
|
#endif /* WANT_SHIP_SPINS */
|
||||||
select = PulsedInputState.menu[KEY_MENU_SELECT];
|
BOOLEAN select = PulsedInputState.menu[KEY_MENU_SELECT];
|
||||||
cancel = PulsedInputState.menu[KEY_MENU_CANCEL];
|
BOOLEAN cancel = PulsedInputState.menu[KEY_MENU_CANCEL];
|
||||||
|
|
||||||
if (GLOBAL (CurrentActivity) & CHECK_ABORT)
|
if (GLOBAL (CurrentActivity) & CHECK_ABORT)
|
||||||
{
|
{
|
||||||
@@ -674,18 +968,22 @@ DoModifyShips (MENU_STATE *pMS)
|
|||||||
{
|
{
|
||||||
SBYTE dx = 0;
|
SBYTE dx = 0;
|
||||||
SBYTE dy = 0;
|
SBYTE dy = 0;
|
||||||
BYTE NewState;
|
BYTE NewState = pMS->CurState;
|
||||||
|
|
||||||
if (!(pMS->delta_item & MODIFY_CREW_FLAG))
|
if (!(pMS->delta_item & MODIFY_CREW_FLAG))
|
||||||
{
|
{
|
||||||
SetMenuSounds (MENU_SOUND_ARROWS, MENU_SOUND_SELECT);
|
SetMenuSounds (MENU_SOUND_ARROWS, MENU_SOUND_SELECT);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PulsedInputState.menu[KEY_MENU_RIGHT]) dx = 1;
|
if (PulsedInputState.menu[KEY_MENU_RIGHT])
|
||||||
if (PulsedInputState.menu[KEY_MENU_LEFT]) dx = -1;
|
dx = 1;
|
||||||
if (PulsedInputState.menu[KEY_MENU_UP]) dy = -1;
|
if (PulsedInputState.menu[KEY_MENU_LEFT])
|
||||||
if (PulsedInputState.menu[KEY_MENU_DOWN]) dy = 1;
|
dx = -1;
|
||||||
NewState = pMS->CurState;
|
if (PulsedInputState.menu[KEY_MENU_UP])
|
||||||
|
dy = -1;
|
||||||
|
if (PulsedInputState.menu[KEY_MENU_DOWN])
|
||||||
|
dy = 1;
|
||||||
|
|
||||||
if (pMS->delta_item & MODIFY_CREW_FLAG)
|
if (pMS->delta_item & MODIFY_CREW_FLAG)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -748,71 +1046,32 @@ DoModifyShips (MENU_STATE *pMS)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif /* WANT_SHIP_SPINS */
|
#endif /* WANT_SHIP_SPINS */
|
||||||
if (select || ((pMS->delta_item & MODIFY_CREW_FLAG)
|
if (hStarShip == 0 && HINIBBLE (pMS->CurState) == 0 &&
|
||||||
|
!(pMS->delta_item & MODIFY_CREW_FLAG) && select)
|
||||||
|
{
|
||||||
|
// Select button was pressed over an empty escort
|
||||||
|
// ship slot. Switch to 'add escort ship' mode.
|
||||||
|
UnlockMutex (GraphicsLock);
|
||||||
|
pMS->delta_item = MODIFY_CREW_FLAG;
|
||||||
|
DrawRaceStrings (pMS, 0);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else if (select || ((pMS->delta_item & MODIFY_CREW_FLAG)
|
||||||
&& (dx || dy || cancel)))
|
&& (dx || dy || cancel)))
|
||||||
{
|
{
|
||||||
if (hStarShip == 0 && HINIBBLE (pMS->CurState) == 0)
|
if (hStarShip == 0 && HINIBBLE (pMS->CurState) == 0)
|
||||||
{
|
{
|
||||||
// Cursor is over an empty escort ship slot.
|
// Cursor is over an empty escort ship slot, while we're
|
||||||
COUNT Index;
|
// in 'add escort ship' mode.
|
||||||
|
|
||||||
// SetFlashRect (NULL);
|
|
||||||
UnlockMutex (GraphicsLock);
|
UnlockMutex (GraphicsLock);
|
||||||
if (!(pMS->delta_item & MODIFY_CREW_FLAG))
|
if (DMS_AddEscortShip (pMS, select, cancel, dx, dy, &NewState))
|
||||||
{
|
|
||||||
// Select button was pressed over an empty escort
|
|
||||||
// ship slot. Switch to 'add ship' mode.
|
|
||||||
pMS->delta_item = MODIFY_CREW_FLAG;
|
|
||||||
DrawRaceStrings (pMS, 0);
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
|
||||||
else if (cancel)
|
|
||||||
{
|
|
||||||
// We were selecting a ship to be inserted in an
|
|
||||||
// empty escort ship slot, but cancelled.
|
|
||||||
pMS->delta_item ^= MODIFY_CREW_FLAG;
|
|
||||||
LockMutex (GraphicsLock);
|
|
||||||
SetFlashRect (SFR_MENU_3DO);
|
|
||||||
UnlockMutex (GraphicsLock);
|
|
||||||
DrawMenuStateStrings (PM_CREW, SHIPYARD_CREW);
|
|
||||||
SetMenuSounds (MENU_SOUND_ARROWS, MENU_SOUND_SELECT);
|
|
||||||
}
|
|
||||||
else if (select)
|
|
||||||
{
|
|
||||||
// Selected a ship to be inserted in an empty escort
|
|
||||||
// ship slot.
|
|
||||||
DMS_TryAddEscortShip (pMS);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Motion key pressed while selecting a ship to be
|
|
||||||
// inserted in an empty escort ship slot.
|
|
||||||
Index = GetAvailableRaceCount ();
|
|
||||||
NewState = LOBYTE (pMS->delta_item);
|
|
||||||
if (dx < 0 || dy < 0)
|
|
||||||
{
|
|
||||||
if (NewState-- == 0)
|
|
||||||
NewState = Index - 1;
|
|
||||||
}
|
|
||||||
else if (dx > 0 || dy > 0)
|
|
||||||
{
|
|
||||||
if (++NewState == Index)
|
|
||||||
NewState = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (NewState != LOBYTE (pMS->delta_item))
|
|
||||||
{
|
|
||||||
DrawRaceStrings (pMS, NewState);
|
|
||||||
pMS->delta_item = NewState | MODIFY_CREW_FLAG;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
LockMutex (GraphicsLock);
|
LockMutex (GraphicsLock);
|
||||||
goto ChangeFlashRect;
|
goto ChangeFlashRect;
|
||||||
}
|
}
|
||||||
else if (select || cancel)
|
|
||||||
|
if (select || cancel)
|
||||||
{
|
{
|
||||||
if ((pMS->delta_item & MODIFY_CREW_FLAG)
|
if ((pMS->delta_item & MODIFY_CREW_FLAG)
|
||||||
&& hStarShip != 0)
|
&& hStarShip != 0)
|
||||||
@@ -875,162 +1134,9 @@ DoModifyShips (MENU_STATE *pMS)
|
|||||||
}
|
}
|
||||||
else if (pMS->delta_item & MODIFY_CREW_FLAG)
|
else if (pMS->delta_item & MODIFY_CREW_FLAG)
|
||||||
{
|
{
|
||||||
SIZE crew_delta, crew_bought;
|
// Hire or dismiss crew for the flagship or an escort
|
||||||
SHIP_FRAGMENT *StarShipPtr;
|
// ship.
|
||||||
|
DMS_ModifyCrew (pMS, hStarShip, dy);
|
||||||
if (hStarShip)
|
|
||||||
StarShipPtr = LockShipFrag (&GLOBAL (built_ship_q),
|
|
||||||
hStarShip);
|
|
||||||
else
|
|
||||||
StarShipPtr = NULL; // Keeping compiler quiet.
|
|
||||||
|
|
||||||
SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN,
|
|
||||||
MENU_SOUND_SELECT | MENU_SOUND_CANCEL);
|
|
||||||
crew_delta = 0;
|
|
||||||
if (dy < 0)
|
|
||||||
{
|
|
||||||
// Buy crew
|
|
||||||
if (hStarShip == 0)
|
|
||||||
{
|
|
||||||
// Buy crew for the flagship.
|
|
||||||
if (GetCPodCapacity (&r.corner) > GetCrewCount ()
|
|
||||||
&& GLOBAL_SIS (ResUnits) >=
|
|
||||||
(DWORD)GLOBAL (CrewCost))
|
|
||||||
{
|
|
||||||
DrawPoint (&r.corner);
|
|
||||||
DeltaSISGauges (1, 0, -GLOBAL (CrewCost));
|
|
||||||
crew_delta = 1;
|
|
||||||
|
|
||||||
SetContext (StatusContext);
|
|
||||||
GetGaugeRect (&r, TRUE);
|
|
||||||
SetFlashRect (&r);
|
|
||||||
SetContext (SpaceContext);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{ // at capacity or not enough RUs
|
|
||||||
PlayMenuSound (MENU_SOUND_FAILURE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Buy crew for an escort ship.
|
|
||||||
HFLEETINFO hTemplate;
|
|
||||||
FLEET_INFO *TemplatePtr;
|
|
||||||
|
|
||||||
hTemplate = GetStarShipFromIndex (
|
|
||||||
&GLOBAL (avail_race_q),
|
|
||||||
StarShipPtr->race_id);
|
|
||||||
TemplatePtr = LockFleetInfo (
|
|
||||||
&GLOBAL (avail_race_q), hTemplate);
|
|
||||||
if (GLOBAL_SIS (ResUnits) >=
|
|
||||||
(DWORD)GLOBAL (CrewCost)
|
|
||||||
&& StarShipPtr->crew_level <
|
|
||||||
StarShipPtr->max_crew &&
|
|
||||||
StarShipPtr->crew_level <
|
|
||||||
TemplatePtr->crew_level)
|
|
||||||
{
|
|
||||||
if (StarShipPtr->crew_level > 0)
|
|
||||||
DeltaSISGauges (0, 0, -GLOBAL (CrewCost));
|
|
||||||
else
|
|
||||||
DeltaSISGauges (0, 0, -(COUNT)ShipCost[
|
|
||||||
StarShipPtr->race_id]);
|
|
||||||
++StarShipPtr->crew_level;
|
|
||||||
crew_delta = 1;
|
|
||||||
ShowShipCrew (StarShipPtr, &pMS->flash_rect0);
|
|
||||||
r.corner.x = pMS->flash_rect0.corner.x;
|
|
||||||
r.corner.y = pMS->flash_rect0.corner.y
|
|
||||||
+ pMS->flash_rect0.extent.height - 6;
|
|
||||||
r.extent.width = SHIP_WIN_WIDTH;
|
|
||||||
r.extent.height = 5;
|
|
||||||
SetContext (SpaceContext);
|
|
||||||
SetFlashRect (&r);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{ // at capacity or not enough RUs
|
|
||||||
PlayMenuSound (MENU_SOUND_FAILURE);
|
|
||||||
}
|
|
||||||
UnlockFleetInfo (&GLOBAL (avail_race_q),
|
|
||||||
hTemplate);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (dy > 0)
|
|
||||||
{
|
|
||||||
// Dismiss crew.
|
|
||||||
crew_bought = (SIZE)MAKE_WORD (
|
|
||||||
GET_GAME_STATE (CREW_PURCHASED0),
|
|
||||||
GET_GAME_STATE (CREW_PURCHASED1));
|
|
||||||
if (hStarShip == 0)
|
|
||||||
{
|
|
||||||
// Dismiss crew from the flagship.
|
|
||||||
if (GetCrewCount ())
|
|
||||||
{
|
|
||||||
DeltaSISGauges (-1, 0, GLOBAL (CrewCost)
|
|
||||||
- (crew_bought ==
|
|
||||||
CREW_EXPENSE_THRESHOLD ? 2 : 0));
|
|
||||||
crew_delta = -1;
|
|
||||||
|
|
||||||
GetCPodCapacity (&r.corner);
|
|
||||||
SetContextForeGroundColor (BLACK_COLOR);
|
|
||||||
DrawPoint (&r.corner);
|
|
||||||
|
|
||||||
SetContext (StatusContext);
|
|
||||||
GetGaugeRect (&r, TRUE);
|
|
||||||
SetFlashRect (&r);
|
|
||||||
SetContext (SpaceContext);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{ // no crew to dismiss
|
|
||||||
PlayMenuSound (MENU_SOUND_FAILURE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Dismiss crew from an escort ship.
|
|
||||||
if (StarShipPtr->crew_level > 0)
|
|
||||||
{
|
|
||||||
if (StarShipPtr->crew_level > 1)
|
|
||||||
{
|
|
||||||
// The ship was not at 'scrap'.
|
|
||||||
// Give one crew member worth of RU.
|
|
||||||
DeltaSISGauges (0, 0, GLOBAL (CrewCost)
|
|
||||||
- (crew_bought ==
|
|
||||||
CREW_EXPENSE_THRESHOLD ? 2 : 0));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// With the last crew member, the ship
|
|
||||||
// will be scrapped.
|
|
||||||
// Give RU for the ship.
|
|
||||||
DeltaSISGauges (0, 0, (COUNT)ShipCost[
|
|
||||||
StarShipPtr->race_id]);
|
|
||||||
}
|
|
||||||
crew_delta = -1;
|
|
||||||
--StarShipPtr->crew_level;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{ // no crew to dismiss
|
|
||||||
PlayMenuSound (MENU_SOUND_FAILURE);
|
|
||||||
}
|
|
||||||
ShowShipCrew (StarShipPtr, &pMS->flash_rect0);
|
|
||||||
r.corner.x = pMS->flash_rect0.corner.x;
|
|
||||||
r.corner.y = pMS->flash_rect0.corner.y
|
|
||||||
+ pMS->flash_rect0.extent.height - 6;
|
|
||||||
r.extent.width = SHIP_WIN_WIDTH;
|
|
||||||
r.extent.height = 5;
|
|
||||||
SetContext (SpaceContext);
|
|
||||||
SetFlashRect (&r);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hStarShip)
|
|
||||||
{
|
|
||||||
UnlockShipFrag (&GLOBAL (built_ship_q), hStarShip);
|
|
||||||
|
|
||||||
// clear out the bought ship index
|
|
||||||
// so that flash rects work correctly
|
|
||||||
pMS->delta_item &= MODIFY_CREW_FLAG;
|
|
||||||
}
|
|
||||||
CrewTransaction (crew_delta);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (cancel)
|
else if (cancel)
|
||||||
@@ -1053,6 +1159,7 @@ DoModifyShips (MENU_STATE *pMS)
|
|||||||
ChangeFlashRect:
|
ChangeFlashRect:
|
||||||
if (HINIBBLE (pMS->CurState))
|
if (HINIBBLE (pMS->CurState))
|
||||||
{
|
{
|
||||||
|
// Flash the flag ship.
|
||||||
pMS->flash_rect0.corner.x = 0;
|
pMS->flash_rect0.corner.x = 0;
|
||||||
pMS->flash_rect0.corner.y = 0;
|
pMS->flash_rect0.corner.y = 0;
|
||||||
pMS->flash_rect0.extent.width = SIS_SCREEN_WIDTH;
|
pMS->flash_rect0.extent.width = SIS_SCREEN_WIDTH;
|
||||||
@@ -1060,10 +1167,13 @@ ChangeFlashRect:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pMS->flash_rect0.corner.x = hangar_x_coords[
|
// Flash the current escort ship slot.
|
||||||
pMS->CurState % HANGAR_SHIPS_ROW];
|
BYTE row = pMS->CurState / HANGAR_SHIPS_ROW;
|
||||||
pMS->flash_rect0.corner.y = HANGAR_Y + (HANGAR_DY *
|
BYTE col = pMS->CurState % HANGAR_SHIPS_ROW;
|
||||||
(pMS->CurState / HANGAR_SHIPS_ROW));
|
|
||||||
|
pMS->flash_rect0.corner.x = hangar_x_coords[col];
|
||||||
|
pMS->flash_rect0.corner.y =
|
||||||
|
HANGAR_Y + (HANGAR_DY * row);
|
||||||
pMS->flash_rect0.extent.width = SHIP_WIN_WIDTH;
|
pMS->flash_rect0.extent.width = SHIP_WIN_WIDTH;
|
||||||
pMS->flash_rect0.extent.height = SHIP_WIN_HEIGHT;
|
pMS->flash_rect0.extent.height = SHIP_WIN_HEIGHT;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user