From 613c228bdfad72e1624c2551aeca518368bbe838 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E7=93=9C=C2=B0?= Date: Wed, 22 Apr 2026 03:10:18 +0800 Subject: [PATCH] dev --- backend/api/routes/info.py | 2 - backend/core/basic/character/calc_equip.py | 67 +++-- backend/core/basic/character/info.py | 11 +- backend/core/basic/equipment.py | 18 +- backend/core/basic/skill.py | 4 +- backend/dataFiles/dcalc_0.db | Bin 860160 -> 860160 bytes frontend/src/api/calc/type.ts | 16 +- frontend/src/api/info/type.ts | 10 +- frontend/src/assets/img/oath/active.png | Bin 0 -> 6646 bytes frontend/src/assets/img/oath/disabled.png | Bin 0 -> 6591 bytes .../Character/Forge/components/Emblems.vue | 14 +- .../Character/Forge/components/Sundry.vue | 2 +- frontend/src/pages/Character/Forge/index.vue | 2 +- frontend/src/pages/Character/Index.vue | 29 +- frontend/src/pages/Character/Result/Index.vue | 3 +- .../Result/components/BufferSkill.vue | 39 ++- .../Character/Result/components/Info.vue | 248 +++++++++++++----- .../Character/Result/components/Skill.vue | 46 ++-- frontend/src/stores/config.ts | 10 +- 19 files changed, 366 insertions(+), 155 deletions(-) create mode 100755 frontend/src/assets/img/oath/active.png create mode 100755 frontend/src/assets/img/oath/disabled.png diff --git a/backend/api/routes/info.py b/backend/api/routes/info.py index 01249dd5..1fb1160c 100644 --- a/backend/api/routes/info.py +++ b/backend/api/routes/info.py @@ -123,7 +123,6 @@ async def get_info_by_dnfhelper(uid: str, state: AltersDep, redis: RedisDep): except Exception as e: if isinstance(e, ResponseException): return response(code=500, message=str(e), data=None) - print(e) return response(code=500, message='Failed to fetch DNFHelper info', data=None) @@ -135,7 +134,6 @@ async def get_skill_by_code(state: AltersDep, code=Body(None)): return response(code=500, message='技能加点代码职业与登录职业不匹配', data=None) return response(data=skills) except Exception as e: - print(f'Error fetching skill tree info: {e}') if isinstance(e, ResponseException): return response(code=500, message=str(e), data=None) return response(code=500, message='解析技能加点失败', data=None) diff --git a/backend/core/basic/character/calc_equip.py b/backend/core/basic/character/calc_equip.py index 3b097376..78ab65a6 100644 --- a/backend/core/basic/character/calc_equip.py +++ b/backend/core/basic/character/calc_equip.py @@ -75,6 +75,7 @@ class CalcEquipMixin(CharacterBase): """套装效果统计""" suitInfo = {} oathSuitInfo = {} + correction = 0 equs = get_equipment(self.equVersion) for item in filter(lambda x: x.equInfo is not None, self.charEquipInfo.values()): partEqu = item.equInfo @@ -101,14 +102,16 @@ class CalcEquipMixin(CharacterBase): max_point_oath_suit = max((suit for suit in oathSuitInfo if oathSuitInfo[suit]['point'] > 0), key=lambda suit: oathSuitInfo[suit]['point'], default=None) zero_point_suits = [suit for suit in suitInfo if suitInfo[suit]['point'] == 0] # 套装没有到太初的时候,优先把誓约套装的点数加到装备套装上,以达到更高的套装等级 - if suitInfo is not None and 0 < suitInfo[max_point_suit]['point'] < 2550 and oathSuitInfo.get('max_point_oath_suit', None) is not None: - suitInfo[max_point_suit]['point'] += min(2550 - suitInfo[max_point_suit]['point'], oathSuitInfo[max_point_oath_suit]['point']) - oathSuitInfo[max_point_oath_suit]['point'] -= min(2550 - suitInfo[max_point_suit]['point'], oathSuitInfo[max_point_oath_suit]['point']) + if suitInfo is not None and 0 < suitInfo[max_point_suit]['point'] < 2550 and oathSuitInfo.get(max_point_oath_suit, None) is not None: + correction = min(2550 - suitInfo[max_point_suit]['point'], oathSuitInfo[max_point_oath_suit]['point']) + suitInfo[max_point_suit]['point'] += correction + oathSuitInfo[max_point_oath_suit]['point'] -= correction pass suits = zero_point_suits + ([max_point_suit] if max_point_suit is not None else []) suitList: list[Suit] = [] oathSuitList: list[OathSuit] = [] - res = [] + res = {'suit': None, 'oath': None, 'correction': correction} + # print(max_point_suit, suitList) for suit in suits: if suitInfo[suit]['point'] == 0: suitList += equs.get_suit_info(suit, 0, suitInfo[suit]['count']) @@ -116,20 +119,20 @@ class CalcEquipMixin(CharacterBase): suitList += equs.get_suit_info(suit, suitInfo[suit]['point'], 0) if len(suitList) == 0: continue - self.suitInfo = suitList - temp = suitList[-1] - res.append( - { - 'id': temp.id, - 'name': temp.name, - 'rarity': temp.rarity, - 'point': suitInfo[suit]['point'], - 'count': suitInfo[suit]['count'], - 'level': temp.level, - 'imageUrl': temp.imageUrl, - 'value': temp.value, - } - ) + if suit == max_point_suit: + self.suitInfo = suitList + temp = suitList[-1] + res['suit'] = { + 'id': temp.id, + 'name': temp.name, + 'rarity': temp.rarity, + 'point': suitInfo[suit]['point'], + 'count': suitInfo[suit]['count'], + 'level': temp.level, + 'suitId': suit, + 'imageUrl': temp.imageUrl, + # 'value': temp.value, + } for suit in oathSuitInfo: if oathSuitInfo[suit]['point'] == 0: oathSuitList += equs.get_oath_suit_info(suit, 0, oathSuitInfo[suit]['count']) @@ -149,19 +152,19 @@ class CalcEquipMixin(CharacterBase): filtered_dict = {k: v for k, v in suit.__dict__.items() if k[0].isupper()} self.SetStatus(**filtered_dict) if func is not None and oathEffect is None: - print(f'套装 {suit.name} 生效') + # print(f'套装 {suit.name} 生效') func(self) - else: - # 当存在套装和誓约不匹配的时候,誓约技能只能是1号位 - self.charOathSkillId = 1 + if max_point_suit != max_point_oath_suit: + self.charOathSkillId = '1' oathSkillEffect = [] - self.max_point = max([i['point'] for i in res], default=0) + self.max_point = 0 if res['suit'] is None else res.get('suit', {}).get('point', 0) self.oathSuitInfo = [] self.oathSkillInfo = [] # 当套装点数达到太初时,誓约技能生效 if self.max_point >= 2550: for oathSuit in oathSuitList: - skill = next((x for x in oathSuit.skills if x.skillId == self.charOathSkillId), None) + skills = list(filter(lambda x: x.suitId == oathSuit.suitId, oathSuit.skills)) + skill = next((x for x in oathSuit.skills if str(x.skillId) == str(self.charOathSkillId)), None) # 誓约套装效果生效 filtered_dict = {k: v for k, v in oathSuit.__dict__.items() if k[0].isupper()} self.SetStatus(**filtered_dict) @@ -172,11 +175,23 @@ class CalcEquipMixin(CharacterBase): self.SetStatus(**filtered_dict) self.oathSkillInfo.append(skill) self.oathSuitInfo.append(oathSuit) - + if oathSuit.suitId == max_point_oath_suit: + res['oath'] = { + 'id': oathSuit.id, + 'name': skill.name, + 'rarity': oathSuit.rarity, + 'point': oathSuitInfo[oathSuit.suitId]['point'], + 'count': oathSuitInfo[oathSuit.suitId]['count'], + 'level': oathSuit.level, + 'imageUrl': oathSuit.imageUrl, + 'suitId': oathSuit.suitId, + 'skills': [{'id': skill.id, 'skillId': i.skillId, 'name': i.name, 'imageUrl': i.imageUrl, 'enable': i.skillId == '1' or max_point_oath_suit == max_point_suit} for i in skills], + # 'value': oathSuit.value, + } for skill in oathSkillEffect: func = equs.funs.execture(f'oath_skill_{skill.id}') if func is not None: - print(f'誓约技能 {skill.id} 生效') + # print(f'誓约技能 {skill.id} 生效') func(self) if self.max_point >= 2550: skillAttack = (self.max_point - 2550) // 70 * 0.01 diff --git a/backend/core/basic/character/info.py b/backend/core/basic/character/info.py index 1ead3c67..fa00572f 100644 --- a/backend/core/basic/character/info.py +++ b/backend/core/basic/character/info.py @@ -98,16 +98,7 @@ class CharacterInfoMixin(CharacterBase): info['options'] = equInfos.funs.options info['sundry'] = equInfos.funs.sundryList for skill in platinum: - info['emblems'].append( - { - 'id': skill, - 'fame': 232, - 'position': ['辅助装备', '魔法石'], - 'detail': skill + ' Lv+1' + ' 四维 + 8', - 'categorize': ['技能'], - 'rarity': '白金', - } - ) + info['emblems'].append({'id': skill, 'fame': 232, 'value': skill + ' Lv+1' + ' 四维 + 8', 'rarity': '白金', 'rarityId': '-1', 'type': '白金', 'typeId': '-1'}) return info def getBasicInos(self): diff --git a/backend/core/basic/equipment.py b/backend/core/basic/equipment.py index 40940518..7b2620b3 100644 --- a/backend/core/basic/equipment.py +++ b/backend/core/basic/equipment.py @@ -234,6 +234,21 @@ class Equipments: with Session(self.engine) as session: db_list = session.query(OathSuitData).all() db_skills_list = session.query(OathSuitSkillData).all() + skill_list = [] + for item in db_skills_list: + lvs = len(item.SkillAttack.split(',')) + skills = {k: v for k, v in item.__dict__.items() if not k.startswith('_')} + for i in range(1, lvs + 1): + skill = {k: v for k, v in skills.items()} + skillAttacks = parse_to_number_list(skill['SkillAttack'], [0]) + skill['SkillAttack'] = 0 if i - 1 >= len(skillAttacks) else skillAttacks[i - 1] + attacks = parse_to_number_list(skill['Attack'], [0]) + skill['Attack'] = 0 if i - 1 >= len(attacks) else attacks[i - 1] + buffers = parse_to_number_list(skill['Buffer'], [0]) + skill['Buffer'] = 0 if i - 1 >= len(buffers) else buffers[i - 1] + skill['level'] = i + skill_obj = OathSuitSkill(**skill) + skill_list.append(skill_obj) for item in db_list: lvs = len(item.point.split(',')) suits = {k: v for k, v in item.__dict__.items() if not k.startswith('_')} @@ -241,7 +256,7 @@ class Equipments: suit = {k: v for k, v in suits.items()} suit['points'] = suit['point'] suit['point'] = int(suit['point'].split(',')[i - 1]) - skills = [x for x in db_skills_list if x.suitId == suit['suitId'] and x.key == suit['key']] + skills = [x for x in skill_list if x.suitId == suit['suitId'] and x.key == suit['key'] and x.level == i] suit['level'] = i skillAttaks = parse_to_number_list(suit['SkillAttack'], [0]) suit['SkillAttack'] = (0 if len(skillAttaks) == 0 else skillAttaks[0]) if i - 1 >= len(skillAttaks) else skillAttaks[i - 1] @@ -371,6 +386,7 @@ class OathSuitSkill: Buffer: float value: str bufferValue: str + level: int def __init__(self, **kwargs): for key in ['SkillAttack', 'Attack', 'Buffer']: diff --git a/backend/core/basic/skill.py b/backend/core/basic/skill.py index 21ed9fe2..3a0e7ebf 100644 --- a/backend/core/basic/skill.py +++ b/backend/core/basic/skill.py @@ -40,7 +40,7 @@ def get_data(prefix: str, key: int | str, func = lambda x: x): data = next((item.get('custom', 1.0) for item in custom_cn if item['job'] == job and item['jobGrow'] == jobGrow and item['skillId'] == skill), 1.0) except Exception as e: - print(f"get skill {prefix}/{key} data error",e) + # print(f"get skill {prefix}/{key} data error",e) data = None return data @@ -215,7 +215,7 @@ class Skill: if skill is not None: self.update_skill_attribute(skill, type, old, new, data, ratio, weapon) except Exception as e: - print(f"Error applying association {type} for skill {self.name}: {e}") + # print(f"Error applying association {type} for skill {self.name}: {e}") raise e def update_skill_attribute(self, skill, type, old, new, data, ratio=100, weapon=[]): diff --git a/backend/dataFiles/dcalc_0.db b/backend/dataFiles/dcalc_0.db index 32cfc0fc934c0a0cabc684c6b82b75991c220f96..d524aa01994c79ba778768ae43c5b90b260c3524 100644 GIT binary patch delta 1910 zcmZ8ie@q)y9Pa_^_3rh0<=3F2;H}#Ug~G1yu2duo?H1x@P>5nA&L}e=LC3O85;Khs zh6_$3vOSl&u#IH~f5&L+D72IxY6e-K zPg{ag$txJHYMcJhr>GS=&k5e%nJfiT#V6WzVtu*m}0a`lt0<+>-oa%b{W`FW1=e zMVIK>%%HAOx7Z{Kr}O22%2CpeXW*3sZlR%lB-QlK=Et($l0aS9|V?CpWHYW zT^btFlV3{}P-&6_l!i9N-PlGmZFaOpflL!kFjIR?Sy`w%tatrkb{@o}41ny*0FaDj`(_0!?xirJ;w%h;5~5dvFZf zLSGu=n;seS;x-i~|JO0nrkr98nr-0ChB&8l5Xe>J#v2_EX$OJE{(gzFx;BPwTxP=_|cE! zg~*W*U|8Nlc`8oOuv?cPvGY(GYD~C6SlOJ$_~>6wl!CAJ z!31ejK(UGwG^SmbAZfFa($JnYSw6)oPSB98OE7?Cd6b4eTa)Ed3~_=`@14^7j;v2m zfpQL|p}P}q5yI>=u4N!e@ZLlrs!Is~%1)Ell5%4#nz)Bx=%70EamtJL1#|ye$_=4x zrx@a>jB)50)2I}vfHVy!UO8EcZFnj}t&^lJXW}>4u+79@5)9ci#&6NpNjwI$npl|f z;xRT*K7 z(kwmNi0g@l2K1m_jOuhN+NL{mx(^*_-)%6;U?AZ2q284|^o#CtJioWA-6M7G?{4pC zKj=d&vqi)Va{vTZL%xmLtQ0Vs~!NGg*$unS$8$P%hKAu+qPGgVdy&i~dN7c$pp~AX*D=i^QSTYjBjEtyrZ;5V`%)PKcX3X4@ zA+T9qEY&RoS8 z;veGIVxM?WOo|2G+uqCGkG(H=%Y}c1oN!J!D(n`5{0jdQKgJ*9TlpwYbGNxs?tSh# zuH5s;Gv&G9Y4Ft-massBq}Ry`nmG|bzLda2vyL>YQy~oE1hkky(`^+UO+|4-BaJUDMI~Uy1d3vT zgoIX8RalWpV@IEP%2NciS|CQi2PROSBs0$U;Tc-31sWtY(-+lYXpODts;sUrL&eMJ zAHRDO<;TAZ*Tmz{+hO-mZGQ-hQ5)!rtgVYm{`y4_$riC#ZTHZJ{pM3w5in+f2mw<7 z>f(_~0+vmnRagL?dh1}8B}!n> zRJM>t^PqW3h=5KDloBvv0_6!ZW5S%F1PNFftkU5*0=A;T!nOR+cs_G_!@_kLdVafy znopXCZziDA0wn~DSYQ(Y6DLFXtYRCeaMRU%_e8$8XTwcbU2@E%4Cvk>=ra2m_ITj0rTat)g$zQQQznnq}xxgXfa z+=$~0RpIJ(byF4D(A*m1^zNa5&)#Xw(b>lf(=>W@I#S-&{`$LZ?LzmP9ODlL>E7s( z*8o`5dgl?n;139%aJcNPLuKK;O)u^Z?{0zY+qJ7!K(U1YI`FU%eKqHI9y!+0hFTvM z7r+NpyI75)iXbf|7BSB7{$=XOjDf5qg5=bv^38VI-JB@pc)hUi;BGX!G>jK6>5X8-ZUw3wEFw}ckcV{(1W_+^UM_x}&+|Ja`Z diff --git a/frontend/src/api/calc/type.ts b/frontend/src/api/calc/type.ts index 5b13f368..6a8a673b 100644 --- a/frontend/src/api/calc/type.ts +++ b/frontend/src/api/calc/type.ts @@ -2,7 +2,11 @@ export interface IResult { uuid: string skills: IResultSkill[] info: IResultUserInfo[] - suits: IResultSuit[] + suits: { + suit?: IResultSuit + oath?: IResultSuit + correction?: number + } buffer: boolean } @@ -27,7 +31,7 @@ export interface IResultUserInfo { } export interface IResultSuit { - id: number + id: string count: number imageUrl: string level: number @@ -35,6 +39,14 @@ export interface IResultSuit { point: number rarity: string value: string + suitId: string + skills: { + id: string + skillId: string + name: string + imageUrl: string + enable: boolean + }[] } export interface IResultSkillCount { diff --git a/frontend/src/api/info/type.ts b/frontend/src/api/info/type.ts index 6db332da..73aca316 100644 --- a/frontend/src/api/info/type.ts +++ b/frontend/src/api/info/type.ts @@ -30,7 +30,7 @@ export interface ICharacterInfo { properties: string[] stones: IEquipment[] enchants: IEnchantingInfo[] - emblems: IEnchantingInfo[] + emblems: IEmblemInfo[] oaths: IEquipment[] weapons: string[] subweapons: string[] @@ -137,6 +137,14 @@ export interface IEnchantingInfo { type?: string } +export interface IEmblemInfo { + fame: number + id: string + rarity: string + type: string + value: string +} + export interface IAvatarInfo { id: number options: string[] diff --git a/frontend/src/assets/img/oath/active.png b/frontend/src/assets/img/oath/active.png new file mode 100755 index 0000000000000000000000000000000000000000..6802c1870278db4f6eda6c376eb1345f3591237e GIT binary patch literal 6646 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 literal 0 HcmV?d00001 diff --git a/frontend/src/pages/Character/Forge/components/Emblems.vue b/frontend/src/pages/Character/Forge/components/Emblems.vue index 223a8c9b..f3b678cd 100644 --- a/frontend/src/pages/Character/Forge/components/Emblems.vue +++ b/frontend/src/pages/Character/Forge/components/Emblems.vue @@ -25,8 +25,8 @@ :key="index" > -