ROUTINE VisP;
VisP =                          { (Visp List Propno) => True IFF an object }
(($eq %1 0) : ($rtrn FALSE))   {       is visible on List that has Propno }
(($prop %1 %2) :
	($rtrn TRUE))                   { Found one! }
(($or ($prop %1 OPEN)
      ($prop %1 TRANS)):                { Look inside...}
	( (VisP ($cont %1) %2): ($rtrn TRUE) ))
($rtrn (VisP ($link %1) %2))
;

ROUTINE Reach;                  { (Reach obj loc) => True IFF the obj   }
Reach =                         {       IS the loc or can be reached    }
(($eq %2 0) : ($rtrn FALSE))    {       by the loc }
(($eq %1 %2): ($rtrn TRUE))
			{ Still explore inside }
(($prop %2 OPEN):
	((Reach %1 ($cont %2)): ($rtrn TRUE))
)
($rtrn  (Reach %1 ($link %2)))

;

ROUTINE See;                  { (See obj loc) => True IFF the obj   }
See   =                         {       IS the loc or can be seen       }
(@DARKG: ($rtrn FALSE))		{ Can't see in a dark room! }
(($eq %2 0) : ($rtrn FALSE))
(($eq %1 %2): ($rtrn TRUE))
(($or  ($prop %2 TRANS)                 { Still explore inside }
       ($prop %2 OPEN)):
	((See   %1 ($cont %2)): ($rtrn TRUE))
)
($rtrn  (See   %1 ($link %2)))
;

Avail =
	(($eq ($loc %1) .ME) : ($rtrn TRUE))	{ shd be closure, really }
	(($not %1):($say "The what?\n")($exit 1))
	(($not (See %1 ($cont ($loc .ME)))):
		($say "I can't see that item here.\n")
		($exit 1)
	  )
	(($not (Reach %1 ($cont ($loc .ME)))):
		($say "I can't get at that item.\n")
		($exit 1)
	  )
	(($and ($prop .ME SHRNK)
	       ($not ($prop %1 SHRNK))  ):
		       (($ne ($loc %1) .ME):
				($say
"Right now, ")(($sdisc %1))($say " is too big for you to deal with.\n")
				($exit 1)
			)
	  )
	($rtrn TRUE)
;

ROUTINE LitP;
LitP =                          { (LitP Room) => True IFF Room is lit }
(($prop %1 LIGHT) : ($rtrn TRUE))
(($or (VisP ($cont %1) LIGHT)
      (VisP ($cont %1) FLAME)): ($rtrn TRUE))

(($or (VisP ($cont .ME) LIGHT)                  { Check .ME 'cause invisibl }
      (VisP ($cont .ME) FLAME)): ($rtrn TRUE))
($rtrn FALSE)
;

ROUTINE Blank;
Blank =                         { Blank n => Type n blanks }
(($gt %1 0):
	($say "  ")
	(Blank ($minus %1 1)));

ROUTINE Llook; ROUTINE Slook;
Llook =                         { (Llook Level Object) describes Object }
(($eq %2 0) : ($exit 0))
(($eq %1 0) :                   { Level 0 == This is a room.  Check lighting }
	((LitP %2):
		($setg DARKG FALSE)
		(($ldisc %2))           { Talk about the room }
		(($not @DARKG):
			(Llook 1 ($cont %2))    { Talk about its contents }
		)
	{else}:
		($say "It's mighty dark in here!\n")
		($setg DARKG TRUE)
	)

{else} :                        { Level > 0 == This is a list of objs }
	( ($ldisc %2)   :       { Talk (only) about the visible }
		(Blank %1)                      { Indent }
		(($ldisc %2))           { Blurb the object }

		( ($cont %2):      { something inside it...}
			(($or ($prop %2 OPEN)($prop %2 TRANS)):
				(Blank %1)
				($say "It contains:\n")
				($setp %2 CONTS TRUE)
				(Slook ($plus %1 1) ($cont %2))
					{ Short descriptions for contents }
			)
		)
	 )
	(Llook %1 ($link %2))
);


Slook =                         { (Llook Level Object) describes Object }
(($eq %2 0) : ($exit 0))
(($eq %1 0) :                   { Level 0 == This is a room.  Check lighting }
	((LitP %2):
		($setg DARKG FALSE)
		(($sdisc %2))           { Talk about the room }
		(($not @DARKG):
			($setp %2 CONTS FALSE)
			(Slook 1 ($cont %2))    { Talk about its contents }
		)
	{else}:
		($say "It's mighty dark in here!\n")
		($setg DARKG TRUE)
	)

{else} :                        { Level > 0 == This is a list of objs }
	(($sdisc %2) :          { Talk (only) about the visible }
		(($not ($prop ($loc %2) CONTS)):
			(Blank ($minus %1 1))
			($say "You can see:\n")
			($setp ($loc %2) CONTS TRUE)
		)
		(Blank %1)                      { Indent }
		(($sdisc %2))           { Blurb the object }
		(($and ($ne ($cont %2) 0)       { something inside it...}
		       ($or ($prop %2 OPEN)     {...and you can see it }
			    ($prop %2 TRANS)
			)
		  ):

			($setp %2 CONTS TRUE)
			($say ", containing:\n")
			(Slook ($plus %1 1) ($cont %2))
					{ Short descriptions for contents }
		   :    ($say "\n")

		)
	)
	( Slook %1 ($link %2))

);




LOOK =



	($setg WASDK @DARKG)
	(@LOOKP :
		(($prop ($loc .ME) VISIT):
			(Slook 0 ($loc .ME))
		 {else} :
			(Llook 0 ($loc .ME))
			($setp ($loc .ME) VISIT TRUE)
		)
		(@DARKG : ($setp ($loc .ME) VISIT FALSE))
	)
	($setg LOOKP FALSE)
	($itun)
	($say "\n> ")
;

ROUTINE GrowX; ROUTINE ShrnX;
GrowX = (($prop %1 SHRNK):
		($setp %1 SHRNK FALSE)
		(($cont %1):
			(GrowX ($cont %1)))
		(($link %1):
			(GrowX ($link %1)))
	)
	;

Grow = (($prop .ME SHRNK):
		($setp .ME SHRNK FALSE)
		(($cont .ME):
			(GrowX ($cont .ME)))
	)
;

ShrnX = (($not ($prop %1 SHRNK)):
		($setp %1 SHRNK TRUE)
		(($cont %1):
			(ShrnX ($cont %1)))
		(($link %1):
			(ShrnX ($link %1)))
{else}  :
		($say "You hear a tiny POP as ")(($sdisc %1))
		($say " vanishes completely!\n")
		(($link %1):
			(ShrnX ($link %1)))
		($move %1 .ALL)
	)

;

Shrink = (($not ($prop .ME SHRNK)):
		($setp .ME SHRNK TRUE)
		(($cont .ME):
			(ShrnX ($cont .ME)))
	)
;

WzTgl =			{ Toggle the Wizard flag }
	($setg Wizrd ($not @Wizrd))
	(@Wizrd:
		($say
"You hear a low rumble of thunder, shaking the very ground on
which you stand.  Suddenly, there is a blazing flash of light!!
You are unharmed, but feal great power flowing in your body.\n")
	{else}:
		($say
"Your wizardly powers unceremoniously fade away.\n")
	);
