diff --git a/StarRailUID/sruid_utils/api/mys/api.py b/StarRailUID/sruid_utils/api/mys/api.py index 1a6fcd4..63454c3 100644 --- a/StarRailUID/sruid_utils/api/mys/api.py +++ b/StarRailUID/sruid_utils/api/mys/api.py @@ -42,6 +42,9 @@ CHALLENGE_INFO_URL = f'{NEW_URL}/game_record/app/hkrpg/api/challenge' CHALLENGE_INFO_URL_OS = f'{OS_INFO_URL}/game_record/hkrpg/api/challenge' ROGUE_INFO_URL = f'{NEW_URL}/game_record/app/hkrpg/api/rogue' # 角色模拟宇宙信息接口 +ROGUE_LOCUST_INFO_URL = ( + f'{NEW_URL}/game_record/app/hkrpg/api/rogue_locust' # 角色寰宇蝗灾信息接口 +) STAR_RAIL_GACHA_LOG_URL = f'{OLD_URL}/common/gacha_record/api/getGachaLog' STAR_RAIL_GACHA_LOG_URL_OS = ( diff --git a/StarRailUID/sruid_utils/api/mys/models.py b/StarRailUID/sruid_utils/api/mys/models.py index 633b2fa..3236b9a 100644 --- a/StarRailUID/sruid_utils/api/mys/models.py +++ b/StarRailUID/sruid_utils/api/mys/models.py @@ -113,12 +113,60 @@ class RogueBasicInfo(TypedDict): unlocked_skill_points: int +class LocustCntInfo(TypedDict): + narrow: int + miracle: int + event: int + + +class LocustDestinyInfo(TypedDict): + id: int + desc: str + level: int + + +class LocustBasicInfo(TypedDict): + cnt: LocustCntInfo + destiny: List[LocustDestinyInfo] + + class RoleInfo(TypedDict): server: str nickname: str level: int +class LocustBlocks(TypedDict): + block_id: int + name: str + num: int + + +class LocustFury(TypedDict): + type: int + point: str + + +class LocustRecordInfo(TypedDict): + name: str + finish_time: RogueTime + final_lineup: List[RogueAvatar] + base_type_list: List[RogueBaseType] + cached_avatars: List[RogueAvatar] + buffs: List[RogueBuffs] + miracles: List[RogueMiracles] + blocks: List[LocustBlocks] + worm_weak: Union[str, str] + difficulty: int + fury: LocustFury + detail_h: Union[int, None] + start_h: Union[int, None] + + +class LocustRecord(TypedDict): + records: List[LocustRecordInfo] + + class RogueData(TypedDict): role: RoleInfo basic_info: RogueBasicInfo @@ -126,6 +174,12 @@ class RogueData(TypedDict): last_record: RogueRecord +class RogueLocustData(TypedDict): + role: RoleInfo + basic: LocustBasicInfo + detail: LocustRecord + + ################ # 深渊相关 # ################ diff --git a/StarRailUID/starrailuid_charinfo/draw_char_img.py b/StarRailUID/starrailuid_charinfo/draw_char_img.py index 5e16c20..a02a948 100644 --- a/StarRailUID/starrailuid_charinfo/draw_char_img.py +++ b/StarRailUID/starrailuid_charinfo/draw_char_img.py @@ -103,6 +103,7 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str): 1004, 1003, 1201, + 1212, ]: skill_list = skill_dict[str(char.char_id)]['skilllist'] damage_len = len(skill_list) @@ -755,6 +756,7 @@ async def cal(char_data: Dict): 1004, 1003, 1201, + 1212, ]: if char.char_id == 1213: for skill_type in [ @@ -772,6 +774,11 @@ async def cal(char_data: Dict): role = RoleInstance(char) im_tmp = await role.cal_damage(skill_type) skill_info_list.append(im_tmp) + elif char.char_id == 1212: + for skill_type in ['Normal', 'BPSkill', 'BPSkill1', 'Ultra']: + role = RoleInstance(char) + im_tmp = await role.cal_damage(skill_type) + skill_info_list.append(im_tmp) elif char.char_id == 1208: for skill_type in ['Normal', 'Ultra']: role = RoleInstance(char) diff --git a/StarRailUID/starrailuid_charinfo/effect/Avatar/Avatar.py b/StarRailUID/starrailuid_charinfo/effect/Avatar/Avatar.py index bd1947f..2bc03a9 100644 --- a/StarRailUID/starrailuid_charinfo/effect/Avatar/Avatar.py +++ b/StarRailUID/starrailuid_charinfo/effect/Avatar/Avatar.py @@ -381,11 +381,50 @@ class Qingque(BaseAvatar): self.extra_ability_attribute['AttackAddedRatio'] = self.Talent() +class Jingliu(BaseAvatar): + Buff: BaseAvatarBuff + + def __init__( + self, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill] + ): + super().__init__(char=char, skills=skills) + self.eidolon_attribute = {} + self.extra_ability_attribute = {} + self.eidolons() + self.extra_ability() + + def Technique(self): + pass + + def eidolons(self): + if self.avatar_rank >= 1: + self.eidolon_attribute['Ultra_CriticalChanceBase'] = mp.mpf(0.12) + self.eidolon_attribute['BPSkill1_CriticalChanceBase'] = mp.mpf( + 0.12 + ) + if self.avatar_rank >= 2: + self.eidolon_attribute['UltraDmgAdd'] = mp.mpf(0.3) + if self.avatar_rank >= 4: + self.eidolon_attribute['BPSkill1AttackAddedRatio'] = mp.mpf(0.4) + self.eidolon_attribute['UltraAttackAddedRatio'] = mp.mpf(0.4) + if self.avatar_rank >= 6: + self.eidolon_attribute['Ultra_CriticalDamageBase'] = mp.mpf(0.5) + self.eidolon_attribute['BPSkill1_CriticalDamageBase'] = mp.mpf(0.5) + + def extra_ability(self): + logger.info('额外能力') + logger.info('【转魄】状态下,造成的伤害提高10%。') + self.extra_ability_attribute['BPSkill1DmgAdd'] = mp.mpf(0.1) + self.extra_ability_attribute['UltraDmgAdd'] = mp.mpf(0.1) + + class Avatar: @classmethod def create( cls, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill] ): + if char.id_ == 1212: + return Jingliu(char, skills) if char.id_ == 1201: return Qingque(char, skills) if char.id_ == 1003: diff --git a/StarRailUID/starrailuid_charinfo/effect/Excel/seele.json b/StarRailUID/starrailuid_charinfo/effect/Excel/seele.json index da7286b..03530ac 100644 --- a/StarRailUID/starrailuid_charinfo/effect/Excel/seele.json +++ b/StarRailUID/starrailuid_charinfo/effect/Excel/seele.json @@ -68,9 +68,9 @@ 120 ], "skilllist": { - "Normal": ["attack","普攻", 1], - "BPSkill": ["attack","战技", 1], - "Ultra": ["attack","终结技", 1] + "Normal": ["attack","普攻", 1, "Normal"], + "BPSkill": ["attack","战技", 1, "BPSkill"], + "Ultra": ["attack","终结技", 1, "Ultra"] } }, "1204": { @@ -144,10 +144,10 @@ 130 ], "skilllist": { - "Normal": ["attack","普攻", 1], - "BPSkill": ["attack","战技", 1], - "Ultra": ["attack","终结技", 1], - "Talent": ["attack","10层神君", 1] + "Normal": ["attack","普攻", 1, "Normal"], + "BPSkill": ["attack","战技", 1, "BPSkill"], + "Ultra": ["attack","终结技", 1, "Ultra"], + "Talent": ["attack","10层神君", 1, "Talent"] } }, "1107": { @@ -220,10 +220,10 @@ 130 ], "skilllist": { - "Normal": ["attack","普攻", 1], - "BPSkill": ["attack","战技", 1], - "Ultra": ["attack","强化反击", 1], - "Talent": ["attack","反击", 1] + "Normal": ["attack","普攻", 1, "Normal"], + "BPSkill": ["attack","战技", 1, "BPSkill"], + "Ultra": ["attack","强化反击", 1, "Ultra"], + "Talent": ["attack","反击", 1, "Talent"] } }, "1213": { @@ -330,11 +330,11 @@ 140 ], "skilllist": { - "Normal": ["attack","普攻", 2], - "Normal1": ["attack","瞬华", 3], - "Normal2": ["attack","天矢阴", 5], - "Normal3": ["attack","盘拏耀跃", 7], - "Ultra": ["attack","终结技", 3] + "Normal": ["attack","普攻", 2, "Normal"], + "Normal1": ["attack","瞬华", 3, "Normal1"], + "Normal2": ["attack","天矢阴", 5, "Normal2"], + "Normal3": ["attack","盘拏耀跃", 7, "Normal3"], + "Ultra": ["attack","终结技", 3, "Ultra"] } }, "1006": { @@ -440,9 +440,9 @@ 110 ], "skilllist": { - "Normal": ["attack","普攻", 1], - "BPSkill": ["attack","战技", 1], - "Ultra": ["attack","终结技", 1] + "Normal": ["attack","普攻", 1, "Normal"], + "BPSkill": ["attack","战技", 1, "BPSkill"], + "Ultra": ["attack","终结技", 1, "Ultra"] } }, "1005": { @@ -531,11 +531,11 @@ 110 ], "skilllist": { - "Normal": ["attack","普攻", 1], - "BPSkill": ["attack","战技", 1], - "Ultra": ["attack","终结技", 1], - "DOT": ["attack","单次持续伤害", 1], - "Talent": ["attack","追加攻击", 1] + "Normal": ["attack","普攻", 1, "Normal"], + "BPSkill": ["attack","战技", 1, "BPSkill"], + "Ultra": ["attack","终结技", 1, "Ultra"], + "DOT": ["attack","单次持续伤害", 1, "DOT"], + "Talent": ["attack","追加攻击", 1, "Talent"] } }, "1205": { @@ -664,10 +664,10 @@ 110 ], "skilllist": { - "Normal": ["attack","普攻", 1], - "Normal1": ["attack","无间剑树", 1], - "Ultra": ["attack","终结技", 1], - "Talent": ["attack","追加攻击", 1] + "Normal": ["attack","普攻", 1, "Normal"], + "Normal1": ["attack","无间剑树", 1, "Normal1"], + "Ultra": ["attack","终结技", 1, "Ultra"], + "Talent": ["attack","追加攻击", 1, "Talent"] } }, "1208": { @@ -785,8 +785,8 @@ 135 ], "skilllist": { - "Normal": ["attack","普攻", 1], - "Ultra": ["attack","终结技", 1] + "Normal": ["attack","普攻", 1, "Normal"], + "Ultra": ["attack","终结技", 1, "Ultra"] } }, "1104": { @@ -859,9 +859,9 @@ 110 ], "skilllist": { - "Normal": ["attack","普攻", 1], - "BPSkill": ["attack","战技", 1], - "Ultra": ["defence","终结技(护盾)", 1] + "Normal": ["attack","普攻", 1, "Normal"], + "BPSkill": ["attack","战技", 1, "BPSkill"], + "Ultra": ["defence","终结技(护盾)", 1, "Ultra"] } }, "1209": { @@ -984,10 +984,10 @@ 120 ], "skilllist": { - "Normal": ["attack","普攻", 1], - "BPSkill": ["attack","战技", 1], - "Ultra": ["attack","终结技", 1], - "Talent": ["attack","附加伤害", 1] + "Normal": ["attack","普攻", 1, "Normal"], + "BPSkill": ["attack","战技", 1, "BPSkill"], + "Ultra": ["attack","终结技", 1, "Ultra"], + "Talent": ["attack","附加伤害", 1, "Talent"] } }, "1004": { @@ -1059,9 +1059,9 @@ 120 ], "skilllist": { - "Normal": ["attack","普攻", 1], - "BPSkill": ["attack","战技", 3], - "Ultra": ["attack","终结技", 1] + "Normal": ["attack","普攻", 1, "Normal"], + "BPSkill": ["attack","战技", 3, "BPSkill"], + "Ultra": ["attack","终结技", 1, "Ultra"] } }, "1003": { @@ -1133,10 +1133,10 @@ 120 ], "skilllist": { - "Normal": ["attack","普攻", 1], - "BPSkill": ["attack","战技", 3], - "Ultra": ["attack","终结技", 1], - "Talent": ["attack","追加攻击", 1] + "Normal": ["attack","普攻", 1, "Normal"], + "BPSkill": ["attack","战技", 1, "BPSkill"], + "Ultra": ["attack","终结技", 1, "Ultra"], + "Talent": ["attack","追加攻击", 1, "Talent"] } }, "1201": { @@ -1219,9 +1219,102 @@ 140 ], "skilllist": { - "Normal": ["attack","普攻", 1], - "Normal1": ["attack","杠上开花!", 1], - "Ultra": ["attack","终结技", 1] + "Normal": ["attack","普攻", 1, "Normal"], + "Normal1": ["attack","杠上开花!", 1, "Normal1"], + "Ultra": ["attack","终结技", 1, "Ultra"] + } + }, + "1212": { + "Normal": [ + 0.5000000004656613, + 0.6000000005587935, + 0.7000000006519258, + 0.8000000007450581, + 0.9000000008381903, + 1.0000000000931323, + 1.1000000001862645, + 1.2000000002793968, + 1.3000000002793968 + ], + "BPSkill": [ + 1.0000000005122274, + 1.1000000006705523, + 1.200000000828877, + 1.300000000558794, + 1.400000000214204, + 1.500000000372529, + 1.630000000745058, + 1.750000000419095, + 1.880000000860302, + 2.000000000232831, + 2.1000000003911555, + 2.20000000054948, + 2.300000000707805, + 2.40000000086613, + 2.50000000093132 + ], + "BPSkill1": [ + 1.2000000005122274, + 1.3200000006705523, + 1.440000000828877, + 1.560000000558794, + 1.680000000214204, + 1.800000000372529, + 1.950000000745058, + 2.100000000419095, + 2.250000000860302, + 2.400000000232831, + 2.5200000003911555, + 2.64000000054948, + 2.760000000707805, + 2.88000000086613, + 3.00000000093132 + ], + "Ultra": [ + 1.8000000005122274, + 1.9200000006705523, + 2.040000000828877, + 2.160000000558794, + 2.280000000214204, + 2.400000000372529, + 2.550000000745058, + 2.700000000419095, + 2.850000000860302, + 3.000000000232831, + 3.1200000003911555, + 3.24000000054948, + 3.360000000707805, + 3.48000000086613, + 3.60000000093132 + ], + "Talent": [ + 0.60000000037252903, + 0.66000000040978193, + 0.72000000044703484, + 0.7800000004842877, + 0.8400000005215406, + 0.9000000005587935, + 0.9800000006053597, + 1.0500000006519258, + 1.1200000006984919, + 1.2000000007450581, + 1.260000000782311, + 1.3200000008195639, + 1.3800000008568168, + 1.4400000008940697, + 1.5000000008940697 + ], + "Maze": [ + 20 + ], + "Ultra_Use": [ + 140 + ], + "skilllist": { + "Normal": ["attack","普攻", 1, "Normal"], + "BPSkill": ["attack","战技", 1, "BPSkill"], + "BPSkill1": ["attack","寒川映月", 1, "BPSkill1"], + "Ultra": ["attack","终结技", 1, "Ultra"] } } } diff --git a/StarRailUID/starrailuid_charinfo/effect/Excel/weapon_effect.json b/StarRailUID/starrailuid_charinfo/effect/Excel/weapon_effect.json index 4ac639d..5d92e3f 100644 --- a/StarRailUID/starrailuid_charinfo/effect/Excel/weapon_effect.json +++ b/StarRailUID/starrailuid_charinfo/effect/Excel/weapon_effect.json @@ -559,6 +559,24 @@ 0.4000000001490116 ] } + }, + "23014": { + "Param": { + "e_dmg": [ + 0.3000000000745058, + 0.35000000009313226, + 0.40000000011175871, + 0.45000000013038516, + 0.5000000001490116 + ], + "CriticalDamageBase": [ + 0.3600000000745058, + 0.42000000009313226, + 0.48000000011175871, + 0.54000000013038516, + 0.6000000001490116 + ] + } }, "23002": { "Param": { diff --git a/StarRailUID/starrailuid_charinfo/effect/Role.py b/StarRailUID/starrailuid_charinfo/effect/Role.py index 5086beb..36df7c7 100644 --- a/StarRailUID/starrailuid_charinfo/effect/Role.py +++ b/StarRailUID/starrailuid_charinfo/effect/Role.py @@ -172,6 +172,9 @@ class RoleInstance: skill_multiplier = skill_multiplier + 1.56 elif self.raw_data.avatar.id_ == 1205: skill_multiplier = self.avatar.Normalnum(skill_type) + elif self.raw_data.avatar.id_ == 1212: + skill_multiplier = self.avatar.BPSkill_num(skill_type) + skill_type = 'BPSkill' else: raise Exception('skill type error') @@ -213,7 +216,7 @@ class RoleInstance: # 攻击加成 if attr.__contains__('AttackAddedRatio'): attr_name = attr.split('AttackAddedRatio')[0] - if attr_name == skill_type: + if attr_name == skill_type or attr_name == skill_info[3]: attack_added_ratio = self.attribute_bonus.get( 'AttackAddedRatio', 0 ) @@ -223,7 +226,7 @@ class RoleInstance: # 效果命中加成 if attr.__contains__('StatusProbabilityBase'): attr_name = attr.split('StatusProbabilityBase')[0] - if attr_name == skill_type: + if attr_name == skill_type or attr_name == skill_info[3]: status_probability = self.attribute_bonus.get( 'StatusProbabilityBase', 0 ) @@ -383,7 +386,7 @@ class RoleInstance: for attr in merged_attr: if attr.__contains__('_DmgRatio'): skill_name = attr.split('_')[0] - if skill_name == skill_type: + if skill_name == skill_type or skill_name == skill_info[3]: logger.info( f'{attr} 对 {skill_type} 有 {merged_attr[attr]} 易伤加成' ) @@ -401,9 +404,12 @@ class RoleInstance: # 检查是否有对特定技能的爆伤加成 # Ultra_CriticalChance for attr in merged_attr: - if attr.__contains__('_CriticalChance'): + if attr.__contains__('_CriticalDamageBase'): skill_name = attr.split('_')[0] - if skill_name == skill_type: + if ( + skill_name == skill_type + or skill_name == skill_info[3] + ): logger.info( f'{attr} 对 {skill_type} 有 ' f'{merged_attr[attr]} 爆伤加成' @@ -413,7 +419,20 @@ class RoleInstance: logger.info(f'暴伤: {critical_damage}') # 暴击区 - critical_chance_base = min(1, merged_attr['CriticalChanceBase']) + logger.info('检查是否有暴击加成') + critical_chance_base = merged_attr['CriticalChanceBase'] + # 检查是否有对特定技能的爆伤加成 + # Ultra_CriticalChance + for attr in merged_attr: + if attr.__contains__('_CriticalChance'): + skill_name = attr.split('_')[0] + if skill_name == skill_type or skill_name == skill_info[3]: + logger.info( + f'{attr} 对 {skill_type} 有 ' + f'{merged_attr[attr]} 暴击加成' + ) + critical_chance_base += merged_attr[attr] + critical_chance_base = min(1, critical_chance_base) logger.info(f'暴击: {critical_chance_base}') # 期望伤害 @@ -510,6 +529,15 @@ class RoleInstance: damage_qw_z = damage_qw_z * 1.8 damage_tz_z = damage_tz_z * 1.8 + if ( + self.raw_data.avatar.id_ == 1212 + and self.raw_data.avatar.rank >= 1 + ): + if skill_info[3] == 'BPSkill1' or skill_info[3] == 'Ultra': + damage_cd_z = damage_cd_z * 1.6 + damage_qw_z = damage_qw_z * 1.6 + damage_tz_z = damage_tz_z * 1.6 + if self.avatar.avatar_element == 'Thunder': element_area = 0 damage_tz_fj = ( diff --git a/StarRailUID/starrailuid_charinfo/effect/Weapon/Weapon.py b/StarRailUID/starrailuid_charinfo/effect/Weapon/Weapon.py index aa0bf16..c12254f 100644 --- a/StarRailUID/starrailuid_charinfo/effect/Weapon/Weapon.py +++ b/StarRailUID/starrailuid_charinfo/effect/Weapon/Weapon.py @@ -315,10 +315,10 @@ class IntheNight(BaseWeapon): * count_ ) ultra_critical_chance_base = attribute_bonus.get( - 'Ultra_CriticalChanceBase', 0 + 'Ultra_CriticalDamageBase', 0 ) attribute_bonus[ - 'Ultra_CriticalChanceBase' + 'Ultra_CriticalDamageBase' ] = ultra_critical_chance_base + ( mp.mpf( weapon_effect['23001']['Param']['q_crit_dmg'][ @@ -477,12 +477,6 @@ class GeniusesRepose(BaseWeapon): async def weapon_ability( self, Ultra_Use: int, base_attr: Dict, attribute_bonus: Dict ): - # attack_added_ratio = attribute_bonus.get('AttackAddedRatio', 0) - # attribute_bonus['AttackAddedRatio'] = attack_added_ratio + mp.mpf( - # weapon_effect['21020']['Param']['AttackAddedRatio'][ - # self.weapon_rank - 1 - # ] - # ) if await self.check(): critical_chance_base = attribute_bonus.get('CriticalDamageBase', 0) attribute_bonus['CriticalDamageBase'] = critical_chance_base + ( @@ -620,22 +614,6 @@ class TheUnreachableSide(BaseWeapon): async def weapon_ability( self, Ultra_Use: int, base_attr: Dict, attribute_bonus: Dict ): - # critical_chance_base = attribute_bonus.get('CriticalChanceBase', 0) - # attribute_bonus[ - # 'CriticalChanceBase' - # ] = critical_chance_base + mp.mpf( - # weapon_effect['23009']['Param']['CriticalChance'][ - # self.weapon_rank - 1 - # ] - # ) - # hp_added_ratio = attribute_bonus.get('HPAddedRatio', 0) - # attribute_bonus[ - # 'HPAddedRatio' - # ] = hp_added_ratio + mp.mpf( - # weapon_effect['23009']['Param']['HPAddedRatio'][ - # self.weapon_rank - 1 - # ] - # ) if await self.check(): all_damage_added_ratio = attribute_bonus.get( 'AllDamageAddedRatio', 0 @@ -1561,6 +1539,39 @@ class DataBank(BaseWeapon): return attribute_bonus +# 此身为剑 +class Thisbodyisasword(BaseWeapon): + weapon_base_attributes: Dict + + def __init__(self, weapon: DamageInstanceWeapon): + super().__init__(weapon) + + async def check(self): + # 使装备者战技造成的伤害提高30%。施放终结技时,立即恢复12点能量,并使装备者的暴击伤害提高36% + pass + + async def weapon_ability( + self, Ultra_Use: int, base_attr: Dict, attribute_bonus: Dict + ): + ultra_dmg_add = attribute_bonus.get('BPSkillDmgAdd', 0) + attribute_bonus['BPSkillDmgAdd'] = ultra_dmg_add + ( + mp.mpf( + weapon_effect['23014']['Param']['e_dmg'][self.weapon_rank - 1] + ) + ) + + critical_chance_base = attribute_bonus.get('CriticalDamageBase', 0) + attribute_bonus['CriticalDamageBase'] = critical_chance_base + ( + mp.mpf( + weapon_effect['23014']['Param']['CriticalDamageBase'][ + self.weapon_rank - 1 + ] + ) + ) + + return attribute_bonus + + class Weapon: @classmethod def create(cls, weapon: DamageInstanceWeapon): @@ -1622,7 +1633,10 @@ class Weapon: 20020, 20013, 20006, + 23014, ]: + if weapon.id_ == 23014: + return Thisbodyisasword(weapon) if weapon.id_ == 20006: return DataBank(weapon) if weapon.id_ == 20013: diff --git a/StarRailUID/starrailuid_rogue/__init__.py b/StarRailUID/starrailuid_rogue/__init__.py index 6f9b6d9..136813a 100644 --- a/StarRailUID/starrailuid_rogue/__init__.py +++ b/StarRailUID/starrailuid_rogue/__init__.py @@ -7,9 +7,10 @@ from gsuid_core.utils.error_reply import UID_HINT from ..utils.convert import get_uid from ..utils.sr_prefix import PREFIX -from .draw_rogue_card import draw_rogue_img +from .draw_rogue_card import draw_rogue_img, draw_rogue_locust_img sv_srabyss = SV('sr查询模拟宇宙') +sv_srabyss_locust = SV('sr查询寰宇蝗灾') @sv_srabyss.on_command( @@ -69,3 +70,33 @@ async def send_srabyss_info(bot: Bot, ev: Event): im = await draw_rogue_img(user_id, uid, floor, schedule_type) await bot.send(im) return None + + +@sv_srabyss_locust.on_command( + ( + f'{PREFIX}寰宇蝗灾', + f'{PREFIX}hyhz', + f'{PREFIX}查询寰宇蝗灾', + f'{PREFIX}sqhyhz', + ), + block=True, +) +async def send_srabyss_locust_info(bot: Bot, ev: Event): + name = ''.join(re.findall('[\u4e00-\u9fa5]', ev.text)) + if name: + return None + + await bot.logger.info('开始执行[sr查询寰宇蝗灾信息]') + get_uid_ = await get_uid(bot, ev, True) + if get_uid_ is None: + return await bot.send(UID_HINT) + uid, user_id = get_uid_ + if uid is None: + return await bot.send(UID_HINT) + await bot.logger.info(f'[sr查询寰宇蝗灾信息]uid: {uid}') + # data = GsCookie() + # raw_rogue_data = await data.get_rogue_data(uid, schedule_type) + # print(raw_rogue_data) + im = await draw_rogue_locust_img(user_id, uid) + await bot.send(im) + return None diff --git a/StarRailUID/starrailuid_rogue/draw_rogue_card.py b/StarRailUID/starrailuid_rogue/draw_rogue_card.py index fcd070c..4fe8294 100644 --- a/StarRailUID/starrailuid_rogue/draw_rogue_card.py +++ b/StarRailUID/starrailuid_rogue/draw_rogue_card.py @@ -13,17 +13,18 @@ from gsuid_core.utils.image.image_tools import ( from .utils import get_icon from ..utils.convert import GsCookie from ..utils.image.convert import convert_img -from ..sruid_utils.api.mys.models import ( - RogueAvatar, - RogueMiracles, - RogueBuffitems, -) from ..utils.fonts.starrail_fonts import ( sr_font_22, sr_font_28, sr_font_34, sr_font_42, ) +from ..sruid_utils.api.mys.models import ( + RogueAvatar, + LocustBlocks, + RogueMiracles, + RogueBuffitems, +) TEXT_PATH = Path(__file__).parent / 'texture2D' white_color = (255, 255, 255) @@ -79,6 +80,7 @@ bufflist = { 124: '巡猎', 125: '毁灭', 126: '欢愉', + 127: '繁育', } @@ -137,13 +139,48 @@ async def _draw_rogue_buff( return draw_height +async def _draw_rogue_blocks( + blocks: List[LocustBlocks], + floor_pic: Image.Image, + buff_height: int, +): + draw_height = 0 + floor_pic_draw = ImageDraw.Draw(floor_pic) + blocks_num = len(blocks) + need_middle = math.ceil(blocks_num / 2) + draw_height = draw_height + need_middle * 80 + zb_list = [] + for m in range(need_middle): + for n in range(2): + zb_list.append([m, n]) + jishu = 0 + for block in blocks: + block_icon = Image.open(TEXT_PATH / f'{block["name"]}.png') + z_left_bg = 90 + 357 * zb_list[jishu][1] + z_top_bg = buff_height + 470 + 80 * zb_list[jishu][0] + jishu = jishu + 1 + z_left_icon = z_left_bg + 10 + z_top_icon = z_top_bg + 5 + floor_pic.paste(block_icon, (z_left_icon, z_top_icon), mask=block_icon) + floor_pic_draw.text( + (z_left_bg + 80, z_top_bg + 35), + f"{block['name']} x{block['num']}", + font=sr_font_22, + fill=white_color, + anchor='lm', + ) + return draw_height + + async def _draw_rogue_miracles( miracles: List[RogueMiracles], floor_pic: Image.Image, buff_height: int, ): + draw_height = 0 miracles_num = len(miracles) need_middle = math.ceil(miracles_num / 8) + draw_height = draw_height + need_middle * 90 zb_list = [] for m in range(need_middle): for n in range(8): @@ -156,6 +193,8 @@ async def _draw_rogue_miracles( jishu = jishu + 1 floor_pic.paste(miracles_icon, (z_left, z_top), mask=miracles_icon) + return draw_height + async def _draw_rogue_card( char: RogueAvatar, @@ -226,7 +265,7 @@ async def draw_rogue_img( # 记录打的宇宙列表 detail_list = [] - based_h = 657 + based_h = 700 for index_floor, detail in enumerate(rogue_detail): # 100+70+170 # 头+底+角色 @@ -489,3 +528,318 @@ async def draw_rogue_img( res = await convert_img(img) logger.info('[查询模拟宇宙]绘图已完成,等待发送!') return res + + +async def draw_rogue_locust_img( + qid: Union[str, int], + uid: str, +) -> Union[bytes, str]: + # 获取Cookies + data = GsCookie() + # retcode = await data.get_cookie(uid) + # if retcode: + # return retcode + # raw_data = data.raw_data + raw_rogue_data = await data.get_rogue_locust_data(uid) + # print(raw_rogue_data) + + if isinstance(raw_rogue_data, int): + return get_error(raw_rogue_data) + + # 获取数据 + # if raw_data: + # char_data = raw_data['avatars'] + # else: + # return '没有获取到角色数据' + # char_temp = {} + + # 计算背景图尺寸 + rogue_detail = raw_rogue_data['detail']['records'] + + # 记录打的宇宙列表 + detail_list = [] + based_h = 700 + for index_floor, detail in enumerate(rogue_detail): + # 100+70+170 + # 头+底+角色 + detail_h = 340 + + # 祝福 + if len(detail['base_type_list']) > 0: + buff_h = 60 + for buff in detail['buffs']: + buff_h = buff_h + 50 + buff_num = len(buff['items']) + buff_h = buff_h + math.ceil(buff_num / 3) * 55 + else: + buff_h = 0 + detail_h = detail_h + buff_h + + # 奇物 + if len(detail['miracles']) > 0: + miracles_h = 60 + miracles_num = len(detail['miracles']) + miracles_h = miracles_h + math.ceil(miracles_num / 8) * 90 + else: + miracles_h = 0 + detail_h = detail_h + miracles_h + + # 事件 + if len(detail['blocks']) > 0: + blocks_h = 60 + blocks_num = len(detail['blocks']) + blocks_h = blocks_h + math.ceil(blocks_num / 2) * 80 + else: + blocks_num = 0 + detail_h = detail_h + blocks_h + + rogue_detail[index_floor]['detail_h'] = detail_h + rogue_detail[index_floor]['start_h'] = based_h + based_h = based_h + detail_h + + # 获取查询者数据 + if len(rogue_detail) == 0: + return '你还没有挑战寰宇蝗灾~' + + # 获取背景图片各项参数 + based_w = 900 + img = Image.new("RGB", (based_w, based_h), (10, 18, 49)) + img.paste(img_bg, (0, 0)) + # img = img.crop((0, 0, based_w, based_h)) + rogue_title = Image.open(TEXT_PATH / 'head.png') + img.paste(rogue_title, (0, 0), rogue_title) + + # 获取头像 + _id = str(qid) + if _id.startswith('http'): + char_pic = await get_qq_avatar(avatar_url=_id) + else: + char_pic = await get_qq_avatar(qid=qid) + char_pic = await draw_pic_with_ring(char_pic, 250, None, False) + + img.paste(char_pic, (325, 132), char_pic) + + # 绘制抬头 + img_draw = ImageDraw.Draw(img) + img_draw.text((450, 442), f'UID {uid}', white_color, sr_font_28, 'mm') + + # 总体数据 + rogue_data = Image.open(TEXT_PATH / 'data.png') + img.paste(rogue_data, (0, 500), rogue_data) + + # 行者之道激活 + img_draw.text( + (165, 569), + f'{raw_rogue_data["basic"]["cnt"]["narrow"]}', + white_color, + sr_font_42, + 'mm', + ) + img_draw.text( + (165, 615), + '行者之道', + gray_color, + sr_font_28, + 'mm', + ) + + # 奇物解锁 + img_draw.text( + (450, 569), + f'{raw_rogue_data["basic"]["cnt"]["miracle"]}', + white_color, + sr_font_42, + 'mm', + ) + img_draw.text( + (450, 615), + '已解锁奇物', + gray_color, + sr_font_28, + 'mm', + ) + + # 事件解锁 + img_draw.text( + (730, 569), + f'{raw_rogue_data["basic"]["cnt"]["event"]}', + white_color, + sr_font_42, + 'mm', + ) + img_draw.text( + (730, 615), + '已解锁事件', + gray_color, + sr_font_28, + 'mm', + ) + + for index_floor, detail in enumerate(rogue_detail): + if detail['detail_h'] is None: + continue + + floor_pic = Image.open(TEXT_PATH / 'detail_bg.png').convert("RGBA") + floor_pic = floor_pic.resize((900, detail['detail_h'])) + + floor_top_pic = Image.open(TEXT_PATH / 'floor_bg_top.png').convert( + "RGBA" + ) + floor_pic.paste(floor_top_pic, (0, 0), floor_top_pic) + + floor_center_pic = Image.open( + TEXT_PATH / 'floor_bg_center.png' + ).convert("RGBA") + floor_center_pic = floor_center_pic.resize( + (900, detail['detail_h'] - 170) + ) + floor_pic.paste(floor_center_pic, (0, 100), floor_center_pic) + + floor_bot_pic = Image.open(TEXT_PATH / 'floor_bg_bot.png').convert( + "RGBA" + ) + floor_pic.paste( + floor_bot_pic, (0, detail['detail_h'] - 70), floor_bot_pic + ) + + floor_name = detail['name'] + difficulty_name = difficultylist[detail['difficulty']] + + time_array = detail['finish_time'] + time_str = f"{time_array['year']}-{time_array['month']}" + time_str = f"{time_str}-{time_array['day']}" + time_str = f"{time_str} {time_array['hour']}:{time_array['minute']}" + floor_pic_draw = ImageDraw.Draw(floor_pic) + floor_pic_draw.text( + (450, 60), + f'{floor_name} {difficulty_name}', + white_color, + sr_font_42, + 'mm', + ) + floor_pic_draw.text( + (93, 120), + f'挑战时间:{time_str}', + gray_color, + sr_font_22, + 'lm', + ) + if detail["fury"]["type"] == 1: + floor_pic_draw.text( + (800, 120), + f'扰动等级:{detail["fury"]["point"]}', + gray_color, + sr_font_22, + 'rm', + ) + else: + floor_pic_draw.text( + (800, 120), + f'位面紊乱倒计时:{detail["fury"]["point"]}', + gray_color, + sr_font_22, + 'rm', + ) + + # 角色 + for index_char, char in enumerate(detail['final_lineup']): + # 获取命座 + # if char["id"] in char_temp: + # talent_num = char_temp[char["id"]] + # else: + # for i in char_data: + # if i["id"] == char["id"]: + # talent_num = str( + # i["actived_constellation_num"] + # ) + # char_temp[char["id"]] = talent_num + # break + await _draw_rogue_card( + char, + 0, # type: ignore + floor_pic, + index_char, + ) + + # 祝福 + buff_height = 0 + if len(detail['base_type_list']) > 0: + floor_pic_draw.text( + (93, 370), + '获得祝福', + white_color, + sr_font_34, + 'lm', + ) + floor_pic.paste(content_center, (0, 390), content_center) + for buff in detail['buffs']: + buff_icon = bufflist[buff['base_type']['id']] + buff_name = buff['base_type']['name'] + buffs = buff['items'] + draw_height = await _draw_rogue_buff( + buffs, + buff_icon, + buff_name, + floor_pic, + buff_height, + ) + buff_height = buff_height + draw_height + + # 奇物 + miracles_height = buff_height + if len(detail['miracles']) > 0: + floor_pic_draw.text( + (93, 370 + miracles_height + 60), + '获得奇物', + white_color, + sr_font_34, + 'lm', + ) + floor_pic.paste( + content_center, (0, 370 + miracles_height + 80), content_center + ) + draw_height = await _draw_rogue_miracles( + detail['miracles'], + floor_pic, + miracles_height, + ) + miracles_height = miracles_height + 80 + miracles_height = miracles_height + draw_height + + # 事件 + blocks_height = miracles_height + if len(detail['blocks']) > 0: + floor_pic_draw.text( + (93, 370 + blocks_height + 60), + '通过区域类型', + white_color, + sr_font_34, + 'lm', + ) + floor_pic.paste( + content_center, (0, 370 + blocks_height + 80), content_center + ) + draw_height = await _draw_rogue_blocks( + detail['blocks'], + floor_pic, + blocks_height, + ) + blocks_height = blocks_height + 80 + blocks_height = blocks_height + draw_height + + if detail['start_h'] is None: + continue + + img.paste(floor_pic, (0, detail['start_h']), floor_pic) + # await _draw_floor_card( + # level_star, + # floor_pic, + # img, + # index_floor, + # floor_name, + # round_num, + # ) + + res = await convert_img(img) + logger.info('[查询寰宇蝗灾]绘图已完成,等待发送!') + return res diff --git a/StarRailUID/starrailuid_rogue/texture2D/floor_bg_center.png b/StarRailUID/starrailuid_rogue/texture2D/floor_bg_center.png index 374b9f0..409f86d 100644 Binary files a/StarRailUID/starrailuid_rogue/texture2D/floor_bg_center.png and b/StarRailUID/starrailuid_rogue/texture2D/floor_bg_center.png differ diff --git a/StarRailUID/starrailuid_rogue/texture2D/事件.png b/StarRailUID/starrailuid_rogue/texture2D/事件.png new file mode 100644 index 0000000..fcd0cd4 Binary files /dev/null and b/StarRailUID/starrailuid_rogue/texture2D/事件.png differ diff --git a/StarRailUID/starrailuid_rogue/texture2D/事件•虫群.png b/StarRailUID/starrailuid_rogue/texture2D/事件•虫群.png new file mode 100644 index 0000000..81c7df0 Binary files /dev/null and b/StarRailUID/starrailuid_rogue/texture2D/事件•虫群.png differ diff --git a/StarRailUID/starrailuid_rogue/texture2D/交易.png b/StarRailUID/starrailuid_rogue/texture2D/交易.png new file mode 100644 index 0000000..9beab2a Binary files /dev/null and b/StarRailUID/starrailuid_rogue/texture2D/交易.png differ diff --git a/StarRailUID/starrailuid_rogue/texture2D/休整.png b/StarRailUID/starrailuid_rogue/texture2D/休整.png new file mode 100644 index 0000000..07700c0 Binary files /dev/null and b/StarRailUID/starrailuid_rogue/texture2D/休整.png differ diff --git a/StarRailUID/starrailuid_rogue/texture2D/冒险.png b/StarRailUID/starrailuid_rogue/texture2D/冒险.png new file mode 100644 index 0000000..735ba64 Binary files /dev/null and b/StarRailUID/starrailuid_rogue/texture2D/冒险.png differ diff --git a/StarRailUID/starrailuid_rogue/texture2D/奖励.png b/StarRailUID/starrailuid_rogue/texture2D/奖励.png new file mode 100644 index 0000000..9dd2980 Binary files /dev/null and b/StarRailUID/starrailuid_rogue/texture2D/奖励.png differ diff --git a/StarRailUID/starrailuid_rogue/texture2D/战斗.png b/StarRailUID/starrailuid_rogue/texture2D/战斗.png new file mode 100644 index 0000000..b4c555a Binary files /dev/null and b/StarRailUID/starrailuid_rogue/texture2D/战斗.png differ diff --git a/StarRailUID/starrailuid_rogue/texture2D/战斗•虫群.png b/StarRailUID/starrailuid_rogue/texture2D/战斗•虫群.png new file mode 100644 index 0000000..c8224d1 Binary files /dev/null and b/StarRailUID/starrailuid_rogue/texture2D/战斗•虫群.png differ diff --git a/StarRailUID/starrailuid_rogue/texture2D/空白.png b/StarRailUID/starrailuid_rogue/texture2D/空白.png new file mode 100644 index 0000000..5f95a2d Binary files /dev/null and b/StarRailUID/starrailuid_rogue/texture2D/空白.png differ diff --git a/StarRailUID/starrailuid_rogue/texture2D/精英.png b/StarRailUID/starrailuid_rogue/texture2D/精英.png new file mode 100644 index 0000000..f65c1d0 Binary files /dev/null and b/StarRailUID/starrailuid_rogue/texture2D/精英.png differ diff --git a/StarRailUID/starrailuid_rogue/texture2D/繁育.png b/StarRailUID/starrailuid_rogue/texture2D/繁育.png new file mode 100644 index 0000000..de1a728 Binary files /dev/null and b/StarRailUID/starrailuid_rogue/texture2D/繁育.png differ diff --git a/StarRailUID/starrailuid_rogue/texture2D/首领.png b/StarRailUID/starrailuid_rogue/texture2D/首领.png new file mode 100644 index 0000000..78dc0eb Binary files /dev/null and b/StarRailUID/starrailuid_rogue/texture2D/首领.png differ diff --git a/StarRailUID/starrailuid_rogue/texture2D/首领•虫群.png b/StarRailUID/starrailuid_rogue/texture2D/首领•虫群.png new file mode 100644 index 0000000..c756668 Binary files /dev/null and b/StarRailUID/starrailuid_rogue/texture2D/首领•虫群.png differ diff --git a/StarRailUID/utils/convert.py b/StarRailUID/utils/convert.py index 059ff33..cc7889c 100644 --- a/StarRailUID/utils/convert.py +++ b/StarRailUID/utils/convert.py @@ -8,7 +8,7 @@ from gsuid_core.utils.api.mys.models import IndexData from .api import get_sqla from .mys_api import mys_api from .error_reply import VERIFY_HINT -from ..sruid_utils.api.mys.models import AbyssData, RogueData +from ..sruid_utils.api.mys.models import AbyssData, RogueData, RogueLocustData @overload @@ -88,6 +88,13 @@ class GsCookie: self.uid, schedule_type, self.cookie ) + async def get_rogue_locust_data( + self, uid: str + ) -> Union[RogueLocustData, int]: + self.uid = uid + self.cookie = await self.sqla.get_random_cookie(uid) + return await mys_api.get_rogue_locust_info(self.uid, self.cookie) + async def check_cookies_useable(self): if isinstance(self.raw_data, int) and self.cookie: retcode = self.raw_data diff --git a/StarRailUID/utils/mys_api.py b/StarRailUID/utils/mys_api.py index c06faaa..e20aa97 100644 --- a/StarRailUID/utils/mys_api.py +++ b/StarRailUID/utils/mys_api.py @@ -24,6 +24,7 @@ from ..sruid_utils.api.mys.models import ( DailyNoteData, RoleBasicInfo, WidgetStamina, + RogueLocustData, ) RECOGNIZE_SERVER = { @@ -366,6 +367,28 @@ class MysApi(_MysApi): data = cast(RogueData, data['data']) return data + async def get_rogue_locust_info( + self, + uid: str, + ck: Optional[str] = None, + ) -> Union[RogueLocustData, int]: + server_id = self.RECOGNIZE_SERVER.get(uid[0]) + data = await self.simple_mys_req( + 'ROGUE_LOCUST_INFO_URL', + uid, + params={ + 'need_detail': 'true', + 'role_id': uid, + 'server': server_id, + }, + cookie=ck, + header=self._HEADER, + ) + # print(data) + if isinstance(data, Dict): + data = cast(RogueData, data['data']) + return data + async def mys_sign( self, uid, header=None, server_id='cn_gf01' ) -> Union[MysSign, int]: