From f248ef528bad613c46199a61338c5180e916c844 Mon Sep 17 00:00:00 2001 From: Regalis Date: Sat, 8 Aug 2015 14:19:47 +0300 Subject: [PATCH] Separate folder for game modes --- Subsurface/Source/DebugConsole.cs | 4 +- .../GameSession/{ => GameModes}/GameMode.cs | 35 +-- .../GameSession/GameModes/GameModePreset.cs | 38 +++ .../GameSession/{ => GameModes}/QuestMode.cs | 0 .../{ => GameModes}/SinglePlayerMode.cs | 54 ++-- .../{ => GameModes}/TraitorMode.cs | 0 .../GameSession/GameModes/TutorialMode.cs | 11 + Subsurface/Source/GameSession/GameSession.cs | 4 +- Subsurface/Source/Screens/LobbyScreen.cs | 12 +- Subsurface/StyleCop.Cache | 243 +++++++++--------- Subsurface/Subsurface.csproj | 10 +- Subsurface_Solution.v12.suo | Bin 619008 -> 586240 bytes 12 files changed, 221 insertions(+), 190 deletions(-) rename Subsurface/Source/GameSession/{ => GameModes}/GameMode.cs (80%) create mode 100644 Subsurface/Source/GameSession/GameModes/GameModePreset.cs rename Subsurface/Source/GameSession/{ => GameModes}/QuestMode.cs (100%) rename Subsurface/Source/GameSession/{ => GameModes}/SinglePlayerMode.cs (80%) rename Subsurface/Source/GameSession/{ => GameModes}/TraitorMode.cs (100%) create mode 100644 Subsurface/Source/GameSession/GameModes/TutorialMode.cs diff --git a/Subsurface/Source/DebugConsole.cs b/Subsurface/Source/DebugConsole.cs index bd98b5e8a..93b8f8047 100644 --- a/Subsurface/Source/DebugConsole.cs +++ b/Subsurface/Source/DebugConsole.cs @@ -158,8 +158,8 @@ namespace Subsurface { SinglePlayerMode mode = Game1.GameSession.gameMode as SinglePlayerMode; if (mode == null) break; - mode.crewManager.AddCharacter(Character.Controlled); - mode.crewManager.SelectCharacter(Character.Controlled); + mode.CrewManager.AddCharacter(Character.Controlled); + mode.CrewManager.SelectCharacter(Character.Controlled); } } else diff --git a/Subsurface/Source/GameSession/GameMode.cs b/Subsurface/Source/GameSession/GameModes/GameMode.cs similarity index 80% rename from Subsurface/Source/GameSession/GameMode.cs rename to Subsurface/Source/GameSession/GameModes/GameMode.cs index ad4a8f883..af887f5b8 100644 --- a/Subsurface/Source/GameSession/GameMode.cs +++ b/Subsurface/Source/GameSession/GameModes/GameMode.cs @@ -6,39 +6,9 @@ using System.Reflection; namespace Subsurface { - class GameModePreset - { - public static List list = new List(); - - public ConstructorInfo Constructor; - public string Name; - public bool IsSinglePlayer; - - public string Description; - - public GameModePreset(string name, Type type, bool isSinglePlayer = false) - { - this.Name = name; - //Constructor = constructor; - - - Constructor = type.GetConstructor(new Type[] { typeof(GameModePreset)}); - - IsSinglePlayer = isSinglePlayer; - - list.Add(this); - } - - public GameMode Instantiate() - { - object[] lobject = new object[] { this }; - return(GameMode)Constructor.Invoke(lobject); - } - } - class GameMode { - public static List presetList = new List(); + public static List PresetList = new List(); TimeSpan duration; protected DateTime startTime; @@ -94,9 +64,6 @@ namespace Subsurface public GameMode(GameModePreset preset) { this.preset = preset; - - - //list.Add(this); } public virtual void Draw(SpriteBatch spriteBatch) diff --git a/Subsurface/Source/GameSession/GameModes/GameModePreset.cs b/Subsurface/Source/GameSession/GameModes/GameModePreset.cs new file mode 100644 index 000000000..fbd6964a2 --- /dev/null +++ b/Subsurface/Source/GameSession/GameModes/GameModePreset.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; + +namespace Subsurface +{ + class GameModePreset + { + public static List list = new List(); + + public ConstructorInfo Constructor; + public string Name; + public bool IsSinglePlayer; + + public string Description; + + public GameModePreset(string name, Type type, bool isSinglePlayer = false) + { + this.Name = name; + //Constructor = constructor; + + + Constructor = type.GetConstructor(new Type[] { typeof(GameModePreset) }); + + IsSinglePlayer = isSinglePlayer; + + list.Add(this); + } + + public GameMode Instantiate() + { + object[] lobject = new object[] { this }; + return (GameMode)Constructor.Invoke(lobject); + } + } +} diff --git a/Subsurface/Source/GameSession/QuestMode.cs b/Subsurface/Source/GameSession/GameModes/QuestMode.cs similarity index 100% rename from Subsurface/Source/GameSession/QuestMode.cs rename to Subsurface/Source/GameSession/GameModes/QuestMode.cs diff --git a/Subsurface/Source/GameSession/SinglePlayerMode.cs b/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs similarity index 80% rename from Subsurface/Source/GameSession/SinglePlayerMode.cs rename to Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs index 09e1dcbf0..fcb4e90c4 100644 --- a/Subsurface/Source/GameSession/SinglePlayerMode.cs +++ b/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs @@ -12,14 +12,14 @@ namespace Subsurface { //private const int StartCharacterAmount = 3; - public readonly CrewManager crewManager; + public readonly CrewManager CrewManager; //public readonly HireManager hireManager; private GUIButton endShiftButton; public readonly CargoManager CargoManager; - public Map map; + public Map Map; private bool crewDead; private float endTimer; @@ -30,20 +30,20 @@ namespace Subsurface { get { - return map.SelectedConnection.Quest; + return Map.SelectedConnection.Quest; } } public int Money { - get { return crewManager.Money; } - set { crewManager.Money = value; } + get { return CrewManager.Money; } + set { CrewManager.Money = value; } } public SinglePlayerMode(GameModePreset preset) : base(preset) { - crewManager = new CrewManager(); + CrewManager = new CrewManager(); CargoManager = new CargoManager(); @@ -68,7 +68,7 @@ namespace Subsurface CharacterInfo characterInfo = new CharacterInfo(Character.HumanConfigFile, "", Gender.None, jobPrefab); - crewManager.characterInfos.Add(characterInfo); + CrewManager.characterInfos.Add(characterInfo); } } @@ -80,19 +80,19 @@ namespace Subsurface GenerateMap(mapSeed); - map.SetLocation(ToolBox.GetAttributeInt(element, "currentlocation", 0)); + Map.SetLocation(ToolBox.GetAttributeInt(element, "currentlocation", 0)); foreach (XElement subElement in element.Elements()) { if (subElement.Name.ToString().ToLower() != "crew") continue; - crewManager = new CrewManager(subElement); + CrewManager = new CrewManager(subElement); } } public void GenerateMap(string seed) { - map = new Map(seed, 500); + Map = new Map(seed, 500); } public override void Start(TimeSpan duration) @@ -107,24 +107,24 @@ namespace Subsurface endTimer = 5.0f; - crewManager.StartShift(); + CrewManager.StartShift(); } public bool TryHireCharacter(HireManager hireManager, CharacterInfo characterInfo) { - if (crewManager.Money < characterInfo.Salary) return false; + if (CrewManager.Money < characterInfo.Salary) return false; hireManager.availableCharacters.Remove(characterInfo); - crewManager.characterInfos.Add(characterInfo); + CrewManager.characterInfos.Add(characterInfo); - crewManager.Money -= characterInfo.Salary; + CrewManager.Money -= characterInfo.Salary; return true; } public string GetMoney() { - return ("Money: " + crewManager.Money); + return "Money: " + CrewManager.Money; } @@ -132,16 +132,16 @@ namespace Subsurface { base.Draw(spriteBatch); - crewManager.Draw(spriteBatch); + CrewManager.Draw(spriteBatch); if (Level.Loaded.AtEndPosition) { - endShiftButton.Text = "Enter " + map.SelectedLocation.Name; + endShiftButton.Text = "Enter " + Map.SelectedLocation.Name; endShiftButton.Draw(spriteBatch); } else if (Level.Loaded.AtStartPosition) { - endShiftButton.Text = "Enter " + map.CurrentLocation.Name; + endShiftButton.Text = "Enter " + Map.CurrentLocation.Name; endShiftButton.Draw(spriteBatch); } @@ -157,13 +157,13 @@ namespace Subsurface { base.Update(deltaTime); - crewManager.Update(deltaTime); + CrewManager.Update(deltaTime); endShiftButton.Update(deltaTime); if (!crewDead) { - if (crewManager.characters.Find(c => !c.IsDead) == null) + if (CrewManager.characters.Find(c => !c.IsDead) == null) { crewDead = true; } @@ -185,9 +185,9 @@ namespace Subsurface StringBuilder sb = new StringBuilder(); - List casualties = crewManager.characters.FindAll(c => c.IsDead); + List casualties = CrewManager.characters.FindAll(c => c.IsDead); - if (casualties.Count == crewManager.characters.Count) + if (casualties.Count == CrewManager.characters.Count) { sb.Append("Your entire crew has died!"); @@ -214,13 +214,13 @@ namespace Subsurface if (Level.Loaded.AtEndPosition) { - map.MoveToNextLocation(); + Map.MoveToNextLocation(); } SaveUtil.SaveGame(Game1.GameSession.SaveFile); } - crewManager.EndShift(); + CrewManager.EndShift(); for (int i = Character.CharacterList.Count - 1; i >= 0; i--) { Character.CharacterList[i].Remove(); @@ -241,10 +241,10 @@ namespace Subsurface //element.Add(new XAttribute("day", day)); XElement modeElement = new XElement("gamemode"); - modeElement.Add(new XAttribute("currentlocation", map.CurrentLocationIndex)); - modeElement.Add(new XAttribute("mapseed", map.Seed)); + modeElement.Add(new XAttribute("currentlocation", Map.CurrentLocationIndex)); + modeElement.Add(new XAttribute("mapseed", Map.Seed)); - crewManager.Save(modeElement); + CrewManager.Save(modeElement); element.Add(modeElement); diff --git a/Subsurface/Source/GameSession/TraitorMode.cs b/Subsurface/Source/GameSession/GameModes/TraitorMode.cs similarity index 100% rename from Subsurface/Source/GameSession/TraitorMode.cs rename to Subsurface/Source/GameSession/GameModes/TraitorMode.cs diff --git a/Subsurface/Source/GameSession/GameModes/TutorialMode.cs b/Subsurface/Source/GameSession/GameModes/TutorialMode.cs new file mode 100644 index 000000000..5a14bd865 --- /dev/null +++ b/Subsurface/Source/GameSession/GameModes/TutorialMode.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Subsurface +{ + //class TutorialMode : GameMode + //{ + //} +} diff --git a/Subsurface/Source/GameSession/GameSession.cs b/Subsurface/Source/GameSession/GameSession.cs index fc3e13e4a..6ea2a2f8d 100644 --- a/Subsurface/Source/GameSession/GameSession.cs +++ b/Subsurface/Source/GameSession/GameSession.cs @@ -51,7 +51,7 @@ namespace Subsurface get { SinglePlayerMode mode = (gameMode as SinglePlayerMode); - return (mode == null) ? null : mode.map; + return (mode == null) ? null : mode.Map; } } @@ -151,7 +151,7 @@ namespace Subsurface { SinglePlayerMode singlePlayerMode = gameMode as SinglePlayerMode; if (singlePlayerMode == null) return; - singlePlayerMode.crewManager.KillCharacter(character); + singlePlayerMode.CrewManager.KillCharacter(character); } public bool LoadPrevious(GUIButton button, object obj) diff --git a/Subsurface/Source/Screens/LobbyScreen.cs b/Subsurface/Source/Screens/LobbyScreen.cs index ef49403e9..04160fa25 100644 --- a/Subsurface/Source/Screens/LobbyScreen.cs +++ b/Subsurface/Source/Screens/LobbyScreen.cs @@ -230,7 +230,7 @@ namespace Subsurface private void UpdateCharacterLists() { characterList.ClearChildren(); - foreach (CharacterInfo c in gameMode.crewManager.characterInfos) + foreach (CharacterInfo c in gameMode.CrewManager.characterInfos) { GUITextBlock textBlock = new GUITextBlock( new Rectangle(0, 0, 0, 25), @@ -282,7 +282,7 @@ namespace Subsurface CreateItemFrame(prefab, selectedItemList); - buyButton.Enabled = gameMode.crewManager.Money >= selectedItemCost; + buyButton.Enabled = gameMode.CrewManager.Money >= selectedItemCost; return false; } @@ -301,9 +301,9 @@ namespace Subsurface { int cost = selectedItemCost; - if (gameMode.crewManager.Money < cost) return false; + if (gameMode.CrewManager.Money < cost) return false; - gameMode.crewManager.Money -= cost; + gameMode.CrewManager.Money -= cost; for (int i = selectedItemList.children.Count-1; i>=0; i--) { @@ -336,7 +336,7 @@ namespace Subsurface public override void Draw(double deltaTime, GraphicsDevice graphics, SpriteBatch spriteBatch) { - if (characterList.CountChildren != gameMode.crewManager.characterInfos.Count) + if (characterList.CountChildren != gameMode.CrewManager.characterInfos.Count) { UpdateCharacterLists(); } @@ -380,7 +380,7 @@ namespace Subsurface private string GetMoney() { - return "Money: " + ((Game1.GameSession == null) ? "" : gameMode.crewManager.Money.ToString()); + return "Money: " + ((Game1.GameSession == null) ? "" : gameMode.CrewManager.Money.ToString()); } private bool SelectCharacter(object selection) diff --git a/Subsurface/StyleCop.Cache b/Subsurface/StyleCop.Cache index 1e523edb5..c2264d137 100644 --- a/Subsurface/StyleCop.Cache +++ b/Subsurface/StyleCop.Cache @@ -1413,40 +1413,6 @@ - - - 2014.04.01 10:18:24.000 - 2015.07.02 21:22:42.115 - 2015.07.02 21:12:45.676 - 2014.04.01 10:18:24.000 - 2014.04.01 10:18:24.000 - -1945363787 - 2014.04.01 10:18:24.000 - 0 - 2014.04.01 10:18:24.000 - 0 - 2014.04.01 10:18:24.000 - 0 - 2014.04.01 10:18:24.000 - 0 - 2014.04.01 10:18:24.000 - 0 - 2014.04.01 10:18:24.000 - 0 - - - - Public and internal fields must start with an upper-case letter: list. - 11 - False - - - Public and internal fields must start with an upper-case letter: presetList. - 39 - False - - - 2014.04.01 10:18:24.000 @@ -1525,84 +1491,6 @@ - - - 2014.04.01 10:18:24.000 - 2015.07.02 21:22:42.115 - 2015.07.02 21:17:30.529 - 2014.04.01 10:18:24.000 - 2014.04.01 10:18:24.000 - -1945363787 - 2014.04.01 10:18:24.000 - 0 - 2014.04.01 10:18:24.000 - 0 - 2014.04.01 10:18:24.000 - 0 - 2014.04.01 10:18:24.000 - 0 - 2014.04.01 10:18:24.000 - 0 - 2014.04.01 10:18:24.000 - 0 - - - - Public and internal fields must start with an upper-case letter: crewManager. - 13 - False - - - Readonly variables that are not declared private must start with an upper-case letter: crewManager. - 13 - False - - - Public and internal fields must start with an upper-case letter: hireManager. - 14 - False - - - Readonly variables that are not declared private must start with an upper-case letter: hireManager. - 14 - False - - - The line contains unnecessary parenthesis. - 76 - 2178 - 2208 - 76 - 20 - 76 - 50 - False - - - - - - 2014.04.01 10:18:24.000 - 2015.07.02 21:22:42.115 - 2015.07.02 21:16:54.762 - 2014.04.01 10:18:24.000 - 2014.04.01 10:18:24.000 - -1945363787 - 2014.04.01 10:18:24.000 - 0 - 2014.04.01 10:18:24.000 - 0 - 2014.04.01 10:18:24.000 - 0 - 2014.04.01 10:18:24.000 - 0 - 2014.04.01 10:18:24.000 - 0 - 2014.04.01 10:18:24.000 - 0 - - - 2014.04.01 10:18:24.000 @@ -6213,9 +6101,6 @@ - - DEBUG;TRACE;WINDOWS - 2014.04.01 10:18:24.000 @@ -6451,4 +6336,132 @@ + + DEBUG;TRACE;WINDOWS + + + + 2014.04.01 10:18:24.000 + 2015.07.02 21:22:42.115 + 2015.08.07 23:11:01.623 + 2014.04.01 10:18:24.000 + 2014.04.01 10:18:24.000 + -1945363787 + 2014.04.01 10:18:24.000 + 0 + 2014.04.01 10:18:24.000 + 0 + 2014.04.01 10:18:24.000 + 0 + 2014.04.01 10:18:24.000 + 0 + 2014.04.01 10:18:24.000 + 0 + 2014.04.01 10:18:24.000 + 0 + + + + Public and internal fields must start with an upper-case letter: presetList. + 11 + False + + + + + + 2014.04.01 10:18:24.000 + 2015.07.02 21:22:42.115 + 2015.07.30 01:59:55.431 + 2014.04.01 10:18:24.000 + 2014.04.01 10:18:24.000 + -1945363787 + 2014.04.01 10:18:24.000 + 0 + 2014.04.01 10:18:24.000 + 0 + 2014.04.01 10:18:24.000 + 0 + 2014.04.01 10:18:24.000 + 0 + 2014.04.01 10:18:24.000 + 0 + 2014.04.01 10:18:24.000 + 0 + + + + + + 2014.04.01 10:18:24.000 + 2015.07.02 21:22:42.115 + 2015.07.31 15:33:04.816 + 2014.04.01 10:18:24.000 + 2014.04.01 10:18:24.000 + -1945363787 + 2014.04.01 10:18:24.000 + 0 + 2014.04.01 10:18:24.000 + 0 + 2014.04.01 10:18:24.000 + 0 + 2014.04.01 10:18:24.000 + 0 + 2014.04.01 10:18:24.000 + 0 + 2014.04.01 10:18:24.000 + 0 + + + + Public and internal fields must start with an upper-case letter: crewManager. + 15 + False + + + Readonly variables that are not declared private must start with an upper-case letter: crewManager. + 15 + False + + + Public and internal fields must start with an upper-case letter: map. + 22 + False + + + The line contains unnecessary parenthesis. + 127 + 3775 + 3805 + 127 + 20 + 127 + 50 + False + + + + + + 2014.04.01 10:18:24.000 + 2015.07.02 21:22:42.115 + 2015.08.04 21:18:39.811 + 2014.04.01 10:18:24.000 + 2014.04.01 10:18:24.000 + -1945363787 + 2014.04.01 10:18:24.000 + 0 + 2014.04.01 10:18:24.000 + 0 + 2014.04.01 10:18:24.000 + 0 + 2014.04.01 10:18:24.000 + 0 + 2014.04.01 10:18:24.000 + 0 + 2014.04.01 10:18:24.000 + 0 + + + \ No newline at end of file diff --git a/Subsurface/Subsurface.csproj b/Subsurface/Subsurface.csproj index e87bafdce..406950bd3 100644 --- a/Subsurface/Subsurface.csproj +++ b/Subsurface/Subsurface.csproj @@ -70,7 +70,9 @@ - + + + @@ -85,11 +87,11 @@ - + - - + + diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index 7bf7a7e1d7723da8bb8abaef35a5a3a1f22cbd3f..8cb8cfcd64de4ea60da4a31d7ae0f44a4b1d9c87 100644 GIT binary patch delta 10952 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