|
Rhongomiant Application
Ramuh.Austar
Server: Ramuh
Game: FFXI
Posts: 9378
By Ramuh.Austar 2017-09-22 18:25:55
what is the total cumulative bonus of all the job points? mobile browsing is a pain when it comes to that kind of information, easy to scroll over something by accident
Leviathan.Katriina
Server: Leviathan
Game: FFXI
Posts: 812
By Leviathan.Katriina 2017-09-22 18:29:51
Leviathan.Katriina said: »I mean, it's pretty easy to check out what the behind the scenes stuff is in Braden's spreadsheet. And then cross reference it with information readily available on BGWiki.
Lets wait and see his savvy comeback~ by that I mean [pathetically trying to sound smart by providing only text and no data] Eh. Austar tends to know their stuff.
But they, like Savael and others also like to make a ton of assumptions.
Like Savael and Bloodlusty dismissing Torcleaver because it had a tendency to slightly under perform compared to Resolution in a zerg. While completely ignoring it's absolutely superior skill chaining properties.
Where they then posted a zerg video of Bloods under the pretense of "skill chains don't happen" often. Said video showed back to back to back to back Light/Darkness Skillchains the entire time.
Savael, now, is a proponent of multi-step skill chains. But he was rather dismissive of them not too long ago.
Even if that is true, the lack of proper debate ethics dismisses that entirely!
You can hold your position until proven wrong, personally i don't pay attention to such trivial matters and try to report findings.
I dont give someone's opinion any value in such matter if they don't provide evidence, especially when others went on and built said weapons to try them out in game or whatever.
This dismissive arrogant behavior is a clear sign of incompetence when you don't provide any concrete evidence and/or debate properly.
No logic whatsoever in that argument by rating Rho lower than mythic or even relic.
The advocacy of multi-step skill chain was debated over and over and proven by trial that its far superior to other zerg scenarios.
Eventually people play however they like and design their strats according to their group.
But when it comes to numbers, Spreadsheet accuracy can't be dismissed even if there is a margin of error.
TL;DR
Statements were made without proving anything and debate became personal to justify said statements despite of the various testimonies provided.
Dismissiveness based on feelings are generally stupid.
By Chriscoffey 2017-09-22 18:33:40
I am working on one right now, but yeah, there aren't a lot of them out there.
In Max buff start with 3k TP burst situations, it is our strongest weapon.
This is from some notes I took a few months ago messing with the spreadsheet. For Gungnir and Rhon I used 5 hit builds max OAT, and for Trish and Ryu I used 4 hit builds. I used very strong albeit not 100% perfect gearsets. Sadly, I don't remember exactly what and my notes aren't more detailed as I was doing it more for personal knowledge and understanding than putting it out there for the world to see. My notes say max haste/acc/att, Crooked +5 Fighter/SAM.
Rhong: 5967
Trish: 5796
Gungnir: 5218
Ryu: 5089
I also noted removing the COR puts the Ryu above the Gungnir, and widens the gap between Rhon and Trish.
This is one very specific situation, and I think the case can be made that Trish is a superior weapons since you gain Ultimate skillchain options for solo or organzied group stuff, and perform better in shorter duration stuff where AM needs built.
I like how things are becoming more and more imperfectly balanced.
This^. As Saevel stated previously, it seems like they're all fairly equal as long as you gear appropriately for the weapon that you choose to obtain.
Using all the same Buffs that Byrth had set earlier, (Basically everything maxed in a perfect situation) I have (Ryu)Drakebane at 5955 DPS and Trish at 5900. Still tweaking. That's not even enogh damage difference to really say one is better than the other.
Obivously with everything else in FF. It is going to be situational and having more options to fill those situations, is better. :)
Now for me, just need to finish collecting alexandrite... /sigh This was previously posted about DPS values. Rhom/Trish/Ryu are all very close depending on buffs you set up. I imagine if you perfect Rhom it could squeeze a bit more out considering 3k tp etc. Just posting this to reiterate the point that Real Buffs Matter to each weapon that you get. Rho: 5967
Ryu: 5955
Trish: 5900
These values are subjective to any types of buffs you are receiving or skillchain frequency to pull ahead of the other and also can be adjusted further considering these were several months previous in some situations where new gear has been added. I don't have Gungnir available but it would pull ahead, as previously mentioned in the other forum topics, in low accuracy situations . I am getting real tired of the same argument over and over again just because Trish is easier to get doesn't make it the end all be all weapon compared to other options. You can literally define situations for every REMA for where they are stronger than the other for dragoon atm and that's great because it gives you more options than just one single weapon.
Ramuh.Austar
Server: Ramuh
Game: FFXI
Posts: 9378
By Ramuh.Austar 2017-09-22 18:41:45
yeah but trish doesn't mean you have to waste merit points
By Sylph.Cherche 2017-09-22 18:47:33
Spirit Surge: Weapon Damage+20
Fly High: All Jumps: ATT+100
Ancient Circle: Damage taken from dragons -20%
Spirit Link: Caster HP Reducution -20%
Wyvern HP +200
Dragon breaker Duration +20 Seconds
Wyvern Breath Effect +200
High/Soul Jump: ATT+60
ATT/DEF+40
Relevant Gifts:
ATT+70
ACC+63
Double Attack +15%
Critical Damage +8%
[+]
Ramuh.Austar
Server: Ramuh
Game: FFXI
Posts: 9378
By Ramuh.Austar 2017-09-22 18:48:22
the first att +40 is for the pet, isn't it?
By Sylph.Cherche 2017-09-22 18:49:58
It's based off the pet being leveled up. Like the percentage boost we get in lieu of a buff like berserk of last resort.
"Increases the master's physical attack and defense when the wyvern's attributes are boosted."
Leviathan.Sidra
Server: Leviathan
Game: FFXI
Posts: 334
By Leviathan.Sidra 2017-09-22 18:50:03
No, It's the Dragoons attack while the Wyvern is out and you are Spirit Linked. Basically, DRG have a full time 20% + 40 attack buff.
[+]
Ramuh.Austar
Server: Ramuh
Game: FFXI
Posts: 9378
By Ramuh.Austar 2017-09-22 19:44:36
I have all the math-y stuff coded, I just need to define gear if there are any specific sets people want to use.
Leviathan.Katriina
Server: Leviathan
Game: FFXI
Posts: 812
By Leviathan.Katriina 2017-09-22 19:59:51
Since the debate included the spreadsheet that I provided, maybe use my set in there and call it a day.
It would be a well presented case for proposed arguments.
Ramuh.Austar
Server: Ramuh
Game: FFXI
Posts: 9378
By Ramuh.Austar 2017-09-22 20:03:42
google docs doesn't load on my phone
By Sylph.Cherche 2017-09-22 20:05:11
Might as well use the sets on the BGWiki guide. They appear to be quite good.
Optimized TP sets for each weapon, and the high/max tier for each applicable weaponskill.
[+]
Leviathan.Katriina
Server: Leviathan
Game: FFXI
Posts: 812
By Leviathan.Katriina 2017-09-22 20:13:36
Sure that works and here is my TP Set on Rho:
ItemSet 353330
Valorous Mail : 10 CHR 14 Acc 7 Att 8 STP
Valorous Hose : 5 VIT 30 ACC 34 ATK 4% DA
Valorous Greaves: 24 ATK 5% DA
Back: 30 DEX 20 ACC/ATK 10% DA
For Trish I use the same but with 4 Hit build Swapping:
Neck for [Anu] 20 ATK 7 STP
Back with 10 STP
Legs with 7 VIT 24 ACC 21 ATK 8 STP
Hands for Acro: 10 STR 15 ACC/ATK 6 STP
Edit: on spreadsheet I tried to use the same TP set from Rho on Trish and DPS went up (Rho leads by only 100)
in 4HIT TP set for Trish (Rho leads by 300ish)
Ramuh.Austar
Server: Ramuh
Game: FFXI
Posts: 9378
By Ramuh.Austar 2017-09-22 23:20:15
This thread is moving to fast for me. lol.
I can write a simulation that will more accurately model maintaining aftermath. You don't even know wtf pdif is. I'd be pretty interested in that simulation. well assuming a mathematical layman could understand how to use it. Code from math import *
from random import *
import tkinter as tk
def pdif(ratio, cap):
if ratio < 0.38:
l = 0
elif ratio < 1.25:
l = ratio * (1176 / 1024) - (448 / 1024)
elif ratio < 1.51:
l = 1
elif ratio < 2.44:
l = ratio * (1176 / 1024) - (755 / 1024)
else:
l = ratio - 0.375
l = min(l, cap)
if ratio < 0.5:
u = ratio + 0.5
elif ratio < 0.7:
u = 1
elif ratio < 1.2:
u = ratio + 0.3
elif ratio < 1.5:
u = (ratio * 0.25) + ratio
else:
u = ratio + 0.375
u = min(u, cap)
return l, u
def dex_crit(ddex):
if ddex < 7:
c = 0
elif ddex < 14:
c = 0.01
elif ddex < 20:
c = 0.02
elif ddex < 30:
c = 0.03
elif ddex < 40:
c = 0.04
elif ddex < 50:
c = (ddex - 35) / 100
else:
c = 0.15
return c
def fstr(dstr, wpnrank):
if dstr <= -22:
f = (dstr + 13) / 4
elif dstr <= -16:
f = (dstr + 12) / 4
elif dstr <= -8:
f = (dstr + 10) / 4
elif dstr <= -3:
f = (dstr + 9) / 4
elif dstr <= 0:
f = (dstr + 8) / 4
elif dstr <= 5:
f = (dstr + 7) / 4
elif dstr <= 11:
f = (dstr + 6) / 4
else:
f = (dstr + 4) / 4
f = floor(f)
return min(max(-wpnrank, f), wpnrank + 8)
class Dragoon:
def __init__(self):
#hume
self.str = 106 + 7 #hasso
self.dex = 101
self.vit = 104
self.dmg = 0
self.wpn_rank = 0
self.delay = 0
self.delay_cap = 0
self.skill = 440 #merits
self.acc = 35 + 63 + 10 #trait + gifts + hasso
self.atk = 22 + 70 + 40 #trait + gifts + bird
self.da = 0.15 #gifts
self.ta = 0
self.qa = 0
self.zanshin = 0.25 #sam sub
self.crit_rate = 0.1 #base and merits
self.crit_dmg = 0.08 #gifts
self.stp = 0.15 #sam sub
self.tp_hit = 0
self.tp = 3000
self.eq_haste = 0
self.ma_haste = 0
self.ja_haste = 200 #hasso + bird?
self.total_haste = 0
self.pdif_n = [0, 0]
self.pdif_c = [0, 0]
self.triple_proc = False
self.triple_rate = 0
self.hit_rate = 0
self.tp_bonus = 0
self.wsd = 0
self.fotia = 0
self.vishap_set = 0
self.mob_def = 0
self.mob_eva = 0
self.mob_vit = 0
self.mob_agi = 0
self.def_down = 0
def unequip(self):
a = self.tp
b = self.triple_rate
self.__init__()
self.tp = a
self.triple_rate = b
def pdif_calc(self):
self.mob_def_debuff = max(self.mob_def * (1 - self.def_down), 1)
ratio = self.atk / self.mob_def_debuff
a, b = pdif(ratio, 3.75)
c, d = pdif(ratio, 4.75)
self.pdif_n = [a, b]
self.pdif_c = [c, d]
def hit_rate_calc(self):
self.hit_rate = min(max(75 + floor((self.acc - self.mob_eva) / 2), 20), 95) / 100
def swing(self, w):
x = 0
if random() < self.hit_rate:
if random() > self.crit_rate:
a, b = self.pdif_n[0], self.pdif_n[1]
x = uniform(a, b)
x = uniform(x, x * 1.05)
else:
c, d = self.pdif_c[0], self.pdif_c[1]
x = uniform(c, d)
x = uniform(x, x * 1.05) * (1 + self.crit_dmg)
elif random() < self.zanshin:
if random() < min(self.hit_rate + 0.17, 0.95):
if random() > self.crit_rate:
a, b = self.pdif_n[0], self.pdif_n[1]
x = uniform(a, b)
x = uniform(x, x * 1.05)
else:
c, d = self.pdif_c[0], self.pdif_c[1]
x = uniform(c, d)
x = uniform(x, x * 1.05) * (1 + self.crit_dmg)
return x * w
def dmg_calc(self):
self.dmg += floor(fstr(self.str - self.mob_vit, self.wpn_rank))
def acc_calc(self):
self.acc += floor((self.skill - 600) * 0.9) + 540
self.acc += floor(self.dex * 0.75)
if self.vishap_set > 1:
self.acc += (self.vishap_set - 1) * 15
def ddex_calc(self):
self.crit_rate += dex_crit(self.dex - self.mob_agi)
def atk_calc(self):
self.atk += floor(self.str * 0.75) + self.skill + 8
self.smite()
def haste_calc(self):
self.eq_haste = min(self.eq_haste, 256)
self.ma_haste = min(self.ma_haste, 448)
self.ja_haste = min(self.ja_haste, 256)
self.total_haste = self.eq_haste + self.ma_haste + self.ja_haste
self.delay = max(self.delay_cap, self.delay * (1 - self.total_haste / 1024))
def smite(self):
self.atk = floor(self.atk * (1 + 38 / 256))
def tp_hit_calc(self):
self.tp_hit = floor(self.tp_hit * (1 + self.stp))
def round(self):
hit = 0
damage = 0
if random() < self.qa:
hit += 3
elif random() < self.ta:
hit += 2
elif random() < self.da:
hit += 1
temp = self.swing(self.dmg)
if temp > 0:
self.tp += self.tp_hit
if self.triple_proc and random() < self.triple_rate:
damage += temp * 3
else:
damage += temp
for i in range(hit):
temp = self.swing(self.dmg)
if temp > 0:
self.tp += self.tp_hit
if self.triple_proc and random() < self.triple_rate:
damage += temp * 3
else:
damage += temp
return damage
def stardiver(self):
hold_crit = self.crit_rate
self.crit_rate = 0
wsc = floor(self.str * 0.85) + floor(self.dex * 0.1)
weapon_skill_d = self.dmg + wsc
ws_tp = min(self.tp + self.tp_bonus, 3000)
if ws_tp < 2000:
ftp = 217 / 256 * self.fotia + 0.75 * (1 - self.fotia) + 0.5 * (ws_tp - 1000) / 1000
elif ws_tp < 3000:
ftp = 345 / 256 * self.fotia + 1.25 * (1 - self.fotia) + 0.5 * (ws_tp - 2000) / 1000
else:
ftp = 473 / 256 * self.fotia + 1.75 * (1 - self.fotia)
damage = 0
self.tp = 0
hit = 3
if random() < self.qa:
hit += 3
elif random() < self.ta:
hit += 2
elif random() < self.da:
hit += 1
if random() < self.qa:
hit += 3
elif random() < self.ta:
hit += 2
elif random() < self.da:
hit += 1
temp = self.swing(weapon_skill_d * ftp * (1 + self.wsd))
if temp > 0:
self.tp += self.tp_hit
damage += temp
for i in range(min(7, hit)):
temp = self.swing(weapon_skill_d * ftp)
if temp > 0:
self.tp += floor(10 * (1 + self.stp))
damage += temp
self.crit_rate = hold_crit
return damage
def camlann(self):
hold_crit = self.crit_rate
self.crit_rate = 0
wsc = floor(self.str * 0.6) + floor(self.vit * 0.6) + floor(self.dex * 0.1)
weapon_skill_d = self.dmg + wsc
ws_tp = min(self.tp + self.tp_bonus, 3000)
ftp = 793 / 256 * self.fotia + 3 * (1 - self.fotia)
damage = 0
self.tp = 0
hit = 0
if random() < self.qa:
hit += 3
elif random() < self.ta:
hit += 2
elif random() < self.da:
hit += 1
temp = self.swing(weapon_skill_d * ftp * (1 + self.wsd))
if temp > 0:
self.tp += self.tp_hit
damage += temp
for i in range(hit):
temp = self.swing(weapon_skill_d)
if temp > 0:
self.tp += floor(10 * (1 + self.stp))
damage += temp
return damage
gearname = dict()
#Weapons
gearname['weapon'] = []
def trishula(job):
job.dmg += 345
job.wpn_rank = floor(345 / 9)
job.delay += 492
job.delay_cap = 492 * 0.2
job.skill += 269
job.stp += 0.1
job.tp_bonus += 500
job.tp_hit = 137
gearname['weapon'].append('trishula')
def rhongomiant(job):
job.dmg += 347
job.wpn_rank = floor(347 / 9)
job.delay += 492
job.delay_cap = 492 * 0.2
job.vit += 50
job.skill += 269
job.tp_hit = 137
gearname['weapon'].append('rhongomiant')
gearname['weapon'].append('')
gearname['weapon'].sort()
#Utu Grip Only
gearname['grip'] = []
def utu_grip(job):
job.acc += 30
job.atk += 30
gearname['grip'].append('utu_grip')
gearname['grip'].append('')
gearname['grip'].sort()
#Ammo
gearname['ammo'] = []
def ginsen(job):
job.acc += 5
job.atk += 10
job.stp += 0.03
gearname['ammo'].append('ginsen')
def knobkierrie(job):
job.atk += 23
job.wsd += 0.06
gearname['ammo'].append('knobkierrie')
gearname['ammo'].append('')
gearname['ammo'].sort()
#Head
gearname['head'] = []
def flam_zucchetto(job):
job.str += 32
job.dex += 28
job.vit += 24
job.acc += 38
job.eq_haste += 40
job.ta += 0.04
job.stp += 0.05
gearname['head'].append('flam_zucchetto')
gearname['head'].append('')
gearname['head'].sort()
#Neck
gearname['neck'] = []
def anu_torque(job):
job.atk += 20
job.stp += 0.07
gearname['neck'].append('anu_torque')
def fotia_gorget(job):
job.acc += 10
job.fotia += 1
gearname['neck'].append('fotia_gorget')
gearname['neck'].append('')
gearname['neck'].sort()
#Earrings
gearname['ear'] = []
def brutal_earring(job):
job.da += 0.05
job.stp += 0.01
gearname['ear'].append('brutal_earring')
def moonshade_earring(job):
job.atk += 4
job.tp_bonus += 250
gearname['ear'].append('moonshade_earring')
def sherida_earring(job):
job.str += 5
job.dex += 5
job.da += 0.05
job.stp += 0.05
gearname['ear'].append('sherida_earring')
gearname['ear'].append('')
gearname['ear'].sort()
#Body
gearname['body'] = []
def dagon_breast(job):
job.str += 40
job.dex += 30
job.vit += 40
job.acc += 45
job.atk += 45
job.eq_haste += 10
job.ta += 0.05
job.crit_rate += 0.04
gearname['body'].append('dagon_breast')
def valorous_mail_stp(job):
job.str += 29 + 10
job.dex += 25
job.vit += 29
job.acc += 20 + 15
job.eq_haste += 30
job.stp += 0.03 + 0.08
job.da += 0.02
job.atk += 15 #augment
gearname['body'].append('valorous_mail_stp')
gearname['body'].append('')
gearname['body'].sort()
#Hands
gearname['hands'] = []
def acro_gauntlets(job):
job.str += 4 + 7
job.dex += 31 + 7
job.vit += 28
job.atk += 7 + 20
job.eq_haste += 40
job.stp += 0.04 + 0.06
job.acc += 20 #augment
gearname['hands'].append('acro_gauntlets')
def sulev_gauntlets(job):
job.str += 23
job.dex += 34
job.vit += 45
job.acc += 43
job.atk += 47
job.eq_haste += 30
job.da += 0.06
gearname['hands'].append('sulev_gauntlets')
gearname['hands'].append('')
gearname['hands'].sort()
#Rings
gearname['ring'] = []
def niqmaddu_ring(job):
job.str += 10
job.dex += 10
job.vit += 10
job.qa += 0.03
gearname['ring'].append('niqmaddu_ring')
def petrov_ring(job):
job.str += 3
job.dex += 3
job.vit += 3
job.da += 0.01
job.stp += 0.05
gearname['ring'].append('petrov_ring')
def regal_ring(job):
job.str += 10
job.dex += 10
job.vit += 10
job.atk += 20
job.vishap_set += 1
gearname['ring'].append('regal_ring')
gearname['ring'].append('')
gearname['ring'].sort()
#Back
gearname['back'] = []
def brigantia_dex_da(job):
job.dex += 20
job.acc += 20
job.atk += 20
job.da += 0.1
gearname['back'].append('brigantia_dex_da')
def brigantia_dex_stp(job):
job.dex += 20
job.acc += 20
job.atk += 20
job.stp += 0.1
gearname['back'].append('brigantia_dex_stp')
def brigantia_str_da(job):
job.str += 20
job.acc += 20
job.atk += 20
job.da += 0.1
gearname['back'].append('brigantia_str_da')
def brigantia_str_stp(job):
job.str += 20
job.acc += 20
job.atk += 20
job.stp += 0.1
gearname['back'].append('brigantia_str_stp')
def brigantia_str_wsd(job):
job.str += 20
job.acc += 20
job.atk += 20
job.wsd += 0.1
gearname['back'].append('brigantia_str_wsd')
gearname['back'].append('')
gearname['back'].sort()
#Waist
gearname['waist'] = []
def fotia_belt(job):
job.acc += 10
job.fotia += 1
gearname['waist'].append('fotia_belt')
def ioskeha_belt_HQ(job):
job.acc += 17
job.eq_haste += 81
job.da += 0.09
gearname['waist'].append('ioskeha_belt_HQ')
gearname['waist'].append('')
gearname['waist'].sort()
#Legs
gearname['legs'] = []
def sulev_cuisses(job):
job.str += 47
job.vit += 33
job.acc += 45
job.atk += 49
job.eq_haste += 20
job.ta += 0.04
gearname['legs'].append('sulev_cuisses')
def valor_hose_da(job):
job.str += 39 + 10
job.vit += 26
job.atk += 15 + 15
job.eq_haste += 51
job.da += 0.03 + 0.05
job.acc += 15 #augment
gearname['legs'].append('valor_hose_da')
def valor_hose_stp(job):
job.str += 39 + 10
job.vit += 26
job.atk += 15 + 15
job.eq_haste += 51
job.da += 0.03
job.acc += 15 #augment
job.stp += 0.08 #augment
gearname['legs'].append('valor_hose_stp')
gearname['legs'].append('')
gearname['legs'].sort()
#Feet
gearname['feet'] = []
def valorous_greaves_da(job):
job.str += 17 + 10
job.dex += 20
job.vit += 17
job.acc += 12 + 15
job.atk += 12 + 15
job.eq_haste += 30
job.stp += 0.05
job.crit_dmg += 0.04
job.da += 0.05 #augment
gearname['feet'].append('valorous_greaves_da')
gearname['feet'].append('')
gearname['feet'].sort()
#Food
food = []
def riverfin_soup(job):
acc += 90
atk += 80
food.append('riverfin_soup')
food.append('')
food.sort()
#Songs
songs = []
def sword_madrigal(job):
job.acc += 45 + 5
songs.append('sword_madrigal')
def blade_madrigal(job):
job.acc += 60 + 5
songs.append('blade_madrigal')
def minuet_1(job):
job.atk += 32 + 20 + 5
songs.append('minuet_1')
def minuet_2(job):
job.atk += 64 + 20 + 5
songs.append('minuet_2')
def minuet_3(job):
job.atk += 96 + 20 + 5
songs.append('minuet_3')
def minuet_4(job):
job.atk += 112 + 20 + 5
songs.append('minuet_4')
def minuet_5(job):
job.atk += 124 + 20 + 5
songs.append('minuet_5')
def advancing_march(job):
job.ma_haste += 108
songs.append('advancing_march')
def victory_march(job):
job.ma_haste += 163
songs.append('victory_march')
def honor_march(job):
job.ma_haste += 126
job.acc += 42
job.atk += 168
songs.append('honor_march')
songs.append('')
songs.sort()
#Rolls
rolls = []
def fighters_roll(job):
job.da += 0.22
rolls.append('fighters_roll')
def rogues_roll(job):
job.crit_rate += 0.22
rolls.append('rogues_roll')
def samurai_roll(job):
job.stp += 0.68
rolls.append('samurai_roll')
rolls.append('')
rolls.sort()
#Haste
haste_buffs = []
def haste_1(job):
job.ma_haste += 150
haste_buffs.append('haste_1')
def haste_2(job):
job.ma_haste += 307
haste_buffs.append('haste_2')
def geo_haste(job):
job.ma_haste += 418
haste_buffs.append('geo_haste')
haste_buffs.append('')
haste_buffs.sort()
#Defense Down
defense_down = []
def dia_2(job):
job.def_down += (26 / 256)
defense_down.append('dia_2')
def frailty(job):
job.def_down += 0.418
defense_down.append('frailty')
defense_down.append('')
defense_down.sort()
def buff(job):
for b in buffs_end:
exec(b.get() + "(job)")
#Mobs
mob_list = []
def apex_crab(job):
job.mob_def = 1310
job.mob_eva = 1163
job.mob_vit = 300
job.mob_agi = 275
mob_list.append('apex_crab')
mob_list.append('')
mob_list.sort()
def tp_set(job):
for t in TPgear:
exec(t.get() + "(job)")
exec(mob.get() + "(job)")
buff(job)
job.dmg_calc()
job.ddex_calc()
job.acc_calc()
job.atk_calc()
job.haste_calc()
job.pdif_calc()
job.hit_rate_calc()
job.tp_hit_calc()
def ws_set(job):
for w in WSgear:
exec(w.get() + "(job)")
exec(mob.get() + "(job)")
buff(job)
job.dmg_calc()
job.ddex_calc()
job.acc_calc()
job.atk_calc()
job.haste_calc()
job.pdif_calc()
job.hit_rate_calc()
job.tp_hit_calc()
def de_equip(job):
job.unequip()
def statistics_tp(weapon, wsboolean, tplimit):
k = 10000
casey = Dragoon()
exec(weapon + "(casey)")
tp_set(casey)
return casey
def statistics_ws(weapon, wsboolean, tplimit):
k = 10000
casey = Dragoon()
exec(weapon + "(casey)")
ws_set(casey)
return casey
def sim_1(weapon, wsboolean, tplimit):
k = 10000
casey = Dragoon()
exec(weapon + "(casey)")
tp_set(casey)
temps = 0
x = 0
y = 0
z = 0
ws_count = 0
for i in range(k):
x += casey.round()
if casey.tp >= 1000 and wsboolean:
de_equip(casey)
exec(weapon + "(casey)")
ws_set(casey)
y = eval("casey."+ws_name.get() + "()")
de_equip(casey)
exec(weapon + "(casey)")
tp_set(casey)
x += y
z += y
ws_count += 1
temps += 2
temps += casey.delay / 60
dps = x / temps
if wsboolean:
print(weapon, dps ," (WS : ", z / ws_count, ")")
else:
print(weapon, dps)
def main():
print(ws_name.get())
wsboolean = True
tplimit = 1000
dps_1 = sim_1(weapon.get(), wsboolean, tplimit)
SIZED = "400x400"
root = tk.Tk()
root.geometry(SIZED)
root.title("DRG")
weapon, grip, ammo = tk.StringVar(root), tk.StringVar(root), tk.StringVar(root)
head, neck, ear1, ear2 = tk.StringVar(root), tk.StringVar(root), tk.StringVar(root), tk.StringVar(root)
body, hands, ring1, ring2 = tk.StringVar(root), tk.StringVar(root), tk.StringVar(root), tk.StringVar(root)
back, waist, legs, feet = tk.StringVar(root), tk.StringVar(root), tk.StringVar(root), tk.StringVar(root)
weapon_WS, grip_WS, ammo_WS = tk.StringVar(root), tk.StringVar(root), tk.StringVar(root)
head_WS, neck_WS, ear1_WS, ear2_WS = tk.StringVar(root), tk.StringVar(root), tk.StringVar(root), tk.StringVar(root)
body_WS, hands_WS, ring1_WS, ring2_WS = tk.StringVar(root), tk.StringVar(root), tk.StringVar(root), tk.StringVar(root)
back_WS, waist_WS, legs_WS, feet_WS = tk.StringVar(root), tk.StringVar(root), tk.StringVar(root), tk.StringVar(root)
mob, debuff_1, debuff_2 = tk.StringVar(root), tk.StringVar(root), tk.StringVar(root)
song_1, song_2, song_3, song_4 = tk.StringVar(root), tk.StringVar(root), tk.StringVar(root), tk.StringVar(root)
haste_buff = tk.StringVar(root)
roll_1, roll_2 = tk.StringVar(root), tk.StringVar(root)
food_choice = tk.StringVar(root)
ws_name = tk.StringVar(root)
weapon.set(gearname['weapon'][0]), grip.set(gearname['grip'][0]), ammo.set(gearname['ammo'][0]), head.set(gearname['head'][0]), neck.set(gearname['neck'][0]), ear1.set(gearname['ear'][0]), ear2.set(gearname['ear'][0]), body.set(gearname['body'][0]), hands.set(gearname['hands'][0]), ring1.set(gearname['ring'][0]), ring2.set(gearname['ring'][0]), back.set(gearname['back'][0]), waist.set(gearname['waist'][0]), legs.set(gearname['legs'][0]), feet.set(gearname['feet'][0])
weapon_WS.set(gearname['weapon'][0]), grip_WS.set(gearname['grip'][0]), ammo_WS.set(gearname['ammo'][0]), head_WS.set(gearname['head'][0]), neck_WS.set(gearname['neck'][0]), ear1_WS.set(gearname['ear'][0]), ear2_WS.set(gearname['ear'][0]), body_WS.set(gearname['body'][0]), hands_WS.set(gearname['hands'][0]), ring1_WS.set(gearname['ring'][0]), ring2_WS.set(gearname['ring'][0]), back_WS.set(gearname['back'][0]), waist_WS.set(gearname['waist'][0]), legs_WS.set(gearname['legs'][0]), feet_WS.set(gearname['feet'][0])
mob.set(mob_list[0])
debuff_1.set(defense_down[0]), debuff_2.set(defense_down[0])
song_1.set(songs[0]), song_2.set(songs[0]), song_3.set(songs[0]), song_4.set(songs[0])
roll_1.set(rolls[0]), roll_2.set(rolls[0]), haste_buff.set(haste_buffs[0])
food_choice.set(food[0])
ws_name.set('stardiver')
def button_1():
def go_back():
fin_1.destroy()
root.deiconify()
root.withdraw()
fin_1 = tk.Toplevel(root)
fin_1.geometry("700x300")
label_example = tk.Label(fin_1, text = "TP Set")
label_example.grid(row = 0, column = 0)
btn_back = tk.Button(fin_1, text = "Back", command = go_back, bg = "#FF0000")
btn_back.grid(row = 0, column = 1)
#Weapon
choices = gearname['weapon']
popup_menu = tk.OptionMenu(fin_1, weapon, *choices)
tk.Label(fin_1, text = "Weapon").grid(row = 1, column = 0)
popup_menu.grid(row = 2, column = 0)
#Grip
choices = gearname['grip']
popup_menu = tk.OptionMenu(fin_1, grip, *choices)
tk.Label(fin_1, text = "Grip").grid(row = 1, column = 1)
popup_menu.grid(row = 2, column = 1)
#ammo
choices = gearname['ammo']
popup_menu = tk.OptionMenu(fin_1, ammo, *choices)
tk.Label(fin_1, text = "Ammo").grid(row = 1, column = 3)
popup_menu.grid(row = 2, column = 3)
#head
choices = gearname['head']
popup_menu = tk.OptionMenu(fin_1, head, *choices)
tk.Label(fin_1, text = "Head").grid(row = 3, column = 0)
popup_menu.grid(row = 4, column = 0)
#neck
choices = gearname['neck']
popup_menu = tk.OptionMenu(fin_1, neck, *choices)
tk.Label(fin_1, text = "Neck").grid(row = 3, column = 1)
popup_menu.grid(row = 4, column = 1)
#ear1
choices = gearname['ear']
popup_menu = tk.OptionMenu(fin_1, ear1, *choices)
tk.Label(fin_1, text = "Ear 1").grid(row = 3, column = 2)
popup_menu.grid(row = 4, column = 2)
#ear2
choices = gearname['ear']
popup_menu = tk.OptionMenu(fin_1, ear2, *choices)
tk.Label(fin_1, text = "Ear 2").grid(row = 3, column = 3)
popup_menu.grid(row = 4, column = 3)
#body
choices = gearname['body']
popup_menu = tk.OptionMenu(fin_1, body, *choices)
tk.Label(fin_1, text = "Body").grid(row = 5, column = 0)
popup_menu.grid(row = 6, column = 0)
#hands
choices = gearname['hands']
popup_menu = tk.OptionMenu(fin_1, hands, *choices)
tk.Label(fin_1, text = "Hands").grid(row = 5, column = 1)
popup_menu.grid(row = 6, column = 1)
#ring1
choices = gearname['ring']
popup_menu = tk.OptionMenu(fin_1, ring1, *choices)
tk.Label(fin_1, text = "Ring 1").grid(row = 5, column = 2)
popup_menu.grid(row = 6, column = 2)
#ring2
choices = gearname['ring']
popup_menu = tk.OptionMenu(fin_1, ring2, *choices)
tk.Label(fin_1, text = "Ring 2").grid(row = 5, column = 3)
popup_menu.grid(row = 6, column = 3)
#back
choices = gearname['back']
popup_menu = tk.OptionMenu(fin_1, back, *choices)
tk.Label(fin_1, text = "Back").grid(row = 7, column = 0)
popup_menu.grid(row = 8, column = 0)
#waist
choices = gearname['waist']
popup_menu = tk.OptionMenu(fin_1, waist, *choices)
tk.Label(fin_1, text = "Waist").grid(row = 7, column = 1)
popup_menu.grid(row = 8, column = 1)
#legs
choices = gearname['legs']
popup_menu = tk.OptionMenu(fin_1, legs, *choices)
tk.Label(fin_1, text = "Legs").grid(row = 7, column = 2)
popup_menu.grid(row = 8, column = 2)
#feet
choices = gearname['feet']
popup_menu = tk.OptionMenu(fin_1, feet, *choices)
tk.Label(fin_1, text = "Feet").grid(row = 7, column = 3)
popup_menu.grid(row = 8, column = 3)
def button_2():
def go_back():
fin_1.destroy()
root.deiconify()
root.withdraw()
fin_1 = tk.Toplevel(root)
fin_1.geometry("700x300")
label_example = tk.Label(fin_1, text = "WS Set")
label_example.grid(row = 0, column = 0)
btn_back = tk.Button(fin_1, text = "Back", command = go_back, bg = "#FF0000")
btn_back.grid(row = 0, column = 1)
#Weapon
choices = gearname['weapon']
popup_menu = tk.OptionMenu(fin_1, weapon_WS, *choices)
tk.Label(fin_1, text = "Weapon").grid(row = 1, column = 0)
popup_menu.grid(row = 2, column = 0)
#Grip
choices = gearname['grip']
popup_menu = tk.OptionMenu(fin_1, grip_WS, *choices)
tk.Label(fin_1, text = "Grip").grid(row = 1, column = 1)
popup_menu.grid(row = 2, column = 1)
#ammo
choices = gearname['ammo']
popup_menu = tk.OptionMenu(fin_1, ammo_WS, *choices)
tk.Label(fin_1, text = "Ammo").grid(row = 1, column = 3)
popup_menu.grid(row = 2, column = 3)
#head
choices = gearname['head']
popup_menu = tk.OptionMenu(fin_1, head_WS, *choices)
tk.Label(fin_1, text = "Head").grid(row = 3, column = 0)
popup_menu.grid(row = 4, column = 0)
#neck
choices = gearname['neck']
popup_menu = tk.OptionMenu(fin_1, neck_WS, *choices)
tk.Label(fin_1, text = "Neck").grid(row = 3, column = 1)
popup_menu.grid(row = 4, column = 1)
#ear1
choices = gearname['ear']
popup_menu = tk.OptionMenu(fin_1, ear1_WS, *choices)
tk.Label(fin_1, text = "Ear 1").grid(row = 3, column = 2)
popup_menu.grid(row = 4, column = 2)
#ear2
choices = gearname['ear']
popup_menu = tk.OptionMenu(fin_1, ear2_WS, *choices)
tk.Label(fin_1, text = "Ear 2").grid(row = 3, column = 3)
popup_menu.grid(row = 4, column = 3)
#body
choices = gearname['body']
popup_menu = tk.OptionMenu(fin_1, body_WS, *choices)
tk.Label(fin_1, text = "Body").grid(row = 5, column = 0)
popup_menu.grid(row = 6, column = 0)
#hands
choices = gearname['hands']
popup_menu = tk.OptionMenu(fin_1, hands_WS, *choices)
tk.Label(fin_1, text = "Hands").grid(row = 5, column = 1)
popup_menu.grid(row = 6, column = 1)
#ring1
choices = gearname['ring']
popup_menu = tk.OptionMenu(fin_1, ring1_WS, *choices)
tk.Label(fin_1, text = "Ring 1").grid(row = 5, column = 2)
popup_menu.grid(row = 6, column = 2)
#ring2
choices = gearname['ring']
popup_menu = tk.OptionMenu(fin_1, ring2_WS, *choices)
tk.Label(fin_1, text = "Ring 2").grid(row = 5, column = 3)
popup_menu.grid(row = 6, column = 3)
#back
choices = gearname['back']
popup_menu = tk.OptionMenu(fin_1, back_WS, *choices)
tk.Label(fin_1, text = "Back").grid(row = 7, column = 0)
popup_menu.grid(row = 8, column = 0)
#waist
choices = gearname['waist']
popup_menu = tk.OptionMenu(fin_1, waist_WS, *choices)
tk.Label(fin_1, text = "Waist").grid(row = 7, column = 1)
popup_menu.grid(row = 8, column = 1)
#legs
choices = gearname['legs']
popup_menu = tk.OptionMenu(fin_1, legs_WS, *choices)
tk.Label(fin_1, text = "Legs").grid(row = 7, column = 2)
popup_menu.grid(row = 8, column = 2)
#feet
choices = gearname['feet']
popup_menu = tk.OptionMenu(fin_1, feet_WS, *choices)
tk.Label(fin_1, text = "Feet").grid(row = 7, column = 3)
popup_menu.grid(row = 8, column = 3)
def button_3():
def go_back():
fin_1.destroy()
root.deiconify()
root.withdraw()
fin_1 = tk.Toplevel(root)
fin_1.geometry("400x300")
label_example = tk.Label(fin_1, text = "Mob")
label_example.grid(row = 0, column = 0)
btn_back = tk.Button(fin_1, text = "Back", command = go_back, bg = "#FF0000")
btn_back.grid(row = 0, column = 1)
#mob
choices = mob_list
popup_menu = tk.OptionMenu(fin_1, mob, *choices)
tk.Label(fin_1, text = "Mob").grid(row = 1, column = 0)
popup_menu.grid(row = 2, column = 0)
#debuff 1
choices = defense_down
popup_menu = tk.OptionMenu(fin_1, debuff_1, *choices)
tk.Label(fin_1, text = "Defense Down").grid(row = 1, column = 1)
popup_menu.grid(row = 2, column = 1)
#debuff 2
choices = defense_down
popup_menu = tk.OptionMenu(fin_1, debuff_2, *choices)
tk.Label(fin_1, text = "Defense Down II").grid(row = 1, column = 2)
popup_menu.grid(row = 2, column = 2)
def button_4():
def go_back():
fin_1.destroy()
root.deiconify()
root.withdraw()
fin_1 = tk.Toplevel(root)
fin_1.geometry("700x300")
label_example = tk.Label(fin_1, text = "Buffs")
label_example.grid(row = 0, column = 0)
btn_back = tk.Button(fin_1, text = "Back", command = go_back, bg = "#FF0000")
btn_back.grid(row = 0, column = 1)
#song 1
choices = songs
popup_menu = tk.OptionMenu(fin_1, song_1, *choices)
tk.Label(fin_1, text = "Song 1").grid(row = 1, column = 0)
popup_menu.grid(row = 2, column = 0)
#song 2
choices = songs
popup_menu = tk.OptionMenu(fin_1, song_2, *choices)
tk.Label(fin_1, text = "Song 2").grid(row = 1, column = 1)
popup_menu.grid(row = 2, column = 1)
#song 3
choices = songs
popup_menu = tk.OptionMenu(fin_1, song_3, *choices)
tk.Label(fin_1, text = "Song 3").grid(row = 1, column = 2)
popup_menu.grid(row = 2, column = 2)
#song 4
choices = songs
popup_menu = tk.OptionMenu(fin_1, song_4, *choices)
tk.Label(fin_1, text = "Song 4").grid(row = 1, column = 3)
popup_menu.grid(row = 2, column = 3)
#roll 1
choices = rolls
popup_menu = tk.OptionMenu(fin_1, roll_1, *choices)
tk.Label(fin_1, text = "Roll 1").grid(row = 3, column = 0)
popup_menu.grid(row = 4, column = 0)
#roll 2
choices = rolls
popup_menu = tk.OptionMenu(fin_1, roll_2, *choices)
tk.Label(fin_1, text = "Roll 2").grid(row = 3, column = 1)
popup_menu.grid(row = 4, column = 1)
#haste spells
choices = haste_buffs
popup_menu = tk.OptionMenu(fin_1, haste_buff, *choices)
tk.Label(fin_1, text = "Haste Buffs").grid(row = 5, column = 0)
popup_menu.grid(row = 6, column = 0)
#food
choices = food
popup_menu = tk.OptionMenu(fin_1, food_choice, *choices)
tk.Label(fin_1, text = "Food").grid(row = 7, column = 0)
popup_menu.grid(row = 8, column = 0)
def main_2():
global buffs_end, WSgear, TPgear, mob
buffs_end = [song_1, song_2, song_3, song_4, roll_1, roll_2, haste_buff, debuff_1, debuff_2]
TPgear = [ammo, head, neck, ear1, ear2, body, hands, ring1, ring2, back, waist, legs, feet]
WSgear = [ammo_WS, head_WS, neck_WS, ear1_WS, ear2_WS, body_WS, hands_WS, ring1_WS, ring2_WS, back_WS, waist_WS, legs_WS, feet_WS]
main()
label_main = tk.Label(root, text = "Choose an item")
label_main.pack()
B1 = tk.Button(root, text = "TP Set", command = button_1)
B1.pack()
B2 = tk.Button(root, text = "WS Set", command = button_2)
B2.pack()
B3 = tk.Button(root, text = "Mob", command = button_3)
B3.pack()
B4 = tk.Button(root, text = "Buffs", command = button_4)
B4.pack()
button_run = tk.Button(root, text = "Run Simulation", command = main_2, bg = "#008000")
button_run.pack()
button_close = tk.Button(root, text = "Exit", command = root.destroy, bg = "#FF0000")
button_close.pack()
root.mainloop()
have the majority of it done so far, I just need to add a few things if you want to look over the initial stats and the gear itself to make sure it's all correct or if you want more gear added. stats like da, stp, wsd, and crit damage need to be decimals
As far as how to use it, it'll have a very simple interface
[+]
Ramuh.Austar
Server: Ramuh
Game: FFXI
Posts: 9378
By Ramuh.Austar 2017-09-23 15:13:40
have a working one made now:
https://www.dropbox.com/s/02ybb5ro4n02rje/drg.cpython-36.pyc?dl=0
disclaimers: no relic or mythic added yet, rho has no upkeep on AM3, it's always active, some stats like conserve tp and fotia % tp keep aren't added yet, jumps aren't added yet, fury isn't added yet, or escha buffs
mostly just want someone to make sure all the stats match
and for those that want the source:
Code from math import *
from random import *
import tkinter as tk
def pdif(ratio, cap):
if ratio < 0.38:
l = 0
elif ratio < 1.25:
l = ratio * (1176 / 1024) - (448 / 1024)
elif ratio < 1.51:
l = 1
elif ratio < 2.44:
l = ratio * (1176 / 1024) - (755 / 1024)
else:
l = ratio - 0.375
l = min(l, cap)
if ratio < 0.5:
u = ratio + 0.5
elif ratio < 0.7:
u = 1
elif ratio < 1.2:
u = ratio + 0.3
elif ratio < 1.5:
u = (ratio * 0.25) + ratio
else:
u = ratio + 0.375
u = min(u, cap)
return l, u
def dex_crit(ddex):
if ddex < 7:
c = 0
elif ddex < 14:
c = 0.01
elif ddex < 20:
c = 0.02
elif ddex < 30:
c = 0.03
elif ddex < 40:
c = 0.04
elif ddex < 50:
c = (ddex - 35) / 100
else:
c = 0.15
return c
def fstr(dstr, wpnrank):
if dstr <= -22:
f = (dstr + 13) / 4
elif dstr <= -16:
f = (dstr + 12) / 4
elif dstr <= -8:
f = (dstr + 10) / 4
elif dstr <= -3:
f = (dstr + 9) / 4
elif dstr <= 0:
f = (dstr + 8) / 4
elif dstr <= 5:
f = (dstr + 7) / 4
elif dstr <= 11:
f = (dstr + 6) / 4
else:
f = (dstr + 4) / 4
f = floor(f)
return min(max(-wpnrank, f), wpnrank + 8)
class Dragoon:
def __init__(self):
#hume
self.str = 106 + 7 #hasso
self.dex = 101
self.vit = 104
self.dmg = 0
self.wpn_rank = 0
self.delay = 0
self.delay_cap = 0
self.skill = 440 #merits
self.acc = 35 + 63 + 10 #trait + gifts + hasso
self.atk = 22 + 70 + 40 #trait + gifts + bird
self.da = 0.15 #gifts
self.ta = 0
self.qa = 0
self.crit_rate = 0.1 #base and merits
self.crit_dmg = 0.08 #gifts
self.stp = 0.15 #sam sub
self.tp_hit = 0
self.tp = 0
self.eq_haste = 0
self.ma_haste = 0
self.ja_haste = 200 #hasso + bird?
self.total_haste = 0
self.pdif_n = [0, 0]
self.pdif_c = [0, 0]
self.triple_proc = False
self.triple_rate = 0
self.hit_rate = 0
self.tp_bonus = 0
self.wsd = 0
self.fotia = 0
self.vishap_set = 0
self.mob_def = 0
self.mob_eva = 0
self.mob_vit = 0
self.mob_agi = 0
self.def_down = 0
self.wyvern = True #20% boost from bird
self.chaos = False
self.fury = False
def unequip(self):
a = self.tp
b = self.triple_rate
self.__init__()
self.tp = a
self.triple_rate = b
def pdif_calc(self):
self.mob_def_debuff = max(self.mob_def * (1 - self.def_down), 1)
ratio = self.atk / self.mob_def_debuff
a, b = pdif(ratio, 3.75)
c, d = pdif(ratio, 4.75)
self.pdif_n = [a, b]
self.pdif_c = [c, d]
def hit_rate_calc(self):
self.hit_rate = min(max(75 + floor((self.acc - self.mob_eva) / 2), 20), 95) / 100
def swing(self, w):
x = 0
if random() < self.hit_rate:
if random() > self.crit_rate:
a, b = self.pdif_n[0], self.pdif_n[1]
x = uniform(a, b)
x = uniform(x, x * 1.05)
else:
c, d = self.pdif_c[0], self.pdif_c[1]
x = uniform(c, d)
x = uniform(x, x * 1.05) * (1 + self.crit_dmg)
return x * w
def dmg_calc(self):
self.dmg += floor(fstr(self.str - self.mob_vit, self.wpn_rank))
def acc_calc(self):
self.acc += floor((self.skill - 600) * 0.9) + 540
self.acc += floor(self.dex * 0.75)
if self.vishap_set > 1:
self.acc += (self.vishap_set - 1) * 15
def ddex_calc(self):
self.crit_rate += dex_crit(self.dex - self.mob_agi)
def atk_calc(self):
self.atk += floor(self.str * 0.75) + self.skill + 8
self.smite()
def haste_calc(self):
self.eq_haste = min(self.eq_haste, 256)
self.ma_haste = min(self.ma_haste, 448)
self.ja_haste = min(self.ja_haste, 256)
self.total_haste = self.eq_haste + self.ma_haste + self.ja_haste
self.delay = max(self.delay_cap, self.delay * (1 - self.total_haste / 1024))
def smite(self):
boost = 0
if self.wyvern:
boost += 0.2
if self.chaos:
boost += 544 / 1024
if self.fury:
boost += 0.617
self.atk = floor(self.atk * (1 + 38 / 256 + boost))
def tp_hit_calc(self):
self.tp_hit = floor(self.tp_hit * (1 + self.stp))
def round(self):
hit = 0
damage = 0
if random() < self.qa:
hit += 3
elif random() < self.ta:
hit += 2
elif random() < self.da:
hit += 1
temp = self.swing(self.dmg)
if temp > 0:
self.tp += self.tp_hit
if self.triple_proc and random() < self.triple_rate:
damage += temp * 3
else:
damage += temp
for i in range(hit):
temp = self.swing(self.dmg)
if temp > 0:
self.tp += self.tp_hit
if self.triple_proc and random() < self.triple_rate:
damage += temp * 3
else:
damage += temp
return damage
def stardiver(self):
hold_crit = self.crit_rate
self.crit_rate = 0
wsc = floor(self.str * 0.85) + floor(self.dex * 0.1)
weapon_skill_d = self.dmg + wsc
ws_tp = min(self.tp + self.tp_bonus, 3000)
if ws_tp < 2000:
ftp = 217 / 256 * self.fotia + 0.75 * (1 - self.fotia) + 0.5 * (ws_tp - 1000) / 1000
elif ws_tp < 3000:
ftp = 345 / 256 * self.fotia + 1.25 * (1 - self.fotia) + 0.5 * (ws_tp - 2000) / 1000
else:
ftp = 473 / 256 * self.fotia + 1.75 * (1 - self.fotia)
damage = 0
self.tp = 0
hit = 3
if random() < self.qa:
hit += 3
elif random() < self.ta:
hit += 2
elif random() < self.da:
hit += 1
if random() < self.qa:
hit += 3
elif random() < self.ta:
hit += 2
elif random() < self.da:
hit += 1
temp = self.swing(weapon_skill_d * ftp * (1 + self.wsd))
if temp > 0:
self.tp += self.tp_hit
damage += temp
for i in range(min(7, hit)):
temp = self.swing(weapon_skill_d * ftp)
if temp > 0:
self.tp += floor(10 * (1 + self.stp))
damage += temp
self.crit_rate = hold_crit
return damage
def camlann(self):
hold_crit = self.crit_rate
self.crit_rate = 0
wsc = floor(self.str * 0.6) + floor(self.vit * 0.6) + floor(self.dex * 0.1)
weapon_skill_d = self.dmg + wsc
ws_tp = min(self.tp + self.tp_bonus, 3000)
ftp = 793 / 256 * self.fotia + 3 * (1 - self.fotia)
damage = 0
self.tp = 0
hit = 0
if random() < self.qa:
hit += 3
elif random() < self.ta:
hit += 2
elif random() < self.da:
hit += 1
temp = self.swing(weapon_skill_d * ftp * (1 + self.wsd))
if temp > 0:
self.tp += self.tp_hit
damage += temp
for i in range(hit):
temp = self.swing(weapon_skill_d)
if temp > 0:
self.tp += floor(10 * (1 + self.stp))
damage += temp
return damage
gearname = dict()
#Weapons
gearname['weapon'] = []
def habile_mazrak(job):
job.dmg += 300
job.wpn_rank = floor(300 / 9)
job.delay += 492
job.delay_cap = 492 * 0.2
job.acc += 36
job.atk += 34
job.skill += 242
job.stp += 0.08
job.crit_rate += 0.05
job.tp_hit = 137
gearname['weapon'].append('habile_mazrak')
def trishula(job):
job.dmg += 345
job.wpn_rank = floor(345 / 9)
job.delay += 492
job.delay_cap = 492 * 0.2
job.skill += 269
job.stp += 0.1
job.tp_bonus += 500
job.tp_hit = 137
gearname['weapon'].append('trishula')
def rhongomiant(job):
job.dmg += 347
job.wpn_rank = floor(347 / 9)
job.delay += 492
job.delay_cap = 492 * 0.2
job.vit += 50
job.skill += 269
job.tp_hit = 137
job.triple_proc = True
job.triple_rate = 0.5
gearname['weapon'].append('rhongomiant')
gearname['weapon'].append('')
gearname['weapon'].sort()
#Utu Grip Only
gearname['grip'] = []
def utu_grip(job):
job.acc += 30
job.atk += 30
gearname['grip'].append('utu_grip')
gearname['grip'].append('')
gearname['grip'].sort()
#Ammo
gearname['ammo'] = []
def floestone(job):
job.str += 3
job.atk += 10
gearname['ammo'].append('floestone')
def ginsen(job):
job.acc += 5
job.atk += 10
job.stp += 0.03
gearname['ammo'].append('ginsen')
def knobkierrie(job):
job.atk += 23
job.wsd += 0.06
gearname['ammo'].append('knobkierrie')
gearname['ammo'].append('')
gearname['ammo'].sort()
#Head
gearname['head'] = []
def vishap_armet(job):
job.str += 37
job.dex += 30
job.vit += 35
job.acc += 47
job.atk += 42
job.eq_haste += 71
job.vishap_set += 1
gearname['head'].append('vishap_armet')
def sulevias_mask(job):
job.str += 33
job.dex += 19
job.vit += 40
job.acc += 44
job.atk += 48
job.eq_haste += 30
job.stp += 0.1
gearname['head'].append('sulevias_mask')
def flam_zucchetto(job):
job.str += 32
job.dex += 28
job.vit += 24
job.acc += 38
job.eq_haste += 40
job.ta += 0.04
job.stp += 0.05
gearname['head'].append('flam_zucchetto')
gearname['head'].append('')
gearname['head'].sort()
#Neck
gearname['neck'] = []
def ganeshas_mala(job):
job.vit += 4
job.qa += 0.02
gearname['neck'].append('ganeshas_mala')
def anu_torque(job):
job.atk += 20
job.stp += 0.07
gearname['neck'].append('anu_torque')
def fotia_gorget(job):
job.acc += 10
job.fotia += 1
gearname['neck'].append('fotia_gorget')
gearname['neck'].append('')
gearname['neck'].sort()
#Earrings
gearname['ear'] = []
def moonshade_earring(job):
job.atk += 4
job.tp_bonus += 250
gearname['ear'].append('moonshade_earring')
def brutal_earring(job):
job.da += 0.05
job.stp += 0.01
gearname['ear'].append('brutal_earring')
def sherida_earring(job):
job.str += 5
job.dex += 5
job.da += 0.05
job.stp += 0.05
gearname['ear'].append('sherida_earring')
gearname['ear'].append('')
gearname['ear'].sort()
#Body
gearname['body'] = []
def vishap_mail(job):
job.str += 41
job.dex += 31
job.vit += 41
job.acc += 57
job.atk += 35
job.eq_haste += 30
job.stp += 0.08
job.vishap_set += 1
gearname['body'].append('vishap_mail')
def flamma_korazin(job):
job.str += 39
job.dex += 35
job.vit += 32
job.acc += 40
job.eq_haste += 20
job.stp += 0.08
gearname['body'].append('flamma_korazin')
def dagon_breast(job):
job.str += 40
job.dex += 30
job.vit += 40
job.acc += 45
job.atk += 45
job.eq_haste += 10
job.ta += 0.05
job.crit_rate += 0.04
gearname['body'].append('dagon_breast')
def sulevias_plate(job):
job.str += 41
job.dex += 24
job.vit += 41
job.acc += 46
job.atk += 50
job.eq_haste += 10
gearname['body'].append('sulevias_plate')
gearname['body'].append('')
gearname['body'].sort()
#Hands
gearname['hands'] = []
def vis_fng_gaunt(job):
job.str += 16
job.dex += 40
job.vit += 40
job.acc += 48
job.atk += 35
job.eq_haste += 40
job.vishap_set += 1
gearname['hands'].append('vis_fng_gaunt')
def flam_manopolas(job):
job.str += 19
job.dex += 42
job.vit += 35
job.acc += 37
job.eq_haste += 40
job.stp += 0.05
job.crit_rate += 0.07
gearname['hands'].append('flam_manopolas')
def sulev_gauntlets(job):
job.str += 23
job.dex += 34
job.vit += 45
job.acc += 43
job.atk += 47
job.eq_haste += 30
job.da += 0.06
gearname['hands'].append('sulev_gauntlets')
def pel_vambraces(job):
job.str += 12
job.dex += 36
job.vit += 32
job.acc += 23
job.eq_haste += 40
job.da += 0.05
gearname['hands'].append('pel_vambraces')
gearname['hands'].append('')
gearname['hands'].sort()
#Rings
gearname['ring'] = []
def petrov_ring(job):
job.str += 3
job.dex += 3
job.vit += 3
job.da += 0.01
job.stp += 0.05
gearname['ring'].append('petrov_ring')
def niqmaddu_ring(job):
job.str += 10
job.dex += 10
job.vit += 10
job.qa += 0.03
gearname['ring'].append('niqmaddu_ring')
def regal_ring(job):
job.str += 10
job.dex += 10
job.vit += 10
job.atk += 20
job.vishap_set += 1
gearname['ring'].append('regal_ring')
gearname['ring'].append('')
gearname['ring'].sort()
#Back
gearname['back'] = []
def brigantia_dex_da(job):
job.dex += 20
job.acc += 20
job.atk += 20
job.da += 0.1
gearname['back'].append('brigantia_dex_da')
def brigantia_dex_stp(job):
job.dex += 20
job.acc += 20
job.atk += 20
job.stp += 0.1
gearname['back'].append('brigantia_dex_stp')
def brigantia_str_da(job):
job.str += 20
job.acc += 20
job.atk += 20
job.da += 0.1
gearname['back'].append('brigantia_str_da')
def brigantia_str_stp(job):
job.str += 20
job.acc += 20
job.atk += 20
job.stp += 0.1
gearname['back'].append('brigantia_str_stp')
def brigantia_str_wsd(job):
job.str += 20
job.acc += 20
job.atk += 20
job.wsd += 0.1
gearname['back'].append('brigantia_str_wsd')
gearname['back'].append('')
gearname['back'].sort()
#Waist
gearname['waist'] = []
def ioskeha_belt_HQ(job):
job.acc += 17
job.eq_haste += 81
job.da += 0.09
gearname['waist'].append('ioskeha_belt_HQ')
def fotia_belt(job):
job.acc += 10
job.fotia += 1
gearname['waist'].append('fotia_belt')
gearname['waist'].append('')
gearname['waist'].sort()
#Legs
gearname['legs'] = []
def vishap_brais(job):
job.str += 43
job.dex += 20
job.vit += 29
job.acc += 49
job.eq_haste += 51
job.wsd += 0.1
job.vishap_set += 1
gearname['legs'].append('vishap_brais')
def flamma_dirs(job):
job.str += 49
job.dex += 7
job.vit += 29
job.acc += 39
job.eq_haste += 40
job.stp += 0.07
gearname['legs'].append('flamma_dirs')
def sulev_cuisses(job):
job.str += 47
job.vit += 33
job.acc += 45
job.atk += 49
job.eq_haste += 20
job.ta += 0.04
gearname['legs'].append('sulev_cuisses')
gearname['legs'].append('')
gearname['legs'].sort()
#Feet
gearname['feet'] = []
def vishap_greaves(job):
job.str += 30
job.dex += 27
job.vit += 25
job.acc += 46
job.atk += 30
job.eq_haste += 30
job.vishap_set += 1
gearname['feet'].append('vishap_greaves')
def flam_gambieras(job):
job.str += 27
job.dex += 30
job.vit += 20
job.acc += 36
job.eq_haste += 20
job.da += 0.05
job.stp += 0.05
gearname['feet'].append('flam_gambieras')
def sulev_leggings(job):
job.str += 29
job.dex += 19
job.vit += 29
job.acc += 42
job.atk += 46
job.eq_haste += 10
job.wsd += 0.07
gearname['feet'].append('sulev_leggings')
gearname['feet'].append('')
gearname['feet'].sort()
#Food
food = []
def riverfin_soup(job):
job.acc += 90
job.atk += 80
food.append('riverfin_soup')
food.append('')
food.sort()
#Songs
songs = []
songs.append('')
def sword_madrigal(job):
job.acc += 45 + 5
songs.append('sword_madrigal')
def blade_madrigal(job):
job.acc += 60 + 5
songs.append('blade_madrigal')
def minuet_1(job):
job.atk += 32 + 20 + 5
songs.append('minuet_1')
def minuet_2(job):
job.atk += 64 + 20 + 5
songs.append('minuet_2')
def minuet_3(job):
job.atk += 96 + 20 + 5
songs.append('minuet_3')
def minuet_4(job):
job.atk += 112 + 20 + 5
songs.append('minuet_4')
def minuet_5(job):
job.atk += 124 + 20 + 5
songs.append('minuet_5')
def advancing_march(job):
job.ma_haste += 108
songs.append('advancing_march')
def victory_march(job):
job.ma_haste += 163
songs.append('victory_march')
def honor_march(job):
job.ma_haste += 126
job.acc += 42
job.atk += 168
songs.append('honor_march')
#Rolls
rolls = []
def chaos_roll(job):
job.chaos = True
rolls.append('chaos_roll')
def fighters_roll(job):
job.da += 0.22
rolls.append('fighters_roll')
def rogues_roll(job):
job.crit_rate += 0.22
rolls.append('rogues_roll')
def samurai_roll(job):
job.stp += 0.68
rolls.append('samurai_roll')
rolls.append('')
rolls.sort()
#Haste
haste_buffs = []
def haste_1(job):
job.ma_haste += 150
haste_buffs.append('haste_1')
def haste_2(job):
job.ma_haste += 307
haste_buffs.append('haste_2')
def geo_haste(job):
job.ma_haste += 418
haste_buffs.append('geo_haste')
haste_buffs.append('')
haste_buffs.sort()
#Dias
dias = []
def dia_2(job):
job.def_down += (26 / 256)
dias.append('dia_2')
def dia_3(job):
job.def_down += (39 / 256)
dias.append('dia_3')
dias.append('')
dias.sort()
#Defense Down
defense_down = []
def frailty(job):
job.def_down += 0.418
defense_down.append('frailty')
defense_down.append('')
defense_down.sort()
def buff(job):
for b in buffs_end:
exec(b.get() + "(job)")
#Mobs
mob_list = []
def apex_crab(job):
job.mob_def = 1310
job.mob_eva = 1163
job.mob_vit = 300
job.mob_agi = 275
mob_list.append('apex_crab')
mob_list.append('')
mob_list.sort()
def tp_set(job):
for t in TPgear:
exec(t.get() + "(job)")
exec(mob.get() + "(job)")
buff(job)
job.dmg_calc()
job.ddex_calc()
job.acc_calc()
job.atk_calc()
job.haste_calc()
job.pdif_calc()
job.hit_rate_calc()
job.tp_hit_calc()
def ws_set(job):
for w in WSgear:
exec(w.get() + "(job)")
exec(mob.get() + "(job)")
buff(job)
job.dmg_calc()
job.ddex_calc()
job.acc_calc()
job.atk_calc()
job.haste_calc()
job.pdif_calc()
job.hit_rate_calc()
job.tp_hit_calc()
def de_equip(job):
job.unequip()
def statistics_tp(weapon, wsboolean, tplimit):
k = 10000
casey = Dragoon()
exec(weapon + "(casey)")
tp_set(casey)
return casey
def statistics_ws(weapon, wsboolean, tplimit):
k = 10000
casey = Dragoon()
exec(weapon + "(casey)")
ws_set(casey)
return casey
def sim_1(weapon, wsboolean, tplimit):
k = 10000
casey = Dragoon()
exec(weapon + "(casey)")
tp_set(casey)
temps = 0
x = 0
y = 0
z = 0
ws_count = 0
for i in range(k):
x += casey.round()
if casey.tp >= 1000 and wsboolean:
de_equip(casey)
exec(weapon + "(casey)")
ws_set(casey)
y = eval("casey." + ws_name.get() + "()")
de_equip(casey)
exec(weapon + "(casey)")
tp_set(casey)
x += y
z += y
ws_count += 1
temps += 2
temps += casey.delay / 60
dps = x / temps
if wsboolean:
print(weapon, dps, " (WS : ", z / ws_count, ")")
else:
print(weapon, dps)
def main():
print(ws_name.get())
wsboolean = True
tplimit = 1000
dps_1 = sim_1(weapon.get(), wsboolean, tplimit)
#GUI
SIZED = "200x250"
root = tk.Tk()
root.geometry(SIZED)
root.title("DRG")
weapon, grip, ammo = tk.StringVar(root), tk.StringVar(root), tk.StringVar(root)
head, neck, ear1, ear2 = tk.StringVar(root), tk.StringVar(root), tk.StringVar(root), tk.StringVar(root)
body, hands, ring1, ring2 = tk.StringVar(root), tk.StringVar(root), tk.StringVar(root), tk.StringVar(root)
back, waist, legs, feet = tk.StringVar(root), tk.StringVar(root), tk.StringVar(root), tk.StringVar(root)
weapon_WS, grip_WS, ammo_WS = tk.StringVar(root), tk.StringVar(root), tk.StringVar(root)
head_WS, neck_WS, ear1_WS, ear2_WS = tk.StringVar(root), tk.StringVar(root), tk.StringVar(root), tk.StringVar(root)
body_WS, hands_WS, ring1_WS, ring2_WS = tk.StringVar(root), tk.StringVar(root), tk.StringVar(root), tk.StringVar(root)
back_WS, waist_WS, legs_WS, feet_WS = tk.StringVar(root), tk.StringVar(root), tk.StringVar(root), tk.StringVar(root)
mob, debuff_1, debuff_2 = tk.StringVar(root), tk.StringVar(root), tk.StringVar(root)
song_1, song_2, song_3, song_4 = tk.StringVar(root), tk.StringVar(root), tk.StringVar(root), tk.StringVar(root)
haste_buff = tk.StringVar(root)
roll_1, roll_2 = tk.StringVar(root), tk.StringVar(root)
food_choice = tk.StringVar(root)
ws_name = tk.StringVar(root)
#Default TP
weapon.set(gearname['weapon'][3]), grip.set(gearname['grip'][1]), ammo.set(gearname['ammo'][1])
head.set(gearname['head'][1]), neck.set(gearname['neck'][1]), ear1.set(gearname['ear'][1]), ear2.set(gearname['ear'][3])
body.set(gearname['body'][1]), hands.set(gearname['hands'][1]), ring1.set(gearname['ring'][1]), ring2.set(gearname['ring'][2])
back.set(gearname['back'][1]), waist.set(gearname['waist'][2]), legs.set(gearname['legs'][1]), feet.set(gearname['feet'][1])
#Default WS
weapon_WS.set(gearname['weapon'][3]), grip_WS.set(gearname['grip'][1]), ammo_WS.set(gearname['ammo'][2])
head_WS.set(gearname['head'][1]), neck_WS.set(gearname['neck'][2]), ear1_WS.set(gearname['ear'][2]), ear2_WS.set(gearname['ear'][3])
body_WS.set(gearname['body'][1]), hands_WS.set(gearname['hands'][1]), ring1_WS.set(gearname['ring'][1]), ring2_WS.set(gearname['ring'][3])
back_WS.set(gearname['back'][3]), waist_WS.set(gearname['waist'][1]), legs_WS.set(gearname['legs'][1]), feet_WS.set(gearname['feet'][1])
mob.set(mob_list[1])
debuff_1.set(dias[1]), debuff_2.set(defense_down[1])
song_1.set(songs[0]), song_2.set(songs[0]), song_3.set(songs[0]), song_4.set(songs[0])
roll_1.set(rolls[0]), roll_2.set(rolls[0]), haste_buff.set(haste_buffs[0])
food_choice.set(food[0])
ws_name.set('stardiver')
def button_1():
def go_back():
fin_1.destroy()
root.deiconify()
root.withdraw()
fin_1 = tk.Toplevel(root)
fin_1.geometry("700x300")
label_example = tk.Label(fin_1, text="TP Set")
label_example.grid(row=0, column=0)
btn_back = tk.Button(fin_1, text="Back", command=go_back, bg="#FF0000")
btn_back.grid(row=0, column=1)
#Weapon
choices = gearname['weapon']
popup_menu = tk.OptionMenu(fin_1, weapon, *choices)
tk.Label(fin_1, text = "Weapon").grid(row = 1, column = 0)
popup_menu.grid(row = 2, column = 0)
#Grip
choices = gearname['grip']
popup_menu = tk.OptionMenu(fin_1, grip, *choices)
tk.Label(fin_1, text = "Grip").grid(row = 1, column = 1)
popup_menu.grid(row = 2, column = 1)
#ammo
choices = gearname['ammo']
popup_menu = tk.OptionMenu(fin_1, ammo, *choices)
tk.Label(fin_1, text = "Ammo").grid(row = 1, column = 3)
popup_menu.grid(row = 2, column = 3)
#head
choices = gearname['head']
popup_menu = tk.OptionMenu(fin_1, head, *choices)
tk.Label(fin_1, text = "Head").grid(row = 3, column = 0)
popup_menu.grid(row = 4, column = 0)
#neck
choices = gearname['neck']
popup_menu = tk.OptionMenu(fin_1, neck, *choices)
tk.Label(fin_1, text = "Neck").grid(row = 3, column = 1)
popup_menu.grid(row = 4, column = 1)
#ear1
choices = gearname['ear']
popup_menu = tk.OptionMenu(fin_1, ear1, *choices)
tk.Label(fin_1, text = "Ear 1").grid(row = 3, column = 2)
popup_menu.grid(row = 4, column = 2)
#ear2
choices = gearname['ear']
popup_menu = tk.OptionMenu(fin_1, ear2, *choices)
tk.Label(fin_1, text = "Ear 2").grid(row = 3, column = 3)
popup_menu.grid(row = 4, column = 3)
#body
choices = gearname['body']
popup_menu = tk.OptionMenu(fin_1, body, *choices)
tk.Label(fin_1, text = "Body").grid(row = 5, column = 0)
popup_menu.grid(row = 6, column = 0)
#hands
choices = gearname['hands']
popup_menu = tk.OptionMenu(fin_1, hands, *choices)
tk.Label(fin_1, text = "Hands").grid(row = 5, column = 1)
popup_menu.grid(row = 6, column = 1)
#ring1
choices = gearname['ring']
popup_menu = tk.OptionMenu(fin_1, ring1, *choices)
tk.Label(fin_1, text = "Ring 1").grid(row = 5, column = 2)
popup_menu.grid(row = 6, column = 2)
#ring2
choices = gearname['ring']
popup_menu = tk.OptionMenu(fin_1, ring2, *choices)
tk.Label(fin_1, text = "Ring 2").grid(row = 5, column = 3)
popup_menu.grid(row = 6, column = 3)
#back
choices = gearname['back']
popup_menu = tk.OptionMenu(fin_1, back, *choices)
tk.Label(fin_1, text = "Back").grid(row = 7, column = 0)
popup_menu.grid(row = 8, column = 0)
#waist
choices = gearname['waist']
popup_menu = tk.OptionMenu(fin_1, waist, *choices)
tk.Label(fin_1, text = "Waist").grid(row = 7, column = 1)
popup_menu.grid(row = 8, column = 1)
#legs
choices = gearname['legs']
popup_menu = tk.OptionMenu(fin_1, legs, *choices)
tk.Label(fin_1, text = "Legs").grid(row = 7, column = 2)
popup_menu.grid(row = 8, column = 2)
#feet
choices = gearname['feet']
popup_menu = tk.OptionMenu(fin_1, feet, *choices)
tk.Label(fin_1, text = "Feet").grid(row = 7, column = 3)
popup_menu.grid(row = 8, column = 3)
def button_2():
def go_back():
fin_1.destroy()
root.deiconify()
root.withdraw()
fin_1 = tk.Toplevel(root)
fin_1.geometry("700x300")
label_example = tk.Label(fin_1, text = "WS Set")
label_example.grid(row = 0, column = 0)
btn_back = tk.Button(fin_1, text = "Back", command = go_back, bg = "#FF0000")
btn_back.grid(row = 0, column = 1)
#Weapon
choices = gearname['weapon']
popup_menu = tk.OptionMenu(fin_1, weapon_WS, *choices)
tk.Label(fin_1, text = "Weapon").grid(row = 1, column = 0)
popup_menu.grid(row = 2, column = 0)
#Grip
choices = gearname['grip']
popup_menu = tk.OptionMenu(fin_1, grip_WS, *choices)
tk.Label(fin_1, text = "Grip").grid(row = 1, column = 1)
popup_menu.grid(row = 2, column = 1)
#ammo
choices = gearname['ammo']
popup_menu = tk.OptionMenu(fin_1, ammo_WS, *choices)
tk.Label(fin_1, text = "Ammo").grid(row = 1, column = 3)
popup_menu.grid(row = 2, column = 3)
#head
choices = gearname['head']
popup_menu = tk.OptionMenu(fin_1, head_WS, *choices)
tk.Label(fin_1, text = "Head").grid(row = 3, column = 0)
popup_menu.grid(row = 4, column = 0)
#neck
choices = gearname['neck']
popup_menu = tk.OptionMenu(fin_1, neck_WS, *choices)
tk.Label(fin_1, text = "Neck").grid(row = 3, column = 1)
popup_menu.grid(row = 4, column = 1)
#ear1
choices = gearname['ear']
popup_menu = tk.OptionMenu(fin_1, ear1_WS, *choices)
tk.Label(fin_1, text = "Ear 1").grid(row = 3, column = 2)
popup_menu.grid(row = 4, column = 2)
#ear2
choices = gearname['ear']
popup_menu = tk.OptionMenu(fin_1, ear2_WS, *choices)
tk.Label(fin_1, text = "Ear 2").grid(row = 3, column = 3)
popup_menu.grid(row = 4, column = 3)
#body
choices = gearname['body']
popup_menu = tk.OptionMenu(fin_1, body_WS, *choices)
tk.Label(fin_1, text = "Body").grid(row = 5, column = 0)
popup_menu.grid(row = 6, column = 0)
#hands
choices = gearname['hands']
popup_menu = tk.OptionMenu(fin_1, hands_WS, *choices)
tk.Label(fin_1, text = "Hands").grid(row = 5, column = 1)
popup_menu.grid(row = 6, column = 1)
#ring1
choices = gearname['ring']
popup_menu = tk.OptionMenu(fin_1, ring1_WS, *choices)
tk.Label(fin_1, text = "Ring 1").grid(row = 5, column = 2)
popup_menu.grid(row = 6, column = 2)
#ring2
choices = gearname['ring']
popup_menu = tk.OptionMenu(fin_1, ring2_WS, *choices)
tk.Label(fin_1, text = "Ring 2").grid(row = 5, column = 3)
popup_menu.grid(row = 6, column = 3)
#back
choices = gearname['back']
popup_menu = tk.OptionMenu(fin_1, back_WS, *choices)
tk.Label(fin_1, text = "Back").grid(row = 7, column = 0)
popup_menu.grid(row = 8, column = 0)
#waist
choices = gearname['waist']
popup_menu = tk.OptionMenu(fin_1, waist_WS, *choices)
tk.Label(fin_1, text = "Waist").grid(row = 7, column = 1)
popup_menu.grid(row = 8, column = 1)
#legs
choices = gearname['legs']
popup_menu = tk.OptionMenu(fin_1, legs_WS, *choices)
tk.Label(fin_1, text = "Legs").grid(row = 7, column = 2)
popup_menu.grid(row = 8, column = 2)
#feet
choices = gearname['feet']
popup_menu = tk.OptionMenu(fin_1, feet_WS, *choices)
tk.Label(fin_1, text = "Feet").grid(row = 7, column = 3)
popup_menu.grid(row = 8, column = 3)
def button_3():
def go_back():
fin_1.destroy()
root.deiconify()
root.withdraw()
fin_1 = tk.Toplevel(root)
fin_1.geometry("400x300")
label_example = tk.Label(fin_1, text = "Mob")
label_example.grid(row = 0, column = 0)
btn_back = tk.Button(fin_1, text = "Back", command = go_back, bg = "#FF0000")
btn_back.grid(row = 0, column = 1)
#mob
choices = mob_list
popup_menu = tk.OptionMenu(fin_1, mob, *choices)
tk.Label(fin_1, text = "Mob").grid(row = 1, column = 0)
popup_menu.grid(row = 2, column = 0)
#debuff 1
choices = dias
popup_menu = tk.OptionMenu(fin_1, debuff_1, *choices)
tk.Label(fin_1, text = "Dia").grid(row = 1, column = 1)
popup_menu.grid(row = 2, column = 1)
#debuff 2
choices = defense_down
popup_menu = tk.OptionMenu(fin_1, debuff_2, *choices)
tk.Label(fin_1, text = "Defense Down").grid(row = 1, column = 2)
popup_menu.grid(row = 2, column = 2)
def button_4():
def go_back():
fin_1.destroy()
root.deiconify()
root.withdraw()
fin_1 = tk.Toplevel(root)
fin_1.geometry("700x300")
label_example = tk.Label(fin_1, text = "Buffs")
label_example.grid(row = 0, column = 0)
btn_back = tk.Button(fin_1, text = "Back", command = go_back, bg = "#FF0000")
btn_back.grid(row = 0, column = 1)
#song 1
choices = songs
popup_menu = tk.OptionMenu(fin_1, song_1, *choices)
tk.Label(fin_1, text = "Song 1").grid(row = 1, column = 0)
popup_menu.grid(row = 2, column = 0)
#song 2
choices = songs
popup_menu = tk.OptionMenu(fin_1, song_2, *choices)
tk.Label(fin_1, text = "Song 2").grid(row = 1, column = 1)
popup_menu.grid(row = 2, column = 1)
#song 3
choices = songs
popup_menu = tk.OptionMenu(fin_1, song_3, *choices)
tk.Label(fin_1, text = "Song 3").grid(row = 1, column = 2)
popup_menu.grid(row = 2, column = 2)
#song 4
choices = songs
popup_menu = tk.OptionMenu(fin_1, song_4, *choices)
tk.Label(fin_1, text = "Song 4").grid(row = 1, column = 3)
popup_menu.grid(row = 2, column = 3)
#roll 1
choices = rolls
popup_menu = tk.OptionMenu(fin_1, roll_1, *choices)
tk.Label(fin_1, text = "Roll 1").grid(row = 3, column = 0)
popup_menu.grid(row = 4, column = 0)
#roll 2
choices = rolls
popup_menu = tk.OptionMenu(fin_1, roll_2, *choices)
tk.Label(fin_1, text = "Roll 2").grid(row = 3, column = 1)
popup_menu.grid(row = 4, column = 1)
#haste spells
choices = haste_buffs
popup_menu = tk.OptionMenu(fin_1, haste_buff, *choices)
tk.Label(fin_1, text = "Haste Buffs").grid(row = 5, column = 0)
popup_menu.grid(row = 6, column = 0)
#food
choices = food
popup_menu = tk.OptionMenu(fin_1, food_choice, *choices)
tk.Label(fin_1, text = "Food").grid(row = 7, column = 0)
popup_menu.grid(row = 8, column = 0)
def button_5():
def go_back():
fin_1.destroy()
root.deiconify()
def post_tp_stats():
global buffs_end, WSgear, TPgear, mob
buffs_end = [song_1, song_2, song_3, song_4, roll_1, roll_2, haste_buff, debuff_1, debuff_2, food_choice]
TPgear = [grip, ammo, head, neck, ear1, ear2, body, hands, ring1, ring2, back, waist, legs, feet]
WSgear = [grip_WS, ammo_WS, head_WS, neck_WS, ear1_WS, ear2_WS, body_WS, hands_WS, ring1_WS, ring2_WS, back_WS, waist_WS, legs_WS, feet_WS]
wsboolean = True
tplimit = 1000
drg = statistics_tp(weapon.get(), wsboolean, tplimit)
label = tk.Label(fin_1, text = "Accuracy")
label.grid(row = 1, column = 0)
value = tk.Label(fin_1, text = str(drg.acc))
value.grid(row = 1, column = 1)
label = tk.Label(fin_1, text = "Hit Rate")
label.grid(row = 1, column = 2)
value = tk.Label(fin_1, text = str(drg.hit_rate))
value.grid(row = 1, column = 3)
label = tk.Label(fin_1, text = "Attack")
label.grid(row = 1, column = 4)
value = tk.Label(fin_1, text = str(drg.atk))
value.grid(row = 1, column = 5)
label = tk.Label(fin_1, text = "Total Haste")
label.grid(row = 2, column = 0)
value = tk.Label(fin_1, text = str(drg.total_haste))
value.grid(row = 2, column = 1)
def post_ws_stats():
global buffs_end, WSgear, TPgear, mob
buffs_end = [song_1, song_2, song_3, song_4, roll_1, roll_2, haste_buff, debuff_1, debuff_2, food_choice]
TPgear = [grip, ammo, head, neck, ear1, ear2, body, hands, ring1, ring2, back, waist, legs, feet]
WSgear = [grip_WS, ammo_WS, head_WS, neck_WS, ear1_WS, ear2_WS, body_WS, hands_WS, ring1_WS, ring2_WS, back_WS, waist_WS, legs_WS, feet_WS]
wsboolean = True
tplimit = 1000
drg = statistics_ws(weapon.get(), wsboolean, tplimit)
label = tk.Label(fin_1, text = "Accuracy")
label.grid(row = 1, column = 0)
value = tk.Label(fin_1, text = str(drg.acc))
value.grid(row = 1, column = 1)
label = tk.Label(fin_1, text = "Hit Rate")
label.grid(row = 1, column = 2)
value = tk.Label(fin_1, text = str(drg.hit_rate))
value.grid(row = 1, column = 3)
label = tk.Label(fin_1, text = "Attack")
label.grid(row = 1, column = 4)
value = tk.Label(fin_1, text = str(drg.atk))
value.grid(row = 1, column = 5)
root.withdraw()
fin_1 = tk.Toplevel(root)
fin_1.geometry("300x500")
label_example = tk.Label(fin_1, text = "Statistics")
label_example.grid(row = 0, column = 0)
btn_back = tk.Button(fin_1, text = "Back", command = go_back, bg = "#FF0000")
btn_back.grid(row = 0, column = 1)
melee_stats = tk.Button(fin_1, text = "TP", command = post_tp_stats)
melee_stats.grid(row = 0, column = 3)
melee_stats = tk.Button(fin_1, text = "WS", command = post_ws_stats)
melee_stats.grid(row = 0, column = 4)
def main_2():
global buffs_end, WSgear, TPgear, mob
buffs_end = [song_1, song_2, song_3, song_4, roll_1, roll_2, haste_buff, debuff_1, debuff_2, food_choice]
TPgear = [grip, ammo, head, neck, ear1, ear2, body, hands, ring1, ring2, back, waist, legs, feet]
WSgear = [grip_WS, ammo_WS, head_WS, neck_WS, ear1_WS, ear2_WS, body_WS, hands_WS, ring1_WS, ring2_WS, back_WS, waist_WS, legs_WS, feet_WS]
main()
label_main = tk.Label(root, text = "Choose an item")
label_main.pack()
B1 = tk.Button(root, text = "TP Set", command = button_1)
B1.pack()
B2 = tk.Button(root, text = "WS Set", command = button_2)
B2.pack()
B3 = tk.Button(root, text = "Mob", command = button_3)
B3.pack()
B4 = tk.Button(root, text = "Buffs", command = button_4)
B4.pack()
B5 = tk.Button(root, text = "Stats", command = button_5)
B5.pack()
button_run = tk.Button(root, text = "Run Simulation", command = main_2, bg = "#008000")
button_run.pack()
button_close = tk.Button(root, text = "Exit", command = root.destroy, bg = "#FF0000")
button_close.pack()
root.mainloop()
[+]
Ragnarok.Martel
Server: Ragnarok
Game: FFXI
Posts: 2184
By Ragnarok.Martel 2017-09-23 19:25:09
I have to admit that I have no idea how to use that file. And my limited googling hasn't helped any.
[+]
Siren.Kyte
Server: Siren
Game: FFXI
Posts: 3000
By Siren.Kyte 2017-09-23 19:26:46
I thought I knew how to use it, then I got an error when I hit the run simulation button lol
Ramuh.Austar
Server: Ramuh
Game: FFXI
Posts: 9378
By Ramuh.Austar 2017-09-23 19:26:52
use the exe app from the drop box. you'd need python 3 and tkinter to run it in your own shell
and windows os, probably. idk how macs handle anything
Ramuh.Austar
Server: Ramuh
Game: FFXI
Posts: 9378
By Ramuh.Austar 2017-09-23 19:27:04
I thought I knew how to use it, then I got an error when I hit the run simulation button lol what kind of error?
Siren.Kyte
Server: Siren
Game: FFXI
Posts: 3000
By Siren.Kyte 2017-09-23 19:30:13
Ramuh.Austar
Server: Ramuh
Game: FFXI
Posts: 9378
By Ramuh.Austar 2017-09-23 19:32:06
https://www.dropbox.com/sh/5jngsv029dcpzin/AAAffOUhju970X9aZMJpM8K5a?dl=0
try this link and put them all in the same folder, the .exe will be in the _pyache_ folder
that means somewhere it divided by zero, so guessing mob wasn't selected? this one I had updated to have most things filled in with a default choice so you can't accidentally not have a mob selected
Siren.Kyte
Server: Siren
Game: FFXI
Posts: 3000
By Siren.Kyte 2017-09-23 19:44:25
I think it does have a mob selected by default already
Ramuh.Austar
Server: Ramuh
Game: FFXI
Posts: 9378
By Ramuh.Austar 2017-09-23 19:45:27
it does now, I don't know if the old link did. is it still giving the same error with the new link?
Siren.Kyte
Server: Siren
Game: FFXI
Posts: 3000
By Siren.Kyte 2017-09-23 19:50:53
It is yeah
Ramuh.Austar
Server: Ramuh
Game: FFXI
Posts: 9378
By Ramuh.Austar 2017-09-23 20:02:12
did you change anything or left everything as is from the downloaded files?
Siren.Kyte
Server: Siren
Game: FFXI
Posts: 3000
By Siren.Kyte 2017-09-23 20:11:23
I kept it all the same and within the extracted folder.
Ramuh.Austar
Server: Ramuh
Game: FFXI
Posts: 9378
By Ramuh.Austar 2017-09-23 20:12:11
Where is it saying the errors are on the new one? might be an issue with the compiler, which is why I can run it still
Siren.Kyte
Server: Siren
Game: FFXI
Posts: 3000
By Siren.Kyte 2017-09-23 20:16:03
So pretty much the same.
Hello folks,
So after debating with Drgs on my server, the general rating on the Drg REMAs that they prefer is: Aeonic > Mythic > Relic > Empy.
However, I personally rather like how Rhongomiant appears and look forward to acquiring it. With the ability to hit 3k tp rather quickly with jumps, along with Spirit Link haste, AG should be rather easy to take advantage of on Drg. I know the Empy weapons for War (DA Traits) and Dk (Attack Bonus Traits) are VERY popular, at least on my server, as with max haste the damage output is substantial.
Therefore I ask, what application does Rhon have end game? How does it compete with other Drg REMAs? Can it compete with other Empy jobs? And/or why is it so unpopular?
Thank you,
Senaki.
|
|