77 lines
1.9 KiB
Go
77 lines
1.9 KiB
Go
// 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
|
|
}
|