diff options
Diffstat (limited to 'internal/game/cmd_move.go')
| -rw-r--r-- | internal/game/cmd_move.go | 53 |
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) } |
