aboutsummaryrefslogtreecommitdiff
path: root/internal/game
diff options
context:
space:
mode:
Diffstat (limited to 'internal/game')
-rw-r--r--internal/game/act_gather.go76
-rw-r--r--internal/game/core_production.go10
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
}