The Witcher 3: Wild Hunt

The Witcher 3: Wild Hunt

View Stats:
MULTIPASS May 27, 2021 @ 7:02am
Why Quen doesn't do what it should
I want to break it down for you guys and show why Quen is a broken mechanic that trivializes the game difficulty.

The tooltip for Quen says something along the lines of "The Quen shield absorbs x amount of damage before breaking." The truth is more like "The Quen shield makes you invulnerable to damage until it breaks." The key difference is that Quen is not actually limited to blocking x amount of damage, it blocks ALL damage as long as the shield has at least 1 point of health left. But why is that?

This is the code that the game uses to determine how Quen reduces damage from enemy attacks:


if(incomingDamage < parent.shieldHealth)
reducedDamage = incomingDamage;
else
reducedDamage = MaxF(incomingDamage, parent.shieldHealth);


There are 2 possible conditions here, with 2 possible solutions for the variable reducedDamage, but I will show you why both conditions always return the same value.

Condition 1: If the incoming attack damage is less than your shield health, Quen blocks all the damage, A 50 damage attack will be completely blocked if you have 100 shield health. That all makes sense and works how you expect it would.

Condition 2: If the incoming damage is equal to or greater than your shield health, the reduced damage is the LARGER one of these two numbers: the incoming damage or your shield health. THIS MAKES NO SENSE! Because of the conditions, we already know that the incoming damage is at least equal to your shield health, probably greater than. The only possible outcome of this statement is that Quen blocks all the damage, JUST LIKE THE FIRST CONDITION.

You could rewrite this entire structure as this...


reducedDamage = incomingDamage;


... and the outcome would be exactly the same!

The logical way that Quen should work would be to change the whole thing to this:


reducedDamage = MinF(incomingDamage, parent.shieldHealth);


With this setup, Quen would only block damage up to the amount of shield health it has left. So if you got hit for 1,000 damage and have 500 health on your shield, 500 points of damage would be subtracted and the rest would go through.
< >
Showing 1-11 of 11 comments
Yumeko May 27, 2021 @ 8:59am 
We all know cdpr are the best coders. They do not make any bugs, only happy little accidents.

There exists many hundreds of bug fixes from the community. And there are still more bug fixes to go, not covered by mods yet...
Last edited by Yumeko; May 27, 2021 @ 9:20am
Aeltoth May 27, 2021 @ 9:32am 
Looks like your fix is still wrong ahah, Min(a, b) would result in 200 damage taken in the following scenario:
- damage taken: 1000
- shield health: 200

The "solution" where Quen actually reduces damage would be:

reducedDamage = incomingDamage - parent.shieldHealth;

But i think the vanilla code was made on purpose. We could see Quen as a barrier that either blocks or breaks and when it breaks it doesn't do anything. Which is exactly what we have with the vanilla code.
MULTIPASS May 27, 2021 @ 9:44am 
Originally posted by Aeltoth:
Looks like your fix is still wrong ahah, Min(a, b) would result in 200 damage taken in the following scenario:
- damage taken: 1000
- shield health: 200

The "solution" where Quen actually reduces damage would be:

reducedDamage = incomingDamage - parent.shieldHealth;

But i think the vanilla code was made on purpose. We could see Quen as a barrier that either blocks or breaks and when it breaks it doesn't do anything. Which is exactly what we have with the vanilla code.

reducedDamage is subtracted from the total incoming damage later in the script, I just didn't show that.

See here:

damageData.processedDmg.vitalityDamage -= reducedDamage;

What you described is how people view the effect in practice, but it conflicts with the in-game tooltips and begs the question of why the shield has a health integer at all, or why the code involves calculating damage and subtracting it etc.
Last edited by MULTIPASS; May 27, 2021 @ 9:46am
★ FmNey ★ May 27, 2021 @ 9:54am 
Why not make it a mod if you're not satisfied?
AsuraStrike May 27, 2021 @ 9:57am 
that pseudocode looks dumb af.
the last line should just be
reducedDamage = shieldHealth
because you already know incomingDamage is greater from the if
you're just wasting computing resources
MULTIPASS May 27, 2021 @ 10:01am 
Originally posted by Asura:
that pseudocode looks dumb af.
the last line should just be
reducedDamage = shieldHealth
because you already know incomingDamage is greater from the if
you're just wasting computing resources

But the damage could be less than the shield health - in this scenario you get rid of the if/else structure completely and just use that single line to cover all possibilities.
MULTIPASS May 27, 2021 @ 10:03am 
Originally posted by FmNey:
Why not make it a mod if you're not satisfied?

Changing Quen was the whole reason I got into making mods for W3, but just making this change wouldn't fix Quen because the shield health is in no way balanced for the game. This "bug" is actually a band-aid over the fact that health and damage scaling is so poorly balanced over the course of your leveling.
★ FmNey ★ May 27, 2021 @ 10:29am 
Quen has always been like this even in witcher 2 so it's barely a bug in W3
VulcanTourist May 27, 2021 @ 1:10pm 
Originally posted by orksmith:
I want to break it down for you guys and show why Quen is a broken mechanic that trivializes the game difficulty.
You fail to acknowledge the possibility that the mechanic is intentional, for reasons with which you simply disagree. As someone else noted, having the same mechanic in more than one sequel makes it very unlikely that it's an unintended bug. Of course it's your right to disagree, and that is why modding exists. Go shape the mechanic as you see fit and publish your mod, but don't call it a bug and demand or imply that everyone else must play according to your reasoning.
MULTIPASS May 27, 2021 @ 1:42pm 
Originally posted by VulcanTourist:
You fail to acknowledge the possibility that the mechanic is intentional, for reasons with which you simply disagree.

I showed that the code they use is completely nonsensical. It appears to indicate that there could be a scenario where the shield blocks less than 100% of the damage from an attack.

Having this conditional if/else statement means it should work like this:

if Condition 1, then result A.
Otherwise, if not Condition 1, then result B.

But the way it's written is like this:

if Condition 1, then result A.
Otherwise, if not Condition 1, then... also result A.

What's the point of having the conditional statement at all?
Last edited by MULTIPASS; May 27, 2021 @ 2:00pm
Castyles May 27, 2021 @ 2:15pm 
Originally posted by FmNey:
Quen has always been like this even in witcher 2 so it's barely a bug in W3
Word.
< >
Showing 1-11 of 11 comments
Per page: 1530 50

Date Posted: May 27, 2021 @ 7:02am
Posts: 11