-+-+-+-+-+-+-+-+ START OF PART 23 -+-+-+-+-+-+-+-+
X    return(1);
X  else
X    return(0);
X`7D
X
X/* Another useful function courtesy of Ralph Waters.  */
X#include <jpidef.h>
X
X/* Stores the user's login name in the argument buf.  */
Xvoid user_name(buf)
Xchar *buf;
X`7B
X  /* sys$getjpiw ( `5Befn`5D, `5Bpidadr`5D, `5Bprcnam`5D, itmlst `5B,iosb`5D
X                   `5B,astadr`5D `5B,astprm`5D`09`09`09`09`09*/
X
X  long int return_length;
X  struct getjpi_itmlst_type `7B
X    unsigned short int buffer_length;`09/* length of return buffer */
X    unsigned short int item_code;`09`09/* item code to getjpi about */
X    unsigned long int buffer_address;`09/* address of return data */
X    unsigned long int return_length_addr; `7D`09/*actual size of return data
V */
X  getjpi_itmlst;
X
X  getjpi_itmlst.buffer_length = 12;`09/* VMS usernames are 12 chars */
X  getjpi_itmlst.item_code = JPI$_USERNAME;
X  getjpi_itmlst.buffer_address = buf;
X  getjpi_itmlst.return_length_addr = &return_length;
X
X  sys$getjpiw (0, 0, 0, &getjpi_itmlst, 0, 0, 0);
X
X  return;
X`7D
X
X/* After calling this, vms_getch() returns unbuffered single chars.  */
Xvoid vms_crmode()`09/* Character-Return MODE */
X`7B
X`09if(kb_chan == 0)
X`09`09opengetch();
X
X`09crmode_status = TRUE;
X`7D
X
X/* After calling this, vms_getch() returns echoed, buffered characters.  */
Xvoid vms_nocrmode()`09/* NO Character-Return MODE */
X`7B
X`09if(kb_chan != 0)
X`09`09closegetch();
X
X`09crmode_status = FALSE;
X`7D
X
X/* Sets up terminal for getch() calls, returns VMS status code.  */
Xint opengetch()`09/* does the actual assignment work */
X`7B
X`09/* assign channel on keyboard */
X`09return(sys$assign(&chan,&kb_chan,0,0));
X`7D
X
X/* Undoes affects of above, returns VMS status code for the operation.  */
Xint closegetch()`09/* performs the actual deassignment work */
X`7B
X`09int rv;
X
X`09if(kb_chan != 0) `7B
X`09`09/* deassign keyboard channel */
X`09`09rv = sys$dassgn(kb_chan);
X`09`09kb_chan = 0;
X`09`09return(rv);
X`09`7D
X`7D
X
X/* Returns an `5Boptionally`5D unbuffered `5Bnon-`5Dechoed input character.
X
X   If crmode_status is not set, then the code returns one character from
X   the buffered input.
X   If crmode_status is set, then the code returns an `60ungot' character if
X   one exists, otherwise it tries to read one unbuffered character from the
X   keyboard.  If echo_status is set, then the character will be echoed
X   before returning.  */
Xchar vms_getch()
X`7B
X`09int rv;
X`09char kb_buf;`09`09`09`09/* buffer for input char */
X
X`09if(crmode_status) `7B
X
X`09`09if(!charwaiting) `7B
X
X`09`09`09/* open channel if it hasn't been done already */
X`09`09`09if (kb_chan == 0)
X`09`09`09`09opengetch();
X
X`09`09`09/* que an i/o request for a character and wait */
X`09`09`09rv = sys$qiow(0,kb_chan,FUNC,0,0,0,&kb_buf,1,0,0,0,0);
X
X`09`09`09/* indicate if something is amiss */
X`09`09`09if(rv != SS$_NORMAL) `7B
X`09`09`09`09printf("?");
X`09`09`09`09exit(rv);
X`09`09`09`7D
X
X`09`09`7D else `7B /* charwaiting */
X
X`09`09`09kb_buf = ungotch;
X`09`09`09charwaiting = FALSE;
X`09`09`7D
X
X`09`09/* massage for getchar() compatibility */
X`09`09if (kb_buf == '\r') kb_buf='\n';
X
X`09`09/* echo char if we're supposed to */
X`09`09if (echo_status) putchar(kb_buf);
X
X`09`09return(kb_buf);
X
X`09`7D else`09/* nocrmode */
X
X`09`09return(getchar());
X
X`7D
$ CALL UNPACK GETCH.C;1 392130990
$ create 'f'
X/* source/help.c: identify a symbol
X
X   Copyright (c) 1989-92 James E. Wilson, Robert A. Koeneke
X
X   This software may be copied and distributed for educational, research, an
Vd
X   not for profit purposes provided that this copyright and statement are
X   included in all such copies. */
X
X#include "config.h"
X#include "constant.h"
X#include "types.h"
X#include "externs.h"
X
X
Xvoid ident_char()
X`7B
X  char command, query;
X  register int i, n;
X
X  if (get_com("Enter character to be identified :", &command))
X    switch(command)
X      `7B
X`09/* every printing ASCII character is listed here, in the order in which
X`09   they appear in the ASCII character set */
X      case ' ': prt("  - An open pit.", 0, 0); break;
X      case '!': prt("! - A potion.", 0, 0); break;
X      case '"': prt("\" - An amulet, periapt, or necklace.", 0, 0); break;
X      case '#': prt("# - A stone wall.", 0, 0); break;
X      case '$': prt("$ - Treasure.", 0, 0); break;
X      case '%':
X`09if (highlight_seams == TRUE)
X`09  prt("% - A magma or quartz vein.", 0, 0);
X`09else
X`09  prt("% - Not used.", 0, 0);
X`09break;
X      case '&': prt("& - Treasure chest.", 0, 0); break;
X      case '\'': prt("' - An open door.", 0, 0); break;
X      case '(': prt("( - Soft armor.", 0, 0); break;
X      case ')': prt(") - A shield.", 0, 0); break;
X      case '*': prt("* - Gems.", 0, 0); break;
X      case '+': prt("+ - A closed door.", 0, 0); break;
X      case ',': prt(", - Food or mushroom patch.", 0, 0); break;
X      case '-': prt("- - A wand", 0, 0); break;
X      case '.': prt(". - Floor.", 0, 0); break;
X      case '/': prt("/ - A pole weapon.", 0, 0); break;
X`09/* case '0': prt("0 - Not used.", 0, 0); break; */
X      case '1': prt("1 - Entrance to General Store.", 0, 0); break;
X      case '2': prt("2 - Entrance to Armory.", 0, 0); break;
X      case '3': prt("3 - Entrance to Weaponsmith.", 0, 0); break;
X      case '4': prt("4 - Entrance to Temple.", 0, 0); break;
X      case '5': prt("5 - Entrance to Alchemy shop.", 0, 0); break;
X      case '6': prt("6 - Entrance to Magic-Users store.", 0, 0); break;
X`09/* case '7': prt("7 - Not used.", 0, 0); break; */
X`09/* case '8': prt("8 - Not used.", 0, 0); break; */
X`09/* case '9': prt("9 - Not used.", 0, 0);  break;*/
X      case ':': prt(": - Rubble.", 0, 0); break;
X      case ';': prt("; - A loose rock.", 0, 0); break;
X      case '<': prt("< - An up staircase.", 0, 0); break;
X      case '=': prt("= - A ring.", 0, 0); break;
X      case '>': prt("> - A down staircase.", 0, 0); break;
X      case '?': prt("? - A scroll.", 0, 0); break;
X      case '@': prt(py.misc.name, 0, 0); break;
X      case 'A': prt("A - Giant Ant Lion.", 0, 0); break;
X      case 'B': prt("B - The Balrog.", 0, 0); break;
X      case 'C': prt("C - Gelatinous Cube.", 0, 0); break;
X      case 'D': prt("D - An Ancient Dragon (Beware).", 0, 0); break;
X      case 'E': prt("E - Elemental.", 0, 0); break;
X      case 'F': prt("F - Giant Fly.", 0, 0); break;
X      case 'G': prt("G - Ghost.", 0, 0); break;
X      case 'H': prt("H - Hobgoblin.", 0, 0); break;
X`09/* case 'I': prt("I - Invisible Stalker.", 0, 0); break; */
X      case 'J': prt("J - Jelly.", 0, 0); break;
X      case 'K': prt("K - Killer Beetle.", 0, 0); break;
X      case 'L': prt("L - Lich.", 0, 0); break;
X      case 'M': prt("M - Mummy.", 0, 0); break;
X`09/* case 'N': prt("N - Not used.", 0, 0); break; */
X      case 'O': prt("O - Ooze.", 0, 0); break;
X      case 'P': prt("P - Giant humanoid.", 0, 0); break;
X      case 'Q': prt("Q - Quylthulg (Pulsing Flesh Mound).", 0, 0); break;
X      case 'R': prt("R - Reptile.", 0, 0); break;
X      case 'S': prt("S - Giant Scorpion.", 0, 0); break;
X      case 'T': prt("T - Troll.", 0, 0); break;
X      case 'U': prt("U - Umber Hulk.", 0, 0); break;
X      case 'V': prt("V - Vampire.", 0, 0); break;
X      case 'W': prt("W - Wight or Wraith.", 0, 0); break;
X      case 'X': prt("X - Xorn.", 0, 0); break;
X      case 'Y': prt("Y - Yeti.", 0, 0); break;
X`09/* case 'Z': prt("Z - Not used.", 0, 0); break; */
X      case '`5B': prt("`5B - Hard armor.", 0, 0); break;
X      case '\\': prt("\\ - A hafted weapon.", 0, 0); break;
X      case '`5D': prt("`5D - Misc. armor.", 0, 0); break;
X      case '`5E': prt("`5E - A trap.", 0, 0); break;
X      case '_': prt("_ - A staff.", 0, 0); break;
X`09/* case '`60': prt("`60 - Not used.", 0, 0); break; */
X      case 'a': prt("a - Giant Ant.", 0, 0); break;
X      case 'b': prt("b - Giant Bat.", 0, 0); break;
X      case 'c': prt("c - Giant Centipede.", 0, 0); break;
X      case 'd': prt("d - Dragon.", 0, 0); break;
X      case 'e': prt("e - Floating Eye.", 0, 0); break;
X      case 'f': prt("f - Giant Frog.", 0, 0); break;
X      case 'g': prt("g - Golem.", 0, 0); break;
X      case 'h': prt("h - Harpy.", 0, 0); break;
X      case 'i': prt("i - Icky Thing.", 0, 0); break;
X      case 'j': prt("j - Jackal.", 0, 0); break;
X      case 'k': prt("k - Kobold.", 0, 0); break;
X      case 'l': prt("l - Giant Louse.", 0, 0); break;
X      case 'm': prt("m - Mold.", 0, 0); break;
X      case 'n': prt("n - Naga.", 0, 0); break;
X      case 'o': prt("o - Orc or Ogre.", 0, 0); break;
X      case 'p': prt("p - Person (Humanoid).", 0, 0); break;
X      case 'q': prt("q - Quasit.", 0, 0); break;
X      case 'r': prt("r - Rodent.", 0, 0); break;
X      case 's': prt("s - Skeleton.", 0, 0); break;
X      case 't': prt("t - Giant Tick.", 0, 0); break;
X`09/* case 'u': prt("u - Not used.", 0, 0); break; */
X`09/* case 'v': prt("v - Not used.", 0, 0); break; */
X      case 'w': prt("w - Worm or Worm Mass.", 0, 0); break;
X`09/* case 'x': prt("x - Not used.", 0, 0); break; */
X      case 'y': prt("y - Yeek.", 0, 0); break;
X      case 'z': prt("z - Zombie.", 0, 0); break;
X      case '`7B': prt("`7B - Arrow, bolt, or bullet.", 0, 0); break;
X      case '`7C': prt("`7C - A sword or dagger.", 0, 0); break;
X      case '`7D': prt("`7D - Bow, crossbow, or sling.", 0, 0); break;
X      case '`7E': prt("`7E - Miscellaneous item.", 0, 0); break;
X      default:`09prt("Not Used.", 0, 0); break;
X      `7D
X
X  /* Allow access to monster memory. -CJS- */
X  n = 0;
X  for (i = MAX_CREATURES-1; i >= 0; i--)
X    if ((c_list`5Bi`5D.cchar == command) && bool_roff_recall (i))
X      `7B
X`09if (n == 0)
X`09  `7B
X`09    put_buffer ("You recall those details? `5By/n`5D", 0, 40);
X`09    query = inkey();
X`09    if (query != 'y' && query != 'Y')
X`09      break;
X`09    erase_line (0, 40);
X`09    save_screen ();
X`09  `7D
X`09n++;
X`09query = roff_recall (i);
X`09restore_screen ();
X`09if (query == ESCAPE)
X`09  break;
X      `7D
X`7D
$ CALL UNPACK HELP.C;1 1296462304
$ create 'f'
X    Moria operating hours are:
X    `7C    AM     `7C    PM     `7C
X    1         111         111
X    2123456789012123456789012
XSUN:XXXXXXXXXXXXXXXXXXXXXXXX
XMON:XXXXXXXXXXXXXXXXXXXXXXXX
XTUE:XXXXXXXXXXXXXXXXXXXXXXXX
XWED:XXXXXXXXXXXXXXXXXXXXXXXX
XTHU:XXXXXXXXXXXXXXXXXXXXXXXX
XFRI:XXXXXXXXXXXXXXXXXXXXXXXX
XSAT:XXXXXXXXXXXXXXXXXXXXXXXX
X       (X=Open; .=Closed)
$ CALL UNPACK HOURS.;1 655639170
$ create 'f'
X/* source/io.c: terminal I/O code, uses the curses package
X
X   Copyright (c) 1989-92 James E. Wilson, Robert A. Koeneke
X
X   This software may be copied and distributed for educational, research, an
Vd
X   not for profit purposes provided that this copyright and statement are
X   included in all such copies. */
X
X#include <stdio.h>
X#ifndef STDIO_LOADED
X#define STDIO_LOADED
X#endif
X
X#include "config.h"
X
X#if defined(atarist) && defined(__GNUC__)
X#include <osbind.h>
X#endif
X
X#ifdef MSDOS
X#include <process.h>
X#endif
X
X#ifdef AMIGA
X/* detach from cli process */
Xlong _stack = 30000;
Xlong _priority = 0;
Xlong _BackGroundIO = 1;
Xchar *_procname = "Moria";
X#endif
X
X#if defined(NLS) && defined(lint)
X/* for AIX, don't let curses include the NL stuff */
X#undef NLS
X#endif
X
X#if !defined(GEMDOS)
X#ifdef MAC
X#ifdef THINK_C
X#include "ScrnMgr.h"
X#else
X#include <scrnmgr.h>
X#endif
X#else
X#include <curses.h>
X#endif
X#else`09/* GEMDOS i.e. Atari ST */
X#include "curses.h"
Xlong wgetch();
X#ifdef ATARIST_TC
X#include <tos.h>`09/* TC */
X#include <ext.h>
X#else
X#include <osbind.h>`09/* MWC */
X#endif
Xchar *getenv();
X#endif
X
X/* These are included after curses.h to avoid redefintion warnings for
X   TRUE, FALSE, and NULL.  */
X
X#include "constant.h"
X#include "types.h"
X#include "externs.h"
X
X#include <ctype.h>
X
X#if defined(SYS_V) && defined(lint)
X/* for AIX, prevent hundreds of unnecessary lint errors, must define before
X   signal.h is included */
X#define _h_IEEETRAP
Xtypedef struct `7B int stuff; `7D fpvmach;
X#endif
X
X#if defined(MSDOS)
X#if defined(ANSI)
X#include "ms_ansi.h"
X#endif
X#else /* not msdos */
X#if !defined(ATARI_ST) && !defined(MAC) && !defined(AMIGA)
X#ifndef VMS
X#include <sys/ioctl.h>
X#endif
X#include <signal.h>
X#endif
X#endif
X
X#ifndef USG
X/* only needed for Berkeley UNIX */
X#include <sys/param.h>
X#include <sys/file.h>
X#include <sys/types.h>
X#endif
X
X#ifdef USG
X#ifndef ATARI_ST
X#include <string.h>
X#else
X#include "string.h"
X#endif
X#if 0
X/* Used to include termio.h here, but that caused problems on some systems,
X   as curses.h includes it also above.  */
X#if !defined(MAC) && !defined(MSDOS) && !defined(ATARI_ST)
X#if !defined(AMIGA) && !defined(VMS)
X#include <termio.h>
X#endif
X#endif
X#endif
X#else /* ! USG */
X#include <strings.h>
X#if defined(atarist) && defined(__GNUC__)
X/* doesn't have sys/wait.h */
X#else
X#include <sys/wait.h>
X#endif
X#endif
X
X#ifdef ATARIST_TC
X/* Include this to get prototypes for standard library functions.  */
X#include <stdlib.h>
X#endif
X
X#if defined(SYS_V) && defined(lint)
Xstruct screen `7B int dumb; `7D;
X#endif
X
X/* Fooling lint. Unfortunately, c defines all the TIO.`09  -CJS-
X   constants to be long, and lint expects them to be int. Also,
X   ioctl is sometimes called with just two arguments. The
X   following definition keeps lint happy. It may need to be
X   reset for different systems.`09 */
X#ifndef MAC
X#ifdef lint
X#ifdef Pyramid
X/* Pyramid makes constants greater than 65535 into long! Gakk! -CJS- */
X/*ARGSUSED*/
X/*VARARGS2*/
Xstatic Ioctl(i, l, p) long l; char *p; `7B return 0; `7D
X#else
X/*ARGSUSED*/
X/*VARARGS2*/
Xstatic Ioctl(i, l, p) char *p; `7B return 0; `7D
X#endif
X#define ioctl`09    Ioctl
X#endif
X
X#if !defined(USG) && defined(lint)
X/* This use_value hack is for curses macros which return a value,
X   but don't shut up about it when you try to tell them (void).`09 */
X/* only needed for Berkeley UNIX */
Xint Use_value;
X#define use_value   Use_value +=
X#else
X#define use_value
X#endif
X
X#if defined(SYS_V) && defined(lint)
X/* This use_value2 hack is for curses macros which use a conditional
X   expression, and which say null effect even if you cast to (void). */
X/* only needed for SYS V */
+-+-+-+-+-+-+-+-  END  OF PART 23 +-+-+-+-+-+-+-+-
