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

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

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




#! /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 14 (of 16)."
# Contents:  files.c generate.c
# Wrapped by billr@tekred on Wed Nov  4 10:00:13 1987
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f files.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"files.c\"
else
echo shar: Extracting \"files.c\" \(25891 characters\)
sed "s/^X//" >files.c <<'END_OF_files.c'
X#include <stdio.h>
X#ifdef USG
X#include <string.h>
X#include <fcntl.h>
X#else
X#include <strings.h>
X#include <sys/file.h>
X#endif
X
X#include "config.h"
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#if defined(ultrix) || defined(USG)
Xvoid exit();
X#endif
X
X/*
X *  init_scorefile
X *  Open the score file while we still have the setuid privileges.  Later
X *  when the score is being written out, you must be sure to flock the file
X *  so we don't have multiple people trying to write to it at the same time.
X *  Craig Norborg (doc)		Mon Aug 10 16:41:59 EST 1987
X */
Xinit_scorefile()
X{
X  if (1 > (highscore_fd = open(MORIA_TOP, O_RDWR | O_CREAT, 0644)))
X    {
X      (void) fprintf(stderr, "Can't open score file!\n");
X      exit(1);
X    }
X}
X
X/* Attempt to open the intro file			-RAK-	 */
X/* This routine also checks the hours file vs. what time it is	-Doc */
Xintro(finam)
Xchar *finam;
X{
X  int xpos, i;
X  vtype in_line;
X  FILE *file1;
X  char *string;
X  
X  /* Attempt to read hours.dat.  If it does not exist,     */
X  /* inform the user so he can tell the wizard about it	 */
X  if ((file1 = fopen(MORIA_HOU, "r")) != NULL)
X    {
X      while (fgets(in_line, 80, file1) != NULL)
X	if (strlen(in_line) > 3)
X	  {
X	    if (!strncmp(in_line, "SUN:", 4))
X	      (void) strcpy(days[0], in_line);
X	    else if (!strncmp(in_line, "MON:", 4))
X	      (void) strcpy(days[1], in_line);
X	    else if (!strncmp(in_line, "TUE:", 4))
X	      (void) strcpy(days[2], in_line);
X	    else if (!strncmp(in_line, "WED:", 4))
X	      (void) strcpy(days[3], in_line);
X	    else if (!strncmp(in_line, "THU:", 4))
X	      (void) strcpy(days[4], in_line);
X	    else if (!strncmp(in_line, "FRI:", 4))
X	      (void) strcpy(days[5], in_line);
X	    else if (!strncmp(in_line, "SAT:", 4))
X	      (void) strcpy(days[6], in_line);
X	  }
X      (void) fclose(file1);
X    }
X  else
X    {
X      (void) fprintf(stderr, "There is no hours file.\nPlease inform the wizard, %s, so he can correct this!\n", WIZARD);
X      exit_game();
X    }
X  
X  /* Check the hours, if closed  require password	 */
X  string = index(finam, '^');
X  if (string)
X    xpos = strlen(finam) - strlen(string);
X  else
X    xpos = -1;
X  if (xpos >= 0)
X    if (check_pswd())
X      insert_str(finam, "^", "");
X  if (!check_time())
X    {
X      if (!wizard1)
X	{
X	  if ((file1 = fopen(MORIA_HOU, "r")) != NULL)
X	    {
X	      clear_screen(0, 0);
X	      for (i = 0; fgets(in_line, 80, file1) != NULL; i++)
X		prt(in_line, i, 0);
X	      (void) fclose(file1);
X	    }
X	  exit_game();
X	}
X    }
X  
X  /* Print the introduction message, news, ect...		 */
X  if ((file1 = fopen(MORIA_MOR, "r")) != NULL)
X    {
X      clear_screen(0, 0);
X      for (i = 0; fgets(in_line, 80, file1) != NULL; i++)
X	prt(in_line, i, 0);
X      pause_line(23);
X      (void) fclose(file1);
X    }
X}
X
X
X/* Prints dungeon map to external file			-RAK-	 */
Xprint_map()
X{
X  int i, j, k, l, m, n, i7, i8;
X  char dun_line[MAX_WIDTH];
X  vtype filename1;
X  char tmp;
X  char tmp_str[80];
X  FILE *file1;
X  int page_width = OUTPAGE_WIDTH;
X  int page_height = OUTPAGE_HEIGHT;
X  
X  prt("File name: ", 0, 0);
X  if (get_string(filename1, 0, 11, 64))
X    {
X      if (strlen(filename1) == 0)
X	(void) strcpy(filename1, "MORIAMAP.DAT");
X      if ((file1 = fopen(filename1, "w")) == NULL)
X	{
X	  (void) sprintf(dun_line, "Cannot open file %s", filename1);
X	  prt(dun_line, 0, 0);
X	  put_qio();
X	  return;
X	}
X      (void) sprintf(tmp_str, "section width (default = %d char):", page_width);
X      prt(tmp_str, 0, 0);
X      (void) get_string(tmp_str, 0, strlen(tmp_str), 10);
X      (void) sscanf(tmp_str, "%d", &page_width);
X      if (page_width < 10)
X	page_width = 10;
X      
X      (void) sprintf(tmp_str, "section height (default = %d lines):", page_height);
X      prt(tmp_str, 0, 0);
X      (void) get_string(tmp_str, 0, strlen(tmp_str), 10);
X      (void) sscanf(tmp_str, "%d", &page_height);
X      if (page_height < 10)
X	page_height = 10;
X      
X      prt("Writing Moria Dungeon Map...", 0, 0);
X      put_qio();
X      
X      i = 0;
X      i7 = 0;
X      do
X	{
X	  j = 0;
X	  k = i + page_height - 1;
X	  if (k >= cur_height)
X	    k = cur_height - 1;
X	  i7++;
X	  i8 = 0;
X	  do
X	    {
X	      l = j + page_width - 1;
X	      if (l >= cur_width)
X		l = cur_width - 1;
X	      i8++;
X	      (void) fprintf(file1, "%c\n", 12);
X	      (void) fprintf(file1, "Section[%d,%d];     ", i7, i8);
X	      (void) fprintf(file1, "Depth : %d (feet)\n", (dun_level * 50));
X	      (void) fprintf(file1, "\n");
X	      (void) fprintf(file1, "   ");
X	      for (m = j; m <= l; m++)
X		{
X		  n = (m / 100);
X		  (void) fprintf(file1, "%d", n);
X		}
X	      (void) fprintf(file1, "\n");
X	      (void) fprintf(file1, "   ");
X	      for (m = j; m <= l; m++)
X		{
X		  n = (m / 10) - (m / 100) * 10;
X		  (void) fprintf(file1, "%d", n);
X		}
X	      (void) fprintf(file1, "\n");
X	      (void) fprintf(file1, "   ");
X	      for (m = j; m <= l; m++)
X		{
X		  n = m - (m / 10) * 10;
X		  (void) fprintf(file1, "%d", n);
X		}
X	      (void) fprintf(file1, "\n");
X	      for (m = i; m <= k; m++)
X		{
X		  (void) sprintf(dun_line, "%2d ", m);
X		  for (n = j; n <= l; n++)
X		    {
X		      if (test_light(m, n))
X			loc_symbol(m, n, &tmp);
X		      else
X			tmp = ' ';
X		      (void) sprintf(dun_line, "%s%c", dun_line, tmp);
X		    }
X		  (void) fprintf(file1, "%s\n", dun_line);
X		}
X	      j += page_width;
X	    }
X	  while (j < cur_width);
X	  i += page_height;
X	}
X      while (i < cur_height);
X      (void) fclose(file1);
X      prt("Completed.", 0, 0);
X    }
X}
X
X
X/* Prints a list of random objects to a file.  Note that -RAK-	 */
X/* the objects produced is a sampling of objects which           */
X/* be expected to appear on that level.                          */
Xprint_objects()
X{
X  int nobj, i, j, level;
X  vtype filename1, tmp_str;
X  FILE *file1;
X  treasure_type *i_ptr;
X
X  prt("Produce objects on what level?: ", 0, 0);
X  level = 0;
X  if (get_string(tmp_str, 0, 32, 10))
X    (void) sscanf(tmp_str, "%d", &level);
X  prt("Produce how many objects?: ", 0, 0);
X  nobj = 0;
X  if (!get_string(tmp_str, 0, 27, 10))
X    (void) sscanf(tmp_str, "%d", &nobj);
X  if ((nobj > 0) && (level > -1) && (level < 1201))
X    {
X      if (nobj > 9999)
X	nobj = 9999;
X      prt("File name: ", 0, 0);
X      if (get_string(filename1, 0, 11, 64))
X	{
X	  if (strlen(filename1) == 0)
X	    (void) strcpy(filename1, "MORIAOBJ.DAT");
X	  if ((file1 = fopen(filename1, "w")) != NULL)
X	    {
X	      (void) sprintf(tmp_str, "%d", nobj);
X	      prt(strcat(tmp_str, " random objects being produced..."), 0, 0);
X	      put_qio();
X	      (void) fprintf(file1, "*** Random Object Sampling:\n");
X	      (void) fprintf(file1, "*** %d objects\n", nobj);
X	      (void) fprintf(file1, "*** For Level %d\n", level);
X	      (void) fprintf(file1, "\n");
X	      (void) fprintf(file1, "\n");
X	      popt(&j);
X	      for (i = 0; i < nobj; i++)
X		{
X		  t_list[j] = object_list[get_obj_num(level)];
X		  magic_treasure(j, level);
X		  inventory[INVEN_MAX] = t_list[j];
X		  i_ptr = &inventory[INVEN_MAX];
X		  unquote(i_ptr->name);
X		  known1(i_ptr->name);
X		  known2(i_ptr->name);
X		  objdes(tmp_str, INVEN_MAX, TRUE);
X		  (void) fprintf(file1, "%s\n", tmp_str);
X		}
X	      pusht(j);
X	      (void) fclose(file1);
X	      prt("Completed.", 0, 0);
X	    }
X	  else
X	    prt("File could not be opened.", 0, 0);
X	}
X    }
X}
X
X
X/* Prints a listing of monsters				-RAK-	 */
Xprint_monsters()
X{
X  int i, j, xpos, attype, adesc;
X  FILE *file1;
X  vtype out_val, filename1;
X  vtype attstr, attx;
X  dtype damstr;
X  creature_type *c_ptr;
X  char *string;
X
X  prt("File name: ", 0, 0);
X  if (get_string(filename1, 0, 11, 64))
X    {
X      if (strlen(filename1) == 0)
X	(void) strcpy(filename1, "MORIAMON.DAT");
X      if ((file1 = fopen(filename1, "w")) != NULL)
X	{
X	  prt("Writing Monster Dictionary...", 0, 0);
X	  put_qio();
X	  for (i = 0; i < MAX_CREATURES; i++)
X	    {
X	      c_ptr = &c_list[i];
X	      /* Begin writing to file                                 */
X	      (void) fprintf(file1, "--------------------------------------------\n");
X	      (void) strcpy(out_val, c_ptr->name);
X	      (void) strcat(out_val, "                              ");
X	      (void) fprintf(file1, "%d  %s     (%c)\n", i, out_val, c_ptr->cchar);
X	      (void) fprintf(file1, "     Speed ==%d  Level     ==%d  Exp ==%d\n",
X		      c_ptr->speed, c_ptr->level, (int)c_ptr->mexp);
X	      (void) fprintf(file1, "     AC    ==%d  Eye-sight ==%d  HD  ==%s\n",
X		      c_ptr->ac, c_ptr->aaf, c_ptr->hd);
X	      if (0x80000000 & c_ptr->cmove)
X		(void) fprintf(file1, "     Creature is a ***Win Creature***\n");
X	      if (0x00080000 & c_ptr->cmove)
X		(void) fprintf(file1, "     Creature Eats/kills other creatures.\n");
X	      if (0x0001 & c_ptr->cdefense)
X		(void) fprintf(file1, "     Creature is a dragon.\n");
X	      if (0x0002 & c_ptr->cdefense)
X		(void) fprintf(file1, "     Creature is a monster.\n");
X	      if (0x0004 & c_ptr->cdefense)
X		(void) fprintf(file1, "     Creature is evil.\n");
X	      if (0x0008 & c_ptr->cdefense)
X		(void) fprintf(file1, "     Creature is undead.\n");
X	      if (0x0010 & c_ptr->cdefense)
X		(void) fprintf(file1, "     Creature harmed by cold.\n");
X	      if (0x0020 & c_ptr->cdefense)
X		(void) fprintf(file1, "     Creature harmed by fire.\n");
X	      if (0x0040 & c_ptr->cdefense)
X		(void) fprintf(file1, "     Creature harmed by poison.\n");
X	      if (0x0080 & c_ptr->cdefense)
X		(void) fprintf(file1, "     Creature harmed by acid.\n");
X	      if (0x0100 & c_ptr->cdefense)
X		(void) fprintf(file1, "     Creature harmed by blue light.\n");
X	      if (0x0200 & c_ptr->cdefense)
X		(void) fprintf(file1, "     Creature harmed by Stone-to-Mud.\n");
X	      if (0x1000 & c_ptr->cdefense)
X		(void) fprintf(file1, "     Creature cannot be charmed or slept.\n");
X	      if (0x2000 & c_ptr->cdefense)
X		(void) fprintf(file1, "     Creature seen with Infra-Vision.\n");
X	      if (0x4000 & c_ptr->cdefense)
X		(void) fprintf(file1, "     Creature has MAX hit points.\n");
X	      if (0x00010000 & c_ptr->cmove)
X		(void) fprintf(file1, "     Creature is invisible.\n");
X	      if (0x00100000 & c_ptr->cmove)
X		(void) fprintf(file1, "     Creature picks up objects.\n");
X	      if (0x00200000 & c_ptr->cmove)
X		(void) fprintf(file1, "     Creature multiplies.\n");
X	      if (0x01000000 & c_ptr->cmove)
X		(void) fprintf(file1, "     Carries object(s).\n");
X	      if (0x02000000 & c_ptr->cmove)
X		(void) fprintf(file1, "     Carries gold, gems, etc.\n");
X	      if (0x04000000 & c_ptr->cmove)
X		(void) fprintf(file1, "       Has object/gold 60%% of time.\n");
X	      if (0x08000000 & c_ptr->cmove)
X		(void) fprintf(file1, "       Has object/gold 90%% of time.\n");
X	      if (0x10000000 & c_ptr->cmove)
X		(void) fprintf(file1, "       Has 1d2 object(s)/gold.\n");
X	      if (0x20000000 & c_ptr->cmove)
X		(void) fprintf(file1, "       Has 2d2 object(s)/gold.\n");
X	      if (0x40000000 & c_ptr->cmove)
X		(void) fprintf(file1, "       Has 4d2 object(s)/gold.\n");
X	      /*
X	       * Creature casts spells / Breaths Dragon
X	       * breath...      
X	       */
X	      if (c_ptr->spells != 0)
X		{
X		  (void) fprintf(file1, "   --Spells/Dragon Breath ==\n");
X		  (void) fprintf(file1, "       Casts spells 1 out of %d turns.\n",
X			  (int)(0xF & c_ptr->spells));
X		  if (0x00000010 & c_ptr->spells)
X		    (void) fprintf(file1, "       Can teleport short.\n");
X		  if (0x00000020 & c_ptr->spells)
X		    (void) fprintf(file1, "       Can teleport long.\n");
X		  if (0x00000040 & c_ptr->spells)
X		    (void) fprintf(file1, "       Teleport player to itself.\n");
X		  if (0x00000080 & c_ptr->spells)
X		    (void) fprintf(file1, "       Cause light wounds.\n");
X		  if (0x00000100 & c_ptr->spells)
X		    (void) fprintf(file1, "       Cause serious wounds.\n");
X		  if (0x00000200 & c_ptr->spells)
X		    (void) fprintf(file1, "       Hold person.\n");
X		  if (0x00000400 & c_ptr->spells)
X		    (void) fprintf(file1, "       Cause blindness.\n");
X		  if (0x00000800 & c_ptr->spells)
X		    (void) fprintf(file1, "       Cause confusion.\n");
X		  if (0x00001000 & c_ptr->spells)
X		    (void) fprintf(file1, "       Cause fear.\n");
X		  if (0x00002000 & c_ptr->spells)
X		    (void) fprintf(file1, "       Summon a monster.\n");
X		  if (0x00004000 & c_ptr->spells)
X		    (void) fprintf(file1, "       Summon an undead.\n");
X		  if (0x00008000 & c_ptr->spells)
X		    (void) fprintf(file1, "       Slow person.\n");
X		  if (0x00010000 & c_ptr->spells)
X		    (void) fprintf(file1, "       Drains mana for healing.\n");
X		  if (0x00020000 & c_ptr->spells)
X		    (void) fprintf(file1, "       **Unknown spell value**\n");
X		  if (0x00040000 & c_ptr->spells)
X		    (void) fprintf(file1, "       **Unknown spell value**\n");
X		  if (0x00080000 & c_ptr->spells)
X		    (void) fprintf(file1, "       Breaths Lightning Dragon Breath.\n");
X		  if (0x00100000 & c_ptr->spells)
X		    (void) fprintf(file1, "       Breaths Gas Dragon Breath.\n");
X		  if (0x00200000 & c_ptr->spells)
X		    (void) fprintf(file1, "       Breaths Acid Dragon Breath.\n");
X		  if (0x00400000 & c_ptr->spells)
X		    (void) fprintf(file1, "       Breaths Frost Dragon Breath.\n");
X		  if (0x00800000 & c_ptr->spells)
X		    (void) fprintf(file1, "       Breaths Fire Dragon Breath.\n");
X		}
X	      /* Movement for creature                                 */
X	      (void) fprintf(file1, "   --Movement ==\n");
X	      if (0x00000001 & c_ptr->cmove)
X		(void) fprintf(file1, "       Move only to attack.\n");
X	      if (0x00000002 & c_ptr->cmove)
X		(void) fprintf(file1, "       Move and attack normally.\n");
X	      if (0x00000008 & c_ptr->cmove)
X		(void) fprintf(file1, "       20%% random movement.\n");
X	      if (0x00000010 & c_ptr->cmove)
X		(void) fprintf(file1, "       40%% random movement.\n");
X	      if (0x00000020 & c_ptr->cmove)
X		(void) fprintf(file1, "       75%% random movement.\n");
X	      if (0x00020000 & c_ptr->cmove)
X		(void) fprintf(file1, "       Can open doors.\n");
X	      if (0x00040000 & c_ptr->cmove)
X		(void) fprintf(file1, "       Can phase through walls.\n");
X	      
X	      (void) fprintf(file1, "   --Creature attacks ==\n");
X	      (void) strcpy(attstr, c_ptr->damage);
X	      while (strlen(attstr) > 0)
X		{
X		  string = index(attstr, '|');
X		  if (string)
X		    xpos = strlen(attstr) - strlen(string);
X		  else
X		    xpos = -1;
X		  if (xpos >= 0) 
X		    {
X		      (void) strncpy(attx, attstr, xpos);
X		      attx[xpos] = '\0';
X		      (void) strcpy(attstr, &attstr[xpos + 1]);
X		    } 
X		  else 
X		    {
X		      (void) strcpy(attx, attstr);
X		      (void) strcpy(attstr, "");
X		    }
X		  (void) sscanf(attx, "%d%d%s", &attype, &adesc, damstr);
X		  (void) strcpy(out_val, "");
X		  switch (adesc) 
X		    {
X		    case 1:
X		      (void) strcpy(out_val, "       Hits for ");
X		      break;
X		    case 2:
X		      (void) strcpy(out_val, "       Bites for ");
X		      break;
X		    case 3:
X		      (void) strcpy(out_val, "       Claws for ");
X		      break;
X		    case 4:
X		      (void) strcpy(out_val, "       Stings for ");
X		      break;
X		    case 5:
X		      (void) strcpy(out_val, "       Touches for ");
X		      break;
X		    case 6:
X		      (void) strcpy(out_val, "       Kicks for ");
X		      break;
X		    case 7:
X		      (void) strcpy(out_val, "       Gazes for ");
X		      break;
X		    case 8:
X		      (void) strcpy(out_val, "       Breathes for ");
X		      break;
X		    case 9:
X		      (void) strcpy(out_val, "       Spits for ");
X		      break;
X		    case 10:
X		      (void) strcpy(out_val, "       Wails for ");
X		      break;
X		    case 11:
X		      (void) strcpy(out_val, "       Embraces for ");
X		      break;
X		    case 12:
X		      (void) strcpy(out_val, "       Crawls on you for ");
X		      break;
X		    case 13:
X		      (void) strcpy(out_val, "       Shoots spores for ");
X		      break;
X		    case 14:
X		      (void) strcpy(out_val, "       Begs for money for ");
X		      break;
X		    case 15:
X		      (void) strcpy(out_val, "       Slimes you for ");
X		      break;
X		    case 16:
X		      (void) strcpy(out_val, "       Crushes you for ");
X		      break;
X		    case 17:
X		      (void) strcpy(out_val, "       Tramples you for ");
X		      break;
X		    case 18:
X		      (void) strcpy(out_val, "       Drools on you for ");
X		      break;
X		    case 19:
X		      (void) strcpy(out_val, "       Insults you for ");
X		      break;
X		    case 99:
X		      (void) strcpy(out_val, "       Is repelled...");
X		      break;
X		    default:
X		      (void) strcpy(out_val, "     **Unknown value** ");
X		      break;
X		    }
X		  switch (attype)
X		    {
X		    case 1:
X		      (void) strcat(out_val, "normal damage.");
X		      break;
X		    case 2:
X		      (void) strcat(out_val, "lowering strength.");
X		      break;
X		    case 3:
X		      (void) strcat(out_val, "confusion.");
X		      break;
X		    case 4:
X		      (void) strcat(out_val, "fear.");
X		      break;
X		    case 5:
X		      (void) strcat(out_val, "fire damage.");
X		      break;
X		    case 6:
X		      (void) strcat(out_val, "acid damage.");
X		      break;
X		    case 7:
X		      (void) strcat(out_val, "cold damage.");
X		      break;
X		    case 8:
X		      (void) strcat(out_val, "lightning damage.");
X		      break;
X		    case 9:
X		      (void) strcat(out_val, "corrosion damage.");
X		      break;
X		    case 10:
X		      (void) strcat(out_val, "blindness.");
X		      break;
X		    case 11:
X		      (void) strcat(out_val, "paralyzation.");
X		      break;
X		    case 12:
X		      (void) strcat(out_val, "stealing money.");
X		      break;
X		    case 13:
X		      (void) strcat(out_val, "stealing object.");
X		      break;
X		    case 14:
X		      (void) strcat(out_val, "poison damage.");
X		      break;
X		    case 15:
X		      (void) strcat(out_val, "lose dexterity.");
X		      break;
X		    case 16:
X		      (void) strcat(out_val, "lose constitution.");
X		      break;
X		    case 17:
X		      (void) strcat(out_val, "lose intelligence.");
X		      break;
X		    case 18:
X		      (void) strcat(out_val, "lose wisdom.");
X		      break;
X		    case 19:
X		      (void) strcat(out_val, "lose experience.");
X		      break;
X		    case 20:
X		      (void) strcat(out_val, "aggravates monsters.");
X		      break;
X		    case 21:
X		      (void) strcat(out_val, "disenchants objects.");
X		      break;
X		    case 22:
X		      (void) strcat(out_val, "eating food.");
X		      break;
X		    case 23:
X		      (void) strcat(out_val, "eating light source.");
X		      break;
X		    case 24:
X		      (void) strcat(out_val, "absorbing charges.");
X		      break;
X		    case 99:
X		      (void) strcat(out_val, "blank message.");
X		      break;
X		    default:
X		      (void) strcat(out_val, "**Unknown value**");
X		      break;
X		    }
X		  (void) fprintf(file1, "%s (%s)\n", out_val, damstr);
X		}
X	      for (j = 0; j < 2; j++)
X		(void) fprintf(file1, "\n");
X	    }
X	  /* End writing to file                                   */
X	  (void) fclose(file1);
X	  prt("Completed.", 0, 0);
X	}
X    }
X}
X
X
X/* Print the character to a file or device		-RAK-	 */
Xfile_character()
X{
X  int i, j, xbth, xbthb, xfos, xsrh, xstl, xdis;
X  int xsave, xdev;
X  vtype xinfra;
X  FILE *file1;
X  vtype out_val, filename1, prt1, prt2;
X  stat_type out_str, out_int, out_wis, out_dex, out_con, out_chr;
X  struct misc *p_ptr;
X  treasure_type *i_ptr;
X  
X  prt("File name: ", 0, 0);
X  if (get_string(filename1, 0, 11, 64))
X    {
X      if (strlen(filename1) == 0)
X	(void) strcpy(filename1, "MORIACHR.DAT");
X      if ((file1 = fopen(filename1, "w")) != NULL)
X	{
X	  prt("Writing character sheet...", 0, 0);
X	  put_qio();
X	  (void) fprintf(file1, "%c", 12);
X	  cnv_stat(py.stats.cstr, out_str);
X	  cnv_stat(py.stats.cint, out_int);
X	  cnv_stat(py.stats.cwis, out_wis);
X	  cnv_stat(py.stats.cdex, out_dex);
X	  cnv_stat(py.stats.ccon, out_con);
X	  cnv_stat(py.stats.cchr, out_chr);
X	  (void) fprintf(file1, "\n");
X	  (void) fprintf(file1, "\n");
X	  (void) fprintf(file1, "\n");
X	  (void) fprintf(file1, "  Name  :%s", pad(py.misc.name, " ", 25));
X	  (void) fprintf(file1, "  Age         :%4d", (int)py.misc.age);
X	  (void) fprintf(file1, "     Strength     :%s\n", out_str);
X	  (void) fprintf(file1, "  Race  :%s", pad(py.misc.race, " ", 25));
X	  (void) fprintf(file1, "  Height      :%4d", (int)py.misc.ht);
X	  (void) fprintf(file1, "     Intelligence :%s\n", out_int);
X	  (void) fprintf(file1, "  Sex   :%s", pad(py.misc.sex, " ", 25));
X	  (void) fprintf(file1, "  Weight      :%4d", (int)py.misc.wt);
X	  (void) fprintf(file1, "     Wisdom       :%s\n", out_wis);
X	  (void) fprintf(file1, "  Class :%s", pad(py.misc.tclass, " ", 25));
X	  (void) fprintf(file1, "  Social Class:%4d", py.misc.sc);
X	  (void) fprintf(file1, "     Dexterity    :%s\n", out_dex);
X	  (void) fprintf(file1, "  Title :%s", pad(py.misc.title, " ", 25));
X	  (void) fprintf(file1, "                   ");
X	  (void) fprintf(file1, "     Constitution :%s\n", out_con);
X	  (void) fprintf(file1, "                                  ");
X	  (void) fprintf(file1, "                   ");
X	  (void) fprintf(file1, "     Charisma     :%s\n", out_chr);
X	  (void) fprintf(file1, "\n");
X	  (void) fprintf(file1, "\n");
X	  (void) fprintf(file1, "\n");
X	  (void) fprintf(file1, "\n");
X	  
X	  (void) fprintf(file1, "  + To Hit    :%6d", py.misc.dis_th);
X	  (void) fprintf(file1, "     Level      :%6d", (int)py.misc.lev);
X	  (void) fprintf(file1, "     Max Hit Points :%6d\n", py.misc.mhp);
X	  (void) fprintf(file1, "  + To Damage :%6d", py.misc.dis_td);
X	  (void) fprintf(file1, "     Experience :%6d", py.misc.exp);
X	  (void) fprintf(file1, "     Cur Hit Points :%6d\n", (int) (py.misc.chp));
X	  (void) fprintf(file1, "  + To AC     :%6d", py.misc.dis_tac);
X	  (void) fprintf(file1, "     Gold       :%6d", py.misc.au);
X	  (void) fprintf(file1, "     Max Mana       :%6d\n", py.misc.mana);
X	  (void) fprintf(file1, "    Total AC  :%6d", py.misc.dis_ac);
X	  (void) fprintf(file1, "                       ");
X	  (void) fprintf(file1, "     Cur Mana       :%6d\n", (int) (py.misc.cmana));
X	  
X	  (void) fprintf(file1, "\n");
X	  (void) fprintf(file1, "\n");
X	  p_ptr = &py.misc;
X	  xbth = p_ptr->bth + p_ptr->lev * BTH_LEV_ADJ +
X	    p_ptr->ptohit * BTH_PLUS_ADJ;
X	  xbthb = p_ptr->bthb + p_ptr->lev * BTH_LEV_ADJ +
X	    p_ptr->ptohit * BTH_PLUS_ADJ;
X	  xfos = 27 - p_ptr->fos;
X	  if (xfos < 0)
X	    xfos = 0;
X	  xsrh = p_ptr->srh + int_adj();
X	  xstl = p_ptr->stl;
X	  xdis = p_ptr->disarm + p_ptr->lev + 2 * todis_adj() + int_adj();
X	  xsave = p_ptr->save + p_ptr->lev + wis_adj();
X	  xdev = p_ptr->save + p_ptr->lev + int_adj();
X	  (void) sprintf(xinfra, "%d feet", py.flags.see_infra * 10);
X      
X	  (void) fprintf(file1, "(Miscellaneous Abilities)\n");
X	  (void) fprintf(file1, "\n");
X	  (void) fprintf(file1, "  Fighting    : %s", pad(likert(xbth, 12), " ", 10));
X	  (void) fprintf(file1, "  Stealth     : %s", pad(likert(xstl, 1), " ", 10));
X	  (void) fprintf(file1, "  Perception  : %s\n", pad(likert(xfos, 3), " ", 10));
X	  (void) fprintf(file1, "  Throw/Bows  : %s", pad(likert(xbthb, 12), " ", 10));
X	  (void) fprintf(file1, "  Disarming   : %s", pad(likert(xdis, 8), " ", 10));
X	  (void) fprintf(file1, "  Searching   : %s\n", pad(likert(xsrh, 6), " ", 10));
X	  (void) fprintf(file1, "  Saving Throw: %s", pad(likert(xsave, 6), " ", 10));
X	  (void) fprintf(file1, "  Magic Device: %s", pad(likert(xdev, 7), " ", 10));
X	  (void) fprintf(file1, "  Infra-Vision: %s\n", pad(xinfra, " ", 10));
X	  /* Write out the character's history     */
X	  (void) fprintf(file1, "\n");
X	  (void) fprintf(file1, "\n");
X	  (void) fprintf(file1, "Character Background\n");
X	  for (i = 0; i < 5; i++)
X	    (void) fprintf(file1, "%s\n", pad(py.misc.history[i], " ", 71));
X	  /* Write out the equipment list...       */
X	  j = 0;
X	  (void) fprintf(file1, " ");
X	  (void) fprintf(file1, " ");
X	  (void) fprintf(file1, "  [Character's Equipment List]\n");
X	  (void) fprintf(file1, "\n");
X	  if (equip_ctr == 0)
X	    (void) fprintf(file1, "  Character has no equipment in use.\n");
X	  else
X	    for (i = 22; i < INVEN_MAX; i++)
X	      {
X		i_ptr = &inventory[i];
X		if (i_ptr->tval != 0)
X		  {
X		    switch (i) 
X		      {
X		      case 22:
X			(void) strcpy(prt1, ") You are wielding   : ");
X			break;
X		      case 23:
X			(void) strcpy(prt1, ") Worn on head       : ");
X			break;
X		      case 24:
X			(void) strcpy(prt1, ") Worn around neck   : ");
X			break;
X		      case 25:
X			(void) strcpy(prt1, ") Worn on body       : ");
X			break;
X		      case 26:
X			(void) strcpy(prt1, ") Worn on shield arm : ");
X			break;
X		      case 27:
X			(void) strcpy(prt1, ") Worn on hands      : ");
X			break;
X		      case 28:
X			(void) strcpy(prt1, ") Right ring finger  : ");
X			break;
X		      case 29:
X			(void) strcpy(prt1, ") Left  ring finger  : ");
X			break;
X		      case 30:
X			(void) strcpy(prt1, ") Worn on feet       : ");
X			break;
X		      case 31:
X			(void) strcpy(prt1, ") Worn about body    : ");
X			break;
X		      case 32:
X			(void) strcpy(prt1, ") Light source is    : ");
X			break;
X		      case 33:
X			(void) strcpy(prt1, ") Secondary weapon   : ");
X			break;
X		      default:
X			(void) strcpy(prt1, ") *Unknown value*    : ");
X			break;
X		      }
X		    j++;
X		    objdes(prt2, i, TRUE);
X		    (void) sprintf(out_val, "  %c%s%s", j + 97, prt1, prt2);
X		    (void) fprintf(file1, "%s\n", out_val);
X		  }
X	      }
X	  
X	  /* Write out the character's inventory...        */
X	  (void) fprintf(file1, "%c", 12);
X	  (void) fprintf(file1, "\n");
X	  (void) fprintf(file1, "\n");
X	  (void) fprintf(file1, "\n");
X	  (void) fprintf(file1, "  [General Inventory List]\n");
X	  (void) fprintf(file1, "\n");
X	  if (inven_ctr == 0)
X	    (void) fprintf(file1, "  Character has no objects in inventory.\n");
X	  else 
X	    {
X	      for (i = 0; i < inven_ctr; i++) 
X		{
X		  objdes(prt1, i, TRUE);
X		  (void) sprintf(out_val, "%c) %s", i + 97, prt1);
X		  (void) fprintf(file1, "%s\n", out_val);
X		}
X	    }
X	  (void) fprintf(file1, "%c", 12);
X	  (void) fclose(file1);
X	  prt("Completed.", 0, 0);
X	}
X    }
X}
END_OF_files.c
if test 25891 -ne `wc -c <files.c`; then
    echo shar: \"files.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f generate.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"generate.c\"
else
echo shar: Extracting \"generate.c\" \(26506 characters\)
sed "s/^X//" >generate.c <<'END_OF_generate.c'
X#include "constants.h"
X#include "types.h"
X#include "externs.h"
X
Xtypedef struct coords {
X  int x, y;
X} coords;
X
Xcoords doorstk[100];
Xint doorptr;
X
X
X/* Always picks a correct direction		*/
Xcorrect_dir(rdir, cdir, y1, x1, y2, x2)
Xint *rdir, *cdir;
Xint y1, x1, y2, x2;
X{
X  if (y1 < y2) 
X    *rdir =  1;
X  else if (y1 == y2) 
X    *rdir =  0;
X  else
X    *rdir = -1;
X  if (x1 < x2) 
X    *cdir =  1;
X  else if (x1 == x2) 
X    *cdir =  0;
X  else
X    *cdir = -1;
X  if ((*rdir != 0) && (*cdir != 0)) 
X    switch(randint(2))
X      {
X      case 1:
X	*rdir = 0;
X	break;
X      case 2:
X	*cdir = 0;
X	break;
X      }
X}
X
X
X/* Chance of wandering direction			*/
Xrand_dir(rdir, cdir, y1, x1, y2, x2, chance)
Xint *rdir, *cdir;
Xint y1, x1, y2, x2;
Xint chance;
X{
X  switch(randint(chance))
X    {
X    case 1:
X      *rdir = -1;
X      *cdir =  0;
X      break;
X    case 2:
X      *rdir =  1;
X      *cdir =  0;
X      break;
X    case 3:
X      *rdir =  0;
X      *cdir = -1;
X      break;
X    case 4:
X      *rdir =  0;
X      *cdir =  1;
X      break;
X    default:
X      correct_dir(rdir, cdir, y1, x1, y2, x2);
X      break;
X    }
X}
X    
X
X/* Blanks out entire cave				-RAK-	*/
Xblank_cave()
X{
X  int i, j;
X
X  for (i = 0; i < MAX_HEIGHT; i++)
X    for (j = 0; j < MAX_WIDTH; j++)
X      cave[i][j] = blank_floor;
X}
X
X
X/* Fills in empty spots with desired rock		-RAK-	*/
X/* Note: 9 is a temporary value.				*/
Xfill_cave(fill)
Xfloor_type fill;
X{
X  int i, j;
X  cave_type *c_ptr;
X
X  for (i = 1; i < cur_height-1; i++)
X    for (j = 1; j < cur_width-1; j++)
X      {
X	c_ptr = &cave[i][j];
X	if ((c_ptr->fval == 0) || (c_ptr->fval == 8) || (c_ptr->fval == 9))
X	  {
X	    c_ptr->fval = fill.ftval;
X	    c_ptr->fopen = fill.ftopen;
X	  }
X      }
X}
X
X
X/* Places indestructible rock around edges of dungeon	-RAK-	*/
Xplace_boundary()
X{
X  int i;
X
X  for (i = 0; i < cur_height; i++)
X    {
X      cave[i][0].fval            = boundary_wall.ftval;
X      cave[i][0].fopen           = boundary_wall.ftopen;
X      cave[i][cur_width-1].fval  = boundary_wall.ftval;
X      cave[i][cur_width-1].fopen = boundary_wall.ftopen;
X    }
X  for (i = 0; i < cur_width; i++)
X    {
X      cave[0][i].fval             = boundary_wall.ftval;
X      cave[0][i].fopen            = boundary_wall.ftopen;
X      cave[cur_height-1][i].fval  = boundary_wall.ftval;
X      cave[cur_height-1][i].fopen = boundary_wall.ftopen;
X    }
X}
X
X
X/* Places "streamers" of rock through dungeon		-RAK-	*/
Xplace_streamer(rock, treas_chance)
Xfloor_type rock;
Xint treas_chance;
X{
X  int i, y, x, dir, ty, tx, t1, t2;
X  int flag;
X  cave_type *c_ptr;
X
X  /* Choose starting point and direction		*/
X  y = (cur_height/2.0) + 11 - randint(23);
X  x = (cur_width/2.0)  + 16 - randint(33);
X
X  dir = randint(8);	/* Number 1-4, 6-9	*/
X  if (dir > 4)
X    dir = dir + 1;
X
X  /* Place streamer into dungeon			*/
X  flag = FALSE;	/* Set to true when y, x are out-of-bounds*/
X  t1 = 2*DUN_STR_RNG + 1;	/* Constants	*/
X  t2 =   DUN_STR_RNG + 1;
X  do
X    {
X      for (i = 0; i < DUN_STR_DEN; i++)
X	{
X	  ty = y + randint(t1) - t2;
X	  tx = x + randint(t1) - t2;
X	  if (in_bounds(ty, tx)) 
X	    {
X	      c_ptr = &cave[ty][tx];
X	      if (c_ptr->fval == rock_wall1.ftval) 
X		{
X		  c_ptr->fval = rock.ftval;
X		  c_ptr->fopen = rock.ftopen;
X		  if (randint(treas_chance) == 1) 
X		    place_gold(ty, tx);
X		}
X	    }
X	}
X      if (!move(dir, &y, &x))
X	flag = TRUE;
X    }
X  while (!flag);
X}
X
X
X/* Place a trap with a given displacement of point	-RAK-	*/
Xvault_trap(y, x, yd, xd, num)
Xint y, x, yd, xd, num;
X{
X  int count, y1, x1, i;
X  int flag;
X  cave_type *c_ptr;
X
X  for (i = 0; i < num; i++)
X    {
X      flag = FALSE;
X      count = 0;
X      do
X	{
X	  y1 = y - yd - 1 + randint(2*yd+1);
X	  x1 = x - xd - 1 + randint(2*xd+1);
X	  c_ptr = &cave[y1][x1];
X	  if ((c_ptr->fval > 0) && (c_ptr->fval < 8) && (c_ptr->fval != 3))
X	    if (c_ptr->tptr == 0) 
X	      {
X		place_trap(y1, x1, 1, randint(MAX_TRAPA));
X		flag = TRUE;
X	      }
X	  count++;
X	}
X      while ((!flag) && (count <= 5));
X    }
X}
X
X
X/* Place a trap with a given displacement of point	-RAK-	*/
Xvault_monster(y, x, num)
Xint y, x, num;
X{
X  int i, y1, x1;
X
X  for (i = 0; i < num; i++)
X    {
X      y1 = y;
X      x1 = x;
X      (void) summon_monster(&y1, &x1, TRUE);
X    }
X}
X
X
X/* Builds a room at a row, column coordinate		-RAK-	*/
Xbuild_room(yval, xval)
Xint yval, xval;
X{
X  int y_height, y_depth;
X  int x_left, x_right;
X  int i, j;
X  floor_type cur_floor;
X
X  if (dun_level <= randint(25)) 
X    cur_floor = lopen_floor;	/* Floor with light	*/
X  else
X    cur_floor = dopen_floor;	/* Dark floor		*/
X  y_height = yval - randint(4);
X  y_depth  = yval + randint(3);
X  x_left   = xval - randint(11);
X  x_right  = xval + randint(11);
X  for (i = y_height; i <= y_depth; i++)
X    for (j = x_left; j <= x_right; j++)
X      {
X	cave[i][j].fval  = cur_floor.ftval;
X	cave[i][j].fopen = cur_floor.ftopen;
X      }
X  for (i = (y_height - 1); i <= (y_depth + 1); i++)
X    {
X      cave[i][x_left-1].fval   = rock_wall1.ftval;
X      cave[i][x_left-1].fopen  = rock_wall1.ftopen;
X      cave[i][x_right+1].fval  = rock_wall1.ftval;
X      cave[i][x_right+1].fopen = rock_wall1.ftopen;
X    }
X  for (i = x_left; i <= x_right; i++)
X    {
X      cave[y_height-1][i].fval  = rock_wall1.ftval;
X      cave[y_height-1][i].fopen = rock_wall1.ftopen;
X      cave[y_depth+1][i].fval   = rock_wall1.ftval;
X      cave[y_depth+1][i].fopen  = rock_wall1.ftopen;
X    }
X}
X
X
X/* Builds a room at a row, column coordinate		-RAK-	*/
X/* Type 1 unusual rooms are several overlapping rectangular ones	*/
Xbuild_type1(yval, xval)
Xint yval, xval;
X{
X  int y_height, y_depth;
X  int x_left, x_right;
X  int i0, i, j;
X  floor_type cur_floor;
X  cave_type *c_ptr;
X
X  if (dun_level <= randint(25)) 
X    cur_floor = lopen_floor;	/* Floor with light	*/
X  else
X    cur_floor = dopen_floor;	/* Dark floor		*/
X  for (i0 = 0; i0 < (1 + randint(2)); i0++)
X    {
X      y_height = yval - randint(4);
X      y_depth  = yval + randint(3);
X      x_left   = xval - randint(11);
X      x_right  = xval + randint(11);
X      for (i = y_height; i <= y_depth; i++)
X	for (j = x_left; j <= x_right; j++)
X	  {
X	    cave[i][j].fval  = cur_floor.ftval;
X	    cave[i][j].fopen = cur_floor.ftopen;
X	  }
X      for (i = (y_height - 1); i <= (y_depth + 1); i++)
X	{
X	  c_ptr = &cave[i][x_left-1];
X	  if (c_ptr->fval != cur_floor.ftval) 
X	    {
X	      c_ptr->fval  = rock_wall1.ftval;
X	      c_ptr->fopen = rock_wall1.ftopen;
X	    }
X	  c_ptr = &cave[i][x_right+1];
X	    if (c_ptr->fval != cur_floor.ftval) 
X	      {
X		c_ptr->fval  = rock_wall1.ftval;
X		c_ptr->fopen = rock_wall1.ftopen;
X	      }
X	}
X      for (i = x_left; i <= x_right; i++)
X	{
X	  c_ptr = &cave[y_height-1][i];
X	  if (c_ptr->fval != cur_floor.ftval) 
X	    {
X	      c_ptr->fval  = rock_wall1.ftval;
X	      c_ptr->fopen = rock_wall1.ftopen;
X	    }
X	  c_ptr = &cave[y_depth+1][i];
X	    if (c_ptr->fval != cur_floor.ftval) 
X	      {
X		c_ptr->fval  = rock_wall1.ftval;
X		c_ptr->fopen = rock_wall1.ftopen;
X	      }
X	}
X    }
X}
X
X
X/* Builds an unusual room at a row, column coordinate	-RAK-	*/
X/* Type 2 unusual rooms all have an inner room:			*/
X/*   1 - Just an inner room with one door			*/
X/*   2 - An inner room within an inner room			*/
X/*   3 - An inner room with pillar(s)				*/
X/*   4 - Inner room has a maze					*/
X/*   5 - A set of four inner rooms				*/
Xbuild_type2(yval, xval)
Xint yval, xval;
X{
X  int y_height, y_depth;
X  int x_left, x_right;
X  int i, j;
X  floor_type cur_floor;
X
X  if (dun_level <= randint(30)) 
X    cur_floor = lopen_floor;	/* Floor with light	*/
X  else
X    cur_floor = dopen_floor;	/* Dark floor		*/
X  y_height = yval - 4;
X  y_depth  = yval + 4;
X  x_left   = xval - 11;
X  x_right  = xval + 11;
X  for (i = y_height; i <= y_depth; i++)
X    for (j = x_left; j <= x_right; j++)
X      {
X	cave[i][j].fval  = cur_floor.ftval;
X	cave[i][j].fopen = cur_floor.ftopen;
X      }
X  for (i = (y_height - 1); i <= (y_depth + 1); i++)
X    {
X      cave[i][x_left-1].fval   = rock_wall1.ftval;
X      cave[i][x_left-1].fopen  = rock_wall1.ftopen;
X      cave[i][x_right+1].fval  = rock_wall1.ftval;
X      cave[i][x_right+1].fopen = rock_wall1.ftopen;
X    }
X  for (i = x_left; i <= x_right; i++)
X    {
X      cave[y_height-1][i].fval  = rock_wall1.ftval;
X      cave[y_height-1][i].fopen = rock_wall1.ftopen;
X      cave[y_depth+1][i].fval   = rock_wall1.ftval;
X      cave[y_depth+1][i].fopen  = rock_wall1.ftopen;
X    }
X  /* The inner room		*/
X  y_height = y_height + 2;
X  y_depth  = y_depth  - 2;
X  x_left   = x_left   + 2;
X  x_right  = x_right  - 2;
X  for (i = (y_height - 1); i <= (y_depth + 1); i++)
X    {
X      cave[i][x_left-1].fval   = 8;
X      cave[i][x_right+1].fval  = 8;
X    }
X  for (i = x_left; i <= x_right; i++)
X    {
X      cave[y_height-1][i].fval  = 8;
X      cave[y_depth+1][i].fval   = 8;
X    }
X  /* Inner room variations		*/
X  switch(randint(5))
X    {
X    case 1:	/* Just an inner room...	*/
X      switch(randint(4)) 	/* Place a door	*/
X	{
X	case 1:	place_secret_door(y_height-1, xval); break;
X	case 2:	place_secret_door(y_depth+1, xval); break;
X	case 3:	place_secret_door(yval, x_left-1); break;
X	case 4:	place_secret_door(yval, x_right+1); break;
X	}
X      vault_monster(yval, xval, 1);
X      break;
X    case 2:	/* Treasure Vault	*/
X      switch(randint(4))	/* Place a door	*/
X	{
X	case 1:	place_secret_door(y_height-1, xval); break;
X	case 2:	place_secret_door(y_depth+1, xval); break;
X	case 3:	place_secret_door(yval, x_left-1); break;
X	case 4:	place_secret_door(yval, x_right+1); break;
X	}
X      for (i = yval-1; i <= yval+1; i++)
X	{
X	  cave[i][xval-1].fval   = 8;
X	  cave[i][xval+1].fval   = 8;
X	}
X      cave[yval-1][xval].fval  = 8;
X      cave[yval+1][xval].fval  = 8;
X      switch(randint(4))	/* Place a door	*/
X	{
X	case 1:	place_locked_door(yval-1, xval); break;
X	case 2:	place_locked_door(yval+1, xval); break;
X	case 3:	place_locked_door(yval, xval-1); break;
X	case 4:	place_locked_door(yval, xval+1); break;
X	}
X      /* Place an object in the treasure vault	*/
X      switch(randint(10))
X	{
X	case 1: place_up_stairs(yval, xval); break;
X	case 2: place_down_stairs(yval, xval); break;
X	default: place_object(yval, xval); break;
X	}
X      /* Guard the treasure well		*/
X      vault_monster(yval, xval, 2+randint(3));
X      /* If the monsters don't get 'em...	*/
X      vault_trap(yval, xval, 4, 10, 2+randint(3));
X      break;
X    case 3:	/* Inner pillar(s)...	*/
X      switch(randint(4))  /* Place a door	*/
X	{
X	case 1:	place_secret_door(y_height-1, xval); break;
X	case 2:	place_secret_door(y_depth+1, xval); break;
X	case 3:	place_secret_door(yval, x_left-1); break;
X	case 4:	place_secret_door(yval, x_right+1); break;
X	}
X      for (i = yval-1; i <= yval+1; i++)
X	for (j = xval-1; j <= xval+1; j++)
X	  cave[i][j].fval   = 8;
X      if (randint(2) == 1) 
X	{
X	  switch(randint(2))
X	    {
X	    case 1:
X	      for (i = yval-1; i <= yval+1; i++)
X		for (j = xval-6; j <= xval-4; j++)
X		  cave[i][j].fval   = 8;
X	      for (i = yval-1; i <= yval+1; i++)
X		for (j = xval+4; j <= xval+6; j++)
X		  cave[i][j].fval   = 8;
X	      break;
X	    case 2:
X	      for (i = yval-1; i <= yval+1; i++)
X		for (j = xval-7; j <= xval-5; j++)
X		  cave[i][j].fval   = 8;
X	      for (i = yval-1; i <= yval+1; i++)
X		for (j = xval+5; j <= xval+7; j++)
X		  cave[i][j].fval   = 8;
X	      break;
X	    }
X	}
X      if (randint(3) == 1) 	/* Inner rooms	*/
X	{
X	  for (i = xval-5; i <= xval+5; i++)
X	    {
X	      cave[yval-1][i].fval = 8;
X	      cave[yval+1][i].fval = 8;
X	    }
X	  cave[yval][xval-5].fval = 8;
X	  cave[yval][xval+5].fval = 8;
X	  switch(randint(2))
X	    {
X	    case 1: place_secret_door(yval+1, xval-3); break;
X	    case 2: place_secret_door(yval-1, xval-3); break;
X	    }
X	  switch(randint(2))
X	    {
X	    case 1: place_secret_door(yval+1, xval+3); break;
X	    case 2: place_secret_door(yval-1, xval+3); break;
X	    }
X	  if (randint(3) == 1)  place_object(yval, xval-2);
X	  if (randint(3) == 1)  place_object(yval, xval+2);
X	  vault_monster(yval, xval-2, randint(2));
X	  vault_monster(yval, xval+2, randint(2));
X	}
X      break;
X    case 4:	/* Maze inside...	*/
X      switch(randint(4))	/* Place a door	*/
X	{
X	case 1:	place_secret_door(y_height-1, xval); break;
X	case 2:	place_secret_door(y_depth+1, xval); break;
X	case 3:	place_secret_door(yval, x_left-1); break;
X	case 4:	place_secret_door(yval, x_right+1); break;
X	}
X      for (i = y_height; i <= y_depth; i++)
X	for (j = x_left; j <= x_right; j++)
X	  if (0x1 & (j+i)) 
X	    cave[i][j].fval = 8;
X      /* Monsters just love mazes...		*/
X      vault_monster(yval, xval-5, randint(3));
X      vault_monster(yval, xval+5, randint(3));
X      /* Traps make them entertaining...	*/
X      vault_trap(yval, xval-3, 2, 8, randint(3));
X      vault_trap(yval, xval+3, 2, 8, randint(3));
X      /* Mazes should have some treasure too..	*/
X      for (i = 0; i < 3; i++)
X	random_object(yval, xval, 1);
X      break;
X    case 5:	/* Four small rooms...	*/
X      for (i = y_height; i <= y_depth; i++)
X	cave[i][xval].fval = 8;
X      for (i = x_left; i <= x_right; i++)
X	cave[yval][i].fval = 8;
X      switch(randint(2))
X	{
X	case 1:
X	  i = randint(10);
X	  place_secret_door(y_height-1, xval-i);
X	  place_secret_door(y_height-1, xval+i);
X	  place_secret_door(y_depth+1, xval-i);
X	  place_secret_door(y_depth+1, xval+i);
X	  break;
X	case 2:
X	  i = randint(3);
X	  place_secret_door(yval+i, x_left-1);
X	  place_secret_door(yval-i, x_left-1);
X	  place_secret_door(yval+i, x_right+1);
X	  place_secret_door(yval-i, x_right+1);
X	  break;
X	}
X      /* Treasure in each one...		*/
X      random_object(yval, xval, 2+randint(2));
X      /* Gotta have some monsters...		*/
X      vault_monster(yval+2, xval-4, randint(2));
X      vault_monster(yval+2, xval+4, randint(2));
X      vault_monster(yval-2, xval-4, randint(2));
X      vault_monster(yval-2, xval+4, randint(2));
X      break;
X    }
X}
X
X
X/* Builds a room at a row, column coordinate		-RAK-	*/
X/* Type 3 unusual rooms are cross shaped				*/
Xbuild_type3(yval, xval)
Xint yval, xval;
X{
X  int y_height, y_depth;
X  int x_left, x_right;
X  int i0, i, j;
X  floor_type cur_floor;
X  cave_type *c_ptr;
X
X  if (dun_level <= randint(25)) 
X    cur_floor = lopen_floor;	/* Floor with light	*/
X  else
X    cur_floor = dopen_floor;	/* Dark floor		*/
X  i0 = 2 + randint(2);
X  y_height = yval - i0;
X  y_depth  = yval + i0;
X  x_left   = xval - 1;
X  x_right  = xval + 1;
X  for (i = y_height; i <= y_depth; i++)
X    for (j = x_left; j <= x_right; j++)
X      {
X	cave[i][j].fval  = cur_floor.ftval;
X	cave[i][j].fopen = cur_floor.ftopen;
X      }
X  for (i = (y_height - 1); i <= (y_depth + 1); i++)
X    {
X      c_ptr = &cave[i][x_left-1];
X      c_ptr->fval  = rock_wall1.ftval;
X      c_ptr->fopen = rock_wall1.ftopen;
X      c_ptr = &cave[i][x_right+1];
X      c_ptr->fval  = rock_wall1.ftval;
X      c_ptr->fopen = rock_wall1.ftopen;
X    }
X  for (i = x_left; i <= x_right; i++)
X    {
X      c_ptr = &cave[y_height-1][i];
X      c_ptr->fval  = rock_wall1.ftval;
X      c_ptr->fopen = rock_wall1.ftopen;
X      c_ptr = &cave[y_depth+1][i];
X      c_ptr->fval  = rock_wall1.ftval;
X      c_ptr->fopen = rock_wall1.ftopen;
X    }
X  i0 = 2 + randint(9);
X  y_height = yval - 1;
X  y_depth  = yval + 1;
X  x_left   = xval - i0;
X  x_right  = xval + i0;
X  for (i = y_height; i <= y_depth; i++)
X    for (j = x_left; j <= x_right; j++)
X      {
X	cave[i][j].fval  = cur_floor.ftval;
X	cave[i][j].fopen = cur_floor.ftopen;
X      }
X  for (i = (y_height - 1); i <= (y_depth + 1); i++)
X    {
X      c_ptr = &cave[i][x_left-1];
X      if (c_ptr->fval != cur_floor.ftval) 
X	{
X	  c_ptr->fval  = rock_wall1.ftval;
X	  c_ptr->fopen = rock_wall1.ftopen;
X	}
X      c_ptr = &cave[i][x_right+1];
X      if (c_ptr->fval != cur_floor.ftval) 
X	{
X	  c_ptr->fval  = rock_wall1.ftval;
X	  c_ptr->fopen = rock_wall1.ftopen;
X	}
X    }
X  for (i = x_left; i <= x_right; i++)
X    {
X      c_ptr = &cave[y_height-1][i];
X      if (c_ptr->fval != cur_floor.ftval) 
X	{
X	  c_ptr->fval  = rock_wall1.ftval;
X	  c_ptr->fopen = rock_wall1.ftopen;
X	}
X      c_ptr = &cave[y_depth+1][i];
X      if (c_ptr->fval != cur_floor.ftval) 
X	{
X	  c_ptr->fval  = rock_wall1.ftval;
X	  c_ptr->fopen = rock_wall1.ftopen;
X	}
X    }
X  /* Special features...			*/
X  switch(randint(4))
X    {
X    case 1:	/* Large middle pillar		*/
X      for (i = yval-1; i <= yval+1; i++)
X	for (j = xval-1; j <= xval+1; j++)
X	  cave[i][j].fval = 8;
X      break;
X    case 2:	/* Inner treasure vault		*/
X      for (i = yval-1; i <= yval+1; i++)
X	{
X	  cave[i][xval-1].fval   = 8;
X	  cave[i][xval+1].fval   = 8;
X	}
X      cave[yval-1][xval].fval  = 8;
X      cave[yval+1][xval].fval  = 8;
X      switch(randint(4))	/* Place a door	*/
X	{
X	case 1:	place_secret_door(yval-1, xval); break;
X	case 2:	place_secret_door(yval+1, xval); break;
X	case 3:	place_secret_door(yval, xval-1); break;
X	case 4:	place_secret_door(yval, xval+1); break;
X	}
X      /* Place a treasure in the vault		*/
X      place_object(yval, xval);
X      /* Let's guard the treasure well...	*/
X      vault_monster(yval, xval, 2+randint(2));
X      /* Traps naturally			*/
X      vault_trap(yval, xval, 4, 4, 1+randint(3));
X      break;
X    case 3:
X      if (randint(3) == 1) 
X	{
X	  cave[yval-1][xval-2].fval = 8;
X	  cave[yval+1][xval-2].fval = 8;
X	  cave[yval-1][xval+2].fval = 8;
X	  cave[yval-1][xval+2].fval = 8;
X	  cave[yval-2][xval-1].fval = 8;
X	  cave[yval-2][xval+1].fval = 8;
X	  cave[yval+2][xval-1].fval = 8;
X	  cave[yval+2][xval+1].fval = 8;
X	  if (randint(3) == 1) 
X	    {
X	      place_secret_door(yval, xval-2);
X	      place_secret_door(yval, xval+2);
X	      place_secret_door(yval-2, xval);
X	      place_secret_door(yval+2, xval);
X	    }
X	}
X      else if (randint(3) == 1) 
X	{
X	  cave[yval][xval].fval = 8;
X	  cave[yval-1][xval].fval = 8;
X	  cave[yval+1][xval].fval = 8;
X	  cave[yval][xval-1].fval = 8;
X	  cave[yval][xval+1].fval = 8;
X	}
X      else if (randint(3) == 1) 
X	cave[yval][xval].fval = 8;
X      break;
X    case 4:
X      break;
X    }
X}
X
X
X/* Constructs a tunnel between two points		*/
Xbuild_tunnel(row1, col1, row2, col2)
Xint row1, col1, row2, col2;
X{
X  int tmp_row, tmp_col;
X  int row_dir, col_dir;
X  int i, j;
X  coords tunstk[1000];
X  coords wallstk[1000];
X  int tunptr;
X  int wallptr;
X  int stop_flag, door_flag;
X  cave_type *c_ptr, *d_ptr;
X
X  /* Main procedure for Tunnel			*/
X  /* Note: 9 is a temporary value		*/
X  stop_flag = FALSE;
X  door_flag = FALSE;
X  tunptr    = 0;
X  wallptr   = 0;
X  correct_dir(&row_dir, &col_dir, row1, col1, row2, col2);
X  do
X    {
X      if (randint(100) > DUN_TUN_CHG) 
X	rand_dir(&row_dir, &col_dir, row1, col1, row2, col2, DUN_TUN_RND);
X      tmp_row = row1 + row_dir;
X      tmp_col = col1 + col_dir;
X      while (!in_bounds(tmp_row, tmp_col))
X	{
X	  rand_dir(&row_dir, &col_dir, row1, col1, row2, col2, DUN_TUN_RND);
X	  tmp_row = row1 + row_dir;
X	  tmp_col = col1 + col_dir;
X	}
X      c_ptr = &cave[tmp_row][tmp_col];
X      if (c_ptr->fval == rock_wall1.ftval)
X	{
X	  row1 = tmp_row;
X	  col1 = tmp_col;
X	  wallstk[wallptr].y = row1;
X	  wallstk[wallptr].x = col1;
X	  if (wallptr < 1000) 
X	    wallptr++;
X	  for (i = row1-1; i <= row1+1; i++)
X	    for (j = col1-1; j <= col1+1; j++)
X	      if (in_bounds(i, j)) 
X		{
X		  d_ptr = &cave[i][j];
X		  if ((d_ptr->fval >= 10) && (d_ptr->fval <= 12))
X		    d_ptr->fval = 9;
X		}
X	}
X      else if (c_ptr->fval == corr_floor1.ftval) 
X	{
X	  row1 = tmp_row;
X	  col1 = tmp_col;
X	  if (!door_flag) 
X	    {
X	      if (doorptr <= 100) 
X		{
X		  doorstk[doorptr].y = row1;
X		  doorstk[doorptr].x = col1;
X		  doorptr++;
X		}
X	      door_flag = TRUE;
X	    }
X	  if (randint(100) > DUN_TUN_CON) 
X	    stop_flag = TRUE;
X	}
X      else if (c_ptr->fval == 0) 
X	{
X	  row1 = tmp_row;
X	  col1 = tmp_col;
X	  tunstk[tunptr].y = row1;
X	  tunstk[tunptr].x = col1;
X	  if (tunptr < 1000) 
X	    tunptr++;
X	  door_flag = FALSE;
X	}
X      else if (c_ptr->fval != 9) 
X	{
X	  row1 = tmp_row;
X	  col1 = tmp_col;
X	}
X    }
X  while (((row1 != row2) || (col1 != col2)) && (!stop_flag));
X  for (i = 0; i < tunptr; i++)
X    {
X      cave[tunstk[i].y][tunstk[i].x].fval  = corr_floor1.ftval;
X      cave[tunstk[i].y][tunstk[i].x].fopen = corr_floor1.ftopen;
X    }
X  for (i = 0; i < wallptr; i++)
X    {
X      c_ptr = &cave[wallstk[i].y][wallstk[i].x];
X      if (c_ptr->fval == 9) 
X	{
X	  if (randint(100) < DUN_TUN_PEN) 
X	    place_door(wallstk[i].y, wallstk[i].x);
X	  else
X	    {
X	      c_ptr->fval  = corr_floor2.ftval;
X	      c_ptr->fopen = corr_floor2.ftopen;
X	    }
X	}
X    }
X}
X
X
Xint next_to(y, x)
Xint y, x;
X{
X  int next;
X
X  if (next_to8(y, x, 4, 5, 6) > 2) 
X    if (((cave[y-1][x].fval >= 10) && (cave[y-1][x].fval <= 12)) && 
X	((cave[y+1][x].fval >= 10) && (cave[y+1][x].fval <= 12)))
X      next = TRUE;
X    else if (((cave[y][x-1].fval >= 10) && (cave[y][x-1].fval <= 12)) &&
X	     ((cave[y][x+1].fval >= 10) && (cave[y][x+1].fval <= 12)))
X      next = TRUE;
X    else
X      next = FALSE;
X  else
X    next = FALSE;
X  return(next);
X}
X
X/* Places door at y, x position if at least 2 walls found	*/
Xtry_door(y, x)
Xint y, x;
X{
X  if (randint(100) > DUN_TUN_JCT) 
X    if (cave[y][x].fval == corr_floor1.ftval) 
X      if (next_to(y, x)) 
X	place_door(y, x);
X}
X
X
X/* Cave logic flow for generation of new dungeon		*/
Xcave_gen()
X{
X  struct spot_type
X    {
X      int endx;
X      int endy;
X    };
X  int room_map[20][20];
X  int i, j, k, l;
X  int y1, x1, y2, x2;
X  int pick1, pick2;
X  int row_rooms, col_rooms;
X  int alloc_level;
X  worlint yloc[400];
X  worlint xloc[400];
X
X  int set_1_2();
X  int set_1_2_4();
X  int set_4();
X
X  row_rooms = 2*(cur_height/SCREEN_HEIGHT);
X  col_rooms = 2*(cur_width /SCREEN_WIDTH);
X  for (i = 0; i < row_rooms; i++)
X    for (j = 0; j < col_rooms; j++)
X      room_map[i][j] = FALSE;
X  for (i = 0; i < randnor(DUN_ROO_MEA, 2); i++)
X    room_map[randint(row_rooms)-1][randint(col_rooms)-1] = TRUE;
X  k = 0;
X  for (i = 0; i < row_rooms; i++)
X    for (j = 0; j < col_rooms; j++)
X      if (room_map[i][j] == TRUE) 
X	{
X	  yloc[k] = i * (quart_height * 2 + 1) + quart_height;
X	  xloc[k] = j * (quart_width * 2 + 1) + quart_width;
X	  if (dun_level > randint(DUN_UNUSUAL)) 
X	    switch(randint(3))
X	      {
X	      case 1: build_type1(yloc[k], xloc[k]); break;
X	      case 2: build_type2(yloc[k], xloc[k]); break;
X	      case 3: build_type3(yloc[k], xloc[k]); break;
X	      }
X	  else
X	    build_room(yloc[k], xloc[k]);
X	  k++;
X	}
X  for (l = 0; l < k; l++)
X    {
X      pick1 = randint(k) - 1;
X      pick2 = randint(k) - 1;
X      y1 = yloc[pick1];
X      x1 = xloc[pick1];
X      yloc[pick1] = yloc[pick2];
X      xloc[pick1] = xloc[pick2];
X      yloc[pick2] = y1;
X      xloc[pick2] = x1;
X      }
X  doorptr = 0;
X  for (l = 0; l < k-1; l++)
X    {
X      y1 = yloc[l];
X      x1 = xloc[l];
X      y2 = yloc[l+1];
X      x2 = xloc[l+1];
X      build_tunnel(y2, x2, y1, x1);
X      }
X  fill_cave(rock_wall1);
X  for (i = 0; i < DUN_STR_MAG; i++)
X    place_streamer(rock_wall2, DUN_STR_MC);
X  for (i = 0; i < DUN_STR_QUA; i++)
X    place_streamer(rock_wall3, DUN_STR_QC);
X  place_boundary();
X  /* Place intersection doors	*/
X  for (i = 0; i < doorptr; i++)
X    {
X      try_door(doorstk[i].y, doorstk[i].x-1);
X      try_door(doorstk[i].y, doorstk[i].x+1);
X      try_door(doorstk[i].y-1, doorstk[i].x);
X      try_door(doorstk[i].y+1, doorstk[i].x);
X    }
X  alloc_level = (dun_level/3);
X  if (alloc_level < 2) 
X    alloc_level = 2;
X  else if (alloc_level > 10) 
X    alloc_level = 10;
X  place_stairs(2, randint(2)+2, 3);
X  place_stairs(1, randint(2), 3);
X  alloc_monster(set_1_2, (randint(8)+MIN_MALLOC_LEVEL+alloc_level), 0, TRUE);
X  alloc_object(set_4, 3, randint(alloc_level));
X  alloc_object(set_1_2, 5, randnor(TREAS_ROOM_ALLOC, 3));
X  alloc_object(set_1_2_4, 5, randnor(TREAS_ANY_ALLOC, 3));
X  alloc_object(set_1_2_4, 4, randnor(TREAS_GOLD_ALLOC, 3));
X  alloc_object(set_1_2_4, 1, randint(alloc_level));
X  if (dun_level >= WIN_MON_APPEAR)  place_win_monster();
X}
X
X
X/* Builds a store at a row, column coordinate			*/
Xbuild_store(store_num, y, x)
Xint store_num, y, x;
X{
X  int yval, y_height, y_depth;
X  int xval, x_left, x_right;
X  int i, j, cur_pos;
X  cave_type *c_ptr;
X
X  yval	   = y*10 + 5;
X  xval     = x*16 + 16;
X  y_height = yval - randint(3);
X  y_depth  = yval + randint(4);
X  x_left   = xval - randint(6);
X  x_right  = xval + randint(6);
X  for (i = y_height; i <= y_depth; i++)
X    for (j = x_left; j <= x_right; j++)
X      {
X	cave[i][j].fval  = boundary_wall.ftval;
X	cave[i][j].fopen = boundary_wall.ftopen;
X      }
X  switch(randint(4))
X    {
X    case 1:
X      i = randint(y_depth-y_height) + y_height - 1;
X      j = x_left;
X      break;
X    case 2:
X      i = randint(y_depth-y_height) + y_height - 1;
X      j = x_right;
X      break;
X    case 3:
X      i = y_depth;
X      j = randint(x_right-x_left) + x_left - 1;
X      break;
X    case 4:
X      i = y_height;
X      j = randint(x_right-x_left) + x_left - 1;
X      break;
X    }
X  c_ptr = &cave[i][j];
X  c_ptr->fval  = corr_floor3.ftval;
X  c_ptr->fopen = corr_floor3.ftopen;
X  popt(&cur_pos);
X  c_ptr->tptr = cur_pos;
X  t_list[cur_pos] = store_door[store_num];
X}
X
X
X/* Town logic flow for generation of new town		*/
Xtown_gen()
X{
X  int i, j, k, l, m;
X  int rooms[6];
X
X  int set_1_2();
X
X  set_seed(town_state, town_seed);
X  for (i = 0; i < 6; i++)
X    rooms[i] = i;
X  l = 6;
X  for (i = 0; i < 2; i++)
X    for (j = 0; j < 3; j++)
X      {
X	k = randint(l) - 1;
X	build_store(rooms[k], i, j);
X	for (m = k; m < l-1; m++)
X	  rooms[m] = rooms[m+1];
X	l--;
X      }
X  fill_cave(dopen_floor);
X  place_boundary();
X  reset_seed();
X  if (0x1 & (turn / 5000)) 
X    {		/* Night	*/
X      for (i = 0; i < cur_height; i++)
X	for (j = 0; j < cur_width; j++)
X	  if (cave[i][j].fval != dopen_floor.ftval) 
X	    cave[i][j].pl = TRUE;
X      place_stairs(2, 1, 0);
X      alloc_monster(set_1_2, MIN_MALLOC_TN, 3, TRUE);
X      store_maint();
X    }
X  else
X    {		/* Day	*/
X      for (i = 0; i < cur_height; i++)
X	for (j = 0; j < cur_width; j++)
X	  cave[i][j].pl = TRUE;
X      place_stairs(2, 1, 0);
X      alloc_monster(set_1_2, MIN_MALLOC_TD, 3, TRUE);
X      store_maint();
X    }
X}
X
X
X/* Generates a random dungeon level			-RAK-	*/
Xgenerate_cave()
X{
X  panel_row_min	= 0;
X  panel_row_max	= 0;
X  panel_col_min	= 0;
X  panel_col_max	= 0;
X  char_row		= -1;
X  char_col		= -1;
X
X  tlink();
X  mlink();
X  blank_cave();
X
X  if (dun_level == 0) 
X    {
X      cur_height = SCREEN_HEIGHT;
X      cur_width  = SCREEN_WIDTH;
X      max_panel_rows = (cur_height/SCREEN_HEIGHT)*2 - 2;
X      max_panel_cols = (cur_width /SCREEN_WIDTH )*2 - 2;
X      panel_row = max_panel_rows;
X      panel_col = max_panel_cols;
X      town_gen();
X    }
X  else
X    {
X      cur_height = MAX_HEIGHT;
X      cur_width  = MAX_WIDTH;
X      max_panel_rows = (cur_height/SCREEN_HEIGHT)*2 - 2;
X      max_panel_cols = (cur_width /SCREEN_WIDTH )*2 - 2;
X      panel_row = max_panel_rows;
X      panel_col = max_panel_cols;
X      cave_gen();
X    }
X}
END_OF_generate.c
if test 26506 -ne `wc -c <generate.c`; then
    echo shar: \"generate.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 14 \(of 16\).
cp /dev/null ark14isdone
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/