Advertisement
k2stealth2

슬레 팔찌/각인 비교코드

Jan 29th, 2024 (edited)
196
0
63 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 27.47 KB | Source Code | 0 0
  1. # -*- coding: utf-8 -*-
  2.  
  3. import numpy as np
  4. import copy
  5.  
  6. '''
  7. 기본 설정 (팔찌 포함) - 여기만 바꿔주세요
  8. '''
  9. # 직각 (처단 or 포식)
  10. class_imprinting = '포식'
  11.  
  12. # 기본스탯 - 팔찌 '포함한'특치신 수치 적어주세요
  13. # 특화
  14. spec = 50
  15. # 치명
  16. cri = 650
  17. # 신속
  18. swi = 1800
  19.  
  20. # 각인
  21. base_imprinting = ['원한3', '기습3', '돌대3', '질증3', '아드1']
  22. # 비교군각인
  23. compare_imprinting = ['원한3', '저받3', '기습3', '질증3', '돌대2']
  24.  
  25. # 세트 (백사멸 고정)
  26. base_set = ['백사멸']
  27.  
  28. # 팔찌 1 - 현재 끼고있는 팔찌
  29. # 특화
  30. bracelet_spec_1 = 0
  31. # 치명
  32. bracelet_cri_1 = 82
  33. # 신속
  34. bracelet_swi_1 = 100
  35.  
  36. # 특옵
  37. bracelet_option_1 = ['']
  38.  
  39. # 팔찌2 - 비교군 팔찌
  40. # 특화
  41. bracelet_spec_2 = 0
  42. # 치명
  43. bracelet_cri_2 = 120
  44. # 신속
  45. bracelet_swi_2 = 100
  46.  
  47. # 특옵
  48. bracelet_option_2 = ['열정상']
  49.  
  50. # 엘릭서 (달인, 회심, 하의추피, 하의치피)
  51. # 둘다 검색하고싶으면 달인/회심을 아예 안적고, 하나만 검색하고 싶으면 적으면됨
  52. # 예: 난 달인밖에 못쓴다 - '달인', '하의치피'
  53. # 예: 난 둘다 있고 상황별로 뭘 써야하는지 알고싶다 - '하의치피'
  54.  
  55. base_elixir = ['회심', '하의추피']
  56.  
  57.  
  58. '''
  59. 스킬비중
  60.  
  61. 처단자:
  62. 스킬계수, 폭주사이클 사용횟수, 비폭주 사용횟수, 적중률, 적중시 백(헤드)확률, 멸화, 홍염여부
  63.  
  64. 포식자:
  65. 스킬계수, 스킬쿨, 적중률, 적중시 백(헤드)확률, 멸화, 홍염여부
  66.  
  67.  
  68. 1사이클 버스트 = 버스트 + 2*윈컷 + 2*서프 + 어슬 + 터닝 + 마엘 + 블댄 + 블리츠
  69. 1사이클 잔재  = 버스트 + 트쉐 + 데센 + 어슬 + 마엘 + 소앱 + 보이드
  70. '''
  71.  
  72. # 처단자 스킬계수
  73. skill_mod_EXEC = {
  74.     '블러드러스트' : np.asarray([1927023+481815, 1, 0, 0.9, 0.8, 10, 0]),
  75.     '브루탈' : np.asarray([1461047*1.45*1.5*1.95, 1, 0, 0.95, 0.95, 10, 10]),
  76.     '볼케이노' : np.asarray([(69559+1111416)*1.75*2.551, 1, 0, 0.9, 0.9, 10, 10]),
  77.     '길로틴' : np.asarray([914163*1.75*1.95, 2, 0, 0.8, 0.75, 10, 10]),
  78.     '퓨클' : np.asarray([(149585*3+299163)*1.6*1.708, 2, 1, 0.8, 0.6, 10, 10]),
  79.     '스피닝' : np.asarray([429779*1.4, 2, 1, 0.9, 0.3, 0, 10]),
  80.     '그스메' : np.asarray([(281191+187485)*1.4, 0, 1, 0.9, 0.3, 0, 10]),
  81.     '스톰프' : np.asarray([296772*2.2, 1.5, 1.5, 0.7, 0.3, 0, 10])}
  82.  
  83.  
  84.  
  85. # 포식자 스킬계수
  86. skill_mod_RAVAGER = {
  87.     '브루탈' : np.asarray([1461047*1.45*1.5*1.95, 40, 0.9, 0.9, 10, 10]),
  88.     '볼케이노' : np.asarray([(69559+1111416)*1.75*2.551, 36, 0.9, 0.9, 10, 10]),
  89.     '길로틴' : np.asarray([914163*1.75*1.95, 19, 0.9, 0.9, 10, 10]),
  90.     '퓨클' : np.asarray([(142516*3+285025)*1.7*1.708, 16, 0.75, 0.75, 10, 10]), #파블-퓨클 정렬을 위해서 파블이랑 쿨/보석 동일하게 설정
  91.     '페이탈' : np.asarray([506640*1.6*1.7*2.2, 22, 0.8, 0.8, 10, 10]),
  92.     '파블' : np.asarray([(154034+107803*2+246545)*1.6*2.196, 16, 0.9, 0.75, 10, 10]),
  93.     '스톰프' : np.asarray([206056*1.72, 12, 0.9, 0.6, 0, 0])}
  94.  
  95. '''
  96. 쿨밀림 가중치 - 포식자 쿨밀림
  97. '''
  98. cycle_delay_RAVAGER = {
  99.     '브루탈' : 0,
  100.     '볼케이노' : 0,
  101.     '길로틴' : 1.5,
  102.     '퓨클' : 1.5,
  103.     '페이탈' : 2,
  104.     '파블' : 1.5,
  105.     '스톰프' : 0.5
  106.     }
  107.  
  108.  
  109. # 처단 딜지분 + 사이클길이
  110. if class_imprinting == '처단':
  111.     skill_percentdmg = dict.fromkeys(skill_mod_EXEC.keys())
  112.     skill_m_percentdmg = dict.fromkeys(skill_mod_EXEC.keys())
  113.     skill_d_percentdmg = dict.fromkeys(skill_mod_EXEC.keys())
  114.     cycle_length = 1
  115.    
  116. # 포식 딜지분
  117. else:
  118.     skill_percentdmg = dict.fromkeys(skill_mod_RAVAGER.keys())
  119.     skill_m_percentdmg = dict.fromkeys(skill_mod_RAVAGER.keys())
  120.     skill_d_percentdmg = dict.fromkeys(skill_mod_RAVAGER.keys())
  121.     cycle_length = (skill_mod_RAVAGER['브루탈'][1]*(1-swi*0.00021471)*0.8*1.85+2)
  122.  
  123. '''
  124. 보석
  125. '''
  126.  
  127. gem_dict = {
  128.     10 : [1.4, 0.8],
  129.     9 : [1.3, 0.82],
  130.     8 : [1.24, 0.84],
  131.     7: [1.21, 0.86],
  132.     0: [1, 1]}
  133.  
  134.  
  135. '''
  136. 각인
  137. '''
  138. #예둔
  139. def blunt_weapon(lvl, base_dmg, critdmg):
  140.     if lvl == 3:
  141.         return base_dmg*0.98, critdmg+0.5
  142.     elif lvl == 2:
  143.         return base_dmg*0.98, critdmg+0.25
  144.     return 0, 0
  145.    
  146. #아드
  147. def adrenaline(lvl, increased_attack, crit):
  148.     if lvl == 3:
  149.         return increased_attack+0.06, crit+0.15
  150.     elif lvl == 2:
  151.         return increased_attack+0.036, crit+0.1
  152.     elif lvl == 1:
  153.         return increased_attack+0.018, crit+0.05
  154.     return 0, 0
  155.  
  156. #돌대
  157. def vanguard(lvl, base_dmg):
  158.     if lvl == 3:
  159.         return base_dmg*1.18
  160.     elif lvl == 2:
  161.         return base_dmg*1.088
  162.     return 0
  163.  
  164. #저받
  165. def cursed_doll(lvl, increased_attack):
  166.     if lvl == 3:
  167.         return increased_attack+0.16
  168.     elif lvl == 2:
  169.         return increased_attack+0.08
  170.     return 0
  171.  
  172. #에포 (1렙고정)
  173. def ether(increased_attack):
  174.     return increased_attack+0.04
  175.  
  176. # 질증
  177. def increased_mass(lvl, ia):
  178.     if lvl == 3:
  179.         return ia+0.18
  180.     if lvl == 2:
  181.         return ia+0.1
  182.     return 0
  183.  
  184. # 원한
  185. def grudge(lvl, dmg):
  186.     if lvl == 3:
  187.         return dmg*1.2
  188.     elif lvl == 2:
  189.         return dmg*1.1
  190.     return 0
  191.  
  192. #정단
  193. def precise_dagger(lvl, crit, critdmg):
  194.     if lvl == 3:
  195.         return crit+0.2, critdmg-0.12
  196.     else:
  197.         return 0, 0
  198.    
  199. # 기대
  200. def back_master(lvl, dmg):
  201.     if lvl == 3:
  202.         return dmg*1.25
  203.     elif lvl == 2:
  204.         return dmg*1.12
  205.     return 0
  206.  
  207. # 결대
  208. def head_master(lvl, dmg):
  209.     if lvl == 3:
  210.         return dmg*1.25
  211.     elif lvl == 2:
  212.         return dmg*1.12
  213.     return 0
  214.  
  215. '''
  216. 셋옵
  217. '''
  218. # 사멸
  219. def entropy(dmg, crit, critdmg, p_dmg, p_crit, p_critdmg):
  220.     return dmg*1.09, crit+0.22, critdmg+0.22, p_dmg*1.26, p_crit+0.22, p_critdmg+0.65
  221.  
  222. # 환각
  223. def hallucination(dmg, crit):
  224.     return dmg*1.32, crit+0.28
  225.  
  226. '''
  227. 엘릭서
  228. '''
  229. # 달인
  230. def elixir_mas(add_dmg, crit):
  231.     return add_dmg+0.017*5, crit+0.07
  232.  
  233. # 회심
  234. def elixir_dec():
  235.     return 1.12
  236.  
  237.  
  238. '''
  239. 팔찌
  240. '''
  241.  
  242. # 열정
  243. def fervor(dmg, p_dmg, level):
  244.     if level == '상':
  245.         return dmg*1.04, p_dmg*1.04
  246.     elif level == '중':
  247.         return dmg*1.035, p_dmg*1.035
  248.     else:
  249.         return dmg*1.03, p_dmg*1.03
  250.  
  251. # 쐐기
  252. def wedge(add_dmg, level):
  253.     if level == '상':
  254.         return add_dmg+0.027142857
  255.     elif level == '중':
  256.         return add_dmg+0.02442857
  257.     else:
  258.         return add_dmg+0.019
  259.  
  260. # 망치
  261. def hammer(bracelet, critdmg, p_critdmg, level):
  262.     bracelet_wedge = ('쐐기하' in bracelet or '쐐기중' in bracelet or '쐐기상' in bracelet)
  263.     if level == '상':
  264.         if bracelet_wedge:
  265.             return critdmg+0.1657143, p_critdmg+0.1657143
  266.         return critdmg+0.12, p_critdmg+0.12
  267.     elif level == '중':
  268.         if bracelet_wedge:
  269.             return critdmg+0.1457143, p_critdmg+0.1457143
  270.         return critdmg+0.1, p_critdmg+0.1
  271.     else:
  272.         if bracelet_wedge:
  273.             return critdmg+0.1257143, p_critdmg+0.1257143
  274.         return critdmg+0.08, p_critdmg+0.08
  275. # 우월
  276. def superiority(dmg, p_dmg, level):
  277.     if level == '상':
  278.         return dmg*1.03, p_dmg*1.03
  279.     elif level == '중':
  280.         return dmg*1.025, p_dmg*1.025
  281.     else:
  282.         return dmg*1.02, p_dmg*1.02
  283.    
  284. # 정밀
  285. def precision(crit, p_crit, level):
  286.     if level == '상':
  287.         return crit+0.05, p_crit+0.05
  288.     elif level == '중':
  289.         return crit+0.04, p_crit+0.04
  290.     else:
  291.         return crit+0.03, p_crit+0.03
  292.  
  293. # 습격
  294. def raid(critdmg, p_critdmg, level):
  295.     if level == '상':
  296.         return critdmg+0.1, p_critdmg+0.1
  297.     elif level == '중':
  298.         return critdmg+0.08, p_critdmg+0.08
  299.     else:
  300.         return critdmg+0.06, p_critdmg+0.06
  301.    
  302. # 기습/결투
  303. def ambush(p_dmg, level):
  304.     if level == '상':
  305.         return p_dmg*1.04
  306.     elif level == '중':
  307.         return p_dmg*1.035
  308.     else:
  309.         return p_dmg*1.03
  310.  
  311. # 보석 및 스킬별 사용횟수 계산
  312. def apply_gem(skill_name, skill_dmg, skill_cd, atk_gem, cd_gem):
  313.     '''
  314.     보석 및 스킬별 사용횟수 계산
  315.     Parameters:
  316.         skill_name = 스킬명
  317.         skill_dmg = 스킬뎀
  318.         skill_cd = 스킬 기본쿨
  319.         atk_gem = 멸화
  320.         cd_gem = 홍염
  321.     Returns:
  322.         skill_dmg = 멸화적용 스킬뎀
  323.         skill_freq = 홍염+쿨밀림 가중치 적용 스킬 사용빈도
  324.     '''
  325.     # 2사이클당 1번 단심 (1+0.85)/2
  326.     conviction = 0.925
  327.    
  328.     if class_imprinting == '포식':
  329.         # 브볼 3사이클당 3번 고정사용 - 쿨밀림 사이클 안으로 통합함
  330.         if skill_name == '브루탈' or skill_name == '볼케이노':
  331.             return skill_dmg*gem_dict[atk_gem][0], 2
  332.         # 길페 1번 단심적용
  333.         if skill_name == '길로틴' or skill_name == '페이탈':
  334.             return skill_dmg*gem_dict[atk_gem][0], cycle_length/(skill_cd*gem_dict[cd_gem][1]*cdr*conviction+cycle_delay_RAVAGER[skill_name])
  335.         # 나머지 단심적용x
  336.         return skill_dmg*gem_dict[atk_gem][0], cycle_length/(skill_cd*gem_dict[cd_gem][1]*cdr+cycle_delay_RAVAGER[skill_name])
  337.     elif class_imprinting == '처단':
  338.         return skill_dmg*gem_dict[atk_gem][0], 1 # 처단은 사이클딜러라 사이클당 사용횟수가 고정, 멸화여부만 적용함
  339.     else:
  340.         return 0, 0
  341.        
  342.  
  343. def equal_point(a, b):
  344.     if a[0] == b[0]:
  345.         return 0
  346.     elif a[0] > b[0]:
  347.         for i in range(a.shape[0]):
  348.             if a[i] < b[i]:
  349.                 return i
  350.         return a.shape[-1]
  351.     else:
  352.         for i in range(a.shape[0]):
  353.             if a[i] > b[i]:
  354.                 return i
  355.         return a.shape[-1]
  356.  
  357. '''
  358. 데미지계산식
  359. '''
  360.  
  361. def calc_damage(dmg, base_adddmg, base_ia, add_crit, base_critdmg, imprinting, bracelet):
  362.     '''
  363.     Parameters:
  364.         dmg = 피증 (곱연산)
  365.         ia = 공증 (합연산)
  366.         crit = 추가치적 (정밀, 파티치적, 약노 등)
  367.         critdmg = 치피증
  368.         imprinting = 각인리스트
  369.         bracelet = 팔찌 특옵
  370.     Returns:
  371.         final_dmg = 최종데미지
  372.         elixir_index = 회심, 달인 변곡점
  373.         best_elixir = 회심 = 1, 달인 = 0
  374.         skill_percentdmg = 노치적 기본스탯 딜지분
  375.     '''
  376.     global cri, swi, cycle_length, cdr, spec
  377.    
  378.     # 쿨감 및 사이클길이 재설정 - 포식자용
  379.     cdr = (1-swi*0.00021471)
  380.     if class_imprinting == '포식':
  381.         cycle_length = (40*0.8*cdr*1.85+2)
  382.         critdmg = base_critdmg+0.4
  383.     else:
  384.         cycle_length = 1
  385.         critdmg = base_critdmg
  386.    
  387.     # 폭주딜증/블러딜증 계산
  388.     enrage_spec = 1+spec/1000*0.1573
  389.     bl_spec = 1+spec/1000*1.7167
  390.    
  391.     final_dmg = np.copy(add_crit) # 마지막 총 딜 arrary 생성
  392.     best_elixir = np.copy(add_crit) # 엘릭서 기준
  393.    
  394.     # 특신목 반영
  395.     if (class_imprinting == '포식') and ('특신목' in imprinting):
  396.         cri = cri-500
  397.         spec = spec+500
  398.        
  399.     base_crit = cri/27.940765577/100 # 기본크리
  400.        
  401.     # 폭주딜증/블러딜증 계산
  402.     enrage_spec = 1+spec/1000*0.1573
  403.     bl_spec = 1+spec/1000*1.7167
  404.    
  405.     ia = base_ia
  406.     add_dmg = base_adddmg
  407.    
  408.     bracelet_temp = copy.deepcopy(bracelet)
  409.    
  410.     # 각인 계산
  411.    
  412.     dmg, add_dmg, ia, set_crit, critdmg, p_dmg, set_pcrit, p_critdmg = calc_imprinting(dmg, add_dmg, ia, 0, critdmg, imprinting, bracelet_temp)
  413.        
  414.     recorded = 0 # 엘릭서 변곡점 기록했으면 1로 바뀜
  415.     elixir_index = add_crit.shape[0] # 엘릭서 변곡점 초기수치 = N
  416.     for i in range(add_crit.shape[0]):
  417.         d_crit, d_pcrit = (base_crit+set_crit+add_crit[i]), (base_crit+set_pcrit+add_crit[i])
  418.         m_adddmg, m_crit = elixir_mas(add_dmg, base_crit+set_crit+add_crit[i]) # 달인 추피보정/크리보정
  419.         m_adddmg, m_pcrit = elixir_mas(add_dmg, base_crit+set_pcrit+add_crit[i]) # 헤드어택 달인 추피보정/크리보정
  420.         m_crit, m_pcrit, d_crit, d_pcrit = min(m_crit, 1), min(m_pcrit, 1), min(d_crit, 1), min(d_pcrit, 1) # 치적 천장=1
  421.        
  422.         mas_dmg = 0
  423.         dec_dmg = 0
  424.        
  425.         # 포식 딜 계산
  426.         if class_imprinting == '포식':
  427.             skill_mod = skill_mod_RAVAGER
  428.             # 폭주치적 반영
  429.             m_crit, m_pcrit, d_crit, d_pcrit = min(m_crit+0.3, 1), min(m_pcrit+0.3, 1), min(d_crit+0.3, 1), min(d_pcrit+0.3, 1) # 치적 천장=1
  430.             for key in skill_mod:
  431.                 skill_dmg = skill_mod[key][0]*enrage_spec # 딜계수*폭주계수 - 포식전용
  432.                 skill_dmg, skill_userate = apply_gem(key, skill_dmg, skill_mod[key][1], skill_mod[key][4], skill_mod[key][5])
  433.                 skill_hitrate = skill_mod[key][2] # 적중빈도
  434.                 skill_prate = skill_mod[key][3] # 헤드/백 빈도
  435.                
  436.                 mas_dmg_skill = skill_userate*skill_hitrate*skill_dmg*m_adddmg*\
  437.                     (skill_prate*calc_damage_helper(p_dmg, ia, m_pcrit, p_critdmg, 1) + (1-skill_prate)*calc_damage_helper(dmg, ia, m_crit, critdmg, 1))
  438.                 skill_m_percentdmg[key] = mas_dmg_skill
  439.                 mas_dmg += mas_dmg_skill
  440.                
  441.                 dec_dmg_skill = skill_userate*skill_hitrate*skill_dmg*add_dmg*\
  442.                     (skill_prate*calc_damage_helper(p_dmg, ia, d_pcrit, p_critdmg, 1.12) + (1-skill_prate)*calc_damage_helper(dmg, ia, d_crit, critdmg, 1.12))
  443.                 skill_d_percentdmg[key] = dec_dmg_skill
  444.                 dec_dmg += dec_dmg_skill
  445.        
  446.         elif class_imprinting == '처단':
  447.             skill_mod = skill_mod_EXEC
  448.             for key in skill_mod:
  449.                 skill_dmg = skill_mod[key][0] # 딜계수
  450.                 skill_dmg, skill_userate = apply_gem(key, skill_dmg, skill_mod[key][1], skill_mod[key][5], skill_mod[key][6])
  451.                
  452.                 skill_use_rage, skill_use_notRage = skill_mod[key][1], skill_mod[key][2] #폭주/비폭주 사용빈도
  453.                
  454.                 skill_hitrate = skill_mod[key][3] # 적중빈도
  455.                 skill_prate = skill_mod[key][4] # 헤드/백 빈도
  456.                                
  457.                 if key == '블러드러스트': # 블러 치적보정+블러특화계수 따로해줘야함
  458.                     mas_dmg_skill = skill_hitrate*skill_dmg*m_adddmg*(\
  459.                         skill_use_rage*enrage_spec*bl_spec*1.25*(skill_prate*calc_damage_helper(p_dmg, ia, min(m_pcrit+0.5, 1), p_critdmg, 1) + (1-skill_prate)*calc_damage_helper(dmg, ia, min(m_crit+0.5, 1), critdmg, 1))+\
  460.                         skill_use_notRage*(skill_prate*calc_damage_helper(p_dmg, ia, m_pcrit, p_critdmg, 1) + (1-skill_prate)*calc_damage_helper(dmg, ia, m_crit, critdmg, 1)))
  461.                     skill_m_percentdmg[key] = mas_dmg_skill
  462.                     mas_dmg += mas_dmg_skill
  463.                    
  464.                     dec_dmg_skill = skill_hitrate*skill_dmg*add_dmg*(\
  465.                         skill_use_rage*enrage_spec*bl_spec*1.25*(skill_prate*calc_damage_helper(p_dmg, ia, min(d_pcrit+0.5, 1), p_critdmg, 1.12) + (1-skill_prate)*calc_damage_helper(dmg, ia, min(d_crit+0.5, 1), critdmg, 1.12))+\
  466.                         skill_use_notRage*(skill_prate*calc_damage_helper(p_dmg, ia, d_pcrit, p_critdmg, 1.12) + (1-skill_prate)*calc_damage_helper(dmg, ia, d_crit, critdmg, 1.12)))
  467.                     skill_d_percentdmg[key] = dec_dmg_skill
  468.                     dec_dmg += dec_dmg_skill
  469.                 else:
  470.                     mas_dmg_skill = skill_hitrate*skill_dmg*m_adddmg*(\
  471.                         skill_use_rage*enrage_spec*1.25*(skill_prate*calc_damage_helper(p_dmg, ia, min(m_pcrit+0.3, 1), p_critdmg, 1) + (1-skill_prate)*calc_damage_helper(dmg, ia, min(m_crit+0.3, 1), critdmg, 1))+\
  472.                         skill_use_notRage*(skill_prate*calc_damage_helper(p_dmg, ia, m_pcrit, p_critdmg, 1) + (1-skill_prate)*calc_damage_helper(dmg, ia, m_crit, critdmg, 1)))
  473.                     skill_m_percentdmg[key] = mas_dmg_skill
  474.                     mas_dmg += mas_dmg_skill
  475.                    
  476.                     dec_dmg_skill = skill_hitrate*skill_dmg*add_dmg*(\
  477.                         skill_use_rage*enrage_spec*1.25*(skill_prate*calc_damage_helper(p_dmg, ia, min(d_pcrit+0.3, 1), p_critdmg, 1.12) + (1-skill_prate)*calc_damage_helper(dmg, ia, min(d_crit+0.3, 1), critdmg, 1.12))+\
  478.                         skill_use_notRage*(skill_prate*calc_damage_helper(p_dmg, ia, d_pcrit, p_critdmg, 1.12) + (1-skill_prate)*calc_damage_helper(dmg, ia, d_crit, critdmg, 1.12)))
  479.                     skill_d_percentdmg[key] = dec_dmg_skill
  480.                     dec_dmg += dec_dmg_skill
  481.                
  482.         else:
  483.             raise ValueError('직각을 포식/처단으로 설정해주세요')
  484.        
  485.         if '달인' in imprinting:
  486.             final_dmg[i] = mas_dmg*100/97
  487.             best_elixir[i] = 0
  488.         elif '회심' in imprinting:
  489.             final_dmg[i] = dec_dmg*100/97
  490.             best_elixir[i] = 1
  491.         else:
  492.             final_dmg[i] = max(mas_dmg, dec_dmg)*100/97 # 각성기+출혈딜 조정 (3%)
  493.             #final_dmg[i] = dec_dmg*100/97 # 우선 회심
  494.             if dec_dmg >= mas_dmg:
  495.                 best_elixir[i] = 1
  496.                 if recorded == 0:
  497.                     elixir_index = i
  498.                     recorded = 1
  499.             else:
  500.                 best_elixir[i] = 0
  501.        
  502.        
  503.         # 노치적시 딜지분
  504.         if i == 0:
  505.             if '회심' in imprinting:
  506.                 for key in skill_d_percentdmg:
  507.                     skill_percentdmg[key] = skill_d_percentdmg[key]/dec_dmg*97/100
  508.             elif '달인' in imprinting:
  509.                 for key in skill_m_percentdmg:
  510.                     skill_percentdmg[key] = skill_m_percentdmg[key]/mas_dmg*97/100
  511.             elif dec_dmg >= mas_dmg:
  512.                 for key in skill_d_percentdmg:
  513.                     skill_percentdmg[key] = skill_d_percentdmg[key]/dec_dmg*97/100
  514.             elif mas_dmg > dec_dmg:
  515.                 for key in skill_m_percentdmg:
  516.                     skill_percentdmg[key] = skill_m_percentdmg[key]/mas_dmg*97/100
  517.        
  518.         skill_percentdmg['기타'] = 0.03
  519.    
  520.     # 특신목 제거 - 순환전에 해야함
  521.     if class_imprinting == '포식' and '특신목' in imprinting:
  522.         cri = cri+500
  523.         spec = spec-500
  524.    
  525.     # 팔찌순환여부 - 순환 제거후 재귀
  526.     if '순환하' in bracelet_temp:
  527.         bracelet_temp.remove('순환하')
  528.         circ_dmg, t1, t2, t3 = calc_damage(1.03, base_adddmg, base_ia, add_crit, base_critdmg, imprinting, bracelet_temp)
  529.         circ_crit, t1, t2, t3 = calc_damage(1, base_adddmg, base_ia, add_crit+0.05, base_critdmg, imprinting, bracelet_temp)
  530.         circ_critdmg, t1, t2, t3 = calc_damage(1, base_adddmg, base_ia, add_crit, base_critdmg+0.08, imprinting, bracelet_temp)
  531.         return (circ_dmg+circ_crit+circ_critdmg)/3, elixir_index, best_elixir, copy.deepcopy(skill_percentdmg)
  532.     elif '순환중' in bracelet_temp:
  533.         bracelet_temp.remove('순환중')
  534.         circ_dmg, t1, t2, t3 = calc_damage(1.035, base_adddmg, base_ia, add_crit, base_critdmg, imprinting, bracelet_temp)
  535.         circ_crit, t1, t2, t3 = calc_damage(1, base_adddmg, base_ia, add_crit+0.06, base_critdmg, imprinting, bracelet_temp)
  536.         circ_critdmg, t1, t2, t3 = calc_damage(1, base_adddmg, base_ia, add_crit, base_critdmg+0.10, imprinting, bracelet_temp)
  537.         return (circ_dmg+circ_crit+circ_critdmg)/3, elixir_index, best_elixir, copy.deepcopy(skill_percentdmg)
  538.     elif '순환상' in bracelet_temp:
  539.         bracelet_temp.remove('순환상')
  540.         circ_dmg, t1, t2, t3 = calc_damage(1.04, base_adddmg, base_ia, add_crit, base_critdmg, imprinting, bracelet_temp)
  541.         circ_crit, t1, t2, t3 = calc_damage(1, base_adddmg, base_ia, add_crit+0.07, base_critdmg, imprinting, bracelet_temp)
  542.         circ_critdmg, t1, t2, t3 = calc_damage(1, base_adddmg, base_ia, add_crit, base_critdmg+0.12, imprinting, bracelet_temp)
  543.         return (circ_dmg+circ_crit+circ_critdmg)/3, elixir_index, best_elixir, copy.deepcopy(skill_percentdmg)
  544.     return final_dmg/cycle_length, elixir_index, best_elixir, copy.deepcopy(skill_percentdmg)
  545.  
  546. # 데미지계산식 헬퍼
  547. def calc_damage_helper(dmg, ia, crit, critdmg, decisive):
  548.     '''
  549.     기본적인 데미지계산식 - 피증*공증*(치적*치피증*회심+(1-치적))
  550.     '''
  551.     return dmg*ia*(crit*critdmg*decisive+(1-crit))
  552.  
  553.  
  554. # 각인 공증/피증/치적/치피증 적용
  555. def calc_imprinting(dmg, add_dmg, ia, crit, critdmg, imprinting, bracelet):
  556.     p_dmg, p_crit, p_critdmg = dmg, np.copy(crit), critdmg # 헤드/백 포지션별 딜/치적/치피증 생성
  557.     for i in range(len(imprinting)):
  558.         name = imprinting[i]
  559.        
  560.         # 셋옵
  561.         if name == '환각':
  562.             dmg, crit = hallucination(dmg, crit)
  563.             p_dmg, p_crit = hallucination(p_dmg, p_crit)
  564.         elif name == '헤드사멸':
  565.             dmg, crit, critdmg, p_dmg, p_crit, p_critdmg = entropy(dmg, crit, critdmg, p_dmg, p_crit, p_critdmg)
  566.             p_dmg = p_dmg*1.2 # 헤드보너스
  567.         elif name == '백사멸':
  568.             dmg, crit, critdmg, p_dmg, p_crit, p_critdmg = entropy(dmg, crit, critdmg, p_dmg, p_crit, p_critdmg)
  569.             p_dmg, p_crit = p_dmg*1.05, p_crit+0.1 # 백보너스
  570.             # 직업이 블레이드일시, 백헤드 자가시너지
  571.             if class_imprinting == '잔재' or class_imprinting == '버스트':
  572.                 dmg = dmg*1.04
  573.                 p_dmg = p_dmg*1.09
  574.         # 각인
  575.         elif name[:2] == '돌대':
  576.             level = int(imprinting[i][-1])
  577.             dmg = vanguard(level, dmg)
  578.             p_dmg = vanguard(level, p_dmg)
  579.         elif name[:2] == '아드':
  580.             level = int(imprinting[i][-1])
  581.             ia, crit = adrenaline(level, ia, crit)
  582.             temp, p_crit = adrenaline(level, ia, p_crit)
  583.         elif name[:2] == '저받':
  584.             level = int(imprinting[i][-1])
  585.             ia = cursed_doll(level, ia)
  586.         elif name[:2] == '질증':
  587.             level = int(imprinting[i][-1])
  588.             ia = increased_mass(level, ia)
  589.         elif name[:2] == '예둔':
  590.             level = int(imprinting[i][-1])
  591.             dmg, critdmg = blunt_weapon(level, dmg, critdmg)
  592.             p_dmg, p_critdmg = blunt_weapon(level, p_dmg, p_critdmg)
  593.         elif name[:2] == '에포':
  594.             level = int(imprinting[i][-1])
  595.             ia = ether(ia)
  596.         elif name[:2] == '정단':
  597.             level = int(imprinting[i][-1])
  598.             crit, critdmg = precise_dagger(level, crit, critdmg)
  599.             p_crit, p_critdmg = precise_dagger(level, p_crit, p_critdmg)
  600.         elif name[:2] == '결대':
  601.             level = int(imprinting[i][-1])
  602.             p_dmg = head_master(level, p_dmg)
  603.         elif name[:2] == '기습':
  604.             level = int(imprinting[i][-1])
  605.             p_dmg = back_master(level, p_dmg)
  606.         elif name[:2] == '원한':
  607.             level = int(imprinting[i][-1])
  608.             dmg = grudge(level, dmg)
  609.             p_dmg = grudge(level, p_dmg)
  610.         # 엘릭서
  611.         elif name == '하의치피':
  612.             critdmg, p_critdmg = critdmg+0.07, p_critdmg+0.07
  613.         elif name == '하의추피':
  614.             add_dmg = add_dmg+0.031
  615.        
  616.     # 팔찌
  617.     for i in range(len(bracelet)):
  618.         name = bracelet[i]
  619.         if name[:2] == '열정':
  620.             level = bracelet[i][-1]
  621.             dmg, p_dmg = fervor(dmg, p_dmg, level)
  622.         elif name[:2] == '망치':
  623.             level = bracelet[i][-1]
  624.             critdmg, p_critdmg = hammer(bracelet, critdmg, p_critdmg, level)
  625.         elif name[:2] == '우월':
  626.             level = bracelet[i][-1]
  627.             dmg, p_dmg = superiority(dmg, p_dmg, level)
  628.         elif name[:2] == '습격'
  629.             level = bracelet[i][-1]
  630.             critdmg, p_critdmg = raid(critdmg, p_critdmg, level)
  631.         elif name[:2] == '결투' or name[:2] == '기습':
  632.             level = bracelet[i][-1]
  633.             p_dmg = ambush(p_dmg, level)
  634.         elif name[:2] == '정밀':
  635.             level = bracelet[i][-1]
  636.             crit, p_crit = precision(crit, p_crit, level)
  637.         elif name[:2] == '쐐기':
  638.             level = bracelet[i][-1]
  639.             add_dmg = wedge(add_dmg, level)
  640.            
  641.     return dmg, add_dmg, ia, crit, critdmg, p_dmg, p_crit, p_critdmg
  642.  
  643. '''
  644. # 계산부분 시작
  645. '''
  646. N = 100
  647. add_crit = np.linspace(0., 0.2, num=N, endpoint=True)
  648.  
  649. add_crit_discrete = np.asarray([0, 0.021, 0.1, 0.121, 0.2, 0.221])
  650. name_crit_discrete = ['치적x', '치적x약노', '치적1', '치적1약노', '치적2', '치적2약노']
  651.  
  652. base_critdmg = 2 # 기본치피증
  653. base_ia = 1.0144 # 기본공증 - 1.44% 투구엘릭서 추가
  654. base_adddmg = 1.42 # 추피 - 무품100+갈망12기준
  655.  
  656.  
  657. # 깡통딜 (팔찌제거) 계산\
  658. if class_imprinting == '처단':
  659.     spec = spec-bracelet_spec_1*1.1
  660.     cri = cri-bracelet_cri_1
  661.     swi = swi-bracelet_swi_1
  662. else:
  663.     swi = swi-bracelet_swi_1*1.1
  664.     cri = cri-bracelet_cri_1
  665.     spec = spec-bracelet_spec_1
  666.  
  667.  
  668. imp_base_nb = base_imprinting+base_set+base_elixir
  669. nobracelet_dmg, t1, t2, t3 = calc_damage(1, base_adddmg, base_ia, add_crit_discrete, base_critdmg, imp_base_nb, '')
  670.  
  671.  
  672. # 팔찌1 포함
  673. if class_imprinting == '처단':
  674.     spec = spec+bracelet_spec_1*1.1
  675.     cri = cri+bracelet_cri_1
  676.     swi = swi+bracelet_swi_1
  677. else:
  678.     swi = swi+bracelet_swi_1*1.1
  679.     cri = cri+bracelet_cri_1
  680.     spec = spec+bracelet_spec_1
  681.  
  682.  
  683.  
  684. imp_br1 = base_imprinting+base_set+base_elixir
  685. br1_dmg, elix_b_b1, t2, br1_percent = calc_damage(1, base_adddmg, base_ia, add_crit_discrete, base_critdmg, imp_br1, bracelet_option_1)
  686. br1_percent_view = [(v, k) for (k, v) in br1_percent.items()]
  687. br1_percent_view.sort(reverse=True)
  688.  
  689. imp_br1_c = compare_imprinting+base_set+base_elixir
  690. br1_c_dmg, elix_c_b1, t2, t3 = calc_damage(1, base_adddmg, base_ia, add_crit_discrete, base_critdmg, imp_br1_c, bracelet_option_1)
  691.  
  692. # 팔찌2 포함
  693. if class_imprinting == '처단':
  694.     spec = spec-(bracelet_spec_1-bracelet_spec_2)*1.1
  695.     cri = cri-bracelet_cri_1+bracelet_cri_2
  696.     swi = swi-bracelet_swi_1+bracelet_swi_2
  697. else:
  698.     swi = swi-(bracelet_swi_1-bracelet_swi_2)*1.1
  699.     cri = cri-bracelet_cri_1+bracelet_cri_2
  700.     spec = spec-bracelet_spec_1+bracelet_spec_2
  701.  
  702.  
  703. imp_br2 = base_imprinting+base_set+base_elixir
  704. br2_dmg, elix_b_b2, t2, t3 = calc_damage(1, base_adddmg, base_ia, add_crit_discrete, base_critdmg, imp_br2, bracelet_option_2)
  705.  
  706. imp_br2_c = compare_imprinting+base_set+base_elixir
  707. br2_c_dmg, elix_c_b2, t2, t3 = calc_damage(1, base_adddmg, base_ia, add_crit_discrete, base_critdmg, imp_br2_c, bracelet_option_2)
  708.  
  709. print('\n')
  710. print('직업각인 : ', class_imprinting)
  711. print('기존각인 : ', base_imprinting)
  712.  
  713. print('\n')
  714. print('딜지분')
  715. print ('-----------')
  716. for v, k in br1_percent_view:
  717.     print ('%s: %.3f' % (k, np.round(v, decimals=3)))
  718.  
  719. print('\n')
  720. if class_imprinting == '처단':
  721.     print('팔찌 1 효율 (%)')
  722.     print('특화:', bracelet_spec_1, '치명:', bracelet_cri_1, '특옵:', bracelet_option_1)
  723. else:
  724.     print('팔찌 1 효율 (%)')
  725.     print('신속:', bracelet_swi_1, '치명:', bracelet_cri_1, '특화:', bracelet_spec_1, '특옵:', bracelet_option_1)
  726. print ('-----------')
  727. print('%-8s%-8s%-8s%-8s%-8s%-8s' % ('치적x', '치적x약노', '치적1', '치적1약노', '치적2', '치적2약노'))
  728. print('%-10s%-11s%-10s%-11s%-10s%-8s' % (np.round((br1_dmg[0]/nobracelet_dmg[0]-1)*100, decimals=3), np.round((br1_dmg[1]/nobracelet_dmg[1]-1)*100, decimals=3), np.round((br1_dmg[2]/nobracelet_dmg[2]-1)*100, decimals=3), np.round((br1_dmg[3]/nobracelet_dmg[3]-1)*100, decimals=3), np.round((br1_dmg[4]/nobracelet_dmg[4]-1)*100, decimals=3), np.round((br1_dmg[5]/nobracelet_dmg[5]-1)*100, decimals=3)))
  729.  
  730. print('\n')
  731. if class_imprinting == '처단':
  732.     print ('팔찌 2 효율 (%)')
  733.     print('특화:', bracelet_spec_2, '치명:', bracelet_cri_2, '특옵:', bracelet_option_2)
  734. else:
  735.     print ('팔찌 2 효율 (%)')
  736.     print('신속:', bracelet_swi_2, '치명:', bracelet_cri_2, '특화:', bracelet_spec_2, '특옵:', bracelet_option_2)
  737. print ('-----------')
  738. print('%-8s%-8s%-8s%-8s%-8s%-8s' % ('치적x', '치적x약노', '치적1', '치적1약노', '치적2', '치적2약노'))
  739. print('%-10s%-11s%-10s%-11s%-10s%-8s' % (np.round((br2_dmg[0]/nobracelet_dmg[0]-1)*100, decimals=3), np.round((br2_dmg[1]/nobracelet_dmg[1]-1)*100, decimals=3), np.round((br2_dmg[2]/nobracelet_dmg[2]-1)*100, decimals=3), np.round((br2_dmg[3]/nobracelet_dmg[3]-1)*100, decimals=3), np.round((br2_dmg[4]/nobracelet_dmg[4]-1)*100, decimals=3), np.round((br2_dmg[5]/nobracelet_dmg[5]-1)*100, decimals=3)))
  740.  
  741.  
  742. print('\n')
  743. print('각인1 : ', base_imprinting)
  744. print('각인2 : ', compare_imprinting)
  745. print('\n')
  746. print('상황별 비교 (기존각인/비교각인 + 팔찌 1/2)')
  747. print ('-----------')
  748. print('%-11s%-8s%-8s%-8s%-8s%-8s%-8s' % ('', '치적x', '치적x약노', '치적1', '치적1약노', '치적2', '치적2약노'))
  749. print('%-9s%-10s%-11s%-10s%-11s%-10s%-11s' % ('각인1+팔1', 0, 0, 0, 0, 0, 0))
  750. print('%-9s%-10s%-11s%-10s%-11s%-10s%-11s' % ('각인1+팔2', np.round((br2_dmg[0]/br1_dmg[0]-1)*100, decimals=3), np.round((br2_dmg[1]/br1_dmg[1]-1)*100, decimals=3), np.round((br2_dmg[2]/br1_dmg[2]-1)*100, decimals=3), np.round((br2_dmg[3]/br1_dmg[3]-1)*100, decimals=3), np.round((br2_dmg[5]/br1_dmg[5]-1)*100, decimals=3), np.round((br2_dmg[5]/br1_dmg[5]-1)*100, decimals=3)))
  751. print('%-9s%-10s%-11s%-10s%-11s%-10s%-11s' % ('각인2+팔1', np.round((br1_c_dmg[0]/br1_dmg[0]-1)*100, decimals=3), np.round((br1_c_dmg[1]/br1_dmg[1]-1)*100, decimals=3), np.round((br1_c_dmg[2]/br1_dmg[2]-1)*100, decimals=3), np.round((br1_c_dmg[3]/br1_dmg[3]-1)*100, decimals=3), np.round((br1_c_dmg[5]/br1_dmg[5]-1)*100, decimals=3), np.round((br1_c_dmg[5]/br1_dmg[5]-1)*100, decimals=3)))
  752. print('%-9s%-10s%-11s%-10s%-11s%-10s%-11s' % ('각인2+팔2', np.round((br2_c_dmg[0]/br1_dmg[0]-1)*100, decimals=3), np.round((br2_c_dmg[1]/br1_dmg[1]-1)*100, decimals=3), np.round((br2_c_dmg[2]/br1_dmg[2]-1)*100, decimals=3), np.round((br2_c_dmg[3]/br1_dmg[3]-1)*100, decimals=3), np.round((br2_c_dmg[5]/br1_dmg[5]-1)*100, decimals=3), np.round((br2_c_dmg[5]/br1_dmg[5]-1)*100, decimals=3)))
  753. print('\n')
  754. print('달인-화심 스왑지점')
  755. if (not '달인' in base_elixir) and (not '회심' in base_elixir):
  756.     print('각인1+팔1  : ', name_crit_discrete[elix_b_b1], '이상일때 회심스왑')
  757.     print('각인1+팔2  : ', name_crit_discrete[elix_b_b2], '이상일때 회심스왑')
  758.     print('각인2+팔1  : ', name_crit_discrete[elix_c_b1], '이상일때 회심스왑')
  759.     print('각인2+팔2  : ', name_crit_discrete[elix_c_b2], '이상일때 회심스왑')
  760.  
  761.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement