!----------------------------------------------------------------------------
! Visual.inf (Visualizing) Doe's Scenery Example                      5/10/99
! Copyright 1999 by The Tame Computer, Marnie Parker
! All rights reserved.                            (aka Doe) [email protected]
!
! The source code is solely for educational purposes, it may not be changed,
! recompiled (when changed), and redistributed by anyone but the author.
!----------------------------------------------------------------------------

! The creek near where I lived. Real life stuff and probably boring as hell,
! but it is meant to be more experiential than a "story". This is definitely
! a more complicated entry than most newbies would write. Took me about 4-6
! weeks all told. With longer time and more polishing, it could be better.

! Note:  Discussion of puzzle vs. non-puzzle through out this source code
! pertains to earlier art shows when "puzzles" were not allowed. Rules
! were changed for IF Art Show 2000, because I thought the basic point of
! the show had been made well enough that puzzles could now be allowed.
! 3/9/00 Doe

! I suppose it does have an "end goal", getting across the creek and swinging
! on rope and/or putting the egg in the nest. Technically that may mean it
! doesn't fit the rules. See comments about "puzzles" above PrintTaskName.

! Nothing startling or unusual in this code, but I plan to share it later.
! Mainly for Inform newbies, although the code is chunky and not elegant.

! Kathleen Green turned up errors with MaxZip, regardless of the fact this
! had been thoroughly beta tested. Version 1.01, changed if (noun == second)
! rfalse, to if ((second ~= 0) && (noun == second)) rfalse. Version 1.02
! replaced add_to_scope knee hand 0 0, with add_to_scope knee hand scab
! splinter and added attribute hurt to determine if player now had scab
! or splinter (previously used if (player.&add_to_scope-->2 == 0)).
! Version 1.03, found array task_scores was one too short because I had
! added a task at the last minute, so added another one. Version 1.05 added
! this note, cleaned up some code and recompiled. Also found Achieved(5),
! put board in creek was not scored. Version 1.07 tried to fix another
! MaxZip error with the up direction on the west bank (not sure it did).

!----------------------------------------------------------------------------
! Globals
!----------------------------------------------------------------------------

switches s;

!Constant DEBUG;

Constant Story "^Visualizing^";
Constant Headline "Copyright 1999 by The Tame Computer, Marnie Parker,
                  all rights reserved^Version 1.70 / ";

Replace TieSub;
Replace WakeSub;

Constant TASKS_PROVIDED;       ! Check off the "activities".
Constant NUMBER_TASKS = 13;
Constant MAX_SCORE = 12;
Constant AMUSING_PROVIDED;

Array task_scores -> 1 1 1 1 1 1 1 1 1 1 1 1 1 1;

Attribute flown;      ! player tried to fly (first time)
Attribute crushed;    ! jars and/or nest
Attribute splattered; ! rocks splattered with muck
Attribute smeared;    ! anything egg is thrown at
Attribute hurt;       ! knee scabbed or hand has splinter
Attribute infected;   ! picked scab too many times (hand)
                     ! or hurt nest too many times (player)
Attribute lump;       ! hand gets lump from hitting board
Attribute muddy;      ! hand is muddy (player has put mud on it)
                     ! also for inside shed timer (inside_shed)
Attribute touched;    ! player touched/tried touching something
                     ! picked up rocks (first time, rock1 & rock2),
                     ! picked off scab (knee), scratched rash (first time
                     ! without mud on it, hand), touched bush again after
                     ! it is known to be poison oak (first time, bush),
                     ! hugged tree (first time, player), pushed tree
                     ! while on rope (for speeding up message, elm)
                     ! tried to tie a knot in the rope (rope), thrown
                     ! egg at broken jars (jars)
Attribute braved;     ! player tried something brave
                     ! pissed in creek (player), tried taking knee or hand
                     ! (knee/hand), tried eating rock (rock1 & rock2), tried
                     ! jumping across creek (creek), carried board down slope
                     ! (by_shed), examined jars closely and recognized contents
                     ! (jars), tried to tie another knot in rope (rope),
                     ! inside shed timer (inside_shed)
                     ! eating worm (ditty, first time, worm)
                     ! pissing in shed (first time)
Attribute foundordone;! puzzle/object found or done
                     ! pissed again after hugging tree (player),  gone up
                     ! slope (first time, east_creek), knee skinned (knee),
                     ! rash erupted (hand, timer), rock2 found (rock2), eyes
                     ! adjusted in shed (first time, inside_shed), seen jars
                     ! (last time, jars), crossed creek (west_creek)

! Note:  I usually use the general attribute usually to indicate if a daemon or
!        timer is still running. I also put these notes in for myself to
!        double check my use of attributes. Actually, I got lost. :-) I probably
!        could have trimmed off some, but some objects needed 3-4 attributes.
! general:  tried to open eyes (player), picked up one rock (rock1 & rock2),
!           scab has formed (timer, knee), itch timer is running (hand),
!           listened or smelled before prompted to do so (east_creek),
!           tried to go west first time (without board in creek, creek), gone
!           down slope without board (first time, by_shed), recognized poison
!           oak (first time, bush), eyes still unadjusted in shed (inside_shed),
!           seen jars (first time, jars), hit board while it is in the water
!           (first time, board), examined outside of shed (first time, shed),
!           picked up egg (egg), smashed_egg timer has expired (smashed_egg),
!           rope daemon is running (rope)

Property state 0;

Replace NotifyOnSub;
Replace NotifyOffSub;
Replace DrawStatusLine;

#include "parser";
#include "outofrh2.h"; ! altered for dropping egg from rope

! Note:  Delete verbs and verbsubs if share code (so won't compile).
!----------------------------------------------------------------------------
! Control Routines
!----------------------------------------------------------------------------

! Change score reporting to things to do.

Object LibraryMessages "lm"
with before
[ i j; Miscellany:
                if (lm_n == 4)
                {  print " You open your eyes ";
                   rtrue;
                }

! This section of code comes from Ken Fair ([email protected]).
! Posted to raif -- Subject: Re: [Inform] "I don't know the word 'vocabulary'."
! Date: Sun, Nov 23, 1997 23:51 EST -- in response to a query on how to make
! Inform behave more like the old Infocom games. Replaces the default Inform
! library response "You can't see any such thing."  Thanks, Ken!
! Note: Does not handle parsed names. Will create a warning upon compile.

                if (lm_n == 30)
                {  wn = 1;
                   while (i = NextWordStopped())
                      if (i == -1)
                      { if ((location == inside_shed) &&
                            (inside_shed hasnt foundordone))
                             "You are still too blinded to see.";
                        "You can't see that here.";
                      }
                   i = (wn * 4) - 4;
                   print "[I don't know the word ~";
                   for (j = 0 : j < parse->i : j++) {
                      print (char) buffer->(parse->(i+1) + j);
                   }
                   ".~]";
                }

                if (lm_n == 39)
                {  if (lm_o has pluralname)
                      "They're not important in and of themselves.";
                   "That's not important in and of itself.";
                }
   Examine:     if (lm_n == 2)
                { if (lm_o == u_obj or d_obj)
                  { print "You see nothing special about ";
                    if (lm_o == u_obj)
                    {  if (location == inside_shed) "the ceiling.";
                       "the sky.";
                    }
                    if (lm_o == d_obj)
                    {  if (location == inside_shed) "the floor.";
                       "the ground.";
                    }
                  }
                }
   Score:       if (deadflag)
                   print "You found ";
                else
                   print "So far you have found ";
                print score;
                if (score == 1) print " activity"; else print " activities";
                print " of a possible ", MAX_SCORE,
                ", in ", turns, " turn";
                if (turns>1) print "s";
                return;
   FullScore:   if (lm_n == 1)
                {   if (deadflag) print "The activity list was ";
                    else          print "The activity list is ";
                    "made up as follows:^";
                }
];

! Don't show score on status line.

[ DrawStatusLine width;
  @split_window 1; @set_window 1;
  @set_cursor 1 1; style reverse;
  width = 0->33;
  if (width == 0) width = 80;
  spaces (width-1);
  @set_cursor 1 2;
  print (name) location;
  @set_cursor 1 1; style roman; @set_window 0;
];

! Not included:  barfing, pissing, scratching something other than rash,
!                flying, eating rock/board/bush, holding nose, breaking
!                all jars and/or breaking some and pissing in shed, taking
!                flowers into shed, throw rocks at egg and vice-a-versa

! The above are optional experiences. Actually most are except for 4-10.
! Added holding nose and breaking all jars, pissing in shed, flowers and
! throwing egg at rocks or rocks at egg and getting large rock gooey.
! Decided to leave these actions unmentioned by scored tasks AND amusing after.

! Is taking the board and putting it across the creek a puzzle? Maybe. Except
! it is EASY and not puzzling. However, the player has to do it to "finish".

! Is putting the mud on the rash a puzzle? Maybe, it stops the itch. Except it
! is optional, doesn't resolve something that is an obstacle to proceeding and
! doesn't provide another object for another puzzle. Also after the first itch
! if the player doesn't scratch it won't itch again. I.E. Scratching makes
! it itch more (like a real case of poison oak, hehehe).

! Is taking flowers into shed, when you can't get into it anymore because
! you have broken all the jars, a puzzle? Yes, definitely. But choosing
! to break ALL the jars is optional and wanting to recover the large
! rock from the shed once it stinks so much the player can't stay, is also
! optional. Still, had to have a way for the player to get in. Since it is
! optional and not mentioned by scored tasks (thinking of omitting breaking all
! jars from amusing as well), it is really a branch the player can find or not.

! Note that the player can get the same score whether they rescue the egg
! (put it in the nest and leave it unharmed) and/or destroy it. Of course, if
! they rescue it and then hug the tree, Gaia is pleased.

! Exhibit ends when:  player persists in trying to cross the sunken board,
! jumps off the swing to the bank (when the board is sunken), jumps off the
! swing into the water, hugs tree when unsmashed egg is in the nest or when
! timer expires.

[ PrintTaskName achievement;
 switch(achievement)
 {   0: "thrown the small rock at shed and/or tree and/or skipped it on the creek";
     1: "thrown the large rock at shed and/or tree and/or tossed it in the creek";
     2: "managed to climb up the slope";
     3: "snatched the board";
     4: "got the board down the slope";
     5: "put the board across the creek";
     6: "crossed to other side of the creek";
     7: "swung in the swing and/or jumped from the swing";
     8: "shattered the bottles with the large rock and/or crushed/rescued the egg";
     9: "picked scab and/or scratched rash";
    10: "hugged the tree, eaten mud and/or got splinter in and/or lump on hand";
    11: "listened and/or smelled (before AND after tape prompted either)";
    12: "a bonus - * environmentalist gold star for not picking the wild flowers";
 }
];

[ PrintRank; "."; ];

[ Amusing;
 print "Did you try...^
        floating?^
        eating a rock?^
        tasting the board or shed?^
        fishing for the large rock after throwing it in the creek?^
        picking the scab repeatedly?^
        scratching a body part other than your hand?^
        taking your hand and/or knee?^
        eating mud repeatedly?^
        eating the worm?^
        eating the egg?^
        peeling the egg?^
        peeling some other things?^
        throwing the egg at the tree, shed or jars?^
        putting the large rock in the nest?^
        hugging the tree after some polluting/home wrecking action?^
        hugging the tree again after another polluting/home wrecking action?^";
];

[ ChooseObjects obj code;
     if (code<2) { if (obj has scenery) return 2; rfalse; }
     if ((action_to_be==##ThrowAt or ##Insert or ##PutOn or ##Examine or
          ##SmellThing or ##Touch or ##Eat or ##Taste or ##Peel or ##Rub) &&
        (obj in player))
        return 3;
     if (action_to_be==##Fish && obj in creek) return 3;
     if (obj hasnt scenery) return 2;
     return 1;
];

#include "verblib";

!----------------------------------------------------------------------------
! Customized Grammar
!----------------------------------------------------------------------------

#include "grammar";

Verb meta 'help' 'hints' 'hint' 'about' 'information' 'info' 'instructions'
'instruct'
     *                                  -> Help;

! Real Actions

Extend 'get' first
     * 'down'                           -> Exit;

Extend 'eat' replace
     * noun                             -> Eat;

Extend 'swim' replace
     *                                  -> NoSwim
     * 'in' noun                        -> NoSwim;

Extend 'peel' replace
     * noun                             -> Peel
     * 'off' noun                       -> Take;

Extend 'smell' replace
     *                                  -> Smell
     * noun                             -> SmellThing;

Extend 'put' last
     * multiexcept 'across'/'over' noun -> PutOn
     * 'head'/'face' 'in'/'into'/'under' 'water'/'creek'/'stream'/'river'
                                        -> UnderWater;

Extend only 'throw' replace
     * held 'at'/'against'/'on'/'onto'/'in'/'into' noun
                                        -> ThrowAt;
Extend 'push' last
     * 'off' noun                       -> Push;

Extend 'cross' last
     * noun 'with' noun                 -> Bridge;

Verb 'crush' = 'attack';
Verb 'wade'  = 'swim';
Verb 'lick'  = 'taste';

Verb 'kick'
     * noun                             ->Kick;

Verb 'grab'
     * noun                             -> Grab;

Verb 'untie'
     * noun                             -> Untie
     * noun 'from' noun                 -> Untie;

Verb 'bridge' 'span'
     * noun 'with' noun                 -> Bridge;

Verb 'fish'
     *                                  -> Fish
     * 'for' noun                       -> Fish;

Verb 'splash' 'paddle' 'wash'
     *                                  -> Paddle
     * noun                             -> Paddle
     * noun 'in' noun                   -> Paddle;

Verb 'skim'
     * held                             -> SkipOn
     * held 'on'/'over'/'across' noun   -> SkipOn;

Extend only 'skip' replace
     *                                  -> Jump
     * held                             -> SkipOn
     * held 'on'/'over'/'across' noun   -> SkipOn;

Extend 'pick' last
     * noun                             -> PickIt
     * 'nose'                           -> PickIt
     * 'off' noun                       -> PickIt;

Extend 'jump' last
     * 'on'/'onto' noun                 -> Enter;

! "Fake" actions for wiseass players

Extend 'open' last
     * 'eyes'                           -> Wake
     * 'your' 'eyes'                    -> Wake
     * 'my' 'eyes'                      -> Wake;

Extend 'take' last
     * 'leak'                           -> Piss
     * 'leak' 'in' 'creek'              -> Piss
     * 'leak' 'in' 'water'              -> Piss
     * 'nose'                           -> HoldNose;

Extend 'go' last
     * 'to' 'bathroom'                  -> Piss;

Extend 'throw' last
     * 'up'                             -> Vomit
     * 'up' 'cookies'/'lunch'/'dinner'/'breakfast'
                                        -> Vomit;

Verb 'fly' 'soar' 'float'
     *                                  -> Fly;

Verb 'pinch'
     * 'nose'                           -> HoldNose
     * 'nose' 'closed'                  -> HoldNose;

Verb 'barf' 'vomit' 'heave' 'toss'
     *                                  -> Vomit
     * 'up'                             -> Vomit
     * 'cookies'                        -> Vomit
     * 'your' 'cookies'                 -> Vomit;

Verb 'piss' 'urinate' 'pass' 'pee'
     *                                  -> Piss
     * 'water'                          -> Piss
     * 'in' 'creek'                     -> Piss
     * 'in' 'water'                     -> Piss
     * 'water' 'in' 'creek'             -> Piss
     * 'water' 'in' 'water'             -> Piss;

Verb 'scratch'
     *                                  -> Scratch
     * 'crotch'/'scrotum'/'penis'/'ass'/'rear'/'butt'/'bottom'
                                        -> NaughtyS
     * 'clitoris'/'vagina'/'thatch'/'pussy'/'fanny'
                                        -> NaughtyS
     * 'balls'/'boobs'/'buttocks'       -> NaughtyP
     * 'jock' 'itch'                    -> NaughtyS
     * 'head'/'face'/'nose'/'neck'/'arm'/'leg'/'foot'
                                        -> NaughtyS
     * 'arms'/'legs'/'feet'             -> NaughtyP
     * noun                             -> Scratch;

! A real one sneaked in here.

!----------------------------------------------------------------------------
! Meta Routines
!----------------------------------------------------------------------------

[ HelpSub;
 print "This is a scenery example. I created the IF Art Show for several reasons:
        to explore interactivity (IF's 3-dimensionality), to help people look at IF
        differently, to encourage creativity without the burden of too much structure,
        to provide a way for IF authors get their ~feet wet~ without having to write a
        ~game~ and because it is the sort of ~contest~ I would like to enter.^^
        ~Visualizing~ is based on ~real~ life and is simple since its sole purpose is
         to explore, to be experiential. However, technically it is a complex,
         probably more than a newbie could write. This is to illustrate that an entry
         doesn't HAVE to be simple to stay within the rules. There is a definite ending,
         four locations and five takeable objects, but those are really only important for
         interacting with the scenery. Daemons/timers are also used for special effects.^^";
 print "This example also deliberately raises questions about ~What is a plot and
        what is a puzzle?~ There are directive comments, but those are covered by the
        rules as hints to the player. There are things to do, but none are really
        puzzling or help solve scored tasks or help the player ~win~. ~Visual~
        also flirts with an ~end game~. I hope this makes clear that although the IF
        Art Show rules are firm, they are also flexible enough to allow some leeway.^^
        The score is a ~task done~ type, a list of activities. You can finish without
        doing them all. Enter full or fullscore to see which activities you have found.^^";
  "Thank you to beta testers:  Stuart Barrow, Keith A. Marrocco, David Myers,
   Doug Sojourner and Zimriel for their help with including more synonyms, finding
   bugs and improving overall play. Also to Adam J. Thornton, for his outrageous
   suggestions, beta testing and editing. If you have comments/reactions/bug
   reports/arguments about how this example ~broke the rules~/etc., please email:\
  ^^                                   Marnie Parker  doeadeer3@@64aol.com";
];

! Make sure score notification can't be turned back on.

[ NotifyOnSub; "For score enter score."; ];
[ NotifyOffSub; "For score enter score."; ];

! The "ending".

[ Satisfied i;
 if (wild hasnt touched) Achieved(12);
 print "You have that same sore and exhausted but happy feeling you had as a
        child after a good day of exploring. You have:^^";
 for (i=0:i<NUMBER_TASKS:i++)
     if (task_done->i==1)
     {  print "  ";
        PrintTaskName(i);
     }
 if ((egg in nest) && (task_done->12~=0))
 {  print "  ";
    print "(So it was a lie. Conservation isn't always JUST its own reward.)^";
 }
 print "^It almost feels like you were really there. You're satisfied.";
 deadflag = 2;
];

!----------------------------------------------------------------------------
! Verb Routines
!----------------------------------------------------------------------------

! Real Verbs

[ SmellThingSub; <<Smell>>; ];

[ GrabSub; <<Take noun>>; ];

[ PeelSub; <<Take noun>>; ];

[ TieSub;
 print_ret (CTheyreOrThats) noun, " not something you can tie.";
];

[ UntieSub;
 print_ret (CTheyreOrThats) noun, " not something you can untie.";
];

[ KickSub; <<Attack noun>>; ];

[ PickItSub;
 if (noun == 0) "Sheesh. There is a lot of realism in this exhibit, but not THAT much. Gross.";
 print_ret (CTheyreOrThats) noun, " not something you can pick.";
];

[ PaddleSub;
 if (noun ~= 0)
 { if ((noun ~= hand or knee or player) && (noun notin player))
      print_ret "You aren't holding ", (the) noun, ".";
   if (noun == knee) "Huh?";
   if (noun == wild)
   { if (wild.time_left < 10) "Water won't revive them.";
     "Water won't do them any good.";
   }
   if (noun == board) "The board is too unwieldy to paddle in the water.";
 }
 if ((second ~= 0) && (second ~= creek)) "Huh?";
 if (second == 0) second = creek;
 if (RunRoutines(second,before)~=0) rtrue;
 <<Touch creek>>;
];

[ NoSwimSub;
 if ((second ~= 0) && (second ~= creek)) "Huh?";
 if (location == inside_shed) "But you can't see the creek here.";
 if (location == by_shed) return Std_Msgs(2, creek);
 print "Ugh. The creek is too dirty and shallow to be an appealing swimming hole";
 if (player has braved) ". (Especially after you peed in it, for pete's sake!)";
 ".";
];

[ FishSub;
 if (noun == 0) "But you don't have a fishing pole.";
 if (noun notin creek) print_ret "But ", (the) noun, " isn't in the water.";
];

[ SkipOnSub;
 if ((second ~= 0) && (second ~= creek))
    "Unlikely (even for a visualization exercise).";
 if (noun == board) "The board is too heavy to skip.";
 if (second == 0) second = creek;
 if (RunRoutines(second,before)~=0) rtrue;
 <<ThrowAt noun creek>>;
];

[ UnderWaterSub;
 <<LookUnder creek>>;
];

[ BridgeSub;
 if (noun ~= creek) "Huh?";
 <<Insert second noun>>;
];

! "Fake" Verbs

[ WakeSub;
 if (player hasnt general)
 {  give player general;
    "You don't want to! Not when you feel you are finally getting somewhere
     with this visualization stuff.";
 }
 "No.";
];

[ HoldNoseSub;
 if (location ~= by_shed or inside_shed)
   "That's cute. You do that often?";
 "You hold your nose, but it doesn't seem to really help, so you stop.";
];

[ PissSub;
 if (location == by_shed)
    "But you can't reach the creek from here.";
 if (location == inside_shed)
 {  if (inside_shed hasnt braved)
    { give inside_shed braved;
      "Crude, but fortunately for you, Gaia doesn't care about what happens indoors.
       However, that really made the stink much, much worse. (Done.)";
    }
    "Really, once was quite enough! (Not done.)";
 }
 if (player in rope)
    "You'll have to get off the rope first.";
 if (player hasnt braved)
 {  give player braved;
    "Boy, some people! Show them water out of doors and they have one-track minds.
     Polluting this sweet piece of IF! If that isn't a compelling enough argument,
     remember, all creeks and rivers are in trouble. Get in touch with Gaia! (Done.)";
 }
 if (player has touched)
 {  if (player hasnt foundordone)
    {  give player foundordone;
       "Gaia has revoked her pardon and notified her enforcers, the TERMITES. Your home
        should make a nice little snack before the tornado/earthquake/flood hits. (Done.)";
    }
    if (player has infected)
       "Tempting fate? Gaia is already as pissed off as she can be. (Not done.)";
    "Seen any termites yet? Hmmm, isn't that a faint crunching sound in the background? (Done.)";
 }
 "Maybe a sign, ~Polluters Will Be Fined Until They Bleed~, should be posted. You definitely
  haven't gotten in touch with Gaia. (Not done.)";
];

[ VomitSub;
 "There is such a thing as carrying realism in visualization too far.
  That's too far.";
];

[ FlySub;
 if (player hasnt flown)
 {  give player flown;
    if (player in rope)
       print "Hey neat! You lift off the rope and drift gently upward, feet dangling. But
              when you are only a few feet up you fall back, barely managing to grab the
              rope again, avoiding a nasty crash landing. ";
    else
       print "Hey neat! Your lift off the ground and you drift gently upward, feet dangling.
              But when you are only a few feet up you fall back with a jarring crash. ";
    "You just remembered you are trying to be realistic, not fantastic. How deflating.";
 }
 "Sorry, you haven't earned enough frequent flyer miles. Or wings.";
];

[ NaughtySSub;
 "That doesn't itch. (No, it doesn't!)";
];

[ NaughtyPSub;
 "They don't itch. (No, they don't!)";
];

[ ScratchSub;
 "But nothing itches.";
];

!----------------------------------------------------------------------------
! Special Routines
!----------------------------------------------------------------------------

! I tend to make my own Library Messages for each "game". So I'm lazy. Saves
! on code and saves me trying to think up something different to say each time.

[ Std_Msgs n x usebut;
 switch(n)
 { 1 : "Played this before, eh?";
   2 : if (x ~= 0) print_ret (The) x, " is too far away.";
       "It is too far away.";
   3 : "You can just brush the nest with your finger tips.";
   4 : if (usebut) print "But your ";
       else print "Your ";
       "fingers are already gripping the small rock.";
   5 : "The large rock already fills your palm.";
   6 : if (usebut) print "But balancing ";
       else print "Balancing ";
       "the board is taking both of your hands.";
   7 : if (usebut) print "But you ";
       else print "You ";
       "are already gently cradling the egg.";
   8 : "You are swinging too far away from the tree trunk to reach it.";
   9 : "Sure, and get a splinter in your tongue. Do you lick frozen flag poles too?";
  10 : "The board has thoroughly sunk into the mud and dark water. You can't see it.";
  11 : print_ret (The) x, " don't really make a good missile.";
  12 : "You can only kick something freestanding.";
  13 : "You can't kick that high.";
  14 : "Er, the laws of physics? You can't throw something at itself.";
 }
];

[ Dalmer obj;
 if (obj == knee)
    print "The knee bone is connected to the thigh bone and the thigh
           bone is connected to the... ";
 else
    print "The hand bone is connected to the arm bone and the arm
           bone is connected to the... ";
 if (obj hasnt braved)
 {  give obj braved;
    if (((obj == knee) && (hand has braved)) ||
        ((obj == hand) && (knee has braved)))
       "it also seems to be a part of you.";
    "it seems to be part of you.";
 }
 "aren't you getting tired of this song?";
];

[ SmashEgg loc;
 Achieved(8);
 remove egg;
 move smashed_egg to loc;
 StartTimer(smashed_egg, 15);
];

[ AttachSmear obj loc;
 Achieved(8);
 give obj smeared;
 remove egg;
 move smashed_egg to loc;
 StartTimer(smashed_egg, 15);
 move smear to loc;
 smear.number = obj;
];

[ DettachSmear obj;
 give obj ~smeared;
 if (obj has touched)
    give obj ~touched;
 smear.number = 0;
 remove smear;
];

[ WashOffMud inc;
 give hand ~muddy;
 hand.number = 6;
 if (hand has general)
    StopTimer(hand);
 StartTimer(hand, hand.number);
 if (inc) print ". Unfortunately, that also ";
 else print ". That ";
 "washed off the mud soothing your itch.";
];

[ SeeBoard;
 if ((location == inside_shed) && (board has concealed))
 {  if (jars has foundordone)
       print "^But not before you notice... ";
    else print "^";
       "The bottom shelf is empty. It is really just a long wooden board.";
 }
 if ((location == east_creek or west_creek) && (board in creek) &&
    (board.number < 3))
    print ". Spanning the creek is a board";
];

[ SeeSmashed;
 if (jars has crushed)
    print " Several of the jars are broken, their vile contents spilling out.";
];

[ SeeJarSmear;
 if (jars has smeared)
 {  if (jars has touched)
       print " On one jar is a gooey, yellow smear.";
    else
       print " Artistically and abstractly dribbled in the yucky, watery, muck is a
               gooey, yellow trail of egg.";
 }
];

[ GetSplinter obj usepush;
 if (hand hasnt hurt)
 {  Achieved(10);
    give hand hurt;
    if (usepush)
       print "You push, rubbing your hand up and down the rough ";
    else print "You rub your hand up and down the rough ";
    if (obj == shed) print "boards.";
    else print "board.";
    if (usepush)
       print " The shed is stronger than it looks, the boards only give a little.";
    " You get a splinter. Smarts.";
 }
 "Children may be inconsiderate of their own health and used to minor injuries,
  but you should really know better. Unless, of course, you play graphic games.";
];

!----------------------------------------------------------------------------
! Classes (Only one except for InsideOrOn from outofrch.h)
!----------------------------------------------------------------------------

Class Rock
with name "rock" "stone" "pebble" "gravel" "rocks" "stones",
     state 0,
     description
     [; if (self hasnt moved)
        { print "It's a rock";
          if (self has smeared) ". On it is a gooey, yellow smear.";
          ".";
        }
        if (self == rock1) "The small rock is a little larger than a backgammon piece.";
        print "The large rock is about the size of a baseball";
        if (self has smeared) ". On it is a gooey, yellow smear.";
        ".";
     ],
     before
     [; Take : if ((self == rock2) && (rock1 in player))
                  return Std_Msgs(4);
               if ((self == rock1) && (rock2 in player))
                  return Std_Msgs(5);
               if (board in player)
                  return Std_Msgs(6);
               if (egg in player)
                  return Std_Msgs(7);
               if (self hasnt general)
               { give rock1 general;
                 give rock2 general;
                 if (~~(voice.sound_prompt)) voice.number = 3;
                 print "As you pick it up, the rock is warm in your hand. ";
               }
               if (self hasnt touched)
               {  give self touched;
                  if (self == rock1)
                     print "A finger traces one edge that is slightly sharp, but otherwise you can feel it is smooth and flat. ";
                  else
                  {  print "Your fingers curl around it's oblong smoothness";
                     if (self has smeared) print ", but draw back slightly from the gooiness";
                     print ". It fits snugly in your palm. ";
                  }
               }
               if (self has splattered)
               {  give self ~splattered;
                  print "You fastidiously (and almost compulsively) wipe the splattered ";
                  if (self has smeared)
                  {  DettachSmear(self);
                     print "and smeared ";
                  }
                  print "rock off on the ground, before picking up it up. ";
               }
     Eat, Taste : if (self notin player)
                  print_ret "You need to be holding the ",
                             (name) self, " before you can eat it.";
                 if (self has braved)
                    "Real players don't eat rocks.";
                 give rock1 braved;
                 give rock2 braved;
                 if (self.state == 1)
                 { self.state = 0;
                   print "But you can't really imagine eating a rock either, ";
                 } else print "You can't really imagine eating a rock, ";
                 "so as you raise it to your lips it morphs into rock candy. Hesitant to strain
                  the tenuous reality of your visualization, you stop. The candy instantly morphs
                  back to rock.";
     ThrownAt  : if (self has concealed) print_ret "You can't see ", (the) self, ".";
                 if ((second ~= 0) && (noun == second)) return Std_Msgs(14);
                 if (noun == wild) return Std_Msgs(11, wild);
                 if (noun == egg)
                 {  if (self == rock2)
                    { AttachSmear(rock2, location);
                      "The egg hits the large rock dead-center, leaving a gooey, yellow smear. The
                       rest oozes off it to the ground.";
                     }
                     else
                     {  SmashEgg(location);
                        "The egg completely misses the small rock, but the shell breaks open
                         when it crashes on the ground. Junk oozes out.";
                     }
                 } else move noun to location;
                 if (noun == board)
                 {  print "The board ";
                    if (voice.sound_prompt) print "thuds on";
                    else print "hits";
                    " the ground.";
                 }
                 "The rocks make a banging sound as they hit each other.";
       Attack : if (self has concealed) print_ret "You can't see ", (the) self, ".";
                "Ouch!";
         Kick : if (self has concealed) print_ret "You can't see ", (the) self, ".";
                if (self in player) return Std_Msgs(12);
                if (self == rock1)
                { print "You kick the small rock";
                  if (location == by_shed)
                  {  print ", ";
                     move self to east_creek;
                     if (voice.sound_prompt) print "with a clatter ";
                     "it disappears down the slope.";
                  }
                  if (location == inside_shed)
                  {  if (voice.sound_prompt)
                        ". It lightly taps a shed wall.";
                     ". It hits a shed wall lightly.";
                  }
                  if (location == east_creek) move self to west_creek;
                  else move self to east_creek;
                  print ". It sails completely over the creek, ";
                  if (voice.sound_prompt) print "clattering when it lands ";
                  else print "landing ";
                  "on the other side.";
                }
                print "You kick the large rock. ";
                if (location == by_shed)
                {   move self to east_creek;
                    if (voice.sound_prompt) print "It bangs";
                    else print "It rolls";
                    " down the slope.";
                }
                if (location == inside_shed)
                {  if (voice.sound_prompt)
                      "It thuds into a shed wall. Boards rattle.";
                   "It hits a shed wall. Boards shake.";
                }
                move rock2 to creek;
                give rock2 concealed;
                if (location == east_creek) rock2.number = west_creek;
                else rock2.number = east_creek;
                print "It starts to sail over the water, but falls short, plunging below the surface near the ";
                if (location == east_creek) print "western"; else print "eastern";
                print " bank";
                if (voice.sound_prompt) print " with a loud splash. ";
                else print ". ";
                "Ripples swirl outward from the spot.";
         Peel : if (self hasnt braved)
                { self.state = 1;
                  print "You can't imagine trying to peel a rock, so you try to imagine eating it instead. ";
                  <<Eat self>>;
                }
                "Where's the rock tumbler?";
     Touch    : if (self notin player) print_ret "You can feel ", (the) self, " better if you hold it.";
                if (self==rock1) print_ret (The) self, " is flat with one slightly sharp edge.";
                if (self has smeared)
                   print_ret (The) self, " is smooth and oblong, but the smear is gooey.";
                print_ret (The) self, " is smooth and oblong.";
     Rub      : if (((self hasnt smeared) && (self hasnt splattered)) &&
                    (self notin player)) <<Touch self>>;
                if ((self has smeared) || (self has splattered))
                {  if (player in rope) "You'll have to get off the rope first.";
                   print "You lean over and rub ", (the) self, " back and forth on the ground, wiping off the ";
                   if (self has splattered)
                   { give self ~splattered;
                     print "splatters";
                     if (self has smeared) print " and ";
                   }
                   if (self has smeared)
                   {  DettachSmear(self);
                      print "smear";
                   }
                   ".";
                }
                print_ret (The) self, " feels very solid.";
   SmellThing : if (~~(voice.smell_prompt)) <<Smell>>;
                if (east_creek has general) Achieved(11);
                if ((self has splattered) && (self has smeared) && (smashed_egg has general))
                   "You take a whiff and wish you hadn't. Rancid vinegar with dashes of sulfur,
                    up close and personal.";
                if (self has splattered)
                   "You take a whiff and wish you hadn't. Rancid vinegar, up close and personal.";
                if (self has smeared) <<SmellThing Smear>>;
                "It is a strange fact of life that rocks don't have much odor, normally.";
     ];

!----------------------------------------------------------------------------
! Start
!----------------------------------------------------------------------------

[ Initialise;
 print "^^^You are determined to improve your visualization skills. You popped your
           newly bought cassette in the recorder, lit some incense, stretched out
           on the couch, closed your eyes and followed the muscle relaxation steps.^^
           The tape instructed you to visualize a favorite spot, maybe a
           place you played as a child. Slow hypnotic music plays in the background
           as occasionally more instructions are uttered over it by a soothing voice.^^
           At first you concentrate too hard and stare intently at the red of your
           eyelids. Then, slowly, slowly, you relax and find yourself...^";
 notify_mode = false;     ! Turn off score notification.
 player   = newselfobj;
 location = east_creek;
 StartTimer(wakeup_call, 180);
 StartDaemon(voice);
];

!----------------------------------------------------------------------------
! Player Changed to INTERACT with the Scenery.
!----------------------------------------------------------------------------

Object newselfobj "(self object)"
 has concealed animate proper transparent
 with short_name
      [;  return L__M(##Miscellany, 18);
      ],
      description
      [;  if (~~(voice.depth_prompt))
             "You don't seem to be able to visualize a clear picture of yourself.";
          "You are still cloudy to yourself, but you seem to be child-size.";
      ],
      before NULL,   after NULL,    life NULL,    each_turn NULL,
      time_out NULL, describe NULL,
      capacity 100, parse_name 0,
      orders 0, number 0,
   add_to_scope knee hand scab splinter;

Object knee "your knee"
 has concealed proper
 with name "knee" "my", article "your",
      description
      [; if (self hasnt foundordone)
            "Dimpled.";
         if (self has hurt)
         {  if (scab has infected)
               "Your knee has a big angry red scab tinged with black. Yep, it's infected.";
            "Yep, it's a BIG scab.";
         }
         if (self has touched)
            "Since you couldn't keep your hands to yourself, naturally your knee is bleeding.";
         "Your knee is well and truly skinned. It will make an impressive scab.";
      ],
      number 0,
      before
      [; PickIt            : if (self hasnt foundordone)
                                return Std_Msgs(1);
                             if (self hasnt hurt)
                                "Too soon. The scab hasn't formed yet.";
                             if (scab has infected)
                                "Looking at the infected scab you decide that annoying standard library response,
                                 ~Keep your hands to yourself!~, may have a point after all. So you don't pick.";
                             give self ~hurt;
                             if (self hasnt touched)
                             {  give self touched;
                                Achieved(9);
                             }
                             StartTimer(self, 6);
                             self.number++;
                             if (self.number == 2)
                               "You keep this up and it's going to get inflected! You pick off the scab.";
                             if (self.number == 3)
                             {  give scab infected;
                                "You pick off the scab one more time. Your knee is bleeding again.";
                             }
                             "You pick off the scab. That was smart! Now it's bleeding again.";

        Take, Remove, Pull : Dalmer(self); rtrue;
        Scratch            : <<PickIt self>>;
        Attack             : "Ouch!";
     ],
     time_left 0,
     time_out  [; give self hurt; ];

! Stuck with one hand, because player could be right or left handed.

Object hand "your hand"
 has concealed proper
 with name "hand" "hands" "palm" "rash" "red" "my", article "your",
      parse_name
      [ i j k l;
         if (self has lump) j='lump'; else j=-1;
         if (self has foundordone) k='red'; else k=-1;
         if (self has foundordone) l='rash'; else l=-1;
         while (NextWord()==j or k or l or 'my' or 'hand' or 'hands' or 'palm') i++;
         return i;
      ],
      description
      [; if ((self hasnt foundordone) && (self hasnt hurt) &&
            (self hasnt lump))
            "Five-fingered.";
         if (self has foundordone)
            print "Your hand has a red rash";
         if (self has muddy)
            print " partially covered with mud";
         if (self has hurt)
         {  if (self hasnt foundordone)
               print "A ";
            else
            { if (self hasnt lump) print " and a ";
              else print ", a ";
            }
            print "splinter is embedded in your palm";
         }
         if (self has lump)
         {  if ((self hasnt foundordone) && (self hasnt hurt))
               print "Along the edge of your palm is a lump";
            else print " and along the side is a lump";
         }
         ".";
      ],
      number 10,
      before   ! Don't scratch it won't itch again. Scratch it itches again sooner.
      [; Scratch : if (self hasnt foundordone)
                      return Std_Msgs(1);
                   if (self has muddy)
                      self.number = 6;
                   else if (self.number > 2)
                      self.number = self.number - 2;
                   if (self hasnt general)
                   {  give self general;
                      StartTimer(self, self.number);
                   } else
                   {  StopTimer(self);
                      StartTimer(self, self.number);
                   }
                   if (self hasnt touched)
                   { give self touched;
                     Achieved(9);
                     "You rake your fingernails over the rash. Ahhhh. That feels GOOD.";
                   }
                   if (self has muddy)
                   {  give self ~muddy;
                      "Ahhhh. Nothing like an itch that has been scratched! Unfortunately you just scrapped off all the mud too.";
                   }
                   "Ahhhh. But scratching seems to make it itch even more.";
       Take, Remove, Pull  : Dalmer(self); rtrue;
       Attack              : "Ouch!";
     ],
     time_left 0,
     time_out
     [; give self ~general;
        if (self hasnt foundordone)
        {  give self foundordone;
           if (~~(voice.physical_prompt))
           { voice.number = 5;
             voice.daemon();
           } else print "^";
           "Suddenly, one of your hands itches.";
        }
        "^Your hand throbs, itching fiercely.";
     ];

Object scab "scab"
has concealed
with name "scab",
     before
     [; Examine            : <<Examine knee>>;
        Take, Remove, Pull,
        Scratch, PickIt    : <<PickIt knee>>;
     ];

Object splinter "splinter",
has concealed
with name "splinter",
before
[; Examine            : <<Examine hand>>;
   Take, Remove, Pull : if (hand hasnt hurt) <<Take hand>>;
                        "You won't get that splinter out without tweezers and you left your personal grooming
                         kit in the bathroom.";
];

!----------------------------------------------------------------------------
! The Visualization Tape
!----------------------------------------------------------------------------

Object voice "voice"
with number 0,
     depth_prompt false,    ! What it prompts the player to visualize.
     touch_prompt false,    ! 90% of this daemon is NOT run automatically.
     smell_prompt false,    ! Doesn't need to be part of the object tree,
     sound_prompt false,    ! talking will show up anyway.
     physical_prompt false,
     daemon
     [; if (self.number == 0) self.number++;
        if ((self.number == 1) && (~~(voice.depth_prompt)))
        {  if (wild hasnt foundordone)
           {  give wild foundordone;
              move wild to east_creek;
           }
           self.depth_prompt = true;
           print "^The mellifluous voice oozes, ~Give your visualization depth. Then move around and
                   explore it. But don't float as if dreaming, be as realistic as you can.~^";
        }
        if ((self.number == 2) && (~~(self.touch_prompt)))
        {  self.touch_prompt = true;
           print "^The voice gently urges, ~Visualization is not just about seeing pretty pictures.
                  Add shape and texture to your images. Then reach out and touch them.~^";
        }
        if ((self.number == 3) && (~~(self.sound_prompt)))
        {  self.sound_prompt = true;
           print "^The voice whispers, ~Involve all your senses, add sound to your experience~.^";
        }
        if ((self.number == 4) && (~~(self.smell_prompt)))
        {  self.smell_prompt = true;
           print "^The voice coos, ~Add scents as well. Odors can be very evocative, recalling
                  memories. Many people reexperience past emotions.~^";
        }
        if ((self.number == 5) && (~~(self.physical_prompt)))
        {  self.physical_prompt = true;
           print "^The soothing voice says, ~Add physical sensations to give your images a
                   sense of immediacy. Involve your whole body in the experience.~^^";
        }
     ];

Object wakeup_call
with time_left 0,
time_out
[; print "^Suddenly, real life intrudes harshly. The phone rings.^^";
   Satisfied(); rtrue;
];

!----------------------------------------------------------------------------
! The Scenery
!----------------------------------------------------------------------------

Object east_creek "By The Creek"
has light
with name "east_creek",
number 0,
state 0,
description  ! Changes depending on what the player is prompted to "visualize".
[; if (voice.physical_prompt)
   {  if ((voice.smell_prompt) && (voice.sound_prompt) && (voice.touch_prompt))
      { print "You are in the open by a creek. Full-grown oaks arch over it, thrusting out
               their gnarled branches like sheltering arms, trying to offer protection from
               the relentless summer sun. Shafts of light pierce their shading canopies,
               dappling water and ground with shifting bright and dark circles as the leaves
               rustle in the musty breeze blowing off the water. The cooled air brushes against
               your skin, providing some relief from the oppressive heat. Across the creek to
               the west, in the deeper shadows pooling directly under the trees, you can also
               make out the tantalizing outline of a hanging knotted rope";
               SeeBoard();
               ". Northwest, at the top of a steep rocky slope, a rickety old wooden shed beckons.";
      }
      if ((voice.sound_prompt) && (voice.touch_prompt))
      {  print "You are in the open by a creek. Full-grown oaks arch over it, thrusting out
                their gnarled branches like sheltering arms, trying to offer protection from
                the relentless summer sun. Shafts of light pierce their shading canopies,
                dappling water and ground with shifting bright and dark circles as the leaves
                rustle in the breeze blowing off the water. The cooled air brushes against your
                skin, providing some relief from the oppressive heat. Across the creek to
                the west, in the deeper shadows pooling directly under the trees, you can also
                make out the tantalizing outline of a hanging knotted rope";
                SeeBoard();
                ". Northwest, at the top of a steep rocky slope, a rickety old wooden shed beckons.";
      }
      if ((voice.smell_prompt) && (voice.touch_prompt))
      { print "You are in the open by a creek. Full-grown oaks arch over it, thrusting out
               their gnarled branches like sheltering arms, trying to offer protection from
               the relentless summer sun. Shafts of light pierce their shading canopies,
               dappling water and ground with bright and dark circles. A musty, cool breeze
               blows off the water and brushes against your skin, providing some relief from
               the oppressive heat. Across the creek to the west, in the deeper shadows
               pooling directly under the trees, you can also make out the tantalizing outline
               of a hanging knotted rope";
               SeeBoard();
               ". Northwest, at the top of a steep rocky slope, a rickety old wooden shed beckons.";
       }
       if ((voice.smell_prompt) && (voice.sound_prompt))
       { print "You are in the open by a creek. Shafts of sunlight pierce the shading canopies
                of the full-grown oaks that arch protectively over it, dappling water and ground
                with shifting bright and dark circles as the leaves rustle in the musty breeze
                blowing off the water. The cooled air brushes against your skin, providing some
                relief from the oppressive heat. Across the creek to the west, in the deeper
                shadows pooling directly under the trees, you can also make out the tantalizing
                outline of a hanging knotted rope";
                SeeBoard();
                ". Northwest, at the top of a steep slope, a rickety old shed beckons.";
      }
      if (voice.smell_prompt)
      { print "You are in the open by a creek. Shafts of sunlight pierce the shading canopies
               of the full-grown oaks that arch protectively over it, dappling water and ground
               with bright and dark circles. A musty, cool breeze blows off the water and
               brushes against your skin, providing some relief from the oppressive heat.
               Across the creek to the west, in the deeper shadows pooling directly under the
               trees, you can also make out the tantalizing outline of a hanging knotted rope";
               SeeBoard();
               ". Northwest, at the top of a steep slope, a rickety old shed beckons.";
      }
      if (voice.sound_prompt)
      { print "You are in the open by a creek. Shafts of sunlight pierce the shading canopies
               of the full-grown oaks that arch protectively over it, dappling water and ground
               with shifting bright and dark circles as the leaves rustle in the breeze blowing
               off the water. The cooled air brushes against your skin, providing some relief
               from the oppressive heat. Across the creek to the west, in the deeper shadows
               pooling directly under the trees, you can also make out the tantalizing outline
               of a hanging knotted rope";
               SeeBoard();
               ". Northwest, at the top of a steep slope, a rickety old shed beckons.";
      }
      if (voice.touch_prompt)
      { print "You are in the open by a creek. Full-grown oaks arch over it, thrusting out
               their gnarled branches like sheltering arms, trying to offer protection from
               the relentless summer sun. Shafts of light pierce their shading canopies,
               dappling water and ground with bright and dark circles. A cool breeze blows off
               the water and brushes against your skin, providing some relief from the
               oppressive heat. Across the creek to the west, in the deeper shadows pooling
               directly under the trees, you can also make out the tantalizing outline of a
               hanging knotted rope";
               SeeBoard();
               ". Northwest, at the top of a steep rocky slope, a rickety old wooden shed beckons.";
      }
      print "You are in the open by a creek. Shafts of sunlight pierce the shading canopies
             of the full-grown oaks that arch protectively over it, dappling the water and
             ground with bright and dark circles. A cool breeze blows off the water and
             brushes against your skin, providing some relief from the oppressive heat.
             Across the creek to the west, in the deeper shadows pooling directly under the
             trees, you can also make out the tantalizing outline of a hanging knotted rope";
             SeeBoard();
             ". Northwest, at the top of steep slope, a rickety old shed beckons.";
   }
! No physical ---------------------------------
   if ((voice.smell_prompt) && (voice.touch_prompt))
   { print "You are in the open by a creek. Full-grown oaks arch over it, thrusting out
            their gnarled branches like sheltering arms, trying to offer protection from
            the relentless summer sun. Shafts of light pierce their shading canopies,
            dappling water and ground with bright and dark circles. A musty breeze wafts
            off the water. Across the creek to the west, in the deeper shadows pooling
            directly under the trees, you can also make out the tantalizing outline of a
            hanging knotted rope";
            SeeBoard();
            ". Northwest, at the top of a steep rocky slope, a rickety old shed beckons.";
   }
   if ((voice.sound_prompt) && (voice.touch_prompt))
   { print "You are in the open by a creek. Full-grown oaks arch over it, thrusting out
            their gnarled branches like sheltering arms, trying to offer protection from
            the relentless summer sun. Shafts of light pierce their shading canopies,
            dappling water and ground with shifting bright and dark circles as the leaves
            rustle in the breeze. Across the creek to the west, in the deeper shadows
            pooling directly under the trees, you can also make out the tantalizing outline
            of a hanging knotted rope";
            SeeBoard();
            ". Northwest, at the top of a steep rocky slope, a rickety old wooden shed beckons.";
   }
   if ((voice.sound_prompt) && (voice.smell_prompt))
   { print "You are in the open by a creek. Shafts of sunlight pierce the shading canopies
            of full-grown oaks that arch protectively over it, dappling water and ground
            with shifting bright and dark circles as their leaves rustle in the musty breeze
            blowing off the water. Across the creek to the west, in the deeper shadows
            pooling directly under the trees, you can also make out the tantalizing outline
            of hanging knotted rope";
            SeeBoard();
            ". Northwest, at the top of a steep slope, a rickety old shed beckons.";
   }
   if (voice.smell_prompt)
   { print "You are in the open by a creek. Shafts of sunlight pierce the shading canopies
            of full-grown oaks that arch protectively over it, dappling water and ground
            with bright and dark circles. A musty breeze wafts off the water. Across the
            creek to the west, in the deeper shadows pooling directly under the trees, you
            can also make out the tantalizing outline of hanging knotted rope";
            SeeBoard();
            ". Northwest, at the top of a steep slope, a rickety old shed beckons.";
   }
   if (voice.sound_prompt)
   { print "You are in the open by a creek. Shafts of sunlight pierce the shading canopies
            of full-grown oaks that arch protectively over it, dappling water and ground
            with shifting bright and dark circles as their leaves rustle in the breeze.
            Across the creek to the west, in the deeper shadows pooling directly under
            the trees, you can also make out the tantalizing outline of hanging knotted
            rope";
            SeeBoard();
            ". Northwest, at the top of a steep slope, a rickety old shed beckons.";
   }
   if (voice.touch_prompt)
   { print "You are in the open by a creek. Full-grown oaks arch over it, thrusting out
            their gnarled branches like sheltering arms, trying to offer protection from
            the relentless summer sun. Shafts of light pierce their shading canopies,
            dappling water and ground with bright and dark circles. Across the creek to
            the west, in the deeper shadows pooling directly under the trees, you can also
            make out the tantalizing outline of a hanging knotted rope";
            SeeBoard();
            ". Northwest, at the top of a steep rocky slope, a rickety old wooden shed beckons.";
   }
   if (voice.depth_prompt)
   { print "You are in the open by a creek. Shafts of sunlight pierce the shading canopies
            of the full-grown oaks that arch protectively over it, dappling the water and
            ground with bright and dark circles. Across the creek to the west, in the
            deeper shadows pooling directly under the trees, you can also make out the
            tantalizing outline of hanging knotted rope";
            SeeBoard();
            ". Northwest, at the top of a steep slope, a rickety old shed beckons.";
   }
   "You are by the creek where you used to play as a child. You haven't thought
    about it for years! Shafts of sunlight slant through the full-grown oak trees
    that arch over it. You can't see much more because the landscape seems hazy.";
],
before
[;  Look   : self.state++;
             if ((self.state > 1) && (~~(voice.depth_prompt)))
             { voice.number = 1;
               voice.daemon();
             }
    Listen : if (voice.sound_prompt)
             { if (self has general) Achieved(11);
               "An occasional distinctive bird call accompanies the leaves' rustle. The same one
                you used to hear summers as a child. Hearing it now, it seems to chirp, ~Summer~.";
             }
             give self general;
             "You can faintly hear some innocuous ~elevator~ type music in the background.";
    Smell  : if (voice.smell_prompt)
             {  if (self has general) Achieved(11);
                "The dankness of the creek almost overwhelms the sun-baked scent of a summer day.";
             }
             give self general;
             "Maybe the incense was a mistake. It does smell like the out of doors, but its
              pungent fragrance is attention-grabbing, making it hard to imagine other odors.";
    Jump   : <<JumpOver creek>>;
],
nw_to
[;  if (voice.depth_prompt)
    { self.number++;
      if (self.number == 1)
      {  if (rock2 hasnt foundordone)
         { give rock2 foundordone;
           move rock2 to self;
         }
         move rock1 to self;
         if (~~(voice.touch_prompt)) voice.number = 2;
         print "The slope seems much bigger than you remember or you are much smaller. You
                try, but keep sliding back down. Some gravel rolls back down with you";
         if ((voice.sound_prompt) && (rock2 in self))
                ", making a scraping sound as rock hits rock.";
         ".";
      }
      if (self.number == 2)
      { move bush to self;
        "The slant seems to be more of a ~coming down~ than a ~going up~ slope. Looking
         around for another approach, you spot a bush growing by it, about 1/2 way up.";
      }
      if (self.number >= 3)
      {  if ((hand has foundordone) && (bush hasnt touched))
         { give bush touched;
           print "You hesitate to touch the bush again. But then you realize you
                  have already exposed yourself and have no other way to get up the slope. ";
         }
         print "You grab the bush. By tugging on it and pushing with your feet, you
                manage to scramble up the slope.^";
         if (self hasnt foundordone)
         {  Achieved(2);
            voice.number = 4;
            voice.daemon();
            give self foundordone;
            give hand general;
            StartTimer(hand, 12);
         }
         give shed ~concealed;
         return by_shed;
      }
    }
],
u_to
[; if ((rope has general) && (rope.number == 1 or 3))
      <<Take rope>>;
   <<Go nw_obj>>;
],
w_to
[; if (voice.depth_prompt)
   {  if (board notin creek)
      {  if (creek hasnt general)
         { give creek general;
           if (~~(voice.physical_prompt))
           {  voice.number = 5;
              voice.daemon();
           }
           move mud to self;
           print "As you start west, the mud squishes beneath your feet";
           if (rock2 hasnt foundordone)
           { give rock2 foundordone;
             move rock2 to self;
             if (~~(voice.touch_prompt)) voice.number = 2;
             print " until you lightly stub one toe on a rock and stop. ";
           } else print ". ";
           if (voice.sound_prompt)
              print "The wet clay slurps as you pull your foot out. ";
           if (voice.sound_prompt) print "It ";
           else print "The wet clay ";
           "is as gummy as glue. If you go any further you would probably get stuck.";
         }
      "There is no purchase on the wet clay. It is too slushy to support your weight.";
      }
      if (west_creek hasnt foundordone)
      { give west_creek foundordone;
        Achieved(6);
      }
      board.number++;
      if (board.number >= 5)
      {   print "The board can no longer be crossed. Do you want to finish? (Y or N) > ";
          if (YesOrNo())
          { print "^"; Satisfied(); rtrue; }
          print "^";
      }
      if (board.number >= 4) return Std_Msgs(10);
      print "As you scurry across the board, it sinks a little more into the mud and water.^";
      return west_creek;
   }
],
cant_go
[; if (~~(voice.depth_prompt)) "There doesn't seem to be anywhere to go.";
   "You can only go west and northwest.";
];

Object wild "wild flowers"
with name "wild" "flowers" "flower" "pretty" "tiny" "delicate" "pink" "stems"
          "stalks" "stalk" "petals" "petal" "weeds" "wilted" "faded" "long" "fragrant"
          "weed-like" "clump" "bunch" "of",
article
[; if (self has touched) print "bunch of";
   else print "clump of";
   rtrue;
],
short_name
[; if (self has general) print "weeds";
   else print "wild flowers";
   rtrue;
],
initial "A clump of wild flowers is growing here.",
description
[; if (self has general)
      "The long stalks now look just like weeds. The flowers are gone, long-time
       passing. The petals have completely wilted or dropped off.";
   if (self hasnt touched)
      "You admire the tiny, pink flowers. Like most wild flowers, they are delicate
       (won't last long once picked) and their long stalks look almost like weeds.";
   switch(self.time_left)
   { 12, 11, 10 : "The wild flowers are very pretty.";
     9, 8, 7    : "The wild flowers are already beginning to wilt.";
     6, 5, 4    : "The wild flowers are wilting fast.";
     3, 2, 1    : "The wild flowers are now almost completely wilted.";
   }
],
parse_name
[ i j k l m;
   if (self has general)
   {   while (NextWord()=='weeds' or 'long' or 'weed-like' or 'stems' or 'stem' or
                          'stalks' or 'stalk' or 'clump' or 'bunch' or 'of') i++;
        return i;
   }
   else
   { if (self.time_left <= 10) j='wilted'; else j=-1;
     if (self.time_left <= 10) k='wilting'; else k=-1;
     if (self.time_left <= 10) l='faded'; else l=-1;
     if (self.time_left <= 10) m='fading'; else m=-1;
     while (NextWord()==j or k or l or 'wild' or 'flowers' or 'flower' or 'petals' or 'petal' or 'fragrant' or
                        'pretty' or 'delicate' or 'tiny' or 'pink' or 'long' or 'weed-like' or 'stems' or 'stem'
                         or 'stalks' or 'stalk' or 'clump' or 'bunch' or 'of') i++;
     return i;
   }
],
before
[; PickIt       : if (self has touched)
                     print_ret "You already picked ", (the) self, ".";
                  <<Take self>>;
   Take         : if (board in player) return Std_Msgs(6);
   Attack,
   ThrownAt     : if ((action==##ThrownAt) && ((second ~= 0) && (noun == second))) return Std_Msgs(14);
                  if (self hasnt general) "Ahhhh, the flowers are much too sweet to harm.";
                  print_ret (The) self, " is rather bedraggled already.";
   Kick         : if (self in player) return Std_Msgs(12);
                  <<Attack self>>;
   Touch        : if (self hasnt moved) "They are so delicate you hesitate to touch them.";
                  "Soft.";
   Peel         : if (self hasnt moved)
                     "They love me, they love me not... you'll have to pick the wild flowers first.";
                  if (self hasnt general)
                     "The petals are really too small to pick off individually.";
                  "Into health food, huh? Where's the blender?";
   SmellThing   : if (~~(voice.smell_prompt)) <<Smell>>;
                  if (east_creek has general) Achieved(11);
                  if (self has general)
                     "The weeds have no fragrance to speak of.";
                  if (self hasnt touched)
                     "You sniff the wild flowers. Ahhhh, sweet perfume.";
                  switch(self.time_left)
                  { 12, 11, 10 : "The wild flowers' perfume is very sweet. Ahhhh.";
                    9, 8, 7    : "The wild flowers' sweet fragrance is already beginning to fade.";
                    6, 5, 4    : "The wild flowers' sweet fragrance is fading fast.";
                    3, 2, 1    : "The wild flowers barely have any fragrance left now.";
                  }
   Eat, Taste  : if (self notin player)
                    print_ret "You need to be holding the ",
                             (name) self, " before you can eat it.";
                  if (self has braved)
                     "Double your pleasure, double your fun... Nyah, you don't want to try the
                      bitter stalks twice.";
                  give self braved;
                  if (self has general)
                     "You nibble on a stalk. Unfortunately, it is quite bitter.";
                  "You nibble on a stalk. The wild flowers may be very pretty, their perfume
                   sweet, but the stalks are quite bitter.";

],
after
[; Take : if (self hasnt touched)
          {  give self touched;
             StartTimer(self, 12);
             print "You pick the wild flowers, as you may, knowing full-well they won't
                    the day";
             if ((rock1 in player) || (rock2 in player) || (egg in player))
                ", and switch them to your unoccupied hand.";
             ".";
          }
          print "Taken";
          if ((rock1 in player) || (rock2 in player) || (egg in player))
             ". You switch the wild flowers to your unoccupied hand.";
          ".";
],
time_left 0,
time_out
[; give self general; ];

Object west_creek "Other Side of Creek"
has light
with name "west_creek",
     description
     [; print "Here, in the shade of the trees, it is darker and refreshingly cooler. The
               muddy ground is trampled down under the rope. East, across the creek, you can
               see a rickety old shed perched on top a rocky rise";
        SeeBoard();
        ".";
     ],
     before
     [; Listen : east_creek.before(); rtrue;
        Smell  : east_creek.before(); rtrue;
          Jump : if (player notin rope)
                    <<JumpOver Creek>>;
                 if (rope.number == 1)
                 {  Achieved(7);
                    print "You let out a Tarzan-type yell as you leap off the rope. Air rushes pass you
                           as you fly thrillingly across the creek. Squatting as you land, you settle
                           unharmed on the other side. Great jump!^^";
                    if (board.number >= 3) Satisfied();
                    else PlayerTo(east_creek);
                    rtrue;
                 }
                 if (rope.number == 3)
                 {  Achieved(7);
                    print "You let out a Tarzan-type yell as you leap off the rope. But stop mid-yodel as
                           you realize you are right over the water! Air rushes past you as you plummet
                           down toward the dark, slimy water...^^";
                    Satisfied(); rtrue;
                 }
                 <<Exit rope>>;
          Go   : if (noun==u_obj)
                 { if (player in rope) <<Climb rope>>;
                   <<Enter rope>>;
                 }
                 if ((noun==d_obj) && (player in rope)) <<Exit rope>>;

     ],
     e_to
     [; if (board in creek)
        { board.number++;
          if (board.number >= 5)
          {   print "The board can no longer be crossed. Do you want to finish? (Y or N) > ";
              if (YesOrNo())
              { print "^"; Satisfied(); rtrue; }
              print "^";
          }
          if (board.number >= 4) return Std_Msgs(10);
          print "The board sinks a little more as you rush across it.^";
          return east_creek;
        }
        <<JumpOver creek>>;
    ],
    cant_go "You can only go east.";

Object -> elm "elm"
has animate neuter supporter static
with name "tree" "branch" "bough" "limb" "elm" "large" "mighty" "might" "leaves" "leaf" "bark" "trunk" "fork",
     initial
     [; print "Near the creek is a mighty elm. Hanging from one branch is a knotted rope";
        if (nest in location)
        {  print " and up in a fork of the tree is a ";
           if (nest has crushed) print "sagging ";
           print "nest";
        }
        if (self has smeared) print ". Marring the trunk is a gooey, yellow smear";
        ".";
     ],
     description
     [; print "The large elm is mighty impressive";
        if (self has smeared) print ", except for the gooey, yellow smear on the trunk";
        if (nest in location) print ". Up in the fork of the tree is a nest";
        ".";
     ],
     before
     [;  Search      : <<Examine self>>;
         Take        : "That's fixed in place.";
         Climb       : "The lowest branches are way over your head.";
         Push, Touch : if (player in rope)
                       {  if (rope.number == 2 or 4) <<Swing rope>>;
                          else
                          { if (rope.number == 1 or 3) return Std_Msgs(8);
                            return Std_Msgs(2, self);
                          }
                       }
                      if (action==##Touch) <<Kiss self>>;
                      <<Attack self>>;
           ThrownAt : if ((second ~= 0) && (noun == second)) return Std_Msgs(14);
                      if (noun == wild) return Std_Msgs(11, wild);
                      if (noun == egg)
                      { AttachSmear(self, west_creek);
                        "The egg hits the trunk, leaving a gooey yellow smear, then it oozes to the ground.";
                      }
                      move noun to location;
                      if (noun == rock1)
                      {  Achieved(0);
                         "The little rock bounces off the tree trunk, barely making a sound.";
                      }
                      if (noun == rock2)
                      {  Achieved(1);
                         "The large rock hits the tree trunk with a loud thud and falls to the ground. The leaves rustle.";
                      }
     ],
     life
     [; Attack,
        Kiss     : if (action==##Attack)
                      "There are easier ways to piss off Gaia.";
                   if (player in rope)
                      "You'll have to get off the rope first.";
                   Achieved(10);
                   print "Ah, how sweet, a tree-hugger. You're getting in touch with Gaia";
                   if (egg in nest)
                   {  print ". ";
                      if ((player has braved) && (player hasnt touched))
                         print "Okay, she is willing to forgive and forget your previous transgression.
                                In fact, Gaia is rather pleased with you. Good going.^^";
                      if (player has foundordone)
                         print "Suspicious, not quite sure whether to trust you, Gaia graciously relents a little anyway.^^";
                      print "You suddenly notice the sunshine has never seemed so bright, the bird calls
                             never so cheerful. You breathe deeply, filled with a sense of peace and joy.^^";
                      Satisfied(); rtrue;
                   }
                   if ((player has braved) || ((player has crushed) || (player has infected)))
                   {  if ((player hasnt touched) && (player hasnt infected))
                      { give player touched;
                        print ". Okay, she is willing to forgive and forget your previous transgression";
                        if ((player has braved) && (player has crushed))
                           "s.";
                        ".";
                      }
                      if ((player has foundordone) || (player has infected))
                      {  if (player hasnt touched) give player touched;
                         ". But you might as well forget it, she isn't buying your obviously phony kissing up anymore.";
                      }
                      ". But you're really pushing it, she has forgiven you once already. What do you
                       want? A gold star?";
                   }
                   "!";
       Ask, Answer, Tell, Give, Show : "The elm appears to be the strong silent type. It doesn't respond.";
    ];

Object -> nest "nest"
has concealed container open
with name "nest" "twigs" "flattened" "sagging",
     description
     [; print "It is an ordinary nest, made up of twigs";
        if (self has crushed) ", except it is rather sadly flattened.";
        ".";
     ],
     parse_name
     [ i j k; if (self has crushed) j='flattened'; else j=-1;
              if (self has crushed) k='sagging'; else k=-1;
         while (NextWord()==j or k or 'nest' or 'twigs') i++;
         return i;
     ],
     before
     [; if ((action~=##Examine or ##Search or ##ThrownAt or ##Kick) && (player notin rope))
           "The nest is perched just a few feet too high to reach.";
        Search          : "It is too high to see inside.";

        Take, Remove,
        Touch, Attack,
        Kick            : if ((action==##Kick) && (player notin rope))
                             return Std_Msgs(13);
                          if (rope.number == 1 or 3) return Std_Msgs(8);
                          if (rope.number ~= 2 or 4) return Std_Msgs(2, self);
                          if (action==##Kick) return Std_Msgs(13);
                          return Std_Msgs(3);
        Receive         : if (rope.number == 1 or 3) return Std_Msgs(8);
                          if (rope.number ~= 2 or 4) return Std_Msgs(2, self);
                          if (noun == wild)
                          {  move noun to west_creek;
                             print_ret "You fling ", (the) noun, " at the nest, but they are too light. They
                                        miss, falling to the ground.";
                          }
                          if (self has crushed)
                          {  if (noun == egg) AttachSmear(elm, west_creek);
                             else move noun to location;
                             print "The flattened nest is sagging too much to hold ", (the) noun, ". ";
                             if (noun == egg)
                                print_ret "It falls out, smashes on the tree trunk, then oozes to the ground.";
                             print_ret "It falls out, bounces off the tree trunk and hits the ground.";
                          }
                          if (noun == hand) return Std_Msgs(3);
        LetGo           : if (rope.number == 1 or 3) return Std_Msgs(8);
                          if (rope.number ~= 2 or 4) return Std_Msgs(2, self);
        ThrownAt        : if ((second ~= 0) && (noun == second)) return Std_Msgs(14);
                          if (noun == wild) return Std_Msgs(11, wild);
                          if (noun == egg or rock1)
                          { if ((player in rope) && (rope.number == 2 or 4))
                               <<Insert noun self>>;
                            if (noun == egg) AttachSmear(elm, west_creek);
                            else move noun to location;
                            if (player notin rope)
                               print "You jump up as you overhandedly lob ", (the) noun, " at the nest. But the nest
                                      is too small to make a good ~basket~. ", (The) noun, " misses, ";
                            else print "You lob ", (the) noun, " at the nest. It misses, ";
                            if (noun == egg) "smashes on the tree trunk, then oozes to the ground.";
                            "hits the tree trunk, then bounces to the ground.";
                          }
                          if (noun == rock2)
                          {  if (egg in nest)
                             { Achieved(8);
                               remove egg;
                             }
                             remove rock2;
                             remove self;
                             give player infected;
                             "You hurl the large rock. It knocks the nest backwards out of the tree as it
                              sails through the fork. Both disappear forever into the foliage along with your
                              environmental chances. Hmmm, how does drought and famine followed by hordes of
                              locusts, sound? Or discovering you've been living next to an old, unmapped toxic
                              waste dump? Don't worry, Gaia will decide soon enough how to get revenge.";
                          }
     ],
     after
     [; Receive : if (noun == egg)
                  {  Achieved(8);
                     "You carefully toss the egg into the nest. Ah, a true Gaia lover! Remember:^^
                      *** Conservation is its own reward. ***";
                  }
                  if (noun == rock1)
                     "You gently flip the small rock into it. Apparently the nest remains unhurt.";
                  if (noun == rock2)
                  {  give self crushed;
                     give player crushed;
                     if (egg in nest) SmashEgg(nest);
                     print "You fling the large rock into the nest. You hear a crunching sound and the nest
                            sags dejectedly. Coincidentally (or not), at the same time, thunder rumbles
                            angrily in the distance. Congratulations, you just crushed ";
                     if (smashed_egg in nest)
                        print "the eggs in the nest, including the one you rescued! ";
                     else
                        print "the rest of the eggs in the nest! ";
                     "Not much of a conservationist, are you? Get in touch with Gaia!";
                  }
     ];

Object -> egg "little blue egg"
with name "egg" "little" "egg" "fragile" "cute" "defenseless",
     number 0,
     description "The little blue egg looks cute, fragile and defenseless.",
     before
     [; Take        : if (rock1 in player) return Std_Msgs(4);
                      if (rock2 in player) return Std_Msgs(5);
        Peel        : if (self notin player)
                         print_ret "You aren't holding ", (the) self, ".";
                      SmashEgg(location);
                      "Nature's eggs don't come hard boiled. Stupidly trying to peel a raw egg,
                       you poke a finger into the shell. Junk oozes out and it slips out of your hand.";
        SmellThing  : Achieved(11);
                      "Since the shell is intact, no odor escapes.";
        Eat, Taste  : self.number++;
                      if (self.number == 1)
                         "You haven't learned how to swallow eggs whole yet. (Not in this visualization
                          revisiting your childhood, anyway). Later in college you might. Along with
                          other useful World Record feats. Such as:  how many students can cram into a
                          telephone booth and how long you can go without studying without flunking.";
                       "Aha, a true egg sucker! Have fun.";
       ThrownAt     : if ((second ~= 0) && (noun == second)) return Std_Msgs(14);
                      if (noun == wild) return Std_Msgs(11, wild);
                      move noun to location;
                      if (noun == rock2) AttachSmear(noun, location);
                      else SmashEgg(location);
                      if (noun == rock1)
                         print_ret (The) noun, " just misses the egg, but the shell breaks open as ",
                                   (the) noun, "'s sharp edge gives it a glancing blow in passing.";
                      print_ret (The) noun, " hits the egg dead-center, then rolls aside. The shell crunches open and junk runs out.";
       Attack,
       Kick         : if ((action==##Kick) && (self in player)) return Std_Msgs(12);
                      if (action==##Attack)
                      {  if (self in player)
                         {  if (player in rope) print "You throw down the egg. It ";
                            else print "You drop the egg and step on it. It ";
                         }
                         else print "You step on the egg. It ";
                      } else print "The egg ";
                      SmashEgg(location);
                      "crunches, breaking open. Junk runs out.";
     ],
     after
     [; Take         : if (self hasnt general)
                       {  give self general;
                          if (~~(voice.sound_prompt)) voice.number = 3;
                          print "From the heft of the egg, you can tell it is still viable, not old and hollow. ";
                       }
     ];

Object by_shed "By the Shed"
has light
    with name "by_shed",
         description "You are standing in the sultry warmth of the full sun. Southeast from this
                      bare rocky shelf, a steep slope heads downhill to the creek. Something smells.",
    before
    [; Smell  :  if (east_creek has general) Achieved(11);
                 print "A nose-crinkling odor is coming from the shed";
                 if (inside_shed hasnt visited) ". It is vaguely familiar.";
                 ".";
       Listen :  if (~~(voice.sound_prompt)){ east_creek.before(); rtrue; }
                 if (east_creek has general) Achieved(11);
                 "You can hear a few distinctive bird calls now and then.";
    ],
    se_to
    [; give shed concealed;
       if ((board notin player) && (self hasnt general))
       {  give self general;
          print "^You skid down the slope on your feet, then near the end fall on your rear";
          if (voice.sound_prompt) print " with a whomp.";
          else print ".";
          print " Breath knocked out of you, you slide the rest of the way on your bottom.^";
       }
       if (board in player)
       {  if (self hasnt braved)
          {  give self braved;
             Achieved(4);
             move board to east_creek;
             give knee foundordone;
             StartTimer(knee, 6);
             if (~~(voice.physical_prompt))
             {  voice.number = 5;
                voice.daemon();
             } else print "^";
             print "You start to skid down on your feet, but the board is too unwieldy to maintain your
                    balance. Near the end you trip, drop it, fall forward and skin a knee. Stings.^";
           } else
           "You've learned the get-overbalanced-and-fall lesson in physics already. The hard way.";
       }
       give shed concealed;
       return east_creek;
    ],
    in_to
    [; if (wild in player)
       {  if (wild has general)
          {  print "^You hold the weeds to your nose and sniff them, but they have
                     no helping fragrance. You plow forward into the powerful stench";
             if ((jars has crushed) || (inside_shed has braved))
                print ", unprotected.^";
             else print ", anyway.^";
          }
          else
          {  print "^You hold the wild flowers to your nose and sniffing them, plow forward. Their
                     sweet fragrance partially masks the awful stench, making it";
             if (jars.number > 5)
                print " almost bearable.^";
             else print " more durable.^";
          }
       }
       else
          print "^The stench is so strong it practically feels like a physical force pushing
                  you back, but you duck your head and plow forward.^";
       give shed concealed;
       return inside_shed;
   ],
   d_to
   [; <<Go se_obj>>; ];

Object inside_shed "Inside the Shed"
has light
with description
[; if (self hasnt general)
   {  give self general;
      "Your eyes haven't adjusted to the change from the bright sunlight to the dark.
       Blinded, you still have the unpleasant sensation you are being watched.";
   }
   if (self hasnt foundordone)
   {  give self foundordone;
      move shelves to self;
      move jars to self;
      move motes to self;
      move sunlight to self;
   }
   print "The floor is dirt. Dust motes swirl in the slender fingers of sunlight poking
          through the slats. The spectral illumination dimly reveals a close interior";
   if ((shed has smeared) && (smear in self)) print ". On the boards is a gooey, yellow smear";
   ".";
],
number 0,
state 0,
before
[; if ((action~=##Look or ##Exit or ##Go or ##Smell or ##Listen or ##Drop or ##Vomit or
        ##HoldNose) &&
       (self hasnt foundordone))
     "You are still too blinded to see.";
   Smell : if (east_creek has general) Achieved(11);
           if (jars has braved)
              print "The piercing odor of rancid vinegar ";
           else print "The piercing odor ";
           if (self has braved)
              print "(mixed with the nauseating scent of urine";
           if ((smear in location) ||
               ((smear.number == rock2) && ((rock2 in location) || (rock2 in player))
               && (smashed_egg has general)))
               print " and sulfur) ";
           else if (self has braved) print ") ";
           "is almost overwhelming and revolting enough to make you want to barf.";
   Listen : if (~~(voice.sound_prompt)){ east_creek.before(); rtrue; }
            if (east_creek has general) Achieved(11);
            if (jars has general)
               "You almost expect to hear froggie ribbits, but, thankfully, you don't.";
            "You can hear leaves rustling and an occasional bird chirp outside.";
],
each_turn   ! Want player to find board fairly easily, so it's not a puzzle.
[; self.number++;
       if ((self.number > 3) && (jars has general) && (jars hasnt braved) &&
          ((action~=##Examine) || ((action==##Examine) && (noun~=jars))))
       { print "^";
         <<Examine jars>>;
       }
       ! holding flowers, if flowers still have scent minus 1 turn
       if ((jars has crushed) || (self has braved))
       {  if (jars.number > 5)
          {  if ((self.state < 2) && (self hasnt muddy))
             { self.state = 2;
               give self muddy;
             }
          }
          else if ((jars has crushed) && (self has braved))
          {  if ((self.state < 1) && (self hasnt muddy))
             { self.state = 1;
               give self muddy;
             }
          }
          if ((wild in player) && (wild hasnt general) && (self hasnt touched))
          {  if (self.state >= 1)
             {  self.state--;
                give self touched;
             }
          }
          self.state++;
          if (self.state == 3)
          {  self.state = 0;
             if (self has muddy)
                give self ~muddy;
             if (self has touched)
                give self ~touched;
             print "^The rank odor is so overpowering you simply can't take it";
             if (jars.number > 5) print ". ";
             else print " any more. ";
             print "You run outside and try to breathe again.^";
             give shed ~concealed;
             PlayerTo(by_shed);
             rtrue;
          }
       }
],
out_to
[; give shed ~concealed;
   return by_shed;
];

!----------------------------------------------------------------------------
! Objects that will be moved to the location when found.
!----------------------------------------------------------------------------

! Player is being like a child, so hands are smaller.

Rock rock1 "small rock"
with name "small";

Rock rock2 "large rock"
with name "large",
number 0,
before
[; Fish  : if (self notin creek) "But ", (the) noun, " isn't in the creek.";
           <<Take self>>;
   Enter : if (self in player) return L__M(##Enter, 4);
           "Although large, the rock isn't a boulder. It isn't big enough to get on.";
   Take  : if ((rock1 in player) || (egg in player) || (board in player)) rfalse;
           if (self in creek)
           { if (location == by_shed) return Std_Msgs(2, creek);
             if (self.number ~= location)
             {  print "You didn't see the ripples on this side of the creek, but you thrust your
                       hand into the turbid water anyway and idly fish around. Although something
                       slippery brushes your hand, you come up empty";
                if (hand has muddy){ WashOffMud(true); rtrue; }
                ".";
             }
           }
],
after
[; Take  : if (self has concealed)
           {  give self ~concealed;
              if (self has smeared)
                 DettachSmear(self);
              print "You thrust your hand in the murky depths where you saw the ripples. Bravely
                     raking the sludge with your fingers, you touch some weird things (what ARE
                     they?), before finally feeling the oblong firmness of the rock. You pull it out";
              if (hand has muddy){ WashOffMud(true); rtrue; }
              ".";
           }
];

Object bush "bush" !Oh, oh, poison oak! But no way to avoid it. Like real life.
has static
with name "bush" "clusters" "leaves" "leaf",
     initial
     [; if (hand has foundordone)
           "A poison oak bush is growing next to the slope.";
        "A bush is growing next to the slope.";
     ],
     short_name
     [; if (hand has foundordone) print "poison oak";
        else print "bush";
        rtrue;
     ],
     parse_name
     [ i j k; if (hand has foundordone) j='poison'; else j=-1;
              if (hand has foundordone) k='oak'; else k=-1;
         while (NextWord()==j or k or 'bush' or 'clusters' or 'leaves' or 'leaf') i++;
         return i;
     ],
     description
     [; if (by_shed hasnt visited)
           print "Fortunately it isn't sun-dried manzanita which would pull out or crumble
           in your hand. ";
        print "The shiny, dark green, pointy leaves group in clusters";
        if (hand has foundordone)
        {  if (self hasnt general)
           {  give self general;
              ". You now recognize it as poison oak.";
           }
           ". It is definitely poison oak.";
        }
        ".";
    ],
    before
    [;  Take, Remove      : if (hand has foundordone) <<Touch self>>;
                            "You tug on it, but it is firmly rooted in the ground.";
        Touch             : if (voice.touch_prompt)
                            {  if (hand hasnt foundordone)
                                  "The prickly leaves scrape your hand.";
                               if (self has touched)
                                  "Oh phooey, you guess touching it again won't make things any worse than
                                   they already are. Prickly.";
                               if (self hasnt general)
                               {  <Examine self>; print "^"; }
                               "You're sorry you touched it already.";
                            }
         Eat, Taste,
         SmellThing       : if (action==##SmellThing)
                            {  if (~~(voice.smell_prompt)) <<Smell>>;
                               if (east_creek has general) Achieved(11);
                            }
                            if (hand hasnt foundordone)
                               "Some instinct tells you you shouldn't.";
                            print "Just what you need, a ";
                            if (action==##SmellThing) print "snoot full";
                            else print "mouthful";
                            " of poison oak! Nope.";
         Grab, Pull        : <<Go nw_obj>>;
         Attack            : "The bush is just a little too far up the slope for that.";
         ThrownAt          : if ((second ~= 0) && (noun == second)) return Std_Msgs(14);
                             if (noun == wild) return Std_Msgs(11, wild);
                             if (noun == egg)
                                SmashEgg(location);
                             else move noun to location;
                             if (noun == board)
                             {  print "The board is too heavy, it falls short and ";
                                if (voice.sound_prompt) print "thuds ";
                                else print "slides ";
                                "back down the slope.";
                             }
                             if (noun == egg)
                                "The egg is too light, it falls short, crash landing with a splat.";
                             print_ret (The) noun, " hits the bush, rustling the leaves, then rolls back
                                       down the slope.";

    ];

Object shelves "shelves"
 has static supporter pluralname
 with name "shelves" "back" "wall" "planks" "wooden",
      initial
      [; print "Stretching across the back wall are some wooden shelves.^^";
         self.description(); rtrue;
      ],
      description
      [;  switch(jars.number)
         { 0 : print "On the shelves are lots and lots of jars.";
           1 : print "On the shelves are lots and lots of intact jars and a few shattered jars.";
           2 : print "On the shelves are lots of intact jars and some shattered jars.";
           3 : print "On the shelves are some intact jars and lots of shattered jars.";
           4 : print "On the shelves are a few intact jars and lots and lots of shattered jars.";
           5 : print "On the shelves are a few intact jars and lots and lots of shattered jars.";
           6 : print "On the shelves are disintegrating green things, surrounded by vile muck and shattered glass.";
         }
         SeeJarSmear();
         print "^";
         if ((jars has braved) && (board has concealed))
            "^You can also see a board here.";
         rtrue;
      ],
      before
      [; Search            : <<Examine self>>;
         ThrownAt, Receive : if ((action==##Receive) && (noun == board))
                                 "Since getting it down took courage, you're not about to put it back.";
                             if (action==##ThrownAt) <<ThrowAt noun jars>>;
         "The shelves are not important in and of themselves.";
      ];

! Just to add a little darkness to the "sweetness and light". Although
! this is actually part of my past (I hated the smell of vinegar for years).

Object jars "jars"
 has concealed openable pluralname
 with name "jars" "bottles" "jar" "bottle" "glass" "contents" "vile" "pickles" "moldy"
           "disintegrating" "intact" "shattered" "broken" "muck" "watery" "marked" "smeared",
      number 0,
      description
      [; if (self.number > 5)
         { print "The disintegrating green things are surrounded by vile muck and shattered
                  glass. They are disgusting and since the eerie black ~eyes~ still seem to
                  stare, you can't shake the feeling that they aren't REALLY pickles.";
           SeeJarSmear();
           print " You avert your eyes.^";
           SeeBoard();
           rtrue;
         }
         if (self hasnt general)
         { give self general;
           print "Behind the glass, suspended in a cloudy liquid, are green things with black,
                  staring eyes. They seem somewhat cylindrical, but since they are falling apart,
                  yucky bits of floating matter partially obscure them. You have no idea WHAT
                  they are. Decaying frogs. Decomposing lab animals. Formaldehyded something...";
           SeeSmashed();
           SeeJarSmear();
           print "^";
           rtrue;
         }
         if (self hasnt braved)
         {  give self braved;
            move board to inside_shed;
            print "Finally you recognize the smell. With a startling shift of perspective, the
                   green things resolve into rotting pickles. A farmer or farmer's wife who once
                   lived here must have canned them long ago because the seals have been broken
                   some time. The escaping stink is rancid vinegar, the black eyes, spots of mold.";
            SeeSmashed();
            SeeJarSmear();
            print "^";
            SeeBoard();
            rtrue;
         }
         if (self hasnt foundordone)
            give self foundordone;
         print "They are disgusting and since the eerie black ~eyes~ still seem to stare, you
                can't shake the feeling that they aren't REALLY pickles.";
         SeeSmashed();
         SeeJarSmear();
         print " You avert your eyes.^";
         SeeBoard();
         rtrue;
      ],
      parse_name
      [ i j k l m n o p q r s t u;
        if (self.number > 5)
        {  while (NextWord()=='pickle' or 'pickles' or 'disintegrating' or 'green' or 'things' or 'vile' or
                              'contents' or 'moldy' or 'watery' or 'muck' or 'shattered' or 'broken' or 'glass') i++;
           return i;
        }
        else
        { if (self has braved)  j='pickle'; else j=-1;
          if (self has braved)  k='pickles'; else k=-1;
          if (self has braved)  l='moldy'; else l=-1;
          if (self has crushed) m='vile'; else m=-1;
          if (self has crushed) n='contents'; else n=-1;
          if (self has crushed) o='watery'; else o=-1;
          if (self has crushed) p='muck'; else p=-1;
          if (self has crushed) q='intact'; else q=-1;
          if (self has crushed) r='shattered'; else r=-1;
          if (self has crushed) s='broken'; else s=-1;
          if (self has touched) t='egg-marked'; else t=-1;
          if (self has touched) u='smeared'; else u=-1;
          while (NextWord()==j or k or l or m or o or p or q or r or s or t or u or 'disintegrating' or 'green'
                             or 'things' or 'glass' or 'jars' or 'jar' or 'bottles' or 'bottle') i++;
          return i;
        }
      ],
      before
      [ i j; Take, Remove,
             Eat, Taste      : if ((action==##Take or ##Remove) && (self hasnt general))
                                  "Maybe you ought to examine them first.";
                               "Nope. You don't WANT to.";
         Search              : <<Examine self>>;
         Open, Attack, Touch : print "You have NO wish to touch the ";
                               if (jars.number > 5) "muck.";
                               "jars.";
         Kick                : return Std_Msgs(13);
         ThrownAt            : if ((second ~=0) && (noun == second)) return Std_Msgs(14);
                               if (noun == wild) return Std_Msgs(11, wild);
                               move noun to location;
                               if (noun == board)
                               {  print "The board is too heavy, it falls short";
                                  if (voice.sound_prompt) " with a thud.";
                                  ".";
                               }
                               if (noun == rock1)
                               { if (self.number <= 5)
                                    "The small rock bumps harmlessly off the jars with a slight ping.";
                                 give rock1 splattered;
                                 "It bounces off a mucky shelf with a slight tap, then falls to the floor.";
                               }
                               if (noun == egg)
                               {  AttachSmear(jars, inside_shed);
                                  if (self.number > 5)
                                     "You must aspire to be Jackson Pollock. You squint, take careful aim and
                                      throw the egg at the muck on the shelves. It hits a shelf and breaks open,
                                      leaving a gooey, yellow trail of egg.";
                                  give self touched;
                                  "You squint, take careful aim and throw the egg at one of the jars. It hits it
                                   and breaks open, leaving a gooey, yellow smear, then oozes to the ground.";
                               }
                               if (noun == rock2)
                               { if (self.number > 5)
                                 {  give rock2 splattered;
                                    "You throw the large rock at the muck on the shelves. It bounces off a shelf,
                                     then falls to the floor with a thud.";
                                 }
                                 self.number++;
                                 if (self hasnt crushed)
                                 {  Achieved(8);
                                    give self crushed;
                                    give rock2 splattered;
                                    print "You draw back your arm and throw the large rock hard at the";
                                    if (self has touched)
                                    { DettachSmear(self);
                                      print " egg-marked jar. It hits it and several others beside it, ";
                                    }
                                    else print " jars. It hits several, ";
                                    "smashing them. Shattered glass tinkles and clatters. Incredibly,
                                     the awful stink actually manages to get worse.";
                                  }
                                  if (self.number > 2)
                                  {  if (self.number == 3) i = 5;
                                     else{ if (self.number == 4) i = 4; else i = 3; }
                                     j = random(i);
                                     if (j == i)
                                     { self.number--;
                                       "You throw the large rock at the remaining jars. It misses, bounces harmlessly
                                        off the back wall, rattling the boards, then falls to the floor with a thud.";
                                     }
                                  }
                                  if (self.number == 5)
                                  {  self.number++;
                                     give rock2 splattered;
                                     print "You take careful aim and throw the large rock at the";
                                     if (self has touched)
                                     {  DettachSmear(self);
                                        print " egg-marked jar. Bingo! It hits it dead-center, knocking into the ones on
                                               either side as well, ";
                                     }
                                     else print " few remaining jars. Bingo! It hits them dead-center, ";
                                     "smashing them. Shattered glass tinkles and clatters. The stink increases to the
                                      point it becomes unbearable.";
                                  }
                                  give rock2 splattered;
                                  print "You take careful aim and throw the large rock at the";
                                  if (self has touched)
                                  {  DettachSmear(self);
                                     print " egg-marked jar. It hits it and several others beside it, ";
                                  }
                                  else print " remaining jars. It hits several, ";
                                  "smashing them. The stench intensifies as shattered glass tinkles.";
                               }
      ];

Object board "board"
has concealed
with name "board" "plank" "shelf" "wooden" "bottom" "long",
     description
     [;  print "It is about six feet long";
         if ((self in creek) && (self.number == 0))
            ". The ends are covered with mud.";
         if (self.number == 1)
            ". The ends are sunk in the mud and some water laps over the top.";
         if (self.number == 2)
            ". The ends have almost disappeared into the mud and the middle sags just below the surface of the water.";
         ".";
     ],
     number 0,
     state 0,
     before
     [; if ((self.number >= 3) && (action ~= ##Take))
           return Std_Msgs(10);
        Take  : if (rock1 in player) return Std_Msgs(4);
                if (rock2 in player) return Std_Msgs(5);
                if (egg in player) return Std_Msgs(7);
                if (self in creek)
                {  if (self.number >= 3)
                   {  print "You plunge a hand into the dark water and bravely poke around, searching for
                             the board. You find an edge and tug, but it is firmly wedged into the mud";
                      if (hand has muddy) WashOffMud(true);
                      ".";
                   }
                   "You tug on the board, but it now seems to be firmly wedged into the mud.";
                }
        Drop  : if (location == by_shed)
                {  Achieved(4);
                   move self to east_creek;
                   "The board falls, then bumps down the slope, landing by the creek.";
                }
       Push  : if (location == by_shed) <<Drop self>>;
               if ((self notin creek) && (location == east_creek))
                  <<PutOn self creek>>;
    ThrownAt : if ((second ~= 0) && (noun == second)) return Std_Msgs(14);
               if (noun == wild) return Std_Msgs(11, wild);
               "B-o-r-i-n-g. There are better targets than the board.";
      Attack : if (self hasnt moved)
               { print "You have NO wish to be that close to the ";
                 if (jars.number > 5) "muck.";
                 "jars.";
               }
               if ((self in creek) && (self hasnt general))
               {  give self general;
                  "It has no resistant with the water under it. You give it a slight slap.";
               }
               if ((self notin creek) && (hand hasnt lump))
               {  Achieved(10);
                  give hand lump;
                  "A karate expert you're not. With a yell, you hit the board. Ouch! It doesn't
                   split, but it feels like your hand almost did.";
               }
               "You're not into sadomasochism, are you? This is a clean exhibit! (Sort of.)";
        Kick : if (self hasnt moved) return Std_Msgs(13);
               if (self in player) return Std_Msgs(12);
               "Ouch!";
         Eat : "Maybe if you could pulverize it some way, first. Maybe.";
       Taste : return Std_Msgs(9);
       Touch : "The board is rough and splintery under your hand.";
       Rub   : GetSplinter(self, false); rtrue;
       Peel  : "Where's the chain saw?";
       Enter : if (self notin creek) rfalse;
               if (location == east_creek) <<Go w_obj>>;
               <<Go e_obj>>;
    ],
    after
    [; Take  : if (self has concealed)
               {  give self ~concealed;
                  Achieved(3);
                  "Reluctant to be close to those icky jars for very long, you dart up to
                   the shelves, snatch the board and dash back.";
               }
    ];

Object motes "dust motes"
has scenery pluralname
with name "dust" "motes";

Object sunlight "sunlight"
has scenery
with name "sunlight" "sunshine" "light" "fingers";

Object worm "worm"
has concealed
with name "worm" "worms",
before
[; if (action~=##Examine)
   if (self hasnt general)
   {  give self general;
      "The worm has crawled away.";
   }
   if (self hasnt foundordone)
   { give self foundordone;
     "It's GONE, I tell you!";
   }
   if (self hasnt braved)
   { give self braved;
     print "Nobody loves me, everybody hates me. I think I will go in the
            back yard and eat worms (an old childhood ditty)";
   }
   if (action==##Eat or ##Taste)
   { remove self;
     ". Well, if is that how you feel! You take the worm and pop it into your mouth.
      It wriggles on your tongue until you bite it to death. Yum, dirt-covered, raw meat.";
   }
   ".";
];

Object smashed_egg "smashed egg"
with name "smashed" "egg" "little" "blue" "junk" "shell" "broken",
description "The egg is thoroughly smashed. Junk oozes out of it.",
number 0,
before
[; Eat, Taste       : "You've eaten a lot of strange things, but it looks like that is NOT
                       all yolk and egg white. Ugh, no way, Jose.";
   Take, Touch      : "But it's all in bits and pieces.";
   Peel             : "It already looks as quite peeled.";
   Attack, ThrownAt : if (action == ##ThrownAt)
                      {  if ((second ~= 0) && (noun == second)) return Std_Msgs(14);
                         if (noun == wild) return Std_Msgs(11, wild);
                      }
                      "You can't make an omelet without breaking a few eggs, but you have
                      already broken the only egg around.";
   SmellThing       : if (east_creek has general) Achieved(11);
                      if (self has general)
                         "It smells like sulfur. Sort of like, er um, well, sort of like a... fart.";
                      "Actually, it doesn't have much of an odor... yet.";
],
time_left 0,
time_out
[; give self general; ];

Object smear "yellow smear"
has concealed
with name "smear" "eggy" "yellow" "gooey" "trail",
description "Funny, the smear looks like splashed raw egg yolk.",
number 0,
before
[; Eat, Taste : if ((self.number > 0) && (self.number == jars)) <<Taste jars>>;
                "You must be desperate for an afternoon snack or a sugar rush or ANY kind of
                 rush. You lick the smear. Gag. More texture than taste, it is unpleasantly
                 like some type of bodily fluid with only a vaguely eggy flavor.";
   Take       : if (self.number == jars)
                {  if (jars.number > 5)
                      "The smear is embedded in the vile muck.";
                   "The smear is plastered to a jar.";
                }
                print_ret "The smear is plastered to the ", (name) self.number, ".";
    Touch     : if (self.number == jars) <<Touch jars>>;
                "Yep. The smear feels as gooey as it looks.";
  SmellThing : <<SmellThing smashed_egg>>;
  Attack     : <<Attack smashed_egg>>;
];

!----------------------------------------------------------------------------
! Background Scenery - Objects in more than one location (found_in).
!----------------------------------------------------------------------------

Object landscape "landscape"
has scenery
with name "landscape",
before
[; Examine: if (~~(voice.depth_prompt))
            { voice.number = 1;
              voice.daemon();
            }
            <<Look>>;
   default : "You can only look at the landscape.";
],
found_in east_creek west_creek by_shed;

Object slope "slope"
 has static concealed
 with name "slope" "steep" "rocky" "rise",
      before
      [; if (location == east_creek) "Try northwest instead.";
         if (location == by_shed) "Try southeast instead.";
         "The slope isn't important in and of itself.";
      ],
      found_in east_creek west_creek by_shed;

Object bird "bird"
has scenery
with name "bird" "birds",
before
[; if (~~(voice.sound_prompt)) "You can't see any such thing.";
   "Although you can hear birds, you can't actually see any.";
],
found_in east_creek west_creek by_shed;

Object shadows "shadows"
has scenery
with name "shadows" "shadow",
description
[; if (~~(voice.depth_prompt)) "You can't see any such thing.";
   "You must be thinking of some other piece of IF. These shadows are just shadows.";
],
found_in east_creek west_creek by_shed;

Object sun "sun"
has scenery
with name "sun" "sunlight" "sunshine" "light" "shafts",
found_in east_creek west_creek by_shed;

Object oak_trees "oaks"
has static concealed pluralname
    with name "trees" "tree" "oak" "oaks" "large" "full-grown" "boughs" "branches" "limbs"
              "leaves" "leaf" "bark" "canopies" "tops",
    parse_name
    [ i j; if (player notin rope) j='tree'; else j=-1;
         while (NextWord()==j or 'trees' or 'oak' or 'oaks' or 'large' or 'full-grown' or 'boughs' or
                        'canopies' or 'branches' or 'limbs' or 'leaves' or 'leaf' or 'bark') i++;
         return i;
    ],
    description
    [; if (voice.depth_prompt) "The trees are large and stately, their branches massive gnarled arms. Some reach
                                for the sky, but many bend away from it, contorting into interesting shapes.";
       "The trees are still foggy, but seem large and stately.";
    ],
    before
    [; if (action~=##Examine or ##Climb) "Which tree? There are so many.";
       Climb: if (~~(voice.depth_prompt))
                 "They are still foggy, so you can't spot a climbable one.";
              if (location == east_creek or by_shed)
                 "All the trees are actually on the other side of the creek.";
              "You spot a likely oak and hoist yourself up into the lowest branches. You look
               around, enjoying the elevated view. After having your fill, you get down.";
    ],
    found_in east_creek west_creek by_shed;

Object creek "creek"
has concealed container open
with name "creek" "muddy" "river" "water" "stream",
     description
     [; if (voice.depth_prompt)
           print "It is about five feet wide. The water is dark, almost stagnant.
                  The banks are very muddy";
        else print "It is dark and several feet wide";
        SeeBoard();
        ".";
     ],
     first_jump 0,
     before
     [;  if ((action~=##Examine or ##ThrownAt or ##Receive) &&
             (location ~= east_creek or west_creek))
             return Std_Msgs(2, self);
         SkipOn     : if (noun ~= egg) <<ThrowAt noun self>>;
                      if (location == by_shed) <<ThrowAt noun self>>;
                      if (location == east_creek) SmashEgg(west_creek);
                      else SmashEgg(east_creek);
                      "You flick your wrist as you hurl the egg. It hits the surface of the water
                       with a loud splat and stops. The slow moving current starts to carry the broken
                       shell away. As it does, the egg drifts sideways and lodges on the other bank.";
         ThrownAt, Receive
                    : if ((action==##Receive) && (location == by_shed))
                         return Std_Msgs(2, self);
                      if ((action==##ThrownAt) && ((second ~= 0) && (noun == second))) return Std_Msgs(14);
                      if (noun == wild)
                      {  if (location == by_shed) "The creek is too far away.";
                         remove wild;
                         print_ret "You toss ", (the) noun, " in the creek. The slow moving current
                                    gradually carries them out of view.";
                      }
                      if (noun == hand)
                      {  if (hand hasnt foundordone) <<Touch self>>;
                         if (hand has muddy)
                         {  print "You dip your hand in the cool water. Feels good";
                            WashOffMud(true); rtrue;
                         }
                         "The water cools the rash a little, but not enough.";
                      }
                      if (noun == rock1)
                      {  if (location == by_shed)
                         {  move rock1 to east_creek;
                           "You toss the small rock at the creek, but it falls short, landing below you with
                            a clatter.";
                         }
                         if (location == east_creek) move rock1 to west_creek;
                         else move rock1 to east_creek;
                         Achieved(0);
                         "Flicking your wrist, you toss the small rock across the water. With a pishing
                          sound it skips, once, no, twice! before it bounces onto the other bank.";
                      }
                      if (noun == rock2)
                      {  move rock2 to creek;
                         give rock2 concealed;
                         if (location == by_shed or east_creek) rock2.number = west_creek;
                         else rock2.number = east_creek;
                         Achieved(1);
                         print "You hurl the large rock at the water. Much too heavy to skip, it plunges
                                below the surface near the ";
                         if (location == by_shed or east_creek) print "western"; else print "eastern";
                         " bank with a loud splash. Ripples swirl outward from the spot.";
                      }
                      if (noun == egg)
                      {  if (location == by_shed)
                         {  SmashEgg(east_creek);
                            "You throw the egg at the creek, but it is too light and crash lands below you.";
                         }
                         if (location == east_creek) move egg to west_creek;
                         else move egg to east_creek;
                         "You lightly toss the egg in the creek. It bobs for a moment, then the slow
                          moving current starts to carry it away. As it does, the egg drifts sideways
                          and lodges on the other bank.";
                      }
                      if (noun == board)
                      {  if (action==##ThrownAt)
                         { if (location ~= east_creek)
                           {   print "Practicing log tossing? ";
                               return Std_Msgs(2); }
                           Achieved(5);
                           move board to self;
                           give board supporter;
                           "The board is heavy, so luckily it lands laying across the creek. It sinks
                            slightly into the mud.";
                         }
                         Achieved(5);
                         move board to self;
                         give board supporter;
                         "It takes some effort, but by hoisting the board horizontally, pointing
                          one end west and letting go, you manage to lay the board across the creek.
                          It sinks slightly into the mud.";
                      }
         Search       : <<Examine self>>;
         LookUnder    : if (rock2 in self)
                        {  print "Looking at the filthy water, you decide there has GOT to be a better way. ";
                           if (rock1 in player) return Std_Msgs(4, rock1, true);
                           if (board in player) return Std_Msgs(6, board, true);
                           if (egg in player) return Std_Msgs(7, egg, true);
                           <<Fish rock2>>;
                        }
                        "You lower your face to the water to look under it. But as you get near the
                         filthy surface, you chicken out, stopping short of putting your head in.";
         Taste, Eat, Drink :
                       if (player has braved)
                          print "Seriously? After peeing in it?!!! ";
                       "The standing water looks much too dark, unsafe to drink.";
         Paddle     : if (noun ~= 0)
                      {  if (noun == knee or wild or board) rfalse;
                         if ((noun ~= hand or player) && (noun notin player))
                             print_ret "You aren't holding ", (the) noun, ".";
                         if (noun == egg or rock1 or rock2)
                         {  if (noun has smeared)
                            {  DettachSmear(noun);
                               print "You wash ", (the) noun, " in the creek. It comes out as clean as
                                      the dirty water will allow";
                            }
                            else
                               print "You wash ", (the) noun, " in the water. Since it was somewhat
                                      clean to begin with it emerges somewhat clean";
                            if (hand has muddy){ WashOffMud(true); rtrue; }
                            ".";
                         }
                      }
                      print "You splash around some water with your hand";
                      if (hand has muddy){ WashOffMud(false); rtrue; }
                      ".";
         Touch      : "The water is cool and, surprise, surprise, wet.";
         Take       : "You left your Superman thermos behind (far away and long ago, what
                       a shame. It might be worth a bundle now).";
         JumpOver   :  if (~~(voice.depth_prompt))
                         "There doesn't seem to be anything on the other side worth jumping for.";
                      if (self.first_jump == 0)
                         self.first_jump = location;
                      if (location ~= self.first_jump)
                         "Surprisingly, the creek isn't any easier to jump over from this side.";
                      if (self hasnt braved)
                      {  give self braved;
                         "Unfortunately the creek is a bit too wide for you to jump across, especially
                          since you would have to push off from a slippery, muddy bank.";
                      }
                      "The ground is too muddy to push off from and the creek too wide for you to jump over.";
       Enter        : if (location == east_creek) <<Go w_obj>>;
                      <<Go e_obj>>;
     ],
     found_in east_creek west_creek by_shed;

Object mud "mud"
 has concealed
 with name "mud" "muddy" "clay" "dirt" "bank" "banks",
      number 0,
      description "The mud is chocolate brown and very wet looking.",
      before
      [; if ((action~=##Examine) && (player in rope))
            return Std_Msgs(2, self);
         Receive     : if (noun == hand) <<Touch self>>;
                       if (noun in player) <<Drop noun>>;
                       print_ret "You aren't holding ", (the) noun, ".";
         Touch, Take : if (hand has foundordone)
                       {  if (hand has muddy)
                             "Your hand is muddy enough now.";
                          if (hand has general)
                             StopTimer(hand);
                          give hand muddy;
                          "Your smear some mud on your hand. Oooooh. Its slimy coolness soothes the fiery rash.";
                        }
                       "You squeeze some wet, gluey clay between your fingers. It is slimy and cool.
                        But don't you think you're a little old for mud pies?";
         Eat, Taste  : self.number++;
                       switch(self.number)
                       { 1 : Achieved(10);
                             "Grainy with a deep chalky flavor, it's full-bodied, but has a lot of sediment.";
                         2 : "Obviously that's enough mud for you.";
                         3 : "Next you'll be looking for worms.";
                         4 : "There isn't a worm around for miles and miles and miles and miles.";
                         5 : move worm to location;
                             "Actually there is a worm in the mud at your feet. But think I'd tell YOU?";
                         6 :  "More mud is OUT. Clearly it went to your head.";
                         default : "Can't hold your mud, huh?";
                       }
         ThrownAt    : <<Drop noun>>;
         SmellThing  : if (~~(voice.smell_prompt)) <<Smell>>;
                       "Dank and earthy.";
      ],
      found_in east_creek west_creek;

Object shed "rickety old shed"
has static concealed
with name "shed" "shack" "hut" "rickety" "old" "weathered" "boards" "slats",
     initial
     [; print "Leaning here is a weathered shed";
        if ((self has smeared) && (smear in location))
           ". On the boards is a gooey, yellow smear.";
        ".";
     ],
     description
     [; if (self hasnt general)
        { give self general;
          print "The shed was here before the nearest track house was built. Probably it was part of
                 a farm that you know originally occupied this area. ";
          if (location == east_creek)
             print "You remember a door being on the other side. ";
        }
        print "The grey, weathered boards look like they should fall over at the slightest touch, but they
               have steadfastly withstood the passing years and children";
        if ((self has smeared) && (smear in location))
           print ". On the boards is a gooey, yellow smear";
        if (location == by_shed)
           ". A wide doorway leads into its dark interior.";
        ".";
    ],
    number 0,
    before
    [; if (~~(voice.depth_prompt)) "You can't see any such thing.";
       if ((action~=##Examine or ##ThrownAt) && (location ~= by_shed or inside_shed))
          return Std_Msgs(2, self);
       ThrownAt : if ((second ~= 0) && (noun == second)) return Std_Msgs(14);
                  if (noun == wild) return Std_Msgs(11, wild);
                  if ((noun == board) && (location == east_creek))
                  {  move board to east_creek;
                     print "The board is too heavy to fly far, it hits the even steeper slope
                            behind the shed and ";
                     if (voice.sound_prompt) "thuds back down.";
                     "slides back down.";
                  }
                  if ((noun == egg) && (location == west_creek))
                  {   SmashEgg(east_creek);
                      "The egg is too light. It sails through the air and smashes down on the other side of the creek.";
                  }
                  if (location == inside_shed)
                  {  if (noun == egg) AttachSmear(shed, inside_shed);
                     else move noun to location;
                  }
                  else
                  {  if (noun == egg) AttachSmear(shed, by_shed);
                     else move noun to by_shed;
                  }
                  if (noun == rock1)
                  { Achieved(0);
                    "The small rock hits the shed lightly, making a slight tapping sound.";
                  }
                  if (noun == rock2)
                  {  Achieved(1);
                     "The large rock hits it hard, making a satisfying thump. The boards rattle.";
                  }
                  if (noun == board)
                  {  print "The board is too heavy, it falls short";
                     if (voice.sound_prompt) " with a thud.";
                     ".";
                  }
                  if (noun == egg)
                     "The egg hits the boards, leaving a gooey yellow smear, then oozes to the ground.";
       Attack  : if (~~(voice.sound_prompt)) "The boards shake.";
                 "The boards rattle.";
       Taste   : return Std_Msgs(9);
       Touch   : "The boards are rough and splintery under your hand.";
       Rub     : GetSplinter(self, false); rtrue;
       Push    : if (hand hasnt hurt){ GetSplinter(self, true); rtrue; }
                 "The shed is stronger than it looks, the boards only give a little.";
       Enter   : if (location == by_shed)
                 { give shed concealed;
                   PlayerTo(inside_shed);
                   rtrue;
                 }
                "You're already inside.";
      Exit    : if (location == inside_shed)
                 { give shed ~concealed;
                   PlayerTo(by_shed);
                   rtrue;
                 }
                 "You're already outside.";
    ],
    found_in east_creek west_creek by_shed inside_shed;

Object rope "knotted rope"
class InsideOrOn
has concealed static supporter
with name "rope" "knotted" "knot" "swing" "hanging" "outline",
     description
     [; print "Obviously a swing, the large knot at the bottom functions as a
               ~platform~ to stand on. The rope ";
        if (self has general) print "swings";
        else print "hangs";
       " several feet above the ground.";
     ],
     reach_zones elm nest,
     number 0,
     state 0,
     before
     [; if (~~(voice.depth_prompt)) "You can't see any such thing.";
        if (location~=west_creek)
        {  if ((self hasnt general) && (action~=##Examine or ##ThrownAt))
              return Std_Msgs(2, self);
           if ((self has general) && (action~=##Examine or ##ThrownAt or ##Take or ##Enter))
              return Std_Msgs(2, self);
           if (action==##Take or ##Enter)
           {  if (self.number == 1 or 3)
                 "You jump, grabbing for the rope, but it swings out of reach before you can even touch it.";
              "The rope is swinging too far away for you to reach.";
           }
        }
        ThrownAt, Receive : if (action==##ThrownAt)
                            {  if ((second ~= 0) && (noun == second)) return Std_Msgs(14);
                               if (noun == wild) return Std_Msgs(11, wild);
                            }
                            if (noun == board)
                               "The board is too heavy to throw that far.";
                            if (noun == egg)
                            {  SmashEgg(west_creek);
                               if (location == east_creek)
                                  "The egg is too light. It sails through the air and smashes down on the other side of the creek.";
                             } else move noun to west_creek;
                             print (The) noun, " misses the narrow rope and crashes to the ground";
                             if (location == east_creek) " on the other side of the creek.";
                             ".";
        Tie          : if (player in self) "You'll have to get off the rope first.";
                       if (second == 0)
                       {  print "The rope is already knotted";
                          if (self hasnt touched)
                          { give self touched;
                            ". (Sneaky, aren't you? You can't tie more knots in
                             the rope to climb it higher. You can't climb it higher, period, but good try.)";
                          }
                          ".";
                       }
                       if (self has general)
                       { self.number = 0;
                         give elm ~touched;
                         give self ~general;
                         StopDaemon(self);
                         print "You try, stopping the rope in its swing, ";
                       } else print "You try, ";
                       print_ret "but it is too thick to tie around ", (the) second, ".";
        Climb        : if (player notin self) <<Enter self>>;
                       "The only knot is the one you are standing on, so the rope is very hard to climb.
                        You hitch yourself up a little, then slip back down to the knot.";
        Enter        : if (player notin self)
                       {  Achieved(7);
                          if (self has general)
                          {  self.state  = 1;
                             StopDaemon(self);
                          }
                          self.number = 0;
                          give elm ~touched;
                          give self general;
                          StartDaemon(self);
                       }
       Tie    :  "The rope already has a knot.";
       Touch  :  "Bristly.";
       Push, Pull,
       Swing  :        if (player notin self)
                       {  if (self has general)
                             StopDaemon(self);
                          self.number = 0;
                          give elm ~touched;
                          give self general;
                          StartDaemon(self);
                          "You grab the rope and pull it back as far as you can, then let go.";
                        }
                        if (self has general)
                        {  if (self.number == 2)
                           {  self.number--;
                              self.number--;
                              self.state = 2;
                              "You lean out and push your palm against the tree.";
                           }
                           if (self.number == 4)
                           { self.number--;
                             self.number--;
                             self.state = 2;
                             "You lean as far out as you can and push your fingers against the tree.";
                           }
                           "You sway your body back and forth, but it does little to make the rope swing more.";
                       }
         Untie       : if ((second ~= 0) && (second ~= elm)) "The rope isn't tied to that.";
                       "The branch it is tied to is too high.";
         Attack      : "Utterly, completely, totally pointless. (And without any merit whatsoever.)";
         Peel        : "Aha! Good try, but the rope isn't made of hemp, so forget it.";

     ],
     after
     [; Enter         : if (self.state)
                           print "You grab the rope, stopping it in its swing. ";
                        print "You pull back the rope and hop on it, providing impetus to start it swinging";
                        if (self.state) {  self.state = 0; " again."; }
                        ".";
     ],
     daemon
     [; self.number++;
        if ((self.state == 2) && (location ~= by_shed or inside_shed))
           print "^The rope speeds up a little ";
        if ((self.number == 1) && (location ~= by_shed or inside_shed))
        {  if (self.state == 2) print "and ";
           else print "^The rope ";
           print "swings high out over the creek, almost to the other bank.^";
        }
        if ((self.number == 2) && (location ~= by_shed or inside_shed))
        {  if (self.state == 2) print "and ";
           else print "^The rope ";
           print "swings back, close to the tree trunk.^";
        }
        if ((self.number == 3) && (location ~= by_shed or inside_shed))
        {  if (self.state == 2) print "as it ";
           else print "^The rope slows a little as it ";
           print "swings out over the water.^";
        }
        if ((self.number == 4) && (location ~= by_shed or inside_shed))
        {  if (self.state == 2) print "and ";
           else print "^The rope ";
           print "swings back, within touching distance of the tree trunk.^";
        }
        if ((self.number == 5) && (location ~= by_shed or inside_shed))
        {  if (elm has touched) print "^The rope slows down, ";
           else print "^The rope slows more, ";
           print "swinging in approximately a 60 degree arc.^";
        }
        if (self.number == 6)
        {  self.number = 0;
           give elm ~touched;
           give self ~general;
           StopDaemon(self);
           if (location ~= by_shed or inside_shed)
              print "^The rope swings back and forth a little, then slowly comes to a stop.^";
        }
        if (self.state == 2)
        {  self.state = 0;
           if (elm hasnt touched)
              give elm touched;
        }
     ],
     found_in east_creek west_creek;