PDA

View Full Version : Negative Multipliers


Bluddy
11-03-2011, 01:42 PM
Shadow, regarding the notion of carrying out negative multipliers as 1/(1-%), I think that even though it has the benefit of never reaching -100%, this isn't a good idea. This is applicable to DC but also to the next game.

The problem in DC is that as you apply that negative multiplier, it becomes less and less effective even though you're charging more and more for it. Take for example a physical damage multiplier of -20% per level, that starts at a cost of 1. At level 1, the result is 1/1.2 = 0.83 ie. close to 20%. So one level is pretty much worth it. But level 2 gives 1/(1+0.4) = 1/1.4 = 0.71. So level 2 only gave us another 12% of reduced damage even though it cost 2 points! At level 10, we get 1/(1+2) = 0.33, but compared to level 9, which is 1/(1+1.8) = 0.35, we only got a 2% decrease while we paid 10 points for it (10x more than level 1 but 1/10 the effectiveness).

The result of this disparity between negative and positive multipliers is that it's never worth it to invest more than 1 or 2 levels in negative multipliers, while positive multipliers are always good value. It makes all negative multiplier skills unattractive. To solve this, negative multipliers should affect the amount modified directly. If they cause -100% of the amount, so be it. The amounts should be precalculated so that it's hard to hit -100% unless you really try. For example, for damage, a reduction of -3% per level will almost certainly assure that -100% is never attained.

Note that skills involving speed (weapon speed, cast speed, attack speed) need to keep the special formula. This is because the multipliers correspond to speed (hits/second) while the numbers presented in the game are units of time (seconds). Since speed = 1/time, any % increase/decrease in speed will be (100 + X)% of speed, which in time units will be 1/(100% + X%) ie. 1/(1+%).

Bluddy
11-18-2011, 12:55 PM
I really consider this to be the biggest balancing hurdle in the game right now. I also realize it's not practical to make all multipliers work directly rather than using the formula. You probably have internal variables that use the multipliers, and there are world multipliers (for example) that use -1.0 to mean -0.5, that would break if there was a sudden switch to directly affecting values.

How about this idea then: since the system uses keywords (like 'Mult' and 'Change') how about a new keyword that would behave like Mult for positive values, and affect percentages directly for negative values. It called be called 'DirectMult' or something like that. So a StatDirectMultAttack 0.5 will give +50% and a StatDirectMultAttack -0.5 will give -50% rather than -0.33 for StatMultAttack -0.5. This gives a choice of how to do each multiplier.

Shadow
12-16-2011, 10:58 AM
I can look into adding something like that but off hand I'm guessing that it's not going to be feasible since the multipliers are used in a lot of different places.

Bluddy
12-16-2011, 11:27 AM
I can look into adding something like that but off hand I'm guessing that it's not going to be feasible since the multipliers are used in a lot of different places.

It's probably common code though that does the negative multiplier formula, right? If so, there could (hopefully) be another keyword that'll activate a different path through that common code.

Bluddy
12-20-2011, 08:41 PM
Also, I only need this for player skills and player status effects ie. the places where multipliers add up with skill level. If you could add the keyword 'DirectMult' just for player skills and player status effects, that would be perfect.

Shadow
01-03-2012, 10:51 AM
It's probably common code though that does the negative multiplier formula, right? If so, there could (hopefully) be another keyword that'll activate a different path through that common code.

There is common code that does the calculations, but that doesn't mean it's easy to change without making a lot of other things more complex.

Bluddy
01-03-2012, 02:09 PM
I'm not sure how the multiplier common code is implemented, but if each stat in the game is an object that has getValue() and setValue() members, you could turn the value change into a class, and then you'd have a ChangeStat class, a MultStat class and a DirectMult class, which would all modifyStat() a game stat. Since you already support both changing a stat and multiplying it fairly generically, there should be some infrastructure similar to this...?