2021-05-20 19:23:32 +08:00
|
|
|
|
import os
|
2021-06-24 15:32:06 +08:00
|
|
|
|
from nonebot.adapters.cqhttp import MessageSegment, Message
|
2021-05-20 19:23:32 +08:00
|
|
|
|
import random
|
|
|
|
|
|
from .update_game_info import update_info
|
2022-01-16 14:52:50 +08:00
|
|
|
|
from .util import (
|
|
|
|
|
|
generate_img,
|
|
|
|
|
|
init_star_rst,
|
|
|
|
|
|
BaseData,
|
|
|
|
|
|
set_list,
|
|
|
|
|
|
get_star,
|
|
|
|
|
|
init_up_char,
|
|
|
|
|
|
)
|
|
|
|
|
|
from .config import (
|
|
|
|
|
|
GENSHIN_FIVE_P,
|
|
|
|
|
|
GENSHIN_FOUR_P,
|
|
|
|
|
|
GENSHIN_G_FIVE_P,
|
|
|
|
|
|
GENSHIN_G_FOUR_P,
|
|
|
|
|
|
GENSHIN_THREE_P,
|
|
|
|
|
|
I72_ADD,
|
|
|
|
|
|
DRAW_PATH,
|
|
|
|
|
|
GENSHIN_FLAG,
|
|
|
|
|
|
)
|
2021-05-20 19:23:32 +08:00
|
|
|
|
from dataclasses import dataclass
|
|
|
|
|
|
from .init_card_pool import init_game_pool
|
2021-06-04 18:01:33 +08:00
|
|
|
|
from .announcement import GenshinAnnouncement
|
2021-06-15 10:57:08 +08:00
|
|
|
|
|
2021-05-20 19:23:32 +08:00
|
|
|
|
try:
|
|
|
|
|
|
import ujson as json
|
|
|
|
|
|
except ModuleNotFoundError:
|
|
|
|
|
|
import json
|
|
|
|
|
|
|
|
|
|
|
|
|
2021-06-24 15:32:06 +08:00
|
|
|
|
announcement = GenshinAnnouncement()
|
|
|
|
|
|
|
2021-05-20 19:23:32 +08:00
|
|
|
|
genshin_five = {}
|
|
|
|
|
|
genshin_count = {}
|
|
|
|
|
|
genshin_pl_count = {}
|
|
|
|
|
|
|
|
|
|
|
|
ALL_CHAR = []
|
2021-05-26 20:08:13 +08:00
|
|
|
|
ALL_ARMS = []
|
2021-05-20 19:23:32 +08:00
|
|
|
|
|
2021-06-04 18:01:33 +08:00
|
|
|
|
UP_CHAR = []
|
|
|
|
|
|
UP_ARMS = []
|
|
|
|
|
|
|
2022-01-16 14:52:50 +08:00
|
|
|
|
_CURRENT_CHAR_POOL_TITLE = ""
|
|
|
|
|
|
_CURRENT_ARMS_POOL_TITLE = ""
|
|
|
|
|
|
POOL_IMG = ""
|
2021-06-04 18:01:33 +08:00
|
|
|
|
|
2021-05-20 19:23:32 +08:00
|
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
|
|
|
class GenshinChar(BaseData):
|
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
2021-06-04 18:01:33 +08:00
|
|
|
|
async def genshin_draw(user_id: int, count: int, pool_name: str):
|
2021-05-20 19:23:32 +08:00
|
|
|
|
# 0 1 2
|
2022-01-16 14:52:50 +08:00
|
|
|
|
cnlist = ["★★★★★", "★★★★", "★★★"]
|
|
|
|
|
|
(
|
|
|
|
|
|
char_list,
|
|
|
|
|
|
five_list,
|
|
|
|
|
|
five_index_list,
|
|
|
|
|
|
char_dict,
|
|
|
|
|
|
star_list,
|
|
|
|
|
|
) = _format_card_information(count, user_id, pool_name)
|
|
|
|
|
|
temp = ""
|
|
|
|
|
|
title = ""
|
2021-06-04 18:01:33 +08:00
|
|
|
|
up_type = []
|
|
|
|
|
|
up_list = []
|
2022-01-16 14:52:50 +08:00
|
|
|
|
if pool_name == "char" and _CURRENT_CHAR_POOL_TITLE:
|
2021-06-04 18:01:33 +08:00
|
|
|
|
up_type = UP_CHAR
|
|
|
|
|
|
title = _CURRENT_CHAR_POOL_TITLE
|
2022-01-16 14:52:50 +08:00
|
|
|
|
elif pool_name == "arms" and _CURRENT_ARMS_POOL_TITLE:
|
2021-06-04 18:01:33 +08:00
|
|
|
|
up_type = UP_ARMS
|
|
|
|
|
|
title = _CURRENT_ARMS_POOL_TITLE
|
2022-01-16 14:52:50 +08:00
|
|
|
|
tmp = ""
|
2021-06-04 18:01:33 +08:00
|
|
|
|
if up_type:
|
|
|
|
|
|
for x in up_type:
|
|
|
|
|
|
for operator in x.operators:
|
|
|
|
|
|
up_list.append(operator)
|
|
|
|
|
|
if x.star == 5:
|
|
|
|
|
|
tmp += f'五星UP:{" ".join(x.operators)} \n'
|
|
|
|
|
|
elif x.star == 4:
|
|
|
|
|
|
tmp += f'四星UP:{" ".join(x.operators)}'
|
|
|
|
|
|
rst = init_star_rst(star_list, cnlist, five_list, five_index_list, up_list)
|
2022-01-16 14:52:50 +08:00
|
|
|
|
pool_info = f"当前up池:{title}\n{tmp}" if title else ""
|
2021-05-20 19:23:32 +08:00
|
|
|
|
if count > 90:
|
2021-05-26 20:08:13 +08:00
|
|
|
|
char_list = set_list(char_list)
|
2022-01-16 14:52:50 +08:00
|
|
|
|
return (
|
|
|
|
|
|
pool_info
|
|
|
|
|
|
+ "\n"
|
|
|
|
|
|
+ MessageSegment.image(
|
|
|
|
|
|
"base64://" + await generate_img(char_list, "genshin", star_list)
|
|
|
|
|
|
)
|
|
|
|
|
|
+ "\n"
|
|
|
|
|
|
+ rst[:-1]
|
|
|
|
|
|
+ temp[:-1]
|
|
|
|
|
|
+ f'\n距离保底发还剩 {90 - genshin_count[user_id] if genshin_count.get(user_id) else "^"} 抽'
|
|
|
|
|
|
+ "\n【五星:0.6%,四星:5.1%\n第72抽开始五星概率每抽加0.585%】"
|
|
|
|
|
|
)
|
2021-05-20 19:23:32 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def update_genshin_info():
|
2021-05-26 20:08:13 +08:00
|
|
|
|
global ALL_CHAR, ALL_ARMS
|
2022-01-16 14:52:50 +08:00
|
|
|
|
url = "https://wiki.biligame.com/ys/角色筛选"
|
|
|
|
|
|
data, code = await update_info(url, "genshin")
|
2021-05-20 19:23:32 +08:00
|
|
|
|
if code == 200:
|
2022-01-16 14:52:50 +08:00
|
|
|
|
ALL_CHAR = init_game_pool("genshin", data, GenshinChar)
|
|
|
|
|
|
url = "https://wiki.biligame.com/ys/武器图鉴"
|
|
|
|
|
|
data, code = await update_info(
|
|
|
|
|
|
url,
|
|
|
|
|
|
"genshin_arms",
|
|
|
|
|
|
)
|
2021-05-20 19:23:32 +08:00
|
|
|
|
if code == 200:
|
2022-01-16 14:52:50 +08:00
|
|
|
|
ALL_ARMS = init_game_pool("genshin_arms", data, GenshinChar)
|
2021-06-24 15:32:06 +08:00
|
|
|
|
await _genshin_init_up_char()
|
2021-05-20 19:23:32 +08:00
|
|
|
|
|
|
|
|
|
|
|
2021-06-04 18:01:33 +08:00
|
|
|
|
async def init_genshin_data():
|
2021-05-26 20:08:13 +08:00
|
|
|
|
global ALL_CHAR, ALL_ARMS
|
|
|
|
|
|
if GENSHIN_FLAG:
|
2022-01-16 14:52:50 +08:00
|
|
|
|
if not os.path.exists(DRAW_PATH + "genshin.json") or not os.path.exists(
|
|
|
|
|
|
DRAW_PATH + "genshin_arms.json"
|
|
|
|
|
|
):
|
2021-05-26 20:08:13 +08:00
|
|
|
|
await update_genshin_info()
|
|
|
|
|
|
else:
|
2022-01-16 14:52:50 +08:00
|
|
|
|
with open(DRAW_PATH + "genshin.json", "r", encoding="utf8") as f:
|
2021-05-26 20:08:13 +08:00
|
|
|
|
genshin_dict = json.load(f)
|
2022-01-16 14:52:50 +08:00
|
|
|
|
with open(DRAW_PATH + "genshin_arms.json", "r", encoding="utf8") as f:
|
2021-05-26 20:08:13 +08:00
|
|
|
|
genshin_ARMS_dict = json.load(f)
|
2022-01-16 14:52:50 +08:00
|
|
|
|
ALL_CHAR = init_game_pool("genshin", genshin_dict, GenshinChar)
|
|
|
|
|
|
ALL_ARMS = init_game_pool("genshin_arms", genshin_ARMS_dict, GenshinChar)
|
2021-06-24 15:32:06 +08:00
|
|
|
|
await _genshin_init_up_char()
|
2021-05-20 19:23:32 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 抽取卡池
|
2022-01-16 14:52:50 +08:00
|
|
|
|
def _get_genshin_card(mode: int = 1, pool_name: str = "", add: float = 0.0):
|
2021-06-04 18:01:33 +08:00
|
|
|
|
global ALL_ARMS, ALL_CHAR, UP_ARMS, UP_CHAR, _CURRENT_ARMS_POOL_TITLE, _CURRENT_CHAR_POOL_TITLE
|
2021-05-20 19:23:32 +08:00
|
|
|
|
if mode == 1:
|
2022-01-16 14:52:50 +08:00
|
|
|
|
star = get_star(
|
|
|
|
|
|
[5, 4, 3], [GENSHIN_FIVE_P + add, GENSHIN_FOUR_P, GENSHIN_THREE_P]
|
|
|
|
|
|
)
|
2021-05-20 19:23:32 +08:00
|
|
|
|
elif mode == 2:
|
2021-05-26 20:08:13 +08:00
|
|
|
|
star = get_star([5, 4], [GENSHIN_G_FIVE_P + add, GENSHIN_G_FOUR_P])
|
2021-05-20 19:23:32 +08:00
|
|
|
|
else:
|
|
|
|
|
|
star = 5
|
2022-01-16 14:52:50 +08:00
|
|
|
|
if pool_name == "char":
|
2021-06-04 18:01:33 +08:00
|
|
|
|
data_lst = UP_CHAR
|
|
|
|
|
|
flag = _CURRENT_CHAR_POOL_TITLE
|
2022-01-16 14:52:50 +08:00
|
|
|
|
itype_all_lst = ALL_CHAR + [
|
|
|
|
|
|
x for x in ALL_ARMS if x.star == star and x.star < 5
|
|
|
|
|
|
]
|
|
|
|
|
|
elif pool_name == "arms":
|
2021-06-04 18:01:33 +08:00
|
|
|
|
data_lst = UP_ARMS
|
|
|
|
|
|
flag = _CURRENT_ARMS_POOL_TITLE
|
2022-01-16 14:52:50 +08:00
|
|
|
|
itype_all_lst = ALL_ARMS + [
|
|
|
|
|
|
x for x in ALL_CHAR if x.star == star and x.star < 5
|
|
|
|
|
|
]
|
2021-06-04 18:01:33 +08:00
|
|
|
|
else:
|
2022-01-16 14:52:50 +08:00
|
|
|
|
data_lst = ""
|
|
|
|
|
|
flag = ""
|
|
|
|
|
|
itype_all_lst = ""
|
2021-06-04 18:01:33 +08:00
|
|
|
|
all_lst = ALL_ARMS + ALL_CHAR
|
|
|
|
|
|
# 是否UP
|
2022-01-16 14:52:50 +08:00
|
|
|
|
try:
|
|
|
|
|
|
if flag and star > 3 and pool_name:
|
|
|
|
|
|
# 获取up角色列表
|
|
|
|
|
|
up_char_lst = [x.operators for x in data_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_lst if x.name == up_char_name][0]
|
|
|
|
|
|
else:
|
|
|
|
|
|
# 无up
|
|
|
|
|
|
all_char_lst = [
|
|
|
|
|
|
x
|
|
|
|
|
|
for x in itype_all_lst
|
|
|
|
|
|
if x.star == star and x.name not in up_char_lst and not x.limited
|
|
|
|
|
|
]
|
|
|
|
|
|
acquire_char = random.choice(all_char_lst)
|
2021-06-04 18:01:33 +08:00
|
|
|
|
else:
|
2022-01-16 14:52:50 +08:00
|
|
|
|
chars = [x for x in all_lst if x.star == star and not x.limited]
|
|
|
|
|
|
acquire_char = random.choice(chars)
|
|
|
|
|
|
except IndexError:
|
2021-06-04 18:01:33 +08:00
|
|
|
|
chars = [x for x in all_lst if x.star == star and not x.limited]
|
|
|
|
|
|
acquire_char = random.choice(chars)
|
|
|
|
|
|
return acquire_char, 5 - star
|
2021-05-20 19:23:32 +08:00
|
|
|
|
|
|
|
|
|
|
|
2021-06-04 18:01:33 +08:00
|
|
|
|
def _format_card_information(_count: int, user_id, pool_name):
|
2021-05-26 20:08:13 +08:00
|
|
|
|
char_list = []
|
2021-05-20 19:23:32 +08:00
|
|
|
|
star_list = [0, 0, 0]
|
|
|
|
|
|
five_index_list = []
|
|
|
|
|
|
five_list = []
|
|
|
|
|
|
five_dict = {}
|
2022-01-16 14:52:50 +08:00
|
|
|
|
_start_add_count = 72 if pool_name == "char" else 62
|
|
|
|
|
|
_x = 90 if pool_name == "char" else 80 # 保底
|
2021-05-20 19:23:32 +08:00
|
|
|
|
add = 0.0
|
2022-01-05 22:32:59 +08:00
|
|
|
|
if genshin_count.get(user_id) and _count <= _x:
|
2021-05-20 19:23:32 +08:00
|
|
|
|
f_count = genshin_count[user_id]
|
|
|
|
|
|
else:
|
|
|
|
|
|
f_count = 0
|
2022-01-05 22:32:59 +08:00
|
|
|
|
if genshin_pl_count.get(user_id) and _count <= _x:
|
2021-05-20 19:23:32 +08:00
|
|
|
|
count = genshin_pl_count[user_id]
|
|
|
|
|
|
else:
|
|
|
|
|
|
count = 0
|
|
|
|
|
|
for i in range(_count):
|
|
|
|
|
|
count += 1
|
|
|
|
|
|
f_count += 1
|
|
|
|
|
|
# 十连保底
|
2022-01-05 22:32:59 +08:00
|
|
|
|
if count == 10 and f_count != _x:
|
|
|
|
|
|
if f_count >= _start_add_count:
|
2021-05-20 19:23:32 +08:00
|
|
|
|
add += I72_ADD
|
2021-06-04 18:01:33 +08:00
|
|
|
|
char, code = _get_genshin_card(2, pool_name, add=add)
|
2021-05-20 19:23:32 +08:00
|
|
|
|
count = 0
|
|
|
|
|
|
# 大保底
|
2022-01-05 22:32:59 +08:00
|
|
|
|
elif f_count == _x:
|
2021-06-04 18:01:33 +08:00
|
|
|
|
char, code = _get_genshin_card(3, pool_name)
|
2021-05-20 19:23:32 +08:00
|
|
|
|
else:
|
2022-01-05 22:32:59 +08:00
|
|
|
|
if f_count >= _start_add_count:
|
2021-05-20 19:23:32 +08:00
|
|
|
|
add += I72_ADD
|
2021-06-04 18:01:33 +08:00
|
|
|
|
char, code = _get_genshin_card(pool_name=pool_name, add=add)
|
2021-05-20 19:23:32 +08:00
|
|
|
|
if code == 1:
|
|
|
|
|
|
count = 0
|
|
|
|
|
|
star_list[code] += 1
|
|
|
|
|
|
if code == 0:
|
2022-01-05 22:32:59 +08:00
|
|
|
|
if _count <= _x:
|
2021-05-20 19:23:32 +08:00
|
|
|
|
genshin_five[user_id] = f_count
|
|
|
|
|
|
add = 0.0
|
|
|
|
|
|
f_count = 0
|
|
|
|
|
|
five_list.append(char.name)
|
|
|
|
|
|
five_index_list.append(i)
|
|
|
|
|
|
try:
|
|
|
|
|
|
five_dict[char.name] += 1
|
|
|
|
|
|
except KeyError:
|
|
|
|
|
|
five_dict[char.name] = 1
|
2021-05-26 20:08:13 +08:00
|
|
|
|
char_list.append(char)
|
2022-01-05 22:32:59 +08:00
|
|
|
|
if _count <= _x:
|
2021-05-20 19:23:32 +08:00
|
|
|
|
genshin_count[user_id] = f_count
|
|
|
|
|
|
genshin_pl_count[user_id] = count
|
2021-05-26 20:08:13 +08:00
|
|
|
|
return char_list, five_list, five_index_list, five_dict, star_list
|
2021-05-20 19:23:32 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def reset_count(user_id: int):
|
|
|
|
|
|
genshin_count[user_id] = 0
|
|
|
|
|
|
genshin_pl_count[user_id] = 0
|
2021-06-04 18:01:33 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 获取up和概率
|
2021-06-24 15:32:06 +08:00
|
|
|
|
async def _genshin_init_up_char():
|
2021-06-04 18:01:33 +08:00
|
|
|
|
global _CURRENT_CHAR_POOL_TITLE, _CURRENT_ARMS_POOL_TITLE, UP_CHAR, UP_ARMS, POOL_IMG
|
2022-01-16 14:52:50 +08:00
|
|
|
|
(
|
|
|
|
|
|
_CURRENT_CHAR_POOL_TITLE,
|
|
|
|
|
|
_CURRENT_ARMS_POOL_TITLE,
|
|
|
|
|
|
POOL_IMG,
|
|
|
|
|
|
UP_CHAR,
|
|
|
|
|
|
UP_ARMS,
|
|
|
|
|
|
) = await init_up_char(announcement)
|
2021-06-04 18:01:33 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def reload_genshin_pool():
|
2021-06-24 15:32:06 +08:00
|
|
|
|
await _genshin_init_up_char()
|
2022-01-16 14:52:50 +08:00
|
|
|
|
return Message(
|
|
|
|
|
|
f"当前UP池子:{_CURRENT_CHAR_POOL_TITLE} & {_CURRENT_ARMS_POOL_TITLE} {POOL_IMG}"
|
|
|
|
|
|
)
|