-+-+-+-+-+-+-+-+ 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 X#include`09 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 X#endif X#else X#include 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 +-+-+-+-+-+-+-+-