dev
This commit is contained in:
+146
-87
@@ -3,6 +3,7 @@ import importlib
|
||||
from typing import Any, Literal, Mapping, Union
|
||||
from uuid import uuid1
|
||||
|
||||
from core.abstract.character import CharacterProperty
|
||||
from core.basic.property import CharacterInfo
|
||||
from core.basic.skill import Skill
|
||||
|
||||
@@ -29,7 +30,7 @@ class Jade:
|
||||
self.SkillAttack = 0.0
|
||||
|
||||
|
||||
class Character:
|
||||
class Character(CharacterProperty):
|
||||
# region 角色属性
|
||||
|
||||
STR: float
|
||||
@@ -132,9 +133,7 @@ class Character:
|
||||
max_point = 0
|
||||
"""套装效果点数"""
|
||||
|
||||
# region 角色属性
|
||||
buffer: bool = False
|
||||
# endregion
|
||||
|
||||
# region 职业属性
|
||||
实际名称: str = ''
|
||||
@@ -223,7 +222,7 @@ class Character:
|
||||
# 角色四维
|
||||
temp = 获取基础属性(self.角色, self.职业)
|
||||
for index, i in enumerate([get_key_by_value(i) for i in ['力量', '体力', '智力', '精神']]):
|
||||
setattr(self, i, temp[index])
|
||||
setattr(self, i, getattr(self,i) + temp[index])
|
||||
# 角色属性抗性
|
||||
pass
|
||||
# 角色异常抗性
|
||||
@@ -360,9 +359,9 @@ class Character:
|
||||
"""
|
||||
for skill in self.skills:
|
||||
if min <= skill.learnLv <= max:
|
||||
type = 'all' if type == -1 else ('active' if type == 1 else 'passive')
|
||||
if type == 'all' or skill.type == type:
|
||||
skill.lv += 1
|
||||
skillType = 'all' if type == -1 else ('active' if type == 1 else 'passive')
|
||||
if (skillType == 'all' or skill.type == skillType) and skill.lv > 0:
|
||||
skill.lv += lv
|
||||
|
||||
def SetSkillCD(self, min=1, max=100, cd=0, exclude=[50, 85, 100]) -> None:
|
||||
"""
|
||||
@@ -462,8 +461,9 @@ class Character:
|
||||
info['equips'] = equs
|
||||
info['suits'] = suits
|
||||
info['stones'] = stones
|
||||
info['enchants'] = equInfos.enchants
|
||||
info['emblems'] = equInfos.emblems
|
||||
key = '辅助' if self.buffer else '输出'
|
||||
info['enchants'] = list(filter(lambda x: key in x["categorize"], equInfos.enchants))
|
||||
info['emblems'] = list(filter(lambda x: key in x["categorize"], equInfos.emblems))
|
||||
info['avatar'] = equInfos.funs.get_dress_list(skill_clothes)
|
||||
info['jades'] = equInfos.jades
|
||||
info['sundry'] = equInfos.funs.sundryList
|
||||
@@ -690,8 +690,9 @@ class Character:
|
||||
reinforce = self.charEquipInfo[part].reinforce
|
||||
if equ is None:
|
||||
continue
|
||||
value = 精通计算(115, equ.rarity, reinforce, equ.itemDetailType, self.防具类型)
|
||||
|
||||
for key in self.防具精通属性:
|
||||
value = 精通计算(115, equ.rarity, reinforce, equ.itemDetailType, self.防具类型,self.buffer,key)
|
||||
key = get_key_by_value(key)
|
||||
setattr(self, key, getattr(self, key) + value)
|
||||
# 115增幅强化品级固定史诗
|
||||
@@ -788,92 +789,26 @@ class Character:
|
||||
suit = self.calc_suits()
|
||||
# 部位效果计算
|
||||
self.calc_equs()
|
||||
|
||||
# print(suit)
|
||||
# effects = get_equipment(self.equVersion).funs
|
||||
# for effect in equ_effect:
|
||||
# func = effects.equ_func_list.get(str(effect), None)
|
||||
# if func is not None:
|
||||
# func(self)
|
||||
# for effect in suits_effect:
|
||||
# func = effects.suit_func_list.get(str(effect), None)
|
||||
# if func is not None:
|
||||
# func(self)
|
||||
# 徽章计算
|
||||
# 附魔计算
|
||||
|
||||
# 技能计算
|
||||
skillInfos = []
|
||||
for i in self.skills:
|
||||
if i.damage and i.lv > 0:
|
||||
for mode in i.mode:
|
||||
temp = i.skillInfo(mode)
|
||||
skillInfos.append(
|
||||
{
|
||||
'name': i.name,
|
||||
'icon': i.icon,
|
||||
'lv': i.lv,
|
||||
'data': temp[0],
|
||||
'ratio': temp[1],
|
||||
'cd': temp[2],
|
||||
'mode': mode,
|
||||
}
|
||||
)
|
||||
ratios = self.calc_damage_ration()
|
||||
ratio_char_skill = ratios[0] * ratios[1] * ratios[2] * ratios[3] * ratios[4] * ratios[5] * ratios[6] * ratios[7] * ratios[8] * ratios[9] / 1000
|
||||
ratuio_equ_skill = ratios[0] * ratios[1] * ratios[3] * ratios[4] * ratios[6] * ratios[7] * ratios[8] * ratios[9] / 1000
|
||||
for i in skillInfos:
|
||||
i['damage'] = ratio_char_skill * i['data'] * i['ratio'] / 100
|
||||
for i in self.equ_effect:
|
||||
skillInfos.append(
|
||||
{
|
||||
'name': i.name,
|
||||
'icon': i.icon,
|
||||
'lv': 0,
|
||||
'data': i.data,
|
||||
'ratio': 10.0,
|
||||
'cd': i.cd,
|
||||
'damage': ratuio_equ_skill * i.data * 10 * self.EquEffectRatio / 100,
|
||||
'mode':''
|
||||
}
|
||||
)
|
||||
attrs = []
|
||||
if self.输出类型 == '物理百分比':
|
||||
attrs.extend(['STR', 'AtkP'])
|
||||
if self.输出类型 == '魔法百分比':
|
||||
attrs.extend(['INT', 'AtkM'])
|
||||
if self.输出类型 == '物理固伤':
|
||||
attrs.extend(['STR', 'AtkI'])
|
||||
if self.输出类型 == '魔法固伤':
|
||||
attrs.extend(['INT', 'AtkI'])
|
||||
info = []
|
||||
attrs.extend(['Attack', 'AttackP', 'SkillAttack','EquEffectRatio', 'ElementDB'])
|
||||
for attr in attrs:
|
||||
temp = getattr(CharacterInfo, attr)
|
||||
if attr.startswith('Atk'):
|
||||
info.append({'name': temp.name, 'value': temp.value(getattr(self, attr) * getattr(self, f'P{attr}'))})
|
||||
pass
|
||||
else:
|
||||
value = getattr(self, attr)
|
||||
if attr == 'SkillAttack':
|
||||
value *= (self.jade_effect.SkillAttack + 1)
|
||||
if attr == 'AttackP':
|
||||
value += self.jade_effect.AttackP
|
||||
info.append(
|
||||
{
|
||||
'name': temp.name,
|
||||
'value': temp.value(value),
|
||||
}
|
||||
)
|
||||
pass
|
||||
if self.buffer:
|
||||
skillInfos = self.calc_buffer_skills()
|
||||
info = self.get_buffer_info()
|
||||
pass
|
||||
else:
|
||||
skillInfos = self.calc_carry_skills()
|
||||
info = self.get_carry_info()
|
||||
return {
|
||||
'uuid': uuid1().hex,
|
||||
'skills': skillInfos,
|
||||
'info': info,
|
||||
'suits': suit,
|
||||
'buffer':self.buffer
|
||||
}
|
||||
# 技能影响角色的属性,如属强、抗性等
|
||||
|
||||
|
||||
# region 输出计算项
|
||||
|
||||
def calc_damage_ration(self):
|
||||
"""计算属性系数"""
|
||||
# 计算最终属性
|
||||
@@ -910,6 +845,130 @@ class Character:
|
||||
ratio_9 = 1.0 * self.ElementIncrease
|
||||
return (ratio_0, ratio_1, ratio_2, ratio_3, ratio_4, ratio_5, ratio_6, ratio_7, ratio_8, ratio_9)
|
||||
|
||||
def calc_carry_skills(self):
|
||||
skillInfos = []
|
||||
for i in self.skills:
|
||||
if i.damage and i.lv > 0:
|
||||
for mode in i.mode:
|
||||
temp = i.skillInfo(mode)
|
||||
skillInfos.append(
|
||||
{
|
||||
'name': i.name,
|
||||
'icon': i.icon,
|
||||
'lv': i.lv,
|
||||
'data': temp[0],
|
||||
'ratio': temp[1],
|
||||
'cd': temp[2],
|
||||
'mode': mode,
|
||||
}
|
||||
)
|
||||
ratios = self.calc_damage_ration()
|
||||
ratio_char_skill = ratios[0] * ratios[1] * ratios[2] * ratios[3] * ratios[4] * ratios[5] * ratios[6] * ratios[7] * ratios[8] * ratios[9] / 1000
|
||||
ratuio_equ_skill = ratios[0] * ratios[1] * ratios[3] * ratios[4] * ratios[6] * ratios[7] * ratios[8] * ratios[9] / 1000
|
||||
for i in skillInfos:
|
||||
i['damage'] = ratio_char_skill * i['data'] * i['ratio'] / 100
|
||||
for i in self.equ_effect:
|
||||
skillInfos.append(
|
||||
{
|
||||
'name': i.name,
|
||||
'icon': i.icon,
|
||||
'lv': 0,
|
||||
'data': i.data,
|
||||
'ratio': 10.0,
|
||||
'cd': i.cd,
|
||||
'damage': ratuio_equ_skill * i.data * 10 * self.EquEffectRatio / 100,
|
||||
'mode':''
|
||||
}
|
||||
)
|
||||
return skillInfos
|
||||
|
||||
def get_carry_info(self):
|
||||
attrs = []
|
||||
if self.输出类型 == '物理百分比':
|
||||
attrs.extend(['STR', 'AtkP'])
|
||||
if self.输出类型 == '魔法百分比':
|
||||
attrs.extend(['INT', 'AtkM'])
|
||||
if self.输出类型 == '物理固伤':
|
||||
attrs.extend(['STR', 'AtkI'])
|
||||
if self.输出类型 == '魔法固伤':
|
||||
attrs.extend(['INT', 'AtkI'])
|
||||
info = []
|
||||
attrs.extend(['Attack', 'AttackP', 'SkillAttack','EquEffectRatio', 'ElementDB'])
|
||||
for attr in attrs:
|
||||
temp = getattr(CharacterInfo, attr)
|
||||
if attr.startswith('Atk'):
|
||||
info.append({'name': temp.name, 'value': temp.value(getattr(self, attr) * getattr(self, f'P{attr}'))})
|
||||
pass
|
||||
else:
|
||||
value = getattr(self, attr)
|
||||
if attr == 'SkillAttack':
|
||||
value *= (self.jade_effect.SkillAttack + 1)
|
||||
if attr == 'AttackP':
|
||||
value += self.jade_effect.AttackP
|
||||
info.append(
|
||||
{
|
||||
'name': temp.name,
|
||||
'value': temp.value(value),
|
||||
}
|
||||
)
|
||||
pass
|
||||
return info
|
||||
# endregion
|
||||
|
||||
#region 辅助计算项
|
||||
|
||||
def calc_buffer_skills(self):
|
||||
skillInfos = []
|
||||
# 适用属性
|
||||
main = getattr(self, get_key_by_value(self.适用属性))
|
||||
buffer_power = self.Buffer * self.BufferP
|
||||
# buff系数
|
||||
buff_ratio_new = (((main+ 4350) / 665 + 1) * (buffer_power + 3500)/26395) if buffer_power > 0 else 0
|
||||
buff_ratio_old = main / 665 + 1
|
||||
# 觉醒系数
|
||||
awake_ratio_new = ((main + 5250) / 750 + 1) *(buffer_power + 5000) * 0.000025 if buffer_power > 0 else 0
|
||||
awake_ratio_old = main / 750 + 1
|
||||
for i in self.skills:
|
||||
if i.buffer and i.lv > 0:
|
||||
info = i.skillInfo()
|
||||
# 奶自己的面板加成
|
||||
value = info[0]
|
||||
# buff技能
|
||||
if i.buffType == 'buff':
|
||||
value1 = (info[1][0] + info[1][2])*info[1][1]*buff_ratio_old + info[1][0]*buff_ratio_new
|
||||
value2 = (info[2][0] + info[2][2])*info[2][1]*buff_ratio_old + info[2][0]*buff_ratio_new
|
||||
# 觉醒技能
|
||||
elif i.buffType == 'awake':
|
||||
value1 = (info[1][0] + info[1][2])*info[1][1]*awake_ratio_old + info[1][0]*awake_ratio_new
|
||||
value2 = (info[2][0] + info[2][2])*info[2][1]*awake_ratio_old + info[2][0]*awake_ratio_new
|
||||
else:
|
||||
value1 = (info[1][0] + info[1][2])*info[1][1]
|
||||
value2 = (info[2][0] + info[2][2])*info[2][1]
|
||||
value3 = info[3]
|
||||
value4 = info[4]
|
||||
skillInfos.append({
|
||||
"name":i.name,
|
||||
"cd":value4,
|
||||
"icon":i.icon,
|
||||
"lv": i.lv,
|
||||
# 对自己的加成 三攻 力智 伤害直接加成
|
||||
"buff":[value, value1, value2, value3],
|
||||
})
|
||||
return skillInfos
|
||||
|
||||
def get_buffer_info(self):
|
||||
attrs = [get_key_by_value(self.适用属性),'Buffer','BufferP']
|
||||
info = []
|
||||
for attr in attrs:
|
||||
temp = getattr(CharacterInfo, attr)
|
||||
value = getattr(self, attr)
|
||||
info.append({
|
||||
'name': temp.name,
|
||||
'value': temp.value(value),
|
||||
})
|
||||
return info
|
||||
# endregion
|
||||
|
||||
# endregion
|
||||
|
||||
|
||||
|
||||
@@ -311,17 +311,16 @@ def 武器MP系数(武器类型, 输出类型) -> float:
|
||||
品级加分 = {'稀有': 5, '神器': 8, '勇者': 11, '传说': 14, '史诗': 17, '智慧产物': 17, '神话': 18}
|
||||
|
||||
|
||||
def 精通计算(装备等级, 品质, 强化等级, 部位, 甲类):
|
||||
return round((20 + 甲类系数[甲类] * (装备等级 + 品级加分[品质] + int(强化等级 / 3))) * 部位系数[部位], 2)
|
||||
|
||||
|
||||
def 辅助精通计算(装备等级, 品质, 强化等级, 部位, 属性):
|
||||
if 属性 == '智力':
|
||||
return round((8 + 2.4 * (装备等级 + 品级加分[品质] + int(强化等级 / 3))) * 部位系数[部位], 2)
|
||||
if 属性 == '体力':
|
||||
return round((4 + 1.6 * (装备等级 + 品级加分[品质] + int(强化等级 / 3))) * 部位系数[部位], 2)
|
||||
if 属性 == '精神':
|
||||
return round((8 + 0.8 * (装备等级 + 品级加分[品质] + int(强化等级 / 3))) * 部位系数[部位], 2)
|
||||
def 精通计算(装备等级, 品质, 强化等级, 部位, 甲类,属性='',carry=True):
|
||||
if carry:
|
||||
return round((20 + 甲类系数[甲类] * (装备等级 + 品级加分[品质] + int(强化等级 / 3))) * 部位系数[部位], 2)
|
||||
else:
|
||||
if 属性 == '智力':
|
||||
return round((8 + 2.4 * (装备等级 + 品级加分[品质] + int(强化等级 / 3))) * 部位系数[部位], 2)
|
||||
if 属性 == '体力':
|
||||
return round((4 + 1.6 * (装备等级 + 品级加分[品质] + int(强化等级 / 3))) * 部位系数[部位], 2)
|
||||
if 属性 == '精神':
|
||||
return round((8 + 0.8 * (装备等级 + 品级加分[品质] + int(强化等级 / 3))) * 部位系数[部位], 2)
|
||||
|
||||
|
||||
# endregion
|
||||
|
||||
@@ -54,6 +54,11 @@ class CharacterInfo(enum.Enum):
|
||||
AttackP = '攻击强化%', '/ui/UI_ProfileIcon_015.png', lambda x: f'{format(x * 100 - 100, ".1f")}%'
|
||||
"""攻击强化%"""
|
||||
|
||||
Buffer = '增益量','', lambda x: f'{format(x, ".0f")}'
|
||||
|
||||
BufferP = '增益量%', '', lambda x: f'{format(x * 100 - 100, ".1f")}%'
|
||||
"""攻击强化%"""
|
||||
|
||||
EquEffectRatio = '特效伤害', '/ui/UI_ProfileIcon_016.png', lambda x: f'{format(x * 100 - 100, ".1f")}%'
|
||||
|
||||
# HitP : float
|
||||
|
||||
@@ -64,6 +64,8 @@ class Skill:
|
||||
"""
|
||||
mode : list[str] = ['']
|
||||
"""技能模式"""
|
||||
buffer: bool = False
|
||||
"""是否是增益技能"""
|
||||
|
||||
def __init__(self, char):
|
||||
self.char = char
|
||||
@@ -154,6 +156,8 @@ class ActiveSkill(Skill):
|
||||
"""技能类型 active主动 passive被动"""
|
||||
damage: bool = True
|
||||
"""是否是伤害技能"""
|
||||
buffer: bool = False
|
||||
"""是否是buff技能"""
|
||||
|
||||
def __init__(self, char):
|
||||
super().__init__(char)
|
||||
@@ -215,3 +219,98 @@ class PassiveSkill(Skill):
|
||||
"""技能类型 active主动 passive被动"""
|
||||
damage: bool = False
|
||||
"""是否是伤害技能"""
|
||||
buffer: bool = False
|
||||
"""是否是buff技能"""
|
||||
|
||||
class BuffSkill(Skill):
|
||||
buffer: bool = True
|
||||
"""是否是增益技能"""
|
||||
damage: bool = False
|
||||
"""是否是伤害技能"""
|
||||
buffType = 'normal'
|
||||
"""增益类型 normal普通 buff 主BUFF awake 觉醒技能"""
|
||||
|
||||
INT: list[float] = []
|
||||
"""智力"""
|
||||
STR: list[float] = []
|
||||
"""力量"""
|
||||
Spirit: list[float] = []
|
||||
"""精神"""
|
||||
Vitality: list[float] = []
|
||||
"""体力"""
|
||||
"""主要属性"""
|
||||
|
||||
ATK : list[float] = []
|
||||
"""三攻加成"""
|
||||
ATKRatio: float = 1
|
||||
"""三攻*算倍率"""
|
||||
ATKPLUS : float = 0
|
||||
"""三攻加算加成"""
|
||||
|
||||
STRINT : list[float] = []
|
||||
"""力量智力加成"""
|
||||
STRINTRatio: float = 1
|
||||
"""力量智力*算倍率"""
|
||||
STRINTPLUS : float = 0
|
||||
"""力量智力加算加成"""
|
||||
|
||||
CarryRatio: list[float] = []
|
||||
"""对C的额外增伤倍率"""
|
||||
|
||||
def getSkillCD(self):
|
||||
return '-'
|
||||
|
||||
def skillInfo(self, mode: str | None = None):
|
||||
"""
|
||||
Returns:
|
||||
tuple: (奶自己的面板加成,[三攻,三攻倍率,三攻额外加成],[力智,力智倍率,力智额外加成],对C增伤倍率,cd)
|
||||
"""
|
||||
lv = self.lv
|
||||
value = 0
|
||||
value1 = 0 if lv > len(self.ATK) else self.ATK[lv]
|
||||
value2 = 0 if lv > len(self.STRINT) else self.STRINT[lv]
|
||||
value3 = 0 if lv > len(self.CarryRatio) else self.CarryRatio[lv]
|
||||
if self.char.适用属性 == '智力':
|
||||
value = 0 if lv > len(self.INT) else self.INT[lv]
|
||||
elif self.char.适用属性 == '力量':
|
||||
value = 0 if lv > len(self.STR) else self.STR[lv]
|
||||
elif self.char.适用属性 == '体力':
|
||||
value = 0 if lv > len(self.Vitality) else self.Vitality[lv]
|
||||
elif self.char.适用属性 == '精神':
|
||||
value = 0 if lv > len(self.Spirit) else self.Spirit[lv]
|
||||
return value,[value1,self.ATKRatio,self.ATKPLUS],[value2,self.STRINTRatio,self.STRINTPLUS],value3,self.getSkillCD()
|
||||
|
||||
class PassiveBufferSkill(BuffSkill):
|
||||
type: str = 'passive'
|
||||
|
||||
|
||||
class ActiveBufferSkill(BuffSkill):
|
||||
type: str = 'active'
|
||||
|
||||
|
||||
def getWeaponCDRatio(self):
|
||||
weapon = self.char.charEquipInfo['武器'].equInfo
|
||||
if weapon is None or '传世武器' in weapon.categorize:
|
||||
return 1
|
||||
else:
|
||||
return 武器冷却惩罚(weapon.itemDetailType,self.char.输出类型)
|
||||
|
||||
def getQuickCDRatio(self):
|
||||
return 1.0
|
||||
cdr = 0
|
||||
if 15 <= self.learnLv <= 30:
|
||||
cdr = 0.01
|
||||
elif 35<= self.learnLv <= 70:
|
||||
cdr = 0.02
|
||||
elif 75<= self.learnLv <= 100:
|
||||
cdr = 0.05
|
||||
if self.learnLv in [50,85,100]:
|
||||
cdr = 0.05
|
||||
return 1 - cdr
|
||||
|
||||
def getSkillCD(self):
|
||||
return max(0,round(max(
|
||||
self.cd * 0.3,
|
||||
self.cd * self.cdReduce / self.cdRecover * self.getWeaponCDRatio() * self.getQuickCDRatio(),1)
|
||||
- self.cdCut,2
|
||||
))
|
||||
|
||||
Reference in New Issue
Block a user