zhenxun_bot/plugins/draw_card/guardian_handle.py

160 lines
6.0 KiB
Python
Raw Normal View History

2022-02-19 18:20:19 +08:00
from nonebot.adapters.onebot.v11 import MessageSegment, Message
2021-05-26 20:08:13 +08:00
from .update_game_info import update_info
from .util import init_star_rst, generate_img, max_card, BaseData,\
2021-06-24 15:32:06 +08:00
set_list, get_star, format_card_information, init_up_char
2021-05-26 20:08:13 +08:00
import random
2022-02-19 18:20:19 +08:00
from .config import DRAW_DATA_PATH, draw_config
2021-05-26 20:08:13 +08:00
from dataclasses import dataclass
from .init_card_pool import init_game_pool
2022-02-19 18:20:19 +08:00
from .announcement import GuardianAnnouncement
2021-05-26 20:08:13 +08:00
try:
import ujson as json
except ModuleNotFoundError:
import json
2021-06-24 15:32:06 +08:00
announcement = GuardianAnnouncement()
2021-05-26 20:08:13 +08:00
ALL_CHAR = []
ALL_ARMS = []
2021-06-23 15:57:03 +08:00
_CURRENT_CHAR_POOL_TITLE = ''
_CURRENT_ARMS_POOL_TITLE = ''
UP_CHAR = []
UP_ARMS = []
POOL_IMG = ''
2021-05-26 20:08:13 +08:00
@dataclass
class GuardianChar(BaseData):
pass
@dataclass
class GuardianArms(BaseData):
pass
async def guardian_draw(count: int, pool_name):
if pool_name == 'arms':
cnlist = ['★★★★★', '★★★★', '★★★', '★★']
star_list = [0, 0, 0, 0]
else:
cnlist = ['★★★', '★★', '']
star_list = [0, 0, 0]
2021-06-23 15:57:03 +08:00
title = ''
up_type = []
up_list = []
if pool_name == 'char' and _CURRENT_CHAR_POOL_TITLE:
up_type = UP_CHAR
title = _CURRENT_CHAR_POOL_TITLE
elif pool_name == 'arms' and _CURRENT_ARMS_POOL_TITLE:
up_type = UP_ARMS
title = _CURRENT_ARMS_POOL_TITLE
tmp = ''
if up_type:
for x in up_type:
for operator in x.operators:
up_list.append(operator)
if pool_name == 'char':
if x.star == 3:
tmp += f'三星UP{" ".join(x.operators)} \n'
else:
if x.star == 5:
tmp += f'五星UP{" ".join(x.operators)}'
2021-05-26 20:08:13 +08:00
obj_list, obj_dict, max_list, star_list, max_index_list = format_card_information(count, star_list,
_get_guardian_card, pool_name)
2021-06-23 15:57:03 +08:00
rst = init_star_rst(star_list, cnlist, max_list, max_index_list, up_list)
pool_info = f'当前up池{title}\n{tmp}' if title else ''
2021-05-26 20:08:13 +08:00
if count > 90:
obj_list = set_list(obj_list)
2021-06-23 15:57:03 +08:00
return pool_info + '\n' + MessageSegment.image(
2021-06-04 18:01:33 +08:00
"base64://" + await generate_img(obj_list, 'guardian', star_list)) \
2021-05-26 20:08:13 +08:00
+ '\n' + rst[:-1] + '\n' + max_card(obj_dict)
async def update_guardian_info():
global ALL_CHAR, ALL_ARMS
url = 'https://wiki.biligame.com/gt/英雄筛选表'
data, code = await update_info(url, 'guardian')
if code == 200:
ALL_CHAR = init_game_pool('guardian', data, GuardianChar)
url = 'https://wiki.biligame.com/gt/武器'
tmp, code_1 = await update_info(url, 'guardian_arms')
url = 'https://wiki.biligame.com/gt/盾牌'
data, code_2 = await update_info(url, 'guardian_arms')
if code_1 == 200 and code_2 == 200:
data.update(tmp)
ALL_ARMS = init_game_pool('guardian_arms', data, GuardianArms)
2021-06-24 15:32:06 +08:00
await _guardian_init_up_char()
2021-05-26 20:08:13 +08:00
2021-06-04 18:01:33 +08:00
async def init_guardian_data():
2021-05-26 20:08:13 +08:00
global ALL_CHAR, ALL_ARMS
2022-02-19 18:20:19 +08:00
if draw_config.GUARDIAN_FLAG:
if not (DRAW_DATA_PATH / 'guardian.json').exists() or not (DRAW_DATA_PATH / 'guardian_arms.json').exists():
2021-05-26 20:08:13 +08:00
await update_guardian_info()
else:
2022-02-19 18:20:19 +08:00
with (DRAW_DATA_PATH / 'guardian.json').open('r', encoding='utf8') as f:
2021-05-26 20:08:13 +08:00
guardian_char_dict = json.load(f)
2022-02-19 18:20:19 +08:00
with (DRAW_DATA_PATH / 'guardian_arms.json').open('r', encoding='utf8') as f:
2021-05-26 20:08:13 +08:00
guardian_arms_dict = json.load(f)
ALL_CHAR = init_game_pool('guardian', guardian_char_dict, GuardianChar)
ALL_ARMS = init_game_pool('guardian_arms', guardian_arms_dict, GuardianArms)
2021-06-24 15:32:06 +08:00
await _guardian_init_up_char()
2021-05-26 20:08:13 +08:00
# 抽取卡池
2021-06-24 15:32:06 +08:00
def _get_guardian_card(pool_name: str = '', mode: int = 1):
2021-06-23 15:57:03 +08:00
global ALL_ARMS, ALL_CHAR, UP_ARMS, UP_CHAR, _CURRENT_ARMS_POOL_TITLE, _CURRENT_CHAR_POOL_TITLE
2022-02-19 18:20:19 +08:00
guardian_config = draw_config.guardian
2021-06-23 15:57:03 +08:00
if pool_name == 'char':
2021-06-24 15:32:06 +08:00
if mode == 1:
2022-02-19 18:20:19 +08:00
star = get_star([3, 2, 1], [guardian_config.GUARDIAN_THREE_CHAR_P, guardian_config.GUARDIAN_TWO_CHAR_P, guardian_config.GUARDIAN_ONE_CHAR_P])
2021-06-24 15:32:06 +08:00
else:
2022-02-19 18:20:19 +08:00
star = get_star([3, 2], [guardian_config.GUARDIAN_THREE_CHAR_P, guardian_config.GUARDIAN_TWO_CHAR_P])
2021-06-23 15:57:03 +08:00
up_lst = UP_CHAR
flag = _CURRENT_CHAR_POOL_TITLE
_max_star = 3
all_data = ALL_CHAR
2021-05-26 20:08:13 +08:00
else:
2021-06-24 15:32:06 +08:00
if mode == 1:
2022-02-19 18:20:19 +08:00
star = get_star([5, 4, 3, 2], [guardian_config.GUARDIAN_FIVE_ARMS_P, guardian_config.GUARDIAN_FOUR_ARMS_P,
guardian_config.GUARDIAN_THREE_ARMS_P, guardian_config.GUARDIAN_TWO_ARMS_P])
2021-06-24 15:32:06 +08:00
else:
2022-02-19 18:20:19 +08:00
star = get_star([5, 4], [guardian_config.GUARDIAN_FIVE_ARMS_P, guardian_config.GUARDIAN_FOUR_ARMS_P])
2021-06-23 15:57:03 +08:00
up_lst = UP_ARMS
flag = _CURRENT_ARMS_POOL_TITLE
_max_star = 5
all_data = ALL_ARMS
# 是否UP
if flag and star == _max_star and pool_name:
# 获取up角色列表
up_char_lst = [x.operators for x in up_lst if x.star == star][0]
# 成功获取up角色
if random.random() < 0.5:
up_char_name = random.choice(up_char_lst)
acquire_char = [x for x in all_data if x.name == up_char_name][0]
else:
# 无up
all_char_lst = [x for x in all_data if x.star == star and x.name not in up_char_lst and not x.limited]
acquire_char = random.choice(all_char_lst)
2021-05-26 20:08:13 +08:00
else:
2021-06-23 15:57:03 +08:00
chars = [x for x in all_data if x.star == star and not x.limited]
acquire_char = random.choice(chars)
return acquire_char, _max_star - star
# 获取up和概率
2021-06-24 15:32:06 +08:00
async def _guardian_init_up_char():
2021-06-23 15:57:03 +08:00
global _CURRENT_CHAR_POOL_TITLE, _CURRENT_ARMS_POOL_TITLE, UP_CHAR, UP_ARMS, POOL_IMG
2021-06-24 15:32:06 +08:00
_CURRENT_CHAR_POOL_TITLE, _CURRENT_ARMS_POOL_TITLE, POOL_IMG, UP_CHAR, UP_ARMS = await init_up_char(announcement)
2021-06-23 15:57:03 +08:00
async def reload_guardian_pool():
2021-06-24 15:32:06 +08:00
await _guardian_init_up_char()
return Message(f'当前UP池子{_CURRENT_CHAR_POOL_TITLE} & {_CURRENT_ARMS_POOL_TITLE}')
2022-02-19 18:20:19 +08:00