100 lines
3.3 KiB
Python
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:")
|