Create a Janitor to clean rooms if too much debris appears

This commit is contained in:
Howard Abrams 2026-10-15 00:01:08 -07:00
parent d2fda42a32
commit 503dd0301a
7 changed files with 1813 additions and 133 deletions

View file

@ -288,10 +288,7 @@ class CmdGM(MuxCommand):
msg = routput(self.args)
for o in send_to:
if o.is_typeclass('typeclasses.rooms.Room'):
# Send the message to all characters and any recording
# scribes in attendance:
chars = o.contents_get(None, 'character') + [o.has(Scribe)]
send_emote(me, chars, msg, 'say', None)
o.msg_contents(msg)
elif o.is_typeclass('typeclasses.characters.Character'):
o.msg(msg)

File diff suppressed because it is too large Load diff

95
typeclasses/janitor.py Executable file
View file

@ -0,0 +1,95 @@
#!/usr/bin/env python
"""
Janitor
Create a service that goes through the world at an interval
moving things that don't belong into a hamper.
"""
from evennia.utils import search
from evennia.utils import logger
from typeclasses.scripts import Script
from typeclasses.exits import Exit
from typeclasses.consumables import Producer
ROOMS_TO_CLEAN = [
"Grove of the Matriarchs",
"Boulder Top",
"Cozy House",
"Grotto",
"Frog Meadow",
"Lazy Dock",
"Lair",
"Mellow Marsh",
"Homey Hut",
"Wyldwood Bar",
"Cramped Kitchen",
"Secret Room",
"Bedroom",
"Prairie",
"Shore",
"Salty Shack", # mp16
"Glittering Glade", # mp19
"Dark Tunnel", # mp20
"Workshop", # mp21
"Damp Cave",
"Leaf Boat",
"Lonely Island",
"Antechamber",
"Escape Hallway",
]
ROOM_EXCEPTIONS = {
"Grove of the Matriarchs": [ "stick" ],
"Cozy House": [ "crystal ball" ],
"Lazy Dock": [ "fishing pole" ],
"Homey Hut": [ "horn" ],
"Bedroom": [ "pair slippers" ],
}
class Janitor(Script):
"""
Should this be an Object or inherit from Script?
"""
def at_script_creation(self):
self.key = "Janitor"
self.desc = "Move trash to a receptacle"
self.interval = 60 * 60 * 24
self.start_delay = False
self.persistent = True
def at_start(self, **kwargs):
self.at_repeat()
def at_repeat(self, **kwargs):
for name in ROOMS_TO_CLEAN:
for room in search.objects(name):
self.clean_room(room)
def clean_room(self, room):
"""
Sweep through the room's contents.
Anything that shouldn't be there is moved to 'mp00'.
Exceptions include objects that are locked to the room,
_exits_ and _producers_ (because producers are not locked),
and actual exceptions in ROOM_EXCEPTIONS.
"""
exceptions = ROOM_EXCEPTIONS.get(room.key, [])
trash = [i for i in room.contents
if not i.is_typeclass(Exit)
and not i.is_typeclass(Producer)
and i.locks.get("get") != "get:false()"
and i.name not in exceptions ]
for t in trash:
to_room = search.objects("mp00")[0]
for room,objs in ROOM_EXCEPTIONS.items():
if t.key in objs:
to_room = search.objects(room)[0]
# Quietly move it to where the object belongs:
logger.info(f"JANITOR: Move '{t.name}' to {to_room.name}")
t.location.msg_contents(f"A rat with beady eyes and a leather satchel appears, picks up the {t.name} and takes off with it.")
t.move_to(to_room, quiet=True)

View file

@ -570,7 +570,12 @@ class WeeBeastie(Friendly, Familiar, Listener, AI):
class BHB(Friendly, Listener, AI):
"""
The Big Hairy Beast is a special pet that has a circadian
rhythm, and goes to bed each night and wakes each morning.
"""
def return_appearance(self, looker):
"""The beast looks different when it is sleeping."""
if self.db.is_awake:
return super().return_appearance(looker)
else:

View file

@ -353,7 +353,7 @@ class Wood(Litterable):
]))
class Stick(Consumable):
class Stick(Object):
"An object to throw."
def at_object_creation(self):
self.cmdset.add_default(CmdSetStick)

View file

@ -1204,11 +1204,95 @@ expectit "Frog Meadow"
send "west\n"
expectit "Grove of the Matriarchs"
send "west\n"
expectit "Grotto"
send "south\n"
expectit "Lazy Dock"
set timeout 240
send "blow horn\n"
# expectit "You blow your horn"
expectit "The giant leaf slows as it arrives next to the dock."
send "boat\n"
expectit "The giant leaf gently bobs in the surf of this island, allowing you to disembark."
send "disembark\n"
expectit "Lonely Island"
send "get moonberry\n"
expectit "You collect a handful of moonberries"
dont_expect "You notice" "seagrass"
send "get seagrass\n"
expectit "You harvest a bunch of seagrass"
send "look statue\n"
expectit "A massive statue"
send "look trident\n"
expectit "Held loosely with one hand"
send "look ball\n"
expectit "sphere resting"
send "look shield\n"
expectit "An ornate shield"
send "look plaque\n"
expectit "Glory to the seamother"
send "say The answer is Thalome, right?\n"
expectit "revealing an open archway"
send "look opening\n"
expectit "shaped as a cresent moon"
send "arch\n"
expect {
"The room is completely dark" {
send "light torch\n"
expectit "The room is lit up"
send "look\n"
expectit "Antechamber"
}
"Antechamber" {
send_user "We still have our torch lit from the last time."
}
timeout {
puts "ERROR: Expected response for 'get stick' not received."
send "quit\n"
exit 1
}
}
send "look cavity\n"
expectit "this opening"
send "look blocks\n"
expectit "the stones are tightly placed"
send "look dome\n"
expectit "Perhaps 30 feet high"
send "look obelisk\n"
expectit "grazes the top of the dome"
send "get obelisk\n"
expectit "That is way too big"
send "say Is the magic word, Water?\n"
expectit "Upon uttering that phrase"
# Make sure we got a blue medal ... Or whatever reward we should get
send "inv\n"
expectit "blue medal"
send "look door\n"
expectit "A door you didn't notice before"
send "door\n"
expectit "Cozy House"
expectit "Escape Hallway"
send "leave\n"
expectit "Grotto"
@ -1346,17 +1430,6 @@ expectit "Frog Meadow"
send "west\n"
expectit "Grove"
send "south\n"
expectit "Lazy Dock"
set timeout 240
send "blow horn\n"
# expectit "You blow your horn"
expectit "The giant leaf slows as it arrives next to the dock."
send "boat\n"
expectit "The giant leaf gently bobs in the surf of this island, allowing you to disembark."
send "disembark\n"
expectit "Lonely Island"

File diff suppressed because it is too large Load diff