import importlib from copy import deepcopy from pyclbr import Function from typing import Dict, List, Union from uuid import uuid1 from utils.exception import ResponseException from core.basic.equipment import equipment, get_equ, get_global_data from core.basic.property import CharacterProperty from core.basic.skill import 主动技能, 技能, 被动技能 from core.equipment.avatar import 装扮套装, 装扮套装集合, 装扮集合 from core.equipment.emblems import get_emblems_setinfo from core.equipment.enchanting import get_enchanting_setinfo from core.equipment.jade import get_jade_setinfo from core.equipment.property import ( 增幅计算, 左右计算, 成长词条计算, 武器强化计算, 精通计算, 耳环计算, 获取基础属性, 获取属性抗性基础, 获取异常抗性基础, 辅助精通计算, 部位列表, 锻造四维, 锻造计算, ) from core.equipment.sundry import get_sundries_setinfo # from core.basic.enchanting import get_encfunc_by_id # from core.basic.emblems import get_embfunc_by_id # from core.basic.jade import get_jadefunc_by_id MAXEQULV = 105 class Character(CharacterProperty): 等级 = 110 # 辟邪玉属性 附加伤害增加增幅: float = 1.0 属性附加伤害增加增幅: float = 1.0 技能伤害增加增幅: float = 1.0 暴击伤害增加增幅: float = 1.0 伤害增加增幅: float = 1.0 最终伤害增加增幅: float = 1.0 力量智力增加增幅: float = 1.0 物理魔法攻击力增加增幅: float = 1.0 所有属性强化增幅: float = 1.0 version = "default" equVersion = "" bufferCarry = False 等级: int = 110 防御输入: int = 506109 防御系数: int = 1 火抗输入: int = 0 冰抗输入: int = 0 光抗输入: int = 0 暗抗输入: int = 0 打造详情: Dict[str, Dict[str, int]] = {} 装备栏: List[int] = [] # [装备id] 部位装备: Dict[str, int] = {} # {部位: 装备id} 部位附魔: Dict[str, Function] = {} # {部位: 附魔函数} 词条等级: Dict[str, List[int]] = {} # {部位: [等级1, 2, 3, 4]} 药剂: List[int] = [] # 需要职业自定义数据 实际名称 = "" 名称 = "" 角色 = "" 角色类型 = "" 职业 = "" 武器选项: List[str] = [] 输出类型选项: List[str] = [] 防具精通属性: List[str] = [] 排行类型 = "物理百分比" 适用属性 = "智力" 适用数值 = 0 类型 = "" 武器类型 = "" 防具类型 = "" 转职 = "" # 技能栏: List[技能 | 主动技能 | 被动技能] = [] # 技能序号: Dict[int, 技能 | 主动技能 | 被动技能] = {} 技能栏: List[Union[技能, 主动技能, 被动技能]] = [] 技能序号: Dict[str, int] = {} 自定义词条: Dict[int, List[int]] = {} buff: float = 1.00 hotkey: List[str] = [""] * 14 技能队列 = [] 护石技能 = [] 护石栏 = [] 符文 = [] skills_passive: Dict = {} 融合列表 = [] 武器融合 = [] 装扮栏: Dict[str, int] = {} 装扮选项: Dict[str, str] = {} # 职业技能特殊选项 individuation: Dict[str, int] = {} 技攻列表: Dict[str, List[float]] = {} 打造: Dict = {} 觉醒技能 = [] 冷却缩减 = 1.0 冷却恢复 = 0.0 tip_part: List[str] = [] trigger_set = {} eq_params = {} suits = [] 特性列表 = [] def __init__(self, equVersion="") -> None: self.equVersion = equVersion self.eq_params = {} # 计算变量 ########## self.__基础力量: int = 0 self.__基础智力: int = 0 self.__基础体力: int = 0 self.__基础精神: int = 0 self.进图力量: int = 0 self.进图智力: int = 0 self.__进图体力: int = 0 self.__进图精神: int = 0 self.__进图三攻: int = 0 self.__BUFF补正智力: int = 0 self.__BUFF补正体力: int = 0 self.__BUFF补正精神: int = 0 self.__力量: int = 0 self.__智力: int = 0 self.__体力: int = 0 self.__精神: int = 0 self.系统奶系数: float = 0.0 self.系统奶基数: float = 0.0 self.冷却缩减 = 1.0 self.冷却恢复 = 0 self.斗神宠物 = 1.0 # self.年宠技能 = False # self.白兔子技能 = False # self.斗神之吼秘药 = False self.辅助对象力智 = 5000 self.辅助对象三攻 = 3000 self.__物理攻击力: int = 65 self.__魔法攻击力: int = 65 self.__独立攻击力: int = 1134 self.__火属性强化: float = 13 self.__冰属性强化: float = 13 self.__光属性强化: float = 13 self.__暗属性强化: float = 13 # 旧词条 self.__百分比力智: float = 0.0 self.__百分比三攻: float = 0.0 self.__伤害增加: float = 0.0 self.__附加伤害: float = 0.0 self.__属性附加: float = 0.0 self.__暴击伤害: float = 0.0 self.__最终伤害: float = 0.0 self.技能攻击力: float = 1.0 self.__面板技能攻击力: float = 1.0 self.技能攻击力累加: float = 0.0 self.__持续伤害: float = 0.0 self.__加算冷却缩减: float = 0.0 self.__百分比减防: float = 0.0 self.__固定减防: int = 0 self.__buff固定力智: int = 0 self.__buff百分比力智: float = 1.0 self.__buff固定三攻: int = 0 self.__buff百分比三攻: float = 1.0 self.__觉醒固定力智: int = 0 self.__觉醒百分比力智: float = 1.0 self.__觉醒百分比力智Total: float = 1.0 # 其它词条 self.__攻击速度: float = 0.00 self.__攻击速度_其他: float = 0.00 self.__移动速度: float = 0.00 self.__施放速度: float = 0.00 self.__命中率: float = 0.0 self.__回避率: float = 0.0 self.__物理暴击率: float = 0.00 self.__魔法暴击率: float = 0.00 self.__火属性抗性: int = 0 self.__冰属性抗性: int = 0 self.__光属性抗性: int = 0 self.__暗属性抗性: int = 0 self.属强抗性倍率 = 1.0 # 新属性 self.__攻击强化: int = 0 self.__百分比攻击强化: float = 0.0 self.__buff量: int = 0 self.__百分比buff量: float = 0.0 self.__基础精通倍率: float = 1.0 self.伤害比例: Dict[str, float] = { "直伤": 1.0, "中毒": 0.0, "灼伤": 0.0, "感电": 0.0, "出血": 0.0, } self.伤害系数: Dict[str, float] = { "中毒": 1.0, "灼伤": 1.0, "感电": 1.0, "出血": 1.0, } self.特效 = [] self.__异常抗性: Dict[str, float] = {} self.__异常抗性_职业基础: Dict[str, float] = {} self.__指令效果: Dict[str, float] = {} self.__MP消耗量: float = 1.0 self.觉醒技能 = [] self.skills_passive = {} self.异常基础加成 = { "中毒": 1.1, "灼伤": 1.0, "感电": 1.05, "出血": 1.1, "灼伤破冰": 1.1, } self.异常结算加成 = { "中毒": 1.0, "灼伤": 1.0, "感电": 1.0, "出血": 1.0, "灼伤破冰": 1.0, } self.异常时间 = { # 基础持续时间 持续时间增加值 持续时间增加率 CD "中毒": [5, 0, 1.0, 99], "灼伤": [5, 0, 1.0, 99], "感电": [10, 0, 1.0, 99], "出血": [3, 0, 1.0, 99], "冰冻": [5, 0, 10, 99], } self.打造 = {} self.trigger_set = {} for item in 部位列表 + ("称号", "宠物"): self.打造[item] = { # 成长 "attack": [0] * 4, # 成长 "buffer": [0] * 4, # 强化 "强化四维": [0] * 4, # 增幅 "增幅四维": [0] * 4, # 攻击力 "强化攻击力": [0] * 3, # 独立,四维 "锻造加成": [0] * 2, "params": [[None]] * 4, "tips": [], } self.tip_part = [] if self.转职 == "": self.转职 = self.职业 # 设置基础属性 self.__设置基础属性() self.技攻列表 = {} def __设置基础属性(self): temp = 获取基础属性(self.角色, self.职业) self.__基础力量 = temp[0] self.__基础智力 = temp[1] self.__基础体力 = temp[2] self.__基础精神 = temp[3] self.__力量 = self.__基础力量 self.__智力 = self.__基础智力 self.__体力 = self.__基础体力 self.__精神 = self.__基础精神 temp = 获取属性抗性基础(self.角色, self.职业) self.__火属性抗性 += temp[0] self.__冰属性抗性 += temp[1] self.__光属性抗性 += temp[2] self.__暗属性抗性 += temp[3] temp = 获取异常抗性基础(self.角色, self.职业) 异常状态 = [ "出血", "中毒", "灼伤", "感电", "冰冻", "减速", "眩晕", "诅咒", "失明", "石化", "睡眠", "混乱", "束缚", ] for index in range(0, len(异常状态)): self.异常抗性加成(异常状态[index], temp[index], mode=0) def 职业特殊设置(self): pass # region 返回前端信息 def getinfo(self) -> Dict: info = {} info["alter"] = self.实际名称 info["version"] = self.version info["name"] = self.名称 info["character"] = self.职业 info["role"] = "buffer" if self.类型 == "辅助" else "delear" info["weapon_types"] = self.武器选项 info["carry_type_list"] = self.输出类型选项 info["armor"] = self.防具类型 info["armor_mastery"] = self.防具精通属性 info["buff_ratio"] = self.buff self.set_skill_info(info) self.set_individuation(info) dress_list = {} i = 0 for dress in 装扮集合: 部位 = dress.部位 if 部位 not in dress_list: dress_list[部位] = [] 选项集合 = dress.选项集合 if dress.部位 == "上衣": 选项集合 = 选项集合 + tuple(info["clothes_coat"]) elif dress.部位 == "下装": 选项集合 = 选项集合 + tuple(info["clothes_pants"]) data = {} data["id"] = i data["options"] = 选项集合 data["part"] = 部位 data["rarity"] = dress.品质 data["suit"] = dress.套装 data["name"] = "{品质}装扮{部位}".format(品质=dress.品质, 部位=dress.部位) i += 1 dress_list[部位].append(data) info["dress"] = dress_list info["enchanting"] = get_enchanting_setinfo(self) info["emblem"] = get_emblems_setinfo(self) info["jade"] = get_jade_setinfo() info["especificity"] = get_equ(self.equVersion).get_funs_info( "specificity", self ) info["asrahan"] = get_equ(self.equVersion).get_funs_info("asrahan", self) info["sundries"] = get_sundries_setinfo() for item in info["platinum"]: info["emblem"].append( { "id": item, "maxFame": 232, "position": ["辅助装备", "魔法石"], "props": item + " Lv+1" + " 四维 + 8", "type": "技能", "rarity": "白金", "rate": 2000, } ) return info def set_skills(self): pass def get_acitve_skill_detail( self, skill, temp_info, temp_char, weapon, ratio, skill_info ): if skill.是否有伤害: if len(skill.形态) == 0: skill.形态 = [""] if ( self.实际名称 == "elven_knight" and len(list(filter(lambda x: "6c" in x, skill.形态))) > 0 ): skill.形态 = list(filter(lambda x: "6c" in x, skill.形态)) for 形态 in skill.形态: original = 0 for i in ["直伤", "中毒", "灼伤", "感电", "出血"]: original += skill.等效百分比( char=temp_info, 武器类型=weapon, 形态=形态, 伤害类型=i ) skill_info["skills_active"].append( { "name": skill.名称, "need_level": skill.所在等级, "lv": skill.等级, "data": original * ratio * skill.被动倍率, "cd": skill.等效CD(武器类型=weapon, 输出类型=temp_info.类型, char=temp_info), "mode": 形态, "cost": skill.无色消耗, "tp": skill.TP等级, } ) if skill.是否有护石 == 1: temp = temp_char.get_skill_by_name(skill.名称) cp = 0 for i in ["直伤", "中毒", "灼伤", "感电", "出血"]: cp += temp.等效百分比( char=temp_char, 武器类型=weapon, 形态=形态, 伤害类型=i ) skill_info["skills_cp"].append( { "name": skill.名称, "need_level": skill.所在等级, "lv": skill.等级, "data": cp * ratio * temp.被动倍率, "cd": temp.等效CD(武器类型=weapon, 输出类型=temp_info.类型, char=temp_info), "original_data": original * ratio * skill.被动倍率, "original_cd": skill.等效CD( 武器类型=weapon, 输出类型=temp_info.类型, char=temp_info ), "mode": 形态, "cost": temp.无色消耗, "tp": skill.TP等级, } ) pass pass def get_passive_skill_detail(self, skill, temp_info): if temp_info.类型 == "物理百分比": 倍率 = skill.物理攻击力倍率(temp_info.武器类型) if 倍率 != 1: temp_info.skills_passive[skill.名称]["info"].append( { "type": "物理攻击力", "info": [round((倍率 - 1) * 100), "所有", ""], } ) 倍率 = skill.物理攻击力倍率进图(temp_info.武器类型) if 倍率 != 1: temp_info.skills_passive[skill.名称]["info"].append( { "type": "物理攻击力[进图]", "info": [round((倍率 - 1) * 100), "所有", ""], } ) elif temp_info.类型 == "魔法百分比": 倍率 = skill.魔法攻击力倍率(temp_info.武器类型) if 倍率 != 1: temp_info.skills_passive[skill.名称]["info"].append( { "type": "魔法攻击力", "info": [round((倍率 - 1) * 100), "所有", ""], } ) 倍率 = skill.魔法攻击力倍率进图(temp_info.武器类型) if 倍率 != 1: temp_info.skills_passive[skill.名称]["info"].append( { "type": "魔法攻击力[进图]", "info": [round((倍率 - 1) * 100), "所有", ""], } ) elif temp_info.类型 == "物理固伤" or temp_info.类型 == "魔法固伤": 倍率 = skill.独立攻击力倍率(temp_info.武器类型) if skill.名称 not in temp_info.skills_passive: return if 倍率 != 1: temp_info.skills_passive[skill.名称]["info"].append( { "type": "独立攻击力", "info": [round((倍率 - 1) * 100), "所有", ""], } ) 倍率 = skill.独立攻击力倍率进图(temp_info.武器类型) if skill.名称 not in temp_info.skills_passive: return if 倍率 != 1: temp_info.skills_passive[skill.名称]["info"].append( { "type": "独立攻击力[进图]", "info": [round((倍率 - 1) * 100), "所有", ""], } ) def 设置觉醒技能(self): self.觉醒技能 = [] for i in self.技能栏: if i.是否有伤害 == 1 and i.所在等级 in [50, 85, 100]: self.觉醒技能.append(i.名称) def getskillinfos(self): # 技能等级、技能TP for skill in self.技能栏: if skill.是否有伤害: skill.TP等级 = skill.TP上限 skill.等级 = skill.基础等级 # 宠物 self.加算冷却缩减(0.05) self.技能等级加成("所有", 1, 95, 1) # 光环 self.技能等级加成("所有", 1, 95, 1) # 至尊称号 self.技能等级加成("被动", 95, 95, 1) self.职业特殊设置() # 白金、时装、BUFF self.set_skills() for skill in self.技能栏: self.skills_passive[skill.名称] = { "info": [], "lv": skill.等级, "need_lv": skill.所在等级, } self.加算冷却计算() ratio = self.buff infos = [] for weapon in self.武器选项: temp_info = deepcopy(self) temp_char = deepcopy(self) temp_char.护石栏 = [] for skill in temp_char.技能栏: if skill.是否有伤害 and skill.是否有护石 == 1: temp_char.护石栏.append(skill.名称) skill.装备护石(char=self) temp_info.武器类型 = weapon temp_info.职业特殊计算() temp_info.被动倍率计算() if self.类型 == "物理百分比": ratio *= temp_info.站街物理攻击力倍率() * temp_info.进图物理攻击力倍率() elif self.类型 == "魔法百分比": ratio *= temp_info.站街魔法攻击力倍率() * temp_info.进图魔法攻击力倍率() elif self.类型 == "物理固伤": ratio *= temp_info.站街独立攻击力倍率() * temp_info.进图独立攻击力倍率() elif self.类型 == "魔法固伤": ratio *= temp_info.站街独立攻击力倍率() * temp_info.进图独立攻击力倍率() temp_info.CD倍率计算() temp_info.伤害指数计算() temp_char.武器类型 = weapon temp_char.职业特殊计算() temp_char.被动倍率计算() temp_char.CD倍率计算() temp_char.伤害指数计算() skill_info = { "weapon": weapon, "skills_active": [], "skills_passive": [], "skills_cp": [], "type": temp_info.类型, "buff": temp_info.buff, } for skill in temp_info.技能栏: self.get_acitve_skill_detail( skill, temp_info, temp_char, weapon, ratio, skill_info ) self.get_passive_skill_detail(skill, temp_info) for i in temp_info.skills_passive: skill = temp_info.skills_passive[i] if len(skill["info"]) > 0: for item in skill["info"]: skill_info["skills_passive"].append( { "name": i, "need_level": skill["need_lv"], "lv": temp_info.get_skill_by_name(i).等级, "data": item["info"][0], "type": item["type"], "remark": "{}{}".format( "、".join(item["info"][1].split(",")), "({}除外)".format( "、".join(item["info"][2].split(",")) ) if item["info"][2] != "无" and item["info"][2] != "" and item["info"][2] != 0 else "", ), } ) infos.append(skill_info) return infos def 基础属性加成( self, 物理攻击力=0.00, 魔法攻击力=0.00, 独立攻击力=0.00, 三攻=0, 力量=0.00, 智力=0, 力智=0, 体力=0, 精神=0, 体精=0, 四维=0, 物理暴击率=0.00, 魔法暴击率=0.00, 暴击率=0.00, 攻击速度=0.00, 施放速度=0.00, 移动速度=0.00, 三速=0.00, 火属性抗性=0, 光属性抗性=0, 冰属性抗性=0, 暗属性抗性=0, 所有属性抗性=0, 所有异常抗性=0, 所有职业异常抗性=0, 进图力量=0.00, 进图智力=0.00, **kwargs, ): self.__物理攻击力 += 物理攻击力 + 三攻 self.__魔法攻击力 += 魔法攻击力 + 三攻 self.__独立攻击力 += 独立攻击力 + 三攻 self.__力量 += 力量 + 力智 + 四维 self.__智力 += 智力 + 力智 + 四维 self.__体力 += 体力 + 体精 + 四维 self.__精神 += 精神 + 体精 + 四维 self.__物理暴击率 += float(物理暴击率) + float(暴击率) self.__魔法暴击率 += float(魔法暴击率) + float(暴击率) self.__攻击速度 += float(攻击速度) + float(三速) self.__施放速度 += float(施放速度) + float(三速) self.__移动速度 += float(移动速度) + float(三速) self.__火属性抗性 += 火属性抗性 + 所有属性抗性 self.__光属性抗性 += 光属性抗性 + 所有属性抗性 self.__冰属性抗性 += 冰属性抗性 + 所有属性抗性 self.__暗属性抗性 += 暗属性抗性 + 所有属性抗性 self.进图力量 += 进图力量 self.进图智力 += 进图智力 for 类型 in [ "中毒", "灼伤", "感电", "出血", "冰冻", "减速", "眩晕", "诅咒", "失明", "石化", "睡眠", "混乱", "束缚", ]: self.__异常抗性[类型] = self.__异常抗性.get(类型, 0.0) + 所有异常抗性 self.__异常抗性_职业基础[类型] = ( self.__异常抗性_职业基础.get(类型, 0.0) + 所有职业异常抗性 ) super().基础属性加成( 物理攻击力, 魔法攻击力, 独立攻击力, 三攻, 力量, 智力, 力智, 体力, 精神, 体精, 四维, 物理暴击率, 魔法暴击率, 暴击率, 攻击速度, 施放速度, 移动速度, 三速, 火属性抗性, 光属性抗性, 冰属性抗性, 暗属性抗性, 所有属性抗性, 所有异常抗性, 所有职业异常抗性, 进图力量, 进图智力, ) def set_skill_info( self, info, rune_except=[], clothes_pants=[], rune_start_lv=20 ) -> None: skillInfo = [] # 技能 rune = [] # 符文 talisman = [] # 护石 platinum = [] # 白金 clothes_coat = [] # 时装 for skill in self.技能栏: skill.等级 = skill.基础等级 skillInfo.append( { "name": skill.名称, "type": skill.是否有伤害, "need_level": skill.所在等级, "level_master": skill.等级精通, "level_max": skill.等级上限, "cooldown": 0 if not skill.是否有伤害 else ( skill.CD[skill.等级] if isinstance(skill.CD, list) else skill.CD ), "current_level": skill.基础等级, "data": 0 if not skill.是否有伤害 else skill.等效百分比(char=self), "tp_max": skill.TP上限 if skill.是否有伤害 else None, "tp_level": skill.TP等级 if skill.是否有伤害 else None, "mode": [] if not skill.是否有伤害 else skill.形态, } ) # 护石 if skill.是否有伤害 == 1 and skill.是否有护石 == 1: talisman.append(skill.名称) # 符文 if ( skill.所在等级 >= rune_start_lv and skill.所在等级 <= 80 and skill.所在等级 != 50 and ( skill.是否有伤害 == 1 or (skill.是否主动 == 1 and self.类型 == "辅助") ) and skill.名称 not in rune_except ): rune.append(skill.名称) # 白金 if ( skill.所在等级 >= 15 and skill.所在等级 <= 70 and skill.所在等级 not in [48, 50] ): platinum.append(skill.名称) # 时装 if skill.所在等级 <= 95: clothes_coat.append(skill.名称) if self.类型 == "辅助": talisman += self.护石技能 info["skills"] = skillInfo info["rune"] = rune info["talisman"] = talisman info["platinum"] = platinum info["clothes_coat"] = clothes_coat info["clothes_pants"] = clothes_pants def set_individuation(self, info) -> None: pass # endregion # region 词条属性 def set_eq_params(self, key, value): self.eq_params[key] = value def add_eq_params(self, key, value, default=0): self.eq_params[key] = self.eq_params.get(key, default) + value def multiply_eq_params(self, key, value, default=1): self.eq_params[key] = self.eq_params.get(key, default) * value def get_eq_params(self, key, default=0): return self.eq_params.get(key, default) def 基础精通加成(self, x: float) -> None: self.__基础精通倍率 *= 1 + x def 百分比防御减少(self, x: float) -> None: self.__百分比减防 += x def 固定防御减少(self, x: int) -> None: self.__固定减防 += x def 伤害类型转化(self, 类型1: str, 类型2: str, x: float) -> None: # 直伤 中毒 灼伤 感电 出血 # if self.伤害比例.get(类型1, 0.0) - x <= 0: # pass self.伤害比例[类型1] = max(self.伤害比例.get(类型1, 0.0) - x, 0) self.伤害比例[类型2] = self.伤害比例.get(类型2, 0.0) + x def 异常增伤(self, 类型: str, x: float) -> None: # 中毒 灼伤 感电 出血 self.伤害系数[类型] = self.伤害系数.get(类型, 1.0) + x def 异常抗性加成(self, 类型: str, x: float, mode: int = 1) -> None: # 中毒 灼伤 感电 出血 冰冻 减速 眩晕 诅咒 失明 石化 睡眠 混乱 束缚 if mode == 1: self.__异常抗性[类型] = self.__异常抗性.get(类型, 0.0) + x else: self.__异常抗性_职业基础[类型] = self.__异常抗性_职业基础.get(类型, 0.0) + x def 异常抗性获取(self, 类型: str, mode: int = 1) -> float: # mode = 1 显示抗性 mode = 0 装备加成抗性 return round( self.__异常抗性.get(类型, 0.0) + (self.__异常抗性_职业基础.get(类型, 0.0) if mode == 1 else 0.0), 4, ) def 属性攻击(self, 类型: str) -> None: pass def 所有异常抗性加成(self, x: float, mode: int = 1) -> None: for 类型 in [ "中毒", "灼伤", "感电", "出血", "冰冻", "减速", "眩晕", "诅咒", "失明", "石化", "睡眠", "混乱", "束缚", ]: self.异常抗性加成(类型, x, mode) def 指令效果加成(self, 类型: str, x: float) -> None: # 所有 消耗无色 不消耗无色 (觉醒技能默认除外) self.__指令效果[类型] = self.__指令效果.get(类型, 1.0) * (1 + x) def 指令技攻加成(self, x: float, min=1, max=100, exc=[], excName=[]) -> None: count = 0 for i in self.技能栏: if ( i.所在等级 >= min and i.所在等级 <= max and i.所在等级 not in exc and i.手搓 and i.名称 not in excName ): count += 1 if i.是否有伤害 == 1: i.倍率 *= 1 + x * self.技能伤害增加增幅 if i.名称 == "鬼连斩": self.get_skill_by_name("鬼连斩:极").额外加成 /= ( 1 + x * self.技能伤害增加增幅 ) return count def MP消耗量加成(self, x: float) -> None: self.__MP消耗量 += x def 攻击强化加成(self, x: float) -> None: self.__攻击强化 += x def 百分比攻击强化加成(self, x: float) -> None: self.__百分比攻击强化 += x super().百分比攻击强化加成(x) def buff量加成(self, x: float) -> None: self.__buff量 += x def 辅助属性加成( self, buff固定力智=0, buff百分比力智=0.0, buff固定三攻=0, buff百分比三攻=0.0, 觉醒固定力智=0, 觉醒百分比力智=0.0, buff量=0, 百分比buff量=0.0, 觉醒百分比力智Total=0.0, ): self.__buff固定力智 += buff固定力智 self.__buff百分比力智 *= 1.0 + buff百分比力智 self.__buff固定三攻 += buff固定三攻 self.__buff百分比三攻 *= 1.0 + buff百分比三攻 self.__觉醒固定力智 += 觉醒固定力智 self.__觉醒百分比力智 *= 1.0 + 觉醒百分比力智 self.__觉醒百分比力智Total *= 1.0 + 觉醒百分比力智Total self.__buff量 += buff量 self.__百分比buff量 += 百分比buff量 super().辅助属性加成( buff固定力智, buff百分比力智, buff固定三攻, buff百分比三攻, 觉醒固定力智, 觉醒百分比力智, buff量, 百分比buff量, ) def 附加伤害加成(self, x: float, 辟邪玉加成=1) -> None: self.__附加伤害 += self.附加伤害增加增幅 * x if 辟邪玉加成 == 1 else x def 持续伤害加成(self, x: float) -> None: self.__持续伤害 += x def 属性附加加成(self, x: float) -> None: self.__属性附加 += self.属性附加伤害增加增幅 * x def 技能攻击力加成( self, x: float, 辟邪玉加成=1, 适用累加=1, part="", show=True ) -> None: if x != 0: self.技攻列表[part] = self.技攻列表.get(part, []) + [x] last = 0 if 辟邪玉加成 == 1: if 适用累加 == 0: last = self.技能伤害增加增幅 * x # self.技能攻击力 *= 1 + self.技能伤害增加增幅 * x else: if self.技能攻击力累加 > 2: # 累计已经大于2不再加成 # self.技能攻击力 *= 1 + x last = x elif ( self.技能攻击力累加 + x > 2 ): # 此次累计导致大于2,一部分加成,一部分不加成 overflow = self.技能攻击力累加 + x - 2 # 溢出部分 # self.技能攻击力 *= 1 + self.技能伤害增加增幅 * (x - overflow) + overflow last = self.技能伤害增加增幅 * (x - overflow) + overflow else: # 累计后仍小于等于2 # self.技能攻击力 *= 1 + self.技能伤害增加增幅 * x last = self.技能伤害增加增幅 * x self.技能攻击力累加 += x # 累计计算 else: last = x # self.技能攻击力 *= 1 + x self.技能攻击力 *= 1 + last self.__面板技能攻击力 *= 1 + (last if show else 0) # print(self.技攻列表) super().技能攻击力加成(x=x) def 暴击伤害加成(self, x: float, 辟邪玉加成=1) -> None: self.__暴击伤害 += self.暴击伤害增加增幅 * x if 辟邪玉加成 == 1 else x def 伤害增加加成(self, x: float, 辟邪玉加成=1) -> None: self.__伤害增加 += self.伤害增加增幅 * x if 辟邪玉加成 == 1 else x def 最终伤害加成(self, x: float, 辟邪玉加成=1) -> None: self.__最终伤害 += self.最终伤害增加增幅 * x if 辟邪玉加成 == 1 else x def 百分比力智加成(self, x: float, 辟邪玉加成=1) -> None: self.__百分比力智 += self.力量智力增加增幅 * x if 辟邪玉加成 == 1 else x def 百分比三攻加成(self, x: float, 辟邪玉加成=1) -> None: self.__百分比三攻 += self.物理魔法攻击力增加增幅 * x if 辟邪玉加成 == 1 else x def 火属性强化加成(self, x: float, 辟邪玉加成=1, mode=0) -> None: if mode == 0: self.__火属性强化 += self.所有属性强化增幅 * x if 辟邪玉加成 == 1 else x else: self.__火属性强化 += int(self.所有属性强化增幅 * x) def 冰属性强化加成(self, x: float, 辟邪玉加成=1, mode=0) -> None: if mode == 0: self.__冰属性强化 += self.所有属性强化增幅 * x if 辟邪玉加成 == 1 else x else: self.__冰属性强化 += int(self.所有属性强化增幅 * x) def 光属性强化加成(self, x: float, 辟邪玉加成=1, mode=0) -> None: if mode == 0: self.__光属性强化 += self.所有属性强化增幅 * x if 辟邪玉加成 == 1 else x else: self.__光属性强化 += int(self.所有属性强化增幅 * x) def 暗属性强化加成(self, x: float, 辟邪玉加成=1, mode=0) -> None: if mode == 0: self.__暗属性强化 += self.所有属性强化增幅 * x if 辟邪玉加成 == 1 else x else: self.__暗属性强化 += int(self.所有属性强化增幅 * x) def 所有属性强化加成( self, 所有属性强化: float = 0, 火属性强化: float = 0.00, 冰属性强化: float = 0.00, 光属性强化: float = 0.00, 暗属性强化: float = 0.00, 辟邪玉加成=1, mode=0, ) -> None: super().所有属性强化加成( 所有属性强化, 火属性强化, 冰属性强化, 光属性强化, 暗属性强化 ) 火属性强化 += 所有属性强化 冰属性强化 += 所有属性强化 光属性强化 += 所有属性强化 暗属性强化 += 所有属性强化 # if 火属性强化 > 0: self.火属性强化加成(火属性强化, 辟邪玉加成, mode) # if 冰属性强化 > 0: self.冰属性强化加成(冰属性强化, 辟邪玉加成, mode) # if 光属性强化 > 0: self.光属性强化加成(光属性强化, 辟邪玉加成, mode) # if 暗属性强化 > 0: self.暗属性强化加成(暗属性强化, 辟邪玉加成, mode) # if mode == 0: # temp = self.所有属性强化增幅 * 所有属性强化 if 辟邪玉加成 == 1 else 所有属性强化 # else: # temp = int(self.所有属性强化增幅 * 所有属性强化) # self.__所有属性强化(temp) # super().属性强化加成(所有属性强化=所有属性强化) def 火属性抗性加成(self, x: int) -> None: self.__火属性抗性 += x def 冰属性抗性加成(self, x: int) -> None: self.__冰属性抗性 += x def 光属性抗性加成(self, x: int) -> None: self.__光属性抗性 += x def 暗属性抗性加成(self, x: int) -> None: self.__暗属性抗性 += x def 所有属性抗性加成(self, x: int) -> None: self.火属性抗性加成(x) self.冰属性抗性加成(x) self.光属性抗性加成(x) self.暗属性抗性加成(x) def 攻击速度增加(self, x: float, part: str = "") -> None: if part != "武器" and part != "特性": self.__攻击速度 += x else: self.__攻击速度_其他 += x def 攻击速度(self) -> float: return self.__攻击速度 def 移动速度增加(self, x: float) -> None: self.__移动速度 += x def 施放速度增加(self, x: float) -> None: self.__施放速度 += x def 所有速度增加(self, x: float, part: str = "") -> None: if part != "武器" and part != "特性": self.__攻击速度 += x else: self.__攻击速度_其他 += x self.__移动速度 += x self.__施放速度 += x def 命中率增加(self, x: float) -> None: self.__命中率 += x def 回避率增加(self, x: float) -> None: self.__回避率 += x def 物理暴击率增加(self, x: float) -> None: self.__物理暴击率 += x def 魔法暴击率增加(self, x: float) -> None: self.__魔法暴击率 += x def 暴击率增加(self, x: float) -> None: self.物理暴击率增加(x) self.魔法暴击率增加(x) def buff技能等级加成(self, LV: int, lv: int) -> None: # LV级 buff技能等级 + lv pass def 特殊主动等级加成(self, Lv: int, lv: int) -> None: for i in self.技能栏: if ( i.所在等级 == Lv and i.是否主动 == 1 and i.名称 not in ["念兽:龙虎啸", "风雷啸", "圣灵符文", "神圣之光"] ): i.等级加成(lv, char=self) def 技能获取(self, min: int, max: int, exc=[]) -> None: temp = [] for i in self.技能栏: if ( i.所在等级 >= min and i.所在等级 <= max and i.是否主动 == 1 and i.名称 not in exc ): temp.append(i.名称) return temp def 技能等级加成( self, 加成类型: str, min: int, max: int, lv: int, exc=[], excName=[] ) -> None: for i in self.技能栏: if ( i.所在等级 >= min and i.所在等级 <= max and i.所在等级 not in exc and i.名称 not in excName ): if 加成类型 == "所有": i.等级加成(lv, char=self) else: if (i.是否主动 == 1) == (加成类型 == "主动"): i.等级加成(lv, char=self) super().技能等级加成(加成类型, min, max, lv, exc) def 技能冷却缩减(self, min: int, max: int, x: float, exc=[], excName=[]) -> None: if min == 1 and max == 100: self.冷却缩减 *= 1 - x for i in self.技能栏: if ( i.所在等级 >= min and i.所在等级 <= max and i.所在等级 not in exc and i.名称 not in excName ): if i.是否有伤害 == 1: i.CDR *= 1 - x def 无色技能加成(self, cost=0, x=0, min=1, max=100): # 不消耗无色的技能加成 if cost == 0: for skill in self.技能队列: if not (min == 1 and max == 100): lv = self.get_skill_by_name(skill["名称"]).所在等级 if lv < min or lv > max: continue if ( skill["名称"] == "神罚之锤" and self.实际名称 == "crusader_male_carry" ): skill["倍率"] *= ( 1 + x * self.get_skill_by_name("神罚之锤").非无色占比() ) elif skill["无色消耗"] == 0 and skill["名称"] != "鬼连斩:极": skill["倍率"] *= 1 + x pass if cost > 0: for skill in self.技能队列: if not (min == 1 and max == 100): lv = self.get_skill_by_name(skill["名称"]).所在等级 if lv < min or lv > max: continue if ( skill["名称"] == "神罚之锤" and self.实际名称 == "crusader_male_carry" ): skill["倍率"] *= ( 1 + x * self.get_skill_by_name("神罚之锤").无色占比() ) elif skill["无色消耗"] >= cost: skill["倍率"] *= 1 + x pass def 加算冷却缩减(self, x: float) -> None: self.__加算冷却缩减 += x def 技能恢复加成(self, min: int, max: int, x: float, exc=[], excName=[]) -> None: if min == 1 and max == 100: self.冷却恢复 += x for i in self.技能栏: if ( i.所在等级 >= min and i.所在等级 <= max and i.所在等级 not in exc and i.名称 not in excName ): if i.是否有伤害 == 1: i.恢复 += x def 技能倍率加成( self, min: int, max: int, x: float, exc=[], type="all", excName=[], changeSkill=False, ) -> None: for i in self.技能栏: if ( i.所在等级 >= min and i.所在等级 <= max and i.所在等级 not in exc and i.名称 not in excName ): if i.是否有伤害 == 1: if type == "all" or (type == "active" and i.是否主动 == 1): if changeSkill: i.倍率 *= 1 + x * self.技能伤害增加增幅 else: i.技攻 *= 1 + x * self.技能伤害增加增幅 def 单技能加成(self, 名称: str, 倍率=1.0, CD=1.0, lv=0) -> None: i = self.get_skill_by_name(名称) i.等级加成(lv, char=self) if i.是否有伤害 == 1: i.倍率 *= 倍率 i.CDR *= CD def __所有属性强化(self, x: float) -> None: self.__火属性强化 += x self.__冰属性强化 += x self.__光属性强化 += x self.__暗属性强化 += x def 斗神宠物加成(self, x: float) -> None: self.斗神宠物 += x # endregion # region 面板相关函数 # 基础力量智力(站街力量智力) def 站街力量(self) -> int: return int(self.__力量) def 站街智力(self) -> int: return int(self.__智力) def MP消耗倍率(self) -> float: return self.__MP消耗量 def 火属性强化(self) -> float: if self.check_fun_by_id(20045): return max( [ self.__火属性强化, self.__冰属性强化, self.__光属性强化, self.__暗属性强化, ] ) return self.__火属性强化 def 冰属性强化(self) -> float: if self.check_fun_by_id(20045): return max( [ self.__火属性强化, self.__冰属性强化, self.__光属性强化, self.__暗属性强化, ] ) return self.__冰属性强化 def 光属性强化(self) -> float: if self.check_fun_by_id(20045): return max( [ self.__火属性强化, self.__冰属性强化, self.__光属性强化, self.__暗属性强化, ] ) return self.__光属性强化 def 暗属性强化(self) -> float: if self.check_fun_by_id(20045): return max( [ self.__火属性强化, self.__冰属性强化, self.__光属性强化, self.__暗属性强化, ] ) return self.__暗属性强化 def 火属性抗性(self) -> float: return int(self.__火属性抗性 * self.属强抗性倍率) def 冰属性抗性(self) -> float: return int(self.__冰属性抗性 * self.属强抗性倍率) def 光属性抗性(self) -> float: return int(self.__光属性抗性 * self.属强抗性倍率) def 暗属性抗性(self) -> float: return int(self.__暗属性抗性 * self.属强抗性倍率) def 被动力智系数(self) -> float: return 0 # 新词条计算的力量智力 def 基础面板力量(self) -> float: return ( ( self.__力量 + int( (self.__力量 - self.__基础力量) * self.系统奶系数 + self.系统奶基数 ) ) + self.进图力量 ) * (1 + self.被动力智系数()) def 基础面板智力(self) -> float: return ( ( self.__智力 + int( (self.__智力 - self.__基础智力) * self.系统奶系数 + self.系统奶基数 ) ) + self.进图智力 ) * (1 + self.被动力智系数()) # 旧词条计算的力量智力(图内力量智力) def 面板力量(self) -> float: return (self.基础面板力量()) * (1 + self.__百分比力智) def 面板智力(self) -> float: return (self.基础面板智力()) * (1 + self.__百分比力智) # 站街生效的技能三攻倍率 def 站街物理攻击力倍率(self) -> float: 站街物理攻击倍率 = 1.0 for i in self.技能栏: if hasattr(i, "物理攻击力倍率"): 倍率 = i.物理攻击力倍率(self.武器类型) if 倍率 != 1 and 倍率 is not None: 站街物理攻击倍率 *= 倍率 return 站街物理攻击倍率 def 站街魔法攻击力倍率(self) -> float: 站街魔法攻击倍率 = 1.0 for i in self.技能栏: if hasattr(i, "魔法攻击力倍率"): 倍率 = i.魔法攻击力倍率(self.武器类型) if 倍率 != 1 and 倍率 is not None: 站街魔法攻击倍率 *= 倍率 return 站街魔法攻击倍率 def 站街独立攻击力倍率(self) -> float: 站街独立攻击倍率 = 1.0 for i in self.技能栏: if hasattr(i, "独立攻击力倍率"): 倍率 = i.独立攻击力倍率(self.武器类型) if 倍率 != 1 and 倍率 is not None: 站街独立攻击倍率 *= 倍率 return 站街独立攻击倍率 def 进图物理攻击力倍率(self) -> float: 进图物理攻击倍率 = 1.0 for i in self.技能栏: if hasattr(i, "物理攻击力倍率进图"): 倍率 = i.物理攻击力倍率进图(self.武器类型) if 倍率 != 1 and 倍率 is not None: 进图物理攻击倍率 *= 倍率 return 进图物理攻击倍率 def 进图魔法攻击力倍率(self) -> float: 进图魔法攻击倍率 = 1.0 for i in self.技能栏: if hasattr(i, "魔法攻击力倍率进图"): 倍率 = i.魔法攻击力倍率进图(self.武器类型) if 倍率 != 1 and 倍率 is not None: 进图魔法攻击倍率 *= 倍率 return 进图魔法攻击倍率 def 进图独立攻击力倍率(self) -> float: 进图独立攻击倍率 = 1.0 for i in self.技能栏: if hasattr(i, "独立攻击力倍率进图"): 倍率 = i.独立攻击力倍率进图(self.武器类型) if 倍率 != 1 and 倍率 is not None: 进图独立攻击倍率 *= 倍率 return 进图独立攻击倍率 # 站街三攻 def 站街物理攻击力(self) -> float: return self.__物理攻击力 * self.站街物理攻击力倍率() def 站街魔法攻击力(self) -> float: return self.__魔法攻击力 * self.站街魔法攻击力倍率() def 站街独立攻击力(self) -> float: return self.__独立攻击力 * self.站街独立攻击力倍率() # 新词条计算的三攻(旧词条需要额外乘百分比三攻) def 基础面板物理攻击力(self) -> float: 面板物理攻击 = self.__物理攻击力 + int(self.__进图三攻) for i in self.技能栏: 面板物理攻击 *= i.物理攻击力倍率进图(self.武器类型) return 面板物理攻击 * self.站街物理攻击力倍率() def 基础面板魔法攻击力(self) -> float: 面板魔法攻击 = self.__魔法攻击力 + int(self.__进图三攻) for i in self.技能栏: 面板魔法攻击 *= i.魔法攻击力倍率进图(self.武器类型) return 面板魔法攻击 * self.站街魔法攻击力倍率() def 基础面板独立攻击力(self) -> float: 面板独立攻击 = self.__独立攻击力 + int(self.__进图三攻) for i in self.技能栏: 面板独立攻击 *= i.独立攻击力倍率进图(self.武器类型) return 面板独立攻击 * self.站街独立攻击力倍率() # 图内显示的三攻(不参与伤害计算) def 面板物理攻击力(self) -> float: 面板物理攻击 = ( self.基础面板物理攻击力() * (1 + self.__百分比三攻) * (self.斗神宠物加成) ) return 面板物理攻击 def 面板魔法攻击力(self) -> float: 面板魔法攻击 = ( self.基础面板魔法攻击力() * (1 + self.__百分比三攻) * (self.斗神宠物加成) ) return 面板魔法攻击 def 面板独立攻击力(self) -> float: 面板独立攻击 = self.基础面板独立攻击力() * (1 + self.__百分比三攻) return 面板独立攻击 # endregion # region 其它函数 # def get_skill_by_name(self, name) -> 技能 | 主动技能 | 被动技能: def 部位是否穿戴(self, part): if self.部位装备.get(part, None) is None and part not in [ "光环", "武器装扮", "皮肤", "宠物装备-红", "宠物装备-绿", "宠物装备-蓝", "快捷装备", ]: return False else: return True def get_skill_by_name(self, name) -> Union[技能, 主动技能, 被动技能]: return self.技能栏[self.技能序号.get(name, 0)] def 已穿戴神话(self): for i in self.装备栏: temp = get_equ(self.equVersion).get_equ_by_id(i) if temp.品质 == "神话": return True return False def 传说词条等级之和(self): total = 0 for i in self.装备栏: temp = get_equ(self.equVersion).get_equ_by_id(i) if ( temp.等级 == 105 and temp.部位 not in ["称号", "宠物"] and temp.品质 == "传说" ): total += sum(self.词条等级.get(temp.部位, [0])) return total def 已传说装备数目(self): count = 0 for i in self.装备栏: temp = get_equ(self.equVersion).get_equ_by_id(i) if ( temp.等级 == 105 and temp.部位 not in ["称号", "宠物"] and temp.品质 == "传说" ): count += 1 return count def 穿戴低于105(self): for i in self.装备栏: temp = get_equ(self.equVersion).get_equ_by_id(i) if temp.等级 < 105 and temp.部位 not in ["称号", "宠物"]: return True return False def 获取强化等级(self, part=[]): num = 0 temp = part if len(temp) == 0: temp += 部位列表 for i in temp: num += self.打造详情.get(i, {}).get("cursed_number", 0) return num def 获取改造等级(self, part=[]): num = 0 temp = part if len(temp) == 0: temp += 部位列表 for i in temp: num += self.打造详情.get(i, {}).get("wisdom_number", 0) return num # endregion # 打造设置 def __打造设置(self, setinfo): self.打造详情 = setinfo for i in 部位列表 + ( "称号", "宠物", "光环", "武器装扮", "皮肤", "宠物装备-红", "宠物装备-绿", "宠物装备-蓝", "快捷装备", ): from core.equipment.enchanting import get_encfunc_by_id id = setinfo.get(i, {}).get("enchanting", 0) self.部位附魔[i] = get_encfunc_by_id(id) def 技能队列设置(self, setinfo): self.技能队列 = [] for item in setinfo: self.技能队列.append( { "名称": item["name"], "无色消耗": self.get_skill_by_name(item["name"]).无色消耗, "倍率": 1.0, "等级变化": 0, "CDR": 1.0, "恢复": 0, "形态": item.get("mode", ""), } ) def __药剂设置(self, setinfo): self.药剂 = setinfo def __怪物信息设置(self, id): from core.basic.monster import get_monster_data data = get_monster_data(str(id)) self.防御输入 = data["防御"] self.火抗输入 = data["火抗"] self.冰抗输入 = data["冰抗"] self.光抗输入 = data["光抗"] self.暗抗输入 = data["暗抗"] pass def __场景设置(self, id): from core.basic.monster import get_scene_data data = get_scene_data(str(id)) self.系统奶系数 = data["系统奶系数"] self.系统奶基数 = data["系统奶基数"] self.防御系数 = data["防御系数"] pass # 设置技能相关参数 def __skill_set(self, setinfo): for i in setinfo: k = self.get_skill_by_name(i["name"]) k.等级 = i["level"] k.TP等级 = i["tp"] k.手搓 = i["direct"] k.手搓指令数 = i["directNumber"] k.count = i["count"] # 设置装备选项参数 def __equ_chose_set(self, setinfo): get_equ(self.equVersion).set_func_chose(setinfo) # for i in setinfo: # equ.set_func_chose({i['id']: i['select']}) def hotkey_set(self, setinfo): self.hotkey = setinfo def __set_char(self, info): self.类型 = info["carry_type"] if self.类型 != "辅助" else self.类型 try: self.buff = info["buff_ratio"] / 100 + 1 except Exception: raise ResponseException("请在技能页设置buff倍率") self.护石栏 = info["talisman_set"] self.符文 = info["rune_set"] pass # 设置穿戴的装备 def __穿戴装备(self, idlist): self.装备栏 = [] self.部位装备 = {} idlist = sorted(idlist) for i in idlist: 装备 = get_equ(self.equVersion).get_equ_by_id(i) self.部位装备.update({装备.部位: i}) for k in self.部位装备.keys(): self.装备栏.append(self.部位装备[k]) def __穿戴装扮(self, info): self.装扮栏 = {} self.装扮选项 = {} for i in info: self.装扮栏[i] = info[i].get("id", 0) self.装扮选项[i] = info[i].get("option", 0) # print(len(self.装扮栏)) # region 伤害计算相关函数 def __计算前预处理(self): # 防止中途变更影响其他计算 self.__equ_chose_set(self.trigger_set) self.设置觉醒技能() self.职业特殊设置() self.__辟邪玉计算() self.护石计算() self.符文计算() self.装备属性计算() self.skills_passive = {} for i in self.技能栏: self.skills_passive[i.名称] = {"info": [], "lv": i.等级} self.职业特殊计算() if self.类型 != "辅助": self.CD倍率计算() self.加算冷却计算() self.被动倍率计算() self.伤害指数计算() def 适用数值计算(self): 进图智力 = 0 进图体力 = 0 进图精神 = 0 for skill in self.技能栏: if skill.是否启用: 结算 = skill.结算统计(self) if skill.站街生效: self.__智力 += 结算[2] self.__体力 += 结算[3] self.__精神 += 结算[4] else: 进图智力 += 结算[2] 进图体力 += 结算[3] 进图精神 += 结算[4] 进图 = 0 BUFF补正 = 0 if self.适用属性 == "体力": 进图 = self.__体力 + 进图体力 BUFF补正 = self.__BUFF补正体力 elif self.适用属性 == "精神": 进图 = self.__精神 + 进图精神 BUFF补正 = self.__BUFF补正精神 else: 进图 = self.__智力 + 进图智力 BUFF补正 = self.__BUFF补正智力 awake = self.get_skill_by_name("一次觉醒") buff = self.get_skill_by_name("BUFF") awake.适用数值 = 进图 awake.一觉力智 = self.__觉醒固定力智 awake.一觉力智per = self.__觉醒百分比力智 awake.一觉力智perTotal = self.__觉醒百分比力智Total buff.适用数值 = 进图 + BUFF补正 buff.BUFF力智per = self.__buff百分比力智 buff.BUFF力智 = self.__buff固定力智 buff.BUFF三攻per = self.__buff百分比三攻 buff.BUFF三攻 = self.__buff固定三攻 self.适用数值 = 进图 # print('copaosee:', self.适用数值, [ # self.__智力, self.__体力, self.__精神], 进图, BUFF补正) def 站街系数(self): if self.适用属性 == "体力": return self.__体力 elif self.适用属性 == "精神": return self.__精神 return self.__智力 def 提升率计算(self, 总数据): 力智合计 = 0 三攻合计 = 0 for i in 总数据: 力智合计 += i[0] 三攻合计 += i[1] x1 = ( ( self.辅助对象力智 + (self.辅助对象力智 - 950) * self.系统奶系数 + self.系统奶基数 ) / 250 + 1 ) * self.辅助对象三攻 x2 = ( ( self.辅助对象力智 + (self.辅助对象力智 - 950) * self.系统奶系数 + self.系统奶基数 + 力智合计 ) / 250 + 1 ) * (self.辅助对象三攻 + 三攻合计) return [ x2 / x1 * 100 * self.被动增伤倍率, int(self.站街系数()), 力智合计, 三攻合计, ] def BUFF量(self): return self.__buff量 * (1 + self.__百分比buff量) def 辅助计算(self): self.适用数值计算() data = {} data["无色消耗"] = 0 skills = {} values = [] CDR = [] for i in self.技能栏: rs = i.结算统计(self)[:2] cd = "-" if not i.是否主动 else i.等效CD() cd_p = "-" if not i.是否主动 else round(100 - i.等效CD() / i.CD * 100, 2) k = {} k["name"] = i.名称 k["data"] = rs if hasattr(i, "适用数值"): k["apply_status"] = i.适用数值 if sum(rs) > 0 or cd != "-": values.append(rs) skills[i.名称] = { "name": i.名称, "level": i.等级, "data": rs, "cd": cd, "cd_p": cd_p, } if i.是否主动: CDR.append( (i.名称,cd_p/100,cd) ) pass 结果 = self.提升率计算(values) data["total_data"] = 结果[0] data["buffer_addition"] = 结果 data["skills"] = skills data["CDR"] = CDR return data def 结果计算(self): if self.类型 == "辅助": return self.辅助计算() else: return self.伤害计算() def 职业特殊计算(self): pass def 伤害计算技能特殊处理(self, skill: 技能): pass def 异常系数计算(self, item, skill): cur = item pa = "" if item == "中毒": pa = "zd_rate" if item == "出血": pa = "cx_rate" if item == "感电": pa = "gd_rate" if item == "灼伤": pa = "zs_rate" if ( item == "灼伤" and "灼伤" in get_global_data("state_type", self.equVersion) and ( "冰冻" in get_global_data("get_state_type", self.equVersion) or ( "冰冻" in get_global_data("state_type", self.equVersion) and self.check_equ_by_name("永眠前的准备") ) ) ): pa = "zs_bd_rate" cur = "灼伤破冰" 保有率 = 0 异常基础加成 = 1.0 异常结算加成 = 1.0 装备加成异常结算 = 1.0 if pa == "zs_bd_rate": 保有率 = self.异常保有率计算(pa, cur) 异常基础加成 = 1.0 异常结算加成 = self.异常基础加成["灼伤破冰"] 装备加成异常结算 = self.异常结算加成.get(cur, 1.0) else: 保有率 = self.异常保有率计算(pa, cur) # 叠层处理 异常基础加成 = 1 + (self.异常基础加成.get(cur, 1.0) - 1) * get_global_data( pa, self.equVersion, 1.0 ) 异常结算加成 = 1.0 装备加成异常结算 = self.异常结算加成.get(cur, 1.0) 系数 = self.伤害系数.get(item, 0.0) * ( (1 - 保有率) * 异常基础加成 + 保有率 * 异常基础加成 * 异常结算加成 * 装备加成异常结算 ) return 系数 pass def 伤害计算(self): data = {} total_data = 0 skill_dict = {} # 无色消耗 = 0 CDR = [] for i in self.技能队列: k = self.get_skill_by_name(i["名称"]) if k.是否有伤害 == 1: temp = skill_dict.get(k.名称, {}) self.伤害计算技能特殊处理(k) if k.名称 not in data.keys(): temp["rate"] = k.被动倍率 if temp.get("cd", 0) > 0: temp["cd"] = ( k.等效CD( 武器类型=self.武器类型, 输出类型=self.类型, 额外CDR=i["CDR"], 额外恢复=i["恢复"], 形态=i["形态"], char=self ) + temp["cd"] * temp["count"] ) / (temp["count"] + 1) else: temp["cd"] = k.等效CD( 武器类型=self.武器类型, 输出类型=self.类型, 额外CDR=i["CDR"], 额外恢复=i["恢复"], 形态=i["形态"], char=self ) temp["mp"] = k.MP消耗( 武器类型=self.武器类型, 输出类型=self.类型, 额外倍率=self.__MP消耗量, char=self, ) temp["atk_rate"] = k.等效百分比( 武器类型=self.武器类型, 形态=i["形态"], char=self ) temp["cosume_cube_frag"] = k.无色消耗 temp["level"] = k.等级 temp["cd_o"] = k.CD[k.等级] if isinstance(k.CD, list) else k.CD temp["cd_unsave"] = ( (k.恢复 + i["恢复"]) if temp.get("cd_unsave", 1) == 1 else (temp.get("cd_unsave", 1) + k.恢复 + i["恢复"]) / 2 ) 直伤 = k.等效百分比( 武器类型=self.武器类型, 额外等级=i["等级变化"], 额外倍率=i["倍率"], 伤害类型="直伤", 形态=i["形态"], char=self, ) # 直伤处理:直伤伤害*比例*系数 damage = ( 直伤 * self.伤害指数 * k.被动倍率 * (self.伤害比例.get("直伤", 0.0)) / 100 ) for item in ["中毒", "灼伤", "感电", "出血"]: 系数 = self.异常系数计算(item, k) # 直伤转换的异常处理:直伤伤害*异常比例*异常系数 damage += ( 直伤 * self.伤害指数 * k.被动倍率 * (self.伤害比例.get(item, 0.0) * 系数) / 100 ) # 异常伤害处理:异常伤害*异常系数 damage += ( k.等效百分比( 武器类型=self.武器类型, 额外等级=i["等级变化"], 额外倍率=i["倍率"], 伤害类型=item, 形态=i["形态"], char=self, ) * self.伤害指数 * k.被动倍率 * 系数 / 100 ) total_data += damage temp["name"] = k.名称 temp["damage"] = temp.get("damage", 0) + round(damage,0) temp["count"] = temp.get("count", 0) + 1 skill_dict[k.名称] = temp # if k.名称 not in ['爆裂弹', '杀意波动', '万毒噬心诀', '神罚之锤']: # 无色消耗 += i['无色消耗'] # if k.CD > 1: # CDR.append( # (k.名称, round(1 - temp.get('cd', 0)/temp.get('cd_o', 0), 4))) data["skills_passive"] = {} for i in self.技能栏: if i.关联技能 != ["无"] or i.冷却关联技能 != ["无"]: temp = {} temp["lv"] = i.等级 temp["name"] = i.名称 data["skills_passive"][i.名称] = temp if skill_dict.get(i.名称, None) is not None: if (i.CD[k.等级] if isinstance(i.CD, list) else i.CD) > 1: temp = skill_dict.get(i.名称, {}) if temp.get("cd_o", 0) == 0: CDR.append((i.名称, 0, 0)) else: CDR.append( ( i.名称, round(1 - temp.get("cd", 0) / temp.get("cd_o", 0), 4), temp.get("cd", 0), ) ) pass data["skills"] = skill_dict data["total_data"] = round(total_data,0) # data['无色消耗'] = 无色消耗 data["CDR"] = CDR dps = 0 for temp in data["skills"]: skill = data["skills"][temp] try: dps += ( (skill["damage"] / skill["count"]) / skill["cd"] * skill["damage"] / total_data ) except Exception: pass data["dps"] = dps return data def 装备属性计算(self): self.套装统计() self.装备基础() self.__时装基础() self.__附魔计算() self.__杂项计算() self.__徽章计算() if self.类型 != "辅助": self.药剂计算() self.__装备词条计算() def __时装基础(self): 时装品级列表 = {} for 部位 in self.装扮栏: id = int(self.装扮栏[部位]) 时装 = 装扮集合[id] 时装.效果(角色=self, 选项=self.装扮选项[部位]) 时装品级列表[时装.套装] = 时装品级列表.get(时装.套装, 0) + 1 套装集合: List[装扮套装] = [] for 套装 in 装扮套装集合: 数量 = 时装品级列表.get(套装.名称, 0) if 数量 > 0: if 数量 >= 套装.所需数量: 查找 = len( [ i for i in 套装集合 if hasattr(i, "兼容于") and i.兼容于 == 套装.名称 and i.所需数量 == 套装.所需数量 ] ) if 查找 == 0: 套装集合.append(套装) else: if hasattr(套装, "兼容于") and 套装.兼容于 is not None: 数量 += 时装品级列表.get(套装.兼容于, 0) 时装品级列表[套装.兼容于] = 数量 时装品级列表.pop(套装.名称) for 套装 in 套装集合: 套装.效果(self) pass def __辟邪玉计算(self): if "jade" not in self.打造详情.keys(): return setinfo = self.打造详情["jade"] info = {} for i in ["jade_First", "jade_Second", "jade_Third", "jade_Fourth"]: if i + "_type" in setinfo.keys(): try: id = setinfo[i + "_type"] value = float(setinfo[i + "_value"]) except Exception: id = 0 value = 0 info[str(id)] = info.get(str(id), 0) + value from core.equipment.jade import get_jadefunc_by_id for id in info.keys(): func = get_jadefunc_by_id(int(id)) func(self, value=info.get(str(id), 0)) # 打印相关函数和效果 def 护石计算(self): for item in self.护石栏: try: if item is not None and item != "" and item != "无": self.get_skill_by_name(item).装备护石(char=self) except Exception: pass def 符文计算(self): for item in self.符文: if item is not None and item != "": skill_name: str = item[0:-1] type = item[-1] skill = self.get_skill_by_name(skill_name) if skill is not None and skill.名称 == skill_name: # 紫 if type == "1": skill.倍率 *= 1.04 # 红 if type == "2": skill.倍率 *= 1.06 skill.CDR *= 1.04 # 绿 if type == "3": skill.倍率 *= 0.96 skill.CDR *= 0.93 # 蓝 if type == "4": skill.CDR *= 0.95 else: print(f"skill not found {skill_name}") pass def __杂项计算(self, mode=0): if "others" not in self.打造详情.keys(): return setinfo = self.打造详情["others"] # 收集箱 try: from core.equipment.sundry import get_sundriesfunc_by_id func = get_sundriesfunc_by_id(setinfo["SJX_TYPE"]) # print(func) func(self, 0, False, setinfo["SJX_XY"], setinfo["SJX_SQ"]) except Exception: pass # 勋章 try: from core.equipment.sundry import get_sundriesfunc_by_id func = get_sundriesfunc_by_id(setinfo["XZ_TYPE"]) func( self, 0, False, setinfo.get("XZ_SHZ", 0), setinfo.get("XZ_QH", 0), setinfo.get("XZ_GS", 0), ) except Exception: pass # 勋章 - New # 老徽章选择为无 才生效 if int(setinfo.get("XZ_TYPE", 0)) == 0: try: from core.equipment.sundry import get_sundriesfunc_by_id func = get_sundriesfunc_by_id(27063) func( self, 0, False, setinfo.get("medal_quality", 0), setinfo.get("medal_lv", 0), [ setinfo.get("medal_gems_1", 0), setinfo.get("medal_gems_2", 0), setinfo.get("medal_gems_3", 0), setinfo.get("medal_gems_4", 0), ], 0.1, ) pass except Exception: pass for i in setinfo.keys(): if i.startswith("SJX") or i.startswith("XZ"): pass else: try: id = setinfo[i] from core.equipment.sundry import get_sundriesfunc_by_id func = get_sundriesfunc_by_id(id) # 站街 func(self) # 进图 func(self, mode=1) except Exception: pass def __徽章计算(self): idlist = [] for i in 部位列表 + ( "皮肤", "光环", "武器装扮", ): # ('皮肤', '光环', '武器装扮', ) if i in self.打造详情.keys() and self.部位是否穿戴(i): temp = self.打造详情[i] for j in ["socket_left", "socket_right"]: id = temp.get(j, 0) if id == 0: pass elif str(id).isdigit(): idlist.append(id) else: # 白金技能等级加成处理 id:技能名称 self.单技能加成(名称=id, lv=1) self.基础属性加成(四维=8) pass for i in idlist: from core.equipment.emblems import get_embfunc_by_id func = get_embfunc_by_id(i) func(self) # 打印相关函数和效果 # print('{}: {}'.format(func, func(self, text=TRUE))) def __附魔计算(self): for i in self.部位附魔.keys(): if self.部位是否穿戴(i): func = self.部位附魔[i] func(self, part=i) func(self, mode=1, part=i) # 打印相关函数和效果 # print('{}: {}: {}'.format(i, func, func(self, text=TRUE))) def 装备基础(self): # 移除不符合版本的装备,不参与后续计算 self.装备栏 = list( filter( lambda x: get_equ(self.equVersion).get_equ_by_id(x).名称 != "", self.装备栏, ) ) for id in self.装备栏: temp = get_equ(self.equVersion).get_equ_by_id(id) temp = get_equ(self.equVersion).get_equ_by_id( id, self.打造详情.get(temp.部位, {}).get("growth_sj", 0) > 0 ) if "甲" in temp.类型: self.__防具计算(temp) elif temp.类型 == "首饰": self.__首饰计算(temp) elif temp.类型 == "特殊装备": self.__特殊装备计算(temp) elif temp.部位 == "武器": self.武器计算(temp) elif temp.部位 in ["称号", "宠物"]: self.__称号宠物计算(temp) if temp.部位 not in ["称号", "宠物"]: self.__增幅计算(temp) pass # if temp.所属套装 != '智慧产物': # return 精通计算(temp.等级, temp.品质, self.打造详情.get(部位, {}).get('cursed_number', 0), 部位) # else: # return 精通计算(temp.等级, temp.品质, self.打造详情.get(部位, {}).get('wisdom_number', 0), 部位) def __防具计算(self, temp: equipment) -> None: self.基础属性加成(**temp.__dict__) 部位 = temp.部位 强化等级 = self.打造详情.get(部位, {}).get("cursed_number", 0) 力量 = 智力 = 体力 = 精神 = 0 if self.类型 == "辅助": if "智力" in self.防具精通属性: 智力 += 辅助精通计算( 110 if temp.神 else temp.等级, temp.品质, 强化等级, 部位, "智力" ) if "精神" in self.防具精通属性: 精神 += 辅助精通计算( 110 if temp.神 else temp.等级, temp.品质, 强化等级, 部位, "精神" ) if "体力" in self.防具精通属性: 体力 += 辅助精通计算( 110 if temp.神 else temp.等级, temp.品质, 强化等级, 部位, "体力" ) else: 精通数值 = 精通计算( 110 if temp.神 else temp.等级, temp.品质, 强化等级, 部位, self.防具类型 ) if "力量" in self.防具精通属性: 力量 += 精通数值 if "智力" in self.防具精通属性: 智力 += 精通数值 # if temp.等级 == 105: # if self.类型 == '辅助': # self.技能等级加成('主动', 30, 30, 1) # self.技能等级加成('主动', 50, 50, 1) self.基础属性加成(力量=力量, 智力=智力, 体力=体力, 精神=精神) def __增幅计算(self, temp: equipment) -> None: if self.打造详情.get(temp.部位, {}).get("cursed_type", 1) == 1: x = 增幅计算( min(temp.等级, MAXEQULV), temp.品质, self.打造详情.get(temp.部位, {}).get("cursed_number", 0), ) if self.类型 == "物理百分比" or self.类型 == "物理固伤": self.基础属性加成(力量=x) self.打造[temp.部位]["增幅四维"][0] = x elif self.类型 == "魔法百分比" or self.类型 == "魔法固伤": self.基础属性加成(智力=x) self.打造[temp.部位]["增幅四维"][1] = x elif self.类型 == "辅助": if self.适用属性 == "体力": self.基础属性加成(体力=x) self.打造[temp.部位]["增幅四维"][2] = x elif self.适用属性 == "精神": self.基础属性加成(精神=x) self.打造[temp.部位]["增幅四维"][3] = x else: self.基础属性加成(智力=x) self.打造[temp.部位]["增幅四维"][1] = x # if self.是否增幅[i] and temp.所属套装 != '智慧产物': # x = 增幅计算(temp.等级, temp.品质, self.强化等级[i]) def __称号宠物计算(self, temp: equipment) -> None: self.基础属性加成(**temp.__dict__) def __首饰计算(self, temp: equipment) -> None: self.基础属性加成(**temp.__dict__) # if temp.等级 == 105 and self.类型 == '辅助': # self.技能等级加成('主动', 30, 30, 1) # self.技能等级加成('主动', 50, 50, 1) def __特殊装备计算(self, temp: equipment) -> None: self.基础属性加成(**temp.__dict__) # if temp.等级 == 105 and self.类型 == '辅助': # self.技能等级加成('主动', 30, 30, 1) # self.技能等级加成('主动', 50, 50, 1) # if temp.品质 == '史诗' and temp.部位 == '魔法石': # self.技能等级加成('主动', 50, 50, 1) # 耳环 if temp.部位 == "耳环": # if temp.所属套装 != '智慧产物': x = 耳环计算( min(temp.等级, MAXEQULV), temp.品质, self.打造详情.get(temp.部位, {}).get("cursed_number", 0), ) self.打造["耳环"]["强化攻击力"] = [x] * 3 self.基础属性加成(三攻=x) # 辅助装备、魔法石 else: # if temp.所属套装 != '智慧产物': x = 左右计算( min(temp.等级, MAXEQULV), temp.品质, self.打造详情.get(temp.部位, {}).get("cursed_number", 0), ) if self.类型 == "辅助": self.打造[temp.部位]["强化四维"] = [x] * 4 else: self.打造[temp.部位]["强化四维"] = [x] * 2 self.基础属性加成(四维=x) def 武器计算(self, temp: equipment) -> None: self.基础属性加成(**temp.__dict__) self.武器类型 = temp.类型 # if temp.等级 == 105 and self.类型 == '辅助': # self.技能等级加成('主动', 30, 30, 3) # self.技能等级加成('主动', 50, 50, 4) # if temp.品质 == '史诗': # self.技能等级加成('主动', 50, 50, 1) # if temp.所属套装 != '智慧产物': info = self.打造详情.get(temp.部位, {}) # 暂时没有用110计算强化增幅的 物理攻击力 = 武器强化计算( min(temp.等级, MAXEQULV), temp.品质, info.get("cursed_number", 0), temp.类型, "物理", ) 魔法攻击力 = 武器强化计算( min(temp.等级, MAXEQULV), temp.品质, info.get("cursed_number", 0), temp.类型, "魔法", ) 独立攻击力 = 锻造计算( min(temp.等级, MAXEQULV), temp.品质, info.get("dz_number", 0) ) self.打造["武器"]["强化攻击力"] = [物理攻击力, 魔法攻击力, 0] self.打造["武器"]["锻造加成"][0] = 独立攻击力 四维 = 0 if self.类型 == "辅助": 四维 = 锻造四维(min(temp.等级, MAXEQULV), temp.品质, info.get("dz_number", 0)) self.打造["武器"]["锻造加成"][1] = 四维 self.基础属性加成( 物理攻击力=物理攻击力, 魔法攻击力=魔法攻击力, 独立攻击力=独立攻击力, 四维=四维, ) def 职业装备特殊计算(self) -> None: pass def 药剂计算(self, rate=1.0) -> None: from core.equipment.consumable import get_sundriesfunc_by_id for item in self.药剂: func = get_sundriesfunc_by_id(item) func(self, rate=rate, mode=0) func(self, rate=rate, mode=1) def 是否升级110(self, part): return self.词条等级[part][0] > 80 def 兼容数量统计(self, suit): equs = get_equ(self.equVersion) count = 0 for i in 部位列表: equ = equs.get_equ_by_id(self.部位装备.get(i, 0)) if len(equ.suits) < 2: continue if suit in equ.suits: count += 1 return count def 套装统计(self): suit = [] self.suits = [] equs = get_equ(self.equVersion) for i in 部位列表: equ = equs.get_equ_by_id(self.部位装备.get(i, 0)) if len(equ.suits) < 0: continue # 星辰百变 if len(equ.可选属性) > 0: if self.打造详情.get(i, {}).get("changeable", True): suit += equ.suits else: suit += equ.suits for i in self.融合列表: equ = equs.get_equ_by_id(i) if len(equ.suits) < 0: continue suit += equ.suits suit_count = {} for i in set(suit): suit_count[i] = suit.count(i) suits = [] compatibility = [] for i in suit_count: suitsInfo = list( filter( lambda x: x["suit_id"] == i and x["need_num"] <= suit_count[i], equs.suit_info, ) ) for j in suitsInfo: suits.append(j["id"]) compatibility += j["compatibility"] self.suits = list(set(suits) - set(compatibility)) self.suitInfo = [] for i in self.suits: temp = list(filter(lambda x: x["id"] == i, equs.suit_info))[0] self.suitInfo.append(f'{temp["name"]}[{temp["need_num"]}]') pass def __装备词条计算(self): # 攻击强化相关计算 for i in 部位列表: temp = [] equ = get_equ(self.equVersion).get_equ_by_id(self.部位装备.get(i, 0)) if equ.品质 == "传说": # limit = 80 # limit = 70 # for j in [ # "growth_cs_first", # "growth_cs_second", # "growth_cs_third", # "growth_cs_fourth", # ]: temp = [80] * 4 else: temp = [140]*4 # limit = 80 # growth_sj = self.打造详情.get(i, {}).get("growth_sj", 0) # if growth_sj > 0: # temp = [80 + growth_sj] * 4 # else: # for j in [ # "growth_first", # "growth_second", # "growth_third", # "growth_fourth", # ]: # temp.append(min(limit, self.打造详情.get(i, {}).get(j, 1))) # 锁定等级 常规武器升级锁神40 传说武器锁定70 for name in ["霜", "雨", "雷", "风", "焰", "失衡"]: if equ.名称.startswith(f"{name} :"): temp = [120] * 4 if equ.名称.startswith("跨越之忆"): temp = [70] * 4 # limit = 70 if get_equ(self.equVersion).get_equ_by_id( # self.部位装备.get(i, 0)).品质 == "传说" else 80 # for j in ["growth_first", "growth_second", "growth_third", "growth_fourth"]: # temp.append(min(limit, self.打造详情.get(i, {}).get(j, 1))) self.词条等级[i] = temp asrahan = False weapon = ( get_equ(self.equVersion).get_equ_by_id(self.部位装备.get("武器", 0)).名称 ) for index, name in enumerate(["雷", "风", "霜", "焰", "雨", "失衡"]): if weapon.startswith(f"{name} :") and self.asrahan.get("type", 0) == index: asrahan = True if weapon.startswith("跨越之忆") and self.asrahan.get("type", 0) in [0, 1, 2, 3, 4]: asrahan = True if asrahan: get_equ(self.equVersion).get_asrahan()( self, self.asrahan.get("type", 0), self.asrahan.get("lv", 0), self.asrahan.get("additional", 0), ) 武器融合词条 = self.武器融合.get(str(self.部位装备.get("武器", 0)), []) 成长词条组合 = get_equ(self.equVersion).get_damagelist_by_idlist( self.装备栏, self.自定义词条, self.融合列表, 武器融合词条 ) temp_params = {} for 部位, 序号, atk, buff, params, _type, index in 成长词条组合: if _type > 0: 等级 = self.词条等级[部位][序号] else: # 贴膜/融合 等级 = 1 attack = 成长词条计算(atk, 等级, self.equVersion) if ( get_equ(self.equVersion).get_equ_by_id(self.部位装备.get(部位, 0)).品质 == "传说" and 等级 > 60 ): attack += 10 * (等级 - 60) / 4 buffer = 成长词条计算(buff, 等级, self.equVersion) self.攻击强化加成(attack) self.辅助属性加成(buff量=buffer) # 装备打造 if _type > 0: self.打造[部位]["attack"][序号] = attack self.打造[部位]["buffer"][序号] = buffer self.打造[部位]["params"][序号] = [] temp_params[部位] = temp_params.get(部位, {}) temp_params[部位][str(序号)] = temp_params[部位].get(str(序号), []) params = [] if params is None else params for param in params: param = 成长词条计算(param, 等级, self.equVersion) if _type > 0: self.打造[部位]["params"][序号].append(param) temp_params[部位][str(序号)].append(param) # 词条效果相关计算 for func, 部位, 序号, index, _type, id, 融合石词条位置 in get_equ( self.equVersion ).get_func_list_by_idlist(self): if _type > 0: 等级 = self.词条等级[部位][序号] # 特性 elif _type == -2: 等级 = self.特性等级.get(str(index), 0) # 融合 elif _type == -3: 等级 = self.融合石等级.get(str(id),[0,0,0])[融合石词条位置] else: 等级 = 1 params = temp_params.get(部位, {}).get(str(序号), []) # print(部位, 序号, self.打造[部位]["params"][序号], index) params = [] if params == [None] else params # print(序号, params, index) # print(序号, params, 部位) res = func(self, mode=0, part=部位, lv=等级, params=params) # 进图效果 if res is not None: # print(res, type(res)) if isinstance(res,list): for i in res: self.打造[部位]["tips"].append(i) else: self.打造[部位]["tips"].append(res) if 部位 not in self.tip_part: self.tip_part.append(部位) for func, 部位, 序号, index, _type, id, 融合石词条位置 in get_equ( self.equVersion ).get_func_list_by_idlist(self): if _type > 0: 等级 = self.词条等级[部位][序号] # 特性 elif _type == -2: 等级 = self.特性等级.get(str(index), 0) # 融合 elif _type == -3: 等级 = self.融合石等级.get(str(id),[0,0,0])[融合石词条位置] else: 等级 = 1 params = temp_params.get(部位, {}).get(str(序号), []) # print(部位, 序号, self.打造[部位]["params"][序号], index) params = [] if params == [None] else params # print(序号, params, index) # print(序号, params, 部位) # func(self, part=部位, lv=等级, params=params) # 站街效果 res = func(self, mode=1, part=部位, lv=等级, params=params) # 进图效果 if res is not None: # print(res, type(res)) if isinstance(res,list): for i in res: self.打造[部位]["tips"].append(i) else: self.打造[部位]["tips"].append(res) if 部位 not in self.tip_part: self.tip_part.append(部位) # 打印相关函数和效果 # print('{}(lv.{}): {} {}'.format(部位, 等级, func, func(self, text=TRUE))) def check_fun_by_id(self, id): idList = get_equ(self.equVersion).get_func_list_by_idlist(self) return id in [index for _, _, _, index, _,_,_ in idList] def check_equ_by_name(self, name): id = get_equ(self.equVersion).get_equ_by_name(name).id return id > 0 and (id in self.装备栏 or id in self.融合列表) def check_fusion_upgrade(self, part): return self.打造详情.get(part, {}).get("fusion_upgrade", False) def 被动倍率计算(self): if self.__基础精通倍率 != 1: 基础精通 = self.get_skill_by_name("基础精通") if 基础精通.名称 == "基础精通": 基础精通.倍率 *= self.__基础精通倍率 for i in self.技能栏: i.被动倍率 = 1 for i in self.技能栏: for index in range(0, 4): index = "" if index == 0 else str(index) 关联技能 = getattr(i, "关联技能" + index, ["无"]) 非关联技能 = getattr(i, "非关联技能" + index, ["无"]) try: 加成倍率 = eval("i.加成倍率" + index + "(self.武器类型)") except Exception: 加成倍率 = 1.0 try: # print(i.名称, 加成倍率, eval("i.加成描述"+index+"(self.武器类型)")) if 加成倍率 != 1: self.skills_passive[i.名称]["info"].append( { "type": "倍率", "info": eval("i.加成描述" + index + "(self.武器类型)"), } ) except Exception: pass if 关联技能 != ["无"]: if 关联技能 == ["所有"]: for j in self.技能栏: if j.是否有伤害 == 1: j.被动倍率 *= 加成倍率 else: # print(self.技能序号) for k in 关联技能: self.技能栏[self.技能序号[k]].被动倍率 *= 加成倍率 if 非关联技能 != ["无"]: if 非关联技能 == ["所有"]: for j in self.技能栏: if j.是否有伤害 == 1: j.被动倍率 /= 加成倍率 else: for k in 非关联技能: self.技能栏[self.技能序号[k]].被动倍率 /= 加成倍率 def 加算冷却计算(self): for i in self.技能栏: if i.是否有伤害 == 1: i.CDR *= 1 - self.__加算冷却缩减 def CD倍率计算(self): for i in self.技能栏: for index in range(0, 4): index = "" if index == 0 else str(index) 关联技能 = getattr(i, "冷却关联技能" + index, ["无"]) 非关联技能 = getattr(i, "非冷却关联技能" + index, ["无"]) 冷却类型 = getattr(i, "冷却类型" + index, 0) try: 加成倍率 = eval("i.CD缩减倍率" + index + "(self.武器类型)") except Exception: 加成倍率 = 1.0 try: if 加成倍率 != 1: self.skills_passive[i.名称]["info"].append( { "type": "CDR", "info": eval( "i.CD缩减描述" + index + "(self.武器类型)" ), } ) except Exception: pass if 关联技能 != ["无"]: if 关联技能 == ["所有"]: for j in self.技能栏: if j.是否有伤害 == 1: if 冷却类型 == 0: j.CDR *= 加成倍率 if 冷却类型 == 1: j.CDR_O *= 加成倍率 else: for k in 关联技能: if 冷却类型 == 0: self.技能栏[self.技能序号[k]].CDR *= 加成倍率 if 冷却类型 == 1: self.技能栏[self.技能序号[k]].CDR_O *= 加成倍率 if 非关联技能 != ["无"]: if 非关联技能 == ["所有"]: for j in self.技能栏: if j.是否有伤害 == 1: if 冷却类型 == 0: j.CDR /= 加成倍率 if 冷却类型 == 1: j.CDR_O /= 加成倍率 else: for k in 非关联技能: if 冷却类型 == 0: self.技能栏[self.技能序号[k]].CDR /= 加成倍率 if 冷却类型 == 1: self.技能栏[self.技能序号[k]].CDR_O /= 加成倍率 def __属性倍率计算(self): # 火、冰、光、暗 self.属性倍率组 = [] self.属性倍率组.append(1.05 + 0.0045 * int(self.__火属性强化 - self.火抗输入)) self.属性倍率组.append(1.05 + 0.0045 * int(self.__冰属性强化 - self.冰抗输入)) self.属性倍率组.append(1.05 + 0.0045 * int(self.__光属性强化 - self.光抗输入)) self.属性倍率组.append(1.05 + 0.0045 * int(self.__暗属性强化 - self.暗抗输入)) self.属性倍率 = max(self.属性倍率组) def __面板系数计算(self, mode=1): if self.类型 is None or self.类型 == "": self.类型 = self.输出类型选项[0] # 基础面板 不含百分比力智和百分比三攻 if mode == 0: if self.类型 == "物理百分比": return int((self.基础面板力量() / 250 + 1) * self.基础面板物理攻击力()) elif self.类型 == "魔法百分比": return int((self.基础面板智力() / 250 + 1) * self.基础面板魔法攻击力()) elif self.类型 == "物理固伤": return int((self.基础面板力量() / 250 + 1) * self.基础面板独立攻击力()) elif self.类型 == "魔法固伤": return int((self.基础面板智力() / 250 + 1) * self.基础面板独立攻击力()) # 旧版算法 不含斗神、宠物技能等 else: if self.类型 == "物理百分比": return int( (self.面板力量() / 250 + 1) * self.基础面板物理攻击力() * (1 + self.__百分比三攻) ) elif self.类型 == "魔法百分比": return int( (self.面板智力() / 250 + 1) * self.基础面板魔法攻击力() * (1 + self.__百分比三攻) ) elif self.类型 == "物理固伤": return int( (self.面板力量() / 250 + 1) * self.基础面板独立攻击力() * (1 + self.__百分比三攻) ) elif self.类型 == "魔法固伤": return int( (self.面板智力() / 250 + 1) * self.基础面板独立攻击力() * (1 + self.__百分比三攻) ) def 伤害指数计算(self): 防御 = max(self.防御输入 * self.防御系数 - self.__固定减防, 0) * ( 1 - self.__百分比减防 ) # 固定攻击方100级 基准倍率 = 1.5 * self.buff * (1 - 防御 / (防御 + 200 * 100)) self.__属性倍率计算() # 基础面板 不含百分比力智和百分比三攻 基础面板 = self.__面板系数计算(mode=0) 旧版面板 = self.__面板系数计算(mode=1) # 攻击强化显示改版 新 = self.__攻击强化 * (1 + self.__百分比攻击强化) * 0.01 # 攻击强化显示改版 旧 = ( 1 + int((self.__伤害增加 + 0.00000001) * 100) / 100 ) # 避免出现浮点数取整BUG 旧 *= 1 + self.__暴击伤害 旧 *= 1 + self.__最终伤害 旧 *= 1 + self.__持续伤害 旧 *= 1 + self.__附加伤害 + self.__属性附加 * self.属性倍率 self.伤害指数 = ( (新 * 基础面板 + 旧 * 旧版面板) * self.技能攻击力 * self.属性倍率 * 基准倍率 * self.斗神宠物 * ( 1.25 if "破招攻击" in get_global_data("attack_type", self.equVersion) else 1.0 ) ) # 7.8日,伤害数据压缩 self.伤害指数 /= 1000 def 基础属性修正(self, info): from core.util.toNum import str_to_num self.攻击强化加成(str_to_num(info.get("攻击强化", 0))) self.buff量加成(str_to_num(info.get("BUFF量", 0))) self.百分比攻击强化加成(str_to_num(info.get("攻击强化百分比", 0)) / 100) self.__百分比buff量 += str_to_num(info.get("BUFF量百分比", 0)) / 100 if self.类型 == "辅助": self.基础属性加成(四维=str_to_num(info.get("四维", 0))) else: self.基础属性加成( 进图力量=str_to_num(info.get("四维", 0)), 进图智力=str_to_num(info.get("四维", 0)), 体精=str_to_num(info.get("四维", 0)), 三攻=str_to_num(info.get("三攻", 0)), ) self.技能攻击力加成(str_to_num(info.get("技攻", 0)) / 100) self.基础属性加成( 火属性抗性=str_to_num(info.get("火抗", 0)), 光属性抗性=str_to_num(info.get("光抗", 0)), 冰属性抗性=str_to_num(info.get("冰抗", 0)), 暗属性抗性=str_to_num(info.get("暗抗", 0)), ) self.攻击速度增加(str_to_num(info.get("攻速", 0)) / 100) self.火属性强化加成(str_to_num(info.get("火强", 0))) self.光属性强化加成(str_to_num(info.get("光强", 0))) self.冰属性强化加成(str_to_num(info.get("冰强", 0))) self.暗属性强化加成(str_to_num(info.get("暗强", 0))) for 抗性 in [ "出血", "中毒", "灼伤", "感电", "冰冻", "减速", "眩晕", "诅咒", "失明", "石化", "睡眠", "混乱", "束缚", ]: self.异常抗性加成(抗性, str_to_num(info.get(抗性 + "抗性", 0)) / 100) self.MP消耗量加成(str_to_num(info.get("MP消耗量", 0)) / 100) self.set_eq_params( "skill_range", self.get_eq_params("skill_range") + str_to_num(info.get("技能范围Σ", 0)) / 100, ) # endregion def get_individuation(self, index): if index >= len(self.individuation): return 0 else: return 0 if self.individuation[index] is None else self.individuation[index] def calc_init(self, info, equipList: List[int] = []): # 获取打造数据 self.__打造设置(info.get("forge_set", {})) self.asrahan = info.get("asrahan", {}) # 设置职业信息 self.__set_char(info) self.__怪物信息设置(info.get("monster", 2)) self.__场景设置(info.get("scene", 1)) # 自定义词条部分 self.自定义词条 = info.get("customize", {}) # 时装设置 self.__穿戴装扮(info.get("dress_set", {})) # 获取装备列表 self.__穿戴装备(list(map(int, equipList))) # 获取技能数据 self.__skill_set(info.get("skill_set", {})) # 获取装备选项数据 self.trigger_set = info.get("trigger_set", {}) self.__equ_chose_set(self.trigger_set) # 药剂设置 self.__药剂设置(info.get("consumable_list", [])) self.hotkey_set(info.get("hotkey_set", [])) self.融合列表 = list(map(int, info.get("fusion_list", []))) self.武器融合 = info.get("merge", {}) self.特性列表 = [int(i) for i in list(info.get("specificity", {}).keys())] self.特性等级 = info.get("specificity", {}) self.融合石等级 = info.get("stone_set", {}) self.技能队列设置(info.get("skill_que", [])) self.individuation = info.get("individuation", []) self.基础属性修正( info.get( "corrections", { "BUFF量": 0, "BUFF量百分比": 0, "三攻": 0, "光强": 0, "光抗": 0, "冰强": 0, "冰抗": 0, "力智": 0, "四维": 0, "技攻": 0, "攻击强化": 0, "攻击强化百分比": 0, "攻速": 0, "暗强": 0, "暗抗": 0, "火强": 0, "火抗": 0, }, ) ) def jade_upgrade(self): temp = [] from core.equipment.jade import get_jade_setinfo, get_jadefunc_by_id num_range = [26001, 26020] if self.类型 == "辅助": num_range = [26011, 26206] for jade in get_jade_setinfo(): if jade["id"] > num_range[0] and jade["id"] <= num_range[1]: char = deepcopy(self) func = get_jadefunc_by_id(jade["id"]) func(char, value=jade["max"]) char.__计算前预处理() temp.append( { "id": jade["id"], "name": jade["props"] + " " + ("" if jade["max"] == 1 else ("+" + str(jade["max"]))) + jade["unit"], "damage": round(char.结果计算()["total_data"], 2), "order": jade["order"], } ) return temp def 异常保有率计算(self, pa, cur): if cur == "灼伤破冰": 冰冻CD = min( self.异常时间["冰冻"][3], get_global_data("bd_cd", self.equVersion) ) # 不带鞋子,内置3秒结算CD if not self.check_equ_by_name("信守誓约的步伐"): 冰冻CD = max(3, 冰冻CD) # 破韧后,原本的CD是多少就是多少 if get_global_data("control_state", self.equVersion): 冰冻CD = min( self.异常时间["冰冻"][3], 冰冻CD, get_global_data("bd_cd", self.equVersion), ) 灼伤 = self.异常时间["灼伤"] return max(1 - (2 * 冰冻CD + 1) / (4 * (灼伤[0] * 灼伤[2] + 灼伤[1])), 0) else: if self.get_eq_params(f"{cur}-结算") == 0: return 0 持续时间 = ( self.异常时间[cur][0] * self.异常时间[cur][2] + self.异常时间[cur][1] ) 异常CD = min( self.异常时间[cur][3], get_global_data(pa.split("_")[0] + "_cd", self.equVersion, 99), ) if self.check_equ_by_name("承诺誓约的腰带"): 异常CD = max(0.5, 异常CD) return max(1 - (2 * 异常CD + 1) / (4 * 持续时间), 0) def calc( self, setName: str = "set", equipList: List[int] = [], withJade=False, withSet=False, info=None, ): self.calc_init(info, equipList) jade = [] # cus = [] # merge = [] if withJade: jade = self.jade_upgrade() # if withCus and self.类型 != '辅助': # cus = self.cus_upgrade(CusPosition) # if withMerge and self.类型 != '辅助': # merge = self.merge_upgrade() self.__计算前预处理() temp = self.结果计算() calc_info = {} if self.类型 == "辅助": calc_info[self.适用属性] = self.站街系数() elif self.类型 == "物理百分比": calc_info["力量"] = self.基础面板力量() calc_info["物理攻击"] = self.站街物理攻击力() elif self.类型 == "魔法百分比": calc_info["智力"] = self.基础面板智力() calc_info["魔法攻击"] = self.站街魔法攻击力() elif self.类型 == "物理固伤": calc_info["力量"] = self.基础面板力量() calc_info["独立攻击"] = self.站街独立攻击力() elif self.类型 == "魔法固伤": calc_info["智力"] = self.基础面板智力() calc_info["独立攻击"] = self.站街独立攻击力() # print(suitInfo) calc_info["火"] = int(self.火属性强化()) calc_info["冰"] = int(self.冰属性强化()) calc_info["光"] = int(self.光属性强化()) calc_info["暗"] = int(self.暗属性强化()) calc_info["火抗"] = self.火属性抗性() calc_info["冰抗"] = self.冰属性抗性() calc_info["光抗"] = self.光属性抗性() calc_info["暗抗"] = self.暗属性抗性() for i in self.技能栏: 倍率 = i.独立攻击力倍率(self.武器类型) if i.名称 not in self.skills_passive: continue if 倍率 != 1: self.skills_passive[i.名称]["info"].append( { "type": "独立攻击力", "info": [round((倍率 - 1) * 100), "所有", ""], } ) 倍率 = i.魔法攻击力倍率(self.武器类型) if 倍率 != 1: self.skills_passive[i.名称]["info"].append( { "type": "魔法攻击力", "info": [round((倍率 - 1) * 100), "所有", ""], } ) 倍率 = i.物理攻击力倍率(self.武器类型) if 倍率 != 1: self.skills_passive[i.名称]["info"].append( { "type": "物理攻击力", "info": [round((倍率 - 1) * 100), "所有", ""], } ) 倍率 = i.独立攻击力倍率进图(self.武器类型) if i.名称 not in self.skills_passive: continue if 倍率 != 1: self.skills_passive[i.名称]["info"].append( { "type": "独立攻击力[进图]", "info": [round((倍率 - 1) * 100), "所有", ""], } ) 倍率 = i.魔法攻击力倍率进图(self.武器类型) if 倍率 != 1: self.skills_passive[i.名称]["info"].append( { "type": "魔法攻击力[进图]", "info": [round((倍率 - 1) * 100), "所有", ""], } ) 倍率 = i.物理攻击力倍率进图(self.武器类型) if 倍率 != 1: self.skills_passive[i.名称]["info"].append( { "type": "物理攻击力[进图]", "info": [round((倍率 - 1) * 100), "所有", ""], } ) buff = self.get_skill_by_name("BUFF") awake = self.get_skill_by_name("一次觉醒") skills_passive = {} for i in self.skills_passive.keys(): if len(self.skills_passive[i].get("info", [])) > 0: skills_passive[i] = self.skills_passive[i] result = { "id": uuid1().hex, "alter": self.实际名称, "name": self.名称, "role": "buffer" if self.类型 == "辅助" else "delear", "equips_forge": self.打造, "suits": self.suitInfo, "info": { # 站街 "站街": calc_info, # 词条 "properties": { # 攻击强化 "攻击强化": round(self.__攻击强化, 0), "buffer_power": round(self.BUFF量(), 0), "buffer_power_value": round(self.__buff量, 0), "buffer_power_per": round(self.__百分比buff量 * 100, 2), "技能攻击力": round(100 * (self.技能攻击力 - 1), 2), "面板技能攻击力": round(100 * (self.__面板技能攻击力 - 1), 2), "百分比攻击强化": round(self.__百分比攻击强化 * 100, 1), "MP消耗量": round(self.__MP消耗量 * 100 - 100, 2), "伤害比例": [ self.伤害比例.get("直伤", 1), self.伤害比例.get("中毒", 0), self.伤害比例.get("灼伤", 0), self.伤害比例.get("感电", 0), self.伤害比例.get("出血", 0), ], "伤害系数": [ self.伤害系数.get("直伤", 1), self.伤害系数.get("中毒", 1) - 1, self.伤害系数.get("灼伤", 1) - 1, self.伤害系数.get("感电", 1) - 1, self.伤害系数.get("出血", 1) - 1, ], "技能范围": self.get_eq_params("skill_range"), "技能范围∏": self.get_eq_params("skill_range_multi", 1), "保护罩": self.get_eq_params("protect") * (1 + self.get_eq_params("protect_max")), # '无色消耗': temp['无色消耗'], "apply_value": self.适用数值, "buff_level": buff.等级, "buff_name": buff.名称, "awake_level": awake.等级, "awake_name": awake.名称, "buff_intstr_per": self.__buff百分比力智, "buff_intstr": self.__buff固定力智, "buff_attack_per": self.__buff百分比三攻, "buff_attack": self.__buff固定三攻, "awake_intstr_per": self.__觉醒百分比力智, "awake_intstr": self.__觉醒固定力智, "攻击速度": self.__攻击速度, "其他攻击速度": self.__攻击速度_其他, "施放速度": self.__施放速度, "移动速度": self.__移动速度, "cdr": temp.get("CDR", []), "冷却缩减": self.冷却缩减 * (1 - self.__加算冷却缩减), "冷却恢复": self.冷却恢复, "defense": self.get_eq_params("defense"), "defense_ratio": self.get_eq_params("defense_ratio"), "hurted_ratio": self.get_eq_params("hurted_ratio"), "era": round( ( 1 - ( 1 - self.get_eq_params("defense") * (1 + self.get_eq_params("defense_ratio")) / ( 100000 + self.get_eq_params("defense") * (1 + self.get_eq_params("defense_ratio")) ) ) * (1 - self.get_eq_params("hurted_ratio")) ) * 100, 2, ), }, }, "total_data": temp["buffer_addition"] if "buffer_addition" in temp else [temp["total_data"], 0, 0, 0], "skills": temp["skills"], "skills_passive": skills_passive, "specificity": info.get("specificity", []), "jade": sorted(jade, key=lambda x: x["order"]), "talisman_set":info.get("talisman_set", []), "rune_set":info.get("rune_set", []), # "cus": cus, "tip_part": self.tip_part, } if withSet: result["forge_set"] = info["forge_set"] result["equips"] = list( map(lambda x: get_equ(self.equVersion).get_json(x), self.装备栏) ) result["merge_list"] = self.武器融合 result["fusion_list"] = self.融合列表 result["customize"] = info["customize"] for 抗性 in [ "出血", "中毒", "灼伤", "感电", "冰冻", "减速", "眩晕", "诅咒", "失明", "石化", "睡眠", "混乱", "束缚", ]: result["info"]["properties"][抗性 + "抗性"] = self.异常抗性获取(抗性) * 100 return result def createCharacter(alter: str, equVersion: str = "0"): character: Character = None module_name = "core.characters." + alter try: character = importlib.import_module(module_name).classChange(equVersion) except Exception as ex: print(ex) print("create character " + module_name + " error.") pass return character