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 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 })