コード例 #1
0
        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);
        }
コード例 #2
0
ファイル: AIPlayer.cs プロジェクト: axx0/Civ2-clone
 public void NotifyImprovementEnabled(TerrainImprovement improvement, int level)
 {
 }