aboutsummaryrefslogtreecommitdiff
path: root/internal/game/combat_mob.go
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-07-17 18:36:31 -0400
committerhistoria <[not public]>2026-07-17 18:36:31 -0400
commite6d0d46ac9977e77c7f19f41121ec466a3c53e56 (patch)
tree86063e0dfda2206ccdda1b8e1070dc4da7dea9d9 /internal/game/combat_mob.go
parent6e6c4a157564100249bb58f412485055bb2d10cf (diff)
downloadthehouseoficarus-e6d0d46ac9977e77c7f19f41121ec466a3c53e56.tar.gz
feat: update mob flee mechanics with new energy system
Diffstat (limited to 'internal/game/combat_mob.go')
-rw-r--r--internal/game/combat_mob.go38
1 files changed, 34 insertions, 4 deletions
diff --git a/internal/game/combat_mob.go b/internal/game/combat_mob.go
index 7768432..8b7d869 100644
--- a/internal/game/combat_mob.go
+++ b/internal/game/combat_mob.go
@@ -87,7 +87,7 @@ func (g *Game) mobAttack(sess *net.Session, p *player.Player, mob *world.MobInst
if combat.HitCheck(attRoll, defRoll) {
g.applyMobHit(sess, p, mob, attackType, maxHit)
} else {
- g.applyMobMiss(sess, mob)
+ g.applyMobMiss(sess, p, mob)
}
}
@@ -168,8 +168,9 @@ func (g *Game) applyMobHit(sess *net.Session, p *player.Player, mob *world.MobIn
sess.WriteLine(g.colorize(sess, "error", "You're hit while repositioning! You failed to hide."))
}
- if p.MoveTicks > 0 {
- p.ClearMoveState()
+ if p.EscapeDir != "" {
+ p.ClearEscape()
+ p.WalkSequence = nil
sess.WriteLine("Can't escape!")
}
@@ -195,9 +196,13 @@ func padCombatPrefix(prefix, plainSelf, plainOther string) string {
return prefix
}
-func (g *Game) applyMobMiss(sess *net.Session, mob *world.MobInstance) {
+func (g *Game) applyMobMiss(sess *net.Session, p *player.Player, mob *world.MobInstance) {
attacker := mobDisplayNameCap(mob, true)
sess.WriteLine(g.colorize(sess, "miss", fmt.Sprintf("%s misses you.", attacker)))
+
+ if p.EscapeDir != "" {
+ g.beginEscapeMove(sess, p)
+ }
}
func (g *Game) endCombat(sess *net.Session, p *player.Player, mob *world.MobInstance) {
@@ -223,6 +228,12 @@ func (g *Game) endCombat(sess *net.Session, p *player.Player, mob *world.MobInst
// the player currently has that item equipped in a weapon-hand slot.
g.runTrigger(sess, p, mob.OnKill, p.RoomID, p.IsWielding, false)
g.scheduleMobRespawn(mob)
+
+ if p.EscapeDir != "" {
+ g.beginEscapeMove(sess, p)
+ return
+ }
+
g.writePrompt(sess)
}
@@ -402,3 +413,22 @@ func (g *Game) awardCombatXP(sess *net.Session, p *player.Player, dmg int, isRan
func (g *Game) stopCombat(playerName string) {
g.Combat.Leave(playerName)
}
+
+// beginEscapeMove starts the actual movement after the escape gate (a mob miss
+// or mob death) has fired. It copies the stashed Escape* fields into the Move*
+// fields, recomputes moveTicks, and either sets MoveTicks for the normal
+// 1-2 tick run-delay or calls completeMove instantly for 0-tick gear.
+func (g *Game) beginEscapeMove(sess *net.Session, p *player.Player) {
+ p.MoveDirection = p.EscapeDir
+ p.MoveTarget = p.EscapeTarget
+ p.MovePendingTrigger = p.EscapeTrigger
+ isWalk := p.EscapeIsWalk
+ p.ClearEscape()
+
+ ticks := g.moveTicks(p, isWalk)
+ if ticks <= 0 {
+ g.completeMove(sess, p)
+ return
+ }
+ p.MoveTicks = ticks
+}