DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T t

⟦f06592d4b⟧ TextFile

    Length: 47222 (0xb876)
    Types: TextFile
    Names: »tess.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/General/Tess/tess.c« 

TextFile

/*
  Beyond The Tesseract   V2.0p   By David Lo :

    TRS-80 version 1.7 : 5/29/83  3/16/86 (Level II BASIC)
    MS-DOS version 2.0 : 9/1/88   10/1/88 (Turbo C 1.5)
*/

/*
    Portable version      V2.0p  By Dennis Lo  10/30/88
                          V2.1p  patches by Dave Lawrence 12/14/88
			         (fixed probability read, pass by
				  long screens, EOF endless loops)

    This version can compile with Datalight C 2.20, Microsoft C 5.0,
    QuickC 1.0, Turbo C 1.5, Unix cc (SunOs 3.?), GNU cc and *C87.

    - Changed ANSI-style function parameter declarations to K & R-style.
    - Removed #include <string.h> and added the string routines
      strlwr() and strchr() in parser.c so that it will compile with
      compilers that don't have them (like my Datalight C 2.20).
    - In ding(), split up the huge prints string into one prints()
      per line.
    - Moved the #include "parser.c" and "tess-def.c" to after the
      #include "conio.h"/#define printc code, because parser.c uses
      one cprintf().
    - Changed enumerations in tess-def.c to #defines because Unix cc
      insisted enums are not ints.
    - In main(), changed the tolower() call to a compare of both 'n' and
      'N' since tolower() doesn't work if the input is already in lower 
      case (only on Unix).
*/

/****** Define tty for 'dumb terminal' mode.  Else the 'full-screen' mode
        will use Turbo-C screen manipulation library routines.  ******/
#define tty

/****** quick alias for *C87 on MTS; loader only recognizes 8 chars. ****/
#define goto_new_lev GoNewLev
#define goto_new_loc GoNewLoc

#include <ctype.h>
/*#include <string.h>*/
#include <stdio.h>
extern char *strcpy(), *strncat(), *strcat();
extern int strcmp();

#define max(a,b) (((a) > (b)) ? (a) : (b))
#define min(a,b) (((a) < (b)) ? (a) : (b))

/*------------------------------------------------------------*/
/* on some PC clones (e.g. mine), scrolling the screen when printing a '\n'
   with the conio.h routines (e.g. putch('\n') or cprintf('\n')) is much slower
   than the stdio.h routines.
*/
nl()  {  putchar('\n');  }


/*----------------------------*/
/* if tty-mode, then using standard library functions for I/O, and ignore the
   screen I/O functions
*/
#ifdef tty

#  define cprintf (void)printf
#  define cputs (void)printf
#  define prints puts

#  define clrscr()
#  define clreol()
# define gotoxy(x,y)

/* if non-tty-mode, use console IO library
*/
#else

#  include <conio.h>

  prints( s )
    char *s;
  {
    cputs( s );
    nl();
  }

#endif


#include "tess-def.c"
#include "parser.c"
#ifdef SYSV
#include <sys/types.h>
#include <time.h>
#else /* !SYSV */
#include <sys/time.h>
#endif /* !SYSV */


/*------------------------------------------------------------*/
/* Adventure dependent stuff
*/

int
  print_room,         /* flag for updating room after command */

  curr_loc,           /* current location */
  curr_lev,           /* current level */
  level_loc [ 4 ],    /* current location for diff. levels */
  zap,                /* flag set when game over */
                      /*   1=quit   2=wrong password   3=right password */

  sleep_lev,          /* which level player was in when sleeping */

                      /* flags are 0=false/haven't done, 1=true/done */
                      /* unless otherwise noted */

  cc,                 /* coil status: 0=normal  b1=cooled  b2=magnetized */
  wa,                 /* water alien */
  ep,                 /* eat pills */
  dr,                 /* dice roll counter */
  af,                 /* audio filter inserted */
  gp,                 /* get password */
  mi,                 /* message: bits 0,1,2,3 = parts found */
  ti,                 /* think idea */
  kp,                 /* kick projector */

  dc [ 3 ],           /* each dice roll, dc[i]<33 */
  sum                 /* sum = sigma( dc ) < 100  */
  ;

/*----------------------------*/
InitAdv()
{
  int i;
#ifdef SYSV
  time_t now;
  struct tm *tp;
#else /* !SYSV */
  struct timeval tp;
  struct timezone tzp;
#endif /* !SYSV */

  for ( i=1; i<MaxObjs; i++ )
  {
    obj[i].loc = obj[i].init_loc;
  }

  level_loc[1] = 2;
  level_loc[2] = 25;
  level_loc[3] = 29;

  curr_lev = 1;
  curr_loc = level_loc [ curr_lev ];

  zap = cc = wa = ep = dr = af = gp = mi = ti = kp = 0;

#ifdef SYSV
  time(&now);
  if ((tp = localtime(&now))==NULL) {
#else /* !SYSV */
  if (gettimeofday(&tp,&tzp)==-1) {
#endif /* !SYSV */
    perror("gettimeofday");
    exit(1);
  }
#ifdef SYSV
  (void)srand48 ((long)tp->tm_sec);
  for ( sum=0, i=0; i<3; i++ )
    sum += (dc [i] = drand48() & 31);
#else /* !SYSV */
  (void)srand ((int)tp.tv_sec);
  for ( sum=0, i=0; i<3; i++ )
    sum += (dc [i] = rand() & 31);
#endif /* !SYSV */

  print_room = 1;
}

/*------------------------------------------------------------*/
/* Message routines
*/

/*----------------------------*/
PrintMess( i )
  int i;
{
  switch ( i )
  {
    case 1: prints("Nothing special happens."); break;
    case 2: prints("That isn't possible."); break;
    case 3: prints("Doesn't work."); break;
    case 4: prints("Can't do that yet."); break;
    case 5: prints("OK."); break;
    case 6: prints("How?"); break;
    case 7: cprintf("You have nothing to %s with.", cmd.verb ); nl(); break;
  }
}

not_happen() {  PrintMess( 1 );  }
not_poss()   {  PrintMess( 2 );  }
not_work()   {  PrintMess( 3 );  }
not_yet()    {  PrintMess( 4 );  }
ok()         {  PrintMess( 5 );  }
how()        {  PrintMess( 6 );  }

/*------------------------------------------------------------*/
/* Object routines
*/

/*----------------------------*/
int CheckObjAttr( nn, mask )
  int nn;
  int mask;
{
  return ( obj [nn].attr & mask );
}

#define CanGetObj(i) CheckObjAttr((i),1)
#define CanLookObj(i) CheckObjAttr((i),4)

/*----------------------------*/
CarryObj( nn )
  int nn;
{
  obj [nn].loc = -curr_lev;
}

int CarryingObj( nn )
  int nn;
{
  return ( obj [nn].loc == -curr_lev );
}

/*----------------------------*/
WearObj( nn )
  int nn;
{
  obj [nn].loc = -curr_lev - 3;
}
  
int WearingObj( nn )
  int nn;
{
  return ( obj [nn].loc == -curr_lev-3 );
}

/*----------------------------*/
int ObjOnPlayer( nn )
  int nn;
{
  return ( CarryingObj(nn) || WearingObj(nn) );
}

/*----------------------------*/
DropObj( nn )
  int nn;
{
  obj [nn].loc = curr_loc;
}

int ObjInRoom( nn )
  int nn;
{
  return ( obj [nn].loc == curr_loc );
}

/*----------------------------*/
JunkObj( nn )
  int nn;
{
  obj [nn].loc = 0;
}

/* replace object nn with object new_nn
*/
ReplaceObj( nn, new_nn )
  int nn;
  int new_nn;
{
  obj [new_nn].loc = obj [nn].loc;
  obj [nn].loc = 0;
}

/*----------------------------*/
/* See if an object is accessible.  This means the object is being
   carried/worn, is in the same room, is a concept noun (e.g. north),
   is part of the room (e.g. field), or is part of another object
   (e.g. button).
*/
int ObjIsPresent( nn )
  int nn;
{
  if ( (nn>=o_north) && (nn<=o_invent) ) /* direction, "inventory" */
    return (1);               /* always available */

  else if ( (nn>=o_buttons) && (nn<=o_four) )  /* buttons */
    return ( ObjIsPresent(o_proj) );           /* on projector */

  else if ( (nn==o_liquid) && (obj[nn].loc==-8) )  /* contained fluid */
    return ( ObjIsPresent(o_bottle) );             /* in Klein bottle */

  else
    return ( ObjInRoom(nn) || CarryingObj(nn) || WearingObj(nn) );
}

/*------------------------------------------------------------*/
/* Room routines
*/

/*----------------------------*/
/* predicates to return check whether the player in in a certain world
*/
int InComplex( rn )
  int rn;
{
  return ( rn==1 || rn==2 || rn==7 || rn==8 );
}

int InMirrorWorld( rn )
  int rn;
{
  return ( rn==4 || (rn>=9 && rn<=13) );
}

int InMathWorld( rn )
  int rn;
{
  return ( rn==3 || rn==5 || (rn>=14 && rn<=17) );
}

int InSpectralWorld( rn )
  int rn;
{
  return ( rn==6 || (rn>=18 && rn<=22) );
}

int InDreamWorld( rn )
  int rn;
{
  return ( curr_lev==2 || (rn>=23 && rn<=28) || rn==35 );
}

int InBookWorld( rn )
  int rn;
{
  return ( curr_lev==3 || (rn>=29 && rn<=34) );
}

/*----------------------------*/
PrintCurrRoom()
{
  int i,flag, len,currx;
  char *s;

#ifndef tty
  static int stop_line=1;
  /* clear window area from previous time
  */
  for ( i=stop_line; i>=1; i-- )
  {
    gotoxy( 1, i );
    clreol();
  }
#endif

  cprintf("You are %s.", room [ curr_loc ].name ); nl();

  prints("You see around you:");
  clreol();
  flag=0;
  currx=0;
  for ( i=1; i<MaxObjs; i++ )
    if (ObjInRoom(i))
    {
      s = obj[i].name;
      len = strlen(s);
      if (currx+ len + 3 > 78 ) { currx=0; nl(); clreol(); }
      cprintf("  %s.", s );
      currx += len+3;
      flag=1;
    }
  if (!flag)
    prints("  Nothing special.");
  else
    { nl(); clreol(); }

  prints("Exits:");
  clreol();
  flag=0;
  for ( i=0; i<MaxDirs; i++ )
    if ( room [curr_loc].link [i] )
    {
      cprintf("  %s.", obj[i+1].name );
      flag=1;
    }
  if (!flag) cprintf("  none.");
  nl();

#ifdef tty
  nl();
#else
  prints
("__________________________________________________________________________");
  stop_line = wherey();  /* stop line is the line after the separator bar */
  gotoxy( 1,25 );
#endif
}

/*----------------------------*/
goto_new_lev( lev )
  int lev;
{
  curr_lev = lev;
  curr_loc = level_loc [curr_lev];
}
  
goto_new_loc( rn )
  int rn;
{
  curr_loc = rn;
  level_loc [curr_lev] = curr_loc;
}

/*------------------------------------------------------------*/
/* Verb routines
*/

/*----------------------------*/
do_go()
{
  int direct, new_room;

  switch ( cmd.nn )
  {
    case o_north:
    case o_east:
    case o_south:
    case o_west:
      direct = cmd.nn - 1;                       /* assumes NESW = 1234 */
      new_room = room [curr_loc].link [direct];
      if (new_room)
      {
        goto_new_loc( new_room );
        print_room = 1;
      }
      else
        prints("Can't go in that direction");
      break;

    default:
/*
      if (isdigit(cmd.noun[0]))
      {
        new_room = atoi( cmd.noun );
        if ( (new_room>=0) && (new_room<MaxLocs) )
          goto_new_loc( new_room );
        else
          prints("Can't go there");
      }
      else
*/
        prints("Use a direction or the stack");
  }
}

/*----------------------------*/
do_dir()
{
  cmd.nn = cmd.vn;
  cmd.vn = 6;
  do_go();
}

/*----------------------------*/
do_inv()
{
  int flag, i, len,currx;
  char s[80];

  prints("You are carrying:");
  flag=0;
  currx=0;
  for ( i=1; i<MaxObjs; i++ )
    if ( ObjOnPlayer(i) )
    {
      (void)strcpy ( s, obj[i].name );
      if (WearingObj(i)) (void)strcat( s, " (wearing)" );
      len = strlen(s);
      if (currx+ len + 3 > 78 ) { currx=0; nl(); }
      cprintf("  %s.", s );
      currx += len+3;
      flag=1;
    }

  if (!flag)
    prints("  nothing.");
  else
    nl();
}

/*----------------------------*/
do_get()
{
  int i, get_flag;
  char s[16], *p;

  if (ObjOnPlayer(cmd.nn))
    prints("You already have it.");

  else if (cmd.nn==o_invent)      /* get everything in room */
  {
    for ( i=o_invent+1; i<MaxObjs; i++ )
      if ( ObjInRoom(i) && CanGetObj(i) )
      {
        cmd.nn=i;
        cprintf( "--> get %s", obj[i].name ); nl();
        do_get();
      }
  }

  else if (!CanGetObj(cmd.nn))      /* un-gettable object? */
  {
    if (cmd.nn==o_plant)    /* alien */
      prints("The being is rooted in the 4th dimension.");

    else if (cmd.nn==o_group)
      prints("The group has infinitely many reasons to stay where it is.");

    else if (cmd.nn==o_fluid)   /* fluid */
      prints("It's too cold!");

    else
      prints("Can't get that.");
  }

  else  /* gettable object */
  {
    get_flag = 1;

    if (cmd.nn==o_liquid)   /* 4-D liquid */
    {
      how();
      get_flag = 0;
    }

    else if (cmd.nn==o_plasma)   /* plasma */
    {
      if (!CarryingObj(o_coil) || (cc!=3))
      /* not have coil or not mag. bottle */
      {
        prints("Too hot to handle.");
        get_flag = 0;
      }
      else
        prints( "The magnetic field of the coil contained the plasma." );
    }

    else if (cmd.nn==o_improb)   /* improbability */
    {
      cprintf("What is the probability of getting this improbability? ");
      strip_nl(eofgets(s,16,stdin));
      if ((p=strchr(s,'.')) && atoi(s)==0)
	i = atoi(p + 1);
      else if (p = strchr(s,'/')) i = (i = atoi(p+1)) ? 
	atoi(s)/(float)i * 100 : atoi(s);
      else i = atoi(s);
      if (i!=sum)
      {
        prints("Wrong.");
        get_flag = 0;
      }
    }

    if (get_flag)
    {
      CarryObj( cmd.nn );
      ok();
    }
  }
}
  
/*----------------------------*/
do_drop()
{
  int i;

  if (ObjInRoom(cmd.nn))
    prints("It's already here.");

  else if (cmd.nn==o_improb && curr_loc==16)
    do_throw();

  else if (cmd.nn==o_invent)        /* drop everything */
  {
    for ( i=o_invent+1; i<MaxObjs; i++ )
      if ( ObjOnPlayer(i) )
      {
        cmd.nn=i;
        cprintf( "--> drop %s", obj[i].name ); nl();
        do_drop();
      }
  }

  else if (cmd.nn>o_invent)
  {
    if (cmd.nn==o_coil)  /* drop coil, check for plasma as well */
    {
      if (CarryingObj(o_coil) && CarryingObj(o_plasma))
        DropObj( o_plasma );
    }

    if ( ObjOnPlayer( cmd.nn ))
    {
      DropObj(cmd.nn);
      ok();
    }
  }
}

/*----------------------------*/
do_throw()
{
  if (ObjInRoom(cmd.nn))
    prints("It's already here.");

  else if (cmd.nn==o_improb && curr_loc==16)
  {
    prints("The improbability's presence warps the fabric of the field.");
    room [16].link [east] = 17 - room [16].link [east];
    print_room = 1;
    DropObj( cmd.nn );
  }
  else if (cmd.nn==o_cube)
    do_roll();

  else if (cmd.nn==o_disk)
  {
    prints
    ("With great skill (i.e. luck) you threw the disk into the next room.");
    if (curr_loc==29)
      obj [cmd.nn].loc = -7;
    else
      obj [cmd.nn].loc = room [curr_loc].link [south];
  }

  else
    do_drop();
}

/*----------------------------*/
do_break()
{
  if (cmd.nn==o_prism)
  {
    prints("The prism shatters along the lines and mysteriously");
    prints("reorganizes itself into a tetrahedron.");
    ReplaceObj( cmd.nn, o_tetra );
  }

  else if (cmd.nn==o_tetra)
    prints("It shatters, but quickly reforms itself.");

  else if (cmd.nn==o_zeta)
    do_solve();

  else if (cmd.nn==o_proj)
  {
    if (!kp)
    {
      prints
      ("With a few kicks and blows, both you and the projector felt better.");
      kp = 1;
    }
    else
      prints("Better not try that again, or you'll really break it.");
  }

  else
    prints("Violence is not necessary, most of the time.");
}

/*----------------------------*/
do_look()
{
  if (!cmd.nn)
    print_room = 1;

  else if (!CanLookObj(cmd.nn))
  {
    cprintf("Looks like %s.", obj[cmd.nn].name );  nl();
  }

  else
  switch ( cmd.nn )
  {
    case o_mirror:
      prints("You see the reflections of a mirror world.");
      break;

    case o_crt:
      prints("You see the images of a mathematical universe.");
      break;

    case o_group:
      prints("The group consists of converging parallel lines, alef-null,");
      prints("the last prime number, 1/0, and uncountably many others.");
      break;

    case o_hole:
      prints("You see the lights of an electromagnetic continuum.");
      break;

    case o_proj:
      prints("You see a wide slot and 5 buttons.");
      if (obj[o_disk].loc==-7)
        prints("A disk is in the projector.");

    case o_buttons:
      prints("The buttons are labelled zero to four.");
      break;

    case o_chaos:
      prints("It bears a slight resemblence to the current universe.");
      break;

    case o_dust:
      prints("It look like the remains of an exploded Julia set.");
      break;

    case o_flake:
      prints("It doesn't look like the coastline of Britain.");
      break;

    case o_mount:
      prints("It looks the same at all scales.");
      break;

    case o_tomb:
      prints("The epitaph reads: The Eternal Soul");
      mi = mi | 1;
      break;

    case o_stack:
      prints("It's a Space-Time Activated Continuum Key.");
      break;

    case o_audio:
      prints("Looks like 2 speakers connected by a band.");
      if (!af)
        prints("There is a groove in the band.");
      break;

    case o_book:
      prints("The title is 'Interactive Adventures'.");
      break;

    case o_bottle:
      if (obj[o_liquid].loc==-8)
        prints("It is full of some strange liquid.");
      else
        prints("It is an empty bottle with no inside or outside.");
      break;

    case o_prism:
      prints("You see flashes along deeply etched lines");
      if (curr_loc==21)
        prints("And embedded, distorted shapes resembling letters");
      break;

    case o_appa:
      prints("Looks like a device used for increasing the dimensions of");
      prints("geometric and topological objects.");
      break;

    case o_improb:
      prints("It looks like a heart of gold.");
      break;

    case o_zeta:
      prints("It's a very vicious-looking integral.");
      break;

    case o_cube:
      prints("There are changing numbers on the sides.");
      break;

    case o_coil:
      prints("The ends of the coil are connected to form a loop.");
      break;

    case o_sing:
      prints("It is shaped like a narrow band.");
      break;

    case o_disk:
      prints("The title is: The Science and Beauty of a Geometric Nature");
      break;

    case o_supp:
      prints("It's an almost obvious fact.");
      prints("It is not proven.");
      break;

    case o_hypo:
      prints("It's a complicated statement.");
      prints("It is not proven.");
      break;

    case o_lemma:
      prints("It's a rather specialized fact.");
      break;

    case o_theorem:
      prints("It begins: The metaphysical existentialism of reality ...");
      prints("The rest is incomprehensible to you.");
      break;

    case o_axiom:
      prints("It's the basis of a complex system.");
      break;

    case o_post:
      prints("It's a basic fact.");
      break;

    case o_math:
      prints("He looks almost asleep.");
      break;

    case o_tetra:
      if (curr_loc==22)
      {
        prints("Sharp letters form the message: Seeks the Exact");
        mi = mi | 2;
      }
      else
        prints("You see colorless letters.");
      break;

    case o_func:
      prints
      ("The function has many sharp points, all of which are at (1/2+bi).");
      break;

    case o_idea:
      prints("The idea is very vague and not fully developed.");
      break;

    case o_contra:
      prints
      ("It is true and false, but neither is correct, and both are right.");
      break;

    case o_warr:
      prints("It has expired.");
      break;

    default:
      cprintf("Looks like %s.", obj[cmd.nn].name );  nl();
  }
}

/*----------------------------*/
do_read()
{
  if (cmd.nn==o_book)
  {
    prints("You are now reading an adventure ...");
    goto_new_lev( 3 );
    print_room = 1;
  }
  else
    do_look();
}

/*----------------------------*/
do_use()
{
  switch ( cmd.nn )
  {
    case o_proj:
      prints("Try the buttons.");
      break;

    case o_stack:
      prints("Try push or pop the stack, or scan something with it.");
      break;

    case o_prism:
      do_look();
      break;

    case o_appa:
      prints("Try to _y_ something with it");
      break;

    case o_improb:
      if (curr_loc==16) do_throw(); else how();
      break;

    default:
      how();
      break;
  }
}

/*----------------------------*/
do_touch()
{
  cprintf( "Feels just like a %s.", cmd.noun );  nl();
}

/*----------------------------*/
do_swing()
{
  if (cmd.nn==o_coil)
    do_spin();
  else
    not_happen();
}

/*----------------------------*/
do_rub()
{
  do_touch();
}

/*----------------------------*/
do_push()
{
  int new_room;

  if (cmd.nn==o_stack)
  {
    if (curr_loc>3)
      not_happen();
    else if (gp)
      do_scan();
    else
    {
      prints("You are falling inwards ...");
      goto_new_loc( curr_loc+3 );
      print_room = 1;
    }
  }

  else if (obj[cmd.nn].loc==-7)
  {
    if (obj[o_disk].loc!=-7)
      not_happen();
    else if (!kp)
      prints("The projector begins to start, fizzes and grinds, then stops.");
    else
    {
      clrscr();
      gotoxy( 1,25 );
      prints("The lights dimmed for a while.");
      new_room = cmd.nn + 17;
      goto_new_loc( new_room );
      room [29].link [north] = curr_loc;
      print_room = 1;
      DropObj( o_proj );

      if (new_room==30)
      {
        prints("The projector ejects the disk.");
        DropObj( o_disk );
      }
    }
  }

  else
    not_happen();
}

/*----------------------------*/
do_pop()
{
  char *s;

  s = "You are falling outwards ...";

  if (gp)
    do_scan();

  else if (cmd.nn==o_pills)
    do_eat();

  else if (cmd.nn!=o_stack)
    not_poss();

  else if (InComplex( curr_loc ))
    prints("Can't transcend reality in this adventure.");

  else if (InMirrorWorld( curr_loc ))
  {
    goto_new_loc( 1 );
    print_room = 1;
    prints( s );
  }

  else if (InMathWorld( curr_loc ))
  {
    goto_new_loc( 2 );
    print_room = 1;
    prints( s );
  }

  else if (InSpectralWorld( curr_loc ))
  {
    goto_new_loc( 3 );
    print_room = 1;
    prints( s );
  }

  else
    not_happen();
}

/*----------------------------*/
do_spin()
{
  if (cmd.nn==o_coil)
  {
    if (curr_loc==18)
    {
      cc = cc | 2;
      ok();
    }
    else
      not_happen();
  }

  else
    not_happen();
}

/*----------------------------*/
do_roll()
{
  int n;

  if (cmd.nn==o_cube)
  {
    n = dr % 4;
    cprintf("You rolled a ");
    if (n<3)
      cprintf("%d.", dc[n]);
    else
      cprintf("+nnn.");
    nl();
    dr++;
  }
  else
    not_happen();
}

/*----------------------------*/
do_wear()
{
  if (WearingObj(cmd.nn))
    prints("You're already wearing it.");

  else if (cmd.nn==o_audio)
  {
    WearObj( cmd.nn );
    ok();
  }

  else
    not_poss();
}

/*----------------------------*/
do_eat()
{
  if (cmd.nn==o_plant)
    prints("Don't consume higher lifeforms.");

  else if (cmd.nn==o_pills)
  {
    prints("Gulp!  Suddenly you feel a little drowsy.");
    ep=1;
    JunkObj( cmd.nn );
  }

  else
    prints("Can't eat that.");
}

/*----------------------------*/
do_taste()
{
  switch ( cmd.nn )
  {
    case o_pills:
      prints("It tastes like a drug.");
      break;

    case o_solid:
    case o_liquid:
      prints("The taste is quite orthogonal.");
      break;

    default:
      prints("Can't taste that.");
      break;
  }
}

/*----------------------------*/
do_drink()
{
  if (cmd.nn==o_fluid)
    prints("Too cold.");

  else if (cmd.nn==o_liquid)
    prints("You're too low dimensioned to drink it.");

  else
    prints("Can't drink that.");
}

/*----------------------------*/
do_remove()
{
  if (!WearingObj(cmd.nn))
    prints("You are not wearing it.");

  else
  {
    CarryObj( cmd.nn );
    ok();
  }
}

/*----------------------------*/
do_water()
{
  if ( !ObjIsPresent(o_liquid) &&
       (!CarryingObj(o_bottle) || obj[o_liquid].loc!=-8) )
    prints("Nothing to water with.");

  else if (cmd.nn!=o_plant)
    prints("Can't water that.");

  else
  {
    prints("Dendrites appear from hyperspace and absorbed the liquid.");
    prints("The being thanks you.");
    wa = 1;
    JunkObj( o_liquid );
  }
}

/*----------------------------*/
do_fill()
{
  if (cmd.nn==o_bottle)
  {
    if (curr_loc==obj[o_liquid].loc)
    {
      obj[o_liquid].loc = -8;
      ok();
    }
    else if (curr_loc==obj[o_fluid].loc)
      prints("The fluid flows in and then flows out by itself");
  }

  else
    how();
}

/*----------------------------*/
do_pour()
{
  if (cmd.nn==o_bottle || cmd.nn==o_liquid)
  {
    if (obj[o_liquid].loc!=-8)
      prints("Nothing to pour.");

    else if (curr_loc==obj[o_plant].loc)
    {
      cmd.nn=o_plant;
      do_water();
    }

    else
    {
      DropObj( o_liquid );
      ok();
    }
  }

  else
    not_work();
}

/*----------------------------*/
do_freeze()
{
  if (curr_loc!=obj[o_fluid].loc)
    not_yet();

  else if (cmd.nn==o_coil)
  {
    cc = cc | 1;
    ok();
  }

  else
    prints("You might damage it.");

}

/*----------------------------*/
do_melt()
{
  if (!ObjIsPresent(o_plasma))
    not_yet();

  else if (cmd.nn==o_solid)
  {
    prints
    ("The plasma dissipates as the solid melts into a puddle of liquid.");
    JunkObj( o_plasma );
    JunkObj( o_solid );
    DropObj( o_liquid );
    if (curr_loc==obj[o_plant].loc)
    {
      cmd.nn=o_plant;
      do_water();
    }
  }

  else if (cmd.nn==o_tetra)
    prints("It melts, but quickly recrystalizes.");

  else
    not_work();
}

/*----------------------------*/
do_play()
{
  if (cmd.nn==o_cube)
    do_roll();

  else if (cmd.nn==o_disk)
    prints("You need something to play it.");

  else if (cmd.nn==o_proj)
    do_use();

  else
    not_happen();
}

/*----------------------------*/
do_insert()
{
  v_word noun;
  int nn;

  if (cmd.nn==o_sing)
  {
    nn = InputNoun( "Where? ", noun );
    if ( (!strcmp(noun,"groo") || !strcmp(noun,"band") || nn==o_audio)
         && ObjIsPresent(o_audio) )
    {
      af = 1;
      JunkObj( cmd.nn );
      prints("The singularity slides in with a click.");
    }
    else
      not_work();
  }

  else if (cmd.nn==o_disk)
  {
    nn = InputNoun( "Where? ", noun );
    if ( (!strcmp(noun,"slot") || nn==o_proj) && ObjIsPresent(o_proj) )
    {
      obj[cmd.nn].loc = -7;
      ok();
    }
    else
      not_work();
  }

  else
    not_work();
}

/*----------------------------*/
do_fix()
{
  if (cmd.nn==o_proj)
    prints("You don't know how to properly fix such a delicate instrument.");

  else
    prints("You don't know how.");
}

/*----------------------------*/
do__y_()
{
  if (!ObjIsPresent(o_appa))
    PrintMess( 7 );

  else switch ( cmd.nn )
  {
    case o_cube:
      if (dr<3)
        prints("You shouldn't do that yet.");
      else
      {
        prints("The hexahedron expands one dimension.");
        ReplaceObj( cmd.nn, o_solid );
      }
      break;

    case o_tetra:
      prints("It expands a dimension, but quickly collapses back.");
      break;

    case o_strip:
      prints("The moebius strip expands one dimension.");
      ReplaceObj( cmd.nn, o_bottle );
      break;

    case o_prism:
      prints("Object too unstable.");
      break;

    case o_bottle:
    case o_solid:
    case o_liquid:
      prints("Can't go any higher in this universe.");
      break;

    case o_appa:
      prints("Sorry, can't upgrade a product this way.");
      break;

    case o_plant:
      prints("The being is already high enough.");
      break;

    default:
      not_happen();
  }
}

/*----------------------------*/
do_prove()
{
  v_word noun;
  char *msg1;
  int nn;

  msg1 = "Somehow a contradiction keeps coming into the proof.";

  switch ( cmd.nn )
  {
    case o_lemma:
    case o_theorem:
    case o_axiom:
    case o_post:
      prints("It's already proven.");
      break;

    case o_supp:
      nn = InputNoun( "With what? ", noun );
      if (nn==o_post && ObjIsPresent(o_post))
      {
        if (ObjIsPresent(o_contra))
          prints( msg1 );
        else
        {
          prints("The postulate is now a lemma.");
          ReplaceObj( cmd.nn, o_lemma );
        }
      }
      else
        not_work();
      break;

    case o_hypo:
      nn = InputNoun( "With what? ", noun );
      if (nn==o_lemma && ObjIsPresent(o_lemma) && ObjIsPresent(o_axiom))
      {
        if (ObjIsPresent(o_contra))
          prints( msg1 );
        else
        {
          prints("The hypothesis is now a theorem.");
          ReplaceObj( cmd.nn, o_theorem );
          prints("Suddelnly, a hyper-spatial cliff passes by");
          prints("and the lemma leaps to its demise.");
          JunkObj( o_lemma );
        }
      }
      else
        prints("Hmmm, something seems to be missing from the proof.");
      break;

    case o_idea:
      prints("The idea developed into a contradiction.");
      ReplaceObj( cmd.nn, 52 );
      break;

    case o_contra:
      prints("You proved that the contradiction can't be proven.");
      break;

    default:
      not_poss();
  }
}

/*----------------------------*/
do_smell()
{
  prints("You smell nothing unusual.");
}

/*----------------------------*/
do_close()
{
  not_poss();
}

/*----------------------------*/
do_open()
{
  not_poss();
}

/*----------------------------*/
do_stop()
{
  if (!strcmp(cmd.sh_noun,"slee") || !strcmp(cmd.sh_noun,"drea"))
    do_wake();

  else if (!strcmp(cmd.sh_noun,"read"))
  {
    if (InBookWorld( curr_loc ))
    {
      goto_new_lev( 1 );
      print_room = 1;
      ok();
    }
    else
      prints("Reality is like a book that you can't stop reading.");
  }
  else
    not_work();
}

/*----------------------------*/
do_say()
{
  cprintf( "'%s'", cmd.noun ); nl();
  if (gp==0)
    not_happen();

  else
  {
    if (strcmp( cmd.noun,"tesseract" ))
      zap = 2; /* wrong password */
    else
      zap = 3; /* right password */
  }
}

/*----------------------------*/
do_quit()
{
  do_score();
  zap = 1;
}

/*----------------------------*/
do_help()
{
  if (cmd.nn>0)
    how();

  else if (curr_lev==2)
    prints("Use 'wake' to wake up from your dream.");

  else if (curr_lev==3)
    prints("Use 'stop reading' to stop reading the adventure.");

  else
    prints("Sorry, quasi-hyper-neo-mathematics is beyond me.");
}

/*----------------------------*/
do_listen()
{
  char *msg;

  msg = "Of Countless Tesseracts";

  if (curr_loc==19)
    prints("Sounds like radio waves from the Creation.");

  else if (curr_loc!=obj[o_plant].loc)
    prints("You hear nothing special.");

  else if (wa==0)
    prints("The being is whispering too softly.");

  else if (!WearingObj(o_audio))
    prints("You hear a harmonic song in a strange language.");

  else if (!af)
  {
    cprintf("You hear an %d00-voiced fugue in a complex 1/f melody.", sum);
    nl();
    prints("But you are unable to follow even a single voice.");
  }

  else
  {
    cprintf("You hear the words: %s.", msg );  nl();
    mi = mi | 8;
  }
}

/*----------------------------*/
do_save()
{
  int i;
  FILE *f;
  char s[80];

  cprintf("Filename to save game to: ");
  (void)eofgets(s,80,stdin);
  if (s[0] == '\n') return;
  else strip_nl(s);

  f=fopen(s,"w");
  if (f)
  {
    for ( i=1; i<MaxObjs; i++ )
      (void)fprintf( f, "%d ", obj[i].loc );

    (void)fprintf( f, "%d %d %d %d %d %d ",
      curr_lev, curr_loc,
      level_loc[1], level_loc[2], level_loc[3], sleep_lev );

    (void)fprintf( f, "%d %d %d %d %d %d %d %d %d %d %d %d ",
      cc, wa, ep, dr, af, gp, mi, ti, kp, dc[0], dc[1], dc[2] );

    putc( '\n', f );
    if (fclose(f)) perror("Error saving game: ");
    else prints("Game saved.");
  }
  else
  {
    cprintf("Unable to save game to %s", s); nl();
  }
}

/*----------------------------*/
do_load()
{
  int i;
  FILE *f;
  char s[80];

  cprintf("Filename to load game from: ");
  (void)eofgets(s,80,stdin);
  if (s[0] == '\n') return;
  else strip_nl(s);

  f=fopen(s,"r");
  if (f)
  {
    for ( i=1; i<MaxObjs; i++ )
      if(fscanf( f, "%d ", &obj[i].loc ) != 1) goto erred;

    if(fscanf( f, "%d %d %d %d %d %d ",
      &curr_lev, &curr_loc,
      &level_loc[1],&level_loc[2],&level_loc[3],&sleep_lev)!=6) goto erred;

    if(fscanf( f, "%d %d %d %d %d %d %d %d %d %d %d %d ",
      &cc, &wa, &ep, &dr, &af, &gp, &mi, &ti, &kp, &dc[0], &dc[1], &dc[2] )
       != 12) goto erred;

    for ( sum=0, i=0; i<3; i++ )
      sum += dc[i];

    if (fclose(f)) perror("Error closing save file: ");
    else prints("Game loaded.");
    print_room = 1;
  }
  else
  {
    cprintf("Unable to load game from %s", s); nl();
  }
 return;
 erred:
  prints("load: save file of inconsistent format");
  exit(1);
}

/*----------------------------*/
do_score()
{
  cprintf("You scored %d out of 15.", mi );  nl();
}

/*----------------------------*/
do_sleep()
{
  if (InDreamWorld( curr_loc ))
  {
    prints("A dream within a dream would have been quite poetic,");
    prints("But time did not allow for it.");
  }

  else if (ep==0)
    prints("You're not sleepy yet.");

  else
  {
    prints("As you sleep, you begin to have a strange dream ...");
    sleep_lev = curr_lev;
    goto_new_lev( 2 );
    print_room = 1;
  }
}

/*----------------------------*/
do_wake()
{
  if (cmd.nn!=o_math && cmd.nn>0)
    not_work();

  else if (!InDreamWorld( curr_loc ))
    prints("Reality is not a fragment of nightmares and dreams.");

  else if (cmd.nn!=o_math)
  {
    prints("Wow, that was some dream.");
    goto_new_lev( sleep_lev );
    print_room = 1;
  }

  else
  {
    if (!ObjInRoom(o_theorem))
      prints
      ("He mumbles: bother me not, I'm contemplating the ultimate question");
    else
    {
      prints("He wakes up, looks at the theorem, an shouts:");
      prints("Eureka!  This proves that the universe doesn't exis...");
      goto_new_loc( 35 );
      print_room = 1;
      mi = mi | 4;
    }
  }
}

/*----------------------------*/
do_give()
{
  int nn;
  v_word noun;

  nn = InputNoun( "To whom? ", noun );
  if (!nn)
    not_work();

  else if (!ObjIsPresent(nn))
    not_yet();

  else if (nn==o_math)
  {
    if (cmd.nn==o_theorem)
    {
      DropObj( cmd.nn );
      cmd.nn=o_math;
      do_wake();
    }
    else
      prints("He mumbles: disturb me not with such unimportant things.");
  }

  else if (nn==o_plant)
  {
    if (cmd.nn==o_liquid)
      how();
    else if (cmd.nn==o_solid)
      prints("Plants don't eat solid nutrients.");
    else
      prints("The being doesn't need that.");
  }

  else
    not_work();
}

/*----------------------------*/
int stack_say( s )
  char *s;
{
  cprintf("Stack: ");
  if (*s) prints( s );
  return( 1 );
}

do_scan()
{
  char *s;
  int flag;

  s = "stack potential non-zero, pushing allowed.";
  flag = 0;

  if (!ObjOnPlayer(o_stack))
    PrintMess( 7 );

  else if (gp)
  {
    prints("Something has rendered the stack inoperative.");
    return;
  }

  else if (cmd.nn==0)
  {
    if (InMirrorWorld( curr_loc ) || InMathWorld( curr_loc ) ||
        InSpectralWorld( curr_loc ))
      flag = stack_say("stack level non-zero, popping allowed.");

    if (curr_loc<=3)
      flag = stack_say( s );

    if (curr_loc==18)
      flag = stack_say("magnetic field present.");

    if (curr_loc==obj[o_plant].loc)
      flag = stack_say("sonic harmony present.");

    if (!flag)
      (void)stack_say("nothing special to report.");
  }

  else
  {
    (void)stack_say( "" );
    switch ( cmd.nn )
    {
      case o_mirror:
      case o_crt:
      case o_hole:
        prints( s );
        break;

      case o_plant:
        cprintf("4-D.  ");
        if (!wa)
          prints("dehydrated.  weak audio output.");
        else
          prints("healthy.  strong audio output.");
        break;

      case o_stack:
        prints("Stack operational.");
        break;

      case o_audio:
        if (!af)
          prints("no filter.");
        else
          prints("filter active.");
        break;

      case o_pills:
        prints("edible.  barbiturate.");
        break;

      case o_fluid:
        prints("extremely cold.  superconductive.  superfluid.");
        break;

      case o_prism:
        prints("brittle.  light sensitive.");
        break;

      case o_coil:
        prints("composition = yttrium, barium, copper, oxygen.");
        if (cc)
        {
          cprintf("Stack: properties = ");
          if (cc & 1) cprintf("superconductive.  ");
          if (cc & 2) cprintf("magnetic.  ");
          if ((cc & 3)==3) cprintf("strong magnetic field present.");
          nl();
        }
        break;

      case o_plasma:
        prints("extremely hot.");
        break;

      case o_solid:
        prints("4-D.  solid.");
        break;

      case o_liquid:
        prints("4-D.  liquid.");
        break;

      case o_tetra:
        prints("color sensitive.  omni-stable.");
        break;

      default:
        prints("nothing special to report.");
        break;

    } /* switch */
  } /* else */
}

/*----------------------------*/
do_solve()
{
  int nn;
  v_word noun;

  if (cmd.nn==o_zeta)
  {
    nn = InputNoun("With what? ", noun );
    if (!nn)
      not_work();

    else if (!ObjIsPresent(nn))
      not_yet();

    else if (nn!=o_func)
      prints
      ("Not difficult, although for someone like you it's too still hard.");

    else
    {
      prints("The function and the integral cancel out nicely");
      prints("and everything is reduced to a singularity.");
      ReplaceObj( cmd.nn, o_sing );
      JunkObj( o_func );
    }
  }

  else if (cmd.nn==o_func)
    prints("You are not really into great episodes of frustration.");

  else if (cmd.nn==o_improb)
    prints("It's improbable that you can solve it.");

  else
    not_work();
}

/*----------------------------*/
do_think()
{
  if (!InDreamWorld(curr_loc))
    prints("Therefore you are.");

  else if (curr_loc!=25)
    prints("This is not a good place to think.");

  else if (!ti)
  {
    prints("You thought of an idea.");
    CarryObj( o_idea );
    ti = 1;
  }

  else
    prints("You are out of ideas.");
}

/*----------------------------*/
do_burn()
{
  if (!ObjIsPresent(o_plasma))
    not_yet();

  else
    prints("Don't be a pyromaniac.");
}

/*----------------------------*/
do_evap()
{
  if (!ObjIsPresent(o_plasma))
    not_yet();

  else if (cmd.nn==o_fluid)
  {
    prints("The fluid evaporates.");
    JunkObj( cmd.nn );
  }

  else
    do_burn();
}

/*----------------------------*/
do_climb()
{
  if (cmd.nn==o_plant)
    prints("That isn't very polite, and besides, it's not a beanstalk.");

  else if (cmd.nn==o_mount)
    prints("There are no rivers on the mountain.");

  else
    not_poss();
}

/*----------------------------*/
do_cut()
{
  switch( cmd.nn )
  {
    case o_prism:
      prints("It's already pre-cut.");
      break;

    case o_tetra:
      prints("It is easily cut, but the cuts immediately reseal themselves.");
      break;

    case o_strip:
      prints("With some tricky cuts, you end up with a mobius strip again.");
      break;

    case o_bottle:
      prints("The bottle breaks into a mobius strip.");
      ReplaceObj( cmd.nn, o_strip );
      if (obj[o_liquid].loc==-8)
      {
        prints("The liquid in the bottle falls to the ground.");
        DropObj( o_liquid );
        if (curr_loc==obj[o_plant].loc)
        {
          cmd.nn=o_plant;
          do_water();
        }
      }
      break;

    case o_plant:
    case o_solid:
    case o_liquid:
      prints("Such low dimension cuts has no effect.");
      break;

    default:
      not_work();
  }
}

/*----------------------------*/
do_join()
{
  if (cmd.nn==o_group)
    prints("You're too finite.");
  else
    not_poss();
}

/*----------------------------*/
do_sing()
{
  if (curr_loc==obj[o_plant].loc)
    prints("Your singing can't possible compete with the hyper-melody.");

  else
    not_happen();
}

/*----------------------------*/
/*
*/
DoCommand()
{
  if (cmd.vn<=6
      || (cmd.vn>=39 && cmd.vn<=48) || cmd.vn==50 || cmd.vn==52
      || cmd.vn==58 )
    goto branch; /* single verbs */

  if (obj[cmd.nn].loc==-9)
  {
    prints("Be more specific in naming the object");
    return;
  }

  if (!ObjIsPresent(cmd.nn))
  {
    prints("That object is not here.");
    return;
  }

branch:
  switch ( cmd.vn )
  {
    case 1:
    case 2:
    case 3:
    case 4: do_dir(); break;
    case 5: do_inv(); break;
    case 6: do_go(); break;
    case 7: do_get(); break;
    case 8: do_drop(); break;
    case 9: do_throw(); break;
    case 10: do_break(); break;
    case 11: do_look(); break;
    case 12: do_read(); break;
    case 13: do_use(); break;
    case 14: do_touch(); break;
    case 15: do_swing(); break;
    case 16: do_rub(); break;
    case 17: do_push(); break;
    case 18: do_pop(); break;
    case 19: do_spin(); break;
    case 20: do_roll(); break;
    case 21: do_wear(); break;
    case 22: do_eat(); break;
    case 23: do_taste(); break;
    case 24: do_drink(); break;
    case 25: do_remove(); break;
    case 26: do_water(); break;
    case 27: do_fill(); break;
    case 28: do_pour(); break;
    case 29: do_freeze(); break;
    case 30: do_melt(); break;
    case 31: do_play(); break;
    case 32: do_insert(); break;
    case 33: do__y_(); break;
    case 34: do_prove(); break;
    case 35: do_fix(); break;
    case 36: do_smell(); break;
    case 37: do_close(); break;
    case 38: do_open();break;
    case 39: do_stop(); break;
    case 40: do_say(); break;
    case 41: do_quit(); break;
    case 42: do_help(); break;
    case 43: do_listen(); break;
    case 44: do_save(); break;
    case 45: do_load(); break;
    case 46: do_score(); break;
    case 47: do_sleep(); break;
    case 48: do_wake(); break;
    case 49: do_give(); break;
    case 50: do_scan(); break;
    case 51: do_solve(); break;
    case 52: do_think(); break;
    case 53: do_burn(); break;
    case 54: do_evap(); break;
    case 55: do_climb(); break;
    case 56: do_cut(); break;
    case 57: do_join(); break;
    case 58: do_sing(); break;
    default: cprintf( "I don't know how to %s.", cmd.verb );  nl();
  }
}

/*----------------------------*/
Ending( n )
  int n;
{
  switch ( n )
  {
    case 1:
      prints("Game Over");
      break;

    case 2:
      prints("Incorrect password.");
      prints("Self-destruct aborted.  Resuming Doomsday countdown.");
      prints("5\n4\n3\n2\n1\n\nEarth destro...");
      break;

    case 3:
      prints("Correct password.");
      prints
      ("Self-destruct sequence completed.  Overriding Doomsday countdown.");
      prints("5\n4\n3\n2\n1\n\nKaboom...");

      if (!ObjIsPresent(24))
      {
        prints("The Doomsday complex is destroyed.\n");
        prints("You have given your life to save Earth.  Thank you.");
      }
      else
      {
        prints(
        "As the complex disintegrates around you, the stack, sensing your");
        prints(
        "danger, overloads all it's circuits to regain a moment's control.");
        prints(
        "With a final burst of energy, the stack implodes, projecting a");
        prints(
        "stasis field around you that protects you from the destruction.");
        prints(
        "...");
        prints(
     "From the smoldering debris of the Doomsday complex you pick up the");
        prints(
        "pieces of the stack and reflect on how as you risked your life to");
        prints(
     "save Earth, the stack has given its own to save yours.  As you walk");
        prints(
        "away, you solemnly swear to repair the stack, for the adventures");
        prints(
        "that lie ahead."
        );
      }
      break;
  }
}

/*----------------------------*/
/*
*/
intro1()
{
  prints(
"               /*--------------/*      ------------------------------------");
  prints(
"             /  '            /  '           Beyond The Tesseract   V2.0p");
  prints(
"           /   '|          /   '|      ------------------------------------");
  prints(
"        */----'---------*/    ' |          An abstract text adventure by");
  prints(
"       '|    '  |      '|    '  |            David Lo   4516 Albert St.");
  prints(
"      ' |   '   |     ' |   '   |                       Burnaby, B.C.");
  prints(
"     '  |  '   /*----'--|--'---/*                       V5C 2G5   Canada");
  prints(
"    '   | '  /  '   '   | '  /  '        email c/o: viola@idacom.cs.ubc.ca");
  prints(
"   '    |' /   '   '    |' /   '       ------------------------------------");
  prints(
"  '    /*/----'---'----/*/    '         This is FreeShareAnythingWare.");
  prints(
" '   /  '    '   '   /  '    '          If you like this program, hate it,");
  prints(
"'  /   '|   '   '  /   '|   '           or really don't care at all, then");
  prints(
"*/----'----'----*/    ' |  '            I would be happy to hear from you");
  prints(
"|    '  | '     |    '  | '             (a letter, a post-it note, etc).");
  prints(
"|   '   |'      |   '   |'");
  prints(
"|  '   /*-------|--'---/*               Please share unmodified copies of");
  prints(
"| '  /          | '  /                  this adventure with everyone.");
  prints(
"|' /            |' /                   ------------------------------------");
  prints(
"*/--------------*/                            'Set the software free'");
  prints("");
}

intro()
{
  int ch;

  clrscr();
  intro1();
  do {
    prints("Scenario and instructions? ");
    (void)eofgets(cmd.cm,max_cmd_size,stdin);
    if ((ch=intlwr(cmd.cm[0]))=='n' || ch == '\n') return;
  } while (ch != 'y');
  clrscr();

  prints("Scenario:");
  prints(
"  You have reached the final part of your mission.  You have gained access");
  prints(
"  to the complex, and all but the last procedure has been performed.  Now");
  prints(
"  comes a time of waiting, in which you must search for the hidden 12-word");
  prints(
"  message that will aid you at the final step.  But what choice will you");
  prints(
"  make when that time comes?");

  prints("");
  prints("Instructions:");
  prints(
"  This adventure recognizes the standard commands for moving (N,E,S,W),");
  prints(
"  taking inventory (I), maninpulating objects (GET, DROP, LOOK), and");
  prints(
"  saving games (SAVE, LOAD), as well as many others. Use 2-word 'verb noun'");
  prints(
"  commands, such as 'use stack' or 'get all'.  Only the first four letters");
  prints(
"  of each word are significant.  The adventure recognizes about 200 words,");
  prints(
"  so if one word doesn't work, try another.");

  prints("");
  prints("Happy adventuring!");
  prints("");

  prints("Press <Enter> to begin");
  (void)eofgets(cmd.cm,max_cmd_size,stdin);
  clrscr();
}

/*------------------------------------------------------------*/
main(argc,argv)
int argc;
char *argv[];

{
  int l, fast = 0, keep_playing;

  for (l=1; l < argc; l++) {
    if(fast=(strcmp(argv[l],"-f")==0)) break;
  }
  if ((argc == 2 && !fast) || argc > 2)
    prints("Only -f for fast start-up is allowed.  Unknown options ignored.\n");
  if (!fast) intro();

  do
  {
    InitAdv();
    clrscr(); gotoxy( 1,25 );

    do
    {
      gp = InComplex(curr_loc) && (mi==15);

#ifdef tty
      if (print_room)
      {
        PrintCurrRoom();
        print_room=0;
      }
#endif

      if (gp)
        prints("A voice echoes: audio link complete.  Enter password.");

#ifndef tty
      PrintCurrRoom();
#endif

      if (InDreamWorld( curr_loc ))
        (void)printf("(sleeping) ");
      else if (InBookWorld( curr_loc ))
        (void)printf("(reading) ");

      cprintf("Enter command: ");
      strip_nl(eofgets(cmd.cm,max_cmd_size,stdin));
      if (cmd.cm[0])
      {
        AnalyseCommand( &cmd );
        DoCommand();
        nl();
      }
    }
    while ( !zap );

    Ending( zap );
    nl();
    cprintf("Play again (y/n)? ");
    (void)eofgets(cmd.cm,max_cmd_size,stdin);
    keep_playing = (intlwr(cmd.cm[0])!='n');
    nl();
  }
  while ( keep_playing );
  clrscr();
}