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;
1121 handle_stuff(touched_ptr);
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 attacker_ptr プレーヤーへの参照ポインタ
1143 * @param m_idx 攻撃目標となったモンスターの参照ID
1144 * @param attack 変異要素による攻撃要素の種類
1145 * @param fear 攻撃を受けたモンスターが恐慌状態に陥ったかを返す参照ポインタ
1146 * @param mdeath 攻撃を受けたモンスターが死亡したかを返す参照ポインタ
1149 static void natural_attack(player_type *attacker_ptr, MONSTER_IDX m_idx, int attack, bool *fear, bool *mdeath)
1153 WEIGHT n_weight = 0;
1154 monster_type *m_ptr = &attacker_ptr->current_floor_ptr->m_list[m_idx];
1155 monster_race *r_ptr = &r_info[m_ptr->r_idx];
1156 GAME_TEXT m_name[MAX_NLEN];
1158 int dice_num, dice_side;
1164 case MUT2_SCOR_TAIL:
1168 atk_desc = _("尻尾", "tail");
1175 atk_desc = _("角", "horns");
1182 atk_desc = _("クチバシ", "beak");
1189 atk_desc = _("象の鼻", "trunk");
1192 case MUT2_TENTACLES:
1196 atk_desc = _("触手", "tentacles");
1200 dice_num = dice_side = n_weight = 1;
1201 atk_desc = _("未定義の部位", "undefined body part");
1205 monster_desc(m_name, m_ptr, 0);
1207 /* Calculate the "attack quality" */
1208 bonus = attacker_ptr->to_h_m + (attacker_ptr->lev * 6 / 5);
1209 chance = (attacker_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
1212 if ((!(r_ptr->flags2 & RF2_QUANTUM) || !randint0(2)) && test_hit_norm(chance, r_ptr->ac, m_ptr->ml))
1215 msg_format(_("%sを%sで攻撃した。", "You hit %s with your %s."), m_name, atk_desc);
1217 k = damroll(dice_num, dice_side);
1218 k = critical_norm(attacker_ptr, n_weight, bonus, k, (s16b)bonus, 0);
1220 /* Apply the player damage bonuses */
1221 k += attacker_ptr->to_d_m;
1223 /* No negative damage */
1226 /* Modify the damage */
1227 k = mon_damage_mod(m_ptr, k, FALSE);
1229 /* Complex message */
1230 msg_format_wizard(CHEAT_MONSTER,
1231 _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"),
1232 k, m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
1234 /* Anger the monster */
1235 if (k > 0) anger_monster(m_ptr);
1237 /* Damage, check for fear and mdeath */
1240 case MUT2_SCOR_TAIL:
1241 project(attacker_ptr, 0, 0, m_ptr->fy, m_ptr->fx, k, GF_POIS, PROJECT_KILL, -1);
1242 *mdeath = (m_ptr->r_idx == 0);
1245 *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
1248 *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
1251 *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
1253 case MUT2_TENTACLES:
1254 *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
1257 *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
1260 touch_zap_player(m_ptr, attacker_ptr);
1266 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
1271 * @brief プレイヤーの打撃処理サブルーチン /
1272 * Player attacks a (poor, defenseless) creature -RAK-
1275 * @param fear 攻撃を受けたモンスターが恐慌状態に陥ったかを返す参照ポインタ
1276 * @param mdeath 攻撃を受けたモンスターが死亡したかを返す参照ポインタ
1277 * @param hand 攻撃を行うための武器を持つ手
1278 * @param mode 発動中の剣術ID
1281 * If no "weapon" is available, then "punch" the monster one time.
1283 static void py_attack_aux(player_type *attacker_ptr, POSITION y, POSITION x, bool *fear, bool *mdeath, s16b hand, COMBAT_OPTION_IDX mode)
1285 int num = 0, bonus, chance, vir;
1288 floor_type *floor_ptr = attacker_ptr->current_floor_ptr;
1289 grid_type *g_ptr = &floor_ptr->grid_array[y][x];
1291 monster_type *m_ptr = &floor_ptr->m_list[g_ptr->m_idx];
1292 monster_race *r_ptr = &r_info[m_ptr->r_idx];
1294 /* Access the weapon */
1295 object_type *o_ptr = &attacker_ptr->inventory_list[INVEN_RARM + hand];
1297 GAME_TEXT m_name[MAX_NLEN];
1299 bool success_hit = FALSE;
1300 bool backstab = FALSE;
1301 bool vorpal_cut = FALSE;
1302 int chaos_effect = 0;
1303 bool stab_fleeing = FALSE;
1304 bool fuiuchi = FALSE;
1305 bool monk_attack = FALSE;
1306 bool do_quake = FALSE;
1308 bool drain_msg = TRUE;
1309 int drain_result = 0, drain_heal = 0;
1310 bool can_drain = FALSE;
1312 int drain_left = MAX_VAMPIRIC_DRAIN;
1313 BIT_FLAGS flgs[TR_FLAG_SIZE]; /* A massive hack -- life-draining weapons */
1314 bool is_human = (r_ptr->d_char == 'p');
1315 bool is_lowlevel = (r_ptr->level < (attacker_ptr->lev - 15));
1316 bool zantetsu_mukou, e_j_mukou;
1318 switch (attacker_ptr->pclass)
1322 if (has_melee_weapon(attacker_ptr, INVEN_RARM + hand) && !attacker_ptr->icky_wield[hand])
1324 int tmp = attacker_ptr->lev * 6 + (attacker_ptr->skill_stl + 10) * 4;
1325 if (attacker_ptr->monlite && (mode != HISSATSU_NYUSIN)) tmp /= 3;
1326 if (attacker_ptr->cursed & TRC_AGGRAVATE) tmp /= 2;
1327 if (r_ptr->level > (attacker_ptr->lev * attacker_ptr->lev / 20 + 10)) tmp /= 3;
1328 if (MON_CSLEEP(m_ptr) && m_ptr->ml)
1330 /* Can't backstab creatures that we can't see, right? */
1333 else if ((attacker_ptr->special_defense & NINJA_S_STEALTH) && (randint0(tmp) > (r_ptr->level + 20)) && m_ptr->ml && !(r_ptr->flagsr & RFR_RES_ALL))
1337 else if (MON_MONFEAR(m_ptr) && m_ptr->ml)
1339 stab_fleeing = TRUE;
1345 case CLASS_FORCETRAINER:
1346 case CLASS_BERSERKER:
1347 if ((empty_hands(attacker_ptr, TRUE) & EMPTY_HAND_RARM) && !attacker_ptr->riding) monk_attack = TRUE;
1351 if (!o_ptr->k_idx) /* Empty hand */
1353 if ((r_ptr->level + 10) > attacker_ptr->lev)
1355 if (attacker_ptr->skill_exp[GINOU_SUDE] < s_info[attacker_ptr->pclass].s_max[GINOU_SUDE])
1357 if (attacker_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_BEGINNER)
1358 attacker_ptr->skill_exp[GINOU_SUDE] += 40;
1359 else if ((attacker_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_SKILLED))
1360 attacker_ptr->skill_exp[GINOU_SUDE] += 5;
1361 else if ((attacker_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_EXPERT) && (attacker_ptr->lev > 19))
1362 attacker_ptr->skill_exp[GINOU_SUDE] += 1;
1363 else if ((attacker_ptr->lev > 34))
1364 if (one_in_(3)) attacker_ptr->skill_exp[GINOU_SUDE] += 1;
1365 attacker_ptr->update |= (PU_BONUS);
1369 else if (object_is_melee_weapon(o_ptr))
1371 if ((r_ptr->level + 10) > attacker_ptr->lev)
1373 OBJECT_TYPE_VALUE tval = attacker_ptr->inventory_list[INVEN_RARM + hand].tval - TV_WEAPON_BEGIN;
1374 OBJECT_SUBTYPE_VALUE sval = attacker_ptr->inventory_list[INVEN_RARM + hand].sval;
1375 int now_exp = attacker_ptr->weapon_exp[tval][sval];
1376 if (now_exp < s_info[attacker_ptr->pclass].w_max[tval][sval])
1379 if (now_exp < WEAPON_EXP_BEGINNER) amount = 80;
1380 else if (now_exp < WEAPON_EXP_SKILLED) amount = 10;
1381 else if ((now_exp < WEAPON_EXP_EXPERT) && (attacker_ptr->lev > 19)) amount = 1;
1382 else if ((attacker_ptr->lev > 34) && one_in_(2)) amount = 1;
1383 attacker_ptr->weapon_exp[tval][sval] += amount;
1384 attacker_ptr->update |= (PU_BONUS);
1389 /* Disturb the monster */
1390 (void)set_monster_csleep(g_ptr->m_idx, 0);
1392 monster_desc(m_name, m_ptr, 0);
1394 /* Calculate the "attack quality" */
1395 bonus = attacker_ptr->to_h[hand] + o_ptr->to_h;
1396 chance = (attacker_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
1397 if (mode == HISSATSU_IAI) chance += 60;
1398 if (attacker_ptr->special_defense & KATA_KOUKIJIN) chance += 150;
1399 if (attacker_ptr->sutemi) chance = MAX(chance * 3 / 2, chance + 60);
1401 vir = virtue_number(attacker_ptr, V_VALOUR);
1404 chance += (attacker_ptr->virtues[vir - 1] / 10);
1407 zantetsu_mukou = ((o_ptr->name1 == ART_ZANTETSU) && (r_ptr->d_char == 'j'));
1408 e_j_mukou = ((o_ptr->name1 == ART_EXCALIBUR_J) && (r_ptr->d_char == 'S'));
1410 if ((mode == HISSATSU_KYUSHO) || (mode == HISSATSU_MINEUCHI) || (mode == HISSATSU_3DAN) || (mode == HISSATSU_IAI)) num_blow = 1;
1411 else if (mode == HISSATSU_COLD) num_blow = attacker_ptr->num_blow[hand] + 2;
1412 else num_blow = attacker_ptr->num_blow[hand];
1414 /* Hack -- DOKUBARI always hit once */
1415 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) num_blow = 1;
1417 /* Attack once for each legal blow */
1418 while ((num++ < num_blow) && !attacker_ptr->is_dead)
1420 if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) || (mode == HISSATSU_KYUSHO))
1424 if (attacker_ptr->migite && attacker_ptr->hidarite)
1428 if (mode == HISSATSU_3DAN)
1433 success_hit = one_in_(n);
1435 else if ((attacker_ptr->pclass == CLASS_NINJA) && ((backstab || fuiuchi) && !(r_ptr->flagsr & RFR_RES_ALL))) success_hit = TRUE;
1436 else success_hit = test_hit_norm(chance, r_ptr->ac, m_ptr->ml);
1438 if (mode == HISSATSU_MAJIN)
1441 success_hit = FALSE;
1447 int vorpal_chance = ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD)) ? 2 : 4;
1451 if (backstab) msg_format(_("あなたは冷酷にも眠っている無力な%sを突き刺した!", "You cruelly stab the helpless, sleeping %s!"), m_name);
1452 else if (fuiuchi) msg_format(_("不意を突いて%sに強烈な一撃を喰らわせた!", "You make surprise attack, and hit %s with a powerful blow!"), m_name);
1453 else if (stab_fleeing) msg_format(_("逃げる%sを背中から突き刺した!", "You backstab the fleeing %s!"), m_name);
1454 else if (!monk_attack) msg_format(_("%sを攻撃した。", "You hit %s."), m_name);
1456 /* Hack -- bare hands do one damage */
1459 object_flags(o_ptr, flgs);
1461 /* Select a chaotic effect (50% chance) */
1462 if ((have_flag(flgs, TR_CHAOTIC)) && one_in_(2))
1465 chg_virtue(attacker_ptr, V_CHANCE, 1);
1467 if (randint1(5) < 3)
1469 /* Vampiric (20%) */
1472 else if (one_in_(250))
1477 else if (!one_in_(10))
1479 /* Confusion (26.892%) */
1482 else if (one_in_(2))
1484 /* Teleport away (1.494%) */
1489 /* Polymorph (1.494%) */
1494 /* Vampiric drain */
1495 if ((have_flag(flgs, TR_VAMPIRIC)) || (chaos_effect == 1) || (mode == HISSATSU_DRAIN) || hex_spelling(HEX_VAMP_BLADE))
1497 /* Only drain "living" monsters */
1498 if (monster_living(m_ptr->r_idx))
1504 if ((have_flag(flgs, TR_VORPAL) || hex_spelling(HEX_RUNESWORD)) && (randint1(vorpal_chance * 3 / 2) == 1) && !zantetsu_mukou)
1506 else vorpal_cut = FALSE;
1510 int special_effect = 0, stun_effect = 0, times = 0, max_times;
1512 const martial_arts *ma_ptr = &ma_blows[0], *old_ptr = &ma_blows[0];
1513 int resist_stun = 0;
1516 if (r_ptr->flags1 & RF1_UNIQUE) resist_stun += 88;
1517 if (r_ptr->flags3 & RF3_NO_STUN) resist_stun += 66;
1518 if (r_ptr->flags3 & RF3_NO_CONF) resist_stun += 33;
1519 if (r_ptr->flags3 & RF3_NO_SLEEP) resist_stun += 33;
1520 if ((r_ptr->flags3 & RF3_UNDEAD) || (r_ptr->flags3 & RF3_NONLIVING))
1523 if (attacker_ptr->special_defense & KAMAE_BYAKKO)
1524 max_times = (attacker_ptr->lev < 3 ? 1 : attacker_ptr->lev / 3);
1525 else if (attacker_ptr->special_defense & KAMAE_SUZAKU)
1527 else if (attacker_ptr->special_defense & KAMAE_GENBU)
1530 max_times = (attacker_ptr->lev < 7 ? 1 : attacker_ptr->lev / 7);
1531 /* Attempt 'times' */
1532 for (times = 0; times < max_times; times++)
1536 ma_ptr = &ma_blows[randint0(MAX_MA)];
1537 if ((attacker_ptr->pclass == CLASS_FORCETRAINER) && (ma_ptr->min_level > 1)) min_level = ma_ptr->min_level + 3;
1538 else min_level = ma_ptr->min_level;
1539 } while ((min_level > attacker_ptr->lev) ||
1540 (randint1(attacker_ptr->lev) < ma_ptr->chance));
1542 /* keep the highest level attack available we found */
1543 if ((ma_ptr->min_level > old_ptr->min_level) &&
1544 !attacker_ptr->stun && !attacker_ptr->confused)
1548 if (current_world_ptr->wizard && cheat_xtra)
1550 msg_print(_("攻撃を再選択しました。", "Attack re-selected."));
1559 if (attacker_ptr->pclass == CLASS_FORCETRAINER) min_level = MAX(1, ma_ptr->min_level - 3);
1560 else min_level = ma_ptr->min_level;
1561 k = damroll(ma_ptr->dd + attacker_ptr->to_dd[hand], ma_ptr->ds + attacker_ptr->to_ds[hand]);
1562 if (attacker_ptr->special_attack & ATTACK_SUIKEN) k *= 2;
1564 if (ma_ptr->effect == MA_KNEE)
1566 if (r_ptr->flags1 & RF1_MALE)
1568 msg_format(_("%sに金的膝蹴りをくらわした!", "You hit %s in the groin with your knee!"), m_name);
1570 special_effect = MA_KNEE;
1573 msg_format(ma_ptr->desc, m_name);
1576 else if (ma_ptr->effect == MA_SLOW)
1578 if (!((r_ptr->flags1 & RF1_NEVER_MOVE) ||
1579 my_strchr("~#{}.UjmeEv$,DdsbBFIJQSXclnw!=?", r_ptr->d_char)))
1581 msg_format(_("%sの足首に関節蹴りをくらわした!", "You kick %s in the ankle."), m_name);
1582 special_effect = MA_SLOW;
1584 else msg_format(ma_ptr->desc, m_name);
1590 stun_effect = (ma_ptr->effect / 2) + randint1(ma_ptr->effect / 2);
1593 msg_format(ma_ptr->desc, m_name);
1596 if (attacker_ptr->special_defense & KAMAE_SUZAKU) weight = 4;
1597 if ((attacker_ptr->pclass == CLASS_FORCETRAINER) && P_PTR_KI)
1599 weight += (P_PTR_KI / 30);
1600 if (weight > 20) weight = 20;
1603 k = critical_norm(attacker_ptr, attacker_ptr->lev * weight, min_level, k, attacker_ptr->to_h[0], 0);
1605 if ((special_effect == MA_KNEE) && ((k + attacker_ptr->to_d[hand]) < m_ptr->hp))
1607 msg_format(_("%^sは苦痛にうめいている!", "%^s moans in agony!"), m_name);
1608 stun_effect = 7 + randint1(13);
1612 else if ((special_effect == MA_SLOW) && ((k + attacker_ptr->to_d[hand]) < m_ptr->hp))
1614 if (!(r_ptr->flags1 & RF1_UNIQUE) &&
1615 (randint1(attacker_ptr->lev) > r_ptr->level) &&
1618 msg_format(_("%^sは足をひきずり始めた。", "%^s starts limping slower."), m_name);
1619 m_ptr->mspeed -= 10;
1623 if (stun_effect && ((k + attacker_ptr->to_d[hand]) < m_ptr->hp))
1625 if (attacker_ptr->lev > randint1(r_ptr->level + resist_stun + 10))
1627 if (set_monster_stunned(g_ptr->m_idx, stun_effect + MON_STUNNED(m_ptr)))
1629 msg_format(_("%^sはフラフラになった。", "%^s is stunned."), m_name);
1633 msg_format(_("%^sはさらにフラフラになった。", "%^s is more stunned."), m_name);
1639 /* Handle normal weapon */
1640 else if (o_ptr->k_idx)
1642 k = damroll(o_ptr->dd + attacker_ptr->to_dd[hand], o_ptr->ds + attacker_ptr->to_ds[hand]);
1643 k = tot_dam_aux(attacker_ptr, o_ptr, k, m_ptr, mode, FALSE);
1647 k *= (3 + (attacker_ptr->lev / 20));
1651 k = k*(5 + (attacker_ptr->lev * 2 / 25)) / 2;
1653 else if (stab_fleeing)
1658 if ((attacker_ptr->impact[hand] && ((k > 50) || one_in_(7))) ||
1659 (chaos_effect == 2) || (mode == HISSATSU_QUAKE))
1664 if ((!(o_ptr->tval == TV_SWORD) || !(o_ptr->sval == SV_POISON_NEEDLE)) && !(mode == HISSATSU_KYUSHO))
1665 k = critical_norm(attacker_ptr, o_ptr->weight, o_ptr->to_h, k, attacker_ptr->to_h[hand], mode);
1673 if ((o_ptr->name1 == ART_CHAINSWORD) && !one_in_(2))
1675 char chainsword_noise[1024];
1676 if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, chainsword_noise))
1678 msg_print(chainsword_noise);
1682 if (o_ptr->name1 == ART_VORPAL_BLADE)
1684 msg_print(_("目にも止まらぬヴォーパルブレード、手錬の早業!", "Your Vorpal Blade goes snicker-snack!"));
1688 msg_format(_("%sをグッサリ切り裂いた!", "Your weapon cuts deep into %s!"), m_name);
1691 /* Try to increase the damage */
1692 while (one_in_(vorpal_chance))
1697 k *= (HIT_POINT)mult;
1700 if (((r_ptr->flagsr & RFR_RES_ALL) ? k / 100 : k) > m_ptr->hp)
1702 msg_format(_("%sを真っ二つにした!", "You cut %s in half!"), m_name);
1708 case 2: msg_format(_("%sを斬った!", "You gouge %s!"), m_name); break;
1709 case 3: msg_format(_("%sをぶった斬った!", "You maim %s!"), m_name); break;
1710 case 4: msg_format(_("%sをメッタ斬りにした!", "You carve %s!"), m_name); break;
1711 case 5: msg_format(_("%sをメッタメタに斬った!", "You cleave %s!"), m_name); break;
1712 case 6: msg_format(_("%sを刺身にした!", "You smite %s!"), m_name); break;
1713 case 7: msg_format(_("%sを斬って斬って斬りまくった!", "You eviscerate %s!"), m_name); break;
1714 default: msg_format(_("%sを細切れにした!", "You shred %s!"), m_name); break;
1717 drain_result = drain_result * 3 / 2;
1721 drain_result += o_ptr->to_d;
1724 /* Apply the player damage bonuses */
1725 k += attacker_ptr->to_d[hand];
1726 drain_result += attacker_ptr->to_d[hand];
1728 if ((mode == HISSATSU_SUTEMI) || (mode == HISSATSU_3DAN)) k *= 2;
1729 if ((mode == HISSATSU_SEKIRYUKA) && !monster_living(m_ptr->r_idx)) k = 0;
1730 if ((mode == HISSATSU_SEKIRYUKA) && !attacker_ptr->cut) k /= 2;
1732 /* No negative damage */
1735 if ((mode == HISSATSU_ZANMA) && !(!monster_living(m_ptr->r_idx) && (r_ptr->flags3 & RF3_EVIL)))
1742 msg_print(_("こんな軟らかいものは切れん!", "You cannot cut such a elastic thing!"));
1748 msg_print(_("蜘蛛は苦手だ!", "Spiders are difficult for you to deal with!"));
1752 if (mode == HISSATSU_MINEUCHI)
1754 int tmp = (10 + randint1(15) + attacker_ptr->lev / 5);
1757 anger_monster(m_ptr);
1759 if (!(r_ptr->flags3 & (RF3_NO_STUN)))
1762 if (MON_STUNNED(m_ptr))
1764 msg_format(_("%sはひどくもうろうとした。", "%s is more dazed."), m_name);
1769 msg_format(_("%s はもうろうとした。", "%s is dazed."), m_name);
1773 (void)set_monster_stunned(g_ptr->m_idx, MON_STUNNED(m_ptr) + tmp);
1777 msg_format(_("%s には効果がなかった。", "%s is not effected."), m_name);
1781 /* Modify the damage */
1782 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))));
1783 if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) || (mode == HISSATSU_KYUSHO))
1785 if ((randint1(randint1(r_ptr->level / 7) + 5) == 1) && !(r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags7 & RF7_UNIQUE2))
1788 msg_format(_("%sの急所を突き刺した!", "You hit %s on a fatal spot!"), m_name);
1792 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)))
1794 int maxhp = maxroll(r_ptr->hdice, r_ptr->hside);
1795 if (one_in_(backstab ? 13 : (stab_fleeing || fuiuchi) ? 15 : 27))
1799 msg_format(_("刃が%sに深々と突き刺さった!", "You critically injured %s!"), m_name);
1801 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)))
1803 if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_UNIQUE2) || (m_ptr->hp >= maxhp / 2))
1805 k = MAX(k * 5, m_ptr->hp / 2);
1807 msg_format(_("%sに致命傷を負わせた!", "You fatally injured %s!"), m_name);
1812 msg_format(_("刃が%sの急所を貫いた!", "You hit %s on a fatal spot!"), m_name);
1817 msg_format_wizard(CHEAT_MONSTER,
1818 _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"), k,
1819 m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
1821 if (k <= 0) can_drain = FALSE;
1823 if (drain_result > m_ptr->hp)
1824 drain_result = m_ptr->hp;
1826 /* Damage, check for fear and death */
1827 if (mon_take_hit(attacker_ptr, g_ptr->m_idx, k, fear, NULL))
1830 if ((attacker_ptr->pclass == CLASS_BERSERKER) && attacker_ptr->energy_use)
1832 if (attacker_ptr->migite && attacker_ptr->hidarite)
1834 if (hand) attacker_ptr->energy_use = attacker_ptr->energy_use * 3 / 5 + attacker_ptr->energy_use*num * 2 / (attacker_ptr->num_blow[hand] * 5);
1835 else attacker_ptr->energy_use = attacker_ptr->energy_use*num * 3 / (attacker_ptr->num_blow[hand] * 5);
1839 attacker_ptr->energy_use = attacker_ptr->energy_use*num / attacker_ptr->num_blow[hand];
1842 if ((o_ptr->name1 == ART_ZANTETSU) && is_lowlevel)
1843 msg_print(_("またつまらぬものを斬ってしまった...", "Sigh... Another trifling thing I've cut...."));
1847 /* Anger the monster */
1848 if (k > 0) anger_monster(m_ptr);
1850 touch_zap_player(m_ptr, attacker_ptr);
1852 /* Are we draining it? A little note: If the monster is
1853 dead, the drain does not work... */
1855 if (can_drain && (drain_result > 0))
1857 if (o_ptr->name1 == ART_MURAMASA)
1861 HIT_PROB to_h = o_ptr->to_h;
1862 HIT_POINT to_d = o_ptr->to_d;
1866 for (i = 0; i < to_h + 3; i++) if (one_in_(4)) flag = 0;
1870 for (i = 0; i < to_d + 3; i++) if (one_in_(4)) flag = 0;
1873 if (o_ptr->to_h != to_h || o_ptr->to_d != to_d)
1875 msg_print(_("妖刀は血を吸って強くなった!", "Muramasa sucked blood, and became more powerful!"));
1883 if (drain_result > 5) /* Did we really hurt it? */
1885 drain_heal = damroll(2, drain_result / 6);
1887 if (hex_spelling(HEX_VAMP_BLADE)) drain_heal *= 2;
1891 msg_format(_("Draining left: %d", "Draining left: %d"), drain_left);
1896 if (drain_heal < drain_left)
1898 drain_left -= drain_heal;
1902 drain_heal = drain_left;
1908 msg_format(_("刃が%sから生命力を吸い取った!", "Your weapon drains life from %s!"), m_name);
1912 drain_heal = (drain_heal * attacker_ptr->mutant_regenerate_mod) / 100;
1914 hp_player(attacker_ptr, drain_heal);
1915 /* We get to keep some of it! */
1919 m_ptr->maxhp -= (k + 7) / 8;
1920 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
1921 if (m_ptr->maxhp < 1) m_ptr->maxhp = 1;
1927 /* Confusion attack */
1928 if ((attacker_ptr->special_attack & ATTACK_CONFUSE) || (chaos_effect == 3) || (mode == HISSATSU_CONF) || hex_spelling(HEX_CONFUSION))
1930 /* Cancel glowing hands */
1931 if (attacker_ptr->special_attack & ATTACK_CONFUSE)
1933 attacker_ptr->special_attack &= ~(ATTACK_CONFUSE);
1934 msg_print(_("手の輝きがなくなった。", "Your hands stop glowing."));
1935 attacker_ptr->redraw |= (PR_STATUS);
1939 /* Confuse the monster */
1940 if (r_ptr->flags3 & RF3_NO_CONF)
1942 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_NO_CONF;
1943 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
1946 else if (randint0(100) < r_ptr->level)
1948 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
1952 msg_format(_("%^sは混乱したようだ。", "%^s appears confused."), m_name);
1953 (void)set_monster_confused(g_ptr->m_idx, MON_CONFUSED(m_ptr) + 10 + randint0(attacker_ptr->lev) / 5);
1957 else if (chaos_effect == 4)
1959 bool resists_tele = FALSE;
1961 if (r_ptr->flagsr & RFR_RES_TELE)
1963 if (r_ptr->flags1 & RF1_UNIQUE)
1965 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1966 msg_format(_("%^sには効果がなかった。", "%^s is unaffected!"), m_name);
1967 resists_tele = TRUE;
1969 else if (r_ptr->level > randint1(100))
1971 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
1972 msg_format(_("%^sは抵抗力を持っている!", "%^s resists!"), m_name);
1973 resists_tele = TRUE;
1979 msg_format(_("%^sは消えた!", "%^s disappears!"), m_name);
1980 teleport_away(attacker_ptr, g_ptr->m_idx, 50, TELEPORT_PASSIVE);
1981 num = num_blow + 1; /* Can't hit it anymore! */
1986 else if ((chaos_effect == 5) && (randint1(90) > r_ptr->level))
1988 if (!(r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) &&
1989 !(r_ptr->flagsr & RFR_EFF_RES_CHAO_MASK))
1991 if (polymorph_monster(attacker_ptr, y, x))
1993 msg_format(_("%^sは変化した!", "%^s changes!"), m_name);
1999 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
2002 /* Hack -- Get new monster */
2003 m_ptr = &floor_ptr->m_list[g_ptr->m_idx];
2005 /* Oops, we need a different name... */
2006 monster_desc(m_name, m_ptr, 0);
2008 /* Hack -- Get new race */
2009 r_ptr = &r_info[m_ptr->r_idx];
2012 else if (o_ptr->name1 == ART_G_HAMMER)
2014 monster_type *target_ptr = &floor_ptr->m_list[g_ptr->m_idx];
2016 if (target_ptr->hold_o_idx)
2018 object_type *q_ptr = &floor_ptr->o_list[target_ptr->hold_o_idx];
2019 GAME_TEXT o_name[MAX_NLEN];
2021 object_desc(o_name, q_ptr, OD_NAME_ONLY);
2022 q_ptr->held_m_idx = 0;
2023 q_ptr->marked = OM_TOUCHED;
2024 target_ptr->hold_o_idx = q_ptr->next_o_idx;
2025 q_ptr->next_o_idx = 0;
2026 msg_format(_("%sを奪った。", "You snatched %s."), o_name);
2027 inven_carry(attacker_ptr, q_ptr);
2035 backstab = FALSE; /* Clumsy! */
2036 fuiuchi = FALSE; /* Clumsy! */
2038 if ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE) && one_in_(3))
2040 BIT_FLAGS flgs_aux[TR_FLAG_SIZE];
2044 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
2045 msg_print(_("振り回した大鎌が自分自身に返ってきた!", "Your scythe returns to you!"));
2046 object_flags(o_ptr, flgs_aux);
2048 k = damroll(o_ptr->dd + attacker_ptr->to_dd[hand], o_ptr->ds + attacker_ptr->to_ds[hand]);
2051 switch (attacker_ptr->mimic_form)
2054 switch (attacker_ptr->prace)
2061 case RACE_BARBARIAN:
2065 case RACE_HALF_TROLL:
2066 case RACE_HALF_OGRE:
2067 case RACE_HALF_GIANT:
2068 case RACE_HALF_TITAN:
2076 case RACE_DRACONIAN:
2083 case MIMIC_DEMON_LORD:
2090 if (attacker_ptr->align < 0 && mult < 20)
2092 if (!(attacker_ptr->resist_acid || is_oppose_acid(attacker_ptr) || attacker_ptr->immune_acid) && (mult < 25))
2094 if (!(attacker_ptr->resist_elec || is_oppose_elec(attacker_ptr) || attacker_ptr->immune_elec) && (mult < 25))
2096 if (!(attacker_ptr->resist_fire || is_oppose_fire(attacker_ptr) || attacker_ptr->immune_fire) && (mult < 25))
2098 if (!(attacker_ptr->resist_cold || is_oppose_cold(attacker_ptr) || attacker_ptr->immune_cold) && (mult < 25))
2100 if (!(attacker_ptr->resist_pois || is_oppose_pois(attacker_ptr)) && (mult < 25))
2103 if ((attacker_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs_aux, TR_FORCE_WEAPON)) && (attacker_ptr->csp >(attacker_ptr->msp / 30)))
2105 attacker_ptr->csp -= (1 + (attacker_ptr->msp / 30));
2106 attacker_ptr->redraw |= (PR_MANA);
2107 mult = mult * 3 / 2 + 20;
2109 k *= (HIT_POINT)mult;
2113 k = critical_norm(attacker_ptr, o_ptr->weight, o_ptr->to_h, k, attacker_ptr->to_h[hand], mode);
2117 msg_format(_("グッサリ切り裂かれた!", "Your weapon cuts deep into yourself!"));
2118 /* Try to increase the damage */
2124 k *= (HIT_POINT)mult;
2126 k += (attacker_ptr->to_d[hand] + o_ptr->to_d);
2129 take_hit(attacker_ptr, DAMAGE_FORCE, k, _("死の大鎌", "Death scythe"), -1);
2130 handle_stuff(attacker_ptr);
2135 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
2144 if (weak && !(*mdeath))
2146 msg_format(_("%sは弱くなったようだ。", "%^s seems weakened."), m_name);
2148 if (drain_left != MAX_VAMPIRIC_DRAIN)
2152 chg_virtue(attacker_ptr, V_UNLIFE, 1);
2155 /* Mega-Hack -- apply earthquake brand */
2158 earthquake(attacker_ptr, attacker_ptr->y, attacker_ptr->x, 10, 0);
2159 if (!floor_ptr->grid_array[y][x].m_idx) *mdeath = TRUE;
2164 * @brief プレイヤーの打撃処理メインルーチン
2167 * @param mode 発動中の剣術ID
2168 * @return 実際に攻撃処理が行われた場合TRUEを返す。
2170 * If no "weapon" is available, then "punch" the monster one time.
2172 bool py_attack(player_type *attacker_ptr, POSITION y, POSITION x, COMBAT_OPTION_IDX mode)
2175 bool mdeath = FALSE;
2176 bool stormbringer = FALSE;
2178 grid_type *g_ptr = &attacker_ptr->current_floor_ptr->grid_array[y][x];
2179 monster_type *m_ptr = &attacker_ptr->current_floor_ptr->m_list[g_ptr->m_idx];
2180 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2181 GAME_TEXT m_name[MAX_NLEN];
2183 disturb(attacker_ptr, FALSE, TRUE);
2185 take_turn(attacker_ptr, 100);
2187 if (!attacker_ptr->migite && !attacker_ptr->hidarite &&
2188 !(attacker_ptr->muta2 & (MUT2_HORNS | MUT2_BEAK | MUT2_SCOR_TAIL | MUT2_TRUNK | MUT2_TENTACLES)))
2190 msg_format(_("%s攻撃できない。", "You cannot do attacking."),
2191 (empty_hands(attacker_ptr, FALSE) == EMPTY_HAND_NONE) ? _("両手がふさがって", "") : "");
2195 monster_desc(m_name, m_ptr, 0);
2199 /* Auto-Recall if possible and visible */
2200 if (!attacker_ptr->image) monster_race_track(attacker_ptr, m_ptr->ap_r_idx);
2202 health_track(attacker_ptr, g_ptr->m_idx);
2205 if ((r_ptr->flags1 & RF1_FEMALE) &&
2206 !(attacker_ptr->stun || attacker_ptr->confused || attacker_ptr->image || !m_ptr->ml))
2208 if ((attacker_ptr->inventory_list[INVEN_RARM].name1 == ART_ZANTETSU) || (attacker_ptr->inventory_list[INVEN_LARM].name1 == ART_ZANTETSU))
2210 msg_print(_("拙者、おなごは斬れぬ!", "I can not attack women!"));
2215 if (d_info[attacker_ptr->dungeon_idx].flags1 & DF1_NO_MELEE)
2217 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));
2221 /* Stop if friendly */
2222 if (!is_hostile(m_ptr) &&
2223 !(attacker_ptr->stun || attacker_ptr->confused || attacker_ptr->image ||
2224 attacker_ptr->shero || !m_ptr->ml))
2226 if (attacker_ptr->inventory_list[INVEN_RARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
2227 if (attacker_ptr->inventory_list[INVEN_LARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
2230 msg_format(_("黒い刃は強欲に%sを攻撃した!", "Your black blade greedily attacks %s!"), m_name);
2231 chg_virtue(attacker_ptr, V_INDIVIDUALISM, 1);
2232 chg_virtue(attacker_ptr, V_HONOUR, -1);
2233 chg_virtue(attacker_ptr, V_JUSTICE, -1);
2234 chg_virtue(attacker_ptr, V_COMPASSION, -1);
2236 else if (attacker_ptr->pclass != CLASS_BERSERKER)
2238 if (get_check(_("本当に攻撃しますか?", "Really hit it? ")))
2240 chg_virtue(attacker_ptr, V_INDIVIDUALISM, 1);
2241 chg_virtue(attacker_ptr, V_HONOUR, -1);
2242 chg_virtue(attacker_ptr, V_JUSTICE, -1);
2243 chg_virtue(attacker_ptr, V_COMPASSION, -1);
2247 msg_format(_("%sを攻撃するのを止めた。", "You stop to avoid hitting %s."), m_name);
2254 /* Handle player fear */
2255 if (attacker_ptr->afraid)
2258 msg_format(_("恐くて%sを攻撃できない!", "You are too afraid to attack %s!"), m_name);
2260 msg_format(_("そっちには何か恐いものがいる!", "There is something scary in your way!"));
2262 /* Disturb the monster */
2263 (void)set_monster_csleep(g_ptr->m_idx, 0);
2268 if (MON_CSLEEP(m_ptr)) /* It is not honorable etc to attack helpless victims */
2270 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(attacker_ptr, V_COMPASSION, -1);
2271 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(attacker_ptr, V_HONOUR, -1);
2274 if (attacker_ptr->migite && attacker_ptr->hidarite)
2276 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))
2278 if (attacker_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_BEGINNER)
2279 attacker_ptr->skill_exp[GINOU_NITOURYU] += 80;
2280 else if (attacker_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_SKILLED)
2281 attacker_ptr->skill_exp[GINOU_NITOURYU] += 4;
2282 else if (attacker_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_EXPERT)
2283 attacker_ptr->skill_exp[GINOU_NITOURYU] += 1;
2284 else if (attacker_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_MASTER)
2285 if (one_in_(3)) attacker_ptr->skill_exp[GINOU_NITOURYU] += 1;
2286 attacker_ptr->update |= (PU_BONUS);
2290 /* Gain riding experience */
2291 if (attacker_ptr->riding)
2293 int cur = attacker_ptr->skill_exp[GINOU_RIDING];
2294 int max = s_info[attacker_ptr->pclass].s_max[GINOU_RIDING];
2298 DEPTH ridinglevel = r_info[attacker_ptr->current_floor_ptr->m_list[attacker_ptr->riding].r_idx].level;
2299 DEPTH targetlevel = r_ptr->level;
2302 if ((cur / 200 - 5) < targetlevel)
2305 /* Extra experience */
2306 if ((cur / 100) < ridinglevel)
2308 if ((cur / 100 + 15) < ridinglevel)
2309 inc += 1 + (ridinglevel - (cur / 100 + 15));
2314 attacker_ptr->skill_exp[GINOU_RIDING] = MIN(max, cur + inc);
2315 attacker_ptr->update |= (PU_BONUS);
2319 attacker_ptr->riding_t_m_idx = g_ptr->m_idx;
2320 if (attacker_ptr->migite) py_attack_aux(attacker_ptr, y, x, &fear, &mdeath, 0, mode);
2321 if (attacker_ptr->hidarite && !mdeath) py_attack_aux(attacker_ptr, y, x, &fear, &mdeath, 1, mode);
2323 /* Mutations which yield extra 'natural' attacks */
2326 if ((attacker_ptr->muta2 & MUT2_HORNS) && !mdeath)
2327 natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_HORNS, &fear, &mdeath);
2328 if ((attacker_ptr->muta2 & MUT2_BEAK) && !mdeath)
2329 natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_BEAK, &fear, &mdeath);
2330 if ((attacker_ptr->muta2 & MUT2_SCOR_TAIL) && !mdeath)
2331 natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_SCOR_TAIL, &fear, &mdeath);
2332 if ((attacker_ptr->muta2 & MUT2_TRUNK) && !mdeath)
2333 natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_TRUNK, &fear, &mdeath);
2334 if ((attacker_ptr->muta2 & MUT2_TENTACLES) && !mdeath)
2335 natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_TENTACLES, &fear, &mdeath);
2338 /* Hack -- delay fear messages */
2339 if (fear && m_ptr->ml && !mdeath)
2343 msg_format(_("%^sは恐怖して逃げ出した!", "%^s flees in terror!"), m_name);
2346 if ((attacker_ptr->special_defense & KATA_IAI) && ((mode != HISSATSU_IAI) || mdeath))
2348 set_action(attacker_ptr, ACTION_NONE);
2355 * @brief モンスターからプレイヤーへの打撃処理 / Attack the player via physical attacks.
2356 * @param m_idx 打撃を行うモンスターのID
2357 * @return 実際に攻撃処理を行った場合TRUEを返す
2359 bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
2361 floor_type *floor_ptr = target_ptr->current_floor_ptr;
2362 monster_type *m_ptr = &floor_ptr->m_list[m_idx];
2363 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2371 int do_cut, do_stun;
2375 GAME_TEXT o_name[MAX_NLEN];
2376 GAME_TEXT m_name[MAX_NLEN];
2377 GAME_TEXT ddesc[80];
2380 bool touched = FALSE, fear = FALSE, alive = TRUE;
2381 bool explode = FALSE;
2382 bool do_silly_attack = (one_in_(2) && target_ptr->image);
2383 HIT_POINT get_damage = 0;
2384 int abbreviate = 0; // 2回目以降の省略表現フラグ
2386 /* Not allowed to attack */
2387 if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return FALSE;
2389 if (d_info[target_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) return FALSE;
2391 /* ...nor if friendly */
2392 if (!is_hostile(m_ptr)) return FALSE;
2394 /* Extract the effective monster level */
2395 rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
2397 /* Get the monster name (or "it") */
2398 monster_desc(m_name, m_ptr, 0);
2400 monster_desc(ddesc, m_ptr, MD_WRONGDOER_NAME);
2402 if (target_ptr->special_defense & KATA_IAI)
2404 msg_format(_("相手が襲いかかる前に素早く武器を振るった。", "You took sen, draw and cut in one motion before %s moved."), m_name);
2405 if (py_attack(target_ptr, m_ptr->fy, m_ptr->fx, HISSATSU_IAI)) return TRUE;
2408 if ((target_ptr->special_defense & NINJA_KAWARIMI) && (randint0(55) < (target_ptr->lev*3/5+20)))
2410 if (kawarimi(target_ptr, TRUE)) return TRUE;
2413 /* Assume no blink */
2416 /* Scan through all four blows */
2417 for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
2419 bool obvious = FALSE;
2421 HIT_POINT power = 0;
2422 HIT_POINT damage = 0;
2426 /* Extract the attack infomation */
2427 int effect = r_ptr->blow[ap_cnt].effect;
2428 int method = r_ptr->blow[ap_cnt].method;
2429 int d_dice = r_ptr->blow[ap_cnt].d_dice;
2430 int d_side = r_ptr->blow[ap_cnt].d_side;
2432 if (!monster_is_valid(m_ptr)) break;
2434 /* Hack -- no more attacks */
2437 if (is_pet(m_ptr) && (r_ptr->flags1 & RF1_UNIQUE) && (method == RBM_EXPLODE))
2443 /* Stop if player is dead or gone */
2444 if (!target_ptr->playing || target_ptr->is_dead) break;
2445 if (distance(target_ptr->y, target_ptr->x, m_ptr->fy, m_ptr->fx) > 1) break;
2447 /* Handle "leaving" */
2448 if (target_ptr->leaving) break;
2450 if (method == RBM_SHOOT) continue;
2452 /* Extract the attack "power" */
2453 power = mbe_info[effect].power;
2456 ac = target_ptr->ac + target_ptr->to_a;
2458 /* Monster hits player */
2459 if (!effect || check_hit(target_ptr, power, rlev, MON_STUNNED(m_ptr)))
2461 /* Always disturbing */
2462 disturb(target_ptr, TRUE, TRUE);
2465 /* Hack -- Apply "protection from evil" */
2466 if ((target_ptr->protevil > 0) &&
2467 (r_ptr->flags3 & RF3_EVIL) &&
2468 (target_ptr->lev >= rlev) &&
2469 ((randint0(100) + target_ptr->lev) > 50))
2471 /* Remember the Evil-ness */
2472 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flags3 |= RF3_EVIL;
2475 if (abbreviate) msg_format("撃退した。");
2476 else msg_format("%^sは撃退された。", m_name);
2477 abbreviate = 1; /*2回目以降は省略 */
2479 msg_format("%^s is repelled.", m_name);
2483 /* Hack -- Next attack */
2488 /* Assume no cut or stun */
2489 do_cut = do_stun = 0;
2491 /* Describe the attack method */
2496 act = _("殴られた。", "hits you.");
2497 do_cut = do_stun = 1;
2505 act = _("触られた。", "touches you.");
2513 act = _("パンチされた。", "punches you.");
2522 act = _("蹴られた。", "kicks you.");
2531 act = _("ひっかかれた。", "claws you.");
2540 act = _("噛まれた。", "bites you.");
2549 act = _("刺された。", "stings you.");
2557 act = _("斬られた。", "slashes you.");
2566 act = _("角で突かれた。", "butts you.");
2575 act = _("体当たりされた。", "crushes you.");
2584 act = _("飲み込まれた。", "engulfs you.");
2593 act = _("は請求書をよこした。", "charges you.");
2595 sound(SOUND_BUY); /* Note! This is "charges", not "charges at". */
2602 act = _("が体の上を這い回った。", "crawls on you.");
2610 act = _("よだれをたらされた。", "drools on you.");
2617 act = _("唾を吐かれた。", "spits on you.");
2625 act = _("は爆発した。", "explodes.");
2632 act = _("にらまれた。", "gazes at you.");
2638 act = _("泣き叫ばれた。", "wails at you.");
2645 act = _("胞子を飛ばされた。", "releases spores at you.");
2653 act = _("が XXX4 を発射した。", "projects XXX4's at you.");
2659 act = _("金をせがまれた。", "begs you for money.");
2669 act = desc_insult[randint0(m_ptr->r_idx == MON_DEBBY ? 10 : 8)];
2679 act = desc_moan[randint0(4)];
2689 if (m_ptr->r_idx == MON_JAIAN)
2692 switch(randint1(15))
2697 act = "「♪お~れはジャイアン~~ガ~キだいしょう~」";
2700 act = "「♪て~んかむ~てきのお~とこだぜ~~」";
2703 act = "「♪の~び太スネ夫はメじゃないよ~~」";
2706 act = "「♪け~んかスポ~ツ~どんとこい~」";
2709 act = "「♪うた~も~~う~まいぜ~まかしとけ~」";
2712 act = "「♪ま~ちいちば~んのに~んきもの~~」";
2715 act = "「♪べんきょうしゅくだいメじゃないよ~~」";
2718 act = "「♪きはやさし~くて~ち~からもち~」";
2721 act = "「♪かお~も~~スタイルも~バツグンさ~」";
2724 act = "「♪がっこうい~ちの~あ~ばれんぼう~~」";
2727 act = "「♪ド~ラもドラミもメじゃないよ~~」";
2730 act = "「♪よじげんぽけっと~な~くたって~」";
2733 act = "「♪あし~の~~ながさ~は~まけないぜ~」";
2737 act = "horribly sings 'I AM GIAAAAAN. THE BOOOSS OF THE KIIIIDS.'";
2743 act = _("は♪僕らは楽しい家族♪と歌っている。", "sings 'We are a happy family.'");
2745 act = _("は♪アイ ラブ ユー、ユー ラブ ミー♪と歌っている。", "sings 'I love you, you love me.'");
2755 if (do_silly_attack)
2760 act = silly_attacks[randint0(MAX_SILLY_ATTACK)];
2763 if (abbreviate == 0)
2764 msg_format("%^sに%s", m_name, act);
2765 else if (abbreviate == 1)
2766 msg_format("%s", act);
2767 else /* if (abbreviate == -1) */
2768 msg_format("%^s%s", m_name, act);
2769 abbreviate = 1;/*2回目以降は省略 */
2771 msg_format("%^s %s%s", m_name, act, do_silly_attack ? " you." : "");
2775 /* Hack -- assume all attacks are obvious */
2778 /* Roll out the damage */
2779 damage = damroll(d_dice, d_side);
2782 * Skip the effect when exploding, since the explosion
2783 * already causes the effect.
2785 if(explode) damage = 0;
2786 /* Apply appropriate damage */
2796 case RBE_SUPERHURT: /* AC軽減あり / Player armor reduces total damage */
2798 if (((randint1(rlev*2+300) > (ac+200)) || one_in_(13)) && !CHECK_MULTISHADOW(target_ptr))
2800 int tmp_damage = damage - (damage * ((ac < 150) ? ac : 150) / 250);
2801 msg_print(_("痛恨の一撃!", "It was a critical hit!"));
2802 tmp_damage = MAX(damage, tmp_damage*2);
2804 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, tmp_damage, ddesc, -1);
2808 case RBE_HURT: /* AC軽減あり / Player armor reduces total damage */
2811 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
2812 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2820 /* Take "poison" effect */
2821 if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr)) && !CHECK_MULTISHADOW(target_ptr))
2823 if (set_poisoned(target_ptr, target_ptr->poisoned + randint1(rlev) + 5))
2829 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2831 /* Learn about the player */
2832 update_smart_learn(m_idx, DRS_POIS);
2841 /* Allow complete resist */
2842 if (!target_ptr->resist_disen && !CHECK_MULTISHADOW(target_ptr))
2844 /* Apply disenchantment */
2845 if (apply_disenchant(target_ptr, 0))
2847 /* Hack -- Update AC */
2848 update_creature(target_ptr);
2853 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2855 /* Learn about the player */
2856 update_smart_learn(m_idx, DRS_DISEN);
2863 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2865 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
2868 for (k = 0; k < 10; k++)
2871 i = (INVENTORY_IDX)randint0(INVEN_PACK);
2873 /* Obtain the item */
2874 o_ptr = &target_ptr->inventory_list[i];
2875 if (!o_ptr->k_idx) continue;
2877 /* Drain charged wands/staffs */
2878 if (((o_ptr->tval == TV_STAFF) ||
2879 (o_ptr->tval == TV_WAND)) &&
2882 /* Calculate healed hitpoints */
2883 int heal=rlev * o_ptr->pval;
2884 if( o_ptr->tval == TV_STAFF)
2885 heal *= o_ptr->number;
2887 /* Don't heal more than max hp */
2888 heal = MIN(heal, m_ptr->maxhp - m_ptr->hp);
2890 msg_print(_("ザックからエネルギーが吸い取られた!", "Energy drains from your pack!"));
2894 /* Heal the monster */
2895 m_ptr->hp += (HIT_POINT)heal;
2897 /* Redraw (later) if needed */
2898 if (target_ptr->health_who == m_idx) target_ptr->redraw |= (PR_HEALTH);
2899 if (target_ptr->riding == m_idx) target_ptr->redraw |= (PR_UHEALTH);
2904 /* Combine / Reorder the pack */
2905 target_ptr->update |= (PU_COMBINE | PU_REORDER);
2906 target_ptr->window |= (PW_INVEN);
2917 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2919 /* Confused monsters cannot steal successfully. -LM-*/
2920 if (MON_CONFUSED(m_ptr)) break;
2922 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
2926 /* Saving throw (unless paralyzed) based on dex and level */
2927 if (!target_ptr->paralyzed &&
2928 (randint0(100) < (adj_dex_safe[target_ptr->stat_ind[A_DEX]] +
2931 /* Saving throw message */
2932 msg_print(_("しかし素早く財布を守った!", "You quickly protect your money pouch!"));
2934 /* Occasional blink anyway */
2935 if (randint0(3)) blinked = TRUE;
2941 gold = (target_ptr->au / 10) + randint1(25);
2942 if (gold < 2) gold = 2;
2943 if (gold > 5000) gold = (target_ptr->au / 20) + randint1(3000);
2944 if (gold > target_ptr->au) gold = target_ptr->au;
2945 target_ptr->au -= gold;
2948 msg_print(_("しかし何も盗まれなかった。", "Nothing was stolen."));
2950 else if (target_ptr->au)
2952 msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2953 msg_format(_("$%ld のお金が盗まれた!", "%ld coins were stolen!"), (long)gold);
2954 chg_virtue(target_ptr, V_SACRIFICE, 1);
2958 msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2959 msg_print(_("お金が全部盗まれた!", "All of your coins were stolen!"));
2960 chg_virtue(target_ptr, V_SACRIFICE, 2);
2964 target_ptr->redraw |= (PR_GOLD);
2966 target_ptr->window |= (PW_PLAYER);
2977 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2979 /* Confused monsters cannot steal successfully. -LM-*/
2980 if (MON_CONFUSED(m_ptr)) break;
2982 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
2984 /* Saving throw (unless paralyzed) based on dex and level */
2985 if (!target_ptr->paralyzed && (randint0(100) < (adj_dex_safe[target_ptr->stat_ind[A_DEX]] + target_ptr->lev)))
2987 /* Saving throw message */
2988 msg_print(_("しかしあわててザックを取り返した!", "You grab hold of your backpack!"));
2990 /* Occasional "blink" anyway */
2997 for (k = 0; k < 10; k++)
3002 i = (INVENTORY_IDX)randint0(INVEN_PACK);
3004 /* Obtain the item */
3005 o_ptr = &target_ptr->inventory_list[i];
3006 if (!o_ptr->k_idx) continue;
3008 /* Skip artifacts */
3009 if (object_is_artifact(o_ptr)) continue;
3011 object_desc(o_name, o_ptr, OD_OMIT_PREFIX);
3014 msg_format("%s(%c)を%s盗まれた!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
3016 msg_format("%sour %s (%c) was stolen!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
3018 chg_virtue(target_ptr, V_SACRIFICE, 1);
3019 o_idx = o_pop(floor_ptr);
3025 j_ptr = &floor_ptr->o_list[o_idx];
3026 object_copy(j_ptr, o_ptr);
3031 /* Hack -- If a rod or wand, allocate total
3032 * maximum timeouts or charges between those
3033 * stolen and those missed. -LM-
3035 if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
3037 j_ptr->pval = o_ptr->pval / o_ptr->number;
3038 o_ptr->pval -= j_ptr->pval;
3042 j_ptr->marked = OM_TOUCHED;
3044 /* Memorize monster */
3045 j_ptr->held_m_idx = m_idx;
3048 j_ptr->next_o_idx = m_ptr->hold_o_idx;
3051 m_ptr->hold_o_idx = o_idx;
3054 /* Steal the items */
3055 inven_item_increase(target_ptr, i, -1);
3056 inven_item_optimize(target_ptr, i);
3071 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3073 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3075 /* Steal some food */
3076 for (k = 0; k < 10; k++)
3078 /* Pick an item from the pack */
3079 i = (INVENTORY_IDX)randint0(INVEN_PACK);
3081 o_ptr = &target_ptr->inventory_list[i];
3082 if (!o_ptr->k_idx) continue;
3084 /* Skip non-food objects */
3085 if ((o_ptr->tval != TV_FOOD) && !((o_ptr->tval == TV_CORPSE) && (o_ptr->sval))) continue;
3087 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
3090 msg_format("%s(%c)を%s食べられてしまった!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
3092 msg_format("%sour %s (%c) was eaten!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
3095 /* Steal the items */
3096 inven_item_increase(target_ptr, i, -1);
3097 inven_item_optimize(target_ptr, i);
3109 /* Access the lite */
3110 o_ptr = &target_ptr->inventory_list[INVEN_LITE];
3111 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3113 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3116 if ((o_ptr->xtra4 > 0) && (!object_is_fixed_artifact(o_ptr)))
3119 o_ptr->xtra4 -= (s16b)(250 + randint1(250));
3120 if (o_ptr->xtra4 < 1) o_ptr->xtra4 = 1;
3122 if (!target_ptr->blind)
3124 msg_print(_("明かりが暗くなってしまった。", "Your light dims."));
3128 target_ptr->window |= (PW_EQUIP);
3138 msg_print(_("酸を浴びせられた!", "You are covered in acid!"));
3139 get_damage += acid_dam(target_ptr, damage, ddesc, -1, FALSE);
3140 update_creature(target_ptr);
3141 update_smart_learn(m_idx, DRS_ACID);
3149 msg_print(_("電撃を浴びせられた!", "You are struck by electricity!"));
3150 get_damage += elec_dam(target_ptr, damage, ddesc, -1, FALSE);
3151 update_smart_learn(m_idx, DRS_ELEC);
3159 msg_print(_("全身が炎に包まれた!", "You are enveloped in flames!"));
3160 get_damage += fire_dam(target_ptr, damage, ddesc, -1, FALSE);
3161 update_smart_learn(m_idx, DRS_FIRE);
3169 msg_print(_("全身が冷気で覆われた!", "You are covered with frost!"));
3170 get_damage += cold_dam(target_ptr, damage, ddesc, -1, FALSE);
3171 update_smart_learn(m_idx, DRS_COLD);
3177 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3178 if (target_ptr->is_dead) break;
3180 /* Increase "blind" */
3181 if (!target_ptr->resist_blind && !CHECK_MULTISHADOW(target_ptr))
3183 if (set_blind(target_ptr, target_ptr->blind + 10 + randint1(rlev)))
3186 if (m_ptr->r_idx == MON_DIO) msg_print("どうだッ!この血の目潰しはッ!");
3194 /* Learn about the player */
3195 update_smart_learn(m_idx, DRS_BLIND);
3203 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3205 if (target_ptr->is_dead) break;
3207 /* Increase "confused" */
3208 if (!target_ptr->resist_conf && !CHECK_MULTISHADOW(target_ptr))
3210 if (set_confused(target_ptr, target_ptr->confused + 3 + randint1(rlev)))
3216 /* Learn about the player */
3217 update_smart_learn(m_idx, DRS_CONF);
3224 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3226 if (target_ptr->is_dead) break;
3228 /* Increase "afraid" */
3229 if (CHECK_MULTISHADOW(target_ptr))
3233 else if (target_ptr->resist_fear)
3235 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
3238 else if (randint0(100 + r_ptr->level/2) < target_ptr->skill_sav)
3240 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
3245 if (set_afraid(target_ptr, target_ptr->afraid + 3 + randint1(rlev)))
3251 /* Learn about the player */
3252 update_smart_learn(m_idx, DRS_FEAR);
3259 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3261 if (target_ptr->is_dead) break;
3263 /* Increase "paralyzed" */
3264 if (CHECK_MULTISHADOW(target_ptr))
3268 else if (target_ptr->free_act)
3270 msg_print(_("しかし効果がなかった!", "You are unaffected!"));
3273 else if (randint0(100 + r_ptr->level/2) < target_ptr->skill_sav)
3275 msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
3280 if (!target_ptr->paralyzed)
3282 if (set_paralyzed(target_ptr, 3 + randint1(rlev)))
3289 /* Learn about the player */
3290 update_smart_learn(m_idx, DRS_FREE);
3297 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3299 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3300 if (do_dec_stat(target_ptr, A_STR)) obvious = TRUE;
3307 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3309 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3310 if (do_dec_stat(target_ptr, A_INT)) obvious = TRUE;
3317 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3319 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3320 if (do_dec_stat(target_ptr, A_WIS)) obvious = TRUE;
3327 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3329 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3330 if (do_dec_stat(target_ptr, A_DEX)) obvious = TRUE;
3337 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3339 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3340 if (do_dec_stat(target_ptr, A_CON)) obvious = TRUE;
3347 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3349 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3350 if (do_dec_stat(target_ptr, A_CHR)) obvious = TRUE;
3357 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3359 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3361 /* Damage (stats) */
3362 if (do_dec_stat(target_ptr, A_STR)) obvious = TRUE;
3363 if (do_dec_stat(target_ptr, A_DEX)) obvious = TRUE;
3364 if (do_dec_stat(target_ptr, A_CON)) obvious = TRUE;
3365 if (do_dec_stat(target_ptr, A_INT)) obvious = TRUE;
3366 if (do_dec_stat(target_ptr, A_WIS)) obvious = TRUE;
3367 if (do_dec_stat(target_ptr, A_CHR)) obvious = TRUE;
3376 /* Hack -- Reduce damage based on the player armor class */
3377 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
3379 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3381 /* Radius 8 earthquake centered at the monster */
3382 if (damage > 23 || explode)
3384 earthquake(target_ptr, m_ptr->fy, m_ptr->fx, 8, m_idx);
3392 s32b d = damroll(10, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3396 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3398 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3400 (void)drain_exp(target_ptr, d, d / 10, 95);
3406 s32b d = damroll(20, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3410 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3412 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3414 (void)drain_exp(target_ptr, d, d / 10, 90);
3420 s32b d = damroll(40, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3424 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3426 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3428 (void)drain_exp(target_ptr, d, d / 10, 75);
3434 s32b d = damroll(80, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3438 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3440 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3442 (void)drain_exp(target_ptr, d, d / 10, 50);
3448 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3450 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3452 /* Take "poison" effect */
3453 if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr)))
3455 if (set_poisoned(target_ptr, target_ptr->poisoned + randint1(rlev) + 5))
3461 /* Damage CON (10% chance)*/
3462 if ((randint1(100) < 11) && (target_ptr->prace != RACE_ANDROID))
3464 /* 1% chance for perm. damage */
3465 bool perm = one_in_(10);
3466 if (dec_stat(target_ptr, A_CON, randint1(10), perm))
3468 msg_print(_("病があなたを蝕んでいる気がする。", "You feel strange sickness."));
3478 if (!target_ptr->resist_time && !CHECK_MULTISHADOW(target_ptr))
3480 switch (randint1(10))
3482 case 1: case 2: case 3: case 4: case 5:
3484 if (target_ptr->prace == RACE_ANDROID) break;
3485 msg_print(_("人生が逆戻りした気がする。", "You feel life has clocked back."));
3486 lose_exp(target_ptr, 100 + (target_ptr->exp / 100) * MON_DRAIN_LIFE);
3490 case 6: case 7: case 8: case 9:
3492 int stat = randint0(6);
3497 case A_STR: act = "強く"; break;
3498 case A_INT: act = "聡明で"; break;
3499 case A_WIS: act = "賢明で"; break;
3500 case A_DEX: act = "器用で"; break;
3501 case A_CON: act = "健康で"; break;
3502 case A_CHR: act = "美しく"; break;
3504 case A_STR: act = "strong"; break;
3505 case A_INT: act = "bright"; break;
3506 case A_WIS: act = "wise"; break;
3507 case A_DEX: act = "agile"; break;
3508 case A_CON: act = "hale"; break;
3509 case A_CHR: act = "beautiful"; break;
3514 msg_format(_("あなたは以前ほど%sなくなってしまった...。", "You're not as %s as you used to be..."), act);
3515 target_ptr->stat_cur[stat] = (target_ptr->stat_cur[stat] * 3) / 4;
3516 if (target_ptr->stat_cur[stat] < 3) target_ptr->stat_cur[stat] = 3;
3517 target_ptr->update |= (PU_BONUS);
3523 msg_print(_("あなたは以前ほど力強くなくなってしまった...。", "You're not as powerful as you used to be..."));
3525 for (k = 0; k < A_MAX; k++)
3527 target_ptr->stat_cur[k] = (target_ptr->stat_cur[k] * 7) / 8;
3528 if (target_ptr->stat_cur[k] < 3) target_ptr->stat_cur[k] = 3;
3530 target_ptr->update |= (PU_BONUS);
3535 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3541 s32b d = damroll(60, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3546 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3548 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3550 resist_drain = !drain_exp(target_ptr, d, d / 10, 50);
3552 /* Heal the attacker? */
3553 if (target_ptr->mimic_form)
3555 if (mimic_info[target_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
3556 resist_drain = TRUE;
3560 switch (target_ptr->prace)
3569 resist_drain = TRUE;
3574 if ((damage > 5) && !resist_drain)
3576 bool did_heal = FALSE;
3578 if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
3581 m_ptr->hp += damroll(4, damage / 6);
3582 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
3584 /* Redraw (later) if needed */
3585 if (target_ptr->health_who == m_idx) target_ptr->redraw |= (PR_HEALTH);
3586 if (target_ptr->riding == m_idx) target_ptr->redraw |= (PR_UHEALTH);
3588 /* Special message */
3589 if (m_ptr->ml && did_heal)
3591 msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), m_name);
3601 if (CHECK_MULTISHADOW(target_ptr))
3603 msg_print(_("攻撃は幻影に命中し、あなたには届かなかった。", "The attack hits Shadow, you are unharmed!"));
3609 target_ptr->csp -= damage;
3610 if (target_ptr->csp < 0)
3612 target_ptr->csp = 0;
3613 target_ptr->csp_frac = 0;
3616 target_ptr->redraw |= (PR_MANA);
3619 /* Learn about the player */
3620 update_smart_learn(m_idx, DRS_MANA);
3626 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3628 if (target_ptr->is_dead) break;
3630 /* Decrease speed */
3631 if (CHECK_MULTISHADOW(target_ptr))
3637 if (set_slow(target_ptr, (target_ptr->slow + 4 + randint0(rlev / 10)), FALSE))
3647 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3649 if (target_ptr->is_dead) break;
3651 /* Decrease speed */
3652 if (target_ptr->resist_sound || CHECK_MULTISHADOW(target_ptr))
3658 if (set_stun(target_ptr, target_ptr->stun + 10 + randint1(r_ptr->level / 4)))
3668 /* Hack -- only one of cut or stun */
3669 if (do_cut && do_stun)
3672 if (randint0(100) < 50)
3689 /* Critical hit (zero if non-critical) */
3690 tmp = monster_critical(d_dice, d_side, damage);
3692 /* Roll for damage */
3695 case 0: cut_plus = 0; break;
3696 case 1: cut_plus = randint1(5); break;
3697 case 2: cut_plus = randint1(5) + 5; break;
3698 case 3: cut_plus = randint1(20) + 20; break;
3699 case 4: cut_plus = randint1(50) + 50; break;
3700 case 5: cut_plus = randint1(100) + 100; break;
3701 case 6: cut_plus = 300; break;
3702 default: cut_plus = 500; break;
3706 if (cut_plus) (void)set_cut(target_ptr,target_ptr->cut + cut_plus);
3714 /* Critical hit (zero if non-critical) */
3715 tmp = monster_critical(d_dice, d_side, damage);
3717 /* Roll for damage */
3720 case 0: stun_plus = 0; break;
3721 case 1: stun_plus = randint1(5); break;
3722 case 2: stun_plus = randint1(5) + 10; break;
3723 case 3: stun_plus = randint1(10) + 20; break;
3724 case 4: stun_plus = randint1(15) + 30; break;
3725 case 5: stun_plus = randint1(20) + 40; break;
3726 case 6: stun_plus = 80; break;
3727 default: stun_plus = 150; break;
3730 /* Apply the stun */
3731 if (stun_plus) (void)set_stun(target_ptr, target_ptr->stun + stun_plus);
3736 sound(SOUND_EXPLODE);
3738 if (mon_take_hit(target_ptr, m_idx, m_ptr->hp + 1, &fear, NULL))
3747 if (target_ptr->sh_fire && alive && !target_ptr->is_dead)
3749 if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK))
3751 HIT_POINT dam = damroll(2, 6);
3753 /* Modify the damage */
3754 dam = mon_damage_mod(m_ptr, dam, FALSE);
3756 msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), m_name);
3758 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は灰の山になった。", " turns into a pile of ash.")))
3766 if (is_original_ap_and_seen(m_ptr))
3767 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
3771 if (target_ptr->sh_elec && alive && !target_ptr->is_dead)
3773 if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK))
3775 HIT_POINT dam = damroll(2, 6);
3777 /* Modify the damage */
3778 dam = mon_damage_mod(m_ptr, dam, FALSE);
3780 msg_format(_("%^sは電撃をくらった!", "%^s gets zapped!"), m_name);
3781 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は燃え殻の山になった。", " turns into a pile of cinder.")))
3789 if (is_original_ap_and_seen(m_ptr))
3790 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
3794 if (target_ptr->sh_cold && alive && !target_ptr->is_dead)
3796 if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK))
3798 HIT_POINT dam = damroll(2, 6);
3800 /* Modify the damage */
3801 dam = mon_damage_mod(m_ptr, dam, FALSE);
3803 msg_format(_("%^sは冷気をくらった!", "%^s is very cold!"), m_name);
3804 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は凍りついた。", " was frozen.")))
3812 if (is_original_ap_and_seen(m_ptr))
3813 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
3818 if (target_ptr->dustrobe && alive && !target_ptr->is_dead)
3820 if (!(r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK))
3822 HIT_POINT dam = damroll(2, 6);
3824 /* Modify the damage */
3825 dam = mon_damage_mod(m_ptr, dam, FALSE);
3827 msg_format(_("%^sは鏡の破片をくらった!", "%^s gets zapped!"), m_name);
3828 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("はズタズタになった。", " had torn to pieces.")))
3836 if (is_original_ap_and_seen(m_ptr))
3837 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK);
3840 if (is_mirror_grid(&floor_ptr->grid_array[target_ptr->y][target_ptr->x]))
3842 teleport_player(target_ptr, 10, 0L);
3846 if (target_ptr->tim_sh_holy && alive && !target_ptr->is_dead)
3848 if (r_ptr->flags3 & RF3_EVIL)
3850 if (!(r_ptr->flagsr & RFR_RES_ALL))
3852 HIT_POINT dam = damroll(2, 6);
3854 /* Modify the damage */
3855 dam = mon_damage_mod(m_ptr, dam, FALSE);
3857 msg_format(_("%^sは聖なるオーラで傷ついた!", "%^s is injured by holy power!"), m_name);
3858 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3863 if (is_original_ap_and_seen(m_ptr))
3864 r_ptr->r_flags3 |= RF3_EVIL;
3868 if (is_original_ap_and_seen(m_ptr))
3869 r_ptr->r_flagsr |= RFR_RES_ALL;
3874 if (target_ptr->tim_sh_touki && alive && !target_ptr->is_dead)
3876 if (!(r_ptr->flagsr & RFR_RES_ALL))
3878 HIT_POINT dam = damroll(2, 6);
3880 /* Modify the damage */
3881 dam = mon_damage_mod(m_ptr, dam, FALSE);
3883 msg_format(_("%^sが鋭い闘気のオーラで傷ついた!", "%^s is injured by the Force"), m_name);
3884 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3892 if (is_original_ap_and_seen(m_ptr))
3893 r_ptr->r_flagsr |= RFR_RES_ALL;
3897 if (hex_spelling(HEX_SHADOW_CLOAK) && alive && !target_ptr->is_dead)
3900 object_type *o_armed_ptr = &target_ptr->inventory_list[INVEN_RARM];
3902 if (!(r_ptr->flagsr & RFR_RES_ALL || r_ptr->flagsr & RFR_RES_DARK))
3904 if (o_armed_ptr->k_idx)
3906 int basedam = ((o_armed_ptr->dd + target_ptr->to_dd[0]) * (o_armed_ptr->ds + target_ptr->to_ds[0] + 1));
3907 dam = basedam / 2 + o_armed_ptr->to_d + target_ptr->to_d[0];
3910 /* Cursed armor makes damages doubled */
3911 o_armed_ptr = &target_ptr->inventory_list[INVEN_BODY];
3912 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr)) dam *= 2;
3914 /* Modify the damage */
3915 dam = mon_damage_mod(m_ptr, dam, FALSE);
3917 msg_format(_("影のオーラが%^sに反撃した!", "Enveloping shadows attack %^s."), m_name);
3918 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3923 else /* monster does not dead */
3926 BIT_FLAGS flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
3927 EFFECT_ID typ[4][2] = {
3928 { INVEN_HEAD, GF_OLD_CONF },
3929 { INVEN_LARM, GF_OLD_SLEEP },
3930 { INVEN_HANDS, GF_TURN_ALL },
3931 { INVEN_FEET, GF_OLD_SLOW }
3934 /* Some cursed armours gives an extra effect */
3935 for (j = 0; j < 4; j++)
3937 o_armed_ptr = &target_ptr->inventory_list[typ[j][0]];
3938 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr) && object_is_armour(o_armed_ptr))
3939 project(target_ptr, 0, 0, m_ptr->fy, m_ptr->fx, (target_ptr->lev * 2), typ[j][1], flg, -1);
3945 if (is_original_ap_and_seen(m_ptr))
3946 r_ptr->r_flagsr |= (RFR_RES_ALL | RFR_RES_DARK);
3952 /* Monster missed player */
3955 /* Analyze failed attacks */
3971 /* Visible monsters */
3974 disturb(target_ptr, TRUE, TRUE);
3978 msg_format("%sかわした。", (target_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "");
3980 msg_format("%s%^sの攻撃をかわした。", (target_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "", m_name);
3981 abbreviate = 1;/*2回目以降は省略 */
3983 msg_format("%^s misses you.", m_name);
3988 /* Gain shield experience */
3989 if (object_is_armour(&target_ptr->inventory_list[INVEN_RARM]) || object_is_armour(&target_ptr->inventory_list[INVEN_LARM]))
3991 int cur = target_ptr->skill_exp[GINOU_SHIELD];
3992 int max = s_info[target_ptr->pclass].s_max[GINOU_SHIELD];
3996 DEPTH targetlevel = r_ptr->level;
4000 /* Extra experience */
4001 if ((cur / 100) < targetlevel)
4003 if ((cur / 100 + 15) < targetlevel)
4004 inc += 1 + (targetlevel - (cur / 100 + 15));
4009 target_ptr->skill_exp[GINOU_SHIELD] = MIN(max, cur + inc);
4010 target_ptr->update |= (PU_BONUS);
4020 /* Analyze "visible" monsters only */
4021 if (is_original_ap_and_seen(m_ptr) && !do_silly_attack)
4023 /* Count "obvious" attacks (and ones that cause damage) */
4024 if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
4026 /* Count attacks of this type */
4027 if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
4029 r_ptr->r_blows[ap_cnt]++;
4034 if (target_ptr->riding && damage)
4036 char m_steed_name[MAX_NLEN];
4037 monster_desc(m_steed_name, &floor_ptr->m_list[target_ptr->riding], 0);
4038 if (rakuba(target_ptr, (damage > 200) ? 200 : damage, FALSE))
4040 msg_format(_("%^sから落ちてしまった!", "You have fallen from %s."), m_steed_name);
4044 if (target_ptr->special_defense & NINJA_KAWARIMI)
4046 if (kawarimi(target_ptr, FALSE)) return TRUE;
4050 /* Hex - revenge damage stored */
4051 revenge_store(target_ptr, get_damage);
4053 if ((target_ptr->tim_eyeeye || hex_spelling(HEX_EYE_FOR_EYE))
4054 && get_damage > 0 && !target_ptr->is_dead)
4057 msg_format("攻撃が%s自身を傷つけた!", m_name);
4059 GAME_TEXT m_name_self[80];
4062 monster_desc(m_name_self, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE);
4064 msg_format("The attack of %s has wounded %s!", m_name, m_name_self);
4066 project(target_ptr, 0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL, -1);
4067 if (target_ptr->tim_eyeeye) set_tim_eyeeye(target_ptr, target_ptr->tim_eyeeye-5, TRUE);
4070 if ((target_ptr->counter || (target_ptr->special_defense & KATA_MUSOU)) && alive && !target_ptr->is_dead && m_ptr->ml && (target_ptr->csp > 7))
4072 char m_target_name[MAX_NLEN];
4073 monster_desc(m_target_name, m_ptr, 0);
4075 target_ptr->csp -= 7;
4076 msg_format(_("%^sに反撃した!", "Your counterattacked to %s!"), m_target_name);
4077 py_attack(target_ptr, m_ptr->fy, m_ptr->fx, HISSATSU_COUNTER);
4079 target_ptr->redraw |= (PR_MANA);
4083 if (blinked && alive && !target_ptr->is_dead)
4085 if (teleport_barrier(target_ptr, m_idx))
4087 msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But magic barrier obstructs it."));
4091 msg_print(_("泥棒は笑って逃げた!", "The thief flees laughing!"));
4092 teleport_away(target_ptr, m_idx, MAX_SIGHT * 2 + 5, 0L);
4096 /* Always notice cause of death */
4097 if (target_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !floor_ptr->inside_arena)
4102 if (m_ptr->ml && fear && alive && !target_ptr->is_dead)
4105 msg_format(_("%^sは恐怖で逃げ出した!", "%^s flees in terror!"), m_name);
4108 if (target_ptr->special_defense & KATA_IAI)
4110 set_action(target_ptr, ACTION_NONE);
4113 /* Assume we attacked */
4118 #define BLOW_EFFECT_TYPE_NONE 0
4119 #define BLOW_EFFECT_TYPE_FEAR 1
4120 #define BLOW_EFFECT_TYPE_SLEEP 2
4121 #define BLOW_EFFECT_TYPE_HEAL 3
4124 * @brief モンスターから敵モンスターへの打撃攻撃処理
4125 * @param m_idx 攻撃側モンスターの参照ID
4126 * @param t_idx 目標側モンスターの参照ID
4127 * @return 実際に打撃処理が行われた場合TRUEを返す
4129 bool monst_attack_monst(player_type *subject_ptr, MONSTER_IDX m_idx, MONSTER_IDX t_idx)
4131 monster_type *m_ptr = &subject_ptr->current_floor_ptr->m_list[m_idx];
4132 monster_type *t_ptr = &subject_ptr->current_floor_ptr->m_list[t_idx];
4134 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4135 monster_race *tr_ptr = &r_info[t_ptr->r_idx];
4137 ARMOUR_CLASS ap_cnt;
4141 GAME_TEXT m_name[MAX_NLEN], t_name[MAX_NLEN];
4142 char temp[MAX_NLEN];
4144 bool explode = FALSE, touched = FALSE, fear = FALSE, dead = FALSE;
4145 POSITION y_saver = t_ptr->fy;
4146 POSITION x_saver = t_ptr->fx;
4149 bool see_m = is_seen(m_ptr);
4150 bool see_t = is_seen(t_ptr);
4151 bool see_either = see_m || see_t;
4153 /* Can the player be aware of this attack? */
4154 bool known = (m_ptr->cdis <= MAX_SIGHT) || (t_ptr->cdis <= MAX_SIGHT);
4155 bool do_silly_attack = (one_in_(2) && subject_ptr->image);
4157 /* Cannot attack self */
4158 if (m_idx == t_idx) return FALSE;
4160 /* Not allowed to attack */
4161 if (r_ptr->flags1 & RF1_NEVER_BLOW) return FALSE;
4163 if (d_info[subject_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) return FALSE;
4168 /* Extract the effective monster level */
4169 rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
4171 monster_desc(m_name, m_ptr, 0);
4172 monster_desc(t_name, t_ptr, 0);
4174 /* Assume no blink */
4177 if (!see_either && known)
4179 subject_ptr->current_floor_ptr->monster_noise = TRUE;
4182 if (subject_ptr->riding && (m_idx == subject_ptr->riding)) disturb(subject_ptr, TRUE, TRUE);
4184 /* Scan through all four blows */
4185 for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
4187 bool obvious = FALSE;
4189 HIT_POINT power = 0;
4190 HIT_POINT damage = 0;
4194 /* Extract the attack infomation */
4195 int effect = r_ptr->blow[ap_cnt].effect;
4196 int method = r_ptr->blow[ap_cnt].method;
4197 int d_dice = r_ptr->blow[ap_cnt].d_dice;
4198 int d_side = r_ptr->blow[ap_cnt].d_side;
4200 if (!monster_is_valid(m_ptr)) break;
4202 /* Stop attacking if the target dies! */
4203 if (t_ptr->fx != x_saver || t_ptr->fy != y_saver)
4206 /* Hack -- no more attacks */
4209 if (method == RBM_SHOOT) continue;
4211 /* Extract the attack "power" */
4212 power = mbe_info[effect].power;
4215 if (!effect || check_hit2(power, rlev, ac, MON_STUNNED(m_ptr)))
4217 (void)set_monster_csleep(t_idx, 0);
4221 /* Redraw the health bar */
4222 if (subject_ptr->health_who == t_idx) subject_ptr->redraw |= (PR_HEALTH);
4223 if (subject_ptr->riding == t_idx) subject_ptr->redraw |= (PR_UHEALTH);
4226 /* Describe the attack method */
4231 act = _("%sを殴った。", "hits %s.");
4238 act = _("%sを触った。", "touches %s.");
4245 act = _("%sをパンチした。", "punches %s.");
4252 act = _("%sを蹴った。", "kicks %s.");
4259 act = _("%sをひっかいた。", "claws %s.");
4266 act = _("%sを噛んだ。", "bites %s.");
4273 act = _("%sを刺した。", "stings %s.");
4280 act = _("%sを斬った。", "slashes %s.");
4286 act = _("%sを角で突いた。", "butts %s.");
4293 act = _("%sに体当りした。", "crushes %s.");
4300 act = _("%sを飲み込んだ。", "engulfs %s.");
4307 act = _("%sに請求書をよこした。", "charges %s.");
4314 act = _("%sの体の上を這い回った。", "crawls on %s.");
4321 act = _("%sによだれをたらした。", "drools on %s.");
4328 act = _("%sに唾を吐いた。", "spits on %s.");
4335 if (see_either) disturb(subject_ptr, TRUE, TRUE);
4336 act = _("爆発した。", "explodes.");
4344 act = _("%sをにらんだ。", "gazes at %s.");
4351 act = _("%sに泣きついた。", "wails at %s.");
4358 act = _("%sに胞子を飛ばした。", "releases spores at %s.");
4365 act = _("%sにXXX4を飛ばした。", "projects XXX4's at %s.");
4372 act = _("%sに金をせがんだ。", "begs %s for money.");
4379 act = _("%sを侮辱した。", "insults %s.");
4386 act = _("%sにむかってうめいた。", "moans at %s.");
4393 act = _("%sにむかって歌った。", "sings to %s.");
4399 if (act && see_either)
4402 if (do_silly_attack) act = silly_attacks2[randint0(MAX_SILLY_ATTACK)];
4403 strfmt(temp, act, t_name);
4404 msg_format("%^sは%s", m_name, temp);
4406 if (do_silly_attack)
4408 act = silly_attacks[randint0(MAX_SILLY_ATTACK)];
4409 strfmt(temp, "%s %s.", act, t_name);
4411 else strfmt(temp, act, t_name);
4412 msg_format("%^s %s", m_name, temp);
4416 /* Hack -- assume all attacks are obvious */
4419 /* Roll out the damage */
4420 damage = damroll(d_dice, d_side);
4422 /* Assume no effect */
4423 effect_type = BLOW_EFFECT_TYPE_NONE;
4427 /* Apply appropriate damage */
4436 if ((randint1(rlev * 2 + 250) > (ac + 200)) || one_in_(13))
4438 int tmp_damage = damage - (damage * ((ac < 150) ? ac : 150) / 250);
4439 damage = MAX(damage, tmp_damage * 2);
4446 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
4461 if ((subject_ptr->riding != m_idx) && one_in_(2)) blinked = TRUE;
4497 effect_type = BLOW_EFFECT_TYPE_FEAR;
4501 effect_type = BLOW_EFFECT_TYPE_SLEEP;
4505 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
4506 if (damage > 23) earthquake(subject_ptr, m_ptr->fy, m_ptr->fx, 8, m_idx);
4521 pt = GF_HYPODYNAMIA;
4522 effect_type = BLOW_EFFECT_TYPE_HEAL;
4540 /* Do damage if not exploding */
4543 project(subject_ptr, m_idx, 0, t_ptr->fy, t_ptr->fx,
4544 damage, pt, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4547 switch (effect_type)
4549 case BLOW_EFFECT_TYPE_FEAR:
4550 project(subject_ptr, m_idx, 0, t_ptr->fy, t_ptr->fx,
4551 damage, GF_TURN_ALL, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4554 case BLOW_EFFECT_TYPE_SLEEP:
4555 project(subject_ptr, m_idx, 0, t_ptr->fy, t_ptr->fx,
4556 r_ptr->level, GF_OLD_SLEEP, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4559 case BLOW_EFFECT_TYPE_HEAL:
4560 if ((monster_living(m_idx)) && (damage > 2))
4562 bool did_heal = FALSE;
4564 if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
4567 m_ptr->hp += damroll(4, damage / 6);
4568 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
4570 /* Redraw (later) if needed */
4571 if (subject_ptr->health_who == m_idx) subject_ptr->redraw |= (PR_HEALTH);
4572 if (subject_ptr->riding == m_idx) subject_ptr->redraw |= (PR_UHEALTH);
4574 /* Special message */
4575 if (see_m && did_heal)
4577 msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), m_name);
4586 if ((tr_ptr->flags2 & RF2_AURA_FIRE) && m_ptr->r_idx)
4588 if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK))
4592 msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), m_name);
4594 if (m_ptr->ml && is_original_ap_and_seen(t_ptr)) tr_ptr->r_flags2 |= RF2_AURA_FIRE;
4595 project(subject_ptr, t_idx, 0, m_ptr->fy, m_ptr->fx,
4596 damroll(1 + ((tr_ptr->level) / 26),
4597 1 + ((tr_ptr->level) / 17)),
4598 GF_FIRE, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4602 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
4607 if ((tr_ptr->flags3 & RF3_AURA_COLD) && m_ptr->r_idx)
4609 if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK))
4613 msg_format(_("%^sは突然寒くなった!", "%^s is suddenly very cold!"), m_name);
4615 if (m_ptr->ml && is_original_ap_and_seen(t_ptr)) tr_ptr->r_flags3 |= RF3_AURA_COLD;
4616 project(subject_ptr, t_idx, 0, m_ptr->fy, m_ptr->fx,
4617 damroll(1 + ((tr_ptr->level) / 26),
4618 1 + ((tr_ptr->level) / 17)),
4619 GF_COLD, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4623 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
4628 if ((tr_ptr->flags2 & RF2_AURA_ELEC) && m_ptr->r_idx)
4630 if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK))
4634 msg_format(_("%^sは電撃を食らった!", "%^s gets zapped!"), m_name);
4636 if (m_ptr->ml && is_original_ap_and_seen(t_ptr)) tr_ptr->r_flags2 |= RF2_AURA_ELEC;
4637 project(subject_ptr, t_idx, 0, m_ptr->fy, m_ptr->fx,
4638 damroll(1 + ((tr_ptr->level) / 26),
4639 1 + ((tr_ptr->level) / 17)),
4640 GF_ELEC, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4644 if (is_original_ap_and_seen(m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
4651 /* Monster missed player */
4654 /* Analyze failed attacks */
4670 (void)set_monster_csleep(t_idx, 0);
4672 /* Visible monsters */
4676 msg_format("%sは%^sの攻撃をかわした。", t_name, m_name);
4678 msg_format("%^s misses %s.", m_name, t_name);
4688 /* Analyze "visible" monsters only */
4689 if (is_original_ap_and_seen(m_ptr) && !do_silly_attack)
4691 /* Count "obvious" attacks (and ones that cause damage) */
4692 if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
4694 /* Count attacks of this type */
4695 if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
4697 r_ptr->r_blows[ap_cnt]++;
4705 sound(SOUND_EXPLODE);
4707 /* Cancel Invulnerability */
4708 (void)set_monster_invulner(m_idx, 0, FALSE);
4709 mon_take_hit_mon(m_idx, m_ptr->hp + 1, &dead, &fear, _("は爆発して粉々になった。", " explodes into tiny shreds."), m_idx);
4714 if (blinked && m_ptr->r_idx)
4716 if (teleport_barrier(subject_ptr, m_idx))
4720 msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But magic barrier obstructs it."));
4724 subject_ptr->current_floor_ptr->monster_noise = TRUE;
4731 msg_print(_("泥棒は笑って逃げた!", "The thief flees laughing!"));
4735 subject_ptr->current_floor_ptr->monster_noise = TRUE;
4738 teleport_away(subject_ptr, m_idx, MAX_SIGHT * 2 + 5, 0L);
4748 * @brief モンスターが敵モンスターに行う打撃処理 /
4749 * Hack, based on mon_take_hit... perhaps all monster attacks on other monsters should use this?
4750 * @param m_idx 目標となるモンスターの参照ID
4752 * @param dead 目標となったモンスターの死亡状態を返す参照ポインタ
4753 * @param fear 目標となったモンスターの恐慌状態を返す参照ポインタ
4754 * @param note 目標モンスターが死亡した場合の特別メッセージ(NULLならば標準表示を行う)
4755 * @param who 打撃を行ったモンスターの参照ID
4758 void mon_take_hit_mon(MONSTER_IDX m_idx, HIT_POINT dam, bool *dead, bool *fear, concptr note, MONSTER_IDX who)
4760 monster_type *m_ptr = &p_ptr->current_floor_ptr->m_list[m_idx];
4761 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4762 GAME_TEXT m_name[160];
4763 bool seen = is_seen(m_ptr);
4765 /* Can the player be aware of this attack? */
4766 bool known = (m_ptr->cdis <= MAX_SIGHT);
4768 monster_desc(m_name, m_ptr, 0);
4770 /* Redraw (later) if needed */
4773 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
4774 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
4777 (void)set_monster_csleep(m_idx, 0);
4779 if (p_ptr->riding && (m_idx == p_ptr->riding)) disturb(p_ptr, TRUE, TRUE);
4781 if (MON_INVULNER(m_ptr) && randint0(PENETRATE_INVULNERABILITY))
4785 msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
4790 if (r_ptr->flagsr & RFR_RES_ALL)
4795 if ((dam == 0) && one_in_(3)) dam = 1;
4801 msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
4810 /* It is dead now... or is it? */
4813 if (((r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) ||
4814 (r_ptr->flags7 & RF7_NAZGUL)) &&
4822 if (!monster_living(m_ptr->r_idx))
4824 sound(SOUND_N_KILL);
4835 monster_desc(m_name, m_ptr, MD_TRUE_NAME);
4836 /* Unseen death by normal attack */
4839 p_ptr->current_floor_ptr->monster_noise = TRUE;
4841 /* Death by special attack */
4844 msg_format(_("%^s%s", "%^s%s"), m_name, note);
4846 /* Death by normal attack -- nonliving monster */
4847 else if (!monster_living(m_ptr->r_idx))
4849 msg_format(_("%^sは破壊された。", "%^s is destroyed."), m_name);
4851 /* Death by normal attack -- living monster */
4854 msg_format(_("%^sは殺された。", "%^s is killed."), m_name);
4858 monster_gain_exp(who, m_ptr->r_idx);
4859 monster_death(m_idx, FALSE);
4860 delete_monster_idx(m_idx);
4865 /* Monster is dead */
4874 /* Mega-Hack -- Pain cancels fear */
4875 if (MON_MONFEAR(m_ptr) && (dam > 0))
4878 if (set_monster_monfear(m_idx, MON_MONFEAR(m_ptr) - randint1(dam / 4)))
4885 /* Sometimes a monster gets scared by damage */
4886 if (!MON_MONFEAR(m_ptr) && !(r_ptr->flags3 & RF3_NO_FEAR))
4888 /* Percentage of fully healthy */
4889 int percentage = (100L * m_ptr->hp) / m_ptr->maxhp;
4892 * Run (sometimes) if at 10% or less of max hit points,
4893 * or (usually) when hit for half its current hit points
4895 if (((percentage <= 10) && (randint0(10) < percentage)) ||
4896 ((dam >= m_ptr->hp) && (randint0(100) < 80)))
4898 /* Hack -- note fear */
4901 /* Hack -- Add some timed fear */
4902 (void)set_monster_monfear(m_idx, (randint1(10) +
4903 (((dam >= m_ptr->hp) && (percentage > 7)) ?
4904 20 : ((11 - percentage) * 5))));
4908 #endif /* ALLOW_FEAR */
4910 if ((dam > 0) && !is_pet(m_ptr) && !is_friendly(m_ptr) && (who != m_idx))
4912 if (is_pet(&p_ptr->current_floor_ptr->m_list[who]) && !player_bold(p_ptr, m_ptr->target_y, m_ptr->target_x))
4914 set_target(m_ptr, p_ptr->current_floor_ptr->m_list[who].fy, p_ptr->current_floor_ptr->m_list[who].fx);
4918 if (p_ptr->riding && (p_ptr->riding == m_idx) && (dam > 0))
4920 monster_desc(m_name, m_ptr, 0);
4922 if (m_ptr->hp > m_ptr->maxhp / 3) dam = (dam + 1) / 2;
4923 if (rakuba(p_ptr, (dam > 200) ? 200 : dam, FALSE))
4925 msg_format(_("%^sに振り落とされた!", "You have been thrown off from %s!"), m_name);