mirror of
https://github.com/baiqwerdvd/StarRailUID.git
synced 2025-05-05 03:03:45 +08:00
Merge branch 'master' of https://github.com/baiqwerdvd/StarRailUID
This commit is contained in:
commit
d0c263feaf
2
.vscode/extensions.json
vendored
2
.vscode/extensions.json
vendored
@ -5,4 +5,4 @@
|
|||||||
"ms-python.isort",
|
"ms-python.isort",
|
||||||
"ms-python.black-formatter"
|
"ms-python.black-formatter"
|
||||||
]
|
]
|
||||||
}
|
}
|
23
.vscode/settings.json
vendored
23
.vscode/settings.json
vendored
@ -1,7 +1,11 @@
|
|||||||
{
|
{
|
||||||
"python.languageServer": "Pylance",
|
"python.languageServer": "Pylance",
|
||||||
"python.analysis.typeCheckingMode": "basic",
|
"python.analysis.typeCheckingMode": "basic",
|
||||||
"cSpell.words": ["enka", "genshin", "genshinuid"],
|
"cSpell.words": [
|
||||||
|
"enka",
|
||||||
|
"genshin",
|
||||||
|
"genshinuid"
|
||||||
|
],
|
||||||
"editor.formatOnSave": true,
|
"editor.formatOnSave": true,
|
||||||
"[python]": {
|
"[python]": {
|
||||||
"editor.defaultFormatter": "ms-python.black-formatter",
|
"editor.defaultFormatter": "ms-python.black-formatter",
|
||||||
@ -10,11 +14,22 @@
|
|||||||
"source.organizeImports": "explicit"
|
"source.organizeImports": "explicit"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"isort.args": ["--profile", "black"],
|
"isort.args": [
|
||||||
|
"--profile",
|
||||||
|
"black"
|
||||||
|
],
|
||||||
"python.formatting.provider": "black",
|
"python.formatting.provider": "black",
|
||||||
"python.linting.flake8Enabled": true,
|
"python.linting.flake8Enabled": true,
|
||||||
"python.linting.flake8CategorySeverity.W": "Warning",
|
"python.linting.flake8CategorySeverity.W": "Warning",
|
||||||
"python.linting.flake8CategorySeverity.F": "Warning",
|
"python.linting.flake8CategorySeverity.F": "Warning",
|
||||||
"python.linting.flake8CategorySeverity.E": "Warning",
|
"python.linting.flake8CategorySeverity.E": "Warning",
|
||||||
"python.analysis.extraPaths": ["${workspaceFolder}/../../../../"]
|
"python.analysis.extraPaths": [
|
||||||
}
|
"${workspaceFolder}/../../../"
|
||||||
|
],
|
||||||
|
"python.autoComplete.extraPaths": [
|
||||||
|
"${workspaceFolder}/../../../"
|
||||||
|
],
|
||||||
|
"python.analysis.include": [
|
||||||
|
"${workspaceFolder}/../../../"
|
||||||
|
]
|
||||||
|
}
|
@ -1205,5 +1205,56 @@
|
|||||||
],
|
],
|
||||||
"Maze": [20],
|
"Maze": [20],
|
||||||
"Ultra_Use": [120]
|
"Ultra_Use": [120]
|
||||||
|
},
|
||||||
|
"1307": {
|
||||||
|
"Normal": [
|
||||||
|
0.3000000002793968, 0.3600000003352761, 0.4200000003911555,
|
||||||
|
0.48000000044703484, 0.5400000005029142, 0.6000000005587935,
|
||||||
|
0.6600000006146729, 0.7200000006705523, 0.7800000007264316
|
||||||
|
],
|
||||||
|
"BPSkill": [
|
||||||
|
0.45000000041909516, 0.4950000001117587, 0.5400000005029142,
|
||||||
|
0.5850000001955777, 0.6300000005867332, 0.6750000002793968,
|
||||||
|
0.7312500011175871, 0.7875000005587935, 0.8437500013969839,
|
||||||
|
0.9000000008381903, 0.9450000005308539, 0.9900000009220093,
|
||||||
|
1.0349999996833503, 1.0800000000745058, 1.1249999997671694
|
||||||
|
],
|
||||||
|
"BPSkill_D": [
|
||||||
|
0.1479999995790422, 0.1539999998640269, 0.1600000001490116,
|
||||||
|
0.1659999997355044, 0.1720000000204891, 0.17799999960698187,
|
||||||
|
0.18550000013783574, 0.19299999997019768, 0.20050000050105155,
|
||||||
|
0.20799999963492155, 0.21399999991990626, 0.22000000020489097,
|
||||||
|
0.22599999979138374, 0.23200000007636845, 0.23799999966286123
|
||||||
|
],
|
||||||
|
"Ultra_A": [
|
||||||
|
0.1500000001396984, 0.1600000001490116, 0.17000000015832484,
|
||||||
|
0.18000000016763806, 0.1900000001769513, 0.20000000018626451,
|
||||||
|
0.21250000037252903, 0.2249999998603016, 0.23750000004656613,
|
||||||
|
0.25000000023283064, 0.26000000024214387, 0.2700000002514571,
|
||||||
|
0.2800000002607703, 0.29000000027008355, 0.3000000002793968
|
||||||
|
],
|
||||||
|
"Ultra": [
|
||||||
|
0.7200000006705523, 0.7680000001564622, 0.8160000003408641,
|
||||||
|
0.8640000005252659, 0.9120000007096678, 0.9600000008940697,
|
||||||
|
1.0200000000186265, 1.0800000000745058, 1.1400000001303852,
|
||||||
|
1.2000000001862645, 1.2479999996721745, 1.2959999998565763,
|
||||||
|
1.3440000000409782, 1.39200000022538, 1.440000000409782
|
||||||
|
],
|
||||||
|
"Talent": [
|
||||||
|
0.9600000008940697, 1.1183999998029321, 1.2768000003416091,
|
||||||
|
1.4352000001817942, 1.5936000007204711, 1.7520000005606562,
|
||||||
|
1.8960000004153699, 2.040000000037253, 2.220000000204891,
|
||||||
|
2.400000000372529, 2.5200000004842877, 2.6400000005960464,
|
||||||
|
2.760000000707805, 2.880000000819564, 3
|
||||||
|
],
|
||||||
|
"Talent_UP": [
|
||||||
|
0.04799999948590994, 0.0559200004208833, 0.06384000065736473,
|
||||||
|
0.07176000089384615, 0.07968000043183565, 0.08759999996982515,
|
||||||
|
0.0948000003118068, 0.10199999995529652, 0.11100000003352761,
|
||||||
|
0.12000000011175871, 0.12599999969825149, 0.1319999999832362,
|
||||||
|
0.13799999956972897, 0.14399999985471368, 0.1500000001396984
|
||||||
|
],
|
||||||
|
"Maze": [20],
|
||||||
|
"Ultra_Use": [120]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,20 +2,20 @@ import re
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Tuple, cast
|
from typing import Tuple, cast
|
||||||
|
|
||||||
from gsuid_core.bot import Bot
|
|
||||||
from gsuid_core.message_models import Button
|
|
||||||
from gsuid_core.models import Event
|
|
||||||
from gsuid_core.sv import SV
|
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
|
from gsuid_core.sv import SV
|
||||||
|
from gsuid_core.bot import Bot
|
||||||
|
from gsuid_core.models import Event
|
||||||
|
from gsuid_core.message_models import Button
|
||||||
from starrail_damage_cal.map.SR_MAP_PATH import avatarId2Name
|
from starrail_damage_cal.map.SR_MAP_PATH import avatarId2Name
|
||||||
|
|
||||||
|
from .to_card import api_to_card
|
||||||
from ..utils.convert import get_uid
|
from ..utils.convert import get_uid
|
||||||
|
from ..utils.sr_prefix import PREFIX
|
||||||
from ..utils.error_reply import UID_HINT
|
from ..utils.error_reply import UID_HINT
|
||||||
|
from .get_char_img import draw_char_info_img
|
||||||
from ..utils.image.convert import convert_img
|
from ..utils.image.convert import convert_img
|
||||||
from ..utils.resource.RESOURCE_PATH import TEMP_PATH
|
from ..utils.resource.RESOURCE_PATH import TEMP_PATH
|
||||||
from ..utils.sr_prefix import PREFIX
|
|
||||||
from .get_char_img import draw_char_info_img
|
|
||||||
from .to_card import api_to_card
|
|
||||||
|
|
||||||
sv_char_info_config = SV('sr面板设置', pm=2)
|
sv_char_info_config = SV('sr面板设置', pm=2)
|
||||||
sv_get_char_info = SV('sr面板查询', priority=10)
|
sv_get_char_info = SV('sr面板查询', priority=10)
|
||||||
|
@ -5,16 +5,29 @@ import textwrap
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Dict, Union
|
from typing import Dict, Union
|
||||||
|
|
||||||
|
from PIL import Image, ImageDraw
|
||||||
from gsuid_core.logger import logger
|
from gsuid_core.logger import logger
|
||||||
|
from starrail_damage_cal.to_data import api_to_dict
|
||||||
from gsuid_core.utils.image.convert import convert_img
|
from gsuid_core.utils.image.convert import convert_img
|
||||||
from gsuid_core.utils.image.image_tools import draw_text_by_line
|
from gsuid_core.utils.image.image_tools import draw_text_by_line
|
||||||
from PIL import Image, ImageDraw
|
from starrail_damage_cal.cal_damage import cal_info, cal_char_info
|
||||||
from starrail_damage_cal.cal_damage import cal_char_info, cal_info
|
|
||||||
from starrail_damage_cal.to_data import api_to_dict
|
|
||||||
|
|
||||||
from ..utils.error_reply import CHAR_HINT
|
from ..utils.error_reply import CHAR_HINT
|
||||||
from ..utils.excel.read_excel import light_cone_ranks
|
|
||||||
from ..utils.fonts.first_world import fw_font_28
|
from ..utils.fonts.first_world import fw_font_28
|
||||||
|
from ..utils.excel.read_excel import light_cone_ranks
|
||||||
|
from ..utils.map.name_covert import name_to_avatar_id, alias_to_char_name
|
||||||
|
from ..utils.map.SR_MAP_PATH import (
|
||||||
|
RelicId2Rarity,
|
||||||
|
AvatarRelicScore,
|
||||||
|
avatarId2Name,
|
||||||
|
)
|
||||||
|
from ..utils.resource.RESOURCE_PATH import (
|
||||||
|
RELIC_PATH,
|
||||||
|
SKILL_PATH,
|
||||||
|
PLAYER_PATH,
|
||||||
|
WEAPON_PATH,
|
||||||
|
CHAR_PORTRAIT_PATH,
|
||||||
|
)
|
||||||
from ..utils.fonts.starrail_fonts import (
|
from ..utils.fonts.starrail_fonts import (
|
||||||
sr_font_18,
|
sr_font_18,
|
||||||
sr_font_20,
|
sr_font_20,
|
||||||
@ -25,19 +38,6 @@ from ..utils.fonts.starrail_fonts import (
|
|||||||
sr_font_34,
|
sr_font_34,
|
||||||
sr_font_38,
|
sr_font_38,
|
||||||
)
|
)
|
||||||
from ..utils.map.name_covert import alias_to_char_name, name_to_avatar_id
|
|
||||||
from ..utils.map.SR_MAP_PATH import (
|
|
||||||
AvatarRelicScore,
|
|
||||||
RelicId2Rarity,
|
|
||||||
avatarId2Name,
|
|
||||||
)
|
|
||||||
from ..utils.resource.RESOURCE_PATH import (
|
|
||||||
CHAR_PORTRAIT_PATH,
|
|
||||||
PLAYER_PATH,
|
|
||||||
RELIC_PATH,
|
|
||||||
SKILL_PATH,
|
|
||||||
WEAPON_PATH,
|
|
||||||
)
|
|
||||||
|
|
||||||
Excel_path = Path(__file__).parent
|
Excel_path = Path(__file__).parent
|
||||||
with Path.open(Excel_path / 'Excel' / 'SkillData.json', encoding='utf-8') as f:
|
with Path.open(Excel_path / 'Excel' / 'SkillData.json', encoding='utf-8') as f:
|
||||||
@ -95,7 +95,7 @@ RELIC_CNT = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async def draw_char_img(char_data: Dict, sr_uid: str, msg: str):
|
async def draw_char_img(char_data: Dict, sr_uid: str, msg: str) -> Union[bytes, str]:
|
||||||
if isinstance(char_data, str):
|
if isinstance(char_data, str):
|
||||||
return char_data
|
return char_data
|
||||||
char = await cal_char_info(char_data)
|
char = await cal_char_info(char_data)
|
||||||
@ -132,9 +132,7 @@ async def draw_char_img(char_data: Dict, sr_uid: str, msg: str):
|
|||||||
|
|
||||||
# 放角色名
|
# 放角色名
|
||||||
char_img_draw = ImageDraw.Draw(char_info)
|
char_img_draw = ImageDraw.Draw(char_info)
|
||||||
char_img_draw.text(
|
char_img_draw.text((620, 207), char.char_name, (255, 255, 255), sr_font_38, 'lm')
|
||||||
(620, 207), char.char_name, (255, 255, 255), sr_font_38, 'lm'
|
|
||||||
)
|
|
||||||
if hasattr(sr_font_38, 'getsize'):
|
if hasattr(sr_font_38, 'getsize'):
|
||||||
char_name_len = sr_font_38.getsize(char.char_name)[0] # type: ignore
|
char_name_len = sr_font_38.getsize(char.char_name)[0] # type: ignore
|
||||||
else:
|
else:
|
||||||
@ -180,11 +178,13 @@ async def draw_char_img(char_data: Dict, sr_uid: str, msg: str):
|
|||||||
hp = int(char.base_attributes.get('hp'))
|
hp = int(char.base_attributes.get('hp'))
|
||||||
add_hp = int(
|
add_hp = int(
|
||||||
char.add_attr.get('HPDelta', 0)
|
char.add_attr.get('HPDelta', 0)
|
||||||
+ hp * char.add_attr.get('HPAddedRatio', 0)
|
+ hp
|
||||||
)
|
* char.add_attr.get(
|
||||||
attr_bg_draw.text(
|
'HPAddedRatio',
|
||||||
(413, 31), f'{hp + add_hp}', white_color, sr_font_26, 'rm'
|
0,
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
attr_bg_draw.text((413, 31), f'{hp + add_hp}', white_color, sr_font_26, 'rm')
|
||||||
attr_bg_draw.text(
|
attr_bg_draw.text(
|
||||||
(428, 31),
|
(428, 31),
|
||||||
f'(+{round(add_hp)!s})',
|
f'(+{round(add_hp)!s})',
|
||||||
@ -275,9 +275,7 @@ async def draw_char_img(char_data: Dict, sr_uid: str, msg: str):
|
|||||||
'rm',
|
'rm',
|
||||||
)
|
)
|
||||||
# 效果命中
|
# 效果命中
|
||||||
status_probability_base = (
|
status_probability_base = char.add_attr.get('StatusProbabilityBase', 0) * 100
|
||||||
char.add_attr.get('StatusProbabilityBase', 0) * 100
|
|
||||||
)
|
|
||||||
attr_bg_draw.text(
|
attr_bg_draw.text(
|
||||||
(500, 31 + 48 * 6),
|
(500, 31 + 48 * 6),
|
||||||
f'{status_probability_base:.1f}%',
|
f'{status_probability_base:.1f}%',
|
||||||
@ -402,8 +400,7 @@ async def draw_char_img(char_data: Dict, sr_uid: str, msg: str):
|
|||||||
weapon_bg.paste(rank_img, (weapon_name_len + 330, 2), rank_img)
|
weapon_bg.paste(rank_img, (weapon_name_len + 330, 2), rank_img)
|
||||||
|
|
||||||
rarity_img = Image.open(
|
rarity_img = Image.open(
|
||||||
TEXT_PATH
|
TEXT_PATH / f'LightCore_Rarity{char.equipment["equipmentRarity"]}.png'
|
||||||
/ f'LightCore_Rarity{char.equipment["equipmentRarity"]}.png'
|
|
||||||
).resize((306, 72))
|
).resize((306, 72))
|
||||||
weapon_bg.paste(rarity_img, (223, 55), rarity_img)
|
weapon_bg.paste(rarity_img, (223, 55), rarity_img)
|
||||||
weapon_bg_draw.text(
|
weapon_bg_draw.text(
|
||||||
@ -416,9 +413,9 @@ async def draw_char_img(char_data: Dict, sr_uid: str, msg: str):
|
|||||||
|
|
||||||
# 武器技能
|
# 武器技能
|
||||||
desc = light_cone_ranks[str(char.equipment['equipmentID'])]['desc']
|
desc = light_cone_ranks[str(char.equipment['equipmentID'])]['desc']
|
||||||
desc_params = light_cone_ranks[str(char.equipment['equipmentID'])][
|
desc_params = light_cone_ranks[str(char.equipment['equipmentID'])]['params'][
|
||||||
'params'
|
char.equipment['equipmentRank'] - 1
|
||||||
][char.equipment['equipmentRank'] - 1]
|
]
|
||||||
for i in range(len(desc_params)):
|
for i in range(len(desc_params)):
|
||||||
temp = math.floor(desc_params[i] * 1000) / 10
|
temp = math.floor(desc_params[i] * 1000) / 10
|
||||||
desc = desc.replace(f'#{i + 1}[i]%', f'{temp!s}%')
|
desc = desc.replace(f'#{i + 1}[i]%', f'{temp!s}%')
|
||||||
@ -588,9 +585,7 @@ async def draw_char_img(char_data: Dict, sr_uid: str, msg: str):
|
|||||||
anchor='rm',
|
anchor='rm',
|
||||||
)
|
)
|
||||||
|
|
||||||
char_info.paste(
|
char_info.paste(relic_img, RELIC_POS[str(relic['Type'])], relic_img)
|
||||||
relic_img, RELIC_POS[str(relic['Type'])], relic_img
|
|
||||||
)
|
|
||||||
relic_score += single_relic_score
|
relic_score += single_relic_score
|
||||||
if relic_score > 210:
|
if relic_score > 210:
|
||||||
relic_value_level = Image.open(TEXT_PATH / 'CommonIconSSS.png')
|
relic_value_level = Image.open(TEXT_PATH / 'CommonIconSSS.png')
|
||||||
@ -662,9 +657,7 @@ async def draw_char_img(char_data: Dict, sr_uid: str, msg: str):
|
|||||||
damage_img = Image.open(TEXT_PATH / 'attack_1.png')
|
damage_img = Image.open(TEXT_PATH / 'attack_1.png')
|
||||||
else:
|
else:
|
||||||
damage_img = Image.open(TEXT_PATH / 'attack_2.png')
|
damage_img = Image.open(TEXT_PATH / 'attack_2.png')
|
||||||
char_info.paste(
|
char_info.paste(damage_img, (0, 2028 + damage_num * 48), damage_img)
|
||||||
damage_img, (0, 2028 + damage_num * 48), damage_img
|
|
||||||
)
|
|
||||||
char_img_draw.text(
|
char_img_draw.text(
|
||||||
(55, 2048 + damage_num * 48),
|
(55, 2048 + damage_num * 48),
|
||||||
f'{damage_info["name"]}',
|
f'{damage_info["name"]}',
|
||||||
@ -819,9 +812,7 @@ async def get_relic_score(
|
|||||||
add_value = subValue * 0.3 * 0.5 * weight_dict['AttackDelta'] * 1.0
|
add_value = subValue * 0.3 * 0.5 * weight_dict['AttackDelta'] * 1.0
|
||||||
relic_score += add_value
|
relic_score += add_value
|
||||||
if subProperty == 'DefenceDelta':
|
if subProperty == 'DefenceDelta':
|
||||||
add_value = (
|
add_value = subValue * 0.3 * 0.5 * weight_dict['DefenceDelta'] * 1.0
|
||||||
subValue * 0.3 * 0.5 * weight_dict['DefenceDelta'] * 1.0
|
|
||||||
)
|
|
||||||
relic_score += add_value
|
relic_score += add_value
|
||||||
if subProperty == 'HPDelta':
|
if subProperty == 'HPDelta':
|
||||||
add_value = subValue * 0.158 * 0.5 * weight_dict['HPDelta'] * 1.0
|
add_value = subValue * 0.158 * 0.5 * weight_dict['HPDelta'] * 1.0
|
||||||
@ -830,9 +821,7 @@ async def get_relic_score(
|
|||||||
add_value = subValue * 1.5 * weight_dict['AttackAddedRatio'] * 100
|
add_value = subValue * 1.5 * weight_dict['AttackAddedRatio'] * 100
|
||||||
relic_score += add_value
|
relic_score += add_value
|
||||||
if subProperty == 'DefenceAddedRatio':
|
if subProperty == 'DefenceAddedRatio':
|
||||||
add_value = (
|
add_value = subValue * 1.19 * weight_dict['DefenceAddedRatio'] * 100
|
||||||
subValue * 1.19 * weight_dict['DefenceAddedRatio'] * 100
|
|
||||||
)
|
|
||||||
relic_score += add_value
|
relic_score += add_value
|
||||||
if subProperty == 'HPAddedRatio':
|
if subProperty == 'HPAddedRatio':
|
||||||
add_value = subValue * 1.5 * weight_dict['HPAddedRatio'] * 100
|
add_value = subValue * 1.5 * weight_dict['HPAddedRatio'] * 100
|
||||||
@ -841,18 +830,12 @@ async def get_relic_score(
|
|||||||
add_value = subValue * 2.53 * weight_dict['SpeedDelta']
|
add_value = subValue * 2.53 * weight_dict['SpeedDelta']
|
||||||
relic_score += add_value
|
relic_score += add_value
|
||||||
if subProperty == 'BreakDamageAddedRatioBase':
|
if subProperty == 'BreakDamageAddedRatioBase':
|
||||||
add_value = (
|
add_value = subValue * 1.0 * weight_dict['BreakDamageAddedRatioBase'] * 100
|
||||||
subValue * 1.0 * weight_dict['BreakDamageAddedRatioBase'] * 100
|
|
||||||
)
|
|
||||||
relic_score += add_value
|
relic_score += add_value
|
||||||
if subProperty == 'StatusProbabilityBase':
|
if subProperty == 'StatusProbabilityBase':
|
||||||
add_value = (
|
add_value = subValue * 1.49 * weight_dict['StatusProbabilityBase'] * 100
|
||||||
subValue * 1.49 * weight_dict['StatusProbabilityBase'] * 100
|
|
||||||
)
|
|
||||||
relic_score += add_value
|
relic_score += add_value
|
||||||
if subProperty == 'StatusResistanceBase':
|
if subProperty == 'StatusResistanceBase':
|
||||||
add_value = (
|
add_value = subValue * 1.49 * weight_dict['StatusResistanceBase'] * 100
|
||||||
subValue * 1.49 * weight_dict['StatusResistanceBase'] * 100
|
|
||||||
)
|
|
||||||
relic_score += add_value
|
relic_score += add_value
|
||||||
return relic_score
|
return relic_score
|
||||||
|
@ -133,17 +133,13 @@ async def get_char_args(
|
|||||||
if isinstance(char_data, str):
|
if isinstance(char_data, str):
|
||||||
return char_data
|
return char_data
|
||||||
else:
|
else:
|
||||||
for i, s in enumerate(
|
for i, s in enumerate(['头部', '手部', '躯干', '腿部', '位面球', '连结绳']):
|
||||||
['头部', '手部', '躯干', '腿部', '位面球', '连结绳']
|
|
||||||
):
|
|
||||||
if '赤沙' in part:
|
if '赤沙' in part:
|
||||||
continue
|
continue
|
||||||
if part[-1] in PieceName_ilst[i]:
|
if part[-1] in PieceName_ilst[i]:
|
||||||
if isinstance(char_data, str):
|
if isinstance(char_data, str):
|
||||||
return char_data
|
return char_data
|
||||||
char_data = await change_equip(
|
char_data = await change_equip(changeuid, char_data, part, s, i)
|
||||||
changeuid, char_data, part, s, i
|
|
||||||
)
|
|
||||||
if not char_data:
|
if not char_data:
|
||||||
change_name = part.replace(part[-1], '')
|
change_name = part.replace(part[-1], '')
|
||||||
return f'要替换的{change_name}的{s}遗器不存在噢~'
|
return f'要替换的{change_name}的{s}遗器不存在噢~'
|
||||||
@ -154,9 +150,7 @@ async def get_char_args(
|
|||||||
return char_data, weapon, weapon_affix, talent_num
|
return char_data, weapon, weapon_affix, talent_num
|
||||||
|
|
||||||
|
|
||||||
async def change_equip(
|
async def change_equip(uid: str, char_data: Dict, part: str, s: str, i: int) -> Dict:
|
||||||
uid: str, char_data: Dict, part: str, s: str, i: int
|
|
||||||
) -> Dict:
|
|
||||||
char_name = part.replace(part[-1], '').replace(uid, '')
|
char_name = part.replace(part[-1], '').replace(uid, '')
|
||||||
fake_data = await get_char_data(uid, char_name)
|
fake_data = await get_char_data(uid, char_name)
|
||||||
if isinstance(fake_data, str):
|
if isinstance(fake_data, str):
|
||||||
@ -265,28 +259,18 @@ async def make_new_charinfo(
|
|||||||
char_id = await name_to_avatar_id(fake_name)
|
char_id = await name_to_avatar_id(fake_name)
|
||||||
char_data['avatarId'] = int(char_id)
|
char_data['avatarId'] = int(char_id)
|
||||||
char_data['avatarName'] = fake_name
|
char_data['avatarName'] = fake_name
|
||||||
char_data['avatarElement'] = avatarId2DamageType[
|
char_data['avatarElement'] = avatarId2DamageType[str(char_data['avatarId'])]
|
||||||
str(char_data['avatarId'])
|
char_data['avatarRarity'] = str(avatarId2Rarity[str(char_data['avatarId'])])
|
||||||
]
|
|
||||||
char_data['avatarRarity'] = str(
|
|
||||||
avatarId2Rarity[str(char_data['avatarId'])]
|
|
||||||
)
|
|
||||||
char_data['avatarPromotion'] = 6
|
char_data['avatarPromotion'] = 6
|
||||||
char_data['avatarLevel'] = 80
|
char_data['avatarLevel'] = 80
|
||||||
char_data['avatarSkill'] = await get_skill_list(char_data['avatarId'])
|
char_data['avatarSkill'] = await get_skill_list(char_data['avatarId'])
|
||||||
char_data['avatarExtraAbility'] = await get_extra_list(
|
char_data['avatarExtraAbility'] = await get_extra_list(char_data['avatarId'])
|
||||||
char_data['avatarId']
|
char_data['avatarAttributeBonus'] = await get_attribute_list(char_data['avatarId'])
|
||||||
)
|
|
||||||
char_data['avatarAttributeBonus'] = await get_attribute_list(
|
|
||||||
char_data['avatarId']
|
|
||||||
)
|
|
||||||
char_data['RelicInfo'] = []
|
char_data['RelicInfo'] = []
|
||||||
char_data['avatarEnName'] = avatarId2EnName[str(char_data['avatarId'])]
|
char_data['avatarEnName'] = avatarId2EnName[str(char_data['avatarId'])]
|
||||||
char_data['rank'] = 0
|
char_data['rank'] = 0
|
||||||
char_data['rankList'] = []
|
char_data['rankList'] = []
|
||||||
char_data['baseAttributes'] = await get_baseAttributes(
|
char_data['baseAttributes'] = await get_baseAttributes(char_data['avatarId'])
|
||||||
char_data['avatarId']
|
|
||||||
)
|
|
||||||
char_data['equipmentInfo'] = {}
|
char_data['equipmentInfo'] = {}
|
||||||
return char_data
|
return char_data
|
||||||
|
|
||||||
@ -316,13 +300,9 @@ async def get_baseAttributes(
|
|||||||
# 速度
|
# 速度
|
||||||
base_attributes['speed'] = avatar_promotion_base.SpeedBase.Value
|
base_attributes['speed'] = avatar_promotion_base.SpeedBase.Value
|
||||||
# 暴击率
|
# 暴击率
|
||||||
base_attributes[
|
base_attributes['CriticalChanceBase'] = avatar_promotion_base.CriticalChance.Value
|
||||||
'CriticalChanceBase'
|
|
||||||
] = avatar_promotion_base.CriticalChance.Value
|
|
||||||
# 暴击伤害
|
# 暴击伤害
|
||||||
base_attributes[
|
base_attributes['CriticalDamageBase'] = avatar_promotion_base.CriticalDamage.Value
|
||||||
'CriticalDamageBase'
|
|
||||||
] = avatar_promotion_base.CriticalDamage.Value
|
|
||||||
# 嘲讽
|
# 嘲讽
|
||||||
base_attributes['BaseAggro'] = avatar_promotion_base.BaseAggro.Value
|
base_attributes['BaseAggro'] = avatar_promotion_base.BaseAggro.Value
|
||||||
return base_attributes
|
return base_attributes
|
||||||
@ -342,9 +322,7 @@ async def get_attribute_list(
|
|||||||
attribute_bonus_temp['statusAdd'] = {}
|
attribute_bonus_temp['statusAdd'] = {}
|
||||||
if status_add:
|
if status_add:
|
||||||
for property_ in status_add:
|
for property_ in status_add:
|
||||||
attribute_bonus_temp['statusAdd']['property'] = property_[
|
attribute_bonus_temp['statusAdd']['property'] = property_['type']
|
||||||
'type'
|
|
||||||
]
|
|
||||||
attribute_bonus_temp['statusAdd']['name'] = Property2Name[
|
attribute_bonus_temp['statusAdd']['name'] = Property2Name[
|
||||||
property_['type']
|
property_['type']
|
||||||
]
|
]
|
||||||
@ -374,9 +352,7 @@ async def get_skill_list(
|
|||||||
skill_temp['skillId'] = char_id * 100 + skillid
|
skill_temp['skillId'] = char_id * 100 + skillid
|
||||||
skill_temp['skillName'] = skillId2Name[str(skill_temp['skillId'])]
|
skill_temp['skillName'] = skillId2Name[str(skill_temp['skillId'])]
|
||||||
skill_temp['skillEffect'] = skillId2Effect[str(skill_temp['skillId'])]
|
skill_temp['skillEffect'] = skillId2Effect[str(skill_temp['skillId'])]
|
||||||
skill_temp['skillAttackType'] = skillId2AttackType[
|
skill_temp['skillAttackType'] = skillId2AttackType[str(skill_temp['skillId'])]
|
||||||
str(skill_temp['skillId'])
|
|
||||||
]
|
|
||||||
skilllevel = 10
|
skilllevel = 10
|
||||||
if skillid == 1:
|
if skillid == 1:
|
||||||
skilllevel = 6
|
skilllevel = 6
|
||||||
@ -429,9 +405,7 @@ async def get_char(
|
|||||||
skill_id = item['id']
|
skill_id = item['id']
|
||||||
skill_up_num = item['num']
|
skill_up_num = item['num']
|
||||||
# 查找skill_id在不在avatarSkill中
|
# 查找skill_id在不在avatarSkill中
|
||||||
for index, skill_item in enumerate(
|
for index, skill_item in enumerate(char_data['avatarSkill']):
|
||||||
char_data['avatarSkill']
|
|
||||||
):
|
|
||||||
if str(skill_id) == str(skill_item['skillId']):
|
if str(skill_id) == str(skill_item['skillId']):
|
||||||
if skill_id[-1] == 1:
|
if skill_id[-1] == 1:
|
||||||
skilllevel_max = 7
|
skilllevel_max = 7
|
||||||
@ -439,9 +413,7 @@ async def get_char(
|
|||||||
skilllevel_max = 12
|
skilllevel_max = 12
|
||||||
skilllevel = min(
|
skilllevel = min(
|
||||||
skilllevel_max,
|
skilllevel_max,
|
||||||
char_data['avatarSkill'][index][
|
char_data['avatarSkill'][index]['skillLevel']
|
||||||
'skillLevel'
|
|
||||||
]
|
|
||||||
+ skill_up_num,
|
+ skill_up_num,
|
||||||
)
|
)
|
||||||
char_data['avatarSkill'][index][
|
char_data['avatarSkill'][index][
|
||||||
@ -462,13 +434,11 @@ async def get_char(
|
|||||||
equipment_info['equipmentLevel'] = 80
|
equipment_info['equipmentLevel'] = 80
|
||||||
equipment_info['equipmentPromotion'] = 6
|
equipment_info['equipmentPromotion'] = 6
|
||||||
equipment_info['equipmentRank'] = weapon_affix
|
equipment_info['equipmentRank'] = weapon_affix
|
||||||
equipment_info['equipmentRarity'] = EquipmentID2Rarity[
|
equipment_info['equipmentRarity'] = EquipmentID2Rarity[str(equipmentid)]
|
||||||
str(equipmentid)
|
|
||||||
]
|
|
||||||
equipment_base_attributes = {}
|
equipment_base_attributes = {}
|
||||||
equipment_promotion_base = EquipmentPromotionConfig.Equipment[
|
equipment_promotion_base = EquipmentPromotionConfig.Equipment[str(equipmentid)][
|
||||||
str(equipmentid)
|
'6'
|
||||||
]['6']
|
]
|
||||||
|
|
||||||
# 生命值
|
# 生命值
|
||||||
equipment_base_attributes['hp'] = (
|
equipment_base_attributes['hp'] = (
|
||||||
|
BIN
StarRailUID/starrailuid_charinfo/texture2D/ring_4.png
Normal file
BIN
StarRailUID/starrailuid_charinfo/texture2D/ring_4.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 50 KiB |
BIN
StarRailUID/starrailuid_charinfo/texture2D/ring_5.png
Normal file
BIN
StarRailUID/starrailuid_charinfo/texture2D/ring_5.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 49 KiB |
BIN
StarRailUID/starrailuid_charinfo/texture2D/ring_mask.png
Normal file
BIN
StarRailUID/starrailuid_charinfo/texture2D/ring_mask.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 13 KiB |
BIN
StarRailUID/starrailuid_charinfo/texture2D/shin.jpg
Normal file
BIN
StarRailUID/starrailuid_charinfo/texture2D/shin.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 88 KiB |
@ -2,19 +2,16 @@ import asyncio
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Dict, List, Tuple, Union
|
from typing import Dict, List, Tuple, Union
|
||||||
|
|
||||||
from ..utils.fonts.first_world import fw_font_28
|
|
||||||
from ..utils.fonts.starrail_fonts import sr_font_24, sr_font_30, sr_font_58
|
|
||||||
from ..utils.image.convert import convert_img
|
|
||||||
from ..utils.map.name_covert import avatar_id_to_char_star
|
|
||||||
from ..utils.resource.RESOURCE_PATH import (
|
|
||||||
CHAR_ICON_PATH,
|
|
||||||
CHAR_PREVIEW_PATH,
|
|
||||||
PLAYER_PATH,
|
|
||||||
)
|
|
||||||
|
|
||||||
from PIL import Image, ImageDraw
|
from PIL import Image, ImageDraw
|
||||||
from starrail_damage_cal.map.SR_MAP_PATH import avatarId2Name
|
|
||||||
from starrail_damage_cal.to_data import api_to_dict
|
from starrail_damage_cal.to_data import api_to_dict
|
||||||
|
from gsuid_core.utils.image.convert import convert_img
|
||||||
|
from starrail_damage_cal.map.SR_MAP_PATH import avatarId2Name
|
||||||
|
from gsuid_core.utils.image.image_tools import crop_center_img
|
||||||
|
|
||||||
|
from ..utils.fonts.first_world import fw_font_28
|
||||||
|
from ..utils.map.name_covert import avatar_id_to_char_star
|
||||||
|
from ..utils.resource.RESOURCE_PATH import PLAYER_PATH, CHAR_PREVIEW_PATH
|
||||||
|
from ..utils.fonts.starrail_fonts import sr_font_24, sr_font_30, sr_font_58
|
||||||
|
|
||||||
half_color = (255, 255, 255, 120)
|
half_color = (255, 255, 255, 120)
|
||||||
first_color = (29, 29, 29)
|
first_color = (29, 29, 29)
|
||||||
@ -23,7 +20,7 @@ white_color = (247, 247, 247)
|
|||||||
gray_color = (175, 175, 175)
|
gray_color = (175, 175, 175)
|
||||||
|
|
||||||
TEXT_PATH = Path(__file__).parent / 'texture2D'
|
TEXT_PATH = Path(__file__).parent / 'texture2D'
|
||||||
char_mask = Image.open(TEXT_PATH / 'char_mask.png')
|
char_mask = Image.open(TEXT_PATH / 'ring_mask.png')
|
||||||
char_bg_mask = Image.open(TEXT_PATH / 'char_bg_mask.png')
|
char_bg_mask = Image.open(TEXT_PATH / 'char_bg_mask.png')
|
||||||
tag = Image.open(TEXT_PATH / 'tag.png')
|
tag = Image.open(TEXT_PATH / 'tag.png')
|
||||||
footbar = Image.open(TEXT_PATH / 'footbar.png')
|
footbar = Image.open(TEXT_PATH / 'footbar.png')
|
||||||
@ -65,29 +62,26 @@ async def draw_enka_card(uid: str, char_list: List, showfrom: int = 0):
|
|||||||
return await convert_img(Image.new('RGBA', (0, 1), (255, 255, 255)))
|
return await convert_img(Image.new('RGBA', (0, 1), (255, 255, 255)))
|
||||||
else:
|
else:
|
||||||
line1 = f'UID {uid} 刷新成功'
|
line1 = f'UID {uid} 刷新成功'
|
||||||
line2 = (
|
line2 = f'可以使用 sr查询{char_data_list[0]["avatarName"]} 查询详情角色面板'
|
||||||
f'可以使用 sr查询{char_data_list[0]["avatarName"]} 查询详情角色面板'
|
|
||||||
)
|
|
||||||
char_num = len(char_data_list)
|
char_num = len(char_data_list)
|
||||||
if char_num <= 4:
|
if char_num <= 4:
|
||||||
based_w, based_h = 1380, 926
|
based_w, based_h = 1380, 926
|
||||||
show_type = 1
|
show_type = 1
|
||||||
else:
|
else:
|
||||||
show_type = 0
|
show_type = 0
|
||||||
based_w, based_h = 1380, 660 + (char_num - 5) // 5 * 110
|
based_w, based_h = 1380, 310 + (((char_num - 1) // 4) + 1) * 320
|
||||||
if (char_num - 5) % 5 >= 4:
|
|
||||||
based_h += 110
|
|
||||||
|
|
||||||
img = Image.open(TEXT_PATH / 'shin-w.jpg').resize((based_w, based_h))
|
img = Image.open(TEXT_PATH / 'shin.jpg')
|
||||||
|
img = crop_center_img(img, based_w, based_h)
|
||||||
img.paste(tag, (0, 0), tag)
|
img.paste(tag, (0, 0), tag)
|
||||||
|
|
||||||
img_draw = ImageDraw.Draw(img, 'RGBA')
|
img_draw = ImageDraw.Draw(img, 'RGBA')
|
||||||
|
|
||||||
# 写底层文字
|
# 写底层文字
|
||||||
img_draw.text(
|
img_draw.text(
|
||||||
(690, based_h - 16),
|
(690, based_h - 26),
|
||||||
'--Created by qwerdvd-Designed By Wuyi-Thank for mihomo.me--',
|
'--Created by qwerdvd-Designed By Wuyi-Thank for mihomo.me--',
|
||||||
(0, 0, 255),
|
(22, 22, 22),
|
||||||
fw_font_28,
|
fw_font_28,
|
||||||
'mm',
|
'mm',
|
||||||
)
|
)
|
||||||
@ -151,40 +145,35 @@ async def draw_mihomo_char(index: int, img: Image.Image, char_data: Dict):
|
|||||||
async def draw_enka_char(index: int, img: Image.Image, char_data: Dict):
|
async def draw_enka_char(index: int, img: Image.Image, char_data: Dict):
|
||||||
char_id = char_data['avatarId']
|
char_id = char_data['avatarId']
|
||||||
char_star = await avatar_id_to_char_star(str(char_id))
|
char_star = await avatar_id_to_char_star(str(char_id))
|
||||||
char_card = Image.open(TEXT_PATH / f'char_card_{char_star}.png')
|
char_card = Image.open(TEXT_PATH / f'ring_{char_star}.png')
|
||||||
char_img = (
|
_path = CHAR_PREVIEW_PATH / f'{char_id}.png'
|
||||||
Image.open(str(CHAR_ICON_PATH / f'{char_id}.png'))
|
char_img = Image.open(_path).convert('RGBA')
|
||||||
.convert('RGBA')
|
char_img = char_img.resize(
|
||||||
.resize((204, 204))
|
(int(char_img.size[0] * 0.76), int(char_img.size[1] * 0.76))
|
||||||
)
|
)
|
||||||
char_temp = Image.new('RGBA', (220, 220))
|
|
||||||
char_temp.paste(char_img, (8, 8), char_img)
|
|
||||||
char_card.paste(char_temp, (0, 0), char_mask)
|
|
||||||
if index <= 7:
|
|
||||||
if img.size[0] <= 1100:
|
|
||||||
x = 60 + (index % 4) * 220
|
|
||||||
else:
|
|
||||||
x = 160 + (index % 4) * 220
|
|
||||||
|
|
||||||
img.paste(
|
char_temp = Image.new('RGBA', (300, 400))
|
||||||
char_card,
|
card_temp = Image.new('RGBA', (300, 400))
|
||||||
(x, 187 + (index // 4) * 220),
|
char_temp.paste(char_img, (19, 57), char_img)
|
||||||
char_card,
|
card_temp.paste(char_temp, (0, 0), char_mask)
|
||||||
)
|
|
||||||
elif index <= 12:
|
char_draw = ImageDraw.Draw(card_temp)
|
||||||
img.paste(
|
char_draw.text(
|
||||||
char_card,
|
(144, 285),
|
||||||
(50 + (index % 8) * 220, 296),
|
char_data['avatarName'],
|
||||||
char_card,
|
'white',
|
||||||
)
|
sr_font_30,
|
||||||
else:
|
'mm',
|
||||||
_i = index - 13
|
)
|
||||||
x, y = 50 + (_i % 9) * 220, 512 + (_i // 9) * 220
|
|
||||||
if _i % 9 >= 5:
|
img.paste(
|
||||||
y += 110
|
char_card,
|
||||||
x = 160 + ((_i - 5) % 9) * 220
|
(113 + (index % 4) * 289, 152 + (index // 4) * 336),
|
||||||
img.paste(
|
char_card,
|
||||||
char_card,
|
)
|
||||||
(x, y),
|
|
||||||
char_card,
|
img.paste(
|
||||||
)
|
card_temp,
|
||||||
|
(113 + (index % 4) * 289, 152 + (index // 4) * 336),
|
||||||
|
card_temp,
|
||||||
|
)
|
||||||
|
@ -43,9 +43,9 @@ async def sign_in(sr_uid: str) -> str:
|
|||||||
if isinstance(sign_data, int):
|
if isinstance(sign_data, int):
|
||||||
logger.warning(f'[SR签到] {sr_uid} 出错, 请检查Cookies是否过期!')
|
logger.warning(f'[SR签到] {sr_uid} 出错, 请检查Cookies是否过期!')
|
||||||
return 'sr签到失败...请检查Cookies是否过期!'
|
return 'sr签到失败...请检查Cookies是否过期!'
|
||||||
if sign_data.risk_code:
|
if sign_data.risk_code == 5001 or sign_data.risk_code == 0:
|
||||||
# 出现校验码
|
# 出现校验码
|
||||||
if sign_data.risk_code == 5001:
|
if sign_data.risk_code == 5001 and sign_data.is_risk:
|
||||||
if core_plugins_config.get_config('CaptchaPass').data:
|
if core_plugins_config.get_config('CaptchaPass').data:
|
||||||
gt = sign_data.gt
|
gt = sign_data.gt
|
||||||
ch = sign_data.challenge
|
ch = sign_data.challenge
|
||||||
@ -76,13 +76,14 @@ async def sign_in(sr_uid: str) -> str:
|
|||||||
f'[SR签到] [无感验证] {sr_uid} 该用户重试 {index} 次验证成功!'
|
f'[SR签到] [无感验证] {sr_uid} 该用户重试 {index} 次验证成功!'
|
||||||
)
|
)
|
||||||
break
|
break
|
||||||
if (int(str(sr_uid)[0]) > 5) and (sign_data.code == 'ok'):
|
elif (int(str(sr_uid)[0]) > 5) and (sign_data.code == 'ok'):
|
||||||
# 国际服签到无risk_code字段
|
# 国际服签到无risk_code字段
|
||||||
logger.info(f'[SR国际服签到] {sr_uid} 签到成功!')
|
logger.info(f'[SR国际服签到] {sr_uid} 签到成功!')
|
||||||
break
|
break
|
||||||
# 重试超过阈值
|
# 重试超过阈值
|
||||||
logger.warning('[SR签到] 超过请求阈值...')
|
else:
|
||||||
return 'sr签到失败...出现验证码!\n请过段时间使用[签到]或由管理员[全部重签]或手动至米游社进行签到!'
|
logger.warning('[SR签到] 超过请求阈值...')
|
||||||
|
return 'sr签到失败...出现验证码!\n请过段时间使用[签到]或由管理员[全部重签]或手动至米游社进行签到!'
|
||||||
# 签到失败
|
# 签到失败
|
||||||
else:
|
else:
|
||||||
im = 'sr签到失败!'
|
im = 'sr签到失败!'
|
||||||
|
@ -89,10 +89,64 @@
|
|||||||
"StatusResistanceBase": 0.0,
|
"StatusResistanceBase": 0.0,
|
||||||
"AttributeAddedRatio": 1
|
"AttributeAddedRatio": 1
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"role": "黑天鹅",
|
||||||
|
"HPDelta": 0.0,
|
||||||
|
"HPAddedRatio": 0.0,
|
||||||
|
"AttackDelta": 1,
|
||||||
|
"AttackAddedRatio": 1,
|
||||||
|
"DefenceDelta": 0.0,
|
||||||
|
"DefenceAddedRatio": 0.0,
|
||||||
|
"SpeedDelta": 1.0,
|
||||||
|
"CriticalChanceBase": 0.5,
|
||||||
|
"CriticalDamageBase": 0.5,
|
||||||
|
"BreakDamageAddedRatioBase": 0.0,
|
||||||
|
"HealRatio": 0,
|
||||||
|
"SPRatio": 0.5,
|
||||||
|
"StatusProbabilityBase": 1,
|
||||||
|
"StatusResistanceBase": 0.0,
|
||||||
|
"AttributeAddedRatio": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"role": "花火",
|
||||||
|
"HPDelta": 0.5,
|
||||||
|
"HPAddedRatio": 0.5,
|
||||||
|
"AttackDelta": 0.5,
|
||||||
|
"AttackAddedRatio": 0.5,
|
||||||
|
"DefenceDelta": 0.5,
|
||||||
|
"DefenceAddedRatio": 0.5,
|
||||||
|
"SpeedDelta": 1.0,
|
||||||
|
"CriticalChanceBase": 0,
|
||||||
|
"CriticalDamageBase": 1.0,
|
||||||
|
"BreakDamageAddedRatioBase": 0.0,
|
||||||
|
"HealRatio": 0,
|
||||||
|
"SPRatio": 1.0,
|
||||||
|
"StatusProbabilityBase": 0.0,
|
||||||
|
"StatusResistanceBase": 0.5,
|
||||||
|
"AttributeAddedRatio": 0.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"role": "米沙",
|
||||||
|
"HPDelta": 0.0,
|
||||||
|
"HPAddedRatio": 0.0,
|
||||||
|
"AttackDelta": 0.75,
|
||||||
|
"AttackAddedRatio": 0.75,
|
||||||
|
"DefenceDelta": 0.0,
|
||||||
|
"DefenceAddedRatio": 0.0,
|
||||||
|
"SpeedDelta": 0.75,
|
||||||
|
"CriticalChanceBase": 1,
|
||||||
|
"CriticalDamageBase": 1,
|
||||||
|
"BreakDamageAddedRatioBase": 0.0,
|
||||||
|
"HealRatio": 0,
|
||||||
|
"SPRatio": 0.75,
|
||||||
|
"StatusProbabilityBase": 0.0,
|
||||||
|
"StatusResistanceBase": 0.0,
|
||||||
|
"AttributeAddedRatio": 1
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"role": "布洛妮娅",
|
"role": "布洛妮娅",
|
||||||
"HPDelta": 0.75,
|
"HPDelta": 0.5,
|
||||||
"HPAddedRatio": 0.75,
|
"HPAddedRatio": 0.5,
|
||||||
"AttackDelta": 0.5,
|
"AttackDelta": 0.5,
|
||||||
"AttackAddedRatio": 0.5,
|
"AttackAddedRatio": 0.5,
|
||||||
"DefenceDelta": 0.5,
|
"DefenceDelta": 0.5,
|
||||||
|
@ -39,6 +39,9 @@
|
|||||||
"1302": ["银枝"],
|
"1302": ["银枝"],
|
||||||
"1305": ["真理医生"],
|
"1305": ["真理医生"],
|
||||||
"1303": ["阮•梅", "阮梅"],
|
"1303": ["阮•梅", "阮梅"],
|
||||||
|
"1306": ["花火"],
|
||||||
|
"1307": ["黑天鹅"],
|
||||||
|
"1312": ["米沙"],
|
||||||
"8000": [
|
"8000": [
|
||||||
"开拓者",
|
"开拓者",
|
||||||
"爷",
|
"爷",
|
||||||
@ -120,6 +123,14 @@
|
|||||||
"21032": ["镂月裁云之意", "镂月裁云"],
|
"21032": ["镂月裁云之意", "镂月裁云"],
|
||||||
"21033": ["无处可逃"],
|
"21033": ["无处可逃"],
|
||||||
"21034": ["今日亦是和平的一日", "和平的一日"],
|
"21034": ["今日亦是和平的一日", "和平的一日"],
|
||||||
|
"21035": ["何物为真"],
|
||||||
|
"21036": ["美梦小镇大冒险", "大冒险", "美梦小镇"],
|
||||||
|
"21037": ["最后的赢家"],
|
||||||
|
"21038": ["在火的远处"],
|
||||||
|
"21039": ["织造命运之线", "命运之线"],
|
||||||
|
"21040": ["银河沦陷日"],
|
||||||
|
"21041": ["好戏开演"],
|
||||||
|
"21042": ["铭记于心的约定"],
|
||||||
"22000": ["新手任务开始前"],
|
"22000": ["新手任务开始前"],
|
||||||
"23000": ["银河铁道之夜"],
|
"23000": ["银河铁道之夜"],
|
||||||
"23001": ["于夜色中", "希儿专武"],
|
"23001": ["于夜色中", "希儿专武"],
|
||||||
@ -141,6 +152,8 @@
|
|||||||
"23018": ["片刻,留在眼底", "片刻留在眼底", "留在眼底"],
|
"23018": ["片刻,留在眼底", "片刻留在眼底", "留在眼底"],
|
||||||
"23019": ["镜中故我"],
|
"23019": ["镜中故我"],
|
||||||
"23020": ["纯粹思维的洗礼", "思维的洗礼"],
|
"23020": ["纯粹思维的洗礼", "思维的洗礼"],
|
||||||
|
"23021": ["游戏尘寰", "游戏"],
|
||||||
|
"23022": ["重塑时光之忆", "时光之忆"],
|
||||||
"24000": ["记一位星神的陨落", "星神陨落", "星神的陨落"],
|
"24000": ["记一位星神的陨落", "星神陨落", "星神的陨落"],
|
||||||
"24001": ["星海巡航"],
|
"24001": ["星海巡航"],
|
||||||
"24002": ["记忆的质料"],
|
"24002": ["记忆的质料"],
|
||||||
|
Loading…
x
Reference in New Issue
Block a user