Install Steam
login
|
language
简体中文 (Simplified Chinese)
繁體中文 (Traditional Chinese)
日本語 (Japanese)
한국어 (Korean)
ไทย (Thai)
Български (Bulgarian)
Čeština (Czech)
Dansk (Danish)
Deutsch (German)
Español - España (Spanish - Spain)
Español - Latinoamérica (Spanish - Latin America)
Ελληνικά (Greek)
Français (French)
Italiano (Italian)
Bahasa Indonesia (Indonesian)
Magyar (Hungarian)
Nederlands (Dutch)
Norsk (Norwegian)
Polski (Polish)
Português (Portuguese - Portugal)
Português - Brasil (Portuguese - Brazil)
Română (Romanian)
Русский (Russian)
Suomi (Finnish)
Svenska (Swedish)
Türkçe (Turkish)
Tiếng Việt (Vietnamese)
Українська (Ukrainian)
Report a translation problem
Yes, I think both Wall's and felix's tools use outdated formula from when we didn't have access to the code. Lord Midas on the other hand made sure to use it and revised his tool several times. The lack of enemy presets is a bit annoying but other than that it looks flawless.
At first I thought it was just rounding differences but once you get to heavier sets it becomes clear that there is something different going on. Kind of throws a wrench into my plans of recreating my old Nimble tests.
I could do Nimble on my own calculator pretty easily. I'm not sure if in game BB uses the whole number of your displayed Nimble% or if that is just a rounded number presented to the player and the actual behind the scenes uses a decimal generated by the proper exponential Nimble formula. As in does a 42% 17 fatigue Nimble actually run something like 41.7% behind the scenes? Otherwise I could do whole numbers pretty easily and it should in theory be accurate.
I've built my formula based on the Wiki (which I'm pretty sure you wrote) and double checked with your post on it awhile back in the forums. It looks like Nimble is applied early in the formula directly to the Regular Damage field.
In other words it is applied directly to the hp_damage_roll. So if my Bladed Pike rolls 70 and I have 40% Nimble then I immediately cut that 70 to 28 before I continue with the rest of the formula.
This is important for the formula because that means that Nimble applies before the ignore_armor and 10%_remianing_armor reduction modifiers factor in. This makes Nimble stronger than just a direct hp multiplier (as in 250 hp non-Nimble is worse than 100hp 40% Nimble).
I believe that Lord Midas is putting the Nimble reduction at the end where the headshot modifier is. Here is my evidence.
Ancient Bladed Pike vs 100 hp, 120 helmet, 95 armor, 40% Nimble.
Lord Midas: 5.7 hits until death on average. St. Dev of .5
Mine (Nimble at the end): 5.66 hits until death on average. St. Dev of .54
Mine (Nimble at the start): 6.1 hits until death on average. St. Dev of .67
Ancient Bladed Pike vs 250 hp, 120 helmet, 95 armor, no Perks in play.
Lord Midas: 5.7 hits until death on average. St. Dev of .5
Mine: 5.66 hits until death on average. St. Dev of .54
As can be seen Nimble at the start or end of the formula makes a big difference.
The relevant code is in actor.nut, line 1456/7:
This also explains why Indomitable with heavy armor is so strong.
The Nimble formula is this:
Not sure if your formula are correct or not because I don't know what values you are using for other (numerous) variables.
Edit: your message disappeared but I'll leave my answer still.
I will take a look on it carefully and fix the tool. Thanks!
Thanks for testing. It was a minor bug on the hit that breaks the armor. The damage mitigation value was not being applied to the formula only for that hit. It is still a little bit off compared to what you got and what the other tool gets, so I need to figure out if there is some other small typo or something.
I was not supporting the tool because I really thought no one was using it. Like I mentioned before, I prefer to use the reddit platform for game related content.
Another thing I did not know was that the bonus damage from drunkard, huge and killing frenzy were multiplicative instead of additive. I corrected it now. If you are interested in doing some tests by hand like you did here, I can check if my tool calculates it properly.
I also updated the nimble formula, I guess it changed some updates ago. I was using 1.2 instead of 1.23.
Regardless, I think that Lord Midas's tool is superior to mine in many ways. I did not implement weapon skills, bleeding and so on.
Thanks Abel. I'm having trouble comprehending the Nimble formula. Is that a coding language? The output was helpful and good enough for my purposes though so thank you.
Hi Wall, thanks for coming by. Sorry for calling out your calculator. Lord Midas's is indeed impressive, but I like how your graphs let me see the actual % chances and LM also doesn't have armor attachments. LM also has an incorrect Nimble formula it seems.
A screenshot would probably be easier but oh well I'll try typing it out. I wrote it in Python. The - Dashes aren't really there but I need it for formatting here on Steam. I've initialized the weapon stats above this code block.
for i in range(0,100000):
-- hp = 100
-- helmet = 120
-- body = 95
-- Nimble = .4
-- count = 0 #This is how I count how many hits until death.
-- while hp > 0:
---- armor_roll = random.randint(min,max) * armormod #armormod is % vs armor
---- hp_roll = random.randint(min,max)
---- head_roll = random.randint(1,100)
---- if head_roll <= headchance: #If we get a headshot, use the following blocks.
------ helmet -= armor_roll
------ if helmet < 0: #If the helmet is destroyed, set armor damage to exact lost armor.
-------- armor_roll = armor_roll + helmet
-------- helmet = 0 #Set helmet to 0 so that it isn't negative.
------ if helmet > 0: #If helmet isn't destroyed.
-------- hp_roll = hp_roll * ignore * Nimble - (helmet * .1) #Ignore is %ignore of wep.
-------- hp_roll = hp_roll * 1.5 #Headshot applied last.
-------- hp -= hp_roll
------ else: #If helmet is destroyed use this block instead.
-------- OverflowDamage = hp_roll * (1 - ignore) * Nimble - armor_roll
-------- if OverflowDamage < 0:
---------- OverflowDamage = 0
-------- hp_roll = hp_roll * ignore * Nimble + OverflowDamage
-------- hp_roll = hp_roll * 1.5
-------- hp -= hp_roll
---- else: #If not a headshot, do the same code but without the headshot modifier.
------ #Here would be the same code without the headshot modifier.
---- count += 1 #After a roll we up the number of hits we have taken.
---- if hp <= 0: #If death, then add the hits taken to die into the list for later analysis.
------ countlist.append(count)
I'm not a programmer and as you can see I don't have any logic for most Traits or Perks, but I think I have the basic formula correct (hopefully), and this should be good enough to do Nimble and Steelbrow analysis that I want to do.
If I set the Nimble effect on the first initialization of the hp_roll instead of putting it in the middle I get the same answer. But with the way Abel described the formula it felt more appropriate to put it in the middle.
Dang that looks hideous. I should have just done a screenshot. If you guys know an image sharing site or tool that I don't have to register for then I'll post a screenshot.
Your code is concise, simple is better when it comes to coding. This is enough for what I need. Thanks!
Do not be sorry for calling it out. When I created the tool I asked people to provide feedback and say if they found any bug. This is why I added that informative graph and armor attachments. If I knew the tool was being used like this I would already have updated it with weapon skills and more graphs as well.
I will let you know when I update it in this thead. By the way, it is fine to say if there is any feature you would like my tool to have. I can see how feasible it is and incorporate in the tool if it is possible.
EDIT: I updated the overflow damage part of my code to be consistent with yours, now our values closely align for the pike scenario you described. I pushed the changes to the website.
this.Math.min(a, b) is the minimum among two integer values.
this.Math.minf(a, b) is the minimum among two float values.
In python, the formula is equivalent to this:
fat = min(0, fat + 15)
nimble_percentage = 1.0 - 0.6 + pow(abs(fat), 1.23) * 0.01
nimble_percentage = min(1.0, nimble_percentage)
Just copy paste this into your code.
Thank you. That cleared up my confusion. I got it integrated now and it is working well.
The graph and armor attachments are great. What I did a while back was test a bunch of different Nimble lines with or without Bone Plates and Steelbrow against some different enemy types to see how they compared. I'd like to do it again but want to make sure the formula is nailed down.
Thanks!
I did a bunch of testing and found a scenario where we were very different and after like 2 hours of digging into it I found a silly oversight on my side. The way I wrote it left it possible for the -10% remaining armor calculation to turn the hp_roll negative (due to high remaining armor and a low modified hp roll from Nimble, or it would also happen from just heavy armor in general against a low penetration weapon). Since I apply a -= hp logic that meant that it was possible to gain hp from an attack which is obviously a problem. So I fixed that and now we are very close.
We aren't quite in sync though and I'm at a loss as to what it could be. I'm not fully convinced that it can be tossed out as statistical insignificance because I run a lot of trials and we often end up slightly different. On the surface they look close enough but if we dig into the %death by hit they don't line up nicely.
Here is a verbose test using Bladed Pike vs. 100Hp, 120 Helmet, 95 Armor, No Nimble.
Yours: Mean of 2.31, St. Dev of .51. Survived hits: 2: 2.26%, 3: 65%, 4: 32.5%, 5: .25%
Mine: Mean of 2.32, St. Dev of .5. Survived hits: 2: 1.39%, 3: 65.33%, 4: 33.19%, 5: .09%
Those numbers might seem close enough to be gotten by chance, but even if I repeat the rolls on each calculator the differences don't really budge, and since I run 100,000 trials there is a pretty big sample size. I'm assuming yours runs a bunch as well. Other tests are just slightly off as well.
Maybe I'm just splitting hairs at this point, but I'm pretty sure we still have a difference between us. Maybe it is close enough that it isn't worth looking into. If something jumps out to you on your side then please share but otherwise don't spend too much time on it. It's pretty close now as it is. Could be a problem on my side. After finding my mistake with the 10% armor thing I'm paranoid of my own code's trustworthiness.
Thanks again for taking the time to update your tool and helping me out.
It really helps if you provide a specific scenario with actual numbers, then I can narrow down the causes. Something like you did with the ancient pike that always causes 70 damage.
You can also see if for these actual values your tool reports the correct results.
I did not have two separate rolls for armor base damage and health base damage, I just used the same roll on both, so that explains part of why my distribution has higher results in the boundary cases compared to yours. I just updated it to do two rolls like stated in the wiki, but we still have a little disparity (less than before though).
Yeah, that's how I ended up finding my problem with the 10% armor thing.
Right now the calcs are really close.
I went one by one from 55min/55max all the way to 80min/80max with Bladed Pike vs 100hp, 120 helmet, 95 armor, 40% Nimble and I don't think I ever saw a difference of more than .3% and that appeared to be within the realm of statistical insignificance if I re-ran it on my calculator. Without weapon damage variance I feel pretty confident.
Here's an example of 70/70 and two different runs of my calculator.
Yours: Mean of 4.79, St. Dev of .42. Survived hits: 3: .79%, 4: 18.98%, 5: 80.23%
Mine(1): Mean of 4.79, St. Dev of .42. Survived hits: 3: .78%, 4: 19.07%, 5: 80.16%
Mine(2): Mean of 4.79, St. Dev of .43. Survived hits: 3: .82%, 4: 19.18%, 5: 80.01%
---
Doing normal 55/80 Bladed Pike also yields very tight results. I'm not seeing a difference of more than .3% here either in multiple runs.
Here is a normal 55/80 Bladed Pike example.
Yours: Mean: 5.1, St.D: .66. Hits: 3: .49%, 4: 15.83%, 5: 56.48%, 6: 27.17%, 7: .04%
Mine(1): Mean: 5.1, St.D: .6649. Hits: 3: .49%, 4: 15.89%, 5: 56.32%, 6: 27.25%, 7: .07%
Mine(2): Mean: 5.1, St.D: .6650. Hits: 3: .48%, 4: 16.09%, 5: 56.37%, 6: 27.01%, 7: .06%
---
Differences are larger in a 65/75 Bladed Pike scenario and I'm not sure what to make of it. Seeing differences as high as 1.64% here that is unlikely due to chance. Trial 3 I did with a million rolls.
Here is Bladed Pike at 65/75 example.
Yours: Mean: 4.84, St.D: .52. Hits: 3: .79%, 4: 20.11%, 5: 72.93%, 6: 6.17%.
Mine(1): Mean: 4.84, St.D: .534. Hits: 3: .74%, 4: 21.05%, 5: 71.29%, 6: 6.92%.
Mine(2): Mean: 4.84, St.D: .534. Hits: 3: .79%, 4: 21.03%, 5: 71.33%, 6: 6.85%
Mine(3): Mean: 4.84, St.D: .533. Hits: 3: .76%, 4: 20.99%, 5: 71.42%, 6: 6.83%
Likely a difference between us here but I'm not sure how to find it or why this example would vary while the normal 55/80 example doesn't.
---
Did some quicker tests at various damage ranges for Bladed Pike.
55/65: Biggest difference of .90%
60/70: Biggest difference of .82%
70/80: Biggest difference of 1.05%
60/80: Biggest difference of .40%
65/80: Biggest difference of .53%
None of these are as large as the 65/75 test so I decided to try and narrow that one down.
---
64/76: 1.33%
66/74: 1.40%
67/73: 1.23%
68/72: .31%
69/71: .16%
I didn't post all of the numbers, but the commonality I'm seeing in these examples is that your calculator always seems to have a higher % in the 5 hits section and mine always seems to have a higher % in the 6 hits section.
In the 68/72 example yours has a .04% chance to survive 6 and mine has a .38%.
That seemed like a good place to attack so I opened up some verbosity on my tool and found a sample case where I survived 6 hits. I double checked the math on the output by hand and it checks out, but I have the bro surviving with 0.15hp left and I'm not sure if that's ok? What is your death condition? I'm not sure how much rounding goes on behind the scenes in game.
I tried setting my death condition to be < 1 instead of <= 0 and that appeared to solve the discrepancy in the 68/72 example but it throws everything else way off so maybe I'm not on the right track.