X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fspells1.c;h=a9a553fb71091df44bc27844d7e96532447e1ae9;hb=1d0022aa1efbb7530b09b3d3428f842c6fdc7527;hp=1e0c3177e47b08d90465eaac8c72496f4fac085c;hpb=a2d8dd49e5e6ba0d60778e2002fb30dab417d7b7;p=hengband%2Fhengband.git diff --git a/src/spells1.c b/src/spells1.c index 1e0c3177e..a9a553fb7 100644 --- a/src/spells1.c +++ b/src/spells1.c @@ -201,18 +201,18 @@ const magic_type technic_info[NUM_TECHNIC][32] = * @param cury 現在の鏡のy座標 * @param curx 現在の鏡のx座標 */ -static void next_mirror(POSITION* next_y, POSITION* next_x, POSITION cury, POSITION curx) +static void next_mirror(player_type *creature_ptr, POSITION* next_y, POSITION* next_x, POSITION cury, POSITION curx) { POSITION mirror_x[10], mirror_y[10]; /* 鏡はもっと少ない */ int mirror_num = 0; /* 鏡の数 */ POSITION x, y; int num; - for (x = 0; x < current_floor_ptr->width; x++) + for (x = 0; x < creature_ptr->current_floor_ptr->width; x++) { - for (y = 0; y < current_floor_ptr->height; y++) + for (y = 0; y < creature_ptr->current_floor_ptr->height; y++) { - if (is_mirror_grid(¤t_floor_ptr->grid_array[y][x])) { + if (is_mirror_grid(&creature_ptr->current_floor_ptr->grid_array[y][x])) { mirror_y[mirror_num] = y; mirror_x[mirror_num] = x; mirror_num++; @@ -245,6 +245,7 @@ static POSITION monster_target_y; /*!< モンスターの攻撃目標Y座標 */ /*! * @brief 汎用的なビーム/ボルト/ボール系による地形効果処理 / We are called from "project()" to "damage" terrain features + * @param caster_ptr プレーヤーへの参照ポインタ * @param who 魔法を発動したモンスター(0ならばプレイヤー) / Index of "source" monster (zero for "player") * @param r 効果半径(ビーム/ボルト = 0 / ボール = 1以上) / Radius of explosion (0 = beam/bolt, 1 to 9 = ball) * @param y 目標Y座標 / Target y location (or location to travel "towards") @@ -268,22 +269,21 @@ static POSITION monster_target_y; /*!< モンスターの攻撃目標Y座標 */ * Perhaps we should affect doors? * */ -static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_POINT dam, EFFECT_ID typ) +static bool project_f(player_type *caster_ptr, MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_POINT dam, EFFECT_ID typ) { - grid_type *g_ptr = ¤t_floor_ptr->grid_array[y][x]; + floor_type *floor_ptr = caster_ptr->current_floor_ptr; + grid_type *g_ptr = &floor_ptr->grid_array[y][x]; feature_type *f_ptr = &f_info[g_ptr->feat]; bool obvious = FALSE; - bool known = player_has_los_bold(y, x); - + bool known = player_has_los_bold(caster_ptr, y, x); who = who ? who : 0; /* Reduce damage by distance */ dam = (dam + r) / (r + 1); - - if (have_flag(f_ptr->flags, FF_TREE)) +if (have_flag(f_ptr->flags, FF_TREE)) { concptr message; switch (typ) @@ -321,7 +321,7 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P if (message) { msg_format(_("木は%s。", "A tree %s"), message); - cave_set_feat(y, x, one_in_(3) ? feat_brake : feat_grass); + cave_set_feat(caster_ptr, y, x, one_in_(3) ? feat_brake : feat_grass); /* Observe */ if (g_ptr->info & (CAVE_MARK)) obvious = TRUE; @@ -373,7 +373,7 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P if (is_hidden_door(g_ptr)) { /* Pick a door */ - disclose_grid(y, x); + disclose_grid(caster_ptr, y, x); /* Check line of sight */ if (known) @@ -393,7 +393,7 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P } /* Destroy the trap */ - cave_alter_feat(y, x, FF_DISARM); + cave_alter_feat(caster_ptr, y, x, FF_DISARM); } /* Locked doors are unlocked */ @@ -402,7 +402,7 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P FEAT_IDX old_feat = g_ptr->feat; /* Unlock the door */ - cave_alter_feat(y, x, FF_DISARM); + cave_alter_feat(caster_ptr, y, x, FF_DISARM); /* Check line of sound */ if (known && (old_feat != g_ptr->feat)) @@ -413,7 +413,7 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P } /* Remove "unsafe" flag if player is not blind */ - if (!p_ptr->blind && player_has_los_bold(y, x)) + if (!caster_ptr->blind && player_has_los_bold(caster_ptr, y, x)) { g_ptr->info &= ~(CAVE_UNSAFE); lite_spot(y, x); @@ -437,11 +437,11 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P } /* Destroy the feature */ - cave_alter_feat(y, x, FF_TUNNEL); + cave_alter_feat(caster_ptr, y, x, FF_TUNNEL); } /* Remove "unsafe" flag if player is not blind */ - if (!p_ptr->blind && player_has_los_bold(y, x)) + if (!caster_ptr->blind && player_has_los_bold(caster_ptr, y, x)) { g_ptr->info &= ~(CAVE_UNSAFE); lite_spot(y, x); @@ -458,7 +458,7 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P s16b old_mimic = g_ptr->mimic; feature_type *mimic_f_ptr = &f_info[get_feat_mimic(g_ptr)]; - cave_alter_feat(y, x, FF_SPIKE); + cave_alter_feat(caster_ptr, y, x, FF_SPIKE); g_ptr->mimic = old_mimic; note_spot(y, x); @@ -471,6 +471,7 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P obvious = TRUE; } } + break; } @@ -486,8 +487,8 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P } /* Destroy the wall */ - cave_alter_feat(y, x, FF_HURT_ROCK); - p_ptr->update |= (PU_FLOW); + cave_alter_feat(caster_ptr, y, x, FF_HURT_ROCK); + caster_ptr->update |= (PU_FLOW); } break; @@ -495,31 +496,31 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P case GF_MAKE_DOOR: { - if (!cave_naked_bold(y, x)) break; - if (player_bold(y, x)) break; - cave_set_feat(y, x, feat_door[DOOR_DOOR].closed); + if (!cave_naked_bold(caster_ptr, floor_ptr, y, x)) break; + if (player_bold(caster_ptr, y, x)) break; + cave_set_feat(caster_ptr, y, x, feat_door[DOOR_DOOR].closed); if (g_ptr->info & (CAVE_MARK)) obvious = TRUE; break; } case GF_MAKE_TRAP: { - place_trap(y, x); + place_trap(caster_ptr, y, x); break; } case GF_MAKE_TREE: { - if (!cave_naked_bold(y, x)) break; - if (player_bold(y, x)) break; - cave_set_feat(y, x, feat_tree); + if (!cave_naked_bold(caster_ptr, floor_ptr, y, x)) break; + if (player_bold(caster_ptr, y, x)) break; + cave_set_feat(caster_ptr, y, x, feat_tree); if (g_ptr->info & (CAVE_MARK)) obvious = TRUE; break; } case GF_MAKE_GLYPH: { - if (!cave_naked_bold(y, x)) break; + if (!cave_naked_bold(caster_ptr, floor_ptr, y, x)) break; g_ptr->info |= CAVE_OBJECT; g_ptr->mimic = feat_glyph; note_spot(y, x); @@ -529,9 +530,9 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P case GF_STONE_WALL: { - if (!cave_naked_bold(y, x)) break; - if (player_bold(y, x)) break; - cave_set_feat(y, x, feat_granite); + if (!cave_naked_bold(caster_ptr, floor_ptr, y, x)) break; + if (player_bold(caster_ptr, y, x)) break; + cave_set_feat(caster_ptr, y, x, feat_granite); break; } @@ -541,12 +542,13 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P if (dam == 1) { if (!have_flag(f_ptr->flags, FF_FLOOR)) break; - cave_set_feat(y, x, feat_shallow_lava); + cave_set_feat(caster_ptr, y, x, feat_shallow_lava); } else if (dam) { - cave_set_feat(y, x, feat_deep_lava); + cave_set_feat(caster_ptr, y, x, feat_deep_lava); } + break; } @@ -556,12 +558,13 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P if (dam == 1) { if (!have_flag(f_ptr->flags, FF_FLOOR)) break; - cave_set_feat(y, x, feat_shallow_water); + cave_set_feat(caster_ptr, y, x, feat_shallow_water); } else if (dam) { - cave_set_feat(y, x, feat_deep_water); + cave_set_feat(caster_ptr, y, x, feat_deep_water); } + break; } @@ -570,23 +573,23 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P case GF_LITE: { /* Turn on the light */ - if (!(d_info[p_ptr->dungeon_idx].flags1 & DF1_DARKNESS)) + if (!(d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS)) { g_ptr->info |= (CAVE_GLOW); note_spot(y, x); lite_spot(y, x); - update_local_illumination(y, x); + update_local_illumination(caster_ptr, y, x); /* Observe */ - if (player_can_see_bold(y, x)) obvious = TRUE; + if (player_can_see_bold(caster_ptr, y, x)) obvious = TRUE; /* Mega-Hack -- Update the monster in the affected grid */ /* This allows "spear of light" (etc) to work "correctly" */ - if (g_ptr->m_idx) update_monster(g_ptr->m_idx, FALSE); + if (g_ptr->m_idx) update_monster(caster_ptr, g_ptr->m_idx, FALSE); - if (p_ptr->special_defense & NINJA_S_STEALTH) + if (caster_ptr->special_defense & NINJA_S_STEALTH) { - if (player_bold(y, x)) set_superstealth(p_ptr, FALSE); + if (player_bold(caster_ptr, y, x)) set_superstealth(caster_ptr, FALSE); } } @@ -597,22 +600,22 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P case GF_DARK_WEAK: case GF_DARK: { - bool do_dark = !p_ptr->phase_out && !is_mirror_grid(g_ptr); + bool do_dark = !caster_ptr->phase_out && !is_mirror_grid(g_ptr); int j; /* Turn off the light. */ if (do_dark) { - if (current_floor_ptr->dun_level || !is_daytime()) + if (floor_ptr->dun_level || !is_daytime()) { for (j = 0; j < 9; j++) { int by = y + ddy_ddd[j]; int bx = x + ddx_ddd[j]; - if (in_bounds2(by, bx)) + if (in_bounds2(floor_ptr, by, bx)) { - grid_type *cc_ptr = ¤t_floor_ptr->grid_array[by][bx]; + grid_type *cc_ptr = &floor_ptr->grid_array[by][bx]; if (have_flag(f_info[get_feat_mimic(cc_ptr)].flags, FF_GLOW)) { @@ -638,13 +641,13 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P lite_spot(y, x); - update_local_illumination(y, x); + update_local_illumination(caster_ptr, y, x); - if (player_can_see_bold(y, x)) obvious = TRUE; + if (player_can_see_bold(caster_ptr, y, x)) obvious = TRUE; /* Mega-Hack -- Update the monster in the affected grid */ /* This allows "spear of light" (etc) to work "correctly" */ - if (g_ptr->m_idx) update_monster(g_ptr->m_idx, FALSE); + if (g_ptr->m_idx) update_monster(caster_ptr, g_ptr->m_idx, FALSE); } /* All done */ @@ -656,49 +659,51 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P { if (is_mirror_grid(g_ptr)) { - msg_print(_("鏡が割れた!", "The mirror was crashed!")); + msg_print(_("鏡が割れた!", "The mirror was shattered!")); sound(SOUND_GLASS); - remove_mirror(y, x); - project(0, 2, y, x, p_ptr->lev / 2 + 5, GF_SHARDS, (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP | PROJECT_NO_HANGEKI), -1); + remove_mirror(caster_ptr, y, x); + project(caster_ptr, 0, 2, y, x, caster_ptr->lev / 2 + 5, GF_SHARDS, (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP | PROJECT_NO_HANGEKI), -1); } if (have_flag(f_ptr->flags, FF_GLASS) && !have_flag(f_ptr->flags, FF_PERMANENT) && (dam >= 50)) { if (known && (g_ptr->info & CAVE_MARK)) { - msg_format(_("%sが割れた!", "The %s was crashed!"), f_name + f_info[get_feat_mimic(g_ptr)].name); + msg_format(_("%sが割れた!", "The %s crumbled!"), f_name + f_info[get_feat_mimic(g_ptr)].name); sound(SOUND_GLASS); } /* Destroy the wall */ - cave_alter_feat(y, x, FF_HURT_ROCK); - p_ptr->update |= (PU_FLOW); + cave_alter_feat(caster_ptr, y, x, FF_HURT_ROCK); + caster_ptr->update |= (PU_FLOW); } + break; } case GF_SOUND: { - if (is_mirror_grid(g_ptr) && p_ptr->lev < 40) + if (is_mirror_grid(g_ptr) && caster_ptr->lev < 40) { - msg_print(_("鏡が割れた!", "The mirror was crashed!")); + msg_print(_("鏡が割れた!", "The mirror was shattered!")); sound(SOUND_GLASS); - remove_mirror(y, x); - project(0, 2, y, x, p_ptr->lev / 2 + 5, GF_SHARDS, (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP | PROJECT_NO_HANGEKI), -1); + remove_mirror(caster_ptr, y, x); + project(caster_ptr, 0, 2, y, x, caster_ptr->lev / 2 + 5, GF_SHARDS, (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP | PROJECT_NO_HANGEKI), -1); } if (have_flag(f_ptr->flags, FF_GLASS) && !have_flag(f_ptr->flags, FF_PERMANENT) && (dam >= 200)) { if (known && (g_ptr->info & CAVE_MARK)) { - msg_format(_("%sが割れた!", "The %s was crashed!"), f_name + f_info[get_feat_mimic(g_ptr)].name); + msg_format(_("%sが割れた!", "The %s crumbled!"), f_name + f_info[get_feat_mimic(g_ptr)].name); sound(SOUND_GLASS); } /* Destroy the wall */ - cave_alter_feat(y, x, FF_HURT_ROCK); - p_ptr->update |= (PU_FLOW); + cave_alter_feat(caster_ptr, y, x, FF_HURT_ROCK); + caster_ptr->update |= (PU_FLOW); } + break; } @@ -706,17 +711,18 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P { /* Destroy mirror/glyph */ if (is_mirror_grid(g_ptr) || is_glyph_grid(g_ptr) || is_explosive_rune_grid(g_ptr)) - remove_mirror(y, x); + remove_mirror(caster_ptr, y, x); /* Permanent features don't get effect */ /* But not protect monsters and other objects */ if (have_flag(f_ptr->flags, FF_HURT_DISI) && !have_flag(f_ptr->flags, FF_PERMANENT)) { - cave_alter_feat(y, x, FF_HURT_DISI); + cave_alter_feat(caster_ptr, y, x, FF_HURT_DISI); /* Update some things -- similar to GF_KILL_WALL */ - p_ptr->update |= (PU_FLOW); + caster_ptr->update |= (PU_FLOW); } + break; } } @@ -730,6 +736,7 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P /*! * @brief 汎用的なビーム/ボルト/ボール系によるアイテムオブジェクトへの効果処理 / Handle a beam/bolt/ball causing damage to a monster. + * @param caster_ptr プレーヤーへの参照ポインタ * @param who 魔法を発動したモンスター(0ならばプレイヤー) / Index of "source" monster (zero for "player") * @param r 効果半径(ビーム/ボルト = 0 / ボール = 1以上) / Radius of explosion (0 = beam/bolt, 1 to 9 = ball) * @param y 目標Y座標 / Target y location (or location to travel "towards") @@ -755,14 +762,14 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P * We return "TRUE" if the effect of the projection is "obvious". * */ -static bool project_o(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_POINT dam, EFFECT_ID typ) +static bool project_o(player_type *caster_ptr, MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_POINT dam, EFFECT_ID typ) { - grid_type *g_ptr = ¤t_floor_ptr->grid_array[y][x]; + grid_type *g_ptr = &caster_ptr->current_floor_ptr->grid_array[y][x]; OBJECT_IDX this_o_idx, next_o_idx = 0; bool obvious = FALSE; - bool known = player_has_los_bold(y, x); + bool known = player_has_los_bold(caster_ptr, y, x); BIT_FLAGS flgs[TR_FLAG_SIZE]; @@ -781,7 +788,7 @@ static bool project_o(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P /* Scan all objects in the grid */ for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx) { - object_type *o_ptr = ¤t_floor_ptr->o_list[this_o_idx]; + object_type *o_ptr = &caster_ptr->current_floor_ptr->o_list[this_o_idx]; bool is_art = FALSE; bool ignore = FALSE; @@ -942,10 +949,10 @@ static bool project_o(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P case GF_IDENTIFY: { - identify_item(o_ptr); + identify_item(caster_ptr, o_ptr); /* Auto-inscription */ - autopick_alter_item((-this_o_idx), FALSE); + autopick_alter_item(caster_ptr, (-this_o_idx), FALSE); break; } @@ -982,7 +989,7 @@ static bool project_o(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P int i; BIT_FLAGS mode = 0L; - if (!who || is_pet(¤t_floor_ptr->m_list[who])) + if (!who || is_pet(&caster_ptr->current_floor_ptr->m_list[who])) mode |= PM_FORCE_PET; for (i = 0; i < o_ptr->number ; i++) @@ -1045,7 +1052,7 @@ static bool project_o(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P k_idx = o_ptr->k_idx; is_potion = object_is_potion(o_ptr); - delete_object_idx(this_o_idx); + delete_object_idx(caster_ptr->current_floor_ptr, this_o_idx); /* Potions produce effects when 'shattered' */ if (is_potion) @@ -1059,12 +1066,13 @@ static bool project_o(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P } /* Return "Anything seen?" */ - return (obvious); + return obvious; } /*! * @brief 汎用的なビーム/ボルト/ボール系によるモンスターへの効果処理 / Handle a beam/bolt/ball causing damage to a monster. + * @param caster_ptr プレーヤーへの参照ポインタ * @param who 魔法を発動したモンスター(0ならばプレイヤー) / Index of "source" monster (zero for "player") * @param r 効果半径(ビーム/ボルト = 0 / ボール = 1以上) / Radius of explosion (0 = beam/bolt, 1 to 9 = ball) * @param y 目標Y座標 / Target y location (or location to travel "towards") @@ -1131,14 +1139,15 @@ static bool project_o(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P * "flg" was added. * */ -static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_POINT dam, EFFECT_ID typ, BIT_FLAGS flg, bool see_s_msg) +static bool project_m(player_type *caster_ptr, MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_POINT dam, EFFECT_ID typ, BIT_FLAGS flg, bool see_s_msg) { int tmp; - grid_type *g_ptr = ¤t_floor_ptr->grid_array[y][x]; + floor_type *floor_ptr = caster_ptr->current_floor_ptr; + grid_type *g_ptr = &floor_ptr->grid_array[y][x]; - monster_type *m_ptr = ¤t_floor_ptr->m_list[g_ptr->m_idx]; - monster_type *caster_ptr = (who > 0) ? ¤t_floor_ptr->m_list[who] : NULL; + monster_type *m_ptr = &floor_ptr->m_list[g_ptr->m_idx]; + monster_type *m_caster_ptr = (who > 0) ? &floor_ptr->m_list[who] : NULL; monster_race *r_ptr = &r_info[m_ptr->r_idx]; @@ -1154,7 +1163,7 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P bool obvious = FALSE; /* Can the player know about this effect? */ - bool known = ((m_ptr->cdis <= MAX_SIGHT) || p_ptr->phase_out); + bool known = ((m_ptr->cdis <= MAX_SIGHT) || caster_ptr->phase_out); /* Were the effects "irrelevant"? */ bool skipped = FALSE; @@ -1197,19 +1206,19 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P /* Assume a default death */ concptr note_dies = extract_note_dies(real_r_idx(m_ptr)); - DEPTH caster_lev = (who > 0) ? r_info[caster_ptr->r_idx].level : (p_ptr->lev * 2); + DEPTH caster_lev = (who > 0) ? r_info[m_caster_ptr->r_idx].level : (caster_ptr->lev * 2); /* Nobody here */ - if (!g_ptr->m_idx) return (FALSE); + if (!g_ptr->m_idx) return FALSE; /* Never affect projector */ - if (who && (g_ptr->m_idx == who)) return (FALSE); - if ((g_ptr->m_idx == p_ptr->riding) && !who && !(typ == GF_OLD_HEAL) && !(typ == GF_OLD_SPEED) && !(typ == GF_STAR_HEAL)) return (FALSE); + if (who && (g_ptr->m_idx == who)) return FALSE; + if ((g_ptr->m_idx == caster_ptr->riding) && !who && !(typ == GF_OLD_HEAL) && !(typ == GF_OLD_SPEED) && !(typ == GF_STAR_HEAL)) return FALSE; if (sukekaku && ((m_ptr->r_idx == MON_SUKE) || (m_ptr->r_idx == MON_KAKU))) return FALSE; /* Don't affect already death monsters */ /* Prevents problems with chain reactions of exploding monsters */ - if (m_ptr->hp < 0) return (FALSE); + if (m_ptr->hp < 0) return FALSE; /* Reduce damage by distance */ dam = (dam + r) / (r + 1); @@ -1221,7 +1230,7 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P /* Get the monster possessive ("his"/"her"/"its") */ monster_desc(m_poss, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE); - if (p_ptr->riding && (g_ptr->m_idx == p_ptr->riding)) disturb(p_ptr, TRUE, TRUE); + if (caster_ptr->riding && (g_ptr->m_idx == caster_ptr->riding)) disturb(caster_ptr, TRUE, TRUE); if (r_ptr->flagsr & RFR_RES_ALL && typ != GF_OLD_CLONE && typ != GF_STAR_HEAL && typ != GF_OLD_HEAL @@ -1229,8 +1238,8 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P { note = _("には完全な耐性がある!", " is immune."); dam = 0; - if(is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_ALL); - if(typ == GF_LITE_WEAK || typ == GF_KILL_WALL) skipped = TRUE; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_ALL); + if (typ == GF_LITE_WEAK || typ == GF_KILL_WALL) skipped = TRUE; } else { @@ -1238,1584 +1247,1543 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P switch (typ) { /* Magic Missile -- pure damage */ - case GF_MISSILE: + case GF_MISSILE: + { + if (seen) obvious = TRUE; + break; + } + + /* Acid */ + case GF_ACID: + { + if (seen) obvious = TRUE; + if (r_ptr->flagsr & RFR_IM_ACID) { - if (seen) obvious = TRUE; - break; + note = _("にはかなり耐性がある!", " resists a lot."); + dam /= 9; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_IM_ACID); } + break; + } - /* Acid */ - case GF_ACID: + /* Electricity */ + case GF_ELEC: + { + if (seen) obvious = TRUE; + if (r_ptr->flagsr & RFR_IM_ELEC) { - if (seen) obvious = TRUE; - if (r_ptr->flagsr & RFR_IM_ACID) - { - note = _("にはかなり耐性がある!", " resists a lot."); - dam /= 9; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_IM_ACID); - } - break; + note = _("にはかなり耐性がある!", " resists a lot."); + dam /= 9; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_IM_ELEC); } + break; + } - /* Electricity */ - case GF_ELEC: + /* Fire damage */ + case GF_FIRE: + { + if (seen) obvious = TRUE; + if (r_ptr->flagsr & RFR_IM_FIRE) { - if (seen) obvious = TRUE; - if (r_ptr->flagsr & RFR_IM_ELEC) - { - note = _("にはかなり耐性がある!", " resists a lot."); - dam /= 9; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_IM_ELEC); - } - break; + note = _("にはかなり耐性がある!", " resists a lot."); + dam /= 9; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_IM_FIRE); } - - /* Fire damage */ - case GF_FIRE: + else if (r_ptr->flags3 & (RF3_HURT_FIRE)) { - if (seen) obvious = TRUE; - if (r_ptr->flagsr & RFR_IM_FIRE) - { - note = _("にはかなり耐性がある!", " resists a lot."); - dam /= 9; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_IM_FIRE); - } - else if (r_ptr->flags3 & (RF3_HURT_FIRE)) - { - note = _("はひどい痛手をうけた。", " is hit hard."); - dam *= 2; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_HURT_FIRE); - } - break; + note = _("はひどい痛手をうけた。", " is hit hard."); + dam *= 2; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_HURT_FIRE); } + break; + } - /* Cold */ - case GF_COLD: + /* Cold */ + case GF_COLD: + { + if (seen) obvious = TRUE; + if (r_ptr->flagsr & RFR_IM_COLD) { - if (seen) obvious = TRUE; - if (r_ptr->flagsr & RFR_IM_COLD) - { - note = _("にはかなり耐性がある!", " resists a lot."); - dam /= 9; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_IM_COLD); - } - else if (r_ptr->flags3 & (RF3_HURT_COLD)) - { - note = _("はひどい痛手をうけた。", " is hit hard."); - dam *= 2; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_HURT_COLD); - } - break; + note = _("にはかなり耐性がある!", " resists a lot."); + dam /= 9; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_IM_COLD); } - - /* Poison */ - case GF_POIS: + else if (r_ptr->flags3 & (RF3_HURT_COLD)) { - if (seen) obvious = TRUE; - if (r_ptr->flagsr & RFR_IM_POIS) - { - note = _("にはかなり耐性がある!", " resists a lot."); - dam /= 9; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_IM_POIS); - } - break; + note = _("はひどい痛手をうけた。", " is hit hard."); + dam *= 2; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_HURT_COLD); } + break; + } - /* Nuclear waste */ - case GF_NUKE: + /* Poison */ + case GF_POIS: + { + if (seen) obvious = TRUE; + if (r_ptr->flagsr & RFR_IM_POIS) { - if (seen) obvious = TRUE; - if (r_ptr->flagsr & RFR_IM_POIS) - { - note = _("には耐性がある。", " resists."); - dam *= 3; dam /= randint1(6) + 6; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_IM_POIS); - } - else if (one_in_(3)) do_poly = TRUE; - break; + note = _("にはかなり耐性がある!", " resists a lot."); + dam /= 9; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_IM_POIS); } + break; + } - /* Hellfire -- hurts Evil */ - case GF_HELL_FIRE: + /* Nuclear waste */ + case GF_NUKE: + { + if (seen) obvious = TRUE; + if (r_ptr->flagsr & RFR_IM_POIS) { - if (seen) obvious = TRUE; - if (r_ptr->flags3 & RF3_GOOD) - { - note = _("はひどい痛手をうけた。", " is hit hard."); - dam *= 2; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_GOOD); - } - break; + note = _("には耐性がある。", " resists."); + dam *= 3; dam /= randint1(6) + 6; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_IM_POIS); } + else if (one_in_(3)) do_poly = TRUE; + break; + } - /* Holy Fire -- hurts Evil, Good are immune, others _resist_ */ - case GF_HOLY_FIRE: + /* Hellfire -- hurts Evil */ + case GF_HELL_FIRE: + { + if (seen) obvious = TRUE; + if (r_ptr->flags3 & RF3_GOOD) { - if (seen) obvious = TRUE; - if (r_ptr->flags3 & RF3_EVIL) - { - dam *= 2; - note = _("はひどい痛手をうけた。", " is hit hard."); - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_EVIL; - } - else - { - note = _("には耐性がある。", " resists."); - dam *= 3; dam /= randint1(6) + 6; - } - break; + note = _("はひどい痛手をうけた。", " is hit hard."); + dam *= 2; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_GOOD); } + break; + } - /* Arrow -- XXX no defense */ - case GF_ARROW: + /* Holy Fire -- hurts Evil, Good are immune, others _resist_ */ + case GF_HOLY_FIRE: + { + if (seen) obvious = TRUE; + if (r_ptr->flags3 & RF3_EVIL) { - if (seen) obvious = TRUE; - break; + dam *= 2; + note = _("はひどい痛手をうけた。", " is hit hard."); + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_EVIL; + } + else + { + note = _("には耐性がある。", " resists."); + dam *= 3; dam /= randint1(6) + 6; } + break; + } - /* Plasma -- XXX perhaps check ELEC or FIRE */ - case GF_PLASMA: + /* Arrow -- XXX no defense */ + case GF_ARROW: + { + if (seen) obvious = TRUE; + break; + } + + /* Plasma -- XXX perhaps check ELEC or FIRE */ + case GF_PLASMA: + { + if (seen) obvious = TRUE; + if (r_ptr->flagsr & RFR_RES_PLAS) { - if (seen) obvious = TRUE; - if (r_ptr->flagsr & RFR_RES_PLAS) - { - note = _("には耐性がある。", " resists."); - dam *= 3; dam /= randint1(6) + 6; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_PLAS); - } - break; + note = _("には耐性がある。", " resists."); + dam *= 3; dam /= randint1(6) + 6; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_PLAS); } + break; + } - /* Nether -- see above */ - case GF_NETHER: + /* Nether -- see above */ + case GF_NETHER: + { + if (seen) obvious = TRUE; + if (r_ptr->flagsr & RFR_RES_NETH) { - if (seen) obvious = TRUE; - if (r_ptr->flagsr & RFR_RES_NETH) + if (r_ptr->flags3 & RF3_UNDEAD) { - if (r_ptr->flags3 & RF3_UNDEAD) - { - note = _("には完全な耐性がある!", " is immune."); - dam = 0; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_UNDEAD); - } - else - { - note = _("には耐性がある。", " resists."); - dam *= 3; dam /= randint1(6) + 6; - } - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_NETH); + note = _("には完全な耐性がある!", " is immune."); + dam = 0; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_UNDEAD); } - else if (r_ptr->flags3 & RF3_EVIL) + else { - note = _("はいくらか耐性を示した。", " resists somewhat."); - dam /= 2; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_EVIL); + note = _("には耐性がある。", " resists."); + dam *= 3; dam /= randint1(6) + 6; } - break; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_NETH); } - - /* Water (acid) damage -- Water spirits/elementals are immune */ - case GF_WATER: + else if (r_ptr->flags3 & RF3_EVIL) { - if (seen) obvious = TRUE; - if (r_ptr->flagsr & RFR_RES_WATE) - { - if ((m_ptr->r_idx == MON_WATER_ELEM) || (m_ptr->r_idx == MON_UNMAKER)) - { - note = _("には完全な耐性がある!", " is immune."); - dam = 0; - } - else - { - note = _("には耐性がある。", " resists."); - dam *= 3; dam /= randint1(6) + 6; - } - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_WATE); - } - break; + note = _("はいくらか耐性を示した。", " resists somewhat."); + dam /= 2; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_EVIL); } + break; + } - /* Chaos -- Chaos breathers resist */ - case GF_CHAOS: + /* Water (acid) damage -- Water spirits/elementals are immune */ + case GF_WATER: + { + if (seen) obvious = TRUE; + if (r_ptr->flagsr & RFR_RES_WATE) { - if (seen) obvious = TRUE; - if (r_ptr->flagsr & RFR_RES_CHAO) - { - note = _("には耐性がある。", " resists."); - dam *= 3; dam /= randint1(6) + 6; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_CHAO); - } - else if ((r_ptr->flags3 & RF3_DEMON) && one_in_(3)) + if ((m_ptr->r_idx == MON_WATER_ELEM) || (m_ptr->r_idx == MON_UNMAKER)) { - note = _("はいくらか耐性を示した。", " resists somewhat."); - dam *= 3; dam /= randint1(6) + 6; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_DEMON); + note = _("には完全な耐性がある!", " is immune."); + dam = 0; } else { - do_poly = TRUE; - do_conf = (5 + randint1(11) + r) / (r + 1); - } - break; - } - - /* Shards -- Shard breathers resist */ - case GF_SHARDS: - { - if (seen) obvious = TRUE; - if (r_ptr->flagsr & RFR_RES_SHAR) - { note = _("には耐性がある。", " resists."); dam *= 3; dam /= randint1(6) + 6; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_SHAR); } - break; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_WATE); } + break; + } - /* Rocket: Shard resistance helps */ - case GF_ROCKET: + /* Chaos -- Chaos breathers resist */ + case GF_CHAOS: + { + if (seen) obvious = TRUE; + if (r_ptr->flagsr & RFR_RES_CHAO) { - if (seen) obvious = TRUE; - if (r_ptr->flagsr & RFR_RES_SHAR) - { - note = _("はいくらか耐性を示した。", " resists somewhat."); - dam /= 2; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_SHAR); - } - break; + note = _("には耐性がある。", " resists."); + dam *= 3; dam /= randint1(6) + 6; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_CHAO); } - - - /* Sound -- Sound breathers resist */ - case GF_SOUND: + else if ((r_ptr->flags3 & RF3_DEMON) && one_in_(3)) { - if (seen) obvious = TRUE; - if (r_ptr->flagsr & RFR_RES_SOUN) - { - note = _("には耐性がある。", " resists."); - dam *= 2; dam /= randint1(6) + 6; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_SOUN); - } - else do_stun = (10 + randint1(15) + r) / (r + 1); - break; + note = _("はいくらか耐性を示した。", " resists somewhat."); + dam *= 3; dam /= randint1(6) + 6; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_DEMON); } - - /* Confusion */ - case GF_CONFUSION: + else { - if (seen) obvious = TRUE; - if (r_ptr->flags3 & RF3_NO_CONF) - { - note = _("には耐性がある。", " resists."); - dam *= 3; dam /= randint1(6) + 6; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_NO_CONF); - } - else do_conf = (10 + randint1(15) + r) / (r + 1); - break; + do_poly = TRUE; + do_conf = (5 + randint1(11) + r) / (r + 1); } + break; + } - /* Disenchantment -- Breathers and Disenchanters resist */ - case GF_DISENCHANT: + /* Shards -- Shard breathers resist */ + case GF_SHARDS: + { + if (seen) obvious = TRUE; + if (r_ptr->flagsr & RFR_RES_SHAR) { - if (seen) obvious = TRUE; - if (r_ptr->flagsr & RFR_RES_DISE) - { - note = _("には耐性がある。", " resists."); - dam *= 3; dam /= randint1(6) + 6; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_DISE); - } - break; + note = _("には耐性がある。", " resists."); + dam *= 3; dam /= randint1(6) + 6; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_SHAR); } + break; + } - /* Nexus -- Breathers and Existers resist */ - case GF_NEXUS: + /* Rocket: Shard resistance helps */ + case GF_ROCKET: + { + if (seen) obvious = TRUE; + if (r_ptr->flagsr & RFR_RES_SHAR) { - if (seen) obvious = TRUE; - if (r_ptr->flagsr & RFR_RES_NEXU) - { - note = _("には耐性がある。", " resists."); - dam *= 3; dam /= randint1(6) + 6; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_NEXU); - } - break; + note = _("はいくらか耐性を示した。", " resists somewhat."); + dam /= 2; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_SHAR); } + break; + } - /* Force */ - case GF_FORCE: + + /* Sound -- Sound breathers resist */ + case GF_SOUND: + { + if (seen) obvious = TRUE; + if (r_ptr->flagsr & RFR_RES_SOUN) { - if (seen) obvious = TRUE; - if (r_ptr->flagsr & RFR_RES_WALL) - { - note = _("には耐性がある。", " resists."); - dam *= 3; dam /= randint1(6) + 6; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_WALL); - } - else do_stun = (randint1(15) + r) / (r + 1); - break; + note = _("には耐性がある。", " resists."); + dam *= 2; dam /= randint1(6) + 6; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_SOUN); } + else do_stun = (10 + randint1(15) + r) / (r + 1); + break; + } - /* Inertia -- breathers resist */ - case GF_INERTIAL: + /* Confusion */ + case GF_CONFUSION: + { + if (seen) obvious = TRUE; + if (r_ptr->flags3 & RF3_NO_CONF) { - if (seen) obvious = TRUE; - if (r_ptr->flagsr & RFR_RES_INER) - { - note = _("には耐性がある。", " resists."); - dam *= 3; dam /= randint1(6) + 6; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_INER); - } - else - { - /* Powerful monsters can resist */ - if ((r_ptr->flags1 & (RF1_UNIQUE)) || - (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) - { - obvious = FALSE; - } - /* Normal monsters slow down */ - else - { - if (set_monster_slow(g_ptr->m_idx, MON_SLOW(m_ptr) + 50)) - { - note = _("の動きが遅くなった。", " starts moving slower."); - } - } - } - break; + note = _("には耐性がある。", " resists."); + dam *= 3; dam /= randint1(6) + 6; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_NO_CONF); } + else do_conf = (10 + randint1(15) + r) / (r + 1); + break; + } - /* Time -- breathers resist */ - case GF_TIME: + /* Disenchantment -- Breathers and Disenchanters resist */ + case GF_DISENCHANT: + { + if (seen) obvious = TRUE; + if (r_ptr->flagsr & RFR_RES_DISE) { - if (seen) obvious = TRUE; - if (r_ptr->flagsr & RFR_RES_TIME) - { - note = _("には耐性がある。", " resists."); - dam *= 3; dam /= randint1(6) + 6; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_TIME); - } - else do_time = (dam + 1) / 2; - break; + note = _("には耐性がある。", " resists."); + dam *= 3; dam /= randint1(6) + 6; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_DISE); } + break; + } - /* Gravity -- breathers resist */ - case GF_GRAVITY: + /* Nexus -- Breathers and Existers resist */ + case GF_NEXUS: + { + if (seen) obvious = TRUE; + if (r_ptr->flagsr & RFR_RES_NEXU) { - bool resist_tele = FALSE; - - if (seen) obvious = TRUE; - if (r_ptr->flagsr & RFR_RES_TELE) - { - if (r_ptr->flags1 & (RF1_UNIQUE)) - { - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE; - note = _("には効果がなかった。", " is unaffected!"); - resist_tele = TRUE; - } - else if (r_ptr->level > randint1(100)) - { - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE; - note = _("には耐性がある!", " resists!"); - resist_tele = TRUE; - } - } + note = _("には耐性がある。", " resists."); + dam *= 3; dam /= randint1(6) + 6; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_NEXU); + } + break; + } - if (!resist_tele) do_dist = 10; - else do_dist = 0; - if (p_ptr->riding && (g_ptr->m_idx == p_ptr->riding)) do_dist = 0; + /* Force */ + case GF_FORCE: + { + if (seen) obvious = TRUE; + if (r_ptr->flagsr & RFR_RES_WALL) + { + note = _("には耐性がある。", " resists."); + dam *= 3; dam /= randint1(6) + 6; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_WALL); + } + else do_stun = (randint1(15) + r) / (r + 1); + break; + } - if (r_ptr->flagsr & RFR_RES_GRAV) + /* Inertia -- breathers resist */ + case GF_INERTIAL: + { + if (seen) obvious = TRUE; + if (r_ptr->flagsr & RFR_RES_INER) + { + note = _("には耐性がある。", " resists."); + dam *= 3; dam /= randint1(6) + 6; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_INER); + } + else + { + /* Powerful monsters can resist */ + if ((r_ptr->flags1 & (RF1_UNIQUE)) || + (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { - note = _("には耐性がある!", " resists!"); - dam *= 3; dam /= randint1(6) + 6; - do_dist = 0; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_GRAV); + obvious = FALSE; } + /* Normal monsters slow down */ else { - /* 1. slowness */ - /* Powerful monsters can resist */ - if ((r_ptr->flags1 & (RF1_UNIQUE)) || - (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) - { - obvious = FALSE; - } - /* Normal monsters slow down */ - else + if (set_monster_slow(caster_ptr, g_ptr->m_idx, MON_SLOW(m_ptr) + 50)) { - if (set_monster_slow(g_ptr->m_idx, MON_SLOW(m_ptr) + 50)) - { - note = _("の動きが遅くなった。", " starts moving slower."); - } - } - - /* 2. stun */ - do_stun = damroll((caster_lev / 20) + 3 , (dam)) + 1; - - /* Attempt a saving throw */ - if ((r_ptr->flags1 & (RF1_UNIQUE)) || - (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) - { - /* Resist */ - do_stun = 0; - /* No obvious effect */ - note = _("には効果がなかった。", " is unaffected!"); - obvious = FALSE; + note = _("の動きが遅くなった。", " starts moving slower."); } } - break; } + break; + } - /* Pure damage */ - case GF_MANA: - case GF_SEEKER: - case GF_SUPER_RAY: + /* Time -- breathers resist */ + case GF_TIME: + { + if (seen) obvious = TRUE; + if (r_ptr->flagsr & RFR_RES_TIME) { - if (seen) obvious = TRUE; - break; + note = _("には耐性がある。", " resists."); + dam *= 3; dam /= randint1(6) + 6; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_TIME); } + else do_time = (dam + 1) / 2; + break; + } + /* Gravity -- breathers resist */ + case GF_GRAVITY: + { + bool resist_tele = FALSE; - /* Pure damage */ - case GF_DISINTEGRATE: - { - if (seen) obvious = TRUE; - if (r_ptr->flags3 & RF3_HURT_ROCK) - { - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_HURT_ROCK); - note = _("の皮膚がただれた!", " loses some skin!"); - note_dies = _("は蒸発した!", " evaporates!"); - dam *= 2; - } - break; - } - - case GF_PSI: + if (seen) obvious = TRUE; + if (r_ptr->flagsr & RFR_RES_TELE) { - if (seen) obvious = TRUE; - - /* PSI only works if the monster can see you! -- RG */ - if (!(los(m_ptr->fy, m_ptr->fx, p_ptr->y, p_ptr->x))) - { - if (seen_msg) - msg_format(_("%sはあなたが見えないので影響されない!", "%^s can't see you, and isn't affected!"), m_name); - skipped = TRUE; - break; - } - if (r_ptr->flags2 & RF2_EMPTY_MIND) + if (r_ptr->flags1 & (RF1_UNIQUE)) { - dam = 0; - note = _("には完全な耐性がある!", " is immune."); - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags2 |= (RF2_EMPTY_MIND); - + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE; + note = _("には効果がなかった。", " is unaffected!"); + resist_tele = TRUE; } - else if ((r_ptr->flags2 & (RF2_STUPID | RF2_WEIRD_MIND)) || - (r_ptr->flags3 & RF3_ANIMAL) || - (r_ptr->level > randint1(3 * dam))) + else if (r_ptr->level > randint1(100)) { + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE; note = _("には耐性がある!", " resists!"); - dam /= 3; - - /* - * Powerful demons & undead can current_world_ptr->game_turn a mindcrafter's - * attacks back on them - */ - if ((r_ptr->flags3 & (RF3_UNDEAD | RF3_DEMON)) && - (r_ptr->level > p_ptr->lev / 2) && - one_in_(2)) - { - note = NULL; - msg_format(_("%^sの堕落した精神は攻撃を跳ね返した!", - (seen ? "%^s's corrupted mind backlashes your attack!" : - "%^ss corrupted mind backlashes your attack!")), m_name); - - /* Saving throw */ - if ((randint0(100 + r_ptr->level / 2) < p_ptr->skill_sav) && !CHECK_MULTISHADOW(p_ptr)) - { - msg_print(_("しかし効力を跳ね返した!", "You resist the effects!")); - } - else - { - /* Injure +/- confusion */ - monster_desc(killer, m_ptr, MD_WRONGDOER_NAME); - take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, -1); /* has already been /3 */ - if (one_in_(4) && !CHECK_MULTISHADOW(p_ptr)) - { - switch (randint1(4)) - { - case 1: - set_confused(p_ptr, p_ptr->confused + 3 + randint1(dam)); - break; - case 2: - set_stun(p_ptr, p_ptr->stun + randint1(dam)); - break; - case 3: - { - if (r_ptr->flags3 & RF3_NO_FEAR) - note = _("には効果がなかった。", " is unaffected."); - else - set_afraid(p_ptr, p_ptr->afraid + 3 + randint1(dam)); - break; - } - default: - if (!p_ptr->free_act) - (void)set_paralyzed(p_ptr, p_ptr->paralyzed + randint1(dam)); - break; - } - } - } - dam = 0; - } + resist_tele = TRUE; } + } - if ((dam > 0) && one_in_(4)) - { - switch (randint1(4)) - { - case 1: - do_conf = 3 + randint1(dam); - break; - case 2: - do_stun = 3 + randint1(dam); - break; - case 3: - do_fear = 3 + randint1(dam); - break; - default: - note = _("は眠り込んでしまった!", " falls asleep!"); - do_sleep = 3 + randint1(dam); - break; - } - } + if (!resist_tele) do_dist = 10; + else do_dist = 0; + if (caster_ptr->riding && (g_ptr->m_idx == caster_ptr->riding)) do_dist = 0; - note_dies = _("の精神は崩壊し、肉体は抜け殻となった。", " collapses, a mindless husk."); - break; + if (r_ptr->flagsr & RFR_RES_GRAV) + { + note = _("には耐性がある!", " resists!"); + dam *= 3; dam /= randint1(6) + 6; + do_dist = 0; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_GRAV); } - - case GF_PSI_DRAIN: + else { - if (seen) obvious = TRUE; - if (r_ptr->flags2 & RF2_EMPTY_MIND) + /* 1. slowness */ + /* Powerful monsters can resist */ + if ((r_ptr->flags1 & (RF1_UNIQUE)) || + (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { - dam = 0; - note = _("には完全な耐性がある!", " is immune."); + obvious = FALSE; } - else if ((r_ptr->flags2 & (RF2_STUPID | RF2_WEIRD_MIND)) || - (r_ptr->flags3 & RF3_ANIMAL) || - (r_ptr->level > randint1(3 * dam))) + /* Normal monsters slow down */ + else { - note = _("には耐性がある!", " resists!"); - dam /= 3; - - /* - * Powerful demons & undead can current_world_ptr->game_turn a mindcrafter's - * attacks back on them - */ - if ((r_ptr->flags3 & (RF3_UNDEAD | RF3_DEMON)) && - (r_ptr->level > p_ptr->lev / 2) && - (one_in_(2))) + if (set_monster_slow(caster_ptr, g_ptr->m_idx, MON_SLOW(m_ptr) + 50)) { - note = NULL; - msg_format(_("%^sの堕落した精神は攻撃を跳ね返した!", - (seen ? "%^s's corrupted mind backlashes your attack!" : - "%^ss corrupted mind backlashes your attack!")), m_name); - /* Saving throw */ - if ((randint0(100 + r_ptr->level / 2) < p_ptr->skill_sav) && !CHECK_MULTISHADOW(p_ptr)) - { - msg_print(_("あなたは効力を跳ね返した!", "You resist the effects!")); - } - else - { - /* Injure + mana drain */ - monster_desc(killer, m_ptr, MD_WRONGDOER_NAME); - if (!CHECK_MULTISHADOW(p_ptr)) - { - msg_print(_("超能力パワーを吸いとられた!", "Your psychic energy is drained!")); - p_ptr->csp -= damroll(5, dam) / 2; - if (p_ptr->csp < 0) p_ptr->csp = 0; - p_ptr->redraw |= PR_MANA; - p_ptr->window |= (PW_SPELL); - } - take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, -1); /* has already been /3 */ - } - dam = 0; + note = _("の動きが遅くなった。", " starts moving slower."); } } - else if (dam > 0) - { - int b = damroll(5, dam) / 4; - concptr str = (p_ptr->pclass == CLASS_MINDCRAFTER) ? _("超能力パワー", "psychic energy") : _("魔力", "mana"); - concptr msg = _("あなたは%sの苦痛を%sに変換した!", - (seen ? "You convert %s's pain into %s!" : - "You convert %ss pain into %s!")); - msg_format(msg, m_name, str); - - b = MIN(p_ptr->msp, p_ptr->csp + b); - p_ptr->csp = b; - p_ptr->redraw |= PR_MANA; - p_ptr->window |= (PW_SPELL); - } - note_dies = _("の精神は崩壊し、肉体は抜け殻となった。", " collapses, a mindless husk."); - break; - } - - case GF_TELEKINESIS: - { - if (seen) obvious = TRUE; - if (one_in_(4)) - { - if (p_ptr->riding && (g_ptr->m_idx == p_ptr->riding)) do_dist = 0; - else do_dist = 7; - } - /* 1. stun */ - do_stun = damroll((caster_lev / 20) + 3 , dam) + 1; + /* 2. stun */ + do_stun = damroll((caster_lev / 20) + 3, (dam)) + 1; /* Attempt a saving throw */ - if ((r_ptr->flags1 & RF1_UNIQUE) || - (r_ptr->level > 5 + randint1(dam))) + if ((r_ptr->flags1 & (RF1_UNIQUE)) || + (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { /* Resist */ do_stun = 0; /* No obvious effect */ + note = _("には効果がなかった。", " is unaffected!"); obvious = FALSE; } - break; } + break; + } + + /* Pure damage */ + case GF_MANA: + case GF_SEEKER: + case GF_SUPER_RAY: + { + if (seen) obvious = TRUE; + break; + } - /* Psycho-spear -- powerful magic missile */ - case GF_PSY_SPEAR: + + /* Pure damage */ + case GF_DISINTEGRATE: + { + if (seen) obvious = TRUE; + if (r_ptr->flags3 & RF3_HURT_ROCK) { - if (seen) obvious = TRUE; - break; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_HURT_ROCK); + note = _("の皮膚がただれた!", " loses some skin!"); + note_dies = _("は蒸発した!", " evaporates!"); + dam *= 2; } + break; + } - /* Meteor -- powerful magic missile */ - case GF_METEOR: + case GF_PSI: + { + if (seen) obvious = TRUE; + + /* PSI only works if the monster can see you! -- RG */ + if (!(los(caster_ptr, m_ptr->fy, m_ptr->fx, caster_ptr->y, caster_ptr->x))) { - if (seen) obvious = TRUE; + if (seen_msg) + msg_format(_("%sはあなたが見えないので影響されない!", "%^s can't see you, and isn't affected!"), m_name); + skipped = TRUE; break; } - - case GF_DOMINATION: + if (r_ptr->flags2 & RF2_EMPTY_MIND) { - if (!is_hostile(m_ptr)) break; - if (seen) obvious = TRUE; - /* Attempt a saving throw */ - if ((r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) || - (r_ptr->flags3 & RF3_NO_CONF) || - (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) - { - /* Memorize a flag */ - if (r_ptr->flags3 & RF3_NO_CONF) - { - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_NO_CONF); - } + dam = 0; + note = _("には完全な耐性がある!", " is immune."); + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags2 |= (RF2_EMPTY_MIND); - /* Resist */ - do_conf = 0; + } + else if ((r_ptr->flags2 & (RF2_STUPID | RF2_WEIRD_MIND)) || + (r_ptr->flags3 & RF3_ANIMAL) || + (r_ptr->level > randint1(3 * dam))) + { + note = _("には耐性がある!", " resists!"); + dam /= 3; - /* - * Powerful demons & undead can current_world_ptr->game_turn a mindcrafter's - * attacks back on them - */ - if ((r_ptr->flags3 & (RF3_UNDEAD | RF3_DEMON)) && - (r_ptr->level > p_ptr->lev / 2) && - (one_in_(2))) - { - note = NULL; - msg_format(_("%^sの堕落した精神は攻撃を跳ね返した!", - (seen ? "%^s's corrupted mind backlashes your attack!" : + /* + * Powerful demons & undead can turn a mindcrafter's + * attacks back on them + */ + if ((r_ptr->flags3 & (RF3_UNDEAD | RF3_DEMON)) && + (r_ptr->level > caster_ptr->lev / 2) && + one_in_(2)) + { + note = NULL; + msg_format(_("%^sの堕落した精神は攻撃を跳ね返した!", + (seen ? "%^s's corrupted mind backlashes your attack!" : "%^ss corrupted mind backlashes your attack!")), m_name); - /* Saving throw */ - if (randint0(100 + r_ptr->level/2) < p_ptr->skill_sav) - { - msg_print(_("しかし効力を跳ね返した!", "You resist the effects!")); - } - else - { - /* Confuse, stun, terrify */ - switch (randint1(4)) - { - case 1: - set_stun(p_ptr, p_ptr->stun + dam / 2); - break; - case 2: - set_confused(p_ptr, p_ptr->confused + dam / 2); - break; - default: - { - if (r_ptr->flags3 & RF3_NO_FEAR) - note = _("には効果がなかった。", " is unaffected."); - else - set_afraid(p_ptr, p_ptr->afraid + dam); - } - } - } - } - else - { - /* No obvious effect */ - note = _("には効果がなかった。", " is unaffected."); - obvious = FALSE; - } - } - else - { - if (!common_saving_throw_charm(p_ptr, dam, m_ptr)) + /* Saving throw */ + if ((randint0(100 + r_ptr->level / 2) < caster_ptr->skill_sav) && !CHECK_MULTISHADOW(caster_ptr)) { - note = _("があなたに隷属した。", " is in your thrall!"); - set_pet(m_ptr); + msg_print(_("しかし効力を跳ね返した!", "You resist the effects!")); } else { - switch (randint1(4)) + /* Injure +/- confusion */ + monster_desc(killer, m_ptr, MD_WRONGDOER_NAME); + take_hit(caster_ptr, DAMAGE_ATTACK, dam, killer, -1); /* has already been /3 */ + if (one_in_(4) && !CHECK_MULTISHADOW(caster_ptr)) { + switch (randint1(4)) + { case 1: - do_stun = dam / 2; + set_confused(caster_ptr, caster_ptr->confused + 3 + randint1(dam)); break; case 2: - do_conf = dam / 2; + set_stun(caster_ptr, caster_ptr->stun + randint1(dam)); + break; + case 3: + { + if (r_ptr->flags3 & RF3_NO_FEAR) + note = _("には効果がなかった。", " is unaffected."); + else + set_afraid(caster_ptr, caster_ptr->afraid + 3 + randint1(dam)); break; + } default: - do_fear = dam; + if (!caster_ptr->free_act) + (void)set_paralyzed(caster_ptr, caster_ptr->paralyzed + randint1(dam)); + break; + } } } + dam = 0; } - - /* No "real" damage */ - dam = 0; - break; } - /* Ice -- Cold + Cuts + Stun */ - case GF_ICE: + if ((dam > 0) && one_in_(4)) { - if (seen) obvious = TRUE; - do_stun = (randint1(15) + 1) / (r + 1); - if (r_ptr->flagsr & RFR_IM_COLD) - { - note = _("にはかなり耐性がある!", " resists a lot."); - dam /= 9; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_IM_COLD); - } - else if (r_ptr->flags3 & (RF3_HURT_COLD)) + switch (randint1(4)) { - note = _("はひどい痛手をうけた。", " is hit hard."); - dam *= 2; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_HURT_COLD); - } - break; + case 1: + do_conf = 3 + randint1(dam); + break; + case 2: + do_stun = 3 + randint1(dam); + break; + case 3: + do_fear = 3 + randint1(dam); + break; + default: + note = _("は眠り込んでしまった!", " falls asleep!"); + do_sleep = 3 + randint1(dam); + break; + } } + note_dies = _("の精神は崩壊し、肉体は抜け殻となった。", " collapses, a mindless husk."); + break; + } - /* Drain Life */ - case GF_HYPODYNAMIA: + case GF_PSI_DRAIN: + { + if (seen) obvious = TRUE; + if (r_ptr->flags2 & RF2_EMPTY_MIND) { - if (seen) obvious = TRUE; - if (!monster_living(m_ptr->r_idx)) + dam = 0; + note = _("には完全な耐性がある!", " is immune."); + } + else if ((r_ptr->flags2 & (RF2_STUPID | RF2_WEIRD_MIND)) || + (r_ptr->flags3 & RF3_ANIMAL) || + (r_ptr->level > randint1(3 * dam))) + { + note = _("には耐性がある!", " resists!"); + dam /= 3; + + /* + * Powerful demons & undead can turn a mindcrafter's + * attacks back on them + */ + if ((r_ptr->flags3 & (RF3_UNDEAD | RF3_DEMON)) && + (r_ptr->level > caster_ptr->lev / 2) && + (one_in_(2))) { - if (is_original_ap_and_seen(m_ptr)) + note = NULL; + msg_format(_("%^sの堕落した精神は攻撃を跳ね返した!", + (seen ? "%^s's corrupted mind backlashes your attack!" : + "%^ss corrupted mind backlashes your attack!")), m_name); + /* Saving throw */ + if ((randint0(100 + r_ptr->level / 2) < caster_ptr->skill_sav) && !CHECK_MULTISHADOW(caster_ptr)) { - if (r_ptr->flags3 & RF3_DEMON) r_ptr->r_flags3 |= (RF3_DEMON); - if (r_ptr->flags3 & RF3_UNDEAD) r_ptr->r_flags3 |= (RF3_UNDEAD); - if (r_ptr->flags3 & RF3_NONLIVING) r_ptr->r_flags3 |= (RF3_NONLIVING); + msg_print(_("あなたは効力を跳ね返した!", "You resist the effects!")); + } + else + { + /* Injure + mana drain */ + monster_desc(killer, m_ptr, MD_WRONGDOER_NAME); + if (!CHECK_MULTISHADOW(caster_ptr)) + { + msg_print(_("超能力パワーを吸いとられた!", "Your psychic energy is drained!")); + caster_ptr->csp -= damroll(5, dam) / 2; + if (caster_ptr->csp < 0) caster_ptr->csp = 0; + caster_ptr->redraw |= PR_MANA; + caster_ptr->window |= (PW_SPELL); + } + take_hit(caster_ptr, DAMAGE_ATTACK, dam, killer, -1); /* has already been /3 */ } - note = _("には効果がなかった。", " is unaffected."); - obvious = FALSE; dam = 0; } - else do_time = (dam+7)/8; + } + else if (dam > 0) + { + int b = damroll(5, dam) / 4; + concptr str = (caster_ptr->pclass == CLASS_MINDCRAFTER) ? _("超能力パワー", "psychic energy") : _("魔力", "mana"); + concptr msg = _("あなたは%sの苦痛を%sに変換した!", + (seen ? "You convert %s's pain into %s!" : + "You convert %ss pain into %s!")); + msg_format(msg, m_name, str); - break; + b = MIN(caster_ptr->msp, caster_ptr->csp + b); + caster_ptr->csp = b; + caster_ptr->redraw |= PR_MANA; + caster_ptr->window |= (PW_SPELL); } + note_dies = _("の精神は崩壊し、肉体は抜け殻となった。", " collapses, a mindless husk."); + break; + } - /* Death Ray */ - case GF_DEATH_RAY: + case GF_TELEKINESIS: + { + if (seen) obvious = TRUE; + if (one_in_(4)) { - if (seen) obvious = TRUE; - if (!monster_living(m_ptr->r_idx)) - { - if (is_original_ap_and_seen(m_ptr)) - { - if (r_ptr->flags3 & RF3_DEMON) r_ptr->r_flags3 |= (RF3_DEMON); - if (r_ptr->flags3 & RF3_UNDEAD) r_ptr->r_flags3 |= (RF3_UNDEAD); - if (r_ptr->flags3 & RF3_NONLIVING) r_ptr->r_flags3 |= (RF3_NONLIVING); - } - note = _("には完全な耐性がある!", " is immune."); - obvious = FALSE; - dam = 0; - } - else if (((r_ptr->flags1 & RF1_UNIQUE) && - (randint1(888) != 666)) || - (((r_ptr->level + randint1(20)) > randint1((caster_lev / 2) + randint1(10))) && - randint1(100) != 66)) - { - note = _("には耐性がある!", " resists!"); - obvious = FALSE; - dam = 0; - } + if (caster_ptr->riding && (g_ptr->m_idx == caster_ptr->riding)) do_dist = 0; + else do_dist = 7; + } - break; + /* 1. stun */ + do_stun = damroll((caster_lev / 20) + 3, dam) + 1; + + /* Attempt a saving throw */ + if ((r_ptr->flags1 & RF1_UNIQUE) || + (r_ptr->level > 5 + randint1(dam))) + { + /* Resist */ + do_stun = 0; + /* No obvious effect */ + obvious = FALSE; } + break; + } + + /* Psycho-spear -- powerful magic missile */ + case GF_PSY_SPEAR: + { + if (seen) obvious = TRUE; + break; + } + + /* Meteor -- powerful magic missile */ + case GF_METEOR: + { + if (seen) obvious = TRUE; + break; + } - /* Polymorph monster (Use "dam" as "power") */ - case GF_OLD_POLY: + case GF_DOMINATION: + { + if (!is_hostile(m_ptr)) break; + if (seen) obvious = TRUE; + /* Attempt a saving throw */ + if ((r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) || + (r_ptr->flags3 & RF3_NO_CONF) || + (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { - if (seen) obvious = TRUE; - /* Attempt to polymorph (see below) */ - do_poly = TRUE; + /* Memorize a flag */ + if (r_ptr->flags3 & RF3_NO_CONF) + { + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_NO_CONF); + } - /* Powerful monsters can resist */ - if ((r_ptr->flags1 & RF1_UNIQUE) || - (r_ptr->flags1 & RF1_QUESTOR) || - (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) + /* Resist */ + do_conf = 0; + + /* + * Powerful demons & undead can turn a mindcrafter's + * attacks back on them + */ + if ((r_ptr->flags3 & (RF3_UNDEAD | RF3_DEMON)) && + (r_ptr->level > caster_ptr->lev / 2) && + (one_in_(2))) + { + note = NULL; + msg_format(_("%^sの堕落した精神は攻撃を跳ね返した!", + (seen ? "%^s's corrupted mind backlashes your attack!" : + "%^ss corrupted mind backlashes your attack!")), m_name); + + /* Saving throw */ + if (randint0(100 + r_ptr->level / 2) < caster_ptr->skill_sav) + { + msg_print(_("しかし効力を跳ね返した!", "You resist the effects!")); + } + else + { + /* Confuse, stun, terrify */ + switch (randint1(4)) + { + case 1: + set_stun(caster_ptr, caster_ptr->stun + dam / 2); + break; + case 2: + set_confused(caster_ptr, caster_ptr->confused + dam / 2); + break; + default: + { + if (r_ptr->flags3 & RF3_NO_FEAR) + note = _("には効果がなかった。", " is unaffected."); + else + set_afraid(caster_ptr, caster_ptr->afraid + dam); + } + } + } + } + else { + /* No obvious effect */ note = _("には効果がなかった。", " is unaffected."); - do_poly = FALSE; obvious = FALSE; } - - /* No "real" damage */ - dam = 0; - - break; } - - - /* Clone monsters (Ignore "dam") */ - case GF_OLD_CLONE: + else { - if (seen) obvious = TRUE; - - if ((p_ptr->inside_arena) || is_pet(m_ptr) || (r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) || (r_ptr->flags7 & (RF7_NAZGUL | RF7_UNIQUE2))) + if (!common_saving_throw_charm(caster_ptr, dam, m_ptr)) { - note = _("には効果がなかった。", " is unaffected."); + note = _("があなたに隷属した。", " is in your thrall!"); + set_pet(m_ptr); } else { - /* Heal fully */ - m_ptr->hp = m_ptr->maxhp; - - /* Attempt to clone. */ - if (multiply_monster(g_ptr->m_idx, TRUE, 0L)) + switch (randint1(4)) { - note = _("が分裂した!", " spawns!"); + case 1: + do_stun = dam / 2; + break; + case 2: + do_conf = dam / 2; + break; + default: + do_fear = dam; } } - - /* No "real" damage */ - dam = 0; - - break; } + /* No "real" damage */ + dam = 0; + break; + } - /* Heal Monster (use "dam" as amount of healing) */ - case GF_STAR_HEAL: + /* Ice -- Cold + Cuts + Stun */ + case GF_ICE: + { + if (seen) obvious = TRUE; + do_stun = (randint1(15) + 1) / (r + 1); + if (r_ptr->flagsr & RFR_IM_COLD) { - if (seen) obvious = TRUE; + note = _("にはかなり耐性がある!", " resists a lot."); + dam /= 9; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_IM_COLD); + } + else if (r_ptr->flags3 & (RF3_HURT_COLD)) + { + note = _("はひどい痛手をうけた。", " is hit hard."); + dam *= 2; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_HURT_COLD); + } + break; + } - /* Wake up */ - (void)set_monster_csleep(g_ptr->m_idx, 0); - if (m_ptr->maxhp < m_ptr->max_maxhp) + /* Drain Life */ + case GF_HYPODYNAMIA: + { + if (seen) obvious = TRUE; + if (!monster_living(m_ptr->r_idx)) + { + if (is_original_ap_and_seen(m_ptr)) { - if (seen_msg) msg_format(_("%^sの強さが戻った。", "%^s recovers %s vitality."), m_name, m_poss); - m_ptr->maxhp = m_ptr->max_maxhp; + if (r_ptr->flags3 & RF3_DEMON) r_ptr->r_flags3 |= (RF3_DEMON); + if (r_ptr->flags3 & RF3_UNDEAD) r_ptr->r_flags3 |= (RF3_UNDEAD); + if (r_ptr->flags3 & RF3_NONLIVING) r_ptr->r_flags3 |= (RF3_NONLIVING); } + note = _("には効果がなかった。", " is unaffected."); + obvious = FALSE; + dam = 0; + } + else do_time = (dam + 7) / 8; + + break; + } - if (!dam) + /* Death Ray */ + case GF_DEATH_RAY: + { + if (seen) obvious = TRUE; + if (!monster_living(m_ptr->r_idx)) + { + if (is_original_ap_and_seen(m_ptr)) { - /* Redraw (later) if needed */ - if (p_ptr->health_who == g_ptr->m_idx) p_ptr->redraw |= (PR_HEALTH); - if (p_ptr->riding == g_ptr->m_idx) p_ptr->redraw |= (PR_UHEALTH); - break; + if (r_ptr->flags3 & RF3_DEMON) r_ptr->r_flags3 |= (RF3_DEMON); + if (r_ptr->flags3 & RF3_UNDEAD) r_ptr->r_flags3 |= (RF3_UNDEAD); + if (r_ptr->flags3 & RF3_NONLIVING) r_ptr->r_flags3 |= (RF3_NONLIVING); } - - /* Fall through */ + note = _("には完全な耐性がある!", " is immune."); + obvious = FALSE; + dam = 0; } - case GF_OLD_HEAL: + else if (((r_ptr->flags1 & RF1_UNIQUE) && + (randint1(888) != 666)) || + (((r_ptr->level + randint1(20)) > randint1((caster_lev / 2) + randint1(10))) && + randint1(100) != 66)) { - if (seen) obvious = TRUE; + note = _("には耐性がある!", " resists!"); + obvious = FALSE; + dam = 0; + } - /* Wake up */ - (void)set_monster_csleep(g_ptr->m_idx, 0); - if (MON_STUNNED(m_ptr)) - { - if (seen_msg) msg_format(_("%^sは朦朧状態から立ち直った。", "%^s is no longer stunned."), m_name); - (void)set_monster_stunned(g_ptr->m_idx, 0); - } - if (MON_CONFUSED(m_ptr)) - { - if (seen_msg) msg_format(_("%^sは混乱から立ち直った。", "%^s is no longer confused."), m_name); - (void)set_monster_confused(g_ptr->m_idx, 0); - } - if (MON_MONFEAR(m_ptr)) - { - if (seen_msg) msg_format(_("%^sは勇気を取り戻した。", "%^s recovers %s courage."), m_name); - (void)set_monster_monfear(g_ptr->m_idx, 0); - } + break; + } - /* Heal */ - if (m_ptr->hp < 30000) m_ptr->hp += dam; + /* Polymorph monster (Use "dam" as "power") */ + case GF_OLD_POLY: + { + if (seen) obvious = TRUE; + /* Attempt to polymorph (see below) */ + do_poly = TRUE; - /* No overflow */ - if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp; + /* Powerful monsters can resist */ + if ((r_ptr->flags1 & RF1_UNIQUE) || + (r_ptr->flags1 & RF1_QUESTOR) || + (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) + { + note = _("には効果がなかった。", " is unaffected."); + do_poly = FALSE; + obvious = FALSE; + } - if (!who) - { - chg_virtue(p_ptr, V_VITALITY, 1); + /* No "real" damage */ + dam = 0; - if (r_ptr->flags1 & RF1_UNIQUE) - chg_virtue(p_ptr, V_INDIVIDUALISM, 1); + break; + } - if (is_friendly(m_ptr)) - chg_virtue(p_ptr, V_HONOUR, 1); - else if (!(r_ptr->flags3 & RF3_EVIL)) - { - if (r_ptr->flags3 & RF3_GOOD) - chg_virtue(p_ptr, V_COMPASSION, 2); - else - chg_virtue(p_ptr, V_COMPASSION, 1); - } - if (r_ptr->flags3 & RF3_ANIMAL) - chg_virtue(p_ptr, V_NATURE, 1); - } + /* Clone monsters (Ignore "dam") */ + case GF_OLD_CLONE: + { + if (seen) obvious = TRUE; + + if ((floor_ptr->inside_arena) || is_pet(m_ptr) || (r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) || (r_ptr->flags7 & (RF7_NAZGUL | RF7_UNIQUE2))) + { + note = _("には効果がなかった。", " is unaffected."); + } + else + { + /* Heal fully */ + m_ptr->hp = m_ptr->maxhp; - if (m_ptr->r_idx == MON_LEPER) + /* Attempt to clone. */ + if (multiply_monster(g_ptr->m_idx, TRUE, 0L)) { - heal_leper = TRUE; - if (!who) chg_virtue(p_ptr, V_COMPASSION, 5); + note = _("が分裂した!", " spawns!"); } + } - /* Redraw (later) if needed */ - if (p_ptr->health_who == g_ptr->m_idx) p_ptr->redraw |= (PR_HEALTH); - if (p_ptr->riding == g_ptr->m_idx) p_ptr->redraw |= (PR_UHEALTH); + /* No "real" damage */ + dam = 0; - note = _("は体力を回復したようだ。", " looks healthier."); + break; + } - /* No "real" damage */ - dam = 0; - break; - } + /* Heal Monster (use "dam" as amount of healing) */ + case GF_STAR_HEAL: + { + if (seen) obvious = TRUE; + + /* Wake up */ + (void)set_monster_csleep(caster_ptr, g_ptr->m_idx, 0); - /* Speed Monster (Ignore "dam") */ - case GF_OLD_SPEED: + if (m_ptr->maxhp < m_ptr->max_maxhp) { - if (seen) obvious = TRUE; + if (seen_msg) msg_format(_("%^sの強さが戻った。", "%^s recovers %s vitality."), m_name, m_poss); + m_ptr->maxhp = m_ptr->max_maxhp; + } - /* Speed up */ - if (set_monster_fast(g_ptr->m_idx, MON_FAST(m_ptr) + 100)) - { - note = _("の動きが速くなった。", " starts moving faster."); - } + if (!dam) + { + /* Redraw (later) if needed */ + if (caster_ptr->health_who == g_ptr->m_idx) caster_ptr->redraw |= (PR_HEALTH); + if (caster_ptr->riding == g_ptr->m_idx) caster_ptr->redraw |= (PR_UHEALTH); + break; + } - if (!who) - { - if (r_ptr->flags1 & RF1_UNIQUE) - chg_virtue(p_ptr, V_INDIVIDUALISM, 1); - if (is_friendly(m_ptr)) - chg_virtue(p_ptr, V_HONOUR, 1); - } + /* Fall through */ + } + case GF_OLD_HEAL: + { + if (seen) obvious = TRUE; - /* No "real" damage */ - dam = 0; - break; + /* Wake up */ + (void)set_monster_csleep(caster_ptr, g_ptr->m_idx, 0); + if (MON_STUNNED(m_ptr)) + { + if (seen_msg) msg_format(_("%^sは朦朧状態から立ち直った。", "%^s is no longer stunned."), m_name); + (void)set_monster_stunned(caster_ptr, g_ptr->m_idx, 0); } + if (MON_CONFUSED(m_ptr)) + { + if (seen_msg) msg_format(_("%^sは混乱から立ち直った。", "%^s is no longer confused."), m_name); + (void)set_monster_confused(caster_ptr, g_ptr->m_idx, 0); + } + if (MON_MONFEAR(m_ptr)) + { + if (seen_msg) msg_format(_("%^sは勇気を取り戻した。", "%^s recovers %s courage."), m_name); + (void)set_monster_monfear(caster_ptr, g_ptr->m_idx, 0); + } + + /* Heal */ + if (m_ptr->hp < 30000) m_ptr->hp += dam; + /* No overflow */ + if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp; - /* Slow Monster (Use "dam" as "power") */ - case GF_OLD_SLOW: + if (!who) { - if (seen) obvious = TRUE; + chg_virtue(caster_ptr, V_VITALITY, 1); - /* Powerful monsters can resist */ - if ((r_ptr->flags1 & RF1_UNIQUE) || - (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) - { - note = _("には効果がなかった。", " is unaffected."); - obvious = FALSE; - } + if (r_ptr->flags1 & RF1_UNIQUE) + chg_virtue(caster_ptr, V_INDIVIDUALISM, 1); - /* Normal monsters slow down */ - else + if (is_friendly(m_ptr)) + chg_virtue(caster_ptr, V_HONOUR, 1); + else if (!(r_ptr->flags3 & RF3_EVIL)) { - if (set_monster_slow(g_ptr->m_idx, MON_SLOW(m_ptr) + 50)) - { - note = _("の動きが遅くなった。", " starts moving slower."); - } + if (r_ptr->flags3 & RF3_GOOD) + chg_virtue(caster_ptr, V_COMPASSION, 2); + else + chg_virtue(caster_ptr, V_COMPASSION, 1); } - /* No "real" damage */ - dam = 0; - break; + if (r_ptr->flags3 & RF3_ANIMAL) + chg_virtue(caster_ptr, V_NATURE, 1); + } + + if (m_ptr->r_idx == MON_LEPER) + { + heal_leper = TRUE; + if (!who) chg_virtue(caster_ptr, V_COMPASSION, 5); } + /* Redraw (later) if needed */ + if (caster_ptr->health_who == g_ptr->m_idx) caster_ptr->redraw |= (PR_HEALTH); + if (caster_ptr->riding == g_ptr->m_idx) caster_ptr->redraw |= (PR_UHEALTH); + + note = _("は体力を回復したようだ。", " looks healthier."); + + /* No "real" damage */ + dam = 0; + break; + } + - /* Sleep (Use "dam" as "power") */ - case GF_OLD_SLEEP: + /* Speed Monster (Ignore "dam") */ + case GF_OLD_SPEED: + { + if (seen) obvious = TRUE; + + /* Speed up */ + if (set_monster_fast(caster_ptr, g_ptr->m_idx, MON_FAST(m_ptr) + 100)) { - if (seen) obvious = TRUE; + note = _("の動きが速くなった。", " starts moving faster."); + } - /* Attempt a saving throw */ - if ((r_ptr->flags1 & RF1_UNIQUE) || - (r_ptr->flags3 & RF3_NO_SLEEP) || - (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) - { - /* Memorize a flag */ - if (r_ptr->flags3 & RF3_NO_SLEEP) - { - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_NO_SLEEP); - } - /* No obvious effect */ - note = _("には効果がなかった。", " is unaffected."); - obvious = FALSE; - } - else - { - /* Go to sleep (much) later */ - note = _("は眠り込んでしまった!", " falls asleep!"); - do_sleep = 500; - } - - /* No "real" damage */ - dam = 0; - break; + if (!who) + { + if (r_ptr->flags1 & RF1_UNIQUE) + chg_virtue(caster_ptr, V_INDIVIDUALISM, 1); + if (is_friendly(m_ptr)) + chg_virtue(caster_ptr, V_HONOUR, 1); } + /* No "real" damage */ + dam = 0; + break; + } - /* Sleep (Use "dam" as "power") */ - case GF_STASIS_EVIL: - { - if (seen) obvious = TRUE; - /* Attempt a saving throw */ - if ((r_ptr->flags1 & RF1_UNIQUE) || - !(r_ptr->flags3 & RF3_EVIL) || - (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) - { - note = _("には効果がなかった。", " is unaffected."); - obvious = FALSE; - } - else - { - /* Go to sleep (much) later */ - note = _("は動けなくなった!", " is suspended!"); - do_sleep = 500; - } + /* Slow Monster (Use "dam" as "power") */ + case GF_OLD_SLOW: + { + if (seen) obvious = TRUE; - /* No "real" damage */ - dam = 0; - break; + /* Powerful monsters can resist */ + if ((r_ptr->flags1 & RF1_UNIQUE) || + (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) + { + note = _("には効果がなかった。", " is unaffected."); + obvious = FALSE; } - /* Sleep (Use "dam" as "power") */ - case GF_STASIS: + /* Normal monsters slow down */ + else { - if (seen) obvious = TRUE; - - /* Attempt a saving throw */ - if ((r_ptr->flags1 & RF1_UNIQUE) || - (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) - { - note = _("には効果がなかった。", " is unaffected."); - obvious = FALSE; - } - else + if (set_monster_slow(caster_ptr, g_ptr->m_idx, MON_SLOW(m_ptr) + 50)) { - /* Go to sleep (much) later */ - note = _("は動けなくなった!", " is suspended!"); - do_sleep = 500; + note = _("の動きが遅くなった。", " starts moving slower."); } - - /* No "real" damage */ - dam = 0; - break; } - /* Charm monster */ - case GF_CHARM: + /* No "real" damage */ + dam = 0; + break; + } + + + /* Sleep (Use "dam" as "power") */ + case GF_OLD_SLEEP: + { + if (seen) obvious = TRUE; + + /* Attempt a saving throw */ + if ((r_ptr->flags1 & RF1_UNIQUE) || + (r_ptr->flags3 & RF3_NO_SLEEP) || + (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { - int vir; - vir = virtue_number(p_ptr, V_HARMONY); - if (vir) + /* Memorize a flag */ + if (r_ptr->flags3 & RF3_NO_SLEEP) { - dam += p_ptr->virtues[vir-1]/10; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_NO_SLEEP); } + /* No obvious effect */ + note = _("には効果がなかった。", " is unaffected."); + obvious = FALSE; + } + else + { + /* Go to sleep (much) later */ + note = _("は眠り込んでしまった!", " falls asleep!"); + do_sleep = 500; + } - vir = virtue_number(p_ptr, V_INDIVIDUALISM); - if (vir) - { - dam -= p_ptr->virtues[vir-1]/20; - } + /* No "real" damage */ + dam = 0; + break; + } - if (seen) obvious = TRUE; - /* Attempt a saving throw */ - if (common_saving_throw_charm(p_ptr, dam, m_ptr)) - { + /* Sleep (Use "dam" as "power") */ + case GF_STASIS_EVIL: + { + if (seen) obvious = TRUE; - /* Resist */ - /* No obvious effect */ - note = _("には効果がなかった。", " is unaffected."); - obvious = FALSE; + /* Attempt a saving throw */ + if ((r_ptr->flags1 & RF1_UNIQUE) || + !(r_ptr->flags3 & RF3_EVIL) || + (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) + { + note = _("には効果がなかった。", " is unaffected."); + obvious = FALSE; + } + else + { + /* Go to sleep (much) later */ + note = _("は動けなくなった!", " is suspended!"); + do_sleep = 500; + } - if (one_in_(4)) m_ptr->mflag2 |= MFLAG2_NOPET; - } - else if (p_ptr->cursed & TRC_AGGRAVATE) - { - note = _("はあなたに敵意を抱いている!", " hates you too much!"); - if (one_in_(4)) m_ptr->mflag2 |= MFLAG2_NOPET; - } - else - { - note = _("は突然友好的になったようだ!", " suddenly seems friendly!"); - set_pet(m_ptr); + /* No "real" damage */ + dam = 0; + break; + } - chg_virtue(p_ptr, V_INDIVIDUALISM, -1); - if (r_ptr->flags3 & RF3_ANIMAL) - chg_virtue(p_ptr, V_NATURE, 1); - } + /* Sleep (Use "dam" as "power") */ + case GF_STASIS: + { + if (seen) obvious = TRUE; - /* No "real" damage */ - dam = 0; - break; + /* Attempt a saving throw */ + if ((r_ptr->flags1 & RF1_UNIQUE) || + (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) + { + note = _("には効果がなかった。", " is unaffected."); + obvious = FALSE; } + else + { + /* Go to sleep (much) later */ + note = _("は動けなくなった!", " is suspended!"); + do_sleep = 500; + } + + /* No "real" damage */ + dam = 0; + break; + } - /* Control undead */ - case GF_CONTROL_UNDEAD: + /* Charm monster */ + case GF_CHARM: + { + int vir; + vir = virtue_number(caster_ptr, V_HARMONY); + if (vir) { - int vir; - if (seen) obvious = TRUE; + dam += caster_ptr->virtues[vir - 1] / 10; + } - vir = virtue_number(p_ptr, V_UNLIFE); - if (vir) - { - dam += p_ptr->virtues[vir-1]/10; - } + vir = virtue_number(caster_ptr, V_INDIVIDUALISM); + if (vir) + { + dam -= caster_ptr->virtues[vir - 1] / 20; + } - vir = virtue_number(p_ptr, V_INDIVIDUALISM); - if (vir) - { - dam -= p_ptr->virtues[vir-1]/20; - } + if (seen) obvious = TRUE; - /* Attempt a saving throw */ - if (common_saving_throw_control(p_ptr, dam, m_ptr) || - !(r_ptr->flags3 & RF3_UNDEAD)) - { - /* No obvious effect */ - note = _("には効果がなかった。", " is unaffected."); - obvious = FALSE; - if (one_in_(4)) m_ptr->mflag2 |= MFLAG2_NOPET; - } - else if (p_ptr->cursed & TRC_AGGRAVATE) - { - note = _("はあなたに敵意を抱いている!", " hates you too much!"); - if (one_in_(4)) m_ptr->mflag2 |= MFLAG2_NOPET; - } - else - { - note = _("は既にあなたの奴隷だ!", " is in your thrall!"); - set_pet(m_ptr); - } + /* Attempt a saving throw */ + if (common_saving_throw_charm(caster_ptr, dam, m_ptr)) + { - /* No "real" damage */ - dam = 0; - break; - } + /* Resist */ + /* No obvious effect */ + note = _("には効果がなかった。", " is unaffected."); + obvious = FALSE; - /* Control demon */ - case GF_CONTROL_DEMON: + if (one_in_(4)) m_ptr->mflag2 |= MFLAG2_NOPET; + } + else if (caster_ptr->cursed & TRC_AGGRAVATE) { - int vir; - if (seen) obvious = TRUE; + note = _("はあなたに敵意を抱いている!", " hates you too much!"); + if (one_in_(4)) m_ptr->mflag2 |= MFLAG2_NOPET; + } + else + { + note = _("は突然友好的になったようだ!", " suddenly seems friendly!"); + set_pet(m_ptr); - vir = virtue_number(p_ptr, V_UNLIFE); - if (vir) - { - dam += p_ptr->virtues[vir-1]/10; - } + chg_virtue(caster_ptr, V_INDIVIDUALISM, -1); + if (r_ptr->flags3 & RF3_ANIMAL) + chg_virtue(caster_ptr, V_NATURE, 1); + } - vir = virtue_number(p_ptr, V_INDIVIDUALISM); - if (vir) - { - dam -= p_ptr->virtues[vir-1]/20; - } + /* No "real" damage */ + dam = 0; + break; + } - /* Attempt a saving throw */ - if (common_saving_throw_control(p_ptr, dam, m_ptr) || - !(r_ptr->flags3 & RF3_DEMON)) - { - /* No obvious effect */ - note = _("には効果がなかった。", " is unaffected."); - obvious = FALSE; - if (one_in_(4)) m_ptr->mflag2 |= MFLAG2_NOPET; - } - else if (p_ptr->cursed & TRC_AGGRAVATE) - { - note = _("はあなたに敵意を抱いている!", " hates you too much!"); - if (one_in_(4)) m_ptr->mflag2 |= MFLAG2_NOPET; - } - else - { - note = _("は既にあなたの奴隷だ!", " is in your thrall!"); - set_pet(m_ptr); - } + /* Control undead */ + case GF_CONTROL_UNDEAD: + { + int vir; + if (seen) obvious = TRUE; - /* No "real" damage */ - dam = 0; - break; + vir = virtue_number(caster_ptr, V_UNLIFE); + if (vir) + { + dam += caster_ptr->virtues[vir - 1] / 10; } - /* Tame animal */ - case GF_CONTROL_ANIMAL: + vir = virtue_number(caster_ptr, V_INDIVIDUALISM); + if (vir) { - int vir; - if (seen) obvious = TRUE; + dam -= caster_ptr->virtues[vir - 1] / 20; + } - vir = virtue_number(p_ptr, V_NATURE); - if (vir) - { - dam += p_ptr->virtues[vir-1]/10; - } + /* Attempt a saving throw */ + if (common_saving_throw_control(caster_ptr, dam, m_ptr) || + !(r_ptr->flags3 & RF3_UNDEAD)) + { + /* No obvious effect */ + note = _("には効果がなかった。", " is unaffected."); + obvious = FALSE; + if (one_in_(4)) m_ptr->mflag2 |= MFLAG2_NOPET; + } + else if (caster_ptr->cursed & TRC_AGGRAVATE) + { + note = _("はあなたに敵意を抱いている!", " hates you too much!"); + if (one_in_(4)) m_ptr->mflag2 |= MFLAG2_NOPET; + } + else + { + note = _("は既にあなたの奴隷だ!", " is in your thrall!"); + set_pet(m_ptr); + } - vir = virtue_number(p_ptr, V_INDIVIDUALISM); - if (vir) - { - dam -= p_ptr->virtues[vir-1]/20; - } + /* No "real" damage */ + dam = 0; + break; + } - /* Attempt a saving throw */ - if (common_saving_throw_control(p_ptr, dam, m_ptr) || - !(r_ptr->flags3 & RF3_ANIMAL)) - { - /* Resist */ - /* No obvious effect */ - note = _("には効果がなかった。", " is unaffected."); - obvious = FALSE; - if (one_in_(4)) m_ptr->mflag2 |= MFLAG2_NOPET; - } - else if (p_ptr->cursed & TRC_AGGRAVATE) - { - note = _("はあなたに敵意を抱いている!", " hates you too much!"); - if (one_in_(4)) m_ptr->mflag2 |= MFLAG2_NOPET; - } - else - { - note = _("はなついた。", " is tamed!"); - set_pet(m_ptr); - if (r_ptr->flags3 & RF3_ANIMAL) - chg_virtue(p_ptr, V_NATURE, 1); - } + /* Control demon */ + case GF_CONTROL_DEMON: + { + int vir; + if (seen) obvious = TRUE; - /* No "real" damage */ - dam = 0; - break; + vir = virtue_number(caster_ptr, V_UNLIFE); + if (vir) + { + dam += caster_ptr->virtues[vir - 1] / 10; } - /* Tame animal */ - case GF_CHARM_LIVING: + vir = virtue_number(caster_ptr, V_INDIVIDUALISM); + if (vir) { - int vir; - - vir = virtue_number(p_ptr, V_UNLIFE); - if (seen) obvious = TRUE; + dam -= caster_ptr->virtues[vir - 1] / 20; + } - vir = virtue_number(p_ptr, V_UNLIFE); - if (vir) - { - dam -= p_ptr->virtues[vir-1]/10; - } + /* Attempt a saving throw */ + if (common_saving_throw_control(caster_ptr, dam, m_ptr) || + !(r_ptr->flags3 & RF3_DEMON)) + { + /* No obvious effect */ + note = _("には効果がなかった。", " is unaffected."); + obvious = FALSE; + if (one_in_(4)) m_ptr->mflag2 |= MFLAG2_NOPET; + } + else if (caster_ptr->cursed & TRC_AGGRAVATE) + { + note = _("はあなたに敵意を抱いている!", " hates you too much!"); + if (one_in_(4)) m_ptr->mflag2 |= MFLAG2_NOPET; + } + else + { + note = _("は既にあなたの奴隷だ!", " is in your thrall!"); + set_pet(m_ptr); + } - vir = virtue_number(p_ptr, V_INDIVIDUALISM); - if (vir) - { - dam -= p_ptr->virtues[vir-1]/20; - } + /* No "real" damage */ + dam = 0; + break; + } - msg_format(_("%sを見つめた。", "You stare into %s."), m_name); + /* Tame animal */ + case GF_CONTROL_ANIMAL: + { + int vir; + if (seen) obvious = TRUE; - /* Attempt a saving throw */ - if (common_saving_throw_charm(p_ptr, dam, m_ptr) || - !monster_living(m_ptr->r_idx)) - { - /* Resist */ - /* No obvious effect */ - note = _("には効果がなかった。", " is unaffected."); - obvious = FALSE; - if (one_in_(4)) m_ptr->mflag2 |= MFLAG2_NOPET; - } - else if (p_ptr->cursed & TRC_AGGRAVATE) - { - note = _("はあなたに敵意を抱いている!", " hates you too much!"); - if (one_in_(4)) m_ptr->mflag2 |= MFLAG2_NOPET; - } - else - { - note = _("を支配した。", " is tamed!"); - set_pet(m_ptr); - if (r_ptr->flags3 & RF3_ANIMAL) - chg_virtue(p_ptr, V_NATURE, 1); - } + vir = virtue_number(caster_ptr, V_NATURE); + if (vir) + { + dam += caster_ptr->virtues[vir - 1] / 10; + } - /* No "real" damage */ - dam = 0; - break; + vir = virtue_number(caster_ptr, V_INDIVIDUALISM); + if (vir) + { + dam -= caster_ptr->virtues[vir - 1] / 20; } - /* Confusion (Use "dam" as "power") */ - case GF_OLD_CONF: + /* Attempt a saving throw */ + if (common_saving_throw_control(caster_ptr, dam, m_ptr) || + !(r_ptr->flags3 & RF3_ANIMAL)) { - if (seen) obvious = TRUE; - - /* Get confused later */ - do_conf = damroll(3, (dam / 2)) + 1; + /* Resist */ + /* No obvious effect */ + note = _("には効果がなかった。", " is unaffected."); + obvious = FALSE; + if (one_in_(4)) m_ptr->mflag2 |= MFLAG2_NOPET; + } + else if (caster_ptr->cursed & TRC_AGGRAVATE) + { + note = _("はあなたに敵意を抱いている!", " hates you too much!"); + if (one_in_(4)) m_ptr->mflag2 |= MFLAG2_NOPET; + } + else + { + note = _("はなついた。", " is tamed!"); + set_pet(m_ptr); + if (r_ptr->flags3 & RF3_ANIMAL) + chg_virtue(caster_ptr, V_NATURE, 1); + } - /* Attempt a saving throw */ - if ((r_ptr->flags1 & (RF1_UNIQUE)) || - (r_ptr->flags3 & (RF3_NO_CONF)) || - (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) - { - /* Memorize a flag */ - if (r_ptr->flags3 & (RF3_NO_CONF)) - { - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_NO_CONF); - } + /* No "real" damage */ + dam = 0; + break; + } - /* Resist */ - do_conf = 0; + /* Tame animal */ + case GF_CHARM_LIVING: + { + int vir; - /* No obvious effect */ - note = _("には効果がなかった。", " is unaffected."); - obvious = FALSE; - } + vir = virtue_number(caster_ptr, V_UNLIFE); + if (seen) obvious = TRUE; - /* No "real" damage */ - dam = 0; - break; + vir = virtue_number(caster_ptr, V_UNLIFE); + if (vir) + { + dam -= caster_ptr->virtues[vir - 1] / 10; } - case GF_STUN: + vir = virtue_number(caster_ptr, V_INDIVIDUALISM); + if (vir) { - if (seen) obvious = TRUE; - - do_stun = damroll((caster_lev / 20) + 3 , (dam)) + 1; - - /* Attempt a saving throw */ - if ((r_ptr->flags1 & (RF1_UNIQUE)) || - (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) - { - /* Resist */ - do_stun = 0; + dam -= caster_ptr->virtues[vir - 1] / 20; + } - /* No obvious effect */ - note = _("には効果がなかった。", " is unaffected."); - obvious = FALSE; - } + msg_format(_("%sを見つめた。", "You stare into %s."), m_name); - /* No "real" damage */ - dam = 0; - break; + /* Attempt a saving throw */ + if (common_saving_throw_charm(caster_ptr, dam, m_ptr) || + !monster_living(m_ptr->r_idx)) + { + /* Resist */ + /* No obvious effect */ + note = _("には効果がなかった。", " is unaffected."); + obvious = FALSE; + if (one_in_(4)) m_ptr->mflag2 |= MFLAG2_NOPET; } - - /* Lite, but only hurts susceptible creatures */ - case GF_LITE_WEAK: + else if (caster_ptr->cursed & TRC_AGGRAVATE) { - if (!dam) - { - skipped = TRUE; - break; - } - /* Hurt by light */ - if (r_ptr->flags3 & (RF3_HURT_LITE)) - { - /* Obvious effect */ - if (seen) obvious = TRUE; + note = _("はあなたに敵意を抱いている!", " hates you too much!"); + if (one_in_(4)) m_ptr->mflag2 |= MFLAG2_NOPET; + } + else + { + note = _("を支配した。", " is tamed!"); + set_pet(m_ptr); + if (r_ptr->flags3 & RF3_ANIMAL) + chg_virtue(caster_ptr, V_NATURE, 1); + } - /* Memorize the effects */ - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_HURT_LITE); + /* No "real" damage */ + dam = 0; + break; + } - /* Special effect */ - note = _("は光に身をすくめた!", " cringes from the light!"); - note_dies = _("は光を受けてしぼんでしまった!", " shrivels away in the light!"); - } + /* Confusion (Use "dam" as "power") */ + case GF_OLD_CONF: + { + if (seen) obvious = TRUE; - /* Normally no damage */ - else + /* Get confused later */ + do_conf = damroll(3, (dam / 2)) + 1; + + /* Attempt a saving throw */ + if ((r_ptr->flags1 & (RF1_UNIQUE)) || + (r_ptr->flags3 & (RF3_NO_CONF)) || + (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) + { + /* Memorize a flag */ + if (r_ptr->flags3 & (RF3_NO_CONF)) { - /* No damage */ - dam = 0; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_NO_CONF); } - break; + /* Resist */ + do_conf = 0; + + /* No obvious effect */ + note = _("には効果がなかった。", " is unaffected."); + obvious = FALSE; } + /* No "real" damage */ + dam = 0; + break; + } + + case GF_STUN: + { + if (seen) obvious = TRUE; + do_stun = damroll((caster_lev / 20) + 3, (dam)) + 1; - /* Lite -- opposite of Dark */ - case GF_LITE: + /* Attempt a saving throw */ + if ((r_ptr->flags1 & (RF1_UNIQUE)) || + (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { - if (seen) obvious = TRUE; + /* Resist */ + do_stun = 0; - if (r_ptr->flagsr & RFR_RES_LITE) - { - note = _("には耐性がある!", " resists!"); - dam *= 2; dam /= (randint1(6)+6); - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_LITE); - } - else if (r_ptr->flags3 & (RF3_HURT_LITE)) - { - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_HURT_LITE); - note = _("は光に身をすくめた!", " cringes from the light!"); - note_dies = _("は光を受けてしぼんでしまった!", " shrivels away in the light!"); - dam *= 2; - } - break; + /* No obvious effect */ + note = _("には効果がなかった。", " is unaffected."); + obvious = FALSE; } + /* No "real" damage */ + dam = 0; + break; + } - /* Dark -- opposite of Lite */ - case GF_DARK: + /* Lite, but only hurts susceptible creatures */ + case GF_LITE_WEAK: + { + if (!dam) { - if (seen) obvious = TRUE; - - if (r_ptr->flagsr & RFR_RES_DARK) - { - note = _("には耐性がある!", " resists!"); - dam *= 2; dam /= (randint1(6)+6); - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_DARK); - } + skipped = TRUE; break; } + /* Hurt by light */ + if (r_ptr->flags3 & (RF3_HURT_LITE)) + { + /* Obvious effect */ + if (seen) obvious = TRUE; + /* Memorize the effects */ + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_HURT_LITE); + + /* Special effect */ + note = _("は光に身をすくめた!", " cringes from the light!"); + note_dies = _("は光を受けてしぼんでしまった!", " shrivels away in the light!"); + } - /* Stone to Mud */ - case GF_KILL_WALL: + /* Normally no damage */ + else { - /* Hurt by rock remover */ - if (r_ptr->flags3 & (RF3_HURT_ROCK)) - { - /* Notice effect */ - if (seen) obvious = TRUE; + /* No damage */ + dam = 0; + } - /* Memorize the effects */ - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_HURT_ROCK); + break; + } - /* Cute little message */ - note = _("の皮膚がただれた!", " loses some skin!"); - note_dies = _("はドロドロに溶けた!", " dissolves!"); - } - /* Usually, ignore the effects */ - else - { - /* No damage */ - dam = 0; - } - break; + /* Lite -- opposite of Dark */ + case GF_LITE: + { + if (seen) obvious = TRUE; + + if (r_ptr->flagsr & RFR_RES_LITE) + { + note = _("には耐性がある!", " resists!"); + dam *= 2; dam /= (randint1(6) + 6); + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_LITE); + } + else if (r_ptr->flags3 & (RF3_HURT_LITE)) + { + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_HURT_LITE); + note = _("は光に身をすくめた!", " cringes from the light!"); + note_dies = _("は光を受けてしぼんでしまった!", " shrivels away in the light!"); + dam *= 2; } + break; + } - /* Teleport undead (Use "dam" as "power") */ - case GF_AWAY_UNDEAD: + /* Dark -- opposite of Lite */ + case GF_DARK: + { + if (seen) obvious = TRUE; + + if (r_ptr->flagsr & RFR_RES_DARK) { - /* Only affect undead */ - if (r_ptr->flags3 & (RF3_UNDEAD)) - { - bool resists_tele = FALSE; + note = _("には耐性がある!", " resists!"); + dam *= 2; dam /= (randint1(6) + 6); + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (RFR_RES_DARK); + } + break; + } - if (r_ptr->flagsr & RFR_RES_TELE) - { - if ((r_ptr->flags1 & (RF1_UNIQUE)) || (r_ptr->flagsr & RFR_RES_ALL)) - { - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE; - note = _("には効果がなかった。", " is unaffected."); - resists_tele = TRUE; - } - else if (r_ptr->level > randint1(100)) - { - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE; - note = _("には耐性がある!", " resists!"); - resists_tele = TRUE; - } - } - if (!resists_tele) - { - if (seen) obvious = TRUE; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_UNDEAD); - do_dist = dam; - } - } + /* Stone to Mud */ + case GF_KILL_WALL: + { + /* Hurt by rock remover */ + if (r_ptr->flags3 & (RF3_HURT_ROCK)) + { + /* Notice effect */ + if (seen) obvious = TRUE; - /* Others ignore */ - else - { - /* Irrelevant */ - skipped = TRUE; - } + /* Memorize the effects */ + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_HURT_ROCK); - /* No "real" damage */ + /* Cute little message */ + note = _("の皮膚がただれた!", " loses some skin!"); + note_dies = _("はドロドロに溶けた!", " dissolves!"); + } + + /* Usually, ignore the effects */ + else + { + /* No damage */ dam = 0; - break; } + break; + } + - /* Teleport evil (Use "dam" as "power") */ - case GF_AWAY_EVIL: + /* Teleport undead (Use "dam" as "power") */ + case GF_AWAY_UNDEAD: + { + /* Only affect undead */ + if (r_ptr->flags3 & (RF3_UNDEAD)) { - /* Only affect evil */ - if (r_ptr->flags3 & (RF3_EVIL)) - { - bool resists_tele = FALSE; + bool resists_tele = FALSE; - if (r_ptr->flagsr & RFR_RES_TELE) + if (r_ptr->flagsr & RFR_RES_TELE) + { + if ((r_ptr->flags1 & (RF1_UNIQUE)) || (r_ptr->flagsr & RFR_RES_ALL)) { - if ((r_ptr->flags1 & (RF1_UNIQUE)) || (r_ptr->flagsr & RFR_RES_ALL)) - { - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE; - note = _("には効果がなかった。", " is unaffected."); - resists_tele = TRUE; - } - else if (r_ptr->level > randint1(100)) - { - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE; - note = _("には耐性がある!", " resists!"); - resists_tele = TRUE; - } + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE; + note = _("には効果がなかった。", " is unaffected."); + resists_tele = TRUE; } - - if (!resists_tele) + else if (r_ptr->level > randint1(100)) { - if (seen) obvious = TRUE; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_EVIL); - do_dist = dam; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE; + note = _("には耐性がある!", " resists!"); + resists_tele = TRUE; } } - /* Others ignore */ - else + if (!resists_tele) { - /* Irrelevant */ - skipped = TRUE; + if (seen) obvious = TRUE; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_UNDEAD); + do_dist = dam; } + } - /* No "real" damage */ - dam = 0; - break; + /* Others ignore */ + else + { + /* Irrelevant */ + skipped = TRUE; } + /* No "real" damage */ + dam = 0; + break; + } + - /* Teleport monster (Use "dam" as "power") */ - case GF_AWAY_ALL: + /* Teleport evil (Use "dam" as "power") */ + case GF_AWAY_EVIL: + { + /* Only affect evil */ + if (r_ptr->flags3 & (RF3_EVIL)) { bool resists_tele = FALSE; + if (r_ptr->flagsr & RFR_RES_TELE) { if ((r_ptr->flags1 & (RF1_UNIQUE)) || (r_ptr->flagsr & RFR_RES_ALL)) @@ -2835,774 +2803,815 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P if (!resists_tele) { if (seen) obvious = TRUE; - - /* Prepare to teleport */ + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_EVIL); do_dist = dam; } - - /* No "real" damage */ - dam = 0; - break; } - - /* Turn undead (Use "dam" as "power") */ - case GF_TURN_UNDEAD: + /* Others ignore */ + else { - /* Only affect undead */ - if (r_ptr->flags3 & (RF3_UNDEAD)) - { - if (seen) obvious = TRUE; + /* Irrelevant */ + skipped = TRUE; + } - /* Learn about type */ - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_UNDEAD); + /* No "real" damage */ + dam = 0; + break; + } - /* Apply some fear */ - do_fear = damroll(3, (dam / 2)) + 1; - /* Attempt a saving throw */ - if (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10) - { - /* No obvious effect */ - note = _("には効果がなかった。", " is unaffected."); - obvious = FALSE; - do_fear = 0; - } + /* Teleport monster (Use "dam" as "power") */ + case GF_AWAY_ALL: + { + bool resists_tele = FALSE; + if (r_ptr->flagsr & RFR_RES_TELE) + { + if ((r_ptr->flags1 & (RF1_UNIQUE)) || (r_ptr->flagsr & RFR_RES_ALL)) + { + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE; + note = _("には効果がなかった。", " is unaffected."); + resists_tele = TRUE; } - - /* Others ignore */ - else + else if (r_ptr->level > randint1(100)) { - /* Irrelevant */ - skipped = TRUE; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE; + note = _("には耐性がある!", " resists!"); + resists_tele = TRUE; } + } - /* No "real" damage */ - dam = 0; - break; + if (!resists_tele) + { + if (seen) obvious = TRUE; + + /* Prepare to teleport */ + do_dist = dam; } + /* No "real" damage */ + dam = 0; + break; + } - /* Turn evil (Use "dam" as "power") */ - case GF_TURN_EVIL: - { - /* Only affect evil */ - if (r_ptr->flags3 & (RF3_EVIL)) - { - if (seen) obvious = TRUE; - /* Learn about type */ - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_EVIL); + /* Turn undead (Use "dam" as "power") */ + case GF_TURN_UNDEAD: + { + /* Only affect undead */ + if (r_ptr->flags3 & (RF3_UNDEAD)) + { + if (seen) obvious = TRUE; - /* Apply some fear */ - do_fear = damroll(3, (dam / 2)) + 1; + /* Learn about type */ + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_UNDEAD); - /* Attempt a saving throw */ - if (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10) - { - /* No obvious effect */ - note = _("には効果がなかった。", " is unaffected."); - obvious = FALSE; - do_fear = 0; - } - } + /* Apply some fear */ + do_fear = damroll(3, (dam / 2)) + 1; - /* Others ignore */ - else + /* Attempt a saving throw */ + if (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10) { - /* Irrelevant */ - skipped = TRUE; + /* No obvious effect */ + note = _("には効果がなかった。", " is unaffected."); + obvious = FALSE; + do_fear = 0; } + } - /* No "real" damage */ - dam = 0; - break; + /* Others ignore */ + else + { + /* Irrelevant */ + skipped = TRUE; } + /* No "real" damage */ + dam = 0; + break; + } + - /* Turn monster (Use "dam" as "power") */ - case GF_TURN_ALL: + /* Turn evil (Use "dam" as "power") */ + case GF_TURN_EVIL: + { + /* Only affect evil */ + if (r_ptr->flags3 & (RF3_EVIL)) { if (seen) obvious = TRUE; + /* Learn about type */ + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_EVIL); + /* Apply some fear */ do_fear = damroll(3, (dam / 2)) + 1; /* Attempt a saving throw */ - if ((r_ptr->flags1 & (RF1_UNIQUE)) || - (r_ptr->flags3 & (RF3_NO_FEAR)) || - (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) + if (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10) { /* No obvious effect */ note = _("には効果がなかった。", " is unaffected."); obvious = FALSE; do_fear = 0; } + } - /* No "real" damage */ - dam = 0; - break; + /* Others ignore */ + else + { + /* Irrelevant */ + skipped = TRUE; } + /* No "real" damage */ + dam = 0; + break; + } + + + /* Turn monster (Use "dam" as "power") */ + case GF_TURN_ALL: + { + if (seen) obvious = TRUE; + + /* Apply some fear */ + do_fear = damroll(3, (dam / 2)) + 1; - /* Dispel undead */ - case GF_DISP_UNDEAD: + /* Attempt a saving throw */ + if ((r_ptr->flags1 & (RF1_UNIQUE)) || + (r_ptr->flags3 & (RF3_NO_FEAR)) || + (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { - /* Only affect undead */ - if (r_ptr->flags3 & (RF3_UNDEAD)) - { - if (seen) obvious = TRUE; + /* No obvious effect */ + note = _("には効果がなかった。", " is unaffected."); + obvious = FALSE; + do_fear = 0; + } - /* Learn about type */ - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_UNDEAD); + /* No "real" damage */ + dam = 0; + break; + } - note = _("は身震いした。", " shudders."); - note_dies = _("はドロドロに溶けた!", " dissolves!"); - } - /* Others ignore */ - else - { - /* Irrelevant */ - skipped = TRUE; + /* Dispel undead */ + case GF_DISP_UNDEAD: + { + /* Only affect undead */ + if (r_ptr->flags3 & (RF3_UNDEAD)) + { + if (seen) obvious = TRUE; - /* No damage */ - dam = 0; - } + /* Learn about type */ + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_UNDEAD); - break; + note = _("は身震いした。", " shudders."); + note_dies = _("はドロドロに溶けた!", " dissolves!"); } - - /* Dispel evil */ - case GF_DISP_EVIL: + /* Others ignore */ + else { - /* Only affect evil */ - if (r_ptr->flags3 & (RF3_EVIL)) - { - if (seen) obvious = TRUE; + /* Irrelevant */ + skipped = TRUE; - /* Learn about type */ - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_EVIL); + /* No damage */ + dam = 0; + } - note = _("は身震いした。", " shudders."); - note_dies = _("はドロドロに溶けた!", " dissolves!"); - } + break; + } - /* Others ignore */ - else - { - /* Irrelevant */ - skipped = TRUE; - /* No damage */ - dam = 0; - } + /* Dispel evil */ + case GF_DISP_EVIL: + { + /* Only affect evil */ + if (r_ptr->flags3 & (RF3_EVIL)) + { + if (seen) obvious = TRUE; - break; + /* Learn about type */ + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_EVIL); + + note = _("は身震いした。", " shudders."); + note_dies = _("はドロドロに溶けた!", " dissolves!"); } - /* Dispel good */ - case GF_DISP_GOOD: + /* Others ignore */ + else { - /* Only affect good */ - if (r_ptr->flags3 & (RF3_GOOD)) - { - if (seen) obvious = TRUE; + /* Irrelevant */ + skipped = TRUE; - /* Learn about type */ - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_GOOD); + /* No damage */ + dam = 0; + } - note = _("は身震いした。", " shudders."); - note_dies = _("はドロドロに溶けた!", " dissolves!"); - } + break; + } - /* Others ignore */ - else - { - /* Irrelevant */ - skipped = TRUE; + /* Dispel good */ + case GF_DISP_GOOD: + { + /* Only affect good */ + if (r_ptr->flags3 & (RF3_GOOD)) + { + if (seen) obvious = TRUE; - /* No damage */ - dam = 0; - } + /* Learn about type */ + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_GOOD); - break; + note = _("は身震いした。", " shudders."); + note_dies = _("はドロドロに溶けた!", " dissolves!"); } - /* Dispel living */ - case GF_DISP_LIVING: + /* Others ignore */ + else { - /* Only affect non-undead */ - if (monster_living(m_ptr->r_idx)) - { - if (seen) obvious = TRUE; + /* Irrelevant */ + skipped = TRUE; - note = _("は身震いした。", " shudders."); - note_dies = _("はドロドロに溶けた!", " dissolves!"); - } + /* No damage */ + dam = 0; + } - /* Others ignore */ - else - { - /* Irrelevant */ - skipped = TRUE; + break; + } - /* No damage */ - dam = 0; - } + /* Dispel living */ + case GF_DISP_LIVING: + { + /* Only affect non-undead */ + if (monster_living(m_ptr->r_idx)) + { + if (seen) obvious = TRUE; - break; + note = _("は身震いした。", " shudders."); + note_dies = _("はドロドロに溶けた!", " dissolves!"); } - /* Dispel demons */ - case GF_DISP_DEMON: + /* Others ignore */ + else { - /* Only affect demons */ - if (r_ptr->flags3 & (RF3_DEMON)) - { - if (seen) obvious = TRUE; + /* Irrelevant */ + skipped = TRUE; - /* Learn about type */ - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_DEMON); + /* No damage */ + dam = 0; + } - note = _("は身震いした。", " shudders."); - note_dies = _("はドロドロに溶けた!", " dissolves!"); - } + break; + } - /* Others ignore */ - else - { - /* Irrelevant */ - skipped = TRUE; + /* Dispel demons */ + case GF_DISP_DEMON: + { + /* Only affect demons */ + if (r_ptr->flags3 & (RF3_DEMON)) + { + if (seen) obvious = TRUE; - /* No damage */ - dam = 0; - } + /* Learn about type */ + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_DEMON); - break; + note = _("は身震いした。", " shudders."); + note_dies = _("はドロドロに溶けた!", " dissolves!"); } - /* Dispel monster */ - case GF_DISP_ALL: + /* Others ignore */ + else { - if (seen) obvious = TRUE; - note = _("は身震いした。", " shudders."); - note_dies = _("はドロドロに溶けた!", " dissolves!"); - break; + /* Irrelevant */ + skipped = TRUE; + + /* No damage */ + dam = 0; } - /* Drain mana */ - case GF_DRAIN_MANA: + break; + } + + /* Dispel monster */ + case GF_DISP_ALL: + { + if (seen) obvious = TRUE; + note = _("は身震いした。", " shudders."); + note_dies = _("はドロドロに溶けた!", " dissolves!"); + break; + } + + /* Drain mana */ + case GF_DRAIN_MANA: + { + if (seen) obvious = TRUE; + if ((r_ptr->flags4 & ~(RF4_NOMAGIC_MASK)) || (r_ptr->a_ability_flags1 & ~(RF5_NOMAGIC_MASK)) || (r_ptr->a_ability_flags2 & ~(RF6_NOMAGIC_MASK))) { - if (seen) obvious = TRUE; - if ((r_ptr->flags4 & ~(RF4_NOMAGIC_MASK)) || (r_ptr->a_ability_flags1 & ~(RF5_NOMAGIC_MASK)) || (r_ptr->a_ability_flags2 & ~(RF6_NOMAGIC_MASK))) + if (who > 0) { - if (who > 0) + /* Heal the monster */ + if (m_caster_ptr->hp < m_caster_ptr->maxhp) { - /* Heal the monster */ - if (caster_ptr->hp < caster_ptr->maxhp) - { - /* Heal */ - caster_ptr->hp += dam; - if (caster_ptr->hp > caster_ptr->maxhp) caster_ptr->hp = caster_ptr->maxhp; + /* Heal */ + m_caster_ptr->hp += dam; + if (m_caster_ptr->hp > m_caster_ptr->maxhp) m_caster_ptr->hp = m_caster_ptr->maxhp; - /* Redraw (later) if needed */ - if (p_ptr->health_who == who) p_ptr->redraw |= (PR_HEALTH); - if (p_ptr->riding == who) p_ptr->redraw |= (PR_UHEALTH); + /* Redraw (later) if needed */ + if (caster_ptr->health_who == who) caster_ptr->redraw |= (PR_HEALTH); + if (caster_ptr->riding == who) caster_ptr->redraw |= (PR_UHEALTH); - /* Special message */ - if (see_s_msg) - { - monster_desc(killer, caster_ptr, 0); - msg_format(_("%^sは気分が良さそうだ。", "%^s appears healthier."), killer); - } + /* Special message */ + if (see_s_msg) + { + monster_desc(killer, m_caster_ptr, 0); + msg_format(_("%^sは気分が良さそうだ。", "%^s appears healthier."), killer); } } - else - { - msg_format(_("%sから精神エネルギーを吸いとった。", "You draw psychic energy from %s."), m_name); - (void)hp_player(p_ptr, dam); - } } else { - if (see_s_msg) msg_format(_("%sには効果がなかった。", "%s is unaffected."), m_name); + msg_format(_("%sから精神エネルギーを吸いとった。", "You draw psychic energy from %s."), m_name); + (void)hp_player(caster_ptr, dam); } - dam = 0; - break; } + else + { + if (see_s_msg) msg_format(_("%sには効果がなかった。", "%s is unaffected."), m_name); + } + dam = 0; + break; + } - /* Mind blast */ - case GF_MIND_BLAST: + /* Mind blast */ + case GF_MIND_BLAST: + { + if (seen) obvious = TRUE; + if (!who) msg_format(_("%sをじっと睨んだ。", "You gaze intently at %s."), m_name); + /* Attempt a saving throw */ + if ((r_ptr->flags1 & RF1_UNIQUE) || + (r_ptr->flags3 & RF3_NO_CONF) || + (r_ptr->level > randint1((caster_lev - 10) < 1 ? 1 : (caster_lev - 10)) + 10)) { - if (seen) obvious = TRUE; - if (!who) msg_format(_("%sをじっと睨んだ。", "You gaze intently at %s."), m_name); - /* Attempt a saving throw */ - if ((r_ptr->flags1 & RF1_UNIQUE) || - (r_ptr->flags3 & RF3_NO_CONF) || - (r_ptr->level > randint1((caster_lev - 10) < 1 ? 1 : (caster_lev - 10)) + 10)) - { - /* Memorize a flag */ - if (r_ptr->flags3 & (RF3_NO_CONF)) - { - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_NO_CONF); - } - note = _("には効果がなかった。", " is unaffected."); - dam = 0; - } - else if (r_ptr->flags2 & RF2_EMPTY_MIND) + /* Memorize a flag */ + if (r_ptr->flags3 & (RF3_NO_CONF)) { - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags2 |= (RF2_EMPTY_MIND); - note = _("には完全な耐性がある!", " is immune."); - dam = 0; - } - else if (r_ptr->flags2 & RF2_WEIRD_MIND) - { - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags2 |= (RF2_WEIRD_MIND); - note = _("には耐性がある。", " resists."); - dam /= 3; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_NO_CONF); } - else - { - note = _("は精神攻撃を食らった。", " is blasted by psionic energy."); - note_dies = _("の精神は崩壊し、肉体は抜け殻となった。", " collapses, a mindless husk."); + note = _("には効果がなかった。", " is unaffected."); + dam = 0; + } + else if (r_ptr->flags2 & RF2_EMPTY_MIND) + { + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags2 |= (RF2_EMPTY_MIND); + note = _("には完全な耐性がある!", " is immune."); + dam = 0; + } + else if (r_ptr->flags2 & RF2_WEIRD_MIND) + { + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags2 |= (RF2_WEIRD_MIND); + note = _("には耐性がある。", " resists."); + dam /= 3; + } + else + { + note = _("は精神攻撃を食らった。", " is blasted by psionic energy."); + note_dies = _("の精神は崩壊し、肉体は抜け殻となった。", " collapses, a mindless husk."); - if (who > 0) do_conf = randint0(4) + 4; - else do_conf = randint0(8) + 8; - } - break; + if (who > 0) do_conf = randint0(4) + 4; + else do_conf = randint0(8) + 8; } + break; + } - /* Brain smash */ - case GF_BRAIN_SMASH: - { - if (seen) obvious = TRUE; - if (!who) msg_format(_("%sをじっと睨んだ。", "You gaze intently at %s."), m_name); + /* Brain smash */ + case GF_BRAIN_SMASH: + { + if (seen) obvious = TRUE; + if (!who) msg_format(_("%sをじっと睨んだ。", "You gaze intently at %s."), m_name); - /* Attempt a saving throw */ - if ((r_ptr->flags1 & RF1_UNIQUE) || - (r_ptr->flags3 & RF3_NO_CONF) || - (r_ptr->level > randint1((caster_lev - 10) < 1 ? 1 : (caster_lev - 10)) + 10)) - { - /* Memorize a flag */ - if (r_ptr->flags3 & (RF3_NO_CONF)) - { - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_NO_CONF); - } - note = _("には効果がなかった。", " is unaffected."); - dam = 0; - } - else if (r_ptr->flags2 & RF2_EMPTY_MIND) - { - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags2 |= (RF2_EMPTY_MIND); - note = _("には完全な耐性がある!", " is immune."); - dam = 0; - } - else if (r_ptr->flags2 & RF2_WEIRD_MIND) + /* Attempt a saving throw */ + if ((r_ptr->flags1 & RF1_UNIQUE) || + (r_ptr->flags3 & RF3_NO_CONF) || + (r_ptr->level > randint1((caster_lev - 10) < 1 ? 1 : (caster_lev - 10)) + 10)) + { + /* Memorize a flag */ + if (r_ptr->flags3 & (RF3_NO_CONF)) { - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags2 |= (RF2_WEIRD_MIND); - note = _("には耐性がある!", " resists!"); - dam /= 3; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_NO_CONF); } - else - { - note = _("は精神攻撃を食らった。", " is blasted by psionic energy."); - note_dies = _("の精神は崩壊し、肉体は抜け殻となった。", " collapses, a mindless husk."); + note = _("には効果がなかった。", " is unaffected."); + dam = 0; + } + else if (r_ptr->flags2 & RF2_EMPTY_MIND) + { + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags2 |= (RF2_EMPTY_MIND); + note = _("には完全な耐性がある!", " is immune."); + dam = 0; + } + else if (r_ptr->flags2 & RF2_WEIRD_MIND) + { + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags2 |= (RF2_WEIRD_MIND); + note = _("には耐性がある!", " resists!"); + dam /= 3; + } + else + { + note = _("は精神攻撃を食らった。", " is blasted by psionic energy."); + note_dies = _("の精神は崩壊し、肉体は抜け殻となった。", " collapses, a mindless husk."); - if (who > 0) - { - do_conf = randint0(4) + 4; - do_stun = randint0(4) + 4; - } - else - { - do_conf = randint0(8) + 8; - do_stun = randint0(8) + 8; - } - (void)set_monster_slow(g_ptr->m_idx, MON_SLOW(m_ptr) + 10); + if (who > 0) + { + do_conf = randint0(4) + 4; + do_stun = randint0(4) + 4; } - break; + else + { + do_conf = randint0(8) + 8; + do_stun = randint0(8) + 8; + } + (void)set_monster_slow(caster_ptr, g_ptr->m_idx, MON_SLOW(m_ptr) + 10); } + break; + } - /* CAUSE_1 */ - case GF_CAUSE_1: + /* CAUSE_1 */ + case GF_CAUSE_1: + { + if (seen) obvious = TRUE; + if (!who) msg_format(_("%sを指差して呪いをかけた。", "You point at %s and curse."), m_name); + /* Attempt a saving throw */ + if (randint0(100 + (caster_lev / 2)) < (r_ptr->level + 35)) { - if (seen) obvious = TRUE; - if (!who) msg_format(_("%sを指差して呪いをかけた。", "You point at %s and curse."), m_name); - /* Attempt a saving throw */ - if (randint0(100 + (caster_lev / 2)) < (r_ptr->level + 35)) - { - note = _("には効果がなかった。", " is unaffected."); - dam = 0; - } - break; + note = _("には効果がなかった。", " is unaffected."); + dam = 0; } + break; + } - /* CAUSE_2 */ - case GF_CAUSE_2: + /* CAUSE_2 */ + case GF_CAUSE_2: + { + if (seen) obvious = TRUE; + if (!who) msg_format(_("%sを指差して恐ろしげに呪いをかけた。", "You point at %s and curse horribly."), m_name); + /* Attempt a saving throw */ + if (randint0(100 + (caster_lev / 2)) < (r_ptr->level + 35)) { - if (seen) obvious = TRUE; - if (!who) msg_format(_("%sを指差して恐ろしげに呪いをかけた。", "You point at %s and curse horribly."), m_name); - /* Attempt a saving throw */ - if (randint0(100 + (caster_lev / 2)) < (r_ptr->level + 35)) - { - note = _("には効果がなかった。", " is unaffected."); - dam = 0; - } - break; + note = _("には効果がなかった。", " is unaffected."); + dam = 0; } + break; + } - /* CAUSE_3 */ - case GF_CAUSE_3: + /* CAUSE_3 */ + case GF_CAUSE_3: + { + if (seen) obvious = TRUE; + if (!who) msg_format(_("%sを指差し、恐ろしげに呪文を唱えた!", "You point at %s, incanting terribly!"), m_name); + /* Attempt a saving throw */ + if (randint0(100 + (caster_lev / 2)) < (r_ptr->level + 35)) { - if (seen) obvious = TRUE; - if (!who) msg_format(_("%sを指差し、恐ろしげに呪文を唱えた!", "You point at %s, incanting terribly!"), m_name); - /* Attempt a saving throw */ - if (randint0(100 + (caster_lev / 2)) < (r_ptr->level + 35)) - { - note = _("には効果がなかった。", " is unaffected."); - dam = 0; - } - break; + note = _("には効果がなかった。", " is unaffected."); + dam = 0; } + break; + } - /* CAUSE_4 */ - case GF_CAUSE_4: + /* CAUSE_4 */ + case GF_CAUSE_4: + { + if (seen) obvious = TRUE; + if (!who) + msg_format(_("%sの秘孔を突いて、「お前は既に死んでいる」と叫んだ。", + "You point at %s, screaming the word, 'DIE!'."), m_name); + /* Attempt a saving throw */ + if ((randint0(100 + (caster_lev / 2)) < (r_ptr->level + 35)) && ((who <= 0) || (m_caster_ptr->r_idx != MON_KENSHIROU))) { - if (seen) obvious = TRUE; - if (!who) - msg_format(_("%sの秘孔を突いて、「お前は既に死んでいる」と叫んだ。", - "You point at %s, screaming the word, 'DIE!'."), m_name); - /* Attempt a saving throw */ - if ((randint0(100 + (caster_lev / 2)) < (r_ptr->level + 35)) && ((who <= 0) || (caster_ptr->r_idx != MON_KENSHIROU))) - { - note = _("には効果がなかった。", " is unaffected."); - dam = 0; - } - break; + note = _("には効果がなかった。", " is unaffected."); + dam = 0; } + break; + } - /* HAND_DOOM */ - case GF_HAND_DOOM: + /* HAND_DOOM */ + case GF_HAND_DOOM: + { + if (seen) obvious = TRUE; + if (r_ptr->flags1 & RF1_UNIQUE) { - if (seen) obvious = TRUE; - if (r_ptr->flags1 & RF1_UNIQUE) + note = _("には効果がなかった。", " is unaffected."); + dam = 0; + } + else + { + if ((who > 0) ? ((caster_lev + randint1(dam)) > (r_ptr->level + 10 + randint1(20))) : + (((caster_lev / 2) + randint1(dam)) > (r_ptr->level + randint1(200)))) { - note = _("には効果がなかった。", " is unaffected."); - dam = 0; + dam = ((40 + randint1(20)) * m_ptr->hp) / 100; + + if (m_ptr->hp < dam) dam = m_ptr->hp - 1; } else { - if ((who > 0) ? ((caster_lev + randint1(dam)) > (r_ptr->level + 10 + randint1(20))) : - (((caster_lev / 2) + randint1(dam)) > (r_ptr->level + randint1(200)))) - { - dam = ((40 + randint1(20)) * m_ptr->hp) / 100; - - if (m_ptr->hp < dam) dam = m_ptr->hp - 1; - } - else - { - note = _("は耐性を持っている!", "resists!"); - dam = 0; - } + note = _("は耐性を持っている!", "resists!"); + dam = 0; } - break; } + break; + } - /* Capture monster */ - case GF_CAPTURE: + /* Capture monster */ + case GF_CAPTURE: + { + int nokori_hp; + if ((floor_ptr->inside_quest && (quest[floor_ptr->inside_quest].type == QUEST_TYPE_KILL_ALL) && !is_pet(m_ptr)) || + (r_ptr->flags1 & (RF1_UNIQUE)) || (r_ptr->flags7 & (RF7_NAZGUL)) || (r_ptr->flags7 & (RF7_UNIQUE2)) || (r_ptr->flags1 & RF1_QUESTOR) || m_ptr->parent_m_idx) { - int nokori_hp; - if ((p_ptr->inside_quest && (quest[p_ptr->inside_quest].type == QUEST_TYPE_KILL_ALL) && !is_pet(m_ptr)) || - (r_ptr->flags1 & (RF1_UNIQUE)) || (r_ptr->flags7 & (RF7_NAZGUL)) || (r_ptr->flags7 & (RF7_UNIQUE2)) || (r_ptr->flags1 & RF1_QUESTOR) || m_ptr->parent_m_idx) - { - msg_format(_("%sには効果がなかった。", "%s is unaffected."), m_name); - skipped = TRUE; - break; - } + msg_format(_("%sには効果がなかった。", "%s is unaffected."), m_name); + skipped = TRUE; + break; + } - if (is_pet(m_ptr)) nokori_hp = m_ptr->maxhp * 4L; - else if ((p_ptr->pclass == CLASS_BEASTMASTER) && monster_living(m_ptr->r_idx)) - nokori_hp = m_ptr->maxhp * 3 / 10; - else - nokori_hp = m_ptr->maxhp * 3 / 20; + if (is_pet(m_ptr)) nokori_hp = m_ptr->maxhp * 4L; + else if ((caster_ptr->pclass == CLASS_BEASTMASTER) && monster_living(m_ptr->r_idx)) + nokori_hp = m_ptr->maxhp * 3 / 10; + else + nokori_hp = m_ptr->maxhp * 3 / 20; - if (m_ptr->hp >= nokori_hp) - { - msg_format(_("もっと弱らせないと。", "You need to weaken %s more."), m_name); - skipped = TRUE; - } - else if (m_ptr->hp < randint0(nokori_hp)) + if (m_ptr->hp >= nokori_hp) + { + msg_format(_("もっと弱らせないと。", "You need to weaken %s more."), m_name); + skipped = TRUE; + } + else if (m_ptr->hp < randint0(nokori_hp)) + { + if (m_ptr->mflag2 & MFLAG2_CHAMELEON) choose_new_monster(g_ptr->m_idx, FALSE, MON_CHAMELEON); + msg_format(_("%sを捕えた!", "You capture %^s!"), m_name); + cap_mon = m_ptr->r_idx; + cap_mspeed = m_ptr->mspeed; + cap_hp = m_ptr->hp; + cap_maxhp = m_ptr->max_maxhp; + cap_nickname = m_ptr->nickname; /* Quark transfer */ + if (g_ptr->m_idx == caster_ptr->riding) { - if (m_ptr->mflag2 & MFLAG2_CHAMELEON) choose_new_monster(g_ptr->m_idx, FALSE, MON_CHAMELEON); - msg_format(_("%sを捕えた!", "You capture %^s!"), m_name); - cap_mon = m_ptr->r_idx; - cap_mspeed = m_ptr->mspeed; - cap_hp = m_ptr->hp; - cap_maxhp = m_ptr->max_maxhp; - cap_nickname = m_ptr->nickname; /* Quark transfer */ - if (g_ptr->m_idx == p_ptr->riding) + if (rakuba(caster_ptr, -1, FALSE)) { - if (rakuba(p_ptr, -1, FALSE)) - { - msg_format(_("地面に落とされた。", "You have fallen from %s."), m_name); - } + msg_format(_("地面に落とされた。", "You have fallen from %s."), m_name); } + } - delete_monster_idx(g_ptr->m_idx); + delete_monster_idx(g_ptr->m_idx); - return (TRUE); - } - else - { - msg_format(_("うまく捕まえられなかった。", "You failed to capture %s."), m_name); - skipped = TRUE; - } - break; + return TRUE; } - - /* Attack (Use "dam" as attack type) */ - case GF_ATTACK: + else { - /* Return this monster's death */ - return py_attack(y, x, dam); + msg_format(_("うまく捕まえられなかった。", "You failed to capture %s."), m_name); + skipped = TRUE; } + break; + } + + /* Attack (Use "dam" as attack type) */ + case GF_ATTACK: + { + /* Return this monster's death */ + return py_attack(caster_ptr, y, x, dam); + } + + /* Sleep (Use "dam" as "power") */ + case GF_ENGETSU: + { + int effect = 0; + bool done = TRUE; - /* Sleep (Use "dam" as "power") */ - case GF_ENGETSU: + if (seen) obvious = TRUE; + if (r_ptr->flags2 & RF2_EMPTY_MIND) + { + note = _("には効果がなかった。", " is unaffected."); + dam = 0; + skipped = TRUE; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags2 |= (RF2_EMPTY_MIND); + break; + } + if (MON_CSLEEP(m_ptr)) { - int effect = 0; - bool done = TRUE; + note = _("には効果がなかった。", " is unaffected."); + dam = 0; + skipped = TRUE; + break; + } - if (seen) obvious = TRUE; - if (r_ptr->flags2 & RF2_EMPTY_MIND) - { - note = _("には効果がなかった。", " is unaffected."); - dam = 0; - skipped = TRUE; - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags2 |= (RF2_EMPTY_MIND); - break; - } - if (MON_CSLEEP(m_ptr)) + if (one_in_(5)) effect = 1; + else if (one_in_(4)) effect = 2; + else if (one_in_(3)) effect = 3; + else done = FALSE; + + if (effect == 1) + { + /* Powerful monsters can resist */ + if ((r_ptr->flags1 & RF1_UNIQUE) || + (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { note = _("には効果がなかった。", " is unaffected."); - dam = 0; - skipped = TRUE; - break; + obvious = FALSE; } - if (one_in_(5)) effect = 1; - else if (one_in_(4)) effect = 2; - else if (one_in_(3)) effect = 3; - else done = FALSE; - - if (effect == 1) + /* Normal monsters slow down */ + else { - /* Powerful monsters can resist */ - if ((r_ptr->flags1 & RF1_UNIQUE) || - (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) - { - note = _("には効果がなかった。", " is unaffected."); - obvious = FALSE; - } - - /* Normal monsters slow down */ - else + if (set_monster_slow(caster_ptr, g_ptr->m_idx, MON_SLOW(m_ptr) + 50)) { - if (set_monster_slow(g_ptr->m_idx, MON_SLOW(m_ptr) + 50)) - { - note = _("の動きが遅くなった。", " starts moving slower."); - } + note = _("の動きが遅くなった。", " starts moving slower."); } } + } - else if (effect == 2) - { - do_stun = damroll((p_ptr->lev / 10) + 3 , (dam)) + 1; + else if (effect == 2) + { + do_stun = damroll((caster_ptr->lev / 10) + 3, (dam)) + 1; - /* Attempt a saving throw */ - if ((r_ptr->flags1 & (RF1_UNIQUE)) || - (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) - { - /* Resist */ - do_stun = 0; + /* Attempt a saving throw */ + if ((r_ptr->flags1 & (RF1_UNIQUE)) || + (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) + { + /* Resist */ + do_stun = 0; - /* No obvious effect */ - note = _("には効果がなかった。", " is unaffected."); - obvious = FALSE; - } + /* No obvious effect */ + note = _("には効果がなかった。", " is unaffected."); + obvious = FALSE; } + } - else if (effect == 3) + else if (effect == 3) + { + /* Attempt a saving throw */ + if ((r_ptr->flags1 & RF1_UNIQUE) || + (r_ptr->flags3 & RF3_NO_SLEEP) || + (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { - /* Attempt a saving throw */ - if ((r_ptr->flags1 & RF1_UNIQUE) || - (r_ptr->flags3 & RF3_NO_SLEEP) || - (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) - { - /* Memorize a flag */ - if (r_ptr->flags3 & RF3_NO_SLEEP) - { - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_NO_SLEEP); - } - - /* No obvious effect */ - note = _("には効果がなかった。", " is unaffected."); - obvious = FALSE; - } - else + /* Memorize a flag */ + if (r_ptr->flags3 & RF3_NO_SLEEP) { - /* Go to sleep (much) later */ - note = _("は眠り込んでしまった!", " falls asleep!"); - do_sleep = 500; + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_NO_SLEEP); } - } - if (!done) - { + /* No obvious effect */ note = _("には効果がなかった。", " is unaffected."); + obvious = FALSE; } - - /* No "real" damage */ - dam = 0; - break; - } - - /* GENOCIDE */ - case GF_GENOCIDE: - { - if (seen) obvious = TRUE; - if (genocide_aux(g_ptr->m_idx, dam, !who, (r_ptr->level + 1) / 2, _("モンスター消滅", "Genocide One"))) + else { - if (seen_msg) msg_format(_("%sは消滅した!", "%^s disappered!"), m_name); - chg_virtue(p_ptr, V_VITALITY, -1); - return TRUE; + /* Go to sleep (much) later */ + note = _("は眠り込んでしまった!", " falls asleep!"); + do_sleep = 500; } - - skipped = TRUE; - break; } - case GF_PHOTO: + if (!done) { - if (!who) msg_format(_("%sを写真に撮った。", "You take a photograph of %s."), m_name); - /* Hurt by light */ - if (r_ptr->flags3 & (RF3_HURT_LITE)) - { - /* Obvious effect */ - if (seen) obvious = TRUE; - - /* Memorize the effects */ - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_HURT_LITE); - - /* Special effect */ - note = _("は光に身をすくめた!", " cringes from the light!"); - note_dies = _("は光を受けてしぼんでしまった!", " shrivels away in the light!"); - } - - /* Normally no damage */ - else - { - /* No damage */ - dam = 0; - } + note = _("には効果がなかった。", " is unaffected."); + } - photo = m_ptr->r_idx; + /* No "real" damage */ + dam = 0; + break; + } - break; + /* GENOCIDE */ + case GF_GENOCIDE: + { + if (seen) obvious = TRUE; + if (genocide_aux(caster_ptr, g_ptr->m_idx, dam, !who, (r_ptr->level + 1) / 2, _("モンスター消滅", "Genocide One"))) + { + if (seen_msg) msg_format(_("%sは消滅した!", "%^s disappeared!"), m_name); + chg_virtue(caster_ptr, V_VITALITY, -1); + return TRUE; } + skipped = TRUE; + break; + } - /* blood curse */ - case GF_BLOOD_CURSE: + case GF_PHOTO: + { + if (!who) msg_format(_("%sを写真に撮った。", "You take a photograph of %s."), m_name); + /* Hurt by light */ + if (r_ptr->flags3 & (RF3_HURT_LITE)) { + /* Obvious effect */ if (seen) obvious = TRUE; - break; + + /* Memorize the effects */ + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_HURT_LITE); + + /* Special effect */ + note = _("は光に身をすくめた!", " cringes from the light!"); + note_dies = _("は光を受けてしぼんでしまった!", " shrivels away in the light!"); } - case GF_CRUSADE: + /* Normally no damage */ + else { - bool success = FALSE; - if (seen) obvious = TRUE; + /* No damage */ + dam = 0; + } - if ((r_ptr->flags3 & (RF3_GOOD)) && !p_ptr->inside_arena) - { - if (r_ptr->flags3 & (RF3_NO_CONF)) dam -= 50; - if (dam < 1) dam = 1; + photo = m_ptr->r_idx; - /* No need to tame your pet */ - if (is_pet(m_ptr)) - { - note = _("の動きが速くなった。", " starts moving faster."); - (void)set_monster_fast(g_ptr->m_idx, MON_FAST(m_ptr) + 100); - success = TRUE; - } + break; + } - /* Attempt a saving throw */ - else if ((r_ptr->flags1 & (RF1_QUESTOR)) || - (r_ptr->flags1 & (RF1_UNIQUE)) || - (m_ptr->mflag2 & MFLAG2_NOPET) || - (p_ptr->cursed & TRC_AGGRAVATE) || - ((r_ptr->level+10) > randint1(dam))) - { - /* Resist */ - if (one_in_(4)) m_ptr->mflag2 |= MFLAG2_NOPET; - } - else - { - note = _("を支配した。", " is tamed!"); - set_pet(m_ptr); - (void)set_monster_fast(g_ptr->m_idx, MON_FAST(m_ptr) + 100); - /* Learn about type */ - if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_GOOD); - success = TRUE; - } + /* blood curse */ + case GF_BLOOD_CURSE: + { + if (seen) obvious = TRUE; + break; + } + + case GF_CRUSADE: + { + bool success = FALSE; + if (seen) obvious = TRUE; + + if ((r_ptr->flags3 & (RF3_GOOD)) && !floor_ptr->inside_arena) + { + if (r_ptr->flags3 & (RF3_NO_CONF)) dam -= 50; + if (dam < 1) dam = 1; + + /* No need to tame your pet */ + if (is_pet(m_ptr)) + { + note = _("の動きが速くなった。", " starts moving faster."); + (void)set_monster_fast(caster_ptr, g_ptr->m_idx, MON_FAST(m_ptr) + 100); + success = TRUE; } - if (!success) + /* Attempt a saving throw */ + else if ((r_ptr->flags1 & (RF1_QUESTOR)) || + (r_ptr->flags1 & (RF1_UNIQUE)) || + (m_ptr->mflag2 & MFLAG2_NOPET) || + (caster_ptr->cursed & TRC_AGGRAVATE) || + ((r_ptr->level + 10) > randint1(dam))) { - if (!(r_ptr->flags3 & RF3_NO_FEAR)) - { - do_fear = randint1(90)+10; - } - else if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_NO_FEAR); + /* Resist */ + if (one_in_(4)) m_ptr->mflag2 |= MFLAG2_NOPET; } + else + { + note = _("を支配した。", " is tamed!"); + set_pet(m_ptr); + (void)set_monster_fast(caster_ptr, g_ptr->m_idx, MON_FAST(m_ptr) + 100); - /* No "real" damage */ - dam = 0; - break; + /* Learn about type */ + if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_GOOD); + success = TRUE; + } } - case GF_WOUNDS: + if (!success) { - if (seen) obvious = TRUE; - /* Attempt a saving throw */ - if (randint0(100 + dam) < (r_ptr->level + 50)) + if (!(r_ptr->flags3 & RF3_NO_FEAR)) { - note = _("には効果がなかった。", " is unaffected."); - dam = 0; + do_fear = randint1(90) + 10; } - break; + else if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= (RF3_NO_FEAR); } - /* Default */ - default: - { - /* Irrelevant */ - skipped = TRUE; + /* No "real" damage */ + dam = 0; + break; + } - /* No damage */ + case GF_WOUNDS: + { + if (seen) obvious = TRUE; + /* Attempt a saving throw */ + if (randint0(100 + dam) < (r_ptr->level + 50)) + { + note = _("には効果がなかった。", " is unaffected."); dam = 0; - - break; } + break; + } + + /* Default */ + default: + { + /* Irrelevant */ + skipped = TRUE; + + /* No damage */ + dam = 0; + + break; + } } } /* Absolutely no effect */ - if (skipped) return (FALSE); + if (skipped) return FALSE; /* "Unique" monsters cannot be polymorphed */ if (r_ptr->flags1 & (RF1_UNIQUE)) do_poly = FALSE; @@ -3610,23 +3619,23 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P /* Quest monsters cannot be polymorphed */ if (r_ptr->flags1 & RF1_QUESTOR) do_poly = FALSE; - if (p_ptr->riding && (g_ptr->m_idx == p_ptr->riding)) do_poly = FALSE; + if (caster_ptr->riding && (g_ptr->m_idx == caster_ptr->riding)) do_poly = FALSE; /* "Unique" and "quest" monsters can only be "killed" by the player. */ - if (((r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) || (r_ptr->flags7 & RF7_NAZGUL)) && !p_ptr->phase_out) + if (((r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) || (r_ptr->flags7 & RF7_NAZGUL)) && !caster_ptr->phase_out) { if (who && (dam > m_ptr->hp)) dam = m_ptr->hp; } if (!who && slept) { - if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(p_ptr, V_COMPASSION, -1); - if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(p_ptr, V_HONOUR, -1); + if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(caster_ptr, V_COMPASSION, -1); + if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(caster_ptr, V_HONOUR, -1); } /* Modify the damage */ tmp = dam; - dam = mon_damage_mod(m_ptr, dam, (bool)(typ == GF_PSY_SPEAR)); + dam = mon_damage_mod(caster_ptr, m_ptr, dam, (bool)(typ == GF_PSY_SPEAR)); if ((tmp > 0) && (dam == 0)) note = _("はダメージを受けていない。", " is unharmed."); /* Check for death */ @@ -3657,7 +3666,7 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P } /* Apply stun */ - (void)set_monster_stunned(g_ptr->m_idx, tmp); + (void)set_monster_stunned(caster_ptr, g_ptr->m_idx, tmp); /* Get angry */ get_angry = TRUE; @@ -3665,8 +3674,8 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P /* Confusion and Chaos resisters (and sleepers) never confuse */ if (do_conf && - !(r_ptr->flags3 & RF3_NO_CONF) && - !(r_ptr->flagsr & RFR_EFF_RES_CHAO_MASK)) + !(r_ptr->flags3 & RF3_NO_CONF) && + !(r_ptr->flagsr & RFR_EFF_RES_CHAO_MASK)) { if (seen) obvious = TRUE; @@ -3685,7 +3694,7 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P } /* Apply confusion */ - (void)set_monster_confused(g_ptr->m_idx, tmp); + (void)set_monster_confused(caster_ptr, g_ptr->m_idx, tmp); /* Get angry */ get_angry = TRUE; @@ -3709,7 +3718,7 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P /* Mega-Hack -- Handle "polymorph" -- monsters get a saving throw */ if (do_poly && (randint1(90) > r_ptr->level)) { - if (polymorph_monster(y, x)) + if (polymorph_monster(caster_ptr, y, x)) { if (seen) obvious = TRUE; @@ -3719,14 +3728,9 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P /* Turn off the damage */ dam = 0; } - else - { - /* No polymorph */ - note = _("には効果がなかった。", " is unaffected."); - } /* Hack -- Get new monster */ - m_ptr = ¤t_floor_ptr->m_list[g_ptr->m_idx]; + m_ptr = &floor_ptr->m_list[g_ptr->m_idx]; /* Hack -- Get new race */ r_ptr = &r_info[m_ptr->r_idx]; @@ -3739,25 +3743,25 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P note = _("が消え去った!", " disappears!"); - if (!who) chg_virtue(p_ptr, V_VALOUR, -1); + if (!who) chg_virtue(caster_ptr, V_VALOUR, -1); /* Teleport */ - teleport_away(g_ptr->m_idx, do_dist, - (!who ? TELEPORT_DEC_VALOUR : 0L) | TELEPORT_PASSIVE); + teleport_away(caster_ptr, g_ptr->m_idx, do_dist, + (!who ? TELEPORT_DEC_VALOUR : 0L) | TELEPORT_PASSIVE); /* Hack -- get new location */ y = m_ptr->fy; x = m_ptr->fx; /* Hack -- get new grid */ - g_ptr = ¤t_floor_ptr->grid_array[y][x]; + g_ptr = &floor_ptr->grid_array[y][x]; } /* Fear */ if (do_fear) { /* Set fear */ - (void)set_monster_monfear(g_ptr->m_idx, MON_MONFEAR(m_ptr) + do_fear); + (void)set_monster_monfear(caster_ptr, g_ptr->m_idx, MON_MONFEAR(m_ptr) + do_fear); /* Get angry */ get_angry = TRUE; @@ -3773,11 +3777,11 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P else if (who) { /* Redraw (later) if needed */ - if (p_ptr->health_who == g_ptr->m_idx) p_ptr->redraw |= (PR_HEALTH); - if (p_ptr->riding == g_ptr->m_idx) p_ptr->redraw |= (PR_UHEALTH); + if (caster_ptr->health_who == g_ptr->m_idx) caster_ptr->redraw |= (PR_HEALTH); + if (caster_ptr->riding == g_ptr->m_idx) caster_ptr->redraw |= (PR_UHEALTH); /* Wake the monster up */ - (void)set_monster_csleep(g_ptr->m_idx, 0); + (void)set_monster_csleep(caster_ptr, g_ptr->m_idx, 0); /* Hurt the monster */ m_ptr->hp -= dam; @@ -3800,11 +3804,11 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P } else { - current_floor_ptr->monster_noise = TRUE; + floor_ptr->monster_noise = TRUE; } } - if (who > 0) monster_gain_exp(who, m_ptr->r_idx); + if (who > 0) monster_gain_exp(caster_ptr, who, m_ptr->r_idx); /* Generate treasure, etc */ monster_death(g_ptr->m_idx, FALSE); @@ -3831,11 +3835,11 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P } else { - current_floor_ptr->monster_noise = TRUE; + floor_ptr->monster_noise = TRUE; } /* Hack -- handle sleep */ - if (do_sleep) (void)set_monster_csleep(g_ptr->m_idx, do_sleep); + if (do_sleep) (void)set_monster_csleep(caster_ptr, g_ptr->m_idx, do_sleep); } } @@ -3848,7 +3852,7 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P char m2_name[MAX_NLEN]; monster_desc(m2_name, m_ptr, MD_INDEF_VISIBLE); - exe_write_diary(p_ptr, NIKKI_NAMED_PET, RECORD_NAMED_PET_HEAL_LEPER, m2_name); + exe_write_diary(caster_ptr, NIKKI_NAMED_PET, RECORD_NAMED_PET_HEAL_LEPER, m2_name); } delete_monster_idx(g_ptr->m_idx); @@ -3860,7 +3864,7 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P bool fear = FALSE; /* Hurt the monster, check for fear and death */ - if (mon_take_hit(g_ptr->m_idx, dam, &fear, note_dies)) + if (mon_take_hit(caster_ptr, g_ptr->m_idx, dam, &fear, note_dies)) { /* Dead monster */ } @@ -3892,32 +3896,32 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P } /* Hack -- handle sleep */ - if (do_sleep) (void)set_monster_csleep(g_ptr->m_idx, do_sleep); + if (do_sleep) (void)set_monster_csleep(caster_ptr, g_ptr->m_idx, do_sleep); } } if ((typ == GF_BLOOD_CURSE) && one_in_(4)) { - blood_curse_to_enemy(who); + blood_curse_to_enemy(caster_ptr, who); } - if (p_ptr->phase_out) + if (caster_ptr->phase_out) { - p_ptr->health_who = g_ptr->m_idx; - p_ptr->redraw |= (PR_HEALTH); - handle_stuff(); + caster_ptr->health_who = g_ptr->m_idx; + caster_ptr->redraw |= (PR_HEALTH); + handle_stuff(caster_ptr); } /* Verify this code */ - if (m_ptr->r_idx) update_monster(g_ptr->m_idx, FALSE); + if (m_ptr->r_idx) update_monster(caster_ptr, g_ptr->m_idx, FALSE); /* Redraw the monster grid */ lite_spot(y, x); /* Update monster recall window */ - if ((p_ptr->monster_race_idx == m_ptr->r_idx) && (seen || !m_ptr->r_idx)) + if ((caster_ptr->monster_race_idx == m_ptr->r_idx) && (seen || !m_ptr->r_idx)) { - p_ptr->window |= (PW_MONSTER); + caster_ptr->window |= (PW_MONSTER); } if ((dam > 0) && !is_pet(m_ptr) && !is_friendly(m_ptr)) @@ -3929,15 +3933,15 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P set_target(m_ptr, monster_target_y, monster_target_x); } } - else if ((who > 0) && is_pet(caster_ptr) && !player_bold(m_ptr->target_y, m_ptr->target_x)) + else if ((who > 0) && is_pet(m_caster_ptr) && !player_bold(caster_ptr, m_ptr->target_y, m_ptr->target_x)) { - set_target(m_ptr, caster_ptr->fy, caster_ptr->fx); + set_target(m_ptr, m_caster_ptr->fy, m_caster_ptr->fx); } } - if (p_ptr->riding && (p_ptr->riding == g_ptr->m_idx) && (dam > 0)) + if (caster_ptr->riding && (caster_ptr->riding == g_ptr->m_idx) && (dam > 0)) { - if (m_ptr->hp > m_ptr->maxhp/3) dam = (dam + 1) / 2; + if (m_ptr->hp > m_ptr->maxhp / 3) dam = (dam + 1) / 2; rakubadam_m = (dam > 200) ? 200 : dam; } @@ -3955,7 +3959,7 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P /* Mark the item as fully known */ q_ptr->ident |= (IDENT_MENTAL); - (void)drop_near(q_ptr, -1, p_ptr->y, p_ptr->x); + (void)drop_near(caster_ptr, q_ptr, -1, caster_ptr->y, caster_ptr->x); } /* Track it */ @@ -3967,6 +3971,7 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P return (obvious); } + /*! * @brief 汎用的なビーム/ボルト/ボール系によるプレイヤーへの効果処理 / Helper function for "project()" below. * @param who 魔法を発動したモンスター(0ならばプレイヤー) / Index of "source" monster (zero for "player") @@ -3991,7 +3996,7 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P * We return "TRUE" if any "obvious" effects were observed. XXX XXX Actually, * we just assume that the effects were obvious, for historical reasons. */ -static bool project_p(MONSTER_IDX who, concptr who_name, int r, POSITION y, POSITION x, HIT_POINT dam, EFFECT_ID typ, BIT_FLAGS flg, int monspell) +static bool project_p(MONSTER_IDX who, player_type *target_ptr, concptr who_name, int r, POSITION y, POSITION x, HIT_POINT dam, EFFECT_ID typ, BIT_FLAGS flg, int monspell) { int k = 0; DEPTH rlev = 0; @@ -4000,7 +4005,7 @@ static bool project_p(MONSTER_IDX who, concptr who_name, int r, POSITION y, POSI bool obvious = TRUE; /* Player blind-ness */ - bool blind = (p_ptr->blind ? TRUE : FALSE); + bool blind = (target_ptr->blind ? TRUE : FALSE); /* Player needs a "description" (he is blind) */ bool fuzzy = FALSE; @@ -4021,57 +4026,55 @@ static bool project_p(MONSTER_IDX who, concptr who_name, int r, POSITION y, POSI /* Player is not here */ - if (!player_bold(y, x)) return (FALSE); + if (!player_bold(target_ptr, y, x)) return FALSE; - if ((p_ptr->special_defense & NINJA_KAWARIMI) && dam && (randint0(55) < (p_ptr->lev*3/5+20)) && who && (who != p_ptr->riding)) + if ((target_ptr->special_defense & NINJA_KAWARIMI) && dam && (randint0(55) < (target_ptr->lev * 3 / 5 + 20)) && who && (who != target_ptr->riding)) { - if (kawarimi(TRUE)) return FALSE; + if (kawarimi(target_ptr, TRUE)) return FALSE; } /* Player cannot hurt himself */ - if (!who) return (FALSE); - if (who == p_ptr->riding) return (FALSE); + if (!who) return FALSE; + if (who == target_ptr->riding) return FALSE; - if ((p_ptr->reflect || ((p_ptr->special_defense & KATA_FUUJIN) && !p_ptr->blind)) && (flg & PROJECT_REFLECTABLE) && !one_in_(10)) + if ((target_ptr->reflect || ((target_ptr->special_defense & KATA_FUUJIN) && !target_ptr->blind)) && (flg & PROJECT_REFLECTABLE) && !one_in_(10)) { POSITION t_y, t_x; int max_attempts = 10; sound(SOUND_REFLECT); - if (blind) + if (blind) msg_print(_("何かが跳ね返った!", "Something bounces!")); - else if (p_ptr->special_defense & KATA_FUUJIN) + else if (target_ptr->special_defense & KATA_FUUJIN) msg_print(_("風の如く武器を振るって弾き返した!", "The attack bounces!")); - else + else msg_print(_("攻撃が跳ね返った!", "The attack bounces!")); - /* Choose 'new' target */ if (who > 0) { do { - t_y = current_floor_ptr->m_list[who].fy - 1 + randint1(3); - t_x = current_floor_ptr->m_list[who].fx - 1 + randint1(3); + t_y = target_ptr->current_floor_ptr->m_list[who].fy - 1 + randint1(3); + t_x = target_ptr->current_floor_ptr->m_list[who].fx - 1 + randint1(3); max_attempts--; - } - while (max_attempts && in_bounds2u(t_y, t_x) && !projectable(p_ptr->y, p_ptr->x, t_y, t_x)); + } while (max_attempts && in_bounds2u(target_ptr->current_floor_ptr, t_y, t_x) && !projectable(target_ptr, target_ptr->y, target_ptr->x, t_y, t_x)); if (max_attempts < 1) { - t_y = current_floor_ptr->m_list[who].fy; - t_x = current_floor_ptr->m_list[who].fx; + t_y = target_ptr->current_floor_ptr->m_list[who].fy; + t_x = target_ptr->current_floor_ptr->m_list[who].fx; } } else { - t_y = p_ptr->y - 1 + randint1(3); - t_x = p_ptr->x - 1 + randint1(3); + t_y = target_ptr->y - 1 + randint1(3); + t_x = target_ptr->x - 1 + randint1(3); } - project(0, 0, t_y, t_x, dam, typ, (PROJECT_STOP|PROJECT_KILL|PROJECT_REFLECTABLE), monspell); + project(target_ptr, 0, 0, t_y, t_x, dam, typ, (PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE), monspell); - disturb(p_ptr, TRUE, TRUE); + disturb(target_ptr, TRUE, TRUE); return TRUE; } @@ -4088,7 +4091,7 @@ static bool project_p(MONSTER_IDX who, concptr who_name, int r, POSITION y, POSI if (who > 0) { - m_ptr = ¤t_floor_ptr->m_list[who]; + m_ptr = &target_ptr->current_floor_ptr->m_list[who]; rlev = (((&r_info[m_ptr->r_idx])->level >= 1) ? (&r_info[m_ptr->r_idx])->level : 1); monster_desc(m_name, m_ptr, 0); @@ -4117,943 +4120,943 @@ static bool project_p(MONSTER_IDX who, concptr who_name, int r, POSITION y, POSI /* Analyze the damage */ switch (typ) { - /* Standard damage -- hurts p_ptr->inventory_list too */ - case GF_ACID: - { - if (fuzzy) msg_print(_("酸で攻撃された!", "You are hit by acid!")); - get_damage = acid_dam(dam, killer, monspell, FALSE); - break; - } + /* Standard damage -- hurts target_ptr->inventory_list too */ + case GF_ACID: + { + if (fuzzy) msg_print(_("酸で攻撃された!", "You are hit by acid!")); + get_damage = acid_dam(target_ptr, dam, killer, monspell, FALSE); + break; + } - /* Standard damage -- hurts p_ptr->inventory_list too */ - case GF_FIRE: - { - if (fuzzy) msg_print(_("火炎で攻撃された!", "You are hit by fire!")); - get_damage = fire_dam(dam, killer, monspell, FALSE); - break; - } + /* Standard damage -- hurts target_ptr->inventory_list too */ + case GF_FIRE: + { + if (fuzzy) msg_print(_("火炎で攻撃された!", "You are hit by fire!")); + get_damage = fire_dam(target_ptr, dam, killer, monspell, FALSE); + break; + } - /* Standard damage -- hurts p_ptr->inventory_list too */ - case GF_COLD: + /* Standard damage -- hurts target_ptr->inventory_list too */ + case GF_COLD: + { + if (fuzzy) msg_print(_("冷気で攻撃された!", "You are hit by cold!")); + get_damage = cold_dam(target_ptr, dam, killer, monspell, FALSE); + break; + } + + /* Standard damage -- hurts target_ptr->inventory_list too */ + case GF_ELEC: + { + if (fuzzy) msg_print(_("電撃で攻撃された!", "You are hit by lightning!")); + get_damage = elec_dam(target_ptr, dam, killer, monspell, FALSE); + break; + } + + /* Standard damage -- also poisons player */ + case GF_POIS: + { + bool double_resist = is_oppose_pois(target_ptr); + if (fuzzy) msg_print(_("毒で攻撃された!", "You are hit by poison!")); + + if (target_ptr->resist_pois) dam = (dam + 2) / 3; + if (double_resist) dam = (dam + 2) / 3; + + if ((!(double_resist || target_ptr->resist_pois)) && one_in_(HURT_CHANCE) && !CHECK_MULTISHADOW(target_ptr)) { - if (fuzzy) msg_print(_("冷気で攻撃された!", "You are hit by cold!")); - get_damage = cold_dam(dam, killer, monspell, FALSE); - break; + do_dec_stat(target_ptr, A_CON); } - /* Standard damage -- hurts p_ptr->inventory_list too */ - case GF_ELEC: + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + + if (!(double_resist || target_ptr->resist_pois) && !CHECK_MULTISHADOW(target_ptr)) { - if (fuzzy) msg_print(_("電撃で攻撃された!", "You are hit by lightning!")); - get_damage = elec_dam(dam, killer, monspell, FALSE); - break; + set_poisoned(target_ptr, target_ptr->poisoned + randint0(dam) + 10); } + break; + } - /* Standard damage -- also poisons player */ - case GF_POIS: - { - bool double_resist = IS_OPPOSE_POIS(); - if (fuzzy) msg_print(_("毒で攻撃された!", "You are hit by poison!")); + /* Standard damage -- also poisons / mutates player */ + case GF_NUKE: + { + bool double_resist = is_oppose_pois(target_ptr); + if (fuzzy) msg_print(_("放射能で攻撃された!", "You are hit by radiation!")); - if (p_ptr->resist_pois) dam = (dam + 2) / 3; - if (double_resist) dam = (dam + 2) / 3; + if (target_ptr->resist_pois) dam = (2 * dam + 2) / 5; + if (double_resist) dam = (2 * dam + 2) / 5; + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + if (!(double_resist || target_ptr->resist_pois) && !CHECK_MULTISHADOW(target_ptr)) + { + set_poisoned(target_ptr, target_ptr->poisoned + randint0(dam) + 10); - if ((!(double_resist || p_ptr->resist_pois)) && one_in_(HURT_CHANCE) && !CHECK_MULTISHADOW(p_ptr)) + if (one_in_(5)) /* 6 */ { - do_dec_stat(p_ptr, A_CON); + msg_print(_("奇形的な変身を遂げた!", "You undergo a freakish metamorphosis!")); + if (one_in_(4)) /* 4 */ + do_poly_self(target_ptr); + else + status_shuffle(target_ptr); } - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - - if (!(double_resist || p_ptr->resist_pois) && !CHECK_MULTISHADOW(p_ptr)) + if (one_in_(6)) { - set_poisoned(p_ptr, p_ptr->poisoned + randint0(dam) + 10); + inventory_damage(target_ptr, set_acid_destroy, 2); } - break; } + break; + } - /* Standard damage -- also poisons / mutates player */ - case GF_NUKE: - { - bool double_resist = IS_OPPOSE_POIS(); - if (fuzzy) msg_print(_("放射能で攻撃された!", "You are hit by radiation!")); + /* Standard damage */ + case GF_MISSILE: + { + if (fuzzy) msg_print(_("何かで攻撃された!", "You are hit by something!")); + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + break; + } - if (p_ptr->resist_pois) dam = (2 * dam + 2) / 5; - if (double_resist) dam = (2 * dam + 2) / 5; - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - if (!(double_resist || p_ptr->resist_pois) && !CHECK_MULTISHADOW(p_ptr)) - { - set_poisoned(p_ptr, p_ptr->poisoned + randint0(dam) + 10); + /* Holy Orb -- Player only takes partial damage */ + case GF_HOLY_FIRE: + { + if (fuzzy) msg_print(_("何かで攻撃された!", "You are hit by something!")); + if (target_ptr->align > 10) + dam /= 2; + else if (target_ptr->align < -10) + dam *= 2; + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + break; + } - if (one_in_(5)) /* 6 */ - { - msg_print(_("奇形的な変身を遂げた!", "You undergo a freakish metamorphosis!")); - if (one_in_(4)) /* 4 */ - do_poly_self(p_ptr); - else - status_shuffle(); - } + case GF_HELL_FIRE: + { + if (fuzzy) msg_print(_("何かで攻撃された!", "You are hit by something!")); + if (target_ptr->align > 10) + dam *= 2; + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + break; + } - if (one_in_(6)) - { - inven_damage(set_acid_destroy, 2); - } - } - break; + /* Arrow -- XXX no dodging */ + case GF_ARROW: + { + if (fuzzy) + { + msg_print(_("何か鋭いもので攻撃された!", "You are hit by something sharp!")); } - - /* Standard damage */ - case GF_MISSILE: + else if ((target_ptr->inventory_list[INVEN_RARM].name1 == ART_ZANTETSU) || (target_ptr->inventory_list[INVEN_LARM].name1 == ART_ZANTETSU)) { - if (fuzzy) msg_print(_("何かで攻撃された!", "You are hit by something!")); - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); + msg_print(_("矢を斬り捨てた!", "You cut down the arrow!")); break; } + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + break; + } - /* Holy Orb -- Player only takes partial damage */ - case GF_HOLY_FIRE: + /* Plasma -- XXX No resist */ + case GF_PLASMA: + { + if (fuzzy) msg_print(_("何かとても熱いもので攻撃された!", "You are hit by something *HOT*!")); + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + + if (!target_ptr->resist_sound && !CHECK_MULTISHADOW(target_ptr)) { - if (fuzzy) msg_print(_("何かで攻撃された!", "You are hit by something!")); - if (p_ptr->align > 10) - dam /= 2; - else if (p_ptr->align < -10) - dam *= 2; - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - break; + int plus_stun = (randint1((dam > 40) ? 35 : (dam * 3 / 4 + 5))); + (void)set_stun(target_ptr, target_ptr->stun + plus_stun); } - case GF_HELL_FIRE: + if (!(target_ptr->resist_fire || is_oppose_fire(target_ptr) || target_ptr->immune_fire)) { - if (fuzzy) msg_print(_("何かで攻撃された!", "You are hit by something!")); - if (p_ptr->align > 10) - dam *= 2; - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - break; + inventory_damage(target_ptr, set_acid_destroy, 3); } - /* Arrow -- XXX no dodging */ - case GF_ARROW: + break; + } + + /* Nether -- drain experience */ + case GF_NETHER: + { + if (fuzzy) msg_print(_("地獄の力で攻撃された!", "You are hit by nether forces!")); + if (target_ptr->resist_neth) { - if (fuzzy) + if (!PRACE_IS_(target_ptr, RACE_SPECTRE)) { - msg_print(_("何か鋭いもので攻撃された!", "You are hit by something sharp!")); - } - else if ((p_ptr->inventory_list[INVEN_RARM].name1 == ART_ZANTETSU) || (p_ptr->inventory_list[INVEN_LARM].name1 == ART_ZANTETSU)) - { - msg_print(_("矢を斬り捨てた!", "You cut down the arrow!")); - break; + dam *= 6; dam /= (randint1(4) + 7); } - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - break; } + else if (!CHECK_MULTISHADOW(target_ptr)) drain_exp(target_ptr, 200 + (target_ptr->exp / 100), 200 + (target_ptr->exp / 1000), 75); - /* Plasma -- XXX No resist */ - case GF_PLASMA: + if (PRACE_IS_(target_ptr, RACE_SPECTRE) && !CHECK_MULTISHADOW(target_ptr)) + { + msg_print(_("気分がよくなった。", "You feel invigorated!")); + hp_player(target_ptr, dam / 4); + learn_spell(target_ptr, monspell); + } + else { - if (fuzzy) msg_print(_("何かとても熱いもので攻撃された!", "You are hit by something *HOT*!")); - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + } + + break; + } - if (!p_ptr->resist_sound && !CHECK_MULTISHADOW(p_ptr)) + /* Water -- stun/confuse */ + case GF_WATER: + { + if (fuzzy) msg_print(_("何か湿ったもので攻撃された!", "You are hit by something wet!")); + if (!CHECK_MULTISHADOW(target_ptr)) + { + if (!target_ptr->resist_sound && !target_ptr->resist_water) + { + set_stun(target_ptr, target_ptr->stun + randint1(40)); + } + if (!target_ptr->resist_conf && !target_ptr->resist_water) { - int plus_stun = (randint1((dam > 40) ? 35 : (dam * 3 / 4 + 5))); - (void)set_stun(p_ptr, p_ptr->stun + plus_stun); + set_confused(target_ptr, target_ptr->confused + randint1(5) + 5); } - if (!(p_ptr->resist_fire || IS_OPPOSE_FIRE() || p_ptr->immune_fire)) + if (one_in_(5) && !target_ptr->resist_water) { - inven_damage(set_acid_destroy, 3); + inventory_damage(target_ptr, set_cold_destroy, 3); } - break; + if (target_ptr->resist_water) get_damage /= 4; } - /* Nether -- drain experience */ - case GF_NETHER: + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + break; + } + + /* Chaos -- many effects */ + case GF_CHAOS: + { + if (fuzzy) msg_print(_("無秩序の波動で攻撃された!", "You are hit by a wave of anarchy!")); + if (target_ptr->resist_chaos) + { + dam *= 6; dam /= (randint1(4) + 7); + } + + if (!CHECK_MULTISHADOW(target_ptr)) { - if (fuzzy) msg_print(_("地獄の力で攻撃された!", "You are hit by nether forces!")); - if (p_ptr->resist_neth) + if (!target_ptr->resist_conf) + { + (void)set_confused(target_ptr, target_ptr->confused + randint0(20) + 10); + } + if (!target_ptr->resist_chaos) { - if (!PRACE_IS_(p_ptr, RACE_SPECTRE)) + (void)set_image(target_ptr, target_ptr->image + randint1(10)); + if (one_in_(3)) { - dam *= 6; dam /= (randint1(4) + 7); + msg_print(_("あなたの身体はカオスの力で捻じ曲げられた!", "Your body is twisted by chaos!")); + (void)gain_mutation(target_ptr, 0); } } - else if (!CHECK_MULTISHADOW(p_ptr)) drain_exp(p_ptr, 200 + (p_ptr->exp / 100), 200 + (p_ptr->exp / 1000), 75); - - if (PRACE_IS_(p_ptr, RACE_SPECTRE) && !CHECK_MULTISHADOW(p_ptr)) + if (!target_ptr->resist_neth && !target_ptr->resist_chaos) { - msg_print(_("気分がよくなった。", "You feel invigorated!")); - hp_player(p_ptr, dam / 4); - learn_spell(monspell); + drain_exp(target_ptr, 5000 + (target_ptr->exp / 100), 500 + (target_ptr->exp / 1000), 75); } - else + + if (!target_ptr->resist_chaos || one_in_(9)) { - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); + inventory_damage(target_ptr, set_elec_destroy, 2); + inventory_damage(target_ptr, set_fire_destroy, 2); } - - break; } - /* Water -- stun/confuse */ - case GF_WATER: + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + break; + } + + /* Shards -- mostly cutting */ + case GF_SHARDS: + { + if (fuzzy) msg_print(_("何か鋭いもので攻撃された!", "You are hit by something sharp!")); + if (target_ptr->resist_shard) { - if (fuzzy) msg_print(_("何か湿ったもので攻撃された!", "You are hit by something wet!")); - if (!CHECK_MULTISHADOW(p_ptr)) - { - if (!p_ptr->resist_sound && !p_ptr->resist_water) - { - set_stun(p_ptr, p_ptr->stun + randint1(40)); - } - if (!p_ptr->resist_conf && !p_ptr->resist_water) - { - set_confused(p_ptr, p_ptr->confused + randint1(5) + 5); - } + dam *= 6; dam /= (randint1(4) + 7); + } + else if (!CHECK_MULTISHADOW(target_ptr)) + { + (void)set_cut(target_ptr, target_ptr->cut + dam); + } - if (one_in_(5) && !p_ptr->resist_water) - { - inven_damage(set_cold_destroy, 3); - } + if (!target_ptr->resist_shard || one_in_(13)) + { + inventory_damage(target_ptr, set_cold_destroy, 2); + } - if (p_ptr->resist_water) get_damage /= 4; - } + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + break; + } - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - break; + /* Sound -- mostly stunning */ + case GF_SOUND: + { + if (fuzzy) msg_print(_("轟音で攻撃された!", "You are hit by a loud noise!")); + if (target_ptr->resist_sound) + { + dam *= 5; dam /= (randint1(4) + 7); } - - /* Chaos -- many effects */ - case GF_CHAOS: + else if (!CHECK_MULTISHADOW(target_ptr)) { - if (fuzzy) msg_print(_("無秩序の波動で攻撃された!", "You are hit by a wave of anarchy!")); - if (p_ptr->resist_chaos) - { - dam *= 6; dam /= (randint1(4) + 7); - } + int plus_stun = (randint1((dam > 90) ? 35 : (dam / 3 + 5))); + (void)set_stun(target_ptr, target_ptr->stun + plus_stun); + } - if (!CHECK_MULTISHADOW(p_ptr)) - { - if (!p_ptr->resist_conf) - { - (void)set_confused(p_ptr, p_ptr->confused + randint0(20) + 10); - } - if (!p_ptr->resist_chaos) - { - (void)set_image(p_ptr, p_ptr->image + randint1(10)); - if (one_in_(3)) - { - msg_print(_("あなたの身体はカオスの力で捻じ曲げられた!", "Your body is twisted by chaos!")); - (void)gain_mutation(p_ptr, 0); - } - } - if (!p_ptr->resist_neth && !p_ptr->resist_chaos) - { - drain_exp(p_ptr, 5000 + (p_ptr->exp / 100), 500 + (p_ptr->exp / 1000), 75); - } + if (!target_ptr->resist_sound || one_in_(13)) + { + inventory_damage(target_ptr, set_cold_destroy, 2); + } - if (!p_ptr->resist_chaos || one_in_(9)) - { - inven_damage(set_elec_destroy, 2); - inven_damage(set_fire_destroy, 2); - } - } + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + break; + } - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - break; + /* Pure confusion */ + case GF_CONFUSION: + { + if (fuzzy) msg_print(_("何か混乱するもので攻撃された!", "You are hit by something puzzling!")); + if (target_ptr->resist_conf) + { + dam *= 5; dam /= (randint1(4) + 7); } - - /* Shards -- mostly cutting */ - case GF_SHARDS: + else if (!CHECK_MULTISHADOW(target_ptr)) { - if (fuzzy) msg_print(_("何か鋭いもので攻撃された!", "You are hit by something sharp!")); - if (p_ptr->resist_shard) - { - dam *= 6; dam /= (randint1(4) + 7); - } - else if (!CHECK_MULTISHADOW(p_ptr)) - { - (void)set_cut(p_ptr,p_ptr->cut + dam); - } + (void)set_confused(target_ptr, target_ptr->confused + randint1(20) + 10); + } + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + break; + } - if (!p_ptr->resist_shard || one_in_(13)) - { - inven_damage(set_cold_destroy, 2); - } + /* Disenchantment -- see above */ + case GF_DISENCHANT: + { + if (fuzzy) msg_print(_("何かさえないもので攻撃された!", "You are hit by something static!")); + if (target_ptr->resist_disen) + { + dam *= 6; dam /= (randint1(4) + 7); + } + else if (!CHECK_MULTISHADOW(target_ptr)) + { + (void)apply_disenchant(target_ptr, 0); + } + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + break; + } - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - break; + /* Nexus -- see above */ + case GF_NEXUS: + { + if (fuzzy) msg_print(_("何か奇妙なもので攻撃された!", "You are hit by something strange!")); + if (target_ptr->resist_nexus) + { + dam *= 6; dam /= (randint1(4) + 7); + } + else if (!CHECK_MULTISHADOW(target_ptr)) + { + apply_nexus(m_ptr, target_ptr); } + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + break; + } - /* Sound -- mostly stunning */ - case GF_SOUND: + /* Force -- mostly stun */ + case GF_FORCE: + { + if (fuzzy) msg_print(_("運動エネルギーで攻撃された!", "You are hit by kinetic force!")); + if (!target_ptr->resist_sound && !CHECK_MULTISHADOW(target_ptr)) { - if (fuzzy) msg_print(_("轟音で攻撃された!", "You are hit by a loud noise!")); - if (p_ptr->resist_sound) - { - dam *= 5; dam /= (randint1(4) + 7); - } - else if (!CHECK_MULTISHADOW(p_ptr)) - { - int plus_stun = (randint1((dam > 90) ? 35 : (dam / 3 + 5))); - (void)set_stun(p_ptr, p_ptr->stun + plus_stun); - } + (void)set_stun(target_ptr, target_ptr->stun + randint1(20)); + } + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + break; + } - if (!p_ptr->resist_sound || one_in_(13)) - { - inven_damage(set_cold_destroy, 2); - } - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - break; + /* Rocket -- stun, cut */ + case GF_ROCKET: + { + if (fuzzy) msg_print(_("爆発があった!", "There is an explosion!")); + if (!target_ptr->resist_sound && !CHECK_MULTISHADOW(target_ptr)) + { + (void)set_stun(target_ptr, target_ptr->stun + randint1(20)); } - /* Pure confusion */ - case GF_CONFUSION: + if (target_ptr->resist_shard) { - if (fuzzy) msg_print(_("何か混乱するもので攻撃された!", "You are hit by something puzzling!")); - if (p_ptr->resist_conf) - { - dam *= 5; dam /= (randint1(4) + 7); - } - else if (!CHECK_MULTISHADOW(p_ptr)) - { - (void)set_confused(p_ptr, p_ptr->confused + randint1(20) + 10); - } - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - break; + dam /= 2; + } + else if (!CHECK_MULTISHADOW(target_ptr)) + { + (void)set_cut(target_ptr, target_ptr->cut + (dam / 2)); } - /* Disenchantment -- see above */ - case GF_DISENCHANT: + if (!target_ptr->resist_shard || one_in_(12)) { - if (fuzzy) msg_print(_("何かさえないもので攻撃された!", "You are hit by something static!")); - if (p_ptr->resist_disen) - { - dam *= 6; dam /= (randint1(4) + 7); - } - else if (!CHECK_MULTISHADOW(p_ptr)) - { - (void)apply_disenchant(0); - } - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - break; + inventory_damage(target_ptr, set_cold_destroy, 3); } - /* Nexus -- see above */ - case GF_NEXUS: + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + break; + } + + /* Inertia -- slowness */ + case GF_INERTIAL: + { + if (fuzzy) msg_print(_("何か遅いもので攻撃された!", "You are hit by something slow!")); + if (!CHECK_MULTISHADOW(target_ptr)) (void)set_slow(target_ptr, target_ptr->slow + randint0(4) + 4, FALSE); + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + break; + } + + /* Lite -- blinding */ + case GF_LITE: + { + if (fuzzy) msg_print(_("何かで攻撃された!", "You are hit by something!")); + if (target_ptr->resist_lite) { - if (fuzzy) msg_print(_("何か奇妙なもので攻撃された!", "You are hit by something strange!")); - if (p_ptr->resist_nexus) - { - dam *= 6; dam /= (randint1(4) + 7); - } - else if (!CHECK_MULTISHADOW(p_ptr)) - { - apply_nexus(m_ptr); - } - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - break; + dam *= 4; dam /= (randint1(4) + 7); + } + else if (!blind && !target_ptr->resist_blind && !CHECK_MULTISHADOW(target_ptr)) + { + (void)set_blind(target_ptr, target_ptr->blind + randint1(5) + 2); } - /* Force -- mostly stun */ - case GF_FORCE: + if (PRACE_IS_(target_ptr, RACE_VAMPIRE) || (target_ptr->mimic_form == MIMIC_VAMPIRE)) { - if (fuzzy) msg_print(_("運動エネルギーで攻撃された!", "You are hit by kinetic force!")); - if (!p_ptr->resist_sound && !CHECK_MULTISHADOW(p_ptr)) - { - (void)set_stun(p_ptr, p_ptr->stun + randint1(20)); - } - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - break; + if (!CHECK_MULTISHADOW(target_ptr)) msg_print(_("光で肉体が焦がされた!", "The light scorches your flesh!")); + dam *= 2; + } + else if (PRACE_IS_(target_ptr, RACE_S_FAIRY)) + { + dam = dam * 4 / 3; } + if (target_ptr->wraith_form) dam *= 2; + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); - /* Rocket -- stun, cut */ - case GF_ROCKET: + if (target_ptr->wraith_form && !CHECK_MULTISHADOW(target_ptr)) { - if (fuzzy) msg_print(_("爆発があった!", "There is an explosion!")); - if (!p_ptr->resist_sound && !CHECK_MULTISHADOW(p_ptr)) - { - (void)set_stun(p_ptr, p_ptr->stun + randint1(20)); - } + target_ptr->wraith_form = 0; + msg_print(_("閃光のため非物質的な影の存在でいられなくなった。", + "The light forces you out of your incorporeal shadow form.")); - if (p_ptr->resist_shard) - { - dam /= 2; - } - else if (!CHECK_MULTISHADOW(p_ptr)) - { - (void)set_cut(p_ptr,p_ptr->cut + (dam / 2)); - } + target_ptr->redraw |= (PR_MAP | PR_STATUS); + target_ptr->update |= (PU_MONSTERS); + target_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); + } - if (!p_ptr->resist_shard || one_in_(12)) - { - inven_damage(set_cold_destroy, 3); - } + break; + } - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - break; - } + /* Dark -- blinding */ + case GF_DARK: + { + if (fuzzy) msg_print(_("何かで攻撃された!", "You are hit by something!")); + if (target_ptr->resist_dark) + { + dam *= 4; dam /= (randint1(4) + 7); - /* Inertia -- slowness */ - case GF_INERTIAL: + if (PRACE_IS_(target_ptr, RACE_VAMPIRE) || (target_ptr->mimic_form == MIMIC_VAMPIRE) || target_ptr->wraith_form) dam = 0; + } + else if (!blind && !target_ptr->resist_blind && !CHECK_MULTISHADOW(target_ptr)) { - if (fuzzy) msg_print(_("何か遅いもので攻撃された!", "You are hit by something slow!")); - if (!CHECK_MULTISHADOW(p_ptr)) (void)set_slow(p_ptr, p_ptr->slow + randint0(4) + 4, FALSE); - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - break; + (void)set_blind(target_ptr, target_ptr->blind + randint1(5) + 2); } + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + break; + } - /* Lite -- blinding */ - case GF_LITE: + /* Time -- bolt fewer effects XXX */ + case GF_TIME: + { + if (fuzzy) msg_print(_("過去からの衝撃に攻撃された!", "You are hit by a blast from the past!")); + if (target_ptr->resist_time) + { + dam *= 4; + dam /= (randint1(4) + 7); + msg_print(_("時間が通り過ぎていく気がする。", "You feel as if time is passing you by.")); + } + else if (!CHECK_MULTISHADOW(target_ptr)) { - if (fuzzy) msg_print(_("何かで攻撃された!", "You are hit by something!")); - if (p_ptr->resist_lite) + switch (randint1(10)) { - dam *= 4; dam /= (randint1(4) + 7); - } - else if (!blind && !p_ptr->resist_blind && !CHECK_MULTISHADOW(p_ptr)) + case 1: case 2: case 3: case 4: case 5: { - (void)set_blind(p_ptr, p_ptr->blind + randint1(5) + 2); + if (target_ptr->prace == RACE_ANDROID) break; + msg_print(_("人生が逆戻りした気がする。", "You feel life has clocked back.")); + lose_exp(target_ptr, 100 + (target_ptr->exp / 100) * MON_DRAIN_LIFE); + break; } - if (PRACE_IS_(p_ptr, RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) - { - if (!CHECK_MULTISHADOW(p_ptr)) msg_print(_("光で肉体が焦がされた!", "The light scorches your flesh!")); - dam *= 2; - } - else if (PRACE_IS_(p_ptr, RACE_S_FAIRY)) + case 6: case 7: case 8: case 9: { - dam = dam * 4 / 3; - } - - if (p_ptr->wraith_form) dam *= 2; - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); + switch (randint1(6)) + { + case 1: k = A_STR; act = _("強く", "strong"); break; + case 2: k = A_INT; act = _("聡明で", "bright"); break; + case 3: k = A_WIS; act = _("賢明で", "wise"); break; + case 4: k = A_DEX; act = _("器用で", "agile"); break; + case 5: k = A_CON; act = _("健康で", "hale"); break; + case 6: k = A_CHR; act = _("美しく", "beautiful"); break; + } - if (p_ptr->wraith_form && !CHECK_MULTISHADOW(p_ptr)) - { - p_ptr->wraith_form = 0; - msg_print(_("閃光のため非物質的な影の存在でいられなくなった。", - "The light forces you out of your incorporeal shadow form.")); + msg_format(_("あなたは以前ほど%sなくなってしまった...。", + "You're not as %s as you used to be..."), act); - p_ptr->redraw |= (PR_MAP | PR_STATUS); - p_ptr->update |= (PU_MONSTERS); - p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); + target_ptr->stat_cur[k] = (target_ptr->stat_cur[k] * 3) / 4; + if (target_ptr->stat_cur[k] < 3) target_ptr->stat_cur[k] = 3; + target_ptr->update |= (PU_BONUS); + break; } - break; - } - - /* Dark -- blinding */ - case GF_DARK: - { - if (fuzzy) msg_print(_("何かで攻撃された!", "You are hit by something!")); - if (p_ptr->resist_dark) + case 10: { - dam *= 4; dam /= (randint1(4) + 7); + msg_print(_("あなたは以前ほど力強くなくなってしまった...。", + "You're not as powerful as you used to be...")); - if (PRACE_IS_(p_ptr, RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE) || p_ptr->wraith_form) dam = 0; + for (k = 0; k < A_MAX; k++) + { + target_ptr->stat_cur[k] = (target_ptr->stat_cur[k] * 7) / 8; + if (target_ptr->stat_cur[k] < 3) target_ptr->stat_cur[k] = 3; + } + target_ptr->update |= (PU_BONUS); + break; } - else if (!blind && !p_ptr->resist_blind && !CHECK_MULTISHADOW(p_ptr)) - { - (void)set_blind(p_ptr, p_ptr->blind + randint1(5) + 2); } - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - break; } - /* Time -- bolt fewer effects XXX */ - case GF_TIME: + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + break; + } + + /* Gravity -- stun plus slowness plus teleport */ + case GF_GRAVITY: + { + if (fuzzy) msg_print(_("何か重いもので攻撃された!", "You are hit by something heavy!")); + msg_print(_("周辺の重力がゆがんだ。", "Gravity warps around you.")); + + if (!CHECK_MULTISHADOW(target_ptr)) { - if (fuzzy) msg_print(_("過去からの衝撃に攻撃された!", "You are hit by a blast from the past!")); - if (p_ptr->resist_time) + teleport_player(target_ptr, 5, TELEPORT_PASSIVE); + if (!target_ptr->levitation) + (void)set_slow(target_ptr, target_ptr->slow + randint0(4) + 4, FALSE); + if (!(target_ptr->resist_sound || target_ptr->levitation)) { - dam *= 4; - dam /= (randint1(4) + 7); - msg_print(_("時間が通り過ぎていく気がする。", "You feel as if time is passing you by.")); + int plus_stun = (randint1((dam > 90) ? 35 : (dam / 3 + 5))); + (void)set_stun(target_ptr, target_ptr->stun + plus_stun); } - else if (!CHECK_MULTISHADOW(p_ptr)) - { - switch (randint1(10)) - { - case 1: case 2: case 3: case 4: case 5: - { - if (p_ptr->prace == RACE_ANDROID) break; - msg_print(_("人生が逆戻りした気がする。", "You feel life has clocked back.")); - lose_exp(p_ptr, 100 + (p_ptr->exp / 100) * MON_DRAIN_LIFE); - break; - } + } + if (target_ptr->levitation) + { + dam = (dam * 2) / 3; + } - case 6: case 7: case 8: case 9: - { - switch (randint1(6)) - { - case 1: k = A_STR; act = _("強く", "strong"); break; - case 2: k = A_INT; act = _("聡明で", "bright"); break; - case 3: k = A_WIS; act = _("賢明で", "wise"); break; - case 4: k = A_DEX; act = _("器用で", "agile"); break; - case 5: k = A_CON; act = _("健康で", "hale"); break; - case 6: k = A_CHR; act = _("美しく", "beautiful"); break; - } + if (!target_ptr->levitation || one_in_(13)) + { + inventory_damage(target_ptr, set_cold_destroy, 2); + } - msg_format(_("あなたは以前ほど%sなくなってしまった...。", - "You're not as %s as you used to be..."), act); + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + break; + } - p_ptr->stat_cur[k] = (p_ptr->stat_cur[k] * 3) / 4; - if (p_ptr->stat_cur[k] < 3) p_ptr->stat_cur[k] = 3; - p_ptr->update |= (PU_BONUS); - break; - } + /* Standard damage */ + case GF_DISINTEGRATE: + { + if (fuzzy) msg_print(_("純粋なエネルギーで攻撃された!", "You are hit by pure energy!")); - case 10: - { - msg_print(_("あなたは以前ほど力強くなくなってしまった...。", - "You're not as powerful as you used to be...")); + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + break; + } - for (k = 0; k < A_MAX; k++) - { - p_ptr->stat_cur[k] = (p_ptr->stat_cur[k] * 7) / 8; - if (p_ptr->stat_cur[k] < 3) p_ptr->stat_cur[k] = 3; - } - p_ptr->update |= (PU_BONUS); - break; - } - } - } + case GF_OLD_HEAL: + { + if (fuzzy) msg_print(_("何らかの攻撃によって気分がよくなった。", "You are hit by something invigorating!")); - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - break; - } + (void)hp_player(target_ptr, dam); + dam = 0; + break; + } - /* Gravity -- stun plus slowness plus teleport */ - case GF_GRAVITY: - { - if (fuzzy) msg_print(_("何か重いもので攻撃された!", "You are hit by something heavy!")); - msg_print(_("周辺の重力がゆがんだ。", "Gravity warps around you.")); + case GF_OLD_SPEED: + { + if (fuzzy) msg_print(_("何かで攻撃された!", "You are hit by something!")); + (void)set_fast(target_ptr, target_ptr->fast + randint1(5), FALSE); + dam = 0; + break; + } - if (!CHECK_MULTISHADOW(p_ptr)) - { - teleport_player(5, TELEPORT_PASSIVE); - if (!p_ptr->levitation) - (void)set_slow(p_ptr, p_ptr->slow + randint0(4) + 4, FALSE); - if (!(p_ptr->resist_sound || p_ptr->levitation)) - { - int plus_stun = (randint1((dam > 90) ? 35 : (dam / 3 + 5))); - (void)set_stun(p_ptr, p_ptr->stun + plus_stun); - } - } - if (p_ptr->levitation) - { - dam = (dam * 2) / 3; - } + case GF_OLD_SLOW: + { + if (fuzzy) msg_print(_("何か遅いもので攻撃された!", "You are hit by something slow!")); + (void)set_slow(target_ptr, target_ptr->slow + randint0(4) + 4, FALSE); + break; + } - if (!p_ptr->levitation || one_in_(13)) - { - inven_damage(set_cold_destroy, 2); - } + case GF_OLD_SLEEP: + { + if (target_ptr->free_act) break; + if (fuzzy) msg_print(_("眠ってしまった!", "You fall asleep!")); - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - break; + if (ironman_nightmare) + { + msg_print(_("恐ろしい光景が頭に浮かんできた。", "A horrible vision enters your mind.")); + /* Have some nightmares */ + sanity_blast(target_ptr, NULL, FALSE); } - /* Standard damage */ - case GF_DISINTEGRATE: - { - if (fuzzy) msg_print(_("純粋なエネルギーで攻撃された!", "You are hit by pure energy!")); + set_paralyzed(target_ptr, target_ptr->paralyzed + dam); + dam = 0; + break; + } - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - break; - } + /* Pure damage */ + case GF_MANA: + case GF_SEEKER: + case GF_SUPER_RAY: + { + if (fuzzy) msg_print(_("魔法のオーラで攻撃された!", "You are hit by an aura of magic!")); + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + break; + } - case GF_OLD_HEAL: - { - if (fuzzy) msg_print(_("何らかの攻撃によって気分がよくなった。", "You are hit by something invigorating!")); + /* Pure damage */ + case GF_PSY_SPEAR: + { + if (fuzzy) msg_print(_("エネルギーの塊で攻撃された!", "You are hit by an energy!")); + get_damage = take_hit(target_ptr, DAMAGE_FORCE, dam, killer, monspell); + break; + } - (void)hp_player(p_ptr, dam); - dam = 0; - break; - } + /* Pure damage */ + case GF_METEOR: + { + if (fuzzy) msg_print(_("何かが空からあなたの頭上に落ちてきた!", "Something falls from the sky on you!")); - case GF_OLD_SPEED: + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + if (!target_ptr->resist_shard || one_in_(13)) { - if (fuzzy) msg_print(_("何かで攻撃された!", "You are hit by something!")); - (void)set_fast(p_ptr, p_ptr->fast + randint1(5), FALSE); - dam = 0; - break; + if (!target_ptr->immune_fire) inventory_damage(target_ptr, set_fire_destroy, 2); + inventory_damage(target_ptr, set_cold_destroy, 2); } - case GF_OLD_SLOW: - { - if (fuzzy) msg_print(_("何か遅いもので攻撃された!", "You are hit by something slow!")); - (void)set_slow(p_ptr, p_ptr->slow + randint0(4) + 4, FALSE); - break; - } + break; + } - case GF_OLD_SLEEP: + /* Ice -- cold plus stun plus cuts */ + case GF_ICE: + { + if (fuzzy) msg_print(_("何か鋭く冷たいもので攻撃された!", "You are hit by something sharp and cold!")); + get_damage = cold_dam(target_ptr, dam, killer, monspell, FALSE); + if (!CHECK_MULTISHADOW(target_ptr)) { - if (p_ptr->free_act) break; - if (fuzzy) msg_print(_("眠ってしまった!", "You fall asleep!")); - - if (ironman_nightmare) + if (!target_ptr->resist_shard) { - msg_print(_("恐ろしい光景が頭に浮かんできた。", "A horrible vision enters your mind.")); - /* Have some nightmares */ - sanity_blast(p_ptr, NULL, FALSE); + (void)set_cut(target_ptr, target_ptr->cut + damroll(5, 8)); + } + if (!target_ptr->resist_sound) + { + (void)set_stun(target_ptr, target_ptr->stun + randint1(15)); } - set_paralyzed(p_ptr, p_ptr->paralyzed + dam); - dam = 0; - break; + if ((!(target_ptr->resist_cold || is_oppose_cold(target_ptr))) || one_in_(12)) + { + if (!target_ptr->immune_cold) inventory_damage(target_ptr, set_cold_destroy, 3); + } } - /* Pure damage */ - case GF_MANA: - case GF_SEEKER: - case GF_SUPER_RAY: - { - if (fuzzy) msg_print(_("魔法のオーラで攻撃された!", "You are hit by an aura of magic!")); - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - break; - } + break; + } - /* Pure damage */ - case GF_PSY_SPEAR: + /* Death Ray */ + case GF_DEATH_RAY: + { + if (fuzzy) msg_print(_("何か非常に冷たいもので攻撃された!", "You are hit by something extremely cold!")); + + if (target_ptr->mimic_form) { - if (fuzzy) msg_print(_("エネルギーの塊で攻撃された!", "You are hit by an energy!")); - get_damage = take_hit(p_ptr, DAMAGE_FORCE, dam, killer, monspell); - break; + if (!(mimic_info[target_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)) + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); } - - /* Pure damage */ - case GF_METEOR: + else { - if (fuzzy) msg_print(_("何かが空からあなたの頭上に落ちてきた!", "Something falls from the sky on you!")); - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - if (!p_ptr->resist_shard || one_in_(13)) + switch (target_ptr->prace) { - if (!p_ptr->immune_fire) inven_damage(set_fire_destroy, 2); - inven_damage(set_cold_destroy, 2); + /* Some races are immune */ + case RACE_GOLEM: + case RACE_SKELETON: + case RACE_ZOMBIE: + case RACE_VAMPIRE: + case RACE_DEMON: + case RACE_SPECTRE: + { + dam = 0; + break; } - - break; - } - - /* Ice -- cold plus stun plus cuts */ - case GF_ICE: - { - if (fuzzy) msg_print(_("何か鋭く冷たいもので攻撃された!", "You are hit by something sharp and cold!")); - get_damage = cold_dam(dam, killer, monspell, FALSE); - if (!CHECK_MULTISHADOW(p_ptr)) + /* Hurt a lot */ + default: { - if (!p_ptr->resist_shard) - { - (void)set_cut(p_ptr,p_ptr->cut + damroll(5, 8)); - } - if (!p_ptr->resist_sound) - { - (void)set_stun(p_ptr, p_ptr->stun + randint1(15)); - } - - if ((!(p_ptr->resist_cold || IS_OPPOSE_COLD())) || one_in_(12)) - { - if (!p_ptr->immune_cold) inven_damage(set_cold_destroy, 3); - } + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + break; + } } - - break; } - /* Death Ray */ - case GF_DEATH_RAY: + break; + } + + /* Drain mana */ + case GF_DRAIN_MANA: + { + if (CHECK_MULTISHADOW(target_ptr)) { - if (fuzzy) msg_print(_("何か非常に冷たいもので攻撃された!", "You are hit by something extremely cold!")); + msg_print(_("攻撃は幻影に命中し、あなたには届かなかった。", "The attack hits Shadow, you are unharmed!")); + } + else if (target_ptr->csp) + { + /* Basic message */ + if (who > 0) + msg_format(_("%^sに精神エネルギーを吸い取られてしまった!", "%^s draws psychic energy from you!"), m_name); + else + msg_print(_("精神エネルギーを吸い取られてしまった!", "Your psychic energy is drawn!")); - if (p_ptr->mimic_form) + /* Full drain */ + if (dam >= target_ptr->csp) { - if (!(mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)) - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); + dam = target_ptr->csp; + target_ptr->csp = 0; + target_ptr->csp_frac = 0; } + + /* Partial drain */ else { + target_ptr->csp -= dam; + } + + learn_spell(target_ptr, monspell); + target_ptr->redraw |= (PR_MANA); + target_ptr->window |= (PW_PLAYER | PW_SPELL); - switch (p_ptr->prace) + if (who > 0) { - /* Some races are immune */ - case RACE_GOLEM: - case RACE_SKELETON: - case RACE_ZOMBIE: - case RACE_VAMPIRE: - case RACE_DEMON: - case RACE_SPECTRE: - { - dam = 0; - break; - } - /* Hurt a lot */ - default: + /* Heal the monster */ + if (m_ptr->hp < m_ptr->maxhp) { - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - break; + /* Heal */ + m_ptr->hp += dam; + if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp; + + /* Redraw (later) if needed */ + if (target_ptr->health_who == who) target_ptr->redraw |= (PR_HEALTH); + if (target_ptr->riding == who) target_ptr->redraw |= (PR_UHEALTH); + + /* Special message */ + if (m_ptr->ml) + { + msg_format(_("%^sは気分が良さそうだ。", "%^s appears healthier."), m_name); + } } } - } + } + + dam = 0; + break; + } - break; + /* Mind blast */ + case GF_MIND_BLAST: + { + if ((randint0(100 + rlev / 2) < MAX(5, target_ptr->skill_sav)) && !CHECK_MULTISHADOW(target_ptr)) + { + msg_print(_("しかし効力を跳ね返した!", "You resist the effects!")); + learn_spell(target_ptr, monspell); } - - /* Drain mana */ - case GF_DRAIN_MANA: + else { - if (CHECK_MULTISHADOW(p_ptr)) + if (!CHECK_MULTISHADOW(target_ptr)) { - msg_print(_("攻撃は幻影に命中し、あなたには届かなかった。", "The attack hits Shadow, you are unharmed!")); - } - else if (p_ptr->csp) - { - /* Basic message */ - if (who > 0) - msg_format(_("%^sに精神エネルギーを吸い取られてしまった!", "%^s draws psychic energy from you!"), m_name); - else - msg_print(_("精神エネルギーを吸い取られてしまった!", "Your psychic energy is drawn!")); + msg_print(_("霊的エネルギーで精神が攻撃された。", "Your mind is blasted by psyonic energy.")); - /* Full drain */ - if (dam >= p_ptr->csp) + if (!target_ptr->resist_conf) { - dam = p_ptr->csp; - p_ptr->csp = 0; - p_ptr->csp_frac = 0; + (void)set_confused(target_ptr, target_ptr->confused + randint0(4) + 4); } - /* Partial drain */ - else + if (!target_ptr->resist_chaos && one_in_(3)) { - p_ptr->csp -= dam; + (void)set_image(target_ptr, target_ptr->image + randint0(250) + 150); } - learn_spell(monspell); - p_ptr->redraw |= (PR_MANA); - p_ptr->window |= (PW_PLAYER | PW_SPELL); - - if (who > 0) + target_ptr->csp -= 50; + if (target_ptr->csp < 0) { - /* Heal the monster */ - if (m_ptr->hp < m_ptr->maxhp) - { - /* Heal */ - m_ptr->hp += dam; - if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp; - - /* Redraw (later) if needed */ - if (p_ptr->health_who == who) p_ptr->redraw |= (PR_HEALTH); - if (p_ptr->riding == who) p_ptr->redraw |= (PR_UHEALTH); - - /* Special message */ - if (m_ptr->ml) - { - msg_format(_("%^sは気分が良さそうだ。", "%^s appears healthier."), m_name); - } - } + target_ptr->csp = 0; + target_ptr->csp_frac = 0; } + target_ptr->redraw |= PR_MANA; } - dam = 0; - break; + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); } + break; + } - /* Mind blast */ - case GF_MIND_BLAST: + /* Brain smash */ + case GF_BRAIN_SMASH: + { + if ((randint0(100 + rlev / 2) < MAX(5, target_ptr->skill_sav)) && !CHECK_MULTISHADOW(target_ptr)) { - if ((randint0(100 + rlev / 2) < MAX(5, p_ptr->skill_sav)) && !CHECK_MULTISHADOW(p_ptr)) - { - msg_print(_("しかし効力を跳ね返した!", "You resist the effects!")); - learn_spell(monspell); - } - else + msg_print(_("しかし効力を跳ね返した!", "You resist the effects!")); + learn_spell(target_ptr, monspell); + } + else + { + if (!CHECK_MULTISHADOW(target_ptr)) { - if (!CHECK_MULTISHADOW(p_ptr)) - { - msg_print(_("霊的エネルギーで精神が攻撃された。", "Your mind is blasted by psyonic energy.")); - - if (!p_ptr->resist_conf) - { - (void)set_confused(p_ptr, p_ptr->confused + randint0(4) + 4); - } + msg_print(_("霊的エネルギーで精神が攻撃された。", "Your mind is blasted by psyonic energy.")); - if (!p_ptr->resist_chaos && one_in_(3)) - { - (void)set_image(p_ptr, 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; + target_ptr->csp -= 100; + if (target_ptr->csp < 0) + { + target_ptr->csp = 0; + target_ptr->csp_frac = 0; } - - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); + target_ptr->redraw |= PR_MANA; } - break; - } - /* Brain smash */ - case GF_BRAIN_SMASH: - { - if ((randint0(100 + rlev / 2) < MAX(5, p_ptr->skill_sav)) && !CHECK_MULTISHADOW(p_ptr)) + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + if (!CHECK_MULTISHADOW(target_ptr)) { - msg_print(_("しかし効力を跳ね返した!", "You resist the effects!")); - learn_spell(monspell); - } - else - { - if (!CHECK_MULTISHADOW(p_ptr)) + if (!target_ptr->resist_blind) { - msg_print(_("霊的エネルギーで精神が攻撃された。", "Your mind is blasted by psyonic energy.")); - - p_ptr->csp -= 100; - if (p_ptr->csp < 0) - { - p_ptr->csp = 0; - p_ptr->csp_frac = 0; - } - p_ptr->redraw |= PR_MANA; + (void)set_blind(target_ptr, target_ptr->blind + 8 + randint0(8)); } - - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - if (!CHECK_MULTISHADOW(p_ptr)) + if (!target_ptr->resist_conf) { - if (!p_ptr->resist_blind) - { - (void)set_blind(p_ptr, p_ptr->blind + 8 + randint0(8)); - } - if (!p_ptr->resist_conf) - { - (void)set_confused(p_ptr, p_ptr->confused + randint0(4) + 4); - } - if (!p_ptr->free_act) - { - (void)set_paralyzed(p_ptr, p_ptr->paralyzed + randint0(4) + 4); - } - (void)set_slow(p_ptr, p_ptr->slow + randint0(4) + 4, FALSE); + (void)set_confused(target_ptr, target_ptr->confused + randint0(4) + 4); + } + if (!target_ptr->free_act) + { + (void)set_paralyzed(target_ptr, target_ptr->paralyzed + randint0(4) + 4); + } + (void)set_slow(target_ptr, target_ptr->slow + randint0(4) + 4, FALSE); - while (randint0(100 + rlev / 2) > (MAX(5, p_ptr->skill_sav))) - (void)do_dec_stat(p_ptr, A_INT); - while (randint0(100 + rlev / 2) > (MAX(5, p_ptr->skill_sav))) - (void)do_dec_stat(p_ptr, A_WIS); + while (randint0(100 + rlev / 2) > (MAX(5, target_ptr->skill_sav))) + (void)do_dec_stat(target_ptr, A_INT); + while (randint0(100 + rlev / 2) > (MAX(5, target_ptr->skill_sav))) + (void)do_dec_stat(target_ptr, A_WIS); - if (!p_ptr->resist_chaos) - { - (void)set_image(p_ptr, p_ptr->image + randint0(250) + 150); - } + if (!target_ptr->resist_chaos) + { + (void)set_image(target_ptr, target_ptr->image + randint0(250) + 150); } } - break; } + break; + } - /* cause 1 */ - case GF_CAUSE_1: + /* cause 1 */ + case GF_CAUSE_1: + { + if ((randint0(100 + rlev / 2) < target_ptr->skill_sav) && !CHECK_MULTISHADOW(target_ptr)) { - if ((randint0(100 + rlev / 2) < p_ptr->skill_sav) && !CHECK_MULTISHADOW(p_ptr)) - { - msg_print(_("しかし効力を跳ね返した!", "You resist the effects!")); - learn_spell(monspell); - } - else - { - if (!CHECK_MULTISHADOW(p_ptr)) curse_equipment(15, 0); - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - } - break; + msg_print(_("しかし効力を跳ね返した!", "You resist the effects!")); + learn_spell(target_ptr, monspell); + } + else + { + if (!CHECK_MULTISHADOW(target_ptr)) curse_equipment(15, 0); + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); } + break; + } - /* cause 2 */ - case GF_CAUSE_2: + /* cause 2 */ + case GF_CAUSE_2: + { + if ((randint0(100 + rlev / 2) < target_ptr->skill_sav) && !CHECK_MULTISHADOW(target_ptr)) { - if ((randint0(100 + rlev / 2) < p_ptr->skill_sav) && !CHECK_MULTISHADOW(p_ptr)) - { - msg_print(_("しかし効力を跳ね返した!", "You resist the effects!")); - learn_spell(monspell); - } - else - { - if (!CHECK_MULTISHADOW(p_ptr)) curse_equipment(25, MIN(rlev / 2 - 15, 5)); - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - } - break; + msg_print(_("しかし効力を跳ね返した!", "You resist the effects!")); + learn_spell(target_ptr, monspell); + } + else + { + if (!CHECK_MULTISHADOW(target_ptr)) curse_equipment(25, MIN(rlev / 2 - 15, 5)); + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); } + break; + } - /* cause 3 */ - case GF_CAUSE_3: + /* cause 3 */ + case GF_CAUSE_3: + { + if ((randint0(100 + rlev / 2) < target_ptr->skill_sav) && !CHECK_MULTISHADOW(target_ptr)) { - if ((randint0(100 + rlev / 2) < p_ptr->skill_sav) && !CHECK_MULTISHADOW(p_ptr)) - { - msg_print(_("しかし効力を跳ね返した!", "You resist the effects!")); - learn_spell(monspell); - } - else - { - if (!CHECK_MULTISHADOW(p_ptr)) curse_equipment(33, MIN(rlev / 2 - 15, 15)); - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - } - break; + msg_print(_("しかし効力を跳ね返した!", "You resist the effects!")); + learn_spell(target_ptr, monspell); } + else + { + if (!CHECK_MULTISHADOW(target_ptr)) curse_equipment(33, MIN(rlev / 2 - 15, 15)); + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + } + break; + } - /* cause 4 */ - case GF_CAUSE_4: + /* cause 4 */ + case GF_CAUSE_4: + { + if ((randint0(100 + rlev / 2) < target_ptr->skill_sav) && !(m_ptr->r_idx == MON_KENSHIROU) && !CHECK_MULTISHADOW(target_ptr)) { - if ((randint0(100 + rlev / 2) < p_ptr->skill_sav) && !(m_ptr->r_idx == MON_KENSHIROU) && !CHECK_MULTISHADOW(p_ptr)) - { - msg_print(_("しかし秘孔を跳ね返した!", "You resist the effects!")); - learn_spell(monspell); - } - else - { - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, killer, monspell); - if (!CHECK_MULTISHADOW(p_ptr)) (void)set_cut(p_ptr,p_ptr->cut + damroll(10, 10)); - } - break; + msg_print(_("しかし秘孔を跳ね返した!", "You resist the effects!")); + learn_spell(target_ptr, monspell); + } + else + { + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, killer, monspell); + if (!CHECK_MULTISHADOW(target_ptr)) (void)set_cut(target_ptr, target_ptr->cut + damroll(10, 10)); } + break; + } - /* Hand of Doom */ - case GF_HAND_DOOM: + /* Hand of Doom */ + case GF_HAND_DOOM: + { + if ((randint0(100 + rlev / 2) < target_ptr->skill_sav) && !CHECK_MULTISHADOW(target_ptr)) { - if ((randint0(100 + rlev/2) < p_ptr->skill_sav) && !CHECK_MULTISHADOW(p_ptr)) + msg_print(_("しかし効力を跳ね返した!", "You resist the effects!")); + learn_spell(target_ptr, monspell); + } + else + { + if (!CHECK_MULTISHADOW(target_ptr)) { - msg_print(_("しかし効力を跳ね返した!", "You resist the effects!")); - learn_spell(monspell); + msg_print(_("あなたは命が薄まっていくように感じた!", "You feel your life fade away!")); + curse_equipment(40, 20); } - else - { - if (!CHECK_MULTISHADOW(p_ptr)) - { - msg_print(_("あなたは命が薄まっていくように感じた!", "You feel your life fade away!")); - curse_equipment(40, 20); - } - get_damage = take_hit(p_ptr, DAMAGE_ATTACK, dam, m_name, monspell); + get_damage = take_hit(target_ptr, DAMAGE_ATTACK, dam, m_name, monspell); - if (p_ptr->chp < 1) p_ptr->chp = 1; - } - break; + if (target_ptr->chp < 1) target_ptr->chp = 1; } + break; + } - /* Default */ - default: - { - /* No damage */ - dam = 0; + /* Default */ + default: + { + /* No damage */ + dam = 0; - break; - } + break; + } } /* Hex - revenge damage stored */ - revenge_store(get_damage); + revenge_store(target_ptr, get_damage); - if ((p_ptr->tim_eyeeye || hex_spelling(HEX_EYE_FOR_EYE)) - && (get_damage > 0) && !p_ptr->is_dead && (who > 0)) + if ((target_ptr->tim_eyeeye || hex_spelling(HEX_EYE_FOR_EYE)) + && (get_damage > 0) && !target_ptr->is_dead && (who > 0)) { GAME_TEXT m_name_self[80]; @@ -5061,22 +5064,22 @@ static bool project_p(MONSTER_IDX who, concptr who_name, int r, POSITION y, POSI monster_desc(m_name_self, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE); msg_format(_("攻撃が%s自身を傷つけた!", "The attack of %s has wounded %s!"), m_name, m_name_self); - project(0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL, -1); - if (p_ptr->tim_eyeeye) set_tim_eyeeye(p_ptr, p_ptr->tim_eyeeye-5, TRUE); + project(target_ptr, 0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL, -1); + if (target_ptr->tim_eyeeye) set_tim_eyeeye(target_ptr, target_ptr->tim_eyeeye - 5, TRUE); } - if (p_ptr->riding && dam > 0) + if (target_ptr->riding && dam > 0) { rakubadam_p = (dam > 200) ? 200 : dam; } - disturb(p_ptr, TRUE, TRUE); + disturb(target_ptr, TRUE, TRUE); - if ((p_ptr->special_defense & NINJA_KAWARIMI) && dam && who && (who != p_ptr->riding)) + if ((target_ptr->special_defense & NINJA_KAWARIMI) && dam && who && (who != target_ptr->riding)) { - (void)kawarimi(FALSE); + (void)kawarimi(target_ptr, FALSE); } /* Return "Anything seen?" */ @@ -5111,13 +5114,12 @@ POSITION dist_to_line(POSITION y, POSITION x, POSITION y1, POSITION x1, POSITION } - /* * * Modified version of los() for calculation of disintegration balls. * Disintegration effects are stopped by permanent walls. */ -bool in_disintegration_range(POSITION y1, POSITION x1, POSITION y2, POSITION x2) +bool in_disintegration_range(floor_type *floor_ptr, POSITION y1, POSITION x1, POSITION y2, POSITION x2) { POSITION dx, dy; /* Delta */ POSITION ax, ay; /* Absolute */ @@ -5136,10 +5138,10 @@ bool in_disintegration_range(POSITION y1, POSITION x1, POSITION y2, POSITION x2) ax = ABS(dx); /* Handle adjacent (or identical) grids */ - if ((ax < 2) && (ay < 2)) return (TRUE); + if ((ax < 2) && (ay < 2)) return TRUE; /* Paranoia -- require "safe" origin */ - /* if (!in_bounds(y1, x1)) return (FALSE); */ + /* if (!in_bounds(floor_ptr, y1, x1)) return FALSE; */ /* Directly South/North */ if (!dx) @@ -5149,7 +5151,7 @@ bool in_disintegration_range(POSITION y1, POSITION x1, POSITION y2, POSITION x2) { for (ty = y1 + 1; ty < y2; ty++) { - if (cave_stop_disintegration(ty, x1)) return (FALSE); + if (cave_stop_disintegration(floor_ptr, ty, x1)) return FALSE; } } @@ -5158,12 +5160,12 @@ bool in_disintegration_range(POSITION y1, POSITION x1, POSITION y2, POSITION x2) { for (ty = y1 - 1; ty > y2; ty--) { - if (cave_stop_disintegration(ty, x1)) return (FALSE); + if (cave_stop_disintegration(floor_ptr, ty, x1)) return FALSE; } } /* Assume los */ - return (TRUE); + return TRUE; } /* Directly East/West */ @@ -5174,7 +5176,7 @@ bool in_disintegration_range(POSITION y1, POSITION x1, POSITION y2, POSITION x2) { for (tx = x1 + 1; tx < x2; tx++) { - if (cave_stop_disintegration(y1, tx)) return (FALSE); + if (cave_stop_disintegration(floor_ptr, y1, tx)) return FALSE; } } @@ -5183,12 +5185,12 @@ bool in_disintegration_range(POSITION y1, POSITION x1, POSITION y2, POSITION x2) { for (tx = x1 - 1; tx > x2; tx--) { - if (cave_stop_disintegration(y1, tx)) return (FALSE); + if (cave_stop_disintegration(floor_ptr, y1, tx)) return FALSE; } } /* Assume los */ - return (TRUE); + return TRUE; } /* Extract some signs */ @@ -5200,7 +5202,7 @@ bool in_disintegration_range(POSITION y1, POSITION x1, POSITION y2, POSITION x2) { if (ay == 2) { - if (!cave_stop_disintegration(y1 + sy, x1)) return (TRUE); + if (!cave_stop_disintegration(floor_ptr, y1 + sy, x1)) return TRUE; } } @@ -5209,7 +5211,7 @@ bool in_disintegration_range(POSITION y1, POSITION x1, POSITION y2, POSITION x2) { if (ax == 2) { - if (!cave_stop_disintegration(y1, x1 + sx)) return (TRUE); + if (!cave_stop_disintegration(floor_ptr, y1, x1 + sx)) return TRUE; } } @@ -5244,7 +5246,7 @@ bool in_disintegration_range(POSITION y1, POSITION x1, POSITION y2, POSITION x2) /* the LOS exactly meets the corner of a tile. */ while (x2 - tx) { - if (cave_stop_disintegration(ty, tx)) return (FALSE); + if (cave_stop_disintegration(floor_ptr, ty, tx)) return FALSE; qy += m; @@ -5255,7 +5257,7 @@ bool in_disintegration_range(POSITION y1, POSITION x1, POSITION y2, POSITION x2) else if (qy > f2) { ty += sy; - if (cave_stop_disintegration(ty, tx)) return (FALSE); + if (cave_stop_disintegration(floor_ptr, ty, tx)) return FALSE; qy -= f1; tx += sx; } @@ -5266,64 +5268,61 @@ bool in_disintegration_range(POSITION y1, POSITION x1, POSITION y2, POSITION x2) tx += sx; } } + + return TRUE; } - /* Travel vertically */ + /* Let m = dx / dy * 2 * (dx * dy) = 2 * dx * dx */ + qx = ax * ax; + m = qx << 1; + + ty = y1 + sy; + + if (qx == f2) + { + tx = x1 + sx; + qx -= f1; + } else { - /* Let m = dx / dy * 2 * (dx * dy) = 2 * dx * dx */ - qx = ax * ax; - m = qx << 1; + tx = x1; + } + + /* Note (below) the case (qx == f2), where */ + /* the LOS exactly meets the corner of a tile. */ + while (y2 - ty) + { + if (cave_stop_disintegration(floor_ptr, ty, tx)) return FALSE; - ty = y1 + sy; + qx += m; - if (qx == f2) + if (qx < f2) { - tx = x1 + sx; - qx -= f1; + ty += sy; } - else + else if (qx > f2) { - tx = x1; + tx += sx; + if (cave_stop_disintegration(floor_ptr, ty, tx)) return FALSE; + qx -= f1; + ty += sy; } - - /* Note (below) the case (qx == f2), where */ - /* the LOS exactly meets the corner of a tile. */ - while (y2 - ty) + else { - if (cave_stop_disintegration(ty, tx)) return (FALSE); - - qx += m; - - if (qx < f2) - { - ty += sy; - } - else if (qx > f2) - { - tx += sx; - if (cave_stop_disintegration(ty, tx)) return (FALSE); - qx -= f1; - ty += sy; - } - else - { - tx += sx; - qx -= f1; - ty += sy; - } + tx += sx; + qx -= f1; + ty += sy; } } - /* Assume los */ - return (TRUE); + return TRUE; } /* * breath shape */ -void breath_shape(u16b *path_g, int dist, int *pgrids, POSITION *gx, POSITION *gy, POSITION *gm, POSITION *pgm_rad, POSITION rad, POSITION y1, POSITION x1, POSITION y2, POSITION x2, EFFECT_ID typ) +void breath_shape(player_type *caster_ptr, u16b *path_g, int dist, int *pgrids, POSITION *gx, POSITION *gy, POSITION *gm, POSITION *pgm_rad, POSITION rad, POSITION y1, POSITION x1, POSITION y2, POSITION x2, EFFECT_ID typ) { POSITION by = y1; POSITION bx = x1; @@ -5334,6 +5333,7 @@ void breath_shape(u16b *path_g, int dist, int *pgrids, POSITION *gx, POSITION *g int path_n = 0; int mdis = distance(y1, x1, y2, x2) + rad; + floor_type *floor_ptr = caster_ptr->current_floor_ptr; while (bdis <= mdis) { POSITION x, y; @@ -5362,7 +5362,7 @@ void breath_shape(u16b *path_g, int dist, int *pgrids, POSITION *gx, POSITION *g for (x = bx - cdis; x <= bx + cdis; x++) { /* Ignore "illegal" locations */ - if (!in_bounds(y, x)) continue; + if (!in_bounds(floor_ptr, y, x)) continue; /* Enforce a circular "ripple" */ if (distance(y1, x1, y, x) != bdis) continue; @@ -5375,15 +5375,15 @@ void breath_shape(u16b *path_g, int dist, int *pgrids, POSITION *gx, POSITION *g case GF_LITE: case GF_LITE_WEAK: /* Lights are stopped by opaque terrains */ - if (!los(by, bx, y, x)) continue; + if (!los(caster_ptr, by, bx, y, x)) continue; break; case GF_DISINTEGRATE: /* Disintegration are stopped only by perma-walls */ - if (!in_disintegration_range(by, bx, y, x)) continue; + if (!in_disintegration_range(floor_ptr, by, bx, y, x)) continue; break; default: /* Ball explosions are stopped by walls */ - if (!projectable(by, bx, y, x)) continue; + if (!projectable(caster_ptr, by, bx, y, x)) continue; break; } @@ -5552,7 +5552,7 @@ void breath_shape(u16b *path_g, int dist, int *pgrids, POSITION *gx, POSITION *g * and "update_view()" and "update_monsters()" need to be called. * */ -bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT dam, EFFECT_ID typ, BIT_FLAGS flg, int monspell) +bool project(player_type *caster_ptr, MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT dam, EFFECT_ID typ, BIT_FLAGS flg, int monspell) { int i, t, dist; @@ -5579,7 +5579,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da bool breath = FALSE; /* Is the player blind? */ - bool blind = (p_ptr->blind ? TRUE : FALSE); + bool blind = (caster_ptr->blind ? TRUE : FALSE); bool old_hide = FALSE; @@ -5616,8 +5616,8 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da rakubadam_m = 0; /* Default target of monsterspell is player */ - monster_target_y = p_ptr->y; - monster_target_x = p_ptr->x; + monster_target_y = caster_ptr->y; + monster_target_x = caster_ptr->x; /* Hack -- Jump to target */ if (flg & (PROJECT_JUMP)) @@ -5634,16 +5634,16 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da /* Start at player */ else if (who <= 0) { - x1 = p_ptr->x; - y1 = p_ptr->y; + x1 = caster_ptr->x; + y1 = caster_ptr->y; } /* Start at monster */ else if (who > 0) { - x1 = current_floor_ptr->m_list[who].fx; - y1 = current_floor_ptr->m_list[who].fy; - monster_desc(who_name, ¤t_floor_ptr->m_list[who], MD_WRONGDOER_NAME); + x1 = caster_ptr->current_floor_ptr->m_list[who].fx; + y1 = caster_ptr->current_floor_ptr->m_list[who].fy; + monster_desc(who_name, &caster_ptr->current_floor_ptr->m_list[who], MD_WRONGDOER_NAME); } else @@ -5678,7 +5678,6 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da flg |= PROJECT_HIDE; } - /* Hack -- Assume there will be no blast (max radius 32) */ for (dist = 0; dist < 32; dist++) gm[dist] = 0; @@ -5710,15 +5709,15 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da /* Calculate the projection path */ - path_n = project_path(path_g, (project_length ? project_length : MAX_RANGE), y1, x1, y2, x2, flg); - handle_stuff(); + path_n = project_path(caster_ptr, path_g, (project_length ? project_length : MAX_RANGE), y1, x1, y2, x2, flg); + handle_stuff(caster_ptr); /* Giga-Hack SEEKER & SUPER_RAY */ - if( typ == GF_SEEKER ) + if (typ == GF_SEEKER) { int j; - int last_i=0; + int last_i = 0; /* Mega-Hack */ project_m_n = 0; @@ -5741,32 +5740,29 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da gx[grids] = x; grids++; - /* Only do visuals if requested */ if (!blind && !(flg & (PROJECT_HIDE))) { /* Only do visuals if the player can "see" the bolt */ - if (panel_contains(y, x) && player_has_los_bold(y, x)) + if (panel_contains(y, x) && player_has_los_bold(caster_ptr, y, x)) { - u16b p; - TERM_COLOR a; SYMBOL_CODE c; /* Obtain the bolt pict */ - p = bolt_pict(oy, ox, y, x, typ); + u16b p = bolt_pict(oy, ox, y, x, typ); /* Extract attr/char */ a = PICT_A(p); c = PICT_C(p); /* Visual effects */ - print_rel(c, a, y, x); + print_rel(caster_ptr, c, a, y, x); move_cursor_relative(y, x); - /*if (fresh_before)*/ Term_fresh(); + Term_fresh(); Term_xtra(TERM_XTRA_DELAY, msec); lite_spot(y, x); - /*if (fresh_before)*/ Term_fresh(); + Term_fresh(); /* Display "beam" grids */ if (flg & (PROJECT_BEAM)) @@ -5779,7 +5775,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da c = PICT_C(p); /* Visual effects */ - print_rel(c, a, y, x); + print_rel(caster_ptr, c, a, y, x); } /* Hack -- Activate delay */ @@ -5793,62 +5789,70 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da Term_xtra(TERM_XTRA_DELAY, msec); } } - if (project_o(0, 0, y, x, dam, GF_SEEKER))notice = TRUE; - if (is_mirror_grid(¤t_floor_ptr->grid_array[y][x])) + + if (project_o(caster_ptr, 0, 0, y, x, dam, GF_SEEKER))notice = TRUE; + if (is_mirror_grid(&caster_ptr->current_floor_ptr->grid_array[y][x])) { /* The target of monsterspell becomes tha mirror(broken) */ monster_target_y = y; monster_target_x = x; - remove_mirror(y, x); - next_mirror(&oy, &ox, y, x); + remove_mirror(caster_ptr, y, x); + next_mirror(caster_ptr, &oy, &ox, y, x); - path_n = i + project_path(&(path_g[i + 1]), (project_length ? project_length : MAX_RANGE), y, x, oy, ox, flg); + path_n = i + project_path(caster_ptr, &(path_g[i + 1]), (project_length ? project_length : MAX_RANGE), y, x, oy, ox, flg); for (j = last_i; j <= i; j++) { y = GRID_Y(path_g[j]); x = GRID_X(path_g[j]); - if (project_m(0, 0, y, x, dam, GF_SEEKER, flg, TRUE)) notice = TRUE; + if (project_m(caster_ptr, 0, 0, y, x, dam, GF_SEEKER, flg, TRUE)) notice = TRUE; if (!who && (project_m_n == 1) && !jump) { - if (current_floor_ptr->grid_array[project_m_y][project_m_x].m_idx > 0) { - monster_type *m_ptr = ¤t_floor_ptr->m_list[current_floor_ptr->grid_array[project_m_y][project_m_x].m_idx]; + if (caster_ptr->current_floor_ptr->grid_array[project_m_y][project_m_x].m_idx > 0) + { + monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[caster_ptr->current_floor_ptr->grid_array[project_m_y][project_m_x].m_idx]; if (m_ptr->ml) { - if (!p_ptr->image) monster_race_track(m_ptr->ap_r_idx); - health_track(current_floor_ptr->grid_array[project_m_y][project_m_x].m_idx); + if (!caster_ptr->image) monster_race_track(caster_ptr, m_ptr->ap_r_idx); + health_track(caster_ptr, caster_ptr->current_floor_ptr->grid_array[project_m_y][project_m_x].m_idx); } } } - (void)project_f(0, 0, y, x, dam, GF_SEEKER); + + (void)project_f(caster_ptr, 0, 0, y, x, dam, GF_SEEKER); } + last_i = i; } } - for(i = last_i ; i < path_n ; i++) + + for (i = last_i; i < path_n; i++) { POSITION py, px; py = GRID_Y(path_g[i]); px = GRID_X(path_g[i]); - if (project_m(0, 0, py, px, dam, GF_SEEKER, flg, TRUE)) + if (project_m(caster_ptr, 0, 0, py, px, dam, GF_SEEKER, flg, TRUE)) notice = TRUE; if (!who && (project_m_n == 1) && !jump) { - if (current_floor_ptr->grid_array[project_m_y][project_m_x].m_idx > 0) + if (caster_ptr->current_floor_ptr->grid_array[project_m_y][project_m_x].m_idx > 0) { - monster_type *m_ptr = ¤t_floor_ptr->m_list[current_floor_ptr->grid_array[project_m_y][project_m_x].m_idx]; + monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[caster_ptr->current_floor_ptr->grid_array[project_m_y][project_m_x].m_idx]; if (m_ptr->ml) { - if (!p_ptr->image) monster_race_track(m_ptr->ap_r_idx); - health_track(current_floor_ptr->grid_array[project_m_y][project_m_x].m_idx); + if (!caster_ptr->image) monster_race_track(caster_ptr, m_ptr->ap_r_idx); + health_track(caster_ptr, caster_ptr->current_floor_ptr->grid_array[project_m_y][project_m_x].m_idx); } } } - (void)project_f(0, 0, py, px, dam, GF_SEEKER); + + (void)project_f(caster_ptr, 0, 0, py, px, dam, GF_SEEKER); } + return notice; } - else if(typ == GF_SUPER_RAY){ + else if (typ == GF_SUPER_RAY) + { int j; int second_step = 0; @@ -5872,13 +5876,12 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da gy[grids] = y; gx[grids] = x; grids++; - - + /* Only do visuals if requested */ if (!blind && !(flg & (PROJECT_HIDE))) { /* Only do visuals if the player can "see" the bolt */ - if (panel_contains(y, x) && player_has_los_bold(y, x)) + if (panel_contains(y, x) && player_has_los_bold(caster_ptr, y, x)) { u16b p; @@ -5893,7 +5896,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da c = PICT_C(p); /* Visual effects */ - print_rel(c, a, y, x); + print_rel(caster_ptr, c, a, y, x); move_cursor_relative(y, x); /*if (fresh_before)*/ Term_fresh(); Term_xtra(TERM_XTRA_DELAY, msec); @@ -5911,7 +5914,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da c = PICT_C(p); /* Visual effects */ - print_rel(c, a, y, x); + print_rel(caster_ptr, c, a, y, x); } /* Hack -- Activate delay */ @@ -5925,56 +5928,61 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da Term_xtra(TERM_XTRA_DELAY, msec); } } - if(project_o(0,0,y,x,dam,GF_SUPER_RAY) )notice=TRUE; - if (!cave_have_flag_bold(y, x, FF_PROJECT)) + + if (project_o(caster_ptr, 0, 0, y, x, dam, GF_SUPER_RAY))notice = TRUE; + if (!cave_have_flag_bold(caster_ptr->current_floor_ptr, y, x, FF_PROJECT)) { - if( second_step )continue; + if (second_step)continue; break; } - if( is_mirror_grid(¤t_floor_ptr->grid_array[y][x]) && !second_step ) + + if (is_mirror_grid(&caster_ptr->current_floor_ptr->grid_array[y][x]) && !second_step) { - /* The target of monsterspell becomes tha mirror(broken) */ + /* The target of monsterspell becomes tha mirror(broken) */ monster_target_y = y; monster_target_x = x; - remove_mirror(y,x); - for( j = 0; j <=i ; j++ ) + remove_mirror(caster_ptr, y, x); + for (j = 0; j <= i; j++) { y = GRID_Y(path_g[j]); x = GRID_X(path_g[j]); - (void)project_f(0,0,y,x,dam,GF_SUPER_RAY); + (void)project_f(caster_ptr, 0, 0, y, x, dam, GF_SUPER_RAY); } + path_n = i; - second_step =i+1; - path_n += project_path(&(path_g[path_n+1]), (project_length ? project_length : MAX_RANGE), y, x, y-1, x-1, flg); - path_n += project_path(&(path_g[path_n+1]), (project_length ? project_length : MAX_RANGE), y, x, y-1, x , flg); - path_n += project_path(&(path_g[path_n+1]), (project_length ? project_length : MAX_RANGE), y, x, y-1, x+1, flg); - path_n += project_path(&(path_g[path_n+1]), (project_length ? project_length : MAX_RANGE), y, x, y , x-1, flg); - path_n += project_path(&(path_g[path_n+1]), (project_length ? project_length : MAX_RANGE), y, x, y , x+1, flg); - path_n += project_path(&(path_g[path_n+1]), (project_length ? project_length : MAX_RANGE), y, x, y+1, x-1, flg); - path_n += project_path(&(path_g[path_n+1]), (project_length ? project_length : MAX_RANGE), y, x, y+1, x , flg); - path_n += project_path(&(path_g[path_n+1]), (project_length ? project_length : MAX_RANGE), y, x, y+1, x+1, flg); + second_step = i + 1; + path_n += project_path(caster_ptr, &(path_g[path_n + 1]), (project_length ? project_length : MAX_RANGE), y, x, y - 1, x - 1, flg); + path_n += project_path(caster_ptr, &(path_g[path_n + 1]), (project_length ? project_length : MAX_RANGE), y, x, y - 1, x, flg); + path_n += project_path(caster_ptr, &(path_g[path_n + 1]), (project_length ? project_length : MAX_RANGE), y, x, y - 1, x + 1, flg); + path_n += project_path(caster_ptr, &(path_g[path_n + 1]), (project_length ? project_length : MAX_RANGE), y, x, y, x - 1, flg); + path_n += project_path(caster_ptr, &(path_g[path_n + 1]), (project_length ? project_length : MAX_RANGE), y, x, y, x + 1, flg); + path_n += project_path(caster_ptr, &(path_g[path_n + 1]), (project_length ? project_length : MAX_RANGE), y, x, y + 1, x - 1, flg); + path_n += project_path(caster_ptr, &(path_g[path_n + 1]), (project_length ? project_length : MAX_RANGE), y, x, y + 1, x, flg); + path_n += project_path(caster_ptr, &(path_g[path_n + 1]), (project_length ? project_length : MAX_RANGE), y, x, y + 1, x + 1, flg); } } - for( i = 0; i < path_n ; i++ ) + + for (i = 0; i < path_n; i++) { - POSITION py, px; - py = GRID_Y(path_g[i]); - px = GRID_X(path_g[i]); - (void)project_m(0, 0, py, px, dam, GF_SUPER_RAY, flg, TRUE); - if(!who && (project_m_n == 1) && !jump){ - if(current_floor_ptr->grid_array[project_m_y][project_m_x].m_idx >0 ){ - monster_type *m_ptr = ¤t_floor_ptr->m_list[current_floor_ptr->grid_array[project_m_y][project_m_x].m_idx]; + POSITION py = GRID_Y(path_g[i]); + POSITION px = GRID_X(path_g[i]); + (void)project_m(caster_ptr, 0, 0, py, px, dam, GF_SUPER_RAY, flg, TRUE); + if (!who && (project_m_n == 1) && !jump) { + if (caster_ptr->current_floor_ptr->grid_array[project_m_y][project_m_x].m_idx > 0) { + monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[caster_ptr->current_floor_ptr->grid_array[project_m_y][project_m_x].m_idx]; if (m_ptr->ml) { - if (!p_ptr->image) monster_race_track(m_ptr->ap_r_idx); - health_track(current_floor_ptr->grid_array[project_m_y][project_m_x].m_idx); + if (!caster_ptr->image) monster_race_track(caster_ptr, m_ptr->ap_r_idx); + health_track(caster_ptr, caster_ptr->current_floor_ptr->grid_array[project_m_y][project_m_x].m_idx); } } } - (void)project_f(0, 0, py, px, dam, GF_SUPER_RAY); + + (void)project_f(caster_ptr, 0, 0, py, px, dam, GF_SUPER_RAY); } + return notice; } @@ -5990,17 +5998,17 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da if (flg & PROJECT_DISI) { /* Hack -- Balls explode before reaching walls */ - if (cave_stop_disintegration(ny, nx) && (rad > 0)) break; + if (cave_stop_disintegration(caster_ptr->current_floor_ptr, ny, nx) && (rad > 0)) break; } else if (flg & PROJECT_LOS) { /* Hack -- Balls explode before reaching walls */ - if (!cave_los_bold(ny, nx) && (rad > 0)) break; + if (!cave_los_bold(caster_ptr->current_floor_ptr, ny, nx) && (rad > 0)) break; } else { /* Hack -- Balls explode before reaching walls */ - if (!cave_have_flag_bold(ny, nx, FF_PROJECT) && (rad > 0)) break; + if (!cave_have_flag_bold(caster_ptr->current_floor_ptr, ny, nx, FF_PROJECT) && (rad > 0)) break; } /* Advance */ @@ -6019,7 +6027,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da if (!blind && !(flg & (PROJECT_HIDE | PROJECT_FAST))) { /* Only do visuals if the player can "see" the bolt */ - if (panel_contains(y, x) && player_has_los_bold(y, x)) + if (panel_contains(y, x) && player_has_los_bold(caster_ptr, y, x)) { u16b p; @@ -6034,7 +6042,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da c = PICT_C(p); /* Visual effects */ - print_rel(c, a, y, x); + print_rel(caster_ptr, c, a, y, x); move_cursor_relative(y, x); /*if (fresh_before)*/ Term_fresh(); Term_xtra(TERM_XTRA_DELAY, msec); @@ -6052,7 +6060,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da c = PICT_C(p); /* Visual effects */ - print_rel(c, a, y, x); + print_rel(caster_ptr, c, a, y, x); } /* Hack -- Activate delay */ @@ -6115,7 +6123,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da { flg &= ~(PROJECT_HIDE); - breath_shape(path_g, dist, &grids, gx, gy, gm, &gm_rad, rad, y1, x1, by, bx, typ); + breath_shape(caster_ptr, path_g, dist, &grids, gx, gy, gm, &gm_rad, rad, y1, x1, by, bx, typ); } else { @@ -6128,7 +6136,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da for (x = bx - dist; x <= bx + dist; x++) { /* Ignore "illegal" locations */ - if (!in_bounds2(y, x)) continue; + if (!in_bounds2(caster_ptr->current_floor_ptr, y, x)) continue; /* Enforce a "circular" explosion */ if (distance(by, bx, y, x) != dist) continue; @@ -6138,15 +6146,15 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da case GF_LITE: case GF_LITE_WEAK: /* Lights are stopped by opaque terrains */ - if (!los(by, bx, y, x)) continue; + if (!los(caster_ptr, by, bx, y, x)) continue; break; case GF_DISINTEGRATE: /* Disintegration are stopped only by perma-walls */ - if (!in_disintegration_range(by, bx, y, x)) continue; + if (!in_disintegration_range(caster_ptr->current_floor_ptr, by, bx, y, x)) continue; break; default: /* Ball explosions are stopped by walls */ - if (!projectable(by, bx, y, x)) continue; + if (!projectable(caster_ptr, by, bx, y, x)) continue; break; } @@ -6158,13 +6166,13 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da } /* Encode some more "radius" info */ - gm[dist+1] = grids; + gm[dist + 1] = grids; } } } /* Speed -- ignore "non-explosions" */ - if (!grids) return (FALSE); + if (!grids) return FALSE; /* Display the "blast area" if requested */ @@ -6174,13 +6182,13 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da for (t = 0; t <= gm_rad; t++) { /* Dump everything with this radius */ - for (i = gm[t]; i < gm[t+1]; i++) + for (i = gm[t]; i < gm[t + 1]; i++) { y = gy[i]; x = gx[i]; /* Only do visuals if the player can "see" the blast */ - if (panel_contains(y, x) && player_has_los_bold(y, x)) + if (panel_contains(y, x) && player_has_los_bold(caster_ptr, y, x)) { u16b p; @@ -6197,7 +6205,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da c = PICT_C(p); /* Visual effects -- Display */ - print_rel(c, a, y, x); + print_rel(caster_ptr, c, a, y, x); } } @@ -6224,7 +6232,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da x = gx[i]; /* Hack -- Erase if needed */ - if (panel_contains(y, x) && player_has_los_bold(y, x)) + if (panel_contains(y, x) && player_has_los_bold(caster_ptr, y, x)) { lite_spot(y, x); } @@ -6238,15 +6246,14 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da } } - update_creature(p_ptr); + update_creature(caster_ptr); if (flg & PROJECT_KILL) { - see_s_msg = (who > 0) ? is_seen(¤t_floor_ptr->m_list[who]) : - (!who ? TRUE : (player_can_see_bold(y1, x1) && projectable(p_ptr->y, p_ptr->x, y1, x1))); + see_s_msg = (who > 0) ? is_seen(&caster_ptr->current_floor_ptr->m_list[who]) : + (!who ? TRUE : (player_can_see_bold(caster_ptr, y1, x1) && projectable(caster_ptr, caster_ptr->y, caster_ptr->x, y1, x1))); } - /* Check features */ if (flg & (PROJECT_GRID)) { @@ -6257,7 +6264,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da for (i = 0; i < grids; i++) { /* Hack -- Notice new "dist" values */ - if (gm[dist+1] == i) dist++; + if (gm[dist + 1] == i) dist++; /* Get the grid location */ y = gy[i]; @@ -6269,17 +6276,18 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da int d = dist_to_line(y, x, y1, x1, by, bx); /* Affect the grid */ - if (project_f(who, d, y, x, dam, typ)) notice = TRUE; + if (project_f(caster_ptr, who, d, y, x, dam, typ)) notice = TRUE; } + else { /* Affect the grid */ - if (project_f(who, dist, y, x, dam, typ)) notice = TRUE; + if (project_f(caster_ptr, who, dist, y, x, dam, typ)) notice = TRUE; } } } - update_creature(p_ptr); + update_creature(caster_ptr); /* Check objects */ if (flg & (PROJECT_ITEM)) @@ -6291,7 +6299,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da for (i = 0; i < grids; i++) { /* Hack -- Notice new "dist" values */ - if (gm[dist+1] == i) dist++; + if (gm[dist + 1] == i) dist++; /* Get the grid location */ y = gy[i]; @@ -6303,17 +6311,16 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da int d = dist_to_line(y, x, y1, x1, by, bx); /* Affect the object in the grid */ - if (project_o(who, d, y, x, dam, typ)) notice = TRUE; + if (project_o(caster_ptr, who, d, y, x, dam, typ)) notice = TRUE; } else { /* Affect the object in the grid */ - if (project_o(who, dist, y, x, dam, typ)) notice = TRUE; + if (project_o(caster_ptr, who, dist, y, x, dam, typ)) notice = TRUE; } } } - /* Check monsters */ if (flg & (PROJECT_KILL)) { @@ -6340,11 +6347,11 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da /* A single bolt may be reflected */ if (grids <= 1) { - monster_type *m_ptr = ¤t_floor_ptr->m_list[current_floor_ptr->grid_array[y][x].m_idx]; + monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[caster_ptr->current_floor_ptr->grid_array[y][x].m_idx]; monster_race *ref_ptr = &r_info[m_ptr->r_idx]; - if ((flg & PROJECT_REFLECTABLE) && current_floor_ptr->grid_array[y][x].m_idx && (ref_ptr->flags2 & RF2_REFLECTING) && - ((current_floor_ptr->grid_array[y][x].m_idx != p_ptr->riding) || !(flg & PROJECT_PLAYER)) && + if ((flg & PROJECT_REFLECTABLE) && caster_ptr->current_floor_ptr->grid_array[y][x].m_idx && (ref_ptr->flags2 & RF2_REFLECTING) && + ((caster_ptr->current_floor_ptr->grid_array[y][x].m_idx != caster_ptr->riding) || !(flg & PROJECT_PLAYER)) && (!who || dist_hack > 1) && !one_in_(10)) { POSITION t_y, t_x; @@ -6356,8 +6363,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da t_y = y_saver - 1 + randint1(3); t_x = x_saver - 1 + randint1(3); max_attempts--; - } - while (max_attempts && in_bounds2u(t_y, t_x) && !projectable(y, x, t_y, t_x)); + } while (max_attempts && in_bounds2u(caster_ptr->current_floor_ptr, t_y, t_x) && !projectable(caster_ptr, y, x, t_y, t_x)); if (max_attempts < 1) { @@ -6370,26 +6376,25 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da { if ((m_ptr->r_idx == MON_KENSHIROU) || (m_ptr->r_idx == MON_RAOU)) msg_print(_("「北斗神拳奥義・二指真空把!」", "The attack bounces!")); - else if (m_ptr->r_idx == MON_DIO) + else if (m_ptr->r_idx == MON_DIO) msg_print(_("ディオ・ブランドーは指一本で攻撃を弾き返した!", "The attack bounces!")); - else + else msg_print(_("攻撃は跳ね返った!", "The attack bounces!")); } if (is_original_ap_and_seen(m_ptr)) ref_ptr->r_flags2 |= RF2_REFLECTING; /* Reflected bolts randomly target either one */ - if (player_bold(y, x) || one_in_(2)) flg &= ~(PROJECT_PLAYER); + if (player_bold(caster_ptr, y, x) || one_in_(2)) flg &= ~(PROJECT_PLAYER); else flg |= PROJECT_PLAYER; /* The bolt is reflected */ - project(current_floor_ptr->grid_array[y][x].m_idx, 0, t_y, t_x, dam, typ, flg, monspell); + project(caster_ptr, caster_ptr->current_floor_ptr->grid_array[y][x].m_idx, 0, t_y, t_x, dam, typ, flg, monspell); /* Don't affect the monster any longer */ continue; } } - /* Find the closest point in the blast */ if (breath) { @@ -6400,9 +6405,8 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da effective_dist = dist; } - /* There is the riding player on this monster */ - if (p_ptr->riding && player_bold(y, x)) + if (caster_ptr->riding && player_bold(caster_ptr, y, x)) { /* Aimed on the player */ if (flg & PROJECT_PLAYER) @@ -6419,7 +6423,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da else { /* - * The spell is not well aimed, + * The spell is not well aimed, * So partly affect the mount too. */ effective_dist++; @@ -6441,10 +6445,10 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da * of fire is obstructed by this * monster. */ - /* - * A beam or bolt will hit either - * player or mount. Choose randomly. - */ + /* + * A beam or bolt will hit either + * player or mount. Choose randomly. + */ else if (flg & (PROJECT_BEAM | PROJECT_REFLECTABLE)) { if (one_in_(2)) @@ -6473,7 +6477,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da } /* Affect the monster in the grid */ - if (project_m(who, effective_dist, y, x, dam, typ, flg, see_s_msg)) notice = TRUE; + if (project_m(caster_ptr, who, effective_dist, y, x, dam, typ, flg, see_s_msg)) notice = TRUE; } @@ -6484,20 +6488,19 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da y = project_m_y; /* Track if possible */ - if (current_floor_ptr->grid_array[y][x].m_idx > 0) + if (caster_ptr->current_floor_ptr->grid_array[y][x].m_idx > 0) { - monster_type *m_ptr = ¤t_floor_ptr->m_list[current_floor_ptr->grid_array[y][x].m_idx]; + monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[caster_ptr->current_floor_ptr->grid_array[y][x].m_idx]; if (m_ptr->ml) { - if (!p_ptr->image) monster_race_track(m_ptr->ap_r_idx); - health_track(current_floor_ptr->grid_array[y][x].m_idx); + if (!caster_ptr->image) monster_race_track(caster_ptr, m_ptr->ap_r_idx); + health_track(caster_ptr, caster_ptr->current_floor_ptr->grid_array[y][x].m_idx); } } } } - /* Check player */ if (flg & (PROJECT_KILL)) { @@ -6510,14 +6513,14 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da int effective_dist; /* Hack -- Notice new "dist" values */ - if (gm[dist+1] == i) dist++; + if (gm[dist + 1] == i) dist++; /* Get the grid location */ y = gy[i]; x = gx[i]; /* Affect the player? */ - if (!player_bold(y, x)) continue; + if (!player_bold(caster_ptr, y, x)) continue; /* Find the closest point in the blast */ if (breath) @@ -6530,7 +6533,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da } /* Target may be your horse */ - if (p_ptr->riding) + if (caster_ptr->riding) { /* Aimed on the player */ if (flg & PROJECT_PLAYER) @@ -6561,7 +6564,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da else { /* - * The spell is not well aimed, + * The spell is not well aimed, * So partly affect the player too. */ effective_dist++; @@ -6569,26 +6572,26 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da } /* Affect the player */ - if (project_p(who, who_name, effective_dist, y, x, dam, typ, flg, monspell)) notice = TRUE; + if (project_p(who, caster_ptr, who_name, effective_dist, y, x, dam, typ, flg, monspell)) notice = TRUE; } } - if (p_ptr->riding) + if (caster_ptr->riding) { GAME_TEXT m_name[MAX_NLEN]; - monster_desc(m_name, ¤t_floor_ptr->m_list[p_ptr->riding], 0); + monster_desc(m_name, &caster_ptr->current_floor_ptr->m_list[caster_ptr->riding], 0); if (rakubadam_m > 0) { - if (rakuba(p_ptr, rakubadam_m, FALSE)) + if (rakuba(caster_ptr, rakubadam_m, FALSE)) { msg_format(_("%^sに振り落とされた!", "%^s has thrown you off!"), m_name); } } - if (p_ptr->riding && rakubadam_p > 0) + if (caster_ptr->riding && rakubadam_p > 0) { - if(rakuba(p_ptr, rakubadam_p, FALSE)) + if (rakuba(caster_ptr, rakubadam_p, FALSE)) { msg_format(_("%^sから落ちてしまった!", "You have fallen from %s."), m_name); } @@ -6604,7 +6607,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da * @param dam ダメージ量 * @return 効果があったらTRUEを返す */ -bool binding_field(HIT_POINT dam) +bool binding_field(player_type *caster_ptr, HIT_POINT dam) { POSITION mirror_x[10], mirror_y[10]; /* 鏡はもっと少ない */ int mirror_num = 0; /* 鏡の数 */ @@ -6619,19 +6622,19 @@ bool binding_field(HIT_POINT dam) POSITION point_y[3]; /* Default target of monsterspell is player */ - monster_target_y = p_ptr->y; - monster_target_x = p_ptr->x; + monster_target_y = caster_ptr->y; + monster_target_x = caster_ptr->x; - for (x = 0; x < current_floor_ptr->width; x++) + for (x = 0; x < caster_ptr->current_floor_ptr->width; x++) { - for (y = 0; y < current_floor_ptr->height; y++) - { - if (is_mirror_grid(¤t_floor_ptr->grid_array[y][x]) && - distance(p_ptr->y, p_ptr->x, y, x) <= MAX_RANGE && - distance(p_ptr->y, p_ptr->x, y, x) != 0 && - player_has_los_bold(y, x) && - projectable(p_ptr->y, p_ptr->x, y, x) - ) { + for (y = 0; y < caster_ptr->current_floor_ptr->height; y++) + { + if (is_mirror_grid(&caster_ptr->current_floor_ptr->grid_array[y][x]) && + distance(caster_ptr->y, caster_ptr->x, y, x) <= MAX_RANGE && + distance(caster_ptr->y, caster_ptr->x, y, x) != 0 && + player_has_los_bold(caster_ptr, y, x) && + projectable(caster_ptr, caster_ptr->y, caster_ptr->x, y, x)) + { mirror_y[mirror_num] = y; mirror_x[mirror_num] = x; mirror_num++; @@ -6650,8 +6653,8 @@ bool binding_field(HIT_POINT dam) point_x[0] = mirror_x[point_x[0]]; point_y[1] = mirror_y[point_x[1]]; point_x[1] = mirror_x[point_x[1]]; - point_y[2] = p_ptr->y; - point_x[2] = p_ptr->x; + point_y[2] = caster_ptr->y; + point_x[2] = caster_ptr->x; x = point_x[0] + point_x[1] + point_x[2]; y = point_y[0] + point_y[1] + point_y[2]; @@ -6670,8 +6673,10 @@ bool binding_field(HIT_POINT dam) y2 = point_y[0] > point_y[1] ? point_y[0] : point_y[1]; y2 = y2 > point_y[2] ? y2 : point_y[2]; - for (y = y1; y <= y2; y++) { - for (x = x1; x <= x2; x++) { + for (y = y1; y <= y2; y++) + { + for (x = x1; x <= x2; x++) + { if (centersign*((point_x[0] - x)*(point_y[1] - y) - (point_y[0] - y)*(point_x[1] - x)) >= 0 && centersign*((point_x[1] - x)*(point_y[2] - y) @@ -6679,12 +6684,14 @@ bool binding_field(HIT_POINT dam) centersign*((point_x[2] - x)*(point_y[0] - y) - (point_y[2] - y)*(point_x[0] - x)) >= 0) { - if (player_has_los_bold(y, x) && projectable(p_ptr->y, p_ptr->x, y, x)) { + if (player_has_los_bold(caster_ptr, y, x) && projectable(caster_ptr, caster_ptr->y, caster_ptr->x, y, x)) + { /* Visual effects */ - if (!(p_ptr->blind) - && panel_contains(y, x)) { + if (!(caster_ptr->blind) + && panel_contains(y, x)) + { p = bolt_pict(y, x, y, x, GF_MANA); - print_rel(PICT_C(p), PICT_A(p), y, x); + print_rel(caster_ptr, PICT_C(p), PICT_A(p), y, x); move_cursor_relative(y, x); /*if (fresh_before)*/ Term_fresh(); Term_xtra(TERM_XTRA_DELAY, msec); @@ -6693,8 +6700,11 @@ bool binding_field(HIT_POINT dam) } } } - for (y = y1; y <= y2; y++) { - for (x = x1; x <= x2; x++) { + + for (y = y1; y <= y2; y++) + { + for (x = x1; x <= x2; x++) + { if (centersign*((point_x[0] - x)*(point_y[1] - y) - (point_y[0] - y)*(point_x[1] - x)) >= 0 && centersign*((point_x[1] - x)*(point_y[2] - y) @@ -6702,14 +6712,18 @@ bool binding_field(HIT_POINT dam) centersign*((point_x[2] - x)*(point_y[0] - y) - (point_y[2] - y)*(point_x[0] - x)) >= 0) { - if (player_has_los_bold(y, x) && projectable(p_ptr->y, p_ptr->x, y, x)) { - (void)project_f(0, 0, y, x, dam, GF_MANA); + if (player_has_los_bold(caster_ptr, y, x) && projectable(caster_ptr, caster_ptr->y, caster_ptr->x, y, x)) + { + (void)project_f(caster_ptr, 0, 0, y, x, dam, GF_MANA); } } } } - for (y = y1; y <= y2; y++) { - for (x = x1; x <= x2; x++) { + + for (y = y1; y <= y2; y++) + { + for (x = x1; x <= x2; x++) + { if (centersign*((point_x[0] - x)*(point_y[1] - y) - (point_y[0] - y)*(point_x[1] - x)) >= 0 && centersign*((point_x[1] - x)*(point_y[2] - y) @@ -6717,14 +6731,18 @@ bool binding_field(HIT_POINT dam) centersign*((point_x[2] - x)*(point_y[0] - y) - (point_y[2] - y)*(point_x[0] - x)) >= 0) { - if (player_has_los_bold(y, x) && projectable(p_ptr->y, p_ptr->x, y, x)) { - (void)project_o(0, 0, y, x, dam, GF_MANA); + if (player_has_los_bold(caster_ptr, y, x) && projectable(caster_ptr, caster_ptr->y, caster_ptr->x, y, x)) + { + (void)project_o(caster_ptr, 0, 0, y, x, dam, GF_MANA); } } } } - for (y = y1; y <= y2; y++) { - for (x = x1; x <= x2; x++) { + + for (y = y1; y <= y2; y++) + { + for (x = x1; x <= x2; x++) + { if (centersign*((point_x[0] - x)*(point_y[1] - y) - (point_y[0] - y)*(point_x[1] - x)) >= 0 && centersign*((point_x[1] - x)*(point_y[2] - y) @@ -6732,16 +6750,19 @@ bool binding_field(HIT_POINT dam) centersign*((point_x[2] - x)*(point_y[0] - y) - (point_y[2] - y)*(point_x[0] - x)) >= 0) { - if (player_has_los_bold(y, x) && projectable(p_ptr->y, p_ptr->x, y, x)) { - (void)project_m(0, 0, y, x, dam, GF_MANA, + if (player_has_los_bold(caster_ptr, y, x) && projectable(caster_ptr, caster_ptr->y, caster_ptr->x, y, x)) + { + (void)project_m(caster_ptr, 0, 0, y, x, dam, GF_MANA, (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP), TRUE); } } } } - if (one_in_(7)) { + + if (one_in_(7)) + { msg_print(_("鏡が結界に耐えきれず、壊れてしまった。", "The field broke a mirror")); - remove_mirror(point_y[0], point_x[0]); + remove_mirror(caster_ptr, point_y[0], point_x[0]); } return TRUE; @@ -6752,32 +6773,28 @@ bool binding_field(HIT_POINT dam) * @param dam ダメージ量 * @return 効果があったらTRUEを返す */ -void seal_of_mirror(HIT_POINT dam) +void seal_of_mirror(player_type *caster_ptr, HIT_POINT dam) { - POSITION x, y; - - for (x = 0; x < current_floor_ptr->width; x++) + for (POSITION x = 0; x < caster_ptr->current_floor_ptr->width; x++) { - for (y = 0; y < current_floor_ptr->height; y++) + for (POSITION y = 0; y < caster_ptr->current_floor_ptr->height; y++) { - if (is_mirror_grid(¤t_floor_ptr->grid_array[y][x])) + if (!is_mirror_grid(&caster_ptr->current_floor_ptr->grid_array[y][x])) + continue; + + if (!project_m(caster_ptr, 0, 0, y, x, dam, GF_GENOCIDE, + (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP), TRUE)) + continue; + + if (!caster_ptr->current_floor_ptr->grid_array[y][x].m_idx) { - if (project_m(0, 0, y, x, dam, GF_GENOCIDE, - (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP), TRUE)) - { - if (!current_floor_ptr->grid_array[y][x].m_idx) - { - remove_mirror(y, x); - } - } + remove_mirror(caster_ptr, y, x); } } } - return; } - /*! * @brief 領域魔法に応じて技能の名称を返す。 * @param tval 魔法書のtval @@ -6797,4 +6814,3 @@ concptr spell_category_name(OBJECT_TYPE_VALUE tval) return _("呪文", "spell"); } } -