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