Bluddy

02-22-2011, 05:10 AM

In this thread, I'll try to come up with ways to improve the current formula. I believe the problems we're now discovering with the formula are the reason for people experiencing imbalance at higher levels.

For an absorption formula, we want the following things:

- Different armors should absorb roughly set proportions. Off the top of my head, cloth armor should absorb around 10-20%, leather 30-40%, mail 50% and plate 60-70%.

- There should be a cutoff (as there is now) at some percentage so that 100% is impossible. That would make for a boring game and impossible monsters.

- Diminishing returns is probably desirable so that we don't just bump into the cutoff. However, we also need stronger effects at higher levels to counter increasing damage by the monsters. (It's possible that something like a cubic formula, which starts slowly, then gets sharper, and then tapers off, would be better.)

- We want to feel the difference between armors and minimize the feel of diminishing returns.

Meet the current formula:

Absorb % = armor / (armor + (attacker level * 25) + 50)

This function shows that the absorption percentage depends on both the attacker level and your current armor. If you stay at the same armor level while the attacker level goes up, your % absorption will go down and you'll get hurt :)

But if we substitute values for attacker level = 1 into the function, we'll see that it simplifies to the following function:

y = x / (x + 75) where y = % absorption and x = armor.

This function behaves quite nicely, since it tapers off to 1.0 (100%). This is convenient since 100% is our maximum absorption (though the game limits absorption to 75%). It also rises pretty slowly, which equates to diminishing returns. You can see what it looks like in the picture (current_func.jpg).

Notice that the function has a faster, almost linear pace up to around 75 (trust me, that's more or less where it's at). After that, it slows down significantly. This is a source of problems for us, because it means that people at the high end of the curve (high armor) will experience very slow growth.

Notice what happens if we now substitute into the function level 50 rather than level 1: the simplified function now becomes

y = x / (x + 1300) which looks like current_func_50.jpg. The previous function at level 1 is also pictured there for comparison.

Remember that y is % absorption, x is armor. Notice that the function is now flatter as it covers the greater distance all the way to 1300, even in the earlier, fast rising part. Basically, at level 50, armor levels (aka x) are higher (in the thousands), the function needs to accept these higher armor levels without jumping to 100% armor (as it would have in the level 1 function). This is the reason for the higher constant. Another reason is that the old armor needs to become less effective -- remember that if you stay with level 1 armor (x) at level 50, you'll get hammered. Using the level 50 function, armor of 200, which would have given you 72% absorption in level 1, will now give you a measly 13%.

You may not be able to tell from the picture, but once again, after x=armor=1000, we get a very slow increase ie. diminishing returns. Once again, this is really frustrating for high level, high armor characters. Any point investment they make has very little effect, and plate armor seems to be of little use as well. Plate armor will try to raise the armor level by a certain amount, but because we're in the diminishing returns region, it'll have minimal effect and not really be worth it.

What can be done to improve this situation? We can treat the function in several ways. One option is to reduce the amount that our constant has to grow between levels. The constant has to be able to handle the highest armor possible at each level. But the more it grows, the flatter it makes our function. The flatter the function, the less impact moving along it has. What we can do is to shift the function to the right mathematically. If we change the formula to be

Absorb % = (armor - (1 * level)) / (armor - (1 * level) + level * 25 + 50)

we can shift the function to the right by the amount specified as 1 * level here. Every increasing level shifts the function a little to the right. This makes sense: A function shifted to the right will produce no values (0) or negative values at lower armor (x) levels. At the higher levels, the shift increases, and this corresponds with the fact that at those high levels, your armor is pretty much worthless anyway. This gives us the ability to reduce the constant of the function, reducing the flattening effect. At level 50, our new function would simplify to

Y = (X - 50) / ((X - 50) + 1050)

this approach only makes a small difference that's barely visible, so I won't provide a picture.

Another option is to utilize what we noticed about this function: it's much more linear in the lower part, and tapers off after passing the value of its constant. What does this mean? If we adjust the function so that the constant at each level (for the simplified function) will be about equal to the highest possible armor we can get at that level, we'll essentially only be using the linear, fast growing part of the function. The problem will then be that even at our maximum, the % values will be rather low since we aren't using the WHOLE function; we're just using a part of it. To fix this, we multiply the function by another constant, for example 1.5. The result will look like

Absorb % = ( armor / (armor + (attacker level * 25) + 50) ) * 1.5

We would play with the constants to make sure we cover the realistic armor values. Sure, we'll have some percentages greater than 100% when we pass the maximum armor values, but since we limit our maximum percentage, that's not a problem (anything over 90% is equivalent to 90%, for example). This option produces quite a strong effect (see mult50.jpg).

If you want to play with these constants, you can use my excel sheet at http://www.mediafire.com/?aavhm44ml01ao6m (it's too big for the forum). There's a sheet for the old formula and one for the one I'm trying out. The constants are all at the top, and they correspond to a full equation that includes both solution 1 and 2 which I mentioned above. Going from left to right, the constants are D1, E1, F1 and G1 (named for their cells). They correspond to:

Absorb % = (armor - (D1 * level)) / (armor - (D1 * level) + level * E1 + F1) * G1

There are other options as well. Who's to say that % blocked should depend on the attacker level? If we can state that 2000, for example, is around the maximum armor, then we could use a linear or non-linear function to turn any number out of 2000 into a percentage. This actually makes a lot of sense: characters will slowly be working up their armor percentage until the end game when their armor will be strongest. Absorb percentage would never go down just because you're fighting a higher level monster. Monster hits already get stronger with levels, and high level armors have minimum level requirements, so it really does seem like a good idea. Also, armor points seem to increase non-linearly with levels already: relatively speaking, plate armor gets gradually stronger than cloth armor at the next level -- they don't maintain the same ratios. I really think this is an idea worth seriously considering.

Other options yet would be to switch to a linear function or some other function, while keeping the current variables intact.

The most helpful thing you guys can do to help come up with good adjustments to the formula is experience from characters: what's typical cloth/leather/mail/plate armor for each level? What's the maximum at each level? The minimum? Uploading your characters to the Character Repository thread would really help with that.

For an absorption formula, we want the following things:

- Different armors should absorb roughly set proportions. Off the top of my head, cloth armor should absorb around 10-20%, leather 30-40%, mail 50% and plate 60-70%.

- There should be a cutoff (as there is now) at some percentage so that 100% is impossible. That would make for a boring game and impossible monsters.

- Diminishing returns is probably desirable so that we don't just bump into the cutoff. However, we also need stronger effects at higher levels to counter increasing damage by the monsters. (It's possible that something like a cubic formula, which starts slowly, then gets sharper, and then tapers off, would be better.)

- We want to feel the difference between armors and minimize the feel of diminishing returns.

Meet the current formula:

Absorb % = armor / (armor + (attacker level * 25) + 50)

This function shows that the absorption percentage depends on both the attacker level and your current armor. If you stay at the same armor level while the attacker level goes up, your % absorption will go down and you'll get hurt :)

But if we substitute values for attacker level = 1 into the function, we'll see that it simplifies to the following function:

y = x / (x + 75) where y = % absorption and x = armor.

This function behaves quite nicely, since it tapers off to 1.0 (100%). This is convenient since 100% is our maximum absorption (though the game limits absorption to 75%). It also rises pretty slowly, which equates to diminishing returns. You can see what it looks like in the picture (current_func.jpg).

Notice that the function has a faster, almost linear pace up to around 75 (trust me, that's more or less where it's at). After that, it slows down significantly. This is a source of problems for us, because it means that people at the high end of the curve (high armor) will experience very slow growth.

Notice what happens if we now substitute into the function level 50 rather than level 1: the simplified function now becomes

y = x / (x + 1300) which looks like current_func_50.jpg. The previous function at level 1 is also pictured there for comparison.

Remember that y is % absorption, x is armor. Notice that the function is now flatter as it covers the greater distance all the way to 1300, even in the earlier, fast rising part. Basically, at level 50, armor levels (aka x) are higher (in the thousands), the function needs to accept these higher armor levels without jumping to 100% armor (as it would have in the level 1 function). This is the reason for the higher constant. Another reason is that the old armor needs to become less effective -- remember that if you stay with level 1 armor (x) at level 50, you'll get hammered. Using the level 50 function, armor of 200, which would have given you 72% absorption in level 1, will now give you a measly 13%.

You may not be able to tell from the picture, but once again, after x=armor=1000, we get a very slow increase ie. diminishing returns. Once again, this is really frustrating for high level, high armor characters. Any point investment they make has very little effect, and plate armor seems to be of little use as well. Plate armor will try to raise the armor level by a certain amount, but because we're in the diminishing returns region, it'll have minimal effect and not really be worth it.

What can be done to improve this situation? We can treat the function in several ways. One option is to reduce the amount that our constant has to grow between levels. The constant has to be able to handle the highest armor possible at each level. But the more it grows, the flatter it makes our function. The flatter the function, the less impact moving along it has. What we can do is to shift the function to the right mathematically. If we change the formula to be

Absorb % = (armor - (1 * level)) / (armor - (1 * level) + level * 25 + 50)

we can shift the function to the right by the amount specified as 1 * level here. Every increasing level shifts the function a little to the right. This makes sense: A function shifted to the right will produce no values (0) or negative values at lower armor (x) levels. At the higher levels, the shift increases, and this corresponds with the fact that at those high levels, your armor is pretty much worthless anyway. This gives us the ability to reduce the constant of the function, reducing the flattening effect. At level 50, our new function would simplify to

Y = (X - 50) / ((X - 50) + 1050)

this approach only makes a small difference that's barely visible, so I won't provide a picture.

Another option is to utilize what we noticed about this function: it's much more linear in the lower part, and tapers off after passing the value of its constant. What does this mean? If we adjust the function so that the constant at each level (for the simplified function) will be about equal to the highest possible armor we can get at that level, we'll essentially only be using the linear, fast growing part of the function. The problem will then be that even at our maximum, the % values will be rather low since we aren't using the WHOLE function; we're just using a part of it. To fix this, we multiply the function by another constant, for example 1.5. The result will look like

Absorb % = ( armor / (armor + (attacker level * 25) + 50) ) * 1.5

We would play with the constants to make sure we cover the realistic armor values. Sure, we'll have some percentages greater than 100% when we pass the maximum armor values, but since we limit our maximum percentage, that's not a problem (anything over 90% is equivalent to 90%, for example). This option produces quite a strong effect (see mult50.jpg).

If you want to play with these constants, you can use my excel sheet at http://www.mediafire.com/?aavhm44ml01ao6m (it's too big for the forum). There's a sheet for the old formula and one for the one I'm trying out. The constants are all at the top, and they correspond to a full equation that includes both solution 1 and 2 which I mentioned above. Going from left to right, the constants are D1, E1, F1 and G1 (named for their cells). They correspond to:

Absorb % = (armor - (D1 * level)) / (armor - (D1 * level) + level * E1 + F1) * G1

There are other options as well. Who's to say that % blocked should depend on the attacker level? If we can state that 2000, for example, is around the maximum armor, then we could use a linear or non-linear function to turn any number out of 2000 into a percentage. This actually makes a lot of sense: characters will slowly be working up their armor percentage until the end game when their armor will be strongest. Absorb percentage would never go down just because you're fighting a higher level monster. Monster hits already get stronger with levels, and high level armors have minimum level requirements, so it really does seem like a good idea. Also, armor points seem to increase non-linearly with levels already: relatively speaking, plate armor gets gradually stronger than cloth armor at the next level -- they don't maintain the same ratios. I really think this is an idea worth seriously considering.

Other options yet would be to switch to a linear function or some other function, while keeping the current variables intact.

The most helpful thing you guys can do to help come up with good adjustments to the formula is experience from characters: what's typical cloth/leather/mail/plate armor for each level? What's the maximum at each level? The minimum? Uploading your characters to the Character Repository thread would really help with that.