2015-07-16 06:40:15 +00:00
|
|
|
#!/usr/bin/env python
|
2015-07-01 04:25:29 +00:00
|
|
|
import sys
|
2015-07-16 06:40:15 +00:00
|
|
|
import os
|
2015-06-28 01:35:11 +00:00
|
|
|
|
2015-07-16 06:40:15 +00:00
|
|
|
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
|
2015-06-28 01:35:11 +00:00
|
|
|
|
2015-07-14 07:07:25 +00:00
|
|
|
def exclude_sets(cardset):
|
|
|
|
return cardset == 'Unglued' or cardset == 'Unhinged' or cardset == 'Celebration'
|
2015-06-28 01:35:11 +00:00
|
|
|
|
2015-07-14 07:07:25 +00:00
|
|
|
def exclude_types(cardtype):
|
|
|
|
return cardtype in ['conspiracy']
|
2015-06-28 01:35:11 +00:00
|
|
|
|
2015-07-14 07:07:25 +00:00
|
|
|
def exclude_layouts(layout):
|
|
|
|
return layout in ['token', 'plane', 'scheme', 'phenomenon', 'vanguard']
|
2015-06-28 01:35:11 +00:00
|
|
|
|
2015-07-16 06:40:15 +00:00
|
|
|
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
|
2015-07-29 08:21:34 +00:00
|
|
|
if encoding in ['vec']:
|
|
|
|
pass
|
|
|
|
elif encoding in ['std']:
|
2015-07-16 06:40:15 +00:00
|
|
|
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
|
2015-07-17 08:13:58 +00:00
|
|
|
#randomize_mana = True
|
2015-07-16 06:40:15 +00:00
|
|
|
final_sep = False
|
|
|
|
else:
|
|
|
|
raise ValueError('encode.py: unknown encoding: ' + encoding)
|
|
|
|
|
|
|
|
if dupes <= 0:
|
|
|
|
dupes = 1
|
|
|
|
|
2015-07-14 07:07:25 +00:00
|
|
|
if verbose:
|
2015-07-16 06:40:15 +00:00
|
|
|
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.'
|
|
|
|
|
2015-06-28 01:35:11 +00:00
|
|
|
|
2015-07-14 07:07:25 +00:00
|
|
|
cards = []
|
|
|
|
valid = 0
|
|
|
|
skipped = 0
|
|
|
|
invalid = 0
|
|
|
|
unparsed = 0
|
|
|
|
|
2015-07-16 06:40:15 +00:00
|
|
|
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
|
2015-07-17 08:13:58 +00:00
|
|
|
|
2015-07-16 06:40:15 +00:00
|
|
|
# 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
|
2015-06-28 01:35:11 +00:00
|
|
|
|
|
|
|
if verbose:
|
2015-07-14 07:07:25 +00:00
|
|
|
print (str(valid) + ' valid, ' + str(skipped) + ' skipped, '
|
|
|
|
+ str(invalid) + ' invalid, ' + str(unparsed) + ' failed to parse.')
|
2015-06-28 01:35:11 +00:00
|
|
|
|
2015-07-14 07:07:25 +00:00
|
|
|
# This should give a random but consistent ordering, to make comparing changes
|
|
|
|
# between the output of different versions easier.
|
2015-07-16 06:40:15 +00:00
|
|
|
if not stable:
|
|
|
|
random.seed(1371367)
|
|
|
|
random.shuffle(cards)
|
2015-06-28 01:35:11 +00:00
|
|
|
|
2015-07-29 08:21:34 +00:00
|
|
|
def writecards(writer):
|
2015-07-14 07:07:25 +00:00
|
|
|
for card in cards:
|
2015-07-29 08:21:34 +00:00
|
|
|
if encoding in ['vec']:
|
|
|
|
writer.write(card.vectorize() + '\n\n')
|
|
|
|
else:
|
|
|
|
writer.write(card.encode(fmt_ordered = fmt_ordered,
|
2015-07-16 06:40:15 +00:00
|
|
|
fmt_labeled = fmt_labeled,
|
|
|
|
fieldsep = fieldsep,
|
|
|
|
randomize_fields = randomize_fields,
|
|
|
|
randomize_mana = randomize_mana,
|
|
|
|
initial_sep = initial_sep,
|
|
|
|
final_sep = final_sep)
|
|
|
|
+ utils.cardsep)
|
2015-07-29 08:21:34 +00:00
|
|
|
|
|
|
|
if oname:
|
|
|
|
if verbose:
|
|
|
|
print 'Writing output to: ' + oname
|
|
|
|
with open(oname, 'w') as ofile:
|
|
|
|
writecards(ofile)
|
|
|
|
else:
|
|
|
|
writecards(sys.stdout)
|
2015-07-16 06:40:15 +00:00
|
|
|
sys.stdout.flush()
|
|
|
|
|
2015-06-28 01:35:11 +00:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
2015-07-16 06:40:15 +00:00
|
|
|
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',
|
2015-07-29 08:21:34 +00:00
|
|
|
choices=['std', 'rmana', 'rmana_dual', 'rfields', 'vec'])
|
2015-07-16 06:40:15 +00:00
|
|
|
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)
|
|
|
|
|