public override bool CanExecute(AgricolaPlayer player, Data.GameActionData data) { if (!base.CanExecute(player, data)) { return(false); } var renovationData = (RenovationActionData)data; ResourceCache[] renovationCosts; additionalCosts = null; if (!ActionService.CanRenovate(player, out renovationCosts)) { return(false); } switch (mode) { case RenovationActionMode.Fences: if (!(renovationData.FenceData == null || renovationData.FenceData.Fences.Length == 0 || ActionService.CanBuildFences(player, Id, renovationData.FenceData, out this.pastures, out additionalCosts))) { return(false); } break; case RenovationActionMode.Improvement: if (!(renovationData.ImprovementData == null || ActionService.CanBuyImprovement(player, renovationData.ImprovementData, out additionalCosts))) { return(false); } break; } var totalCosts = new Dictionary <Resource, ResourceCache>(); if (renovationCosts != null) { foreach (var r in renovationCosts) { totalCosts[r.Type] = r; } } if (additionalCosts != null) { foreach (var cost in additionalCosts) { if (totalCosts.ContainsKey(cost.Type)) { totalCosts[cost.Type] = totalCosts[cost.Type].updateCount(cost.Count); } else { totalCosts[cost.Type] = cost; } } } return(Curator.CanAfford(player, totalCosts.Values.ToArray())); }