iso-bot/games/d2r/routines/countess.py

84 lines
2.4 KiB
Python

"""Countess farming routine for D2R.
Rune farming: Create game → Black Marsh WP → Tower Cellar →
Kill Countess → Loot runes → Exit → Repeat
"""
import logging
from enum import Enum, auto
logger = logging.getLogger(__name__)
class CountessPhase(Enum):
CREATE_GAME = auto()
WAYPOINT_TO_MARSH = auto()
FIND_TOWER = auto()
NAVIGATE_CELLAR = auto()
KILL_COUNTESS = auto()
LOOT = auto()
EXIT_GAME = auto()
class CountessRoutine:
"""Automated Countess farming for rune drops.
Best route for mid-tier rune farming (up to Ist).
Requires navigating 5 tower cellar levels.
"""
def __init__(self, bot):
self.bot = bot
self.phase = CountessPhase.CREATE_GAME
self.run_count = 0
def execute_run(self) -> bool:
"""Execute a single Countess run."""
logger.info(f"Starting Countess run #{self.run_count + 1}")
phases = [
(CountessPhase.CREATE_GAME, self._create_game),
(CountessPhase.WAYPOINT_TO_MARSH, self._go_to_marsh),
(CountessPhase.FIND_TOWER, self._find_tower),
(CountessPhase.NAVIGATE_CELLAR, self._navigate_cellar),
(CountessPhase.KILL_COUNTESS, self._kill_countess),
(CountessPhase.LOOT, self._loot_runes),
(CountessPhase.EXIT_GAME, self._exit_game),
]
for phase, handler in phases:
self.phase = phase
if not handler():
return False
self.bot.humanizer.wait()
self.run_count += 1
return True
def _create_game(self) -> bool:
return True
def _go_to_marsh(self) -> bool:
"""Take waypoint to Black Marsh."""
return True
def _find_tower(self) -> bool:
"""Navigate from Black Marsh to Forgotten Tower entrance."""
# TODO: This is the hardest part — tower location is random
return True
def _navigate_cellar(self) -> bool:
"""Navigate through 5 cellar levels to level 5."""
# TODO: Find stairs on each level, descend
return True
def _kill_countess(self) -> bool:
"""Kill the Countess."""
return True
def _loot_runes(self) -> bool:
"""Pick up rune drops (Countess has special rune drop table)."""
return True
def _exit_game(self) -> bool:
return True