From 1a8f758e84b672e10852a0b138aec5216bbc9432 Mon Sep 17 00:00:00 2001 From: Cal Corum Date: Fri, 19 Jul 2024 16:03:05 -0500 Subject: [PATCH] Add /running-calcs --- cogs/players.py | 184 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) diff --git a/cogs/players.py b/cogs/players.py index 2310606..7575c7c 100644 --- a/cogs/players.py +++ b/cogs/players.py @@ -2407,6 +2407,190 @@ class Players(commands.Cog): # } # self.rolls.append(this_roll) + group_running_calcs = app_commands.Group( + name='running-calcs', + description='Let Domo do the math for your runner advancement' + ) + + @group_running_calcs.command(name='fly-b', description='Tag play from second base') + @app_commands.rename( + this_of='which-outfielder', + speed='runner-speed', + arm='outfielder-arm' + ) + @commands.has_any_role(SBA_PLAYERS_ROLE_NAME, PD_PLAYERS_ROLE_NAME) + async def running_calcs_flyb( + self, interaction: discord.Interaction, this_of: Literal['LF', 'CF', 'RF'], speed: int, arm: int): + await interaction.response.defer() + + max_safe = speed + arm + min_out = 20 + arm + if this_of == 'RF': + max_safe += 2 + min_out += 2 + elif this_of == 'LF': + max_safe -= 2 + min_out -= 2 + + if max_safe >= 20: + max_safe = 19 + min_out = 21 + + safe_range = f'1' + if max_safe > 1: + safe_range += f' - {max_safe}' + + out_range = 'None' + if min_out <= 20: + out_range = f'{min_out}' + if min_out < 20: + out_range += ' - 20' + + if max_safe >= 20: + hold_range = '20' + elif (max_safe + 1) < min_out: + hold_range = f'{max_safe + 1}' + if (max_safe + 2) < min_out: + hold_range += f' - {min_out - 1}' + else: + hold_range = 'None' + + tag_embed = get_team_embed('Flyball B Running') + tag_embed.add_field(name='Safe Range', value=safe_range) + tag_embed.add_field(name='Hold Range', value=hold_range) + tag_embed.add_field(name='Out Range', value=out_range) + + await interaction.edit_original_response(content=None, embed=tag_embed) + + def play_at_home(self, speed: int, arm: int): + max_safe = speed + arm + + safe_range = f'1' + if max_safe >= 19: + safe_range += ' - 18' + catcher_range = '19 - 20' + out_range = 'None' + elif max_safe == 18: + safe_range += ' - 17' + catcher_range = '18 - 19' + out_range = '20' + elif max_safe > 2: + safe_range += f' - {max_safe - 1}' + catcher_range = f'{max_safe} - {max_safe + 1}' + out_range = f'{max_safe + 2} - 20' + elif max_safe == 2: + safe_range = '1' + catcher_range = f'2 - 3' + out_range = '4 - 20' + else: + safe_range = 'None' + catcher_range = f'1 - 2' + out_range = '3 - 20' + + return { + 'safe_range': safe_range, + 'catcher_range': catcher_range, + 'out_range': out_range + } + + @group_running_calcs.command(name='fly-bq', description='Tag play from third base') + @app_commands.rename( + speed='runner-speed', + arm='outfielder-arm' + ) + @commands.has_any_role(SBA_PLAYERS_ROLE_NAME, PD_PLAYERS_ROLE_NAME) + async def running_calcs_flybq( + self, interaction: discord.Interaction, speed: int, arm: int): + await interaction.response.defer() + + data = self.play_at_home(speed + 2, arm) + + tag_embed = get_team_embed('Flyball B? Running') + tag_embed.add_field(name='Safe Range', value=data['safe_range']) + tag_embed.add_field(name='Block Plate Range', value=data['catcher_range']) + tag_embed.add_field(name='Out Range', value=data['out_range']) + + await interaction.edit_original_response(content=None, embed=tag_embed) + + @group_running_calcs.command(name='advance', description='Runner advancing on uncapped hit') + @app_commands.rename( + this_of='which-outfielder', + speed='runner-speed', + arm='outfielder-arm', + outs='starting-outs', + held='was-runner-held' + ) + @commands.has_any_role(SBA_PLAYERS_ROLE_NAME, PD_PLAYERS_ROLE_NAME) + async def running_calcs_advance( + self, interaction: discord.Interaction, this_of: Literal['LF', 'CF', 'RF'], speed: int, arm: int, + play_type: Literal['lead-runner', 'cutoff-play'], + to_base: Literal['Second Base', 'Third Base', 'Home Plate', 'Fifth Base'], outs: int, held: bool = False): + if to_base == 'Fifth Base': + await interaction.response.send_message(content=random_gif('why are you like this')) + return + + await interaction.response.defer() + + if to_base == 'Home Plate': + if outs == 2: + speed += 2 + + if not held: + speed += 1 + elif held: + speed -= 1 + + data = self.play_at_home(speed, arm) + + tag_embed = get_team_embed('Play at the Plate') + tag_embed.add_field(name='Safe Range', value=data['safe_range']) + tag_embed.add_field(name='Block Plate Range', value=data['catcher_range']) + tag_embed.add_field(name='Out Range', value=data['out_range']) + + await interaction.edit_original_response(content=None, embed=tag_embed) + return + + max_safe = speed + arm + if to_base == 'Third Base' and this_of == 'RF': + max_safe += 2 + elif to_base == 'Third Base' and this_of == 'LF': + max_safe -= 2 + + if play_type == 'cutoff-play': + max_safe -= 5 + elif play_type == 'lead-runner': + if outs == 2: + max_safe += 2 + + if not held: + max_safe += 1 + elif held: + max_safe -= 1 + + if max_safe > 20: + max_safe = 19 + elif max_safe < 1: + max_safe = 1 + + if max_safe == 20: + safe_range = '1 - 20' + out_range = 'None' + elif max_safe == 19: + safe_range = f'1 - 19' + out_range = '20' + elif max_safe == 1: + safe_range = '1' + out_range = '2 - 20' + else: + safe_range = f'1 - {max_safe}' + out_range = f'{max_safe + 1} - 20' + + run_embed = get_team_embed(f'Play at {to_base}') + run_embed.add_field(name='Safe Range', value=safe_range) + run_embed.add_field(name='Out Range', value=out_range) + await interaction.edit_original_response(content=None, embed=run_embed) + + @app_commands.command(name='sba-update-player', description='Crowd-sourcing player updates') # @app_commands.guilds(discord.Object(id=os.environ.get('GUILD_ID'))) async def update_player_slash(