Where values are relative sizes for each column. Sizes of 0 zeros are ignored. so ex. 3,1,3 will have left and right columns that are 3 times wider than central column.
previous methods of creating tables, namely <<<< and <<|number| , still create equal-width columns.
all methods still allow pipes | , to advance columns.
Ex. These three lines of codes produce identical tables of two columns of equal widths
Some sections may have an array called "split" that splits a section into several parts, delimited in its "*url" or "*text" fields by double semicolons ;;. Additional options can alter the parameters for each part. Such as placing them at different locations, or alignments, or angle. (Split doesn't cut an image into smaller parts. Rather, you can provide several URLs delimited by ;; and they will be all drawn on the card.)
"split" array holds more "options" objects. Options after the first one only need to specify the parameters that differ from the previous. All parameters will carry to subsequent parts unless altered again. If no parameters differ, provide an empty object, to denote an extra part exists.
The first options object can be outside or inside the split array. If outside, it must still be called "options". But objects inside the array do not and should not be named.
Ex. first options inside split. total 4 parts, all inside.
Where manacost field contains four parts, like "g;;w;;u;;b"
; allow text outlines ; outlinecolor, outlineratio
; allow shadow width multiplier ; shadowratio
; allow turn text into all upper- or lower-case ; allupper, alllower
outlinecolor is HTML hex code (Ex. #00FF00)
outlineratio is multiplied by font size to create outline width. Default is 0.01
shadowratio is multiplied by font size to create shadow width. Default is 0.075
allupper is true or false. Default false.
alllower is true or false. Default false.
allupper has precedence over alllower
; frame_custom ; conditions to match before drawing section
A section may have an optional array named "if". The section will only be drawn and appear on the card, if the "if" conditions are met. Each condition is represented by an array.
The root "if" is a nested array of any depth. Two basic types of condition arrays: boolean logic operators; and special functions to test the card's properties.
(In these examples, lines that begin with double parentheses (( , act as comments, and are allowed within VON files.)
Ex.
{
,section,overlay
[if
(( is planeswalker
[,iscardtype,true,7]
]
}
[hr]
Possible boolean operators are (at the time of this writing): AND, OR, NOT.
AND takes any number of conditions. All conditions must be met for this AND to return true.
Note the root "if" is essentially an AND condition. In this case, you must NOT prefix it with an AND declaration.
Other condition arrays are functions to test a card's property or other logic. These arrays have the following basic layout:
array[0] = the function's name
array[1] = the desired result, in boolean. See table below for valid boolean values.
array[...] = the remaining elements are parameters passed to the function, if necessary
List of Booleans
true,false
1,0
yes,no
on,off
The following functions are valid (at the time of this writing).
"iscardtype" takes an integer that corresponds to the card's type. This value can be found in the same order as the form in the card creator's page. Start counting from 0. (0 = tribal)
Ex. is a land
[,iscardtype,yes,3]
Ex. NOT a land
[,iscardtype,no,3]
"issupertype" takes an integer that corresponds to the card's supertype. This value can be found in the same order as the form in the card creator's page. Start counting from 0. (0 = legendary)
Ex. is basic
[,issupertype,yes,1]
Ex. NOT basic
[,issupertype,no,1]
"isintext" matches a pattern within a card's property.
List of Properties and Aliases
,cardname,name
,manacost,cost,mana
,powertoughness,pt,loyalty,stat
,subtype
,extra
,rulestext,rules
,flavortext,flavor
,seticon
,typeicon
,watermark
,overlay
,art
,artist
,creator
Patterns must be enclosed in identical delimiters. Legal delimiters are symbols such as "/|~#
Patterns may have modifiers after the second delimiter. A common one is "i" modifier, that matches both upper and lower case (makes the pattern case insensitive.)
List of Modifiers
((Modifier)) ((Usage))
`i`Case insensitive
Use section type "rulespw" and "ruleslevel" to print rules for Planeswalkers and Levelers, respectively. They act like rules section, but also take extra pertinent options.
Behoove to use conditions to make such sections only appear for relevant cards.
"rulespw" has extra options to customize the loyalty costs and lines that divide the abilities.
Use section "textlevel" to split the text across several parts. The text box will be divided evenly by the number of parts created by double semicolons ;;. Text will appear on the same row.
Extra options include "strokew" to define the width of the dividing lines, and "addflavor" which adds another part if flavor text is provided by the card. This latter is particularly useful if this text is placed alongside the rules box, and has an angle of 90 or 270 (which rotates the text clockwise by that many degrees).
; frame_vogonhd, vogonvt ; bigger mana cost symbols
; cardfuncs ; multi-column tables ; using <<|C|, where C = number of columns ; subsequent pipes | will advance to next column ; pipes will create new rows when it reaches last column
Behavior for <<<< and >>>> are unchanged. These will create exactly two-column tables. Except pipes can also be used to advance these columns, and new rows if necessary.
All columns on the same row will have equal width.
Examples:
(Empty square brackets [] is used facilitate indentation.)
; allows custom frames ; accept URL to .von and .json files
Design your own frames. Arrange elements anywhere on the card as you please. Customize font sizes, arrange texts, resize art elements, select background images.
Choose "Custom" from the "Frame" drop down menu. Then, in the "Custom Frame" input field, provide a URL to a .von or .json file, that defines your custom frame.
Also see attached sample images resulting from these custom frames.
Basic layout of the frame definition files is an array composed of sections (which are objects or hashes). The sections are drawn and painted on the card in the same order in the root array. So rearrange, add, or remove sections as you please.
Each section must state a section type. Each type has their own options parameters. Use "cf-0.von" as template; it contains most common options you may need for every section. Eventually I would write more detailed instructions in a dedicated help page.
Section types may be repeated. For instance, a text section to print the card name, and another text section to print card type. (Warning: Meta section should not be repeated. This creates a new image and undoes all previous sections. )
Text section prints everything on a single line. Rules section prints across multiple lines, and allows bold and italic and other advanced formatting.
For text and rules sections, the "text", "rulestext", and "flavortext" options may contain special code to insert strings from other fields. Such as inserting card name, card type, etc. Enclose them inside angled brackets and dash <- ->.
Ex.
`text`<-cardname->
`text`Illustrated by <-artist->
`text`<-supertype-> <-cardtype->
`rulestext`<-rulestext->
`flavortext`<-flavortext->
For text, rules, and cost sections, can also set the font types. Text and cost has only the "font" option. Rules has four options: textfont, boldfont, italicfont, and bolditalicfont. Omitting them will use default fonts.
Fonts are limited to my webhost server. Below are the fonts available. May add more upon request. Use exact spelling, including capitalization, and extension.
albertus_medium-regular.ttf
Amita-Bold.ttf
Amita-Regular.ttf
boecklinsuniverse-regular.ttf
CaviarDreams.ttf
CaviarDreams_Bold.ttf
CaviarDreams_BoldItalic.ttf
CaviarDreams_Italic.ttf
crimson-bold.ttf
crimson-bolditalic.ttf
crimson-italic.ttf
crimson-regular.ttf
FhaNicholson-Regular.ttf
fondamento-italic.ttf
fondamento-regular.ttf
Hack-Bold.ttf
Hack-BoldItalic.ttf
Hack-Italic.ttf
Hack-Regular.ttf
itim-regular.ttf
kelvinch-bold.ttf
kelvinch-regular.ttf
Molengo-Regular.ttf
SourceCodePro-Bold.ttf
SourceCodePro-It.ttf
SourceCodePro-Regular.ttf
ubuntu-bold.ttf
ubuntu-bolditalic.ttf
ubuntu-italic.ttf
ubuntu-medium-regular.ttf
ubuntu-regular.ttf
ubuntumono-regular.ttf
You can also paint static images using the image-drawing sections (art, watermark, seticon, typeicon, overlay.) Their options are respectively: arturl, wmurl, seticonurl, typeiconurl, overlayurl. You can also apply image manipulation commands after the URL.
Note that different section types have nuances. for instance, watermark is always centered around given x,y options. seticon replaces magenta #FF00FF with rarity colors.
The following are not tested, may improve in future:
image masking
drawing lines, shapes
Some ideas on what could be made with Custom Frames:
These could be just Tribal Sorcery, with the Skill keyword. In fact this could be a good reason to bring back Tribal. But it doesn't deserve a new type.
e.g.
Tribal Sorcery - Soldier Warrior
Skill (You may cast this spell any time you could cast an instant if you choose a creature you control that shares a creature type with this spell to perform this spell.)
yada yada yada
This way, it could even go on tribal artifacts and enchantments.
e.g.
Clan Heirloom
Tribal Artifact - Elf Equipment
Skill (reminder text)
. . .
Equip tribal {1} (Equip to target creature you control that shares a creature type with this Equipment.)
Part of the problem is this interjection at the end of the ability, that causes undue "psychological issues", is its verbosity. It would sound much smoother, lighter tone, if it was something like "When you sacrifice for the first time this turn, ...". 1) It reads better. 2) It sounds less harsh.
; new image manipulation command ; ##transparent,color,alpha
; color is HTML format: 6-hex-digits with leading hash #
; alpha is float between 0.0 and 1.0
Ex. turn cyan invisible
##transparent,#00ffff,0.0
----------------
; allow multiple images per field ; all image URLs ; delimiter double dollars $$
All image fields (seticon, typeicon, watermark, overlay, art) may accept multiple images. At the end of the URL, append $$ double dollars for each extra image. Each image can also have their own image manipulation commands. These commands go before the $$.
Not to be confused with double semicolons ;; that separates each half of a split card. $$ and ;; can work together to provide multiple images to one or both halves.
Human already cover half the creature cards and planeswalkers. but apparently that's not enough. they need all sentient races to also resemble humans. even non-mammals must look and behave like humans.
; rules text ; variable width tables
format is:
Where values are relative sizes for each column. Sizes of 0 zeros are ignored. so ex. 3,1,3 will have left and right columns that are 3 times wider than central column.
previous methods of creating tables, namely <<<< and <<|number| , still create equal-width columns.
all methods still allow pipes | , to advance columns.
Ex. These three lines of codes produce identical tables of two columns of equal widths
Ex. column ratios 5-1-4
Ex. column percentages 50-10-40
Ex. stats sheet
; frame_custom ; sections may "split"
Some sections may have an array called "split" that splits a section into several parts, delimited in its "*url" or "*text" fields by double semicolons ;;. Additional options can alter the parameters for each part. Such as placing them at different locations, or alignments, or angle. (Split doesn't cut an image into smaller parts. Rather, you can provide several URLs delimited by ;; and they will be all drawn on the card.)
"split" array holds more "options" objects. Options after the first one only need to specify the parameters that differ from the previous. All parameters will carry to subsequent parts unless altered again. If no parameters differ, provide an empty object, to denote an extra part exists.
The first options object can be outside or inside the split array. If outside, it must still be called "options". But objects inside the array do not and should not be named.
Ex. first options inside split. total 4 parts, all inside.
Where manacost field contains four parts, like "g;;w;;u;;b"
Ex. first options outside split. total 3 parts: 1 outside, 2 inside.
Where powertoughness field contains three parts, like "1/1;;2/2;;4/4"
Sample VON files
2022/10/26
; allow text outlines ; outlinecolor, outlineratio
; allow shadow width multiplier ; shadowratio
; allow turn text into all upper- or lower-case ; allupper, alllower
outlinecolor is HTML hex code (Ex. #00FF00)
outlineratio is multiplied by font size to create outline width. Default is 0.01
shadowratio is multiplied by font size to create shadow width. Default is 0.075
allupper is true or false. Default false.
alllower is true or false. Default false.
allupper has precedence over alllower
Ex. in custom frames
; frame_custom ; conditions to match before drawing section
A section may have an optional array named "if". The section will only be drawn and appear on the card, if the "if" conditions are met. Each condition is represented by an array.
The root "if" is a nested array of any depth. Two basic types of condition arrays: boolean logic operators; and special functions to test the card's properties.
(In these examples, lines that begin with double parentheses (( , act as comments, and are allowed within VON files.)
Ex.
[hr]
Possible boolean operators are (at the time of this writing): AND, OR, NOT.
AND takes any number of conditions. All conditions must be met for this AND to return true.
Note the root "if" is essentially an AND condition. In this case, you must NOT prefix it with an AND declaration.
Ex. if card is artifact and creature:
Ex. root if
OR takes any number of conditions. One or more conditions must be met for this OR to return true.
Ex. if card is historic (legendary, artifact, and/or Saga):
NOT returns the opposite boolean value of the first given condition.
Ex. not a creature:
Ex. nesting boolean conditions
[hr]
Other condition arrays are functions to test a card's property or other logic. These arrays have the following basic layout:
array[0] = the function's name
array[1] = the desired result, in boolean. See table below for valid boolean values.
array[...] = the remaining elements are parameters passed to the function, if necessary
List of Booleans
true,false
1,0
yes,no
on,off
The following functions are valid (at the time of this writing).
"iscardtype" takes an integer that corresponds to the card's type. This value can be found in the same order as the form in the card creator's page. Start counting from 0. (0 = tribal)
Ex. is a land
Ex. NOT a land
"issupertype" takes an integer that corresponds to the card's supertype. This value can be found in the same order as the form in the card creator's page. Start counting from 0. (0 = legendary)
Ex. is basic
Ex. NOT basic
"isintext" matches a pattern within a card's property.
List of Properties and Aliases
,cardname,name
,manacost,cost,mana
,powertoughness,pt,loyalty,stat
,subtype
,extra
,rulestext,rules
,flavortext,flavor
,seticon
,typeicon
,watermark
,overlay
,art
,artist
,creator
Patterns must be enclosed in identical delimiters. Legal delimiters are symbols such as "/|~#
Patterns may have modifiers after the second delimiter. A common one is "i" modifier, that matches both upper and lower case (makes the pattern case insensitive.)
List of Modifiers
((Modifier)) ((Usage))
`i`Case insensitive
Ex. "Circle" in card name
Ex. Warrior is NOT in subtype
Ex. Matches "fish" but case doesn't matter
Ex. extra field is not empty
; frame_custom ; rulespw, ruleslevel, textlevel
Use section type "rulespw" and "ruleslevel" to print rules for Planeswalkers and Levelers, respectively. They act like rules section, but also take extra pertinent options.
Behoove to use conditions to make such sections only appear for relevant cards.
"rulespw" has extra options to customize the loyalty costs and lines that divide the abilities.
Ex.
"ruleslevel" has extra options to customize the level information and lines that divide the abilities.
Ex.
Use section "textlevel" to split the text across several parts. The text box will be divided evenly by the number of parts created by double semicolons ;;. Text will appear on the same row.
Extra options include "strokew" to define the width of the dividing lines, and "addflavor" which adds another part if flavor text is provided by the card. This latter is particularly useful if this text is placed alongside the rules box, and has an angle of 90 or 270 (which rotates the text clockwise by that many degrees).
Ex.
; frame_vogonhd, vogonvt ; bigger mana cost symbols
; cardfuncs ; multi-column tables ; using <<|C|, where C = number of columns ; subsequent pipes | will advance to next column ; pipes will create new rows when it reaches last column
Behavior for <<<< and >>>> are unchanged. These will create exactly two-column tables. Except pipes can also be used to advance these columns, and new rows if necessary.
All columns on the same row will have equal width.
Examples:
(Empty square brackets [] is used facilitate indentation.)
Column of digits:
Calendar:
; allows custom frames ; accept URL to .von and .json files
Design your own frames. Arrange elements anywhere on the card as you please. Customize font sizes, arrange texts, resize art elements, select background images.
Choose "Custom" from the "Frame" drop down menu. Then, in the "Custom Frame" input field, provide a URL to a .von or .json file, that defines your custom frame.
Sample files:
Also see attached sample images resulting from these custom frames.
Basic layout of the frame definition files is an array composed of sections (which are objects or hashes). The sections are drawn and painted on the card in the same order in the root array. So rearrange, add, or remove sections as you please.
Each section must state a section type. Each type has their own options parameters. Use "cf-0.von" as template; it contains most common options you may need for every section. Eventually I would write more detailed instructions in a dedicated help page.
Section types may be repeated. For instance, a text section to print the card name, and another text section to print card type. (Warning: Meta section should not be repeated. This creates a new image and undoes all previous sections. )
Text section prints everything on a single line. Rules section prints across multiple lines, and allows bold and italic and other advanced formatting.
For text and rules sections, the "text", "rulestext", and "flavortext" options may contain special code to insert strings from other fields. Such as inserting card name, card type, etc. Enclose them inside angled brackets and dash <- ->.
Ex.
`text`<-cardname->
`text`Illustrated by <-artist->
`text`<-supertype-> <-cardtype->
`rulestext`<-rulestext->
`flavortext`<-flavortext->
For text, rules, and cost sections, can also set the font types. Text and cost has only the "font" option. Rules has four options: textfont, boldfont, italicfont, and bolditalicfont. Omitting them will use default fonts.
Fonts are limited to my webhost server. Below are the fonts available. May add more upon request. Use exact spelling, including capitalization, and extension.
You can also paint static images using the image-drawing sections (art, watermark, seticon, typeicon, overlay.) Their options are respectively: arturl, wmurl, seticonurl, typeiconurl, overlayurl. You can also apply image manipulation commands after the URL.
Ex.
,arturl,https://ieants.cc/images/kara-fansy_logo.png
,wmurl,https://ieants.cc/images/kara-fansy_logo.png##alpha,0.618
Note that different section types have nuances. for instance, watermark is always centered around given x,y options. seticon replaces magenta #FF00FF with rarity colors.
The following are not tested, may improve in future:
Some ideas on what could be made with Custom Frames:
e.g.
Tribal Sorcery - Soldier Warrior
Skill (You may cast this spell any time you could cast an instant if you choose a creature you control that shares a creature type with this spell to perform this spell.)
yada yada yada
This way, it could even go on tribal artifacts and enchantments.
e.g.
Clan Heirloom
Tribal Artifact - Elf Equipment
Skill (reminder text)
. . .
Equip tribal {1} (Equip to target creature you control that shares a creature type with this Equipment.)
Wall of Omens was only 0/4 and you only get one card.
e.g. Shield target creature (it gets a shield counter...blah blah).
----------------
; new image manipulation command ; ##transparent,color,alpha
; color is HTML format: 6-hex-digits with leading hash #
; alpha is float between 0.0 and 1.0
Ex. turn cyan invisible
##transparent,#00ffff,0.0
----------------
; allow multiple images per field ; all image URLs ; delimiter double dollars $$
All image fields (seticon, typeicon, watermark, overlay, art) may accept multiple images. At the end of the URL, append $$ double dollars for each extra image. Each image can also have their own image manipulation commands. These commands go before the $$.
Not to be confused with double semicolons ;; that separates each half of a split card. $$ and ;; can work together to provide multiple images to one or both halves.
Ex. two images on top of each other
https://ieants.cc/magic/symbols/guilds/mana_rw.png$$https://ieants.cc/magic/symbols/guilds/mana_wu.png
Ex. two guild symbols side by side
https://ieants.cc/magic/symbols/guilds/mana_rw.png##pad,r,205,#00ffff##transparent,#00ffff##alpha,0.16$$https://ieants.cc/magic/symbols/guilds/mana_wu.png##pad,l,205,#00ffff##transparent,#00ffff##alpha,0.16
Here we pad images to "push" them to left or right, using color #00ffff. Then turn only this color transparent. Finally alpha the images.
Ex. each half of a split card gets two different watermarks (total 4 different watermarks)
https://ieants.cc/magic/symbols/guilds/mana_rw.png##pad,r,205,#00ffff##transparent,#00ffff##alpha,0.16$$https://ieants.cc/magic/symbols/guilds/mana_wu.png##pad,l,205,#00ffff##transparent,#00ffff##alpha,0.16;;https://ieants.cc/magic/symbols/guilds/mana_gw.png##pad,r,205,#00ffff##transparent,#00ffff##alpha,0.16$$https://ieants.cc/magic/symbols/guilds/mana_br.png##pad,l,205,#00ffff##transparent,#00ffff##alpha,0.16
Any comments and suggestions welcome.