3 * @brief 打撃処理 / Melee process.
6 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke\n
7 * This software may be copied and distributed for educational, research,\n
8 * and not for profit purposes provided that this copyright and statement\n
9 * are included in all such copies. Other copyrights may also apply.\n
10 * 2014 Deskull rearranged comment for Doxygen.\n
20 #include "monsterrace-hook.h"
23 #include "monster-status.h"
24 #include "monster-spell.h"
26 #include "realm-hex.h"
27 #include "realm-song.h"
28 #include "object-flavor.h"
29 #include "object-hook.h"
36 #include "player-move.h"
37 #include "player-effects.h"
38 #include "player-skill.h"
39 #include "player-damage.h"
40 #include "player-status.h"
41 #include "player-race.h"
42 #include "player-class.h"
43 #include "player-personality.h"
44 #include "view-mainwindow.h"
46 #include "spells-floor.h"
50 * @brief モンスターの打撃効力テーブル /
51 * The table of monsters' blow effects
53 const mbe_info_type mbe_info[] =
56 { 60, GF_MISSILE, }, /* HURT */
57 { 5, GF_POIS, }, /* POISON */
58 { 20, GF_DISENCHANT, }, /* UN_BONUS */
59 { 15, GF_MISSILE, }, /* UN_POWER */ /* ToDo: Apply the correct effects */
60 { 5, GF_MISSILE, }, /* EAT_GOLD */
61 { 5, GF_MISSILE, }, /* EAT_ITEM */
62 { 5, GF_MISSILE, }, /* EAT_FOOD */
63 { 5, GF_MISSILE, }, /* EAT_LITE */
64 { 0, GF_ACID, }, /* ACID */
65 { 10, GF_ELEC, }, /* ELEC */
66 { 10, GF_FIRE, }, /* FIRE */
67 { 10, GF_COLD, }, /* COLD */
68 { 2, GF_MISSILE, }, /* BLIND */
69 { 10, GF_CONFUSION, }, /* CONFUSE */
70 { 10, GF_MISSILE, }, /* TERRIFY */
71 { 2, GF_MISSILE, }, /* PARALYZE */
72 { 0, GF_MISSILE, }, /* LOSE_STR */
73 { 0, GF_MISSILE, }, /* LOSE_INT */
74 { 0, GF_MISSILE, }, /* LOSE_WIS */
75 { 0, GF_MISSILE, }, /* LOSE_DEX */
76 { 0, GF_MISSILE, }, /* LOSE_CON */
77 { 0, GF_MISSILE, }, /* LOSE_CHR */
78 { 2, GF_MISSILE, }, /* LOSE_ALL */
79 { 60, GF_ROCKET, }, /* SHATTER */
80 { 5, GF_MISSILE, }, /* EXP_10 */
81 { 5, GF_MISSILE, }, /* EXP_20 */
82 { 5, GF_MISSILE, }, /* EXP_40 */
83 { 5, GF_MISSILE, }, /* EXP_80 */
84 { 5, GF_POIS, }, /* DISEASE */
85 { 5, GF_TIME, }, /* TIME */
86 { 5, GF_MISSILE, }, /* EXP_VAMP */
87 { 5, GF_MANA, }, /* DR_MANA */
88 { 60, GF_MISSILE, }, /* SUPERHURT */
92 * @brief 幻覚時の打撃記述テーブル / Weird melee attack types when hallucinating
95 const concptr silly_attacks[MAX_SILLY_ATTACK] =
98 "があなたの回りを3回回ってワンと言った。",
106 "に「神の国」発言の撤回を求められた。",
117 "はあなたの100の秘密について熱く語った。",
129 "に二週間以内でビデオを人に見せないと死ぬ呪いをかけられた。",
131 "はスーパーウルトラギャラクティカマグナムを放った。",
133 "にジェットストリームアタックをかけられた。",
134 "はあなたに卍固めをかけて「1、2、3、ダーッ!」と叫んだ。",
135 "は「いくじなし!ばかばかばか!」といって駆け出した。",
136 "が「ごらん、ルーベンスの絵だよ」と言って静かに目を閉じた。",
137 "は言った。「変愚蛮怒、絶賛公開中!」",
141 * @brief 幻覚時の打撃記述テーブル(フォーマットつき) / Weird melee attack types when hallucinating (%s for strfmt())
143 const concptr silly_attacks2[MAX_SILLY_ATTACK] =
146 "%sの回りを3回回ってワンと言った。",
154 "%sに「神の国」発言の撤回を求めた。",
165 "%sの100の秘密について熱く語った。",
177 "%sに二週間以内でビデオを人に見せないと死ぬ呪いをかけた。",
179 "%sにスーパーウルトラギャラクティカマグナムを放った。",
181 "%sにジェットストリームアタックをかけた。",
182 "%sに卍固めをかけて「1、2、3、ダーッ!」と叫んだ。",
183 "「いくじなし!ばかばかばか!」といって駆け出した。",
184 "「ごらん、ルーベンスの絵だよ」と言って静かに目を閉じた。",
188 const concptr silly_attacks[MAX_SILLY_ATTACK] =
199 "makes obscene gestures at",
230 * @brief マーシャルアーツ打撃テーブル
232 const martial_arts ma_blows[MAX_MA] =
235 { "%sを殴った。", 1, 0, 1, 5, 0 },
236 { "%sを蹴った。", 2, 0, 1, 7, 0 },
237 { "%sに正拳突きをくらわした。", 3, 0, 1, 9, 0 },
238 { "%sに膝蹴りをくらわした。", 5, 5, 2, 4, MA_KNEE },
239 { "%sに肘打ちをくらわした。", 7, 5, 1, 12, 0 },
240 { "%sに体当りした。", 9, 10, 2, 6, 0 },
241 { "%sを蹴った。", 11, 10, 3, 6, MA_SLOW },
242 { "%sにアッパーをくらわした。", 13, 12, 5, 5, 6 },
243 { "%sに二段蹴りをくらわした。", 16, 15, 5, 6, 8 },
244 { "%sに猫爪撃をくらわした。", 20, 20, 5, 8, 0 },
245 { "%sに跳空脚をくらわした。", 24, 25, 6, 8, 10 },
246 { "%sに鷲爪襲をくらわした。", 28, 25, 7, 9, 0 },
247 { "%sに回し蹴りをくらわした。", 32, 30, 8, 10, 10 },
248 { "%sに鉄拳撃をくらわした。", 35, 35, 8, 11, 10 },
249 { "%sに飛空脚をくらわした。", 39, 35, 8, 12, 12 },
250 { "%sに昇龍拳をくらわした。", 43, 35, 9, 12, 16 },
251 { "%sに石破天驚拳をくらわした。", 48, 40, 10, 13, 18 },
253 { "You punch %s.", 1, 0, 1, 4, 0 },
254 { "You kick %s.", 2, 0, 1, 6, 0 },
255 { "You strike %s.", 3, 0, 1, 7, 0 },
256 { "You hit %s with your knee.", 5, 5, 2, 3, MA_KNEE },
257 { "You hit %s with your elbow.", 7, 5, 1, 8, 0 },
258 { "You butt %s.", 9, 10, 2, 5, 0 },
259 { "You kick %s.", 11, 10, 3, 4, MA_SLOW },
260 { "You uppercut %s.", 13, 12, 4, 4, 6 },
261 { "You double-kick %s.", 16, 15, 5, 4, 8 },
262 { "You hit %s with a Cat's Claw.", 20, 20, 5, 5, 0 },
263 { "You hit %s with a jump kick.", 25, 25, 5, 6, 10 },
264 { "You hit %s with an Eagle's Claw.", 29, 25, 6, 6, 0 },
265 { "You hit %s with a circle kick.", 33, 30, 6, 8, 10 },
266 { "You hit %s with an Iron Fist.", 37, 35, 8, 8, 10 },
267 { "You hit %s with a flying kick.", 41, 35, 8, 10, 12 },
268 { "You hit %s with a Dragon Fist.", 45, 35, 10, 10, 16 },
269 { "You hit %s with a Crushing Blow.", 48, 35, 10, 12, 18 },
275 * @brief 修行僧のターンダメージ算出テーブル
277 const int monk_ave_damage[PY_MAX_LEVEL + 1][3] =
334 * Stat Table (STR) -- help index into the "blow" table
336 const byte adj_str_blow[] =
353 20 /* 18/00-18/09 */,
354 30 /* 18/10-18/19 */,
355 40 /* 18/20-18/29 */,
356 50 /* 18/30-18/39 */,
357 60 /* 18/40-18/49 */,
358 70 /* 18/50-18/59 */,
359 80 /* 18/60-18/69 */,
360 90 /* 18/70-18/79 */,
361 100 /* 18/80-18/89 */,
362 110 /* 18/90-18/99 */,
363 120 /* 18/100-18/109 */,
364 130 /* 18/110-18/119 */,
365 140 /* 18/120-18/129 */,
366 150 /* 18/130-18/139 */,
367 160 /* 18/140-18/149 */,
368 170 /* 18/150-18/159 */,
369 180 /* 18/160-18/169 */,
370 190 /* 18/170-18/179 */,
371 200 /* 18/180-18/189 */,
372 210 /* 18/190-18/199 */,
373 220 /* 18/200-18/209 */,
374 230 /* 18/210-18/219 */,
380 * 器用さによる攻撃回数インデックステーブル
381 * Stat Table (DEX) -- index into the "blow" table
383 const byte adj_dex_blow[] =
410 7 /* 18/100-18/109 */,
411 7 /* 18/110-18/119 */,
412 8 /* 18/120-18/129 */,
413 8 /* 18/130-18/139 */,
414 9 /* 18/140-18/149 */,
415 9 /* 18/150-18/159 */,
416 10 /* 18/160-18/169 */,
417 10 /* 18/170-18/179 */,
418 11 /* 18/180-18/189 */,
419 11 /* 18/190-18/199 */,
420 12 /* 18/200-18/209 */,
421 12 /* 18/210-18/219 */,
428 * 腕力、器用さに応じた攻撃回数テーブル /
429 * This table is used to help calculate the number of blows the player can
430 * make in a single round of attacks (one player current_world_ptr->game_turn) with a normal weapon.
433 * This number ranges from a single blow/round for weak players to up to six
434 * blows/round for powerful warriors.
436 * Note that certain artifacts and ego-items give "bonus" blows/round.
438 * First, from the player class, we extract some values:
440 * Warrior num = 6; mul = 5; div = MAX(70, weapon_weight);
441 * Berserker num = 6; mul = 7; div = MAX(70, weapon_weight);
442 * Mage num = 3; mul = 2; div = MAX(100, weapon_weight);
443 * Priest num = 5; mul = 3; div = MAX(100, weapon_weight);
444 * Mindcrafter num = 5; mul = 3; div = MAX(100, weapon_weight);
445 * Rogue num = 5; mul = 3; div = MAX(40, weapon_weight);
446 * Ranger num = 5; mul = 4; div = MAX(70, weapon_weight);
447 * Paladin num = 5; mul = 4; div = MAX(70, weapon_weight);
448 * Weaponsmith num = 5; mul = 5; div = MAX(150, weapon_weight);
449 * Warrior-Mage num = 5; mul = 3; div = MAX(70, weapon_weight);
450 * Chaos Warrior num = 5; mul = 4; div = MAX(70, weapon_weight);
451 * Monk num = 5; mul = 3; div = MAX(60, weapon_weight);
452 * Tourist num = 4; mul = 3; div = MAX(100, weapon_weight);
453 * Imitator num = 5; mul = 4; div = MAX(70, weapon_weight);
454 * Beastmaster num = 5; mul = 3; div = MAX(70, weapon_weight);
455 * Cavalry(Ride) num = 5; mul = 4; div = MAX(70, weapon_weight);
456 * Cavalry(Walk) num = 5; mul = 3; div = MAX(100, weapon_weight);
457 * Sorcerer num = 1; mul = 1; div = MAX(1, weapon_weight);
458 * Archer num = 4; mul = 2; div = MAX(70, weapon_weight);
459 * Magic eater num = 4; mul = 2; div = MAX(70, weapon_weight);
460 * ForceTrainer num = 4; mul = 2; div = MAX(60, weapon_weight);
461 * Mirror Master num = 3; mul = 3; div = MAX(100, weapon_weight);
462 * Ninja num = 4; mul = 1; div = MAX(20, weapon_weight);
464 * To get "P", we look up the relevant "adj_str_blow[]" (see above),
465 * multiply it by "mul", and then divide it by "div".
466 * Increase P by 1 if you wield a weapon two-handed.
467 * Decrease P by 1 if you are a Ninja.
469 * To get "D", we look up the relevant "adj_dex_blow[]" (see above),
471 * The player gets "blows_table[P][D]" blows/round, as shown below,
472 * up to a maximum of "num" blows/round, plus any "bonus" blows/round.
475 const byte blows_table[12][12] =
478 /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11+ */
479 /* 3 10 15 /10 /40 /60 /80 /100 /120 /140 /160 /180 */
480 /* 0 */{ 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4 },
481 /* 1 */{ 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4 },
482 /* 2 */{ 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5 },
483 /* 3 */{ 1, 1, 2, 3, 3, 4, 4, 4, 5, 5, 5, 5 },
484 /* 4 */{ 1, 1, 2, 3, 3, 4, 4, 5, 5, 5, 5, 5 },
485 /* 5 */{ 1, 1, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6 },
486 /* 6 */{ 1, 1, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6 },
487 /* 7 */{ 1, 2, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6 },
488 /* 8 */{ 1, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6 },
489 /* 9 */{ 1, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6 },
490 /* 10*/{ 2, 2, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6 },
491 /*11+*/{ 2, 2, 3, 4, 4, 4, 5, 5, 6, 6, 6, 6 },
495 * @brief プレイヤーからモンスターへの打撃命中判定 /
496 * Determine if the player "hits" a monster (normal combat).
497 * @param chance 基本命中値
499 * @param visible 目標を視界に捕らえているならばTRUEを指定
500 * @return 命中と判定された場合TRUEを返す
501 * @note Always miss 5%, always hit 5%, otherwise random.
503 bool test_hit_norm(HIT_RELIABILITY chance, ARMOUR_CLASS ac, bool visible)
505 if (!visible) chance = (chance + 1) / 2;
506 return hit_chance(chance, ac) >= randint1(100);
510 * @brief モンスターへの命中率の計算
515 PERCENTAGE hit_chance(HIT_RELIABILITY reli, ARMOUR_CLASS ac)
517 PERCENTAGE chance = 5, chance_left = 90;
518 if(reli <= 0) return 5;
519 if(p_ptr->pseikaku == SEIKAKU_NAMAKE) chance_left = (chance_left * 19 + 9) / 20;
520 chance += (100 - ((ac * 75) / reli)) * chance_left / 100;
521 if (chance < 5) chance = 5;
526 * @brief プレイヤー攻撃の種族スレイング倍率計算
527 * @param mult 算出前の基本倍率(/10倍)
528 * @param flgs スレイフラグ配列
529 * @param m_ptr 目標モンスターの構造体参照ポインタ
530 * @return スレイング加味後の倍率(/10倍)
532 static MULTIPLY mult_slaying(MULTIPLY mult, const BIT_FLAGS* flgs, const monster_type* m_ptr)
534 static const struct slay_table_t {
536 BIT_FLAGS affect_race_flag;
539 size_t r_flag_offset;
541 #define OFFSET(X) offsetof(monster_race, X)
542 {TR_SLAY_ANIMAL, RF3_ANIMAL, 25, OFFSET(flags3), OFFSET(r_flags3)},
543 {TR_KILL_ANIMAL, RF3_ANIMAL, 40, OFFSET(flags3), OFFSET(r_flags3)},
544 {TR_SLAY_EVIL, RF3_EVIL, 20, OFFSET(flags3), OFFSET(r_flags3)},
545 {TR_KILL_EVIL, RF3_EVIL, 35, OFFSET(flags3), OFFSET(r_flags3)},
546 {TR_SLAY_GOOD, RF3_GOOD, 20, OFFSET(flags3), OFFSET(r_flags3)},
547 {TR_KILL_GOOD, RF3_GOOD, 35, OFFSET(flags3), OFFSET(r_flags3)},
548 {TR_SLAY_HUMAN, RF2_HUMAN, 25, OFFSET(flags2), OFFSET(r_flags2)},
549 {TR_KILL_HUMAN, RF2_HUMAN, 40, OFFSET(flags2), OFFSET(r_flags2)},
550 {TR_SLAY_UNDEAD, RF3_UNDEAD, 30, OFFSET(flags3), OFFSET(r_flags3)},
551 {TR_KILL_UNDEAD, RF3_UNDEAD, 50, OFFSET(flags3), OFFSET(r_flags3)},
552 {TR_SLAY_DEMON, RF3_DEMON, 30, OFFSET(flags3), OFFSET(r_flags3)},
553 {TR_KILL_DEMON, RF3_DEMON, 50, OFFSET(flags3), OFFSET(r_flags3)},
554 {TR_SLAY_ORC, RF3_ORC, 30, OFFSET(flags3), OFFSET(r_flags3)},
555 {TR_KILL_ORC, RF3_ORC, 50, OFFSET(flags3), OFFSET(r_flags3)},
556 {TR_SLAY_TROLL, RF3_TROLL, 30, OFFSET(flags3), OFFSET(r_flags3)},
557 {TR_KILL_TROLL, RF3_TROLL, 50, OFFSET(flags3), OFFSET(r_flags3)},
558 {TR_SLAY_GIANT, RF3_GIANT, 30, OFFSET(flags3), OFFSET(r_flags3)},
559 {TR_KILL_GIANT, RF3_GIANT, 50, OFFSET(flags3), OFFSET(r_flags3)},
560 {TR_SLAY_DRAGON, RF3_DRAGON, 30, OFFSET(flags3), OFFSET(r_flags3)},
561 {TR_KILL_DRAGON, RF3_DRAGON, 50, OFFSET(flags3), OFFSET(r_flags3)},
565 monster_race* r_ptr = &r_info[m_ptr->r_idx];
567 for (i = 0; i < sizeof(slay_table) / sizeof(slay_table[0]); ++i)
569 const struct slay_table_t* p = &slay_table[i];
571 if ((have_flag(flgs, p->slay_flag)) &&
572 (atoffset(BIT_FLAGS, r_ptr, p->flag_offset) & p->affect_race_flag))
574 if (is_original_ap_and_seen(m_ptr))
576 atoffset(BIT_FLAGS, r_ptr, p->r_flag_offset) |= p->affect_race_flag;
579 mult = MAX(mult, p->slay_mult);
587 * @brief プレイヤー攻撃の属性スレイング倍率計算
588 * @param mult 算出前の基本倍率(/10倍)
589 * @param flgs スレイフラグ配列
590 * @param m_ptr 目標モンスターの構造体参照ポインタ
591 * @return スレイング加味後の倍率(/10倍)
593 static MULTIPLY mult_brand(MULTIPLY mult, const BIT_FLAGS* flgs, const monster_type* m_ptr)
595 static const struct brand_table_t {
597 BIT_FLAGS resist_mask;
600 {TR_BRAND_ACID, RFR_EFF_IM_ACID_MASK, 0U },
601 {TR_BRAND_ELEC, RFR_EFF_IM_ELEC_MASK, 0U },
602 {TR_BRAND_FIRE, RFR_EFF_IM_FIRE_MASK, RF3_HURT_FIRE},
603 {TR_BRAND_COLD, RFR_EFF_IM_COLD_MASK, RF3_HURT_COLD},
604 {TR_BRAND_POIS, RFR_EFF_IM_POIS_MASK, 0U },
607 monster_race* r_ptr = &r_info[m_ptr->r_idx];
609 for (i = 0; i < sizeof(brand_table) / sizeof(brand_table[0]); ++i)
611 const struct brand_table_t* p = &brand_table[i];
613 if (have_flag(flgs, p->brand_flag))
615 /* Notice immunity */
616 if (r_ptr->flagsr & p->resist_mask)
618 if (is_original_ap_and_seen(m_ptr))
620 r_ptr->r_flagsr |= (r_ptr->flagsr & p->resist_mask);
624 /* Otherwise, take the damage */
625 else if (r_ptr->flags3 & p->hurt_flag)
627 if (is_original_ap_and_seen(m_ptr))
629 r_ptr->r_flags3 |= p->hurt_flag;
632 mult = MAX(mult, 50);
636 mult = MAX(mult, 25);
645 * @brief 剣術のスレイ倍率計算を行う /
646 * Calcurate magnification of hissatsu technics
647 * @param mult 剣術のスレイ効果以前に算出している多要素の倍率(/10倍)
648 * @param flgs 剣術に使用する武器のスレイフラグ配列
649 * @param m_ptr 目標となるモンスターの構造体参照ポインタ
650 * @param mode 剣術のスレイ型ID
651 * @return スレイの倍率(/10倍)
653 static MULTIPLY mult_hissatsu(MULTIPLY mult, BIT_FLAGS *flgs, monster_type *m_ptr, BIT_FLAGS mode)
655 monster_race *r_ptr = &r_info[m_ptr->r_idx];
657 /* Burning Strike (Fire) */
658 if (mode == HISSATSU_FIRE)
660 /* Notice immunity */
661 if (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK)
663 if (is_original_ap_and_seen(m_ptr))
665 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
669 /* Otherwise, take the damage */
670 else if (have_flag(flgs, TR_BRAND_FIRE))
672 if (r_ptr->flags3 & RF3_HURT_FIRE)
674 if (mult < 70) mult = 70;
675 if (is_original_ap_and_seen(m_ptr))
677 r_ptr->r_flags3 |= RF3_HURT_FIRE;
680 else if (mult < 35) mult = 35;
684 if (r_ptr->flags3 & RF3_HURT_FIRE)
686 if (mult < 50) mult = 50;
687 if (is_original_ap_and_seen(m_ptr))
689 r_ptr->r_flags3 |= RF3_HURT_FIRE;
692 else if (mult < 25) mult = 25;
696 /* Serpent's Tongue (Poison) */
697 if (mode == HISSATSU_POISON)
699 /* Notice immunity */
700 if (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK)
702 if (is_original_ap_and_seen(m_ptr))
704 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK);
708 /* Otherwise, take the damage */
709 else if (have_flag(flgs, TR_BRAND_POIS))
711 if (mult < 35) mult = 35;
715 if (mult < 25) mult = 25;
719 /* Zammaken (Nonliving Evil) */
720 if (mode == HISSATSU_ZANMA)
722 if (!monster_living(m_ptr->r_idx) && (r_ptr->flags3 & RF3_EVIL))
724 if (mult < 15) mult = 25;
725 else if (mult < 50) mult = MIN(50, mult + 20);
729 /* Rock Smash (Hurt Rock) */
730 if (mode == HISSATSU_HAGAN)
732 if (r_ptr->flags3 & RF3_HURT_ROCK)
734 if (is_original_ap_and_seen(m_ptr))
736 r_ptr->r_flags3 |= RF3_HURT_ROCK;
738 if (mult == 10) mult = 40;
739 else if (mult < 60) mult = 60;
743 /* Midare-Setsugekka (Cold) */
744 if (mode == HISSATSU_COLD)
746 /* Notice immunity */
747 if (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK)
749 if (is_original_ap_and_seen(m_ptr))
751 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
754 /* Otherwise, take the damage */
755 else if (have_flag(flgs, TR_BRAND_COLD))
757 if (r_ptr->flags3 & RF3_HURT_COLD)
759 if (mult < 70) mult = 70;
760 if (is_original_ap_and_seen(m_ptr))
762 r_ptr->r_flags3 |= RF3_HURT_COLD;
765 else if (mult < 35) mult = 35;
769 if (r_ptr->flags3 & RF3_HURT_COLD)
771 if (mult < 50) mult = 50;
772 if (is_original_ap_and_seen(m_ptr))
774 r_ptr->r_flags3 |= RF3_HURT_COLD;
777 else if (mult < 25) mult = 25;
781 /* Lightning Eagle (Elec) */
782 if (mode == HISSATSU_ELEC)
784 /* Notice immunity */
785 if (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK)
787 if (is_original_ap_and_seen(m_ptr))
789 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
793 /* Otherwise, take the damage */
794 else if (have_flag(flgs, TR_BRAND_ELEC))
796 if (mult < 70) mult = 70;
800 if (mult < 50) mult = 50;
804 /* Bloody Maelstrom */
805 if ((mode == HISSATSU_SEKIRYUKA) && p_ptr->cut && monster_living(m_ptr->r_idx))
807 MULTIPLY tmp = MIN(100, MAX(10, p_ptr->cut / 10));
808 if (mult < tmp) mult = tmp;
812 if (mode == HISSATSU_UNDEAD)
814 if (r_ptr->flags3 & RF3_UNDEAD)
816 if (is_original_ap_and_seen(m_ptr))
818 r_ptr->r_flags3 |= RF3_UNDEAD;
820 if (mult == 10) mult = 70;
821 else if (mult < 140) mult = MIN(140, mult + 60);
823 if (mult == 10) mult = 40;
824 else if (mult < 60) mult = MIN(60, mult + 30);
827 if (mult > 150) mult = 150;
833 * @brief ダメージにスレイ要素を加える総合処理ルーチン /
834 * Extract the "total damage" from a given object hitting a given monster.
835 * @param o_ptr 使用武器オブジェクトの構造体参照ポインタ
836 * @param tdam 現在算出途中のダメージ値
837 * @param m_ptr 目標モンスターの構造体参照ポインタ
839 * @param thrown 投擲処理ならばTRUEを指定する
840 * @return 総合的なスレイを加味したダメージ値
842 * Note that "flasks of oil" do NOT do fire damage, although they\n
843 * certainly could be made to do so. XXX XXX\n
845 * Note that most brands and slays are x3, except Slay Animal (x2),\n
846 * Slay Evil (x2), and Kill dragon (x5).\n
848 HIT_POINT tot_dam_aux(object_type *o_ptr, HIT_POINT tdam, monster_type *m_ptr, BIT_FLAGS mode, bool thrown)
852 BIT_FLAGS flgs[TR_FLAG_SIZE];
853 object_flags(o_ptr, flgs);
854 torch_flags(o_ptr, flgs); /* torches has secret flags */
858 if (p_ptr->special_attack & (ATTACK_ACID)) add_flag(flgs, TR_BRAND_ACID);
859 if (p_ptr->special_attack & (ATTACK_COLD)) add_flag(flgs, TR_BRAND_COLD);
860 if (p_ptr->special_attack & (ATTACK_ELEC)) add_flag(flgs, TR_BRAND_ELEC);
861 if (p_ptr->special_attack & (ATTACK_FIRE)) add_flag(flgs, TR_BRAND_FIRE);
862 if (p_ptr->special_attack & (ATTACK_POIS)) add_flag(flgs, TR_BRAND_POIS);
865 if (hex_spelling(HEX_RUNESWORD)) add_flag(flgs, TR_SLAY_GOOD);
878 mult = mult_slaying(mult, flgs, m_ptr);
880 mult = mult_brand(mult, flgs, m_ptr);
882 if (p_ptr->pclass == CLASS_SAMURAI)
884 mult = mult_hissatsu(mult, flgs, m_ptr, mode);
887 if ((p_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs, TR_FORCE_WEAPON)) && (p_ptr->csp > (o_ptr->dd * o_ptr->ds / 5)))
889 p_ptr->csp -= (1 + (o_ptr->dd * o_ptr->ds / 5));
890 p_ptr->redraw |= (PR_MANA);
891 mult = mult * 3 / 2 + 20;
894 if ((o_ptr->name1 == ART_NOTHUNG) && (m_ptr->r_idx == MON_FAFNER))
899 if (mult > 150) mult = 150;
901 return (tdam * mult / 10);
905 * @brief プレイヤーからモンスターへの打撃クリティカル判定 /
906 * Critical hits (by player) Factor in weapon weight, total plusses, player melee bonus
907 * @param weight 矢弾の重量
908 * @param plus 武器の命中修正
909 * @param dam 現在算出中のダメージ値
910 * @param meichuu 打撃の基本命中力
911 * @param mode オプションフラグ
912 * @return クリティカル修正が入ったダメージ値
914 HIT_POINT critical_norm(WEIGHT weight, int plus, HIT_POINT dam, s16b meichuu, BIT_FLAGS mode)
918 /* Extract "blow" power */
919 i = (weight + (meichuu * 3 + plus * 5) + p_ptr->skill_thn);
922 if ((randint1((p_ptr->pclass == CLASS_NINJA) ? 4444 : 5000) <= i) || (mode == HISSATSU_MAJIN) || (mode == HISSATSU_3DAN))
924 k = weight + randint1(650);
925 if ((mode == HISSATSU_MAJIN) || (mode == HISSATSU_3DAN)) k += randint1(650);
929 msg_print(_("手ごたえがあった!", "It was a good hit!"));
935 msg_print(_("かなりの手ごたえがあった!", "It was a great hit!"));
940 msg_print(_("会心の一撃だ!", "It was a superb hit!"));
945 msg_print(_("最高の会心の一撃だ!", "It was a *GREAT* hit!"));
950 msg_print(_("比類なき最高の会心の一撃だ!", "It was a *SUPERB* hit!"));
951 dam = ((7 * dam) / 2) + 25;
959 * @brief モンスター打撃のクリティカルランクを返す /
960 * Critical blow. All hits that do 95% of total possible damage,
961 * @param dice モンスター打撃のダイス数
962 * @param sides モンスター打撃の最大ダイス目
963 * @param dam プレイヤーに与えたダメージ
965 * and which also do at least 20 damage, or, sometimes, N damage.
966 * This is used only to determine "cuts" and "stuns".
968 static int monster_critical(DICE_NUMBER dice, DICE_SID sides, HIT_POINT dam)
971 int total = dice * sides;
973 /* Must do at least 95% of perfect */
974 if (dam < total * 19 / 20) return (0);
976 /* Weak blows rarely work */
977 if ((dam < 20) && (randint0(100) >= dam)) return (0);
980 if ((dam >= total) && (dam >= 40)) max++;
985 while (randint0(100) < 2) max++;
988 /* Critical damage */
989 if (dam > 45) return (6 + max);
990 if (dam > 33) return (5 + max);
991 if (dam > 25) return (4 + max);
992 if (dam > 18) return (3 + max);
993 if (dam > 11) return (2 + max);
998 * @brief モンスター打撃の命中を判定する /
999 * Determine if a monster attack against the player succeeds.
1000 * @param power 打撃属性毎の基本命中値
1001 * @param level モンスターのレベル
1002 * @param stun モンスターの朦朧値
1003 * @return TRUEならば命中判定
1005 * Always miss 5% of the time, Always hit 5% of the time.
1006 * Otherwise, match monster power against player armor.
1008 static int check_hit(int power, DEPTH level, int stun)
1012 /* Percentile dice */
1015 if (stun && one_in_(2)) return FALSE;
1017 /* Hack -- Always miss or hit */
1018 if (k < 10) return (k < 5);
1020 /* Calculate the "attack quality" */
1021 i = (power + (level * 3));
1024 ac = p_ptr->ac + p_ptr->to_a;
1025 if (p_ptr->special_attack & ATTACK_SUIKEN) ac += (p_ptr->lev * 2);
1027 /* Power and Level compete against Armor */
1028 if ((i > 0) && (randint1(i) > ((ac * 3) / 4))) return (TRUE);
1034 /*! モンスターの侮辱行為メッセージテーブル / Hack -- possible "insult" messages */
1035 static concptr desc_insult[] =
1046 "があなたをパラサイト呼ばわりした!",
1050 "insults your mother!",
1051 "gives you the finger!",
1054 "dances around you!",
1055 "makes obscene gestures!",
1057 "calls you a parasite!",
1058 "calls you a cyborg!"
1063 /*! マゴットのぼやきメッセージテーブル / Hack -- possible "insult" messages */
1064 static concptr desc_moan[] =
1068 "が彼の飼い犬を見なかったかと尋ねている。",
1069 "が縄張りから出て行けと言っている。",
1072 "seems sad about something.",
1073 "asks if you have seen his dogs.",
1074 "tells you to get off his land.",
1075 "mumbles something about mushrooms."
1081 * @brief 敵オーラによるプレイヤーのダメージ処理(補助)
1082 * @param m_ptr オーラを持つモンスターの構造体参照ポインタ
1083 * @param immune ダメージを回避できる免疫フラグ
1084 * @param flags_offset オーラフラグ配列の参照オフセット
1085 * @param r_flags_offset モンスターの耐性配列の参照オフセット
1086 * @param aura_flag オーラフラグ配列
1087 * @param dam_func ダメージ処理を行う関数の参照ポインタ
1088 * @param message オーラダメージを受けた際のメッセージ
1091 static void touch_zap_player_aux(monster_type *m_ptr, bool immune, int flags_offset, int r_flags_offset, u32b aura_flag,
1092 HIT_POINT(*dam_func)(HIT_POINT dam, concptr kb_str, int monspell, bool aura), concptr message)
1094 monster_race *r_ptr = &r_info[m_ptr->r_idx];
1096 if ((atoffset(BIT_FLAGS, r_ptr, flags_offset) & aura_flag) && !immune)
1098 GAME_TEXT mon_name[MAX_NLEN];
1099 int aura_damage = damroll(1 + (r_ptr->level / 26), 1 + (r_ptr->level / 17));
1101 monster_desc(mon_name, m_ptr, MD_WRONGDOER_NAME);
1103 dam_func(aura_damage, mon_name, -1, TRUE);
1105 if (is_original_ap_and_seen(m_ptr))
1107 atoffset(BIT_FLAGS, r_ptr, r_flags_offset) |= aura_flag;
1115 * @brief 敵オーラによるプレイヤーのダメージ処理(メイン)
1116 * @param m_ptr オーラを持つモンスターの構造体参照ポインタ
1119 static void touch_zap_player(monster_type *m_ptr)
1121 touch_zap_player_aux(m_ptr, p_ptr->immune_fire, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_FIRE,
1122 fire_dam, _("突然とても熱くなった!", "You are suddenly very hot!"));
1123 touch_zap_player_aux(m_ptr, p_ptr->immune_cold, offsetof(monster_race, flags3), offsetof(monster_race, r_flags3), RF3_AURA_COLD,
1124 cold_dam, _("突然とても寒くなった!", "You are suddenly very cold!"));
1125 touch_zap_player_aux(m_ptr, p_ptr->immune_elec, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_ELEC,
1126 elec_dam, _("電撃をくらった!", "You get zapped!"));
1130 * @brief プレイヤーの変異要素による打撃処理
1131 * @param m_idx 攻撃目標となったモンスターの参照ID
1132 * @param attack 変異要素による攻撃要素の種類
1133 * @param fear 攻撃を受けたモンスターが恐慌状態に陥ったかを返す参照ポインタ
1134 * @param mdeath 攻撃を受けたモンスターが死亡したかを返す参照ポインタ
1137 static void natural_attack(MONSTER_IDX m_idx, int attack, bool *fear, bool *mdeath)
1141 WEIGHT n_weight = 0;
1142 monster_type *m_ptr = ¤t_floor_ptr->m_list[m_idx];
1143 monster_race *r_ptr = &r_info[m_ptr->r_idx];
1144 GAME_TEXT m_name[MAX_NLEN];
1146 int dice_num, dice_side;
1152 case MUT2_SCOR_TAIL:
1156 atk_desc = _("尻尾", "tail");
1163 atk_desc = _("角", "horns");
1170 atk_desc = _("クチバシ", "beak");
1177 atk_desc = _("象の鼻", "trunk");
1180 case MUT2_TENTACLES:
1184 atk_desc = _("触手", "tentacles");
1188 dice_num = dice_side = n_weight = 1;
1189 atk_desc = _("未定義の部位", "undefined body part");
1193 monster_desc(m_name, m_ptr, 0);
1195 /* Calculate the "attack quality" */
1196 bonus = p_ptr->to_h_m + (p_ptr->lev * 6 / 5);
1197 chance = (p_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
1200 if ((!(r_ptr->flags2 & RF2_QUANTUM) || !randint0(2)) && test_hit_norm(chance, r_ptr->ac, m_ptr->ml))
1203 msg_format(_("%sを%sで攻撃した。", "You hit %s with your %s."), m_name, atk_desc);
1205 k = damroll(dice_num, dice_side);
1206 k = critical_norm(n_weight, bonus, k, (s16b)bonus, 0);
1208 /* Apply the player damage bonuses */
1211 /* No negative damage */
1214 /* Modify the damage */
1215 k = mon_damage_mod(m_ptr, k, FALSE);
1217 /* Complex message */
1218 msg_format_wizard(CHEAT_MONSTER,
1219 _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"),
1220 k, m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
1222 /* Anger the monster */
1223 if (k > 0) anger_monster(m_ptr);
1225 /* Damage, check for fear and mdeath */
1228 case MUT2_SCOR_TAIL:
1229 project(0, 0, m_ptr->fy, m_ptr->fx, k, GF_POIS, PROJECT_KILL, -1);
1230 *mdeath = (m_ptr->r_idx == 0);
1233 *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1236 *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1239 *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1241 case MUT2_TENTACLES:
1242 *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1245 *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1248 touch_zap_player(m_ptr);
1254 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
1259 * @brief プレイヤーの打撃処理サブルーチン /
1260 * Player attacks a (poor, defenseless) creature -RAK-
1263 * @param fear 攻撃を受けたモンスターが恐慌状態に陥ったかを返す参照ポインタ
1264 * @param mdeath 攻撃を受けたモンスターが死亡したかを返す参照ポインタ
1265 * @param hand 攻撃を行うための武器を持つ手
1266 * @param mode 発動中の剣術ID
1269 * If no "weapon" is available, then "punch" the monster one time.
1271 static void py_attack_aux(POSITION y, POSITION x, bool *fear, bool *mdeath, s16b hand, COMBAT_OPTION_IDX mode)
1273 int num = 0, bonus, chance, vir;
1276 grid_type *g_ptr = ¤t_floor_ptr->grid_array[y][x];
1278 monster_type *m_ptr = ¤t_floor_ptr->m_list[g_ptr->m_idx];
1279 monster_race *r_ptr = &r_info[m_ptr->r_idx];
1281 /* Access the weapon */
1282 object_type *o_ptr = &p_ptr->inventory_list[INVEN_RARM + hand];
1284 GAME_TEXT m_name[MAX_NLEN];
1286 bool success_hit = FALSE;
1287 bool backstab = FALSE;
1288 bool vorpal_cut = FALSE;
1289 int chaos_effect = 0;
1290 bool stab_fleeing = FALSE;
1291 bool fuiuchi = FALSE;
1292 bool monk_attack = FALSE;
1293 bool do_quake = FALSE;
1295 bool drain_msg = TRUE;
1296 int drain_result = 0, drain_heal = 0;
1297 bool can_drain = FALSE;
1299 int drain_left = MAX_VAMPIRIC_DRAIN;
1300 BIT_FLAGS flgs[TR_FLAG_SIZE]; /* A massive hack -- life-draining weapons */
1301 bool is_human = (r_ptr->d_char == 'p');
1302 bool is_lowlevel = (r_ptr->level < (p_ptr->lev - 15));
1303 bool zantetsu_mukou, e_j_mukou;
1305 switch (p_ptr->pclass)
1309 if (has_melee_weapon(INVEN_RARM + hand) && !p_ptr->icky_wield[hand])
1311 int tmp = p_ptr->lev * 6 + (p_ptr->skill_stl + 10) * 4;
1312 if (p_ptr->monlite && (mode != HISSATSU_NYUSIN)) tmp /= 3;
1313 if (p_ptr->cursed & TRC_AGGRAVATE) tmp /= 2;
1314 if (r_ptr->level > (p_ptr->lev * p_ptr->lev / 20 + 10)) tmp /= 3;
1315 if (MON_CSLEEP(m_ptr) && m_ptr->ml)
1317 /* Can't backstab creatures that we can't see, right? */
1320 else if ((p_ptr->special_defense & NINJA_S_STEALTH) && (randint0(tmp) > (r_ptr->level + 20)) && m_ptr->ml && !(r_ptr->flagsr & RFR_RES_ALL))
1324 else if (MON_MONFEAR(m_ptr) && m_ptr->ml)
1326 stab_fleeing = TRUE;
1332 case CLASS_FORCETRAINER:
1333 case CLASS_BERSERKER:
1334 if ((empty_hands(TRUE) & EMPTY_HAND_RARM) && !p_ptr->riding) monk_attack = TRUE;
1338 if (!o_ptr->k_idx) /* Empty hand */
1340 if ((r_ptr->level + 10) > p_ptr->lev)
1342 if (p_ptr->skill_exp[GINOU_SUDE] < s_info[p_ptr->pclass].s_max[GINOU_SUDE])
1344 if (p_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_BEGINNER)
1345 p_ptr->skill_exp[GINOU_SUDE] += 40;
1346 else if ((p_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_SKILLED))
1347 p_ptr->skill_exp[GINOU_SUDE] += 5;
1348 else if ((p_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_EXPERT) && (p_ptr->lev > 19))
1349 p_ptr->skill_exp[GINOU_SUDE] += 1;
1350 else if ((p_ptr->lev > 34))
1351 if (one_in_(3)) p_ptr->skill_exp[GINOU_SUDE] += 1;
1352 p_ptr->update |= (PU_BONUS);
1356 else if (object_is_melee_weapon(o_ptr))
1358 if ((r_ptr->level + 10) > p_ptr->lev)
1360 OBJECT_TYPE_VALUE tval = p_ptr->inventory_list[INVEN_RARM + hand].tval - TV_WEAPON_BEGIN;
1361 OBJECT_SUBTYPE_VALUE sval = p_ptr->inventory_list[INVEN_RARM + hand].sval;
1362 int now_exp = p_ptr->weapon_exp[tval][sval];
1363 if (now_exp < s_info[p_ptr->pclass].w_max[tval][sval])
1366 if (now_exp < WEAPON_EXP_BEGINNER) amount = 80;
1367 else if (now_exp < WEAPON_EXP_SKILLED) amount = 10;
1368 else if ((now_exp < WEAPON_EXP_EXPERT) && (p_ptr->lev > 19)) amount = 1;
1369 else if ((p_ptr->lev > 34) && one_in_(2)) amount = 1;
1370 p_ptr->weapon_exp[tval][sval] += amount;
1371 p_ptr->update |= (PU_BONUS);
1376 /* Disturb the monster */
1377 (void)set_monster_csleep(g_ptr->m_idx, 0);
1379 monster_desc(m_name, m_ptr, 0);
1381 /* Calculate the "attack quality" */
1382 bonus = p_ptr->to_h[hand] + o_ptr->to_h;
1383 chance = (p_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
1384 if (mode == HISSATSU_IAI) chance += 60;
1385 if (p_ptr->special_defense & KATA_KOUKIJIN) chance += 150;
1386 if (p_ptr->sutemi) chance = MAX(chance * 3 / 2, chance + 60);
1388 vir = virtue_number(V_VALOUR);
1391 chance += (p_ptr->virtues[vir - 1] / 10);
1394 zantetsu_mukou = ((o_ptr->name1 == ART_ZANTETSU) && (r_ptr->d_char == 'j'));
1395 e_j_mukou = ((o_ptr->name1 == ART_EXCALIBUR_J) && (r_ptr->d_char == 'S'));
1397 if ((mode == HISSATSU_KYUSHO) || (mode == HISSATSU_MINEUCHI) || (mode == HISSATSU_3DAN) || (mode == HISSATSU_IAI)) num_blow = 1;
1398 else if (mode == HISSATSU_COLD) num_blow = p_ptr->num_blow[hand] + 2;
1399 else num_blow = p_ptr->num_blow[hand];
1401 /* Hack -- DOKUBARI always hit once */
1402 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) num_blow = 1;
1404 /* Attack once for each legal blow */
1405 while ((num++ < num_blow) && !p_ptr->is_dead)
1407 if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) || (mode == HISSATSU_KYUSHO))
1411 if (p_ptr->migite && p_ptr->hidarite)
1415 if (mode == HISSATSU_3DAN)
1420 success_hit = one_in_(n);
1422 else if ((p_ptr->pclass == CLASS_NINJA) && ((backstab || fuiuchi) && !(r_ptr->flagsr & RFR_RES_ALL))) success_hit = TRUE;
1423 else success_hit = test_hit_norm(chance, r_ptr->ac, m_ptr->ml);
1425 if (mode == HISSATSU_MAJIN)
1428 success_hit = FALSE;
1434 int vorpal_chance = ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD)) ? 2 : 4;
1438 if (backstab) msg_format(_("あなたは冷酷にも眠っている無力な%sを突き刺した!", "You cruelly stab the helpless, sleeping %s!"), m_name);
1439 else if (fuiuchi) msg_format(_("不意を突いて%sに強烈な一撃を喰らわせた!", "You make surprise attack, and hit %s with a powerful blow!"), m_name);
1440 else if (stab_fleeing) msg_format(_("逃げる%sを背中から突き刺した!", "You backstab the fleeing %s!"), m_name);
1441 else if (!monk_attack) msg_format(_("%sを攻撃した。", "You hit %s."), m_name);
1443 /* Hack -- bare hands do one damage */
1446 object_flags(o_ptr, flgs);
1448 /* Select a chaotic effect (50% chance) */
1449 if ((have_flag(flgs, TR_CHAOTIC)) && one_in_(2))
1452 chg_virtue(V_CHANCE, 1);
1454 if (randint1(5) < 3)
1456 /* Vampiric (20%) */
1459 else if (one_in_(250))
1464 else if (!one_in_(10))
1466 /* Confusion (26.892%) */
1469 else if (one_in_(2))
1471 /* Teleport away (1.494%) */
1476 /* Polymorph (1.494%) */
1481 /* Vampiric drain */
1482 if ((have_flag(flgs, TR_VAMPIRIC)) || (chaos_effect == 1) || (mode == HISSATSU_DRAIN) || hex_spelling(HEX_VAMP_BLADE))
1484 /* Only drain "living" monsters */
1485 if (monster_living(m_ptr->r_idx))
1491 if ((have_flag(flgs, TR_VORPAL) || hex_spelling(HEX_RUNESWORD)) && (randint1(vorpal_chance * 3 / 2) == 1) && !zantetsu_mukou)
1493 else vorpal_cut = FALSE;
1497 int special_effect = 0, stun_effect = 0, times = 0, max_times;
1499 const martial_arts *ma_ptr = &ma_blows[0], *old_ptr = &ma_blows[0];
1500 int resist_stun = 0;
1503 if (r_ptr->flags1 & RF1_UNIQUE) resist_stun += 88;
1504 if (r_ptr->flags3 & RF3_NO_STUN) resist_stun += 66;
1505 if (r_ptr->flags3 & RF3_NO_CONF) resist_stun += 33;
1506 if (r_ptr->flags3 & RF3_NO_SLEEP) resist_stun += 33;
1507 if ((r_ptr->flags3 & RF3_UNDEAD) || (r_ptr->flags3 & RF3_NONLIVING))
1510 if (p_ptr->special_defense & KAMAE_BYAKKO)
1511 max_times = (p_ptr->lev < 3 ? 1 : p_ptr->lev / 3);
1512 else if (p_ptr->special_defense & KAMAE_SUZAKU)
1514 else if (p_ptr->special_defense & KAMAE_GENBU)
1517 max_times = (p_ptr->lev < 7 ? 1 : p_ptr->lev / 7);
1518 /* Attempt 'times' */
1519 for (times = 0; times < max_times; times++)
1523 ma_ptr = &ma_blows[randint0(MAX_MA)];
1524 if ((p_ptr->pclass == CLASS_FORCETRAINER) && (ma_ptr->min_level > 1)) min_level = ma_ptr->min_level + 3;
1525 else min_level = ma_ptr->min_level;
1526 } while ((min_level > p_ptr->lev) ||
1527 (randint1(p_ptr->lev) < ma_ptr->chance));
1529 /* keep the highest level attack available we found */
1530 if ((ma_ptr->min_level > old_ptr->min_level) &&
1531 !p_ptr->stun && !p_ptr->confused)
1535 if (p_ptr->wizard && cheat_xtra)
1537 msg_print(_("攻撃を再選択しました。", "Attack re-selected."));
1546 if (p_ptr->pclass == CLASS_FORCETRAINER) min_level = MAX(1, ma_ptr->min_level - 3);
1547 else min_level = ma_ptr->min_level;
1548 k = damroll(ma_ptr->dd + p_ptr->to_dd[hand], ma_ptr->ds + p_ptr->to_ds[hand]);
1549 if (p_ptr->special_attack & ATTACK_SUIKEN) k *= 2;
1551 if (ma_ptr->effect == MA_KNEE)
1553 if (r_ptr->flags1 & RF1_MALE)
1555 msg_format(_("%sに金的膝蹴りをくらわした!", "You hit %s in the groin with your knee!"), m_name);
1557 special_effect = MA_KNEE;
1560 msg_format(ma_ptr->desc, m_name);
1563 else if (ma_ptr->effect == MA_SLOW)
1565 if (!((r_ptr->flags1 & RF1_NEVER_MOVE) ||
1566 my_strchr("~#{}.UjmeEv$,DdsbBFIJQSXclnw!=?", r_ptr->d_char)))
1568 msg_format(_("%sの足首に関節蹴りをくらわした!", "You kick %s in the ankle."), m_name);
1569 special_effect = MA_SLOW;
1571 else msg_format(ma_ptr->desc, m_name);
1577 stun_effect = (ma_ptr->effect / 2) + randint1(ma_ptr->effect / 2);
1580 msg_format(ma_ptr->desc, m_name);
1583 if (p_ptr->special_defense & KAMAE_SUZAKU) weight = 4;
1584 if ((p_ptr->pclass == CLASS_FORCETRAINER) && P_PTR_KI)
1586 weight += (P_PTR_KI / 30);
1587 if (weight > 20) weight = 20;
1590 k = critical_norm(p_ptr->lev * weight, min_level, k, p_ptr->to_h[0], 0);
1592 if ((special_effect == MA_KNEE) && ((k + p_ptr->to_d[hand]) < m_ptr->hp))
1594 msg_format(_("%^sは苦痛にうめいている!", "%^s moans in agony!"), m_name);
1595 stun_effect = 7 + randint1(13);
1599 else if ((special_effect == MA_SLOW) && ((k + p_ptr->to_d[hand]) < m_ptr->hp))
1601 if (!(r_ptr->flags1 & RF1_UNIQUE) &&
1602 (randint1(p_ptr->lev) > r_ptr->level) &&
1605 msg_format(_("%^sは足をひきずり始めた。", "%^s starts limping slower."), m_name);
1606 m_ptr->mspeed -= 10;
1610 if (stun_effect && ((k + p_ptr->to_d[hand]) < m_ptr->hp))
1612 if (p_ptr->lev > randint1(r_ptr->level + resist_stun + 10))
1614 if (set_monster_stunned(g_ptr->m_idx, stun_effect + MON_STUNNED(m_ptr)))
1616 msg_format(_("%^sはフラフラになった。", "%^s is stunned."), m_name);
1620 msg_format(_("%^sはさらにフラフラになった。", "%^s is more stunned."), m_name);
1626 /* Handle normal weapon */
1627 else if (o_ptr->k_idx)
1629 k = damroll(o_ptr->dd + p_ptr->to_dd[hand], o_ptr->ds + p_ptr->to_ds[hand]);
1630 k = tot_dam_aux(o_ptr, k, m_ptr, mode, FALSE);
1634 k *= (3 + (p_ptr->lev / 20));
1638 k = k*(5 + (p_ptr->lev * 2 / 25)) / 2;
1640 else if (stab_fleeing)
1645 if ((p_ptr->impact[hand] && ((k > 50) || one_in_(7))) ||
1646 (chaos_effect == 2) || (mode == HISSATSU_QUAKE))
1651 if ((!(o_ptr->tval == TV_SWORD) || !(o_ptr->sval == SV_DOKUBARI)) && !(mode == HISSATSU_KYUSHO))
1652 k = critical_norm(o_ptr->weight, o_ptr->to_h, k, p_ptr->to_h[hand], mode);
1660 if ((o_ptr->name1 == ART_CHAINSWORD) && !one_in_(2))
1662 char chainsword_noise[1024];
1663 if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, chainsword_noise))
1665 msg_print(chainsword_noise);
1669 if (o_ptr->name1 == ART_VORPAL_BLADE)
1671 msg_print(_("目にも止まらぬヴォーパルブレード、手錬の早業!", "Your Vorpal Blade goes snicker-snack!"));
1675 msg_format(_("%sをグッサリ切り裂いた!", "Your weapon cuts deep into %s!"), m_name);
1678 /* Try to increase the damage */
1679 while (one_in_(vorpal_chance))
1684 k *= (HIT_POINT)mult;
1687 if (((r_ptr->flagsr & RFR_RES_ALL) ? k / 100 : k) > m_ptr->hp)
1689 msg_format(_("%sを真っ二つにした!", "You cut %s in half!"), m_name);
1695 case 2: msg_format(_("%sを斬った!", "You gouge %s!"), m_name); break;
1696 case 3: msg_format(_("%sをぶった斬った!", "You maim %s!"), m_name); break;
1697 case 4: msg_format(_("%sをメッタ斬りにした!", "You carve %s!"), m_name); break;
1698 case 5: msg_format(_("%sをメッタメタに斬った!", "You cleave %s!"), m_name); break;
1699 case 6: msg_format(_("%sを刺身にした!", "You smite %s!"), m_name); break;
1700 case 7: msg_format(_("%sを斬って斬って斬りまくった!", "You eviscerate %s!"), m_name); break;
1701 default: msg_format(_("%sを細切れにした!", "You shred %s!"), m_name); break;
1704 drain_result = drain_result * 3 / 2;
1708 drain_result += o_ptr->to_d;
1711 /* Apply the player damage bonuses */
1712 k += p_ptr->to_d[hand];
1713 drain_result += p_ptr->to_d[hand];
1715 if ((mode == HISSATSU_SUTEMI) || (mode == HISSATSU_3DAN)) k *= 2;
1716 if ((mode == HISSATSU_SEKIRYUKA) && !monster_living(m_ptr->r_idx)) k = 0;
1717 if ((mode == HISSATSU_SEKIRYUKA) && !p_ptr->cut) k /= 2;
1719 /* No negative damage */
1722 if ((mode == HISSATSU_ZANMA) && !(!monster_living(m_ptr->r_idx) && (r_ptr->flags3 & RF3_EVIL)))
1729 msg_print(_("こんな軟らかいものは切れん!", "You cannot cut such a elastic thing!"));
1735 msg_print(_("蜘蛛は苦手だ!", "Spiders are difficult for you to deal with!"));
1739 if (mode == HISSATSU_MINEUCHI)
1741 int tmp = (10 + randint1(15) + p_ptr->lev / 5);
1744 anger_monster(m_ptr);
1746 if (!(r_ptr->flags3 & (RF3_NO_STUN)))
1749 if (MON_STUNNED(m_ptr))
1751 msg_format(_("%sはひどくもうろうとした。", "%s is more dazed."), m_name);
1756 msg_format(_("%s はもうろうとした。", "%s is dazed."), m_name);
1760 (void)set_monster_stunned(g_ptr->m_idx, MON_STUNNED(m_ptr) + tmp);
1764 msg_format(_("%s には効果がなかった。", "%s is not effected."), m_name);
1768 /* Modify the damage */
1769 k = mon_damage_mod(m_ptr, k, (bool)(((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE)) || ((p_ptr->pclass == CLASS_BERSERKER) && one_in_(2))));
1770 if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) || (mode == HISSATSU_KYUSHO))
1772 if ((randint1(randint1(r_ptr->level / 7) + 5) == 1) && !(r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags7 & RF7_UNIQUE2))
1775 msg_format(_("%sの急所を突き刺した!", "You hit %s on a fatal spot!"), m_name);
1779 else if ((p_ptr->pclass == CLASS_NINJA) && has_melee_weapon(INVEN_RARM + hand) && !p_ptr->icky_wield[hand] && ((p_ptr->cur_lite <= 0) || one_in_(7)))
1781 int maxhp = maxroll(r_ptr->hdice, r_ptr->hside);
1782 if (one_in_(backstab ? 13 : (stab_fleeing || fuiuchi) ? 15 : 27))
1786 msg_format(_("刃が%sに深々と突き刺さった!", "You critically injured %s!"), m_name);
1788 else if (((m_ptr->hp < maxhp / 2) && one_in_((p_ptr->num_blow[0] + p_ptr->num_blow[1] + 1) * 10)) || ((one_in_(666) || ((backstab || fuiuchi) && one_in_(11))) && !(r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags7 & RF7_UNIQUE2)))
1790 if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_UNIQUE2) || (m_ptr->hp >= maxhp / 2))
1792 k = MAX(k * 5, m_ptr->hp / 2);
1794 msg_format(_("%sに致命傷を負わせた!", "You fatally injured %s!"), m_name);
1799 msg_format(_("刃が%sの急所を貫いた!", "You hit %s on a fatal spot!"), m_name);
1804 msg_format_wizard(CHEAT_MONSTER,
1805 _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"), k,
1806 m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
1808 if (k <= 0) can_drain = FALSE;
1810 if (drain_result > m_ptr->hp)
1811 drain_result = m_ptr->hp;
1813 /* Damage, check for fear and death */
1814 if (mon_take_hit(g_ptr->m_idx, k, fear, NULL))
1817 if ((p_ptr->pclass == CLASS_BERSERKER) && p_ptr->energy_use)
1819 if (p_ptr->migite && p_ptr->hidarite)
1821 if (hand) p_ptr->energy_use = p_ptr->energy_use * 3 / 5 + p_ptr->energy_use*num * 2 / (p_ptr->num_blow[hand] * 5);
1822 else p_ptr->energy_use = p_ptr->energy_use*num * 3 / (p_ptr->num_blow[hand] * 5);
1826 p_ptr->energy_use = p_ptr->energy_use*num / p_ptr->num_blow[hand];
1829 if ((o_ptr->name1 == ART_ZANTETSU) && is_lowlevel)
1830 msg_print(_("またつまらぬものを斬ってしまった...", "Sigh... Another trifling thing I've cut...."));
1834 /* Anger the monster */
1835 if (k > 0) anger_monster(m_ptr);
1837 touch_zap_player(m_ptr);
1839 /* Are we draining it? A little note: If the monster is
1840 dead, the drain does not work... */
1842 if (can_drain && (drain_result > 0))
1844 if (o_ptr->name1 == ART_MURAMASA)
1848 HIT_PROB to_h = o_ptr->to_h;
1849 HIT_POINT to_d = o_ptr->to_d;
1853 for (i = 0; i < to_h + 3; i++) if (one_in_(4)) flag = 0;
1857 for (i = 0; i < to_d + 3; i++) if (one_in_(4)) flag = 0;
1860 if (o_ptr->to_h != to_h || o_ptr->to_d != to_d)
1862 msg_print(_("妖刀は血を吸って強くなった!", "Muramasa sucked blood, and became more powerful!"));
1870 if (drain_result > 5) /* Did we really hurt it? */
1872 drain_heal = damroll(2, drain_result / 6);
1875 if (hex_spelling(HEX_VAMP_BLADE)) drain_heal *= 2;
1879 msg_format(_("Draining left: %d", "Draining left: %d"), drain_left);
1884 if (drain_heal < drain_left)
1886 drain_left -= drain_heal;
1890 drain_heal = drain_left;
1896 msg_format(_("刃が%sから生命力を吸い取った!", "Your weapon drains life from %s!"), m_name);
1900 drain_heal = (drain_heal * p_ptr->mutant_regenerate_mod) / 100;
1902 hp_player(drain_heal);
1903 /* We get to keep some of it! */
1907 m_ptr->maxhp -= (k + 7) / 8;
1908 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
1909 if (m_ptr->maxhp < 1) m_ptr->maxhp = 1;
1915 /* Confusion attack */
1916 if ((p_ptr->special_attack & ATTACK_CONFUSE) || (chaos_effect == 3) || (mode == HISSATSU_CONF) || hex_spelling(HEX_CONFUSION))
1918 /* Cancel glowing hands */
1919 if (p_ptr->special_attack & ATTACK_CONFUSE)
1921 p_ptr->special_attack &= ~(ATTACK_CONFUSE);
1922 msg_print(_("手の輝きがなくなった。", "Your hands stop glowing."));
1923 p_ptr->redraw |= (PR_STATUS);
1927 /* Confuse the monster */
1928 if (r_ptr->flags3 & RF3_NO_CONF)
1930 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_NO_CONF;
1931 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
1934 else if (randint0(100) < r_ptr->level)
1936 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
1940 msg_format(_("%^sは混乱したようだ。", "%^s appears confused."), m_name);
1941 (void)set_monster_confused(g_ptr->m_idx, MON_CONFUSED(m_ptr) + 10 + randint0(p_ptr->lev) / 5);
1945 else if (chaos_effect == 4)
1947 bool resists_tele = FALSE;
1949 if (r_ptr->flagsr & RFR_RES_TELE)
1951 if (r_ptr->flags1 & RF1_UNIQUE)
1953 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1954 msg_format(_("%^sには効果がなかった。", "%^s is unaffected!"), m_name);
1955 resists_tele = TRUE;
1957 else if (r_ptr->level > randint1(100))
1959 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1960 msg_format(_("%^sは抵抗力を持っている!", "%^s resists!"), m_name);
1961 resists_tele = TRUE;
1967 msg_format(_("%^sは消えた!", "%^s disappears!"), m_name);
1968 teleport_away(g_ptr->m_idx, 50, TELEPORT_PASSIVE);
1969 num = num_blow + 1; /* Can't hit it anymore! */
1974 else if ((chaos_effect == 5) && (randint1(90) > r_ptr->level))
1976 if (!(r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) &&
1977 !(r_ptr->flagsr & RFR_EFF_RES_CHAO_MASK))
1979 if (polymorph_monster(y, x))
1981 msg_format(_("%^sは変化した!", "%^s changes!"), m_name);
1987 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
1990 /* Hack -- Get new monster */
1991 m_ptr = ¤t_floor_ptr->m_list[g_ptr->m_idx];
1993 /* Oops, we need a different name... */
1994 monster_desc(m_name, m_ptr, 0);
1996 /* Hack -- Get new race */
1997 r_ptr = &r_info[m_ptr->r_idx];
2000 else if (o_ptr->name1 == ART_G_HAMMER)
2002 monster_type *target_ptr = ¤t_floor_ptr->m_list[g_ptr->m_idx];
2004 if (target_ptr->hold_o_idx)
2006 object_type *q_ptr = ¤t_floor_ptr->o_list[target_ptr->hold_o_idx];
2007 GAME_TEXT o_name[MAX_NLEN];
2009 object_desc(o_name, q_ptr, OD_NAME_ONLY);
2010 q_ptr->held_m_idx = 0;
2011 q_ptr->marked = OM_TOUCHED;
2012 target_ptr->hold_o_idx = q_ptr->next_o_idx;
2013 q_ptr->next_o_idx = 0;
2014 msg_format(_("%sを奪った。", "You snatched %s."), o_name);
2023 backstab = FALSE; /* Clumsy! */
2024 fuiuchi = FALSE; /* Clumsy! */
2026 if ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE) && one_in_(3))
2028 BIT_FLAGS flgs_aux[TR_FLAG_SIZE];
2032 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
2033 msg_print(_("振り回した大鎌が自分自身に返ってきた!", "Your scythe returns to you!"));
2034 object_flags(o_ptr, flgs_aux);
2036 k = damroll(o_ptr->dd + p_ptr->to_dd[hand], o_ptr->ds + p_ptr->to_ds[hand]);
2039 switch (p_ptr->mimic_form)
2042 switch (p_ptr->prace)
2049 case RACE_BARBARIAN:
2053 case RACE_HALF_TROLL:
2054 case RACE_HALF_OGRE:
2055 case RACE_HALF_GIANT:
2056 case RACE_HALF_TITAN:
2064 case RACE_DRACONIAN:
2071 case MIMIC_DEMON_LORD:
2078 if (p_ptr->align < 0 && mult < 20)
2080 if (!(p_ptr->resist_acid || IS_OPPOSE_ACID() || p_ptr->immune_acid) && (mult < 25))
2082 if (!(p_ptr->resist_elec || IS_OPPOSE_ELEC() || p_ptr->immune_elec) && (mult < 25))
2084 if (!(p_ptr->resist_fire || IS_OPPOSE_FIRE() || p_ptr->immune_fire) && (mult < 25))
2086 if (!(p_ptr->resist_cold || IS_OPPOSE_COLD() || p_ptr->immune_cold) && (mult < 25))
2088 if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()) && (mult < 25))
2091 if ((p_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs_aux, TR_FORCE_WEAPON)) && (p_ptr->csp >(p_ptr->msp / 30)))
2093 p_ptr->csp -= (1 + (p_ptr->msp / 30));
2094 p_ptr->redraw |= (PR_MANA);
2095 mult = mult * 3 / 2 + 20;
2097 k *= (HIT_POINT)mult;
2101 k = critical_norm(o_ptr->weight, o_ptr->to_h, k, p_ptr->to_h[hand], mode);
2105 msg_format(_("グッサリ切り裂かれた!", "Your weapon cuts deep into yourself!"));
2106 /* Try to increase the damage */
2112 k *= (HIT_POINT)mult;
2114 k += (p_ptr->to_d[hand] + o_ptr->to_d);
2117 take_hit(DAMAGE_FORCE, k, _("死の大鎌", "Death scythe"), -1);
2123 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
2131 if (weak && !(*mdeath))
2133 msg_format(_("%sは弱くなったようだ。", "%^s seems weakened."), m_name);
2135 if (drain_left != MAX_VAMPIRIC_DRAIN)
2139 chg_virtue(V_UNLIFE, 1);
2142 /* Mega-Hack -- apply earthquake brand */
2145 earthquake(p_ptr->y, p_ptr->x, 10, 0);
2146 if (!current_floor_ptr->grid_array[y][x].m_idx) *mdeath = TRUE;
2151 * @brief プレイヤーの打撃処理メインルーチン
2154 * @param mode 発動中の剣術ID
2155 * @return 実際に攻撃処理が行われた場合TRUEを返す。
2157 * If no "weapon" is available, then "punch" the monster one time.
2159 bool py_attack(POSITION y, POSITION x, COMBAT_OPTION_IDX mode)
2162 bool mdeath = FALSE;
2163 bool stormbringer = FALSE;
2165 grid_type *g_ptr = ¤t_floor_ptr->grid_array[y][x];
2166 monster_type *m_ptr = ¤t_floor_ptr->m_list[g_ptr->m_idx];
2167 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2168 GAME_TEXT m_name[MAX_NLEN];
2170 disturb(FALSE, TRUE);
2172 take_turn(p_ptr, 100);
2174 if (!p_ptr->migite && !p_ptr->hidarite &&
2175 !(p_ptr->muta2 & (MUT2_HORNS | MUT2_BEAK | MUT2_SCOR_TAIL | MUT2_TRUNK | MUT2_TENTACLES)))
2177 msg_format(_("%s攻撃できない。", "You cannot do attacking."),
2178 (empty_hands(FALSE) == EMPTY_HAND_NONE) ? _("両手がふさがって", "") : "");
2182 monster_desc(m_name, m_ptr, 0);
2186 /* Auto-Recall if possible and visible */
2187 if (!p_ptr->image) monster_race_track(m_ptr->ap_r_idx);
2189 health_track(g_ptr->m_idx);
2192 if ((r_ptr->flags1 & RF1_FEMALE) &&
2193 !(p_ptr->stun || p_ptr->confused || p_ptr->image || !m_ptr->ml))
2195 if ((p_ptr->inventory_list[INVEN_RARM].name1 == ART_ZANTETSU) || (p_ptr->inventory_list[INVEN_LARM].name1 == ART_ZANTETSU))
2197 msg_print(_("拙者、おなごは斬れぬ!", "I can not attack women!"));
2202 if (d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MELEE)
2204 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));
2208 /* Stop if friendly */
2209 if (!is_hostile(m_ptr) &&
2210 !(p_ptr->stun || p_ptr->confused || p_ptr->image ||
2211 p_ptr->shero || !m_ptr->ml))
2213 if (p_ptr->inventory_list[INVEN_RARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
2214 if (p_ptr->inventory_list[INVEN_LARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
2217 msg_format(_("黒い刃は強欲に%sを攻撃した!", "Your black blade greedily attacks %s!"), m_name);
2218 chg_virtue(V_INDIVIDUALISM, 1);
2219 chg_virtue(V_HONOUR, -1);
2220 chg_virtue(V_JUSTICE, -1);
2221 chg_virtue(V_COMPASSION, -1);
2223 else if (p_ptr->pclass != CLASS_BERSERKER)
2225 if (get_check(_("本当に攻撃しますか?", "Really hit it? ")))
2227 chg_virtue(V_INDIVIDUALISM, 1);
2228 chg_virtue(V_HONOUR, -1);
2229 chg_virtue(V_JUSTICE, -1);
2230 chg_virtue(V_COMPASSION, -1);
2234 msg_format(_("%sを攻撃するのを止めた。", "You stop to avoid hitting %s."), m_name);
2241 /* Handle player fear */
2245 msg_format(_("恐くて%sを攻撃できない!", "You are too afraid to attack %s!"), m_name);
2247 msg_format(_("そっちには何か恐いものがいる!", "There is something scary in your way!"));
2249 /* Disturb the monster */
2250 (void)set_monster_csleep(g_ptr->m_idx, 0);
2255 if (MON_CSLEEP(m_ptr)) /* It is not honorable etc to attack helpless victims */
2257 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(V_COMPASSION, -1);
2258 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(V_HONOUR, -1);
2261 if (p_ptr->migite && p_ptr->hidarite)
2263 if ((p_ptr->skill_exp[GINOU_NITOURYU] < s_info[p_ptr->pclass].s_max[GINOU_NITOURYU]) && ((p_ptr->skill_exp[GINOU_NITOURYU] - 1000) / 200 < r_ptr->level))
2265 if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_BEGINNER)
2266 p_ptr->skill_exp[GINOU_NITOURYU] += 80;
2267 else if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_SKILLED)
2268 p_ptr->skill_exp[GINOU_NITOURYU] += 4;
2269 else if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_EXPERT)
2270 p_ptr->skill_exp[GINOU_NITOURYU] += 1;
2271 else if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_MASTER)
2272 if (one_in_(3)) p_ptr->skill_exp[GINOU_NITOURYU] += 1;
2273 p_ptr->update |= (PU_BONUS);
2277 /* Gain riding experience */
2280 int cur = p_ptr->skill_exp[GINOU_RIDING];
2281 int max = s_info[p_ptr->pclass].s_max[GINOU_RIDING];
2285 DEPTH ridinglevel = r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].level;
2286 DEPTH targetlevel = r_ptr->level;
2289 if ((cur / 200 - 5) < targetlevel)
2292 /* Extra experience */
2293 if ((cur / 100) < ridinglevel)
2295 if ((cur / 100 + 15) < ridinglevel)
2296 inc += 1 + (ridinglevel - (cur / 100 + 15));
2301 p_ptr->skill_exp[GINOU_RIDING] = MIN(max, cur + inc);
2302 p_ptr->update |= (PU_BONUS);
2306 p_ptr->riding_t_m_idx = g_ptr->m_idx;
2307 if (p_ptr->migite) py_attack_aux(y, x, &fear, &mdeath, 0, mode);
2308 if (p_ptr->hidarite && !mdeath) py_attack_aux(y, x, &fear, &mdeath, 1, mode);
2310 /* Mutations which yield extra 'natural' attacks */
2313 if ((p_ptr->muta2 & MUT2_HORNS) && !mdeath)
2314 natural_attack(g_ptr->m_idx, MUT2_HORNS, &fear, &mdeath);
2315 if ((p_ptr->muta2 & MUT2_BEAK) && !mdeath)
2316 natural_attack(g_ptr->m_idx, MUT2_BEAK, &fear, &mdeath);
2317 if ((p_ptr->muta2 & MUT2_SCOR_TAIL) && !mdeath)
2318 natural_attack(g_ptr->m_idx, MUT2_SCOR_TAIL, &fear, &mdeath);
2319 if ((p_ptr->muta2 & MUT2_TRUNK) && !mdeath)
2320 natural_attack(g_ptr->m_idx, MUT2_TRUNK, &fear, &mdeath);
2321 if ((p_ptr->muta2 & MUT2_TENTACLES) && !mdeath)
2322 natural_attack(g_ptr->m_idx, MUT2_TENTACLES, &fear, &mdeath);
2325 /* Hack -- delay fear messages */
2326 if (fear && m_ptr->ml && !mdeath)
2330 msg_format(_("%^sは恐怖して逃げ出した!", "%^s flees in terror!"), m_name);
2333 if ((p_ptr->special_defense & KATA_IAI) && ((mode != HISSATSU_IAI) || mdeath))
2335 set_action(ACTION_NONE);
2342 * @brief モンスターからプレイヤーへの打撃処理 / Attack the player via physical attacks.
2343 * @param m_idx 打撃を行うモンスターのID
2344 * @return 実際に攻撃処理を行った場合TRUEを返す
2346 bool make_attack_normal(MONSTER_IDX m_idx)
2348 monster_type *m_ptr = ¤t_floor_ptr->m_list[m_idx];
2349 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2357 int do_cut, do_stun;
2361 GAME_TEXT o_name[MAX_NLEN];
2362 GAME_TEXT m_name[MAX_NLEN];
2363 GAME_TEXT ddesc[80];
2366 bool touched = FALSE, fear = FALSE, alive = TRUE;
2367 bool explode = FALSE;
2368 bool do_silly_attack = (one_in_(2) && p_ptr->image);
2369 HIT_POINT get_damage = 0;
2370 int abbreviate = 0; // 2回目以降の省略表現フラグ
2372 /* Not allowed to attack */
2373 if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return (FALSE);
2375 if (d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) return (FALSE);
2377 /* ...nor if friendly */
2378 if (!is_hostile(m_ptr)) return FALSE;
2380 /* Extract the effective monster level */
2381 rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
2383 /* Get the monster name (or "it") */
2384 monster_desc(m_name, m_ptr, 0);
2386 monster_desc(ddesc, m_ptr, MD_WRONGDOER_NAME);
2388 if (p_ptr->special_defense & KATA_IAI)
2390 msg_format(_("相手が襲いかかる前に素早く武器を振るった。", "You took sen, draw and cut in one motion before %s move."), m_name);
2391 if (py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_IAI)) return TRUE;
2394 if ((p_ptr->special_defense & NINJA_KAWARIMI) && (randint0(55) < (p_ptr->lev*3/5+20)))
2396 if (kawarimi(TRUE)) return TRUE;
2399 /* Assume no blink */
2402 /* Scan through all four blows */
2403 for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
2405 bool obvious = FALSE;
2407 HIT_POINT power = 0;
2408 HIT_POINT damage = 0;
2412 /* Extract the attack infomation */
2413 int effect = r_ptr->blow[ap_cnt].effect;
2414 int method = r_ptr->blow[ap_cnt].method;
2415 int d_dice = r_ptr->blow[ap_cnt].d_dice;
2416 int d_side = r_ptr->blow[ap_cnt].d_side;
2418 if (!monster_is_valid(m_ptr)) break;
2420 /* Hack -- no more attacks */
2423 if (is_pet(m_ptr) && (r_ptr->flags1 & RF1_UNIQUE) && (method == RBM_EXPLODE))
2429 /* Stop if player is dead or gone */
2430 if (!p_ptr->playing || p_ptr->is_dead) break;
2431 if (distance(p_ptr->y, p_ptr->x, m_ptr->fy, m_ptr->fx) > 1) break;
2433 /* Handle "leaving" */
2434 if (p_ptr->leaving) break;
2436 if (method == RBM_SHOOT) continue;
2438 /* Extract the attack "power" */
2439 power = mbe_info[effect].power;
2442 ac = p_ptr->ac + p_ptr->to_a;
2444 /* Monster hits player */
2445 if (!effect || check_hit(power, rlev, MON_STUNNED(m_ptr)))
2447 /* Always disturbing */
2448 disturb(TRUE, TRUE);
2451 /* Hack -- Apply "protection from evil" */
2452 if ((p_ptr->protevil > 0) &&
2453 (r_ptr->flags3 & RF3_EVIL) &&
2454 (p_ptr->lev >= rlev) &&
2455 ((randint0(100) + p_ptr->lev) > 50))
2457 /* Remember the Evil-ness */
2458 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_EVIL;
2461 if (abbreviate) msg_format("撃退した。");
2462 else msg_format("%^sは撃退された。", m_name);
2463 abbreviate = 1; /*2回目以降は省略 */
2465 msg_format("%^s is repelled.", m_name);
2469 /* Hack -- Next attack */
2474 /* Assume no cut or stun */
2475 do_cut = do_stun = 0;
2477 /* Describe the attack method */
2482 act = _("殴られた。", "hits you.");
2483 do_cut = do_stun = 1;
2491 act = _("触られた。", "touches you.");
2499 act = _("パンチされた。", "punches you.");
2508 act = _("蹴られた。", "kicks you.");
2517 act = _("ひっかかれた。", "claws you.");
2526 act = _("噛まれた。", "bites you.");
2535 act = _("刺された。", "stings you.");
2543 act = _("斬られた。", "slashes you.");
2552 act = _("角で突かれた。", "butts you.");
2561 act = _("体当たりされた。", "crushes you.");
2570 act = _("飲み込まれた。", "engulfs you.");
2579 act = _("は請求書をよこした。", "charges you.");
2581 sound(SOUND_BUY); /* Note! This is "charges", not "charges at". */
2588 act = _("が体の上を這い回った。", "crawls on you.");
2596 act = _("よだれをたらされた。", "drools on you.");
2603 act = _("唾を吐かれた。", "spits on you.");
2611 act = _("は爆発した。", "explodes.");
2618 act = _("にらまれた。", "gazes at you.");
2624 act = _("泣き叫ばれた。", "wails at you.");
2631 act = _("胞子を飛ばされた。", "releases spores at you.");
2639 act = _("が XXX4 を発射した。", "projects XXX4's at you.");
2645 act = _("金をせがまれた。", "begs you for money.");
2655 act = desc_insult[randint0(m_ptr->r_idx == MON_DEBBY ? 10 : 8)];
2665 act = desc_moan[randint0(4)];
2675 if (m_ptr->r_idx == MON_JAIAN)
2678 switch(randint1(15))
2683 act = "「♪お~れはジャイアン~~ガ~キだいしょう~」";
2686 act = "「♪て~んかむ~てきのお~とこだぜ~~」";
2689 act = "「♪の~び太スネ夫はメじゃないよ~~」";
2692 act = "「♪け~んかスポ~ツ~どんとこい~」";
2695 act = "「♪うた~も~~う~まいぜ~まかしとけ~」";
2698 act = "「♪ま~ちいちば~んのに~んきもの~~」";
2701 act = "「♪べんきょうしゅくだいメじゃないよ~~」";
2704 act = "「♪きはやさし~くて~ち~からもち~」";
2707 act = "「♪かお~も~~スタイルも~バツグンさ~」";
2710 act = "「♪がっこうい~ちの~あ~ばれんぼう~~」";
2713 act = "「♪ド~ラもドラミもメじゃないよ~~」";
2716 act = "「♪よじげんぽけっと~な~くたって~」";
2719 act = "「♪あし~の~~ながさ~は~まけないぜ~」";
2723 act = "horribly sings 'I AM GIAAAAAN. THE BOOOSS OF THE KIIIIDS.'";
2729 act = _("は♪僕らは楽しい家族♪と歌っている。", "sings 'We are a happy family.'");
2731 act = _("は♪アイ ラブ ユー、ユー ラブ ミー♪と歌っている。", "sings 'I love you, you love me.'");
2741 if (do_silly_attack)
2746 act = silly_attacks[randint0(MAX_SILLY_ATTACK)];
2749 if (abbreviate == 0)
2750 msg_format("%^sに%s", m_name, act);
2751 else if (abbreviate == 1)
2752 msg_format("%s", act);
2753 else /* if (abbreviate == -1) */
2754 msg_format("%^s%s", m_name, act);
2755 abbreviate = 1;/*2回目以降は省略 */
2757 msg_format("%^s %s%s", m_name, act, do_silly_attack ? " you." : "");
2761 /* Hack -- assume all attacks are obvious */
2764 /* Roll out the damage */
2765 damage = damroll(d_dice, d_side);
2768 * Skip the effect when exploding, since the explosion
2769 * already causes the effect.
2771 if(explode) damage = 0;
2772 /* Apply appropriate damage */
2782 case RBE_SUPERHURT: /* AC軽減あり / Player armor reduces total damage */
2784 if (((randint1(rlev*2+300) > (ac+200)) || one_in_(13)) && !CHECK_MULTISHADOW())
2786 int tmp_damage = damage - (damage * ((ac < 150) ? ac : 150) / 250);
2787 msg_print(_("痛恨の一撃!", "It was a critical hit!"));
2788 tmp_damage = MAX(damage, tmp_damage*2);
2790 get_damage += take_hit(DAMAGE_ATTACK, tmp_damage, ddesc, -1);
2794 case RBE_HURT: /* AC軽減あり / Player armor reduces total damage */
2797 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
2798 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2806 /* Take "poison" effect */
2807 if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()) && !CHECK_MULTISHADOW())
2809 if (set_poisoned(p_ptr->poisoned + randint1(rlev) + 5))
2815 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2817 /* Learn about the player */
2818 update_smart_learn(m_idx, DRS_POIS);
2827 /* Allow complete resist */
2828 if (!p_ptr->resist_disen && !CHECK_MULTISHADOW())
2830 /* Apply disenchantment */
2831 if (apply_disenchant(0))
2833 /* Hack -- Update AC */
2834 update_creature(p_ptr);
2839 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2841 /* Learn about the player */
2842 update_smart_learn(m_idx, DRS_DISEN);
2849 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2851 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2854 for (k = 0; k < 10; k++)
2857 i = (INVENTORY_IDX)randint0(INVEN_PACK);
2859 /* Obtain the item */
2860 o_ptr = &p_ptr->inventory_list[i];
2861 if (!o_ptr->k_idx) continue;
2863 /* Drain charged wands/staffs */
2864 if (((o_ptr->tval == TV_STAFF) ||
2865 (o_ptr->tval == TV_WAND)) &&
2868 /* Calculate healed hitpoints */
2869 int heal=rlev * o_ptr->pval;
2870 if( o_ptr->tval == TV_STAFF)
2871 heal *= o_ptr->number;
2873 /* Don't heal more than max hp */
2874 heal = MIN(heal, m_ptr->maxhp - m_ptr->hp);
2876 msg_print(_("ザックからエネルギーが吸い取られた!", "Energy drains from your pack!"));
2880 /* Heal the monster */
2881 m_ptr->hp += (HIT_POINT)heal;
2883 /* Redraw (later) if needed */
2884 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
2885 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
2890 /* Combine / Reorder the pack */
2891 p_ptr->update |= (PU_COMBINE | PU_REORDER);
2892 p_ptr->window |= (PW_INVEN);
2903 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2905 /* Confused monsters cannot steal successfully. -LM-*/
2906 if (MON_CONFUSED(m_ptr)) break;
2908 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2912 /* Saving throw (unless paralyzed) based on dex and level */
2913 if (!p_ptr->paralyzed &&
2914 (randint0(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
2917 /* Saving throw message */
2918 msg_print(_("しかし素早く財布を守った!", "You quickly protect your money pouch!"));
2920 /* Occasional blink anyway */
2921 if (randint0(3)) blinked = TRUE;
2927 gold = (p_ptr->au / 10) + randint1(25);
2928 if (gold < 2) gold = 2;
2929 if (gold > 5000) gold = (p_ptr->au / 20) + randint1(3000);
2930 if (gold > p_ptr->au) gold = p_ptr->au;
2934 msg_print(_("しかし何も盗まれなかった。", "Nothing was stolen."));
2938 msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2939 msg_format(_("$%ld のお金が盗まれた!", "%ld coins were stolen!"), (long)gold);
2940 chg_virtue(V_SACRIFICE, 1);
2944 msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2945 msg_print(_("お金が全部盗まれた!", "All of your coins were stolen!"));
2946 chg_virtue(V_SACRIFICE, 2);
2950 p_ptr->redraw |= (PR_GOLD);
2952 p_ptr->window |= (PW_PLAYER);
2963 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2965 /* Confused monsters cannot steal successfully. -LM-*/
2966 if (MON_CONFUSED(m_ptr)) break;
2968 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2970 /* Saving throw (unless paralyzed) based on dex and level */
2971 if (!p_ptr->paralyzed &&
2972 (randint0(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
2975 /* Saving throw message */
2976 msg_print(_("しかしあわててザックを取り返した!", "You grab hold of your backpack!"));
2978 /* Occasional "blink" anyway */
2985 for (k = 0; k < 10; k++)
2990 i = (INVENTORY_IDX)randint0(INVEN_PACK);
2992 /* Obtain the item */
2993 o_ptr = &p_ptr->inventory_list[i];
2994 if (!o_ptr->k_idx) continue;
2996 /* Skip artifacts */
2997 if (object_is_artifact(o_ptr)) continue;
2999 object_desc(o_name, o_ptr, OD_OMIT_PREFIX);
3002 msg_format("%s(%c)を%s盗まれた!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
3004 msg_format("%sour %s (%c) was stolen!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
3006 chg_virtue(V_SACRIFICE, 1);
3013 j_ptr = ¤t_floor_ptr->o_list[o_idx];
3014 object_copy(j_ptr, o_ptr);
3019 /* Hack -- If a rod or wand, allocate total
3020 * maximum timeouts or charges between those
3021 * stolen and those missed. -LM-
3023 if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
3025 j_ptr->pval = o_ptr->pval / o_ptr->number;
3026 o_ptr->pval -= j_ptr->pval;
3030 j_ptr->marked = OM_TOUCHED;
3032 /* Memorize monster */
3033 j_ptr->held_m_idx = m_idx;
3036 j_ptr->next_o_idx = m_ptr->hold_o_idx;
3039 m_ptr->hold_o_idx = o_idx;
3042 /* Steal the items */
3043 inven_item_increase(i, -1);
3044 inven_item_optimize(i);
3059 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3061 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3063 /* Steal some food */
3064 for (k = 0; k < 10; k++)
3066 /* Pick an item from the pack */
3067 i = (INVENTORY_IDX)randint0(INVEN_PACK);
3069 o_ptr = &p_ptr->inventory_list[i];
3070 if (!o_ptr->k_idx) continue;
3072 /* Skip non-food objects */
3073 if ((o_ptr->tval != TV_FOOD) && !((o_ptr->tval == TV_CORPSE) && (o_ptr->sval))) continue;
3075 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
3078 msg_format("%s(%c)を%s食べられてしまった!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
3080 msg_format("%sour %s (%c) was eaten!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
3083 /* Steal the items */
3084 inven_item_increase(i, -1);
3085 inven_item_optimize(i);
3097 /* Access the lite */
3098 o_ptr = &p_ptr->inventory_list[INVEN_LITE];
3099 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3101 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3104 if ((o_ptr->xtra4 > 0) && (!object_is_fixed_artifact(o_ptr)))
3107 o_ptr->xtra4 -= (s16b)(250 + randint1(250));
3108 if (o_ptr->xtra4 < 1) o_ptr->xtra4 = 1;
3112 msg_print(_("明かりが暗くなってしまった。", "Your light dims."));
3116 p_ptr->window |= (PW_EQUIP);
3126 msg_print(_("酸を浴びせられた!", "You are covered in acid!"));
3127 get_damage += acid_dam(damage, ddesc, -1, FALSE);
3128 update_creature(p_ptr);
3129 update_smart_learn(m_idx, DRS_ACID);
3137 msg_print(_("電撃を浴びせられた!", "You are struck by electricity!"));
3138 get_damage += elec_dam(damage, ddesc, -1, FALSE);
3139 update_smart_learn(m_idx, DRS_ELEC);
3147 msg_print(_("全身が炎に包まれた!", "You are enveloped in flames!"));
3148 get_damage += fire_dam(damage, ddesc, -1, FALSE);
3149 update_smart_learn(m_idx, DRS_FIRE);
3157 msg_print(_("全身が冷気で覆われた!", "You are covered with frost!"));
3158 get_damage += cold_dam(damage, ddesc, -1, FALSE);
3159 update_smart_learn(m_idx, DRS_COLD);
3165 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3166 if (p_ptr->is_dead) break;
3168 /* Increase "blind" */
3169 if (!p_ptr->resist_blind && !CHECK_MULTISHADOW())
3171 if (set_blind(p_ptr->blind + 10 + randint1(rlev)))
3174 if (m_ptr->r_idx == MON_DIO) msg_print("どうだッ!この血の目潰しはッ!");
3182 /* Learn about the player */
3183 update_smart_learn(m_idx, DRS_BLIND);
3191 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3193 if (p_ptr->is_dead) break;
3195 /* Increase "confused" */
3196 if (!p_ptr->resist_conf && !CHECK_MULTISHADOW())
3198 if (set_confused(p_ptr->confused + 3 + randint1(rlev)))
3204 /* Learn about the player */
3205 update_smart_learn(m_idx, DRS_CONF);
3212 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3214 if (p_ptr->is_dead) break;
3216 /* Increase "afraid" */
3217 if (CHECK_MULTISHADOW())
3221 else if (p_ptr->resist_fear)
3223 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
3226 else if (randint0(100 + r_ptr->level/2) < p_ptr->skill_sav)
3228 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
3233 if (set_afraid(p_ptr->afraid + 3 + randint1(rlev)))
3239 /* Learn about the player */
3240 update_smart_learn(m_idx, DRS_FEAR);
3247 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3249 if (p_ptr->is_dead) break;
3251 /* Increase "paralyzed" */
3252 if (CHECK_MULTISHADOW())
3256 else if (p_ptr->free_act)
3258 msg_print(_("しかし効果がなかった!", "You are unaffected!"));
3261 else if (randint0(100 + r_ptr->level/2) < p_ptr->skill_sav)
3263 msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
3268 if (!p_ptr->paralyzed)
3270 if (set_paralyzed(3 + randint1(rlev)))
3277 /* Learn about the player */
3278 update_smart_learn(m_idx, DRS_FREE);
3285 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3287 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3288 if (do_dec_stat(A_STR)) obvious = TRUE;
3295 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3297 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3298 if (do_dec_stat(A_INT)) obvious = TRUE;
3305 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3307 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3308 if (do_dec_stat(A_WIS)) obvious = TRUE;
3315 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3317 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3318 if (do_dec_stat(A_DEX)) obvious = TRUE;
3325 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3327 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3328 if (do_dec_stat(A_CON)) obvious = TRUE;
3335 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3337 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3338 if (do_dec_stat(A_CHR)) obvious = TRUE;
3345 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3347 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3349 /* Damage (stats) */
3350 if (do_dec_stat(A_STR)) obvious = TRUE;
3351 if (do_dec_stat(A_DEX)) obvious = TRUE;
3352 if (do_dec_stat(A_CON)) obvious = TRUE;
3353 if (do_dec_stat(A_INT)) obvious = TRUE;
3354 if (do_dec_stat(A_WIS)) obvious = TRUE;
3355 if (do_dec_stat(A_CHR)) obvious = TRUE;
3364 /* Hack -- Reduce damage based on the player armor class */
3365 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
3367 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3369 /* Radius 8 earthquake centered at the monster */
3370 if (damage > 23 || explode)
3372 earthquake(m_ptr->fy, m_ptr->fx, 8, m_idx);
3380 s32b d = damroll(10, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3384 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3386 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3388 (void)drain_exp(d, d / 10, 95);
3394 s32b d = damroll(20, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3398 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3400 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3402 (void)drain_exp(d, d / 10, 90);
3408 s32b d = damroll(40, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3412 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3414 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3416 (void)drain_exp(d, d / 10, 75);
3422 s32b d = damroll(80, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3426 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3428 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3430 (void)drain_exp(d, d / 10, 50);
3436 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3438 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3440 /* Take "poison" effect */
3441 if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()))
3443 if (set_poisoned(p_ptr->poisoned + randint1(rlev) + 5))
3449 /* Damage CON (10% chance)*/
3450 if ((randint1(100) < 11) && (p_ptr->prace != RACE_ANDROID))
3452 /* 1% chance for perm. damage */
3453 bool perm = one_in_(10);
3454 if (dec_stat(A_CON, randint1(10), perm))
3456 msg_print(_("病があなたを蝕んでいる気がする。", "You feel strange sickness."));
3466 if (!p_ptr->resist_time && !CHECK_MULTISHADOW())
3468 switch (randint1(10))
3470 case 1: case 2: case 3: case 4: case 5:
3472 if (p_ptr->prace == RACE_ANDROID) break;
3473 msg_print(_("人生が逆戻りした気がする。", "You feel life has clocked back."));
3474 lose_exp(100 + (p_ptr->exp / 100) * MON_DRAIN_LIFE);
3478 case 6: case 7: case 8: case 9:
3480 int stat = randint0(6);
3485 case A_STR: act = "強く"; break;
3486 case A_INT: act = "聡明で"; break;
3487 case A_WIS: act = "賢明で"; break;
3488 case A_DEX: act = "器用で"; break;
3489 case A_CON: act = "健康で"; break;
3490 case A_CHR: act = "美しく"; break;
3492 case A_STR: act = "strong"; break;
3493 case A_INT: act = "bright"; break;
3494 case A_WIS: act = "wise"; break;
3495 case A_DEX: act = "agile"; break;
3496 case A_CON: act = "hale"; break;
3497 case A_CHR: act = "beautiful"; break;
3502 msg_format(_("あなたは以前ほど%sなくなってしまった...。", "You're not as %s as you used to be..."), act);
3503 p_ptr->stat_cur[stat] = (p_ptr->stat_cur[stat] * 3) / 4;
3504 if (p_ptr->stat_cur[stat] < 3) p_ptr->stat_cur[stat] = 3;
3505 p_ptr->update |= (PU_BONUS);
3511 msg_print(_("あなたは以前ほど力強くなくなってしまった...。", "You're not as powerful as you used to be..."));
3513 for (k = 0; k < A_MAX; k++)
3515 p_ptr->stat_cur[k] = (p_ptr->stat_cur[k] * 7) / 8;
3516 if (p_ptr->stat_cur[k] < 3) p_ptr->stat_cur[k] = 3;
3518 p_ptr->update |= (PU_BONUS);
3523 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3529 s32b d = damroll(60, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3534 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3536 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3538 resist_drain = !drain_exp(d, d / 10, 50);
3540 /* Heal the attacker? */
3541 if (p_ptr->mimic_form)
3543 if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
3544 resist_drain = TRUE;
3548 switch (p_ptr->prace)
3557 resist_drain = TRUE;
3562 if ((damage > 5) && !resist_drain)
3564 bool did_heal = FALSE;
3566 if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
3569 m_ptr->hp += damroll(4, damage / 6);
3570 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
3572 /* Redraw (later) if needed */
3573 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
3574 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
3576 /* Special message */
3577 if (m_ptr->ml && did_heal)
3579 msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), m_name);
3589 if (CHECK_MULTISHADOW())
3591 msg_print(_("攻撃は幻影に命中し、あなたには届かなかった。", "The attack hits Shadow, you are unharmed!"));
3597 p_ptr->csp -= damage;
3601 p_ptr->csp_frac = 0;
3604 p_ptr->redraw |= (PR_MANA);
3607 /* Learn about the player */
3608 update_smart_learn(m_idx, DRS_MANA);
3614 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3616 if (p_ptr->is_dead) break;
3618 /* Decrease speed */
3619 if (CHECK_MULTISHADOW())
3625 if (set_slow((p_ptr->slow + 4 + randint0(rlev / 10)), FALSE))
3635 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3637 if (p_ptr->is_dead) break;
3639 /* Decrease speed */
3640 if (p_ptr->resist_sound || CHECK_MULTISHADOW())
3646 if (set_stun(p_ptr->stun + 10 + randint1(r_ptr->level / 4)))
3656 /* Hack -- only one of cut or stun */
3657 if (do_cut && do_stun)
3660 if (randint0(100) < 50)
3677 /* Critical hit (zero if non-critical) */
3678 tmp = monster_critical(d_dice, d_side, damage);
3680 /* Roll for damage */
3683 case 0: cut_plus = 0; break;
3684 case 1: cut_plus = randint1(5); break;
3685 case 2: cut_plus = randint1(5) + 5; break;
3686 case 3: cut_plus = randint1(20) + 20; break;
3687 case 4: cut_plus = randint1(50) + 50; break;
3688 case 5: cut_plus = randint1(100) + 100; break;
3689 case 6: cut_plus = 300; break;
3690 default: cut_plus = 500; break;
3694 if (cut_plus) (void)set_cut(p_ptr->cut + cut_plus);
3702 /* Critical hit (zero if non-critical) */
3703 tmp = monster_critical(d_dice, d_side, damage);
3705 /* Roll for damage */
3708 case 0: stun_plus = 0; break;
3709 case 1: stun_plus = randint1(5); break;
3710 case 2: stun_plus = randint1(5) + 10; break;
3711 case 3: stun_plus = randint1(10) + 20; break;
3712 case 4: stun_plus = randint1(15) + 30; break;
3713 case 5: stun_plus = randint1(20) + 40; break;
3714 case 6: stun_plus = 80; break;
3715 default: stun_plus = 150; break;
3718 /* Apply the stun */
3719 if (stun_plus) (void)set_stun(p_ptr->stun + stun_plus);
3724 sound(SOUND_EXPLODE);
3726 if (mon_take_hit(m_idx, m_ptr->hp + 1, &fear, NULL))
3735 if (p_ptr->sh_fire && alive && !p_ptr->is_dead)
3737 if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK))
3739 HIT_POINT dam = damroll(2, 6);
3741 /* Modify the damage */
3742 dam = mon_damage_mod(m_ptr, dam, FALSE);
3744 msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), m_name);
3746 if (mon_take_hit(m_idx, dam, &fear, _("は灰の山になった。", " turns into a pile of ash.")))
3754 if (is_original_ap_and_seen(m_ptr))
3755 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
3759 if (p_ptr->sh_elec && alive && !p_ptr->is_dead)
3761 if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK))
3763 HIT_POINT dam = damroll(2, 6);
3765 /* Modify the damage */
3766 dam = mon_damage_mod(m_ptr, dam, FALSE);
3768 msg_format(_("%^sは電撃をくらった!", "%^s gets zapped!"), m_name);
3769 if (mon_take_hit(m_idx, dam, &fear, _("は燃え殻の山になった。", " turns into a pile of cinder.")))
3777 if (is_original_ap_and_seen(m_ptr))
3778 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
3782 if (p_ptr->sh_cold && alive && !p_ptr->is_dead)
3784 if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK))
3786 HIT_POINT dam = damroll(2, 6);
3788 /* Modify the damage */
3789 dam = mon_damage_mod(m_ptr, dam, FALSE);
3791 msg_format(_("%^sは冷気をくらった!", "%^s is very cold!"), m_name);
3792 if (mon_take_hit(m_idx, dam, &fear, _("は凍りついた。", " was frozen.")))
3800 if (is_original_ap_and_seen(m_ptr))
3801 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
3806 if (p_ptr->dustrobe && alive && !p_ptr->is_dead)
3808 if (!(r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK))
3810 HIT_POINT dam = damroll(2, 6);
3812 /* Modify the damage */
3813 dam = mon_damage_mod(m_ptr, dam, FALSE);
3815 msg_format(_("%^sは鏡の破片をくらった!", "%^s gets zapped!"), m_name);
3816 if (mon_take_hit(m_idx, dam, &fear, _("はズタズタになった。", " had torn to pieces.")))
3824 if (is_original_ap_and_seen(m_ptr))
3825 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK);
3828 if (is_mirror_grid(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x]))
3830 teleport_player(10, 0L);
3834 if (p_ptr->tim_sh_holy && alive && !p_ptr->is_dead)
3836 if (r_ptr->flags3 & RF3_EVIL)
3838 if (!(r_ptr->flagsr & RFR_RES_ALL))
3840 HIT_POINT dam = damroll(2, 6);
3842 /* Modify the damage */
3843 dam = mon_damage_mod(m_ptr, dam, FALSE);
3845 msg_format(_("%^sは聖なるオーラで傷ついた!", "%^s is injured by holy power!"), m_name);
3846 if (mon_take_hit(m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3851 if (is_original_ap_and_seen(m_ptr))
3852 r_ptr->r_flags3 |= RF3_EVIL;
3856 if (is_original_ap_and_seen(m_ptr))
3857 r_ptr->r_flagsr |= RFR_RES_ALL;
3862 if (p_ptr->tim_sh_touki && alive && !p_ptr->is_dead)
3864 if (!(r_ptr->flagsr & RFR_RES_ALL))
3866 HIT_POINT dam = damroll(2, 6);
3868 /* Modify the damage */
3869 dam = mon_damage_mod(m_ptr, dam, FALSE);
3871 msg_format(_("%^sが鋭い闘気のオーラで傷ついた!", "%^s is injured by the Force"), m_name);
3872 if (mon_take_hit(m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3880 if (is_original_ap_and_seen(m_ptr))
3881 r_ptr->r_flagsr |= RFR_RES_ALL;
3885 if (hex_spelling(HEX_SHADOW_CLOAK) && alive && !p_ptr->is_dead)
3888 object_type *o_armed_ptr = &p_ptr->inventory_list[INVEN_RARM];
3890 if (!(r_ptr->flagsr & RFR_RES_ALL || r_ptr->flagsr & RFR_RES_DARK))
3892 if (o_armed_ptr->k_idx)
3894 int basedam = ((o_armed_ptr->dd + p_ptr->to_dd[0]) * (o_armed_ptr->ds + p_ptr->to_ds[0] + 1));
3895 dam = basedam / 2 + o_armed_ptr->to_d + p_ptr->to_d[0];
3898 /* Cursed armor makes damages doubled */
3899 o_armed_ptr = &p_ptr->inventory_list[INVEN_BODY];
3900 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr)) dam *= 2;
3902 /* Modify the damage */
3903 dam = mon_damage_mod(m_ptr, dam, FALSE);
3905 msg_format(_("影のオーラが%^sに反撃した!", "Enveloped shadows attack %^s."), m_name);
3906 if (mon_take_hit(m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3911 else /* monster does not dead */
3914 BIT_FLAGS flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
3915 EFFECT_ID typ[4][2] = {
3916 { INVEN_HEAD, GF_OLD_CONF },
3917 { INVEN_LARM, GF_OLD_SLEEP },
3918 { INVEN_HANDS, GF_TURN_ALL },
3919 { INVEN_FEET, GF_OLD_SLOW }
3922 /* Some cursed armours gives an extra effect */
3923 for (j = 0; j < 4; j++)
3925 o_armed_ptr = &p_ptr->inventory_list[typ[j][0]];
3926 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr) && object_is_armour(o_armed_ptr))
3927 project(0, 0, m_ptr->fy, m_ptr->fx, (p_ptr->lev * 2), typ[j][1], flg, -1);
3933 if (is_original_ap_and_seen(m_ptr))
3934 r_ptr->r_flagsr |= (RFR_RES_ALL | RFR_RES_DARK);
3940 /* Monster missed player */
3943 /* Analyze failed attacks */
3959 /* Visible monsters */
3962 disturb(TRUE, TRUE);
3966 msg_format("%sかわした。", (p_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "");
3968 msg_format("%s%^sの攻撃をかわした。", (p_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "", m_name);
3969 abbreviate = 1;/*2回目以降は省略 */
3971 msg_format("%^s misses you.", m_name);
3976 /* Gain shield experience */
3977 if (object_is_armour(&p_ptr->inventory_list[INVEN_RARM]) || object_is_armour(&p_ptr->inventory_list[INVEN_LARM]))
3979 int cur = p_ptr->skill_exp[GINOU_SHIELD];
3980 int max = s_info[p_ptr->pclass].s_max[GINOU_SHIELD];
3984 DEPTH targetlevel = r_ptr->level;
3988 /* Extra experience */
3989 if ((cur / 100) < targetlevel)
3991 if ((cur / 100 + 15) < targetlevel)
3992 inc += 1 + (targetlevel - (cur / 100 + 15));
3997 p_ptr->skill_exp[GINOU_SHIELD] = MIN(max, cur + inc);
3998 p_ptr->update |= (PU_BONUS);
4009 /* Analyze "visible" monsters only */
4010 if (is_original_ap_and_seen(m_ptr) && !do_silly_attack)
4012 /* Count "obvious" attacks (and ones that cause damage) */
4013 if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
4015 /* Count attacks of this type */
4016 if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
4018 r_ptr->r_blows[ap_cnt]++;
4023 if (p_ptr->riding && damage)
4025 char m_steed_name[MAX_NLEN];
4026 monster_desc(m_steed_name, ¤t_floor_ptr->m_list[p_ptr->riding], 0);
4027 if (rakuba((damage > 200) ? 200 : damage, FALSE))
4029 msg_format(_("%^sから落ちてしまった!", "You have fallen from %s."), m_steed_name);
4033 if (p_ptr->special_defense & NINJA_KAWARIMI)
4035 if (kawarimi(FALSE)) return TRUE;
4039 /* Hex - revenge damage stored */
4040 revenge_store(get_damage);
4042 if ((p_ptr->tim_eyeeye || hex_spelling(HEX_EYE_FOR_EYE))
4043 && get_damage > 0 && !p_ptr->is_dead)
4046 msg_format("攻撃が%s自身を傷つけた!", m_name);
4048 GAME_TEXT m_name_self[80];
4051 monster_desc(m_name_self, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE);
4053 msg_format("The attack of %s has wounded %s!", m_name, m_name_self);
4055 project(0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL, -1);
4056 if (p_ptr->tim_eyeeye) set_tim_eyeeye(p_ptr->tim_eyeeye-5, TRUE);
4059 if ((p_ptr->counter || (p_ptr->special_defense & KATA_MUSOU)) && alive && !p_ptr->is_dead && m_ptr->ml && (p_ptr->csp > 7))
4061 char m_target_name[MAX_NLEN];
4062 monster_desc(m_target_name, m_ptr, 0);
4065 msg_format(_("%^sに反撃した!", "Your counterattack to %s!"), m_target_name);
4066 py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_COUNTER);
4068 p_ptr->redraw |= (PR_MANA);
4072 if (blinked && alive && !p_ptr->is_dead)
4074 if (teleport_barrier(m_idx))
4076 msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But magic barrier obstructs it."));
4080 msg_print(_("泥棒は笑って逃げた!", "The thief flees laughing!"));
4081 teleport_away(m_idx, MAX_SIGHT * 2 + 5, 0L);
4086 /* Always notice cause of death */
4087 if (p_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !p_ptr->inside_arena)
4092 if (m_ptr->ml && fear && alive && !p_ptr->is_dead)
4095 msg_format(_("%^sは恐怖で逃げ出した!", "%^s flees in terror!"), m_name);
4098 if (p_ptr->special_defense & KATA_IAI)
4100 set_action(ACTION_NONE);
4103 /* Assume we attacked */
4109 * @brief モンスターが敵モンスターに行う打撃処理 /
4110 * Hack, based on mon_take_hit... perhaps all monster attacks on other monsters should use this?
4111 * @param m_idx 目標となるモンスターの参照ID
4113 * @param dead 目標となったモンスターの死亡状態を返す参照ポインタ
4114 * @param fear 目標となったモンスターの恐慌状態を返す参照ポインタ
4115 * @param note 目標モンスターが死亡した場合の特別メッセージ(NULLならば標準表示を行う)
4116 * @param who 打撃を行ったモンスターの参照ID
4119 void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *dead, bool *fear, concptr note, MONSTER_IDX who)
4121 monster_type *m_ptr = ¤t_floor_ptr->m_list[m_idx];
4122 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4123 GAME_TEXT m_name[160];
4124 bool seen = is_seen(m_ptr);
4126 /* Can the player be aware of this attack? */
4127 bool known = (m_ptr->cdis <= MAX_SIGHT);
4129 monster_desc(m_name, m_ptr, 0);
4131 /* Redraw (later) if needed */
4134 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
4135 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
4138 (void)set_monster_csleep(m_idx, 0);
4140 if (p_ptr->riding && (m_idx == p_ptr->riding)) disturb(TRUE, TRUE);
4142 if (MON_INVULNER(m_ptr) && randint0(PENETRATE_INVULNERABILITY))
4146 msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
4151 if (r_ptr->flagsr & RFR_RES_ALL)
4156 if ((dam == 0) && one_in_(3)) dam = 1;
4162 msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
4171 /* It is dead now... or is it? */
4174 if (((r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) ||
4175 (r_ptr->flags7 & RF7_NAZGUL)) &&
4176 !p_ptr->inside_battle)
4183 if (!monster_living(m_ptr->r_idx))
4185 sound(SOUND_N_KILL);
4196 monster_desc(m_name, m_ptr, MD_TRUE_NAME);
4197 /* Unseen death by normal attack */
4200 current_floor_ptr->monster_noise = TRUE;
4202 /* Death by special attack */
4205 msg_format(_("%^s%s", "%^s%s"), m_name, note);
4207 /* Death by normal attack -- nonliving monster */
4208 else if (!monster_living(m_ptr->r_idx))
4210 msg_format(_("%^sは破壊された。", "%^s is destroyed."), m_name);
4212 /* Death by normal attack -- living monster */
4215 msg_format(_("%^sは殺された。", "%^s is killed."), m_name);
4219 monster_gain_exp(who, m_ptr->r_idx);
4220 monster_death(m_idx, FALSE);
4221 delete_monster_idx(m_idx);
4226 /* Monster is dead */
4235 /* Mega-Hack -- Pain cancels fear */
4236 if (MON_MONFEAR(m_ptr) && (dam > 0))
4239 if (set_monster_monfear(m_idx, MON_MONFEAR(m_ptr) - randint1(dam / 4)))
4246 /* Sometimes a monster gets scared by damage */
4247 if (!MON_MONFEAR(m_ptr) && !(r_ptr->flags3 & RF3_NO_FEAR))
4249 /* Percentage of fully healthy */
4250 int percentage = (100L * m_ptr->hp) / m_ptr->maxhp;
4253 * Run (sometimes) if at 10% or less of max hit points,
4254 * or (usually) when hit for half its current hit points
4256 if (((percentage <= 10) && (randint0(10) < percentage)) ||
4257 ((dam >= m_ptr->hp) && (randint0(100) < 80)))
4259 /* Hack -- note fear */
4262 /* Hack -- Add some timed fear */
4263 (void)set_monster_monfear(m_idx, (randint1(10) +
4264 (((dam >= m_ptr->hp) && (percentage > 7)) ?
4265 20 : ((11 - percentage) * 5))));
4269 #endif /* ALLOW_FEAR */
4271 if ((dam > 0) && !is_pet(m_ptr) && !is_friendly(m_ptr) && (who != m_idx))
4273 if (is_pet(¤t_floor_ptr->m_list[who]) && !player_bold(m_ptr->target_y, m_ptr->target_x))
4275 set_target(m_ptr, current_floor_ptr->m_list[who].fy, current_floor_ptr->m_list[who].fx);
4279 if (p_ptr->riding && (p_ptr->riding == m_idx) && (dam > 0))
4281 monster_desc(m_name, m_ptr, 0);
4283 if (m_ptr->hp > m_ptr->maxhp / 3) dam = (dam + 1) / 2;
4284 if (rakuba((dam > 200) ? 200 : dam, FALSE))
4286 msg_format(_("%^sに振り落とされた!", "You have thrown off from %s!"), m_name);