! -----------------------------------------------------------------------------
!
!                           Smart Desk Object V2.0
!                            By Jason Peter Brown
!                        For Hugo 2.4d by Kent Tessman
!                           Friday December 5 1997
!
! -----------------------------------------------------------------------------
!
! Okay, this object is no big deal, and it is something that no one in their
! right mind would waste their time coding, but I was really bored so I did
! it. Reason for coding: I hate accidently typing something like:
!
! >put envelope in desk
!
! Only to get the response:
!
! But the desk is not a container
!
! ..blah blah blah...Obviously I meant the drawer and not the desk!!!
! One easy way to remedy this by making the desk a container and then
! make "drawer" a noun under the entire desk object. This is alright except
! for the fact that >examine desk and >examine drawer will produce the same
! descriptions which is pretty lame if you write an involved description
! which makes sense when applied to the desk...(ie: >examine drawer / The
! desk is monstrous and made entirely of cockroach exoskeletons...)
!
! Thus I set out to make a "smart" desk. If the user types ">put envelope
! in desk" or ">open desk" or ">close desk" or ">look in desk" (or whatever!)
! the program will respond with:
!
! (assuming that you mean the drawer rather than the desk...)
!
! and then perform the proper operation on the *drawer* object.
!
! ***NEW WITH VERSION 2.0*** The old bug has been fixed, where if the user
! enters something along the lines of:
!
! >put the gun on the refrigerator. put the envelope in the desk.
!
! The code block will correctly perform the DoPutIn routine on the drawer.
!
! ***ALSO NEW TO V2.0*** You can now unlock and lock the desk and it will
! perform the proper operation on the drawer...
!
! ***ALSO NEW TO V2.0*** Vastly improved the DoLookIn code block to bring
! it up to par with the DoPutIn code block...I overlooked this is the
! last release...
!
! Any complaints, etc..can go to [email protected]
! (it's my brother's account so please don't go nuts!)
!
! PS: If you are using the verbstubs library (or have your own
! DoPull and DoPush routines) then the drawer will open with a pull
! (but not if it is already open) and close with a push (but not if
! it is already closed). Pretty exciting stuff, I know...
!
! PPS: Feel free to mess with the code as much as you like! If you do
! improve on it please e-mail your changes! If you are feeling sarcastic
! you can always thank me for the "awe-inspiring" desk in the credits
! to your IF product, but if you don't no hard feelings! I know it is
! just a stupid object for all of us silly typers and code perfectionists
! (even though this code is far from perfect!)
! As freeware, no warranty is expressed or implied...Use this code at
! you own risk...If your computer explodes as a direct result of using
! this code it is not my fault!

scenery desk "wooden desk"
{
adjectives "large" , "big" , "oak" , "wooden" , "wood"
article "a"
capacity 100
in emptyroom   !change this to whatever room you want this desk to appear in!
is static , enterable , platform , container, openable , open , lockable , locked
noun "desk"
long_desc {"The desk is quite large and is made of what appears to be oak. ";
           "It has no remarkable features save for a single drawer set into
            its underside."}
before
{
 self DoEnter , DoGo
 {
  ! If the user tries to enter the desk, this will code will be executed
  ! instead of letting him/her get onto it...
  "That's not what the desk has been designed for."
 }
 self DoOpen
 {
  ! If the user tries to open the desk, the command will be passed onto
  ! the drawer instead...
  "(Assuming that you mean the drawer rather than the desk...)"
  Perform (&DoOpen, drawer)
 }
 self DoClose
 {
  ! If the user tries to close the desk, the command will be passed onto
  ! the drawer instead
  "(Assuming that you mean the drawer rather than the desk...)"
  Perform (&DoClose, drawer)
 }
 self DoUnlock
 {
  ! If the user tries to unlock the desk, the command will be passed onto
  ! the drawer instead
  "(Assuming that you mean the drawer rather than the desk...)"
  Perform (&DoUnlock, drawer, xobject)
 }
 self DoLock
 {
  ! If the user tries to lock the desk, the command will be passed onto
  ! the drawer instead
  "(Assuming that you mean the drawer rather than the desk...)"
  Perform (&DoLock, drawer, xobject)
 }
 xobject DoPutIn
 {
  ! If the user tries to put something on or into the desk, this routine
  ! will  determine whether to put it onto the desk or into the drawer.
  local temp_a = 1
  local temp_b
  local temp_c
  do
  {
   if word[temp_a]=""
   {
    temp_c = 1
   }
   elseif word[temp_a]="on","onto"
   {
    temp_b = 1
   }
   if temp_a=words
   {
    temp_c = 1
   }
   temp_a ++
  }
  while not temp_c
  if temp_b = 1
  {
   return false
  }
  else
  {
   "(Assuming that you mean the drawer rather than the desk...)"
   if drawer is not open
   {
    "(Attempting to open the drawer...)"
    Perform (&DoOpen, drawer)
    Perform (&DoPutIn, object, drawer)
   }
   else
   {
    Perform (&DoPutIn, object, drawer)
   }
  }
 }
 self DoLookIn
 {
  ! If the user tries to look on or in the desk, this routine
  ! will  determine whether to look on the desk or into the drawer.
  local temp_d = 1
  local temp_e
  local temp_f
  do
  {
   if word[temp_d]=""
   {
    temp_f=1
   }
   elseif word[temp_d]="on","onto"
   {
    temp_e=1
   }
   if temp_d=words
   {
    temp_f=1
   }
   temp_d ++
  }
  while not temp_f
  if temp_e=1
  {
   return false
  }
  else
  {
   "(Assuming that you mean the drawer rather than the desk...)"
   Perform (&DoLookIn, drawer)
  }
 }
 self
 {
  ! If the user tries to do anything else to the desk (other than what has
  ! been trapped above), then it will perform as normal...
  return false
 }
}
}

component drawer "drawer"
{
adjectives "small" , "tiny" , "little" , "wooden"
article "a"
capacity 30
is container , openable , not open , lockable , locked
key_object small_key
nouns "drawer" , "drawers"
part_of desk
long_desc {"The little drawer is attached to the underside of the desk,
            and seems to be made of the same kind of wood as the rest of the
            desk. It is ";
            if self is open
            {"open."}
            if self is not open
            {"closed."}}
before
{
 self DoPush
 {
  ! If the drawer is open and the user pushes it, it will close.
  ! If it is closed, he/she will be told that it is already closed..
  if self is not open
  {
   "The drawer has been pushed in as far as it will go."
  }
  else
  {
   Perform (&DoClose , self)
  }
 }
 self DoPull
 {
  ! If the drawer is closed and the user pulls it, it will open.
  ! If it is open, he/she will be told that it is already open..
  if self is open
  {
   "The drawer has been pulled out as far is it will go."
  }
  else
  {
   Perform (&DoOpen , self)
  }
 }
 self
 {
  return false
 }
}
}

object small_key "metal key"
{
! This is a key object for the drawer. If you don't want the drawer to be
! lockable, then remove this object and remove the key_object
! and the lockable/locked attributes from the drawer object,
! and remove the DoLock/DoUnlock routines from the BEFORE routine
! in the DESK object...
adjectives "small" , "metal"
article "a"
in emptyroom
noun "key"
size 10
long_desc {"It is a small metal key with no distinguishing features."}
}