|
Rhongomiant Application
Ramuh.Austar
Serveur: Ramuh
Game: FFXI
Posts: 10481
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
Serveur: Leviathan
Game: FFXI
Posts: 860
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.
Ramuh.Austar
Serveur: Ramuh
Game: FFXI
Posts: 10481
By Ramuh.Austar 2017-09-22 18:41:45
yeah but trish doesn't mean you have to waste merit points
Serveur: Sylph
Game: FFXI
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
Serveur: Ramuh
Game: FFXI
Posts: 10481
By Ramuh.Austar 2017-09-22 18:48:22
the first att +40 is for the pet, isn't it?
Serveur: Sylph
Game: FFXI
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
Serveur: 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
Serveur: Ramuh
Game: FFXI
Posts: 10481
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
Serveur: Leviathan
Game: FFXI
Posts: 860
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
Serveur: Ramuh
Game: FFXI
Posts: 10481
By Ramuh.Austar 2017-09-22 20:03:42
google docs doesn't load on my phone
Serveur: Sylph
Game: FFXI
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
Serveur: Leviathan
Game: FFXI
Posts: 860
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
Serveur: Ramuh
Game: FFXI
Posts: 10481
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
Serveur: Ramuh
Game: FFXI
Posts: 10481
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
Serveur: Ragnarok
Game: FFXI
Posts: 2961
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
Serveur: Siren
Game: FFXI
Posts: 3332
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
Serveur: Ramuh
Game: FFXI
Posts: 10481
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
Serveur: Ramuh
Game: FFXI
Posts: 10481
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
Serveur: Siren
Game: FFXI
Posts: 3332
By Siren.Kyte 2017-09-23 19:30:13
Ramuh.Austar
Serveur: Ramuh
Game: FFXI
Posts: 10481
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
Serveur: Siren
Game: FFXI
Posts: 3332
By Siren.Kyte 2017-09-23 19:44:25
I think it does have a mob selected by default already
Ramuh.Austar
Serveur: Ramuh
Game: FFXI
Posts: 10481
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
Serveur: Siren
Game: FFXI
Posts: 3332
By Siren.Kyte 2017-09-23 19:50:53
It is yeah
Ramuh.Austar
Serveur: Ramuh
Game: FFXI
Posts: 10481
By Ramuh.Austar 2017-09-23 20:02:12
did you change anything or left everything as is from the downloaded files?
Siren.Kyte
Serveur: Siren
Game: FFXI
Posts: 3332
By Siren.Kyte 2017-09-23 20:11:23
I kept it all the same and within the extracted folder.
Ramuh.Austar
Serveur: Ramuh
Game: FFXI
Posts: 10481
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
Serveur: Siren
Game: FFXI
Posts: 3332
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.
|
|