This commit is contained in:
2025-04-12 12:11:46 +08:00
parent caa032d1eb
commit 34551c7b35
31 changed files with 1379 additions and 166 deletions
+146 -87
View File
@@ -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
+10 -11
View File
@@ -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
+5
View File
@@ -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
+99
View File
@@ -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
))