summaryrefslogtreecommitdiff
path: root/src/uqm/master.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/uqm/master.c')
-rw-r--r--src/uqm/master.c217
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;
+}
+
+