// 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 CloneShipFragment (COUNT index, PQUEUE pDstQueue, BYTE crew_level) { HSTARSHIP hStarShip, hBuiltShip; SHIP_FRAGMENTPTR TemplatePtr; if ((hStarShip = GetStarShipFromIndex (&GLOBAL (avail_race_q), index)) == 0) return (0); TemplatePtr = (SHIP_FRAGMENTPTR)LockStarShip ( &GLOBAL (avail_race_q), hStarShip ); hBuiltShip = Build (pDstQueue, TemplatePtr->RaceResIndex, TemplatePtr->ShipInfo.ship_flags & (GOOD_GUY | BAD_GUY), (BYTE)(index == SAMATRA_SHIP ? 0 : NameCaptain (pDstQueue, (STARSHIPPTR)TemplatePtr))); if (hBuiltShip) { SHIP_FRAGMENTPTR ShipFragPtr; ShipFragPtr = (SHIP_FRAGMENTPTR)LockStarShip (pDstQueue, hBuiltShip); ShipFragPtr->ShipInfo = TemplatePtr->ShipInfo; if (crew_level) ShipFragPtr->ShipInfo.crew_level = crew_level; ShipFragPtr->ShipInfo.energy_level = 0; ShipFragPtr->ShipInfo.ship_flags = 0; ShipFragPtr->ShipInfo.var1 = ShipFragPtr->ShipInfo.var2 = 0; ShipFragPtr->ShipInfo.loc.x = ShipFragPtr->ShipInfo.loc.y = 0; SET_RACE_ID (ShipFragPtr, (BYTE)index); UnlockStarShip (pDstQueue, hBuiltShip); } UnlockStarShip ( &GLOBAL (avail_race_q), hStarShip ); return (hBuiltShip); }
// Put the ship icons in the PickMeleeFrame, and create a queue // for each player. // XXX TODO: split off creating the queue into a separate function. void FillPickMeleeFrame (MeleeSetup *setup) { COUNT i; CONTEXT OldContext; OldContext = SetContext (OffScreenContext); for (i = 0; i < NUM_SIDES; ++i) { COUNT side; COUNT sideI; RECT r; TEXT t; STAMP s; UNICODE buf[30]; FleetShipIndex index; sideI = GetPlayerOrder (i); side = !sideI; s.frame = SetAbsFrameIndex (PickMeleeFrame, side); SetContextFGFrame (s.frame); GetFrameRect (s.frame, &r); t.baseline.x = r.extent.width >> 1; t.baseline.y = r.extent.height - NAME_AREA_HEIGHT + RES_SCALE(4); r.corner.x += RES_SCALE(2); r.corner.y += RES_SCALE(2); r.extent.width -= RES_SCALE((2 * 2) + (RES_DESCALE(ICON_WIDTH) + 2) + 1); // JMS_GFX r.extent.height -= RES_SCALE(2 * 2) + NAME_AREA_HEIGHT; // JMS_GFX SetContextForeGroundColor (PICK_BG_COLOR); DrawFilledRectangle (&r); r.corner.x += RES_SCALE(2); // JMS_GFX r.extent.width += RES_SCALE((RES_DESCALE(ICON_WIDTH) + 2) - (2 * 2)); // JMS_GFX r.corner.y += r.extent.height; r.extent.height = NAME_AREA_HEIGHT; DrawFilledRectangle (&r); // Team name at the bottom of the frame: t.align = ALIGN_CENTER; t.pStr = MeleeSetup_getTeamName (setup, sideI); t.CharCount = (COUNT) ~0; SetContextFont (TinyFont); SetContextForeGroundColor (PICKSHIP_TEAM_NAME_TEXT_COLOR); font_DrawText (&t); // Total team value of the starting team: sprintf (buf, "%u", MeleeSetup_getFleetValue (setup, sideI)); t.baseline.x = RES_SCALE(4); t.baseline.y = RES_SCALE(7); t.align = ALIGN_LEFT; t.pStr = buf; t.CharCount = (COUNT)~0; SetContextForeGroundColor (PICKSHIP_TEAM_START_VALUE_COLOR); font_DrawText (&t); assert (CountLinks (&race_q[side]) == 0); for (index = 0; index < MELEE_FLEET_SIZE; index++) { MeleeShip StarShip; StarShip = MeleeSetup_getShip (setup, sideI, index); if (StarShip == MELEE_NONE) continue; { BYTE row, col; BYTE ship_cost; HMASTERSHIP hMasterShip; HSTARSHIP hBuiltShip; MASTER_SHIP_INFO *MasterPtr; STARSHIP *BuiltShipPtr; BYTE captains_name_index; hMasterShip = GetStarShipFromIndex (&master_q, StarShip); MasterPtr = LockMasterShip (&master_q, hMasterShip); captains_name_index = NameCaptain (&race_q[side], MasterPtr->SpeciesID); hBuiltShip = Build (&race_q[side], MasterPtr->SpeciesID); // Draw the icon. row = PickMelee_GetShipRow (index); col = PickMelee_GetShipColumn (index); s.origin.x = RES_SCALE(4) + ((ICON_WIDTH + RES_SCALE(2)) * col); // JMS_GFX s.origin.y = RES_SCALE(10) + ((ICON_HEIGHT + RES_SCALE(2)) * row); s.frame = MasterPtr->ShipInfo.icons; DrawStamp (&s); ship_cost = MasterPtr->ShipInfo.ship_cost; UnlockMasterShip (&master_q, hMasterShip); BuiltShipPtr = LockStarShip (&race_q[side], hBuiltShip); BuiltShipPtr->index = index; BuiltShipPtr->ship_cost = ship_cost; BuiltShipPtr->playerNr = side; BuiltShipPtr->captains_name_index = captains_name_index; // The next ones are not used in Melee BuiltShipPtr->crew_level = 0; BuiltShipPtr->max_crew = 0; BuiltShipPtr->race_strings = 0; BuiltShipPtr->icons = 0; BuiltShipPtr->RaceDescPtr = 0; UnlockStarShip (&race_q[side], hBuiltShip); } } } SetContext (OldContext); }