3 * @brief 打撃処理 / Melee process.
6 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke\n
7 * This software may be copied and distributed for educational, research,\n
8 * and not for profit purposes provided that this copyright and statement\n
9 * are included in all such copies. Other copyrights may also apply.\n
10 * 2014 Deskull rearranged comment for Doxygen.\n
20 #include "monsterrace-hook.h"
23 #include "monster-status.h"
24 #include "monster-spell.h"
26 #include "realm-hex.h"
27 #include "realm-song.h"
28 #include "object-flavor.h"
29 #include "object-hook.h"
36 #include "player-move.h"
37 #include "player-effects.h"
38 #include "player-skill.h"
39 #include "player-damage.h"
40 #include "player-status.h"
41 #include "player-race.h"
42 #include "player-class.h"
43 #include "player-personality.h"
44 #include "view-mainwindow.h"
46 #include "spells-floor.h"
50 * @brief モンスターの打撃効力テーブル /
51 * The table of monsters' blow effects
53 const mbe_info_type mbe_info[] =
56 { 60, GF_MISSILE, }, /* HURT */
57 { 5, GF_POIS, }, /* POISON */
58 { 20, GF_DISENCHANT, }, /* UN_BONUS */
59 { 15, GF_MISSILE, }, /* UN_POWER */ /* ToDo: Apply the correct effects */
60 { 5, GF_MISSILE, }, /* EAT_GOLD */
61 { 5, GF_MISSILE, }, /* EAT_ITEM */
62 { 5, GF_MISSILE, }, /* EAT_FOOD */
63 { 5, GF_MISSILE, }, /* EAT_LITE */
64 { 0, GF_ACID, }, /* ACID */
65 { 10, GF_ELEC, }, /* ELEC */
66 { 10, GF_FIRE, }, /* FIRE */
67 { 10, GF_COLD, }, /* COLD */
68 { 2, GF_MISSILE, }, /* BLIND */
69 { 10, GF_CONFUSION, }, /* CONFUSE */
70 { 10, GF_MISSILE, }, /* TERRIFY */
71 { 2, GF_MISSILE, }, /* PARALYZE */
72 { 0, GF_MISSILE, }, /* LOSE_STR */
73 { 0, GF_MISSILE, }, /* LOSE_INT */
74 { 0, GF_MISSILE, }, /* LOSE_WIS */
75 { 0, GF_MISSILE, }, /* LOSE_DEX */
76 { 0, GF_MISSILE, }, /* LOSE_CON */
77 { 0, GF_MISSILE, }, /* LOSE_CHR */
78 { 2, GF_MISSILE, }, /* LOSE_ALL */
79 { 60, GF_ROCKET, }, /* SHATTER */
80 { 5, GF_MISSILE, }, /* EXP_10 */
81 { 5, GF_MISSILE, }, /* EXP_20 */
82 { 5, GF_MISSILE, }, /* EXP_40 */
83 { 5, GF_MISSILE, }, /* EXP_80 */
84 { 5, GF_POIS, }, /* DISEASE */
85 { 5, GF_TIME, }, /* TIME */
86 { 5, GF_MISSILE, }, /* EXP_VAMP */
87 { 5, GF_MANA, }, /* DR_MANA */
88 { 60, GF_MISSILE, }, /* SUPERHURT */
92 * @brief 幻覚時の打撃記述テーブル / Weird melee attack types when hallucinating
95 const concptr silly_attacks[MAX_SILLY_ATTACK] =
98 "があなたの回りを3回回ってワンと言った。",
106 "に「神の国」発言の撤回を求められた。",
117 "はあなたの100の秘密について熱く語った。",
129 "に二週間以内でビデオを人に見せないと死ぬ呪いをかけられた。",
131 "はスーパーウルトラギャラクティカマグナムを放った。",
133 "にジェットストリームアタックをかけられた。",
134 "はあなたに卍固めをかけて「1、2、3、ダーッ!」と叫んだ。",
135 "は「いくじなし!ばかばかばか!」といって駆け出した。",
136 "が「ごらん、ルーベンスの絵だよ」と言って静かに目を閉じた。",
137 "は言った。「変愚蛮怒、絶賛公開中!」",
141 * @brief 幻覚時の打撃記述テーブル(フォーマットつき) / Weird melee attack types when hallucinating (%s for strfmt())
143 const concptr silly_attacks2[MAX_SILLY_ATTACK] =
146 "%sの回りを3回回ってワンと言った。",
154 "%sに「神の国」発言の撤回を求めた。",
165 "%sの100の秘密について熱く語った。",
177 "%sに二週間以内でビデオを人に見せないと死ぬ呪いをかけた。",
179 "%sにスーパーウルトラギャラクティカマグナムを放った。",
181 "%sにジェットストリームアタックをかけた。",
182 "%sに卍固めをかけて「1、2、3、ダーッ!」と叫んだ。",
183 "「いくじなし!ばかばかばか!」といって駆け出した。",
184 "「ごらん、ルーベンスの絵だよ」と言って静かに目を閉じた。",
188 const concptr silly_attacks[MAX_SILLY_ATTACK] =
199 "makes obscene gestures at",
230 * @brief マーシャルアーツ打撃テーブル
232 const martial_arts ma_blows[MAX_MA] =
235 { "%sを殴った。", 1, 0, 1, 5, 0 },
236 { "%sを蹴った。", 2, 0, 1, 7, 0 },
237 { "%sに正拳突きをくらわした。", 3, 0, 1, 9, 0 },
238 { "%sに膝蹴りをくらわした。", 5, 5, 2, 4, MA_KNEE },
239 { "%sに肘打ちをくらわした。", 7, 5, 1, 12, 0 },
240 { "%sに体当りした。", 9, 10, 2, 6, 0 },
241 { "%sを蹴った。", 11, 10, 3, 6, MA_SLOW },
242 { "%sにアッパーをくらわした。", 13, 12, 5, 5, 6 },
243 { "%sに二段蹴りをくらわした。", 16, 15, 5, 6, 8 },
244 { "%sに猫爪撃をくらわした。", 20, 20, 5, 8, 0 },
245 { "%sに跳空脚をくらわした。", 24, 25, 6, 8, 10 },
246 { "%sに鷲爪襲をくらわした。", 28, 25, 7, 9, 0 },
247 { "%sに回し蹴りをくらわした。", 32, 30, 8, 10, 10 },
248 { "%sに鉄拳撃をくらわした。", 35, 35, 8, 11, 10 },
249 { "%sに飛空脚をくらわした。", 39, 35, 8, 12, 12 },
250 { "%sに昇龍拳をくらわした。", 43, 35, 9, 12, 16 },
251 { "%sに石破天驚拳をくらわした。", 48, 40, 10, 13, 18 },
253 { "You punch %s.", 1, 0, 1, 4, 0 },
254 { "You kick %s.", 2, 0, 1, 6, 0 },
255 { "You strike %s.", 3, 0, 1, 7, 0 },
256 { "You hit %s with your knee.", 5, 5, 2, 3, MA_KNEE },
257 { "You hit %s with your elbow.", 7, 5, 1, 8, 0 },
258 { "You butt %s.", 9, 10, 2, 5, 0 },
259 { "You kick %s.", 11, 10, 3, 4, MA_SLOW },
260 { "You uppercut %s.", 13, 12, 4, 4, 6 },
261 { "You double-kick %s.", 16, 15, 5, 4, 8 },
262 { "You hit %s with a Cat's Claw.", 20, 20, 5, 5, 0 },
263 { "You hit %s with a jump kick.", 25, 25, 5, 6, 10 },
264 { "You hit %s with an Eagle's Claw.", 29, 25, 6, 6, 0 },
265 { "You hit %s with a circle kick.", 33, 30, 6, 8, 10 },
266 { "You hit %s with an Iron Fist.", 37, 35, 8, 8, 10 },
267 { "You hit %s with a flying kick.", 41, 35, 8, 10, 12 },
268 { "You hit %s with a Dragon Fist.", 45, 35, 10, 10, 16 },
269 { "You hit %s with a Crushing Blow.", 48, 35, 10, 12, 18 },
275 * @brief 修行僧のターンダメージ算出テーブル
277 const int monk_ave_damage[PY_MAX_LEVEL + 1][3] =
334 * Stat Table (STR) -- help index into the "blow" table
336 const byte adj_str_blow[] =
353 20 /* 18/00-18/09 */,
354 30 /* 18/10-18/19 */,
355 40 /* 18/20-18/29 */,
356 50 /* 18/30-18/39 */,
357 60 /* 18/40-18/49 */,
358 70 /* 18/50-18/59 */,
359 80 /* 18/60-18/69 */,
360 90 /* 18/70-18/79 */,
361 100 /* 18/80-18/89 */,
362 110 /* 18/90-18/99 */,
363 120 /* 18/100-18/109 */,
364 130 /* 18/110-18/119 */,
365 140 /* 18/120-18/129 */,
366 150 /* 18/130-18/139 */,
367 160 /* 18/140-18/149 */,
368 170 /* 18/150-18/159 */,
369 180 /* 18/160-18/169 */,
370 190 /* 18/170-18/179 */,
371 200 /* 18/180-18/189 */,
372 210 /* 18/190-18/199 */,
373 220 /* 18/200-18/209 */,
374 230 /* 18/210-18/219 */,
380 * 器用さによる攻撃回数インデックステーブル
381 * Stat Table (DEX) -- index into the "blow" table
383 const byte adj_dex_blow[] =
410 7 /* 18/100-18/109 */,
411 7 /* 18/110-18/119 */,
412 8 /* 18/120-18/129 */,
413 8 /* 18/130-18/139 */,
414 9 /* 18/140-18/149 */,
415 9 /* 18/150-18/159 */,
416 10 /* 18/160-18/169 */,
417 10 /* 18/170-18/179 */,
418 11 /* 18/180-18/189 */,
419 11 /* 18/190-18/199 */,
420 12 /* 18/200-18/209 */,
421 12 /* 18/210-18/219 */,
428 * 腕力、器用さに応じた攻撃回数テーブル /
429 * This table is used to help calculate the number of blows the player can
430 * make in a single round of attacks (one player turn) with a normal weapon.
433 * This number ranges from a single blow/round for weak players to up to six
434 * blows/round for powerful warriors.
436 * Note that certain artifacts and ego-items give "bonus" blows/round.
438 * First, from the player class, we extract some values:
440 * Warrior num = 6; mul = 5; div = MAX(70, weapon_weight);
441 * Berserker num = 6; mul = 7; div = MAX(70, weapon_weight);
442 * Mage num = 3; mul = 2; div = MAX(100, weapon_weight);
443 * Priest num = 5; mul = 3; div = MAX(100, weapon_weight);
444 * Mindcrafter num = 5; mul = 3; div = MAX(100, weapon_weight);
445 * Rogue num = 5; mul = 3; div = MAX(40, weapon_weight);
446 * Ranger num = 5; mul = 4; div = MAX(70, weapon_weight);
447 * Paladin num = 5; mul = 4; div = MAX(70, weapon_weight);
448 * Weaponsmith num = 5; mul = 5; div = MAX(150, weapon_weight);
449 * Warrior-Mage num = 5; mul = 3; div = MAX(70, weapon_weight);
450 * Chaos Warrior num = 5; mul = 4; div = MAX(70, weapon_weight);
451 * Monk num = 5; mul = 3; div = MAX(60, weapon_weight);
452 * Tourist num = 4; mul = 3; div = MAX(100, weapon_weight);
453 * Imitator num = 5; mul = 4; div = MAX(70, weapon_weight);
454 * Beastmaster num = 5; mul = 3; div = MAX(70, weapon_weight);
455 * Cavalry(Ride) num = 5; mul = 4; div = MAX(70, weapon_weight);
456 * Cavalry(Walk) num = 5; mul = 3; div = MAX(100, weapon_weight);
457 * Sorcerer num = 1; mul = 1; div = MAX(1, weapon_weight);
458 * Archer num = 4; mul = 2; div = MAX(70, weapon_weight);
459 * Magic eater num = 4; mul = 2; div = MAX(70, weapon_weight);
460 * ForceTrainer num = 4; mul = 2; div = MAX(60, weapon_weight);
461 * Mirror Master num = 3; mul = 3; div = MAX(100, weapon_weight);
462 * Ninja num = 4; mul = 1; div = MAX(20, weapon_weight);
464 * To get "P", we look up the relevant "adj_str_blow[]" (see above),
465 * multiply it by "mul", and then divide it by "div".
466 * Increase P by 1 if you wield a weapon two-handed.
467 * Decrease P by 1 if you are a Ninja.
469 * To get "D", we look up the relevant "adj_dex_blow[]" (see above),
471 * The player gets "blows_table[P][D]" blows/round, as shown below,
472 * up to a maximum of "num" blows/round, plus any "bonus" blows/round.
475 const byte blows_table[12][12] =
478 /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11+ */
479 /* 3 10 15 /10 /40 /60 /80 /100 /120 /140 /160 /180 */
480 /* 0 */{ 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4 },
481 /* 1 */{ 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4 },
482 /* 2 */{ 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5 },
483 /* 3 */{ 1, 1, 2, 3, 3, 4, 4, 4, 5, 5, 5, 5 },
484 /* 4 */{ 1, 1, 2, 3, 3, 4, 4, 5, 5, 5, 5, 5 },
485 /* 5 */{ 1, 1, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6 },
486 /* 6 */{ 1, 1, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6 },
487 /* 7 */{ 1, 2, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6 },
488 /* 8 */{ 1, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6 },
489 /* 9 */{ 1, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6 },
490 /* 10*/{ 2, 2, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6 },
491 /*11+*/{ 2, 2, 3, 4, 4, 4, 5, 5, 6, 6, 6, 6 },
495 * @brief プレイヤーからモンスターへの打撃命中判定 /
496 * Determine if the player "hits" a monster (normal combat).
497 * @param chance 基本命中値
499 * @param visible 目標を視界に捕らえているならばTRUEを指定
500 * @return 命中と判定された場合TRUEを返す
501 * @note Always miss 5%, always hit 5%, otherwise random.
503 bool test_hit_norm(HIT_RELIABILITY chance, ARMOUR_CLASS ac, bool visible)
505 if (!visible) chance = (chance + 1) / 2;
506 return hit_chance(chance, ac) >= randint1(100);
510 * @brief モンスターへの命中率の計算
515 PERCENTAGE hit_chance(HIT_RELIABILITY reli, ARMOUR_CLASS ac)
517 PERCENTAGE chance = 5, chance_left = 90;
518 if(reli <= 0) return 5;
519 if(p_ptr->pseikaku == SEIKAKU_NAMAKE) chance_left = (chance_left * 19 + 9) / 20;
520 chance += (100 - ((ac * 75) / reli)) * chance_left / 100;
521 if (chance < 5) chance = 5;
526 * @brief プレイヤー攻撃の種族スレイング倍率計算
527 * @param mult 算出前の基本倍率(/10倍)
528 * @param flgs スレイフラグ配列
529 * @param m_ptr 目標モンスターの構造体参照ポインタ
530 * @return スレイング加味後の倍率(/10倍)
532 static MULTIPLY mult_slaying(MULTIPLY mult, const BIT_FLAGS* flgs, const monster_type* m_ptr)
534 static const struct slay_table_t {
536 BIT_FLAGS affect_race_flag;
539 size_t r_flag_offset;
541 #define OFFSET(X) offsetof(monster_race, X)
542 {TR_SLAY_ANIMAL, RF3_ANIMAL, 25, OFFSET(flags3), OFFSET(r_flags3)},
543 {TR_KILL_ANIMAL, RF3_ANIMAL, 40, OFFSET(flags3), OFFSET(r_flags3)},
544 {TR_SLAY_EVIL, RF3_EVIL, 20, OFFSET(flags3), OFFSET(r_flags3)},
545 {TR_KILL_EVIL, RF3_EVIL, 35, OFFSET(flags3), OFFSET(r_flags3)},
546 {TR_SLAY_GOOD, RF3_GOOD, 20, OFFSET(flags3), OFFSET(r_flags3)},
547 {TR_KILL_GOOD, RF3_GOOD, 35, OFFSET(flags3), OFFSET(r_flags3)},
548 {TR_SLAY_HUMAN, RF2_HUMAN, 25, OFFSET(flags2), OFFSET(r_flags2)},
549 {TR_KILL_HUMAN, RF2_HUMAN, 40, OFFSET(flags2), OFFSET(r_flags2)},
550 {TR_SLAY_UNDEAD, RF3_UNDEAD, 30, OFFSET(flags3), OFFSET(r_flags3)},
551 {TR_KILL_UNDEAD, RF3_UNDEAD, 50, OFFSET(flags3), OFFSET(r_flags3)},
552 {TR_SLAY_DEMON, RF3_DEMON, 30, OFFSET(flags3), OFFSET(r_flags3)},
553 {TR_KILL_DEMON, RF3_DEMON, 50, OFFSET(flags3), OFFSET(r_flags3)},
554 {TR_SLAY_ORC, RF3_ORC, 30, OFFSET(flags3), OFFSET(r_flags3)},
555 {TR_KILL_ORC, RF3_ORC, 50, OFFSET(flags3), OFFSET(r_flags3)},
556 {TR_SLAY_TROLL, RF3_TROLL, 30, OFFSET(flags3), OFFSET(r_flags3)},
557 {TR_KILL_TROLL, RF3_TROLL, 50, OFFSET(flags3), OFFSET(r_flags3)},
558 {TR_SLAY_GIANT, RF3_GIANT, 30, OFFSET(flags3), OFFSET(r_flags3)},
559 {TR_KILL_GIANT, RF3_GIANT, 50, OFFSET(flags3), OFFSET(r_flags3)},
560 {TR_SLAY_DRAGON, RF3_DRAGON, 30, OFFSET(flags3), OFFSET(r_flags3)},
561 {TR_KILL_DRAGON, RF3_DRAGON, 50, OFFSET(flags3), OFFSET(r_flags3)},
565 monster_race* r_ptr = &r_info[m_ptr->r_idx];
567 for (i = 0; i < sizeof(slay_table) / sizeof(slay_table[0]); ++i)
569 const struct slay_table_t* p = &slay_table[i];
571 if ((have_flag(flgs, p->slay_flag)) &&
572 (atoffset(BIT_FLAGS, r_ptr, p->flag_offset) & p->affect_race_flag))
574 if (is_original_ap_and_seen(m_ptr))
576 atoffset(BIT_FLAGS, r_ptr, p->r_flag_offset) |= p->affect_race_flag;
579 mult = MAX(mult, p->slay_mult);
587 * @brief プレイヤー攻撃の属性スレイング倍率計算
588 * @param mult 算出前の基本倍率(/10倍)
589 * @param flgs スレイフラグ配列
590 * @param m_ptr 目標モンスターの構造体参照ポインタ
591 * @return スレイング加味後の倍率(/10倍)
593 static MULTIPLY mult_brand(MULTIPLY mult, const BIT_FLAGS* flgs, const monster_type* m_ptr)
595 static const struct brand_table_t {
597 BIT_FLAGS resist_mask;
600 {TR_BRAND_ACID, RFR_EFF_IM_ACID_MASK, 0U },
601 {TR_BRAND_ELEC, RFR_EFF_IM_ELEC_MASK, 0U },
602 {TR_BRAND_FIRE, RFR_EFF_IM_FIRE_MASK, RF3_HURT_FIRE},
603 {TR_BRAND_COLD, RFR_EFF_IM_COLD_MASK, RF3_HURT_COLD},
604 {TR_BRAND_POIS, RFR_EFF_IM_POIS_MASK, 0U },
607 monster_race* r_ptr = &r_info[m_ptr->r_idx];
609 for (i = 0; i < sizeof(brand_table) / sizeof(brand_table[0]); ++i)
611 const struct brand_table_t* p = &brand_table[i];
613 if (have_flag(flgs, p->brand_flag))
615 /* Notice immunity */
616 if (r_ptr->flagsr & p->resist_mask)
618 if (is_original_ap_and_seen(m_ptr))
620 r_ptr->r_flagsr |= (r_ptr->flagsr & p->resist_mask);
624 /* Otherwise, take the damage */
625 else if (r_ptr->flags3 & p->hurt_flag)
627 if (is_original_ap_and_seen(m_ptr))
629 r_ptr->r_flags3 |= p->hurt_flag;
632 mult = MAX(mult, 50);
636 mult = MAX(mult, 25);
645 * @brief 剣術のスレイ倍率計算を行う /
646 * Calcurate magnification of hissatsu technics
647 * @param mult 剣術のスレイ効果以前に算出している多要素の倍率(/10倍)
648 * @param flgs 剣術に使用する武器のスレイフラグ配列
649 * @param m_ptr 目標となるモンスターの構造体参照ポインタ
650 * @param mode 剣術のスレイ型ID
651 * @return スレイの倍率(/10倍)
653 static MULTIPLY mult_hissatsu(player_type *attacker_ptr, MULTIPLY mult, BIT_FLAGS *flgs, monster_type *m_ptr, BIT_FLAGS mode)
655 monster_race *r_ptr = &r_info[m_ptr->r_idx];
657 /* Burning Strike (Fire) */
658 if (mode == HISSATSU_FIRE)
660 /* Notice immunity */
661 if (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK)
663 if (is_original_ap_and_seen(m_ptr))
665 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
669 /* Otherwise, take the damage */
670 else if (have_flag(flgs, TR_BRAND_FIRE))
672 if (r_ptr->flags3 & RF3_HURT_FIRE)
674 if (mult < 70) mult = 70;
675 if (is_original_ap_and_seen(m_ptr))
677 r_ptr->r_flags3 |= RF3_HURT_FIRE;
680 else if (mult < 35) mult = 35;
684 if (r_ptr->flags3 & RF3_HURT_FIRE)
686 if (mult < 50) mult = 50;
687 if (is_original_ap_and_seen(m_ptr))
689 r_ptr->r_flags3 |= RF3_HURT_FIRE;
692 else if (mult < 25) mult = 25;
696 /* Serpent's Tongue (Poison) */
697 if (mode == HISSATSU_POISON)
699 /* Notice immunity */
700 if (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK)
702 if (is_original_ap_and_seen(m_ptr))
704 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK);
708 /* Otherwise, take the damage */
709 else if (have_flag(flgs, TR_BRAND_POIS))
711 if (mult < 35) mult = 35;
715 if (mult < 25) mult = 25;
719 /* Zammaken (Nonliving Evil) */
720 if (mode == HISSATSU_ZANMA)
722 if (!monster_living(m_ptr->r_idx) && (r_ptr->flags3 & RF3_EVIL))
724 if (mult < 15) mult = 25;
725 else if (mult < 50) mult = MIN(50, mult + 20);
729 /* Rock Smash (Hurt Rock) */
730 if (mode == HISSATSU_HAGAN)
732 if (r_ptr->flags3 & RF3_HURT_ROCK)
734 if (is_original_ap_and_seen(m_ptr))
736 r_ptr->r_flags3 |= RF3_HURT_ROCK;
738 if (mult == 10) mult = 40;
739 else if (mult < 60) mult = 60;
743 /* Midare-Setsugekka (Cold) */
744 if (mode == HISSATSU_COLD)
746 /* Notice immunity */
747 if (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK)
749 if (is_original_ap_and_seen(m_ptr))
751 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
754 /* Otherwise, take the damage */
755 else if (have_flag(flgs, TR_BRAND_COLD))
757 if (r_ptr->flags3 & RF3_HURT_COLD)
759 if (mult < 70) mult = 70;
760 if (is_original_ap_and_seen(m_ptr))
762 r_ptr->r_flags3 |= RF3_HURT_COLD;
765 else if (mult < 35) mult = 35;
769 if (r_ptr->flags3 & RF3_HURT_COLD)
771 if (mult < 50) mult = 50;
772 if (is_original_ap_and_seen(m_ptr))
774 r_ptr->r_flags3 |= RF3_HURT_COLD;
777 else if (mult < 25) mult = 25;
781 /* Lightning Eagle (Elec) */
782 if (mode == HISSATSU_ELEC)
784 /* Notice immunity */
785 if (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK)
787 if (is_original_ap_and_seen(m_ptr))
789 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
793 /* Otherwise, take the damage */
794 else if (have_flag(flgs, TR_BRAND_ELEC))
796 if (mult < 70) mult = 70;
800 if (mult < 50) mult = 50;
804 /* Bloody Maelstrom */
805 if ((mode == HISSATSU_SEKIRYUKA) && attacker_ptr->cut && monster_living(m_ptr->r_idx))
807 MULTIPLY tmp = MIN(100, MAX(10, attacker_ptr->cut / 10));
808 if (mult < tmp) mult = tmp;
812 if (mode == HISSATSU_UNDEAD)
814 if (r_ptr->flags3 & RF3_UNDEAD)
816 if (is_original_ap_and_seen(m_ptr))
818 r_ptr->r_flags3 |= RF3_UNDEAD;
820 if (mult == 10) mult = 70;
821 else if (mult < 140) mult = MIN(140, mult + 60);
823 if (mult == 10) mult = 40;
824 else if (mult < 60) mult = MIN(60, mult + 30);
827 if (mult > 150) mult = 150;
833 * @brief ダメージにスレイ要素を加える総合処理ルーチン /
834 * Extract the "total damage" from a given object hitting a given monster.
835 * @param o_ptr 使用武器オブジェクトの構造体参照ポインタ
836 * @param tdam 現在算出途中のダメージ値
837 * @param m_ptr 目標モンスターの構造体参照ポインタ
839 * @param thrown 投擲処理ならばTRUEを指定する
840 * @return 総合的なスレイを加味したダメージ値
842 * Note that "flasks of oil" do NOT do fire damage, although they\n
843 * certainly could be made to do so. XXX XXX\n
845 * Note that most brands and slays are x3, except Slay Animal (x2),\n
846 * Slay Evil (x2), and Kill dragon (x5).\n
848 HIT_POINT tot_dam_aux(player_type *attacker_ptr, object_type *o_ptr, HIT_POINT tdam, monster_type *m_ptr, BIT_FLAGS mode, bool thrown)
852 BIT_FLAGS flgs[TR_FLAG_SIZE];
853 object_flags(o_ptr, flgs);
854 torch_flags(o_ptr, flgs); /* torches has secret flags */
858 if (attacker_ptr->special_attack & (ATTACK_ACID)) add_flag(flgs, TR_BRAND_ACID);
859 if (attacker_ptr->special_attack & (ATTACK_COLD)) add_flag(flgs, TR_BRAND_COLD);
860 if (attacker_ptr->special_attack & (ATTACK_ELEC)) add_flag(flgs, TR_BRAND_ELEC);
861 if (attacker_ptr->special_attack & (ATTACK_FIRE)) add_flag(flgs, TR_BRAND_FIRE);
862 if (attacker_ptr->special_attack & (ATTACK_POIS)) add_flag(flgs, TR_BRAND_POIS);
865 if (hex_spelling(HEX_RUNESWORD)) add_flag(flgs, TR_SLAY_GOOD);
878 mult = mult_slaying(mult, flgs, m_ptr);
880 mult = mult_brand(mult, flgs, m_ptr);
882 if (attacker_ptr->pclass == CLASS_SAMURAI)
884 mult = mult_hissatsu(attacker_ptr, mult, flgs, m_ptr, mode);
887 if ((attacker_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs, TR_FORCE_WEAPON)) && (attacker_ptr->csp > (o_ptr->dd * o_ptr->ds / 5)))
889 attacker_ptr->csp -= (1 + (o_ptr->dd * o_ptr->ds / 5));
890 attacker_ptr->redraw |= (PR_MANA);
891 mult = mult * 3 / 2 + 20;
894 if ((o_ptr->name1 == ART_NOTHUNG) && (m_ptr->r_idx == MON_FAFNER))
899 if (mult > 150) mult = 150;
901 return (tdam * mult / 10);
905 * @brief プレイヤーからモンスターへの打撃クリティカル判定 /
906 * Critical hits (by player) Factor in weapon weight, total plusses, player melee bonus
907 * @param weight 矢弾の重量
908 * @param plus 武器の命中修正
909 * @param dam 現在算出中のダメージ値
910 * @param meichuu 打撃の基本命中力
911 * @param mode オプションフラグ
912 * @return クリティカル修正が入ったダメージ値
914 HIT_POINT critical_norm(player_type *attacker_ptr, WEIGHT weight, int plus, HIT_POINT dam, s16b meichuu, BIT_FLAGS mode)
918 /* Extract "blow" power */
919 i = (weight + (meichuu * 3 + plus * 5) + attacker_ptr->skill_thn);
922 if ((randint1((attacker_ptr->pclass == CLASS_NINJA) ? 4444 : 5000) <= i) || (mode == HISSATSU_MAJIN) || (mode == HISSATSU_3DAN))
924 k = weight + randint1(650);
925 if ((mode == HISSATSU_MAJIN) || (mode == HISSATSU_3DAN)) k += randint1(650);
929 msg_print(_("手ごたえがあった!", "It was a good hit!"));
935 msg_print(_("かなりの手ごたえがあった!", "It was a great hit!"));
940 msg_print(_("会心の一撃だ!", "It was a superb hit!"));
945 msg_print(_("最高の会心の一撃だ!", "It was a *GREAT* hit!"));
950 msg_print(_("比類なき最高の会心の一撃だ!", "It was a *SUPERB* hit!"));
951 dam = ((7 * dam) / 2) + 25;
959 * @brief モンスター打撃のクリティカルランクを返す /
960 * Critical blow. All hits that do 95% of total possible damage,
961 * @param dice モンスター打撃のダイス数
962 * @param sides モンスター打撃の最大ダイス目
963 * @param dam プレイヤーに与えたダメージ
965 * and which also do at least 20 damage, or, sometimes, N damage.
966 * This is used only to determine "cuts" and "stuns".
968 static int monster_critical(DICE_NUMBER dice, DICE_SID sides, HIT_POINT dam)
971 int total = dice * sides;
973 /* Must do at least 95% of perfect */
974 if (dam < total * 19 / 20) return (0);
976 /* Weak blows rarely work */
977 if ((dam < 20) && (randint0(100) >= dam)) return (0);
980 if ((dam >= total) && (dam >= 40)) max++;
985 while (randint0(100) < 2) max++;
988 /* Critical damage */
989 if (dam > 45) return (6 + max);
990 if (dam > 33) return (5 + max);
991 if (dam > 25) return (4 + max);
992 if (dam > 18) return (3 + max);
993 if (dam > 11) return (2 + max);
998 * @brief モンスター打撃の命中を判定する /
999 * Determine if a monster attack against the player succeeds.
1000 * @param power 打撃属性毎の基本命中値
1001 * @param level モンスターのレベル
1002 * @param stun モンスターの朦朧値
1003 * @return TRUEならば命中判定
1005 * Always miss 5% of the time, Always hit 5% of the time.
1006 * Otherwise, match monster power against player armor.
1008 static int check_hit(player_type *target_ptr, int power, DEPTH level, int stun)
1013 if (stun && one_in_(2)) return FALSE;
1014 if (k < 10) return (k < 5);
1015 i = (power + (level * 3));
1017 ac = target_ptr->ac + target_ptr->to_a;
1018 if (target_ptr->special_attack & ATTACK_SUIKEN) ac += (target_ptr->lev * 2);
1020 if ((i > 0) && (randint1(i) > ((ac * 3) / 4))) return (TRUE);
1025 * @brief モンスターから敵モンスターへの命中判定
1026 * @param power 打撃属性による基本命中値
1027 * @param level 攻撃側モンスターのレベル
1028 * @param ac 目標モンスターのAC
1029 * @param stun 攻撃側モンスターが朦朧状態ならTRUEを返す
1030 * @return 命中ならばTRUEを返す
1032 static int check_hit2(int power, DEPTH level, ARMOUR_CLASS ac, int stun)
1037 if (stun && one_in_(2)) return FALSE;
1038 if (k < 10) return (k < 5);
1039 i = (power + (level * 3));
1041 if ((i > 0) && (randint1(i) > ((ac * 3) / 4))) return (TRUE);
1045 /*! モンスターの侮辱行為メッセージテーブル / Hack -- possible "insult" messages */
1046 static concptr desc_insult[] =
1057 "があなたをパラサイト呼ばわりした!",
1061 "insults your mother!",
1062 "gives you the finger!",
1065 "dances around you!",
1066 "makes obscene gestures!",
1068 "calls you a parasite!",
1069 "calls you a cyborg!"
1074 /*! マゴットのぼやきメッセージテーブル / Hack -- possible "insult" messages */
1075 static concptr desc_moan[] =
1079 "が彼の飼い犬を見なかったかと尋ねている。",
1080 "が縄張りから出て行けと言っている。",
1083 "seems sad about something.",
1084 "asks if you have seen his dogs.",
1085 "tells you to get off his land.",
1086 "mumbles something about mushrooms."
1092 * @brief 敵オーラによるプレイヤーのダメージ処理(補助)
1093 * @param m_ptr オーラを持つモンスターの構造体参照ポインタ
1094 * @param immune ダメージを回避できる免疫フラグ
1095 * @param flags_offset オーラフラグ配列の参照オフセット
1096 * @param r_flags_offset モンスターの耐性配列の参照オフセット
1097 * @param aura_flag オーラフラグ配列
1098 * @param dam_func ダメージ処理を行う関数の参照ポインタ
1099 * @param message オーラダメージを受けた際のメッセージ
1102 static void touch_zap_player_aux(monster_type *m_ptr, player_type *touched_ptr, bool immune, int flags_offset, int r_flags_offset, u32b aura_flag,
1103 HIT_POINT(*dam_func)(player_type *creature_type, HIT_POINT dam, concptr kb_str, int monspell, bool aura), concptr message)
1105 monster_race *r_ptr = &r_info[m_ptr->r_idx];
1107 if (!(atoffset(BIT_FLAGS, r_ptr, flags_offset) & aura_flag) || immune) return;
1109 GAME_TEXT mon_name[MAX_NLEN];
1110 int aura_damage = damroll(1 + (r_ptr->level / 26), 1 + (r_ptr->level / 17));
1112 monster_desc(mon_name, m_ptr, MD_WRONGDOER_NAME);
1114 dam_func(touched_ptr, aura_damage, mon_name, -1, TRUE);
1116 if (is_original_ap_and_seen(m_ptr))
1118 atoffset(BIT_FLAGS, r_ptr, r_flags_offset) |= aura_flag;
1125 * @brief 敵オーラによるプレイヤーのダメージ処理(メイン)
1126 * @param m_ptr オーラを持つモンスターの構造体参照ポインタ
1127 * @param touched_ptr オーラを持つ相手に振れたクリーチャーの参照ポインタ
1130 static void touch_zap_player(monster_type *m_ptr, player_type *touched_ptr)
1132 touch_zap_player_aux(m_ptr, touched_ptr, touched_ptr->immune_fire, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_FIRE,
1133 fire_dam, _("突然とても熱くなった!", "You are suddenly very hot!"));
1134 touch_zap_player_aux(m_ptr, touched_ptr, touched_ptr->immune_cold, offsetof(monster_race, flags3), offsetof(monster_race, r_flags3), RF3_AURA_COLD,
1135 cold_dam, _("突然とても寒くなった!", "You are suddenly very cold!"));
1136 touch_zap_player_aux(m_ptr, touched_ptr, touched_ptr->immune_elec, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_ELEC,
1137 elec_dam, _("電撃をくらった!", "You get zapped!"));
1141 * @brief プレイヤーの変異要素による打撃処理
1142 * @param m_idx 攻撃目標となったモンスターの参照ID
1143 * @param attack 変異要素による攻撃要素の種類
1144 * @param fear 攻撃を受けたモンスターが恐慌状態に陥ったかを返す参照ポインタ
1145 * @param mdeath 攻撃を受けたモンスターが死亡したかを返す参照ポインタ
1148 static void natural_attack(MONSTER_IDX m_idx, int attack, bool *fear, bool *mdeath)
1152 WEIGHT n_weight = 0;
1153 monster_type *m_ptr = &p_ptr->current_floor_ptr->m_list[m_idx];
1154 monster_race *r_ptr = &r_info[m_ptr->r_idx];
1155 GAME_TEXT m_name[MAX_NLEN];
1157 int dice_num, dice_side;
1163 case MUT2_SCOR_TAIL:
1167 atk_desc = _("尻尾", "tail");
1174 atk_desc = _("角", "horns");
1181 atk_desc = _("クチバシ", "beak");
1188 atk_desc = _("象の鼻", "trunk");
1191 case MUT2_TENTACLES:
1195 atk_desc = _("触手", "tentacles");
1199 dice_num = dice_side = n_weight = 1;
1200 atk_desc = _("未定義の部位", "undefined body part");
1204 monster_desc(m_name, m_ptr, 0);
1206 /* Calculate the "attack quality" */
1207 bonus = p_ptr->to_h_m + (p_ptr->lev * 6 / 5);
1208 chance = (p_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
1211 if ((!(r_ptr->flags2 & RF2_QUANTUM) || !randint0(2)) && test_hit_norm(chance, r_ptr->ac, m_ptr->ml))
1214 msg_format(_("%sを%sで攻撃した。", "You hit %s with your %s."), m_name, atk_desc);
1216 k = damroll(dice_num, dice_side);
1217 k = critical_norm(p_ptr, n_weight, bonus, k, (s16b)bonus, 0);
1219 /* Apply the player damage bonuses */
1222 /* No negative damage */
1225 /* Modify the damage */
1226 k = mon_damage_mod(m_ptr, k, FALSE);
1228 /* Complex message */
1229 msg_format_wizard(CHEAT_MONSTER,
1230 _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"),
1231 k, m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
1233 /* Anger the monster */
1234 if (k > 0) anger_monster(m_ptr);
1236 /* Damage, check for fear and mdeath */
1239 case MUT2_SCOR_TAIL:
1240 project(p_ptr, 0, 0, m_ptr->fy, m_ptr->fx, k, GF_POIS, PROJECT_KILL, -1);
1241 *mdeath = (m_ptr->r_idx == 0);
1244 *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1247 *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1250 *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1252 case MUT2_TENTACLES:
1253 *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1256 *mdeath = mon_take_hit(m_idx, k, fear, NULL);
1259 touch_zap_player(m_ptr, p_ptr);
1265 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
1270 * @brief プレイヤーの打撃処理サブルーチン /
1271 * Player attacks a (poor, defenseless) creature -RAK-
1274 * @param fear 攻撃を受けたモンスターが恐慌状態に陥ったかを返す参照ポインタ
1275 * @param mdeath 攻撃を受けたモンスターが死亡したかを返す参照ポインタ
1276 * @param hand 攻撃を行うための武器を持つ手
1277 * @param mode 発動中の剣術ID
1280 * If no "weapon" is available, then "punch" the monster one time.
1282 static void py_attack_aux(player_type *attacker_ptr, POSITION y, POSITION x, bool *fear, bool *mdeath, s16b hand, COMBAT_OPTION_IDX mode)
1284 int num = 0, bonus, chance, vir;
1287 floor_type *floor_ptr = attacker_ptr->current_floor_ptr;
1288 grid_type *g_ptr = &floor_ptr->grid_array[y][x];
1290 monster_type *m_ptr = &floor_ptr->m_list[g_ptr->m_idx];
1291 monster_race *r_ptr = &r_info[m_ptr->r_idx];
1293 /* Access the weapon */
1294 object_type *o_ptr = &attacker_ptr->inventory_list[INVEN_RARM + hand];
1296 GAME_TEXT m_name[MAX_NLEN];
1298 bool success_hit = FALSE;
1299 bool backstab = FALSE;
1300 bool vorpal_cut = FALSE;
1301 int chaos_effect = 0;
1302 bool stab_fleeing = FALSE;
1303 bool fuiuchi = FALSE;
1304 bool monk_attack = FALSE;
1305 bool do_quake = FALSE;
1307 bool drain_msg = TRUE;
1308 int drain_result = 0, drain_heal = 0;
1309 bool can_drain = FALSE;
1311 int drain_left = MAX_VAMPIRIC_DRAIN;
1312 BIT_FLAGS flgs[TR_FLAG_SIZE]; /* A massive hack -- life-draining weapons */
1313 bool is_human = (r_ptr->d_char == 'p');
1314 bool is_lowlevel = (r_ptr->level < (attacker_ptr->lev - 15));
1315 bool zantetsu_mukou, e_j_mukou;
1317 switch (attacker_ptr->pclass)
1321 if (has_melee_weapon(attacker_ptr, INVEN_RARM + hand) && !attacker_ptr->icky_wield[hand])
1323 int tmp = attacker_ptr->lev * 6 + (attacker_ptr->skill_stl + 10) * 4;
1324 if (attacker_ptr->monlite && (mode != HISSATSU_NYUSIN)) tmp /= 3;
1325 if (attacker_ptr->cursed & TRC_AGGRAVATE) tmp /= 2;
1326 if (r_ptr->level > (attacker_ptr->lev * attacker_ptr->lev / 20 + 10)) tmp /= 3;
1327 if (MON_CSLEEP(m_ptr) && m_ptr->ml)
1329 /* Can't backstab creatures that we can't see, right? */
1332 else if ((attacker_ptr->special_defense & NINJA_S_STEALTH) && (randint0(tmp) > (r_ptr->level + 20)) && m_ptr->ml && !(r_ptr->flagsr & RFR_RES_ALL))
1336 else if (MON_MONFEAR(m_ptr) && m_ptr->ml)
1338 stab_fleeing = TRUE;
1344 case CLASS_FORCETRAINER:
1345 case CLASS_BERSERKER:
1346 if ((empty_hands(attacker_ptr, TRUE) & EMPTY_HAND_RARM) && !attacker_ptr->riding) monk_attack = TRUE;
1350 if (!o_ptr->k_idx) /* Empty hand */
1352 if ((r_ptr->level + 10) > attacker_ptr->lev)
1354 if (attacker_ptr->skill_exp[GINOU_SUDE] < s_info[attacker_ptr->pclass].s_max[GINOU_SUDE])
1356 if (attacker_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_BEGINNER)
1357 attacker_ptr->skill_exp[GINOU_SUDE] += 40;
1358 else if ((attacker_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_SKILLED))
1359 attacker_ptr->skill_exp[GINOU_SUDE] += 5;
1360 else if ((attacker_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_EXPERT) && (attacker_ptr->lev > 19))
1361 attacker_ptr->skill_exp[GINOU_SUDE] += 1;
1362 else if ((attacker_ptr->lev > 34))
1363 if (one_in_(3)) attacker_ptr->skill_exp[GINOU_SUDE] += 1;
1364 attacker_ptr->update |= (PU_BONUS);
1368 else if (object_is_melee_weapon(o_ptr))
1370 if ((r_ptr->level + 10) > attacker_ptr->lev)
1372 OBJECT_TYPE_VALUE tval = attacker_ptr->inventory_list[INVEN_RARM + hand].tval - TV_WEAPON_BEGIN;
1373 OBJECT_SUBTYPE_VALUE sval = attacker_ptr->inventory_list[INVEN_RARM + hand].sval;
1374 int now_exp = attacker_ptr->weapon_exp[tval][sval];
1375 if (now_exp < s_info[attacker_ptr->pclass].w_max[tval][sval])
1378 if (now_exp < WEAPON_EXP_BEGINNER) amount = 80;
1379 else if (now_exp < WEAPON_EXP_SKILLED) amount = 10;
1380 else if ((now_exp < WEAPON_EXP_EXPERT) && (attacker_ptr->lev > 19)) amount = 1;
1381 else if ((attacker_ptr->lev > 34) && one_in_(2)) amount = 1;
1382 attacker_ptr->weapon_exp[tval][sval] += amount;
1383 attacker_ptr->update |= (PU_BONUS);
1388 /* Disturb the monster */
1389 (void)set_monster_csleep(g_ptr->m_idx, 0);
1391 monster_desc(m_name, m_ptr, 0);
1393 /* Calculate the "attack quality" */
1394 bonus = attacker_ptr->to_h[hand] + o_ptr->to_h;
1395 chance = (attacker_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
1396 if (mode == HISSATSU_IAI) chance += 60;
1397 if (attacker_ptr->special_defense & KATA_KOUKIJIN) chance += 150;
1398 if (attacker_ptr->sutemi) chance = MAX(chance * 3 / 2, chance + 60);
1400 vir = virtue_number(attacker_ptr, V_VALOUR);
1403 chance += (attacker_ptr->virtues[vir - 1] / 10);
1406 zantetsu_mukou = ((o_ptr->name1 == ART_ZANTETSU) && (r_ptr->d_char == 'j'));
1407 e_j_mukou = ((o_ptr->name1 == ART_EXCALIBUR_J) && (r_ptr->d_char == 'S'));
1409 if ((mode == HISSATSU_KYUSHO) || (mode == HISSATSU_MINEUCHI) || (mode == HISSATSU_3DAN) || (mode == HISSATSU_IAI)) num_blow = 1;
1410 else if (mode == HISSATSU_COLD) num_blow = attacker_ptr->num_blow[hand] + 2;
1411 else num_blow = attacker_ptr->num_blow[hand];
1413 /* Hack -- DOKUBARI always hit once */
1414 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) num_blow = 1;
1416 /* Attack once for each legal blow */
1417 while ((num++ < num_blow) && !attacker_ptr->is_dead)
1419 if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) || (mode == HISSATSU_KYUSHO))
1423 if (attacker_ptr->migite && attacker_ptr->hidarite)
1427 if (mode == HISSATSU_3DAN)
1432 success_hit = one_in_(n);
1434 else if ((attacker_ptr->pclass == CLASS_NINJA) && ((backstab || fuiuchi) && !(r_ptr->flagsr & RFR_RES_ALL))) success_hit = TRUE;
1435 else success_hit = test_hit_norm(chance, r_ptr->ac, m_ptr->ml);
1437 if (mode == HISSATSU_MAJIN)
1440 success_hit = FALSE;
1446 int vorpal_chance = ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD)) ? 2 : 4;
1450 if (backstab) msg_format(_("あなたは冷酷にも眠っている無力な%sを突き刺した!", "You cruelly stab the helpless, sleeping %s!"), m_name);
1451 else if (fuiuchi) msg_format(_("不意を突いて%sに強烈な一撃を喰らわせた!", "You make surprise attack, and hit %s with a powerful blow!"), m_name);
1452 else if (stab_fleeing) msg_format(_("逃げる%sを背中から突き刺した!", "You backstab the fleeing %s!"), m_name);
1453 else if (!monk_attack) msg_format(_("%sを攻撃した。", "You hit %s."), m_name);
1455 /* Hack -- bare hands do one damage */
1458 object_flags(o_ptr, flgs);
1460 /* Select a chaotic effect (50% chance) */
1461 if ((have_flag(flgs, TR_CHAOTIC)) && one_in_(2))
1464 chg_virtue(attacker_ptr, V_CHANCE, 1);
1466 if (randint1(5) < 3)
1468 /* Vampiric (20%) */
1471 else if (one_in_(250))
1476 else if (!one_in_(10))
1478 /* Confusion (26.892%) */
1481 else if (one_in_(2))
1483 /* Teleport away (1.494%) */
1488 /* Polymorph (1.494%) */
1493 /* Vampiric drain */
1494 if ((have_flag(flgs, TR_VAMPIRIC)) || (chaos_effect == 1) || (mode == HISSATSU_DRAIN) || hex_spelling(HEX_VAMP_BLADE))
1496 /* Only drain "living" monsters */
1497 if (monster_living(m_ptr->r_idx))
1503 if ((have_flag(flgs, TR_VORPAL) || hex_spelling(HEX_RUNESWORD)) && (randint1(vorpal_chance * 3 / 2) == 1) && !zantetsu_mukou)
1505 else vorpal_cut = FALSE;
1509 int special_effect = 0, stun_effect = 0, times = 0, max_times;
1511 const martial_arts *ma_ptr = &ma_blows[0], *old_ptr = &ma_blows[0];
1512 int resist_stun = 0;
1515 if (r_ptr->flags1 & RF1_UNIQUE) resist_stun += 88;
1516 if (r_ptr->flags3 & RF3_NO_STUN) resist_stun += 66;
1517 if (r_ptr->flags3 & RF3_NO_CONF) resist_stun += 33;
1518 if (r_ptr->flags3 & RF3_NO_SLEEP) resist_stun += 33;
1519 if ((r_ptr->flags3 & RF3_UNDEAD) || (r_ptr->flags3 & RF3_NONLIVING))
1522 if (attacker_ptr->special_defense & KAMAE_BYAKKO)
1523 max_times = (attacker_ptr->lev < 3 ? 1 : attacker_ptr->lev / 3);
1524 else if (attacker_ptr->special_defense & KAMAE_SUZAKU)
1526 else if (attacker_ptr->special_defense & KAMAE_GENBU)
1529 max_times = (attacker_ptr->lev < 7 ? 1 : attacker_ptr->lev / 7);
1530 /* Attempt 'times' */
1531 for (times = 0; times < max_times; times++)
1535 ma_ptr = &ma_blows[randint0(MAX_MA)];
1536 if ((attacker_ptr->pclass == CLASS_FORCETRAINER) && (ma_ptr->min_level > 1)) min_level = ma_ptr->min_level + 3;
1537 else min_level = ma_ptr->min_level;
1538 } while ((min_level > attacker_ptr->lev) ||
1539 (randint1(attacker_ptr->lev) < ma_ptr->chance));
1541 /* keep the highest level attack available we found */
1542 if ((ma_ptr->min_level > old_ptr->min_level) &&
1543 !attacker_ptr->stun && !attacker_ptr->confused)
1547 if (current_world_ptr->wizard && cheat_xtra)
1549 msg_print(_("攻撃を再選択しました。", "Attack re-selected."));
1558 if (attacker_ptr->pclass == CLASS_FORCETRAINER) min_level = MAX(1, ma_ptr->min_level - 3);
1559 else min_level = ma_ptr->min_level;
1560 k = damroll(ma_ptr->dd + attacker_ptr->to_dd[hand], ma_ptr->ds + attacker_ptr->to_ds[hand]);
1561 if (attacker_ptr->special_attack & ATTACK_SUIKEN) k *= 2;
1563 if (ma_ptr->effect == MA_KNEE)
1565 if (r_ptr->flags1 & RF1_MALE)
1567 msg_format(_("%sに金的膝蹴りをくらわした!", "You hit %s in the groin with your knee!"), m_name);
1569 special_effect = MA_KNEE;
1572 msg_format(ma_ptr->desc, m_name);
1575 else if (ma_ptr->effect == MA_SLOW)
1577 if (!((r_ptr->flags1 & RF1_NEVER_MOVE) ||
1578 my_strchr("~#{}.UjmeEv$,DdsbBFIJQSXclnw!=?", r_ptr->d_char)))
1580 msg_format(_("%sの足首に関節蹴りをくらわした!", "You kick %s in the ankle."), m_name);
1581 special_effect = MA_SLOW;
1583 else msg_format(ma_ptr->desc, m_name);
1589 stun_effect = (ma_ptr->effect / 2) + randint1(ma_ptr->effect / 2);
1592 msg_format(ma_ptr->desc, m_name);
1595 if (attacker_ptr->special_defense & KAMAE_SUZAKU) weight = 4;
1596 if ((attacker_ptr->pclass == CLASS_FORCETRAINER) && P_PTR_KI)
1598 weight += (P_PTR_KI / 30);
1599 if (weight > 20) weight = 20;
1602 k = critical_norm(attacker_ptr, attacker_ptr->lev * weight, min_level, k, attacker_ptr->to_h[0], 0);
1604 if ((special_effect == MA_KNEE) && ((k + attacker_ptr->to_d[hand]) < m_ptr->hp))
1606 msg_format(_("%^sは苦痛にうめいている!", "%^s moans in agony!"), m_name);
1607 stun_effect = 7 + randint1(13);
1611 else if ((special_effect == MA_SLOW) && ((k + attacker_ptr->to_d[hand]) < m_ptr->hp))
1613 if (!(r_ptr->flags1 & RF1_UNIQUE) &&
1614 (randint1(attacker_ptr->lev) > r_ptr->level) &&
1617 msg_format(_("%^sは足をひきずり始めた。", "%^s starts limping slower."), m_name);
1618 m_ptr->mspeed -= 10;
1622 if (stun_effect && ((k + attacker_ptr->to_d[hand]) < m_ptr->hp))
1624 if (attacker_ptr->lev > randint1(r_ptr->level + resist_stun + 10))
1626 if (set_monster_stunned(g_ptr->m_idx, stun_effect + MON_STUNNED(m_ptr)))
1628 msg_format(_("%^sはフラフラになった。", "%^s is stunned."), m_name);
1632 msg_format(_("%^sはさらにフラフラになった。", "%^s is more stunned."), m_name);
1638 /* Handle normal weapon */
1639 else if (o_ptr->k_idx)
1641 k = damroll(o_ptr->dd + attacker_ptr->to_dd[hand], o_ptr->ds + attacker_ptr->to_ds[hand]);
1642 k = tot_dam_aux(attacker_ptr, o_ptr, k, m_ptr, mode, FALSE);
1646 k *= (3 + (attacker_ptr->lev / 20));
1650 k = k*(5 + (attacker_ptr->lev * 2 / 25)) / 2;
1652 else if (stab_fleeing)
1657 if ((attacker_ptr->impact[hand] && ((k > 50) || one_in_(7))) ||
1658 (chaos_effect == 2) || (mode == HISSATSU_QUAKE))
1663 if ((!(o_ptr->tval == TV_SWORD) || !(o_ptr->sval == SV_DOKUBARI)) && !(mode == HISSATSU_KYUSHO))
1664 k = critical_norm(attacker_ptr, o_ptr->weight, o_ptr->to_h, k, attacker_ptr->to_h[hand], mode);
1672 if ((o_ptr->name1 == ART_CHAINSWORD) && !one_in_(2))
1674 char chainsword_noise[1024];
1675 if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, chainsword_noise))
1677 msg_print(chainsword_noise);
1681 if (o_ptr->name1 == ART_VORPAL_BLADE)
1683 msg_print(_("目にも止まらぬヴォーパルブレード、手錬の早業!", "Your Vorpal Blade goes snicker-snack!"));
1687 msg_format(_("%sをグッサリ切り裂いた!", "Your weapon cuts deep into %s!"), m_name);
1690 /* Try to increase the damage */
1691 while (one_in_(vorpal_chance))
1696 k *= (HIT_POINT)mult;
1699 if (((r_ptr->flagsr & RFR_RES_ALL) ? k / 100 : k) > m_ptr->hp)
1701 msg_format(_("%sを真っ二つにした!", "You cut %s in half!"), m_name);
1707 case 2: msg_format(_("%sを斬った!", "You gouge %s!"), m_name); break;
1708 case 3: msg_format(_("%sをぶった斬った!", "You maim %s!"), m_name); break;
1709 case 4: msg_format(_("%sをメッタ斬りにした!", "You carve %s!"), m_name); break;
1710 case 5: msg_format(_("%sをメッタメタに斬った!", "You cleave %s!"), m_name); break;
1711 case 6: msg_format(_("%sを刺身にした!", "You smite %s!"), m_name); break;
1712 case 7: msg_format(_("%sを斬って斬って斬りまくった!", "You eviscerate %s!"), m_name); break;
1713 default: msg_format(_("%sを細切れにした!", "You shred %s!"), m_name); break;
1716 drain_result = drain_result * 3 / 2;
1720 drain_result += o_ptr->to_d;
1723 /* Apply the player damage bonuses */
1724 k += attacker_ptr->to_d[hand];
1725 drain_result += attacker_ptr->to_d[hand];
1727 if ((mode == HISSATSU_SUTEMI) || (mode == HISSATSU_3DAN)) k *= 2;
1728 if ((mode == HISSATSU_SEKIRYUKA) && !monster_living(m_ptr->r_idx)) k = 0;
1729 if ((mode == HISSATSU_SEKIRYUKA) && !attacker_ptr->cut) k /= 2;
1731 /* No negative damage */
1734 if ((mode == HISSATSU_ZANMA) && !(!monster_living(m_ptr->r_idx) && (r_ptr->flags3 & RF3_EVIL)))
1741 msg_print(_("こんな軟らかいものは切れん!", "You cannot cut such a elastic thing!"));
1747 msg_print(_("蜘蛛は苦手だ!", "Spiders are difficult for you to deal with!"));
1751 if (mode == HISSATSU_MINEUCHI)
1753 int tmp = (10 + randint1(15) + attacker_ptr->lev / 5);
1756 anger_monster(m_ptr);
1758 if (!(r_ptr->flags3 & (RF3_NO_STUN)))
1761 if (MON_STUNNED(m_ptr))
1763 msg_format(_("%sはひどくもうろうとした。", "%s is more dazed."), m_name);
1768 msg_format(_("%s はもうろうとした。", "%s is dazed."), m_name);
1772 (void)set_monster_stunned(g_ptr->m_idx, MON_STUNNED(m_ptr) + tmp);
1776 msg_format(_("%s には効果がなかった。", "%s is not effected."), m_name);
1780 /* Modify the damage */
1781 k = mon_damage_mod(m_ptr, k, (bool)(((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE)) || ((attacker_ptr->pclass == CLASS_BERSERKER) && one_in_(2))));
1782 if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) || (mode == HISSATSU_KYUSHO))
1784 if ((randint1(randint1(r_ptr->level / 7) + 5) == 1) && !(r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags7 & RF7_UNIQUE2))
1787 msg_format(_("%sの急所を突き刺した!", "You hit %s on a fatal spot!"), m_name);
1791 else if ((attacker_ptr->pclass == CLASS_NINJA) && has_melee_weapon(attacker_ptr, INVEN_RARM + hand) && !attacker_ptr->icky_wield[hand] && ((attacker_ptr->cur_lite <= 0) || one_in_(7)))
1793 int maxhp = maxroll(r_ptr->hdice, r_ptr->hside);
1794 if (one_in_(backstab ? 13 : (stab_fleeing || fuiuchi) ? 15 : 27))
1798 msg_format(_("刃が%sに深々と突き刺さった!", "You critically injured %s!"), m_name);
1800 else if (((m_ptr->hp < maxhp / 2) && one_in_((attacker_ptr->num_blow[0] + attacker_ptr->num_blow[1] + 1) * 10)) || ((one_in_(666) || ((backstab || fuiuchi) && one_in_(11))) && !(r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags7 & RF7_UNIQUE2)))
1802 if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_UNIQUE2) || (m_ptr->hp >= maxhp / 2))
1804 k = MAX(k * 5, m_ptr->hp / 2);
1806 msg_format(_("%sに致命傷を負わせた!", "You fatally injured %s!"), m_name);
1811 msg_format(_("刃が%sの急所を貫いた!", "You hit %s on a fatal spot!"), m_name);
1816 msg_format_wizard(CHEAT_MONSTER,
1817 _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"), k,
1818 m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
1820 if (k <= 0) can_drain = FALSE;
1822 if (drain_result > m_ptr->hp)
1823 drain_result = m_ptr->hp;
1825 /* Damage, check for fear and death */
1826 if (mon_take_hit(g_ptr->m_idx, k, fear, NULL))
1829 if ((attacker_ptr->pclass == CLASS_BERSERKER) && attacker_ptr->energy_use)
1831 if (attacker_ptr->migite && attacker_ptr->hidarite)
1833 if (hand) attacker_ptr->energy_use = attacker_ptr->energy_use * 3 / 5 + attacker_ptr->energy_use*num * 2 / (attacker_ptr->num_blow[hand] * 5);
1834 else attacker_ptr->energy_use = attacker_ptr->energy_use*num * 3 / (attacker_ptr->num_blow[hand] * 5);
1838 attacker_ptr->energy_use = attacker_ptr->energy_use*num / attacker_ptr->num_blow[hand];
1841 if ((o_ptr->name1 == ART_ZANTETSU) && is_lowlevel)
1842 msg_print(_("またつまらぬものを斬ってしまった...", "Sigh... Another trifling thing I've cut...."));
1846 /* Anger the monster */
1847 if (k > 0) anger_monster(m_ptr);
1849 touch_zap_player(m_ptr, attacker_ptr);
1851 /* Are we draining it? A little note: If the monster is
1852 dead, the drain does not work... */
1854 if (can_drain && (drain_result > 0))
1856 if (o_ptr->name1 == ART_MURAMASA)
1860 HIT_PROB to_h = o_ptr->to_h;
1861 HIT_POINT to_d = o_ptr->to_d;
1865 for (i = 0; i < to_h + 3; i++) if (one_in_(4)) flag = 0;
1869 for (i = 0; i < to_d + 3; i++) if (one_in_(4)) flag = 0;
1872 if (o_ptr->to_h != to_h || o_ptr->to_d != to_d)
1874 msg_print(_("妖刀は血を吸って強くなった!", "Muramasa sucked blood, and became more powerful!"));
1882 if (drain_result > 5) /* Did we really hurt it? */
1884 drain_heal = damroll(2, drain_result / 6);
1886 if (hex_spelling(HEX_VAMP_BLADE)) drain_heal *= 2;
1890 msg_format(_("Draining left: %d", "Draining left: %d"), drain_left);
1895 if (drain_heal < drain_left)
1897 drain_left -= drain_heal;
1901 drain_heal = drain_left;
1907 msg_format(_("刃が%sから生命力を吸い取った!", "Your weapon drains life from %s!"), m_name);
1911 drain_heal = (drain_heal * attacker_ptr->mutant_regenerate_mod) / 100;
1913 hp_player(attacker_ptr, drain_heal);
1914 /* We get to keep some of it! */
1918 m_ptr->maxhp -= (k + 7) / 8;
1919 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
1920 if (m_ptr->maxhp < 1) m_ptr->maxhp = 1;
1926 /* Confusion attack */
1927 if ((attacker_ptr->special_attack & ATTACK_CONFUSE) || (chaos_effect == 3) || (mode == HISSATSU_CONF) || hex_spelling(HEX_CONFUSION))
1929 /* Cancel glowing hands */
1930 if (attacker_ptr->special_attack & ATTACK_CONFUSE)
1932 attacker_ptr->special_attack &= ~(ATTACK_CONFUSE);
1933 msg_print(_("手の輝きがなくなった。", "Your hands stop glowing."));
1934 attacker_ptr->redraw |= (PR_STATUS);
1938 /* Confuse the monster */
1939 if (r_ptr->flags3 & RF3_NO_CONF)
1941 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_NO_CONF;
1942 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
1945 else if (randint0(100) < r_ptr->level)
1947 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
1951 msg_format(_("%^sは混乱したようだ。", "%^s appears confused."), m_name);
1952 (void)set_monster_confused(g_ptr->m_idx, MON_CONFUSED(m_ptr) + 10 + randint0(attacker_ptr->lev) / 5);
1956 else if (chaos_effect == 4)
1958 bool resists_tele = FALSE;
1960 if (r_ptr->flagsr & RFR_RES_TELE)
1962 if (r_ptr->flags1 & RF1_UNIQUE)
1964 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1965 msg_format(_("%^sには効果がなかった。", "%^s is unaffected!"), m_name);
1966 resists_tele = TRUE;
1968 else if (r_ptr->level > randint1(100))
1970 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1971 msg_format(_("%^sは抵抗力を持っている!", "%^s resists!"), m_name);
1972 resists_tele = TRUE;
1978 msg_format(_("%^sは消えた!", "%^s disappears!"), m_name);
1979 teleport_away(attacker_ptr, g_ptr->m_idx, 50, TELEPORT_PASSIVE);
1980 num = num_blow + 1; /* Can't hit it anymore! */
1985 else if ((chaos_effect == 5) && (randint1(90) > r_ptr->level))
1987 if (!(r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) &&
1988 !(r_ptr->flagsr & RFR_EFF_RES_CHAO_MASK))
1990 if (polymorph_monster(attacker_ptr, y, x))
1992 msg_format(_("%^sは変化した!", "%^s changes!"), m_name);
1998 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
2001 /* Hack -- Get new monster */
2002 m_ptr = &floor_ptr->m_list[g_ptr->m_idx];
2004 /* Oops, we need a different name... */
2005 monster_desc(m_name, m_ptr, 0);
2007 /* Hack -- Get new race */
2008 r_ptr = &r_info[m_ptr->r_idx];
2011 else if (o_ptr->name1 == ART_G_HAMMER)
2013 monster_type *target_ptr = &floor_ptr->m_list[g_ptr->m_idx];
2015 if (target_ptr->hold_o_idx)
2017 object_type *q_ptr = &floor_ptr->o_list[target_ptr->hold_o_idx];
2018 GAME_TEXT o_name[MAX_NLEN];
2020 object_desc(o_name, q_ptr, OD_NAME_ONLY);
2021 q_ptr->held_m_idx = 0;
2022 q_ptr->marked = OM_TOUCHED;
2023 target_ptr->hold_o_idx = q_ptr->next_o_idx;
2024 q_ptr->next_o_idx = 0;
2025 msg_format(_("%sを奪った。", "You snatched %s."), o_name);
2026 inven_carry(attacker_ptr, q_ptr);
2034 backstab = FALSE; /* Clumsy! */
2035 fuiuchi = FALSE; /* Clumsy! */
2037 if ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE) && one_in_(3))
2039 BIT_FLAGS flgs_aux[TR_FLAG_SIZE];
2043 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
2044 msg_print(_("振り回した大鎌が自分自身に返ってきた!", "Your scythe returns to you!"));
2045 object_flags(o_ptr, flgs_aux);
2047 k = damroll(o_ptr->dd + attacker_ptr->to_dd[hand], o_ptr->ds + attacker_ptr->to_ds[hand]);
2050 switch (attacker_ptr->mimic_form)
2053 switch (attacker_ptr->prace)
2060 case RACE_BARBARIAN:
2064 case RACE_HALF_TROLL:
2065 case RACE_HALF_OGRE:
2066 case RACE_HALF_GIANT:
2067 case RACE_HALF_TITAN:
2075 case RACE_DRACONIAN:
2082 case MIMIC_DEMON_LORD:
2089 if (attacker_ptr->align < 0 && mult < 20)
2091 if (!(attacker_ptr->resist_acid || IS_OPPOSE_ACID() || attacker_ptr->immune_acid) && (mult < 25))
2093 if (!(attacker_ptr->resist_elec || IS_OPPOSE_ELEC() || attacker_ptr->immune_elec) && (mult < 25))
2095 if (!(attacker_ptr->resist_fire || IS_OPPOSE_FIRE() || attacker_ptr->immune_fire) && (mult < 25))
2097 if (!(attacker_ptr->resist_cold || IS_OPPOSE_COLD() || attacker_ptr->immune_cold) && (mult < 25))
2099 if (!(attacker_ptr->resist_pois || IS_OPPOSE_POIS()) && (mult < 25))
2102 if ((attacker_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs_aux, TR_FORCE_WEAPON)) && (attacker_ptr->csp >(attacker_ptr->msp / 30)))
2104 attacker_ptr->csp -= (1 + (attacker_ptr->msp / 30));
2105 attacker_ptr->redraw |= (PR_MANA);
2106 mult = mult * 3 / 2 + 20;
2108 k *= (HIT_POINT)mult;
2112 k = critical_norm(attacker_ptr, o_ptr->weight, o_ptr->to_h, k, attacker_ptr->to_h[hand], mode);
2116 msg_format(_("グッサリ切り裂かれた!", "Your weapon cuts deep into yourself!"));
2117 /* Try to increase the damage */
2123 k *= (HIT_POINT)mult;
2125 k += (attacker_ptr->to_d[hand] + o_ptr->to_d);
2128 take_hit(attacker_ptr, DAMAGE_FORCE, k, _("死の大鎌", "Death scythe"), -1);
2134 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
2142 if (weak && !(*mdeath))
2144 msg_format(_("%sは弱くなったようだ。", "%^s seems weakened."), m_name);
2146 if (drain_left != MAX_VAMPIRIC_DRAIN)
2150 chg_virtue(attacker_ptr, V_UNLIFE, 1);
2153 /* Mega-Hack -- apply earthquake brand */
2156 earthquake(attacker_ptr, attacker_ptr->y, attacker_ptr->x, 10, 0);
2157 if (!floor_ptr->grid_array[y][x].m_idx) *mdeath = TRUE;
2162 * @brief プレイヤーの打撃処理メインルーチン
2165 * @param mode 発動中の剣術ID
2166 * @return 実際に攻撃処理が行われた場合TRUEを返す。
2168 * If no "weapon" is available, then "punch" the monster one time.
2170 bool py_attack(player_type *attacker_ptr, POSITION y, POSITION x, COMBAT_OPTION_IDX mode)
2173 bool mdeath = FALSE;
2174 bool stormbringer = FALSE;
2176 grid_type *g_ptr = &attacker_ptr->current_floor_ptr->grid_array[y][x];
2177 monster_type *m_ptr = &attacker_ptr->current_floor_ptr->m_list[g_ptr->m_idx];
2178 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2179 GAME_TEXT m_name[MAX_NLEN];
2181 disturb(attacker_ptr, FALSE, TRUE);
2183 take_turn(attacker_ptr, 100);
2185 if (!attacker_ptr->migite && !attacker_ptr->hidarite &&
2186 !(attacker_ptr->muta2 & (MUT2_HORNS | MUT2_BEAK | MUT2_SCOR_TAIL | MUT2_TRUNK | MUT2_TENTACLES)))
2188 msg_format(_("%s攻撃できない。", "You cannot do attacking."),
2189 (empty_hands(attacker_ptr, FALSE) == EMPTY_HAND_NONE) ? _("両手がふさがって", "") : "");
2193 monster_desc(m_name, m_ptr, 0);
2197 /* Auto-Recall if possible and visible */
2198 if (!attacker_ptr->image) monster_race_track(m_ptr->ap_r_idx);
2200 health_track(g_ptr->m_idx);
2203 if ((r_ptr->flags1 & RF1_FEMALE) &&
2204 !(attacker_ptr->stun || attacker_ptr->confused || attacker_ptr->image || !m_ptr->ml))
2206 if ((attacker_ptr->inventory_list[INVEN_RARM].name1 == ART_ZANTETSU) || (attacker_ptr->inventory_list[INVEN_LARM].name1 == ART_ZANTETSU))
2208 msg_print(_("拙者、おなごは斬れぬ!", "I can not attack women!"));
2213 if (d_info[attacker_ptr->dungeon_idx].flags1 & DF1_NO_MELEE)
2215 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));
2219 /* Stop if friendly */
2220 if (!is_hostile(m_ptr) &&
2221 !(attacker_ptr->stun || attacker_ptr->confused || attacker_ptr->image ||
2222 attacker_ptr->shero || !m_ptr->ml))
2224 if (attacker_ptr->inventory_list[INVEN_RARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
2225 if (attacker_ptr->inventory_list[INVEN_LARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
2228 msg_format(_("黒い刃は強欲に%sを攻撃した!", "Your black blade greedily attacks %s!"), m_name);
2229 chg_virtue(attacker_ptr, V_INDIVIDUALISM, 1);
2230 chg_virtue(attacker_ptr, V_HONOUR, -1);
2231 chg_virtue(attacker_ptr, V_JUSTICE, -1);
2232 chg_virtue(attacker_ptr, V_COMPASSION, -1);
2234 else if (attacker_ptr->pclass != CLASS_BERSERKER)
2236 if (get_check(_("本当に攻撃しますか?", "Really hit it? ")))
2238 chg_virtue(attacker_ptr, V_INDIVIDUALISM, 1);
2239 chg_virtue(attacker_ptr, V_HONOUR, -1);
2240 chg_virtue(attacker_ptr, V_JUSTICE, -1);
2241 chg_virtue(attacker_ptr, V_COMPASSION, -1);
2245 msg_format(_("%sを攻撃するのを止めた。", "You stop to avoid hitting %s."), m_name);
2252 /* Handle player fear */
2253 if (attacker_ptr->afraid)
2256 msg_format(_("恐くて%sを攻撃できない!", "You are too afraid to attack %s!"), m_name);
2258 msg_format(_("そっちには何か恐いものがいる!", "There is something scary in your way!"));
2260 /* Disturb the monster */
2261 (void)set_monster_csleep(g_ptr->m_idx, 0);
2266 if (MON_CSLEEP(m_ptr)) /* It is not honorable etc to attack helpless victims */
2268 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(attacker_ptr, V_COMPASSION, -1);
2269 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(attacker_ptr, V_HONOUR, -1);
2272 if (attacker_ptr->migite && attacker_ptr->hidarite)
2274 if ((attacker_ptr->skill_exp[GINOU_NITOURYU] < s_info[attacker_ptr->pclass].s_max[GINOU_NITOURYU]) && ((attacker_ptr->skill_exp[GINOU_NITOURYU] - 1000) / 200 < r_ptr->level))
2276 if (attacker_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_BEGINNER)
2277 attacker_ptr->skill_exp[GINOU_NITOURYU] += 80;
2278 else if (attacker_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_SKILLED)
2279 attacker_ptr->skill_exp[GINOU_NITOURYU] += 4;
2280 else if (attacker_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_EXPERT)
2281 attacker_ptr->skill_exp[GINOU_NITOURYU] += 1;
2282 else if (attacker_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_MASTER)
2283 if (one_in_(3)) attacker_ptr->skill_exp[GINOU_NITOURYU] += 1;
2284 attacker_ptr->update |= (PU_BONUS);
2288 /* Gain riding experience */
2289 if (attacker_ptr->riding)
2291 int cur = attacker_ptr->skill_exp[GINOU_RIDING];
2292 int max = s_info[attacker_ptr->pclass].s_max[GINOU_RIDING];
2296 DEPTH ridinglevel = r_info[attacker_ptr->current_floor_ptr->m_list[attacker_ptr->riding].r_idx].level;
2297 DEPTH targetlevel = r_ptr->level;
2300 if ((cur / 200 - 5) < targetlevel)
2303 /* Extra experience */
2304 if ((cur / 100) < ridinglevel)
2306 if ((cur / 100 + 15) < ridinglevel)
2307 inc += 1 + (ridinglevel - (cur / 100 + 15));
2312 attacker_ptr->skill_exp[GINOU_RIDING] = MIN(max, cur + inc);
2313 attacker_ptr->update |= (PU_BONUS);
2317 attacker_ptr->riding_t_m_idx = g_ptr->m_idx;
2318 if (attacker_ptr->migite) py_attack_aux(attacker_ptr, y, x, &fear, &mdeath, 0, mode);
2319 if (attacker_ptr->hidarite && !mdeath) py_attack_aux(attacker_ptr, y, x, &fear, &mdeath, 1, mode);
2321 /* Mutations which yield extra 'natural' attacks */
2324 if ((attacker_ptr->muta2 & MUT2_HORNS) && !mdeath)
2325 natural_attack(g_ptr->m_idx, MUT2_HORNS, &fear, &mdeath);
2326 if ((attacker_ptr->muta2 & MUT2_BEAK) && !mdeath)
2327 natural_attack(g_ptr->m_idx, MUT2_BEAK, &fear, &mdeath);
2328 if ((attacker_ptr->muta2 & MUT2_SCOR_TAIL) && !mdeath)
2329 natural_attack(g_ptr->m_idx, MUT2_SCOR_TAIL, &fear, &mdeath);
2330 if ((attacker_ptr->muta2 & MUT2_TRUNK) && !mdeath)
2331 natural_attack(g_ptr->m_idx, MUT2_TRUNK, &fear, &mdeath);
2332 if ((attacker_ptr->muta2 & MUT2_TENTACLES) && !mdeath)
2333 natural_attack(g_ptr->m_idx, MUT2_TENTACLES, &fear, &mdeath);
2336 /* Hack -- delay fear messages */
2337 if (fear && m_ptr->ml && !mdeath)
2341 msg_format(_("%^sは恐怖して逃げ出した!", "%^s flees in terror!"), m_name);
2344 if ((attacker_ptr->special_defense & KATA_IAI) && ((mode != HISSATSU_IAI) || mdeath))
2346 set_action(attacker_ptr, ACTION_NONE);
2353 * @brief モンスターからプレイヤーへの打撃処理 / Attack the player via physical attacks.
2354 * @param m_idx 打撃を行うモンスターのID
2355 * @return 実際に攻撃処理を行った場合TRUEを返す
2357 bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
2359 monster_type *m_ptr = &p_ptr->current_floor_ptr->m_list[m_idx];
2360 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2368 int do_cut, do_stun;
2372 GAME_TEXT o_name[MAX_NLEN];
2373 GAME_TEXT m_name[MAX_NLEN];
2374 GAME_TEXT ddesc[80];
2377 bool touched = FALSE, fear = FALSE, alive = TRUE;
2378 bool explode = FALSE;
2379 bool do_silly_attack = (one_in_(2) && target_ptr->image);
2380 HIT_POINT get_damage = 0;
2381 int abbreviate = 0; // 2回目以降の省略表現フラグ
2383 /* Not allowed to attack */
2384 if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return (FALSE);
2386 if (d_info[target_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) return (FALSE);
2388 /* ...nor if friendly */
2389 if (!is_hostile(m_ptr)) return FALSE;
2391 /* Extract the effective monster level */
2392 rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
2394 /* Get the monster name (or "it") */
2395 monster_desc(m_name, m_ptr, 0);
2397 monster_desc(ddesc, m_ptr, MD_WRONGDOER_NAME);
2399 if (target_ptr->special_defense & KATA_IAI)
2401 msg_format(_("相手が襲いかかる前に素早く武器を振るった。", "You took sen, draw and cut in one motion before %s move."), m_name);
2402 if (py_attack(target_ptr, m_ptr->fy, m_ptr->fx, HISSATSU_IAI)) return TRUE;
2405 if ((target_ptr->special_defense & NINJA_KAWARIMI) && (randint0(55) < (target_ptr->lev*3/5+20)))
2407 if (kawarimi(target_ptr, TRUE)) return TRUE;
2410 /* Assume no blink */
2413 /* Scan through all four blows */
2414 for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
2416 bool obvious = FALSE;
2418 HIT_POINT power = 0;
2419 HIT_POINT damage = 0;
2423 /* Extract the attack infomation */
2424 int effect = r_ptr->blow[ap_cnt].effect;
2425 int method = r_ptr->blow[ap_cnt].method;
2426 int d_dice = r_ptr->blow[ap_cnt].d_dice;
2427 int d_side = r_ptr->blow[ap_cnt].d_side;
2429 if (!monster_is_valid(m_ptr)) break;
2431 /* Hack -- no more attacks */
2434 if (is_pet(m_ptr) && (r_ptr->flags1 & RF1_UNIQUE) && (method == RBM_EXPLODE))
2440 /* Stop if player is dead or gone */
2441 if (!target_ptr->playing || target_ptr->is_dead) break;
2442 if (distance(target_ptr->y, target_ptr->x, m_ptr->fy, m_ptr->fx) > 1) break;
2444 /* Handle "leaving" */
2445 if (target_ptr->leaving) break;
2447 if (method == RBM_SHOOT) continue;
2449 /* Extract the attack "power" */
2450 power = mbe_info[effect].power;
2453 ac = target_ptr->ac + target_ptr->to_a;
2455 /* Monster hits player */
2456 if (!effect || check_hit(target_ptr, power, rlev, MON_STUNNED(m_ptr)))
2458 /* Always disturbing */
2459 disturb(target_ptr, TRUE, TRUE);
2462 /* Hack -- Apply "protection from evil" */
2463 if ((target_ptr->protevil > 0) &&
2464 (r_ptr->flags3 & RF3_EVIL) &&
2465 (target_ptr->lev >= rlev) &&
2466 ((randint0(100) + target_ptr->lev) > 50))
2468 /* Remember the Evil-ness */
2469 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_EVIL;
2472 if (abbreviate) msg_format("撃退した。");
2473 else msg_format("%^sは撃退された。", m_name);
2474 abbreviate = 1; /*2回目以降は省略 */
2476 msg_format("%^s is repelled.", m_name);
2480 /* Hack -- Next attack */
2485 /* Assume no cut or stun */
2486 do_cut = do_stun = 0;
2488 /* Describe the attack method */
2493 act = _("殴られた。", "hits you.");
2494 do_cut = do_stun = 1;
2502 act = _("触られた。", "touches you.");
2510 act = _("パンチされた。", "punches you.");
2519 act = _("蹴られた。", "kicks you.");
2528 act = _("ひっかかれた。", "claws you.");
2537 act = _("噛まれた。", "bites you.");
2546 act = _("刺された。", "stings you.");
2554 act = _("斬られた。", "slashes you.");
2563 act = _("角で突かれた。", "butts you.");
2572 act = _("体当たりされた。", "crushes you.");
2581 act = _("飲み込まれた。", "engulfs you.");
2590 act = _("は請求書をよこした。", "charges you.");
2592 sound(SOUND_BUY); /* Note! This is "charges", not "charges at". */
2599 act = _("が体の上を這い回った。", "crawls on you.");
2607 act = _("よだれをたらされた。", "drools on you.");
2614 act = _("唾を吐かれた。", "spits on you.");
2622 act = _("は爆発した。", "explodes.");
2629 act = _("にらまれた。", "gazes at you.");
2635 act = _("泣き叫ばれた。", "wails at you.");
2642 act = _("胞子を飛ばされた。", "releases spores at you.");
2650 act = _("が XXX4 を発射した。", "projects XXX4's at you.");
2656 act = _("金をせがまれた。", "begs you for money.");
2666 act = desc_insult[randint0(m_ptr->r_idx == MON_DEBBY ? 10 : 8)];
2676 act = desc_moan[randint0(4)];
2686 if (m_ptr->r_idx == MON_JAIAN)
2689 switch(randint1(15))
2694 act = "「♪お~れはジャイアン~~ガ~キだいしょう~」";
2697 act = "「♪て~んかむ~てきのお~とこだぜ~~」";
2700 act = "「♪の~び太スネ夫はメじゃないよ~~」";
2703 act = "「♪け~んかスポ~ツ~どんとこい~」";
2706 act = "「♪うた~も~~う~まいぜ~まかしとけ~」";
2709 act = "「♪ま~ちいちば~んのに~んきもの~~」";
2712 act = "「♪べんきょうしゅくだいメじゃないよ~~」";
2715 act = "「♪きはやさし~くて~ち~からもち~」";
2718 act = "「♪かお~も~~スタイルも~バツグンさ~」";
2721 act = "「♪がっこうい~ちの~あ~ばれんぼう~~」";
2724 act = "「♪ド~ラもドラミもメじゃないよ~~」";
2727 act = "「♪よじげんぽけっと~な~くたって~」";
2730 act = "「♪あし~の~~ながさ~は~まけないぜ~」";
2734 act = "horribly sings 'I AM GIAAAAAN. THE BOOOSS OF THE KIIIIDS.'";
2740 act = _("は♪僕らは楽しい家族♪と歌っている。", "sings 'We are a happy family.'");
2742 act = _("は♪アイ ラブ ユー、ユー ラブ ミー♪と歌っている。", "sings 'I love you, you love me.'");
2752 if (do_silly_attack)
2757 act = silly_attacks[randint0(MAX_SILLY_ATTACK)];
2760 if (abbreviate == 0)
2761 msg_format("%^sに%s", m_name, act);
2762 else if (abbreviate == 1)
2763 msg_format("%s", act);
2764 else /* if (abbreviate == -1) */
2765 msg_format("%^s%s", m_name, act);
2766 abbreviate = 1;/*2回目以降は省略 */
2768 msg_format("%^s %s%s", m_name, act, do_silly_attack ? " you." : "");
2772 /* Hack -- assume all attacks are obvious */
2775 /* Roll out the damage */
2776 damage = damroll(d_dice, d_side);
2779 * Skip the effect when exploding, since the explosion
2780 * already causes the effect.
2782 if(explode) damage = 0;
2783 /* Apply appropriate damage */
2793 case RBE_SUPERHURT: /* AC軽減あり / Player armor reduces total damage */
2795 if (((randint1(rlev*2+300) > (ac+200)) || one_in_(13)) && !CHECK_MULTISHADOW(target_ptr))
2797 int tmp_damage = damage - (damage * ((ac < 150) ? ac : 150) / 250);
2798 msg_print(_("痛恨の一撃!", "It was a critical hit!"));
2799 tmp_damage = MAX(damage, tmp_damage*2);
2801 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, tmp_damage, ddesc, -1);
2805 case RBE_HURT: /* AC軽減あり / Player armor reduces total damage */
2808 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
2809 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2817 /* Take "poison" effect */
2818 if (!(target_ptr->resist_pois || IS_OPPOSE_POIS()) && !CHECK_MULTISHADOW(target_ptr))
2820 if (set_poisoned(target_ptr, target_ptr->poisoned + randint1(rlev) + 5))
2826 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2828 /* Learn about the player */
2829 update_smart_learn(m_idx, DRS_POIS);
2838 /* Allow complete resist */
2839 if (!target_ptr->resist_disen && !CHECK_MULTISHADOW(target_ptr))
2841 /* Apply disenchantment */
2842 if (apply_disenchant(target_ptr, 0))
2844 /* Hack -- Update AC */
2845 update_creature(target_ptr);
2850 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2852 /* Learn about the player */
2853 update_smart_learn(m_idx, DRS_DISEN);
2860 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2862 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
2865 for (k = 0; k < 10; k++)
2868 i = (INVENTORY_IDX)randint0(INVEN_PACK);
2870 /* Obtain the item */
2871 o_ptr = &target_ptr->inventory_list[i];
2872 if (!o_ptr->k_idx) continue;
2874 /* Drain charged wands/staffs */
2875 if (((o_ptr->tval == TV_STAFF) ||
2876 (o_ptr->tval == TV_WAND)) &&
2879 /* Calculate healed hitpoints */
2880 int heal=rlev * o_ptr->pval;
2881 if( o_ptr->tval == TV_STAFF)
2882 heal *= o_ptr->number;
2884 /* Don't heal more than max hp */
2885 heal = MIN(heal, m_ptr->maxhp - m_ptr->hp);
2887 msg_print(_("ザックからエネルギーが吸い取られた!", "Energy drains from your pack!"));
2891 /* Heal the monster */
2892 m_ptr->hp += (HIT_POINT)heal;
2894 /* Redraw (later) if needed */
2895 if (target_ptr->health_who == m_idx) target_ptr->redraw |= (PR_HEALTH);
2896 if (target_ptr->riding == m_idx) target_ptr->redraw |= (PR_UHEALTH);
2901 /* Combine / Reorder the pack */
2902 target_ptr->update |= (PU_COMBINE | PU_REORDER);
2903 target_ptr->window |= (PW_INVEN);
2914 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2916 /* Confused monsters cannot steal successfully. -LM-*/
2917 if (MON_CONFUSED(m_ptr)) break;
2919 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
2923 /* Saving throw (unless paralyzed) based on dex and level */
2924 if (!target_ptr->paralyzed &&
2925 (randint0(100) < (adj_dex_safe[target_ptr->stat_ind[A_DEX]] +
2928 /* Saving throw message */
2929 msg_print(_("しかし素早く財布を守った!", "You quickly protect your money pouch!"));
2931 /* Occasional blink anyway */
2932 if (randint0(3)) blinked = TRUE;
2938 gold = (target_ptr->au / 10) + randint1(25);
2939 if (gold < 2) gold = 2;
2940 if (gold > 5000) gold = (target_ptr->au / 20) + randint1(3000);
2941 if (gold > target_ptr->au) gold = target_ptr->au;
2942 target_ptr->au -= gold;
2945 msg_print(_("しかし何も盗まれなかった。", "Nothing was stolen."));
2947 else if (target_ptr->au)
2949 msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2950 msg_format(_("$%ld のお金が盗まれた!", "%ld coins were stolen!"), (long)gold);
2951 chg_virtue(target_ptr, V_SACRIFICE, 1);
2955 msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2956 msg_print(_("お金が全部盗まれた!", "All of your coins were stolen!"));
2957 chg_virtue(target_ptr, V_SACRIFICE, 2);
2961 target_ptr->redraw |= (PR_GOLD);
2963 target_ptr->window |= (PW_PLAYER);
2974 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2976 /* Confused monsters cannot steal successfully. -LM-*/
2977 if (MON_CONFUSED(m_ptr)) break;
2979 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
2981 /* Saving throw (unless paralyzed) based on dex and level */
2982 if (!target_ptr->paralyzed && (randint0(100) < (adj_dex_safe[target_ptr->stat_ind[A_DEX]] + target_ptr->lev)))
2984 /* Saving throw message */
2985 msg_print(_("しかしあわててザックを取り返した!", "You grab hold of your backpack!"));
2987 /* Occasional "blink" anyway */
2994 for (k = 0; k < 10; k++)
2999 i = (INVENTORY_IDX)randint0(INVEN_PACK);
3001 /* Obtain the item */
3002 o_ptr = &target_ptr->inventory_list[i];
3003 if (!o_ptr->k_idx) continue;
3005 /* Skip artifacts */
3006 if (object_is_artifact(o_ptr)) continue;
3008 object_desc(o_name, o_ptr, OD_OMIT_PREFIX);
3011 msg_format("%s(%c)を%s盗まれた!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
3013 msg_format("%sour %s (%c) was stolen!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
3015 chg_virtue(target_ptr, V_SACRIFICE, 1);
3016 o_idx = o_pop(target_ptr->current_floor_ptr);
3022 j_ptr = &p_ptr->current_floor_ptr->o_list[o_idx];
3023 object_copy(j_ptr, o_ptr);
3028 /* Hack -- If a rod or wand, allocate total
3029 * maximum timeouts or charges between those
3030 * stolen and those missed. -LM-
3032 if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
3034 j_ptr->pval = o_ptr->pval / o_ptr->number;
3035 o_ptr->pval -= j_ptr->pval;
3039 j_ptr->marked = OM_TOUCHED;
3041 /* Memorize monster */
3042 j_ptr->held_m_idx = m_idx;
3045 j_ptr->next_o_idx = m_ptr->hold_o_idx;
3048 m_ptr->hold_o_idx = o_idx;
3051 /* Steal the items */
3052 inven_item_increase(i, -1);
3053 inven_item_optimize(i);
3068 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3070 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3072 /* Steal some food */
3073 for (k = 0; k < 10; k++)
3075 /* Pick an item from the pack */
3076 i = (INVENTORY_IDX)randint0(INVEN_PACK);
3078 o_ptr = &target_ptr->inventory_list[i];
3079 if (!o_ptr->k_idx) continue;
3081 /* Skip non-food objects */
3082 if ((o_ptr->tval != TV_FOOD) && !((o_ptr->tval == TV_CORPSE) && (o_ptr->sval))) continue;
3084 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
3087 msg_format("%s(%c)を%s食べられてしまった!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
3089 msg_format("%sour %s (%c) was eaten!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
3092 /* Steal the items */
3093 inven_item_increase(i, -1);
3094 inven_item_optimize(i);
3106 /* Access the lite */
3107 o_ptr = &target_ptr->inventory_list[INVEN_LITE];
3108 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3110 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3113 if ((o_ptr->xtra4 > 0) && (!object_is_fixed_artifact(o_ptr)))
3116 o_ptr->xtra4 -= (s16b)(250 + randint1(250));
3117 if (o_ptr->xtra4 < 1) o_ptr->xtra4 = 1;
3119 if (!target_ptr->blind)
3121 msg_print(_("明かりが暗くなってしまった。", "Your light dims."));
3125 target_ptr->window |= (PW_EQUIP);
3135 msg_print(_("酸を浴びせられた!", "You are covered in acid!"));
3136 get_damage += acid_dam(target_ptr, damage, ddesc, -1, FALSE);
3137 update_creature(target_ptr);
3138 update_smart_learn(m_idx, DRS_ACID);
3146 msg_print(_("電撃を浴びせられた!", "You are struck by electricity!"));
3147 get_damage += elec_dam(target_ptr, damage, ddesc, -1, FALSE);
3148 update_smart_learn(m_idx, DRS_ELEC);
3156 msg_print(_("全身が炎に包まれた!", "You are enveloped in flames!"));
3157 get_damage += fire_dam(target_ptr, damage, ddesc, -1, FALSE);
3158 update_smart_learn(m_idx, DRS_FIRE);
3166 msg_print(_("全身が冷気で覆われた!", "You are covered with frost!"));
3167 get_damage += cold_dam(target_ptr, damage, ddesc, -1, FALSE);
3168 update_smart_learn(m_idx, DRS_COLD);
3174 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3175 if (target_ptr->is_dead) break;
3177 /* Increase "blind" */
3178 if (!target_ptr->resist_blind && !CHECK_MULTISHADOW(target_ptr))
3180 if (set_blind(target_ptr, target_ptr->blind + 10 + randint1(rlev)))
3183 if (m_ptr->r_idx == MON_DIO) msg_print("どうだッ!この血の目潰しはッ!");
3191 /* Learn about the player */
3192 update_smart_learn(m_idx, DRS_BLIND);
3200 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3202 if (target_ptr->is_dead) break;
3204 /* Increase "confused" */
3205 if (!target_ptr->resist_conf && !CHECK_MULTISHADOW(target_ptr))
3207 if (set_confused(target_ptr, target_ptr->confused + 3 + randint1(rlev)))
3213 /* Learn about the player */
3214 update_smart_learn(m_idx, DRS_CONF);
3221 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3223 if (target_ptr->is_dead) break;
3225 /* Increase "afraid" */
3226 if (CHECK_MULTISHADOW(target_ptr))
3230 else if (target_ptr->resist_fear)
3232 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
3235 else if (randint0(100 + r_ptr->level/2) < target_ptr->skill_sav)
3237 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
3242 if (set_afraid(target_ptr, target_ptr->afraid + 3 + randint1(rlev)))
3248 /* Learn about the player */
3249 update_smart_learn(m_idx, DRS_FEAR);
3256 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3258 if (target_ptr->is_dead) break;
3260 /* Increase "paralyzed" */
3261 if (CHECK_MULTISHADOW(target_ptr))
3265 else if (target_ptr->free_act)
3267 msg_print(_("しかし効果がなかった!", "You are unaffected!"));
3270 else if (randint0(100 + r_ptr->level/2) < target_ptr->skill_sav)
3272 msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
3277 if (!target_ptr->paralyzed)
3279 if (set_paralyzed(target_ptr, 3 + randint1(rlev)))
3286 /* Learn about the player */
3287 update_smart_learn(m_idx, DRS_FREE);
3294 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3296 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3297 if (do_dec_stat(target_ptr, A_STR)) obvious = TRUE;
3304 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3306 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3307 if (do_dec_stat(target_ptr, A_INT)) obvious = TRUE;
3314 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3316 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3317 if (do_dec_stat(target_ptr, A_WIS)) obvious = TRUE;
3324 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3326 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3327 if (do_dec_stat(target_ptr, A_DEX)) obvious = TRUE;
3334 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3336 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3337 if (do_dec_stat(target_ptr, A_CON)) obvious = TRUE;
3344 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3346 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3347 if (do_dec_stat(target_ptr, A_CHR)) obvious = TRUE;
3354 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3356 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3358 /* Damage (stats) */
3359 if (do_dec_stat(target_ptr, A_STR)) obvious = TRUE;
3360 if (do_dec_stat(target_ptr, A_DEX)) obvious = TRUE;
3361 if (do_dec_stat(target_ptr, A_CON)) obvious = TRUE;
3362 if (do_dec_stat(target_ptr, A_INT)) obvious = TRUE;
3363 if (do_dec_stat(target_ptr, A_WIS)) obvious = TRUE;
3364 if (do_dec_stat(target_ptr, A_CHR)) obvious = TRUE;
3373 /* Hack -- Reduce damage based on the player armor class */
3374 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
3376 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3378 /* Radius 8 earthquake centered at the monster */
3379 if (damage > 23 || explode)
3381 earthquake(target_ptr, m_ptr->fy, m_ptr->fx, 8, m_idx);
3389 s32b d = damroll(10, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3393 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3395 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3397 (void)drain_exp(target_ptr, d, d / 10, 95);
3403 s32b d = damroll(20, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3407 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3409 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3411 (void)drain_exp(target_ptr, d, d / 10, 90);
3417 s32b d = damroll(40, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3421 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3423 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3425 (void)drain_exp(target_ptr, d, d / 10, 75);
3431 s32b d = damroll(80, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3435 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3437 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3439 (void)drain_exp(target_ptr, d, d / 10, 50);
3445 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3447 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3449 /* Take "poison" effect */
3450 if (!(target_ptr->resist_pois || IS_OPPOSE_POIS()))
3452 if (set_poisoned(target_ptr, target_ptr->poisoned + randint1(rlev) + 5))
3458 /* Damage CON (10% chance)*/
3459 if ((randint1(100) < 11) && (target_ptr->prace != RACE_ANDROID))
3461 /* 1% chance for perm. damage */
3462 bool perm = one_in_(10);
3463 if (dec_stat(target_ptr, A_CON, randint1(10), perm))
3465 msg_print(_("病があなたを蝕んでいる気がする。", "You feel strange sickness."));
3475 if (!target_ptr->resist_time && !CHECK_MULTISHADOW(target_ptr))
3477 switch (randint1(10))
3479 case 1: case 2: case 3: case 4: case 5:
3481 if (target_ptr->prace == RACE_ANDROID) break;
3482 msg_print(_("人生が逆戻りした気がする。", "You feel life has clocked back."));
3483 lose_exp(target_ptr, 100 + (target_ptr->exp / 100) * MON_DRAIN_LIFE);
3487 case 6: case 7: case 8: case 9:
3489 int stat = randint0(6);
3494 case A_STR: act = "強く"; break;
3495 case A_INT: act = "聡明で"; break;
3496 case A_WIS: act = "賢明で"; break;
3497 case A_DEX: act = "器用で"; break;
3498 case A_CON: act = "健康で"; break;
3499 case A_CHR: act = "美しく"; break;
3501 case A_STR: act = "strong"; break;
3502 case A_INT: act = "bright"; break;
3503 case A_WIS: act = "wise"; break;
3504 case A_DEX: act = "agile"; break;
3505 case A_CON: act = "hale"; break;
3506 case A_CHR: act = "beautiful"; break;
3511 msg_format(_("あなたは以前ほど%sなくなってしまった...。", "You're not as %s as you used to be..."), act);
3512 target_ptr->stat_cur[stat] = (target_ptr->stat_cur[stat] * 3) / 4;
3513 if (target_ptr->stat_cur[stat] < 3) target_ptr->stat_cur[stat] = 3;
3514 target_ptr->update |= (PU_BONUS);
3520 msg_print(_("あなたは以前ほど力強くなくなってしまった...。", "You're not as powerful as you used to be..."));
3522 for (k = 0; k < A_MAX; k++)
3524 target_ptr->stat_cur[k] = (target_ptr->stat_cur[k] * 7) / 8;
3525 if (target_ptr->stat_cur[k] < 3) target_ptr->stat_cur[k] = 3;
3527 target_ptr->update |= (PU_BONUS);
3532 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3538 s32b d = damroll(60, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3543 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3545 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3547 resist_drain = !drain_exp(target_ptr, d, d / 10, 50);
3549 /* Heal the attacker? */
3550 if (target_ptr->mimic_form)
3552 if (mimic_info[target_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
3553 resist_drain = TRUE;
3557 switch (target_ptr->prace)
3566 resist_drain = TRUE;
3571 if ((damage > 5) && !resist_drain)
3573 bool did_heal = FALSE;
3575 if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
3578 m_ptr->hp += damroll(4, damage / 6);
3579 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
3581 /* Redraw (later) if needed */
3582 if (target_ptr->health_who == m_idx) target_ptr->redraw |= (PR_HEALTH);
3583 if (target_ptr->riding == m_idx) target_ptr->redraw |= (PR_UHEALTH);
3585 /* Special message */
3586 if (m_ptr->ml && did_heal)
3588 msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), m_name);
3598 if (CHECK_MULTISHADOW(target_ptr))
3600 msg_print(_("攻撃は幻影に命中し、あなたには届かなかった。", "The attack hits Shadow, you are unharmed!"));
3606 target_ptr->csp -= damage;
3607 if (target_ptr->csp < 0)
3609 target_ptr->csp = 0;
3610 target_ptr->csp_frac = 0;
3613 target_ptr->redraw |= (PR_MANA);
3616 /* Learn about the player */
3617 update_smart_learn(m_idx, DRS_MANA);
3623 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3625 if (target_ptr->is_dead) break;
3627 /* Decrease speed */
3628 if (CHECK_MULTISHADOW(target_ptr))
3634 if (set_slow(target_ptr, (target_ptr->slow + 4 + randint0(rlev / 10)), FALSE))
3644 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3646 if (target_ptr->is_dead) break;
3648 /* Decrease speed */
3649 if (target_ptr->resist_sound || CHECK_MULTISHADOW(target_ptr))
3655 if (set_stun(target_ptr, target_ptr->stun + 10 + randint1(r_ptr->level / 4)))
3665 /* Hack -- only one of cut or stun */
3666 if (do_cut && do_stun)
3669 if (randint0(100) < 50)
3686 /* Critical hit (zero if non-critical) */
3687 tmp = monster_critical(d_dice, d_side, damage);
3689 /* Roll for damage */
3692 case 0: cut_plus = 0; break;
3693 case 1: cut_plus = randint1(5); break;
3694 case 2: cut_plus = randint1(5) + 5; break;
3695 case 3: cut_plus = randint1(20) + 20; break;
3696 case 4: cut_plus = randint1(50) + 50; break;
3697 case 5: cut_plus = randint1(100) + 100; break;
3698 case 6: cut_plus = 300; break;
3699 default: cut_plus = 500; break;
3703 if (cut_plus) (void)set_cut(target_ptr,target_ptr->cut + cut_plus);
3711 /* Critical hit (zero if non-critical) */
3712 tmp = monster_critical(d_dice, d_side, damage);
3714 /* Roll for damage */
3717 case 0: stun_plus = 0; break;
3718 case 1: stun_plus = randint1(5); break;
3719 case 2: stun_plus = randint1(5) + 10; break;
3720 case 3: stun_plus = randint1(10) + 20; break;
3721 case 4: stun_plus = randint1(15) + 30; break;
3722 case 5: stun_plus = randint1(20) + 40; break;
3723 case 6: stun_plus = 80; break;
3724 default: stun_plus = 150; break;
3727 /* Apply the stun */
3728 if (stun_plus) (void)set_stun(target_ptr, target_ptr->stun + stun_plus);
3733 sound(SOUND_EXPLODE);
3735 if (mon_take_hit(m_idx, m_ptr->hp + 1, &fear, NULL))
3744 if (target_ptr->sh_fire && alive && !target_ptr->is_dead)
3746 if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK))
3748 HIT_POINT dam = damroll(2, 6);
3750 /* Modify the damage */
3751 dam = mon_damage_mod(m_ptr, dam, FALSE);
3753 msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), m_name);
3755 if (mon_take_hit(m_idx, dam, &fear, _("は灰の山になった。", " turns into a pile of ash.")))
3763 if (is_original_ap_and_seen(m_ptr))
3764 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
3768 if (target_ptr->sh_elec && alive && !target_ptr->is_dead)
3770 if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK))
3772 HIT_POINT dam = damroll(2, 6);
3774 /* Modify the damage */
3775 dam = mon_damage_mod(m_ptr, dam, FALSE);
3777 msg_format(_("%^sは電撃をくらった!", "%^s gets zapped!"), m_name);
3778 if (mon_take_hit(m_idx, dam, &fear, _("は燃え殻の山になった。", " turns into a pile of cinder.")))
3786 if (is_original_ap_and_seen(m_ptr))
3787 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
3791 if (target_ptr->sh_cold && alive && !target_ptr->is_dead)
3793 if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK))
3795 HIT_POINT dam = damroll(2, 6);
3797 /* Modify the damage */
3798 dam = mon_damage_mod(m_ptr, dam, FALSE);
3800 msg_format(_("%^sは冷気をくらった!", "%^s is very cold!"), m_name);
3801 if (mon_take_hit(m_idx, dam, &fear, _("は凍りついた。", " was frozen.")))
3809 if (is_original_ap_and_seen(m_ptr))
3810 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
3815 if (target_ptr->dustrobe && alive && !target_ptr->is_dead)
3817 if (!(r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK))
3819 HIT_POINT dam = damroll(2, 6);
3821 /* Modify the damage */
3822 dam = mon_damage_mod(m_ptr, dam, FALSE);
3824 msg_format(_("%^sは鏡の破片をくらった!", "%^s gets zapped!"), m_name);
3825 if (mon_take_hit(m_idx, dam, &fear, _("はズタズタになった。", " had torn to pieces.")))
3833 if (is_original_ap_and_seen(m_ptr))
3834 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK);
3837 if (is_mirror_grid(&p_ptr->current_floor_ptr->grid_array[target_ptr->y][target_ptr->x]))
3839 teleport_player(target_ptr, 10, 0L);
3843 if (target_ptr->tim_sh_holy && alive && !target_ptr->is_dead)
3845 if (r_ptr->flags3 & RF3_EVIL)
3847 if (!(r_ptr->flagsr & RFR_RES_ALL))
3849 HIT_POINT dam = damroll(2, 6);
3851 /* Modify the damage */
3852 dam = mon_damage_mod(m_ptr, dam, FALSE);
3854 msg_format(_("%^sは聖なるオーラで傷ついた!", "%^s is injured by holy power!"), m_name);
3855 if (mon_take_hit(m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3860 if (is_original_ap_and_seen(m_ptr))
3861 r_ptr->r_flags3 |= RF3_EVIL;
3865 if (is_original_ap_and_seen(m_ptr))
3866 r_ptr->r_flagsr |= RFR_RES_ALL;
3871 if (target_ptr->tim_sh_touki && alive && !target_ptr->is_dead)
3873 if (!(r_ptr->flagsr & RFR_RES_ALL))
3875 HIT_POINT dam = damroll(2, 6);
3877 /* Modify the damage */
3878 dam = mon_damage_mod(m_ptr, dam, FALSE);
3880 msg_format(_("%^sが鋭い闘気のオーラで傷ついた!", "%^s is injured by the Force"), m_name);
3881 if (mon_take_hit(m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3889 if (is_original_ap_and_seen(m_ptr))
3890 r_ptr->r_flagsr |= RFR_RES_ALL;
3894 if (hex_spelling(HEX_SHADOW_CLOAK) && alive && !target_ptr->is_dead)
3897 object_type *o_armed_ptr = &target_ptr->inventory_list[INVEN_RARM];
3899 if (!(r_ptr->flagsr & RFR_RES_ALL || r_ptr->flagsr & RFR_RES_DARK))
3901 if (o_armed_ptr->k_idx)
3903 int basedam = ((o_armed_ptr->dd + target_ptr->to_dd[0]) * (o_armed_ptr->ds + target_ptr->to_ds[0] + 1));
3904 dam = basedam / 2 + o_armed_ptr->to_d + target_ptr->to_d[0];
3907 /* Cursed armor makes damages doubled */
3908 o_armed_ptr = &target_ptr->inventory_list[INVEN_BODY];
3909 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr)) dam *= 2;
3911 /* Modify the damage */
3912 dam = mon_damage_mod(m_ptr, dam, FALSE);
3914 msg_format(_("影のオーラが%^sに反撃した!", "Enveloped shadows attack %^s."), m_name);
3915 if (mon_take_hit(m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3920 else /* monster does not dead */
3923 BIT_FLAGS flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
3924 EFFECT_ID typ[4][2] = {
3925 { INVEN_HEAD, GF_OLD_CONF },
3926 { INVEN_LARM, GF_OLD_SLEEP },
3927 { INVEN_HANDS, GF_TURN_ALL },
3928 { INVEN_FEET, GF_OLD_SLOW }
3931 /* Some cursed armours gives an extra effect */
3932 for (j = 0; j < 4; j++)
3934 o_armed_ptr = &target_ptr->inventory_list[typ[j][0]];
3935 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr) && object_is_armour(o_armed_ptr))
3936 project(target_ptr, 0, 0, m_ptr->fy, m_ptr->fx, (target_ptr->lev * 2), typ[j][1], flg, -1);
3942 if (is_original_ap_and_seen(m_ptr))
3943 r_ptr->r_flagsr |= (RFR_RES_ALL | RFR_RES_DARK);
3949 /* Monster missed player */
3952 /* Analyze failed attacks */
3968 /* Visible monsters */
3971 disturb(target_ptr, TRUE, TRUE);
3975 msg_format("%sかわした。", (target_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "");
3977 msg_format("%s%^sの攻撃をかわした。", (target_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "", m_name);
3978 abbreviate = 1;/*2回目以降は省略 */
3980 msg_format("%^s misses you.", m_name);
3985 /* Gain shield experience */
3986 if (object_is_armour(&target_ptr->inventory_list[INVEN_RARM]) || object_is_armour(&target_ptr->inventory_list[INVEN_LARM]))
3988 int cur = target_ptr->skill_exp[GINOU_SHIELD];
3989 int max = s_info[target_ptr->pclass].s_max[GINOU_SHIELD];
3993 DEPTH targetlevel = r_ptr->level;
3997 /* Extra experience */
3998 if ((cur / 100) < targetlevel)
4000 if ((cur / 100 + 15) < targetlevel)
4001 inc += 1 + (targetlevel - (cur / 100 + 15));
4006 target_ptr->skill_exp[GINOU_SHIELD] = MIN(max, cur + inc);
4007 target_ptr->update |= (PU_BONUS);
4018 /* Analyze "visible" monsters only */
4019 if (is_original_ap_and_seen(m_ptr) && !do_silly_attack)
4021 /* Count "obvious" attacks (and ones that cause damage) */
4022 if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
4024 /* Count attacks of this type */
4025 if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
4027 r_ptr->r_blows[ap_cnt]++;
4032 if (target_ptr->riding && damage)
4034 char m_steed_name[MAX_NLEN];
4035 monster_desc(m_steed_name, &p_ptr->current_floor_ptr->m_list[target_ptr->riding], 0);
4036 if (rakuba(target_ptr, (damage > 200) ? 200 : damage, FALSE))
4038 msg_format(_("%^sから落ちてしまった!", "You have fallen from %s."), m_steed_name);
4042 if (target_ptr->special_defense & NINJA_KAWARIMI)
4044 if (kawarimi(target_ptr, FALSE)) return TRUE;
4048 /* Hex - revenge damage stored */
4049 revenge_store(target_ptr, get_damage);
4051 if ((target_ptr->tim_eyeeye || hex_spelling(HEX_EYE_FOR_EYE))
4052 && get_damage > 0 && !target_ptr->is_dead)
4055 msg_format("攻撃が%s自身を傷つけた!", m_name);
4057 GAME_TEXT m_name_self[80];
4060 monster_desc(m_name_self, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE);
4062 msg_format("The attack of %s has wounded %s!", m_name, m_name_self);
4064 project(target_ptr, 0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL, -1);
4065 if (target_ptr->tim_eyeeye) set_tim_eyeeye(target_ptr, target_ptr->tim_eyeeye-5, TRUE);
4068 if ((target_ptr->counter || (target_ptr->special_defense & KATA_MUSOU)) && alive && !target_ptr->is_dead && m_ptr->ml && (target_ptr->csp > 7))
4070 char m_target_name[MAX_NLEN];
4071 monster_desc(m_target_name, m_ptr, 0);
4073 target_ptr->csp -= 7;
4074 msg_format(_("%^sに反撃した!", "Your counterattack to %s!"), m_target_name);
4075 py_attack(target_ptr, m_ptr->fy, m_ptr->fx, HISSATSU_COUNTER);
4077 target_ptr->redraw |= (PR_MANA);
4081 if (blinked && alive && !target_ptr->is_dead)
4083 if (teleport_barrier(target_ptr, m_idx))
4085 msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But magic barrier obstructs it."));
4089 msg_print(_("泥棒は笑って逃げた!", "The thief flees laughing!"));
4090 teleport_away(target_ptr, m_idx, MAX_SIGHT * 2 + 5, 0L);
4095 /* Always notice cause of death */
4096 if (target_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !target_ptr->current_floor_ptr->inside_arena)
4101 if (m_ptr->ml && fear && alive && !target_ptr->is_dead)
4104 msg_format(_("%^sは恐怖で逃げ出した!", "%^s flees in terror!"), m_name);
4107 if (target_ptr->special_defense & KATA_IAI)
4109 set_action(target_ptr, ACTION_NONE);
4112 /* Assume we attacked */
4117 #define BLOW_EFFECT_TYPE_NONE 0
4118 #define BLOW_EFFECT_TYPE_FEAR 1
4119 #define BLOW_EFFECT_TYPE_SLEEP 2
4120 #define BLOW_EFFECT_TYPE_HEAL 3
4123 * @brief モンスターから敵モンスターへの打撃攻撃処理
4124 * @param m_idx 攻撃側モンスターの参照ID
4125 * @param t_idx 目標側モンスターの参照ID
4126 * @return 実際に打撃処理が行われた場合TRUEを返す
4128 bool monst_attack_monst(player_type *subject_ptr, MONSTER_IDX m_idx, MONSTER_IDX t_idx)
4130 monster_type *m_ptr = &subject_ptr->current_floor_ptr->m_list[m_idx];
4131 monster_type *t_ptr = &subject_ptr->current_floor_ptr->m_list[t_idx];
4133 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4134 monster_race *tr_ptr = &r_info[t_ptr->r_idx];
4136 ARMOUR_CLASS ap_cnt;
4140 GAME_TEXT m_name[MAX_NLEN], t_name[MAX_NLEN];
4141 char temp[MAX_NLEN];
4143 bool explode = FALSE, touched = FALSE, fear = FALSE, dead = FALSE;
4144 POSITION y_saver = t_ptr->fy;
4145 POSITION x_saver = t_ptr->fx;
4148 bool see_m = is_seen(m_ptr);
4149 bool see_t = is_seen(t_ptr);
4150 bool see_either = see_m || see_t;
4152 /* Can the player be aware of this attack? */
4153 bool known = (m_ptr->cdis <= MAX_SIGHT) || (t_ptr->cdis <= MAX_SIGHT);
4154 bool do_silly_attack = (one_in_(2) && subject_ptr->image);
4156 /* Cannot attack self */
4157 if (m_idx == t_idx) return FALSE;
4159 /* Not allowed to attack */
4160 if (r_ptr->flags1 & RF1_NEVER_BLOW) return FALSE;
4162 if (d_info[subject_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) return (FALSE);
4167 /* Extract the effective monster level */
4168 rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
4170 monster_desc(m_name, m_ptr, 0);
4171 monster_desc(t_name, t_ptr, 0);
4173 /* Assume no blink */
4176 if (!see_either && known)
4178 subject_ptr->current_floor_ptr->monster_noise = TRUE;
4181 if (subject_ptr->riding && (m_idx == subject_ptr->riding)) disturb(subject_ptr, TRUE, TRUE);
4183 /* Scan through all four blows */
4184 for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
4186 bool obvious = FALSE;
4188 HIT_POINT power = 0;
4189 HIT_POINT damage = 0;
4193 /* Extract the attack infomation */
4194 int effect = r_ptr->blow[ap_cnt].effect;
4195 int method = r_ptr->blow[ap_cnt].method;
4196 int d_dice = r_ptr->blow[ap_cnt].d_dice;
4197 int d_side = r_ptr->blow[ap_cnt].d_side;
4199 if (!monster_is_valid(m_ptr)) break;
4201 /* Stop attacking if the target dies! */
4202 if (t_ptr->fx != x_saver || t_ptr->fy != y_saver)
4205 /* Hack -- no more attacks */
4208 if (method == RBM_SHOOT) continue;
4210 /* Extract the attack "power" */
4211 power = mbe_info[effect].power;
4214 if (!effect || check_hit2(power, rlev, ac, MON_STUNNED(m_ptr)))
4216 (void)set_monster_csleep(t_idx, 0);
4220 /* Redraw the health bar */
4221 if (subject_ptr->health_who == t_idx) subject_ptr->redraw |= (PR_HEALTH);
4222 if (subject_ptr->riding == t_idx) subject_ptr->redraw |= (PR_UHEALTH);
4225 /* Describe the attack method */
4230 act = _("%sを殴った。", "hits %s.");
4237 act = _("%sを触った。", "touches %s.");
4244 act = _("%sをパンチした。", "punches %s.");
4251 act = _("%sを蹴った。", "kicks %s.");
4258 act = _("%sをひっかいた。", "claws %s.");
4265 act = _("%sを噛んだ。", "bites %s.");
4272 act = _("%sを刺した。", "stings %s.");
4279 act = _("%sを斬った。", "slashes %s.");
4285 act = _("%sを角で突いた。", "butts %s.");
4292 act = _("%sに体当りした。", "crushes %s.");
4299 act = _("%sを飲み込んだ。", "engulfs %s.");
4306 act = _("%sに請求書をよこした。", "charges %s.");
4313 act = _("%sの体の上を這い回った。", "crawls on %s.");
4320 act = _("%sによだれをたらした。", "drools on %s.");
4327 act = _("%sに唾を吐いた。", "spits on %s.");
4334 if (see_either) disturb(subject_ptr, TRUE, TRUE);
4335 act = _("爆発した。", "explodes.");
4343 act = _("%sをにらんだ。", "gazes at %s.");
4350 act = _("%sに泣きついた。", "wails at %s.");
4357 act = _("%sに胞子を飛ばした。", "releases spores at %s.");
4364 act = _("%sにXXX4を飛ばした。", "projects XXX4's at %s.");
4371 act = _("%sに金をせがんだ。", "begs %s for money.");
4378 act = _("%sを侮辱した。", "insults %s.");
4385 act = _("%sにむかってうめいた。", "moans at %s.");
4392 act = _("%sにむかって歌った。", "sings to %s.");
4398 if (act && see_either)
4401 if (do_silly_attack) act = silly_attacks2[randint0(MAX_SILLY_ATTACK)];
4402 strfmt(temp, act, t_name);
4403 msg_format("%^sは%s", m_name, temp);
4405 if (do_silly_attack)
4407 act = silly_attacks[randint0(MAX_SILLY_ATTACK)];
4408 strfmt(temp, "%s %s.", act, t_name);
4410 else strfmt(temp, act, t_name);
4411 msg_format("%^s %s", m_name, temp);
4415 /* Hack -- assume all attacks are obvious */
4418 /* Roll out the damage */
4419 damage = damroll(d_dice, d_side);
4421 /* Assume no effect */
4422 effect_type = BLOW_EFFECT_TYPE_NONE;
4426 /* Apply appropriate damage */
4435 if ((randint1(rlev * 2 + 250) > (ac + 200)) || one_in_(13))
4437 int tmp_damage = damage - (damage * ((ac < 150) ? ac : 150) / 250);
4438 damage = MAX(damage, tmp_damage * 2);
4445 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
4460 if ((subject_ptr->riding != m_idx) && one_in_(2)) blinked = TRUE;
4496 effect_type = BLOW_EFFECT_TYPE_FEAR;
4500 effect_type = BLOW_EFFECT_TYPE_SLEEP;
4504 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
4505 if (damage > 23) earthquake(subject_ptr, m_ptr->fy, m_ptr->fx, 8, m_idx);
4520 pt = GF_HYPODYNAMIA;
4521 effect_type = BLOW_EFFECT_TYPE_HEAL;
4539 /* Do damage if not exploding */
4542 project(subject_ptr, m_idx, 0, t_ptr->fy, t_ptr->fx,
4543 damage, pt, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4546 switch (effect_type)
4548 case BLOW_EFFECT_TYPE_FEAR:
4549 project(subject_ptr, m_idx, 0, t_ptr->fy, t_ptr->fx,
4550 damage, GF_TURN_ALL, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4553 case BLOW_EFFECT_TYPE_SLEEP:
4554 project(subject_ptr, m_idx, 0, t_ptr->fy, t_ptr->fx,
4555 r_ptr->level, GF_OLD_SLEEP, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4558 case BLOW_EFFECT_TYPE_HEAL:
4559 if ((monster_living(m_idx)) && (damage > 2))
4561 bool did_heal = FALSE;
4563 if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
4566 m_ptr->hp += damroll(4, damage / 6);
4567 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
4569 /* Redraw (later) if needed */
4570 if (subject_ptr->health_who == m_idx) subject_ptr->redraw |= (PR_HEALTH);
4571 if (subject_ptr->riding == m_idx) subject_ptr->redraw |= (PR_UHEALTH);
4573 /* Special message */
4574 if (see_m && did_heal)
4576 msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), m_name);
4585 if ((tr_ptr->flags2 & RF2_AURA_FIRE) && m_ptr->r_idx)
4587 if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK))
4591 msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), m_name);
4593 if (m_ptr->ml && is_original_ap_and_seen(t_ptr)) tr_ptr->r_flags2 |= RF2_AURA_FIRE;
4594 project(subject_ptr, t_idx, 0, m_ptr->fy, m_ptr->fx,
4595 damroll(1 + ((tr_ptr->level) / 26),
4596 1 + ((tr_ptr->level) / 17)),
4597 GF_FIRE, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4601 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
4606 if ((tr_ptr->flags3 & RF3_AURA_COLD) && m_ptr->r_idx)
4608 if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK))
4612 msg_format(_("%^sは突然寒くなった!", "%^s is suddenly very cold!"), m_name);
4614 if (m_ptr->ml && is_original_ap_and_seen(t_ptr)) tr_ptr->r_flags3 |= RF3_AURA_COLD;
4615 project(subject_ptr, t_idx, 0, m_ptr->fy, m_ptr->fx,
4616 damroll(1 + ((tr_ptr->level) / 26),
4617 1 + ((tr_ptr->level) / 17)),
4618 GF_COLD, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4622 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
4627 if ((tr_ptr->flags2 & RF2_AURA_ELEC) && m_ptr->r_idx)
4629 if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK))
4633 msg_format(_("%^sは電撃を食らった!", "%^s gets zapped!"), m_name);
4635 if (m_ptr->ml && is_original_ap_and_seen(t_ptr)) tr_ptr->r_flags2 |= RF2_AURA_ELEC;
4636 project(subject_ptr, t_idx, 0, m_ptr->fy, m_ptr->fx,
4637 damroll(1 + ((tr_ptr->level) / 26),
4638 1 + ((tr_ptr->level) / 17)),
4639 GF_ELEC, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4643 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
4650 /* Monster missed player */
4653 /* Analyze failed attacks */
4669 (void)set_monster_csleep(t_idx, 0);
4671 /* Visible monsters */
4675 msg_format("%sは%^sの攻撃をかわした。", t_name, m_name);
4677 msg_format("%^s misses %s.", m_name, t_name);
4687 /* Analyze "visible" monsters only */
4688 if (is_original_ap_and_seen(m_ptr) && !do_silly_attack)
4690 /* Count "obvious" attacks (and ones that cause damage) */
4691 if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
4693 /* Count attacks of this type */
4694 if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
4696 r_ptr->r_blows[ap_cnt]++;
4704 sound(SOUND_EXPLODE);
4706 /* Cancel Invulnerability */
4707 (void)set_monster_invulner(m_idx, 0, FALSE);
4708 mon_take_hit_mon(m_idx, m_ptr->hp + 1, &dead, &fear, _("は爆発して粉々になった。", " explodes into tiny shreds."), m_idx);
4713 if (blinked && m_ptr->r_idx)
4715 if (teleport_barrier(subject_ptr, m_idx))
4719 msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But magic barrier obstructs it."));
4723 subject_ptr->current_floor_ptr->monster_noise = TRUE;
4730 msg_print(_("泥棒は笑って逃げた!", "The thief flees laughing!"));
4734 subject_ptr->current_floor_ptr->monster_noise = TRUE;
4737 teleport_away(subject_ptr, m_idx, MAX_SIGHT * 2 + 5, 0L);
4747 * @brief モンスターが敵モンスターに行う打撃処理 /
4748 * Hack, based on mon_take_hit... perhaps all monster attacks on other monsters should use this?
4749 * @param m_idx 目標となるモンスターの参照ID
4751 * @param dead 目標となったモンスターの死亡状態を返す参照ポインタ
4752 * @param fear 目標となったモンスターの恐慌状態を返す参照ポインタ
4753 * @param note 目標モンスターが死亡した場合の特別メッセージ(NULLならば標準表示を行う)
4754 * @param who 打撃を行ったモンスターの参照ID
4757 void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *dead, bool *fear, concptr note, MONSTER_IDX who)
4759 monster_type *m_ptr = &p_ptr->current_floor_ptr->m_list[m_idx];
4760 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4761 GAME_TEXT m_name[160];
4762 bool seen = is_seen(m_ptr);
4764 /* Can the player be aware of this attack? */
4765 bool known = (m_ptr->cdis <= MAX_SIGHT);
4767 monster_desc(m_name, m_ptr, 0);
4769 /* Redraw (later) if needed */
4772 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
4773 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
4776 (void)set_monster_csleep(m_idx, 0);
4778 if (p_ptr->riding && (m_idx == p_ptr->riding)) disturb(p_ptr, TRUE, TRUE);
4780 if (MON_INVULNER(m_ptr) && randint0(PENETRATE_INVULNERABILITY))
4784 msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
4789 if (r_ptr->flagsr & RFR_RES_ALL)
4794 if ((dam == 0) && one_in_(3)) dam = 1;
4800 msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
4809 /* It is dead now... or is it? */
4812 if (((r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) ||
4813 (r_ptr->flags7 & RF7_NAZGUL)) &&
4821 if (!monster_living(m_ptr->r_idx))
4823 sound(SOUND_N_KILL);
4834 monster_desc(m_name, m_ptr, MD_TRUE_NAME);
4835 /* Unseen death by normal attack */
4838 p_ptr->current_floor_ptr->monster_noise = TRUE;
4840 /* Death by special attack */
4843 msg_format(_("%^s%s", "%^s%s"), m_name, note);
4845 /* Death by normal attack -- nonliving monster */
4846 else if (!monster_living(m_ptr->r_idx))
4848 msg_format(_("%^sは破壊された。", "%^s is destroyed."), m_name);
4850 /* Death by normal attack -- living monster */
4853 msg_format(_("%^sは殺された。", "%^s is killed."), m_name);
4857 monster_gain_exp(who, m_ptr->r_idx);
4858 monster_death(m_idx, FALSE);
4859 delete_monster_idx(m_idx);
4864 /* Monster is dead */
4873 /* Mega-Hack -- Pain cancels fear */
4874 if (MON_MONFEAR(m_ptr) && (dam > 0))
4877 if (set_monster_monfear(m_idx, MON_MONFEAR(m_ptr) - randint1(dam / 4)))
4884 /* Sometimes a monster gets scared by damage */
4885 if (!MON_MONFEAR(m_ptr) && !(r_ptr->flags3 & RF3_NO_FEAR))
4887 /* Percentage of fully healthy */
4888 int percentage = (100L * m_ptr->hp) / m_ptr->maxhp;
4891 * Run (sometimes) if at 10% or less of max hit points,
4892 * or (usually) when hit for half its current hit points
4894 if (((percentage <= 10) && (randint0(10) < percentage)) ||
4895 ((dam >= m_ptr->hp) && (randint0(100) < 80)))
4897 /* Hack -- note fear */
4900 /* Hack -- Add some timed fear */
4901 (void)set_monster_monfear(m_idx, (randint1(10) +
4902 (((dam >= m_ptr->hp) && (percentage > 7)) ?
4903 20 : ((11 - percentage) * 5))));
4907 #endif /* ALLOW_FEAR */
4909 if ((dam > 0) && !is_pet(m_ptr) && !is_friendly(m_ptr) && (who != m_idx))
4911 if (is_pet(&p_ptr->current_floor_ptr->m_list[who]) && !player_bold(p_ptr, m_ptr->target_y, m_ptr->target_x))
4913 set_target(m_ptr, p_ptr->current_floor_ptr->m_list[who].fy, p_ptr->current_floor_ptr->m_list[who].fx);
4917 if (p_ptr->riding && (p_ptr->riding == m_idx) && (dam > 0))
4919 monster_desc(m_name, m_ptr, 0);
4921 if (m_ptr->hp > m_ptr->maxhp / 3) dam = (dam + 1) / 2;
4922 if (rakuba(p_ptr, (dam > 200) ? 200 : dam, FALSE))
4924 msg_format(_("%^sに振り落とされた!", "You have thrown off from %s!"), m_name);