-+-+-+-+-+-+-+-+ START OF PART 64 -+-+-+-+-+-+-+-+
X      (void) mmove(dir, &y, &x);
X      dist++;
X      c_ptr = &cave`5By`5D`5Bx`5D;
X      /* note, this ray can move through walls as it turns them to mud */
X      if (dist == OBJ_BOLT_RANGE)
X`09flag = TRUE;
X      if ((c_ptr->fval >= MIN_CAVE_WALL) && (c_ptr->fval != BOUNDARY_WALL))
X`09`7B
X`09  flag = TRUE;
X`09  (void) twall(y, x, 1, 0);
X`09  if (test_light(y, x))
X`09    `7B
X`09      msg_print("The wall turns into mud.");
X`09      wall = TRUE;
X`09    `7D
X`09`7D
X      else if ((c_ptr->tptr != 0) && (c_ptr->fval >= MIN_CLOSED_SPACE))
X`09`7B
X`09  flag = TRUE;
X`09  if (panel_contains(y, x) && test_light(y, x))
X`09    `7B
X`09      objdes(tmp_str, &t_list`5Bc_ptr->tptr`5D, FALSE);
X`09      (void) sprintf(out_val, "The %s turns into mud.", tmp_str);
X`09      msg_print(out_val);
X`09      wall = TRUE;
X`09    `7D
X`09  (void) delete_object(y, x);
X`09`7D
X      if (c_ptr->cptr > 1)
X`09`7B
X`09  m_ptr = &m_list`5Bc_ptr->cptr`5D;
X`09  r_ptr = &c_list`5Bm_ptr->mptr`5D;
X`09  if (CD_STONE & r_ptr->cdefense)
X`09    `7B
X`09      monster_name (m_name, m_ptr, r_ptr);
X`09      i = mon_take_hit((int)c_ptr->cptr, 100);
X`09      /* Should get these messages even if the monster is not
X`09`09 visible.  */
X`09      if (i >= 0)
X`09`09`7B
X`09`09  c_recall`5Bi`5D.r_cdefense `7C= CD_STONE;
X`09`09  (void) sprintf(out_val, "%s dissolves!", m_name);
X`09`09  msg_print(out_val);
X`09`09  prt_experience(); /* print msg before calling prt_exp */
X`09`09`7D
X`09      else
X`09`09`7B
X`09`09  c_recall`5Bm_ptr->mptr`5D.r_cdefense `7C= CD_STONE;
X`09`09  (void) sprintf(out_val, "%s grunts in pain!",m_name);
X`09`09  msg_print(out_val);
X`09`09`7D
X`09      flag = TRUE;
X`09    `7D
X`09`7D
X    `7D
X  while (!flag);
X  return(wall);
X`7D
X
X
X/* Destroy all traps and doors in a given direction`09-RAK-`09*/
Xint td_destroy2(dir, y, x)
Xint dir, y, x;
X`7B
X  register int destroy2, dist;
X  register cave_type *c_ptr;
X  register inven_type *t_ptr;
X
X  destroy2 = FALSE;
X  dist= 0;
X  do
X    `7B
X      (void) mmove(dir, &y, &x);
X      dist++;
X      c_ptr = &cave`5By`5D`5Bx`5D;
X      /* must move into first closed spot, as it might be a secret door */
X      if (c_ptr->tptr != 0)
X`09`7B
X`09  t_ptr = &t_list`5Bc_ptr->tptr`5D;
X`09  if ((t_ptr->tval == TV_INVIS_TRAP) `7C`7C (t_ptr->tval == TV_CLOSED_DOO
VR)
X`09      `7C`7C (t_ptr->tval == TV_VIS_TRAP) `7C`7C (t_ptr->tval == TV_OPEN_
VDOOR)
X`09      `7C`7C (t_ptr->tval == TV_SECRET_DOOR))
X`09    `7B
X`09      if (delete_object(y, x))
X`09`09`7B
X`09`09  msg_print("There is a bright flash of light!");
X`09`09  destroy2 = TRUE;
X`09`09`7D
X`09    `7D
X`09  else if (t_ptr->tval == TV_CHEST)
X`09    `7B
X`09      msg_print("Click!");
X`09      t_ptr->flags &= `7E(CH_TRAPPED`7CCH_LOCKED);
X`09      destroy2 = TRUE;
X`09      t_ptr->name2 = SN_UNLOCKED;
X`09      known2(t_ptr);
X`09    `7D
X`09`7D
X    `7D
X  while ((dist <= OBJ_BOLT_RANGE) `7C`7C c_ptr->fval <= MAX_OPEN_SPACE);
X  return(destroy2);
X`7D
X
X
X/* Polymorph a monster`09`09`09`09`09-RAK-`09*/
X/* NOTE: cannot polymorph a winning creature (BALROG)`09`09 */
Xint poly_monster(dir, y, x)
Xint dir, y, x;
X`7B
X  int dist, flag, poly;
X  register cave_type *c_ptr;
X  register creature_type *r_ptr;
X  register monster_type *m_ptr;
X  vtype out_val, m_name;
X
X  poly = FALSE;
X  flag = FALSE;
X  dist = 0;
X  do
X    `7B
X      (void) mmove(dir, &y, &x);
X      dist++;
X      c_ptr = &cave`5By`5D`5Bx`5D;
X      if ((dist > OBJ_BOLT_RANGE) `7C`7C c_ptr->fval >= MIN_CLOSED_SPACE)
X`09flag = TRUE;
X      else if (c_ptr->cptr > 1)
X`09`7B
X`09  m_ptr = &m_list`5Bc_ptr->cptr`5D;
X`09  r_ptr = &c_list`5Bm_ptr->mptr`5D;
X`09  if (randint(MAX_MONS_LEVEL) > r_ptr->level)
X`09    `7B
X`09      flag = TRUE;
X`09      delete_monster((int)c_ptr->cptr);
X`09      /* Place_monster() should always return TRUE here.  */
X`09      poly = place_monster(y, x,
X`09`09`09`09   randint(m_level`5BMAX_MONS_LEVEL`5D-m_level`5B0`5D)
X`09`09`09`09   - 1 + m_level`5B0`5D, FALSE);
X`09      /* don't test c_ptr->fm here, only pl/tl */
X`09      if (poly && panel_contains(y, x) && (c_ptr->tl `7C`7C c_ptr->pl))
X`09`09poly = TRUE;
X`09    `7D
X`09  else
X`09    `7B
X`09      monster_name (m_name, m_ptr, r_ptr);
X`09      (void) sprintf(out_val, "%s is unaffected.", m_name);
X`09      msg_print(out_val);
X`09    `7D
X`09`7D
X    `7D
X  while (!flag);
X  return(poly);
X`7D
X
X
X/* Create a wall.`09`09`09`09`09-RAK-`09*/
Xint build_wall(dir, y, x)
Xint dir, y, x;
X`7B
X  register int i;
X  int build, damage, dist, flag;
X  register cave_type *c_ptr;
X  register monster_type *m_ptr;
X  register creature_type *r_ptr;
X  vtype m_name, out_val;
X#ifdef ATARIST_MWC
X  int32u holder;
X#endif
X
X  build = FALSE;
X  dist = 0;
X  flag = FALSE;
X  do
X    `7B
X      (void) mmove(dir, &y, &x);
X      dist++;
X      c_ptr = &cave`5By`5D`5Bx`5D;
X      if ((dist > OBJ_BOLT_RANGE) `7C`7C c_ptr->fval >= MIN_CLOSED_SPACE)
X`09flag = TRUE;
X      else
X`09`7B
X`09  if (c_ptr->tptr != 0)
X`09    (void) delete_object(y, x);
X`09  if (c_ptr->cptr > 1)
X`09    `7B
X`09      /* stop the wall building */
X`09      flag = TRUE;
X`09      m_ptr = &m_list`5Bc_ptr->cptr`5D;
X`09      r_ptr = &c_list`5Bm_ptr->mptr`5D;
X
X#ifdef ATARIST_MWC
X`09      if (!(r_ptr->cmove & (holder = CM_PHASE)))
X#else
X`09      if (!(r_ptr->cmove & CM_PHASE))
X#endif
X`09`09`7B
X`09`09  /* monster does not move, can't escape the wall */
X`09`09  if (r_ptr->cmove & CM_ATTACK_ONLY)
X`09`09    damage = 3000; /* this will kill everything */
X`09`09  else
X`09`09    damage = damroll (4, 8);
X
X`09`09  monster_name (m_name, m_ptr, r_ptr);
X`09`09  (void) sprintf (out_val, "%s wails out in pain!", m_name);
X`09`09  msg_print (out_val);
X`09`09  i = mon_take_hit((int)c_ptr->cptr, damage);
X`09`09  if (i >= 0)
X`09`09    `7B
X`09`09      (void) sprintf (out_val, "%s is embedded in the rock.",
X`09`09`09`09      m_name);
X`09`09      msg_print (out_val);
X`09`09      prt_experience();
X`09`09    `7D
X`09`09`7D
X`09      else if (r_ptr->cchar == 'E' `7C`7C r_ptr->cchar == 'X')
X`09`09`7B
X`09`09  /* must be an earth elemental or an earth spirit, or a Xorn
X`09`09     increase its hit points */
X`09`09  m_ptr->hp += damroll(4, 8);
X`09`09`7D
X`09    `7D
X`09  c_ptr->fval  = MAGMA_WALL;
X`09  c_ptr->fm = FALSE;
X`09  /* Permanently light this wall if it is lit by player's lamp.  */
X`09  c_ptr->pl = (c_ptr->tl `7C`7C c_ptr->pl);
X`09  lite_spot(y, x);
X`09  i++;
X`09  build = TRUE;
X`09`7D
X    `7D
X  while (!flag);
X  return(build);
X`7D
X
X
X/* Replicate a creature`09`09`09`09`09-RAK-`09*/
Xint clone_monster(dir, y, x)
Xint dir, y, x;
X`7B
X  register cave_type *c_ptr;
X  register int dist, flag;
X
X  dist = 0;
X  flag = FALSE;
X  do
X    `7B
X      (void) mmove(dir, &y, &x);
X      dist++;
X      c_ptr = &cave`5By`5D`5Bx`5D;
X      if ((dist > OBJ_BOLT_RANGE) `7C`7C c_ptr->fval >= MIN_CLOSED_SPACE)
X`09flag = TRUE;
X      else if (c_ptr->cptr > 1)
X`09`7B
X`09  m_list`5Bc_ptr->cptr`5D.csleep = 0;
X`09  /* monptr of 0 is safe here, since can't reach here from creatures */
X`09  return multiply_monster(y, x, (int)m_list`5Bc_ptr->cptr`5D.mptr, 0);
X`09`7D
X    `7D
X  while (!flag);
X  return(FALSE);
X`7D
X
X
X/* Move the creature record to a new location`09`09-RAK-`09*/
Xvoid teleport_away(monptr, dis)
Xint monptr, dis;
X`7B
X  register int yn, xn, ctr;
X  register monster_type *m_ptr;
X
X  m_ptr = &m_list`5Bmonptr`5D;
X  ctr = 0;
X  do
X    `7B
X      do
X`09`7B
X`09  yn = m_ptr->fy + (randint(2*dis+1) - (dis + 1));
X`09  xn = m_ptr->fx + (randint(2*dis+1) - (dis + 1));
X`09`7D
X      while (!in_bounds(yn, xn));
X      ctr++;
X      if (ctr > 9)
X`09`7B
X`09  ctr = 0;
X`09  dis += 5;
X`09`7D
X    `7D
X  while ((cave`5Byn`5D`5Bxn`5D.fval >= MIN_CLOSED_SPACE) `7C`7C (cave`5Byn`5
VD`5Bxn`5D.cptr != 0));
X  move_rec((int)m_ptr->fy, (int)m_ptr->fx, yn, xn);
X  lite_spot((int)m_ptr->fy, (int)m_ptr->fx);
X  m_ptr->fy = yn;
X  m_ptr->fx = xn;
X  /* this is necessary, because the creature is not currently visible
X     in its new position */
X  m_ptr->ml = FALSE;
X  m_ptr->cdis = distance (char_row, char_col, yn, xn);
X  update_mon (monptr);
X`7D
X
X
X/* Teleport player to spell casting creature`09`09-RAK-`09*/
Xvoid teleport_to(ny, nx)
Xint ny, nx;
X`7B
X  int dis, ctr, y, x;
X  register int i, j;
X  register cave_type *c_ptr;
X
X  dis = 1;
X  ctr = 0;
X  do
X    `7B
X      y = ny + (randint(2*dis+1) - (dis + 1));
X      x = nx + (randint(2*dis+1) - (dis + 1));
X      ctr++;
X      if (ctr > 9)
X`09`7B
X`09  ctr = 0;
X`09  dis++;
X`09`7D
X    `7D
X  while (!in_bounds(y, x) `7C`7C (cave`5By`5D`5Bx`5D.fval >= MIN_CLOSED_SPAC
VE)
X`09 `7C`7C (cave`5By`5D`5Bx`5D.cptr >= 2));
X  move_rec(char_row, char_col, y, x);
X  for (i = char_row-1; i <= char_row+1; i++)
X    for (j = char_col-1; j <= char_col+1; j++)
X      `7B
X`09c_ptr = &cave`5Bi`5D`5Bj`5D;
X`09c_ptr->tl = FALSE;
X`09lite_spot(i, j);
X      `7D
X  lite_spot(char_row, char_col);
X  char_row = y;
X  char_col = x;
X  check_view();
X  /* light creatures */
X  creatures(FALSE);
X`7D
X
X
X/* Teleport all creatures in a given direction away`09-RAK-`09*/
Xint teleport_monster(dir, y, x)
Xint dir, y, x;
X`7B
X  register int flag, result, dist;
X  register cave_type *c_ptr;
X
X  flag = FALSE;
X  result = FALSE;
X  dist = 0;
X  do
X    `7B
X      (void) mmove(dir, &y, &x);
X      dist++;
X      c_ptr = &cave`5By`5D`5Bx`5D;
X      if ((dist > OBJ_BOLT_RANGE) `7C`7C c_ptr->fval >= MIN_CLOSED_SPACE)
X`09flag = TRUE;
X      else if (c_ptr->cptr > 1)
X`09`7B
X`09  m_list`5Bc_ptr->cptr`5D.csleep = 0; /* wake it up */
X`09  teleport_away((int)c_ptr->cptr, MAX_SIGHT);
X`09  result = TRUE;
X`09`7D
X    `7D
X  while (!flag);
X  return(result);
X`7D
X
X
X/* Delete all creatures within max_sight distance`09-RAK-`09*/
X/* NOTE : Winning creatures cannot be genocided`09`09`09 */
Xint mass_genocide()
X`7B
X  register int i, result;
X  register monster_type *m_ptr;
X  register creature_type *r_ptr;
X#ifdef ATARIST_MWC
X  int32u holder;
X#endif
X
X  result = FALSE;
X  for (i = mfptr - 1; i >= MIN_MONIX; i--)
X    `7B
X      m_ptr = &m_list`5Bi`5D;
X      r_ptr = &c_list`5Bm_ptr->mptr`5D;
X#ifdef ATARIST_MWC
X      if ((m_ptr->cdis <= MAX_SIGHT) &&
X`09  ((r_ptr->cmove & (holder = CM_WIN)) == 0))
X#else
X      if ((m_ptr->cdis <= MAX_SIGHT) && ((r_ptr->cmove & CM_WIN) == 0))
X#endif
X`09`7B
X`09  delete_monster(i);
X`09  result = TRUE;
X`09`7D
X    `7D
X  return(result);
X`7D
X
X/* Delete all creatures of a given type from level.`09-RAK-`09*/
X/* This does not keep creatures of type from appearing later.`09 */
X/* NOTE : Winning creatures can not be genocided. */
Xint genocide()
X`7B
X  register int i, killed;
X  char typ;
X  register monster_type *m_ptr;
X  register creature_type *r_ptr;
X  vtype out_val;
X#ifdef ATARIST_MWC
X  int32u holder;
X#endif
X
X  killed = FALSE;
X  if (get_com("Which type of creature do you wish exterminated?", &typ))
X    for (i = mfptr - 1; i >= MIN_MONIX; i--)
X      `7B
X`09m_ptr = &m_list`5Bi`5D;
X`09r_ptr = &c_list`5Bm_ptr->mptr`5D;
X`09if (typ == c_list`5Bm_ptr->mptr`5D.cchar)
X#ifdef ATARIST_MWC
X`09  if ((r_ptr->cmove & (holder = CM_WIN)) == 0)
X#else
X`09  if ((r_ptr->cmove & CM_WIN) == 0)
X#endif
X`09    `7B
X`09      delete_monster(i);
X`09      killed = TRUE;
X`09    `7D
X`09  else
X`09    `7B
X`09      /* genocide is a powerful spell, so we will let the player
X`09`09 know the names of the creatures he did not destroy,
X`09`09 this message makes no sense otherwise */
X`09      (void) sprintf(out_val, "The %s is unaffected.", r_ptr->name);
X`09      msg_print(out_val);
X`09    `7D
X      `7D
X  return(killed);
X`7D
X
X
X/* Change speed of any creature .`09`09`09-RAK-`09*/
X/* NOTE: cannot slow a winning creature (BALROG)`09`09 */
Xint speed_monsters(spd)
Xint spd;
X`7B
X  register int i, speed;
X  register monster_type *m_ptr;
X  register creature_type *r_ptr;
X  vtype out_val, m_name;
X
X  speed = FALSE;
X  for (i = mfptr - 1; i >= MIN_MONIX; i--)
X    `7B
X      m_ptr = &m_list`5Bi`5D;
X      r_ptr = &c_list`5Bm_ptr->mptr`5D;
X      monster_name (m_name, m_ptr, r_ptr);
X
X      if ((m_ptr->cdis > MAX_SIGHT) `7C`7C
X`09  !los(char_row, char_col, (int)m_ptr->fy, (int)m_ptr->fx))
X`09/* do nothing */
X`09;
X      else if (spd > 0)
X`09`7B
X`09  m_ptr->cspeed += spd;
X`09  m_ptr->csleep = 0;
X`09  if (m_ptr->ml)
X`09    `7B
X`09      speed = TRUE;
X`09      (void) sprintf (out_val, "%s starts moving faster.", m_name);
X`09      msg_print (out_val);
X`09    `7D
X`09`7D
X      else if (randint(MAX_MONS_LEVEL) > r_ptr->level)
X`09`7B
X`09  m_ptr->cspeed += spd;
X`09  m_ptr->csleep = 0;
X`09  if (m_ptr->ml)
X`09    `7B
X`09      (void) sprintf (out_val, "%s starts moving slower.", m_name);
X`09      msg_print (out_val);
X`09      speed = TRUE;
X`09    `7D
X`09`7D
X      else if (m_ptr->ml)
X`09`7B
X`09  m_ptr->csleep = 0;
X`09  (void) sprintf(out_val, "%s is unaffected.", m_name);
X`09  msg_print(out_val);
X`09`7D
X    `7D
X  return(speed);
X`7D
X
X
X/* Sleep any creature .`09`09-RAK-`09*/
Xint sleep_monsters2()
X`7B
X  register int i, sleep;
X  register monster_type *m_ptr;
X  register creature_type *r_ptr;
X  vtype out_val, m_name;
X
X  sleep = FALSE;
X  for (i = mfptr - 1; i >= MIN_MONIX; i--)
X    `7B
X      m_ptr = &m_list`5Bi`5D;
X      r_ptr = &c_list`5Bm_ptr->mptr`5D;
X      monster_name (m_name, m_ptr, r_ptr);
X      if ((m_ptr->cdis > MAX_SIGHT) `7C`7C`20
X`09  !los(char_row, char_col, (int)m_ptr->fy, (int)m_ptr->fx))
X`09/* do nothing */
X`09;
X      else if ((randint(MAX_MONS_LEVEL) < r_ptr->level) `7C`7C
X`09  (CD_NO_SLEEP & r_ptr->cdefense))
X`09`7B
X`09  if (m_ptr->ml)
X`09    `7B
X`09      if (r_ptr->cdefense & CD_NO_SLEEP)
X`09`09c_recall`5Bm_ptr->mptr`5D.r_cdefense `7C= CD_NO_SLEEP;
X`09      (void) sprintf(out_val, "%s is unaffected.", m_name);
X`09      msg_print(out_val);
X`09    `7D
X`09`7D
X      else
X`09`7B
X`09  m_ptr->csleep = 500;
X`09  if (m_ptr->ml)
X`09    `7B
X`09      (void) sprintf(out_val, "%s falls asleep.", m_name);
X`09      msg_print(out_val);
+-+-+-+-+-+-+-+-  END  OF PART 64 +-+-+-+-+-+-+-+-
