X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fmspells1.c;h=d4f26942ddaf3316e4336f25b5c151b5f9ce7bdd;hb=7e019f092e4fe1bb3905ae662fd655e61b6c1501;hp=519657c9ef6529feddc2385173c0e83220b0abfb;hpb=4349e9eaf10441afe0794f432a67c2b833e8988f;p=hengband%2Fhengband.git diff --git a/src/mspells1.c b/src/mspells1.c index 519657c9e..d4f26942d 100644 --- a/src/mspells1.c +++ b/src/mspells1.c @@ -1,19 +1,17 @@ /* File: mspells1.c */ -/* Purpose: Monster spells (attack player) */ - /* - * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke + * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke * - * This software may be copied and distributed for educational, research, and - * not for profit purposes provided that this copyright and statement are - * included in all such copies. + * This software may be copied and distributed for educational, research, + * and not for profit purposes provided that this copyright and statement + * are included in all such copies. Other copyrights may also apply. */ -#include "angband.h" +/* Purpose: Monster spells (attack player) */ +#include "angband.h" -#ifdef DRS_SMART_OPTIONS /* * And now for Intelligent monster attacks (including spells). @@ -88,7 +86,8 @@ static void remove_bad_spells(int m_idx, u32b *f4p, u32b *f5p, u32b *f6p) if (smart_learn) { /* Hack -- Occasionally forget player status */ - if (m_ptr->smart && (randint0(100) < 1)) m_ptr->smart = 0L; + /* Only save SM_FRIENDLY, SM_PET or SM_CLONED */ + if (m_ptr->smart && (randint0(100) < 1)) m_ptr->smart &= (SM_FRIENDLY | SM_PET | SM_CLONED); /* Use the memorized flags */ smart = m_ptr->smart; @@ -100,21 +99,21 @@ static void remove_bad_spells(int m_idx, u32b *f4p, u32b *f5p, u32b *f6p) { /* Know basic info */ if (p_ptr->resist_acid) smart |= (SM_RES_ACID); - if (p_ptr->oppose_acid) smart |= (SM_OPP_ACID); + if (IS_OPPOSE_ACID()) smart |= (SM_OPP_ACID); if (p_ptr->immune_acid) smart |= (SM_IMM_ACID); if (p_ptr->resist_elec) smart |= (SM_RES_ELEC); - if (p_ptr->oppose_elec) smart |= (SM_OPP_ELEC); + if (IS_OPPOSE_ELEC()) smart |= (SM_OPP_ELEC); if (p_ptr->immune_elec) smart |= (SM_IMM_ELEC); if (p_ptr->resist_fire) smart |= (SM_RES_FIRE); - if (p_ptr->oppose_fire) smart |= (SM_OPP_FIRE); + if (IS_OPPOSE_FIRE()) smart |= (SM_OPP_FIRE); if (p_ptr->immune_fire) smart |= (SM_IMM_FIRE); if (p_ptr->resist_cold) smart |= (SM_RES_COLD); - if (p_ptr->oppose_cold) smart |= (SM_OPP_COLD); + if (IS_OPPOSE_COLD()) smart |= (SM_OPP_COLD); if (p_ptr->immune_cold) smart |= (SM_IMM_COLD); /* Know poison info */ if (p_ptr->resist_pois) smart |= (SM_RES_POIS); - if (p_ptr->oppose_pois) smart |= (SM_OPP_POIS); + if (IS_OPPOSE_POIS()) smart |= (SM_OPP_POIS); /* Know special resistances */ if (p_ptr->resist_neth) smart |= (SM_RES_NETH); @@ -350,8 +349,6 @@ static void remove_bad_spells(int m_idx, u32b *f4p, u32b *f5p, u32b *f6p) (*f6p) = f6; } -#endif /* DRS_SMART_OPTIONS */ - /* * Determine if there is a space near the player in which @@ -372,18 +369,11 @@ bool summon_possible(int y1, int x1) /* Only check a circular area */ if (distance(y1, x1, y, x)>2) continue; -#if 0 - /* Hack: no summon on glyph of warding */ - if (cave[y][x].feat == FEAT_GLYPH) continue; - if (cave[y][x].feat == FEAT_MINOR_GLYPH) continue; -#endif - /* ...nor on the Pattern */ - if ((cave[y][x].feat >= FEAT_PATTERN_START) - && (cave[y][x].feat <= FEAT_PATTERN_XTRA2)) continue; + if (pattern_tile(y, x)) continue; - /* Require empty floor grid in line of sight */ - if ((cave_empty_bold(y, x) || (cave[y][x].feat == FEAT_TREES)) && los(y1, x1, y, x) && los(y, x, y1, x1)) return (TRUE); + /* Require empty floor grid in line of projection */ + if (cave_empty_bold(y, x) && projectable(y1, x1, y, x) && projectable(y, x, y1, x1)) return (TRUE); } } @@ -391,9 +381,11 @@ bool summon_possible(int y1, int x1) } -static bool raise_possible(int y, int x) +bool raise_possible(monster_type *m_ptr) { int xx, yy; + int y = m_ptr->fy; + int x = m_ptr->fx; s16b this_o_idx, next_o_idx = 0; cave_type *c_ptr; @@ -403,6 +395,7 @@ static bool raise_possible(int y, int x) { if (distance(y, x, yy, xx) > 5) continue; if (!los(y, x, yy, xx)) continue; + if (!projectable(y, x, yy, xx)) continue; c_ptr = &cave[yy][xx]; /* Scan the pile of objects */ @@ -416,7 +409,9 @@ static bool raise_possible(int y, int x) /* Known to be worthless? */ if (o_ptr->tval == TV_CORPSE) - return TRUE; + { + if (!monster_has_hostile_align(m_ptr, 0, 0, &r_info[o_ptr->pval])) return TRUE; + } } } } @@ -473,7 +468,7 @@ bool clean_shot(int y1, int x1, int y2, int x2, bool friend) } } /* Pets may not shoot through the character - TNB */ - if ((y == py) && (x == px)) + if (player_bold(y, x)) { if (friend) return (FALSE); } @@ -489,7 +484,7 @@ bool clean_shot(int y1, int x1, int y2, int x2, bool friend) */ static void bolt(int m_idx, int typ, int dam_hp, int monspell, bool learnable) { - int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_PLAYER; + int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_PLAYER | PROJECT_REFLECTABLE; /* Target the player with a bolt attack */ (void)project(m_idx, 0, py, px, dam_hp, typ, flg, (learnable ? monspell : -1)); @@ -497,7 +492,7 @@ static void bolt(int m_idx, int typ, int dam_hp, int monspell, bool learnable) static void beam(int m_idx, int typ, int dam_hp, int monspell, bool learnable) { - int flg = PROJECT_BEAM | PROJECT_KILL | PROJECT_THRU | PROJECT_PLAYER | PROJECT_NO_REF; + int flg = PROJECT_BEAM | PROJECT_KILL | PROJECT_THRU | PROJECT_PLAYER; /* Target the player with a bolt attack */ (void)project(m_idx, 0, py, px, dam_hp, typ, flg, (learnable ? monspell : -1)); @@ -522,7 +517,22 @@ static void breath(int y, int x, int m_idx, int typ, int dam_hp, int rad, bool b /* Handle breath attacks */ if (breath) rad = 0 - rad; - if (typ == GF_ROCKET) flg |= PROJECT_STOP; + switch (typ) + { + case GF_ROCKET: + flg |= PROJECT_STOP; + break; + case GF_DRAIN_MANA: + case GF_MIND_BLAST: + case GF_BRAIN_SMASH: + case GF_CAUSE_1: + case GF_CAUSE_2: + case GF_CAUSE_3: + case GF_CAUSE_4: + case GF_HAND_DOOM: + flg |= (PROJECT_HIDE | PROJECT_AIMED); + break; + } /* Target the player with a ball attack */ (void)project(m_idx, rad, y, x, dam_hp, typ, flg, (learnable ? monspell : -1)); @@ -548,8 +558,8 @@ u32b get_curse(int power, object_type *o_ptr) { if (new_curse & TRC_HEAVY_MASK) continue; } - if (((o_ptr->tval < TV_BOW) || (o_ptr->tval > TV_SWORD)) && (new_curse == TRC_LOW_MELEE)) continue; - if (((o_ptr->tval < TV_BOOTS) || (o_ptr->tval > TV_DRAG_ARMOR)) && (new_curse == TRC_LOW_AC)) continue; + if (new_curse == TRC_LOW_MELEE && !object_is_weapon(o_ptr)) continue; + if (new_curse == TRC_LOW_AC && !object_is_armour(o_ptr)) continue; break; } return new_curse; @@ -560,7 +570,7 @@ void curse_equipment(int chance, int heavy_chance) bool changed = FALSE; int curse_power = 0; u32b new_curse; - u32b o1, o2, o3; + u32b oflgs[TR_FLAG_SIZE]; object_type *o_ptr = &inventory[INVEN_RARM + randint0(12)]; char o_name[MAX_NLEN]; @@ -568,12 +578,12 @@ void curse_equipment(int chance, int heavy_chance) if (!o_ptr->k_idx) return; - object_flags(o_ptr, &o1, &o2, &o3); + object_flags(o_ptr, oflgs); - object_desc(o_name, o_ptr, FALSE, 0); + object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); /* Extra, biased saving throw for blessed items */ - if ((o3 & TR3_BLESSED) && (randint1(888) > chance)) + if (have_flag(oflgs, TR_BLESSED) && (randint1(888) > chance)) { #ifdef JP msg_format("%s¤Ï¼ö¤¤¤òÄ·¤ÍÊÖ¤·¤¿¡ª", o_name, @@ -587,7 +597,7 @@ msg_format("%s } if ((randint1(100) <= heavy_chance) && - (o_ptr->name1 || o_ptr->name2 || o_ptr->art_name)) + (object_is_artifact(o_ptr) || object_is_ego(o_ptr))) { if (!(o_ptr->curse_flags & TRC_HEAVY_CURSE)) changed = TRUE; @@ -597,7 +607,7 @@ msg_format("%s } else { - if (!cursed_p(o_ptr)) + if (!object_is_cursed(o_ptr)) changed = TRUE; o_ptr->curse_flags |= TRC_CURSED; } @@ -824,13 +834,13 @@ static bool spell_dispel(byte spell) /* * Check should monster cast dispel spell. */ -static bool dispel_check(int m_idx) +bool dispel_check(int m_idx) { monster_type *m_ptr = &m_list[m_idx]; monster_race *r_ptr = &r_info[m_ptr->r_idx]; - /* Invulnabilty */ - if (p_ptr->invuln) return (TRUE); + /* Invulnabilty (including the song) */ + if (IS_INVULN()) return (TRUE); /* Wraith form */ if (p_ptr->wraith_form) return (TRUE); @@ -850,17 +860,13 @@ static bool dispel_check(int m_idx) /* Berserk Strength */ if (p_ptr->shero && (p_ptr->pclass != CLASS_BERSERKER)) return (TRUE); - /* Invulnability song */ - if (music_singing(MUSIC_INVULN)) return (TRUE); - /* Demon Lord */ if (p_ptr->mimic_form == MIMIC_DEMON_LORD) return (TRUE); /* Elemental resistances */ if (r_ptr->flags4 & RF4_BR_ACID) { - if (!p_ptr->immune_acid && p_ptr->oppose_acid) return (TRUE); - + if (!p_ptr->immune_acid && (p_ptr->oppose_acid || music_singing(MUSIC_RESIST))) return (TRUE); if (p_ptr->special_defense & DEFENSE_ACID) return (TRUE); } @@ -868,23 +874,20 @@ static bool dispel_check(int m_idx) { if (!((p_ptr->prace == RACE_DEMON) && p_ptr->lev > 44)) { - if(!p_ptr->immune_fire && p_ptr->oppose_fire) return (TRUE); - - if(p_ptr->special_defense & DEFENSE_FIRE) return(TRUE); + if (!p_ptr->immune_fire && (p_ptr->oppose_fire || music_singing(MUSIC_RESIST))) return (TRUE); + if (p_ptr->special_defense & DEFENSE_FIRE) return (TRUE); } } if (r_ptr->flags4 & RF4_BR_ELEC) { - if (!p_ptr->immune_elec && p_ptr->oppose_elec) return (TRUE); - + if (!p_ptr->immune_elec && (p_ptr->oppose_elec || music_singing(MUSIC_RESIST))) return (TRUE); if (p_ptr->special_defense & DEFENSE_ELEC) return (TRUE); } if (r_ptr->flags4 & RF4_BR_COLD) { - if (!p_ptr->immune_cold && p_ptr->oppose_cold) return (TRUE); - + if (!p_ptr->immune_cold && (p_ptr->oppose_cold || music_singing(MUSIC_RESIST))) return (TRUE); if (p_ptr->special_defense & DEFENSE_COLD) return (TRUE); } @@ -892,18 +895,11 @@ static bool dispel_check(int m_idx) { if (!((p_ptr->pclass == CLASS_NINJA) && p_ptr->lev > 44)) { - if (p_ptr->oppose_pois) return (TRUE); - + if (p_ptr->oppose_pois || music_singing(MUSIC_RESIST)) return (TRUE); if (p_ptr->special_defense & DEFENSE_POIS) return (TRUE); } } - /* Elemental resist music */ - if (music_singing(MUSIC_RESIST)) - { - if (r_ptr->flags4 & (RF4_BR_ACID | RF4_BR_FIRE | RF4_BR_ELEC | RF4_BR_COLD | RF4_BR_POIS)) return (TRUE); - } - /* Ultimate resistance */ if (p_ptr->ult_res) return (TRUE); @@ -911,20 +907,16 @@ static bool dispel_check(int m_idx) if (p_ptr->tsuyoshi) return (TRUE); /* Elemental Brands */ - if ((p_ptr->special_attack & ATTACK_ACID) && !(r_ptr->flags3 & RF3_IM_ACID)) return (TRUE); - if ((p_ptr->special_attack & ATTACK_FIRE) && !(r_ptr->flags3 & RF3_IM_FIRE)) return (TRUE); - if ((p_ptr->special_attack & ATTACK_ELEC) && !(r_ptr->flags3 & RF3_IM_ELEC)) return (TRUE); - if ((p_ptr->special_attack & ATTACK_COLD) && !(r_ptr->flags3 & RF3_IM_COLD)) return (TRUE); - if ((p_ptr->special_attack & ATTACK_POIS) && !(r_ptr->flags3 & RF3_IM_POIS)) return (TRUE); + if ((p_ptr->special_attack & ATTACK_ACID) && !(r_ptr->flagsr & RFR_EFF_IM_ACID_MASK)) return (TRUE); + if ((p_ptr->special_attack & ATTACK_FIRE) && !(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK)) return (TRUE); + if ((p_ptr->special_attack & ATTACK_ELEC) && !(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK)) return (TRUE); + if ((p_ptr->special_attack & ATTACK_COLD) && !(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK)) return (TRUE); + if ((p_ptr->special_attack & ATTACK_POIS) && !(r_ptr->flagsr & RFR_EFF_IM_POIS_MASK)) return (TRUE); /* Speed */ if (p_ptr->pspeed < 145) { - if (p_ptr->fast) return (TRUE); - - if (music_singing(MUSIC_SPEED)) return (TRUE); - - if (music_singing(MUSIC_SHERO)) return (TRUE); + if (IS_FAST()) return (TRUE); } /* Light speed */ @@ -932,7 +924,7 @@ static bool dispel_check(int m_idx) if (p_ptr->riding && (m_list[p_ptr->riding].mspeed < 135)) { - if (m_list[p_ptr->riding].fast) return (TRUE); + if (MON_FAST(&m_list[p_ptr->riding])) return (TRUE); } /* No need to cast dispel spell */ @@ -964,7 +956,7 @@ static int choose_attack_spell(int m_idx, byte spells[], byte num) byte summon[96], summon_num = 0; byte tactic[96], tactic_num = 0; byte annoy[96], annoy_num = 0; - byte invul[96], invul_num = 0; + byte invul[96], invul_num = 0; byte haste[96], haste_num = 0; byte world[96], world_num = 0; byte special[96], special_num = 0; @@ -1057,7 +1049,7 @@ static int choose_attack_spell(int m_idx, byte spells[], byte num) } /* Hurt badly or afraid, attempt to flee */ - if (((m_ptr->hp < m_ptr->maxhp / 3) || m_ptr->monfear) && one_in_(2)) + if (((m_ptr->hp < m_ptr->maxhp / 3) || MON_MONFEAR(m_ptr)) && one_in_(2)) { /* Choose escape spell if possible */ if (escape_num) return (escape[randint0(escape_num)]); @@ -1067,15 +1059,21 @@ static int choose_attack_spell(int m_idx, byte spells[], byte num) if (special_num) { bool success = FALSE; - switch(m_ptr->r_idx) + switch (m_ptr->r_idx) { case MON_OHMU: - if (randint0(100) < 50) success = TRUE; + case MON_BANOR: + case MON_LUPART: break; case MON_BANORLUPART: if (randint0(100) < 70) success = TRUE; break; - default: break; + case MON_ROLENTO: + if (randint0(100) < 40) success = TRUE; + break; + default: + if (randint0(100) < 50) success = TRUE; + break; } if (success) return (special[randint0(special_num)]); } @@ -1105,14 +1103,14 @@ static int choose_attack_spell(int m_idx, byte spells[], byte num) } /* Raise-dead if possible (sometimes) */ - if (raise_num && (randint0(100) < 40) && raise_possible(m_ptr->fy, m_ptr->fx)) + if (raise_num && (randint0(100) < 40)) { /* Choose raise-dead spell */ return (raise[randint0(raise_num)]); } /* Attack spell (most of the time) */ - if (p_ptr->invuln) + if (IS_INVULN()) { if (psy_spe_num && (randint0(100) < 50)) { @@ -1139,7 +1137,7 @@ static int choose_attack_spell(int m_idx, byte spells[], byte num) } /* Cast globe of invulnerability if not already in effect */ - if (invul_num && !(m_ptr->invulner) && (randint0(100) < 50)) + if (invul_num && !m_ptr->mtimed[MTIMED_INVULNER] && (randint0(100) < 50)) { /* Choose Globe of Invulnerability */ return (invul[randint0(invul_num)]); @@ -1153,7 +1151,7 @@ static int choose_attack_spell(int m_idx, byte spells[], byte num) } /* Haste self if we aren't already somewhat hasted (rarely) */ - if (haste_num && (randint0(100) < 20) && !(m_ptr->fast)) + if (haste_num && (randint0(100) < 20) && !MON_FAST(m_ptr)) { /* Choose haste spell */ return (haste[randint0(haste_num)]); @@ -1172,6 +1170,76 @@ static int choose_attack_spell(int m_idx, byte spells[], byte num) /* + * Return TRUE if a spell is inate spell. + */ +bool spell_is_inate(u16b spell) +{ + if (spell < 32 * 4) /* Set RF4 */ + { + if ((1L << (spell - 32 * 3)) & RF4_NOMAGIC_MASK) return TRUE; + } + else if (spell < 32 * 5) /* Set RF5 */ + { + if ((1L << (spell - 32 * 4)) & RF5_NOMAGIC_MASK) return TRUE; + } + else if (spell < 32 * 6) /* Set RF6 */ + { + if ((1L << (spell - 32 * 5)) & RF6_NOMAGIC_MASK) return TRUE; + } + + /* This spell is not "inate" */ + return FALSE; +} + + +static bool adjacent_grid_check(monster_type *m_ptr, int *yp, int *xp, + int f_flag, bool (*path_check)(int, int, int, int)) +{ + int i; + int tonari; + static int tonari_y[4][8] = {{-1, -1, -1, 0, 0, 1, 1, 1}, + {-1, -1, -1, 0, 0, 1, 1, 1}, + { 1, 1, 1, 0, 0, -1, -1, -1}, + { 1, 1, 1, 0, 0, -1, -1, -1}}; + static int tonari_x[4][8] = {{-1, 0, 1, -1, 1, -1, 0, 1}, + { 1, 0, -1, 1, -1, 1, 0, -1}, + {-1, 0, 1, -1, 1, -1, 0, 1}, + { 1, 0, -1, 1, -1, 1, 0, -1}}; + + if (m_ptr->fy < py && m_ptr->fx < px) tonari = 0; + else if (m_ptr->fy < py) tonari = 1; + else if (m_ptr->fx < px) tonari = 2; + else tonari = 3; + + for (i = 0; i < 8; i++) + { + int next_x = *xp + tonari_x[tonari][i]; + int next_y = *yp + tonari_y[tonari][i]; + cave_type *c_ptr; + + /* Access the next grid */ + c_ptr = &cave[next_y][next_x]; + + /* Skip this feature */ + if (!cave_have_flag_grid(c_ptr, f_flag)) continue; + + if (path_check(m_ptr->fy, m_ptr->fx, next_y, next_x)) + { + *yp = next_y; + *xp = next_x; + return TRUE; + } + } + + return FALSE; +} + +#define DO_SPELL_NONE 0 +#define DO_SPELL_BR_LITE 1 +#define DO_SPELL_BR_DISI 2 +#define DO_SPELL_BA_LITE 3 + +/* * Creatures can cast spells, shoot missiles, and breathe. * * Returns "TRUE" if a spell (or whatever) was (successfully) cast. @@ -1227,16 +1295,17 @@ static int choose_attack_spell(int m_idx, byte spells[], byte num) */ bool make_attack_spell(int m_idx) { - int k, chance, thrown_spell = 0, rlev, failrate; + int k, thrown_spell = 0, rlev, failrate; byte spell[96], num = 0; u32b f4, f5, f6; monster_type *m_ptr = &m_list[m_idx]; monster_race *r_ptr = &r_info[m_ptr->r_idx]; char m_name[80]; +#ifndef JP char m_poss[80]; - char ddesc[80]; +#endif bool no_inate = FALSE; - bool do_disi = FALSE; + bool do_spell = DO_SPELL_NONE; int dam = 0; u32b mode = 0L; int s_num_6 = (easy_band ? 2 : 6); @@ -1246,6 +1315,10 @@ bool make_attack_spell(int m_idx) int x = px; int y = py; + /* Target location for lite breath */ + int x_br_lite = 0; + int y_br_lite = 0; + /* Summon count */ int count = 0; @@ -1258,14 +1331,18 @@ bool make_attack_spell(int m_idx) bool maneable = player_has_los_bold(m_ptr->fy, m_ptr->fx); bool learnable = (seen && maneable && !world_monster); - /* Assume "normal" target */ - bool normal = TRUE; + /* Check "projectable" */ + bool direct; + + bool in_no_magic_dungeon = (d_info[dungeon_type].flags1 & DF1_NO_MAGIC) && dun_level + && (!p_ptr->inside_quest || is_fixed_quest_idx(p_ptr->inside_quest)); - /* Assume "projectable" */ - bool direct = TRUE; + bool can_use_lite_area = FALSE; + + bool can_remember; /* Cannot cast spells when confused */ - if (m_ptr->confused) + if (MON_CONFUSED(m_ptr)) { reset_target(m_ptr); return (FALSE); @@ -1275,25 +1352,9 @@ bool make_attack_spell(int m_idx) if (m_ptr->mflag & MFLAG_NICE) return (FALSE); if (!is_hostile(m_ptr)) return (FALSE); - /* Hack -- Extract the spell probability */ - chance = (r_ptr->freq_inate + r_ptr->freq_spell) / 2; - - /* Not allowed to cast spells */ - if (!chance) return (FALSE); - - if (stupid_monsters) - { - /* Only do spells occasionally */ - if (randint0(100) >= chance) return (FALSE); - } - else - { - if (randint0(100) >= chance) return (FALSE); - - /* Sometimes forbid inate attacks (breaths) */ - if (randint0(100) >= (chance * 2)) no_inate = TRUE; - } + /* Sometimes forbid inate attacks (breaths) */ + if (randint0(100) >= (r_ptr->freq_spell * 2)) no_inate = TRUE; /* XXX XXX XXX Handle "track_target" option (?) */ @@ -1303,94 +1364,111 @@ bool make_attack_spell(int m_idx) f5 = r_ptr->flags5; f6 = r_ptr->flags6; - /* Hack -- require projectable player */ - if (normal) + /*** require projectable player ***/ + + /* Check range */ + if ((m_ptr->cdis > MAX_RANGE) && !m_ptr->target_y) return (FALSE); + + /* Check path for lite breath */ + if (f4 & RF4_BR_LITE) { - /* Check range */ - if ((m_ptr->cdis > MAX_RANGE) && !m_ptr->target_y) return (FALSE); + y_br_lite = y; + x_br_lite = x; - /* Check path */ - if (projectable(m_ptr->fy, m_ptr->fx, y, x)) + if (los(m_ptr->fy, m_ptr->fx, y_br_lite, x_br_lite)) { - /* Breath disintegration to the glyph */ - if ((!cave_floor_bold(y,x)) && (r_ptr->flags4 & RF4_BR_DISI) && one_in_(2)) do_disi = TRUE; + feature_type *f_ptr = &f_info[cave[y_br_lite][x_br_lite].feat]; + + if (!have_flag(f_ptr->flags, FF_LOS)) + { + if (have_flag(f_ptr->flags, FF_PROJECT) && one_in_(2)) f4 &= ~(RF4_BR_LITE); + } } /* Check path to next grid */ - else + else if (!adjacent_grid_check(m_ptr, &y_br_lite, &x_br_lite, FF_LOS, los)) f4 &= ~(RF4_BR_LITE); + + /* Don't breath lite to the wall if impossible */ + if (!(f4 & RF4_BR_LITE)) { - bool success = FALSE; + y_br_lite = 0; + x_br_lite = 0; + } + } - if ((r_ptr->flags4 & RF4_BR_DISI) && - (m_ptr->cdis < MAX_RANGE/2) && - in_disintegration_range(m_ptr->fy, m_ptr->fx, y, x) && - (one_in_(10) || (projectable(y, x, m_ptr->fy, m_ptr->fx) && one_in_(2)))) - { - do_disi = TRUE; - success = TRUE; - } - else - { - int i; - int tonari; - int tonari_y[4][8] = {{-1,-1,-1,0,0,1,1,1}, - {-1,-1,-1,0,0,1,1,1}, - {1,1,1,0,0,-1,-1,-1}, - {1,1,1,0,0,-1,-1,-1}}; - int tonari_x[4][8] = {{-1,0,1,-1,1,-1,0,1}, - {1,0,-1,1,-1,1,0,-1}, - {-1,0,1,-1,1,-1,0,1}, - {1,0,-1,1,-1,1,0,-1}}; - - if (m_ptr->fy < py && m_ptr->fx < px) tonari = 0; - else if (m_ptr->fy < py) tonari = 1; - else if (m_ptr->fx < px) tonari = 2; - else tonari = 3; - - for (i = 0; i < 8; i++) - { - int next_x = x + tonari_x[tonari][i]; - int next_y = y + tonari_y[tonari][i]; - cave_type *c_ptr; + /* Check path */ + if (projectable(m_ptr->fy, m_ptr->fx, y, x)) + { + feature_type *f_ptr = &f_info[cave[y][x].feat]; - /* Access the next grid */ - c_ptr = &cave[next_y][next_x]; + if (!have_flag(f_ptr->flags, FF_PROJECT)) + { + /* Breath disintegration to the wall if possible */ + if ((f4 & RF4_BR_DISI) && have_flag(f_ptr->flags, FF_HURT_DISI) && one_in_(2)) do_spell = DO_SPELL_BR_DISI; - /* Skip door, rubble, wall */ - if ((c_ptr->feat >= FEAT_DOOR_HEAD) && (c_ptr->feat <= FEAT_PERM_SOLID)) continue; + /* Breath lite to the transparent wall if possible */ + else if ((f4 & RF4_BR_LITE) && have_flag(f_ptr->flags, FF_LOS) && one_in_(2)) do_spell = DO_SPELL_BR_LITE; + } + } - /* Skip tree */ - if (c_ptr->feat == FEAT_TREES) continue; + /* Check path to next grid */ + else + { + bool success = FALSE; - /* Skip mountain */ - if (c_ptr->feat == FEAT_MOUNTAIN) continue; + if ((f4 & RF4_BR_DISI) && (m_ptr->cdis < MAX_RANGE/2) && + in_disintegration_range(m_ptr->fy, m_ptr->fx, y, x) && + (one_in_(10) || (projectable(y, x, m_ptr->fy, m_ptr->fx) && one_in_(2)))) + { + do_spell = DO_SPELL_BR_DISI; + success = TRUE; + } + else if ((f4 & RF4_BR_LITE) && (m_ptr->cdis < MAX_RANGE/2) && + los(m_ptr->fy, m_ptr->fx, y, x) && one_in_(5)) + { + do_spell = DO_SPELL_BR_LITE; + success = TRUE; + } + else if ((f5 & RF5_BA_LITE) && (m_ptr->cdis <= MAX_RANGE)) + { + int by = y, bx = x; + get_project_point(m_ptr->fy, m_ptr->fx, &by, &bx, 0L); + if ((distance(by, bx, y, x) <= 3) && los(by, bx, y, x) && one_in_(5)) + { + do_spell = DO_SPELL_BA_LITE; + success = TRUE; + } + } - if (projectable(m_ptr->fy, m_ptr->fx, next_y, next_x)) - { - y = next_y; - x = next_x; - success = TRUE; - break; - } - } + if (!success) success = adjacent_grid_check(m_ptr, &y, &x, FF_PROJECT, projectable); + + if (!success) + { + if (m_ptr->target_y && m_ptr->target_x) + { + y = m_ptr->target_y; + x = m_ptr->target_x; + f4 &= (RF4_INDIRECT_MASK); + f5 &= (RF5_INDIRECT_MASK); + f6 &= (RF6_INDIRECT_MASK); + success = TRUE; } - if (!success) + if (y_br_lite && x_br_lite && (m_ptr->cdis < MAX_RANGE/2) && one_in_(5)) { - if (m_ptr->target_y && m_ptr->target_x) + if (!success) { - y = m_ptr->target_y; - x = m_ptr->target_x; - f4 &= (RF4_INDIRECT_MASK); - f5 &= (RF5_INDIRECT_MASK); - f6 &= (RF6_INDIRECT_MASK); + y = y_br_lite; + x = x_br_lite; + do_spell = DO_SPELL_BR_LITE; success = TRUE; } + else f4 |= (RF4_BR_LITE); } - - /* No spells */ - if (!success) return FALSE; } + + /* No spells */ + if (!success) return FALSE; } reset_target(m_ptr); @@ -1398,63 +1476,81 @@ bool make_attack_spell(int m_idx) /* Extract the monster level */ rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1); - if (!stupid_monsters) + /* Forbid inate attacks sometimes */ + if (no_inate) { - /* Forbid inate attacks sometimes */ - if (no_inate) f4 &= 0x500000FF; + f4 &= ~(RF4_NOMAGIC_MASK); + f5 &= ~(RF5_NOMAGIC_MASK); + f6 &= ~(RF6_NOMAGIC_MASK); } - if (!p_ptr->csp) + if (f6 & RF6_DARKNESS) { - f5 &= ~(RF5_DRAIN_MANA); - } - if ((p_ptr->pclass == CLASS_NINJA) && (r_ptr->flags3 & (RF3_UNDEAD | RF3_HURT_LITE))) - { - f6 &= ~(RF6_DARKNESS); + if ((p_ptr->pclass == CLASS_NINJA) && + !(r_ptr->flags3 & (RF3_UNDEAD | RF3_HURT_LITE)) && + !(r_ptr->flags7 & RF7_DARK_MASK)) + can_use_lite_area = TRUE; + + if (!(r_ptr->flags2 & RF2_STUPID)) + { + if (d_info[dungeon_type].flags1 & DF1_DARKNESS) f6 &= ~(RF6_DARKNESS); + else if ((p_ptr->pclass == CLASS_NINJA) && !can_use_lite_area) f6 &= ~(RF6_DARKNESS); + } } - if (dun_level && (!p_ptr->inside_quest || (p_ptr->inside_quest < MIN_RANDOM_QUEST)) && (d_info[dungeon_type].flags1 & DF1_NO_MAGIC)) + if (in_no_magic_dungeon && !(r_ptr->flags2 & RF2_STUPID)) { f4 &= (RF4_NOMAGIC_MASK); f5 &= (RF5_NOMAGIC_MASK); f6 &= (RF6_NOMAGIC_MASK); } - /* Hack -- allow "desperate" spells */ - if ((r_ptr->flags2 & (RF2_SMART)) && - (m_ptr->hp < m_ptr->maxhp / 10) && - (randint0(100) < 50)) + if (r_ptr->flags2 & RF2_SMART) { - /* Require intelligent spells */ - f4 &= (RF4_INT_MASK); - f5 &= (RF5_INT_MASK); - f6 &= (RF6_INT_MASK); + /* Hack -- allow "desperate" spells */ + if ((m_ptr->hp < m_ptr->maxhp / 10) && + (randint0(100) < 50)) + { + /* Require intelligent spells */ + f4 &= (RF4_INT_MASK); + f5 &= (RF5_INT_MASK); + f6 &= (RF6_INT_MASK); + } - /* No spells left */ - if (!f4 && !f5 && !f6) return (FALSE); + /* Hack -- decline "teleport level" in some case */ + if ((f6 & RF6_TELE_LEVEL) && TELE_LEVEL_IS_INEFF(0)) + { + f6 &= ~(RF6_TELE_LEVEL); + } } + /* No spells left */ + if (!f4 && !f5 && !f6) return (FALSE); + /* Remove the "ineffective" spells */ remove_bad_spells(m_idx, &f4, &f5, &f6); - if (p_ptr->inside_arena) + if (p_ptr->inside_arena || p_ptr->inside_battle) { f4 &= ~(RF4_SUMMON_MASK); f5 &= ~(RF5_SUMMON_MASK); - f6 &= ~(RF6_SUMMON_MASK); + f6 &= ~(RF6_SUMMON_MASK | RF6_TELE_LEVEL); + + if (m_ptr->r_idx == MON_ROLENTO) f6 &= ~(RF6_SPECIAL); } /* No spells left */ if (!f4 && !f5 && !f6) return (FALSE); - if (!stupid_monsters) + if (!(r_ptr->flags2 & RF2_STUPID)) { + if (!p_ptr->csp) f5 &= ~(RF5_DRAIN_MANA); + /* Check for a clean bolt shot */ if (((f4 & RF4_BOLT_MASK) || (f5 & RF5_BOLT_MASK) || (f6 & RF6_BOLT_MASK)) && - !(r_ptr->flags2 & RF2_STUPID) && - !clean_shot(m_ptr->fy, m_ptr->fx, py, px, FALSE)) + !clean_shot(m_ptr->fy, m_ptr->fx, py, px, FALSE)) { /* Remove spells that will only hurt friends */ f4 &= ~(RF4_BOLT_MASK); @@ -1466,8 +1562,7 @@ bool make_attack_spell(int m_idx) if (((f4 & RF4_SUMMON_MASK) || (f5 & RF5_SUMMON_MASK) || (f6 & RF6_SUMMON_MASK)) && - !(r_ptr->flags2 & RF2_STUPID) && - !(summon_possible(y, x))) + !(summon_possible(y, x))) { /* Remove summoning spells */ f4 &= ~(RF4_SUMMON_MASK); @@ -1475,6 +1570,22 @@ bool make_attack_spell(int m_idx) f6 &= ~(RF6_SUMMON_MASK); } + /* Check for a possible raise dead */ + if ((f6 & RF6_RAISE_DEAD) && !raise_possible(m_ptr)) + { + /* Remove raise dead spell */ + f6 &= ~(RF6_RAISE_DEAD); + } + + /* Special moves restriction */ + if (f6 & RF6_SPECIAL) + { + if ((m_ptr->r_idx == MON_ROLENTO) && !summon_possible(y, x)) + { + f6 &= ~(RF6_SPECIAL); + } + } + /* No spells left */ if (!f4 && !f5 && !f6) return (FALSE); } @@ -1509,57 +1620,68 @@ bool make_attack_spell(int m_idx) /* Get the monster name (or "it") */ monster_desc(m_name, m_ptr, 0x00); +#ifndef JP /* Get the monster possessive ("his"/"her"/"its") */ - monster_desc(m_poss, m_ptr, 0x22); - - /* Hack -- Get the "died from" name */ - monster_desc(ddesc, m_ptr, 0x288); + monster_desc(m_poss, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE); +#endif - if (stupid_monsters) + switch (do_spell) { - /* Choose a spell to cast */ - thrown_spell = spell[randint0(num)]; - } - else - { - int attempt = 10; - if (do_disi) thrown_spell = 96+31; - else + case DO_SPELL_NONE: { - while(attempt--) + int attempt = 10; + while (attempt--) { thrown_spell = choose_attack_spell(m_idx, spell, num); if (thrown_spell) break; } } + break; - /* Abort if no spell was chosen */ - if (!thrown_spell) return (FALSE); + case DO_SPELL_BR_LITE: + thrown_spell = 96+14; /* RF4_BR_LITE */ + break; - /* Calculate spell failure rate */ - failrate = 25 - (rlev + 3) / 4; + case DO_SPELL_BR_DISI: + thrown_spell = 96+31; /* RF4_BR_DISI */ + break; - /* Hack -- Stupid monsters will never fail (for jellies and such) */ - if (r_ptr->flags2 & RF2_STUPID) failrate = 0; + case DO_SPELL_BA_LITE: + thrown_spell = 128+20; /* RF5_BA_LITE */ + break; - /* Check for spell failure (inate attacks never fail) */ - if ((thrown_spell >= 128) && ((m_ptr->stunned && one_in_(2)) || (randint0(100) < failrate))) - { - disturb(1, 0); - /* Message */ - if (thrown_spell != (160+7)) /* Not RF6_SPECIAL */ - { + default: + return FALSE; /* Paranoia */ + } + + /* Abort if no spell was chosen */ + if (!thrown_spell) return (FALSE); + + /* Calculate spell failure rate */ + failrate = 25 - (rlev + 3) / 4; + + /* Hack -- Stupid monsters will never fail (for jellies and such) */ + if (r_ptr->flags2 & RF2_STUPID) failrate = 0; + + /* Check for spell failure (inate attacks never fail) */ + if (!spell_is_inate(thrown_spell) + && (in_no_magic_dungeon || (MON_STUNNED(m_ptr) && one_in_(2)) || (randint0(100) < failrate))) + { + disturb(1, 0); + /* Message */ #ifdef JP -msg_format("%^s¤Ï¼öʸ¤ò¾§¤¨¤è¤¦¤È¤·¤¿¤¬¼ºÇÔ¤·¤¿¡£", m_name); + msg_format("%^s¤Ï¼öʸ¤ò¾§¤¨¤è¤¦¤È¤·¤¿¤¬¼ºÇÔ¤·¤¿¡£", m_name); #else - msg_format("%^s tries to cast a spell, but fails.", m_name); + msg_format("%^s tries to cast a spell, but fails.", m_name); #endif - } - return (TRUE); - } + return (TRUE); } + /* Projectable? */ + direct = player_bold(y, x); + + can_remember = is_original_ap_and_seen(m_ptr); /* Cast the spell. */ switch (thrown_spell) @@ -1567,7 +1689,6 @@ msg_format("%^s /* RF4_SHRIEK */ case 96+0: { - if (!direct) break; disturb(1, 0); #ifdef JP msg_format("%^s¤¬¤«¤ó¹â¤¤¶âÀÚ¤êÀ¼¤ò¤¢¤²¤¿¡£", m_name); @@ -1589,7 +1710,7 @@ msg_format("%^s /* RF4_DISPEL */ case 96+2: { - if (x!=px || y!=py) return (FALSE); + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP if (blind) msg_format("%^s¤¬²¿¤«¤òÎ϶¯¤¯¤Ä¤Ö¤ä¤¤¤¿¡£", m_name); @@ -1598,91 +1719,8 @@ msg_format("%^s if (blind) msg_format("%^s mumbles powerfully.", m_name); else msg_format("%^s invokes a dispel magic.", m_name); #endif - set_fast(0, TRUE); - set_lightspeed(0, TRUE); - set_slow(0, TRUE); - set_shield(0, TRUE); - set_blessed(0, TRUE); - set_tsuyoshi(0, TRUE); - set_hero(0, TRUE); - set_shero(0, TRUE); - set_protevil(0, TRUE); - set_invuln(0, TRUE); - set_wraith_form(0, TRUE); - set_kabenuke(0, TRUE); - set_tim_res_nether(0, TRUE); - set_tim_res_time(0, TRUE); - /* by henkma */ - set_tim_reflect(0,TRUE); - set_multishadow(0,TRUE); - set_dustrobe(0,TRUE); - - set_tim_invis(0, TRUE); - set_tim_infra(0, TRUE); - set_tim_esp(0, TRUE); - set_tim_regen(0, TRUE); - set_tim_stealth(0, TRUE); - set_tim_ffall(0, TRUE); - set_tim_sh_touki(0, TRUE); - set_tim_sh_fire(0, TRUE); - set_tim_sh_holy(0, TRUE); - set_tim_eyeeye(0, TRUE); - set_magicdef(0, TRUE); - set_resist_magic(0, TRUE); - set_oppose_acid(0, TRUE); - set_oppose_elec(0, TRUE); - set_oppose_fire(0, TRUE); - set_oppose_cold(0, TRUE); - set_oppose_pois(0, TRUE); - set_ultimate_res(0, TRUE); - set_mimic(0, 0, TRUE); - set_ele_attack(0, 0); - set_ele_immune(0, 0); - /* Cancel glowing hands */ - if (p_ptr->special_attack & ATTACK_CONFUSE) - { - p_ptr->special_attack &= ~(ATTACK_CONFUSE); -#ifdef JP - msg_print("¼ê¤Îµ±¤­¤¬¤Ê¤¯¤Ê¤Ã¤¿¡£"); -#else - msg_print("Your hands stop glowing."); -#endif - - } - if ((p_ptr->pclass == CLASS_BARD) && (p_ptr->magic_num1[0])) - { - p_ptr->magic_num1[1] = p_ptr->magic_num1[0]; - p_ptr->magic_num1[0] = 0; -#ifdef JP - msg_print("²Î¤¬ÅÓÀڤ줿¡£"); -#else - msg_print("Your singing is interrupted."); -#endif - p_ptr->action = ACTION_NONE; - - /* Recalculate bonuses */ - p_ptr->update |= (PU_BONUS | PU_HP); - - /* Redraw map */ - p_ptr->redraw |= (PR_MAP | PR_STATUS | PR_STATE); - - /* Update monsters */ - p_ptr->update |= (PU_MONSTERS); - - /* Window stuff */ - p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); - - p_ptr->energy_need += ENERGY_NEED(); - } - if (p_ptr->riding) - { - m_list[p_ptr->riding].invulner = 0; - m_list[p_ptr->riding].fast = 0; - m_list[p_ptr->riding].slow = 0; - p_ptr->update |= PU_BONUS; - if (p_ptr->health_who == p_ptr->riding) p_ptr->redraw |= PR_HEALTH; - p_ptr->redraw |= (PR_UHEALTH); - } + dispel_player(); + if (p_ptr->riding) dispel_monster_status(p_ptr->riding); #ifdef JP if ((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON)) @@ -1692,7 +1730,7 @@ msg_format("%^s break; } - /* RF4_XXX4X4 */ + /* RF4_ROCKET */ case 96+3: { disturb(1, 0); @@ -1718,7 +1756,7 @@ else msg_format("%^s /* RF4_SHOOT */ case 96+4: { - if (x!=px || y!=py) return (FALSE); + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP if (blind) msg_format("%^s¤¬´ñ̯¤Ê²»¤òȯ¤·¤¿¡£", m_name); @@ -1909,7 +1947,7 @@ else msg_format("%^s #endif dam = ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)); - breath(y, x, m_idx, GF_LITE, dam,0, TRUE, MS_BR_LITE, learnable); + breath(y_br_lite, x_br_lite, m_idx, GF_LITE, dam,0, TRUE, MS_BR_LITE, learnable); update_smart_learn(m_idx, DRS_LITE); break; } @@ -2517,70 +2555,11 @@ else msg_format("%^s /* RF5_DRAIN_MANA */ case 128+9: { - if (x!=px || y!=py) return (FALSE); - if (!direct) break; + if (!direct) return (FALSE); disturb(1, 0); - if (p_ptr->csp) - { - int r1; - - /* Basic message */ -#ifdef JP -msg_format("%^s¤ËÀº¿À¥¨¥Í¥ë¥®¡¼¤òµÛ¤¤¼è¤é¤ì¤Æ¤·¤Þ¤Ã¤¿¡ª", m_name); -#else - msg_format("%^s draws psychic energy from you!", m_name); -#endif - - - /* Attack power */ - r1 = (randint1(rlev) / 2) + 1; - - /* Full drain */ - if (r1 >= p_ptr->csp) - { - r1 = p_ptr->csp; - p_ptr->csp = 0; - p_ptr->csp_frac = 0; - } - - /* Partial drain */ - else - { - p_ptr->csp -= r1; - } - - learn_spell(MS_DRAIN_MANA); - - /* Redraw mana */ - p_ptr->redraw |= (PR_MANA); - - /* Window stuff */ - p_ptr->window |= (PW_PLAYER); - p_ptr->window |= (PW_SPELL); - /* Heal the monster */ - if (m_ptr->hp < m_ptr->maxhp) - { - /* Heal */ - m_ptr->hp += (6 * r1); - if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp; - - /* Redraw (later) if needed */ - if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH); - if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH); - - /* Special message */ - if (seen) - { -#ifdef JP -msg_format("%^s¤Ïµ¤Ê¬¤¬Îɤµ¤½¤¦¤À¡£", m_name); -#else - msg_format("%^s appears healthier.", m_name); -#endif - - } - } - } + dam = (randint1(rlev) / 2) + 1; + breath(y, x, m_idx, GF_DRAIN_MANA, dam, 0, FALSE, MS_DRAIN_MANA, learnable); update_smart_learn(m_idx, DRS_MANA); break; } @@ -2588,8 +2567,7 @@ msg_format("%^s /* RF5_MIND_BLAST */ case 128+10: { - if (x!=px || y!=py) return (FALSE); - if (!direct) break; + if (!direct) return (FALSE); disturb(1, 0); if (!seen) { @@ -2611,51 +2589,14 @@ msg_format("%^s } dam = damroll(7, 7); - if (randint0(100 + rlev/2) < (MAX(5, p_ptr->skill_sav))) - { -#ifdef JP -msg_print("¤·¤«¤·¸úÎϤòÄ·¤ÍÊÖ¤·¤¿¡ª"); -#else - msg_print("You resist the effects!"); -#endif - learn_spell(MS_MIND_BLAST); - } - else - { -#ifdef JP -msg_print("ÎîŪ¥¨¥Í¥ë¥®¡¼¤ÇÀº¿À¤¬¹¶·â¤µ¤ì¤¿¡£"); -#else - msg_print("Your mind is blasted by psyonic energy."); -#endif - - if (!p_ptr->resist_conf) - { - (void)set_confused(p_ptr->confused + randint0(4) + 4); - } - - if (!p_ptr->resist_chaos && one_in_(3)) - { - (void)set_image(p_ptr->image + randint0(250) + 150); - } - - p_ptr->csp -= 50; - if (p_ptr->csp < 0) - { - p_ptr->csp = 0; - p_ptr->csp_frac = 0; - } - p_ptr->redraw |= PR_MANA; - - take_hit(DAMAGE_ATTACK, dam, ddesc, MS_MIND_BLAST); - } + breath(y, x, m_idx, GF_MIND_BLAST, dam, 0, FALSE, MS_MIND_BLAST, learnable); break; } /* RF5_BRAIN_SMASH */ case 128+11: { - if (x!=px || y!=py) return (FALSE); - if (!direct) break; + if (!direct) return (FALSE); disturb(1, 0); if (!seen) { @@ -2677,64 +2618,14 @@ msg_format("%^s } dam = damroll(12, 12); - if (randint0(100 + rlev/2) < (MAX(5, p_ptr->skill_sav))) - { -#ifdef JP -msg_print("¤·¤«¤·¸úÎϤòÄ·¤ÍÊÖ¤·¤¿¡ª"); -#else - msg_print("You resist the effects!"); -#endif - learn_spell(MS_BRAIN_SMASH); - } - else - { -#ifdef JP -msg_print("ÎîŪ¥¨¥Í¥ë¥®¡¼¤ÇÀº¿À¤¬¹¶·â¤µ¤ì¤¿¡£"); -#else - msg_print("Your mind is blasted by psionic energy."); -#endif - - p_ptr->csp -= 100; - if (p_ptr->csp < 0) - { - p_ptr->csp = 0; - p_ptr->csp_frac = 0; - } - p_ptr->redraw |= PR_MANA; - - take_hit(DAMAGE_ATTACK, dam, ddesc, MS_BRAIN_SMASH); - if (!p_ptr->resist_blind) - { - (void)set_blind(p_ptr->blind + 8 + randint0(8)); - } - if (!p_ptr->resist_conf) - { - (void)set_confused(p_ptr->confused + randint0(4) + 4); - } - if (!p_ptr->free_act) - { - (void)set_paralyzed(p_ptr->paralyzed + randint0(4) + 4); - } - (void)set_slow(p_ptr->slow + randint0(4) + 4, FALSE); - - while (randint0(100 + rlev/2) > (MAX(5, p_ptr->skill_sav))) - (void)do_dec_stat(A_INT); - while (randint0(100 + rlev/2) > (MAX(5, p_ptr->skill_sav))) - (void)do_dec_stat(A_WIS); - - if (!p_ptr->resist_chaos) - { - (void)set_image(p_ptr->image + randint0(250) + 150); - } - } + breath(y, x, m_idx, GF_BRAIN_SMASH, dam, 0, FALSE, MS_BRAIN_SMASH, learnable); break; } /* RF5_CAUSE_1 */ case 128+12: { - if (x!=px || y!=py) return (FALSE); - if (!direct) break; + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP if (blind) msg_format("%^s¤¬²¿¤«¤ò¤Ä¤Ö¤ä¤¤¤¿¡£", m_name); @@ -2749,28 +2640,14 @@ else msg_format("%^s #endif dam = damroll(3, 8); - if (randint0(100 + rlev/2) < p_ptr->skill_sav) - { -#ifdef JP -msg_print("¤·¤«¤·¸úÎϤòÄ·¤ÍÊÖ¤·¤¿¡ª"); -#else - msg_print("You resist the effects!"); -#endif - learn_spell(MS_CAUSE_1); - } - else - { - curse_equipment(15, 0); - take_hit(DAMAGE_ATTACK, dam, ddesc, MS_CAUSE_1); - } + breath(y, x, m_idx, GF_CAUSE_1, dam, 0, FALSE, MS_CAUSE_1, learnable); break; } /* RF5_CAUSE_2 */ case 128+13: { - if (x!=px || y!=py) return (FALSE); - if (!direct) break; + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP if (blind) msg_format("%^s¤¬²¿¤«¤ò¤Ä¤Ö¤ä¤¤¤¿¡£", m_name); @@ -2785,28 +2662,14 @@ else msg_format("%^s #endif dam = damroll(8, 8); - if (randint0(100 + rlev/2) < p_ptr->skill_sav) - { -#ifdef JP -msg_print("¤·¤«¤·¸úÎϤòÄ·¤ÍÊÖ¤·¤¿¡ª"); -#else - msg_print("You resist the effects!"); -#endif - learn_spell(MS_CAUSE_2); - } - else - { - curse_equipment(25, MIN(rlev/2-15, 5)); - take_hit(DAMAGE_ATTACK, dam, ddesc, MS_CAUSE_2); - } + breath(y, x, m_idx, GF_CAUSE_2, dam, 0, FALSE, MS_CAUSE_2, learnable); break; } /* RF5_CAUSE_3 */ case 128+14: { - if (x!=px || y!=py) return (FALSE); - if (!direct) break; + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP if (blind) msg_format("%^s¤¬²¿¤«¤òÂçÀ¼¤Ç¶«¤ó¤À¡£", m_name); @@ -2821,28 +2684,14 @@ else msg_format("%^s #endif dam = damroll(10, 15); - if (randint0(100 + rlev/2) < p_ptr->skill_sav) - { -#ifdef JP -msg_print("¤·¤«¤·¸úÎϤòÄ·¤ÍÊÖ¤·¤¿¡ª"); -#else - msg_print("You resist the effects!"); -#endif - learn_spell(MS_CAUSE_3); - } - else - { - curse_equipment(33, MIN(rlev/2-15, 15)); - take_hit(DAMAGE_ATTACK, dam, ddesc, MS_CAUSE_3); - } + breath(y, x, m_idx, GF_CAUSE_3, dam, 0, FALSE, MS_CAUSE_3, learnable); break; } /* RF5_CAUSE_4 */ case 128+15: { - if (x!=px || y!=py) return (FALSE); - if (!direct) break; + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP if (blind) msg_format("%^s¤¬¡Ö¤ªÁ°¤Ï´û¤Ë»à¤ó¤Ç¤¤¤ë¡×¤È¶«¤ó¤À¡£", m_name); @@ -2857,27 +2706,14 @@ else msg_format("%^s #endif dam = damroll(15, 15); - if ((randint0(100 + rlev/2) < p_ptr->skill_sav) && !(m_ptr->r_idx == MON_KENSHIROU)) - { -#ifdef JP -msg_print("¤·¤«¤·È빦¤òÄ·¤ÍÊÖ¤·¤¿¡ª"); -#else - msg_print("You resist the effects!"); -#endif - learn_spell(MS_CAUSE_4); - } - else - { - take_hit(DAMAGE_ATTACK, dam, ddesc, MS_CAUSE_4); - (void)set_cut(p_ptr->cut + damroll(10, 10)); - } + breath(y, x, m_idx, GF_CAUSE_4, dam, 0, FALSE, MS_CAUSE_4, learnable); break; } /* RF5_BO_ACID */ case 128+16: { - if (x!=px || y!=py) return (FALSE); + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP if (blind) msg_format("%^s¤¬²¿¤«¤ò¤Ä¤Ö¤ä¤¤¤¿¡£", m_name); @@ -2901,7 +2737,7 @@ else msg_format("%^s /* RF5_BO_ELEC */ case 128+17: { - if (x!=px || y!=py) return (FALSE); + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP if (blind) msg_format("%^s¤¬²¿¤«¤ò¤Ä¤Ö¤ä¤¤¤¿¡£", m_name); @@ -2925,7 +2761,7 @@ else msg_format("%^s /* RF5_BO_FIRE */ case 128+18: { - if (x!=px || y!=py) return (FALSE); + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP if (blind) msg_format("%^s¤¬²¿¤«¤ò¤Ä¤Ö¤ä¤¤¤¿¡£", m_name); @@ -2949,7 +2785,7 @@ else msg_format("%^s /* RF5_BO_COLD */ case 128+19: { - if (x!=px || y!=py) return (FALSE); + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP if (blind) msg_format("%^s¤¬²¿¤«¤ò¤Ä¤Ö¤ä¤¤¤¿¡£", m_name); @@ -2995,7 +2831,7 @@ else msg_format("%^s /* RF5_BO_NETH */ case 128+21: { - if (x!=px || y!=py) return (FALSE); + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP if (blind) msg_format("%^s¤¬²¿¤«¤ò¤Ä¤Ö¤ä¤¤¤¿¡£", m_name); @@ -3019,7 +2855,7 @@ else msg_format("%^s /* RF5_BO_WATE */ case 128+22: { - if (x!=px || y!=py) return (FALSE); + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP if (blind) msg_format("%^s¤¬²¿¤«¤ò¤Ä¤Ö¤ä¤¤¤¿¡£", m_name); @@ -3042,7 +2878,7 @@ else msg_format("%^s /* RF5_BO_MANA */ case 128+23: { - if (x!=px || y!=py) return (FALSE); + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP if (blind) msg_format("%^s¤¬²¿¤«¤ò¤Ä¤Ö¤ä¤¤¤¿¡£", m_name); @@ -3065,7 +2901,7 @@ else msg_format("%^s /* RF5_BO_PLAS */ case 128+24: { - if (x!=px || y!=py) return (FALSE); + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP if (blind) msg_format("%^s¤¬²¿¤«¤ò¤Ä¤Ö¤ä¤¤¤¿¡£", m_name); @@ -3088,7 +2924,7 @@ else msg_format("%^s /* RF5_BO_ICEE */ case 128+25: { - if (x!=px || y!=py) return (FALSE); + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP if (blind) msg_format("%^s¤¬²¿¤«¤ò¤Ä¤Ö¤ä¤¤¤¿¡£", m_name); @@ -3112,7 +2948,7 @@ else msg_format("%^s /* RF5_MISSILE */ case 128+26: { - if (x!=px || y!=py) return (FALSE); + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP if (blind) msg_format("%^s¤¬²¿¤«¤ò¤Ä¤Ö¤ä¤¤¤¿¡£", m_name); @@ -3135,8 +2971,7 @@ else msg_format("%^s /* RF5_SCARE */ case 128+27: { - if (x!=px || y!=py) return (FALSE); - if (!direct) break; + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP if (blind) msg_format("%^s¤¬²¿¤«¤ò¤Ä¤Ö¤ä¤¯¤È¡¢¶²¤í¤·¤²¤Ê²»¤¬Ê¹¤³¤¨¤¿¡£", m_name); @@ -3180,8 +3015,7 @@ msg_print(" /* RF5_BLIND */ case 128+28: { - if (x!=px || y!=py) return (FALSE); - if (!direct) break; + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP if (blind) msg_format("%^s¤¬²¿¤«¤ò¤Ä¤Ö¤ä¤¤¤¿¡£", m_name); @@ -3225,8 +3059,7 @@ msg_print(" /* RF5_CONF */ case 128+29: { - if (x!=px || y!=py) return (FALSE); - if (!direct) break; + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP if (blind) msg_format("%^s¤¬²¿¤«¤ò¤Ä¤Ö¤ä¤¯¤È¡¢Æ¬¤òǺ¤Þ¤¹²»¤¬¤·¤¿¡£", m_name); @@ -3270,8 +3103,7 @@ msg_print(" /* RF5_SLOW */ case 128+30: { - if (x!=px || y!=py) return (FALSE); - if (!direct) break; + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP msg_format("%^s¤¬¤¢¤Ê¤¿¤Î¶ÚÎϤòµÛ¤¤¼è¤í¤¦¤È¤·¤¿¡ª", m_name); @@ -3309,8 +3141,7 @@ msg_print(" /* RF5_HOLD */ case 128+31: { - if (x!=px || y!=py) return (FALSE); - if (!direct) break; + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP if (blind) msg_format("%^s¤¬²¿¤«¤ò¤Ä¤Ö¤ä¤¤¤¿¡£", m_name); @@ -3367,7 +3198,7 @@ msg_format("%^s else { #ifdef JP -msg_format("%^s¤¬¼«Ê¬¤ÎÂΤËÇ°¤òÁ÷¤Ã¤¿¡£", m_name, m_poss); +msg_format("%^s¤¬¼«Ê¬¤ÎÂΤËÇ°¤òÁ÷¤Ã¤¿¡£", m_name); #else msg_format("%^s concentrates on %s body.", m_name, m_poss); #endif @@ -3375,54 +3206,29 @@ msg_format("%^s } /* Allow quick speed increases to base+10 */ - if (!m_ptr->fast) + if (set_monster_fast(m_idx, MON_FAST(m_ptr) + 100)) { #ifdef JP -msg_format("%^s¤ÎÆ°¤­¤¬Â®¤¯¤Ê¤Ã¤¿¡£", m_name); + msg_format("%^s¤ÎÆ°¤­¤¬Â®¤¯¤Ê¤Ã¤¿¡£", m_name); #else msg_format("%^s starts moving faster.", m_name); #endif } - m_ptr->fast = MIN(200, m_ptr->fast + 100); - if (p_ptr->riding == m_idx) p_ptr->update |= PU_BONUS; break; } /* RF6_HAND_DOOM */ case 160+1: { - if (x!=px || y!=py) return (FALSE); + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP -msg_format("%^s¤¬ÇËÌǤμê¤òÊü¤Ã¤¿¡ª", m_name); +msg_format("%^s¤¬<ÇËÌǤμê>¤òÊü¤Ã¤¿¡ª", m_name); #else msg_format("%^s invokes the Hand of Doom!", m_name); #endif - - if (randint0(100 + rlev/2) < p_ptr->skill_sav) - { -#ifdef JP -msg_format("¤·¤«¤·¸úÎϤòÄ·¤ÍÊÖ¤·¤¿¡ª"); -#else - msg_format("You resist the effects!"); -#endif - learn_spell(MS_HAND_DOOM); - - } - else - { - int dummy = (((s32b) ((40 + randint1(20)) * (p_ptr->chp))) / 100); -#ifdef JP -msg_print("¤¢¤Ê¤¿¤ÏÌ¿¤¬Çö¤Þ¤Ã¤Æ¤¤¤¯¤è¤¦¤Ë´¶¤¸¤¿¡ª"); -#else - msg_print("Your feel your life fade away!"); -#endif - - take_hit(DAMAGE_ATTACK, dummy, m_name, MS_HAND_DOOM); - curse_equipment(40, 20); - - if (p_ptr->chp < 1) p_ptr->chp = 1; - } + dam = (((s32b) ((40 + randint1(20)) * (p_ptr->chp))) / 100); + breath(y, x, m_idx, GF_HAND_DOOM, dam, 0, FALSE, MS_HAND_DOOM, learnable); break; } @@ -3510,18 +3316,17 @@ msg_format("%^s if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH); /* Cancel fear */ - if (m_ptr->monfear) + if (MON_MONFEAR(m_ptr)) { /* Cancel fear */ - m_ptr->monfear = 0; + (void)set_monster_monfear(m_idx, 0); /* Message */ #ifdef JP -msg_format("%^s¤Ïͦµ¤¤ò¼è¤êÌᤷ¤¿¡£", m_name, m_poss); + msg_format("%^s¤Ïͦµ¤¤ò¼è¤êÌᤷ¤¿¡£", m_name); #else msg_format("%^s recovers %s courage.", m_name, m_poss); #endif - } break; } @@ -3551,11 +3356,7 @@ msg_format("%s } - if (!(m_ptr->invulner)) - m_ptr->invulner = randint1(4) + 4; - - if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH); - if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH); + if (!MON_INVULNER(m_ptr)) (void)set_monster_invulner(m_idx, randint1(4) + 4, FALSE); break; } @@ -3569,64 +3370,22 @@ msg_format("%^s msg_format("%^s blinks away.", m_name); #endif - teleport_away(m_idx, 10, FALSE); - p_ptr->update |= (PU_MONSTERS | PU_MON_LITE); + teleport_away(m_idx, 10, 0L); + p_ptr->update |= (PU_MONSTERS); break; } /* RF6_TPORT */ case 160+5: { - int i, oldfy, oldfx; - u32b f1 = 0 , f2 = 0 , f3 = 0; - object_type *o_ptr; - - oldfy = m_ptr->fy; - oldfx = m_ptr->fx; - disturb(1, 0); #ifdef JP -msg_format("%^s¤¬¥Æ¥ì¥Ý¡¼¥È¤·¤¿¡£", m_name); + msg_format("%^s¤¬¥Æ¥ì¥Ý¡¼¥È¤·¤¿¡£", m_name); #else msg_format("%^s teleports away.", m_name); #endif - teleport_away(m_idx, MAX_SIGHT * 2 + 5, FALSE); - - if (los(py, px, oldfy, oldfx) && !world_monster) - { - for (i=INVEN_RARM;imuta1 & MUT1_VTELEPORT) || (p_ptr->pclass == CLASS_IMITATOR)) - { -#ifdef JP - if(get_check_strict("¤Ä¤¤¤Æ¤¤¤­¤Þ¤¹¤«¡©", CHECK_OKAY_CANCEL)) -#else - if(get_check_strict("Do you follow it? ", CHECK_OKAY_CANCEL)) -#endif - { - if (one_in_(3)) - { - teleport_player(200); -#ifdef JP - msg_print("¼ºÇÔ¡ª"); -#else - msg_print("Failed!"); -#endif - } - else teleport_player_to(m_ptr->fy, m_ptr->fx, TRUE); - p_ptr->energy_need += ENERGY_NEED(); - } - break; - } - } - } - } + teleport_away_followable(m_idx); break; } @@ -3648,16 +3407,12 @@ msg_format("%^s int k; disturb(1, 0); - switch(m_ptr->r_idx) + switch (m_ptr->r_idx) { case MON_OHMU: - if (p_ptr->inside_arena || p_ptr->inside_battle) return FALSE; - for (k = 0; k < 6; k++) - { - count += summon_specific(m_idx, m_ptr->fy, m_ptr->fx, rlev, SUMMON_BIZARRE1, PM_ALLOW_GROUP); - } + /* Moved to process_monster(), like multiplication */ return FALSE; - + case MON_BANORLUPART: { int dummy_hp = (m_ptr->hp + 1) / 2; @@ -3682,8 +3437,9 @@ msg_format("%^s break; } - case MON_BANOR: - case MON_LUPART: + + case MON_BANOR: + case MON_LUPART: { int dummy_hp = 0; int dummy_maxhp = 0; @@ -3717,7 +3473,105 @@ msg_format("%^s break; } - default: return FALSE; + + case MON_ROLENTO: +#ifdef JP + if (blind) msg_format("%^s¤¬²¿¤«ÂçÎ̤ËÅꤲ¤¿¡£", m_name); + else msg_format("%^s¤Ï¼êÜØÃƤò¤Ð¤é¤Þ¤¤¤¿¡£", m_name); +#else + if (blind) msg_format("%^s spreads something.", m_name); + else msg_format("%^s throws some hand grenades.", m_name); +#endif + + { + int num = 1 + randint1(3); + + for (k = 0; k < num; k++) + { + count += summon_named_creature(m_idx, y, x, MON_SHURYUUDAN, mode); + } + } +#ifdef JP + if (blind && count) msg_print("¿¤¯¤Î¤â¤Î¤¬´Ö¶á¤Ë¤Ð¤é¤Þ¤«¤ì¤ë²»¤¬¤¹¤ë¡£"); +#else + if (blind && count) msg_print("You hear many things are scattered nearby."); +#endif + break; + + default: + if (r_ptr->d_char == 'B') + { + disturb(1, 0); + if (one_in_(3) || !direct) + { +#ifdef JP + msg_format("%^s¤ÏÆÍÁ³»ë³¦¤«¤é¾Ã¤¨¤¿!", m_name); +#else + msg_format("%^s suddenly go out of your sight!", m_name); +#endif + teleport_away(m_idx, 10, TELEPORT_NONMAGICAL); + p_ptr->update |= (PU_MONSTERS); + } + else + { + int get_damage = 0; + bool fear; /* dummy */ + +#ifdef JP + msg_format("%^s¤¬¤¢¤Ê¤¿¤òÄϤó¤Ç¶õÃ椫¤éÅꤲÍî¤È¤·¤¿¡£", m_name); +#else + msg_format("%^s holds you, and drops from the sky.", m_name); +#endif + dam = damroll(4, 8); + teleport_player_to(m_ptr->fy, m_ptr->fx, TELEPORT_NONMAGICAL | TELEPORT_PASSIVE); + + sound(SOUND_FALL); + + if (p_ptr->levitation) + { +#ifdef JP + msg_print("¤¢¤Ê¤¿¤ÏÀŤ«¤ËÃåÃϤ·¤¿¡£"); +#else + msg_print("You float gently down to the ground."); +#endif + } + else + { +#ifdef JP + msg_print("¤¢¤Ê¤¿¤ÏÃÏÌ̤Ë᤭¤Ä¤±¤é¤ì¤¿¡£"); +#else + msg_print("You crashed into the ground."); +#endif + dam += damroll(6, 8); + } + + /* Mega hack -- this special action deals damage to the player. Therefore the code of "eyeeye" is necessary. + -- henkma + */ + get_damage = take_hit(DAMAGE_NOESCAPE, dam, m_name, -1); + if (p_ptr->tim_eyeeye && get_damage > 0 && !p_ptr->is_dead) + { +#ifdef JP + msg_format("¹¶·â¤¬%s¼«¿È¤ò½ý¤Ä¤±¤¿¡ª", m_name); +#else + char m_name_self[80]; + + /* hisself */ + monster_desc(m_name_self, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE); + + msg_format("The attack of %s has wounded %s!", m_name, m_name_self); +#endif + project(0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL, -1); + set_tim_eyeeye(p_ptr->tim_eyeeye-5, TRUE); + } + + if (p_ptr->riding) mon_take_hit_mon(p_ptr->riding, dam, &fear, extract_note_dies(real_r_ptr(&m_list[p_ptr->riding])), m_idx); + } + break; + } + + /* Something is wrong */ + else return FALSE; } break; } @@ -3725,8 +3579,7 @@ msg_format("%^s /* RF6_TELE_TO */ case 160+8: { - if (x!=px || y!=py) return (FALSE); - if (!direct) break; + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP msg_format("%^s¤¬¤¢¤Ê¤¿¤ò°ú¤­Ìᤷ¤¿¡£", m_name); @@ -3734,7 +3587,7 @@ msg_format("%^s msg_format("%^s commands you to return.", m_name); #endif - teleport_player_to(m_ptr->fy, m_ptr->fx, TRUE); + teleport_player_to(m_ptr->fy, m_ptr->fx, TELEPORT_PASSIVE); learn_spell(MS_TELE_TO); break; } @@ -3742,8 +3595,7 @@ msg_format("%^s /* RF6_TELE_AWAY */ case 160+9: { - if (x!=px || y!=py) return (FALSE); - if (!direct) break; + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP msg_format("%^s¤Ë¥Æ¥ì¥Ý¡¼¥È¤µ¤»¤é¤ì¤¿¡£", m_name); @@ -3754,15 +3606,14 @@ msg_format("%^s #endif learn_spell(MS_TELE_AWAY); - teleport_player(100); + teleport_player_away(m_idx, 100); break; } /* RF6_TELE_LEVEL */ case 160+10: { - if (x!=px || y!=py) return (FALSE); - if (!direct) break; + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP if (blind) msg_format("%^s¤¬²¿¤«´ñ̯¤Ê¸ÀÍÕ¤ò¤Ä¤Ö¤ä¤¤¤¿¡£", m_name); @@ -3796,7 +3647,7 @@ msg_print(" } else { - teleport_player_level(); + teleport_level(0); } learn_spell(MS_TELE_LEVEL); update_smart_learn(m_idx, DRS_NEXUS); @@ -3806,7 +3657,7 @@ msg_print(" /* RF6_PSY_SPEAR */ case 160+11: { - if (x!=px || y!=py) return (FALSE); + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP if (blind) msg_format("%^s¤¬²¿¤«¤ò¤Ä¤Ö¤ä¤¤¤¿¡£", m_name); @@ -3828,36 +3679,34 @@ else msg_format("%^s /* RF6_DARKNESS */ case 160+12: { - if (x!=px || y!=py) return (FALSE); - if (!direct) break; + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP -if (blind) msg_format("%^s¤¬²¿¤«¤ò¤Ä¤Ö¤ä¤¤¤¿¡£", m_name); + if (blind) msg_format("%^s¤¬²¿¤«¤ò¤Ä¤Ö¤ä¤¤¤¿¡£", m_name); #else if (blind) msg_format("%^s mumbles.", m_name); #endif #ifdef JP -else if (p_ptr->pclass == CLASS_NINJA) msg_format("%^s¤¬ÊÕ¤ê¤òÌÀ¤ë¤¯¾È¤é¤·¤¿¡£", m_name); -else msg_format("%^s¤¬°Å°Ç¤ÎÃæ¤Ç¼ê¤ò¿¶¤Ã¤¿¡£", m_name); + else if (can_use_lite_area) msg_format("%^s¤¬ÊÕ¤ê¤òÌÀ¤ë¤¯¾È¤é¤·¤¿¡£", m_name); + else msg_format("%^s¤¬°Å°Ç¤ÎÃæ¤Ç¼ê¤ò¿¶¤Ã¤¿¡£", m_name); #else - else if (p_ptr->pclass == CLASS_NINJA) - msg_format("%^s cast a spell to light up.", m_name); + else if (can_use_lite_area) msg_format("%^s cast a spell to light up.", m_name); else msg_format("%^s gestures in shadow.", m_name); #endif - learn_spell(MS_DARKNESS); - if (p_ptr->pclass == CLASS_NINJA) - (void)lite_area(0, 3); + if (can_use_lite_area) (void)lite_area(0, 3); else + { + learn_spell(MS_DARKNESS); (void)unlite_area(0, 3); + } break; } /* RF6_TRAPS */ case 160+13: { - if (!direct) break; disturb(1, 0); #ifdef JP if (blind) msg_format("%^s¤¬²¿¤«¤ò¤Ä¤Ö¤ä¤¤¤Æ¼Ù°­¤ËÈù¾Ð¤ó¤À¡£", m_name); @@ -3879,8 +3728,7 @@ else msg_format("%^s /* RF6_FORGET */ case 160+14: { - if (x!=px || y!=py) return (FALSE); - if (!direct) break; + if (!direct) return (FALSE); disturb(1, 0); #ifdef JP msg_format("%^s¤¬¤¢¤Ê¤¿¤Îµ­²±¤ò¾Ãµî¤·¤è¤¦¤È¤·¤Æ¤¤¤ë¡£", m_name); @@ -3930,25 +3778,11 @@ else msg_format("%^s break; } - /* RF6_SUMMON_KIN */ + /* RF6_S_KIN */ case 160+16: { disturb(1, 0); - if (m_ptr->r_idx == MON_ROLENTO) - { -#ifdef JP - if (blind) - msg_format("%^s¤¬²¿¤«ÂçÎ̤ËÅꤲ¤¿¡£", m_name); - else - msg_format("%^s¤Ï¼êÜØÃƤò¤Ð¤é¤Þ¤¤¤¿¡£", m_name); -#else - if (blind) - msg_format("%^s spreads something.", m_name); - else - msg_format("%^s throws some hand grenades.", m_name); -#endif - } - else if (m_ptr->r_idx == MON_SERPENT || m_ptr->r_idx == MON_ZOMBI_SERPENT) + if (m_ptr->r_idx == MON_SERPENT || m_ptr->r_idx == MON_ZOMBI_SERPENT) { #ifdef JP if (blind) @@ -3983,75 +3817,87 @@ else msg_format("%^s #endif } - if(m_ptr->r_idx == MON_ROLENTO) + switch (m_ptr->r_idx) { - int num = 1 + randint1(3); - - for (k = 0; k < num; k++) - { - count += summon_named_creature(m_idx, y, x, MON_SHURYUUDAN, mode); - } - } - else if(m_ptr->r_idx == MON_LOUSY) - { - int num = 2 + randint1(3); - for (k = 0; k < num; k++) + case MON_MENELDOR: + case MON_GWAIHIR: + case MON_THORONDOR: { - count += summon_specific(m_idx, y, x, rlev, SUMMON_LOUSE, PM_ALLOW_GROUP); - } - } - else if(m_ptr->r_idx == MON_BULLGATES) - { - int num = 2 + randint1(3); - for (k = 0; k < num; k++) - { - count += summon_named_creature(m_idx, y, x, 921, mode); + int num = 4 + randint1(3); + for (k = 0; k < num; k++) + { + count += summon_specific(m_idx, y, x, rlev, SUMMON_EAGLES, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE)); + } } - } - else if (m_ptr->r_idx == MON_CALDARM) - { - int num = randint1(3); - for (k = 0; k < num; k++) + break; + + case MON_BULLGATES: { - count += summon_named_creature(m_idx, y, x, 930, mode); + int num = 2 + randint1(3); + for (k = 0; k < num; k++) + { + count += summon_named_creature(m_idx, y, x, MON_IE, mode); + } } - } - else if (m_ptr->r_idx == MON_SERPENT || m_ptr->r_idx == MON_ZOMBI_SERPENT) - { - int num = 2 + randint1(3); + break; - if (r_info[MON_JORMUNGAND].cur_num < r_info[MON_JORMUNGAND].max_num && one_in_(6)) + case MON_SERPENT: + case MON_ZOMBI_SERPENT: { + int num = 2 + randint1(3); + + if (r_info[MON_JORMUNGAND].cur_num < r_info[MON_JORMUNGAND].max_num && one_in_(6)) + { #ifdef JP - msg_print("ÃÏÌ̤«¤é¿å¤¬¿á¤­½Ð¤·¤¿¡ª"); + msg_print("ÃÏÌ̤«¤é¿å¤¬¿á¤­½Ð¤·¤¿¡ª"); #else - msg_print("Water blew off from the ground!"); + msg_print("Water blew off from the ground!"); #endif - fire_ball_hide(GF_WATER_FLOW, 0, 3, 8); + fire_ball_hide(GF_WATER_FLOW, 0, 3, 8); + } + + for (k = 0; k < num; k++) + { + count += summon_specific(m_idx, y, x, rlev, SUMMON_GUARDIANS, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE)); + } } + break; - for (k = 0; k < num; k++) + case MON_CALDARM: { - count += summon_specific(m_idx, y, x, rlev, SUMMON_GUARDIANS, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE)); + int num = randint1(3); + for (k = 0; k < num; k++) + { + count += summon_named_creature(m_idx, y, x, MON_LOCKE_CLONE, mode); + } } - } - else - { + break; + case MON_LOUSY: + { + int num = 2 + randint1(3); + for (k = 0; k < num; k++) + { + count += summon_specific(m_idx, y, x, rlev, SUMMON_LOUSE, PM_ALLOW_GROUP); + } + } + break; + + default: summon_kin_type = r_ptr->d_char; /* Big hack */ for (k = 0; k < 4; k++) { count += summon_specific(m_idx, y, x, rlev, SUMMON_KIN, PM_ALLOW_GROUP); } + break; } #ifdef JP -if (blind && count) msg_print("¿¤¯¤Î¤â¤Î¤¬´Ö¶á¤Ë¸½¤ì¤¿²»¤¬¤¹¤ë¡£"); + if (blind && count) msg_print("¿¤¯¤Î¤â¤Î¤¬´Ö¶á¤Ë¸½¤ì¤¿²»¤¬¤¹¤ë¡£"); #else if (blind && count) msg_print("You hear many things appear nearby."); #endif - break; } @@ -4415,17 +4261,17 @@ else msg_format("%^s for (k = 0; k < 30; k++) { - if (!summon_possible(cy, cx) || !cave_floor_bold(cy, cx)) + if (!summon_possible(cy, cx) || !cave_empty_bold(cy, cx)) { int j; for (j = 100; j > 0; j--) { scatter(&cy, &cx, y, x, 2, 0); - if (cave_floor_bold(cy, cx)) break; + if (cave_empty_bold(cy, cx)) break; } if (!j) break; } - if (!cave_floor_bold(cy, cx)) continue; + if (!cave_empty_bold(cy, cx)) continue; if (summon_named_creature(m_idx, cy, cx, MON_NAZGUL, mode)) { @@ -4448,7 +4294,7 @@ msg_format(" } } #ifdef JP -msg_format("¡Ö%dɤ¤½¤í¤Ã¤Æ¡¢¥ê¥ó¥°¥ì¥ó¥¸¥ã¡¼¡ª¡×", count); +msg_format("¡Ö%d¿Í¤½¤í¤Ã¤Æ¡¢¥ê¥ó¥°¥ì¥ó¥¸¥ã¡¼¡ª¡×", count); #else msg_format("They say 'The %d meets! We are the Ring-Ranger!'.", count); #endif @@ -4554,6 +4400,9 @@ msg_print(" /* RF6_S_UNIQUE */ case 160+31: { + bool uniques_are_summoned = FALSE; + int non_unique_type = SUMMON_HI_UNDEAD; + disturb(1, 0); #ifdef JP if (blind) msg_format("%^s¤¬²¿¤«¤ò¤Ä¤Ö¤ä¤¤¤¿¡£", m_name); @@ -4571,28 +4420,26 @@ else msg_format("%^s { count += summon_specific(m_idx, y, x, rlev, SUMMON_UNIQUE, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE)); } - if (r_ptr->flags3 & RF3_GOOD) - { - for (k = count; k < s_num_4; k++) - { - count += summon_specific(m_idx, y, x, rlev, SUMMON_ANGEL, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE)); - } - } - else + + if (count) uniques_are_summoned = TRUE; + + if ((m_ptr->sub_align & (SUB_ALIGN_GOOD | SUB_ALIGN_EVIL)) == (SUB_ALIGN_GOOD | SUB_ALIGN_EVIL)) + non_unique_type = 0; + else if (m_ptr->sub_align & SUB_ALIGN_GOOD) + non_unique_type = SUMMON_ANGEL; + + for (k = count; k < s_num_4; k++) { - for (k = count; k < s_num_4; k++) - { - count += summon_specific(m_idx, y, x, rlev, SUMMON_HI_UNDEAD, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE)); - } + count += summon_specific(m_idx, y, x, rlev, non_unique_type, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE)); } + if (blind && count) { #ifdef JP -msg_print("¿¤¯¤ÎÎ϶¯¤¤¤â¤Î¤¬´Ö¶á¤Ë¸½¤ì¤¿²»¤¬Ê¹¤³¤¨¤ë¡£"); + msg_format("¿¤¯¤Î%s¤¬´Ö¶á¤Ë¸½¤ì¤¿²»¤¬Ê¹¤³¤¨¤ë¡£", uniques_are_summoned ? "Î϶¯¤¤¤â¤Î" : "¤â¤Î"); #else - msg_print("You hear many powerful things appear nearby."); + msg_format("You hear many %s appear nearby.", uniques_are_summoned ? "powerful things" : "things"); #endif - } break; } @@ -4605,7 +4452,7 @@ msg_print("¿ if (seen && maneable && !world_monster && (p_ptr->pclass == CLASS_IMITATOR)) { - if (thrown_spell != 167) + if (thrown_spell != 167) /* Not RF6_SPECIAL */ { if (p_ptr->mane_num == MAX_MANE) { @@ -4622,18 +4469,18 @@ msg_print("¿ p_ptr->mane_num++; new_mane = TRUE; - p_ptr->redraw |= (PR_MANE); + p_ptr->redraw |= (PR_IMITATION); } } /* Remember what the monster did to us */ - if (seen) + if (can_remember) { /* Inate spell */ if (thrown_spell < 32 * 4) { r_ptr->r_flags4 |= (1L << (thrown_spell - 32 * 3)); - if (r_ptr->r_cast_inate < MAX_UCHAR) r_ptr->r_cast_inate++; + if (r_ptr->r_cast_spell < MAX_UCHAR) r_ptr->r_cast_spell++; } /* Bolt or Ball */ @@ -4655,7 +4502,7 @@ msg_print("¿ /* Always take note of monsters that kill you */ if (p_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !p_ptr->inside_arena) { - r_ptr->r_deaths++; + r_ptr->r_deaths++; /* Ignore appearance difference */ } /* A spell was cast */