diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cfb8aca --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +# IDE-Specific Files +.vs + +# Build Artifacts +bin/ +obj/ + +# Auto-Generated Files +*.Designer.cs diff --git a/SpaceShooter/Events/EventManager.cs b/SpaceShooter/Events/EventManager.cs index ad01438..fa1466f 100644 --- a/SpaceShooter/Events/EventManager.cs +++ b/SpaceShooter/Events/EventManager.cs @@ -64,28 +64,29 @@ public class EventManager public List Logs { get { return log; } + set { log = value; } } - List inventoryPool; - List eventPool; + public List inventoryPool; + public List eventPool; - List dangerPool; + public List dangerPool; public int dangerPoolCount { get { return dangerPool.Count; } } - List wormPool; + public List wormPool; public int wormPoolCount { get { return wormPool.Count; } } - List unlockableEventPool; - SysMenuManager menuManager; + public List unlockableEventPool; + public SysMenuManager menuManager; @@ -544,11 +545,17 @@ public void AddLog(Rectangle img, string txt) } } + [Serializable] public class LogEvent { public Rectangle image; public string description; + public LogEvent() + { + this.image = Rectangle.Empty; + this.description = ""; + } public LogEvent(Rectangle img, string txt) { this.image = img; diff --git a/SpaceShooter/Flotilla.SDL2.csproj b/SpaceShooter/Flotilla.SDL2.csproj index 0da73ed..6665554 100644 --- a/SpaceShooter/Flotilla.SDL2.csproj +++ b/SpaceShooter/Flotilla.SDL2.csproj @@ -1,5 +1,5 @@  - + Debug x86 @@ -22,6 +22,8 @@ false false true + v4.7.2 + true @@ -34,6 +36,7 @@ false x86 true + false true @@ -44,6 +47,7 @@ false x86 true + false true @@ -54,6 +58,7 @@ true false x86 + false @@ -237,6 +242,7 @@ + @@ -336,4 +342,7 @@ true + + + \ No newline at end of file diff --git a/SpaceShooter/Flotilla.csproj b/SpaceShooter/Flotilla.csproj index 707f459..e1efe30 100644 --- a/SpaceShooter/Flotilla.csproj +++ b/SpaceShooter/Flotilla.csproj @@ -301,6 +301,7 @@ + @@ -448,4 +449,4 @@ if $(ConfigurationName)==ReleaseDemo del glow.xnb if $(ConfigurationName)==Release cd WindowsContent if $(ConfigurationName)==Release del trial.bmp - \ No newline at end of file + diff --git a/SpaceShooter/Inventory/BeamShield.cs b/SpaceShooter/Inventory/BeamShield.cs index 06ae117..dc3d60f 100644 --- a/SpaceShooter/Inventory/BeamShield.cs +++ b/SpaceShooter/Inventory/BeamShield.cs @@ -35,6 +35,7 @@ public itBeamShield(float amount) name = iResource.BeamArmor; description = string.Format(iResource.BeamArmorDescription, displayStat); + constructorParam = amount; } } } \ No newline at end of file diff --git a/SpaceShooter/Inventory/BlesoRailChamber.cs b/SpaceShooter/Inventory/BlesoRailChamber.cs index f6f9609..9494262 100644 --- a/SpaceShooter/Inventory/BlesoRailChamber.cs +++ b/SpaceShooter/Inventory/BlesoRailChamber.cs @@ -33,6 +33,7 @@ public itBlesoRailChamber(float bulletSpeed) name = iResource.BlesoRailChamber; description = string.Format(iResource.BlesoRailChamberDescription, displayStat); + constructorParam = bulletSpeed; } } } \ No newline at end of file diff --git a/SpaceShooter/Inventory/InventoryItem.cs b/SpaceShooter/Inventory/InventoryItem.cs index cb0a6ce..fb885c0 100644 --- a/SpaceShooter/Inventory/InventoryItem.cs +++ b/SpaceShooter/Inventory/InventoryItem.cs @@ -19,6 +19,7 @@ namespace SpaceShooter /// /// A carryable item. /// + [Serializable] public class InventoryItem { public Rectangle image = Rectangle.Empty; @@ -26,5 +27,8 @@ public class InventoryItem public string description = "Default Description"; public GameEffect gameEffect; + + // Used to keep effect value for serialization + public float? constructorParam = null; } } \ No newline at end of file diff --git a/SpaceShooter/Inventory/JamalAutoDoc.cs b/SpaceShooter/Inventory/JamalAutoDoc.cs index cdd81a7..74a0879 100644 --- a/SpaceShooter/Inventory/JamalAutoDoc.cs +++ b/SpaceShooter/Inventory/JamalAutoDoc.cs @@ -32,6 +32,7 @@ public itJamalAutoDoc(float healSpeed) name = iResource.JamalAutoDoc; description = string.Format( iResource.JamalAutoDocDescription, displayStat); + constructorParam = healSpeed; } } } \ No newline at end of file diff --git a/SpaceShooter/Inventory/KeshiaEngine.cs b/SpaceShooter/Inventory/KeshiaEngine.cs index 8140d53..00f4d94 100644 --- a/SpaceShooter/Inventory/KeshiaEngine.cs +++ b/SpaceShooter/Inventory/KeshiaEngine.cs @@ -31,6 +31,7 @@ public itKeshiaEngine(float engineSpeed) image = sprite.inventory.Engine; name = iResource.KeshiaEngine; description = string.Format( iResource.KeshiaEngineDescription, displayStat); + constructorParam = engineSpeed; } } } \ No newline at end of file diff --git a/SpaceShooter/Inventory/itMuyoShield.cs b/SpaceShooter/Inventory/itMuyoShield.cs index 0ee57ca..d957331 100644 --- a/SpaceShooter/Inventory/itMuyoShield.cs +++ b/SpaceShooter/Inventory/itMuyoShield.cs @@ -35,6 +35,7 @@ public itMuyoShield(float amount) name = iResource.BotosShield; description = string.Format(iResource.BotosShieldDescription, displayStat); + constructorParam = amount; } } } \ No newline at end of file diff --git a/SpaceShooter/Inventory/itRashadFireCon.cs b/SpaceShooter/Inventory/itRashadFireCon.cs index 361a8ee..0dfe88e 100644 --- a/SpaceShooter/Inventory/itRashadFireCon.cs +++ b/SpaceShooter/Inventory/itRashadFireCon.cs @@ -32,6 +32,7 @@ public itRashadFireCon(float fireSpeed) name = iResource.RashadFireCon; description = string.Format( iResource.RashadFireConDescription, displayStat); + constructorParam = fireSpeed; } } } \ No newline at end of file diff --git a/SpaceShooter/Inventory/itRoachShield.cs b/SpaceShooter/Inventory/itRoachShield.cs index f546b90..db1988e 100644 --- a/SpaceShooter/Inventory/itRoachShield.cs +++ b/SpaceShooter/Inventory/itRoachShield.cs @@ -36,6 +36,7 @@ public itRoachShield(float amount) name = iResource.RoachShield; description = string.Format(iResource.RoachShieldDescription, displayStat); + constructorParam = amount; } } } \ No newline at end of file diff --git a/SpaceShooter/Resource.Designer.cs b/SpaceShooter/Resource.Designer.cs index 85eca9f..e2d7cc7 100644 --- a/SpaceShooter/Resource.Designer.cs +++ b/SpaceShooter/Resource.Designer.cs @@ -19,7 +19,7 @@ namespace SpaceShooter { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resource { @@ -3046,7 +3046,7 @@ internal static string MenuBuyProfileError { } /// - /// Looks up a localized string similar to ADVENTURE {0}. + /// Looks up a localized string similar to START ADVENTURE {0}. /// internal static string MenuCampaign { get { @@ -3054,6 +3054,15 @@ internal static string MenuCampaign { } } + /// + /// Looks up a localized string similar to CONTINUE ADVENTURE {0}. + /// + internal static string MenuCampaignContinue { + get { + return ResourceManager.GetString("MenuCampaignContinue", resourceCulture); + } + } + /// /// Looks up a localized string similar to COOPERATIVE ADVENTURE {0}. /// @@ -4177,6 +4186,15 @@ internal static string MenuResumeGame { } } + /// + /// Looks up a localized string similar to SAVE AND RETURN TO MAIN MENU. + /// + internal static string MenuReturnToMain { + get { + return ResourceManager.GetString("MenuReturnToMain", resourceCulture); + } + } + /// /// Looks up a localized string similar to SELECT. /// diff --git a/SpaceShooter/Resource.resx b/SpaceShooter/Resource.resx index 54a5d1b..1938ef3 100644 --- a/SpaceShooter/Resource.resx +++ b/SpaceShooter/Resource.resx @@ -610,7 +610,7 @@ SIGN IN NOW? PAUSED - ADVENTURE {0} + START ADVENTURE {0} QUIT @@ -2464,4 +2464,10 @@ THIS CELESTIAL WEAPON ADDITIONAL WRITING + + CONTINUE ADVENTURE {0} + + + SAVE AND RETURN TO MAIN MENU + \ No newline at end of file diff --git a/SpaceShooter/Simulation/PlayerCommander.cs b/SpaceShooter/Simulation/PlayerCommander.cs index 719fbe6..ce87bd8 100644 --- a/SpaceShooter/Simulation/PlayerCommander.cs +++ b/SpaceShooter/Simulation/PlayerCommander.cs @@ -4096,7 +4096,7 @@ public override void Draw(GameTime gameTime) } - int commandPoints = 2000; + public int commandPoints = 2000; Vector2 expBarPos = new Vector2(150, 515); bool expBarHover = false; bool smitePowerActive = false; diff --git a/SpaceShooter/Simulation/SpaceShip.cs b/SpaceShooter/Simulation/SpaceShip.cs index 8384d7f..f3cc5c8 100644 --- a/SpaceShooter/Simulation/SpaceShip.cs +++ b/SpaceShooter/Simulation/SpaceShip.cs @@ -62,6 +62,7 @@ public class SpaceShipAIData public Collideable targetShip; } + [Serializable] public class SpaceShipStats { public int kills = 0; diff --git a/SpaceShooter/Simulation/shipData.cs b/SpaceShooter/Simulation/shipData.cs index e4baaef..d818d1c 100644 --- a/SpaceShooter/Simulation/shipData.cs +++ b/SpaceShooter/Simulation/shipData.cs @@ -351,6 +351,26 @@ public static class Cars public static Rectangle Dorado = new Rectangle(0, 0, 64, 64); } */ + + private static readonly Dictionary ShipDataByName = new Dictionary + { + { ModelType.shipBeamFrigate, BeamFrigate }, + { ModelType.shipBeamGunship, BeamGunship }, + { ModelType.shipCapitalShip, Battleship }, + { ModelType.shipDestroyer, Destroyer }, + { ModelType.shipGunship, Gunship }, + { ModelType.shipDreadnought, Dreadnought }, + { ModelType.shipFighter, Fighter } + }; + + public static ShipData GetShipDataByModelType(ModelType modelType) + { + if (ShipDataByName.TryGetValue(modelType, out var shipData)) + { + return shipData; + } + throw new ArgumentException($"Ship type '{modelType}' not found."); + } } public static class DamageTypes diff --git a/SpaceShooter/System/CampaignManager.cs b/SpaceShooter/System/CampaignManager.cs new file mode 100644 index 0000000..f9a0e0b --- /dev/null +++ b/SpaceShooter/System/CampaignManager.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using Microsoft.Xna.Framework; + +namespace SpaceShooter +{ + public class CampaignManager + { + public static void ContinueCampaign() + { + try + { + FrameworkCore.level.ClearAll(); + CampaignLoad campaignLoad = FrameworkCore.storagemanager.LoadCampaign(); + // restore world map (= FrameworkCore.worldMap) + WorldMap worldMap = campaignLoad.worldMap; + // - restore PlayerCommander (= FrameworkCore.player[0]) + FrameworkCore.players[0].inventoryItems = campaignLoad.playerCommander.inventoryItems; + FrameworkCore.players[0].campaignShips = campaignLoad.playerCommander.campaignShips; + FrameworkCore.players[0].planetsVisited = campaignLoad.playerCommander.planetsVisited; + FrameworkCore.players[0].dangerousPlanetsVisited = campaignLoad.playerCommander.dangerousPlanetsVisited; + FrameworkCore.players[0].extraPoints = campaignLoad.playerCommander.extraPoints; + FrameworkCore.players[0].commandPoints = campaignLoad.playerCommander.commandPoints; + // - restore events (= FrameworkCore.eventManager) + LoadEvents(campaignLoad.eventLoad, worldMap.evManager); + + FrameworkCore.worldMap = worldMap; + FrameworkCore.worldMap.cloudManager = new CloudManager(); + FrameworkCore.gameState = GameState.WorldMap; + FrameworkCore.worldMap.EnterMap(); + FrameworkCore.isHardcoreMode = campaignLoad.isHardcoreMode; + } + catch (Exception e) + { + FNALoggerEXT.LogError("CampaignManager.ContinueCampaign failed."); + FNALoggerEXT.LogError(e.ToString()); + FrameworkCore.storagemanager.DeleteCampaign(); + FrameworkCore.ExitToMainMenu(null); + } + } + private static void LoadEvents(EventLoad eventLoad, EventManager evManager) + { + evManager.kToucansOnboard = eventLoad.kToucansOnboard; + evManager.kPandaOnboard = eventLoad.kPandaOnboard; + evManager.kCrisiumOnBoard = eventLoad.kCrisiumOnBoard; + evManager.kHaveGauntlet = eventLoad.kHaveGauntlet; + evManager.tradeItems = eventLoad.tradeItems; + evManager.Logs = eventLoad.Logs; + evManager.inventoryPool = eventLoad.inventoryPool; + + evManager.eventPool = eventLoad.eventPool; + evManager.dangerPool = eventLoad.dangerPool; + evManager.wormPool = eventLoad.wormPool; + evManager.unlockableEventPool = eventLoad.unlockableEventPool; + + InitializeEvents(new List> + { + evManager.eventPool, + evManager.dangerPool, + evManager.wormPool, + evManager.unlockableEventPool + }, + evManager); + } + + private static void InitializeEvents(List> eventList, EventManager evManager) + { + foreach (List events in eventList) + { + foreach (Event ev in events) + { + ev.manager = evManager.menuManager; + ev.eventManager = evManager; + } + } + } + } +} diff --git a/SpaceShooter/System/StorageManager.cs b/SpaceShooter/System/StorageManager.cs index fa5894a..bf2a45d 100644 --- a/SpaceShooter/System/StorageManager.cs +++ b/SpaceShooter/System/StorageManager.cs @@ -88,6 +88,125 @@ public HighScoreEntry() } } + [Serializable] + public class CampaignSave + { + public bool isHardcoreMode; + public WorldMapSave WorldMap { get; set; } + public PlayerCommanderSave PlayerCommander { get; set; } + public EventSave Event { get; set; } + } + + public class CampaignLoad + { + public bool isHardcoreMode; + public WorldMap worldMap; + public PlayerCommanderLoad playerCommander; + public EventLoad eventLoad; + } + + [Serializable] + public class WorldMapSave + { + public List Locations { get; set; } + public Location CurrentLocation { get; set; } + + public WorldMapSave() + { + // default constructor for XML serialization + } + + public WorldMapSave(WorldMap worldMap) + { + Locations = worldMap.Locations; + CurrentLocation = worldMap.CurrentLocation; + } + } + + [Serializable] + public class PlayerCommanderSave + { + public List inventoryItems; + public List campaignShips; + public int planetsVisited; + public int dangerousPlanetsVisited; + public int extraPoints; + public int commandPoints; + } + + [Serializable] + public class FleetShipSave + { + public string captainName; + public ModelType shipType; + public int?[] upgradeArray; + public int veterancy; + public bool childShip; + public SpaceShipStats stats; + } + + [Serializable] + public class EventSave + { + public bool kToucansOnboard; + public bool kPandaOnboard; + public bool kCrisiumOnBoard; + public bool kHaveGauntlet; + + public List tradeItems; + public List Logs; + + public List inventoryPool; + + public List eventPool; + public List dangerPool; + public List wormPool; + public List unlockableEventPool; + } + + [Serializable] + public class InventoryItemSave + { + public string itemType; + public float? constructorParam; + + public InventoryItemSave() + { + // Default constructor for XML serialization + } + + public InventoryItemSave(InventoryItem item) + { + itemType = item.GetType().FullName; + constructorParam = item.constructorParam; + } + } + + public class PlayerCommanderLoad + { + public List inventoryItems; + public List campaignShips; + public int planetsVisited; + public int dangerousPlanetsVisited; + public int extraPoints; + public int commandPoints; + } + + public class EventLoad + { + public bool kToucansOnboard; + public bool kPandaOnboard; + public bool kCrisiumOnBoard; + public bool kHaveGauntlet; + + public List tradeItems; + public List Logs; + public List inventoryPool; + public List eventPool; + public List dangerPool; + public List wormPool; + public List unlockableEventPool; + } public static class StorageXNA4 { public static StorageContainer OpenContainer(this StorageDevice device, string displayName) @@ -103,6 +222,7 @@ public class StorageManager static public readonly string SAVEFILE= "saveinfo.dat"; static public readonly string SCOREFILE = "scores.dat"; static public readonly string PCFILE = "settings.xml"; + static public readonly string CAMPAIGNFILE = "adventure.xml"; /// /// Location of the player profile's save area. @@ -632,14 +752,328 @@ public void SaveOptionsPC(OptionsData optionsData) } + public bool CampaignFileExists() + { + if (device == null) + return false; + using (StorageContainer container = device.OpenContainer(GAMENAME)) + { + return container.FileExists(CAMPAIGNFILE); + } + } + + public void DeleteCampaign() + { + if (device == null) + return; + using (StorageContainer container = device.OpenContainer(GAMENAME)) + { + if (container.FileExists(CAMPAIGNFILE)) + { + container.DeleteFile(CAMPAIGNFILE); + } + } + } + public void SaveCampaign(WorldMap worldMap, PlayerCommander player) + { + FNALoggerEXT.LogInfo("Saving Adventure"); + if (device == null) + return; + using (StorageContainer container = device.OpenContainer(GAMENAME)) + { + using (Stream stream = container.OpenFile(CAMPAIGNFILE, FileMode.Create)) + { + try + { + CampaignSave campaignSave = new CampaignSave() + { + isHardcoreMode = FrameworkCore.isHardcoreMode, + WorldMap = new WorldMapSave(worldMap), + PlayerCommander = CreatePlayerCommanderSave(player), + Event = CreateEventSave(worldMap), + }; + + XmlSerializer serializer = new XmlSerializer(typeof(CampaignSave)); + serializer.Serialize(stream, campaignSave); + } + catch (InvalidOperationException ex) + { + FNALoggerEXT.LogError("Serialization error: " + ex.Message); + if (ex.InnerException != null) + { + FNALoggerEXT.LogError("Inner exception: " + ex.InnerException.Message); + } + throw ex; + } + catch (Exception ex) + { + FNALoggerEXT.LogError(ex.Message); + FNALoggerEXT.LogError(ex.StackTrace); + } + } + } + } + + private static PlayerCommanderSave CreatePlayerCommanderSave(PlayerCommander player) + { + List inventoryItems = player.inventoryItems; + List campaignShips = new List(); + foreach (FleetShip fleetShip in player.campaignShips) + { + campaignShips.Add(CreateFleetShipSave(fleetShip, inventoryItems)); + } + + PlayerCommanderSave playerCommanderSave = new PlayerCommanderSave + { + inventoryItems = CreateInventoryItemSaveList(inventoryItems), + campaignShips = campaignShips, + planetsVisited = player.planetsVisited, + dangerousPlanetsVisited = player.dangerousPlanetsVisited, + extraPoints = player.extraPoints, + commandPoints = player.commandPoints, + }; + return playerCommanderSave; + } + + private static FleetShipSave CreateFleetShipSave(FleetShip fleetShip, List inventoryItems) + { + FleetShipSave fleetShipSave = new FleetShipSave() + { + captainName = fleetShip.captainName, + shipType = fleetShip.shipData.modelname, + upgradeArray = CreateUpgradeArray(fleetShip.upgradeArray, inventoryItems), + veterancy = fleetShip.veterancy, + childShip = fleetShip.childShip, + stats = fleetShip.stats, + }; + return fleetShipSave; + } + + private static List CreateInventoryItemSaveList(List inventoryItems) + { + List inventoryItemSaveList = new List(); + foreach (InventoryItem item in inventoryItems) + { + inventoryItemSaveList.Add(new InventoryItemSave(item)); + } + return inventoryItemSaveList; + } + + public static int?[] CreateUpgradeArray(InventoryItem[] upgradeArray, List inventoryItems) + { + int inventoryItemArrayLength = upgradeArray.Length; + int?[] upgradeSaveArray = new int?[inventoryItemArrayLength]; + for (int i = 0; i < inventoryItemArrayLength; i++) + { + InventoryItem item = upgradeArray[i]; + if (item != null) + { + int? index = inventoryItems.IndexOf(item); + // if the item is not found in the inventoryItems list, set index to null + upgradeSaveArray[i] = (index != -1) ? index : null; + } + } + + return upgradeSaveArray; + } + + private static EventSave CreateEventSave(WorldMap worldMap) + { + EventManager eventManager = worldMap.evManager; + EventSave eventSave = new EventSave + { + kToucansOnboard = eventManager.kToucansOnboard, + kPandaOnboard = eventManager.kPandaOnboard, + kCrisiumOnBoard = eventManager.kCrisiumOnBoard, + kHaveGauntlet = eventManager.kHaveGauntlet, + tradeItems = CreateInventoryItemSaveList(eventManager.tradeItems), + Logs = eventManager.Logs, + inventoryPool = CreateInventoryItemSaveList(eventManager.inventoryPool), + eventPool = CreateEventPoolSave(eventManager.eventPool), + dangerPool = CreateEventPoolSave(eventManager.dangerPool), + wormPool = CreateEventPoolSave(eventManager.wormPool), + unlockableEventPool = CreateEventPoolSave(eventManager.unlockableEventPool), + }; + return eventSave; + } + + public static List CreateEventPoolSave(List eventPool) + { + List eventPoolSave = new List(); + foreach (Event ev in eventPool) + { + eventPoolSave.Add(ev.GetType().FullName); + } + return eventPoolSave; + } + + // Load the campaign data from adventure.xml + public CampaignLoad LoadCampaign() + { + using (StorageContainer container = device.OpenContainer(GAMENAME)) + { + using (Stream stream = container.OpenFile(CAMPAIGNFILE, FileMode.Open)) + { + try + { + XmlSerializer serializer = new XmlSerializer(typeof(CampaignSave)); + CampaignSave campaignSave = (CampaignSave)serializer.Deserialize(stream); + return new CampaignLoad + { + isHardcoreMode = campaignSave.isHardcoreMode, + worldMap = RestoreWorldMap(campaignSave.WorldMap), + playerCommander = RestorePlayerCommander(campaignSave.PlayerCommander), + eventLoad = RestoreEvent(campaignSave.Event) + }; + } + catch (InvalidOperationException ex) + { + if (ex.InnerException != null) + { + FNALoggerEXT.LogError("Deserialization error. Inner exception: " + ex.InnerException.Message); + } + throw ex; + } + catch (Exception ex) + { + FNALoggerEXT.LogError(ex.Message); + FNALoggerEXT.LogError(ex.StackTrace); + throw ex; + } + } + } + } + private WorldMap RestoreWorldMap(WorldMapSave worldMapSave) + { + WorldMap worldMap = new WorldMap(); + worldMap.Locations = worldMapSave.Locations; + worldMap.CurrentLocation = worldMapSave.CurrentLocation; + + return worldMap; + } + + private PlayerCommanderLoad RestorePlayerCommander(PlayerCommanderSave playerCommanderSave) + { + List inventoryItems = new List(); + foreach (InventoryItemSave itemSave in playerCommanderSave.inventoryItems) + { + inventoryItems.Add(RestoreInventoryItem(itemSave)); + } + List campaignShips = new List(); + foreach (FleetShipSave fleetShipSave in playerCommanderSave.campaignShips) + { + campaignShips.Add(RestoreFleetShip(fleetShipSave, inventoryItems)); + } + return new PlayerCommanderLoad() + { + inventoryItems = inventoryItems, + campaignShips = campaignShips, + planetsVisited = playerCommanderSave.planetsVisited, + dangerousPlanetsVisited = playerCommanderSave.dangerousPlanetsVisited, + extraPoints = playerCommanderSave.extraPoints, + commandPoints = playerCommanderSave.commandPoints, + }; + } + private InventoryItem RestoreInventoryItem(InventoryItemSave itemSave) + { + Type itemType = Type.GetType(itemSave.itemType); + if (itemType != null) + { + InventoryItem item; + float? constructorParam = itemSave.constructorParam; + if (constructorParam.HasValue) + { + item = (InventoryItem)Activator.CreateInstance(itemType, constructorParam.Value); + } + else + { + item = (InventoryItem)Activator.CreateInstance(itemType); + } + return item; + } + return null; + } + private FleetShip RestoreFleetShip(FleetShipSave fleetShipSave, List inventoryItems) + { + FleetShip fleetShip = new FleetShip + { + captainName = fleetShipSave.captainName, + shipData = shipTypes.GetShipDataByModelType(fleetShipSave.shipType), + upgradeArray = RestoreUpgradeArray(fleetShipSave.upgradeArray, inventoryItems), + veterancy = fleetShipSave.veterancy, + childShip = fleetShipSave.childShip, + stats = fleetShipSave.stats + }; + return fleetShip; + } + private InventoryItem[] RestoreUpgradeArray(int?[] upgradeArraySave, List inventoryItems) + { + int upgradeArrayLength = upgradeArraySave.Length; + InventoryItem[] upgradeArray = new InventoryItem[upgradeArrayLength]; + for (int i = 0; i < upgradeArrayLength; i++) + { + int? index = upgradeArraySave[i]; + if (index != null) + { + upgradeArray[i] = inventoryItems[(int) index]; + } + } + return upgradeArray; + } + private EventLoad RestoreEvent(EventSave eventSave) + { + EventLoad eventLoad = new EventLoad + { + kToucansOnboard = eventSave.kToucansOnboard, + kPandaOnboard = eventSave.kPandaOnboard, + kCrisiumOnBoard = eventSave.kCrisiumOnBoard, + kHaveGauntlet = eventSave.kHaveGauntlet, + + tradeItems = RestoreInventoryPool(eventSave.tradeItems), + Logs = eventSave.Logs, + inventoryPool = RestoreInventoryPool(eventSave.inventoryPool), + eventPool = RestoreEventPool(eventSave.eventPool), + dangerPool = RestoreEventPool(eventSave.dangerPool), + wormPool = RestoreEventPool(eventSave.wormPool), + unlockableEventPool = RestoreEventPool(eventSave.unlockableEventPool) + }; + + return eventLoad; + } + public List RestoreInventoryPool(List inventoryPool) + { + List items = new List(); + foreach (InventoryItemSave itemSave in inventoryPool) + { + InventoryItem item = RestoreInventoryItem(itemSave); + if (item != null) + { + items.Add(item); + } + } + return items; + } + public List RestoreEventPool(List eventPoolSave) + { + List eventPool = new List(); + foreach (string eventTypeName in eventPoolSave) + { + Type eventType = Type.GetType(eventTypeName); + if (eventType != null) + { + Event ev = (Event)Activator.CreateInstance(eventType); + eventPool.Add(ev); + } + } + return eventPool; + } - } } \ No newline at end of file diff --git a/SpaceShooter/System/WorldMap.cs b/SpaceShooter/System/WorldMap.cs index f3068f8..487cdb9 100644 --- a/SpaceShooter/System/WorldMap.cs +++ b/SpaceShooter/System/WorldMap.cs @@ -27,6 +27,8 @@ namespace SpaceShooter { + + [Serializable] public class Location { public string name; @@ -139,9 +141,9 @@ public WorldState worldstate } - CloudManager cloudManager; + public CloudManager cloudManager; - SysMenuManager menuManager; + public SysMenuManager menuManager; public SysMenuManager MenuManager { get { return menuManager; } @@ -158,6 +160,7 @@ public EventManager evManager public List Locations { get { return locations; } + set { locations = value; } } SkyBox skyBox; @@ -383,6 +386,11 @@ public WorldMap() } Location currentLocation = null; + public Location CurrentLocation + { + get { return currentLocation; } + set { currentLocation = value; } + } Location destinationLocation = null; Vector3 currentPosition = Vector3.Zero; @@ -541,7 +549,8 @@ private void ClearDeadItem(InventoryItem item) public void EndGame() { fadeUpTransition = 0; - + // delete saved campaign file + FrameworkCore.storagemanager.DeleteCampaign(); //game over! menuManager.AddMenu(new GameOverMenu()); } diff --git a/SpaceShooter/UI/MainMenu.cs b/SpaceShooter/UI/MainMenu.cs index d2756c5..c2506c0 100644 --- a/SpaceShooter/UI/MainMenu.cs +++ b/SpaceShooter/UI/MainMenu.cs @@ -27,10 +27,20 @@ public class MainMenu : SysMenu public MainMenu() { canBeExited = false; + MenuItem item; - MenuItem item = new MenuItem(string.Format(Resource.MenuCampaign, FrameworkCore.adventureNumber)); - item.Selected += OnSelectCampaign; - base.AddItem(item); + if (FrameworkCore.storagemanager.CampaignFileExists()) + { + item = new MenuItem(string.Format(Resource.MenuCampaignContinue, FrameworkCore.adventureNumber)); + item.Selected += OnSelectContinueCampaign; + base.AddItem(item); + } + else + { + item = new MenuItem(string.Format(Resource.MenuCampaign, FrameworkCore.adventureNumber)); + item.Selected += OnSelectCampaign; + base.AddItem(item); + } item = new MenuItem(Resource.MenuHighScoresTitle); item.Selected += OnSelectHighScores; @@ -93,6 +103,10 @@ private void OnSelectHighScores(object sender, EventArgs e) Owner.AddMenu(new HighScoreMenu()); } + private void OnSelectContinueCampaign(object sender, EventArgs e) + { + CampaignManager.ContinueCampaign(); + } private void OnSelectCampaign(object sender, EventArgs e) { Owner.AddMenu(new CampaignMenu()); diff --git a/SpaceShooter/UI/PauseMenu.cs b/SpaceShooter/UI/PauseMenu.cs index e2b2dd8..55a0535 100644 --- a/SpaceShooter/UI/PauseMenu.cs +++ b/SpaceShooter/UI/PauseMenu.cs @@ -56,9 +56,16 @@ public PauseMenu() } item = new MenuItem(Resource.MenuQuit); - item.Selected += OnSelectMainMenu; + item.Selected += OnSelectQuit; base.AddItem(item); + if (FrameworkCore.isCampaign && !DestructAvailable()) + { + item = new MenuItem(Resource.MenuReturnToMain); + item.Selected += OnSelectMainMenu; + base.AddItem(item); + } + SetupItemPositions(); } @@ -154,10 +161,14 @@ private void OnSelectSelfDestruct(object sender, EventArgs e) } private void OnSelectMainMenu(object sender, EventArgs e) + { + FrameworkCore.storagemanager.SaveCampaign(FrameworkCore.worldMap, FrameworkCore.players[0]); + FrameworkCore.ExitToMainMenu(null); + } + private void OnSelectQuit(object sender, EventArgs e) { if (Owner == null) return; - Owner.AddMenu(new QuitConfirm()); } diff --git a/SpaceShooter/UI/QuitConfirm.cs b/SpaceShooter/UI/QuitConfirm.cs index 9a9c70b..e7883cb 100644 --- a/SpaceShooter/UI/QuitConfirm.cs +++ b/SpaceShooter/UI/QuitConfirm.cs @@ -54,6 +54,10 @@ private void OnNo(object sender, EventArgs e) private void OnYes(object sender, EventArgs e) { + if (FrameworkCore.isCampaign) + { + FrameworkCore.storagemanager.DeleteCampaign(); + } FrameworkCore.PlayCue(sounds.click.activate); Deactivate(); diff --git a/SpaceShooter/app.config b/SpaceShooter/app.config index 0df7832..f0cd953 100644 --- a/SpaceShooter/app.config +++ b/SpaceShooter/app.config @@ -1,3 +1,3 @@ - + diff --git a/SpaceShooter/eResource.Designer.cs b/SpaceShooter/eResource.Designer.cs index 1734a06..df6a0b5 100644 --- a/SpaceShooter/eResource.Designer.cs +++ b/SpaceShooter/eResource.Designer.cs @@ -19,7 +19,7 @@ namespace SpaceShooter { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class eResource { diff --git a/SpaceShooter/iResource.Designer.cs b/SpaceShooter/iResource.Designer.cs index 78ab7fa..4d3486e 100644 --- a/SpaceShooter/iResource.Designer.cs +++ b/SpaceShooter/iResource.Designer.cs @@ -19,7 +19,7 @@ namespace SpaceShooter { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class iResource {