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-23 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: "EQUIPMENT") then "2" else if contains(card.team, match: "Equipment") then "2" else if contains(card.team, match: "LOCATION") then "3" else if contains(card.team, match: "Location") then "3" else if contains(card.team, match: "PLOT TWIST") then "4" else if contains(card.team, match: "Plot Twist") then "4" else if contains(card.team, match: "Planet") then "5" else if contains(card.team, match: "PLANET") then "5" 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: "") + tag_remove_rule(tag: "") + tag_remove_rule(tag: "") + # 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: { "{keyword} ({process_english_hints(reminder)})" } ) + # step 3 : Expand shortcut words ~ and CARDNAME replace_rule( match: "~|~THIS~|CARDNAME", in_context: "(^|[[:space:]])", replace: "&" ) + # step 4 : Fill in atom fields tag_contents_rule( tag: "", contents: { if card.name=="" then "CARDNAME" else card.name } ) + # step 5a: add arrow & diamond symbols replace_rule( match: "->|>>>|@|<>|•", replace: "&") + #X#if contains(card.shape, match:"old") then symbol_filter else new_symbols # step 7a : Bold keywords without reminder text replace_rule( match: "]*>[^<]+", replace: "&") + # step 7b : Bold keywords with reminder text replace_rule( match: "]*>[^<]+", replace: "&") + # step 8 : Italic reminder text replace_rule( match: "[(][^)\n]*[)]?", in_context: "(^|[[:space:]])|", replace: "&") ############### Word List Scripts for Affiliations and Card Types type_over_list := replace_rule(match:" ?-$", replace:"") affiliation_1_filter := tag_remove_rule(tag: "{input}" } space_to_wltags := replace_rule(match:"( +| )", replace:{"{_1}"}) affiliation_2_filter := tag_remove_rule(tag: "{input}" } ############### 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 "™ " else if is_equipment() and card.identity!="" then " " else "" ) else if is_character() and card.identity!="" then " " else if is_equipment() and card.identity!="" then " " else "" } separator_type := { if contains(card.shape, match:"old") then ( if team2 != "" then " " 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: text name: title description: This information will not appear on the card. 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: text name: code description: Recommended only 3 Capital digits. Will appear before card number. ex: MOR-1 set field: type: text name: description multi line: true description: This information will not appear on the card. set field: type: text name: artist description: Editting this will set 1 artist for all the cards and will appear in the artist bar below the picture. set field: type: text name: copyright description: Copytight information. This information will not appear 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: 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: sep editable: false script: name_sep() 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: card.sep, field2: card.identity, soft_before_empty: false, hide_when_empty: false, type_over1: "TM", type_over2: "@" ) 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: @ ############################################################## 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: action 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: action 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 number 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 number mode: real reminder: This character has willpower equal to . keyword: keyword: Leader: match: Leader: action mode: real reminder: The designated characters are affected by this text. keyword: keyword: Ally: match: Ally: action 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 action 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: action mode: real reminder: This ability is activated whenever this character is stunned. keyword: keyword: Backup: match: Backup: action 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: action mode: real reminder: You may not have more than one copy of this card in your deck.