[comp.sources.games] v02i070: umoria - single player dungeon simulation, Part05/16

games-request@tekred.TEK.COM (11/05/87)

Submitted by: "James E. Wilson" <wilson@ji.berkeley.edu>
Comp.sources.games: Volume 2, Issue 70
Archive-name: umoria/Part05




#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 5 (of 16)."
# Contents:  desc.c moria1.c
# Wrapped by billr@tekred on Wed Nov  4 09:59:45 1987
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f desc.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"desc.c\"
else
echo shar: Extracting \"desc.c\" \(7825 characters\)
sed "s/^X//" >desc.c <<'END_OF_desc.c'
X#include <stdio.h>
X#ifdef USG
X#include <string.h>
X#else
X#include <strings.h>
X#endif
X
X#include "constants.h"
X#include "types.h"
X#include "externs.h"
X
X#ifdef sun   /* correct SUN stupidity in the stdio.h file */
Xchar *sprintf();
X#endif
X
X/* Object descriptor routines					*/
X
Xint is_a_vowel(ch)
Xchar ch;
X{
X  switch(ch)
X    {
X    case 'a': case 'e': case 'i': case 'o': case 'u': 
X    case 'A': case 'E': case 'I': case 'O': case 'U':
X      return(TRUE);
X      break;
X    default:
X      return(FALSE);
X      break;
X    }
X  return(FALSE);
X}
X
X
X/* Randomize colors, woods, and metals				*/
Xrandes()
X{
X  int i, j;
X  vtype tmp;
X
X  for (i = 0; i < MAX_COLORS; i++)
X    {
X      j = randint(MAX_COLORS) - 1;
X      (void) strcpy(tmp, colors[i]);
X      (void) strcpy(colors[i], colors[j]);
X      (void) strcpy(colors[j], tmp);
X    }
X  for (i = 0; i < MAX_WOODS; i++)
X    {
X      j = randint(MAX_WOODS) - 1;
X      (void) strcpy(tmp, woods[i]);
X      (void) strcpy(woods[i], woods[j]);
X      (void) strcpy(woods[j], tmp);
X    }
X  for (i = 0; i < MAX_METALS; i++)
X    {
X      j = randint(MAX_METALS) - 1;
X      (void) strcpy(tmp, metals[i]);
X      (void) strcpy(metals[i], metals[j]);
X      (void) strcpy(metals[j], tmp);
X    }
X  for (i = 0; i < MAX_ROCKS; i++)
X    {
X      j = randint(MAX_ROCKS) - 1;
X      (void) strcpy(tmp, rocks[i]);
X      (void) strcpy(rocks[i], rocks[j]);
X      (void) strcpy(rocks[j], tmp);
X    }
X  for (i = 0; i < MAX_AMULETS; i++)
X    {
X      j = randint(MAX_AMULETS) - 1;
X      (void) strcpy(tmp, amulets[i]);
X      (void) strcpy(amulets[i], amulets[j]);
X      (void) strcpy(amulets[j], tmp);
X    }
X  for (i = 0; i < MAX_MUSH; i++)
X    {
X      j = randint(MAX_MUSH) - 1;
X      (void) strcpy(tmp, mushrooms[i]);
X      (void) strcpy(mushrooms[i], mushrooms[j]);
X      (void) strcpy(mushrooms[j], tmp);
X    }
X}
X
X
X/* Return random title						*/
Xrantitle(title)
Xchar *title;
X{
X  int i, j, k;
X
X  k = randint(2) + 1;
X  (void) strcpy(title, "Titled \"");
X  for (i = 0; i < k; i++)
X    {
X      for (j = 0; j < randint(2); j++)
X	(void) strcat(title, syllables[randint(MAX_SYLLABLES) - 1]);
X      if (i < k-1)
X	(void) strcat(title, " ");
X    }
X  (void) strcat(title, "\"");
X}
X
X
X/* Initialize all Potions, wands, staves, scrolls, ect...	*/
Xmagic_init()
X{
X  int i, tmpv;
X  vtype tmps;
X
X  set_seed(randes_state, randes_seed);
X  randes();
X  for (i = 0; i < MAX_OBJECTS; i++)
X    {
X      tmpv = (0xFF & object_list[i].subval);
X      switch(object_list[i].tval)
X	{
X	case 75: case 76:
X	  if (tmpv < MAX_COLORS) 
X	    insert_str(object_list[i].name, "%C", colors[tmpv]);
X	  break;
X	case 70: case 71:
X	  rantitle(tmps);
X	  insert_str(object_list[i].name, "%T", tmps);
X	  break;
X	case 45:
X	  if (tmpv < MAX_ROCKS) 
X	    insert_str(object_list[i].name, "%R", rocks[tmpv]);
X	  break;
X	case 40: if (tmpv < MAX_AMULETS) 
X	  insert_str(object_list[i].name, "%A", amulets[tmpv]);
X	  break;
X	case 65:
X	  if (tmpv < MAX_METALS) 
X	    insert_str(object_list[i].name, "%M", metals[tmpv]);
X	  break;
X	case 55:
X	  if (tmpv < MAX_WOODS) 
X	    insert_str(object_list[i].name, "%W", woods[tmpv]);
X	  break;
X	case 80:
X	  if (tmpv < MAX_MUSH) 
X	    insert_str(object_list[i].name, "%M", mushrooms[tmpv]);
X	  break;
X	case 60:
X	  /*if (tmpv < MAX_RODS) 
X	    insert_str(object_list[i].name, "%D", rods[tmpv])*/;
X	  break;
X	default:
X	  break;
X	}
X    }
X  reset_seed();
X}
X
X
X/* Remove "Secret" symbol for identity of object			*/
Xknown1(object_str)
Xchar *object_str;
X{
X  int pos;
X  vtype str1, str2;
X  char *string;
X
X  string = index(object_str, '|');
X  if (string)
X    pos = strlen(object_str) - strlen(string);
X  else
X    pos = -1;
X  if (pos >= 0) 
X    {
X      (void) strncpy(str1, object_str, pos);
X      str1[pos] = '\0';
X      (void) strcpy(str2, &object_str[pos+1]);
X      (void) strcpy(object_str, strcat(str1, str2));
X    }
X}
X
X
X/* Remove "Secret" symbol for identity of plusses			*/
Xknown2(object_str)
Xchar *object_str;
X{
X  int pos;
X  vtype str1, str2;
X  char *string;
X
X  string = index(object_str, '^');
X  if (string)
X    pos = strlen(object_str) - strlen(string);
X  else
X    pos = -1;
X  if (pos >= 0) 
X    {
X      (void) strncpy(str1, object_str, pos);
X      str1[pos] = '\0';
X      (void) strcpy(str2, &object_str[pos+1]);
X      (void) strcpy(object_str, strcat(str1, str2));
X    }
X}
X
X
X/* Return string without quoted portion				*/
Xunquote(object_str)
Xchar *object_str;
X{
X  int pos0, pos1, pos2;
X  vtype str1, str2;
X  char *string;
X
X  string = index(object_str, '\"');
X  if (string)
X    pos0 = strlen(string) - strlen(object_str);
X  else
X    pos0 = -1;
X  if (pos0 >= 0) 
X    {
X      string = index(object_str, '~');
X      if (string)
X	pos1 = strlen(string) - strlen(object_str);
X      else
X	pos1 = 0;
X      string = index(object_str, '|');
X      if (string)
X	pos2 = strlen(string) - strlen(object_str);
X      else
X	pos2 = 0;
X      (void) strncpy(str1, object_str, pos1);
X      str1[pos1] = '\0';
X      (void) strcpy(str2, &object_str[pos2+1]);
X      (void) strcpy(object_str, strcat(str1, str2));
X    }
X}
X	  
X
X/* Somethings been identified					*/
Xidentify(item)
Xtreasure_type item;
X{
X  int i, x1, x2;
X  treasure_type *t_ptr;
X  char *string;
X
X  x1 = item.tval;
X  x2 = item.subval;
X  if (index(item.name, '|') != 0) 
X    {
X      for (i = 0; i < MAX_TALLOC; i++)
X	{
X	  t_ptr = &t_list[i];
X	  if ((t_ptr->tval == x1) && (t_ptr->subval == x2)) 
X	    {
X	      unquote(t_ptr->name);
X	      known1(t_ptr->name);
X	    }
X	}
X      for (i = 0; i <= INVEN_MAX; i++)
X	{
X	  t_ptr = &inventory[i];
X	  if ((t_ptr->tval == x1) && (t_ptr->subval == x2)) 
X	    {
X	      unquote(t_ptr->name);
X	      known1(t_ptr->name);
X	    }
X	}
X      i = 0;
X      do
X	{
X	  t_ptr = &object_list[i];
X	  if ((t_ptr->tval == x1) && (t_ptr->subval == x2)) 
X	    if ((string = index(t_ptr->name, '%')) && (string[0] == 'T'))
X	      {
X		insert_str(t_ptr->name, " %T|", "");
X		object_ident[i] = TRUE;
X	      }
X	    else
X	      {
X		unquote(t_ptr->name);
X		known1(t_ptr->name);
X		object_ident[i] = TRUE;
X	      }
X	  i++;
X	}
X      while (i != MAX_OBJECTS);
X    }
X}
X
X
X/* Returns a description of item for inventory			*/
Xobjdes(out_val, ptr, pref)
Xchar *out_val;
Xint ptr;
Xint pref;
X{
X  int pos;
X  vtype tmp_val;
X  treasure_type *i_ptr;
X  char *string;
X
X  i_ptr = &inventory[ptr];
X  (void) strcpy(tmp_val, i_ptr->name);
X  string = index(tmp_val, '|');
X  if (string)
X    pos = strlen(tmp_val) - strlen(string);
X  else
X    pos = -1;
X  if (pos >= 0) 
X    {
X      tmp_val[pos] = '\0';
X    }
X  string = index(tmp_val, '^');
X  if (string)
X    pos = strlen(tmp_val) - strlen(string);
X  else
X    pos = -1;
X  if (pos >= 0) 
X    {
X      tmp_val[pos] = '\0';
X    }
X  if (!pref) 
X    {
X      string = index(tmp_val, '(');
X      if (string)
X	pos = strlen(tmp_val) - strlen(string);
X      else
X	pos = -1;
X      if (pos >= 0) 
X	{
X	  tmp_val[pos] = '\0';
X	}
X    }
X  insert_num(tmp_val, "%P1", i_ptr->p1, TRUE);
X  insert_num(tmp_val, "%P2", i_ptr->tohit, TRUE);
X  insert_num(tmp_val, "%P3", i_ptr->todam, TRUE);
X  insert_num(tmp_val, "%P4", i_ptr->toac, TRUE);
X  insert_num(tmp_val, "%P5", i_ptr->p1, FALSE);
X  insert_num(tmp_val, "%P6", i_ptr->ac, FALSE);
X  if (i_ptr->number != 1) 
X    {
X      insert_str(tmp_val, "ch~", "ches");
X      insert_str(tmp_val, "~", "s");
X    }
X  else
X    insert_str(tmp_val, "~", "");
X  if (pref) 
X    {
X      if (index(tmp_val, '&') != 0) 
X	{
X	  insert_str(tmp_val, "&", "");
X	  if (i_ptr->number > 1) 
X	    (void) sprintf(out_val, "%d%s", (int)i_ptr->number, tmp_val);
X	  else if (i_ptr->number < 1) 
X	    (void) sprintf(out_val, "%s%s", "no more", tmp_val);
X	  else if (is_a_vowel(tmp_val[1]))
X	    (void) sprintf(out_val, "an%s", tmp_val);
X	  else
X	    (void) sprintf(out_val, "a%s", tmp_val);
X	}
X      else
X	(void) strcpy(out_val, tmp_val);
X      (void) strcat(out_val, ".");
X    }
X  else
X    {
X      insert_str(tmp_val, "& ", "");
X      (void) strcpy(out_val, tmp_val);
X    }
X}
END_OF_desc.c
if test 7825 -ne `wc -c <desc.c`; then
    echo shar: \"desc.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f moria1.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"moria1.c\"
else
echo shar: Extracting \"moria1.c\" \(44858 characters\)
sed "s/^X//" >moria1.c <<'END_OF_moria1.c'
X#include <stdio.h>
X#ifdef USG
X#include <string.h>
X#else
X#include <strings.h>
X#endif
X
X#include "constants.h"
X#include "types.h"
X#include "externs.h"
X
X#ifdef sun   /* correct SUN stupidity in the stdio.h file */
Xchar *sprintf();
X#endif
X
Xbyteint de_statt();
Xbyteint in_statt();
X
X/* global flags */
Xextern int moria_flag;        /* Next level when true  */
Xextern int search_flag;       /* Player is searching   */
Xextern int teleport_flag;     /* Handle teleport traps  */
Xextern int player_light;      /* Player carrying light */
Xextern int cave_flag;         /* used in get_panel */
Xextern int light_flag;        /* used in move_light */
X
X
X/* Changes stats up or down for magic items		-RAK-	*/
Xchange_stat_factor(stat, amount, factor)
Xbyteint *stat;
Xint amount, factor;
X{
X  int i, j, k;
X
X  j = amount * factor;
X  k = abs(amount);
X  for (i = 0; i < k; i++)
X    if (j < 0) 
X      *stat = de_statt(*stat);
X    else
X      *stat = in_statt(*stat);
X}
X
X
X/* Changes speed of monsters relative to player		-RAK-	*/
X/* Note: When the player is sped up or slowed down, I simply     */
X/*       change the speed of all the monsters.  This greatly     */
X/*       simplified the logic...                                 */
Xchange_speed(num)
Xint num;
X{
X  int i;
X
X  py.flags.speed += num;
X  i = muptr;
X  while (i > 0)
X    {
X      m_list[i].cspeed += num;
X      i = m_list[i].nptr;
X    }
X}
X
X
X/* Player bonuses					-RAK-	*/
X/* When an item is worn or taken off, this re-adjusts the player */
X/* bonuses.  Factor==1 : wear; Factor==-1 : removed                */
Xpy_bonuses(tobj, factor)
Xtreasure_type tobj;
Xint factor;
X{
X  unsigned int item_flags;
X  int i, old_dis_ac;
X  struct flags *p_ptr;
X  struct misc *m_ptr;
X  treasure_type *i_ptr;
X
X  p_ptr = &py.flags;
X  if (p_ptr->slow_digest) 
X    p_ptr->food_digested++;
X  if (p_ptr->regenerate) 
X    p_ptr->food_digested -= 3;
X  p_ptr->see_inv     = FALSE;
X  p_ptr->teleport    = FALSE;
X  p_ptr->free_act    = FALSE;
X  p_ptr->slow_digest = FALSE;
X  p_ptr->aggravate   = FALSE;
X  p_ptr->sustain_str = FALSE;
X  p_ptr->sustain_int = FALSE;
X  p_ptr->sustain_wis = FALSE;
X  p_ptr->sustain_con = FALSE;
X  p_ptr->sustain_dex = FALSE;
X  p_ptr->sustain_chr = FALSE;
X  p_ptr->fire_resist = FALSE;
X  p_ptr->acid_resist = FALSE;
X  p_ptr->cold_resist = FALSE;
X  p_ptr->regenerate  = FALSE;
X  p_ptr->lght_resist = FALSE;
X  p_ptr->ffall       = FALSE;
X
X  if (0x00000001 & tobj.flags)
X    {
X      change_stat_factor(&py.stats.cstr, tobj.p1, factor);
X      change_stat_factor(&py.stats.str, tobj.p1, factor);
X      print_stat = (0x0001 | print_stat);
X    }
X  if (0x00000002 & tobj.flags)
X    {
X      change_stat_factor(&py.stats.cdex, tobj.p1, factor);
X      change_stat_factor(&py.stats.dex, tobj.p1, factor);
X      print_stat = (0x0002 | print_stat);
X    }
X  if (0x00000004 & tobj.flags)
X    {
X      change_stat_factor(&py.stats.ccon, tobj.p1, factor);
X      change_stat_factor(&py.stats.con, tobj.p1, factor);
X      print_stat = (0x0004 | print_stat);
X    }
X  if (0x00000008 & tobj.flags)
X    {
X      change_stat_factor(&py.stats.cint, tobj.p1, factor);
X      change_stat_factor(&py.stats.intel, tobj.p1, factor);
X      print_stat = (0x0008 | print_stat);
X    }
X  if (0x00000010 & tobj.flags)
X    {
X      change_stat_factor(&py.stats.cwis, tobj.p1, factor);
X      change_stat_factor(&py.stats.wis, tobj.p1, factor);
X      print_stat = (0x0010 | print_stat);
X    }
X  if (0x00000020 & tobj.flags)
X    {
X      change_stat_factor(&py.stats.cchr, tobj.p1, factor);
X      change_stat_factor(&py.stats.chr, tobj.p1, factor);
X      print_stat = (0x0020 | print_stat);
X    }
X  if (0x00000040 & tobj.flags)
X    {
X      py.misc.srh += (tobj.p1 * factor);
X      py.misc.fos -= (tobj.p1 * factor);
X    }
X  if (0x00000100 & tobj.flags)
X    py.misc.stl += 2*factor;
X  if (0x00001000 & tobj.flags)
X    {
X      i = tobj.p1*factor;
X      change_speed(-i);
X    }
X  if (0x08000000 & tobj.flags)
X    if (factor > 0) 
X      py.flags.blind += 1000;
X  if (0x10000000 & tobj.flags)
X    if (factor > 0) 
X      py.flags.afraid += 50;
X  if (0x40000000 & tobj.flags)
X    py.flags.see_infra += (tobj.p1 * factor);
X  m_ptr = &py.misc;
X  old_dis_ac = m_ptr->dis_ac;
X  m_ptr->ptohit  = tohit_adj();       /* Real To Hit   */
X  m_ptr->ptodam  = todam_adj();       /* Real To Dam   */
X  m_ptr->ptoac   = toac_adj();        /* Real To AC    */
X  m_ptr->pac     = 0;               /* Real AC       */
X  m_ptr->dis_th  = m_ptr->ptohit;  /* Display To Hit        */
X  m_ptr->dis_td  = m_ptr->ptodam;  /* Display To Dam        */
X  m_ptr->dis_ac  = 0;       /* Display To AC         */
X  m_ptr->dis_tac = m_ptr->ptoac;   /* Display AC            */
X  for (i = 22; i < INVEN_MAX-2; i++)
X    {
X      i_ptr = &inventory[i];
X      if (i_ptr->tval != 0) 
X	{
X	  if ((0x80000000 & i_ptr->flags) == 0) 
X	    {
X	      m_ptr->pac += i_ptr->ac;
X	      m_ptr->dis_ac += i_ptr->ac;
X	    }
X	  m_ptr->ptohit += i_ptr->tohit;
X	  m_ptr->ptodam += i_ptr->todam;
X	  m_ptr->ptoac  += i_ptr->toac;
X	  if (index(i_ptr->name, '^') == 0) 
X	    {
X	      m_ptr->dis_th  += i_ptr->tohit;
X	      m_ptr->dis_td  += i_ptr->todam;
X	      m_ptr->dis_tac += i_ptr->toac;
X	    }
X	}
X    }
X  m_ptr->dis_ac += m_ptr->dis_tac;
X
X  /* Add in temporary spell increases	*/
X  p_ptr = &py.flags;
X  if (p_ptr->invuln > 0) 
X    {
X      m_ptr->pac += 100;
X      m_ptr->dis_ac += 100;
X    }
X  if (p_ptr->blessed > 0) 
X    {
X      m_ptr->pac    += 2;
X      m_ptr->dis_ac += 2;
X    }
X  if (p_ptr->detect_inv > 0) 
X    p_ptr->see_inv = TRUE;
X  
X  if (old_dis_ac != m_ptr->dis_ac) 
X    print_stat = (0x0040 | print_stat);
X  
X  item_flags = 0;
X  for (i = 22; i < INVEN_MAX-2; i++)
X    {
X      i_ptr = &inventory[i];
X      item_flags |= i_ptr->flags;
X    }
X  if (0x00000080 & item_flags)
X    py.flags.slow_digest = TRUE;
X  if (0x00000200 & item_flags)
X    py.flags.aggravate = TRUE;
X  if (0x00000400 & item_flags)
X    py.flags.teleport = TRUE;
X  if (0x00000800 & item_flags)
X    py.flags.regenerate = TRUE;
X  if (0x00080000 & item_flags)
X    py.flags.fire_resist = TRUE;
X  if (0x00100000 & item_flags)
X    py.flags.acid_resist = TRUE;
X  if (0x00200000 & item_flags)
X    py.flags.cold_resist = TRUE;
X  if (0x00800000 & item_flags)
X    py.flags.free_act = TRUE;
X  if (0x01000000 & item_flags)
X    py.flags.see_inv = TRUE;
X  if (0x02000000 & item_flags)
X    py.flags.lght_resist = TRUE;
X  if (0x04000000 & item_flags)
X    py.flags.ffall = TRUE;
X
X  for (i = 22; i < INVEN_MAX-2; i++)
X    {
X      i_ptr = &inventory[i];
X      if (0x00400000 & i_ptr->flags)
X	switch(i_ptr->p1)
X	  {
X	  case 1: py.flags.sustain_str = TRUE; break;
X	  case 2: py.flags.sustain_int = TRUE; break;
X	  case 3: py.flags.sustain_wis = TRUE; break;
X	  case 4: py.flags.sustain_con = TRUE; break;
X	  case 5: py.flags.sustain_dex = TRUE; break;
X	  case 6: py.flags.sustain_chr = TRUE; break;
X	  default: break;
X	  }
X    }
X
X  p_ptr = &py.flags;
X  if (p_ptr->slow_digest) 
X    p_ptr->food_digested--;
X  if (p_ptr->regenerate) 
X    p_ptr->food_digested += 3;
X}
X
X
X/* Returns a "*" for cursed items, a ")" for normal ones -RAK-	*/
X/* NOTE: "*" returned only if item has been identified...        */
Xchar cur_char1(item_val)
Xint item_val;
X{
X  treasure_type *i_ptr;
X
X  i_ptr = &inventory[item_val];
X  if ((0x80000000 & i_ptr->flags) == 0) 
X    return(')');    /* Not cursed...                 */
X  else if (index(i_ptr->name, '^') != 0) 
X    return(')');    /* Cursed, but not identified    */
X  else
X    return('*');   /* Cursed and identified...      */
X}
X
X
X/* Returns a "*" for cursed items, a ")" for normal ones -RAK-	*/
Xchar cur_char2(item_val)
Xint item_val;
X{
X  treasure_type *i_ptr;
X
X  i_ptr = &inventory[item_val];
X  if ((0x80000000 & i_ptr->flags) == 0) 
X    return(')');    /* Not cursed... */
X  else
X    return('*');   /* Cursed...     */
X}
X
X
X/* inventory functions, define some global variables here */
Xint scr_state;
X
X/* Displays inventory items from r1 to r2	-RAK-	*/
Xshow_inven(r1, r2)
Xint r1, r2;
X{
X  int i;
X  vtype tmp_val, out_val;
X
X  if (r1 >= 0)                       /* R1 == 0 dummy call     */
X    {
X      for (i = r1; i <= r2; i++)             /* Print the items       */
X	{
X	  objdes(tmp_val, i, TRUE);
X	  (void) sprintf(out_val, "%c%c %s", i+97, cur_char1(i), tmp_val);
X	  prt(out_val, i+1, 0);
X	}
X      if (r2 < 22)
X	prt("", r2+2, 0); /* Clear line after      */
X      scr_state = 1;                   /* Set state to 1        */
X    }
X}
X
X/* Displays equipment items from r1 to end	-RAK-	*/
Xshow_equip(r1)
Xint r1;
X{
X  int i, j;
X  vtype prt1, prt2, out_val;
X  treasure_type *i_ptr;
X
X  if (r1 >= equip_ctr)       /* Last item gone                */
X    prt("", equip_ctr+2, 0);
X  else if (r1 >= 0)          /* R1 == 0 dummy call             */
X    {
X      j = 0;
X      for (i = 22; i < INVEN_MAX; i++) /* Range of equipment        */
X	{
X	  i_ptr = &inventory[i];
X	  if (i_ptr->tval != 0) 
X	    {
X	      if (j >= r1) /* Display only given range    */
X		{
X		  switch(i)          /* Get position          */
X		    {
X		    case 22:
X		      (void) strcpy(prt1, " You are wielding   : "); break;
X		    case 23:
X		      (void) strcpy(prt1, " Worn on head       : "); break;
X		    case 24:
X		      (void) strcpy(prt1, " Worn around neck   : "); break;
X		    case 25:
X		      (void) strcpy(prt1, " Worn on body       : "); break;
X		    case 26:
X		      (void) strcpy(prt1, " Worn on arm        : "); break;
X		    case 27:
X		      (void) strcpy(prt1, " Worn on hands      : "); break;
X		    case 28:
X		      (void) strcpy(prt1, " Worn on right hand : "); break;
X		    case 29:
X		      (void) strcpy(prt1, " Worn on left hand  : "); break;
X		    case 30:
X		      (void) strcpy(prt1, " Worn on feet       : "); break;
X		    case 31:
X		      (void) strcpy(prt1, " Worn about body    : "); break;
X		    case 32:
X		      (void) strcpy(prt1, " Light source       : "); break;
X		    case 33:
X		      (void) strcpy(prt1, " Secondary weapon   : "); break;
X		    default:
X		      (void) strcpy(prt1, " Unknown value      : "); break;
X		    }
X		  objdes(prt2, i, TRUE);
X		  (void) sprintf(out_val,
X				 "%c%c%s%s", j+97, cur_char2(i), prt1, prt2);
X		  prt(out_val, j+2, 0);
X		}
X	      j++;
X	    }
X	}
X      prt("", j+2, 0);   /* Clear last line       */
X      scr_state = 2;   /* Set state of screen   */
X    }
X}
X
X/* Remove item from equipment list		-RAK-	*/
Xint remove(item_val)
Xint item_val;
X{
X  int i, j, typ;
X  vtype out_val, prt1, prt2;
X  int flag;
X  treasure_type *i_ptr;
X
X  i = 0;
X  flag = FALSE;
X  typ  = inventory[item_val].tval;
X  do
X    {
X      i_ptr = &inventory[i];
X      if (typ > i_ptr->tval) 
X	{
X	  for (j = inven_ctr-1; j >= i; j--)
X	    inventory[j+1] = inventory[j];
X	  inventory[i]  = inventory[item_val];
X	  inven_ctr++;
X	  equip_ctr--;
X	  flag = TRUE;
X	}
X      i++;
X    }
X  while (!flag);
X  i--;
X  switch(typ)
X    {
X    case 10: case 11: case 12: case 20: case 21: case 22: case 23: case 25 :
X      (void) strcpy(prt1, "Was wielding ");
X      break;
X    case 15:
X      (void) strcpy(prt1, "Light source was ");
X      break;
X    default:
X      (void) strcpy(prt1, "Was wearing ");
X      break;
X    }
X  objdes(prt2, i, TRUE);
X  (void) sprintf(out_val, "%s%s (%c)", prt1, prt2, i+97);
X  msg_print(out_val);
X  inventory[item_val] = blank_treasure;
X  if (item_val != INVEN_AUX)      /* For secondary weapon  */
X    py_bonuses(inventory[i], -1);
X  return(i);
X}
X
X
X/* Unwear routine,  remove a piece of equipment	-RAK-	*/
Xunwear()
X{
X  int i, j, com_val;
X  int exit_flag, test_flag;
X  char command;
X  vtype out_val;
X
X  if (scr_state == 1) 
X    {
X      clear_screen(0, 0);
X      show_equip(0);
X    }
X  exit_flag = FALSE;
X  do
X    {
X      (void) sprintf(out_val,
X	      "(a-%c, * for equipment list, ESC to exit) Take off which one ?",
X	      equip_ctr+96);
X      test_flag = FALSE;
X      msg_print(out_val);
X      do
X	{
X	  inkey(&command);
X	  com_val = (command);
X	  switch(com_val)
X	    {
X	    case 0: case 27:
X	      test_flag = TRUE;
X	      exit_flag = TRUE;
X	      break;
X	    case 42:
X	      clear_screen(1, 0);
X	      show_equip(0);
X	      break;
X	    default:
X	      com_val -= 97;
X	      if ((com_val >= 0) &&
X		  (com_val < equip_ctr)) 
X		test_flag = TRUE;
X	      break;
X	    }
X	}
X      while (!test_flag);
X      if (!exit_flag) 
X	{
X	  reset_flag = FALSE;    /* Player turn   */
X	  i = -1;
X	  j = 21;
X	  do
X	    {
X	      j++;
X	      if (inventory[j].tval != 0) 
X		i++;
X	    }
X	  while (i != com_val);
X	  if (0x80000000 & inventory[j].flags)
X	    {
X	      msg_print("Hmmm, it seems to be cursed...");
X	      com_val = 0;
X	    }
X	  else
X	    (void) remove(j);
X	}
X      if (scr_state == 0) 
X	exit_flag = TRUE;
X      else if (equip_ctr == 0) 
X	exit_flag = TRUE;
X      else if (inven_ctr > 21) 
X	exit_flag = TRUE;
X      else if (!exit_flag) 
X	show_equip(0);
X    }
X  while (!exit_flag);
X  if (scr_state != 0) 
X    if (equip_ctr == 0) 
X      clear_screen(0, 0);
X    else
X      prt("You are currently using -", 0, 0);
X}
X
X
X/* Wear routine, wear or wield an item		-RAK-	*/
Xwear()
X{
X  int com_val, i, j, k, tmp;
X  vtype out_val, prt1, prt2;
X  treasure_type unwear_obj;
X  int exit_flag, test_flag;
X  char command;
X  treasure_type *i_ptr;
X
X  if (scr_state == 2) 
X    {
X      clear_screen(0, 0);
X      show_inven(0, inven_ctr-1);
X    }
X  exit_flag = FALSE;
X  do
X    {
X      (void) sprintf(out_val,
X	     "(a-%c, * for equipment list, ESC to exit) Wear/Wield which one?",
X	      inven_ctr+96);
X      test_flag = FALSE;
X      msg_print(out_val);
X      do
X	{
X	  inkey(&command);
X	  com_val = (command);
X	  switch(com_val)
X	    {
X	    case 0: case 27:
X	      test_flag = TRUE;
X	      exit_flag = TRUE;
X	      break;
X	    case 42:
X	      clear_screen(1, 0);
X	      show_inven(0, inven_ctr-1);
X	      break;
X	    default:
X	      com_val -= 97;
X	      if ((com_val >= 0) &&
X		  (com_val < inven_ctr)) 
X		test_flag = TRUE;
X	      break;
X	    }
X	}
X      while (!test_flag);
X      if (!exit_flag)     /* Main logic for wearing        */
X	{
X	  reset_flag = FALSE;    /* Player turn   */
X	  test_flag = TRUE;
X	  switch(inventory[com_val].tval) /* Slot for equipment    */
X	    {
X	    case 10: i = 22; break;
X	    case 11: i = 22; break;
X	    case 12: i = 22; break;
X	    case 15: i = 32; break;
X	    case 20: i = 22; break;
X	    case 21: i = 22; break;
X	    case 22: i = 22; break;
X	    case 23: i = 22; break;
X	    case 25: i = 22; break;
X	    case 30: i = 30; break;
X	    case 31: i = 27; break;
X	    case 32: i = 31; break;
X	    case 33: i = 23; break;
X	    case 34: i = 26; break;
X	    case 35: i = 25; break;
X	    case 36: i = 25; break;
X	    case 40: i = 24; break;
X	    case 45:
X	      if (inventory[28].tval == 0)       /* Rings */
X	        i = 28;
X	      else
X	        i = 29;
X	      break;
X            default:
X	      msg_print("I don't see how you can use that.");
X	      test_flag = FALSE;
X	      com_val = 0;
X	      break;
X	    }
X	  if (test_flag) 
X	    if (inventory[i].tval != 0) 
X	      {
X		if (0x80000000 & inventory[i].flags)
X		  {
X		    objdes(prt1, i, FALSE);
X		    (void) sprintf(out_val, "The %s you are ", prt1);
X		    switch(i)
X		      {
X		      case 23: (void) strcat(out_val, "wielding "); break;
X		      default: (void) strcat(out_val, "wearing "); break;
X		      }
X		    msg_print(strcat(out_val, "appears to be cursed."));
X		    test_flag = FALSE;
X		    com_val = 0;
X		  }
X		else if (inven_ctr > 21) 
X		  if (inventory[com_val].number > 1) 
X		    if (inventory[com_val].subval < 512) 
X		      {
X			msg_print("You will have to drop something first.");
X			test_flag = FALSE;
X			com_val = 0;
X		      }
X	      }
X	  if (test_flag) 
X	    {
X	      unwear_obj = inventory[i];
X	      inventory[i] = inventory[com_val];
X	      i_ptr = &inventory[i];
X	      /* Fix for torches       */
X	      if ((i_ptr->subval > 255) && (i_ptr->subval < 512)) 
X		{
X		  i_ptr->number = 1;
X		  i_ptr->subval -= 255;
X		}
X	      /* Fix for weight        */
X	      inven_weight += i_ptr->weight*i_ptr->number;
X	      inven_destroy(com_val);     /* Subtracts weight      */
X	      equip_ctr++;
X	      py_bonuses(inventory[i], 1);
X	      if (unwear_obj.tval != 0) 
X		{
X		  inventory[INVEN_MAX] = unwear_obj;
X		  tmp = remove(INVEN_MAX);
X		  if (tmp < com_val) 
X		    com_val = tmp;
X		}
X	      switch(i)
X		{
X		case 22: (void) strcpy(prt1, "You are wielding "); break;
X		case 32: (void) strcpy(prt1, "Your light source is "); break;
X		default: (void) strcpy(prt1, "You are wearing "); break;
X		}
X	      objdes(prt2, i, TRUE);
X	      j = -1;
X	      k = 21;
X	      do      /* Get the right letter of equipment     */
X		{
X		  k++;
X		  if (inventory[k].tval != 0) 
X		    j++;
X		}
X	      while (k != i);
X	      (void) sprintf(out_val, "%s%s (%c%c",
X		      prt1, prt2, j+97, cur_char2(i));
X	      msg_print(out_val);
X	      if ((i == 22) && (py.stats.cstr*15 < i_ptr->weight))
X		msg_print("You have trouble wielding such a heavy weapon.");
X	    }
X	}
X      if (scr_state == 0) 
X	exit_flag = TRUE;
X      else if (inven_ctr == 0) 
X	exit_flag = TRUE;
X      else if (!exit_flag) 
X	show_inven(com_val, inven_ctr-1);
X    }
X  while (!exit_flag);
X  if (scr_state != 0)  prt("You are currently carrying -", 0, 0);
X}
X
X/* Switch primary and secondary weapons		-RAK-	*/
Xswitch_weapon()
X{
X  vtype prt1, prt2;
X  treasure_type tmp_obj;
X
X  if (0x80000000 & inventory[22].flags)
X    {
X      objdes(prt1, 22, FALSE);
X      (void) sprintf(prt2,
X		     "The %s you are wielding appears to be cursed.", prt1);
X      msg_print(prt2);
X    }
X  else
X    {
X      /* Switch weapons        */
X      reset_flag = FALSE;
X      tmp_obj = inventory[33];
X      inventory[33] = inventory[22];
X      inventory[22] = tmp_obj;
X      py_bonuses(inventory[33], -1);     /* Subtract bonuses      */
X      py_bonuses(inventory[22], 1);      /* Add bonuses           */
X      if (inventory[22].tval != 0) 
X	{
X	  (void) strcpy(prt1, "Primary weapon   : ");
X	  objdes(prt2, 22, TRUE);
X	  msg_print(strcat(prt1, prt2));
X	}
X      if (inventory[33].tval != 0) 
X	{
X	  (void) strcpy(prt1, "Secondary weapon : ");
X	  objdes(prt2, 33, TRUE);
X	  msg_print(strcat(prt1, prt2));
X	}
X    }
X  if (scr_state != 0) 
X    {
X      msg_print("");
X      clear_screen(0, 0);
X      prt("You are currently using -", 0, 0);
X      show_equip(0);
X    }
X}
X
X
X/* Comprehensive function block to handle all inventory	-RAK-	*/
X/* and equipment routines.  Five kinds of calls can take place.  */
X/* Note that "?" is a special call for other routines to display */
X/* only a portion of the inventory, and take no other action.    */
Xint inven_command(command, r1, r2)
Xchar command;
Xint r1, r2;
X{
X  int com_val;
X  int exit_flag, test_flag;
X  int inven;
X
X  /* Main logic for INVEN_COMMAND			-RAK-	*/
X  inven = FALSE;
X  exit_flag = FALSE;
X  scr_state = 0;
X  do
X    {
X      switch(command)
X	{
X	case 'i':          /* Inventory     */
X	  if (inven_ctr == 0) 
X	    msg_print("You are not carrying anything.");
X	  else if (scr_state != 1) 
X	    {     /* Sets scr_state to 1           */
X	      clear_screen(0, 0);
X	      prt("You are currently carrying -", 0, 0);
X	      show_inven(0, inven_ctr-1);
X	    }
X	  break;
X	case 'e':         /* Equipment     */
X	  if (equip_ctr == 0) 
X	    msg_print("You are not using any equipment.");
X	  else if (scr_state != 2) 
X	    {     /* Sets scr_state to 2           */
X	      clear_screen(0, 0);
X	      prt("You are currently using -", 0, 0);
X	      show_equip(0);
X	    }
X	  break;
X	case 't':         /* Take off      */
X	  if (equip_ctr == 0) 
X	    msg_print("You are not using any equipment.");
X	  else if (inven_ctr > 21) 
X	    msg_print("You will have to drop something first.");
X	  else
X	    unwear();   /* May set scr_state to 2        */
X	  break;
X	case 'w':         /* Wear/wield    */
X	  if (inven_ctr == 0) 
X	    msg_print("You are not carrying anything.");
X	  else
X	    wear();     /* May set scr_state to 1        */
X	  break;
X	case 'x':
X	  if (inventory[22].tval != 0) 
X	    switch_weapon();
X	  else if (inventory[33].tval != 0) 
X	    switch_weapon();
X	  else
X	    msg_print("But you are wielding no weapons.");
X	  break;
X	  /* Special function for other routines                   */
X	case '?':  /* Displays part inven, returns  */
X	  show_inven(r1, r2);
X	  scr_state = 0;     /* Clear screen state    */
X	  break;
X	  /* Nonsense command                                      */
X	default:
X	  break;
X	}
X      if (scr_state > 0) 
X	{
X	  prt(
X    "<e>quip, <i>inven, <t>ake-off, <w>ear/wield, e<x>change, or ESC to exit.",
X      23, 1);
X	  test_flag = FALSE;
X	  do
X	    {
X	      inkey(&command);
X	      com_val = (command);
X	      switch(com_val)
X		{
X		case 0: case 27: case 32:
X		  /* Exit from module      */
X		  exit_flag = TRUE;
X		  test_flag = TRUE;
X		  break;
X		default:
X		  switch(command)      /* Module commands       */
X		    {
X		    case 'e': test_flag = TRUE; break;
X		    case 'i': test_flag = TRUE; break;
X		    case 't': test_flag = TRUE; break;
X		    case 'w': test_flag = TRUE; break;
X		    case 'x': test_flag = TRUE; break;
X		    case '?': break;      /* Trap special feature  */
X		    default:  break; /* Nonsense command      */
X		    }
X		}
X	    }
X	  while (!test_flag);
X	  prt("", 23, 0);
X	}
X      else
X	exit_flag = TRUE;
X    }
X  while (!exit_flag);
X  if (scr_state > 0)          /* If true, must redraw screen   */
X    inven = TRUE;
X  return(inven);
X}
X
X
X/* Get the ID of an item and return the CTR value of it	-RAK-	*/
Xint get_item(com_val, pmt, redraw, i, j)
Xint *com_val;
Xchar *pmt;
Xint *redraw;
Xint i, j;
X{
X  char command;
X  vtype out_val;
X  int test_flag;
X  int item;
X
X  item = FALSE;
X  *com_val = 0;
X  if (inven_ctr > 0) 
X    {
X      (void) sprintf(out_val,
X		     "(Items %c-%c, * for inventory list, ESC to exit) %s",
X	      i+97, j+97, pmt);
X      test_flag = FALSE;
X      prt(out_val, 0, 0);
X      do
X	{
X	  inkey(&command);
X	  *com_val = (command);
X	  switch(*com_val)
X	    {
X	    case 0: case 27:
X	      test_flag = TRUE;
X	      reset_flag = TRUE;
X	      break;
X	    case 42:
X	      clear_screen(1, 0);
X	      (void) inven_command('?', i, j);
X	      *redraw = TRUE;
X	      break;
X	    default:
X	      *com_val -= 97;
X	      if ((*com_val >= i) &&
X		  (*com_val <= j)) 
X		{
X		  test_flag = TRUE;
X		  item = TRUE;
X		}
X	      break;
X	    }
X	}
X      while (!test_flag);
X      erase_line(msg_line, msg_line);
X    }
X  else
X    msg_print("You are not carrying anything.");
X  return(item);
X}
X
X/* I may have written the town level code, but I'm not exactly   */
X/* proud of it.  Adding the stores required some real slucky     */
X/* hooks which I have not had time to re-think.          -RAK-   */
X
X
X/* Calculates current boundaries				-RAK-	*/
Xpanel_bounds()
X{
X  panel_row_min = panel_row*(SCREEN_HEIGHT/2);
X  panel_row_max = panel_row_min + SCREEN_HEIGHT - 1;
X  panel_row_prt = panel_row_min - 1;
X  panel_col_min = panel_col*(SCREEN_WIDTH/2);
X  panel_col_max = panel_col_min + SCREEN_WIDTH - 1;
X/* the value 13 puts one blank space between the stats and the map, leaving
X     the last column empty
X   the value 14 puts two blank spaces between the stats and the map, and
X     ends up printing in the last column
X   I think 14 gives a better display, but some curses wreak havoc when try to
X   print characters in the last column, hence the BUGGY_CURSES ifdef */
X#ifdef BUGGY_CURSES
X  panel_col_prt = panel_col_min - 13;
X#else
X  panel_col_prt = panel_col_min - 14;
X#endif
X}
X
X
X/* Given an row (y) and col (x), this routine detects  -RAK-	*/
X/* when a move off the screen has occurred and figures new borders*/
Xint get_panel(y, x)
Xint y, x;
X{
X  int prow, pcol;
X  int panel;
X
X  prow = panel_row;
X  pcol = panel_col;
X  if ((y < panel_row_min + 2) || (y > panel_row_max - 2)) 
X    {
X      prow = ((y - 2)/(SCREEN_HEIGHT/2));
X      if (prow > max_panel_rows) 
X	prow = max_panel_rows;
X    }
X  if ((x < panel_col_min + 3) || (x > panel_col_max - 3)) 
X    {
X      pcol = ((x - 3)/(SCREEN_WIDTH/2));
X      if (pcol > max_panel_cols) 
X	pcol = max_panel_cols;
X    }
X  if ((prow != panel_row) || (pcol != panel_col) || (!cave_flag)) 
X    {
X      panel_row = prow;
X      panel_col = pcol;
X      panel_bounds();
X      panel = TRUE;
X      cave_flag = TRUE;
X    }
X  else
X    panel = FALSE;
X  return(panel);
X}
X
X
X/* Tests a given point to see if it is within the screen -RAK-	*/
X/* boundaries.                                                    */
Xint panel_contains(y, x)
Xint y, x;
X{
X  int panel;
X
X  if ((y >= panel_row_min) && (y <= panel_row_max)) 
X    if ((x >= panel_col_min) && (x <= panel_col_max)) 
X      panel = TRUE;
X    else
X      panel = FALSE;
X  else
X    panel = FALSE;
X  return(panel);
X}
X
X
X/* Returns true if player has no light			-RAK-	*/
Xint no_light()
X{
X  int light;
X  cave_type *c_ptr;
X
X  light = FALSE;
X  c_ptr = &cave[char_row][char_col];
X    if (!c_ptr->tl) 
X      if (!c_ptr->pl) 
X	light = TRUE;
X  return(light);
X}
X
X
X/* map rogue_like direction commands into numbers */
Xint map_roguedir(comval)
Xint *comval;
X{
X  switch(*comval)
X    {
X    case 'h':
X      *comval = '4';
X      return(4);
X      break;
X    case 'y':
X      *comval = '7';
X      return(7);
X      break;
X    case 'k':
X      *comval = '8';
X      return(8);
X      break;
X    case 'u':
X      *comval = '9';
X      return(9);
X      break;
X    case 'l':
X      *comval = '6';
X      return(6);
X      break;
X    case 'n':
X      *comval = '3';
X      return(3);
X      break;
X    case 'j':
X      *comval = '2';
X      return(2);
X      break;
X    case 'b':
X      *comval = '1';
X      return(1);
X      break;
X    }
X  return(*comval - 48);
X}
X      
X
X
X/* Prompts for a direction				-RAK-	*/
Xint get_dir(prompt, dir, com_val, y, x)
Xchar *prompt;
Xint *dir, *com_val, *y, *x;
X{
X  int flag;
X  char command;
X  int res;
X
X  flag = FALSE;
X  do
X    {
X      if (get_com(prompt, &command)) 
X	{
X	  *com_val = (command);
X	  if (key_bindings == ORIGINAL)
X	    *dir = *com_val - 48;
X	  else   /* rogue_like bindings */
X	    *dir = map_roguedir(com_val);
X	  /* Note that "5" is not a valid direction        */
X	  if ((*dir >= 1) && (*dir <= 9) && (*dir != 5))
X	    {
X	      (void) move(*dir, y, x);
X	      flag = TRUE;
X	      res = TRUE;
X	    }
X	}
X      else
X	{
X	  reset_flag = TRUE;
X	  res = FALSE;
X	  flag = TRUE;
X	}
X    }
X  while (!flag);
X  return(res);
X}
X
X
X
X/* Moves creature record from one space to another	-RAK-	*/
Xmove_rec(y1, x1, y2, x2)
Xint y1, x1, y2, x2;
X{
X  if ((y1 != y2) || (x1 != x2)) 
X    {
X      cave[y2][x2].cptr = cave[y1][x1].cptr;
X      cave[y1][x1].cptr = 0;
X      }
X}
X
X
Xfind_light(y1, x1, y2, x2)
Xint y1, x1, y2, x2;
X{
X  int i, j, k, l;
X
X  for (i = y1; i <= y2; i++)
X    for (j = x1; j <= x2; j++)
X      if ((cave[i][j].fval == 1) || (cave[i][j].fval == 2))
X	{
X	  for (k = i-1; k <= i+1; k++)
X	    for (l = j-1; l <= j+1; l++)
X	      cave[k][l].pl = TRUE;
X	  cave[i][j].fval = 2;
X	}
X}
X
X
X/* Room is lit, make it appear				-RAK-	*/
Xlight_room(y, x)
Xint y, x;
X{
X  int tmp1, tmp2;
X  int start_row, start_col;
X  int end_row, end_col;
X  int i, j;
X  int ypos, xpos;
X  vtype floor_str, tmp_str;
X  cave_type *c_ptr;
X
X  tmp1 = (SCREEN_HEIGHT/2);
X  tmp2 = (SCREEN_WIDTH /2);
X  start_row = (y/tmp1)*tmp1;
X  start_col = (x/tmp2)*tmp2;
X  end_row = start_row + tmp1 - 1;
X  end_col = start_col + tmp2 - 1;
X  find_light(start_row, start_col, end_row, end_col);
X  for (i = start_row; i <= end_row; i++)
X    {
X      floor_str[0] = '\0';
X      ypos = i;
X      for (j = start_col; j <= end_col; j++)
X	{
X	  c_ptr = &cave[i][j];
X	  if ((c_ptr->pl) || (c_ptr->fm)) 
X	    {
X	      if (strlen(floor_str) == 0) 
X		xpos = j;
X	      loc_symbol(i, j, tmp_str);
X	      tmp_str[1] = '\0';
X	      (void) strcat(floor_str, tmp_str);
X	    }
X	  else
X	    if (strlen(floor_str) > 0) 
X	      {
X		print(floor_str, ypos, xpos);
X		floor_str[0] = '\0';
X	      }
X	}
X      if (strlen(floor_str) > 0) 
X	print(floor_str, ypos, xpos);
X    }
X}
X
X
X/* Lights up given location				-RAK-	*/
Xlite_spot(y, x)
Xint y, x;
X{
X  vtype spot_char;
X  char temp[2];
X
X  temp[1] = '\0';
X  if (panel_contains(y, x)) 
X    {
X      loc_symbol(y, x, temp);
X      (void) strcpy(spot_char, temp);
X      print(spot_char, y, x);
X      }
X}
X
X
X/* Blanks out given location				-RAK-	*/
Xunlite_spot(y, x)
Xint y, x;
X{
X  if (panel_contains(y, x)) 
X    print(" ", y, x);
X}
X
X
X/* Minimum of a maximum				-RAK-	*/
Xint minmax(x, y, z)
Xint x, y, z;
X{
X  int max;
X
X  max = ( y > x ? y : x) + 1;
X  return((max > z ? z : max));
X}
X  
X/* Maximum of a minimum				-RAK-	*/
Xint maxmin(x, y, z)
Xint x, y, z;
X{
X  int min;
X
X  min = (x > y ? y : x) - 1;
X  return((min > z ? min : z));
X}
X
X
X/* Given two sets of points,  draw the block		*/
Xdraw_block(y1, x1, y2, x2)
Xint y1, x1, y2, x2;
X{
X  int i, j, xpos;
X  int topp, bott, left, righ;
X  int new_topp, new_bott, new_left, new_righ;
X  vtype floor_str, save_str;
X  char tmp_char[2];
X  int flag;
X  cave_type *c_ptr;
X
X  tmp_char[1] = '\0';    /* This is supposed to be a one */
X  /* From uppermost to bottom most lines player was on...  */
X  /* Points are guaranteed to be on the screen (I hope...) */
X  topp = maxmin(y1, y2, panel_row_min);
X  bott = minmax(y1, y2, panel_row_max);
X  left = maxmin(x1, x2, panel_col_min);
X  righ = minmax(x1, x2, panel_col_max);
X  new_topp = y2 - 1;     /* Margins for new things to appear*/
X  new_bott = y2 + 1;
X  new_left = x2 - 1;
X  new_righ = x2 + 1;
X  for (i = topp; i <= bott; i++)
X    {
X      floor_str[0] = '\0';    /* Null out print string         */
X      xpos      = -1;
X      save_str[0] = '\0';
X      for (j = left; j <= righ; j++)   /* Leftmost to rightmost do*/
X	{
X	  c_ptr = &cave[i][j];
X	  if ((c_ptr->pl) || (c_ptr->fm)) 
X	    if (((i==y1) && (j==x1)) || ((i==y2) && (j==x2))) 
X	      flag = TRUE;
X	    else
X	      flag = FALSE;
X	  else
X	    {
X	      flag = TRUE;
X	      if (((i >= new_topp) && (i <= new_bott)) &&
X		  ((j >= new_left) && (j <= new_righ))) 
X		{
X		  if (c_ptr->tl) 
X		    if (((c_ptr->fval >= 10) && (c_ptr->fval <= 12)) ||
X			(c_ptr->fval == 15))
X		      c_ptr->pl = TRUE;
X		    else if (c_ptr->tptr != 0) 
X		      if ((t_list[c_ptr->tptr].tval >= 102) &&
X			  (t_list[c_ptr->tptr].tval <= 110) &&
X			  (t_list[c_ptr->tptr].tval != 106))
X			if (!c_ptr->fm) 
X			  c_ptr->fm = TRUE;
X		}
X	    }
X	  if ((c_ptr->pl) || (c_ptr->tl) || (c_ptr->fm)) 
X	    loc_symbol(i, j, tmp_char);
X	  else
X	    tmp_char[0] = ' ';
X	  if (py.flags.image > 0) 
X	    if (randint(12) == 1) 
X	      tmp_char[0] = (randint(95) + 31);
X	  if (flag) 
X	    {
X	      if (xpos < 0)  xpos = j;
X	      if (strlen(save_str) > 0) 
X		{
X		  (void) strcat(floor_str, save_str);
X		  save_str[0] = '\0';
X		}
X	      (void) strcat(floor_str, tmp_char);
X	    }
X	  else if (xpos >= 0) 
X	    (void) strcat(save_str, tmp_char);
X	}
X      if (xpos >= 0) 
X	{
X	  print(floor_str, i, xpos);
X	}
X    }
X}
X
X
X/* Normal movement					*/
Xsub1_move_light(y1, x1, y2, x2)
Xint y1, x1, y2, x2;
X{
X  int i, j;
X  
X  light_flag = TRUE;
X  for (i = y1-1; i <= y1+1; i++)       /* Turn off lamp light   */
X    for (j = x1-1; j <= x1+1; j++)
X      cave[i][j].tl = FALSE;
X  for (i = y2-1; i <= y2+1; i++)
X    for (j = x2-1; j <= x2+1; j++)
X      cave[i][j].tl = TRUE;
X  draw_block(y1, x1, y2, x2);        /* Redraw area           */
X}
X
X/* When FIND_FLAG,  light only permanent features 	*/
Xsub2_move_light(y1, x1, y2, x2)
Xint y1, x1, y2, x2;
X{
X  int i, j, xpos;
X  vtype floor_str, save_str;
X  char tmp_char[2];
X  int flag;
X  cave_type *c_ptr;
X
X  tmp_char[1] = '\0';
X  if (light_flag) 
X    {
X      for (i = y1-1; i <= y1+1; i++)
X	for (j = x1-1; j <= x1+1; j++)
X	  cave[i][j].tl = FALSE;
X      draw_block(y1, x1, y1, x1);
X      light_flag = FALSE;
X    }
X  for (i = y2-1; i <= y2+1; i++)
X    {
X      floor_str[0] = '\0';
X      save_str[0] = '\0';
X      xpos = 0;
X      for (j = x2-1; j <= x2+1; j++)
X	{
X	  c_ptr = &cave[i][j];
X	  flag = FALSE;
X	  if ((!c_ptr->fm) && (!c_ptr->pl))
X	    {
X	      tmp_char[0] = ' ';
X	      if (player_light) 
X		if (((c_ptr->fval >= 10) && (c_ptr->fval <= 12)) ||
X		    (c_ptr->fval == 15))
X		  {
X		    c_ptr->pl = TRUE; /* Turn on perm light    */
X		    loc_symbol(i, j, tmp_char);
X		    flag = TRUE;
X		  }
X		else
X		  if (c_ptr->tptr != 0) 
X		      if ((t_list[c_ptr->tptr].tval >= 102) &&
X			  (t_list[c_ptr->tptr].tval <= 110) &&
X			  (t_list[c_ptr->tptr].tval != 106))
X		      {
X			c_ptr->fm = TRUE;     /* Turn on field marker  */
X			loc_symbol(i, j, tmp_char);
X			flag = TRUE;
X		      }
X	    }
X	  else
X	    loc_symbol(i, j, tmp_char);
X	  if (flag) 
X	    {
X	      if (xpos == 0)  xpos = j;
X	      if (strlen(save_str) > 0) 
X		{
X		  (void) strcat(floor_str, save_str);
X		  save_str[0] = '\0';
X		}
X	      (void) strcat(floor_str, tmp_char);
X	    }
X	  else if (xpos > 0) 
X	    (void) strcat(save_str, tmp_char);
X	}
X      if (xpos > 0) 
X	{
X	  j = i;
X	  print(floor_str, j, xpos);
X	}
X    }
X}
X
X/* When blinded,  move only the player symbol...		*/
Xsub3_move_light(y1, x1, y2, x2)
Xint y1, x1, y2, x2;
X{
X  int i, j;
X
X  if (light_flag) 
X    {
X      for (i = y1-1; i <= y1+1; i++)
X	for (j = x1-1; j <= x1+1; j++)
X	  cave[i][j].tl = FALSE;
X      light_flag = FALSE;
X    }
X  print(" ", y1, x1);
X  print("@", y2, x2);
X}
X
X/* With no light,  movement becomes involved...		*/
Xsub4_move_light(y1, x1, y2, x2)
Xint y1, x1, y2, x2;
X{
X  int i, j;
X
X  light_flag = TRUE;
X  if (cave[y1][x1].tl) 
X    {
X      for (i = y1-1; i <= y1+1; i++)
X	for (j = x1-1; j <= x1+1; j++)
X	  {
X	    cave[i][j].tl = FALSE;
X	    if (test_light(i, j)) 
X	      lite_spot(i, j);
X	    else
X	      unlite_spot(i, j);
X	  }
X    }
X  else if (test_light(y1, x1)) 
X    lite_spot(y1, x1);
X  else
X    unlite_spot(y1, x1);
X  print("@", y2, x2);
X}
X
X/* Package for moving the character's light about the screen     */
X/* Three cases : Normal,  Finding, and Blind              -RAK-   */
Xmove_light(y1, x1, y2, x2)
Xint y1, x1, y2, x2;
X{
X  if (py.flags.blind > 0) 
X    sub3_move_light(y1, x1, y2, x2);
X  else if (find_flag) 
X    sub2_move_light(y1, x1, y2, x2);
X  else if (!player_light) 
X    sub4_move_light(y1, x1, y2, x2);
X  else
X    sub1_move_light(y1, x1, y2, x2);
X}
X
X
X/* Returns random co-ordinates				-RAK-	*/
Xnew_spot(y, x)
Xint *y, *x;
X{
X  do
X    {
X      *y = randint(cur_height) - 1;
X      *x = randint(cur_width) - 1;
X    }
X  while ((!cave[*y][*x].fopen) || (cave[*y][*x].cptr != 0) ||
X	   (cave[*y][*x].tptr != 0));
X}
X
X
X/* Search Mode enhancement				-RAK-	*/
Xsearch_on()
X{
X  search_flag = TRUE;
X  change_speed(1);
X  py.flags.status |= 0x00000100;
X  prt_search();
X  py.flags.food_digested++;
X}
X
Xsearch_off()
X{
X  search_flag = FALSE;
X  find_flag = FALSE;
X  move_char(5);
X  change_speed(-1);
X  py.flags.status &= 0xFFFFFEFF;
X  prt_search();
X  py.flags.food_digested--;
X}
X
X
X/* Resting allows a player to safely restore his hp	-RAK-	*/
Xrest()
X{
X  int rest_num;
X  vtype rest_str;
X
X  prt("Rest for how long? ", 0, 0);
X  rest_num = 0;
X  if (get_string(rest_str, 0, 19, 10))
X    (void) sscanf(rest_str, "%d", &rest_num);
X  if (rest_num > 0) 
X    {
X      if (search_flag) 
X	search_off();
X      py.flags.rest = rest_num;
X      py.flags.status |= 0x00000200;
X      prt_rest();
X      py.flags.food_digested--;
X      msg_print("Press ^C to wake up...");
X      put_qio();
X    }
X  else
X    erase_line(msg_line, msg_line);
X}
X
Xrest_off()
X{
X  py.flags.rest = 0;
X  py.flags.status &= 0xFFFFFDFF;
X  erase_line(0, 0);
X  prt_rest();
X  py.flags.food_digested++;
X}
X
X
X/* Attacker's level and plusses,  defender's AC		-RAK-	*/
Xint test_hit(bth, level, pth, ac)
Xint bth, level, pth, ac;
X{
X  int i;
X  int test;
X
X  if (search_flag) 
X    search_off();
X  if (py.flags.rest > 0) 
X    rest_off();
X  i = bth + level*BTH_LEV_ADJ + pth*BTH_PLUS_ADJ;
X  /* pth could be less than 0 if player wielding weapon too heavy for him */
X  if ((i > 0) && (randint(i) > ac))               /* Normal hit            */
X    test = TRUE;
X  else if (randint(20) == 1)           /* Always hit 1/20       */
X    test = TRUE;
X  else                                    /* Missed                */
X    {
X      if (i <= 0)
X	msg_print("You have trouble swinging such a heavy weapon.");
X      test = FALSE;
X    }
X  return(test);
X}
X
X
X/* Decreases players hit points and sets death flag if necessary*/
X/*                                                       -RAK-   */
Xtake_hit(damage, hit_from)
Xint damage;
Xchar *hit_from;
X{
X  if (py.flags.invuln > 0)  damage = 0;
X  py.misc.chp -= (double)damage;
X  if (search_flag)  search_off();
X  if (py.flags.rest > 0)  rest_off();
X  flush();
X  if (py.misc.chp <= -1) 
X    {
X      if (!death) 
X	{             /* Hee,  hee... Ain't I mean?     */
X	  death = TRUE;
X	  (void) strcpy(died_from, hit_from);
X	  total_winner = FALSE;
X	}
X      moria_flag = TRUE;
X    }
X  else
X    prt_chp();
X}
X
X
X/* Given speed,  returns number of moves this turn.	-RAK-	*/
X/* NOTE: Player must always move at least once per iteration,     */
X/*       a slowed player is handled by moving monsters faster    */
Xint movement_rate(speed)
Xint speed;
X{
X  int rate;
X
X  if (speed > 0) 
X    if (py.flags.rest > 0) 
X      rate = 1;
X    else
X      rate = speed;
X  else
X    {
X      if ((turn % (abs(speed) + 2)) == 0) 
X	rate = 1;
X      else
X	rate = 0;
X    }
X  return(rate);
X}
X
X
X/* Regenerate hit points 				-RAK-	*/
Xregenhp(percent)
Xdouble percent;
X{
X  struct misc *p_ptr;
X
X  p_ptr = &py.misc;
X  p_ptr->chp += p_ptr->mhp*percent + PLAYER_REGEN_HPBASE;
X}
X
X
X/* Regenerate mana points				-RAK-	*/
Xregenmana(percent)
Xdouble percent;
X{
X  struct misc *p_ptr;
X  p_ptr = &py.misc;
X  p_ptr->cmana += p_ptr->mana*percent + PLAYER_REGEN_MNBASE;
X}
X
X
X/* Change a trap from invisible to visible		-RAK-	*/
X/* Note: Secret doors are handled here                           */
Xchange_trap(y, x)
Xint y, x;
X{
X  int k;
X  cave_type *c_ptr;
X
X  c_ptr = &cave[y][x];
X  if ((t_list[c_ptr->tptr].tval == 101) || (t_list[c_ptr->tptr].tval == 109))
X    {
X      k = c_ptr->tptr;
X      place_trap(y, x, 2, t_list[k].subval-1);
X      pusht(k);
X      lite_spot(y, x);
X    }
X}
X
X
X/* Searches for hidden things... 			-RAK-	*/
Xsearch(y, x, chance)
Xint y, x, chance;
X{
X  int i, j;
X  struct flags *p_ptr;
X  cave_type *c_ptr;
X  treasure_type *t_ptr;
X  vtype tmp_str;
X
X  p_ptr = &py.flags;
X  if (p_ptr->confused+p_ptr->blind > 0) 
X    chance /= 10.0;
X  else if (no_light()) 
X    chance /= 5.0;
X  for (i = (y - 1); i <= (y + 1); i++)
X    for (j = (x - 1); j <= (x + 1); j++)
X      if (in_bounds(i, j)) 
X	if ((i != y) || (j != x)) 
X	  if (randint(100) < chance) 
X	    {
X	      c_ptr = &cave[i][j];
X	      /* Search for hidden objects             */
X	      if (c_ptr->tptr != 0) 
X		{
X		  t_ptr = &t_list[c_ptr->tptr];
X		  /* Trap on floor?                */
X		  if (t_ptr->tval == 101) 
X		    {
X		      (void) sprintf(tmp_str,"You have found %s.",t_ptr->name);
X		      msg_print(tmp_str);
X		      change_trap(i, j);
X		      find_flag = FALSE;
X		    }
X		  /* Secret door?                  */
X		  else if (t_ptr->tval == 109) 
X		    {
X		      msg_print("You have found a secret door.");
X		      c_ptr->fval = corr_floor2.ftval;
X		      change_trap(i, j);
X		      find_flag = FALSE;
X		    }
X		  /* Chest is trapped?             */
X		  else if (t_ptr->tval == 2) 
X		    {
X		      if (t_ptr->flags > 1) 
X			if (index(t_ptr->name, '^') != 0) 
X			  {
X			    known2(t_ptr->name);
X		         msg_print("You have discovered a trap on the chest!");
X			  }
X		      else
X			{
X			  msg_print("The chest is empty.");
X			  known2(t_ptr->name);
X			}
X		    }
X		}
X	    }
X}
X
X
X/* Turns off Find_flag if something interesting appears	-RAK-	*/
X/* BUG: Does not handle corridor/room corners, but I didn't want */
X/*      to add a lot of checking for such a minor detail         */
Xarea_affect(dir, y, x)
Xint dir, y, x;
X{
X  int z[3];
X  int i, row, col;
X  cave_type *c_ptr;
X  monster_type *m_ptr;
X
X  if (cave[y][x].fval == 4) 
X    {
X      i = 0;
X      if (next_to4(y, x, 4, 5, 6) > 2) 
X	find_flag = FALSE;
X    }
X  if ((find_flag) && (py.flags.blind < 1)) 
X    {
X      switch(dir)
X	{
X	case 1:
X	  z[0] = 4;
X	  z[1] = 1;
X	  z[2] = 3;
X	  break;
X	case 2:
X	  z[0] = 4;
X	  z[1] = 2;
X	  z[2] = 6;
X	  break;
X	case 3:
X	  z[0] = 2;
X	  z[1] = 3;
X	  z[2] = 6;
X	  break;
X	case 4:
X	  z[0] = 8;
X	  z[1] = 4;
X	  z[2] = 2;
X	  break;
X	case 6:
X	  z[0] = 2;
X	  z[1] = 6;
X	  z[2] = 8;
X	  break;
X	case 7:
X	  z[0] = 8;
X	  z[1] = 7;
X	  z[2] = 4;
X	  break;
X	case 8:
X	  z[0] = 4;
X	  z[1] = 8;
X	  z[2] = 6;
X	  break;
X	case 9:
X	  z[0] = 8;
X	  z[1] = 9;
X	  z[2] = 6;
X	  break;
X	}
X      for (i = 0; i < 3; i++)
X	{
X	  row = y;
X	  col = x;
X	  if (move(z[i], &row, &col)) 
X	    {
X	      c_ptr = &cave[row][col];
X	      /* Empty doorways        */
X	      if (c_ptr->fval == 5) 
X		find_flag = FALSE;
X	      /* Objects player can see*/
X	      /* Including doors       */
X	      if (find_flag) 
X		if (player_light) 
X		  {
X		    if (c_ptr->tptr != 0) 
X		      if ((t_list[c_ptr->tptr].tval != 101) &&
X			  (t_list[c_ptr->tptr].tval != 109))
X			find_flag = FALSE;
X		  }
X		else if ((c_ptr->tl) || (c_ptr->pl) || (c_ptr->fm)) 
X		  if (c_ptr->tptr != 0) 
X		    if ((t_list[c_ptr->tptr].tval != 101) &&
X			(t_list[c_ptr->tptr].tval != 109))
X		      find_flag = FALSE;
X	      /* Creatures             */
X	      if (find_flag) 
X		if ((c_ptr->tl) || (c_ptr->pl) || (player_light)) 
X		  if (c_ptr->cptr > 1) 
X		    {
X		      m_ptr = &m_list[c_ptr->cptr];
X		      if (m_ptr->ml) 
X			find_flag = FALSE;
X		    }
X	    }
X	}
X    }
X}
X
X
X/* Picks new direction when in find mode 		-RAK-	*/
Xint pick_dir(dir)
Xint dir;
X{
X  int z[2];
X  int i, y, x;
X  int pick;
X
X  if ((find_flag) && (next_to4(char_row, char_col, 4, 5, -1) == 2)) 
X    {
X      switch(dir)
X	{
X	case 1:
X	  z[0] = 2;
X	  z[1] = 4;
X	  break;
X	case 2:
X	  z[0] = 4;
X	  z[1] = 6;
X	  break;
X	case 3:
X	  z[0] = 2;
X	  z[1] = 6;
X	  break;
X	case 4:
X	  z[0] = 2;
X	  z[1] = 8;
X	  break;
X	case 6:
X	  z[0] = 2;
X	  z[1] = 8;
X	  break;
X	case 7:
X	  z[0] = 4;
X	  z[1] = 8;
X	  break;
X	case 8:
X	  z[0] = 4;
X	  z[1] = 6;
X	  break;
X	case 9:
X	  z[0] = 6;
X	  z[1] = 8;
X	  break;
X	}
X      pick = FALSE;
X      for (i = 0; i < 2; i++)
X	{
X	  y = char_row;
X	  x = char_col;
X	  if (move(z[i], &y, &x)) 
X	    if (cave[y][x].fopen) 
X	      {
X		pick = TRUE;
X		global_com_val = z[i] + 48;
X		}
X	}
X    }
X  else
X    {
X      pick = FALSE;
X    }
X  return(pick);
X}
X
X
X/* AC gets worse 					-RAK-	*/
X/* Note: This routine affects magical AC bonuses so that stores   */
X/*       can detect the damage.                                  */
Xint minus_ac(typ_dam)
Xint typ_dam;
X{
X  int i, j;
X  int tmp[5];
X  int minus;
X  treasure_type *i_ptr;
X  vtype out_val, tmp_str;
X  
X  i = 0;
X  if (inventory[25].tval != 0) 
X    {
X      tmp[i] = 25;
X      i++;
X    }
X  if (inventory[26].tval != 0) 
X    {
X      tmp[i] = 26;
X      i++;
X    }
X  if (inventory[31].tval != 0) 
X    {
X      tmp[i] = 31;
X      i++;
X    }
X  if (inventory[27].tval != 0) 
X    {
X      tmp[i] = 27;
X      i++;
X    }
X  if (inventory[23].tval != 0) 
X    {
X      tmp[i] = 23;
X      i++;
X    }
X  minus = FALSE;
X  if (i > 0) 
X    {
X      j = tmp[randint(i) - 1];
X      i_ptr = &inventory[j];
X      if (i_ptr->flags & typ_dam)
X	{
X	  objdes(tmp_str, j, FALSE);
X	  (void) sprintf(out_val, "Your %s resists damage!", tmp_str);
X	  msg_print(out_val);
X	  minus = TRUE;
X	}
X      else if ((i_ptr->ac+i_ptr->toac) > 0) 
X	{
X	  objdes(tmp_str, j, FALSE);
X	  (void) sprintf(out_val, "Your %s is damaged!", tmp_str);
X	  msg_print(out_val);
X	  i_ptr->toac--;
X	  py_bonuses(blank_treasure, 0);
X	  minus = TRUE;
X	}
X    }
X  return(minus);
X}
X
X
X/* Corrode the unsuspecting person's armor               -RAK-   */
Xcorrode_gas(kb_str)
Xchar *kb_str;
X{
X  int set_corrodes();
X
X  if (!minus_ac((int)0x00100000)) 
X    take_hit(randint(8), kb_str);
X  print_stat |= 0x0040;
X  if (inven_damage(set_corrodes, 5) > 0) 
X    msg_print("There is an acrid smell coming from your pack.");
X}
X
X
X/* Poison gas the idiot...				-RAK-	*/
Xpoison_gas(dam, kb_str)
Xint dam;
Xchar *kb_str;
X{
X  take_hit(dam, kb_str);
X  print_stat |= 0x0040;
X  py.flags.poisoned += 12 + randint(dam);
X}
X
X
X/* Burn the fool up...					-RAK-	*/
Xfire_dam(dam, kb_str)
Xint dam;
Xchar *kb_str;
X{
X  int set_flammable();
X
X  if (py.flags.fire_resist)
X    dam /= 3;
X  if (py.flags.resist_heat > 0) 
X    dam /= 3;
X  take_hit(dam, kb_str);
X  print_stat |= 0x0080;
X  if (inven_damage(set_flammable, 3) > 0) 
X    msg_print("There is smoke coming from your pack!");
X}
X
X
X/* Freeze him to death...				-RAK-	*/
Xcold_dam(dam, kb_str)
Xint dam;
Xchar *kb_str;
X{
X  int set_frost_destroy();
X
X  if (py.flags.cold_resist)
X    dam /= 3;
X  if (py.flags.resist_cold > 0) 
X    dam /= 3;
X  take_hit(dam, kb_str);
X  print_stat |= 0x0080;
X  if (inven_damage(set_frost_destroy, 5) > 0) 
X    msg_print("Something shatters inside your pack!");
X}
X
X
X/* Lightning bolt the sucker away...			-RAK-	*/
Xlight_dam(dam, kb_str)
Xint dam;
Xchar *kb_str;
X{
X  if (py.flags.lght_resist) 
X    take_hit((dam / 3), kb_str);
X  else
X    take_hit(dam, kb_str);
X  print_stat |= 0x0080;
X}
X
X
X/* Throw acid on the hapless victim			-RAK-	*/
Xacid_dam(dam, kb_str)
Xint dam;
Xchar *kb_str;
X{
X  int flag;
X  int set_acid_affect();
X
X  flag = 0;
X  if (minus_ac((int)0x00100000)) 
X    flag = 1;
X  if (py.flags.acid_resist) 
X    flag += 2;
X  switch(flag)
X    {
X    case 0: take_hit(dam, kb_str);       break;
X    case 1: take_hit((dam / 2), kb_str); break;
X    case 2: take_hit((dam / 3), kb_str); break;
X    case 3: take_hit((dam / 4), kb_str); break;
X    }
X  print_stat |= 0x00C0;
X  if (inven_damage(set_acid_affect, 3) > 0) 
X    msg_print("There is an acrid smell coming from your pack!");
X}
END_OF_moria1.c
if test 44858 -ne `wc -c <moria1.c`; then
    echo shar: \"moria1.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 5 \(of 16\).
cp /dev/null ark5isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 16 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0