aboutsummaryrefslogtreecommitdiff
path: root/scripts/generate_card.py
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fl.fischer@fau.de>2021-02-28 17:01:38 +0100
committerFlorian Fischer <florian.fl.fischer@fau.de>2021-02-28 17:01:38 +0100
commit0692ccd33afc4fdd80550e9979b824c1c25e973b (patch)
tree8cf46b780af060d9fd6cf5a089729a9491eaa1c7 /scripts/generate_card.py
parent5074205584de432892de5b0543b64efde4ddd6e3 (diff)
downloadmuhqs-game-0692ccd33afc4fdd80550e9979b824c1c25e973b.tar.gz
muhqs-game-0692ccd33afc4fdd80550e9979b824c1c25e973b.zip
rework how cards are defined and generated
Card definitions are now stored in data/cards/ in a subdirectory for each set as YAML files. YAML is still human readable but stricter and better to handle in code than ini. The latex filesystem layout resembles the card definition layout and is created by the Makefile from the YAML card definitions and must not be regenerated each time by hand.
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()