OSDN Git Service

enable to get mon_spell_damage by race
authordis- <dis.rogue@gmail.com>
Mon, 24 Feb 2014 10:00:38 +0000 (19:00 +0900)
committerdis- <dis.rogue@gmail.com>
Mon, 24 Feb 2014 10:00:38 +0000 (19:00 +0900)
src/externs.h
src/monster1.c
src/mspells4.c

index 24840c8..5bd8305 100644 (file)
@@ -1599,6 +1599,7 @@ extern bool spell_learnable(int m_idx);
 extern int monspell_to_player(int SPELL_NUM, int y, int x, int m_idx);
 extern int monspell_to_monster(int SPELL_NUM, int y, int x, int m_idx, int t_idx);
 extern int monspell_damage(int SPELL_NUM, int m_idx, int TYPE);
+extern int monspell_race_damage(int SPELL_NUM, int r_idx, int TYPE);
 
 /* hissatsu.c */
 extern void hissatsu_info(char *p, int power);
index 9918920..cea95be 100644 (file)
@@ -178,7 +178,7 @@ static void roff_aux(int r_idx, int mode)
        int             vn = 0;
        byte            color[96];
        cptr            vp[96];
-       char shoot_power[96];
+       char tmp_msg[96][96];
 
        bool know_everything = FALSE;
 
@@ -721,15 +721,22 @@ static void roff_aux(int r_idx, int mode)
        /* Collect inate attacks */
        vn = 0;
        if (flags4 & RF4_SHRIEK)  { vp[vn] = _("ÈáÌĤǽõ¤±¤òµá¤á¤ë", "shriek for help"); color[vn++] = TERM_L_WHITE; }
-       if (flags4 & RF4_ROCKET)  { vp[vn] = _("¥í¥±¥Ã¥È¤òȯ¼Í¤¹¤ë", "shoot a rocket"); color[vn++] = TERM_UMBER; }
+       if (flags4 & RF4_ROCKET)  
+    {
+        int dam = monspell_race_damage(monspell_num(RF4_SPELL_START, RF4_ROCKET), r_idx, DAM_MAX);
+        sprintf(tmp_msg[vn], _("¥í¥±¥Ã¥È(%d)¤òȯ¼Í¤¹¤ë", "shoot a rocket(%d)"), dam);
+        vp[vn] = tmp_msg[vn];
+        color[vn++] = TERM_UMBER; 
+    }
+    
        if (flags4 & RF4_SHOOT)
        { 
                for (r = 0, m = 0; m < 4; m++)
                {
                        if (r_ptr->blow[m].method == RBM_SHOOT)
                        {
-                               sprintf(shoot_power, _("°ÒÎÏ %dd%d ¤Î¼Í·â¤ò¤¹¤ë","fire an arrow (Power:%dd%d)"), r_ptr->blow[m].d_side, r_ptr->blow[m].d_dice);
-                               vp[vn] = shoot_power; color[vn++] = TERM_UMBER;
+                               sprintf(tmp_msg[vn], _("°ÒÎÏ %dd%d ¤Î¼Í·â¤ò¤¹¤ë","fire an arrow (Power:%dd%d)"), r_ptr->blow[m].d_side, r_ptr->blow[m].d_dice);
+                vp[vn] = tmp_msg[vn]; color[vn++] = TERM_UMBER;
                                break;
                        }
                }               
index 3632e3f..e3e5757 100644 (file)
@@ -3678,25 +3678,17 @@ int monspell_to_monster(int SPELL_NUM, int y, int x, int m_idx, int t_idx)
 
 /*!
 * @brief ¥â¥ó¥¹¥¿¡¼¤Î»È¤¦¼öʸ¤Î°ÒÎϤòÊÖ¤¹ /
-* @param m_idx ¼öʸ¤ò¾§¤¨¤ë¥â¥ó¥¹¥¿¡¼ID
+* @param SPELL_NUM ¼öʸÈÖ¹æ
+* @param hp ¼öʸ¤ò¾§¤¨¤ë¥â¥ó¥¹¥¿¡¼¤ÎÂÎÎÏ
+* @param rlev ¼öʸ¤ò¾§¤¨¤ë¥â¥ó¥¹¥¿¡¼¤Î¥ì¥Ù¥ë
+* @param powerful ¼öʸ¤ò¾§¤¨¤ë¥â¥ó¥¹¥¿¡¼¤Îpowerful¥Õ¥é¥°
+* @param r_ptr ¼öʸ¤ò¾§¤¨¤ë¥â¥ó¥¹¥¿¡¼¤Î¼ï²¥Ý¥¤¥ó¥¿
 * @param TYPE  DAM_MAX¤ÇºÇÂçÃͤòÊÖ¤·¡¢DAM_MIN¤ÇºÇ¾®ÃͤòÊÖ¤¹¡£DAM_ROLL¤Ï¥À¥¤¥¹¤ò¿¶¤Ã¤ÆÃͤò·èÄꤹ¤ë¡£
 * @return ¹¶·â¼öʸ¤Î¥À¥á¡¼¥¸¤òÊÖ¤¹¡£¹¶·â¼öʸ°Ê³°¤Ï-1¤òÊÖ¤¹¡£
 */
-int monspell_damage(int SPELL_NUM, int m_idx, int TYPE)
+int monspell_damage_base(int SPELL_NUM, int hp, int rlev, bool powerful, monster_race* r_ptr, int TYPE)
 {
-    monster_type    *m_ptr = &m_list[m_idx];
-    monster_race    *r_ptr = &r_info[m_ptr->r_idx];
-    int hp, dam = 0, dice_num = 0, dice_side = 0, mult = 1, div = 1;
-    int rlev = monster_level_idx(m_idx);
-
-    if (TYPE == DAM_MAX)
-    {
-        hp = m_ptr->max_maxhp;
-    }
-    else if (TYPE == DAM_ROLL)
-    {
-        hp = m_ptr->hp;
-    }
+    int dam = 0, dice_num = 0, dice_side = 0, mult = 1, div = 1;
 
     switch (SPELL_NUM)
     {
@@ -3802,7 +3794,7 @@ int monspell_damage(int SPELL_NUM, int m_idx, int TYPE)
 
         /* RF4_BA_NUKE */
     case RF4_SPELL_START + 28:
-        mult = monster_is_powerful(m_idx) ? 2 : 1;
+        mult = powerful ? 2 : 1;
         dam = rlev * (mult / div);
         dice_num = 10;
         dice_side = 6;
@@ -3815,7 +3807,7 @@ int monspell_damage(int SPELL_NUM, int m_idx, int TYPE)
 
         /* RF4_BA_CHAO */
     case RF4_SPELL_START + 30:
-        dam = (monster_is_powerful(m_idx) ? (rlev * 3) : (rlev * 2));
+        dam = (powerful ? (rlev * 3) : (rlev * 2));
         dice_num = 10;
         dice_side = 10;
         break;
@@ -3827,7 +3819,7 @@ int monspell_damage(int SPELL_NUM, int m_idx, int TYPE)
 
         /* RF5_BA_ACID */
     case RF5_SPELL_START + 0:
-        if (monster_is_powerful(m_idx))
+        if (powerful)
         {
             dam = (rlev * 4) + 50;
             dice_num = 10;
@@ -3843,7 +3835,7 @@ int monspell_damage(int SPELL_NUM, int m_idx, int TYPE)
 
         /* RF5_BA_ELEC */
     case RF5_SPELL_START + 1:
-        if (monster_is_powerful(m_idx))
+        if (powerful)
         {
             dam = (rlev * 4) + 50;
             dice_num = 10;
@@ -3859,7 +3851,7 @@ int monspell_damage(int SPELL_NUM, int m_idx, int TYPE)
 
         /* RF5_BA_FIRE */
     case RF5_SPELL_START + 2:
-        if (monster_is_powerful(m_idx))
+        if (powerful)
         {
             dam = (rlev * 4) + 50;
             dice_num = 10;
@@ -3875,7 +3867,7 @@ int monspell_damage(int SPELL_NUM, int m_idx, int TYPE)
 
         /* RF5_BA_COLD */
     case RF5_SPELL_START + 3:
-        if (monster_is_powerful(m_idx))
+        if (powerful)
         {
             dam = (rlev * 4) + 50;
             dice_num = 10;
@@ -3891,14 +3883,14 @@ int monspell_damage(int SPELL_NUM, int m_idx, int TYPE)
 
         /* RF5_BA_POIS */
     case RF5_SPELL_START + 4:
-        mult = monster_is_powerful(m_idx) ? 2 : 1;
+        mult = powerful ? 2 : 1;
         dice_num = 12;
         dice_side = 2;
         break;
 
         /* RF5_BA_NETH */
     case RF5_SPELL_START + 5:
-        dam = 50 + (rlev * (monster_is_powerful(m_idx) ? 2 : 1));
+        dam = 50 + (rlev * powerful ? 2 : 1);
         dice_num = 10;
         dice_side = 10;
         break;
@@ -3907,7 +3899,7 @@ int monspell_damage(int SPELL_NUM, int m_idx, int TYPE)
     case RF5_SPELL_START + 6:
         dam = 50;
         dice_num = 1;
-        dice_side = (monster_is_powerful(m_idx) ? (rlev * 3) : (rlev * 2));
+        dice_side = powerful ? (rlev * 3) : (rlev * 2);
         break;
 
         /* RF5_BA_MANA */
@@ -3965,7 +3957,7 @@ int monspell_damage(int SPELL_NUM, int m_idx, int TYPE)
 
         /* RF5_BO_ACID */
     case RF5_SPELL_START + 16:
-        mult = monster_is_powerful(m_idx) ? 2 : 1;
+        mult = powerful ? 2 : 1;
         dam = rlev / 3 * (mult / div);
         dice_num = 7;
         dice_side = 8;
@@ -3973,7 +3965,7 @@ int monspell_damage(int SPELL_NUM, int m_idx, int TYPE)
 
         /* RF5_BO_ELEC */
     case RF5_SPELL_START + 17:
-        mult = monster_is_powerful(m_idx) ? 2 : 1;
+        mult = powerful ? 2 : 1;
         dam = rlev / 3 * (mult / div);
         dice_num = 4;
         dice_side = 8;
@@ -3981,7 +3973,7 @@ int monspell_damage(int SPELL_NUM, int m_idx, int TYPE)
 
         /* RF5_BO_FIRE */
     case RF5_SPELL_START + 18:
-        mult = monster_is_powerful(m_idx) ? 2 : 1;
+        mult = powerful ? 2 : 1;
         dam = rlev / 3 * (mult / div);
         dice_num = 9;
         dice_side = 8;
@@ -3989,7 +3981,7 @@ int monspell_damage(int SPELL_NUM, int m_idx, int TYPE)
 
         /* RF5_BO_COLD */
     case RF5_SPELL_START + 19:
-        mult = monster_is_powerful(m_idx) ? 2 : 1;
+        mult = powerful ? 2 : 1;
         dam = rlev / 3 * (mult / div);
         dice_num = 6;
         dice_side = 8;
@@ -4004,14 +3996,14 @@ int monspell_damage(int SPELL_NUM, int m_idx, int TYPE)
 
         /* RF5_BO_NETH */
     case RF5_SPELL_START + 21:
-        dam = 30 + (rlev * 4) / (monster_is_powerful(m_idx) ? 2 : 3);
+        dam = 30 + (rlev * 4) / (powerful ? 2 : 3);
         dice_num = 5;
         dice_side = 5;
         break;
 
         /* RF5_BO_WATE */
     case RF5_SPELL_START + 22:
-        dam = (rlev * 3 / (monster_is_powerful(m_idx) ? 2 : 3));
+        dam = (rlev * 3 / (powerful ? 2 : 3));
         dice_num = 10;
         dice_side = 10;
         break;
@@ -4025,14 +4017,14 @@ int monspell_damage(int SPELL_NUM, int m_idx, int TYPE)
 
         /* RF5_BO_PLAS */
     case RF5_SPELL_START + 24:
-        dam = 10 + (rlev * 3 / (monster_is_powerful(m_idx) ? 2 : 3));
+        dam = 10 + (rlev * 3 / (powerful ? 2 : 3));
         dice_num = 8;
         dice_side = 7;
         break;
 
         /* RF5_BO_ICEE */
     case RF5_SPELL_START + 25:
-        dam = (rlev * 3 / (monster_is_powerful(m_idx) ? 2 : 3));
+        dam = (rlev * 3 / (powerful ? 2 : 3));
         dice_num = 6;
         dice_side = 6;
         break;
@@ -4072,9 +4064,9 @@ int monspell_damage(int SPELL_NUM, int m_idx, int TYPE)
 
         /* RF6_PSY_SPEAR */
     case RF6_SPELL_START + 11:
-        dam = monster_is_powerful(m_idx) ? 150 : 100;
+        dam = powerful ? 150 : 100;
         dice_num = 1;
-        dice_side = monster_is_powerful(m_idx) ? (rlev * 2) : (rlev * 3 / 2);
+        dice_side = powerful ? (rlev * 2) : (rlev * 3 / 2);
         break;
 
     case RF6_SPELL_START + 12: return -1;   /* RF6_DARKNESS */
@@ -4108,3 +4100,46 @@ int monspell_damage(int SPELL_NUM, int m_idx, int TYPE)
 
     return dam;
 }
+
+
+/*!
+* @brief ¥â¥ó¥¹¥¿¡¼¤Î»È¤¦¼öʸ¤Î°ÒÎϤòÊÖ¤¹ /
+* @param SPELL_NUM ¼öʸÈÖ¹æ
+* @param m_idx ¼öʸ¤ò¾§¤¨¤ë¥â¥ó¥¹¥¿¡¼ID
+* @param TYPE  DAM_MAX¤ÇºÇÂçÃͤòÊÖ¤·¡¢DAM_MIN¤ÇºÇ¾®ÃͤòÊÖ¤¹¡£DAM_ROLL¤Ï¥À¥¤¥¹¤ò¿¶¤Ã¤ÆÃͤò·èÄꤹ¤ë¡£
+* @return ¹¶·â¼öʸ¤Î¥À¥á¡¼¥¸¤òÊÖ¤¹¡£¹¶·â¼öʸ°Ê³°¤Ï-1¤òÊÖ¤¹¡£
+*/
+int monspell_damage(int SPELL_NUM, int m_idx, int TYPE)
+{
+    monster_type    *m_ptr = &m_list[m_idx];
+    monster_race    *r_ptr = &r_info[m_ptr->r_idx];
+    int hp;
+    int rlev = monster_level_idx(m_idx);
+
+    if (TYPE == DAM_MAX)
+    {
+        hp = m_ptr->max_maxhp;
+    }
+    else if (TYPE == DAM_ROLL)
+    {
+        hp = m_ptr->hp;
+    }
+    return monspell_damage_base(SPELL_NUM, hp, rlev, monster_is_powerful(m_idx), r_ptr, TYPE);
+}
+
+/*!
+* @brief ¥â¥ó¥¹¥¿¡¼¤Î»È¤¦¼öʸ¤Î°ÒÎϤòÊÖ¤¹ /
+* @param SPELL_NUM ¼öʸÈÖ¹æ
+* @param r_idx ¼öʸ¤ò¾§¤¨¤ë¥â¥ó¥¹¥¿¡¼¤Î¼ï²ID
+* @param TYPE  DAM_MAX¤ÇºÇÂçÃͤòÊÖ¤·¡¢DAM_MIN¤ÇºÇ¾®ÃͤòÊÖ¤¹¡£DAM_ROLL¤Ï¥À¥¤¥¹¤ò¿¶¤Ã¤ÆÃͤò·èÄꤹ¤ë¡£
+* @return ¹¶·â¼öʸ¤Î¥À¥á¡¼¥¸¤òÊÖ¤¹¡£¹¶·â¼öʸ°Ê³°¤Ï-1¤òÊÖ¤¹¡£
+*/
+int monspell_race_damage(int SPELL_NUM, int r_idx, int TYPE)
+{
+    monster_race    *r_ptr = &r_info[r_idx];
+    int rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
+    bool powerful = r_ptr->flags2 & RF2_POWERFUL;
+    u32b hp = r_ptr->hdice * (ironman_nightmare ? 2 : 1) * r_ptr->hside;
+
+    return monspell_damage_base(SPELL_NUM, MIN(30000, hp), rlev, powerful, r_ptr, TYPE);
+}
\ No newline at end of file