diff --git a/commands/misc.py b/commands/misc.py index 6668484..4d6bac4 100755 --- a/commands/misc.py +++ b/commands/misc.py @@ -1,9 +1,11 @@ #!/usr/bin/env python -from .command import Command +from evennia.commands.default.muxcommand import MuxCommand from evennia import CmdSet from evennia.utils import logger +from .command import Command + class CmdKnock(Command): """ @@ -70,3 +72,56 @@ class CmdThrow(Command): class CmdSetStick(CmdSet): def at_cmdset_creation(self): self.add(CmdThrow) + + +class CmdLight(Command): + """ + Light something on fire, preferably a pipe. + + Usage: + + light [ object ] + """ + key = "light" + locks = "cmd:holds()" + + def func(self): + self.obj.do_light(self.caller) + + +class CmdSmoke(MuxCommand): + """ + Smoke and blow a shape with your magical pipe. + + Usage: + + smoke [ options [= description]] + + Where 'options' can be: + + - ring : a traditional or multicolored smoke ring + - dragon : a dragon shape + + If an 'option' is not given, then resorts to the attribute, + 'smoke_msg'. + """ + key = "smoke" + aliases = ['puff', 'blow'] + locks = "cmd:holds()" + + def func(self): + if self.lhs: + if self.lhs == 'ring': + self.obj.do_ring(self.caller, self.rhs) + elif self.lhs == 'dragon': + self.obj.do_dragon(self.caller, self.rhs) + else: + self.caller.msg(f"The option, '{self.lhs}' isn't available.") + else: + self.obj.do_smoke(self.caller) + + +class CmdSetSmoke(CmdSet): + def at_cmdset_creation(self): + self.add(CmdLight) + self.add(CmdSmoke) diff --git a/typeclasses/characters.py b/typeclasses/characters.py index f9f7335..5342419 100644 --- a/typeclasses/characters.py +++ b/typeclasses/characters.py @@ -274,12 +274,14 @@ class Character(Object, GenderCharacter, ContribRPCharacter): # function call. return super().at_look(target) - def announce_action(self, message): + def announce_action(self, message, exclude=None): """ Replaces a location's 'msg_contents' with an emote. """ - targets = [item for item in self.location.contents if item != self] - send_emote(self, targets, f"/Me {message}", msg_type="say", anonymous_add=None, quiet=True) + # All this does is add the character's gender to the message: + newmsg = sub(r"\$pron\((.*?)\)", f"$pron(\\1, {self.db.gender})", message) + choose = choices(newmsg) + self.location.msg_contents(f"{choose}", from_obj=self, exclude=exclude) def spell_sequence(self, location, messages, time_delay=1): """ diff --git a/typeclasses/drinkables.py b/typeclasses/drinkables.py index ab72316..cf07a2b 100755 --- a/typeclasses/drinkables.py +++ b/typeclasses/drinkables.py @@ -110,8 +110,7 @@ class Teapot(Object): desc = routput(TEA_TYPES[self.db.tea_type]) self.db.desc = f"A large, brown teapot full of {desc}." - drinker.msg(f"You make a teapot of {desc}.") - drinker.announce_action(f"makes a teapot of {desc}.") + drinker.announce_action(f"$You() $conj(make) a teapot of {desc}.") def do_fill(self, drinker): teatype = self.db.tea_type diff --git a/typeclasses/pets.py b/typeclasses/pets.py index bd946bf..fb75bd4 100755 --- a/typeclasses/pets.py +++ b/typeclasses/pets.py @@ -162,17 +162,12 @@ class Fire(Pet): get_up = "" gets_up = "" if giver.db.is_sitting: - get_up = "get up and" - gets_up = "gets up and" + get_up = "$conj(get) up and" if self.db.hunger_level < 5: - giver.msg(squish(f"You {get_up} put {adj} wood in the " - f"fireplace, and start a fire.")) - giver.announce_action(f"{gets_up} starts a fire.") + giver.announce_action(f"$You() {get_up} $conj(start) a fire.") else: - giver.msg(squish(f"You {get_up} put {adj} wood on the " - f"fire in the fireplace.")) - giver.announce_action(f"{gets_up} put wood on the fire.") + giver.announce_action(f"$You() {get_up} << $conj(feed) ^ put {adj} wood on >> the fire << in the fireplace ^ >>.") def feed(self, giver, obj=None): """ diff --git a/typeclasses/readables.py b/typeclasses/readables.py index 12e682f..83d2e99 100755 --- a/typeclasses/readables.py +++ b/typeclasses/readables.py @@ -165,8 +165,7 @@ class Book(Readable): self.cmdset.add_default(CmdSetBook) def do_read(self, reader): - super().do_read(reader) - reader.announce_action("reads |p book.") + reader.announce_action("$You() $conj(read) $pron(your) book.") def at_pre_drop(self, reader): if reader.location.key == "Dabbler's House": diff --git a/typeclasses/rooms.py b/typeclasses/rooms.py index 8bf107e..8eaab59 100644 --- a/typeclasses/rooms.py +++ b/typeclasses/rooms.py @@ -88,9 +88,15 @@ class Room(ObjectParent, ExtendedRoom, ContribRPRoom): return "|n" def get_display_characters(self, looker, *args, **kwargs): - num_chars = len(self.contents_get(content_type="character")) + chars = self.contents_get(content_type="character") + vchars = self.filter_visible(chars, looker, **kwargs) + num_chars = len(vchars) + char_list = super().get_display_characters(looker, pose=True) - if len(self.filter_visible(self.contents_get(content_type="object"), looker, **kwargs)) > 0: + + # We add the word 'also' in case we showed there were objects: + objs = self.contents_get(content_type="object") + if len(objs) > 0: also = 'also ' else: also = '' diff --git a/typeclasses/sittables.py b/typeclasses/sittables.py index 093447d..1d0df31 100755 --- a/typeclasses/sittables.py +++ b/typeclasses/sittables.py @@ -44,8 +44,7 @@ class Sittable(Object): self.db.sitter = sitter sitter.db.is_sitting = self - sitter.msg(self.sit_msg()) - sitter.announce_action(f"sits {adjective} {article} {self.key}.") + sitter.announce_action(f"$You() $conj(sit) {adjective} {article} {self.key}.") def do_stand(self, stander): """ diff --git a/typeclasses/things.py b/typeclasses/things.py index 94584aa..5d5b044 100755 --- a/typeclasses/things.py +++ b/typeclasses/things.py @@ -1,12 +1,12 @@ #!/usr/bin/env python -from random import choice, random +from random import choice, random, randint from enum import Enum from evennia import create_script from evennia.utils import logger, delay -from commands.misc import CmdSetPuddle, CmdSetStick, CmdSetKnock +from commands.misc import CmdSetPuddle, CmdSetStick, CmdSetKnock, CmdSetSmoke from commands.wizards import CmdSetWand from utils.word_list import routput, choices from .scripts import KnockScript @@ -111,7 +111,9 @@ class Pipe(Object): Where the |p is a possessive gender, if set, e.g. his or her. - The random messages has available substitutions based on if the message is for the smoker or for the audience in the room. Specifically: + The random messages has available substitutions based on if the + message is for the smoker or for the audience in the room. + Specifically: - {0} :: either "you" or your name - {1} :: either "your" or your name with an apostrophe 's. @@ -120,16 +122,54 @@ class Pipe(Object): For instance: @set pipe/random_msgs = "{0} blow{1} a <> smoke-ring followed by another that flies through the first. ;; {1} smoke collesce to form a <> ... or - """ - def do_light(self, lighter): - you_msg = choices(self.db.light_msg or "You pack and light your pipe.") - lighter.msg(you_msg) - # desc = self.return_appearance()[:1].lower() + self.return_appearance()[1:] - other_msg = choices(self.db.light_msg_other or "packs and lights |p pipe.") - lighter.announce_action(other_msg) - def do_puff(self, smoker): - pass + """ + def at_object_creation(self): + self.cmdset.add_default(CmdSetSmoke) + + def do_light(self, lighter): + msg = choices(self.db.light_msg or "$You() $conj(pack) and $conj(light) $pron(your) pipe.") + lighter.announce_action(msg) + + def do_smoke(self, smoker): + msg = choices(self.db.smoke_msg or "$You() << $conj(lean) back and ^ >> << $conj(puff) ^ $conj(smoke) >> $pron(your) pipe.") + smoker.announce_action(msg) + + def do_ring(self, smoker, details=None): + self.db._last_option = 'ring' + self.db._last_detail = details + + details = details or "" + msg = choices(f"$You() $conj(blow) a {details} << smoke ring ^ ring of smoke >>.") + smoker.announce_action(msg) + if randint(1, 10) < 5: + delay(randint(5, 15), self.do_ring_dissipate) + + def do_ring_dissipate(self): + msg = choices(""" + The smoke ring << flies around before it ^ shoots across the room before it ^ >> << eventually ^ finally >> << dissipates ^ disperses >>. ;; + The ring hovers, spinning in place, before << dissipating ^ dispersing >>. ;; + The smoke ring changes << colors ^ to purple ^ to blue ^ to pink>> before << dissipating ^ dispersing >>. + """) + self.location.location.msg_contents(msg) + + def do_dragon(self, smoker, details=None): + self.db._last_option = 'dragon' + self.db._last_detail = details + + details = details or "" + msg = choices(f"The smoke from $pron(your) pipe << coalesces ^ coheres >> << to form ^ into the shape of ^ and resembles ^ to look like >> a {details} dragon.") + smoker.announce_action(msg) + + if randint(1, 10) < 8: + delay(randint(5, 15), self.do_dragon_dissipate) + + def do_dragon_dissipate(self): + msg = choices(""" + The smoke dragon << flies around ^ soars across the room ^ bellows >> before it << eventually ^ finally >> << dissipates ^ disperses >>. ;; + The smoke dragon changes << colors ^ to purple ^ to blue ^ to pink>> before << dissipating ^ dispersing >>. + """) + self.location.location.msg_contents(msg) class Wood(Object): @@ -163,7 +203,8 @@ class Stick(Object): "This is a <> <>.", "Maybe we should get a pet <> in here who would love to play.", ], thrower.name.capitalize())) - thrower.announce_action("throws |p stick.") + thrower.announce_action("$You() $conj(throw) $pron(your) stick.", + exclude=thrower) else: thrower.msg("I think you should be outside or a place with more room before you throw that stick around.") @@ -197,7 +238,8 @@ class Puddle(Object): "happy.", "great.", ]))) - player.announce_action("jumps in the puddle.") + player.announce_action("$You() << $conj(jump) ^ $conj(splash) ^ $conj(play) >> in the puddle.", + exclude=player) class Knocker_Convo(Enum): @@ -399,8 +441,7 @@ class Knocker(Object): ("waker", self), ("room", self.db.room_to_msg) ]) - knocker.msg("You grab the ring and knock firmly on the door.") - knocker.announce_action("grabs the ring and knocks firmly on the door.") + knocker.announce_action("$You() $conj(grab) the ring and $conj(knock) << firmly ^ loudly ^ aggressively >> on the door.") else: knocker.msg("This door knocker is defective, as it doesn't have a ring to...er, do the knockin'.")