747614e355
Other misc fixes as well, we get all of the choice cards right in the encoding.
175 lines
6.1 KiB
Python
Executable file
175 lines
6.1 KiB
Python
Executable file
#!/usr/bin/env python
|
|
import sys
|
|
import os
|
|
|
|
libdir = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib')
|
|
sys.path.append(libdir)
|
|
import re
|
|
import random
|
|
import utils
|
|
import jdecode
|
|
import cardlib
|
|
|
|
def exclude_sets(cardset):
|
|
return cardset == 'Unglued' or cardset == 'Unhinged' or cardset == 'Celebration'
|
|
|
|
def exclude_types(cardtype):
|
|
return cardtype in ['conspiracy']
|
|
|
|
def exclude_layouts(layout):
|
|
return layout in ['token', 'plane', 'scheme', 'phenomenon', 'vanguard']
|
|
|
|
def main(fname, oname = None, verbose = True, dupes = 0, encoding = 'std', stable = False):
|
|
fmt_ordered = cardlib.fmt_ordered_default
|
|
fmt_labeled = None
|
|
fieldsep = utils.fieldsep
|
|
randomize_fields = False
|
|
randomize_mana = False
|
|
initial_sep = True
|
|
final_sep = True
|
|
|
|
# set the properties of the encoding
|
|
if encoding in ['std']:
|
|
if dupes == 0:
|
|
dupes = 1
|
|
elif encoding in ['rmana']:
|
|
if dupes == 0:
|
|
dupes = 3
|
|
randomize_mana = True
|
|
elif encoding in ['rmana_dual']:
|
|
if dupes == 0:
|
|
dupes = 3
|
|
fmt_ordered = fmt_ordered + [cardlib.field_cost]
|
|
randomize_mana = True
|
|
elif encoding in ['rfields']:
|
|
if dupes == 0:
|
|
dupes = 10
|
|
fmt_labeled = cardlib.fmt_labeled_default
|
|
randomize_fields = True
|
|
#randomize_mana = True
|
|
final_sep = False
|
|
else:
|
|
raise ValueError('encode.py: unknown encoding: ' + encoding)
|
|
|
|
if dupes <= 0:
|
|
dupes = 1
|
|
|
|
if verbose:
|
|
print 'Preparing to encode:'
|
|
print ' Using encoding ' + repr(encoding)
|
|
if dupes > 1:
|
|
print ' Duplicating each card ' + str(dupes) + ' times.'
|
|
if stable:
|
|
print ' NOT randomizing order of cards.'
|
|
|
|
|
|
cards = []
|
|
valid = 0
|
|
skipped = 0
|
|
invalid = 0
|
|
unparsed = 0
|
|
|
|
if fname[-5:] == '.json':
|
|
if verbose:
|
|
print 'This looks like a json file: ' + fname
|
|
json_srcs = jdecode.mtg_open_json(fname, verbose)
|
|
# don't worry we randomize later
|
|
for json_cardname in sorted(json_srcs):
|
|
if len(json_srcs[json_cardname]) > 0:
|
|
jcards = json_srcs[json_cardname]
|
|
card = cardlib.Card(json_srcs[json_cardname][0])
|
|
|
|
skip = False
|
|
if (exclude_sets(jcards[0][utils.json_field_set_name])
|
|
or exclude_layouts(jcards[0]['layout'])):
|
|
skip = True
|
|
for cardtype in card.types:
|
|
if exclude_types(cardtype):
|
|
skip = True
|
|
if skip:
|
|
skipped += 1
|
|
continue
|
|
|
|
if card.valid:
|
|
valid += 1
|
|
cards += [card] * dupes
|
|
elif card.parsed:
|
|
invalid += 1
|
|
else:
|
|
unparsed += 1
|
|
|
|
# fall back to opening a normal encoded file
|
|
else:
|
|
if verbose:
|
|
print 'Opening encoded card file: ' + fname
|
|
with open(fname, 'rt') as f:
|
|
text = f.read()
|
|
for card_src in text.split(utils.cardsep):
|
|
if card_src:
|
|
card = cardlib.Card(card_src)
|
|
if card.valid:
|
|
valid += 1
|
|
cards += [card] * dupes
|
|
elif card.parsed:
|
|
invalid += 1
|
|
else:
|
|
unparsed += 1
|
|
|
|
if verbose:
|
|
print (str(valid) + ' valid, ' + str(skipped) + ' skipped, '
|
|
+ str(invalid) + ' invalid, ' + str(unparsed) + ' failed to parse.')
|
|
|
|
# This should give a random but consistent ordering, to make comparing changes
|
|
# between the output of different versions easier.
|
|
if not stable:
|
|
random.seed(1371367)
|
|
random.shuffle(cards)
|
|
|
|
if oname:
|
|
if verbose:
|
|
print 'Writing output to: ' + oname
|
|
with open(oname, 'w') as ofile:
|
|
for card in cards:
|
|
ofile.write(card.encode(fmt_ordered = fmt_ordered,
|
|
fmt_labeled = fmt_labeled,
|
|
fieldsep = fieldsep,
|
|
randomize_fields = randomize_fields,
|
|
randomize_mana = randomize_mana,
|
|
initial_sep = initial_sep,
|
|
final_sep = final_sep)
|
|
+ utils.cardsep)
|
|
else:
|
|
for card in cards:
|
|
sys.stdout.write(card.encode(fmt_ordered = fmt_ordered,
|
|
fmt_labeled = fmt_labeled,
|
|
fieldsep = fieldsep,
|
|
randomize_fields = randomize_fields,
|
|
randomize_mana = randomize_mana,
|
|
initial_sep = initial_sep,
|
|
final_sep = final_sep)
|
|
+ utils.cardsep)
|
|
sys.stdout.flush()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
import argparse
|
|
parser = argparse.ArgumentParser()
|
|
|
|
parser.add_argument('infile',
|
|
help='encoded card file or json corpus to encode')
|
|
parser.add_argument('outfile', nargs='?', default=None,
|
|
help='output file, defaults to stdout')
|
|
parser.add_argument('-d', '--duplicate', metavar='N', type=int, default=0,
|
|
help='number of times to duplicate each card')
|
|
parser.add_argument('-e', '--encoding', default='std',
|
|
choices=['std', 'rmana', 'rmana_dual', 'rfields'])
|
|
parser.add_argument('-s', '--stable', action='store_true',
|
|
help="don't randomize the order of the cards")
|
|
parser.add_argument('-v', '--verbose', action='store_true',
|
|
help='verbose output')
|
|
|
|
args = parser.parse_args()
|
|
main(args.infile, args.outfile, verbose = args.verbose, dupes = args.duplicate,
|
|
encoding = args.encoding, stable = args.stable)
|
|
exit(0)
|
|
|