-+-+-+-+-+-+-+-+ START OF PART 63 -+-+-+-+-+-+-+-+
X`09`09`09`09  if (m_ptr->ml)
X`09`09`09`09    c_recall`5Bm_ptr->mptr`5D.r_cdefense `7C=harm_type;
X`09`09`09`09`7D
X`09`09`09      else if (weapon_type & r_ptr->spells)
X`09`09`09`09`7B
X`09`09`09`09  dam = dam / 4;
X`09`09`09`09  if (m_ptr->ml)
X`09`09`09`09    c_recall`5Bm_ptr->mptr`5D.r_spells `7C=weapon_type;
X`09`09`09`09`7D
X`09`09`09      dam = (dam/(distance(i, j, y, x)+1));
X`09`09`09      k = mon_take_hit((int)c_ptr->cptr, dam);
X`09`09`09      if (k >= 0)
X`09`09`09`09tkill++;
X`09`09`09      c_ptr->pl = tmp;
X`09`09`09    `7D
X`09`09`09  else if (panel_contains(i, j) &&(py.flags.blind < 1))
X`09`09`09    print('*', i, j);
X`09`09`09`7D
X`09`09    `7D
X`09      /* show ball of whatever */
X`09      put_qio();
X
X`09      for (i = (y - 2); i <= (y + 2); i++)
X`09`09for (j = (x - 2); j <= (x + 2); j++)
X`09`09  if (in_bounds(i, j) && panel_contains(i, j) &&
X`09`09      (distance(y, x, i, j) <= max_dis))
X`09`09    lite_spot(i, j);
X
X`09      /* End  explosion.`09`09     */
X`09      if (thit == 1)
X`09`09`7B
X`09`09  (void) sprintf(out_val,
X`09`09`09`09 "The %s envelops a creature!",
X`09`09`09`09 descrip);
X`09`09  msg_print(out_val);
X`09`09`7D
X`09      else if (thit > 1)
X`09`09`7B
X`09`09  (void) sprintf(out_val,
X`09`09`09`09 "The %s envelops several creatures!",
X`09`09`09`09 descrip);
X`09`09  msg_print(out_val);
X`09`09`7D
X`09      if (tkill == 1)
X`09`09msg_print("There is a scream of agony!");
X`09      else if (tkill > 1)
X`09`09msg_print("There are several screams of agony!");
X`09      if (tkill >= 0)
X`09`09prt_experience();
X`09      /* End ball hitting.`09`09     */
X`09    `7D
X`09  else if (panel_contains(y, x) && (py.flags.blind < 1))
X`09    `7B
X`09      print('*', y, x);
X`09      /* show bolt */
X`09      put_qio();
X`09    `7D
X`09  oldy = y;
X`09  oldx = x;
X`09`7D
X    `7D
X  while (!flag);
X`7D
X
X
X/* Breath weapon works like a fire_ball, but affects the player. */
X/* Note the area affect.`09`09`09      -RAK-   */
Xvoid breath(typ, y, x, dam_hp, ddesc, monptr)
Xint typ, y, x, dam_hp;
Xchar *ddesc;
Xint monptr;
X`7B
X  register int i, j;
X  int dam, max_dis, harm_type;
X  int32u weapon_type;
X  int32u tmp, treas;
X  int (*destroy)();
X  register cave_type *c_ptr;
X  register monster_type *m_ptr;
X  register creature_type *r_ptr;
X#ifdef ATARIST_MWC
X  int32u holder;
X#endif
X
X  max_dis = 2;
X  get_flags(typ, &weapon_type, &harm_type, &destroy);
X  for (i = y-2; i <= y+2; i++)
X    for (j = x-2; j <= x+2; j++)
X      if (in_bounds(i, j) && (distance(y, x, i, j) <= max_dis)
X`09  && los(y, x, i, j))
X`09`7B
X`09  c_ptr = &cave`5Bi`5D`5Bj`5D;
X`09  if ((c_ptr->tptr != 0) &&
X`09      (*destroy)(&t_list`5Bc_ptr->tptr`5D))
X`09    (void) delete_object(i, j);
X`09  if (c_ptr->fval <= MAX_OPEN_SPACE)
X`09    `7B
X`09      /* must test status bit, not py.flags.blind here, flag could have
X`09`09 been set by a previous monster, but the breath should still
X`09`09 be visible until the blindness takes effect */
X`09      if (panel_contains(i, j) && !(py.flags.status & PY_BLIND))
X`09`09print('*', i, j);
X`09      if (c_ptr->cptr > 1)
X`09`09`7B
X`09`09  m_ptr = &m_list`5Bc_ptr->cptr`5D;
X`09`09  r_ptr = &c_list`5Bm_ptr->mptr`5D;
X`09`09  dam = dam_hp;
X`09`09  if (harm_type & r_ptr->cdefense)
X`09`09    dam = dam*2;
X`09`09  else if (weapon_type & r_ptr->spells)
X`09`09    dam = (dam / 4);
X`09`09  dam = (dam/(distance(i, j, y, x)+1));
X`09`09  /* can not call mon_take_hit here, since player does not
X`09`09     get experience for kill */
X`09`09  m_ptr->hp = m_ptr->hp - dam;
X`09`09  m_ptr->csleep = 0;
X`09`09  if (m_ptr->hp < 0)
X`09`09    `7B
X`09`09      treas = monster_death((int)m_ptr->fy, (int)m_ptr->fx,
X`09`09`09`09`09    r_ptr->cmove);
X`09`09      if (m_ptr->ml)
X`09`09`09`7B
X#ifdef ATARIST_MWC
X`09`09`09  holder = CM_TREASURE;
X`09`09`09  tmp = (c_recall`5Bm_ptr->mptr`5D.r_cmove & holder)
X`09`09`09    >> CM_TR_SHIFT;
X`09`09`09  if (tmp > ((treas & holder) >> CM_TR_SHIFT))
X`09`09`09    treas = (treas & `7Eholder)`7C(tmp << CM_TR_SHIFT);
X`09`09`09  c_recall`5Bm_ptr->mptr`5D.r_cmove = treas `7C
X`09`09`09    (c_recall`5Bm_ptr->mptr`5D.r_cmove & `7Eholder);
X#else
X`09`09`09  tmp = (c_recall`5Bm_ptr->mptr`5D.r_cmove & CM_TREASURE)
X`09`09`09    >> CM_TR_SHIFT;
X`09`09`09  if (tmp > ((treas & CM_TREASURE) >> CM_TR_SHIFT))
X`09`09`09    treas = (treas & `7ECM_TREASURE)`7C(tmp<<CM_TR_SHIFT);
X`09`09`09  c_recall`5Bm_ptr->mptr`5D.r_cmove = treas `7C
X`09`09`09    (c_recall`5Bm_ptr->mptr`5D.r_cmove & `7ECM_TREASURE);
X#endif
X`09`09`09`7D
X
X`09`09      /* It ate an already processed monster.Handle normally.*/
X`09`09      if (monptr < c_ptr->cptr)
X`09`09`09delete_monster((int) c_ptr->cptr);
X`09`09      /* If it eats this monster, an already processed monster
X`09`09`09 will take its place, causing all kinds of havoc.
X`09`09`09 Delay the kill a bit. */
X`09`09      else
X`09`09`09fix1_delete_monster((int) c_ptr->cptr);
X`09`09    `7D
X`09`09`7D
X`09      else if (c_ptr->cptr == 1)
X`09`09`7B
X`09`09  dam = (dam_hp/(distance(i, j, y, x)+1));
X`09`09  /* let's do at least one point of damage */
X`09`09  /* prevents randint(0) problem with poison_gas, also */
X`09`09  if (dam == 0)
X`09`09    dam = 1;
X`09`09  switch(typ)
X`09`09    `7B
X`09`09    case GF_LIGHTNING: light_dam(dam, ddesc); break;
X`09`09    case GF_POISON_GAS: poison_gas(dam, ddesc); break;
X`09`09    case GF_ACID: acid_dam(dam, ddesc); break;
X`09`09    case GF_FROST: cold_dam(dam, ddesc); break;
X`09`09    case GF_FIRE: fire_dam(dam, ddesc); break;
X`09`09    `7D
X`09`09`7D
X`09    `7D
X`09`7D
X  /* show the ball of gas */
X  put_qio();
X
X  for (i = (y - 2); i <= (y + 2); i++)
X    for (j = (x - 2); j <= (x + 2); j++)
X      if (in_bounds(i, j) && panel_contains(i, j) &&
X`09  (distance(y, x, i, j) <= max_dis))
X`09lite_spot(i, j);
X`7D
X
X
X/* Recharge a wand, staff, or rod.  Sometimes the item breaks. -RAK-*/
Xint recharge(num)
Xregister int num;
X`7B
X  int i, j, item_val;
X  register int res;
X  register inven_type *i_ptr;
X
X  res = FALSE;
X  if (!find_range(TV_STAFF, TV_WAND, &i, &j))
X    msg_print("You have nothing to recharge.");
X  else if (get_item(&item_val, "Recharge which item?", i, j, CNIL, CNIL))
X    `7B
X      i_ptr = &inventory`5Bitem_val`5D;
X      res = TRUE;
X      /* recharge I = recharge(20) = 1/6 failure for empty 10th level wand *
V/
X      /* recharge II = recharge(60) = 1/10 failure for empty 10th level wand
V*/
X      /* make it harder to recharge high level, and highly charged wands, no
Vte
X`09 that i can be negative, so check its value before trying to call
X`09 randint().  */
X      i = num + 50 - (int)i_ptr->level - i_ptr->p1;
X      if (i < 19)
X`09i = 1;`09/* Automatic failure.  */
X      else
X`09i = randint (i/10);
X
X      if (i == 1)
X`09`7B
X`09  msg_print("There is a bright flash of light.");
X`09  inven_destroy(item_val);
X`09`7D
X      else
X`09`7B
X`09  num = (num/(i_ptr->level+2)) + 1;
X`09  i_ptr->p1 += 2 + randint(num);
X`09  if (known2_p(i_ptr))
X`09    clear_known2(i_ptr);
X`09  clear_empty(i_ptr);
X`09`7D
X    `7D
X  return(res);
X`7D
X
X
X/* Increase or decrease a creatures hit points`09`09-RAK-`09*/
Xint hp_monster(dir, y, x, dam)
Xint dir, y, x, dam;
X`7B
X  register int i;
X  int flag, dist, monster;
X  register cave_type *c_ptr;
X  register monster_type *m_ptr;
X  register creature_type *r_ptr;
X  vtype out_val, m_name;
X
X  monster = 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  flag = TRUE;
X`09  m_ptr = &m_list`5Bc_ptr->cptr`5D;
X`09  r_ptr = &c_list`5Bm_ptr->mptr`5D;
X`09  monster_name (m_name, m_ptr, r_ptr);
X`09  monster = TRUE;
X`09  i = mon_take_hit((int)c_ptr->cptr, dam);
X`09  if (i >= 0)
X`09    `7B
X`09      (void) sprintf(out_val, "%s dies in a fit of agony.", m_name);
X`09      msg_print(out_val);
X`09      prt_experience();
X`09    `7D
X`09  else if (dam > 0)
X`09    `7B
X`09      (void) sprintf(out_val, "%s screams in agony.", m_name);
X`09      msg_print(out_val);
X`09    `7D
X`09`7D
X    `7D
X  while (!flag);
X  return(monster);
X`7D
X
X
X/* Drains life; note it must be living.`09`09-RAK-`09*/
Xint drain_life(dir, y, x)
Xint dir, y, x;
X`7B
X  register int i;
X  int flag, dist, drain;
X  register cave_type *c_ptr;
X  register monster_type *m_ptr;
X  register creature_type *r_ptr;
X  vtype out_val, m_name;
X
X  drain = 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  flag = TRUE;
X`09  m_ptr = &m_list`5Bc_ptr->cptr`5D;
X`09  r_ptr = &c_list`5Bm_ptr->mptr`5D;
X`09  if ((r_ptr->cdefense & CD_UNDEAD) == 0)
X`09    `7B
X`09      drain = TRUE;
X`09      monster_name (m_name, m_ptr, r_ptr);
X`09      i = mon_take_hit((int)c_ptr->cptr, 75);
X`09      if (i >= 0)
X`09`09`7B
X`09`09  (void) sprintf(out_val, "%s dies in a fit of agony.",m_name);
X`09`09  msg_print(out_val);
X`09`09  prt_experience();
X`09`09`7D
X`09      else
X`09`09`7B
X`09`09  (void) sprintf(out_val, "%s screams in agony.", m_name);
X`09`09  msg_print(out_val);
X`09`09`7D
X`09    `7D
X`09  else
X`09    c_recall`5Bm_ptr->mptr`5D.r_cdefense `7C= CD_UNDEAD;
X`09`7D
X    `7D
X  while (!flag);
X  return(drain);
X`7D
X
X
X/* Increase or decrease a creatures speed`09`09-RAK-`09*/
X/* NOTE: cannot slow a winning creature (BALROG)`09`09 */
Xint speed_monster(dir, y, x, spd)
Xint dir, y, x, spd;
X`7B
X  int flag, dist, speed;
X  register cave_type *c_ptr;
X  register monster_type *m_ptr;
X  register creature_type *r_ptr;
X  vtype out_val, m_name;
X
X  speed = 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  flag = TRUE;
X`09  m_ptr = &m_list`5Bc_ptr->cptr`5D;
X`09  r_ptr = &c_list`5Bm_ptr->mptr`5D;
X`09  monster_name (m_name, m_ptr, r_ptr);
X`09  if (spd > 0)
X`09    `7B
X`09      m_ptr->cspeed += spd;
X`09      m_ptr->csleep = 0;
X`09      (void) sprintf (out_val, "%s starts moving faster.", m_name);
X`09      msg_print (out_val);
X`09      speed = TRUE;
X`09    `7D
X`09  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      (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  else
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`09`7D
X    `7D
X  while (!flag);
X  return(speed);
X`7D
X
X
X/* Confuse a creature`09`09`09`09`09-RAK-`09*/
Xint confuse_monster(dir, y, x)
Xint dir, y, x;
X`7B
X  int flag, dist, confuse;
X  register cave_type *c_ptr;
X  register monster_type *m_ptr;
X  register creature_type *r_ptr;
X  vtype out_val, m_name;
X
X  confuse = 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  monster_name (m_name, m_ptr, r_ptr);
X`09  flag = TRUE;
X`09  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 && (r_ptr->cdefense & CD_NO_SLEEP))
X`09`09c_recall`5Bm_ptr->mptr`5D.r_cdefense `7C= CD_NO_SLEEP;
X`09      /* Monsters which resisted the attack should wake up.
X`09`09 Monsters with inane resistence ignore the attack.  */
X`09      if (! (CD_NO_SLEEP & r_ptr->cdefense))
X`09`09m_ptr->csleep = 0;
X`09      (void) sprintf(out_val, "%s is unaffected.", m_name);
X`09      msg_print(out_val);
X`09    `7D
X`09  else
X`09    `7B
X`09      m_ptr->confused = TRUE;
X`09      confuse = TRUE;
X`09      m_ptr->csleep = 0;
X`09      (void) sprintf(out_val, "%s appears confused.", m_name);
X`09      msg_print(out_val);
X`09    `7D
X`09`7D
X    `7D
X  while (!flag);
X  return(confuse);
X`7D
X
X
X/* Sleep a creature.`09`09`09`09`09-RAK-`09*/
Xint sleep_monster(dir, y, x)
Xint dir, y, x;
X`7B
X  int flag, dist, sleep;
X  register cave_type *c_ptr;
X  register monster_type *m_ptr;
X  register creature_type *r_ptr;
X  vtype out_val, m_name;
X
X  sleep = 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  flag = TRUE;
X`09  monster_name (m_name, m_ptr, r_ptr);
X`09  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 && (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  else
X`09    `7B
X`09      m_ptr->csleep = 500;
X`09      sleep = TRUE;
X`09      (void) sprintf(out_val, "%s falls asleep.", m_name);
X`09      msg_print(out_val);
X`09    `7D
X`09`7D
X    `7D
X  while (!flag);
X  return(sleep);
X`7D
X
X
X/* Turn stone to mud, delete wall.`09`09`09-RAK-`09*/
Xint wall_to_mud(dir, y, x)
Xint dir, y, x;
X`7B
X  int i, wall, dist;
X  bigvtype out_val, tmp_str;
X  register int flag;
X  register cave_type *c_ptr;
X  register monster_type *m_ptr;
X  register creature_type *r_ptr;
X  vtype m_name;
X
X  wall = FALSE;
X  flag = FALSE;
X  dist = 0;
X  do
X    `7B
+-+-+-+-+-+-+-+-  END  OF PART 63 +-+-+-+-+-+-+-+-
