Rewrite to Go: engine, plugin system, D2R plugin, API, loot filter
This commit is contained in:
parent
e0282a7111
commit
3b363192f2
60 changed files with 1576 additions and 3407 deletions
135
plugins/d2r/routines/mephisto.go
Normal file
135
plugins/d2r/routines/mephisto.go
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
// Mephisto farming routine for D2R.
|
||||
//
|
||||
// Classic MF run: Create game → WP to Durance 2 → Teleport to Durance 3 →
|
||||
// Moat trick Mephisto → Loot → TP to town → Stash → Exit → Repeat
|
||||
package mephisto
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"sync"
|
||||
|
||||
"git.cloonar.com/openclawd/iso-bot/pkg/plugin"
|
||||
)
|
||||
|
||||
// Phase represents the current phase of a Mephisto run.
|
||||
type Phase string
|
||||
|
||||
const (
|
||||
PhaseCreateGame Phase = "create_game"
|
||||
PhaseTeleport Phase = "teleport_to_durance"
|
||||
PhaseFindBoss Phase = "find_mephisto"
|
||||
PhaseKill Phase = "kill"
|
||||
PhaseLoot Phase = "loot"
|
||||
PhaseTownPortal Phase = "town_portal"
|
||||
PhaseStash Phase = "stash"
|
||||
PhaseExitGame Phase = "exit_game"
|
||||
)
|
||||
|
||||
// Routine implements plugin.Routine for Mephisto runs.
|
||||
type Routine struct {
|
||||
mu sync.RWMutex
|
||||
services plugin.EngineServices
|
||||
phase Phase
|
||||
runCount int
|
||||
}
|
||||
|
||||
// New creates a Mephisto routine.
|
||||
func New(services plugin.EngineServices) *Routine {
|
||||
return &Routine{services: services}
|
||||
}
|
||||
|
||||
// Name returns the routine name.
|
||||
func (r *Routine) Name() string { return "Mephisto" }
|
||||
|
||||
// Phase returns current phase for status display.
|
||||
func (r *Routine) Phase() string {
|
||||
r.mu.RLock()
|
||||
defer r.mu.RUnlock()
|
||||
return string(r.phase)
|
||||
}
|
||||
|
||||
// Run executes one Mephisto run.
|
||||
func (r *Routine) Run(ctx context.Context) error {
|
||||
phases := []struct {
|
||||
phase Phase
|
||||
handler func(ctx context.Context) error
|
||||
}{
|
||||
{PhaseCreateGame, r.createGame},
|
||||
{PhaseTeleport, r.teleportToDurance},
|
||||
{PhaseFindBoss, r.findMephisto},
|
||||
{PhaseKill, r.killMephisto},
|
||||
{PhaseLoot, r.lootItems},
|
||||
{PhaseTownPortal, r.townPortal},
|
||||
{PhaseStash, r.stashItems},
|
||||
{PhaseExitGame, r.exitGame},
|
||||
}
|
||||
|
||||
for _, p := range phases {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return ctx.Err()
|
||||
default:
|
||||
}
|
||||
|
||||
r.mu.Lock()
|
||||
r.phase = p.phase
|
||||
r.mu.Unlock()
|
||||
|
||||
r.services.Log("info", fmt.Sprintf("Phase: %s", p.phase))
|
||||
|
||||
if err := p.handler(ctx); err != nil {
|
||||
return fmt.Errorf("phase %s failed: %w", p.phase, err)
|
||||
}
|
||||
|
||||
r.services.Wait()
|
||||
}
|
||||
|
||||
r.mu.Lock()
|
||||
r.runCount++
|
||||
r.mu.Unlock()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *Routine) createGame(ctx context.Context) error {
|
||||
// TODO: Navigate lobby → create game with randomized name
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *Routine) teleportToDurance(ctx context.Context) error {
|
||||
// TODO: Open WP → Durance of Hate 2 → teleport to level 3 entrance
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *Routine) findMephisto(ctx context.Context) error {
|
||||
// TODO: Teleport around Durance 3 to find Mephisto
|
||||
// Position for moat trick (safe spot across the moat)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *Routine) killMephisto(ctx context.Context) error {
|
||||
// TODO: Cast offensive spells from moat trick position
|
||||
// Monitor health, use potions if needed
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *Routine) lootItems(ctx context.Context) error {
|
||||
// TODO: Teleport to body, detect items, pick up per loot filter
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *Routine) townPortal(ctx context.Context) error {
|
||||
// TODO: Cast TP, click portal to go to town
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *Routine) stashItems(ctx context.Context) error {
|
||||
// TODO: If inventory has items worth stashing, open stash and transfer
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *Routine) exitGame(ctx context.Context) error {
|
||||
// TODO: ESC → Save & Exit
|
||||
return nil
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue