aboutsummaryrefslogtreecommitdiff
path: root/internal/game/act_gather.go
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-07-08 01:22:38 -0400
committerhistoria <[not public]>2026-07-08 01:22:38 -0400
commit71f0f381de64e045f91da19450adacf10fbc7902 (patch)
treec567d665eed2e5d61aeae21bd6a75f280118d277 /internal/game/act_gather.go
parent3682acf24575731deef587a19c940814ad8a9a81 (diff)
downloadthehouseoficarus-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.go76
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))