100 lines
2.8 KiB
Python
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)",
|
|
)
|
|
)
|