diff --git a/data/magic-forum.mse-export-template/export-template b/data/magic-forum.mse-export-template/export-template
new file mode 100644
index 00000000..ac594a13
--- /dev/null
+++ b/data/magic-forum.mse-export-template/export-template
@@ -0,0 +1,433 @@
+mse version: 0.3.8
+short name: Forum
+full name: Spoiler Exporter
+position hint: 006
+icon: icon.png
+version: 2010-06-06
+installer group: magic/Export/forum
+
+depends on:
+ package: magic.mse-game
+ version: 2009-07-23
+
+game: magic
+file type: *.txt|*.txt|*.*|*.*
+
+# By Pichoro
+# Based on code by Idle Muse, Innuendo and Seeonee
+
+option field:
+ type: choice
+ name: forum
+ choice: mse
+ choice: mtgsalvation
+ description: What forum should the spoiler be formatted for?
+option field:
+ type: boolean
+ name: text costs
+ initial: yes
+ description: Should mana costs be plain text? Symbols usually can't be copied and pasted.
+option field:
+ type: text
+ name: creator
+ description: The creator of the set.
+option field:
+ type: boolean
+ name: include notes
+ description: Should card notes be included?
+ initial: no
+option field:
+ type: boolean
+ name: color rarities
+ description: Should rarities be colored?
+ initial: yes
+script:
+ # Formats mana costs. MSE and mtgsally use same bbcode tags.
+ mtgsally_mse_forum_cost := replace@(match:"2/W", replace:":sym2w:")+
+ replace@(match:"2/U", replace:":sym2u:")+
+ replace@(match:"2/B", replace:":sym2b:")+
+ replace@(match:"2/R", replace:":sym2r:")+
+ replace@(match:"2/G", replace:":sym2g:")+
+ replace@(match:"S", replace:":snow:")+
+ replace@(match:"W/U", replace:":symwu:")+
+ replace@(match:"W/B", replace:":symwb:")+
+ replace@(match:"U/B", replace:":symub:")+
+ replace@(match:"U/R", replace:":symur:")+
+ replace@(match:"B/R", replace:":symbr:")+
+ replace@(match:"B/G", replace:":symbg:")+
+ replace@(match:"R/G", replace:":symrg:")+
+ replace@(match:"R/W", replace:":symrw:")+
+ replace@(match:"G/W", replace:":symgw:")+
+ replace@(match:"G/U", replace:":symgu:")+
+ replace@(match:"X", replace:":symx:")+
+ replace@(match:"Y", replace:":symy:")+
+ replace@(match:"W", replace:":symw:")+
+ replace@(match:"U", replace:":symu:")+
+ replace@(match:"B", replace:":symb:")+
+ replace@(match:"R", replace:":symr:")+
+ replace@(match:"G", replace:":symg:")+
+ replace@(match:"20", replace:":20mana:")+
+ replace@(match:"19", replace:":19mana:")+
+ replace@(match:"18", replace:":18mana:")+
+ replace@(match:"17", replace:":17mana:")+
+ replace@(match:"16", replace:":16mana:")+
+ replace@(match:"15", replace:":15mana:")+
+ replace@(match:"14", replace:":14mana:")+
+ replace@(match:"13", replace:":13mana:")+
+ replace@(match:"12", replace:":12mana:")+
+ replace@(match:"11", replace:":11mana:")+
+ replace@(match:"10", replace:":10mana:")+
+ replace@(match:"9", replace:":9mana:")+
+ replace@(match:"8", replace:":8mana:")+
+ replace@(match:"7", replace:":7mana:")+
+ replace@(match:"6", replace:":6mana:")+
+ replace@(match:"5", replace:":5mana:")+
+ replace@(match:"4", replace:":4mana:")+
+ replace@(match:"3", replace:":3mana:")+
+ replace@(match:"2", replace:":2mana:")+
+ replace@(match:"1", replace:":1mana:")+
+ replace@(match:"0", replace:":0mana:")
+ # Determine which style of colored rarities to use.
+ rarity_color := {
+ if options.forum == "mse" then rarity_color_mse()
+ else if options.forum == "mtgsalvation" then rarity_color_mtgs()
+ }
+ # Colored rarity markers for MTGS forum.
+ rarity_color_mtgs := {
+ if card.rarity == "basic land" then " (C)"
+ else if card.rarity == "common" then " (C)"
+ else if card.rarity == "uncommon" then " [color=silver](U)[/color]"
+ else if card.rarity == "rare" then " [color=gold](R)[/color]"
+ else if card.rarity == "mythic rare" then " [color=orange](M)[/color]"
+ else if card.rarity == "special" then " [color=purple](S)[/color]"
+ else " (C)"
+ }
+ # Colored rarity markers for MSE forum.
+ rarity_color_mse := {
+ if card.rarity == "basic land" then " :common:"
+ else if card.rarity == "common" then " :common:"
+ else if card.rarity == "uncommon" then " :uncommon:"
+ else if card.rarity == "rare" then " :rare:"
+ else if card.rarity == "mythic rare" then " :mythic:"
+ else if card.rarity == "special" then " :special:"
+ else " :common:"
+ }
+ # Non colored rarity markers.
+ rarity_uncolor := {
+ if card.rarity == "basic land" then " (C)"
+ else if card.rarity == "common" then " (C)"
+ else if card.rarity == "uncommon" then " (U)"
+ else if card.rarity == "rare" then " (R)"
+ else if card.rarity == "mythic rare" then " (M)"
+ else if card.rarity == "special" then " (S)"
+ else " (C)"
+ }
+ # Formats rules text w/ only italic tags.
+ forum_rules_filter_plain := replace@(match:"[(]", replace:"[i](")+
+ replace@(match:"[)]", replace: ")[/i]")
+ # Formats rules text w/ mana symbols. MSE and mtgsally use same bbcode tags for mana.
+ forum_rules_filter_mtgsally_mse :=
+ # Italics around parenthesis.
+ replace@(match:"[(]", replace:"[i](")+
+ replace@(match:"[)]", replace: ")[/i]")+
+ # 2/C's don't appear in regular english, format them all.
+ replace@(match:"2/W", replace:":sym2w:")+
+ replace@(match:"2/U", replace:":sym2u:")+
+ replace@(match:"2/B", replace:":sym2b:")+
+ replace@(match:"2/R", replace:":sym2r:")+
+ replace@(match:"2/G", replace:":sym2g:")+
+ # C/D's don't appear in regular english, format them all.
+ replace@(match:"W/U", replace:":symwu:")+
+ replace@(match:"W/B", replace:":symwb:")+
+ replace@(match:"U/B", replace:":symub:")+
+ replace@(match:"U/R", replace:":symur:")+
+ replace@(match:"B/R", replace:":symbr:")+
+ replace@(match:"B/G", replace:":symbg:")+
+ replace@(match:"R/G", replace:":symrg:")+
+ replace@(match:"R/W", replace:":symrw:")+
+ replace@(match:"G/W", replace:":symgw:")+
+ replace@(match:"G/U", replace:":symgu:")+
+ # Various positions for taps, untaps and chaos symbols.
+ replace@(match:" T ", replace:" :symtap: ")+
+ replace@(match:" Q ", replace:" :symq: ")+
+ replace@(match:" C ", replace:" :symch: ")+
+ replace@(match:"T,", replace:":symtap:,")+
+ replace@(match:"Q,", replace:":symq:,")+
+ replace@(match:"C,", replace:":symch:,")+
+ replace@(match:"T:", replace:":symtap::")+
+ replace@(match:"Q:", replace:":symq::")+
+ replace@(match:"C:", replace:":symch::")+
+ # Mana right before a space.
+ replace@(match:"G ", replace:":symg: ")+
+ replace@(match:"R ", replace:":symr: ")+
+ replace@(match:"B ", replace:":symb: ")+
+ replace@(match:"U ", replace:":symu: ")+
+ replace@(match:"W ", replace:":symw: ")+
+ replace@(match:"S ", replace:":snow: ")+
+ # Mana right before a comma.
+ replace@(match:"G,", replace:":symg:,")+
+ replace@(match:"R,", replace:":symr:,")+
+ replace@(match:"B,", replace:":symb:,")+
+ replace@(match:"U,", replace:":symu:,")+
+ replace@(match:"W,", replace:":symw:,")+
+ replace@(match:"S,", replace:":snow:,")+
+ # Mana right before a colon.
+ replace@(match:"G:", replace:":symg::")+
+ replace@(match:"R:", replace:":symr::")+
+ replace@(match:"B:", replace:":symb::")+
+ replace@(match:"U:", replace:":symu::")+
+ replace@(match:"W:", replace:":symw::")+
+ # Drag rules text to search for more mana characters. Reverse color wheel order works better. Repeat several times.
+ replace@(match:"G:", replace:":symg::")+
+ replace@(match:"R:", replace:":symr::")+
+ replace@(match:"B:", replace:":symb::")+
+ replace@(match:"U:", replace:":symu::")+
+ replace@(match:"W:", replace:":symw::")+
+ replace@(match:"G:", replace:":symg::")+
+ replace@(match:"R:", replace:":symr::")+
+ replace@(match:"B:", replace:":symb::")+
+ replace@(match:"U:", replace:":symu::")+
+ replace@(match:"W:", replace:":symw::")+
+ replace@(match:"G:", replace:":symg::")+
+ replace@(match:"R:", replace:":symr::")+
+ replace@(match:"B:", replace:":symb::")+
+ replace@(match:"U:", replace:":symu::")+
+ replace@(match:"W:", replace:":symw::")+
+ # Symbolize snow.
+ replace@(match:"S:", replace:":snow::")+
+ replace@(match:"S:", replace:":snow::")+
+ replace@(match:"S:", replace:":snow::")+
+ # Symbolize numbers from 20-0 when before a comma.
+ replace@(match:"20,", replace:":20mana:,")+
+ replace@(match:"19,", replace:":19mana:,")+
+ replace@(match:"18,", replace:":18mana:,")+
+ replace@(match:"17,", replace:":17mana:,")+
+ replace@(match:"16,", replace:":16mana:,")+
+ replace@(match:"15,", replace:":15mana:,")+
+ replace@(match:"14,", replace:":14mana:,")+
+ replace@(match:"13,", replace:":13mana:,")+
+ replace@(match:"12,", replace:":12mana:,")+
+ replace@(match:"11,", replace:":11mana:,")+
+ replace@(match:"10,", replace:":10mana:,")+
+ replace@(match:"9,", replace:":9mana:,")+
+ replace@(match:"8,", replace:":8mana:,")+
+ replace@(match:"7,", replace:":7mana:,")+
+ replace@(match:"6,", replace:":6mana:,")+
+ replace@(match:"5,", replace:":5mana:,")+
+ replace@(match:"4,", replace:":4mana:,")+
+ replace@(match:"3,", replace:":3mana:,")+
+ replace@(match:"2,", replace:":2mana:,")+
+ replace@(match:"1,", replace:":1mana:,")+
+ replace@(match:"0,", replace:":0mana:,")+
+ # Symbolize numbers from 20-0 when before another symbol or a colon.
+ replace@(match:"20:", replace:":20mana::")+
+ replace@(match:"19:", replace:":19mana::")+
+ replace@(match:"18:", replace:":18mana::")+
+ replace@(match:"17:", replace:":17mana::")+
+ replace@(match:"16:", replace:":16mana::")+
+ replace@(match:"15:", replace:":15mana::")+
+ replace@(match:"14:", replace:":14mana::")+
+ replace@(match:"13:", replace:":13mana::")+
+ replace@(match:"12:", replace:":12mana::")+
+ replace@(match:"11:", replace:":11mana::")+
+ replace@(match:"10:", replace:":10mana::")+
+ replace@(match:"9:", replace:":9mana::")+
+ replace@(match:"8:", replace:":8mana::")+
+ replace@(match:"7:", replace:":7mana::")+
+ replace@(match:"6:", replace:":6mana::")+
+ replace@(match:"5:", replace:":5mana::")+
+ replace@(match:"4:", replace:":4mana::")+
+ replace@(match:"3:", replace:":3mana::")+
+ replace@(match:"2:", replace:":2mana::")+
+ replace@(match:"1:", replace:":1mana::")+
+ replace@(match:"0:", replace:":0mana::")+
+ # Symbolize X and Y when before a comma.
+ replace@(match:"Y,", replace:":symy:,")+
+ replace@(match:"X,", replace:":symx:,")+
+ # Symbolize X and Y when before another symbol or a colon.
+ replace@(match:"Y:", replace:":symy::")+
+ replace@(match:"X:", replace:":symx::")
+ # Count the number of paragraphs to detect number of walker abilities.
+ paragraph_count := replace@(match:"\n", replace:"•")+
+ filter_text@(match:"•")
+ write_normal := {
+ # The Name and Casting Cost
+ "\n[b]"+card.name+"[/b] "
+ +(if not options.text_costs then mtgsally_mse_forum_cost(card.casting_cost))
+ +(if options.text_costs then card.casting_cost)
+ # The Type and Rarity
+ +"\n"+card.type+(if options.color_rarities then rarity_color() else rarity_uncolor())
+ # The Rules Text
+ +(if card.rule_text != "" then "\n")
+ +(if not options.text_costs then forum_rules_filter_mtgsally_mse(remove_tags(card.rule_text)))
+ +(if options.text_costs then forum_rules_filter_plain(card.rule_text))
+ # The Flavor Text
+ +(if card.flavor_text != "" then "\n[i]")
+ +card.flavor_text
+ +(if card.flavor_text != "" then "[/i]")
+ # The P/T
+ +(if contains(card.type, match:"Creature") then "\n")
+ +(if contains(card.type, match:"Creature") then card.pt)
+ # The Notes
+ +(if options.include_notes and card.notes !="" then "\n[spoiler]Card Notes: ")
+ +(if options.include_notes and card.notes !="" then card.notes)
+ +(if options.include_notes and card.notes !="" then "[/spoiler]")
+ +"\n"
+ }
+ write_split := {
+ # The Name and Casting Cost
+ "\n[b]"+card.name+"[/b] "
+ +(if not options.text_costs then mtgsally_mse_forum_cost(card.casting_cost))
+ +(if options.text_costs then card.casting_cost)
+ # The Type and Rarity
+ +"\n"+card.type+(if options.color_rarities then rarity_color() else rarity_uncolor())
+ # The Rules Text
+ +(if card.rule_text != "" then "\n")
+ +(if not options.text_costs then forum_rules_filter_mtgsally_mse(remove_tags(card.rule_text)))
+ +(if options.text_costs then forum_rules_filter_plain(card.rule_text))
+ # The Flavor Text
+ +(if card.flavor_text != "" then "\n[i]")
+ +card.flavor_text
+ +(if card.flavor_text != "" then "[/i]")
+ # The P/T
+ +(if contains(card.type, match:"Creature") then "\n")
+ +(if contains(card.type, match:"Creature") then card.pt)
+ +"\n /// "
+ # The Second Name and Casting Cost
+ +"\n[b]"+card.name_2+"[/b] "
+ +(if not options.text_costs then mtgsally_mse_forum_cost(card.casting_cost_2))
+ +(if options.text_costs then card.casting_cost_2)
+ # The Second Type and Rarity
+ +"\n"+card.type_2+(if options.color_rarities then rarity_color() else rarity_uncolor())
+ # The Second Rules Text
+ +(if card.rule_text_2 != "" then "\n")
+ +(if not options.text_costs then forum_rules_filter_mtgsally_mse(remove_tags(card.rule_text_2)))
+ +(if options.text_costs then forum_rules_filter_plain(card.rule_text_2))
+ # The Second Flavor Text
+ +(if card.flavor_text_2 != "" then "\n[i]")
+ +card.flavor_text_2
+ +(if card.flavor_text_2 != "" then "[/i]")
+ # The Second P/T
+ +(if contains(card.type_2, match:"Creature") then "\n")
+ +(if contains(card.type_2, match:"Creature") then card.pt_2)
+ # The Notes
+ +(if options.include_notes and card.notes !="" then "\n[spoiler]Card Notes: ")
+ +(if options.include_notes and card.notes !="" then card.notes)
+ +(if options.include_notes and card.notes !="" then "[/spoiler]")
+ +"\n"
+ }
+ write_flip := {
+ # The Name and Casting Cost
+ "\n[b]"+card.name+"[/b] "
+ +(if not options.text_costs then mtgsally_mse_forum_cost(card.casting_cost))
+ +(if options.text_costs then card.casting_cost)
+ # The Type and Rarity
+ +"\n"+card.type+(if options.color_rarities then rarity_color() else rarity_uncolor())
+ # The Rules Text
+ +(if card.rule_text != "" then "\n")
+ +(if not options.text_costs then forum_rules_filter_mtgsally_mse(remove_tags(card.rule_text)))
+ +(if options.text_costs then forum_rules_filter_plain(card.rule_text))
+ # The Flavor Text
+ +(if card.flavor_text != "" then "\n[i]")
+ +card.flavor_text
+ +(if card.flavor_text != "" then "[/i]")
+ # The P/T
+ +(if contains(card.type, match:"Creature") then "\n")
+ +(if contains(card.type, match:"Creature") then card.pt)
+ +"\n ---Flip--- "
+ # The Flip Name and Casting Cost
+ +"\n[b]"+card.name_2+"[/b] "
+ +(if not options.text_costs then mtgsally_mse_forum_cost(card.casting_cost_2))
+ +(if options.text_costs then card.casting_cost_2)
+ # The Flip Rules Text
+ +(if card.rule_text_2 != "" then "\n")
+ +(if not options.text_costs then forum_rules_filter_mtgsally_mse(remove_tags(card.rule_text_2)))
+ +(if options.text_costs then forum_rules_filter_plain(card.rule_text_2))
+ # The Flip Flavor Text
+ +(if card.flavor_text_2 != "" then "\n[i]")
+ +card.flavor_text_2
+ +(if card.flavor_text_2 != "" then "[/i]")
+ # The Flip P/T
+ +(if contains(card.type_2, match:"Creature") then "\n")
+ +(if contains(card.type_2, match:"Creature") then card.pt_2)
+ # The Notes
+ +(if options.include_notes and card.notes !="" then "\n[spoiler]Card Notes: ")
+ +(if options.include_notes and card.notes !="" then card.notes)
+ +(if options.include_notes and card.notes !="" then "[/spoiler]")
+ +"\n"
+ }
+ write_walker := {
+ # The Name and Casting Cost
+ "\n[b]"+card.name+"[/b] "
+ +(if not options.text_costs then mtgsally_mse_forum_cost(card.casting_cost))
+ +(if options.text_costs then card.casting_cost)
+ # The Type and Rarity
+ +"\n"+card.type+(if options.color_rarities then rarity_color() else rarity_uncolor())
+ # The Starting Loyalty
+ +"\nStarting Loyalty: "+card.loyalty
+ # The First Ability
+ +"\n"+card.loyalty_cost_1
+ +(if card.loyalty_cost_1 !="" then ": ")
+ +forum_rules_filter_plain(split_text(match:"\n", card.rule_text).0)
+ # The Second Ability
+ +(if contains(paragraph_count(card.rule_text), match:"•") then "\n")
+ +card.loyalty_cost_2
+ +(if card.loyalty_cost_2 !="" then ": ")
+ +(if contains(paragraph_count(card.rule_text), match:"•") then forum_rules_filter_plain(split_text(match:"\n", card.rule_text).1))
+ # The Third Ability
+ +(if contains(paragraph_count(card.rule_text), match:"••") then "\n")
+ +card.loyalty_cost_3
+ +(if card.loyalty_cost_3 !="" then ": ")
+ +(if contains(paragraph_count(card.rule_text), match:"••") then forum_rules_filter_plain(split_text(match:"\n", card.rule_text).2))
+ # The Fourth Ability
+ +(if contains(paragraph_count(card.rule_text), match:"•••") then "\n")
+ +card.loyalty_cost_4
+ +(if card.loyalty_cost_4 !="" then ": ")
+ +(if contains(paragraph_count(card.rule_text), match:"•••") then forum_rules_filter_plain(split_text(match:"\n", card.rule_text).3))
+ # The Flavor Text
+ +(if card.flavor_text != "" then "\n[i]")
+ +card.flavor_text
+ +(if card.flavor_text != "" then "[/i]")
+ # The Notes
+ +(if options.include_notes and card.notes !="" then "\n[spoiler]Card Notes: ")
+ +(if options.include_notes and card.notes !="" then card.notes)
+ +(if options.include_notes and card.notes !="" then "[/spoiler]")
+ +"\n"
+ }
+ write_leveler := {
+ # The Name and Casting Cost
+ "\n[b]"+card.name+"[/b] "
+ +(if not options.text_costs then mtgsally_mse_forum_cost(card.casting_cost))
+ +(if options.text_costs then card.casting_cost)
+ # The Type and Rarity
+ +"\n"+card.type+(if options.color_rarities then rarity_color() else rarity_uncolor())
+ # The First Textbox
+ +"\n"+forum_rules_filter_plain(card.rule_text)
+ +(if card.pt !="" then " (")+card.pt+")"
+ # The Second Textbox
+ +"\n[LEVEL "+card.level_1+"]: "
+ +forum_rules_filter_plain(card.rule_text_2)
+ +(if card.pt_2 !="" then " (")+card.pt_2+")"
+ # The Third Textbox
+ +"\n"+(if card.level_2 !="" then "[LEVEL "+card.level_2+"]: ")
+ +forum_rules_filter_plain(card.rule_text_3)
+ +(if card.pt_3 !="" then " (")+card.pt_3+")"
+ # The Flavor Text
+ +(if card.flavor_text != "" then "\n[i]")
+ +card.flavor_text
+ +(if card.flavor_text != "" then "[/i]")
+ # The Notes
+ +(if options.include_notes and card.notes !="" then "\n[spoiler]Card Notes: ")
+ +(if options.include_notes and card.notes !="" then card.notes)
+ +(if options.include_notes and card.notes !="" then "[/spoiler]")
+ +"\n"
+ }
+ write_card := { if contains(card.shape, match:"token") or contains(card.shape, match:"rulestip") then ""
+ else if contains(card.shape, match:"split") then write_split()
+ else if card.name_2 != "" then write_flip()
+ else if card.loyalty != "" then write_walker()
+ else if contains(card.shape, match:"leveler") then write_leveler()
+ else write_normal()
+ }
+ write_cards := to_text(for each card in sort_list(cards, order_by: {input.card_number}) do write_card())
+ to_string("Full Spoiler List for "+set.title+"\nSet by "+options.creator+"\n"+set.description+"\n"+write_cards)
diff --git a/data/magic-forum.mse-export-template/icon.png b/data/magic-forum.mse-export-template/icon.png
new file mode 100644
index 00000000..f8155572
Binary files /dev/null and b/data/magic-forum.mse-export-template/icon.png differ
diff --git a/data/planechase-forum.mse-export-template/export-template b/data/planechase-forum.mse-export-template/export-template
new file mode 100644
index 00000000..5ee34e08
--- /dev/null
+++ b/data/planechase-forum.mse-export-template/export-template
@@ -0,0 +1,215 @@
+mse version: 0.3.8
+short name: Forum
+full name: Spoiler Exporter
+position hint: 002
+icon: icon.png
+version: 2010-05-11
+installer group: Magic Planes/Export/forum
+
+depends on:
+ package: planechase.mse-game
+ version: 2009-08-11
+
+game: planechase
+file type: *.txt|*.txt|*.*|*.*
+
+# By Pichoro
+# Based on code by Idle Muse, Innuendo and Seeonee
+
+option field:
+ type: choice
+ name: forum
+ choice: mse
+ choice: mtgsalvation
+ description: What forum should the spoiler be formatted for?
+option field:
+ type: boolean
+ name: text costs
+ initial: yes
+ description: Should mana costs be plain text? Symbols usually can't be copied and pasted.
+option field:
+ type: text
+ name: creator
+ description: The creator of the set.
+option field:
+ type: boolean
+ name: include notes
+ description: Should card notes be included?
+ initial: no
+option field:
+ type: boolean
+ name: color rarities
+ description: Should rarities be colored?
+ initial: yes
+script:
+ # Colored rarity markers.
+ rarity_color := {
+ if card.rarity == "basic land" then " (C)"
+ else if card.rarity == "common" then " (C)"
+ else if card.rarity == "uncommon" then " [color=silver](U)[/color]"
+ else if card.rarity == "rare" then " [color=gold](R)[/color]"
+ else if card.rarity == "mythic rare" then " [color=orange](M)[/color]"
+ else if card.rarity == "special" then " [color=purple](S)[/color]"
+ else " (C)"
+ }
+ # Non colored rarity markers.
+ rarity_uncolor := {
+ if card.rarity == "basic land" then " (C)"
+ else if card.rarity == "common" then " (C)"
+ else if card.rarity == "uncommon" then " (U)"
+ else if card.rarity == "rare" then " (R)"
+ else if card.rarity == "mythic rare" then " (M)"
+ else if card.rarity == "special" then " (S)"
+ else " (C)"
+ }
+ # Formats rules text w/ only italic tags.
+ forum_rules_filter_plain := replace@(match:"[(]", replace:"[i](")+
+ replace@(match:"[)]", replace: ")[/i]")
+ # Formats rules text w/ mana symbols. MSE and mtgsally use same bbcode tags for mana.
+ forum_rules_filter_mtgsally_mse :=
+ # Italics around parenthesis.
+ replace@(match:"[(]", replace:"[i](")+
+ replace@(match:"[)]", replace: ")[/i]")+
+ # 2/C's don't appear in regular english, format them all.
+ replace@(match:"2/W", replace:":sym2w:")+
+ replace@(match:"2/U", replace:":sym2u:")+
+ replace@(match:"2/B", replace:":sym2b:")+
+ replace@(match:"2/R", replace:":sym2r:")+
+ replace@(match:"2/G", replace:":sym2g:")+
+ # C/D's don't appear in regular english, format them all.
+ replace@(match:"W/U", replace:":symwu:")+
+ replace@(match:"W/B", replace:":symwb:")+
+ replace@(match:"U/B", replace:":symub:")+
+ replace@(match:"U/R", replace:":symur:")+
+ replace@(match:"B/R", replace:":symbr:")+
+ replace@(match:"B/G", replace:":symbg:")+
+ replace@(match:"R/G", replace:":symrg:")+
+ replace@(match:"R/W", replace:":symrw:")+
+ replace@(match:"G/W", replace:":symgw:")+
+ replace@(match:"G/U", replace:":symgu:")+
+ # Various positions for taps, untaps and chaos symbols.
+ replace@(match:" T ", replace:" :symtap: ")+
+ replace@(match:" Q ", replace:" :symq: ")+
+ replace@(match:" C ", replace:" :symch: ")+
+ replace@(match:"T,", replace:":symtap:,")+
+ replace@(match:"Q,", replace:":symq:,")+
+ replace@(match:"C,", replace:":symch:,")+
+ replace@(match:"T:", replace:":symtap::")+
+ replace@(match:"Q:", replace:":symq::")+
+ replace@(match:"C:", replace:":symch::")+
+ # Mana right before a space.
+ replace@(match:"G ", replace:":symg: ")+
+ replace@(match:"R ", replace:":symr: ")+
+ replace@(match:"B ", replace:":symb: ")+
+ replace@(match:"U ", replace:":symu: ")+
+ replace@(match:"W ", replace:":symw: ")+
+ replace@(match:"S ", replace:":snow: ")+
+ # Mana right before a comma.
+ replace@(match:"G,", replace:":symg:,")+
+ replace@(match:"R,", replace:":symr:,")+
+ replace@(match:"B,", replace:":symb:,")+
+ replace@(match:"U,", replace:":symu:,")+
+ replace@(match:"W,", replace:":symw:,")+
+ replace@(match:"S,", replace:":snow:,")+
+ # Mana right before a colon.
+ replace@(match:"G:", replace:":symg::")+
+ replace@(match:"R:", replace:":symr::")+
+ replace@(match:"B:", replace:":symb::")+
+ replace@(match:"U:", replace:":symu::")+
+ replace@(match:"W:", replace:":symw::")+
+ # Drag rules text to search for more mana characters. Reverse color wheel order works better. Repeat several times.
+ replace@(match:"G:", replace:":symg::")+
+ replace@(match:"R:", replace:":symr::")+
+ replace@(match:"B:", replace:":symb::")+
+ replace@(match:"U:", replace:":symu::")+
+ replace@(match:"W:", replace:":symw::")+
+ replace@(match:"G:", replace:":symg::")+
+ replace@(match:"R:", replace:":symr::")+
+ replace@(match:"B:", replace:":symb::")+
+ replace@(match:"U:", replace:":symu::")+
+ replace@(match:"W:", replace:":symw::")+
+ replace@(match:"G:", replace:":symg::")+
+ replace@(match:"R:", replace:":symr::")+
+ replace@(match:"B:", replace:":symb::")+
+ replace@(match:"U:", replace:":symu::")+
+ replace@(match:"W:", replace:":symw::")+
+ # Symbolize snow.
+ replace@(match:"S:", replace:":snow::")+
+ replace@(match:"S:", replace:":snow::")+
+ replace@(match:"S:", replace:":snow::")+
+ # Symbolize numbers from 20-0 when before a comma.
+ replace@(match:"20,", replace:":20mana:,")+
+ replace@(match:"19,", replace:":19mana:,")+
+ replace@(match:"18,", replace:":18mana:,")+
+ replace@(match:"17,", replace:":17mana:,")+
+ replace@(match:"16,", replace:":16mana:,")+
+ replace@(match:"15,", replace:":15mana:,")+
+ replace@(match:"14,", replace:":14mana:,")+
+ replace@(match:"13,", replace:":13mana:,")+
+ replace@(match:"12,", replace:":12mana:,")+
+ replace@(match:"11,", replace:":11mana:,")+
+ replace@(match:"10,", replace:":10mana:,")+
+ replace@(match:"9,", replace:":9mana:,")+
+ replace@(match:"8,", replace:":8mana:,")+
+ replace@(match:"7,", replace:":7mana:,")+
+ replace@(match:"6,", replace:":6mana:,")+
+ replace@(match:"5,", replace:":5mana:,")+
+ replace@(match:"4,", replace:":4mana:,")+
+ replace@(match:"3,", replace:":3mana:,")+
+ replace@(match:"2,", replace:":2mana:,")+
+ replace@(match:"1,", replace:":1mana:,")+
+ replace@(match:"0,", replace:":0mana:,")+
+ # Symbolize numbers from 20-0 when before another symbol or a colon.
+ replace@(match:"20:", replace:":20mana::")+
+ replace@(match:"19:", replace:":19mana::")+
+ replace@(match:"18:", replace:":18mana::")+
+ replace@(match:"17:", replace:":17mana::")+
+ replace@(match:"16:", replace:":16mana::")+
+ replace@(match:"15:", replace:":15mana::")+
+ replace@(match:"14:", replace:":14mana::")+
+ replace@(match:"13:", replace:":13mana::")+
+ replace@(match:"12:", replace:":12mana::")+
+ replace@(match:"11:", replace:":11mana::")+
+ replace@(match:"10:", replace:":10mana::")+
+ replace@(match:"9:", replace:":9mana::")+
+ replace@(match:"8:", replace:":8mana::")+
+ replace@(match:"7:", replace:":7mana::")+
+ replace@(match:"6:", replace:":6mana::")+
+ replace@(match:"5:", replace:":5mana::")+
+ replace@(match:"4:", replace:":4mana::")+
+ replace@(match:"3:", replace:":3mana::")+
+ replace@(match:"2:", replace:":2mana::")+
+ replace@(match:"1:", replace:":1mana::")+
+ replace@(match:"0:", replace:":0mana::")+
+ # Symbolize X and Y when before a comma.
+ replace@(match:"Y,", replace:":symy:,")+
+ replace@(match:"X,", replace:":symx:,")+
+ # Symbolize X and Y when before another symbol or a colon.
+ replace@(match:"Y:", replace:":symy::")+
+ replace@(match:"X:", replace:":symx::")+
+ # Add a Chaos symbol in front of Chaos abilities.
+ replace@(match:"Whenever you roll :symch:,", replace:":symch: - Whenever you roll :symch:,")+
+ # Remove consecutive spaces, as they are meant to adjust text position.
+ replace@(match:" ", replace:"")
+ # Count the number of paragraphs to detect number of walker abilities.
+ write_card := {
+ # The Name
+ "\n[b]"+card.name+"[/b]"
+ # The Type and Rarity
+ +"\n"+card.type+(if options.color_rarities then rarity_color() else rarity_uncolor())
+ # The Rules Text
+ +(if card.rule_text != "" then "\n")
+ +(if not options.text_costs then forum_rules_filter_mtgsally_mse(remove_tags(card.rule_text)))
+ +(if options.text_costs then forum_rules_filter_plain(card.rule_text))
+ # The Flavor Text
+ +(if card.flavor_text != "" then "\n[i]")
+ +card.flavor_text
+ +(if card.flavor_text != "" then "[/i]")
+ # The Notes
+ +(if options.include_notes and card.notes !="" then "\n[spoiler]Card Notes: ")
+ +(if options.include_notes and card.notes !="" then card.notes)
+ +(if options.include_notes and card.notes !="" then "[/spoiler]")
+ +"\n"
+ }
+ write_cards := to_text(for each card in sort_list(cards, order_by: {input.card_number}) do write_card())
+ to_string("Full Spoiler List for "+set.title+"\nSet by "+options.creator+"\n"+set.description+"\n"+write_cards)
diff --git a/data/planechase-forum.mse-export-template/icon.png b/data/planechase-forum.mse-export-template/icon.png
new file mode 100644
index 00000000..f8155572
Binary files /dev/null and b/data/planechase-forum.mse-export-template/icon.png differ
diff --git a/data/vanguard-forum.mse-export-template/export-template b/data/vanguard-forum.mse-export-template/export-template
new file mode 100644
index 00000000..620d55c2
--- /dev/null
+++ b/data/vanguard-forum.mse-export-template/export-template
@@ -0,0 +1,189 @@
+mse version: 0.3.8
+short name: Forum
+full name: Spoiler Exporter
+position hint: 002
+icon: icon.png
+version: 2010-05-11
+installer group: Magic Vanguard/Export/forum
+
+depends on:
+ package: vanguard.mse-game
+ version: 2007-09-23
+
+game: vanguard
+file type: *.txt|*.txt|*.*|*.*
+
+# By Pichoro
+# Based on code by Idle Muse, Innuendo and Seeonee
+
+option field:
+ type: choice
+ name: forum
+ choice: mse
+ choice: mtgsalvation
+ description: What forum should the spoiler be formatted for?
+option field:
+ type: boolean
+ name: text costs
+ initial: yes
+ description: Should mana costs be plain text? Symbols usually can't be copied and pasted.
+option field:
+ type: text
+ name: creator
+ description: The creator of the set.
+option field:
+ type: boolean
+ name: include notes
+ description: Should card notes be included?
+ initial: no
+script:
+ # Formats rules text w/ only italic tags.
+ forum_rules_filter_plain := replace@(match:"[(]", replace:"[i](")+
+ replace@(match:"[)]", replace: ")[/i]")
+ # Formats rules text w/ mana symbols. MSE and mtgsally use same bbcode tags for mana.
+ forum_rules_filter_mtgsally_mse :=
+ # Italics around parenthesis.
+ replace@(match:"[(]", replace:"[i](")+
+ replace@(match:"[)]", replace: ")[/i]")+
+ # 2/C's don't appear in regular english, format them all.
+ replace@(match:"2/W", replace:":sym2w:")+
+ replace@(match:"2/U", replace:":sym2u:")+
+ replace@(match:"2/B", replace:":sym2b:")+
+ replace@(match:"2/R", replace:":sym2r:")+
+ replace@(match:"2/G", replace:":sym2g:")+
+ # C/D's don't appear in regular english, format them all.
+ replace@(match:"W/U", replace:":symwu:")+
+ replace@(match:"W/B", replace:":symwb:")+
+ replace@(match:"U/B", replace:":symub:")+
+ replace@(match:"U/R", replace:":symur:")+
+ replace@(match:"B/R", replace:":symbr:")+
+ replace@(match:"B/G", replace:":symbg:")+
+ replace@(match:"R/G", replace:":symrg:")+
+ replace@(match:"R/W", replace:":symrw:")+
+ replace@(match:"G/W", replace:":symgw:")+
+ replace@(match:"G/U", replace:":symgu:")+
+ # Various positions for taps, untaps and chaos symbols.
+ replace@(match:" T ", replace:" :symtap: ")+
+ replace@(match:" Q ", replace:" :symq: ")+
+ replace@(match:" C ", replace:" :symch: ")+
+ replace@(match:"T,", replace:":symtap:,")+
+ replace@(match:"Q,", replace:":symq:,")+
+ replace@(match:"C,", replace:":symch:,")+
+ replace@(match:"T:", replace:":symtap::")+
+ replace@(match:"Q:", replace:":symq::")+
+ replace@(match:"C:", replace:":symch::")+
+ # Mana right before a space.
+ replace@(match:"G ", replace:":symg: ")+
+ replace@(match:"R ", replace:":symr: ")+
+ replace@(match:"B ", replace:":symb: ")+
+ replace@(match:"U ", replace:":symu: ")+
+ replace@(match:"W ", replace:":symw: ")+
+ replace@(match:"S ", replace:":snow: ")+
+ # Mana right before a comma.
+ replace@(match:"G,", replace:":symg:,")+
+ replace@(match:"R,", replace:":symr:,")+
+ replace@(match:"B,", replace:":symb:,")+
+ replace@(match:"U,", replace:":symu:,")+
+ replace@(match:"W,", replace:":symw:,")+
+ replace@(match:"S,", replace:":snow:,")+
+ # Mana right before a colon.
+ replace@(match:"G:", replace:":symg::")+
+ replace@(match:"R:", replace:":symr::")+
+ replace@(match:"B:", replace:":symb::")+
+ replace@(match:"U:", replace:":symu::")+
+ replace@(match:"W:", replace:":symw::")+
+ # Drag rules text to search for more mana characters. Reverse color wheel order works better. Repeat several times.
+ replace@(match:"G:", replace:":symg::")+
+ replace@(match:"R:", replace:":symr::")+
+ replace@(match:"B:", replace:":symb::")+
+ replace@(match:"U:", replace:":symu::")+
+ replace@(match:"W:", replace:":symw::")+
+ replace@(match:"G:", replace:":symg::")+
+ replace@(match:"R:", replace:":symr::")+
+ replace@(match:"B:", replace:":symb::")+
+ replace@(match:"U:", replace:":symu::")+
+ replace@(match:"W:", replace:":symw::")+
+ replace@(match:"G:", replace:":symg::")+
+ replace@(match:"R:", replace:":symr::")+
+ replace@(match:"B:", replace:":symb::")+
+ replace@(match:"U:", replace:":symu::")+
+ replace@(match:"W:", replace:":symw::")+
+ # Symbolize snow.
+ replace@(match:"S:", replace:":snow::")+
+ replace@(match:"S:", replace:":snow::")+
+ replace@(match:"S:", replace:":snow::")+
+ # Symbolize numbers from 20-0 when before a comma.
+ replace@(match:"20,", replace:":20mana:,")+
+ replace@(match:"19,", replace:":19mana:,")+
+ replace@(match:"18,", replace:":18mana:,")+
+ replace@(match:"17,", replace:":17mana:,")+
+ replace@(match:"16,", replace:":16mana:,")+
+ replace@(match:"15,", replace:":15mana:,")+
+ replace@(match:"14,", replace:":14mana:,")+
+ replace@(match:"13,", replace:":13mana:,")+
+ replace@(match:"12,", replace:":12mana:,")+
+ replace@(match:"11,", replace:":11mana:,")+
+ replace@(match:"10,", replace:":10mana:,")+
+ replace@(match:"9,", replace:":9mana:,")+
+ replace@(match:"8,", replace:":8mana:,")+
+ replace@(match:"7,", replace:":7mana:,")+
+ replace@(match:"6,", replace:":6mana:,")+
+ replace@(match:"5,", replace:":5mana:,")+
+ replace@(match:"4,", replace:":4mana:,")+
+ replace@(match:"3,", replace:":3mana:,")+
+ replace@(match:"2,", replace:":2mana:,")+
+ replace@(match:"1,", replace:":1mana:,")+
+ replace@(match:"0,", replace:":0mana:,")+
+ # Symbolize numbers from 20-0 when before another symbol or a colon.
+ replace@(match:"20:", replace:":20mana::")+
+ replace@(match:"19:", replace:":19mana::")+
+ replace@(match:"18:", replace:":18mana::")+
+ replace@(match:"17:", replace:":17mana::")+
+ replace@(match:"16:", replace:":16mana::")+
+ replace@(match:"15:", replace:":15mana::")+
+ replace@(match:"14:", replace:":14mana::")+
+ replace@(match:"13:", replace:":13mana::")+
+ replace@(match:"12:", replace:":12mana::")+
+ replace@(match:"11:", replace:":11mana::")+
+ replace@(match:"10:", replace:":10mana::")+
+ replace@(match:"9:", replace:":9mana::")+
+ replace@(match:"8:", replace:":8mana::")+
+ replace@(match:"7:", replace:":7mana::")+
+ replace@(match:"6:", replace:":6mana::")+
+ replace@(match:"5:", replace:":5mana::")+
+ replace@(match:"4:", replace:":4mana::")+
+ replace@(match:"3:", replace:":3mana::")+
+ replace@(match:"2:", replace:":2mana::")+
+ replace@(match:"1:", replace:":1mana::")+
+ replace@(match:"0:", replace:":0mana::")+
+ # Symbolize X and Y when before a comma.
+ replace@(match:"Y,", replace:":symy:,")+
+ replace@(match:"X,", replace:":symx:,")+
+ # Symbolize X and Y when before another symbol or a colon.
+ replace@(match:"Y:", replace:":symy::")+
+ replace@(match:"X:", replace:":symx::")
+ # Count the number of paragraphs to detect number of walker abilities.
+ write_card := {
+ # The Name
+ "\n[b]"+card.name+"[/b]"
+ # The Type and Rarity
+ +"\n"+card.type
+ # The Rules Text
+ +(if card.rule_text != "" then "\n")
+ +(if not options.text_costs then forum_rules_filter_mtgsally_mse(remove_tags(card.rule_text)))
+ +(if options.text_costs then forum_rules_filter_plain(card.rule_text))
+ # The Flavor Text
+ +(if card.flavor_text != "" then "\n[i]")
+ +card.flavor_text
+ +(if card.flavor_text != "" then "[/i]")
+ # Life and Hand Modifiers
+ +"\nStarting & Max Hand Size: "+card.handmod
+ +"\nStarting Life: "+card.lifemod
+ # The Notes
+ +(if options.include_notes and card.notes !="" then "\n[spoiler]Card Notes: ")
+ +(if options.include_notes and card.notes !="" then card.notes)
+ +(if options.include_notes and card.notes !="" then "[/spoiler]")
+ +"\n"
+ }
+ write_cards := to_text(for each card in sort_list(cards, order_by: {input.card_number}) do write_card())
+ to_string("Full Spoiler List for "+set.title+"\nSet by "+options.creator+"\n"+set.description+"\n"+write_cards)
diff --git a/data/vanguard-forum.mse-export-template/icon.png b/data/vanguard-forum.mse-export-template/icon.png
new file mode 100644
index 00000000..f8155572
Binary files /dev/null and b/data/vanguard-forum.mse-export-template/icon.png differ
diff --git a/data/yugioh-forum.mse-export-template/export-template b/data/yugioh-forum.mse-export-template/export-template
new file mode 100644
index 00000000..fe76091f
--- /dev/null
+++ b/data/yugioh-forum.mse-export-template/export-template
@@ -0,0 +1,66 @@
+mse version: 0.3.8
+short name: Forum
+full name: Spoiler Exporter
+position hint: 002
+icon: icon.png
+version: 2009-12-18
+installer group: Yugioh/Export/forum
+
+depends on:
+ package: yugioh.mse-game
+ version: 2007-09-23
+
+game: yugioh
+file type: *.txt|*.txt|*.*|*.*
+
+# By Innuendo and Pichoro
+# Based on code by Idle Muse, Seeonee
+
+script:
+ # filter out everything but stars from the level line
+ level_star_filter := replace@(match:"", replace:"")+
+ replace@(match:"", replace:"")+
+ replace@(match:"!", replace:"")+
+ replace@(match:"[+]", replace:"")+
+ replace@(match:"&", replace:"")+
+ replace@(match:"$", replace:"")+
+ replace@(match:"#", replace:"")+
+ replace@(match:" ", replace:"")+
+ replace@(match:"[0-9]", replace:"")+
+ replace@(match:"[a-z]", replace:"")+
+ replace@(match:"[A-Z]", replace:"")
+ # counts stars by breaking them into a list and seeing how long the list is
+ level_count := {
+ if not is_monster() then level_star_filter(card.level)
+ else number_of_items(in: level_star_filter(card.level))
+ }
+ # Checks for each of the sub types
+ nonmonster_level_filter := { if contains(input, match:"%") then "Continuous"
+ +if contains(input, match:"!") then "Counter"
+ +if contains(input, match:"+") then "Equipment"
+ +if contains(input, match:"&") then "Field"
+ +if contains(input, match:"$") then "Quick-Play"
+ +if contains(input, match:"#") then "Ritual"
+ }
+ # remove spaces from things
+ no_spaces := replace@(match:" ", replace:"")
+ write_monster := {
+ "\n\n"+card.number+" "+card.name
+ +"\n"+no_spaces(card.monster_type)
+ +" | "+to_title(card.attribute)
+ +" | Level "+level_count()
+ +" | "+card.attack
+ +" ATK | "+card.defense
+ +" DEF\n"+card.rule_text
+ +(if card.rarity != "common" then "\n"+to_title(card.rarity))
+ }
+ write_nonmonster := {
+ "\n\n"+card.number+" "+card.name
+ +"\n"+nonmonster_level_filter(card.level)+(if nonmonster_level_filter(card.level)=="" then "Normal")
+ +" "+to_title(card.card_type)+"\n"
+ +card.rule_text
+ +(if card.rarity != "common" then "\n"+to_title(card.rarity))
+ }
+ write_card := { if is_monster() then write_monster() else write_nonmonster() }
+ write_cards := to_text(for each card in sort_list(cards, order_by: {card.number}) do write_card())
+ to_string(set.title+"\n"+set.description+write_cards)
diff --git a/data/yugioh-forum.mse-export-template/icon.png b/data/yugioh-forum.mse-export-template/icon.png
new file mode 100644
index 00000000..9752e08a
Binary files /dev/null and b/data/yugioh-forum.mse-export-template/icon.png differ