// Game state detection for D2R. package d2r import ( "image" "git.cloonar.com/openclawd/iso-bot/pkg/plugin" ) // Detector implements plugin.GameDetector for D2R. type Detector struct { config Config } // NewDetector creates a D2R state detector. func NewDetector(config Config) *Detector { return &Detector{config: config} } // DetectState analyzes a screenshot and returns the current game state. func (d *Detector) DetectState(frame image.Image) plugin.GameState { // Priority-based detection: // 1. Check for loading screen // 2. Check for main menu // 3. Check for character select // 4. Check for in-game (health orb visible) // 5. Check for death screen if d.isLoading(frame) { return plugin.StateLoading } if d.isMainMenu(frame) { return plugin.StateMainMenu } if d.isCharacterSelect(frame) { return plugin.StateCharacterSelect } if d.isInGame(frame) { vitals := d.ReadVitals(frame) if vitals.HealthPct == 0 { return plugin.StateDead } return plugin.StateInGame } return plugin.StateUnknown } // ReadVitals reads health and mana from the orbs. func (d *Detector) ReadVitals(frame image.Image) plugin.VitalStats { // TODO: Analyze health/mana orb regions using color detection return plugin.VitalStats{} } // IsInGame returns true if health orb is visible. func (d *Detector) IsInGame(frame image.Image) bool { return d.isInGame(frame) } func (d *Detector) isLoading(frame image.Image) bool { // TODO: Check for loading screen (mostly black with loading bar) return false } func (d *Detector) isMainMenu(frame image.Image) bool { // TODO: Template match main menu elements return false } func (d *Detector) isCharacterSelect(frame image.Image) bool { // TODO: Template match character select screen return false } func (d *Detector) isInGame(frame image.Image) bool { // TODO: Check if health orb region contains red pixels return false }