From f293b506b901362f94506cec860bafa1193a3199 Mon Sep 17 00:00:00 2001 From: Howard Abrams Date: Fri, 15 Aug 2025 23:15:46 -0700 Subject: [PATCH] Limit ability to litter with berries, flowers, etc. Also gave the wee beastie a taste for yellow flowers. --- typeclasses/consumables.py | 17 +- typeclasses/pets.py | 51 ++++ typeclasses/things.py | 11 +- web/static/webclient/css/custom.css | 5 + world/help_entries.py | 18 +- world/test-run.exp | 4 +- world/version1.ev | 364 +++++++++++++++++++++++++++- 7 files changed, 451 insertions(+), 19 deletions(-) diff --git a/typeclasses/consumables.py b/typeclasses/consumables.py index a56c9c4..50f9e00 100755 --- a/typeclasses/consumables.py +++ b/typeclasses/consumables.py @@ -13,7 +13,20 @@ from typeclasses.objects import Object from utils.word_list import routput # , choices -class Consumable(Object): +class Litterable(Object): + """ + Objects, that if dropped, are deleted instead. + The default thing for a producer. + """ + def at_pre_drop(self, dropper): + """ + Let's keep this world tidy. + """ + dropper.announce_action(f"$You() $conj(drop) the {self.name}.") + self.delete() + + +class Consumable(Litterable): """ Create with a command: @@ -60,7 +73,7 @@ class Consumable(Object): self.delete() -class Herb(Object): +class Herb(Litterable): """ Essentially a marker for something that can go in a cauldron. """ diff --git a/typeclasses/pets.py b/typeclasses/pets.py index 93bbf39..dc2f672 100755 --- a/typeclasses/pets.py +++ b/typeclasses/pets.py @@ -459,6 +459,57 @@ class Friendly(Pet): petter.announce_action(f"$You() $conj(pet) {self.name}.") +class WeeBeastie(Friendly): + """ + The stoat that lives in Dabbler's house, is a finicky eater. + """ + def feed(self, feeder, item=None): + """ + Feeding the beast. If item is None, we choose something + the character has, and go with that... + """ + # Categorize items that can be used to feed the beast: + def is_flower(item): + return (not item and feeder.has("yellow flower")) or \ + (item and item.key == 'yellow flower') + + # Based on the reaction to the feeder, the adjectives may alter: + noun = "The " + random.choice(["wee", "furry", "white", "adorable"]) + " beastie" + + match self.friendly_reaction(feeder): + case Reaction.SCARED: + how_sniff = "carefully" + how_eat = "curiously" + and_then = "nonchalantly walks away" + case Reaction.CONCERNED: + how_sniff = "gently" + how_eat = "gingerly" + and_then = "indifferently returns to its nap" + case Reaction.INTERESTED: + how_sniff = "quickly" + how_eat = "curiously" + and_then = "gingerly sniffs to see what else $you() might have" + case _: + how_sniff = "excitedly" + how_eat = random.choice(["eagerly", "gladly", "vigorously"]) + and_then = random.choice([ + "gives $pron(you,op) a cute lick as if to say, Thank you", + "purrs in appreciation for the treat", + "rubs its wee widdle head under $pron(you,op) chin in gratitude", + ]) + + if is_flower(item): + msg = f"{noun} {how_sniff} sniffs $your() << hand holding a ^>> flower. It {how_eat} eats it, and {and_then}." + self.adjust_character(feeder, 100) + feeder.has('yellow flower').delete() + else: + msg = f"{noun} doesn't appear interested in anything you have." + + if msg: + feeder.announce_action(msg) + + + class BHB(Friendly): def return_appearance(self, looker): if self.db.is_awake: diff --git a/typeclasses/things.py b/typeclasses/things.py index 09d1592..d85ed5d 100755 --- a/typeclasses/things.py +++ b/typeclasses/things.py @@ -20,8 +20,9 @@ from commands.misc import (CmdSetPuddle, from commands.consumables import CmdSetMakeConsumable from commands.wizards import CmdSetWand from utils.word_list import routput, choices, paragraph -from .scripts import KnockScript -from .objects import Object +from typeclasses.consumables import Litterable +from typeclasses.objects import Object +from typeclasses.scripts import KnockScript class Medal(Object): @@ -78,7 +79,7 @@ class CoinPurse(Object): return self.how_much() >= at_least -class Rope(Object): +class Rope(Litterable): """ A rope can be used in particular circumstances. """ @@ -318,7 +319,7 @@ class Pipe(Object): The << smoke ^ >> << monster ^ {monster} >> changes << colors ^ to purple ^ to blue ^ to pink>> before << dissipating ^ dispersing >>.""") self.location.location.msg_contents(msg) -class Wood(Object): +class Wood(Litterable): "An object to burn." def at_object_creation(self): self.db.singular = "a log" @@ -942,7 +943,7 @@ class BagofJunk(Object): description = f"An interesting item found in a {where}." item = spawn({ - "typeclass": "typeclasses.objects.Object", + "typeclass": "typeclasses.consumables.Litterable", "key": self.db.latest_item, "desc": description })[0] diff --git a/web/static/webclient/css/custom.css b/web/static/webclient/css/custom.css index b66c706..99a3c96 100644 --- a/web/static/webclient/css/custom.css +++ b/web/static/webclient/css/custom.css @@ -92,6 +92,11 @@ textarea.inputfield:focus { color: #19130d; } +.color-003 { + font-weight: bold; + color: #ffd700; + text-shadow: 2px 2px; +} .color-015 { font-weight: bold; color: black; diff --git a/world/help_entries.py b/world/help_entries.py index 85d808a..e04087a 100644 --- a/world/help_entries.py +++ b/world/help_entries.py @@ -37,9 +37,7 @@ HELP_ENTRY_DICTS = [ "key": "start", "aliases": ["intro"], "locks": "read:all()", - "text": """Again, welcome to my cozy little game. - -To |wplay this game|n, you typically type a |w|n for an action, or |w |n combinations. For instance, type |glook|n to look around the area, and |glook tree|n to examine the trees in particular. The more you look, the more you explore. + "text": """To |wplay this game|n, you typically type a |w|n for an action, or |w |n combinations. For instance, type |glook|n to look around the area, and |glook tree|n to examine the trees in particular. The more you look, the more you explore. What verbs are available depends on where you are and what you might be holding. Type |ghelp|n with no other option to get a list of those commands. Then type |ghelp look|n to get details on how to use the |wlook|n verb. @@ -65,8 +63,6 @@ You will also want to |wadd to that description|n with a pose, like: These two labels will be shown to anyone looking around the area you are in. -What is the goal of this game? Just to escape the chaos of the world and explore an idyllic setting. I call it my |yegg hunt game|n, as the game is full odd stuff to discover. Feel free to find me to chat, but good luck finding me, as I may be hiding. - This is the end of this help section, but I have some related topics to this intro, so you can type |ghelp start/commands|n to get a list of typical commands, or just start playing this game. Enjoy! @@ -88,6 +84,8 @@ A command is typically a 'verb'. The most common ones in this game are: Type |ghelp|n and those commands to get more information on its usage. +Or see the online Player's Handbook at https://howardabrams.com/cozy-players-guide/ + ## Exits Exits are special commands, and move you to a new location. So typing |gsouth|n will move you to a new location (assuming that exit is available). Some exits can be abbreviated, so typing |gs|n alone is the same as 'south'. @@ -105,17 +103,19 @@ Leave your current character by typing: |gooc|n -Then delete your old character with: +While you don't have to, you can delete your old character with: |gchardelete |n -This only deletes the character of that name, not your account with that name. +This only deletes the character of that name, not your account. Next, create a new character by typing: - |gcharcreate Rambler = A frumpy, but spry person with large ears and dark blue cloak.|n + |gcharcreate|n -And now, assume that character by typing: +And follow the step-by-step guide to creating a new character. + +Assume a previously created character by typing: |gic Rambler|n""" }, diff --git a/world/test-run.exp b/world/test-run.exp index 6abf00b..ef3390c 100755 --- a/world/test-run.exp +++ b/world/test-run.exp @@ -768,7 +768,7 @@ send "drop book\n" expectit "flies" send "sit\n" -expectit "You sit in the few overstuffed chairs." +expectit "You sit in " send "hint\n" expectit "You are in a cozy and casual place" @@ -1050,7 +1050,7 @@ send "up\n" expectit "Cozy House" send "give laughing potion to gnome\n" -expectit "You give a laughing potion to Dabbler." +expectit "You give a laughing potion" # Close the log file log_file diff --git a/world/version1.ev b/world/version1.ev index 8fd35be..3dfafde 100644 --- a/world/version1.ev +++ b/world/version1.ev @@ -1460,6 +1460,123 @@ py timed_script = evennia.create_script(key="Create Sticks", @detail jars = Sealed jars of fruits, vegetables, herbs and spices. # Inside Trampoli’s Hut:5 ends here +# Jars +# Every time we look at a jar, we see something else … that we can’t take. This creates ambiance without adding too much complexity? + + +# [[file:../../../projects/mud.org::*Jars][Jars:1]] +@tel/quiet Homey Hut +# +@create/drop assortment of jars;jars;jar: typeclasses.puzzles.Changling +# Jars:1 ends here + + + +# Can’t get them: + + +# [[file:../../../projects/mud.org::*Jars][Jars:2]] +@lock jars = get:false() +# +@set jars/get_err_msg = "\"Do not steal our winter provisionings,\" the horned wolf skull says. \"What are you a thief?\"" +# Jars:2 ends here + + + +# And the generate description: + + +# [[file:../../../projects/mud.org::*Jars][Jars:3]] +@set jars/desc_first_prefix = "<< Fascinating ^ Interesting ^ Curious >> << collection of ^ assortment of ^ >> << jars ^ contents ^ ingredients >>. You look at one << jar ^ >> with << an afixed ^ an attached >> label of << scrawling ^ scribbling ^ squiggling >> << ink ^ writing ^ letters >>,|w" +# +@set jars/desc_prefix = "You look at another << jar ^ >> with << an afixed ^ an attached >> label of << scrawling ^ scribbling ^ squiggling >> << ink ^ writing ^ letters >>,|w" +# +@set jars/desc_postfix = "" +# Jars:3 ends here + + + +# And now for a list of the contents: + + +# [[file:../../../projects/mud.org::*Jars][Jars:4]] +@set jars/descs = ( + "Dragon's Breath|n. A swirling mist of iridescent smoke that changes color, said to contain the essence of fire.", + "Mermaid Tears|n. Clear, crystalline droplets that shimmer with a hint of blue, believed to bring good fortune.", + "Phoenix Ashes|n. A small jar filled with fine, red and gold ash, said to have the power of rebirth.", + "Enchanted Rose Petals|n. Dried petals that change color with the phases of the moon, said to attract love.", + "Eye of Newt|n. Filled with many small eyeballs.", + "Timekeeper's Sand|n. Fine, golden sand that flows slowly, rumored to have the power to manipulate time.", + "Cursed Bone Shards|n. Jagged pieces of bone, each one etched with strange symbols and glowing faintly.", + "Enchanted Honey|n. Thick, golden honey that glimmers with tiny flecks of light, like captured sunlight.", + "Faerie Wings|n. Delicate, translucent wings that shimmer in various colors, said to grant agility.", + "Elemental Stones|n. Small, smooth stones representing earth, air, fire, and water, each with a unique glow.", + "Owlbear Hair|n. Strands of shimmering hair from various magical creatures, said to enhance spells.", + "Frosted Rose Petals|n. Dried flowers that appear to be covered in frost, said to bring winter's magic.", + "Toadstool Caps|n. Vibrant mushroom caps of red, orange, and yellow, and adorned with delicate white speckles that catch the light.", + "Glowcaps|n. Clusters of tiny, bioluminescent mushrooms that emit a soft, greenish glow.", + "Dream|n. Fluffy, cotton-like wisps gently floating, resembling miniature clouds in the jar.", + "Mandrake Root|n. A twisted, gnarled root with a faintly green hue, nestled in a jar of dark soil.", + ) +# Jars:4 ends here + +# Herbs +# Like the [[*Jars][Jars]], the herbs return a different response each time they are viewed. + + +# [[file:../../../projects/mud.org::*Herbs][Herbs:1]] +@create/drop collection of herbs;herbs;herb: typeclasses.puzzles.Changling +# Herbs:1 ends here + + + +# While the skull protects the jars, we will have the demon stop the herbs from being pinched. + + +# [[file:../../../projects/mud.org::*Herbs][Herbs:2]] +@lock herbs = get:false() +# +@set herbs/get_err_msg = "On the wall, the carving comes to life, and flies next to you. \"Do not take her harvest,\" it says as it bats your hand away." +# Herbs:2 ends here + +# [[file:../../../projects/mud.org::*Herbs][Herbs:3]] +@set herbs/desc_first_prefix = "<< Plenty ^ Many >> bundles around the room. One << particular ^ peculiar ^ >> << bundle ^ bouquet garni >> of " +# +@set herbs/desc_prefix = "<< Another ^ This >> << particular ^ peculiar ^ >> << bundle ^ bouquet garni >> of " +# +@set herbs/desc_postfix = " Tied with << twine ^ string ^ lace >> and << hanging from a rafter ^ hung from a nail ^ dangling from a post of a chair >>." +# Herbs:3 ends here + + + +# And the individiaul choices are more appearance, and possibly smell, without claiming to be /worldly herbs/. Would like to add some dried red and other colored leaves to make it more fantastical. + + +# [[file:../../../projects/mud.org::*Herbs][Herbs:4]] +@set herbs/descs = ( + "grayish-green, crinkled leaves, and has a strong, earthy aroma, like sage.", + "small, purple flowers, with that sweet, lavender scent.", + "thin, woody needles, and has a strong, pine-like fragrance, like rosemary.", + "small, white flowers with yellow centers, resembling tiny daisies.", + "tiny, greenish-brown leaves, with a robust, herbal scent, like thyme.", + "dark green leaves with a refreshing, minty aroma.", + "brown leaves, with a refreshing, minty aroma.", + "dark green and crinkled leaves, and have a sweet, peppery scent" + "brown, crinkled leaves, with a sweet, peppery, almost basil-like scent" + "grayish-green, feathery leaves, with a slightly bitter, mugwort-like aroma.", + "small, white and yellow flowers that have a feathery appearance, like yarrow.", + "dark green, almost brown leaves, with a slightly bitter aroma.", + "dark green leaves, some almost brown, with a coarse texture and earthy scent, like nettle.", + "feathery fronds, ranging from light green to brown, with a sweet, anise-like scent.", + "purple flowers (some brown), with a spiky center and a slightly sweet aroma, like echinacea.", + "bright orange to yellow flowers, with a slightly sweet, herbal scent.", + "dark green, smooth leaves, and have a strong, aromatic scent, like bay.", + "grayish-green, feathery leaves with a distinctive, bitter aroma.", + "brown and woody roots, with a strong, earthy Valerian-like smell.", + "brown, woody root with a sweet, distinct aroma, like licorice.", + ) +# Herbs:4 ends here + # Talismans # To give some character, we create some interesting art that decorates this hut. @@ -1861,6 +1978,184 @@ Someone has set a nice |Ychair|n for viewing. @set sign/get_err_msg = "This granny knot holding the sign to the chair is serious. You can't take it." # Sign:4 ends here +# Sandy Shore +# Could we extend the sea from the [[file:mud.org::*The Dock][The Dock]] down a shore: + + +# [[file:../../../projects/mud.org::*Sandy Shore][Sandy Shore:1]] +@teleport/quiet mp06 +# +@dig Shore;mp14 :typeclasses.rooms_weather.TimeWeatherRoom = south along shore;shore;south;s,north to dock;north;n;dock +# Sandy Shore:1 ends here + + + +# With a mesage about leaving the trees so that I don’t have to repeat that in the room description: + +# [[file:../../../projects/mud.org::*Sandy Shore][Sandy Shore:2]] +@set south/traverse_msg = "Leaving the dock, you want along the soft sandy shore next to the Lavender Sea, enjoying the mesmerizing sound of the surf... until you come to a shack that blocks your stroll." +# Sandy Shore:2 ends here + + + +# And a description: + +# [[file:../../../projects/mud.org::*Sandy Shore][Sandy Shore:3]] +@desc south = You see a shack down along the sandy shore. +# Sandy Shore:3 ends here + + + +# And move ourselves there: + +# [[file:../../../projects/mud.org::*Sandy Shore][Sandy Shore:4]] +@teleport mp15 +# Sandy Shore:4 ends here + + + +# And describe the walk back to the dock: + +# [[file:../../../projects/mud.org::*Sandy Shore][Sandy Shore:5]] +@set north/traverse_msg = "You walk along the shore of the lavender sea back to the dock." +# Sandy Shore:5 ends here + + + +# And a description: + +# [[file:../../../projects/mud.org::*Sandy Shore][Sandy Shore:6]] +@desc north = The sandy shore to the north ends at a dock, jutting into the lavender sea. +# Sandy Shore:6 ends here + + +# And describe this. + +# [[file:../../../projects/mud.org::*Sandy Shore][Sandy Shore:7]] +@desc here = Puppy-dog |Ywaves|n on a lavender |Ysea|n, snap your heels half-heartedly. Walking hard steps, punching crusted |Ysand|n, difficulty crossing land. Robust |Yshack|n squatting below a |Ypine|n, locked door holding painted |Ysign|n. +# Sandy Shore:7 ends here + + + +# And details? + + +# [[file:../../../projects/mud.org::*Sandy Shore][Sandy Shore:8]] +@detail waves = Despite the inclement weather, the waves ripple gently against the shore. +# +@detail sea;lavender sea = Is that a |Yboat|n you see sailing the sea in the distance? +# +@detail boat;ship = The mastless ship looks like a giant leaf. Wonder if it comes to shore? +# +@detail shack = Standing crookedly at the edge of the sandy shore, this shack's weathered planks, bleached by the salty mist, imparts a ghostly appearance. The roof, adorned with seashells and driftwood, appears to be a patchwork of nature's treasures, inviting curious souls to uncover the secrets hidden within. +# Sandy Shore:8 ends here + +# Sand +# Part of the [[Potions and their Ingredients][Alchemist Path]], we use sand as an ingredient in a potion we want to make. + + +# [[file:../../../projects/mud.org::*Sand][Sand:1]] +@create/drop lot of sand;sand : typeclasses.consumables.Producer +# +@desc sand = Glittery sand with small flecks of lavender-colored gems. +# +@set sand/make_name = "bag of sand" +# +@set sand/make_verb = "$conj(fill) a small" +# +@set sand/make_desc = "Small leather pouch of sand with lavender gems." +# +@lock sand = view:tag(hidden_sand) +# Sand:1 ends here + +# Pine Flowers +# Part of the [[Potions and their Ingredients][Alchemist Path]], we use /pine flowers/ to create a potion TBD, and feed the stoat in Dabbler’s House. + + +# [[file:../../../projects/mud.org::*Pine Flowers][Pine Flowers:1]] +@create/drop pine tree;pine;tree;flowers;flower = typeclasses.consumables.Producer +# +@desc pine = Windswept pine leans to shade the shack, protecting it somewhat from the regular occuring rain. Interesting, that the pine has beautiful, yellow |Yflowers|n. +# +@set pine/make_class = "typeclasses.consumables.Herb" +# +@set pine/make_name = "yellow flower" +# +@set pine/make_verb = "$conj(pick) a small" +# +@set pine/make_desc = "Briny smelling flower with purple spots." +# +@lock pine = view:tag(alchemist) # We want the user to be able to "look pine" as a detail? +# Pine Flowers:1 ends here + +# Sign +# We make the sign as an “object” for others to read: + + +# [[file:../../../projects/mud.org::*Sign][Sign:1]] +@create/drop sign = typeclasses.readables.Readable +# +@desc sign = A hand-painted sign with beautiful calligraphy reads: |wFor Rent. See Dabbler for details.|n +# +@set sign/inside = "For Rent. See Dabbler for details." +# +@lock sign = get:false() +# Sign:1 ends here + +# Salty Shack +# Let’s keep this pretty empty. + + +# [[file:../../../projects/mud.org::*Salty Shack][Salty Shack:1]] +@teleport/quiet mp15 +# +@dig Salty Shack;mp16 = locked door;door;inside,door to outside;door;outside;leave;exit +# Salty Shack:1 ends here + + + +# And described the exit: + + +# [[file:../../../projects/mud.org::*Salty Shack][Salty Shack:2]] +@desc door = Barnacle encrusted door with rusty irons bands and a comically large padlock. The door sports a hand-painted |Ysign|n that reads: |wFor Rent. See Dabbler for details. +# +@set door/traverse_msg = "The lock opens when you touch it, and the door opens with loud sigh. You step inside and close the door behind you." +# Salty Shack:2 ends here + + + +# And lock the exit: + + +# [[file:../../../projects/mud.org::*Salty Shack][Salty Shack:3]] +@lock door = traverse:tag(open_shack_door, mp) +# +@set door/err_traverse = "The door is obviously locked." +# Salty Shack:3 ends here + + + +# Generic description of the insides of this house: + + +# [[file:../../../projects/mud.org::*Salty Shack][Salty Shack:4]] +@teleport/quiet mp16 +# +@desc here = The shack is curiously bare and devoid of all personality. +# Salty Shack:4 ends here + + + +# And describe the exit: + + +# [[file:../../../projects/mud.org::*Salty Shack][Salty Shack:5]] +@desc door = Large wood door with iron bands. +# +@set door/traverse_msg = "You open the door and step out on the sand, closing the door behind you." +# Salty Shack:5 ends here + # Grotto # Return to the forest: @@ -2709,7 +3004,7 @@ pose gnome/default = smoking his pipe # [[file:../../../projects/mud.org::*Stoat][Stoat:1]] -@create/drop wee beastie;Mochi;stoat: typeclasses.pets.Friendly +@create/drop wee beastie;Mochi;stoat: typeclasses.pets.WeeBeastie # # @typeclass/force/reset wee beastie # Stoat:1 ends here @@ -3152,6 +3447,73 @@ py here.search("cabinet").do_bake() @detail tools = A set of finely crafted tools lies neatly arranged on a velvet cloth: a pair of tweezers for handling delicate ingredients, a small scalpel for precise cutting, and a set of measuring spoons made from silver, each engraved with different symbols representing the elements. # Inside the Secret Room:8 ends here +# Jars +# Can jars be a producer that returns a random jar with a “content”? + +# Every time we look at a jar, we see something else … that we can’t take. This creates ambiance without adding too much complexity? + + +# [[file:../../../projects/mud.org::*Jars][Jars:1]] +@tel/quiet Secret Room +# +@create/drop collection of jars;jars;jar: typeclasses.puzzles.Changling +# Jars:1 ends here + + + +# Can’t get them: + + +# [[file:../../../projects/mud.org::*Jars][Jars:2]] +@lock jars = get:false() +# +@set jars/get_err_msg = "The imp slaps your hand away and shakes his head. While you can take an empty |Ybottle|n, you can't take the currated ingredients. Guess you can always find your own ingredients, eh?" +# Jars:2 ends here + + + +# And the generate description: + + +# [[file:../../../projects/mud.org::*Jars][Jars:3]] +@set jars/desc_first_prefix = "<< Fascinating ^ Interesting ^ Curious >> << collection of ^ assortment of ^ >> << jars ^ contents ^ ingredients >>. You look at one << jar ^ >>, << elegantly ^ hastily ^ legibly ^ >> labeled,|w" +# +@set jars/desc_prefix = "You look at another << jar ^ >>, << elegantly ^ hastily ^ legibly ^ >> labeled,|w" +# +@set jars/desc_postfix = "" +# Jars:3 ends here + + + +# And now for a list of the contents: + + +# [[file:../../../projects/mud.org::*Jars][Jars:4]] +@set jars/descs = ( + "Glimmering Dust|n. A jar filled with fine, shimmering powder that sparkles like a thousand stars.", + "Dragon Blood|n. A deep red liquid that swirls with hints of gold, resembling liquid rubies.", + "Crystalized Stardust|n. Tiny, sparkling crystals that twinkle like stars, believed to hold the essence of the cosmos.", + "Moonstone Crystals|n. Iridescent stones that glow softly in the dark, casting a gentle light.", + "Bottled Lightning|n. A swirling blue liquid that crackles with energy, contained within a glass jar.", + "Dragon Scale Powder|n. A fine, metallic powder that shifts colors with the light, reminiscent of dragon scales.", + "Mermaid Tears|n. Tiny, glistening droplets that resemble diamonds, each one capturing a moment of sorrow.", + "Essence of Shadow|n. A dark, swirling liquid that seems to absorb light, creating an eerie atmosphere.", + "Shadow Essence|n. A dark, swirling liquid that absorbs light, said to grant invisibility.", + "Starflower Petals|n. Delicate, translucent petals that shimmer like the night sky, layered in a glass jar.", + "Whispering Seeds|n. Tiny, dark seeds that seem to rustle softly when the jar is moved, as if alive.", + "Golden Sand|n. A jar filled with fine, shimmering sand that glows warmly, reminiscent of a sunset.", + "Wisp of Smoke|n. A swirling, grayish substance that drifts lazily within the confines of its jar.", + "Nightshade Berries|n. Dark, glossy berries that glisten ominously, nestled in a jar of dark liquid.", + "Phoenix Ashes|n. A fine, gray powder that sparkles faintly, as if containing remnants of a fiery rebirth.", + "Silver Thread|n. A spool of shimmering thread that glows softly, appearing almost ethereal in nature.", + "Timekeeper Sand|n. A jar filled with golden sand that flows slowly, as if measuring the passage of time.", + "Elven Wine|n. A deep green liquid that sparkles with tiny bubbles.", + "Ghostly Essence|n. A pale, translucent ichor that swirls with a soft glow.", + "Celestial Oil|n. A shimmering oil that glows with a soft light.", + "Cat Shadow|n. A swirling, inky blackness that pulses and shifts.", + ) +# Jars:4 ends here + # Stool # A stool to sit while working