diff options
| -rw-r--r-- | data/decks/approach.deck | 11 | ||||
| -rw-r--r-- | data/decks/recruiter_rush.deck | 12 | ||||
| -rw-r--r-- | data/decks/spell_slinger.deck | 12 | ||||
| -rw-r--r-- | latex/Makefile | 35 | ||||
| -rw-r--r-- | latex/decks/de/approach.tex | 26 | ||||
| -rw-r--r-- | latex/decks/de/recruter_rush.tex | 26 | ||||
| -rw-r--r-- | latex/decks/de/spell_slinger.tex | 28 | ||||
| -rw-r--r-- | latex/decks/en/approach.tex | 26 | ||||
| -rw-r--r-- | latex/decks/en/recruter_rush.tex | 26 | ||||
| -rw-r--r-- | latex/decks/en/spell_slinger.tex | 28 | ||||
| -rwxr-xr-x | scripts/generate_deck.py | 94 |
11 files changed, 319 insertions, 5 deletions
diff --git a/data/decks/approach.deck b/data/decks/approach.deck new file mode 100644 index 00000000..cfb0061a --- /dev/null +++ b/data/decks/approach.deck @@ -0,0 +1,11 @@ +2 Catalyst +1 Approach Supremancy! +2 Ritual! +2 Conscription! +1 Power To The People! +2 Recycle! +1 Illusionist +1 Discount! +1 Select! +1 No! +1 Die! diff --git a/data/decks/recruiter_rush.deck b/data/decks/recruiter_rush.deck new file mode 100644 index 00000000..660cc91f --- /dev/null +++ b/data/decks/recruiter_rush.deck @@ -0,0 +1,12 @@ +2 Tax Collector +2 Sword +1 Power to the People! +2 Backup! +1 Recruiter +1 Banner +1 Depression Monument +1 Stasis Orb +1 Pierce! +1 Rush! +1 Shatter! +1 No! diff --git a/data/decks/spell_slinger.deck b/data/decks/spell_slinger.deck new file mode 100644 index 00000000..a28a5aa5 --- /dev/null +++ b/data/decks/spell_slinger.deck @@ -0,0 +1,12 @@ +2 Catalyst +2 Ritual! +2 Die! +2 Mine! +2 More! +1 No! +1 Select! +1 Isolate! +1 Pierce! +1 Attack! +1 Appear! +1 Fighter diff --git a/latex/Makefile b/latex/Makefile index ec482628..708b9f38 100644 --- a/latex/Makefile +++ b/latex/Makefile @@ -32,6 +32,9 @@ PDFLATEX_ENV := TEXINPUTS=".:$(ASSETS_PATH):" GENERATE_CARD := $(GAME_ROOT)/scripts/generate_card.py GENERATE_CARD_FLAGS := --language=$(LANGUAGE) +GENERATE_DECK := $(GAME_ROOT)/scripts/generate_deck.py +GENERATE_DECK_FLAGS := --language=$(LANGUAGE) + SETS := $(shell find $(CARDS_YML_DIR) -mindepth 1 -type d -printf "%f\n") SETS_SOURCEDIRS := $(foreach set, $(SETS), $(addprefix $(CARDS_YML_DIR)/, $(set))) @@ -44,8 +47,18 @@ SETS_TEX := $(foreach set, $(SETS), $(addprefix $(SETS_TEX_DIR)/, $(set).tex)) SETS_PDF_DIR := $(BUILDDIR) SETS_PDF := $(foreach set, $(SETS), $(addprefix $(SETS_PDF_DIR)/, $(set).pdf)) +DECKS_SOURCEDIR := $(DATA_ROOT)/decks +DECKS := $(shell find $(DECKS_SOURCEDIR) -mindepth 1 -type f -name "*.deck" -printf "%f\n") +DECKS := $(foreach deck, $(DECKS), $(subst .deck,,$(deck))) + +DECKS_TEX_DIR := $(LATEX_ROOT)/decks/$(LANGUAGE) +DECKS_TEX := $(foreach deck, $(DECKS), $(addprefix $(DECKS_TEX_DIR)/, $(deck).tex)) + +DECKS_PDF_DIR := $(BUILDDIR)/decks +DECKS_PDF := $(foreach deck, $(DECKS), $(addprefix $(DECKS_PDF_DIR)/, $(deck).pdf)) + # Add all dirs to VPATH where we generate or store dependencies -VPATH = $(SETS_SOURCEDIRS) $(SETS_TEXDIRS) $(SETS_TEX_DIR) $(CARDS_TEX_DIR) +VPATH = $(SETS_SOURCEDIRS) $(SETS_TEXDIRS) $(SETS_TEX_DIR) $(DECKS_SOURCEDIR) $(DECKS_TEX_DIR) $(CARDS_TEX_DIR) # Create a list of yaml card definitions CARDS_YML := $(foreach dir,$(SETS_SOURCEDIRS),$(wildcard $(dir)/*.yml)) @@ -84,11 +97,16 @@ endef # Generate set tex rules $(foreach set, $(SETS), $(eval $(call generateSetTexRules,$(set)))) +$(DECKS_TEX_DIR)/%.tex: $(DECKS_SOURCEDIR)/%.deck $(GENERATE_DECK) + @echo generating $@ + @if test \( ! \( -d $(@D) \) \) ;then mkdir -p $(@D);fi + $(VERBOSE) $(GENERATE_DECK) $(GENERATE_DECK_FLAGS) $< > $@ + define generateCardTexRules $(1)/%.tex: %.yml $(GENERATE_CARD) @echo building $$@ @if test \( ! \( -d $$(@D) \) \) ;then mkdir -p $$(@D);fi - $(VERBOSE)$(GENERATE_CARD) $(GENERATE_CARD_FLAGS) $$< > $$@ + $(VERBOSE) $(GENERATE_CARD) $(GENERATE_CARD_FLAGS) $$< > $$@ endef # Generate cards tex rules @@ -98,13 +116,15 @@ define generatePdfRules $(1)/%.pdf: %.tex $(COMMON_TEX_FILES) $(MAKEFILE_LIST) @echo building $$@ @if test \( ! \( -d $$(@D) \) \) ;then mkdir -p $$(@D);fi - $(VERBOSE)$(PDFLATEX_ENV) $(PDFLATEX) --output-directory $$(@D) $$< + $(VERBOSE) $(PDFLATEX_ENV) $(PDFLATEX) --output-directory $$(@D) $$< endef # Generate cards pdf rules $(foreach pdfdir, $(SETS_BUILDDIRS), $(eval $(call generatePdfRules, $(pdfdir)))) # Generate sets pdf rule $(eval $(call generatePdfRules, $(SETS_PDF_DIR))) +# Generate decks pdf rule +$(eval $(call generatePdfRules, $(DECKS_PDF_DIR))) .PHONY: all de en @@ -120,6 +140,11 @@ sets: sets-tex sets-pdf sets-tex: $(SETS_TEX) sets-pdf: $(SETS_PDF) +.PHONY: decks decks-tex decks-pdf +decks: decks-tex decks-pdf +sets-tex: $(DECKS_TEX) +sets-pdf: $(DECKS_PDF) + .PHONY: cards-all cards-tex cards-pdf cards-png cards-all: cards-tex cards-pdf cards-png @echo "building $(LANGUAGE) cards" @@ -131,12 +156,12 @@ cards-png: $(CARDS_PNG) $(SPECIAL_CARDS_PNG) $(BUILDDIR)/cards.pdf: $(CARDS_PDF) $(MAKEFILE_LIST) @echo "building › › $@" @if test \( ! \( -d $(@D) \) \) ;then mkdir -p $(@D);fi - $(VERBOSE)$(PDFUNITE) $(CARDS_PDF) $@ + $(VERBOSE) $(PDFUNITE) $(CARDS_PDF) $@ %.png: %.pdf $(MAKEFILE_LIST) @echo "png › $@" @if test \( ! \( -d $(@D) \) \) ;then mkdir -p $(@D);fi - $(VERBOSE)$(PDFTOPPM) $(PDFTOPPM_FLAGS) $< $* + $(VERBOSE) $(PDFTOPPM) $(PDFTOPPM_FLAGS) $< $* .PHONY: clean-build clean-tex clean-both tabula-rasa diff --git a/latex/decks/de/approach.tex b/latex/decks/de/approach.tex new file mode 100644 index 00000000..ef34ebed --- /dev/null +++ b/latex/decks/de/approach.tex @@ -0,0 +1,26 @@ +\documentclass[a4paper,landscape]{article} +\usepackage[margin=6mm,top=5mm]{geometry} +\input{libs.tex} +\input{colors.tex} +\input{tikzcards.tex} +\usepackage{standalone} +\begin{document} +\begin{center} +\pagestyle{empty} +\includestandalone{cards/de/magic/catalyst} +\includestandalone{cards/de/magic/catalyst} +\includestandalone{cards/de/exp1/approach_supremancy!} +\includestandalone{cards/de/magic/ritual!} +\includestandalone{cards/de/magic/ritual!} +\includestandalone{cards/de/exp1/conscription!} +\includestandalone{cards/de/exp1/conscription!} +\includestandalone{cards/de/exp1/power_to_the_people!} +\includestandalone{cards/de/exp1/recycle!} +\includestandalone{cards/de/exp1/recycle!} +\includestandalone{cards/de/exp1/illusionist} +\includestandalone{cards/de/exp1/discount!} +\includestandalone{cards/de/magic/select!} +\includestandalone{cards/de/magic/no!} +\includestandalone{cards/de/magic/die!} +\end{center} +\end{document} diff --git a/latex/decks/de/recruter_rush.tex b/latex/decks/de/recruter_rush.tex new file mode 100644 index 00000000..5d29465c --- /dev/null +++ b/latex/decks/de/recruter_rush.tex @@ -0,0 +1,26 @@ +\documentclass[a4paper,landscape]{article} +\usepackage[margin=6mm,top=5mm]{geometry} +\input{libs.tex} +\input{colors.tex} +\input{tikzcards.tex} +\usepackage{standalone} +\begin{document} +\begin{center} +\pagestyle{empty} +\includestandalone{cards/de/base/tax_collector} +\includestandalone{cards/de/base/tax_collector} +\includestandalone{cards/de/base/sword} +\includestandalone{cards/de/base/sword} +\includestandalone{cards/de/exp1/power_to_the_people!} +\includestandalone{cards/de/exp1/backup!} +\includestandalone{cards/de/exp1/backup!} +\includestandalone{cards/de/base/recruiter} +\includestandalone{cards/de/equipments/banner} +\includestandalone{cards/de/exp1/depression_monument} +\includestandalone{cards/de/exp1/stasis_orb} +\includestandalone{cards/de/magic/pierce!} +\includestandalone{cards/de/magic/rush!} +\includestandalone{cards/de/equipments/shatter!} +\includestandalone{cards/de/magic/no!} +\end{center} +\end{document} diff --git a/latex/decks/de/spell_slinger.tex b/latex/decks/de/spell_slinger.tex new file mode 100644 index 00000000..08ddc20e --- /dev/null +++ b/latex/decks/de/spell_slinger.tex @@ -0,0 +1,28 @@ +\documentclass[a4paper,landscape]{article} +\usepackage[margin=6mm,top=5mm]{geometry} +\input{libs.tex} +\input{colors.tex} +\input{tikzcards.tex} +\usepackage{standalone} +\begin{document} +\begin{center} +\pagestyle{empty} +\includestandalone{cards/de/magic/catalyst} +\includestandalone{cards/de/magic/catalyst} +\includestandalone{cards/de/magic/ritual!} +\includestandalone{cards/de/magic/ritual!} +\includestandalone{cards/de/magic/die!} +\includestandalone{cards/de/magic/die!} +\includestandalone{cards/de/magic/mine!} +\includestandalone{cards/de/magic/mine!} +\includestandalone{cards/de/magic/more!} +\includestandalone{cards/de/magic/more!} +\includestandalone{cards/de/magic/no!} +\includestandalone{cards/de/magic/select!} +\includestandalone{cards/de/magic/isolate!} +\includestandalone{cards/de/magic/pierce!} +\includestandalone{cards/de/magic/attack!} +\includestandalone{cards/de/magic/appear!} +\includestandalone{cards/de/base/fighter} +\end{center} +\end{document} diff --git a/latex/decks/en/approach.tex b/latex/decks/en/approach.tex new file mode 100644 index 00000000..a4b04bb7 --- /dev/null +++ b/latex/decks/en/approach.tex @@ -0,0 +1,26 @@ +\documentclass[a4paper,landscape]{article} +\usepackage[margin=6mm,top=5mm]{geometry} +\input{libs.tex} +\input{colors.tex} +\input{tikzcards.tex} +\usepackage{standalone} +\begin{document} +\begin{center} +\pagestyle{empty} +\includestandalone{cards/en/magic/catalyst} +\includestandalone{cards/en/magic/catalyst} +\includestandalone{cards/en/exp1/approach_supremancy!} +\includestandalone{cards/en/magic/ritual!} +\includestandalone{cards/en/magic/ritual!} +\includestandalone{cards/en/exp1/conscription!} +\includestandalone{cards/en/exp1/conscription!} +\includestandalone{cards/en/exp1/power_to_the_people!} +\includestandalone{cards/en/exp1/recycle!} +\includestandalone{cards/en/exp1/recycle!} +\includestandalone{cards/en/exp1/illusionist} +\includestandalone{cards/en/exp1/discount!} +\includestandalone{cards/en/magic/select!} +\includestandalone{cards/en/magic/no!} +\includestandalone{cards/en/magic/die!} +\end{center} +\end{document} diff --git a/latex/decks/en/recruter_rush.tex b/latex/decks/en/recruter_rush.tex new file mode 100644 index 00000000..e588bbc6 --- /dev/null +++ b/latex/decks/en/recruter_rush.tex @@ -0,0 +1,26 @@ +\documentclass[a4paper,landscape]{article} +\usepackage[margin=6mm,top=5mm]{geometry} +\input{libs.tex} +\input{colors.tex} +\input{tikzcards.tex} +\usepackage{standalone} +\begin{document} +\begin{center} +\pagestyle{empty} +\includestandalone{cards/en/base/tax_collector} +\includestandalone{cards/en/base/tax_collector} +\includestandalone{cards/en/base/sword} +\includestandalone{cards/en/base/sword} +\includestandalone{cards/en/exp1/power_to_the_people!} +\includestandalone{cards/en/exp1/backup!} +\includestandalone{cards/en/exp1/backup!} +\includestandalone{cards/en/base/recruiter} +\includestandalone{cards/en/equipments/banner} +\includestandalone{cards/en/exp1/depression_monument} +\includestandalone{cards/en/exp1/stasis_orb} +\includestandalone{cards/en/magic/pierce!} +\includestandalone{cards/en/magic/rush!} +\includestandalone{cards/en/equipments/shatter!} +\includestandalone{cards/en/magic/no!} +\end{center} +\end{document} diff --git a/latex/decks/en/spell_slinger.tex b/latex/decks/en/spell_slinger.tex new file mode 100644 index 00000000..0bd6d819 --- /dev/null +++ b/latex/decks/en/spell_slinger.tex @@ -0,0 +1,28 @@ +\documentclass[a4paper,landscape]{article} +\usepackage[margin=6mm,top=5mm]{geometry} +\input{libs.tex} +\input{colors.tex} +\input{tikzcards.tex} +\usepackage{standalone} +\begin{document} +\begin{center} +\pagestyle{empty} +\includestandalone{cards/en/magic/catalyst} +\includestandalone{cards/en/magic/catalyst} +\includestandalone{cards/en/magic/ritual!} +\includestandalone{cards/en/magic/ritual!} +\includestandalone{cards/en/magic/die!} +\includestandalone{cards/en/magic/die!} +\includestandalone{cards/en/magic/mine!} +\includestandalone{cards/en/magic/mine!} +\includestandalone{cards/en/magic/more!} +\includestandalone{cards/en/magic/more!} +\includestandalone{cards/en/magic/no!} +\includestandalone{cards/en/magic/select!} +\includestandalone{cards/en/magic/isolate!} +\includestandalone{cards/en/magic/pierce!} +\includestandalone{cards/en/magic/attack!} +\includestandalone{cards/en/magic/appear!} +\includestandalone{cards/en/base/fighter} +\end{center} +\end{document} diff --git a/scripts/generate_deck.py b/scripts/generate_deck.py new file mode 100755 index 00000000..18c73cc5 --- /dev/null +++ b/scripts/generate_deck.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python3 +import argparse +import pathlib +from pathlib import Path +from typing import MutableMapping, Tuple + +DECK_TEMPLATE = \ +"""\\documentclass[a4paper,landscape]{{article}} +\\usepackage[margin=6mm,top=5mm]{{geometry}} +\\input{{libs.tex}} +\\input{{colors.tex}} +\\input{{tikzcards.tex}} +\\usepackage{{standalone}} +\\begin{{document}} +\\begin{{center}} +\\pagestyle{{empty}} +{CARDS} +\\end{{center}} +\\end{{document}}""" + +GAME_ROOT = Path(__file__).parent.parent +CARDS_DATA_DIR = GAME_ROOT / 'data' / 'cards' + +CARDS_TO_SETS = {} +SETS_TO_CARDS = {} + + +# build up the card lookup dictionaries +for set_dir in CARDS_DATA_DIR.iterdir(): + set_name = set_dir.name + SETS_TO_CARDS[set_name] = [] + for card in set_dir.iterdir(): + SETS_TO_CARDS[set_name].append(card.stem) + CARDS_TO_SETS[card.stem] = set_name + + +def generate_markdown(deck: list[str], language='en', indentation=3): + """Output a markdown enumeration""" + return '' + + + +def generate_latex(deck: list[str], language='en'): + """Generate a document containing all included cards""" + + cards = [] + for line in deck: + line = line.strip() + amount, card = line.split(' ', maxsplit=1) + card = card.replace(' ', '_').lower() + containing_set = CARDS_TO_SETS[card] + for _ in range(int(amount)): + cards.append(f'\\includestandalone{{cards/{language}/{containing_set}/{card}}}') + print(DECK_TEMPLATE.format(CARDS='\n'.join(cards))) + + +def main(): + """Generate one standalone tikz picture for each card in the input data""" + + parser = argparse.ArgumentParser( + description='generate decks from deck descriptions') + parser.add_argument( + 'deck', + help= + 'deck file or directory containing deck files defining the decks to generate' + ) + parser.add_argument('--format', + choices=['latex', 'markdown'], + default='latex', + help='output format') + parser.add_argument('--language', + choices=['en', 'de'], + default='en', + help='the language of the cards to output') + + args = parser.parse_args() + + data_files = [args.deck] + data_path = pathlib.Path(args.deck) + if data_path.is_dir(): + data_files = data_path.glob('*.deck') + + for data_file in data_files: + with open(data_file, 'r', encoding="utf8") as deck_file: + deck = deck_file.readlines() + + if args.format == 'latex': + generate_latex(deck, language=args.language) + elif args.format == 'markdown': + generate_markdown(deck, language=args.language) + + +if __name__ == '__main__': + main() |
