Theorycrafting for Final Fantasy XIV.
This project is maintained by rconcep
from samurai import *
from plotting import *
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sb
from IPython.display import display
%matplotlib inline
pd.options.display.max_rows = None
Level 52 introduces the Kenki system with the Kenki Mastery I trait. The Kenki gauge takes on values between 0 and 100. This resource is used to fuel basically all of your abilities and is acquired mostly through the execution of weaponskills. The Kenki Mastery I trait grants Kenki for the following actions:
kenki_table_I = [('Enpi', 5), ('Gekko (rear combo)', 5),
('Mangetsu (combo)', 5), ('Kasha (side combo)', 5),
('Oka (combo)', 5), ('Yukikaze (combo)', 5)]
kenki_table_df = pd.DataFrame(kenki_table_I, columns=['Weaponskill', 'Kenki granted'])
kenki_table_df.set_index('Weaponskill')
display(kenki_table_df)
Weaponskill | Kenki granted | |
---|---|---|
0 | Enpi | 5 |
1 | Gekko (rear combo) | 5 |
2 | Mangetsu (combo) | 5 |
3 | Kasha (side combo) | 5 |
4 | Oka (combo) | 5 |
5 | Yukikaze (combo) | 5 |
Along with the trait, you acquire the first Kenki spender, Hissatsu: Kaiten. This ability, on a short 5s recast timer, increases the potency of your next weaponskill by 50% at the cost of 20 Kenki. Note that this increase also applies to the DoT effect of Higanbana. Because our Iaijutsu are our most powerful weaponskills, we would ideally like to use Hissatsu: Kaiten for each of them. The accrual rate of Kenki under Kenki Mastery I is quite low, about 15 Kenki every 8 GCDs (going through all three Sen combos). This is not enough to use Hissatsu: Kaiten very often. The best bang for your buck will be using it for Higanbana, provided that the target will take 16 DoT ticks (to match the potency of Hissatsu: Kaiten + Midare Setsugekka), or approximately 48 seconds.
Level 54 introduces the gap-closer ability, Hissatsu: Gyoten, with a Kenki cost of 10. Level 56 gives the backstep disengage, Hissatsu: Yaten. While not part of an optimal dummy rotation, these mobility skills are useful in practice. See part 5 for in-depth discussion of the Kenki spenders.
At level 58, you learn Merciful Eyes, a self-heal linked to the Third Eye ability. At level 60, you obtain the Meditate ability. This ability, with a relatively short recast time of 60s, increases the Kenki gauge while channeled in battle for up to 15s at a rate of 10 Kenki per server tick up to a total of 50 Kenki. Note that it does nothing outside of combat.
sam = Samurai(kenki_mastery=1)
actions = [('Hakaze'), ('Shifu'), ('Kasha'),
('Hakaze'), ('Jinpu'), ('Gekko'),
('Hakaze'), ('Yukikaze', 'Meikyo Shisui'), ('Midare Setsugekka'),
('Kasha', 'Hissatsu: Kaiten'), ('Higanbana'), ('Yukikaze'), ('Gekko'),
('Hakaze'), ('Shifu'), ('Kasha'), ('Midare Setsugekka')
]
df0, average_potency, pps = sam.parse_rotation(actions)
display(df0)
average potency per GCD = 438.30911764705877
average potency per second = 201.603219697
Time | Weaponskill | Abilities | Potency | Jinpu | Shifu | Yukikaze | Higanbana | Kenki | Total Potency | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 0.00 | Hakaze | 150.000 | False | False | False | 0 | 0 | 150.000 | |
1 | 2.40 | Shifu | 280.000 | False | False | False | 0 | 0 | 430.000 | |
2 | 4.56 | Kasha | 400.000 | False | True | False | 0 | 0 | 830.000 | |
3 | 6.72 | Hakaze | 150.000 | False | True | False | 0 | 5 | 980.000 | |
4 | 8.88 | Jinpu | 280.000 | False | True | False | 0 | 5 | 1260.000 | |
5 | 11.04 | Gekko | 460.000 | True | True | False | 0 | 5 | 1720.000 | |
6 | 13.20 | Hakaze | 172.500 | True | True | False | 0 | 10 | 1892.500 | |
7 | 15.36 | Yukikaze | (Meikyo Shisui,) | 391.000 | True | True | False | 0 | 10 | 2283.500 |
8 | 17.52 | Midare Setsugekka | 919.080 | True | True | True | 0 | 15 | 3202.580 | |
9 | 19.68 | Kasha | (Hissatsu: Kaiten,) | 510.600 | True | True | True | 0 | 15 | 3713.180 |
10 | 21.84 | Higanbana | 554.070 | True | True | True | 0 | 0 | 4267.250 | |
11 | 24.00 | Yukikaze | 477.480 | True | True | True | 1 | 0 | 4744.730 | |
12 | 26.16 | Gekko | 554.070 | True | True | True | 1 | 5 | 5298.800 | |
13 | 28.32 | Hakaze | 234.945 | True | True | True | 1 | 10 | 5533.745 | |
14 | 30.48 | Shifu | 400.890 | True | True | True | 1 | 10 | 5934.635 | |
15 | 32.64 | Kasha | 554.070 | True | True | True | 1 | 10 | 6488.705 | |
16 | 34.80 | Midare Setsugekka | 962.550 | True | True | True | 1 | 15 | 7451.255 |
plot_potency(df0)
dfs_aoe = []
pps_aoe = []
labels = []
n_target_range = range(2, 8)
for n_targets in n_target_range:
sam = Samurai(kenki_mastery=1)
actions = [('Hakaze'), ('Shifu'), ('Kasha'), ('Hakaze'),
('Jinpu'), ('Gekko'), ('Tenka Goken'), ('Fuga'),
('Oka'), ('Fuga'), ('Mangetsu', 'Hissatsu: Kaiten'), ('Tenka Goken'),
('Fuga'), ('Mangetsu'), ('Fuga'), ('Oka'),
('Tenka Goken')]
print('number of targets = %s' % n_targets)
df_temp, average_potency, pps = sam.parse_rotation(actions, n_targets=n_targets)
dfs_aoe.append(df_temp)
pps_aoe.append(pps)
labels.append('%s targets' % n_targets)
print('\n')
display(dfs_aoe[-1])
number of targets = 2
average potency per GCD = 420.06470588235294
average potency per second = 193.211580087
number of targets = 3
average potency per GCD = 558.6058823529411
average potency per second = 256.93452381
number of targets = 4
average potency per GCD = 683.2117647058824
average potency per second = 314.247835498
number of targets = 5
average potency per GCD = 793.8823529411765
average potency per second = 365.151515152
number of targets = 6
average potency per GCD = 890.6176470588235
average potency per second = 409.645562771
number of targets = 7
average potency per GCD = 987.3529411764706
average potency per second = 454.13961039
Time | Weaponskill | Abilities | Potency | Jinpu | Shifu | Yukikaze | Higanbana | Kenki | Total Potency | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 0.00 | Hakaze | 150.0 | False | False | False | 0 | 0 | 150.0 | |
1 | 2.40 | Shifu | 280.0 | False | False | False | 0 | 0 | 430.0 | |
2 | 4.56 | Kasha | 400.0 | False | True | False | 0 | 0 | 830.0 | |
3 | 6.72 | Hakaze | 150.0 | False | True | False | 0 | 5 | 980.0 | |
4 | 8.88 | Jinpu | 280.0 | False | True | False | 0 | 5 | 1260.0 | |
5 | 11.04 | Gekko | 460.0 | True | True | False | 0 | 5 | 1720.0 | |
6 | 13.20 | Tenka Goken | 2070.0 | True | True | False | 0 | 10 | 3790.0 | |
7 | 15.36 | Fuga | 805.0 | True | True | False | 0 | 10 | 4595.0 | |
8 | 17.52 | Oka | 1150.0 | True | True | False | 0 | 10 | 5745.0 | |
9 | 19.68 | Fuga | 805.0 | True | True | False | 0 | 15 | 6550.0 | |
10 | 21.84 | Mangetsu | (Hissatsu: Kaiten,) | 1150.0 | True | True | False | 0 | 15 | 7700.0 |
11 | 24.00 | Tenka Goken | 3105.0 | True | True | False | 0 | 0 | 10805.0 | |
12 | 26.16 | Fuga | 805.0 | True | True | False | 0 | 0 | 11610.0 | |
13 | 28.32 | Mangetsu | 1150.0 | True | True | False | 0 | 0 | 12760.0 | |
14 | 30.48 | Fuga | 805.0 | True | True | False | 0 | 5 | 13565.0 | |
15 | 32.64 | Oka | 1150.0 | True | False | False | 0 | 5 | 14715.0 | |
16 | 34.80 | Tenka Goken | 2070.0 | True | False | False | 0 | 10 | 16785.0 |
compare_n_potencies(dfs_aoe, labels)