aboutsummaryrefslogtreecommitdiff
path: root/internal/game/cmd_move.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/game/cmd_move.go')
-rw-r--r--internal/game/cmd_move.go53
1 files changed, 14 insertions, 39 deletions
diff --git a/internal/game/cmd_move.go b/internal/game/cmd_move.go
index 2967e79..594ecd7 100644
--- a/internal/game/cmd_move.go
+++ b/internal/game/cmd_move.go
@@ -5,15 +5,13 @@ import (
"strings"
"thehouseoficarus/internal/behavior"
- "thehouseoficarus/internal/engine"
- "thehouseoficarus/internal/item"
"thehouseoficarus/internal/net"
"thehouseoficarus/internal/object"
"thehouseoficarus/internal/player"
"thehouseoficarus/internal/world"
)
-func (g *Game) doMove(sess *net.Session, dir string, multiplier float64) {
+func (g *Game) doMove(sess *net.Session, dir string, isWalk bool) {
p := sess.Player
exitDir := g.World.ResolveExit(dir)
if exitDir == "" {
@@ -81,7 +79,7 @@ func (g *Game) doMove(sess *net.Session, dir string, multiplier float64) {
g.cancelAction(p)
}
- ticks := g.moveTicks(p, multiplier)
+ ticks := g.moveTicks(p, isWalk)
p.MoveDirection = string(exitDir)
p.MoveTarget = targetID
@@ -90,6 +88,8 @@ func (g *Game) doMove(sess *net.Session, dir string, multiplier float64) {
return
}
+ // moveTicks already set p.MoveUsesEnergy based on this move; preserve it
+ // across the wait by leaving it set (ClearMoveState resets it on arrival).
p.MoveTicks = ticks
if inCombat && p.OptionBool("run_countdown") {
@@ -116,46 +116,21 @@ func (g *Game) matchExitTrigger(sess *net.Session, p *player.Player, exitDef wor
return nil
}
-var gracefulItems = map[string]bool{
- "graceful_hat": true,
- "graceful_torso": true,
- "graceful_legs": true,
- "graceful_gloves": true,
- "graceful_boots": true,
- "graceful_cape": true,
-}
-
-func (g *Game) moveTicks(p *player.Player, multiplier float64) int {
- if p.GodMode {
- return 0
- }
- if id, ok := p.Equipment[item.SlotBack]; ok && id == "cape_of_agility" {
- return 0
- }
-
- count := 0
- for _, id := range p.Equipment {
- if gracefulItems[id] {
- count++
- }
- }
-
- base := 2.0 - float64(count)*0.15
- if count == 6 {
- base -= 0.1
- }
-
- base *= multiplier
- return engine.ToTicks(base) - 1
-}
-
func (g *Game) completeMove(sess *net.Session, p *player.Player) {
exitDir := p.MoveDirection
targetID := p.MoveTarget
pendingTrigger := p.MovePendingTrigger
+ usesEnergy := p.MoveUsesEnergy
p.ClearMoveState()
+ // Drain one run energy point for moves that ran on energy (single moves
+ // with energy, or run-walks enabled by the full Graceful set). Cape of
+ // Agility and plain (non-full-set) walks never drain.
+ if usesEnergy && p.HasRunEnergy() {
+ p.RunEnergy--
+ }
+
if g.Combat.Get(p.Name) != nil {
g.stopCombat(p.Name)
}
@@ -242,7 +217,7 @@ func (g *Game) seedRoomMobs(roomID int) {
}
func (g *Game) executeMove(sess *net.Session, args []string, rawInput string) {
- g.doMove(sess, strings.TrimSpace(rawInput), 1.0)
+ g.doMove(sess, strings.TrimSpace(rawInput), false)
}
// handleDangerConfirm processes the [Y/n] reply to the dangerous-area warning.
@@ -270,7 +245,7 @@ func (g *Game) handleDangerConfirm(sess *net.Session, input string) {
g.writePrompt(sess)
return
}
- g.doMove(sess, dir, 1.0)
+ g.doMove(sess, dir, false)
g.writePrompt(sess)
}