Skip to content

Commit

Permalink
新增支援卡抽满破支持选择目标,#72
Browse files Browse the repository at this point in the history
  • Loading branch information
azmiao committed Jul 11, 2024
1 parent 1891910 commit f4d4471
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 33 deletions.
21 changes: 15 additions & 6 deletions uma_gacha_v2/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
from hoshino.util import DailyNumberLimiter, FreqLimiter

from .gacha_class import Gacha
from .gacha_target import set_target_config, get_current_up_id_dict, get_current_target_name_list, reset_target_config
from .gacha_target import set_target_config, get_current_up_id_dict, reset_target_config, \
query_target_config
from .update_init import auto_update
from .util import get_pool, get_img_path, generate_img, random_comment, server_list, \
switch_server, switch_pool_id, get_pool_detail
Expand Down Expand Up @@ -176,7 +177,7 @@ async def select_target_on_full(bot, ev):
@sv.on_fullmatch(('育成卡查询满破目标', '支援卡查询满破目标'), only_to_me=True)
async def query_target_on_full(bot, ev):
user_id = str(ev.user_id)
current_name_list = await get_current_target_name_list(user_id)
current_name_list = await query_target_config(user_id)
if not current_name_list:
msg = '您当前没有任何满破目标呢!'
else:
Expand Down Expand Up @@ -212,7 +213,7 @@ async def change_pool(bot, ev):
group_id = str(ev.group_id)
if not priv.check_priv(ev, priv.ADMIN):
await bot.finish(ev, '切换卡池仅限群管理员操作哦~')
pool_id = str(ev.message)
pool_id = str(ev.message).strip()
msg = await switch_pool_id(group_id, pool_id)
await bot.send(ev, msg)

Expand Down Expand Up @@ -286,13 +287,21 @@ async def full_singer_gacha(group_id, user_id, gacha_type):
return '初始卡池00000000不支持该功能哦'
gacha = Gacha(pool_id, gacha_type, server)
try:
select_chart, up_num, ten_num, exchange, first_up, result = gacha.gacha_full_singer(gacha.result,
gacha.first_up)
# 选择的目标
chart_name_list = await query_target_config(user_id)
need_dict, ten_num, exchange, first_up, result = gacha.gacha_full_singer(
gacha.result,
gacha.first_up,
chart_name_list
)
up_msg_tmp = [f'✦ 获得{str(value)}{key}' for key, value in need_dict.items()]
up_msg = '\n'.join(up_msg_tmp)
result_list = result['up'] + result['s3']
result_image = await generate_img(result_list, gacha_type)
msg_com = await random_comment(result, gacha_type, first_up, '抽满破')

msg = f'[CQ:image,file={result_image}]\n[CQ:at,qq={user_id}]\n{msg_com}\n'
msg += f'▼目标:{select_chart}\n最终获得{up_num}\n其中兑换了{exchange}\n总共花费{ten_num * 10}抽'
msg += f'{up_msg}\n✦ 其中兑换了{exchange}\n总共花费{ten_num * 10}抽'
except IndexError as _:
msg = f'卡池数据还未自动更新完全,请耐心等待几小时后再尝试'
return msg
39 changes: 24 additions & 15 deletions uma_gacha_v2/gacha_class.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import json
import os
import random
from typing import List

from hoshino import R

Expand Down Expand Up @@ -56,8 +57,8 @@ def get_pool(pool_id, server):
return pool

# 抽卡并整理数据
def sort_result(self, i: int, first_up: int, result: dict, select: str = None):
is_select = False
def sort_result(self, i: int, first_up: int, result: dict, select: List[str] = None):
select_chara = None
if i % 10:
chara, res_type = self.gacha_one(up_prob_default, s3_prob_default, s2_prob_default, s1_prob_default)
# 十连保底
Expand All @@ -67,11 +68,11 @@ def sort_result(self, i: int, first_up: int, result: dict, select: str = None):
result['up'].append(chara)
first_up = min(i, first_up)
# 想要的选择UP卡
if chara == select:
is_select = True
if select and chara in select:
select_chara = chara
else:
result[res_type].append(chara)
return first_up, result, is_select
return first_up, result, select_chara

# 单抽
def gacha_one(self, up_prob: int, s3_prob: int, s2_prob: int, s1_prob: int = None):
Expand Down Expand Up @@ -102,18 +103,26 @@ def gacha_tenjou(self, result, first_up):
first_up = 0 if first_up == 999999 else first_up
return first_up, result

# 单卡满破,即抽五张
def gacha_full_singer(self, result, first_up):
select_chart = random.choice(self.up)
up_num, ten_num, exchange = 0, -1, 0
while up_num < 5:
# 抽满破,即抽五张
def gacha_full_singer(self, result, first_up, chart_name_list):
select_chart_list = chart_name_list if chart_name_list else [random.choice(self.up)]
need_dict = {chara_name: 0 for chara_name in select_chart_list}
ten_num, exchange = -1, 0
while True:
# 检查循环退出条件,所有的值都应大于等于 5 时退出
if all(value >= 5 for value in need_dict.values()):
break
# 开始十连抽
ten_num += 1
for i in range(1, 11, 1):
k = ten_num * 10 + i
first_up, result, is_select = self.sort_result(k, first_up, result, select_chart)
if is_select:
up_num += 1
first_up, result, select_chara = self.sort_result(k, first_up, result, select_chart_list)
if select_chara:
# 抽到了某一个目标
need_dict[select_chara] += 1
if ten_num and not ten_num % (max_gacha // 10):
exchange += 1
up_num += 1
return select_chart, up_num, ten_num, exchange, first_up, result
# 抽井了给数量最少的卡兑换一张
min_key = min(need_dict, key=need_dict.get)
need_dict[min_key] += 1
return need_dict, ten_num, exchange, first_up, result
18 changes: 6 additions & 12 deletions uma_gacha_v2/gacha_target.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,15 @@ async def reset_target_config(user_id: str):
json.dump(target_config, f, ensure_ascii=False, indent=4)


# 查询目标配置
# 查询目标名称列表
async def query_target_config(user_id: str) -> list:
with open(target_path, 'r', encoding='utf-8') as f:
target_config = json.load(f)
return target_config.get(user_id, [])
_, chart_id_dict = await get_chart_name_dict()
chart_name_list = [chart_id_dict.get(key, '') for key in target_config.get(user_id, [])]
if '' in chart_name_list:
chart_name_list.remove('')
return chart_name_list


# 获取当前UP的支援卡名称列表
Expand All @@ -50,13 +54,3 @@ async def get_current_up_id_dict(group_id) -> dict:
chart_name_dict, _ = await get_chart_name_dict()
chart_up_id_dict = {chart_name_dict.get(value, ''): value for value in current_up_name}
return chart_up_id_dict


# 获取当前用户设置的目标名称列表
async def get_current_target_name_list(user_id: str):
target_id_list = await query_target_config(user_id)
_, chart_id_dict = await get_chart_name_dict()
current_name_list = [chart_id_dict.get(x, '') for x in target_id_list]
if '' in current_name_list:
current_name_list.remove('')
return current_name_list
15 changes: 15 additions & 0 deletions uma_gacha_v2/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,12 @@ async def update_select_data():
with open(select_data_path, 'r', encoding='utf-8') as f:
select_data = json.load(f)
# 修改默认池子的ID
old_pool_id = select_data['default']['pool_id']
server_default = select_data['default']['server']
pool_id_default = await get_new_pool_id(server_default)
if old_pool_id != pool_id_default:
# 新ID和旧ID不一致 | 需要重置目标选择
await reset_all_target()
select_data['default']['pool_id'] = pool_id_default
# 修改分群的池子的ID
group_list = list(select_data['group'].keys())
Expand All @@ -123,10 +127,19 @@ async def update_select_data():
},
'group': {}
}
# 首次使用需要创建目标选择文件
await reset_all_target()
with open(select_data_path, 'w', encoding='utf-8') as f:
json.dump(select_data, f, ensure_ascii=False, indent=4)


# 重置所有目标选择
async def reset_all_target():
target_path = os.path.join(os.path.dirname(__file__), 'gacha_target.json')
with open(target_path, 'w', encoding='utf-8') as f:
json.dump({}, f, ensure_ascii=False, indent=4)


# 获取当前群使用的卡池
# 返回:服务器, 池子ID
async def get_pool(group_id: str):
Expand Down Expand Up @@ -222,6 +235,7 @@ async def switch_server(group_id, server):
select_data['group'][group_id] = group_data
with open(select_data_path, 'w', encoding='utf-8') as f:
json.dump(select_data, f, ensure_ascii=False, indent=4)
await reset_all_target()
msg = f'本群已成功切换到服务器{server},并默认选取该服务器最新卡池'
if server == 'bili':
msg = f'本群已成功切换到服务器{server},但由于目前暂未开服,仅提供开服卡池供娱乐,开服后会自动同步'
Expand Down Expand Up @@ -253,6 +267,7 @@ async def switch_pool_id(group_id, pool_id):
select_data['group'][group_id] = group_data
with open(select_data_path, 'w', encoding='utf-8') as f:
json.dump(select_data, f, ensure_ascii=False, indent=4)
await reset_all_target()
return f'本群已成功切换到{now_server}服的卡池{pool_id}'


Expand Down

0 comments on commit f4d4471

Please sign in to comment.