Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[CR]Melee combat rebalance #14741

Merged
merged 11 commits into from Jan 16, 2016

Conversation

Projects
None yet
4 participants
@Coolthulhu
Copy link
Contributor

commented Jan 6, 2016

Problems I'm addressing here:

  • There are no good "dedicated bashing weapons" - most bashing damage comes from stats and crits
  • Bashing weapons need crits to matter
  • Unarmed scores way too many crits
  • Torso encumbrance isn't granular enough, has breakpoints at 10s
  • Improvised weapons should be better than fists at low skill levels
  • Bashing weapons should be better than (martial-art-less) fists at mid levels
  • Unarmed should still be useful at high levels, though
  • Bonus damage calculation from strength is weird, rewards mostly mutant cyborgs
  • AoE attacks suck hard, make them not less-than-worthless

Leaving for later:

  • Slow weapons suck hard, make quick-strike-less weapons above 120 move cost usable

How I'm trying to achieve it:

  • Fixed a typo: unarmed weapons had guaranteed "accuracy crit component" by lvl 2 skill, now it takes lvl 20
  • Streamlined bonus damage from strength. Still a bit arcane, but now much "flatter" - no giant bumps due to crits, no giant bumps above certain thresholds.
  • Brought bashing damage closer to cutting and piercing in calculation. Mostly done by getting rid of "recursive rng" (that is, rng( x, rng( y, rng( z, w ) ) ))
  • Lessened the effect of "weak character cap" on strong bashing weapons. It was one of the things that made weapons like sledgehammer useless. Sledgehammer now has per-hit damage comparable to katana, though at twice the time per attack...
  • Removed exotic bonuses to bashing damage on crit. Those mostly resulted in per-hit bonuses and so benefited light weapon users much more than mid and heavy weapon users.
  • Strength now guarantees less RNG risk when dealing bashing damage. At 20, damage becomes mostly constant
  • Nerfed cutting damage scaling on crit. Cutting damage has a lot of bonuses and good weapons. Gains minor armor piercing to compensate.
  • Buffed AoE attacks hard - made extra attacks free of charge (no moves and no stamina). It still isn't a good idea to use them, but now it isn't a BAD idea to have them ever trigger. They may even save your life rather than making the situation worse in almost every case.
  • Allowed dodges and blocks to recharge when out of moves. This doesn't affect light weapon users, but makes using heavy weapons less of a suicide and more of a tactic
  • Nerfed Niten's flat damage bonus from perception. As a flat bonus, it doesn't mesh well with all the multiplicative bonuses, making Niten crazy good. It still is really good and deserves more nerfs.
  • Lowered stamina cost of using heavy weapons.
  • Increased torso encumbrance granularity in accuracy calculations. Only on the attacker's side, though. Dodge penalty is still quantized at 10s
  • Capped stuck penalty move cost at 100. It can still cause weapon loss, just won't also cause loss of more than one turn at the same time

As a bonus:

  • Refactored message generation. This should result in more variety, as some "lost" messages are now re-enabled. Also more readability.
  • Refactored blocking and melee wear. Should be easier to implement shields, when time comes for that.
  • Fixed a bug where knocking a monster back into darkness/smoke would say "you hit something" despite the monster being seen before knockback
  • Added unarmed training on mutant body part hit (only the first one)
@chaosvolt

This comment has been minimized.

Copy link
Contributor

commented Jan 6, 2016

Ooh this should be good to see.

@chaosvolt

This comment has been minimized.

Copy link
Contributor

commented Jan 8, 2016

Hmm. That was surprising, to see the code for the shield PR being done on here instead. Guess I can revert my clusterfuck of an attempted commit, and the other perequisites (making shields take up a hand, prevent wearing multiple shields) are already covered in the PR.

Sorry about that. x.x

@Coolthulhu Coolthulhu changed the title [WiP][CR]Melee combat rebalance [CR]Melee combat rebalance Jan 9, 2016

Coolthulhu added some commits Jan 9, 2016

@Coolthulhu

This comment has been minimized.

Copy link
Contributor Author

commented Jan 9, 2016

More adjustments:

  • Nerfed fencing's upgraded quick attacks
  • Fixed some mistyped effects in martial arts and techniques. Tiger style buff, puno strike and drunk counter
  • Buffed brute/hulk/shocker brute cut armor. Nerfed hulk's bash armor a bit to compensate

Overall the PR is mostly about nerfing cutting/piercing weapons, which are (still) way stronger than bashing ones.


// Three last values are for low damage
static const std::array<std::string, 6> player_stab = {{
"You impale %s", "You gouge %s", "You run %s through",

This comment has been minimized.

Copy link
@BevapDin

BevapDin Jan 9, 2016

Contributor

The strings are not extracted for translation, so attempting to translate them at the end of this function will properly do nothing.

This comment has been minimized.

Copy link
@Coolthulhu

Coolthulhu Jan 9, 2016

Author Contributor

What is the proper way of doing that? Would translating them inside the arrays cause any unspecified behavior or be executed before translating system is set up or anything like that?
I recall _( str.c_str() ) being used in iuse_actor.cpp - what's the difference between that and those lines?

This comment has been minimized.

Copy link
@kevingranade

kevingranade Jan 10, 2016

Member

If it's just a variable being passed to _, it's probably a json string, which has been extracted elsewhere.
As long as the array is initialized inside a function it'll be fine, static type foo = something; has semantics of "do this the first time this code is executed", and if the statement is inside a function that means it happens after gettext is initialized, if it's outside a function is when it's a problem.

This comment has been minimized.

Copy link
@kevingranade

kevingranade Jan 16, 2016

Member

This might clarify, _() actually does two things, one is it "captures" the string, which happens in a step where gettext processes (not compiles!) all the source code, all this does is build a list of literal strings enclosed in _().
The second thing kicks in at runtime, where _() becomes a macro that passes the string to the gettext library for translation, this may happen at the same site as where the capture occurs, or it can also happen elsewhere.
As long as the _() invocation happens after the gettext library is initialized (in practice, within any function as I outlined), it will be able to do the translation.

@kevingranade

This comment has been minimized.

Copy link
Member

commented Jan 10, 2016

The only balance issue I'm concerned about is Allowed dodges and blocks to recharge when out of moves., so now dodges and blocks recover once per turn regardless of speed, which is a huge buff to characters with low speed (generally lowered by pain). So even if you're crippled with pain you still have a full complement of dodges.

@Coolthulhu

This comment has been minimized.

Copy link
Contributor Author

commented Jan 10, 2016

Full dodges when crippled still happens even now, it's just that you have to use quick attacks or pistols to exploit it. As long as you never spend double your speed, you get all dodges and blocks.
It's one of the reasons quick attacks are so much better than slow ones - slow ones make you defenseless and totally reliant on armor (or stun/knockback/downing).

How about giving some penalty to dodging at low speed instead of forbidding it totally?
That way using a fast weapon wouldn't prevent being crippled hurting dodges and performing a single moderately-heavy weapon attack while low on stamina wouldn't mean eating 4 attacks from a single zombie.

@kevingranade

This comment has been minimized.

Copy link
Member

commented Jan 10, 2016

Good point about the issue being pre-existing, it just makes it a little more pervasive, and yes I was fishing for solutions since I didn't have one ;)
Speed influencing passive actions makes sense, and sounds fairer than the current situation.

This did make me think though, it would be interesting to have moves you expend without doing anything used to like regain your equilibrium and position in combat, giving bonuses (or eliminating penalties) to block/dodge/etc. It could be mediated via martial style.

@Coolthulhu

This comment has been minimized.

Copy link
Contributor Author

commented Jan 10, 2016

At low speed (<100) the dodge results are now multiplied by speed / 100.
Went with scaling rather than a flat penalty, because a flat penalty would either have to be negligible or would prevent fresh survivors from dodging just because they got chilled by the wind.

@@ -1492,30 +1475,24 @@ bool player::block_hit(Creature *source, body_part &bp_hit, damage_instance &dam
thing_blocked_with = body_part_name(bp_hit);
}

//~ Adjective in "You block <adjective> of the damage with your <weapon>.

This comment has been minimized.

Copy link
@kevingranade

kevingranade Jan 16, 2016

Member

I'll just revert while merging, but //~ is a special comment that gets applied to the _("") string on the following line, it actually needed to be added to each of those lines. Unless I've missed something and gettext is way smarter than I think it is.

@kevingranade kevingranade merged commit ba5c0cd into CleverRaven:master Jan 16, 2016

1 check passed

default
Details
@chaosvolt

This comment has been minimized.

Copy link
Contributor

commented Jan 16, 2016

Ah, nice. Now I'll be back to ensuring the shield PR is in working order.

@Coolthulhu Coolthulhu deleted the cataclysmbnteam:melee-nerf branch Feb 23, 2016

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.