paper-dynasty-card-creation/scripts/legacy/card_output.py
Cal Corum 0a17745389 Run black and ruff across entire codebase
Standardize formatting with black and apply ruff auto-fixes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 14:24:33 -05:00

721 lines
23 KiB
Python

import asyncio
import datetime
import pathlib
import sys
from db_calls_card_creation import *
from creation_helpers import (
get_position_string,
write_to_csv,
ordered_positions,
defense_rg,
ordered_pitching_positions,
)
from exceptions import logger
def get_batter_rarity(total_ops):
if total_ops < 0.7:
return "Replacement"
elif total_ops < 0.8:
return "Reserve"
elif total_ops < 0.9:
return "Starter"
elif total_ops < 1:
return "All-Star"
elif total_ops < 1.2:
return "MVP"
else:
return "HoF"
def get_pitcher_rarity(total_ops, s_rat):
if s_rat > 3:
if total_ops <= 0.4:
return "HoF"
elif total_ops <= 0.475:
return "MVP"
elif total_ops <= 0.53:
return "All-Star"
elif total_ops <= 0.6:
return "Starter"
elif total_ops <= 0.675:
return "Reserve"
else:
return "Replacement"
else:
if total_ops <= 0.325:
return "HoF"
elif total_ops <= 0.4:
return "MVP"
elif total_ops <= 0.475:
return "All-Star"
elif total_ops <= 0.55:
return "Starter"
elif total_ops <= 0.625:
return "Reserve"
else:
return "Replacement"
async def main(argv):
cardset_name = input("What is the name of this Cardset? ")
cardset = ScoutCardset.get_or_none(
fn.Lower(ScoutCardset.set_title) == cardset_name.lower()
)
if not cardset:
print(f"There is no cardset named **{cardset_name}**.")
return
else:
print(f"Got it! Starting on the {cardset.set_title} cardset.")
now = datetime.datetime.now()
output_path = pathlib.Path(f"card-output/{cardset.set_title} Cardset/")
if not output_path.exists():
output_path.mkdir(parents=True, exist_ok=True)
all_players = ScoutPlayer.select()
batter_output = [
[
"name",
"hand",
"rarity",
"pos",
"stealing",
"bunt",
"hnr",
"running",
"vl-2d6-1",
"vl-results-1",
"vl-splits-1",
"vl-2d6-2",
"vl-results-2",
"vl-splits-2",
"vl-2d6-3",
"vl-results-3",
"vl-splits-3",
"vr-2d6-1",
"vr-results-1",
"vr-splits-1",
"vr-2d6-2",
"vr-results-2",
"vr-splits-2",
"vr-2d6-3",
"vr-results-3",
"vr-splits-3",
]
]
batter_rg_output = [
[
"sba_id",
"cardset_id",
"player_name",
"hand",
"vl_hr",
"vl_bphr",
"vl_tr",
"vl_do3",
"vl_do2",
"vl_doP",
"vl_si2",
"vl_si1",
"vl_siC",
"vl_bpsi",
"vl_hbp",
"vl_bb",
"vl_k",
"vl_lo",
"vl_po",
"vl_flya",
"vl_flybq",
"vl_flylfb",
"vl_flyrfb",
"vl_gba",
"vl_gbb",
"vl_gbc",
"vr_hr",
"vr_bphr",
"vr_tr",
"vr_do3",
"vr_do2",
"vr_doP",
"vr_si2",
"vr_si1",
"vr_siC",
"vr_bpsi",
"vr_hbp",
"vr_bb",
"vr_k",
"vr_lo",
"vr_po",
"vr_flya",
"vr_flybq",
"vr_flylfb",
"vr_flyrfb",
"vr_gba",
"vr_gbb",
"vr_gbc",
"running",
"steal-high",
"steal-low",
"auto-jump",
"jump_pct",
"mlbteam",
"rarity",
]
]
baserunning_output = [["name", "running", "st-high", "st-low", "auto-jump", "jump"]]
pitcher_output = [
[
"name",
"hand",
"rarity",
"starter",
"reliever",
"closer",
"hold",
"batting",
"balk",
"wp",
"defense",
"vl-2d6-1",
"vl-results-1",
"vl-splits-1",
"vl-2d6-2",
"vl-results-2",
"vl-splits-2",
"vl-2d6-3",
"vl-results-3",
"vl-splits-3",
"vr-2d6-1",
"vr-results-1",
"vr-splits-1",
"vr-2d6-2",
"vr-results-2",
"vr-splits-2",
"vr-2d6-3",
"vr-results-3",
"vr-splits-3",
]
]
pitcher_peripherals_output = [
["name", "starter", "reliever", "closer", "hold", "balk", "wp"]
]
pitcher_rg_output = [
[
"sba-id",
"cardset-id",
"player-name",
"hand",
"hr-vL",
"bp-hr-vL",
"tr-vL",
"do***-vL",
"do**-vL",
"do-cf-vL",
"si**-vL",
"si*-vL",
"si-cf-vL",
"bp-si-vL",
"hbp-vL",
"bb-vL",
"so-vL",
"fo-b-cf-vL",
"fo-b-slap-vL",
"gb-a-vL",
"gb-c-vL",
"gb-x-p-vL",
"gb-x-c-vL",
"gb-x-1b-vL",
"gb-x-2b-vL",
"gb-x-3b-vL",
"gb-x-ss-vL",
"gb-x-lf-vL",
"gb-x-cf-vL",
"gb-x-rf-vL",
"hr-vR",
"bp-hr-vR",
"tr-vR",
"do***-vR",
"do**-vR",
"do-cf-vR",
"si**-vR",
"si*-vR",
"si-cf-vR",
"bp-si-vR",
"hbp-vR",
"bb-vR",
"so-vR",
"fo-b-cf-vR",
"fo-b-slap-vR",
"gb-a-vR",
"gb-c-vR",
"gb-x-p-vR",
"gb-x-c-vR",
"gb-x-1b-vR",
"gb-x-2b-vR",
"gb-x-3b-vR",
"gb-x-ss-vR",
"gb-x-lf-vR",
"gb-x-cf-vR",
"gb-x-rf-vR",
]
]
player_json_output = [
[
"sba-id",
"name",
"",
"fg-id",
"bbref-id",
"",
"",
"",
"cardset-id",
"rarity",
"",
"pos_1",
"pos_2",
"pos_3",
]
]
defense_rg_output = [
[
"full name",
"p-rat",
"c-rat",
"1b-rat",
"2b-rat",
"3b-rat",
"ss-rat",
"lf-rat",
"cf-rat",
"rf-rat",
"p-e",
"c-e",
"1b-e",
"2b-e",
"3b-e",
"ss-e",
"lf-e",
"cf-e",
"rf-e",
"of-arm",
"c-arm",
"c-throw",
"c-pb",
"p-wp",
"p-bk",
]
]
for player in all_players:
valid_player = False
b_lines = CardColumns.select().where(
CardColumns.b_ratings.is_null(False)
& (CardColumns.player == player)
& CardColumns.b_ratings.endswith(f"{cardset.id}")
)
this_output = [player.name, player.hand]
if b_lines.count() == 2:
print(f"Found batting lines for {player.name}...")
vl_line = None
vr_line = None
for line in b_lines:
this_columns = [
line.one_dice,
line.one_results,
line.one_splits,
line.two_dice,
line.two_results,
line.two_splits,
line.three_dice,
line.three_results,
line.three_splits,
]
if "vL" in line.b_ratings.id:
vl_line = this_columns
else:
vr_line = this_columns
vl_ratings = BatterRatings.get_or_none(
BatterRatings.player == player,
BatterRatings.cardset == cardset,
BatterRatings.vs_hand == "vL",
BatterRatings.is_prep == 0,
)
vr_ratings = BatterRatings.get_or_none(
BatterRatings.player == player,
BatterRatings.cardset == cardset,
BatterRatings.vs_hand == "vR",
BatterRatings.is_prep == 0,
)
# Calculate rarity
ops_vl = vl_ratings.obp + vl_ratings.slg
ops_vr = vr_ratings.obp + vr_ratings.slg
total_ops = (ops_vl + ops_vr + min(ops_vl, ops_vr)) / 3
rarity = get_batter_rarity(total_ops)
logger.info(
f"player: {player.name} / ops_vl: {ops_vl} / ops_vr: {ops_vr} / total_ops: {total_ops}"
)
this_json = [
player.sba_id,
player.name,
None,
player.fg_id,
player.br_id,
None,
None,
None,
cardset.id,
rarity,
None,
]
this_output.append(rarity)
this_batter_rg = [
player.sba_id,
cardset.id,
player.name,
player.hand,
vl_ratings.homerun,
vl_ratings.bp_homerun,
vl_ratings.triple,
vl_ratings.double_three,
vl_ratings.double_two,
vl_ratings.double_pull,
vl_ratings.single_two,
vl_ratings.single_one,
vl_ratings.single_center,
vl_ratings.bp_single,
vl_ratings.hbp,
vl_ratings.walk,
vl_ratings.strikeout,
vl_ratings.lineout,
vl_ratings.popout,
vl_ratings.flyout_a,
vl_ratings.flyout_bq,
vl_ratings.flyout_lf_b,
vl_ratings.flyout_rf_b,
vl_ratings.groundout_a,
vl_ratings.groundout_b,
vl_ratings.groundout_c,
vr_ratings.homerun,
vr_ratings.bp_homerun,
vr_ratings.triple,
vr_ratings.double_three,
vr_ratings.double_two,
vr_ratings.double_pull,
vr_ratings.single_two,
vr_ratings.single_one,
vr_ratings.single_center,
vr_ratings.bp_single,
vr_ratings.hbp,
vr_ratings.walk,
vr_ratings.strikeout,
vr_ratings.lineout,
vr_ratings.popout,
vr_ratings.flyout_a,
vr_ratings.flyout_bq,
vr_ratings.flyout_lf_b,
vr_ratings.flyout_rf_b,
vr_ratings.groundout_a,
vr_ratings.groundout_b,
vr_ratings.groundout_c,
]
all_positions = Position.select().where(
(Position.player == player) & (Position.cardset == cardset)
)
if all_positions.count() > 0:
print(f"Found {all_positions.count()} positions for {player.name}...")
pos_list = [x for x in all_positions]
position_string = get_position_string(pos_list, inc_p=False)
else:
pos_list = []
position_string = "dh"
this_json.extend(ordered_positions(pos_list))
player_json_output.append(this_json)
valid_player = True
this_batter_data = BatterData.get_or_none(
BatterData.player == player, BatterData.cardset == cardset
)
if this_batter_data:
print(f"Found batter data for {player.name}...")
baserunning_output.append(
[
player.name,
this_batter_data.running,
this_batter_data.st_high,
this_batter_data.st_low,
"Y" if this_batter_data.st_auto else "N",
this_batter_data.st_jump,
]
)
this_batter_rg.extend(
[
this_batter_data.running,
this_batter_data.st_high,
this_batter_data.st_low,
"Y" if this_batter_data.st_auto else "N",
this_batter_data.st_jump,
rarity,
]
)
batter_rg_output.append(this_batter_rg)
this_output.extend(
[
position_string,
this_batter_data.stealing,
this_batter_data.bunting,
this_batter_data.hit_and_run,
this_batter_data.running,
]
)
this_output.extend(vl_line)
this_output.extend(vr_line)
batter_output.append(this_output)
p_lines = CardColumns.select().where(
CardColumns.p_ratings.is_null(False)
& (CardColumns.player == player)
& CardColumns.p_ratings.endswith(f"{cardset.id}")
)
# if p_lines.count() > 0:
# print(f'player: {player.name}')
# print(f'p_lines ({p_lines.count()}): {p_lines}')
this_output = [player.name, player.hand]
if p_lines.count() == 2:
print(f"Found pitching lines for {player.name}...")
vr_line = None
vl_line = None
for line in p_lines:
this_columns = [
line.one_dice,
line.one_results,
line.one_splits,
line.two_dice,
line.two_results,
line.two_splits,
line.three_dice,
line.three_results,
line.three_splits,
]
if "vL" in line.p_ratings.id:
vl_line = this_columns
else:
vr_line = this_columns
if vr_line is not None and vl_line is not None:
this_data = PitcherData.get_or_none(
PitcherData.player == player, PitcherData.cardset_id == cardset.id
)
if this_data:
print(f"Found pitcher data for {player.name}...")
pitcher_peripherals_output.append(
[
player.name,
this_data.starter_rating,
this_data.relief_rating,
this_data.closer_rating,
this_data.hold,
this_data.wild_pitch,
this_data.balk,
]
)
vl_ratings = PitcherRatings.get_or_none(
PitcherRatings.player == player,
PitcherRatings.cardset == cardset,
PitcherRatings.vs_hand == "vL",
PitcherRatings.is_prep == 0,
)
vr_ratings = PitcherRatings.get_or_none(
PitcherRatings.player == player,
PitcherRatings.cardset == cardset,
PitcherRatings.vs_hand == "vR",
PitcherRatings.is_prep == 0,
)
# Calculate rarity
ops_vl = vl_ratings.obp + vl_ratings.slg
ops_vr = vr_ratings.obp + vr_ratings.slg
total_ops = (ops_vl + ops_vr + min(ops_vl, ops_vr)) / 3
rarity = get_pitcher_rarity(total_ops, this_data.starter_rating)
logger.info(
f"player: {player.name} / ops_vl: {ops_vl} / ops_vr: {ops_vr} / total_ops: {total_ops}"
)
this_json = [
player.sba_id,
player.name,
None,
player.fg_id,
player.br_id,
None,
None,
None,
cardset.id,
rarity,
None,
]
this_output.extend(
[
rarity,
this_data.starter_rating,
this_data.relief_rating,
this_data.closer_rating,
this_data.hold,
this_data.batting,
this_data.balk,
this_data.wild_pitch,
]
)
pitcher_rg_output.append(
[
player.sba_id,
cardset.id,
player.name,
player.hand,
vl_ratings.homerun,
vl_ratings.bp_homerun,
vl_ratings.triple,
vl_ratings.double_three,
vl_ratings.double_two,
vl_ratings.double_cf,
vl_ratings.single_two,
vl_ratings.single_one,
vl_ratings.single_center,
vl_ratings.bp_single,
vl_ratings.hbp,
vl_ratings.walk,
vl_ratings.strikeout,
vl_ratings.fo_center,
vl_ratings.fo_slap,
vl_ratings.groundout_a,
vl_ratings.groundout_b,
vl_ratings.xcheck_p,
vl_ratings.xcheck_c,
vl_ratings.xcheck_1b,
vl_ratings.xcheck_2b,
vl_ratings.xcheck_3b,
vl_ratings.xcheck_ss,
vl_ratings.xcheck_lf,
vl_ratings.xcheck_cf,
vl_ratings.xcheck_rf,
vr_ratings.homerun,
vr_ratings.bp_homerun,
vr_ratings.triple,
vr_ratings.double_three,
vr_ratings.double_two,
vr_ratings.double_cf,
vr_ratings.single_two,
vr_ratings.single_one,
vr_ratings.single_center,
vr_ratings.bp_single,
vr_ratings.hbp,
vr_ratings.walk,
vr_ratings.strikeout,
vr_ratings.fo_center,
vr_ratings.fo_slap,
vr_ratings.groundout_a,
vr_ratings.groundout_b,
vr_ratings.xcheck_p,
vr_ratings.xcheck_c,
vr_ratings.xcheck_1b,
vr_ratings.xcheck_2b,
vr_ratings.xcheck_3b,
vr_ratings.xcheck_ss,
vr_ratings.xcheck_lf,
vr_ratings.xcheck_cf,
vr_ratings.xcheck_rf,
this_data.starter_rating,
this_data.relief_rating,
this_data.closer_rating,
this_data.hold,
this_data.wild_pitch,
this_data.balk,
rarity,
]
)
p_def = Position.get_or_none(
(Position.player == player)
& (Position.cardset_id == cardset.id)
& (Position.position == "P")
)
if p_def:
print(f"Found pitcher defense for {player.name}...")
this_output.append(f"p-{p_def.range}e{p_def.error}")
this_output.extend(vl_line)
this_output.extend(vr_line)
pitcher_output.append(this_output)
all_p_def = Position.select().where(
(
(Position.player == player)
& (Position.cardset == cardset)
)
& (
(Position.position == "SP")
| (Position.position == "RP")
| (Position.position == "CP")
)
)
print(
f"Found {all_p_def.count()} positions for {player.name}..."
)
pos_list = [x for x in all_p_def]
ordered_roles = ordered_pitching_positions(pos_list)
this_json.extend(ordered_roles)
player_json_output.append(this_json)
valid_player = True
all_pos = Position.select().where(
(Position.player == player) & (Position.cardset == cardset)
)
if all_pos.count() > 0 and valid_player:
this_data = [player.name]
this_data.extend(defense_rg(all_pos))
defense_rg_output.append(this_data)
print(f"Done processing players; outputting to {output_path}")
write_to_csv(
output_path, f'batter-card-output-{now.strftime("%Y-%m-%d-%f")}', batter_output
)
write_to_csv(
output_path, f'batter-rg-output-{now.strftime("%Y-%m-%d-%f")}', batter_rg_output
)
write_to_csv(
output_path,
f'pitcher-card-output-{now.strftime("%Y-%m-%d-%f")}',
pitcher_output,
)
write_to_csv(
output_path,
f'pitcher-rg-output-{now.strftime("%Y-%m-%d-%f")}',
pitcher_rg_output,
)
write_to_csv(
output_path, f'player-json-{now.strftime("%Y-%m-%d-%f")}', player_json_output
)
write_to_csv(
output_path, f'defense-rg-{now.strftime("%Y-%m-%d-%f")}', defense_rg_output
)
print("All done!")
if __name__ == "__main__":
asyncio.run(main(sys.argv[1:]))