diff --git a/src/ares/behaviors/macro/build_structure.py b/src/ares/behaviors/macro/build_structure.py index 62e8ec2..f463811 100644 --- a/src/ares/behaviors/macro/build_structure.py +++ b/src/ares/behaviors/macro/build_structure.py @@ -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 @@ -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 @@ -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) @@ -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 diff --git a/src/ares/consts.py b/src/ares/consts.py index 89f7257..1da28e3 100644 --- a/src/ares/consts.py +++ b/src/ares/consts.py @@ -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" diff --git a/src/ares/managers/placement_manager.py b/src/ares/managers/placement_manager.py index 761a833..4a46004 100644 --- a/src/ares/managers/placement_manager.py +++ b/src/ares/managers/placement_manager.py @@ -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, @@ -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, @@ -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)