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"
49 * @brief モンスターの打撃効力テーブル /
50 * The table of monsters' blow effects
52 const mbe_info_type mbe_info[] =
55 { 60, GF_MISSILE, }, /* HURT */
56 { 5, GF_POIS, }, /* POISON */
57 { 20, GF_DISENCHANT, }, /* UN_BONUS */
58 { 15, GF_MISSILE, }, /* UN_POWER */ /* ToDo: Apply the correct effects */
59 { 5, GF_MISSILE, }, /* EAT_GOLD */
60 { 5, GF_MISSILE, }, /* EAT_ITEM */
61 { 5, GF_MISSILE, }, /* EAT_FOOD */
62 { 5, GF_MISSILE, }, /* EAT_LITE */
63 { 0, GF_ACID, }, /* ACID */
64 { 10, GF_ELEC, }, /* ELEC */
65 { 10, GF_FIRE, }, /* FIRE */
66 { 10, GF_COLD, }, /* COLD */
67 { 2, GF_MISSILE, }, /* BLIND */
68 { 10, GF_CONFUSION, }, /* CONFUSE */
69 { 10, GF_MISSILE, }, /* TERRIFY */
70 { 2, GF_MISSILE, }, /* PARALYZE */
71 { 0, GF_MISSILE, }, /* LOSE_STR */
72 { 0, GF_MISSILE, }, /* LOSE_INT */
73 { 0, GF_MISSILE, }, /* LOSE_WIS */
74 { 0, GF_MISSILE, }, /* LOSE_DEX */
75 { 0, GF_MISSILE, }, /* LOSE_CON */
76 { 0, GF_MISSILE, }, /* LOSE_CHR */
77 { 2, GF_MISSILE, }, /* LOSE_ALL */
78 { 60, GF_ROCKET, }, /* SHATTER */
79 { 5, GF_MISSILE, }, /* EXP_10 */
80 { 5, GF_MISSILE, }, /* EXP_20 */
81 { 5, GF_MISSILE, }, /* EXP_40 */
82 { 5, GF_MISSILE, }, /* EXP_80 */
83 { 5, GF_POIS, }, /* DISEASE */
84 { 5, GF_TIME, }, /* TIME */
85 { 5, GF_MISSILE, }, /* EXP_VAMP */
86 { 5, GF_MANA, }, /* DR_MANA */
87 { 60, GF_MISSILE, }, /* SUPERHURT */
91 * @brief 幻覚時の打撃記述テーブル / Weird melee attack types when hallucinating
94 const concptr silly_attacks[MAX_SILLY_ATTACK] =
97 "があなたの回りを3回回ってワンと言った。",
105 "に「神の国」発言の撤回を求められた。",
116 "はあなたの100の秘密について熱く語った。",
128 "に二週間以内でビデオを人に見せないと死ぬ呪いをかけられた。",
130 "はスーパーウルトラギャラクティカマグナムを放った。",
132 "にジェットストリームアタックをかけられた。",
133 "はあなたに卍固めをかけて「1、2、3、ダーッ!」と叫んだ。",
134 "は「いくじなし!ばかばかばか!」といって駆け出した。",
135 "が「ごらん、ルーベンスの絵だよ」と言って静かに目を閉じた。",
136 "は言った。「変愚蛮怒、絶賛公開中!」",
140 * @brief 幻覚時の打撃記述テーブル(フォーマットつき) / Weird melee attack types when hallucinating (%s for strfmt())
142 const concptr silly_attacks2[MAX_SILLY_ATTACK] =
145 "%sの回りを3回回ってワンと言った。",
153 "%sに「神の国」発言の撤回を求めた。",
164 "%sの100の秘密について熱く語った。",
176 "%sに二週間以内でビデオを人に見せないと死ぬ呪いをかけた。",
178 "%sにスーパーウルトラギャラクティカマグナムを放った。",
180 "%sにジェットストリームアタックをかけた。",
181 "%sに卍固めをかけて「1、2、3、ダーッ!」と叫んだ。",
182 "「いくじなし!ばかばかばか!」といって駆け出した。",
183 "「ごらん、ルーベンスの絵だよ」と言って静かに目を閉じた。",
187 const concptr silly_attacks[MAX_SILLY_ATTACK] =
198 "makes obscene gestures at",
229 * @brief マーシャルアーツ打撃テーブル
231 const martial_arts ma_blows[MAX_MA] =
234 { "%sを殴った。", 1, 0, 1, 5, 0 },
235 { "%sを蹴った。", 2, 0, 1, 7, 0 },
236 { "%sに正拳突きをくらわした。", 3, 0, 1, 9, 0 },
237 { "%sに膝蹴りをくらわした。", 5, 5, 2, 4, MA_KNEE },
238 { "%sに肘打ちをくらわした。", 7, 5, 1, 12, 0 },
239 { "%sに体当りした。", 9, 10, 2, 6, 0 },
240 { "%sを蹴った。", 11, 10, 3, 6, MA_SLOW },
241 { "%sにアッパーをくらわした。", 13, 12, 5, 5, 6 },
242 { "%sに二段蹴りをくらわした。", 16, 15, 5, 6, 8 },
243 { "%sに猫爪撃をくらわした。", 20, 20, 5, 8, 0 },
244 { "%sに跳空脚をくらわした。", 24, 25, 6, 8, 10 },
245 { "%sに鷲爪襲をくらわした。", 28, 25, 7, 9, 0 },
246 { "%sに回し蹴りをくらわした。", 32, 30, 8, 10, 10 },
247 { "%sに鉄拳撃をくらわした。", 35, 35, 8, 11, 10 },
248 { "%sに飛空脚をくらわした。", 39, 35, 8, 12, 12 },
249 { "%sに昇龍拳をくらわした。", 43, 35, 9, 12, 16 },
250 { "%sに石破天驚拳をくらわした。", 48, 40, 10, 13, 18 },
252 { "You punch %s.", 1, 0, 1, 4, 0 },
253 { "You kick %s.", 2, 0, 1, 6, 0 },
254 { "You strike %s.", 3, 0, 1, 7, 0 },
255 { "You hit %s with your knee.", 5, 5, 2, 3, MA_KNEE },
256 { "You hit %s with your elbow.", 7, 5, 1, 8, 0 },
257 { "You butt %s.", 9, 10, 2, 5, 0 },
258 { "You kick %s.", 11, 10, 3, 4, MA_SLOW },
259 { "You uppercut %s.", 13, 12, 4, 4, 6 },
260 { "You double-kick %s.", 16, 15, 5, 4, 8 },
261 { "You hit %s with a Cat's Claw.", 20, 20, 5, 5, 0 },
262 { "You hit %s with a jump kick.", 25, 25, 5, 6, 10 },
263 { "You hit %s with an Eagle's Claw.", 29, 25, 6, 6, 0 },
264 { "You hit %s with a circle kick.", 33, 30, 6, 8, 10 },
265 { "You hit %s with an Iron Fist.", 37, 35, 8, 8, 10 },
266 { "You hit %s with a flying kick.", 41, 35, 8, 10, 12 },
267 { "You hit %s with a Dragon Fist.", 45, 35, 10, 10, 16 },
268 { "You hit %s with a Crushing Blow.", 48, 35, 10, 12, 18 },
274 * @brief 修行僧のターンダメージ算出テーブル
276 const int monk_ave_damage[PY_MAX_LEVEL + 1][3] =
333 * Stat Table (STR) -- help index into the "blow" table
335 const byte adj_str_blow[] =
352 20 /* 18/00-18/09 */,
353 30 /* 18/10-18/19 */,
354 40 /* 18/20-18/29 */,
355 50 /* 18/30-18/39 */,
356 60 /* 18/40-18/49 */,
357 70 /* 18/50-18/59 */,
358 80 /* 18/60-18/69 */,
359 90 /* 18/70-18/79 */,
360 100 /* 18/80-18/89 */,
361 110 /* 18/90-18/99 */,
362 120 /* 18/100-18/109 */,
363 130 /* 18/110-18/119 */,
364 140 /* 18/120-18/129 */,
365 150 /* 18/130-18/139 */,
366 160 /* 18/140-18/149 */,
367 170 /* 18/150-18/159 */,
368 180 /* 18/160-18/169 */,
369 190 /* 18/170-18/179 */,
370 200 /* 18/180-18/189 */,
371 210 /* 18/190-18/199 */,
372 220 /* 18/200-18/209 */,
373 230 /* 18/210-18/219 */,
379 * 器用さによる攻撃回数インデックステーブル
380 * Stat Table (DEX) -- index into the "blow" table
382 const byte adj_dex_blow[] =
409 7 /* 18/100-18/109 */,
410 7 /* 18/110-18/119 */,
411 8 /* 18/120-18/129 */,
412 8 /* 18/130-18/139 */,
413 9 /* 18/140-18/149 */,
414 9 /* 18/150-18/159 */,
415 10 /* 18/160-18/169 */,
416 10 /* 18/170-18/179 */,
417 11 /* 18/180-18/189 */,
418 11 /* 18/190-18/199 */,
419 12 /* 18/200-18/209 */,
420 12 /* 18/210-18/219 */,
427 * 腕力、器用さに応じた攻撃回数テーブル /
428 * This table is used to help calculate the number of blows the player can
429 * make in a single round of attacks (one player current_world_ptr->game_turn) with a normal weapon.
432 * This number ranges from a single blow/round for weak players to up to six
433 * blows/round for powerful warriors.
435 * Note that certain artifacts and ego-items give "bonus" blows/round.
437 * First, from the player class, we extract some values:
439 * Warrior num = 6; mul = 5; div = MAX(70, weapon_weight);
440 * Berserker num = 6; mul = 7; div = MAX(70, weapon_weight);
441 * Mage num = 3; mul = 2; div = MAX(100, weapon_weight);
442 * Priest num = 5; mul = 3; div = MAX(100, weapon_weight);
443 * Mindcrafter num = 5; mul = 3; div = MAX(100, weapon_weight);
444 * Rogue num = 5; mul = 3; div = MAX(40, weapon_weight);
445 * Ranger num = 5; mul = 4; div = MAX(70, weapon_weight);
446 * Paladin num = 5; mul = 4; div = MAX(70, weapon_weight);
447 * Weaponsmith num = 5; mul = 5; div = MAX(150, weapon_weight);
448 * Warrior-Mage num = 5; mul = 3; div = MAX(70, weapon_weight);
449 * Chaos Warrior num = 5; mul = 4; div = MAX(70, weapon_weight);
450 * Monk num = 5; mul = 3; div = MAX(60, weapon_weight);
451 * Tourist num = 4; mul = 3; div = MAX(100, weapon_weight);
452 * Imitator num = 5; mul = 4; div = MAX(70, weapon_weight);
453 * Beastmaster num = 5; mul = 3; div = MAX(70, weapon_weight);
454 * Cavalry(Ride) num = 5; mul = 4; div = MAX(70, weapon_weight);
455 * Cavalry(Walk) num = 5; mul = 3; div = MAX(100, weapon_weight);
456 * Sorcerer num = 1; mul = 1; div = MAX(1, weapon_weight);
457 * Archer num = 4; mul = 2; div = MAX(70, weapon_weight);
458 * Magic eater num = 4; mul = 2; div = MAX(70, weapon_weight);
459 * ForceTrainer num = 4; mul = 2; div = MAX(60, weapon_weight);
460 * Mirror Master num = 3; mul = 3; div = MAX(100, weapon_weight);
461 * Ninja num = 4; mul = 1; div = MAX(20, weapon_weight);
463 * To get "P", we look up the relevant "adj_str_blow[]" (see above),
464 * multiply it by "mul", and then divide it by "div".
465 * Increase P by 1 if you wield a weapon two-handed.
466 * Decrease P by 1 if you are a Ninja.
468 * To get "D", we look up the relevant "adj_dex_blow[]" (see above),
470 * The player gets "blows_table[P][D]" blows/round, as shown below,
471 * up to a maximum of "num" blows/round, plus any "bonus" blows/round.
474 const byte blows_table[12][12] =
477 /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11+ */
478 /* 3 10 15 /10 /40 /60 /80 /100 /120 /140 /160 /180 */
479 /* 0 */{ 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4 },
480 /* 1 */{ 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4 },
481 /* 2 */{ 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5 },
482 /* 3 */{ 1, 1, 2, 3, 3, 4, 4, 4, 5, 5, 5, 5 },
483 /* 4 */{ 1, 1, 2, 3, 3, 4, 4, 5, 5, 5, 5, 5 },
484 /* 5 */{ 1, 1, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6 },
485 /* 6 */{ 1, 1, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6 },
486 /* 7 */{ 1, 2, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6 },
487 /* 8 */{ 1, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6 },
488 /* 9 */{ 1, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6 },
489 /* 10*/{ 2, 2, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6 },
490 /*11+*/{ 2, 2, 3, 4, 4, 4, 5, 5, 6, 6, 6, 6 },
494 * @brief プレイヤーからモンスターへの打撃命中判定 /
495 * Determine if the player "hits" a monster (normal combat).
496 * @param chance 基本命中値
498 * @param visible 目標を視界に捕らえているならばTRUEを指定
499 * @return 命中と判定された場合TRUEを返す
500 * @note Always miss 5%, always hit 5%, otherwise random.
502 bool test_hit_norm(HIT_RELIABILITY chance, ARMOUR_CLASS ac, bool visible)
504 if (!visible) chance = (chance + 1) / 2;
505 return hit_chance(chance, ac) >= randint1(100);
509 * @brief モンスターへの命中率の計算
514 PERCENTAGE hit_chance(HIT_RELIABILITY reli, ARMOUR_CLASS ac)
516 PERCENTAGE chance = 5, chance_left = 90;
517 if(reli <= 0) return 5;
518 if(p_ptr->pseikaku == SEIKAKU_NAMAKE) chance_left = (chance_left * 19 + 9) / 20;
519 chance += (100 - ((ac * 75) / reli)) * chance_left / 100;
520 if (chance < 5) chance = 5;
525 * @brief プレイヤー攻撃の種族スレイング倍率計算
526 * @param mult 算出前の基本倍率(/10倍)
527 * @param flgs スレイフラグ配列
528 * @param m_ptr 目標モンスターの構造体参照ポインタ
529 * @return スレイング加味後の倍率(/10倍)
531 static MULTIPLY mult_slaying(MULTIPLY mult, const BIT_FLAGS* flgs, const monster_type* m_ptr)
533 static const struct slay_table_t {
535 BIT_FLAGS affect_race_flag;
538 size_t r_flag_offset;
540 #define OFFSET(X) offsetof(monster_race, X)
541 {TR_SLAY_ANIMAL, RF3_ANIMAL, 25, OFFSET(flags3), OFFSET(r_flags3)},
542 {TR_KILL_ANIMAL, RF3_ANIMAL, 40, OFFSET(flags3), OFFSET(r_flags3)},
543 {TR_SLAY_EVIL, RF3_EVIL, 20, OFFSET(flags3), OFFSET(r_flags3)},
544 {TR_KILL_EVIL, RF3_EVIL, 35, OFFSET(flags3), OFFSET(r_flags3)},
545 {TR_SLAY_GOOD, RF3_GOOD, 20, OFFSET(flags3), OFFSET(r_flags3)},
546 {TR_KILL_GOOD, RF3_GOOD, 35, OFFSET(flags3), OFFSET(r_flags3)},
547 {TR_SLAY_HUMAN, RF2_HUMAN, 25, OFFSET(flags2), OFFSET(r_flags2)},
548 {TR_KILL_HUMAN, RF2_HUMAN, 40, OFFSET(flags2), OFFSET(r_flags2)},
549 {TR_SLAY_UNDEAD, RF3_UNDEAD, 30, OFFSET(flags3), OFFSET(r_flags3)},
550 {TR_KILL_UNDEAD, RF3_UNDEAD, 50, OFFSET(flags3), OFFSET(r_flags3)},
551 {TR_SLAY_DEMON, RF3_DEMON, 30, OFFSET(flags3), OFFSET(r_flags3)},
552 {TR_KILL_DEMON, RF3_DEMON, 50, OFFSET(flags3), OFFSET(r_flags3)},
553 {TR_SLAY_ORC, RF3_ORC, 30, OFFSET(flags3), OFFSET(r_flags3)},
554 {TR_KILL_ORC, RF3_ORC, 50, OFFSET(flags3), OFFSET(r_flags3)},
555 {TR_SLAY_TROLL, RF3_TROLL, 30, OFFSET(flags3), OFFSET(r_flags3)},
556 {TR_KILL_TROLL, RF3_TROLL, 50, OFFSET(flags3), OFFSET(r_flags3)},
557 {TR_SLAY_GIANT, RF3_GIANT, 30, OFFSET(flags3), OFFSET(r_flags3)},
558 {TR_KILL_GIANT, RF3_GIANT, 50, OFFSET(flags3), OFFSET(r_flags3)},
559 {TR_SLAY_DRAGON, RF3_DRAGON, 30, OFFSET(flags3), OFFSET(r_flags3)},
560 {TR_KILL_DRAGON, RF3_DRAGON, 50, OFFSET(flags3), OFFSET(r_flags3)},
564 monster_race* r_ptr = &r_info[m_ptr->r_idx];
566 for (i = 0; i < sizeof(slay_table) / sizeof(slay_table[0]); ++i)
568 const struct slay_table_t* p = &slay_table[i];
570 if ((have_flag(flgs, p->slay_flag)) &&
571 (atoffset(BIT_FLAGS, r_ptr, p->flag_offset) & p->affect_race_flag))
573 if (is_original_ap_and_seen(m_ptr))
575 atoffset(BIT_FLAGS, r_ptr, p->r_flag_offset) |= p->affect_race_flag;
578 mult = MAX(mult, p->slay_mult);
586 * @brief プレイヤー攻撃の属性スレイング倍率計算
587 * @param mult 算出前の基本倍率(/10倍)
588 * @param flgs スレイフラグ配列
589 * @param m_ptr 目標モンスターの構造体参照ポインタ
590 * @return スレイング加味後の倍率(/10倍)
592 static MULTIPLY mult_brand(MULTIPLY mult, const BIT_FLAGS* flgs, const monster_type* m_ptr)
594 static const struct brand_table_t {
596 BIT_FLAGS resist_mask;
599 {TR_BRAND_ACID, RFR_EFF_IM_ACID_MASK, 0U },
600 {TR_BRAND_ELEC, RFR_EFF_IM_ELEC_MASK, 0U },
601 {TR_BRAND_FIRE, RFR_EFF_IM_FIRE_MASK, RF3_HURT_FIRE},
602 {TR_BRAND_COLD, RFR_EFF_IM_COLD_MASK, RF3_HURT_COLD},
603 {TR_BRAND_POIS, RFR_EFF_IM_POIS_MASK, 0U },
606 monster_race* r_ptr = &r_info[m_ptr->r_idx];
608 for (i = 0; i < sizeof(brand_table) / sizeof(brand_table[0]); ++i)
610 const struct brand_table_t* p = &brand_table[i];
612 if (have_flag(flgs, p->brand_flag))
614 /* Notice immunity */
615 if (r_ptr->flagsr & p->resist_mask)
617 if (is_original_ap_and_seen(m_ptr))
619 r_ptr->r_flagsr |= (r_ptr->flagsr & p->resist_mask);
623 /* Otherwise, take the damage */
624 else if (r_ptr->flags3 & p->hurt_flag)
626 if (is_original_ap_and_seen(m_ptr))
628 r_ptr->r_flags3 |= p->hurt_flag;
631 mult = MAX(mult, 50);
635 mult = MAX(mult, 25);
644 * @brief 剣術のスレイ倍率計算を行う /
645 * Calcurate magnification of hissatsu technics
646 * @param mult 剣術のスレイ効果以前に算出している多要素の倍率(/10倍)
647 * @param flgs 剣術に使用する武器のスレイフラグ配列
648 * @param m_ptr 目標となるモンスターの構造体参照ポインタ
649 * @param mode 剣術のスレイ型ID
650 * @return スレイの倍率(/10倍)
652 static MULTIPLY mult_hissatsu(MULTIPLY mult, BIT_FLAGS *flgs, monster_type *m_ptr, BIT_FLAGS mode)
654 monster_race *r_ptr = &r_info[m_ptr->r_idx];
656 /* Burning Strike (Fire) */
657 if (mode == HISSATSU_FIRE)
659 /* Notice immunity */
660 if (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK)
662 if (is_original_ap_and_seen(m_ptr))
664 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
668 /* Otherwise, take the damage */
669 else if (have_flag(flgs, TR_BRAND_FIRE))
671 if (r_ptr->flags3 & RF3_HURT_FIRE)
673 if (mult < 70) mult = 70;
674 if (is_original_ap_and_seen(m_ptr))
676 r_ptr->r_flags3 |= RF3_HURT_FIRE;
679 else if (mult < 35) mult = 35;
683 if (r_ptr->flags3 & RF3_HURT_FIRE)
685 if (mult < 50) mult = 50;
686 if (is_original_ap_and_seen(m_ptr))
688 r_ptr->r_flags3 |= RF3_HURT_FIRE;
691 else if (mult < 25) mult = 25;
695 /* Serpent's Tongue (Poison) */
696 if (mode == HISSATSU_POISON)
698 /* Notice immunity */
699 if (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK)
701 if (is_original_ap_and_seen(m_ptr))
703 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK);
707 /* Otherwise, take the damage */
708 else if (have_flag(flgs, TR_BRAND_POIS))
710 if (mult < 35) mult = 35;
714 if (mult < 25) mult = 25;
718 /* Zammaken (Nonliving Evil) */
719 if (mode == HISSATSU_ZANMA)
721 if (!monster_living(m_ptr->r_idx) && (r_ptr->flags3 & RF3_EVIL))
723 if (mult < 15) mult = 25;
724 else if (mult < 50) mult = MIN(50, mult + 20);
728 /* Rock Smash (Hurt Rock) */
729 if (mode == HISSATSU_HAGAN)
731 if (r_ptr->flags3 & RF3_HURT_ROCK)
733 if (is_original_ap_and_seen(m_ptr))
735 r_ptr->r_flags3 |= RF3_HURT_ROCK;
737 if (mult == 10) mult = 40;
738 else if (mult < 60) mult = 60;
742 /* Midare-Setsugekka (Cold) */
743 if (mode == HISSATSU_COLD)
745 /* Notice immunity */
746 if (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK)
748 if (is_original_ap_and_seen(m_ptr))
750 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
753 /* Otherwise, take the damage */
754 else if (have_flag(flgs, TR_BRAND_COLD))
756 if (r_ptr->flags3 & RF3_HURT_COLD)
758 if (mult < 70) mult = 70;
759 if (is_original_ap_and_seen(m_ptr))
761 r_ptr->r_flags3 |= RF3_HURT_COLD;
764 else if (mult < 35) mult = 35;
768 if (r_ptr->flags3 & RF3_HURT_COLD)
770 if (mult < 50) mult = 50;
771 if (is_original_ap_and_seen(m_ptr))
773 r_ptr->r_flags3 |= RF3_HURT_COLD;
776 else if (mult < 25) mult = 25;
780 /* Lightning Eagle (Elec) */
781 if (mode == HISSATSU_ELEC)
783 /* Notice immunity */
784 if (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK)
786 if (is_original_ap_and_seen(m_ptr))
788 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
792 /* Otherwise, take the damage */
793 else if (have_flag(flgs, TR_BRAND_ELEC))
795 if (mult < 70) mult = 70;
799 if (mult < 50) mult = 50;
803 /* Bloody Maelstrom */
804 if ((mode == HISSATSU_SEKIRYUKA) && p_ptr->cut && monster_living(m_ptr->r_idx))
806 MULTIPLY tmp = MIN(100, MAX(10, p_ptr->cut / 10));
807 if (mult < tmp) mult = tmp;
811 if (mode == HISSATSU_UNDEAD)
813 if (r_ptr->flags3 & RF3_UNDEAD)
815 if (is_original_ap_and_seen(m_ptr))
817 r_ptr->r_flags3 |= RF3_UNDEAD;
819 if (mult == 10) mult = 70;
820 else if (mult < 140) mult = MIN(140, mult + 60);
822 if (mult == 10) mult = 40;
823 else if (mult < 60) mult = MIN(60, mult + 30);
826 if (mult > 150) mult = 150;
832 * @brief ダメージにスレイ要素を加える総合処理ルーチン /
833 * Extract the "total damage" from a given object hitting a given monster.
834 * @param o_ptr 使用武器オブジェクトの構造体参照ポインタ
835 * @param tdam 現在算出途中のダメージ値
836 * @param m_ptr 目標モンスターの構造体参照ポインタ
838 * @param thrown 投擲処理ならばTRUEを指定する
839 * @return 総合的なスレイを加味したダメージ値
841 * Note that "flasks of oil" do NOT do fire damage, although they\n
842 * certainly could be made to do so. XXX XXX\n
844 * Note that most brands and slays are x3, except Slay Animal (x2),\n
845 * Slay Evil (x2), and Kill dragon (x5).\n
847 HIT_POINT tot_dam_aux(object_type *o_ptr, HIT_POINT tdam, monster_type *m_ptr, BIT_FLAGS mode, bool thrown)
851 BIT_FLAGS flgs[TR_FLAG_SIZE];
852 object_flags(o_ptr, flgs);
853 torch_flags(o_ptr, flgs); /* torches has secret flags */
857 if (p_ptr->special_attack & (ATTACK_ACID)) add_flag(flgs, TR_BRAND_ACID);
858 if (p_ptr->special_attack & (ATTACK_COLD)) add_flag(flgs, TR_BRAND_COLD);
859 if (p_ptr->special_attack & (ATTACK_ELEC)) add_flag(flgs, TR_BRAND_ELEC);
860 if (p_ptr->special_attack & (ATTACK_FIRE)) add_flag(flgs, TR_BRAND_FIRE);
861 if (p_ptr->special_attack & (ATTACK_POIS)) add_flag(flgs, TR_BRAND_POIS);
864 if (hex_spelling(HEX_RUNESWORD)) add_flag(flgs, TR_SLAY_GOOD);
877 mult = mult_slaying(mult, flgs, m_ptr);
879 mult = mult_brand(mult, flgs, m_ptr);
881 if (p_ptr->pclass == CLASS_SAMURAI)
883 mult = mult_hissatsu(mult, flgs, m_ptr, mode);
886 if ((p_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs, TR_FORCE_WEAPON)) && (p_ptr->csp > (o_ptr->dd * o_ptr->ds / 5)))
888 p_ptr->csp -= (1 + (o_ptr->dd * o_ptr->ds / 5));
889 p_ptr->redraw |= (PR_MANA);
890 mult = mult * 3 / 2 + 20;
893 if ((o_ptr->name1 == ART_NOTHUNG) && (m_ptr->r_idx == MON_FAFNER))
898 if (mult > 150) mult = 150;
900 return (tdam * mult / 10);
904 * @brief プレイヤーからモンスターへの打撃クリティカル判定 /
905 * Critical hits (by player) Factor in weapon weight, total plusses, player melee bonus
906 * @param weight 矢弾の重量
907 * @param plus 武器の命中修正
908 * @param dam 現在算出中のダメージ値
909 * @param meichuu 打撃の基本命中力
910 * @param mode オプションフラグ
911 * @return クリティカル修正が入ったダメージ値
913 HIT_POINT critical_norm(WEIGHT weight, int plus, HIT_POINT dam, s16b meichuu, BIT_FLAGS mode)
917 /* Extract "blow" power */
918 i = (weight + (meichuu * 3 + plus * 5) + p_ptr->skill_thn);
921 if ((randint1((p_ptr->pclass == CLASS_NINJA) ? 4444 : 5000) <= i) || (mode == HISSATSU_MAJIN) || (mode == HISSATSU_3DAN))
923 k = weight + randint1(650);
924 if ((mode == HISSATSU_MAJIN) || (mode == HISSATSU_3DAN)) k += randint1(650);
928 msg_print(_("手ごたえがあった!", "It was a good hit!"));
934 msg_print(_("かなりの手ごたえがあった!", "It was a great hit!"));
939 msg_print(_("会心の一撃だ!", "It was a superb hit!"));
944 msg_print(_("最高の会心の一撃だ!", "It was a *GREAT* hit!"));
949 msg_print(_("比類なき最高の会心の一撃だ!", "It was a *SUPERB* hit!"));
950 dam = ((7 * dam) / 2) + 25;
958 * @brief モンスター打撃のクリティカルランクを返す /
959 * Critical blow. All hits that do 95% of total possible damage,
960 * @param dice モンスター打撃のダイス数
961 * @param sides モンスター打撃の最大ダイス目
962 * @param dam プレイヤーに与えたダメージ
964 * and which also do at least 20 damage, or, sometimes, N damage.
965 * This is used only to determine "cuts" and "stuns".
967 static int monster_critical(DICE_NUMBER dice, DICE_SID sides, HIT_POINT dam)
970 int total = dice * sides;
972 /* Must do at least 95% of perfect */
973 if (dam < total * 19 / 20) return (0);
975 /* Weak blows rarely work */
976 if ((dam < 20) && (randint0(100) >= dam)) return (0);
979 if ((dam >= total) && (dam >= 40)) max++;
984 while (randint0(100) < 2) max++;
987 /* Critical damage */
988 if (dam > 45) return (6 + max);
989 if (dam > 33) return (5 + max);
990 if (dam > 25) return (4 + max);
991 if (dam > 18) return (3 + max);
992 if (dam > 11) return (2 + max);
997 * @brief モンスター打撃の命中を判定する /
998 * Determine if a monster attack against the player succeeds.
999 * @param power 打撃属性毎の基本命中値
1000 * @param level モンスターのレベル
1001 * @param stun モンスターの朦朧値
1002 * @return TRUEならば命中判定
1004 * Always miss 5% of the time, Always hit 5% of the time.
1005 * Otherwise, match monster power against player armor.
1007 static int check_hit(int power, DEPTH level, int stun)
1011 /* Percentile dice */
1014 if (stun && one_in_(2)) return FALSE;
1016 /* Hack -- Always miss or hit */
1017 if (k < 10) return (k < 5);
1019 /* Calculate the "attack quality" */
1020 i = (power + (level * 3));
1023 ac = p_ptr->ac + p_ptr->to_a;
1024 if (p_ptr->special_attack & ATTACK_SUIKEN) ac += (p_ptr->lev * 2);
1026 /* Power and Level compete against Armor */
1027 if ((i > 0) && (randint1(i) > ((ac * 3) / 4))) return (TRUE);
1033 /*! モンスターの侮辱行為メッセージテーブル / Hack -- possible "insult" messages */
1034 static concptr desc_insult[] =
1045 "があなたをパラサイト呼ばわりした!",
1049 "insults your mother!",
1050 "gives you the finger!",
1053 "dances around you!",
1054 "makes obscene gestures!",
1056 "calls you a parasite!",
1057 "calls you a cyborg!"
1062 /*! マゴットのぼやきメッセージテーブル / Hack -- possible "insult" messages */
1063 static concptr desc_moan[] =
1067 "が彼の飼い犬を見なかったかと尋ねている。",
1068 "が縄張りから出て行けと言っている。",
1071 "seems sad about something.",
1072 "asks if you have seen his dogs.",
1073 "tells you to get off his land.",
1074 "mumbles something about mushrooms."
1080 * @brief 敵オーラによるプレイヤーのダメージ処理(補助)
1081 * @param m_ptr オーラを持つモンスターの構造体参照ポインタ
1082 * @param immune ダメージを回避できる免疫フラグ
1083 * @param flags_offset オーラフラグ配列の参照オフセット
1084 * @param r_flags_offset モンスターの耐性配列の参照オフセット
1085 * @param aura_flag オーラフラグ配列
1086 * @param dam_func ダメージ処理を行う関数の参照ポインタ
1087 * @param message オーラダメージを受けた際のメッセージ
1090 static void touch_zap_player_aux(monster_type *m_ptr, bool immune, int flags_offset, int r_flags_offset, u32b aura_flag,
1091 HIT_POINT(*dam_func)(HIT_POINT dam, concptr kb_str, int monspell, bool aura), concptr message)
1093 monster_race *r_ptr = &r_info[m_ptr->r_idx];
1095 if ((atoffset(BIT_FLAGS, r_ptr, flags_offset) & aura_flag) && !immune)
1097 GAME_TEXT mon_name[MAX_NLEN];
1098 int aura_damage = damroll(1 + (r_ptr->level / 26), 1 + (r_ptr->level / 17));
1100 monster_desc(mon_name, m_ptr, MD_WRONGDOER_NAME);
1102 dam_func(aura_damage, mon_name, -1, TRUE);
1104 if (is_original_ap_and_seen(m_ptr))
1106 atoffset(BIT_FLAGS, r_ptr, r_flags_offset) |= aura_flag;
1114 * @brief 敵オーラによるプレイヤーのダメージ処理(メイン)
1115 * @param m_ptr オーラを持つモンスターの構造体参照ポインタ
1118 static void touch_zap_player(monster_type *m_ptr)
1120 touch_zap_player_aux(m_ptr, p_ptr->immune_fire, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_FIRE,
1121 fire_dam, _("突然とても熱くなった!", "You are suddenly very hot!"));
1122 touch_zap_player_aux(m_ptr, p_ptr->immune_cold, offsetof(monster_race, flags3), offsetof(monster_race, r_flags3), RF3_AURA_COLD,
1123 cold_dam, _("突然とても寒くなった!", "You are suddenly very cold!"));
1124 touch_zap_player_aux(m_ptr, p_ptr->immune_elec, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_ELEC,
1125 elec_dam, _("電撃をくらった!", "You get zapped!"));
1129 * @brief プレイヤーの変異要素による打撃処理
1130 * @param m_idx 攻撃目標となったモンスターの参照ID
1131 * @param attack 変異要素による攻撃要素の種類
1132 * @param fear 攻撃を受けたモンスターが恐慌状態に陥ったかを返す参照ポインタ
1133 * @param mdeath 攻撃を受けたモンスターが死亡したかを返す参照ポインタ
1136 static void natural_attack(MONSTER_IDX m_idx, int attack, bool *fear, bool *mdeath)
1140 WEIGHT n_weight = 0;
1141 monster_type *m_ptr = ¤t_floor_ptr->m_list[m_idx];
1142 monster_race *r_ptr = &r_info[m_ptr->r_idx];
1143 GAME_TEXT m_name[MAX_NLEN];
1145 int dice_num, dice_side;
1151 case MUT2_SCOR_TAIL:
1155 atk_desc = _("尻尾", "tail");
1162 atk_desc = _("角", "horns");
1169 atk_desc = _("クチバシ", "beak");
1176 atk_desc = _("象の鼻", "trunk");
1179 case MUT2_TENTACLES:
1183 atk_desc = _("触手", "tentacles");
1187 dice_num = dice_side = n_weight = 1;
1188 atk_desc = _("未定義の部位", "undefined body part");
1192 monster_desc(m_name, m_ptr, 0);
1194 /* Calculate the "attack quality" */
1195 bonus = p_ptr->to_h_m + (p_ptr->lev * 6 / 5);
1196 chance = (p_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
1199 if ((!(r_ptr->flags2 & RF2_QUANTUM) || !randint0(2)) && test_hit_norm(chance, r_ptr->ac, m_ptr->ml))
1202 msg_format(_("%sを%sで攻撃した。", "You hit %s with your %s."), m_name, atk_desc);
1204 k = damroll(dice_num, dice_side);
1205 k = critical_norm(n_weight, bonus, k, (s16b)bonus, 0);
1207 /* Apply the player damage bonuses */
1210 /* No negative damage */
1213 /* Modify the damage */
1214 k = mon_damage_mod(m_ptr, k, FALSE);
1216 /* Complex message */
1217 msg_format_wizard(CHEAT_MONSTER,
1218 _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"),
1219 k, m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
1221 /* Anger the monster */
1222 if (k > 0) anger_monster(m_ptr);
1224 /* Damage, check for fear and mdeath */
1227 case MUT2_SCOR_TAIL:
1228 project(0, 0, m_ptr->fy, m_ptr->fx, k, GF_POIS, PROJECT_KILL, -1);
1229 *mdeath = (m_ptr->r_idx == 0);
1232 *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1235 *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1238 *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1240 case MUT2_TENTACLES:
1241 *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1244 *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1247 touch_zap_player(m_ptr);
1253 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
1258 * @brief プレイヤーの打撃処理サブルーチン /
1259 * Player attacks a (poor, defenseless) creature -RAK-
1262 * @param fear 攻撃を受けたモンスターが恐慌状態に陥ったかを返す参照ポインタ
1263 * @param mdeath 攻撃を受けたモンスターが死亡したかを返す参照ポインタ
1264 * @param hand 攻撃を行うための武器を持つ手
1265 * @param mode 発動中の剣術ID
1268 * If no "weapon" is available, then "punch" the monster one time.
1270 static void py_attack_aux(POSITION y, POSITION x, bool *fear, bool *mdeath, s16b hand, COMBAT_OPTION_IDX mode)
1272 int num = 0, bonus, chance, vir;
1275 grid_type *g_ptr = ¤t_floor_ptr->grid_array[y][x];
1277 monster_type *m_ptr = ¤t_floor_ptr->m_list[g_ptr->m_idx];
1278 monster_race *r_ptr = &r_info[m_ptr->r_idx];
1280 /* Access the weapon */
1281 object_type *o_ptr = &p_ptr->inventory_list[INVEN_RARM + hand];
1283 GAME_TEXT m_name[MAX_NLEN];
1285 bool success_hit = FALSE;
1286 bool backstab = FALSE;
1287 bool vorpal_cut = FALSE;
1288 int chaos_effect = 0;
1289 bool stab_fleeing = FALSE;
1290 bool fuiuchi = FALSE;
1291 bool monk_attack = FALSE;
1292 bool do_quake = FALSE;
1294 bool drain_msg = TRUE;
1295 int drain_result = 0, drain_heal = 0;
1296 bool can_drain = FALSE;
1298 int drain_left = MAX_VAMPIRIC_DRAIN;
1299 BIT_FLAGS flgs[TR_FLAG_SIZE]; /* A massive hack -- life-draining weapons */
1300 bool is_human = (r_ptr->d_char == 'p');
1301 bool is_lowlevel = (r_ptr->level < (p_ptr->lev - 15));
1302 bool zantetsu_mukou, e_j_mukou;
1304 switch (p_ptr->pclass)
1308 if (has_melee_weapon(INVEN_RARM + hand) && !p_ptr->icky_wield[hand])
1310 int tmp = p_ptr->lev * 6 + (p_ptr->skill_stl + 10) * 4;
1311 if (p_ptr->monlite && (mode != HISSATSU_NYUSIN)) tmp /= 3;
1312 if (p_ptr->cursed & TRC_AGGRAVATE) tmp /= 2;
1313 if (r_ptr->level > (p_ptr->lev * p_ptr->lev / 20 + 10)) tmp /= 3;
1314 if (MON_CSLEEP(m_ptr) && m_ptr->ml)
1316 /* Can't backstab creatures that we can't see, right? */
1319 else if ((p_ptr->special_defense & NINJA_S_STEALTH) && (randint0(tmp) > (r_ptr->level + 20)) && m_ptr->ml && !(r_ptr->flagsr & RFR_RES_ALL))
1323 else if (MON_MONFEAR(m_ptr) && m_ptr->ml)
1325 stab_fleeing = TRUE;
1331 case CLASS_FORCETRAINER:
1332 case CLASS_BERSERKER:
1333 if ((empty_hands(TRUE) & EMPTY_HAND_RARM) && !p_ptr->riding) monk_attack = TRUE;
1337 if (!o_ptr->k_idx) /* Empty hand */
1339 if ((r_ptr->level + 10) > p_ptr->lev)
1341 if (p_ptr->skill_exp[GINOU_SUDE] < s_info[p_ptr->pclass].s_max[GINOU_SUDE])
1343 if (p_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_BEGINNER)
1344 p_ptr->skill_exp[GINOU_SUDE] += 40;
1345 else if ((p_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_SKILLED))
1346 p_ptr->skill_exp[GINOU_SUDE] += 5;
1347 else if ((p_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_EXPERT) && (p_ptr->lev > 19))
1348 p_ptr->skill_exp[GINOU_SUDE] += 1;
1349 else if ((p_ptr->lev > 34))
1350 if (one_in_(3)) p_ptr->skill_exp[GINOU_SUDE] += 1;
1351 p_ptr->update |= (PU_BONUS);
1355 else if (object_is_melee_weapon(o_ptr))
1357 if ((r_ptr->level + 10) > p_ptr->lev)
1359 OBJECT_TYPE_VALUE tval = p_ptr->inventory_list[INVEN_RARM + hand].tval - TV_WEAPON_BEGIN;
1360 OBJECT_SUBTYPE_VALUE sval = p_ptr->inventory_list[INVEN_RARM + hand].sval;
1361 int now_exp = p_ptr->weapon_exp[tval][sval];
1362 if (now_exp < s_info[p_ptr->pclass].w_max[tval][sval])
1365 if (now_exp < WEAPON_EXP_BEGINNER) amount = 80;
1366 else if (now_exp < WEAPON_EXP_SKILLED) amount = 10;
1367 else if ((now_exp < WEAPON_EXP_EXPERT) && (p_ptr->lev > 19)) amount = 1;
1368 else if ((p_ptr->lev > 34) && one_in_(2)) amount = 1;
1369 p_ptr->weapon_exp[tval][sval] += amount;
1370 p_ptr->update |= (PU_BONUS);
1375 /* Disturb the monster */
1376 (void)set_monster_csleep(g_ptr->m_idx, 0);
1378 monster_desc(m_name, m_ptr, 0);
1380 /* Calculate the "attack quality" */
1381 bonus = p_ptr->to_h[hand] + o_ptr->to_h;
1382 chance = (p_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
1383 if (mode == HISSATSU_IAI) chance += 60;
1384 if (p_ptr->special_defense & KATA_KOUKIJIN) chance += 150;
1385 if (p_ptr->sutemi) chance = MAX(chance * 3 / 2, chance + 60);
1387 vir = virtue_number(V_VALOUR);
1390 chance += (p_ptr->virtues[vir - 1] / 10);
1393 zantetsu_mukou = ((o_ptr->name1 == ART_ZANTETSU) && (r_ptr->d_char == 'j'));
1394 e_j_mukou = ((o_ptr->name1 == ART_EXCALIBUR_J) && (r_ptr->d_char == 'S'));
1396 if ((mode == HISSATSU_KYUSHO) || (mode == HISSATSU_MINEUCHI) || (mode == HISSATSU_3DAN) || (mode == HISSATSU_IAI)) num_blow = 1;
1397 else if (mode == HISSATSU_COLD) num_blow = p_ptr->num_blow[hand] + 2;
1398 else num_blow = p_ptr->num_blow[hand];
1400 /* Hack -- DOKUBARI always hit once */
1401 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) num_blow = 1;
1403 /* Attack once for each legal blow */
1404 while ((num++ < num_blow) && !p_ptr->is_dead)
1406 if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) || (mode == HISSATSU_KYUSHO))
1410 if (p_ptr->migite && p_ptr->hidarite)
1414 if (mode == HISSATSU_3DAN)
1419 success_hit = one_in_(n);
1421 else if ((p_ptr->pclass == CLASS_NINJA) && ((backstab || fuiuchi) && !(r_ptr->flagsr & RFR_RES_ALL))) success_hit = TRUE;
1422 else success_hit = test_hit_norm(chance, r_ptr->ac, m_ptr->ml);
1424 if (mode == HISSATSU_MAJIN)
1427 success_hit = FALSE;
1433 int vorpal_chance = ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD)) ? 2 : 4;
1437 if (backstab) msg_format(_("あなたは冷酷にも眠っている無力な%sを突き刺した!", "You cruelly stab the helpless, sleeping %s!"), m_name);
1438 else if (fuiuchi) msg_format(_("不意を突いて%sに強烈な一撃を喰らわせた!", "You make surprise attack, and hit %s with a powerful blow!"), m_name);
1439 else if (stab_fleeing) msg_format(_("逃げる%sを背中から突き刺した!", "You backstab the fleeing %s!"), m_name);
1440 else if (!monk_attack) msg_format(_("%sを攻撃した。", "You hit %s."), m_name);
1442 /* Hack -- bare hands do one damage */
1445 object_flags(o_ptr, flgs);
1447 /* Select a chaotic effect (50% chance) */
1448 if ((have_flag(flgs, TR_CHAOTIC)) && one_in_(2))
1451 chg_virtue(V_CHANCE, 1);
1453 if (randint1(5) < 3)
1455 /* Vampiric (20%) */
1458 else if (one_in_(250))
1463 else if (!one_in_(10))
1465 /* Confusion (26.892%) */
1468 else if (one_in_(2))
1470 /* Teleport away (1.494%) */
1475 /* Polymorph (1.494%) */
1480 /* Vampiric drain */
1481 if ((have_flag(flgs, TR_VAMPIRIC)) || (chaos_effect == 1) || (mode == HISSATSU_DRAIN) || hex_spelling(HEX_VAMP_BLADE))
1483 /* Only drain "living" monsters */
1484 if (monster_living(m_ptr->r_idx))
1490 if ((have_flag(flgs, TR_VORPAL) || hex_spelling(HEX_RUNESWORD)) && (randint1(vorpal_chance * 3 / 2) == 1) && !zantetsu_mukou)
1492 else vorpal_cut = FALSE;
1496 int special_effect = 0, stun_effect = 0, times = 0, max_times;
1498 const martial_arts *ma_ptr = &ma_blows[0], *old_ptr = &ma_blows[0];
1499 int resist_stun = 0;
1502 if (r_ptr->flags1 & RF1_UNIQUE) resist_stun += 88;
1503 if (r_ptr->flags3 & RF3_NO_STUN) resist_stun += 66;
1504 if (r_ptr->flags3 & RF3_NO_CONF) resist_stun += 33;
1505 if (r_ptr->flags3 & RF3_NO_SLEEP) resist_stun += 33;
1506 if ((r_ptr->flags3 & RF3_UNDEAD) || (r_ptr->flags3 & RF3_NONLIVING))
1509 if (p_ptr->special_defense & KAMAE_BYAKKO)
1510 max_times = (p_ptr->lev < 3 ? 1 : p_ptr->lev / 3);
1511 else if (p_ptr->special_defense & KAMAE_SUZAKU)
1513 else if (p_ptr->special_defense & KAMAE_GENBU)
1516 max_times = (p_ptr->lev < 7 ? 1 : p_ptr->lev / 7);
1517 /* Attempt 'times' */
1518 for (times = 0; times < max_times; times++)
1522 ma_ptr = &ma_blows[randint0(MAX_MA)];
1523 if ((p_ptr->pclass == CLASS_FORCETRAINER) && (ma_ptr->min_level > 1)) min_level = ma_ptr->min_level + 3;
1524 else min_level = ma_ptr->min_level;
1525 } while ((min_level > p_ptr->lev) ||
1526 (randint1(p_ptr->lev) < ma_ptr->chance));
1528 /* keep the highest level attack available we found */
1529 if ((ma_ptr->min_level > old_ptr->min_level) &&
1530 !p_ptr->stun && !p_ptr->confused)
1534 if (p_ptr->wizard && cheat_xtra)
1536 msg_print(_("攻撃を再選択しました。", "Attack re-selected."));
1545 if (p_ptr->pclass == CLASS_FORCETRAINER) min_level = MAX(1, ma_ptr->min_level - 3);
1546 else min_level = ma_ptr->min_level;
1547 k = damroll(ma_ptr->dd + p_ptr->to_dd[hand], ma_ptr->ds + p_ptr->to_ds[hand]);
1548 if (p_ptr->special_attack & ATTACK_SUIKEN) k *= 2;
1550 if (ma_ptr->effect == MA_KNEE)
1552 if (r_ptr->flags1 & RF1_MALE)
1554 msg_format(_("%sに金的膝蹴りをくらわした!", "You hit %s in the groin with your knee!"), m_name);
1556 special_effect = MA_KNEE;
1559 msg_format(ma_ptr->desc, m_name);
1562 else if (ma_ptr->effect == MA_SLOW)
1564 if (!((r_ptr->flags1 & RF1_NEVER_MOVE) ||
1565 my_strchr("~#{}.UjmeEv$,DdsbBFIJQSXclnw!=?", r_ptr->d_char)))
1567 msg_format(_("%sの足首に関節蹴りをくらわした!", "You kick %s in the ankle."), m_name);
1568 special_effect = MA_SLOW;
1570 else msg_format(ma_ptr->desc, m_name);
1576 stun_effect = (ma_ptr->effect / 2) + randint1(ma_ptr->effect / 2);
1579 msg_format(ma_ptr->desc, m_name);
1582 if (p_ptr->special_defense & KAMAE_SUZAKU) weight = 4;
1583 if ((p_ptr->pclass == CLASS_FORCETRAINER) && P_PTR_KI)
1585 weight += (P_PTR_KI / 30);
1586 if (weight > 20) weight = 20;
1589 k = critical_norm(p_ptr->lev * weight, min_level, k, p_ptr->to_h[0], 0);
1591 if ((special_effect == MA_KNEE) && ((k + p_ptr->to_d[hand]) < m_ptr->hp))
1593 msg_format(_("%^sは苦痛にうめいている!", "%^s moans in agony!"), m_name);
1594 stun_effect = 7 + randint1(13);
1598 else if ((special_effect == MA_SLOW) && ((k + p_ptr->to_d[hand]) < m_ptr->hp))
1600 if (!(r_ptr->flags1 & RF1_UNIQUE) &&
1601 (randint1(p_ptr->lev) > r_ptr->level) &&
1604 msg_format(_("%^sは足をひきずり始めた。", "%^s starts limping slower."), m_name);
1605 m_ptr->mspeed -= 10;
1609 if (stun_effect && ((k + p_ptr->to_d[hand]) < m_ptr->hp))
1611 if (p_ptr->lev > randint1(r_ptr->level + resist_stun + 10))
1613 if (set_monster_stunned(g_ptr->m_idx, stun_effect + MON_STUNNED(m_ptr)))
1615 msg_format(_("%^sはフラフラになった。", "%^s is stunned."), m_name);
1619 msg_format(_("%^sはさらにフラフラになった。", "%^s is more stunned."), m_name);
1625 /* Handle normal weapon */
1626 else if (o_ptr->k_idx)
1628 k = damroll(o_ptr->dd + p_ptr->to_dd[hand], o_ptr->ds + p_ptr->to_ds[hand]);
1629 k = tot_dam_aux(o_ptr, k, m_ptr, mode, FALSE);
1633 k *= (3 + (p_ptr->lev / 20));
1637 k = k*(5 + (p_ptr->lev * 2 / 25)) / 2;
1639 else if (stab_fleeing)
1644 if ((p_ptr->impact[hand] && ((k > 50) || one_in_(7))) ||
1645 (chaos_effect == 2) || (mode == HISSATSU_QUAKE))
1650 if ((!(o_ptr->tval == TV_SWORD) || !(o_ptr->sval == SV_DOKUBARI)) && !(mode == HISSATSU_KYUSHO))
1651 k = critical_norm(o_ptr->weight, o_ptr->to_h, k, p_ptr->to_h[hand], mode);
1659 if ((o_ptr->name1 == ART_CHAINSWORD) && !one_in_(2))
1661 char chainsword_noise[1024];
1662 if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, chainsword_noise))
1664 msg_print(chainsword_noise);
1668 if (o_ptr->name1 == ART_VORPAL_BLADE)
1670 msg_print(_("目にも止まらぬヴォーパルブレード、手錬の早業!", "Your Vorpal Blade goes snicker-snack!"));
1674 msg_format(_("%sをグッサリ切り裂いた!", "Your weapon cuts deep into %s!"), m_name);
1677 /* Try to increase the damage */
1678 while (one_in_(vorpal_chance))
1683 k *= (HIT_POINT)mult;
1686 if (((r_ptr->flagsr & RFR_RES_ALL) ? k / 100 : k) > m_ptr->hp)
1688 msg_format(_("%sを真っ二つにした!", "You cut %s in half!"), m_name);
1694 case 2: msg_format(_("%sを斬った!", "You gouge %s!"), m_name); break;
1695 case 3: msg_format(_("%sをぶった斬った!", "You maim %s!"), m_name); break;
1696 case 4: msg_format(_("%sをメッタ斬りにした!", "You carve %s!"), m_name); break;
1697 case 5: msg_format(_("%sをメッタメタに斬った!", "You cleave %s!"), m_name); break;
1698 case 6: msg_format(_("%sを刺身にした!", "You smite %s!"), m_name); break;
1699 case 7: msg_format(_("%sを斬って斬って斬りまくった!", "You eviscerate %s!"), m_name); break;
1700 default: msg_format(_("%sを細切れにした!", "You shred %s!"), m_name); break;
1703 drain_result = drain_result * 3 / 2;
1707 drain_result += o_ptr->to_d;
1710 /* Apply the player damage bonuses */
1711 k += p_ptr->to_d[hand];
1712 drain_result += p_ptr->to_d[hand];
1714 if ((mode == HISSATSU_SUTEMI) || (mode == HISSATSU_3DAN)) k *= 2;
1715 if ((mode == HISSATSU_SEKIRYUKA) && !monster_living(m_ptr->r_idx)) k = 0;
1716 if ((mode == HISSATSU_SEKIRYUKA) && !p_ptr->cut) k /= 2;
1718 /* No negative damage */
1721 if ((mode == HISSATSU_ZANMA) && !(!monster_living(m_ptr->r_idx) && (r_ptr->flags3 & RF3_EVIL)))
1728 msg_print(_("こんな軟らかいものは切れん!", "You cannot cut such a elastic thing!"));
1734 msg_print(_("蜘蛛は苦手だ!", "Spiders are difficult for you to deal with!"));
1738 if (mode == HISSATSU_MINEUCHI)
1740 int tmp = (10 + randint1(15) + p_ptr->lev / 5);
1743 anger_monster(m_ptr);
1745 if (!(r_ptr->flags3 & (RF3_NO_STUN)))
1748 if (MON_STUNNED(m_ptr))
1750 msg_format(_("%sはひどくもうろうとした。", "%s is more dazed."), m_name);
1755 msg_format(_("%s はもうろうとした。", "%s is dazed."), m_name);
1759 (void)set_monster_stunned(g_ptr->m_idx, MON_STUNNED(m_ptr) + tmp);
1763 msg_format(_("%s には効果がなかった。", "%s is not effected."), m_name);
1767 /* Modify the damage */
1768 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))));
1769 if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) || (mode == HISSATSU_KYUSHO))
1771 if ((randint1(randint1(r_ptr->level / 7) + 5) == 1) && !(r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags7 & RF7_UNIQUE2))
1774 msg_format(_("%sの急所を突き刺した!", "You hit %s on a fatal spot!"), m_name);
1778 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)))
1780 int maxhp = maxroll(r_ptr->hdice, r_ptr->hside);
1781 if (one_in_(backstab ? 13 : (stab_fleeing || fuiuchi) ? 15 : 27))
1785 msg_format(_("刃が%sに深々と突き刺さった!", "You critically injured %s!"), m_name);
1787 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)))
1789 if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_UNIQUE2) || (m_ptr->hp >= maxhp / 2))
1791 k = MAX(k * 5, m_ptr->hp / 2);
1793 msg_format(_("%sに致命傷を負わせた!", "You fatally injured %s!"), m_name);
1798 msg_format(_("刃が%sの急所を貫いた!", "You hit %s on a fatal spot!"), m_name);
1803 msg_format_wizard(CHEAT_MONSTER,
1804 _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"), k,
1805 m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
1807 if (k <= 0) can_drain = FALSE;
1809 if (drain_result > m_ptr->hp)
1810 drain_result = m_ptr->hp;
1812 /* Damage, check for fear and death */
1813 if (mon_take_hit(g_ptr->m_idx, k, fear, NULL))
1816 if ((p_ptr->pclass == CLASS_BERSERKER) && p_ptr->energy_use)
1818 if (p_ptr->migite && p_ptr->hidarite)
1820 if (hand) p_ptr->energy_use = p_ptr->energy_use * 3 / 5 + p_ptr->energy_use*num * 2 / (p_ptr->num_blow[hand] * 5);
1821 else p_ptr->energy_use = p_ptr->energy_use*num * 3 / (p_ptr->num_blow[hand] * 5);
1825 p_ptr->energy_use = p_ptr->energy_use*num / p_ptr->num_blow[hand];
1828 if ((o_ptr->name1 == ART_ZANTETSU) && is_lowlevel)
1829 msg_print(_("またつまらぬものを斬ってしまった...", "Sigh... Another trifling thing I've cut...."));
1833 /* Anger the monster */
1834 if (k > 0) anger_monster(m_ptr);
1836 touch_zap_player(m_ptr);
1838 /* Are we draining it? A little note: If the monster is
1839 dead, the drain does not work... */
1841 if (can_drain && (drain_result > 0))
1843 if (o_ptr->name1 == ART_MURAMASA)
1847 HIT_PROB to_h = o_ptr->to_h;
1848 HIT_POINT to_d = o_ptr->to_d;
1852 for (i = 0; i < to_h + 3; i++) if (one_in_(4)) flag = 0;
1856 for (i = 0; i < to_d + 3; i++) if (one_in_(4)) flag = 0;
1859 if (o_ptr->to_h != to_h || o_ptr->to_d != to_d)
1861 msg_print(_("妖刀は血を吸って強くなった!", "Muramasa sucked blood, and became more powerful!"));
1869 if (drain_result > 5) /* Did we really hurt it? */
1871 drain_heal = damroll(2, drain_result / 6);
1874 if (hex_spelling(HEX_VAMP_BLADE)) drain_heal *= 2;
1878 msg_format(_("Draining left: %d", "Draining left: %d"), drain_left);
1883 if (drain_heal < drain_left)
1885 drain_left -= drain_heal;
1889 drain_heal = drain_left;
1895 msg_format(_("刃が%sから生命力を吸い取った!", "Your weapon drains life from %s!"), m_name);
1899 drain_heal = (drain_heal * p_ptr->mutant_regenerate_mod) / 100;
1901 hp_player(drain_heal);
1902 /* We get to keep some of it! */
1906 m_ptr->maxhp -= (k + 7) / 8;
1907 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
1908 if (m_ptr->maxhp < 1) m_ptr->maxhp = 1;
1914 /* Confusion attack */
1915 if ((p_ptr->special_attack & ATTACK_CONFUSE) || (chaos_effect == 3) || (mode == HISSATSU_CONF) || hex_spelling(HEX_CONFUSION))
1917 /* Cancel glowing hands */
1918 if (p_ptr->special_attack & ATTACK_CONFUSE)
1920 p_ptr->special_attack &= ~(ATTACK_CONFUSE);
1921 msg_print(_("手の輝きがなくなった。", "Your hands stop glowing."));
1922 p_ptr->redraw |= (PR_STATUS);
1926 /* Confuse the monster */
1927 if (r_ptr->flags3 & RF3_NO_CONF)
1929 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_NO_CONF;
1930 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
1933 else if (randint0(100) < r_ptr->level)
1935 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
1939 msg_format(_("%^sは混乱したようだ。", "%^s appears confused."), m_name);
1940 (void)set_monster_confused(g_ptr->m_idx, MON_CONFUSED(m_ptr) + 10 + randint0(p_ptr->lev) / 5);
1944 else if (chaos_effect == 4)
1946 bool resists_tele = FALSE;
1948 if (r_ptr->flagsr & RFR_RES_TELE)
1950 if (r_ptr->flags1 & RF1_UNIQUE)
1952 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1953 msg_format(_("%^sには効果がなかった。", "%^s is unaffected!"), m_name);
1954 resists_tele = TRUE;
1956 else if (r_ptr->level > randint1(100))
1958 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1959 msg_format(_("%^sは抵抗力を持っている!", "%^s resists!"), m_name);
1960 resists_tele = TRUE;
1966 msg_format(_("%^sは消えた!", "%^s disappears!"), m_name);
1967 teleport_away(g_ptr->m_idx, 50, TELEPORT_PASSIVE);
1968 num = num_blow + 1; /* Can't hit it anymore! */
1973 else if ((chaos_effect == 5) && (randint1(90) > r_ptr->level))
1975 if (!(r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) &&
1976 !(r_ptr->flagsr & RFR_EFF_RES_CHAO_MASK))
1978 if (polymorph_monster(y, x))
1980 msg_format(_("%^sは変化した!", "%^s changes!"), m_name);
1986 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
1989 /* Hack -- Get new monster */
1990 m_ptr = ¤t_floor_ptr->m_list[g_ptr->m_idx];
1992 /* Oops, we need a different name... */
1993 monster_desc(m_name, m_ptr, 0);
1995 /* Hack -- Get new race */
1996 r_ptr = &r_info[m_ptr->r_idx];
1999 else if (o_ptr->name1 == ART_G_HAMMER)
2001 monster_type *target_ptr = ¤t_floor_ptr->m_list[g_ptr->m_idx];
2003 if (target_ptr->hold_o_idx)
2005 object_type *q_ptr = ¤t_floor_ptr->o_list[target_ptr->hold_o_idx];
2006 GAME_TEXT o_name[MAX_NLEN];
2008 object_desc(o_name, q_ptr, OD_NAME_ONLY);
2009 q_ptr->held_m_idx = 0;
2010 q_ptr->marked = OM_TOUCHED;
2011 target_ptr->hold_o_idx = q_ptr->next_o_idx;
2012 q_ptr->next_o_idx = 0;
2013 msg_format(_("%sを奪った。", "You snatched %s."), o_name);
2022 backstab = FALSE; /* Clumsy! */
2023 fuiuchi = FALSE; /* Clumsy! */
2025 if ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE) && one_in_(3))
2027 BIT_FLAGS flgs_aux[TR_FLAG_SIZE];
2031 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
2032 msg_print(_("振り回した大鎌が自分自身に返ってきた!", "Your scythe returns to you!"));
2033 object_flags(o_ptr, flgs_aux);
2035 k = damroll(o_ptr->dd + p_ptr->to_dd[hand], o_ptr->ds + p_ptr->to_ds[hand]);
2038 switch (p_ptr->mimic_form)
2041 switch (p_ptr->prace)
2048 case RACE_BARBARIAN:
2052 case RACE_HALF_TROLL:
2053 case RACE_HALF_OGRE:
2054 case RACE_HALF_GIANT:
2055 case RACE_HALF_TITAN:
2063 case RACE_DRACONIAN:
2070 case MIMIC_DEMON_LORD:
2077 if (p_ptr->align < 0 && mult < 20)
2079 if (!(p_ptr->resist_acid || IS_OPPOSE_ACID() || p_ptr->immune_acid) && (mult < 25))
2081 if (!(p_ptr->resist_elec || IS_OPPOSE_ELEC() || p_ptr->immune_elec) && (mult < 25))
2083 if (!(p_ptr->resist_fire || IS_OPPOSE_FIRE() || p_ptr->immune_fire) && (mult < 25))
2085 if (!(p_ptr->resist_cold || IS_OPPOSE_COLD() || p_ptr->immune_cold) && (mult < 25))
2087 if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()) && (mult < 25))
2090 if ((p_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs_aux, TR_FORCE_WEAPON)) && (p_ptr->csp >(p_ptr->msp / 30)))
2092 p_ptr->csp -= (1 + (p_ptr->msp / 30));
2093 p_ptr->redraw |= (PR_MANA);
2094 mult = mult * 3 / 2 + 20;
2096 k *= (HIT_POINT)mult;
2100 k = critical_norm(o_ptr->weight, o_ptr->to_h, k, p_ptr->to_h[hand], mode);
2104 msg_format(_("グッサリ切り裂かれた!", "Your weapon cuts deep into yourself!"));
2105 /* Try to increase the damage */
2111 k *= (HIT_POINT)mult;
2113 k += (p_ptr->to_d[hand] + o_ptr->to_d);
2116 take_hit(DAMAGE_FORCE, k, _("死の大鎌", "Death scythe"), -1);
2122 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
2130 if (weak && !(*mdeath))
2132 msg_format(_("%sは弱くなったようだ。", "%^s seems weakened."), m_name);
2134 if (drain_left != MAX_VAMPIRIC_DRAIN)
2138 chg_virtue(V_UNLIFE, 1);
2141 /* Mega-Hack -- apply earthquake brand */
2144 earthquake(p_ptr->y, p_ptr->x, 10, 0);
2145 if (!current_floor_ptr->grid_array[y][x].m_idx) *mdeath = TRUE;
2150 * @brief プレイヤーの打撃処理メインルーチン
2153 * @param mode 発動中の剣術ID
2154 * @return 実際に攻撃処理が行われた場合TRUEを返す。
2156 * If no "weapon" is available, then "punch" the monster one time.
2158 bool py_attack(POSITION y, POSITION x, COMBAT_OPTION_IDX mode)
2161 bool mdeath = FALSE;
2162 bool stormbringer = FALSE;
2164 grid_type *g_ptr = ¤t_floor_ptr->grid_array[y][x];
2165 monster_type *m_ptr = ¤t_floor_ptr->m_list[g_ptr->m_idx];
2166 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2167 GAME_TEXT m_name[MAX_NLEN];
2169 disturb(FALSE, TRUE);
2171 take_turn(p_ptr, 100);
2173 if (!p_ptr->migite && !p_ptr->hidarite &&
2174 !(p_ptr->muta2 & (MUT2_HORNS | MUT2_BEAK | MUT2_SCOR_TAIL | MUT2_TRUNK | MUT2_TENTACLES)))
2176 msg_format(_("%s攻撃できない。", "You cannot do attacking."),
2177 (empty_hands(FALSE) == EMPTY_HAND_NONE) ? _("両手がふさがって", "") : "");
2181 monster_desc(m_name, m_ptr, 0);
2185 /* Auto-Recall if possible and visible */
2186 if (!p_ptr->image) monster_race_track(m_ptr->ap_r_idx);
2188 health_track(g_ptr->m_idx);
2191 if ((r_ptr->flags1 & RF1_FEMALE) &&
2192 !(p_ptr->stun || p_ptr->confused || p_ptr->image || !m_ptr->ml))
2194 if ((p_ptr->inventory_list[INVEN_RARM].name1 == ART_ZANTETSU) || (p_ptr->inventory_list[INVEN_LARM].name1 == ART_ZANTETSU))
2196 msg_print(_("拙者、おなごは斬れぬ!", "I can not attack women!"));
2201 if (d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MELEE)
2203 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));
2207 /* Stop if friendly */
2208 if (!is_hostile(m_ptr) &&
2209 !(p_ptr->stun || p_ptr->confused || p_ptr->image ||
2210 p_ptr->shero || !m_ptr->ml))
2212 if (p_ptr->inventory_list[INVEN_RARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
2213 if (p_ptr->inventory_list[INVEN_LARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
2216 msg_format(_("黒い刃は強欲に%sを攻撃した!", "Your black blade greedily attacks %s!"), m_name);
2217 chg_virtue(V_INDIVIDUALISM, 1);
2218 chg_virtue(V_HONOUR, -1);
2219 chg_virtue(V_JUSTICE, -1);
2220 chg_virtue(V_COMPASSION, -1);
2222 else if (p_ptr->pclass != CLASS_BERSERKER)
2224 if (get_check(_("本当に攻撃しますか?", "Really hit it? ")))
2226 chg_virtue(V_INDIVIDUALISM, 1);
2227 chg_virtue(V_HONOUR, -1);
2228 chg_virtue(V_JUSTICE, -1);
2229 chg_virtue(V_COMPASSION, -1);
2233 msg_format(_("%sを攻撃するのを止めた。", "You stop to avoid hitting %s."), m_name);
2240 /* Handle player fear */
2244 msg_format(_("恐くて%sを攻撃できない!", "You are too afraid to attack %s!"), m_name);
2246 msg_format(_("そっちには何か恐いものがいる!", "There is something scary in your way!"));
2248 /* Disturb the monster */
2249 (void)set_monster_csleep(g_ptr->m_idx, 0);
2254 if (MON_CSLEEP(m_ptr)) /* It is not honorable etc to attack helpless victims */
2256 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(V_COMPASSION, -1);
2257 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(V_HONOUR, -1);
2260 if (p_ptr->migite && p_ptr->hidarite)
2262 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))
2264 if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_BEGINNER)
2265 p_ptr->skill_exp[GINOU_NITOURYU] += 80;
2266 else if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_SKILLED)
2267 p_ptr->skill_exp[GINOU_NITOURYU] += 4;
2268 else if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_EXPERT)
2269 p_ptr->skill_exp[GINOU_NITOURYU] += 1;
2270 else if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_MASTER)
2271 if (one_in_(3)) p_ptr->skill_exp[GINOU_NITOURYU] += 1;
2272 p_ptr->update |= (PU_BONUS);
2276 /* Gain riding experience */
2279 int cur = p_ptr->skill_exp[GINOU_RIDING];
2280 int max = s_info[p_ptr->pclass].s_max[GINOU_RIDING];
2284 DEPTH ridinglevel = r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].level;
2285 DEPTH targetlevel = r_ptr->level;
2288 if ((cur / 200 - 5) < targetlevel)
2291 /* Extra experience */
2292 if ((cur / 100) < ridinglevel)
2294 if ((cur / 100 + 15) < ridinglevel)
2295 inc += 1 + (ridinglevel - (cur / 100 + 15));
2300 p_ptr->skill_exp[GINOU_RIDING] = MIN(max, cur + inc);
2301 p_ptr->update |= (PU_BONUS);
2305 p_ptr->riding_t_m_idx = g_ptr->m_idx;
2306 if (p_ptr->migite) py_attack_aux(y, x, &fear, &mdeath, 0, mode);
2307 if (p_ptr->hidarite && !mdeath) py_attack_aux(y, x, &fear, &mdeath, 1, mode);
2309 /* Mutations which yield extra 'natural' attacks */
2312 if ((p_ptr->muta2 & MUT2_HORNS) && !mdeath)
2313 natural_attack(g_ptr->m_idx, MUT2_HORNS, &fear, &mdeath);
2314 if ((p_ptr->muta2 & MUT2_BEAK) && !mdeath)
2315 natural_attack(g_ptr->m_idx, MUT2_BEAK, &fear, &mdeath);
2316 if ((p_ptr->muta2 & MUT2_SCOR_TAIL) && !mdeath)
2317 natural_attack(g_ptr->m_idx, MUT2_SCOR_TAIL, &fear, &mdeath);
2318 if ((p_ptr->muta2 & MUT2_TRUNK) && !mdeath)
2319 natural_attack(g_ptr->m_idx, MUT2_TRUNK, &fear, &mdeath);
2320 if ((p_ptr->muta2 & MUT2_TENTACLES) && !mdeath)
2321 natural_attack(g_ptr->m_idx, MUT2_TENTACLES, &fear, &mdeath);
2324 /* Hack -- delay fear messages */
2325 if (fear && m_ptr->ml && !mdeath)
2329 msg_format(_("%^sは恐怖して逃げ出した!", "%^s flees in terror!"), m_name);
2332 if ((p_ptr->special_defense & KATA_IAI) && ((mode != HISSATSU_IAI) || mdeath))
2334 set_action(ACTION_NONE);
2341 * @brief モンスターからプレイヤーへの打撃処理 / Attack the player via physical attacks.
2342 * @param m_idx 打撃を行うモンスターのID
2343 * @return 実際に攻撃処理を行った場合TRUEを返す
2345 bool make_attack_normal(MONSTER_IDX m_idx)
2347 monster_type *m_ptr = ¤t_floor_ptr->m_list[m_idx];
2348 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2356 int do_cut, do_stun;
2360 GAME_TEXT o_name[MAX_NLEN];
2361 GAME_TEXT m_name[MAX_NLEN];
2362 GAME_TEXT ddesc[80];
2365 bool touched = FALSE, fear = FALSE, alive = TRUE;
2366 bool explode = FALSE;
2367 bool do_silly_attack = (one_in_(2) && p_ptr->image);
2368 HIT_POINT get_damage = 0;
2369 int abbreviate = 0; // 2回目以降の省略表現フラグ
2371 /* Not allowed to attack */
2372 if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return (FALSE);
2374 if (d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) return (FALSE);
2376 /* ...nor if friendly */
2377 if (!is_hostile(m_ptr)) return FALSE;
2379 /* Extract the effective monster level */
2380 rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
2382 /* Get the monster name (or "it") */
2383 monster_desc(m_name, m_ptr, 0);
2385 monster_desc(ddesc, m_ptr, MD_WRONGDOER_NAME);
2387 if (p_ptr->special_defense & KATA_IAI)
2389 msg_format(_("相手が襲いかかる前に素早く武器を振るった。", "You took sen, draw and cut in one motion before %s move."), m_name);
2390 if (py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_IAI)) return TRUE;
2393 if ((p_ptr->special_defense & NINJA_KAWARIMI) && (randint0(55) < (p_ptr->lev*3/5+20)))
2395 if (kawarimi(TRUE)) return TRUE;
2398 /* Assume no blink */
2401 /* Scan through all four blows */
2402 for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
2404 bool obvious = FALSE;
2406 HIT_POINT power = 0;
2407 HIT_POINT damage = 0;
2411 /* Extract the attack infomation */
2412 int effect = r_ptr->blow[ap_cnt].effect;
2413 int method = r_ptr->blow[ap_cnt].method;
2414 int d_dice = r_ptr->blow[ap_cnt].d_dice;
2415 int d_side = r_ptr->blow[ap_cnt].d_side;
2417 if (!monster_is_valid(m_ptr)) break;
2419 /* Hack -- no more attacks */
2422 if (is_pet(m_ptr) && (r_ptr->flags1 & RF1_UNIQUE) && (method == RBM_EXPLODE))
2428 /* Stop if player is dead or gone */
2429 if (!p_ptr->playing || p_ptr->is_dead) break;
2430 if (distance(p_ptr->y, p_ptr->x, m_ptr->fy, m_ptr->fx) > 1) break;
2432 /* Handle "leaving" */
2433 if (p_ptr->leaving) break;
2435 if (method == RBM_SHOOT) continue;
2437 /* Extract the attack "power" */
2438 power = mbe_info[effect].power;
2441 ac = p_ptr->ac + p_ptr->to_a;
2443 /* Monster hits player */
2444 if (!effect || check_hit(power, rlev, MON_STUNNED(m_ptr)))
2446 /* Always disturbing */
2447 disturb(TRUE, TRUE);
2450 /* Hack -- Apply "protection from evil" */
2451 if ((p_ptr->protevil > 0) &&
2452 (r_ptr->flags3 & RF3_EVIL) &&
2453 (p_ptr->lev >= rlev) &&
2454 ((randint0(100) + p_ptr->lev) > 50))
2456 /* Remember the Evil-ness */
2457 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_EVIL;
2460 if (abbreviate) msg_format("撃退した。");
2461 else msg_format("%^sは撃退された。", m_name);
2462 abbreviate = 1; /*2回目以降は省略 */
2464 msg_format("%^s is repelled.", m_name);
2468 /* Hack -- Next attack */
2473 /* Assume no cut or stun */
2474 do_cut = do_stun = 0;
2476 /* Describe the attack method */
2481 act = _("殴られた。", "hits you.");
2482 do_cut = do_stun = 1;
2490 act = _("触られた。", "touches you.");
2498 act = _("パンチされた。", "punches you.");
2507 act = _("蹴られた。", "kicks you.");
2516 act = _("ひっかかれた。", "claws you.");
2525 act = _("噛まれた。", "bites you.");
2534 act = _("刺された。", "stings you.");
2542 act = _("斬られた。", "slashes you.");
2551 act = _("角で突かれた。", "butts you.");
2560 act = _("体当たりされた。", "crushes you.");
2569 act = _("飲み込まれた。", "engulfs you.");
2578 act = _("は請求書をよこした。", "charges you.");
2580 sound(SOUND_BUY); /* Note! This is "charges", not "charges at". */
2587 act = _("が体の上を這い回った。", "crawls on you.");
2595 act = _("よだれをたらされた。", "drools on you.");
2602 act = _("唾を吐かれた。", "spits on you.");
2610 act = _("は爆発した。", "explodes.");
2617 act = _("にらまれた。", "gazes at you.");
2623 act = _("泣き叫ばれた。", "wails at you.");
2630 act = _("胞子を飛ばされた。", "releases spores at you.");
2638 act = _("が XXX4 を発射した。", "projects XXX4's at you.");
2644 act = _("金をせがまれた。", "begs you for money.");
2654 act = desc_insult[randint0(m_ptr->r_idx == MON_DEBBY ? 10 : 8)];
2664 act = desc_moan[randint0(4)];
2674 if (m_ptr->r_idx == MON_JAIAN)
2677 switch(randint1(15))
2682 act = "「♪お~れはジャイアン~~ガ~キだいしょう~」";
2685 act = "「♪て~んかむ~てきのお~とこだぜ~~」";
2688 act = "「♪の~び太スネ夫はメじゃないよ~~」";
2691 act = "「♪け~んかスポ~ツ~どんとこい~」";
2694 act = "「♪うた~も~~う~まいぜ~まかしとけ~」";
2697 act = "「♪ま~ちいちば~んのに~んきもの~~」";
2700 act = "「♪べんきょうしゅくだいメじゃないよ~~」";
2703 act = "「♪きはやさし~くて~ち~からもち~」";
2706 act = "「♪かお~も~~スタイルも~バツグンさ~」";
2709 act = "「♪がっこうい~ちの~あ~ばれんぼう~~」";
2712 act = "「♪ド~ラもドラミもメじゃないよ~~」";
2715 act = "「♪よじげんぽけっと~な~くたって~」";
2718 act = "「♪あし~の~~ながさ~は~まけないぜ~」";
2722 act = "horribly sings 'I AM GIAAAAAN. THE BOOOSS OF THE KIIIIDS.'";
2728 act = _("は♪僕らは楽しい家族♪と歌っている。", "sings 'We are a happy family.'");
2730 act = _("は♪アイ ラブ ユー、ユー ラブ ミー♪と歌っている。", "sings 'I love you, you love me.'");
2740 if (do_silly_attack)
2745 act = silly_attacks[randint0(MAX_SILLY_ATTACK)];
2748 if (abbreviate == 0)
2749 msg_format("%^sに%s", m_name, act);
2750 else if (abbreviate == 1)
2751 msg_format("%s", act);
2752 else /* if (abbreviate == -1) */
2753 msg_format("%^s%s", m_name, act);
2754 abbreviate = 1;/*2回目以降は省略 */
2756 msg_format("%^s %s%s", m_name, act, do_silly_attack ? " you." : "");
2760 /* Hack -- assume all attacks are obvious */
2763 /* Roll out the damage */
2764 damage = damroll(d_dice, d_side);
2767 * Skip the effect when exploding, since the explosion
2768 * already causes the effect.
2770 if(explode) damage = 0;
2771 /* Apply appropriate damage */
2781 case RBE_SUPERHURT: /* AC軽減あり / Player armor reduces total damage */
2783 if (((randint1(rlev*2+300) > (ac+200)) || one_in_(13)) && !CHECK_MULTISHADOW())
2785 int tmp_damage = damage - (damage * ((ac < 150) ? ac : 150) / 250);
2786 msg_print(_("痛恨の一撃!", "It was a critical hit!"));
2787 tmp_damage = MAX(damage, tmp_damage*2);
2789 get_damage += take_hit(DAMAGE_ATTACK, tmp_damage, ddesc, -1);
2793 case RBE_HURT: /* AC軽減あり / Player armor reduces total damage */
2796 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
2797 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2805 /* Take "poison" effect */
2806 if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()) && !CHECK_MULTISHADOW())
2808 if (set_poisoned(p_ptr->poisoned + randint1(rlev) + 5))
2814 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2816 /* Learn about the player */
2817 update_smart_learn(m_idx, DRS_POIS);
2826 /* Allow complete resist */
2827 if (!p_ptr->resist_disen && !CHECK_MULTISHADOW())
2829 /* Apply disenchantment */
2830 if (apply_disenchant(0))
2832 /* Hack -- Update AC */
2833 update_creature(p_ptr);
2838 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2840 /* Learn about the player */
2841 update_smart_learn(m_idx, DRS_DISEN);
2848 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2850 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2853 for (k = 0; k < 10; k++)
2856 i = (INVENTORY_IDX)randint0(INVEN_PACK);
2858 /* Obtain the item */
2859 o_ptr = &p_ptr->inventory_list[i];
2860 if (!o_ptr->k_idx) continue;
2862 /* Drain charged wands/staffs */
2863 if (((o_ptr->tval == TV_STAFF) ||
2864 (o_ptr->tval == TV_WAND)) &&
2867 /* Calculate healed hitpoints */
2868 int heal=rlev * o_ptr->pval;
2869 if( o_ptr->tval == TV_STAFF)
2870 heal *= o_ptr->number;
2872 /* Don't heal more than max hp */
2873 heal = MIN(heal, m_ptr->maxhp - m_ptr->hp);
2875 msg_print(_("ザックからエネルギーが吸い取られた!", "Energy drains from your pack!"));
2879 /* Heal the monster */
2880 m_ptr->hp += (HIT_POINT)heal;
2882 /* Redraw (later) if needed */
2883 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
2884 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
2889 /* Combine / Reorder the pack */
2890 p_ptr->update |= (PU_COMBINE | PU_REORDER);
2891 p_ptr->window |= (PW_INVEN);
2902 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2904 /* Confused monsters cannot steal successfully. -LM-*/
2905 if (MON_CONFUSED(m_ptr)) break;
2907 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2911 /* Saving throw (unless paralyzed) based on dex and level */
2912 if (!p_ptr->paralyzed &&
2913 (randint0(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
2916 /* Saving throw message */
2917 msg_print(_("しかし素早く財布を守った!", "You quickly protect your money pouch!"));
2919 /* Occasional blink anyway */
2920 if (randint0(3)) blinked = TRUE;
2926 gold = (p_ptr->au / 10) + randint1(25);
2927 if (gold < 2) gold = 2;
2928 if (gold > 5000) gold = (p_ptr->au / 20) + randint1(3000);
2929 if (gold > p_ptr->au) gold = p_ptr->au;
2933 msg_print(_("しかし何も盗まれなかった。", "Nothing was stolen."));
2937 msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2938 msg_format(_("$%ld のお金が盗まれた!", "%ld coins were stolen!"), (long)gold);
2939 chg_virtue(V_SACRIFICE, 1);
2943 msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2944 msg_print(_("お金が全部盗まれた!", "All of your coins were stolen!"));
2945 chg_virtue(V_SACRIFICE, 2);
2949 p_ptr->redraw |= (PR_GOLD);
2951 p_ptr->window |= (PW_PLAYER);
2962 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2964 /* Confused monsters cannot steal successfully. -LM-*/
2965 if (MON_CONFUSED(m_ptr)) break;
2967 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2969 /* Saving throw (unless paralyzed) based on dex and level */
2970 if (!p_ptr->paralyzed &&
2971 (randint0(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
2974 /* Saving throw message */
2975 msg_print(_("しかしあわててザックを取り返した!", "You grab hold of your backpack!"));
2977 /* Occasional "blink" anyway */
2984 for (k = 0; k < 10; k++)
2989 i = (INVENTORY_IDX)randint0(INVEN_PACK);
2991 /* Obtain the item */
2992 o_ptr = &p_ptr->inventory_list[i];
2993 if (!o_ptr->k_idx) continue;
2995 /* Skip artifacts */
2996 if (object_is_artifact(o_ptr)) continue;
2998 object_desc(o_name, o_ptr, OD_OMIT_PREFIX);
3001 msg_format("%s(%c)を%s盗まれた!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
3003 msg_format("%sour %s (%c) was stolen!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
3005 chg_virtue(V_SACRIFICE, 1);
3012 j_ptr = ¤t_floor_ptr->o_list[o_idx];
3013 object_copy(j_ptr, o_ptr);
3018 /* Hack -- If a rod or wand, allocate total
3019 * maximum timeouts or charges between those
3020 * stolen and those missed. -LM-
3022 if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
3024 j_ptr->pval = o_ptr->pval / o_ptr->number;
3025 o_ptr->pval -= j_ptr->pval;
3029 j_ptr->marked = OM_TOUCHED;
3031 /* Memorize monster */
3032 j_ptr->held_m_idx = m_idx;
3035 j_ptr->next_o_idx = m_ptr->hold_o_idx;
3038 m_ptr->hold_o_idx = o_idx;
3041 /* Steal the items */
3042 inven_item_increase(i, -1);
3043 inven_item_optimize(i);
3058 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3060 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3062 /* Steal some food */
3063 for (k = 0; k < 10; k++)
3065 /* Pick an item from the pack */
3066 i = (INVENTORY_IDX)randint0(INVEN_PACK);
3068 o_ptr = &p_ptr->inventory_list[i];
3069 if (!o_ptr->k_idx) continue;
3071 /* Skip non-food objects */
3072 if ((o_ptr->tval != TV_FOOD) && !((o_ptr->tval == TV_CORPSE) && (o_ptr->sval))) continue;
3074 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
3077 msg_format("%s(%c)を%s食べられてしまった!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
3079 msg_format("%sour %s (%c) was eaten!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
3082 /* Steal the items */
3083 inven_item_increase(i, -1);
3084 inven_item_optimize(i);
3096 /* Access the lite */
3097 o_ptr = &p_ptr->inventory_list[INVEN_LITE];
3098 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3100 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3103 if ((o_ptr->xtra4 > 0) && (!object_is_fixed_artifact(o_ptr)))
3106 o_ptr->xtra4 -= (s16b)(250 + randint1(250));
3107 if (o_ptr->xtra4 < 1) o_ptr->xtra4 = 1;
3111 msg_print(_("明かりが暗くなってしまった。", "Your light dims."));
3115 p_ptr->window |= (PW_EQUIP);
3125 msg_print(_("酸を浴びせられた!", "You are covered in acid!"));
3126 get_damage += acid_dam(damage, ddesc, -1, FALSE);
3127 update_creature(p_ptr);
3128 update_smart_learn(m_idx, DRS_ACID);
3136 msg_print(_("電撃を浴びせられた!", "You are struck by electricity!"));
3137 get_damage += elec_dam(damage, ddesc, -1, FALSE);
3138 update_smart_learn(m_idx, DRS_ELEC);
3146 msg_print(_("全身が炎に包まれた!", "You are enveloped in flames!"));
3147 get_damage += fire_dam(damage, ddesc, -1, FALSE);
3148 update_smart_learn(m_idx, DRS_FIRE);
3156 msg_print(_("全身が冷気で覆われた!", "You are covered with frost!"));
3157 get_damage += cold_dam(damage, ddesc, -1, FALSE);
3158 update_smart_learn(m_idx, DRS_COLD);
3164 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3165 if (p_ptr->is_dead) break;
3167 /* Increase "blind" */
3168 if (!p_ptr->resist_blind && !CHECK_MULTISHADOW())
3170 if (set_blind(p_ptr->blind + 10 + randint1(rlev)))
3173 if (m_ptr->r_idx == MON_DIO) msg_print("どうだッ!この血の目潰しはッ!");
3181 /* Learn about the player */
3182 update_smart_learn(m_idx, DRS_BLIND);
3190 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3192 if (p_ptr->is_dead) break;
3194 /* Increase "confused" */
3195 if (!p_ptr->resist_conf && !CHECK_MULTISHADOW())
3197 if (set_confused(p_ptr->confused + 3 + randint1(rlev)))
3203 /* Learn about the player */
3204 update_smart_learn(m_idx, DRS_CONF);
3211 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3213 if (p_ptr->is_dead) break;
3215 /* Increase "afraid" */
3216 if (CHECK_MULTISHADOW())
3220 else if (p_ptr->resist_fear)
3222 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
3225 else if (randint0(100 + r_ptr->level/2) < p_ptr->skill_sav)
3227 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
3232 if (set_afraid(p_ptr->afraid + 3 + randint1(rlev)))
3238 /* Learn about the player */
3239 update_smart_learn(m_idx, DRS_FEAR);
3246 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3248 if (p_ptr->is_dead) break;
3250 /* Increase "paralyzed" */
3251 if (CHECK_MULTISHADOW())
3255 else if (p_ptr->free_act)
3257 msg_print(_("しかし効果がなかった!", "You are unaffected!"));
3260 else if (randint0(100 + r_ptr->level/2) < p_ptr->skill_sav)
3262 msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
3267 if (!p_ptr->paralyzed)
3269 if (set_paralyzed(3 + randint1(rlev)))
3276 /* Learn about the player */
3277 update_smart_learn(m_idx, DRS_FREE);
3284 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3286 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3287 if (do_dec_stat(A_STR)) obvious = TRUE;
3294 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3296 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3297 if (do_dec_stat(A_INT)) obvious = TRUE;
3304 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3306 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3307 if (do_dec_stat(A_WIS)) obvious = TRUE;
3314 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3316 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3317 if (do_dec_stat(A_DEX)) obvious = TRUE;
3324 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3326 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3327 if (do_dec_stat(A_CON)) obvious = TRUE;
3334 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3336 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3337 if (do_dec_stat(A_CHR)) obvious = TRUE;
3344 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3346 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3348 /* Damage (stats) */
3349 if (do_dec_stat(A_STR)) obvious = TRUE;
3350 if (do_dec_stat(A_DEX)) obvious = TRUE;
3351 if (do_dec_stat(A_CON)) obvious = TRUE;
3352 if (do_dec_stat(A_INT)) obvious = TRUE;
3353 if (do_dec_stat(A_WIS)) obvious = TRUE;
3354 if (do_dec_stat(A_CHR)) obvious = TRUE;
3363 /* Hack -- Reduce damage based on the player armor class */
3364 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
3366 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3368 /* Radius 8 earthquake centered at the monster */
3369 if (damage > 23 || explode)
3371 earthquake(m_ptr->fy, m_ptr->fx, 8, m_idx);
3379 s32b d = damroll(10, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3383 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3385 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3387 (void)drain_exp(d, d / 10, 95);
3393 s32b d = damroll(20, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3397 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3399 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3401 (void)drain_exp(d, d / 10, 90);
3407 s32b d = damroll(40, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3411 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3413 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3415 (void)drain_exp(d, d / 10, 75);
3421 s32b d = damroll(80, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3425 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3427 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3429 (void)drain_exp(d, d / 10, 50);
3435 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3437 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3439 /* Take "poison" effect */
3440 if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()))
3442 if (set_poisoned(p_ptr->poisoned + randint1(rlev) + 5))
3448 /* Damage CON (10% chance)*/
3449 if ((randint1(100) < 11) && (p_ptr->prace != RACE_ANDROID))
3451 /* 1% chance for perm. damage */
3452 bool perm = one_in_(10);
3453 if (dec_stat(A_CON, randint1(10), perm))
3455 msg_print(_("病があなたを蝕んでいる気がする。", "You feel strange sickness."));
3465 if (!p_ptr->resist_time && !CHECK_MULTISHADOW())
3467 switch (randint1(10))
3469 case 1: case 2: case 3: case 4: case 5:
3471 if (p_ptr->prace == RACE_ANDROID) break;
3472 msg_print(_("人生が逆戻りした気がする。", "You feel life has clocked back."));
3473 lose_exp(100 + (p_ptr->exp / 100) * MON_DRAIN_LIFE);
3477 case 6: case 7: case 8: case 9:
3479 int stat = randint0(6);
3484 case A_STR: act = "強く"; break;
3485 case A_INT: act = "聡明で"; break;
3486 case A_WIS: act = "賢明で"; break;
3487 case A_DEX: act = "器用で"; break;
3488 case A_CON: act = "健康で"; break;
3489 case A_CHR: act = "美しく"; break;
3491 case A_STR: act = "strong"; break;
3492 case A_INT: act = "bright"; break;
3493 case A_WIS: act = "wise"; break;
3494 case A_DEX: act = "agile"; break;
3495 case A_CON: act = "hale"; break;
3496 case A_CHR: act = "beautiful"; break;
3501 msg_format(_("あなたは以前ほど%sなくなってしまった...。", "You're not as %s as you used to be..."), act);
3502 p_ptr->stat_cur[stat] = (p_ptr->stat_cur[stat] * 3) / 4;
3503 if (p_ptr->stat_cur[stat] < 3) p_ptr->stat_cur[stat] = 3;
3504 p_ptr->update |= (PU_BONUS);
3510 msg_print(_("あなたは以前ほど力強くなくなってしまった...。", "You're not as powerful as you used to be..."));
3512 for (k = 0; k < A_MAX; k++)
3514 p_ptr->stat_cur[k] = (p_ptr->stat_cur[k] * 7) / 8;
3515 if (p_ptr->stat_cur[k] < 3) p_ptr->stat_cur[k] = 3;
3517 p_ptr->update |= (PU_BONUS);
3522 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3528 s32b d = damroll(60, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3533 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3535 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3537 resist_drain = !drain_exp(d, d / 10, 50);
3539 /* Heal the attacker? */
3540 if (p_ptr->mimic_form)
3542 if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
3543 resist_drain = TRUE;
3547 switch (p_ptr->prace)
3556 resist_drain = TRUE;
3561 if ((damage > 5) && !resist_drain)
3563 bool did_heal = FALSE;
3565 if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
3568 m_ptr->hp += damroll(4, damage / 6);
3569 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
3571 /* Redraw (later) if needed */
3572 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
3573 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
3575 /* Special message */
3576 if (m_ptr->ml && did_heal)
3578 msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), m_name);
3588 if (CHECK_MULTISHADOW())
3590 msg_print(_("攻撃は幻影に命中し、あなたには届かなかった。", "The attack hits Shadow, you are unharmed!"));
3596 p_ptr->csp -= damage;
3600 p_ptr->csp_frac = 0;
3603 p_ptr->redraw |= (PR_MANA);
3606 /* Learn about the player */
3607 update_smart_learn(m_idx, DRS_MANA);
3613 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3615 if (p_ptr->is_dead) break;
3617 /* Decrease speed */
3618 if (CHECK_MULTISHADOW())
3624 if (set_slow((p_ptr->slow + 4 + randint0(rlev / 10)), FALSE))
3634 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3636 if (p_ptr->is_dead) break;
3638 /* Decrease speed */
3639 if (p_ptr->resist_sound || CHECK_MULTISHADOW())
3645 if (set_stun(p_ptr->stun + 10 + randint1(r_ptr->level / 4)))
3655 /* Hack -- only one of cut or stun */
3656 if (do_cut && do_stun)
3659 if (randint0(100) < 50)
3676 /* Critical hit (zero if non-critical) */
3677 tmp = monster_critical(d_dice, d_side, damage);
3679 /* Roll for damage */
3682 case 0: cut_plus = 0; break;
3683 case 1: cut_plus = randint1(5); break;
3684 case 2: cut_plus = randint1(5) + 5; break;
3685 case 3: cut_plus = randint1(20) + 20; break;
3686 case 4: cut_plus = randint1(50) + 50; break;
3687 case 5: cut_plus = randint1(100) + 100; break;
3688 case 6: cut_plus = 300; break;
3689 default: cut_plus = 500; break;
3693 if (cut_plus) (void)set_cut(p_ptr->cut + cut_plus);
3701 /* Critical hit (zero if non-critical) */
3702 tmp = monster_critical(d_dice, d_side, damage);
3704 /* Roll for damage */
3707 case 0: stun_plus = 0; break;
3708 case 1: stun_plus = randint1(5); break;
3709 case 2: stun_plus = randint1(5) + 10; break;
3710 case 3: stun_plus = randint1(10) + 20; break;
3711 case 4: stun_plus = randint1(15) + 30; break;
3712 case 5: stun_plus = randint1(20) + 40; break;
3713 case 6: stun_plus = 80; break;
3714 default: stun_plus = 150; break;
3717 /* Apply the stun */
3718 if (stun_plus) (void)set_stun(p_ptr->stun + stun_plus);
3723 sound(SOUND_EXPLODE);
3725 if (mon_take_hit(m_idx, m_ptr->hp + 1, &fear, NULL))
3734 if (p_ptr->sh_fire && alive && !p_ptr->is_dead)
3736 if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK))
3738 HIT_POINT dam = damroll(2, 6);
3740 /* Modify the damage */
3741 dam = mon_damage_mod(m_ptr, dam, FALSE);
3743 msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), m_name);
3745 if (mon_take_hit(m_idx, dam, &fear, _("は灰の山になった。", " turns into a pile of ash.")))
3753 if (is_original_ap_and_seen(m_ptr))
3754 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
3758 if (p_ptr->sh_elec && alive && !p_ptr->is_dead)
3760 if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK))
3762 HIT_POINT dam = damroll(2, 6);
3764 /* Modify the damage */
3765 dam = mon_damage_mod(m_ptr, dam, FALSE);
3767 msg_format(_("%^sは電撃をくらった!", "%^s gets zapped!"), m_name);
3768 if (mon_take_hit(m_idx, dam, &fear, _("は燃え殻の山になった。", " turns into a pile of cinder.")))
3776 if (is_original_ap_and_seen(m_ptr))
3777 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
3781 if (p_ptr->sh_cold && alive && !p_ptr->is_dead)
3783 if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK))
3785 HIT_POINT dam = damroll(2, 6);
3787 /* Modify the damage */
3788 dam = mon_damage_mod(m_ptr, dam, FALSE);
3790 msg_format(_("%^sは冷気をくらった!", "%^s is very cold!"), m_name);
3791 if (mon_take_hit(m_idx, dam, &fear, _("は凍りついた。", " was frozen.")))
3799 if (is_original_ap_and_seen(m_ptr))
3800 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
3805 if (p_ptr->dustrobe && alive && !p_ptr->is_dead)
3807 if (!(r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK))
3809 HIT_POINT dam = damroll(2, 6);
3811 /* Modify the damage */
3812 dam = mon_damage_mod(m_ptr, dam, FALSE);
3814 msg_format(_("%^sは鏡の破片をくらった!", "%^s gets zapped!"), m_name);
3815 if (mon_take_hit(m_idx, dam, &fear, _("はズタズタになった。", " had torn to pieces.")))
3823 if (is_original_ap_and_seen(m_ptr))
3824 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK);
3827 if (is_mirror_grid(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x]))
3829 teleport_player(10, 0L);
3833 if (p_ptr->tim_sh_holy && alive && !p_ptr->is_dead)
3835 if (r_ptr->flags3 & RF3_EVIL)
3837 if (!(r_ptr->flagsr & RFR_RES_ALL))
3839 HIT_POINT dam = damroll(2, 6);
3841 /* Modify the damage */
3842 dam = mon_damage_mod(m_ptr, dam, FALSE);
3844 msg_format(_("%^sは聖なるオーラで傷ついた!", "%^s is injured by holy power!"), m_name);
3845 if (mon_take_hit(m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3850 if (is_original_ap_and_seen(m_ptr))
3851 r_ptr->r_flags3 |= RF3_EVIL;
3855 if (is_original_ap_and_seen(m_ptr))
3856 r_ptr->r_flagsr |= RFR_RES_ALL;
3861 if (p_ptr->tim_sh_touki && alive && !p_ptr->is_dead)
3863 if (!(r_ptr->flagsr & RFR_RES_ALL))
3865 HIT_POINT dam = damroll(2, 6);
3867 /* Modify the damage */
3868 dam = mon_damage_mod(m_ptr, dam, FALSE);
3870 msg_format(_("%^sが鋭い闘気のオーラで傷ついた!", "%^s is injured by the Force"), m_name);
3871 if (mon_take_hit(m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3879 if (is_original_ap_and_seen(m_ptr))
3880 r_ptr->r_flagsr |= RFR_RES_ALL;
3884 if (hex_spelling(HEX_SHADOW_CLOAK) && alive && !p_ptr->is_dead)
3887 object_type *o_armed_ptr = &p_ptr->inventory_list[INVEN_RARM];
3889 if (!(r_ptr->flagsr & RFR_RES_ALL || r_ptr->flagsr & RFR_RES_DARK))
3891 if (o_armed_ptr->k_idx)
3893 int basedam = ((o_armed_ptr->dd + p_ptr->to_dd[0]) * (o_armed_ptr->ds + p_ptr->to_ds[0] + 1));
3894 dam = basedam / 2 + o_armed_ptr->to_d + p_ptr->to_d[0];
3897 /* Cursed armor makes damages doubled */
3898 o_armed_ptr = &p_ptr->inventory_list[INVEN_BODY];
3899 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr)) dam *= 2;
3901 /* Modify the damage */
3902 dam = mon_damage_mod(m_ptr, dam, FALSE);
3904 msg_format(_("影のオーラが%^sに反撃した!", "Enveloped shadows attack %^s."), m_name);
3905 if (mon_take_hit(m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3910 else /* monster does not dead */
3913 BIT_FLAGS flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
3914 EFFECT_ID typ[4][2] = {
3915 { INVEN_HEAD, GF_OLD_CONF },
3916 { INVEN_LARM, GF_OLD_SLEEP },
3917 { INVEN_HANDS, GF_TURN_ALL },
3918 { INVEN_FEET, GF_OLD_SLOW }
3921 /* Some cursed armours gives an extra effect */
3922 for (j = 0; j < 4; j++)
3924 o_armed_ptr = &p_ptr->inventory_list[typ[j][0]];
3925 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr) && object_is_armour(o_armed_ptr))
3926 project(0, 0, m_ptr->fy, m_ptr->fx, (p_ptr->lev * 2), typ[j][1], flg, -1);
3932 if (is_original_ap_and_seen(m_ptr))
3933 r_ptr->r_flagsr |= (RFR_RES_ALL | RFR_RES_DARK);
3939 /* Monster missed player */
3942 /* Analyze failed attacks */
3958 /* Visible monsters */
3961 disturb(TRUE, TRUE);
3965 msg_format("%sかわした。", (p_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "");
3967 msg_format("%s%^sの攻撃をかわした。", (p_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "", m_name);
3968 abbreviate = 1;/*2回目以降は省略 */
3970 msg_format("%^s misses you.", m_name);
3975 /* Gain shield experience */
3976 if (object_is_armour(&p_ptr->inventory_list[INVEN_RARM]) || object_is_armour(&p_ptr->inventory_list[INVEN_LARM]))
3978 int cur = p_ptr->skill_exp[GINOU_SHIELD];
3979 int max = s_info[p_ptr->pclass].s_max[GINOU_SHIELD];
3983 DEPTH targetlevel = r_ptr->level;
3987 /* Extra experience */
3988 if ((cur / 100) < targetlevel)
3990 if ((cur / 100 + 15) < targetlevel)
3991 inc += 1 + (targetlevel - (cur / 100 + 15));
3996 p_ptr->skill_exp[GINOU_SHIELD] = MIN(max, cur + inc);
3997 p_ptr->update |= (PU_BONUS);
4008 /* Analyze "visible" monsters only */
4009 if (is_original_ap_and_seen(m_ptr) && !do_silly_attack)
4011 /* Count "obvious" attacks (and ones that cause damage) */
4012 if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
4014 /* Count attacks of this type */
4015 if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
4017 r_ptr->r_blows[ap_cnt]++;
4022 if (p_ptr->riding && damage)
4024 char m_steed_name[MAX_NLEN];
4025 monster_desc(m_steed_name, ¤t_floor_ptr->m_list[p_ptr->riding], 0);
4026 if (rakuba((damage > 200) ? 200 : damage, FALSE))
4028 msg_format(_("%^sから落ちてしまった!", "You have fallen from %s."), m_steed_name);
4032 if (p_ptr->special_defense & NINJA_KAWARIMI)
4034 if (kawarimi(FALSE)) return TRUE;
4038 /* Hex - revenge damage stored */
4039 revenge_store(get_damage);
4041 if ((p_ptr->tim_eyeeye || hex_spelling(HEX_EYE_FOR_EYE))
4042 && get_damage > 0 && !p_ptr->is_dead)
4045 msg_format("攻撃が%s自身を傷つけた!", m_name);
4047 GAME_TEXT m_name_self[80];
4050 monster_desc(m_name_self, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE);
4052 msg_format("The attack of %s has wounded %s!", m_name, m_name_self);
4054 project(0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL, -1);
4055 if (p_ptr->tim_eyeeye) set_tim_eyeeye(p_ptr->tim_eyeeye-5, TRUE);
4058 if ((p_ptr->counter || (p_ptr->special_defense & KATA_MUSOU)) && alive && !p_ptr->is_dead && m_ptr->ml && (p_ptr->csp > 7))
4060 char m_target_name[MAX_NLEN];
4061 monster_desc(m_target_name, m_ptr, 0);
4064 msg_format(_("%^sに反撃した!", "Your counterattack to %s!"), m_target_name);
4065 py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_COUNTER);
4067 p_ptr->redraw |= (PR_MANA);
4071 if (blinked && alive && !p_ptr->is_dead)
4073 if (teleport_barrier(m_idx))
4075 msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But magic barrier obstructs it."));
4079 msg_print(_("泥棒は笑って逃げた!", "The thief flees laughing!"));
4080 teleport_away(m_idx, MAX_SIGHT * 2 + 5, 0L);
4085 /* Always notice cause of death */
4086 if (p_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !p_ptr->inside_arena)
4091 if (m_ptr->ml && fear && alive && !p_ptr->is_dead)
4094 msg_format(_("%^sは恐怖で逃げ出した!", "%^s flees in terror!"), m_name);
4097 if (p_ptr->special_defense & KATA_IAI)
4099 set_action(ACTION_NONE);
4102 /* Assume we attacked */
4108 * @brief モンスターが敵モンスターに行う打撃処理 /
4109 * Hack, based on mon_take_hit... perhaps all monster attacks on other monsters should use this?
4110 * @param m_idx 目標となるモンスターの参照ID
4112 * @param dead 目標となったモンスターの死亡状態を返す参照ポインタ
4113 * @param fear 目標となったモンスターの恐慌状態を返す参照ポインタ
4114 * @param note 目標モンスターが死亡した場合の特別メッセージ(NULLならば標準表示を行う)
4115 * @param who 打撃を行ったモンスターの参照ID
4118 void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *dead, bool *fear, concptr note, MONSTER_IDX who)
4120 monster_type *m_ptr = ¤t_floor_ptr->m_list[m_idx];
4121 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4122 GAME_TEXT m_name[160];
4123 bool seen = is_seen(m_ptr);
4125 /* Can the player be aware of this attack? */
4126 bool known = (m_ptr->cdis <= MAX_SIGHT);
4128 monster_desc(m_name, m_ptr, 0);
4130 /* Redraw (later) if needed */
4133 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
4134 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
4137 (void)set_monster_csleep(m_idx, 0);
4139 if (p_ptr->riding && (m_idx == p_ptr->riding)) disturb(TRUE, TRUE);
4141 if (MON_INVULNER(m_ptr) && randint0(PENETRATE_INVULNERABILITY))
4145 msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
4150 if (r_ptr->flagsr & RFR_RES_ALL)
4155 if ((dam == 0) && one_in_(3)) dam = 1;
4161 msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
4170 /* It is dead now... or is it? */
4173 if (((r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) ||
4174 (r_ptr->flags7 & RF7_NAZGUL)) &&
4175 !p_ptr->inside_battle)
4182 if (!monster_living(m_ptr->r_idx))
4184 sound(SOUND_N_KILL);
4195 monster_desc(m_name, m_ptr, MD_TRUE_NAME);
4196 /* Unseen death by normal attack */
4199 current_floor_ptr->monster_noise = TRUE;
4201 /* Death by special attack */
4204 msg_format(_("%^s%s", "%^s%s"), m_name, note);
4206 /* Death by normal attack -- nonliving monster */
4207 else if (!monster_living(m_ptr->r_idx))
4209 msg_format(_("%^sは破壊された。", "%^s is destroyed."), m_name);
4211 /* Death by normal attack -- living monster */
4214 msg_format(_("%^sは殺された。", "%^s is killed."), m_name);
4218 monster_gain_exp(who, m_ptr->r_idx);
4219 monster_death(m_idx, FALSE);
4220 delete_monster_idx(m_idx);
4225 /* Monster is dead */
4234 /* Mega-Hack -- Pain cancels fear */
4235 if (MON_MONFEAR(m_ptr) && (dam > 0))
4238 if (set_monster_monfear(m_idx, MON_MONFEAR(m_ptr) - randint1(dam / 4)))
4245 /* Sometimes a monster gets scared by damage */
4246 if (!MON_MONFEAR(m_ptr) && !(r_ptr->flags3 & RF3_NO_FEAR))
4248 /* Percentage of fully healthy */
4249 int percentage = (100L * m_ptr->hp) / m_ptr->maxhp;
4252 * Run (sometimes) if at 10% or less of max hit points,
4253 * or (usually) when hit for half its current hit points
4255 if (((percentage <= 10) && (randint0(10) < percentage)) ||
4256 ((dam >= m_ptr->hp) && (randint0(100) < 80)))
4258 /* Hack -- note fear */
4261 /* Hack -- Add some timed fear */
4262 (void)set_monster_monfear(m_idx, (randint1(10) +
4263 (((dam >= m_ptr->hp) && (percentage > 7)) ?
4264 20 : ((11 - percentage) * 5))));
4268 #endif /* ALLOW_FEAR */
4270 if ((dam > 0) && !is_pet(m_ptr) && !is_friendly(m_ptr) && (who != m_idx))
4272 if (is_pet(¤t_floor_ptr->m_list[who]) && !player_bold(m_ptr->target_y, m_ptr->target_x))
4274 set_target(m_ptr, current_floor_ptr->m_list[who].fy, current_floor_ptr->m_list[who].fx);
4278 if (p_ptr->riding && (p_ptr->riding == m_idx) && (dam > 0))
4280 monster_desc(m_name, m_ptr, 0);
4282 if (m_ptr->hp > m_ptr->maxhp / 3) dam = (dam + 1) / 2;
4283 if (rakuba((dam > 200) ? 200 : dam, FALSE))
4285 msg_format(_("%^sに振り落とされた!", "You have thrown off from %s!"), m_name);