Started logic for spellslinger, including storm, magecraft, and started on cantrips

This commit is contained in:
mwisnowski 2024-12-12 12:27:29 -08:00
parent 856ba0f572
commit 1819104253
4 changed files with 985 additions and 487 deletions

View file

@ -1,3 +1,6 @@
artifact_tokens = ['Blood', 'Clue', 'Food', 'Gold', 'Incubator',
'Junk','Map','Powerstone', 'Treasure']
banned_cards = ['Ancestral Recall', 'Balance', 'Biorhythm', 'Black Lotus', banned_cards = ['Ancestral Recall', 'Balance', 'Biorhythm', 'Black Lotus',
'Braids, Cabal Minion', 'Chaos Orb', 'Coalition Victory', 'Braids, Cabal Minion', 'Chaos Orb', 'Coalition Victory',
'Channel', 'Dockside Extortionist', 'Emrakul, the Aeons Torn', 'Channel', 'Dockside Extortionist', 'Emrakul, the Aeons Torn',
@ -14,19 +17,55 @@ banned_cards = ['Ancestral Recall', 'Balance', 'Biorhythm', 'Black Lotus',
'Time Vault', 'Time Walk', 'Tinker', 'Tolarian Academy', 'Time Vault', 'Time Walk', 'Tinker', 'Tolarian Academy',
'Trade Secrets', 'Upheaval', 'Yawgmoth\'s Bargain'] 'Trade Secrets', 'Upheaval', 'Yawgmoth\'s Bargain']
non_creature_types = ['Legendary', 'Creature', 'Enchantment', 'Artifact', board_wipe_tags = ['destroy all', 'destroy each', 'return all', 'return each', 'deals damage to each',
'Battle', 'Sorcery', 'Instant', 'Land', '-', '', 'exile all', 'exile each', 'creatures get -X/-X', 'sacrifices all', 'sacrifices each',
'Blood', 'Clue', 'Food', 'Gold', 'Incubator', 'sacrifices the rest']
'Junk', 'Map', 'Powerstone', 'Treasure',
'Equipment', 'Fortification', 'vehicle', csv_directory = 'csv_files'
'Bobblehead', 'Attraction', 'Contraption',
'Siege', colors = ['colorless', 'white', 'blue', 'black', 'red', 'green',
'Aura', 'Background', 'Saga', 'Role', 'Shard', 'azorius', 'orzhov', 'selesnya', 'boros', 'dimir',
'Cartouche', 'Case', 'Class', 'Curse', 'Rune', 'simic', 'izzet', 'golgari', 'rakdos', 'gruul',
'Shrine', 'bant', 'esper', 'grixis', 'jund', 'naya',
'Plains', 'Island', 'Swamp', 'Forest', 'Mountain', 'abzan', 'jeskai', 'mardu', 'sultai', 'temur',
'Cave', 'Desert', 'Gate', 'Lair', 'Locus', 'Mine', 'dune', 'glint', 'ink', 'witch', 'yore', 'wubrg',
'Power-Plant', 'Sphere', 'Tower', 'Urza\'s'] 'legendary']
counter_types = ['+0/+1', '+0/+2', '+1/+0', '+1/+2', '+2/+0', '+2/+2',
'-0/-1', '-0/-2', '-1/-0', '-1/-2', '-2/-0', '-2/-2',
'Acorn', 'Aegis', 'Age', 'Aim', 'Arrow', 'Arrowhead','Awakening',
'Bait', 'Blaze', 'Blessing', 'Blight',' Blood', 'Bloddline',
'Bloodstain', 'Book', 'Bounty', 'Brain', 'Bribery', 'Brick',
'Burden', 'Cage', 'Carrion', 'Charge', 'Coin', 'Collection',
'Component', 'Contested', 'Corruption', 'CRANK!', 'Credit',
'Croak', 'Corpse', 'Crystal', 'Cube', 'Currency', 'Death',
'Defense', 'Delay', 'Depletion', 'Descent', 'Despair', 'Devotion',
'Divinity', 'Doom', 'Dream', 'Duty', 'Echo', 'Egg', 'Elixir',
'Ember', 'Energy', 'Enlightened', 'Eon', 'Eruption', 'Everything',
'Experience', 'Eyeball', 'Eyestalk', 'Fade', 'Fate', 'Feather',
'Feeding', 'Fellowship', 'Fetch', 'Filibuster', 'Finality', 'Flame',
'Flood', 'Foreshadow', 'Fungus', 'Fury', 'Fuse', 'Gem', 'Ghostform',
'Glpyh', 'Gold', 'Growth', 'Hack', 'Harmony', 'Hatching', 'Hatchling',
'Healing', 'Hit', 'Hope',' Hone', 'Hoofprint', 'Hour', 'Hourglass',
'Hunger', 'Ice', 'Imposter', 'Incarnation', 'Incubation', 'Infection',
'Influence', 'Ingenuity', 'Intel', 'Intervention', 'Invitation',
'Isolation', 'Javelin', 'Judgment', 'Keyword', 'Ki', 'Kick',
'Knickknack', 'Knowledge', 'Landmark', 'Level', 'Loot', 'Lore',
'Loyalty', 'Luck', 'Magnet', 'Manabond', 'Manifestation', 'Mannequin',
'Mask', 'Matrix', 'Memory', 'Midway', 'Mine', 'Mining', 'Mire',
'Music', 'Muster', 'Necrodermis', 'Nest', 'Net', 'Night', 'Oil',
'Omen', 'Ore', 'Page', 'Pain', 'Palliation', 'Paralyzing', 'Pause',
'Petal', 'Petrification', 'Phyresis', 'Phylatery', 'Pin', 'Plague',
'Plot', 'Point', 'Poison', 'Polyp', 'Possession', 'Pressure', 'Prey',
'Pupa', 'Quest', 'Rad', 'Rejection', 'Reprieve', 'Rev', 'Revival',
'Ribbon', 'Ritual', 'Rope', 'Rust', 'Scream', 'Scroll', 'Shell',
'Shield', 'Silver', 'Shred', 'Sleep', 'Sleight', 'Slime', 'Slumber',
'Soot', 'Soul', 'Spark', 'Spite', 'Spore', 'Stash', 'Storage',
'Story', 'Strife', 'Study', 'Stun', 'Supply', 'Suspect', 'Takeover',
'Task', 'Ticket', 'Tide', 'Time', 'Tower', 'Training', 'Trap',
'Treasure', 'Unity', 'Unlock', 'Valor', 'Velocity', 'Verse',
'Vitality', 'Void', 'Volatile', 'Vortex', 'Vow', 'Voyage', 'Wage',
'Winch', 'Wind', 'Wish']
creature_types = ['Advisor', 'Aetherborn', 'Alien', 'Ally', 'Angel', 'Antelope', 'Ape', 'Archer', 'Archon', 'Armadillo', creature_types = ['Advisor', 'Aetherborn', 'Alien', 'Ally', 'Angel', 'Antelope', 'Ape', 'Archer', 'Archon', 'Armadillo',
'Army', 'Artificer', 'Assassin', 'Assembly-Worker', 'Astartes', 'Atog', 'Aurochs', 'Automaton', 'Army', 'Artificer', 'Assassin', 'Assembly-Worker', 'Astartes', 'Atog', 'Aurochs', 'Automaton',
@ -60,6 +99,27 @@ creature_types = ['Advisor', 'Aetherborn', 'Alien', 'Ally', 'Angel', 'Antelope',
'Warlock', 'Warrior', 'Wasp', 'Weasel', 'Weird', 'Werewolf', 'Whale', 'Wizard', 'Wolf', 'Wolverine', 'Wombat', 'Warlock', 'Warrior', 'Wasp', 'Weasel', 'Weird', 'Werewolf', 'Whale', 'Wizard', 'Wolf', 'Wolverine', 'Wombat',
'Worm', 'Wraith', 'Wurm', 'Yeti', 'Zombie', 'Zubera'] 'Worm', 'Wraith', 'Wurm', 'Yeti', 'Zombie', 'Zubera']
enchantment_tokens = ['Cursed Role', 'Monster Role', 'Royal Role', 'Sorcerer Role',
'Virtuous Role', 'Wicked Role', 'Young Hero Role', 'Shard']
non_creature_types = ['Legendary', 'Creature', 'Enchantment', 'Artifact',
'Battle', 'Sorcery', 'Instant', 'Land', '-', '',
'Blood', 'Clue', 'Food', 'Gold', 'Incubator',
'Junk', 'Map', 'Powerstone', 'Treasure',
'Equipment', 'Fortification', 'vehicle',
'Bobblehead', 'Attraction', 'Contraption',
'Siege',
'Aura', 'Background', 'Saga', 'Role', 'Shard',
'Cartouche', 'Case', 'Class', 'Curse', 'Rune',
'Shrine',
'Plains', 'Island', 'Swamp', 'Forest', 'Mountain',
'Cave', 'Desert', 'Gate', 'Lair', 'Locus', 'Mine',
'Power-Plant', 'Sphere', 'Tower', 'Urza\'s']
num_to_search = ['a', 'an', 'one', '1', 'two', '2', 'three', '3', 'four','4', 'five', '5',
'six', '6', 'seven', '7', 'eight', '8', 'nine', '9', 'ten', '10',
'x','one or more']
theme_tags = ['+1/+1 counter', 'one or more counters', 'token', 'gain life', 'one or more creature tokens', theme_tags = ['+1/+1 counter', 'one or more counters', 'token', 'gain life', 'one or more creature tokens',
'creature token', 'treasure', 'create token', 'draw a card', 'flash', 'choose a creature type', 'creature token', 'treasure', 'create token', 'draw a card', 'flash', 'choose a creature type',
'play land', 'artifact you control enters', 'enchantment you control enters', 'poison counter', 'play land', 'artifact you control enters', 'enchantment you control enters', 'poison counter',
@ -70,8 +130,7 @@ theme_tags = ['+1/+1 counter', 'one or more counters', 'token', 'gain life', 'on
'control get +1/+1', 'control dies', 'experience counter', 'triggered ability', 'token', 'control get +1/+1', 'control dies', 'experience counter', 'triggered ability', 'token',
'commit a crime'] 'commit a crime']
board_wipe_tags = ['destroy all', 'destroy each', 'return all', 'return each', 'deals damage to each',
'exile all', 'exile each', 'creatures get -X/-X', 'sacrifices all', 'sacrifices each',
'sacrifices the rest']
targetted_removal_tags = ['exile target', 'destroy target', 'return target', 'shuffles target', 'you control', targetted_removal_tags = ['exile target', 'destroy target', 'return target', 'shuffles target', 'you control',
'deals damage to target', 'loses all abilities'] 'deals damage to target', 'loses all abilities']
triggers = ['when', 'whenever', 'at']

View file

@ -4,7 +4,7 @@ import pandas as pd # type: ignore
import requests # type: ignore import requests # type: ignore
import inquirer.prompt # type: ignore import inquirer.prompt # type: ignore
from settings import banned_cards from settings import banned_cards, csv_directory
colors = ['colorless', 'white', 'blue', 'black', 'green', 'red', colors = ['colorless', 'white', 'blue', 'black', 'green', 'red',
'azorius', 'orzhov', 'selesnya', 'boros', 'dimir', 'azorius', 'orzhov', 'selesnya', 'boros', 'dimir',
@ -12,6 +12,7 @@ colors = ['colorless', 'white', 'blue', 'black', 'green', 'red',
'bant', 'esper', 'grixis', 'jund', 'naya', 'bant', 'esper', 'grixis', 'jund', 'naya',
'abzan', 'jeskai', 'mardu', 'sultai', 'temur', 'abzan', 'jeskai', 'mardu', 'sultai', 'temur',
'dune', 'glint', 'ink', 'witch', 'yore', 'wubrg'] 'dune', 'glint', 'ink', 'witch', 'yore', 'wubrg']
color_abrv = ['Colorless', 'W', 'U', 'B', 'G', 'R', color_abrv = ['Colorless', 'W', 'U', 'B', 'G', 'R',
'U, W', 'B, W', 'G, W', 'R, W', 'B, U', 'U, W', 'B, W', 'G, W', 'R, W', 'B, U',
'G, U', 'R, U', 'B, G', 'B, R', 'G, R', 'G, U', 'R, U', 'B, G', 'B, R', 'G, R',
@ -51,12 +52,20 @@ def determine_legendary():
# Filter dataframe # Filter dataframe
while True: while True:
try: try:
with open('csv_files/cards.csv', 'r', encoding='utf-8'): with open(f'{csv_directory}/cards.csv', 'r', encoding='utf-8'):
print('cards.csv exists.')
break break
except FileNotFoundError: except FileNotFoundError:
initial_setup() # If the cards.csv file does not exist or can't be found, pull it from mtgjson.com
print('cards.csv not found, downloading from mtgjson')
url = 'https://mtgjson.com/api/v5/csv/cards.csv'
r = requests.get(url)
with open(f'{csv_directory}/cards.csv', 'wb') as outputfile:
outputfile.write(r.content)
df = pd.read_csv('csv_files/cards.csv', low_memory=False) # Load cards.csv file into pandas dataframe so it can be further broken down
df = pd.read_csv(f'{csv_directory}/cards.csv', low_memory=False)
legendary_options = ['Legendary Creature', 'Legendary Artifact Creature', 'Legendary Enchantment Creature'] legendary_options = ['Legendary Creature', 'Legendary Artifact Creature', 'Legendary Enchantment Creature']
filtered_df = df[df['type'].str.contains('|'.join(legendary_options))] filtered_df = df[df['type'].str.contains('|'.join(legendary_options))]
""" """
@ -80,14 +89,14 @@ def determine_legendary():
columns_to_keep = ['name', 'faceName','edhrecRank','colorIdentity', 'colors', 'manaCost', 'manaValue', 'type', 'keywords', 'text', 'power', 'toughness'] columns_to_keep = ['name', 'faceName','edhrecRank','colorIdentity', 'colors', 'manaCost', 'manaValue', 'type', 'keywords', 'text', 'power', 'toughness']
filtered_df = filtered_df[columns_to_keep] filtered_df = filtered_df[columns_to_keep]
filtered_df.sort_values(by='name', key=lambda col: col.str.lower(), inplace=True) filtered_df.sort_values(by='name', key=lambda col: col.str.lower(), inplace=True)
filtered_df.to_csv('csv_files/legendary_cards.csv', index=False) filtered_df.to_csv(f'{csv_directory}/legendary_cards.csv', index=False)
print('legendary_cards.csv file generated.') print('legendary_cards.csv file generated.')
def initial_setup(): def initial_setup():
print('Checking for cards.csv file.\n') print('Checking for cards.csv file.\n')
while True: while True:
try: try:
with open('csv_files/cards.csv', 'r', encoding='utf-8'): with open(f'{csv_directory}/cards.csv', 'r', encoding='utf-8'):
print('cards.csv exists.') print('cards.csv exists.')
break break
except FileNotFoundError: except FileNotFoundError:
@ -95,11 +104,11 @@ def initial_setup():
print('cards.csv not found, downloading from mtgjson') print('cards.csv not found, downloading from mtgjson')
url = 'https://mtgjson.com/api/v5/csv/cards.csv' url = 'https://mtgjson.com/api/v5/csv/cards.csv'
r = requests.get(url) r = requests.get(url)
with open('csv_files/cards.csv', 'wb') as outputfile: with open(f'{csv_directory}/cards.csv', 'wb') as outputfile:
outputfile.write(r.content) outputfile.write(r.content)
# Load cards.csv file into pandas dataframe so it can be further broken down # Load cards.csv file into pandas dataframe so it can be further broken down
df = pd.read_csv('csv_files/cards.csv', low_memory=False) df = pd.read_csv(f'{csv_directory}/cards.csv', low_memory=False)
# Set frames that have nothing for color identity to be 'Colorless' instead # Set frames that have nothing for color identity to be 'Colorless' instead
df['colorIdentity'] = df['colorIdentity'].fillna('Colorless') df['colorIdentity'] = df['colorIdentity'].fillna('Colorless')
@ -111,19 +120,19 @@ def initial_setup():
for i in range(len(colors), len(color_abrv)): for i in range(len(colors), len(color_abrv)):
print(f'Checking for {colors[i]}_cards.csv.') print(f'Checking for {colors[i]}_cards.csv.')
try: try:
with open(f'csv_files/{colors[i]}_cards.csv', 'r', encoding='utf-8'): with open(f'{csv_directory}/{colors[i]}_cards.csv', 'r', encoding='utf-8'):
print(f'{colors[i]}_cards.csv exists.\n') print(f'{colors[i]}_cards.csv exists.\n')
except FileNotFoundError: except FileNotFoundError:
print(f'{colors[i]}_cards.csv not found, creating one.\n') print(f'{colors[i]}_cards.csv not found, creating one.\n')
filter_by_color(df, 'colorIdentity', color_abrv[i], f'csv_files/{colors[i]}_cards.csv') filter_by_color(df, 'colorIdentity', color_abrv[i], f'{csv_directory}/{colors[i]}_cards.csv')
# Once by-color lists have been made, Determine legendary creatures # Once by-color lists have been made, Determine legendary creatures
determine_legendary() determine_legendary()
# Once Legendary creatures are determined, generate staple lists # Once Legendary creatures are determined, generate staple lists
# generate_staple_lists() # generate_staple_lists()
def regenerate_csvs(): def regenerate_csvs_all():
""" """
Pull the original cards.csv file and remake the {color}_cards.csv files. Pull the original cards.csv file and remake the {color}_cards.csv files.
This is useful if a new set has since come out to ensure the databases are up-to-date This is useful if a new set has since come out to ensure the databases are up-to-date
@ -133,6 +142,7 @@ def regenerate_csvs():
r = requests.get(url) r = requests.get(url)
with open('csv_files/cards.csv', 'wb') as outputfile: with open('csv_files/cards.csv', 'wb') as outputfile:
outputfile.write(r.content) outputfile.write(r.content)
# Load cards.csv file into pandas dataframe so it can be further broken down # Load cards.csv file into pandas dataframe so it can be further broken down
df = pd.read_csv('csv_files/cards.csv', low_memory=False) df = pd.read_csv('csv_files/cards.csv', low_memory=False)
@ -150,6 +160,35 @@ def regenerate_csvs():
# Once files are regenerated, create a new legendary list # Once files are regenerated, create a new legendary list
determine_legendary() determine_legendary()
def regenerate_csv_by_color(color):
"""
Pull the original cards.csv file and remake the {color}_cards.csv files
"""
# Determine the color_abv to use
color_abrv_index = colors.index(color)
color_abv = color_abrv[color_abrv_index]
print('Downloading cards.csv from mtgjson')
url = 'https://mtgjson.com/api/v5/csv/cards.csv'
r = requests.get(url)
with open(f'{csv_directory}/cards.csv', 'wb') as outputfile:
outputfile.write(r.content)
# Load cards.csv file into pandas dataframe so it can be further broken down
df = pd.read_csv(f'{csv_directory}/cards.csv', low_memory=False)
# Set frames that have nothing for color identity to be 'Colorless' instead
df['colorIdentity'] = df['colorIdentity'].fillna('Colorless')
# Color identity sorted cards
print(f'Regenerating {color}_cards.csv file.\n')
# Regenerate the file
print(f'Regenerating {color}_cards.csv.')
filter_by_color(df, 'colorIdentity', color_abv, f'{csv_directory}/{color}_cards.csv')
print(f'A new {color}_cards.csv file has been made.\n')
# Once files are regenerated, create a new legendary list
determine_legendary()
def generate_staple_lists(): def generate_staple_lists():
for color in colors: for color in colors:
@ -165,7 +204,7 @@ def generate_staple_lists():
except FileNotFoundError: except FileNotFoundError:
print(f'{color.capitalize()} staples file not found.') print(f'{color.capitalize()} staples file not found.')
print(f'Generating {color} staples list.') print(f'Generating {color} staples list.')
df = pd.read_csv(f'csv_files/{color}_cards.csv') df = pd.read_csv(f'{csv_directory}/{color}_cards.csv')
df['edhrecRank'] = pd.to_numeric(df['edhrecRank'], downcast='integer', errors='coerce') df['edhrecRank'] = pd.to_numeric(df['edhrecRank'], downcast='integer', errors='coerce')
df = df.dropna(subset=['edhrecRank']) df = df.dropna(subset=['edhrecRank'])
df['edhrecRank'] = df['edhrecRank'].astype(int) df['edhrecRank'] = df['edhrecRank'].astype(int)
@ -211,7 +250,7 @@ def setup():
# Regenerate CSV files # Regenerate CSV files
while choice == 'Regenerate CSV Files': while choice == 'Regenerate CSV Files':
regenerate_csvs() regenerate_csvs_all()
break break
# Go back # Go back
while choice == 'Back': while choice == 'Back':
@ -219,4 +258,4 @@ def setup():
break break
#setup() #setup()
#regenerate_csvs() #regenerate_csv_by_color('colorless')

1291
tagger.py

File diff suppressed because it is too large Load diff

19
utility.py Normal file
View file

@ -0,0 +1,19 @@
def pluralize(word):
if word.endswith('y'):
return word[:-1] + 'ies'
elif word.endswith(('s', 'sh', 'ch', 'x', 'z')):
return word + 'es'
elif word.endswith(('f')):
return word[:-1] + 'ves'
else:
return word + 's'
def sort_list(list_to_sort):
if isinstance(list_to_sort, list):
print(list_to_sort)
list_to_sort = sorted(list_to_sort)
print(list_to_sort)
return list_to_sort
else:
return list_to_sort