From e05da913c4f5ec3ed979dd2cb7b2e8425f248e3b Mon Sep 17 00:00:00 2001 From: prosolis <5590409+prosolis@users.noreply.github.com> Date: Sun, 17 May 2026 16:20:10 -0700 Subject: [PATCH] H3: retire manual harvest commands MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removes !forage / !mine / !scavenge / !fish / !essence / !commune from the command surface. Typing one now returns a one-line deprecation DM pointing at the auto-harvest flow ("Harvest is automatic now — just walk."). The internal handleHarvestCmd / handleStandaloneHarvest paths are left in place; operator deletes after soak per plan §H3. Help text and the supplies-low autopilot pause line no longer mention the manual verbs. --- internal/plugin/adventure.go | 32 ++++++------------------ internal/plugin/adventure_render.go | 2 +- internal/plugin/dnd_expedition_cmd.go | 2 +- internal/plugin/dnd_r1_migration_test.go | 2 +- 4 files changed, 11 insertions(+), 27 deletions(-) diff --git a/internal/plugin/adventure.go b/internal/plugin/adventure.go index 5964784..6ed76c6 100644 --- a/internal/plugin/adventure.go +++ b/internal/plugin/adventure.go @@ -163,12 +163,6 @@ func (p *AdventurePlugin) Commands() []CommandDef { {Name: "cast", Description: "Cast a spell (queues for next combat, or resolves now if out of combat)", Usage: "!cast [--upcast N] [--target @user]", Category: "Games"}, {Name: "spells", Description: "List your known spells, prepared spells, and remaining casts", Usage: "!spells [learn ]", Category: "Games"}, {Name: "prepare", Description: "Cleric: prepare a spell for the day", Usage: "!prepare | !prepare clear ", Category: "Games"}, - {Name: "forage", Description: "Search your expedition region for plants, herbs, and tracks", Usage: "!forage", Category: "Games"}, - {Name: "mine", Description: "Dig or salvage stone, ore, and scrap in your expedition region", Usage: "!mine", Category: "Games"}, - {Name: "scavenge", Description: "Pick through your expedition region for left-behind valuables", Usage: "!scavenge", Category: "Games"}, - {Name: "essence", Description: "Pull magical essence from your expedition region", Usage: "!essence", Category: "Games"}, - {Name: "commune", Description: "Reach out to the spirits of your expedition region (Cleric specialty)", Usage: "!commune", Category: "Games"}, - {Name: "fish", Description: "Fish in your expedition region (water zones only)", Usage: "!fish", Category: "Games"}, {Name: "resources", Description: "List what's harvestable in your current expedition region", Usage: "!resources", Category: "Games"}, {Name: "explore", Description: "Autopilot: walk through expedition rooms until something needs your attention (fork, elite/boss, low HP/supplies)", Usage: "!explore", Category: "Games"}, {Name: "sell", Description: "Sell your hauled materials, fish, and items to Thom Krooke after an expedition (a smooth pitch can land a better price)", Usage: "!sell [list|all|]", Category: "Games"}, @@ -367,23 +361,13 @@ func (p *AdventurePlugin) OnMessage(ctx MessageContext) error { if p.IsCommand(ctx.Body, "explore") { return p.expeditionCmdRun(ctx) } - if p.IsCommand(ctx.Body, "forage") { - return p.handleHarvestCmd(ctx, HarvestForage) - } - if p.IsCommand(ctx.Body, "mine") { - return p.handleHarvestCmd(ctx, HarvestMine) - } - if p.IsCommand(ctx.Body, "scavenge") { - return p.handleHarvestCmd(ctx, HarvestScavenge) - } - if p.IsCommand(ctx.Body, "essence") { - return p.handleHarvestCmd(ctx, HarvestEssence) - } - if p.IsCommand(ctx.Body, "commune") { - return p.handleHarvestCmd(ctx, HarvestCommune) - } - if p.IsCommand(ctx.Body, "fish") { - return p.handleHarvestCmd(ctx, HarvestFish) + if p.IsCommand(ctx.Body, "forage") || + p.IsCommand(ctx.Body, "mine") || + p.IsCommand(ctx.Body, "scavenge") || + p.IsCommand(ctx.Body, "essence") || + p.IsCommand(ctx.Body, "commune") || + p.IsCommand(ctx.Body, "fish") { + return p.SendDM(ctx.Sender, "Harvest is automatic now — just walk. (`!expedition run` or `!zone advance`)") } if p.IsCommand(ctx.Body, "resources") { return p.handleResourcesCmd(ctx) @@ -1015,7 +999,7 @@ func renderLegacyActivityDeprecation(char *AdventureCharacter) string { sb.WriteString("Get started:\n") sb.WriteString("• `!expedition` — overview & open expeditions\n") sb.WriteString("• `!expedition start ` — begin a new run\n") - sb.WriteString("• `!forage` · `!mine` · `!scavenge` · `!fish` · `!essence` · `!commune` — harvest in cleared rooms\n") + sb.WriteString("• Harvest is automatic — yields land as you walk through cleared rooms.\n") sb.WriteString("• `!resources` — list nodes in your current room\n\n") sb.WriteString("Shop, blacksmith, rest, and Thom Krooke are still here on `!adventure`.") return sb.String() diff --git a/internal/plugin/adventure_render.go b/internal/plugin/adventure_render.go index 4652e8f..a5a97b1 100644 --- a/internal/plugin/adventure_render.go +++ b/internal/plugin/adventure_render.go @@ -375,7 +375,7 @@ func renderAdvMorningDM(userID id.UserID, equip map[EquipmentSlot]*AdvEquipment, sb.WriteString("**🗺️ Adventure** — head into a zone:\n") sb.WriteString("• `!expedition` — overview & open expeditions\n") sb.WriteString("• `!expedition start ` — begin a new run\n") - sb.WriteString("• `!forage` · `!mine` · `!scavenge` · `!fish` · `!essence` · `!commune` — harvest in cleared rooms\n") + sb.WriteString("• Harvest is automatic — yields land as you walk through cleared rooms.\n") sb.WriteString("\n") sb.WriteString("**🏘️ In town:**\n") diff --git a/internal/plugin/dnd_expedition_cmd.go b/internal/plugin/dnd_expedition_cmd.go index 9abe5cd..ba63c7c 100644 --- a/internal/plugin/dnd_expedition_cmd.go +++ b/internal/plugin/dnd_expedition_cmd.go @@ -728,7 +728,7 @@ func autopilotPreflight(userID id.UserID, exp *Expedition) (string, bool) { } if exp.Supplies.DailyBurn > 0 && exp.Supplies.Current < exp.Supplies.DailyBurn { return fmt.Sprintf( - "⏸ **Autopilot paused — supplies low** (%.1f / %.1f SU, under one day). `!extract` to bail, `!forage`, or `!expedition run` to push on.", + "⏸ **Autopilot paused — supplies low** (%.1f / %.1f SU, under one day). `!extract` to bail or `!expedition run` to push on.", exp.Supplies.Current, exp.Supplies.DailyBurn), true } return "", false diff --git a/internal/plugin/dnd_r1_migration_test.go b/internal/plugin/dnd_r1_migration_test.go index d0c6686..186fa5e 100644 --- a/internal/plugin/dnd_r1_migration_test.go +++ b/internal/plugin/dnd_r1_migration_test.go @@ -163,7 +163,7 @@ func TestIsLegacyActivityInput(t *testing.T) { // and the harvest entry-points so the user has somewhere to go. func TestRenderLegacyActivityDeprecation(t *testing.T) { out := renderLegacyActivityDeprecation(nil) - for _, want := range []string{"expedition", "!forage", "!mine", "retired"} { + for _, want := range []string{"expedition", "Harvest is automatic", "retired"} { if !strings.Contains(out, want) { t.Errorf("deprecation DM missing %q; got:\n%s", want, out) }