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));