diff --git a/commands/encounter_cmdset.py b/commands/encounter_cmdset.py index a5ad2e1..38f6261 100644 --- a/commands/encounter_cmdset.py +++ b/commands/encounter_cmdset.py @@ -113,6 +113,7 @@ class CmdRP(EncounterCommand): "Free-form text input (for describing your actions in RP)" energy_cost = 0 key = "rp" + arg_regex = None aliases = [">"] help_category = "Encounter" @@ -131,11 +132,56 @@ class CmdFlee(EncounterCommand): super().handler().msg_all(f"{self.caller.key} left the encounter") super().handler().remove_character(self.caller) +class CmdOOC(EncounterCommand): + "Say something out-of-character" + energy_cost = 0 + key = "(" + arg_regex = None + + def func(self): + super().handler().msg_all(f"({self.caller}: {self.args.strip()})") + +class CmdPose(EncounterCommand): + """ + strike a pose + + Usage: + pose + pose's + + Example: + pose is standing by the wall, smiling. + -> others will see: + Tom is standing by the wall, smiling. + + Describe an action being taken. The pose text will + automatically begin with your name. + """ + key = "pose" + aliases = [":", "emote"] + locks = "cmd:all()" + arg_regex = None + energy_cost = 0 + def parse(self): + args = self.args + if args and not args[0] in ["'", ",", ":"]: + args = " %s" % args.strip() + self.args = args + def func(self): + if super().can_perform(): + if not self.args: + self.msg("What do you want to do?") + else: + msg = f"{self.caller.name}{self.args}" + super().handler().msg_all_rich((msg, {'type':'pose'}), self.caller) + class SetEncounterSpecial(CmdSet): def at_cmdset_creation(self): self.add(CmdPass) self.add(CmdRP) - self.add(CmdFlee) + self.add(CmdFlee) + self.add(CmdOOC) + self.add(CmdPose) # Encounter-related character commands @@ -144,7 +190,7 @@ class CmdEngage(Command): Initiates an encounter with the selected target """ key = "engage" - aliases = ["encounter"] + aliases = ["encounter", "fight"] def func(self): if not self.args: self.caller.msg("Usage: engage ") @@ -152,6 +198,9 @@ class CmdEngage(Command): target = self.caller.search(self.args) if not target: return + if target == self.caller: + self.caller.msg("You can't initiate an encounter with yourself!") + return if target.ndb.encounter_handler: target.ndb.encounter_handler.add_character(self.caller) target.ndb.encounter_handler.msg_all(f"{self.caller} joins the encounter") diff --git a/typeclasses/characters.py b/typeclasses/characters.py index 83c0ae0..8e73253 100644 --- a/typeclasses/characters.py +++ b/typeclasses/characters.py @@ -38,3 +38,12 @@ class Character(ClothedCharacter): return False return True + def at_pre_say(self, speech): + if self.ndb.encounter_handler: + if self.ndb.encounter_handler.is_turn(self): + self.ndb.encounter_handler.msg_all(f"{self} says, \"{speech}\"") + else: + self.ndb.encounter_handler.pre_say(self) + return None + else: + return speech diff --git a/typeclasses/encounter_handler.py b/typeclasses/encounter_handler.py index a3e5119..4c04901 100644 --- a/typeclasses/encounter_handler.py +++ b/typeclasses/encounter_handler.py @@ -13,8 +13,6 @@ class EncounterHandler(DefaultScript): def at_script_creation(self): # When initiating the encounter self.key = f"encounter_handler_{random.randint(1, 1000)}" - self.desc = "Handles an encounter" - self.persistent = True self.db.characters = {} self.db.turns = [] @@ -34,15 +32,11 @@ class EncounterHandler(DefaultScript): del character.ndb.encounter_handler character.revoke_encounter_cmdset() - def at_start(self): - # When initializing or rebooting - for character in self.db.characters.values(): - self._init_character(character) - def at_stop(self): - # When deinitializing or rebooting + # 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 @@ -58,16 +52,19 @@ class EncounterHandler(DefaultScript): if len(self.db.characters) == 1: char = list(self.db.characters.values())[0] char.msg("You are no longer in an encounter.") - self._cleanup_character(char) - self.stop() + self.at_stop() elif not self.db.characters: - self.stop() + 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 @@ -80,10 +77,16 @@ class EncounterHandler(DefaultScript): caller.msg("You do not have enough energy remaining") caller.msg(f"You have: {self.db.turn_energy}, but need {energy}") else: - caller.msg("(It's not your turn yet!)") - caller.msg("(You can talk out-of-character using parentheses)") + 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())