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 /* Extract monster name (or "it") */
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 /* Extract monster name (or "it") */
1380 monster_desc(m_name, m_ptr, 0);
1382 /* Calculate the "attack quality" */
1383 bonus = p_ptr->to_h[hand] + o_ptr->to_h;
1384 chance = (p_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
1385 if (mode == HISSATSU_IAI) chance += 60;
1386 if (p_ptr->special_defense & KATA_KOUKIJIN) chance += 150;
1387 if (p_ptr->sutemi) chance = MAX(chance * 3 / 2, chance + 60);
1389 vir = virtue_number(V_VALOUR);
1392 chance += (p_ptr->virtues[vir - 1] / 10);
1395 zantetsu_mukou = ((o_ptr->name1 == ART_ZANTETSU) && (r_ptr->d_char == 'j'));
1396 e_j_mukou = ((o_ptr->name1 == ART_EXCALIBUR_J) && (r_ptr->d_char == 'S'));
1398 if ((mode == HISSATSU_KYUSHO) || (mode == HISSATSU_MINEUCHI) || (mode == HISSATSU_3DAN) || (mode == HISSATSU_IAI)) num_blow = 1;
1399 else if (mode == HISSATSU_COLD) num_blow = p_ptr->num_blow[hand] + 2;
1400 else num_blow = p_ptr->num_blow[hand];
1402 /* Hack -- DOKUBARI always hit once */
1403 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) num_blow = 1;
1405 /* Attack once for each legal blow */
1406 while ((num++ < num_blow) && !p_ptr->is_dead)
1408 if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) || (mode == HISSATSU_KYUSHO))
1412 if (p_ptr->migite && p_ptr->hidarite)
1416 if (mode == HISSATSU_3DAN)
1421 success_hit = one_in_(n);
1423 else if ((p_ptr->pclass == CLASS_NINJA) && ((backstab || fuiuchi) && !(r_ptr->flagsr & RFR_RES_ALL))) success_hit = TRUE;
1424 else success_hit = test_hit_norm(chance, r_ptr->ac, m_ptr->ml);
1426 if (mode == HISSATSU_MAJIN)
1429 success_hit = FALSE;
1435 int vorpal_chance = ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD)) ? 2 : 4;
1439 if (backstab) msg_format(_("あなたは冷酷にも眠っている無力な%sを突き刺した!", "You cruelly stab the helpless, sleeping %s!"), m_name);
1440 else if (fuiuchi) msg_format(_("不意を突いて%sに強烈な一撃を喰らわせた!", "You make surprise attack, and hit %s with a powerful blow!"), m_name);
1441 else if (stab_fleeing) msg_format(_("逃げる%sを背中から突き刺した!", "You backstab the fleeing %s!"), m_name);
1442 else if (!monk_attack) msg_format(_("%sを攻撃した。", "You hit %s."), m_name);
1444 /* Hack -- bare hands do one damage */
1447 object_flags(o_ptr, flgs);
1449 /* Select a chaotic effect (50% chance) */
1450 if ((have_flag(flgs, TR_CHAOTIC)) && one_in_(2))
1453 chg_virtue(V_CHANCE, 1);
1455 if (randint1(5) < 3)
1457 /* Vampiric (20%) */
1460 else if (one_in_(250))
1465 else if (!one_in_(10))
1467 /* Confusion (26.892%) */
1470 else if (one_in_(2))
1472 /* Teleport away (1.494%) */
1477 /* Polymorph (1.494%) */
1482 /* Vampiric drain */
1483 if ((have_flag(flgs, TR_VAMPIRIC)) || (chaos_effect == 1) || (mode == HISSATSU_DRAIN) || hex_spelling(HEX_VAMP_BLADE))
1485 /* Only drain "living" monsters */
1486 if (monster_living(m_ptr->r_idx))
1492 if ((have_flag(flgs, TR_VORPAL) || hex_spelling(HEX_RUNESWORD)) && (randint1(vorpal_chance * 3 / 2) == 1) && !zantetsu_mukou)
1494 else vorpal_cut = FALSE;
1498 int special_effect = 0, stun_effect = 0, times = 0, max_times;
1500 const martial_arts *ma_ptr = &ma_blows[0], *old_ptr = &ma_blows[0];
1501 int resist_stun = 0;
1504 if (r_ptr->flags1 & RF1_UNIQUE) resist_stun += 88;
1505 if (r_ptr->flags3 & RF3_NO_STUN) resist_stun += 66;
1506 if (r_ptr->flags3 & RF3_NO_CONF) resist_stun += 33;
1507 if (r_ptr->flags3 & RF3_NO_SLEEP) resist_stun += 33;
1508 if ((r_ptr->flags3 & RF3_UNDEAD) || (r_ptr->flags3 & RF3_NONLIVING))
1511 if (p_ptr->special_defense & KAMAE_BYAKKO)
1512 max_times = (p_ptr->lev < 3 ? 1 : p_ptr->lev / 3);
1513 else if (p_ptr->special_defense & KAMAE_SUZAKU)
1515 else if (p_ptr->special_defense & KAMAE_GENBU)
1518 max_times = (p_ptr->lev < 7 ? 1 : p_ptr->lev / 7);
1519 /* Attempt 'times' */
1520 for (times = 0; times < max_times; times++)
1524 ma_ptr = &ma_blows[randint0(MAX_MA)];
1525 if ((p_ptr->pclass == CLASS_FORCETRAINER) && (ma_ptr->min_level > 1)) min_level = ma_ptr->min_level + 3;
1526 else min_level = ma_ptr->min_level;
1527 } while ((min_level > p_ptr->lev) ||
1528 (randint1(p_ptr->lev) < ma_ptr->chance));
1530 /* keep the highest level attack available we found */
1531 if ((ma_ptr->min_level > old_ptr->min_level) &&
1532 !p_ptr->stun && !p_ptr->confused)
1536 if (p_ptr->wizard && cheat_xtra)
1538 msg_print(_("攻撃を再選択しました。", "Attack re-selected."));
1547 if (p_ptr->pclass == CLASS_FORCETRAINER) min_level = MAX(1, ma_ptr->min_level - 3);
1548 else min_level = ma_ptr->min_level;
1549 k = damroll(ma_ptr->dd + p_ptr->to_dd[hand], ma_ptr->ds + p_ptr->to_ds[hand]);
1550 if (p_ptr->special_attack & ATTACK_SUIKEN) k *= 2;
1552 if (ma_ptr->effect == MA_KNEE)
1554 if (r_ptr->flags1 & RF1_MALE)
1556 msg_format(_("%sに金的膝蹴りをくらわした!", "You hit %s in the groin with your knee!"), m_name);
1558 special_effect = MA_KNEE;
1561 msg_format(ma_ptr->desc, m_name);
1564 else if (ma_ptr->effect == MA_SLOW)
1566 if (!((r_ptr->flags1 & RF1_NEVER_MOVE) ||
1567 my_strchr("~#{}.UjmeEv$,DdsbBFIJQSXclnw!=?", r_ptr->d_char)))
1569 msg_format(_("%sの足首に関節蹴りをくらわした!", "You kick %s in the ankle."), m_name);
1570 special_effect = MA_SLOW;
1572 else msg_format(ma_ptr->desc, m_name);
1578 stun_effect = (ma_ptr->effect / 2) + randint1(ma_ptr->effect / 2);
1581 msg_format(ma_ptr->desc, m_name);
1584 if (p_ptr->special_defense & KAMAE_SUZAKU) weight = 4;
1585 if ((p_ptr->pclass == CLASS_FORCETRAINER) && P_PTR_KI)
1587 weight += (P_PTR_KI / 30);
1588 if (weight > 20) weight = 20;
1591 k = critical_norm(p_ptr->lev * weight, min_level, k, p_ptr->to_h[0], 0);
1593 if ((special_effect == MA_KNEE) && ((k + p_ptr->to_d[hand]) < m_ptr->hp))
1595 msg_format(_("%^sは苦痛にうめいている!", "%^s moans in agony!"), m_name);
1596 stun_effect = 7 + randint1(13);
1600 else if ((special_effect == MA_SLOW) && ((k + p_ptr->to_d[hand]) < m_ptr->hp))
1602 if (!(r_ptr->flags1 & RF1_UNIQUE) &&
1603 (randint1(p_ptr->lev) > r_ptr->level) &&
1606 msg_format(_("%^sは足をひきずり始めた。", "%^s starts limping slower."), m_name);
1607 m_ptr->mspeed -= 10;
1611 if (stun_effect && ((k + p_ptr->to_d[hand]) < m_ptr->hp))
1613 if (p_ptr->lev > randint1(r_ptr->level + resist_stun + 10))
1615 if (set_monster_stunned(g_ptr->m_idx, stun_effect + MON_STUNNED(m_ptr)))
1617 msg_format(_("%^sはフラフラになった。", "%^s is stunned."), m_name);
1621 msg_format(_("%^sはさらにフラフラになった。", "%^s is more stunned."), m_name);
1627 /* Handle normal weapon */
1628 else if (o_ptr->k_idx)
1630 k = damroll(o_ptr->dd + p_ptr->to_dd[hand], o_ptr->ds + p_ptr->to_ds[hand]);
1631 k = tot_dam_aux(o_ptr, k, m_ptr, mode, FALSE);
1635 k *= (3 + (p_ptr->lev / 20));
1639 k = k*(5 + (p_ptr->lev * 2 / 25)) / 2;
1641 else if (stab_fleeing)
1646 if ((p_ptr->impact[hand] && ((k > 50) || one_in_(7))) ||
1647 (chaos_effect == 2) || (mode == HISSATSU_QUAKE))
1652 if ((!(o_ptr->tval == TV_SWORD) || !(o_ptr->sval == SV_DOKUBARI)) && !(mode == HISSATSU_KYUSHO))
1653 k = critical_norm(o_ptr->weight, o_ptr->to_h, k, p_ptr->to_h[hand], mode);
1661 if ((o_ptr->name1 == ART_CHAINSWORD) && !one_in_(2))
1663 char chainsword_noise[1024];
1664 if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, chainsword_noise))
1666 msg_print(chainsword_noise);
1670 if (o_ptr->name1 == ART_VORPAL_BLADE)
1672 msg_print(_("目にも止まらぬヴォーパルブレード、手錬の早業!", "Your Vorpal Blade goes snicker-snack!"));
1676 msg_format(_("%sをグッサリ切り裂いた!", "Your weapon cuts deep into %s!"), m_name);
1679 /* Try to increase the damage */
1680 while (one_in_(vorpal_chance))
1685 k *= (HIT_POINT)mult;
1688 if (((r_ptr->flagsr & RFR_RES_ALL) ? k / 100 : k) > m_ptr->hp)
1690 msg_format(_("%sを真っ二つにした!", "You cut %s in half!"), m_name);
1696 case 2: msg_format(_("%sを斬った!", "You gouge %s!"), m_name); break;
1697 case 3: msg_format(_("%sをぶった斬った!", "You maim %s!"), m_name); break;
1698 case 4: msg_format(_("%sをメッタ斬りにした!", "You carve %s!"), m_name); break;
1699 case 5: msg_format(_("%sをメッタメタに斬った!", "You cleave %s!"), m_name); break;
1700 case 6: msg_format(_("%sを刺身にした!", "You smite %s!"), m_name); break;
1701 case 7: msg_format(_("%sを斬って斬って斬りまくった!", "You eviscerate %s!"), m_name); break;
1702 default: msg_format(_("%sを細切れにした!", "You shred %s!"), m_name); break;
1705 drain_result = drain_result * 3 / 2;
1709 drain_result += o_ptr->to_d;
1712 /* Apply the player damage bonuses */
1713 k += p_ptr->to_d[hand];
1714 drain_result += p_ptr->to_d[hand];
1716 if ((mode == HISSATSU_SUTEMI) || (mode == HISSATSU_3DAN)) k *= 2;
1717 if ((mode == HISSATSU_SEKIRYUKA) && !monster_living(m_ptr->r_idx)) k = 0;
1718 if ((mode == HISSATSU_SEKIRYUKA) && !p_ptr->cut) k /= 2;
1720 /* No negative damage */
1723 if ((mode == HISSATSU_ZANMA) && !(!monster_living(m_ptr->r_idx) && (r_ptr->flags3 & RF3_EVIL)))
1730 msg_print(_("こんな軟らかいものは切れん!", "You cannot cut such a elastic thing!"));
1736 msg_print(_("蜘蛛は苦手だ!", "Spiders are difficult for you to deal with!"));
1740 if (mode == HISSATSU_MINEUCHI)
1742 int tmp = (10 + randint1(15) + p_ptr->lev / 5);
1745 anger_monster(m_ptr);
1747 if (!(r_ptr->flags3 & (RF3_NO_STUN)))
1750 if (MON_STUNNED(m_ptr))
1752 msg_format(_("%sはひどくもうろうとした。", "%s is more dazed."), m_name);
1757 msg_format(_("%s はもうろうとした。", "%s is dazed."), m_name);
1761 (void)set_monster_stunned(g_ptr->m_idx, MON_STUNNED(m_ptr) + tmp);
1765 msg_format(_("%s には効果がなかった。", "%s is not effected."), m_name);
1769 /* Modify the damage */
1770 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))));
1771 if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) || (mode == HISSATSU_KYUSHO))
1773 if ((randint1(randint1(r_ptr->level / 7) + 5) == 1) && !(r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags7 & RF7_UNIQUE2))
1776 msg_format(_("%sの急所を突き刺した!", "You hit %s on a fatal spot!"), m_name);
1780 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)))
1782 int maxhp = maxroll(r_ptr->hdice, r_ptr->hside);
1783 if (one_in_(backstab ? 13 : (stab_fleeing || fuiuchi) ? 15 : 27))
1787 msg_format(_("刃が%sに深々と突き刺さった!", "You critically injured %s!"), m_name);
1789 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)))
1791 if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_UNIQUE2) || (m_ptr->hp >= maxhp / 2))
1793 k = MAX(k * 5, m_ptr->hp / 2);
1795 msg_format(_("%sに致命傷を負わせた!", "You fatally injured %s!"), m_name);
1800 msg_format(_("刃が%sの急所を貫いた!", "You hit %s on a fatal spot!"), m_name);
1805 msg_format_wizard(CHEAT_MONSTER,
1806 _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"), k,
1807 m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
1809 if (k <= 0) can_drain = FALSE;
1811 if (drain_result > m_ptr->hp)
1812 drain_result = m_ptr->hp;
1814 /* Damage, check for fear and death */
1815 if (mon_take_hit(g_ptr->m_idx, k, fear, NULL))
1818 if ((p_ptr->pclass == CLASS_BERSERKER) && p_ptr->energy_use)
1820 if (p_ptr->migite && p_ptr->hidarite)
1822 if (hand) p_ptr->energy_use = p_ptr->energy_use * 3 / 5 + p_ptr->energy_use*num * 2 / (p_ptr->num_blow[hand] * 5);
1823 else p_ptr->energy_use = p_ptr->energy_use*num * 3 / (p_ptr->num_blow[hand] * 5);
1827 p_ptr->energy_use = p_ptr->energy_use*num / p_ptr->num_blow[hand];
1830 if ((o_ptr->name1 == ART_ZANTETSU) && is_lowlevel)
1831 msg_print(_("またつまらぬものを斬ってしまった...", "Sigh... Another trifling thing I've cut...."));
1835 /* Anger the monster */
1836 if (k > 0) anger_monster(m_ptr);
1838 touch_zap_player(m_ptr);
1840 /* Are we draining it? A little note: If the monster is
1841 dead, the drain does not work... */
1843 if (can_drain && (drain_result > 0))
1845 if (o_ptr->name1 == ART_MURAMASA)
1849 HIT_PROB to_h = o_ptr->to_h;
1850 HIT_POINT to_d = o_ptr->to_d;
1854 for (i = 0; i < to_h + 3; i++) if (one_in_(4)) flag = 0;
1858 for (i = 0; i < to_d + 3; i++) if (one_in_(4)) flag = 0;
1861 if (o_ptr->to_h != to_h || o_ptr->to_d != to_d)
1863 msg_print(_("妖刀は血を吸って強くなった!", "Muramasa sucked blood, and became more powerful!"));
1871 if (drain_result > 5) /* Did we really hurt it? */
1873 drain_heal = damroll(2, drain_result / 6);
1876 if (hex_spelling(HEX_VAMP_BLADE)) drain_heal *= 2;
1880 msg_format(_("Draining left: %d", "Draining left: %d"), drain_left);
1885 if (drain_heal < drain_left)
1887 drain_left -= drain_heal;
1891 drain_heal = drain_left;
1897 msg_format(_("刃が%sから生命力を吸い取った!", "Your weapon drains life from %s!"), m_name);
1901 drain_heal = (drain_heal * p_ptr->mutant_regenerate_mod) / 100;
1903 hp_player(drain_heal);
1904 /* We get to keep some of it! */
1908 m_ptr->maxhp -= (k + 7) / 8;
1909 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
1910 if (m_ptr->maxhp < 1) m_ptr->maxhp = 1;
1916 /* Confusion attack */
1917 if ((p_ptr->special_attack & ATTACK_CONFUSE) || (chaos_effect == 3) || (mode == HISSATSU_CONF) || hex_spelling(HEX_CONFUSION))
1919 /* Cancel glowing hands */
1920 if (p_ptr->special_attack & ATTACK_CONFUSE)
1922 p_ptr->special_attack &= ~(ATTACK_CONFUSE);
1923 msg_print(_("手の輝きがなくなった。", "Your hands stop glowing."));
1924 p_ptr->redraw |= (PR_STATUS);
1928 /* Confuse the monster */
1929 if (r_ptr->flags3 & RF3_NO_CONF)
1931 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_NO_CONF;
1932 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
1935 else if (randint0(100) < r_ptr->level)
1937 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
1941 msg_format(_("%^sは混乱したようだ。", "%^s appears confused."), m_name);
1942 (void)set_monster_confused(g_ptr->m_idx, MON_CONFUSED(m_ptr) + 10 + randint0(p_ptr->lev) / 5);
1946 else if (chaos_effect == 4)
1948 bool resists_tele = FALSE;
1950 if (r_ptr->flagsr & RFR_RES_TELE)
1952 if (r_ptr->flags1 & RF1_UNIQUE)
1954 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1955 msg_format(_("%^sには効果がなかった。", "%^s is unaffected!"), m_name);
1956 resists_tele = TRUE;
1958 else if (r_ptr->level > randint1(100))
1960 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1961 msg_format(_("%^sは抵抗力を持っている!", "%^s resists!"), m_name);
1962 resists_tele = TRUE;
1968 msg_format(_("%^sは消えた!", "%^s disappears!"), m_name);
1969 teleport_away(g_ptr->m_idx, 50, TELEPORT_PASSIVE);
1970 num = num_blow + 1; /* Can't hit it anymore! */
1975 else if ((chaos_effect == 5) && (randint1(90) > r_ptr->level))
1977 if (!(r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) &&
1978 !(r_ptr->flagsr & RFR_EFF_RES_CHAO_MASK))
1980 if (polymorph_monster(y, x))
1982 msg_format(_("%^sは変化した!", "%^s changes!"), m_name);
1988 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
1991 /* Hack -- Get new monster */
1992 m_ptr = ¤t_floor_ptr->m_list[g_ptr->m_idx];
1994 /* Oops, we need a different name... */
1995 monster_desc(m_name, m_ptr, 0);
1997 /* Hack -- Get new race */
1998 r_ptr = &r_info[m_ptr->r_idx];
2001 else if (o_ptr->name1 == ART_G_HAMMER)
2003 monster_type *target_ptr = ¤t_floor_ptr->m_list[g_ptr->m_idx];
2005 if (target_ptr->hold_o_idx)
2007 object_type *q_ptr = ¤t_floor_ptr->o_list[target_ptr->hold_o_idx];
2008 GAME_TEXT o_name[MAX_NLEN];
2010 object_desc(o_name, q_ptr, OD_NAME_ONLY);
2011 q_ptr->held_m_idx = 0;
2012 q_ptr->marked = OM_TOUCHED;
2013 target_ptr->hold_o_idx = q_ptr->next_o_idx;
2014 q_ptr->next_o_idx = 0;
2015 msg_format(_("%sを奪った。", "You snatched %s."), o_name);
2024 backstab = FALSE; /* Clumsy! */
2025 fuiuchi = FALSE; /* Clumsy! */
2027 if ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE) && one_in_(3))
2029 BIT_FLAGS flgs_aux[TR_FLAG_SIZE];
2033 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
2034 msg_print(_("振り回した大鎌が自分自身に返ってきた!", "Your scythe returns to you!"));
2035 object_flags(o_ptr, flgs_aux);
2037 k = damroll(o_ptr->dd + p_ptr->to_dd[hand], o_ptr->ds + p_ptr->to_ds[hand]);
2040 switch (p_ptr->mimic_form)
2043 switch (p_ptr->prace)
2050 case RACE_BARBARIAN:
2054 case RACE_HALF_TROLL:
2055 case RACE_HALF_OGRE:
2056 case RACE_HALF_GIANT:
2057 case RACE_HALF_TITAN:
2065 case RACE_DRACONIAN:
2072 case MIMIC_DEMON_LORD:
2079 if (p_ptr->align < 0 && mult < 20)
2081 if (!(p_ptr->resist_acid || IS_OPPOSE_ACID() || p_ptr->immune_acid) && (mult < 25))
2083 if (!(p_ptr->resist_elec || IS_OPPOSE_ELEC() || p_ptr->immune_elec) && (mult < 25))
2085 if (!(p_ptr->resist_fire || IS_OPPOSE_FIRE() || p_ptr->immune_fire) && (mult < 25))
2087 if (!(p_ptr->resist_cold || IS_OPPOSE_COLD() || p_ptr->immune_cold) && (mult < 25))
2089 if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()) && (mult < 25))
2092 if ((p_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs_aux, TR_FORCE_WEAPON)) && (p_ptr->csp >(p_ptr->msp / 30)))
2094 p_ptr->csp -= (1 + (p_ptr->msp / 30));
2095 p_ptr->redraw |= (PR_MANA);
2096 mult = mult * 3 / 2 + 20;
2098 k *= (HIT_POINT)mult;
2102 k = critical_norm(o_ptr->weight, o_ptr->to_h, k, p_ptr->to_h[hand], mode);
2106 msg_format(_("グッサリ切り裂かれた!", "Your weapon cuts deep into yourself!"));
2107 /* Try to increase the damage */
2113 k *= (HIT_POINT)mult;
2115 k += (p_ptr->to_d[hand] + o_ptr->to_d);
2118 take_hit(DAMAGE_FORCE, k, _("死の大鎌", "Death scythe"), -1);
2124 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
2132 if (weak && !(*mdeath))
2134 msg_format(_("%sは弱くなったようだ。", "%^s seems weakened."), m_name);
2136 if (drain_left != MAX_VAMPIRIC_DRAIN)
2140 chg_virtue(V_UNLIFE, 1);
2143 /* Mega-Hack -- apply earthquake brand */
2146 earthquake(p_ptr->y, p_ptr->x, 10, 0);
2147 if (!current_floor_ptr->grid_array[y][x].m_idx) *mdeath = TRUE;
2152 * @brief プレイヤーの打撃処理メインルーチン
2155 * @param mode 発動中の剣術ID
2156 * @return 実際に攻撃処理が行われた場合TRUEを返す。
2158 * If no "weapon" is available, then "punch" the monster one time.
2160 bool py_attack(POSITION y, POSITION x, COMBAT_OPTION_IDX mode)
2163 bool mdeath = FALSE;
2164 bool stormbringer = FALSE;
2166 grid_type *g_ptr = ¤t_floor_ptr->grid_array[y][x];
2167 monster_type *m_ptr = ¤t_floor_ptr->m_list[g_ptr->m_idx];
2168 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2169 GAME_TEXT m_name[MAX_NLEN];
2171 disturb(FALSE, TRUE);
2173 take_turn(p_ptr, 100);
2175 if (!p_ptr->migite && !p_ptr->hidarite &&
2176 !(p_ptr->muta2 & (MUT2_HORNS | MUT2_BEAK | MUT2_SCOR_TAIL | MUT2_TRUNK | MUT2_TENTACLES)))
2178 msg_format(_("%s攻撃できない。", "You cannot do attacking."),
2179 (empty_hands(FALSE) == EMPTY_HAND_NONE) ? _("両手がふさがって", "") : "");
2183 /* Extract monster name (or "it") */
2184 monster_desc(m_name, m_ptr, 0);
2188 /* Auto-Recall if possible and visible */
2189 if (!p_ptr->image) monster_race_track(m_ptr->ap_r_idx);
2191 /* Track a new monster */
2192 health_track(g_ptr->m_idx);
2195 if ((r_ptr->flags1 & RF1_FEMALE) &&
2196 !(p_ptr->stun || p_ptr->confused || p_ptr->image || !m_ptr->ml))
2198 if ((p_ptr->inventory_list[INVEN_RARM].name1 == ART_ZANTETSU) || (p_ptr->inventory_list[INVEN_LARM].name1 == ART_ZANTETSU))
2200 msg_print(_("拙者、おなごは斬れぬ!", "I can not attack women!"));
2205 if (d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MELEE)
2207 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));
2211 /* Stop if friendly */
2212 if (!is_hostile(m_ptr) &&
2213 !(p_ptr->stun || p_ptr->confused || p_ptr->image ||
2214 p_ptr->shero || !m_ptr->ml))
2216 if (p_ptr->inventory_list[INVEN_RARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
2217 if (p_ptr->inventory_list[INVEN_LARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
2220 msg_format(_("黒い刃は強欲に%sを攻撃した!", "Your black blade greedily attacks %s!"), m_name);
2221 chg_virtue(V_INDIVIDUALISM, 1);
2222 chg_virtue(V_HONOUR, -1);
2223 chg_virtue(V_JUSTICE, -1);
2224 chg_virtue(V_COMPASSION, -1);
2226 else if (p_ptr->pclass != CLASS_BERSERKER)
2228 if (get_check(_("本当に攻撃しますか?", "Really hit it? ")))
2230 chg_virtue(V_INDIVIDUALISM, 1);
2231 chg_virtue(V_HONOUR, -1);
2232 chg_virtue(V_JUSTICE, -1);
2233 chg_virtue(V_COMPASSION, -1);
2237 msg_format(_("%sを攻撃するのを止めた。", "You stop to avoid hitting %s."), m_name);
2244 /* Handle player fear */
2248 msg_format(_("恐くて%sを攻撃できない!", "You are too afraid to attack %s!"), m_name);
2250 msg_format(_("そっちには何か恐いものがいる!", "There is something scary in your way!"));
2252 /* Disturb the monster */
2253 (void)set_monster_csleep(g_ptr->m_idx, 0);
2258 if (MON_CSLEEP(m_ptr)) /* It is not honorable etc to attack helpless victims */
2260 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(V_COMPASSION, -1);
2261 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(V_HONOUR, -1);
2264 if (p_ptr->migite && p_ptr->hidarite)
2266 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))
2268 if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_BEGINNER)
2269 p_ptr->skill_exp[GINOU_NITOURYU] += 80;
2270 else if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_SKILLED)
2271 p_ptr->skill_exp[GINOU_NITOURYU] += 4;
2272 else if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_EXPERT)
2273 p_ptr->skill_exp[GINOU_NITOURYU] += 1;
2274 else if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_MASTER)
2275 if (one_in_(3)) p_ptr->skill_exp[GINOU_NITOURYU] += 1;
2276 p_ptr->update |= (PU_BONUS);
2280 /* Gain riding experience */
2283 int cur = p_ptr->skill_exp[GINOU_RIDING];
2284 int max = s_info[p_ptr->pclass].s_max[GINOU_RIDING];
2288 DEPTH ridinglevel = r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].level;
2289 DEPTH targetlevel = r_ptr->level;
2292 if ((cur / 200 - 5) < targetlevel)
2295 /* Extra experience */
2296 if ((cur / 100) < ridinglevel)
2298 if ((cur / 100 + 15) < ridinglevel)
2299 inc += 1 + (ridinglevel - (cur / 100 + 15));
2304 p_ptr->skill_exp[GINOU_RIDING] = MIN(max, cur + inc);
2305 p_ptr->update |= (PU_BONUS);
2309 p_ptr->riding_t_m_idx = g_ptr->m_idx;
2310 if (p_ptr->migite) py_attack_aux(y, x, &fear, &mdeath, 0, mode);
2311 if (p_ptr->hidarite && !mdeath) py_attack_aux(y, x, &fear, &mdeath, 1, mode);
2313 /* Mutations which yield extra 'natural' attacks */
2316 if ((p_ptr->muta2 & MUT2_HORNS) && !mdeath)
2317 natural_attack(g_ptr->m_idx, MUT2_HORNS, &fear, &mdeath);
2318 if ((p_ptr->muta2 & MUT2_BEAK) && !mdeath)
2319 natural_attack(g_ptr->m_idx, MUT2_BEAK, &fear, &mdeath);
2320 if ((p_ptr->muta2 & MUT2_SCOR_TAIL) && !mdeath)
2321 natural_attack(g_ptr->m_idx, MUT2_SCOR_TAIL, &fear, &mdeath);
2322 if ((p_ptr->muta2 & MUT2_TRUNK) && !mdeath)
2323 natural_attack(g_ptr->m_idx, MUT2_TRUNK, &fear, &mdeath);
2324 if ((p_ptr->muta2 & MUT2_TENTACLES) && !mdeath)
2325 natural_attack(g_ptr->m_idx, MUT2_TENTACLES, &fear, &mdeath);
2328 /* Hack -- delay fear messages */
2329 if (fear && m_ptr->ml && !mdeath)
2333 msg_format(_("%^sは恐怖して逃げ出した!", "%^s flees in terror!"), m_name);
2336 if ((p_ptr->special_defense & KATA_IAI) && ((mode != HISSATSU_IAI) || mdeath))
2338 set_action(ACTION_NONE);
2345 * @brief モンスターからプレイヤーへの打撃処理 / Attack the player via physical attacks.
2346 * @param m_idx 打撃を行うモンスターのID
2347 * @return 実際に攻撃処理を行った場合TRUEを返す
2349 bool make_attack_normal(MONSTER_IDX m_idx)
2351 monster_type *m_ptr = ¤t_floor_ptr->m_list[m_idx];
2352 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2360 int do_cut, do_stun;
2364 GAME_TEXT o_name[MAX_NLEN];
2365 GAME_TEXT m_name[MAX_NLEN];
2366 GAME_TEXT ddesc[80];
2369 bool touched = FALSE, fear = FALSE, alive = TRUE;
2370 bool explode = FALSE;
2371 bool do_silly_attack = (one_in_(2) && p_ptr->image);
2372 HIT_POINT get_damage = 0;
2373 int abbreviate = 0; // 2回目以降の省略表現フラグ
2375 /* Not allowed to attack */
2376 if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return (FALSE);
2378 if (d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) return (FALSE);
2380 /* ...nor if friendly */
2381 if (!is_hostile(m_ptr)) return FALSE;
2383 /* Extract the effective monster level */
2384 rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
2386 /* Get the monster name (or "it") */
2387 monster_desc(m_name, m_ptr, 0);
2389 monster_desc(ddesc, m_ptr, MD_WRONGDOER_NAME);
2391 if (p_ptr->special_defense & KATA_IAI)
2393 msg_format(_("相手が襲いかかる前に素早く武器を振るった。", "You took sen, draw and cut in one motion before %s move."), m_name);
2394 if (py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_IAI)) return TRUE;
2397 if ((p_ptr->special_defense & NINJA_KAWARIMI) && (randint0(55) < (p_ptr->lev*3/5+20)))
2399 if (kawarimi(TRUE)) return TRUE;
2402 /* Assume no blink */
2405 /* Scan through all four blows */
2406 for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
2408 bool obvious = FALSE;
2410 HIT_POINT power = 0;
2411 HIT_POINT damage = 0;
2415 /* Extract the attack infomation */
2416 int effect = r_ptr->blow[ap_cnt].effect;
2417 int method = r_ptr->blow[ap_cnt].method;
2418 int d_dice = r_ptr->blow[ap_cnt].d_dice;
2419 int d_side = r_ptr->blow[ap_cnt].d_side;
2421 if (!monster_is_valid(m_ptr)) break;
2423 /* Hack -- no more attacks */
2426 if (is_pet(m_ptr) && (r_ptr->flags1 & RF1_UNIQUE) && (method == RBM_EXPLODE))
2432 /* Stop if player is dead or gone */
2433 if (!p_ptr->playing || p_ptr->is_dead) break;
2434 if (distance(p_ptr->y, p_ptr->x, m_ptr->fy, m_ptr->fx) > 1) break;
2436 /* Handle "leaving" */
2437 if (p_ptr->leaving) break;
2439 if (method == RBM_SHOOT) continue;
2441 /* Extract the attack "power" */
2442 power = mbe_info[effect].power;
2445 ac = p_ptr->ac + p_ptr->to_a;
2447 /* Monster hits player */
2448 if (!effect || check_hit(power, rlev, MON_STUNNED(m_ptr)))
2450 /* Always disturbing */
2451 disturb(TRUE, TRUE);
2454 /* Hack -- Apply "protection from evil" */
2455 if ((p_ptr->protevil > 0) &&
2456 (r_ptr->flags3 & RF3_EVIL) &&
2457 (p_ptr->lev >= rlev) &&
2458 ((randint0(100) + p_ptr->lev) > 50))
2460 /* Remember the Evil-ness */
2461 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_EVIL;
2464 if (abbreviate) msg_format("撃退した。");
2465 else msg_format("%^sは撃退された。", m_name);
2466 abbreviate = 1; /*2回目以降は省略 */
2468 msg_format("%^s is repelled.", m_name);
2472 /* Hack -- Next attack */
2477 /* Assume no cut or stun */
2478 do_cut = do_stun = 0;
2480 /* Describe the attack method */
2485 act = _("殴られた。", "hits you.");
2486 do_cut = do_stun = 1;
2494 act = _("触られた。", "touches you.");
2502 act = _("パンチされた。", "punches you.");
2511 act = _("蹴られた。", "kicks you.");
2520 act = _("ひっかかれた。", "claws you.");
2529 act = _("噛まれた。", "bites you.");
2538 act = _("刺された。", "stings you.");
2546 act = _("斬られた。", "slashes you.");
2555 act = _("角で突かれた。", "butts you.");
2564 act = _("体当たりされた。", "crushes you.");
2573 act = _("飲み込まれた。", "engulfs you.");
2582 act = _("は請求書をよこした。", "charges you.");
2584 sound(SOUND_BUY); /* Note! This is "charges", not "charges at". */
2591 act = _("が体の上を這い回った。", "crawls on you.");
2599 act = _("よだれをたらされた。", "drools on you.");
2606 act = _("唾を吐かれた。", "spits on you.");
2614 act = _("は爆発した。", "explodes.");
2621 act = _("にらまれた。", "gazes at you.");
2627 act = _("泣き叫ばれた。", "wails at you.");
2634 act = _("胞子を飛ばされた。", "releases spores at you.");
2642 act = _("が XXX4 を発射した。", "projects XXX4's at you.");
2648 act = _("金をせがまれた。", "begs you for money.");
2658 act = desc_insult[randint0(m_ptr->r_idx == MON_DEBBY ? 10 : 8)];
2668 act = desc_moan[randint0(4)];
2678 if (m_ptr->r_idx == MON_JAIAN)
2681 switch(randint1(15))
2686 act = "「♪お~れはジャイアン~~ガ~キだいしょう~」";
2689 act = "「♪て~んかむ~てきのお~とこだぜ~~」";
2692 act = "「♪の~び太スネ夫はメじゃないよ~~」";
2695 act = "「♪け~んかスポ~ツ~どんとこい~」";
2698 act = "「♪うた~も~~う~まいぜ~まかしとけ~」";
2701 act = "「♪ま~ちいちば~んのに~んきもの~~」";
2704 act = "「♪べんきょうしゅくだいメじゃないよ~~」";
2707 act = "「♪きはやさし~くて~ち~からもち~」";
2710 act = "「♪かお~も~~スタイルも~バツグンさ~」";
2713 act = "「♪がっこうい~ちの~あ~ばれんぼう~~」";
2716 act = "「♪ド~ラもドラミもメじゃないよ~~」";
2719 act = "「♪よじげんぽけっと~な~くたって~」";
2722 act = "「♪あし~の~~ながさ~は~まけないぜ~」";
2726 act = "horribly sings 'I AM GIAAAAAN. THE BOOOSS OF THE KIIIIDS.'";
2732 act = _("は♪僕らは楽しい家族♪と歌っている。", "sings 'We are a happy family.'");
2734 act = _("は♪アイ ラブ ユー、ユー ラブ ミー♪と歌っている。", "sings 'I love you, you love me.'");
2744 if (do_silly_attack)
2749 act = silly_attacks[randint0(MAX_SILLY_ATTACK)];
2752 if (abbreviate == 0)
2753 msg_format("%^sに%s", m_name, act);
2754 else if (abbreviate == 1)
2755 msg_format("%s", act);
2756 else /* if (abbreviate == -1) */
2757 msg_format("%^s%s", m_name, act);
2758 abbreviate = 1;/*2回目以降は省略 */
2760 msg_format("%^s %s%s", m_name, act, do_silly_attack ? " you." : "");
2764 /* Hack -- assume all attacks are obvious */
2767 /* Roll out the damage */
2768 damage = damroll(d_dice, d_side);
2771 * Skip the effect when exploding, since the explosion
2772 * already causes the effect.
2774 if(explode) damage = 0;
2775 /* Apply appropriate damage */
2785 case RBE_SUPERHURT: /* AC軽減あり / Player armor reduces total damage */
2787 if (((randint1(rlev*2+300) > (ac+200)) || one_in_(13)) && !CHECK_MULTISHADOW())
2789 int tmp_damage = damage - (damage * ((ac < 150) ? ac : 150) / 250);
2790 msg_print(_("痛恨の一撃!", "It was a critical hit!"));
2791 tmp_damage = MAX(damage, tmp_damage*2);
2793 get_damage += take_hit(DAMAGE_ATTACK, tmp_damage, ddesc, -1);
2797 case RBE_HURT: /* AC軽減あり / Player armor reduces total damage */
2800 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
2801 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2809 /* Take "poison" effect */
2810 if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()) && !CHECK_MULTISHADOW())
2812 if (set_poisoned(p_ptr->poisoned + randint1(rlev) + 5))
2818 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2820 /* Learn about the player */
2821 update_smart_learn(m_idx, DRS_POIS);
2830 /* Allow complete resist */
2831 if (!p_ptr->resist_disen && !CHECK_MULTISHADOW())
2833 /* Apply disenchantment */
2834 if (apply_disenchant(0))
2836 /* Hack -- Update AC */
2837 update_creature(p_ptr);
2842 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2844 /* Learn about the player */
2845 update_smart_learn(m_idx, DRS_DISEN);
2852 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2854 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2857 for (k = 0; k < 10; k++)
2860 i = (INVENTORY_IDX)randint0(INVEN_PACK);
2862 /* Obtain the item */
2863 o_ptr = &p_ptr->inventory_list[i];
2864 if (!o_ptr->k_idx) continue;
2866 /* Drain charged wands/staffs */
2867 if (((o_ptr->tval == TV_STAFF) ||
2868 (o_ptr->tval == TV_WAND)) &&
2871 /* Calculate healed hitpoints */
2872 int heal=rlev * o_ptr->pval;
2873 if( o_ptr->tval == TV_STAFF)
2874 heal *= o_ptr->number;
2876 /* Don't heal more than max hp */
2877 heal = MIN(heal, m_ptr->maxhp - m_ptr->hp);
2879 msg_print(_("ザックからエネルギーが吸い取られた!", "Energy drains from your pack!"));
2883 /* Heal the monster */
2884 m_ptr->hp += (HIT_POINT)heal;
2886 /* Redraw (later) if needed */
2887 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
2888 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
2893 /* Combine / Reorder the pack */
2894 p_ptr->update |= (PU_COMBINE | PU_REORDER);
2895 p_ptr->window |= (PW_INVEN);
2906 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2908 /* Confused monsters cannot steal successfully. -LM-*/
2909 if (MON_CONFUSED(m_ptr)) break;
2911 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2915 /* Saving throw (unless paralyzed) based on dex and level */
2916 if (!p_ptr->paralyzed &&
2917 (randint0(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
2920 /* Saving throw message */
2921 msg_print(_("しかし素早く財布を守った!", "You quickly protect your money pouch!"));
2923 /* Occasional blink anyway */
2924 if (randint0(3)) blinked = TRUE;
2930 gold = (p_ptr->au / 10) + randint1(25);
2931 if (gold < 2) gold = 2;
2932 if (gold > 5000) gold = (p_ptr->au / 20) + randint1(3000);
2933 if (gold > p_ptr->au) gold = p_ptr->au;
2937 msg_print(_("しかし何も盗まれなかった。", "Nothing was stolen."));
2941 msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2942 msg_format(_("$%ld のお金が盗まれた!", "%ld coins were stolen!"), (long)gold);
2943 chg_virtue(V_SACRIFICE, 1);
2947 msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2948 msg_print(_("お金が全部盗まれた!", "All of your coins were stolen!"));
2949 chg_virtue(V_SACRIFICE, 2);
2953 p_ptr->redraw |= (PR_GOLD);
2955 p_ptr->window |= (PW_PLAYER);
2966 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2968 /* Confused monsters cannot steal successfully. -LM-*/
2969 if (MON_CONFUSED(m_ptr)) break;
2971 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2973 /* Saving throw (unless paralyzed) based on dex and level */
2974 if (!p_ptr->paralyzed &&
2975 (randint0(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
2978 /* Saving throw message */
2979 msg_print(_("しかしあわててザックを取り返した!", "You grab hold of your backpack!"));
2981 /* Occasional "blink" anyway */
2988 for (k = 0; k < 10; k++)
2993 i = (INVENTORY_IDX)randint0(INVEN_PACK);
2995 /* Obtain the item */
2996 o_ptr = &p_ptr->inventory_list[i];
2997 if (!o_ptr->k_idx) continue;
2999 /* Skip artifacts */
3000 if (object_is_artifact(o_ptr)) continue;
3002 object_desc(o_name, o_ptr, OD_OMIT_PREFIX);
3005 msg_format("%s(%c)を%s盗まれた!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
3007 msg_format("%sour %s (%c) was stolen!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
3009 chg_virtue(V_SACRIFICE, 1);
3016 j_ptr = ¤t_floor_ptr->o_list[o_idx];
3017 object_copy(j_ptr, o_ptr);
3022 /* Hack -- If a rod or wand, allocate total
3023 * maximum timeouts or charges between those
3024 * stolen and those missed. -LM-
3026 if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
3028 j_ptr->pval = o_ptr->pval / o_ptr->number;
3029 o_ptr->pval -= j_ptr->pval;
3033 j_ptr->marked = OM_TOUCHED;
3035 /* Memorize monster */
3036 j_ptr->held_m_idx = m_idx;
3039 j_ptr->next_o_idx = m_ptr->hold_o_idx;
3042 m_ptr->hold_o_idx = o_idx;
3045 /* Steal the items */
3046 inven_item_increase(i, -1);
3047 inven_item_optimize(i);
3062 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3064 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3066 /* Steal some food */
3067 for (k = 0; k < 10; k++)
3069 /* Pick an item from the pack */
3070 i = (INVENTORY_IDX)randint0(INVEN_PACK);
3072 o_ptr = &p_ptr->inventory_list[i];
3073 if (!o_ptr->k_idx) continue;
3075 /* Skip non-food objects */
3076 if ((o_ptr->tval != TV_FOOD) && !((o_ptr->tval == TV_CORPSE) && (o_ptr->sval))) continue;
3078 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
3081 msg_format("%s(%c)を%s食べられてしまった!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
3083 msg_format("%sour %s (%c) was eaten!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
3086 /* Steal the items */
3087 inven_item_increase(i, -1);
3088 inven_item_optimize(i);
3100 /* Access the lite */
3101 o_ptr = &p_ptr->inventory_list[INVEN_LITE];
3102 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3104 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3107 if ((o_ptr->xtra4 > 0) && (!object_is_fixed_artifact(o_ptr)))
3110 o_ptr->xtra4 -= (s16b)(250 + randint1(250));
3111 if (o_ptr->xtra4 < 1) o_ptr->xtra4 = 1;
3115 msg_print(_("明かりが暗くなってしまった。", "Your light dims."));
3119 p_ptr->window |= (PW_EQUIP);
3129 msg_print(_("酸を浴びせられた!", "You are covered in acid!"));
3130 get_damage += acid_dam(damage, ddesc, -1, FALSE);
3131 update_creature(p_ptr);
3132 update_smart_learn(m_idx, DRS_ACID);
3140 msg_print(_("電撃を浴びせられた!", "You are struck by electricity!"));
3141 get_damage += elec_dam(damage, ddesc, -1, FALSE);
3142 update_smart_learn(m_idx, DRS_ELEC);
3150 msg_print(_("全身が炎に包まれた!", "You are enveloped in flames!"));
3151 get_damage += fire_dam(damage, ddesc, -1, FALSE);
3152 update_smart_learn(m_idx, DRS_FIRE);
3160 msg_print(_("全身が冷気で覆われた!", "You are covered with frost!"));
3161 get_damage += cold_dam(damage, ddesc, -1, FALSE);
3162 update_smart_learn(m_idx, DRS_COLD);
3168 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3169 if (p_ptr->is_dead) break;
3171 /* Increase "blind" */
3172 if (!p_ptr->resist_blind && !CHECK_MULTISHADOW())
3174 if (set_blind(p_ptr->blind + 10 + randint1(rlev)))
3177 if (m_ptr->r_idx == MON_DIO) msg_print("どうだッ!この血の目潰しはッ!");
3185 /* Learn about the player */
3186 update_smart_learn(m_idx, DRS_BLIND);
3194 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3196 if (p_ptr->is_dead) break;
3198 /* Increase "confused" */
3199 if (!p_ptr->resist_conf && !CHECK_MULTISHADOW())
3201 if (set_confused(p_ptr->confused + 3 + randint1(rlev)))
3207 /* Learn about the player */
3208 update_smart_learn(m_idx, DRS_CONF);
3215 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3217 if (p_ptr->is_dead) break;
3219 /* Increase "afraid" */
3220 if (CHECK_MULTISHADOW())
3224 else if (p_ptr->resist_fear)
3226 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
3229 else if (randint0(100 + r_ptr->level/2) < p_ptr->skill_sav)
3231 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
3236 if (set_afraid(p_ptr->afraid + 3 + randint1(rlev)))
3242 /* Learn about the player */
3243 update_smart_learn(m_idx, DRS_FEAR);
3250 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3252 if (p_ptr->is_dead) break;
3254 /* Increase "paralyzed" */
3255 if (CHECK_MULTISHADOW())
3259 else if (p_ptr->free_act)
3261 msg_print(_("しかし効果がなかった!", "You are unaffected!"));
3264 else if (randint0(100 + r_ptr->level/2) < p_ptr->skill_sav)
3266 msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
3271 if (!p_ptr->paralyzed)
3273 if (set_paralyzed(3 + randint1(rlev)))
3280 /* Learn about the player */
3281 update_smart_learn(m_idx, DRS_FREE);
3288 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3290 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3291 if (do_dec_stat(A_STR)) obvious = TRUE;
3298 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3300 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3301 if (do_dec_stat(A_INT)) obvious = TRUE;
3308 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3310 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3311 if (do_dec_stat(A_WIS)) obvious = TRUE;
3318 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3320 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3321 if (do_dec_stat(A_DEX)) obvious = TRUE;
3328 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3330 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3331 if (do_dec_stat(A_CON)) obvious = TRUE;
3338 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3340 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3341 if (do_dec_stat(A_CHR)) obvious = TRUE;
3348 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3350 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3352 /* Damage (stats) */
3353 if (do_dec_stat(A_STR)) obvious = TRUE;
3354 if (do_dec_stat(A_DEX)) obvious = TRUE;
3355 if (do_dec_stat(A_CON)) obvious = TRUE;
3356 if (do_dec_stat(A_INT)) obvious = TRUE;
3357 if (do_dec_stat(A_WIS)) obvious = TRUE;
3358 if (do_dec_stat(A_CHR)) obvious = TRUE;
3367 /* Hack -- Reduce damage based on the player armor class */
3368 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
3370 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3372 /* Radius 8 earthquake centered at the monster */
3373 if (damage > 23 || explode)
3375 earthquake(m_ptr->fy, m_ptr->fx, 8, m_idx);
3383 s32b d = damroll(10, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3387 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3389 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3391 (void)drain_exp(d, d / 10, 95);
3397 s32b d = damroll(20, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3401 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3403 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3405 (void)drain_exp(d, d / 10, 90);
3411 s32b d = damroll(40, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3415 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3417 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3419 (void)drain_exp(d, d / 10, 75);
3425 s32b d = damroll(80, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3429 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3431 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3433 (void)drain_exp(d, d / 10, 50);
3439 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3441 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3443 /* Take "poison" effect */
3444 if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()))
3446 if (set_poisoned(p_ptr->poisoned + randint1(rlev) + 5))
3452 /* Damage CON (10% chance)*/
3453 if ((randint1(100) < 11) && (p_ptr->prace != RACE_ANDROID))
3455 /* 1% chance for perm. damage */
3456 bool perm = one_in_(10);
3457 if (dec_stat(A_CON, randint1(10), perm))
3459 msg_print(_("病があなたを蝕んでいる気がする。", "You feel strange sickness."));
3469 if (!p_ptr->resist_time && !CHECK_MULTISHADOW())
3471 switch (randint1(10))
3473 case 1: case 2: case 3: case 4: case 5:
3475 if (p_ptr->prace == RACE_ANDROID) break;
3476 msg_print(_("人生が逆戻りした気がする。", "You feel life has clocked back."));
3477 lose_exp(100 + (p_ptr->exp / 100) * MON_DRAIN_LIFE);
3481 case 6: case 7: case 8: case 9:
3483 int stat = randint0(6);
3488 case A_STR: act = "強く"; break;
3489 case A_INT: act = "聡明で"; break;
3490 case A_WIS: act = "賢明で"; break;
3491 case A_DEX: act = "器用で"; break;
3492 case A_CON: act = "健康で"; break;
3493 case A_CHR: act = "美しく"; break;
3495 case A_STR: act = "strong"; break;
3496 case A_INT: act = "bright"; break;
3497 case A_WIS: act = "wise"; break;
3498 case A_DEX: act = "agile"; break;
3499 case A_CON: act = "hale"; break;
3500 case A_CHR: act = "beautiful"; break;
3505 msg_format(_("あなたは以前ほど%sなくなってしまった...。", "You're not as %s as you used to be..."), act);
3506 p_ptr->stat_cur[stat] = (p_ptr->stat_cur[stat] * 3) / 4;
3507 if (p_ptr->stat_cur[stat] < 3) p_ptr->stat_cur[stat] = 3;
3508 p_ptr->update |= (PU_BONUS);
3514 msg_print(_("あなたは以前ほど力強くなくなってしまった...。", "You're not as powerful as you used to be..."));
3516 for (k = 0; k < A_MAX; k++)
3518 p_ptr->stat_cur[k] = (p_ptr->stat_cur[k] * 7) / 8;
3519 if (p_ptr->stat_cur[k] < 3) p_ptr->stat_cur[k] = 3;
3521 p_ptr->update |= (PU_BONUS);
3526 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3532 s32b d = damroll(60, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3537 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3539 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3541 resist_drain = !drain_exp(d, d / 10, 50);
3543 /* Heal the attacker? */
3544 if (p_ptr->mimic_form)
3546 if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
3547 resist_drain = TRUE;
3551 switch (p_ptr->prace)
3560 resist_drain = TRUE;
3565 if ((damage > 5) && !resist_drain)
3567 bool did_heal = FALSE;
3569 if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
3572 m_ptr->hp += damroll(4, damage / 6);
3573 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
3575 /* Redraw (later) if needed */
3576 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
3577 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
3579 /* Special message */
3580 if (m_ptr->ml && did_heal)
3582 msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), m_name);
3592 if (CHECK_MULTISHADOW())
3594 msg_print(_("攻撃は幻影に命中し、あなたには届かなかった。", "The attack hits Shadow, you are unharmed!"));
3600 p_ptr->csp -= damage;
3604 p_ptr->csp_frac = 0;
3607 p_ptr->redraw |= (PR_MANA);
3610 /* Learn about the player */
3611 update_smart_learn(m_idx, DRS_MANA);
3617 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3619 if (p_ptr->is_dead) break;
3621 /* Decrease speed */
3622 if (CHECK_MULTISHADOW())
3628 if (set_slow((p_ptr->slow + 4 + randint0(rlev / 10)), FALSE))
3638 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3640 if (p_ptr->is_dead) break;
3642 /* Decrease speed */
3643 if (p_ptr->resist_sound || CHECK_MULTISHADOW())
3649 if (set_stun(p_ptr->stun + 10 + randint1(r_ptr->level / 4)))
3659 /* Hack -- only one of cut or stun */
3660 if (do_cut && do_stun)
3663 if (randint0(100) < 50)
3680 /* Critical hit (zero if non-critical) */
3681 tmp = monster_critical(d_dice, d_side, damage);
3683 /* Roll for damage */
3686 case 0: cut_plus = 0; break;
3687 case 1: cut_plus = randint1(5); break;
3688 case 2: cut_plus = randint1(5) + 5; break;
3689 case 3: cut_plus = randint1(20) + 20; break;
3690 case 4: cut_plus = randint1(50) + 50; break;
3691 case 5: cut_plus = randint1(100) + 100; break;
3692 case 6: cut_plus = 300; break;
3693 default: cut_plus = 500; break;
3697 if (cut_plus) (void)set_cut(p_ptr->cut + cut_plus);
3705 /* Critical hit (zero if non-critical) */
3706 tmp = monster_critical(d_dice, d_side, damage);
3708 /* Roll for damage */
3711 case 0: stun_plus = 0; break;
3712 case 1: stun_plus = randint1(5); break;
3713 case 2: stun_plus = randint1(5) + 10; break;
3714 case 3: stun_plus = randint1(10) + 20; break;
3715 case 4: stun_plus = randint1(15) + 30; break;
3716 case 5: stun_plus = randint1(20) + 40; break;
3717 case 6: stun_plus = 80; break;
3718 default: stun_plus = 150; break;
3721 /* Apply the stun */
3722 if (stun_plus) (void)set_stun(p_ptr->stun + stun_plus);
3727 sound(SOUND_EXPLODE);
3729 if (mon_take_hit(m_idx, m_ptr->hp + 1, &fear, NULL))
3738 if (p_ptr->sh_fire && alive && !p_ptr->is_dead)
3740 if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK))
3742 HIT_POINT dam = damroll(2, 6);
3744 /* Modify the damage */
3745 dam = mon_damage_mod(m_ptr, dam, FALSE);
3747 msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), m_name);
3749 if (mon_take_hit(m_idx, dam, &fear, _("は灰の山になった。", " turns into a pile of ash.")))
3757 if (is_original_ap_and_seen(m_ptr))
3758 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
3762 if (p_ptr->sh_elec && alive && !p_ptr->is_dead)
3764 if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK))
3766 HIT_POINT dam = damroll(2, 6);
3768 /* Modify the damage */
3769 dam = mon_damage_mod(m_ptr, dam, FALSE);
3771 msg_format(_("%^sは電撃をくらった!", "%^s gets zapped!"), m_name);
3772 if (mon_take_hit(m_idx, dam, &fear, _("は燃え殻の山になった。", " turns into a pile of cinder.")))
3780 if (is_original_ap_and_seen(m_ptr))
3781 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
3785 if (p_ptr->sh_cold && alive && !p_ptr->is_dead)
3787 if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK))
3789 HIT_POINT dam = damroll(2, 6);
3791 /* Modify the damage */
3792 dam = mon_damage_mod(m_ptr, dam, FALSE);
3794 msg_format(_("%^sは冷気をくらった!", "%^s is very cold!"), m_name);
3795 if (mon_take_hit(m_idx, dam, &fear, _("は凍りついた。", " was frozen.")))
3803 if (is_original_ap_and_seen(m_ptr))
3804 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
3809 if (p_ptr->dustrobe && alive && !p_ptr->is_dead)
3811 if (!(r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK))
3813 HIT_POINT dam = damroll(2, 6);
3815 /* Modify the damage */
3816 dam = mon_damage_mod(m_ptr, dam, FALSE);
3818 msg_format(_("%^sは鏡の破片をくらった!", "%^s gets zapped!"), m_name);
3819 if (mon_take_hit(m_idx, dam, &fear, _("はズタズタになった。", " had torn to pieces.")))
3827 if (is_original_ap_and_seen(m_ptr))
3828 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK);
3831 if (is_mirror_grid(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x]))
3833 teleport_player(10, 0L);
3837 if (p_ptr->tim_sh_holy && alive && !p_ptr->is_dead)
3839 if (r_ptr->flags3 & RF3_EVIL)
3841 if (!(r_ptr->flagsr & RFR_RES_ALL))
3843 HIT_POINT dam = damroll(2, 6);
3845 /* Modify the damage */
3846 dam = mon_damage_mod(m_ptr, dam, FALSE);
3848 msg_format(_("%^sは聖なるオーラで傷ついた!", "%^s is injured by holy power!"), m_name);
3849 if (mon_take_hit(m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3854 if (is_original_ap_and_seen(m_ptr))
3855 r_ptr->r_flags3 |= RF3_EVIL;
3859 if (is_original_ap_and_seen(m_ptr))
3860 r_ptr->r_flagsr |= RFR_RES_ALL;
3865 if (p_ptr->tim_sh_touki && alive && !p_ptr->is_dead)
3867 if (!(r_ptr->flagsr & RFR_RES_ALL))
3869 HIT_POINT dam = damroll(2, 6);
3871 /* Modify the damage */
3872 dam = mon_damage_mod(m_ptr, dam, FALSE);
3874 msg_format(_("%^sが鋭い闘気のオーラで傷ついた!", "%^s is injured by the Force"), m_name);
3875 if (mon_take_hit(m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3883 if (is_original_ap_and_seen(m_ptr))
3884 r_ptr->r_flagsr |= RFR_RES_ALL;
3888 if (hex_spelling(HEX_SHADOW_CLOAK) && alive && !p_ptr->is_dead)
3891 object_type *o_armed_ptr = &p_ptr->inventory_list[INVEN_RARM];
3893 if (!(r_ptr->flagsr & RFR_RES_ALL || r_ptr->flagsr & RFR_RES_DARK))
3895 if (o_armed_ptr->k_idx)
3897 int basedam = ((o_armed_ptr->dd + p_ptr->to_dd[0]) * (o_armed_ptr->ds + p_ptr->to_ds[0] + 1));
3898 dam = basedam / 2 + o_armed_ptr->to_d + p_ptr->to_d[0];
3901 /* Cursed armor makes damages doubled */
3902 o_armed_ptr = &p_ptr->inventory_list[INVEN_BODY];
3903 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr)) dam *= 2;
3905 /* Modify the damage */
3906 dam = mon_damage_mod(m_ptr, dam, FALSE);
3908 msg_format(_("影のオーラが%^sに反撃した!", "Enveloped shadows attack %^s."), m_name);
3909 if (mon_take_hit(m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3914 else /* monster does not dead */
3917 BIT_FLAGS flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
3918 EFFECT_ID typ[4][2] = {
3919 { INVEN_HEAD, GF_OLD_CONF },
3920 { INVEN_LARM, GF_OLD_SLEEP },
3921 { INVEN_HANDS, GF_TURN_ALL },
3922 { INVEN_FEET, GF_OLD_SLOW }
3925 /* Some cursed armours gives an extra effect */
3926 for (j = 0; j < 4; j++)
3928 o_armed_ptr = &p_ptr->inventory_list[typ[j][0]];
3929 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr) && object_is_armour(o_armed_ptr))
3930 project(0, 0, m_ptr->fy, m_ptr->fx, (p_ptr->lev * 2), typ[j][1], flg, -1);
3936 if (is_original_ap_and_seen(m_ptr))
3937 r_ptr->r_flagsr |= (RFR_RES_ALL | RFR_RES_DARK);
3943 /* Monster missed player */
3946 /* Analyze failed attacks */
3962 /* Visible monsters */
3965 disturb(TRUE, TRUE);
3969 msg_format("%sかわした。", (p_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "");
3971 msg_format("%s%^sの攻撃をかわした。", (p_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "", m_name);
3972 abbreviate = 1;/*2回目以降は省略 */
3974 msg_format("%^s misses you.", m_name);
3979 /* Gain shield experience */
3980 if (object_is_armour(&p_ptr->inventory_list[INVEN_RARM]) || object_is_armour(&p_ptr->inventory_list[INVEN_LARM]))
3982 int cur = p_ptr->skill_exp[GINOU_SHIELD];
3983 int max = s_info[p_ptr->pclass].s_max[GINOU_SHIELD];
3987 DEPTH targetlevel = r_ptr->level;
3991 /* Extra experience */
3992 if ((cur / 100) < targetlevel)
3994 if ((cur / 100 + 15) < targetlevel)
3995 inc += 1 + (targetlevel - (cur / 100 + 15));
4000 p_ptr->skill_exp[GINOU_SHIELD] = MIN(max, cur + inc);
4001 p_ptr->update |= (PU_BONUS);
4012 /* Analyze "visible" monsters only */
4013 if (is_original_ap_and_seen(m_ptr) && !do_silly_attack)
4015 /* Count "obvious" attacks (and ones that cause damage) */
4016 if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
4018 /* Count attacks of this type */
4019 if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
4021 r_ptr->r_blows[ap_cnt]++;
4026 if (p_ptr->riding && damage)
4028 char m_steed_name[MAX_NLEN];
4029 monster_desc(m_steed_name, ¤t_floor_ptr->m_list[p_ptr->riding], 0);
4030 if (rakuba((damage > 200) ? 200 : damage, FALSE))
4032 msg_format(_("%^sから落ちてしまった!", "You have fallen from %s."), m_steed_name);
4036 if (p_ptr->special_defense & NINJA_KAWARIMI)
4038 if (kawarimi(FALSE)) return TRUE;
4042 /* Hex - revenge damage stored */
4043 revenge_store(get_damage);
4045 if ((p_ptr->tim_eyeeye || hex_spelling(HEX_EYE_FOR_EYE))
4046 && get_damage > 0 && !p_ptr->is_dead)
4049 msg_format("攻撃が%s自身を傷つけた!", m_name);
4051 GAME_TEXT m_name_self[80];
4054 monster_desc(m_name_self, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE);
4056 msg_format("The attack of %s has wounded %s!", m_name, m_name_self);
4058 project(0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL, -1);
4059 if (p_ptr->tim_eyeeye) set_tim_eyeeye(p_ptr->tim_eyeeye-5, TRUE);
4062 if ((p_ptr->counter || (p_ptr->special_defense & KATA_MUSOU)) && alive && !p_ptr->is_dead && m_ptr->ml && (p_ptr->csp > 7))
4064 char m_target_name[MAX_NLEN];
4065 monster_desc(m_target_name, m_ptr, 0);
4068 msg_format(_("%^sに反撃した!", "Your counterattack to %s!"), m_target_name);
4069 py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_COUNTER);
4071 p_ptr->redraw |= (PR_MANA);
4075 if (blinked && alive && !p_ptr->is_dead)
4077 if (teleport_barrier(m_idx))
4079 msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But magic barrier obstructs it."));
4083 msg_print(_("泥棒は笑って逃げた!", "The thief flees laughing!"));
4084 teleport_away(m_idx, MAX_SIGHT * 2 + 5, 0L);
4089 /* Always notice cause of death */
4090 if (p_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !p_ptr->inside_arena)
4095 if (m_ptr->ml && fear && alive && !p_ptr->is_dead)
4098 msg_format(_("%^sは恐怖で逃げ出した!", "%^s flees in terror!"), m_name);
4101 if (p_ptr->special_defense & KATA_IAI)
4103 set_action(ACTION_NONE);
4106 /* Assume we attacked */
4112 * @brief モンスターが敵モンスターに行う打撃処理 /
4113 * Hack, based on mon_take_hit... perhaps all monster attacks on other monsters should use this?
4114 * @param m_idx 目標となるモンスターの参照ID
4116 * @param dead 目標となったモンスターの死亡状態を返す参照ポインタ
4117 * @param fear 目標となったモンスターの恐慌状態を返す参照ポインタ
4118 * @param note 目標モンスターが死亡した場合の特別メッセージ(NULLならば標準表示を行う)
4119 * @param who 打撃を行ったモンスターの参照ID
4122 void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *dead, bool *fear, concptr note, MONSTER_IDX who)
4124 monster_type *m_ptr = ¤t_floor_ptr->m_list[m_idx];
4125 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4126 GAME_TEXT m_name[160];
4127 bool seen = is_seen(m_ptr);
4129 /* Can the player be aware of this attack? */
4130 bool known = (m_ptr->cdis <= MAX_SIGHT);
4132 /* Extract monster name */
4133 monster_desc(m_name, m_ptr, 0);
4135 /* Redraw (later) if needed */
4138 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
4139 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
4142 (void)set_monster_csleep(m_idx, 0);
4144 if (p_ptr->riding && (m_idx == p_ptr->riding)) disturb(TRUE, TRUE);
4146 if (MON_INVULNER(m_ptr) && randint0(PENETRATE_INVULNERABILITY))
4150 msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
4155 if (r_ptr->flagsr & RFR_RES_ALL)
4160 if ((dam == 0) && one_in_(3)) dam = 1;
4166 msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
4175 /* It is dead now... or is it? */
4178 if (((r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) ||
4179 (r_ptr->flags7 & RF7_NAZGUL)) &&
4180 !p_ptr->inside_battle)
4187 if (!monster_living(m_ptr->r_idx))
4189 sound(SOUND_N_KILL);
4200 monster_desc(m_name, m_ptr, MD_TRUE_NAME);
4201 /* Unseen death by normal attack */
4204 current_floor_ptr->monster_noise = TRUE;
4206 /* Death by special attack */
4209 msg_format(_("%^s%s", "%^s%s"), m_name, note);
4211 /* Death by normal attack -- nonliving monster */
4212 else if (!monster_living(m_ptr->r_idx))
4214 msg_format(_("%^sは破壊された。", "%^s is destroyed."), m_name);
4216 /* Death by normal attack -- living monster */
4219 msg_format(_("%^sは殺された。", "%^s is killed."), m_name);
4223 monster_gain_exp(who, m_ptr->r_idx);
4224 monster_death(m_idx, FALSE);
4225 delete_monster_idx(m_idx);
4230 /* Monster is dead */
4239 /* Mega-Hack -- Pain cancels fear */
4240 if (MON_MONFEAR(m_ptr) && (dam > 0))
4243 if (set_monster_monfear(m_idx, MON_MONFEAR(m_ptr) - randint1(dam / 4)))
4250 /* Sometimes a monster gets scared by damage */
4251 if (!MON_MONFEAR(m_ptr) && !(r_ptr->flags3 & RF3_NO_FEAR))
4253 /* Percentage of fully healthy */
4254 int percentage = (100L * m_ptr->hp) / m_ptr->maxhp;
4257 * Run (sometimes) if at 10% or less of max hit points,
4258 * or (usually) when hit for half its current hit points
4260 if (((percentage <= 10) && (randint0(10) < percentage)) ||
4261 ((dam >= m_ptr->hp) && (randint0(100) < 80)))
4263 /* Hack -- note fear */
4266 /* Hack -- Add some timed fear */
4267 (void)set_monster_monfear(m_idx, (randint1(10) +
4268 (((dam >= m_ptr->hp) && (percentage > 7)) ?
4269 20 : ((11 - percentage) * 5))));
4273 #endif /* ALLOW_FEAR */
4275 if ((dam > 0) && !is_pet(m_ptr) && !is_friendly(m_ptr) && (who != m_idx))
4277 if (is_pet(¤t_floor_ptr->m_list[who]) && !player_bold(m_ptr->target_y, m_ptr->target_x))
4279 set_target(m_ptr, current_floor_ptr->m_list[who].fy, current_floor_ptr->m_list[who].fx);
4283 if (p_ptr->riding && (p_ptr->riding == m_idx) && (dam > 0))
4285 /* Extract monster name */
4286 monster_desc(m_name, m_ptr, 0);
4288 if (m_ptr->hp > m_ptr->maxhp / 3) dam = (dam + 1) / 2;
4289 if (rakuba((dam > 200) ? 200 : dam, FALSE))
4291 msg_format(_("%^sに振り落とされた!", "You have thrown off from %s!"), m_name);