Code Monkey home page Code Monkey logo

ares-sc2's Introduction

GitHub release (latest SemVer) Linting Testing Deploy Documentation

ares-sc2

Documentation

If you're interested in creating a bot with ares-sc2 we recommend following the instructions on the ares-sc2-starter-bot repo.

About

Ares-sc2 is a library that extends the capabilities of the python-sc2 framework. The fundamental principle driving the evolution of ares-sc2 is to empower users with full command over strategic decisions. Consequently, the library is designed to offer supportive functionalities for bot developers, avoiding preconceived choices out of the box. In fact when initiating a project with ares-sc2, it closely resembles starting with a blank python-sc2 bot! You can write standard python-sc2 logic and call upon ares functionality as required.

Features

  • Calculated production formation for every expansion location on game start for Terran and Protoss, use convenience behavior BuildStructure for easy usage.
from ares.behaviors.macro import BuildStructure
from sc2.ids.unit_typeid import UnitTypeId

self.register_behavior(
    BuildStructure(
        base_location=self.start_location,
        structure_id=UnitTypeId.BARRACKS
    )
)

formation

  • Curate custom combat maneuvers with our plug and play behavior system. Mix and match your own behaviors to truly create some unique play styles! Individual and Group behaviors are now available.
from ares import AresBot
from ares.behaviors.combat import CombatManeuver
from ares.behaviors.combat.individual import (
    DropCargo,
    KeepUnitSafe,
    PathUnitToTarget,
    PickUpCargo,
)
from sc2.unit import Unit
from sc2.units import Units
import numpy as np

class MyBot(AresBot):
    async def on_step(self, iteration: int) -> None:
        # retrieve medivac and mines_to_pickup and pass to method
        # left out here for clarity
        # mines would require their own behavior
        self.do_medivac_mine_drop(medivac, mines_to_pickup)

    def do_medivac_mine_drop(
            self, 
            medivac: Unit, 
            mines_to_pickup: Units
    ) -> None:
        # initialize a new CombatManeuver
        mine_drop: CombatManeuver = CombatManeuver()
        # get a grid for the medivac to path on
        air_grid: np.ndarray = self.mediator.get_air_grid
        # first priority is picking up units
        mine_drop.add(
            PickUpCargo(
                unit=medivac, 
                grid=air_grid, 
                pickup_targets=mines_to_pickup)
        )
        # if there is cargo, path to target and drop them off
        if medivac.has_cargo:
            # path
            mine_drop.add(
                PathUnitToTarget(
                    unit=medivac,
                    grid=air_grid,
                    target=self.enemy_start_locations[0],
                )
            )
            # drop off the mines
            mine_drop.add(
                DropCargo(unit=medivac, target=medivac.position)
            )
        # no cargo and no units to pick up, stay safe
        else:
            mine_drop.add(
                KeepUnitSafe(unit=medivac, grid=air_grid)
            )

        # finally register this maneuver to be executed
        self.register_behavior(mine_drop)
  • Convenient production management via SpawnController and ProductionController behaviors.

  • Fast cython alternatives to some common functionality, see the docs

  • MapAnalyzer library available and used throughout ares-sc2, access the library yourself via self.mediator.get_map_data_object

  • CombatSim helper method available via self.mediator.can_win_fight

  • Opt in Build runner system, easily curate new builds via a yml config file.

  • Use KDTree for fast distance checks on batches of units, example:

from ares.consts import UnitTreeQueryType

from sc2.ids.unit_typeid import UnitTypeId
from sc2.unit import Unit
from sc2.units import Units

reapers: list[Unit] = self.mediator.get_own_units_dict[UnitTypeId.REAPER]
all_ground_near_reapers: dict[int, Units] = self.mediator.get_units_in_range(
    start_points=reapers,
    distances=15,
    query_tree=UnitTreeQueryType.EnemyGround,
    return_as_dict=True,
)

for reaper in reapers:
    near_ground: Units = all_ground_near_reapers[reaper.tag]
  • ares-sc2 works quietly behind the scenes, yet at any moment access to a wealth of information is available via the mediator, some examples:

Retrieve a ground pathing grid already containing enemy influence:

grid: np.ndarray = self.mediator.get_ground_grid

Use this grid to make a pathing call:

move_to: Point2 = self.mediator.find_path_next_point(start=unit.position, target=self.target, grid=grid)

Optimally select a worker and assign a new UnitRole:

from ares.consts import UnitRole
from sc2.ids.unit_typeid import UnitTypeId
from sc2.units import Units

if worker := self.mediator.select_worker(target_position=self.main_base_ramp.top_center):
    self.mediator.assign_role(tag=worker.tag, role=UnitRole.DEFENDING)

# retrieve `UnitRole.DEFENDING` workers
defending_workers: Units = self.mediator.get_units_from_role(
    role=UnitRole.DEFENDING, unit_type=UnitTypeId.SCV
)

See Manager Mediator docs for all available methods.

Setting up ares-sc2

To setup a full development environment:

poetry install --with docs,lint,test,semver,notebook

To set up just the core packages to run an AresBot

poetry install

Try running the basic test bot, it will place a random race and speed mine with 12 workers:

poetry run python run.py

Install optional dependencies only as needed, for example:

poetry install --only docs

Contributing to the docs

It's possible to set up a lightweight environment that only sets up requirements for testing the documentation locally. As a prerequisite poetry should be installed on your system. pip install poetry is probably all you need in most instances.

  1. Fork and then Clone the repo git clone <repo-url>

  2. Setup environment and install docs requirements poetry install --only docs

  3. Run the documentation in a live local webserver poetry run mkdocs serve

  4. Visit http://127.0.0.1:8000/ using your favourite web browser.

  5. Edit .md files in the docs directory, and any saved changes will automatically be reloaded in your browser.

The documentation relies on the MkDocs library to generate the docs. To automatically generate API docs from code we use the mkdocstrings extension .

See mkdocs.yml file for settings and for configuring the navigation bars.

ares-sc2's People

Contributors

raspersc2 avatar actions-user avatar august-k avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.