Compare commits

...

10 Commits

34 changed files with 1413 additions and 428 deletions

116
Makefile
View File

@ -1,19 +1,11 @@
CARDS_YAML := $(wildcard cards/*.yaml)
CARDS_XML := $(wildcard cards/*.xml)
CARDS := $(CARDS_YAML) $(CARDS_XML)
CARDS_DESTS_YAML := $(patsubst cards/%.yaml,cards/build/%.html,$(CARDS))
CARDS_DESTS_XML := $(patsubst cards/%.xml,cards/build/%.x.html,$(CARDS))
CARDS_DESTS := $(CARDS_DESTS_YAML) $(CARDS_DESTS_XML)
CARDS := $(wildcard cards/*.xml)
CARDS_DESTS := $(patsubst cards/%.xml,cards/build/%.html,$(CARDS))
.PHONY: style
style: build/test_card.html build/test_card_rendered.html cards/build/all.html
style: build/test_card.html
.PHONY: cards
cards: $(CARDS_DESTS) cards/build/all.html
.PHONY: style
style: build/style.xsl
cards: cards/build/all.html
.PHONY: dev
dev:
@ -23,87 +15,35 @@ dev:
dev_cards:
git ls-files | entr bash -c "make cards"
.PHONY: clean
clean:
rm -v build/* cards/build/*
build/test_card.html: build/test_card.xml build/style.xsl
build/test_card.html: test_card.xml build/style.xsl build
xsltproc \
-o build/test_card.html \
build/style.xsl \
build/test_card.xml
test_card.xml
define PYTHON_MAKE_JINJA2_RENDERED_CARD
cards/build/%.html: cards/%.xml build/style.xsl cards/build
xsltproc -o $@ build/style.xsl $<
define PYTHON_MAKE_IFRAME_HELL
from jinja2 import Environment, FileSystemLoader
from markdown import markdown
import yaml, sys, glob, traceback
import xmltodict
with open("build/style.css") as f: css_data = f.read()
with open(sys.argv[2], "w") as f:
e = Environment(trim_blocks=True, lstrip_blocks=True, loader=FileSystemLoader(''))
f.write(e.get_template("templates/card_header.html.j2").render(is_local=True, css_data=css_data))
e.filters.update({
"is_number":lambda x: str(x).isnumeric(),
"is_string":lambda x: isinstance(x, str),
"markdown":markdown,
"any":any,
"all":all,
"split":str.split,
"startswith":str.startswith,
"tail": lambda x: x[1:],
"cull_whitespace":(lambda x: " ".join(x.split())) })
for n, filename in enumerate([sys.argv[1]] if sys.argv[1] != "ALL" else sorted(glob.glob("cards/*.yaml") + glob.glob("cards/*.xml"))):
with open(filename) as f2:
if filename.endswith("yaml"):
yaml_data = yaml.load(f2.read())
xml_data = {}
elif filename.endswith("xml"):
xml = xmltodict.parse(f2.read())
xml_data = xml.get("ability_card", {})
yaml_data = yaml.load(xml_data.get("yaml_data", ""))
try:
data = e.get_template('style.html.j2').render(yaml=yaml_data, xml=xml_data)
except Exception as ex:
data = f"<pre style=\"color:red;\">{ex}</pre>"
traceback.print_exc()
if sys.argv[1] == "ALL":
f.write(f"\n\n<div id='card_container_{n}'>\n<h1>{filename}</h1>\n\n{data}\n</div>")
else:
f.write(f"\n<div id='card_container_{n}'>\n{data}\n</div>")
endef
export PYTHON_MAKE_JINJA2_RENDERED_CARD
build/test_card_rendered.html: build/test_card.xml style.html.j2 build/style.css templates/card_header.html.j2
python3 -c "$$PYTHON_MAKE_JINJA2_RENDERED_CARD" "build/test_card.xml" "build/test_card_rendered.html"
export PYTHON_MAKE_JINJA2_RENDERED_CARD
cards/build/%.html: cards/%.yaml style.html.j2 build/style.css templates/card_header.html.j2
python3 -c "$$PYTHON_MAKE_JINJA2_RENDERED_CARD" $< $@
export PYTHON_MAKE_JINJA2_RENDERED_CARD
cards/build/%.x.html: cards/%.xml style.html.j2 build/style.css templates/card_header.html.j2
python3 -c "$$PYTHON_MAKE_JINJA2_RENDERED_CARD" $< $@
export PYTHON_MAKE_JINJA2_RENDERED_CARD
cards/build/all.html: $(CARDS) style.html.j2 build/style.css templates/card_header.html.j2
python3 -c "$$PYTHON_MAKE_JINJA2_RENDERED_CARD" ALL $@
define PYTHON_MAKE_CARD_XML
from jinja2 import Environment, FileSystemLoader
with open("test_card.yaml") as f: data = f.read()
with open("test_card.xml") as f: xml_data = f.read()
with open("build/test_card.xml", "w") as f:
f.write(Environment(
import sys, os
env = Environment(
trim_blocks = True,
lstrip_blocks = True,
loader = FileSystemLoader('templates'))
.get_template('card.xml.j2')
.render(data=data, xml_data=xml_data))
with open("cards/build/all.html", "w") as f:
f.write(env.get_template('all.html.j2').render(cards=map(os.path.basename, sys.argv[1:])))
endef
export PYTHON_MAKE_CARD_XML
build/test_card.xml: test_card.yaml test_card.xml templates/card.xml.j2
python3 -c "$$PYTHON_MAKE_CARD_XML"
export PYTHON_MAKE_IFRAME_HELL
cards/build/all.html: $(CARDS_DESTS) templates/all.html.j2
python3 -c "$$PYTHON_MAKE_IFRAME_HELL" $(CARDS_DESTS)
define PYTHON_MAKE_STYLE_XSL
@ -122,16 +62,24 @@ with open("build/style.xsl", "w") as f:
.render( css_data=css_data, jinja_data=jinja_data, js_data=js_data, card_header=card_header))
endef
export PYTHON_MAKE_STYLE_XSL
build/style.xsl: build/style.css templates/style.xsl.j2 templates/card_header.html.j2 style.html.j2 style.js
build/style.xsl: build/style.css templates/style.xsl.j2 templates/card_header.html.j2 style.html.j2 style.js build
python3 -c "$$PYTHON_MAKE_STYLE_XSL"
define PYTHON_MAKE_SASS
import sass
import sass # libsass
with open("style.scss") as f:
with open("build/style.css", "w") as of:
of.write(sass.compile(string=f.read(), output_style="expanded"))
endef
export PYTHON_MAKE_SASS
build/style.css: style.scss
build/style.css: style.scss build
python3 -c "$$PYTHON_MAKE_SASS"
build:
mkdir -p build
cards/build:
mkdir -p cards/build

View File

@ -1,18 +1,48 @@
<ability_card>
<yaml_data>
style:
figures:
- name: https://ak3.picdn.net/shutterstock/videos/16986703/thumb/1.jpg?i10c=img.resize(height:160)
source: url
scale: 3
flip_x: true
rotation: -20
opacity: 0.6
- name: effects/uni-slim
source: img
color: black
scale: 0.7
rotation: 10
offset: [-0.32, -0.08]
- name: fencing
source: svg
color: false
scale: 0.75
rotation: 8
offset: [-0.2, 0.0]
- source: xml
scale: 0.7
offset: [0.25, 0.1]
</yaml_data>
<name>Evasion</name>
<image>img:piuy/wave</image>
<playcost></playcost>
<cp></cp>
<duration></duration>
<power></power>
<cp>12</cp>
<duration>Permanent + discarded on death</duration>
<power>CUNNING + (0 to 2)</power>
<difficulty></difficulty>
<symbol></symbol>
<name>BASE</name>
<description></description>
<image>img:piuy/haha</image>
<symbol>2 🎲</symbol>
<range></range>
<description>*Starts in your play area rather than your deck.*
Defensive Trigger: **take damage**
* You cannot activate this if *toppled*
* *If below or at 25% health:* gain +2 power to this ability.
* *Roll a D20*: On a (20-power of this ability) or more you dodge the attack *entirely*.
* An 8 or less is always a failure to dodge, regardless of how much you boost this ability.
* If you use this ability and roll an 8 or less, your Hit Points card will lose 2 HP for each HP lost on this attack.</description>
<component x="7" y="1" db_entry="🧩 Set Ability Name"/>
<component x="9" y="1" db_entry="🧩 Set Image"/>
@ -24,5 +54,7 @@ figures:
<component x="12" y="3" db_entry="🧩 Symbols"/>
<component x="12" y="5" db_entry="🧩 Range"/>
<component x="8" y="2" db_entry="🧩 Set Description"/>
<component x="2" y="2" db_entry="🎲 Evasion"/>
<component x="2" y="3" db_entry="🎲 SOS"/>
</ability_card>

View File

@ -1,21 +1,76 @@
<ability_card>
<yaml_data>
style: repertoire
figures:
- name: gi/open-folder
source: svg
scale: 5
color: Navy
- name: gi/wind-hole
source: svg
scale: 2.6
rotation: -40
color: CornflowerBlue
- name: gi/wind-hole
source: svg
scale: 1.8
color: DarkCyan
- name: gi/curly-wing
source: svg
scale: 0.9
rotation: -20
flip_x: true
offset: [0.55, 0.09]
color: white
opacity: 0.8
- name: gi/curly-wing
source: svg
scale: 0.9
rotation: 20
offset: [-0.55, 0.09]
color: white
opacity: 0.8
- name: gi/abstract-066
source: svg
scale: 0.98
color: DarkViolet
- name: gi/open-folder
source: svg
scale: 5
color: white
opacity: 0.3
- name: gi/abstract-066
source: svg
scale: 0.9
color: hotpink
- name: gi/handheld-fan
source: svg
scale: 0.72
offset: [0.0, 0.05]
rotation: 200
color: black
- name: gi/handheld-fan
source: svg
scale: 0.7
offset: [0.0, 0.05]
rotation: 200
color: crimson
</yaml_data>
<name>Repotoire: Talent</name>
<image>img:piuy/hapa</image>
<playcost></playcost>
<cp>10</cp>
<duration></duration>
<power></power>
<duration>Permanent + persists on death</duration>
<power>1</power>
<difficulty></difficulty>
<symbol></symbol>
<symbol>🌪️</symbol>
<name>Air Mana</name>
<image></image>
<description>*Persists on death*\
*Play Limit*: 1 / turn
* Mana Cards are untapped at the start of your turn
* Can be tapped for various reasons.
* Tap this card to add a power token to your Mana Shield. </description>
<range></range>
<description>Your song ability in play gains +1 popularity tokens.
</description>
<artistic_value>1</artistic_value>
<component x="7" y="1" db_entry="🧩 Set Ability Name"/>
<component x="9" y="1" db_entry="🧩 Set Image"/>
@ -27,6 +82,7 @@ figures:
<component x="12" y="3" db_entry="🧩 Symbols"/>
<component x="12" y="5" db_entry="🧩 Range"/>
<component x="8" y="2" db_entry="🧩 Set Description"/>
<component x="3" y="3" db_entry="🎺 Repertoire Card: Talent"/>
<component x="2" y="2" db_entry="🔮 Mana Card"/>
<component x="2" y="3" db_entry="🌪️ Air Mana"/>
</ability_card>

View File

@ -1,35 +1,24 @@
<ability_card>
<yaml_data>
style: repertoire
figures:
- name: expression/explosion
- name: effects/uni-slim
source: img
- source: xml
offset:
- 0.2
- 0.0
scale: 1.8
</yaml_data>
<name>Raving Song</name>
<image>img:piuy/sing</image>
<playcost>2 ACT,
not silenced,
Encore! card per turn</playcost>
<cp>65</cp>
<duration>1 + discarded on death</duration>
<power>(0 to 4) + TEC</power>
<difficulty>1</difficulty>
<symbol>🎲🎺</symbol>
<description>All units (friends and foes) increase any damage taken by 1 per popularity token on the song. This counts per damage source.
<name>Repotoire: Exiting</name>
<image>img:piuy/hapa</image>
<playcost></playcost>
<cp>10</cp>
<duration></duration>
<power></power>
<difficulty></difficulty>
<symbol></symbol>
<range></range>
<description>Your song ability in play gains +1 popularity tokens.</description>
<artistic_value>1</artistic_value>
+2 power to this ability if you have the **High Ground** or **Flying** status effect.
When you play this song with another of your songs in play, you transition from your old song to your new song.
Your song does not affect non-sentient units</description>
<component x="2" y="2" db_entry="🎲 Mastery"/>
<component x="2" y="3" db_entry="🎺 Song"/>
<component x="4" y="3" db_entry="🎺 Staged Song"/>
<component x="7" y="1" db_entry="🧩 Set Ability Name"/>
<component x="9" y="1" db_entry="🧩 Set Image"/>
<component x="11" y="1" db_entry="🧩 Play Cost"/>
@ -38,9 +27,8 @@ Your song does not affect non-sentient units</description>
<component x="11" y="3" db_entry="🧩 Power"/>
<component x="11" y="4" db_entry="🧩 Difficulty"/>
<component x="12" y="3" db_entry="🧩 Symbols"/>
<component x="12" y="5" db_entry="🧩 Range"/>
<component x="8" y="2" db_entry="🧩 Set Description"/>
<component x="3" y="3" db_entry="🎺 Monster Mash"/>
<component x="2" y="4" db_entry="🎺 Raving Song"/>
<component x="5" y="3" db_entry="🎺 Encore!"/>
<component x="3" y="3" db_entry="🎺 Repertoire Card: Talent"/>
</ability_card>

View File

@ -2,28 +2,75 @@
<yaml_data>
figures:
- name: piuy/waiting
source: img
scale: 1.56
offset: [0.0, 0.02]
- name: effects/uni-black
source: img
scale: 2.3
offset: [0.0, -0.13]
- name: gi/open-folder
source: svg
scale: 5
color: Navy
- name: gi/wind-hole
source: svg
scale: 2.6
rotation: -40
flip_x: true
color: CornflowerBlue
- name: gi/wind-hole
source: svg
scale: 1.8
flip_y: true
color: DarkCyan
- name: gi/splash-2
source: svg
scale: 0.9
rotation: -20
flip_x: true
offset: [0.55, 0.09]
color: white
opacity: 0.8
- name: gi/splash-2
source: svg
scale: 0.9
rotation: 20
offset: [-0.55, 0.09]
color: white
opacity: 0.8
- name: gi/abstract-066
source: svg
scale: 0.98
color: cyan
opacity: 0.5
- name: gi/open-folder
source: svg
scale: 5
color: teal
opacity: 0.3
- name: gi/abstract-066
source: svg
scale: 0.9
color: "#78f"
- name: gi/water-splash
source: svg
scale: 0.75
offset: [0.0, 0.05]
color: blue
- name: gi/water-splash
source: svg
scale: 0.7
offset: [0.0, 0.05]
color: lightblue
</yaml_data>
<playcost>2 ACT</playcost>
<cp>15</cp>
<duration>Permanent + discards on your death</duration>
<power>0 or + 2 + TEC</power>
<difficulty>1</difficulty>
<symbol>🎲🎺</symbol>
<name>Study of Movement</name>
<description>Scout an enemy unit in visible range on the battlefield. If the scouted unit is a boss, discard this card.
If the scouted unit has cunning greater than this card, discard this card.
Otherwise, keep this card in your play area.
While this card is in your play area, your Imitation Dance cards can imitate any ability on the scouted monster card that does not do direct damage.</description>
<playcost></playcost>
<cp>10</cp>
<duration>Permanent + persists on death</duration>
<power>1</power>
<difficulty></difficulty>
<symbol>🌊</symbol>
<name>Water Mana</name>
<image></image>
<description>*Persists on death*\
*Play Limit*: 1 / turn
* Mana Cards are untapped at the start of your turn
* Can be tapped for various reasons.
* Tap this card to add **TWO** power token to your Mana Shield. </description>
<range></range>
<component x="7" y="1" db_entry="🧩 Set Ability Name"/>
@ -36,7 +83,7 @@ While this card is in your play area, your Imitation Dance cards can imitate any
<component x="12" y="3" db_entry="🧩 Symbols"/>
<component x="12" y="5" db_entry="🧩 Range"/>
<component x="8" y="2" db_entry="🧩 Set Description"/>
<component x="2" y="2" db_entry="🎲 Mastery"/>
<component x="2" y="3" db_entry="🎺 Study of Movement"/>
<component x="2" y="2" db_entry="🔮 Mana Card"/>
<component x="2" y="3" db_entry="🌊 Water Mana"/>
</ability_card>

View File

@ -1,18 +1,44 @@
<ability_card>
<yaml_data>
style: repertoire
figures:
- name: piuy/hi
- name: piuy/slipping
source: img
opacity: 0.3
scale: 2
rotation: 20
offset:
- -0.15
- 0.20
- name: google/android-4.3/banana
source: emoji
scale: 0.3
opacity: 0.8
flip_x: true
rotation: 120
offset:
- 0.30
- 0.33
- source: xml
rotation: -60
scale: 0.8
offset:
- -0.05
- -0.09
</yaml_data>
<name>Piuy!</name>
<cp>10</cp>
<symbol>⚔️</symbol>
<duration>Permanent + discarded on death</duration>
<playcost>0 ACT</playcost>
<power>3 BODY + ⚔️ LevelUp Benefit</power>
<name>Rep: Embarrasing Failure</name>
<image>img:piuy/hapo</image>
<playcost></playcost>
<cp>100</cp>
<duration></duration>
<power></power>
<difficulty></difficulty>
<symbol></symbol>
<range></range>
<description>Discard any song or dance cards in play (even if not yours!). End your turn. Gain the ""Dazed"" status effect.
Instead of discarding this card, turn it facedown until the end of combat. You won't play it again until the next combat.</description>
<artistic_value>-3</artistic_value>
<component x="7" y="1" db_entry="🧩 Set Ability Name"/>
<component x="9" y="1" db_entry="🧩 Set Image"/>
@ -24,6 +50,6 @@ figures:
<component x="12" y="3" db_entry="🧩 Symbols"/>
<component x="12" y="5" db_entry="🧩 Range"/>
<component x="8" y="2" db_entry="🧩 Set Description"/>
<component x="3" y="2" db_entry="⚔️ Hit Points"/>
<component x="2" y="2" db_entry="🎺 Repertoire Card: Embarrasing Failure"/>
</ability_card>

View File

@ -1,36 +1,23 @@
<ability_card>
<yaml_data>
style: repertoire
figures:
- name: piuy/beetle
- name: effects/uni-slim
source: img
scale: 0.95
offset:
- 0.15
- 0.05
- name: google/android-7.0/flower-playing-cards
source: emoji
scale: 0.28
flip_x: true
rotation: 17
offset:
- -0.21
- -0.3
scale: 1.8
</yaml_data>
<playcost>ACT</playcost>
<cp>10</cp>
<name>Repotoire: Entralling</name>
<playcost></playcost>
<cp>25</cp>
<duration></duration>
<power>TEC</power>
<power></power>
<difficulty></difficulty>
<symbol>🎺</symbol>
<name>Draw Reportoire</name>
<description>*Release your inner star!*
Draw one card from your Repertoire Deck, do what it says on it. Then discard it.
</description>
<symbol></symbol>
<range></range>
<description>One of your song or dance abilities in play gains +1 duration tokens.</description>
<artistic_value>2</artistic_value>
<image>img:piuy/hapi</image>
<component x="7" y="1" db_entry="🧩 Set Ability Name"/>
<component x="9" y="1" db_entry="🧩 Set Image"/>
@ -42,7 +29,6 @@ Draw one card from your Repertoire Deck, do what it says on it. Then discard it.
<component x="12" y="3" db_entry="🧩 Symbols"/>
<component x="12" y="5" db_entry="🧩 Range"/>
<component x="8" y="2" db_entry="🧩 Set Description"/>
<component x="3" y="2" db_entry="⚔️ Learn Ability"/>
<component x="3" y="3" db_entry="🎺 Entertainer"/>
<component x="3" y="2" db_entry="🎺 Repertoire Card: Enthralling"/>
</ability_card>

59
cards/132.xml Normal file
View File

@ -0,0 +1,59 @@
<ability_card>
<yaml_data>
figures:
- name: effects/uni-white
source: img
scale: 1.5
color: "#bbb"
offset:
- -0.04
- -0
- source: xml
scale: 0.9
offset:
- 0
- 0
- name: clip/crowd2
source: img
scale: 1.8
offset:
- 0
- 0.3
</yaml_data>
<name>Raving Song</name>
<image>img:piuy/sing</image>
<playcost>2 ACT,
not silenced,
MOV,
Encore! card per turn</playcost>
<cp>81</cp>
<duration>1 + discarded on death</duration>
<power>(2 to 6) + TEC</power>
<difficulty>1</difficulty>
<symbol>🎲🎺</symbol>
<description>All units (friends and foes) increase any damage taken by 1 per popularity token on the song. This counts per damage source.
The song starts at 2 popularity tokens.\
+2 POWER if *flying* or *High Ground*
This may stack on existing performances.</description>
<mastery>-1</mastery>
<component x="2" y="2" db_entry="🎲 Mastery"/>
<component x="2" y="3" db_entry="🎺 Song"/>
<component x="7" y="1" db_entry="🧩 Set Ability Name"/>
<component x="9" y="1" db_entry="🧩 Set Image"/>
<component x="11" y="1" db_entry="🧩 Play Cost"/>
<component x="11" y="5" db_entry="🧩 CP Cost"/>
<component x="12" y="4" db_entry="🧩 Duration"/>
<component x="11" y="3" db_entry="🧩 Power"/>
<component x="11" y="4" db_entry="🧩 Difficulty"/>
<component x="12" y="3" db_entry="🧩 Symbols"/>
<component x="8" y="2" db_entry="🧩 Set Description"/>
<component x="2" y="4" db_entry="🎺 Raving Song"/>
<component x="4" y="3" db_entry="🎺 Put effort into it"/>
<component x="5" y="3" db_entry="🎺 Staged Song"/>
<component x="3" y="3" db_entry="🎺 Encore!"/>
</ability_card>

75
cards/209.xml Normal file
View File

@ -0,0 +1,75 @@
<ability_card>
<yaml_data>
figures:
- name: effects/uni-slim
source: img
scale: 2.7
- name: effects/uni-white
source: img
scale: 0.54
color: yellow
opacity: 60%
flip_x: true
rotation: 17
offset:
- -0.21
- -0.3
- source: xml
scale: 0.95
offset:
- 0.15
- 0.05
- name: google/android-7.0/flower-playing-cards
source: emoji
scale: 0.28
flip_x: true
rotation: 10
opacity: 0.7
offset:
- -0.24
- -0.29
- name: google/android-7.0/flower-playing-cards
source: emoji
scale: 0.28
flip_x: true
rotation: 17
offset:
- -0.21
- -0.3
</yaml_data>
<playcost>ACT</playcost>
<cp>54</cp>
<duration></duration>
<power>TEC + (-2 to 0)</power>
<difficulty>1</difficulty>
<symbol>🎺3 🎲</symbol>
<name>Draw Reportoire</name>
<description>*Release your inner star!*
Draw two cards from your repertoire deck, choose one,\
do what it says it, then discard both.
*Instead of playing this card, you may on your turn discard it from your hand to gain 2 SP.*
*If you are below or at 25% health, gain +2 power to this ability.*</description>
<range></range>
<image>img:piuy/beetle</image>
<component x="7" y="1" db_entry="🧩 Set Ability Name"/>
<component x="9" y="1" db_entry="🧩 Set Image"/>
<component x="11" y="1" db_entry="🧩 Play Cost"/>
<component x="11" y="5" db_entry="🧩 CP Cost"/>
<component x="12" y="4" db_entry="🧩 Duration"/>
<component x="11" y="3" db_entry="🧩 Power"/>
<component x="11" y="4" db_entry="🧩 Difficulty"/>
<component x="12" y="3" db_entry="🧩 Symbols"/>
<component x="12" y="5" db_entry="🧩 Range"/>
<component x="8" y="2" db_entry="🧩 Set Description"/>
<component x="3" y="3" db_entry="🎺 Entertainer"/>
<component x="3" y="2" db_entry="🎲 Skilled"/>
<component x="4" y="3" db_entry="🎺 Backup Act"/>
<component x="4" y="2" db_entry="🎲 Quick Shot"/>
<component x="5" y="2" db_entry="🎲 SOS"/>
</ability_card>

46
cards/213.xml Normal file
View File

@ -0,0 +1,46 @@
<ability_card>
<yaml_data>
figures:
- name: piuy/waiting
source: img
scale: 1.56
offset: [0.0, 0.02]
- name: effects/uni-black
source: img
scale: 2.3
offset: [0.0, -0.13]
- name: clip/glasses1
source: img
scale: 0.6
offset: [-0.01, -0.15]
</yaml_data>
<playcost>2 ACT</playcost>
<cp>15</cp>
<duration>Permanent + discards on your death</duration>
<power>0 or + 2 + TEC</power>
<difficulty>1</difficulty>
<symbol>🎲🎺</symbol>
<name>Study of Movement</name>
<description>Scout an enemy unit in visible range on the battlefield. If the scouted unit is a boss, discard this card.
If the scouted unit has cunning greater than this card, discard this card.
Otherwise, keep this card in your play area.
While this card is in your play area, your Imitation Dance cards can imitate any ability on the scouted monster card that does not do direct damage.</description>
<image></image>
<range></range>
<component x="7" y="1" db_entry="🧩 Set Ability Name"/>
<component x="9" y="1" db_entry="🧩 Set Image"/>
<component x="11" y="1" db_entry="🧩 Play Cost"/>
<component x="11" y="5" db_entry="🧩 CP Cost"/>
<component x="12" y="4" db_entry="🧩 Duration"/>
<component x="11" y="3" db_entry="🧩 Power"/>
<component x="11" y="4" db_entry="🧩 Difficulty"/>
<component x="12" y="3" db_entry="🧩 Symbols"/>
<component x="12" y="5" db_entry="🧩 Range"/>
<component x="8" y="2" db_entry="🧩 Set Description"/>
<component x="2" y="2" db_entry="🎲 Mastery"/>
<component x="2" y="3" db_entry="🎺 Study of Movement"/>
</ability_card>

70
cards/214.xml Normal file
View File

@ -0,0 +1,70 @@
<ability_card>
<yaml_data>
figures:
- name: https://i.imgur.com/TtzXwb9.png
source: url
scale: 0.5
rotation: 20
offset: [0.56, -0.23]
- name: https://i.imgur.com/zx97is1.png
source: url
scale: 0.4
rotation: -20
offset: [-0.57, -0.25]
- source: xml
rotation: 8
offset: [-0.05, 0.04]
- source: url
name: "https://www.vippng.com/png/full/93-933790_green-colored-smoke-fog-light-green-smoke-transparent.png"
offset: [1, 0.1]
rotation: -80
scale: 1.8
- source: url
name: "https://www.vippng.com/png/full/93-933790_green-colored-smoke-fog-light-green-smoke-transparent.png"
offset: [-1, 0.1]
rotation: 80
flip_x: true
scale: 1.8
color: purple
</yaml_data>
<playcost>Limit: once per your turn,
2 ACT</playcost>
<cp>30</cp>
<duration></duration>
<power>(3 to 5) + CUNNING + 0 or</power>
<difficulty>(1 to 9)</difficulty>
<symbol>🎲🎺⚔️</symbol>
<name>Vicious Mockery</name>
<description>Mock a target that has your attention mercilessly, dealing PSYCHIC damage.
You must come up with the mockery in real life.
Gain up to 8 less difficulty on the attack as decided by the GM and other party members.
Consume 3 Proc symbols on Hit Dice when attacking with this card to
increase the power of this ability by 3
If you fail to hit with this attack, return this card to your collection.
</description>
<image>img:piuy/sick</image>
<range></range>
<mastery>-1</mastery>
<component x="7" y="1" db_entry="🧩 Set Ability Name"/>
<component x="9" y="1" db_entry="🧩 Set Image"/>
<component x="11" y="1" db_entry="🧩 Play Cost"/>
<component x="11" y="5" db_entry="🧩 CP Cost"/>
<component x="12" y="4" db_entry="🧩 Duration"/>
<component x="11" y="3" db_entry="🧩 Power"/>
<component x="11" y="4" db_entry="🧩 Difficulty"/>
<component x="12" y="3" db_entry="🧩 Symbols"/>
<component x="12" y="5" db_entry="🧩 Range"/>
<component x="8" y="2" db_entry="🧩 Set Description"/>
<component x="3" y="2" db_entry="🎲 Mastery"/>
<component x="3" y="3" db_entry="🎺 Vicious Mockery"/>
<component x="3" y="4" db_entry="⚔️ Attack"/>
<component x="4" y="3" db_entry="🎺 Roleplaying it"/>
<component x="4" y="4" db_entry="⚔️ Proc: Criticals"/>
</ability_card>

69
cards/215.xml Normal file
View File

@ -0,0 +1,69 @@
<ability_card>
<yaml_data>
figures:
- name: gi/full-folder
source: svg
scale: 4
color: "#300"
opacity: 0.4
- name: gi/crossed-chains
source: svg
scale: 2
offset: [-0.1, -0.2]
color: white
opacity: 0.3
- name: gi/padlock
source: svg
color: "#959"
- name: gi/grab
source: svg
rotation: -70
scale: 0.5
offset: [-0.56, 0.2]
color: "#938"
- name: gi/grab
source: svg
rotation: 70
flip_x: true
scale: 0.5
offset: [0.56, 0.2]
color: "#839"
- source: xml
scale: 0.5
offset: [0, -.18]
rotation: 2
</yaml_data>
<playcost>2 MOV</playcost>
<cp>45</cp>
<power>(0 to 5) + TEC</power>
<difficulty>1</difficulty>
<symbol>🎲🎺</symbol>
<name>Pas de Deux</name>
<description>* Duration: 1 per 3 power of this ability
+3 power if you have the *High Ground* or *Flying* when playing this card.
*Grab onto another unit at range 1, and dance with them.
While this card is in play, that unit cannot move away from you, but can otherwise attack normally.*
You move together, rotation costs 1 move.</description>
<image>img:piuy/twirl</image>
<range></range>
<mastery>-1</mastery>
<component x="7" y="1" db_entry="🧩 Set Ability Name"/>
<component x="9" y="1" db_entry="🧩 Set Image"/>
<component x="11" y="1" db_entry="🧩 Play Cost"/>
<component x="11" y="5" db_entry="🧩 CP Cost"/>
<component x="11" y="3" db_entry="🧩 Power"/>
<component x="11" y="4" db_entry="🧩 Difficulty"/>
<component x="12" y="3" db_entry="🧩 Symbols"/>
<component x="12" y="5" db_entry="🧩 Range"/>
<component x="8" y="2" db_entry="🧩 Set Description"/>
<component x="2" y="2" db_entry="🎲 Mastery"/>
<component x="2" y="3" db_entry="🎺 Dance"/>
<component x="2" y="4" db_entry="🎺 Pas de Deux"/>
<component x="3" y="3" db_entry="🎺 Staged Dance"/>
</ability_card>

73
cards/216.xml Normal file
View File

@ -0,0 +1,73 @@
<ability_card>
<yaml_data>
figures:
- name: bg/cave
source: img
scale: 2
opacity: 0.9
- name: effects/uni-white
source: img
color: "#ffc"
offset: [0.3, 0]
scale: 1.2
opacity: 0.4
- name: "https://i.ya-webdesign.com/images/create-png-with-transparent-background-3.png"
source: url
offset: [0.3, 0]
scale: 1.2
color: white
- name: "https://i.ya-webdesign.com/images/create-png-with-transparent-background-3.png"
source: url
offset: [0.3, 0]
scale: 1.2
opacity: 0.9
- name: gi/lightning-trio
source: svg
offset: [0.0, -0.3]
color: yellow
scale: 0.35
rotation: 170
- source: xml
scale: 0.7
offset: [-0.35, 0.15]
</yaml_data>
<playcost>2 ACT,
Not Silenced</playcost>
<cp>24</cp>
<duration>3 + discards on your death</duration>
<power>MAG+(0 to 1)+🌪LV</power>
<difficulty>1</difficulty>
<symbol>🔮🌪️🎲⚔️</symbol>
<name>Generator</name>
<image>img:piuy/haha</image>
<range>1</range>
<description>* 2 cooldown
*Target is surrounded by an electromagnetic field.*\
*+1 against *flying* targets*
* POWER must exceed CUNNING against hostile targets
* *For each MOV spent by targets*: gain 1 kinetic token on this card, up to POWER tokens.
* You may trade 6 kinetic tokens for +1 ACT this turn.
* Targets gain +1 Range on ranged abilities</description>
<mastery>-1</mastery>
<component x="7" y="1" db_entry="🧩 Set Ability Name"/>
<component x="9" y="1" db_entry="🧩 Set Image"/>
<component x="11" y="1" db_entry="🧩 Play Cost"/>
<component x="11" y="5" db_entry="🧩 CP Cost"/>
<component x="12" y="4" db_entry="🧩 Duration"/>
<component x="11" y="4" db_entry="🧩 Difficulty"/>
<component x="12" y="3" db_entry="🧩 Symbols"/>
<component x="8" y="2" db_entry="🧩 Set Description"/>
<component x="2" y="3" db_entry="🔮 Cast Magic"/>
<component x="2" y="4" db_entry="🔮 Touch"/>
<component x="2" y="5" db_entry="🌪️ Generator"/>
<component x="3" y="5" db_entry="🌪️ Speedster"/>
<component x="4" y="5" db_entry="🌪️ Projectile Carry"/>
<component x="3" y="3" db_entry="🌪️ Strong vs Flying"/>
<component x="2" y="2" db_entry="🎲 Mastery"/>
<component x="4" y="3" db_entry="⚔️ Cooldown"/>
</ability_card>

65
cards/217.xml Normal file
View File

@ -0,0 +1,65 @@
<ability_card>
<yaml_data>
figures:
- name: bg/rays
source: img
scale: 2
opacity: 0.2
rotation: 30
- name: gi/beveled-star
source: svg
color: "#dad"
scale: 1.2
- name: gi/beveled-star
source: svg
color: "#aaf"
rotation: 90
- source: xml
scale: 0.5
rotation: 15
- name: gi/perpendicular-rings
source: svg
color: "#ee0"
rotation: 40
scale: 0.9
</yaml_data>
<playcost>2 ACT,
Not Silenced</playcost>
<cp>90</cp>
<duration></duration>
<power>(0 to 3) + MAG</power>
<difficulty>1</difficulty>
<symbol>🎲🔮🌪️</symbol>
<name>Teleport</name>
<image>img:piuy/cute</image>
<range>3 + X</range>
<description>Add 1 Power vs *flying* targets.\
Add Power to *spellrange*.
* Teleport to an empty square in range less or equal to the spellrange of this ability. Does not consume MOV.
* Triggers no movement or ability reactions
* You must have a line-of-sight to the target destination.
* You may teleport to the location of a friendly unit. If you do, the two of you swaps places. Permission required.
</description>
<mastery>-1</mastery>
<component x="7" y="1" db_entry="🧩 Set Ability Name"/>
<component x="9" y="1" db_entry="🧩 Set Image"/>
<component x="11" y="1" db_entry="🧩 Play Cost"/>
<component x="11" y="5" db_entry="🧩 CP Cost"/>
<component x="12" y="4" db_entry="🧩 Duration"/>
<component x="11" y="3" db_entry="🧩 Power"/>
<component x="11" y="4" db_entry="🧩 Difficulty"/>
<component x="12" y="3" db_entry="🧩 Symbols"/>
<component x="12" y="5" db_entry="🧩 Range"/>
<component x="8" y="2" db_entry="🧩 Set Description"/>
<component x="2" y="2" db_entry="🎲 Mastery"/>
<component x="2" y="3" db_entry="🔮 Cast Magic"/>
<component x="2" y="4" db_entry="🌪️ Teleport"/>
<component x="3" y="4" db_entry="🌪️ Greater Teleport"/>
<component x="3" y="3" db_entry="🌪️ Strong vs Flying"/>
<component x="4" y="4" db_entry="🌪️ Swap"/>
<component x="5" y="4" db_entry="🌪️ Blink"/>
</ability_card>

48
cards/222.xml Normal file
View File

@ -0,0 +1,48 @@
<ability_card>
<yaml_data>
style: repertoire
figures:
- name: clip/falling-money-2
source: img
offset: [0.0, -0.4]
- name: effects/uni-slim
source: img
offset: [0.0, 0.1]
scale: 1.6
color: lightgray
rotation: 10
- name: effects/uni-slim
source: img
offset: [0.0, 0.1]
scale: 1.1
- source: xml
</yaml_data>
<name>Repotoire: Superstar</name>
<image>img:piuy/hapa</image>
<playcost></playcost>
<cp>100</cp>
<duration></duration>
<power></power>
<difficulty></difficulty>
<symbol></symbol>
<range></range>
<description>Your Song ability in play gains +3 popularity tokens.
If this is not your first Song or Dance played this combat, it gains another +2 popularity tokens.
*Instead of discarding:* Set this card aside until end of combat</description>
<artistic_value>3</artistic_value>
<component x="7" y="1" db_entry="🧩 Set Ability Name"/>
<component x="9" y="1" db_entry="🧩 Set Image"/>
<component x="11" y="1" db_entry="🧩 Play Cost"/>
<component x="11" y="5" db_entry="🧩 CP Cost"/>
<component x="12" y="4" db_entry="🧩 Duration"/>
<component x="11" y="3" db_entry="🧩 Power"/>
<component x="11" y="4" db_entry="🧩 Difficulty"/>
<component x="12" y="3" db_entry="🧩 Symbols"/>
<component x="12" y="5" db_entry="🧩 Range"/>
<component x="8" y="2" db_entry="🧩 Set Description"/>
<component x="3" y="3" db_entry="🎺 Repertoire Card: Superstar"/>
</ability_card>

64
cards/289.xml Normal file
View File

@ -0,0 +1,64 @@
<ability_card>
<yaml_data>
figures:
- name: bg/skies
source: img
scale: 2
opacity: 0.7
- source: svg
name: gi/magic-swirl
color: purple
opacity: 0.3
scale: 0.9
offset: [0.0, 0.05]
- source: svg
name: gi/big-egg
color: black
opacity: 0.16
rotation: 70
scale: 0.5
offset: [0.0, 0.58]
- source: xml
scale: 0.8
offset: [0.0, 0.1]
- name: "https://i.pinimg.com/originals/53/a7/63/53a763e3cc4ce067ff02ad5b4e09afeb.png"
source: url
scale: 2
color: "#35a"
</yaml_data>
<playcost>2 ACT</playcost>
<cp>33</cp>
<duration>3 + discards on your death</duration>
<power>MAG + (-3 to -1)</power>
<difficulty>(2 to 4)</difficulty>
<symbol>🔮🎲🌪️🌊</symbol>
<name>Rain conduit</name>
<image>img:piuy/ba</image>
<range>102</range>
<description>*Generator on each grid cell in the battlefield.
Roll for each outdoor target. You manipulate time and space using the target as a multidimensional nexus.*
* 🌊 reduces difficulty by 1, 🌊 + 🌪 reduces by 2 total
* Future spells can always consider this target "within spellrange"
* For hostile targets, POWER must exceed the CUNNING
* Gain 1 focus token on your Mana shield card. They are lost whenever it is discarded</description>
<mastery>-1</mastery>
<component x="7" y="1" db_entry="🧩 Set Ability Name"/>
<component x="9" y="1" db_entry="🧩 Set Image"/>
<component x="11" y="1" db_entry="🧩 Play Cost"/>
<component x="11" y="5" db_entry="🧩 CP Cost"/>
<component x="12" y="4" db_entry="🧩 Duration"/>
<component x="11" y="3" db_entry="🧩 Power"/>
<component x="11" y="4" db_entry="🧩 Difficulty"/>
<component x="12" y="3" db_entry="🧩 Symbols"/>
<component x="12" y="5" db_entry="🧩 Range"/>
<component x="8" y="2" db_entry="🧩 Set Description"/>
<component x="2" y="3" db_entry="🔮 Cast Magic"/>
<component x="2" y="2" db_entry="🎲 Mastery"/>
<component x="2" y="4" db_entry="🌊 Rain"/>
<component x="2" y="5" db_entry="🌪️ Conduitivity"/>
<component x="3" y="3" db_entry="🌊 Build Focus"/>
</ability_card>

80
cards/290.xml Normal file
View File

@ -0,0 +1,80 @@
<ability_card>
<yaml_data>
figures:
- source: img
name: bg/ray
scale: 2
color: yellow
- source: img
name: bg/ray
scale: 2
opacity: 0.7
- source: xml
scale: 0.8
offset: [-0.33, 0.04]
opacity: 0.5
- source: xml
scale: 0.8
offset: [-0.21, 0.00]
opacity: 0.5
- source: xml
scale: 0.8
offset: [-0.1, -0.02]
opacity: 0.5
- source: xml
scale: 0.8
offset: [0.0, -0.04]
opacity: 0.5
- source: xml
scale: 0.8
offset: [0.1, -0.02]
- source: xml
scale: 0.8
offset: [0.21, 0.00]
opacity: 0.5
- source: xml
scale: 0.8
offset: [0.33, 0.04]
opacity: 0.5
</yaml_data>
<playcost>2 ACT</playcost>
<cp>169</cp>
<duration>3 + discarded on death</duration>
<power>(-1 to 2) + MAG</power>
<difficulty>1</difficulty>
<symbol>🎲🔮🌪️</symbol>
<name>Spacewarp</name>
<image>img:piuy/dance</image>
<range>4</range>
<description>Add this Spell Zone to the terrain on a target grid cell
* If target has Conduitivity cast by you: +1 POWER
* Between two chain targets,
draw line between centers, hit every grid cell touched by line. "
**Enforced Trigger:** *A unit exist in the zone.*
While in this zone, you are always considered in melee range to all units in a connected gravity zone.</description>
<mastery>-1</mastery>
<component x="7" y="1" db_entry="🧩 Set Ability Name"/>
<component x="9" y="1" db_entry="🧩 Set Image"/>
<component x="11" y="1" db_entry="🧩 Play Cost"/>
<component x="11" y="5" db_entry="🧩 CP Cost"/>
<component x="12" y="4" db_entry="🧩 Duration"/>
<component x="11" y="3" db_entry="🧩 Power"/>
<component x="11" y="4" db_entry="🧩 Difficulty"/>
<component x="12" y="3" db_entry="🧩 Symbols"/>
<component x="12" y="5" db_entry="🧩 Range"/>
<component x="8" y="2" db_entry="🧩 Set Description"/>
<component x="2" y="2" db_entry="🎲 Mastery"/>
<component x="2" y="5" db_entry="🔮 Create Zone"/>
<component x="2" y="3" db_entry="🔮 Cast Magic"/>
<component x="2" y="4" db_entry="🔮 Touch"/>
<component x="2" y="6" db_entry="🌪️ Gravity Zone"/>
<component x="3" y="6" db_entry="🌪️ Spacewarp"/>
<component x="4" y="3" db_entry="🌪️ Chain"/>
<component x="5" y="3" db_entry="🌪️ Arc"/>
<component x="3" y="3" db_entry="🌪️ Power Conduit"/>
</ability_card>

75
cards/295.xml Normal file
View File

@ -0,0 +1,75 @@
<ability_card>
<yaml_data>
figures:
- source: img
name: bg/castle
scale: 2
color: "#202"
- source: img
name: bg/castle
scale: 4
offset: [0, -0.8]
opacity: 0.8
- source: xml
scale: 0.8
offset: [0.6, 0]
rotation: -20
- source: xml
scale: 0.8
offset: [0.6, 0]
rotation: -20
opacity: 0.1
color: "#8b0"
- source: img
name: clip/fire
color: "#666"
scale: 3.2
flip_x: true
offset: [0.0, -0.2]
- source: img
name: clip/fire
color: darkgray
scale: 3
offset: [0.0, -0.2]
</yaml_data>
<playcost>2 ACT,
Not Silenced</playcost>
<cp>68</cp>
<duration>3 + discarded on death</duration>
<power>(-1 to 2) + MAG</power>
<difficulty>1</difficulty>
<symbol>🎲🔮🌊</symbol>
<name>Smokescreen</name>
<image>img:piuy/wave</image>
<range>4</range>
<description>Add this Spell Zone to the terrain on a target grid cell
* If target has Conduitivity cast by you: +1 POWER
* Between two chain targets,
draw line between centers, hit every grid cell touched by line. "
**Enforced Trigger:** *A unit exist in the zone.*
While in this zone, you are always considered in melee range to all units in a connected gravity zone.</description>
<mastery>-1</mastery>
<component x="7" y="1" db_entry="🧩 Set Ability Name"/>
<component x="9" y="1" db_entry="🧩 Set Image"/>
<component x="11" y="1" db_entry="🧩 Play Cost"/>
<component x="11" y="5" db_entry="🧩 CP Cost"/>
<component x="12" y="4" db_entry="🧩 Duration"/>
<component x="11" y="3" db_entry="🧩 Power"/>
<component x="11" y="4" db_entry="🧩 Difficulty"/>
<component x="12" y="3" db_entry="🧩 Symbols"/>
<component x="12" y="5" db_entry="🧩 Range"/>
<component x="8" y="2" db_entry="🧩 Set Description"/>
<component x="2" y="2" db_entry="🎲 Mastery"/>
<component x="2" y="5" db_entry="🔮 Create Zone"/>
<component x="2" y="3" db_entry="🔮 Cast Magic"/>
<component x="2" y="4" db_entry="🔮 Touch"/>
<component x="4" y="3" db_entry="🌪️ Chain"/>
<component x="5" y="3" db_entry="🌪️ Arc"/>
<component x="3" y="3" db_entry="🌪️ Power Conduit"/>
<component x="2" y="6" db_entry="🌊 Smokescreen"/>
</ability_card>

View File

@ -1,23 +1,18 @@
<ability_card>
<yaml_data>
style: repertoire
figures:
- name: effects/uni-slim
source: img
scale: 1.8
</yaml_data>
<name>Repotoire: Exiting</name>
<image>img:piuy/hapi</image>
<playcost></playcost>
<cp>10</cp>
<cp></cp>
<duration></duration>
<power></power>
<difficulty></difficulty>
<symbol></symbol>
<name>BASE</name>
<image>img:piuy/haha</image>
<range></range>
<description>Gain 3 SP, assuming your hit points card can hold them.</description>
<artistic_value>1</artistic_value>
<description></description>
<component x="7" y="1" db_entry="🧩 Set Ability Name"/>
<component x="9" y="1" db_entry="🧩 Set Image"/>
@ -29,6 +24,5 @@ figures:
<component x="12" y="3" db_entry="🧩 Symbols"/>
<component x="12" y="5" db_entry="🧩 Range"/>
<component x="8" y="2" db_entry="🧩 Set Description"/>
<component x="3" y="3" db_entry="🎺 Repertoire Card: Exciting"/>
</ability_card>

View File

@ -2,28 +2,63 @@
<yaml_data>
figures:
- name: bg/royal3
source: img
scale: 2
opacity: 0.9
- name: gi/party-flags
source: svg
color: goldenrod
offset: [-0.8, -0.3]
flip_x: true
rotation: -36
- name: gi/party-flags
source: svg
color: goldenrod
offset: [0.8, -0.3]
rotation: 36
- name: effects/uni-white
source: img
color: white
- source: xml
flip_x: true
scale: 0.9
- name: items/starbucks
source: img
scale: 0.3
rotation: -10
offset: [-0.3, -0.2]
- name: gi/hand-ok
source: svg
flip_x: true
scale: 0.3
rotation: 120
color: lightgray
offset: [0.43, 0.08]
</yaml_data>
<name>Pop Song</name>
<image>img:piuy/sing</image>
<playcost>2 ACT,
not silenced,
Encore! card per turn</playcost>
<cp>81</cp>
Encore! card per turn,
MOV</playcost>
<cp>122</cp>
<duration>1 + discarded on death</duration>
<power>(0 to 4) + TEC</power>
<power>(2 to 6) + TEC</power>
<difficulty>1</difficulty>
<symbol>🎲🎺</symbol>
<description>All units (friends and foes) gain +1 MOV per 3 popularity tokens on the song.
+2 power to this ability if you have the **High Ground** or **Flying** status effect.
The song starts at 2 popularity tokens.\
+2 POWER if *flying* or *High Ground*
When you play this song with another of your songs in play, you transition from your old song to your new song.
Your song does not affect non-sentient units</description>
Your song does not affect non-sentient units\
This may stack on existing performances.</description>
<mastery>-1</mastery>
<component x="2" y="2" db_entry="🎲 Mastery"/>
<component x="2" y="3" db_entry="🎺 Song"/>
<component x="4" y="3" db_entry="🎺 Staged Song"/>
<component x="5" y="3" db_entry="🎺 Staged Song"/>
<component x="7" y="1" db_entry="🧩 Set Ability Name"/>
<component x="9" y="1" db_entry="🧩 Set Image"/>
<component x="11" y="1" db_entry="🧩 Play Cost"/>
@ -35,6 +70,7 @@ Your song does not affect non-sentient units</description>
<component x="8" y="2" db_entry="🧩 Set Description"/>
<component x="3" y="3" db_entry="🎺 Monster Mash"/>
<component x="2" y="4" db_entry="🎺 Pop Song"/>
<component x="5" y="3" db_entry="🎺 Encore!"/>
<component x="6" y="3" db_entry="🎺 Encore!"/>
<component x="4" y="3" db_entry="🎺 Put effort into it"/>
</ability_card>

View File

@ -1,32 +1,62 @@
<ability_card>
<yaml_data>
style: repertoire
figures:
- name: piuy/hapa
scale: 0.8
- name: bg/flowers
source: img
offset:
- -0.25
- 0
- name: piuy/hapi
scale: 2
- name: gi/glass-heart
source: svg
offset: [-0.0, -0.15]
scale: 0.75
color: steelblue
- name: gi/glass-heart
source: svg
offset: [-0.0, -0.16]
scale: 0.7
color: MediumOrchid
- name: gi/heart-inside
source: svg
offset: [0.38, 0.1]
color: navy
rotation: 10
scale: 0.8
offset:
- 0.25
- 0
- name: effects/uni-white
source: img
</yaml_data>
<name>Repotoire: Entralling</name>
<playcost></playcost>
<cp>25</cp>
<duration></duration>
<power></power>
<difficulty></difficulty>
<symbol></symbol>
<range></range>
<description>One of your song or dance abilities in play gains +1 duration tokens.</description>
<artistic_value>2</artistic_value>
scale: 0.8
color: purple
offset: [-0.37, 0.16]
- source: xml
scale: 0.6
offset: [-0.37, 0.1]
</yaml_data>
<name>Love Song</name>
<image>img:piuy/sing</image>
<playcost>2 ACT,
not silenced,
Encore! card per turn,
MOV</playcost>
<cp>98</cp>
<duration>1 + discarded on death</duration>
<power>(2 to 6) + TEC</power>
<difficulty>1</difficulty>
<symbol>🎲🎺</symbol>
<description>All units (friends and foes) restore 1
HP per popularity token on the song at the start of their turn.
The song starts at 2 popularity tokens.\
+2 POWER if *flying* or *High Ground*
Your song does not affect non-sentient units\
This may stack on existing performances.
</description>
<mastery>-1</mastery>
<component x="2" y="2" db_entry="🎲 Mastery"/>
<component x="2" y="3" db_entry="🎺 Song"/>
<component x="5" y="3" db_entry="🎺 Staged Song"/>
<component x="2" y="4" db_entry="🎺 Love Song"/>
<component x="7" y="1" db_entry="🧩 Set Ability Name"/>
<component x="9" y="1" db_entry="🧩 Set Image"/>
<component x="11" y="1" db_entry="🧩 Play Cost"/>
@ -35,8 +65,9 @@ figures:
<component x="11" y="3" db_entry="🧩 Power"/>
<component x="11" y="4" db_entry="🧩 Difficulty"/>
<component x="12" y="3" db_entry="🧩 Symbols"/>
<component x="12" y="5" db_entry="🧩 Range"/>
<component x="8" y="2" db_entry="🧩 Set Description"/>
<component x="3" y="2" db_entry="🎺 Repertoire Card: Enthralling"/>
<component x="3" y="3" db_entry="🎺 Monster Mash"/>
<component x="6" y="3" db_entry="🎺 Encore!"/>
<component x="4" y="3" db_entry="🎺 Put effort into it"/>
</ability_card>

View File

@ -1,28 +1,48 @@
<ability_card>
<yaml_data>
style: repertoire
figures:
- name: google/android-4.3/pile-of-poo
- name: "https://comps.canstockphoto.com/light-rays-neon-radial-lines-background-vector-clipart_csp58176606.jpg"
source: url
scale: 2
opacity: 0.8
- name: clip/falling-money-2
source: img
offset: [0.0, -0.5]
scale: 1.6
color: "#00ff40"
- name: clip/falling-money-2
source: img
offset: [0.0, -0.5]
scale: 1.6
opacity: 0.95
- name: piuy/twirl
source: img
offset: [0.0, 0.1]
scale: 1.1
- name: softbank/trophy
source: emoji
color: gray
scale: 0.23
rotation: 30
offset: [-0.2, 0.2]
</yaml_data>
<name>Repotoire: Filler</name>
<image>img:piuy/hapo</image>
<playcost></playcost>
<cp>1</cp>
<duration></duration>
<power></power>
<difficulty></difficulty>
<symbol></symbol>
<range></range>
<description>This card does nothing.
offset: [0.58, 0.23]
scale: 0.5
rotation: 20
- name: softbank/trophy
source: emoji
offset: [-0.58, 0.23]
scale: 0.5
rotation: -20
*Bummer.*</description>
<artistic_value>-1</artistic_value>
</yaml_data>
<playcost>2 MOV</playcost>
<cp>23</cp>
<duration>per 3 power of this ability (rounded down) + Discarded on death</duration>
<power>0 or + (2 to 5) + TEC</power>
<difficulty>1</difficulty>
<symbol>🎲🎺</symbol>
<name>Victory Dance</name>
<description>If this is active at the end of combat, you (and only you) gain +10% CP from the encounter.
+3 power to this ability if you have the **High Ground** or **Flying** status effect when playing this card.</description>
<range></range>
<component x="7" y="1" db_entry="🧩 Set Ability Name"/>
<component x="9" y="1" db_entry="🧩 Set Image"/>
@ -34,6 +54,10 @@ figures:
<component x="12" y="3" db_entry="🧩 Symbols"/>
<component x="12" y="5" db_entry="🧩 Range"/>
<component x="8" y="2" db_entry="🧩 Set Description"/>
<component x="3" y="3" db_entry="🎺 Repertoire Card: Filler"/>
<component x="2" y="2" db_entry="🎲 Mastery"/>
<component x="2" y="3" db_entry="🎺 Dance"/>
<component x="3" y="3" db_entry="🎺 Staged Dance"/>
<component x="2" y="4" db_entry="🎺 Victory Dance"/>
</ability_card>

View File

@ -2,30 +2,47 @@
<yaml_data>
figures:
- source: img
name: bg/royal3
scale: 3
color: teal
opacity: 0.1
- source: img
name: bg/royal3
scale: 3
opacity: 0.2
- name: gi/abstract-037
source: svg
rotation: 90
color: "#aaf"
scale: [1, 1.5]
- source: xml
scale: 0.7
rotation: -10
- name: gi/european-flag
source: svg
color: PaleVioletRed
scale: 1.3
</yaml_data>
<name>Love Song</name>
<image>img:piuy/sing</image>
<playcost>2 ACT,
not silenced,
Encore! card per turn</playcost>
<cp>65</cp>
<duration>1 + discarded on death</duration>
<power>(0 to 4) + TEC</power>
<difficulty>1</difficulty>
<symbol>🎲🎺</symbol>
<description>All units (friends and foes) restore 1
HP per popularity token on the song at the start of their turn.
<playcost></playcost>
<cp>10</cp>
<duration>Permanent + discarded on death</duration>
<power>2 MIND</power>
<difficulty></difficulty>
<symbol>🔮</symbol>
<name>Mana Shield</name>
<description>*Starts in your play area rather than your deck*
+2 power to this ability if you have the **High Ground** or **Flying** status effect.
Max capacity is POWER.
Cannot be restored by healing.
When you play this song with another of your songs in play, you transition from your old song to your new song.
**Defensive Trigger: take damage**
* You cannot activate this if affected by the topple status effect.
* You cannot activate this after playing other defensive triggers, per damage source.
* Remove 1 Mana Shield token to decrease the incoming damage by 1. Repeat as needed.</description>
<image>img:piuy/color</image>
<range></range>
Your song does not affect non-sentient units</description>
<component x="2" y="2" db_entry="🎲 Mastery"/>
<component x="2" y="3" db_entry="🎺 Song"/>
<component x="4" y="3" db_entry="🎺 Staged Song"/>
<component x="2" y="4" db_entry="🎺 Love Song"/>
<component x="7" y="1" db_entry="🧩 Set Ability Name"/>
<component x="9" y="1" db_entry="🧩 Set Image"/>
<component x="11" y="1" db_entry="🧩 Play Cost"/>
@ -34,8 +51,8 @@ Your song does not affect non-sentient units</description>
<component x="11" y="3" db_entry="🧩 Power"/>
<component x="11" y="4" db_entry="🧩 Difficulty"/>
<component x="12" y="3" db_entry="🧩 Symbols"/>
<component x="12" y="5" db_entry="🧩 Range"/>
<component x="8" y="2" db_entry="🧩 Set Description"/>
<component x="3" y="3" db_entry="🎺 Monster Mash"/>
<component x="5" y="3" db_entry="🎺 Encore!"/>
<component x="2" y="2" db_entry="🔮 Mana Shield"/>
</ability_card>

View File

@ -2,47 +2,32 @@
<yaml_data>
figures:
- name: "https://comps.canstockphoto.com/light-rays-neon-radial-lines-background-vector-clipart_csp58176606.jpg"
source: url
- name: bg/flowers
source: img
scale: 2
opacity: 0.8
- name: clip/falling-money-2
opacity: 0.4
- name: piuy/hi
source: img
offset: [0.0, -0.5]
scale: 1.6
color: "#00ff40"
- name: clip/falling-money-2
source: img
offset: [0.0, -0.5]
scale: 1.6
opacity: 0.95
- name: piuy/twirl
source: img
offset: [0.0, 0.1]
scale: 1.1
- name: softbank/trophy
source: emoji
offset: [0.58, 0.23]
scale: 0.5
rotation: 20
- name: softbank/trophy
source: emoji
offset: [-0.58, 0.23]
scale: 0.5
rotation: -20
</yaml_data>
<playcost>2 MOV</playcost>
<cp>23</cp>
<duration>per 3 power of this ability (rounded down) + Discarded on death</duration>
<power>0 or + (2 to 5) + TEC</power>
<difficulty>1</difficulty>
<symbol>🎲🎺</symbol>
<name>Victory Dance</name>
<description>If this is active at the end of combat, you (and only you) gain +10% CP from the encounter.
+3 power to this ability if you have the **High Ground** or **Flying** status effect when playing this card.</description>
<name>Piuy!</name>
<cp>20</cp>
<symbol>⚔️🎲</symbol>
<duration>Permanent + discarded on death</duration>
<playcost>0 ACT</playcost>
<power>3 BODY + ⚔️ LevelUp Benefit</power>
<difficulty></difficulty>
<range></range>
<description>| | | | | | | | |
| --------:| ---:| --- | ------------:| ---:| --- | ---:| ---:|
| **ATT**: | 2 | | **BODY**: | 4 | | ⚔️: | lv1 |
| **MAG**: | 3 | | **MIND**: | 5 | | 🔮: | lv1 |
| **TEC**: | 3 | | **CUNNING**: | 5 | | 🎲: | lv3 |
| **ACT**: | 5 | | **MOV**: | 5 | | 🎺: | lv5 |
| **HP**: | 12 | | 🌊: | lv1 | | 🌪: | lv1 |
| **SP**: | ∞ |
</description>
<component x="7" y="1" db_entry="🧩 Set Ability Name"/>
<component x="9" y="1" db_entry="🧩 Set Image"/>
@ -54,9 +39,7 @@ figures:
<component x="12" y="3" db_entry="🧩 Symbols"/>
<component x="12" y="5" db_entry="🧩 Range"/>
<component x="8" y="2" db_entry="🧩 Set Description"/>
<component x="2" y="2" db_entry="🎲 Mastery"/>
<component x="2" y="3" db_entry="🎺 Dance"/>
<component x="3" y="3" db_entry="🎺 Staged Dance"/>
<component x="2" y="4" db_entry="🎺 Victory Dance"/>
<component x="3" y="2" db_entry="⚔️ Hit Points"/>
<component x="3" y="3" db_entry="🎲 Skill Points"/>
</ability_card>

View File

@ -1,4 +1,4 @@
{% set xml_image_note_done = [1] %}{# why must nunjucks suck so much? #}
{% set xml_image_not_done = [1] %}{# why must nunjucks suck so much? #}
{% macro figure_layer(figure) %}
{% set figure_style %}{% filter cull_whitespace %}
@ -31,7 +31,7 @@
{% if figure.source == "xml" %}
{% set figure_name = xml.image if xml.image | startswith("http") else xml.image | split(":") | tail | join(":") %}
{% set figure_source = "url" if xml.image | startswith("http") else xml.image | split(":") | first %}
{% if xml_image_note_done.clear() %}{% endif %}
{% if xml_image_not_done.pop() %}{% endif %}
{% else %}
{% set figure_name = figure.name %}
{% set figure_source = figure.source %}
@ -98,7 +98,7 @@
{% for figure in yaml.figures or [] %}
{{ figure_layer(figure) }}
{% endfor %}
{% if xml.image and xml_image_note_done %}
{% if xml.image and xml_image_not_done | length %}
{{ figure_layer({
'name': xml.image if xml.image | startswith("http") else xml.image | split(":") | tail | join(":"),
'source': "url" if xml.image | startswith("http") else xml.image | split(":") | first
@ -167,10 +167,10 @@
{% endif %}
{% if yaml.description %}
<center>{{ yaml.description | markdown | safe }}</center>
<div class="markdown">{{ yaml.description | markdown | safe }}</div>
{% endif %}
{% if xml.description %}
<center>{{ xml.description | markdown | safe }}</center>
<div class="markdown">{{ xml.description | markdown | safe }}</div>
{% endif %}
{% if yaml.steps %}
@ -180,6 +180,15 @@
{% endfor %}
</ul>
{% endif %}
<div class="bottom" style="text-align: center; font-size:1.6em;">
{% for component in xml.components %}
{% if component["@db_entry"] | endswith("Mastery") %}
&#x274F; &#x274F; &#x274F; &#x274F; &#x274F;
&#x274F; &#x274F; &#x274F; &#x274F; &#x274F; <br>
{% endif %}
{% endfor %}
</div>
</div>
</div>

View File

@ -49,6 +49,9 @@ env.addFilter('all', function(iterable) {
env.addFilter('startswith', function(string, match) {
return string.slice(0, match.length) === match;
});
env.addFilter('endswith', function(string, match) {
return string.endsWith(match);
});
env.addFilter('tail', function(sequence) {
return sequence.slice(1);
});

View File

@ -2,14 +2,32 @@
--figure-size: 0.9in;
--figure-size: 1.35in;
--figure-size: 1.5in;
--color-border: MidnightBlue;
--color-bg-figure: white;
--color-bg: PaleTurquoise; // PaleTurquoise;
--color-bg-body: LightCyan; // PaleTurquoise;
--color-bg-frame: PaleTurquoise; // LightSkyBlue;
--color-bg-costbar: SandyBrown; // DarkOrange;
--color-text-title: MidnightBlue;
--color-text-body: black;
--color-text-costbar: white;
--color-shadow-costbar: 0.08em 0 0.05em Maroon,
-0.08em 0 0.05em Maroon,
0 0.08em 0.05em Maroon,
0 -0.08em 0.05em Maroon;
--figure-color: #555;
width: 2.5in;
height: 3.5in;
box-sizing: border-box;
border-radius: 0mm;
border-width: 0.3mm;
border-color: black;
border-color: var(--color-border);
border-style: solid;
background-color: #fff;
background-color: var(--color-bg);
overflow: hidden;
font-size: 2.5mm;
@ -25,35 +43,38 @@
"description description";
header {
font-family: montserrat, sans-serif;
font-style: normal;
font-weight: 200;
grid-area: title;
font-size: 1.8em;
line-height: 1em;
margin-left: -1em;
border-radius: 1mm 1mm 0 0;
text-align: center;
background-color: #ddd;
background-color: var(--color-bg-frame);
border-radius: 0;
color: #333;
color: var(--color-text-title);
}
.symbol {
grid-area: symbol;
text-align: center;
background-color: #ddd;
color: #333;
background-color: var(--color-bg-frame);
color: var(--color-text-title);
padding-top: 0.6mm;
padding-left: 0.8mm;
white-space: nowrap;
}
figure {
grid-area: figure;
background-color: #fff;
background-color: var(--color-bg-figure);
overflow: hidden;
position: relative;
border-radius: 0;
margin: 0;
.layer {
--figure-color: #555;
color: var(--figure-color);
position: absolute;
top:0;right:0;left:0;bottom:0;
@ -90,7 +111,7 @@
.playcosts {
grid-area: playcosts;
border-left: solid 0.3mm #ccc;
background-color: #ddd;
background-color: var(--color-bg-frame);
color: #444 ;
padding: 0.5mm;
ul {
@ -106,8 +127,9 @@
.costbar {
grid-area: costbar;
border-radius: 0;
background-color: #555;
color: white;
background-color: var(--color-bg-costbar);
color: var(--color-text-costbar);
text-shadow: var(--color-shadow-costbar);
display: flex;
flex-direction: row;
flex-wrap: nowrap;
@ -119,8 +141,8 @@
section{
font-size: 0.8em;
margin-left: 0.5mm;
margin-right: 0.5mm;
margin-left: 0.8mm;
margin-right: 0.8mm;
line-height: 0.9em;
}
}
@ -128,8 +150,29 @@
grid-area: description;
margin: 1mm;
border-radius: 1mm;
background-color: #ddd;
background-color: var(--color-bg-body);
color: var(--color-text-body);
font-size: 0.9em;
position: relative;
.markdown {
text-align: center;
table {
margin-top:-0.3em;
margin-left:auto;
margin-right:auto;
th, td {
font-size: 2.5mm; /* user agent style override */
}
}
p + table {
margin-top:-1em;
}
li {
text-align: left;
}
}
ul, ol {
padding-left: 1.5em;
@ -137,10 +180,17 @@
}
}
.bottom {
position: absolute;
bottom:0;
left:0;
right:0;
}
}
}
.fjomp_card.item,
.fjomp_card.figure,
.fjomp_card.repertoire {
--figure-size: 2.4in;

34
sync.py
View File

@ -9,8 +9,10 @@ import requests.packages.urllib3.util.connection as urllib3_cn
import socket
import xmltodict
MY_COLLECTION = "Fjompens fjomperi"
MY_ID = "26"
MY_COLLECTIONS = {
"26" : "Fjompens fjomperi",
"48" : "Fjompens Fjomperi - not in deck",
}
AUTH = None
CARD_STYLE = 6 # Fjompens's card style
@ -22,11 +24,11 @@ CARD_STYLE = 6 # Fjompens's card style
## return family
##urllib3_cn.allowed_gai_family = allowed_gai_family
def get_card_ids():
def get_card_ids(): # generator
resp = requests.get("https://www.pvv.ntnu.no/~andreasd/cards/command.php?cmd=get_all_cards", auth=AUTH)
for collection in resp.json():
if collection["name"] == MY_COLLECTION and collection["id"] == MY_ID:
return collection["cards"]
if MY_COLLECTIONS.get(collection["id"]) == collection["name"]:
yield from collection["cards"]
def get_card_xml(card_id:int):
resp = requests.get(f"https://www.pvv.ntnu.no/~andreasd/cards/command.php?cmd=get_card_xml&id={card_id}", auth=AUTH)
@ -66,8 +68,8 @@ def list_collections():
resp = requests.get("https://www.pvv.ntnu.no/~andreasd/cards/command.php?cmd=get_all_cards", auth=AUTH)
print("== All collections: ==\n")
for i in resp.json():
print("id: ", i["id"])
print("name: ", i["name"])
print("collection_id: ", i["id"])
print("collection_name: ", i["name"])
print("cards: ", i["cards"])
print("card styles: ", sorted(set(map(int, e.map(get_card_style_id, i["cards"])))))
print()
@ -88,14 +90,14 @@ def pull_all():
except:
xml = None
if xml and "ability_card" in xml:
if "yaml_data" in xml["ability_card"]:
if len(xml["ability_card"].keys()) == 1:
yaml_data = xml["ability_card"]["yaml_data"]
with open(f"cards/{card_id}.yaml", "w") as f:
f.write(yaml_data + "\n")
print(f"./cards/{card_id}.yaml written!")
continue
#if xml and "ability_card" in xml:
# if "yaml_data" in xml["ability_card"]:
# if len(xml["ability_card"].keys()) == 1:
# yaml_data = xml["ability_card"]["yaml_data"]
# with open(f"cards/{card_id}.yaml", "w") as f:
# f.write(yaml_data + "\n")
# print(f"./cards/{card_id}.yaml written!")
# continue
ftype = "xml" if data.strip() else "yaml"
with open(f"cards/{card_id}.{ftype}", "w") as f:
f.write(data + "\n")
@ -105,7 +107,7 @@ def push_all():
existing_card_ids = get_card_ids()
for card_id in existing_card_ids:
if os.path.isfile(f"cards/{card_id}.yaml"):
if os.path.isfile(f"cards/{card_id}.yaml"): # deprecated, will no be written anymore
fname = f"cards/{card_id}.yaml"
with open(fname) as f:
yaml_data = f.read()

49
templates/all.html.j2 Normal file
View File

@ -0,0 +1,49 @@
<style>
@page
{
size: auto;
margin: 0.5cm;
}
body {
background-color: white;
margin: 0;
padding: 0;
-webkit-print-color-adjust: exact;
}
.card_wrapper {
width: 2.5in;
height: 3.5in;
float: left;
border: 1px solid transparent;
page-break-inside: avoid;
position: relative;
}
.card_cover,
iframe {
position: absolute;
top:0;
left:0;
width:2.5in;
height:3.5in;
margin: none;
padding: none;
border: none;
}
.card_cover {
cursor: pointer;
}
</style>
<div>
{% for cardname in cards %}
<div class="card_wrapper">
<iframe src="{{ cardname }}" scrolling=no></iframe>
<div class="card_cover" onclick='window.location = {{cardname|tojson}}'></div>
</div>
{% endfor %}
</div>

View File

@ -1,5 +0,0 @@
<ability_card><yaml_data>
{{ data.strip() }}
</yaml_data>
{{ xml_data }}
</ability_card>

View File

@ -1,32 +1,5 @@
{% set async = "media=\"none\" onload=\"if(media!='all')media='all'\"" -%}
{% if is_local %}
{#
<meta http-equiv="refresh" content="1.0">
<script type="text/javascript" src="http://livejs.com/live.js"></script>
#}
<script type="text/javascript">
var selected = 0;
document.onkeydown = function(e) {
if (e.which == 39) {
if (document.getElementById("card_container_" + (selected+1))) {
selected += 1;
}
document.getElementById("card_container_" + selected).scrollIntoView();
}
if (e.which == 37) {
if (selected > 0) {
selected -= 1;
}
document.getElementById("card_container_" + selected).scrollIntoView();
}
};
</script>
{% endif %}
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/js-yaml/3.13.1/js-yaml.min.js"></script>
<script type="text/javascript" src="https://mozilla.github.io/nunjucks/files/nunjucks.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/markdown-it/9.1.0/markdown-it.min.js"></script>
@ -39,8 +12,4 @@
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" {{async}}/>
<link rel="stylesheet" href="https://cdn.linearicons.com/free/1.0.0/icon-font.min.css" {{async}}/>
{% if css_data %}
<style type="text/css">
{{ css_data.strip() }}
</style>
{% endif %}
<link rel="stylesheet" href='https://fonts.googleapis.com/css?family=Montserrat'>

View File

@ -22,7 +22,7 @@
</head>
{% endfilter %}
<body content_type="html5">
<body content_type="html5" style="margin:0px;">
<style type="text/css">
{{ css_data.strip() }}

View File

@ -1,5 +1,37 @@
<ability_card><yaml_data>
name: Hit enemy
#style: item
tags:
- combat
playcost:
- 'Element: fire'
- 'BODY+5 POWER'
#flavor: Enemies sure are squishy
#description: Perform an attack
#steps:
#- Do A
#- Do A
#- Do A
#- Then B
figures:
- name: piuy/chicken
source: img
scale: 2
notes: ''
</yaml_data>
<name>Mega Fireball</name>
<description>Attack an enemy in range 5.
<description>
| | |
| ----:|----|
| asd | asd |
| asd | asd |
# asd
Attack an enemy in range 5.
Roll MAG hit dice. Deal that amount of FIRE damage to the target.</description>
<image>https://freepngimg.com/download/fireball/27487-2-fireball-clipart.png</image>
@ -15,6 +47,7 @@ Not Silenced,
Equipment has Catalyst property</playcost>
<artistic_value>-1</artistic_value>
<component x="11" y="3" db_entry="🧩 Mastery"/>
<component x="7" y="1" db_entry="🧩 Set Ability Name"/>
<component x="9" y="1" db_entry="🧩 Set Image"/>
<component x="11" y="1" db_entry="🧩 Play Cost"/>
@ -26,3 +59,5 @@ Equipment has Catalyst property</playcost>
<component x="12" y="5" db_entry="🧩 Range"/>
<component x="8" y="2" db_entry="🧩 Set Description"/>
<component x="3" y="3" db_entry="🎺 Repertoire Card: Filler"/>
</ability_card>

View File

@ -1,19 +0,0 @@
name: Hit enemy
#style: item
tags:
- combat
playcost:
- 'Element: fire'
- BODY+5 POWER
#flavor: Enemies sure are squishy
description: Perform an attack
#steps:
#- Do A
#- Do A
#- Do A
#- Then B
figures:
- name: piuy/chicken
source: img
scale: 2
notes: ''