Beispiel #1
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
                });
            }
        }
Beispiel #2
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 })
Beispiel #3
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 })