hazelmud/typeclasses/encounter_handler.py

100 lines
3.3 KiB
Python

import random
from evennia import DefaultScript
# turn
# defend/dodge (if applicable)
# action(s)
# RP description
class EncounterHandler(DefaultScript):
"""
Implementation of the encounter handler.
"""
def at_script_creation(self):
# When initiating the encounter
self.key = f"encounter_handler_{random.randint(1, 1000)}"
self.db.characters = {}
self.db.turns = []
self.db.turn_index = 0
self.db.turn_energy = 1
def _init_character(self, character):
# Initializes the character for encounter
character.ndb.encounter_handler = self
character.apply_encounter_cmdset()
def _cleanup_character(self, character):
# De-initializes the character from encounters
dbref = character.id
del self.db.characters[dbref]
self.db.turns.remove(dbref)
del character.ndb.encounter_handler
character.revoke_encounter_cmdset()
def at_stop(self):
# When deinitializing
for character in list(self.db.characters.values()):
self._cleanup_character(character)
self.delete()
def add_character(self, character):
# Adds a character to the encounter
dbref = character.id
self.db.characters[dbref] = character
self.db.turns.append(dbref)
self._init_character(character)
def remove_character(self, character):
# Removes a character from the encounter
if character.id in self.db.characters:
self._cleanup_character(character)
if len(self.db.characters) == 1:
char = list(self.db.characters.values())[0]
char.msg("You are no longer in an encounter.")
self.at_stop()
elif not self.db.characters:
self.at_stop()
def msg_all(self, message):
# Sends text to all players in the encounter
for char in self.db.characters.values():
char.msg(message)
def msg_all_rich(self, text, obj):
for char in self.db.characters.values():
char.msg(text = text, from_obj = obj)
def can_act(self, cmd):
caller = cmd.caller
cmdname = cmd.key
energy = cmd.energy_cost
if self.db.turns[self.db.turn_index] == caller.id:
if self.db.turn_energy >= energy:
self.db.turn_energy -= energy
return True
else:
caller.msg("You do not have enough energy remaining")
caller.msg(f"You have: {self.db.turn_energy}, but need {energy}")
else:
self.pre_say(caller)
return False
def is_turn(self, char):
return self.db.turns[self.db.turn_index] == char.id
def pre_say(self, caller):
caller.msg("(It's not your turn yet!)")
caller.msg("(You can talk out-of-character using parentheses)")
def has_default_target(self, caller):
if (len(self.db.characters) == 2) and (caller in self.db.characters.values()):
keys = list(self.db.characters.keys())
return self.db.characters[keys[0] if keys[0] != caller.id else keys[1]]
return None
def next_turn(self):
self.db.turn_index = (self.db.turn_index + 1) % len(self.db.turns)
self.db.turn_energy = 1
self.db.characters[self.db.turns[self.db.turn_index]].msg("It is now your turn:")