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:")