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

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

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




#! /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 8 (of 16)."
# Contents:  dungeon.c wizard.c
# Wrapped by billr@tekred on Wed Nov  4 09:59:53 1987
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f dungeon.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"dungeon.c\"
else
echo shar: Extracting \"dungeon.c\" \(41414 characters\)
sed "s/^X//" >dungeon.c <<'END_OF_dungeon.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#ifdef USG
Xunsigned sleep();
X#endif
X
X#ifdef ultrix
Xvoid sleep();
X#endif
X
X/* global flags */
Xint moria_flag;        /* Next level when true  */
Xint search_flag;       /* Player is searching   */
Xint teleport_flag;     /* Handle teleport traps  */
Xint player_light;      /* Player carrying light */
Xint cave_flag;         /* used in get_panel */
Xint light_flag;        /* used in move_light */
X
X/* Moria game module					-RAK-	*/
X/* The code in this section has gone through many revisions, and */
X/* some of it could stand some more hard work...  -RAK-          */
Xdungeon()
X{
X  int old_chp, old_cmana;      /* Detect change         */
X  double regen_amount;         /* Regenerate hp and mana*/
X  char command;         /* Last command          */
X  int save_msg_flag;      /* Msg flag after INKEY  */
X  struct misc *p_ptr;
X  treasure_type *i_ptr;
X  struct flags *f_ptr;
X  int set_floor();
X
X  /* Main procedure for dungeon... 			-RAK-	*/
X  /* Note: There is a lot of preliminary magic going on here at first*/
X  
X  /* Check light status for setup          */
X  i_ptr = &inventory[32];
X  if (i_ptr->p1 > 0) 
X    player_light = TRUE;
X  else
X    player_light = FALSE;
X  /* Check for a maximum level             */
X  p_ptr = &py.misc;
X  if (dun_level > p_ptr->max_lev)  p_ptr->max_lev = dun_level;
X  /* Set up the character co-ords          */
X  if ((char_row == -1) || (char_col == -1)) 
X    new_spot(&char_row, &char_col);
X  /* Reset flags and initialize variables  */
X  moria_flag    = FALSE;
X  cave_flag     = FALSE;
X  find_flag     = FALSE;
X  search_flag   = FALSE;
X  teleport_flag = FALSE;
X  mon_tot_mult  = 0;
X  cave[char_row][char_col].cptr = 1;
X  old_chp   = (int)py.misc.chp;
X  old_cmana = (int)py.misc.cmana;
X  /* Light up the area around character    */
X  move_char(5);
X  /* Light,  but do not move critters       */
X  creatures(FALSE);
X  /* Print the depth                       */
X  prt_depth();
X
X  /* Loop until dead,  or new level 		*/
X  do
X    {
X      /* Increment turn counter			*/
X      turn++;
X      /* Check for game hours                          */
X      if (!wizard1) 
X	if ((turn % 250) == 1) 
X	  if (!check_time()) 
X	    if (closing_flag > 4) 
X	      {
X		if (search_flag) 
X		  search_off();
X		if (py.flags.rest > 0) 
X		  rest_off();
X		find_flag = FALSE;
X		msg_print("The gates to Moria are now closed.");
X		msg_print("");
X		do
X		  {
X		    save_char(TRUE, FALSE);
X		  }
X		while (TRUE);
X	      }
X	    else
X	      {
X		if (search_flag) 
X		  search_off();
X		if (py.flags.rest > 0) 
X		  rest_off();
X		find_flag = FALSE;
X		move_char(5);
X		closing_flag++;
X		msg_print("The gates to Moria are closing...");
X		msg_print("Please finish up or save your game.");
X		msg_print("");
X	      }
X
X      /* Check for creature generation 		*/
X      if (randint(MAX_MALLOC_CHANCE) == 1) 
X	alloc_monster(set_floor, 1, MAX_SIGHT, FALSE);
X      /* Screen may need updating,  used mostly for stats*/
X      if (print_stat != 0) 
X	{
X	  if (0x0001 & print_stat)
X	    prt_strength();
X	  if (0x0002 & print_stat)
X	    prt_dexterity();
X	  if (0x0004 & print_stat)
X	    prt_constitution();
X	  if (0x0008 & print_stat)
X	    prt_intelligence();
X	  if (0x0010 & print_stat)
X	    prt_wisdom();
X	  if (0x0020 & print_stat)
X	    prt_charisma();
X	  if (0x0040 & print_stat)
X	    prt_pac();
X	  if (0x0100 & print_stat)
X	    prt_mhp();
X	  if (0x0200 & print_stat)
X	    prt_title();
X	  if (0x0400 & print_stat)
X	    prt_level();
X	}
X      /* Check light status                            */
X      i_ptr = &inventory[32];
X      if (player_light) 
X	if (i_ptr->p1 > 0) 
X	  {
X	    i_ptr->p1--;
X	    if (i_ptr->p1 == 0) 
X	      {
X		msg_print("Your light has gone out!");
X		player_light = FALSE;
X		find_flag = FALSE;
X		move_light(char_row, char_col, char_row, char_col);
X	      }
X	    else if (i_ptr->p1 < 40) 
X	      if (randint(5) == 1) 
X		{
X		  if (find_flag) 
X		    {
X		      find_flag = FALSE;
X		      move_light(char_row, char_col, char_row, char_col);
X		    }
X		  msg_print("Your light is growing faint.");
X		}
X	  }
X	else
X	  {
X	    player_light = FALSE;
X	    find_flag = FALSE;
X	    move_light(char_row, char_col, char_row, char_col);
X	  }
X      else if (i_ptr->p1 > 0) 
X	{
X	  i_ptr->p1--;
X	  player_light = TRUE;
X	  move_light(char_row, char_col, char_row, char_col);
X	}
X
X      /* Update counters and messages			*/
X      f_ptr = &py.flags;
X      /* Check food status             */
X      regen_amount = PLAYER_REGEN_NORMAL;
X      if (f_ptr->food < PLAYER_FOOD_ALERT) 
X	{
X	  if (f_ptr->food < PLAYER_FOOD_WEAK) 
X	    {
X	      if (f_ptr->food < 0) 
X		regen_amount = 0;
X	      else if (f_ptr->food < PLAYER_FOOD_FAINT) 
X		regen_amount = PLAYER_REGEN_FAINT;
X	      else if (f_ptr->food < PLAYER_FOOD_WEAK) 
X		regen_amount = PLAYER_REGEN_WEAK;
X	      if ((0x00000002 & f_ptr->status) == 0) 
X		{
X		  f_ptr->status |= 0x00000003;
X		  msg_print("You are getting weak from hunger.");
X		  if (find_flag) 
X		    {
X		      find_flag = FALSE;
X		      move_char(5);
X		    }
X		  prt_hunger();
X		}
X	      if (f_ptr->food < PLAYER_FOOD_FAINT) 
X		if (randint(8) == 1) 
X		  {
X		    f_ptr->paralysis += randint(5);
X		    msg_print("You faint from the lack of food.");
X		    if (find_flag) 
X		      {
X			find_flag = FALSE;
X			move_char(5);
X		      }
X		  }
X	    }
X	  else
X	    {
X	      if ((0x00000001 & f_ptr->status) == 0) 
X		{
X		  f_ptr->status |= 0x00000001;
X		  msg_print("You are getting hungry.");
X		  if (find_flag) 
X		    {
X		      find_flag = FALSE;
X		      move_char(5);
X		    }
X		  prt_hunger();
X		}
X	    }
X	}
X      /* Food consumption       */
X      /* Note: Speeded up characters really burn up the food!  */
X      if (f_ptr->speed < 0) 
X	f_ptr->food +=  -(f_ptr->speed*f_ptr->speed) - 
X	  f_ptr->food_digested;
X      else
X	f_ptr->food -= f_ptr->food_digested;
X      /* Regenerate            */
X      p_ptr = &py.misc;
X      if (f_ptr->regenerate)  regen_amount *= 1.5;
X      if (f_ptr->rest > 0)    regen_amount *= 2;
X      if (py.flags.poisoned < 1) 
X	if (p_ptr->chp < p_ptr->mhp) 
X	  regenhp(regen_amount);
X      if (p_ptr->cmana < p_ptr->mana) 
X	regenmana(regen_amount);
X      /* Blindness             */
X      if (f_ptr->blind > 0) 
X	{
X	  if ((0x00000004 & f_ptr->status) == 0) 
X	    {
X	      f_ptr->status |= 0x00000004;
X	      prt_map();
X	      prt_blind();
X	      if (search_flag) 
X		search_off();
X	    }
X	  f_ptr->blind--;
X	  if (f_ptr->blind == 0) 
X	    {
X	      f_ptr->status &= 0xFFFFFFFB;
X	      prt_blind();
X	      prt_map();
X	      msg_print("The veil of darkness lifts.");
X	      if (find_flag) 
X		{
X		  find_flag = FALSE;
X		}
X	      /* turn light back on */
X	      move_char(5);
X	    }
X	}
X      /* Confusion             */
X      if (f_ptr->confused > 0) 
X	{
X	  if ((0x00000008 & f_ptr->status) == 0) 
X	    {
X	      f_ptr->status |= 0x00000008;
X	      prt_confused();
X	    }
X	  f_ptr->confused--;
X	  if (f_ptr->confused == 0) 
X	    {
X	      f_ptr->status &= 0xFFFFFFF7;
X	      prt_confused();
X	      msg_print("You feel less confused now.");
X	      if (find_flag) 
X		{
X		  find_flag = FALSE;
X		  move_char(5);
X		}
X	    }
X	}
X      /* Afraid                */
X      if (f_ptr->afraid > 0) 
X	{
X	  if ((0x00000010 & f_ptr->status) == 0) 
X	    {
X	      if ((f_ptr->shero+f_ptr->hero) > 0) 
X		f_ptr->afraid = 0;
X	      else
X		{
X		  f_ptr->status |= 0x00000010;
X		  prt_afraid();
X		}
X	    }
X	  else if ((f_ptr->shero+f_ptr->hero) > 0) 
X	    f_ptr->afraid = 1;
X	  f_ptr->afraid--;
X	  if (f_ptr->afraid == 0) 
X	    {
X	      f_ptr->status &= 0xFFFFFFEF;
X	      prt_afraid();
X	      msg_print("You feel bolder now.");
X	      if (find_flag) 
X		{
X		  find_flag = FALSE;
X		  move_char(5);
X		}
X	    }
X	}
X      /* Poisoned              */
X      if (f_ptr->poisoned > 0) 
X	{
X	  if ((0x00000020 & f_ptr->status) == 0) 
X	    {
X	      f_ptr->status |= 0x00000020;
X	      prt_poisoned();
X	    }
X	  f_ptr->poisoned--;
X	  if (f_ptr->poisoned == 0) 
X	    {
X	      f_ptr->status &= 0xFFFFFFDF;
X	      prt_poisoned();
X	      msg_print("You feel better.");
X	      if (find_flag) 
X		{
X		  find_flag = FALSE;
X		  move_char(5);
X		}
X	    }
X	  else
X	    {
X	      switch(con_adj())
X		{
X		case -4:
X		  take_hit(4, "poison.");
X		  break;
X		case -3: case  -2:
X		  take_hit(3, "poison.");
X		  break;
X		case -1:
X		  take_hit(2, "poison.");
X		  break;
X		case 0:
X		  take_hit(1, "poison.");
X		  break;
X		case 1: case 2: case 3:
X		  if ((turn % 2) == 0) 
X		    take_hit(1, "poison.");
X		  break;
X		case 4: case 5:
X		  if ((turn % 3) == 0) 
X		    take_hit(1, "poison.");
X		  break;
X		case 6:
X		  if ((turn % 4) == 0) 
X		    take_hit(1, "poison.");
X		  break;
X		}
X	    }
X	}
X      /* Fast                  */
X      if (f_ptr->fast > 0) 
X	{
X	  if ((0x00000040 & f_ptr->status) == 0) 
X	    {
X	      f_ptr->status |= 0x00000040;
X	      msg_print("You feel yourself moving faster.");
X	      change_speed(-1);
X	      if (find_flag) 
X		{
X		  find_flag = FALSE;
X		  move_char(5);
X		}
X	    }
X	  f_ptr->fast--;
X	  if (f_ptr->fast == 0) 
X	    {
X	      f_ptr->status &= 0xFFFFFFBF;
X	      msg_print("You feel yourself slow down.");
X	      change_speed(1);
X	      if (find_flag) 
X		{
X		  find_flag = FALSE;
X		  move_char(5);
X		}
X	    }
X	}
X      /* Slow                  */
X      if (f_ptr->slow > 0) 
X	{
X	  if ((0x00000080 & f_ptr->status) == 0) 
X	    {
X	      f_ptr->status |= 0x00000080;
X	      msg_print("You feel yourself moving slower.");
X	      change_speed(1);
X	      if (find_flag) 
X		{
X		  find_flag = FALSE;
X		  move_char(5);
X		}
X	    }
X	  f_ptr->slow--;
X	  if (f_ptr->slow == 0) 
X	    {
X	      f_ptr->status &= 0xFFFFFF7F;
X	      msg_print("You feel yourself speed up.");
X	      change_speed(-1);
X	      if (find_flag) 
X		{
X		  find_flag = FALSE;
X		  move_char(5);
X		}
X	    }
X	}
X      /* Resting is over?      */
X      if (f_ptr->rest > 0) 
X	{
X	  /* Hibernate every 20 iterations so that process does  */
X	  /* not eat up system...                                */
X	  /* NOTE: Remove comments for VMS version 4.0 or greater*/
X	  /*       INKEY_DELAY takes care of hibernation for     */
X	  /*       VMS 3.7 or less                               */
X	  if ((f_ptr->rest % 20) == 1)  (void) sleep(1);
X	  f_ptr->rest--;
X	  /* Test for any key being hit to abort rest.  Also,    */
X	  /* this will do a PUT_QIO which updates the screen...  */
X	  /* One more side benefit; since inkey_delay hibernates */
X	  /* small amount before executing, this makes resting   */
X	  /* less CPU intensive...                               */
X/*	  inkey_delay(&command, 0);  */
X	  put_qio();
X	  if (f_ptr->rest == 0)               /* Resting over          */
X	    rest_off();
X/*	  else if (command != '\0') */ /*  Resting aborted       */
X/*	    rest_off();  */
X	}
X      /* Hallucinating?  (Random characters appear!)*/
X      if (f_ptr->image > 0) 
X	{
X	  f_ptr->image--;
X	  if (f_ptr->image == 0) 
X	    draw_cave();
X	}
X      /* Paralysis             */
X      if (f_ptr->paralysis > 0) 
X	{
X	  f_ptr->paralysis--;
X	  if (f_ptr->rest > 0) 
X	    rest_off();
X	  if (search_flag) 
X	    search_off();
X	}
X      /* Protection from evil counter*/
X      if (f_ptr->protevil > 0)  f_ptr->protevil--;
X      /* Invulnerability        */
X      if (f_ptr->invuln > 0) 
X	{
X	  if ((0x00001000 & f_ptr->status) == 0) 
X	    {
X	      f_ptr->status |= 0x00001000;
X	      if (find_flag) 
X		{
X		  find_flag = FALSE;
X		  move_char(5);
X		}
X	      msg_print("Your skin turns into steel!");
X	      py.misc.pac += 100;
X	      py.misc.dis_ac += 100;
X	      prt_pac();
X	    }
X	  f_ptr->invuln--;
X	  if (f_ptr->invuln == 0) 
X	    {
X	      f_ptr->status &= 0xFFFFEFFF;
X	      if (find_flag) 
X		{
X		  find_flag = FALSE;
X		  move_char(5);
X		}
X	      msg_print("Your skin returns to normal...");
X	      py.misc.pac -= 100;
X	      py.misc.dis_ac -= 100;
X	      prt_pac();
X	    }
X	}
X      /* Heroism       */
X      if (f_ptr->hero > 0) 
X	{
X	  if ((0x00002000 & f_ptr->status) == 0) 
X	    {
X	      f_ptr->status |= 0x00002000;
X	      if (find_flag) 
X		{
X		  find_flag = FALSE;
X		  move_char(5);
X		}
X	      p_ptr = &py.misc;
X	      p_ptr->mhp += 10;
X	      p_ptr->chp += 10.0;
X	      p_ptr->bth += 12;
X	      p_ptr->bthb+= 12;
X	      msg_print("You feel like a HERO!");
X	      prt_mhp();
X	    }
X	  f_ptr->hero--;
X	  if (f_ptr->hero == 0) 
X	    {
X	      f_ptr->status &= 0xFFFFDFFF;
X	      if (find_flag) 
X		{
X		  find_flag = FALSE;
X		  move_char(5);
X		}
X	      p_ptr = &py.misc;
X	      p_ptr->mhp -= 10;
X	      if (p_ptr->chp > p_ptr->mhp)  p_ptr->chp = p_ptr->mhp;
X	      p_ptr->bth -= 12;
X	      p_ptr->bthb-= 12;
X	      msg_print("The heroism wears off.");
X	      prt_mhp();
X	    }
X	}
X      /* Super Heroism */
X      if (f_ptr->shero > 0) 
X	{
X	  if ((0x00004000 & f_ptr->status) == 0) 
X	    {
X	      f_ptr->status |= 0x00004000;
X	      if (find_flag) 
X		{
X		  find_flag = FALSE;
X		  move_char(5);
X		}
X	      p_ptr = &py.misc;
X	      p_ptr->mhp += 20;
X	      p_ptr->chp += 20.0;
X	      p_ptr->bth += 24;
X	      p_ptr->bthb+= 24;
X	      msg_print("You feel like a SUPER HERO!");
X	      prt_mhp();
X	    }
X	  f_ptr->shero--;
X	  if (f_ptr->shero == 0) 
X	    {
X	      f_ptr->status &= 0xFFFFBFFF;
X	      if (find_flag) 
X		{
X		  find_flag = FALSE;
X		  move_char(5);
X		}
X	      p_ptr = &py.misc;
X	      p_ptr->mhp -= 20;
X	      if (p_ptr->chp > p_ptr->mhp)  p_ptr->chp = p_ptr->mhp;
X	      p_ptr->bth -= 24;
X	      p_ptr->bthb-= 24;
X	      msg_print("The super heroism wears off.");
X	      prt_mhp();
X	    }
X	}
X      /* Blessed       */
X      if (f_ptr->blessed > 0) 
X	{
X	  if ((0x00008000 & f_ptr->status) == 0) 
X	    {
X	      f_ptr->status |= 0x00008000;
X	      if (find_flag) 
X		{
X		  find_flag = FALSE;
X		  move_char(5);
X		}
X	      p_ptr = &py.misc;
X	      p_ptr->bth += 5;
X	      p_ptr->bthb+= 5;
X	      p_ptr->pac += 2;
X	      p_ptr->dis_ac+= 2;
X	      msg_print("You feel righteous!");
X	      prt_mhp();
X	      prt_pac();
X	    }
X	  f_ptr->blessed--;
X	  if (f_ptr->blessed == 0) 
X	    {
X	      f_ptr->status &= 0xFFFF7FFF;
X	      if (find_flag) 
X		{
X		  find_flag = FALSE;
X		  move_char(5);
X		}
X	      p_ptr = &py.misc;
X	      p_ptr->bth -= 5;
X	      p_ptr->bthb-= 5;
X	      p_ptr->pac -= 2;
X	      p_ptr->dis_ac -= 2;
X	      msg_print("The prayer has expired.");
X	      prt_mhp();
X	      prt_pac();
X	    }
X	}
X      /* Resist Heat   */
X      if (f_ptr->resist_heat > 0)  f_ptr->resist_heat--;
X      /* Resist Cold   */
X      if (f_ptr->resist_cold > 0)  f_ptr->resist_cold--;
X      /* Detect Invisible      */
X      if (f_ptr->detect_inv > 0) 
X	{
X	  if ((0x00010000 & f_ptr->status) == 0) 
X	    {
X	      f_ptr->status |= 0x00010000;
X	      f_ptr->see_inv = TRUE;
X	    }
X	  f_ptr->detect_inv--;
X	  if (f_ptr->detect_inv == 0) 
X	    {
X	      f_ptr->status &= 0xFFFEFFFF;
X	      f_ptr->see_inv = FALSE;
X	      py_bonuses(blank_treasure, 0);
X	    }
X	}
X      /* Timed infra-vision    */
X      if (f_ptr->tim_infra > 0) 
X	{
X	  if ((0x00020000 & f_ptr->status) == 0) 
X	    {
X	      f_ptr->status |= 0x00020000;
X	      f_ptr->see_infra++;
X	    }
X	  f_ptr->tim_infra--;
X	  if (f_ptr->tim_infra == 0) 
X	    {
X	      f_ptr->status &= 0xFFFDFFFF;
X	      f_ptr->see_infra--;
X	    }
X	}
X	/* Word-of-Recall  Note: Word-of-Recall is a delayed action      */
X      if (f_ptr->word_recall > 0) 
X	if (f_ptr->word_recall == 1) 
X	  {
X	    if (dun_level > 0) 
X	      {
X		msg_print("You feel yourself yanked upwards!");
X		dun_level = 0;
X	      }
X	    else if (py.misc.max_lev != 0) 
X	      {
X		msg_print("You feel yourself yanked downwards!");
X		dun_level = py.misc.max_lev;
X	      }
X	    moria_flag = TRUE;
X	    f_ptr->paralysis++;
X	    f_ptr->word_recall = 0;
X	  }
X	else
X	  f_ptr->word_recall--;
X
X      /* Check hit points for adjusting...			*/
X      p_ptr = &py.misc;
X      if (!find_flag) 
X	if (py.flags.rest < 1) 
X	  {
X	    if (old_chp != (int)(p_ptr->chp)) 
X	      {
X		if (p_ptr->chp > p_ptr->mhp)
X		  p_ptr->chp = (double)p_ptr->mhp;
X		prt_chp();
X		old_chp = (int)p_ptr->chp;
X	      }
X	    if (old_cmana != (int)(p_ptr->cmana)) 
X	      {
X		if (p_ptr->cmana > p_ptr->mana)
X		  p_ptr->cmana = (double)p_ptr->mana;
X		prt_cmana();
X		old_cmana = (int)p_ptr->cmana;
X	      }
X	  }
X
X      if ((py.flags.paralysis < 1) &&        /* Accept a command?     */
X	  (py.flags.rest < 1) &&
X	  (!death)) 
X	/* Accept a command and execute it                               */
X	{
X	  do
X	    {
X	      print_stat = 0;
X	      reset_flag = FALSE;
X	      /* Random teleportation  */
X	      if (py.flags.teleport) 
X		if (randint(100) == 1) 
X		  {
X		    find_flag = FALSE;
X		    teleport(40);
X		  }
X	      if (!find_flag) 
X		{
X		  print("", char_row, char_col);
X		  save_msg_flag = msg_flag;
X		  do
X		    {
X		      inkey(&command);
X		    }
X		  while (command == ' ');
X		  if (save_msg_flag)  erase_line(msg_line, msg_line);
X		  global_com_val = (command);
X		}
X	      /* Commands are executed in following subroutines     */
X	      if (key_bindings == ORIGINAL)
X		original_commands(&global_com_val);
X	      else
X		rogue_like_commands(&global_com_val);
X	      /* End of commands                                     */
X	    }
X	  while ((reset_flag) && (!moria_flag));
X	}
X      /* Teleport?                     */
X      if (teleport_flag)  teleport(100);
X      /* Move the creatures            */
X      if (!moria_flag)  creatures(TRUE);
X      /* Exit when moria_flag is set   */
X    }
X  while (!moria_flag);
X  if (search_flag)  search_off();  /* Fixed "SLOW" bug; 06-11-86 RAK     */
X}
X
X
Xoriginal_commands(com_val)
Xint *com_val;
X{
X  int y, x, dir_val;
X  char command;
X  int i;
X  vtype out_val, tmp_str;
X  struct stats *s_ptr;
X  struct flags *f_ptr;
X  int set_floor();
X
X  switch(*com_val)
X    {
X    case 0: case 11:		/*^K == exit    */
X      flush();
X      if (get_com("Enter 'Q' to quit", &command)) 
X	switch(command)
X	  {
X	  case 'q': case  'Q':
X	    moria_flag = TRUE;
X	    death      = TRUE;
X            /* need dot on the end to be consistent with creature.c */
X            (void) strcpy(died_from, "Quitting.");
X	    break;
X	  default:
X	    break;
X	  }
X      reset_flag = TRUE;
X      break;
X    case 13:                               /*^M == repeat  */
X      msg_print(old_msg);
X      reset_flag = TRUE;
X      break;
X    case 16: 
X      if (wizard1)                        /*^P == password*/
X	{
X	  msg_print("Wizard mode off.");
X	  wizard1 = FALSE;
X	  wizard2 = FALSE;
X	  reset_flag = TRUE;
X	}
X      else
X	{
X	  if (check_pswd()) 
X	    {
X	      msg_print("Wizard mode on.");
X	    }
X	  reset_flag = TRUE;
X	}
X      break;
X    case 18:                               /*^R == redraw  */
X      really_clear_screen();
X      draw_cave();
X      reset_flag = TRUE;
X      break;
X    case 24:                               /*^Z == save    */
X      if (total_winner) 
X	{
X	  msg_print("You are a Total Winner,  your character must be retired...");
X	  msg_print("Use <Control>-K to when you are ready to quit.");
X	}
X      else
X	{
X	  if (search_flag)  search_off();
X	  save_char(TRUE, FALSE);
X	}
X      break;
X    case 32:                                /*SPACE do nothing */
X      reset_flag = TRUE;
X      break;
X    case '!':                                /*!  == Shell   */
X      clear_screen(0, 0);
X      prt("[Entering shell, type 'exit' to resume your game]\n",0,0);
X      shell_out();
X      clear_screen(0, 0);
X      draw_cave();
X      reset_flag = TRUE;
X      break;
X    case 46:                                   /*. == find     */
X      y = char_row;
X      x = char_col;
X      if (get_dir("Which direction?", &dir_val, com_val, &y, &x))
X	{
X	  find_flag = TRUE;
X	  move_char(dir_val);
X	}
X      break;
X    case 47:                          /* / == identify */
X      ident_char();
X      reset_flag = TRUE;
X      break;
X    case 49:
X      move_char(*com_val - 48);        /* Move dir 1    */
X      break;
X    case 50:
X      move_char(*com_val - 48);        /* Move dir 2    */
X      break;
X    case 51:
X      move_char(*com_val - 48);        /* Move dir 3    */
X      break;
X    case 52:
X      move_char(*com_val - 48);        /* Move dir 4    */
X      break;
X    case 53:                          /* Rest one turn */
X      move_char(*com_val - 48);
X      (void) sleep(0);     /* Sleep 1/10 a second*/
X      flush();
X      break;
X    case 54:
X      move_char(*com_val - 48);        /* Move dir 6    */
X      break;
X    case 55:
X      move_char(*com_val - 48);        /* Move dir 7    */
X      break;
X    case 56:
X      move_char(*com_val - 48);        /* Move dir 8    */
X      break;
X    case 57:
X      move_char(*com_val - 48);        /* Move dir 9    */
X      break;
X    case 60:
X      go_up();                                  /*< == go up    */
X      break;
X    case 62:
X      go_down();                                /*> == go down  */
X      break;
X    case 63:                                  /*? == help     */
X      original_help();
X      reset_flag = TRUE;   /* Free move     */
X      break;
X  /*  case 65:   /* Debug feature for weight
X      x = 0;
X      for (i = 0; i < INVEN_MAX; i++)
X	{
X	  i_ptr = &inventory[i];
X	  x += i_ptr->weight*i_ptr->number;
X	  (void) sprintf(out_val, "%d | %d", inven_weight, x);
X	  msg_print(out_val);
X	}
X      break;                             */
X    case 66:
X      bash();                                   /*B == bash     */
X      break;
X    case 67:                                   /*C == character*/
X      if (get_com("Print to file? (Y/N)", &command)) 
X	switch(command)
X	  {
X	  case 'y': case 'Y':
X	    file_character();
X	    break;
X	  case 'n': case 'N':
X	    change_name();
X	    draw_cave();
X	    break;
X	  default:
X	    break;
X	  }
X      reset_flag = TRUE;   /* Free move     */
X      break;
X    case 68:    
X      disarm_trap();                            /*D == disarm   */
X      break;
X    case 69:
X      eat();                                    /*E == eat      */
X      break;
X    case 70:
X      refill_lamp();                            /*F == refill   */
X      break;
X    case 76:                                   /*L == location */
X      reset_flag = TRUE;   /* Free move     */
X      if ((py.flags.blind > 0) || (no_light())) 
X	msg_print("You can't see your map.");
X      else
X	{
X	  (void) sprintf(out_val,
X			 "Section [%d,%d]; Location == [%d,%d]",
X			 (((char_row-1)/OUTPAGE_HEIGHT)+1),
X			 (((char_col-1)/OUTPAGE_WIDTH )+1), 
X			 char_row, char_col);
X	  msg_print(out_val);
X	}
X      break;
X    case 80:                                   /*P == print map*/
X      reset_flag = TRUE;   /* Free move     */
X      if ((py.flags.blind > 0) || (no_light())) 
X	msg_print("You can't see to draw a map.");
X      else
X	print_map();
X      break;
X    case 82:
X      rest();                                   /*R == rest     */
X      break;
X    case 83:
X      if (search_flag)                    /*S == srh mode */
X	{
X	  search_off();
X	  reset_flag = TRUE; /* Free move     */
X	}
X      else if (py.flags.blind > 0) 
X	msg_print("You are incapable of searching while blind.");
X      else
X	{
X	  search_on();
X	  reset_flag = TRUE; /* Free move     */
X	}
X      break;
X    case 84:
X      y = char_row;
X      x = char_col;
X      if (get_dir("Which direction?", &dir_val, com_val, &y, &x))
X	{
X	  tunnel(y, x);                /*T == tunnel   */
X	}
X      break;
X    case 97:
X      aim();                                    /*a == aim      */
X      break;
X    case 98:
X      examine_book();                           /*b == browse   */
X      break;
X    case 99:
X      closeobject();                            /*c == close    */
X      break;
X    case 100:
X      drop();                                   /*d == drop     */
X      break;
X    case 101:                                   /*e == equipment*/
X      reset_flag = TRUE;   /* Free move     */
X      if (inven_command('e', 0, 0))  draw_cave();
X      break;
X    case 102:
X      throw_object();                           /*f == throw    */
X      break;
X  /*    case 104:                                 /*h == moria hlp 
X      moria_help("");
X      draw_cave();
X      reset_flag = TRUE;   /* Free move    
X      break;                      */
X    case 105:                                /*i == inventory*/
X      reset_flag = TRUE;   /* Free move     */
X      if (inven_command('i', 0, 0))  draw_cave();
X      break;
X    case 106:
X      jamdoor();                                /*j == jam      */
X      break;
X    case 108:                                 /*l == look     */
X      look();
X      reset_flag = TRUE;   /* Free move     */
X      break;
X    case 109:
X      cast();                                   /*m == magick   */
X      break;
X    case 111:
X      openobject();                             /*o == open     */
X      break;
X    case 112:
X      pray();                                   /*p == pray     */
X      break;
X    case 113:
X      quaff();                                  /*q == quaff    */
X      break;
X    case 114:
X      read_scroll();                            /*r == read     */
X      break;
X    case 115:
X      if (py.flags.blind > 0)             /*s == search   */
X	msg_print("You are incapable of searching while blind.");
X      else
X	search(char_row, char_col, py.misc.srh);
X      break;
X    case 116:                              /*t == unwear   */
X      reset_flag = TRUE;
X      if (inven_command('t', 0, 0))  draw_cave();
X      break;
X    case 117:
X      use();                                    /*u == use staff*/
X      break;
X    case 118:
X      game_version();                           /*v == version  */
X      break;
X    case 119:                                 /*w == wear     */
X      reset_flag = TRUE;
X      if (inven_command('w', 0, 0))  draw_cave();
X      break;
X    case 120:                                 /*x == exchange */
X      reset_flag = TRUE;
X      if (inven_command('x', 0, 0))  draw_cave();
X      break;
X    default:
X      if (wizard1) 
X	{
X	  reset_flag = TRUE; /* Wizard commands are free moves*/
X	  switch(*com_val)
X	    {
X	    case 1:                            /*^A == Cure all*/
X	      (void) remove_curse();
X	      (void) cure_blindness();
X	      (void) cure_confusion();
X	      (void) cure_poison();
X	      (void) remove_fear();
X	      s_ptr = &py.stats;
X	      s_ptr->cstr = s_ptr->str;
X	      s_ptr->cint = s_ptr->intel;
X	      s_ptr->cwis = s_ptr->wis;
X	      s_ptr->cdex = s_ptr->dex;
X	      s_ptr->ccon = s_ptr->con;
X	      s_ptr->cchr = s_ptr->chr;
X	      f_ptr = &py.flags;
X	      if (f_ptr->slow > 1) 
X		f_ptr->slow = 1;
X	      if (f_ptr->image > 1) 
X		f_ptr->image = 1;
X	      put_qio();
X	      break;
X	    case 2:
X	      print_objects();                  /*^B == objects */
X	      break;
X	    case 4:                           /*^D == up/down */
X	      prt("Go to which level (0 -1200) ? ", 0, 0);
X	      i = -1;
X	      if (get_string(tmp_str, 0, 30, 10))
X		(void) sscanf(tmp_str, "%d", &i);
X	      if (i > -1) 
X		{
X		  dun_level = i;
X		  if (dun_level > 1200) 
X		    dun_level = 1200;
X		  moria_flag = TRUE;
X		}
X	      else
X		erase_line(msg_line, msg_line);
X	      break;
X	    case 8:
X	      original_wizard_help();           /*^H == wizhelp */
X	      break;
X	    case 9:
X	      (void) ident_spell();             /*^I == identify*/
X	      break;
X	    case 14:
X	      print_monsters();                 /*^N == mon map */
X	      break;
X	    case 12:
X	      wizard_light();                   /*^L == wizlight*/
X	      break;
X	    case 20:
X	      teleport(100);                    /*^T == teleport*/
X	      break;
X	    case 22:
X	      restore_char();                   /*^V == restore */
X	      prt_stat_block();
X	      moria_flag = TRUE;
X	      break;
X	    default: 
X	      if (wizard2) 
X		switch(*com_val)
X		  {
X		  case 5:
X		    change_character();         /*^E == wizchar */
X		    break;
X		  case 6:
X		    (void) mass_genocide();     /*^F == genocide*/
X		    put_qio();
X		    break;
X		  case 7:                       /*^G == treasure*/
X		    alloc_object(set_floor, 5, 10);
X		    put_qio();
X		    break;
X		  case 10:                      /*^J == gain exp*/
X		    if (py.misc.exp == 0)
X		      py.misc.exp = 1;
X		    else
X		      py.misc.exp *= 2;
X		    prt_experience();
X		    break;
X		  case 21:                    /*^U == summon  */
X		    y = char_row;
X		    x = char_col;
X		    (void) summon_monster(&y, &x, TRUE);
X		    creatures(FALSE);
X		    break;
X		  case 23:
X		    wizard_create();          /*^W == create  */
X		    break;
X		  default:
X		    prt("Type '?' for help...", 0, 0);
X		    break;
X		  }
X	      else
X		prt("Type '?' for help...", 0, 0);
X	    }
X	}
X      else
X	{
X	  prt("Type '?' for help...", 0, 0);
X	  reset_flag = TRUE;
X	}
X    }
X}
X
X
Xrogue_like_commands(com_val)
Xint *com_val;
X{
X  int y, x;
X  char command;
X  int i;
X  vtype out_val, tmp_str;
X  struct stats *s_ptr;
X  struct flags *f_ptr;
X  int set_floor();
X
X  switch(*com_val)
X    {
X    case 0: case 'Q':		/*Q == exit    */
X      flush();
X      if (get_com("Do you really want to quit?", &command)) 
X	switch(command)
X	  {
X	  case 'y': case  'Y':
X	    moria_flag = TRUE;
X	    death      = TRUE;
X            /* need dot on the end to be consistent with creature.c */
X            (void) strcpy(died_from, "Quitting.");
X	    break;
X	  default:
X	    break;
X	  }
X      reset_flag = TRUE;
X      break;
X    case 16:                               /*^P == repeat  */
X      msg_print(old_msg);
X      reset_flag = TRUE;
X      break;
X    case 23: 
X      if (wizard1)                        /*^W == password*/
X	{
X	  msg_print("Wizard mode off.");
X	  wizard1 = FALSE;
X	  wizard2 = FALSE;
X	  reset_flag = TRUE;
X	}
X      else
X	{
X	  if (check_pswd()) 
X	    {
X	      msg_print("Wizard mode on.");
X	    }
X	  reset_flag = TRUE;
X	}
X      break;
X    case 18:                               /*^R == redraw  */
X      really_clear_screen();
X      draw_cave();
X      reset_flag = TRUE;
X      break;
X    case 24:                               /*^X == save    */
X      if (total_winner) 
X	{
X	  msg_print("You are a Total Winner,  your character must be retired...");
X	  msg_print("Use 'Q' to when you are ready to quit.");
X	}
X      else
X	{
X	  if (search_flag)  search_off();
X	  save_char(TRUE, FALSE);
X	}
X      break;
X    case ' ':                                /*SPACE do nothing */
X      reset_flag = TRUE;
X      break;
X    case '!':                                /*!  == Shell   */
X      clear_screen(0, 0);
X      prt("[Entering shell, type '^D' to resume your game]\n",0,0);
X      shell_out();
X      clear_screen(0, 0);
X      draw_cave();
X      reset_flag = TRUE;
X      break;
X    case 'b':
X      move_char(1);
X      break;
X    case 'j':
X      move_char(2);
X      break;
X    case 'n':
X      move_char(3);
X      break;
X    case 'h':
X      move_char(4);
X      break;
X    case 'l':
X      move_char(6);
X      break;
X    case 'y':
X      move_char(7);
X      break;
X    case 'k':
X      move_char(8);
X      break;
X    case 'u':
X      move_char(9);
X      break;
X    case 'B':                                   /*. == find     */
X      find_flag = TRUE;
X      move_char(1);
X      break;
X    case 'J':                                   /*. == find     */
X      find_flag = TRUE;
X      move_char(2);
X      break;
X    case 'N':                                   /*. == find     */
X      find_flag = TRUE;
X      move_char(3);
X      break;
X    case 'H':                                   /*. == find     */
X      find_flag = TRUE;
X      move_char(4);
X      break;
X    case 'L':                                   /*. == find     */
X      find_flag = TRUE;
X      move_char(6);
X      break;
X    case 'Y':                                   /*. == find     */
X      find_flag = TRUE;
X      move_char(7);
X      break;
X    case 'K':                                   /*. == find     */
X      find_flag = TRUE;
X      move_char(8);
X      break;
X    case 'U':                                   /*. == find     */
X      find_flag = TRUE;
X      move_char(9);
X      break;
X    case '/':                          /* / == identify */
X      ident_char();
X      reset_flag = TRUE;
X      break;
X    case '1':
X      move_char(1);        /* Move dir 1    */
X      break;
X    case '2':
X      move_char(2);        /* Move dir 2    */
X      break;
X    case '3':
X      move_char(3);        /* Move dir 3    */
X      break;
X    case '4':
X      move_char(4);        /* Move dir 4    */
X      break;
X    case '5':                          /* Rest one turn */
X    case '.':
X      move_char(5);
X      (void) sleep(0);     /* Sleep 1/10 a second*/
X      flush();
X      break;
X    case '6':
X      move_char(6);        /* Move dir 6    */
X      break;
X    case '7':
X      move_char(7);        /* Move dir 7    */
X      break;
X    case '8':
X      move_char(8);        /* Move dir 8    */
X      break;
X    case '9':
X      move_char(9);        /* Move dir 9    */
X      break;
X    case '<':
X      go_up();                                  /*< == go up    */
X      break;
X    case '>':
X      go_down();                                /*> == go down  */
X      break;
X    case '?':                                  /*? == help     */
X      rogue_like_help();
X      reset_flag = TRUE;   /* Free move     */
X      break;
X  /*  case 65:   /* Debug feature for weight
X      x = 0;
X      for (i = 0; i < INVEN_MAX; i++)
X	{
X	  i_ptr = &inventory[i];
X	  x += i_ptr->weight*i_ptr->number;
X	  (void) sprintf(out_val, "%d | %d", inven_weight, x);
X	  msg_print(out_val);
X	}
X      break;                             */
X    case 'f':
X      bash();                                   /*f == bash     */
X      break;
X    case 'C':                                   /*C == character*/
X      if (get_com("Print to file? (Y/N)", &command)) 
X	switch(command)
X	  {
X	  case 'y': case 'Y':
X	    file_character();
X	    break;
X	  case 'n': case 'N':
X	    change_name();
X	    draw_cave();
X	    break;
X	  default:
X	    break;
X	  }
X      reset_flag = TRUE;   /* Free move     */
X      break;
X    case 'D':    
X      disarm_trap();                            /*D == disarm   */
X      break;
X    case 'E':
X      eat();                                    /*E == eat      */
X      break;
X    case 'F':
X      refill_lamp();                            /*F == refill   */
X      break;
X    case 'W':                                   /*W == location */
X      reset_flag = TRUE;   /* Free move     */
X      if ((py.flags.blind > 0) || (no_light())) 
X	msg_print("You can't see your map.");
X      else
X	{
X	  (void) sprintf(out_val,
X			 "Section [%d,%d]; Location == [%d,%d]",
X			 (((char_row-1)/OUTPAGE_HEIGHT)+1),
X			 (((char_col-1)/OUTPAGE_WIDTH )+1), 
X			 char_row, char_col);
X	  msg_print(out_val);
X	}
X      break;
X    case 'M':                                   /*M == print map*/
X      reset_flag = TRUE;   /* Free move     */
X      if ((py.flags.blind > 0) || (no_light())) 
X	msg_print("You can't see to draw a map.");
X      else
X	print_map();
X      break;
X    case 'R':
X      rest();                                   /*R == rest     */
X      break;
X    case '#':
X      if (search_flag)                    /*^S == srh mode */
X	{
X	  search_off();
X	  reset_flag = TRUE; /* Free move     */
X	}
X      else if (py.flags.blind > 0) 
X	msg_print("You are incapable of searching while blind.");
X      else
X	{
X	  search_on();
X	  reset_flag = TRUE; /* Free move     */
X	}
X      break;
X    case 25:  /* ^Y */
X      x = char_row;
X      y = char_col;
X      (void) move(7, &x, &y);
X      tunnel(x, y);
X      break;
X    case 11:  /* ^K */
X      x = char_row;
X      y = char_col;
X      (void) move(8, &x, &y);
X      tunnel(x, y);
X      break;
X    case 21: /* ^U */
X      x = char_row;
X      y = char_col;
X      (void) move(9, &x, &y);
X      tunnel(x, y);
X      break;
X    case 12:  /* ^L */
X      x = char_row;
X      y = char_col;
X      (void) move(6, &x, &y);
X      tunnel(x, y);
X      break;
X    case 14:  /* ^N */
X      x = char_row;
X      y = char_col;
X      (void) move(3, &x, &y);
X      tunnel(x, y);
X      break;
X    case 10:    /* ^J */
X      x = char_row;
X      y = char_col;
X      (void) move(2, &x, &y);
X      tunnel(x, y);
X      break;
X    case 2:  /* ^B */
X      x = char_row;
X      y = char_col;
X      (void) move(1, &x, &y);
X      tunnel(x, y);
X      break;
X    case 8:  /* ^H */
X      x = char_row;
X      y = char_col;
X      (void) move(4, &x, &y);
X      tunnel(x, y);
X      break;
X    case 'z': 
X     aim();                                    /*z == aim      */
X      break;
X    case 'P':
X      examine_book();                           /*P == browse   */
X      break;
X    case 'c':
X      closeobject();                            /*c == close    */
X      break;
X    case 'd':
X      drop();                                   /*d == drop     */
X      break;
X    case 'e':                                   /*e == equipment*/
X      reset_flag = TRUE;   /* Free move     */
X      if (inven_command('e', 0, 0))  draw_cave();
X      break;
X    case 't':
X      throw_object();                           /*t == throw    */
X      break;
X  /*    case 104:                                 /*h == moria hlp 
X      moria_help("");
X      draw_cave();
X      reset_flag = TRUE;   /* Free move    
X      break;                      */
X    case 'i':                                /*i == inventory*/
X      reset_flag = TRUE;   /* Free move     */
X      if (inven_command('i', 0, 0))  draw_cave();
X      break;
X    case 'S':
X      jamdoor();                                /*S == jam      */
X      break;
X    case 'x':                                 /*l == look     */
X      look();
X      reset_flag = TRUE;   /* Free move     */
X      break;
X    case 'm':
X      cast();                                   /*m == magick   */
X      break;
X    case 'o':
X      openobject();                             /*o == open     */
X      break;
X    case 'p':
X      pray();                                   /*p == pray     */
X      break;
X    case 'q':
X      quaff();                                  /*q == quaff    */
X      break;
X    case 'r':
X      read_scroll();                            /*r == read     */
X      break;
X    case 's':
X      if (py.flags.blind > 0)             /*s == search   */
X	msg_print("You are incapable of searching while blind.");
X      else
X	search(char_row, char_col, py.misc.srh);
X      break;
X    case 'T':                              /*T == unwear   */
X      reset_flag = TRUE;
X      if (inven_command('t', 0, 0))  draw_cave();
X      break;
X    case 'Z':
X      use();                                    /*Z == use staff*/
X      break;
X    case 'v':
X      game_version();                           /*v == version  */
X      break;
X    case 'w':                                 /*w == wear     */
X      reset_flag = TRUE;
X      if (inven_command('w', 0, 0))  draw_cave();
X      break;
X    case 'X':                                 /*x == exchange */
X      reset_flag = TRUE;
X      if (inven_command('x', 0, 0))  draw_cave();
X      break;
X    default:
X      if (wizard1) 
X	{
X	  reset_flag = TRUE; /* Wizard commands are free moves*/
X	  switch(*com_val)
X	    {
X	    case 1:                            /*^A == Cure all*/
X	      (void) remove_curse();
X	      (void) cure_blindness();
X	      (void) cure_confusion();
X	      (void) cure_poison();
X	      (void) remove_fear();
X	      s_ptr = &py.stats;
X	      s_ptr->cstr = s_ptr->str;
X	      s_ptr->cint = s_ptr->intel;
X	      s_ptr->cwis = s_ptr->wis;
X	      s_ptr->cdex = s_ptr->dex;
X	      s_ptr->ccon = s_ptr->con;
X	      s_ptr->cchr = s_ptr->chr;
X	      f_ptr = &py.flags;
X	      if (f_ptr->slow > 1) 
X		f_ptr->slow = 1;
X	      if (f_ptr->image > 1) 
X		f_ptr->image = 1;
X	      put_qio();
X	      break;
X	    case 15:
X	      print_objects();                  /*^O == objects */
X	      break;
X	    case 4:                           /*^D == up/down */
X	      prt("Go to which level (0 -1200) ? ", 0, 0);
X	      i = -1;
X	      if (get_string(tmp_str, 0, 30, 10))
X		(void) sscanf(tmp_str, "%d", &i);
X	      if (i > -1) 
X		{
X		  dun_level = i;
X		  if (dun_level > 1200) 
X		    dun_level = 1200;
X		  moria_flag = TRUE;
X		}
X	      else
X		erase_line(msg_line, msg_line);
X	      break;
X	    case 127: /* ^? DEL */
X	      rogue_like_wizard_help();         /*DEL == wizhelp */
X	      break;
X	    case 9:
X	      (void) ident_spell();             /*^I == identify*/
X	      break;
X	    case 13:
X	      print_monsters();                 /*^M == mon map */
X	      break;
X	    case '*':
X	      wizard_light();                   /*` == wizlight*/
X	      break;
X	    case 20:
X	      teleport(100);                    /*^T == teleport*/
X	      break;
X	    case 22:
X	      restore_char();                   /*^V == restore */
X	      prt_stat_block();
X	      moria_flag = TRUE;
X	      break;
X	    default: 
X	      if (wizard2) 
X		switch(*com_val)
X		  {
X		  case 5:
X		    change_character();         /*^E == wizchar */
X		    break;
X		  case 6:
X		    (void) mass_genocide();     /*^F == genocide*/
X		    put_qio();
X		    break;
X		  case 7:                       /*^G == treasure*/
X		    alloc_object(set_floor, 5, 10);
X		    put_qio();
X		    break;
X		  case '+':                      /*+ == gain exp*/
X		    if (py.misc.exp == 0)
X		      py.misc.exp = 1;
X		    else
X		      py.misc.exp *= 2;
X		    prt_experience();
X		    break;
X		  case 21:                    /*^U == summon  */
X		    y = char_row;
X		    x = char_col;
X		    (void) summon_monster(&y, &x, TRUE);
X		    creatures(FALSE);
X		    break;
X		  case 17:
X		    wizard_create();          /*^Q == create  */
X		    break;
X		  default:
X		    prt("Type '?' for help...", 0, 0);
X		    break;
X		  }
X	      else
X		prt("Type '?' for help...", 0, 0);
X	    }
X	}
X      else
X	{
X	  prt("Type '?' for help...", 0, 0);
X	  reset_flag = TRUE;
X	}
X    }
X}
END_OF_dungeon.c
if test 41414 -ne `wc -c <dungeon.c`; then
    echo shar: \"dungeon.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f wizard.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"wizard.c\"
else
echo shar: Extracting \"wizard.c\" \(11177 characters\)
sed "s/^X//" >wizard.c <<'END_OF_wizard.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
X/* Print Moria credits					-RAK-	*/
Xgame_version()
X{
X  vtype tmp_str;
X  
X  clear_screen(0, 0);
X  (void) sprintf(tmp_str, "               Moria Version %f", CUR_VERSION);
X  put_buffer(tmp_str, 0, 0);
X  put_buffer("Version 0.1  : 03/25/83", 1, 0);
X  put_buffer("Version 1.0  : 05/01/84", 2, 0);
X  put_buffer("Version 2.0  : 07/10/84", 3, 0);
X  put_buffer("Version 3.0  : 11/20/84", 4, 0);
X  put_buffer("Version 4.0  : 01/20/85", 5, 0);
X  put_buffer("Modules :", 7, 0);
X  put_buffer("     V1.0  Dungeon Generator      - RAK", 8, 0);
X  put_buffer("           Character Generator    - RAK & JWT", 9, 0);
X  put_buffer("           Moria Module           - RAK", 10, 0);
X  put_buffer("           Miscellaneous          - RAK & JWT", 11, 0);
X  put_buffer("     V2.0  Town Level & Misc      - RAK", 12, 0);
X  put_buffer("     V3.0  Internal Help & Misc   - RAK", 13, 0);
X  put_buffer("     V4.0  Source Release Version - RAK", 14, 0);
X  put_buffer("Robert Alan Koeneke               Jimmey Wayne Todd Jr.", 16, 0);
X put_buffer("Student/University of Oklahoma    Student/University of Oklahoma",
X	    17, 0);
X  put_buffer("119 Crystal Bend                  1912 Tiffany Dr.", 18, 0);
X  put_buffer("Norman, OK 73069                  Norman, OK  73071", 19, 0);
X  put_buffer("(405)-321-2925                    (405) 360-6792", 20, 0);
X  pause_line(23);
X  clear_screen(0, 0);
X  put_buffer("UNIX MORIA Port by James E. Wilson", 2, 0);
X  put_buffer("                   wilson@ernie.Berkeley.EDU", 3, 0);
X  put_buffer("                   ucbvax!ucbernie!wilson", 4, 0);
X  put_buffer("This version is based on the VMS version 4.8", 6, 0);
X  put_buffer("but is no longer identical to the original VMS program.", 7, 0);
X  put_buffer("Please use care when referring to this program.", 8, 0);
X  put_buffer("Please call it 'wilson MORIA' or 'UNIX MORIA' or something", 9, 0);
X  put_buffer("similar to avoid confusion.", 10, 0);
X  pause_line(23);
X  draw_cave();
X}
X
X
X/* Light up the dungeon					-RAK-	*/
Xwizard_light()
X{
X  int i, j, k, l;
X  int flag;
X  cave_type *c_ptr;
X
X  if (cave[char_row][char_col].pl) 
X    flag = FALSE;
X  else
X    flag = TRUE;
X  for (i = 0; i < cur_height; i++)
X    for (j = 0; j < cur_width; j++)
X      if (set_floor(cave[i][j].fval))
X	for (k = i-1; k <= i+1; k++)
X	  for (l = j-1; l <= j+1; l++)
X	    {
X	      c_ptr = &cave[k][l];
X	      c_ptr->pl = flag;
X	      if (!flag) 
X		c_ptr->fm = FALSE;
X	    }
X  prt_map();
X}
X
X
X/* Wizard routine for gaining on stats			-RAK-	*/
Xchange_character()
X{
X  int tmp_val;
X  vtype tmp_str;
X  struct stats *s_ptr;
X  struct misc *m_ptr;
X
X  s_ptr = &py.stats;
X  prt("(3 - 118) Strength     == ", 0, 0);
X  (void) get_string(tmp_str, 0, 25, 10);
X  tmp_val = -999;
X  (void) sscanf(tmp_str, "%d", &tmp_val);
X  if ((tmp_val > 2) && (tmp_val < 119)) 
X    {
X      s_ptr->str  = tmp_val;
X      s_ptr->cstr = tmp_val;
X      prt_strength();
X    }
X  prt("(3 - 118) Intelligence == ", 0, 0);
X  (void) get_string(tmp_str, 0, 25, 10);
X  tmp_val = -999;
X  (void) sscanf(tmp_str, "%d", &tmp_val);
X  if ((tmp_val > 2) && (tmp_val < 119)) 
X    {
X      s_ptr->intel  = tmp_val;
X      s_ptr->cint = tmp_val;
X      prt_intelligence();
X    }
X  prt("(3 - 118) Wisdom       == ", 0, 0);
X  (void) get_string(tmp_str, 0, 25, 10);
X  tmp_val = -999;
X  (void) sscanf(tmp_str, "%d", &tmp_val);
X  if ((tmp_val > 2) && (tmp_val < 119)) 
X    {
X      s_ptr->wis  = tmp_val;
X      s_ptr->cwis = tmp_val;
X      prt_wisdom();
X    }
X  prt("(3 - 118) Dexterity    == ", 0, 0);
X  (void) get_string(tmp_str, 0, 25, 10);
X  tmp_val = -999;
X  (void) sscanf(tmp_str, "%d", &tmp_val);
X  if ((tmp_val > 2) && (tmp_val < 119)) 
X    {
X      s_ptr->dex  = tmp_val;
X      s_ptr->cdex = tmp_val;
X      prt_dexterity();
X    }
X  prt("(3 - 118) Constitution == ", 0, 0);
X  (void) get_string(tmp_str, 0, 25, 10);
X  tmp_val = -999;
X  (void) sscanf(tmp_str, "%d", &tmp_val);
X  if ((tmp_val > 2) && (tmp_val < 119)) 
X    {
X      s_ptr->con  = tmp_val;
X      s_ptr->ccon = tmp_val;
X      prt_constitution();
X    }
X  prt("(3 - 118) Charisma     == ", 0, 0);
X  (void) get_string(tmp_str, 0, 25, 10);
X  tmp_val = -999;
X  (void) sscanf(tmp_str, "%d", &tmp_val);
X  if ((tmp_val > 2) && (tmp_val < 119)) 
X    {
X      s_ptr->chr  = tmp_val;
X      s_ptr->cchr = tmp_val;
X      prt_charisma();
X    }
X
X  m_ptr = &py.misc;
X  prt("(1 - 32767) Hit points == ", 0, 0);
X  (void) get_string(tmp_str, 0, 25, 10);
X  tmp_val = -1;
X  (void) sscanf(tmp_str, "%d", &tmp_val);
X  if ((tmp_val > 0) && (tmp_val < 32768)) 
X    {
X      m_ptr->mhp  = tmp_val;
X      m_ptr->chp  = (double)tmp_val;
X      prt_mhp();
X      prt_chp();
X    }
X  prt("(0 - 32767) Mana       == ", 0, 0);
X  (void) get_string(tmp_str, 0, 25, 10);
X  tmp_val = -999;
X  (void) sscanf(tmp_str, "%d", &tmp_val);
X  if ((tmp_val > -1) && (tmp_val < 32768)) 
X    {
X      m_ptr->mana  = tmp_val;
X      m_ptr->cmana = (double)tmp_val;
X      prt_cmana();
X    }
X  (void) sprintf(tmp_str, "Current==%d  (0-200) Searching == ", m_ptr->srh);
X  tmp_val = strlen(tmp_str);
X  prt(tmp_str, 0, 0);
X  (void) get_string(tmp_str, 0, tmp_val, 10);
X  tmp_val = -999;
X  (void) sscanf(tmp_str, "%d", &tmp_val);
X  if ((tmp_val > -1) && (tmp_val < 201)) 
X    m_ptr->srh  = tmp_val;
X  (void) sprintf(tmp_str, "Current==%d  (0-10) Stealth == ", m_ptr->stl);
X  tmp_val = strlen(tmp_str);
X  prt(tmp_str, 0, 0);
X  (void) get_string(tmp_str, 0, tmp_val, 10);
X  tmp_val = -999;
X  (void) sscanf(tmp_str, "%d", &tmp_val);
X  if ((tmp_val > -1) && (tmp_val < 11)) 
X    m_ptr->stl  = tmp_val;
X  (void) sprintf(tmp_str, "Current==%d  (0-200) Disarming == ", m_ptr->disarm);
X  tmp_val = strlen(tmp_str);
X  prt(tmp_str, 0, 0);
X  (void) get_string(tmp_str, 0, tmp_val, 10);
X  tmp_val = -999;
X  (void) sscanf(tmp_str, "%d", &tmp_val);
X  if ((tmp_val > -1) && (tmp_val < 201)) 
X    m_ptr->disarm = tmp_val;
X  (void) sprintf(tmp_str, "Current==%d  (0-100) Save == ", m_ptr->save);
X  tmp_val = strlen(tmp_str);
X  prt(tmp_str, 0, 0);
X  (void) get_string(tmp_str, 0, tmp_val, 10);
X  tmp_val = -999;
X  (void) sscanf(tmp_str, "%d", &tmp_val);
X  if ((tmp_val > -1) && (tmp_val < 201)) 
X    m_ptr->save = tmp_val;
X  (void) sprintf(tmp_str, "Current==%d  (0-200) Base to hit == ", m_ptr->bth);
X  tmp_val = strlen(tmp_str);
X  prt(tmp_str, 0, 0);
X  (void) get_string(tmp_str, 0, tmp_val, 10);
X  tmp_val = -999;
X  (void) sscanf(tmp_str, "%d", &tmp_val);
X  if ((tmp_val > -1) && (tmp_val < 201)) 
X    m_ptr->bth  = tmp_val;
X  (void) sprintf(tmp_str, "Current==%d  (0-200) Bows/Throwing == ",
X		 m_ptr->bthb);
X  tmp_val = strlen(tmp_str);
X  prt(tmp_str, 0, 0);
X  (void) get_string(tmp_str, 0, tmp_val, 10);
X  tmp_val = -999;
X  (void) sscanf(tmp_str, "%d", &tmp_val);
X  if ((tmp_val > -1) && (tmp_val < 201)) 
X    m_ptr->bthb = tmp_val;
X  (void) sprintf(tmp_str, "Current==%d  Gold == ", m_ptr->au);
X  tmp_val = strlen(tmp_str);
X  prt(tmp_str, 0, 0);
X  (void) get_string(tmp_str, 0, tmp_val, 10);
X  tmp_val = -999;
X  (void) sscanf(tmp_str, "%d", &tmp_val);
X  if (tmp_val > -1) 
X    {
X      m_ptr->au = tmp_val;
X      prt_gold();
X    }
X
X  erase_line(msg_line, msg_line);
X  py_bonuses(blank_treasure, 0);
X}
X
X
X/* Wizard routine for creating objects			-RAK-	*/
Xwizard_create()
X{
X  int tmp_val;
X  vtype tmp_str;
X  int flag;
X  treasure_type *i_ptr;
X  cave_type *c_ptr;
X  char command;
X
X  msg_print("Warning: This routine can cause fatal error.");
X  msg_print(" ");
X  msg_flag = FALSE;
X  i_ptr = &inventory[INVEN_MAX];
X  prt("Name   : ", 0, 0);
X  if (get_string(tmp_str, 0, 9, 40)) 
X    (void) strcpy(i_ptr->name, tmp_str);
X  else
X    (void) strcpy(i_ptr->name, "& Wizard Object!");
X  do
X    {
X      prt("Tval   : ", 0, 0);
X      (void) get_string(tmp_str, 0, 9, 10);
X      tmp_val = 0;
X      (void) sscanf(tmp_str, "%d", &tmp_val);
X      flag = TRUE;
X      switch(tmp_val)
X	{
X	case 1: case 13: case 15 :	i_ptr->tchar = '~'; break;
X	case 2: 	i_ptr->tchar = '&'; break;
X	case 10:	i_ptr->tchar = '{'; break;
X	case 11:	i_ptr->tchar = '{'; break;
X	case 12:	i_ptr->tchar = '{'; break;
X	case 20:	i_ptr->tchar = '}'; break;
X	case 21:	i_ptr->tchar = '/'; break;
X	case 22:	i_ptr->tchar = '\\'; break;
X	case 23:	i_ptr->tchar = '|'; break;
X	case 25:	i_ptr->tchar = '\\'; break;
X	case 30:	i_ptr->tchar = ']'; break;
X	case 31:	i_ptr->tchar = ']'; break;
X	case 32:	i_ptr->tchar = '('; break;
X	case 33:	i_ptr->tchar = ']'; break;
X	case 34:	i_ptr->tchar = ')'; break;
X	case 35:	i_ptr->tchar = '['; break;
X	case 36:	i_ptr->tchar = '('; break;
X	case 40:	i_ptr->tchar = '\''; break;
X	case 45:	i_ptr->tchar = '='; break;
X	case 55:	i_ptr->tchar = '_'; break;
X	case 60:	i_ptr->tchar = '-'; break;
X	case 65:	i_ptr->tchar = '-'; break;
X	case 70: case 71:	i_ptr->tchar = '?'; break;
X	case 75: case 76: case 77:	i_ptr->tchar = '!'; break;
X	case 80:	i_ptr->tchar = ','; break;
X	case 90:	i_ptr->tchar = '?'; break;
X	case 91:	i_ptr->tchar = '?'; break;
X	default:	flag = FALSE; break;
X	}
X    }
X  while (!flag);
X  i_ptr->tval = tmp_val;
X  prt("Subval : ", 0, 0);
X  (void) get_string(tmp_str, 0, 9, 10);
X  tmp_val = 1;
X  (void) sscanf(tmp_str, "%d", &tmp_val);
X  i_ptr->subval = tmp_val;
X  prt("Weight : ", 0, 0);
X  (void) get_string(tmp_str, 0, 9, 10);
X  tmp_val = 1;
X  (void) sscanf(tmp_str, "%d", &tmp_val);
X  i_ptr->weight = tmp_val;
X  prt("Number : ", 0, 0);
X  (void) get_string(tmp_str, 0, 9, 10);
X  tmp_val = 1;
X  (void) sscanf(tmp_str, "%d", &tmp_val);
X  i_ptr->number = tmp_val;
X  prt("Damage : ", 0, 0);
X  (void) get_string(tmp_str, 0, 9, 5);
X  (void) strcpy(i_ptr->damage, tmp_str);
X  prt("+To hit: ", 0, 0);
X  (void) get_string(tmp_str, 0, 9, 10);
X  tmp_val = 0;
X  (void) sscanf(tmp_str, "%d", &tmp_val);
X  i_ptr->tohit = tmp_val;
X  prt("+To dam: ", 0, 0);
X  (void) get_string(tmp_str, 0, 9, 10);
X  tmp_val = 0;
X  (void) sscanf(tmp_str, "%d", &tmp_val);
X  i_ptr->todam = tmp_val;
X  prt("AC     : ", 0, 0);
X  (void) get_string(tmp_str, 0, 9, 10);
X  tmp_val = 0;
X  (void) sscanf(tmp_str, "%d", &tmp_val);
X  i_ptr->ac = tmp_val;
X  prt("+To AC : ", 0, 0);
X  (void) get_string(tmp_str, 0, 9, 10);
X  tmp_val = 0;
X  (void) sscanf(tmp_str, "%d", &tmp_val);
X  i_ptr->toac = tmp_val;
X  prt("P1     : ", 0, 0);
X  (void) get_string(tmp_str, 0, 9, 10);
X  tmp_val = 0;
X  (void) sscanf(tmp_str, "%d", &tmp_val);
X  i_ptr->p1 = tmp_val;
X  prt("Flags (In HEX): ", 0, 0);
X  i_ptr->flags = get_hex_value(0, 16, 8);
X  prt("Cost : ", 0, 0);
X  (void) get_string(tmp_str, 0, 9, 10);
X  tmp_val = 0;
X  (void) sscanf(tmp_str, "%d", &tmp_val);
X  i_ptr->cost = tmp_val;
X
X  prt("Level : ", 0, 0);
X  (void) get_string(tmp_str, 0, 10, 10);
X  tmp_val = 0;
X  (void) sscanf(tmp_str, "%d", &tmp_val);
X  i_ptr->level = tmp_val;
X
X  if (get_com("Allocate? (Y/N)", &command)) 
X    switch(command)
X      {
X      case 'y': case 'Y':
X	popt(&tmp_val);
X	t_list[tmp_val] = inventory[INVEN_MAX];
X	c_ptr = &cave[char_row][char_col];
X	if (c_ptr->tptr != 0) 
X	  (void) delete_object(char_row, char_col);
X	c_ptr->tptr = tmp_val;
X	msg_print("Allocated...");
X	break;
X      default:
X	msg_print("Aborted...");
X	break;
X      }
X  inventory[INVEN_MAX] = blank_treasure;
X}
END_OF_wizard.c
if test 11177 -ne `wc -c <wizard.c`; then
    echo shar: \"wizard.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 8 \(of 16\).
cp /dev/null ark8isdone
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