mirror of
https://github.com/mwisnowski/mtg_python_deckbuilder.git
synced 2025-12-17 08:00:13 +01:00
Started logic for spellslinger, including storm, magecraft, and started on cantrips
This commit is contained in:
parent
856ba0f572
commit
1819104253
4 changed files with 985 additions and 487 deletions
91
settings.py
91
settings.py
|
|
@ -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']
|
||||||
|
|
|
||||||
67
setup.py
67
setup.py
|
|
@ -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)
|
||||||
|
|
||||||
|
# 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)
|
||||||
|
|
||||||
df = pd.read_csv('csv_files/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,11 +120,11 @@ 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()
|
||||||
|
|
@ -123,7 +132,7 @@ def initial_setup():
|
||||||
# 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)
|
||||||
|
|
||||||
|
|
@ -151,6 +161,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:
|
||||||
staples = []
|
staples = []
|
||||||
|
|
@ -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')
|
||||||
19
utility.py
Normal file
19
utility.py
Normal 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
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue