-+-+-+-+-+-+-+-+ START OF PART 65 -+-+-+-+-+-+-+-+ X`09 sleep = TRUE; X`09 `7D X`09`7D X `7D X return(sleep); X`7D X X X/* Polymorph any creature that player can see.`09-RAK-`09*/ X/* NOTE: cannot polymorph a winning creature (BALROG)`09`09 */ Xint mass_poly() X`7B X register int i; X int y, x, mass; X register monster_type *m_ptr; X register creature_type *r_ptr; X#ifdef ATARIST_MWC X int32u holder; X#endif X X mass = FALSE; X for (i = mfptr - 1; i >= MIN_MONIX; i--) X `7B X m_ptr = &m_list`5Bi`5D; X if (m_ptr->cdis <= MAX_SIGHT) X`09`7B X`09 r_ptr = &c_list`5Bm_ptr->mptr`5D; 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 y = m_ptr->fy; X`09 x = m_ptr->fx; X`09 delete_monster(i); X`09 /* Place_monster() should always return TRUE here. */ X`09 mass = 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 `7D X`09`7D X `7D X return(mass); X`7D X X X/* Display evil creatures on current panel`09`09-RAK-`09*/ Xint detect_evil() X`7B X register int i, flag; X register monster_type *m_ptr; 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`09 (CD_EVIL & c_list`5Bm_ptr->mptr`5D.cdefense)) 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 evil!"); X msg_print(CNIL); X /* must unlight every monster just lighted */ X creatures(FALSE); X `7D X return(flag); X`7D X X X/* Change players hit points in some manner`09`09-RAK-`09*/ Xint hp_player(num) Xint num; X`7B X register int res; X register struct misc *m_ptr; X X res = FALSE; X m_ptr = &py.misc; X if (m_ptr->chp < m_ptr->mhp) X `7B X m_ptr->chp += num; X if (m_ptr->chp > m_ptr->mhp) X`09`7B X`09 m_ptr->chp = m_ptr->mhp; X`09 m_ptr->chp_frac = 0; X`09`7D X prt_chp(); X X num = num / 5; X if (num < 3) `7B X`09if (num == 0) msg_print("You feel a little better."); X`09else`09 msg_print("You feel better."); X `7D else `7B X`09if (num < 7) msg_print("You feel much better."); X`09else`09 msg_print("You feel very good."); X `7D X res = TRUE; X `7D X return(res); X`7D X X X/* Cure players confusion`09`09`09`09-RAK-`09*/ Xint cure_confusion() X`7B X register int cure; X register struct flags *f_ptr; X X cure = FALSE; X f_ptr = &py.flags; X if (f_ptr->confused > 1) X `7B X f_ptr->confused = 1; X cure = TRUE; X `7D X return(cure); X`7D X X X/* Cure players blindness`09`09`09`09-RAK-`09*/ Xint cure_blindness() X`7B X register int cure; X register struct flags *f_ptr; X X cure = FALSE; X f_ptr = &py.flags; X if (f_ptr->blind > 1) X `7B X f_ptr->blind = 1; X cure = TRUE; X `7D X return(cure); X`7D X X X/* Cure poisoning`09`09`09`09`09-RAK-`09*/ Xint cure_poison() X`7B X register int cure; X register struct flags *f_ptr; X X cure = FALSE; X f_ptr = &py.flags; X if (f_ptr->poisoned > 1) X `7B X f_ptr->poisoned = 1; X cure = TRUE; X `7D X return(cure); X`7D X X X/* Cure the players fear`09`09`09`09-RAK-`09*/ Xint remove_fear() X`7B X register int result; X register struct flags *f_ptr; X X result = FALSE; X f_ptr = &py.flags; X if (f_ptr->afraid > 1) X `7B X f_ptr->afraid = 1; X result = TRUE; X `7D X return(result); X`7D X X X/* This is a fun one. In a given block, pick some walls and`09*/ X/* turn them into open spots. Pick some open spots and turn`09 */ X/* them into walls. An "Earthquake" effect.`09 -RAK- */ Xvoid earthquake() 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 damage, tmp; X vtype out_val, m_name; X#ifdef ATARIST_MWC X int32u holder; X#endif X X for (i = char_row-8; i <= char_row+8; i++) X for (j = char_col-8; j <= char_col+8; j++) X if (((i != char_row) `7C`7C (j != char_col)) && X`09 in_bounds(i, j) && (randint(8) == 1)) X`09`7B X`09 c_ptr = &cave`5Bi`5D`5Bj`5D; X`09 if (c_ptr->tptr != 0) X`09 (void) delete_object(i, j); X`09 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 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 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 X`09 if ((c_ptr->fval >= MIN_CAVE_WALL) && (c_ptr->fval != BOUNDARY_WALL)) X`09 `7B X`09 c_ptr->fval = CORR_FLOOR; X`09 c_ptr->pl = FALSE; X`09 c_ptr->fm = FALSE; X`09 `7D X`09 else if (c_ptr->fval <= MAX_CAVE_FLOOR) X`09 `7B X`09 tmp = randint(10); X`09 if (tmp < 6) X`09`09c_ptr->fval = QUARTZ_WALL; X`09 else if (tmp < 9) X`09`09c_ptr->fval = MAGMA_WALL; X`09 else X`09`09c_ptr->fval = GRANITE_WALL; X X`09 c_ptr->fm = FALSE; X`09 `7D X`09 lite_spot(i, j); X`09`7D X`7D X X X/* Evil creatures don't like this.`09`09 -RAK- */ Xint protect_evil() X`7B X register int res; X register struct flags *f_ptr; X X f_ptr = &py.flags; X if (f_ptr->protevil == 0) X res = TRUE; X else X res = FALSE; X f_ptr->protevil += randint(25) + 3*py.misc.lev; X return(res); X`7D X X X/* Create some high quality mush for the player.`09-RAK-`09*/ Xvoid create_food() X`7B X register cave_type *c_ptr; X X c_ptr = &cave`5Bchar_row`5D`5Bchar_col`5D; X if (c_ptr->tptr != 0) X `7B X /* take no action here, don't want to destroy object under player */ X msg_print ("There is already an object under you."); X /* set free_turn_flag so that scroll/spell points won't be used */ X free_turn_flag = TRUE; X `7D X else X `7B X place_object(char_row, char_col); X invcopy(&t_list`5Bc_ptr->tptr`5D, OBJ_MUSH); X `7D X`7D X X X/* Attempts to destroy a type of creature. Success depends on`09*/ X/* the creatures level VS. the player's level`09`09 -RAK-`09 */ Xint dispel_creature(cflag, damage) Xint cflag; Xint damage; X`7B X register int i; X int k, dispel; X register monster_type *m_ptr; X register creature_type *r_ptr; X vtype out_val, m_name; X X dispel = FALSE; X for (i = mfptr - 1; i >= MIN_MONIX; i--) X `7B X m_ptr = &m_list`5Bi`5D; X if ((m_ptr->cdis <= MAX_SIGHT) && X`09 (cflag & c_list`5Bm_ptr->mptr`5D.cdefense) && X`09 los(char_row, char_col, (int)m_ptr->fy, (int)m_ptr->fx)) X`09`7B X`09 r_ptr = &c_list`5Bm_ptr->mptr`5D; X`09 c_recall`5Bm_ptr->mptr`5D.r_cdefense `7C= cflag; X`09 monster_name (m_name, m_ptr, r_ptr); X`09 k = mon_take_hit (i, randint(damage)); X`09 /* Should get these messages even if the monster is not X`09 visible. */ X`09 if (k >= 0) X`09 (void) sprintf(out_val, "%s dissolves!", m_name); X`09 else X`09 (void) sprintf(out_val, "%s shudders.", m_name); X`09 msg_print(out_val); X`09 dispel = TRUE; X`09 if (k >= 0) X`09 prt_experience(); X`09`7D X `7D X return(dispel); X`7D X X X/* Attempt to turn (confuse) undead creatures.`09-RAK-`09*/ Xint turn_undead() X`7B X register int i, turn_und; X register monster_type *m_ptr; X register creature_type *r_ptr; X vtype out_val, m_name; X X turn_und = 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 if ((m_ptr->cdis <= MAX_SIGHT) && X`09 (CD_UNDEAD & r_ptr->cdefense) && X`09 (los(char_row, char_col, (int)m_ptr->fy, (int)m_ptr->fx))) X`09`7B X`09 monster_name (m_name, m_ptr, r_ptr); X`09 if (((py.misc.lev+1) > r_ptr->level) `7C`7C X`09 (randint(5) == 1)) X`09 `7B X`09 if (m_ptr->ml) X`09`09`7B X`09`09 (void) sprintf(out_val, "%s runs frantically!", m_name); X`09`09 msg_print(out_val); X`09`09 turn_und = TRUE; X`09`09 c_recall`5Bm_ptr->mptr`5D.r_cdefense `7C= CD_UNDEAD; X`09`09`7D X`09 m_ptr->confused = TRUE; X`09 `7D X`09 else if (m_ptr->ml) X`09 `7B 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 return(turn_und); X`7D X X X/* Leave a glyph of warding. Creatures will not pass over! -RAK-*/ Xvoid warding_glyph() X`7B X register int i; X register cave_type *c_ptr; X X c_ptr = &cave`5Bchar_row`5D`5Bchar_col`5D; X if (c_ptr->tptr == 0) X `7B X i = popt(); X c_ptr->tptr = i; X invcopy(&t_list`5Bi`5D, OBJ_SCARE_MON); X `7D X`7D X X X/* Lose a strength point.`09`09`09`09-RAK-`09*/ Xvoid lose_str() X`7B X if (!py.flags.sustain_str) X `7B X (void) dec_stat (A_STR); X msg_print("You feel very sick."); X `7D X else X msg_print("You feel sick for a moment, it passes."); X`7D X X X/* Lose an intelligence point.`09`09`09`09-RAK-`09*/ Xvoid lose_int() X`7B X if (!py.flags.sustain_int) X `7B X (void) dec_stat(A_INT); X msg_print("You become very dizzy."); X `7D X else X msg_print("You become dizzy for a moment, it passes."); X`7D X X X/* Lose a wisdom point.`09`09`09`09`09-RAK-`09*/ Xvoid lose_wis() X`7B X if (!py.flags.sustain_wis) X `7B X (void) dec_stat(A_WIS); X msg_print("You feel very naive."); X `7D X else X msg_print("You feel naive for a moment, it passes."); X`7D X X X/* Lose a dexterity point.`09`09`09`09-RAK-`09*/ Xvoid lose_dex() X`7B X if (!py.flags.sustain_dex) X `7B X (void) dec_stat(A_DEX); X msg_print("You feel very sore."); X `7D X else X msg_print("You feel sore for a moment, it passes."); X`7D X X X/* Lose a constitution point.`09`09`09`09-RAK-`09*/ Xvoid lose_con() X`7B X if (!py.flags.sustain_con) X `7B X (void) dec_stat(A_CON); X msg_print("You feel very sick."); X `7D X else X msg_print("You feel sick for a moment, it passes."); X`7D X X X/* Lose a charisma point.`09`09`09`09-RAK-`09*/ Xvoid lose_chr() X`7B X if (!py.flags.sustain_chr) X `7B X (void) dec_stat(A_CHR); X msg_print("Your skin starts to itch."); X `7D X else X msg_print("Your skin starts to itch, but feels better now."); X`7D X X X/* Lose experience`09`09`09`09`09-RAK-`09*/ Xvoid lose_exp(amount) Xint32 amount; X`7B X register int i; X register struct misc *m_ptr; X register class_type *c_ptr; X X m_ptr = &py.misc; X if (amount > m_ptr->exp) X m_ptr->exp = 0; X else X m_ptr->exp -= amount; X prt_experience(); X X i = 0; X while ((player_exp`5Bi`5D * m_ptr->expfact / 100) <= m_ptr->exp) X i++; X /* increment i once more, because level 1 exp is stored in player_exp`5B0` V5D */ X i++; X X if (m_ptr->lev != i) X `7B X m_ptr->lev = i; X X calc_hitpoints(); X c_ptr = &class`5Bm_ptr->pclass`5D; X if (c_ptr->spell == MAGE) X`09`7B X`09 calc_spells(A_INT); X`09 calc_mana(A_INT); X`09`7D X else if (c_ptr->spell == PRIEST) X`09`7B X`09 calc_spells(A_WIS); X`09 calc_mana(A_WIS); X`09`7D X prt_level(); X prt_title(); X `7D X`7D X X X/* Slow Poison`09`09`09`09`09`09-RAK-`09*/ Xint slow_poison() X`7B X register int slow; X register struct flags *f_ptr; X X slow = FALSE; X f_ptr = &py.flags; X if (f_ptr->poisoned > 0) X `7B X f_ptr->poisoned = f_ptr->poisoned / 2; X if (f_ptr->poisoned < 1)`09f_ptr->poisoned = 1; X slow = TRUE; X msg_print("The effect of the poison has been reduced."); X `7D X return(slow); X`7D X X X/* Bless`09`09`09`09`09`09-RAK-`09*/ Xvoid bless(amount) Xint amount; X`7B X py.flags.blessed += amount; X`7D X X X/* Detect Invisible for period of time`09`09`09-RAK-`09*/ Xvoid detect_inv2(amount) Xint amount; X`7B X py.flags.detect_inv += amount; X`7D X X Xstatic void replace_spot(y, x, typ) Xint y, x, typ; X`7B X register cave_type *c_ptr; X X c_ptr = &cave`5By`5D`5Bx`5D; X switch(typ) X `7B X case 1: case 2: case 3: X c_ptr->fval = CORR_FLOOR; X break; X case 4: case 7: case 10: X c_ptr->fval = GRANITE_WALL; X break; X case 5: case 8: case 11: X c_ptr->fval = MAGMA_WALL; X break; X case 6: case 9: case 12: X c_ptr->fval = QUARTZ_WALL; X break; X `7D X c_ptr->pl = FALSE; X c_ptr->fm = FALSE; X c_ptr->lr = FALSE; /* this is no longer part of a room */ X if (c_ptr->tptr != 0) X (void) delete_object(y, x); X if (c_ptr->cptr > 1) X delete_monster((int)c_ptr->cptr); X`7D X X X/* The spell of destruction.`09`09`09`09-RAK-`09*/ X/* NOTE : Winning creatures that are deleted will be considered`09 */ X/*`09 as teleporting to another level. This will NOT win the*/ X/*`09 game.`09`09`09`09`09`09 */ Xvoid destroy_area(y, x) Xregister int y, x; X`7B X register int i, j, k; X X if (dun_level > 0) X `7B X for (i = (y-15); i <= (y+15); i++) X`09for (j = (x-15); j <= (x+15); j++) X`09 if (in_bounds(i, j) && (cave`5Bi`5D`5Bj`5D.fval != BOUNDARY_WALL)) X`09 `7B X`09 k = distance(i, j, y, x); +-+-+-+-+-+-+-+- END OF PART 65 +-+-+-+-+-+-+-+-