﻿mse version: 0.3.7
full name: VS System
short name: VS
installer group: VS System/game files
icon: card-back.png
position hint: 3

version: 2008-10-26
depends on:
	package: vs-common.mse-include
	version: 2008-09-23
############ some scripts copied and altered from magic.mse-game
############################################################## Functions & filters
# General functions
init script:
	############### Sorting
	sort_index := {
		if	contains(card.team, match: "<word-list-affiliation1></word-list-affiliation1>")	then "2"
		else if contains(card.team, match: "EQUIPMENT")						then "3"
		else if	contains(card.team, match: "Equipment")						then "3"
		else if contains(card.team, match: "LOCATION")						then "4"
		else if contains(card.team, match: "Location")						then "4"
		else if contains(card.team, match: "PLOT TWIST")					then "5"
		else if contains(card.team, match: "Plot Twist")					then "5"
		else if contains(card.team, match: "Planet")						then "6"
		else if contains(card.team, match: "PLANET")						then "6"
		else 											     "1"
	}
	extensive_sort := {
			card.team + card.team_2_of_2 + card.team_2 + card.team_2_of_2_2 + card.name + card.version + " • " + card.team_affiliation
	}
	rarity_sort := {
		if contains(card.shape, match: "old") then "B"
		else if contains(card.shape, match: "avatar") then "C"
		else if contains(card.shape, match: "alter ego") then "D"
		else "A"
	}
	sort_name :=
		replace@(match: "^(The|An?) ", replace: "") +
		to_lower
	
	############### Determine Card Position
	pos_of_card := {
		position(
			of: card
			in: set
			order_by: { rarity_sort() + sort_index() + extensive_sort() + sort_name(card.name) }
			) + 1
	}
	
	############################################################## Text Filters
	card_shape := { "new" }
	#  - adds all symbols
	#  - bolds keywords
	#  - makes text in parentheses italic
	text_filter := 
		# step 1 : Remove all automatic tags
		tag_remove_rule(tag: "<sym-auto>") +
		tag_remove_rule(tag: "<i-auto>")   +
		tag_remove_rule(tag: "<b-auto>")   +
		# step 2 : Reminder text for keywords
		expand_keywords@(
			condition: {
				correct_case
			}
			default_expand: {
				chosen(choice:if correct_case then mode else "lower case", set.automatic_reminder_text)
			},
			combine:        { "<b-auto>{keyword}</b-auto><atom-reminder-{mode}> ({process_english_hints(reminder)})</atom-reminder-{mode}>" }
			) +
		# step 3 : Expand shortcut words ~ and CARDNAME
		replace_rule(
			match: "~|~THIS~|CARDNAME",
			in_context: "(^|[[:space:]])<match>",
			replace: "<atom-cardname>&</atom-cardname>"
			) +
		# step 4 : Fill in atom fields
		tag_contents_rule(
			tag: "<atom-cardname>",
			contents: { if card.name=="" then "CARDNAME" else card.name }
			) +
		# step 5a: add arrow & diamond symbols
		replace_rule(
			match: "->|>>>|@|<>|•",
			replace: "<sym-auto>&</sym-auto>") +
		#X#if contains(card.shape, match:"old") then symbol_filter else new_symbols
		# step 7a : Bold keywords without reminder text
		replace_rule(
		 	match: "<kw[^>]*>[^<]+</kw-a>",
	 		replace: "<b-auto>&</b-auto>") +
		# step 7b : Bold keywords with reminder text
		replace_rule(
		 	match: "<kw[^>]*>[^<]+</kw-A>",
	 		replace: "<b-auto>&</b-auto>") +
		# step 8 : Italic reminder text
		replace_rule(
		 	match: "[(][^)\n]*[)]?",
			in_context: "(^|[[:space:]])<match>|<atom-keyword><match>",
		 	replace: "<i-auto>&</i-auto>")
	
	############### Word List Scripts for Affiliations and Card Types
	type_over_list := replace_rule(match:" ?-$", replace:"")
	
	affiliation_1_filter :=
		tag_remove_rule(tag: "<word-list-") +
		type_over_list +
		{ "<word-list-affiliation1>{input}</word-list-affiliation1>" }
	
	space_to_wltags := replace_rule(match:"( +|<soft> </soft>)",
	                                replace:{"</word-list-{list_type}>{_1}<word-list-{list_type}>"})
	
	affiliation_2_filter :=
		tag_remove_rule(tag: "<word-list-") +
		type_over_list +
		{ "<word-list-affiliation2>{input}</word-list-affiliation2>" }
	
	############### Determine type of card
	c_optional_character := filter_rule(match: "Concealed—Optional")
	concealed_character := filter_rule(match: "Concealed")
	keyword_sort_equipment := filter_rule(match: "Transferable")
	keyword_sort_location := filter_rule(match: "Terraform")
	keyword_sort_plot_twist := filter_rule(match: "Ongoing:")
	card_type := {
		if      contains(card.team, match: "Location")		then "location"
		else if contains(card.team, match: "LOCATION")		then "location"
		else if keyword_sort_location(card.rule_text) != ""    	then "location"
		else if contains(card.team, match: "Planet")		then "planet"
		else if contains(card.team, match: "PLANET")		then "planet"
		else if contains(card.team, match: "Equipment")		then "equipment visible equipment"
		else if contains(card.team, match: "EQUIPMENT")		then "equipment visible equipment"
		else if keyword_sort_equipment(card.rule_text) != ""   	then "equipment visible equipment"
		else if contains(card.team, match: "Plot Twist")	then "plot twist"
		else if contains(card.team, match: "PLOT TWIST")	then "plot twist"
		else if keyword_sort_plot_twist(card.rule_text) != ""  	then "plot twist"
		else if card.symbols == "ongoing"	        	then "plot twist"
		else if c_optional_character(card.rule_text) != ""	then "characters concealed-optional concealed-optional character"
		else if concealed_character(card.rule_text) != ""	then "characters hidden concealed"
		else							     "characters visible character"
	}
	# Default symbols
	flightrange_detect := { if card.flightrange == "flight" then "flight"
		else if card.flightrange == "range" then "range"
		else if card.flightrange == "both" then "flight, range"
		else ""
	}
	ongoing_detect := {
		if	keyword_sort_plot_twist(card.rule_text) != ""   then "ongoing"
		else ""
	} 
	symbol_default := { flightrange_detect() + (if flightrange_detect() != "" then ", " else " ") + ongoing_detect() }

	# Default 'team' name of card
	team := {
		if      is_location()   then "Location"
		else if is_equipment()  then "Equipment"
		else if is_plot_twist() then "Plot Twist"
		else                         ""
	}
	true_pass := {
		if	is_character() then false else true
	}
	
	############### Type of card
	
	is_dual := {
		card.card_type == "characters visible character dual" or
	        card.card_type == "characters hidden concealed dual" or
	        card.card_type == "characters concealed-optional concealed-optional dual"
	}
	is_new_dual := {
		card.card_type == "characters visible character dual (new)" or
	        card.card_type == "characters hidden concealed dual (new)" or
	        card.card_type == "characters concealed-optional concealed-optional dual (new)"
	}
	is_not_new_dual := {
		card.card_type == "characters visible character" or
	        card.card_type == "characters visible character dual" or
	        card.card_type == "characters hidden character concealed" or
	        card.card_type == "characters hidden character concealed dual" or
		card.card_type == "characters concealed-optional concealed-optional character" or
	        card.card_type == "characters concealed-optional concealed-optional dual"
	}
	is_character := { contains(card.card_type, match: "characters")
	}
	is_concealed_optional := { contains(card.card_type, match: "concealed-optional") or
		contains(card.rule_text, match: "Concealed—Optional")
	}
	is_concealed := { contains(card.card_type, match: "hidden") or
		contains(card.rule_text, match: "Concealed")
	}
	is_equipment := { contains(card.card_type, match: "equipment")
	}
	is_location := {
		card.card_type == "location"
	}
	is_plot_twist := {
		card.card_type == "plot twist"
	}
	is_ch_or_eq := {
		is_character() or is_equipment()
	}
	is_ch_or_pt := {
		is_character() or is_plot_twist()
	}
	############### Watermark Scripts
	
	watermark_narrow := {
		card.watermark == "Marvel A-C Brood" or
		card.watermark == "Marvel A-C Brotherhood" or
		card.watermark == "Marvel D-H Hellfire Club" or
		card.watermark == "DC A-C Anti-Matter" or
		card.watermark == "DC A-C Arkham Inmates" or
		card.watermark == "DC N-S Shadowpact"
	}
	watermark_wide := {
		card.watermark == "Marvel D-H Horsemen of Apocalypse" or
		card.watermark == "DC I-M JLA" or
		card.watermark == "DC I-M JSA"
	}

	############### Additional Scripts
	
	only_numbers := filter_text@(match: "^[0123456789]+")

	word_count := break_text@(match:"[^[:space:]]+") + length
	
	name_sep := {
		if contains(set.logo, match: "Marvel") then (
			if is_character() and card.identity=="" then "™"
			else if is_character() and card.identity!="" then "™ <sym>•</sym> "
			else if is_equipment() and card.identity=="" then " "
			else if is_equipment() and card.identity!="" then " <sym>•</sym> "
			else ""
		)
		else if is_character() and card.identity=="" then " "
		else if is_character() and card.identity!="" then " <sym>•</sym> "
		else if is_equipment() and card.identity=="" then " "
		else if is_equipment() and card.identity!="" then " <sym>•</sym> "
		else ""
	}
	
	separator_type := {
		if contains(card.shape, match:"old") then (
			if team2 != "<word-list-affiliation2></word-list-affiliation2>" then " <sym>•</sym> "
			else " "
		)
		else " • "
	}
	
	only_first := replace@(match:"card.team", replace:"")
	
	all_affiliations := {
		for each card in set do
			if is_character() then "," + only_first(to_text(card.team))
	}
	
############################################################## Set fields
set field:
	type: info
	name: Set Information
set field:
	type: text
	name: title
	description: This information will not appear on the card.
set field:
	type: text
	name: description
	multi line: true
	description: This information will not appear on the card.
set field:
	type: info
	name: Set Logo Options
set field:
	type: choice
	name: logo
	choice: none
	choice: Marvel
	choice: DC-new
	choice: DC-old
	choice: Hellboy
	choice: Other...
	initial: none
	save value: true
	description: The logo for the company.
set field:
	type: image
	name: custom logo
	save value: true
	description: This is where you load custom logos that will appear on all your cards.
set field:
	type: info
	name: Other Default Options
set field:
	type: text
	name: code
	description: Recommended only 3 Capital digits. Will appear before card number. ex: MOR-1
set field:
	type: text
	name: artist
	description: Editting this will set 1 artist for all the cards and will appear in the illustrator area.
set field:
	type: text
	name: copyright
	description: Copytight information. This information will appear in the copyright area on the card.
set field:
	type: choice
	name: set rarity
	choice: common
	choice: uncommon
	choice: rare
	choice: promo
	initial: none
	description: Set the rarity for all cards in the set.
set field:
	type: multiple choice
	name: automatic reminder text
	choice: real
	choice: custom
	initial: custom
	# Convert from older mse versions
	script:
		if value = "yes" then "real, custom"
		else if value = "no" then ""
		else value
	description: For which kinds of keywords should reminder text be added by default? Note: you can enable/disable reminder text by right clicking the keyword.
set field:
	type: boolean
	name: automatic card numbers
	initial: yes
	description: Should card numbers be shown on the cards?
############################# Default style
default set style:
	title:
		padding left: 2
		font:
			size: 14
	logo:
		font:
			size: 16
		render style: both
		choice images:
			Marvel: /vs-common.mse-include/marvel.png
			DC-new:	/vs-common.mse-include/dcnew.png
			DC-old: /vs-common.mse-include/dcold.png
			Hellboy: /vs-common.mse-include/hellboy.png
			Other...: /vs-common.mse-include/other.png
	custom logo:
		width: 30
		height: 30
	title:
		padding left: 2
		font:
			size: 16
	automatic reminder text:
		render style: checklist
		direction: vertical
############################################################## Card fields
############################# Background stuff
card field:
	type: choice
	name: shape
	save value: false
	show statistics: false
	editable: false
	choice: new
	choice: old
	choice: avatar
	choice: alter ego
	script:
		stylesheet   # indicate that this value should be updated when the stylesheet changes
		card_shape() # determined by the style
card field:
	type: choice
	name: card type
	choice: characters
		choice: 
			name: visible
			choice: character
			choice: character dual
			choice: character dual (new)
		choice:
			name: hidden
			choice: concealed
			choice: concealed dual
			choice: concealed dual (new)
		choice:
			name: concealed-optional
			choice: concealed-optional character
			choice: concealed-optional dual
			choice: concealed-optional dual (new)
	choice:
		name: equipment
		choice: visible equipment
		choice: concealed equipment
		choice: concealed-optional equipment
	choice: location
	choice: plot twist
	choice: planet
	default: card_type()
	show statistics: false
	description: The frame of the card.
############################# Name line
card field:
	type: text
	name: name
	editable: false
	show statistics: false
card field:
	type: text
	name: identity
	editable: false
card field:
	type: text
	name: full name
	script: 
		combined_editor(
			field1: card.name,
			separator: name_sep(),
			field2: card.identity,
			soft_before_empty: false,
			hide_when_empty:   false,
			type_over1: "TM",
			type_over2: "<sym>@</sym>"
		)
	identifying: true
	show statistics: false
	card list visible: true
	card list column: 1
	card list width: 200
	description: The name of the card, use @ for a diamond.
card field:
	type: text
	name: cost
	script: only_numbers(value)
	icon: stats/cost.png
	card list visible: true
	card list column: 3
	card list alignment: right
	card list width: 37
	card list name: Cost
	description: The cost of the card.
############################# Image
card field:
	type: image
	name: image
	show statistics: false
card field:
	type: choice
	name: card symbol
	choice: none
	choice: Marvel
	choice: DC-new
	choice: DC-old
	choice: Hellboy
	choice: Other...
	show statistics: false
	default: set.logo
	editable: false
card field:
	type: choice
	name: edition
	choice: first edition
	editable: false
	show statistics: false
############################# Type Bar
card field:
	type: text
	name: type text
	script: to_upper(value)
	editable: false
card field:
	type: text
	name: sub type
	script: to_upper(value)
	editable: false
card field:
	type: text
	name: type text full
	script:
		# Either just type_text, or type_text—sub_type 
		combined_editor(
			field1: card.type_text,
			separator: " - ",
			field2: card.sub_type,
			soft_before_empty: true,
			hide_when_empty:   true,
			type_over1: " -",
			type_over2: "-"
		)
	description: The type of the card
card field:
	type: choice
	name: type bar
	choice: type bar
	editable: false
	show statistics: false
############################# Version
card field:
	type: text
	name: version
	script: to_lower(value)
	editable: false
	show statistics: false
card field:
	type: text
	name: team affiliation
	script: to_lower(value)
	editable: false
card field:
	type: text
	name: version full
	script:
		# Either just version, or version • team_affiliation 
		combined_editor(
			field1: card.version,
			separator: " • ",
			field2: card.team_affiliation,
			soft_before_empty: true,
			hide_when_empty:   true,
			type_over1: " `"
			)
	card list visible: true
	card list column: 2
	show statistics: false
	description: The version of the card.
############################# Card ID
card field:
	type: text
	name: number
	save value: false
	script:
		if pos_of_card()<=9 then "00" + pos_of_card(value) else
		if pos_of_card()>=9 and pos_of_card()<=99 then "0" + pos_of_card(value) else
		"" + pos_of_card(value)
	card list visible: true
	card list column: 6
	card list width: 55
	card list name: #
	card list alignment: right
	editable: false
	show statistics: false
card field:
	type: text
	name: number text
	script: to_upper(value)
	default: set.code + "-" + card.number
	editable: false
	show statistics: false
card field:
	type: text
	name: number line
	save value: false
	show statistics: false
	script:
		if set.automatic_card_numbers then
			combined_editor(field1: set.code, separator: "-", field2: card.number)
		else
			forward_editor(field: card.number_text)
	description: Copyright of this card and cardnumber, the default value can be changed on the 'set info' tab
card field:
	type: text
	name: promo outliner
	save value: false
	show statistics: false
	editable: false
	default: card.number_line
card field:
	type: text
	name: promo outliner 2
	save value: false
	show statistics: false
	editable: false
	default: card.number_line
card field:
	type: choice
	name: rarity
	choice: common
	choice: uncommon
	choice: rare
	choice: promo
	default: set.set_rarity
	icon: stats/rarity.png
	description: The rarity of the card.
############################# Affiliation
card field:
	type: text
	name: separator
	script: separator_type(team2: card.team_2_of_2)
	editable: false
	show statistics: false
card field:
	type: text
	name: team
	script: affiliation_1_filter(if contains(card.shape, match: "old") then (value) else to_upper(value))
	editable: false
	show statistics: false
card field:
	type: text
	name: team 2 of 2
	script: affiliation_2_filter(if contains(card.shape, match: "old") then (value) else to_upper(value))
	editable: false
	show statistics: false
card field:
	type: text
	name: team full
	script:
		# Either just team, or team • team 2 of 2 
		combined_editor(
			field1: card.team,
			separator: card.separator,
			field2: card.team_2_of_2,
			soft_before_empty: true,
			hide_when_empty:   true
		)
	description: The team of the card, use ` for a separator for dual cards
card field:
	type: text
	name: separator 2
	script: separator_type(team2: card.team_2_of_2_2)
	editable: false
	show statistics: false
card field:
	type: text
	name: team 2
	script: affiliation_1_filter(if contains(card.shape, match: "old") then (value) else to_upper(value))
	editable: false
	show statistics: false
card field:
	type: text
	name: team 2 of 2 2
	script: affiliation_2_filter(if contains(card.shape, match: "old") then (value) else to_upper(value))
	editable: false
	show statistics: false
card field:
	type: text
	name: team 2 full
	script:
		# Either just team, or team 2 • team 2 of 2 2
		combined_editor(
			field1: card.team_2,
			separator: card.separator,
			field2: card.team_2_of_2_2,
			soft_before_empty: true,
			hide_when_empty:   true,
			type_over1: " `"
		)
	description: The second affiliation of the card (for dual cards)
############################# FlightRange
card field:
	type: multiple choice
	name: symbols
	icon: stats/symbols.png
	choice: flight
	choice: range
	choice: ongoing
	default: symbol_default()
	description: Symbols for this card (flight/range/ongoing), multiple symbols can be selected
	show statistics: false
############################# Text box
card field:
	type: text
	name: rule text
	show statistics: false
	multi line: true
	script: text_filter(value)
	description: Rule text of the card, use @ for a diamond, -> for an arrow
card field:
	type: text
	name: flavor text
	show statistics: false
	multi line: true
	description: Flavor text of the card.
card field:
	type: choice
	name: watermark
	include file: /vs-common.mse-include/watermark-names
	editable: false
	description: The Watermark for this set.
############################# Atack / Defense
card field:
	type: text
	name: attack
	script: only_numbers(value)
	icon: stats/attack.png
	save value: true
	card list visible: true
	card list column: 4
	card list width: 33
	card list name: ATK
	card list alignment: right
	description: The attack of the card.
card field:
	type: text
	name: defence
	script: only_numbers(value)
	icon: stats/defence.png
	save value: true
	card list visible: true
	card list column: 5
	card list width: 33
	card list name: DEF
	card list alignment: right
	description: The defence of the card.
############################# Copyright stuff
card field:
	type: text
	name: illustrator
	default: set.artist
	icon: stats/illustrator.png
	description: The artist for the card.
card field:
	type: text
	name: copyright
	default: set.copyright
	multi line: true
	show statistics: false
	description: The copyright line of the card.
###############################################
########################### For New style cards
card field:
	type: choice
	name: playarea
	choice: none
	choice: visible
	choice: concealed
	choice: both
	initial: visible
	script:
		if is_concealed_optional() then "both"
		else if is_concealed() then "concealed"
		else "visible"
	editable: false
	show statistics: false
	save value: true
card field:
	type: choice
	name: flightrange
	choice: none
	choice: flight
	choice: range
	choice: both
	initial: none
	show statistics: false
	save value: true
	description: Flight and range icons for the card.
card field:
	type: choice
	name: ongoing
	choice: none
	choice: ongoing
	initial: none
	script: ongoing_detect()
	description: Ongoing icons for the card.
card field:
	type: choice
	name: affiliation
	editable: false
	initial: none
	include file: /vs-common.mse-include/watermark-names
	description: First affiliation icon for the card.
card field:
	type: choice
	name: affiliation2
	editable: false
	initial: none
	include file: /vs-common.mse-include/dual-affiliation
	description: Second affiliation icon for the card.
############################################################# Extra Statistics
statistics dimension:
	name: keywords
	position hint: 1000
	script: keyword_usage(unique:true)
	show empty: false
	split list: true
	icon: stats/keywords.png
statistics dimension:
	name: style
	position hint: 1001
	script: stylesheet.short_name
	icon: stats/stylesheet.png
statistics dimension:
	name: text length (words)
	position hint: 100
	script: word_count(to_text(card.rule_text))
	numeric: true
	bin size: 5
	icon: stats/text_length.png
############################################################## Auto replace
# Do we need categories?
#auto replace category: text box
#auto replace category: copyright
#auto replace category: everywhere
auto replace:
	match: (C)
	replace: ©
auto replace:
	match: CR
	replace: ©
auto replace:
	match: AE
	replace: Æ
	whole word: false
auto replace:
	match: TM
	replace: ™
	whole word: false
auto replace:
	match: --
	replace: —
auto replace:
	# note the spaces
	match:
		 - 
	replace:
		 — 
auto replace:
	match: `
	replace: •
auto replace:
	match: ::
	replace: •
auto replace:
	match: @
	replace: <sym>@</sym>
############################################################## Word lists

word list:
	name: affiliation1
	word:
		name: DC
		word:
			name: A-E
			word: Anti-Matter
			word: Arkham Inmates
			word: Birds of Prey
			word: Checkmate
			word: Crisis
			word: Darkseid's Elite
			word: Deathstroke
			word: Doom Patrol
			word: Emerald Enemies
		word:
			name: F-J
			word: Fearsome Five
			word: Future Foes
			word: Gotham Knights
			word: Green Lantern
			word: Injustice Gang
			word: JLA
			word: JLI
			word: JSA
		word:
			name: K-O
			word: League of Assassins
			word: Legionnaires
			word: Manhunters
			word: New Gods
			word: Outsiders
		word:
			name: P-T
			word: Rann
			word: Revenge Squad
			word: Secret Six
			word: Shadowpact
			word: Speed Force
			word: Squadron Supreme
			word: Team Superman
			word: Teen Titans
			word: Thanagar
		word:
			name: U-Z
			word: Villains United
	word:
		name: Marvel
		word:
			name: A-E
			word: Alpha Flight
			word: Asgardians
			word: Atlantis
			word: Avengers
			word: Crime Lords
			word: Defenders
			word: Doom
		word:
			name: F-J
			word: Fantastic Four
			word: Heralds of Galactus
			word: Heroes of Earth
			word: Hellfire Club
			word: Horsemen of Apocalypse
			word: Infinity Watch
			word: Inhumans
			word: Invaders
		word:
			name: K-O
			word: Kang Council
			word: Kree
			word: Marvel Defenders
			word: Marvel Knights
			word: Masters of Evil
			word: Morlocks
			word: Negative Zone
			word: Nextwave
			word: Nova Corps
		word:
			name: P-T
			word: Phalanx
			word: Sentinels
			word: The Shi'ar
			word: SHIELD
			word: Sinister Syndicate
			word: Skrull
			word: Spider-Friends
			word: Thunderbolts
		word:
			name: U-Z
			word: Underworld
			word: United Front
			word: Villains of Earth
			word: X-Men
			word: X-Statix
			word: Warbound
			word: Weapon X
			word: Wild Pack
	word:
		name: Other
		word: B.P.R.D.
		word: Thule Society
	word: Equipment
	word: Location
	word: Plot Twist
	word: Planet
	word:
		name: Your Affiliations
		word:
			script: all_affiliations()
			line below: true
word list:
	name: affiliation2
	word:
		name: DC
		word:
			name: A-E
			word: Anti-Matter
			word: Arkham Inmates
			word: Birds of Prey
			word: Checkmate
			word: Crisis
			word: Darkseid's Elite
			word: Deathstroke
			word: Doom Patrol
			word: Emerald Enemies
		word:
			name: F-J
			word: Fearsome Five
			word: Future Foes
			word: Gotham Knights
			word: Green Lantern
			word: Injustice Gang
			word: JLA
			word: JLI
			word: JSA
		word:
			name: K-O
			word: League of Assassins
			word: Legionnaires
			word: Manhunters
			word: New Gods
			word: Outsiders
		word:
			name: P-T
			word: Rann
			word: Revenge Squad
			word: Secret Six
			word: Shadowpact
			word: Speed Force
			word: Squadron Supreme
			word: Team Superman
			word: Teen Titans
			word: Thanagar
		word:
			name: U-Z
			word: Villains United
	word:
		name: Marvel
		word:
			name: A-E
			word: Alpha Flight
			word: Asgardians
			word: Atlantis
			word: Avengers
			word: Crime Lords
			word: Defenders
			word: Doom
		word:
			name: F-J
			word: Fantastic Four
			word: Heralds of Galactus
			word: Heroes of Earth
			word: Hellfire Club
			word: Horsemen of Apocalypse
			word: Infinity Watch
			word: Inhumans
			word: Invaders
		word:
			name: K-O
			word: Kang Council
			word: Kree
			word: Marvel Defenders
			word: Marvel Knights
			word: Masters of Evil
			word: Morlocks
			word: Negative Zone
			word: Nextwave
			word: Nova Corps
		word:
			name: P-T
			word: Phalanx
			word: Sentinels
			word: The Shi'ar
			word: SHIELD
			word: Sinister Syndicate
			word: Skrull
			word: Spider-Friends
			word: Thunderbolts
		word:
			name: U-Z
			word: Underworld
			word: United Front
			word: Villains of Earth
			word: X-Men
			word: X-Statix
			word: Warbound
			word: Weapon X
			word: Wild Pack
	word:
		name: Other
		word: B.P.R.D.
		word: Thule Society
	word: Equipment
	word: Location
	word: Plot Twist
	word: Planet
	word:
		name: Your Affiliations
		word:
			script: all_affiliations()
			line below: true
############################################################## Card pack items
pack item:
	name: rare
	filter: card.rarity == "rare"
pack item:
	name: uncommon
	filter: card.rarity == "uncommon"
pack item:
	name: common
	filter: card.rarity == "common"
pack item:
	name: promo
	filter: card.rarity == "promo"
pack item:
	name: random non-rare foil
	filter: card.rarity == "common" or card.rarity == "uncommon"
############################################################## Card packs
pack type:
	name: booster pack
	item:
		name: rare
		amount: 1
	item:
		name: uncommon
		amount: 3
	item:
		name: common
		amount: 9
	item:
		name: random non-rare foil
		amount: 1
pack type:
	name: additional promo
	item:
		name: promo
pack type:
	name: additional rare
	item:
		name: rare
pack type:
	name: additional uncommon
	item:
		name: uncommon
pack type:
	name: additional common
	item:
		name: common
pack type:
	name: additional random non-rare foil
	item:
		name: random non-rare foil
############################################################## Keywords
############################# Keyword rules

has keywords: true

keyword match script: text_filter(value)

keyword mode:
	is default: true
	name: custom
	description: Custom keywords.
keyword mode:
	name: real
	description: Actual keywords.

keyword parameter type:
	name: number
	match: [0-9XYZ?!]+
keyword parameter type:
	name: action
	match: 
		[^
		(.,]+
keyword parameter type:
	name: name
	match:
		[^
		(.,]+

############################# All VS System keywords
keyword:
	keyword: Concealed—Optional
	match: Concealed—Optional
	mode: real
	reminder: This card may come into play in the hidden area.
keyword:
	keyword: Concealed
	match: Concealed 
	mode: real
	reminder: This card comes into play in the hidden area.
keyword:
	keyword: Loyalty—Reveal
	match: Loyalty—Reveal
	mode: real
	reminder: If you don’t control a character that shares an affiliation with this character, then as an additional cost to recruit this character, reveal a character card from your hand or resource row that shares an affiliation with this character.
keyword:
	keyword: Loyalty
	match: Loyalty 
	mode: real
	reminder: Recruit this character only if you control a character that shares at least one team affiliation with this character.
keyword:
	keyword: Evasion
	match: Evasion
	mode: real
	reminder: Stun this character -> Recover this character at the start of the recovery phase this turn.
keyword:
	keyword: Invulnerability
	match: Invulnerability
	mode: real
	reminder: Whenever this character becomes stunned, you do not take stun damage. Breakthrough is applied normally.
keyword:
	keyword: Cosmic—Surge:
	match: Cosmic—Surge: <atom-param>action</atom-param>
	mode: real
	reminder: This character does not come into play with a cosmic counter. At the start of the recovery phase each turn, put a cosmic counter on this character.
keyword:
	keyword: Cosmic:
	match: Cosmic: <atom-param>action</atom-param>
	mode: real
	reminder: This character comes into play with a cosmic counter on it. While this character has a cosmic counter on it, it has this ability in addition to any other text it has.
keyword:
	keyword: Cosmic
	match: Cosmic
	mode: real
	reminder: This character comes into play with a cosmic counter on it.
keyword:
	keyword: Boost
	match: Boost <atom-param>number</atom-param>
	mode: real
	reminder: As an additional cost to play this card, you may pay its boost cost. If you pay, this card has this this this ability in addition to any other text it has this turn.
keyword:
	keyword: Willpower
	match: Willpower <atom-param>number</atom-param>
	mode: real
	reminder: This character has willpower equal to <param1>.
keyword:
	keyword: Leader:
	match: Leader: <atom-param>action</atom-param>
	mode: real
	reminder: The designated characters are affected by this text.
keyword:
	keyword: Ally:
	match: Ally: <atom-param>action</atom-param>
	mode: real
	reminder: This character's ally power is activated whenever a character becomes powered-up.
keyword:
	keyword: Unique
	match: Unique
	mode: real
	reminder: You may only have one copy of this card in play at a time.
keyword:
	keyword: Ongoing:
	match: Ongoing <atom-param>action</atom-param>
	mode: real
	reminder: As long as this card remains face-up in your resource row, this text is active.
keyword:
	keyword: Reservist
	match: Reservist
	mode: real
	reminder: You may recruit this card from your resource row. If you do, you may put a card from your hand face down into your resource row.
keyword:
	keyword: Press
	match: Press
	mode: real
	reminder: When you recruit this card, your next character costs 1 less to recruit this turn for each press card you recruited this turn, but no less than 1.
keyword:
	keyword: Terraform
	match: Terraform
	mode: real
	reminder: Reveal this card -> You may return a face-down resource you control to its owner's hand. If you do, put this card face-down into your resource row. Use this power only if this card is in your hand and only during your recruit step.
keyword:
	keyword: Transferable
	match: Transferable
	mode: real
	reminder: At the start of the formation step, you may transfer this card.
keyword:
	keyword: Vengeance:
	match: Vengeance: <atom-param>action</atom-param>
	mode: real
	reminder: This ability is activated whenever this character is stunned.
keyword:
	keyword: Backup:
	match: Backup: <atom-param>action</atom-param>
	mode: real
	reminder: This ability can only be used during the build phase.
keyword:
	keyword: Dual Loyalty
	match: Dual Loyalty
	mode: real
	reminder: Recruit this card only if both its printed affiliations are among the affiliations of characters you control.
keyword:
	keyword: Substitute
	match: Substitute
	mode: real
	reminder: Reveal this card -> You may remove from the game a ready character you control with cost greater than or equal to the cost of this card. If you do, put this card into play. Use only if this card is in your hand and only during your recruit step." 
keyword:
	keyword: Insanity:
	match: Insanity: <atom-param>action</atom-param>
	mode: real
	reminder: You may not have more than one copy of this card in your deck.
