Skip to content
Permalink
Browse files

Slow down the Throwing trolley

Throwing has been positioned as an extremely strong option since around
0.15, outstripping most other forms of non-magical attack. This is because
it does damage equivalent to UC with up to 10 levels of claws at speeds of
up to 5 AUT while having full screen range and requiring no hands at all.
Despite all that, many races have strong aptitudes.

This is a first draft solution: make throwing use delay like weapons rather
than like UC. This means that the delays start higher and get down to 7 AUT
instead of 5 AUT, but the delays decrease faster with added skill. The
actual damage per throw remains unaltered.

In practice, this means that throwing deals about 25-50% less damage over
time while dealing the same amount of damage per throw.

I expect further changes will be warranted, including perhaps disentangling
my current solution of tying delay to damage, particularly if the ranged
reform project takes off, but I felt that it was necessary to apply a nerf
to this overpowered form of combat right now.
  • Loading branch information...
cbuchananhowland committed Mar 27, 2016
1 parent 8b6524e commit a94d5ab7b7ba6168665dc288095cc9f791d610d0
Showing with 37 additions and 4 deletions.
  1. +20 −1 crawl-ref/source/describe.cc
  2. +14 −3 crawl-ref/source/player-act.cc
  3. +3 −0 crawl-ref/source/player.h
@@ -1254,7 +1254,26 @@ static string _describe_ammo(const item_def &item)

const int dam = property(item, PWPN_DAMAGE);
if (dam)
description += make_stringf("\nBase damage: %d\n", dam);
{
const int throw_delay = (10 + dam / 2);
const string your_skill = crawl_state.need_save ?
make_stringf("\n (Your skill: %.1f)",
(float) you.skill(SK_THROWING, 10) / 10)
: "";

description += make_stringf(
"\nBase damage: %d Base attack delay: %.1f"
"\nThis projectile's minimum attack delay (%.1f) "
"is reached at skill level %d."
"%s",
dam,
(float) throw_delay / 10,
(float) FASTEST_PLAYER_THROWING_SPEED / 10,
(throw_delay - FASTEST_PLAYER_THROWING_SPEED) * 2,
your_skill.c_str()
);
}


if (ammo_always_destroyed(item))
description += "\nIt will always be destroyed on impact.";
@@ -261,11 +261,22 @@ random_var player::attack_delay(const item_def *projectile, bool rescale) const
const int DELAY_SCALE = 20;
const int base_shield_penalty = adjusted_shield_penalty(DELAY_SCALE);

if (projectile && is_launched(this, weap, *projectile) == LRET_THROWN
|| !weap)
if (projectile && is_launched(this, weap, *projectile) == LRET_THROWN)
{
// Thrown weapons use 10 + projectile damage to determine base delay.
const skill_type wpn_skill = SK_THROWING;
const int projectile_delay = 10 + property(*projectile, PWPN_DAMAGE) / 2;
attk_delay = random_var(projectile_delay);
attk_delay -= div_rand_round(random_var(you.skill(wpn_skill, 10)),
DELAY_SCALE);

// apply minimum to weapon skill modification
attk_delay = rv::max(attk_delay,
random_var(FASTEST_PLAYER_THROWING_SPEED));
}
else if (!weap)
{
int sk = form_uses_xl() ? experience_level * 10 :
projectile ? skill(SK_THROWING, 10) :
skill(SK_UNARMED_COMBAT, 10);
attk_delay = random_var(10) - div_rand_round(random_var(sk), 27*2);

@@ -56,6 +56,9 @@ static const int BONE_ARMOUR_HIT_RATIO = 50;
static const int FASTEST_PLAYER_MOVE_SPEED = 6;
// relevant for swiftness, etc

// Min delay for thrown projectiles.
static const int FASTEST_PLAYER_THROWING_SPEED = 7;

class targetter;

int check_stealth();

0 comments on commit a94d5ab

Please sign in to comment.
You can’t perform that action at this time.