OSDN Git Service

Vanillaにならって、キャラクターの状態を表わすグローバル変数の多くを
[hengbandforosx/hengbandosx.git] / src / melee1.c
index e1562a6..5700b81 100644 (file)
@@ -12,7 +12,6 @@
 
 #include "angband.h"
 
-extern cptr silly_attacks[MAX_SILLY_ATTACK];
 
 /*
  * Critical blow.  All hits that do 95% of total possible damage,
@@ -170,6 +169,7 @@ bool make_attack_normal(int m_idx)
         bool resist_drain = FALSE;
        bool do_silly_attack = (one_in_(2) && p_ptr->image);
        int syouryaku = 0;
+       int get_damage = 0;
 
        /* Not allowed to attack */
        if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return (FALSE);
@@ -241,7 +241,7 @@ bool make_attack_normal(int m_idx)
                }
 
                /* Stop if player is dead or gone */
-               if (!alive || death) break;
+               if (!p_ptr->playing || p_ptr->is_dead) break;
                if (distance(py, px, m_ptr->fy, m_ptr->fx) > 1) break;
 
                /* Handle "leaving" */
@@ -758,7 +758,7 @@ bool make_attack_normal(int m_idx)
                                                tmp_damage = MAX(damage, tmp_damage*2);
 
                                                /* Take damage */
-                                               take_hit(DAMAGE_ATTACK, tmp_damage, ddesc, -1);
+                                               get_damage += take_hit(DAMAGE_ATTACK, tmp_damage, ddesc, -1);
                                                break;
                                        }
                                }
@@ -771,7 +771,7 @@ bool make_attack_normal(int m_idx)
                                        damage -= (damage * ((ac < 150) ? ac : 150) / 250);
 
                                        /* Take damage */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
                                        break;
                                }
@@ -790,7 +790,7 @@ bool make_attack_normal(int m_idx)
                                        }
 
                                        /* Take some damage */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
                                        /* Learn about the player */
                                        update_smart_learn(m_idx, DRS_POIS);
@@ -810,7 +810,7 @@ bool make_attack_normal(int m_idx)
                                        }
 
                                        /* Take some damage */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
                                        /* Learn about the player */
                                        update_smart_learn(m_idx, DRS_DISEN);
@@ -821,9 +821,9 @@ bool make_attack_normal(int m_idx)
                                case RBE_UN_POWER:
                                {
                                        /* Take some damage */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
-                                       if (death) break;
+                                       if (p_ptr->is_dead) break;
 
                                        /* Find an item */
                                        for (k = 0; k < 10; k++)
@@ -888,12 +888,12 @@ bool make_attack_normal(int m_idx)
                                case RBE_EAT_GOLD:
                                {
                                        /* Take some damage */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
                                        /* Confused monsters cannot steal successfully. -LM-*/
                                        if (m_ptr->confused) break;
 
-                                       if (death) break;
+                                       if (p_ptr->is_dead) break;
 
                                        /* Obvious */
                                        obvious = TRUE;
@@ -972,12 +972,12 @@ bool make_attack_normal(int m_idx)
                                case RBE_EAT_ITEM:
                                {
                                        /* Take some damage */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
                                        /* Confused monsters cannot steal successfully. -LM-*/
                                        if (m_ptr->confused) break;
 
-                                       if (death) break;
+                                       if (p_ptr->is_dead) break;
 
                                        /* Saving throw (unless paralyzed) based on dex and level */
                                        if (!p_ptr->paralyzed &&
@@ -1097,9 +1097,9 @@ bool make_attack_normal(int m_idx)
                                case RBE_EAT_FOOD:
                                {
                                        /* Take some damage */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
-                                       if (death) break;
+                                       if (p_ptr->is_dead) break;
 
                                        /* Steal some food */
                                        for (k = 0; k < 10; k++)
@@ -1151,16 +1151,16 @@ bool make_attack_normal(int m_idx)
                                        o_ptr = &inventory[INVEN_LITE];
 
                                        /* Take some damage */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
-                                       if (death) break;
+                                       if (p_ptr->is_dead) break;
 
                                        /* Drain fuel */
                                        if ((o_ptr->xtra4 > 0) && (!artifact_p(o_ptr)))
                                        {
                                                /* Reduce fuel */
-                                               o_ptr->pval -= (250 + randint1(250));
-                                               if (o_ptr->pval < 1) o_ptr->pval = 1;
+                                               o_ptr->xtra4 -= (250 + randint1(250));
+                                               if (o_ptr->xtra4 < 1) o_ptr->xtra4 = 1;
 
                                                /* Notice */
                                                if (!p_ptr->blind)
@@ -1276,9 +1276,9 @@ bool make_attack_normal(int m_idx)
                                case RBE_BLIND:
                                {
                                        /* Take damage */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
-                                       if (death) break;
+                                       if (p_ptr->is_dead) break;
 
                                        /* Increase "blind" */
                                        if (!p_ptr->resist_blind)
@@ -1304,9 +1304,9 @@ bool make_attack_normal(int m_idx)
                                {
                                        if (explode) break;
                                        /* Take damage */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
-                                       if (death) break;
+                                       if (p_ptr->is_dead) break;
 
                                        /* Increase "confused" */
                                        if (!p_ptr->resist_conf)
@@ -1326,9 +1326,9 @@ bool make_attack_normal(int m_idx)
                                case RBE_TERRIFY:
                                {
                                        /* Take damage */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
-                                       if (death) break;
+                                       if (p_ptr->is_dead) break;
 
                                        /* Increase "afraid" */
                                        if (p_ptr->resist_fear)
@@ -1368,9 +1368,9 @@ bool make_attack_normal(int m_idx)
                                case RBE_PARALYZE:
                                {
                                        /* Take damage */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
-                                       if (death) break;
+                                       if (p_ptr->is_dead) break;
 
                                        /* Increase "paralyzed" */
                                        if (p_ptr->free_act)
@@ -1413,9 +1413,9 @@ bool make_attack_normal(int m_idx)
                                case RBE_LOSE_STR:
                                {
                                        /* Damage (physical) */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
-                                       if (death) break;
+                                       if (p_ptr->is_dead) break;
 
                                        /* Damage (stat) */
                                        if (do_dec_stat(A_STR)) obvious = TRUE;
@@ -1426,9 +1426,9 @@ bool make_attack_normal(int m_idx)
                                case RBE_LOSE_INT:
                                {
                                        /* Damage (physical) */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
-                                       if (death) break;
+                                       if (p_ptr->is_dead) break;
 
                                        /* Damage (stat) */
                                        if (do_dec_stat(A_INT)) obvious = TRUE;
@@ -1439,9 +1439,9 @@ bool make_attack_normal(int m_idx)
                                case RBE_LOSE_WIS:
                                {
                                        /* Damage (physical) */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
-                                       if (death) break;
+                                       if (p_ptr->is_dead) break;
 
                                        /* Damage (stat) */
                                        if (do_dec_stat(A_WIS)) obvious = TRUE;
@@ -1452,9 +1452,9 @@ bool make_attack_normal(int m_idx)
                                case RBE_LOSE_DEX:
                                {
                                        /* Damage (physical) */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
-                                       if (death) break;
+                                       if (p_ptr->is_dead) break;
 
                                        /* Damage (stat) */
                                        if (do_dec_stat(A_DEX)) obvious = TRUE;
@@ -1465,9 +1465,9 @@ bool make_attack_normal(int m_idx)
                                case RBE_LOSE_CON:
                                {
                                        /* Damage (physical) */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
-                                       if (death) break;
+                                       if (p_ptr->is_dead) break;
 
                                        /* Damage (stat) */
                                        if (do_dec_stat(A_CON)) obvious = TRUE;
@@ -1478,9 +1478,9 @@ bool make_attack_normal(int m_idx)
                                case RBE_LOSE_CHR:
                                {
                                        /* Damage (physical) */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
-                                       if (death) break;
+                                       if (p_ptr->is_dead) break;
 
                                        /* Damage (stat) */
                                        if (do_dec_stat(A_CHR)) obvious = TRUE;
@@ -1491,9 +1491,9 @@ bool make_attack_normal(int m_idx)
                                case RBE_LOSE_ALL:
                                {
                                        /* Damage (physical) */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
-                                       if (death) break;
+                                       if (p_ptr->is_dead) break;
 
                                        /* Damage (stats) */
                                        if (do_dec_stat(A_STR)) obvious = TRUE;
@@ -1515,7 +1515,7 @@ bool make_attack_normal(int m_idx)
                                        damage -= (damage * ((ac < 150) ? ac : 150) / 250);
 
                                        /* Take damage */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
                                        /* Radius 8 earthquake centered at the monster */
                                        if (damage > 23 || explode)
@@ -1532,9 +1532,9 @@ bool make_attack_normal(int m_idx)
                                        obvious = TRUE;
 
                                        /* Take damage */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
-                                       if (death) break;
+                                       if (p_ptr->is_dead) break;
 
                                        if (p_ptr->prace == RACE_ANDROID)
                                        {
@@ -1581,9 +1581,9 @@ bool make_attack_normal(int m_idx)
                                        obvious = TRUE;
 
                                        /* Take damage */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
-                                       if (death) break;
+                                       if (p_ptr->is_dead) break;
 
                                        if (p_ptr->prace == RACE_ANDROID)
                                        {
@@ -1630,9 +1630,9 @@ bool make_attack_normal(int m_idx)
                                        obvious = TRUE;
 
                                        /* Take damage */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
-                                       if (death) break;
+                                       if (p_ptr->is_dead) break;
 
                                        if (p_ptr->prace == RACE_ANDROID)
                                        {
@@ -1679,9 +1679,9 @@ bool make_attack_normal(int m_idx)
                                        obvious = TRUE;
 
                                        /* Take damage */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
-                                       if (death) break;
+                                       if (p_ptr->is_dead) break;
 
                                        if (p_ptr->prace == RACE_ANDROID)
                                        {
@@ -1725,9 +1725,9 @@ bool make_attack_normal(int m_idx)
                                case RBE_DISEASE:
                                {
                                        /* Take some damage */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
-                                       if (death) break;
+                                       if (p_ptr->is_dead) break;
 
                                        /* Take "poison" effect */
                                        if (!(p_ptr->resist_pois || p_ptr->oppose_pois))
@@ -1743,7 +1743,16 @@ bool make_attack_normal(int m_idx)
                                        {
                                                /* 1% chance for perm. damage */
                                                bool perm = one_in_(10);
-                                               if (dec_stat(A_CON, randint1(10), perm)) obvious = TRUE;
+                                               if (dec_stat(A_CON, randint1(10), perm))
+                                               {
+#ifdef JP
+                                                       msg_print("ɤ¬¤¢¤Ê¤¿¤ò¿ª¤ó¤Ç¤¤¤ëµ¤¤¬¤¹¤ë¡£");
+#else
+                                                       msg_print("You feel strange sickness.");
+#endif
+
+                                                       obvious = TRUE;
+                                               }
                                        }
 
                                        break;
@@ -1824,7 +1833,7 @@ bool make_attack_normal(int m_idx)
                                                        }
                                                }
                                        }
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
                                        break;
                                }
@@ -1834,9 +1843,9 @@ bool make_attack_normal(int m_idx)
                                        obvious = TRUE;
 
                                        /* Take damage */
-                                       take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
+                                       get_damage += take_hit(DAMAGE_ATTACK, damage, ddesc, -1);
 
-                                       if (death) break;
+                                       if (p_ptr->is_dead) break;
 
                                        if (p_ptr->prace == RACE_ANDROID)
                                        {
@@ -2017,7 +2026,7 @@ msg_format("%s
 
                        if (touched)
                        {
-                               if (p_ptr->sh_fire && alive && !death)
+                               if (p_ptr->sh_fire && alive && !p_ptr->is_dead)
                                {
                                        if (!(r_ptr->flags3 & RF3_IM_FIRE))
                                        {
@@ -2049,7 +2058,7 @@ msg_format("%s
                                        }
                                }
 
-                               if (p_ptr->sh_elec && alive && !death)
+                               if (p_ptr->sh_elec && alive && !p_ptr->is_dead)
                                {
                                        if (!(r_ptr->flags3 & RF3_IM_ELEC))
                                        {
@@ -2081,7 +2090,7 @@ msg_format("%s
                                        }
                                }
 
-                               if (p_ptr->sh_cold && alive && !death)
+                               if (p_ptr->sh_cold && alive && !p_ptr->is_dead)
                                {
                                        if (!(r_ptr->flags3 & RF3_IM_COLD))
                                        {
@@ -2114,7 +2123,7 @@ msg_format("%s
                                }
 
                                /* by henkma */
-                               if (p_ptr->dustrobe && alive && !death)
+                               if (p_ptr->dustrobe && alive && !p_ptr->is_dead)
                                {
                                        if (!(r_ptr->flags4 & RF4_BR_SHAR))
                                        {
@@ -2144,8 +2153,36 @@ msg_format("%s
                                        }
                                }
 
+                               if (p_ptr->tim_sh_holy && alive && !p_ptr->is_dead)
+                               {
+                                       if (r_ptr->flags3 & RF3_EVIL)
+                                       {
+                                               int dam = damroll(2, 6);
+
+                                               /* Modify the damage */
+                                               dam = mon_damage_mod(m_ptr, dam, FALSE);
 
-                               if (p_ptr->tim_sh_touki && alive && !death)
+#ifdef JP
+                                               msg_format("%^s¤ÏÀ»¤Ê¤ë¥ª¡¼¥é¤Ç½ý¤Ä¤¤¤¿¡ª", m_name);
+                                               if (mon_take_hit(m_idx, dam, &fear,
+                                                   "¤ÏÅݤ줿¡£"))
+#else
+                                               msg_format("%^s is injured by holy power!", m_name);
+
+                                               if (mon_take_hit(m_idx, dam, &fear,
+                                                   " is destroyed."))
+#endif
+
+                                               {
+                                                       blinked = FALSE;
+                                                       alive = FALSE;
+                                               }
+                                               if (m_ptr->ml)
+                                                       r_ptr->r_flags3 |= RF3_EVIL;
+                                       }
+                               }
+
+                               if (p_ptr->tim_sh_touki && alive && !p_ptr->is_dead)
                                {
                                        int dam = damroll(2, 6);
 
@@ -2157,10 +2194,10 @@ msg_format("%s
                                        if (mon_take_hit(m_idx, dam, &fear,
                                            "¤ÏÅݤ줿¡£"))
 #else
-                                       msg_format("%^s is suddenly very hot!", m_name);
+                                       msg_format("%^s is injured by the Force", m_name);
 
                                        if (mon_take_hit(m_idx, dam, &fear,
-                                           " turns into a pile of ash."))
+                                           " is destroyed."))
 #endif
 
                                        {
@@ -2168,7 +2205,6 @@ msg_format("%s
                                                alive = FALSE;
                                        }
                                }
-                               touched = FALSE;
                        }
                }
 
@@ -2250,8 +2286,24 @@ msg_format("%^s
                }
        }
 
+       if (p_ptr->tim_eyeeye && get_damage > 0 && !p_ptr->is_dead)
+       {
+#ifdef JP
+               msg_format("¹¶·â¤¬%s¼«¿È¤ò½ý¤Ä¤±¤¿¡ª", m_name);
+#else
+               char m_name_self[80];
+               
+               /* hisself */
+               monster_desc(m_name_self, m_ptr, 0x23);
+
+               msg_format("The attack of %s has wounded %s!", m_name, m_name_self);
+#endif
+               project(0, 0, m_ptr->fy, m_ptr->fx, get_damage, GF_MISSILE, PROJECT_KILL | PROJECT_NO_REF, -1);
+               set_tim_eyeeye(p_ptr->tim_eyeeye-5, TRUE);
+       }
+
 
-       if ((p_ptr->counter || (p_ptr->special_defense & KATA_MUSOU)) && alive && !death && m_ptr->ml && (p_ptr->csp > 7))
+       if ((p_ptr->counter || (p_ptr->special_defense & KATA_MUSOU)) && alive && !p_ptr->is_dead && m_ptr->ml && (p_ptr->csp > 7))
        {
                char m_name[80];
                monster_desc(m_name, m_ptr, 0);
@@ -2267,7 +2319,7 @@ msg_format("%^s
        }
 
        /* Blink away */
-       if (blinked)
+       if (blinked && alive && !p_ptr->is_dead)
        {
 #ifdef JP
                msg_print("Å¥ËÀ¤Ï¾Ð¤Ã¤Æƨ¤²¤¿¡ª");
@@ -2280,12 +2332,12 @@ msg_format("%^s
 
 
        /* Always notice cause of death */
-       if (death && (r_ptr->r_deaths < MAX_SHORT) && !p_ptr->inside_arena)
+       if (p_ptr->is_dead && (r_ptr->r_deaths < MAX_SHORT) && !p_ptr->inside_arena)
        {
                r_ptr->r_deaths++;
        }
 
-       if (m_ptr->ml && fear)
+       if (m_ptr->ml && fear && alive && !p_ptr->is_dead)
        {
                sound(SOUND_FLEE);
 #ifdef JP