From 34551c7b35084ee61979be1df54dbbde97f68e4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E7=93=9C=C2=B0?= Date: Sat, 12 Apr 2025 12:11:46 +0800 Subject: [PATCH] dev --- backend/api/core/Auth.py | 10 +- backend/api/core/Redis.py | 1 - backend/api/dp.py | 7 +- backend/core/abstract/character.py | 171 ++++- backend/core/basic/character.py | 233 ++++--- backend/core/basic/formula.py | 21 +- backend/core/basic/property.py | 5 + backend/core/basic/skill.py | 99 +++ .../GF/priest_female/crusader_female.py | 646 ++++++++++++++++++ backend/core/character/adventure.py | 10 +- backend/core/equipment/version_0/enchant.py | 30 +- backend/core/equipment/version_0/equ.py | 44 +- backend/core/equipment/version_0/jade.py | 22 + backend/dataFiles/dcalc_0.db | Bin 1007616 -> 1007616 bytes frontend/src/api/calc/type.ts | 3 + frontend/src/pages/Character/Result/Index.vue | 5 +- .../Result/components/BufferSkill.vue | 225 ++++++ .../Character/Result/components/Skill.vue | 12 +- frontend/src/stores/config.ts | 1 + .../crusader_female/skill/十字架精通.png | Bin 0 -> 2464 bytes .../skill/{启示圣歌.png => 启示:圣歌.png} | Bin .../crusader_female/skill/启示:惩戒.png | Bin 0 -> 2525 bytes .../crusader_female/skill/圣光灌注.png | Bin 0 -> 2556 bytes .../crusader_female/skill/圣光烬盾.png | Bin 0 -> 2671 bytes .../crusader_female/skill/圣洁之光.png | Bin 0 -> 2488 bytes .../crusader_female/skill/圣言十字.png | Bin 0 -> 2186 bytes .../crusader_female/skill/忏悔重击.png | Bin 2369 -> 2740 bytes .../crusader_female/skill/洗礼之光.png | Bin 0 -> 2502 bytes .../crusader_female/skill/神光惩戒.png | Bin 0 -> 2538 bytes .../crusader_female/skill/神圣锁环.png | Bin 0 -> 2525 bytes .../crusader_female/skill/胜利之矛.png | Bin 0 -> 2439 bytes 31 files changed, 1379 insertions(+), 166 deletions(-) create mode 100644 backend/core/character/GF/priest_female/crusader_female.py create mode 100644 frontend/src/pages/Character/Result/components/BufferSkill.vue create mode 100644 images/characters/crusader_female/skill/十字架精通.png rename images/characters/crusader_female/skill/{启示圣歌.png => 启示:圣歌.png} (100%) create mode 100644 images/characters/crusader_female/skill/启示:惩戒.png create mode 100644 images/characters/crusader_female/skill/圣光灌注.png create mode 100644 images/characters/crusader_female/skill/圣光烬盾.png create mode 100644 images/characters/crusader_female/skill/圣洁之光.png create mode 100644 images/characters/crusader_female/skill/圣言十字.png create mode 100644 images/characters/crusader_female/skill/洗礼之光.png create mode 100644 images/characters/crusader_female/skill/神光惩戒.png create mode 100644 images/characters/crusader_female/skill/神圣锁环.png create mode 100644 images/characters/crusader_female/skill/胜利之矛.png diff --git a/backend/api/core/Auth.py b/backend/api/core/Auth.py index b8e72c0e..f1fefd92 100644 --- a/backend/api/core/Auth.py +++ b/backend/api/core/Auth.py @@ -10,12 +10,10 @@ from api.core.exception import ResponseException class AlterState: - def __init__(self, value: str, token: str, charcater: Character, equVersion: str,time: int): - self.value = value - try: - self.alter = get_adv_info(value)["class"] - except Exception: - raise ResponseException(f'无效的职业{value}') + def __init__(self, alter: str, token: str, charcater: Character, equVersion: str,time: int): + if alter is None: + raise ResponseException('无效的职业') + self.alter = alter self.token = token self.origin = self.alter.split('.')[-1] self.character = charcater diff --git a/backend/api/core/Redis.py b/backend/api/core/Redis.py index c3b06e95..0fffcf76 100644 --- a/backend/api/core/Redis.py +++ b/backend/api/core/Redis.py @@ -10,7 +10,6 @@ def get_redis_info(redis, key, fun,without_gzip=False): else: info = json.loads(gzip_unzip(redis.get(key))) except Exception as ex: - print(ex) info = None if info is None: info = fun() diff --git a/backend/api/dp.py b/backend/api/dp.py index 0f1e182c..015886f3 100644 --- a/backend/api/dp.py +++ b/backend/api/dp.py @@ -5,16 +5,18 @@ from sqlalchemy.orm import Session from fastapi import Depends, Header from api.core.exception import ResponseException +from core.character.adventure import get_adv_info from database.connect import get_db, get_redis from api.core.Auth import AlterState import base64 import json +from api.core.Redis import get_redis_info SessionDep = Annotated[Session, Depends(get_db)] RedisDep = Annotated[Redis, Depends(get_redis)] -def alterToken(alter_token: Optional[str] = Header(None)): +def alterToken(redis:RedisDep,alter_token: Optional[str] = Header(None)): if alter_token is not None: try: decoded_bytes = base64.b64decode(alter_token) @@ -23,7 +25,8 @@ def alterToken(alter_token: Optional[str] = Header(None)): # 6小时过期 if (int(time.time() * 1000) - alter['time']) / (60 * 60 * 1000) > 6: raise ResponseException('登录过期或无效Token,请刷新后重试') - return AlterState(alter['alter'], alter_token, {}, alter['equVersion'], alter['time']) + alterData = get_redis_info(redis, f'dcalc:adventure:{alter['alter']}', lambda : get_adv_info(alter['alter'])) + return AlterState(alterData["class"], alter_token, {}, alter['equVersion'], alter['time']) except (base64.binascii.Error, json.JSONDecodeError): raise ResponseException('登录过期或无效Token,请刷新后重试') else: diff --git a/backend/core/abstract/character.py b/backend/core/abstract/character.py index 369f95e8..0dda9685 100644 --- a/backend/core/abstract/character.py +++ b/backend/core/abstract/character.py @@ -1,9 +1,117 @@ -from typing import Any, Literal -from collections.abc import Mapping +from abc import ABC, abstractmethod +from typing import Any, Literal, Mapping +class CharacterProperty(ABC): + """ + 抽象类,用于定义Character的接口和属性 + """ -class CharacterProperty: - def SetStatus( + # region 角色属性 + STR: float + """力量""" + + INT: float + """智力""" + + Spirit: float + """精神""" + + Vitality: float + """体力""" + + AtkP: float + """物理攻击力""" + + PAtkP: float + """物理攻击力%""" + + AtkM: float + """魔法攻击力""" + + PAtkM: float + """魔法攻击力%""" + + AtkI: float + """独立攻击力""" + + PAtkI: float + """独立攻击力%""" + + ElementA: dict[str, float] + """属性攻击""" + + ElementIncrease: float + """属性增幅""" + + ElementDB: dict[str, float] + """属性强化数值""" + + ElementR: dict[str, float] + """属性抗性数值""" + + CriticalM: float + """魔法暴击""" + + CriticalP: float + """物理暴击""" + + SkillAttack: float + """技能攻击力""" + + SpeedA: float + """攻击速度""" + + SpeedM: float + """移动速度""" + + SpeedR: float + """施放速度""" + + Hit: float + """命中率""" + + Abnormal: dict[str, bool] + """敌人异常状态""" + + MonsterInfo: dict[str, float] + """怪物信息""" + + jade_effect: Any + """辟邪玉加成""" + + Buffer: float + """增益量""" + + BufferP: float + """增益量%""" + + Attack: float + """攻击强化""" + + AttackP: float + """攻击强化%""" + + # endregion + + # region 职业属性 + 实际名称: str + 名称: str + 角色: str + 角色类型: str + 职业: str + 武器选项: list[str] + 输出类型选项: list[str] + 防具精通属性: list[str] + 输出类型: str + # endregion + + @abstractmethod + def SetBaseStatus(self) -> None: + """设角色基础属性""" + pass + + @abstractmethod + def SetStatus( self, 力量=0, 智力=0, @@ -43,8 +151,7 @@ class CharacterProperty: 攻击强化P=0, 增益量=0, 增益量P=0, - **kwargs: Mapping[ - Literal[ + **kwargs: Mapping[Literal[ 'STR', 'INT', 'AtkP', @@ -79,8 +186,52 @@ class CharacterProperty: 'Spirit', 'Vitality', 'EquEffectRatio', - ], - Any, - ], + ], Any], ) -> None: - pass + """设置角色属性""" + pass + + @abstractmethod + def AddElementDB(self, element: str, value: float, type: int = 0) -> None: + """增加属性强化""" + pass + + @abstractmethod + def AddSkillLv(self, min: int, max: int, lv: int, type=-1) -> None: + """增加技能等级""" + pass + + @abstractmethod + def SetSkillCD(self, min=1, max=100, cd=0, exclude=[50, 85, 100]) -> None: + """设置技能CD""" + pass + + @abstractmethod + def SetSkillCDRecover(self, min=1, max=100, cd=0, exclude=[50, 85, 100]) -> None: + """设置技能CD恢复""" + pass + + @abstractmethod + def SetSkillRation(self, min=1, max=100, ratio=0, type=0) -> None: + """设置技能倍率""" + pass + + @abstractmethod + def GetSkillByName(self, name) -> Any: + """通过技能名获取技能""" + pass + + @abstractmethod + def GetSkillByID(self, id: str) -> Any: + """通过技能ID获取技能""" + pass + + @abstractmethod + def GetSkillNames(self, type: Literal['active', 'passive', 'all'] = 'all', damage: Literal[True, False, 'all'] = 'all') -> list[str]: + """获取技能名字""" + pass + + @abstractmethod + def calc(self, setInfo: dict[str, dict]) -> dict: + """计算角色属性""" + pass diff --git a/backend/core/basic/character.py b/backend/core/basic/character.py index 49c111ef..937b2d8f 100644 --- a/backend/core/basic/character.py +++ b/backend/core/basic/character.py @@ -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 diff --git a/backend/core/basic/formula.py b/backend/core/basic/formula.py index ae7eaf42..17f2cf97 100644 --- a/backend/core/basic/formula.py +++ b/backend/core/basic/formula.py @@ -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 diff --git a/backend/core/basic/property.py b/backend/core/basic/property.py index a90b531d..ebb94e3f 100644 --- a/backend/core/basic/property.py +++ b/backend/core/basic/property.py @@ -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 diff --git a/backend/core/basic/skill.py b/backend/core/basic/skill.py index 62120fa9..7e7a6632 100644 --- a/backend/core/basic/skill.py +++ b/backend/core/basic/skill.py @@ -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 + )) diff --git a/backend/core/character/GF/priest_female/crusader_female.py b/backend/core/character/GF/priest_female/crusader_female.py new file mode 100644 index 00000000..b966af9c --- /dev/null +++ b/backend/core/character/GF/priest_female/crusader_female.py @@ -0,0 +1,646 @@ +#0c1b401bb09241570d364420b3ba3fd7 +from core.basic.skill import PassiveBufferSkill,ActiveBufferSkill,ActiveSkill,PassiveSkill +from core.basic.character import Character + +# 圣光灌注 빛의 은총 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/8f73f243041c2d27739fe7696f02bf9b?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill0(PassiveBufferSkill): + name = "圣光灌注" + learnLv = 1 + masterLv = 1 + maxLv = 1 + position = 3 #TODO + rangeLv = 1 + + CarryRatio = [0, 4.5 * 3]# noqa: E501 + + +# 启示 : 惩戒 계시 : 크루세이드 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/42c82812f86ff6704ae9952a2e6093a4?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill1(PassiveSkill): + name = "启示 : 惩戒" + learnLv = 1 + masterLv = 1 + maxLv = 1 + position = 4 #TODO + rangeLv = 2 + icon = "$char/启示:惩戒" + + data0 = [0, 15]# noqa: E501 + hit0 = 1 #TODO + + data1 = [0, 5]# noqa: E501 + hit1 = 1 #TODO + + +# 治愈祈祷 치유의 기도 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/0969cd4054d93da07708108c0cc1c4b5?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill2(ActiveBufferSkill): + name = "治愈祈祷" + learnLv = 5 + masterLv = 60 + maxLv = 70 + position = 4 #TODO + rangeLv = 3 + cd = 10 + mp = [15, 154] + buffer = True + + data0 = [0, 468, 1170, 1824, 2433, 3135, 3743, 4444, 5052, 5707, 6363, 7018, 7672, 8328, 8983, 9637, 10292, 10948, 11603, 12257, 12912, 13568, 14222, 14877, 15533, 16140, 16842, 17451, 18105, 18807, 19929, 21099, 21894, 22738, 23531, 24375, 25216, 26059, 26901, 27742, 28586, 29427, 30223, 31064, 31907, 32749, 33590, 34434, 35275, 36117, 36912, 37755, 38597, 39438, 40282, 41123, 41965, 42808, 43603, 44445, 45286, 46130, 46971, 47813, 48656, 49497, 50293, 51134, 51978, 52819, 53661]# noqa: E501 + hit0 = 1 #TODO + + data1 = [0, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150]# noqa: E501 + hit1 = 1 #TODO + + data2 = [0, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900]# noqa: E501 + hit2 = 1 #TODO + +# 净化 큐어 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/4655101518604f874721b3cc249aae10?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill3(ActiveBufferSkill): + name = "净化" + learnLv = 10 + masterLv = 1 + maxLv = 11 + position = 4 #TODO + rangeLv = 5 + cd = 15 + mp = [22, 238] + buffer = True + + data0 = [0, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10]# noqa: E501 + hit0 = 1 #TODO + + data1 = [0, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530]# noqa: E501 + hit1 = 1 #TODO + +# 圣洁之光 홀리 플래쉬 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/4224f9b0b8c7c903e9a1e0f9d9f6d04d?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill4(ActiveBufferSkill): + name = "圣洁之光" + learnLv = 15 + masterLv = 60 + maxLv = 70 + position = 8 #TODO + rangeLv = 2 + cd = 4 + mp = [27, 294] + + data0 = [0, 4847, 5338, 5829, 6321, 6814, 7305, 7796, 8288, 8779, 9272, 9763, 10254, 10746, 11239, 11730, 12221, 12713, 13204, 13697, 14188, 14680, 15171, 15662, 16155, 16646, 17138, 17629, 18122, 18613, 19105, 19596, 20087, 20580, 21072, 21563, 22054, 22547, 23038, 23530, 24021, 24512, 25005, 25497, 25988, 26479, 26972, 27464, 27955, 28446, 28937, 29430, 29922, 30413, 30904, 31396, 31889, 32380, 32871, 33363, 33856, 34347, 34838, 35329, 35821, 36314, 36805, 37296, 37788, 38281, 38772]# noqa: E501 + hit0 = 1 #TODO + +# 启示 : 圣歌 계시 : 아리아 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/78bd107acd474518b606be1e4fd38239?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill5(PassiveBufferSkill): + name = "启示 : 圣歌" + learnLv = 15 + masterLv = 60 + maxLv = 70 + position = 2 #TODO + rangeLv = 3 + icon = "$char/启示:圣歌" + + INT = [0, 86, 90, 94, 98, 102, 107, 112, 117, 123, 129, 135, 141, 147, 154, 161, 169, 177, 185, 193, 201, 210, 219, 229, 238, 248, 258, 269, 279, 290, 301, 313, 325, 337, 349, 361, 375, 388, 401, 415, 429, 443, 457, 473, 487, 503, 519, 535, 551, 567, 584, 598, 614, 630, 646, 662, 677, 693, 709, 725, 741, 756, 772, 788, 804, 820, 835, 851, 867, 883, 899]# noqa: E501 + + associate = [{"data":INT,"type":"$+INT","ratio":1}] + +# 十字架精通 십자가 마스터리 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/9cb6f9ed646fa87f9b7680a42ce83d1a?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill6(PassiveSkill): + name = "十字架精通" + learnLv = 20 + masterLv = 10 + maxLv = 20 + position = 0 #TODO + rangeLv = 3 + + data0 = [0, 6.5, 8, 9.5, 11, 12.5, 14, 15.5, 17, 18.5, 20, 21.5, 23, 24.5, 26, 27.5, 29, 30.5, 32, 33.5, 35]# noqa: E501 + associate = [{"data": data0, "type": "$*PATKI"}] + + data1 = [0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]# noqa: E501 + + data2 = [0, 15.5, 16, 16.5, 17, 17.5, 18, 18.5, 19, 19.5, 20, 20.5, 21, 21.5, 22, 22.5, 23, 23.5, 24, 24.5, 25]# noqa: E501 + +# 胜利之矛 승리의 창 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/3d8f3d438405d79f8d3ed68072674d1e?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill7(ActiveSkill): + name = "胜利之矛" + learnLv = 20 + masterLv = 60 + maxLv = 70 + position = 6 #TODO + rangeLv = 2 + cd = 7 + mp = [32, 343] + + data0 = [0, 3764, 4145, 4527, 4908, 5289, 5673, 6054, 6436, 6817, 7198, 7580, 7963, 8345, 8726, 9109, 9489, 9872, 10254, 10635, 11018, 11399, 11779, 12164, 12544, 12927, 13308, 13690, 14071, 14455, 14836, 15217, 15599, 15980, 16364, 16745, 17126, 17508, 17889, 18272, 18654, 19037, 19417, 19798, 20181, 20563, 20946, 21327, 21707, 22090, 22471, 22855, 23236, 23618, 23999, 24380, 24762, 25145, 25527, 25908, 26291, 26671, 27054, 27436, 27817, 28200, 28580, 28961, 29345, 29726, 30109]# noqa: E501 + hit0 = 1 #TODO + + data1 = [0, 5644, 6219, 6790, 7363, 7936, 8509, 9081, 9653, 10226, 10800, 11371, 11944, 12517, 13090, 13663, 14234, 14809, 15382, 15953, 16526, 17100, 17672, 18244, 18817, 19390, 19963, 20534, 21107, 21682, 22253, 22826, 23401, 23972, 24545, 25116, 25690, 26263, 26835, 27407, 27982, 28553, 29126, 29699, 30272, 30845, 31416, 31991, 32564, 33135, 33708, 34282, 34853, 35426, 35999, 36572, 37145, 37716, 38289, 38864, 39435, 40008, 40582, 41154, 41727, 42298, 42872, 43445, 44016, 44589, 45164]# noqa: E501 + hit1 = 1 #TODO + +# 守护祝福 수호의 축복 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/ade01c1d6afc8a05055225045e89fe49?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill8(ActiveBufferSkill): + name = "守护祝福" + learnLv = 20 + masterLv = 10 + maxLv = 20 + position = 4 #TODO + rangeLv = 3 + cd = 10 + mp = [35, 392] + + data0 = [0, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300]# noqa: E501 + hit0 = 1 #TODO + + data1 = [0, 383, 386, 389, 392, 395, 398, 401, 404, 407, 410, 413, 416, 419, 422, 425, 428, 431, 434, 437, 440]# noqa: E501 + hit1 = 1 #TODO + + data2 = [0, 11080, 11130, 11180, 11230, 11280, 11330, 11380, 11430, 11480, 11530, 11580, 11630, 11680, 11730, 11780, 11830, 11880, 11930, 11980, 12030]# noqa: E501 + hit2 = 1 #TODO + + data3 = [0, 94, 98, 102, 107, 112, 116, 122, 127, 131, 137, 141, 147, 153, 158, 163, 169, 175, 181, 187, 192]# noqa: E501 + hit3 = 1 #TODO + + data4 = [0, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900]# noqa: E501 + hit4 = 1 #TODO + +# 洗礼之光 세례의 빛 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/ff171dc487807bb9aa28900ca9a46b41?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill9(ActiveSkill): + name = "洗礼之光" + learnLv = 25 + masterLv = 60 + maxLv = 70 + position = 8 #TODO + rangeLv = 2 + cd = 7 + mp = [32, 343] + + data0 = [0, 9778, 10771, 11762, 12755, 13746, 14739, 15732, 16723, 17716, 18707, 19700, 20692, 21684, 22676, 23667, 24660, 25653, 26644, 27637, 28628, 29621, 30614, 31605, 32598, 33589, 34581, 35574, 36565, 37558, 38549, 39542, 40535, 41526, 42519, 43510, 44503, 45495, 46487, 47479, 48470, 49463, 50456, 51447, 52440, 53429, 54424, 55417, 56406, 57401, 58390, 59383, 60374, 61367, 62359, 63351, 64343, 65334, 66327, 67320, 68311, 69304, 70295, 71288, 72281, 73272, 74265, 75256, 76248, 77241, 78232]# noqa: E501 + hit0 = 1 #TODO + +# 圣光守护 신성한 빛 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/547ab2b2bd860d3e37355a9cfbc1077c?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill10(ActiveBufferSkill): + name = "圣光守护" + learnLv = 25 + masterLv = 50 + maxLv = 60 + position = 5 #TODO + rangeLv = 3 + cd = 20 + mp = [15, 154] + buffer = True + + data0 = [0, 19695, 22833, 25973, 29113, 32252, 35392, 38532, 41670, 44810, 47950, 51090, 54230, 57368, 60508, 63648, 66788, 69928, 73066, 76206, 79346, 82486, 85626, 88766, 91904, 95044, 98184, 101323, 104463, 107602, 110741, 113881, 117021, 120161, 123299, 126439, 129579, 132719, 135859, 138999, 142137, 145277, 148417, 151557, 154697, 157835, 160975, 164115, 167255, 170394, 173533, 176673, 179812, 182952, 186092, 189230, 192370, 195510, 198650, 201790, 204930]# noqa: E501 + hit0 = 1 #TODO + +# 勇气祝福 용맹의 축복 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/8c2379737c5acc935c1731f67f607655?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill11(ActiveBufferSkill): + name = "勇气祝福" + learnLv = 30 + masterLv = 10 + maxLv = 40 + position = 4 #TODO + rangeLv = 3 + cd = 10 + mp = [35, 399] + buffer = True + buffType = "buff" + + # 三攻 + ATK = [0, 39, 41, 43, 44, 45, 47, 49, 50, 52, 53, 54, 56, 58, 59, 61, 62, 63, 65, 67, 69, 70, 71, 73, 75, 77, 79, 80, 81, 83, 85, 86, 88, 89, 90, 92, 94, 95, 97, 98, 100]# noqa: E501 + + # 力智 + STRINT = [0, 154, 164, 176, 186, 197, 206, 216, 227, 237, 249, 259, 269, 280, 290, 302, 311, 321, 332, 342, 353, 363, 374, 385, 395, 406, 415, 425, 437, 447, 458, 468, 478, 489, 500, 511, 520, 530, 541, 551, 563]# noqa: E501 +# 圣光烬盾 세인트 월 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/5dc7008b12a459325b548b0715c6b73c?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill12(ActiveSkill): + name = "圣光烬盾" + learnLv = 30 + masterLv = 60 + maxLv = 70 + position = 8 #TODO + rangeLv = 2 + cd = 10 + mp = [91, 763] + + data0 = [0, 4174, 4595, 5018, 5443, 5867, 6288, 6712, 7137, 7560, 7982, 8407, 8830, 9253, 9676, 10100, 10523, 10946, 11371, 11793, 12216, 12640, 13065, 13488, 13909, 14333, 14758, 15181, 15603, 16028, 16451, 16874, 17296, 17721, 18144, 18567, 18992, 19414, 19837, 20261, 20686, 21107, 21531, 21954, 22379, 22802, 23224, 23649, 24072, 24495, 24917, 25342, 25765, 26189, 26610, 27035, 27458, 27882, 28307, 28728, 29152, 29577, 30000, 30422, 30845, 31270, 31693, 32115, 32538, 32963, 33386]# noqa: E501 + hit0 = 1 #TODO + + data1 = [0, 9736, 10725, 11713, 12701, 13688, 14678, 15664, 16653, 17641, 18627, 19616, 20602, 21592, 22579, 23567, 24555, 25544, 26530, 27520, 28507, 29495, 30483, 31472, 32458, 33446, 34435, 35421, 36411, 37397, 38386, 39374, 40361, 41349, 42339, 43325, 44314, 45302, 46289, 47277, 48266, 49252, 50240, 51230, 52216, 53205, 54191, 55180, 56168, 57156, 58143, 59133, 60119, 61108, 62096, 63084, 64071, 65059, 66047, 67034, 68024, 69010, 69999, 70987, 71975, 72962, 73952, 74938, 75927, 76913, 77903]# noqa: E501 + hit1 = 1 #TODO + +# 神光惩戒 샤인 크로스 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/7e904ea3d2a9faa054604e55120a9268?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill13(ActiveSkill): + name = "神光惩戒" + learnLv = 30 + masterLv = 60 + maxLv = 70 + position = 6 #TODO + rangeLv = 2 + cd = 10 + mp = [400, 1000] + + data0 = [0, 2708, 2984, 3257, 3531, 3806, 4082, 4357, 4633, 4905, 5180, 5455, 5731, 6006, 6278, 6554, 6829, 7104, 7380, 7655, 7927, 8203, 8478, 8753, 9029, 9302, 9576, 9852, 10127, 10402, 10676, 10951, 11225, 11501, 11776, 12050, 12325, 12600, 12876, 13150, 13423, 13699, 13974, 14249, 14525, 14797, 15072, 15348, 15623, 15898, 16174, 16446, 16721, 16997, 17272, 17547, 17819, 18095, 18370, 18646, 18921, 19195, 19468, 19744, 20019, 20295, 20568, 20844, 21117, 21393, 21668]# noqa: E501 + hit0 = 1 #TODO + + data1 = [0, 4063, 4473, 4886, 5299, 5712, 6122, 6535, 6948, 7359, 7771, 8184, 8597, 9008, 9420, 9833, 10244, 10657, 11069, 11482, 11893, 12306, 12718, 13129, 13542, 13955, 14367, 14778, 15191, 15604, 16014, 16427, 16840, 17250, 17663, 18076, 18489, 18899, 19312, 19725, 20137, 20548, 20961, 21374, 21786, 22199, 22610, 23021, 23435, 23848, 24259, 24670, 25084, 25497, 25906, 26319, 26733, 27142, 27555, 27968, 28382, 28791, 29204, 29617, 30029, 30440, 30853, 31266, 31678, 32089, 32502]# noqa: E501 + hit1 = 1 #TODO + + data2 = [0, 6769, 7458, 8143, 8832, 9518, 10205, 10892, 11579, 12266, 12954, 13639, 14328, 15013, 15701, 16390, 17075, 17763, 18448, 19137, 19822, 20511, 21197, 21884, 22571, 23258, 23945, 24631, 25318, 26007, 26692, 27380, 28065, 28754, 29439, 30127, 30814, 31501, 32188, 32875, 33561, 34250, 34935, 35624, 36309, 36997, 37682, 38371, 39059, 39744, 40433, 41118, 41806, 42493, 43180, 43867, 44554, 45240, 45927, 46614, 47303, 47988, 48676, 49361, 50050, 50735, 51423, 52110, 52797, 53484, 54171]# noqa: E501 + hit2 = 1 #TODO + + +# 勇气圣歌 용맹의 아리아 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/506e7ed77d517419a6e1c437a2cedb17?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill14(ActiveBufferSkill): + name = "勇气圣歌" + learnLv = 35 + masterLv = 60 + maxLv = 70 + position = 2 #TODO + rangeLv = 3 + cube = 1 + cd = 40 + mp = [150, 1260] + buffer = True + + data0 = [0, 2069, 2399, 2727, 3059, 3389, 3717, 4049, 4379, 4707, 5039, 5367, 5697, 6029, 6357, 6687, 7019, 7347, 7677, 8007, 8337, 8667, 8997, 9327, 9656, 9987, 10317, 10646, 10977, 11306, 11636, 11967, 12296, 12626, 12957, 13286, 13616, 13946, 14276, 14606, 14936, 15266, 15594, 15926, 16256, 16584, 16916, 17244, 17574, 17906, 18234, 18564, 18893, 19224, 19554, 19883, 20214, 20544, 20873, 21204, 21533, 21863, 22194, 22523, 22853, 23183, 23513, 23843, 24173, 24503, 24831]# noqa: E501 + hit0 = 1 #TODO + + data1 = [0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15]# noqa: E501 + hit0 = 1 #TODO + + def getSkillDate(self): + prep = self.char.GetSkillByName("勇气祝福").getSkillDate() + ratio = self.data1[self.lv] / 100 + return prep[0] * ratio, [prep[1][0]*ratio,prep[1][1],prep[1][2]*ratio], [prep[2][0]*ratio,prep[2][1],prep[2][2]*ratio],0,self.getSkillCD() + +# 神圣锁环 홀리 써클릿 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/8ee0099656df08a0b39225f8a21d514b?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill15(ActiveSkill): + name = "神圣锁环" + learnLv = 35 + masterLv = 60 + maxLv = 70 + position = 8 #TODO + rangeLv = 2 + cube = 1 + cd = 18 + mp = [150, 1260] + + data0 = [0, 368, 405, 443, 479, 516, 555, 593, 629, 666, 705, 741, 779, 816, 852, 891, 929, 965, 1002, 1041, 1079, 1115, 1152, 1191, 1227, 1265, 1302, 1338, 1377, 1415, 1451, 1488, 1527, 1565, 1601, 1638, 1676, 1713, 1751, 1788, 1824, 1863, 1901, 1937, 1974, 2012, 2049, 2087, 2124, 2160, 2199, 2237, 2274, 2310, 2348, 2387, 2423, 2460, 2498, 2535, 2573, 2610, 2646, 2685, 2723, 2760, 2796, 2834, 2873, 2909, 2946]# noqa: E501 + hit0 = 13 + + data2 = [0, 11174, 12308, 13440, 14574, 15707, 16842, 17975, 19109, 20243, 21375, 22509, 23642, 24777, 25910, 27044, 28178, 29310, 30444, 31578, 32712, 33845, 34979, 36113, 37245, 38379, 39513, 40647, 41780, 42914, 44048, 45180, 46316, 47448, 48582, 49715, 50849, 51983, 53115, 54251, 55383, 56517, 57650, 58784, 59918, 61052, 62186, 63318, 64452, 65585, 66719, 67853, 68987, 70121, 71253, 72387, 73520, 74654, 75789, 76922, 78056, 79188, 80322, 81455, 82590, 83724, 84857, 85991, 87123, 88257, 89390]# noqa: E501 + hit2 = 1 #TODO + +# 神之教诲 에디피케이션 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/9bff7f2559e003766fee2853dca00631?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill16(ActiveBufferSkill): + name = "神之教诲" + learnLv = 35 + masterLv = 1 + maxLv = 1 + position = 5 #TODO + rangeLv = 2 + cube = 1 + cd = 20 + mp = [630, 630] + + +# 忏悔之雷 정화의 번개 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/da6e37c1e3f0e8867f70007d89c239ff?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill17(ActiveSkill): + name = "忏悔之雷" + learnLv = 40 + masterLv = 60 + maxLv = 70 + position = 8 #TODO + rangeLv = 2 + cube = 1 + cd = 18 + mp = [160, 1344] + + data0 = [0, 2289, 2523, 2753, 2987, 3219, 3452, 3684, 3915, 4148, 4380, 4613, 4845, 5076, 5309, 5543, 5775, 6008, 6239, 6471, 6704, 6936, 7169, 7400, 7632, 7865, 8099, 8331, 8562, 8795, 9027, 9260, 9492, 9723, 9956, 10188, 10421, 10655, 10886, 11118, 11351, 11583, 11816, 12047, 12279, 12512, 12744, 12977, 13208, 13442, 13674, 13907, 14139, 14370, 14603, 14835, 15068, 15300, 15531, 15764, 15998, 16230, 16463, 16694, 16926, 17159, 17391, 17624, 17855, 18087, 18320]# noqa: E501 + hit0 = 5 + + data1 = [0, 11450, 12612, 13773, 14934, 16097, 17258, 18420, 19581, 20744, 21905, 23066, 24228, 25389, 26552, 27713, 28875, 30036, 31197, 32360, 33521, 34683, 35844, 37007, 38168, 39330, 40491, 41652, 42815, 43976, 45138, 46299, 47462, 48623, 49784, 50946, 52107, 53270, 54431, 55593, 56754, 57917, 59078, 60239, 61401, 62562, 63725, 64886, 66048, 67209, 68370, 69533, 70694, 71856, 73017, 74180, 75341, 76502, 77664, 78825, 79988, 81149, 82311, 83472, 84635, 85796, 86957, 88119, 89280, 90443, 91604]# noqa: E501 + hit1 = 1 #TODO + +# 复苏之光 부활 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/a6c8f69107f8c4f5d1a0c7a57d000290?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill18(ActiveSkill): + name = "复苏之光" + learnLv = 40 + masterLv = 1 + maxLv = 11 + position = 5 #TODO + rangeLv = 2 + cube = 2 + mp = [200, 1680] + + def getSkillCD(self): + return 0 + +# 神光十字 그랜드 크로스 크래쉬 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/3829c15bf5f520c13998a3479ba0ce7b?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill19(ActiveBufferSkill): + name = "神光十字" + learnLv = 45 + masterLv = 60 + maxLv = 70 + position = 6 #TODO + rangeLv = 2 + cube = 2 + cd = 45 + mp = [350, 2940] + damage = True + + data0 = [0, 18954, 20876, 22800, 24722, 26646, 28568, 30491, 32414, 34337, 36260, 38183, 40104, 42029, 43950, 45875, 47796, 49719, 51642, 53565, 55488, 57411, 59333, 61257, 63179, 65103, 67025, 68949, 70871, 72794, 74717, 76640, 78561, 80486, 82407, 84332, 86253, 88178, 90099, 92022, 93945, 95868, 97791, 99714, 101636, 103560, 105483, 107406, 109329, 111251, 113175, 115097, 117021, 118943, 120867, 122789, 124712, 126635, 128558, 130479, 132404, 134325, 136250, 138171, 140096, 142017, 143940, 145863, 147786, 149709, 151632]# noqa: E501 + hit0 = 1 #TODO + + data1 = [0, 28431, 31316, 34199, 37083, 39968, 42852, 45737, 48620, 51506, 54389, 57273, 60158, 63042, 65927, 68810, 71696, 74580, 77463, 80348, 83234, 86117, 89001, 91884, 94770, 97655, 100538, 103422, 106307, 109191, 112076, 114960, 117845, 120728, 123612, 126498, 129381, 132266, 135149, 138035, 140919, 143802, 146687, 149573, 152456, 155340, 158225, 161109, 163994, 166877, 169763, 172646, 175530, 178415, 181299, 184184, 187067, 189951, 192837, 195720, 198605, 201491, 204374, 207258, 210141, 213027, 215912, 218795, 221679, 224564, 227448]# noqa: E501 + hit1 = 1 #TODO + + STRINT = [0, 78, 84, 90, 96, 102, 108, 114, 120, 126, 132, 138, 144, 150, 156, 162, 168, 174, 180, 186, 192, 198, 204, 210, 216, 222, 228, 234, 240, 246, 252, 258, 264, 270, 276, 282, 288, 294, 300, 306, 312, 318, 324, 330, 336, 342, 348, 354, 360, 366, 372, 378, 384, 390, 396, 402, 408, 414, 420, 426, 432, 438, 444, 450, 456, 462, 468, 474, 480, 486, 492]# noqa: E501 + +# 新生圣歌 재생의 아리아 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/03bb5314ffd41e9458d67ef924fef38f?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill20(ActiveBufferSkill): + name = "新生圣歌" + learnLv = 45 + masterLv = 1 + maxLv = 11 + position = 2 #TODO + rangeLv = 2 + cube = 2 + cd = 40 + mp = [350, 2940] + + +# 虔诚信念 신실한 열정 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/1dad88963abdc96b091fcab185a8820d?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill21(ActiveBufferSkill): + name = "虔诚信念" + learnLv = 48 + masterLv = 40 + maxLv = 50 + position = 7 #TODO + rangeLv = 3 + + STRINT = [0, 14, 37, 59, 82, 104, 127, 149, 172, 194, 217, 239, 262, 284, 307, 329, 352, 374, 397, 419, 442, 464, 487, 509, 532, 554, 577, 599, 622, 644, 667, 689, 712, 734, 757, 779, 802, 824, 847, 869, 892, 914, 937, 959, 982, 1004, 1027, 1049, 1072, 1094, 1117]# noqa: E501 + hit0 = 1 #TODO + + data0 = [0, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31.5, 33, 34.5, 36, 37.5, 39, 40.5, 42, 43.5, 45, 46.5, 48, 49.5, 51, 52.5, 54, 55.5, 57, 58.5, 60, 61.5, 63, 64.5, 66, 67.5, 69, 70.5, 72, 73.5, 75]# noqa: E501 + + INT = STRINT + + associate = [ + {"data":INT,"type":"$+INT","ratio":1} + ] + + +# 圣光天启 크럭스 오브 빅토리아 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/bb34e8854a93fd250347a1c64119f7ab?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill22(ActiveBufferSkill): + name = "圣光天启" + learnLv = 50 + masterLv = 40 + maxLv = 50 + position = 6 #TODO + rangeLv = 5 + cube = 5 + cd = 170 + mp = [1200, 10080] + buffType = 'awake' + + STRINT = [0, 43, 57, 74, 91, 111, 131, 153, 176, 201, 228, 255, 284, 315, 346, 379, 414, 449, 487, 526, 567, 608, 651, 696, 741, 789, 838, 888, 939, 993, 1047, 1103, 1160, 1219, 1278, 1340, 1403, 1467, 1533, 1600, 1668, 1736, 1804, 1872, 1940, 2008, 2076, 2144, 2212, 2280, 2348]# noqa: E501 + + data0 = [0, 2277, 2805, 3334, 3862, 4390, 4918, 5447, 5975, 6503, 7031, 7560, 8088, 8616, 9145, 9673, 10201, 10729, 11259, 11787, 12315, 12843, 13372, 13900, 14428, 14957, 15485, 16013, 16541, 17070, 17598, 18126, 18654, 19183, 19711, 20239, 20767, 21296, 21824, 22352, 22881, 23409, 23937, 24465, 24994, 25522, 26050, 26578, 27107, 27635, 28162]# noqa: E501 + hit0 = 16 + + data1 = [0, 67694, 83391, 99089, 114786, 130483, 146181, 161877, 177574, 193271, 208969, 224666, 240363, 256061, 271758, 287455, 303153, 318850, 334547, 350244, 365943, 381640, 397337, 413035, 428732, 444429, 460125, 475823, 491520, 507217, 522915, 538612, 554309, 570007, 585704, 601401, 617098, 632796, 648493, 664190, 679888, 695585, 711282, 726980, 742677, 758374, 774070, 789768, 805465, 821162, 836860]# noqa: E501 + hit1 = 1 #TODO + +# 忏悔重击 리펜텐스 스매시 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/27bade584bb42fef68148d3a0b72bace?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill23(ActiveSkill): + name = "忏悔重击" + learnLv = 60 + masterLv = 40 + maxLv = 50 + position = 6 #TODO + rangeLv = 2 + cube = 2 + cd = 30 + mp = [400, 1000] + + data0 = [0, 16059, 17690, 19319, 20948, 22575, 24204, 25835, 27464, 29093, 30722, 32351, 33981, 35610, 37239, 38868, 40497, 42128, 43757, 45386, 47015, 48644, 50274, 51903, 53532, 55161, 56790, 58421, 60050, 61679, 63308, 64937, 66567, 68196, 69824, 71453, 73082, 74712, 76341, 77970, 79599, 81228, 82859, 84488, 86117, 87746, 89375, 91005, 92634, 94263, 95892]# noqa: E501 + hit0 = 1 #TODO + + data1 = [0, 24089, 26532, 28977, 31421, 33864, 36308, 38753, 41196, 43641, 46083, 48527, 50972, 53415, 55860, 58302, 60747, 63191, 65636, 68079, 70521, 72966, 75410, 77855, 80298, 82742, 85185, 87630, 90074, 92519, 94961, 97404, 99849, 102293, 104738, 107180, 109625, 112068, 114513, 116957, 119399, 121844, 124287, 126732, 129176, 131619, 134063, 136508, 138951, 141396, 143838]# noqa: E501 + hit1 = 1 #TODO + +# 圣洁之翼 대천사의 축복 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/04883563896fe1adac7505c6146b5f59?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill24(ActiveBufferSkill): + name = "圣洁之翼" + learnLv = 70 + masterLv = 40 + maxLv = 50 + position = 5 #TODO + rangeLv = 2 + cube = 2 + cd = 50 + mp = [860, 1500] + + data0 = [0, 68789, 75767, 82745, 89723, 96704, 103682, 110660, 117638, 124616, 131597, 138575, 145553, 152531, 159509, 166488, 173468, 180446, 187424, 194402, 201381, 208359, 215339, 222317, 229295, 236274, 243252, 250230, 257210, 264188, 271167, 278145, 285123, 292103, 299081, 306060, 313038, 320016, 326994, 333975, 340953, 347931, 354909, 361887, 368868, 375846, 382824, 389802, 396780, 403760, 410739]# noqa: E501 + hit0 = 1 + +# 大天使的庇护 라파엘의 축복 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/dbf8b30c7057032af0d68fcfa289fdae?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill25(PassiveBufferSkill): + name = "大天使的庇护" + learnLv = 75 + masterLv = 40 + maxLv = 50 + position = 2 #TODO + rangeLv = 3 + + INT = [0, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280, 290, 300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 410, 420, 430, 440, 450, 460, 470, 480, 490, 500, 510, 520, 530, 540, 550, 560, 570, 580, 590, 600, 610, 620, 630, 640]# noqa: E501 + + data0 = [0, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114] + + associate = [ + {"data":INT ,"type":"$+INT","ratio":1} + ] + +# 圣佑之阵 우리엘의 결계 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/5152480fdde81362575a488d4cec4af9?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill26(ActiveBufferSkill): + name = "圣佑之阵" + learnLv = 75 + masterLv = 40 + maxLv = 50 + position = 4 #TODO + rangeLv = 2 + cube = 3 + cd = 50 + mp = [580, 4500] + damage = True + + data0 = [0, 86713, 95510, 104307, 113104, 121901, 130698, 139495, 148292, 157089, 165887, 174683, 183481, 192277, 201075, 209871, 218669, 227465, 236263, 245059, 253857, 262653, 271451, 280248, 289045, 297842, 306639, 315436, 324233, 333030, 341827, 350624, 359421, 368218, 377016, 385812, 394610, 403406, 412204, 421000, 429798, 438594, 447392, 456188, 464986, 473782, 482580, 491377, 500174, 508971, 517768]# noqa: E501 + hit0 = 1 #TODO + +# 圣光普照 미라클 샤인 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/2391a27457b5a8c6fa4b4670a91bdd11?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill27(ActiveSkill): + name = "圣光普照" + learnLv = 80 + masterLv = 40 + maxLv = 50 + position = 3 #TODO + rangeLv = 2 + cube = 5 + cd = 40 + mp = [860, 1500] + + data0 = [0, 8237, 9073, 9909, 10745, 11580, 12416, 13251, 14087, 14923, 15759, 16595, 17431, 18266, 19101, 19937, 20773, 21609, 22445, 23281, 24116, 24951, 25787, 26623, 27459, 28295, 29131, 29966, 30801, 31637, 32473, 33309, 34145, 34981, 35817, 36651, 37487, 38323, 39159, 39995, 40831, 41667, 42501, 43337, 44173, 45009, 45845, 46681, 47517, 48352, 49187]# noqa: E501 + hit0 = 1 + + # 单体怪物增伤 + skillRation = 1.1 + + +# 救赎彼岸 : 惩戒圣枪 성창 : 브류나크 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/5892d1fa4462e561ac8f8d2c74892b0a?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill28(ActiveSkill): + name = "救赎彼岸 : 惩戒圣枪" + learnLv = 85 + masterLv = 40 + maxLv = 50 + position = 5 #TODO + rangeLv = 5 + cube = 10 + cd = 180 + mp = [2500, 5000] + icon = '$char/救赎彼岸:惩戒圣枪' + + data0 = [0, 77606, 95601, 113597, 131592, 149588, 167583, 185579, 203575, 221570, 239566, 257561, 275557, 293553, 311548, 329544, 347539, 365535, 383530, 401526, 419522, 437517, 455514, 473508, 491505, 509501, 527496, 545492, 563487, 581483, 599478, 617474, 635470, 653465, 671461, 689456, 707452, 725448, 743443, 761439, 779434, 797430, 815425, 833421, 851417, 869412, 887408, 905403, 923399, 941395, 959390]# noqa: E501 + hit0 = 1 #TODO + + data1 = [0, 116409, 143401, 170395, 197389, 224382, 251376, 278369, 305363, 332356, 359349, 386342, 413336, 440329, 467323, 494317, 521310, 548304, 575296, 602290, 629283, 656277, 683270, 710264, 737257, 764251, 791243, 818237, 845230, 872224, 899218, 926211, 953205, 980197, 1007191, 1034184, 1061178, 1088171, 1115165, 1142158, 1169152, 1196144, 1223138, 1250132, 1277125, 1304119, 1331112, 1358106, 1385099, 1412093, 1439085]# noqa: E501 + hit1 = 1 #TODO + +# 圣天使之光 루클렌티스 엔젤 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/5cac3411ccef1af333953e0ded5e942d?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill29(PassiveBufferSkill): + name = "圣天使之光" + learnLv = 95 + masterLv = 40 + maxLv = 50 + position = 5 #TODO + rangeLv = 3 + + data0 = [0, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118]# noqa: E501 + hit0 = 1 #TODO + + INT = [0, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280, 290, 300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 410, 420, 430, 440, 450, 460, 470, 480, 490, 500, 510, 520, 530, 540, 550, 560, 570, 580, 590, 600, 610, 620, 630, 640, 650]# noqa: E501 + + associate = [ + {"data":INT,"type":"$+INT","ratio":1} + ] +# 圣言十字 크럭스 오브 샤피엘 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/85f7c810ad503790e8626439fe936d56?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill30(ActiveSkill): + name = "圣言十字" + learnLv = 95 + masterLv = 40 + maxLv = 50 + position = 7 #TODO + rangeLv = 2 + cube = 7 + cd = 60 + mp = [960, 7200] + + data0 = [0, 33632, 37044, 40456, 43868, 47280, 50692, 54104, 57516, 60928, 64340, 67752, 71164, 74576, 77988, 81400, 84812, 88224, 91636, 95048, 98460, 101872, 105284, 108696, 112108, 115520, 118932, 122344, 125756, 129168, 132580, 135992, 139404, 142816, 146228, 149640, 153052, 156464, 159876, 163288, 166700, 170112, 173524, 176936, 180348, 183760, 187172, 190584, 193996, 197408, 200820]# noqa: E501 + hit0 = 1 #TODO + + data1 = [0, 2102, 2315, 2528, 2741, 2954, 3167, 3381, 3594, 3807, 4021, 4234, 4448, 4661, 4874, 5087, 5300, 5514, 5727, 5940, 6153, 6366, 6579, 6793, 7006, 7219, 7433, 7646, 7860, 8073, 8286, 8499, 8712, 8926, 9139, 9352, 9565, 9778, 9991, 10205, 10418, 10631, 10845, 11058, 11272, 11485, 11698, 11911, 12124, 12338, 12551]# noqa: E501 + hit1 = 1 #TODO + + data2 = [0, 92489, 101872, 111255, 120639, 130021, 139404, 148787, 158171, 167553, 176936, 186319, 195703, 205086, 214468, 223851, 233235, 242618, 252000, 261383, 270767, 280150, 289532, 298915, 308299, 317682, 327064, 336447, 345831, 355214, 364596, 373979, 383363, 392746, 402128, 411511, 420895, 430278, 439661, 449043, 458427, 467810, 477193, 486576, 495959, 505342, 514725, 524108, 533491, 542874, 552257]# noqa: E501 + hit2 = 1 #TODO + +# 祈愿·天使赞歌 라우스 디 안젤루스 +# https://api.neople.co.kr/df/skills/0c1b401bb09241570d364420b3ba3fd7/002cbdd9bfd0f0b970451ae8d48d029e?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 +class Skill31(ActiveBufferSkill): + name = "祈愿·天使赞歌" + learnLv = 100 + masterLv = 40 + maxLv = 50 + position = 5 #TODO + rangeLv = 5 + cube = 15 + cd = 290 + mp = [4025, 8055] + + data0 = [0, 22510, 27730, 32950, 38170, 43390, 48610, 53829, 59049, 64269, 69489, 74709, 79929, 85149, 90368, 95588, 100808, 106028, 111248, 116468, 121688, 126907, 132127, 137347, 142567, 147787, 153007, 158227, 163446, 168666, 173886, 179106, 184326, 189546, 194766, 199985, 205205, 210425, 215645, 220865, 226085, 231305, 236524, 241744, 246964, 252184, 257404, 262624, 267844, 273063, 278283]# noqa: E501 + hit0 = 1 #TODO + + data2 = [0, 337659, 415956, 494254, 572552, 650851, 729149, 807447, 885745, 964042, 1042340, 1120638, 1198936, 1277234, 1355532, 1433829, 1512127, 1590425, 1668723, 1747021, 1825319, 1903616, 1981914, 2060212, 2138510, 2216808, 2295106, 2373404, 2451701, 2529999, 2608297, 2686595, 2764893, 2843190, 2921488, 2999786, 3078085, 3156382, 3234680, 3312978, 3391276, 3469574, 3547872, 3626170, 3704467, 3782766, 3861064, 3939361, 4017659, 4095957, 4174255]# noqa: E501 + hit2 = 1 #TODO + +class classChange(Character): + def __init__(self, equVersion=''): + + super().__init__(equVersion) + self.name = 'crusader_female' + self.nameCN = '神启·圣职者' + self.role = 'priest_female' + + self.武器选项 = ['十字架','镰刀', '念珠', '战斧','图腾' ] + self.输出类型选项 = ['魔法固伤'] + self.输出类型 = '魔法固伤' + self.防具精通属性 = ['智力'] + self.武器类型 = '十字架' + self.防具类型 = '板甲' + self.buff = 2.335 + + self.角色 = '圣职者(女)' + + self.职业 = '圣骑士' + + self.buffer = True + + self.适用属性 = '智力' + + self.load_skills() + + + def load_skills(self): + """加载技能""" + skills = [] + skills_dict = {} + i = 0 + while i >= 0: + try: + tem = eval('Skill' + str(i) + '(char=self)') + skills_dict[tem.name] = tem + skills.append(tem) + if tem.buffer and tem.buffType == 'buff': + self.BuffSkill = tem + if tem.buffer and tem.buffType == 'awake': + self.AwakeSkill = tem + i += 1 + except Exception as ex: + print(ex) + i = -1 + self.skills = skills + self.skills_dict = skills_dict diff --git a/backend/core/character/adventure.py b/backend/core/character/adventure.py index 58bb648e..83e24107 100644 --- a/backend/core/character/adventure.py +++ b/backend/core/character/adventure.py @@ -21,8 +21,8 @@ adv = [ 'children': [ {'id': 0, 'name': 'sword_master', 'title': '极诣·驭剑士', 'open': False}, {'id': 1, 'name': 'dark_templar', 'title': '极诣·暗殿骑士', 'open': False}, - {'id': 2, 'name': 'demon_slayer', 'title': '极诣·契魔者', 'open': True, 'class': 'GF.swordman_female.demon_slayer'}, - {'id': 3, 'name': 'vegabond', 'title': '极诣·流浪武士', 'open': True, 'class': 'GF.swordman_female.vegabond'}, + {'id': 2, 'name': 'demon_slayer', 'title': '极诣·契魔者', 'open': True, 'class': 'GF.swordman_female.demon_slayer'}, + {'id': 3, 'name': 'vegabond', 'title': '极诣·流浪武士', 'open': True, 'class': 'GF.swordman_female.vegabond'}, {'id': 4, 'name': 'spectre', 'title': '极诣·刃影', 'open': False}, ], }, @@ -131,8 +131,9 @@ adv = [ 'id': 0, 'name': 'crusader_female', 'title': '神启·圣骑士', - 'open': False, - 'options': [{'id': 0, 'name': 'default', 'title': '奶', 'class': 'crusader_female'}, {'id': 1, 'name': 'default', 'title': '输出', 'class': 'crusader_female_carry'}], + 'open': True, + 'class': 'GF.priest_female.crusader_female' + # 'options': [{'id': 0, 'name': 'default', 'title': '奶', 'class': 'GF.priest_female.crusader_female', "open": True}, {'id': 1, 'name': 'default', 'title': '输出', 'class': 'crusader_female_carry'}], }, {'id': 1, 'name': 'inquistor', 'title': '神启·异端审判者', 'open': False}, {'id': 2, 'name': 'sorceress', 'title': '神启·巫女', 'open': False}, @@ -230,7 +231,6 @@ def get_adv_list(): return adv -@cache def get_adv_info(value): value = base64.b64decode(value).decode() parent_id, child_id, option_id = map(int, (value[:2], value[2:4], value[4:6])) diff --git a/backend/core/equipment/version_0/enchant.py b/backend/core/equipment/version_0/enchant.py index 93c8e3b1..06282ff1 100644 --- a/backend/core/equipment/version_0/enchant.py +++ b/backend/core/equipment/version_0/enchant.py @@ -58,7 +58,7 @@ def enchant_101(char: CharacterProperty): """ char.SetStatus(四维=100) if char.buffer: - char.AddSkillLv(15, 15, 3, 1) + char.AddSkillLv(15, 15, 3, 0) pass @@ -68,7 +68,7 @@ def enchant_102(char: CharacterProperty): """ char.SetStatus(四维=120) if char.buffer: - char.AddSkillLv(15, 15, 3, 1) + char.AddSkillLv(15, 15, 3, 0) pass @@ -86,7 +86,7 @@ def enchant_104(char: CharacterProperty): """ char.SetStatus(四维=125) if char.buffer: - char.AddSkillLv(15, 15, 4, 1) + char.AddSkillLv(15, 15, 4, 0) pass @@ -108,7 +108,7 @@ def enchant_106(char: CharacterProperty): """ char.SetStatus(四维=120) if char.buffer: - char.AddSkillLv(15, 15, 3, 1) + char.AddSkillLv(15, 15, 3, 0) pass @@ -190,7 +190,7 @@ def enchant_201(char: CharacterProperty): """ char.SetStatus(四维=125) if char.buffer: - char.AddSkillLv(15, 15, 4, 1) + char.AddSkillLv(15, 15, 4, 0) pass @@ -227,8 +227,8 @@ def enchant_302(char: CharacterProperty): 四维(45)|Lv1~50主动+1 """ char.SetStatus(四维=45) - if char.buffer: - char.AddSkillLv(1, 50, 1, 1) + print("~~~~~~~~~~") + char.AddSkillLv(1, 50, 1, 1) pass @@ -447,7 +447,7 @@ def enchant_607(char: CharacterProperty): """ char.SetStatus(四维=100) if char.buffer: - char.AddSkillLv(15, 15, 1, 1) + char.AddSkillLv(15, 15, 1, 0) pass @@ -501,7 +501,7 @@ def enchant_903(char: CharacterProperty): """ char.SetStatus(四维=100) if char.buffer: - char.AddSkillLv(15, 15, 3, 1) + char.AddSkillLv(15, 15, 3, 0) pass @@ -561,7 +561,7 @@ def enchant_1002(char: CharacterProperty): """ char.SetStatus(四维=100) if char.buffer: - char.AddSkillLv(15, 15, 3, 1) + char.AddSkillLv(15, 15, 3, 0) pass @@ -582,7 +582,7 @@ def enchant_1004(char: CharacterProperty): """ char.SetStatus(四维=120) if char.buffer: - char.AddSkillLv(15, 15, 3, 1) + char.AddSkillLv(15, 15, 3, 0) pass @@ -1381,7 +1381,7 @@ def enchant_2705(char: CharacterProperty): """ 三攻(30)|三速(5%)|增益量(1%) """ - char.SetStatus(三攻=30, 三速=0.05, 增益量=0.01) + char.SetStatus(三攻=30, 三速=0.05, 增益量P=0.01) pass @@ -1405,7 +1405,7 @@ def enchant_2708(char: CharacterProperty): """ 四维(50)|三速(5%)|增益量(1%) """ - char.SetStatus(四维=50, 三速=0.05, 增益量=0.01) + char.SetStatus(四维=50, 三速=0.05, 增益量P=0.01) pass @@ -1413,7 +1413,7 @@ def enchant_2709(char: CharacterProperty): """ 三攻(50)|三速(5%)|增益量(3%) """ - char.SetStatus(三攻=50, 三速=0.05, 增益量=0.03) + char.SetStatus(三攻=50, 三速=0.05, 增益量P=0.03) pass @@ -1421,7 +1421,7 @@ def enchant_2710(char: CharacterProperty): """ 四维(100)|三速(5%)|增益量(3%) """ - char.SetStatus(四维=100, 三速=0.05, 增益量=0.03) + char.SetStatus(四维=100, 三速=0.05, 增益量P=0.03) pass diff --git a/backend/core/equipment/version_0/equ.py b/backend/core/equipment/version_0/equ.py index 6e128b51..c0e52795 100644 --- a/backend/core/equipment/version_0/equ.py +++ b/backend/core/equipment/version_0/equ.py @@ -11465,7 +11465,7 @@ def equ_3010(char: CharacterProperty): Lv15~35所有技能+1 所有速度+3% """ - char.AddSkillLv(15,35,1,0) + char.AddSkillLv(15,35,1) char.SetStatus(SpeedM=0.03,SpeedA=0.03,SpeedR=0.03) pass @@ -11478,7 +11478,7 @@ def equ_3011(char: CharacterProperty): Lv15~35所有技能+1 所有速度+3% """ - char.AddSkillLv(15,35,1,0) + char.AddSkillLv(15,35,1) char.SetStatus(SpeedM=0.03,SpeedA=0.03,SpeedR=0.03) pass @@ -11492,7 +11492,7 @@ def equ_3012(char: CharacterProperty): 所有属性强化+15 所有速度+3% """ - char.AddSkillLv(15,35,1,0) + char.AddSkillLv(15,35,1) char.AddElementDB('火',15) char.AddElementDB('冰',15) char.AddElementDB('光',15) @@ -11510,7 +11510,7 @@ def equ_3013(char: CharacterProperty): 所有属性强化+15 所有速度+3% """ - char.AddSkillLv(15,35,1,0) + char.AddSkillLv(15,35,1) char.AddElementDB('火',15) char.AddElementDB('冰',15) char.AddElementDB('光',15) @@ -11551,7 +11551,7 @@ def equ_4000(char: CharacterProperty): 所有速度+5% 技能冷却时间-5% """ - char.AddSkillLv(1,80,1,0) + char.AddSkillLv(1,80,1) char.AddElementDB('火',25) char.AddElementDB('冰',25) char.AddElementDB('光',25) @@ -11573,7 +11573,7 @@ def equ_4001(char: CharacterProperty): 所有速度+5% 技能冷却时间-5% """ - char.AddSkillLv(1,80,1,0) + char.AddSkillLv(1,80,1) char.AddElementDB('火',25) char.AddElementDB('冰',25) char.AddElementDB('光',25) @@ -11595,7 +11595,7 @@ def equ_4002(char: CharacterProperty): 所有速度+5% 技能冷却时间-5% """ - char.AddSkillLv(1,95,1,0) + char.AddSkillLv(1,95,1) char.AddElementDB('火',25) char.AddElementDB('冰',25) char.AddElementDB('光',25) @@ -11617,7 +11617,7 @@ def equ_4003(char: CharacterProperty): 所有速度+5% 技能冷却时间-5% """ - char.AddSkillLv(1,95,1,0) + char.AddSkillLv(1,95,1) char.AddElementDB('火',25) char.AddElementDB('冰',25) char.AddElementDB('光',25) @@ -11639,7 +11639,7 @@ def equ_4004(char: CharacterProperty): 所有速度+5% 技能冷却时间-5% """ - char.AddSkillLv(1,95,1,0) + char.AddSkillLv(1,95,1) char.AddElementDB('火',25) char.AddElementDB('冰',25) char.AddElementDB('光',25) @@ -11661,7 +11661,7 @@ def equ_4005(char: CharacterProperty): 所有速度+5% 技能冷却时间-5% """ - char.AddSkillLv(1,95,1,0) + char.AddSkillLv(1,95,1) char.AddElementDB('火',25) char.AddElementDB('冰',25) char.AddElementDB('光',25) @@ -11683,7 +11683,7 @@ def equ_4006(char: CharacterProperty): 所有速度+5% 技能冷却时间-5% """ - char.AddSkillLv(1,95,1,0) + char.AddSkillLv(1,95,1) char.AddElementDB('火',25) char.AddElementDB('冰',25) char.AddElementDB('光',25) @@ -11705,7 +11705,7 @@ def equ_4007(char: CharacterProperty): 所有速度+5% 技能冷却时间-5% """ - char.AddSkillLv(1,95,1,0) + char.AddSkillLv(1,95,1) char.AddElementDB('火',25) char.AddElementDB('冰',25) char.AddElementDB('光',25) @@ -11727,7 +11727,7 @@ def equ_4008(char: CharacterProperty): 所有速度+5% 技能冷却时间-5% """ - char.AddSkillLv(1,95,1,0) + char.AddSkillLv(1,95,1) char.AddElementDB('火',25) char.AddElementDB('冰',25) char.AddElementDB('光',25) @@ -11749,7 +11749,7 @@ def equ_4009(char: CharacterProperty): 所有速度+5% 技能冷却时间-5% """ - char.AddSkillLv(1,95,1,0) + char.AddSkillLv(1,95,1) char.AddElementDB('火',25) char.AddElementDB('冰',25) char.AddElementDB('光',25) @@ -11773,7 +11773,7 @@ def equ_4010(char: CharacterProperty): 暴击率+3% 所有速度+5% """ - char.AddSkillLv(1,50,1,0) + char.AddSkillLv(1,50,1) char.SetStatus(AttackP=0.14,SpeedM=0.05,SpeedA=0.05,SpeedR=0.05,BufferP=0.03) pass @@ -11789,7 +11789,7 @@ def equ_4011(char: CharacterProperty): 暴击率+3% 所有速度+4% """ - char.AddSkillLv(1,50,1,0) + char.AddSkillLv(1,50,1) char.SetStatus(AttackP=0.10,SpeedM=0.04,SpeedA=0.04,SpeedR=0.04,BufferP=0.015) pass @@ -11805,7 +11805,7 @@ def equ_4012(char: CharacterProperty): 暴击率+3% 所有速度+5% """ - char.AddSkillLv(1,50,1,0) + char.AddSkillLv(1,50,1) char.SetStatus(AttackP=0.14,SpeedM=0.05,SpeedA=0.05,SpeedR=0.05,BufferP=0.03) pass @@ -11821,7 +11821,7 @@ def equ_4013(char: CharacterProperty): 暴击率+3% 所有速度+4% """ - char.AddSkillLv(1,50,1,0) + char.AddSkillLv(1,50,1) char.SetStatus(AttackP=0.10,SpeedM=0.04,SpeedA=0.04,SpeedR=0.04,BufferP=0.015) pass @@ -11838,7 +11838,7 @@ def equ_4014(char: CharacterProperty): 暴击率+10% 所有速度+5% """ - char.AddSkillLv(1,75,1,0) + char.AddSkillLv(1,75,1) char.AddElementDB('火',25) char.AddElementDB('冰',25) char.AddElementDB('光',25) @@ -11859,7 +11859,7 @@ def equ_4015(char: CharacterProperty): 暴击率+5% 所有速度+4% """ - char.AddSkillLv(1,50,1,0) + char.AddSkillLv(1,50,1) char.AddElementDB('火',15) char.AddElementDB('冰',15) char.AddElementDB('光',15) @@ -11880,7 +11880,7 @@ def equ_4016(char: CharacterProperty): 暴击率+10% 所有速度+5% """ - char.AddSkillLv(1,75,1,0) + char.AddSkillLv(1,75,1) char.AddElementDB('火',25) char.AddElementDB('冰',25) char.AddElementDB('光',25) @@ -11901,7 +11901,7 @@ def equ_4017(char: CharacterProperty): 暴击率+5% 所有速度+4% """ - char.AddSkillLv(1,50,1,0) + char.AddSkillLv(1,50,1) char.AddElementDB('火',15) char.AddElementDB('冰',15) char.AddElementDB('光',15) diff --git a/backend/core/equipment/version_0/jade.py b/backend/core/equipment/version_0/jade.py index 75dc4061..102308c0 100644 --- a/backend/core/equipment/version_0/jade.py +++ b/backend/core/equipment/version_0/jade.py @@ -64,7 +64,29 @@ def jade_12(char: CharacterProperty = {}, value=0): char.AddSkillLv(85, 85, 1) pass +def jade_13(char: CharacterProperty = {}, value=0): + char.BuffSkill.STRINTPLUS += value + char.SetStatus(BufferP=value/1000) +def jade_14(char: CharacterProperty = {}, value=0): + char.BuffSkill.STRINTRatio *= 1 + value/100 + char.SetStatus(BufferP=value/200) + +def jade_15(char: CharacterProperty = {}, value=0): + char.BuffSkill.ATKPLUS += value + char.SetStatus(Buffer=value/1000) + +def jade_16(char: CharacterProperty = {}, value=0): + char.BuffSkill.ATKRatio *= 1 + value/100 + char.SetStatus(BufferP=value/200) + +def jade_17(char: CharacterProperty = {}, value=0): + char.AwakeSkill.STRINTPLUS += value + char.SetStatus(BufferP=value/4000) + +def jade_18(char: CharacterProperty = {}, value=0): + char.AwakeSkill.STRINTRatio *= 1 + value/100 + char.SetStatus(BufferP=value/200) # # 辟邪玉效果id范围 26001~26999 # for i in range(26001, 26206): # try: diff --git a/backend/dataFiles/dcalc_0.db b/backend/dataFiles/dcalc_0.db index c6be64605ea590c12463d7aa2124c8cc695ef991..5e73baf9f9c6263aae905c1a29e34a0704df1dc9 100644 GIT binary patch delta 578 zcmZoTVB2uOc7imc$3z)tMvumX)&$1Z1g6#m=GFw3)&$np1h&=$_SOWB)&$Ph1g_Qu z?$!jJ)&$YcNw1RF6AYkDwACHiI{S6}e1yV`qp2yI6ht1SLKWB}^y0 z1gq4a?8?rdE2+!GFx@wfPh1|&I}BYw|AWH7V6qE4gTCbS4@!Je+Xa>RKIo`&FJzG9 zJi*9wlBbP-FMlz=65o3sKOO<@OWZ5CeYp9!E^tle+p=9PfUlZck*6MPiux1-b_PXB zT?U3HJ360D*{xx001e0KhobrR^7H%wD|48l!Oq|>sXN_4lTTr~oi-om^zAWxt}J|O z8Pp~RDkyDNiskEOF?tCg#a@j#XSH3 delta 455 zcmZoTVB2uOc7imc^+XwGM(f6e)&$1Z1g6#m=GFw3)&$np1h&=$_SOWB)&$Ph1g_Qu z?$!jJ)&$m#; zmeVt0_(ZvOEy@X<>HC!UB&T;q^NGkk-?fOL%Y3p6JA=NuE)&DEDZ8Jx?*^Lm zv}c-zp~3XVXg-{&&znj{x^2?uFbw+2}(DoYOhu`6Q;Fh~YC~VPIfTn;fX1v|TBdubYwGeku<;gRA=V-En-Xj5^aDWBEj< kzmMaq1sb9SF+@fSXvpk%J|&=#CX%^8A;tFp@qCO10AP!Z%K!iX diff --git a/frontend/src/api/calc/type.ts b/frontend/src/api/calc/type.ts index fb4759a6..65418660 100644 --- a/frontend/src/api/calc/type.ts +++ b/frontend/src/api/calc/type.ts @@ -3,8 +3,10 @@ export interface IResult { skills: IResultSkill[] info:IResultUserInfo[] suits:IResultSuit[] + buffer:boolean } + export interface IResultSkill { name: string icon: string @@ -14,6 +16,7 @@ export interface IResultSkill { cd: number damage: number mode: string + buff:number[] } export interface IResultUserInfo { diff --git a/frontend/src/pages/Character/Result/Index.vue b/frontend/src/pages/Character/Result/Index.vue index 431c65d2..7bc034d1 100644 --- a/frontend/src/pages/Character/Result/Index.vue +++ b/frontend/src/pages/Character/Result/Index.vue @@ -11,7 +11,8 @@ :equs="configStore.config.equips" > - + + @@ -19,6 +20,8 @@ import { useConfigStore, useInfoStore } from '@/stores' import Info from './components/Info.vue' import Skill from './components/Skill.vue' +import BufferSkill from './components/BufferSkill.vue' +import type { IResultSkill } from '@/api/calc/type' const configStore = useConfigStore() const infoStore = useInfoStore() diff --git a/frontend/src/pages/Character/Result/components/BufferSkill.vue b/frontend/src/pages/Character/Result/components/BufferSkill.vue new file mode 100644 index 00000000..3f2ed8c8 --- /dev/null +++ b/frontend/src/pages/Character/Result/components/BufferSkill.vue @@ -0,0 +1,225 @@ + + + + + diff --git a/frontend/src/pages/Character/Result/components/Skill.vue b/frontend/src/pages/Character/Result/components/Skill.vue index a71bc0ee..a9823b7e 100644 --- a/frontend/src/pages/Character/Result/components/Skill.vue +++ b/frontend/src/pages/Character/Result/components/Skill.vue @@ -4,15 +4,15 @@
{{ header.label }} diff --git a/frontend/src/stores/config.ts b/frontend/src/stores/config.ts index 3fe28281..affdfd7a 100644 --- a/frontend/src/stores/config.ts +++ b/frontend/src/stores/config.ts @@ -189,6 +189,7 @@ export const useConfigStore = defineStore('configStore', () => { skills: [], info: [], suits: [], + buffer:false }, { resetOnExecute: false }, ) diff --git a/images/characters/crusader_female/skill/十字架精通.png b/images/characters/crusader_female/skill/十字架精通.png new file mode 100644 index 0000000000000000000000000000000000000000..83a319d040f02ee57e554b9b612852846992dde5 GIT binary patch literal 2464 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 delta 2320 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 QO#lD@07*qoM6N<$g7pOBbN~PV literal 0 HcmV?d00001 diff --git a/images/characters/crusader_female/skill/神光惩戒.png b/images/characters/crusader_female/skill/神光惩戒.png new file mode 100644 index 0000000000000000000000000000000000000000..f96b3f4a763931d1d9c9b488ee478ba293b86511 GIT binary patch literal 2538 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 FV1j~0rP}}i literal 0 HcmV?d00001