diff options
| author | historia <[not public]> | 2026-07-08 01:22:38 -0400 |
|---|---|---|
| committer | historia <[not public]> | 2026-07-08 01:22:38 -0400 |
| commit | 71f0f381de64e045f91da19450adacf10fbc7902 (patch) | |
| tree | c567d665eed2e5d61aeae21bd6a75f280118d277 /internal/game/act_gather.go | |
| parent | 3682acf24575731deef587a19c940814ad8a9a81 (diff) | |
| download | thehouseoficarus-71f0f381de64e045f91da19450adacf10fbc7902.tar.gz | |
feat: multi-tool gather objects correctly handled. hide more irrelevant fishing fields.
Diffstat (limited to 'internal/game/act_gather.go')
| -rw-r--r-- | internal/game/act_gather.go | 76 |
1 files changed, 56 insertions, 20 deletions
diff --git a/internal/game/act_gather.go b/internal/game/act_gather.go index f7a63f6..8743a46 100644 --- a/internal/game/act_gather.go +++ b/internal/game/act_gather.go @@ -31,24 +31,6 @@ func (g *Game) startGather(sess *net.Session, p *player.Player, obj *object.Obje return } - skillLevel := p.Level(player.SkillName(cfg.Skill)) - - eligible := filterDropsByLevel(cfg.Drops, skillLevel) - if len(eligible) == 0 { - minLevel := 0 - for _, d := range cfg.Drops { - if d.Level > 0 && (minLevel == 0 || d.Level < minLevel) { - minLevel = d.Level - } - } - if minLevel > 0 { - sess.WriteLine(fmt.Sprintf("You need level %d %s to do that.", minLevel, cfg.Skill)) - } else { - sess.WriteLine("You are not skilled enough to do that.") - } - return - } - if st.Depleted { if cfg.DepletedMessage != "" { msg := cfg.DepletedMessage @@ -65,10 +47,10 @@ func (g *Game) startGather(sess *net.Session, p *player.Player, obj *object.Obje } var wait float64 - var toolName string + var toolName, toolType string if len(cfg.Tools) > 0 { - toolSpeed, name, found := g.findTool(p, cfg.Tools) + toolSpeed, name, tType, found := g.findTool(p, cfg.Tools) if !found { names := make([]string, len(cfg.Tools)) for i, t := range cfg.Tools { @@ -79,10 +61,43 @@ func (g *Game) startGather(sess *net.Session, p *player.Player, obj *object.Obje return } toolName = name + toolType = tType wait = toolSpeed if wait < 1 { wait = 1 } + } else { + wait = cfg.NoToolSpeed + if wait <= 0 { + wait = 3 + } + } + + skillLevel := p.Level(player.SkillName(cfg.Skill)) + + toolEligible := filterDropsByTool(cfg.Drops, toolType, len(cfg.Tools)) + eligible := filterDropsByLevel(toolEligible, skillLevel) + if len(eligible) == 0 { + if len(toolEligible) == 0 { + if len(cfg.Tools) > 0 { + sess.WriteLine("Your tool can't yield anything from this object.") + } else { + sess.WriteLine("Your skill can't yield anything from this object.") + } + } else { + minLevel := 0 + for _, d := range toolEligible { + if d.Level > 0 && (minLevel == 0 || d.Level < minLevel) { + minLevel = d.Level + } + } + if minLevel > 0 { + sess.WriteLine(fmt.Sprintf("You need level %d %s to do that.", minLevel, cfg.Skill)) + } else { + sess.WriteLine("You are not skilled enough to do that.") + } + } + return } if cfg.Bait != "" { @@ -120,6 +135,7 @@ func (g *Game) startGather(sess *net.Session, p *player.Player, obj *object.Obje Wait: wait, Verb: verb, ToolName: toolName, + ToolType: toolType, } if cfg.DepleteTimer > 0 { d.DepleteTimer = true @@ -198,6 +214,7 @@ func (g *Game) advanceGather(sess *net.Session, p *player.Player) { if rand.Float64() < chance { eligible := filterDropsByLevel(cfg.Drops, skillLevel) + eligible = filterDropsByTool(eligible, d.ToolType, len(cfg.Tools)) drop := behavior.ResolveDrop(g.DataDir, eligible) if drop != nil { freeSlot := p.FirstFreeSlot() @@ -321,6 +338,25 @@ func filterDropsByLevel(drops []behavior.DropEntry, level int) []behavior.DropEn return eligible } +func filterDropsByTool(drops []behavior.DropEntry, activeToolType string, toolCount int) []behavior.DropEntry { + if toolCount <= 1 { + out := make([]behavior.DropEntry, 0, len(drops)) + for _, d := range drops { + if d.Tool == "" || d.Tool == activeToolType { + out = append(out, d) + } + } + return out + } + out := make([]behavior.DropEntry, 0, len(drops)) + for _, d := range drops { + if d.Tool == activeToolType { + out = append(out, d) + } + } + return out +} + func (g *Game) depleteSharedTree(st *world.ObjState, cfg *behavior.GatherConfig, targetName string, playerNames []string) { st.Depleted = true st.DepleteTimer = float64(engine.ToTicks(cfg.RespawnTimer)) |
