From 7f6002caba3f0a6749820c2772161caf55b8d267 Mon Sep 17 00:00:00 2001 From: neonloop Date: Fri, 7 May 2021 20:00:12 +0000 Subject: Initial commit (uqm-0.8.0) --- src/uqm/supermelee/loadmele.c | 826 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 826 insertions(+) create mode 100644 src/uqm/supermelee/loadmele.c (limited to 'src/uqm/supermelee/loadmele.c') 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); +} + + -- cgit v1.2.3