Dentosal / python-sc2

A StarCraft II bot api client library for Python 3
MIT License
587 stars 182 forks source link

"AssertionError: Units object is empty" if all minerals have been mined #268

Open Saloshp opened 5 years ago

Saloshp commented 5 years ago

https://github.com/Dentosal/python-sc2/blob/caf05aeee2e62c8e30279081ac46e630305117a8/sc2/bot_ai.py#L275

When no more mineral fields are left, an assertion exception is thrown

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/sc2/main.py", line 144, in _play_game_ai
    await ai.on_step(iteration)
  File "./main.py", line 500, in on_step
    await self.distribute_workers()
  File "/usr/local/lib/python3.7/site-packages/sc2/bot_ai.py", line 276, in distribute_workers
    mf = self.state.mineral_field.closest_to(idle_worker)
  File "/usr/local/lib/python3.7/site-packages/sc2/units.py", line 163, in closest_to
    assert self, "Units object is empty"
AssertionError: Units object is empty
tweakimp commented 5 years ago

thank you for this report. the distribute workers function is far from optimal and mostly just to get you started without having to worry about worker micro when you start to write a bot

if you want to have something that is more polished, you will have to write your own function for this i will change this to be safe for lategame scenarios with no minerals left, but keep in mind that this function is not perfect and never will be.

tweakimp commented 5 years ago

Fixed in https://github.com/Dentosal/python-sc2/pull/270