-+-+-+-+-+-+-+-+ START OF PART 61 -+-+-+-+-+-+-+-+
X      if (!save_char())
X`09`7B
X`09  (void) strcpy(died_from, "software bug");
X`09  death = TRUE;
X`09  turn = -1;
X`09`7D
X    `7D
X  else
X    `7B
X      death = TRUE;
X      (void) _save_char(savefile);`09/* Quietly save the memory anyway. */
X    `7D
X  restore_term();
X#if !defined(MSDOS) && !defined(AMIGA) && !defined(ATARIST_TC)
X  /* always generate a core dump */
X  (void) signal(sig, SIG_DFL);
X  (void) kill(getpid(), sig);
X  (void) sleep(5);
X#endif
X  exit(1);
X`7D
X
X#endif /* ATARIST_MWC, ATARIST_TC */
X
X#ifndef USG
Xstatic int mask;
X#endif
X
Xvoid nosignals()
X`7B
X#if !defined(ATARIST_MWC) && !defined(ATARIST_TC)
X#ifdef SIGTSTP
X#if defined(atarist) && defined(__GNUC__)
X  (void) signal(SIGTSTP, (__Sigfunc)SIG_IGN);
X#else
X  (void) signal(SIGTSTP, SIG_IGN);
X#endif
X#ifndef USG
X  mask = sigsetmask(0);
X#endif
X#endif
X  if (error_sig < 0)
X    error_sig = 0;
X#endif
X`7D
X
Xvoid signals()
X`7B
X#if !defined(ATARIST_MWC) && !defined(ATARIST_TC)
X#ifdef SIGTSTP
X#if defined(atarist) && defined(__GNUC__)
X  (void) signal(SIGTSTP, (__Sigfunc)suspend);
X#else
X  (void) signal(SIGTSTP, suspend);
X#endif
X#ifndef USG
X  (void) sigsetmask(mask);
X#endif
X#endif
X  if (error_sig == 0)
X    error_sig = -1;
X#endif
X`7D
X
X
Xvoid init_signals()
X`7B
X#if !defined(ATARIST_MWC) && !defined(ATARIST_TC)
X  /* No signals for Atari ST compiled with MWC or TC.  */
X  (void) signal(SIGINT, signal_handler);
X
X#if defined(atarist) && defined(__GNUC__)
X  /* Atari ST compiled with GNUC has most signals, but we need a cast
X     in every call to signal.  */
X  (void) signal(SIGINT, (__Sigfunc)signal_handler);
X  (void) signal(SIGQUIT, (__Sigfunc)signal_handler);
X  (void) signal(SIGTSTP,(__Sigfunc)SIG_IGN);
X  (void) signal(SIGILL, (__Sigfunc)signal_handler);
X  (void) signal(SIGHUP, (__Sigfunc)SIG_IGN);
X  (void) signal(SIGTRAP,(__Sigfunc)signal_handler);
X  (void) signal(SIGIOT, (__Sigfunc)signal_handler);
X  (void) signal(SIGEMT, (__Sigfunc)signal_handler);
X  (void) signal(SIGKILL, (__Sigfunc)signal_handler);
X  (void) signal(SIGBUS, (__Sigfunc)signal_handler);
X  (void) signal(SIGSEGV, (__Sigfunc)signal_handler);
X  (void) signal(SIGSYS, (__Sigfunc)signal_handler);
X  (void) signal(SIGTERM,(__Sigfunc)signal_handler);
X  (void) signal(SIGPIPE, (__Sigfunc)signal_handler);
X
X#else
X  /* Everybody except the atari st.  */
X  (void) signal(SIGINT, signal_handler);
X  (void) signal(SIGFPE, signal_handler);
X
X#if defined(MSDOS)
X  /* many fewer signals under MSDOS */
X#else
X
X#ifdef AMIGA
X/*  (void) signal(SIGINT, signal_handler); */
X  (void) signal(SIGTERM, signal_handler);
X  (void) signal(SIGABRT, signal_handler);
X/*  (void) signal(SIGFPE, signal_handler); */
X  (void) signal(SIGILL, signal_handler);
X  (void) signal(SIGSEGV, signal_handler);
X
X#else
X
X  /* Everybody except Atari, MSDOS, and Amiga.  */
X  /* Ignore HANGUP, and let the EOF code take care of this case. */
X  (void) signal(SIGHUP, SIG_IGN);
X  (void) signal(SIGQUIT, signal_handler);
X  (void) signal(SIGILL, signal_handler);
X  (void) signal(SIGTRAP, signal_handler);
X  (void) signal(SIGIOT, signal_handler);
X#ifdef SIGEMT  /* in BSD systems */
X  (void) signal(SIGEMT, signal_handler);
X#endif
X#ifdef SIGDANGER /* in SYSV systems */
X  (void) signal(SIGDANGER, signal_handler);
X#endif
X  (void) signal(SIGKILL, signal_handler);
X  (void) signal(SIGBUS, signal_handler);
X  (void) signal(SIGSEGV, signal_handler);
X  (void) signal(SIGSYS, signal_handler);
X  (void) signal(SIGTERM, signal_handler);
X  (void) signal(SIGPIPE, signal_handler);
X#ifdef SIGXCPU`09/* BSD */
X  (void) signal(SIGXCPU, signal_handler);
X#endif
X#ifdef SIGPWR /* SYSV */
X  (void) signal(SIGPWR, signal_handler);
X#endif
X#endif
X#endif
X#endif
X#endif
X`7D
X
Xvoid ignore_signals()
X`7B
X#if !defined(ATARIST_MWC)
X  (void) signal(SIGINT, SIG_IGN);
X#ifdef SIGQUIT
X  (void) signal(SIGQUIT, SIG_IGN);
X#endif
X#endif
X`7D
X
Xvoid default_signals()
X`7B
X#if !defined(ATARIST_MWC)
X  (void) signal(SIGINT, SIG_DFL);
X#ifdef SIGQUIT
X  (void) signal(SIGQUIT, SIG_DFL);
X#endif
X#endif
X`7D
X
Xvoid restore_signals()
X`7B
X#if !defined(ATARIST_MWC)
X#if defined(atarist) && defined(__GNUC__)
X  (void) signal(SIGINT, (__Sigfunc)signal_handler);
X#else
X  (void) signal(SIGINT, signal_handler);
X#endif
X#ifdef SIGQUIT
X#if defined(atarist) && defined(__GNUC__)
X  (void) signal(SIGQUIT, (__Sigfunc)signal_handler);
X#else
X  (void) signal(SIGQUIT, signal_handler);
X#endif
X#endif
X#endif
X`7D
X
X#endif /* big Mac conditional */
$ CALL UNPACK SIGNALS.C;1 318812014
$ create 'f'
X/* source/spells.c: player/creature spells, breaths, wands, scrolls, etc. co
Vde
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#include`09<stdlib.h>
X#endif /* __TURBOC__ */
X`20
X#include "config.h"
X#include "constant.h"
X#include "types.h"
X#include "externs.h"
X
X#ifdef USG
X#ifndef ATARIST_MWC
X#include <string.h>
X#endif
X#else
X#include <strings.h>
X#endif
X
X#if defined(LINT_ARGS)
Xstatic void replace_spot(int, int, int);
X#else
Xstatic void replace_spot();
X#endif
X
X/* Following are spell procedure/functions`09`09`09-RAK-`09*/
X/* These routines are commonly used in the scroll, potion, wands, and`09 */
X/* staves routines, and are occasionally called from other areas.`09  */
X/* Now included are creature spells also.`09`09       -RAK    */
X
Xvoid monster_name (m_name, m_ptr, r_ptr)
Xchar *m_name;
Xmonster_type *m_ptr;
Xcreature_type *r_ptr;
X`7B
X  if (!m_ptr->ml)
X    (void) strcpy (m_name, "It");
X  else
X    (void) sprintf (m_name, "The %s", r_ptr->name);
X`7D
X
Xvoid lower_monster_name (m_name, m_ptr, r_ptr)
Xchar *m_name;
Xmonster_type *m_ptr;
Xcreature_type *r_ptr;
X`7B
X  if (!m_ptr->ml)
X    (void) strcpy (m_name, "it");
X  else
X    (void) sprintf (m_name, "the %s", r_ptr->name);
X`7D
X
X/* Sleep creatures adjacent to player`09`09`09-RAK-`09*/
Xint sleep_monsters1(y, x)
Xint y, x;
X`7B
X  register int i, j;
X  register cave_type *c_ptr;
X  register monster_type *m_ptr;
X  register creature_type *r_ptr;
X  int sleep;
X  vtype out_val, m_name;
X
X  sleep = FALSE;
X  for (i = y-1; i <= y+1; i++)
X    for (j = x-1; j <= x+1; j++)
X      `7B
X`09c_ptr = &cave`5Bi`5D`5Bj`5D;
X`09if (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
X`09    monster_name (m_name, m_ptr, r_ptr);
X`09    if ((randint(MAX_MONS_LEVEL) < r_ptr->level) `7C`7C
X`09`09(CD_NO_SLEEP & r_ptr->cdefense))
X`09      `7B
X`09`09if (m_ptr->ml && (r_ptr->cdefense & CD_NO_SLEEP))
X`09`09  c_recall`5Bm_ptr->mptr`5D.r_cdefense `7C= CD_NO_SLEEP;
X`09`09(void) sprintf(out_val, "%s is unaffected.", m_name);
X`09`09msg_print(out_val);
X`09      `7D
X`09    else
X`09      `7B
X`09`09sleep = TRUE;
X`09`09m_ptr->csleep = 500;
X`09`09(void) sprintf(out_val, "%s falls asleep.", m_name);
X`09`09msg_print(out_val);
X`09      `7D
X`09  `7D
X      `7D
X  return(sleep);
X`7D
X
X/* Detect any treasure on the current panel`09`09-RAK-`09*/
Xint detect_treasure()
X`7B
X  register int i, j, detect;
X  register cave_type *c_ptr;
X
X  detect = FALSE;
X  for (i = panel_row_min; i <= panel_row_max; i++)
X    for (j = panel_col_min; j <= panel_col_max; j++)
X      `7B
X`09c_ptr = &cave`5Bi`5D`5Bj`5D;
X`09if ((c_ptr->tptr != 0) && (t_list`5Bc_ptr->tptr`5D.tval == TV_GOLD) &&
X`09    !test_light(i, j))
X`09  `7B
X`09    c_ptr->fm = TRUE;
X`09    lite_spot(i, j);
X`09    detect = TRUE;
X`09  `7D
X      `7D
X  return(detect);
X`7D
X
X
X/* Detect all objects on the current panel`09`09-RAK-`09*/
Xint detect_object()
X`7B
X  register int i, j, detect;
X  register cave_type *c_ptr;
X
X  detect = FALSE;
X  for (i = panel_row_min; i <= panel_row_max; i++)
X    for (j = panel_col_min; j <= panel_col_max; j++)
X      `7B
X`09c_ptr = &cave`5Bi`5D`5Bj`5D;
X`09if ((c_ptr->tptr != 0) && (t_list`5Bc_ptr->tptr`5D.tval < TV_MAX_OBJECT)
X`09    && !test_light(i, j))
X`09  `7B
X`09    c_ptr->fm = TRUE;
X`09    lite_spot(i, j);
X`09    detect = TRUE;
X`09  `7D
X      `7D
X  return(detect);
X`7D
X
X
X/* Locates and displays traps on current panel`09`09-RAK-`09*/
Xint detect_trap()
X`7B
X  register int i, j;
X  int detect;
X  register cave_type *c_ptr;
X  register inven_type *t_ptr;
X
X  detect = FALSE;
X  for (i = panel_row_min; i <= panel_row_max; i++)
X    for (j = panel_col_min; j <= panel_col_max; j++)
X      `7B
X`09c_ptr = &cave`5Bi`5D`5Bj`5D;
X`09if (c_ptr->tptr != 0)
X`09  if (t_list`5Bc_ptr->tptr`5D.tval == TV_INVIS_TRAP)
X`09    `7B
X`09      c_ptr->fm = TRUE;
X`09      change_trap(i, j);
X`09      detect = TRUE;
X`09    `7D
X`09  else if (t_list`5Bc_ptr->tptr`5D.tval == TV_CHEST)
X`09    `7B
X`09      t_ptr = &t_list`5Bc_ptr->tptr`5D;
X`09      known2(t_ptr);
X`09    `7D
X      `7D
X  return(detect);
X`7D
X
X
X/* Locates and displays all secret doors on current panel -RAK-`09*/
Xint detect_sdoor()
X`7B
X  register int i, j, detect;
X  register cave_type *c_ptr;
X
X  detect = FALSE;
X  for (i = panel_row_min; i <= panel_row_max; i++)
X    for (j = panel_col_min; j <= panel_col_max; j++)
X      `7B
X`09c_ptr = &cave`5Bi`5D`5Bj`5D;
X`09if (c_ptr->tptr != 0)
X`09  /* Secret doors  */
X`09  if (t_list`5Bc_ptr->tptr`5D.tval == TV_SECRET_DOOR)
X`09    `7B
X`09      c_ptr->fm = TRUE;
X`09      change_trap(i, j);
X`09      detect = TRUE;
X`09    `7D
X`09/* Staircases`09 */
X`09  else if (((t_list`5Bc_ptr->tptr`5D.tval == TV_UP_STAIR) `7C`7C
X`09`09    (t_list`5Bc_ptr->tptr`5D.tval == TV_DOWN_STAIR)) &&
X`09`09   !c_ptr->fm)
X`09    `7B
X`09      c_ptr->fm = TRUE;
X`09      lite_spot(i, j);
X`09      detect = TRUE;
X`09    `7D
X      `7D
X  return(detect);
X`7D
X
X
X/* Locates and displays all invisible creatures on current panel -RAK-*/
Xint detect_invisible()
X`7B
X  register int i, flag;
X  register monster_type *m_ptr;
X#ifdef ATARIST_MWC
X  int32u holder;
X#endif
X
X  flag = FALSE;
X  for (i = mfptr - 1; i >= MIN_MONIX; i--)
X    `7B
X      m_ptr = &m_list`5Bi`5D;
X      if (panel_contains((int)m_ptr->fy, (int)m_ptr->fx) &&
X#ifdef ATARIST_MWC
X`09  ((holder = CM_INVISIBLE) & c_list`5Bm_ptr->mptr`5D.cmove))
X#else
X`09  (CM_INVISIBLE & c_list`5Bm_ptr->mptr`5D.cmove))
X#endif
X`09`7B
X`09  m_ptr->ml = TRUE;
X`09  /* works correctly even if hallucinating */
X`09  print((char)c_list`5Bm_ptr->mptr`5D.cchar, (int)m_ptr->fy,
X`09`09(int)m_ptr->fx);
X`09  flag = TRUE;
X`09`7D
X    `7D
X  if (flag)
X    `7B
X      msg_print("You sense the presence of invisible creatures!");
X      msg_print(CNIL);
X      /* must unlight every monster just lighted */
X      creatures(FALSE);
X    `7D
X  return(flag);
X`7D
X
X
X/* Light an area: 1.  If corridor  light immediate area -RAK-*/
X/*`09`09  2.  If room  light entire room plus immediate area.     */
Xint light_area(y, x)
Xregister int y, x;
X`7B
X  register int i, j, light;
X
X  if (py.flags.blind < 1)
X    msg_print("You are surrounded by a white light.");
X  light = TRUE;
X  if (cave`5By`5D`5Bx`5D.lr && (dun_level > 0))
X    light_room(y, x);
X  /* Must always light immediate area, because one might be standing on
X     the edge of a room, or next to a destroyed area, etc.  */
X  for (i = y-1; i <= y+1; i++)
X    for (j = x-1; j <=  x+1; j++)
X      `7B
X`09cave`5Bi`5D`5Bj`5D.pl = TRUE;
X`09lite_spot(i, j);
X      `7D
X  return(light);
X`7D
X
X
X/* Darken an area, opposite of light area`09`09-RAK-`09*/
Xint unlight_area(y, x)
Xint y, x;
X`7B
X  register int i, j;
X  int tmp1, tmp2, unlight;
X  int start_row, start_col, end_row, end_col;
X  register cave_type *c_ptr;
X
X  unlight = FALSE;
X  if (cave`5By`5D`5Bx`5D.lr && (dun_level > 0))
X    `7B
X      tmp1 = (SCREEN_HEIGHT/2);
X      tmp2 = (SCREEN_WIDTH /2);
X      start_row = (y/tmp1)*tmp1 + 1;
X      start_col = (x/tmp2)*tmp2 + 1;
X      end_row = start_row + tmp1 - 1;
X      end_col = start_col + tmp2 - 1;
X      for (i = start_row; i <= end_row; i++)
X`09`7B
X`09  for (j = start_col; j <= end_col; j++)
X`09    `7B
X`09      c_ptr = &cave`5Bi`5D`5Bj`5D;
X`09      if (c_ptr->lr && c_ptr->fval <= MAX_CAVE_FLOOR)
X`09`09`7B
X`09`09  c_ptr->pl = FALSE;
X`09`09  c_ptr->fval = DARK_FLOOR;
X`09`09  lite_spot (i, j);
X`09`09  if (!test_light(i, j))
X`09`09    unlight = TRUE;
X`09`09`7D
X`09    `7D
X`09`7D
X    `7D
X  else
X    for (i = y-1; i <= y+1; i++)
X      for (j = x-1; j <= x+1; j++)
X`09`7B
X`09  c_ptr = &cave`5Bi`5D`5Bj`5D;
X`09  if ((c_ptr->fval == CORR_FLOOR) && c_ptr->pl)
X`09    `7B
X`09      /* pl could have been set by star-lite wand, etc */
X`09      c_ptr->pl = FALSE;
X`09      unlight = TRUE;
X`09    `7D
X`09`7D
X
X  if (unlight && py.flags.blind <= 0)
X    msg_print("Darkness surrounds you.");
X
X  return(unlight);
X`7D
X
X
X/* Map the current area plus some`09`09`09-RAK-`09*/
Xvoid map_area()
X`7B
X  register cave_type *c_ptr;
X  register int i7, i8, n, m;
X  int i, j, k, l;
X
X  i = panel_row_min - randint(10);
X  j = panel_row_max + randint(10);
X  k = panel_col_min - randint(20);
X  l = panel_col_max + randint(20);
X  for (m = i; m <= j; m++)
X    for (n = k; n <= l; n++)
X      if (in_bounds(m, n) && (cave`5Bm`5D`5Bn`5D.fval <= MAX_CAVE_FLOOR))
X`09for (i7 = m-1; i7 <= m+1; i7++)
X`09  for (i8 = n-1; i8 <= n+1; i8++)
X`09    `7B
X`09      c_ptr = &cave`5Bi7`5D`5Bi8`5D;
X`09      if (c_ptr->fval >= MIN_CAVE_WALL)
X`09`09c_ptr->pl = TRUE;
X`09      else if ((c_ptr->tptr != 0) &&
X`09`09       (t_list`5Bc_ptr->tptr`5D.tval >= TV_MIN_VISIBLE) &&
X`09`09       (t_list`5Bc_ptr->tptr`5D.tval <= TV_MAX_VISIBLE))
X`09`09c_ptr->fm = TRUE;
X`09    `7D
X  prt_map();
X`7D
X
X
X/* Identify an object`09`09`09`09`09-RAK-`09*/
Xint ident_spell()
X`7B
X  int item_val;
X  bigvtype out_val, tmp_str;
X  register int ident;
X  register inven_type *i_ptr;
X
X  ident = FALSE;
X  if (get_item(&item_val, "Item you wish identified?", 0, INVEN_ARRAY_SIZE,
X`09       CNIL, CNIL))
X    `7B
+-+-+-+-+-+-+-+-  END  OF PART 61 +-+-+-+-+-+-+-+-
