This repository has been archived by the owner on Sep 18, 2024. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 60
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
<jx3>[feat]add yinlongjue dps calculator;[feat]fix wufang calculator
- Loading branch information
1 parent
63af4f6
commit e54e71b
Showing
4 changed files
with
338 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,3 @@ | ||
from .dj import generate_calculator_img_dujing as dj_calculator | ||
from .wf import generate_calculator_img_wufang as wf_calculator | ||
from .wf import generate_calculator_img_wufang as wf_calculator | ||
from .ylj import generate_calculator_img_yinlongjue as ylj_calculator |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,310 @@ | ||
# 隐龙诀 | ||
|
||
from typing import Tuple, Literal, Optional, List, Union | ||
from jinja2 import Template | ||
from pathlib import Path | ||
|
||
from src.constant.jx3 import color_list | ||
|
||
from src.tools.basic.server import Zone_mapping, server_mapping | ||
from src.tools.utils.request import get_api, post_url | ||
from src.tools.utils.path import ASSETS, CACHE, VIEWS | ||
from src.tools.utils.file import read, write | ||
from src.tools.generate import generate, get_uuid | ||
from src.tools.basic.prompts import PROMPT | ||
|
||
from src.plugins.jx3.detail.detail import get_tuilan_data | ||
from src.plugins.jx3.bind.role import get_player_local_data | ||
from src.plugins.jx3.attributes.api import get_personal_kf | ||
|
||
import json | ||
|
||
msgbox_yinlongjue = """ | ||
<div class="element"> | ||
<div class="cell-title"><span>理论DPS</span></div> | ||
<div class="cell">{{ dps }}</div> | ||
</div>""" | ||
|
||
template_calculator_yinlongjue = """ | ||
<tr> | ||
<td class="short-column">{{ skill }}</td> | ||
<td class="short-column"> | ||
<div class="progress-bar" style="margin: 0 auto;"> | ||
<div class="progress" style="width: {{ display }};"></div> | ||
<span class="progress-text">{{ percent }}</span> | ||
</div> | ||
</td> | ||
<td class="short-column">{{ count }}</td> | ||
<td class="short-column">{{ value }}</td> | ||
</tr>""" | ||
|
||
def generate_params( | ||
loop_name: str, | ||
loop_skill: List[str], | ||
attrs: dict, | ||
input_enchant: List[bool], | ||
set_list: List[Optional[str]], | ||
special_equip: List[Optional[str]] | ||
) -> dict: | ||
enchant: List[Union[int, str]] = [12206, 12205, 12202, 12204, 12203] | ||
for num in range(5): | ||
if not input_enchant[num]: | ||
enchant[num] = "" | ||
params = { | ||
"playerReqDto": | ||
{ | ||
"attributeReqDto": attrs, | ||
"extraPointList": loop_skill, | ||
"recipeList": | ||
[ | ||
4996, | ||
4997, | ||
4985, | ||
4986, | ||
4987, | ||
4988, | ||
5004, | ||
5005, | ||
5006, | ||
5001, | ||
5002, | ||
5065, | ||
5069, | ||
5070, | ||
5071, | ||
5010, | ||
5011, | ||
5019, | ||
5050, | ||
5051 | ||
], | ||
"setList": set_list, | ||
"equipmentList": special_equip, | ||
"enchant2List": enchant, | ||
"position": "", | ||
"pzEquipmentReqDtoList": [], | ||
"stone": None, | ||
"isWuJie": False | ||
}, | ||
"enemyReqDto": | ||
{ | ||
"sectName": "muZhuang124", | ||
"deBuffReqDtoList": | ||
[ | ||
{ | ||
"code": "chengLongJian", | ||
"enable": False, | ||
"num": 1, | ||
"coverage": 0.33 | ||
}, | ||
{ | ||
"code": "longYin", | ||
"enable": False, | ||
"num": 1, | ||
"coverage": 1 | ||
}, | ||
{ | ||
"code": "qiuSu", | ||
"enable": False, | ||
"num": 1, | ||
"coverage": 1 | ||
}, | ||
{ | ||
"code": "xuRuo", | ||
"enable": False, | ||
"num": 1, | ||
"coverage": 1 | ||
} | ||
] | ||
}, | ||
"loopReqDto": | ||
{ | ||
"computeStrategy": "commonComputeStrategyImpl", | ||
"loopCode": loop_name | ||
} | ||
} | ||
return params | ||
|
||
async def get_loop(loop_name: Literal["橙武遗恨", "猴王遗恨", "遗恨保百节", "猴王特效", "猴王"] = "遗恨保百节") -> Tuple[Optional[str], Optional[List[str]]]: | ||
kw = { | ||
"橙武遗恨": "lxgCWYiHenLoop", | ||
"猴王遗恨": "lxgQiWangYiHenLoop", | ||
"遗恨保百节": "lxgBaoBaiJieYiHenLoop", | ||
"猴王特效": "lxgQiWangHouWangLoop", | ||
"猴王循环": "lxgHouWangLoop" | ||
}[loop_name] | ||
data = await get_api("http://www.j3lxg.cn/j3dps/api/public/v1/compute/getLoop") | ||
for loop in data["data"]: | ||
if loop["code"] == kw: | ||
return kw, loop["extraPointList"] | ||
return None, None | ||
|
||
async def get_tuilan_raw_data(server: str, uid: str) -> dict: | ||
param = { | ||
"zone": Zone_mapping(server), | ||
"server": server, | ||
"game_role_id": uid | ||
} | ||
equip_data = await get_tuilan_data("https://m.pvp.xoyo.com/mine/equip/get-role-equip", param) | ||
return equip_data | ||
|
||
class JX3Attributes: | ||
map = { | ||
"基础攻击力": (lambda percent: percent, "jcgj"), | ||
"会心": (lambda percent: percent/100*78622.5, "jchx"), | ||
"会心效果": (lambda percent: (percent-175)/100*27513.75, "jchxxg"), | ||
"破防": (lambda percent: percent/100*78622.5, "jcpf"), | ||
"无双": (lambda percent: percent/100*75809.25, "jcws"), | ||
"破招": (lambda percent: percent, "jcpz"), | ||
"身法": (lambda percent: percent, "jcsf") | ||
} | ||
def __init__(self, data: dict): | ||
self.data: dict = data | ||
|
||
@property | ||
def weapon_damage(self) -> Tuple[int, int]: | ||
equips: list = self.data["data"]["Equips"] | ||
for equip in equips: | ||
if equip["Icon"]["Kind"] == "武器" and equip["Icon"]["SubKind"] != "投掷囊": | ||
base_damage = equip[f"Base1Type"]["Base1Min"] | ||
delta_damage = equip[f"Base2Type"]["Base2Min"] | ||
return int(base_damage), int(base_damage) + int(delta_damage) | ||
raise ValueError("Cannot find weapon!") | ||
|
||
|
||
@property | ||
def panel(self): | ||
panel: list = self.data["data"]["PersonalPanel"] | ||
min_weapon, max_weapon = self.weapon_damage | ||
new_dict = { | ||
"jcld": 41, | ||
"wqshMin": int(min_weapon), | ||
"wqshMax": int(max_weapon) | ||
} | ||
for attr in panel: | ||
if attr["name"] in list(self.map): | ||
func, key = self.map[attr["name"]] | ||
value = func(attr["value"]) | ||
new_dict[key] = value | ||
return new_dict | ||
|
||
@property | ||
def special(self): | ||
equip_list: list = self.data["data"]["Equips"] | ||
result = [] | ||
equip_map = { | ||
"天地间": "39855", | ||
"变星霜": "38791", | ||
"雁无意": "37720", | ||
"空野": "37247", | ||
"山河同渡": "38072", | ||
"煞·山河同渡": "38072", | ||
"天峰里": "35776", | ||
"影壁孤": "34761", | ||
"鬓间黄泉": "37099" | ||
} | ||
for equip in equip_list: | ||
if equip["Name"] in ["天地间", "变星霜", "雁无意", "空野", "煞·山河同渡", "天峰里", "影壁孤"] or (equip["Name"] == "山河同渡" and equip["Quality"] == "12500") or (equip["Name"] == "鬓间黄泉" and equip["Quality"] == "11650"): | ||
result.append(equip_map[equip["Name"]]) | ||
return result | ||
|
||
@property | ||
def effect(self) -> List[Optional[str]]: | ||
equip_list: list = self.data["data"]["Equips"] | ||
skill_event_handler_activated = False | ||
set_equipment_recipe_activated = False | ||
|
||
for equip in equip_list: | ||
if "SetListMap" in equip and "Set" in equip: | ||
equipped_set_pieces = len(equip["SetListMap"]) | ||
|
||
for effect in equip["Set"]: | ||
set_num = int(effect.get("SetNum", 0)) | ||
|
||
if effect["Desc"] == "atSkillEventHandler" and equipped_set_pieces >= set_num: | ||
skill_event_handler_activated = True | ||
|
||
if effect["Desc"] == "atSetEquipmentRecipe" and equipped_set_pieces >= set_num: | ||
set_equipment_recipe_activated = True | ||
|
||
if skill_event_handler_activated and set_equipment_recipe_activated: | ||
return ["5037", "5038", "1927"] | ||
if set_equipment_recipe_activated: | ||
return ["5037", "5038"] | ||
if skill_event_handler_activated: | ||
return ["1927"] | ||
return [] | ||
|
||
@property | ||
def enchant(self): | ||
enchant_ = [] | ||
for place in ["帽子", "上衣", "腰带", "护臂", "鞋"]: | ||
flag = False | ||
for equip in self.data["data"]["Equips"]: | ||
if equip["Icon"]["SubKind"] == place: | ||
if "WPermanentEnchant" in equip: | ||
enchant_.append(True) | ||
flag = True | ||
else: | ||
enchant_.append(False) | ||
flag = True | ||
if not flag: | ||
enchant_.append(False) | ||
return enchant_ | ||
|
||
async def generate_calculator_img_yinlongjue(server: Optional[str], name: str, group_id: str = ""): | ||
server = server_mapping(server, group_id) | ||
if not server: | ||
return [PROMPT.ServerNotExist] | ||
role_data = await get_player_local_data(role_name=name, server_name=server) | ||
role = role_data.format_jx3api() | ||
if role["code"] != 200: | ||
return [PROMPT.PlayerNotExist] | ||
data = await get_tuilan_raw_data(server, role["data"]["roleId"]) | ||
kf_name = await get_personal_kf(data["data"]["Kungfu"]["KungfuID"]) | ||
if kf_name != "隐龙诀": | ||
return False | ||
instance = JX3Attributes(data) | ||
loop_name, loop_skill = await get_loop() | ||
if not isinstance(loop_name, str) or not isinstance(loop_skill, list): | ||
return False | ||
params = generate_params( | ||
loop_name=loop_name, | ||
loop_skill=loop_skill, | ||
attrs=instance.panel, | ||
input_enchant=instance.enchant, | ||
set_list=instance.effect, | ||
special_equip=instance.special | ||
) | ||
data = await post_url("http://121.41.84.37/j3dps/api/public/v1/compute/dps", json=params) | ||
data = json.loads(data) | ||
tables = [] | ||
for skill_data in data["data"]["mergeSkillDpsBoList"]: | ||
tables.append( | ||
Template(template_calculator_yinlongjue).render(**{ | ||
"skill": skill_data["skillType"].replace("dot", "(DOT)"), | ||
"display": str(round(skill_data["proportion"]/data["data"]["mergeSkillDpsBoList"][0]["proportion"]*100, 2)) + "%", | ||
"percent": str(round(skill_data["proportion"], 2)) + "%", | ||
"count": str(skill_data["num"]), | ||
"value": str(int(skill_data["damage"])) | ||
}) | ||
) | ||
html = Template(read(VIEWS + "/jx3/calculator/calculator.html")).render(**{ | ||
"font": ASSETS + "/font/custom.ttf", | ||
"yozai": ASSETS + "/font/Yozai-Medium.ttf", | ||
"msgbox": Template(msgbox_yinlongjue).render(**{ | ||
"dps": str(int(data["data"]["dps"])) | ||
}), | ||
"tables": "\n".join(tables), | ||
"school": "隐龙诀", | ||
"color": color_list["隐龙诀"], | ||
"server": server, | ||
"name": name, | ||
"calculator": "【雾海寻龙】凌雪阁DPS计算器 by @猜猜<br>当前循环:遗恨保百节" | ||
}) | ||
final_html = CACHE + "/" + get_uuid() + ".html" | ||
write(final_html, html) | ||
final_path = await generate(final_html, False, ".total", False) | ||
if not isinstance(final_path, str): | ||
return | ||
return Path(final_path).as_uri() |