-+-+-+-+-+-+-+-+ START OF PART 32 -+-+-+-+-+-+-+-+
X`09  else if (tmp == 2)
X`09    `7B
X`09      t_ptr->name2 = SN_VULNERABILITY;
X`09      t_ptr->toac -= m_bonus(10, 100, level+50);
X`09      t_ptr->cost = 0;
X`09    `7D
X`09  else
X`09    `7B
X`09      t_ptr->name2 = SN_ENVELOPING;
X`09      t_ptr->toac  -= m_bonus(1, 10, level);
X`09      t_ptr->ident `7C= ID_SHOW_HITDAM;
X`09      t_ptr->tohit -= m_bonus(2, 40, level+10);
X`09      t_ptr->todam -= m_bonus(2, 40, level+10);
X`09      t_ptr->cost = 0;
X`09    `7D
X#ifdef ATARIST_MWC
X`09  t_ptr->flags `7C= (holder = TR_CURSED);
X#else
X`09  t_ptr->flags `7C= TR_CURSED;
X#endif
X`09`7D
X      break;
X
X    case TV_CHEST:
X      switch(randint(level+4))
X`09`7B
X`09case 1:
X`09  t_ptr->flags = 0;
X`09  t_ptr->name2 = SN_EMPTY;
X`09  break;
X`09case 2:
X`09  t_ptr->flags `7C= CH_LOCKED;
X`09  t_ptr->name2 = SN_LOCKED;
X`09  break;
X`09case 3: case 4:
X`09  t_ptr->flags `7C= (CH_LOSE_STR`7CCH_LOCKED);
X`09  t_ptr->name2 = SN_POISON_NEEDLE;
X`09  break;
X`09case 5: case 6:
X`09  t_ptr->flags `7C= (CH_POISON`7CCH_LOCKED);
X`09  t_ptr->name2 = SN_POISON_NEEDLE;
X`09  break;
X`09case 7: case 8: case 9:
X`09  t_ptr->flags `7C= (CH_PARALYSED`7CCH_LOCKED);
X`09  t_ptr->name2 = SN_GAS_TRAP;
X`09  break;
X`09case 10: case 11:
X`09  t_ptr->flags `7C= (CH_EXPLODE`7CCH_LOCKED);
X`09  t_ptr->name2 = SN_EXPLOSION_DEVICE;
X`09  break;
X`09case 12: case 13: case 14:
X`09  t_ptr->flags `7C= (CH_SUMMON`7CCH_LOCKED);
X`09  t_ptr->name2 = SN_SUMMONING_RUNES;
X`09  break;
X`09case 15: case 16: case 17:
X`09  t_ptr->flags `7C= (CH_PARALYSED`7CCH_POISON`7CCH_LOSE_STR`7CCH_LOCKED);
X`09  t_ptr->name2 = SN_MULTIPLE_TRAPS;
X`09  break;
X`09default:
X`09  t_ptr->flags `7C= (CH_SUMMON`7CCH_EXPLODE`7CCH_LOCKED);
X`09  t_ptr->name2 = SN_MULTIPLE_TRAPS;
X`09  break;
X`09`7D
X      break;
X
X    case TV_SLING_AMMO: case TV_SPIKE:
X    case TV_BOLT: case TV_ARROW:
X      if (t_ptr->tval == TV_SLING_AMMO `7C`7C t_ptr->tval == TV_BOLT
X`09  `7C`7C t_ptr->tval == TV_ARROW)
X`09`7B
X`09  /* always show tohit/todam values if identified */
X`09  t_ptr->ident `7C= ID_SHOW_HITDAM;
X
X`09  if (magik(chance))
X`09    `7B
X`09      t_ptr->tohit += m_bonus(1, 35, level);
X`09      t_ptr->todam += m_bonus(1, 35, level);
X`09      /* see comment for weapons */
X`09      if (magik(3*special/2))
X`09`09switch(randint(10))
X`09`09  `7B
X`09`09  case 1: case 2: case 3:
X`09`09    t_ptr->name2 = SN_SLAYING;
X`09`09    t_ptr->tohit += 5;
X`09`09    t_ptr->todam += 5;
X`09`09    t_ptr->cost += 20;
X`09`09    break;
X`09`09  case 4: case 5:
X#ifdef ATARIST_MWC
X`09`09    t_ptr->flags `7C= (holder = TR_FLAME_TONGUE);
X#else
X`09`09    t_ptr->flags `7C= TR_FLAME_TONGUE;
X#endif
X`09`09    t_ptr->tohit += 2;
X`09`09    t_ptr->todam += 4;
X`09`09    t_ptr->name2 = SN_FIRE;
X`09`09    t_ptr->cost += 25;
X`09`09    break;
X`09`09  case 6: case 7:
X`09`09    t_ptr->flags `7C= TR_SLAY_EVIL;
X`09`09    t_ptr->tohit += 3;
X`09`09    t_ptr->todam += 3;
X`09`09    t_ptr->name2 = SN_SLAY_EVIL;
X`09`09    t_ptr->cost += 25;
X`09`09    break;
X`09`09  case 8: case 9:
X`09`09    t_ptr->flags `7C= TR_SLAY_ANIMAL;
X`09`09    t_ptr->tohit += 2;
X`09`09    t_ptr->todam += 2;
X`09`09    t_ptr->name2 = SN_SLAY_ANIMAL;
X`09`09    t_ptr->cost += 30;
X`09`09    break;
X`09`09  case 10:
X`09`09    t_ptr->flags `7C= TR_SLAY_DRAGON;
X`09`09    t_ptr->tohit += 3;
X`09`09    t_ptr->todam += 3;
X`09`09    t_ptr->name2 = SN_DRAGON_SLAYING;
X`09`09    t_ptr->cost += 35;
X`09`09    break;
X`09`09  `7D
X`09    `7D
X`09  else if (magik(cursed))
X`09    `7B
X`09      t_ptr->tohit -= m_bonus(5, 55, level);
X`09      t_ptr->todam -= m_bonus(5, 55, level);
X#ifdef ATARIST_MWC
X`09      t_ptr->flags `7C= (holder = TR_CURSED);
X#else
X`09      t_ptr->flags `7C= TR_CURSED;
X#endif
X`09      t_ptr->cost = 0;
X`09    `7D
X`09`7D
X
X      t_ptr->number = 0;
X      for (i = 0; i < 7; i++)
X`09t_ptr->number += randint(6);
X      if (missile_ctr == MAX_SHORT)
X`09missile_ctr = -MAX_SHORT - 1;
X      else
X`09missile_ctr++;
X      t_ptr->p1 = missile_ctr;
X      break;
X
X    case TV_FOOD:
X      /* make sure all food rations have the same level */
X      if (t_ptr->subval == 90)
X`09t_ptr->level = 0;
X      /* give all elvish waybread the same level */
X      else if (t_ptr->subval == 92)
X`09t_ptr->level = 6;
X      break;
X
X    case TV_SCROLL1:
X      /* give all identify scrolls the same level */
X      if (t_ptr->subval == 67)
X`09t_ptr->level = 1;
X      /* scroll of light */
X      else if (t_ptr->subval == 69)
X`09t_ptr->level = 0;
X      /* scroll of trap detection */
X      else if (t_ptr->subval == 80)
X`09t_ptr->level = 5;
X      /* scroll of door/stair location */
X      else if (t_ptr->subval == 81)
X`09t_ptr->level = 5;
X      break;
X
X    case TV_POTION1:  /* potions */
X      /* cure light */
X      if (t_ptr->subval == 76)
X`09t_ptr->level = 0;
X      break;
X
X    default:
X      break;
X    `7D
X`7D
X
X
Xstatic struct opt_desc `7B char *o_prompt; int *o_var; `7D options`5B`5D = `
V7B
X  `7B "Running: cut known corners",`09`09&find_cut `7D,
X  `7B "Running: examine potential corners",`09&find_examine `7D,
X  `7B "Running: print self during run",`09`09&find_prself `7D,
X  `7B "Running: stop when map sector changes",`09&find_bound `7D,
X  `7B "Running: run through open doors",`09`09&find_ignore_doors `7D,
X  `7B "Prompt to pick up objects",`09`09&prompt_carry_flag `7D,
X  `7B "Rogue like commands",`09`09`09&rogue_like_commands `7D,
X  `7B "Show weights in inventory",`09`09&show_weight_flag `7D,
X  `7B "Highlight and notice mineral seams",`09&highlight_seams `7D,
X  `7B "Beep for invalid character",`09`09&sound_beep_flag `7D,
X  `7B "Display rest/repeat counts",`09`09&display_counts `7D,
X  `7B 0, 0 `7D `7D;
X
X
X/* Set or unset various boolean options.`09`09-CJS- */
Xvoid set_options()
X`7B
X  register int i, max;
X  vtype string;
X
X  prt("  ESC when finished, y/n to set options, <return> or - to move cursor
V",
X`09`090, 0);
X  for (max = 0; options`5Bmax`5D.o_prompt != 0; max++)
X    `7B
X      (void) sprintf(string, "%-38s: %s", options`5Bmax`5D.o_prompt,
X`09`09     (*options`5Bmax`5D.o_var ? "yes" : "no "));
X      prt(string, max+1, 0);
X    `7D
X  erase_line(max+1, 0);
X  i = 0;
X  for(;;)
X    `7B
X      move_cursor(i+1, 40);
X      switch(inkey())
X`09`7B
X`09case ESCAPE:
X`09  return;
X`09case '-':
X`09  if (i > 0)
X`09    i--;
X`09  else
X`09    i = max-1;
X`09  break;
X`09case ' ':
X`09case '\n':
X`09case '\r':
X`09  if (i+1 < max)
X`09    i++;
X`09  else
X`09    i = 0;
X`09  break;
X`09case 'y':
X`09case 'Y':
X`09  put_buffer("yes", i+1, 40);
X`09  *options`5Bi`5D.o_var = TRUE;
X`09  if (i+1 < max)
X`09    i++;
X`09  else
X`09    i = 0;
X`09  break;
X`09case 'n':
X`09case 'N':
X`09  put_buffer("no ", i+1, 40);
X`09  *options`5Bi`5D.o_var = FALSE;
X`09  if (i+1 < max)
X`09    i++;
X`09  else
X`09    i = 0;
X`09  break;
X`09default:
X`09  bell();
X`09  break;
X`09`7D
X    `7D
X`7D
$ CALL UNPACK MISC2.C;1 454608567
$ create 'f'
X/* source/misc3.c: misc code for maintaining the dungeon, printing player in
Vfo
X
X   Copyright (c) 1989-92 James E. Wilson, Robert A. Koeneke
X
X   This software may be copied and distributed for educational, research, an
Vd
X   not for profit purposes provided that this copyright and statement are
X   included in all such copies. */
X
X#ifdef __TURBOC__
X#include`09<stdio.h>
X#endif
X
X#include "config.h"
X#include "constant.h"
X#include "types.h"
X#include "externs.h"
X
X#include <ctype.h>
X
X#ifndef USG
X#include <sys/types.h>
X#include <sys/param.h>
X#endif
X
X#ifdef USG
X#ifndef ATARIST_MWC
X#include <string.h>
X#else
Xchar *index();
X#endif
X#else
X#include <strings.h>
X#endif
X
X#if defined(LINT_ARGS)
Xstatic void prt_lnum(char *, int32, int, int);
Xstatic void prt_num(char *, int, int, int);
Xstatic void prt_long(int32, int, int);
Xstatic void prt_int(int, int, int);
Xstatic void gain_level(void);
X#endif
X
Xstatic char *stat_names`5B`5D = `7B "STR : ", "INT : ", "WIS : ",
X`09`09`09`09 "DEX : ", "CON : ", "CHR : " `7D;
X#define BLANK_LENGTH`0924
Xstatic char blank_string`5B`5D = "                        ";
X
X
X/* Places a particular trap at location y, x`09`09-RAK-`09*/
Xvoid place_trap(y, x, subval)
Xint y, x, subval;
X`7B
X  register int cur_pos;
X
X  cur_pos = popt();
X  cave`5By`5D`5Bx`5D.tptr  = cur_pos;
X  invcopy(&t_list`5Bcur_pos`5D, OBJ_TRAP_LIST + subval);
X`7D
X
X
X/* Places rubble at location y, x`09`09`09-RAK-`09*/
Xvoid place_rubble(y, x)
Xint y, x;
X`7B
X  register int cur_pos;
X  register cave_type *cave_ptr;
X
X  cur_pos = popt();
X  cave_ptr = &cave`5By`5D`5Bx`5D;
X  cave_ptr->tptr = cur_pos;
X  cave_ptr->fval = BLOCKED_FLOOR;
X  invcopy(&t_list`5Bcur_pos`5D, OBJ_RUBBLE);
X`7D
X
X
X/* Places a treasure (Gold or Gems) at given row, column -RAK-`09*/
Xvoid place_gold(y, x)
Xint y, x;
X`7B
X  register int i, cur_pos;
X#ifdef M_XENIX
X  /* Avoid 'register' bug.  */
X  inven_type *t_ptr;
X#else
X  register inven_type *t_ptr;
X#endif
X
X  cur_pos = popt();
X  i = ((randint(dun_level+2)+2) / 2) - 1;
X  if (randint(OBJ_GREAT) == 1)
X    i += randint(dun_level+1);
X  if (i >= MAX_GOLD)
X    i = MAX_GOLD - 1;
X  cave`5By`5D`5Bx`5D.tptr = cur_pos;
X  invcopy(&t_list`5Bcur_pos`5D, OBJ_GOLD_LIST+i);
X  t_ptr = &t_list`5Bcur_pos`5D;
X  t_ptr->cost += (8L * (long)randint((int)t_ptr->cost)) + randint(8);
X  if (cave`5By`5D`5Bx`5D.cptr == 1)
X    msg_print ("You feel something roll beneath your feet.");
X`7D
X
X
X/* Returns the array number of a random object`09`09-RAK-`09*/
Xint get_obj_num(level)
Xint level;
X`7B
X  register int i, j;
X
X  if (level == 0)
X    i = randint(t_level`5B0`5D) - 1;
X  else
X    `7B
X      if (level >= MAX_OBJ_LEVEL)
X`09level = MAX_OBJ_LEVEL;
X      else if (randint(OBJ_GREAT) == 1)
X`09`7B
X`09  level = level * MAX_OBJ_LEVEL / randint (MAX_OBJ_LEVEL) + 1;
X`09  if (level > MAX_OBJ_LEVEL)
X`09    level = MAX_OBJ_LEVEL;
X`09`7D
X
X      /* This code has been added to make it slightly more likely to get the
X`09 higher level objects.`09Originally a uniform distribution over all
X`09 objects less than or equal to the dungeon level.  This distribution
X`09 makes a level n objects occur approx 2/n% of the time on level n,
X`09 and 1/2n are 0th level. */
X
X      if (randint(2) == 1)
X`09i = randint(t_level`5Blevel`5D) - 1;
X      else /* Choose three objects, pick the highest level. */
X`09`7B
X`09  i = randint(t_level`5Blevel`5D) - 1;
X`09  j = randint(t_level`5Blevel`5D) - 1;
X`09  if (i < j)
X`09    i = j;
X`09  j = randint(t_level`5Blevel`5D) - 1;
X`09  if (i < j)
X`09    i = j;
X`09  j = object_list`5Bsorted_objects`5Bi`5D`5D.level;
X`09  if (j == 0)
X`09    i = randint(t_level`5B0`5D) - 1;
X`09  else
X`09    i = randint(t_level`5Bj`5D-t_level`5Bj-1`5D) - 1 + t_level`5Bj-1`5D;
X`09`7D
X    `7D
X  return(i);
X`7D
X
X
X/* Places an object at given row, column co-ordinate`09-RAK-`09*/
Xvoid place_object(y, x)
Xint y, x;
X`7B
X  register int cur_pos, tmp;
X
X  cur_pos = popt();
X  cave`5By`5D`5Bx`5D.tptr = cur_pos;
X  /* split this line up to avoid a reported compiler bug */
X  tmp = get_obj_num(dun_level);
X  invcopy(&t_list`5Bcur_pos`5D, sorted_objects`5Btmp`5D);
X  magic_treasure(cur_pos, dun_level);
X  if (cave`5By`5D`5Bx`5D.cptr == 1)
X    msg_print ("You feel something roll beneath your feet.");`09/* -CJS- */
X`7D
X
X
X/* Allocates an object for tunnels and rooms`09`09-RAK-`09*/
Xvoid alloc_object(alloc_set, typ, num)
Xint (*alloc_set)();
Xint typ, num;
X`7B
X  register int i, j, k;
X
X  for (k = 0; k < num; k++)
X    `7B
X      do
X`09`7B
X`09  i = randint(cur_height) - 1;
X`09  j = randint(cur_width) - 1;
X`09`7D
X      /* don't put an object beneath the player, this could cause problems
X`09 if player is standing under rubble, or on a trap */
X      while ((!(*alloc_set)(cave`5Bi`5D`5Bj`5D.fval)) `7C`7C
X`09     (cave`5Bi`5D`5Bj`5D.tptr != 0) `7C`7C (i == char_row && j == char_co
Vl));
X      if (typ < 4) `7B`09/* typ == 2 not used, used to be visible traps */
X`09if (typ == 1) place_trap(i, j, randint(MAX_TRAP)-1); /* typ == 1 */
X`09else`09      place_rubble(i, j); /* typ == 3 */
X      `7D else `7B
X`09if (typ == 4) place_gold(i, j); /* typ == 4 */
X`09else`09      place_object(i, j); /* typ == 5 */
X      `7D
X    `7D
X`7D
X
X
X/* Creates objects nearby the coordinates given`09`09-RAK-`09*/
Xvoid random_object(y, x, num)
Xint y, x, num;
X`7B
X  register int i, j, k;
X  register cave_type *cave_ptr;
X
X  do
X    `7B
X      i = 0;
X      do
X`09`7B
X`09  j = y - 3 + randint(5);
X`09  k = x - 4 + randint(7);
X`09  cave_ptr = &cave`5Bj`5D`5Bk`5D;
X`09  if (in_bounds(j, k) && (cave_ptr->fval <= MAX_CAVE_FLOOR)
X`09      && (cave_ptr->tptr == 0))
X`09    `7B
X`09      if (randint(100) < 75)
X`09`09place_object(j, k);
X`09      else
X`09`09place_gold(j, k);
X`09      i = 9;
X`09    `7D
X`09  i++;
X`09`7D
X      while(i <= 10);
X      num--;
X    `7D
X  while (num != 0);
X`7D
X
X
X/* Converts stat num into string`09`09`09-RAK-`09*/
Xvoid cnv_stat(stat, out_val)
Xint8u stat;
Xchar *out_val;
X`7B
X  register int part1, part2;
X
X  if (stat > 18)
X    `7B
X      part1 = 18;
X      part2 = stat - 18;
X      if (part2 == 100)
X`09(void) strcpy(out_val, "18/100");
X      else
X`09(void) sprintf(out_val, " %2d/%02d", part1, part2);
X    `7D
X  else
X    (void) sprintf(out_val, "%6d", stat);
X`7D
X
X
X/* Print character stat in given row, column`09`09-RAK-`09*/
Xvoid prt_stat(stat)
Xint stat;
X`7B
X  stat_type out_val1;
X
X  cnv_stat(py.stats.use_stat`5Bstat`5D, out_val1);
X  put_buffer(stat_names`5Bstat`5D, 6+stat, STAT_COLUMN);
X  put_buffer (out_val1, 6+stat, STAT_COLUMN+6);
X`7D
X
X
X/* Print character info in given row, column`09`09-RAK-`09*/
X/* the longest title is 13 characters, so only pad to 13 */
Xvoid prt_field(info, row, column)
Xchar *info;
Xint row, column;
X`7B
X  put_buffer (&blank_string`5BBLANK_LENGTH-13`5D, row, column);
X  put_buffer (info, row, column);
X`7D
X
X/* Print long number with header at given row, column */
Xstatic void prt_lnum(header, num, row, column)
Xchar *header;
Xint32 num;
Xint row, column;
X`7B
X  vtype out_val;
X
+-+-+-+-+-+-+-+-  END  OF PART 32 +-+-+-+-+-+-+-+-
