aboutsummaryrefslogtreecommitdiff
path: root/scripts/generate_card.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/generate_card.py')
-rwxr-xr-xscripts/generate_card.py165
1 files changed, 165 insertions, 0 deletions
diff --git a/scripts/generate_card.py b/scripts/generate_card.py
new file mode 100755
index 00000000..c11c039b
--- /dev/null
+++ b/scripts/generate_card.py
@@ -0,0 +1,165 @@
+#!/usr/bin/env python3
+import argparse
+import pathlib
+import os
+from typing import MutableMapping
+import yaml
+
+CARD_TEMPLATE = \
+"""\\documentclass{{standalone}}
+\\input{{common.tex}}
+
+\\begin{{document}}
+\\begin{{tikzpicture}}
+{0}
+\\cardborder
+\\end{{tikzpicture}}
+\\end{{document}}"""
+
+SET_SYMBOLS = {
+ 'base': 'base',
+ 'magic': 'magic',
+ 'equipments': 'equipments',
+ 'nautics': 'nautics',
+ 'misc': '',
+ 'kraken': 'kraken'
+}
+
+LATEX_ROOT = pathlib.Path(os.getcwd())
+ASSETS_DIR = LATEX_ROOT / '../assets'
+CARDS_DIR = LATEX_ROOT / 'cards'
+
+def file_for_card(card_name: str) -> pathlib.Path:
+ """Return the corresponding latex file name for a card"""
+ return pathlib.Path(f'{card_name.lower().replace(" ", "_")}.tex')
+
+def get_latex_field(card: MutableMapping, field: str) -> str:
+ """Return the latex_ prefixed field from card or the field itself"""
+ latex_field = f'latex_{field}'
+ if latex_field in card:
+ return card[latex_field]
+ else:
+ return card[field]
+
+def generate_card(card: MutableMapping):
+ """Generate a standalone tikz picture with the card data"""
+ card_content = ""
+
+ card_file = file_for_card(card['name'])
+
+ for ext in ['.jpg', '.png']:
+ image_file = ASSETS_DIR / card_file.with_suffix(ext)
+ if image_file.exists():
+ card_content += f'\\cardbackground{{{image_file.name}}}\n'
+ break
+
+ card_content += f'\cardtype{card["type"].capitalize()}{"Token" if "token" in card else ""}{{{card["name"]}}}\n'
+
+ if 'buy' in card:
+ card_content += f'\cardbuycost{{{card["buy"]}}}\n'
+
+ if card['type'] == 'unit':
+ stats = []
+ abilities = []
+ if 'ai' in card:
+ stats.append(f'AI: {card["ai"]}')
+
+ if 'health' in card:
+ stats.append(f'Health: {card["health"]}')
+
+ if 'movement' in card:
+ stats.append(f'Movement: {card["movement"]}')
+
+ attack = card.get('attack', None)
+ if attack:
+ # attack_sym = '\\faFistRaised'
+ # if "Range" in attack:
+ # attack_sym = '\\ding{246}'
+ stats.append(f'Attack: {attack}')
+
+ if 'effect' in card:
+ abilities.append(get_latex_field(card, 'effect'))
+
+ if 'full_action' in card:
+ if 'latex_full_action' in card:
+ abilities.append(f'{card["latex_full_action"]}')
+ else:
+ abilities.append(f'\\faRedo: {card["full_action"]}')
+
+ stats_str = '\\\\'.join(stats)
+ ability_block = '\\\\ \\vspace{0.2cm} '.join(abilities)
+ if stats and abilities:
+ card_content += f'\cardsplitcontent{{{stats_str}}}{{{ability_block}}}'
+ elif stats:
+ card_content += f'\cardcontent{{{stats_str}}}'
+
+ card_content += '\n'
+
+ if 'upkeep' in card:
+ card_content += f'\cardplaycost{{{card["upkeep"]}}}'
+
+ elif card['type'] in ['spell', 'artifact']:
+ effect = get_latex_field(card, 'effect')
+ print(card['effect'])
+ assert effect is not None
+ card_content += f'\cardcontent{{{effect}}}\n'
+
+ elif card['type'] == 'equipment':
+ stats = f'Durability: {card["durability"]}'
+ effect = get_latex_field(card, 'effect')
+ card_content += f'\cardsplitcontent{{{stats}}}{{{effect}}}\n'
+ else:
+ print(f'WARNING: unknown card type {card["type"]}!')
+
+ if 'play' in card:
+ card_content += f'\cardplaycost{{{card["play"]}}}\n'
+
+ if card['set'] in SET_SYMBOLS:
+ card_content += f'\cardmodule{{{SET_SYMBOLS[card["set"]]}}}'
+ else:
+ print(f'WARNING unknown set: {card["set"]}')
+
+ set_dir = CARDS_DIR / card['set']
+ if not set_dir.exists():
+ set_dir.mkdir(parents=True)
+
+ with open(set_dir / card_file, 'w') as tex_file:
+ print(CARD_TEMPLATE.format(card_content), file=tex_file)
+
+
+def main():
+ """Generate one standalone tikz picture for each card in the input data"""
+
+ parser = argparse.ArgumentParser(description='generate latex standalone cards')
+ parser.add_argument('data', help='yaml file or directory containing yaml files defining the cards to generate')
+ parser.add_argument('--latex-root', help='path to the latex root directory')
+
+ args = parser.parse_args()
+
+ if args.latex_root:
+ global LATEX_ROOT
+ LATEX_ROOT = pathlib.Path(args.latex_root)
+ global CARDS_DIR
+ CARDS_DIR = LATEX_ROOT / 'cards'
+ global ASSETS_DIR
+ ASSETS_DIR = LATEX_ROOT / '../assets'
+
+
+ data_files = [args.data]
+ data_path = pathlib.Path(args.data)
+ if data_path.is_dir():
+ data_files = data_path.glob('*.yml')
+ card_set = data_path.stem
+ else:
+ card_set = data_path.parent.stem
+
+ for f in data_files:
+ with open(f, 'r') as yaml_file:
+ card = yaml.full_load(yaml_file)
+
+ card['set'] = card_set
+ generate_card(card)
+
+
+if __name__ == '__main__':
+ main()