diff options
Diffstat (limited to 'internal/game')
| -rw-r--r-- | internal/game/act_gather.go | 76 | ||||
| -rw-r--r-- | internal/game/core_production.go | 10 |
2 files changed, 61 insertions, 25 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)) diff --git a/internal/game/core_production.go b/internal/game/core_production.go index e88f512..192f8ec 100644 --- a/internal/game/core_production.go +++ b/internal/game/core_production.go @@ -6,13 +6,13 @@ import ( "thehouseoficarus/internal/player" ) -func (g *Game) findTool(p *player.Player, toolTypes []string) (toolSpeed float64, toolName string, found bool) { +func (g *Game) findTool(p *player.Player, toolTypes []string) (toolSpeed float64, toolName string, toolType string, found bool) { toolSpeed = -1 if itemID, ok := p.Equipment[item.SlotMainHand]; ok { if def, err := g.ItemStore.Load(itemID); err == nil { for _, t := range toolTypes { if def.ToolType() == t { - return def.ToolSpeed(), def.Name, true + return def.ToolSpeed(), def.Name, t, true } } } @@ -28,15 +28,15 @@ func (g *Game) findTool(p *player.Player, toolTypes []string) (toolSpeed float64 } for _, t := range toolTypes { if def.ToolType() == t { - return def.ToolSpeed(), def.Name, true + return def.ToolSpeed(), def.Name, t, true } } } - return -1, "", false + return -1, "", "", false } func (g *Game) hasToolType(p *player.Player, toolType string) bool { - _, _, found := g.findTool(p, []string{toolType}) + _, _, _, found := g.findTool(p, []string{toolType}) return found } |
