Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- import numpy as np
- import copy
- '''
- 기본 설정 (팔찌 포함) - 여기만 바꿔주세요
- '''
- # 직각 (처단 or 포식)
- class_imprinting = '포식'
- # 기본스탯 - 팔찌 '포함한'특치신 수치 적어주세요
- # 특화
- spec = 50
- # 치명
- cri = 650
- # 신속
- swi = 1800
- # 각인
- base_imprinting = ['원한3', '기습3', '돌대3', '질증3', '아드1']
- # 비교군각인
- compare_imprinting = ['원한3', '저받3', '기습3', '질증3', '돌대2']
- # 세트 (백사멸 고정)
- base_set = ['백사멸']
- # 팔찌 1 - 현재 끼고있는 팔찌
- # 특화
- bracelet_spec_1 = 0
- # 치명
- bracelet_cri_1 = 82
- # 신속
- bracelet_swi_1 = 100
- # 특옵
- bracelet_option_1 = ['']
- # 팔찌2 - 비교군 팔찌
- # 특화
- bracelet_spec_2 = 0
- # 치명
- bracelet_cri_2 = 120
- # 신속
- bracelet_swi_2 = 100
- # 특옵
- bracelet_option_2 = ['열정상']
- # 엘릭서 (달인, 회심, 하의추피, 하의치피)
- # 둘다 검색하고싶으면 달인/회심을 아예 안적고, 하나만 검색하고 싶으면 적으면됨
- # 예: 난 달인밖에 못쓴다 - '달인', '하의치피'
- # 예: 난 둘다 있고 상황별로 뭘 써야하는지 알고싶다 - '하의치피'
- base_elixir = ['회심', '하의추피']
- '''
- 스킬비중
- 처단자:
- 스킬계수, 폭주사이클 사용횟수, 비폭주 사용횟수, 적중률, 적중시 백(헤드)확률, 멸화, 홍염여부
- 포식자:
- 스킬계수, 스킬쿨, 적중률, 적중시 백(헤드)확률, 멸화, 홍염여부
- 1사이클 버스트 = 버스트 + 2*윈컷 + 2*서프 + 어슬 + 터닝 + 마엘 + 블댄 + 블리츠
- 1사이클 잔재 = 버스트 + 트쉐 + 데센 + 어슬 + 마엘 + 소앱 + 보이드
- '''
- # 처단자 스킬계수
- skill_mod_EXEC = {
- '블러드러스트' : np.asarray([1927023+481815, 1, 0, 0.9, 0.8, 10, 0]),
- '브루탈' : np.asarray([1461047*1.45*1.5*1.95, 1, 0, 0.95, 0.95, 10, 10]),
- '볼케이노' : np.asarray([(69559+1111416)*1.75*2.551, 1, 0, 0.9, 0.9, 10, 10]),
- '길로틴' : np.asarray([914163*1.75*1.95, 2, 0, 0.8, 0.75, 10, 10]),
- '퓨클' : np.asarray([(149585*3+299163)*1.6*1.708, 2, 1, 0.8, 0.6, 10, 10]),
- '스피닝' : np.asarray([429779*1.4, 2, 1, 0.9, 0.3, 0, 10]),
- '그스메' : np.asarray([(281191+187485)*1.4, 0, 1, 0.9, 0.3, 0, 10]),
- '스톰프' : np.asarray([296772*2.2, 1.5, 1.5, 0.7, 0.3, 0, 10])}
- # 포식자 스킬계수
- skill_mod_RAVAGER = {
- '브루탈' : np.asarray([1461047*1.45*1.5*1.95, 40, 0.9, 0.9, 10, 10]),
- '볼케이노' : np.asarray([(69559+1111416)*1.75*2.551, 36, 0.9, 0.9, 10, 10]),
- '길로틴' : np.asarray([914163*1.75*1.95, 19, 0.9, 0.9, 10, 10]),
- '퓨클' : np.asarray([(142516*3+285025)*1.7*1.708, 16, 0.75, 0.75, 10, 10]), #파블-퓨클 정렬을 위해서 파블이랑 쿨/보석 동일하게 설정
- '페이탈' : np.asarray([506640*1.6*1.7*2.2, 22, 0.8, 0.8, 10, 10]),
- '파블' : np.asarray([(154034+107803*2+246545)*1.6*2.196, 16, 0.9, 0.75, 10, 10]),
- '스톰프' : np.asarray([206056*1.72, 12, 0.9, 0.6, 0, 0])}
- '''
- 쿨밀림 가중치 - 포식자 쿨밀림
- '''
- cycle_delay_RAVAGER = {
- '브루탈' : 0,
- '볼케이노' : 0,
- '길로틴' : 1.5,
- '퓨클' : 1.5,
- '페이탈' : 2,
- '파블' : 1.5,
- '스톰프' : 0.5
- }
- # 처단 딜지분 + 사이클길이
- if class_imprinting == '처단':
- skill_percentdmg = dict.fromkeys(skill_mod_EXEC.keys())
- skill_m_percentdmg = dict.fromkeys(skill_mod_EXEC.keys())
- skill_d_percentdmg = dict.fromkeys(skill_mod_EXEC.keys())
- cycle_length = 1
- # 포식 딜지분
- else:
- skill_percentdmg = dict.fromkeys(skill_mod_RAVAGER.keys())
- skill_m_percentdmg = dict.fromkeys(skill_mod_RAVAGER.keys())
- skill_d_percentdmg = dict.fromkeys(skill_mod_RAVAGER.keys())
- cycle_length = (skill_mod_RAVAGER['브루탈'][1]*(1-swi*0.00021471)*0.8*1.85+2)
- '''
- 보석
- '''
- gem_dict = {
- 10 : [1.4, 0.8],
- 9 : [1.3, 0.82],
- 8 : [1.24, 0.84],
- 7: [1.21, 0.86],
- 0: [1, 1]}
- '''
- 각인
- '''
- #예둔
- def blunt_weapon(lvl, base_dmg, critdmg):
- if lvl == 3:
- return base_dmg*0.98, critdmg+0.5
- elif lvl == 2:
- return base_dmg*0.98, critdmg+0.25
- return 0, 0
- #아드
- def adrenaline(lvl, increased_attack, crit):
- if lvl == 3:
- return increased_attack+0.06, crit+0.15
- elif lvl == 2:
- return increased_attack+0.036, crit+0.1
- elif lvl == 1:
- return increased_attack+0.018, crit+0.05
- return 0, 0
- #돌대
- def vanguard(lvl, base_dmg):
- if lvl == 3:
- return base_dmg*1.18
- elif lvl == 2:
- return base_dmg*1.088
- return 0
- #저받
- def cursed_doll(lvl, increased_attack):
- if lvl == 3:
- return increased_attack+0.16
- elif lvl == 2:
- return increased_attack+0.08
- return 0
- #에포 (1렙고정)
- def ether(increased_attack):
- return increased_attack+0.04
- # 질증
- def increased_mass(lvl, ia):
- if lvl == 3:
- return ia+0.18
- if lvl == 2:
- return ia+0.1
- return 0
- # 원한
- def grudge(lvl, dmg):
- if lvl == 3:
- return dmg*1.2
- elif lvl == 2:
- return dmg*1.1
- return 0
- #정단
- def precise_dagger(lvl, crit, critdmg):
- if lvl == 3:
- return crit+0.2, critdmg-0.12
- else:
- return 0, 0
- # 기대
- def back_master(lvl, dmg):
- if lvl == 3:
- return dmg*1.25
- elif lvl == 2:
- return dmg*1.12
- return 0
- # 결대
- def head_master(lvl, dmg):
- if lvl == 3:
- return dmg*1.25
- elif lvl == 2:
- return dmg*1.12
- return 0
- '''
- 셋옵
- '''
- # 사멸
- def entropy(dmg, crit, critdmg, p_dmg, p_crit, p_critdmg):
- return dmg*1.09, crit+0.22, critdmg+0.22, p_dmg*1.26, p_crit+0.22, p_critdmg+0.65
- # 환각
- def hallucination(dmg, crit):
- return dmg*1.32, crit+0.28
- '''
- 엘릭서
- '''
- # 달인
- def elixir_mas(add_dmg, crit):
- return add_dmg+0.017*5, crit+0.07
- # 회심
- def elixir_dec():
- return 1.12
- '''
- 팔찌
- '''
- # 열정
- def fervor(dmg, p_dmg, level):
- if level == '상':
- return dmg*1.04, p_dmg*1.04
- elif level == '중':
- return dmg*1.035, p_dmg*1.035
- else:
- return dmg*1.03, p_dmg*1.03
- # 쐐기
- def wedge(add_dmg, level):
- if level == '상':
- return add_dmg+0.027142857
- elif level == '중':
- return add_dmg+0.02442857
- else:
- return add_dmg+0.019
- # 망치
- def hammer(bracelet, critdmg, p_critdmg, level):
- bracelet_wedge = ('쐐기하' in bracelet or '쐐기중' in bracelet or '쐐기상' in bracelet)
- if level == '상':
- if bracelet_wedge:
- return critdmg+0.1657143, p_critdmg+0.1657143
- return critdmg+0.12, p_critdmg+0.12
- elif level == '중':
- if bracelet_wedge:
- return critdmg+0.1457143, p_critdmg+0.1457143
- return critdmg+0.1, p_critdmg+0.1
- else:
- if bracelet_wedge:
- return critdmg+0.1257143, p_critdmg+0.1257143
- return critdmg+0.08, p_critdmg+0.08
- # 우월
- def superiority(dmg, p_dmg, level):
- if level == '상':
- return dmg*1.03, p_dmg*1.03
- elif level == '중':
- return dmg*1.025, p_dmg*1.025
- else:
- return dmg*1.02, p_dmg*1.02
- # 정밀
- def precision(crit, p_crit, level):
- if level == '상':
- return crit+0.05, p_crit+0.05
- elif level == '중':
- return crit+0.04, p_crit+0.04
- else:
- return crit+0.03, p_crit+0.03
- # 습격
- def raid(critdmg, p_critdmg, level):
- if level == '상':
- return critdmg+0.1, p_critdmg+0.1
- elif level == '중':
- return critdmg+0.08, p_critdmg+0.08
- else:
- return critdmg+0.06, p_critdmg+0.06
- # 기습/결투
- def ambush(p_dmg, level):
- if level == '상':
- return p_dmg*1.04
- elif level == '중':
- return p_dmg*1.035
- else:
- return p_dmg*1.03
- # 보석 및 스킬별 사용횟수 계산
- def apply_gem(skill_name, skill_dmg, skill_cd, atk_gem, cd_gem):
- '''
- 보석 및 스킬별 사용횟수 계산
- Parameters:
- skill_name = 스킬명
- skill_dmg = 스킬뎀
- skill_cd = 스킬 기본쿨
- atk_gem = 멸화
- cd_gem = 홍염
- Returns:
- skill_dmg = 멸화적용 스킬뎀
- skill_freq = 홍염+쿨밀림 가중치 적용 스킬 사용빈도
- '''
- # 2사이클당 1번 단심 (1+0.85)/2
- conviction = 0.925
- if class_imprinting == '포식':
- # 브볼 3사이클당 3번 고정사용 - 쿨밀림 사이클 안으로 통합함
- if skill_name == '브루탈' or skill_name == '볼케이노':
- return skill_dmg*gem_dict[atk_gem][0], 2
- # 길페 1번 단심적용
- if skill_name == '길로틴' or skill_name == '페이탈':
- return skill_dmg*gem_dict[atk_gem][0], cycle_length/(skill_cd*gem_dict[cd_gem][1]*cdr*conviction+cycle_delay_RAVAGER[skill_name])
- # 나머지 단심적용x
- return skill_dmg*gem_dict[atk_gem][0], cycle_length/(skill_cd*gem_dict[cd_gem][1]*cdr+cycle_delay_RAVAGER[skill_name])
- elif class_imprinting == '처단':
- return skill_dmg*gem_dict[atk_gem][0], 1 # 처단은 사이클딜러라 사이클당 사용횟수가 고정, 멸화여부만 적용함
- else:
- return 0, 0
- def equal_point(a, b):
- if a[0] == b[0]:
- return 0
- elif a[0] > b[0]:
- for i in range(a.shape[0]):
- if a[i] < b[i]:
- return i
- return a.shape[-1]
- else:
- for i in range(a.shape[0]):
- if a[i] > b[i]:
- return i
- return a.shape[-1]
- '''
- 데미지계산식
- '''
- def calc_damage(dmg, base_adddmg, base_ia, add_crit, base_critdmg, imprinting, bracelet):
- '''
- Parameters:
- dmg = 피증 (곱연산)
- ia = 공증 (합연산)
- crit = 추가치적 (정밀, 파티치적, 약노 등)
- critdmg = 치피증
- imprinting = 각인리스트
- bracelet = 팔찌 특옵
- Returns:
- final_dmg = 최종데미지
- elixir_index = 회심, 달인 변곡점
- best_elixir = 회심 = 1, 달인 = 0
- skill_percentdmg = 노치적 기본스탯 딜지분
- '''
- global cri, swi, cycle_length, cdr, spec
- # 쿨감 및 사이클길이 재설정 - 포식자용
- cdr = (1-swi*0.00021471)
- if class_imprinting == '포식':
- cycle_length = (40*0.8*cdr*1.85+2)
- critdmg = base_critdmg+0.4
- else:
- cycle_length = 1
- critdmg = base_critdmg
- # 폭주딜증/블러딜증 계산
- enrage_spec = 1+spec/1000*0.1573
- bl_spec = 1+spec/1000*1.7167
- final_dmg = np.copy(add_crit) # 마지막 총 딜 arrary 생성
- best_elixir = np.copy(add_crit) # 엘릭서 기준
- # 특신목 반영
- if (class_imprinting == '포식') and ('특신목' in imprinting):
- cri = cri-500
- spec = spec+500
- base_crit = cri/27.940765577/100 # 기본크리
- # 폭주딜증/블러딜증 계산
- enrage_spec = 1+spec/1000*0.1573
- bl_spec = 1+spec/1000*1.7167
- ia = base_ia
- add_dmg = base_adddmg
- bracelet_temp = copy.deepcopy(bracelet)
- # 각인 계산
- dmg, add_dmg, ia, set_crit, critdmg, p_dmg, set_pcrit, p_critdmg = calc_imprinting(dmg, add_dmg, ia, 0, critdmg, imprinting, bracelet_temp)
- recorded = 0 # 엘릭서 변곡점 기록했으면 1로 바뀜
- elixir_index = add_crit.shape[0] # 엘릭서 변곡점 초기수치 = N
- for i in range(add_crit.shape[0]):
- d_crit, d_pcrit = (base_crit+set_crit+add_crit[i]), (base_crit+set_pcrit+add_crit[i])
- m_adddmg, m_crit = elixir_mas(add_dmg, base_crit+set_crit+add_crit[i]) # 달인 추피보정/크리보정
- m_adddmg, m_pcrit = elixir_mas(add_dmg, base_crit+set_pcrit+add_crit[i]) # 헤드어택 달인 추피보정/크리보정
- 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
- mas_dmg = 0
- dec_dmg = 0
- # 포식 딜 계산
- if class_imprinting == '포식':
- skill_mod = skill_mod_RAVAGER
- # 폭주치적 반영
- 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
- for key in skill_mod:
- skill_dmg = skill_mod[key][0]*enrage_spec # 딜계수*폭주계수 - 포식전용
- skill_dmg, skill_userate = apply_gem(key, skill_dmg, skill_mod[key][1], skill_mod[key][4], skill_mod[key][5])
- skill_hitrate = skill_mod[key][2] # 적중빈도
- skill_prate = skill_mod[key][3] # 헤드/백 빈도
- mas_dmg_skill = skill_userate*skill_hitrate*skill_dmg*m_adddmg*\
- (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))
- skill_m_percentdmg[key] = mas_dmg_skill
- mas_dmg += mas_dmg_skill
- dec_dmg_skill = skill_userate*skill_hitrate*skill_dmg*add_dmg*\
- (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))
- skill_d_percentdmg[key] = dec_dmg_skill
- dec_dmg += dec_dmg_skill
- elif class_imprinting == '처단':
- skill_mod = skill_mod_EXEC
- for key in skill_mod:
- skill_dmg = skill_mod[key][0] # 딜계수
- skill_dmg, skill_userate = apply_gem(key, skill_dmg, skill_mod[key][1], skill_mod[key][5], skill_mod[key][6])
- skill_use_rage, skill_use_notRage = skill_mod[key][1], skill_mod[key][2] #폭주/비폭주 사용빈도
- skill_hitrate = skill_mod[key][3] # 적중빈도
- skill_prate = skill_mod[key][4] # 헤드/백 빈도
- if key == '블러드러스트': # 블러 치적보정+블러특화계수 따로해줘야함
- mas_dmg_skill = skill_hitrate*skill_dmg*m_adddmg*(\
- 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))+\
- 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)))
- skill_m_percentdmg[key] = mas_dmg_skill
- mas_dmg += mas_dmg_skill
- dec_dmg_skill = skill_hitrate*skill_dmg*add_dmg*(\
- 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))+\
- 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)))
- skill_d_percentdmg[key] = dec_dmg_skill
- dec_dmg += dec_dmg_skill
- else:
- mas_dmg_skill = skill_hitrate*skill_dmg*m_adddmg*(\
- 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))+\
- 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)))
- skill_m_percentdmg[key] = mas_dmg_skill
- mas_dmg += mas_dmg_skill
- dec_dmg_skill = skill_hitrate*skill_dmg*add_dmg*(\
- 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))+\
- 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)))
- skill_d_percentdmg[key] = dec_dmg_skill
- dec_dmg += dec_dmg_skill
- else:
- raise ValueError('직각을 포식/처단으로 설정해주세요')
- if '달인' in imprinting:
- final_dmg[i] = mas_dmg*100/97
- best_elixir[i] = 0
- elif '회심' in imprinting:
- final_dmg[i] = dec_dmg*100/97
- best_elixir[i] = 1
- else:
- final_dmg[i] = max(mas_dmg, dec_dmg)*100/97 # 각성기+출혈딜 조정 (3%)
- #final_dmg[i] = dec_dmg*100/97 # 우선 회심
- if dec_dmg >= mas_dmg:
- best_elixir[i] = 1
- if recorded == 0:
- elixir_index = i
- recorded = 1
- else:
- best_elixir[i] = 0
- # 노치적시 딜지분
- if i == 0:
- if '회심' in imprinting:
- for key in skill_d_percentdmg:
- skill_percentdmg[key] = skill_d_percentdmg[key]/dec_dmg*97/100
- elif '달인' in imprinting:
- for key in skill_m_percentdmg:
- skill_percentdmg[key] = skill_m_percentdmg[key]/mas_dmg*97/100
- elif dec_dmg >= mas_dmg:
- for key in skill_d_percentdmg:
- skill_percentdmg[key] = skill_d_percentdmg[key]/dec_dmg*97/100
- elif mas_dmg > dec_dmg:
- for key in skill_m_percentdmg:
- skill_percentdmg[key] = skill_m_percentdmg[key]/mas_dmg*97/100
- skill_percentdmg['기타'] = 0.03
- # 특신목 제거 - 순환전에 해야함
- if class_imprinting == '포식' and '특신목' in imprinting:
- cri = cri+500
- spec = spec-500
- # 팔찌순환여부 - 순환 제거후 재귀
- if '순환하' in bracelet_temp:
- bracelet_temp.remove('순환하')
- circ_dmg, t1, t2, t3 = calc_damage(1.03, base_adddmg, base_ia, add_crit, base_critdmg, imprinting, bracelet_temp)
- circ_crit, t1, t2, t3 = calc_damage(1, base_adddmg, base_ia, add_crit+0.05, base_critdmg, imprinting, bracelet_temp)
- circ_critdmg, t1, t2, t3 = calc_damage(1, base_adddmg, base_ia, add_crit, base_critdmg+0.08, imprinting, bracelet_temp)
- return (circ_dmg+circ_crit+circ_critdmg)/3, elixir_index, best_elixir, copy.deepcopy(skill_percentdmg)
- elif '순환중' in bracelet_temp:
- bracelet_temp.remove('순환중')
- circ_dmg, t1, t2, t3 = calc_damage(1.035, base_adddmg, base_ia, add_crit, base_critdmg, imprinting, bracelet_temp)
- circ_crit, t1, t2, t3 = calc_damage(1, base_adddmg, base_ia, add_crit+0.06, base_critdmg, imprinting, bracelet_temp)
- circ_critdmg, t1, t2, t3 = calc_damage(1, base_adddmg, base_ia, add_crit, base_critdmg+0.10, imprinting, bracelet_temp)
- return (circ_dmg+circ_crit+circ_critdmg)/3, elixir_index, best_elixir, copy.deepcopy(skill_percentdmg)
- elif '순환상' in bracelet_temp:
- bracelet_temp.remove('순환상')
- circ_dmg, t1, t2, t3 = calc_damage(1.04, base_adddmg, base_ia, add_crit, base_critdmg, imprinting, bracelet_temp)
- circ_crit, t1, t2, t3 = calc_damage(1, base_adddmg, base_ia, add_crit+0.07, base_critdmg, imprinting, bracelet_temp)
- circ_critdmg, t1, t2, t3 = calc_damage(1, base_adddmg, base_ia, add_crit, base_critdmg+0.12, imprinting, bracelet_temp)
- return (circ_dmg+circ_crit+circ_critdmg)/3, elixir_index, best_elixir, copy.deepcopy(skill_percentdmg)
- return final_dmg/cycle_length, elixir_index, best_elixir, copy.deepcopy(skill_percentdmg)
- # 데미지계산식 헬퍼
- def calc_damage_helper(dmg, ia, crit, critdmg, decisive):
- '''
- 기본적인 데미지계산식 - 피증*공증*(치적*치피증*회심+(1-치적))
- '''
- return dmg*ia*(crit*critdmg*decisive+(1-crit))
- # 각인 공증/피증/치적/치피증 적용
- def calc_imprinting(dmg, add_dmg, ia, crit, critdmg, imprinting, bracelet):
- p_dmg, p_crit, p_critdmg = dmg, np.copy(crit), critdmg # 헤드/백 포지션별 딜/치적/치피증 생성
- for i in range(len(imprinting)):
- name = imprinting[i]
- # 셋옵
- if name == '환각':
- dmg, crit = hallucination(dmg, crit)
- p_dmg, p_crit = hallucination(p_dmg, p_crit)
- elif name == '헤드사멸':
- dmg, crit, critdmg, p_dmg, p_crit, p_critdmg = entropy(dmg, crit, critdmg, p_dmg, p_crit, p_critdmg)
- p_dmg = p_dmg*1.2 # 헤드보너스
- elif name == '백사멸':
- dmg, crit, critdmg, p_dmg, p_crit, p_critdmg = entropy(dmg, crit, critdmg, p_dmg, p_crit, p_critdmg)
- p_dmg, p_crit = p_dmg*1.05, p_crit+0.1 # 백보너스
- # 직업이 블레이드일시, 백헤드 자가시너지
- if class_imprinting == '잔재' or class_imprinting == '버스트':
- dmg = dmg*1.04
- p_dmg = p_dmg*1.09
- # 각인
- elif name[:2] == '돌대':
- level = int(imprinting[i][-1])
- dmg = vanguard(level, dmg)
- p_dmg = vanguard(level, p_dmg)
- elif name[:2] == '아드':
- level = int(imprinting[i][-1])
- ia, crit = adrenaline(level, ia, crit)
- temp, p_crit = adrenaline(level, ia, p_crit)
- elif name[:2] == '저받':
- level = int(imprinting[i][-1])
- ia = cursed_doll(level, ia)
- elif name[:2] == '질증':
- level = int(imprinting[i][-1])
- ia = increased_mass(level, ia)
- elif name[:2] == '예둔':
- level = int(imprinting[i][-1])
- dmg, critdmg = blunt_weapon(level, dmg, critdmg)
- p_dmg, p_critdmg = blunt_weapon(level, p_dmg, p_critdmg)
- elif name[:2] == '에포':
- level = int(imprinting[i][-1])
- ia = ether(ia)
- elif name[:2] == '정단':
- level = int(imprinting[i][-1])
- crit, critdmg = precise_dagger(level, crit, critdmg)
- p_crit, p_critdmg = precise_dagger(level, p_crit, p_critdmg)
- elif name[:2] == '결대':
- level = int(imprinting[i][-1])
- p_dmg = head_master(level, p_dmg)
- elif name[:2] == '기습':
- level = int(imprinting[i][-1])
- p_dmg = back_master(level, p_dmg)
- elif name[:2] == '원한':
- level = int(imprinting[i][-1])
- dmg = grudge(level, dmg)
- p_dmg = grudge(level, p_dmg)
- # 엘릭서
- elif name == '하의치피':
- critdmg, p_critdmg = critdmg+0.07, p_critdmg+0.07
- elif name == '하의추피':
- add_dmg = add_dmg+0.031
- # 팔찌
- for i in range(len(bracelet)):
- name = bracelet[i]
- if name[:2] == '열정':
- level = bracelet[i][-1]
- dmg, p_dmg = fervor(dmg, p_dmg, level)
- elif name[:2] == '망치':
- level = bracelet[i][-1]
- critdmg, p_critdmg = hammer(bracelet, critdmg, p_critdmg, level)
- elif name[:2] == '우월':
- level = bracelet[i][-1]
- dmg, p_dmg = superiority(dmg, p_dmg, level)
- elif name[:2] == '습격':
- level = bracelet[i][-1]
- critdmg, p_critdmg = raid(critdmg, p_critdmg, level)
- elif name[:2] == '결투' or name[:2] == '기습':
- level = bracelet[i][-1]
- p_dmg = ambush(p_dmg, level)
- elif name[:2] == '정밀':
- level = bracelet[i][-1]
- crit, p_crit = precision(crit, p_crit, level)
- elif name[:2] == '쐐기':
- level = bracelet[i][-1]
- add_dmg = wedge(add_dmg, level)
- return dmg, add_dmg, ia, crit, critdmg, p_dmg, p_crit, p_critdmg
- '''
- # 계산부분 시작
- '''
- N = 100
- add_crit = np.linspace(0., 0.2, num=N, endpoint=True)
- add_crit_discrete = np.asarray([0, 0.021, 0.1, 0.121, 0.2, 0.221])
- name_crit_discrete = ['치적x', '치적x약노', '치적1', '치적1약노', '치적2', '치적2약노']
- base_critdmg = 2 # 기본치피증
- base_ia = 1.0144 # 기본공증 - 1.44% 투구엘릭서 추가
- base_adddmg = 1.42 # 추피 - 무품100+갈망12기준
- # 깡통딜 (팔찌제거) 계산\
- if class_imprinting == '처단':
- spec = spec-bracelet_spec_1*1.1
- cri = cri-bracelet_cri_1
- swi = swi-bracelet_swi_1
- else:
- swi = swi-bracelet_swi_1*1.1
- cri = cri-bracelet_cri_1
- spec = spec-bracelet_spec_1
- imp_base_nb = base_imprinting+base_set+base_elixir
- nobracelet_dmg, t1, t2, t3 = calc_damage(1, base_adddmg, base_ia, add_crit_discrete, base_critdmg, imp_base_nb, '')
- # 팔찌1 포함
- if class_imprinting == '처단':
- spec = spec+bracelet_spec_1*1.1
- cri = cri+bracelet_cri_1
- swi = swi+bracelet_swi_1
- else:
- swi = swi+bracelet_swi_1*1.1
- cri = cri+bracelet_cri_1
- spec = spec+bracelet_spec_1
- imp_br1 = base_imprinting+base_set+base_elixir
- 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)
- br1_percent_view = [(v, k) for (k, v) in br1_percent.items()]
- br1_percent_view.sort(reverse=True)
- imp_br1_c = compare_imprinting+base_set+base_elixir
- 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)
- # 팔찌2 포함
- if class_imprinting == '처단':
- spec = spec-(bracelet_spec_1-bracelet_spec_2)*1.1
- cri = cri-bracelet_cri_1+bracelet_cri_2
- swi = swi-bracelet_swi_1+bracelet_swi_2
- else:
- swi = swi-(bracelet_swi_1-bracelet_swi_2)*1.1
- cri = cri-bracelet_cri_1+bracelet_cri_2
- spec = spec-bracelet_spec_1+bracelet_spec_2
- imp_br2 = base_imprinting+base_set+base_elixir
- br2_dmg, elix_b_b2, t2, t3 = calc_damage(1, base_adddmg, base_ia, add_crit_discrete, base_critdmg, imp_br2, bracelet_option_2)
- imp_br2_c = compare_imprinting+base_set+base_elixir
- 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)
- print('\n')
- print('직업각인 : ', class_imprinting)
- print('기존각인 : ', base_imprinting)
- print('\n')
- print('딜지분')
- print ('-----------')
- for v, k in br1_percent_view:
- print ('%s: %.3f' % (k, np.round(v, decimals=3)))
- print('\n')
- if class_imprinting == '처단':
- print('팔찌 1 효율 (%)')
- print('특화:', bracelet_spec_1, '치명:', bracelet_cri_1, '특옵:', bracelet_option_1)
- else:
- print('팔찌 1 효율 (%)')
- print('신속:', bracelet_swi_1, '치명:', bracelet_cri_1, '특화:', bracelet_spec_1, '특옵:', bracelet_option_1)
- print ('-----------')
- print('%-8s%-8s%-8s%-8s%-8s%-8s' % ('치적x', '치적x약노', '치적1', '치적1약노', '치적2', '치적2약노'))
- 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)))
- print('\n')
- if class_imprinting == '처단':
- print ('팔찌 2 효율 (%)')
- print('특화:', bracelet_spec_2, '치명:', bracelet_cri_2, '특옵:', bracelet_option_2)
- else:
- print ('팔찌 2 효율 (%)')
- print('신속:', bracelet_swi_2, '치명:', bracelet_cri_2, '특화:', bracelet_spec_2, '특옵:', bracelet_option_2)
- print ('-----------')
- print('%-8s%-8s%-8s%-8s%-8s%-8s' % ('치적x', '치적x약노', '치적1', '치적1약노', '치적2', '치적2약노'))
- 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)))
- print('\n')
- print('각인1 : ', base_imprinting)
- print('각인2 : ', compare_imprinting)
- print('\n')
- print('상황별 비교 (기존각인/비교각인 + 팔찌 1/2)')
- print ('-----------')
- print('%-11s%-8s%-8s%-8s%-8s%-8s%-8s' % ('', '치적x', '치적x약노', '치적1', '치적1약노', '치적2', '치적2약노'))
- print('%-9s%-10s%-11s%-10s%-11s%-10s%-11s' % ('각인1+팔1', 0, 0, 0, 0, 0, 0))
- 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)))
- 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)))
- 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)))
- print('\n')
- print('달인-화심 스왑지점')
- if (not '달인' in base_elixir) and (not '회심' in base_elixir):
- print('각인1+팔1 : ', name_crit_discrete[elix_b_b1], '이상일때 회심스왑')
- print('각인1+팔2 : ', name_crit_discrete[elix_b_b2], '이상일때 회심스왑')
- print('각인2+팔1 : ', name_crit_discrete[elix_c_b1], '이상일때 회심스왑')
- print('각인2+팔2 : ', name_crit_discrete[elix_c_b2], '이상일때 회심스왑')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement