Пример #1
0
        private static void SetBuildUnitAction(Entity entity, Vec2Int approxTarget, EntityType buildUnit, int unitCost, Dictionary <int, EntityAction> entityActions)
        {
            Vec2Int?target      = null;
            int     minDistance = int.MaxValue;

            var neighbors = entity.Position.Neighbors(5);

            foreach (var position in neighbors)
            {
                if (ScoreMap.Passable(position))
                {
                    int distance = position.Distance(approxTarget);
                    if (distance < minDistance)
                    {
                        target      = position;
                        minDistance = distance;
                    }
                }
            }

            if (target != null)
            {
                var buildAction = new BuildAction(buildUnit, target.Value);
                entityActions.Add(entity.Id, new EntityAction(null, buildAction, null, null));

                ScoreMap.Build(target.Value, 1);
                ScoreMap.MyResource -= unitCost;
            }
        }
        public static void SetBuild(EntityType buildEntityType, int size, Dictionary <int, EntityAction> entityActions, DebugInterface debugInterface)
        {
            Entity? builder       = null;
            Vec2Int?buildPosition = null;
            int     minDistance   = int.MaxValue;

            foreach (Entity entity in ScoreMap.MyBuilderUnits)
            {
                if (entityActions.ContainsKey(entity.Id))
                {
                    continue;
                }

                var range = entity.Position.Range(10);
                if (range.Any(e => ScoreMap.Get(e).AllDamage > 0))
                {
                    continue;
                }

                if (buildEntityType == EntityType.Turret)
                {
                    if (range.Count(e => ScoreMap.Get(e).Entity?.EntityType == EntityType.Resource) < 25 ||
                        range.Any(e => ScoreMap.Get(e).Entity?.EntityType == EntityType.Turret))
                    {
                        continue;
                    }
                }

                if (buildEntityType == EntityType.House)
                {
                    var range2 = entity.Position.Range(5);
                    if (range2.Count(e => ScoreMap.Get(e).Entity?.EntityType == EntityType.BuilderUnit) == 0)
                    {
                        continue;
                    }
                }

                var buildPositions = entity.Position.BuildPositions(size);
                foreach (var position in buildPositions)
                {
                    if (buildEntityType == EntityType.RangedBase &&
                        position.X <= 15 &&
                        position.Y <= 15)
                    {
                        continue;
                    }

                    var diagonals = position.Diagonals(size);
                    if (ScoreMap.Passable(position, size) &&
                        diagonals.All(ScoreMap.PassableInFutureOrResource))
                    {
                        int distance = buildEntityType == EntityType.House
                            ? position.Distance(ScoreMap.MyHouseBase)
                            : position.Distance(ScoreMap.EnemyBase);

                        if (distance < minDistance)
                        {
                            builder       = entity;
                            buildPosition = position;
                            minDistance   = distance;
                        }
                    }
                }
            }

            if (buildEntityType == EntityType.House && builder == null && buildPosition == null)
            {
                foreach (Entity entity in ScoreMap.MyBuilderUnits)
                {
                    if (entityActions.ContainsKey(entity.Id))
                    {
                        continue;
                    }

                    var buildPositions = entity.Position.BuildPositions(size);
                    foreach (var position in buildPositions)
                    {
                        var diagonals = position.Diagonals(size);
                        if (ScoreMap.Passable(position, size) &&
                            diagonals.All(ScoreMap.PassableInFutureOrResource))
                        {
                            int distance = position.Distance(ScoreMap.MyHouseBase);
                            if (distance < minDistance)
                            {
                                builder       = entity;
                                buildPosition = position;
                                minDistance   = distance;
                            }
                        }
                    }
                }
            }

            if (builder != null && buildPosition != null)
            {
                var buildAction = new BuildAction(buildEntityType, buildPosition.Value);
                entityActions.Add(builder.Value.Id, new EntityAction(null, buildAction, null, null));

                ScoreMap.Build(buildPosition.Value, size);

                if (Params.IsDebug)
                {
                    MyStrategy.DrawRegion(buildPosition.Value.X, buildPosition.Value.Y, MyStrategy.Lemon, debugInterface);
                }
            }
        }