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
17 #include "main/sound-definitions-table.h"
21 #include "monsterrace-hook.h"
24 #include "monster-status.h"
25 #include "monster-spell.h"
27 #include "realm-hex.h"
28 #include "realm-song.h"
29 #include "object-flavor.h"
30 #include "object-hook.h"
37 #include "player-move.h"
38 #include "player-effects.h"
39 #include "player-skill.h"
40 #include "player-damage.h"
41 #include "player-status.h"
42 #include "player/mimic-info-table.h"
43 #include "player-class.h"
44 #include "player-personality.h"
45 #include "view-mainwindow.h"
47 #include "spells-floor.h"
49 #define BLOW_EFFECT_TYPE_NONE 0
50 #define BLOW_EFFECT_TYPE_FEAR 1
51 #define BLOW_EFFECT_TYPE_SLEEP 2
52 #define BLOW_EFFECT_TYPE_HEAL 3
55 * @brief モンスターの打撃効力テーブル /
56 * The table of monsters' blow effects
58 const mbe_info_type mbe_info[] =
61 { 60, GF_MISSILE, }, /* HURT */
62 { 5, GF_POIS, }, /* POISON */
63 { 20, GF_DISENCHANT, }, /* UN_BONUS */
64 { 15, GF_MISSILE, }, /* UN_POWER */ /* ToDo: Apply the correct effects */
65 { 5, GF_MISSILE, }, /* EAT_GOLD */
66 { 5, GF_MISSILE, }, /* EAT_ITEM */
67 { 5, GF_MISSILE, }, /* EAT_FOOD */
68 { 5, GF_MISSILE, }, /* EAT_LITE */
69 { 0, GF_ACID, }, /* ACID */
70 { 10, GF_ELEC, }, /* ELEC */
71 { 10, GF_FIRE, }, /* FIRE */
72 { 10, GF_COLD, }, /* COLD */
73 { 2, GF_MISSILE, }, /* BLIND */
74 { 10, GF_CONFUSION, }, /* CONFUSE */
75 { 10, GF_MISSILE, }, /* TERRIFY */
76 { 2, GF_MISSILE, }, /* PARALYZE */
77 { 0, GF_MISSILE, }, /* LOSE_STR */
78 { 0, GF_MISSILE, }, /* LOSE_INT */
79 { 0, GF_MISSILE, }, /* LOSE_WIS */
80 { 0, GF_MISSILE, }, /* LOSE_DEX */
81 { 0, GF_MISSILE, }, /* LOSE_CON */
82 { 0, GF_MISSILE, }, /* LOSE_CHR */
83 { 2, GF_MISSILE, }, /* LOSE_ALL */
84 { 60, GF_ROCKET, }, /* SHATTER */
85 { 5, GF_MISSILE, }, /* EXP_10 */
86 { 5, GF_MISSILE, }, /* EXP_20 */
87 { 5, GF_MISSILE, }, /* EXP_40 */
88 { 5, GF_MISSILE, }, /* EXP_80 */
89 { 5, GF_POIS, }, /* DISEASE */
90 { 5, GF_TIME, }, /* TIME */
91 { 5, GF_MISSILE, }, /* EXP_VAMP */
92 { 5, GF_MANA, }, /* DR_MANA */
93 { 60, GF_MISSILE, }, /* SUPERHURT */
97 * @brief 幻覚時の打撃記述テーブル / Weird melee attack types when hallucinating
100 const concptr silly_attacks[MAX_SILLY_ATTACK] =
103 "があなたの回りを3回回ってワンと言った。",
111 "に「神の国」発言の撤回を求められた。",
122 "はあなたの100の秘密について熱く語った。",
134 "に二週間以内でビデオを人に見せないと死ぬ呪いをかけられた。",
136 "はスーパーウルトラギャラクティカマグナムを放った。",
138 "にジェットストリームアタックをかけられた。",
139 "はあなたに卍固めをかけて「1、2、3、ダーッ!」と叫んだ。",
140 "は「いくじなし!ばかばかばか!」といって駆け出した。",
141 "が「ごらん、ルーベンスの絵だよ」と言って静かに目を閉じた。",
142 "は言った。「変愚蛮怒、絶賛公開中!」",
146 * @brief 幻覚時の打撃記述テーブル(フォーマットつき) / Weird melee attack types when hallucinating (%s for strfmt())
148 const concptr silly_attacks2[MAX_SILLY_ATTACK] =
151 "%sの回りを3回回ってワンと言った。",
159 "%sに「神の国」発言の撤回を求めた。",
170 "%sの100の秘密について熱く語った。",
182 "%sに二週間以内でビデオを人に見せないと死ぬ呪いをかけた。",
184 "%sにスーパーウルトラギャラクティカマグナムを放った。",
186 "%sにジェットストリームアタックをかけた。",
187 "%sに卍固めをかけて「1、2、3、ダーッ!」と叫んだ。",
188 "「いくじなし!ばかばかばか!」といって駆け出した。",
189 "「ごらん、ルーベンスの絵だよ」と言って静かに目を閉じた。",
193 const concptr silly_attacks[MAX_SILLY_ATTACK] =
204 "makes obscene gestures at",
234 * @brief マーシャルアーツ打撃テーブル
236 const martial_arts ma_blows[MAX_MA] =
239 { "%sを殴った。", 1, 0, 1, 5, 0 },
240 { "%sを蹴った。", 2, 0, 1, 7, 0 },
241 { "%sに正拳突きをくらわした。", 3, 0, 1, 9, 0 },
242 { "%sに膝蹴りをくらわした。", 5, 5, 2, 4, MA_KNEE },
243 { "%sに肘打ちをくらわした。", 7, 5, 1, 12, 0 },
244 { "%sに体当りした。", 9, 10, 2, 6, 0 },
245 { "%sを蹴った。", 11, 10, 3, 6, MA_SLOW },
246 { "%sにアッパーをくらわした。", 13, 12, 5, 5, 6 },
247 { "%sに二段蹴りをくらわした。", 16, 15, 5, 6, 8 },
248 { "%sに猫爪撃をくらわした。", 20, 20, 5, 8, 0 },
249 { "%sに跳空脚をくらわした。", 24, 25, 6, 8, 10 },
250 { "%sに鷲爪襲をくらわした。", 28, 25, 7, 9, 0 },
251 { "%sに回し蹴りをくらわした。", 32, 30, 8, 10, 10 },
252 { "%sに鉄拳撃をくらわした。", 35, 35, 8, 11, 10 },
253 { "%sに飛空脚をくらわした。", 39, 35, 8, 12, 12 },
254 { "%sに昇龍拳をくらわした。", 43, 35, 9, 12, 16 },
255 { "%sに石破天驚拳をくらわした。", 48, 40, 10, 13, 18 },
257 { "You punch %s.", 1, 0, 1, 4, 0 },
258 { "You kick %s.", 2, 0, 1, 6, 0 },
259 { "You strike %s.", 3, 0, 1, 7, 0 },
260 { "You hit %s with your knee.", 5, 5, 2, 3, MA_KNEE },
261 { "You hit %s with your elbow.", 7, 5, 1, 8, 0 },
262 { "You butt %s.", 9, 10, 2, 5, 0 },
263 { "You kick %s.", 11, 10, 3, 4, MA_SLOW },
264 { "You uppercut %s.", 13, 12, 4, 4, 6 },
265 { "You double-kick %s.", 16, 15, 5, 4, 8 },
266 { "You hit %s with a Cat's Claw.", 20, 20, 5, 5, 0 },
267 { "You hit %s with a jump kick.", 25, 25, 5, 6, 10 },
268 { "You hit %s with an Eagle's Claw.", 29, 25, 6, 6, 0 },
269 { "You hit %s with a circle kick.", 33, 30, 6, 8, 10 },
270 { "You hit %s with an Iron Fist.", 37, 35, 8, 8, 10 },
271 { "You hit %s with a flying kick.", 41, 35, 8, 10, 12 },
272 { "You hit %s with a Dragon Fist.", 45, 35, 10, 10, 16 },
273 { "You hit %s with a Crushing Blow.", 48, 35, 10, 12, 18 },
279 * @brief 修行僧のターンダメージ算出テーブル
281 const int monk_ave_damage[PY_MAX_LEVEL + 1][3] =
338 * Stat Table (STR) -- help index into the "blow" table
340 const byte adj_str_blow[] =
357 20 /* 18/00-18/09 */,
358 30 /* 18/10-18/19 */,
359 40 /* 18/20-18/29 */,
360 50 /* 18/30-18/39 */,
361 60 /* 18/40-18/49 */,
362 70 /* 18/50-18/59 */,
363 80 /* 18/60-18/69 */,
364 90 /* 18/70-18/79 */,
365 100 /* 18/80-18/89 */,
366 110 /* 18/90-18/99 */,
367 120 /* 18/100-18/109 */,
368 130 /* 18/110-18/119 */,
369 140 /* 18/120-18/129 */,
370 150 /* 18/130-18/139 */,
371 160 /* 18/140-18/149 */,
372 170 /* 18/150-18/159 */,
373 180 /* 18/160-18/169 */,
374 190 /* 18/170-18/179 */,
375 200 /* 18/180-18/189 */,
376 210 /* 18/190-18/199 */,
377 220 /* 18/200-18/209 */,
378 230 /* 18/210-18/219 */,
384 * 器用さによる攻撃回数インデックステーブル
385 * Stat Table (DEX) -- index into the "blow" table
387 const byte adj_dex_blow[] =
414 7 /* 18/100-18/109 */,
415 7 /* 18/110-18/119 */,
416 8 /* 18/120-18/129 */,
417 8 /* 18/130-18/139 */,
418 9 /* 18/140-18/149 */,
419 9 /* 18/150-18/159 */,
420 10 /* 18/160-18/169 */,
421 10 /* 18/170-18/179 */,
422 11 /* 18/180-18/189 */,
423 11 /* 18/190-18/199 */,
424 12 /* 18/200-18/209 */,
425 12 /* 18/210-18/219 */,
432 * 腕力、器用さに応じた攻撃回数テーブル /
433 * This table is used to help calculate the number of blows the player can
434 * make in a single round of attacks (one player turn) with a normal weapon.
437 * This number ranges from a single blow/round for weak players to up to six
438 * blows/round for powerful warriors.
440 * Note that certain artifacts and ego-items give "bonus" blows/round.
442 * First, from the player class, we extract some values:
444 * Warrior num = 6; mul = 5; div = MAX(70, weapon_weight);
445 * Berserker num = 6; mul = 7; div = MAX(70, weapon_weight);
446 * Mage num = 3; mul = 2; div = MAX(100, weapon_weight);
447 * Priest num = 5; mul = 3; div = MAX(100, weapon_weight);
448 * Mindcrafter num = 5; mul = 3; div = MAX(100, weapon_weight);
449 * Rogue num = 5; mul = 3; div = MAX(40, weapon_weight);
450 * Ranger num = 5; mul = 4; div = MAX(70, weapon_weight);
451 * Paladin num = 5; mul = 4; div = MAX(70, weapon_weight);
452 * Weaponsmith num = 5; mul = 5; div = MAX(150, weapon_weight);
453 * Warrior-Mage num = 5; mul = 3; div = MAX(70, weapon_weight);
454 * Chaos Warrior num = 5; mul = 4; div = MAX(70, weapon_weight);
455 * Monk num = 5; mul = 3; div = MAX(60, weapon_weight);
456 * Tourist num = 4; mul = 3; div = MAX(100, weapon_weight);
457 * Imitator num = 5; mul = 4; div = MAX(70, weapon_weight);
458 * Beastmaster num = 5; mul = 3; div = MAX(70, weapon_weight);
459 * Cavalry(Ride) num = 5; mul = 4; div = MAX(70, weapon_weight);
460 * Cavalry(Walk) num = 5; mul = 3; div = MAX(100, weapon_weight);
461 * Sorcerer num = 1; mul = 1; div = MAX(1, weapon_weight);
462 * Archer num = 4; mul = 2; div = MAX(70, weapon_weight);
463 * Magic eater num = 4; mul = 2; div = MAX(70, weapon_weight);
464 * ForceTrainer num = 4; mul = 2; div = MAX(60, weapon_weight);
465 * Mirror Master num = 3; mul = 3; div = MAX(100, weapon_weight);
466 * Ninja num = 4; mul = 1; div = MAX(20, weapon_weight);
468 * To get "P", we look up the relevant "adj_str_blow[]" (see above),
469 * multiply it by "mul", and then divide it by "div".
470 * Increase P by 1 if you wield a weapon two-handed.
471 * Decrease P by 1 if you are a Ninja.
473 * To get "D", we look up the relevant "adj_dex_blow[]" (see above),
475 * The player gets "blows_table[P][D]" blows/round, as shown below,
476 * up to a maximum of "num" blows/round, plus any "bonus" blows/round.
479 const byte blows_table[12][12] =
482 /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11+ */
483 /* 3 10 15 /10 /40 /60 /80 /100 /120 /140 /160 /180 */
484 /* 0 */{ 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4 },
485 /* 1 */{ 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4 },
486 /* 2 */{ 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5 },
487 /* 3 */{ 1, 1, 2, 3, 3, 4, 4, 4, 5, 5, 5, 5 },
488 /* 4 */{ 1, 1, 2, 3, 3, 4, 4, 5, 5, 5, 5, 5 },
489 /* 5 */{ 1, 1, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6 },
490 /* 6 */{ 1, 1, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6 },
491 /* 7 */{ 1, 2, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6 },
492 /* 8 */{ 1, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6 },
493 /* 9 */{ 1, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6 },
494 /* 10*/{ 2, 2, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6 },
495 /*11+*/{ 2, 2, 3, 4, 4, 4, 5, 5, 6, 6, 6, 6 },
499 * @brief プレイヤーからモンスターへの打撃命中判定 /
500 * Determine if the player "hits" a monster (normal combat).
501 * @param chance 基本命中値
503 * @param visible 目標を視界に捕らえているならばTRUEを指定
504 * @return 命中と判定された場合TRUEを返す
505 * @note Always miss 5%, always hit 5%, otherwise random.
507 bool test_hit_norm(player_type *attacker_ptr, HIT_RELIABILITY chance, ARMOUR_CLASS ac, bool visible)
509 if (!visible) chance = (chance + 1) / 2;
510 return hit_chance(attacker_ptr, chance, ac) >= randint1(100);
514 * @brief モンスターへの命中率の計算
515 * @param player_ptr プレーヤーへの参照ポインタ
520 PERCENTAGE hit_chance(player_type *attacker_ptr, HIT_RELIABILITY reli, ARMOUR_CLASS ac)
522 PERCENTAGE chance = 5, chance_left = 90;
523 if(reli <= 0) return 5;
524 if(attacker_ptr->pseikaku == SEIKAKU_NAMAKE) chance_left = (chance_left * 19 + 9) / 20;
525 chance += (100 - ((ac * 75) / reli)) * chance_left / 100;
526 if (chance < 5) chance = 5;
532 * @brief プレイヤー攻撃の種族スレイング倍率計算
533 * @param player_ptr プレーヤーへの参照ポインタ
534 * @param mult 算出前の基本倍率(/10倍)
535 * @param flgs スレイフラグ配列
536 * @param m_ptr 目標モンスターの構造体参照ポインタ
537 * @return スレイング加味後の倍率(/10倍)
539 static MULTIPLY mult_slaying(player_type *player_ptr, MULTIPLY mult, const BIT_FLAGS* flgs, monster_type* m_ptr)
541 static const struct slay_table_t {
543 BIT_FLAGS affect_race_flag;
546 size_t r_flag_offset;
548 #define OFFSET(X) offsetof(monster_race, X)
549 {TR_SLAY_ANIMAL, RF3_ANIMAL, 25, OFFSET(flags3), OFFSET(r_flags3)},
550 {TR_KILL_ANIMAL, RF3_ANIMAL, 40, OFFSET(flags3), OFFSET(r_flags3)},
551 {TR_SLAY_EVIL, RF3_EVIL, 20, OFFSET(flags3), OFFSET(r_flags3)},
552 {TR_KILL_EVIL, RF3_EVIL, 35, OFFSET(flags3), OFFSET(r_flags3)},
553 {TR_SLAY_GOOD, RF3_GOOD, 20, OFFSET(flags3), OFFSET(r_flags3)},
554 {TR_KILL_GOOD, RF3_GOOD, 35, OFFSET(flags3), OFFSET(r_flags3)},
555 {TR_SLAY_HUMAN, RF2_HUMAN, 25, OFFSET(flags2), OFFSET(r_flags2)},
556 {TR_KILL_HUMAN, RF2_HUMAN, 40, OFFSET(flags2), OFFSET(r_flags2)},
557 {TR_SLAY_UNDEAD, RF3_UNDEAD, 30, OFFSET(flags3), OFFSET(r_flags3)},
558 {TR_KILL_UNDEAD, RF3_UNDEAD, 50, OFFSET(flags3), OFFSET(r_flags3)},
559 {TR_SLAY_DEMON, RF3_DEMON, 30, OFFSET(flags3), OFFSET(r_flags3)},
560 {TR_KILL_DEMON, RF3_DEMON, 50, OFFSET(flags3), OFFSET(r_flags3)},
561 {TR_SLAY_ORC, RF3_ORC, 30, OFFSET(flags3), OFFSET(r_flags3)},
562 {TR_KILL_ORC, RF3_ORC, 50, OFFSET(flags3), OFFSET(r_flags3)},
563 {TR_SLAY_TROLL, RF3_TROLL, 30, OFFSET(flags3), OFFSET(r_flags3)},
564 {TR_KILL_TROLL, RF3_TROLL, 50, OFFSET(flags3), OFFSET(r_flags3)},
565 {TR_SLAY_GIANT, RF3_GIANT, 30, OFFSET(flags3), OFFSET(r_flags3)},
566 {TR_KILL_GIANT, RF3_GIANT, 50, OFFSET(flags3), OFFSET(r_flags3)},
567 {TR_SLAY_DRAGON, RF3_DRAGON, 30, OFFSET(flags3), OFFSET(r_flags3)},
568 {TR_KILL_DRAGON, RF3_DRAGON, 50, OFFSET(flags3), OFFSET(r_flags3)},
572 monster_race* r_ptr = &r_info[m_ptr->r_idx];
573 for (size_t i = 0; i < sizeof(slay_table) / sizeof(slay_table[0]); ++i)
575 const struct slay_table_t* p = &slay_table[i];
577 if (!have_flag(flgs, p->slay_flag) ||
578 !(atoffset(BIT_FLAGS, r_ptr, p->flag_offset) & p->affect_race_flag))
581 if (is_original_ap_and_seen(player_ptr, m_ptr))
583 atoffset(BIT_FLAGS, r_ptr, p->r_flag_offset) |= p->affect_race_flag;
586 mult = MAX(mult, p->slay_mult);
594 * @brief プレイヤー攻撃の属性スレイング倍率計算
595 * @param player_ptr プレーヤーへの参照ポインタ
596 * @param mult 算出前の基本倍率(/10倍)
597 * @param flgs スレイフラグ配列
598 * @param m_ptr 目標モンスターの構造体参照ポインタ
599 * @return スレイング加味後の倍率(/10倍)
601 static MULTIPLY mult_brand(player_type *player_ptr, MULTIPLY mult, const BIT_FLAGS* flgs, monster_type* m_ptr)
603 static const struct brand_table_t {
605 BIT_FLAGS resist_mask;
608 {TR_BRAND_ACID, RFR_EFF_IM_ACID_MASK, 0U },
609 {TR_BRAND_ELEC, RFR_EFF_IM_ELEC_MASK, 0U },
610 {TR_BRAND_FIRE, RFR_EFF_IM_FIRE_MASK, RF3_HURT_FIRE},
611 {TR_BRAND_COLD, RFR_EFF_IM_COLD_MASK, RF3_HURT_COLD},
612 {TR_BRAND_POIS, RFR_EFF_IM_POIS_MASK, 0U },
615 monster_race* r_ptr = &r_info[m_ptr->r_idx];
616 for (size_t i = 0; i < sizeof(brand_table) / sizeof(brand_table[0]); ++i)
618 const struct brand_table_t* p = &brand_table[i];
620 if (!have_flag(flgs, p->brand_flag)) continue;
622 /* Notice immunity */
623 if (r_ptr->flagsr & p->resist_mask)
625 if (is_original_ap_and_seen(player_ptr, m_ptr))
627 r_ptr->r_flagsr |= (r_ptr->flagsr & p->resist_mask);
633 /* Otherwise, take the damage */
634 if (r_ptr->flags3 & p->hurt_flag)
636 if (is_original_ap_and_seen(player_ptr, m_ptr))
638 r_ptr->r_flags3 |= p->hurt_flag;
641 mult = MAX(mult, 50);
645 mult = MAX(mult, 25);
653 * @brief 剣術のスレイ倍率計算を行う /
654 * Calcurate magnification of hissatsu technics
655 * @param mult 剣術のスレイ効果以前に算出している多要素の倍率(/10倍)
656 * @param flgs 剣術に使用する武器のスレイフラグ配列
657 * @param m_ptr 目標となるモンスターの構造体参照ポインタ
658 * @param mode 剣術のスレイ型ID
659 * @return スレイの倍率(/10倍)
661 static MULTIPLY mult_hissatsu(player_type *attacker_ptr, MULTIPLY mult, BIT_FLAGS *flgs, monster_type *m_ptr, BIT_FLAGS mode)
663 monster_race *r_ptr = &r_info[m_ptr->r_idx];
665 /* Burning Strike (Fire) */
666 if (mode == HISSATSU_FIRE)
668 /* Notice immunity */
669 if (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK)
671 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
673 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
677 /* Otherwise, take the damage */
678 else if (have_flag(flgs, TR_BRAND_FIRE))
680 if (r_ptr->flags3 & RF3_HURT_FIRE)
682 if (mult < 70) mult = 70;
683 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
685 r_ptr->r_flags3 |= RF3_HURT_FIRE;
688 else if (mult < 35) mult = 35;
692 if (r_ptr->flags3 & RF3_HURT_FIRE)
694 if (mult < 50) mult = 50;
695 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
697 r_ptr->r_flags3 |= RF3_HURT_FIRE;
700 else if (mult < 25) mult = 25;
704 /* Serpent's Tongue (Poison) */
705 if (mode == HISSATSU_POISON)
707 /* Notice immunity */
708 if (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK)
710 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
712 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK);
716 /* Otherwise, take the damage */
717 else if (have_flag(flgs, TR_BRAND_POIS))
719 if (mult < 35) mult = 35;
723 if (mult < 25) mult = 25;
727 /* Zammaken (Nonliving Evil) */
728 if (mode == HISSATSU_ZANMA)
730 if (!monster_living(m_ptr->r_idx) && (r_ptr->flags3 & RF3_EVIL))
732 if (mult < 15) mult = 25;
733 else if (mult < 50) mult = MIN(50, mult + 20);
737 /* Rock Smash (Hurt Rock) */
738 if (mode == HISSATSU_HAGAN)
740 if (r_ptr->flags3 & RF3_HURT_ROCK)
742 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
744 r_ptr->r_flags3 |= RF3_HURT_ROCK;
746 if (mult == 10) mult = 40;
747 else if (mult < 60) mult = 60;
751 /* Midare-Setsugekka (Cold) */
752 if (mode == HISSATSU_COLD)
754 /* Notice immunity */
755 if (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK)
757 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
759 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
762 /* Otherwise, take the damage */
763 else if (have_flag(flgs, TR_BRAND_COLD))
765 if (r_ptr->flags3 & RF3_HURT_COLD)
767 if (mult < 70) mult = 70;
768 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
770 r_ptr->r_flags3 |= RF3_HURT_COLD;
773 else if (mult < 35) mult = 35;
777 if (r_ptr->flags3 & RF3_HURT_COLD)
779 if (mult < 50) mult = 50;
780 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
782 r_ptr->r_flags3 |= RF3_HURT_COLD;
785 else if (mult < 25) mult = 25;
789 /* Lightning Eagle (Elec) */
790 if (mode == HISSATSU_ELEC)
792 /* Notice immunity */
793 if (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK)
795 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
797 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
801 /* Otherwise, take the damage */
802 else if (have_flag(flgs, TR_BRAND_ELEC))
804 if (mult < 70) mult = 70;
808 if (mult < 50) mult = 50;
812 /* Bloody Maelstrom */
813 if ((mode == HISSATSU_SEKIRYUKA) && attacker_ptr->cut && monster_living(m_ptr->r_idx))
815 MULTIPLY tmp = MIN(100, MAX(10, attacker_ptr->cut / 10));
816 if (mult < tmp) mult = tmp;
820 if (mode == HISSATSU_UNDEAD)
822 if (r_ptr->flags3 & RF3_UNDEAD)
824 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
826 r_ptr->r_flags3 |= RF3_UNDEAD;
828 if (mult == 10) mult = 70;
829 else if (mult < 140) mult = MIN(140, mult + 60);
831 if (mult == 10) mult = 40;
832 else if (mult < 60) mult = MIN(60, mult + 30);
835 if (mult > 150) mult = 150;
841 * @brief ダメージにスレイ要素を加える総合処理ルーチン /
842 * Extract the "total damage" from a given object hitting a given monster.
843 * @param o_ptr 使用武器オブジェクトの構造体参照ポインタ
844 * @param tdam 現在算出途中のダメージ値
845 * @param m_ptr 目標モンスターの構造体参照ポインタ
847 * @param thrown 投擲処理ならばTRUEを指定する
848 * @return 総合的なスレイを加味したダメージ値
850 * Note that "flasks of oil" do NOT do fire damage, although they\n
851 * certainly could be made to do so. XXX XXX\n
853 * Note that most brands and slays are x3, except Slay Animal (x2),\n
854 * Slay Evil (x2), and Kill dragon (x5).\n
856 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)
858 BIT_FLAGS flgs[TR_FLAG_SIZE];
859 object_flags(o_ptr, flgs);
860 torch_flags(o_ptr, flgs); /* torches has secret flags */
864 if (attacker_ptr->special_attack & (ATTACK_ACID)) add_flag(flgs, TR_BRAND_ACID);
865 if (attacker_ptr->special_attack & (ATTACK_COLD)) add_flag(flgs, TR_BRAND_COLD);
866 if (attacker_ptr->special_attack & (ATTACK_ELEC)) add_flag(flgs, TR_BRAND_ELEC);
867 if (attacker_ptr->special_attack & (ATTACK_FIRE)) add_flag(flgs, TR_BRAND_FIRE);
868 if (attacker_ptr->special_attack & (ATTACK_POIS)) add_flag(flgs, TR_BRAND_POIS);
871 if (hex_spelling(attacker_ptr, HEX_RUNESWORD)) add_flag(flgs, TR_SLAY_GOOD);
885 mult = mult_slaying(attacker_ptr, mult, flgs, m_ptr);
887 mult = mult_brand(attacker_ptr, mult, flgs, m_ptr);
889 if (attacker_ptr->pclass == CLASS_SAMURAI)
891 mult = mult_hissatsu(attacker_ptr, mult, flgs, m_ptr, mode);
894 if ((attacker_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs, TR_FORCE_WEAPON)) && (attacker_ptr->csp > (o_ptr->dd * o_ptr->ds / 5)))
896 attacker_ptr->csp -= (1 + (o_ptr->dd * o_ptr->ds / 5));
897 attacker_ptr->redraw |= (PR_MANA);
898 mult = mult * 3 / 2 + 20;
901 if ((o_ptr->name1 == ART_NOTHUNG) && (m_ptr->r_idx == MON_FAFNER))
907 if (mult > 150) mult = 150;
908 return (tdam * mult / 10);
912 * @brief プレイヤーからモンスターへの打撃クリティカル判定 /
913 * Critical hits (by player) Factor in weapon weight, total plusses, player melee bonus
914 * @param weight 矢弾の重量
915 * @param plus 武器の命中修正
916 * @param dam 現在算出中のダメージ値
917 * @param meichuu 打撃の基本命中力
918 * @param mode オプションフラグ
919 * @return クリティカル修正が入ったダメージ値
921 HIT_POINT critical_norm(player_type *attacker_ptr, WEIGHT weight, int plus, HIT_POINT dam, s16b meichuu, BIT_FLAGS mode)
923 /* Extract "blow" power */
924 int i = (weight + (meichuu * 3 + plus * 5) + attacker_ptr->skill_thn);
927 bool is_special_option = randint1((attacker_ptr->pclass == CLASS_NINJA) ? 4444 : 5000) <= i;
928 is_special_option |= mode == HISSATSU_MAJIN;
929 is_special_option |= mode == HISSATSU_3DAN;
930 if (!is_special_option) return dam;
932 int k = weight + randint1(650);
933 if ((mode == HISSATSU_MAJIN) || (mode == HISSATSU_3DAN)) k += randint1(650);
937 msg_print(_("手ごたえがあった!", "It was a good hit!"));
945 msg_print(_("かなりの手ごたえがあった!", "It was a great hit!"));
952 msg_print(_("会心の一撃だ!", "It was a superb hit!"));
959 msg_print(_("最高の会心の一撃だ!", "It was a *GREAT* hit!"));
964 msg_print(_("比類なき最高の会心の一撃だ!", "It was a *SUPERB* hit!"));
965 dam = ((7 * dam) / 2) + 25;
970 * @brief モンスター打撃のクリティカルランクを返す /
971 * Critical blow. All hits that do 95% of total possible damage,
972 * @param dice モンスター打撃のダイス数
973 * @param sides モンスター打撃の最大ダイス目
974 * @param dam プレイヤーに与えたダメージ
976 * and which also do at least 20 damage, or, sometimes, N damage.
977 * This is used only to determine "cuts" and "stuns".
979 static int monster_critical(DICE_NUMBER dice, DICE_SID sides, HIT_POINT dam)
981 /* Must do at least 95% of perfect */
982 int total = dice * sides;
983 if (dam < total * 19 / 20) return 0;
985 /* Weak blows rarely work */
986 if ((dam < 20) && (randint0(100) >= dam)) return 0;
990 if ((dam >= total) && (dam >= 40)) max++;
995 while (randint0(100) < 2) max++;
998 /* Critical damage */
999 if (dam > 45) return (6 + max);
1000 if (dam > 33) return (5 + max);
1001 if (dam > 25) return (4 + max);
1002 if (dam > 18) return (3 + max);
1003 if (dam > 11) return (2 + max);
1009 * @brief モンスター打撃の命中を判定する /
1010 * Determine if a monster attack against the player succeeds.
1011 * @param power 打撃属性毎の基本命中値
1012 * @param level モンスターのレベル
1013 * @param stun モンスターの朦朧値
1014 * @return TRUEならば命中判定
1016 * Always miss 5% of the time, Always hit 5% of the time.
1017 * Otherwise, match monster power against player armor.
1019 static int check_hit(player_type *target_ptr, int power, DEPTH level, int stun)
1021 int k = randint0(100);
1022 if (stun && one_in_(2)) return FALSE;
1023 if (k < 10) return (k < 5);
1024 int i = (power + (level * 3));
1026 int ac = target_ptr->ac + target_ptr->to_a;
1027 if (target_ptr->special_attack & ATTACK_SUIKEN) ac += (target_ptr->lev * 2);
1029 if ((i > 0) && (randint1(i) > ((ac * 3) / 4))) return TRUE;
1034 * @brief モンスターから敵モンスターへの命中判定
1035 * @param power 打撃属性による基本命中値
1036 * @param level 攻撃側モンスターのレベル
1037 * @param ac 目標モンスターのAC
1038 * @param stun 攻撃側モンスターが朦朧状態ならTRUEを返す
1039 * @return 命中ならばTRUEを返す
1041 static int check_hit2(int power, DEPTH level, ARMOUR_CLASS ac, int stun)
1043 int k = randint0(100);
1044 if (stun && one_in_(2)) return FALSE;
1045 if (k < 10) return (k < 5);
1046 int i = (power + (level * 3));
1048 if ((i > 0) && (randint1(i) > ((ac * 3) / 4))) return TRUE;
1052 /*! モンスターの侮辱行為メッセージテーブル / Hack -- possible "insult" messages */
1053 static concptr desc_insult[] =
1064 "があなたをパラサイト呼ばわりした!",
1068 "insults your mother!",
1069 "gives you the finger!",
1072 "dances around you!",
1073 "makes obscene gestures!",
1075 "calls you a parasite!",
1076 "calls you a cyborg!"
1081 /*! マゴットのぼやきメッセージテーブル / Hack -- possible "insult" messages */
1082 static concptr desc_moan[] =
1086 "が彼の飼い犬を見なかったかと尋ねている。",
1087 "が縄張りから出て行けと言っている。",
1090 "seems sad about something.",
1091 "asks if you have seen his dogs.",
1092 "tells you to get off his land.",
1093 "mumbles something about mushrooms."
1100 * @brief 敵オーラによるプレイヤーのダメージ処理(補助)
1101 * @param m_ptr オーラを持つモンスターの構造体参照ポインタ
1102 * @param immune ダメージを回避できる免疫フラグ
1103 * @param flags_offset オーラフラグ配列の参照オフセット
1104 * @param r_flags_offset モンスターの耐性配列の参照オフセット
1105 * @param aura_flag オーラフラグ配列
1106 * @param dam_func ダメージ処理を行う関数の参照ポインタ
1107 * @param message オーラダメージを受けた際のメッセージ
1110 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,
1111 HIT_POINT(*dam_func)(player_type *creature_type, HIT_POINT dam, concptr kb_str, int monspell, bool aura), concptr message)
1113 monster_race *r_ptr = &r_info[m_ptr->r_idx];
1114 if (!(atoffset(BIT_FLAGS, r_ptr, flags_offset) & aura_flag) || immune) return;
1116 GAME_TEXT mon_name[MAX_NLEN];
1117 int aura_damage = damroll(1 + (r_ptr->level / 26), 1 + (r_ptr->level / 17));
1119 monster_desc(touched_ptr, mon_name, m_ptr, MD_WRONGDOER_NAME);
1121 dam_func(touched_ptr, aura_damage, mon_name, -1, TRUE);
1123 if (is_original_ap_and_seen(touched_ptr, m_ptr))
1125 atoffset(BIT_FLAGS, r_ptr, r_flags_offset) |= aura_flag;
1128 handle_stuff(touched_ptr);
1133 * @brief 敵オーラによるプレイヤーのダメージ処理(メイン)
1134 * @param m_ptr オーラを持つモンスターの構造体参照ポインタ
1135 * @param touched_ptr オーラを持つ相手に振れたクリーチャーの参照ポインタ
1138 static void touch_zap_player(monster_type *m_ptr, player_type *touched_ptr)
1140 touch_zap_player_aux(m_ptr, touched_ptr, touched_ptr->immune_fire, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_FIRE,
1141 fire_dam, _("突然とても熱くなった!", "You are suddenly very hot!"));
1142 touch_zap_player_aux(m_ptr, touched_ptr, touched_ptr->immune_cold, offsetof(monster_race, flags3), offsetof(monster_race, r_flags3), RF3_AURA_COLD,
1143 cold_dam, _("突然とても寒くなった!", "You are suddenly very cold!"));
1144 touch_zap_player_aux(m_ptr, touched_ptr, touched_ptr->immune_elec, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_ELEC,
1145 elec_dam, _("電撃をくらった!", "You get zapped!"));
1150 * @brief プレイヤーの変異要素による打撃処理
1151 * @param attacker_ptr プレーヤーへの参照ポインタ
1152 * @param m_idx 攻撃目標となったモンスターの参照ID
1153 * @param attack 変異要素による攻撃要素の種類
1154 * @param fear 攻撃を受けたモンスターが恐慌状態に陥ったかを返す参照ポインタ
1155 * @param mdeath 攻撃を受けたモンスターが死亡したかを返す参照ポインタ
1158 static void natural_attack(player_type *attacker_ptr, MONSTER_IDX m_idx, int attack, bool *fear, bool *mdeath)
1160 WEIGHT n_weight = 0;
1161 monster_type *m_ptr = &attacker_ptr->current_floor_ptr->m_list[m_idx];
1162 monster_race *r_ptr = &r_info[m_ptr->r_idx];
1164 int dice_num, dice_side;
1168 case MUT2_SCOR_TAIL:
1172 atk_desc = _("尻尾", "tail");
1179 atk_desc = _("角", "horns");
1186 atk_desc = _("クチバシ", "beak");
1193 atk_desc = _("象の鼻", "trunk");
1196 case MUT2_TENTACLES:
1200 atk_desc = _("触手", "tentacles");
1204 dice_num = dice_side = n_weight = 1;
1205 atk_desc = _("未定義の部位", "undefined body part");
1209 GAME_TEXT m_name[MAX_NLEN];
1210 monster_desc(attacker_ptr, m_name, m_ptr, 0);
1212 /* Calculate the "attack quality" */
1213 int bonus = attacker_ptr->to_h_m + (attacker_ptr->lev * 6 / 5);
1214 int chance = (attacker_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
1216 bool is_hit = ((r_ptr->flags2 & RF2_QUANTUM) == 0) || !randint0(2);
1217 is_hit &= test_hit_norm(attacker_ptr, chance, r_ptr->ac, m_ptr->ml);
1221 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
1226 msg_format(_("%sを%sで攻撃した。", "You hit %s with your %s."), m_name, atk_desc);
1228 HIT_POINT k = damroll(dice_num, dice_side);
1229 k = critical_norm(attacker_ptr, n_weight, bonus, k, (s16b)bonus, 0);
1231 /* Apply the player damage bonuses */
1232 k += attacker_ptr->to_d_m;
1234 /* No negative damage */
1237 /* Modify the damage */
1238 k = mon_damage_mod(attacker_ptr, m_ptr, k, FALSE);
1240 /* Complex message */
1241 msg_format_wizard(CHEAT_MONSTER,
1242 _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"),
1243 k, m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
1245 /* Anger the monster */
1246 if (k > 0) anger_monster(attacker_ptr, m_ptr);
1248 /* Damage, check for fear and mdeath */
1251 case MUT2_SCOR_TAIL:
1252 project(attacker_ptr, 0, 0, m_ptr->fy, m_ptr->fx, k, GF_POIS, PROJECT_KILL, -1);
1253 *mdeath = (m_ptr->r_idx == 0);
1256 *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
1259 *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
1262 *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
1264 case MUT2_TENTACLES:
1265 *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
1268 *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
1271 touch_zap_player(m_ptr, attacker_ptr);
1275 * @brief プレイヤーの打撃処理サブルーチン /
1276 * Player attacks a (poor, defenseless) creature -RAK-
1279 * @param fear 攻撃を受けたモンスターが恐慌状態に陥ったかを返す参照ポインタ
1280 * @param mdeath 攻撃を受けたモンスターが死亡したかを返す参照ポインタ
1281 * @param hand 攻撃を行うための武器を持つ手
1282 * @param mode 発動中の剣術ID
1285 * If no "weapon" is available, then "punch" the monster one time.
1287 static void py_attack_aux(player_type *attacker_ptr, POSITION y, POSITION x, bool *fear, bool *mdeath, s16b hand, COMBAT_OPTION_IDX mode)
1289 int num = 0, bonus, chance, vir;
1292 floor_type *floor_ptr = attacker_ptr->current_floor_ptr;
1293 grid_type *g_ptr = &floor_ptr->grid_array[y][x];
1295 monster_type *m_ptr = &floor_ptr->m_list[g_ptr->m_idx];
1296 monster_race *r_ptr = &r_info[m_ptr->r_idx];
1298 /* Access the weapon */
1299 object_type *o_ptr = &attacker_ptr->inventory_list[INVEN_RARM + hand];
1301 GAME_TEXT m_name[MAX_NLEN];
1303 bool success_hit = FALSE;
1304 bool backstab = FALSE;
1305 bool vorpal_cut = FALSE;
1306 int chaos_effect = 0;
1307 bool stab_fleeing = FALSE;
1308 bool fuiuchi = FALSE;
1309 bool monk_attack = FALSE;
1310 bool do_quake = FALSE;
1312 bool drain_msg = TRUE;
1313 int drain_result = 0, drain_heal = 0;
1314 bool can_drain = FALSE;
1316 int drain_left = MAX_VAMPIRIC_DRAIN;
1317 BIT_FLAGS flgs[TR_FLAG_SIZE]; /* A massive hack -- life-draining weapons */
1318 bool is_human = (r_ptr->d_char == 'p');
1319 bool is_lowlevel = (r_ptr->level < (attacker_ptr->lev - 15));
1320 bool zantetsu_mukou, e_j_mukou;
1322 switch (attacker_ptr->pclass)
1326 if (has_melee_weapon(attacker_ptr, INVEN_RARM + hand) && !attacker_ptr->icky_wield[hand])
1328 int tmp = attacker_ptr->lev * 6 + (attacker_ptr->skill_stl + 10) * 4;
1329 if (attacker_ptr->monlite && (mode != HISSATSU_NYUSIN)) tmp /= 3;
1330 if (attacker_ptr->cursed & TRC_AGGRAVATE) tmp /= 2;
1331 if (r_ptr->level > (attacker_ptr->lev * attacker_ptr->lev / 20 + 10)) tmp /= 3;
1332 if (MON_CSLEEP(m_ptr) && m_ptr->ml)
1334 /* Can't backstab creatures that we can't see, right? */
1337 else if ((attacker_ptr->special_defense & NINJA_S_STEALTH) && (randint0(tmp) > (r_ptr->level + 20)) && m_ptr->ml && !(r_ptr->flagsr & RFR_RES_ALL))
1341 else if (MON_MONFEAR(m_ptr) && m_ptr->ml)
1343 stab_fleeing = TRUE;
1350 case CLASS_FORCETRAINER:
1351 case CLASS_BERSERKER:
1352 if ((empty_hands(attacker_ptr, TRUE) & EMPTY_HAND_RARM) && !attacker_ptr->riding) monk_attack = TRUE;
1356 if (!o_ptr->k_idx) /* Empty hand */
1358 if ((r_ptr->level + 10) > attacker_ptr->lev)
1360 if (attacker_ptr->skill_exp[GINOU_SUDE] < s_info[attacker_ptr->pclass].s_max[GINOU_SUDE])
1362 if (attacker_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_BEGINNER)
1363 attacker_ptr->skill_exp[GINOU_SUDE] += 40;
1364 else if ((attacker_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_SKILLED))
1365 attacker_ptr->skill_exp[GINOU_SUDE] += 5;
1366 else if ((attacker_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_EXPERT) && (attacker_ptr->lev > 19))
1367 attacker_ptr->skill_exp[GINOU_SUDE] += 1;
1368 else if ((attacker_ptr->lev > 34))
1369 if (one_in_(3)) attacker_ptr->skill_exp[GINOU_SUDE] += 1;
1370 attacker_ptr->update |= (PU_BONUS);
1374 else if (object_is_melee_weapon(o_ptr))
1376 if ((r_ptr->level + 10) > attacker_ptr->lev)
1378 OBJECT_TYPE_VALUE tval = attacker_ptr->inventory_list[INVEN_RARM + hand].tval - TV_WEAPON_BEGIN;
1379 OBJECT_SUBTYPE_VALUE sval = attacker_ptr->inventory_list[INVEN_RARM + hand].sval;
1380 int now_exp = attacker_ptr->weapon_exp[tval][sval];
1381 if (now_exp < s_info[attacker_ptr->pclass].w_max[tval][sval])
1384 if (now_exp < WEAPON_EXP_BEGINNER) amount = 80;
1385 else if (now_exp < WEAPON_EXP_SKILLED) amount = 10;
1386 else if ((now_exp < WEAPON_EXP_EXPERT) && (attacker_ptr->lev > 19)) amount = 1;
1387 else if ((attacker_ptr->lev > 34) && one_in_(2)) amount = 1;
1388 attacker_ptr->weapon_exp[tval][sval] += amount;
1389 attacker_ptr->update |= (PU_BONUS);
1394 /* Disturb the monster */
1395 (void)set_monster_csleep(attacker_ptr, g_ptr->m_idx, 0);
1397 monster_desc(attacker_ptr, m_name, m_ptr, 0);
1399 /* Calculate the "attack quality" */
1400 bonus = attacker_ptr->to_h[hand] + o_ptr->to_h;
1401 chance = (attacker_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
1402 if (mode == HISSATSU_IAI) chance += 60;
1403 if (attacker_ptr->special_defense & KATA_KOUKIJIN) chance += 150;
1404 if (attacker_ptr->sutemi) chance = MAX(chance * 3 / 2, chance + 60);
1406 vir = virtue_number(attacker_ptr, V_VALOUR);
1409 chance += (attacker_ptr->virtues[vir - 1] / 10);
1412 zantetsu_mukou = ((o_ptr->name1 == ART_ZANTETSU) && (r_ptr->d_char == 'j'));
1413 e_j_mukou = ((o_ptr->name1 == ART_EXCALIBUR_J) && (r_ptr->d_char == 'S'));
1415 if ((mode == HISSATSU_KYUSHO) || (mode == HISSATSU_MINEUCHI) || (mode == HISSATSU_3DAN) || (mode == HISSATSU_IAI)) num_blow = 1;
1416 else if (mode == HISSATSU_COLD) num_blow = attacker_ptr->num_blow[hand] + 2;
1417 else num_blow = attacker_ptr->num_blow[hand];
1419 /* Hack -- DOKUBARI always hit once */
1420 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) num_blow = 1;
1422 /* Attack once for each legal blow */
1423 while ((num++ < num_blow) && !attacker_ptr->is_dead)
1425 if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) || (mode == HISSATSU_KYUSHO))
1429 if (attacker_ptr->migite && attacker_ptr->hidarite)
1433 if (mode == HISSATSU_3DAN)
1438 success_hit = one_in_(n);
1440 else if ((attacker_ptr->pclass == CLASS_NINJA) && ((backstab || fuiuchi) && !(r_ptr->flagsr & RFR_RES_ALL))) success_hit = TRUE;
1441 else success_hit = test_hit_norm(attacker_ptr, chance, r_ptr->ac, m_ptr->ml);
1443 if (mode == HISSATSU_MAJIN)
1446 success_hit = FALSE;
1451 backstab = FALSE; /* Clumsy! */
1452 fuiuchi = FALSE; /* Clumsy! */
1454 if ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE) && one_in_(3))
1456 BIT_FLAGS flgs_aux[TR_FLAG_SIZE];
1460 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
1461 msg_print(_("振り回した大鎌が自分自身に返ってきた!", "Your scythe returns to you!"));
1462 object_flags(o_ptr, flgs_aux);
1464 k = damroll(o_ptr->dd + attacker_ptr->to_dd[hand], o_ptr->ds + attacker_ptr->to_ds[hand]);
1467 switch (attacker_ptr->mimic_form)
1470 switch (attacker_ptr->prace)
1477 case RACE_BARBARIAN:
1481 case RACE_HALF_TROLL:
1482 case RACE_HALF_OGRE:
1483 case RACE_HALF_GIANT:
1484 case RACE_HALF_TITAN:
1492 case RACE_DRACONIAN:
1499 case MIMIC_DEMON_LORD:
1506 if (attacker_ptr->align < 0 && mult < 20)
1508 if (!(attacker_ptr->resist_acid || is_oppose_acid(attacker_ptr) || attacker_ptr->immune_acid) && (mult < 25))
1510 if (!(attacker_ptr->resist_elec || is_oppose_elec(attacker_ptr) || attacker_ptr->immune_elec) && (mult < 25))
1512 if (!(attacker_ptr->resist_fire || is_oppose_fire(attacker_ptr) || attacker_ptr->immune_fire) && (mult < 25))
1514 if (!(attacker_ptr->resist_cold || is_oppose_cold(attacker_ptr) || attacker_ptr->immune_cold) && (mult < 25))
1516 if (!(attacker_ptr->resist_pois || is_oppose_pois(attacker_ptr)) && (mult < 25))
1519 if ((attacker_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs_aux, TR_FORCE_WEAPON)) && (attacker_ptr->csp > (attacker_ptr->msp / 30)))
1521 attacker_ptr->csp -= (1 + (attacker_ptr->msp / 30));
1522 attacker_ptr->redraw |= (PR_MANA);
1523 mult = mult * 3 / 2 + 20;
1525 k *= (HIT_POINT)mult;
1529 k = critical_norm(attacker_ptr, o_ptr->weight, o_ptr->to_h, k, attacker_ptr->to_h[hand], mode);
1533 msg_format(_("グッサリ切り裂かれた!", "Your weapon cuts deep into yourself!"));
1534 /* Try to increase the damage */
1540 k *= (HIT_POINT)mult;
1542 k += (attacker_ptr->to_d[hand] + o_ptr->to_d);
1545 take_hit(attacker_ptr, DAMAGE_FORCE, k, _("死の大鎌", "Death scythe"), -1);
1546 handle_stuff(attacker_ptr);
1551 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
1557 int vorpal_chance = ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD)) ? 2 : 4;
1561 if (backstab) msg_format(_("あなたは冷酷にも眠っている無力な%sを突き刺した!", "You cruelly stab the helpless, sleeping %s!"), m_name);
1562 else if (fuiuchi) msg_format(_("不意を突いて%sに強烈な一撃を喰らわせた!", "You make surprise attack, and hit %s with a powerful blow!"), m_name);
1563 else if (stab_fleeing) msg_format(_("逃げる%sを背中から突き刺した!", "You backstab the fleeing %s!"), m_name);
1564 else if (!monk_attack) msg_format(_("%sを攻撃した。", "You hit %s."), m_name);
1566 /* Hack -- bare hands do one damage */
1569 object_flags(o_ptr, flgs);
1571 /* Select a chaotic effect (50% chance) */
1572 if ((have_flag(flgs, TR_CHAOTIC)) && one_in_(2))
1575 chg_virtue(attacker_ptr, V_CHANCE, 1);
1577 if (randint1(5) < 3)
1579 /* Vampiric (20%) */
1582 else if (one_in_(250))
1587 else if (!one_in_(10))
1589 /* Confusion (26.892%) */
1592 else if (one_in_(2))
1594 /* Teleport away (1.494%) */
1599 /* Polymorph (1.494%) */
1604 /* Vampiric drain */
1605 if ((have_flag(flgs, TR_VAMPIRIC)) || (chaos_effect == 1) || (mode == HISSATSU_DRAIN) || hex_spelling(attacker_ptr, HEX_VAMP_BLADE))
1607 /* Only drain "living" monsters */
1608 if (monster_living(m_ptr->r_idx))
1614 if ((have_flag(flgs, TR_VORPAL) || hex_spelling(attacker_ptr, HEX_RUNESWORD)) && (randint1(vorpal_chance * 3 / 2) == 1) && !zantetsu_mukou)
1616 else vorpal_cut = FALSE;
1620 int special_effect = 0, stun_effect = 0, times = 0, max_times;
1622 const martial_arts *ma_ptr = &ma_blows[0], *old_ptr = &ma_blows[0];
1623 int resist_stun = 0;
1626 if (r_ptr->flags1 & RF1_UNIQUE) resist_stun += 88;
1627 if (r_ptr->flags3 & RF3_NO_STUN) resist_stun += 66;
1628 if (r_ptr->flags3 & RF3_NO_CONF) resist_stun += 33;
1629 if (r_ptr->flags3 & RF3_NO_SLEEP) resist_stun += 33;
1630 if ((r_ptr->flags3 & RF3_UNDEAD) || (r_ptr->flags3 & RF3_NONLIVING))
1633 if (attacker_ptr->special_defense & KAMAE_BYAKKO)
1634 max_times = (attacker_ptr->lev < 3 ? 1 : attacker_ptr->lev / 3);
1635 else if (attacker_ptr->special_defense & KAMAE_SUZAKU)
1637 else if (attacker_ptr->special_defense & KAMAE_GENBU)
1640 max_times = (attacker_ptr->lev < 7 ? 1 : attacker_ptr->lev / 7);
1641 /* Attempt 'times' */
1642 for (times = 0; times < max_times; times++)
1646 ma_ptr = &ma_blows[randint0(MAX_MA)];
1647 if ((attacker_ptr->pclass == CLASS_FORCETRAINER) && (ma_ptr->min_level > 1)) min_level = ma_ptr->min_level + 3;
1648 else min_level = ma_ptr->min_level;
1649 } while ((min_level > attacker_ptr->lev) ||
1650 (randint1(attacker_ptr->lev) < ma_ptr->chance));
1652 /* keep the highest level attack available we found */
1653 if ((ma_ptr->min_level > old_ptr->min_level) &&
1654 !attacker_ptr->stun && !attacker_ptr->confused)
1658 if (current_world_ptr->wizard && cheat_xtra)
1660 msg_print(_("攻撃を再選択しました。", "Attack re-selected."));
1669 if (attacker_ptr->pclass == CLASS_FORCETRAINER) min_level = MAX(1, ma_ptr->min_level - 3);
1670 else min_level = ma_ptr->min_level;
1671 k = damroll(ma_ptr->dd + attacker_ptr->to_dd[hand], ma_ptr->ds + attacker_ptr->to_ds[hand]);
1672 if (attacker_ptr->special_attack & ATTACK_SUIKEN) k *= 2;
1674 if (ma_ptr->effect == MA_KNEE)
1676 if (r_ptr->flags1 & RF1_MALE)
1678 msg_format(_("%sに金的膝蹴りをくらわした!", "You hit %s in the groin with your knee!"), m_name);
1680 special_effect = MA_KNEE;
1683 msg_format(ma_ptr->desc, m_name);
1686 else if (ma_ptr->effect == MA_SLOW)
1688 if (!((r_ptr->flags1 & RF1_NEVER_MOVE) ||
1689 my_strchr("~#{}.UjmeEv$,DdsbBFIJQSXclnw!=?", r_ptr->d_char)))
1691 msg_format(_("%sの足首に関節蹴りをくらわした!", "You kick %s in the ankle."), m_name);
1692 special_effect = MA_SLOW;
1694 else msg_format(ma_ptr->desc, m_name);
1700 stun_effect = (ma_ptr->effect / 2) + randint1(ma_ptr->effect / 2);
1703 msg_format(ma_ptr->desc, m_name);
1706 if (attacker_ptr->special_defense & KAMAE_SUZAKU) weight = 4;
1707 if ((attacker_ptr->pclass == CLASS_FORCETRAINER) && P_PTR_KI)
1709 weight += (P_PTR_KI / 30);
1710 if (weight > 20) weight = 20;
1713 k = critical_norm(attacker_ptr, attacker_ptr->lev * weight, min_level, k, attacker_ptr->to_h[0], 0);
1715 if ((special_effect == MA_KNEE) && ((k + attacker_ptr->to_d[hand]) < m_ptr->hp))
1717 msg_format(_("%^sは苦痛にうめいている!", "%^s moans in agony!"), m_name);
1718 stun_effect = 7 + randint1(13);
1722 else if ((special_effect == MA_SLOW) && ((k + attacker_ptr->to_d[hand]) < m_ptr->hp))
1724 if (!(r_ptr->flags1 & RF1_UNIQUE) &&
1725 (randint1(attacker_ptr->lev) > r_ptr->level) &&
1728 msg_format(_("%^sは足をひきずり始めた。", "%^s starts limping slower."), m_name);
1729 m_ptr->mspeed -= 10;
1733 if (stun_effect && ((k + attacker_ptr->to_d[hand]) < m_ptr->hp))
1735 if (attacker_ptr->lev > randint1(r_ptr->level + resist_stun + 10))
1737 if (set_monster_stunned(attacker_ptr, g_ptr->m_idx, stun_effect + MON_STUNNED(m_ptr)))
1739 msg_format(_("%^sはフラフラになった。", "%^s is stunned."), m_name);
1743 msg_format(_("%^sはさらにフラフラになった。", "%^s is more stunned."), m_name);
1749 /* Handle normal weapon */
1750 else if (o_ptr->k_idx)
1752 k = damroll(o_ptr->dd + attacker_ptr->to_dd[hand], o_ptr->ds + attacker_ptr->to_ds[hand]);
1753 k = tot_dam_aux(attacker_ptr, o_ptr, k, m_ptr, mode, FALSE);
1757 k *= (3 + (attacker_ptr->lev / 20));
1761 k = k * (5 + (attacker_ptr->lev * 2 / 25)) / 2;
1763 else if (stab_fleeing)
1768 if ((attacker_ptr->impact[hand] && ((k > 50) || one_in_(7))) ||
1769 (chaos_effect == 2) || (mode == HISSATSU_QUAKE))
1774 if ((!(o_ptr->tval == TV_SWORD) || !(o_ptr->sval == SV_POISON_NEEDLE)) && !(mode == HISSATSU_KYUSHO))
1775 k = critical_norm(attacker_ptr, o_ptr->weight, o_ptr->to_h, k, attacker_ptr->to_h[hand], mode);
1783 if ((o_ptr->name1 == ART_CHAINSWORD) && !one_in_(2))
1785 char chainsword_noise[1024];
1786 if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, chainsword_noise))
1788 msg_print(chainsword_noise);
1792 if (o_ptr->name1 == ART_VORPAL_BLADE)
1794 msg_print(_("目にも止まらぬヴォーパルブレード、手錬の早業!", "Your Vorpal Blade goes snicker-snack!"));
1798 msg_format(_("%sをグッサリ切り裂いた!", "Your weapon cuts deep into %s!"), m_name);
1801 /* Try to increase the damage */
1802 while (one_in_(vorpal_chance))
1807 k *= (HIT_POINT)mult;
1810 if (((r_ptr->flagsr & RFR_RES_ALL) ? k / 100 : k) > m_ptr->hp)
1812 msg_format(_("%sを真っ二つにした!", "You cut %s in half!"), m_name);
1818 case 2: msg_format(_("%sを斬った!", "You gouge %s!"), m_name); break;
1819 case 3: msg_format(_("%sをぶった斬った!", "You maim %s!"), m_name); break;
1820 case 4: msg_format(_("%sをメッタ斬りにした!", "You carve %s!"), m_name); break;
1821 case 5: msg_format(_("%sをメッタメタに斬った!", "You cleave %s!"), m_name); break;
1822 case 6: msg_format(_("%sを刺身にした!", "You smite %s!"), m_name); break;
1823 case 7: msg_format(_("%sを斬って斬って斬りまくった!", "You eviscerate %s!"), m_name); break;
1824 default: msg_format(_("%sを細切れにした!", "You shred %s!"), m_name); break;
1827 drain_result = drain_result * 3 / 2;
1831 drain_result += o_ptr->to_d;
1834 /* Apply the player damage bonuses */
1835 k += attacker_ptr->to_d[hand];
1836 drain_result += attacker_ptr->to_d[hand];
1838 if ((mode == HISSATSU_SUTEMI) || (mode == HISSATSU_3DAN)) k *= 2;
1839 if ((mode == HISSATSU_SEKIRYUKA) && !monster_living(m_ptr->r_idx)) k = 0;
1840 if ((mode == HISSATSU_SEKIRYUKA) && !attacker_ptr->cut) k /= 2;
1842 /* No negative damage */
1845 if ((mode == HISSATSU_ZANMA) && !(!monster_living(m_ptr->r_idx) && (r_ptr->flags3 & RF3_EVIL)))
1852 msg_print(_("こんな軟らかいものは切れん!", "You cannot cut such a elastic thing!"));
1858 msg_print(_("蜘蛛は苦手だ!", "Spiders are difficult for you to deal with!"));
1862 if (mode == HISSATSU_MINEUCHI)
1864 int tmp = (10 + randint1(15) + attacker_ptr->lev / 5);
1867 anger_monster(attacker_ptr, m_ptr);
1869 if (!(r_ptr->flags3 & (RF3_NO_STUN)))
1872 if (MON_STUNNED(m_ptr))
1874 msg_format(_("%sはひどくもうろうとした。", "%s is more dazed."), m_name);
1879 msg_format(_("%s はもうろうとした。", "%s is dazed."), m_name);
1883 (void)set_monster_stunned(attacker_ptr, g_ptr->m_idx, MON_STUNNED(m_ptr) + tmp);
1887 msg_format(_("%s には効果がなかった。", "%s is not effected."), m_name);
1891 /* Modify the damage */
1892 k = mon_damage_mod(attacker_ptr, m_ptr, k, (bool)(((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE)) || ((attacker_ptr->pclass == CLASS_BERSERKER) && one_in_(2))));
1893 if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) || (mode == HISSATSU_KYUSHO))
1895 if ((randint1(randint1(r_ptr->level / 7) + 5) == 1) && !(r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags7 & RF7_UNIQUE2))
1898 msg_format(_("%sの急所を突き刺した!", "You hit %s on a fatal spot!"), m_name);
1902 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)))
1904 int maxhp = maxroll(r_ptr->hdice, r_ptr->hside);
1905 if (one_in_(backstab ? 13 : (stab_fleeing || fuiuchi) ? 15 : 27))
1909 msg_format(_("刃が%sに深々と突き刺さった!", "You critically injured %s!"), m_name);
1911 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)))
1913 if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_UNIQUE2) || (m_ptr->hp >= maxhp / 2))
1915 k = MAX(k * 5, m_ptr->hp / 2);
1917 msg_format(_("%sに致命傷を負わせた!", "You fatally injured %s!"), m_name);
1922 msg_format(_("刃が%sの急所を貫いた!", "You hit %s on a fatal spot!"), m_name);
1927 msg_format_wizard(CHEAT_MONSTER,
1928 _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"), k,
1929 m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
1931 if (k <= 0) can_drain = FALSE;
1933 if (drain_result > m_ptr->hp)
1934 drain_result = m_ptr->hp;
1936 /* Damage, check for fear and death */
1937 if (mon_take_hit(attacker_ptr, g_ptr->m_idx, k, fear, NULL))
1940 if ((attacker_ptr->pclass == CLASS_BERSERKER) && attacker_ptr->energy_use)
1942 if (attacker_ptr->migite && attacker_ptr->hidarite)
1944 if (hand) attacker_ptr->energy_use = attacker_ptr->energy_use * 3 / 5 + attacker_ptr->energy_use*num * 2 / (attacker_ptr->num_blow[hand] * 5);
1945 else attacker_ptr->energy_use = attacker_ptr->energy_use*num * 3 / (attacker_ptr->num_blow[hand] * 5);
1949 attacker_ptr->energy_use = attacker_ptr->energy_use*num / attacker_ptr->num_blow[hand];
1952 if ((o_ptr->name1 == ART_ZANTETSU) && is_lowlevel)
1953 msg_print(_("またつまらぬものを斬ってしまった...", "Sigh... Another trifling thing I've cut...."));
1957 /* Anger the monster */
1958 if (k > 0) anger_monster(attacker_ptr, m_ptr);
1960 touch_zap_player(m_ptr, attacker_ptr);
1962 /* Are we draining it? A little note: If the monster is
1963 dead, the drain does not work... */
1965 if (can_drain && (drain_result > 0))
1967 if (o_ptr->name1 == ART_MURAMASA)
1971 HIT_PROB to_h = o_ptr->to_h;
1972 HIT_POINT to_d = o_ptr->to_d;
1976 for (i = 0; i < to_h + 3; i++) if (one_in_(4)) flag = 0;
1980 for (i = 0; i < to_d + 3; i++) if (one_in_(4)) flag = 0;
1983 if (o_ptr->to_h != to_h || o_ptr->to_d != to_d)
1985 msg_print(_("妖刀は血を吸って強くなった!", "Muramasa sucked blood, and became more powerful!"));
1993 if (drain_result > 5) /* Did we really hurt it? */
1995 drain_heal = damroll(2, drain_result / 6);
1997 if (hex_spelling(attacker_ptr, HEX_VAMP_BLADE)) drain_heal *= 2;
2001 msg_format(_("Draining left: %d", "Draining left: %d"), drain_left);
2006 if (drain_heal < drain_left)
2008 drain_left -= drain_heal;
2012 drain_heal = drain_left;
2018 msg_format(_("刃が%sから生命力を吸い取った!", "Your weapon drains life from %s!"), m_name);
2022 drain_heal = (drain_heal * attacker_ptr->mutant_regenerate_mod) / 100;
2024 hp_player(attacker_ptr, drain_heal);
2025 /* We get to keep some of it! */
2030 m_ptr->maxhp -= (k + 7) / 8;
2031 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
2032 if (m_ptr->maxhp < 1) m_ptr->maxhp = 1;
2039 /* Confusion attack */
2040 if ((attacker_ptr->special_attack & ATTACK_CONFUSE) || (chaos_effect == 3) || (mode == HISSATSU_CONF) || hex_spelling(attacker_ptr, HEX_CONFUSION))
2042 /* Cancel glowing hands */
2043 if (attacker_ptr->special_attack & ATTACK_CONFUSE)
2045 attacker_ptr->special_attack &= ~(ATTACK_CONFUSE);
2046 msg_print(_("手の輝きがなくなった。", "Your hands stop glowing."));
2047 attacker_ptr->redraw |= (PR_STATUS);
2051 /* Confuse the monster */
2052 if (r_ptr->flags3 & RF3_NO_CONF)
2054 if (is_original_ap_and_seen(attacker_ptr, m_ptr)) r_ptr->r_flags3 |= RF3_NO_CONF;
2055 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
2058 else if (randint0(100) < r_ptr->level)
2060 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
2064 msg_format(_("%^sは混乱したようだ。", "%^s appears confused."), m_name);
2065 (void)set_monster_confused(attacker_ptr, g_ptr->m_idx, MON_CONFUSED(m_ptr) + 10 + randint0(attacker_ptr->lev) / 5);
2069 else if (chaos_effect == 4)
2071 bool resists_tele = FALSE;
2073 if (r_ptr->flagsr & RFR_RES_TELE)
2075 if (r_ptr->flags1 & RF1_UNIQUE)
2077 if (is_original_ap_and_seen(attacker_ptr, m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
2078 msg_format(_("%^sには効果がなかった。", "%^s is unaffected!"), m_name);
2079 resists_tele = TRUE;
2081 else if (r_ptr->level > randint1(100))
2083 if (is_original_ap_and_seen(attacker_ptr, m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
2084 msg_format(_("%^sは抵抗力を持っている!", "%^s resists!"), m_name);
2085 resists_tele = TRUE;
2091 msg_format(_("%^sは消えた!", "%^s disappears!"), m_name);
2092 teleport_away(attacker_ptr, g_ptr->m_idx, 50, TELEPORT_PASSIVE);
2093 num = num_blow + 1; /* Can't hit it anymore! */
2098 else if ((chaos_effect == 5) && (randint1(90) > r_ptr->level))
2100 if (!(r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) &&
2101 !(r_ptr->flagsr & RFR_EFF_RES_CHAO_MASK))
2103 if (polymorph_monster(attacker_ptr, y, x))
2105 msg_format(_("%^sは変化した!", "%^s changes!"), m_name);
2111 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
2114 /* Hack -- Get new monster */
2115 m_ptr = &floor_ptr->m_list[g_ptr->m_idx];
2117 /* Oops, we need a different name... */
2118 monster_desc(attacker_ptr, m_name, m_ptr, 0);
2120 /* Hack -- Get new race */
2121 r_ptr = &r_info[m_ptr->r_idx];
2124 else if (o_ptr->name1 == ART_G_HAMMER)
2126 monster_type *target_ptr = &floor_ptr->m_list[g_ptr->m_idx];
2128 if (target_ptr->hold_o_idx)
2130 object_type *q_ptr = &floor_ptr->o_list[target_ptr->hold_o_idx];
2131 GAME_TEXT o_name[MAX_NLEN];
2133 object_desc(attacker_ptr, o_name, q_ptr, OD_NAME_ONLY);
2134 q_ptr->held_m_idx = 0;
2135 q_ptr->marked = OM_TOUCHED;
2136 target_ptr->hold_o_idx = q_ptr->next_o_idx;
2137 q_ptr->next_o_idx = 0;
2138 msg_format(_("%sを奪った。", "You snatched %s."), o_name);
2139 inven_carry(attacker_ptr, q_ptr);
2147 if (weak && !(*mdeath))
2149 msg_format(_("%sは弱くなったようだ。", "%^s seems weakened."), m_name);
2152 if ((drain_left != MAX_VAMPIRIC_DRAIN) && one_in_(4))
2154 chg_virtue(attacker_ptr, V_UNLIFE, 1);
2158 k -- apply earthquake brand */
2161 earthquake(attacker_ptr, attacker_ptr->y, attacker_ptr->x, 10, 0);
2162 if (!floor_ptr->grid_array[y][x].m_idx) *mdeath = TRUE;
2168 * @brief プレイヤーの打撃処理メインルーチン
2171 * @param mode 発動中の剣術ID
2172 * @return 実際に攻撃処理が行われた場合TRUEを返す。
2174 * If no "weapon" is available, then "punch" the monster one time.
2176 bool py_attack(player_type *attacker_ptr, POSITION y, POSITION x, COMBAT_OPTION_IDX mode)
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(attacker_ptr, 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 prevents you from attacking."));
2221 /* Stop if friendly */
2222 bool stormbringer = FALSE;
2223 if (!is_hostile(m_ptr) &&
2224 !(attacker_ptr->stun || attacker_ptr->confused || attacker_ptr->image ||
2225 attacker_ptr->shero || !m_ptr->ml))
2227 if (attacker_ptr->inventory_list[INVEN_RARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
2228 if (attacker_ptr->inventory_list[INVEN_LARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
2231 msg_format(_("黒い刃は強欲に%sを攻撃した!", "Your black blade greedily attacks %s!"), m_name);
2232 chg_virtue(attacker_ptr, V_INDIVIDUALISM, 1);
2233 chg_virtue(attacker_ptr, V_HONOUR, -1);
2234 chg_virtue(attacker_ptr, V_JUSTICE, -1);
2235 chg_virtue(attacker_ptr, V_COMPASSION, -1);
2237 else if (attacker_ptr->pclass != CLASS_BERSERKER)
2239 if (get_check(_("本当に攻撃しますか?", "Really hit it? ")))
2241 chg_virtue(attacker_ptr, V_INDIVIDUALISM, 1);
2242 chg_virtue(attacker_ptr, V_HONOUR, -1);
2243 chg_virtue(attacker_ptr, V_JUSTICE, -1);
2244 chg_virtue(attacker_ptr, V_COMPASSION, -1);
2248 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(attacker_ptr, 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;
2321 bool mdeath = FALSE;
2322 if (attacker_ptr->migite) py_attack_aux(attacker_ptr, y, x, &fear, &mdeath, 0, mode);
2323 if (attacker_ptr->hidarite && !mdeath) py_attack_aux(attacker_ptr, y, x, &fear, &mdeath, 1, mode);
2325 /* Mutations which yield extra 'natural' attacks */
2328 if ((attacker_ptr->muta2 & MUT2_HORNS) && !mdeath)
2329 natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_HORNS, &fear, &mdeath);
2330 if ((attacker_ptr->muta2 & MUT2_BEAK) && !mdeath)
2331 natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_BEAK, &fear, &mdeath);
2332 if ((attacker_ptr->muta2 & MUT2_SCOR_TAIL) && !mdeath)
2333 natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_SCOR_TAIL, &fear, &mdeath);
2334 if ((attacker_ptr->muta2 & MUT2_TRUNK) && !mdeath)
2335 natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_TRUNK, &fear, &mdeath);
2336 if ((attacker_ptr->muta2 & MUT2_TENTACLES) && !mdeath)
2337 natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_TENTACLES, &fear, &mdeath);
2340 /* Hack -- delay fear messages */
2341 if (fear && m_ptr->ml && !mdeath)
2345 msg_format(_("%^sは恐怖して逃げ出した!", "%^s flees in terror!"), m_name);
2348 if ((attacker_ptr->special_defense & KATA_IAI) && ((mode != HISSATSU_IAI) || mdeath))
2350 set_action(attacker_ptr, ACTION_NONE);
2358 * @brief モンスターからプレイヤーへの打撃処理 / Attack the player via physical attacks.
2359 * @param m_idx 打撃を行うモンスターのID
2360 * @return 実際に攻撃処理を行った場合TRUEを返す
2362 bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
2364 floor_type *floor_ptr = target_ptr->current_floor_ptr;
2365 monster_type *m_ptr = &floor_ptr->m_list[m_idx];
2366 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(target_ptr, m_name, m_ptr, 0);
2400 monster_desc(target_ptr, ddesc, m_ptr, MD_WRONGDOER_NAME);
2402 if (target_ptr->special_defense & KATA_IAI)
2404 msg_format(_("相手が襲いかかる前に素早く武器を振るった。", "You took sen, drew 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 (int 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(target_ptr, 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);
2485 /* Assume no cut or stun */
2486 do_cut = do_stun = 0;
2488 /* Describe the attack method */
2493 act = _("殴られた。", "hits you.");
2494 do_cut = do_stun = 1;
2502 act = _("触られた。", "touches you.");
2510 act = _("パンチされた。", "punches you.");
2519 act = _("蹴られた。", "kicks you.");
2528 act = _("ひっかかれた。", "claws you.");
2537 act = _("噛まれた。", "bites you.");
2546 act = _("刺された。", "stings you.");
2554 act = _("斬られた。", "slashes you.");
2563 act = _("角で突かれた。", "butts you.");
2572 act = _("体当たりされた。", "crushes you.");
2581 act = _("飲み込まれた。", "engulfs you.");
2590 act = _("は請求書をよこした。", "charges you.");
2592 sound(SOUND_BUY); /* Note! This is "charges", not "charges at". */
2599 act = _("が体の上を這い回った。", "crawls on you.");
2607 act = _("よだれをたらされた。", "drools on you.");
2614 act = _("唾を吐かれた。", "spits on you.");
2622 act = _("は爆発した。", "explodes.");
2629 act = _("にらまれた。", "gazes at you.");
2635 act = _("泣き叫ばれた。", "wails at you.");
2642 act = _("胞子を飛ばされた。", "releases spores at you.");
2650 act = _("が XXX4 を発射した。", "projects XXX4's at you.");
2656 act = _("金をせがまれた。", "begs you for money.");
2666 act = desc_insult[randint0(m_ptr->r_idx == MON_DEBBY ? 10 : 8)];
2676 act = desc_moan[randint0(4)];
2686 if (m_ptr->r_idx == MON_JAIAN)
2689 switch(randint1(15))
2694 act = "「♪お~れはジャイアン~~ガ~キだいしょう~」";
2697 act = "「♪て~んかむ~てきのお~とこだぜ~~」";
2700 act = "「♪の~び太スネ夫はメじゃないよ~~」";
2703 act = "「♪け~んかスポ~ツ~どんとこい~」";
2706 act = "「♪うた~も~~う~まいぜ~まかしとけ~」";
2709 act = "「♪ま~ちいちば~んのに~んきもの~~」";
2712 act = "「♪べんきょうしゅくだいメじゃないよ~~」";
2715 act = "「♪きはやさし~くて~ち~からもち~」";
2718 act = "「♪かお~も~~スタイルも~バツグンさ~」";
2721 act = "「♪がっこうい~ちの~あ~ばれんぼう~~」";
2724 act = "「♪ド~ラもドラミもメじゃないよ~~」";
2727 act = "「♪よじげんぽけっと~な~くたって~」";
2730 act = "「♪あし~の~~ながさ~は~まけないぜ~」";
2734 act = "horribly sings 'I AM GIAAAAAN. THE BOOOSS OF THE KIIIIDS.'";
2740 act = _("は♪僕らは楽しい家族♪と歌っている。", "sings 'We are a happy family.'");
2742 act = _("は♪アイ ラブ ユー、ユー ラブ ミー♪と歌っている。", "sings 'I love you, you love me.'");
2752 if (do_silly_attack)
2757 act = silly_attacks[randint0(MAX_SILLY_ATTACK)];
2760 if (abbreviate == 0)
2761 msg_format("%^sに%s", m_name, act);
2762 else if (abbreviate == 1)
2763 msg_format("%s", act);
2764 else /* if (abbreviate == -1) */
2765 msg_format("%^s%s", m_name, act);
2766 abbreviate = 1;/*2回目以降は省略 */
2768 msg_format("%^s %s%s", m_name, act, do_silly_attack ? " you." : "");
2772 /* Hack -- assume all attacks are obvious */
2775 /* Roll out the damage */
2776 damage = damroll(d_dice, d_side);
2779 * Skip the effect when exploding, since the explosion
2780 * already causes the effect.
2782 if(explode) damage = 0;
2783 /* Apply appropriate damage */
2793 case RBE_SUPERHURT: /* AC軽減あり / Player armor reduces total damage */
2795 if (((randint1(rlev*2+300) > (ac+200)) || one_in_(13)) && !CHECK_MULTISHADOW(target_ptr))
2797 int tmp_damage = damage - (damage * ((ac < 150) ? ac : 150) / 250);
2798 msg_print(_("痛恨の一撃!", "It was a critical hit!"));
2799 tmp_damage = MAX(damage, tmp_damage*2);
2801 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, tmp_damage, ddesc, -1);
2806 case RBE_HURT: /* AC軽減あり / Player armor reduces total damage */
2809 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
2810 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2818 /* Take "poison" effect */
2819 if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr)) && !CHECK_MULTISHADOW(target_ptr))
2821 if (set_poisoned(target_ptr, target_ptr->poisoned + randint1(rlev) + 5))
2827 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2829 /* Learn about the player */
2830 update_smart_learn(target_ptr, m_idx, DRS_POIS);
2839 /* Allow complete resist */
2840 if (!target_ptr->resist_disen && !CHECK_MULTISHADOW(target_ptr))
2842 /* Apply disenchantment */
2843 if (apply_disenchant(target_ptr, 0))
2845 /* Hack -- Update AC */
2846 update_creature(target_ptr);
2851 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2853 /* Learn about the player */
2854 update_smart_learn(target_ptr, m_idx, DRS_DISEN);
2861 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2863 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
2866 for (k = 0; k < 10; k++)
2869 INVENTORY_IDX i = (INVENTORY_IDX)randint0(INVEN_PACK);
2871 /* Obtain the item */
2872 o_ptr = &target_ptr->inventory_list[i];
2873 if (!o_ptr->k_idx) continue;
2875 /* Drain charged wands/staffs */
2876 if (((o_ptr->tval == TV_STAFF) ||
2877 (o_ptr->tval == TV_WAND)) &&
2880 /* Calculate healed hitpoints */
2881 int heal=rlev * o_ptr->pval;
2882 if( o_ptr->tval == TV_STAFF)
2883 heal *= o_ptr->number;
2885 /* Don't heal more than max hp */
2886 heal = MIN(heal, m_ptr->maxhp - m_ptr->hp);
2888 msg_print(_("ザックからエネルギーが吸い取られた!", "Energy drains from your pack!"));
2892 /* Heal the monster */
2893 m_ptr->hp += (HIT_POINT)heal;
2895 /* Redraw (later) if needed */
2896 if (target_ptr->health_who == m_idx) target_ptr->redraw |= (PR_HEALTH);
2897 if (target_ptr->riding == m_idx) target_ptr->redraw |= (PR_UHEALTH);
2902 /* Combine / Reorder the pack */
2903 target_ptr->update |= (PU_COMBINE | PU_REORDER);
2904 target_ptr->window |= (PW_INVEN);
2915 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2917 /* Confused monsters cannot steal successfully. -LM-*/
2918 if (MON_CONFUSED(m_ptr)) break;
2920 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
2924 /* Saving throw (unless paralyzed) based on dex and level */
2925 if (!target_ptr->paralyzed &&
2926 (randint0(100) < (adj_dex_safe[target_ptr->stat_ind[A_DEX]] +
2929 /* Saving throw message */
2930 msg_print(_("しかし素早く財布を守った!", "You quickly protect your money pouch!"));
2932 /* Occasional blink anyway */
2933 if (randint0(3)) blinked = TRUE;
2939 gold = (target_ptr->au / 10) + randint1(25);
2940 if (gold < 2) gold = 2;
2941 if (gold > 5000) gold = (target_ptr->au / 20) + randint1(3000);
2942 if (gold > target_ptr->au) gold = target_ptr->au;
2943 target_ptr->au -= gold;
2946 msg_print(_("しかし何も盗まれなかった。", "Nothing was stolen."));
2948 else if (target_ptr->au)
2950 msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2951 msg_format(_("$%ld のお金が盗まれた!", "%ld coins were stolen!"), (long)gold);
2952 chg_virtue(target_ptr, V_SACRIFICE, 1);
2956 msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2957 msg_print(_("お金が全部盗まれた!", "All of your coins were stolen!"));
2958 chg_virtue(target_ptr, V_SACRIFICE, 2);
2962 target_ptr->redraw |= (PR_GOLD);
2964 target_ptr->window |= (PW_PLAYER);
2975 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2977 /* Confused monsters cannot steal successfully. -LM-*/
2978 if (MON_CONFUSED(m_ptr)) break;
2980 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
2982 /* Saving throw (unless paralyzed) based on dex and level */
2983 if (!target_ptr->paralyzed && (randint0(100) < (adj_dex_safe[target_ptr->stat_ind[A_DEX]] + target_ptr->lev)))
2985 /* Saving throw message */
2986 msg_print(_("しかしあわててザックを取り返した!", "You grab hold of your backpack!"));
2988 /* Occasional "blink" anyway */
2995 for (k = 0; k < 10; k++)
3000 INVENTORY_IDX i = (INVENTORY_IDX)randint0(INVEN_PACK);
3002 /* Obtain the item */
3003 o_ptr = &target_ptr->inventory_list[i];
3004 if (!o_ptr->k_idx) continue;
3006 /* Skip artifacts */
3007 if (object_is_artifact(o_ptr)) continue;
3009 object_desc(target_ptr, o_name, o_ptr, OD_OMIT_PREFIX);
3012 msg_format("%s(%c)を%s盗まれた!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
3014 msg_format("%sour %s (%c) was stolen!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
3016 chg_virtue(target_ptr, V_SACRIFICE, 1);
3017 o_idx = o_pop(floor_ptr);
3023 j_ptr = &floor_ptr->o_list[o_idx];
3024 object_copy(j_ptr, o_ptr);
3029 /* Hack -- If a rod or wand, allocate total
3030 * maximum timeouts or charges between those
3031 * stolen and those missed. -LM-
3033 if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
3035 j_ptr->pval = o_ptr->pval / o_ptr->number;
3036 o_ptr->pval -= j_ptr->pval;
3040 j_ptr->marked = OM_TOUCHED;
3042 /* Memorize monster */
3043 j_ptr->held_m_idx = m_idx;
3046 j_ptr->next_o_idx = m_ptr->hold_o_idx;
3049 m_ptr->hold_o_idx = o_idx;
3052 /* Steal the items */
3053 inven_item_increase(target_ptr, i, -1);
3054 inven_item_optimize(target_ptr, i);
3069 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3071 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3073 /* Steal some food */
3074 for (k = 0; k < 10; k++)
3076 /* Pick an item from the pack */
3077 INVENTORY_IDX i = (INVENTORY_IDX)randint0(INVEN_PACK);
3079 o_ptr = &target_ptr->inventory_list[i];
3080 if (!o_ptr->k_idx) continue;
3082 /* Skip non-food objects */
3083 if ((o_ptr->tval != TV_FOOD) && !((o_ptr->tval == TV_CORPSE) && (o_ptr->sval))) continue;
3085 object_desc(target_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
3088 msg_format("%s(%c)を%s食べられてしまった!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
3090 msg_format("%sour %s (%c) was eaten!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
3093 /* Steal the items */
3094 inven_item_increase(target_ptr, i, -1);
3095 inven_item_optimize(target_ptr, i);
3107 /* Access the lite */
3108 o_ptr = &target_ptr->inventory_list[INVEN_LITE];
3109 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3111 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3114 if ((o_ptr->xtra4 > 0) && (!object_is_fixed_artifact(o_ptr)))
3117 o_ptr->xtra4 -= (s16b)(250 + randint1(250));
3118 if (o_ptr->xtra4 < 1) o_ptr->xtra4 = 1;
3120 if (!target_ptr->blind)
3122 msg_print(_("明かりが暗くなってしまった。", "Your light dims."));
3126 target_ptr->window |= (PW_EQUIP);
3136 msg_print(_("酸を浴びせられた!", "You are covered in acid!"));
3137 get_damage += acid_dam(target_ptr, damage, ddesc, -1, FALSE);
3138 update_creature(target_ptr);
3139 update_smart_learn(target_ptr, m_idx, DRS_ACID);
3147 msg_print(_("電撃を浴びせられた!", "You are struck by electricity!"));
3148 get_damage += elec_dam(target_ptr, damage, ddesc, -1, FALSE);
3149 update_smart_learn(target_ptr, m_idx, DRS_ELEC);
3157 msg_print(_("全身が炎に包まれた!", "You are enveloped in flames!"));
3158 get_damage += fire_dam(target_ptr, damage, ddesc, -1, FALSE);
3159 update_smart_learn(target_ptr, m_idx, DRS_FIRE);
3167 msg_print(_("全身が冷気で覆われた!", "You are covered with frost!"));
3168 get_damage += cold_dam(target_ptr, damage, ddesc, -1, FALSE);
3169 update_smart_learn(target_ptr, m_idx, DRS_COLD);
3175 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3176 if (target_ptr->is_dead) break;
3178 /* Increase "blind" */
3179 if (!target_ptr->resist_blind && !CHECK_MULTISHADOW(target_ptr))
3181 if (set_blind(target_ptr, target_ptr->blind + 10 + randint1(rlev)))
3184 if (m_ptr->r_idx == MON_DIO) msg_print("どうだッ!この血の目潰しはッ!");
3192 /* Learn about the player */
3193 update_smart_learn(target_ptr, m_idx, DRS_BLIND);
3201 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3203 if (target_ptr->is_dead) break;
3205 /* Increase "confused" */
3206 if (!target_ptr->resist_conf && !CHECK_MULTISHADOW(target_ptr))
3208 if (set_confused(target_ptr, target_ptr->confused + 3 + randint1(rlev)))
3214 /* Learn about the player */
3215 update_smart_learn(target_ptr, m_idx, DRS_CONF);
3222 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3224 if (target_ptr->is_dead) break;
3226 /* Increase "afraid" */
3227 if (CHECK_MULTISHADOW(target_ptr))
3231 else if (target_ptr->resist_fear)
3233 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
3236 else if (randint0(100 + r_ptr->level/2) < target_ptr->skill_sav)
3238 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
3243 if (set_afraid(target_ptr, target_ptr->afraid + 3 + randint1(rlev)))
3249 /* Learn about the player */
3250 update_smart_learn(target_ptr, m_idx, DRS_FEAR);
3257 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3259 if (target_ptr->is_dead) break;
3261 /* Increase "paralyzed" */
3262 if (CHECK_MULTISHADOW(target_ptr))
3266 else if (target_ptr->free_act)
3268 msg_print(_("しかし効果がなかった!", "You are unaffected!"));
3271 else if (randint0(100 + r_ptr->level/2) < target_ptr->skill_sav)
3273 msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
3278 if (!target_ptr->paralyzed)
3280 if (set_paralyzed(target_ptr, 3 + randint1(rlev)))
3287 /* Learn about the player */
3288 update_smart_learn(target_ptr, m_idx, DRS_FREE);
3295 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3297 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3298 if (do_dec_stat(target_ptr, A_STR)) obvious = TRUE;
3305 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3307 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3308 if (do_dec_stat(target_ptr, A_INT)) obvious = TRUE;
3315 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3317 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3318 if (do_dec_stat(target_ptr, A_WIS)) obvious = TRUE;
3325 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3327 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3328 if (do_dec_stat(target_ptr, A_DEX)) obvious = TRUE;
3335 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3337 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3338 if (do_dec_stat(target_ptr, A_CON)) obvious = TRUE;
3345 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3347 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3348 if (do_dec_stat(target_ptr, A_CHR)) obvious = TRUE;
3355 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3357 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3359 /* Damage (stats) */
3360 if (do_dec_stat(target_ptr, A_STR)) obvious = TRUE;
3361 if (do_dec_stat(target_ptr, A_DEX)) obvious = TRUE;
3362 if (do_dec_stat(target_ptr, A_CON)) obvious = TRUE;
3363 if (do_dec_stat(target_ptr, A_INT)) obvious = TRUE;
3364 if (do_dec_stat(target_ptr, A_WIS)) obvious = TRUE;
3365 if (do_dec_stat(target_ptr, A_CHR)) obvious = TRUE;
3374 /* Hack -- Reduce damage based on the player armor class */
3375 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
3377 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3379 /* Radius 8 earthquake centered at the monster */
3380 if (damage > 23 || explode)
3382 earthquake(target_ptr, m_ptr->fy, m_ptr->fx, 8, m_idx);
3390 s32b d = damroll(10, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3394 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3396 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3398 (void)drain_exp(target_ptr, d, d / 10, 95);
3404 s32b d = damroll(20, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3408 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3410 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3412 (void)drain_exp(target_ptr, d, d / 10, 90);
3418 s32b d = damroll(40, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3422 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3424 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3426 (void)drain_exp(target_ptr, d, d / 10, 75);
3432 s32b d = damroll(80, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3436 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3438 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3440 (void)drain_exp(target_ptr, d, d / 10, 50);
3446 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3448 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3450 /* Take "poison" effect */
3451 if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr)))
3453 if (set_poisoned(target_ptr, target_ptr->poisoned + randint1(rlev) + 5))
3459 /* Damage CON (10% chance)*/
3460 if ((randint1(100) < 11) && (target_ptr->prace != RACE_ANDROID))
3462 /* 1% chance for perm. damage */
3463 bool perm = one_in_(10);
3464 if (dec_stat(target_ptr, A_CON, randint1(10), perm))
3466 msg_print(_("病があなたを蝕んでいる気がする。", "You feel sickly."));
3476 if (!target_ptr->resist_time && !CHECK_MULTISHADOW(target_ptr))
3478 switch (randint1(10))
3480 case 1: case 2: case 3: case 4: case 5:
3482 if (target_ptr->prace == RACE_ANDROID) break;
3483 msg_print(_("人生が逆戻りした気がする。", "You feel like a chunk of the past has been ripped away."));
3484 lose_exp(target_ptr, 100 + (target_ptr->exp / 100) * MON_DRAIN_LIFE);
3488 case 6: case 7: case 8: case 9:
3490 int stat = randint0(6);
3495 case A_STR: act = "強く"; break;
3496 case A_INT: act = "聡明で"; break;
3497 case A_WIS: act = "賢明で"; break;
3498 case A_DEX: act = "器用で"; break;
3499 case A_CON: act = "健康で"; break;
3500 case A_CHR: act = "美しく"; break;
3502 case A_STR: act = "strong"; break;
3503 case A_INT: act = "bright"; break;
3504 case A_WIS: act = "wise"; break;
3505 case A_DEX: act = "agile"; break;
3506 case A_CON: act = "hale"; break;
3507 case A_CHR: act = "beautiful"; break;
3512 msg_format(_("あなたは以前ほど%sなくなってしまった...。", "You're not as %s as you used to be..."), act);
3513 target_ptr->stat_cur[stat] = (target_ptr->stat_cur[stat] * 3) / 4;
3514 if (target_ptr->stat_cur[stat] < 3) target_ptr->stat_cur[stat] = 3;
3515 target_ptr->update |= (PU_BONUS);
3521 msg_print(_("あなたは以前ほど力強くなくなってしまった...。", "You're not as powerful as you used to be..."));
3523 for (k = 0; k < A_MAX; k++)
3525 target_ptr->stat_cur[k] = (target_ptr->stat_cur[k] * 7) / 8;
3526 if (target_ptr->stat_cur[k] < 3) target_ptr->stat_cur[k] = 3;
3528 target_ptr->update |= (PU_BONUS);
3533 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3539 s32b d = damroll(60, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3544 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3546 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3548 resist_drain = !drain_exp(target_ptr, d, d / 10, 50);
3550 /* Heal the attacker? */
3551 if (target_ptr->mimic_form)
3553 if (mimic_info[target_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
3554 resist_drain = TRUE;
3558 switch (target_ptr->prace)
3567 resist_drain = TRUE;
3572 if ((damage > 5) && !resist_drain)
3574 bool did_heal = FALSE;
3576 if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
3579 m_ptr->hp += damroll(4, damage / 6);
3580 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
3582 /* Redraw (later) if needed */
3583 if (target_ptr->health_who == m_idx) target_ptr->redraw |= (PR_HEALTH);
3584 if (target_ptr->riding == m_idx) target_ptr->redraw |= (PR_UHEALTH);
3586 /* Special message */
3587 if (m_ptr->ml && did_heal)
3589 msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), m_name);
3599 if (CHECK_MULTISHADOW(target_ptr))
3601 msg_print(_("攻撃は幻影に命中し、あなたには届かなかった。", "The attack hits Shadow, but you are unharmed!"));
3607 target_ptr->csp -= damage;
3608 if (target_ptr->csp < 0)
3610 target_ptr->csp = 0;
3611 target_ptr->csp_frac = 0;
3614 target_ptr->redraw |= (PR_MANA);
3617 /* Learn about the player */
3618 update_smart_learn(target_ptr, m_idx, DRS_MANA);
3624 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3626 if (target_ptr->is_dead) break;
3628 /* Decrease speed */
3629 if (CHECK_MULTISHADOW(target_ptr))
3635 if (set_slow(target_ptr, (target_ptr->slow + 4 + randint0(rlev / 10)), FALSE))
3645 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3647 if (target_ptr->is_dead) break;
3649 /* Decrease speed */
3650 if (target_ptr->resist_sound || CHECK_MULTISHADOW(target_ptr))
3656 if (set_stun(target_ptr, target_ptr->stun + 10 + randint1(r_ptr->level / 4)))
3666 /* Hack -- only one of cut or stun */
3667 if (do_cut && do_stun)
3670 if (randint0(100) < 50)
3687 /* Critical hit (zero if non-critical) */
3688 tmp = monster_critical(d_dice, d_side, damage);
3690 /* Roll for damage */
3693 case 0: cut_plus = 0; break;
3694 case 1: cut_plus = randint1(5); break;
3695 case 2: cut_plus = randint1(5) + 5; break;
3696 case 3: cut_plus = randint1(20) + 20; break;
3697 case 4: cut_plus = randint1(50) + 50; break;
3698 case 5: cut_plus = randint1(100) + 100; break;
3699 case 6: cut_plus = 300; break;
3700 default: cut_plus = 500; break;
3704 if (cut_plus) (void)set_cut(target_ptr,target_ptr->cut + cut_plus);
3712 /* Critical hit (zero if non-critical) */
3713 tmp = monster_critical(d_dice, d_side, damage);
3715 /* Roll for damage */
3718 case 0: stun_plus = 0; break;
3719 case 1: stun_plus = randint1(5); break;
3720 case 2: stun_plus = randint1(5) + 10; break;
3721 case 3: stun_plus = randint1(10) + 20; break;
3722 case 4: stun_plus = randint1(15) + 30; break;
3723 case 5: stun_plus = randint1(20) + 40; break;
3724 case 6: stun_plus = 80; break;
3725 default: stun_plus = 150; break;
3728 /* Apply the stun */
3729 if (stun_plus) (void)set_stun(target_ptr, target_ptr->stun + stun_plus);
3734 sound(SOUND_EXPLODE);
3736 if (mon_take_hit(target_ptr, m_idx, m_ptr->hp + 1, &fear, NULL))
3745 if (target_ptr->sh_fire && alive && !target_ptr->is_dead)
3747 if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK))
3749 HIT_POINT dam = damroll(2, 6);
3751 /* Modify the damage */
3752 dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
3754 msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), m_name);
3756 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は灰の山になった。", " turns into a pile of ash.")))
3764 if (is_original_ap_and_seen(target_ptr, m_ptr))
3765 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
3769 if (target_ptr->sh_elec && alive && !target_ptr->is_dead)
3771 if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK))
3773 HIT_POINT dam = damroll(2, 6);
3775 /* Modify the damage */
3776 dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
3778 msg_format(_("%^sは電撃をくらった!", "%^s gets zapped!"), m_name);
3779 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は燃え殻の山になった。", " turns into a pile of cinder.")))
3787 if (is_original_ap_and_seen(target_ptr, m_ptr))
3788 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
3792 if (target_ptr->sh_cold && alive && !target_ptr->is_dead)
3794 if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK))
3796 HIT_POINT dam = damroll(2, 6);
3798 /* Modify the damage */
3799 dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
3801 msg_format(_("%^sは冷気をくらった!", "%^s is very cold!"), m_name);
3802 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は凍りついた。", " was frozen.")))
3810 if (is_original_ap_and_seen(target_ptr, m_ptr))
3811 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
3816 if (target_ptr->dustrobe && alive && !target_ptr->is_dead)
3818 if (!(r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK))
3820 HIT_POINT dam = damroll(2, 6);
3822 /* Modify the damage */
3823 dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
3825 msg_format(_("%^sは鏡の破片をくらった!", "%^s gets zapped!"), m_name);
3826 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("はズタズタになった。", " had torn to pieces.")))
3834 if (is_original_ap_and_seen(target_ptr, m_ptr))
3835 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK);
3838 if (is_mirror_grid(&floor_ptr->grid_array[target_ptr->y][target_ptr->x]))
3840 teleport_player(target_ptr, 10, 0L);
3844 if (target_ptr->tim_sh_holy && alive && !target_ptr->is_dead)
3846 if (r_ptr->flags3 & RF3_EVIL)
3848 if (!(r_ptr->flagsr & RFR_RES_ALL))
3850 HIT_POINT dam = damroll(2, 6);
3852 /* Modify the damage */
3853 dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
3855 msg_format(_("%^sは聖なるオーラで傷ついた!", "%^s is injured by holy power!"), m_name);
3856 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3861 if (is_original_ap_and_seen(target_ptr, m_ptr))
3862 r_ptr->r_flags3 |= RF3_EVIL;
3866 if (is_original_ap_and_seen(target_ptr, m_ptr))
3867 r_ptr->r_flagsr |= RFR_RES_ALL;
3872 if (target_ptr->tim_sh_touki && alive && !target_ptr->is_dead)
3874 if (!(r_ptr->flagsr & RFR_RES_ALL))
3876 HIT_POINT dam = damroll(2, 6);
3878 /* Modify the damage */
3879 dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
3881 msg_format(_("%^sが鋭い闘気のオーラで傷ついた!", "%^s is injured by the Force"), m_name);
3882 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3890 if (is_original_ap_and_seen(target_ptr, m_ptr))
3891 r_ptr->r_flagsr |= RFR_RES_ALL;
3895 if (hex_spelling(target_ptr, HEX_SHADOW_CLOAK) && alive && !target_ptr->is_dead)
3898 object_type *o_armed_ptr = &target_ptr->inventory_list[INVEN_RARM];
3900 if (!(r_ptr->flagsr & RFR_RES_ALL || r_ptr->flagsr & RFR_RES_DARK))
3902 if (o_armed_ptr->k_idx)
3904 int basedam = ((o_armed_ptr->dd + target_ptr->to_dd[0]) * (o_armed_ptr->ds + target_ptr->to_ds[0] + 1));
3905 dam = basedam / 2 + o_armed_ptr->to_d + target_ptr->to_d[0];
3908 /* Cursed armor makes damages doubled */
3909 o_armed_ptr = &target_ptr->inventory_list[INVEN_BODY];
3910 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr)) dam *= 2;
3912 /* Modify the damage */
3913 dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
3915 msg_format(_("影のオーラが%^sに反撃した!", "Enveloping shadows attack %^s."), m_name);
3916 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3921 else /* monster does not dead */
3924 BIT_FLAGS flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
3925 EFFECT_ID typ[4][2] = {
3926 { INVEN_HEAD, GF_OLD_CONF },
3927 { INVEN_LARM, GF_OLD_SLEEP },
3928 { INVEN_HANDS, GF_TURN_ALL },
3929 { INVEN_FEET, GF_OLD_SLOW }
3932 /* Some cursed armours gives an extra effect */
3933 for (j = 0; j < 4; j++)
3935 o_armed_ptr = &target_ptr->inventory_list[typ[j][0]];
3936 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr) && object_is_armour(o_armed_ptr))
3937 project(target_ptr, 0, 0, m_ptr->fy, m_ptr->fx, (target_ptr->lev * 2), typ[j][1], flg, -1);
3943 if (is_original_ap_and_seen(target_ptr, m_ptr))
3944 r_ptr->r_flagsr |= (RFR_RES_ALL | RFR_RES_DARK);
3950 /* Monster missed player */
3953 /* Analyze failed attacks */
3969 /* Visible monsters */
3972 disturb(target_ptr, TRUE, TRUE);
3976 msg_format("%sかわした。", (target_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "");
3978 msg_format("%s%^sの攻撃をかわした。", (target_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "", m_name);
3979 abbreviate = 1;/*2回目以降は省略 */
3981 msg_format("%^s misses you.", m_name);
3986 /* Gain shield experience */
3987 if (object_is_armour(&target_ptr->inventory_list[INVEN_RARM]) || object_is_armour(&target_ptr->inventory_list[INVEN_LARM]))
3989 int cur = target_ptr->skill_exp[GINOU_SHIELD];
3990 int max = s_info[target_ptr->pclass].s_max[GINOU_SHIELD];
3994 DEPTH targetlevel = r_ptr->level;
3998 /* Extra experience */
3999 if ((cur / 100) < targetlevel)
4001 if ((cur / 100 + 15) < targetlevel)
4002 inc += 1 + (targetlevel - (cur / 100 + 15));
4007 target_ptr->skill_exp[GINOU_SHIELD] = MIN(max, cur + inc);
4008 target_ptr->update |= (PU_BONUS);
4018 /* Analyze "visible" monsters only */
4019 if (is_original_ap_and_seen(target_ptr, m_ptr) && !do_silly_attack)
4021 /* Count "obvious" attacks (and ones that cause damage) */
4022 if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
4024 /* Count attacks of this type */
4025 if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
4027 r_ptr->r_blows[ap_cnt]++;
4032 if (target_ptr->riding && damage)
4034 char m_steed_name[MAX_NLEN];
4035 monster_desc(target_ptr, m_steed_name, &floor_ptr->m_list[target_ptr->riding], 0);
4036 if (rakuba(target_ptr, (damage > 200) ? 200 : damage, FALSE))
4038 msg_format(_("%^sから落ちてしまった!", "You have fallen from %s."), m_steed_name);
4042 if (target_ptr->special_defense & NINJA_KAWARIMI)
4044 if (kawarimi(target_ptr, FALSE)) return TRUE;
4048 /* Hex - revenge damage stored */
4049 revenge_store(target_ptr, get_damage);
4051 if ((target_ptr->tim_eyeeye || hex_spelling(target_ptr, HEX_EYE_FOR_EYE))
4052 && get_damage > 0 && !target_ptr->is_dead)
4055 msg_format("攻撃が%s自身を傷つけた!", m_name);
4057 GAME_TEXT m_name_self[80];
4060 monster_desc(target_ptr, m_name_self, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE);
4062 msg_format("The attack of %s has wounded %s!", m_name, m_name_self);
4064 project(target_ptr, 0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL, -1);
4065 if (target_ptr->tim_eyeeye) set_tim_eyeeye(target_ptr, target_ptr->tim_eyeeye-5, TRUE);
4068 if ((target_ptr->counter || (target_ptr->special_defense & KATA_MUSOU)) && alive && !target_ptr->is_dead && m_ptr->ml && (target_ptr->csp > 7))
4070 char m_target_name[MAX_NLEN];
4071 monster_desc(target_ptr, m_target_name, m_ptr, 0);
4073 target_ptr->csp -= 7;
4074 msg_format(_("%^sに反撃した!", "You counterattacked %s!"), m_target_name);
4075 py_attack(target_ptr, m_ptr->fy, m_ptr->fx, HISSATSU_COUNTER);
4077 target_ptr->redraw |= (PR_MANA);
4081 if (blinked && alive && !target_ptr->is_dead)
4083 if (teleport_barrier(target_ptr, m_idx))
4085 msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But a magic barrier obstructs it."));
4089 msg_print(_("泥棒は笑って逃げた!", "The thief flees laughing!"));
4090 teleport_away(target_ptr, m_idx, MAX_SIGHT * 2 + 5, 0L);
4094 /* Always notice cause of death */
4095 if (target_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !floor_ptr->inside_arena)
4100 if (m_ptr->ml && fear && alive && !target_ptr->is_dead)
4103 msg_format(_("%^sは恐怖で逃げ出した!", "%^s flees in terror!"), m_name);
4106 if (target_ptr->special_defense & KATA_IAI)
4108 set_action(target_ptr, ACTION_NONE);
4116 * @brief モンスターから敵モンスターへの打撃攻撃処理
4117 * @param m_idx 攻撃側モンスターの参照ID
4118 * @param t_idx 目標側モンスターの参照ID
4119 * @return 実際に打撃処理が行われた場合TRUEを返す
4121 bool monst_attack_monst(player_type *subject_ptr, MONSTER_IDX m_idx, MONSTER_IDX t_idx)
4123 monster_type *m_ptr = &subject_ptr->current_floor_ptr->m_list[m_idx];
4124 monster_type *t_ptr = &subject_ptr->current_floor_ptr->m_list[t_idx];
4126 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4127 monster_race *tr_ptr = &r_info[t_ptr->r_idx];
4130 GAME_TEXT m_name[MAX_NLEN], t_name[MAX_NLEN];
4131 char temp[MAX_NLEN];
4132 bool explode = FALSE, touched = FALSE, fear = FALSE, dead = FALSE;
4133 POSITION y_saver = t_ptr->fy;
4134 POSITION x_saver = t_ptr->fx;
4137 bool see_m = is_seen(m_ptr);
4138 bool see_t = is_seen(t_ptr);
4139 bool see_either = see_m || see_t;
4141 /* Can the player be aware of this attack? */
4142 bool known = (m_ptr->cdis <= MAX_SIGHT) || (t_ptr->cdis <= MAX_SIGHT);
4143 bool do_silly_attack = (one_in_(2) && subject_ptr->image);
4145 if (m_idx == t_idx) return FALSE;
4146 if (r_ptr->flags1 & RF1_NEVER_BLOW) return FALSE;
4147 if (d_info[subject_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) return FALSE;
4150 ARMOUR_CLASS ac = tr_ptr->ac;
4152 /* Extract the effective monster level */
4153 DEPTH rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
4155 monster_desc(subject_ptr, m_name, m_ptr, 0);
4156 monster_desc(subject_ptr, t_name, t_ptr, 0);
4158 /* Assume no blink */
4159 bool blinked = FALSE;
4161 if (!see_either && known)
4163 subject_ptr->current_floor_ptr->monster_noise = TRUE;
4166 if (subject_ptr->riding && (m_idx == subject_ptr->riding)) disturb(subject_ptr, TRUE, TRUE);
4168 /* Scan through all four blows */
4169 for (ARMOUR_CLASS ap_cnt = 0; ap_cnt < 4; ap_cnt++)
4171 bool obvious = FALSE;
4173 HIT_POINT power = 0;
4174 HIT_POINT damage = 0;
4178 /* Extract the attack infomation */
4179 int effect = r_ptr->blow[ap_cnt].effect;
4180 int method = r_ptr->blow[ap_cnt].method;
4181 int d_dice = r_ptr->blow[ap_cnt].d_dice;
4182 int d_side = r_ptr->blow[ap_cnt].d_side;
4184 if (!monster_is_valid(m_ptr)) break;
4186 /* Stop attacking if the target dies! */
4187 if (t_ptr->fx != x_saver || t_ptr->fy != y_saver)
4190 /* Hack -- no more attacks */
4193 if (method == RBM_SHOOT) continue;
4195 /* Extract the attack "power" */
4196 power = mbe_info[effect].power;
4199 if (!effect || check_hit2(power, rlev, ac, MON_STUNNED(m_ptr)))
4201 (void)set_monster_csleep(subject_ptr, t_idx, 0);
4205 /* Redraw the health bar */
4206 if (subject_ptr->health_who == t_idx) subject_ptr->redraw |= (PR_HEALTH);
4207 if (subject_ptr->riding == t_idx) subject_ptr->redraw |= (PR_UHEALTH);
4210 /* Describe the attack method */
4215 act = _("%sを殴った。", "hits %s.");
4222 act = _("%sを触った。", "touches %s.");
4229 act = _("%sをパンチした。", "punches %s.");
4236 act = _("%sを蹴った。", "kicks %s.");
4243 act = _("%sをひっかいた。", "claws %s.");
4250 act = _("%sを噛んだ。", "bites %s.");
4257 act = _("%sを刺した。", "stings %s.");
4264 act = _("%sを斬った。", "slashes %s.");
4270 act = _("%sを角で突いた。", "butts %s.");
4277 act = _("%sに体当りした。", "crushes %s.");
4284 act = _("%sを飲み込んだ。", "engulfs %s.");
4291 act = _("%sに請求書をよこした。", "charges %s.");
4298 act = _("%sの体の上を這い回った。", "crawls on %s.");
4305 act = _("%sによだれをたらした。", "drools on %s.");
4312 act = _("%sに唾を吐いた。", "spits on %s.");
4319 if (see_either) disturb(subject_ptr, TRUE, TRUE);
4320 act = _("爆発した。", "explodes.");
4328 act = _("%sをにらんだ。", "gazes at %s.");
4335 act = _("%sに泣きついた。", "wails at %s.");
4342 act = _("%sに胞子を飛ばした。", "releases spores at %s.");
4349 act = _("%sにXXX4を飛ばした。", "projects XXX4's at %s.");
4356 act = _("%sに金をせがんだ。", "begs %s for money.");
4363 act = _("%sを侮辱した。", "insults %s.");
4370 act = _("%sにむかってうめいた。", "moans at %s.");
4377 act = _("%sにむかって歌った。", "sings to %s.");
4383 if (act && see_either)
4386 if (do_silly_attack) act = silly_attacks2[randint0(MAX_SILLY_ATTACK)];
4387 strfmt(temp, act, t_name);
4388 msg_format("%^sは%s", m_name, temp);
4390 if (do_silly_attack)
4392 act = silly_attacks[randint0(MAX_SILLY_ATTACK)];
4393 strfmt(temp, "%s %s.", act, t_name);
4395 else strfmt(temp, act, t_name);
4396 msg_format("%^s %s", m_name, temp);
4400 /* Hack -- assume all attacks are obvious */
4403 /* Roll out the damage */
4404 damage = damroll(d_dice, d_side);
4406 /* Assume no effect */
4407 effect_type = BLOW_EFFECT_TYPE_NONE;
4411 /* Apply appropriate damage */
4420 if ((randint1(rlev * 2 + 250) > (ac + 200)) || one_in_(13))
4422 int tmp_damage = damage - (damage * ((ac < 150) ? ac : 150) / 250);
4423 damage = MAX(damage, tmp_damage * 2);
4430 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
4445 if ((subject_ptr->riding != m_idx) && one_in_(2)) blinked = TRUE;
4481 effect_type = BLOW_EFFECT_TYPE_FEAR;
4485 effect_type = BLOW_EFFECT_TYPE_SLEEP;
4489 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
4490 if (damage > 23) earthquake(subject_ptr, m_ptr->fy, m_ptr->fx, 8, m_idx);
4505 pt = GF_HYPODYNAMIA;
4506 effect_type = BLOW_EFFECT_TYPE_HEAL;
4524 /* Do damage if not exploding */
4527 project(subject_ptr, m_idx, 0, t_ptr->fy, t_ptr->fx,
4528 damage, pt, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4531 switch (effect_type)
4533 case BLOW_EFFECT_TYPE_FEAR:
4534 project(subject_ptr, m_idx, 0, t_ptr->fy, t_ptr->fx,
4535 damage, GF_TURN_ALL, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4538 case BLOW_EFFECT_TYPE_SLEEP:
4539 project(subject_ptr, m_idx, 0, t_ptr->fy, t_ptr->fx,
4540 r_ptr->level, GF_OLD_SLEEP, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4543 case BLOW_EFFECT_TYPE_HEAL:
4544 if ((monster_living(m_idx)) && (damage > 2))
4546 bool did_heal = FALSE;
4548 if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
4551 m_ptr->hp += damroll(4, damage / 6);
4552 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
4554 /* Redraw (later) if needed */
4555 if (subject_ptr->health_who == m_idx) subject_ptr->redraw |= (PR_HEALTH);
4556 if (subject_ptr->riding == m_idx) subject_ptr->redraw |= (PR_UHEALTH);
4558 /* Special message */
4559 if (see_m && did_heal)
4561 msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), m_name);
4570 if ((tr_ptr->flags2 & RF2_AURA_FIRE) && m_ptr->r_idx)
4572 if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK))
4576 msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), m_name);
4578 if (m_ptr->ml && is_original_ap_and_seen(subject_ptr, t_ptr)) tr_ptr->r_flags2 |= RF2_AURA_FIRE;
4579 project(subject_ptr, t_idx, 0, m_ptr->fy, m_ptr->fx,
4580 damroll(1 + ((tr_ptr->level) / 26),
4581 1 + ((tr_ptr->level) / 17)),
4582 GF_FIRE, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4586 if (is_original_ap_and_seen(subject_ptr, m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
4591 if ((tr_ptr->flags3 & RF3_AURA_COLD) && m_ptr->r_idx)
4593 if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK))
4597 msg_format(_("%^sは突然寒くなった!", "%^s is suddenly very cold!"), m_name);
4599 if (m_ptr->ml && is_original_ap_and_seen(subject_ptr, t_ptr)) tr_ptr->r_flags3 |= RF3_AURA_COLD;
4600 project(subject_ptr, t_idx, 0, m_ptr->fy, m_ptr->fx,
4601 damroll(1 + ((tr_ptr->level) / 26),
4602 1 + ((tr_ptr->level) / 17)),
4603 GF_COLD, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4607 if (is_original_ap_and_seen(subject_ptr, m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
4612 if ((tr_ptr->flags2 & RF2_AURA_ELEC) && m_ptr->r_idx)
4614 if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK))
4618 msg_format(_("%^sは電撃を食らった!", "%^s gets zapped!"), m_name);
4620 if (m_ptr->ml && is_original_ap_and_seen(subject_ptr, t_ptr)) tr_ptr->r_flags2 |= RF2_AURA_ELEC;
4621 project(subject_ptr, t_idx, 0, m_ptr->fy, m_ptr->fx,
4622 damroll(1 + ((tr_ptr->level) / 26),
4623 1 + ((tr_ptr->level) / 17)),
4624 GF_ELEC, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4628 if (is_original_ap_and_seen(subject_ptr, m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
4635 /* Monster missed player */
4638 /* Analyze failed attacks */
4654 (void)set_monster_csleep(subject_ptr, t_idx, 0);
4656 /* Visible monsters */
4660 msg_format("%sは%^sの攻撃をかわした。", t_name, m_name);
4662 msg_format("%^s misses %s.", m_name, t_name);
4672 /* Analyze "visible" monsters only */
4673 if (is_original_ap_and_seen(subject_ptr, m_ptr) && !do_silly_attack)
4675 /* Count "obvious" attacks (and ones that cause damage) */
4676 if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
4678 /* Count attacks of this type */
4679 if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
4681 r_ptr->r_blows[ap_cnt]++;
4689 sound(SOUND_EXPLODE);
4691 /* Cancel Invulnerability */
4692 (void)set_monster_invulner(subject_ptr, m_idx, 0, FALSE);
4693 mon_take_hit_mon(subject_ptr, m_idx, m_ptr->hp + 1, &dead, &fear, _("は爆発して粉々になった。", " explodes into tiny shreds."), m_idx);
4697 if (!blinked || m_ptr->r_idx == 0) return TRUE;
4699 if (teleport_barrier(subject_ptr, m_idx))
4703 msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But a magic barrier obstructs it."));
4707 subject_ptr->current_floor_ptr->monster_noise = TRUE;
4714 msg_print(_("泥棒は笑って逃げた!", "The thief flees laughing!"));
4718 subject_ptr->current_floor_ptr->monster_noise = TRUE;
4721 teleport_away(subject_ptr, m_idx, MAX_SIGHT * 2 + 5, 0L);
4730 * @brief モンスターが敵モンスターに行う打撃処理 /
4731 * Hack, based on mon_take_hit... perhaps all monster attacks on other monsters should use this?
4732 * @param m_idx 目標となるモンスターの参照ID
4734 * @param dead 目標となったモンスターの死亡状態を返す参照ポインタ
4735 * @param fear 目標となったモンスターの恐慌状態を返す参照ポインタ
4736 * @param note 目標モンスターが死亡した場合の特別メッセージ(NULLならば標準表示を行う)
4737 * @param who 打撃を行ったモンスターの参照ID
4740 void mon_take_hit_mon(player_type *player_ptr, MONSTER_IDX m_idx, HIT_POINT dam, bool *dead, bool *fear, concptr note, MONSTER_IDX who)
4742 floor_type *floor_ptr = player_ptr->current_floor_ptr;
4743 monster_type *m_ptr = &floor_ptr->m_list[m_idx];
4744 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4745 GAME_TEXT m_name[160];
4746 bool seen = is_seen(m_ptr);
4748 /* Can the player be aware of this attack? */
4749 bool known = (m_ptr->cdis <= MAX_SIGHT);
4751 monster_desc(player_ptr, m_name, m_ptr, 0);
4753 /* Redraw (later) if needed */
4756 if (player_ptr->health_who == m_idx) player_ptr->redraw |= (PR_HEALTH);
4757 if (player_ptr->riding == m_idx) player_ptr->redraw |= (PR_UHEALTH);
4760 (void)set_monster_csleep(player_ptr, m_idx, 0);
4762 if (player_ptr->riding && (m_idx == player_ptr->riding)) disturb(player_ptr, TRUE, TRUE);
4764 if (MON_INVULNER(m_ptr) && randint0(PENETRATE_INVULNERABILITY))
4768 msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
4773 if (r_ptr->flagsr & RFR_RES_ALL)
4778 if ((dam == 0) && one_in_(3)) dam = 1;
4784 msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
4793 /* It is dead now... or is it? */
4796 if (((r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) ||
4797 (r_ptr->flags7 & RF7_NAZGUL)) &&
4798 !player_ptr->phase_out)
4805 if (!monster_living(m_ptr->r_idx))
4807 sound(SOUND_N_KILL);
4818 monster_desc(player_ptr, m_name, m_ptr, MD_TRUE_NAME);
4819 /* Unseen death by normal attack */
4822 floor_ptr->monster_noise = TRUE;
4824 /* Death by special attack */
4827 msg_format(_("%^s%s", "%^s%s"), m_name, note);
4829 /* Death by normal attack -- nonliving monster */
4830 else if (!monster_living(m_ptr->r_idx))
4832 msg_format(_("%^sは破壊された。", "%^s is destroyed."), m_name);
4834 /* Death by normal attack -- living monster */
4837 msg_format(_("%^sは殺された。", "%^s is killed."), m_name);
4841 monster_gain_exp(player_ptr, who, m_ptr->r_idx);
4842 monster_death(player_ptr, m_idx, FALSE);
4843 delete_monster_idx(player_ptr, m_idx);
4848 /* Monster is dead */
4855 /* Mega-Hack -- Pain cancels fear */
4856 if (MON_MONFEAR(m_ptr) && (dam > 0))
4859 if (set_monster_monfear(player_ptr, m_idx, MON_MONFEAR(m_ptr) - randint1(dam / 4)))
4866 /* Sometimes a monster gets scared by damage */
4867 if (!MON_MONFEAR(m_ptr) && !(r_ptr->flags3 & RF3_NO_FEAR))
4869 /* Percentage of fully healthy */
4870 int percentage = (100L * m_ptr->hp) / m_ptr->maxhp;
4873 * Run (sometimes) if at 10% or less of max hit points,
4874 * or (usually) when hit for half its current hit points
4876 if (((percentage <= 10) && (randint0(10) < percentage)) ||
4877 ((dam >= m_ptr->hp) && (randint0(100) < 80)))
4879 /* Hack -- note fear */
4882 /* Hack -- Add some timed fear */
4883 (void)set_monster_monfear(player_ptr, m_idx, (randint1(10) +
4884 (((dam >= m_ptr->hp) && (percentage > 7)) ?
4885 20 : ((11 - percentage) * 5))));
4889 if ((dam > 0) && !is_pet(m_ptr) && !is_friendly(m_ptr) && (who != m_idx))
4891 if (is_pet(&floor_ptr->m_list[who]) && !player_bold(player_ptr, m_ptr->target_y, m_ptr->target_x))
4893 set_target(m_ptr, floor_ptr->m_list[who].fy, floor_ptr->m_list[who].fx);
4897 if (player_ptr->riding && (player_ptr->riding == m_idx) && (dam > 0))
4899 monster_desc(player_ptr, m_name, m_ptr, 0);
4901 if (m_ptr->hp > m_ptr->maxhp / 3) dam = (dam + 1) / 2;
4902 if (rakuba(player_ptr, (dam > 200) ? 200 : dam, FALSE))
4904 msg_format(_("%^sに振り落とされた!", "You have been thrown off from %s!"), m_name);