/* * Make the sphere of influence for the specified race shown on the starmap * in the future. * The value returned is 'race', unless the type of ship is only available * in SuperMelee, in which case 0 is returned. */ COUNT StartSphereTracking (COUNT race) { HFLEETINFO hFleet; FLEET_INFO *FleetPtr; hFleet = GetStarShipFromIndex (&GLOBAL (avail_race_q), race); if (!hFleet) return 0; FleetPtr = LockFleetInfo (&GLOBAL (avail_race_q), hFleet); if (FleetPtr->actual_strength == 0) { if (FleetPtr->allied_state == DEAD_GUY) { // Race is extinct. UnlockFleetInfo (&GLOBAL (avail_race_q), hFleet); return 0; } } else if (FleetPtr->known_strength == 0 && FleetPtr->actual_strength != INFINITE_RADIUS) { FleetPtr->known_strength = 1; FleetPtr->known_loc = FleetPtr->loc; } UnlockFleetInfo (&GLOBAL (avail_race_q), hFleet); return race; }
/* * Check whether we are tracking the SoI of a race. * If a race has no SoI, this function will always return false. */ BOOLEAN CheckSphereTracking (RACE_ID race) { HFLEETINFO hFleet; FLEET_INFO *FleetPtr; COUNT result; hFleet = GetStarShipFromIndex (&GLOBAL (avail_race_q), race); if (!hFleet) return FALSE; FleetPtr = LockFleetInfo (&GLOBAL (avail_race_q), hFleet); if (FleetPtr->actual_strength == 0) { // Race has no Sphere of Influence. // Maybe it never had one, or maybe the race is extinct. result = FALSE; } else { result = (FleetPtr->known_strength > 0); } UnlockFleetInfo (&GLOBAL (avail_race_q), hFleet); return result; }
static BOOLEAN DeltaSupportCrew (ROSTER_STATE *rosterState, SIZE crew_delta) { BOOLEAN ret = FALSE; UNICODE buf[40]; HFLEETINFO hTemplate; HSHIPFRAG hShipFrag; SHIP_FRAGMENT *StarShipPtr; FLEET_INFO *TemplatePtr; StarShipPtr = LockSupportShip (rosterState, &hShipFrag); if (!StarShipPtr) return FALSE; hTemplate = GetStarShipFromIndex (&GLOBAL (avail_race_q), StarShipPtr->race_id); TemplatePtr = LockFleetInfo (&GLOBAL (avail_race_q), hTemplate); StarShipPtr->crew_level += crew_delta; if (StarShipPtr->crew_level == 0) StarShipPtr->crew_level = 1; else if (StarShipPtr->crew_level > TemplatePtr->crew_level && crew_delta > 0) StarShipPtr->crew_level -= crew_delta; else { if (StarShipPtr->crew_level >= TemplatePtr->crew_level) sprintf (buf, "%u", StarShipPtr->crew_level); else sprintf (buf, "%u/%u", StarShipPtr->crew_level, TemplatePtr->crew_level); PreUpdateFlashRect (); DrawStatusMessage (buf); PostUpdateFlashRect (); DeltaSISGauges (-crew_delta, 0, 0); if (crew_delta) { flashSupportShipCrew (); } ret = TRUE; } UnlockFleetInfo (&GLOBAL (avail_race_q), hTemplate); UnlockShipFrag (&GLOBAL (built_ship_q), hShipFrag); return ret; }
static void SpinStarShip (MENU_STATE *pMS, HFLEETINFO hStarShip) { int Index; FLEET_INFO *FleetPtr; FleetPtr = LockFleetInfo (&GLOBAL (avail_race_q), hStarShip); Index = FindMasterShipIndex (FleetPtr->SpeciesID); UnlockFleetInfo (&GLOBAL (avail_race_q), hStarShip); if (Index >= 0 && Index < NUM_MELEE_SHIPS) { DoShipSpin (Index, pMS->hMusic); } }
/* * Test the alliance status of the specified race. * Either DEAD_GUY (extinct), GOOD_GUY (allied), or BAD_GUY (not allied) is * returned. */ COUNT CheckAlliance (COUNT race) { HFLEETINFO hFleet; UWORD flags; FLEET_INFO *FleetPtr; hFleet = GetStarShipFromIndex (&GLOBAL (avail_race_q), race); if (!hFleet) return 0; FleetPtr = LockFleetInfo (&GLOBAL (avail_race_q), hFleet); flags = FleetPtr->allied_state; UnlockFleetInfo (&GLOBAL (avail_race_q), hFleet); return flags; }
static void SpinStarShip (HFLEETINFO hStarShip) { int Index; FLEET_INFO *FleetPtr; FleetPtr = LockFleetInfo (&GLOBAL (avail_race_q), hStarShip); Index = FindMasterShipIndex (FleetPtr->SpeciesID); UnlockFleetInfo (&GLOBAL (avail_race_q), hStarShip); if (Index >= 0 && Index < NUM_MELEE_SHIPS) { UnlockMutex (GraphicsLock); DoShipSpin (Index, pMenuState->hMusic); LockMutex (GraphicsLock); } }
static void LoadRaceQueue (DECODE_REF fh, QUEUE *pQueue) { COUNT num_links; cread_16 (fh, &num_links); while (num_links--) { HFLEETINFO hStarShip; FLEET_INFO *FleetPtr; COUNT Index; BYTE tmpb; cread_16 (fh, &Index); hStarShip = GetStarShipFromIndex (pQueue, Index); FleetPtr = LockFleetInfo (pQueue, hStarShip); // Read FLEET_INFO elements cread_16 (fh, &FleetPtr->allied_state); cread_8 (fh, &FleetPtr->days_left); cread_8 (fh, &FleetPtr->growth_fract); cread_8 (fh, &tmpb); FleetPtr->crew_level = tmpb; cread_8 (fh, &tmpb); FleetPtr->max_crew = tmpb; cread_8 (fh, &FleetPtr->growth); cread_8 (fh, &FleetPtr->max_energy); cread_16s(fh, &FleetPtr->loc.x); cread_16s(fh, &FleetPtr->loc.y); cread_16 (fh, &FleetPtr->actual_strength); cread_16 (fh, &FleetPtr->known_strength); cread_16s(fh, &FleetPtr->known_loc.x); cread_16s(fh, &FleetPtr->known_loc.y); cread_8 (fh, &FleetPtr->growth_err_term); cread_8 (fh, &FleetPtr->func_index); cread_16s(fh, &FleetPtr->dest_loc.x); cread_16s(fh, &FleetPtr->dest_loc.y); cread_16 (fh, NULL); /* alignment padding */ UnlockFleetInfo (pQueue, hStarShip); } }
// crew_level can be set to INFINITE_FLEET for a ship which is to // represent an infinite number of ships. HSHIPFRAG CloneShipFragment (COUNT shipIndex, QUEUE *pDstQueue, COUNT crew_level) { HFLEETINFO hFleet; HSHIPFRAG hBuiltShip; FLEET_INFO *TemplatePtr; BYTE captains_name_index; assert (GetLinkSize (pDstQueue) == sizeof (SHIP_FRAGMENT)); hFleet = GetStarShipFromIndex (&GLOBAL (avail_race_q), shipIndex); if (!hFleet) return 0; TemplatePtr = LockFleetInfo (&GLOBAL (avail_race_q), hFleet); if (shipIndex == SAMATRA_SHIP) captains_name_index = 0; else captains_name_index = NameCaptain (pDstQueue, TemplatePtr->SpeciesID); hBuiltShip = Build (pDstQueue, TemplatePtr->SpeciesID); if (hBuiltShip) { SHIP_FRAGMENT *ShipFragPtr; ShipFragPtr = LockShipFrag (pDstQueue, hBuiltShip); ShipFragPtr->captains_name_index = captains_name_index; ShipFragPtr->race_strings = TemplatePtr->race_strings; ShipFragPtr->icons = TemplatePtr->icons; ShipFragPtr->melee_icon = TemplatePtr->melee_icon; if (crew_level) ShipFragPtr->crew_level = crew_level; else ShipFragPtr->crew_level = TemplatePtr->crew_level; ShipFragPtr->max_crew = TemplatePtr->max_crew; ShipFragPtr->energy_level = 0; ShipFragPtr->max_energy = TemplatePtr->max_energy; ShipFragPtr->race_id = (BYTE)shipIndex; ShipFragPtr->index = 0; UnlockShipFrag (pDstQueue, hBuiltShip); } UnlockFleetInfo (&GLOBAL (avail_race_q), hFleet); return hBuiltShip; }
/* * Returns the size of the fleet of the specified race when the starmap was * last checked. If the race has no SoI, 0 is returned. */ COUNT GetRaceKnownSize (COUNT race) { HFLEETINFO hFleet; FLEET_INFO *FleetPtr; COUNT result; hFleet = GetStarShipFromIndex (&GLOBAL (avail_race_q), race); if (!hFleet) return 0; FleetPtr = LockFleetInfo (&GLOBAL (avail_race_q), hFleet); result = FleetPtr->known_strength; UnlockFleetInfo (&GLOBAL (avail_race_q), hFleet); return result; }
BOOLEAN KillRace (RACE_ID race) { HFLEETINFO hFleet; FLEET_INFO *FleetPtr; hFleet = GetStarShipFromIndex (&GLOBAL (avail_race_q), race); if (!hFleet) return FALSE; FleetPtr = LockFleetInfo (&GLOBAL (avail_race_q), hFleet); FleetPtr->allied_state = DEAD_GUY; FleetPtr->actual_strength = 0; UnlockFleetInfo (&GLOBAL (avail_race_q), hFleet); return TRUE; }
/* * Allows the building of ships regardless of alliance state * flag == TRUE: Allow to build ship * flag == FALSE: Normal, not allowed to build ships if not allied. */ BOOLEAN SetRaceAllowBuild (RACE_ID race) { HFLEETINFO hFleet; FLEET_INFO *FleetPtr; hFleet = GetStarShipFromIndex (&GLOBAL (avail_race_q), race); if (!hFleet) return FALSE; FleetPtr = LockFleetInfo (&GLOBAL (avail_race_q), hFleet); if (FleetPtr->allied_state != GOOD_GUY) { FleetPtr->allied_state = CAN_BUILD; } UnlockFleetInfo (&GLOBAL (avail_race_q), hFleet); return TRUE; }
// Count the ships which can be built by the player. static COUNT GetAvailableRaceCount (void) { COUNT Index; HFLEETINFO hStarShip, hNextShip; Index = 0; for (hStarShip = GetHeadLink (&GLOBAL (avail_race_q)); hStarShip; hStarShip = hNextShip) { FLEET_INFO *FleetPtr; FleetPtr = LockFleetInfo (&GLOBAL (avail_race_q), hStarShip); if (FleetPtr->allied_state == GOOD_GUY) ++Index; hNextShip = _GetSuccLink (FleetPtr); UnlockFleetInfo (&GLOBAL (avail_race_q), hStarShip); } return Index; }
void activateAllShips (void) { HFLEETINFO hStarShip, hNextShip; for (hStarShip = GetHeadLink (&GLOBAL (avail_race_q)); hStarShip != NULL; hStarShip = hNextShip) { FLEET_INFO *FleetPtr; FleetPtr = LockFleetInfo (&GLOBAL (avail_race_q), hStarShip); hNextShip = _GetSuccLink (FleetPtr); if (FleetPtr->icons != NULL) // Skip the Ur-Quan probe. { FleetPtr->allied_state = GOOD_GUY; } UnlockFleetInfo (&GLOBAL (avail_race_q), hStarShip); } }
/* * Start or end an alliance with the specified race. * Being in an alliance with a race makes their ships available for building * in the shipyard. * flag == TRUE: start an alliance * flag == TRUE: end an alliance */ COUNT SetRaceAllied (COUNT race, BOOLEAN flag) { HFLEETINFO hFleet; FLEET_INFO *FleetPtr; hFleet = GetStarShipFromIndex (&GLOBAL (avail_race_q), race); if (!hFleet) return 0; FleetPtr = LockFleetInfo (&GLOBAL (avail_race_q), hFleet); if (FleetPtr->allied_state == DEAD_GUY) { /* Strange request, silently ignore it */ } else { FleetPtr->allied_state = (flag ? GOOD_GUY : BAD_GUY); } UnlockFleetInfo (&GLOBAL (avail_race_q), hFleet); return 1; }
void showSpheres (void) { HFLEETINFO hStarShip, hNextShip; for (hStarShip = GetHeadLink (&GLOBAL (avail_race_q)); hStarShip != NULL; hStarShip = hNextShip) { FLEET_INFO *FleetPtr; FleetPtr = LockFleetInfo (&GLOBAL (avail_race_q), hStarShip); hNextShip = _GetSuccLink (FleetPtr); if ((FleetPtr->actual_strength != INFINITE_RADIUS) && (FleetPtr->known_strength != FleetPtr->actual_strength)) { FleetPtr->known_strength = FleetPtr->actual_strength; FleetPtr->known_loc = FleetPtr->loc; } UnlockFleetInfo (&GLOBAL (avail_race_q), hStarShip); } }
static HFLEETINFO GetAvailableRaceFromIndex (BYTE Index) { HFLEETINFO hStarShip, hNextShip; for (hStarShip = GetHeadLink (&GLOBAL (avail_race_q)); hStarShip; hStarShip = hNextShip) { FLEET_INFO *FleetPtr; FleetPtr = LockFleetInfo (&GLOBAL (avail_race_q), hStarShip); if (FleetPtr->allied_state == GOOD_GUY && Index-- == 0) { UnlockFleetInfo (&GLOBAL (avail_race_q), hStarShip); return hStarShip; } hNextShip = _GetSuccLink (FleetPtr); UnlockFleetInfo (&GLOBAL (avail_race_q), hStarShip); } return 0; }
/* Set the crew and captain's name on the first fully-crewed escort * ship of race 'which_ship' */ int SetEscortCrewComplement (COUNT which_ship, COUNT crew_level, BYTE captain) { HFLEETINFO hFleet; FLEET_INFO *TemplatePtr; HSHIPFRAG hStarShip, hNextShip; SHIP_FRAGMENT *StarShipPtr = 0; int Index; hFleet = GetStarShipFromIndex (&GLOBAL (avail_race_q), which_ship); if (!hFleet) return -1; TemplatePtr = LockFleetInfo (&GLOBAL (avail_race_q), hFleet); /* Find first ship of which_ship race */ for (hStarShip = GetHeadLink (&GLOBAL (built_ship_q)), Index = 0; hStarShip; hStarShip = hNextShip, ++Index) { StarShipPtr = LockShipFrag (&GLOBAL (built_ship_q), hStarShip); hNextShip = _GetSuccLink (StarShipPtr); if (which_ship == StarShipPtr->race_id && StarShipPtr->crew_level == TemplatePtr->crew_level) break; /* found one */ UnlockShipFrag (&GLOBAL (built_ship_q), hStarShip); } if (hStarShip) { StarShipPtr->crew_level = crew_level; StarShipPtr->captains_name_index = captain; UnlockShipFrag (&GLOBAL (built_ship_q), hStarShip); } else Index = -1; UnlockFleetInfo (&GLOBAL (avail_race_q), hFleet); return Index; }
static BOOLEAN DeltaSupportCrew (SIZE crew_delta) { BOOLEAN ret = FALSE; UNICODE buf[40]; HFLEETINFO hTemplate; SHIP_FRAGMENT *StarShipPtr; FLEET_INFO *TemplatePtr; StarShipPtr = LockShipFrag (&GLOBAL (built_ship_q), (HSHIPFRAG)pMenuState->CurFrame); hTemplate = GetStarShipFromIndex (&GLOBAL (avail_race_q), StarShipPtr->race_id); TemplatePtr = LockFleetInfo (&GLOBAL (avail_race_q), hTemplate); if (crew_delta > 0) { while (crew_delta && (StarShipPtr->crew_level + crew_delta) > StarShipPtr->max_crew) crew_delta--; } else if (crew_delta < 0) { while (crew_delta && (StarShipPtr->crew_level + crew_delta) < 1) crew_delta++; } StarShipPtr->crew_level += crew_delta; if (StarShipPtr->crew_level == 0) StarShipPtr->crew_level = 1; else if (StarShipPtr->crew_level > TemplatePtr->crew_level && crew_delta > 0) StarShipPtr->crew_level -= crew_delta; else { if (StarShipPtr->crew_level >= TemplatePtr->crew_level) sprintf (buf, "%u", StarShipPtr->crew_level); else sprintf (buf, "%u/%u", StarShipPtr->crew_level, TemplatePtr->crew_level); DrawStatusMessage (buf); DeltaSISGauges (-crew_delta, 0, 0); if (crew_delta) { RECT r; r.corner.x = 2; r.corner.y = 130; r.extent.width = STATUS_MESSAGE_WIDTH; r.extent.height = STATUS_MESSAGE_HEIGHT; SetContext (StatusContext); SetFlashRect (&r, (FRAME)0); } ret = TRUE; } UnlockFleetInfo (&GLOBAL (avail_race_q), hTemplate); UnlockShipFrag (&GLOBAL (built_ship_q), (HSHIPFRAG)pMenuState->CurFrame); return ret; }
static void DrawRaceStrings (MENU_STATE *pMS, BYTE NewRaceItem) { RECT r; STAMP s; CONTEXT OldContext; OldContext = SetContext (StatusContext); GetContextClipRect (&r); s.origin.x = RADAR_X - r.corner.x; s.origin.y = RADAR_Y - r.corner.y; r.corner.x = s.origin.x - 1; r.corner.y = s.origin.y - 11; r.extent.width = RADAR_WIDTH + 2; r.extent.height = 11; BatchGraphics (); ClearSISRect (CLEAR_SIS_RADAR); SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x0A), 0x08)); DrawFilledRectangle (&r); r.corner = s.origin; r.extent.width = RADAR_WIDTH; r.extent.height = RADAR_HEIGHT; SetContextForeGroundColor (BLACK_COLOR); DrawFilledRectangle (&r); if (NewRaceItem != (BYTE)~0) { TEXT t; HFLEETINFO hStarShip; FLEET_INFO *FleetPtr; UNICODE buf[30]; hStarShip = GetAvailableRaceFromIndex (NewRaceItem); NewRaceItem = GetIndexFromStarShip (&GLOBAL (avail_race_q), hStarShip); // Draw the ship name, above the ship image. s.frame = SetAbsFrameIndex (pMS->ModuleFrame, 3 + NewRaceItem); DrawStamp (&s); // Draw the ship image. FleetPtr = LockFleetInfo (&GLOBAL (avail_race_q), hStarShip); s.frame = FleetPtr->melee_icon; UnlockFleetInfo (&GLOBAL (avail_race_q), hStarShip); t.baseline.x = s.origin.x + RADAR_WIDTH - 2; t.baseline.y = s.origin.y + RADAR_HEIGHT - 2; s.origin.x += (RADAR_WIDTH >> 1); s.origin.y += (RADAR_HEIGHT >> 1); DrawStamp (&s); // Print the ship cost. t.align = ALIGN_RIGHT; t.CharCount = (COUNT)~0; t.pStr = buf; sprintf (buf, "%u", ShipCost[NewRaceItem]); SetContextFont (TinyFont); SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x00, 0x1F, 0x00), 0x02)); font_DrawText (&t); }