public List <Unit> CheckConstruction(Tile tile, TerrainImprovement improvement) { var units = tile.UnitsHere.Where(u => u.Building == improvement.Id).ToList(); if (units.Count <= 0) { return(units); } var terrain = improvement.AllowedTerrains[tile.Z].FirstOrDefault(t => t.TerrainType == (int)tile.Type); var existingImprovement = tile.Improvements.FirstOrDefault(i => i.Improvement == improvement.Id); if (terrain == null || (improvement.Negative && existingImprovement == null) || (existingImprovement?.Level == improvement.Levels.Count - 1)) { //If improvement has become invalid for terrain then return the units to the user units.ForEach(u => { u.Counter = 0; u.Order = OrderType.NoOrders; u.Building = 0; }); return(units); } int levelToBuild; if (existingImprovement != null) { if (!improvement.Negative) { levelToBuild = existingImprovement.Level; } else { levelToBuild = existingImprovement.Level + 1; } } else { levelToBuild = 0; } var progress = units.Sum(u => u.Counter); var cost = terrain.BuildTime; if (tile.River) { var river = improvement.AllowedTerrains[tile.Z] .FirstOrDefault(t => t.TerrainType == TerrainConstants.River); if (river != null) { cost += river.BuildTime; } } if (improvement.Levels[levelToBuild].BuildCostMultiplier != 0) { cost += cost * improvement.Levels[levelToBuild].BuildCostMultiplier / 100; } if (progress < cost) { return(new List <Unit>()); } if (improvement.Negative) { tile.RemoveImprovement(improvement, levelToBuild); } else { tile.CompleteConstruction(improvement, terrain, levelToBuild, Rules.Terrains[tile.Z]); } units.ForEach(u => { u.Counter = 0; u.Order = OrderType.NoOrders; u.Building = 0; }); var tiles = new List <Tile> { tile }; tiles.AddRange(tile.Map.Neighbours(tile)); TriggerMapEvent(MapEventType.UpdateMap, tiles); return(units); }
public void NotifyImprovementEnabled(TerrainImprovement improvement, int level) { }