From 4238301ad30d880fbd5032af0381c3d38bb473c3 Mon Sep 17 00:00:00 2001 From: Regalis11 Date: Sun, 26 Jul 2015 21:15:41 +0300 Subject: [PATCH] Location hire --- Subsurface/Characters/Jobs/JobPrefab.cs | 5 ++ Subsurface/Content/Map/locationTypes.xml | 9 +- Subsurface/Game1.cs | 17 +++- Subsurface/GameSession/HireManager.cs | 1 + Subsurface/GameSession/SinglePlayerMode.cs | 19 +++-- Subsurface/{Settings.cs => GameSettings.cs} | 0 Subsurface/Map/Location.cs | 33 ++++++-- Subsurface/Map/LocationType.cs | 14 +++- Subsurface/Map/Map.cs | 6 +- Subsurface/Screens/LobbyScreen.cs | 86 +++++++++++++------- Subsurface/Subsurface.csproj | 2 +- Subsurface/Utils/ToolBox.cs | 15 ++++ Subsurface_Solution.v12.suo | Bin 464384 -> 488448 bytes 13 files changed, 151 insertions(+), 56 deletions(-) rename Subsurface/{Settings.cs => GameSettings.cs} (100%) diff --git a/Subsurface/Characters/Jobs/JobPrefab.cs b/Subsurface/Characters/Jobs/JobPrefab.cs index dea51ca85..673a4627a 100644 --- a/Subsurface/Characters/Jobs/JobPrefab.cs +++ b/Subsurface/Characters/Jobs/JobPrefab.cs @@ -81,6 +81,11 @@ namespace Subsurface } } + public static JobPrefab Random() + { + return List[Rand.Int(List.Count)]; + } + private void LoadSkills(XElement element) { foreach (XElement subElement in element.Elements()) diff --git a/Subsurface/Content/Map/locationTypes.xml b/Subsurface/Content/Map/locationTypes.xml index 777e1cffe..540b41de8 100644 --- a/Subsurface/Content/Map/locationTypes.xml +++ b/Subsurface/Content/Map/locationTypes.xml @@ -9,7 +9,8 @@ + commonness="3" + hireablecharacters="true"> + commonness="1" + hireablecharacters="true"> + commonness="1" + hireablecharacters="true"> Load() { - GUI.Font = Content.Load("SpriteFont1"); - GUI.SmallFont = Content.Load("SmallFont"); + GUI.Font = ToolBox.TryLoadFont("SpriteFont1", Content); + GUI.SmallFont = ToolBox.TryLoadFont("SmallFont", Content); + + sw = new Stopwatch(); LightManager = new Lights.LightManager(GraphicsDevice); @@ -246,7 +248,7 @@ namespace Subsurface double deltaTime = gameTime.ElapsedGameTime.TotalSeconds; PlayerInput.Update(deltaTime); - if (loadState>=100.0f && !titleScreenOpen) + if (loadState >= 100.0f && !titleScreenOpen) { //if (PlayerInput.KeyDown(Keys.Escape)) Quit(); @@ -289,14 +291,21 @@ namespace Subsurface titleScreenOpen = false; } } - else if (loadState>=100.0f) + else if (loadState >= 100.0f) { Screen.Selected.Draw(deltaTime, GraphicsDevice, spriteBatch); } //renderTimeElapsed = (int)renderTimer.Elapsed.Ticks; //renderTimer.Stop(); + if (sw.Elapsed.TotalSeconds < Physics.step) + { + System.Threading.Thread.Sleep((int)((Physics.step - sw.Elapsed.TotalSeconds)*1000.0)); + } + sw.Restart(); } + Stopwatch sw; + protected override void OnExiting(object sender, EventArgs args) { if (NetworkMember != null) NetworkMember.Disconnect(); diff --git a/Subsurface/GameSession/HireManager.cs b/Subsurface/GameSession/HireManager.cs index 5877c0964..1e5b52f36 100644 --- a/Subsurface/GameSession/HireManager.cs +++ b/Subsurface/GameSession/HireManager.cs @@ -15,6 +15,7 @@ namespace Subsurface public void GenerateCharacters(string file, int amount) { + for (int i = 0 ; i gm.Name == "Single Player")) + : this(GameModePreset.list.Find(gm => gm.Name == "Single Player"), false) { //day = ToolBox.GetAttributeInt(element,"day",1); @@ -85,7 +90,7 @@ namespace Subsurface crewManager.StartShift(); } - public bool TryHireCharacter(CharacterInfo characterInfo) + public bool TryHireCharacter(HireManager hireManager, CharacterInfo characterInfo) { if (crewManager.Money < characterInfo.Salary) return false; diff --git a/Subsurface/Settings.cs b/Subsurface/GameSettings.cs similarity index 100% rename from Subsurface/Settings.cs rename to Subsurface/GameSettings.cs diff --git a/Subsurface/Map/Location.cs b/Subsurface/Map/Location.cs index 0eb31e44d..ccfc0ddda 100644 --- a/Subsurface/Map/Location.cs +++ b/Subsurface/Map/Location.cs @@ -9,13 +9,15 @@ namespace Subsurface class Location { - string name; + private string name; - Vector2 mapPosition; + private Vector2 mapPosition; - LocationType type; + private LocationType type; - public List connections; + private HireManager hireManager; + + public List Connections; public string Name { @@ -27,13 +29,32 @@ namespace Subsurface get { return mapPosition; } } + + public LocationType Type + { + get { return type; } + } + + public HireManager HireManager + { + get { return hireManager; } + } + public Location(Vector2 mapPosition) { - this.name = RandomName(LocationType.Random()); + this.type = LocationType.Random(); + + this.name = RandomName(type); this.mapPosition = mapPosition; - connections = new List(); + if (type.HasHireableCharacters) + { + hireManager = new HireManager(); + hireManager.GenerateCharacters(Character.HumanConfigFile, 10); + } + + Connections = new List(); } public static Location CreateRandom(Vector2 position) diff --git a/Subsurface/Map/LocationType.cs b/Subsurface/Map/LocationType.cs index 453e23dff..028dfa131 100644 --- a/Subsurface/Map/LocationType.cs +++ b/Subsurface/Map/LocationType.cs @@ -13,17 +13,23 @@ namespace Subsurface //sum of the commonness-values of each location type private static int totalWeight; - string name; + private string name; private int commonness; - List nameFormats; + private List nameFormats; + public bool HasHireableCharacters + { + get; + private set; + } + public string Name { get { return name; } } - + public List NameFormats { get { return nameFormats; } @@ -36,6 +42,8 @@ namespace Subsurface commonness = ToolBox.GetAttributeInt(element, "commonness", 1); totalWeight += commonness; + HasHireableCharacters = ToolBox.GetAttributeBool(element, "hireablecharacters", false); + nameFormats = new List(); foreach (XAttribute nameFormat in element.Element("nameformats").Attributes()) { diff --git a/Subsurface/Map/Map.cs b/Subsurface/Map/Map.cs index fb91ecd1f..67dd8b5ed 100644 --- a/Subsurface/Map/Map.cs +++ b/Subsurface/Map/Map.cs @@ -145,8 +145,8 @@ namespace Subsurface foreach (LocationConnection connection in connections) { - connection.Locations[0].connections.Add(connection); - connection.Locations[1].connections.Add(connection); + connection.Locations[0].Connections.Add(connection); + connection.Locations[1].Connections.Add(connection); } for (int i = connections.Count - 1; i >= 0; i--) @@ -181,7 +181,7 @@ namespace Subsurface currDifficulty += Rand.Range(difficultyIncrease.X, difficultyIncrease.Y, false); if (currDifficulty > Rand.Range(difficultyCutoff.X, difficultyCutoff.Y, false)) currDifficulty = 10.0f; - foreach (LocationConnection connection in start.connections) + foreach (LocationConnection connection in start.Connections) { if (!locations.Contains(connection)) continue; diff --git a/Subsurface/Screens/LobbyScreen.cs b/Subsurface/Screens/LobbyScreen.cs index 49e1438fe..a78d00011 100644 --- a/Subsurface/Screens/LobbyScreen.cs +++ b/Subsurface/Screens/LobbyScreen.cs @@ -9,7 +9,7 @@ namespace Subsurface { class LobbyScreen : Screen { - enum PanelTab { Crew = 0, Map = 1, Hire = 2 } + enum PanelTab { Crew = 0, Map = 1, CurrentLocation = 2 } GUIFrame leftPanel; GUIFrame[] rightPanel; @@ -52,8 +52,8 @@ namespace Subsurface button.UserData = PanelTab.Crew; button.OnClicked = SelectRightPanel; - button = new GUIButton(new Rectangle(0, 140, 100, 30), "Hire", null, Alignment.Left, GUI.style, leftPanel); - button.UserData = PanelTab.Hire; + button = new GUIButton(new Rectangle(0, 140, 100, 30), "Location", null, Alignment.Left, GUI.style, leftPanel); + button.UserData = PanelTab.CurrentLocation; button.OnClicked = SelectRightPanel; //--------------------------------------------------------------- @@ -87,11 +87,15 @@ namespace Subsurface //--------------------------------------- - rightPanel[(int)PanelTab.Hire] = new GUIFrame(panelRect, GUI.style); + rightPanel[(int)PanelTab.CurrentLocation] = new GUIFrame(panelRect, GUI.style); //rightPanel[(int)PanelTab.Hire].Padding = GUI.style.smallPadding; - hireList = new GUIListBox(new Rectangle(0, 30, 300, 0), GUI.style, Alignment.Left, rightPanel[(int)PanelTab.Hire]); - hireList.OnSelected = HireCharacter; + + //new GUITextBlock(new Rectangle(0, 0, 200, 25), "Location: ", Color.Transparent, Color.White, Alignment.Left, GUI.style, rightPanel[(int)PanelTab.CurrentLocation]); + + + //hireList = new GUIListBox(new Rectangle(0, 30, 300, 0), GUI.style, Alignment.Left, rightPanel[(int)PanelTab.CurrentLocation]); + //hireList.OnSelected = HireCharacter; } public override void Select() @@ -105,6 +109,45 @@ namespace Subsurface UpdateCharacterLists(); } + private void UpdateLocationTab(Location location) + { + rightPanel[(int)PanelTab.CurrentLocation] = new GUIFrame(rightPanel[(int)PanelTab.CurrentLocation].Rect, GUI.style); + rightPanel[(int)PanelTab.CurrentLocation].UserData = location; + //rightPanel[(int)PanelTab.Hire].Padding = GUI.style.smallPadding; + + new GUITextBlock(new Rectangle(0, 0, 200, 25), + "Location: "+location.Name, GUI.style, rightPanel[(int)PanelTab.CurrentLocation]); + new GUITextBlock(new Rectangle(0, 0, 200, 25), + "("+location.Type+")", GUI.style, rightPanel[(int)PanelTab.CurrentLocation]); + + if (location.HireManager != null) + { + hireList = new GUIListBox(new Rectangle(0, 30, 300, 0), GUI.style, Alignment.Left, rightPanel[(int)PanelTab.CurrentLocation]); + hireList.OnSelected = HireCharacter; + + hireList.ClearChildren(); + foreach (CharacterInfo c in location.HireManager.availableCharacters) + { + //GUIFrame frame = new GUIFrame( + // new Rectangle(0, 0, 0, 25), Color.Transparent, null, hireList); + //frame.UserData = c; + //frame.Padding = new Vector4(10.0f, 0.0f, 10.0f, 0.0f); + + GUITextBlock textBlock = new GUITextBlock( + new Rectangle(0, 0, 0, 25), + c.Name + " (" + c.Job.Name + ")", GUI.style, hireList); + textBlock.UserData = c; + + textBlock = new GUITextBlock( + new Rectangle(0, 0, 0, 25), + c.Salary.ToString(), + null, null, + Alignment.TopRight, GUI.style, textBlock); + } + } + } + + public override void Deselect() { base.Deselect(); @@ -192,25 +235,6 @@ namespace Subsurface textBlock.UserData = c; } - hireList.ClearChildren(); - foreach (CharacterInfo c in gameMode.hireManager.availableCharacters) - { - //GUIFrame frame = new GUIFrame( - // new Rectangle(0, 0, 0, 25), Color.Transparent, null, hireList); - //frame.UserData = c; - //frame.Padding = new Vector4(10.0f, 0.0f, 10.0f, 0.0f); - - GUITextBlock textBlock = new GUITextBlock( - new Rectangle(0, 0, 0, 25), - c.Name + " (" + c.Job.Name + ")", GUI.style, hireList); - textBlock.UserData = c; - - textBlock = new GUITextBlock( - new Rectangle(0, 0, 0, 25), - c.Salary.ToString(), - null, null, - Alignment.TopRight, GUI.style, textBlock); - } } public override void Update(double deltaTime) @@ -225,8 +249,7 @@ namespace Subsurface public override void Draw(double deltaTime, GraphicsDevice graphics, SpriteBatch spriteBatch) { - if (characterList.CountChildren != gameMode.crewManager.characterInfos.Count - || hireList.CountChildren != gameMode.hireManager.availableCharacters.Count) + if (characterList.CountChildren != gameMode.crewManager.characterInfos.Count) { UpdateCharacterLists(); } @@ -247,7 +270,12 @@ namespace Subsurface rightPanel[selectedRightPanel].Rect.Right - 20 - 400, rightPanel[selectedRightPanel].Rect.Y + 20, 400, 400)); - } + } + + if (rightPanel[(int)selectedRightPanel].UserData as Location != Game1.GameSession.Map.CurrentLocation) + { + UpdateLocationTab(Game1.GameSession.Map.CurrentLocation); + } GUI.Draw((float)deltaTime, spriteBatch, null); @@ -350,7 +378,7 @@ namespace Subsurface CharacterInfo characterInfo = selection as CharacterInfo; if (characterInfo == null) return false; - gameMode.TryHireCharacter(characterInfo); + gameMode.TryHireCharacter(Game1.GameSession.Map.CurrentLocation.HireManager, characterInfo); return false; } diff --git a/Subsurface/Subsurface.csproj b/Subsurface/Subsurface.csproj index baa86edad..ae6f44c0b 100644 --- a/Subsurface/Subsurface.csproj +++ b/Subsurface/Subsurface.csproj @@ -194,7 +194,7 @@ - + diff --git a/Subsurface/Utils/ToolBox.cs b/Subsurface/Utils/ToolBox.cs index 24f412f47..f64c02bdd 100644 --- a/Subsurface/Utils/ToolBox.cs +++ b/Subsurface/Utils/ToolBox.cs @@ -29,6 +29,21 @@ namespace Subsurface return doc; } + public static SpriteFont TryLoadFont(string file, Microsoft.Xna.Framework.Content.ContentManager contentManager) + { + SpriteFont font = null; + try + { + font = contentManager.Load(file); + } + catch + { + DebugConsole.ThrowError("Loading font ''"+file+"'' failed"); + } + + return font; + } + public static object GetAttributeObject(XElement element, string name) { if (element.Attribute(name) == null) return null; diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index 49ca8b7ad6e0e11584385f8d0452f4823d2ce02d..9977e1e326cd3f26c0966c47bdaca8381c7203b1 100644 GIT binary patch delta 22617 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 I38VLa0h{h{@&Et;