3 * @brief 打撃処理 / Melee process.
6 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke\n
7 * This software may be copied and distributed for educational, research,\n
8 * and not for profit purposes provided that this copyright and statement\n
9 * are included in all such copies. Other copyrights may also apply.\n
10 * 2014 Deskull rearranged comment for Doxygen.\n
20 #include "monsterrace-hook.h"
23 #include "monster-status.h"
24 #include "monster-spell.h"
26 #include "realm-hex.h"
27 #include "realm-song.h"
28 #include "object-flavor.h"
29 #include "object-hook.h"
36 #include "player-move.h"
37 #include "player-effects.h"
38 #include "player-skill.h"
39 #include "player-damage.h"
40 #include "player-status.h"
41 #include "player-race.h"
42 #include "player-class.h"
43 #include "player-personality.h"
44 #include "view-mainwindow.h"
46 #include "spells-floor.h"
48 #define BLOW_EFFECT_TYPE_NONE 0
49 #define BLOW_EFFECT_TYPE_FEAR 1
50 #define BLOW_EFFECT_TYPE_SLEEP 2
51 #define BLOW_EFFECT_TYPE_HEAL 3
54 * @brief モンスターの打撃効力テーブル /
55 * The table of monsters' blow effects
57 const mbe_info_type mbe_info[] =
60 { 60, GF_MISSILE, }, /* HURT */
61 { 5, GF_POIS, }, /* POISON */
62 { 20, GF_DISENCHANT, }, /* UN_BONUS */
63 { 15, GF_MISSILE, }, /* UN_POWER */ /* ToDo: Apply the correct effects */
64 { 5, GF_MISSILE, }, /* EAT_GOLD */
65 { 5, GF_MISSILE, }, /* EAT_ITEM */
66 { 5, GF_MISSILE, }, /* EAT_FOOD */
67 { 5, GF_MISSILE, }, /* EAT_LITE */
68 { 0, GF_ACID, }, /* ACID */
69 { 10, GF_ELEC, }, /* ELEC */
70 { 10, GF_FIRE, }, /* FIRE */
71 { 10, GF_COLD, }, /* COLD */
72 { 2, GF_MISSILE, }, /* BLIND */
73 { 10, GF_CONFUSION, }, /* CONFUSE */
74 { 10, GF_MISSILE, }, /* TERRIFY */
75 { 2, GF_MISSILE, }, /* PARALYZE */
76 { 0, GF_MISSILE, }, /* LOSE_STR */
77 { 0, GF_MISSILE, }, /* LOSE_INT */
78 { 0, GF_MISSILE, }, /* LOSE_WIS */
79 { 0, GF_MISSILE, }, /* LOSE_DEX */
80 { 0, GF_MISSILE, }, /* LOSE_CON */
81 { 0, GF_MISSILE, }, /* LOSE_CHR */
82 { 2, GF_MISSILE, }, /* LOSE_ALL */
83 { 60, GF_ROCKET, }, /* SHATTER */
84 { 5, GF_MISSILE, }, /* EXP_10 */
85 { 5, GF_MISSILE, }, /* EXP_20 */
86 { 5, GF_MISSILE, }, /* EXP_40 */
87 { 5, GF_MISSILE, }, /* EXP_80 */
88 { 5, GF_POIS, }, /* DISEASE */
89 { 5, GF_TIME, }, /* TIME */
90 { 5, GF_MISSILE, }, /* EXP_VAMP */
91 { 5, GF_MANA, }, /* DR_MANA */
92 { 60, GF_MISSILE, }, /* SUPERHURT */
96 * @brief 幻覚時の打撃記述テーブル / Weird melee attack types when hallucinating
99 const concptr silly_attacks[MAX_SILLY_ATTACK] =
102 "があなたの回りを3回回ってワンと言った。",
110 "に「神の国」発言の撤回を求められた。",
121 "はあなたの100の秘密について熱く語った。",
133 "に二週間以内でビデオを人に見せないと死ぬ呪いをかけられた。",
135 "はスーパーウルトラギャラクティカマグナムを放った。",
137 "にジェットストリームアタックをかけられた。",
138 "はあなたに卍固めをかけて「1、2、3、ダーッ!」と叫んだ。",
139 "は「いくじなし!ばかばかばか!」といって駆け出した。",
140 "が「ごらん、ルーベンスの絵だよ」と言って静かに目を閉じた。",
141 "は言った。「変愚蛮怒、絶賛公開中!」",
145 * @brief 幻覚時の打撃記述テーブル(フォーマットつき) / Weird melee attack types when hallucinating (%s for strfmt())
147 const concptr silly_attacks2[MAX_SILLY_ATTACK] =
150 "%sの回りを3回回ってワンと言った。",
158 "%sに「神の国」発言の撤回を求めた。",
169 "%sの100の秘密について熱く語った。",
181 "%sに二週間以内でビデオを人に見せないと死ぬ呪いをかけた。",
183 "%sにスーパーウルトラギャラクティカマグナムを放った。",
185 "%sにジェットストリームアタックをかけた。",
186 "%sに卍固めをかけて「1、2、3、ダーッ!」と叫んだ。",
187 "「いくじなし!ばかばかばか!」といって駆け出した。",
188 "「ごらん、ルーベンスの絵だよ」と言って静かに目を閉じた。",
192 const concptr silly_attacks[MAX_SILLY_ATTACK] =
203 "makes obscene gestures at",
233 * @brief マーシャルアーツ打撃テーブル
235 const martial_arts ma_blows[MAX_MA] =
238 { "%sを殴った。", 1, 0, 1, 5, 0 },
239 { "%sを蹴った。", 2, 0, 1, 7, 0 },
240 { "%sに正拳突きをくらわした。", 3, 0, 1, 9, 0 },
241 { "%sに膝蹴りをくらわした。", 5, 5, 2, 4, MA_KNEE },
242 { "%sに肘打ちをくらわした。", 7, 5, 1, 12, 0 },
243 { "%sに体当りした。", 9, 10, 2, 6, 0 },
244 { "%sを蹴った。", 11, 10, 3, 6, MA_SLOW },
245 { "%sにアッパーをくらわした。", 13, 12, 5, 5, 6 },
246 { "%sに二段蹴りをくらわした。", 16, 15, 5, 6, 8 },
247 { "%sに猫爪撃をくらわした。", 20, 20, 5, 8, 0 },
248 { "%sに跳空脚をくらわした。", 24, 25, 6, 8, 10 },
249 { "%sに鷲爪襲をくらわした。", 28, 25, 7, 9, 0 },
250 { "%sに回し蹴りをくらわした。", 32, 30, 8, 10, 10 },
251 { "%sに鉄拳撃をくらわした。", 35, 35, 8, 11, 10 },
252 { "%sに飛空脚をくらわした。", 39, 35, 8, 12, 12 },
253 { "%sに昇龍拳をくらわした。", 43, 35, 9, 12, 16 },
254 { "%sに石破天驚拳をくらわした。", 48, 40, 10, 13, 18 },
256 { "You punch %s.", 1, 0, 1, 4, 0 },
257 { "You kick %s.", 2, 0, 1, 6, 0 },
258 { "You strike %s.", 3, 0, 1, 7, 0 },
259 { "You hit %s with your knee.", 5, 5, 2, 3, MA_KNEE },
260 { "You hit %s with your elbow.", 7, 5, 1, 8, 0 },
261 { "You butt %s.", 9, 10, 2, 5, 0 },
262 { "You kick %s.", 11, 10, 3, 4, MA_SLOW },
263 { "You uppercut %s.", 13, 12, 4, 4, 6 },
264 { "You double-kick %s.", 16, 15, 5, 4, 8 },
265 { "You hit %s with a Cat's Claw.", 20, 20, 5, 5, 0 },
266 { "You hit %s with a jump kick.", 25, 25, 5, 6, 10 },
267 { "You hit %s with an Eagle's Claw.", 29, 25, 6, 6, 0 },
268 { "You hit %s with a circle kick.", 33, 30, 6, 8, 10 },
269 { "You hit %s with an Iron Fist.", 37, 35, 8, 8, 10 },
270 { "You hit %s with a flying kick.", 41, 35, 8, 10, 12 },
271 { "You hit %s with a Dragon Fist.", 45, 35, 10, 10, 16 },
272 { "You hit %s with a Crushing Blow.", 48, 35, 10, 12, 18 },
278 * @brief 修行僧のターンダメージ算出テーブル
280 const int monk_ave_damage[PY_MAX_LEVEL + 1][3] =
337 * Stat Table (STR) -- help index into the "blow" table
339 const byte adj_str_blow[] =
356 20 /* 18/00-18/09 */,
357 30 /* 18/10-18/19 */,
358 40 /* 18/20-18/29 */,
359 50 /* 18/30-18/39 */,
360 60 /* 18/40-18/49 */,
361 70 /* 18/50-18/59 */,
362 80 /* 18/60-18/69 */,
363 90 /* 18/70-18/79 */,
364 100 /* 18/80-18/89 */,
365 110 /* 18/90-18/99 */,
366 120 /* 18/100-18/109 */,
367 130 /* 18/110-18/119 */,
368 140 /* 18/120-18/129 */,
369 150 /* 18/130-18/139 */,
370 160 /* 18/140-18/149 */,
371 170 /* 18/150-18/159 */,
372 180 /* 18/160-18/169 */,
373 190 /* 18/170-18/179 */,
374 200 /* 18/180-18/189 */,
375 210 /* 18/190-18/199 */,
376 220 /* 18/200-18/209 */,
377 230 /* 18/210-18/219 */,
383 * 器用さによる攻撃回数インデックステーブル
384 * Stat Table (DEX) -- index into the "blow" table
386 const byte adj_dex_blow[] =
413 7 /* 18/100-18/109 */,
414 7 /* 18/110-18/119 */,
415 8 /* 18/120-18/129 */,
416 8 /* 18/130-18/139 */,
417 9 /* 18/140-18/149 */,
418 9 /* 18/150-18/159 */,
419 10 /* 18/160-18/169 */,
420 10 /* 18/170-18/179 */,
421 11 /* 18/180-18/189 */,
422 11 /* 18/190-18/199 */,
423 12 /* 18/200-18/209 */,
424 12 /* 18/210-18/219 */,
431 * 腕力、器用さに応じた攻撃回数テーブル /
432 * This table is used to help calculate the number of blows the player can
433 * make in a single round of attacks (one player turn) with a normal weapon.
436 * This number ranges from a single blow/round for weak players to up to six
437 * blows/round for powerful warriors.
439 * Note that certain artifacts and ego-items give "bonus" blows/round.
441 * First, from the player class, we extract some values:
443 * Warrior num = 6; mul = 5; div = MAX(70, weapon_weight);
444 * Berserker num = 6; mul = 7; div = MAX(70, weapon_weight);
445 * Mage num = 3; mul = 2; div = MAX(100, weapon_weight);
446 * Priest num = 5; mul = 3; div = MAX(100, weapon_weight);
447 * Mindcrafter num = 5; mul = 3; div = MAX(100, weapon_weight);
448 * Rogue num = 5; mul = 3; div = MAX(40, weapon_weight);
449 * Ranger num = 5; mul = 4; div = MAX(70, weapon_weight);
450 * Paladin num = 5; mul = 4; div = MAX(70, weapon_weight);
451 * Weaponsmith num = 5; mul = 5; div = MAX(150, weapon_weight);
452 * Warrior-Mage num = 5; mul = 3; div = MAX(70, weapon_weight);
453 * Chaos Warrior num = 5; mul = 4; div = MAX(70, weapon_weight);
454 * Monk num = 5; mul = 3; div = MAX(60, weapon_weight);
455 * Tourist num = 4; mul = 3; div = MAX(100, weapon_weight);
456 * Imitator num = 5; mul = 4; div = MAX(70, weapon_weight);
457 * Beastmaster num = 5; mul = 3; div = MAX(70, weapon_weight);
458 * Cavalry(Ride) num = 5; mul = 4; div = MAX(70, weapon_weight);
459 * Cavalry(Walk) num = 5; mul = 3; div = MAX(100, weapon_weight);
460 * Sorcerer num = 1; mul = 1; div = MAX(1, weapon_weight);
461 * Archer num = 4; mul = 2; div = MAX(70, weapon_weight);
462 * Magic eater num = 4; mul = 2; div = MAX(70, weapon_weight);
463 * ForceTrainer num = 4; mul = 2; div = MAX(60, weapon_weight);
464 * Mirror Master num = 3; mul = 3; div = MAX(100, weapon_weight);
465 * Ninja num = 4; mul = 1; div = MAX(20, weapon_weight);
467 * To get "P", we look up the relevant "adj_str_blow[]" (see above),
468 * multiply it by "mul", and then divide it by "div".
469 * Increase P by 1 if you wield a weapon two-handed.
470 * Decrease P by 1 if you are a Ninja.
472 * To get "D", we look up the relevant "adj_dex_blow[]" (see above),
474 * The player gets "blows_table[P][D]" blows/round, as shown below,
475 * up to a maximum of "num" blows/round, plus any "bonus" blows/round.
478 const byte blows_table[12][12] =
481 /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11+ */
482 /* 3 10 15 /10 /40 /60 /80 /100 /120 /140 /160 /180 */
483 /* 0 */{ 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4 },
484 /* 1 */{ 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4 },
485 /* 2 */{ 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5 },
486 /* 3 */{ 1, 1, 2, 3, 3, 4, 4, 4, 5, 5, 5, 5 },
487 /* 4 */{ 1, 1, 2, 3, 3, 4, 4, 5, 5, 5, 5, 5 },
488 /* 5 */{ 1, 1, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6 },
489 /* 6 */{ 1, 1, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6 },
490 /* 7 */{ 1, 2, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6 },
491 /* 8 */{ 1, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6 },
492 /* 9 */{ 1, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6 },
493 /* 10*/{ 2, 2, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6 },
494 /*11+*/{ 2, 2, 3, 4, 4, 4, 5, 5, 6, 6, 6, 6 },
498 * @brief プレイヤーからモンスターへの打撃命中判定 /
499 * Determine if the player "hits" a monster (normal combat).
500 * @param chance 基本命中値
502 * @param visible 目標を視界に捕らえているならばTRUEを指定
503 * @return 命中と判定された場合TRUEを返す
504 * @note Always miss 5%, always hit 5%, otherwise random.
506 bool test_hit_norm(player_type *attacker_ptr, HIT_RELIABILITY chance, ARMOUR_CLASS ac, bool visible)
508 if (!visible) chance = (chance + 1) / 2;
509 return hit_chance(attacker_ptr, chance, ac) >= randint1(100);
513 * @brief モンスターへの命中率の計算
514 * @param player_ptr プレーヤーへの参照ポインタ
519 PERCENTAGE hit_chance(player_type *attacker_ptr, HIT_RELIABILITY reli, ARMOUR_CLASS ac)
521 PERCENTAGE chance = 5, chance_left = 90;
522 if(reli <= 0) return 5;
523 if(attacker_ptr->pseikaku == SEIKAKU_NAMAKE) chance_left = (chance_left * 19 + 9) / 20;
524 chance += (100 - ((ac * 75) / reli)) * chance_left / 100;
525 if (chance < 5) chance = 5;
531 * @brief プレイヤー攻撃の種族スレイング倍率計算
532 * @param player_ptr プレーヤーへの参照ポインタ
533 * @param mult 算出前の基本倍率(/10倍)
534 * @param flgs スレイフラグ配列
535 * @param m_ptr 目標モンスターの構造体参照ポインタ
536 * @return スレイング加味後の倍率(/10倍)
538 static MULTIPLY mult_slaying(player_type *player_ptr, MULTIPLY mult, const BIT_FLAGS* flgs, monster_type* m_ptr)
540 static const struct slay_table_t {
542 BIT_FLAGS affect_race_flag;
545 size_t r_flag_offset;
547 #define OFFSET(X) offsetof(monster_race, X)
548 {TR_SLAY_ANIMAL, RF3_ANIMAL, 25, OFFSET(flags3), OFFSET(r_flags3)},
549 {TR_KILL_ANIMAL, RF3_ANIMAL, 40, OFFSET(flags3), OFFSET(r_flags3)},
550 {TR_SLAY_EVIL, RF3_EVIL, 20, OFFSET(flags3), OFFSET(r_flags3)},
551 {TR_KILL_EVIL, RF3_EVIL, 35, OFFSET(flags3), OFFSET(r_flags3)},
552 {TR_SLAY_GOOD, RF3_GOOD, 20, OFFSET(flags3), OFFSET(r_flags3)},
553 {TR_KILL_GOOD, RF3_GOOD, 35, OFFSET(flags3), OFFSET(r_flags3)},
554 {TR_SLAY_HUMAN, RF2_HUMAN, 25, OFFSET(flags2), OFFSET(r_flags2)},
555 {TR_KILL_HUMAN, RF2_HUMAN, 40, OFFSET(flags2), OFFSET(r_flags2)},
556 {TR_SLAY_UNDEAD, RF3_UNDEAD, 30, OFFSET(flags3), OFFSET(r_flags3)},
557 {TR_KILL_UNDEAD, RF3_UNDEAD, 50, OFFSET(flags3), OFFSET(r_flags3)},
558 {TR_SLAY_DEMON, RF3_DEMON, 30, OFFSET(flags3), OFFSET(r_flags3)},
559 {TR_KILL_DEMON, RF3_DEMON, 50, OFFSET(flags3), OFFSET(r_flags3)},
560 {TR_SLAY_ORC, RF3_ORC, 30, OFFSET(flags3), OFFSET(r_flags3)},
561 {TR_KILL_ORC, RF3_ORC, 50, OFFSET(flags3), OFFSET(r_flags3)},
562 {TR_SLAY_TROLL, RF3_TROLL, 30, OFFSET(flags3), OFFSET(r_flags3)},
563 {TR_KILL_TROLL, RF3_TROLL, 50, OFFSET(flags3), OFFSET(r_flags3)},
564 {TR_SLAY_GIANT, RF3_GIANT, 30, OFFSET(flags3), OFFSET(r_flags3)},
565 {TR_KILL_GIANT, RF3_GIANT, 50, OFFSET(flags3), OFFSET(r_flags3)},
566 {TR_SLAY_DRAGON, RF3_DRAGON, 30, OFFSET(flags3), OFFSET(r_flags3)},
567 {TR_KILL_DRAGON, RF3_DRAGON, 50, OFFSET(flags3), OFFSET(r_flags3)},
571 monster_race* r_ptr = &r_info[m_ptr->r_idx];
572 for (int i = 0; i < sizeof(slay_table) / sizeof(slay_table[0]); ++i)
574 const struct slay_table_t* p = &slay_table[i];
576 if (!have_flag(flgs, p->slay_flag) ||
577 !(atoffset(BIT_FLAGS, r_ptr, p->flag_offset) & p->affect_race_flag))
580 if (is_original_ap_and_seen(player_ptr, m_ptr))
582 atoffset(BIT_FLAGS, r_ptr, p->r_flag_offset) |= p->affect_race_flag;
585 mult = MAX(mult, p->slay_mult);
593 * @brief プレイヤー攻撃の属性スレイング倍率計算
594 * @param player_ptr プレーヤーへの参照ポインタ
595 * @param mult 算出前の基本倍率(/10倍)
596 * @param flgs スレイフラグ配列
597 * @param m_ptr 目標モンスターの構造体参照ポインタ
598 * @return スレイング加味後の倍率(/10倍)
600 static MULTIPLY mult_brand(player_type *player_ptr, MULTIPLY mult, const BIT_FLAGS* flgs, monster_type* m_ptr)
602 static const struct brand_table_t {
604 BIT_FLAGS resist_mask;
607 {TR_BRAND_ACID, RFR_EFF_IM_ACID_MASK, 0U },
608 {TR_BRAND_ELEC, RFR_EFF_IM_ELEC_MASK, 0U },
609 {TR_BRAND_FIRE, RFR_EFF_IM_FIRE_MASK, RF3_HURT_FIRE},
610 {TR_BRAND_COLD, RFR_EFF_IM_COLD_MASK, RF3_HURT_COLD},
611 {TR_BRAND_POIS, RFR_EFF_IM_POIS_MASK, 0U },
614 monster_race* r_ptr = &r_info[m_ptr->r_idx];
615 for (int i = 0; i < sizeof(brand_table) / sizeof(brand_table[0]); ++i)
617 const struct brand_table_t* p = &brand_table[i];
619 if (!have_flag(flgs, p->brand_flag)) continue;
621 /* Notice immunity */
622 if (r_ptr->flagsr & p->resist_mask)
624 if (is_original_ap_and_seen(player_ptr, m_ptr))
626 r_ptr->r_flagsr |= (r_ptr->flagsr & p->resist_mask);
632 /* Otherwise, take the damage */
633 if (r_ptr->flags3 & p->hurt_flag)
635 if (is_original_ap_and_seen(player_ptr, m_ptr))
637 r_ptr->r_flags3 |= p->hurt_flag;
640 mult = MAX(mult, 50);
644 mult = MAX(mult, 25);
652 * @brief 剣術のスレイ倍率計算を行う /
653 * Calcurate magnification of hissatsu technics
654 * @param mult 剣術のスレイ効果以前に算出している多要素の倍率(/10倍)
655 * @param flgs 剣術に使用する武器のスレイフラグ配列
656 * @param m_ptr 目標となるモンスターの構造体参照ポインタ
657 * @param mode 剣術のスレイ型ID
658 * @return スレイの倍率(/10倍)
660 static MULTIPLY mult_hissatsu(player_type *attacker_ptr, MULTIPLY mult, BIT_FLAGS *flgs, monster_type *m_ptr, BIT_FLAGS mode)
662 monster_race *r_ptr = &r_info[m_ptr->r_idx];
664 /* Burning Strike (Fire) */
665 if (mode == HISSATSU_FIRE)
667 /* Notice immunity */
668 if (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK)
670 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
672 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
676 /* Otherwise, take the damage */
677 else if (have_flag(flgs, TR_BRAND_FIRE))
679 if (r_ptr->flags3 & RF3_HURT_FIRE)
681 if (mult < 70) mult = 70;
682 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
684 r_ptr->r_flags3 |= RF3_HURT_FIRE;
687 else if (mult < 35) mult = 35;
691 if (r_ptr->flags3 & RF3_HURT_FIRE)
693 if (mult < 50) mult = 50;
694 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
696 r_ptr->r_flags3 |= RF3_HURT_FIRE;
699 else if (mult < 25) mult = 25;
703 /* Serpent's Tongue (Poison) */
704 if (mode == HISSATSU_POISON)
706 /* Notice immunity */
707 if (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK)
709 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
711 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_POIS_MASK);
715 /* Otherwise, take the damage */
716 else if (have_flag(flgs, TR_BRAND_POIS))
718 if (mult < 35) mult = 35;
722 if (mult < 25) mult = 25;
726 /* Zammaken (Nonliving Evil) */
727 if (mode == HISSATSU_ZANMA)
729 if (!monster_living(m_ptr->r_idx) && (r_ptr->flags3 & RF3_EVIL))
731 if (mult < 15) mult = 25;
732 else if (mult < 50) mult = MIN(50, mult + 20);
736 /* Rock Smash (Hurt Rock) */
737 if (mode == HISSATSU_HAGAN)
739 if (r_ptr->flags3 & RF3_HURT_ROCK)
741 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
743 r_ptr->r_flags3 |= RF3_HURT_ROCK;
745 if (mult == 10) mult = 40;
746 else if (mult < 60) mult = 60;
750 /* Midare-Setsugekka (Cold) */
751 if (mode == HISSATSU_COLD)
753 /* Notice immunity */
754 if (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK)
756 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
758 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
761 /* Otherwise, take the damage */
762 else if (have_flag(flgs, TR_BRAND_COLD))
764 if (r_ptr->flags3 & RF3_HURT_COLD)
766 if (mult < 70) mult = 70;
767 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
769 r_ptr->r_flags3 |= RF3_HURT_COLD;
772 else if (mult < 35) mult = 35;
776 if (r_ptr->flags3 & RF3_HURT_COLD)
778 if (mult < 50) mult = 50;
779 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
781 r_ptr->r_flags3 |= RF3_HURT_COLD;
784 else if (mult < 25) mult = 25;
788 /* Lightning Eagle (Elec) */
789 if (mode == HISSATSU_ELEC)
791 /* Notice immunity */
792 if (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK)
794 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
796 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
800 /* Otherwise, take the damage */
801 else if (have_flag(flgs, TR_BRAND_ELEC))
803 if (mult < 70) mult = 70;
807 if (mult < 50) mult = 50;
811 /* Bloody Maelstrom */
812 if ((mode == HISSATSU_SEKIRYUKA) && attacker_ptr->cut && monster_living(m_ptr->r_idx))
814 MULTIPLY tmp = MIN(100, MAX(10, attacker_ptr->cut / 10));
815 if (mult < tmp) mult = tmp;
819 if (mode == HISSATSU_UNDEAD)
821 if (r_ptr->flags3 & RF3_UNDEAD)
823 if (is_original_ap_and_seen(attacker_ptr, m_ptr))
825 r_ptr->r_flags3 |= RF3_UNDEAD;
827 if (mult == 10) mult = 70;
828 else if (mult < 140) mult = MIN(140, mult + 60);
830 if (mult == 10) mult = 40;
831 else if (mult < 60) mult = MIN(60, mult + 30);
834 if (mult > 150) mult = 150;
840 * @brief ダメージにスレイ要素を加える総合処理ルーチン /
841 * Extract the "total damage" from a given object hitting a given monster.
842 * @param o_ptr 使用武器オブジェクトの構造体参照ポインタ
843 * @param tdam 現在算出途中のダメージ値
844 * @param m_ptr 目標モンスターの構造体参照ポインタ
846 * @param thrown 投擲処理ならばTRUEを指定する
847 * @return 総合的なスレイを加味したダメージ値
849 * Note that "flasks of oil" do NOT do fire damage, although they\n
850 * certainly could be made to do so. XXX XXX\n
852 * Note that most brands and slays are x3, except Slay Animal (x2),\n
853 * Slay Evil (x2), and Kill dragon (x5).\n
855 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)
857 BIT_FLAGS flgs[TR_FLAG_SIZE];
858 object_flags(o_ptr, flgs);
859 torch_flags(o_ptr, flgs); /* torches has secret flags */
863 if (attacker_ptr->special_attack & (ATTACK_ACID)) add_flag(flgs, TR_BRAND_ACID);
864 if (attacker_ptr->special_attack & (ATTACK_COLD)) add_flag(flgs, TR_BRAND_COLD);
865 if (attacker_ptr->special_attack & (ATTACK_ELEC)) add_flag(flgs, TR_BRAND_ELEC);
866 if (attacker_ptr->special_attack & (ATTACK_FIRE)) add_flag(flgs, TR_BRAND_FIRE);
867 if (attacker_ptr->special_attack & (ATTACK_POIS)) add_flag(flgs, TR_BRAND_POIS);
870 if (hex_spelling(attacker_ptr, HEX_RUNESWORD)) add_flag(flgs, TR_SLAY_GOOD);
884 mult = mult_slaying(attacker_ptr, mult, flgs, m_ptr);
886 mult = mult_brand(attacker_ptr, mult, flgs, m_ptr);
888 if (attacker_ptr->pclass == CLASS_SAMURAI)
890 mult = mult_hissatsu(attacker_ptr, mult, flgs, m_ptr, mode);
893 if ((attacker_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs, TR_FORCE_WEAPON)) && (attacker_ptr->csp > (o_ptr->dd * o_ptr->ds / 5)))
895 attacker_ptr->csp -= (1 + (o_ptr->dd * o_ptr->ds / 5));
896 attacker_ptr->redraw |= (PR_MANA);
897 mult = mult * 3 / 2 + 20;
900 if ((o_ptr->name1 == ART_NOTHUNG) && (m_ptr->r_idx == MON_FAFNER))
906 if (mult > 150) mult = 150;
907 return (tdam * mult / 10);
911 * @brief プレイヤーからモンスターへの打撃クリティカル判定 /
912 * Critical hits (by player) Factor in weapon weight, total plusses, player melee bonus
913 * @param weight 矢弾の重量
914 * @param plus 武器の命中修正
915 * @param dam 現在算出中のダメージ値
916 * @param meichuu 打撃の基本命中力
917 * @param mode オプションフラグ
918 * @return クリティカル修正が入ったダメージ値
920 HIT_POINT critical_norm(player_type *attacker_ptr, WEIGHT weight, int plus, HIT_POINT dam, s16b meichuu, BIT_FLAGS mode)
922 /* Extract "blow" power */
923 int i = (weight + (meichuu * 3 + plus * 5) + attacker_ptr->skill_thn);
926 bool is_special_option = randint1((attacker_ptr->pclass == CLASS_NINJA) ? 4444 : 5000) <= i;
927 is_special_option |= mode == HISSATSU_MAJIN;
928 is_special_option |= mode == HISSATSU_3DAN;
929 if (!is_special_option) return dam;
931 int k = weight + randint1(650);
932 if ((mode == HISSATSU_MAJIN) || (mode == HISSATSU_3DAN)) k += randint1(650);
936 msg_print(_("手ごたえがあった!", "It was a good hit!"));
944 msg_print(_("かなりの手ごたえがあった!", "It was a great hit!"));
951 msg_print(_("会心の一撃だ!", "It was a superb hit!"));
958 msg_print(_("最高の会心の一撃だ!", "It was a *GREAT* hit!"));
963 msg_print(_("比類なき最高の会心の一撃だ!", "It was a *SUPERB* hit!"));
964 dam = ((7 * dam) / 2) + 25;
969 * @brief モンスター打撃のクリティカルランクを返す /
970 * Critical blow. All hits that do 95% of total possible damage,
971 * @param dice モンスター打撃のダイス数
972 * @param sides モンスター打撃の最大ダイス目
973 * @param dam プレイヤーに与えたダメージ
975 * and which also do at least 20 damage, or, sometimes, N damage.
976 * This is used only to determine "cuts" and "stuns".
978 static int monster_critical(DICE_NUMBER dice, DICE_SID sides, HIT_POINT dam)
980 /* Must do at least 95% of perfect */
981 int total = dice * sides;
982 if (dam < total * 19 / 20) return 0;
984 /* Weak blows rarely work */
985 if ((dam < 20) && (randint0(100) >= dam)) return 0;
989 if ((dam >= total) && (dam >= 40)) max++;
994 while (randint0(100) < 2) max++;
997 /* Critical damage */
998 if (dam > 45) return (6 + max);
999 if (dam > 33) return (5 + max);
1000 if (dam > 25) return (4 + max);
1001 if (dam > 18) return (3 + max);
1002 if (dam > 11) return (2 + max);
1008 * @brief モンスター打撃の命中を判定する /
1009 * Determine if a monster attack against the player succeeds.
1010 * @param power 打撃属性毎の基本命中値
1011 * @param level モンスターのレベル
1012 * @param stun モンスターの朦朧値
1013 * @return TRUEならば命中判定
1015 * Always miss 5% of the time, Always hit 5% of the time.
1016 * Otherwise, match monster power against player armor.
1018 static int check_hit(player_type *target_ptr, int power, DEPTH level, int stun)
1020 int k = randint0(100);
1021 if (stun && one_in_(2)) return FALSE;
1022 if (k < 10) return (k < 5);
1023 int i = (power + (level * 3));
1025 int ac = target_ptr->ac + target_ptr->to_a;
1026 if (target_ptr->special_attack & ATTACK_SUIKEN) ac += (target_ptr->lev * 2);
1028 if ((i > 0) && (randint1(i) > ((ac * 3) / 4))) return TRUE;
1033 * @brief モンスターから敵モンスターへの命中判定
1034 * @param power 打撃属性による基本命中値
1035 * @param level 攻撃側モンスターのレベル
1036 * @param ac 目標モンスターのAC
1037 * @param stun 攻撃側モンスターが朦朧状態ならTRUEを返す
1038 * @return 命中ならばTRUEを返す
1040 static int check_hit2(int power, DEPTH level, ARMOUR_CLASS ac, int stun)
1042 int k = randint0(100);
1043 if (stun && one_in_(2)) return FALSE;
1044 if (k < 10) return (k < 5);
1045 int i = (power + (level * 3));
1047 if ((i > 0) && (randint1(i) > ((ac * 3) / 4))) return TRUE;
1051 /*! モンスターの侮辱行為メッセージテーブル / Hack -- possible "insult" messages */
1052 static concptr desc_insult[] =
1063 "があなたをパラサイト呼ばわりした!",
1067 "insults your mother!",
1068 "gives you the finger!",
1071 "dances around you!",
1072 "makes obscene gestures!",
1074 "calls you a parasite!",
1075 "calls you a cyborg!"
1080 /*! マゴットのぼやきメッセージテーブル / Hack -- possible "insult" messages */
1081 static concptr desc_moan[] =
1085 "が彼の飼い犬を見なかったかと尋ねている。",
1086 "が縄張りから出て行けと言っている。",
1089 "seems sad about something.",
1090 "asks if you have seen his dogs.",
1091 "tells you to get off his land.",
1092 "mumbles something about mushrooms."
1099 * @brief 敵オーラによるプレイヤーのダメージ処理(補助)
1100 * @param m_ptr オーラを持つモンスターの構造体参照ポインタ
1101 * @param immune ダメージを回避できる免疫フラグ
1102 * @param flags_offset オーラフラグ配列の参照オフセット
1103 * @param r_flags_offset モンスターの耐性配列の参照オフセット
1104 * @param aura_flag オーラフラグ配列
1105 * @param dam_func ダメージ処理を行う関数の参照ポインタ
1106 * @param message オーラダメージを受けた際のメッセージ
1109 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,
1110 HIT_POINT(*dam_func)(player_type *creature_type, HIT_POINT dam, concptr kb_str, int monspell, bool aura), concptr message)
1112 monster_race *r_ptr = &r_info[m_ptr->r_idx];
1113 if (!(atoffset(BIT_FLAGS, r_ptr, flags_offset) & aura_flag) || immune) return;
1115 GAME_TEXT mon_name[MAX_NLEN];
1116 int aura_damage = damroll(1 + (r_ptr->level / 26), 1 + (r_ptr->level / 17));
1118 monster_desc(touched_ptr, mon_name, m_ptr, MD_WRONGDOER_NAME);
1120 dam_func(touched_ptr, aura_damage, mon_name, -1, TRUE);
1122 if (is_original_ap_and_seen(touched_ptr, m_ptr))
1124 atoffset(BIT_FLAGS, r_ptr, r_flags_offset) |= aura_flag;
1127 handle_stuff(touched_ptr);
1132 * @brief 敵オーラによるプレイヤーのダメージ処理(メイン)
1133 * @param m_ptr オーラを持つモンスターの構造体参照ポインタ
1134 * @param touched_ptr オーラを持つ相手に振れたクリーチャーの参照ポインタ
1137 static void touch_zap_player(monster_type *m_ptr, player_type *touched_ptr)
1139 touch_zap_player_aux(m_ptr, touched_ptr, touched_ptr->immune_fire, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_FIRE,
1140 fire_dam, _("突然とても熱くなった!", "You are suddenly very hot!"));
1141 touch_zap_player_aux(m_ptr, touched_ptr, touched_ptr->immune_cold, offsetof(monster_race, flags3), offsetof(monster_race, r_flags3), RF3_AURA_COLD,
1142 cold_dam, _("突然とても寒くなった!", "You are suddenly very cold!"));
1143 touch_zap_player_aux(m_ptr, touched_ptr, touched_ptr->immune_elec, offsetof(monster_race, flags2), offsetof(monster_race, r_flags2), RF2_AURA_ELEC,
1144 elec_dam, _("電撃をくらった!", "You get zapped!"));
1149 * @brief プレイヤーの変異要素による打撃処理
1150 * @param attacker_ptr プレーヤーへの参照ポインタ
1151 * @param m_idx 攻撃目標となったモンスターの参照ID
1152 * @param attack 変異要素による攻撃要素の種類
1153 * @param fear 攻撃を受けたモンスターが恐慌状態に陥ったかを返す参照ポインタ
1154 * @param mdeath 攻撃を受けたモンスターが死亡したかを返す参照ポインタ
1157 static void natural_attack(player_type *attacker_ptr, MONSTER_IDX m_idx, int attack, bool *fear, bool *mdeath)
1159 WEIGHT n_weight = 0;
1160 monster_type *m_ptr = &attacker_ptr->current_floor_ptr->m_list[m_idx];
1161 monster_race *r_ptr = &r_info[m_ptr->r_idx];
1163 int dice_num, dice_side;
1167 case MUT2_SCOR_TAIL:
1171 atk_desc = _("尻尾", "tail");
1178 atk_desc = _("角", "horns");
1185 atk_desc = _("クチバシ", "beak");
1192 atk_desc = _("象の鼻", "trunk");
1195 case MUT2_TENTACLES:
1199 atk_desc = _("触手", "tentacles");
1203 dice_num = dice_side = n_weight = 1;
1204 atk_desc = _("未定義の部位", "undefined body part");
1208 GAME_TEXT m_name[MAX_NLEN];
1209 monster_desc(attacker_ptr, m_name, m_ptr, 0);
1211 /* Calculate the "attack quality" */
1212 int bonus = attacker_ptr->to_h_m + (attacker_ptr->lev * 6 / 5);
1213 int chance = (attacker_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
1215 bool is_hit = !(r_ptr->flags2 & RF2_QUANTUM) || !randint0(2);
1216 is_hit &= test_hit_norm(attacker_ptr, chance, r_ptr->ac, m_ptr->ml);
1220 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
1225 msg_format(_("%sを%sで攻撃した。", "You hit %s with your %s."), m_name, atk_desc);
1227 HIT_POINT k = damroll(dice_num, dice_side);
1228 k = critical_norm(attacker_ptr, n_weight, bonus, k, (s16b)bonus, 0);
1230 /* Apply the player damage bonuses */
1231 k += attacker_ptr->to_d_m;
1233 /* No negative damage */
1236 /* Modify the damage */
1237 k = mon_damage_mod(attacker_ptr, m_ptr, k, FALSE);
1239 /* Complex message */
1240 msg_format_wizard(CHEAT_MONSTER,
1241 _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"),
1242 k, m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
1244 /* Anger the monster */
1245 if (k > 0) anger_monster(attacker_ptr, m_ptr);
1247 /* Damage, check for fear and mdeath */
1250 case MUT2_SCOR_TAIL:
1251 project(attacker_ptr, 0, 0, m_ptr->fy, m_ptr->fx, k, GF_POIS, PROJECT_KILL, -1);
1252 *mdeath = (m_ptr->r_idx == 0);
1255 *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
1258 *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
1261 *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
1263 case MUT2_TENTACLES:
1264 *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
1267 *mdeath = mon_take_hit(attacker_ptr, m_idx, k, fear, NULL);
1270 touch_zap_player(m_ptr, attacker_ptr);
1274 * @brief プレイヤーの打撃処理サブルーチン /
1275 * Player attacks a (poor, defenseless) creature -RAK-
1278 * @param fear 攻撃を受けたモンスターが恐慌状態に陥ったかを返す参照ポインタ
1279 * @param mdeath 攻撃を受けたモンスターが死亡したかを返す参照ポインタ
1280 * @param hand 攻撃を行うための武器を持つ手
1281 * @param mode 発動中の剣術ID
1284 * If no "weapon" is available, then "punch" the monster one time.
1286 static void py_attack_aux(player_type *attacker_ptr, POSITION y, POSITION x, bool *fear, bool *mdeath, s16b hand, COMBAT_OPTION_IDX mode)
1288 int num = 0, bonus, chance, vir;
1291 floor_type *floor_ptr = attacker_ptr->current_floor_ptr;
1292 grid_type *g_ptr = &floor_ptr->grid_array[y][x];
1294 monster_type *m_ptr = &floor_ptr->m_list[g_ptr->m_idx];
1295 monster_race *r_ptr = &r_info[m_ptr->r_idx];
1297 /* Access the weapon */
1298 object_type *o_ptr = &attacker_ptr->inventory_list[INVEN_RARM + hand];
1300 GAME_TEXT m_name[MAX_NLEN];
1302 bool success_hit = FALSE;
1303 bool backstab = FALSE;
1304 bool vorpal_cut = FALSE;
1305 int chaos_effect = 0;
1306 bool stab_fleeing = FALSE;
1307 bool fuiuchi = FALSE;
1308 bool monk_attack = FALSE;
1309 bool do_quake = FALSE;
1311 bool drain_msg = TRUE;
1312 int drain_result = 0, drain_heal = 0;
1313 bool can_drain = FALSE;
1315 int drain_left = MAX_VAMPIRIC_DRAIN;
1316 BIT_FLAGS flgs[TR_FLAG_SIZE]; /* A massive hack -- life-draining weapons */
1317 bool is_human = (r_ptr->d_char == 'p');
1318 bool is_lowlevel = (r_ptr->level < (attacker_ptr->lev - 15));
1319 bool zantetsu_mukou, e_j_mukou;
1321 switch (attacker_ptr->pclass)
1325 if (has_melee_weapon(attacker_ptr, INVEN_RARM + hand) && !attacker_ptr->icky_wield[hand])
1327 int tmp = attacker_ptr->lev * 6 + (attacker_ptr->skill_stl + 10) * 4;
1328 if (attacker_ptr->monlite && (mode != HISSATSU_NYUSIN)) tmp /= 3;
1329 if (attacker_ptr->cursed & TRC_AGGRAVATE) tmp /= 2;
1330 if (r_ptr->level > (attacker_ptr->lev * attacker_ptr->lev / 20 + 10)) tmp /= 3;
1331 if (MON_CSLEEP(m_ptr) && m_ptr->ml)
1333 /* Can't backstab creatures that we can't see, right? */
1336 else if ((attacker_ptr->special_defense & NINJA_S_STEALTH) && (randint0(tmp) > (r_ptr->level + 20)) && m_ptr->ml && !(r_ptr->flagsr & RFR_RES_ALL))
1340 else if (MON_MONFEAR(m_ptr) && m_ptr->ml)
1342 stab_fleeing = TRUE;
1349 case CLASS_FORCETRAINER:
1350 case CLASS_BERSERKER:
1351 if ((empty_hands(attacker_ptr, TRUE) & EMPTY_HAND_RARM) && !attacker_ptr->riding) monk_attack = TRUE;
1355 if (!o_ptr->k_idx) /* Empty hand */
1357 if ((r_ptr->level + 10) > attacker_ptr->lev)
1359 if (attacker_ptr->skill_exp[GINOU_SUDE] < s_info[attacker_ptr->pclass].s_max[GINOU_SUDE])
1361 if (attacker_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_BEGINNER)
1362 attacker_ptr->skill_exp[GINOU_SUDE] += 40;
1363 else if ((attacker_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_SKILLED))
1364 attacker_ptr->skill_exp[GINOU_SUDE] += 5;
1365 else if ((attacker_ptr->skill_exp[GINOU_SUDE] < WEAPON_EXP_EXPERT) && (attacker_ptr->lev > 19))
1366 attacker_ptr->skill_exp[GINOU_SUDE] += 1;
1367 else if ((attacker_ptr->lev > 34))
1368 if (one_in_(3)) attacker_ptr->skill_exp[GINOU_SUDE] += 1;
1369 attacker_ptr->update |= (PU_BONUS);
1373 else if (object_is_melee_weapon(o_ptr))
1375 if ((r_ptr->level + 10) > attacker_ptr->lev)
1377 OBJECT_TYPE_VALUE tval = attacker_ptr->inventory_list[INVEN_RARM + hand].tval - TV_WEAPON_BEGIN;
1378 OBJECT_SUBTYPE_VALUE sval = attacker_ptr->inventory_list[INVEN_RARM + hand].sval;
1379 int now_exp = attacker_ptr->weapon_exp[tval][sval];
1380 if (now_exp < s_info[attacker_ptr->pclass].w_max[tval][sval])
1383 if (now_exp < WEAPON_EXP_BEGINNER) amount = 80;
1384 else if (now_exp < WEAPON_EXP_SKILLED) amount = 10;
1385 else if ((now_exp < WEAPON_EXP_EXPERT) && (attacker_ptr->lev > 19)) amount = 1;
1386 else if ((attacker_ptr->lev > 34) && one_in_(2)) amount = 1;
1387 attacker_ptr->weapon_exp[tval][sval] += amount;
1388 attacker_ptr->update |= (PU_BONUS);
1393 /* Disturb the monster */
1394 (void)set_monster_csleep(attacker_ptr, g_ptr->m_idx, 0);
1396 monster_desc(attacker_ptr, m_name, m_ptr, 0);
1398 /* Calculate the "attack quality" */
1399 bonus = attacker_ptr->to_h[hand] + o_ptr->to_h;
1400 chance = (attacker_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
1401 if (mode == HISSATSU_IAI) chance += 60;
1402 if (attacker_ptr->special_defense & KATA_KOUKIJIN) chance += 150;
1403 if (attacker_ptr->sutemi) chance = MAX(chance * 3 / 2, chance + 60);
1405 vir = virtue_number(attacker_ptr, V_VALOUR);
1408 chance += (attacker_ptr->virtues[vir - 1] / 10);
1411 zantetsu_mukou = ((o_ptr->name1 == ART_ZANTETSU) && (r_ptr->d_char == 'j'));
1412 e_j_mukou = ((o_ptr->name1 == ART_EXCALIBUR_J) && (r_ptr->d_char == 'S'));
1414 if ((mode == HISSATSU_KYUSHO) || (mode == HISSATSU_MINEUCHI) || (mode == HISSATSU_3DAN) || (mode == HISSATSU_IAI)) num_blow = 1;
1415 else if (mode == HISSATSU_COLD) num_blow = attacker_ptr->num_blow[hand] + 2;
1416 else num_blow = attacker_ptr->num_blow[hand];
1418 /* Hack -- DOKUBARI always hit once */
1419 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) num_blow = 1;
1421 /* Attack once for each legal blow */
1422 while ((num++ < num_blow) && !attacker_ptr->is_dead)
1424 if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) || (mode == HISSATSU_KYUSHO))
1428 if (attacker_ptr->migite && attacker_ptr->hidarite)
1432 if (mode == HISSATSU_3DAN)
1437 success_hit = one_in_(n);
1439 else if ((attacker_ptr->pclass == CLASS_NINJA) && ((backstab || fuiuchi) && !(r_ptr->flagsr & RFR_RES_ALL))) success_hit = TRUE;
1440 else success_hit = test_hit_norm(attacker_ptr, chance, r_ptr->ac, m_ptr->ml);
1442 if (mode == HISSATSU_MAJIN)
1445 success_hit = FALSE;
1450 backstab = FALSE; /* Clumsy! */
1451 fuiuchi = FALSE; /* Clumsy! */
1453 if ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE) && one_in_(3))
1455 BIT_FLAGS flgs_aux[TR_FLAG_SIZE];
1459 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
1460 msg_print(_("振り回した大鎌が自分自身に返ってきた!", "Your scythe returns to you!"));
1461 object_flags(o_ptr, flgs_aux);
1463 k = damroll(o_ptr->dd + attacker_ptr->to_dd[hand], o_ptr->ds + attacker_ptr->to_ds[hand]);
1466 switch (attacker_ptr->mimic_form)
1469 switch (attacker_ptr->prace)
1476 case RACE_BARBARIAN:
1480 case RACE_HALF_TROLL:
1481 case RACE_HALF_OGRE:
1482 case RACE_HALF_GIANT:
1483 case RACE_HALF_TITAN:
1491 case RACE_DRACONIAN:
1498 case MIMIC_DEMON_LORD:
1505 if (attacker_ptr->align < 0 && mult < 20)
1507 if (!(attacker_ptr->resist_acid || is_oppose_acid(attacker_ptr) || attacker_ptr->immune_acid) && (mult < 25))
1509 if (!(attacker_ptr->resist_elec || is_oppose_elec(attacker_ptr) || attacker_ptr->immune_elec) && (mult < 25))
1511 if (!(attacker_ptr->resist_fire || is_oppose_fire(attacker_ptr) || attacker_ptr->immune_fire) && (mult < 25))
1513 if (!(attacker_ptr->resist_cold || is_oppose_cold(attacker_ptr) || attacker_ptr->immune_cold) && (mult < 25))
1515 if (!(attacker_ptr->resist_pois || is_oppose_pois(attacker_ptr)) && (mult < 25))
1518 if ((attacker_ptr->pclass != CLASS_SAMURAI) && (have_flag(flgs_aux, TR_FORCE_WEAPON)) && (attacker_ptr->csp > (attacker_ptr->msp / 30)))
1520 attacker_ptr->csp -= (1 + (attacker_ptr->msp / 30));
1521 attacker_ptr->redraw |= (PR_MANA);
1522 mult = mult * 3 / 2 + 20;
1524 k *= (HIT_POINT)mult;
1528 k = critical_norm(attacker_ptr, o_ptr->weight, o_ptr->to_h, k, attacker_ptr->to_h[hand], mode);
1532 msg_format(_("グッサリ切り裂かれた!", "Your weapon cuts deep into yourself!"));
1533 /* Try to increase the damage */
1539 k *= (HIT_POINT)mult;
1541 k += (attacker_ptr->to_d[hand] + o_ptr->to_d);
1544 take_hit(attacker_ptr, DAMAGE_FORCE, k, _("死の大鎌", "Death scythe"), -1);
1545 handle_stuff(attacker_ptr);
1550 msg_format(_("ミス! %sにかわされた。", "You miss %s."), m_name);
1556 int vorpal_chance = ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD)) ? 2 : 4;
1560 if (backstab) msg_format(_("あなたは冷酷にも眠っている無力な%sを突き刺した!", "You cruelly stab the helpless, sleeping %s!"), m_name);
1561 else if (fuiuchi) msg_format(_("不意を突いて%sに強烈な一撃を喰らわせた!", "You make surprise attack, and hit %s with a powerful blow!"), m_name);
1562 else if (stab_fleeing) msg_format(_("逃げる%sを背中から突き刺した!", "You backstab the fleeing %s!"), m_name);
1563 else if (!monk_attack) msg_format(_("%sを攻撃した。", "You hit %s."), m_name);
1565 /* Hack -- bare hands do one damage */
1568 object_flags(o_ptr, flgs);
1570 /* Select a chaotic effect (50% chance) */
1571 if ((have_flag(flgs, TR_CHAOTIC)) && one_in_(2))
1574 chg_virtue(attacker_ptr, V_CHANCE, 1);
1576 if (randint1(5) < 3)
1578 /* Vampiric (20%) */
1581 else if (one_in_(250))
1586 else if (!one_in_(10))
1588 /* Confusion (26.892%) */
1591 else if (one_in_(2))
1593 /* Teleport away (1.494%) */
1598 /* Polymorph (1.494%) */
1603 /* Vampiric drain */
1604 if ((have_flag(flgs, TR_VAMPIRIC)) || (chaos_effect == 1) || (mode == HISSATSU_DRAIN) || hex_spelling(attacker_ptr, HEX_VAMP_BLADE))
1606 /* Only drain "living" monsters */
1607 if (monster_living(m_ptr->r_idx))
1613 if ((have_flag(flgs, TR_VORPAL) || hex_spelling(attacker_ptr, HEX_RUNESWORD)) && (randint1(vorpal_chance * 3 / 2) == 1) && !zantetsu_mukou)
1615 else vorpal_cut = FALSE;
1619 int special_effect = 0, stun_effect = 0, times = 0, max_times;
1621 const martial_arts *ma_ptr = &ma_blows[0], *old_ptr = &ma_blows[0];
1622 int resist_stun = 0;
1625 if (r_ptr->flags1 & RF1_UNIQUE) resist_stun += 88;
1626 if (r_ptr->flags3 & RF3_NO_STUN) resist_stun += 66;
1627 if (r_ptr->flags3 & RF3_NO_CONF) resist_stun += 33;
1628 if (r_ptr->flags3 & RF3_NO_SLEEP) resist_stun += 33;
1629 if ((r_ptr->flags3 & RF3_UNDEAD) || (r_ptr->flags3 & RF3_NONLIVING))
1632 if (attacker_ptr->special_defense & KAMAE_BYAKKO)
1633 max_times = (attacker_ptr->lev < 3 ? 1 : attacker_ptr->lev / 3);
1634 else if (attacker_ptr->special_defense & KAMAE_SUZAKU)
1636 else if (attacker_ptr->special_defense & KAMAE_GENBU)
1639 max_times = (attacker_ptr->lev < 7 ? 1 : attacker_ptr->lev / 7);
1640 /* Attempt 'times' */
1641 for (times = 0; times < max_times; times++)
1645 ma_ptr = &ma_blows[randint0(MAX_MA)];
1646 if ((attacker_ptr->pclass == CLASS_FORCETRAINER) && (ma_ptr->min_level > 1)) min_level = ma_ptr->min_level + 3;
1647 else min_level = ma_ptr->min_level;
1648 } while ((min_level > attacker_ptr->lev) ||
1649 (randint1(attacker_ptr->lev) < ma_ptr->chance));
1651 /* keep the highest level attack available we found */
1652 if ((ma_ptr->min_level > old_ptr->min_level) &&
1653 !attacker_ptr->stun && !attacker_ptr->confused)
1657 if (current_world_ptr->wizard && cheat_xtra)
1659 msg_print(_("攻撃を再選択しました。", "Attack re-selected."));
1668 if (attacker_ptr->pclass == CLASS_FORCETRAINER) min_level = MAX(1, ma_ptr->min_level - 3);
1669 else min_level = ma_ptr->min_level;
1670 k = damroll(ma_ptr->dd + attacker_ptr->to_dd[hand], ma_ptr->ds + attacker_ptr->to_ds[hand]);
1671 if (attacker_ptr->special_attack & ATTACK_SUIKEN) k *= 2;
1673 if (ma_ptr->effect == MA_KNEE)
1675 if (r_ptr->flags1 & RF1_MALE)
1677 msg_format(_("%sに金的膝蹴りをくらわした!", "You hit %s in the groin with your knee!"), m_name);
1679 special_effect = MA_KNEE;
1682 msg_format(ma_ptr->desc, m_name);
1685 else if (ma_ptr->effect == MA_SLOW)
1687 if (!((r_ptr->flags1 & RF1_NEVER_MOVE) ||
1688 my_strchr("~#{}.UjmeEv$,DdsbBFIJQSXclnw!=?", r_ptr->d_char)))
1690 msg_format(_("%sの足首に関節蹴りをくらわした!", "You kick %s in the ankle."), m_name);
1691 special_effect = MA_SLOW;
1693 else msg_format(ma_ptr->desc, m_name);
1699 stun_effect = (ma_ptr->effect / 2) + randint1(ma_ptr->effect / 2);
1702 msg_format(ma_ptr->desc, m_name);
1705 if (attacker_ptr->special_defense & KAMAE_SUZAKU) weight = 4;
1706 if ((attacker_ptr->pclass == CLASS_FORCETRAINER) && P_PTR_KI)
1708 weight += (P_PTR_KI / 30);
1709 if (weight > 20) weight = 20;
1712 k = critical_norm(attacker_ptr, attacker_ptr->lev * weight, min_level, k, attacker_ptr->to_h[0], 0);
1714 if ((special_effect == MA_KNEE) && ((k + attacker_ptr->to_d[hand]) < m_ptr->hp))
1716 msg_format(_("%^sは苦痛にうめいている!", "%^s moans in agony!"), m_name);
1717 stun_effect = 7 + randint1(13);
1721 else if ((special_effect == MA_SLOW) && ((k + attacker_ptr->to_d[hand]) < m_ptr->hp))
1723 if (!(r_ptr->flags1 & RF1_UNIQUE) &&
1724 (randint1(attacker_ptr->lev) > r_ptr->level) &&
1727 msg_format(_("%^sは足をひきずり始めた。", "%^s starts limping slower."), m_name);
1728 m_ptr->mspeed -= 10;
1732 if (stun_effect && ((k + attacker_ptr->to_d[hand]) < m_ptr->hp))
1734 if (attacker_ptr->lev > randint1(r_ptr->level + resist_stun + 10))
1736 if (set_monster_stunned(attacker_ptr, g_ptr->m_idx, stun_effect + MON_STUNNED(m_ptr)))
1738 msg_format(_("%^sはフラフラになった。", "%^s is stunned."), m_name);
1742 msg_format(_("%^sはさらにフラフラになった。", "%^s is more stunned."), m_name);
1748 /* Handle normal weapon */
1749 else if (o_ptr->k_idx)
1751 k = damroll(o_ptr->dd + attacker_ptr->to_dd[hand], o_ptr->ds + attacker_ptr->to_ds[hand]);
1752 k = tot_dam_aux(attacker_ptr, o_ptr, k, m_ptr, mode, FALSE);
1756 k *= (3 + (attacker_ptr->lev / 20));
1760 k = k * (5 + (attacker_ptr->lev * 2 / 25)) / 2;
1762 else if (stab_fleeing)
1767 if ((attacker_ptr->impact[hand] && ((k > 50) || one_in_(7))) ||
1768 (chaos_effect == 2) || (mode == HISSATSU_QUAKE))
1773 if ((!(o_ptr->tval == TV_SWORD) || !(o_ptr->sval == SV_POISON_NEEDLE)) && !(mode == HISSATSU_KYUSHO))
1774 k = critical_norm(attacker_ptr, o_ptr->weight, o_ptr->to_h, k, attacker_ptr->to_h[hand], mode);
1782 if ((o_ptr->name1 == ART_CHAINSWORD) && !one_in_(2))
1784 char chainsword_noise[1024];
1785 if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, chainsword_noise))
1787 msg_print(chainsword_noise);
1791 if (o_ptr->name1 == ART_VORPAL_BLADE)
1793 msg_print(_("目にも止まらぬヴォーパルブレード、手錬の早業!", "Your Vorpal Blade goes snicker-snack!"));
1797 msg_format(_("%sをグッサリ切り裂いた!", "Your weapon cuts deep into %s!"), m_name);
1800 /* Try to increase the damage */
1801 while (one_in_(vorpal_chance))
1806 k *= (HIT_POINT)mult;
1809 if (((r_ptr->flagsr & RFR_RES_ALL) ? k / 100 : k) > m_ptr->hp)
1811 msg_format(_("%sを真っ二つにした!", "You cut %s in half!"), m_name);
1817 case 2: msg_format(_("%sを斬った!", "You gouge %s!"), m_name); break;
1818 case 3: msg_format(_("%sをぶった斬った!", "You maim %s!"), m_name); break;
1819 case 4: msg_format(_("%sをメッタ斬りにした!", "You carve %s!"), m_name); break;
1820 case 5: msg_format(_("%sをメッタメタに斬った!", "You cleave %s!"), m_name); break;
1821 case 6: msg_format(_("%sを刺身にした!", "You smite %s!"), m_name); break;
1822 case 7: msg_format(_("%sを斬って斬って斬りまくった!", "You eviscerate %s!"), m_name); break;
1823 default: msg_format(_("%sを細切れにした!", "You shred %s!"), m_name); break;
1826 drain_result = drain_result * 3 / 2;
1830 drain_result += o_ptr->to_d;
1833 /* Apply the player damage bonuses */
1834 k += attacker_ptr->to_d[hand];
1835 drain_result += attacker_ptr->to_d[hand];
1837 if ((mode == HISSATSU_SUTEMI) || (mode == HISSATSU_3DAN)) k *= 2;
1838 if ((mode == HISSATSU_SEKIRYUKA) && !monster_living(m_ptr->r_idx)) k = 0;
1839 if ((mode == HISSATSU_SEKIRYUKA) && !attacker_ptr->cut) k /= 2;
1841 /* No negative damage */
1844 if ((mode == HISSATSU_ZANMA) && !(!monster_living(m_ptr->r_idx) && (r_ptr->flags3 & RF3_EVIL)))
1851 msg_print(_("こんな軟らかいものは切れん!", "You cannot cut such a elastic thing!"));
1857 msg_print(_("蜘蛛は苦手だ!", "Spiders are difficult for you to deal with!"));
1861 if (mode == HISSATSU_MINEUCHI)
1863 int tmp = (10 + randint1(15) + attacker_ptr->lev / 5);
1866 anger_monster(attacker_ptr, m_ptr);
1868 if (!(r_ptr->flags3 & (RF3_NO_STUN)))
1871 if (MON_STUNNED(m_ptr))
1873 msg_format(_("%sはひどくもうろうとした。", "%s is more dazed."), m_name);
1878 msg_format(_("%s はもうろうとした。", "%s is dazed."), m_name);
1882 (void)set_monster_stunned(attacker_ptr, g_ptr->m_idx, MON_STUNNED(m_ptr) + tmp);
1886 msg_format(_("%s には効果がなかった。", "%s is not effected."), m_name);
1890 /* Modify the damage */
1891 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))));
1892 if (((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) || (mode == HISSATSU_KYUSHO))
1894 if ((randint1(randint1(r_ptr->level / 7) + 5) == 1) && !(r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags7 & RF7_UNIQUE2))
1897 msg_format(_("%sの急所を突き刺した!", "You hit %s on a fatal spot!"), m_name);
1901 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)))
1903 int maxhp = maxroll(r_ptr->hdice, r_ptr->hside);
1904 if (one_in_(backstab ? 13 : (stab_fleeing || fuiuchi) ? 15 : 27))
1908 msg_format(_("刃が%sに深々と突き刺さった!", "You critically injured %s!"), m_name);
1910 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)))
1912 if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags7 & RF7_UNIQUE2) || (m_ptr->hp >= maxhp / 2))
1914 k = MAX(k * 5, m_ptr->hp / 2);
1916 msg_format(_("%sに致命傷を負わせた!", "You fatally injured %s!"), m_name);
1921 msg_format(_("刃が%sの急所を貫いた!", "You hit %s on a fatal spot!"), m_name);
1926 msg_format_wizard(CHEAT_MONSTER,
1927 _("%dのダメージを与えた。(残りHP %d/%d(%d))", "You do %d damage. (left HP %d/%d(%d))"), k,
1928 m_ptr->hp - k, m_ptr->maxhp, m_ptr->max_maxhp);
1930 if (k <= 0) can_drain = FALSE;
1932 if (drain_result > m_ptr->hp)
1933 drain_result = m_ptr->hp;
1935 /* Damage, check for fear and death */
1936 if (mon_take_hit(attacker_ptr, g_ptr->m_idx, k, fear, NULL))
1939 if ((attacker_ptr->pclass == CLASS_BERSERKER) && attacker_ptr->energy_use)
1941 if (attacker_ptr->migite && attacker_ptr->hidarite)
1943 if (hand) attacker_ptr->energy_use = attacker_ptr->energy_use * 3 / 5 + attacker_ptr->energy_use*num * 2 / (attacker_ptr->num_blow[hand] * 5);
1944 else attacker_ptr->energy_use = attacker_ptr->energy_use*num * 3 / (attacker_ptr->num_blow[hand] * 5);
1948 attacker_ptr->energy_use = attacker_ptr->energy_use*num / attacker_ptr->num_blow[hand];
1951 if ((o_ptr->name1 == ART_ZANTETSU) && is_lowlevel)
1952 msg_print(_("またつまらぬものを斬ってしまった...", "Sigh... Another trifling thing I've cut...."));
1956 /* Anger the monster */
1957 if (k > 0) anger_monster(attacker_ptr, m_ptr);
1959 touch_zap_player(m_ptr, attacker_ptr);
1961 /* Are we draining it? A little note: If the monster is
1962 dead, the drain does not work... */
1964 if (can_drain && (drain_result > 0))
1966 if (o_ptr->name1 == ART_MURAMASA)
1970 HIT_PROB to_h = o_ptr->to_h;
1971 HIT_POINT to_d = o_ptr->to_d;
1975 for (i = 0; i < to_h + 3; i++) if (one_in_(4)) flag = 0;
1979 for (i = 0; i < to_d + 3; i++) if (one_in_(4)) flag = 0;
1982 if (o_ptr->to_h != to_h || o_ptr->to_d != to_d)
1984 msg_print(_("妖刀は血を吸って強くなった!", "Muramasa sucked blood, and became more powerful!"));
1992 if (drain_result > 5) /* Did we really hurt it? */
1994 drain_heal = damroll(2, drain_result / 6);
1996 if (hex_spelling(attacker_ptr, HEX_VAMP_BLADE)) drain_heal *= 2;
2000 msg_format(_("Draining left: %d", "Draining left: %d"), drain_left);
2005 if (drain_heal < drain_left)
2007 drain_left -= drain_heal;
2011 drain_heal = drain_left;
2017 msg_format(_("刃が%sから生命力を吸い取った!", "Your weapon drains life from %s!"), m_name);
2021 drain_heal = (drain_heal * attacker_ptr->mutant_regenerate_mod) / 100;
2023 hp_player(attacker_ptr, drain_heal);
2024 /* We get to keep some of it! */
2029 m_ptr->maxhp -= (k + 7) / 8;
2030 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
2031 if (m_ptr->maxhp < 1) m_ptr->maxhp = 1;
2038 /* Confusion attack */
2039 if ((attacker_ptr->special_attack & ATTACK_CONFUSE) || (chaos_effect == 3) || (mode == HISSATSU_CONF) || hex_spelling(attacker_ptr, HEX_CONFUSION))
2041 /* Cancel glowing hands */
2042 if (attacker_ptr->special_attack & ATTACK_CONFUSE)
2044 attacker_ptr->special_attack &= ~(ATTACK_CONFUSE);
2045 msg_print(_("手の輝きがなくなった。", "Your hands stop glowing."));
2046 attacker_ptr->redraw |= (PR_STATUS);
2050 /* Confuse the monster */
2051 if (r_ptr->flags3 & RF3_NO_CONF)
2053 if (is_original_ap_and_seen(attacker_ptr, m_ptr)) r_ptr->r_flags3 |= RF3_NO_CONF;
2054 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
2057 else if (randint0(100) < r_ptr->level)
2059 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
2063 msg_format(_("%^sは混乱したようだ。", "%^s appears confused."), m_name);
2064 (void)set_monster_confused(attacker_ptr, g_ptr->m_idx, MON_CONFUSED(m_ptr) + 10 + randint0(attacker_ptr->lev) / 5);
2068 else if (chaos_effect == 4)
2070 bool resists_tele = FALSE;
2072 if (r_ptr->flagsr & RFR_RES_TELE)
2074 if (r_ptr->flags1 & RF1_UNIQUE)
2076 if (is_original_ap_and_seen(attacker_ptr, m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
2077 msg_format(_("%^sには効果がなかった。", "%^s is unaffected!"), m_name);
2078 resists_tele = TRUE;
2080 else if (r_ptr->level > randint1(100))
2082 if (is_original_ap_and_seen(attacker_ptr, m_ptr)) r_ptr->r_flagsr |= RFR_RES_TELE;
2083 msg_format(_("%^sは抵抗力を持っている!", "%^s resists!"), m_name);
2084 resists_tele = TRUE;
2090 msg_format(_("%^sは消えた!", "%^s disappears!"), m_name);
2091 teleport_away(attacker_ptr, g_ptr->m_idx, 50, TELEPORT_PASSIVE);
2092 num = num_blow + 1; /* Can't hit it anymore! */
2097 else if ((chaos_effect == 5) && (randint1(90) > r_ptr->level))
2099 if (!(r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) &&
2100 !(r_ptr->flagsr & RFR_EFF_RES_CHAO_MASK))
2102 if (polymorph_monster(attacker_ptr, y, x))
2104 msg_format(_("%^sは変化した!", "%^s changes!"), m_name);
2110 msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), m_name);
2113 /* Hack -- Get new monster */
2114 m_ptr = &floor_ptr->m_list[g_ptr->m_idx];
2116 /* Oops, we need a different name... */
2117 monster_desc(attacker_ptr, m_name, m_ptr, 0);
2119 /* Hack -- Get new race */
2120 r_ptr = &r_info[m_ptr->r_idx];
2123 else if (o_ptr->name1 == ART_G_HAMMER)
2125 monster_type *target_ptr = &floor_ptr->m_list[g_ptr->m_idx];
2127 if (target_ptr->hold_o_idx)
2129 object_type *q_ptr = &floor_ptr->o_list[target_ptr->hold_o_idx];
2130 GAME_TEXT o_name[MAX_NLEN];
2132 object_desc(attacker_ptr, o_name, q_ptr, OD_NAME_ONLY);
2133 q_ptr->held_m_idx = 0;
2134 q_ptr->marked = OM_TOUCHED;
2135 target_ptr->hold_o_idx = q_ptr->next_o_idx;
2136 q_ptr->next_o_idx = 0;
2137 msg_format(_("%sを奪った。", "You snatched %s."), o_name);
2138 inven_carry(attacker_ptr, q_ptr);
2146 if (weak && !(*mdeath))
2148 msg_format(_("%sは弱くなったようだ。", "%^s seems weakened."), m_name);
2151 if ((drain_left != MAX_VAMPIRIC_DRAIN) && one_in_(4))
2153 chg_virtue(attacker_ptr, V_UNLIFE, 1);
2157 k -- apply earthquake brand */
2160 earthquake(attacker_ptr, attacker_ptr->y, attacker_ptr->x, 10, 0);
2161 if (!floor_ptr->grid_array[y][x].m_idx) *mdeath = TRUE;
2167 * @brief プレイヤーの打撃処理メインルーチン
2170 * @param mode 発動中の剣術ID
2171 * @return 実際に攻撃処理が行われた場合TRUEを返す。
2173 * If no "weapon" is available, then "punch" the monster one time.
2175 bool py_attack(player_type *attacker_ptr, POSITION y, POSITION x, COMBAT_OPTION_IDX mode)
2177 grid_type *g_ptr = &attacker_ptr->current_floor_ptr->grid_array[y][x];
2178 monster_type *m_ptr = &attacker_ptr->current_floor_ptr->m_list[g_ptr->m_idx];
2179 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2180 GAME_TEXT m_name[MAX_NLEN];
2182 disturb(attacker_ptr, FALSE, TRUE);
2184 take_turn(attacker_ptr, 100);
2186 if (!attacker_ptr->migite && !attacker_ptr->hidarite &&
2187 !(attacker_ptr->muta2 & (MUT2_HORNS | MUT2_BEAK | MUT2_SCOR_TAIL | MUT2_TRUNK | MUT2_TENTACLES)))
2189 msg_format(_("%s攻撃できない。", "You cannot do attacking."),
2190 (empty_hands(attacker_ptr, FALSE) == EMPTY_HAND_NONE) ? _("両手がふさがって", "") : "");
2194 monster_desc(attacker_ptr, m_name, m_ptr, 0);
2198 /* Auto-Recall if possible and visible */
2199 if (!attacker_ptr->image) monster_race_track(attacker_ptr, m_ptr->ap_r_idx);
2201 health_track(attacker_ptr, g_ptr->m_idx);
2204 if ((r_ptr->flags1 & RF1_FEMALE) &&
2205 !(attacker_ptr->stun || attacker_ptr->confused || attacker_ptr->image || !m_ptr->ml))
2207 if ((attacker_ptr->inventory_list[INVEN_RARM].name1 == ART_ZANTETSU) || (attacker_ptr->inventory_list[INVEN_LARM].name1 == ART_ZANTETSU))
2209 msg_print(_("拙者、おなごは斬れぬ!", "I can not attack women!"));
2214 if (d_info[attacker_ptr->dungeon_idx].flags1 & DF1_NO_MELEE)
2216 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));
2220 /* Stop if friendly */
2221 bool stormbringer = FALSE;
2222 if (!is_hostile(m_ptr) &&
2223 !(attacker_ptr->stun || attacker_ptr->confused || attacker_ptr->image ||
2224 attacker_ptr->shero || !m_ptr->ml))
2226 if (attacker_ptr->inventory_list[INVEN_RARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
2227 if (attacker_ptr->inventory_list[INVEN_LARM].name1 == ART_STORMBRINGER) stormbringer = TRUE;
2230 msg_format(_("黒い刃は強欲に%sを攻撃した!", "Your black blade greedily attacks %s!"), m_name);
2231 chg_virtue(attacker_ptr, V_INDIVIDUALISM, 1);
2232 chg_virtue(attacker_ptr, V_HONOUR, -1);
2233 chg_virtue(attacker_ptr, V_JUSTICE, -1);
2234 chg_virtue(attacker_ptr, V_COMPASSION, -1);
2236 else if (attacker_ptr->pclass != CLASS_BERSERKER)
2238 if (get_check(_("本当に攻撃しますか?", "Really hit it? ")))
2240 chg_virtue(attacker_ptr, V_INDIVIDUALISM, 1);
2241 chg_virtue(attacker_ptr, V_HONOUR, -1);
2242 chg_virtue(attacker_ptr, V_JUSTICE, -1);
2243 chg_virtue(attacker_ptr, V_COMPASSION, -1);
2247 msg_format(_("%sを攻撃するのを止めた。", "You stop to avoid hitting %s."), m_name);
2253 /* Handle player fear */
2254 if (attacker_ptr->afraid)
2257 msg_format(_("恐くて%sを攻撃できない!", "You are too afraid to attack %s!"), m_name);
2259 msg_format(_("そっちには何か恐いものがいる!", "There is something scary in your way!"));
2261 /* Disturb the monster */
2262 (void)set_monster_csleep(attacker_ptr, g_ptr->m_idx, 0);
2267 if (MON_CSLEEP(m_ptr)) /* It is not honorable etc to attack helpless victims */
2269 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(attacker_ptr, V_COMPASSION, -1);
2270 if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(attacker_ptr, V_HONOUR, -1);
2273 if (attacker_ptr->migite && attacker_ptr->hidarite)
2275 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))
2277 if (attacker_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_BEGINNER)
2278 attacker_ptr->skill_exp[GINOU_NITOURYU] += 80;
2279 else if (attacker_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_SKILLED)
2280 attacker_ptr->skill_exp[GINOU_NITOURYU] += 4;
2281 else if (attacker_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_EXPERT)
2282 attacker_ptr->skill_exp[GINOU_NITOURYU] += 1;
2283 else if (attacker_ptr->skill_exp[GINOU_NITOURYU] < WEAPON_EXP_MASTER)
2284 if (one_in_(3)) attacker_ptr->skill_exp[GINOU_NITOURYU] += 1;
2285 attacker_ptr->update |= (PU_BONUS);
2289 /* Gain riding experience */
2290 if (attacker_ptr->riding)
2292 int cur = attacker_ptr->skill_exp[GINOU_RIDING];
2293 int max = s_info[attacker_ptr->pclass].s_max[GINOU_RIDING];
2297 DEPTH ridinglevel = r_info[attacker_ptr->current_floor_ptr->m_list[attacker_ptr->riding].r_idx].level;
2298 DEPTH targetlevel = r_ptr->level;
2301 if ((cur / 200 - 5) < targetlevel)
2304 /* Extra experience */
2305 if ((cur / 100) < ridinglevel)
2307 if ((cur / 100 + 15) < ridinglevel)
2308 inc += 1 + (ridinglevel - (cur / 100 + 15));
2313 attacker_ptr->skill_exp[GINOU_RIDING] = MIN(max, cur + inc);
2314 attacker_ptr->update |= (PU_BONUS);
2318 attacker_ptr->riding_t_m_idx = g_ptr->m_idx;
2320 bool mdeath = FALSE;
2321 if (attacker_ptr->migite) py_attack_aux(attacker_ptr, y, x, &fear, &mdeath, 0, mode);
2322 if (attacker_ptr->hidarite && !mdeath) py_attack_aux(attacker_ptr, y, x, &fear, &mdeath, 1, mode);
2324 /* Mutations which yield extra 'natural' attacks */
2327 if ((attacker_ptr->muta2 & MUT2_HORNS) && !mdeath)
2328 natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_HORNS, &fear, &mdeath);
2329 if ((attacker_ptr->muta2 & MUT2_BEAK) && !mdeath)
2330 natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_BEAK, &fear, &mdeath);
2331 if ((attacker_ptr->muta2 & MUT2_SCOR_TAIL) && !mdeath)
2332 natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_SCOR_TAIL, &fear, &mdeath);
2333 if ((attacker_ptr->muta2 & MUT2_TRUNK) && !mdeath)
2334 natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_TRUNK, &fear, &mdeath);
2335 if ((attacker_ptr->muta2 & MUT2_TENTACLES) && !mdeath)
2336 natural_attack(attacker_ptr, g_ptr->m_idx, MUT2_TENTACLES, &fear, &mdeath);
2339 /* Hack -- delay fear messages */
2340 if (fear && m_ptr->ml && !mdeath)
2344 msg_format(_("%^sは恐怖して逃げ出した!", "%^s flees in terror!"), m_name);
2347 if ((attacker_ptr->special_defense & KATA_IAI) && ((mode != HISSATSU_IAI) || mdeath))
2349 set_action(attacker_ptr, ACTION_NONE);
2357 * @brief モンスターからプレイヤーへの打撃処理 / Attack the player via physical attacks.
2358 * @param m_idx 打撃を行うモンスターのID
2359 * @return 実際に攻撃処理を行った場合TRUEを返す
2361 bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx)
2363 floor_type *floor_ptr = target_ptr->current_floor_ptr;
2364 monster_type *m_ptr = &floor_ptr->m_list[m_idx];
2365 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2370 int do_cut, do_stun;
2374 GAME_TEXT o_name[MAX_NLEN];
2375 GAME_TEXT m_name[MAX_NLEN];
2376 GAME_TEXT ddesc[80];
2379 bool touched = FALSE, fear = FALSE, alive = TRUE;
2380 bool explode = FALSE;
2381 bool do_silly_attack = (one_in_(2) && target_ptr->image);
2382 HIT_POINT get_damage = 0;
2383 int abbreviate = 0; // 2回目以降の省略表現フラグ
2385 /* Not allowed to attack */
2386 if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return FALSE;
2388 if (d_info[target_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) return FALSE;
2390 /* ...nor if friendly */
2391 if (!is_hostile(m_ptr)) return FALSE;
2393 /* Extract the effective monster level */
2394 rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
2396 /* Get the monster name (or "it") */
2397 monster_desc(target_ptr, m_name, m_ptr, 0);
2399 monster_desc(target_ptr, ddesc, m_ptr, MD_WRONGDOER_NAME);
2401 if (target_ptr->special_defense & KATA_IAI)
2403 msg_format(_("相手が襲いかかる前に素早く武器を振るった。", "You took sen, draw and cut in one motion before %s moved."), m_name);
2404 if (py_attack(target_ptr, m_ptr->fy, m_ptr->fx, HISSATSU_IAI)) return TRUE;
2407 if ((target_ptr->special_defense & NINJA_KAWARIMI) && (randint0(55) < (target_ptr->lev*3/5+20)))
2409 if (kawarimi(target_ptr, TRUE)) return TRUE;
2412 /* Assume no blink */
2415 /* Scan through all four blows */
2416 for (int ap_cnt = 0; ap_cnt < 4; ap_cnt++)
2418 bool obvious = FALSE;
2420 HIT_POINT power = 0;
2421 HIT_POINT damage = 0;
2425 /* Extract the attack infomation */
2426 int effect = r_ptr->blow[ap_cnt].effect;
2427 int method = r_ptr->blow[ap_cnt].method;
2428 int d_dice = r_ptr->blow[ap_cnt].d_dice;
2429 int d_side = r_ptr->blow[ap_cnt].d_side;
2431 if (!monster_is_valid(m_ptr)) break;
2433 /* Hack -- no more attacks */
2436 if (is_pet(m_ptr) && (r_ptr->flags1 & RF1_UNIQUE) && (method == RBM_EXPLODE))
2442 /* Stop if player is dead or gone */
2443 if (!target_ptr->playing || target_ptr->is_dead) break;
2444 if (distance(target_ptr->y, target_ptr->x, m_ptr->fy, m_ptr->fx) > 1) break;
2446 /* Handle "leaving" */
2447 if (target_ptr->leaving) break;
2449 if (method == RBM_SHOOT) continue;
2451 /* Extract the attack "power" */
2452 power = mbe_info[effect].power;
2455 ac = target_ptr->ac + target_ptr->to_a;
2457 /* Monster hits player */
2458 if (!effect || check_hit(target_ptr, power, rlev, MON_STUNNED(m_ptr)))
2460 /* Always disturbing */
2461 disturb(target_ptr, TRUE, TRUE);
2464 /* Hack -- Apply "protection from evil" */
2465 if ((target_ptr->protevil > 0) &&
2466 (r_ptr->flags3 & RF3_EVIL) &&
2467 (target_ptr->lev >= rlev) &&
2468 ((randint0(100) + target_ptr->lev) > 50))
2470 /* Remember the Evil-ness */
2471 if (is_original_ap_and_seen(target_ptr, m_ptr)) r_ptr->r_flags3 |= RF3_EVIL;
2474 if (abbreviate) msg_format("撃退した。");
2475 else msg_format("%^sは撃退された。", m_name);
2476 abbreviate = 1; /*2回目以降は省略 */
2478 msg_format("%^s is repelled.", m_name);
2484 /* Assume no cut or stun */
2485 do_cut = do_stun = 0;
2487 /* Describe the attack method */
2492 act = _("殴られた。", "hits you.");
2493 do_cut = do_stun = 1;
2501 act = _("触られた。", "touches you.");
2509 act = _("パンチされた。", "punches you.");
2518 act = _("蹴られた。", "kicks you.");
2527 act = _("ひっかかれた。", "claws you.");
2536 act = _("噛まれた。", "bites you.");
2545 act = _("刺された。", "stings you.");
2553 act = _("斬られた。", "slashes you.");
2562 act = _("角で突かれた。", "butts you.");
2571 act = _("体当たりされた。", "crushes you.");
2580 act = _("飲み込まれた。", "engulfs you.");
2589 act = _("は請求書をよこした。", "charges you.");
2591 sound(SOUND_BUY); /* Note! This is "charges", not "charges at". */
2598 act = _("が体の上を這い回った。", "crawls on you.");
2606 act = _("よだれをたらされた。", "drools on you.");
2613 act = _("唾を吐かれた。", "spits on you.");
2621 act = _("は爆発した。", "explodes.");
2628 act = _("にらまれた。", "gazes at you.");
2634 act = _("泣き叫ばれた。", "wails at you.");
2641 act = _("胞子を飛ばされた。", "releases spores at you.");
2649 act = _("が XXX4 を発射した。", "projects XXX4's at you.");
2655 act = _("金をせがまれた。", "begs you for money.");
2665 act = desc_insult[randint0(m_ptr->r_idx == MON_DEBBY ? 10 : 8)];
2675 act = desc_moan[randint0(4)];
2685 if (m_ptr->r_idx == MON_JAIAN)
2688 switch(randint1(15))
2693 act = "「♪お~れはジャイアン~~ガ~キだいしょう~」";
2696 act = "「♪て~んかむ~てきのお~とこだぜ~~」";
2699 act = "「♪の~び太スネ夫はメじゃないよ~~」";
2702 act = "「♪け~んかスポ~ツ~どんとこい~」";
2705 act = "「♪うた~も~~う~まいぜ~まかしとけ~」";
2708 act = "「♪ま~ちいちば~んのに~んきもの~~」";
2711 act = "「♪べんきょうしゅくだいメじゃないよ~~」";
2714 act = "「♪きはやさし~くて~ち~からもち~」";
2717 act = "「♪かお~も~~スタイルも~バツグンさ~」";
2720 act = "「♪がっこうい~ちの~あ~ばれんぼう~~」";
2723 act = "「♪ド~ラもドラミもメじゃないよ~~」";
2726 act = "「♪よじげんぽけっと~な~くたって~」";
2729 act = "「♪あし~の~~ながさ~は~まけないぜ~」";
2733 act = "horribly sings 'I AM GIAAAAAN. THE BOOOSS OF THE KIIIIDS.'";
2739 act = _("は♪僕らは楽しい家族♪と歌っている。", "sings 'We are a happy family.'");
2741 act = _("は♪アイ ラブ ユー、ユー ラブ ミー♪と歌っている。", "sings 'I love you, you love me.'");
2751 if (do_silly_attack)
2756 act = silly_attacks[randint0(MAX_SILLY_ATTACK)];
2759 if (abbreviate == 0)
2760 msg_format("%^sに%s", m_name, act);
2761 else if (abbreviate == 1)
2762 msg_format("%s", act);
2763 else /* if (abbreviate == -1) */
2764 msg_format("%^s%s", m_name, act);
2765 abbreviate = 1;/*2回目以降は省略 */
2767 msg_format("%^s %s%s", m_name, act, do_silly_attack ? " you." : "");
2771 /* Hack -- assume all attacks are obvious */
2774 /* Roll out the damage */
2775 damage = damroll(d_dice, d_side);
2778 * Skip the effect when exploding, since the explosion
2779 * already causes the effect.
2781 if(explode) damage = 0;
2782 /* Apply appropriate damage */
2792 case RBE_SUPERHURT: /* AC軽減あり / Player armor reduces total damage */
2794 if (((randint1(rlev*2+300) > (ac+200)) || one_in_(13)) && !CHECK_MULTISHADOW(target_ptr))
2796 int tmp_damage = damage - (damage * ((ac < 150) ? ac : 150) / 250);
2797 msg_print(_("痛恨の一撃!", "It was a critical hit!"));
2798 tmp_damage = MAX(damage, tmp_damage*2);
2800 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, tmp_damage, ddesc, -1);
2804 case RBE_HURT: /* AC軽減あり / Player armor reduces total damage */
2807 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
2808 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2816 /* Take "poison" effect */
2817 if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr)) && !CHECK_MULTISHADOW(target_ptr))
2819 if (set_poisoned(target_ptr, target_ptr->poisoned + randint1(rlev) + 5))
2825 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2827 /* Learn about the player */
2828 update_smart_learn(target_ptr, m_idx, DRS_POIS);
2837 /* Allow complete resist */
2838 if (!target_ptr->resist_disen && !CHECK_MULTISHADOW(target_ptr))
2840 /* Apply disenchantment */
2841 if (apply_disenchant(target_ptr, 0))
2843 /* Hack -- Update AC */
2844 update_creature(target_ptr);
2849 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2851 /* Learn about the player */
2852 update_smart_learn(target_ptr, m_idx, DRS_DISEN);
2859 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2861 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
2864 for (k = 0; k < 10; k++)
2867 INVENTORY_IDX i = (INVENTORY_IDX)randint0(INVEN_PACK);
2869 /* Obtain the item */
2870 o_ptr = &target_ptr->inventory_list[i];
2871 if (!o_ptr->k_idx) continue;
2873 /* Drain charged wands/staffs */
2874 if (((o_ptr->tval == TV_STAFF) ||
2875 (o_ptr->tval == TV_WAND)) &&
2878 /* Calculate healed hitpoints */
2879 int heal=rlev * o_ptr->pval;
2880 if( o_ptr->tval == TV_STAFF)
2881 heal *= o_ptr->number;
2883 /* Don't heal more than max hp */
2884 heal = MIN(heal, m_ptr->maxhp - m_ptr->hp);
2886 msg_print(_("ザックからエネルギーが吸い取られた!", "Energy drains from your pack!"));
2890 /* Heal the monster */
2891 m_ptr->hp += (HIT_POINT)heal;
2893 /* Redraw (later) if needed */
2894 if (target_ptr->health_who == m_idx) target_ptr->redraw |= (PR_HEALTH);
2895 if (target_ptr->riding == m_idx) target_ptr->redraw |= (PR_UHEALTH);
2900 /* Combine / Reorder the pack */
2901 target_ptr->update |= (PU_COMBINE | PU_REORDER);
2902 target_ptr->window |= (PW_INVEN);
2913 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2915 /* Confused monsters cannot steal successfully. -LM-*/
2916 if (MON_CONFUSED(m_ptr)) break;
2918 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
2922 /* Saving throw (unless paralyzed) based on dex and level */
2923 if (!target_ptr->paralyzed &&
2924 (randint0(100) < (adj_dex_safe[target_ptr->stat_ind[A_DEX]] +
2927 /* Saving throw message */
2928 msg_print(_("しかし素早く財布を守った!", "You quickly protect your money pouch!"));
2930 /* Occasional blink anyway */
2931 if (randint0(3)) blinked = TRUE;
2937 gold = (target_ptr->au / 10) + randint1(25);
2938 if (gold < 2) gold = 2;
2939 if (gold > 5000) gold = (target_ptr->au / 20) + randint1(3000);
2940 if (gold > target_ptr->au) gold = target_ptr->au;
2941 target_ptr->au -= gold;
2944 msg_print(_("しかし何も盗まれなかった。", "Nothing was stolen."));
2946 else if (target_ptr->au)
2948 msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2949 msg_format(_("$%ld のお金が盗まれた!", "%ld coins were stolen!"), (long)gold);
2950 chg_virtue(target_ptr, V_SACRIFICE, 1);
2954 msg_print(_("財布が軽くなった気がする。", "Your purse feels lighter."));
2955 msg_print(_("お金が全部盗まれた!", "All of your coins were stolen!"));
2956 chg_virtue(target_ptr, V_SACRIFICE, 2);
2960 target_ptr->redraw |= (PR_GOLD);
2962 target_ptr->window |= (PW_PLAYER);
2973 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
2975 /* Confused monsters cannot steal successfully. -LM-*/
2976 if (MON_CONFUSED(m_ptr)) break;
2978 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
2980 /* Saving throw (unless paralyzed) based on dex and level */
2981 if (!target_ptr->paralyzed && (randint0(100) < (adj_dex_safe[target_ptr->stat_ind[A_DEX]] + target_ptr->lev)))
2983 /* Saving throw message */
2984 msg_print(_("しかしあわててザックを取り返した!", "You grab hold of your backpack!"));
2986 /* Occasional "blink" anyway */
2993 for (k = 0; k < 10; k++)
2998 INVENTORY_IDX i = (INVENTORY_IDX)randint0(INVEN_PACK);
3000 /* Obtain the item */
3001 o_ptr = &target_ptr->inventory_list[i];
3002 if (!o_ptr->k_idx) continue;
3004 /* Skip artifacts */
3005 if (object_is_artifact(o_ptr)) continue;
3007 object_desc(target_ptr, o_name, o_ptr, OD_OMIT_PREFIX);
3010 msg_format("%s(%c)を%s盗まれた!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
3012 msg_format("%sour %s (%c) was stolen!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
3014 chg_virtue(target_ptr, V_SACRIFICE, 1);
3015 o_idx = o_pop(floor_ptr);
3021 j_ptr = &floor_ptr->o_list[o_idx];
3022 object_copy(j_ptr, o_ptr);
3027 /* Hack -- If a rod or wand, allocate total
3028 * maximum timeouts or charges between those
3029 * stolen and those missed. -LM-
3031 if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
3033 j_ptr->pval = o_ptr->pval / o_ptr->number;
3034 o_ptr->pval -= j_ptr->pval;
3038 j_ptr->marked = OM_TOUCHED;
3040 /* Memorize monster */
3041 j_ptr->held_m_idx = m_idx;
3044 j_ptr->next_o_idx = m_ptr->hold_o_idx;
3047 m_ptr->hold_o_idx = o_idx;
3050 /* Steal the items */
3051 inven_item_increase(target_ptr, i, -1);
3052 inven_item_optimize(target_ptr, i);
3067 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3069 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3071 /* Steal some food */
3072 for (k = 0; k < 10; k++)
3074 /* Pick an item from the pack */
3075 INVENTORY_IDX i = (INVENTORY_IDX)randint0(INVEN_PACK);
3077 o_ptr = &target_ptr->inventory_list[i];
3078 if (!o_ptr->k_idx) continue;
3080 /* Skip non-food objects */
3081 if ((o_ptr->tval != TV_FOOD) && !((o_ptr->tval == TV_CORPSE) && (o_ptr->sval))) continue;
3083 object_desc(target_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
3086 msg_format("%s(%c)を%s食べられてしまった!", o_name, index_to_label(i), ((o_ptr->number > 1) ? "一つ" : ""));
3088 msg_format("%sour %s (%c) was eaten!", ((o_ptr->number > 1) ? "One of y" : "Y"), o_name, index_to_label(i));
3091 /* Steal the items */
3092 inven_item_increase(target_ptr, i, -1);
3093 inven_item_optimize(target_ptr, i);
3105 /* Access the lite */
3106 o_ptr = &target_ptr->inventory_list[INVEN_LITE];
3107 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3109 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3112 if ((o_ptr->xtra4 > 0) && (!object_is_fixed_artifact(o_ptr)))
3115 o_ptr->xtra4 -= (s16b)(250 + randint1(250));
3116 if (o_ptr->xtra4 < 1) o_ptr->xtra4 = 1;
3118 if (!target_ptr->blind)
3120 msg_print(_("明かりが暗くなってしまった。", "Your light dims."));
3124 target_ptr->window |= (PW_EQUIP);
3134 msg_print(_("酸を浴びせられた!", "You are covered in acid!"));
3135 get_damage += acid_dam(target_ptr, damage, ddesc, -1, FALSE);
3136 update_creature(target_ptr);
3137 update_smart_learn(target_ptr, m_idx, DRS_ACID);
3145 msg_print(_("電撃を浴びせられた!", "You are struck by electricity!"));
3146 get_damage += elec_dam(target_ptr, damage, ddesc, -1, FALSE);
3147 update_smart_learn(target_ptr, m_idx, DRS_ELEC);
3155 msg_print(_("全身が炎に包まれた!", "You are enveloped in flames!"));
3156 get_damage += fire_dam(target_ptr, damage, ddesc, -1, FALSE);
3157 update_smart_learn(target_ptr, m_idx, DRS_FIRE);
3165 msg_print(_("全身が冷気で覆われた!", "You are covered with frost!"));
3166 get_damage += cold_dam(target_ptr, damage, ddesc, -1, FALSE);
3167 update_smart_learn(target_ptr, m_idx, DRS_COLD);
3173 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3174 if (target_ptr->is_dead) break;
3176 /* Increase "blind" */
3177 if (!target_ptr->resist_blind && !CHECK_MULTISHADOW(target_ptr))
3179 if (set_blind(target_ptr, target_ptr->blind + 10 + randint1(rlev)))
3182 if (m_ptr->r_idx == MON_DIO) msg_print("どうだッ!この血の目潰しはッ!");
3190 /* Learn about the player */
3191 update_smart_learn(target_ptr, m_idx, DRS_BLIND);
3199 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3201 if (target_ptr->is_dead) break;
3203 /* Increase "confused" */
3204 if (!target_ptr->resist_conf && !CHECK_MULTISHADOW(target_ptr))
3206 if (set_confused(target_ptr, target_ptr->confused + 3 + randint1(rlev)))
3212 /* Learn about the player */
3213 update_smart_learn(target_ptr, m_idx, DRS_CONF);
3220 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3222 if (target_ptr->is_dead) break;
3224 /* Increase "afraid" */
3225 if (CHECK_MULTISHADOW(target_ptr))
3229 else if (target_ptr->resist_fear)
3231 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
3234 else if (randint0(100 + r_ptr->level/2) < target_ptr->skill_sav)
3236 msg_print(_("しかし恐怖に侵されなかった!", "You stand your ground!"));
3241 if (set_afraid(target_ptr, target_ptr->afraid + 3 + randint1(rlev)))
3247 /* Learn about the player */
3248 update_smart_learn(target_ptr, m_idx, DRS_FEAR);
3255 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3257 if (target_ptr->is_dead) break;
3259 /* Increase "paralyzed" */
3260 if (CHECK_MULTISHADOW(target_ptr))
3264 else if (target_ptr->free_act)
3266 msg_print(_("しかし効果がなかった!", "You are unaffected!"));
3269 else if (randint0(100 + r_ptr->level/2) < target_ptr->skill_sav)
3271 msg_print(_("しかし効力を跳ね返した!", "You resist the effects!"));
3276 if (!target_ptr->paralyzed)
3278 if (set_paralyzed(target_ptr, 3 + randint1(rlev)))
3285 /* Learn about the player */
3286 update_smart_learn(target_ptr, m_idx, DRS_FREE);
3293 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3295 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3296 if (do_dec_stat(target_ptr, A_STR)) obvious = TRUE;
3303 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3305 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3306 if (do_dec_stat(target_ptr, A_INT)) obvious = TRUE;
3313 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3315 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3316 if (do_dec_stat(target_ptr, A_WIS)) obvious = TRUE;
3323 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3325 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3326 if (do_dec_stat(target_ptr, A_DEX)) obvious = TRUE;
3333 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3335 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3336 if (do_dec_stat(target_ptr, A_CON)) obvious = TRUE;
3343 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3345 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3346 if (do_dec_stat(target_ptr, A_CHR)) obvious = TRUE;
3353 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3355 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3357 /* Damage (stats) */
3358 if (do_dec_stat(target_ptr, A_STR)) obvious = TRUE;
3359 if (do_dec_stat(target_ptr, A_DEX)) obvious = TRUE;
3360 if (do_dec_stat(target_ptr, A_CON)) obvious = TRUE;
3361 if (do_dec_stat(target_ptr, A_INT)) obvious = TRUE;
3362 if (do_dec_stat(target_ptr, A_WIS)) obvious = TRUE;
3363 if (do_dec_stat(target_ptr, A_CHR)) obvious = TRUE;
3372 /* Hack -- Reduce damage based on the player armor class */
3373 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
3375 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3377 /* Radius 8 earthquake centered at the monster */
3378 if (damage > 23 || explode)
3380 earthquake(target_ptr, m_ptr->fy, m_ptr->fx, 8, m_idx);
3388 s32b d = damroll(10, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3392 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3394 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3396 (void)drain_exp(target_ptr, d, d / 10, 95);
3402 s32b d = damroll(20, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3406 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3408 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3410 (void)drain_exp(target_ptr, d, d / 10, 90);
3416 s32b d = damroll(40, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3420 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3422 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3424 (void)drain_exp(target_ptr, d, d / 10, 75);
3430 s32b d = damroll(80, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3434 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3436 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3438 (void)drain_exp(target_ptr, d, d / 10, 50);
3444 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3446 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3448 /* Take "poison" effect */
3449 if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr)))
3451 if (set_poisoned(target_ptr, target_ptr->poisoned + randint1(rlev) + 5))
3457 /* Damage CON (10% chance)*/
3458 if ((randint1(100) < 11) && (target_ptr->prace != RACE_ANDROID))
3460 /* 1% chance for perm. damage */
3461 bool perm = one_in_(10);
3462 if (dec_stat(target_ptr, A_CON, randint1(10), perm))
3464 msg_print(_("病があなたを蝕んでいる気がする。", "You feel strange sickness."));
3474 if (!target_ptr->resist_time && !CHECK_MULTISHADOW(target_ptr))
3476 switch (randint1(10))
3478 case 1: case 2: case 3: case 4: case 5:
3480 if (target_ptr->prace == RACE_ANDROID) break;
3481 msg_print(_("人生が逆戻りした気がする。", "You feel life has clocked back."));
3482 lose_exp(target_ptr, 100 + (target_ptr->exp / 100) * MON_DRAIN_LIFE);
3486 case 6: case 7: case 8: case 9:
3488 int stat = randint0(6);
3493 case A_STR: act = "強く"; break;
3494 case A_INT: act = "聡明で"; break;
3495 case A_WIS: act = "賢明で"; break;
3496 case A_DEX: act = "器用で"; break;
3497 case A_CON: act = "健康で"; break;
3498 case A_CHR: act = "美しく"; break;
3500 case A_STR: act = "strong"; break;
3501 case A_INT: act = "bright"; break;
3502 case A_WIS: act = "wise"; break;
3503 case A_DEX: act = "agile"; break;
3504 case A_CON: act = "hale"; break;
3505 case A_CHR: act = "beautiful"; break;
3510 msg_format(_("あなたは以前ほど%sなくなってしまった...。", "You're not as %s as you used to be..."), act);
3511 target_ptr->stat_cur[stat] = (target_ptr->stat_cur[stat] * 3) / 4;
3512 if (target_ptr->stat_cur[stat] < 3) target_ptr->stat_cur[stat] = 3;
3513 target_ptr->update |= (PU_BONUS);
3519 msg_print(_("あなたは以前ほど力強くなくなってしまった...。", "You're not as powerful as you used to be..."));
3521 for (k = 0; k < A_MAX; k++)
3523 target_ptr->stat_cur[k] = (target_ptr->stat_cur[k] * 7) / 8;
3524 if (target_ptr->stat_cur[k] < 3) target_ptr->stat_cur[k] = 3;
3526 target_ptr->update |= (PU_BONUS);
3531 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3537 s32b d = damroll(60, 6) + (target_ptr->exp / 100) * MON_DRAIN_LIFE;
3542 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3544 if (target_ptr->is_dead || CHECK_MULTISHADOW(target_ptr)) break;
3546 resist_drain = !drain_exp(target_ptr, d, d / 10, 50);
3548 /* Heal the attacker? */
3549 if (target_ptr->mimic_form)
3551 if (mimic_info[target_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
3552 resist_drain = TRUE;
3556 switch (target_ptr->prace)
3565 resist_drain = TRUE;
3570 if ((damage > 5) && !resist_drain)
3572 bool did_heal = FALSE;
3574 if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
3577 m_ptr->hp += damroll(4, damage / 6);
3578 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
3580 /* Redraw (later) if needed */
3581 if (target_ptr->health_who == m_idx) target_ptr->redraw |= (PR_HEALTH);
3582 if (target_ptr->riding == m_idx) target_ptr->redraw |= (PR_UHEALTH);
3584 /* Special message */
3585 if (m_ptr->ml && did_heal)
3587 msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), m_name);
3597 if (CHECK_MULTISHADOW(target_ptr))
3599 msg_print(_("攻撃は幻影に命中し、あなたには届かなかった。", "The attack hits Shadow, but you are unharmed!"));
3605 target_ptr->csp -= damage;
3606 if (target_ptr->csp < 0)
3608 target_ptr->csp = 0;
3609 target_ptr->csp_frac = 0;
3612 target_ptr->redraw |= (PR_MANA);
3615 /* Learn about the player */
3616 update_smart_learn(target_ptr, m_idx, DRS_MANA);
3622 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3624 if (target_ptr->is_dead) break;
3626 /* Decrease speed */
3627 if (CHECK_MULTISHADOW(target_ptr))
3633 if (set_slow(target_ptr, (target_ptr->slow + 4 + randint0(rlev / 10)), FALSE))
3643 get_damage += take_hit(target_ptr, DAMAGE_ATTACK, damage, ddesc, -1);
3645 if (target_ptr->is_dead) break;
3647 /* Decrease speed */
3648 if (target_ptr->resist_sound || CHECK_MULTISHADOW(target_ptr))
3654 if (set_stun(target_ptr, target_ptr->stun + 10 + randint1(r_ptr->level / 4)))
3664 /* Hack -- only one of cut or stun */
3665 if (do_cut && do_stun)
3668 if (randint0(100) < 50)
3685 /* Critical hit (zero if non-critical) */
3686 tmp = monster_critical(d_dice, d_side, damage);
3688 /* Roll for damage */
3691 case 0: cut_plus = 0; break;
3692 case 1: cut_plus = randint1(5); break;
3693 case 2: cut_plus = randint1(5) + 5; break;
3694 case 3: cut_plus = randint1(20) + 20; break;
3695 case 4: cut_plus = randint1(50) + 50; break;
3696 case 5: cut_plus = randint1(100) + 100; break;
3697 case 6: cut_plus = 300; break;
3698 default: cut_plus = 500; break;
3702 if (cut_plus) (void)set_cut(target_ptr,target_ptr->cut + cut_plus);
3710 /* Critical hit (zero if non-critical) */
3711 tmp = monster_critical(d_dice, d_side, damage);
3713 /* Roll for damage */
3716 case 0: stun_plus = 0; break;
3717 case 1: stun_plus = randint1(5); break;
3718 case 2: stun_plus = randint1(5) + 10; break;
3719 case 3: stun_plus = randint1(10) + 20; break;
3720 case 4: stun_plus = randint1(15) + 30; break;
3721 case 5: stun_plus = randint1(20) + 40; break;
3722 case 6: stun_plus = 80; break;
3723 default: stun_plus = 150; break;
3726 /* Apply the stun */
3727 if (stun_plus) (void)set_stun(target_ptr, target_ptr->stun + stun_plus);
3732 sound(SOUND_EXPLODE);
3734 if (mon_take_hit(target_ptr, m_idx, m_ptr->hp + 1, &fear, NULL))
3743 if (target_ptr->sh_fire && alive && !target_ptr->is_dead)
3745 if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK))
3747 HIT_POINT dam = damroll(2, 6);
3749 /* Modify the damage */
3750 dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
3752 msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), m_name);
3754 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は灰の山になった。", " turns into a pile of ash.")))
3762 if (is_original_ap_and_seen(target_ptr, m_ptr))
3763 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
3767 if (target_ptr->sh_elec && alive && !target_ptr->is_dead)
3769 if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK))
3771 HIT_POINT dam = damroll(2, 6);
3773 /* Modify the damage */
3774 dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
3776 msg_format(_("%^sは電撃をくらった!", "%^s gets zapped!"), m_name);
3777 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は燃え殻の山になった。", " turns into a pile of cinder.")))
3785 if (is_original_ap_and_seen(target_ptr, m_ptr))
3786 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
3790 if (target_ptr->sh_cold && alive && !target_ptr->is_dead)
3792 if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK))
3794 HIT_POINT dam = damroll(2, 6);
3796 /* Modify the damage */
3797 dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
3799 msg_format(_("%^sは冷気をくらった!", "%^s is very cold!"), m_name);
3800 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は凍りついた。", " was frozen.")))
3808 if (is_original_ap_and_seen(target_ptr, m_ptr))
3809 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
3814 if (target_ptr->dustrobe && alive && !target_ptr->is_dead)
3816 if (!(r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK))
3818 HIT_POINT dam = damroll(2, 6);
3820 /* Modify the damage */
3821 dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
3823 msg_format(_("%^sは鏡の破片をくらった!", "%^s gets zapped!"), m_name);
3824 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("はズタズタになった。", " had torn to pieces.")))
3832 if (is_original_ap_and_seen(target_ptr, m_ptr))
3833 r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_RES_SHAR_MASK);
3836 if (is_mirror_grid(&floor_ptr->grid_array[target_ptr->y][target_ptr->x]))
3838 teleport_player(target_ptr, 10, 0L);
3842 if (target_ptr->tim_sh_holy && alive && !target_ptr->is_dead)
3844 if (r_ptr->flags3 & RF3_EVIL)
3846 if (!(r_ptr->flagsr & RFR_RES_ALL))
3848 HIT_POINT dam = damroll(2, 6);
3850 /* Modify the damage */
3851 dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
3853 msg_format(_("%^sは聖なるオーラで傷ついた!", "%^s is injured by holy power!"), m_name);
3854 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3859 if (is_original_ap_and_seen(target_ptr, m_ptr))
3860 r_ptr->r_flags3 |= RF3_EVIL;
3864 if (is_original_ap_and_seen(target_ptr, m_ptr))
3865 r_ptr->r_flagsr |= RFR_RES_ALL;
3870 if (target_ptr->tim_sh_touki && alive && !target_ptr->is_dead)
3872 if (!(r_ptr->flagsr & RFR_RES_ALL))
3874 HIT_POINT dam = damroll(2, 6);
3876 /* Modify the damage */
3877 dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
3879 msg_format(_("%^sが鋭い闘気のオーラで傷ついた!", "%^s is injured by the Force"), m_name);
3880 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3888 if (is_original_ap_and_seen(target_ptr, m_ptr))
3889 r_ptr->r_flagsr |= RFR_RES_ALL;
3893 if (hex_spelling(target_ptr, HEX_SHADOW_CLOAK) && alive && !target_ptr->is_dead)
3896 object_type *o_armed_ptr = &target_ptr->inventory_list[INVEN_RARM];
3898 if (!(r_ptr->flagsr & RFR_RES_ALL || r_ptr->flagsr & RFR_RES_DARK))
3900 if (o_armed_ptr->k_idx)
3902 int basedam = ((o_armed_ptr->dd + target_ptr->to_dd[0]) * (o_armed_ptr->ds + target_ptr->to_ds[0] + 1));
3903 dam = basedam / 2 + o_armed_ptr->to_d + target_ptr->to_d[0];
3906 /* Cursed armor makes damages doubled */
3907 o_armed_ptr = &target_ptr->inventory_list[INVEN_BODY];
3908 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr)) dam *= 2;
3910 /* Modify the damage */
3911 dam = mon_damage_mod(target_ptr, m_ptr, dam, FALSE);
3913 msg_format(_("影のオーラが%^sに反撃した!", "Enveloping shadows attack %^s."), m_name);
3914 if (mon_take_hit(target_ptr, m_idx, dam, &fear, _("は倒れた。", " is destroyed.")))
3919 else /* monster does not dead */
3922 BIT_FLAGS flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
3923 EFFECT_ID typ[4][2] = {
3924 { INVEN_HEAD, GF_OLD_CONF },
3925 { INVEN_LARM, GF_OLD_SLEEP },
3926 { INVEN_HANDS, GF_TURN_ALL },
3927 { INVEN_FEET, GF_OLD_SLOW }
3930 /* Some cursed armours gives an extra effect */
3931 for (j = 0; j < 4; j++)
3933 o_armed_ptr = &target_ptr->inventory_list[typ[j][0]];
3934 if ((o_armed_ptr->k_idx) && object_is_cursed(o_armed_ptr) && object_is_armour(o_armed_ptr))
3935 project(target_ptr, 0, 0, m_ptr->fy, m_ptr->fx, (target_ptr->lev * 2), typ[j][1], flg, -1);
3941 if (is_original_ap_and_seen(target_ptr, m_ptr))
3942 r_ptr->r_flagsr |= (RFR_RES_ALL | RFR_RES_DARK);
3948 /* Monster missed player */
3951 /* Analyze failed attacks */
3967 /* Visible monsters */
3970 disturb(target_ptr, TRUE, TRUE);
3974 msg_format("%sかわした。", (target_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "");
3976 msg_format("%s%^sの攻撃をかわした。", (target_ptr->special_attack & ATTACK_SUIKEN) ? "奇妙な動きで" : "", m_name);
3977 abbreviate = 1;/*2回目以降は省略 */
3979 msg_format("%^s misses you.", m_name);
3984 /* Gain shield experience */
3985 if (object_is_armour(&target_ptr->inventory_list[INVEN_RARM]) || object_is_armour(&target_ptr->inventory_list[INVEN_LARM]))
3987 int cur = target_ptr->skill_exp[GINOU_SHIELD];
3988 int max = s_info[target_ptr->pclass].s_max[GINOU_SHIELD];
3992 DEPTH targetlevel = r_ptr->level;
3996 /* Extra experience */
3997 if ((cur / 100) < targetlevel)
3999 if ((cur / 100 + 15) < targetlevel)
4000 inc += 1 + (targetlevel - (cur / 100 + 15));
4005 target_ptr->skill_exp[GINOU_SHIELD] = MIN(max, cur + inc);
4006 target_ptr->update |= (PU_BONUS);
4016 /* Analyze "visible" monsters only */
4017 if (is_original_ap_and_seen(target_ptr, m_ptr) && !do_silly_attack)
4019 /* Count "obvious" attacks (and ones that cause damage) */
4020 if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
4022 /* Count attacks of this type */
4023 if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
4025 r_ptr->r_blows[ap_cnt]++;
4030 if (target_ptr->riding && damage)
4032 char m_steed_name[MAX_NLEN];
4033 monster_desc(target_ptr, m_steed_name, &floor_ptr->m_list[target_ptr->riding], 0);
4034 if (rakuba(target_ptr, (damage > 200) ? 200 : damage, FALSE))
4036 msg_format(_("%^sから落ちてしまった!", "You have fallen from %s."), m_steed_name);
4040 if (target_ptr->special_defense & NINJA_KAWARIMI)
4042 if (kawarimi(target_ptr, FALSE)) return TRUE;
4046 /* Hex - revenge damage stored */
4047 revenge_store(target_ptr, get_damage);
4049 if ((target_ptr->tim_eyeeye || hex_spelling(target_ptr, HEX_EYE_FOR_EYE))
4050 && get_damage > 0 && !target_ptr->is_dead)
4053 msg_format("攻撃が%s自身を傷つけた!", m_name);
4055 GAME_TEXT m_name_self[80];
4058 monster_desc(m_name_self, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE);
4060 msg_format("The attack of %s has wounded %s!", m_name, m_name_self);
4062 project(target_ptr, 0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL, -1);
4063 if (target_ptr->tim_eyeeye) set_tim_eyeeye(target_ptr, target_ptr->tim_eyeeye-5, TRUE);
4066 if ((target_ptr->counter || (target_ptr->special_defense & KATA_MUSOU)) && alive && !target_ptr->is_dead && m_ptr->ml && (target_ptr->csp > 7))
4068 char m_target_name[MAX_NLEN];
4069 monster_desc(target_ptr, m_target_name, m_ptr, 0);
4071 target_ptr->csp -= 7;
4072 msg_format(_("%^sに反撃した!", "Your counterattacked to %s!"), m_target_name);
4073 py_attack(target_ptr, m_ptr->fy, m_ptr->fx, HISSATSU_COUNTER);
4075 target_ptr->redraw |= (PR_MANA);
4079 if (blinked && alive && !target_ptr->is_dead)
4081 if (teleport_barrier(target_ptr, m_idx))
4083 msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But magic barrier obstructs it."));
4087 msg_print(_("泥棒は笑って逃げた!", "The thief flees laughing!"));
4088 teleport_away(target_ptr, m_idx, MAX_SIGHT * 2 + 5, 0L);
4092 /* Always notice cause of death */
4093 if (target_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !floor_ptr->inside_arena)
4098 if (m_ptr->ml && fear && alive && !target_ptr->is_dead)
4101 msg_format(_("%^sは恐怖で逃げ出した!", "%^s flees in terror!"), m_name);
4104 if (target_ptr->special_defense & KATA_IAI)
4106 set_action(target_ptr, ACTION_NONE);
4114 * @brief モンスターから敵モンスターへの打撃攻撃処理
4115 * @param m_idx 攻撃側モンスターの参照ID
4116 * @param t_idx 目標側モンスターの参照ID
4117 * @return 実際に打撃処理が行われた場合TRUEを返す
4119 bool monst_attack_monst(player_type *subject_ptr, MONSTER_IDX m_idx, MONSTER_IDX t_idx)
4121 monster_type *m_ptr = &subject_ptr->current_floor_ptr->m_list[m_idx];
4122 monster_type *t_ptr = &subject_ptr->current_floor_ptr->m_list[t_idx];
4124 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4125 monster_race *tr_ptr = &r_info[t_ptr->r_idx];
4127 ARMOUR_CLASS ap_cnt;
4131 GAME_TEXT m_name[MAX_NLEN], t_name[MAX_NLEN];
4132 char temp[MAX_NLEN];
4134 bool explode = FALSE, touched = FALSE, fear = FALSE, dead = FALSE;
4135 POSITION y_saver = t_ptr->fy;
4136 POSITION x_saver = t_ptr->fx;
4139 bool see_m = is_seen(m_ptr);
4140 bool see_t = is_seen(t_ptr);
4141 bool see_either = see_m || see_t;
4143 /* Can the player be aware of this attack? */
4144 bool known = (m_ptr->cdis <= MAX_SIGHT) || (t_ptr->cdis <= MAX_SIGHT);
4145 bool do_silly_attack = (one_in_(2) && subject_ptr->image);
4147 /* Cannot attack self */
4148 if (m_idx == t_idx) return FALSE;
4150 /* Not allowed to attack */
4151 if (r_ptr->flags1 & RF1_NEVER_BLOW) return FALSE;
4153 if (d_info[subject_ptr->dungeon_idx].flags1 & DF1_NO_MELEE) return FALSE;
4158 /* Extract the effective monster level */
4159 rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
4161 monster_desc(subject_ptr, m_name, m_ptr, 0);
4162 monster_desc(subject_ptr, t_name, t_ptr, 0);
4164 /* Assume no blink */
4167 if (!see_either && known)
4169 subject_ptr->current_floor_ptr->monster_noise = TRUE;
4172 if (subject_ptr->riding && (m_idx == subject_ptr->riding)) disturb(subject_ptr, TRUE, TRUE);
4174 /* Scan through all four blows */
4175 for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
4177 bool obvious = FALSE;
4179 HIT_POINT power = 0;
4180 HIT_POINT damage = 0;
4184 /* Extract the attack infomation */
4185 int effect = r_ptr->blow[ap_cnt].effect;
4186 int method = r_ptr->blow[ap_cnt].method;
4187 int d_dice = r_ptr->blow[ap_cnt].d_dice;
4188 int d_side = r_ptr->blow[ap_cnt].d_side;
4190 if (!monster_is_valid(m_ptr)) break;
4192 /* Stop attacking if the target dies! */
4193 if (t_ptr->fx != x_saver || t_ptr->fy != y_saver)
4196 /* Hack -- no more attacks */
4199 if (method == RBM_SHOOT) continue;
4201 /* Extract the attack "power" */
4202 power = mbe_info[effect].power;
4205 if (!effect || check_hit2(power, rlev, ac, MON_STUNNED(m_ptr)))
4207 (void)set_monster_csleep(subject_ptr, t_idx, 0);
4211 /* Redraw the health bar */
4212 if (subject_ptr->health_who == t_idx) subject_ptr->redraw |= (PR_HEALTH);
4213 if (subject_ptr->riding == t_idx) subject_ptr->redraw |= (PR_UHEALTH);
4216 /* Describe the attack method */
4221 act = _("%sを殴った。", "hits %s.");
4228 act = _("%sを触った。", "touches %s.");
4235 act = _("%sをパンチした。", "punches %s.");
4242 act = _("%sを蹴った。", "kicks %s.");
4249 act = _("%sをひっかいた。", "claws %s.");
4256 act = _("%sを噛んだ。", "bites %s.");
4263 act = _("%sを刺した。", "stings %s.");
4270 act = _("%sを斬った。", "slashes %s.");
4276 act = _("%sを角で突いた。", "butts %s.");
4283 act = _("%sに体当りした。", "crushes %s.");
4290 act = _("%sを飲み込んだ。", "engulfs %s.");
4297 act = _("%sに請求書をよこした。", "charges %s.");
4304 act = _("%sの体の上を這い回った。", "crawls on %s.");
4311 act = _("%sによだれをたらした。", "drools on %s.");
4318 act = _("%sに唾を吐いた。", "spits on %s.");
4325 if (see_either) disturb(subject_ptr, TRUE, TRUE);
4326 act = _("爆発した。", "explodes.");
4334 act = _("%sをにらんだ。", "gazes at %s.");
4341 act = _("%sに泣きついた。", "wails at %s.");
4348 act = _("%sに胞子を飛ばした。", "releases spores at %s.");
4355 act = _("%sにXXX4を飛ばした。", "projects XXX4's at %s.");
4362 act = _("%sに金をせがんだ。", "begs %s for money.");
4369 act = _("%sを侮辱した。", "insults %s.");
4376 act = _("%sにむかってうめいた。", "moans at %s.");
4383 act = _("%sにむかって歌った。", "sings to %s.");
4389 if (act && see_either)
4392 if (do_silly_attack) act = silly_attacks2[randint0(MAX_SILLY_ATTACK)];
4393 strfmt(temp, act, t_name);
4394 msg_format("%^sは%s", m_name, temp);
4396 if (do_silly_attack)
4398 act = silly_attacks[randint0(MAX_SILLY_ATTACK)];
4399 strfmt(temp, "%s %s.", act, t_name);
4401 else strfmt(temp, act, t_name);
4402 msg_format("%^s %s", m_name, temp);
4406 /* Hack -- assume all attacks are obvious */
4409 /* Roll out the damage */
4410 damage = damroll(d_dice, d_side);
4412 /* Assume no effect */
4413 effect_type = BLOW_EFFECT_TYPE_NONE;
4417 /* Apply appropriate damage */
4426 if ((randint1(rlev * 2 + 250) > (ac + 200)) || one_in_(13))
4428 int tmp_damage = damage - (damage * ((ac < 150) ? ac : 150) / 250);
4429 damage = MAX(damage, tmp_damage * 2);
4436 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
4451 if ((subject_ptr->riding != m_idx) && one_in_(2)) blinked = TRUE;
4487 effect_type = BLOW_EFFECT_TYPE_FEAR;
4491 effect_type = BLOW_EFFECT_TYPE_SLEEP;
4495 damage -= (damage * ((ac < 150) ? ac : 150) / 250);
4496 if (damage > 23) earthquake(subject_ptr, m_ptr->fy, m_ptr->fx, 8, m_idx);
4511 pt = GF_HYPODYNAMIA;
4512 effect_type = BLOW_EFFECT_TYPE_HEAL;
4530 /* Do damage if not exploding */
4533 project(subject_ptr, m_idx, 0, t_ptr->fy, t_ptr->fx,
4534 damage, pt, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4537 switch (effect_type)
4539 case BLOW_EFFECT_TYPE_FEAR:
4540 project(subject_ptr, m_idx, 0, t_ptr->fy, t_ptr->fx,
4541 damage, GF_TURN_ALL, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4544 case BLOW_EFFECT_TYPE_SLEEP:
4545 project(subject_ptr, m_idx, 0, t_ptr->fy, t_ptr->fx,
4546 r_ptr->level, GF_OLD_SLEEP, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4549 case BLOW_EFFECT_TYPE_HEAL:
4550 if ((monster_living(m_idx)) && (damage > 2))
4552 bool did_heal = FALSE;
4554 if (m_ptr->hp < m_ptr->maxhp) did_heal = TRUE;
4557 m_ptr->hp += damroll(4, damage / 6);
4558 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
4560 /* Redraw (later) if needed */
4561 if (subject_ptr->health_who == m_idx) subject_ptr->redraw |= (PR_HEALTH);
4562 if (subject_ptr->riding == m_idx) subject_ptr->redraw |= (PR_UHEALTH);
4564 /* Special message */
4565 if (see_m && did_heal)
4567 msg_format(_("%sは体力を回復したようだ。", "%^s appears healthier."), m_name);
4576 if ((tr_ptr->flags2 & RF2_AURA_FIRE) && m_ptr->r_idx)
4578 if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK))
4582 msg_format(_("%^sは突然熱くなった!", "%^s is suddenly very hot!"), m_name);
4584 if (m_ptr->ml && is_original_ap_and_seen(subject_ptr, t_ptr)) tr_ptr->r_flags2 |= RF2_AURA_FIRE;
4585 project(subject_ptr, t_idx, 0, m_ptr->fy, m_ptr->fx,
4586 damroll(1 + ((tr_ptr->level) / 26),
4587 1 + ((tr_ptr->level) / 17)),
4588 GF_FIRE, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4592 if (is_original_ap_and_seen(subject_ptr, m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK);
4597 if ((tr_ptr->flags3 & RF3_AURA_COLD) && m_ptr->r_idx)
4599 if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK))
4603 msg_format(_("%^sは突然寒くなった!", "%^s is suddenly very cold!"), m_name);
4605 if (m_ptr->ml && is_original_ap_and_seen(subject_ptr, t_ptr)) tr_ptr->r_flags3 |= RF3_AURA_COLD;
4606 project(subject_ptr, t_idx, 0, m_ptr->fy, m_ptr->fx,
4607 damroll(1 + ((tr_ptr->level) / 26),
4608 1 + ((tr_ptr->level) / 17)),
4609 GF_COLD, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4613 if (is_original_ap_and_seen(subject_ptr, m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_COLD_MASK);
4618 if ((tr_ptr->flags2 & RF2_AURA_ELEC) && m_ptr->r_idx)
4620 if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK))
4624 msg_format(_("%^sは電撃を食らった!", "%^s gets zapped!"), m_name);
4626 if (m_ptr->ml && is_original_ap_and_seen(subject_ptr, t_ptr)) tr_ptr->r_flags2 |= RF2_AURA_ELEC;
4627 project(subject_ptr, t_idx, 0, m_ptr->fy, m_ptr->fx,
4628 damroll(1 + ((tr_ptr->level) / 26),
4629 1 + ((tr_ptr->level) / 17)),
4630 GF_ELEC, PROJECT_KILL | PROJECT_STOP | PROJECT_AIMED, -1);
4634 if (is_original_ap_and_seen(subject_ptr, m_ptr)) r_ptr->r_flagsr |= (r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK);
4641 /* Monster missed player */
4644 /* Analyze failed attacks */
4660 (void)set_monster_csleep(subject_ptr, t_idx, 0);
4662 /* Visible monsters */
4666 msg_format("%sは%^sの攻撃をかわした。", t_name, m_name);
4668 msg_format("%^s misses %s.", m_name, t_name);
4678 /* Analyze "visible" monsters only */
4679 if (is_original_ap_and_seen(subject_ptr, m_ptr) && !do_silly_attack)
4681 /* Count "obvious" attacks (and ones that cause damage) */
4682 if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10))
4684 /* Count attacks of this type */
4685 if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR)
4687 r_ptr->r_blows[ap_cnt]++;
4695 sound(SOUND_EXPLODE);
4697 /* Cancel Invulnerability */
4698 (void)set_monster_invulner(subject_ptr, m_idx, 0, FALSE);
4699 mon_take_hit_mon(subject_ptr, m_idx, m_ptr->hp + 1, &dead, &fear, _("は爆発して粉々になった。", " explodes into tiny shreds."), m_idx);
4703 if (!blinked || m_ptr->r_idx == 0) return TRUE;
4705 if (teleport_barrier(subject_ptr, m_idx))
4709 msg_print(_("泥棒は笑って逃げ...ようとしたがバリアに防がれた。", "The thief flees laughing...? But magic barrier obstructs it."));
4713 subject_ptr->current_floor_ptr->monster_noise = TRUE;
4720 msg_print(_("泥棒は笑って逃げた!", "The thief flees laughing!"));
4724 subject_ptr->current_floor_ptr->monster_noise = TRUE;
4727 teleport_away(subject_ptr, m_idx, MAX_SIGHT * 2 + 5, 0L);
4736 * @brief モンスターが敵モンスターに行う打撃処理 /
4737 * Hack, based on mon_take_hit... perhaps all monster attacks on other monsters should use this?
4738 * @param m_idx 目標となるモンスターの参照ID
4740 * @param dead 目標となったモンスターの死亡状態を返す参照ポインタ
4741 * @param fear 目標となったモンスターの恐慌状態を返す参照ポインタ
4742 * @param note 目標モンスターが死亡した場合の特別メッセージ(NULLならば標準表示を行う)
4743 * @param who 打撃を行ったモンスターの参照ID
4746 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)
4748 floor_type *floor_ptr = player_ptr->current_floor_ptr;
4749 monster_type *m_ptr = &floor_ptr->m_list[m_idx];
4750 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4751 GAME_TEXT m_name[160];
4752 bool seen = is_seen(m_ptr);
4754 /* Can the player be aware of this attack? */
4755 bool known = (m_ptr->cdis <= MAX_SIGHT);
4757 monster_desc(player_ptr, m_name, m_ptr, 0);
4759 /* Redraw (later) if needed */
4762 if (player_ptr->health_who == m_idx) player_ptr->redraw |= (PR_HEALTH);
4763 if (player_ptr->riding == m_idx) player_ptr->redraw |= (PR_UHEALTH);
4766 (void)set_monster_csleep(player_ptr, m_idx, 0);
4768 if (player_ptr->riding && (m_idx == player_ptr->riding)) disturb(player_ptr, TRUE, TRUE);
4770 if (MON_INVULNER(m_ptr) && randint0(PENETRATE_INVULNERABILITY))
4774 msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
4779 if (r_ptr->flagsr & RFR_RES_ALL)
4784 if ((dam == 0) && one_in_(3)) dam = 1;
4790 msg_format(_("%^sはダメージを受けない。", "%^s is unharmed."), m_name);
4799 /* It is dead now... or is it? */
4802 if (((r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) ||
4803 (r_ptr->flags7 & RF7_NAZGUL)) &&
4804 !player_ptr->phase_out)
4811 if (!monster_living(m_ptr->r_idx))
4813 sound(SOUND_N_KILL);
4824 monster_desc(player_ptr, m_name, m_ptr, MD_TRUE_NAME);
4825 /* Unseen death by normal attack */
4828 floor_ptr->monster_noise = TRUE;
4830 /* Death by special attack */
4833 msg_format(_("%^s%s", "%^s%s"), m_name, note);
4835 /* Death by normal attack -- nonliving monster */
4836 else if (!monster_living(m_ptr->r_idx))
4838 msg_format(_("%^sは破壊された。", "%^s is destroyed."), m_name);
4840 /* Death by normal attack -- living monster */
4843 msg_format(_("%^sは殺された。", "%^s is killed."), m_name);
4847 monster_gain_exp(player_ptr, who, m_ptr->r_idx);
4848 monster_death(player_ptr, m_idx, FALSE);
4849 delete_monster_idx(player_ptr, m_idx);
4854 /* Monster is dead */
4863 /* Mega-Hack -- Pain cancels fear */
4864 if (MON_MONFEAR(m_ptr) && (dam > 0))
4867 if (set_monster_monfear(player_ptr, m_idx, MON_MONFEAR(m_ptr) - randint1(dam / 4)))
4874 /* Sometimes a monster gets scared by damage */
4875 if (!MON_MONFEAR(m_ptr) && !(r_ptr->flags3 & RF3_NO_FEAR))
4877 /* Percentage of fully healthy */
4878 int percentage = (100L * m_ptr->hp) / m_ptr->maxhp;
4881 * Run (sometimes) if at 10% or less of max hit points,
4882 * or (usually) when hit for half its current hit points
4884 if (((percentage <= 10) && (randint0(10) < percentage)) ||
4885 ((dam >= m_ptr->hp) && (randint0(100) < 80)))
4887 /* Hack -- note fear */
4890 /* Hack -- Add some timed fear */
4891 (void)set_monster_monfear(player_ptr, m_idx, (randint1(10) +
4892 (((dam >= m_ptr->hp) && (percentage > 7)) ?
4893 20 : ((11 - percentage) * 5))));
4897 #endif /* ALLOW_FEAR */
4899 if ((dam > 0) && !is_pet(m_ptr) && !is_friendly(m_ptr) && (who != m_idx))
4901 if (is_pet(&floor_ptr->m_list[who]) && !player_bold(player_ptr, m_ptr->target_y, m_ptr->target_x))
4903 set_target(m_ptr, floor_ptr->m_list[who].fy, floor_ptr->m_list[who].fx);
4907 if (player_ptr->riding && (player_ptr->riding == m_idx) && (dam > 0))
4909 monster_desc(player_ptr, m_name, m_ptr, 0);
4911 if (m_ptr->hp > m_ptr->maxhp / 3) dam = (dam + 1) / 2;
4912 if (rakuba(player_ptr, (dam > 200) ? 200 : dam, FALSE))
4914 msg_format(_("%^sに振り落とされた!", "You have been thrown off from %s!"), m_name);