예제 #1
0
 public void QueueCalculation(UpgradeAction.UpgradeDetails upgrade, Action onCompleteCallback)
 {
     if (upgrade.tech == Technology.None)
     {
         return;
     }
     SetupAndCalculateGamePlan(null, upgrade, onCompleteCallback);
 }
예제 #2
0
        public void Setup(UpgradeGroupNode group, UpgradeAction.UpgradeDetails upgrade, int index)
        {
            this.group   = group;
            this.upgrade = upgrade;
            this.index   = index;

            hash    = GenerateHash(upgrade);
            Element = GetElement();
        }
예제 #3
0
        public void QueueCalculation(HexCell cell, Action onCompleteCallback)
        {
            if (cell == null)
            {
                return;
            }
            var nullUpgradeDetails = new UpgradeAction.UpgradeDetails();

            SetupAndCalculateGamePlan(cell, nullUpgradeDetails, onCompleteCallback);
        }
예제 #4
0
        public void ShowNodeDetails(UpgradeAction.UpgradeDetails upgradeDetails)
        {
            if (this.upgradeDetails.tech == upgradeDetails.tech)
            {
                return;
            }

            this.upgradeDetails = upgradeDetails;
            cell    = null;
            upgrade = null;
            UpdateContents();
        }
예제 #5
0
        public TurnCalculatorNode(TurnCalculatorNode originalNode, UpgradeAction.UpgradeDetails upgrade, int numTurnsToAfford, Currency targetCost)
        {
            PlayerData = originalNode.PlayerData.Clone();
            Buildings  = originalNode.Buildings;

            ApplyCurrencyModifications(numTurnsToAfford, upgrade.cost);
            PlayerData.TechnologyData.AddTechnology(upgrade.tech);

            PreviousNode = originalNode;
            Action       = "Upgrade " + upgrade.title;

            CalculateNodeCosts(targetCost);
        }
예제 #6
0
        public UpgradeSubNode GetSubNode(UpgradeAction.UpgradeDetails upgradeDetails)
        {
            var subUpgradeHash = UpgradeSubNode.GenerateHash(upgradeDetails);
            var subNode        = subNodes.FirstOrDefault(n => n.GetHash() == subUpgradeHash);

            if (subNode == null)
            {
                var index = action.upgradeDetails.ToList().FindIndex(u => u.tech == upgradeDetails.tech);
                subNode = new UpgradeSubNode(this, upgradeDetails, index);
                subNodes.Add(subNode);
            }

            return(subNode);
        }
예제 #7
0
 private void UpdateActionCost(UpgradeAction action, UpgradeAction.UpgradeDetails upgrade, Currency cost)
 {
     for (int i = 0; i < action.upgradeDetails.Length; i++)
     {
         if (action.upgradeDetails[i].tech == upgrade.tech && action.upgradeDetails[i].title == upgrade.title)
         {
             editor.RecordUndo(action, "Upgrade action cost");
             upgrade.cost = cost;
             var allDetails = action.upgradeDetails;
             allDetails[i]         = upgrade;
             action.upgradeDetails = allDetails;
             EditorUtility.SetDirty(action);
             UpdateActions();
         }
     }
 }
예제 #8
0
        public bool CanAddTech(UpgradeAction.UpgradeDetails details, PlayerData data)
        {
            if (data == null || details.tech == Technology.None)
            {
                return(false);
            }

            if (data.TechnologyData.HasTechnology(details.tech))
            {
                return(false);
            }
            if (!data.TechnologyData.HasTechnologies(details.requiredTech))
            {
                return(false);
            }

            return(data.CurrencyData.CanAfford(details.cost));
        }
예제 #9
0
        private void SetupAndCalculateGamePlan(HexCell cell, UpgradeAction.UpgradeDetails upgrade, Action onCompleteCallback)
        {
            targetCell    = cell;
            targetUpgrade = upgrade;

            var homeCell   = (BuildingCell)cells.GetPrefab(Cells.CellTypes.Home);
            var playerData = CreatePlayerData(homeCell);
            var buildings  = new List <BuildingCell> {
                homeCell
            };

            if (targetCell != null)
            {
                if (targetCell is BuildingCell buildingCell && buildings.Contains(buildingCell))
                {
                    return;
                }
                if (playerData.TechnologyData.HasTechnology(targetCell.Technology))
                {
                    return;
                }
            }
            else if (targetUpgrade.tech != Technology.None)
            {
                if (playerData.TechnologyData.HasTechnology(targetUpgrade.tech))
                {
                    return;
                }
            }
            else
            {
                return;
            }

            openSet.Clear();
            closedSet.Clear();

            openSet.Add(new TurnCalculatorNode(playerData, buildings));

            gamePlan = CalculateGamePlan();
            onCompleteCallback?.Invoke();
        }
예제 #10
0
        public void Show(VisualElement container, UpgradeAction.UpgradeDetails upgrade, Action updateContentsCallback)
        {
            var header = new Label(upgrade.title);

            header.AddToClassList("object-header");
            container.Add(header);

            container.Add(new Label($"Cost: {upgrade.cost.supplies} supplies, {upgrade.cost.production} production"));

            gamePlan.ShowGamePlan(container);

            var btn = new Button {
                text = "Turns"
            };

            btn.AddToClassList("calc-button");

            btn.clicked += () => gamePlan.CalculateGamePlan(upgrade, updateContentsCallback);
            container.Add(btn);
        }
예제 #11
0
 public void CalculateGamePlan(UpgradeAction.UpgradeDetails upgradeDetails, Action onGamePlanCalculatedCallback)
 {
     turnCalculator.QueueCalculation(upgradeDetails, onGamePlanCalculatedCallback);
 }
예제 #12
0
 public static int GenerateHash(UpgradeAction.UpgradeDetails upgrade) => Hash128.Compute("SubUpgrade" + upgrade.title).GetHashCode();
예제 #13
0
 public UpgradeSubNode(UpgradeGroupNode group, UpgradeAction.UpgradeDetails upgrade, int index)
 {
     MoveDisabled = false;
     Setup(group, upgrade, index);
 }
예제 #14
0
 private void ProcessUpgradeAction(UpgradeAction.UpgradeDetails upgrade)
 {
     ProcessCost(upgrade.cost);
     playerData.TechnologyData.AddTechnology(upgrade.tech);
     UpdateActions();
 }