BYTE NameCaptain (QUEUE *pQueue, SPECIES_ID SpeciesID) { BYTE name_index; HLINK hStarShip; assert (GetLinkSize (pQueue) == sizeof (STARSHIP) || GetLinkSize (pQueue) == sizeof (SHIP_FRAGMENT)); do { HLINK hNextShip; name_index = PickCaptainName (); for (hStarShip = GetHeadLink (pQueue); hStarShip; hStarShip = hNextShip) { SHIP_BASE *ShipPtr; BYTE test_name_index = -1; ShipPtr = (SHIP_BASE *) LockLink (pQueue, hStarShip); hNextShip = _GetSuccLink (ShipPtr); if (ShipPtr->SpeciesID == SpeciesID) test_name_index = ShipPtr->captains_name_index; UnlockLink (pQueue, hStarShip); if (name_index == test_name_index) break; } } while (hStarShip /* name matched another ship */); return name_index; }
// Allocate a new STARSHIP or SHIP_FRAGMENT and put it in the queue HLINK Build (QUEUE *pQueue, SPECIES_ID SpeciesID) { HLINK hNewShip; SHIP_BASE *ShipPtr; assert (GetLinkSize (pQueue) == sizeof (STARSHIP) || GetLinkSize (pQueue) == sizeof (SHIP_FRAGMENT)); hNewShip = AllocLink (pQueue); if (!hNewShip) return 0; ShipPtr = (SHIP_BASE *) LockLink (pQueue, hNewShip); memset (ShipPtr, 0, GetLinkSize (pQueue)); ShipPtr->SpeciesID = SpeciesID; UnlockLink (pQueue, hNewShip); PutQueue (pQueue, hNewShip); return hNewShip; }
// 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; }
HSTARSHIP Build (PQUEUE pQueue, DWORD RaceResIndex, COUNT which_player, BYTE captains_name_index) { HSTARSHIP hNewShip; if ((hNewShip = AllocStarShip (pQueue)) != 0) { STARSHIPPTR StarShipPtr; StarShipPtr = LockStarShip (pQueue, hNewShip); memset (StarShipPtr, 0, GetLinkSize (pQueue)); StarShipPtr->RaceResIndex = RaceResIndex; OwnStarShip (StarShipPtr, which_player, captains_name_index); UnlockStarShip (pQueue, hNewShip); PutQueue (pQueue, hNewShip); } return (hNewShip); }