zhenxun_bot/plugins/draw_card/fgo_handle.py

112 lines
3.9 KiB
Python
Raw Normal View History

2022-02-19 18:20:19 +08:00
from nonebot.adapters.onebot.v11 import MessageSegment
2021-06-04 18:01:33 +08:00
import random
from .update_game_requests_info import update_requests_info
from .util import generate_img, init_star_rst, BaseData, set_list, get_star, max_card
2022-02-19 18:20:19 +08:00
from .config import DRAW_DATA_PATH, draw_config
2021-06-04 18:01:33 +08:00
from dataclasses import dataclass
from .init_card_pool import init_game_pool
try:
import ujson as json
except ModuleNotFoundError:
import json
ALL_CHAR = []
ALL_CARD = []
@dataclass
class FgoChar(BaseData):
pass
async def fgo_draw(count: int):
# 0 1 2
cnlist = ['★★★★★', '★★★★', '★★★']
obj_list, obj_dict, max_star_list, star_list, max_star_index_list = _format_card_information(count)
rst = init_star_rst(star_list, cnlist, max_star_list, max_star_index_list)
if count > 90:
obj_list = set_list(obj_list)
return MessageSegment.image("base64://" + await generate_img(obj_list, 'fgo', star_list)) \
+ '\n' + rst[:-1] + '\n' + max_card(obj_dict)
async def update_fgo_info():
global ALL_CHAR, ALL_CARD
data, code = await update_requests_info('fgo')
if code == 200:
ALL_CHAR = init_game_pool('fgo', data, FgoChar)
data, code = await update_requests_info('fgo_card')
if code == 200:
ALL_CARD = init_game_pool('fgo_card', data, FgoChar)
async def init_fgo_data():
global ALL_CHAR, ALL_CARD
2022-02-19 18:20:19 +08:00
if draw_config.FGO_FLAG:
with (DRAW_DATA_PATH / 'fgo.json').open('r', encoding='utf8') as f:
2021-06-04 18:01:33 +08:00
fgo_dict = json.load(f)
ALL_CHAR = init_game_pool('fgo', fgo_dict, FgoChar)
2022-02-19 18:20:19 +08:00
with (DRAW_DATA_PATH / 'fgo_card.json').open('r', encoding='utf8') as f:
2021-06-04 18:01:33 +08:00
fgo_dict = json.load(f)
ALL_CARD = init_game_pool('fgo', fgo_dict, FgoChar)
# 抽取卡池
def _get_fgo_card(mode: int = 1):
global ALL_CHAR, ALL_CARD
2022-02-19 18:20:19 +08:00
fgo_config = draw_config.fgo
2021-06-04 18:01:33 +08:00
if mode == 1:
2022-02-19 18:20:19 +08:00
star = get_star([8, 7, 6, 5, 4, 3], [fgo_config.FGO_SERVANT_FIVE_P, fgo_config.FGO_SERVANT_FOUR_P, fgo_config.FGO_SERVANT_THREE_P,
fgo_config.FGO_CARD_FIVE_P, fgo_config.FGO_CARD_FOUR_P, fgo_config.FGO_CARD_THREE_P])
2021-06-04 18:01:33 +08:00
elif mode == 2:
2022-02-19 18:20:19 +08:00
star = get_star([5, 4], [fgo_config.FGO_CARD_FIVE_P, fgo_config.FGO_CARD_FOUR_P])
2021-06-04 18:01:33 +08:00
else:
2022-02-19 18:20:19 +08:00
star = get_star([8, 7, 6], [fgo_config.FGO_SERVANT_FIVE_P, fgo_config.FGO_SERVANT_FOUR_P, fgo_config.FGO_SERVANT_THREE_P])
2021-06-04 18:01:33 +08:00
if star > 5:
2022-02-19 18:20:19 +08:00
type_ = 'servant'
2021-06-04 18:01:33 +08:00
star -= 3
chars = [x for x in ALL_CHAR if x.star == star if not x.limited]
else:
2022-02-19 18:20:19 +08:00
type_ = 'card'
2021-06-04 18:01:33 +08:00
chars = [x for x in ALL_CARD if x.star == star if not x.limited]
2022-02-19 18:20:19 +08:00
return random.choice(chars), 5 - star, type_
2021-06-04 18:01:33 +08:00
# 整理数据
def _format_card_information(count: int):
max_star_lst = [] # 获取的最高星级角色列表
max_index_lst = [] # 获取最高星级角色的次数
star_list = [0, 0, 0]
obj_list = [] # 获取所有角色
obj_dict = {} # 获取角色次数字典
servant_count = 0 # 保底计算
card_count = 0 # 保底计算
for i in range(count):
servant_count += 1
card_count += 1
# 四星卡片保底
if card_count == 9:
2022-02-19 18:20:19 +08:00
obj, code, type_ = _get_fgo_card(2)
2021-06-04 18:01:33 +08:00
# 三星从者保底
elif servant_count == 10:
2022-02-19 18:20:19 +08:00
obj, code, type_ = _get_fgo_card(3)
2021-06-04 18:01:33 +08:00
_count = 0
# 普通抽
else:
2022-02-19 18:20:19 +08:00
obj, code, type_ = _get_fgo_card()
2021-06-04 18:01:33 +08:00
star_list[code] += 1
2022-02-19 18:20:19 +08:00
if type_ == 'card' and code < 2:
2021-06-04 18:01:33 +08:00
card_count = 0
2022-02-19 18:20:19 +08:00
if type_ == 'servant':
2021-06-04 18:01:33 +08:00
servant_count = 0
if code == 0:
max_star_lst.append(obj.name)
max_index_lst.append(i)
try:
obj_dict[obj.name] += 1
except KeyError:
obj_dict[obj.name] = 1
obj_list.append(obj)
return obj_list, obj_dict, max_star_lst, star_list, max_index_lst