summaryrefslogtreecommitdiff
path: root/src/uqm/supermelee/loadmele.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/uqm/supermelee/loadmele.c')
-rw-r--r--src/uqm/supermelee/loadmele.c826
1 files changed, 826 insertions, 0 deletions
diff --git a/src/uqm/supermelee/loadmele.c b/src/uqm/supermelee/loadmele.c
new file mode 100644
index 0000000..d5917c3
--- /dev/null
+++ b/src/uqm/supermelee/loadmele.c
@@ -0,0 +1,826 @@
+//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.
+ */
+
+// This file handles loading of teams, but the UI and the actual loading.
+
+#define MELEESETUP_INTERNAL
+#include "melee.h"
+
+#include "../controls.h"
+#include "../gameopt.h"
+#include "../gamestr.h"
+#include "../globdata.h"
+#include "../master.h"
+#include "meleesetup.h"
+#include "../save.h"
+#include "../setup.h"
+#include "../sounds.h"
+#include "options.h"
+#include "libs/log.h"
+#include "libs/memlib.h"
+
+
+#define LOAD_TEAM_NAME_TEXT_COLOR \
+ BUILD_COLOR (MAKE_RGB15 (0x0F, 0x10, 0x1B), 0x00)
+#define LOAD_TEAM_NAME_TEXT_COLOR_HILITE \
+ BUILD_COLOR (MAKE_RGB15 (0x17, 0x18, 0x1D), 0x00)
+
+
+#define LOAD_MELEE_BOX_WIDTH 34
+#define LOAD_MELEE_BOX_HEIGHT 34
+#define LOAD_MELEE_BOX_SPACE 1
+
+
+static void DrawFileStrings (MELEE_STATE *pMS);
+static bool FillFileView (MELEE_STATE *pMS);
+
+
+static bool
+LoadTeamImage (DIRENTRY DirEntry, MeleeTeam *team)
+{
+ const char *fileName;
+ uio_Stream *stream;
+
+ fileName = GetDirEntryAddress (DirEntry);
+
+ stream = uio_fopen (meleeDir, fileName, "rb");
+ if (stream == NULL)
+ return false;
+
+ if (MeleeTeam_deserialize (team, stream) == -1)
+ return false;
+
+ uio_fclose (stream);
+
+ return true;
+}
+
+#if 0 /* Not used */
+static void
+UnindexFleet (MELEE_STATE *pMS, COUNT index)
+{
+ assert (index < pMS->load.numIndices);
+ pMS->load.numIndices--;
+ memmove (&pMS->load.entryIndices[index],
+ &pMS->load.entryIndices[index + 1],
+ (pMS->load.numIndices - index) * sizeof pMS->load.entryIndices[0]);
+}
+#endif
+
+static void
+UnindexFleets (MELEE_STATE *pMS, COUNT index, COUNT count)
+{
+ assert (index + count <= pMS->load.numIndices);
+
+ pMS->load.numIndices -= count;
+ memmove (&pMS->load.entryIndices[index],
+ &pMS->load.entryIndices[index + count],
+ (pMS->load.numIndices - index) * sizeof pMS->load.entryIndices[0]);
+}
+
+static bool
+GetFleetByIndex (MELEE_STATE *pMS, COUNT index, MeleeTeam *result)
+{
+ COUNT firstIndex;
+
+ if (index < pMS->load.preBuiltCount)
+ {
+ MeleeTeam_copy (result, pMS->load.preBuiltList[index]);
+ return true;
+ }
+
+ index -= pMS->load.preBuiltCount;
+ firstIndex = index;
+
+ for ( ; index < pMS->load.numIndices; index++)
+ {
+ DIRENTRY entry = SetAbsDirEntryTableIndex (pMS->load.dirEntries,
+ pMS->load.entryIndices[index]);
+ if (LoadTeamImage (entry, result))
+ break; // Success
+
+ {
+ const char *fileName;
+ fileName = GetDirEntryAddress (entry);
+ log_add (log_Warning, "Warning: File '%s' is not a valid "
+ "SuperMelee team.", fileName);
+ }
+ }
+
+ if (index != firstIndex)
+ UnindexFleets (pMS, firstIndex, index - firstIndex);
+
+ return index < pMS->load.numIndices;
+}
+
+// returns (COUNT) -1 if not found
+static COUNT
+GetFleetIndexByFileName (MELEE_STATE *pMS, const char *fileName)
+{
+ COUNT index;
+
+ for (index = 0; index < pMS->load.numIndices; index++)
+ {
+ DIRENTRY entry = SetAbsDirEntryTableIndex (pMS->load.dirEntries,
+ pMS->load.entryIndices[index]);
+ const char *entryName = GetDirEntryAddress (entry);
+
+ if (strcasecmp ((const char *) entryName, fileName) == 0)
+ return pMS->load.preBuiltCount + index;
+ }
+
+ return (COUNT) -1;
+}
+
+// Auxiliary function for DrawFileStrings
+// If drawShips is set the ships themselves are drawn, in addition to the
+// fleet name and value; if not, only the fleet name and value are drawn.
+// If highlite is set the text is drawn in the color used for highlighting.
+static void
+DrawFileString (const MeleeTeam *team, const POINT *origin,
+ BOOLEAN drawShips, BOOLEAN highlite)
+{
+ SetContextForeGroundColor (highlite ?
+ LOAD_TEAM_NAME_TEXT_COLOR_HILITE : LOAD_TEAM_NAME_TEXT_COLOR);
+
+ // Print the name of the fleet
+ {
+ TEXT Text;
+
+ Text.baseline = *origin;
+ Text.align = ALIGN_LEFT;
+ Text.pStr = MeleeTeam_getTeamName(team);
+ Text.CharCount = (COUNT)~0;
+ font_DrawText (&Text);
+ }
+
+ // Print the value of the fleet
+ {
+ TEXT Text;
+ UNICODE buf[60];
+
+ sprintf (buf, "%u", MeleeTeam_getValue (team));
+ Text.baseline = *origin;
+ Text.baseline.x += NUM_MELEE_COLUMNS *
+ (LOAD_MELEE_BOX_WIDTH + LOAD_MELEE_BOX_SPACE) - 1;
+ Text.align = ALIGN_RIGHT;
+ Text.pStr = buf;
+ Text.CharCount = (COUNT)~0;
+ font_DrawText (&Text);
+ }
+
+ // Draw the ships for the fleet
+ if (drawShips)
+ {
+ STAMP s;
+ FleetShipIndex slotI;
+
+ s.origin.x = origin->x + 1;
+ s.origin.y = origin->y + 4;
+ for (slotI = 0; slotI < MELEE_FLEET_SIZE; slotI++)
+ {
+ BYTE StarShip;
+
+ StarShip = team->ships[slotI];
+ if (StarShip != MELEE_NONE)
+ {
+ s.frame = GetShipIconsFromIndex (StarShip);
+ DrawStamp (&s);
+ s.origin.x += 17;
+ }
+ }
+ }
+}
+
+// returns true if there are any entries in the view, in which case
+// pMS->load.bot gets set to the index just past the bottom entry in the view.
+// returns false if not, in which case, the entire view remains unchanged.
+static bool
+FillFileView (MELEE_STATE *pMS)
+{
+ COUNT viewI;
+
+ for (viewI = 0; viewI < LOAD_TEAM_VIEW_SIZE; viewI++)
+ {
+ bool success = GetFleetByIndex (pMS, pMS->load.top + viewI,
+ pMS->load.view[viewI]);
+ if (!success)
+ break;
+ }
+
+ if (viewI == 0)
+ return false;
+
+ pMS->load.bot = pMS->load.top + viewI;
+ return true;
+}
+
+#define FILE_STRING_ORIGIN_X 5
+#define FILE_STRING_ORIGIN_Y 34
+#define ENTRY_HEIGHT 32
+
+static void
+SelectFileString (MELEE_STATE *pMS, bool hilite)
+{
+ CONTEXT OldContext;
+ POINT origin;
+ COUNT viewI;
+
+ viewI = pMS->load.cur - pMS->load.top;
+
+ OldContext = SetContext (SpaceContext);
+ SetContextFont (MicroFont);
+ BatchGraphics ();
+
+ origin.x = FILE_STRING_ORIGIN_X;
+ origin.y = FILE_STRING_ORIGIN_Y + viewI * ENTRY_HEIGHT;
+ DrawFileString (pMS->load.view[viewI], &origin, FALSE, hilite);
+
+ UnbatchGraphics ();
+ SetContext (OldContext);
+}
+
+static void
+DrawFileStrings (MELEE_STATE *pMS)
+{
+ POINT origin;
+ CONTEXT OldContext;
+
+ origin.x = FILE_STRING_ORIGIN_X;
+ origin.y = FILE_STRING_ORIGIN_Y;
+
+ OldContext = SetContext (SpaceContext);
+ SetContextFont (MicroFont);
+ BatchGraphics ();
+
+ DrawMeleeIcon (28); /* The load team frame */
+
+ if (FillFileView (pMS))
+ {
+ COUNT i;
+ for (i = pMS->load.top; i < pMS->load.bot; i++) {
+ DrawFileString (pMS->load.view[i - pMS->load.top], &origin,
+ TRUE, FALSE);
+ origin.y += ENTRY_HEIGHT;
+ }
+ }
+
+ UnbatchGraphics ();
+ SetContext (OldContext);
+}
+
+static void
+RefocusView (MELEE_STATE *pMS, COUNT index)
+{
+ assert (index < pMS->load.preBuiltCount + pMS->load.numIndices);
+
+ pMS->load.cur = index;
+ if (index <= LOAD_TEAM_VIEW_SIZE / 2)
+ pMS->load.top = 0;
+ else
+ pMS->load.top = index - LOAD_TEAM_VIEW_SIZE / 2;
+}
+
+static void
+flashSelectedTeam (MELEE_STATE *pMS)
+{
+#define FLASH_RATE (ONE_SECOND / 9)
+ static TimeCount NextTime = 0;
+ static int hilite = 0;
+ TimeCount Now = GetTimeCounter ();
+
+ if (Now >= NextTime)
+ {
+ CONTEXT OldContext;
+
+ NextTime = Now + FLASH_RATE;
+ hilite ^= 1;
+
+ OldContext = SetContext (SpaceContext);
+ SelectFileString (pMS, hilite);
+ SetContext (OldContext);
+ }
+}
+
+BOOLEAN
+DoLoadTeam (MELEE_STATE *pMS)
+{
+ DWORD TimeIn = GetTimeCounter ();
+
+ /* Cancel any presses of the Pause key. */
+ GamePaused = FALSE;
+
+ if (GLOBAL (CurrentActivity) & CHECK_ABORT)
+ return FALSE;
+
+ SetMenuSounds (MENU_SOUND_UP | MENU_SOUND_DOWN | MENU_SOUND_PAGEUP |
+ MENU_SOUND_PAGEDOWN, MENU_SOUND_SELECT);
+
+ if (!pMS->Initialized)
+ {
+ DrawFileStrings (pMS);
+ SelectFileString (pMS, true);
+ pMS->Initialized = TRUE;
+ pMS->InputFunc = DoLoadTeam;
+ return TRUE;
+ }
+
+ if (PulsedInputState.menu[KEY_MENU_SELECT] ||
+ PulsedInputState.menu[KEY_MENU_CANCEL])
+ {
+ if (PulsedInputState.menu[KEY_MENU_SELECT])
+ {
+ // Copy the selected fleet to the player.
+ Melee_LocalChange_team (pMS, pMS->side,
+ pMS->load.view[pMS->load.cur - pMS->load.top]);
+ }
+
+ pMS->InputFunc = DoMelee;
+ pMS->LastInputTime = GetTimeCounter ();
+ {
+ RECT r;
+
+ GetFrameRect (SetAbsFrameIndex (MeleeFrame, 28), &r);
+ RepairMeleeFrame (&r);
+ }
+ return TRUE;
+ }
+
+ {
+ COUNT newTop = pMS->load.top;
+ COUNT newIndex = pMS->load.cur;
+
+ if (PulsedInputState.menu[KEY_MENU_UP])
+ {
+ if (newIndex > 0)
+ {
+ newIndex--;
+ if (newIndex < newTop)
+ newTop = (newTop < LOAD_TEAM_VIEW_SIZE) ?
+ 0 : newTop - LOAD_TEAM_VIEW_SIZE;
+ }
+ }
+ else if (PulsedInputState.menu[KEY_MENU_DOWN])
+ {
+ COUNT numEntries = pMS->load.numIndices + pMS->load.preBuiltCount;
+ if (newIndex + 1 < numEntries)
+ {
+ newIndex++;
+ if (newIndex >= pMS->load.bot)
+ newTop = pMS->load.bot;
+ }
+ }
+ else if (PulsedInputState.menu[KEY_MENU_PAGE_UP])
+ {
+ newIndex = (newIndex < LOAD_TEAM_VIEW_SIZE) ?
+ 0 : newIndex - LOAD_TEAM_VIEW_SIZE;
+ newTop = (newTop < LOAD_TEAM_VIEW_SIZE) ?
+ 0 : newTop - LOAD_TEAM_VIEW_SIZE;
+ }
+ else if (PulsedInputState.menu[KEY_MENU_PAGE_DOWN])
+ {
+ COUNT numEntries = pMS->load.numIndices + pMS->load.preBuiltCount;
+ if (newIndex + LOAD_TEAM_VIEW_SIZE < numEntries)
+ {
+ newIndex += LOAD_TEAM_VIEW_SIZE;
+ newTop += LOAD_TEAM_VIEW_SIZE;
+ }
+ else
+ {
+ newIndex = numEntries - 1;
+ if (newTop + LOAD_TEAM_VIEW_SIZE < numEntries &&
+ numEntries > LOAD_TEAM_VIEW_SIZE)
+ newTop = numEntries - LOAD_TEAM_VIEW_SIZE;
+ }
+ }
+
+ if (newIndex != pMS->load.cur)
+ {
+ // The cursor has been moved.
+ if (newTop == pMS->load.top)
+ {
+ // The view itself hasn't changed.
+ SelectFileString (pMS, false);
+ }
+ else
+ {
+ // The view is changed.
+ pMS->load.top = newTop;
+ DrawFileStrings (pMS);
+ }
+ pMS->load.cur = newIndex;
+ }
+ }
+
+ flashSelectedTeam (pMS);
+
+ SleepThreadUntil (TimeIn + ONE_SECOND / 30);
+
+ return TRUE;
+}
+
+static void
+SelectTeamByFileName (MELEE_STATE *pMS, const char *fileName)
+{
+ COUNT index = GetFleetIndexByFileName (pMS, fileName);
+ if (index == (COUNT) -1)
+ return;
+
+ RefocusView (pMS, index);
+}
+
+void
+LoadTeamList (MELEE_STATE *pMS)
+{
+ COUNT i;
+
+ DestroyDirEntryTable (ReleaseDirEntryTable (pMS->load.dirEntries));
+ pMS->load.dirEntries = CaptureDirEntryTable (
+ LoadDirEntryTable (meleeDir, "", ".mle", match_MATCH_SUFFIX));
+
+ if (pMS->load.entryIndices != NULL)
+ HFree (pMS->load.entryIndices);
+ pMS->load.numIndices = GetDirEntryTableCount (pMS->load.dirEntries);
+ pMS->load.entryIndices = HMalloc (pMS->load.numIndices *
+ sizeof pMS->load.entryIndices[0]);
+ for (i = 0; i < pMS->load.numIndices; i++)
+ pMS->load.entryIndices[i] = i;
+}
+
+BOOLEAN
+DoSaveTeam (MELEE_STATE *pMS)
+{
+ STAMP MsgStamp;
+ char file[NAME_MAX];
+ uio_Stream *stream;
+ CONTEXT OldContext;
+ bool saveOk = false;
+
+ snprintf (file, sizeof file, "%s.mle",
+ MeleeSetup_getTeamName (pMS->meleeSetup, pMS->side));
+
+ OldContext = SetContext (ScreenContext);
+ ConfirmSaveLoad (&MsgStamp);
+ // Show the "Saving . . ." message.
+
+ stream = uio_fopen (meleeDir, file, "wb");
+ if (stream != NULL)
+ {
+ saveOk = (MeleeTeam_serialize (&pMS->meleeSetup->teams[pMS->side],
+ stream) == 0);
+ uio_fclose (stream);
+
+ if (!saveOk)
+ uio_unlink (meleeDir, file);
+ }
+
+ pMS->load.top = 0;
+ pMS->load.cur = 0;
+
+ // Undo the screen damage done by the "Saving . . ." message.
+ DrawStamp (&MsgStamp);
+ DestroyDrawable (ReleaseDrawable (MsgStamp.frame));
+ SetContext (OldContext);
+
+ if (!saveOk)
+ SaveProblem ();
+
+ // Update the team list; a previously existing team may have been
+ // deleted when save failed.
+ LoadTeamList (pMS);
+ SelectTeamByFileName (pMS, file);
+
+ return (stream != 0);
+}
+
+static void
+InitPreBuilt (MELEE_STATE *pMS)
+{
+ MeleeTeam **list;
+
+#define PREBUILT_COUNT 15
+ pMS->load.preBuiltList =
+ HMalloc (PREBUILT_COUNT * sizeof (MeleeTeam *));
+ pMS->load.preBuiltCount = PREBUILT_COUNT;
+#undef PREBUILT_COUNT
+
+ {
+ size_t fleetI;
+
+ for (fleetI = 0; fleetI < pMS->load.preBuiltCount; fleetI++)
+ pMS->load.preBuiltList[fleetI] = MeleeTeam_new ();
+ }
+
+ list = pMS->load.preBuiltList;
+
+ {
+ /* "Balanced Team 1" */
+ FleetShipIndex i = 0;
+ MeleeTeam_setName (*list, GAME_STRING (MELEE_STRING_BASE + 4));
+ MeleeTeam_setShip (*list, i++, MELEE_ANDROSYNTH);
+ MeleeTeam_setShip (*list, i++, MELEE_CHMMR);
+ MeleeTeam_setShip (*list, i++, MELEE_DRUUGE);
+ MeleeTeam_setShip (*list, i++, MELEE_URQUAN);
+ MeleeTeam_setShip (*list, i++, MELEE_MELNORME);
+ MeleeTeam_setShip (*list, i++, MELEE_ORZ);
+ MeleeTeam_setShip (*list, i++, MELEE_SPATHI);
+ MeleeTeam_setShip (*list, i++, MELEE_SYREEN);
+ MeleeTeam_setShip (*list, i++, MELEE_UTWIG);
+ list++;
+ }
+
+ {
+ /* "Balanced Team 2" */
+ FleetShipIndex i = 0;
+ MeleeTeam_setName (*list, GAME_STRING (MELEE_STRING_BASE + 5));
+ MeleeTeam_setShip (*list, i++, MELEE_ARILOU);
+ MeleeTeam_setShip (*list, i++, MELEE_CHENJESU);
+ MeleeTeam_setShip (*list, i++, MELEE_EARTHLING);
+ MeleeTeam_setShip (*list, i++, MELEE_KOHR_AH);
+ MeleeTeam_setShip (*list, i++, MELEE_MYCON);
+ MeleeTeam_setShip (*list, i++, MELEE_YEHAT);
+ MeleeTeam_setShip (*list, i++, MELEE_PKUNK);
+ MeleeTeam_setShip (*list, i++, MELEE_SUPOX);
+ MeleeTeam_setShip (*list, i++, MELEE_THRADDASH);
+ MeleeTeam_setShip (*list, i++, MELEE_ZOQFOTPIK);
+ MeleeTeam_setShip (*list, i++, MELEE_SHOFIXTI);
+ list++;
+ }
+
+ {
+ /* "200 points" */
+ FleetShipIndex i = 0;
+ MeleeTeam_setName (*list, GAME_STRING (MELEE_STRING_BASE + 6));
+ MeleeTeam_setShip (*list, i++, MELEE_ANDROSYNTH);
+ MeleeTeam_setShip (*list, i++, MELEE_CHMMR);
+ MeleeTeam_setShip (*list, i++, MELEE_DRUUGE);
+ MeleeTeam_setShip (*list, i++, MELEE_MELNORME);
+ MeleeTeam_setShip (*list, i++, MELEE_EARTHLING);
+ MeleeTeam_setShip (*list, i++, MELEE_KOHR_AH);
+ MeleeTeam_setShip (*list, i++, MELEE_SUPOX);
+ MeleeTeam_setShip (*list, i++, MELEE_ORZ);
+ MeleeTeam_setShip (*list, i++, MELEE_SPATHI);
+ MeleeTeam_setShip (*list, i++, MELEE_ILWRATH);
+ MeleeTeam_setShip (*list, i++, MELEE_VUX);
+ list++;
+ }
+
+ {
+ /* "Behemoth Zenith" */
+ FleetShipIndex i = 0;
+ MeleeTeam_setName (*list, GAME_STRING (MELEE_STRING_BASE + 7));
+ MeleeTeam_setShip (*list, i++, MELEE_CHENJESU);
+ MeleeTeam_setShip (*list, i++, MELEE_CHENJESU);
+ MeleeTeam_setShip (*list, i++, MELEE_CHMMR);
+ MeleeTeam_setShip (*list, i++, MELEE_CHMMR);
+ MeleeTeam_setShip (*list, i++, MELEE_KOHR_AH);
+ MeleeTeam_setShip (*list, i++, MELEE_KOHR_AH);
+ MeleeTeam_setShip (*list, i++, MELEE_URQUAN);
+ MeleeTeam_setShip (*list, i++, MELEE_URQUAN);
+ MeleeTeam_setShip (*list, i++, MELEE_UTWIG);
+ MeleeTeam_setShip (*list, i++, MELEE_UTWIG);
+ list++;
+ }
+
+ {
+ /* "The Peeled Eyes" */
+ FleetShipIndex i = 0;
+ MeleeTeam_setName (*list, GAME_STRING (MELEE_STRING_BASE + 8));
+ MeleeTeam_setShip (*list, i++, MELEE_URQUAN);
+ MeleeTeam_setShip (*list, i++, MELEE_CHENJESU);
+ MeleeTeam_setShip (*list, i++, MELEE_MYCON);
+ MeleeTeam_setShip (*list, i++, MELEE_SYREEN);
+ MeleeTeam_setShip (*list, i++, MELEE_ZOQFOTPIK);
+ MeleeTeam_setShip (*list, i++, MELEE_SHOFIXTI);
+ MeleeTeam_setShip (*list, i++, MELEE_EARTHLING);
+ MeleeTeam_setShip (*list, i++, MELEE_KOHR_AH);
+ MeleeTeam_setShip (*list, i++, MELEE_MELNORME);
+ MeleeTeam_setShip (*list, i++, MELEE_DRUUGE);
+ MeleeTeam_setShip (*list, i++, MELEE_PKUNK);
+ MeleeTeam_setShip (*list, i++, MELEE_ORZ);
+ list++;
+ }
+
+ {
+ FleetShipIndex i = 0;
+ MeleeTeam_setName (*list, "Ford's Fighters");
+ MeleeTeam_setShip (*list, i++, MELEE_CHMMR);
+ MeleeTeam_setShip (*list, i++, MELEE_ZOQFOTPIK);
+ MeleeTeam_setShip (*list, i++, MELEE_MELNORME);
+ MeleeTeam_setShip (*list, i++, MELEE_SUPOX);
+ MeleeTeam_setShip (*list, i++, MELEE_UTWIG);
+ MeleeTeam_setShip (*list, i++, MELEE_UMGAH);
+ list++;
+ }
+
+ {
+ FleetShipIndex i = 0;
+ MeleeTeam_setName (*list, "Leyland's Lashers");
+ MeleeTeam_setShip (*list, i++, MELEE_ANDROSYNTH);
+ MeleeTeam_setShip (*list, i++, MELEE_EARTHLING);
+ MeleeTeam_setShip (*list, i++, MELEE_MYCON);
+ MeleeTeam_setShip (*list, i++, MELEE_ORZ);
+ MeleeTeam_setShip (*list, i++, MELEE_URQUAN);
+ list++;
+ }
+
+ {
+ FleetShipIndex i = 0;
+ MeleeTeam_setName (*list, "The Gregorizers 200");
+ MeleeTeam_setShip (*list, i++, MELEE_ANDROSYNTH);
+ MeleeTeam_setShip (*list, i++, MELEE_CHMMR);
+ MeleeTeam_setShip (*list, i++, MELEE_DRUUGE);
+ MeleeTeam_setShip (*list, i++, MELEE_MELNORME);
+ MeleeTeam_setShip (*list, i++, MELEE_EARTHLING);
+ MeleeTeam_setShip (*list, i++, MELEE_KOHR_AH);
+ MeleeTeam_setShip (*list, i++, MELEE_SUPOX);
+ MeleeTeam_setShip (*list, i++, MELEE_ORZ);
+ MeleeTeam_setShip (*list, i++, MELEE_PKUNK);
+ MeleeTeam_setShip (*list, i++, MELEE_SPATHI);
+ list++;
+ }
+
+ {
+ FleetShipIndex i = 0;
+ MeleeTeam_setName (*list, "300 point Armada!");
+ MeleeTeam_setShip (*list, i++, MELEE_ANDROSYNTH);
+ MeleeTeam_setShip (*list, i++, MELEE_CHMMR);
+ MeleeTeam_setShip (*list, i++, MELEE_CHENJESU);
+ MeleeTeam_setShip (*list, i++, MELEE_DRUUGE);
+ MeleeTeam_setShip (*list, i++, MELEE_EARTHLING);
+ MeleeTeam_setShip (*list, i++, MELEE_KOHR_AH);
+ MeleeTeam_setShip (*list, i++, MELEE_MELNORME);
+ MeleeTeam_setShip (*list, i++, MELEE_MYCON);
+ MeleeTeam_setShip (*list, i++, MELEE_ORZ);
+ MeleeTeam_setShip (*list, i++, MELEE_PKUNK);
+ MeleeTeam_setShip (*list, i++, MELEE_SPATHI);
+ MeleeTeam_setShip (*list, i++, MELEE_SUPOX);
+ MeleeTeam_setShip (*list, i++, MELEE_URQUAN);
+ MeleeTeam_setShip (*list, i++, MELEE_YEHAT);
+ list++;
+ }
+
+ {
+ FleetShipIndex i = 0;
+ MeleeTeam_setName (*list, "Little Dudes with Attitudes");
+ MeleeTeam_setShip (*list, i++, MELEE_UMGAH);
+ MeleeTeam_setShip (*list, i++, MELEE_THRADDASH);
+ MeleeTeam_setShip (*list, i++, MELEE_SHOFIXTI);
+ MeleeTeam_setShip (*list, i++, MELEE_EARTHLING);
+ MeleeTeam_setShip (*list, i++, MELEE_VUX);
+ MeleeTeam_setShip (*list, i++, MELEE_ZOQFOTPIK);
+ list++;
+ }
+
+ {
+ FleetShipIndex i = 0;
+ MeleeTeam_setName (*list, "New Alliance Ships");
+ MeleeTeam_setShip (*list, i++, MELEE_ARILOU);
+ MeleeTeam_setShip (*list, i++, MELEE_CHMMR);
+ MeleeTeam_setShip (*list, i++, MELEE_EARTHLING);
+ MeleeTeam_setShip (*list, i++, MELEE_ORZ);
+ MeleeTeam_setShip (*list, i++, MELEE_PKUNK);
+ MeleeTeam_setShip (*list, i++, MELEE_SHOFIXTI);
+ MeleeTeam_setShip (*list, i++, MELEE_SUPOX);
+ MeleeTeam_setShip (*list, i++, MELEE_SYREEN);
+ MeleeTeam_setShip (*list, i++, MELEE_UTWIG);
+ MeleeTeam_setShip (*list, i++, MELEE_ZOQFOTPIK);
+ MeleeTeam_setShip (*list, i++, MELEE_YEHAT);
+ MeleeTeam_setShip (*list, i++, MELEE_DRUUGE);
+ MeleeTeam_setShip (*list, i++, MELEE_THRADDASH);
+ MeleeTeam_setShip (*list, i++, MELEE_SPATHI);
+ list++;
+ }
+
+ {
+ FleetShipIndex i = 0;
+ MeleeTeam_setName (*list, "Old Alliance Ships");
+ MeleeTeam_setShip (*list, i++, MELEE_ARILOU);
+ MeleeTeam_setShip (*list, i++, MELEE_CHENJESU);
+ MeleeTeam_setShip (*list, i++, MELEE_EARTHLING);
+ MeleeTeam_setShip (*list, i++, MELEE_MMRNMHRM);
+ MeleeTeam_setShip (*list, i++, MELEE_SHOFIXTI);
+ MeleeTeam_setShip (*list, i++, MELEE_SYREEN);
+ MeleeTeam_setShip (*list, i++, MELEE_YEHAT);
+ list++;
+ }
+
+ {
+ FleetShipIndex i = 0;
+ MeleeTeam_setName (*list, "Old Hierarchy Ships");
+ MeleeTeam_setShip (*list, i++, MELEE_ANDROSYNTH);
+ MeleeTeam_setShip (*list, i++, MELEE_ILWRATH);
+ MeleeTeam_setShip (*list, i++, MELEE_MYCON);
+ MeleeTeam_setShip (*list, i++, MELEE_SPATHI);
+ MeleeTeam_setShip (*list, i++, MELEE_UMGAH);
+ MeleeTeam_setShip (*list, i++, MELEE_URQUAN);
+ MeleeTeam_setShip (*list, i++, MELEE_VUX);
+ list++;
+ }
+
+ {
+ FleetShipIndex i = 0;
+ MeleeTeam_setName (*list, "Star Control 1");
+ MeleeTeam_setShip (*list, i++, MELEE_ANDROSYNTH);
+ MeleeTeam_setShip (*list, i++, MELEE_ARILOU);
+ MeleeTeam_setShip (*list, i++, MELEE_CHENJESU);
+ MeleeTeam_setShip (*list, i++, MELEE_EARTHLING);
+ MeleeTeam_setShip (*list, i++, MELEE_ILWRATH);
+ MeleeTeam_setShip (*list, i++, MELEE_MMRNMHRM);
+ MeleeTeam_setShip (*list, i++, MELEE_MYCON);
+ MeleeTeam_setShip (*list, i++, MELEE_SHOFIXTI);
+ MeleeTeam_setShip (*list, i++, MELEE_SPATHI);
+ MeleeTeam_setShip (*list, i++, MELEE_SYREEN);
+ MeleeTeam_setShip (*list, i++, MELEE_UMGAH);
+ MeleeTeam_setShip (*list, i++, MELEE_URQUAN);
+ MeleeTeam_setShip (*list, i++, MELEE_VUX);
+ MeleeTeam_setShip (*list, i++, MELEE_YEHAT);
+ list++;
+ }
+
+ {
+ FleetShipIndex i = 0;
+ MeleeTeam_setName (*list, "Star Control 2");
+ MeleeTeam_setShip (*list, i++, MELEE_CHMMR);
+ MeleeTeam_setShip (*list, i++, MELEE_DRUUGE);
+ MeleeTeam_setShip (*list, i++, MELEE_KOHR_AH);
+ MeleeTeam_setShip (*list, i++, MELEE_MELNORME);
+ MeleeTeam_setShip (*list, i++, MELEE_ORZ);
+ MeleeTeam_setShip (*list, i++, MELEE_PKUNK);
+ MeleeTeam_setShip (*list, i++, MELEE_SLYLANDRO);
+ MeleeTeam_setShip (*list, i++, MELEE_SUPOX);
+ MeleeTeam_setShip (*list, i++, MELEE_THRADDASH);
+ MeleeTeam_setShip (*list, i++, MELEE_UTWIG);
+ MeleeTeam_setShip (*list, i++, MELEE_ZOQFOTPIK);
+ MeleeTeam_setShip (*list, i++, MELEE_ZOQFOTPIK);
+ MeleeTeam_setShip (*list, i++, MELEE_ZOQFOTPIK);
+ MeleeTeam_setShip (*list, i++, MELEE_ZOQFOTPIK);
+ list++;
+ }
+
+ assert (list == pMS->load.preBuiltList + pMS->load.preBuiltCount);
+}
+
+static void
+UninitPreBuilt (MELEE_STATE *pMS)
+{
+ size_t fleetI;
+ for (fleetI = 0; fleetI < pMS->load.preBuiltCount; fleetI++)
+ MeleeTeam_delete (pMS->load.preBuiltList[fleetI]);
+ HFree (pMS->load.preBuiltList);
+ pMS->load.preBuiltCount = 0;
+}
+
+static void
+InitLoadView (MELEE_STATE *pMS)
+{
+ size_t viewI;
+ MeleeTeam **view = pMS->load.view;
+
+ for (viewI = 0; viewI < LOAD_TEAM_VIEW_SIZE; viewI++)
+ view[viewI] = MeleeTeam_new ();
+}
+
+static void
+UninitLoadView (MELEE_STATE *pMS)
+{
+ size_t viewI;
+ MeleeTeam **view = pMS->load.view;
+
+ for (viewI = 0; viewI < LOAD_TEAM_VIEW_SIZE; viewI++)
+ MeleeTeam_delete(view[viewI]);
+}
+
+void
+InitMeleeLoadState (MELEE_STATE *pMS)
+{
+ pMS->load.entryIndices = NULL;
+ InitPreBuilt (pMS);
+ InitLoadView (pMS);
+}
+
+void
+UninitMeleeLoadState (MELEE_STATE *pMS)
+{
+ UninitLoadView (pMS);
+ UninitPreBuilt (pMS);
+ if (pMS->load.entryIndices != NULL)
+ HFree (pMS->load.entryIndices);
+}
+
+