How Dogtato Turned Map Healing Shrines Into a Bot Advantage Almost Nobody Uses

@chad walked through how Botato uses Xel’Naga healing shrines on Torches and Persephone — map-specific features that most bots completely ignore. By modifying the retreat destination function to route injured units to nearby shrines and adding a “stay until full health” check in the micro layer, Botato preserves army value for free. We also covered no-fly zone detection (you can’t — hard-code it), speed zones, and a general pattern for centralizing all map-specific logic in one class.

Key Takeaways:

  • :world_map: Map-specific features like healing shrines, no-fly zones, and speed zones exist in the game data under destructibles — but no-fly zones aren’t exposed by the API at all, so you have to hard-code them by map name
  • :hospital: Healing shrines heal for 10 per tick with a radius of ~2.5, and they heal everything — shields, mechanical units, biological units. A unit at low health can be fully restored in seconds
  • :bullseye: The implementation is straightforward: modify your retreat destination function to check for a nearby shrine (distance 20), then add a “stay on shrine” check in your individual unit micro (distance 5, below 100% health = don’t leave)
  • :crossed_swords: Protoss benefits the most since they have no other healing mechanism — retreating Stalkers to a shrine instead of just regenerating shields at base is a significant value preserve. Terran saves money on medivacs. Zerg gets the least since they already heal for free
  • :prohibited: No-fly zones are invisible to the API — they’re under the pathing tab in the map editor, not as entities. The only way to detect them is to hard-code by map name. A centralized map-specifics class keeps this manageable
  • :dashing_away: Speed zones have limited bot utility — they mostly serve air harassment routes, which are hard to code for. The no-fly zone on Persephone was likely placed specifically to prevent abusive speed zone + healing shrine combos
  • :crystal_ball: Burrowed units that don’t move are truly invisible to the API — no shimmer, no data. The only detection method is checking if you can’t build or land on a tile, which triggers a “can’t build” error you can use to call for detection