aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/decks/approach.deck11
-rw-r--r--data/decks/recruiter_rush.deck12
-rw-r--r--data/decks/spell_slinger.deck12
-rw-r--r--latex/Makefile35
-rw-r--r--latex/decks/de/approach.tex26
-rw-r--r--latex/decks/de/recruter_rush.tex26
-rw-r--r--latex/decks/de/spell_slinger.tex28
-rw-r--r--latex/decks/en/approach.tex26
-rw-r--r--latex/decks/en/recruter_rush.tex26
-rw-r--r--latex/decks/en/spell_slinger.tex28
-rwxr-xr-xscripts/generate_deck.py94
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()