mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 19:28:01 +00:00
- Added a tool to test .dck files for 100% compatibility with Forge (may be useful when testing decks converted from other sources).
This commit is contained in:
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -17563,6 +17563,7 @@ forge-gui/tools/PerSetTracking.py svneol=native#text/x-python
|
||||
forge-gui/tools/assignSetInfo.py svneol=native#text/x-python
|
||||
forge-gui/tools/cardTemplateScript.py svneol=native#text/x-python
|
||||
forge-gui/tools/deckAiCompat.py -text
|
||||
forge-gui/tools/deckForgeCompat.py -text
|
||||
forge-gui/tools/extractSetInfo.py -text
|
||||
forge-gui/tools/formatCards -text
|
||||
forge-gui/tools/formats.txt -text
|
||||
|
||||
81
forge-gui/tools/deckForgeCompat.py
Normal file
81
forge-gui/tools/deckForgeCompat.py
Normal file
@@ -0,0 +1,81 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import argparse, os, re
|
||||
|
||||
print("Agetian's MTG Forge Deck Compatibility Analyzer v1.1\n")
|
||||
|
||||
parser = argparse.ArgumentParser(description="Analyze MTG Forge decks for compatibility.")
|
||||
parser.add_argument("-p", action="store_true", help="print only compatible decks")
|
||||
parser.add_argument("-u", action="store_true", help="print only incompatible decks")
|
||||
parser.add_argument("-d", action="store_true", help="physically delete unplayable decks")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# simple structural self-test (can this tool work?)
|
||||
if not (os.access(os.path.join("cardsfolder","a","abu_jafar.txt"),os.F_OK) or os.access(os.path.join("decks"),os.F_OK)):
|
||||
print("Fatal error:\n This utility requires the 'cardsfolder' folder with unpacked card files and the 'decks' folder with .dck files in the current directory in order to operate. Exiting.")
|
||||
exit(1)
|
||||
if args.p and args.u:
|
||||
print("Fatal error:\n The -p and -u options are mutually exclusive, please specify one of these options and not both of them at the same time.")
|
||||
exit(1)
|
||||
|
||||
# basic variables
|
||||
cardlist = []
|
||||
total_cards = 0
|
||||
total_decks = 0
|
||||
playable_decks = 0
|
||||
nonplayable_in_deck = 0
|
||||
|
||||
# main algorithm
|
||||
print("Loading cards...")
|
||||
for root, dirs, files in os.walk("cardsfolder"):
|
||||
for name in files:
|
||||
if name.find(".txt") != -1:
|
||||
total_cards += 1
|
||||
fullpath = os.path.join(root, name)
|
||||
cardtext = open(fullpath).read()
|
||||
cardtext_lower = cardtext.lower()
|
||||
cardname_literal = cardtext.replace('\r','').split('\n')[0].split(':')
|
||||
cardname = ":".join(cardname_literal[1:]).strip()
|
||||
if (cardtext_lower.find("alternatemode:split") != -1) or (cardtext_lower.find("alternatemode: split") != -1):
|
||||
# split card, special handling needed
|
||||
cardsplittext = cardtext.replace('\r','').split('\n')
|
||||
cardnames = []
|
||||
for line in cardsplittext:
|
||||
if line.lower().find("name:") != -1:
|
||||
cardnames.extend([line.split('\n')[0].split(':')[1]])
|
||||
cardname = " // ".join(cardnames)
|
||||
cardlist.extend([cardname])
|
||||
|
||||
print("Loaded %d cards.\n" % total_cards)
|
||||
|
||||
print("Scanning decks...")
|
||||
for root, dirs, files in os.walk("decks"):
|
||||
for name in files:
|
||||
if name.find(".dck") != -1:
|
||||
total_decks += 1
|
||||
nonplayable_in_deck = 0
|
||||
cardnames = []
|
||||
fullpath = os.path.join(root, name)
|
||||
deckdata = open(fullpath).readlines()
|
||||
for line in deckdata:
|
||||
regexobj = re.search('^([0-9]+) +([^|]+)', line)
|
||||
if regexobj:
|
||||
cardname = regexobj.groups()[1].replace('\n','').replace('\r','').strip()
|
||||
if cardname not in cardlist:
|
||||
cardnames.extend([cardname])
|
||||
nonplayable_in_deck += 1
|
||||
if nonplayable_in_deck == 0:
|
||||
if not args.u:
|
||||
playable_decks += 1
|
||||
print("%s is COMPATIBLE." % name)
|
||||
else:
|
||||
if not args.p:
|
||||
print("%s is INCOMPATIBLE (%d unsupported cards: %s)." % (name, nonplayable_in_deck, str(cardnames)))
|
||||
if args.d:
|
||||
os.remove(os.path.join(root, name))
|
||||
|
||||
perc_playable_decks = (float(playable_decks) / total_decks) * 100
|
||||
perc_unplayable_decks = ((float(total_decks) - playable_decks) / total_decks) * 100
|
||||
|
||||
print("\nScanned %d decks, among them %d supported (%d%%), %d unsupported (%d%%)." % (total_decks, playable_decks, perc_playable_decks, total_decks - playable_decks, perc_unplayable_decks))
|
||||
Reference in New Issue
Block a user