Fix the lighting of torches and stuff.

This commit is contained in:
Howard Abrams 2025-07-03 23:30:48 -07:00
parent f02e16e1ba
commit 5bdb42042b
6 changed files with 84 additions and 65 deletions

View file

@ -23,6 +23,7 @@ from commands.sittables import CmdNoSitStand
from commands.everyone import (CmdTake, CmdThink, CmdSay, from commands.everyone import (CmdTake, CmdThink, CmdSay,
CmdWhisper, CmdRead, CmdEat, CmdDrink, CmdWhisper, CmdRead, CmdEat, CmdDrink,
CmdUse, CmdPush, CmdPull) CmdUse, CmdPush, CmdPull)
from commands.misc import CmdLight
from commands.wizards import CmdGM, CmdSpell, CmdGMTrigger, CmdMakeCocktail from commands.wizards import CmdGM, CmdSpell, CmdGMTrigger, CmdMakeCocktail
@ -46,6 +47,7 @@ class CharacterCmdSet(default_cmds.CharacterCmdSet):
self.add(CmdUse) self.add(CmdUse)
self.add(CmdPush) self.add(CmdPush)
self.add(CmdPull) self.add(CmdPull)
self.add(CmdLight)
self.add(CmdTake) self.add(CmdTake)
self.add(CmdThink) self.add(CmdThink)
self.add(SetGender) self.add(SetGender)

View file

@ -1,33 +0,0 @@
#!/usr/bin/env python
from evennia import Command, CmdSet
# from .command import Command
class CmdLight(Command):
"""
Creates light where there was none. Something to burn.
"""
key = "light"
# only allow this command if command.obj is carried by caller.
# locks = "cmd:holds()"
def func(self):
"""
Implements the light command. Since this command is designed
to sit on a "lightable" object, we operate only on self.obj.
"""
if self.obj.light():
self.caller.msg("You light %s." % self.obj.key)
self.caller.location.msg_contents(
"%s lights %s!" % (self.caller, self.obj.key), exclude=[self.caller])
else:
self.caller.msg("%s is already burning." % self.obj.key)
class CmdSetLight(CmdSet):
"""CmdSet for the lightsource commands"""
def at_cmdset_creation(self):
"""called at cmdset creation"""
self.add(CmdLight)

View file

@ -75,17 +75,34 @@ class CmdSetStick(CmdSet):
class CmdLight(Command): class CmdLight(Command):
""" """
Light something on fire, preferably a pipe. Light something on fire.
Usage: Usage:
light [ object ] light <object>
Want to relax into the old stories, light a pipe.
Want to see in a dungeon, use this to light a
torch or a candle, if you have such an item.
""" """
key = "light" key = "light"
locks = "cmd:holds()"
def func(self): def func(self):
self.obj.do_light(self.caller) lighter = self.caller
item = self.args.strip()
if item == "":
lighter.msg("What do you want to light?")
return
burnables = lighter.search(item, location=lighter, quiet=True)
if burnables and len(burnables) > 0:
try:
burnables[0].do_light()
except Exception:
lighter.msg(f"The {burnables[0].key} isn't flammable.")
else:
lighter.msg(f"Can't find {item}.")
class CmdSmoke(MuxCommand): class CmdSmoke(MuxCommand):
@ -122,7 +139,6 @@ class CmdSmoke(MuxCommand):
class CmdSetSmoke(CmdSet): class CmdSetSmoke(CmdSet):
def at_cmdset_creation(self): def at_cmdset_creation(self):
self.add(CmdLight)
self.add(CmdSmoke) self.add(CmdSmoke)

View file

@ -1,9 +1,11 @@
#!/usr/bin/env python #!/usr/bin/env python
from commands.lighting import CmdSetLight from evennia.utils import delay
from typeclasses.objects import Object
# ------------------------------------------------------------- # -------------------------------------------------------------
#
# LightSource # LightSource
# #
# This object emits light. Once it has been turned on it # This object emits light. Once it has been turned on it
@ -16,7 +18,6 @@ from commands.lighting import CmdSetLight
# to use but does not survive a server @reload. Because of # to use but does not survive a server @reload. Because of
# where the light matters (in the Dark Room where you can # where the light matters (in the Dark Room where you can
# find new light sources easily), this is okay here. # find new light sources easily), this is okay here.
#
# ------------------------------------------------------------- # -------------------------------------------------------------
class LightSource(Object): class LightSource(Object):
@ -47,7 +48,7 @@ class LightSource(Object):
# when created. # when created.
self.db.desc = "A tapered candle." self.db.desc = "A tapered candle."
# add the Light command # add the Light command
self.cmdset.add_default(CmdSetLight, persistent=True) # self.cmdset.add_default(CmdSetLight, persistent=True)
def _burnout(self): def _burnout(self):
""" """
@ -57,35 +58,38 @@ class LightSource(Object):
# delete ourselves from the database # delete ourselves from the database
self.db.is_giving_light = False self.db.is_giving_light = False
try: try:
self.location.location.msg_contents( owner = self.location
"%s's %s flickers and dies." % (self.location, self.key), exclude=self.location owner.announce_action(f"$Your() {self.key} flickers and dies.")
)
self.location.msg("Your %s flickers and dies." % self.key)
self.location.location.check_light_state() self.location.location.check_light_state()
except AttributeError: except AttributeError:
try: try:
self.location.msg_contents("A %s on the floor flickers and dies." % self.key) self.location.msg_contents(f"A {self.key} on the floor flickers and dies.")
self.location.location.check_light_state() self.location.location.check_light_state()
except AttributeError: except AttributeError:
# Mainly happens if we happen to be in a None location # Mainly happens if we happen to be in a None location
pass pass
self.delete() self.delete()
def light(self): def do_light(self):
""" """
Light this object - this is called by Light command. Light this object - this is called by Light command.
""" """
owner = self.location
if self.db.is_giving_light: if self.db.is_giving_light:
owner.msg(f"The {self.key} is already lit.")
return False return False
else:
owner.announce_action(f"$You() $conj(light) $pron(your) {self.key}.")
# burn for 3 minutes before calling _burnout # burn for 3 minutes before calling _burnout
self.db.is_giving_light = True self.db.is_giving_light = True
# if we are in a dark room, trigger its light check # if we are in a dark room, trigger its light check
try: try:
self.location.location.check_light_state() owner.location.check_light_state()
except AttributeError: except AttributeError:
try: try:
# maybe we are directly in the room # maybe we are directly in the room
self.location.check_light_state() owner.check_light_state()
except AttributeError: except AttributeError:
# we are in a None location # we are in a None location
pass pass

View file

@ -1,14 +1,38 @@
#!/usr/bin/env python #!/usr/bin/env python
# ------------------------------------------------------------------------------- # -------------------------------------------------------------------------------
# #
# Dark Room - a room with states # Dark Room - a room with states
# #
# This room limits the movemenets of its denizens unless they carry an active # This room limits the movements of its denizens unless they carry an active
# LightSource object (LightSource is defined in objects.LightSource) # LightSource object (LightSource is defined in objects.LightSource)
# #
# ------------------------------------------------------------------------------- # -------------------------------------------------------------------------------
from random import choice, random
from evennia import (
TICKER_HANDLER,
CmdSet,
Command,
DefaultExit,
DefaultRoom,
create_object,
default_cmds,
search_object,
syscmdkeys,
utils,
)
from evennia.commands.default.general import CmdInventory
# from evennia.utils import dedent, delay, search
from evennia.contrib.rpg.rpsystem import CmdEmote
# from commands.command import Command
from commands.everyone import CmdSay, CmdWhisper
from commands.misc import CmdLight
from commands.wizards import CmdGM
from typeclasses.lightables import LightSource
from typeclasses.rooms import Room
DARK_MESSAGES = ( DARK_MESSAGES = (
"It is pitch black. You are likely to be eaten by a grue.", "It is pitch black. You are likely to be eaten by a grue.",
@ -22,13 +46,14 @@ DARK_MESSAGES = (
ALREADY_LIGHTSOURCE = ( ALREADY_LIGHTSOURCE = (
"You don't want to stumble around in blindness anymore. You already " "You don't want to stumble around in blindness anymore. You already "
"found what you need. Let's get the fireplace lit already!" "found what you need. Let's get |glight|n already!"
) )
FOUND_LIGHTSOURCE = ( FOUND_LIGHTSOURCE = (
"Your fingers bump against a candle on a candleabra." "Your fingers bump against a splinter of wood."
" It smells of resin and seems dry enough to burn! "
"You pick it up, holding it firmly. Now you just need to" "You pick it up, holding it firmly. Now you just need to"
" |wlight|n it using the flint and steel you carry with you." " |glight|n it using the flint and steel you carry with you."
) )
@ -62,9 +87,9 @@ class CmdLookDark(Command):
nr_searches = 0 nr_searches = 0
caller.ndb.dark_searches = nr_searches caller.ndb.dark_searches = nr_searches
if nr_searches < 4 and random.random() < 0.90: if nr_searches < 4 and random() < 0.90:
# we don't find anything # we don't find anything
caller.msg(random.choice(DARK_MESSAGES)) caller.msg(choice(DARK_MESSAGES))
caller.ndb.dark_searches += 1 caller.ndb.dark_searches += 1
else: else:
# we could have found something! # we could have found something!
@ -73,7 +98,7 @@ class CmdLookDark(Command):
caller.msg(ALREADY_LIGHTSOURCE) caller.msg(ALREADY_LIGHTSOURCE)
else: else:
# don't have a light source, create a new one. # don't have a light source, create a new one.
create_object(LightSource, key="candle", location=caller) create_object(LightSource, key="splinter", location=caller)
caller.msg(FOUND_LIGHTSOURCE) caller.msg(FOUND_LIGHTSOURCE)
@ -135,7 +160,12 @@ class DarkCmdSet(CmdSet):
self.add(CmdLookDark()) self.add(CmdLookDark())
self.add(CmdDarkHelp()) self.add(CmdDarkHelp())
self.add(CmdDarkNoMatch()) self.add(CmdDarkNoMatch())
self.add(default_cmds.CmdSay()) self.add(CmdEmote())
self.add(CmdSay())
self.add(CmdWhisper())
self.add(CmdGM())
self.add(CmdLight())
self.add(CmdInventory())
self.add(default_cmds.CmdQuit()) self.add(default_cmds.CmdQuit())
self.add(default_cmds.CmdHome()) self.add(default_cmds.CmdHome())
@ -213,17 +243,17 @@ class DarkRoom(Room):
# put players in darkness # put players in darkness
char.msg("The room is completely dark.") char.msg("The room is completely dark.")
def at_object_receive(self, obj, source_location, move_type="move", **kwargs): def at_object_receive(self, moved_obj, source_location, move_type="move", **kwargs):
""" """
Called when an object enters the room. Called when an object enters the room.
""" """
if obj.has_account: if moved_obj.has_account:
# a puppeted object, that is, a Character # a puppeted object, that is, a Character
self._heal(obj) self._heal(moved_obj)
# in case the new guy carries light with them # in case the new guy carries light with them
self.check_light_state() self.check_light_state()
def at_object_leave(self, obj, target_location, move_type="move", **kwargs): def at_object_leave(self, moved_obj, target_location, move_type="move", **kwargs):
""" """
In case people leave with the light, we make sure to clear the In case people leave with the light, we make sure to clear the
DarkCmdSet if necessary. This also works if they are DarkCmdSet if necessary. This also works if they are
@ -232,4 +262,4 @@ class DarkRoom(Room):
# since this hook is called while the object is still in the room, # since this hook is called while the object is still in the room,
# we exclude it from the light check, to ignore any light sources # we exclude it from the light check, to ignore any light sources
# it may be carrying. # it may be carrying.
self.check_light_state(exclude=obj) self.check_light_state(exclude=moved_obj)

View file

@ -262,7 +262,7 @@ class Pipe(Object):
self.cmdset.add_default(CmdSetSmoke) self.cmdset.add_default(CmdSetSmoke)
def do_light(self, lighter): def do_light(self, lighter):
msg = choices(self.db.light_msg or "$You() $conj(pack) and $conj(light) $pron(your) pipe.") msg = choices(self.db.light_msg or "$You() $conj(pack) and $conj(light) $pron(your) pipe. You can now |Glook|n around.")
lighter.announce_action(msg) lighter.announce_action(msg)
def do_smoke(self, smoker): def do_smoke(self, smoker):