public ImprovementOrder(TerrainImprovement improvement, Main main, Game game) : base(main,
                                                                                      ParseShortCut(improvement.Shortcut),
                                                                                      TerrainImprovementFunctions.LabelFrom(improvement.Levels[0]), 0)
 {
     _improvement = improvement;
     _game        = game;
 }
Exemple #2
0
 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;
 }
Exemple #3
0
        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 })
Exemple #4
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 })
Exemple #5
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;
            }
        }
Exemple #6
0
        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 })