public ImprovementOrder(TerrainImprovement improvement, Main main, Game game) : base(main, ParseShortCut(improvement.Shortcut), TerrainImprovementFunctions.LabelFrom(improvement.Levels[0]), 0) { _improvement = improvement; _game = game; }
public ImprovementOrder(TerrainImprovement improvement, Main main, Game game, MenuElement menuElement) : base(main, ParseShortCut(improvement.Shortcut), menuElement?.MenuText ?? TerrainImprovementFunctions.LabelFrom(improvement.Levels[0]), improvement.MenuGroup) { _improvement = improvement; _game = game; }
public static void BuildEffects(this Tile tile, TerrainImprovement improvement, AllowedTerrain terrain, int levelToBuild) { tile.EffectsList.RemoveAll(e => e.Source == improvement.Id); tile.EffectsList.AddRange(improvement.Levels .Take(levelToBuild + 1) .SelectMany((levelData, levelNo) => levelData.Effects?.Select(e => new ActiveEffect(e, improvement.Id, levelNo)) ?? Enumerable.Empty <ActiveEffect>())); if (terrain.Effects is { Count : > 0 })
public static void CompleteConstruction(this Tile tile, TerrainImprovement improvement, AllowedTerrain terrain, int levelToBuild, Terrain[] terrains) { var Improvements = tile.Improvements; if (improvement.ExclusiveGroup > 0) { var previous = Improvements .Where(i => i.Improvement != improvement.Id && i.Group == improvement.ExclusiveGroup).ToList(); previous.ForEach(i => { tile.EffectsList.RemoveAll(e => e.Source == i.Improvement); Improvements.Remove(i); }); } var transformEffect = terrain.Effects?.FirstOrDefault(e => e.Target == ImprovementConstants.Transform); if (transformEffect != null) { tile.Terrain = terrains[transformEffect.Value]; return; } if (levelToBuild > 0) { var imp = Improvements.FirstOrDefault(i => i.Improvement == improvement.Id); if (imp != null) { imp.Level = levelToBuild; if (improvement.Levels[levelToBuild].Effects?.Count > 0) { tile.EffectsList.AddRange(improvement.Levels[levelToBuild].Effects.Select(e => new ActiveEffect { Target = e.Target, Action = e.Action, Value = e.Value, Source = improvement.Id, Level = levelToBuild })); } return; } } if (improvement.Levels[levelToBuild].Effects?.Count > 0) { tile.EffectsList.AddRange(improvement.Levels[levelToBuild].Effects.Select(e => new ActiveEffect { Target = e.Target, Action = e.Action, Value = e.Value, Source = improvement.Id, Level = 0 })); } if (terrain.Effects is { Count : > 0 })
public static void RemoveImprovement(this Tile tile, TerrainImprovement improvement, int levelToRemove) { var built = tile.Improvements.FirstOrDefault(i => i.Improvement == improvement.Id); if (built == null || built.Level < levelToRemove) { return; } tile.EffectsList.RemoveAll(i => i.Source == improvement.Id && i.Level >= levelToRemove); if (levelToRemove == 0) { tile.Improvements.Remove(built); } else { built.Level = levelToRemove - 1; } }
public static void AddImprovement(this Tile tile, TerrainImprovement improvement, AllowedTerrain terrain, int levelToBuild, Terrain[] terrains) { var Improvements = tile.Improvements; if (improvement.ExclusiveGroup > 0) { var previous = Improvements .Where(i => i.Improvement != improvement.Id && i.Group == improvement.ExclusiveGroup).ToList(); previous.ForEach(i => { tile.EffectsList.RemoveAll(e => e.Source == i.Improvement); Improvements.Remove(i); }); } var transformEffect = terrain.Effects?.FirstOrDefault(e => e.Target == ImprovementConstants.Transform); if (transformEffect != null) { tile.Terrain = terrains[transformEffect.Value]; return; } BuildEffects(tile, improvement, terrain, levelToBuild); var existing = Improvements.FirstOrDefault(i => i.Improvement == improvement.Id); if (existing is not null) { existing.Level = levelToBuild; } else { Improvements.Add(new ConstructedImprovement { Group = improvement.ExclusiveGroup, Improvement = improvement.Id, Level = levelToBuild }); } }
public static UnitActionAssessment CanImprovementBeBuiltHere(Tile location, TerrainImprovement improvement, Civilization civilization) { if (location.CityHere != null) { return(new UnitActionAssessment(false, errorPopup: "CANTDO")); } var alreadyBuilt = location.Improvements.FirstOrDefault(i => i.Improvement == improvement.Id); if (alreadyBuilt != null) { if (improvement.Negative) { return(new UnitActionAssessment(true, commandTitle: improvement.Levels[alreadyBuilt.Level].BuildLabel)); } if (alreadyBuilt.Level >= improvement.Levels.Count) { return(new UnitActionAssessment(false, errorPopup: improvement.MaxLevelReachedMessage)); } var nextLevel = improvement.Levels[alreadyBuilt.Level + 1]; if (nextLevel.RequiredTech != AdvancesConstants.Nil && !AdvanceFunctions.HasTech(civilization, nextLevel.RequiredTech)) { return(new UnitActionAssessment(false, nextLevel.BuildLabel, errorPopup: nextLevel.MissingRequiredTechMessage)); } return(new UnitActionAssessment(true, LabelFrom(nextLevel))); } if (improvement.Negative) { return(new UnitActionAssessment(false, errorPopup: improvement.MaxLevelReachedMessage)); } if (improvement.Levels[0].RequiredTech != AdvancesConstants.Nil && !AdvanceFunctions.HasTech(civilization, improvement.Levels[0].RequiredTech)) { return(new UnitActionAssessment(false, errorPopup: improvement.Levels[0].MissingRequiredTechMessage)); } var allowedTerrain = improvement.AllowedTerrains[location.Z] .FirstOrDefault(t => t.TerrainType == (int)location.Type); if (allowedTerrain == null) { return(new UnitActionAssessment(false, errorPopup: "CANTIMPROVE")); } if (location.River) { var riverAllowance = improvement.AllowedTerrains[location.Z] .FirstOrDefault(t => t.TerrainType == TerrainConstants.River); if (riverAllowance != null) { if (riverAllowance.RequiredTech != AdvancesConstants.Nil && !AdvanceFunctions.HasTech(civilization, riverAllowance.RequiredTech)) { return(new UnitActionAssessment(false, errorPopup: riverAllowance.MissingRequiredTechMessage)); } } } if (allowedTerrain.RequiredTech != AdvancesConstants.Nil && !AdvanceFunctions.HasTech(civilization, allowedTerrain.RequiredTech)) { return(new UnitActionAssessment(false, errorPopup: allowedTerrain.MissingRequiredTechMessage)); } var transform = allowedTerrain.Effects?.FirstOrDefault(e => e.Target == ImprovementConstants.Transform); if (transform != null) { return(new UnitActionAssessment(true, transform.Text)); } if (improvement.AdjacencyRules is { Count : > 0 })