|
Using Python3 to estimate BIS gear sets for Ninja.
Asura.Saevel
サーバ: Asura
Game: FFXI
Posts: 9916
By Asura.Saevel 2022-01-29 10:54:02
Python wasn't really made with graphics in mind, it can be done but usually easier to use a different front end like C# / .NET / Visual C++ / ect if on windows and one of the various GNU libraries if on Linux.
[+]
By Izanami 2022-01-29 12:37:07
Thanks for the tips, Austar and Saevel. I'm glad you all posted before I invested a ton of potentially wasted time into tkinter. I'll look into other options such as IronPython before I jump into making the GUI.
Since we're on a fresh page, here's a summary of my update post on the previous page that is now out of sight:
The gearsets on the original post have been updated for ML20 NIN and R25 Odyssey gear.
The output distribution images through the Imgur links have also been updated.
Great Katana weapon skills have been added to the original post on the first page.
The code itself has been rearranged to reduce clutter and make reading easier. A new Github link was provided.
[+]
Ramuh.Austar
サーバ: Ramuh
Game: FFXI
Posts: 10481
By Ramuh.Austar 2022-01-29 12:42:10
you can make tkinter work but it's not nearly as simple as just dragging and dropping the objects since you have to code every dimension and location, kind of obnoxious imo. and everything just looks so blocky. and if something is a different size, it takes trial and error to line them up horizontally where in visual studio, it will show you blue and pink lines to "snap."
[+]
Ramuh.Austar
サーバ: Ramuh
Game: FFXI
Posts: 10481
By Ramuh.Austar 2022-02-25 15:33:22
if I could make a suggestion, I notice you have some stats as a float and some as an integer. i would make them all integers and divide by 100 in the calculation functions, this would make it easier for anyone to edit or add gear not having to go and look up if something is supposed to be 0.07 or if it's just 7 and avoids any float additions that could end up 0.1400000000000000000000000001.
By Izanami 2022-02-25 15:44:18
if I could make a suggestion, I notice you have some stats as a float and some as an integer. i would make them all integers and divide by 100 in the calculation functions, this would make it easier for anyone to edit or add gear not having to go and look up if something is supposed to be 0.07 or if it's just 7 and avoids any float additions that could end up 0.1400000000000000000000000001.
This is something I've been meaning to do for a while since the gear.py file an absolute mess. Even I have to control+F to check if I made 'Store TP' an integer or 'Crit Rate' a float before adding new gear... I can see how this is frustrating for anyone else trying to add more gear to their local versions.
Similar frustrations arise with stat names. I currently use "TA" for Triple Attack, but I changed "STP" to "Store TP" in the newer version. These are just dictionary keys, but I may as well just use full names for everything to stay consistent.
Ramuh.Austar
サーバ: Ramuh
Game: FFXI
Posts: 10481
By Ramuh.Austar 2022-02-25 15:48:15
oh, something else too then. if a stat is named wrong or doesn't exist, print an error. for example if i add a piece of gear with "WSD" when it's supposed to be "Weapon Skill Damage", it will just assume 0 since the "WSD" variable is not instantiated.
Edit: I don't think the naming conventions matter as much as being given some kind of warning that the stat doesn't exist. If it's "WSD" or "STP" i'm sure anyone bothering to edit would know what it meant, just if you type it wrong or make a typo, there isn't any indication that something was wrong, that i noticed at least, unless you can just tell something is off by the results.
By Izanami 2022-02-26 22:20:17
oh, something else too then.
I've made minor updates based on your suggestions. Thanks again for looking into the code in a bit of detail.
The gear.py file now exclusively uses integer values for stats ("Weaponskill Damage":5, instead of 0.05, for example). The main code was updated to divide by 100 when reading these dictionary values into variables. This consistency should make adding more gear to the file easier.
I've added a short block of code to the gear.py file that checks the stat names for each stat included in each piece of gear being considered. It will throw an error if a piece of gear has a typo in one of its stat names (doesn't match a list of accepted stats) and will print which stat/gear threw the error(s). This caught a single typo in my old gear file: "AttacK" should've been "Attack" in Mpaca's Boots, which was worth +65 Attack.
I've replaced the "apex_toad" enemy in the wsdist.py code with a generic "enemy" dictionary that takes its values from the init.py file, which reads the new enemies.py file for stats. I've only included Lv129 Apex Bats (Dho Gates), Lv132 Apex Toad (Woh Gates), and Lv135 Apex Bat (Outer Ra'Kaznar). I may rerun everything against the Lv135 Apex Bat later and update the sets on the front page to see if they change much with the increased stats. The currently published sets are against the Lv132 Apex Toad. I'd like to add Omen bosses and Dynamis W2/W3 enemy stats, but I'm not sure where to find this information.
Finally, some Scythe-DRK gear was copy/pasted over from an older version of my code where I was testing Scythe TP/WS sets. This seemed like a good time to finally update the gear.py file since I already had those dictionaries made. The published version of the code still doesn't deal with TP sets, though.
Necro Bump Detected!
[36 days between previous and next post]
By quadramet 2022-04-03 11:54:56
Hello,
Love the data and thanks for the work you have done!
I was looking at your lua and saw this:
function precast(spell)
attack = player.attack
if attack < 1500 then
AtkFlag = 0 -- Low attack TP sets (trusts)
elseif attack < 3000 then
AtkFlag = 1 -- Mid Attack TP set (normal buffs)
else
AtkFlag = 2 -- Max Attack TP set (2h buffs, SV, crooked chaos, etc)
end
I don't see in the lua where you have sets defined as low attack, mid, and max. Am I just missing it (which is a strong possibility).
By Izanami 2022-04-03 13:14:15
Hello,
Love the data and thanks for the work you have done!
I was looking at your lua and saw this:
function precast(spell)
attack = player.attack
if attack < 1500 then
AtkFlag = 0 -- Low attack TP sets (trusts)
elseif attack < 3000 then
AtkFlag = 1 -- Mid Attack TP set (normal buffs)
else
AtkFlag = 2 -- Max Attack TP set (2h buffs, SV, crooked chaos, etc)
end
I don't see in the lua where you have sets defined as low attack, mid, and max. Am I just missing it (which is a strong possibility).
I have two NIN gearswap files. The one I uploaded is the one I actually use. The second one is for testing large changes so I don't break my actual gearswap file before an event.
My in-use file does not have variable attack sets, but that bit of code is the bare minimum to allow variable attack sets to work without having to throw in another F-key toggle. I ended up getting busy and not finishing the test version of that feature a few months ago and have been too lazy to go back and finish it. Since all of the variable attack WS sets are already defined in this thread, it would probably take another ~30 minutes of modifying the lua to make it work in practice.
So you didn't miss anything, I just haven't gone back to add that feature to my actual lua yet.
Edit 2022 June 08:
I've updated my Kastra_NIN.lua file to equip weapon skill sets based on the player's Attack stat immediately before using the weapon skill. This is usually attack in a TP set.
The updated lua appears to function properly, but deciding on exactly what Attack stat qualifies as "mid buff" and "high buff" in my TP set is not easy. For now I've set it to midbuff=2200 and highbuff=3600 based on my no-buff TP sets having around 1200~1300 attack, but these values may be too low still. Generally, WS sets have more attack than TP sets, so being slightly too low should be fine.
By quadramet 2022-04-03 13:28:21
Thanks for the info. I agree that having that function without having to press another f key would be great.
Thanks again for the explanation and the work you are doing.
Necro Bump Detected!
[66 days between previous and next post]
By cosmicdivinity 2022-06-08 16:19:49
I was wondering if there was a list of which weapon skills to use, for which mobs in odyssey C, kinda like bippin has the end of his samurai guide.
By Izanami 2022-06-08 16:40:15
I was wondering if there was a list of which weapon skills to use, for which mobs in odyssey C, kinda like bippin has the end of his samurai guide.
There are a few lists out there, but from what I could tell, many of them have "too much" information to be useful. For example: they may claim that Chi/Teki/To/Ten are all good weapon skills to use on a specific monster group, but in reality you'll notice that only Chi does >70k consistently, while the others do 30~40k without multi-attacks. I think it's much more useful to only list the strongest weapon skill per enemy group.
I've been running the Windower logger for a few years, and based on my damage history in Odyssey C, I've created a list of enemies to use hybrid weapon skills on. I haven't updated it in at least a few months since I generally know what to use by-eye these days, but see below for the list I made that shows which hybrid weapon skills I use on which enemy groups.
Code
Bats Chi~To
Bigbird To
Bugard Chi
Colibri To>Chi
Crab Chi
Draugar Chi
Ghoul Chi
Imp Chi
Jagil Chi
Karakul Teki
Leopard Chi
Lotanu Chi
Manticore To
Marid To
Mamool To
Puk To
Ram Chi
Raptor Chi
Rarab Chi
Tigers Teki
Troll Teki
Vulture To
Ziz To
I typically use Savage Blade on all other enemies with the exception of Lamia, which I use Evisceration on.
Necro Bump Detected!
[60 days between previous and next post]
サーバ: Asura
Game: FFXI
Posts: 116
By Asura.Neviskio 2022-08-07 18:46:48
Been wondering something, I don't usually tier my ws gearsets for buffs but more for ACC needs, been kinda struggling to fit the sets into my setup for normal/acc/highacc/fullacc, I suppose I could still consider the 3 sets tiers as normal/acc/highacc?
Been wondering for a while since I imagine everyone has a different way to handle it. Sorry if it's obvious to everyone else, barely play ninja, but just going to make heishi shorinken soon and was trying to update my gear...
By SimonSes 2022-08-07 19:35:54
Been wondering something, I don't usually tier my ws gearsets for buffs but more for ACC needs, been kinda struggling to fit the sets into my setup for normal/acc/highacc/fullacc, I suppose I could still consider the 3 sets tiers as normal/acc/highacc?
Been wondering for a while since I imagine everyone has a different way to handle it. Sorry if it's obvious to everyone else, barely play ninja, but just going to make heishi shorinken soon and was trying to update my gear...
Accuracy issues in WS sets are very rare now on most jobs with MLs being a thing. Much more often now WS sets will be divided on uncapped attack and capped attack. I would maybe use 1 tier of accuracy at most. So all options would be:
Uncapped attack
Capped attack
Full Accuracy
If you are non Mastered and have no MLs and often find yourself with uncapped accuracy in WS set, then you probably need to modify those sets for your needs.
[+]
By Izanami 2022-08-10 12:00:33
I'm not surprised, but the Hattori +2 armor is very underwhelming. It looks like we'll have to wait until Hattori +3 releases to see some potentially useful upgrades. Based on Artifact and Relic, the +3 Empyrean will likely just be more generic stats, though.
I have updated the main post to reflect changes introduced with this updated gear. Hattori Earring +2 is the only new Empyrean +2 item that shows up in these sets.
I give my opinion on each piece below.
Hattori Ningi +2 is equally underwhelming. It may have a place for critical hit weapon skills like Evisceration and Blade: Hi in the future as +3, though.
Unfortunately, the "upgraded" Migawari causes it to proc at a lower HP percentage. This is generally not a good thing if you remain near full HP anyway, since you do not want to lose Migawari to a move that would only do 50% of your HP and then die to the move that does 80% while Migawari is on recast. I would have much preferred an "Augments Migawari" that provides a chance to proc without consuming the buff.
Edit: Thinking about it a bit more, the "Migawari +14" paired with "Damage Taken -12%" can be quite useful. Currently, I use some variation of F12 to manually equip my DT set when I know a big hit is coming. I may modify my lua to additionally equip Hattori Ningi +2 in my panic-button DT set if buffactive['Migawari'] and player.hpp<50. The combination of DT and Migawari+ may save me in those rare situations.
Hattori Tekko +2 were not given any Magic Damage or Magic Attack Bonus, which causes them to still lose to Nyame (any path any rank) outside of Futae. At the very least, it's nice to not lose a lot of Magic Accuracy on Futae nukes now.
Their new "Magic Burst Damage +10" allows us to swap in Sibyl Scarf and Static Earring, but only while using Futae for our bursts.
I would like to see some testing to confirm if the "Elemental Ninjutsu Damage +16%" is still just a mistranslation of "Elemental Ninjutsu: Magic Attack Bonus +16" or if it is a proper x1.16 multiplier now.
Hattori Hakama +2 now have Damage Taken -11%, which pairs well with the "Yonin: Counter +16." Unfortunately, Counter is checked after Evade, Parry, and Utsusemi, so building a Counter set for Ninja is exceptionally niche. These are still nice for your engaged tanking set with few or no shadows up.
I'm disappointed that Hattori Kyahan +2 were not given "Utsusemi +2." I was looking forward to losing up to 8 shadows per AoE instead of 7.
The weapon skill damage is a nice addition for newer players who are still working their way up to augmented Nyame, or those who chose a different Nyame path than B.
The Hattori Earring +2 is quite powerful, even without augments. I'm glad the developers at least included Ninja in the "PDL +9%" earring group. The "Katana Skill +12" should not be ignored either, since this converts into both Attack and Accuracy for Katana attacks. This earring is obviously the top choice for weapon skill earrings at attack cap.
In terms of upgrade priority, I'd say Earring >> Hands >> Body > Legs. After obtaining the earring, it's probably best to work on other jobs assuming that they all share the same upgrade currency.
Bahamut.Kacil
By Bahamut.Kacil 2022-09-07 15:51:22
If I'm using Blade: Shun with TP bonus +950 and it's a WS that increases attack with TP is it reasonable to consider I might be at attack cap doing stuff like Sortie or Omen?
If I have something like 1500 attack in my WS set does Blade: Shun bring that to 3000 at 2000 tp? Or is it more complicated?
By Izanami 2022-09-07 16:57:44
If I'm using Blade: Shun with TP bonus +950 and it's a WS that increases attack with TP is it reasonable to consider I might be at attack cap doing stuff like Sortie or Omen?
I'm not sure what the defense of Omen and Sortie fodder is, but if I assume it's around 1000~1200, then you're probably just over attack cap for Blade: Shun in your situation. The BGWiki PDIF page suggests that you'll need at least 3.35 times more attack than the enemy's defense to be capped. Assuming Dia3 is up (-20%), then you'll need 2680~3216 attack to be considered capped with that defense range.
I recommend using the mid-buff set from the front page, but maybe swapping out the body and/or hands for what the low-buff set uses just to get a bit more attack.
As a side note:
If you've built your Hybrid WS set (maybe R15+ Nyame), then I strongly recommend using Hybrid WSs on fodder instead of physical weapon skills. With R25 Nyame, I regularly see 80k-100k damage on the Sortie fodder with standard BRD+COR buffs. A single Hybrid SC (To+Chi=Impaction for example) is usually enough to take down fodder in Sortie. With lower ranked Nyame, you could extend this to To+Chi+To or any of the other Hybrid SC variants seen in the Hybrid WS section of the main post.
If I have something like 1500 attack in my WS set does Blade: Shun bring that to 3000 at 2000 tp? Or is it more complicated?
This sounds close enough to correct to me. My code treats Blade: Shun at 2000 TP as +100% (x2 multiplier) to the base attack before any other buffs. (edit: I actually apply Shun's attack bonus with other percentage-based buffs like Berserk, Chaos, and Kikoku's aftermath.) Somebody else may have done more testing on this and can provide exact details on how Blade: Shun's "Damage varies with TP" works. For now, the BGWiki page is still labelled as +100% Attack and "Needs Verification."
[+]
By SimonSes 2022-09-08 01:59:09
One thing that I'm still not 100% sure is, if that attack bonus is unique multiplier or just adds to other % attack buffs like Chaos roll or berserk? I think it's the latter, but yeah, not 100% sure.
[+]
By Izanami 2022-09-08 10:35:18
One thing that I'm still not 100% sure is, if that attack bonus is unique multiplier or just adds to other % attack buffs like Chaos roll or berserk? I think it's the latter, but yeah, not 100% sure.
What you said makes sense. I agree that Blade: Shun's attack buff is most likely applied with other percentage-based buffs.
My previous comment was incorrect. I checked the code once more to be safe and confirmed that I apply the attack boost with other percentage-based buffs like Chaos Roll and Kikoku's aftermath (see line 257 of set_stats.py).
chaos = 0.15 (15% attack bonus)
BRD = 200 (+200 attack from songs)
Base = 1500 (base attack with gear)
(Base + BRD)*(1 + chaos + 1.0) = (1500 + 200)*(1.15 + 1.0) = 3655 attack (my code uses this one)
(Base*2 + BRD)*(1 + chaos) = (1500*2 + 200)*(1.15) = 3680 attack (what I previously commented)
(Base + BRD)*(1 + chaos)*2 = (1500 + 200)*(1.15)*2 = 3910 attack (if Shun uses a separate multiplier)
There is a 7% difference in attack between the best and worst options in the above situation, but this difference changes depending on how potent your other buffs are. It's also unlikely that Blade: Shun uses the third option above, so the difference between the two likely scenarios above is really less than 1%.
Properly testing this seems like a pain.
Bahamut.Kacil
By Bahamut.Kacil 2022-09-08 11:26:56
Have you run calculation with Agony Jerkin +1 R15? I have been using that over Adhemar's body which I augmented for fast cast instead. There is almost a 100 attack difference between Malignance body.
By Izanami 2022-09-08 12:10:53
Have you run calculation with Agony Jerkin +1 R15? I have been using that over Adhemar's body which I augmented for fast cast instead. There is almost a 100 attack difference between Malignance body.
I checked every piece of modern NIN gear, Agony Jerkin +1 R15 included. Agony Jerkin +1 R15 is a good body for Blade: Shun, but my code finds that Adhemar Jacket +1B wins. This is likely due to the Triple Attack +4%, which plays well with FTP transferring weapon skills like Blade: Shun. The higher accuracy on Adhemar Jacket +1 certainly helps too.
I doubt Adhemar Jacket +1B wins by a huge margin, though. If you already have Agony Jerkin +1 R15, then I recommend using that instead of buying another Adhemar Jacket +1. However, I do not recommend going out of your way to create an Agony Jerkin +1 R15 if you do not already have one.
The complete list of gear I checked, and their stats, can be viewed in the gear.py file. Although, the version on Github hasn't been updated to include recent items like Hattori +2 or the Oshasha's Treatise. I'll push an update to Github later today to include these missing items which are in my local version, but not the Github version.
[+]
Phoenix.Xax
サーバ: Phoenix
Game: FFXI
Posts: 35
By Phoenix.Xax 2022-09-19 21:41:21
was the gui of this ever released? i would like to play with it and even for possibly other jobs if so
By Izanami 2022-09-20 08:34:20
was the gui of this ever released? i would like to play with it and even for possibly other jobs if so
The GUI version is not yet finished and I have not even looked at it in many months.
The current status is that a Python-based front end is approaching completion, but I was getting stuck while trying to convert it to one of the other languages mentioned earlier in this thread. I suppose I can simply keep the Python-based GUI that I've been using for concept work and skip using other programming languages for now. I'll work on this more next month after my deadlines pass.
There is a picture of the current layout on the front page in one of the spoilers. I'd like to reorganize it a bit too, but that's relatively simple when compared to changing languages entirely.
Quetzalcoatl.Langly
サーバ: Quetzalcoatl
Game: FFXI
Posts: 684
By Quetzalcoatl.Langly 2022-09-20 10:37:06
Do you have a timeline for implementing Daken into your calculations?
By Izanami 2022-09-20 11:07:45
Quetzalcoatl.Langly said: »Do you have a timeline for implementing Daken into your calculations?
Daken is already taken into account for the TP sets, also accounting for the 8-hit limit per attack round (check Daken only "if main_hits + sub_hits < 8"). I don't remember publishing the TP part of the code since it was written on a different computer than the main code. I'll throw the TP sets code on Github after I clean it up bit and confirm that it still works with the main code. This should be done before finishing the GUI too, since I'll now have to include another tab in the GUI for "TP sets."
The problem with the TP sets shown on the front page is that they only consider how quickly you can get TP for your next weapon skill, ignoring damage dealt during TP phase. I don't consider this to be huge problem since the damage dealt during TP phase only really matters for Kannagi Aftermath builds, which rarely get used.
[+]
Quetzalcoatl.Langly
サーバ: Quetzalcoatl
Game: FFXI
Posts: 684
By Quetzalcoatl.Langly 2022-09-20 11:18:00
Daken is already taken into account for the TP sets, also accounting for the 8-hit limit per attack round (check Daken only "if main_hits + sub_hits < 8"). I don't remember publishing the TP part of the code since it was written on a different computer than the main code. I'll throw the TP sets code on Github after I clean it up bit and confirm that it still works with the main code. This should be done before finishing the GUI too, since I'll now have to include another tab in the GUI for "TP sets."
Wonderful, that would be why I didn't find it. Appreciate it!
The problem with the TP sets shown on the front page is that they only consider how quickly you can get TP for your next weapon skill, ignoring damage dealt during TP phase. I don't consider this to be huge problem since the damage dealt during TP phase only really matters for Kannagi Aftermath builds, which rarely get used.
It's a pretty rare instance I've found when your white damage skews gearsets by any meaningful amount. With recent MLevel 40 farming I've seen my WS/TP phase damage spread leaning towards 80/20. Of course take that with a grain of salt as that's basically spamming WSs with little regard for SC or others in the party as we're all just blowing through enemies mindlessly.
By Izanami 2022-10-11 12:39:52
I've updated the main post with Hattori +3. I have not updated the TP sets since this part of my code is being updated/cleaned.
I'm still disappointed in this set, but 4/5 pieces make an appearance in the current "best-in-slot" sets calculated for the specific scenario my code uses. I still recommend making small adjustments to the sets presented in this thread based on your exact situation.
Hattori Zukin +3 does not show up in any of the weapon skill sets I checked.
I still expect Ryuo Somen +1 (path A or C) to win for low-haste TP sets since maintaining position behind the enemy for "Innin: Double Attack +13%" is not easy.
Hattori Ningi +3 shows up as best for un-capped Evisceration and Blade: Hi. This is not surprising given the enhanced stats and critical hit rate.
I expect Blade: Hi to favor Nyame Mail R30B when it releases.
Hattori Tekko +3 finally shows up in our burst set without Futae.
The Ichi set technically prefers Gyve Doublet with Warder's Charm R15 for bursts, but I recommend copying the Ni/San set and using Nyame Mail with Sibyl Scarf instead just to maintain a decent amount of Magic Accuracy.
Because our burst set uses Hattori Tekko +3 anyway, there are no swaps to use with Futae. Our free nuke set only swaps in Hattori Tekko +3 for Futae.
Our burst sets no longer require spending gil on Warder's Charm +1 R15.
Hattori Hakama +3 makes an appearance in our Ku set with low buffs. I suppose this is simply due to the raw stats it provides; +44 STR, +63 Accuracy, +63 Attack, and +33 Katana Skill (more accuracy and attack for katana) are a lot for one slot.
Seems to only replace Rao Haidate +1B for the most part, but this still saves inventory and gil.
The improved generic stats and higher weapon skill damage move these to current "best-in-slot" for many sets when you only consider raw damage.
I recommend using Nyame Boots R25B over Hattori Kyahan +3 for weapon skills that benefit heavily from skillchain bonus, such as Blade: Metsu. I do prefer the extra accuracy on Hattori Kyahan +3 for Savage Blade with Hitaki until we see Nyame Sollerets R30B.
Hattori Kyahan +3 generally replace Kendatsuba Sune-ate +1, Mpaca Boots R25, and Nyame Boots R25B.
Evisceration still uses Kendatsuba Sune-ate +1 due to the triple attack and critical hit rate.
I was really looking forward to seeing "Utsusemi+2" on these, but Ninja aren't allowed to have nice things anymore.
[+]
Necro Bump Detected!
[39 days between previous and next post]
By Izanami 2022-11-18 23:49:31
I finally had a bit of time to sit down and work on this over the last week. I pretty much had to restart from scratch, but I believe I have the GUI in a useable form right now. I've written this using PySimpleGUI, which is a Python GUI based on TKinter. As Austar previously mentioned, properly aligning GUI elements is a huge pain using a TKinter-based GUI. This seems to be especially troublesome when I tried my GUI on different computers and screen resolutions. Unfortunately, I do not have the time to learn a proper GUI programming language, so I'll have to stick with Python for now.
While the UI scaling and element positioning definitely need improvement, the code appears to work well enough to at least release it in sort of a "beta" form while I work on the details of making it look pretty. If you can at least see all of the buttons and input fields (your GUI looks roughly similar to the images below) then you should be able to calculate damage and estimate best WS sets much easier than with the original code.
To run the code, simply download and unpack the code in the original GitHub repository and run gui_wsdist.py as you would any other Python file (I use "python3 gui_wsdist.py"). If you run into the error "ModuleNotFoundError: No module named '<name>'", then you simply need to install the module using "pip install --user <name>" or "pip3 install --user <name>" and try again.
The code now also requires installing PySimpleGUI (pip3 install --user PySimpleGUI) and Pillow (pip3 install --user Pillow). There appears to be a way to turn this into a Windows executable that doesn't require any Python, but I need to look into this more. See my next post; the gui_wsdist.exe seems to work now.
The GUI is currently organized into three tabs:
The inputs tab is broken four sections:
Basic inputs:
Select the main and sub job as well as the weapon skill and lower/upper TP range to use. For now, NIN and DRK (ML20) with WAR or SAM subjobs are the only options. I have not touched the DRK or /SAM parts of my code in a very long time, but I remember that I never added the DRK trait "Smite." This just means you should only really trust the "attack cap" sets for DRK if you bother checking DRK stuff at all. The uncapped attack DRK sets are missing a lot of attack that Smite would give, which causes the algorithm to try to fill that missing attack when it really isn't needed. However, giving yourself super-buffs will provide so much attack that the missing Smite trait will have no effect on the resulting gear set.
Enemy inputs:
Adjust the enemy's defensive parameters. A drop-down menu containing pre-defined enemies is included, but you can simply type the values you want to test against in the input boxes instead. This is useful for testing accuracy requirements against artificially high evasion, for example.
Buffs:
Checkboxes are provided to enable buffs from WHM, BRD, COR, and GEO. A drop-down menu for pre-defined food is also provided. Only NQ Grape Daifuku, Sublime Sushi, and Marine Stewpot are available right now. You can add more yourself in the gear.py file if you wanted; just search for the other food names to find out where to put the new stuff.
WHM includes three categories: [Dia 1-3], [Haste, Haste2], and [Boost-spells].
BRD includes Madrigals, Minuets 3-5, Victory+Advancing March, and Honor March. Any unique combination of four of these can be applied as a buff. Song Potency is provided up to Songs+8, but I've checked BG wiki to limit things like Honor March to +4. Further enhancements can be applied using the Marcato (1.5x to the first song) and Soul Voice (2.0x to all songs) check boxes.
COR allows the user to choose up to two of Chaos, Fighter's, Hunter's, Rogue's, Samurai, and Wizard's Rolls. If enabled, Crooked Cards will apply a 20% potency boost to the first roll. COR rolls use their Lucky value without the in-party job bonuses. If COR is enabled, then Light Shot can also be enabled to enhance your Dia potency slightly, assuming you have WHM and Dia enabled as well.
GEO provides access to Indi-, Geo-, and Entrust- versions of Stats(STR, DEX, etc), Acumen, Focus, Frailty, Fury, Haste, Malaise, Precision, and Torpor. Blaze of Glory can be enabled to boost the potency of your Geo-Spell by 50%. Bolster can be enabled to boost the potency of Indi-Spell and Geo-Spell by 100%. The potency of the selected Entrust-Spell is based soley on 900 skill and does not gain bonuses from Geomancy+ gear, Blaze of Glory, or Bolster. Additionally, an input field is provided to adjust the potency of enfeebling Geomancy to simulate high-end content nerfing Geomancy by some amount.
Initial gearset:
The left-half shows the familiar 4x4 grid of equipment currently equipped. The items presented in this 4x4 grid will be used as your starting position if you choose to automatically find the best set. Alternatively, you can choose NOT to find the best set, and instead simply print the average damage dealt by the displayed set using the "Quick-look" button. This is especially nice for comparing minor differences between sets.
Clicking on an equipment slot will change the list displayed on the right-half. The right-half displays a list of gear available to be equipped in the selected slot. When an item is selected, the image in the 4x4 grid automatically updates and the code immediately recognizes that the initial gearset has changed, so you can immediately perform a Quick-look to see how damage changes after the swap. There are no job restrictions to gear choices yet. The user should know that NIN can not equip Liberator R15 and that Liberator R15 can not use Blade: Kamu (even though Liberator is just a big Nagi). I'll add a check for only displaying main_job equipment in these lists later.
Hovering your mouse over the icons should display their names, including augment paths and rank to avoid any confusion with items that share icons.
The Select Gear tab behaves almost identically to the "Initial gearset" section of the Inputs tab described above: It is broken up into left and right halves, with the left half being a 4x4 grid of text-buttons that represent gear slots. Clicking these buttons will change the list on the right half to show the possible equipment that can be equipped in the selected slot. This time, the equipment list is a list of checkboxes representing equipment to be considered when automatically finding the best gearset. Users can manually select each piece of gear for each slot, or they can click the "Select All" button to automatically select all items in the displayed list. For example: "Select All" when the neck slot is selected will enable all neck items while not affecting the choices for other slots.
There are no job restrictions to gear choices. The user once again needs to be aware not to include DRK only gear when testing a katana weapon skill. I've added a button to "select all main job" which will automatically select only the items your current main job can equip. This also needs to be updated later to only show those items anyway.
The gear.py file contains the full list of items available, but only those items within their respective slot lists (mains, subs, ammos, heads, bodies, etc) will appear in the GUI. I've tried to exclude items that would only increase runtime (such as Hachirin-no-Obi) or lower-tier equipment. If you wanted to test these, then you'll have to make minor adjustments to the gear.py file.
Keep in mind that the more items you select with checkboxes, the longer the code will take to find the best set.
The Outputs tab contains the parameters used for determining the type of output you want to display.
"Number of simulations" is how many weapon skills you want the code to use when building damage distributions for statistics and the final plot. I typically use 10000 to obtain good statistics and a decent-looking plot. This number defaults to 0, but if the user enters a number below 100, then the code automatically converts it to 100 so things don't break.
"Show final plot" is a check-box allowing the user to simply not make output distribution plot. Examples of these plots are provided in the spoilers at the end of each weapon skill section on the front page. It's nice to see exactly how the damage is distributed (for the shape as well as the absolute maximum damage dealt rather than averages), but I assume most users will have this disabled.
"Find best set" is a check-box that tells the code to run up to 10 iterations trying to find the best set (as described in the main post on the front page). If this is disabled, then the code will simply take the initial gearset provided in the Inputs tab and run "Number of simulations" simulations to build statistics and make a plot (if checkboxed). This is useful if you wanted to see how the damage in your user-defined set is distributed.
The "Run" button runs the main code to calculate damage based on simulations using the parameters defined throughout the GUI (main/sub job, enemy stats, weapon skill, TP range, buffs, gear choices, number of simulations, etc).
"Copy best set" is disabled by default, but becomes enabled after using the "Run" button once. Clicking this button will automatically copy the output from the "Run" to the initial set on the Inputs tab. This is especially nice since it allows you to determine the best set through simulations and then make minor changes in the Inputs tab for the Quick-look feature. For example: the simulations say Epaminondas's Ring is best, but you could use the Quick-look feature to swap that out for a Gere Ring and see just how much damage you're losing (on average).
Finally, the large white box simply captures all outputs that would normally go to the terminal (things like errors and print statements). This was mostly for convenience of having the GUI self-contained, but it introduces the annoying effect of: if the GUI crashes due to an unknown error, then the error message is printed in the Output tab and the GUI closes before you get a chance to read it. If you do not like this feature and would like all outputs to go to terminal, then you can simply comment out the "output" line in the "tab_outputs.py" file, which is clearly marked with a comment.
If you do decide to try it out and run into issues, feel free to send me a ffxiah private message (or post an "issue" on the Github page, I'm not sure how that works yet) describing your issue. I have a feeling that a diverse set of users will result in an unreasonably diverse set of issues that will quickly flood this thread if we posted them here. I'm expecting many UI scaling related issues. From what I can tell, for the most part, things looks fine on my Windows10 (1920x1080) and Macbook (Mojave; 2560x1600) computers.
TP sets and nuking sets will be added as separate tabs, currently in progress.
Ramuh.Austar
サーバ: Ramuh
Game: FFXI
Posts: 10481
By Ramuh.Austar 2022-11-19 09:27:51
There appears to be a way to turn this into a Windows executable that doesn't require any Python, but I need to look into this more. I use pyinstaller to turn mine into an exe
[+]
By Izanami 2022-11-19 14:44:34
There appears to be a way to turn this into a Windows executable that doesn't require any Python, but I need to look into this more. I use pyinstaller to turn mine into an exe
Thanks for the note. I had previously given up on pyinstaller after running into an incorrect "missing win32-ctypes" error before making that post. I decided to give it another try after seeing your reply. Reinstalling Python3.8.8 and updating all of my modules appears to have fixed the issue.
I tested the GUI with a few WS sets and everything appears to still work. Unfortunately, even using a virtual environment, the .exe file is still >50MB. I'll look into reducing this further later.
Apparently, you do not need any form of Python interpreter on your computer to run the code with the gui_wsdist.exe file. I'm not sure how this works exactly, but it probably explains why the .exe is >50MB. To run the code, you simply need the gui_wsdist.exe and item_list.txt files and the icons32/ and icons64/ directories. The code can then be run by simply double-clicking on the gui_wsdist.exe file.
Node 456
Updated: 2022 January 28:
ML20 NIN99/WAR53 & R25 Odyssey.
Slightly updated code for easier reading (see Github link below).
While a simple average is nice and convenient for DPS spreadsheets, it does not tell the whole story for most weapon skills. To know exactly how your weapon skill damage will be distributed, you need detailed information about your stats, the enemy you're fighting, and the mechanics of weapon skill damage. As a side-project to learn a bit of basic Python3 programming and about the FFXI damage formulae, I've written a Python3 code to simulate weapon skills and obtain distributions of the damage being dealt given a set of gear and an enemy.
I'm not very familiar with GitHub, but I've put the code on my newly-created GitHub page ( https://github.com/IzaKastra/wsdist_v2).
The code is not meant to replace DPS spreadsheets, but the gear sets provided here should agree with the spreadsheets reasonably well. I believe the sets presented here are the best in slot sets currently available, but you may find marginally better sets for specific enemies. I therefore encourage you to play around with these sets using the spreadsheets to try to find potentially better or worse options that fit within your gear budget.
In addition to finding the best katana weapon skill sets, the code has the added benefit of working with all jobs and all physical and hybrid weapon skills (after minor modifications to adjust for different player race/job stats). This allowed me to also check the best Evisceration, Savage Blade, and Tachi: Jinpu/Koki/Kagero/Goten/Kasha sets for Ninja. I have a version of the code that works for SAM and nearly works for DRK. I "simply" need to work out the DRK Smite trait before it's finished. This is technically the second of three parts of a Python3-based DPS simulator. It currently has everything it needs to be a full DPS simulator, including real-world time between attacks, TP return, and auto-attack/WS damage, but it seems appropriate to stop where I am for now.
I've tested the code's output against SimonSes' NIN Hybrid WS spreadsheet for Blade: Chi and find the difference to be within 0.5%-2% depending on the TP range and buffs used. For physical weapon skills, I tested the results against the Ninja DPS spreadsheet and found that Blade: Shun, Kamu, Hi, and Ku all agree within 5% or better, while Blade: Metsu shows 10% differences due to incorrect Aftermath: Attack+10% handling in the spreadsheet (see the spoiler below). This of course does not mean that I've done everything perfectly.
The spreadsheet is applying Kikoku's aftermath only to the Ninja's base attack (Lv99+STR+Skill), not including BRD songs, attack traits from /WAR, or the +70 attack from job gifts. My in-game testing has shown that Kikoku's AM is applied additively with the other percentage-based boosts like Fury, Chaos, and Berserk; Attack = (Base+BRD)*(1+Berserk+Chaos+Fury+Kikoku_AM)+Food. The image below shows my observed and calculated Attack values with different buffs up.
I've modified the code to automatically adjust a given gearset until it finds the "best" piece in each slot for a specified weapon skill. I then ran the code for 3 different buff states and 3 different TP ranges that I consider to be typical low/mid/high buffs for content in-game:
Low Buffs: Only Grape Daifuku and Dia2, not even trust buffs (but we know you'd end up with March, Paeon, and Evoker's Roll anyway)
Standard Buffs: Grape Daifuku, Dia2, Minuet5, Minuet4, Honor March, Victory March, Lucky Chaos Roll (Songs+7, Rolls+7, HonorMarch+4)
High Buffs: Grape Daifuku, Dia2, Minuet5, Minuet4, Honor March, Victory March, Lucky Chaos Roll, Fury, Frailty (Songs+7, Rolls+7, Geomancy+6, HonorMarch+4)
High Buffs (Hybrid): Grape Daifuku, Dia2, Minuet5, Minuet4, Honor March, Victory March, Lucky Chaos Roll, Fury, Malaise (Songs+7, Rolls+7, Geomancy+6, HonorMarch+4) -- Only used for Blade:Chi
tp = [1000,1300]
tp = [1500,1800]
tp = [2000,2300]
I use max skill-potency geomancy bubbles and songs with 5/5 Minuet merits and 20/20 Minuet job gifts. I did not use any buff-enhancing abilities such as Crooked Cards, Marcato, Blaze of Glory, etc.
My earlier testing suggested that Hitaki is by far the best off-hand weapon for "damage varies with TP" weapon skills. However, it also only showed ~30-70% off-hand hit rate on the Apex Toad target that I'm simulating against (Evasion:1103~1163, Lv131-133), which would likely translate to significantly reduced TP gain and thus significantly reduced WS frequency. Because of this, I removed Hitaki and reran my simulations without it being an option. If you are able to make up for the significantly reduced accuracy and auto attack damage, then Hitaki should probably be your go-to for "damage varies with TP" weapon skills.
I did not test any Herculean gear since I believed it would be a waste of time given the accessibility of Nyame R10+ and the random nature of obtaining "good" augments behind multiple layers of RNG. I encourage you to input the sets I present here into the spreadsheets and see how your Herculean gear compares, though.
It should be noted that these sets are based raw weapon skill damage values. Stats such as Skillchain Bonus (see Nyame) have no effect as a result until I finish the code to be a proper DPS simulator with auto-attacks, TP rounds, auto-WS, and SCs. Swapping some pieces listed in these sets with Nyame will lower weapon skill damage, but the skillchain bonus stat will likely result in larger overall damage.
The details of the code's algorithm are explained in a bit of detail below, but the process is likely very well known to most of you. For now, here is the list of "best average" gear sets for each buff state for a few of Ninja's available weapon skills at specific TP ranges. Each one contains an imgur link to the simulated distributions, which display the gear used and basic player stats for all tests run on that specific weapon skill. A representative image is also presented in each section. The list of all sets can also be found on my FFXIAH item sets page. The comments within each gear set may provide swaps for varying TP ranges.
Note that these gearsets are for a Master Level 20 Lv.NIN99/WAR53, R25 Odyssey gear, and R15 UNM gear.
Blade: Chi
ItemSet 380757
To nobody's surprise, with the release of augmented Nyame gear, the "best average damage" gearset for Blade: Chi is incredibly easy to predict. Blade: Teki and Blade: To likely use an identical weapon skill set, but I did not test them. I would not be surprised if To/Teki used Fotia Belt, though. Since both of them are single-hit weapon skills.
Note that these tests were done on a neutral monster with 100 Magic Defense and no Magic Evasion. I believe many relevant enemies have something like 150 Magic Defense or an SDT value that would guarantee at least a 50% magic damage resist.
Blade: Hi
ItemSet 380758
ItemSet 380759
ItemSet 380760
Kannagi (R15) was locked into the main hand.
Andartia Mantle AGI+Crit Rate for low buffs
Andartia Mantle AGI+WSD for standard/high buffs
Critical hit weapon skill damage varies wildly based on the AGI stat of your target. This is because up to 15% of your Crit Rate comes from dDEX. Unfortunately, Blade: Hi has an 80% AGI modifier, which is essentially useless for meleeing. I'm still convinced the developers accidentally swapped the modifiers for Jishnu's Radiance (80% DEX) and Blade: Hi (80% AGI) and refuse to admit it.
Since Apex Toads do not have a published AGI value to calculate dDEX from, I ended up performing about 2 hours worth of auto-attacks in various sets to estimate it myself (AGI ~ 354-358). Either way, I don't necessarily recommend the Blade: Hi sets presented here. I don't think Blade: Hi is a good weapon skill in general compared to the other Katana options. The conditions required for critical hit weapon skills to perform well are too variable to simply stick with a single set based on a spreadsheet or code. You should do your own research based on exactly what you plan to use the weapon skill on and build your set around that.
Blade: Kamu
Blade: Ku
ItemSet 380763
ItemSet 380764
ItemSet 380765
Blade: Ku is surprisingly powerful when compared to Blade: Shun. The +60% damage on Gokotai, 1.25 FTP, and 30% STR+DEX modifier put in a lot of work to boost the damage. Unfortunately the skillchain properties are not great compared to Blade: Shun with Heishi.
Blade: Metsu
ItemSet 380766
ItemSet 380768
These sets are a good example of not using a lot of Nyame where Nyame would likely win. Blade: Metsu has excellent skillchain properties so I expect at least 4/5 Nyame with Relic legs to win in most cases considering they provide +24% skillchain damage.
With the release of R25 Nyame, most of these sets actually use Nyame for maximum physical damage. The skillchain damage stat on Nyame is just a bonus on top now.
Blade: Shun
Blade: Ten
Savage Blade
ItemSet 380771
ItemSet 380772
ItemSet 380773
For Naegling's "Weaponskill: Attack bonus based on number of upgrades" stat, I assumed the player had at least eight buffs up (protect, shell, haste, utsusemi, kakka, yonin, food, signet) for all sets. Standard buffs added 4 songs and 2 rolls for 14 total buffs, and high buffs added a single GEO bubble for 15 total buffs. The player's base attack then received +1% per buff present. This bonus attack was added to the player's base attack before any other buffs were added.
Evisceration
ItemSet 380942
ItemSet 380770
ItemSet 380943
Tauret was locked into the main hand.
Ryuo Tekko Path A or D
Andartia Mantle DEX+Crit Rate
Kendatsuba Samue +1 or Mpaca Doublet R25 are generally the go-to body slots for Evisceration.
Similar to Blade: Hi, critical hit weapon skill damage will vary wildly depending on the AGI of your target. Your dDEX provides as much as 15% critical hit rate that you're potentially missing on high AGI targets unless you stack more DEX. Luckily, Evisceration has a 50% DEX modifier, so this is not likely to be a problem. I still recommend finding your own set that works well on the content you plan to use Evisceration on (Odyssey Lamia/Aquans or that one Master Trial) instead of just sticking with this set or one from the spreadsheet.
Tachi: Goten
ItemSet 383500
Tachi: Goten is the Lightning-elemental hybrid weapon skill. The Donar Gun would likely be fantastic for this weapon skill, but it would require that you never unequip the gun since you would lose TP to swap to Shuriken for TPing.
Be sure to weaponskill above 2000 TP.
You may want to use Samurai subjob for Hasso/Zanshin in order to increase your TP gain rate when relying on the Great Katana weapon skills.
Tachi: Jinpu
ItemSet 383497
Nyame Path B
Andartia Mantle STR+WSD
Ninja Nodowa +2 when attack capped and TP>2000.
Fotia Belt > Orpheus's Sash when below 1500 TP. You should always weapon skill above 2000 effective TP, though.
Tachi: Jinpu is a powerful tool for a Ninja to have available against Earth-based enemies weak to magic and slashing damage. This is essentially the Great Katana version of Blade: Chi, so you'll want to WS above 2000 effective TP.
You may want to use Samurai subjob for Hasso/Zanshin in order to increase your TP gain rate when relying on the Great Katana weapon skills.
The best part of Tachi: Jinpu is that it creates and endless skillchain loop with itself. When fully buffed, you are able to simply spam Tachi: Jinpu and create powerful skillchains with every use. It's unfortunate that the developers did not allow Blade: Chi to self-skillchain endlessly as well.
Tachi: Kagero
ItemSet 383499
Tachi: Kagero is the Fire-elemental hybrid weapon skill. Tachi: Kagero is especially potent on a few enemies in Odyssey C, such as Puks and Bomb Clusters. Be sure to weaponskill above 2000 TP.
You may want to use Samurai subjob for Hasso/Zanshin in order to increase your TP gain rate when relying on the Great Katana weapon skills.
Tachi: Kasha
ItemSet 383491
ItemSet 383492
Nyame Path B
Andartia Mantle STR+WSD
I don't expect anyone to use Tachi: Kasha on Ninja, but it is a pretty weapon skill.
You may want to use Samurai subjob for Hasso/Zanshin in order to increase your TP gain rate when relying on the Great Katana weapon skills.
Tachi: Kasha is the Great Katana version of Blade: Retsu, since it can Paralyze the enemy. I'm not sure if it is as potent as Blade: Retsu, though.
Tachi: Koki
ItemSet 383498
Nyame Path B
Andartia Mantle STR+WSD
Tachi: Koki is a single-hit weaponskill. Ninja Nodowa +2 will likely not beat Fotia Gorget unless you hold until 3000 TP for some reason.
Epaminondas's Ring can replace Gere Ring when near attack cap, but you lose those rare triple attack procs.
Tachi: Koki is the light-elemental hybrid weapon skill, which means it benefits greatly from Weatherspoon Ring (SoA final reward option). Despite the boost in power from Weatherspoon Ring, I don't see Koki getting much use.
You may want to use Samurai subjob for Hasso/Zanshin in order to increase your TP gain rate when relying on the Great Katana weapon skills.
As a side note: Blade: Ei is a Darkness-based magical Katana weapon skill. There is no Darkness-based hybrid weapon skill. This is unfortunate because it would likely be very powerful with Archon Ring and Pixie Hairpin +1
Based on the sets listed above, we can make a short list of gear priority for a newer Ninja to reference.
Odin: Gere Ring
UNM: Lugra Earring +1 (Aug) > Sailfi Belt +1 (Aug) >= Seething Bomblet +1 (Aug) > Blistering Sallet +1 (Aug)
Lilith: Malignance Gloves > Malignance Tabard > Malignance Boots > Malignance Tights >= Malignance Chapeau
Bumba: Nyame Mail > Nyame Sollerets > Nyame Gauntlets > Nyame Flanchard >= Nyame Helm
Arebeti: Mpaca Cap > Mpaca Hose > Mpaca Doublet > Mpaca Gloves >= > Mpaca Boots
Ngai: Gleti's Knife
Xevioso: Kunimitsu
Relic: Legs > Head > Hands >= Feet > Body(TP low haste)
AF: Head
Adhemar: Head(A) > Body(B) > Hands(B) > Feet(A)
However, just because an item didn't show up here doesn't mean it doesn't hold a best-in-slot position in some situation. The 2021 Ninja Gearsets thread provides excellent gear to use for many weapon skills without considering Odyssey gear. Many of these sets are well within uncertainty of my "best average" sets presented here.
Here I give a "brief," but relatively detailed, description of how the damage was calculated within the code. Let me know if there are any mistakes or inaccuracies that need to be corrected. I'm confident in the algorithm, but I may have done a poor job explaining in some places.
The simulations were based on Apex Toads with three sets of possible stats, excluding their innate -25% MDT. This can be thought of as having three unfortunate Apex Toads in a room and each weapon skill hit one of them randomly. Taken directly from my code, the stats used were:
Code
e_mdef = 0-malaise*(15+3*nbubble) if 0-malaise*(15+3*nbubble) > -50 else -50
apex_toad = {'Level': [131, 132, 133],
'Defense': [1206*(1-dia[dia_potency]-frailty*(0.148+0.027*nbubble)), 1239*(1-dia[dia_potency]-frailty*(0.148+0.027*nbubble)), 1272*(1-dia[dia_potency]-frailty*(0.148+0.027*nbubble))],
'Evasion': [1103, 1133, 1163],
'VIT': [264, 270, 276],
'AGI': [354, 356, 358], # AGI roughly measured using Scoreboard on two different toads.
'MND': [218, 224, 228],
'INT': [285, 293, 299],
'CHR': [270, 277, 284],
'Magic Defense': [e_mdef, e_mdef, e_mdef]} # Enemy Magic Defense has a floor of 50
For Physical weapon skills, I used the standard BG-wiki formula to calculate damage: Due to the random nature of PDIF, a new value is calculated for each hit individually.
Additional hits after the first main-hand hit, whether they be from multi-hit weapon skills or multi-attacks, were performed in the order suggested by the testing of Austar. In the case of multi-attack procs on weapon skills, testing by Saevel and Austar show that there can be no more than two multi-attack checks of any kind per weapon skill and that the off-hand weapon will always get one of these two checks if you have an off-hand weapon equipped, otherwise the main-hand will get both checks only if the weapon skill has at least two natural hits.
In addition to the testing of Saevel and Austar, I tested this by using 404 Blade: Retsu while dual-wielding (2+1 hits) with 29% DA and 31% TA on Apex Toads. The observed TP return distribution from 404 Blade: Retsu closely matches the expected distribution assuming that only the first two hits (the first main hit and the one sub hit in this case) can multi-attack. Any assumptions that all weapon skill hits can multi-attack (6 chances for Blade: Shun for example) quickly cause the expected distribution to diverge from the observed.
For Hybrid weapon skills, I used the equation provided by Bahadir's Blade: Chi testing, Jakey's YouTube video, and SimonSes' NIN Hybrid Damage calculator, which splits the weapon skill damage into two parts
Hybrid = Physical + Magical
The physical damage is calculated using the exact same method as mentioned previously for purely physical weapon skills, with the important change that FTP is 1.0 and non-replicating for the physical portion of Hybrid weapon skills (see Bahadir's testing). The magical damage is calculated using the physical damage and the player's "Magic Damage" stat as a base:
In addition to the basic formula for damage, it is important to explicitly mention the following special cases that are included in the damage calculations:
Unlike the first main-hand hit, the first off-hand hit does not gain the bonus from the standard weapon skill damage stat.
Certain "weapon skill damage" stats on weapons apply to all hits. Examples of this include Naegling Savage Blade Damage +15%, augmented REMA weapons, and the hidden weapon skill damage bonus on Mythics and Relics.
Weapon skills gain a hidden ~+100 accuracy to their first hit. My testing of 1745 unbuffed (Brygid+KuyinHathdenna+YoranUC) Blade: Chi on Apex toads heavily suggests that this bonus applies to the first off-hand hit as well.
Buffs to player Attack are applied in a specific order:
Attack = (8+Gear+Traits+Gifts+Skill+STR+STR(food)+STR(buffs)+BRD)*(1+COR+GEO+Kikoku10%+Berserk)+Attack(food)
The player's secondary/auxiliary/off-hand attack is calculated using only half of their STR stat (see BG-wiki: "Attack")
STR from food is immediately used to calculate base attack, but "Attack+" from food is not applied until all other buffs have taken effect.
Before running the code, I manually selected equipment for each equipment slot that I wanted to test. This allowed me to exclude testing items like Mummu Kecks for Blade: Chi, which would obviously be a waste of time. To allow the output of my code be easily compared to the spreadsheets, the code uses a distribution's average damage to determine which piece of gear is "better" than another. It should be noted that the average is not a good summary statistic for multi-peaked distributions, though. The algorithm itself is simple:
(Edit 2021-08-23: I've adjusted the code's algorithm to use averages for intermediate steps, and 50,000 simulations as the last step. The process for finding best sets is now identical to manually selecting gear in a spreadsheet and checking the DPS value. The advantage is that this code is automated and provides expected damage distributions at the end for further analysis.)
1) For each item slot (or for each pair of two item slots simultaneously), cycle through all selected equipment and calculate the average weapon skill damage from that test gear set.
2) If the average damage is higher than the previous highest, then keep that item equipped, otherwise ignore it and try another combination of gear.
3) After all slots (or all combination of two slots simultaneously) have been tested and the best item in each slot determined, restart from the beginning with the previous best set as the starting place, checking each slot (or combination of two slots simultaneously) again, up to 20 times until. This allows for some gear to change based on changes to already tested slots.
4) Stop early if gear changes result in an average damage increase less than 0.5%, or if no changes are made within two consecutive iterations. This is the convergence criterion and it usually triggered before iteration 7.
With the above algorithm, the code's runtime is ~3 seconds to find a best set while swapping only one slot at a time, or ~180 seconds if changing two slots simultaneously. An additional 10 seconds is required to build a distribution of 50,000 simulations for the fancy output plots.
The list of gear tested in each slot is presented here. All weapon skills used the same pool of gear. All UNM gear is R15. All Odyssey gear is R25. Code
mains = [Heishi, Kannagi, Kikoku, Nagi, Gokotai]
subs = [Ternion, Kunimitsu, Gleti_Knife, Tauret, Gokotai, Crepuscular_Knife]
grips = [Alber_Strap]
ammos = [Yetshila, Seething_Bomblet, Cath_Palug_Stone, Aurgelmir_Orb, Pemphredo_Tathlum, Ghastly_Tathlum, Crepuscular_Pebble]
heads = [Adhemar_Bonnet_A, Adhemar_Bonnet_B, Hachiya_Hatsuburi, Mochizuki_Hatsuburi, Malignance_Chapeau, Kendatsuba_Jinpachi, Mummu_Bonnet, Nyame_Helm, Mpaca_Cap, Blistering_Sallet]
necks = [Ninja_Nodowa, Fotia_Gorget, Caro_Necklace, Baetyl_Pendant]
ears = [Ishvara_Earring, Lugra_Earring_Aug, Moonshade_Earring, Brutal_Earring, Friomisi_Earring, Crematio_Earring, Balder_Earring, Mache_Earring1, Mache_Earring2, Odr_Earring, Crepuscular_Earring]
ears2 = [Ishvara_Earring, Lugra_Earring_Aug, Moonshade_Earring, Brutal_Earring, Friomisi_Earring, Crematio_Earring, Balder_Earring, Mache_Earring1, Mache_Earring2, Odr_Earring, Crepuscular_Earring]
bodies = [Kendatsuba_Samue, Adhemar_Jacket_A, Adhemar_Jacket_B, Malignance_Tabard, Nyame_Mail, Samnuha_Coat, Gyve_Doublet, Abnoba_Kaftan, Mpaca_Doublet, Tatenashi_Haramaki, Ryuo_Domaru_A, Agony_Jerkin]
hands = [Adhemar_Wristbands_A, Adhemar_Wristbands_B, Mochizuki_Tekko, Mummu_Wrists, Malignance_Gloves, Kendatsuba_Tekko, Nyame_Gauntlets, Mpaca_Gloves, Tatenashi_Gote, Ryuo_Tekko_A, Ryuo_Tekko_D]
rings = [Gere_Ring, Hetairoi_Ring, Shukuyu_Ring, Apate_Ring, Ilabrat_Ring, Regal_Ring, Epona_Ring, Petrov_Ring, Rufescent_Ring, Begrudging_Ring, Epaminondas_Ring, Mummu_Ring, Beithir_Ring, Dingir_Ring, Metamorph_Ring, Shiva_Ring1, Shiva_Ring2, Weatherspoon_Ring]
rings2 = [Gere_Ring, Hetairoi_Ring, Shukuyu_Ring, Apate_Ring, Ilabrat_Ring, Regal_Ring, Epona_Ring, Petrov_Ring, Rufescent_Ring, Begrudging_Ring, Epaminondas_Ring, Mummu_Ring, Beithir_Ring, Dingir_Ring, Metamorph_Ring, Shiva_Ring1, Shiva_Ring2, Weatherspoon_Ring]
capes = [Andartia_DAdex, Andartia_DAstr, Andartia_DAagi, Andartia_Critagi, Andartia_Critdex, Andartia_WSDstr, Andartia_WSDdex, Andartia_WSDagi, Andartia_Nuke]
belts = [Windbuffet_Belt, Fotia_Belt, Grunfeld_Rope, Kentarch_Belt, Sailfi_Belt, Orpheus_Sash]
legs = [Kendatsuba_Hakama, Adhemar_Kecks_A, Adhemar_Kecks_B, Mochizuki_Hakama, Samnuha_Tights, Jokushu_Haidate, Malignance_Tights, Mummu_Kecks, Gyve_Trousers, Hizamaru_Hizayoroi, Nyame_Flanchard, Mpaca_Hose, Tatenashi_Haidate, Ryuo_Hakama_A, Rao_Haidate_B]
feet = [Mochizuki_Kyahan, Adhemar_Gamashes_A, Adhemar_Gamashes_B, Malignance_Boots, Mummu_Gamashes, Kendatsuba_Sune_Ate, Nyame_Sollerets, Mpaca_Boots, Tatenashi_SuneAte, Ryuo_SuneAte_D, Rao_SuneAte_D]
Finally, since this post is already pretty long, I may as well link my official forum post from last year. This post details my requested Ninja job adjustments. Feel free to give it a like/comment.
https://forum.square-enix.com/ffxi/threads/57263-2020-2021-Ninja-Job-Adjustment-and-Feedback?s=66c8aaed6a12e3a576c9ee8f403e1174
|
|