DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

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

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T m

⟦83fc7b29e⟧ TextFile

    Length: 42028 (0xa42c)
    Types: TextFile
    Names: »misc2.c«

Derivation

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

TextFile

#include <stdio.h>
#include <sys/types.h>

#include "constants.h"
#include "config.h"
#include "types.h"
#include "externs.h"

#ifdef USG
#include <string.h>
#else
#include <strings.h>
#endif

#ifdef sun   /* correct SUN stupidity in the stdio.h file */
char *sprintf();
#endif

#if defined(ultrix) || defined(sun) || defined(USG)
int getuid();
#else
uid_t getuid();
#endif

/* Places a particular trap at location y, x		-RAK-	*/
place_trap(y, x, typ, subval)
int y, x, typ, subval;
{
  int cur_pos;
  treasure_type cur_trap;

  if (typ == 1)
    cur_trap = trap_lista[subval];
  else
    cur_trap = trap_listb[subval];
  popt(&cur_pos);
  cave[y][x].tptr  = cur_pos;
  t_list[cur_pos] = cur_trap;
}


/* Places rubble at location y, x 			-RAK-	*/
place_rubble(y, x)
int y, x;
{
  int cur_pos;
  register cave_type *cave_ptr;

  popt(&cur_pos);
  cave_ptr = &cave[y][x];
  cave_ptr->tptr = cur_pos;
  cave_ptr->fopen = FALSE;
  t_list[cur_pos] = rubble;
}


place_open_door(y, x)
int y, x;
{
  int cur_pos;
  register cave_type *cave_ptr;

  popt(&cur_pos);
  cave_ptr = &cave[y][x];
  cave_ptr->tptr = cur_pos;
  t_list[cur_pos] = door_list[0];
  cave_ptr->fval  = corr_floor3.ftval;
  cave_ptr->fopen = TRUE;
}


place_broken_door(y, x)
int y, x;
{
  int cur_pos;
  register cave_type *cave_ptr;

  popt(&cur_pos);
  cave_ptr = &cave[y][x];
  cave_ptr->tptr = cur_pos;
  t_list[cur_pos] = door_list[0];
  cave_ptr->fval  = corr_floor3.ftval;
  cave_ptr->fopen = TRUE;
  t_list[cur_pos].p1 = 1;
}


place_closed_door(y, x)
int y, x;
{
  int cur_pos;
  register cave_type *cave_ptr;

  popt(&cur_pos);
  cave_ptr = &cave[y][x];
  cave_ptr->tptr = cur_pos;
  t_list[cur_pos] = door_list[1];
  cave_ptr->fval  = corr_floor3.ftval;
  cave_ptr->fopen = FALSE;
}


place_locked_door(y, x)
int y, x;
{
  int cur_pos;
  register cave_type *cave_ptr;

  popt(&cur_pos);
  cave_ptr = &cave[y][x];
  cave_ptr->tptr = cur_pos;
  t_list[cur_pos] = door_list[1];
  cave_ptr->fval  = corr_floor3.ftval;
  cave_ptr->fopen = FALSE;
  t_list[cur_pos].p1 = randint(10) + 10;
}


place_stuck_door(y, x)
int y, x;
{
  int cur_pos;
  register cave_type *cave_ptr;

  popt(&cur_pos);
  cave_ptr = &cave[y][x];
  cave_ptr->tptr = cur_pos;
  t_list[cur_pos] = door_list[1];
  cave_ptr->fval  = corr_floor3.ftval;
  cave_ptr->fopen = FALSE;
  t_list[cur_pos].p1 = -randint(10) - 10;
}


place_secret_door(y, x)
int y, x;
{
  int cur_pos;
  register cave_type *cave_ptr;

  popt(&cur_pos);
  cave_ptr = &cave[y][x];
  cave_ptr->tptr = cur_pos;
  t_list[cur_pos] = door_list[2];
  cave_ptr->fval  = corr_floor4.ftval;
  cave_ptr->fopen = FALSE;
}


place_door(y, x)
int y, x;
{
  switch(randint(3))
    {
    case 1:
      switch(randint(4))
	{
	case 1:
	  place_broken_door(y, x);
	  break;
	default:
	  place_open_door(y, x);
	  break;
	}
      break;
    case 2:
      switch(randint(12))
	{
	case 1: case 2:
	  place_locked_door(y, x);
	  break;
	case 3:
	  place_stuck_door(y, x);
	  break;
	default:
	  place_closed_door(y, x);
	  break;
	}
    case 3:
      place_secret_door(y, x);
      break;
    }
}


/* Place an up staircase at given y, x			-RAK-	*/
place_up_stairs(y, x)
int y, x;
{
  int cur_pos;
  register cave_type *cave_ptr;

  cave_ptr = &cave[y][x];
  if (cave_ptr->tptr != 0)
    {
      pusht((int)cave_ptr->tptr);
      cave_ptr->tptr = 0;
      cave_ptr->fopen = TRUE;
    }
  popt(&cur_pos);
  cave_ptr->tptr = cur_pos;
  t_list[cur_pos] = up_stair;
}


/* Place a down staircase at given y, x			-RAK-	*/
place_down_stairs(y, x)
int y, x;
{
  int cur_pos;
  register cave_type *cave_ptr;

  cave_ptr = &cave[y][x];
  if (cave_ptr->tptr != 0)
    {
      pusht((int)cave_ptr->tptr);
      cave_ptr->tptr = 0;
      cave_ptr->fopen = TRUE;
    }
  popt(&cur_pos);
  cave_ptr->tptr = cur_pos;
  t_list[cur_pos] = down_stair;
}

/* Places a staircase 1==up, 2==down			-RAK-	*/
place_stairs(typ, num, walls)
int typ, num, walls;
{
  register cave_type *cave_ptr;
  int i, j;
  register int y1, x1, y2, x2;
  int flag;

  for (i = 0; i < num; i++)
    {
      flag = FALSE;
      do
	{
	  j = 0;
	  do
	    {
	      y1 = randint(cur_height - 12) - 1;
	      x1 = randint(cur_width  - 12) - 1;
	      y2 = y1 + 12;
	      x2 = x1 + 12;
	      do
		{
		  do
		    {
		      cave_ptr = &cave[y1][x1];
		      if ((cave_ptr->fval == 1) || (cave_ptr->fval == 2) ||
			  (cave_ptr->fval == 4))
			if (cave_ptr->tptr == 0)
			  if (next_to4(y1, x1, 10, 11, 12) >= walls)
			    {
			      flag = TRUE;
			      switch(typ)
				{
				case 1:
				  place_up_stairs(y1, x1);
				  break;
				case 2:
				  place_down_stairs(y1, x1);
				  break;
				}
			    }
		      x1++;
		    }
		  while ((x1 != x2) && (!flag));
		  x1 = x2 - 12;
		  y1++;
		}
	      while ((y1 != y2) && (!flag));
	      j++;
	    }
	  while ((!flag) && (j <= 30));
	  walls--;
	}
      while (!flag);
    }
}


/* Places a treasure (Gold or Gems) at given row, column -RAK-	*/
place_gold(y, x)
int y, x;
{
  int cur_pos;
  register int i;
  register treasure_type *t_ptr;

  popt(&cur_pos);
  i = ((randint(dun_level+2)+2) / 2) - 1;
  if (randint(OBJ_GREAT) == 1)
    i += randint(dun_level+1);
  if (i >= MAX_GOLD)
    i = MAX_GOLD - 1;
  cave[y][x].tptr = cur_pos;
  t_list[cur_pos] = gold_list[i];
  t_ptr = &t_list[cur_pos];
  t_ptr->cost += randint(8*t_ptr->cost);
}


/* Returns the array number of a random object		-RAK-	*/
int get_obj_num(level)
int level;
{
  register int i;

  if (level > MAX_OBJ_LEVEL)
    level = MAX_OBJ_LEVEL;
  if (randint(OBJ_GREAT) == 1)
    level = MAX_OBJ_LEVEL;
  if (level == 0)
    i = randint(t_level[0]) - 1;
  else
    i = randint(t_level[level]) - 1;
  return(i);
}


/* Places an object at given row, column co-ordinate	-RAK-	*/
place_object(y, x)
int y, x;
{
  int cur_pos;
  int tmp;
  treasure_type tr_tmp;;

  popt(&cur_pos);
  cave[y][x].tptr = cur_pos;
  /* split this line up to avoid a reported compiler bug */
  tmp = get_obj_num(dun_level);
  tr_tmp = object_list[tmp];
  t_list[cur_pos] = tr_tmp;
  magic_treasure(cur_pos, dun_level);
}


/* Allocates an object for tunnels and rooms		-RAK-	*/
alloc_object(alloc_set, typ, num)
int (*alloc_set)();
int typ, num;
{
  register int i, j, k;

  for (k = 0; k < num; k++)
    {
      do
	{
	  i = randint(cur_height) - 1;
	  j = randint(cur_width) - 1;
	}
      while ((!(*alloc_set)(cave[i][j].fval)) ||
	     (cave[i][j].tptr != 0));
      switch(typ)
	{
	case 1:
	  place_trap(i, j, 1, randint(MAX_TRAPA)-1);
	  break;
	case 2:
	  place_trap(i, j, 2, randint(MAX_TRAPB)-1);
	  break;
	case 3:
	  place_rubble(i, j);
	  break;
	case 4:
	  place_gold(i, j);
	  break;
	case 5:
	  place_object(i, j);
	  break;
	}
    }
}


/* Creates objects nearby the coordinates given		-RAK-	*/
random_object(y, x, num)
int y, x, num;
{
  register int i, j, k;
  register cave_type *cave_ptr;

  do
    {
      i = 0;
      do
	{
	  j = y - 3 + randint(5);
	  k = x - 4 + randint(7);
	  cave_ptr = &cave[j][k];
	  if ((cave_ptr->fval <= 7) && (cave_ptr->fval >= 1))
	    if (cave_ptr->tptr == 0)
	      {
		if (randint(100) < 75)
		  place_object(j, k);
		else
		  place_gold(j, k);
		i = 9;
	      }
	  i++;
	}
      while(i <= 10);
      num--;
    }
  while (num != 0);
}


/* Converts stat num into string 			-RAK-	*/
cnv_stat(stat, out_val)
byteint stat;
char *out_val;
{
  vtype tmp_str;
  register int part1, part2;

  if (stat > 18)
    {
      part1 = 18;
      part2 = stat - 18;
      if (part2 == 100)
	(void) strcpy(tmp_str, "18/100");
      else if (part2 < 10)
	(void) sprintf(tmp_str, " %2d/0%d", part1, part2);
      else
	(void) sprintf(tmp_str, " %2d/%2d", part1, part2);
    }
  else
    (void) sprintf(tmp_str, "%6d", stat);
  if (strlen(tmp_str) < 6)
    (void) strcpy(tmp_str, pad(tmp_str, " ", 6));
  (void) strcpy(out_val, tmp_str);
}


/* Print character stat in given row, column		-RAK-	*/
prt_stat(stat_name, stat, row, column)
char *stat_name;
byteint stat;
int row, column;
{
  stat_type out_val1;
  vtype out_val2;

  cnv_stat(stat, out_val1);
  (void) strcpy(out_val2, stat_name);
  (void) strcat(out_val2, out_val1);
  put_buffer(out_val2, row, column);
}


/* Print character info in given row, column		-RAK-	*/
/* the longest title is 13 characters, so only pad to 13 */
prt_field(info, row, column)
char *info;
int row, column;
{
  put_buffer(pad(info, " ", 13), row, column);
}


/* Print number with header at given row, column 	-RAK-	*/
prt_num(header, num, row, column)
char *header;
int num, row, column;
{
  vtype out_val;

  (void) sprintf(out_val, "%s%6d", header, num);
  put_buffer(out_val, row, column);
}


/* Adjustment for wisdom 				-JWT-	*/
int wis_adj()
{
  if (py.stats.cwis > 117)
    return(7);
  else if (py.stats.cwis > 107)
    return(6);
  else if (py.stats.cwis > 87)
    return(5);
  else if (py.stats.cwis > 67)
    return(4);
  else if (py.stats.cwis > 17)
    return(3);
  else if (py.stats.cwis > 14)
    return(2);
  else if (py.stats.cwis > 7)
    return(1);
  else
    return(0);
}

/* adjustment for intelligence				-JWT-	*/
int int_adj()
{
  if (py.stats.cint > 117)
    return(7);
  else if (py.stats.cint > 107)
    return(6);
  else if (py.stats.cint > 87)
    return(5);
  else if (py.stats.cint > 67)
    return(4);
  else if (py.stats.cint > 17)
    return(3);
  else if (py.stats.cint > 14)
    return(2);
  else if (py.stats.cint > 7)
    return(1);
  else
    return(0);
}


/* Adjustment for charisma				-RAK-	*/
/* Percent decrease or increase in price of goods                */
double chr_adj()
{
  if (py.stats.cchr > 117)
    return(-0.10);
  else if (py.stats.cchr > 107)
    return(-0.08);
  else if (py.stats.cchr > 87)
    return(-0.06);
  else if (py.stats.cchr > 67)
    return(-0.04);
  else if (py.stats.cchr > 18)
    return(-0.02);
  else
    switch(py.stats.cchr)
      {
      case 18:  return(0.00);
      case 17:  return(0.01);
      case 16:  return(0.02);
      case 15:  return(0.03);
      case 14:  return(0.04);
      case 13:  return(0.06);
      case 12:  return(0.08);
      case 11:  return(0.10);
      case 10:  return(0.12);
      case 9:  return(0.14);
      case 8:  return(0.16);
      case 7:  return(0.18);
      case 6:  return(0.20);
      case 5:  return(0.22);
      case 4:  return(0.24);
      case 3:  return(0.25);
      default: return(0.00);     /* Error trap    */
      }
}


/* Returns a character's adjustment to hit points        -JWT-   */
int con_adj()
{
  if (py.stats.ccon == 3)
    return(-4);
  else if (py.stats.ccon == 4)
    return(-3);
  else if (py.stats.ccon == 5)
    return(-2);
  else if (py.stats.ccon == 6)
    return(-1);
  else if (py.stats.ccon < 17)
    return(0);
  else if (py.stats.ccon ==  17)
    return(1);
  else if (py.stats.ccon <  94)
    return(2);
  else if (py.stats.ccon < 117)
    return(3);
  else
    return(4);
}


/* Calculates hit points for each level that is gained.	-RAK-	*/
int get_hitdie()
{
  register int hitpoints;

  hitpoints = randint((int)py.misc.hitdie) + con_adj();
  /* always give 'em at least one point */
  if (hitpoints < 1)
    hitpoints = 1;
  return(hitpoints);
}


/* Prints title of character				-RAK-	*/
prt_title()
{
  prt_field(py.misc.title, 4, stat_column);
}


/* Prints strength					-RAK-	*/
prt_strength()
{
  prt_stat("\0", py.stats.cstr, 6, stat_column+6);
}


/* Prints intelligence					-RAK-	*/
prt_intelligence()
{
  prt_stat("\0", py.stats.cint, 7, stat_column+6);
}


/* Prints wisdom 					-RAK-	*/
prt_wisdom()
{
  prt_stat("\0", py.stats.cwis, 8, stat_column+6);
}


/* Prints dexterity					-RAK-	*/
prt_dexterity()
{
  prt_stat("\0", py.stats.cdex, 9, stat_column+6);
}


/* Prints constitution					-RAK-	*/
prt_constitution()
{
  prt_stat("\0", py.stats.ccon, 10, stat_column+6);
}


/* Prints charisma					-RAK-	*/
prt_charisma()
{
  prt_stat("\0", py.stats.cchr, 11, stat_column+6);
}


/* Prints level						-RAK-	*/
prt_level()
{
  prt_num("\0", (int)py.misc.lev, 13, stat_column+6);
}


/* Prints players current mana points (a real number...) -RAK-	*/
prt_cmana()
{
  prt_num("\0", (int)(py.misc.cmana), 15, stat_column+6);
}


/* Prints Max hit points 				-RAK-	*/
prt_mhp()
{
  prt_num("\0", py.misc.mhp, 16, stat_column+6);
}


/* Prints players current hit points (a real number...)	-RAK-	*/
prt_chp()
{
  prt_num("\0", (int)(py.misc.chp), 17, stat_column+6);
}


/* prints current AC					-RAK-	*/
prt_pac()
{
  prt_num("\0", py.misc.dis_ac, 19, stat_column+6);
}


/* Prints current gold					-RAK-	*/
prt_gold()
{
  prt_num("\0", py.misc.au, 20, stat_column+6);
}


/* Prints depth in stat area				-RAK-	*/
prt_depth()
{
  vtype depths;
  register int depth;

  depth = dun_level*50;
  if (depth == 0)
    (void) strcpy(depths, "Town level");
  else
    (void) sprintf(depths, "Depth: %d (feet)", depth);
  prt(depths, 23, 60);
}


/* Prints status of hunger				-RAK-	*/
prt_hunger()
{
  if (0x000002 & py.flags.status)
    put_buffer("Weak    ", 23, 0);
  else if (0x000001 & py.flags.status)
    put_buffer("Hungry  ", 23, 0);
  else
    put_buffer("        ", 23, 0);
}


/* Prints Blind status					-RAK-	*/
prt_blind()
{
  if (0x000004 & py.flags.status)
    put_buffer("Blind  ", 23, 8);
  else
    put_buffer("       ", 23, 8);
}


/* Prints Confusion status				-RAK-	*/
prt_confused()
{
  if (0x000008 & py.flags.status)
    put_buffer("Confused  ", 23, 15);
  else
    put_buffer("          ", 23, 15);
}


/* Prints Fear status					-RAK-	*/
prt_afraid()
{
  if (0x000010 & py.flags.status)
    put_buffer("Afraid  ", 23, 25);
  else
    put_buffer("        ", 23, 25);
}


/* Prints Poisoned status				-RAK-	*/
prt_poisoned()
{
  if (0x000020 & py.flags.status)
    put_buffer("Poisoned  ", 23, 33);
  else
    put_buffer("          ", 23, 33);
}


/* Prints Searching status				-RAK-	*/
prt_search()
{
  if (0x000100 & py.flags.status)
    put_buffer("Searching  ", 23, 43);
  else
    put_buffer("           ", 23, 43);
}


/* Prints Resting status 				-RAK-	*/
prt_rest()
{
  if (0x000200 & py.flags.status)
    put_buffer("Resting    ", 23, 43);
  else
    put_buffer("           ", 23, 43);
}


/* Prints winner status on display			-RAK-	*/
prt_winner()
{
  put_buffer("*Winner*", 22, 0);
}


/* Increases a stat by one randomized level		-RAK-	*/
byteint in_statp(stat)
register byteint stat;
{
  if (stat < 18)
    stat++;
  else if (stat < 88)
    stat += randint(25);
  else if (stat < 108)
    stat += randint(10);
  else
    stat++;
  if (stat > 118)
    stat = 118;
  return(stat);
}


/* Decreases a stat by one randomized level		-RAK-	*/
byteint de_statp(stat)
register byteint stat;
{
  if (stat < 19)
    stat--;
  else if (stat < 109)
    {
      stat += -randint(10) - 5;
      if (stat < 18)
	stat = 18;
     }
  else
    stat -= randint(3);
  if (stat < 3)
    stat = 3;
  return(stat);
}


/* Increases a stat by one true level			-RAK-	*/
byteint in_statt(stat)
register byteint stat;
{
  if (stat < 18)
    stat++;
  else
    {
      stat += 10;
      if (stat > 118)
	stat = 118;
    }
  return(stat);
}


/* Decreases a stat by true level			-RAK-	*/
byteint de_statt(stat)
register byteint stat;
{
  if (stat > 27)
    stat -= 10;
  else if (stat > 18)
    stat = 18;
  else
    {
      stat--;
      if (stat < 3)
	stat = 3;
    }
  return(stat);
}


/* Returns a character's adjustment to hit.              -JWT-   */
int tohit_adj()
{
  register int total;
  register struct stats *s_ptr;

  s_ptr = &py.stats;
  if      (s_ptr->cdex <   4)  total = -3;
  else if (s_ptr->cdex <   6)  total = -2;
  else if (s_ptr->cdex <   8)  total = -1;
  else if (s_ptr->cdex <  16)  total =  0;
  else if (s_ptr->cdex <  17)  total =  1;
  else if (s_ptr->cdex <  18)  total =  2;
  else if (s_ptr->cdex <  69)  total =  3;
  else if (s_ptr->cdex < 118)  total =  4;
  else                          total =  5;
  if      (s_ptr->cstr <   4)  total -= 3;
  else if (s_ptr->cstr <   5)  total -= 2;
  else if (s_ptr->cstr <   7)  total -= 1;
  else if (s_ptr->cstr <  18)  total -= 0;
  else if (s_ptr->cstr <  94)  total += 1;
  else if (s_ptr->cstr < 109)  total += 2;
  else if (s_ptr->cstr < 117)  total += 3;
  else                          total += 4;
  return(total);
}


/* Returns a character's adjustment to armor class       -JWT-   */
int toac_adj()
{
  register struct stats *s_ptr;

  s_ptr = &py.stats;
  if      (s_ptr->cdex <   4)  return(-4);
  else if (s_ptr->cdex ==  4)  return(-3);
  else if (s_ptr->cdex ==  5)  return(-2);
  else if (s_ptr->cdex ==  6)  return(-1);
  else if (s_ptr->cdex <  15)  return( 0);
  else if (s_ptr->cdex <  18)  return( 1);
  else if (s_ptr->cdex <  59)  return( 2);
  else if (s_ptr->cdex <  94)  return( 3);
  else if (s_ptr->cdex < 117)  return( 4);
  else                          return( 5);
}


/* Returns a character's adjustment to disarm            -RAK-   */
int todis_adj()
{
  register struct stats *s_ptr;

  s_ptr = &py.stats;
  if      (s_ptr->cdex ==  3)  return(-8);
  else if (s_ptr->cdex ==  4)  return(-6);
  else if (s_ptr->cdex ==  5)  return(-4);
  else if (s_ptr->cdex ==  6)  return(-2);
  else if (s_ptr->cdex ==  7)  return(-1);
  else if (s_ptr->cdex <  13)  return( 0);
  else if (s_ptr->cdex <  16)  return( 1);
  else if (s_ptr->cdex <  18)  return( 2);
  else if (s_ptr->cdex <  59)  return( 4);
  else if (s_ptr->cdex <  94)  return( 5);
  else if (s_ptr->cdex < 117)  return( 6);
  else                          return( 8);
}


/* Returns a character's adjustment to damage            -JWT-   */
int todam_adj()
{
  register struct stats *s_ptr;

  s_ptr = &py.stats;
  if      (s_ptr->cstr <   4)  return(-2);
  else if (s_ptr->cstr <   5)  return(-1);
  else if (s_ptr->cstr <  16)  return( 0);
  else if (s_ptr->cstr <  17)  return( 1);
  else if (s_ptr->cstr <  18)  return( 2);
  else if (s_ptr->cstr <  94)  return( 3);
  else if (s_ptr->cstr < 109)  return( 4);
  else if (s_ptr->cstr < 117)  return( 5);
  else                          return( 6);
}


/* Prints character-screen info				-RAK-	*/
prt_stat_block()
{
  register int status;
  register struct stats *s_ptr;
  register struct misc *m_ptr;

  s_ptr = &py.stats;
  m_ptr = &py.misc;
  prt_field(m_ptr->race,                  2, stat_column);
  prt_field(m_ptr->tclass,                3, stat_column);
  prt_field(m_ptr->title,                 4, stat_column);
  prt_stat("STR : ", s_ptr->cstr,         6, stat_column);
  prt_stat("INT : ", s_ptr->cint,         7, stat_column);
  prt_stat("WIS : ", s_ptr->cwis,         8, stat_column);
  prt_stat("DEX : ", s_ptr->cdex,         9, stat_column);
  prt_stat("CON : ", s_ptr->ccon,        10, stat_column);
  prt_stat("CHR : ", s_ptr->cchr,        11, stat_column);
  prt_num( "LEV : ", (int)m_ptr->lev,    13, stat_column);
  prt_num( "EXP : ", m_ptr->exp,         14, stat_column);
  prt_num( "MANA: ", (int)(m_ptr->cmana), 15, stat_column);
  prt_num( "MHP : ", m_ptr->mhp,         16, stat_column);
  prt_num( "CHP : ", (int)(m_ptr->chp),  17, stat_column);
  prt_num( "AC  : ", m_ptr->dis_ac,      19, stat_column);
  prt_num( "GOLD: ", m_ptr->au,          20, stat_column);
  if (total_winner)  prt_winner();
  status = py.flags.status;
  if (0x000003 & status)
    prt_hunger();
  if (0x000004 & status)
    prt_blind();
  if (0x000008 & status)
    prt_confused();
  if (0x000010 & status)
    prt_afraid();
  if (0x000020 & status)
    prt_poisoned();
  if (0x000100 & status)
    prt_search();
  if (0x000200 & status)
    prt_rest();
}


/* Draws entire screen					-RAK-	*/
draw_cave()
{
  clear_screen(0, 0);
  prt_stat_block();
  prt_map();
  prt_depth();
}


/* Prints the following information on the screen.	-JWT-	*/
put_character()
{
  char tmp_str[80];
  register struct misc *m_ptr;

  m_ptr = &py.misc;
  clear_screen(0, 0);
  prt(strcat(strcpy(tmp_str, "Name      : "), m_ptr->name), 2, 2);
  prt(strcat(strcpy(tmp_str, "Race      : "), m_ptr->race), 3, 2);
  prt(strcat(strcpy(tmp_str, "Sex       : "), m_ptr->sex), 4, 2);
  prt(strcat(strcpy(tmp_str, "Class     : "), m_ptr->tclass), 5, 2);
}


/* Prints the following information on the screen.	-JWT-	*/
put_stats()
{
  register struct stats *s_ptr;
  register struct misc *m_ptr;

  m_ptr = &py.misc;
  s_ptr = &py.stats;
  prt_stat("STR : ", s_ptr->cstr, 2, 64);
  prt_stat("INT : ", s_ptr->cint, 3, 64);
  prt_stat("WIS : ", s_ptr->cwis, 4, 64);
  prt_stat("DEX : ", s_ptr->cdex, 5, 64);
  prt_stat("CON : ", s_ptr->ccon, 6, 64);
  prt_stat("CHR : ", s_ptr->cchr, 7, 64);
  prt_num("+ To Hit   : ", m_ptr->dis_th,  9, 3);
  prt_num("+ To Damage: ", m_ptr->dis_td, 10, 3);
  prt_num("+ To AC    : ", m_ptr->dis_tac, 11, 3);
  prt_num("  Total AC : ", m_ptr->dis_ac, 12, 3);
}


/* Returns a rating of x depending on y			-JWT-	*/
char *likert(x, y)
int x, y;
{
  switch((x/y))
    {
      case -3: case -2: case -1: return("Very Bad");
      case 0: case 1:            return("Bad");
      case 2:                    return("Poor");
      case 3: case 4:            return("Fair");
      case  5:                   return("Good");
      case 6:                    return("Very Good");
      case 7: case 8:            return("Excellent");
      default:                   return("Superb");
      }
}


/* Prints age, height, weight, and SC			-JWT-	*/
put_misc1()
{
  register struct misc *m_ptr;

  m_ptr = &py.misc;
  prt_num("Age          : ", (int)m_ptr->age, 2, 39);
  prt_num("Height       : ", (int)m_ptr->ht, 3, 39);
  prt_num("Weight       : ", (int)m_ptr->wt, 4, 39);
  prt_num("Social Class : ", (int)m_ptr->sc, 5, 39);
}


/* Prints the following information on the screen.	-JWT-	*/
put_misc2()
{
  register struct misc *m_ptr;

  m_ptr = &py.misc;
  prt_num("Level      : ", (int)m_ptr->lev, 9, 30);
  prt_num("Experience : ", m_ptr->exp, 10, 30);
  prt_num("Gold       : ", m_ptr->au, 11, 30);
  prt_num("Max Hit Points : ", m_ptr->mhp, 9, 53);
  prt_num("Cur Hit Points : ", (int)m_ptr->chp, 10, 53);
  prt_num("Max Mana       : ", m_ptr->mana, 11, 53);
  prt_num("Cur Mana       : ", (int)m_ptr->cmana, 12, 53);
}


/* Prints ratings on certain abilities			-RAK-	*/
put_misc3()
{
  int xbth, xbthb, xfos, xsrh, xstl, xdis, xsave, xdev;
  vtype xinfra;
  register struct misc *p_ptr;
  char tmp_str[80];

  clear_screen(13, 0);
  p_ptr = &py.misc;
  xbth  = p_ptr->bth + p_ptr->lev*BTH_LEV_ADJ + p_ptr->ptohit*BTH_PLUS_ADJ;
  xbthb = p_ptr->bthb + p_ptr->lev*BTH_LEV_ADJ + p_ptr->ptohit*BTH_PLUS_ADJ;
  /* this results in a range from 0 to 29 */
  xfos  = 40 - p_ptr->fos;
  if (xfos < 0)  xfos = 0;
  xsrh  = p_ptr->srh + int_adj();
  /* this results in a range from 0 to 9 */
  xstl  = p_ptr->stl + 1;
  xdis  = p_ptr->disarm + p_ptr->lev + 2*todis_adj() + int_adj();
  xsave = p_ptr->save + p_ptr->lev + wis_adj();
  xdev  = p_ptr->save + p_ptr->lev + int_adj();
  (void) sprintf(xinfra, "%d feet", py.flags.see_infra*10);

  prt("(Miscellaneous Abilities)", 15, 23);
  put_buffer(strcat(strcpy(tmp_str, "Fighting    : "),
		    likert(xbth, 12)), 16, 1);
  put_buffer(strcat(strcpy(tmp_str, "Bows/Throw  : "),
		    likert(xbthb, 12)), 17, 1);
  put_buffer(strcat(strcpy(tmp_str, "Saving Throw: "),
		    likert(xsave, 6)), 18, 1);
  put_buffer(strcat(strcpy(tmp_str, "Stealth     : "),
		    likert(xstl, 1)), 16, 26);
  put_buffer(strcat(strcpy(tmp_str, "Disarming   : "),
		    likert(xdis, 8)), 17, 26);
  put_buffer(strcat(strcpy(tmp_str, "Magic Device: "),
		    likert(xdev, 6)), 18, 26);
  put_buffer(strcat(strcpy(tmp_str, "Perception  : "),
		    likert(xfos, 3)), 16, 51);
  put_buffer(strcat(strcpy(tmp_str, "Searching   : "),
		    likert(xsrh, 6)), 17, 51);
  put_buffer(strcat(strcpy(tmp_str, "Infra-Vision: "), xinfra), 18, 51);
}


/* Used to display the character on the screen.		-RAK-	*/
display_char()
{
  put_character();
  put_misc1();
  put_stats();
  put_misc2();
  put_misc3();
}


/* Gets a name for the character 			-JWT-	*/
get_name()
{
  prt("Enter your player's name  [press <RETURN> when finished]", 21, 2);
  (void) get_string(py.misc.name, 2, 14, 24);
  clear_screen(20, 0);
}


/* Chances the name of the character			-JWT-	*/
change_name()
{
  char c;
  int flag;

  flag = FALSE;
  display_char();
  do
    {
      prt("<c>hange character name.     <ESCAPE> to continue.", 21, 2);
      inkey(&c);
      switch(c)
	{
	case 99:
	  get_name();
	  break;
	case 0: case 27:
	  flag = TRUE;
	  break;
	default:
	  break;
	}
    }
  while (!flag);
}


/* Builds passwords					-RAK-	*/
bpswd()
{
  (void) strcpy(password1, PASSWD1);
  (void) strcpy(password2, PASSWD2);
}


/* Destroy an item in the inventory			-RAK-	*/
inven_destroy(item_val)
int item_val;
{
  register int j;
  register treasure_type *i_ptr;

  inventory[INVEN_MAX] = inventory[item_val];
  i_ptr = &inventory[item_val];
  if ((i_ptr->number > 1) && (i_ptr->subval < 512))
    {
      i_ptr->number--;
      inven_weight -= i_ptr->weight;
      inventory[INVEN_MAX].number = 1;
    }
  else
    {
      inven_weight -= i_ptr->weight*i_ptr->number;
      for (j = item_val; j < inven_ctr-1; j++)
	inventory[j] = inventory[j+1];
      inventory[inven_ctr-1] = blank_treasure;
      inven_ctr--;
    }
}


/* Drops an item from inventory to given location	-RAK-	*/
inven_drop(item_val, y, x)
int item_val, y, x;
{
  int i;
  register cave_type *cave_ptr;

  cave_ptr = &cave[y][x];
  if (cave_ptr->tptr != 0)
    pusht((int)cave_ptr->tptr);
  inven_destroy(item_val);
  popt(&i);
  t_list[i] = inventory[INVEN_MAX];
  cave_ptr->tptr = i;
}


/* Destroys a type of item on a given percent chance	-RAK-	*/
int inven_damage(typ, perc)
int (*typ)();
register int perc;
{
  register int i, j;

  j = 0;
  for (i = 0; i < inven_ctr; i++)
    if ((*typ)(inventory[i].tval))
      if (randint(100) < perc)
	{
	  inven_destroy(i);
	  j++;
	}
  return(j);
}


/* Computes current weight limit 			-RAK-	*/
int weight_limit()
{
  register int weight_cap;

  weight_cap = py.stats.cstr * PLAYER_WEIGHT_CAP + py.misc.wt;
  if (weight_cap > 3000)  weight_cap = 3000;
  return(weight_cap);
}


/* Check inventory for too much weight			-RAK-	*/
int inven_check_weight()
{
  register int item_wgt, max_weight;
  register int check_weight;

  check_weight = FALSE;
  max_weight = weight_limit();
  item_wgt = inventory[INVEN_MAX].number*inventory[INVEN_MAX].weight;
  /* Now, check to see if player can carry object  */
  if ((inven_weight + item_wgt) <= max_weight)
    check_weight = TRUE;   /* Can carry weight      */
  return(check_weight);
}


/* Check to see if he will be carrying too many objects	-RAK-	*/
int inven_check_num()
{
  register int i;
  register int check_num;

  check_num = FALSE;
  if (inven_ctr < 22)
    check_num = TRUE;
  else if (inventory[INVEN_MAX].subval > 255)
    for (i = 0; i < inven_ctr; i++)
      if (inventory[i].tval == inventory[INVEN_MAX].tval)
	if (inventory[i].subval == inventory[INVEN_MAX].subval)
	  check_num = TRUE;
  return(check_num);
}


/* Insert INVEN_MAX at given location	*/
insert_inv(pos, wgt)
int pos, wgt;
{
  register int i;

  for (i = inven_ctr-1; i >= pos; i--)
    inventory[i+1] = inventory[i];
  inventory[pos] = inventory[INVEN_MAX];
  inven_ctr++;
  inven_weight += wgt;
}


/* Add the item in INVEN_MAX to players inventory.  Return the	*/
/* item position for a description if needed...          -RAK-   */
inven_carry(item_val)
int *item_val;
{
  int item_num, wgt;
  register int typ, subt;
  int flag;
  register treasure_type *i_ptr;

  /* Now, check to see if player can carry object  */
  *item_val = 0;
  flag = FALSE;
  i_ptr = &inventory[INVEN_MAX];
  item_num = i_ptr->number;
  typ = i_ptr->tval;
  subt = i_ptr->subval;
  wgt = i_ptr->number*i_ptr->weight;

  do
    {
      i_ptr = &inventory[*item_val];
      if (typ == i_ptr->tval)
	{
	  if (subt == i_ptr->subval)  /* Adds to other item    */
	    if (subt > 255)
	      {
		i_ptr->number += item_num;
		inven_weight += wgt;
		flag = TRUE;
	      }
	}
      else if (typ > i_ptr->tval)
	{             /* Insert into list              */
	  insert_inv(*item_val, wgt);
	  flag = TRUE;
	}
      (*item_val)++;
    }
  while ((*item_val < inven_ctr) && (!flag));
  if (!flag)      /* Becomes last item in list     */
    {
      insert_inv(inven_ctr, wgt);
      *item_val = inven_ctr - 1;
    }
  else
    (*item_val)--;
}


/* Returns spell chance of failure for spell		-RAK-	*/
spell_chance(spell)
register spl_rec *spell;
{
  register spell_type *s_ptr;

  s_ptr = &magic_spell[py.misc.pclass][spell->splnum];
  spell->splchn = s_ptr->sfail - 3*(py.misc.lev-s_ptr->slevel);
  if (class[py.misc.pclass].mspell)
    spell->splchn -= 3*(int_adj()-1);
  else
    spell->splchn -= 3*(wis_adj()-1);
  if (s_ptr->smana > py.misc.cmana)
    spell->splchn += 5*(s_ptr->smana-(int)py.misc.cmana);
  if (spell->splchn > 95)
    spell->splchn = 95;
  else if (spell->splchn < 5)
    spell->splchn = 5;
}


/* Print list of spells					-RAK-	*/
print_new_spells(spell, num, redraw)
spl_rec *spell;
register int num;
int *redraw;
{
  register int i;
  vtype out_val;
  register spell_type *s_ptr;

  *redraw = TRUE;
  clear_screen(1, 0);
  prt("   Name                          Level  Mana  %Failure", 1, 0);
  for (i = 0; i < num; i++)
    {
      s_ptr = &magic_spell[py.misc.pclass][spell[i].splnum];
      spell_chance(&spell[i]);
      (void) sprintf(out_val, "%c) %s%d    %d      %d", 97+i,
	      pad(s_ptr->sname, " ", 30),
	      s_ptr->slevel, s_ptr->smana, spell[i].splchn);
      prt(out_val, 2+i, 0);
    }
}


/* Returns spell pointer 				-RAK-	*/
int get_spell(spell, num, sn, sc, prompt, redraw)
spl_rec *spell;
register int num;
register int *sn, *sc;
char *prompt;
int *redraw;
{
  int flag;
  char choice;
  vtype out_val1;

  *sn = -1;
  flag = TRUE;
  (void) sprintf(out_val1, "(Spells a-%c, *==List, <ESCAPE>=exit) %s",
	  num+96, prompt);
  prt(out_val1, 0, 0);
  while (((*sn < 0) || (*sn >= num)) && (flag))
    {
      inkey(&choice);
      *sn = (choice);
      switch(*sn)
	{
	case 0: case 27:
	  flag = FALSE;
	  reset_flag = TRUE;
	  break;
	case 42:
	  print_new_spells(spell, num, redraw);
          break;
	default:
	  *sn -= 97;
	  break;
	}
    }
  erase_line(MSG_LINE, 0);
  msg_flag = FALSE;
  if (flag)
    {
      spell_chance(&spell[*sn]);
      *sc = spell[*sn].splchn;
      *sn = spell[*sn].splnum;
    }
  return(flag);
}


/* Learn some magic spells (Mage)			-RAK-	*/
int learn_spell(redraw)
int *redraw;
{
  unsigned int j;
  register int i, k, new_spells;
  int sn, sc;
  unsigned int spell_flag;
  spl_type spell;
  int learn;
  register spell_type *s_ptr;

  learn = FALSE;
  switch(int_adj())
    {
    case 0: new_spells = 0; break;
    case 1: new_spells = 1; break;
    case 2: new_spells = 1; break;
    case 3: new_spells = 1; break;
    case 4: new_spells = randint(2); break;
    case 5: new_spells = randint(2); break;
    case 6: new_spells = randint(3); break;
    case 7: new_spells = randint(2)+1; break;
    default: new_spells = 0; break;
    }
  i = 0;
  spell_flag = 0;
  do
    {
      if (inventory[i].tval == 90)
	spell_flag |= inventory[i].flags;
      i++;
    }
  while (i < inven_ctr);
  while ((new_spells > 0) && (spell_flag != 0))
    {
      i = 0;
      j = spell_flag;
      do
	{
	  k = bit_pos(&j);
	  s_ptr = &magic_spell[py.misc.pclass][k];
	  if (s_ptr->slevel <= py.misc.lev)
	    if (!s_ptr->learned)
	      {
		spell[i].splnum = k;
		i++;
	      }
	}
      while(j != 0);
      if (i > 0)
	{
	  print_new_spells(spell, i, redraw);
	  if (get_spell(spell, i, &sn, &sc, "Learn which spell?", redraw))
	    {
	      magic_spell[py.misc.pclass][sn].learned = TRUE;
	      learn = TRUE;
	      new_spells--;
	      if (py.misc.mana == 0)
		{
		  py.misc.mana  = 1;
		  py.misc.cmana = 1.0;
		}
	    }
	  /* else do nothing if get_spell fails */
	}
      else
	new_spells = 0;
    }
  return(learn);
}


/* Learn some prayers (Priest)				-RAK-	*/
int learn_prayer()
{
  register int i, j, k, l;
  int new_spell;
  int test_array[32];
  unsigned int spell_flag;
  int learn;
  register spell_type *s_ptr;

  i = 0;
  spell_flag = 0;
  do
    {
      if (inventory[i].tval == 91)
	spell_flag |= inventory[i].flags;
      i++;
    }
  while(i < inven_ctr);
  i = 0;
  while (spell_flag != 0)
    {
      j = bit_pos(&spell_flag);
      s_ptr = &magic_spell[py.misc.pclass][j];
      if (s_ptr->slevel <= py.misc.lev)
	if (!s_ptr->learned)
	  {
	    test_array[i] = j;
	    i++;
	  }
    }
  switch(wis_adj())
    {
    case 0: j = 0; break;
    case 1: j = 1; break;
    case 2: j = 1; break;
    case 3: j = 1; break;
    case 4: j = randint(2); break;
    case 5: j = randint(2); break;
    case 6: j = randint(3); break;
    case 7: j = randint(2)+1; break;
    }
  new_spell = 0;
  while ((i > 0) && (j > 0))
    {
      k = randint(i) - 1;
      magic_spell[py.misc.pclass][test_array[k]].learned = TRUE;
      new_spell++;
      for (l = k; l <= i-1; l++)
	test_array[l] = test_array[l+1];
      i--;       /* One less spell to learn       */
      j--;       /* Learned one                   */
    }
  if (new_spell > 0)
    {
      if (new_spell > 1)
	msg_print("You learned new prayers!");
      else
	msg_print("You learned a new prayer!");
      /* make sure player see the message when game starts */
      if (py.misc.exp == 0)  msg_print(" ");
      if (py.misc.mana == 0)
	{
	  py.misc.mana  = 1;
	  py.misc.cmana = 1.0;
	}
      learn = TRUE;
    }
  else
    learn = FALSE;
  return(learn);
}


/* Gain some mana if you knows at least one spell	-RAK-	*/
gain_mana(amount)
int amount;
{
  register int i, new_mana;
  register int knows_spell;

  knows_spell = FALSE;
  for (i = 0; i < 31; i++)
    if (magic_spell[py.misc.pclass][i].learned)
      knows_spell = TRUE;
  if (knows_spell)
    {
      if (0x1 & py.misc.lev)
	switch(amount)
	  {
	  case 0: new_mana = 0; break;
	  case 1: new_mana = 1; break;
	  case 2: new_mana = 1; break;
	  case 3: new_mana = 1; break;
	  case 4: new_mana = 2; break;
	  case 5: new_mana = 2; break;
	  case 6: new_mana = 3; break;
	  case 7: new_mana = 4; break;
	  default: new_mana = 0; break;
	  }
      else
	switch(amount)
	  {
	  case 0: new_mana = 0; break;
	  case 1: new_mana = 1; break;
	  case 2: new_mana = 1; break;
	  case 3: new_mana = 2; break;
	  case 4: new_mana = 2; break;
	  case 5: new_mana = 3; break;
	  case 6: new_mana = 3; break;
	  case 7: new_mana = 4; break;
	  default: new_mana = 0; break;
	  }
      py.misc.mana  += new_mana;
      py.misc.cmana += new_mana;
    }
}


/* Increases hit points and level			-RAK-	*/
gain_level()
{
  int nhp, dif_exp, need_exp;
  int redraw;
  vtype out_val;
  register struct misc *p_ptr;
  register class_type *c_ptr;

  p_ptr = &py.misc;
  nhp = get_hitdie();
  p_ptr->mhp += nhp;
  p_ptr->chp += (double)nhp;
  p_ptr->lev++;
  need_exp = (player_exp[p_ptr->lev-1] * p_ptr->expfact);
  if (py.misc.exp > need_exp)
    {
      /* lose some of the 'extra' exp when gain a level */
      dif_exp = py.misc.exp - need_exp;
      py.misc.exp = need_exp + (dif_exp / 2);
    }
  (void) strcpy(p_ptr->title, player_title[p_ptr->pclass][p_ptr->lev-1]);
  (void) sprintf(out_val, "Welcome to level %d.", (int)p_ptr->lev);
  msg_print(out_val);
  /* make sure player sees message, before learn_spell erases it */
  msg_print(" ");
  msg_flag = FALSE;
  prt_mhp();
  prt_chp();
  prt_level();
  prt_title();
  c_ptr = &class[p_ptr->pclass];
  if (c_ptr->mspell)
    {
      redraw = FALSE;
      (void) learn_spell(&redraw);
      if (redraw)  draw_cave();
      gain_mana(int_adj());
      prt_cmana();
    }
  else if (c_ptr->pspell)
    {
      (void) learn_prayer();
      gain_mana(wis_adj());
      prt_cmana();
    }
}

/* Prints experience					-RAK-	*/
prt_experience()
{
  register struct misc *p_ptr;

  p_ptr = &py.misc;
  if (p_ptr->exp > player_max_exp)
    p_ptr->exp = player_max_exp;
  if (p_ptr->lev < MAX_PLAYER_LEVEL)
    {
      while ((player_exp[p_ptr->lev-1] * p_ptr->expfact) <= p_ptr->exp)
	gain_level();
      if (p_ptr->exp > p_ptr->max_exp)
	p_ptr->max_exp = p_ptr->exp;
    }
  prt_num("", py.misc.exp, 14, stat_column+6);
}


/* Inserts a string into a string				*/
insert_str(object_str, mtc_str, insert)
char *object_str, *mtc_str, *insert;
{
  int obj_len;
  char *bound, *pc;
  register int i, mtc_len;
  register char *temp_obj, *temp_mtc;
  char out_val[80];

  mtc_len = strlen(mtc_str);
  obj_len = strlen(object_str);
  bound = object_str + obj_len - mtc_len;
  for (pc = object_str; pc <= bound; pc++)
    {
      temp_obj = pc;
      temp_mtc = mtc_str;
      for (i = 0; i < mtc_len; i++)
	if (*temp_obj++ != *temp_mtc++)
	  break;
      if (i == mtc_len)
	break;
    }

  if (pc <= bound)
    {
      (void) strncpy(out_val, object_str, (pc-object_str));
      out_val[(pc-object_str)] = '\0';
      (void) strcat(out_val, insert);
      (void) strcat(out_val, (char *)(pc+mtc_len));
      (void) strcpy(object_str, out_val);
    }
}


/* Inserts a number into a string				*/
insert_num(object_str, mtc_str, number, show_sign)
char *object_str;
register char *mtc_str;
int number;
int show_sign;
{
  int pos, mlen;
  vtype str1, str2;
  register char *string, *tmp_str;
  int flag;

  flag = 1;
  tmp_str = object_str;
  do
    {
      string = index(tmp_str, mtc_str[0]);
      if (string == 0)
	flag = 0;
      else
	{
	  flag = strncmp(string, mtc_str, strlen(mtc_str));
	  if (flag)
	    tmp_str = string+1;
	}
    }
  while (flag);
  if (string)
    pos = strlen(object_str) - strlen(string);
  else
    pos = -1;
  if (pos >= 0)
    {
      mlen = strlen(mtc_str);
      (void) strncpy(str1, object_str, pos);
      str1[pos] = '\0';
      (void) strcpy(str2, &object_str[pos+mlen]);
      if ((number >= 0) && (show_sign))
	(void) sprintf(object_str, "%s+%d%s", str1, number, str2);
      else
	(void) sprintf(object_str, "%s%d%s", str1, number, str2);
    }
}


/* Checks to see if user is a wizard			-RAK-	*/
int check_pswd()
{
  register int i;
  char x;
  char tpw[12];
  register int check;

  check = FALSE;
  if (getuid() != UID)
    return(FALSE);
  i = 0;
  tpw[0] = '\0';
  prt("Password : ", 0, 0);
  do
    {
      inkey(&x);
      switch(x)
	{
	case 10:
	case 13:
	  break;
	default:
	  tpw[i] = x;
	  i++;
	  break;
	}
    }
  while ((i != 12) && (x != 13) && (x != 10));
  tpw[i] = '\0';
  if (!strcmp(tpw, password1))
    {
      wizard1 = TRUE;
      check = TRUE;
    }
  else if (!strcmp(tpw, password2))
    {
      wizard1 = TRUE;
      wizard2 = TRUE;
      check = TRUE;
    }
  msg_flag = FALSE;
  erase_line(MSG_LINE, 0);
  return(check);
}


/* Weapon weight VS strength and dexterity		-RAK-	*/
int attack_blows(weight, wtohit)
int weight;
int *wtohit;
{
  register int adj_weight, blows;
  register struct stats *p_ptr;

  blows  = 1;
  *wtohit = 0;
  p_ptr = &py.stats;
  if ((p_ptr->cstr*15) < weight)
    *wtohit = p_ptr->cstr*15 - weight;
  else
    {
      if      (p_ptr->cdex <  10)  blows = 1;
      else if (p_ptr->cdex <  19)  blows = 2;
      else if (p_ptr->cdex <  68)  blows = 3;
      else if (p_ptr->cdex < 108)  blows = 4;
      else if (p_ptr->cdex < 118)  blows = 5;
      else                         blows = 6;
      adj_weight = ((p_ptr->cstr*10) / weight);
      if      (adj_weight < 2)  blows = 1;
      else if (adj_weight < 3)  blows = (blows/3.0) + 1;
      else if (adj_weight < 4)  blows = (blows/2.5) + 1;
      else if (adj_weight < 5)  blows = (blows/2.25) + 1;
      else if (adj_weight < 7)  blows = (blows/2.00) + 1;
      else if (adj_weight < 9)  blows = (blows/1.75) + 1;
      else                      blows = (blows/1.50) + 1;
    }
  return(blows);
}


/* Critical hits, Nasty way to die...			-RAK-	*/
int critical_blow(weight, plus, dam)
register int weight, plus, dam;
{
  register int critical;

  critical = dam;
  /* Weight of weapon, plusses to hit, and character level all      */
  /* contribute to the chance of a critical                        */
  if (randint(5000) <= (int)(weight+5*plus+3*py.misc.lev))
    {
      weight += randint(650);
      if (weight < 400)
	{
	  critical = 2*dam + 5;
	  msg_print("It was a good hit! (x2 damage)");
	}
      else if (weight < 700)
	{
	  critical = 3*dam + 10;
	  msg_print("It was an excellent hit! (x3 damage)");
	}
      else if (weight < 900)
	{
	  critical = 4*dam + 15;
	  msg_print("It was a superb hit! (x4 damage)");
	}
      else
	{
	  critical = 5*dam + 20;
	  msg_print("It was a *GREAT* hit! (x5 damage)");
	}
    }
  return(critical);
}


/* Given direction "dir", returns new row, column location -RAK- */
int move(dir, y, x)
int dir;
register int *y, *x;
{
  register int new_row, new_col;
  int bool;

  switch(dir)
    {
    case 1:
      new_row = *y + 1;
      new_col = *x - 1;
      break;
    case 2:
      new_row = *y + 1;
      new_col = *x;
      break;
    case 3:
      new_row = *y + 1;
      new_col = *x + 1;
      break;
    case 4:
      new_row = *y;
      new_col = *x - 1;
      break;
    case 5:
      new_row = *y;
      new_col = *x;
      break;
    case 6:
      new_row = *y;
      new_col = *x + 1;
      break;
    case 7:
      new_row = *y - 1;
      new_col = *x - 1;
      break;
    case 8:
      new_row = *y - 1;
      new_col = *x;
      break;
    case 9:
      new_row = *y - 1;
      new_col = *x + 1;
      break;
    }
  bool = FALSE;
  if ((new_row >= 0) && (new_row < cur_height))
    if ((new_col >= 0) && (new_col < cur_width))
      {
	*y = new_row;
	*x = new_col;
	bool = TRUE;
      }
  return(bool);
}

/* Saving throws for player character... 		-RAK-	*/
int player_saves(adjust)
int adjust;
{
  if (randint(100) <= (py.misc.save + py.misc.lev + adjust))
    return(TRUE);
  else
    return(FALSE);
}


/* Init players with some belongings			-RAK-	*/
char_inven_init()
{
  register int i, j;
  int dummy;

  /* this is needed for bash to work right, it can't hurt anyway */
  for (i = 0; i < INVEN_ARRAY_SIZE; i++)
    inventory[i] = blank_treasure;

  for (i = 0; i < 5; i++)
    {
      j = player_init[py.misc.pclass][i];
      inventory[INVEN_MAX] = inventory_init[j];
      inven_carry(&dummy);
    }
}