OSDN Git Service

Add new option -- show critical ratio of ammo
[hengband/hengband.git] / src / bldg.c
index 3e3e47d..0f6bcb3 100644 (file)
@@ -3113,16 +3113,71 @@ static void town_history(void)
        screen_load();
 }
 
+/* critical happens at i / 10000 */
+s16b calc_crit_ratio_shot(int weight, int plus_ammo, int plus_bow,  int dam)
+{
+       int i;
+       
+       /* Extract "shot" power */
+       i = p_ptr->to_h_b * 4 + plus_ammo + (p_ptr->lev * 2);
+       
+       /* Snipers can shot more critically with crossbows */
+       if (p_ptr->concent) i += ((i * p_ptr->concent) / 5);
+       if ((p_ptr->pclass == CLASS_SNIPER) && (p_ptr->tval_ammo == TV_BOLT)) i *= 2;
+       
+       /* Good bow makes more critical */
+       i += MAX(0, plus_bow - 15) * 4 * (p_ptr->concent ? p_ptr->concent + 5 : 5);
+       
+       if (i < 0) i = 0;
+       
+       return i * 2;
+}
+
+s16b calc_expect_crit_shot(int weight, int plus_ammo, int plus_bow,  int dam)
+{
+       u32b num;
+       int i, k, crit;
+       i = calc_crit_ratio_shot(weight, plus_ammo, plus_bow, dam);
+       
+       k = 0;
+       num = 0;
+       
+       crit = MIN(500, 900/weight);
+       num += dam * 3 /2 * crit;
+       k = crit;
+       
+       crit = MIN(500, 1350/weight);
+       crit -= k;
+       num += dam * 2 * crit;
+       k += crit;
+       
+       if(k < 500)
+       {
+               crit = 500 - k;
+               num += dam * 3 * crit;
+       }
+       
+       num /= 500;
+       
+       num *= i;
+       num += (10000 - i) * dam;
+       num /= 10000;
+       
+       return num;
+}
 
 s16b calc_expect_crit(int weight, int plus, int dam, s16b meichuu, bool dokubari)
 {
-       u32b i,k, num;
+       u32b k, num;
+       int i;
        
        if(dokubari) return dam;
        
        i = weight + (meichuu * 3 + plus * 5) + (p_ptr->lev * 3);
+       if (i < 0) i = 0;
+       
        k = weight;
-       num=0;
+       num = 0;
        
        if (k < 400)                                            num += (2 * dam + 5) * (400 - k);
        if (k < 700)                                            num += (2 * dam + 10) * (MIN(700, k + 650) - MAX(400, k));