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/realm-hex.h"
28 #include "realm/realm-song.h"
29 #include "object-flavor.h"
30 #include "object-hook.h"
33 #include "effect/effect-characteristics.h"
35 #include "spell/process-effect.h"
36 #include "spell/spells-type.h"
38 #include "player-move.h"
39 #include "player-effects.h"
40 #include "player-skill.h"
41 #include "player-damage.h"
42 #include "player-status.h"
43 #include "player/mimic-info-table.h"
44 #include "player-class.h"
45 #include "player-personality.h"
46 #include "view/display-main-window.h"
48 #include "spells-floor.h"
50 #define BLOW_EFFECT_TYPE_NONE 0
51 #define BLOW_EFFECT_TYPE_FEAR 1
52 #define BLOW_EFFECT_TYPE_SLEEP 2
53 #define BLOW_EFFECT_TYPE_HEAL 3
56 * @brief モンスターの打撃効力テーブル /
57 * The table of monsters' blow effects
59 const mbe_info_type mbe_info[] =
62 { 60, GF_MISSILE, }, /* HURT */
63 { 5, GF_POIS, }, /* POISON */
64 { 20, GF_DISENCHANT, }, /* UN_BONUS */
65 { 15, GF_MISSILE, }, /* UN_POWER */ /* ToDo: Apply the correct effects */
66 { 5, GF_MISSILE, }, /* EAT_GOLD */
67 { 5, GF_MISSILE, }, /* EAT_ITEM */
68 { 5, GF_MISSILE, }, /* EAT_FOOD */
69 { 5, GF_MISSILE, }, /* EAT_LITE */
70 { 0, GF_ACID, }, /* ACID */
71 { 10, GF_ELEC, }, /* ELEC */
72 { 10, GF_FIRE, }, /* FIRE */
73 { 10, GF_COLD, }, /* COLD */
74 { 2, GF_MISSILE, }, /* BLIND */
75 { 10, GF_CONFUSION, }, /* CONFUSE */
76 { 10, GF_MISSILE, }, /* TERRIFY */
77 { 2, GF_MISSILE, }, /* PARALYZE */
78 { 0, GF_MISSILE, }, /* LOSE_STR */
79 { 0, GF_MISSILE, }, /* LOSE_INT */
80 { 0, GF_MISSILE, }, /* LOSE_WIS */
81 { 0, GF_MISSILE, }, /* LOSE_DEX */
82 { 0, GF_MISSILE, }, /* LOSE_CON */
83 { 0, GF_MISSILE, }, /* LOSE_CHR */
84 { 2, GF_MISSILE, }, /* LOSE_ALL */
85 { 60, GF_ROCKET, }, /* SHATTER */
86 { 5, GF_MISSILE, }, /* EXP_10 */
87 { 5, GF_MISSILE, }, /* EXP_20 */
88 { 5, GF_MISSILE, }, /* EXP_40 */
89 { 5, GF_MISSILE, }, /* EXP_80 */
90 { 5, GF_POIS, }, /* DISEASE */
91 { 5, GF_TIME, }, /* TIME */
92 { 5, GF_MISSILE, }, /* EXP_VAMP */
93 { 5, GF_MANA, }, /* DR_MANA */
94 { 60, GF_MISSILE, }, /* SUPERHURT */
98 * @brief 幻覚時の打撃記述テーブル / Weird melee attack types when hallucinating
101 const concptr silly_attacks[MAX_SILLY_ATTACK] =
104 "があなたの回りを3回回ってワンと言った。",
112 "に「神の国」発言の撤回を求められた。",
123 "はあなたの100の秘密について熱く語った。",
135 "に二週間以内でビデオを人に見せないと死ぬ呪いをかけられた。",
137 "はスーパーウルトラギャラクティカマグナムを放った。",
139 "にジェットストリームアタックをかけられた。",
140 "はあなたに卍固めをかけて「1、2、3、ダーッ!」と叫んだ。",
141 "は「いくじなし!ばかばかばか!」といって駆け出した。",
142 "が「ごらん、ルーベンスの絵だよ」と言って静かに目を閉じた。",
143 "は言った。「変愚蛮怒、絶賛公開中!」",
147 * @brief 幻覚時の打撃記述テーブル(フォーマットつき) / Weird melee attack types when hallucinating (%s for strfmt())
149 const concptr silly_attacks2[MAX_SILLY_ATTACK] =
152 "%sの回りを3回回ってワンと言った。",
160 "%sに「神の国」発言の撤回を求めた。",
171 "%sの100の秘密について熱く語った。",
183 "%sに二週間以内でビデオを人に見せないと死ぬ呪いをかけた。",
185 "%sにスーパーウルトラギャラクティカマグナムを放った。",
187 "%sにジェットストリームアタックをかけた。",
188 "%sに卍固めをかけて「1、2、3、ダーッ!」と叫んだ。",
189 "「いくじなし!ばかばかばか!」といって駆け出した。",
190 "「ごらん、ルーベンスの絵だよ」と言って静かに目を閉じた。",
194 const concptr silly_attacks[MAX_SILLY_ATTACK] =
205 "makes obscene gestures at",
235 * @brief マーシャルアーツ打撃テーブル
237 const martial_arts ma_blows[MAX_MA] =
240 { "%sを殴った。", 1, 0, 1, 5, 0 },
241 { "%sを蹴った。", 2, 0, 1, 7, 0 },
242 { "%sに正拳突きをくらわした。", 3, 0, 1, 9, 0 },
243 { "%sに膝蹴りをくらわした。", 5, 5, 2, 4, MA_KNEE },
244 { "%sに肘打ちをくらわした。", 7, 5, 1, 12, 0 },
245 { "%sに体当りした。", 9, 10, 2, 6, 0 },
246 { "%sを蹴った。", 11, 10, 3, 6, MA_SLOW },
247 { "%sにアッパーをくらわした。", 13, 12, 5, 5, 6 },
248 { "%sに二段蹴りをくらわした。", 16, 15, 5, 6, 8 },
249 { "%sに猫爪撃をくらわした。", 20, 20, 5, 8, 0 },
250 { "%sに跳空脚をくらわした。", 24, 25, 6, 8, 10 },
251 { "%sに鷲爪襲をくらわした。", 28, 25, 7, 9, 0 },
252 { "%sに回し蹴りをくらわした。", 32, 30, 8, 10, 10 },
253 { "%sに鉄拳撃をくらわした。", 35, 35, 8, 11, 10 },
254 { "%sに飛空脚をくらわした。", 39, 35, 8, 12, 12 },
255 { "%sに昇龍拳をくらわした。", 43, 35, 9, 12, 16 },
256 { "%sに石破天驚拳をくらわした。", 48, 40, 10, 13, 18 },
258 { "You punch %s.", 1, 0, 1, 4, 0 },
259 { "You kick %s.", 2, 0, 1, 6, 0 },
260 { "You strike %s.", 3, 0, 1, 7, 0 },
261 { "You hit %s with your knee.", 5, 5, 2, 3, MA_KNEE },
262 { "You hit %s with your elbow.", 7, 5, 1, 8, 0 },
263 { "You butt %s.", 9, 10, 2, 5, 0 },
264 { "You kick %s.", 11, 10, 3, 4, MA_SLOW },
265 { "You uppercut %s.", 13, 12, 4, 4, 6 },
266 { "You double-kick %s.", 16, 15, 5, 4, 8 },
267 { "You hit %s with a Cat's Claw.", 20, 20, 5, 5, 0 },
268 { "You hit %s with a jump kick.", 25, 25, 5, 6, 10 },
269 { "You hit %s with an Eagle's Claw.", 29, 25, 6, 6, 0 },
270 { "You hit %s with a circle kick.", 33, 30, 6, 8, 10 },
271 { "You hit %s with an Iron Fist.", 37, 35, 8, 8, 10 },
272 { "You hit %s with a flying kick.", 41, 35, 8, 10, 12 },
273 { "You hit %s with a Dragon Fist.", 45, 35, 10, 10, 16 },
274 { "You hit %s with a Crushing Blow.", 48, 35, 10, 12, 18 },
280 * @brief 修行僧のターンダメージ算出テーブル
282 const int monk_ave_damage[PY_MAX_LEVEL + 1][3] =
339 * Stat Table (STR) -- help index into the "blow" table
341 const byte adj_str_blow[] =
358 20 /* 18/00-18/09 */,
359 30 /* 18/10-18/19 */,
360 40 /* 18/20-18/29 */,
361 50 /* 18/30-18/39 */,
362 60 /* 18/40-18/49 */,
363 70 /* 18/50-18/59 */,
364 80 /* 18/60-18/69 */,
365 90 /* 18/70-18/79 */,
366 100 /* 18/80-18/89 */,
367 110 /* 18/90-18/99 */,
368 120 /* 18/100-18/109 */,
369 130 /* 18/110-18/119 */,
370 140 /* 18/120-18/129 */,
371 150 /* 18/130-18/139 */,
372 160 /* 18/140-18/149 */,
373 170 /* 18/150-18/159 */,
374 180 /* 18/160-18/169 */,
375 190 /* 18/170-18/179 */,
376 200 /* 18/180-18/189 */,
377 210 /* 18/190-18/199 */,
378 220 /* 18/200-18/209 */,
379 230 /* 18/210-18/219 */,
385 * 器用さによる攻撃回数インデックステーブル
386 * Stat Table (DEX) -- index into the "blow" table
388 const byte adj_dex_blow[] =
415 7 /* 18/100-18/109 */,
416 7 /* 18/110-18/119 */,
417 8 /* 18/120-18/129 */,
418 8 /* 18/130-18/139 */,
419 9 /* 18/140-18/149 */,
420 9 /* 18/150-18/159 */,
421 10 /* 18/160-18/169 */,
422 10 /* 18/170-18/179 */,
423 11 /* 18/180-18/189 */,
424 11 /* 18/190-18/199 */,
425 12 /* 18/200-18/209 */,
426 12 /* 18/210-18/219 */,
433 * 腕力、器用さに応じた攻撃回数テーブル /
434 * This table is used to help calculate the number of blows the player can
435 * make in a single round of attacks (one player turn) with a normal weapon.
438 * This number ranges from a single blow/round for weak players to up to six
439 * blows/round for powerful warriors.
441 * Note that certain artifacts and ego-items give "bonus" blows/round.
443 * First, from the player class, we extract some values:
445 * Warrior num = 6; mul = 5; div = MAX(70, weapon_weight);
446 * Berserker num = 6; mul = 7; div = MAX(70, weapon_weight);
447 * Mage num = 3; mul = 2; div = MAX(100, weapon_weight);
448 * Priest num = 5; mul = 3; div = MAX(100, weapon_weight);
449 * Mindcrafter num = 5; mul = 3; div = MAX(100, weapon_weight);
450 * Rogue num = 5; mul = 3; div = MAX(40, weapon_weight);
451 * Ranger num = 5; mul = 4; div = MAX(70, weapon_weight);
452 * Paladin num = 5; mul = 4; div = MAX(70, weapon_weight);
453 * Weaponsmith num = 5; mul = 5; div = MAX(150, weapon_weight);
454 * Warrior-Mage num = 5; mul = 3; div = MAX(70, weapon_weight);
455 * Chaos Warrior num = 5; mul = 4; div = MAX(70, weapon_weight);
456 * Monk num = 5; mul = 3; div = MAX(60, weapon_weight);
457 * Tourist num = 4; mul = 3; div = MAX(100, weapon_weight);
458 * Imitator num = 5; mul = 4; div = MAX(70, weapon_weight);
459 * Beastmaster num = 5; mul = 3; div = MAX(70, weapon_weight);
460 * Cavalry(Ride) num = 5; mul = 4; div = MAX(70, weapon_weight);
461 * Cavalry(Walk) num = 5; mul = 3; div = MAX(100, weapon_weight);
462 * Sorcerer num = 1; mul = 1; div = MAX(1, weapon_weight);
463 * Archer num = 4; mul = 2; div = MAX(70, weapon_weight);
464 * Magic eater num = 4; mul = 2; div = MAX(70, weapon_weight);
465 * ForceTrainer num = 4; mul = 2; div = MAX(60, weapon_weight);
466 * Mirror Master num = 3; mul = 3; div = MAX(100, weapon_weight);
467 * Ninja num = 4; mul = 1; div = MAX(20, weapon_weight);
469 * To get "P", we look up the relevant "adj_str_blow[]" (see above),
470 * multiply it by "mul", and then divide it by "div".
471 * Increase P by 1 if you wield a weapon two-handed.
472 * Decrease P by 1 if you are a Ninja.
474 * To get "D", we look up the relevant "adj_dex_blow[]" (see above),
476 * The player gets "blows_table[P][D]" blows/round, as shown below,
477 * up to a maximum of "num" blows/round, plus any "bonus" blows/round.
480 const byte blows_table[12][12] =
483 /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11+ */
484 /* 3 10 15 /10 /40 /60 /80 /100 /120 /140 /160 /180 */
485 /* 0 */{ 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4 },
486 /* 1 */{ 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4 },
487 /* 2 */{ 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5 },
488 /* 3 */{ 1, 1, 2, 3, 3, 4, 4, 4, 5, 5, 5, 5 },
489 /* 4 */{ 1, 1, 2, 3, 3, 4, 4, 5, 5, 5, 5, 5 },
490 /* 5 */{ 1, 1, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6 },
491 /* 6 */{ 1, 1, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6 },
492 /* 7 */{ 1, 2, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6 },
493 /* 8 */{ 1, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6 },
494 /* 9 */{ 1, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6 },
495 /* 10*/{ 2, 2, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6 },
496 /*11+*/{ 2, 2, 3, 4, 4, 4, 5, 5, 6, 6, 6, 6 },
500 * @brief プレイヤーからモンスターへの打撃命中判定 /
501 * Determine if the player "hits" a monster (normal combat).
502 * @param chance 基本命中値
504 * @param visible 目標を視界に捕らえているならばTRUEを指定
505 * @return 命中と判定された場合TRUEを返す
506 * @note Always miss 5%, always hit 5%, otherwise random.
508 bool test_hit_norm(player_type *attacker_ptr, HIT_RELIABILITY chance, ARMOUR_CLASS ac, bool visible)
510 if (!visible) chance = (chance + 1) / 2;
511 return hit_chance(attacker_ptr, chance, ac) >= randint1(100);
515 * @brief モンスターへの命中率の計算
516 * @param player_ptr プレーヤーへの参照ポインタ
521 PERCENTAGE hit_chance(player_type *attacker_ptr, HIT_RELIABILITY reli, ARMOUR_CLASS ac)
523 PERCENTAGE chance = 5, chance_left = 90;
524 if(reli <= 0) return 5;
525 if(attacker_ptr->pseikaku == SEIKAKU_NAMAKE) chance_left = (chance_left * 19 + 9) / 20;
526 chance += (100 - ((ac * 75) / reli)) * chance_left / 100;
527 if (chance < 5) chance = 5;
533 * @brief プレイヤー攻撃の種族スレイング倍率計算
534 * @param player_ptr プレーヤーへの参照ポインタ
535 * @param mult 算出前の基本倍率(/10倍)
536 * @param flgs スレイフラグ配列
537 * @param m_ptr 目標モンスターの構造体参照ポインタ
538 * @return スレイング加味後の倍率(/10倍)
540 static MULTIPLY mult_slaying(player_type *player_ptr, MULTIPLY mult, const BIT_FLAGS* flgs, monster_type* m_ptr)
542 static const struct slay_table_t {
544 BIT_FLAGS affect_race_flag;
547 size_t r_flag_offset;
549 #define OFFSET(X) offsetof(monster_race, X)
550 {TR_SLAY_ANIMAL, RF3_ANIMAL, 25, OFFSET(flags3), OFFSET(r_flags3)},
551 {TR_KILL_ANIMAL, RF3_ANIMAL, 40, OFFSET(flags3), OFFSET(r_flags3)},
552 {TR_SLAY_EVIL, RF3_EVIL, 20, OFFSET(flags3), OFFSET(r_flags3)},
553 {TR_KILL_EVIL, RF3_EVIL, 35, OFFSET(flags3), OFFSET(r_flags3)},
554 {TR_SLAY_GOOD, RF3_GOOD, 20, OFFSET(flags3), OFFSET(r_flags3)},
555 {TR_KILL_GOOD, RF3_GOOD, 35, OFFSET(flags3), OFFSET(r_flags3)},
556 {TR_SLAY_HUMAN, RF2_HUMAN, 25, OFFSET(flags2), OFFSET(r_flags2)},
557 {TR_KILL_HUMAN, RF2_HUMAN, 40, OFFSET(flags2), OFFSET(r_flags2)},
558 {TR_SLAY_UNDEAD, RF3_UNDEAD, 30, OFFSET(flags3), OFFSET(r_flags3)},
559 {TR_KILL_UNDEAD, RF3_UNDEAD, 50, OFFSET(flags3), OFFSET(r_flags3)},
560 {TR_SLAY_DEMON, RF3_DEMON, 30, OFFSET(flags3), OFFSET(r_flags3)},
561 {TR_KILL_DEMON, RF3_DEMON, 50, OFFSET(flags3), OFFSET(r_flags3)},
562 {TR_SLAY_ORC, RF3_ORC, 30, OFFSET(flags3), OFFSET(r_flags3)},
563 {TR_KILL_ORC, RF3_ORC, 50, OFFSET(flags3), OFFSET(r_flags3)},
564 {TR_SLAY_TROLL, RF3_TROLL, 30, OFFSET(flags3), OFFSET(r_flags3)},
565 {TR_KILL_TROLL, RF3_TROLL, 50, OFFSET(flags3), OFFSET(r_flags3)},
566 {TR_SLAY_GIANT, RF3_GIANT, 30, OFFSET(flags3), OFFSET(r_flags3)},
567 {TR_KILL_GIANT, RF3_GIANT, 50, OFFSET(flags3), OFFSET(r_flags3)},
568 {TR_SLAY_DRAGON, RF3_DRAGON, 30, OFFSET(flags3), OFFSET(r_flags3)},
569 {TR_KILL_DRAGON, RF3_DRAGON, 50, OFFSET(flags3), OFFSET(r_flags3)},
573 monster_race* r_ptr = &r_info[m_ptr->r_idx];
574 for (size_t i = 0; i < sizeof(slay_table) / sizeof(slay_table[0]); ++i)
576 const struct slay_table_t* p = &slay_table[i];
578 if (!have_flag(flgs, p->slay_flag) ||
579 !(atoffset(BIT_FLAGS, r_ptr, p->flag_offset) & p->affect_race_flag))
582 if (is_original_ap_and_seen(player_ptr, m_ptr))
584 atoffset(BIT_FLAGS, r_ptr, p->r_flag_offset) |= p->affect_race_flag;
587 mult = MAX(mult, p->slay_mult);
595 * @brief プレイヤー攻撃の属性スレイング倍率計算
596 * @param player_ptr プレーヤーへの参照ポインタ
597 * @param mult 算出前の基本倍率(/10倍)
598 * @param flgs スレイフラグ配列
599 * @param m_ptr 目標モンスターの構造体参照ポインタ
600 * @return スレイング加味後の倍率(/10倍)
602 static MULTIPLY mult_brand(player_type *player_ptr, MULTIPLY mult, const BIT_FLAGS* flgs, monster_type* m_ptr)
604 static const struct brand_table_t {
606 BIT_FLAGS resist_mask;
609 {TR_BRAND_ACID, RFR_EFF_IM_ACID_MASK, 0U },
610 {TR_BRAND_ELEC, RFR_EFF_IM_ELEC_MASK, 0U },
611 {TR_BRAND_FIRE, RFR_EFF_IM_FIRE_MASK, RF3_HURT_FIRE},
612 {TR_BRAND_COLD, RFR_EFF_IM_COLD_MASK, RF3_HURT_COLD},
613 {TR_BRAND_POIS, RFR_EFF_IM_POIS_MASK, 0U },
616 monster_race* r_ptr = &r_info[m_ptr->r_idx];
617 for (size_t i = 0; i < sizeof(brand_table) / sizeof(brand_table[0]); ++i)
619 const struct brand_table_t* p = &brand_table[i];
621 if (!have_flag(flgs, p->brand_flag)) continue;
623 /* Notice immunity */
624 if (r_ptr->flagsr & p->resist_mask)
626 if (is_original_ap_and_seen(player_ptr, m_ptr))
628 r_ptr->r_flagsr |= (r_ptr->flagsr & p->resist_mask);
634 /* Otherwise, take the damage */
635 if (r_ptr->flags3 & p->hurt_flag)
637 if (is_original_ap_and_seen(player_ptr, m_ptr))
639 r_ptr->r_flags3 |= p->hurt_flag;
642 mult = MAX(mult, 50);
646 mult = MAX(mult, 25);
654 * @brief 剣術のスレイ倍率計算を行う /
655 * Calcurate magnification of hissatsu technics
656 * @param mult 剣術のスレイ効果以前に算出している多要素の倍率(/10倍)
657 * @param flgs 剣術に使用する武器のスレイフラグ配列
658 * @param m_ptr 目標となるモンスターの構造体参照ポインタ
659 * @param mode 剣術のスレイ型ID
660 * @return スレイの倍率(/10倍)
662 static MULTIPLY mult_hissatsu(player_type *attacker_ptr, MULTIPLY mult, BIT_FLAGS *flgs, monster_type *m_ptr, BIT_FLAGS mode)
664 monster_race *r_ptr = &r_info[m_ptr->r_idx];
666 /* Burning Strike (Fire) */
667 if (mode == HISSATSU_FIRE)
669 /* Notice immunity */
670 if (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK)
672 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
674 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
678 /* Otherwise, take the damage */
679 else if (have_flag(flgs, TR_BRAND_FIRE))
681 if (r_ptr->flags3 & RF3_HURT_FIRE)
683 if (mult < 70) mult = 70;
684 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
686 r_ptr->r_flags3 |= RF3_HURT_FIRE;
689 else if (mult < 35) mult = 35;
693 if (r_ptr->flags3 & RF3_HURT_FIRE)
695 if (mult < 50) mult = 50;
696 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
698 r_ptr->r_flags3 |= RF3_HURT_FIRE;
701 else if (mult < 25) mult = 25;
705 /* Serpent's Tongue (Poison) */
706 if (mode == HISSATSU_POISON)
708 /* Notice immunity */
709 if (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK)
711 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
713 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK);
717 /* Otherwise, take the damage */
718 else if (have_flag(flgs, TR_BRAND_POIS))
720 if (mult < 35) mult = 35;
724 if (mult < 25) mult = 25;
728 /* Zammaken (Nonliving Evil) */
729 if (mode == HISSATSU_ZANMA)
731 if (!monster_living(m_ptr->r_idx) && (r_ptr->flags3 & RF3_EVIL))
733 if (mult < 15) mult = 25;
734 else if (mult < 50) mult = MIN(50, mult + 20);
738 /* Rock Smash (Hurt Rock) */
739 if (mode == HISSATSU_HAGAN)
741 if (r_ptr->flags3 & RF3_HURT_ROCK)
743 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
745 r_ptr->r_flags3 |= RF3_HURT_ROCK;
747 if (mult == 10) mult = 40;
748 else if (mult < 60) mult = 60;
752 /* Midare-Setsugekka (Cold) */
753 if (mode == HISSATSU_COLD)
755 /* Notice immunity */
756 if (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK)
758 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
760 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
763 /* Otherwise, take the damage */
764 else if (have_flag(flgs, TR_BRAND_COLD))
766 if (r_ptr->flags3 & RF3_HURT_COLD)
768 if (mult < 70) mult = 70;
769 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
771 r_ptr->r_flags3 |= RF3_HURT_COLD;
774 else if (mult < 35) mult = 35;
778 if (r_ptr->flags3 & RF3_HURT_COLD)
780 if (mult < 50) mult = 50;
781 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
783 r_ptr->r_flags3 |= RF3_HURT_COLD;
786 else if (mult < 25) mult = 25;
790 /* Lightning Eagle (Elec) */
791 if (mode == HISSATSU_ELEC)
793 /* Notice immunity */
794 if (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK)
796 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
798 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
802 /* Otherwise, take the damage */
803 else if (have_flag(flgs, TR_BRAND_ELEC))
805 if (mult < 70) mult = 70;
809 if (mult < 50) mult = 50;
813 /* Bloody Maelstrom */
814 if ((mode == HISSATSU_SEKIRYUKA) && attacker_ptr->cut && monster_living(m_ptr->r_idx))
816 MULTIPLY tmp = MIN(100, MAX(10, attacker_ptr->cut / 10));
817 if (mult < tmp) mult = tmp;
821 if (mode == HISSATSU_UNDEAD)
823 if (r_ptr->flags3 & RF3_UNDEAD)
825 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
827 r_ptr->r_flags3 |= RF3_UNDEAD;
829 if (mult == 10) mult = 70;
830 else if (mult < 140) mult = MIN(140, mult + 60);
832 if (mult == 10) mult = 40;
833 else if (mult < 60) mult = MIN(60, mult + 30);
836 if (mult > 150) mult = 150;
842 * @brief ダメージにスレイ要素を加える総合処理ルーチン /
843 * Extract the "total damage" from a given object hitting a given monster.
844 * @param o_ptr 使用武器オブジェクトの構造体参照ポインタ
845 * @param tdam 現在算出途中のダメージ値
846 * @param m_ptr 目標モンスターの構造体参照ポインタ
848 * @param thrown 投擲処理ならばTRUEを指定する
849 * @return 総合的なスレイを加味したダメージ値
851 * Note that "flasks of oil" do NOT do fire damage, although they\n
852 * certainly could be made to do so. XXX XXX\n
854 * Note that most brands and slays are x3, except Slay Animal (x2),\n
855 * Slay Evil (x2), and Kill dragon (x5).\n
857 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)
859 BIT_FLAGS flgs[TR_FLAG_SIZE];
860 object_flags(o_ptr, flgs);
861 torch_flags(o_ptr, flgs); /* torches has secret flags */
865 if (attacker_ptr->special_attack & (ATTACK_ACID)) add_flag(flgs, TR_BRAND_ACID);
866 if (attacker_ptr->special_attack & (ATTACK_COLD)) add_flag(flgs, TR_BRAND_COLD);
867 if (attacker_ptr->special_attack & (ATTACK_ELEC)) add_flag(flgs, TR_BRAND_ELEC);
868 if (attacker_ptr->special_attack & (ATTACK_FIRE)) add_flag(flgs, TR_BRAND_FIRE);
869 if (attacker_ptr->special_attack & (ATTACK_POIS)) add_flag(flgs, TR_BRAND_POIS);
872 if (hex_spelling(attacker_ptr, HEX_RUNESWORD)) add_flag(flgs, TR_SLAY_GOOD);
886 mult = mult_slaying(attacker_ptr, mult, flgs, m_ptr);
888 mult = mult_brand(attacker_ptr, mult, flgs, m_ptr);
890 if (attacker_ptr->pclass == CLASS_SAMURAI)
892 mult = mult_hissatsu(attacker_ptr, mult, flgs, m_ptr, mode);
895 if ((attacker_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs, TR_FORCE_WEAPON)) && (attacker_ptr->csp > (o_ptr->dd * o_ptr->ds / 5)))
897 attacker_ptr->csp -= (1 + (o_ptr->dd * o_ptr->ds / 5));
898 attacker_ptr->redraw |= (PR_MANA);
899 mult = mult * 3 / 2 + 20;
902 if ((o_ptr->name1 == ART_NOTHUNG) && (m_ptr->r_idx == MON_FAFNER))
908 if (mult > 150) mult = 150;
909 return (tdam * mult / 10);
913 * @brief プレイヤーからモンスターへの打撃クリティカル判定 /
914 * Critical hits (by player) Factor in weapon weight, total plusses, player melee bonus
915 * @param weight 矢弾の重量
916 * @param plus 武器の命中修正
917 * @param dam 現在算出中のダメージ値
918 * @param meichuu 打撃の基本命中力
919 * @param mode オプションフラグ
920 * @return クリティカル修正が入ったダメージ値
922 HIT_POINT critical_norm(player_type *attacker_ptr, WEIGHT weight, int plus, HIT_POINT dam, s16b meichuu, BIT_FLAGS mode)
924 /* Extract "blow" power */
925 int i = (weight + (meichuu * 3 + plus * 5) + attacker_ptr->skill_thn);
928 bool is_special_option = randint1((attacker_ptr->pclass == CLASS_NINJA) ? 4444 : 5000) <= i;
929 is_special_option |= mode == HISSATSU_MAJIN;
930 is_special_option |= mode == HISSATSU_3DAN;
931 if (!is_special_option) return dam;
933 int k = weight + randint1(650);
934 if ((mode == HISSATSU_MAJIN) || (mode == HISSATSU_3DAN)) k += randint1(650);
938 msg_print(_("手ごたえがあった!", "It was a good hit!"));
946 msg_print(_("かなりの手ごたえがあった!", "It was a great hit!"));
953 msg_print(_("会心の一撃だ!", "It was a superb hit!"));
960 msg_print(_("最高の会心の一撃だ!", "It was a *GREAT* hit!"));
965 msg_print(_("比類なき最高の会心の一撃だ!", "It was a *SUPERB* hit!"));
966 dam = ((7 * dam) / 2) + 25;
971 * @brief モンスター打撃のクリティカルランクを返す /
972 * Critical blow. All hits that do 95% of total possible damage,
973 * @param dice モンスター打撃のダイス数
974 * @param sides モンスター打撃の最大ダイス目
975 * @param dam プレイヤーに与えたダメージ
977 * and which also do at least 20 damage, or, sometimes, N damage.
978 * This is used only to determine "cuts" and "stuns".
980 static int monster_critical(DICE_NUMBER dice, DICE_SID sides, HIT_POINT dam)
982 /* Must do at least 95% of perfect */
983 int total = dice * sides;
984 if (dam < total * 19 / 20) return 0;
986 /* Weak blows rarely work */
987 if ((dam < 20) && (randint0(100) >= dam)) return 0;
991 if ((dam >= total) && (dam >= 40)) max++;
996 while (randint0(100) < 2) max++;
999 /* Critical damage */
1000 if (dam > 45) return (6 + max);
1001 if (dam > 33) return (5 + max);
1002 if (dam > 25) return (4 + max);
1003 if (dam > 18) return (3 + max);
1004 if (dam > 11) return (2 + max);
1010 * @brief モンスター打撃の命中を判定する /
1011 * Determine if a monster attack against the player succeeds.
1012 * @param power 打撃属性毎の基本命中値
1013 * @param level モンスターのレベル
1014 * @param stun モンスターの朦朧値
1015 * @return TRUEならば命中判定
1017 * Always miss 5% of the time, Always hit 5% of the time.
1018 * Otherwise, match monster power against player armor.
1020 static int check_hit(player_type *target_ptr, int power, DEPTH level, int stun)
1022 int k = randint0(100);
1023 if (stun && one_in_(2)) return FALSE;
1024 if (k < 10) return (k < 5);
1025 int i = (power + (level * 3));
1027 int ac = target_ptr->ac + target_ptr->to_a;
1028 if (target_ptr->special_attack & ATTACK_SUIKEN) ac += (target_ptr->lev * 2);
1030 if ((i > 0) && (randint1(i) > ((ac * 3) / 4))) return TRUE;
1035 * @brief モンスターから敵モンスターへの命中判定
1036 * @param power 打撃属性による基本命中値
1037 * @param level 攻撃側モンスターのレベル
1038 * @param ac 目標モンスターのAC
1039 * @param stun 攻撃側モンスターが朦朧状態ならTRUEを返す
1040 * @return 命中ならばTRUEを返す
1042 static int check_hit2(int power, DEPTH level, ARMOUR_CLASS ac, int stun)
1044 int k = randint0(100);
1045 if (stun && one_in_(2)) return FALSE;
1046 if (k < 10) return (k < 5);
1047 int i = (power + (level * 3));
1049 if ((i > 0) && (randint1(i) > ((ac * 3) / 4))) return TRUE;
1053 /*! モンスターの侮辱行為メッセージテーブル / Hack -- possible "insult" messages */
1054 static concptr desc_insult[] =
1065 "があなたをパラサイト呼ばわりした!",
1069 "insults your mother!",
1070 "gives you the finger!",
1073 "dances around you!",
1074 "makes obscene gestures!",
1076 "calls you a parasite!",
1077 "calls you a cyborg!"
1082 /*! マゴットのぼやきメッセージテーブル / Hack -- possible "insult" messages */
1083 static concptr desc_moan[] =
1087 "が彼の飼い犬を見なかったかと尋ねている。",
1088 "が縄張りから出て行けと言っている。",
1091 "seems sad about something.",
1092 "asks if you have seen his dogs.",
1093 "tells you to get off his land.",
1094 "mumbles something about mushrooms."
1101 * @brief 敵オーラによるプレイヤーのダメージ処理(補助)
1102 * @param m_ptr オーラを持つモンスターの構造体参照ポインタ
1103 * @param immune ダメージを回避できる免疫フラグ
1104 * @param flags_offset オーラフラグ配列の参照オフセット
1105 * @param r_flags_offset モンスターの耐性配列の参照オフセット
1106 * @param aura_flag オーラフラグ配列
1107 * @param dam_func ダメージ処理を行う関数の参照ポインタ
1108 * @param message オーラダメージを受けた際のメッセージ
1111 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,
1112 HIT_POINT(*dam_func)(player_type *creature_type, HIT_POINT dam, concptr kb_str, int monspell, bool aura), concptr message)
1114 monster_race *r_ptr = &r_info[m_ptr->r_idx];
1115 if (!(atoffset(BIT_FLAGS, r_ptr, flags_offset) & aura_flag) || immune) return;
1117 GAME_TEXT mon_name[MAX_NLEN];
1118 int aura_damage = damroll(1 + (r_ptr->level / 26), 1 + (r_ptr->level / 17));
1120 monster_desc(touched_ptr, mon_name, m_ptr, MD_WRONGDOER_NAME);
1122 dam_func(touched_ptr, aura_damage, mon_name, -1, TRUE);
1124 if (is_original_ap_and_seen(touched_ptr, m_ptr))
1126 atoffset(BIT_FLAGS, r_ptr, r_flags_offset) |= aura_flag;
1129 handle_stuff(touched_ptr);
1134 * @brief 敵オーラによるプレイヤーのダメージ処理(メイン)
1135 * @param m_ptr オーラを持つモンスターの構造体参照ポインタ
1136 * @param touched_ptr オーラを持つ相手に振れたクリーチャーの参照ポインタ
1139 static void touch_zap_player(monster_type *m_ptr, player_type *touched_ptr)
1141 touch_zap_player_aux(m_ptr, touched_ptr, touched_ptr->immune_fire, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_FIRE,
1142 fire_dam, _("突然とても熱くなった!", "You are suddenly very hot!"));
1143 touch_zap_player_aux(m_ptr, touched_ptr, touched_ptr->immune_cold, offsetof(monster_race, flags3), offsetof(monster_race, r_flags3), RF3_AURA_COLD,
1144 cold_dam, _("突然とても寒くなった!", "You are suddenly very cold!"));
1145 touch_zap_player_aux(m_ptr, touched_ptr, touched_ptr->immune_elec, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_ELEC,
1146 elec_dam, _("電撃をくらった!", "You get zapped!"));
1151 * @brief プレイヤーの変異要素による打撃処理
1152 * @param attacker_ptr プレーヤーへの参照ポインタ
1153 * @param m_idx 攻撃目標となったモンスターの参照ID
1154 * @param attack 変異要素による攻撃要素の種類
1155 * @param fear 攻撃を受けたモンスターが恐慌状態に陥ったかを返す参照ポインタ
1156 * @param mdeath 攻撃を受けたモンスターが死亡したかを返す参照ポインタ
1159 static void natural_attack(player_type *attacker_ptr, MONSTER_IDX m_idx, int attack, bool *fear, bool *mdeath)
1161 WEIGHT n_weight = 0;
1162 monster_type *m_ptr = &attacker_ptr->current_floor_ptr->m_list[m_idx];
1163 monster_race *r_ptr = &r_info[m_ptr->r_idx];
1165 int dice_num, dice_side;
1169 case MUT2_SCOR_TAIL:
1173 atk_desc = _("尻尾", "tail");
1180 atk_desc = _("角", "horns");
1187 atk_desc = _("クチバシ", "beak");
1194 atk_desc = _("象の鼻", "trunk");
1197 case MUT2_TENTACLES:
1201 atk_desc = _("触手", "tentacles");
1205 dice_num = dice_side = n_weight = 1;
1206 atk_desc = _("未定義の部位", "undefined body part");
1210 GAME_TEXT m_name[MAX_NLEN];
1211 monster_desc(attacker_ptr, m_name, m_ptr, 0);
1213 /* Calculate the "attack quality" */
1214 int bonus = attacker_ptr->to_h_m + (attacker_ptr->lev * 6 / 5);
1215 int chance = (attacker_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
1217 bool is_hit = ((r_ptr->flags2 & RF2_QUANTUM) == 0) || !randint0(2);
1218 is_hit &= test_hit_norm(attacker_ptr, chance, r_ptr->ac, m_ptr->ml);
1222 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
1227 msg_format(_("%sを%sで攻撃した。", "You hit %s with your %s."), m_name, atk_desc);
1229 HIT_POINT k = damroll(dice_num, dice_side);
1230 k = critical_norm(attacker_ptr, n_weight, bonus, k, (s16b)bonus, 0);
1232 /* Apply the player damage bonuses */
1233 k += attacker_ptr->to_d_m;
1235 /* No negative damage */
1238 /* Modify the damage */
1239 k = mon_damage_mod(attacker_ptr, m_ptr, k, FALSE);
1241 /* Complex message */
1242 msg_format_wizard(CHEAT_MONSTER,
1243 _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"),
1244 k, m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
1246 /* Anger the monster */
1247 if (k > 0) anger_monster(attacker_ptr, m_ptr);
1249 /* Damage, check for fear and mdeath */
1252 case MUT2_SCOR_TAIL:
1253 project(attacker_ptr, 0, 0, m_ptr->fy, m_ptr->fx, k, GF_POIS, PROJECT_KILL, -1);
1254 *mdeath = (m_ptr->r_idx == 0);
1257 *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
1260 *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
1263 *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
1265 case MUT2_TENTACLES:
1266 *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
1269 *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
1272 touch_zap_player(m_ptr, attacker_ptr);
1276 * @brief プレイヤーの打撃処理サブルーチン /
1277 * Player attacks a (poor, defenseless) creature -RAK-
1280 * @param fear 攻撃を受けたモンスターが恐慌状態に陥ったかを返す参照ポインタ
1281 * @param mdeath 攻撃を受けたモンスターが死亡したかを返す参照ポインタ
1282 * @param hand 攻撃を行うための武器を持つ手
1283 * @param mode 発動中の剣術ID
1286 * If no "weapon" is available, then "punch" the monster one time.
1288 static void py_attack_aux(player_type *attacker_ptr, POSITION y, POSITION x, bool *fear, bool *mdeath, s16b hand, COMBAT_OPTION_IDX mode)
1290 int num = 0, bonus, chance, vir;
1293 floor_type *floor_ptr = attacker_ptr->current_floor_ptr;
1294 grid_type *g_ptr = &floor_ptr->grid_array[y][x];
1296 monster_type *m_ptr = &floor_ptr->m_list[g_ptr->m_idx];
1297 monster_race *r_ptr = &r_info[m_ptr->r_idx];
1299 /* Access the weapon */
1300 object_type *o_ptr = &attacker_ptr->inventory_list[INVEN_RARM + hand];
1302 GAME_TEXT m_name[MAX_NLEN];
1304 bool success_hit = FALSE;
1305 bool backstab = FALSE;
1306 bool vorpal_cut = FALSE;
1307 int chaos_effect = 0;
1308 bool stab_fleeing = FALSE;
1309 bool fuiuchi = FALSE;
1310 bool monk_attack = FALSE;
1311 bool do_quake = FALSE;
1313 bool drain_msg = TRUE;
1314 int drain_result = 0, drain_heal = 0;
1315 bool can_drain = FALSE;
1317 int drain_left = MAX_VAMPIRIC_DRAIN;
1318 BIT_FLAGS flgs[TR_FLAG_SIZE]; /* A massive hack -- life-draining weapons */
1319 bool is_human = (r_ptr->d_char == 'p');
1320 bool is_lowlevel = (r_ptr->level < (attacker_ptr->lev - 15));
1321 bool zantetsu_mukou, e_j_mukou;
1323 switch (attacker_ptr->pclass)
1327 if (has_melee_weapon(attacker_ptr, INVEN_RARM + hand) && !attacker_ptr->icky_wield[hand])
1329 int tmp = attacker_ptr->lev * 6 + (attacker_ptr->skill_stl + 10) * 4;
1330 if (attacker_ptr->monlite && (mode != HISSATSU_NYUSIN)) tmp /= 3;
1331 if (attacker_ptr->cursed & TRC_AGGRAVATE) tmp /= 2;
1332 if (r_ptr->level > (attacker_ptr->lev * attacker_ptr->lev / 20 + 10)) tmp /= 3;
1333 if (MON_CSLEEP(m_ptr) && m_ptr->ml)
1335 /* Can't backstab creatures that we can't see, right? */
1338 else if ((attacker_ptr->special_defense & NINJA_S_STEALTH) && (randint0(tmp) > (r_ptr->level + 20)) && m_ptr->ml && !(r_ptr->flagsr & RFR_RES_ALL))
1342 else if (MON_MONFEAR(m_ptr) && m_ptr->ml)
1344 stab_fleeing = TRUE;
1351 case CLASS_FORCETRAINER:
1352 case CLASS_BERSERKER:
1353 if ((empty_hands(attacker_ptr, TRUE) & EMPTY_HAND_RARM) && !attacker_ptr->riding) monk_attack = TRUE;
1357 if (!o_ptr->k_idx) /* Empty hand */
1359 if ((r_ptr->level + 10) > attacker_ptr->lev)
1361 if (attacker_ptr->skill_exp[GINOU_SUDE] < s_info[attacker_ptr->pclass].s_max[GINOU_SUDE])
1363 if (attacker_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_BEGINNER)
1364 attacker_ptr->skill_exp[GINOU_SUDE] += 40;
1365 else if ((attacker_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_SKILLED))
1366 attacker_ptr->skill_exp[GINOU_SUDE] += 5;
1367 else if ((attacker_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_EXPERT) && (attacker_ptr->lev > 19))
1368 attacker_ptr->skill_exp[GINOU_SUDE] += 1;
1369 else if ((attacker_ptr->lev > 34))
1370 if (one_in_(3)) attacker_ptr->skill_exp[GINOU_SUDE] += 1;
1371 attacker_ptr->update |= (PU_BONUS);
1375 else if (object_is_melee_weapon(o_ptr))
1377 if ((r_ptr->level + 10) > attacker_ptr->lev)
1379 OBJECT_TYPE_VALUE tval = attacker_ptr->inventory_list[INVEN_RARM + hand].tval - TV_WEAPON_BEGIN;
1380 OBJECT_SUBTYPE_VALUE sval = attacker_ptr->inventory_list[INVEN_RARM + hand].sval;
1381 int now_exp = attacker_ptr->weapon_exp[tval][sval];
1382 if (now_exp < s_info[attacker_ptr->pclass].w_max[tval][sval])
1385 if (now_exp < WEAPON_EXP_BEGINNER) amount = 80;
1386 else if (now_exp < WEAPON_EXP_SKILLED) amount = 10;
1387 else if ((now_exp < WEAPON_EXP_EXPERT) && (attacker_ptr->lev > 19)) amount = 1;
1388 else if ((attacker_ptr->lev > 34) && one_in_(2)) amount = 1;
1389 attacker_ptr->weapon_exp[tval][sval] += amount;
1390 attacker_ptr->update |= (PU_BONUS);
1395 /* Disturb the monster */
1396 (void)set_monster_csleep(attacker_ptr, g_ptr->m_idx, 0);
1398 monster_desc(attacker_ptr, m_name, m_ptr, 0);
1400 /* Calculate the "attack quality" */
1401 bonus = attacker_ptr->to_h[hand] + o_ptr->to_h;
1402 chance = (attacker_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
1403 if (mode == HISSATSU_IAI) chance += 60;
1404 if (attacker_ptr->special_defense & KATA_KOUKIJIN) chance += 150;
1405 if (attacker_ptr->sutemi) chance = MAX(chance * 3 / 2, chance + 60);
1407 vir = virtue_number(attacker_ptr, V_VALOUR);
1410 chance += (attacker_ptr->virtues[vir - 1] / 10);
1413 zantetsu_mukou = ((o_ptr->name1 == ART_ZANTETSU) && (r_ptr->d_char == 'j'));
1414 e_j_mukou = ((o_ptr->name1 == ART_EXCALIBUR_J) && (r_ptr->d_char == 'S'));
1416 if ((mode == HISSATSU_KYUSHO) || (mode == HISSATSU_MINEUCHI) || (mode == HISSATSU_3DAN) || (mode == HISSATSU_IAI)) num_blow = 1;
1417 else if (mode == HISSATSU_COLD) num_blow = attacker_ptr->num_blow[hand] + 2;
1418 else num_blow = attacker_ptr->num_blow[hand];
1420 /* Hack -- DOKUBARI always hit once */
1421 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) num_blow = 1;
1423 /* Attack once for each legal blow */
1424 while ((num++ < num_blow) && !attacker_ptr->is_dead)
1426 if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) || (mode == HISSATSU_KYUSHO))
1430 if (attacker_ptr->migite && attacker_ptr->hidarite)
1434 if (mode == HISSATSU_3DAN)
1439 success_hit = one_in_(n);
1441 else if ((attacker_ptr->pclass == CLASS_NINJA) && ((backstab || fuiuchi) && !(r_ptr->flagsr & RFR_RES_ALL))) success_hit = TRUE;
1442 else success_hit = test_hit_norm(attacker_ptr, chance, r_ptr->ac, m_ptr->ml);
1444 if (mode == HISSATSU_MAJIN)
1447 success_hit = FALSE;
1452 backstab = FALSE; /* Clumsy! */
1453 fuiuchi = FALSE; /* Clumsy! */
1455 if ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE) && one_in_(3))
1457 BIT_FLAGS flgs_aux[TR_FLAG_SIZE];
1461 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
1462 msg_print(_("振り回した大鎌が自分自身に返ってきた!", "Your scythe returns to you!"));
1463 object_flags(o_ptr, flgs_aux);
1465 k = damroll(o_ptr->dd + attacker_ptr->to_dd[hand], o_ptr->ds + attacker_ptr->to_ds[hand]);
1468 switch (attacker_ptr->mimic_form)
1471 switch (attacker_ptr->prace)
1478 case RACE_BARBARIAN:
1482 case RACE_HALF_TROLL:
1483 case RACE_HALF_OGRE:
1484 case RACE_HALF_GIANT:
1485 case RACE_HALF_TITAN:
1493 case RACE_DRACONIAN:
1500 case MIMIC_DEMON_LORD:
1507 if (attacker_ptr->align < 0 && mult < 20)
1509 if (!(attacker_ptr->resist_acid || is_oppose_acid(attacker_ptr) || attacker_ptr->immune_acid) && (mult < 25))
1511 if (!(attacker_ptr->resist_elec || is_oppose_elec(attacker_ptr) || attacker_ptr->immune_elec) && (mult < 25))
1513 if (!(attacker_ptr->resist_fire || is_oppose_fire(attacker_ptr) || attacker_ptr->immune_fire) && (mult < 25))
1515 if (!(attacker_ptr->resist_cold || is_oppose_cold(attacker_ptr) || attacker_ptr->immune_cold) && (mult < 25))
1517 if (!(attacker_ptr->resist_pois || is_oppose_pois(attacker_ptr)) && (mult < 25))
1520 if ((attacker_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs_aux, TR_FORCE_WEAPON)) && (attacker_ptr->csp > (attacker_ptr->msp / 30)))
1522 attacker_ptr->csp -= (1 + (attacker_ptr->msp / 30));
1523 attacker_ptr->redraw |= (PR_MANA);
1524 mult = mult * 3 / 2 + 20;
1526 k *= (HIT_POINT)mult;
1530 k = critical_norm(attacker_ptr, o_ptr->weight, o_ptr->to_h, k, attacker_ptr->to_h[hand], mode);
1534 msg_format(_("グッサリ切り裂かれた!", "Your weapon cuts deep into yourself!"));
1535 /* Try to increase the damage */
1541 k *= (HIT_POINT)mult;
1543 k += (attacker_ptr->to_d[hand] + o_ptr->to_d);
1546 take_hit(attacker_ptr, DAMAGE_FORCE, k, _("死の大鎌", "Death scythe"), -1);
1547 handle_stuff(attacker_ptr);
1552 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
1558 int vorpal_chance = ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD)) ? 2 : 4;
1562 if (backstab) msg_format(_("あなたは冷酷にも眠っている無力な%sを突き刺した!", "You cruelly stab the helpless, sleeping %s!"), m_name);
1563 else if (fuiuchi) msg_format(_("不意を突いて%sに強烈な一撃を喰らわせた!", "You make surprise attack, and hit %s with a powerful blow!"), m_name);
1564 else if (stab_fleeing) msg_format(_("逃げる%sを背中から突き刺した!", "You backstab the fleeing %s!"), m_name);
1565 else if (!monk_attack) msg_format(_("%sを攻撃した。", "You hit %s."), m_name);
1567 /* Hack -- bare hands do one damage */
1570 object_flags(o_ptr, flgs);
1572 /* Select a chaotic effect (50% chance) */
1573 if ((have_flag(flgs, TR_CHAOTIC)) && one_in_(2))
1576 chg_virtue(attacker_ptr, V_CHANCE, 1);
1578 if (randint1(5) < 3)
1580 /* Vampiric (20%) */
1583 else if (one_in_(250))
1588 else if (!one_in_(10))
1590 /* Confusion (26.892%) */
1593 else if (one_in_(2))
1595 /* Teleport away (1.494%) */
1600 /* Polymorph (1.494%) */
1605 /* Vampiric drain */
1606 if ((have_flag(flgs, TR_VAMPIRIC)) || (chaos_effect == 1) || (mode == HISSATSU_DRAIN) || hex_spelling(attacker_ptr, HEX_VAMP_BLADE))
1608 /* Only drain "living" monsters */
1609 if (monster_living(m_ptr->r_idx))
1615 if ((have_flag(flgs, TR_VORPAL) || hex_spelling(attacker_ptr, HEX_RUNESWORD)) && (randint1(vorpal_chance * 3 / 2) == 1) && !zantetsu_mukou)
1617 else vorpal_cut = FALSE;
1621 int special_effect = 0, stun_effect = 0, times = 0, max_times;
1623 const martial_arts *ma_ptr = &ma_blows[0], *old_ptr = &ma_blows[0];
1624 int resist_stun = 0;
1627 if (r_ptr->flags1 & RF1_UNIQUE) resist_stun += 88;
1628 if (r_ptr->flags3 & RF3_NO_STUN) resist_stun += 66;
1629 if (r_ptr->flags3 & RF3_NO_CONF) resist_stun += 33;
1630 if (r_ptr->flags3 & RF3_NO_SLEEP) resist_stun += 33;
1631 if ((r_ptr->flags3 & RF3_UNDEAD) || (r_ptr->flags3 & RF3_NONLIVING))
1634 if (attacker_ptr->special_defense & KAMAE_BYAKKO)
1635 max_times = (attacker_ptr->lev < 3 ? 1 : attacker_ptr->lev / 3);
1636 else if (attacker_ptr->special_defense & KAMAE_SUZAKU)
1638 else if (attacker_ptr->special_defense & KAMAE_GENBU)
1641 max_times = (attacker_ptr->lev < 7 ? 1 : attacker_ptr->lev / 7);
1642 /* Attempt 'times' */
1643 for (times = 0; times < max_times; times++)
1647 ma_ptr = &ma_blows[randint0(MAX_MA)];
1648 if ((attacker_ptr->pclass == CLASS_FORCETRAINER) && (ma_ptr->min_level > 1)) min_level = ma_ptr->min_level + 3;
1649 else min_level = ma_ptr->min_level;
1650 } while ((min_level > attacker_ptr->lev) ||
1651 (randint1(attacker_ptr->lev) < ma_ptr->chance));
1653 /* keep the highest level attack available we found */
1654 if ((ma_ptr->min_level > old_ptr->min_level) &&
1655 !attacker_ptr->stun && !attacker_ptr->confused)
1659 if (current_world_ptr->wizard && cheat_xtra)
1661 msg_print(_("攻撃を再選択しました。", "Attack re-selected."));
1670 if (attacker_ptr->pclass == CLASS_FORCETRAINER) min_level = MAX(1, ma_ptr->min_level - 3);
1671 else min_level = ma_ptr->min_level;
1672 k = damroll(ma_ptr->dd + attacker_ptr->to_dd[hand], ma_ptr->ds + attacker_ptr->to_ds[hand]);
1673 if (attacker_ptr->special_attack & ATTACK_SUIKEN) k *= 2;
1675 if (ma_ptr->effect == MA_KNEE)
1677 if (r_ptr->flags1 & RF1_MALE)
1679 msg_format(_("%sに金的膝蹴りをくらわした!", "You hit %s in the groin with your knee!"), m_name);
1681 special_effect = MA_KNEE;
1684 msg_format(ma_ptr->desc, m_name);
1687 else if (ma_ptr->effect == MA_SLOW)
1689 if (!((r_ptr->flags1 & RF1_NEVER_MOVE) ||
1690 my_strchr("~#{}.UjmeEv$,DdsbBFIJQSXclnw!=?", r_ptr->d_char)))
1692 msg_format(_("%sの足首に関節蹴りをくらわした!", "You kick %s in the ankle."), m_name);
1693 special_effect = MA_SLOW;
1695 else msg_format(ma_ptr->desc, m_name);
1701 stun_effect = (ma_ptr->effect / 2) + randint1(ma_ptr->effect / 2);
1704 msg_format(ma_ptr->desc, m_name);
1707 if (attacker_ptr->special_defense & KAMAE_SUZAKU) weight = 4;
1708 if ((attacker_ptr->pclass == CLASS_FORCETRAINER) && P_PTR_KI)
1710 weight += (P_PTR_KI / 30);
1711 if (weight > 20) weight = 20;
1714 k = critical_norm(attacker_ptr, attacker_ptr->lev * weight, min_level, k, attacker_ptr->to_h[0], 0);
1716 if ((special_effect == MA_KNEE) && ((k + attacker_ptr->to_d[hand]) < m_ptr->hp))
1718 msg_format(_("%^sは苦痛にうめいている!", "%^s moans in agony!"), m_name);
1719 stun_effect = 7 + randint1(13);
1723 else if ((special_effect == MA_SLOW) && ((k + attacker_ptr->to_d[hand]) < m_ptr->hp))
1725 if (!(r_ptr->flags1 & RF1_UNIQUE) &&
1726 (randint1(attacker_ptr->lev) > r_ptr->level) &&
1729 msg_format(_("%^sは足をひきずり始めた。", "%^s starts limping slower."), m_name);
1730 m_ptr->mspeed -= 10;
1734 if (stun_effect && ((k + attacker_ptr->to_d[hand]) < m_ptr->hp))
1736 if (attacker_ptr->lev > randint1(r_ptr->level + resist_stun + 10))
1738 if (set_monster_stunned(attacker_ptr, g_ptr->m_idx, stun_effect + MON_STUNNED(m_ptr)))
1740 msg_format(_("%^sはフラフラになった。", "%^s is stunned."), m_name);
1744 msg_format(_("%^sはさらにフラフラになった。", "%^s is more stunned."), m_name);
1750 /* Handle normal weapon */
1751 else if (o_ptr->k_idx)
1753 k = damroll(o_ptr->dd + attacker_ptr->to_dd[hand], o_ptr->ds + attacker_ptr->to_ds[hand]);
1754 k = tot_dam_aux(attacker_ptr, o_ptr, k, m_ptr, mode, FALSE);
1758 k *= (3 + (attacker_ptr->lev / 20));
1762 k = k * (5 + (attacker_ptr->lev * 2 / 25)) / 2;
1764 else if (stab_fleeing)
1769 if ((attacker_ptr->impact[hand] && ((k > 50) || one_in_(7))) ||
1770 (chaos_effect == 2) || (mode == HISSATSU_QUAKE))
1775 if ((!(o_ptr->tval == TV_SWORD) || !(o_ptr->sval == SV_POISON_NEEDLE)) && !(mode == HISSATSU_KYUSHO))
1776 k = critical_norm(attacker_ptr, o_ptr->weight, o_ptr->to_h, k, attacker_ptr->to_h[hand], mode);
1784 if ((o_ptr->name1 == ART_CHAINSWORD) && !one_in_(2))
1786 char chainsword_noise[1024];
1787 if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, chainsword_noise))
1789 msg_print(chainsword_noise);
1793 if (o_ptr->name1 == ART_VORPAL_BLADE)
1795 msg_print(_("目にも止まらぬヴォーパルブレード、手錬の早業!", "Your Vorpal Blade goes snicker-snack!"));
1799 msg_format(_("%sをグッサリ切り裂いた!", "Your weapon cuts deep into %s!"), m_name);
1802 /* Try to increase the damage */
1803 while (one_in_(vorpal_chance))
1808 k *= (HIT_POINT)mult;
1811 if (((r_ptr->flagsr & RFR_RES_ALL) ? k / 100 : k) > m_ptr->hp)
1813 msg_format(_("%sを真っ二つにした!", "You cut %s in half!"), m_name);
1819 case 2: msg_format(_("%sを斬った!", "You gouge %s!"), m_name); break;
1820 case 3: msg_format(_("%sをぶった斬った!", "You maim %s!"), m_name); break;
1821 case 4: msg_format(_("%sをメッタ斬りにした!", "You carve %s!"), m_name); break;
1822 case 5: msg_format(_("%sをメッタメタに斬った!", "You cleave %s!"), m_name); break;
1823 case 6: msg_format(_("%sを刺身にした!", "You smite %s!"), m_name); break;
1824 case 7: msg_format(_("%sを斬って斬って斬りまくった!", "You eviscerate %s!"), m_name); break;
1825 default: msg_format(_("%sを細切れにした!", "You shred %s!"), m_name); break;
1828 drain_result = drain_result * 3 / 2;
1832 drain_result += o_ptr->to_d;
1835 /* Apply the player damage bonuses */
1836 k += attacker_ptr->to_d[hand];
1837 drain_result += attacker_ptr->to_d[hand];
1839 if ((mode == HISSATSU_SUTEMI) || (mode == HISSATSU_3DAN)) k *= 2;
1840 if ((mode == HISSATSU_SEKIRYUKA) && !monster_living(m_ptr->r_idx)) k = 0;
1841 if ((mode == HISSATSU_SEKIRYUKA) && !attacker_ptr->cut) k /= 2;
1843 /* No negative damage */
1846 if ((mode == HISSATSU_ZANMA) && !(!monster_living(m_ptr->r_idx) && (r_ptr->flags3 & RF3_EVIL)))
1853 msg_print(_("こんな軟らかいものは切れん!", "You cannot cut such a elastic thing!"));
1859 msg_print(_("蜘蛛は苦手だ!", "Spiders are difficult for you to deal with!"));
1863 if (mode == HISSATSU_MINEUCHI)
1865 int tmp = (10 + randint1(15) + attacker_ptr->lev / 5);
1868 anger_monster(attacker_ptr, m_ptr);
1870 if (!(r_ptr->flags3 & (RF3_NO_STUN)))
1873 if (MON_STUNNED(m_ptr))
1875 msg_format(_("%sはひどくもうろうとした。", "%s is more dazed."), m_name);
1880 msg_format(_("%s はもうろうとした。", "%s is dazed."), m_name);
1884 (void)set_monster_stunned(attacker_ptr, g_ptr->m_idx, MON_STUNNED(m_ptr) + tmp);
1888 msg_format(_("%s には効果がなかった。", "%s is not effected."), m_name);
1892 /* Modify the damage */
1893 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))));
1894 if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) || (mode == HISSATSU_KYUSHO))
1896 if ((randint1(randint1(r_ptr->level / 7) + 5) == 1) && !(r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags7 & RF7_UNIQUE2))
1899 msg_format(_("%sの急所を突き刺した!", "You hit %s on a fatal spot!"), m_name);
1903 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)))
1905 int maxhp = maxroll(r_ptr->hdice, r_ptr->hside);
1906 if (one_in_(backstab ? 13 : (stab_fleeing || fuiuchi) ? 15 : 27))
1910 msg_format(_("刃が%sに深々と突き刺さった!", "You critically injured %s!"), m_name);
1912 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)))
1914 if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_UNIQUE2) || (m_ptr->hp >= maxhp / 2))
1916 k = MAX(k * 5, m_ptr->hp / 2);
1918 msg_format(_("%sに致命傷を負わせた!", "You fatally injured %s!"), m_name);
1923 msg_format(_("刃が%sの急所を貫いた!", "You hit %s on a fatal spot!"), m_name);
1928 msg_format_wizard(CHEAT_MONSTER,
1929 _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"), k,
1930 m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
1932 if (k <= 0) can_drain = FALSE;
1934 if (drain_result > m_ptr->hp)
1935 drain_result = m_ptr->hp;
1937 /* Damage, check for fear and death */
1938 if (mon_take_hit(attacker_ptr, g_ptr->m_idx, k, fear, NULL))
1941 if ((attacker_ptr->pclass == CLASS_BERSERKER) && attacker_ptr->energy_use)
1943 if (attacker_ptr->migite && attacker_ptr->hidarite)
1945 if (hand) attacker_ptr->energy_use = attacker_ptr->energy_use * 3 / 5 + attacker_ptr->energy_use*num * 2 / (attacker_ptr->num_blow[hand] * 5);
1946 else attacker_ptr->energy_use = attacker_ptr->energy_use*num * 3 / (attacker_ptr->num_blow[hand] * 5);
1950 attacker_ptr->energy_use = attacker_ptr->energy_use*num / attacker_ptr->num_blow[hand];
1953 if ((o_ptr->name1 == ART_ZANTETSU) && is_lowlevel)
1954 msg_print(_("またつまらぬものを斬ってしまった...", "Sigh... Another trifling thing I've cut...."));
1958 /* Anger the monster */
1959 if (k > 0) anger_monster(attacker_ptr, m_ptr);
1961 touch_zap_player(m_ptr, attacker_ptr);
1963 /* Are we draining it? A little note: If the monster is
1964 dead, the drain does not work... */
1966 if (can_drain && (drain_result > 0))
1968 if (o_ptr->name1 == ART_MURAMASA)
1972 HIT_PROB to_h = o_ptr->to_h;
1973 HIT_POINT to_d = o_ptr->to_d;
1977 for (i = 0; i < to_h + 3; i++) if (one_in_(4)) flag = 0;
1981 for (i = 0; i < to_d + 3; i++) if (one_in_(4)) flag = 0;
1984 if (o_ptr->to_h != to_h || o_ptr->to_d != to_d)
1986 msg_print(_("妖刀は血を吸って強くなった!", "Muramasa sucked blood, and became more powerful!"));
1994 if (drain_result > 5) /* Did we really hurt it? */
1996 drain_heal = damroll(2, drain_result / 6);
1998 if (hex_spelling(attacker_ptr, HEX_VAMP_BLADE)) drain_heal *= 2;
2002 msg_format(_("Draining left: %d", "Draining left: %d"), drain_left);
2007 if (drain_heal < drain_left)
2009 drain_left -= drain_heal;
2013 drain_heal = drain_left;
2019 msg_format(_("刃が%sから生命力を吸い取った!", "Your weapon drains life from %s!"), m_name);
2023 drain_heal = (drain_heal * attacker_ptr->mutant_regenerate_mod) / 100;
2025 hp_player(attacker_ptr, drain_heal);
2026 /* We get to keep some of it! */
2031 m_ptr->maxhp -= (k + 7) / 8;
2032 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
2033 if (m_ptr->maxhp < 1) m_ptr->maxhp = 1;
2040 /* Confusion attack */
2041 if ((attacker_ptr->special_attack & ATTACK_CONFUSE) || (chaos_effect == 3) || (mode == HISSATSU_CONF) || hex_spelling(attacker_ptr, HEX_CONFUSION))
2043 /* Cancel glowing hands */
2044 if (attacker_ptr->special_attack & ATTACK_CONFUSE)
2046 attacker_ptr->special_attack &= ~(ATTACK_CONFUSE);
2047 msg_print(_("手の輝きがなくなった。", "Your hands stop glowing."));
2048 attacker_ptr->redraw |= (PR_STATUS);
2052 /* Confuse the monster */
2053 if (r_ptr->flags3 & RF3_NO_CONF)
2055 if (is_original_ap_and_seen(attacker_ptr, m_ptr)) r_ptr->r_flags3 |= RF3_NO_CONF;
2056 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
2059 else if (randint0(100) < r_ptr->level)
2061 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
2065 msg_format(_("%^sは混乱したようだ。", "%^s appears confused."), m_name);
2066 (void)set_monster_confused(attacker_ptr, g_ptr->m_idx, MON_CONFUSED(m_ptr) + 10 + randint0(attacker_ptr->lev) / 5);
2070 else if (chaos_effect == 4)
2072 bool resists_tele = FALSE;
2074 if (r_ptr->flagsr & RFR_RES_TELE)
2076 if (r_ptr->flags1 & RF1_UNIQUE)
2078 if (is_original_ap_and_seen(attacker_ptr, m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
2079 msg_format(_("%^sには効果がなかった。", "%^s is unaffected!"), m_name);
2080 resists_tele = TRUE;
2082 else if (r_ptr->level > randint1(100))
2084 if (is_original_ap_and_seen(attacker_ptr, m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
2085 msg_format(_("%^sは抵抗力を持っている!", "%^s resists!"), m_name);
2086 resists_tele = TRUE;
2092 msg_format(_("%^sは消えた!", "%^s disappears!"), m_name);
2093 teleport_away(attacker_ptr, g_ptr->m_idx, 50, TELEPORT_PASSIVE);
2094 num = num_blow + 1; /* Can't hit it anymore! */
2099 else if ((chaos_effect == 5) && (randint1(90) > r_ptr->level))
2101 if (!(r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) &&
2102 !(r_ptr->flagsr & RFR_EFF_RES_CHAO_MASK))
2104 if (polymorph_monster(attacker_ptr, y, x))
2106 msg_format(_("%^sは変化した!", "%^s changes!"), m_name);
2112 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
2115 /* Hack -- Get new monster */
2116 m_ptr = &floor_ptr->m_list[g_ptr->m_idx];
2118 /* Oops, we need a different name... */
2119 monster_desc(attacker_ptr, m_name, m_ptr, 0);
2121 /* Hack -- Get new race */
2122 r_ptr = &r_info[m_ptr->r_idx];
2125 else if (o_ptr->name1 == ART_G_HAMMER)
2127 monster_type *target_ptr = &floor_ptr->m_list[g_ptr->m_idx];
2129 if (target_ptr->hold_o_idx)
2131 object_type *q_ptr = &floor_ptr->o_list[target_ptr->hold_o_idx];
2132 GAME_TEXT o_name[MAX_NLEN];
2134 object_desc(attacker_ptr, o_name, q_ptr, OD_NAME_ONLY);
2135 q_ptr->held_m_idx = 0;
2136 q_ptr->marked = OM_TOUCHED;
2137 target_ptr->hold_o_idx = q_ptr->next_o_idx;
2138 q_ptr->next_o_idx = 0;
2139 msg_format(_("%sを奪った。", "You snatched %s."), o_name);
2140 inven_carry(attacker_ptr, q_ptr);
2148 if (weak && !(*mdeath))
2150 msg_format(_("%sは弱くなったようだ。", "%^s seems weakened."), m_name);
2153 if ((drain_left != MAX_VAMPIRIC_DRAIN) && one_in_(4))
2155 chg_virtue(attacker_ptr, V_UNLIFE, 1);
2159 k -- apply earthquake brand */
2162 earthquake(attacker_ptr, attacker_ptr->y, attacker_ptr->x, 10, 0);
2163 if (!floor_ptr->grid_array[y][x].m_idx) *mdeath = TRUE;
2169 * @brief プレイヤーの打撃処理メインルーチン
2172 * @param mode 発動中の剣術ID
2173 * @return 実際に攻撃処理が行われた場合TRUEを返す。
2175 * If no "weapon" is available, then "punch" the monster one time.
2177 bool py_attack(player_type *attacker_ptr, POSITION y, POSITION x, COMBAT_OPTION_IDX mode)
2179 grid_type *g_ptr = &attacker_ptr->current_floor_ptr->grid_array[y][x];
2180 monster_type *m_ptr = &attacker_ptr->current_floor_ptr->m_list[g_ptr->m_idx];
2181 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2182 GAME_TEXT m_name[MAX_NLEN];
2184 disturb(attacker_ptr, FALSE, TRUE);
2186 take_turn(attacker_ptr, 100);
2188 if (!attacker_ptr->migite && !attacker_ptr->hidarite &&
2189 !(attacker_ptr->muta2 & (MUT2_HORNS | MUT2_BEAK | MUT2_SCOR_TAIL | MUT2_TRUNK | MUT2_TENTACLES)))
2191 msg_format(_("%s攻撃できない。", "You cannot do attacking."),
2192 (empty_hands(attacker_ptr, FALSE) == EMPTY_HAND_NONE) ? _("両手がふさがって", "") : "");
2196 monster_desc(attacker_ptr, m_name, m_ptr, 0);
2200 /* Auto-Recall if possible and visible */
2201 if (!attacker_ptr->image) monster_race_track(attacker_ptr, m_ptr->ap_r_idx);
2203 health_track(attacker_ptr, g_ptr->m_idx);
2206 if ((r_ptr->flags1 & RF1_FEMALE) &&
2207 !(attacker_ptr->stun || attacker_ptr->confused || attacker_ptr->image || !m_ptr->ml))
2209 if ((attacker_ptr->inventory_list[INVEN_RARM].name1 == ART_ZANTETSU) || (attacker_ptr->inventory_list[INVEN_LARM].name1 == ART_ZANTETSU))
2211 msg_print(_("拙者、おなごは斬れぬ!", "I can not attack women!"));
2216 if (d_info[attacker_ptr->dungeon_idx].flags1 & DF1_NO_MELEE)
2218 msg_print(_("なぜか攻撃することができない。", "Something prevents you from attacking."));
2222 /* Stop if friendly */
2223 bool stormbringer = FALSE;
2224 if (!is_hostile(m_ptr) &&
2225 !(attacker_ptr->stun || attacker_ptr->confused || attacker_ptr->image ||
2226 attacker_ptr->shero || !m_ptr->ml))
2228 if (attacker_ptr->inventory_list[INVEN_RARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
2229 if (attacker_ptr->inventory_list[INVEN_LARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
2232 msg_format(_("黒い刃は強欲に%sを攻撃した!", "Your black blade greedily attacks %s!"), m_name);
2233 chg_virtue(attacker_ptr, V_INDIVIDUALISM, 1);
2234 chg_virtue(attacker_ptr, V_HONOUR, -1);
2235 chg_virtue(attacker_ptr, V_JUSTICE, -1);
2236 chg_virtue(attacker_ptr, V_COMPASSION, -1);
2238 else if (attacker_ptr->pclass != CLASS_BERSERKER)
2240 if (get_check(_("本当に攻撃しますか?", "Really hit it? ")))
2242 chg_virtue(attacker_ptr, V_INDIVIDUALISM, 1);
2243 chg_virtue(attacker_ptr, V_HONOUR, -1);
2244 chg_virtue(attacker_ptr, V_JUSTICE, -1);
2245 chg_virtue(attacker_ptr, V_COMPASSION, -1);
2249 msg_format(_("%sを攻撃するのを止めた。", "You stop to avoid hitting %s."), m_name);
2255 /* Handle player fear */
2256 if (attacker_ptr->afraid)
2259 msg_format(_("恐くて%sを攻撃できない!", "You are too afraid to attack %s!"), m_name);
2261 msg_format(_("そっちには何か恐いものがいる!", "There is something scary in your way!"));
2263 /* Disturb the monster */
2264 (void)set_monster_csleep(attacker_ptr, g_ptr->m_idx, 0);
2269 if (MON_CSLEEP(m_ptr)) /* It is not honorable etc to attack helpless victims */
2271 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(attacker_ptr, V_COMPASSION, -1);
2272 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(attacker_ptr, V_HONOUR, -1);
2275 if (attacker_ptr->migite && attacker_ptr->hidarite)
2277 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))
2279 if (attacker_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_BEGINNER)
2280 attacker_ptr->skill_exp[GINOU_NITOURYU] += 80;
2281 else if (attacker_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_SKILLED)
2282 attacker_ptr->skill_exp[GINOU_NITOURYU] += 4;
2283 else if (attacker_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_EXPERT)
2284 attacker_ptr->skill_exp[GINOU_NITOURYU] += 1;
2285 else if (attacker_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_MASTER)
2286 if (one_in_(3)) attacker_ptr->skill_exp[GINOU_NITOURYU] += 1;
2287 attacker_ptr->update |= (PU_BONUS);
2291 /* Gain riding experience */
2292 if (attacker_ptr->riding)
2294 int cur = attacker_ptr->skill_exp[GINOU_RIDING];
2295 int max = s_info[attacker_ptr->pclass].s_max[GINOU_RIDING];
2299 DEPTH ridinglevel = r_info[attacker_ptr->current_floor_ptr->m_list[attacker_ptr->riding].r_idx].level;
2300 DEPTH targetlevel = r_ptr->level;
2303 if ((cur / 200 - 5) < targetlevel)
2306 /* Extra experience */
2307 if ((cur / 100) < ridinglevel)
2309 if ((cur / 100 + 15) < ridinglevel)
2310 inc += 1 + (ridinglevel - (cur / 100 + 15));
2315 attacker_ptr->skill_exp[GINOU_RIDING] = MIN(max, cur + inc);
2316 attacker_ptr->update |= (PU_BONUS);
2320 attacker_ptr->riding_t_m_idx = g_ptr->m_idx;
2322 bool mdeath = FALSE;
2323 if (attacker_ptr->migite) py_attack_aux(attacker_ptr, y, x, &fear, &mdeath, 0, mode);
2324 if (attacker_ptr->hidarite && !mdeath) py_attack_aux(attacker_ptr, y, x, &fear, &mdeath, 1, mode);
2326 /* Mutations which yield extra 'natural' attacks */
2329 if ((attacker_ptr->muta2 & MUT2_HORNS) && !mdeath)
2330 natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_HORNS, &fear, &mdeath);
2331 if ((attacker_ptr->muta2 & MUT2_BEAK) && !mdeath)
2332 natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_BEAK, &fear, &mdeath);
2333 if ((attacker_ptr->muta2 & MUT2_SCOR_TAIL) && !mdeath)
2334 natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_SCOR_TAIL, &fear, &mdeath);
2335 if ((attacker_ptr->muta2 & MUT2_TRUNK) && !mdeath)
2336 natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_TRUNK, &fear, &mdeath);
2337 if ((attacker_ptr->muta2 & MUT2_TENTACLES) && !mdeath)
2338 natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_TENTACLES, &fear, &mdeath);
2341 /* Hack -- delay fear messages */
2342 if (fear && m_ptr->ml && !mdeath)
2346 msg_format(_("%^sは恐怖して逃げ出した!", "%^s flees in terror!"), m_name);
2349 if ((attacker_ptr->special_defense & KATA_IAI) && ((mode != HISSATSU_IAI) || mdeath))
2351 set_action(attacker_ptr, ACTION_NONE);
2359 * @brief モンスターからプレイヤーへの打撃処理 / Attack the player via physical attacks.
2360 * @param m_idx 打撃を行うモンスターのID
2361 * @return 実際に攻撃処理を行った場合TRUEを返す
2363 bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
2365 floor_type *floor_ptr = target_ptr->current_floor_ptr;
2366 monster_type *m_ptr = &floor_ptr->m_list[m_idx];
2367 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2372 int do_cut, do_stun;
2376 GAME_TEXT o_name[MAX_NLEN];
2377 GAME_TEXT m_name[MAX_NLEN];
2378 GAME_TEXT ddesc[80];
2381 bool touched = FALSE, fear = FALSE, alive = TRUE;
2382 bool explode = FALSE;
2383 bool do_silly_attack = (one_in_(2) && target_ptr->image);
2384 HIT_POINT get_damage = 0;
2385 int abbreviate = 0; // 2回目以降の省略表現フラグ
2387 /* Not allowed to attack */
2388 if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return FALSE;
2390 if (d_info[target_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) return FALSE;
2392 /* ...nor if friendly */
2393 if (!is_hostile(m_ptr)) return FALSE;
2395 /* Extract the effective monster level */
2396 rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
2398 /* Get the monster name (or "it") */
2399 monster_desc(target_ptr, m_name, m_ptr, 0);
2401 monster_desc(target_ptr, ddesc, m_ptr, MD_WRONGDOER_NAME);
2403 if (target_ptr->special_defense & KATA_IAI)
2405 msg_format(_("相手が襲いかかる前に素早く武器を振るった。", "You took sen, drew and cut in one motion before %s moved."), m_name);
2406 if (py_attack(target_ptr, m_ptr->fy, m_ptr->fx, HISSATSU_IAI)) return TRUE;
2409 if ((target_ptr->special_defense & NINJA_KAWARIMI) && (randint0(55) < (target_ptr->lev*3/5+20)))
2411 if (kawarimi(target_ptr, TRUE)) return TRUE;
2414 /* Assume no blink */
2417 /* Scan through all four blows */
2418 for (int ap_cnt = 0; ap_cnt < 4; ap_cnt++)
2420 bool obvious = FALSE;
2422 HIT_POINT power = 0;
2423 HIT_POINT damage = 0;
2427 /* Extract the attack infomation */
2428 int effect = r_ptr->blow[ap_cnt].effect;
2429 int method = r_ptr->blow[ap_cnt].method;
2430 int d_dice = r_ptr->blow[ap_cnt].d_dice;
2431 int d_side = r_ptr->blow[ap_cnt].d_side;
2433 if (!monster_is_valid(m_ptr)) break;
2435 /* Hack -- no more attacks */
2438 if (is_pet(m_ptr) && (r_ptr->flags1 & RF1_UNIQUE) && (method == RBM_EXPLODE))
2444 /* Stop if player is dead or gone */
2445 if (!target_ptr->playing || target_ptr->is_dead) break;
2446 if (distance(target_ptr->y, target_ptr->x, m_ptr->fy, m_ptr->fx) > 1) break;
2448 /* Handle "leaving" */
2449 if (target_ptr->leaving) break;
2451 if (method == RBM_SHOOT) continue;
2453 /* Extract the attack "power" */
2454 power = mbe_info[effect].power;
2457 ac = target_ptr->ac + target_ptr->to_a;
2459 /* Monster hits player */
2460 if (!effect || check_hit(target_ptr, power, rlev, MON_STUNNED(m_ptr)))
2462 /* Always disturbing */
2463 disturb(target_ptr, TRUE, TRUE);
2466 /* Hack -- Apply "protection from evil" */
2467 if ((target_ptr->protevil > 0) &&
2468 (r_ptr->flags3 & RF3_EVIL) &&
2469 (target_ptr->lev >= rlev) &&
2470 ((randint0(100) + target_ptr->lev) > 50))
2472 /* Remember the Evil-ness */
2473 if (is_original_ap_and_seen(target_ptr, m_ptr)) r_ptr->r_flags3 |= RF3_EVIL;
2476 if (abbreviate) msg_format("撃退した。");
2477 else msg_format("%^sは撃退された。", m_name);
2478 abbreviate = 1; /*2回目以降は省略 */
2480 msg_format("%^s is repelled.", m_name);
2486 /* Assume no cut or stun */
2487 do_cut = do_stun = 0;
2489 /* Describe the attack method */
2494 act = _("殴られた。", "hits you.");
2495 do_cut = do_stun = 1;
2503 act = _("触られた。", "touches you.");
2511 act = _("パンチされた。", "punches you.");
2520 act = _("蹴られた。", "kicks you.");
2529 act = _("ひっかかれた。", "claws you.");
2538 act = _("噛まれた。", "bites you.");
2547 act = _("刺された。", "stings you.");
2555 act = _("斬られた。", "slashes you.");
2564 act = _("角で突かれた。", "butts you.");
2573 act = _("体当たりされた。", "crushes you.");
2582 act = _("飲み込まれた。", "engulfs you.");
2591 act = _("は請求書をよこした。", "charges you.");
2593 sound(SOUND_BUY); /* Note! This is "charges", not "charges at". */
2600 act = _("が体の上を這い回った。", "crawls on you.");
2608 act = _("よだれをたらされた。", "drools on you.");
2615 act = _("唾を吐かれた。", "spits on you.");
2623 act = _("は爆発した。", "explodes.");
2630 act = _("にらまれた。", "gazes at you.");
2636 act = _("泣き叫ばれた。", "wails at you.");
2643 act = _("胞子を飛ばされた。", "releases spores at you.");
2651 act = _("が XXX4 を発射した。", "projects XXX4's at you.");
2657 act = _("金をせがまれた。", "begs you for money.");
2667 act = desc_insult[randint0(m_ptr->r_idx == MON_DEBBY ? 10 : 8)];
2677 act = desc_moan[randint0(4)];
2687 if (m_ptr->r_idx == MON_JAIAN)
2690 switch(randint1(15))
2695 act = "「♪お~れはジャイアン~~ガ~キだいしょう~」";
2698 act = "「♪て~んかむ~てきのお~とこだぜ~~」";
2701 act = "「♪の~び太スネ夫はメじゃないよ~~」";
2704 act = "「♪け~んかスポ~ツ~どんとこい~」";
2707 act = "「♪うた~も~~う~まいぜ~まかしとけ~」";
2710 act = "「♪ま~ちいちば~んのに~んきもの~~」";
2713 act = "「♪べんきょうしゅくだいメじゃないよ~~」";
2716 act = "「♪きはやさし~くて~ち~からもち~」";
2719 act = "「♪かお~も~~スタイルも~バツグンさ~」";
2722 act = "「♪がっこうい~ちの~あ~ばれんぼう~~」";
2725 act = "「♪ド~ラもドラミもメじゃないよ~~」";
2728 act = "「♪よじげんぽけっと~な~くたって~」";
2731 act = "「♪あし~の~~ながさ~は~まけないぜ~」";
2735 act = "horribly sings 'I AM GIAAAAAN. THE BOOOSS OF THE KIIIIDS.'";
2741 act = _("は♪僕らは楽しい家族♪と歌っている。", "sings 'We are a happy family.'");
2743 act = _("は♪アイ ラブ ユー、ユー ラブ ミー♪と歌っている。", "sings 'I love you, you love me.'");
2753 if (do_silly_attack)
2758 act = silly_attacks[randint0(MAX_SILLY_ATTACK)];
2761 if (abbreviate == 0)
2762 msg_format("%^sに%s", m_name, act);
2763 else if (abbreviate == 1)
2764 msg_format("%s", act);
2765 else /* if (abbreviate == -1) */
2766 msg_format("%^s%s", m_name, act);
2767 abbreviate = 1;/*2回目以降は省略 */
2769 msg_format("%^s %s%s", m_name, act, do_silly_attack ? " you." : "");
2773 /* Hack -- assume all attacks are obvious */
2776 /* Roll out the damage */
2777 damage = damroll(d_dice, d_side);
2780 * Skip the effect when exploding, since the explosion
2781 * already causes the effect.
2783 if(explode) damage = 0;
2784 /* Apply appropriate damage */
2794 case RBE_SUPERHURT: /* AC軽減あり / Player armor reduces total damage */
2796 if (((randint1(rlev*2+300) > (ac+200)) || one_in_(13)) && !CHECK_MULTISHADOW(target_ptr))
2798 int tmp_damage = damage - (damage * ((ac < 150) ? ac : 150) / 250);
2799 msg_print(_("痛恨の一撃!", "It was a critical hit!"));
2800 tmp_damage = MAX(damage, tmp_damage*2);
2802 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, tmp_damage, ddesc, -1);
2807 case RBE_HURT: /* AC軽減あり / Player armor reduces total damage */
2810 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
2811 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2819 /* Take "poison" effect */
2820 if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr)) && !CHECK_MULTISHADOW(target_ptr))
2822 if (set_poisoned(target_ptr, target_ptr->poisoned + randint1(rlev) + 5))
2828 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2830 /* Learn about the player */
2831 update_smart_learn(target_ptr, m_idx, DRS_POIS);
2840 /* Allow complete resist */
2841 if (!target_ptr->resist_disen && !CHECK_MULTISHADOW(target_ptr))
2843 /* Apply disenchantment */
2844 if (apply_disenchant(target_ptr, 0))
2846 /* Hack -- Update AC */
2847 update_creature(target_ptr);
2852 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2854 /* Learn about the player */
2855 update_smart_learn(target_ptr, m_idx, DRS_DISEN);
2862 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2864 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
2867 for (k = 0; k < 10; k++)
2870 INVENTORY_IDX i = (INVENTORY_IDX)randint0(INVEN_PACK);
2872 /* Obtain the item */
2873 o_ptr = &target_ptr->inventory_list[i];
2874 if (!o_ptr->k_idx) continue;
2876 /* Drain charged wands/staffs */
2877 if (((o_ptr->tval == TV_STAFF) ||
2878 (o_ptr->tval == TV_WAND)) &&
2881 /* Calculate healed hitpoints */
2882 int heal=rlev * o_ptr->pval;
2883 if( o_ptr->tval == TV_STAFF)
2884 heal *= o_ptr->number;
2886 /* Don't heal more than max hp */
2887 heal = MIN(heal, m_ptr->maxhp - m_ptr->hp);
2889 msg_print(_("ザックからエネルギーが吸い取られた!", "Energy drains from your pack!"));
2893 /* Heal the monster */
2894 m_ptr->hp += (HIT_POINT)heal;
2896 /* Redraw (later) if needed */
2897 if (target_ptr->health_who == m_idx) target_ptr->redraw |= (PR_HEALTH);
2898 if (target_ptr->riding == m_idx) target_ptr->redraw |= (PR_UHEALTH);
2903 /* Combine / Reorder the pack */
2904 target_ptr->update |= (PU_COMBINE | PU_REORDER);
2905 target_ptr->window |= (PW_INVEN);
2916 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2918 /* Confused monsters cannot steal successfully. -LM-*/
2919 if (MON_CONFUSED(m_ptr)) break;
2921 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
2925 /* Saving throw (unless paralyzed) based on dex and level */
2926 if (!target_ptr->paralyzed &&
2927 (randint0(100) < (adj_dex_safe[target_ptr->stat_ind[A_DEX]] +
2930 /* Saving throw message */
2931 msg_print(_("しかし素早く財布を守った!", "You quickly protect your money pouch!"));
2933 /* Occasional blink anyway */
2934 if (randint0(3)) blinked = TRUE;
2940 gold = (target_ptr->au / 10) + randint1(25);
2941 if (gold < 2) gold = 2;
2942 if (gold > 5000) gold = (target_ptr->au / 20) + randint1(3000);
2943 if (gold > target_ptr->au) gold = target_ptr->au;
2944 target_ptr->au -= gold;
2947 msg_print(_("しかし何も盗まれなかった。", "Nothing was stolen."));
2949 else if (target_ptr->au)
2951 msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2952 msg_format(_("$%ld のお金が盗まれた!", "%ld coins were stolen!"), (long)gold);
2953 chg_virtue(target_ptr, V_SACRIFICE, 1);
2957 msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2958 msg_print(_("お金が全部盗まれた!", "All of your coins were stolen!"));
2959 chg_virtue(target_ptr, V_SACRIFICE, 2);
2963 target_ptr->redraw |= (PR_GOLD);
2965 target_ptr->window |= (PW_PLAYER);
2976 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2978 /* Confused monsters cannot steal successfully. -LM-*/
2979 if (MON_CONFUSED(m_ptr)) break;
2981 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
2983 /* Saving throw (unless paralyzed) based on dex and level */
2984 if (!target_ptr->paralyzed && (randint0(100) < (adj_dex_safe[target_ptr->stat_ind[A_DEX]] + target_ptr->lev)))
2986 /* Saving throw message */
2987 msg_print(_("しかしあわててザックを取り返した!", "You grab hold of your backpack!"));
2989 /* Occasional "blink" anyway */
2996 for (k = 0; k < 10; k++)
3001 INVENTORY_IDX i = (INVENTORY_IDX)randint0(INVEN_PACK);
3003 /* Obtain the item */
3004 o_ptr = &target_ptr->inventory_list[i];
3005 if (!o_ptr->k_idx) continue;
3007 /* Skip artifacts */
3008 if (object_is_artifact(o_ptr)) continue;
3010 object_desc(target_ptr, o_name, o_ptr, OD_OMIT_PREFIX);
3013 msg_format("%s(%c)を%s盗まれた!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
3015 msg_format("%sour %s (%c) was stolen!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
3017 chg_virtue(target_ptr, V_SACRIFICE, 1);
3018 o_idx = o_pop(floor_ptr);
3024 j_ptr = &floor_ptr->o_list[o_idx];
3025 object_copy(j_ptr, o_ptr);
3030 /* Hack -- If a rod or wand, allocate total
3031 * maximum timeouts or charges between those
3032 * stolen and those missed. -LM-
3034 if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
3036 j_ptr->pval = o_ptr->pval / o_ptr->number;
3037 o_ptr->pval -= j_ptr->pval;
3041 j_ptr->marked = OM_TOUCHED;
3043 /* Memorize monster */
3044 j_ptr->held_m_idx = m_idx;
3047 j_ptr->next_o_idx = m_ptr->hold_o_idx;
3050 m_ptr->hold_o_idx = o_idx;
3053 /* Steal the items */
3054 inven_item_increase(target_ptr, i, -1);
3055 inven_item_optimize(target_ptr, i);
3070 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3072 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3074 /* Steal some food */
3075 for (k = 0; k < 10; k++)
3077 /* Pick an item from the pack */
3078 INVENTORY_IDX i = (INVENTORY_IDX)randint0(INVEN_PACK);
3080 o_ptr = &target_ptr->inventory_list[i];
3081 if (!o_ptr->k_idx) continue;
3083 /* Skip non-food objects */
3084 if ((o_ptr->tval != TV_FOOD) && !((o_ptr->tval == TV_CORPSE) && (o_ptr->sval))) continue;
3086 object_desc(target_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
3089 msg_format("%s(%c)を%s食べられてしまった!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
3091 msg_format("%sour %s (%c) was eaten!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
3094 /* Steal the items */
3095 inven_item_increase(target_ptr, i, -1);
3096 inven_item_optimize(target_ptr, i);
3108 /* Access the lite */
3109 o_ptr = &target_ptr->inventory_list[INVEN_LITE];
3110 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3112 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3115 if ((o_ptr->xtra4 > 0) && (!object_is_fixed_artifact(o_ptr)))
3118 o_ptr->xtra4 -= (s16b)(250 + randint1(250));
3119 if (o_ptr->xtra4 < 1) o_ptr->xtra4 = 1;
3121 if (!target_ptr->blind)
3123 msg_print(_("明かりが暗くなってしまった。", "Your light dims."));
3127 target_ptr->window |= (PW_EQUIP);
3137 msg_print(_("酸を浴びせられた!", "You are covered in acid!"));
3138 get_damage += acid_dam(target_ptr, damage, ddesc, -1, FALSE);
3139 update_creature(target_ptr);
3140 update_smart_learn(target_ptr, m_idx, DRS_ACID);
3148 msg_print(_("電撃を浴びせられた!", "You are struck by electricity!"));
3149 get_damage += elec_dam(target_ptr, damage, ddesc, -1, FALSE);
3150 update_smart_learn(target_ptr, m_idx, DRS_ELEC);
3158 msg_print(_("全身が炎に包まれた!", "You are enveloped in flames!"));
3159 get_damage += fire_dam(target_ptr, damage, ddesc, -1, FALSE);
3160 update_smart_learn(target_ptr, m_idx, DRS_FIRE);
3168 msg_print(_("全身が冷気で覆われた!", "You are covered with frost!"));
3169 get_damage += cold_dam(target_ptr, damage, ddesc, -1, FALSE);
3170 update_smart_learn(target_ptr, m_idx, DRS_COLD);
3176 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3177 if (target_ptr->is_dead) break;
3179 /* Increase "blind" */
3180 if (!target_ptr->resist_blind && !CHECK_MULTISHADOW(target_ptr))
3182 if (set_blind(target_ptr, target_ptr->blind + 10 + randint1(rlev)))
3185 if (m_ptr->r_idx == MON_DIO) msg_print("どうだッ!この血の目潰しはッ!");
3193 /* Learn about the player */
3194 update_smart_learn(target_ptr, m_idx, DRS_BLIND);
3202 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3204 if (target_ptr->is_dead) break;
3206 /* Increase "confused" */
3207 if (!target_ptr->resist_conf && !CHECK_MULTISHADOW(target_ptr))
3209 if (set_confused(target_ptr, target_ptr->confused + 3 + randint1(rlev)))
3215 /* Learn about the player */
3216 update_smart_learn(target_ptr, m_idx, DRS_CONF);
3223 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3225 if (target_ptr->is_dead) break;
3227 /* Increase "afraid" */
3228 if (CHECK_MULTISHADOW(target_ptr))
3232 else if (target_ptr->resist_fear)
3234 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
3237 else if (randint0(100 + r_ptr->level/2) < target_ptr->skill_sav)
3239 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
3244 if (set_afraid(target_ptr, target_ptr->afraid + 3 + randint1(rlev)))
3250 /* Learn about the player */
3251 update_smart_learn(target_ptr, m_idx, DRS_FEAR);
3258 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3260 if (target_ptr->is_dead) break;
3262 /* Increase "paralyzed" */
3263 if (CHECK_MULTISHADOW(target_ptr))
3267 else if (target_ptr->free_act)
3269 msg_print(_("しかし効果がなかった!", "You are unaffected!"));
3272 else if (randint0(100 + r_ptr->level/2) < target_ptr->skill_sav)
3274 msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
3279 if (!target_ptr->paralyzed)
3281 if (set_paralyzed(target_ptr, 3 + randint1(rlev)))
3288 /* Learn about the player */
3289 update_smart_learn(target_ptr, m_idx, DRS_FREE);
3296 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3298 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3299 if (do_dec_stat(target_ptr, A_STR)) obvious = TRUE;
3306 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3308 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3309 if (do_dec_stat(target_ptr, A_INT)) obvious = TRUE;
3316 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3318 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3319 if (do_dec_stat(target_ptr, A_WIS)) obvious = TRUE;
3326 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3328 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3329 if (do_dec_stat(target_ptr, A_DEX)) obvious = TRUE;
3336 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3338 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3339 if (do_dec_stat(target_ptr, A_CON)) obvious = TRUE;
3346 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3348 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3349 if (do_dec_stat(target_ptr, A_CHR)) obvious = TRUE;
3356 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3358 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3360 /* Damage (stats) */
3361 if (do_dec_stat(target_ptr, A_STR)) obvious = TRUE;
3362 if (do_dec_stat(target_ptr, A_DEX)) obvious = TRUE;
3363 if (do_dec_stat(target_ptr, A_CON)) obvious = TRUE;
3364 if (do_dec_stat(target_ptr, A_INT)) obvious = TRUE;
3365 if (do_dec_stat(target_ptr, A_WIS)) obvious = TRUE;
3366 if (do_dec_stat(target_ptr, A_CHR)) obvious = TRUE;
3375 /* Hack -- Reduce damage based on the player armor class */
3376 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
3378 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3380 /* Radius 8 earthquake centered at the monster */
3381 if (damage > 23 || explode)
3383 earthquake(target_ptr, m_ptr->fy, m_ptr->fx, 8, m_idx);
3391 s32b d = damroll(10, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3395 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3397 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3399 (void)drain_exp(target_ptr, d, d / 10, 95);
3405 s32b d = damroll(20, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3409 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3411 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3413 (void)drain_exp(target_ptr, d, d / 10, 90);
3419 s32b d = damroll(40, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3423 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3425 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3427 (void)drain_exp(target_ptr, d, d / 10, 75);
3433 s32b d = damroll(80, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3437 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3439 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3441 (void)drain_exp(target_ptr, d, d / 10, 50);
3447 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3449 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3451 /* Take "poison" effect */
3452 if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr)))
3454 if (set_poisoned(target_ptr, target_ptr->poisoned + randint1(rlev) + 5))
3460 /* Damage CON (10% chance)*/
3461 if ((randint1(100) < 11) && (target_ptr->prace != RACE_ANDROID))
3463 /* 1% chance for perm. damage */
3464 bool perm = one_in_(10);
3465 if (dec_stat(target_ptr, A_CON, randint1(10), perm))
3467 msg_print(_("病があなたを蝕んでいる気がする。", "You feel sickly."));
3477 if (!target_ptr->resist_time && !CHECK_MULTISHADOW(target_ptr))
3479 switch (randint1(10))
3481 case 1: case 2: case 3: case 4: case 5:
3483 if (target_ptr->prace == RACE_ANDROID) break;
3484 msg_print(_("人生が逆戻りした気がする。", "You feel like a chunk of the past has been ripped away."));
3485 lose_exp(target_ptr, 100 + (target_ptr->exp / 100) * MON_DRAIN_LIFE);
3489 case 6: case 7: case 8: case 9:
3491 int stat = randint0(6);
3496 case A_STR: act = "強く"; break;
3497 case A_INT: act = "聡明で"; break;
3498 case A_WIS: act = "賢明で"; break;
3499 case A_DEX: act = "器用で"; break;
3500 case A_CON: act = "健康で"; break;
3501 case A_CHR: act = "美しく"; break;
3503 case A_STR: act = "strong"; break;
3504 case A_INT: act = "bright"; break;
3505 case A_WIS: act = "wise"; break;
3506 case A_DEX: act = "agile"; break;
3507 case A_CON: act = "hale"; break;
3508 case A_CHR: act = "beautiful"; break;
3513 msg_format(_("あなたは以前ほど%sなくなってしまった...。", "You're not as %s as you used to be..."), act);
3514 target_ptr->stat_cur[stat] = (target_ptr->stat_cur[stat] * 3) / 4;
3515 if (target_ptr->stat_cur[stat] < 3) target_ptr->stat_cur[stat] = 3;
3516 target_ptr->update |= (PU_BONUS);
3522 msg_print(_("あなたは以前ほど力強くなくなってしまった...。", "You're not as powerful as you used to be..."));
3524 for (k = 0; k < A_MAX; k++)
3526 target_ptr->stat_cur[k] = (target_ptr->stat_cur[k] * 7) / 8;
3527 if (target_ptr->stat_cur[k] < 3) target_ptr->stat_cur[k] = 3;
3529 target_ptr->update |= (PU_BONUS);
3534 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3540 s32b d = damroll(60, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3545 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3547 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3549 resist_drain = !drain_exp(target_ptr, d, d / 10, 50);
3551 /* Heal the attacker? */
3552 if (target_ptr->mimic_form)
3554 if (mimic_info[target_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
3555 resist_drain = TRUE;
3559 switch (target_ptr->prace)
3568 resist_drain = TRUE;
3573 if ((damage > 5) && !resist_drain)
3575 bool did_heal = FALSE;
3577 if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
3580 m_ptr->hp += damroll(4, damage / 6);
3581 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
3583 /* Redraw (later) if needed */
3584 if (target_ptr->health_who == m_idx) target_ptr->redraw |= (PR_HEALTH);
3585 if (target_ptr->riding == m_idx) target_ptr->redraw |= (PR_UHEALTH);
3587 /* Special message */
3588 if (m_ptr->ml && did_heal)
3590 msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), m_name);
3600 if (CHECK_MULTISHADOW(target_ptr))
3602 msg_print(_("攻撃は幻影に命中し、あなたには届かなかった。", "The attack hits Shadow, but you are unharmed!"));
3608 target_ptr->csp -= damage;
3609 if (target_ptr->csp < 0)
3611 target_ptr->csp = 0;
3612 target_ptr->csp_frac = 0;
3615 target_ptr->redraw |= (PR_MANA);
3618 /* Learn about the player */
3619 update_smart_learn(target_ptr, m_idx, DRS_MANA);
3625 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3627 if (target_ptr->is_dead) break;
3629 /* Decrease speed */
3630 if (CHECK_MULTISHADOW(target_ptr))
3636 if (set_slow(target_ptr, (target_ptr->slow + 4 + randint0(rlev / 10)), FALSE))
3646 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3648 if (target_ptr->is_dead) break;
3650 /* Decrease speed */
3651 if (target_ptr->resist_sound || CHECK_MULTISHADOW(target_ptr))
3657 if (set_stun(target_ptr, target_ptr->stun + 10 + randint1(r_ptr->level / 4)))
3667 /* Hack -- only one of cut or stun */
3668 if (do_cut && do_stun)
3671 if (randint0(100) < 50)
3688 /* Critical hit (zero if non-critical) */
3689 tmp = monster_critical(d_dice, d_side, damage);
3691 /* Roll for damage */
3694 case 0: cut_plus = 0; break;
3695 case 1: cut_plus = randint1(5); break;
3696 case 2: cut_plus = randint1(5) + 5; break;
3697 case 3: cut_plus = randint1(20) + 20; break;
3698 case 4: cut_plus = randint1(50) + 50; break;
3699 case 5: cut_plus = randint1(100) + 100; break;
3700 case 6: cut_plus = 300; break;
3701 default: cut_plus = 500; break;
3705 if (cut_plus) (void)set_cut(target_ptr,target_ptr->cut + cut_plus);
3713 /* Critical hit (zero if non-critical) */
3714 tmp = monster_critical(d_dice, d_side, damage);
3716 /* Roll for damage */
3719 case 0: stun_plus = 0; break;
3720 case 1: stun_plus = randint1(5); break;
3721 case 2: stun_plus = randint1(5) + 10; break;
3722 case 3: stun_plus = randint1(10) + 20; break;
3723 case 4: stun_plus = randint1(15) + 30; break;
3724 case 5: stun_plus = randint1(20) + 40; break;
3725 case 6: stun_plus = 80; break;
3726 default: stun_plus = 150; break;
3729 /* Apply the stun */
3730 if (stun_plus) (void)set_stun(target_ptr, target_ptr->stun + stun_plus);
3735 sound(SOUND_EXPLODE);
3737 if (mon_take_hit(target_ptr, m_idx, m_ptr->hp + 1, &fear, NULL))
3746 if (target_ptr->sh_fire && alive && !target_ptr->is_dead)
3748 if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK))
3750 HIT_POINT dam = damroll(2, 6);
3752 /* Modify the damage */
3753 dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
3755 msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), m_name);
3757 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は灰の山になった。", " turns into a pile of ash.")))
3765 if (is_original_ap_and_seen(target_ptr, m_ptr))
3766 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
3770 if (target_ptr->sh_elec && alive && !target_ptr->is_dead)
3772 if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK))
3774 HIT_POINT dam = damroll(2, 6);
3776 /* Modify the damage */
3777 dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
3779 msg_format(_("%^sは電撃をくらった!", "%^s gets zapped!"), m_name);
3780 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は燃え殻の山になった。", " turns into a pile of cinder.")))
3788 if (is_original_ap_and_seen(target_ptr, m_ptr))
3789 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
3793 if (target_ptr->sh_cold && alive && !target_ptr->is_dead)
3795 if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK))
3797 HIT_POINT dam = damroll(2, 6);
3799 /* Modify the damage */
3800 dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
3802 msg_format(_("%^sは冷気をくらった!", "%^s is very cold!"), m_name);
3803 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は凍りついた。", " was frozen.")))
3811 if (is_original_ap_and_seen(target_ptr, m_ptr))
3812 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
3817 if (target_ptr->dustrobe && alive && !target_ptr->is_dead)
3819 if (!(r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK))
3821 HIT_POINT dam = damroll(2, 6);
3823 /* Modify the damage */
3824 dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
3826 msg_format(_("%^sは鏡の破片をくらった!", "%^s gets zapped!"), m_name);
3827 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("はズタズタになった。", " had torn to pieces.")))
3835 if (is_original_ap_and_seen(target_ptr, m_ptr))
3836 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK);
3839 if (is_mirror_grid(&floor_ptr->grid_array[target_ptr->y][target_ptr->x]))
3841 teleport_player(target_ptr, 10, TELEPORT_SPONTANEOUS);
3845 if (target_ptr->tim_sh_holy && alive && !target_ptr->is_dead)
3847 if (r_ptr->flags3 & RF3_EVIL)
3849 if (!(r_ptr->flagsr & RFR_RES_ALL))
3851 HIT_POINT dam = damroll(2, 6);
3853 /* Modify the damage */
3854 dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
3856 msg_format(_("%^sは聖なるオーラで傷ついた!", "%^s is injured by holy power!"), m_name);
3857 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3862 if (is_original_ap_and_seen(target_ptr, m_ptr))
3863 r_ptr->r_flags3 |= RF3_EVIL;
3867 if (is_original_ap_and_seen(target_ptr, m_ptr))
3868 r_ptr->r_flagsr |= RFR_RES_ALL;
3873 if (target_ptr->tim_sh_touki && alive && !target_ptr->is_dead)
3875 if (!(r_ptr->flagsr & RFR_RES_ALL))
3877 HIT_POINT dam = damroll(2, 6);
3879 /* Modify the damage */
3880 dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
3882 msg_format(_("%^sが鋭い闘気のオーラで傷ついた!", "%^s is injured by the Force"), m_name);
3883 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3891 if (is_original_ap_and_seen(target_ptr, m_ptr))
3892 r_ptr->r_flagsr |= RFR_RES_ALL;
3896 if (hex_spelling(target_ptr, HEX_SHADOW_CLOAK) && alive && !target_ptr->is_dead)
3899 object_type *o_armed_ptr = &target_ptr->inventory_list[INVEN_RARM];
3901 if (!(r_ptr->flagsr & RFR_RES_ALL || r_ptr->flagsr & RFR_RES_DARK))
3903 if (o_armed_ptr->k_idx)
3905 int basedam = ((o_armed_ptr->dd + target_ptr->to_dd[0]) * (o_armed_ptr->ds + target_ptr->to_ds[0] + 1));
3906 dam = basedam / 2 + o_armed_ptr->to_d + target_ptr->to_d[0];
3909 /* Cursed armor makes damages doubled */
3910 o_armed_ptr = &target_ptr->inventory_list[INVEN_BODY];
3911 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr)) dam *= 2;
3913 /* Modify the damage */
3914 dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
3916 msg_format(_("影のオーラが%^sに反撃した!", "Enveloping shadows attack %^s."), m_name);
3917 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3922 else /* monster does not dead */
3925 BIT_FLAGS flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
3926 EFFECT_ID typ[4][2] = {
3927 { INVEN_HEAD, GF_OLD_CONF },
3928 { INVEN_LARM, GF_OLD_SLEEP },
3929 { INVEN_HANDS, GF_TURN_ALL },
3930 { INVEN_FEET, GF_OLD_SLOW }
3933 /* Some cursed armours gives an extra effect */
3934 for (j = 0; j < 4; j++)
3936 o_armed_ptr = &target_ptr->inventory_list[typ[j][0]];
3937 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr) && object_is_armour(o_armed_ptr))
3938 project(target_ptr, 0, 0, m_ptr->fy, m_ptr->fx, (target_ptr->lev * 2), typ[j][1], flg, -1);
3944 if (is_original_ap_and_seen(target_ptr, m_ptr))
3945 r_ptr->r_flagsr |= (RFR_RES_ALL | RFR_RES_DARK);
3951 /* Monster missed player */
3954 /* Analyze failed attacks */
3970 /* Visible monsters */
3973 disturb(target_ptr, TRUE, TRUE);
3977 msg_format("%sかわした。", (target_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "");
3979 msg_format("%s%^sの攻撃をかわした。", (target_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "", m_name);
3980 abbreviate = 1;/*2回目以降は省略 */
3982 msg_format("%^s misses you.", m_name);
3987 /* Gain shield experience */
3988 if (object_is_armour(&target_ptr->inventory_list[INVEN_RARM]) || object_is_armour(&target_ptr->inventory_list[INVEN_LARM]))
3990 int cur = target_ptr->skill_exp[GINOU_SHIELD];
3991 int max = s_info[target_ptr->pclass].s_max[GINOU_SHIELD];
3995 DEPTH targetlevel = r_ptr->level;
3999 /* Extra experience */
4000 if ((cur / 100) < targetlevel)
4002 if ((cur / 100 + 15) < targetlevel)
4003 inc += 1 + (targetlevel - (cur / 100 + 15));
4008 target_ptr->skill_exp[GINOU_SHIELD] = MIN(max, cur + inc);
4009 target_ptr->update |= (PU_BONUS);
4019 /* Analyze "visible" monsters only */
4020 if (is_original_ap_and_seen(target_ptr, m_ptr) && !do_silly_attack)
4022 /* Count "obvious" attacks (and ones that cause damage) */
4023 if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
4025 /* Count attacks of this type */
4026 if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
4028 r_ptr->r_blows[ap_cnt]++;
4033 if (target_ptr->riding && damage)
4035 char m_steed_name[MAX_NLEN];
4036 monster_desc(target_ptr, m_steed_name, &floor_ptr->m_list[target_ptr->riding], 0);
4037 if (rakuba(target_ptr, (damage > 200) ? 200 : damage, FALSE))
4039 msg_format(_("%^sから落ちてしまった!", "You have fallen from %s."), m_steed_name);
4043 if (target_ptr->special_defense & NINJA_KAWARIMI)
4045 if (kawarimi(target_ptr, FALSE)) return TRUE;
4049 /* Hex - revenge damage stored */
4050 revenge_store(target_ptr, get_damage);
4052 if ((target_ptr->tim_eyeeye || hex_spelling(target_ptr, HEX_EYE_FOR_EYE))
4053 && get_damage > 0 && !target_ptr->is_dead)
4056 msg_format("攻撃が%s自身を傷つけた!", m_name);
4058 GAME_TEXT m_name_self[80];
4061 monster_desc(target_ptr, m_name_self, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE);
4063 msg_format("The attack of %s has wounded %s!", m_name, m_name_self);
4065 project(target_ptr, 0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL, -1);
4066 if (target_ptr->tim_eyeeye) set_tim_eyeeye(target_ptr, target_ptr->tim_eyeeye-5, TRUE);
4069 if ((target_ptr->counter || (target_ptr->special_defense & KATA_MUSOU)) && alive && !target_ptr->is_dead && m_ptr->ml && (target_ptr->csp > 7))
4071 char m_target_name[MAX_NLEN];
4072 monster_desc(target_ptr, m_target_name, m_ptr, 0);
4074 target_ptr->csp -= 7;
4075 msg_format(_("%^sに反撃した!", "You counterattacked %s!"), m_target_name);
4076 py_attack(target_ptr, m_ptr->fy, m_ptr->fx, HISSATSU_COUNTER);
4078 target_ptr->redraw |= (PR_MANA);
4082 if (blinked && alive && !target_ptr->is_dead)
4084 if (teleport_barrier(target_ptr, m_idx))
4086 msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But a magic barrier obstructs it."));
4090 msg_print(_("泥棒は笑って逃げた!", "The thief flees laughing!"));
4091 teleport_away(target_ptr, m_idx, MAX_SIGHT * 2 + 5, TELEPORT_SPONTANEOUS);
4095 /* Always notice cause of death */
4096 if (target_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !floor_ptr->inside_arena)
4101 if (m_ptr->ml && fear && alive && !target_ptr->is_dead)
4104 msg_format(_("%^sは恐怖で逃げ出した!", "%^s flees in terror!"), m_name);
4107 if (target_ptr->special_defense & KATA_IAI)
4109 set_action(target_ptr, ACTION_NONE);
4117 * @brief モンスターから敵モンスターへの打撃攻撃処理
4118 * @param m_idx 攻撃側モンスターの参照ID
4119 * @param t_idx 目標側モンスターの参照ID
4120 * @return 実際に打撃処理が行われた場合TRUEを返す
4122 bool monst_attack_monst(player_type *subject_ptr, MONSTER_IDX m_idx, MONSTER_IDX t_idx)
4124 monster_type *m_ptr = &subject_ptr->current_floor_ptr->m_list[m_idx];
4125 monster_type *t_ptr = &subject_ptr->current_floor_ptr->m_list[t_idx];
4127 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4128 monster_race *tr_ptr = &r_info[t_ptr->r_idx];
4131 GAME_TEXT m_name[MAX_NLEN], t_name[MAX_NLEN];
4132 char temp[MAX_NLEN];
4133 bool explode = FALSE, touched = FALSE, fear = FALSE, dead = FALSE;
4134 POSITION y_saver = t_ptr->fy;
4135 POSITION x_saver = t_ptr->fx;
4138 bool see_m = is_seen(m_ptr);
4139 bool see_t = is_seen(t_ptr);
4140 bool see_either = see_m || see_t;
4142 /* Can the player be aware of this attack? */
4143 bool known = (m_ptr->cdis <= MAX_SIGHT) || (t_ptr->cdis <= MAX_SIGHT);
4144 bool do_silly_attack = (one_in_(2) && subject_ptr->image);
4146 if (m_idx == t_idx) return FALSE;
4147 if (r_ptr->flags1 & RF1_NEVER_BLOW) return FALSE;
4148 if (d_info[subject_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) return FALSE;
4151 ARMOUR_CLASS ac = tr_ptr->ac;
4153 /* Extract the effective monster level */
4154 DEPTH rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
4156 monster_desc(subject_ptr, m_name, m_ptr, 0);
4157 monster_desc(subject_ptr, t_name, t_ptr, 0);
4159 /* Assume no blink */
4160 bool blinked = FALSE;
4162 if (!see_either && known)
4164 subject_ptr->current_floor_ptr->monster_noise = TRUE;
4167 if (subject_ptr->riding && (m_idx == subject_ptr->riding)) disturb(subject_ptr, TRUE, TRUE);
4169 /* Scan through all four blows */
4170 for (ARMOUR_CLASS ap_cnt = 0; ap_cnt < 4; ap_cnt++)
4172 bool obvious = FALSE;
4174 HIT_POINT power = 0;
4175 HIT_POINT damage = 0;
4179 /* Extract the attack infomation */
4180 int effect = r_ptr->blow[ap_cnt].effect;
4181 int method = r_ptr->blow[ap_cnt].method;
4182 int d_dice = r_ptr->blow[ap_cnt].d_dice;
4183 int d_side = r_ptr->blow[ap_cnt].d_side;
4185 if (!monster_is_valid(m_ptr)) break;
4187 /* Stop attacking if the target dies! */
4188 if (t_ptr->fx != x_saver || t_ptr->fy != y_saver)
4191 /* Hack -- no more attacks */
4194 if (method == RBM_SHOOT) continue;
4196 /* Extract the attack "power" */
4197 power = mbe_info[effect].power;
4200 if (!effect || check_hit2(power, rlev, ac, MON_STUNNED(m_ptr)))
4202 (void)set_monster_csleep(subject_ptr, t_idx, 0);
4206 /* Redraw the health bar */
4207 if (subject_ptr->health_who == t_idx) subject_ptr->redraw |= (PR_HEALTH);
4208 if (subject_ptr->riding == t_idx) subject_ptr->redraw |= (PR_UHEALTH);
4211 /* Describe the attack method */
4216 act = _("%sを殴った。", "hits %s.");
4223 act = _("%sを触った。", "touches %s.");
4230 act = _("%sをパンチした。", "punches %s.");
4237 act = _("%sを蹴った。", "kicks %s.");
4244 act = _("%sをひっかいた。", "claws %s.");
4251 act = _("%sを噛んだ。", "bites %s.");
4258 act = _("%sを刺した。", "stings %s.");
4265 act = _("%sを斬った。", "slashes %s.");
4271 act = _("%sを角で突いた。", "butts %s.");
4278 act = _("%sに体当りした。", "crushes %s.");
4285 act = _("%sを飲み込んだ。", "engulfs %s.");
4292 act = _("%sに請求書をよこした。", "charges %s.");
4299 act = _("%sの体の上を這い回った。", "crawls on %s.");
4306 act = _("%sによだれをたらした。", "drools on %s.");
4313 act = _("%sに唾を吐いた。", "spits on %s.");
4320 if (see_either) disturb(subject_ptr, TRUE, TRUE);
4321 act = _("爆発した。", "explodes.");
4329 act = _("%sをにらんだ。", "gazes at %s.");
4336 act = _("%sに泣きついた。", "wails at %s.");
4343 act = _("%sに胞子を飛ばした。", "releases spores at %s.");
4350 act = _("%sにXXX4を飛ばした。", "projects XXX4's at %s.");
4357 act = _("%sに金をせがんだ。", "begs %s for money.");
4364 act = _("%sを侮辱した。", "insults %s.");
4371 act = _("%sにむかってうめいた。", "moans at %s.");
4378 act = _("%sにむかって歌った。", "sings to %s.");
4384 if (act && see_either)
4387 if (do_silly_attack) act = silly_attacks2[randint0(MAX_SILLY_ATTACK)];
4388 strfmt(temp, act, t_name);
4389 msg_format("%^sは%s", m_name, temp);
4391 if (do_silly_attack)
4393 act = silly_attacks[randint0(MAX_SILLY_ATTACK)];
4394 strfmt(temp, "%s %s.", act, t_name);
4396 else strfmt(temp, act, t_name);
4397 msg_format("%^s %s", m_name, temp);
4401 /* Hack -- assume all attacks are obvious */
4404 /* Roll out the damage */
4405 damage = damroll(d_dice, d_side);
4407 /* Assume no effect */
4408 effect_type = BLOW_EFFECT_TYPE_NONE;
4412 /* Apply appropriate damage */
4421 if ((randint1(rlev * 2 + 250) > (ac + 200)) || one_in_(13))
4423 int tmp_damage = damage - (damage * ((ac < 150) ? ac : 150) / 250);
4424 damage = MAX(damage, tmp_damage * 2);
4431 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
4446 if ((subject_ptr->riding != m_idx) && one_in_(2)) blinked = TRUE;
4482 effect_type = BLOW_EFFECT_TYPE_FEAR;
4486 effect_type = BLOW_EFFECT_TYPE_SLEEP;
4490 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
4491 if (damage > 23) earthquake(subject_ptr, m_ptr->fy, m_ptr->fx, 8, m_idx);
4506 pt = GF_HYPODYNAMIA;
4507 effect_type = BLOW_EFFECT_TYPE_HEAL;
4525 /* Do damage if not exploding */
4528 project(subject_ptr, m_idx, 0, t_ptr->fy, t_ptr->fx,
4529 damage, pt, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4532 switch (effect_type)
4534 case BLOW_EFFECT_TYPE_FEAR:
4535 project(subject_ptr, m_idx, 0, t_ptr->fy, t_ptr->fx,
4536 damage, GF_TURN_ALL, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4539 case BLOW_EFFECT_TYPE_SLEEP:
4540 project(subject_ptr, m_idx, 0, t_ptr->fy, t_ptr->fx,
4541 r_ptr->level, GF_OLD_SLEEP, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4544 case BLOW_EFFECT_TYPE_HEAL:
4545 if ((monster_living(m_idx)) && (damage > 2))
4547 bool did_heal = FALSE;
4549 if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
4552 m_ptr->hp += damroll(4, damage / 6);
4553 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
4555 /* Redraw (later) if needed */
4556 if (subject_ptr->health_who == m_idx) subject_ptr->redraw |= (PR_HEALTH);
4557 if (subject_ptr->riding == m_idx) subject_ptr->redraw |= (PR_UHEALTH);
4559 /* Special message */
4560 if (see_m && did_heal)
4562 msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), m_name);
4571 if ((tr_ptr->flags2 & RF2_AURA_FIRE) && m_ptr->r_idx)
4573 if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK))
4577 msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), m_name);
4579 if (m_ptr->ml && is_original_ap_and_seen(subject_ptr, t_ptr)) tr_ptr->r_flags2 |= RF2_AURA_FIRE;
4580 project(subject_ptr, t_idx, 0, m_ptr->fy, m_ptr->fx,
4581 damroll(1 + ((tr_ptr->level) / 26),
4582 1 + ((tr_ptr->level) / 17)),
4583 GF_FIRE, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4587 if (is_original_ap_and_seen(subject_ptr, m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
4592 if ((tr_ptr->flags3 & RF3_AURA_COLD) && m_ptr->r_idx)
4594 if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK))
4598 msg_format(_("%^sは突然寒くなった!", "%^s is suddenly very cold!"), m_name);
4600 if (m_ptr->ml && is_original_ap_and_seen(subject_ptr, t_ptr)) tr_ptr->r_flags3 |= RF3_AURA_COLD;
4601 project(subject_ptr, t_idx, 0, m_ptr->fy, m_ptr->fx,
4602 damroll(1 + ((tr_ptr->level) / 26),
4603 1 + ((tr_ptr->level) / 17)),
4604 GF_COLD, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4608 if (is_original_ap_and_seen(subject_ptr, m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
4613 if ((tr_ptr->flags2 & RF2_AURA_ELEC) && m_ptr->r_idx)
4615 if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK))
4619 msg_format(_("%^sは電撃を食らった!", "%^s gets zapped!"), m_name);
4621 if (m_ptr->ml && is_original_ap_and_seen(subject_ptr, t_ptr)) tr_ptr->r_flags2 |= RF2_AURA_ELEC;
4622 project(subject_ptr, t_idx, 0, m_ptr->fy, m_ptr->fx,
4623 damroll(1 + ((tr_ptr->level) / 26),
4624 1 + ((tr_ptr->level) / 17)),
4625 GF_ELEC, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4629 if (is_original_ap_and_seen(subject_ptr, m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
4636 /* Monster missed player */
4639 /* Analyze failed attacks */
4655 (void)set_monster_csleep(subject_ptr, t_idx, 0);
4657 /* Visible monsters */
4661 msg_format("%sは%^sの攻撃をかわした。", t_name, m_name);
4663 msg_format("%^s misses %s.", m_name, t_name);
4673 /* Analyze "visible" monsters only */
4674 if (is_original_ap_and_seen(subject_ptr, m_ptr) && !do_silly_attack)
4676 /* Count "obvious" attacks (and ones that cause damage) */
4677 if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
4679 /* Count attacks of this type */
4680 if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
4682 r_ptr->r_blows[ap_cnt]++;
4690 sound(SOUND_EXPLODE);
4692 /* Cancel Invulnerability */
4693 (void)set_monster_invulner(subject_ptr, m_idx, 0, FALSE);
4694 mon_take_hit_mon(subject_ptr, m_idx, m_ptr->hp + 1, &dead, &fear, _("は爆発して粉々になった。", " explodes into tiny shreds."), m_idx);
4698 if (!blinked || m_ptr->r_idx == 0) return TRUE;
4700 if (teleport_barrier(subject_ptr, m_idx))
4704 msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But a magic barrier obstructs it."));
4708 subject_ptr->current_floor_ptr->monster_noise = TRUE;
4715 msg_print(_("泥棒は笑って逃げた!", "The thief flees laughing!"));
4719 subject_ptr->current_floor_ptr->monster_noise = TRUE;
4722 teleport_away(subject_ptr, m_idx, MAX_SIGHT * 2 + 5, TELEPORT_SPONTANEOUS);
4731 * @brief モンスターが敵モンスターに行う打撃処理 /
4732 * Hack, based on mon_take_hit... perhaps all monster attacks on other monsters should use this?
4733 * @param m_idx 目標となるモンスターの参照ID
4735 * @param dead 目標となったモンスターの死亡状態を返す参照ポインタ
4736 * @param fear 目標となったモンスターの恐慌状態を返す参照ポインタ
4737 * @param note 目標モンスターが死亡した場合の特別メッセージ(NULLならば標準表示を行う)
4738 * @param who 打撃を行ったモンスターの参照ID
4741 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)
4743 floor_type *floor_ptr = player_ptr->current_floor_ptr;
4744 monster_type *m_ptr = &floor_ptr->m_list[m_idx];
4745 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4746 GAME_TEXT m_name[160];
4747 bool seen = is_seen(m_ptr);
4749 /* Can the player be aware of this attack? */
4750 bool known = (m_ptr->cdis <= MAX_SIGHT);
4752 monster_desc(player_ptr, m_name, m_ptr, 0);
4754 /* Redraw (later) if needed */
4757 if (player_ptr->health_who == m_idx) player_ptr->redraw |= (PR_HEALTH);
4758 if (player_ptr->riding == m_idx) player_ptr->redraw |= (PR_UHEALTH);
4761 (void)set_monster_csleep(player_ptr, m_idx, 0);
4763 if (player_ptr->riding && (m_idx == player_ptr->riding)) disturb(player_ptr, TRUE, TRUE);
4765 if (MON_INVULNER(m_ptr) && randint0(PENETRATE_INVULNERABILITY))
4769 msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
4774 if (r_ptr->flagsr & RFR_RES_ALL)
4779 if ((dam == 0) && one_in_(3)) dam = 1;
4785 msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
4794 /* It is dead now... or is it? */
4797 if (((r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) ||
4798 (r_ptr->flags7 & RF7_NAZGUL)) &&
4799 !player_ptr->phase_out)
4806 if (!monster_living(m_ptr->r_idx))
4808 sound(SOUND_N_KILL);
4819 monster_desc(player_ptr, m_name, m_ptr, MD_TRUE_NAME);
4820 /* Unseen death by normal attack */
4823 floor_ptr->monster_noise = TRUE;
4825 /* Death by special attack */
4828 msg_format(_("%^s%s", "%^s%s"), m_name, note);
4830 /* Death by normal attack -- nonliving monster */
4831 else if (!monster_living(m_ptr->r_idx))
4833 msg_format(_("%^sは破壊された。", "%^s is destroyed."), m_name);
4835 /* Death by normal attack -- living monster */
4838 msg_format(_("%^sは殺された。", "%^s is killed."), m_name);
4842 monster_gain_exp(player_ptr, who, m_ptr->r_idx);
4843 monster_death(player_ptr, m_idx, FALSE);
4844 delete_monster_idx(player_ptr, m_idx);
4849 /* Monster is dead */
4856 /* Mega-Hack -- Pain cancels fear */
4857 if (MON_MONFEAR(m_ptr) && (dam > 0))
4860 if (set_monster_monfear(player_ptr, m_idx, MON_MONFEAR(m_ptr) - randint1(dam / 4)))
4867 /* Sometimes a monster gets scared by damage */
4868 if (!MON_MONFEAR(m_ptr) && !(r_ptr->flags3 & RF3_NO_FEAR))
4870 /* Percentage of fully healthy */
4871 int percentage = (100L * m_ptr->hp) / m_ptr->maxhp;
4874 * Run (sometimes) if at 10% or less of max hit points,
4875 * or (usually) when hit for half its current hit points
4877 if (((percentage <= 10) && (randint0(10) < percentage)) ||
4878 ((dam >= m_ptr->hp) && (randint0(100) < 80)))
4880 /* Hack -- note fear */
4883 /* Hack -- Add some timed fear */
4884 (void)set_monster_monfear(player_ptr, m_idx, (randint1(10) +
4885 (((dam >= m_ptr->hp) && (percentage > 7)) ?
4886 20 : ((11 - percentage) * 5))));
4890 if ((dam > 0) && !is_pet(m_ptr) && !is_friendly(m_ptr) && (who != m_idx))
4892 if (is_pet(&floor_ptr->m_list[who]) && !player_bold(player_ptr, m_ptr->target_y, m_ptr->target_x))
4894 set_target(m_ptr, floor_ptr->m_list[who].fy, floor_ptr->m_list[who].fx);
4898 if (player_ptr->riding && (player_ptr->riding == m_idx) && (dam > 0))
4900 monster_desc(player_ptr, m_name, m_ptr, 0);
4902 if (m_ptr->hp > m_ptr->maxhp / 3) dam = (dam + 1) / 2;
4903 if (rakuba(player_ptr, (dam > 200) ? 200 : dam, FALSE))
4905 msg_format(_("%^sに振り落とされた!", "You have been thrown off from %s!"), m_name);