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 "object-flavor.h"
28 #include "object-hook.h"
35 #include "player-move.h"
36 #include "player-effects.h"
37 #include "player-skill.h"
38 #include "player-damage.h"
39 #include "player-status.h"
40 #include "player-race.h"
41 #include "view-mainwindow.h"
46 * @brief モンスターの打撃効力テーブル /
47 * The table of monsters' blow effects
49 const mbe_info_type mbe_info[] =
52 { 60, GF_MISSILE, }, /* HURT */
53 { 5, GF_POIS, }, /* POISON */
54 { 20, GF_DISENCHANT, }, /* UN_BONUS */
55 { 15, GF_MISSILE, }, /* UN_POWER */ /* ToDo: Apply the correct effects */
56 { 5, GF_MISSILE, }, /* EAT_GOLD */
57 { 5, GF_MISSILE, }, /* EAT_ITEM */
58 { 5, GF_MISSILE, }, /* EAT_FOOD */
59 { 5, GF_MISSILE, }, /* EAT_LITE */
60 { 0, GF_ACID, }, /* ACID */
61 { 10, GF_ELEC, }, /* ELEC */
62 { 10, GF_FIRE, }, /* FIRE */
63 { 10, GF_COLD, }, /* COLD */
64 { 2, GF_MISSILE, }, /* BLIND */
65 { 10, GF_CONFUSION, }, /* CONFUSE */
66 { 10, GF_MISSILE, }, /* TERRIFY */
67 { 2, GF_MISSILE, }, /* PARALYZE */
68 { 0, GF_MISSILE, }, /* LOSE_STR */
69 { 0, GF_MISSILE, }, /* LOSE_INT */
70 { 0, GF_MISSILE, }, /* LOSE_WIS */
71 { 0, GF_MISSILE, }, /* LOSE_DEX */
72 { 0, GF_MISSILE, }, /* LOSE_CON */
73 { 0, GF_MISSILE, }, /* LOSE_CHR */
74 { 2, GF_MISSILE, }, /* LOSE_ALL */
75 { 60, GF_ROCKET, }, /* SHATTER */
76 { 5, GF_MISSILE, }, /* EXP_10 */
77 { 5, GF_MISSILE, }, /* EXP_20 */
78 { 5, GF_MISSILE, }, /* EXP_40 */
79 { 5, GF_MISSILE, }, /* EXP_80 */
80 { 5, GF_POIS, }, /* DISEASE */
81 { 5, GF_TIME, }, /* TIME */
82 { 5, GF_MISSILE, }, /* EXP_VAMP */
83 { 5, GF_MANA, }, /* DR_MANA */
84 { 60, GF_MISSILE, }, /* SUPERHURT */
88 * @brief 幻覚時の打撃記述テーブル / Weird melee attack types when hallucinating
91 const concptr silly_attacks[MAX_SILLY_ATTACK] =
94 "があなたの回りを3回回ってワンと言った。",
102 "に「神の国」発言の撤回を求められた。",
113 "はあなたの100の秘密について熱く語った。",
125 "に二週間以内でビデオを人に見せないと死ぬ呪いをかけられた。",
127 "はスーパーウルトラギャラクティカマグナムを放った。",
129 "にジェットストリームアタックをかけられた。",
130 "はあなたに卍固めをかけて「1、2、3、ダーッ!」と叫んだ。",
131 "は「いくじなし!ばかばかばか!」といって駆け出した。",
132 "が「ごらん、ルーベンスの絵だよ」と言って静かに目を閉じた。",
133 "は言った。「変愚蛮怒、絶賛公開中!」",
137 * @brief 幻覚時の打撃記述テーブル(フォーマットつき) / Weird melee attack types when hallucinating (%s for strfmt())
139 const concptr silly_attacks2[MAX_SILLY_ATTACK] =
142 "%sの回りを3回回ってワンと言った。",
150 "%sに「神の国」発言の撤回を求めた。",
161 "%sの100の秘密について熱く語った。",
173 "%sに二週間以内でビデオを人に見せないと死ぬ呪いをかけた。",
175 "%sにスーパーウルトラギャラクティカマグナムを放った。",
177 "%sにジェットストリームアタックをかけた。",
178 "%sに卍固めをかけて「1、2、3、ダーッ!」と叫んだ。",
179 "「いくじなし!ばかばかばか!」といって駆け出した。",
180 "「ごらん、ルーベンスの絵だよ」と言って静かに目を閉じた。",
184 const concptr silly_attacks[MAX_SILLY_ATTACK] =
195 "makes obscene gestures at",
226 * @brief マーシャルアーツ打撃テーブル
228 const martial_arts ma_blows[MAX_MA] =
231 { "%sを殴った。", 1, 0, 1, 5, 0 },
232 { "%sを蹴った。", 2, 0, 1, 7, 0 },
233 { "%sに正拳突きをくらわした。", 3, 0, 1, 9, 0 },
234 { "%sに膝蹴りをくらわした。", 5, 5, 2, 4, MA_KNEE },
235 { "%sに肘打ちをくらわした。", 7, 5, 1, 12, 0 },
236 { "%sに体当りした。", 9, 10, 2, 6, 0 },
237 { "%sを蹴った。", 11, 10, 3, 6, MA_SLOW },
238 { "%sにアッパーをくらわした。", 13, 12, 5, 5, 6 },
239 { "%sに二段蹴りをくらわした。", 16, 15, 5, 6, 8 },
240 { "%sに猫爪撃をくらわした。", 20, 20, 5, 8, 0 },
241 { "%sに跳空脚をくらわした。", 24, 25, 6, 8, 10 },
242 { "%sに鷲爪襲をくらわした。", 28, 25, 7, 9, 0 },
243 { "%sに回し蹴りをくらわした。", 32, 30, 8, 10, 10 },
244 { "%sに鉄拳撃をくらわした。", 35, 35, 8, 11, 10 },
245 { "%sに飛空脚をくらわした。", 39, 35, 8, 12, 12 },
246 { "%sに昇龍拳をくらわした。", 43, 35, 9, 12, 16 },
247 { "%sに石破天驚拳をくらわした。", 48, 40, 10, 13, 18 },
249 { "You punch %s.", 1, 0, 1, 4, 0 },
250 { "You kick %s.", 2, 0, 1, 6, 0 },
251 { "You strike %s.", 3, 0, 1, 7, 0 },
252 { "You hit %s with your knee.", 5, 5, 2, 3, MA_KNEE },
253 { "You hit %s with your elbow.", 7, 5, 1, 8, 0 },
254 { "You butt %s.", 9, 10, 2, 5, 0 },
255 { "You kick %s.", 11, 10, 3, 4, MA_SLOW },
256 { "You uppercut %s.", 13, 12, 4, 4, 6 },
257 { "You double-kick %s.", 16, 15, 5, 4, 8 },
258 { "You hit %s with a Cat's Claw.", 20, 20, 5, 5, 0 },
259 { "You hit %s with a jump kick.", 25, 25, 5, 6, 10 },
260 { "You hit %s with an Eagle's Claw.", 29, 25, 6, 6, 0 },
261 { "You hit %s with a circle kick.", 33, 30, 6, 8, 10 },
262 { "You hit %s with an Iron Fist.", 37, 35, 8, 8, 10 },
263 { "You hit %s with a flying kick.", 41, 35, 8, 10, 12 },
264 { "You hit %s with a Dragon Fist.", 45, 35, 10, 10, 16 },
265 { "You hit %s with a Crushing Blow.", 48, 35, 10, 12, 18 },
271 * @brief 修行僧のターンダメージ算出テーブル
273 const int monk_ave_damage[PY_MAX_LEVEL + 1][3] =
330 * Stat Table (STR) -- help index into the "blow" table
332 const byte adj_str_blow[] =
349 20 /* 18/00-18/09 */,
350 30 /* 18/10-18/19 */,
351 40 /* 18/20-18/29 */,
352 50 /* 18/30-18/39 */,
353 60 /* 18/40-18/49 */,
354 70 /* 18/50-18/59 */,
355 80 /* 18/60-18/69 */,
356 90 /* 18/70-18/79 */,
357 100 /* 18/80-18/89 */,
358 110 /* 18/90-18/99 */,
359 120 /* 18/100-18/109 */,
360 130 /* 18/110-18/119 */,
361 140 /* 18/120-18/129 */,
362 150 /* 18/130-18/139 */,
363 160 /* 18/140-18/149 */,
364 170 /* 18/150-18/159 */,
365 180 /* 18/160-18/169 */,
366 190 /* 18/170-18/179 */,
367 200 /* 18/180-18/189 */,
368 210 /* 18/190-18/199 */,
369 220 /* 18/200-18/209 */,
370 230 /* 18/210-18/219 */,
376 * 器用さによる攻撃回数インデックステーブル
377 * Stat Table (DEX) -- index into the "blow" table
379 const byte adj_dex_blow[] =
406 7 /* 18/100-18/109 */,
407 7 /* 18/110-18/119 */,
408 8 /* 18/120-18/129 */,
409 8 /* 18/130-18/139 */,
410 9 /* 18/140-18/149 */,
411 9 /* 18/150-18/159 */,
412 10 /* 18/160-18/169 */,
413 10 /* 18/170-18/179 */,
414 11 /* 18/180-18/189 */,
415 11 /* 18/190-18/199 */,
416 12 /* 18/200-18/209 */,
417 12 /* 18/210-18/219 */,
424 * 腕力、器用さに応じた攻撃回数テーブル /
425 * This table is used to help calculate the number of blows the player can
426 * make in a single round of attacks (one player current_world_ptr->game_turn) with a normal weapon.
429 * This number ranges from a single blow/round for weak players to up to six
430 * blows/round for powerful warriors.
432 * Note that certain artifacts and ego-items give "bonus" blows/round.
434 * First, from the player class, we extract some values:
436 * Warrior num = 6; mul = 5; div = MAX(70, weapon_weight);
437 * Berserker num = 6; mul = 7; div = MAX(70, weapon_weight);
438 * Mage num = 3; mul = 2; div = MAX(100, weapon_weight);
439 * Priest num = 5; mul = 3; div = MAX(100, weapon_weight);
440 * Mindcrafter num = 5; mul = 3; div = MAX(100, weapon_weight);
441 * Rogue num = 5; mul = 3; div = MAX(40, weapon_weight);
442 * Ranger num = 5; mul = 4; div = MAX(70, weapon_weight);
443 * Paladin num = 5; mul = 4; div = MAX(70, weapon_weight);
444 * Weaponsmith num = 5; mul = 5; div = MAX(150, weapon_weight);
445 * Warrior-Mage num = 5; mul = 3; div = MAX(70, weapon_weight);
446 * Chaos Warrior num = 5; mul = 4; div = MAX(70, weapon_weight);
447 * Monk num = 5; mul = 3; div = MAX(60, weapon_weight);
448 * Tourist num = 4; mul = 3; div = MAX(100, weapon_weight);
449 * Imitator num = 5; mul = 4; div = MAX(70, weapon_weight);
450 * Beastmaster num = 5; mul = 3; div = MAX(70, weapon_weight);
451 * Cavalry(Ride) num = 5; mul = 4; div = MAX(70, weapon_weight);
452 * Cavalry(Walk) num = 5; mul = 3; div = MAX(100, weapon_weight);
453 * Sorcerer num = 1; mul = 1; div = MAX(1, weapon_weight);
454 * Archer num = 4; mul = 2; div = MAX(70, weapon_weight);
455 * Magic eater num = 4; mul = 2; div = MAX(70, weapon_weight);
456 * ForceTrainer num = 4; mul = 2; div = MAX(60, weapon_weight);
457 * Mirror Master num = 3; mul = 3; div = MAX(100, weapon_weight);
458 * Ninja num = 4; mul = 1; div = MAX(20, weapon_weight);
460 * To get "P", we look up the relevant "adj_str_blow[]" (see above),
461 * multiply it by "mul", and then divide it by "div".
462 * Increase P by 1 if you wield a weapon two-handed.
463 * Decrease P by 1 if you are a Ninja.
465 * To get "D", we look up the relevant "adj_dex_blow[]" (see above),
467 * The player gets "blows_table[P][D]" blows/round, as shown below,
468 * up to a maximum of "num" blows/round, plus any "bonus" blows/round.
471 const byte blows_table[12][12] =
474 /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11+ */
475 /* 3 10 15 /10 /40 /60 /80 /100 /120 /140 /160 /180 */
476 /* 0 */{ 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4 },
477 /* 1 */{ 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4 },
478 /* 2 */{ 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5 },
479 /* 3 */{ 1, 1, 2, 3, 3, 4, 4, 4, 5, 5, 5, 5 },
480 /* 4 */{ 1, 1, 2, 3, 3, 4, 4, 5, 5, 5, 5, 5 },
481 /* 5 */{ 1, 1, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6 },
482 /* 6 */{ 1, 1, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6 },
483 /* 7 */{ 1, 2, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6 },
484 /* 8 */{ 1, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6 },
485 /* 9 */{ 1, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6 },
486 /* 10*/{ 2, 2, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6 },
487 /*11+*/{ 2, 2, 3, 4, 4, 4, 5, 5, 6, 6, 6, 6 },
491 * @brief プレイヤーからモンスターへの打撃命中判定 /
492 * Determine if the player "hits" a monster (normal combat).
493 * @param chance 基本命中値
495 * @param visible 目標を視界に捕らえているならばTRUEを指定
496 * @return 命中と判定された場合TRUEを返す
497 * @note Always miss 5%, always hit 5%, otherwise random.
499 bool test_hit_norm(HIT_RELIABILITY chance, ARMOUR_CLASS ac, bool visible)
501 if (!visible) chance = (chance + 1) / 2;
502 return hit_chance(chance, ac) >= randint1(100);
506 * @brief モンスターへの命中率の計算
511 PERCENTAGE hit_chance(HIT_RELIABILITY reli, ARMOUR_CLASS ac)
513 PERCENTAGE chance = 5, chance_left = 90;
514 if(reli <= 0) return 5;
515 if(p_ptr->pseikaku == SEIKAKU_NAMAKE) chance_left = (chance_left * 19 + 9) / 20;
516 chance += (100 - ((ac * 75) / reli)) * chance_left / 100;
517 if (chance < 5) chance = 5;
522 * @brief プレイヤー攻撃の種族スレイング倍率計算
523 * @param mult 算出前の基本倍率(/10倍)
524 * @param flgs スレイフラグ配列
525 * @param m_ptr 目標モンスターの構造体参照ポインタ
526 * @return スレイング加味後の倍率(/10倍)
528 static MULTIPLY mult_slaying(MULTIPLY mult, const BIT_FLAGS* flgs, const monster_type* m_ptr)
530 static const struct slay_table_t {
532 BIT_FLAGS affect_race_flag;
535 size_t r_flag_offset;
537 #define OFFSET(X) offsetof(monster_race, X)
538 {TR_SLAY_ANIMAL, RF3_ANIMAL, 25, OFFSET(flags3), OFFSET(r_flags3)},
539 {TR_KILL_ANIMAL, RF3_ANIMAL, 40, OFFSET(flags3), OFFSET(r_flags3)},
540 {TR_SLAY_EVIL, RF3_EVIL, 20, OFFSET(flags3), OFFSET(r_flags3)},
541 {TR_KILL_EVIL, RF3_EVIL, 35, OFFSET(flags3), OFFSET(r_flags3)},
542 {TR_SLAY_GOOD, RF3_GOOD, 20, OFFSET(flags3), OFFSET(r_flags3)},
543 {TR_KILL_GOOD, RF3_GOOD, 35, OFFSET(flags3), OFFSET(r_flags3)},
544 {TR_SLAY_HUMAN, RF2_HUMAN, 25, OFFSET(flags2), OFFSET(r_flags2)},
545 {TR_KILL_HUMAN, RF2_HUMAN, 40, OFFSET(flags2), OFFSET(r_flags2)},
546 {TR_SLAY_UNDEAD, RF3_UNDEAD, 30, OFFSET(flags3), OFFSET(r_flags3)},
547 {TR_KILL_UNDEAD, RF3_UNDEAD, 50, OFFSET(flags3), OFFSET(r_flags3)},
548 {TR_SLAY_DEMON, RF3_DEMON, 30, OFFSET(flags3), OFFSET(r_flags3)},
549 {TR_KILL_DEMON, RF3_DEMON, 50, OFFSET(flags3), OFFSET(r_flags3)},
550 {TR_SLAY_ORC, RF3_ORC, 30, OFFSET(flags3), OFFSET(r_flags3)},
551 {TR_KILL_ORC, RF3_ORC, 50, OFFSET(flags3), OFFSET(r_flags3)},
552 {TR_SLAY_TROLL, RF3_TROLL, 30, OFFSET(flags3), OFFSET(r_flags3)},
553 {TR_KILL_TROLL, RF3_TROLL, 50, OFFSET(flags3), OFFSET(r_flags3)},
554 {TR_SLAY_GIANT, RF3_GIANT, 30, OFFSET(flags3), OFFSET(r_flags3)},
555 {TR_KILL_GIANT, RF3_GIANT, 50, OFFSET(flags3), OFFSET(r_flags3)},
556 {TR_SLAY_DRAGON, RF3_DRAGON, 30, OFFSET(flags3), OFFSET(r_flags3)},
557 {TR_KILL_DRAGON, RF3_DRAGON, 50, OFFSET(flags3), OFFSET(r_flags3)},
561 monster_race* r_ptr = &r_info[m_ptr->r_idx];
563 for (i = 0; i < sizeof(slay_table) / sizeof(slay_table[0]); ++i)
565 const struct slay_table_t* p = &slay_table[i];
567 if ((have_flag(flgs, p->slay_flag)) &&
568 (atoffset(BIT_FLAGS, r_ptr, p->flag_offset) & p->affect_race_flag))
570 if (is_original_ap_and_seen(m_ptr))
572 atoffset(BIT_FLAGS, r_ptr, p->r_flag_offset) |= p->affect_race_flag;
575 mult = MAX(mult, p->slay_mult);
583 * @brief プレイヤー攻撃の属性スレイング倍率計算
584 * @param mult 算出前の基本倍率(/10倍)
585 * @param flgs スレイフラグ配列
586 * @param m_ptr 目標モンスターの構造体参照ポインタ
587 * @return スレイング加味後の倍率(/10倍)
589 static MULTIPLY mult_brand(MULTIPLY mult, const BIT_FLAGS* flgs, const monster_type* m_ptr)
591 static const struct brand_table_t {
593 BIT_FLAGS resist_mask;
596 {TR_BRAND_ACID, RFR_EFF_IM_ACID_MASK, 0U },
597 {TR_BRAND_ELEC, RFR_EFF_IM_ELEC_MASK, 0U },
598 {TR_BRAND_FIRE, RFR_EFF_IM_FIRE_MASK, RF3_HURT_FIRE},
599 {TR_BRAND_COLD, RFR_EFF_IM_COLD_MASK, RF3_HURT_COLD},
600 {TR_BRAND_POIS, RFR_EFF_IM_POIS_MASK, 0U },
603 monster_race* r_ptr = &r_info[m_ptr->r_idx];
605 for (i = 0; i < sizeof(brand_table) / sizeof(brand_table[0]); ++i)
607 const struct brand_table_t* p = &brand_table[i];
609 if (have_flag(flgs, p->brand_flag))
611 /* Notice immunity */
612 if (r_ptr->flagsr & p->resist_mask)
614 if (is_original_ap_and_seen(m_ptr))
616 r_ptr->r_flagsr |= (r_ptr->flagsr & p->resist_mask);
620 /* Otherwise, take the damage */
621 else if (r_ptr->flags3 & p->hurt_flag)
623 if (is_original_ap_and_seen(m_ptr))
625 r_ptr->r_flags3 |= p->hurt_flag;
628 mult = MAX(mult, 50);
632 mult = MAX(mult, 25);
641 * @brief 剣術のスレイ倍率計算を行う /
642 * Calcurate magnification of hissatsu technics
643 * @param mult 剣術のスレイ効果以前に算出している多要素の倍率(/10倍)
644 * @param flgs 剣術に使用する武器のスレイフラグ配列
645 * @param m_ptr 目標となるモンスターの構造体参照ポインタ
646 * @param mode 剣術のスレイ型ID
647 * @return スレイの倍率(/10倍)
649 static MULTIPLY mult_hissatsu(MULTIPLY mult, BIT_FLAGS *flgs, monster_type *m_ptr, BIT_FLAGS mode)
651 monster_race *r_ptr = &r_info[m_ptr->r_idx];
653 /* Burning Strike (Fire) */
654 if (mode == HISSATSU_FIRE)
656 /* Notice immunity */
657 if (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK)
659 if (is_original_ap_and_seen(m_ptr))
661 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
665 /* Otherwise, take the damage */
666 else if (have_flag(flgs, TR_BRAND_FIRE))
668 if (r_ptr->flags3 & RF3_HURT_FIRE)
670 if (mult < 70) mult = 70;
671 if (is_original_ap_and_seen(m_ptr))
673 r_ptr->r_flags3 |= RF3_HURT_FIRE;
676 else if (mult < 35) mult = 35;
680 if (r_ptr->flags3 & RF3_HURT_FIRE)
682 if (mult < 50) mult = 50;
683 if (is_original_ap_and_seen(m_ptr))
685 r_ptr->r_flags3 |= RF3_HURT_FIRE;
688 else if (mult < 25) mult = 25;
692 /* Serpent's Tongue (Poison) */
693 if (mode == HISSATSU_POISON)
695 /* Notice immunity */
696 if (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK)
698 if (is_original_ap_and_seen(m_ptr))
700 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK);
704 /* Otherwise, take the damage */
705 else if (have_flag(flgs, TR_BRAND_POIS))
707 if (mult < 35) mult = 35;
711 if (mult < 25) mult = 25;
715 /* Zammaken (Nonliving Evil) */
716 if (mode == HISSATSU_ZANMA)
718 if (!monster_living(m_ptr->r_idx) && (r_ptr->flags3 & RF3_EVIL))
720 if (mult < 15) mult = 25;
721 else if (mult < 50) mult = MIN(50, mult + 20);
725 /* Rock Smash (Hurt Rock) */
726 if (mode == HISSATSU_HAGAN)
728 if (r_ptr->flags3 & RF3_HURT_ROCK)
730 if (is_original_ap_and_seen(m_ptr))
732 r_ptr->r_flags3 |= RF3_HURT_ROCK;
734 if (mult == 10) mult = 40;
735 else if (mult < 60) mult = 60;
739 /* Midare-Setsugekka (Cold) */
740 if (mode == HISSATSU_COLD)
742 /* Notice immunity */
743 if (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK)
745 if (is_original_ap_and_seen(m_ptr))
747 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
750 /* Otherwise, take the damage */
751 else if (have_flag(flgs, TR_BRAND_COLD))
753 if (r_ptr->flags3 & RF3_HURT_COLD)
755 if (mult < 70) mult = 70;
756 if (is_original_ap_and_seen(m_ptr))
758 r_ptr->r_flags3 |= RF3_HURT_COLD;
761 else if (mult < 35) mult = 35;
765 if (r_ptr->flags3 & RF3_HURT_COLD)
767 if (mult < 50) mult = 50;
768 if (is_original_ap_and_seen(m_ptr))
770 r_ptr->r_flags3 |= RF3_HURT_COLD;
773 else if (mult < 25) mult = 25;
777 /* Lightning Eagle (Elec) */
778 if (mode == HISSATSU_ELEC)
780 /* Notice immunity */
781 if (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK)
783 if (is_original_ap_and_seen(m_ptr))
785 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
789 /* Otherwise, take the damage */
790 else if (have_flag(flgs, TR_BRAND_ELEC))
792 if (mult < 70) mult = 70;
796 if (mult < 50) mult = 50;
800 /* Bloody Maelstrom */
801 if ((mode == HISSATSU_SEKIRYUKA) && p_ptr->cut && monster_living(m_ptr->r_idx))
803 MULTIPLY tmp = MIN(100, MAX(10, p_ptr->cut / 10));
804 if (mult < tmp) mult = tmp;
808 if (mode == HISSATSU_UNDEAD)
810 if (r_ptr->flags3 & RF3_UNDEAD)
812 if (is_original_ap_and_seen(m_ptr))
814 r_ptr->r_flags3 |= RF3_UNDEAD;
816 if (mult == 10) mult = 70;
817 else if (mult < 140) mult = MIN(140, mult + 60);
819 if (mult == 10) mult = 40;
820 else if (mult < 60) mult = MIN(60, mult + 30);
823 if (mult > 150) mult = 150;
829 * @brief ダメージにスレイ要素を加える総合処理ルーチン /
830 * Extract the "total damage" from a given object hitting a given monster.
831 * @param o_ptr 使用武器オブジェクトの構造体参照ポインタ
832 * @param tdam 現在算出途中のダメージ値
833 * @param m_ptr 目標モンスターの構造体参照ポインタ
835 * @param thrown 投擲処理ならばTRUEを指定する
836 * @return 総合的なスレイを加味したダメージ値
838 * Note that "flasks of oil" do NOT do fire damage, although they\n
839 * certainly could be made to do so. XXX XXX\n
841 * Note that most brands and slays are x3, except Slay Animal (x2),\n
842 * Slay Evil (x2), and Kill dragon (x5).\n
844 HIT_POINT tot_dam_aux(object_type *o_ptr, HIT_POINT tdam, monster_type *m_ptr, BIT_FLAGS mode, bool thrown)
848 BIT_FLAGS flgs[TR_FLAG_SIZE];
849 object_flags(o_ptr, flgs);
850 torch_flags(o_ptr, flgs); /* torches has secret flags */
854 if (p_ptr->special_attack & (ATTACK_ACID)) add_flag(flgs, TR_BRAND_ACID);
855 if (p_ptr->special_attack & (ATTACK_COLD)) add_flag(flgs, TR_BRAND_COLD);
856 if (p_ptr->special_attack & (ATTACK_ELEC)) add_flag(flgs, TR_BRAND_ELEC);
857 if (p_ptr->special_attack & (ATTACK_FIRE)) add_flag(flgs, TR_BRAND_FIRE);
858 if (p_ptr->special_attack & (ATTACK_POIS)) add_flag(flgs, TR_BRAND_POIS);
861 if (hex_spelling(HEX_RUNESWORD)) add_flag(flgs, TR_SLAY_GOOD);
874 mult = mult_slaying(mult, flgs, m_ptr);
876 mult = mult_brand(mult, flgs, m_ptr);
878 if (p_ptr->pclass == CLASS_SAMURAI)
880 mult = mult_hissatsu(mult, flgs, m_ptr, mode);
883 if ((p_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs, TR_FORCE_WEAPON)) && (p_ptr->csp > (o_ptr->dd * o_ptr->ds / 5)))
885 p_ptr->csp -= (1 + (o_ptr->dd * o_ptr->ds / 5));
886 p_ptr->redraw |= (PR_MANA);
887 mult = mult * 3 / 2 + 20;
890 if ((o_ptr->name1 == ART_NOTHUNG) && (m_ptr->r_idx == MON_FAFNER))
895 if (mult > 150) mult = 150;
897 return (tdam * mult / 10);
901 * @brief プレイヤーからモンスターへの打撃クリティカル判定 /
902 * Critical hits (by player) Factor in weapon weight, total plusses, player melee bonus
903 * @param weight 矢弾の重量
904 * @param plus 武器の命中修正
905 * @param dam 現在算出中のダメージ値
906 * @param meichuu 打撃の基本命中力
907 * @param mode オプションフラグ
908 * @return クリティカル修正が入ったダメージ値
910 HIT_POINT critical_norm(WEIGHT weight, int plus, HIT_POINT dam, s16b meichuu, BIT_FLAGS mode)
914 /* Extract "blow" power */
915 i = (weight + (meichuu * 3 + plus * 5) + p_ptr->skill_thn);
918 if ((randint1((p_ptr->pclass == CLASS_NINJA) ? 4444 : 5000) <= i) || (mode == HISSATSU_MAJIN) || (mode == HISSATSU_3DAN))
920 k = weight + randint1(650);
921 if ((mode == HISSATSU_MAJIN) || (mode == HISSATSU_3DAN)) k += randint1(650);
925 msg_print(_("手ごたえがあった!", "It was a good hit!"));
931 msg_print(_("かなりの手ごたえがあった!", "It was a great hit!"));
936 msg_print(_("会心の一撃だ!", "It was a superb hit!"));
941 msg_print(_("最高の会心の一撃だ!", "It was a *GREAT* hit!"));
946 msg_print(_("比類なき最高の会心の一撃だ!", "It was a *SUPERB* hit!"));
947 dam = ((7 * dam) / 2) + 25;
955 * @brief モンスター打撃のクリティカルランクを返す /
956 * Critical blow. All hits that do 95% of total possible damage,
957 * @param dice モンスター打撃のダイス数
958 * @param sides モンスター打撃の最大ダイス目
959 * @param dam プレイヤーに与えたダメージ
961 * and which also do at least 20 damage, or, sometimes, N damage.
962 * This is used only to determine "cuts" and "stuns".
964 static int monster_critical(DICE_NUMBER dice, DICE_SID sides, HIT_POINT dam)
967 int total = dice * sides;
969 /* Must do at least 95% of perfect */
970 if (dam < total * 19 / 20) return (0);
972 /* Weak blows rarely work */
973 if ((dam < 20) && (randint0(100) >= dam)) return (0);
976 if ((dam >= total) && (dam >= 40)) max++;
981 while (randint0(100) < 2) max++;
984 /* Critical damage */
985 if (dam > 45) return (6 + max);
986 if (dam > 33) return (5 + max);
987 if (dam > 25) return (4 + max);
988 if (dam > 18) return (3 + max);
989 if (dam > 11) return (2 + max);
994 * @brief モンスター打撃の命中を判定する /
995 * Determine if a monster attack against the player succeeds.
996 * @param power 打撃属性毎の基本命中値
997 * @param level モンスターのレベル
998 * @param stun モンスターの朦朧値
999 * @return TRUEならば命中判定
1001 * Always miss 5% of the time, Always hit 5% of the time.
1002 * Otherwise, match monster power against player armor.
1004 static int check_hit(int power, DEPTH level, int stun)
1008 /* Percentile dice */
1011 if (stun && one_in_(2)) return FALSE;
1013 /* Hack -- Always miss or hit */
1014 if (k < 10) return (k < 5);
1016 /* Calculate the "attack quality" */
1017 i = (power + (level * 3));
1020 ac = p_ptr->ac + p_ptr->to_a;
1021 if (p_ptr->special_attack & ATTACK_SUIKEN) ac += (p_ptr->lev * 2);
1023 /* Power and Level compete against Armor */
1024 if ((i > 0) && (randint1(i) > ((ac * 3) / 4))) return (TRUE);
1030 /*! モンスターの侮辱行為メッセージテーブル / Hack -- possible "insult" messages */
1031 static concptr desc_insult[] =
1042 "があなたをパラサイト呼ばわりした!",
1046 "insults your mother!",
1047 "gives you the finger!",
1050 "dances around you!",
1051 "makes obscene gestures!",
1053 "calls you a parasite!",
1054 "calls you a cyborg!"
1059 /*! マゴットのぼやきメッセージテーブル / Hack -- possible "insult" messages */
1060 static concptr desc_moan[] =
1064 "が彼の飼い犬を見なかったかと尋ねている。",
1065 "が縄張りから出て行けと言っている。",
1068 "seems sad about something.",
1069 "asks if you have seen his dogs.",
1070 "tells you to get off his land.",
1071 "mumbles something about mushrooms."
1077 * @brief 敵オーラによるプレイヤーのダメージ処理(補助)
1078 * @param m_ptr オーラを持つモンスターの構造体参照ポインタ
1079 * @param immune ダメージを回避できる免疫フラグ
1080 * @param flags_offset オーラフラグ配列の参照オフセット
1081 * @param r_flags_offset モンスターの耐性配列の参照オフセット
1082 * @param aura_flag オーラフラグ配列
1083 * @param dam_func ダメージ処理を行う関数の参照ポインタ
1084 * @param message オーラダメージを受けた際のメッセージ
1087 static void touch_zap_player_aux(monster_type *m_ptr, bool immune, int flags_offset, int r_flags_offset, u32b aura_flag,
1088 HIT_POINT(*dam_func)(HIT_POINT dam, concptr kb_str, int monspell, bool aura), concptr message)
1090 monster_race *r_ptr = &r_info[m_ptr->r_idx];
1092 if ((atoffset(BIT_FLAGS, r_ptr, flags_offset) & aura_flag) && !immune)
1094 GAME_TEXT mon_name[MAX_NLEN];
1095 int aura_damage = damroll(1 + (r_ptr->level / 26), 1 + (r_ptr->level / 17));
1097 monster_desc(mon_name, m_ptr, MD_WRONGDOER_NAME);
1099 dam_func(aura_damage, mon_name, -1, TRUE);
1101 if (is_original_ap_and_seen(m_ptr))
1103 atoffset(BIT_FLAGS, r_ptr, r_flags_offset) |= aura_flag;
1111 * @brief 敵オーラによるプレイヤーのダメージ処理(メイン)
1112 * @param m_ptr オーラを持つモンスターの構造体参照ポインタ
1115 static void touch_zap_player(monster_type *m_ptr)
1117 touch_zap_player_aux(m_ptr, p_ptr->immune_fire, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_FIRE,
1118 fire_dam, _("突然とても熱くなった!", "You are suddenly very hot!"));
1119 touch_zap_player_aux(m_ptr, p_ptr->immune_cold, offsetof(monster_race, flags3), offsetof(monster_race, r_flags3), RF3_AURA_COLD,
1120 cold_dam, _("突然とても寒くなった!", "You are suddenly very cold!"));
1121 touch_zap_player_aux(m_ptr, p_ptr->immune_elec, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_ELEC,
1122 elec_dam, _("電撃をくらった!", "You get zapped!"));
1126 * @brief プレイヤーの変異要素による打撃処理
1127 * @param m_idx 攻撃目標となったモンスターの参照ID
1128 * @param attack 変異要素による攻撃要素の種類
1129 * @param fear 攻撃を受けたモンスターが恐慌状態に陥ったかを返す参照ポインタ
1130 * @param mdeath 攻撃を受けたモンスターが死亡したかを返す参照ポインタ
1133 static void natural_attack(MONSTER_IDX m_idx, int attack, bool *fear, bool *mdeath)
1137 WEIGHT n_weight = 0;
1138 monster_type *m_ptr = ¤t_floor_ptr->m_list[m_idx];
1139 monster_race *r_ptr = &r_info[m_ptr->r_idx];
1140 GAME_TEXT m_name[MAX_NLEN];
1142 int dice_num, dice_side;
1148 case MUT2_SCOR_TAIL:
1152 atk_desc = _("尻尾", "tail");
1159 atk_desc = _("角", "horns");
1166 atk_desc = _("クチバシ", "beak");
1173 atk_desc = _("象の鼻", "trunk");
1176 case MUT2_TENTACLES:
1180 atk_desc = _("触手", "tentacles");
1184 dice_num = dice_side = n_weight = 1;
1185 atk_desc = _("未定義の部位", "undefined body part");
1189 /* Extract monster name (or "it") */
1190 monster_desc(m_name, m_ptr, 0);
1192 /* Calculate the "attack quality" */
1193 bonus = p_ptr->to_h_m + (p_ptr->lev * 6 / 5);
1194 chance = (p_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
1197 if ((!(r_ptr->flags2 & RF2_QUANTUM) || !randint0(2)) && test_hit_norm(chance, r_ptr->ac, m_ptr->ml))
1200 msg_format(_("%sを%sで攻撃した。", "You hit %s with your %s."), m_name, atk_desc);
1202 k = damroll(dice_num, dice_side);
1203 k = critical_norm(n_weight, bonus, k, (s16b)bonus, 0);
1205 /* Apply the player damage bonuses */
1208 /* No negative damage */
1211 /* Modify the damage */
1212 k = mon_damage_mod(m_ptr, k, FALSE);
1214 /* Complex message */
1215 msg_format_wizard(CHEAT_MONSTER,
1216 _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"),
1217 k, m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
1219 /* Anger the monster */
1220 if (k > 0) anger_monster(m_ptr);
1222 /* Damage, check for fear and mdeath */
1225 case MUT2_SCOR_TAIL:
1226 project(0, 0, m_ptr->fy, m_ptr->fx, k, GF_POIS, PROJECT_KILL, -1);
1227 *mdeath = (m_ptr->r_idx == 0);
1230 *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1233 *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1236 *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1238 case MUT2_TENTACLES:
1239 *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1242 *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1245 touch_zap_player(m_ptr);
1251 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
1256 * @brief プレイヤーの打撃処理サブルーチン /
1257 * Player attacks a (poor, defenseless) creature -RAK-
1260 * @param fear 攻撃を受けたモンスターが恐慌状態に陥ったかを返す参照ポインタ
1261 * @param mdeath 攻撃を受けたモンスターが死亡したかを返す参照ポインタ
1262 * @param hand 攻撃を行うための武器を持つ手
1263 * @param mode 発動中の剣術ID
1266 * If no "weapon" is available, then "punch" the monster one time.
1268 static void py_attack_aux(POSITION y, POSITION x, bool *fear, bool *mdeath, s16b hand, COMBAT_OPTION_IDX mode)
1270 int num = 0, bonus, chance, vir;
1273 grid_type *g_ptr = ¤t_floor_ptr->grid_array[y][x];
1275 monster_type *m_ptr = ¤t_floor_ptr->m_list[g_ptr->m_idx];
1276 monster_race *r_ptr = &r_info[m_ptr->r_idx];
1278 /* Access the weapon */
1279 object_type *o_ptr = &p_ptr->inventory_list[INVEN_RARM + hand];
1281 GAME_TEXT m_name[MAX_NLEN];
1283 bool success_hit = FALSE;
1284 bool backstab = FALSE;
1285 bool vorpal_cut = FALSE;
1286 int chaos_effect = 0;
1287 bool stab_fleeing = FALSE;
1288 bool fuiuchi = FALSE;
1289 bool monk_attack = FALSE;
1290 bool do_quake = FALSE;
1292 bool drain_msg = TRUE;
1293 int drain_result = 0, drain_heal = 0;
1294 bool can_drain = FALSE;
1296 int drain_left = MAX_VAMPIRIC_DRAIN;
1297 BIT_FLAGS flgs[TR_FLAG_SIZE]; /* A massive hack -- life-draining weapons */
1298 bool is_human = (r_ptr->d_char == 'p');
1299 bool is_lowlevel = (r_ptr->level < (p_ptr->lev - 15));
1300 bool zantetsu_mukou, e_j_mukou;
1302 switch (p_ptr->pclass)
1306 if (has_melee_weapon(INVEN_RARM + hand) && !p_ptr->icky_wield[hand])
1308 int tmp = p_ptr->lev * 6 + (p_ptr->skill_stl + 10) * 4;
1309 if (p_ptr->monlite && (mode != HISSATSU_NYUSIN)) tmp /= 3;
1310 if (p_ptr->cursed & TRC_AGGRAVATE) tmp /= 2;
1311 if (r_ptr->level > (p_ptr->lev * p_ptr->lev / 20 + 10)) tmp /= 3;
1312 if (MON_CSLEEP(m_ptr) && m_ptr->ml)
1314 /* Can't backstab creatures that we can't see, right? */
1317 else if ((p_ptr->special_defense & NINJA_S_STEALTH) && (randint0(tmp) > (r_ptr->level + 20)) && m_ptr->ml && !(r_ptr->flagsr & RFR_RES_ALL))
1321 else if (MON_MONFEAR(m_ptr) && m_ptr->ml)
1323 stab_fleeing = TRUE;
1329 case CLASS_FORCETRAINER:
1330 case CLASS_BERSERKER:
1331 if ((empty_hands(TRUE) & EMPTY_HAND_RARM) && !p_ptr->riding) monk_attack = TRUE;
1335 if (!o_ptr->k_idx) /* Empty hand */
1337 if ((r_ptr->level + 10) > p_ptr->lev)
1339 if (p_ptr->skill_exp[GINOU_SUDE] < s_info[p_ptr->pclass].s_max[GINOU_SUDE])
1341 if (p_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_BEGINNER)
1342 p_ptr->skill_exp[GINOU_SUDE] += 40;
1343 else if ((p_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_SKILLED))
1344 p_ptr->skill_exp[GINOU_SUDE] += 5;
1345 else if ((p_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_EXPERT) && (p_ptr->lev > 19))
1346 p_ptr->skill_exp[GINOU_SUDE] += 1;
1347 else if ((p_ptr->lev > 34))
1348 if (one_in_(3)) p_ptr->skill_exp[GINOU_SUDE] += 1;
1349 p_ptr->update |= (PU_BONUS);
1353 else if (object_is_melee_weapon(o_ptr))
1355 if ((r_ptr->level + 10) > p_ptr->lev)
1357 OBJECT_TYPE_VALUE tval = p_ptr->inventory_list[INVEN_RARM + hand].tval - TV_WEAPON_BEGIN;
1358 OBJECT_SUBTYPE_VALUE sval = p_ptr->inventory_list[INVEN_RARM + hand].sval;
1359 int now_exp = p_ptr->weapon_exp[tval][sval];
1360 if (now_exp < s_info[p_ptr->pclass].w_max[tval][sval])
1363 if (now_exp < WEAPON_EXP_BEGINNER) amount = 80;
1364 else if (now_exp < WEAPON_EXP_SKILLED) amount = 10;
1365 else if ((now_exp < WEAPON_EXP_EXPERT) && (p_ptr->lev > 19)) amount = 1;
1366 else if ((p_ptr->lev > 34) && one_in_(2)) amount = 1;
1367 p_ptr->weapon_exp[tval][sval] += amount;
1368 p_ptr->update |= (PU_BONUS);
1373 /* Disturb the monster */
1374 (void)set_monster_csleep(g_ptr->m_idx, 0);
1376 /* Extract monster name (or "it") */
1377 monster_desc(m_name, m_ptr, 0);
1379 /* Calculate the "attack quality" */
1380 bonus = p_ptr->to_h[hand] + o_ptr->to_h;
1381 chance = (p_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
1382 if (mode == HISSATSU_IAI) chance += 60;
1383 if (p_ptr->special_defense & KATA_KOUKIJIN) chance += 150;
1384 if (p_ptr->sutemi) chance = MAX(chance * 3 / 2, chance + 60);
1386 vir = virtue_number(V_VALOUR);
1389 chance += (p_ptr->virtues[vir - 1] / 10);
1392 zantetsu_mukou = ((o_ptr->name1 == ART_ZANTETSU) && (r_ptr->d_char == 'j'));
1393 e_j_mukou = ((o_ptr->name1 == ART_EXCALIBUR_J) && (r_ptr->d_char == 'S'));
1395 if ((mode == HISSATSU_KYUSHO) || (mode == HISSATSU_MINEUCHI) || (mode == HISSATSU_3DAN) || (mode == HISSATSU_IAI)) num_blow = 1;
1396 else if (mode == HISSATSU_COLD) num_blow = p_ptr->num_blow[hand] + 2;
1397 else num_blow = p_ptr->num_blow[hand];
1399 /* Hack -- DOKUBARI always hit once */
1400 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) num_blow = 1;
1402 /* Attack once for each legal blow */
1403 while ((num++ < num_blow) && !p_ptr->is_dead)
1405 if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) || (mode == HISSATSU_KYUSHO))
1409 if (p_ptr->migite && p_ptr->hidarite)
1413 if (mode == HISSATSU_3DAN)
1418 success_hit = one_in_(n);
1420 else if ((p_ptr->pclass == CLASS_NINJA) && ((backstab || fuiuchi) && !(r_ptr->flagsr & RFR_RES_ALL))) success_hit = TRUE;
1421 else success_hit = test_hit_norm(chance, r_ptr->ac, m_ptr->ml);
1423 if (mode == HISSATSU_MAJIN)
1426 success_hit = FALSE;
1432 int vorpal_chance = ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD)) ? 2 : 4;
1436 if (backstab) msg_format(_("あなたは冷酷にも眠っている無力な%sを突き刺した!", "You cruelly stab the helpless, sleeping %s!"), m_name);
1437 else if (fuiuchi) msg_format(_("不意を突いて%sに強烈な一撃を喰らわせた!", "You make surprise attack, and hit %s with a powerful blow!"), m_name);
1438 else if (stab_fleeing) msg_format(_("逃げる%sを背中から突き刺した!", "You backstab the fleeing %s!"), m_name);
1439 else if (!monk_attack) msg_format(_("%sを攻撃した。", "You hit %s."), m_name);
1441 /* Hack -- bare hands do one damage */
1444 object_flags(o_ptr, flgs);
1446 /* Select a chaotic effect (50% chance) */
1447 if ((have_flag(flgs, TR_CHAOTIC)) && one_in_(2))
1450 chg_virtue(V_CHANCE, 1);
1452 if (randint1(5) < 3)
1454 /* Vampiric (20%) */
1457 else if (one_in_(250))
1462 else if (!one_in_(10))
1464 /* Confusion (26.892%) */
1467 else if (one_in_(2))
1469 /* Teleport away (1.494%) */
1474 /* Polymorph (1.494%) */
1479 /* Vampiric drain */
1480 if ((have_flag(flgs, TR_VAMPIRIC)) || (chaos_effect == 1) || (mode == HISSATSU_DRAIN) || hex_spelling(HEX_VAMP_BLADE))
1482 /* Only drain "living" monsters */
1483 if (monster_living(m_ptr->r_idx))
1489 if ((have_flag(flgs, TR_VORPAL) || hex_spelling(HEX_RUNESWORD)) && (randint1(vorpal_chance * 3 / 2) == 1) && !zantetsu_mukou)
1491 else vorpal_cut = FALSE;
1495 int special_effect = 0, stun_effect = 0, times = 0, max_times;
1497 const martial_arts *ma_ptr = &ma_blows[0], *old_ptr = &ma_blows[0];
1498 int resist_stun = 0;
1501 if (r_ptr->flags1 & RF1_UNIQUE) resist_stun += 88;
1502 if (r_ptr->flags3 & RF3_NO_STUN) resist_stun += 66;
1503 if (r_ptr->flags3 & RF3_NO_CONF) resist_stun += 33;
1504 if (r_ptr->flags3 & RF3_NO_SLEEP) resist_stun += 33;
1505 if ((r_ptr->flags3 & RF3_UNDEAD) || (r_ptr->flags3 & RF3_NONLIVING))
1508 if (p_ptr->special_defense & KAMAE_BYAKKO)
1509 max_times = (p_ptr->lev < 3 ? 1 : p_ptr->lev / 3);
1510 else if (p_ptr->special_defense & KAMAE_SUZAKU)
1512 else if (p_ptr->special_defense & KAMAE_GENBU)
1515 max_times = (p_ptr->lev < 7 ? 1 : p_ptr->lev / 7);
1516 /* Attempt 'times' */
1517 for (times = 0; times < max_times; times++)
1521 ma_ptr = &ma_blows[randint0(MAX_MA)];
1522 if ((p_ptr->pclass == CLASS_FORCETRAINER) && (ma_ptr->min_level > 1)) min_level = ma_ptr->min_level + 3;
1523 else min_level = ma_ptr->min_level;
1524 } while ((min_level > p_ptr->lev) ||
1525 (randint1(p_ptr->lev) < ma_ptr->chance));
1527 /* keep the highest level attack available we found */
1528 if ((ma_ptr->min_level > old_ptr->min_level) &&
1529 !p_ptr->stun && !p_ptr->confused)
1533 if (p_ptr->wizard && cheat_xtra)
1535 msg_print(_("攻撃を再選択しました。", "Attack re-selected."));
1544 if (p_ptr->pclass == CLASS_FORCETRAINER) min_level = MAX(1, ma_ptr->min_level - 3);
1545 else min_level = ma_ptr->min_level;
1546 k = damroll(ma_ptr->dd + p_ptr->to_dd[hand], ma_ptr->ds + p_ptr->to_ds[hand]);
1547 if (p_ptr->special_attack & ATTACK_SUIKEN) k *= 2;
1549 if (ma_ptr->effect == MA_KNEE)
1551 if (r_ptr->flags1 & RF1_MALE)
1553 msg_format(_("%sに金的膝蹴りをくらわした!", "You hit %s in the groin with your knee!"), m_name);
1555 special_effect = MA_KNEE;
1558 msg_format(ma_ptr->desc, m_name);
1561 else if (ma_ptr->effect == MA_SLOW)
1563 if (!((r_ptr->flags1 & RF1_NEVER_MOVE) ||
1564 my_strchr("~#{}.UjmeEv$,DdsbBFIJQSXclnw!=?", r_ptr->d_char)))
1566 msg_format(_("%sの足首に関節蹴りをくらわした!", "You kick %s in the ankle."), m_name);
1567 special_effect = MA_SLOW;
1569 else msg_format(ma_ptr->desc, m_name);
1575 stun_effect = (ma_ptr->effect / 2) + randint1(ma_ptr->effect / 2);
1578 msg_format(ma_ptr->desc, m_name);
1581 if (p_ptr->special_defense & KAMAE_SUZAKU) weight = 4;
1582 if ((p_ptr->pclass == CLASS_FORCETRAINER) && P_PTR_KI)
1584 weight += (P_PTR_KI / 30);
1585 if (weight > 20) weight = 20;
1588 k = critical_norm(p_ptr->lev * weight, min_level, k, p_ptr->to_h[0], 0);
1590 if ((special_effect == MA_KNEE) && ((k + p_ptr->to_d[hand]) < m_ptr->hp))
1592 msg_format(_("%^sは苦痛にうめいている!", "%^s moans in agony!"), m_name);
1593 stun_effect = 7 + randint1(13);
1597 else if ((special_effect == MA_SLOW) && ((k + p_ptr->to_d[hand]) < m_ptr->hp))
1599 if (!(r_ptr->flags1 & RF1_UNIQUE) &&
1600 (randint1(p_ptr->lev) > r_ptr->level) &&
1603 msg_format(_("%^sは足をひきずり始めた。", "%^s starts limping slower."), m_name);
1604 m_ptr->mspeed -= 10;
1608 if (stun_effect && ((k + p_ptr->to_d[hand]) < m_ptr->hp))
1610 if (p_ptr->lev > randint1(r_ptr->level + resist_stun + 10))
1612 if (set_monster_stunned(g_ptr->m_idx, stun_effect + MON_STUNNED(m_ptr)))
1614 msg_format(_("%^sはフラフラになった。", "%^s is stunned."), m_name);
1618 msg_format(_("%^sはさらにフラフラになった。", "%^s is more stunned."), m_name);
1624 /* Handle normal weapon */
1625 else if (o_ptr->k_idx)
1627 k = damroll(o_ptr->dd + p_ptr->to_dd[hand], o_ptr->ds + p_ptr->to_ds[hand]);
1628 k = tot_dam_aux(o_ptr, k, m_ptr, mode, FALSE);
1632 k *= (3 + (p_ptr->lev / 20));
1636 k = k*(5 + (p_ptr->lev * 2 / 25)) / 2;
1638 else if (stab_fleeing)
1643 if ((p_ptr->impact[hand] && ((k > 50) || one_in_(7))) ||
1644 (chaos_effect == 2) || (mode == HISSATSU_QUAKE))
1649 if ((!(o_ptr->tval == TV_SWORD) || !(o_ptr->sval == SV_DOKUBARI)) && !(mode == HISSATSU_KYUSHO))
1650 k = critical_norm(o_ptr->weight, o_ptr->to_h, k, p_ptr->to_h[hand], mode);
1658 if ((o_ptr->name1 == ART_CHAINSWORD) && !one_in_(2))
1660 char chainsword_noise[1024];
1661 if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, chainsword_noise))
1663 msg_print(chainsword_noise);
1667 if (o_ptr->name1 == ART_VORPAL_BLADE)
1669 msg_print(_("目にも止まらぬヴォーパルブレード、手錬の早業!", "Your Vorpal Blade goes snicker-snack!"));
1673 msg_format(_("%sをグッサリ切り裂いた!", "Your weapon cuts deep into %s!"), m_name);
1676 /* Try to increase the damage */
1677 while (one_in_(vorpal_chance))
1682 k *= (HIT_POINT)mult;
1685 if (((r_ptr->flagsr & RFR_RES_ALL) ? k / 100 : k) > m_ptr->hp)
1687 msg_format(_("%sを真っ二つにした!", "You cut %s in half!"), m_name);
1693 case 2: msg_format(_("%sを斬った!", "You gouge %s!"), m_name); break;
1694 case 3: msg_format(_("%sをぶった斬った!", "You maim %s!"), m_name); break;
1695 case 4: msg_format(_("%sをメッタ斬りにした!", "You carve %s!"), m_name); break;
1696 case 5: msg_format(_("%sをメッタメタに斬った!", "You cleave %s!"), m_name); break;
1697 case 6: msg_format(_("%sを刺身にした!", "You smite %s!"), m_name); break;
1698 case 7: msg_format(_("%sを斬って斬って斬りまくった!", "You eviscerate %s!"), m_name); break;
1699 default: msg_format(_("%sを細切れにした!", "You shred %s!"), m_name); break;
1702 drain_result = drain_result * 3 / 2;
1706 drain_result += o_ptr->to_d;
1709 /* Apply the player damage bonuses */
1710 k += p_ptr->to_d[hand];
1711 drain_result += p_ptr->to_d[hand];
1713 if ((mode == HISSATSU_SUTEMI) || (mode == HISSATSU_3DAN)) k *= 2;
1714 if ((mode == HISSATSU_SEKIRYUKA) && !monster_living(m_ptr->r_idx)) k = 0;
1715 if ((mode == HISSATSU_SEKIRYUKA) && !p_ptr->cut) k /= 2;
1717 /* No negative damage */
1720 if ((mode == HISSATSU_ZANMA) && !(!monster_living(m_ptr->r_idx) && (r_ptr->flags3 & RF3_EVIL)))
1727 msg_print(_("こんな軟らかいものは切れん!", "You cannot cut such a elastic thing!"));
1733 msg_print(_("蜘蛛は苦手だ!", "Spiders are difficult for you to deal with!"));
1737 if (mode == HISSATSU_MINEUCHI)
1739 int tmp = (10 + randint1(15) + p_ptr->lev / 5);
1742 anger_monster(m_ptr);
1744 if (!(r_ptr->flags3 & (RF3_NO_STUN)))
1747 if (MON_STUNNED(m_ptr))
1749 msg_format(_("%sはひどくもうろうとした。", "%s is more dazed."), m_name);
1754 msg_format(_("%s はもうろうとした。", "%s is dazed."), m_name);
1758 (void)set_monster_stunned(g_ptr->m_idx, MON_STUNNED(m_ptr) + tmp);
1762 msg_format(_("%s には効果がなかった。", "%s is not effected."), m_name);
1766 /* Modify the damage */
1767 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))));
1768 if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) || (mode == HISSATSU_KYUSHO))
1770 if ((randint1(randint1(r_ptr->level / 7) + 5) == 1) && !(r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags7 & RF7_UNIQUE2))
1773 msg_format(_("%sの急所を突き刺した!", "You hit %s on a fatal spot!"), m_name);
1777 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)))
1779 int maxhp = maxroll(r_ptr->hdice, r_ptr->hside);
1780 if (one_in_(backstab ? 13 : (stab_fleeing || fuiuchi) ? 15 : 27))
1784 msg_format(_("刃が%sに深々と突き刺さった!", "You critically injured %s!"), m_name);
1786 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)))
1788 if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_UNIQUE2) || (m_ptr->hp >= maxhp / 2))
1790 k = MAX(k * 5, m_ptr->hp / 2);
1792 msg_format(_("%sに致命傷を負わせた!", "You fatally injured %s!"), m_name);
1797 msg_format(_("刃が%sの急所を貫いた!", "You hit %s on a fatal spot!"), m_name);
1802 msg_format_wizard(CHEAT_MONSTER,
1803 _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"), k,
1804 m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
1806 if (k <= 0) can_drain = FALSE;
1808 if (drain_result > m_ptr->hp)
1809 drain_result = m_ptr->hp;
1811 /* Damage, check for fear and death */
1812 if (mon_take_hit(g_ptr->m_idx, k, fear, NULL))
1815 if ((p_ptr->pclass == CLASS_BERSERKER) && p_ptr->energy_use)
1817 if (p_ptr->migite && p_ptr->hidarite)
1819 if (hand) p_ptr->energy_use = p_ptr->energy_use * 3 / 5 + p_ptr->energy_use*num * 2 / (p_ptr->num_blow[hand] * 5);
1820 else p_ptr->energy_use = p_ptr->energy_use*num * 3 / (p_ptr->num_blow[hand] * 5);
1824 p_ptr->energy_use = p_ptr->energy_use*num / p_ptr->num_blow[hand];
1827 if ((o_ptr->name1 == ART_ZANTETSU) && is_lowlevel)
1828 msg_print(_("またつまらぬものを斬ってしまった...", "Sigh... Another trifling thing I've cut...."));
1832 /* Anger the monster */
1833 if (k > 0) anger_monster(m_ptr);
1835 touch_zap_player(m_ptr);
1837 /* Are we draining it? A little note: If the monster is
1838 dead, the drain does not work... */
1840 if (can_drain && (drain_result > 0))
1842 if (o_ptr->name1 == ART_MURAMASA)
1846 HIT_PROB to_h = o_ptr->to_h;
1847 HIT_POINT to_d = o_ptr->to_d;
1851 for (i = 0; i < to_h + 3; i++) if (one_in_(4)) flag = 0;
1855 for (i = 0; i < to_d + 3; i++) if (one_in_(4)) flag = 0;
1858 if (o_ptr->to_h != to_h || o_ptr->to_d != to_d)
1860 msg_print(_("妖刀は血を吸って強くなった!", "Muramasa sucked blood, and became more powerful!"));
1868 if (drain_result > 5) /* Did we really hurt it? */
1870 drain_heal = damroll(2, drain_result / 6);
1873 if (hex_spelling(HEX_VAMP_BLADE)) drain_heal *= 2;
1877 msg_format(_("Draining left: %d", "Draining left: %d"), drain_left);
1882 if (drain_heal < drain_left)
1884 drain_left -= drain_heal;
1888 drain_heal = drain_left;
1894 msg_format(_("刃が%sから生命力を吸い取った!", "Your weapon drains life from %s!"), m_name);
1898 drain_heal = (drain_heal * p_ptr->mutant_regenerate_mod) / 100;
1900 hp_player(drain_heal);
1901 /* We get to keep some of it! */
1905 m_ptr->maxhp -= (k + 7) / 8;
1906 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
1907 if (m_ptr->maxhp < 1) m_ptr->maxhp = 1;
1913 /* Confusion attack */
1914 if ((p_ptr->special_attack & ATTACK_CONFUSE) || (chaos_effect == 3) || (mode == HISSATSU_CONF) || hex_spelling(HEX_CONFUSION))
1916 /* Cancel glowing hands */
1917 if (p_ptr->special_attack & ATTACK_CONFUSE)
1919 p_ptr->special_attack &= ~(ATTACK_CONFUSE);
1920 msg_print(_("手の輝きがなくなった。", "Your hands stop glowing."));
1921 p_ptr->redraw |= (PR_STATUS);
1925 /* Confuse the monster */
1926 if (r_ptr->flags3 & RF3_NO_CONF)
1928 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_NO_CONF;
1929 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
1932 else if (randint0(100) < r_ptr->level)
1934 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
1938 msg_format(_("%^sは混乱したようだ。", "%^s appears confused."), m_name);
1939 (void)set_monster_confused(g_ptr->m_idx, MON_CONFUSED(m_ptr) + 10 + randint0(p_ptr->lev) / 5);
1943 else if (chaos_effect == 4)
1945 bool resists_tele = FALSE;
1947 if (r_ptr->flagsr & RFR_RES_TELE)
1949 if (r_ptr->flags1 & RF1_UNIQUE)
1951 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1952 msg_format(_("%^sには効果がなかった。", "%^s is unaffected!"), m_name);
1953 resists_tele = TRUE;
1955 else if (r_ptr->level > randint1(100))
1957 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1958 msg_format(_("%^sは抵抗力を持っている!", "%^s resists!"), m_name);
1959 resists_tele = TRUE;
1965 msg_format(_("%^sは消えた!", "%^s disappears!"), m_name);
1966 teleport_away(g_ptr->m_idx, 50, TELEPORT_PASSIVE);
1967 num = num_blow + 1; /* Can't hit it anymore! */
1972 else if ((chaos_effect == 5) && (randint1(90) > r_ptr->level))
1974 if (!(r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) &&
1975 !(r_ptr->flagsr & RFR_EFF_RES_CHAO_MASK))
1977 if (polymorph_monster(y, x))
1979 msg_format(_("%^sは変化した!", "%^s changes!"), m_name);
1985 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
1988 /* Hack -- Get new monster */
1989 m_ptr = ¤t_floor_ptr->m_list[g_ptr->m_idx];
1991 /* Oops, we need a different name... */
1992 monster_desc(m_name, m_ptr, 0);
1994 /* Hack -- Get new race */
1995 r_ptr = &r_info[m_ptr->r_idx];
1998 else if (o_ptr->name1 == ART_G_HAMMER)
2000 monster_type *target_ptr = ¤t_floor_ptr->m_list[g_ptr->m_idx];
2002 if (target_ptr->hold_o_idx)
2004 object_type *q_ptr = ¤t_floor_ptr->o_list[target_ptr->hold_o_idx];
2005 GAME_TEXT o_name[MAX_NLEN];
2007 object_desc(o_name, q_ptr, OD_NAME_ONLY);
2008 q_ptr->held_m_idx = 0;
2009 q_ptr->marked = OM_TOUCHED;
2010 target_ptr->hold_o_idx = q_ptr->next_o_idx;
2011 q_ptr->next_o_idx = 0;
2012 msg_format(_("%sを奪った。", "You snatched %s."), o_name);
2021 backstab = FALSE; /* Clumsy! */
2022 fuiuchi = FALSE; /* Clumsy! */
2024 if ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE) && one_in_(3))
2026 BIT_FLAGS flgs_aux[TR_FLAG_SIZE];
2030 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
2031 msg_print(_("振り回した大鎌が自分自身に返ってきた!", "Your scythe returns to you!"));
2032 object_flags(o_ptr, flgs_aux);
2034 k = damroll(o_ptr->dd + p_ptr->to_dd[hand], o_ptr->ds + p_ptr->to_ds[hand]);
2037 switch (p_ptr->mimic_form)
2040 switch (p_ptr->prace)
2047 case RACE_BARBARIAN:
2051 case RACE_HALF_TROLL:
2052 case RACE_HALF_OGRE:
2053 case RACE_HALF_GIANT:
2054 case RACE_HALF_TITAN:
2062 case RACE_DRACONIAN:
2069 case MIMIC_DEMON_LORD:
2076 if (p_ptr->align < 0 && mult < 20)
2078 if (!(p_ptr->resist_acid || IS_OPPOSE_ACID() || p_ptr->immune_acid) && (mult < 25))
2080 if (!(p_ptr->resist_elec || IS_OPPOSE_ELEC() || p_ptr->immune_elec) && (mult < 25))
2082 if (!(p_ptr->resist_fire || IS_OPPOSE_FIRE() || p_ptr->immune_fire) && (mult < 25))
2084 if (!(p_ptr->resist_cold || IS_OPPOSE_COLD() || p_ptr->immune_cold) && (mult < 25))
2086 if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()) && (mult < 25))
2089 if ((p_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs_aux, TR_FORCE_WEAPON)) && (p_ptr->csp >(p_ptr->msp / 30)))
2091 p_ptr->csp -= (1 + (p_ptr->msp / 30));
2092 p_ptr->redraw |= (PR_MANA);
2093 mult = mult * 3 / 2 + 20;
2095 k *= (HIT_POINT)mult;
2099 k = critical_norm(o_ptr->weight, o_ptr->to_h, k, p_ptr->to_h[hand], mode);
2103 msg_format(_("グッサリ切り裂かれた!", "Your weapon cuts deep into yourself!"));
2104 /* Try to increase the damage */
2110 k *= (HIT_POINT)mult;
2112 k += (p_ptr->to_d[hand] + o_ptr->to_d);
2115 take_hit(DAMAGE_FORCE, k, _("死の大鎌", "Death scythe"), -1);
2121 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
2129 if (weak && !(*mdeath))
2131 msg_format(_("%sは弱くなったようだ。", "%^s seems weakened."), m_name);
2133 if (drain_left != MAX_VAMPIRIC_DRAIN)
2137 chg_virtue(V_UNLIFE, 1);
2140 /* Mega-Hack -- apply earthquake brand */
2143 earthquake(p_ptr->y, p_ptr->x, 10);
2144 if (!current_floor_ptr->grid_array[y][x].m_idx) *mdeath = TRUE;
2149 * @brief プレイヤーの打撃処理メインルーチン
2152 * @param mode 発動中の剣術ID
2153 * @return 実際に攻撃処理が行われた場合TRUEを返す。
2155 * If no "weapon" is available, then "punch" the monster one time.
2157 bool py_attack(POSITION y, POSITION x, COMBAT_OPTION_IDX mode)
2160 bool mdeath = FALSE;
2161 bool stormbringer = FALSE;
2163 grid_type *g_ptr = ¤t_floor_ptr->grid_array[y][x];
2164 monster_type *m_ptr = ¤t_floor_ptr->m_list[g_ptr->m_idx];
2165 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2166 GAME_TEXT m_name[MAX_NLEN];
2168 disturb(FALSE, TRUE);
2170 take_turn(p_ptr, 100);
2172 if (!p_ptr->migite && !p_ptr->hidarite &&
2173 !(p_ptr->muta2 & (MUT2_HORNS | MUT2_BEAK | MUT2_SCOR_TAIL | MUT2_TRUNK | MUT2_TENTACLES)))
2175 msg_format(_("%s攻撃できない。", "You cannot do attacking."),
2176 (empty_hands(FALSE) == EMPTY_HAND_NONE) ? _("両手がふさがって", "") : "");
2180 /* Extract monster name (or "it") */
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 /* Track a new monster */
2189 health_track(g_ptr->m_idx);
2192 if ((r_ptr->flags1 & RF1_FEMALE) &&
2193 !(p_ptr->stun || p_ptr->confused || p_ptr->image || !m_ptr->ml))
2195 if ((p_ptr->inventory_list[INVEN_RARM].name1 == ART_ZANTETSU) || (p_ptr->inventory_list[INVEN_LARM].name1 == ART_ZANTETSU))
2197 msg_print(_("拙者、おなごは斬れぬ!", "I can not attack women!"));
2202 if (d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MELEE)
2204 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));
2208 /* Stop if friendly */
2209 if (!is_hostile(m_ptr) &&
2210 !(p_ptr->stun || p_ptr->confused || p_ptr->image ||
2211 p_ptr->shero || !m_ptr->ml))
2213 if (p_ptr->inventory_list[INVEN_RARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
2214 if (p_ptr->inventory_list[INVEN_LARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
2217 msg_format(_("黒い刃は強欲に%sを攻撃した!", "Your black blade greedily attacks %s!"), m_name);
2218 chg_virtue(V_INDIVIDUALISM, 1);
2219 chg_virtue(V_HONOUR, -1);
2220 chg_virtue(V_JUSTICE, -1);
2221 chg_virtue(V_COMPASSION, -1);
2223 else if (p_ptr->pclass != CLASS_BERSERKER)
2225 if (get_check(_("本当に攻撃しますか?", "Really hit it? ")))
2227 chg_virtue(V_INDIVIDUALISM, 1);
2228 chg_virtue(V_HONOUR, -1);
2229 chg_virtue(V_JUSTICE, -1);
2230 chg_virtue(V_COMPASSION, -1);
2234 msg_format(_("%sを攻撃するのを止めた。", "You stop to avoid hitting %s."), m_name);
2241 /* Handle player fear */
2245 msg_format(_("恐くて%sを攻撃できない!", "You are too afraid to attack %s!"), m_name);
2247 msg_format(_("そっちには何か恐いものがいる!", "There is something scary in your way!"));
2249 /* Disturb the monster */
2250 (void)set_monster_csleep(g_ptr->m_idx, 0);
2255 if (MON_CSLEEP(m_ptr)) /* It is not honorable etc to attack helpless victims */
2257 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(V_COMPASSION, -1);
2258 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(V_HONOUR, -1);
2261 if (p_ptr->migite && p_ptr->hidarite)
2263 if ((p_ptr->skill_exp[GINOU_NITOURYU] < s_info[p_ptr->pclass].s_max[GINOU_NITOURYU]) && ((p_ptr->skill_exp[GINOU_NITOURYU] - 1000) / 200 < r_ptr->level))
2265 if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_BEGINNER)
2266 p_ptr->skill_exp[GINOU_NITOURYU] += 80;
2267 else if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_SKILLED)
2268 p_ptr->skill_exp[GINOU_NITOURYU] += 4;
2269 else if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_EXPERT)
2270 p_ptr->skill_exp[GINOU_NITOURYU] += 1;
2271 else if (p_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_MASTER)
2272 if (one_in_(3)) p_ptr->skill_exp[GINOU_NITOURYU] += 1;
2273 p_ptr->update |= (PU_BONUS);
2277 /* Gain riding experience */
2280 int cur = p_ptr->skill_exp[GINOU_RIDING];
2281 int max = s_info[p_ptr->pclass].s_max[GINOU_RIDING];
2285 DEPTH ridinglevel = r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].level;
2286 DEPTH targetlevel = r_ptr->level;
2289 if ((cur / 200 - 5) < targetlevel)
2292 /* Extra experience */
2293 if ((cur / 100) < ridinglevel)
2295 if ((cur / 100 + 15) < ridinglevel)
2296 inc += 1 + (ridinglevel - (cur / 100 + 15));
2301 p_ptr->skill_exp[GINOU_RIDING] = MIN(max, cur + inc);
2302 p_ptr->update |= (PU_BONUS);
2306 riding_t_m_idx = g_ptr->m_idx;
2307 if (p_ptr->migite) py_attack_aux(y, x, &fear, &mdeath, 0, mode);
2308 if (p_ptr->hidarite && !mdeath) py_attack_aux(y, x, &fear, &mdeath, 1, mode);
2310 /* Mutations which yield extra 'natural' attacks */
2313 if ((p_ptr->muta2 & MUT2_HORNS) && !mdeath)
2314 natural_attack(g_ptr->m_idx, MUT2_HORNS, &fear, &mdeath);
2315 if ((p_ptr->muta2 & MUT2_BEAK) && !mdeath)
2316 natural_attack(g_ptr->m_idx, MUT2_BEAK, &fear, &mdeath);
2317 if ((p_ptr->muta2 & MUT2_SCOR_TAIL) && !mdeath)
2318 natural_attack(g_ptr->m_idx, MUT2_SCOR_TAIL, &fear, &mdeath);
2319 if ((p_ptr->muta2 & MUT2_TRUNK) && !mdeath)
2320 natural_attack(g_ptr->m_idx, MUT2_TRUNK, &fear, &mdeath);
2321 if ((p_ptr->muta2 & MUT2_TENTACLES) && !mdeath)
2322 natural_attack(g_ptr->m_idx, MUT2_TENTACLES, &fear, &mdeath);
2325 /* Hack -- delay fear messages */
2326 if (fear && m_ptr->ml && !mdeath)
2330 msg_format(_("%^sは恐怖して逃げ出した!", "%^s flees in terror!"), m_name);
2333 if ((p_ptr->special_defense & KATA_IAI) && ((mode != HISSATSU_IAI) || mdeath))
2335 set_action(ACTION_NONE);
2342 * @brief モンスターからプレイヤーへの打撃処理 / Attack the player via physical attacks.
2343 * @param m_idx 打撃を行うモンスターのID
2344 * @return 実際に攻撃処理を行った場合TRUEを返す
2346 bool make_attack_normal(MONSTER_IDX m_idx)
2348 monster_type *m_ptr = ¤t_floor_ptr->m_list[m_idx];
2349 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2357 int do_cut, do_stun;
2361 GAME_TEXT o_name[MAX_NLEN];
2362 GAME_TEXT m_name[MAX_NLEN];
2363 GAME_TEXT ddesc[80];
2366 bool touched = FALSE, fear = FALSE, alive = TRUE;
2367 bool explode = FALSE;
2368 bool do_silly_attack = (one_in_(2) && p_ptr->image);
2369 HIT_POINT get_damage = 0;
2370 int abbreviate = 0; // 2回目以降の省略表現フラグ
2372 /* Not allowed to attack */
2373 if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return (FALSE);
2375 if (d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) return (FALSE);
2377 /* ...nor if friendly */
2378 if (!is_hostile(m_ptr)) return FALSE;
2380 /* Extract the effective monster level */
2381 rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
2383 /* Get the monster name (or "it") */
2384 monster_desc(m_name, m_ptr, 0);
2386 monster_desc(ddesc, m_ptr, MD_WRONGDOER_NAME);
2388 if (p_ptr->special_defense & KATA_IAI)
2390 msg_format(_("相手が襲いかかる前に素早く武器を振るった。", "You took sen, draw and cut in one motion before %s move."), m_name);
2391 if (py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_IAI)) return TRUE;
2394 if ((p_ptr->special_defense & NINJA_KAWARIMI) && (randint0(55) < (p_ptr->lev*3/5+20)))
2396 if (kawarimi(TRUE)) return TRUE;
2399 /* Assume no blink */
2402 /* Scan through all four blows */
2403 for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
2405 bool obvious = FALSE;
2407 HIT_POINT power = 0;
2408 HIT_POINT damage = 0;
2412 /* Extract the attack infomation */
2413 int effect = r_ptr->blow[ap_cnt].effect;
2414 int method = r_ptr->blow[ap_cnt].method;
2415 int d_dice = r_ptr->blow[ap_cnt].d_dice;
2416 int d_side = r_ptr->blow[ap_cnt].d_side;
2418 if (!monster_is_valid(m_ptr)) break;
2420 /* Hack -- no more attacks */
2423 if (is_pet(m_ptr) && (r_ptr->flags1 & RF1_UNIQUE) && (method == RBM_EXPLODE))
2429 /* Stop if player is dead or gone */
2430 if (!p_ptr->playing || p_ptr->is_dead) break;
2431 if (distance(p_ptr->y, p_ptr->x, m_ptr->fy, m_ptr->fx) > 1) break;
2433 /* Handle "leaving" */
2434 if (p_ptr->leaving) break;
2436 if (method == RBM_SHOOT) continue;
2438 /* Extract the attack "power" */
2439 power = mbe_info[effect].power;
2442 ac = p_ptr->ac + p_ptr->to_a;
2444 /* Monster hits player */
2445 if (!effect || check_hit(power, rlev, MON_STUNNED(m_ptr)))
2447 /* Always disturbing */
2448 disturb(TRUE, TRUE);
2451 /* Hack -- Apply "protection from evil" */
2452 if ((p_ptr->protevil > 0) &&
2453 (r_ptr->flags3 & RF3_EVIL) &&
2454 (p_ptr->lev >= rlev) &&
2455 ((randint0(100) + p_ptr->lev) > 50))
2457 /* Remember the Evil-ness */
2458 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_EVIL;
2461 if (abbreviate) msg_format("撃退した。");
2462 else msg_format("%^sは撃退された。", m_name);
2463 abbreviate = 1; /*2回目以降は省略 */
2465 msg_format("%^s is repelled.", m_name);
2469 /* Hack -- Next attack */
2474 /* Assume no cut or stun */
2475 do_cut = do_stun = 0;
2477 /* Describe the attack method */
2482 act = _("殴られた。", "hits you.");
2483 do_cut = do_stun = 1;
2491 act = _("触られた。", "touches you.");
2499 act = _("パンチされた。", "punches you.");
2508 act = _("蹴られた。", "kicks you.");
2517 act = _("ひっかかれた。", "claws you.");
2526 act = _("噛まれた。", "bites you.");
2535 act = _("刺された。", "stings you.");
2543 act = _("斬られた。", "slashes you.");
2552 act = _("角で突かれた。", "butts you.");
2561 act = _("体当たりされた。", "crushes you.");
2570 act = _("飲み込まれた。", "engulfs you.");
2579 act = _("は請求書をよこした。", "charges you.");
2581 sound(SOUND_BUY); /* Note! This is "charges", not "charges at". */
2588 act = _("が体の上を這い回った。", "crawls on you.");
2596 act = _("よだれをたらされた。", "drools on you.");
2603 act = _("唾を吐かれた。", "spits on you.");
2611 act = _("は爆発した。", "explodes.");
2618 act = _("にらまれた。", "gazes at you.");
2624 act = _("泣き叫ばれた。", "wails at you.");
2631 act = _("胞子を飛ばされた。", "releases spores at you.");
2639 act = _("が XXX4 を発射した。", "projects XXX4's at you.");
2645 act = _("金をせがまれた。", "begs you for money.");
2655 act = desc_insult[randint0(m_ptr->r_idx == MON_DEBBY ? 10 : 8)];
2665 act = desc_moan[randint0(4)];
2675 if (m_ptr->r_idx == MON_JAIAN)
2678 switch(randint1(15))
2683 act = "「♪お~れはジャイアン~~ガ~キだいしょう~」";
2686 act = "「♪て~んかむ~てきのお~とこだぜ~~」";
2689 act = "「♪の~び太スネ夫はメじゃないよ~~」";
2692 act = "「♪け~んかスポ~ツ~どんとこい~」";
2695 act = "「♪うた~も~~う~まいぜ~まかしとけ~」";
2698 act = "「♪ま~ちいちば~んのに~んきもの~~」";
2701 act = "「♪べんきょうしゅくだいメじゃないよ~~」";
2704 act = "「♪きはやさし~くて~ち~からもち~」";
2707 act = "「♪かお~も~~スタイルも~バツグンさ~」";
2710 act = "「♪がっこうい~ちの~あ~ばれんぼう~~」";
2713 act = "「♪ド~ラもドラミもメじゃないよ~~」";
2716 act = "「♪よじげんぽけっと~な~くたって~」";
2719 act = "「♪あし~の~~ながさ~は~まけないぜ~」";
2723 act = "horribly sings 'I AM GIAAAAAN. THE BOOOSS OF THE KIIIIDS.'";
2729 act = _("は♪僕らは楽しい家族♪と歌っている。", "sings 'We are a happy family.'");
2731 act = _("は♪アイ ラブ ユー、ユー ラブ ミー♪と歌っている。", "sings 'I love you, you love me.'");
2741 if (do_silly_attack)
2746 act = silly_attacks[randint0(MAX_SILLY_ATTACK)];
2749 if (abbreviate == 0)
2750 msg_format("%^sに%s", m_name, act);
2751 else if (abbreviate == 1)
2752 msg_format("%s", act);
2753 else /* if (abbreviate == -1) */
2754 msg_format("%^s%s", m_name, act);
2755 abbreviate = 1;/*2回目以降は省略 */
2757 msg_format("%^s %s%s", m_name, act, do_silly_attack ? " you." : "");
2761 /* Hack -- assume all attacks are obvious */
2764 /* Roll out the damage */
2765 damage = damroll(d_dice, d_side);
2768 * Skip the effect when exploding, since the explosion
2769 * already causes the effect.
2771 if(explode) damage = 0;
2772 /* Apply appropriate damage */
2782 case RBE_SUPERHURT: /* AC軽減あり / Player armor reduces total damage */
2784 if (((randint1(rlev*2+300) > (ac+200)) || one_in_(13)) && !CHECK_MULTISHADOW())
2786 int tmp_damage = damage - (damage * ((ac < 150) ? ac : 150) / 250);
2787 msg_print(_("痛恨の一撃!", "It was a critical hit!"));
2788 tmp_damage = MAX(damage, tmp_damage*2);
2790 get_damage += take_hit(DAMAGE_ATTACK, tmp_damage, ddesc, -1);
2794 case RBE_HURT: /* AC軽減あり / Player armor reduces total damage */
2797 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
2798 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2806 /* Take "poison" effect */
2807 if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()) && !CHECK_MULTISHADOW())
2809 if (set_poisoned(p_ptr->poisoned + randint1(rlev) + 5))
2815 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2817 /* Learn about the player */
2818 update_smart_learn(m_idx, DRS_POIS);
2827 /* Allow complete resist */
2828 if (!p_ptr->resist_disen && !CHECK_MULTISHADOW())
2830 /* Apply disenchantment */
2831 if (apply_disenchant(0))
2833 /* Hack -- Update AC */
2834 update_creature(p_ptr);
2839 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2841 /* Learn about the player */
2842 update_smart_learn(m_idx, DRS_DISEN);
2849 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2851 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2854 for (k = 0; k < 10; k++)
2857 i = (INVENTORY_IDX)randint0(INVEN_PACK);
2859 /* Obtain the item */
2860 o_ptr = &p_ptr->inventory_list[i];
2861 if (!o_ptr->k_idx) continue;
2863 /* Drain charged wands/staffs */
2864 if (((o_ptr->tval == TV_STAFF) ||
2865 (o_ptr->tval == TV_WAND)) &&
2868 /* Calculate healed hitpoints */
2869 int heal=rlev * o_ptr->pval;
2870 if( o_ptr->tval == TV_STAFF)
2871 heal *= o_ptr->number;
2873 /* Don't heal more than max hp */
2874 heal = MIN(heal, m_ptr->maxhp - m_ptr->hp);
2876 msg_print(_("ザックからエネルギーが吸い取られた!", "Energy drains from your pack!"));
2880 /* Heal the monster */
2881 m_ptr->hp += (HIT_POINT)heal;
2883 /* Redraw (later) if needed */
2884 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
2885 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
2890 /* Combine / Reorder the pack */
2891 p_ptr->update |= (PU_COMBINE | PU_REORDER);
2892 p_ptr->window |= (PW_INVEN);
2903 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2905 /* Confused monsters cannot steal successfully. -LM-*/
2906 if (MON_CONFUSED(m_ptr)) break;
2908 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2912 /* Saving throw (unless paralyzed) based on dex and level */
2913 if (!p_ptr->paralyzed &&
2914 (randint0(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
2917 /* Saving throw message */
2918 msg_print(_("しかし素早く財布を守った!", "You quickly protect your money pouch!"));
2920 /* Occasional blink anyway */
2921 if (randint0(3)) blinked = TRUE;
2927 gold = (p_ptr->au / 10) + randint1(25);
2928 if (gold < 2) gold = 2;
2929 if (gold > 5000) gold = (p_ptr->au / 20) + randint1(3000);
2930 if (gold > p_ptr->au) gold = p_ptr->au;
2934 msg_print(_("しかし何も盗まれなかった。", "Nothing was stolen."));
2938 msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2939 msg_format(_("$%ld のお金が盗まれた!", "%ld coins were stolen!"), (long)gold);
2940 chg_virtue(V_SACRIFICE, 1);
2944 msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2945 msg_print(_("お金が全部盗まれた!", "All of your coins were stolen!"));
2946 chg_virtue(V_SACRIFICE, 2);
2950 p_ptr->redraw |= (PR_GOLD);
2952 p_ptr->window |= (PW_PLAYER);
2963 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
2965 /* Confused monsters cannot steal successfully. -LM-*/
2966 if (MON_CONFUSED(m_ptr)) break;
2968 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
2970 /* Saving throw (unless paralyzed) based on dex and level */
2971 if (!p_ptr->paralyzed &&
2972 (randint0(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] +
2975 /* Saving throw message */
2976 msg_print(_("しかしあわててザックを取り返した!", "You grab hold of your backpack!"));
2978 /* Occasional "blink" anyway */
2985 for (k = 0; k < 10; k++)
2990 i = (INVENTORY_IDX)randint0(INVEN_PACK);
2992 /* Obtain the item */
2993 o_ptr = &p_ptr->inventory_list[i];
2994 if (!o_ptr->k_idx) continue;
2996 /* Skip artifacts */
2997 if (object_is_artifact(o_ptr)) continue;
2999 object_desc(o_name, o_ptr, OD_OMIT_PREFIX);
3002 msg_format("%s(%c)を%s盗まれた!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
3004 msg_format("%sour %s (%c) was stolen!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
3006 chg_virtue(V_SACRIFICE, 1);
3013 j_ptr = ¤t_floor_ptr->o_list[o_idx];
3014 object_copy(j_ptr, o_ptr);
3019 /* Hack -- If a rod or wand, allocate total
3020 * maximum timeouts or charges between those
3021 * stolen and those missed. -LM-
3023 if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
3025 j_ptr->pval = o_ptr->pval / o_ptr->number;
3026 o_ptr->pval -= j_ptr->pval;
3030 j_ptr->marked = OM_TOUCHED;
3032 /* Memorize monster */
3033 j_ptr->held_m_idx = m_idx;
3036 j_ptr->next_o_idx = m_ptr->hold_o_idx;
3039 m_ptr->hold_o_idx = o_idx;
3042 /* Steal the items */
3043 inven_item_increase(i, -1);
3044 inven_item_optimize(i);
3059 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3061 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3063 /* Steal some food */
3064 for (k = 0; k < 10; k++)
3066 /* Pick an item from the pack */
3067 i = (INVENTORY_IDX)randint0(INVEN_PACK);
3069 o_ptr = &p_ptr->inventory_list[i];
3070 if (!o_ptr->k_idx) continue;
3072 /* Skip non-food objects */
3073 if ((o_ptr->tval != TV_FOOD) && !((o_ptr->tval == TV_CORPSE) && (o_ptr->sval))) continue;
3075 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
3078 msg_format("%s(%c)を%s食べられてしまった!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
3080 msg_format("%sour %s (%c) was eaten!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
3083 /* Steal the items */
3084 inven_item_increase(i, -1);
3085 inven_item_optimize(i);
3097 /* Access the lite */
3098 o_ptr = &p_ptr->inventory_list[INVEN_LITE];
3099 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3101 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3104 if ((o_ptr->xtra4 > 0) && (!object_is_fixed_artifact(o_ptr)))
3107 o_ptr->xtra4 -= (s16b)(250 + randint1(250));
3108 if (o_ptr->xtra4 < 1) o_ptr->xtra4 = 1;
3112 msg_print(_("明かりが暗くなってしまった。", "Your light dims."));
3116 p_ptr->window |= (PW_EQUIP);
3126 msg_print(_("酸を浴びせられた!", "You are covered in acid!"));
3127 get_damage += acid_dam(damage, ddesc, -1, FALSE);
3128 update_creature(p_ptr);
3129 update_smart_learn(m_idx, DRS_ACID);
3137 msg_print(_("電撃を浴びせられた!", "You are struck by electricity!"));
3138 get_damage += elec_dam(damage, ddesc, -1, FALSE);
3139 update_smart_learn(m_idx, DRS_ELEC);
3147 msg_print(_("全身が炎に包まれた!", "You are enveloped in flames!"));
3148 get_damage += fire_dam(damage, ddesc, -1, FALSE);
3149 update_smart_learn(m_idx, DRS_FIRE);
3157 msg_print(_("全身が冷気で覆われた!", "You are covered with frost!"));
3158 get_damage += cold_dam(damage, ddesc, -1, FALSE);
3159 update_smart_learn(m_idx, DRS_COLD);
3165 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3166 if (p_ptr->is_dead) break;
3168 /* Increase "blind" */
3169 if (!p_ptr->resist_blind && !CHECK_MULTISHADOW())
3171 if (set_blind(p_ptr->blind + 10 + randint1(rlev)))
3174 if (m_ptr->r_idx == MON_DIO) msg_print("どうだッ!この血の目潰しはッ!");
3182 /* Learn about the player */
3183 update_smart_learn(m_idx, DRS_BLIND);
3191 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3193 if (p_ptr->is_dead) break;
3195 /* Increase "confused" */
3196 if (!p_ptr->resist_conf && !CHECK_MULTISHADOW())
3198 if (set_confused(p_ptr->confused + 3 + randint1(rlev)))
3204 /* Learn about the player */
3205 update_smart_learn(m_idx, DRS_CONF);
3212 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3214 if (p_ptr->is_dead) break;
3216 /* Increase "afraid" */
3217 if (CHECK_MULTISHADOW())
3221 else if (p_ptr->resist_fear)
3223 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
3226 else if (randint0(100 + r_ptr->level/2) < p_ptr->skill_sav)
3228 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
3233 if (set_afraid(p_ptr->afraid + 3 + randint1(rlev)))
3239 /* Learn about the player */
3240 update_smart_learn(m_idx, DRS_FEAR);
3247 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3249 if (p_ptr->is_dead) break;
3251 /* Increase "paralyzed" */
3252 if (CHECK_MULTISHADOW())
3256 else if (p_ptr->free_act)
3258 msg_print(_("しかし効果がなかった!", "You are unaffected!"));
3261 else if (randint0(100 + r_ptr->level/2) < p_ptr->skill_sav)
3263 msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
3268 if (!p_ptr->paralyzed)
3270 if (set_paralyzed(3 + randint1(rlev)))
3277 /* Learn about the player */
3278 update_smart_learn(m_idx, DRS_FREE);
3285 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3287 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3288 if (do_dec_stat(A_STR)) obvious = TRUE;
3295 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3297 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3298 if (do_dec_stat(A_INT)) obvious = TRUE;
3305 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3307 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3308 if (do_dec_stat(A_WIS)) obvious = TRUE;
3315 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3317 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3318 if (do_dec_stat(A_DEX)) obvious = TRUE;
3325 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3327 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3328 if (do_dec_stat(A_CON)) obvious = TRUE;
3335 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3337 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3338 if (do_dec_stat(A_CHR)) obvious = TRUE;
3345 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3347 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3349 /* Damage (stats) */
3350 if (do_dec_stat(A_STR)) obvious = TRUE;
3351 if (do_dec_stat(A_DEX)) obvious = TRUE;
3352 if (do_dec_stat(A_CON)) obvious = TRUE;
3353 if (do_dec_stat(A_INT)) obvious = TRUE;
3354 if (do_dec_stat(A_WIS)) obvious = TRUE;
3355 if (do_dec_stat(A_CHR)) obvious = TRUE;
3364 /* Hack -- Reduce damage based on the player armor class */
3365 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
3367 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3369 /* Radius 8 earthquake centered at the monster */
3370 if (damage > 23 || explode)
3372 earthquake_aux(m_ptr->fy, m_ptr->fx, 8, m_idx);
3380 s32b d = damroll(10, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3384 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3386 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3388 (void)drain_exp(d, d / 10, 95);
3394 s32b d = damroll(20, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3398 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3400 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3402 (void)drain_exp(d, d / 10, 90);
3408 s32b d = damroll(40, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3412 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3414 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3416 (void)drain_exp(d, d / 10, 75);
3422 s32b d = damroll(80, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3426 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3428 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3430 (void)drain_exp(d, d / 10, 50);
3436 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3438 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3440 /* Take "poison" effect */
3441 if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()))
3443 if (set_poisoned(p_ptr->poisoned + randint1(rlev) + 5))
3449 /* Damage CON (10% chance)*/
3450 if ((randint1(100) < 11) && (p_ptr->prace != RACE_ANDROID))
3452 /* 1% chance for perm. damage */
3453 bool perm = one_in_(10);
3454 if (dec_stat(A_CON, randint1(10), perm))
3456 msg_print(_("病があなたを蝕んでいる気がする。", "You feel strange sickness."));
3466 if (!p_ptr->resist_time && !CHECK_MULTISHADOW())
3468 switch (randint1(10))
3470 case 1: case 2: case 3: case 4: case 5:
3472 if (p_ptr->prace == RACE_ANDROID) break;
3473 msg_print(_("人生が逆戻りした気がする。", "You feel life has clocked back."));
3474 lose_exp(100 + (p_ptr->exp / 100) * MON_DRAIN_LIFE);
3478 case 6: case 7: case 8: case 9:
3480 int stat = randint0(6);
3485 case A_STR: act = "強く"; break;
3486 case A_INT: act = "聡明で"; break;
3487 case A_WIS: act = "賢明で"; break;
3488 case A_DEX: act = "器用で"; break;
3489 case A_CON: act = "健康で"; break;
3490 case A_CHR: act = "美しく"; break;
3492 case A_STR: act = "strong"; break;
3493 case A_INT: act = "bright"; break;
3494 case A_WIS: act = "wise"; break;
3495 case A_DEX: act = "agile"; break;
3496 case A_CON: act = "hale"; break;
3497 case A_CHR: act = "beautiful"; break;
3502 msg_format(_("あなたは以前ほど%sなくなってしまった...。", "You're not as %s as you used to be..."), act);
3503 p_ptr->stat_cur[stat] = (p_ptr->stat_cur[stat] * 3) / 4;
3504 if (p_ptr->stat_cur[stat] < 3) p_ptr->stat_cur[stat] = 3;
3505 p_ptr->update |= (PU_BONUS);
3511 msg_print(_("あなたは以前ほど力強くなくなってしまった...。", "You're not as powerful as you used to be..."));
3513 for (k = 0; k < A_MAX; k++)
3515 p_ptr->stat_cur[k] = (p_ptr->stat_cur[k] * 7) / 8;
3516 if (p_ptr->stat_cur[k] < 3) p_ptr->stat_cur[k] = 3;
3518 p_ptr->update |= (PU_BONUS);
3523 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3529 s32b d = damroll(60, 6) + (p_ptr->exp / 100) * MON_DRAIN_LIFE;
3534 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3536 if (p_ptr->is_dead || CHECK_MULTISHADOW()) break;
3538 resist_drain = !drain_exp(d, d / 10, 50);
3540 /* Heal the attacker? */
3541 if (p_ptr->mimic_form)
3543 if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
3544 resist_drain = TRUE;
3548 switch (p_ptr->prace)
3557 resist_drain = TRUE;
3562 if ((damage > 5) && !resist_drain)
3564 bool did_heal = FALSE;
3566 if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
3569 m_ptr->hp += damroll(4, damage / 6);
3570 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
3572 /* Redraw (later) if needed */
3573 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
3574 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
3576 /* Special message */
3577 if (m_ptr->ml && did_heal)
3579 msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), m_name);
3589 if (CHECK_MULTISHADOW())
3591 msg_print(_("攻撃は幻影に命中し、あなたには届かなかった。", "The attack hits Shadow, you are unharmed!"));
3597 p_ptr->csp -= damage;
3601 p_ptr->csp_frac = 0;
3604 p_ptr->redraw |= (PR_MANA);
3607 /* Learn about the player */
3608 update_smart_learn(m_idx, DRS_MANA);
3614 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3616 if (p_ptr->is_dead) break;
3618 /* Decrease speed */
3619 if (CHECK_MULTISHADOW())
3625 if (set_slow((p_ptr->slow + 4 + randint0(rlev / 10)), FALSE))
3635 get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
3637 if (p_ptr->is_dead) break;
3639 /* Decrease speed */
3640 if (p_ptr->resist_sound || CHECK_MULTISHADOW())
3646 if (set_stun(p_ptr->stun + 10 + randint1(r_ptr->level / 4)))
3656 /* Hack -- only one of cut or stun */
3657 if (do_cut && do_stun)
3660 if (randint0(100) < 50)
3677 /* Critical hit (zero if non-critical) */
3678 tmp = monster_critical(d_dice, d_side, damage);
3680 /* Roll for damage */
3683 case 0: cut_plus = 0; break;
3684 case 1: cut_plus = randint1(5); break;
3685 case 2: cut_plus = randint1(5) + 5; break;
3686 case 3: cut_plus = randint1(20) + 20; break;
3687 case 4: cut_plus = randint1(50) + 50; break;
3688 case 5: cut_plus = randint1(100) + 100; break;
3689 case 6: cut_plus = 300; break;
3690 default: cut_plus = 500; break;
3694 if (cut_plus) (void)set_cut(p_ptr->cut + cut_plus);
3702 /* Critical hit (zero if non-critical) */
3703 tmp = monster_critical(d_dice, d_side, damage);
3705 /* Roll for damage */
3708 case 0: stun_plus = 0; break;
3709 case 1: stun_plus = randint1(5); break;
3710 case 2: stun_plus = randint1(5) + 10; break;
3711 case 3: stun_plus = randint1(10) + 20; break;
3712 case 4: stun_plus = randint1(15) + 30; break;
3713 case 5: stun_plus = randint1(20) + 40; break;
3714 case 6: stun_plus = 80; break;
3715 default: stun_plus = 150; break;
3718 /* Apply the stun */
3719 if (stun_plus) (void)set_stun(p_ptr->stun + stun_plus);
3724 sound(SOUND_EXPLODE);
3726 if (mon_take_hit(m_idx, m_ptr->hp + 1, &fear, NULL))
3735 if (p_ptr->sh_fire && alive && !p_ptr->is_dead)
3737 if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK))
3739 HIT_POINT dam = damroll(2, 6);
3741 /* Modify the damage */
3742 dam = mon_damage_mod(m_ptr, dam, FALSE);
3744 msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), m_name);
3746 if (mon_take_hit(m_idx, dam, &fear, _("は灰の山になった。", " turns into a pile of ash.")))
3754 if (is_original_ap_and_seen(m_ptr))
3755 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
3759 if (p_ptr->sh_elec && alive && !p_ptr->is_dead)
3761 if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK))
3763 HIT_POINT dam = damroll(2, 6);
3765 /* Modify the damage */
3766 dam = mon_damage_mod(m_ptr, dam, FALSE);
3768 msg_format(_("%^sは電撃をくらった!", "%^s gets zapped!"), m_name);
3769 if (mon_take_hit(m_idx, dam, &fear, _("は燃え殻の山になった。", " turns into a pile of cinder.")))
3777 if (is_original_ap_and_seen(m_ptr))
3778 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
3782 if (p_ptr->sh_cold && alive && !p_ptr->is_dead)
3784 if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK))
3786 HIT_POINT dam = damroll(2, 6);
3788 /* Modify the damage */
3789 dam = mon_damage_mod(m_ptr, dam, FALSE);
3791 msg_format(_("%^sは冷気をくらった!", "%^s is very cold!"), m_name);
3792 if (mon_take_hit(m_idx, dam, &fear, _("は凍りついた。", " was frozen.")))
3800 if (is_original_ap_and_seen(m_ptr))
3801 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
3806 if (p_ptr->dustrobe && alive && !p_ptr->is_dead)
3808 if (!(r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK))
3810 HIT_POINT dam = damroll(2, 6);
3812 /* Modify the damage */
3813 dam = mon_damage_mod(m_ptr, dam, FALSE);
3815 msg_format(_("%^sは鏡の破片をくらった!", "%^s gets zapped!"), m_name);
3816 if (mon_take_hit(m_idx, dam, &fear, _("はズタズタになった。", " had torn to pieces.")))
3824 if (is_original_ap_and_seen(m_ptr))
3825 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK);
3828 if (is_mirror_grid(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x]))
3830 teleport_player(10, 0L);
3834 if (p_ptr->tim_sh_holy && alive && !p_ptr->is_dead)
3836 if (r_ptr->flags3 & RF3_EVIL)
3838 if (!(r_ptr->flagsr & RFR_RES_ALL))
3840 HIT_POINT dam = damroll(2, 6);
3842 /* Modify the damage */
3843 dam = mon_damage_mod(m_ptr, dam, FALSE);
3845 msg_format(_("%^sは聖なるオーラで傷ついた!", "%^s is injured by holy power!"), m_name);
3846 if (mon_take_hit(m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3851 if (is_original_ap_and_seen(m_ptr))
3852 r_ptr->r_flags3 |= RF3_EVIL;
3856 if (is_original_ap_and_seen(m_ptr))
3857 r_ptr->r_flagsr |= RFR_RES_ALL;
3862 if (p_ptr->tim_sh_touki && alive && !p_ptr->is_dead)
3864 if (!(r_ptr->flagsr & RFR_RES_ALL))
3866 HIT_POINT dam = damroll(2, 6);
3868 /* Modify the damage */
3869 dam = mon_damage_mod(m_ptr, dam, FALSE);
3871 msg_format(_("%^sが鋭い闘気のオーラで傷ついた!", "%^s is injured by the Force"), m_name);
3872 if (mon_take_hit(m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3880 if (is_original_ap_and_seen(m_ptr))
3881 r_ptr->r_flagsr |= RFR_RES_ALL;
3885 if (hex_spelling(HEX_SHADOW_CLOAK) && alive && !p_ptr->is_dead)
3888 object_type *o_armed_ptr = &p_ptr->inventory_list[INVEN_RARM];
3890 if (!(r_ptr->flagsr & RFR_RES_ALL || r_ptr->flagsr & RFR_RES_DARK))
3892 if (o_armed_ptr->k_idx)
3894 int basedam = ((o_armed_ptr->dd + p_ptr->to_dd[0]) * (o_armed_ptr->ds + p_ptr->to_ds[0] + 1));
3895 dam = basedam / 2 + o_armed_ptr->to_d + p_ptr->to_d[0];
3898 /* Cursed armor makes damages doubled */
3899 o_armed_ptr = &p_ptr->inventory_list[INVEN_BODY];
3900 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr)) dam *= 2;
3902 /* Modify the damage */
3903 dam = mon_damage_mod(m_ptr, dam, FALSE);
3905 msg_format(_("影のオーラが%^sに反撃した!", "Enveloped shadows attack %^s."), m_name);
3906 if (mon_take_hit(m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3911 else /* monster does not dead */
3914 BIT_FLAGS flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
3915 EFFECT_ID typ[4][2] = {
3916 { INVEN_HEAD, GF_OLD_CONF },
3917 { INVEN_LARM, GF_OLD_SLEEP },
3918 { INVEN_HANDS, GF_TURN_ALL },
3919 { INVEN_FEET, GF_OLD_SLOW }
3922 /* Some cursed armours gives an extra effect */
3923 for (j = 0; j < 4; j++)
3925 o_armed_ptr = &p_ptr->inventory_list[typ[j][0]];
3926 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr) && object_is_armour(o_armed_ptr))
3927 project(0, 0, m_ptr->fy, m_ptr->fx, (p_ptr->lev * 2), typ[j][1], flg, -1);
3933 if (is_original_ap_and_seen(m_ptr))
3934 r_ptr->r_flagsr |= (RFR_RES_ALL | RFR_RES_DARK);
3940 /* Monster missed player */
3943 /* Analyze failed attacks */
3959 /* Visible monsters */
3962 disturb(TRUE, TRUE);
3966 msg_format("%sかわした。", (p_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "");
3968 msg_format("%s%^sの攻撃をかわした。", (p_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "", m_name);
3969 abbreviate = 1;/*2回目以降は省略 */
3971 msg_format("%^s misses you.", m_name);
3976 /* Gain shield experience */
3977 if (object_is_armour(&p_ptr->inventory_list[INVEN_RARM]) || object_is_armour(&p_ptr->inventory_list[INVEN_LARM]))
3979 int cur = p_ptr->skill_exp[GINOU_SHIELD];
3980 int max = s_info[p_ptr->pclass].s_max[GINOU_SHIELD];
3984 DEPTH targetlevel = r_ptr->level;
3988 /* Extra experience */
3989 if ((cur / 100) < targetlevel)
3991 if ((cur / 100 + 15) < targetlevel)
3992 inc += 1 + (targetlevel - (cur / 100 + 15));
3997 p_ptr->skill_exp[GINOU_SHIELD] = MIN(max, cur + inc);
3998 p_ptr->update |= (PU_BONUS);
4009 /* Analyze "visible" monsters only */
4010 if (is_original_ap_and_seen(m_ptr) && !do_silly_attack)
4012 /* Count "obvious" attacks (and ones that cause damage) */
4013 if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
4015 /* Count attacks of this type */
4016 if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
4018 r_ptr->r_blows[ap_cnt]++;
4023 if (p_ptr->riding && damage)
4025 char m_steed_name[MAX_NLEN];
4026 monster_desc(m_steed_name, ¤t_floor_ptr->m_list[p_ptr->riding], 0);
4027 if (rakuba((damage > 200) ? 200 : damage, FALSE))
4029 msg_format(_("%^sから落ちてしまった!", "You have fallen from %s."), m_steed_name);
4033 if (p_ptr->special_defense & NINJA_KAWARIMI)
4035 if (kawarimi(FALSE)) return TRUE;
4039 /* Hex - revenge damage stored */
4040 revenge_store(get_damage);
4042 if ((p_ptr->tim_eyeeye || hex_spelling(HEX_EYE_FOR_EYE))
4043 && get_damage > 0 && !p_ptr->is_dead)
4046 msg_format("攻撃が%s自身を傷つけた!", m_name);
4048 GAME_TEXT m_name_self[80];
4051 monster_desc(m_name_self, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE);
4053 msg_format("The attack of %s has wounded %s!", m_name, m_name_self);
4055 project(0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL, -1);
4056 if (p_ptr->tim_eyeeye) set_tim_eyeeye(p_ptr->tim_eyeeye-5, TRUE);
4059 if ((p_ptr->counter || (p_ptr->special_defense & KATA_MUSOU)) && alive && !p_ptr->is_dead && m_ptr->ml && (p_ptr->csp > 7))
4061 char m_target_name[MAX_NLEN];
4062 monster_desc(m_target_name, m_ptr, 0);
4065 msg_format(_("%^sに反撃した!", "Your counterattack to %s!"), m_target_name);
4066 py_attack(m_ptr->fy, m_ptr->fx, HISSATSU_COUNTER);
4068 p_ptr->redraw |= (PR_MANA);
4072 if (blinked && alive && !p_ptr->is_dead)
4074 if (teleport_barrier(m_idx))
4076 msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But magic barrier obstructs it."));
4080 msg_print(_("泥棒は笑って逃げた!", "The thief flees laughing!"));
4081 teleport_away(m_idx, MAX_SIGHT * 2 + 5, 0L);
4086 /* Always notice cause of death */
4087 if (p_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !p_ptr->inside_arena)
4092 if (m_ptr->ml && fear && alive && !p_ptr->is_dead)
4095 msg_format(_("%^sは恐怖で逃げ出した!", "%^s flees in terror!"), m_name);
4098 if (p_ptr->special_defense & KATA_IAI)
4100 set_action(ACTION_NONE);
4103 /* Assume we attacked */
4109 * @brief モンスターが敵モンスターに行う打撃処理 /
4110 * Hack, based on mon_take_hit... perhaps all monster attacks on other monsters should use this?
4111 * @param m_idx 目標となるモンスターの参照ID
4113 * @param dead 目標となったモンスターの死亡状態を返す参照ポインタ
4114 * @param fear 目標となったモンスターの恐慌状態を返す参照ポインタ
4115 * @param note 目標モンスターが死亡した場合の特別メッセージ(NULLならば標準表示を行う)
4116 * @param who 打撃を行ったモンスターの参照ID
4119 void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *dead, bool *fear, concptr note, MONSTER_IDX who)
4121 monster_type *m_ptr = ¤t_floor_ptr->m_list[m_idx];
4122 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4123 GAME_TEXT m_name[160];
4124 bool seen = is_seen(m_ptr);
4126 /* Can the player be aware of this attack? */
4127 bool known = (m_ptr->cdis <= MAX_SIGHT);
4129 /* Extract monster name */
4130 monster_desc(m_name, m_ptr, 0);
4132 /* Redraw (later) if needed */
4135 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
4136 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
4139 (void)set_monster_csleep(m_idx, 0);
4141 if (p_ptr->riding && (m_idx == p_ptr->riding)) disturb(TRUE, TRUE);
4143 if (MON_INVULNER(m_ptr) && randint0(PENETRATE_INVULNERABILITY))
4147 msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
4152 if (r_ptr->flagsr & RFR_RES_ALL)
4157 if ((dam == 0) && one_in_(3)) dam = 1;
4163 msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
4172 /* It is dead now... or is it? */
4175 if (((r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) ||
4176 (r_ptr->flags7 & RF7_NAZGUL)) &&
4177 !p_ptr->inside_battle)
4184 if (!monster_living(m_ptr->r_idx))
4186 sound(SOUND_N_KILL);
4197 monster_desc(m_name, m_ptr, MD_TRUE_NAME);
4198 /* Unseen death by normal attack */
4201 current_floor_ptr->monster_noise = TRUE;
4203 /* Death by special attack */
4206 msg_format(_("%^s%s", "%^s%s"), m_name, note);
4208 /* Death by normal attack -- nonliving monster */
4209 else if (!monster_living(m_ptr->r_idx))
4211 msg_format(_("%^sは破壊された。", "%^s is destroyed."), m_name);
4213 /* Death by normal attack -- living monster */
4216 msg_format(_("%^sは殺された。", "%^s is killed."), m_name);
4220 monster_gain_exp(who, m_ptr->r_idx);
4221 monster_death(m_idx, FALSE);
4222 delete_monster_idx(m_idx);
4227 /* Monster is dead */
4236 /* Mega-Hack -- Pain cancels fear */
4237 if (MON_MONFEAR(m_ptr) && (dam > 0))
4240 if (set_monster_monfear(m_idx, MON_MONFEAR(m_ptr) - randint1(dam / 4)))
4247 /* Sometimes a monster gets scared by damage */
4248 if (!MON_MONFEAR(m_ptr) && !(r_ptr->flags3 & RF3_NO_FEAR))
4250 /* Percentage of fully healthy */
4251 int percentage = (100L * m_ptr->hp) / m_ptr->maxhp;
4254 * Run (sometimes) if at 10% or less of max hit points,
4255 * or (usually) when hit for half its current hit points
4257 if (((percentage <= 10) && (randint0(10) < percentage)) ||
4258 ((dam >= m_ptr->hp) && (randint0(100) < 80)))
4260 /* Hack -- note fear */
4263 /* Hack -- Add some timed fear */
4264 (void)set_monster_monfear(m_idx, (randint1(10) +
4265 (((dam >= m_ptr->hp) && (percentage > 7)) ?
4266 20 : ((11 - percentage) * 5))));
4270 #endif /* ALLOW_FEAR */
4272 if ((dam > 0) && !is_pet(m_ptr) && !is_friendly(m_ptr) && (who != m_idx))
4274 if (is_pet(¤t_floor_ptr->m_list[who]) && !player_bold(m_ptr->target_y, m_ptr->target_x))
4276 set_target(m_ptr, current_floor_ptr->m_list[who].fy, current_floor_ptr->m_list[who].fx);
4280 if (p_ptr->riding && (p_ptr->riding == m_idx) && (dam > 0))
4282 /* Extract monster name */
4283 monster_desc(m_name, m_ptr, 0);
4285 if (m_ptr->hp > m_ptr->maxhp / 3) dam = (dam + 1) / 2;
4286 if (rakuba((dam > 200) ? 200 : dam, FALSE))
4288 msg_format(_("%^sに振り落とされた!", "You have thrown off from %s!"), m_name);