def get_worker(self, position: Point2): worker: Unit = None if self.builder_tag is None: if self.knowledge.my_race == Race.Protoss: builders: Units = self.knowledge.roles.all_from_task(UnitTask.Building)\ .filter(lambda w: not w.has_buff(BuffId.ORACLESTASISTRAPTARGET)) if builders: closest = None best_distance = 0 for builder in builders: # type: Unit if len(builder.orders) == 1: order: UnitOrder = builder.orders[0] if order.target is Point2: distance = position.distance_to_point2(order.target) else: distance = position.distance_to_point2(builder.position) if distance < 10 and (closest is None or distance < best_distance): best_distance = distance closest = builder worker = closest if worker is None: free_workers = self.knowledge.roles.free_workers\ .filter(lambda w: not w.has_buff(BuffId.ORACLESTASISTRAPTARGET)) if self.knowledge.my_race == Race.Terran: free_workers = free_workers.filter(lambda u: not self.has_build_order(u)) if free_workers.exists: worker = free_workers.closest_to(position) else: worker: Unit = self.cache.by_tag(self.builder_tag) if worker is None or worker.is_constructing_scv: # Worker is probably dead or it is already building something else. self.builder_tag = None return worker
def fill_circle(cell: GridArea, point: Point2) -> GridArea: if (cell.Area == BuildArea.Empty and height == self.ai.get_terrain_height(point) and point.distance_to_point2(center) <= zone.radius): cell.ZoneIndex = zone_type return cell
def find_low_inside_air(self, start: Point2, target: Point2, distance: float) -> Point2: result = self.map.find_low_inside_walk(MapType.Air, start, target, distance) result = result[0] # strip distance end_point = Point2((result[0], result[1])) result_distance = target.distance_to_point2(end_point) if result_distance > distance: # Shorten result to be in range for the target vector = end_point - target normal_vector = point_normalize(vector) end_point = normal_vector * distance + target return end_point