So I decided to go ahead and hunt down how much XP is actually gained from using throwing.
Basically if you hit the target you get XP based on how far away they are and how good a hit it was, but if you miss you just get 10.
// Copied from the shooting function
const int range_multiplier = std::min( range, 3 * ( get_skill_level( skill_used ) + 1 ) );
constexpr int damage_factor = 21;
if( missed_by <= .1 ) {
practice( skill_used, damage_factor * range_multiplier );
// TODO: Check target for existence of head
if( dealt_attack.hit_critter != nullptr ) {
lifetime_stats()->headshots++;
}
} else if( missed_by <= .2 ) {
practice( skill_used, damage_factor * range_multiplier / 2 );
} else if( missed_by <= .4 ) {
practice( skill_used, damage_factor * range_multiplier / 3 );
} else if( missed_by <= .6 ) {
practice( skill_used, damage_factor * range_multiplier / 4 );
} else if( missed_by <= 1.0 ) {
practice( skill_used, damage_factor * range_multiplier / 5 );
} else {
practice( skill_used, 10 );
}
For reference, missed_by is counted in tiles, the second to last one at <=1.0 would be a graze.
Elsewhere in the throwing function there are tons and tons of deviation modifiers, from stats to item volume to weight.
Might want to increase the effect low skill has on accuracy, which will probably solve the problem, currently throwing is awfully accurate even at 0 skill.
Doesn’t even necessarily decrease accuracy at all, but below 3 skill it does run two tries:
[code]///\EFFECT_THROW <8 randomly increases throwing deviation
if( skill_level < 3 ) {
deviation += rng(0, 8 - skill_level);
}
if( skill_level < 8 ) {
deviation += rng(0, 8 - skill_level);
[/code]
I’m also not entirely sure whether there’s an issue with the conversion from deviation to shot dispersion, but that’s a whole different thing:
// Rescaling to use the same units as projectile_attack
const double shot_dispersion = deviation * (.01 / 0.00021666666666666666);