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); } } }