From afdca80fa54c9402be04f57589a70e29d75dbcd6 Mon Sep 17 00:00:00 2001 From: dis- Date: Tue, 19 Mar 2013 23:15:42 +0000 Subject: [PATCH] Good to_h Bows makes more critical. Decrease ammo's contribution. --- src/bldg.c | 9 ++++++--- src/cmd1.c | 13 ++++++++----- src/cmd2.c | 4 ++-- src/externs.h | 4 ++-- src/flavor.c | 2 +- 5 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/bldg.c b/src/bldg.c index 728888fe9..9be4995b8 100644 --- a/src/bldg.c +++ b/src/bldg.c @@ -3113,18 +3113,21 @@ static void town_history(void) screen_load(); } -s16b calc_expect_crit_shot(int weight, int plus, int dam) +s16b calc_expect_crit_shot(int weight, int plus_ammo, int plus_bow, int dam) { u32b num; int i, k, crit; /* Extract "shot" power */ - i = ((p_ptr->to_h_b + plus) * 4) + (p_ptr->lev * 2); - + 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; k = 0; diff --git a/src/cmd1.c b/src/cmd1.c index b33e45756..51347f531 100644 --- a/src/cmd1.c +++ b/src/cmd1.c @@ -86,17 +86,20 @@ bool test_hit_norm(int chance, int ac, int vis) * Critical hits (from objects thrown by player) * Factor in item weight, total plusses, and player level. */ -s16b critical_shot(int weight, int plus, int dam) +s16b critical_shot(int weight, int plus_ammo, int plus_bow, int dam) { int i, k; - + /* Extract "shot" power */ - i = ((p_ptr->to_h_b + plus) * 4) + (p_ptr->lev * 2); - + 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); + /* Critical hit */ if (randint1(5000) <= i) { diff --git a/src/cmd2.c b/src/cmd2.c index b96fd6aba..c6af4a167 100644 --- a/src/cmd2.c +++ b/src/cmd2.c @@ -3806,7 +3806,7 @@ void do_cmd_fire_aux(int item, object_type *j_ptr) { /* Apply special damage XXX XXX XXX */ tdam = tot_dam_aux_shot(q_ptr, tdam, m_ptr); - tdam = critical_shot(q_ptr->weight, q_ptr->to_h, tdam); + tdam = critical_shot(q_ptr->weight, q_ptr->to_h, j_ptr->to_h, tdam); /* No negative damage */ if (tdam < 0) tdam = 0; @@ -4472,7 +4472,7 @@ bool do_cmd_throw_aux(int mult, bool boomerang, int shuriken) tdam = damroll(dd, ds); /* Apply special damage XXX XXX XXX */ tdam = tot_dam_aux(q_ptr, tdam, m_ptr, 0, TRUE); - tdam = critical_shot(q_ptr->weight, q_ptr->to_h, tdam); + tdam = critical_shot(q_ptr->weight, q_ptr->to_h, 0, tdam); if (q_ptr->to_d > 0) tdam += q_ptr->to_d; else diff --git a/src/externs.h b/src/externs.h index 49499368e..8feca19f5 100644 --- a/src/externs.h +++ b/src/externs.h @@ -698,7 +698,7 @@ extern void glow_deep_lava_and_bldg(void); /* cmd1.c */ extern bool test_hit_fire(int chance, int ac, int vis); extern bool test_hit_norm(int chance, int ac, int vis); -extern s16b critical_shot(int weight, int plus, int dam); +extern s16b critical_shot(int weight, int plus_ammo, int plus_bow, int dam); extern s16b critical_norm(int weight, int plus, int dam, s16b meichuu, int mode); extern s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, int mode, bool thrown); extern void search(void); @@ -1299,7 +1299,7 @@ extern void quest_discovery(int q_idx); extern int quest_number(int level); extern int random_quest_number(int level); extern bool tele_town(void); -extern s16b calc_expect_crit_shot(int weight, int plus, int dam); +extern s16b calc_expect_crit_shot(int weight, int plus_ammo,int plus_bow, int dam); extern s16b calc_expect_crit(int weight, int plus, int dam, s16b meichuu, bool dokubari); /* util.c */ diff --git a/src/flavor.c b/src/flavor.c index 9fca28e65..f98e7a62f 100644 --- a/src/flavor.c +++ b/src/flavor.c @@ -2444,7 +2444,7 @@ void object_desc(char *buf, object_type *o_ptr, u32b mode) t = object_desc_str(t, "/shot, "); /* Apply Expect damage of Critical */ - avgdam = calc_expect_crit_shot(o_ptr->weight, o_ptr->to_h, avgdam); + avgdam = calc_expect_crit_shot(o_ptr->weight, o_ptr->to_h, bow_ptr->to_h, avgdam); t = object_desc_num(t, avgdam); t = object_desc_str(t, "/crit, "); -- 2.11.0