diff --git a/README.md b/README.md
index fe62bd3..70b6fa1 100644
--- a/README.md
+++ b/README.md
@@ -1,40 +1,123 @@
-# Welcome to Evennia!
+# Welcome to the World of Moss and Puddles
-This is your game directory, set up to let you start with
-your new game right away. An overview of this directory is found here:
-https://github.com/evennia/evennia/wiki/Directory-Overview#the-game-directory
+This contains the code, based on the [Evennia game engine][1] for
+running a Multiuser Shared Story Experiment (MUSSE).
-You can delete this readme file when you've read it and you can
-re-arrange things in this game-directory to suit your own sense of
-organisation (the only exception is the directory structure of the
-`server/` directory, which Evennia expects). If you change the structure
-you must however also edit/add to your settings file to tell Evennia
-where to look for things.
+The details in this document are technical and assume proficiency with
+a Terminal emulator, e.g. `Terminal` app on MacOS and `PowerShell` on
+Windows.
-Your game's main configuration file is found in
-`server/conf/settings.py` (but you don't need to change it to get
-started). If you just created this directory (which means you'll already
-have a `virtualenv` running if you followed the default instructions),
-`cd` to this directory then initialize a new database using
+## Running Locally
+
+These instructions assume that you have [Git][2] installed,
+and you can `clone`this repository.
+
+ git clone https://howardabrams.com/git/howard/moss-n-puddles
+
+This may be a slight chicken/egg scenario, since I store this file in
+the repository.
+
+To get a local copy running on your system, follow these steps.
+
+### Install Python
+
+Follow the [online instructions][3] if you don't have the Python
+language engine installed.
+
+### Create Virtual Environment (Optional)
+
+While optional, you may not want to pollute your global Python
+environment, so create a "virtual environments" to insure that module
+libraries don't compete.
+
+ python -m venv .venv
+
+For further details on this, follow these instructions:
+https://www.geeksforgeeks.org/python/create-virtual-environment-using-venv-python/
+
+### Activate the Virtual Environment (Optional)
+
+Each time you enter this directory folder, `activate` the virtual
+environment with the command:
+
+ source .venv/bin/activate
+
+To make this easier, you can install [direnv][4].
+
+### Install Support Modules
+
+Install [Evennia][1] and other needed modules with the command:
+
+ pip install -r requirements.txt
+
+### Configure Database
+
+Before you can start this program, you need to initialize the database
+using the command:
evennia migrate
-To start the server, stand in this directory and run
+Any time you want to re-initialize the database from scratch, type:
+
+ rm server/evennia.db
+
+To make my life easier, I issue:
+
+ cp server/evennia-reset.db3 server/evennia.db3
+
+### Start the Server
+
+Start the server with the command:
evennia start
-This will start the server, logging output to the console. Make
-sure to create a superuser when asked. By default you can now connect
-to your new game using a MUD client on `localhost`, port `4000`. You can
-also log into the web client by pointing a browser to
-`http://localhost:4001`.
+When you first do this, you will need to create a account for the
+superuser account, we call **The Avatar**. The question about email is
+optional.
-# Getting started
+You can stop the server using the command: `evennia stop`
-From here on you might want to look at one of the beginner tutorials:
-http://github.com/evennia/evennia/wiki/Tutorials.
+### Load the World
-Evennia's documentation is here:
-https://github.com/evennia/evennia/wiki.
+Log into the system. The easiest way is to use a browser and this URL:
-Enjoy!
+ http://localhost:4001
+
+You can also use a MUD client connecting to the `localhost` on port 4000.
+
+You will need to connect with the user and password you created in the
+Terminal (described above).
+
+At this point, you won't see anything because the database is empty.
+To populate the world, type the following command in the game (not in
+your Terminal window):
+
+ batchcommand version1.ev
+
+A lot of text will fly by and it [recreates the world][9] described in
+[Org-formatted document](moss-n-puddles.org). Those are my *notes* for
+the game, which I should probably clean up for public consumption. You
+will probably want to use [Emacs][5] get the most out of that text
+document.
+
+Check out [my map](moss-n-puddles-map.svg) I made (shame this isn't
+dynamically generated).
+
+## Technical Details
+
+Peruse the [directory structure overview][6].
+
+Read the logs in the file: `server/logs/server.log`
+
+You might want to look at Evennia's [beginner tutorials][7], or the
+complete [documentation][8].
+
+ [1]: evennia.com
+ [2]: git-scm.com
+ [3]: https://www.python.org/downloads/windows/
+ [4]: direnv.net
+ [5]: https://www.gnu.org/software/emacs
+ [6]: https://github.com/evennia/evennia/wiki/Directory-Overview#the-game-directory
+ [7]: http://github.com/evennia/evennia/wiki/Tutorials.
+ [8]: https://github.com/evennia/evennia/wiki
+ [9]: moss-n-puddles.html
diff --git a/moss-n-puddles-map.svg b/moss-n-puddles-map.svg
new file mode 100644
index 0000000..0ab46ac
--- /dev/null
+++ b/moss-n-puddles-map.svg
@@ -0,0 +1,157 @@
+
+
diff --git a/moss-n-puddles.org b/moss-n-puddles.org
new file mode 100644
index 0000000..0d803f4
--- /dev/null
+++ b/moss-n-puddles.org
@@ -0,0 +1,7211 @@
+#+TITLE: Wonderful World of Mud : Moss and Puddles Edition
+#+AUTHOR: Howard Abrams
+#+EMAIL: howard@howardabrams.com
+#+DATE: 2025-01-18 Sat
+#+LASTMOD: [2025-01-18 Sat]
+#+FILETAGS: projects computer technical evennia
+#+STARTUP: inlineimages
+#+PROPERTY: header-args:evennia :tangle ~/src/moss-n-puddles/world/version1.ev :comments both
+#+PROPERTY: header-args:tcl :tangle ~/src/moss-n-puddles/world/test-run.exp
+#+PROPERTY: header-args:yaml :tangle ~/src/moss-n-puddles/world/hints.yaml
+#+PROPERTY: header-args :results none :eval no-export :comments no
+
+
+ - [ ] Create goggles to show /gold tint/, and remove the /tint/ otherwise
+ - [ ] Create /Picker/, the goblin janitor that sweeps through land, deleting all items that /should not/ be there.
+ - Should I have a YAML file that lists what /should/ be in each room?
+ - Would the file also show the order and what rooms to follow?
+ - Perhaps he moves it to tunnels under the Lair?
+ - [ ] Create /Peddler/, the goblin, and his Emporium and Home Furnishings
+ - A new =buy= command that exchanges money for an item.
+ - Need a sign with the items and money … come from a YAML file?
+ - [ ] The Troll’s gambling den … part of the bar? under the bridge?
+
+* Evennia Server
+** Background
+While I believe I could use any MUD server, I’m trying out [[https://www.evennia.com/][Evennia]]. Based on Python, but I won’t hold that against it. Evennia comes up fast, has great features, and good documentation. Python-based projects inspires people, I guess. This file started out as my /notes/ about the process, but grew. Started with writing the Evennia commands I used to create my world (wasn’t sure if when I needed to wipe the database), but realized I could /tangle/ these commands (in org blocks) to an =.ev= file that I could load with the =batchcommands= command. I organized this file mostly around the “rooms” in the game, with “objects” nested inside. Next, I added YAML snippets to create the hint file (since the hints are based on the room location). Then, I included [[Testing the World Experience][Expect/Tcl code]] to have a /test character/ walk through the game testing the features I coded.
+
+When I decided to expand my world to be more /role play centric/, I created a [[file:mud-rpg.org][mud-rpg.org]] file, that tangles its code to =version2.ev=. Then, when adding escape rooms, I created [[file:mud-adventure.org][mud-adventure.org]], and tangle it to =adventure1.ev=.
+** Installation
+Follow the online instructions for Evennia:
+
+#+BEGIN_SRC sh
+ pip install cryptography paramiko evennia ipython requests
+#+END_SRC
+
+Seems like the SSL with the telnet protocol, install:
+
+#+BEGIN_SRC sh
+ pip install pyopenssl
+#+END_SRC
+
+For SSH, do:
+
+#+BEGIN_SRC sh
+ pip install paramiko service_identity
+#+END_SRC
+
+I was hoping that the databases between my local world and the one on my server would /sync/. Wishful thinking, so to start over, delete =server/evennia.db= and issue:
+
+#+BEGIN_SRC sh
+ evennia migrate
+#+END_SRC
+
+Feel free to delete the old database in order to restart (as this file should contain everything we need).
+
+#+BEGIN_SRC sh
+ mv server/evennia.db3 server/evennia-v1.db3
+#+END_SRC
+
+And then start or restart (or reload, I think):
+
+#+BEGIN_SRC sh
+ evennia start
+#+END_SRC
+
+** Shell
+Start the shell to test Python changes in a REPL. Note: If the Evennia /virtual environment/ contains =ipython=, it can use it as its shell.
+
+#+BEGIN_src evennia :tangle no
+evennia shell
+#+end_src
+
+Load all the necessary libraries to make REPL stuff workable. This could be tangled to =~/.conf/ipython/profiles/default.py= so the libraries would be available to that shell.
+
+#+BEGIN_SRC python :tangle no
+from typeclasses.characters import Character
+#+end_src
+
+And set some good variables:
+
+#+BEGIN_SRC python :tangle no
+me = Character.characters.searchdbref("#1")
+#+end_src
+
+** Create an Avatar
+The first character is special, as it can really /own/ the server. I don’t use it except to build the world, otherwise, I will puppet a creation.
+
+An avatar in the original sense of a housing for a god-like entity.
+
+#+BEGIN_src evennia
+ @name self = Avatar
+#+END_SRC
+
+#+BEGIN_src evennia
+ @setdesc A translucent being of light and energy. The surrounding world seems vivid and vibrant as it basks in the radience.
+#+END_SRC
+
+#+BEGIN_src evennia
+ @sdesc angelic being
+#+END_SRC
+
+And to pose:
+
+#+BEGIN_src evennia
+ py self.db.pose = True
+ #
+ pose looking awesome
+#+END_SRC
+
+* World: Moss and Puddles
+** Starting Introduction
+Would love to have the following /introduction/. Done by editing [[file:~/src/moss-n-puddles/server/conf/connection_screens.py::CONNECTION_SCREEN = """][connection_screens.py]]:
+
+#+begin_example
+Wha...what is this place?
+
+You followed his instructions. Head to the Gladstone city park, and on the woodsy side, turn left at the lamp post. Peer in the brambles and when you see the red handkerchief tied to branch, follow it ...
+
+Just keep following the red kerchiefs, until...
+#+end_example
+
+To give someone a special _log on_ message the /first time/, I have updated the =Character= [[file:~/src/moss-n-puddles/typeclasses/characters.py::def at_object_creation(self):][creation function]] to give them a letter.
+
+I also thought they could type =help start=, to see, but this is easier to [[file:~/src/moss-n-puddles/world/help_entries.py][edit in source]].
+
+** Title Sequence
+
+#+begin_example
+• ▌ ▄ ·. .▄▄ · .▄▄ · ▄▄▄· ▐ ▄ ·▄▄▄▄
+·██ ▐███▪▪ ▐█ ▀. ▐█ ▀. ▐█ ▀█ •█▌▐███▪ ██
+▐█ ▌▐▌▐█· ▄█▀▄ ▄▀▀▀█▄▄▀▀▀█▄ ▄█▀▀█ ▐█▐▐▌▐█· ▐█▌
+██ ██▌▐█▌▐█▌.▐▌▐█▄▪▐█▐█▄▪▐█ ▐█ ▪▐▌██▐█▌██. ██
+▀▀ █▪▀▀▀ ▀█▄▀▪ ▀▀▀▀ ▀▀▀▀ ▀ ▀ ▀▀ █▪▀▀▀▀▀•
+ ▄▄▄·▄• ▄▌·▄▄▄▄ ·▄▄▄▄ ▄▄▌ ▄▄▄ ..▄▄ ·
+ ▐█ ▄██▪██▌██▪ ██ ██▪ ██ ██• ▀▄.▀·▐█ ▀.
+ ██▀·█▌▐█▌▐█· ▐█▌▐█· ▐█▌██▪ ▐▀▀▪▄▄▀▀▀█▄
+ ▐█▪·•▐█▄█▌██. ██ ██. ██ ▐█▌▐▌▐█▄▄▌▐█▄▪▐█
+ .▀ ▀▀▀ ▀▀▀▀▀• ▀▀▀▀▀• .▀▀▀ ▀▀▀ ▀▀▀▀
+#+end_example
+** Map Locations
+
+#+begin_src pikchr :file moss-n-puddles-map.svg :results file :exports both :dark-mode
+ # bgcolor = 0x1d2021
+ # fgcolor = 0xeeeeee
+
+ Prairie: box rad 5px "Prairie" "(mp14)"
+
+ # Top row:
+ Bedroom: box rad 5px "Bedroom" "(mp13)" at 1 below Prairie
+ arrow <-> "up" "down"
+ CozyRoom: box thick rad 5px "Cozy Room" "(mp03)"
+ move
+ Boulder: box rad 5px "Boulder Top" "(mp02)"
+ move
+ Lair: box rad 5px "Lair" "(mp07)"
+ move
+ Bar: box thick rad 5px "Wyldwood" "Bar" "(mp10)"
+
+ Tunnel: box rad 5px "Dark Tunnel" "(mp20)" at 1 above Lair
+
+ # Second row:
+ Kitchen: box rad 5px "Cramped" "Kitchen" "(mp11)" at 1 below Bedroom
+ move
+ Grotto: box rad 5px "Grotto" "(mp04)"
+ arrow <-> "east" "west"
+ Grove: box thick thick rad 5px "Matriarch" "Grove" "(mp01)"
+ arrow <-> "east" "west"
+ Meadow: box rad 5px "Frog" "Meadow" "(mp05)"
+ arrow <-> "east" "west"
+ Glade: box rad 5px "Glittering" "Glade" "(mp19)"
+
+ # Third row:
+ Secret: box rad 5px "Secret" "Room" "(mp12)" at 1 below Kitchen
+ move
+ Shore: box rad 5px "Sandy" "Shore" "(mp15)"
+ arrow <->
+ Dock: box rad 5px "Lazy" "Dock" "(mp06)"
+ move
+ Marsh: box rad 5px "Mellow" "Marsh" "(mp08)"
+
+ # Fourth row:
+ Shack: box rad 5px "Old" "Shack" "(mp16)" at 1 below Shore
+ move
+ Boat: box rad 5px "Boat &" "Islands" "(grXX)"
+ move
+ Hut: box rad 5px "Homey" "Hut" "(mp09)"
+
+ OOB: circle thick "Deep" "Forest" "(mp00)" fit at 1.5 right of Prairie
+ arrow -> thin from OOB.se to 0.65 right of CozyRoom to Grotto.ne
+
+ arrow <-> " wardrobe" ljust from Prairie.s to Bedroom.n
+ arrow <-> " ladder" above ljust "trapdoor " below rjust from Tunnel.s to Lair.n
+ arrow <-> "archway" aligned above from Kitchen.n to CozyRoom.sw
+ arrow <-> "?? " rjust from Secret.ne to CozyRoom.sw
+ arrow <-> "red " rjust " door" ljust from CozyRoom.s to Grotto.n
+ arrow <-> " climb" ljust from Boulder.s to Grove.n
+ arrow <-> " south" above ljust "north " below rjust from Grove.s to Dock.n
+ arrow <-> "waterfall " rjust from Lair.s to Meadow.n
+ arrow <-> " south" above ljust "north " below rjust from Meadow.s to Marsh.n
+ arrow <-> "?? " rjust from Marsh.s to Hut.n
+ arrow <-> "?? " rjust from Dock.s to Boat.n
+ arrow <-> "door " rjust from Shore.s to Shack.n
+ arrow <-> "blue door" from Bar.s to Glade.n
+#+end_src
+
+[[file:mud-map.svg]]
+** Testing the World Experience
+Using the infamous [[https://core.tcl-lang.org/expect/index][Tcl/Expect system]], I can log on with a /test account/ and use it to generate commands and validate the output.
+
+#+BEGIN_SRC tcl :shebang #!/usr/bin/expect :chmod 0755
+ # Set timeout for expect commands
+ set timeout 30
+
+ # Open the log file
+ log_file results.txt
+#+END_SRC
+
+If I don’t find what I’m looking for, instead of just /continuing/, I want it to fail. I create the =expectit= function as a replacement for =expect=:
+
+#+BEGIN_SRC tcl
+ # Rename the original 'send' to 'real_send'
+ rename send real_send
+
+ # Define a new 'send' procedure
+ proc send {args} {
+ puts -nonewline ">> "
+ flush stdout
+ # 'uplevel' ensures it executes in the right context
+ uplevel 1 real_send $args
+ }
+
+ proc expectit {pattern} {
+ expect {
+ $pattern {
+ return
+ }
+ timeout {
+ puts "ERROR: Expected response '$pattern' not received."
+ send "quit\n"
+ exit 1
+ }
+ eof {
+ puts "ERROR: Connection closed unexpectedly."
+ send "quit\n"
+ exit 1
+ }
+ }
+ }
+#+END_SRC
+
+Since some objects in my world /don’t/ appear until /triggered/, I would like to test for that /negative/ case, but I don’t know Expect well enough to figure that out programmatically, so I create a function, and call out what to /visually look at/:
+
+#+BEGIN_SRC tcl
+ proc dont_expect {trigger pattern} {
+ send "look\n"
+ puts "NOTE: At this point, ** $pattern ** should not be here!"
+ }
+#+END_SRC
+
+That is, until I can get the following code to work:
+
+#+BEGIN_SRC tcl :tangle no
+ proc dont_expect {trigger pattern} {
+ send "look\n"
+ puts "Entering dont_expect with trigger: '$trigger' and pattern: '$pattern'"
+ expect {
+ -re {.*$trigger.*$pattern.*} {
+ puts "FAILURES!"
+ send "quit\n"
+ exit 1
+ }
+ -re {.*$trigger.*} {
+ puts "Goodness"
+ }
+ timeout {
+ puts "Error: Expected output not received within the timeout period."
+ send "quit\n"
+ exit 1
+ }
+ eof {
+ puts "Error: Connection closed unexpectedly."
+ send "quit\n"
+ exit 1
+ }
+ }
+ }
+#+END_SRC
+
+I would like to log on locally via =telnet= and on my /real server/ using =ssh=, so a command line option, =there= tells me what to =spawn=:
+
+#+BEGIN_SRC tcl
+ # Get command line parameters
+ set there [lindex $argv 0] ; # First parameter (boolean) here/there
+ set tutorial [lindex $argv 1] ; # Second parameter (optional) yes/no
+ set create [lindex $argv 2] ; # Third parameter (optional) yes/no
+
+ if {$there eq "there"} {
+ spawn ssh -p 4004 user@howardabrams.com
+ # Handle the un-used password prompt:
+ expectit "password:"
+ send "\r" ; # Send an empty password
+ } else {
+ spawn telnet localhost 4000
+ }
+#+END_SRC
+
+The testing account is currently the =guest= account:
+
+#+BEGIN_SRC tcl
+ # Handle the prompt after logging in
+ expectit "enclose it in quotes"
+
+ if {$create eq "true"} {
+ send "create rob backinqa\n"
+ expectit "Is this what you intended?"
+ send "y\n"
+ expectit "You can now log with the command"
+ }
+
+ send "connect rob backinqa\n"
+
+ if {$create eq "true"} {
+ expectit "begin creating your character"
+ send "\n"
+
+ expectit "Let's begin with a two or three word description"
+ send "spry goblin\n"
+
+ expectit "Specifying the gender"
+ send "n\n"
+
+ expectit "Enter an initial pose"
+ send "curiously looking at everything\n"
+
+ expectit "Enter your character's full description"
+ send "A short, skinny goblin wearing a dirty tunic cinched with an elaborate belt bejeweled with gems and gold filigree. Unclear whether his green ears or nose are longer, but surely it must be the few hairs he combs over on top of his head.\n"
+
+ expectit "Enter a name here to check if it's available."
+ send "Speedy Gonzoblin\n"
+
+ expectit "Shall I create your character"
+ send "y\n"
+ } else {
+ send "sdesc spry goblin\n"
+ expectit "sdesc was set"
+
+ send "pose zipping about\n"
+ expectit "Pose will read"
+ }
+#+END_SRC
+
+Note that creating the testing character is not sufficient in and of itself (works the first time, obviously), but while it is logged in, we need to give the command:
+
+#+BEGIN_src evennia :tangle no
+ @teleport/quiet mp01
+ #
+ @set goblin/guest_account = True
+#+END_SRC
+
+How much of the tutorial do we want to test?
+
+#+BEGIN_SRC tcl
+ if {[string match "tutor*" $tutorial]} {
+ # Handle the game command prompt
+ expectit "In this story game, you type commands"
+ send "look\n"
+
+ # Handle the prompt to examine the puddle
+ expectit "You can now type"
+ send "look puddle\n"
+
+ # Handle the response about flying
+ expectit "Yes, I could fly myself"
+ send "look boulder\n"
+
+ # Handle the prompt about climbing the boulder
+ expectit "You can climb this boulder!"
+ send "climb\n"
+
+ # Handle the prompt about typing
+ expectit "Go ahead, just typing"
+ send "say Hello there, little birdie.\n"
+ } else {
+ expectit "perches on your shoulder"
+ }
+#+END_SRC
+
+At this point, stop the bird shenanigans, and get moving…
+
+#+BEGIN_SRC tcl
+ # That should be enough of the birdie ...
+ send "shoo\n"
+#+END_SRC
+
+Let’s get the server’s =time=, as we can use this information to adjust our tests.
+
+#+BEGIN_SRC tcl
+ # Send the time command and handle the response
+ expectit "Have fun, and I'll leave you here"
+
+ send "time\n"
+ expect {
+ "in the evening" {
+ set phase "evening"
+ }
+ "in the afternoon" {
+ set phase "afternoon"
+ }
+ "in the morning" {
+ set phase "morning"
+ }
+ "in the night" {
+ set phase "night"
+ }
+ timeout {
+ puts "ERROR: Expected time response not received."
+ send "quit\n"
+ exit 1
+ }
+ }
+#+END_SRC
+
+Let’s get building this world!
+** The Grove of the Matriarchs
+Rename the Limbo (or starting place) with the name *Grove of the Matriarchs*. Note the term =mp01= as a global label that matches my map. My original term for “forest” is too general, as it sounds like the place should be /named/ with some sort of title.
+
+#+BEGIN_src evennia
+ @name here = Grove of the Matriarchs;mp01
+#+END_SRC
+
+The description will take advantage of the /seasons/ and /times/ of the day:
+
+#+BEGIN_src evennia
+ @desc here = A giant, moss-covered |Yboulder|n hides a |Yhollow recess|n as it stands among immense |Ytrees|n that etch the sky and slice the clouds in the darkening twilightawakening dawnlazy afternoonnight sky. With the morning light, you can hear the dawn chorus of birdsThe afternoon breeze carries the buzzing of insects around giant colorful |Yflowers|nYou can't hear much now as most of the forest creatures are settling down for the nightIn the darkness, you can hear crickets and an occasional owl. A footpath winds around the giant, moss-covered tree roots to the East and West. To the south, a dock juts into a lavender sea.
+#+end_src
+
+And a brief test of the time states in the output of the =look= command:
+
+#+BEGIN_SRC tcl
+ send "look\n"
+
+ # Expect different responses based on the phase variable
+ switch $phase {
+ "evening" {
+ expect "darkening twilight"
+ }
+ "afternoon" {
+ expect "lazy afternoon"
+ }
+ "morning" {
+ expect "awakening dawn"
+ }
+ "night" {
+ expect "night sky"
+ }
+ default {
+ puts "ERROR: Unexpected phase value '$phase'."
+ send "quit\n"
+ exit 1
+ }
+ }
+#+END_SRC
+
+Need to add weather and time data to this:
+#+begin_src evennia
+ @update here = typeclasses.rooms_weather.TimeWeatherRoom
+#+end_src
+
+Derived from the original [[~/src/moss-n-puddles/.venv/lib/python3.12/site-packages/evennia/contrib/tutorials/tutorial_world/rooms.py][rooms.py]], but now stored in [[file:~/src/moss-n-puddles/typeclasses/rooms_weather.py][rooms_weather.py]].
+
+Describe the trees, flowers, and of course, the alcove:
+
+#+BEGIN_src evennia
+ @detail tree;trees = You feel dwarfed by colossal trees whose moss-covered roots are difficult to peer over. An occassional breeze often smells of flowers and at other times earthy. While the leafy canopy hides the sky, you certainly can |wfeel|n the weather.
+ #
+ @detail flower;flowers = Beautiful, but giant flowers look down on you and nod a friendly greeting.
+ #
+ @detail hollow recess;recess;hollow;alcove = Underneath the boulder, you see a dry alcove full of mushrooms. On the largest, is a |Yleather-bound book|n.
+#+END_SRC
+
+We don’t need to test all the =details=, but the first one:
+
+#+BEGIN_SRC tcl
+ send "look trees\n"
+ expectit "You feel dwarfed by colossal trees"
+
+ send "look flowers\n"
+ expectit "Beautiful, but giant flowers look down on you and nod a friendly greeting."
+#+END_SRC
+
+And an image for it.
+
+#+begin_example
+Generate a watercolor with pen and ink outlining in vibrant colors, depicting a
+path meandering between the roots of tall trees past a giant boulder covered in moss and vines of ivy.
+There is a puddle by the path.
+Under the roots of a tree is a large mushroom supporting an opened book and a feather quill.
+The style should have elements of fantasy.
+#+end_example
+*** Barkbinder the Tree
+When you first log into the game, you can immediately chat with an unfriendly, overly boring tree.
+#+BEGIN_SRC evennia
+ @create/drop tree;trees: typeclasses.chatbots.ChatBot
+ #
+ @set tree/gender = "neutral"
+ #
+ @set tree/pose = "contemplating...or sleeping"
+ #
+ @set tree/pose_sleep = "contemplating...or sleeping"
+#+END_SRC
+
+Then wake it.
+
+#+BEGIN_SRC evennia
+ py tree = me.search("tree") ; tree.sdesc.add("especially large tree") ; tree.backstory("tree")
+#+END_SRC
+
+
+*** Hints
+What about /hints/? Since this is the /first room/, I didn’t want it complicated or clever, but we could mention that they should =look boulder=:
+
+#+BEGIN_SRC yaml
+ ---
+ grove_of_the_matriarchs:
+ narrative: >-
+ << Bubba Joe Washington ^ That cockatiel >> returns, and perches on your shoulder,
+ "Heya," it chirps. "I know I gave you a lot of information when you started.
+ So here's a bit of a hint. {0} Good luck, again." It flies off.
+ hints:
+ default: >-
+ Look at everything. For instance, if you |glook boulder|n you
+ might notice something new that becomes available.
+#+END_SRC
+
+And we can have our test account verify that =hint= works:
+
+#+BEGIN_SRC tcl
+ send "hint\n"
+ expectit "Look at everything"
+#+END_SRC
+
+*** Puddle
+With my name, I need to have an object to go with it.
+
+#+BEGIN_src evennia
+ @create/drop puddle : typeclasses.things.Puddle
+#+END_SRC
+
+And an elusive description:
+
+#+BEGIN_src evennia
+ @desc puddle = A large puddle, formed from a recent rain shower, invites you to shed your years and |gjump|n in and splash around to reconnect with your youth.
+#+END_SRC
+
+And keep it locked down:
+
+#+BEGIN_src evennia
+ @lock puddle = get:false()
+ #
+ @set puddle/get_err_msg = "As the water slips through your fingers, you realize the apt metaphor of attempting to grasp at your youth."
+#+END_SRC
+
+And a test of our ability to jump in the puddle:
+
+#+BEGIN_SRC tcl
+ send "look puddle\n"
+ expectit "A large puddle"
+
+ send "get puddle\n"
+ expectit "As the water slips through your fingers"
+
+ send "jump\n"
+ expectit "You jump in the puddle!"
+#+END_SRC
+
+*** Sticks
+I will have a script auto generate the sticks on a regular basis, but for now, let’s just make one that I can drop.
+
+#+BEGIN_src evennia
+ py timed_script = evennia.create_script(key="Create Sticks",
+ typeclass='typeclasses.scripts.CreateSticks',
+ interval=86800, # more than a day
+ start_delay=False, # wait interval before first call
+ autostart=True,
+ attributes=[("destination", here)] )
+#+END_SRC
+
+And let’s see if the stick behaves:
+
+#+BEGIN_SRC tcl
+ send "get stick\n"
+ expect {
+ "Could not find 'stick'." {
+ # Print warning in red
+ # send_user "\033[31mNo stick, check the stick script.\033[0m\n"
+ send_user "No stick, check the stick script.\n"
+ }
+ "You pick up a stick." {
+ # If stick is found, throw it
+ send "throw stick\n"
+ expect "it comes back to you"
+
+ send "drop stick\n"
+ expect "You drop a stick."
+ }
+ timeout {
+ puts "ERROR: Expected response for 'get stick' not received."
+ send "quit\n"
+ exit 1
+ }
+ }
+#+END_SRC
+
+*** Guest Book
+Players can leave messages in this book. We’ll see how long I want to leave this.
+
+#+BEGIN_src evennia
+ @create/drop guest book:typeclasses.readables.WriteableBook
+ #
+ @set guest book/inside = "file:world/guest-book.md"
+ #
+ @set guest book/prefix = "You open the leather-bound book, and begin to read from page one..."
+#+END_SRC
+
+Note that we don’t mention this in the area’s description.
+
+#+BEGIN_src evennia
+ @desc guest book = In a hollow recess underneath the boulder, you find a leather-bound book entitled |wGuest Book|n perched atop a giant mushroom. Protected from the elements, this natural desk includes a feather |Yquill|n and an |Yink|n |Ywell|n inviting you to |gread|n and even |gwrite|n a note for other travelers.
+#+END_SRC
+
+Can’t get it:
+
+#+BEGIN_src evennia
+ @lock guest book = get:false()
+ #
+ @set guest book/get_err_msg = "The owner designed a guest book to be read and written by guests. Pocketing it for selfish interests sort of defeats the purpose."
+#+END_SRC
+
+And some details:
+
+#+BEGIN_src evennia
+ @detail quill = The black feathered quill may once belonged to a raven, but if so, it must have been large.
+ #
+ @detail ink = Black, like the ichor of the gods ... or perhaps, someone just started a squid.
+ #
+ @detail well;ink well = The well appears to be little more than a depression on the back of the mushroom's cap.
+#+END_SRC
+
+How should the book start?
+
+#+begin_src markdown :tangle ~/src/moss-n-puddles/world/guest-book.md
+ # Introduction
+
+ For repayment of a boon, The Summer Queen granted a charter to me, The
+ Dabbler, for the land between the two trees, |wErui|n and |wVedui|n,
+ and what you see comprise the results, |wMossydór|n. I can't be blamed
+ that while siblings, both trees detest each other, and work to retreat
+ from each other's company, expanding my domain.
+
+ If you have arrived here through trials and travels, please leave us a
+ note, introducing yourself and your land of origin. And
+ |walatulya|n, that is, welcome.
+
+ > From: Dabber
+ > User: howard
+
+ # Flicker Glimmerwing
+
+ What a nice place. I come from a land called Delight, but I'm not sure
+ how I came here. If any one reads this, do you think we can do
+ something about the rain? Bit dreary, don't you think?
+
+ Please don't tell the owner of the hut that I |wborrowed|n her horn,
+ and used it to travel over the Lavender Sea. I promise I'll return it
+ when I'm done adventuring.
+
+ Also, what's up with the monster in the meadow? Friend or foe?
+
+ --Flicker Glimmerwing, Esq.
+
+ > User: darol
+
+ # Chomper
+
+ Good place. Wet place. Where food? Berries not food.
+
+ Beast in field like berries. Nice fellow.
+
+ --Tealees Tahloos-ah
+
+ > User: rick
+
+ # Sir Roblees
+
+ As a humble vassal of Her Magnificence, the Summer Queen and a
+ knight-errant of the Seelie Court, I bring news of a rare celestial
+ event, the Starflowers will bloom under the light of the next full
+ moon. The Queen Titania has decreed a Festival including grand
+ tournaments of skill and wit, to compete for the favor of the court.
+
+ If interested, please meet me in the Wyldwood Bar. I am the good
+ looking one with the shiny jacket and magical sword.
+
+ --Sir Roblees
+
+ > User: george
+#+end_src
+
+Let’s test that we can read the book:
+
+#+BEGIN_SRC tcl
+ send "look book\n"
+ expectit "In a hollow recess underneath the boulder"
+
+ send "look quill\n"
+ expectit "The black feathered quill may once belonged to a raven"
+
+ send "look ink\n"
+ expectit "Black, like the ichor of the gods"
+
+ send "look ink well\n"
+ expectit "The well appears to be little more than a depression"
+
+ send "read book\n"
+ # expect -re "You open the leather-bound book, and begin to read\[.\n\r\]*For repayment of a boon, The Summer Queen"
+ expectit "You open the leather-bound book, and begin to read"
+ expectit "For repayment of a boon, The Summer Queen"
+
+ expectit "revious"
+ # quit reading the book:
+ send "q\n"
+ expectit "Exited pager"
+ sleep 1
+
+ send "get book\n"
+ expectit "The owner designed a guest book to be read and written by guests"
+#+END_SRC
+
+*** Hidden Things
+
+When we look at something hidden, i.e. the /thing/ has a view lock of a particular tag, and if so, we interpret this as ‘since you are looking at something by name, you /now/ can see it.’ We give the looker the right to see it from now on.
+
+To use this to hide an object, add the following lock:
+
+#+BEGIN_src evennia :tangle no
+ @lock thing = view:tag(hidden_thing)
+#+END_SRC
+
+Where /thing/ is the single name of the hidden object. Find the code [[file:~/src/moss-n-puddles/typeclasses/objects.py::o][in objects.py]].
+
+#+BEGIN_src evennia :tangle no
+ @create/drop duck
+ @set duck/hidden_tag = "hidden_ducky"
+ @lock duck = view:tag(hidden_ducky)
+ look duck
+#+END_SRC
+
+*** Boulder
+More details about the room that describes aspects of the boulder in the =desc= above. First, the symbol:
+#+BEGIN_src evennia
+ @detail symbol = You move an ivy runner to see three curves join together as if it were three legs.
+#+END_SRC
+
+The moss is purdy:
+#+BEGIN_src evennia
+ @detail moss = "Even in this light, the moss radiates a surreal color of green."
+#+END_SRC
+
+And the ivy is … uh.
+#+BEGIN_src evennia
+ @detail ivy = "You see...well, ivy. Uhm, it's green, and..."
+#+END_SRC
+
+The runes use multi-byte Unicode which screws up the =telnet= client.
+#+BEGIN_src evennia
+ @detail runes;rune = The runes read ᛞ ᚪ ᛒ ᛚ ᚱ
+#+END_SRC
+
+The top of the boulder should be another room, accessible by the =climb=, but maybe it isn’t “seen” until the boulder has been looked? First, we put some weather at the top of the boulder:
+
+#+BEGIN_src evennia
+ @dig Boulder Top;mp02 : typeclasses.rooms_weather.TimeWeatherRoom = climb boulder;boulder;climb,climb down;climb;down
+#+END_SRC
+
+The ability to /climb/ the boulder isn’t immediately obvious, so let’s make it a bit of a secret:
+#+BEGIN_src evennia
+ @desc boulder = A boulder with patches of |Ymoss|n and delicate clover. A carved |Ysymbol|n and even some |Yrunes|n try to hide behind rope-like |Yvines|n and tendrils of |Yivy|n as if keeping a secret.|/|/You notice a foot hold, and then another. You can |Gclimb|n this boulder!
+#+END_SRC
+
+To take advantage of our [[Hidden Things]], we put the right tag on it:
+#+BEGIN_src evennia
+ @set boulder/hidden_tag = "hidden_boulder"
+ #
+ @lock boulder = view:tag(hidden_boulder)
+#+END_SRC
+
+And give it some aliases:
+#+BEGIN_src evennia
+ @name boulder = climb the boulder;boulder;climb;climb up;climb boulder
+#+END_SRC
+
+And a description:
+#+BEGIN_src evennia
+ @set boulder/traverse_msg = "You grab hold of some the |Yvines|n and ivy and pick your way up the boulder from one hold to another... Hrm, these vines would make a great rope."
+#+END_SRC
+
+And tests to look at all the details;
+
+#+BEGIN_SRC tcl
+ send "look symbol\n"
+ expectit "You move an ivy runner to see three curves join together as if it were three legs."
+
+ send "look moss\n"
+ expectit "Even in this light, the moss radiates a surreal color of green."
+
+ send "look ivy\n"
+ expectit "You see...well, ivy. Uhm, it's green, and..."
+
+ send "look rune\n"
+ expectit "The runes read ᛞ ᚪ ᛒ ᛚ ᚱ"
+ #+END_SRC
+
+Let’s test that the boulder (which we create in the next section), is indeed hidden.
+
+#+BEGIN_SRC tcl
+ dont_expect "Exits" "boulder"
+
+ send "look boulder\n"
+ expectit "You notice a foot hold"
+
+ send "look\n"
+ expect -re "Exits:.*climb.*boulder"
+#+END_SRC
+*** Lower Vines
+In case they attempt to get vines here:
+
+Let’s make a nice spot to sit down on:
+#+BEGIN_src evennia
+ @create/drop dangling vine;vines;vine
+#+END_SRC
+
+With a nice description:
+#+BEGIN_src evennia
+ @desc vines = Strong vines twisted to look like rope. This could be helpful.
+#+END_SRC
+
+Can’t take it here, you have to climb the boulder first:
+#+BEGIN_src evennia
+ @lock vines = get:false()
+ #
+ @set vines/get_err_msg = "The vines are too strong to break or cut. Perhaps they could be detached from the top of the |Yboulder|n?"
+#+END_SRC
+
+Can we hide it too?
+#+BEGIN_src evennia
+ @lock vines = view:tag(hidden_vines)
+ #
+ @set vines/hidden_tag = "hidden_vines"
+#+END_SRC
+
+What about pushing and pulling messages?
+
+#+BEGIN_src evennia
+ @set vines/pull_msg = "You pull the vines, but they don't let go. Perhaps you could detach them if you were on |wtop|n of the |Yboulder|n?"
+ #
+ @set vines/push_msg = "That doesn't seem to do much."
+#+END_SRC
+
+And the vines as well:
+
+#+BEGIN_SRC tcl
+ dont_expect "You notice.*" "vine"
+
+ send "look vine\n"
+ expectit "Strong vines twisted to look like rope"
+
+ send "look\n"
+ expect -re "You notice.*vines"
+
+ send "get vine\n"
+ expectit "The vines are too strong to break or cut."
+
+ send "pull vine\n"
+ expectit "You pull the vines, but they don't let go."
+
+ send "push vine\n"
+ expectit "That doesn't seem to do much."
+#+END_SRC
+** Top of Boulder
+
+Let’s jump to the top of the boulder to proceed:
+#+BEGIN_src evennia
+ @teleport mp02
+#+END_SRC
+
+And to test to see if we can climb the boulder:
+
+#+BEGIN_SRC tcl
+ send "climb boulder\n"
+ expectit "You grab hold of some"
+
+ # Did we arrive?
+ expectit "Boulder Top"
+#+END_SRC
+
+And the description:
+#+BEGIN_src evennia
+ @desc here = While high, the |Ytrees|n still tower over you. Still, a nice view. Lots of patches of |Ymoss|n to |gsit|n down and relax.
+#+END_SRC
+
+More details:
+#+BEGIN_src evennia
+ @detail tree;trees = You feel dwarfed by colossal trees whose moss-covered roots are difficult to peer over. An occassional breeze often smells of flowers and other times earthy. While the leafy canopy hides the sky, you certainly can |wfeel|n the weather.
+#+END_SRC
+
+And a description of the climb:
+#+BEGIN_src evennia
+ @desc climb = The climb seemed easy, but you're not sure you can handle the footholds going the other way around.
+#+END_SRC
+
+And describe the journey:
+#+BEGIN_src evennia
+ @set climb/traverse_msg = "You crawl backwards, feeling with your foot for a hold. Got it! Then another one...hoping the vines and the moss' rhizoids hold..."
+#+end_src
+
+#+BEGIN_SRC tcl
+ send "look trees\n"
+ expectit "You feel dwarfed by colossal trees"
+
+ send "look down\n"
+ expectit "The climb seemed easy, but you're not sure you can handle the footholds going the other way around."
+ #+END_SRC
+
+A description?
+
+#+begin_example
+Generate a watercolor with pen and ink outlining in vibrant colors, depicting the top of a boulder covered in ivy branches and a patch of orange mushrooms.
+Sitting on a patch of moss is a squirrel dressed in Buddhist monk robes with closed eyes in meditation.
+#+end_example
+*** Moss
+Let’s make a nice spot to sit down on:
+#+BEGIN_src evennia
+ @create/drop patch of moss;moss:typeclasses.sittables.Sittable
+#+END_SRC
+
+With a nice description:
+#+BEGIN_src evennia
+ @desc patch of moss = A cushioned patch of moss of the most vibrant green.
+#+END_SRC
+Can’t take the moss with you:
+#+BEGIN_src evennia
+ @lock patch of moss = get:false()
+#+END_SRC
+Can we hide it too?
+#+BEGIN_src evennia
+ @lock patch of moss = view:tag(hidden_moss)
+ #
+ @set patch of moss/hidden_tag = "hidden_moss"
+#+END_SRC
+
+And a lovely message about why you can’t steal moss:
+#+BEGIN_src evennia
+ @set moss/get_err_msg = "The moss is a bryophyte, and as such, has attached itself to boulder by rhizoids, which are one cell thick root structures. While this helps with water absorption, you didn't think you were going to get a biology lesson, did you? tl;dr You can't get it."
+#+END_SRC
+
+Is /pulling/ on moss the same as attempting to =get= it?
+
+#+BEGIN_src evennia
+ @set moss/pull_msg = "The moss is a bryophyte, and as such, has attached itself firmly to boulder by rhizoids. So pulling on it doesn't do much good."
+#+END_SRC
+
+Let’s test if we can sit on the moss:
+
+#+BEGIN_SRC tcl
+ send "look moss\n"
+ expectit "A cushioned patch of moss of the most vibrant green."
+
+ send "sit moss\n"
+ expectit "You sit on the patch"
+
+ # We can't get this stuff:
+ send "get moss\n"
+ expectit "The moss is a bryophyte"
+#+END_SRC
+
+*** Upper Vines
+Let’s cover top of the boulder with rope-like vines. The vine can be a [[file:~/src/moss-n-puddles/typeclasses/consumables.py::class Producer(Object):][producer]] that makes ropes … needed to get into the hut.
+
+#+BEGIN_src evennia
+ @teleport mp02
+ #
+ @create/drop lot of vines;vine;rope: typeclasses.consumables.Producer
+#+END_SRC
+
+With a description:
+
+#+BEGIN_src evennia
+ @desc vines = While difficult to cut, the study and tough vines are easy to pull from this point on the boulder. You could probably make a sturdy rope from them.
+#+END_SRC
+
+We have to have the vines describe what it /makes/:
+
+#+BEGIN_src evennia
+ @set vines/make_name = "coil of rope"
+#+END_SRC
+
+And a verb when they /get/ the consumable:
+
+#+BEGIN_src evennia
+ @set vines/make_verb = "$conj(yank) and $conj(shape) a"
+#+END_SRC
+
+And a commentary:
+
+#+BEGIN_src evennia
+ @set vines/make_note = " from the vines"
+#+END_SRC
+
+This one is optional as it defaults to Consumable:
+#+BEGIN_src evennia
+ @set vines/make_class = "typeclasses.things.Rope"
+#+END_SRC
+
+And the vines needs to know the /description/ of the Consumable, so that it can attach that:
+#+BEGIN_src evennia
+ @set vines/make_desc = "Made from vines, but could be a good lasso."
+#+END_SRC
+
+How much is there when you pick them?
+#+BEGIN_src evennia
+ @set vines/make_amount = 1
+#+END_SRC
+
+What if they do something other than =get= the vines?
+
+#+BEGIN_src evennia
+ @set vines/pull_msg = "You pull the vines, and notice they detach easily from the rock. Perhaps you should |gget|n these and make something with them."
+ #
+ @set vines/push_msg = "You push the vines out of the way showing the rock boulder below. Perhaps you should |gget|n these and make something with them."
+#+END_SRC
+
+Let’s make sure that we can get the vines from this producer:
+
+#+BEGIN_SRC tcl
+ send "look vines\n"
+ expectit "While difficult to cut, the study and tough vines are easy to pull"
+
+ send "pull vines\n"
+ expectit "You pull the vines"
+
+ send "get vines\n"
+ expectit "You yank and shape a coil of rope from the vines"
+
+ send "inv\n"
+ expectit "Made from vines"
+
+ # Let's get another length of rope to try lassoing the hut twice:
+ send "get vines\n"
+ expectit "You yank and shape a coil of rope from the vines"
+
+ # Let's head back to the grove...
+ send "down\n"
+ expectit "You stand up first"
+
+ # Wait until we've arrived
+ expectit "Grove of the Matriarchs"
+#+END_SRC
+
+Let’s have the room’s hint be about these vines:
+
+#+BEGIN_SRC yaml
+boulder_top:
+ narrative: >-
+ The squirrel opens her eyes and stares at you intently for some time.
+ She then looks up at you, and says, "{0}"
+ hints:
+ default: >-
+ Now that you are here, you should sit down an contemplate
+ the |Ymoss|n, the |Yivy|n, the |Ymushrooms|n, and all living beings.
+ moss: Please, |gsit|n down on that |gmoss|n.
+ ivy: As these vines can be used to bind us and others, so too, can our thoughts.
+ vines: Like these vines can be used to bind us, so too, can our thoughts.
+ mushrooms: >-
+ Beautiful and joyous creatures. Literally. They laugh when you pick them up.
+#+END_SRC
+
+*** Gigglecap Mushrooms
+
+Part of the [[Potions and their Ingredients][Alchemist Path]], we use /gigglecaps/ to create a [[Laughing Potion]].
+
+Note the Alchemist Tome:
+#+begin_quote
+Colorful gigglecaps prefer well drained locations to grow, like on the top of rock terrain.
+#+end_quote
+
+And we create a /patch/ of them for the picking:
+
+#+BEGIN_src evennia
+ # @teleport/quiet mp02
+ #
+ @create/drop patch of mushrooms;mushrooms;mushroom: typeclasses.consumables.Producer
+ #
+ @desc mushrooms = A vibrant patch of mushrooms bursts forth like a painter's palette, each cap shimmering with iridescent hues of violet, emerald, and gold. Their delicate stems sway gently in the enchanted breeze...wait, you feel no breeze. They seem to be undulating with unheard laughter.
+ #
+ @set mushrooms/make_name = "gigglecap mushroom"
+ #
+ @set mushrooms/make_verb = "$conj(harvest) a"
+ #
+ @set mushrooms/make_class = "typeclasses.consumables.Edible"
+ #
+ @set mushrooms/make_desc = "A whimsical fungi emits a soft, melodic laughter when touched."
+ #
+ @set mushrooms/make_amount = 1
+ #
+ @set mushrooms/make_spell_msgs = "10 ;; $You() << $conj(giggle) ^ $conj(chuckle) ^ $conj(chortle) >> out loud."
+ #
+ # And we can't see them until we are an alchemist:
+ @lock mushrooms = view:tag(alchemist)
+#+END_SRC
+
+Until we are an alchemist, we shouldn't see the mushrooms...
+
+#+BEGIN_SRC tcl
+ dont_expect "You notice" "mushrooms"
+#+END_SRC
+
+*** Squirrel
+Here for hints … and a bit of a distraction.
+
+#+BEGIN_SRC evennia
+ @create/drop Squirrel;monk: typeclasses.chatbots.ChatBot
+ # @update squirrel = typeclasses.chatbots.ChatBot
+ #
+ @desc squirrel = A handsome squirrel dressed in flowing orange robes. Sitting in quiet meditation on top of a compfortable patch of |Ymoss|n.
+ #
+ @set squirrel/gender = "female"
+ #
+ @set squirrel/pose = "deep in meditation"
+ #
+ @set squirrel/pose_sleep = "deep in meditation"
+ #
+ # @sdesc orange-robed squirrel
+#+END_SRC
+
+#+BEGIN_SRC evennia
+ @set squirrel/arrive = "20 ;; emote briefly opens her eyes, nods an acknowledgement to you. ;; gm The small squirrel returns to her meditation."
+#+END_SRC
+
+Ignore all talking.
+
+#+BEGIN_SRC evennia :tangle no
+ @set squirrel/say = "5 ;; gm The << small ^ robed ^ >> squirrel << opens her eyes ^ looks at {1} briefly ^ stares at {1} intently >> and << holds up an empty paw ^ places a paw on the moss ^ holds up a small flower ^ shakes its head ^ closes her eyes >>. ;; gm The << small ^ robed ^ >> squirrel << returns ^ goes back >> to her << meditation ^ reflection ^ rumination >>."
+#+END_SRC
+
+And turn on the real sayings:
+
+#+BEGIN_SRC evennia
+ py me.search("squirrel").backstory("squirrel")
+#+END_SRC
+
+** Frog Meadow
+To the east, let’s make a nice meadow. Start at the Forest:
+#+BEGIN_src evennia
+ @teleport mp01
+#+END_SRC
+
+And we use the =tunnel= command this time:
+#+BEGIN_src evennia
+ @dig Frog Meadow;mp05 : typeclasses.rooms_weather.TimeWeatherRoom = east footpath to meadow;east;e;path;footpath,west footpath to forest;footpath;west;w;path
+#+END_SRC
+
+A description if they look east:
+#+BEGIN_src evennia
+ @desc east = A winding footpath that may lead out of the forest... Is that a meadow?
+#+END_SRC
+
+And a nice journey message to go east out of the forest:
+#+BEGIN_src evennia
+ @set east/traverse_msg = "The mossy tree roots that borders this footpath begin to thin out to clover and flowers..."
+#+END_SRC
+
+Before we label it, we follow =east=:
+#+BEGIN_src evennia
+ @teleport mp05
+#+END_SRC
+
+And a description that takes advantage of the time of day. We should get busy and get some seasonal description here.
+
+#+BEGIN_src evennia
+ @desc here = A large |Ywaterfall|n cascades on the far side of this meadow creating a |Ystream|n that meanders through the tall grass and large yellow |Yflowers|n. They nod their sleepy heads to you as you pass by in the darkening twilightawakening dawnlazy afternoondark night. A gap in the trees show how you can return to the footpath in the forest.
+#+END_SRC
+
+Along with a message:
+#+BEGIN_src evennia
+ @set footpath/traverse_msg = "You leave the open meadow for the footpath through the giant trees. The yellow flowers nod goodbye to you..."
+#+end_src
+
+And a description:
+#+BEGIN_src evennia
+ @desc footpath = This footpath goes in a forest of immense trees.
+#+END_SRC
+
+And details of the field.
+
+#+BEGIN_src evennia
+ @detail stream = The slow-moving |Ystream|n meanders like a snake in the grassy field. Little green |Yfrogs|n cling to grass stems hanging over the water.
+#+END_SRC
+
+And detail the frogs:
+
+#+BEGIN_src evennia
+ @detail frog;frogs = Cute little guys with their big black eyes and tiny gold crowns. Too quick to catch.
+ #
+ @detail flowers;yellow flowers = "Aren't daffodils just flowers with big ol' schnozzes?"
+#+END_SRC
+
+Testing this location:
+
+#+BEGIN_SRC tcl
+ send "e\n"
+ expectit "Frog Meadow"
+
+ # Until we are an alchemist, we shouldn't see the tickleweeds...
+ dont_expect "You notice" "tickleweed"
+
+ send "look frogs\n"
+ expectit "Cute little guys"
+#+END_SRC
+
+And a prompt to generate an image from Midjourney and possibly AI Studio with Gemini.
+
+#+begin_example
+Generate a watercolor with pen and ink outlining with vibrant colors and in the style of David Brayne, depicting a grassy field full of smiling yellow flowers and purple weeds.
+Beyond the field is a waterfall that creates a stream.
+Show a couple of small green frogs with tiny crowns on their heads.
+Hiding in the grass is a friendly looking big hairy beast reminiscent of Where the Wild Things Are.
+#+end_example
+*** Waterfall
+This is special, in that it should be hidden:
+
+#+BEGIN_src evennia
+ @create/drop waterfall
+#+END_SRC
+
+And the description:
+
+#+BEGIN_src evennia
+ @desc waterfall = Cascading down the cliff in three sections, each section of this giant waterfall widens ending in a large |Ypool|n.|/|/Wait! Is there a large |Ycave|n entrance hidden behind the water?
+#+END_SRC
+
+#+BEGIN_src evennia
+ @lock waterfall = get:false()
+#+END_SRC
+
+Looking at the waterfall, shows the cave entrance:
+#+BEGIN_src evennia
+ @set waterfall/hidden_tag = "hidden_cave;hidden_waterfall"
+ #
+ @lock waterfall = view:tag(hidden_waterfall)
+#+END_SRC
+
+#+BEGIN_src evennia
+ @detail pool = A pool of cool, clear water.
+#+END_SRC
+
+Test the cave entrance invisibility:
+
+#+BEGIN_SRC tcl
+ dont_expect "Exits" "cave entrance"
+
+ dont_expect "You notice" "waterfall"
+#+END_SRC
+
+Once seen, we should see both:
+
+#+BEGIN_SRC tcl
+ send "look pool\n"
+ expectit "A pool of cool, clear water."
+
+ send "look waterfall\n"
+ expectit "entrance hidden behind the water?"
+
+ # water == waterfall ... eh.
+ # send "look water\n"
+ # expectit "Could not find 'water'"
+
+ send "look\n"
+ expect -re "Exits:.*cave entrance"
+ expect -re "You notice.*waterfall"
+
+ send "get waterfall\n"
+ expectit "You can't get that"
+#+END_SRC
+
+*** Fizzy Water
+The waterfall causes the water in the stream to be /fizzy/, to be part of the [[Potions and their Ingredients][Alchemist Path]] to create a [[Laughing Potion]].
+
+#+BEGIN_src evennia
+ # @teleport/quiet mp05
+ #
+ @create/drop stream;water: typeclasses.drinkables.Water
+ #
+ @desc stream = A slow-moving stream meanders like a snake in the grassy field. The water, fizzy with bubbles from the waterfall torrent, creates an efforvesent aroma. Little green |Yfrogs|n cling to grass stems hanging over the sparkling water.
+ #
+ @lock stream = get:false()
+ #
+ @set stream/get_err_msg = "Seriously? You can't get that. Perhaps you can |gfill|n a |gbottle|n, or at least a cup, could hold the fizzy water."
+ #
+ @set stream/fill_name = "fizzy water"
+ #
+ @set stream/fill_desc = "sparkling water from waterfall turbulence."
+ #
+ @set stream/fill_msgs = ["$You() << $conj(get) ^ $conj(kneel) >> down, and $conj(fill) $pron(your) {2} with sparkling efforvesence.", "$You() << $conj(get) ^ $conj(kneel) >> down, and $conj(put) $pron(your) {2} in the cool water, filling it."]
+#+END_SRC
+
+Make sure we can’t /get/ the fizzy water. Gotta issue where the name, =stream=, and /alias/, =water= should be the same:
+
+#+BEGIN_SRC tcl
+ send "look stream\n"
+ expectit "A slow-moving stream meanders like a snake in the grassy field."
+
+ send "get stream\n"
+ expectit "Seriously? You can't get that."
+ #+END_SRC
+
+We will have to test the ability to “get” some water later, when we have a bottle.
+*** Tickleweed
+
+Part of the [[Potions and their Ingredients][Alchemist Path]], we use /tickleweed grass/ to create a [[Laughing Potion]].
+
+We put this location hint in the Alchemy Tome:
+#+begin_quote
+A purple grass, often called tickleweed since it vibrates as if laughing. The herb hunter can find this in fields and meadows throughout the area.
+#+end_quote
+
+And we create it:
+
+#+BEGIN_src evennia
+ # @teleport/quiet mp05
+ #
+ @create/drop patch of tickleweed;tickleweed: typeclasses.consumables.Producer
+ #
+ @desc tickleweed = Patches of this vivid grass vibrates as if giggling.
+ #
+ @set tickleweed/make_name = "bunch of tickleweed"
+ #
+ @set tickleweed/make_verb = "$conj(harvest) a"
+ #
+ @set tickleweed/make_class = "typeclasses.consumables.Herb"
+ #
+ @set tickleweed/make_desc = "This grass vibrates as if giggling."
+ #
+ @set tickleweed/make_amount = 1
+ #
+ # And we can't see them until we are an alchemist:
+ @lock tickleweed = view:tag(alchemist)
+#+END_SRC
+
+Until we are an alchemist, we shouldn't see the mushrooms...
+
+#+BEGIN_SRC tcl
+ dont_expect "You notice" "tickleweed"
+#+END_SRC
+
+We’ll test the ability to get it later.
+
+*** Hints
+We could have the /frogs/ talk, perhaps a migrating murder of crows?
+
+#+BEGIN_SRC yaml
+ frog_meadow:
+ narrative: >-
+ "<< Psst. ^ Heya. ^ Down here. ^ Ribbit... ^ Hey buddy. >>"
+ You << stoop ^ look down ^ bend down >> and see
+ a << tiny ^ small ^ >> << green ^ >> frog
+ with a << teeny ^ >> << gold ^ >> crown. It says,
+ "<< I see ya gawking. ^ You look confused. ^ Need some help? >> {0}"
+ And with that, he hops away.
+ ;;
+ A << flock ^ couple >> of crows fly into the meadow.
+ One of them, hops << next to ^ near >> you.
+ "<< I see ya gawking. ^ You look confused. ^ Need some help? >> {0}"
+ ;;
+ A cricket, sporting a nice top hat and waistcoat, eyes you curiously.
+ "You seem << confused ^ bewildered ^ befuddled ^ disoriented ^ perplexed >>,"
+ it says. "Perhaps I can help. {0}
+ Hope that helps. Good-bye << and good luck ^ >>."
+ And with a mighty jump, hops to the other side of the << meadow ^ field >>.
+ hints:
+ default: >-
+ The |Ybeast|n over there is << actually ^ quite >> friendly,
+ but scared of everything and everyone.
+ That's why he doesn't venture in to the forest.
+ That, and he loves the fizzy water from the |Ystream|n.
+ beast: >-
+ The beast doesn't like new people. Sometimes you can |Yfeed|n him
+ to get 'im to warm up to you. Sometimes takes a bit of food for him
+ to trust you.
+ feed: >-
+ |YBerries|n are good, but he loves Dabbler's |Yscones|n.
+ Just hard to get into his house.
+ berries: You'll find a bush of them to the west in the Grotto.
+ scones: Dabbler lives in a tree to the west, behind a red door.
+ stream: Yes, the fizzy water is drinkable, so you can |Ycollect|n some.
+ collect: To collect the water, you will need a |Ybottle|n.
+ bottle: You want to |gfill bottle|n to collect the water.
+#+END_SRC
+
+And some tests of the hint system?
+
+#+BEGIN_SRC tcl
+ send "hint\n"
+ expectit "but scared of everything and everyone"
+ send "hint beast\n"
+ expectit "The beast doesn't like new people"
+ send "hint feed\n"
+ expectit "Just hard to get into his house"
+ send "hint berries\n"
+ expectit "You'll find a bush of them to the west in the Grotto"
+ send "hint scones\n"
+ expectit "Dabbler lives in a tree to the west, behind a red door"
+ send "hint stream\n"
+ expectit "Yes, the fizzy water is drinkable"
+ send "hint collect\n"
+ expectit "To collect the water, you will need"
+ send "hint bottle\n"
+ expectit "to collect the water."
+#+END_SRC
+
+** The Lair of the Beast
+To create a place for our big, hairy beast to sleep, first jump to the Meadow:
+#+BEGIN_src evennia
+ @teleport mp05
+#+END_SRC
+
+From the Meadow, we create a lair /behind/ the water.
+#+BEGIN_src evennia
+ @dig Lair;mp07 = cave entrance;cave;lair;inside,outside;leave;meadow
+#+END_SRC
+
+And we make it hidden:
+#+BEGIN_src evennia
+ @set cave/hidden_tag = "hidden_cave"
+ #
+ @lock cave = view:tag(hidden_cave)
+#+END_SRC
+
+And a description if they look:
+#+BEGIN_src evennia
+ @desc cave = A large entrance to a dark, and foul-smelling cave. The waterfall is so loud, you can't hear anything that may live there.
+#+END_SRC
+
+And a description when entering …
+#+BEGIN_src evennia
+ @set cave/traverse_msg = "You venture inside the dark cave."
+#+END_SRC
+
+Let’s step inside to finish this:
+
+#+BEGIN_src evennia
+ @teleport mp07
+#+END_SRC
+
+And a description:
+
+#+BEGIN_src evennia
+ @desc here = Vaulted stone ceiling harbors the darkness that hovers over a large |Ymattress|n.
+#+END_SRC
+
+And a description of leaving:
+
+#+BEGIN_src evennia
+ @desc leave = You can see the waterfall cascading outside the cave entrance.
+#+END_SRC
+
+And the leaving message:
+
+#+BEGIN_src evennia
+ @set leave/traverse_msg = "You leave the dark cave and pass behind the waterfall for the meadow beyond."
+#+END_SRC
+
+Test the cave entrance:
+#+BEGIN_SRC tcl
+ send "look cave\n"
+ expectit "A large entrance to a dark, and foul-smelling cave."
+
+ send "lair\n"
+ expectit "Lair"
+
+ send "look outside\n"
+ expectit "You can see the waterfall cascading outside the cave entrance."
+ #+END_SRC
+
+*** Mattress
+Create a mattress you can sit on (and maybe /push/ to get to a secret door):
+
+#+BEGIN_src evennia
+ @create/drop mattress:typeclasses.sittables.Sittables
+#+END_SRC
+
+And the description:
+#+BEGIN_src evennia
+ @desc mattress = Looks comfortable, albeit tall, but doesn't smell good. Perhaps that is due to the |Ymushrooms|n sprouting from its base?|/|/The corner of the mattress covers a |Ytrapdoor|n!?
+#+END_SRC
+
+And a /detail/ of the mushrooms that may show if are not an alchemist:
+
+#+BEGIN_src evennia
+ @detail mushrooms;fungus = Slender blue tendrils of a fungus encircle the base of the mattress. Subtle white dots on the cap suggests caution.
+#+END_SRC
+
+Can’t steal ‘it:
+#+BEGIN_src evennia
+ @lock mattress = get:false()
+ #
+ @set mattress/get_err_msg = "It's way too heavy for you to lift."
+#+END_SRC
+
+Can you /push/ or /pull/ it?
+
+#+BEGIN_SRC evennia
+ @set mattress/pull_msg = "Mattresses are such difficult creatures to manipulate. When you pull on a corner, it slips from your hands. Perhaps you could |guse|n something to help?"
+ #
+ @set mattress/push_msg = "Mattresses are such difficult creatures to manipulate. Such a heavy beast. Your pushing allows you to reach and pull on the trapdoor, but not enough to keep it open. Perhaps you could |guse|n something to prop it out of the way?"
+#+END_SRC
+
+And textual descriptions the object can use:
+#+BEGIN_src evennia
+ @set mattress/adjective = "on"
+ #
+ @set mattress/article = "the"
+ #
+ @set mattress/singular = "the mattress"
+ #
+ @set mattress/extra = "This feels << ^ very ^ quite>> <>, even if it smells bad.|n"
+#+end_src
+
+And a better description when sitting down:
+
+#+BEGIN_SRC evennia
+ @set mattress/response = "$You() $conj(sit) on the large mattress."
+#+END_SRC
+
+And a trim on the things to see:
+
+#+BEGIN_src evennia
+ @lock mattress = view:tag(hidden_mattress)
+ #
+ @set mattress/hidden_tag = "hidden_mattress"
+#+END_SRC
+
+Testing this location.
+
+#+BEGIN_SRC tcl
+ dont_expect "You notice" "mattress"
+
+ send "look mattress\n"
+ expectit "Looks comfortable"
+
+ send "look\n"
+ expect -re "You notice.*mattress"
+
+ send "sit\n"
+ expectit "You sit on the mattress."
+
+ send "get mattress\n"
+ expectit "too heavy"
+#+END_SRC
+
+*** Dream Mushrooms
+Part of the [[Potions and their Ingredients][Alchemist Path]], we use /dream mushrooms/ to create a [[Trippy Potion]].
+
+#+begin_quote
+Dreamshade mushrooms feed on floating dreams, and often congregate where dreamers sleep.
+#+end_quote
+
+#+BEGIN_src evennia
+ # @teleport/quiet mp07
+ #
+ @create/drop cluster of mushrooms;mushroom;mushrooms: typeclasses.consumables.Producer
+ #
+ @desc mushrooms = Slender blue tendrils of a fungus encircle the base of the mattress. You note that these look like the |wDreamshade mushrooms|n mentioned in the |wAlchemy Lab|n.
+ #
+ @set mushrooms/make_name = "dreamshade mushroom"
+ #
+ @set mushrooms/make_verb = "$conj(pluck) and $conj(pocket) a "
+ #
+ @set mushrooms/make_class = "typeclasses.consumables.Edible"
+ #
+ @set mushrooms/make_desc = "A slender, blue mushroom. Glowing?"
+ #
+ @set mushrooms/make_amount = 1
+ #
+ @set mushrooms/make_spell_msgs = "10 ;; $You() $conj(nod) off, as $pron(your) head bobbles and bounces. ;; 5 ;; $You() $conj(awaken) with a start."
+ #
+ # And we can't see them "fully" until we are an alchemist:
+ @lock mushrooms = view:tag(alchemist)
+#+END_SRC
+
+And test that we can’t see them right now.
+
+#+BEGIN_SRC tcl
+ dont_expect "You notice" "mushrooms"
+#+END_SRC
+*** Beast
+And we create the Big, Hairy Beast:
+
+#+BEGIN_src evennia
+ @create/drop big hairy beast;bhb;beast;hairy beast;monster;shadow: typeclasses.pets.BHB
+#+END_SRC
+
+And a general description that will be /expanded/ with its current reaction.
+
+#+BEGIN_src evennia
+ @desc beast = A big, hairy beast with long claws and teeth.
+#+END_SRC
+
+Can’t get this:
+#+BEGIN_src evennia
+ @lock beast = get:false()
+ #
+ @set beast/get_err_msg = "You can't pick that up, as that beast is far larger than you."
+#+END_SRC
+
+And set its sleepy time at 8pm …
+
+#+BEGIN_src evennia
+ @set beast/sleep_hour = 21
+#+END_SRC
+
+It will wake at 8am …
+
+#+BEGIN_src evennia
+ @set beast/wake_hour = 8
+#+END_SRC
+
+Let’s set some behavior levels. For instance, the beast is sad when he doesn’t see its friends:
+
+#+BEGIN_src evennia
+ @set beast/loneliness_amount = -2
+#+END_SRC
+
+It seem to warm up the to new characters hanging around the area, but not as much as those that would interact with it:
+
+#+BEGIN_src evennia
+ @set beast/shyness_amount = 3
+#+END_SRC
+
+How active should this pet be? Seems like at the moment, it shouldn’t be too obnoxious. This setting is a percentage, so 12 is /12%/, which returns a message only 12% of the /ticks/ (where a tick is about a minute).
+
+#+BEGIN_src evennia
+ @set beast/active_amount = 10
+#+END_SRC
+
+It isn’t that scared of new people, as it will ignore them when someone it knows is around.
+
+#+BEGIN_src evennia
+ @set beast/new_character_reaction = 'ignores'
+#+END_SRC
+
+Seems we should make descriptions for all the states that happen when you look at them. These are appended to the standard description.
+
+#+BEGIN_src evennia
+ @set beast/scared_msg = "It seems <> as it tries to hide behind a tall clump of grass. Yeah, it doesn't do a good job of hiding."
+#+END_SRC
+
+Concerned level:
+
+#+BEGIN_src evennia
+ @set beast/concerned_msg = "Its large, yellow eyes stare at you from a safe distance."
+#+END_SRC
+
+Interested level:
+
+#+BEGIN_src evennia
+ @set beast/interested_msg = "It seems <> in what you are doing <>. ;; Its << ^ large, ^ big,>> yellow eyes watch your every move."
+#+END_SRC
+
+Friendly level:
+
+#+BEGIN_src evennia
+ @set beast/friendly_msg = "It sits next to you, as its big, friendly eyes gaze as you. ;; It <> to you, wagging its tail-less behind. ;; It lays down next to you."
+#+END_SRC
+
+When the beast is sleeping, we can some times spam the room with the snores:
+
+#+begin_src evennia
+ @set beast/sleeping_actions = "The <> <> <> lets loose a <> snore. ;; The <> <> <> growls in its sleep. ;; The <> <> <> twitches its <>. ;; The <> <> <> <> on its <> mattress."
+#+end_src
+
+We base the actions of the beast on the most friendly person in the area.
+
+The scared level doesn’t last long, so let’s just leave one message:
+
+#+begin_src evennia
+ @set beast/scared_actions = "A tremendously large and hairy beast attempts to nervously (and almost comically) hide"
+#+end_src
+
+
+Concerned actions:
+
+#+begin_src evennia
+ @set beast/concerned_actions = "The <> <> <> <> concerned by your presence in the <>. ;; The <> <> <> seems concerned. Maybe it's hungry. ;; The <> <> <> seems concerned and keeps its distance."
+#+end_src
+
+Interested actions:
+
+#+begin_src evennia
+ @set beast/interested_actions = "The <> <> <> seems <> in $you(). ;; The <> <> <> seems curious about $you(). ;; The <> <> <> stands on its hind legs. ;; The <> <> <> <> $you() with its <> yellow eyes."
+#+end_src
+
+Friendly actions:
+
+#+begin_src evennia
+ @set beast/friendly_actions = "The <> <> <> <> <> wagging its backend<<, ^ as it seems>> happy to see $you(). ;; The <> <> <> <> <> hoping to play with $you(). ;; The <> <> <> flops over in front of $you() wriggling <> on the ground. ;; The <> <> <> <> <> next to $you(). ;; The <> <> <> chases butterflies around the <>."
+#+end_src
+
+The ecstatic states are just a bit more than friendly.
+
+#+begin_src evennia
+ @set beast/ecstatic_actions = "The <> <> <> <> <> to give $you() a sloppy <>. ;; The <> <> <> <> <> wagging its backend as it seems <> excited to see $you(). ;; The <> <> <> <> <> hoping to play with $you(). ;; The <> <> <> flops over in front of $you() happily wriggling on the ground. ;; The <> <> <> excitedly <> <> next to you. ;; The <> <> <> <> leaps into air. ;; The <> <> <> chases butterflies around the <>."
+#+end_src
+
+And the responses to being /pet/:
+
+#+BEGIN_src evennia
+ @set beast/pet_sleeping_response = "Petting a sleeping beast of that size isn't your best idea."
+ #
+ @set beast/pet_scared_response = "$You() can't get near the wild beast to pet it. It seems scared."
+ #
+ @set beast/pet_concerned_response = "$You() can't get near the big, hairy beast to pet it. It seems concerned."
+ #
+ @set beast/pet_interested_response = "The big hairy beastie keeps its distance, but seems curious about $you()."
+ #
+ @set beast/pet_friendly_response = "The << big, ^ huge, ^ large, ^ tremendous, ^ >> << hairy ^ slobbery ^ horned ^ clawed ^ >> << brute ^ beast ^ monster>> << flops ^ rolls >> over << in the grass ^>> as $you() $conj(give) it belly rubs. ;; The << big, ^ huge, ^ large, ^ tremendous, ^ >> << hairy ^ slobbery ^ horned ^ clawed ^ >> << brute ^ beast ^ monster>> << flops ^ rolls >> over << in the grass ^>> as $you() $conj(rub) its belly. ;; $You() $conj(pet) the << big, ^ huge, ^ large, ^ tremendous, ^ >> << hairy ^ slobbery ^ horned ^ clawed ^ >> << brute ^ beast ^ monster>> . ;; $You() $conj(scratch) the << nose ^ ears >> of the << big, ^ huge, ^ large, ^ tremendous, ^ >> << hairy ^ slobbery ^ horned ^ clawed ^ >> << brute ^ beast ^ monster>>. ;; The << big, ^ huge, ^ large, ^ tremendous, ^ >> << hairy ^ slobbery ^ horned ^ clawed ^ >> << brute ^ beast ^ monster>> leans forward as $you() $conj(scratch) its nose."
+ #
+ @set beast/pet_ecstatic_response = "While << excited ^ ecstatic ^ squirmy >>, the << big, ^ huge, ^ large, ^ tremendous, ^ >> << hairy ^ slobbery ^ horned ^ clawed ^ >> << brute ^ beast ^ monster>> << lays ^ gets >> down so $you() can << pet ^ scratch >> << the top of its head ^ the back of its neck ^ its nose ^ the sides of its face >>. It closes its eyes and purrs. ;; << The squirmy little devil. ^ >> $conj(You) << can ^ >> << barely ^ hardly >> scratch the << nose ^ ears ^ neck ^ top of the head >> of the << big, ^ huge, ^ large, ^ tremendous, ^ >> << hairy ^ slobbery ^ horned ^ clawed ^ >> << brute ^ beast ^ monster>> as it << squirms around ^ wriggles it backend >>. It << can hardly ^ can't >> contain its excitement. ;; The << big, ^ huge, ^ large, ^ tremendous, ^ >> << hairy ^ slobbery ^ horned ^ clawed ^ >> << brute ^ beast ^ monster>> wriggles around before << flopping ^ rolling >> over << in the grass ^>> as $you() $conj(give) it belly rubs. ;; The << big, ^ huge, ^ large, ^ tremendous, ^ >> << hairy ^ slobbery ^ horned ^ clawed ^ >> << brute ^ beast ^ monster>> wriggles and squirms excitedly before it << flops ^ rolls >> over << in the grass ^>> as $you() $conj(rub) its belly."
+#+END_SRC
+
+I want to make sure that when someone new sees the beast, the see it hiding behind the grass…
+
+#+BEGIN_SRC tcl
+ send "leave\n"
+ expectit "Frog Meadow"
+
+ expect {
+ "a big hairy beast" {
+ send "look beast\n"
+ expectit "it tries to hide behind a tall clump of grass"
+
+ send "pet bhb\n"
+ expectit "can't get near"
+
+ send "get hairy beast\n"
+ expectit "beast is far larger than you."
+
+ send "feed beast\n"
+ expectit "doesn't appear interested in anything you have."
+ }
+ timeout {
+ if {$phase == "night"} {
+ puts "NOTE: The beast is in bed now."
+ } else {
+ puts "NOTE: Where is the beast? It is $phase?"
+ }
+ }
+ }
+#+END_SRC
+*** Hints
+This is an /under construction/ sort of room, and isn’t that interesting at the moment. I’m not sure what sort of /narrator/ could give a hint; a spider?
+
+#+BEGIN_SRC yaml
+ lair:
+ hints:
+ default: >-
+ This is the bedroom for the |wBig Hairy Beast|n, and little
+ else. Eventually, I will expand this room into something more
+ interesting, but at the moment, pretend there is a |wPardon our
+ Dust|n sign or something.
+ |/|/Of course I will install a secret door here, but not yet.
+#+END_SRC
+
+** Glittering Glade
+To the east of the meadow, let’s make a glade back inside the Forest:
+#+BEGIN_src evennia
+ @teleport mp05
+#+END_SRC
+
+And we use the =tunnel= command this time:
+#+BEGIN_src evennia
+ @dig Glittering Glade;mp19 : typeclasses.rooms.Room = east footpath into another forest;east;glade;e,west footpath to meadow;footpath;west;w;path
+#+END_SRC
+
+A description if they look east:
+#+BEGIN_src evennia
+ @desc east = Looking at the forest on the east side shows a footpath illuminated by dancing glowing orbs.
+#+END_SRC
+
+#+BEGIN_SRC evennia
+ @detail orbs = The orbs swirl around in a circular pattern creating a mesmerizing vortex of light leading deep into the forest.
+#+END_SRC
+
+And a nice journey message to go east out of the forest:
+#+BEGIN_src evennia
+ @set east/traverse_msg = "You step into this dark forest onto a footpath illuminated by swirling orbs of light. You follow the path until it opens into a glade."
+#+END_SRC
+
+Before we label it, we follow =east=:
+
+#+BEGIN_src evennia
+ @teleport mp19
+#+END_SRC
+
+And the description won’t have day/night, but we can /reference/ it:
+
+#+BEGIN_SRC evennia
+ @desc here = The footpath ends in a beautiful glade. While the thick canopy above blocks the morning lightthe daylightthe glowing twilightany light that might show, the glade is illuminated by swirling |Yorbs|n of light. You see a round, stone |Ytable|n and a blue painted |Ydoor|n embedded in a giant tree.
+#+END_SRC
+
+#+BEGIN_SRC evennia
+ @detail orbs = The orbs swirl above illuminating the glade.
+#+END_SRC
+
+#+BEGIN_SRC evennia
+ @detail trees = Ancient trees surround this glade like walls.
+#+END_SRC
+
+#+BEGIN_SRC evennia
+ @detail tree = The largest tree stands at one end of the glade, forms steps from this roots that lead to a |Ydoor|n embedded in its bark.
+#+END_SRC
+
+A description if they look back towards the west:
+#+BEGIN_src evennia
+ @desc west = The footpath leads out of the forest to a meadow.
+#+END_SRC
+
+And a nice journey message to go east out of the forest:
+#+BEGIN_src evennia
+ @set west/traverse_msg = "You followed the illuminated footpath until you exit the forest into a meadow."
+#+END_SRC
+
+Assume the Goblin tester is in Frog Meadow, so let’s head east:
+
+#+BEGIN_SRC tcl
+ send "east\n"
+ expectit "Glittering Glade"
+#+END_SRC
+*** Stone Table
+Not only does the /table/ in this glade offers a riddle, but also arbitrates the answer of the puzzle to unlock the blue door into the tavern. As a special object, it can listen for words, and perform commands:
+
+#+BEGIN_SRC evennia
+ @create/drop stone table:typeclasses.puzzles.StoryCube
+#+END_SRC
+
+And a description must be careful with the newlines to make the verse work:
+
+#+BEGIN_SRC evennia
+ @desc table = Moss fills four |Yrunes|n carved along the edge of this weathered table. In the center, you can read a message:|/|/ Born of rain and ground combined,|/ No solid form, yet firm when dried.|/ Clinging to feet. Adored by boar.|/ Speak my name to open the door.
+#+END_SRC
+
+Can we read it?
+
+#+BEGIN_SRC ruby
+ @set table/inside = "While you can't read the |Yrunes|n, you can read the message in the middle of the table:|/|/ Born of rain and ground combined,|/ No solid form, yet firm when dried.|/ Clinging to feet. Adored by boar.|/ Speak my name to open the door."
+#+END_SRC
+
+And some flavor that offers a hint to the answer of the riddle, to combine Water and Earth:
+
+#+BEGIN_SRC evennia
+ @detail runes;rune = While you've never before encountered these stanges runes, etched into the ancient stone, yet somehow you know that they represent the elements of |wEarth|n, |wAir|n, |wFire|n and |wWater|n.
+#+END_SRC
+
+The table shouldn’t be steal-able:
+#+BEGIN_src evennia
+ @lock table = get:false()
+ #
+ @set table/get_err_msg = "That table is much too big for you to lift."
+#+END_SRC
+
+Answer the riddle to be able to go to the Tavern:
+
+#+BEGIN_SRC evennia
+ @set table/say = {r".*\bmud\b.*": "gm You hear an audible click, and find the blue door, that was closed before, now is ajar. ;; tag_all open_blue_door"}
+#+END_SRC
+
+Assume the Goblin tester is in Frog Meadow, so let’s head east:
+
+#+BEGIN_SRC tcl
+ send "get table\n"
+ expectit "too big"
+#+END_SRC
+*** Hints
+Shall we bring back Bubba?
+
+#+BEGIN_SRC yaml
+ glittering_glade:
+ narrative: >-
+ << Bubba Joe Washington ^ That cockatiel >> returns, and perches on your shoulder,
+ "Heya," it chirps. "<< Stuck on this puzzle? ^ >> Here's a << bit of ^ >> a hint. {0} Good luck << , again ^ >>." It flies off.
+ ;;
+ A << yellow ^ orange ^ large ^ >> butterfly lands on your
+ shoulder. "You look like you << could use some ^ need ^ would like
+ some >> help," it says, "{0}" As it flies away, it says, "Good
+ luck!"
+ hints:
+ default: >-
+ To get through that |Ydoor|n, you'll need to figure out the |Ypassword|n.
+ password: >-
+ Don't abandon hope. The |Ytable|n contains a |Yriddle|n.
+ Don't forget to |glook|n at the |Yrunes|n around the outside.
+ table: >-
+ You could |gread|n the message in the middle of the table.
+ That is a good ol' fashion |Yriddle|n.
+ The answer to the riddle, is the |Ypassword|n.
+ Don't forget to |glook|n at the |Yrunes|n around the outside.
+ riddle:
+ You've |gread|n the message in the middle of the table, right?
+ Do you want the |Yanswer|n?
+ runes: >-
+ Those unreadable runes hint at the answer to the |Yriddle|n
+ you can see in the message in the middle of the |Ytable|n.
+ Think about combining two elements to get the answer.
+ door: >-
+ That door leads to |wWyldwood Tavern|n...
+ A lovely place that serves fascinating cocktails.
+ answer: mud
+#+END_SRC
+
+And let’s not test /everything/ here:
+
+#+BEGIN_SRC tcl
+ send "hint\n"
+ expectit "To get through that"
+
+ send "hint password\n"
+ expectit "Don't abandon hope."
+#+END_SRC
+
+** Tavern: Wyldwood Bar
+This now needs to be transferred from the [[file:mud-rpg.org][mud-rpg]] file.
+
+#+BEGIN_src evennia
+ @dig Wyldwood Bar;mp10 = blue door;door,blue door to forest;leave;outside
+#+end_src
+*** Blue Door
+The door in the tree connects to the Tavern that may have already been created:
+
+#+BEGIN_SRC evennia :tangle no
+ @open blue door;door,blue door to forest;leave;outside = Wyldwood Bar
+#+END_SRC
+
+And describe it:
+#+BEGIN_SRC evennia
+ @desc door = A painted blue door where the round top of the door fits snugly in the bark of the tree. The comically large doorknob in the center of the door looks ornamental.
+#+END_SRC
+
+The dock is locked:
+
+#+BEGIN_SRC evennia
+ @set blue door/err_traverse = "The door seems locked...or at least, won't budge."
+#+END_SRC
+
+Open-able if you have the correct tag:
+#+BEGIN_SRC evennia
+ @lock blue door = traverse:tag(open_blue_door)
+#+END_SRC
+
+Make sure it is locked:
+#+BEGIN_SRC tcl
+ send "blue door\n"
+ expectit "The door seems locked"
+#+END_SRC
+
+And give the password to open the blue door:
+#+BEGIN_SRC tcl
+ send "say mud\n"
+ expectit "You hear an audible click"
+
+ # Need to wait for the tagging magic to take effect:
+ sleep 1
+#+END_SRC
+
+Let’s have an interesting phrase entering the bar …
+#+BEGIN_src evennia
+ @set door/traverse_msg = "You open the blue door and enter inside the tree... and find yourself in a mirror copy of the glade you just left, but this glade looks like a |wtavern|n."
+#+END_SRC
+
+And test to make sure we can get to the bar…
+#+BEGIN_SRC tcl
+ send "blue door\n"
+ expectit "Wyldwood Bar"
+#+END_SRC
+*** Inside the Bar
+Let’s hop into the Bar in order to work it over:
+#+BEGIN_SRC evennia
+ @tel mp10
+#+END_SRC
+
+Describe it:
+
+#+BEGIN_SRC ruby
+ @desc here = An amazing room formed from a ring of living |Ytrees|n. The canopy of |Yboughs|n above twinkle with the |Ylights|n of small, glowing orbs. Working the bar, a haughty-looking |Yelf|n; waiting on tables, a smiling |Ymushroom man|n, er...person.
+#+END_SRC
+
+And some ambiance.
+#+BEGIN_SRC ruby
+ @detail trees;tree;trunk;trunks = You've never see black elder tree trunks so large or that grow so close together. The course, dark gray trunks absorb the soft light from the |Yorbs|n making the room appear much larger.
+#+END_SRC
+
+#+BEGIN_SRC ruby
+ @detail boughs;bough;branches;canopy = The branches of the black elder |Ytrees|n sport slender leaves and cluster of elder |Yberries|n.
+#+END_SRC
+
+#+BEGIN_SRC ruby
+ @detail berries;berry = The cluster of berries from the |Ycanopy|n above are high and out of reach.
+#+END_SRC
+
+#+BEGIN_SRC ruby
+ @detail lights;light;orbs = Hundreds of small, dancing orbs float around the |Ycanopy|n above the room, casting a soft glow of light.
+#+END_SRC
+
+And describe the door leaving the bar:
+
+#+BEGIN_SRC evennia
+ @desc blue door = The painted blue door you used to enter this tavern, looks the same on this side too...a door that fits snugly in the bark of the tree. Going through this door again may take you back to the forest, but who knows?
+#+END_SRC
+
+Let’s have an interesting phrase entering the bar …
+#+BEGIN_src evennia
+ @set blue door/traverse_msg = "You open the blue door and enter inside the tree... and find yourself back in the first glade, with a path that leads through a forest."
+#+END_SRC
+
+
+*** Cocktails
+Let’s create a sign for the list of cocktails:
+
+#+BEGIN_SRC ruby
+ @create/drop sign above the bar;sign;list:typeclasses.readables.Readable
+#+END_SRC
+
+And the description:
+
+#+BEGIN_SRC ruby
+ @desc sign = You see a large sign made of wood over the bar, hanging from a branch of one of the living trees. Painted words at the top read, |wWyldwood Cocktails|n, and a list of drinks you can order.
+#+END_SRC
+
+Might as well allow the user to read it:
+
+#+BEGIN_SRC ruby
+ @set sign/inside = "|wCocktails|n|/ - Moonlit Mirage|/ - Puck's Revenge|/ - Glimmering Gossamer|/ - Whimsical Willow|/ - Charmed Chalice|/ - Enchanted Elixir|/ - Sylvan Serenade|/ - Brambleberry Bliss|/ - Twilight Tonic|/"
+#+END_SRC
+
+And lock down the sign:
+#+BEGIN_SRC ruby
+ @lock sign = get:false()
+ #
+ @set sign/get_err_msg = "The tree trunk that holds the sign has grown around it making it impossible to remove."
+#+END_SRC
+
+Let’s test out the sign:
+
+#+BEGIN_SRC tcl
+ send "read sign\n"
+ expectit "Cocktails"
+
+ send "get sign\n"
+ expectit "impossible to remove"
+#+END_SRC
+
+Needs the ability to create a drink.
+
+#+BEGIN_SRC ruby
+ @set bartender/currentgame = "session1"
+#+END_SRC
+
+The preps come in three forms with how detailed we want to spam the room.
+
+
+#+BEGIN_SRC ruby
+ @set bartender/triggers:session1 = {
+ "prep1": {
+ "desc": "Single preparation step for making a cocktail",
+ "timer": 1,
+ "events": [
+ "The bartender grabs a << few ^ couple of >> << bottles ^ jars ^ bottles ^ odd containers >> from << the shelf ^ a locked chest ^ a wooden box >>."
+ ]
+ },
+ "prep2": {
+ "desc": "Preparation steps for making a cocktail",
+ "timer": 5,
+ "events": [
+ "The bartender grabs a << few ^ couple of >> << bottles ^ jars ^ bottles ^ odd containers >> from << the shelf ^ a locked chest ^ a wooden box >>.",
+ "<< He ^ The bartender >> shakes and strains the << drink ^ concoction ^ elixir >> into a cocktail glass."
+ ]
+ },
+ "prep3": {
+ "desc": "Preparation steps for making a cocktail",
+ "timer": 4,
+ "events": [
+ "The bartender grabs a << few ^ couple of >> << bottles ^ jars ^ bottles ^ odd containers >> from << the shelf ^ a locked chest ^ a wooden box >>.",
+ "<< He ^ The bartender >> then shakes and strains the << drink ^ concoction ^ elixir >> into a cocktail glass.",
+ "He carefully, garnishes the << drink ^ cocktail >>."
+ ]
+ }
+ }
+#+END_SRC
+
+**** Moonlit Mirage
+A shimmering drink that changes color with each sip, garnished with edible glitter and a twist of lemon
+#+BEGIN_SRC ruby :tangle no
+ gm The bartender grabs a pixie flying by and shakes the glitter from its wings into the glass.
+#+END_SRC
+
+**** Puck’s Revenge
+A vibrant concoction of fruit juices and sparkling fairy dust, served in a glass shaped like a flower.
+
+#+BEGIN_SRC ruby :tangle no
+ cast donkey on char
+#+END_SRC
+**** Glimmering Gossamer
+A delicate blend of elderflower liqueur and sparkling wine, adorned with a butterfly-shaped ice cube.
+
+#+BEGIN_SRC ruby :tangle no
+ gm The bartender uses a butterfly net to catch an ice cube that he then places in the glass.
+#+END_SRC
+**** Whimsical Willow
+A herbal infusion of gin, rosemary, and elderberry, served with a sprig of fresh mint and a splash of tonic.
+
+#+BEGIN_SRC ruby :tangle no
+ gm As the bartender hands over the cocktail, the garnish of a sprig of mint grows a long twisting vine that he casually clips off.
+#+END_SRC
+**** Charmed Chalice
+A mysterious potion that glows softly, made with enchanted spirits and a hint of honey, served in a chalice that changes shape.
+
+#+BEGIN_SRC ruby :tangle no
+ gm Ghostly apparitions appear in the air, as the bartender grabs one, twists it, and adds a drop of ectoplasm to the drink.
+#+END_SRC
+**** Enchanted Elixir
+A deep blue drink with hints of blueberry and a touch of magic, served with a glowing ice sphere.
+
+#+BEGIN_SRC ruby :tangle no
+ gm The bartender opens a box that bathes the bar in light. He takes a glowing sphere of ice and garnishes the cocktail before passing it over.
+ shake elixir =
+#+END_SRC
+**** Sylvan Serenade
+A melodic blend of apple cider and spiced rum, garnished with a cinnamon stick and a slice of star fruit.
+
+#+BEGIN_SRC ruby :tangle no
+ gm The bartender plays a flute as the jars and ingredients line up and pour themselves into a cocktail shaker.
+#+END_SRC
+**** Brambleberry Bliss
+A sweet and tart mix of brambleberries and gin, served over crushed ice with a sprinkle of edible flowers.
+
+#+BEGIN_SRC ruby :tangle no
+ gm The bartender garnishes the cocktail with a flower pulled from a pot on the bar. The plant immediately wilts and drops away.
+#+END_SRC
+**** Twilight Tonic
+A dark, mysterious drink made with blackcurrant and tonic water, served with a slice of lime and a hint of mint."
+
+#+BEGIN_SRC ruby :tangle no
+ gm After the cocktail is complete, the branches above part, and the light from the moon shines directly on the glass causing bubbles to form. The bartender hands it to you with a wink.
+#+END_SRC
+*** Bartender
+Return to the Bar …
+#+BEGIN_SRC ruby
+ @teleport Wyldwood Bar
+#+END_SRC
+
+A haughty elf named Elendil
+#+BEGIN_SRC ruby
+ @create/drop Bartender;barkeep;Elendil: typeclasses.chatbots.Bartender
+ # @update Bartender = typeclasses.chatbots.Bartender
+#+END_SRC
+
+And all the RP system stuff:
+
+#+BEGIN_SRC evennia
+ @set bartender/gender = "male"
+#+END_SRC
+
+#+BEGIN_SRC ruby
+ py bt = self.search('Bartender'); bt.sdesc.add('blonde elf'); bt.db.pose = 'working behind the bar'
+#+END_SRC
+
+And default pose:
+
+#+BEGIN_SRC ruby
+ @pose default bartender = working behind the bar
+#+END_SRC
+
+And an un-puppeted pose:
+
+#+BEGIN_SRC ruby
+ @set bartender/pose_sleep = "fiddling with something behind the bar"
+ #
+ @set bartender/pose_default = "working behind the bar"
+#+END_SRC
+
+And a good description:
+
+#+BEGIN_SRC ruby
+ @desc Bartender = A haughty-looking elf with green eyes and long blond hair with two intricate braids accentuating incredibly pointed ears. His nose, pointed, often points straight up in order to look down on you.
+#+END_SRC
+
+And give him the powers he deserves:
+
+#+BEGIN_SRC ruby :tangle no
+ @perm Bartender = Admin
+#+END_SRC
+
+As well as the automation:
+#+BEGIN_SRC evennia
+ py me.search("bartender").backstory("tavern")
+#+END_SRC
+
+And let’s make him initially invisible:
+
+#+BEGIN_SRC ruby
+ @set Bartender/hidden_tag = "hidden_bartender"
+ #
+ @lock Bartender = view:tag(hidden_bartender)
+#+END_SRC
+
+Let’s see if we can talk the bartender into a drink:
+#+BEGIN_SRC tcl
+ # Since this is still problematic getting an actual drink
+ # from our AI server, we will pretend and just work through it.
+
+ send "say to bartender Good day, sir. May I have that delicious serenade drink, again, please?\n"
+ sleep 10
+
+ send "drink\n"
+ expectit "You"
+
+ send "drink\n"
+ expectit "You"
+
+ send "drink\n"
+ expectit "You"
+
+ send "drink\n"
+ expectit "You"
+
+ send "drink\n"
+ expectit "You have nothing to drink"
+
+ send "say Thank you, sir\n"
+ expectit "Thank you"
+#+END_SRC
+
+Helpful commands:
+
+#+BEGIN_SRC ruby :tangle no
+ nick write $1 = py me.search('shrub').write("$1")
+ nick hi $1 = say to $1 = Greetings and welcome to the Wyldwood.
+ nick ticket = say regrettably All ticket holders drink free here.
+#+END_SRC
+
+**** Automated Responses
+Seems that different triggering hooks could have different delayed responses. What sort of events? And do we bother if we convert the Bartender to a Chatbot?
+
+#+BEGIN_SRC ruby
+ @set bartender/arrive:dabbler = "5 ;; say to old gnome Ah, welcome, sir. I've acquired another one of those whiskys from the Mud World. This one claims to taste like a... hrm... << burning hosptial ^ seagull's armpit, er wingpit, I guess ^ going down on a mermaid, wait, I believe you've done that ^ licking a salty ashtray >>. ;; 10 ;; emote takes a brown glass bottle from a chest, and pours some into a glass. ;; shake whisky = gnome"
+#+END_SRC
+
+#+BEGIN_SRC evennia
+ @set bartender/arrive = "4 ;; say Welcome to the |wWyldwood Bar|n. Read the sign for a list of our cocktails, and let me know what you'd like to drink."
+#+END_SRC
+
+
+And:
+@set bartender/leave:character
+@set bartender/say::character = “reg expression”
+@set bartender/sayto::character = “reg expression”
+@set bartender/leave:character
+@set bartender/leave:character
+
+#+BEGIN_SRC ruby :tangle no
+ @set bartender/sayto = {r"\bthanks?( you)?": "gm The << bartender ^ barkeep >> << mumbles ^ mutters ^ softly replies >> << back ^ >> to {1}, \"You're << very ^ >> welcome.\""}
+#+END_SRC
+
+#+BEGIN_SRC ruby :tangle no
+ @set bartender/say = {r"\bthanks?( you)?.*bar(tend|keep)": "gm The << bartender ^ barkeep >> << mumbles ^ mutters ^ softly replies >> << back ^ >> to {1}, \"You're << very ^ >> welcome.\""}
+#+END_SRC
+
+First, split the line into its parts, and if:
+
+ - Single number? That is the amount to wait between that, and another other command following. Default to 2?
+ - We =execute_cmd= for everything else.
+
+To do this, we need to update =announce_move_from= and =announce_move_to= to send a trigger message to the =Puppets= in the room.
+**** Puppeting
+Let’s convert the Bartender to a Chatbot using [[file:~/src/moss-n-puddles/personalities/tavern.md][tavern.md]]. This way, talking to the Bartender *answers* from everyone.
+
+#+BEGIN_SRC evennia
+ @set bartender/personality = "tavern"
+ #
+ @set bartender/personality_file = "personalities/tavern.md"
+#+END_SRC
+
+**** Hide and Seek
+First create a number of magic rings equal to the number of players, minus one:
+
+#+BEGIN_SRC evennia :tangle no
+ @create magic ring:typeclasses.things.MagicRing
+ #
+ @desc magic ring = Octarine sparks fly when you don this ring.|/Commands: |gtransform|n and |guntransform|n.
+ #
+ give magic ring to _char_
+#+END_SRC
+
+And create a monocle:
+
+#+BEGIN_SRC evennia :tangle no
+ @create monocle:typeclasses.things.MagicMonocle
+ #
+ @desc monocle = Allows you to see past magical illusions. |/Command: |gpeer