Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions src/ares/behaviors/macro/build_structure.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from typing import TYPE_CHECKING

from cython_extensions.geometry import cy_distance_to_squared
from loguru import logger
from sc2.data import Race
from sc2.ids.unit_typeid import UnitTypeId as UnitID
from sc2.position import Point2
Expand All @@ -13,6 +14,7 @@
from ares import AresBot

from ares.behaviors.macro.macro_behavior import MacroBehavior
from ares.consts import BUILDING_SIZE_ENUM_TO_RADIUS
from ares.managers.manager_mediator import ManagerMediator


Expand Down Expand Up @@ -91,6 +93,13 @@ class BuildStructure(MacroBehavior):
reaper_wall: bool = False

def execute(self, ai: "AresBot", config: dict, mediator: ManagerMediator) -> bool:
if self.structure_id not in STRUCTURE_TO_BUILDING_SIZE:
logger.error(
f"Invalid structure type passed to `BuildStructure`: "
f"{self.structure_id}"
)
return False

# already enough workers on route to build this
if (
ai.not_started_but_in_building_tracker(self.structure_id)
Expand Down Expand Up @@ -167,11 +176,13 @@ def _enough_existing_at_this_base(self, mediator: ManagerMediator) -> bool:
if not potential_placements[placement]["available"]
]
num_structures: int = 0
radius_sq: float = BUILDING_SIZE_ENUM_TO_RADIUS[size] ** 2
structures_dict = mediator.get_own_structures_dict
for t in taken:
if [
s
for s in mediator.get_own_structures_dict[self.structure_id]
if cy_distance_to_squared(s.position, t) < 9.0
for s in structures_dict[self.structure_id]
if cy_distance_to_squared(s.position, t) < radius_sq
]:
num_structures += 1
return num_structures >= self.to_count_per_base
7 changes: 7 additions & 0 deletions src/ares/consts.py
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,13 @@ class BuildingSize(str, Enum):
TWO_BY_TWO = "TWO_BY_TWO"


BUILDING_SIZE_ENUM_TO_RADIUS: dict[BuildingSize, float] = {
BuildingSize.FIVE_BY_FIVE: 2.5,
BuildingSize.THREE_BY_THREE: 1.5,
BuildingSize.TWO_BY_TWO: 1.0,
}


class BuildOrderOptions(str, Enum):
ADDONSWAP = "ADDONSWAP"
CANCEL_GAS = "CANCEL_GAS"
Expand Down
8 changes: 2 additions & 6 deletions src/ares/managers/placement_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
from ares.config_parser import ConfigParser
from ares.consts import (
BUILDING_PLACEMENTS,
BUILDING_SIZE_ENUM_TO_RADIUS,
DEBUG,
DEBUG_OPTIONS,
GAS_BUILDINGS,
Expand Down Expand Up @@ -84,11 +85,6 @@ class PlacementManager(Manager, IManagerMediator):
BuildingSize.THREE_BY_THREE: (3, 3),
BuildingSize.TWO_BY_TWO: (2, 2),
}
BUILDING_SIZE_ENUM_TO_RADIUS: dict[BuildingSize, float] = {
BuildingSize.FIVE_BY_FIVE: 2.5,
BuildingSize.THREE_BY_THREE: 1.5,
BuildingSize.TWO_BY_TWO: 1.0,
}
SKIP_CREEP_CHECK_IDS: set[UnitID] = {UnitID.HATCHERY, UnitID.NYDUSCANAL}
UNBUILDABLES: set[UnitID] = {
UnitID.UNBUILDABLEPLATESDESTRUCTIBLE,
Expand Down Expand Up @@ -293,7 +289,7 @@ def can_place_structure(
return len(existing_gas_buildings) == 0

size: BuildingSize = STRUCTURE_TO_BUILDING_SIZE[structure_type]
offset: float = self.BUILDING_SIZE_ENUM_TO_RADIUS[size]
offset: float = BUILDING_SIZE_ENUM_TO_RADIUS[size]
origin_x: int = round(position[0] - offset)
origin_y: int = round(position[1] - offset)

Expand Down
Loading