diff options
Diffstat (limited to 'src/uqm/master.c')
-rw-r--r-- | src/uqm/master.c | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/src/uqm/master.c b/src/uqm/master.c new file mode 100644 index 0000000..5c35aab --- /dev/null +++ b/src/uqm/master.c @@ -0,0 +1,217 @@ +//Copyright Paul Reiche, Fred Ford. 1992-2002 + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "master.h" + +#include "build.h" +#include "resinst.h" +#include "displist.h" +#include "supermelee/melee.h" + + +QUEUE master_q; + +void +LoadMasterShipList (void (* YieldProcessing)(void)) +{ + COUNT num_entries; + SPECIES_ID s_id = ARILOU_ID; + num_entries = LAST_MELEE_ID - ARILOU_ID + 1; + InitQueue (&master_q, num_entries, sizeof (MASTER_SHIP_INFO)); + while (num_entries--) + { + HMASTERSHIP hBuiltShip; + char *builtName; + HMASTERSHIP hStarShip, hNextShip; + MASTER_SHIP_INFO *BuiltPtr; + RACE_DESC *RDPtr; + + hBuiltShip = AllocLink (&master_q); + if (!hBuiltShip) + continue; + + // Allow other things to run + // supposedly, loading ship packages and data takes some time + if (YieldProcessing) + YieldProcessing (); + + BuiltPtr = LockMasterShip (&master_q, hBuiltShip); + BuiltPtr->SpeciesID = s_id++; + RDPtr = load_ship (BuiltPtr->SpeciesID, FALSE); + if (!RDPtr) + { + UnlockMasterShip (&master_q, hBuiltShip); + continue; + } + + // Grab a copy of loaded icons, strings and info + // XXX: SHIP_INFO implicitly referenced here + BuiltPtr->ShipInfo = RDPtr->ship_info; + BuiltPtr->Fleet = RDPtr->fleet; + free_ship (RDPtr, FALSE, FALSE); + + builtName = GetStringAddress (SetAbsStringTableIndex ( + BuiltPtr->ShipInfo.race_strings, 2)); + UnlockMasterShip (&master_q, hBuiltShip); + + // Insert the ship in the master queue in the right location + // to keep the list sorted on the name of the race. + for (hStarShip = GetHeadLink (&master_q); + hStarShip; hStarShip = hNextShip) + { + char *curName; + MASTER_SHIP_INFO *MasterPtr; + + MasterPtr = LockMasterShip (&master_q, hStarShip); + hNextShip = _GetSuccLink (MasterPtr); + curName = GetStringAddress (SetAbsStringTableIndex ( + MasterPtr->ShipInfo.race_strings, 2)); + UnlockMasterShip (&master_q, hStarShip); + + if (strcmp (builtName, curName) < 0) + break; + } + InsertQueue (&master_q, hBuiltShip, hStarShip); + } +} + +void +FreeMasterShipList (void) +{ + HMASTERSHIP hStarShip, hNextShip; + + for (hStarShip = GetHeadLink (&master_q); + hStarShip != 0; hStarShip = hNextShip) + { + MASTER_SHIP_INFO *MasterPtr; + + MasterPtr = LockMasterShip (&master_q, hStarShip); + hNextShip = _GetSuccLink (MasterPtr); + + DestroyDrawable (ReleaseDrawable (MasterPtr->ShipInfo.melee_icon)); + DestroyDrawable (ReleaseDrawable (MasterPtr->ShipInfo.icons)); + DestroyStringTable (ReleaseStringTable ( + MasterPtr->ShipInfo.race_strings)); + + UnlockMasterShip (&master_q, hStarShip); + } + + UninitQueue (&master_q); +} + +HMASTERSHIP +FindMasterShip (SPECIES_ID ship_ref) +{ + HMASTERSHIP hStarShip, hNextShip; + + for (hStarShip = GetHeadLink (&master_q); hStarShip; hStarShip = hNextShip) + { + SPECIES_ID ref; + MASTER_SHIP_INFO *MasterPtr; + + MasterPtr = LockMasterShip (&master_q, hStarShip); + hNextShip = _GetSuccLink (MasterPtr); + ref = MasterPtr->SpeciesID; + UnlockMasterShip (&master_q, hStarShip); + + if (ref == ship_ref) + break; + } + + return (hStarShip); +} + +int +FindMasterShipIndex (SPECIES_ID ship_ref) +{ + HMASTERSHIP hStarShip, hNextShip; + int index; + + for (index = 0, hStarShip = GetHeadLink (&master_q); hStarShip; + ++index, hStarShip = hNextShip) + { + SPECIES_ID ref; + MASTER_SHIP_INFO *MasterPtr; + + MasterPtr = LockMasterShip (&master_q, hStarShip); + hNextShip = _GetSuccLink (MasterPtr); + ref = MasterPtr->SpeciesID; + UnlockMasterShip (&master_q, hStarShip); + + if (ref == ship_ref) + break; + } + + return hStarShip ? index : -1; +} + +COUNT +GetShipCostFromIndex (unsigned Index) +{ + HMASTERSHIP hMasterShip; + MASTER_SHIP_INFO *MasterPtr; + COUNT val; + + hMasterShip = GetStarShipFromIndex (&master_q, Index); + if (!hMasterShip) + return 0; + + MasterPtr = LockMasterShip (&master_q, hMasterShip); + val = MasterPtr->ShipInfo.ship_cost; + UnlockMasterShip (&master_q, hMasterShip); + + return val; +} + +FRAME +GetShipIconsFromIndex (unsigned Index) +{ + HMASTERSHIP hMasterShip; + MASTER_SHIP_INFO *MasterPtr; + FRAME val; + + hMasterShip = GetStarShipFromIndex (&master_q, Index); + if (!hMasterShip) + return 0; + + MasterPtr = LockMasterShip (&master_q, hMasterShip); + val = MasterPtr->ShipInfo.icons; + UnlockMasterShip (&master_q, hMasterShip); + + return val; +} + +FRAME +GetShipMeleeIconsFromIndex (unsigned Index) +{ + HMASTERSHIP hMasterShip; + MASTER_SHIP_INFO *MasterPtr; + FRAME val; + + hMasterShip = GetStarShipFromIndex (&master_q, Index); + if (!hMasterShip) + return 0; + + MasterPtr = LockMasterShip (&master_q, hMasterShip); + val = MasterPtr->ShipInfo.melee_icon; + UnlockMasterShip (&master_q, hMasterShip); + + return val; +} + + |