diff --git a/cogs/gameplay.py b/cogs/gameplay.py index 36ea85f..9d2b884 100644 --- a/cogs/gameplay.py +++ b/cogs/gameplay.py @@ -1531,7 +1531,8 @@ class Gameplay(commands.Cog): @group_new_game.command(name='gauntlet', description='Start a new Gauntlet game against an AI') @commands.has_any_role(PD_PLAYERS_ROLE_NAME) async def new_game_gauntlet_command( - self, interaction: discord.Interaction, event_name: Literal['Taste of 2018'], sp_card_id: int): + self, interaction: discord.Interaction, event_name: Literal['Taste of 2018', 'Super Ultra Championship'], + sp_card_id: int): await interaction.response.defer() conflict = get_one_game(channel_id=interaction.channel.id, active=True) diff --git a/cogs/players.py b/cogs/players.py index 075960c..4400a3f 100644 --- a/cogs/players.py +++ b/cogs/players.py @@ -416,9 +416,9 @@ class Players(commands.Cog): @app_commands.checks.has_any_role(PD_PLAYERS_ROLE_NAME) async def player_slash_command( self, interaction: discord.Interaction, player_name: str, - cardset: Literal['All', '2008 Season', '2012 Season', '2013 Season', '2016 Season', '2018 Live', '2019 Season', - '2021 Season', '2022 Season', '2022 Promos', '2023 Season', '2023 Promos', - 'Mario Super Sluggers', 'Sams Choice'] = 'All'): + cardset: Literal['All', '2008 Season', '2012 Season', '2013 Season', '2016 Season', '2018 Season', + '2019 Season', '2021 Season', '2022 Season', '2022 Promos', '2023 Season', '2023 Promos', + 'Backyard Baseball', 'Mario Super Sluggers', 'Sams Choice'] = 'All'): # min_rarity: Literal['Replacement', 'Reserve', 'Starter', 'All-Star', 'MVP'] = None): ephemeral = False if interaction.channel.name in ['paper-dynasty-chat', 'pd-news-ticker']: @@ -913,7 +913,7 @@ class Players(commands.Cog): @group_gauntlet.command(name='start', description='Start a new Gauntlet run') @app_commands.checks.has_any_role(PD_PLAYERS_ROLE_NAME) async def gauntlet_start_command( - self, interaction: discord.Interaction, event_name: Literal['Taste of 2018']): + self, interaction: discord.Interaction, event_name: Literal['Taste of 2018', 'Super Ultra Championship']): if 'hello' not in interaction.channel.name: await interaction.response.send_message( content='The draft will probably take you about 15 minutes. Why don\'t you head to your private ' diff --git a/gauntlets.py b/gauntlets.py index d984a29..14cdd56 100644 --- a/gauntlets.py +++ b/gauntlets.py @@ -240,6 +240,11 @@ async def run_draft(interaction: discord.Interaction, main_team, this_event, dra embed_title = f'{main_team["lname"]} - {this_event["name"]} Draft' embed_description = f'{this_event["name"]}' base_params = [('cardset_id', 8), ('cardset_id', 13), ('cardset_id', 14), ('cardset_id', 15), ('limit', 8)] + elif this_event['id'] == 4: + embed_title = f'{main_team["lname"]} - {this_event["name"]} Draft' + embed_description = f'{this_event["name"]}' + base_params = [('cardset_id', 3), ('cardset_id', 4), ('cardset_id', 6), ('cardset_id', 16), + ('cardset_id', 15), ('limit', 8)] else: logging.error(f'run_draft - Event ID {this_event["id"]} not recognized') raise KeyError(f'Draft data not found for Gauntlet {this_event["id"]}') @@ -350,7 +355,7 @@ async def run_draft(interaction: discord.Interaction, main_team, this_event, dra for z in helpers.get_all_pos(y): all_str[z] += f'{name_string}\n' - if this_event['id'] == 3: + if this_event['id'] in [3, 4]: top_embed.add_field(name=f'HoFs ({counts["Hall of Fame"]}/1)', value=all_str['Hall of Fame'], inline=False) top_embed.add_field(name=f'MVPs ({counts["MVP"]}/1)', value=all_str['MVP'], inline=False) else: @@ -381,6 +386,8 @@ async def run_draft(interaction: discord.Interaction, main_team, this_event, dra last_message = await interaction.channel.send(content=None, embeds=get_embeds(include_links=False)) logging.info(f'going into draft') + backyard_round = None + custom_player_round = None if this_event['id'] == 1: mario_round = None while round_num <= 26 and counter < 50: @@ -900,6 +907,204 @@ async def run_draft(interaction: discord.Interaction, main_team, this_event, dra counts[p_choice['rarity']['name']] += 1 all_players.append(p_choice) + if p_choice['pos_1'] in ['SP', 'RP']: + counts[p_choice['pos_1']] += 1 + else: + for x in helpers.get_all_pos(p_choice): + if x in counts: + counts[x] += 1 + + # Update roster embed + round_num += 1 + await last_message.edit(content=None, embeds=get_embeds(include_links=False)) + elif this_event['id'] == 4: + while round_num <= 26 and counter < 50: + counter += 1 + params = copy.deepcopy(base_params) + + # Set rarity param based on round number + if round_num == 1: + params.extend([ + ('min_rarity', RARITY['HoF']), ('max_rarity', RARITY['HoF']) + ]) + elif round_num == 2: + params.extend([ + ('min_rarity', RARITY['All-Star']), ('max_rarity', RARITY['All-Star']) + ]) + elif round_num <= 5: + params.extend([ + ('min_rarity', RARITY['Starter']), ('max_rarity', RARITY['Starter']) + ]) + elif round_num == 6: + if random.randint(1, 2) == 1: + params = [ + ('min_rarity', RARITY['MVP']), ('max_rarity', RARITY['MVP']), ('cardset_id', 16) + ] + backyard_round = 6 + else: + params.extend([ + ('min_rarity', RARITY['MVP']), ('max_rarity', RARITY['MVP']), ('pos_exc', 'RP') + ]) + elif round_num == 7: + if random.randint(1, 2) == 1 and backyard_round is None: + params = [ + ('min_rarity', RARITY['All-Star']), ('max_rarity', RARITY['All-Star']), ('cardset_id', 16) + ] + backyard_round = 7 + else: + params.extend([ + ('min_rarity', RARITY['All-Star']), ('max_rarity', RARITY['All-Star']) + ]) + elif round_num == 8: + if backyard_round is None: + params = [ + ('min_rarity', RARITY['Starter']), ('max_rarity', RARITY['Starter']), ('cardset_id', 16) + ] + backyard_round = 8 + else: + params.extend([ + ('min_rarity', RARITY['Starter']), ('max_rarity', RARITY['Starter']) + ]) + elif round_num <= 11: + params.extend([ + ('min_rarity', RARITY['Starter']), ('max_rarity', RARITY['Starter']) + ]) + elif round_num <= 15: + params.extend([ + ('min_rarity', RARITY['Reserve']), ('max_rarity', RARITY['Reserve']) + ]) + elif round_num <= 18: + params.extend([ + ('min_rarity', RARITY['Replacement']), ('max_rarity', RARITY['Replacement']) + ]) + elif round_num == 19: + params.extend([ + ('min_rarity', RARITY['All-Star']), ('max_rarity', RARITY['All-Star']) + ]) + elif round_num <= 21: + params.extend([ + ('min_rarity', RARITY['Starter']), ('max_rarity', RARITY['Starter']) + ]) + elif round_num <= 24: + params.extend([ + ('min_rarity', RARITY['Reserve']), ('max_rarity', RARITY['Reserve']) + ]) + elif round_num <= 26: + params.extend([ + ('min_rarity', RARITY['Replacement']), ('max_rarity', RARITY['Replacement']) + ]) + + this_batch = [] + for x in ['SP', 'RP', 'IF', 'OF']: + # Slot 1 - SP + if x == 'SP': + if counts['SP'] > 5: + slot_params = [('pos_exc', 'RP')] + if counts['RP'] > 7: + slot_params = [('pos_exc', 'SP')] + else: + slot_params = [('pos_inc', 'SP')] + # if counts['SP'] > 5: + # slot_params = [('pos_exc', 'SP')] + # elif counts['RP'] < 6: + # slot_params = [('pos_inc', 'RP')] + # else: + # slot_params = [('pos_exc', 'SP'), ('pos_exc', 'RP')] + + # Slot 2 - RP + elif x == 'RP': + logging.info(f'counts[RP]: {counts["RP"]}') + if counts['RP'] > 7: + slot_params = [('pos_exc', 'RP')] + if counts['SP'] > 5: + slot_params = [('pos_exc', 'SP')] + else: + slot_params = [('pos_inc', 'RP')] + + # Slot 3 - IF + elif x == 'IF': + slot_params = [] + for y in ['1B', '2B', '3B', 'SS', 'C']: + if (counts[y] > 1) and 0 in [ + counts['C'], counts['1B'], counts['2B'], counts['3B'], counts['SS'] + ]: + slot_params.append(('pos_exc', y)) + elif (y == 'C' and counts['C'] < 3) or (y != 'C' and counts[y] < 4): + slot_params.append(('pos_inc', y)) + # if counts['C'] < 2: + # slot_params.append(('pos_inc', 'C')) + # if len(slot_params) == 0: + # slot_params = [('pos_exc', 'C'), ('pos_exc', '1B'), ('pos_exc', '2B'), ('pos_exc', '3B'), + # ('pos_exc', 'SS')] + + # Slot 4 - OF + else: + slot_params = [] + for y in ['LF', 'CF', 'RF']: + if counts[y] > 4: + slot_params.append(('pos_exc', y)) + elif counts[y] > 1 and 0 in [counts['LF'], counts['CF'], counts['RF']]: + slot_params.append(('pos_exc', y)) + elif counts[y] < 5: + slot_params.append(('pos_inc', y)) + # if len(slot_params) == 0: + # slot_params = [('pos_exc', 'LF'), ('pos_exc', 'CF'), ('pos_exc', 'RF')] + + logging.info(f'this_batch: {this_batch}') + logging.info(f'slot_params: {slot_params}') + logging.info(f'params: {params}') + + # No position explicitly requested or denied + if len(slot_params) == 0: + if (counts['SP'] + counts['RP']) > ( + counts['C'] + counts['1B'] + counts['2B'] + counts['SS'] + counts['LF'] + counts['CF'] + + counts['RF']): + pos_counts = [ + ('C', counts['C']), ('1B', counts['1B']), ('2B', counts['2B']), ('3B', counts['3B']), + ('SS', counts['SS']), ('LF', counts['LF']), ('CF', counts['CF']), ('RF', counts['RF']) + ] + pos_counts.sort(key=lambda z: z[1]) + slot_params = [('pos_inc', pos_counts[0][0])] + else: + if counts['SP'] >= counts['RP']: + slot_params = [('pos_inc', 'RP')] + else: + slot_params = [('pos_inc', 'SP')] + + slot_params.extend(params) + p_query = await db_get('players/random', params=slot_params) + + if p_query['count'] > 0: + # test_player_list = '' + # for z in p_query['players']: + # test_player_list += f'{z["rarity"]["name"]} - {z["description"]} - {helpers.get_all_pos(x)}\n' + + # Collect 1 cards with no repeat player names + for i in p_query['players']: + if i['p_name'] not in p_names and i not in this_batch: + this_batch.append(i) + break + + if len(this_batch) < 4: + logging.error(f'Pulled less than 4 players in gauntlet draft') + p_query = await db_get('players/random', params=params) + for i in p_query['players']: + if i['p_name'] not in p_names and i not in this_batch: + this_batch.append(i) + if len(this_batch) >= 4: + break + + if len(this_batch) < 4: + raise KeyError(f'This is embarassing, but I couldn\'t find enough players for you to draft from.') + + # Present choices and capture selection + p_choice = await helpers.get_choice_from_cards(interaction, this_batch, delete_message=True) + + # Add player to list and update counts + p_names.append(p_choice['p_name']) + counts[p_choice['rarity']['name']] += 1 + all_players.append(p_choice) + if p_choice['pos_1'] in ['SP', 'RP']: counts[p_choice['pos_1']] += 1 else: @@ -1044,16 +1249,29 @@ async def post_result(run_id: int, is_win: bool, this_team, bot, channel): await db_post(f'teams/{main_team["id"]}/money/{x["reward"]["money"]}') reward_string += f'- {x["reward"]["money"]}₼\n' elif x['reward']['player']: - # TODO: add give player code - pass - elif x['reward']['pack_type'] and this_event['id'] == 3: + this_pack = await db_post( + 'packs/one', + payload={ + 'team_id': main_team['id'], + 'pack_type_id': 4, + 'open_time': datetime.datetime.timestamp(datetime.datetime.now()) * 1000} + ) + await helpers.give_cards_to_team( + main_team, player_ids=x['reward']['player']['player_id'], pack_id=this_pack['id']) + reward_string += f'- {helpers.player_desc(x["reward"]["player"])}\n' + elif x['reward']['pack_type'] and this_event['id'] in [3, 4]: + if this_event['id'] == 3: + cardset_id = 13 + else: + cardset_id = 16 await db_post( 'packs', payload={'packs': [{ 'team_id': main_team['id'], 'pack_type_id': x['reward']['pack_type']['id'], - 'pack_cardset_id': 13 + 'pack_cardset_id': cardset_id }]} ) + reward_string += f'- 1x {x["reward"]["pack_type"]["name"]} Pack' elif x['reward']['pack_type']: await helpers.give_packs(main_team, 1, x['reward']['pack_type']) reward_string += f'- 1x {x["reward"]["pack_type"]["name"]} Pack'