From 0692ccd33afc4fdd80550e9979b824c1c25e973b Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Sun, 28 Feb 2021 17:01:38 +0100 Subject: 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. --- scripts/generate_card.py | 165 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100755 scripts/generate_card.py (limited to 'scripts/generate_card.py') 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() -- cgit v1.2.3