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
Exemple #2
0
        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
Exemple #3
0
    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