Martial arts users never deal no damage with a clumsy kick

From EvilHack, under the basis that anyone trained in martial arts (or
is in a powerful kicking polyform or wearing kicking boots) should be
immune from landing such a poor kick. This bypass used to happen only
50% of the time; now it happens all the time.

Note that this only averts the "Your clumsy kick does no damage" case:
it remains possible for a powerfully kicking player to kick clumsily and
have the monster evade or block, for example if they are fumbling or
wearing bulky armor.

Also, documentation: I added a comment explaining what the incredibly
dense and confusing logic is with i and j happening here, for the next
poor soul that has to read that code.
This commit is contained in:
copperwater
2020-04-12 20:56:44 -04:00
committed by Pasi Kallinen
parent a9712442dd
commit d1b5b39e6d
2 changed files with 11 additions and 1 deletions

View File

@@ -782,6 +782,8 @@ looting will do #force if you could do it and the container is locked
and you didn't have a tool to unlock it
use silly names for rays (such as breath weapons) when hallucinating
zombies groan instead of being silent
martial arts users, sasquatches, and heroes wearing kicking boots can
no longer miss a monster completely with a clumsy kick
Fixes to 3.7.0-x Problems that Were Exposed Via git Repository

View File

@@ -216,9 +216,17 @@ kick_monster(struct monst *mon, xchar x, xchar y)
i = -inv_weight();
j = weight_cap();
/* What the following confusing if statements mean:
* If you are over 70% of carrying capacity, you go through a "deal no
* damage" check, and if that fails, a "clumsy kick" check.
* At this % of carrycap | Chance of no damage | Chance of clumsiness
* [70%-80%) | 1/4 | 1/3
* [80%-90%) | 1/3 | 1/2
* [90%-100%) | 1/2 | 1
*/
if (i < (j * 3) / 10) {
if (!rn2((i < j / 10) ? 2 : (i < j / 5) ? 3 : 4)) {
if (martial() && !rn2(2))
if (martial())
goto doit;
Your("clumsy kick does no damage.");
(void) passive(mon, uarmf, FALSE, 1, AT_KICK, FALSE);