mud/src/mudlib/commands/snapneck.py

100 lines
2.8 KiB
Python

"""Snap neck finisher command."""
from mudlib.combat.engine import end_encounter, get_encounter
from mudlib.commands import CommandDefinition, register
from mudlib.player import Player, players
DEATH_PL = -100.0
async def cmd_snap_neck(player: Player, args: str) -> None:
"""Snap the neck of an unconscious target.
Args:
player: The player executing the command
args: Target name
"""
# Get encounter
encounter = get_encounter(player)
if encounter is None:
await player.send("You're not in combat.\r\n")
return
# Parse target
target_name = args.strip()
if not target_name:
await player.send("Snap whose neck?\r\n")
return
# Find target
target = players.get(target_name)
if target is None and player.location is not None:
from mudlib.mobs import get_nearby_mob
from mudlib.zone import Zone
if isinstance(player.location, Zone):
target = get_nearby_mob(target_name, player.x, player.y, player.location)
if target is None:
await player.send(f"You don't see {target_name} here.\r\n")
return
# Verify target is in the encounter
if encounter.attacker is not player and encounter.defender is not player:
await player.send("You're not in combat with that target.\r\n")
return
if encounter.attacker is not target and encounter.defender is not target:
await player.send("You're not in combat with that target.\r\n")
return
# Check if target is unconscious
if target.posture != "unconscious":
await player.send(f"{target.name} is not unconscious.\r\n")
return
# Execute the finisher
target.pl = DEATH_PL
# Send dramatic messages
await player.send(f"You snap {target.name}'s neck!\r\n")
await target.send(f"{player.name} snaps your neck!\r\n")
# Send GMCP vitals update (only for Players)
from mudlib.entity import Mob
from mudlib.gmcp import send_char_vitals
if not isinstance(target, Mob):
send_char_vitals(target)
# Handle mob despawn
if isinstance(target, Mob):
from mudlib.mobs import despawn_mob
despawn_mob(target)
# Pop combat mode from both entities if they're Players
from mudlib.gmcp import send_char_status
if isinstance(player, Player) and player.mode == "combat":
player.mode_stack.pop()
send_char_status(player)
if isinstance(target, Player) and target.mode == "combat":
target.mode_stack.pop()
send_char_status(target)
# End the encounter
end_encounter(encounter)
# Register command
register(
CommandDefinition(
name="snapneck",
handler=cmd_snap_neck,
aliases=["sn"],
mode="*",
help="Snap the neck of an unconscious opponent (instant kill)",
)
)