From 9644d701bcf5966e40bd08cb25ac31c18adb7188 Mon Sep 17 00:00:00 2001 From: laurids Date: Sat, 12 Mar 2022 17:20:32 +0100 Subject: [PATCH] Refactor Build Cost; remove costs from inv --- Assets/GWConquest/Scripts/District.cs | 6 +- Assets/GWConquest/Scripts/DistrictFactory.cs | 44 +++++++++++++-- Assets/GWConquest/Scripts/DistrictUpgrade.cs | 8 +-- Assets/GWConquest/Scripts/Planet.cs | 4 ++ Assets/GWConquest/Scripts/ServerCallbacks.cs | 3 +- .../Scripts/UI/PlanetIndicatorUI.cs | 2 - .../GWConquest/Scripts/UI/ProductionMenu.cs | 8 +-- .../Scripts/UI/ProductionMenuIcon.cs | 10 ++-- Assets/GWConquest/Scripts/UnitClass.cs | 56 +++++++++++++++---- 9 files changed, 107 insertions(+), 34 deletions(-) diff --git a/Assets/GWConquest/Scripts/District.cs b/Assets/GWConquest/Scripts/District.cs index 0ad6801..2462612 100644 --- a/Assets/GWConquest/Scripts/District.cs +++ b/Assets/GWConquest/Scripts/District.cs @@ -291,8 +291,10 @@ namespace GWConquest public bool CanBuild(IBuildable buildable) { var cost = buildable.BuildCost; - return ControllingPlayer.Credits >= cost.CreditCost && Inventory.HasItem("Recruits", cost.RecruitCost) - && Inventory.HasItem("Supplies", cost.AmmoCost) && Inventory.HasItem("Fuel", cost.FuelCost); + var accesibleItems = Planet.IsPlanetContested ? Inventory : Planet.PlanetInventory; + var player = ControllingPlayer; + + return player != null && cost.AvailableIn(accesibleItems, player); } } diff --git a/Assets/GWConquest/Scripts/DistrictFactory.cs b/Assets/GWConquest/Scripts/DistrictFactory.cs index 287e77e..f5650ba 100644 --- a/Assets/GWConquest/Scripts/DistrictFactory.cs +++ b/Assets/GWConquest/Scripts/DistrictFactory.cs @@ -120,16 +120,52 @@ namespace GWConquest } - public void AddProductionQueueEntry(string uc, Player player, bool isUpgrade) + public void AddProductionQueueEntry(IBuildable buildable, Player player) { + if(!DebugUI.FreeBuild) + { + if(!District.CanBuild(buildable)) + { + BoltLog.Error($"Could not build {buildable} in district {gameObject.name}"); + return; + } + + bool contested = District.Planet.IsPlanetContested; + + var districtInv = District.Inventory; + var planetInv = District.Planet.PlanetInventory; + + foreach(var cost in buildable.BuildCost.Costs) + { + if(cost.Item == "Credits") + { + player.Credits -= cost.Amount; + } + else { + if(districtInv.HasItem(cost.Item, cost.Amount)) + { + districtInv.RemoveItem(cost.Item, cost.Amount); + } + else if(!contested && planetInv.HasItem(cost.Item, cost.Amount)) + { + planetInv.RemoveItem(cost.Item, cost.Amount); + } + else { + BoltLog.Error("Error while building {0}: Item {1} x {2} not found in inventories", buildable, cost.Item, cost.Amount); + } + } + } + + } + int length = ProductionQueueLength; if(length < MaxQueueLength) { - BoltLog.Info("Adding unit {0} to production queue on district {1}", uc, gameObject.name); - State.ProductionQueue[length].UnitClass = uc; + BoltLog.Info("Adding unit {0} to production queue on district {1}", buildable, gameObject.name); + State.ProductionQueue[length].UnitClass = buildable.ShortName; State.ProductionQueue[length].TimeProduced = 0f; State.ProductionQueue[length].Player = player.entity; - State.ProductionQueue[length].IsUpgrade = isUpgrade; + State.ProductionQueue[length].IsUpgrade = buildable is DistrictUpgrade; } } diff --git a/Assets/GWConquest/Scripts/DistrictUpgrade.cs b/Assets/GWConquest/Scripts/DistrictUpgrade.cs index 1253b50..1a2cb5b 100644 --- a/Assets/GWConquest/Scripts/DistrictUpgrade.cs +++ b/Assets/GWConquest/Scripts/DistrictUpgrade.cs @@ -64,9 +64,9 @@ namespace GWConquest } upgrade.AllowedDistrictTypes = typeList.ToArray(); - upgrade.BuildCost = new BuildCost() { - CreditCost = data.GetInt("Credit Cost") - }; + upgrade.BuildCost = new BuildCost(); + upgrade.BuildCost.AddCost("Credits", data.GetInt("Credit Cost")); + upgrade.BuildTime = data.GetFloat("Build Time"); upgrade.Description = data.GetString("Description"); @@ -117,7 +117,7 @@ namespace GWConquest } - public string ShortName; + public string ShortName {get; private set;} public string FullName {get; private set;} public Sprite Sprite {get; private set;} public DistrictType[] AllowedDistrictTypes; diff --git a/Assets/GWConquest/Scripts/Planet.cs b/Assets/GWConquest/Scripts/Planet.cs index 096cb45..ba948d7 100644 --- a/Assets/GWConquest/Scripts/Planet.cs +++ b/Assets/GWConquest/Scripts/Planet.cs @@ -107,6 +107,8 @@ namespace GWConquest public PathfindingGraph pathfindingGraph; + public IInventory PlanetInventory; + public static PathfindingGraph PlanetPathfindingGraph; public Zone GetMainZone(ZoneType type) @@ -187,6 +189,8 @@ namespace GWConquest PlanetPlacement.Instance.SpawnAsteroids(this); } + + PlanetInventory = new CombinedInventory(() => GetComponentsInChildren().Select(d => d.Inventory)); } diff --git a/Assets/GWConquest/Scripts/ServerCallbacks.cs b/Assets/GWConquest/Scripts/ServerCallbacks.cs index 3f84973..facfa4a 100644 --- a/Assets/GWConquest/Scripts/ServerCallbacks.cs +++ b/Assets/GWConquest/Scripts/ServerCallbacks.cs @@ -110,7 +110,8 @@ namespace GWConquest public override void OnEvent(AddProductionEvent evnt) { DistrictFactory factory = evnt.Factory.GetComponent(); - factory.AddProductionQueueEntry(evnt.UnitClass, evnt.Player.GetComponent(), evnt.IsUpgrade); + IBuildable buildable = evnt.IsUpgrade ? DistrictUpgrade.FromName(evnt.UnitClass) : UnitClass.FromName(evnt.UnitClass); + factory.AddProductionQueueEntry(buildable, evnt.Player.GetComponent()); } public override void OnEvent(MoveUnitToFlankEvent evnt) diff --git a/Assets/GWConquest/Scripts/UI/PlanetIndicatorUI.cs b/Assets/GWConquest/Scripts/UI/PlanetIndicatorUI.cs index ba29a5a..aba0db5 100644 --- a/Assets/GWConquest/Scripts/UI/PlanetIndicatorUI.cs +++ b/Assets/GWConquest/Scripts/UI/PlanetIndicatorUI.cs @@ -38,8 +38,6 @@ namespace GWConquest [System.NonSerialized] private Planet Planet; - private bool IndicatorShown = true; - public void SetPlanet(Planet planet) { Planet = planet; diff --git a/Assets/GWConquest/Scripts/UI/ProductionMenu.cs b/Assets/GWConquest/Scripts/UI/ProductionMenu.cs index e0f45c9..efebe15 100644 --- a/Assets/GWConquest/Scripts/UI/ProductionMenu.cs +++ b/Assets/GWConquest/Scripts/UI/ProductionMenu.cs @@ -94,10 +94,10 @@ namespace GWConquest int iconIndex = 0; var buildCost = selectedUnitClass.BuildCost; - AddCostIcon(buildCost.FuelCost, "Fuel", ref iconIndex); - AddCostIcon(buildCost.AmmoCost, "Supplies", ref iconIndex); - AddCostIcon(buildCost.RecruitCost, "Recruits", ref iconIndex); - AddCostIcon(buildCost.CreditCost, "Credits", ref iconIndex); + foreach(var cost in buildCost.Costs) + { + AddCostIcon(cost.Amount, cost.Item, ref iconIndex); + } } private void AddCostIcon(int cost, string itemName, ref int index) diff --git a/Assets/GWConquest/Scripts/UI/ProductionMenuIcon.cs b/Assets/GWConquest/Scripts/UI/ProductionMenuIcon.cs index ab2c2de..0d2a8db 100644 --- a/Assets/GWConquest/Scripts/UI/ProductionMenuIcon.cs +++ b/Assets/GWConquest/Scripts/UI/ProductionMenuIcon.cs @@ -27,10 +27,10 @@ namespace GWConquest if(unitClass.BuildCost != null) { - SpawnCostIcon("Credits", unitClass.BuildCost.CreditCost); - SpawnCostIcon("Recruits", unitClass.BuildCost.RecruitCost); - SpawnCostIcon("Supplies", unitClass.BuildCost.AmmoCost); - SpawnCostIcon("Fuel", unitClass.BuildCost.FuelCost); + foreach(var cost in unitClass.BuildCost.Costs) + { + SpawnCostIcon(cost.Item, cost.Amount); + } GWLayout.UpdateLayout(Costs); } @@ -71,7 +71,7 @@ namespace GWConquest } } - void Update() + void FixedUpdate() { var district = Menu.factory.District; if(Buildable.BuildCost != null) diff --git a/Assets/GWConquest/Scripts/UnitClass.cs b/Assets/GWConquest/Scripts/UnitClass.cs index 550c4a3..b0b368b 100644 --- a/Assets/GWConquest/Scripts/UnitClass.cs +++ b/Assets/GWConquest/Scripts/UnitClass.cs @@ -89,13 +89,11 @@ namespace GWConquest unitClass.EquipmentSlots = data.GetInt("Equipment Slots"); unitClass.InventorySlots = data.GetInt("Inventory Slots"); - unitClass.BuildCost = new BuildCost - { - CreditCost = data.GetInt("Credit Cost"), - RecruitCost = data.GetInt("Recruit Cost"), - AmmoCost = data.GetInt("Supplies Cost"), - FuelCost = data.GetInt("Fuel Cost") - }; + unitClass.BuildCost = new BuildCost(); + unitClass.BuildCost.AddCost("Credits", data.GetInt("Credit Cost")); + unitClass.BuildCost.AddCost("Recruits", data.GetInt("Recruit Cost")); + unitClass.BuildCost.AddCost("Supplies", data.GetInt("Supplies Cost")); + unitClass.BuildCost.AddCost("Fuel", data.GetInt("Fuel Cost")); unitClass.BuildTime = data.GetFloat("Build Time"); @@ -295,7 +293,7 @@ namespace GWConquest } public string FullName {get; private set;} - public string ShortName; + public string ShortName {get; private set;} public Sprite Sprite { get; private set; @@ -381,13 +379,46 @@ namespace GWConquest public float Accuracy; } + [System.Serializable] + public struct BuildCostEntry + { + public string Item; + public int Amount; + } + [System.Serializable] public class BuildCost { - public int CreditCost; - public int RecruitCost; - public int AmmoCost; - public int FuelCost; + public List Costs = new List(); + + public void AddCost(string item, int amount) + { + if(amount > 0) + { + Costs.Add(new BuildCostEntry() {Item = item, Amount = amount}); + } + } + + public bool AvailableIn(IInventory inventory, Player player) + { + foreach(var cost in Costs) + { + if(cost.Item == "Credits") + { + if(player.Credits < cost.Amount) + { + return false; + } + } + else { + if(!inventory.HasItem(cost.Item, cost.Amount)) + { + return false; + } + } + } + return true; + } } public interface IBuildable @@ -395,6 +426,7 @@ namespace GWConquest BuildCost BuildCost {get;} float BuildTime {get;} Sprite Sprite {get;} + string ShortName {get;} string FullName {get;} string Description {get;} }