diff --git a/AIs.py b/AIs.py new file mode 100644 index 0000000..2c20229 --- /dev/null +++ b/AIs.py @@ -0,0 +1,213 @@ +#!/usr/bin/python +# -*- coding: utf8 -*- + +names = set(['Warlord Bot', 'Warlord Bot I', 'Warlord Bot II', 'Warlord Bot III', 'Villager Bot', 'Villager Bot I', 'Villager Bot II', 'Villager Bot III', 'Banker Bot', 'Banker Bot I', 'Banker Bot II', 'Banker Bot III', 'Village Idiot Bot', 'Village Idiot Bot I', 'Village Idiot Bot II', 'Village Idiot Bot III', 'Lord Bottington', 'Lord Bottington I', 'Lord Bottington II', 'Lord Bottington III', 'Serf Bot', 'Serf Bot I', 'Serf Bot II', 'Serf Bot III', 'Defender Bot', 'Defender Bot I', 'Defender Bot II', 'Defender Bot III', 'Conqueror Bot', 'Conqueror Bot I', 'Conqueror Bot II', 'Conqueror Bot III', #Basic names + 'Alice the Serf', 'Serf Adela', 'Maiden Abigail', 'King Rex', 'Serf Gordon', 'Maiden Marjoria', 'Squire Edwin', 'Queen Vada', 'Distant Cousin', 'Maiden Marie', 'Squire Clayton', 'Lady Sarra', 'Joseph Gelu', 'Overlord Hogan IV', ' Squire Brockton', 'Lady Marigold', 'Gentleman Garrick', 'Concealed Employer', 'Lady Gloriana', 'Gentleman Bradshaw', 'Gentleman Preston', 'Grandmother', #Base Set act 1 + 'Soldier', 'Witch Jezebel', 'Bonificaius', 'Sir Robert', 'Prince Arundel', 'Thief', 'Edith', 'Prince', 'Drusilla', 'Lord Madison', 'Baroness Paulina', 'Jeeves', 'Torturer', # Manually added +'Alice the Serf', # Andrew Iannacone's Script +'Captain Althea', +'Cardwell the Serf', +'Galore, the Mountebank', +'Gentleman Akelin', +'Gentleman Albert', +'Gentleman Althalos', +'Gentleman Alvar', +'Gentleman Ashton', +'Gentleman Bradshaw', +'Gentleman Charles', +'Gentleman Davidson', +'Gentleman Drake', +'Gentleman Earl', +'Gentleman Eduardo', +'Gentleman Egric', +'Gentleman Faran', +'Gentleman Gandolf', +'Gentleman Garrick', +'Gentleman Hal', +'Gentleman Harald', +'Gentleman Ivan', +'Gentleman Justin', +'Gentleman Keaton', +'Gentleman Morell', +'Gentleman Norman', +'Gentleman Osric', +'Gentleman Pierson', +'Gentleman Preston', +'Gentleman Searle', +'Gentleman Sedgewick', +'Gentleman Thrall', +'Gentleman Viktor', +'Gentleman Vilin', +'Gentleman Winston', +'Grandfather', +'Grandmother', +'King Leonard', +'King Rex', +'Lady Acelina', +'Lady Amelia', +'Lady Arabella', +'Lady Ayleth', +'Lady Aylild', +'Lady Celestine', +'Lady Christabel', +'Lady Dorcus', +'Lady Elena', +'Lady Felicia', +'Lady Florence', +'Lady Floria', +'Lady Gloriana', +'Lady Godelina', +'Lady Gussalen', +'Lady Hildegard', +'Lady Ida', +'Lady Ingride', +'Lady Juetta', +'Lady Kateryn', +'Lady Lia', +'Lady Maerwynn', +'Lady Marigold', +'Lady Maud', +'Lady Pya', +'Lady Sarra', +'Lady Tilla', +'Lady Vluerona', +'Leroy, King of Infamy', +'Maiden Abigail', +'Maiden Agatha', +'Maiden Chera', +'Maiden Diamanda', +'Maiden Ellyn', +'Maiden Esmaredla', +'Maiden Esther', +'Maiden Ewe', +'Maiden Guinevere', +'Maiden Jacquelyn', +'Maiden Jessica', +'Maiden Joya', +'Maiden Justina', +'Maiden Lettice', +'Maiden Lia', +'Maiden Lindara', +'Maiden Lynna', +'Maiden Marie', +'Maiden Marjoria', +'Maiden Mirabelle', +'Maiden Muriel', +'Maiden Nicholaa', +'Maiden Osanna', +'Maiden Rosamunda', +'Maiden Sarah', +'Maiden Ylaria', +'Overlord Hogan IV', +'Serf Adela', +'Serf Agnes', +'Serf Amiot', +'Serf Anselm', +'Serf Archer', +'Serf Beatrice', +'Serf Catrain', +'Serf Celestria', +'Serf Clarita', +'Serf Crispin', +'Serf Dionisia', +'Serf Eliose', +'Serf Filmore', +'Serf Fleur', +'Serf Frederick', +'Serf Gordon', +'Serf Greta', +'Serf Hague', +'Serf Henna', +'Serf Hunwald', +'Serf Ingrid', +'Serf Mary', +'Serf Matilda', +'Serf Milo', +'Serf Olaf', +'Serf Osred', +'Serf Oswyn', +'Serf Pandonia', +'Serf Rebecca', +'Serf Selda', +'Serf Silban', +'Serf Swale', +'Serf Tilla', +'Serf Willard', +'Serf Ysmay', +'Serf Zebulon', +'Squire Allister', +'Squire Brockton', +'Squire Bryce', +'Squire Chermin', +'Squire Clayton', +'Squire Clifton', +'Squire Denis', +'Squire Edwin', +'Squire Elmo', +'Squire Fabian', +'Squire Hadrian', +'Squire Lance', +'Squire Leik', +'Squire Levi', +'Squire Lyman', +'Squire Matthew', +'Squire Mendel', +'Squire Nuno', +'Squire Quentin', +'Squire Ronin', +'Squire Rylan', +'Squire Saxon', +'Squire Sedgewick', +'Squire Silas', +'Squire Simeon', +'Squire Solomon', +'Squire Stephen', +'Squire Tarquin', +'Squire Taua', +'Squire Terrald', +'Squire Tigra', +'Squire Winter', +'Squire Wolfe', +'Squire Xabier', +'Gentleman Ingvar', +'Gentleman Donald', +'Gentleman Benjamin', +'Gentleman Tristan', +'Gentleman Russell', +'Lady Amethyst', +'Lady Thomasine', +'Lady Colette', +'Lady Ellen', +'Lady Philippa', +'Lady Delchunk', +'Lady Fustaca', +'Lady Jinx', +'Lady Lizzy', +'Lady Margaret', +'Lady Serafi', +'Squire Steven', +'Squire Redwald', +'Squire Kalle', +'Serf Alis', +'Serf Valenia', +'Serf Erik', +'Lord Vaccarino', +'Lord Nimrod', +'Lord Greystone', +'Lord Avan', +'Lord RenĂ©', +'Lord Tywin', +'Lord Calvin', +'Lord Felik', +'Lord Xaiver', +'King Grappa', +'King Peter', +'Maiden Joanna', + 'Tutor Thomas', + 'Leo', # Base set act 2 + 'Sea Hag', 'Ghost Gavin','Gavin the Terrible', 'Ricker', 'Jewel Owner', 'Ela', #Seaside adventures. Prosperity adventures have no new names. + 'Belinda', 'Servant', #Intrigue adventures + 'Silver Knight', 'Rayne', 'Archer', 'Bonifacius', 'Simon', 'Egbert', 'Barnabas', 'Morgana', 'Vagrant', # Dark Ages + 'WeiBot', 'Weibot', # Hinterlands + 'Cadby' #Alchemy + ]) diff --git a/README.rst b/README.rst index 0f8527e..94851c4 100644 --- a/README.rst +++ b/README.rst @@ -49,7 +49,8 @@ update_loop.py script, which will take a few hours to download one months of games logs from councilroom, and then parse through it all and load it into a database:: - python update_loop.py + python update_loop.py +These instructions are outdated and no longer work. Use update.py, which is run through a worker script. And after that is down, this starts webserver running on localhost:8080:: diff --git a/analyze.py b/analyze.py index a587f3c..e42d939 100644 --- a/analyze.py +++ b/analyze.py @@ -59,7 +59,7 @@ def analyze_game(self, game): self.num_games += 1 seen_cards_players = set() self.max_game_id = max(self.max_game_id, game.get_id()) - for card in game.get_supply() + EVERY_SET_CARDS: + for card in set(game.get_supply() + EVERY_SET_CARDS): self.card_stats[card].available += len(game.get_player_decks()) accumed_by_player = collections.defaultdict(lambda : collections.defaultdict(int)) diff --git a/annotate_game.py b/annotate_game.py index 5895838..7e4e312 100644 --- a/annotate_game.py +++ b/annotate_game.py @@ -7,6 +7,7 @@ import game import goals import parse_game +import parse_iso_game from keys import * def _pretty_format_html(v): @@ -38,9 +39,20 @@ def get_goals(game): goal_contents += '' return "goals%s"%goal_contents +def annotate_goko_game(contents, game_id, debug): + """ TODO: actually do the annotation in-house. Someone will want to do that. + Not me, not now, I've spent a lot of time on goko importing over the past + month. """ + return '' % game_id + 'Redirecting to annotated game at dom.retrobox.eu' % game_id + + + def annotate_game(contents, game_id, debug=False): """ Decorate game contents with some JS that makes a score keeper and provides anchors per turn.""" + if game_id[-4:] == '.txt': + return annotate_goko_game(contents, game_id, debug) + contents = contents.replace('—', '---').replace( 'semistatic/log.css', 'client.css') parsed_game = parse_game.parse_game(contents, dubious_check = False) @@ -97,7 +109,7 @@ def annotate_game(contents, game_id, debug=False): cur_turn_ind = 0 - split_turn_chunks = parse_game.split_turns(contents) + split_turn_chunks = parse_iso_game.split_turns(contents) ret += split_turn_chunks[0] split_turn_chunks.pop(0) diff --git a/background/celery.py b/background/celery.py index f5be04a..59cf24b 100644 --- a/background/celery.py +++ b/background/celery.py @@ -7,6 +7,11 @@ broker='redis://cr-master-internal.mccllstr.com:6379/0', include=['background.tasks']) +#celery = Celery('background.celery', + #backend='redis://127.0.0.1:6379/0', + #broker='redis://127.0.0.1:6379/0', + #include=['background.tasks']) + # Optional configuration, see the application user guide. celery.conf.update( CELERY_TASK_RESULT_EXPIRES=3600, diff --git a/background/tasks.py b/background/tasks.py index 60522a3..89ae577 100644 --- a/background/tasks.py +++ b/background/tasks.py @@ -13,6 +13,7 @@ from parse_game import parse_and_insert import game_stats import isotropic +import goko import utils @@ -24,7 +25,7 @@ SUMMARIZE_GAMES_CHUNK_SIZE = 2000 -@celery.task +@celery.task def parse_games(games, day): """Takes list of game ids and a game date and parses them out.""" log.info("Parsing %d games for %s", len(games), day) @@ -46,7 +47,7 @@ def parse_games(games, day): return parse_and_insert(log, raw_games, parsed_games_col, parse_error_col, day) -@celery.task +@celery.task def parse_days(days): """Parses rawgames into games records and stores them in the DB. @@ -56,7 +57,7 @@ def parse_days(days): Skips days where there are no rawgames available. - Skips days where the parsed game collection has more than 65% of + Skips days where the parsed game collection has more than 95% of the quantity of rawgames, as this suggests the date has already been parsed. @@ -79,7 +80,7 @@ def parse_days(days): continue parsed_games_qty = games_col.find({'game_date': day}).count() - if float(parsed_games_qty) / float(raw_games_qty) > 0.65: + if float(parsed_games_qty) / float(raw_games_qty) > 0.85: log.info('Looks like raw games for %s have already been parsed. Found %5.2f%% in games collection.', day, 100.0 * parsed_games_qty / raw_games_qty) continue @@ -87,12 +88,12 @@ def parse_days(days): game_count += games_to_parse.count() log.info('%s games to parse in %s', games_to_parse.count(), day) for chunk in utils.segments([x['_id'] for x in games_to_parse], PARSE_GAMES_CHUNK_SIZE): - parse_games.delay(chunk, day) + parse_games.delay(chunk, day) return game_count -@celery.task +@celery.task def calc_goals(game_ids, day): """ Calculate the goals achieved in the passed list of games """ log.info("Calculating goals for %d game IDs from %s", len(game_ids), day) @@ -114,7 +115,7 @@ def calc_goals(game_ids, day): return calculate_goals(games, goals_col, goals_error_col, day) -@celery.task +@celery.task def calc_goals_for_days(days): """Examines games and determines if any goals were achieved, storing them in the DB. @@ -149,7 +150,7 @@ def calc_goals_for_days(days): chunk = [] for game in games_to_process: if len(chunk) >= CALC_GOALS_CHUNK_SIZE: - calc_goals.delay(chunk, day) + calc_goals.delay(chunk, day) chunk = [] if goals_col.find({'_id': game['_id']}).count() == 0: @@ -157,7 +158,7 @@ def calc_goals_for_days(days): game_count += 1 if len(chunk) > 0: - calc_goals.delay(chunk, day) + calc_goals.delay(chunk, day) return game_count @@ -170,22 +171,23 @@ def scrape_raw_games(date): """ db = utils.get_mongo_database() - scraper = isotropic.IsotropicScraper(db) + scraper = goko.GokoScraper(db) try: inserted = scraper.scrape_and_store_rawgames(date) - if inserted > 0: + #if inserted > 0: #TODO:FIX # Also need to parse the raw games for the days where we # inserted new records. - parse_days.delay([date]) + #parse_days.delay([date]) + parse_days.delay([date]) return inserted - except isotropic.ScrapeError: - log.info("Data for %s is not yet available", date) + except goko.ScrapeError: + log.info("Data for %s is not available", date) return None -@celery.task +@celery.task def check_for_work(): """Examine the state of the database and generate tasks for necessary work. @@ -198,8 +200,8 @@ def check_for_work(): connection = utils.get_mongo_connection() db = connection.test - # Scrape isotropic for raw games - for date in isotropic.dates_needing_scraping(db): + # Scrape goko for raw games + for date in goko.dates_needing_scraping(db): scrape_raw_games.delay(date) @@ -241,9 +243,10 @@ def summarize_game_stats_for_days(days): summarize_games.delay(chunk, day) chunk = [] - if game_stats_col.find({'_id.game_id': game['_id']}).count() == 0: - chunk.append(game['_id']) - game_count += 1 + # Is this really slow? Does it need to be fixed? + #if game_stats_col.find({'_id.game_id': game['_id']}).count() == 0: + chunk.append(game['_id']) + game_count += 1 if len(chunk) > 0: summarize_games.delay(chunk, day) diff --git a/card_info/__init__.py b/card_info/__init__.py index 812351a..aab0245 100644 --- a/card_info/__init__.py +++ b/card_info/__init__.py @@ -162,7 +162,7 @@ def num_copies_per_game(card_name, num_players): 'Copper', 'Silver', 'Gold', 'Curse'] OPENING_CARDS = [card for card in _card_info_rows - if cost(card) in ('0', '2', '3', '4', '5')] + if cost(card) in ('0','1', '2', '3', '4', '5')] OPENING_CARDS.sort() def sane_title(card): diff --git a/card_info/card_list.csv b/card_info/card_list.csv index 5b47a53..6bc04db 100644 --- a/card_info/card_list.csv +++ b/card_info/card_list.csv @@ -1,174 +1,244 @@ -Singular,Plural,Cost,Actions,Cards,Action,Treasure,Victory,Attack,Reaction,Duration,VP,Trash,Coins,Buys,Index,Expansion,Abbreviation -Adventurer,Adventurers,6,0,2,1,0,0,0,0,0,0,0,0,0,0,Dominion,Adv -Alchemist,Alchemists,P3,1,2,1,0,0,0,0,0,0,0,0,0,1,Alchemy,Alc -Ambassador,Ambassadors,3,0,0,1,0,0,1,0,0,0,0,0,0,2,Seaside,Amb -Apothecary,Apothecaries,P2,1,1,1,0,0,0,0,0,0,0,0,0,3,Alchemy,Apoth -Apprentice,Apprentices,5,1,0,1,0,0,0,0,0,0,1,0,0,4,Alchemy,App -Archivist,Archivists,5,1,?,1,0,0,0,0,0,0,0,?,0,5,Fan,Arc -"Bag of Gold","Bags of Gold",*0,1,0,1,0,0,0,0,0,0,0,0,0,6,Cornucopia,BoG -Bank,Banks,7,0,0,0,1,0,0,0,0,0,0,?,0,7,Prosperity,Bank -Baron,Barons,4,0,0,1,0,0,0,0,0,0,0,4,1,8,Intrigue,Bron -Bazaar,Bazaars,5,2,1,1,0,0,0,0,0,0,0,1,0,9,Seaside,Baz -Bishop,Bishops,4,0,0,1,0,0,0,0,0,0,1,1,0,10,Prosperity,Bish -"Black Market","Black Markets",3,0,0,1,0,0,0,0,0,0,0,2,1,11,Promotional,BMark -"Border Village","Border Villages",6,2,1,1,0,0,0,0,0,0,0,0,0,12,Hinterlands,Bord -Bridge,Bridges,4,0,0,1,0,0,0,0,0,0,0,1,1,13,Intrigue,Bri -Bureaucrat,Bureaucrats,4,0,0,1,0,0,1,0,0,0,0,0,0,14,Dominion,Bur -Cache,Caches,5,0,0,0,1,0,0,0,0,0,0,3,0,15,Hinterlands,Cache -Caravan,Caravans,4,1,1,1,0,0,0,0,1,0,0,0,0,16,Seaside,Cvan -Cartographer,Cartographers,5,1,1,1,0,0,0,0,0,0,0,0,0,17,Hinterlands,Cart -Cellar,Cellars,2,1,0,1,0,0,0,0,0,0,0,0,0,18,Dominion,Cel -Chancellor,Chancellors,3,0,0,1,0,0,0,0,0,0,0,2,0,19,Dominion,Chan -Chapel,Chapels,2,0,0,1,0,0,0,0,0,0,4,0,0,20,Dominion,Chap -City,Cities,5,2,1,1,0,0,0,0,0,0,0,1,1,21,Prosperity,City -Colony,Colonies,11,0,0,0,0,1,0,0,0,10,0,0,0,22,Prosperity,Col -Conspirator,Conspirators,4,0,0,1,0,0,0,0,0,0,0,2,0,23,Intrigue,Cons -Contraband,Contrabands,5,0,0,0,1,0,0,0,0,0,0,3,1,24,Prosperity,Cband -Copper,Coppers,0,0,0,0,1,0,0,0,0,0,0,1,0,25,Common,Cop -Coppersmith,Coppersmiths,4,0,0,1,0,0,0,0,0,0,0,0,0,26,Intrigue,Csmith -"Council Room","Council Rooms",5,0,4,1,0,0,0,0,0,0,0,0,1,27,Dominion,CR -"Counting House","Counting Houses",5,0,0,1,0,0,0,0,0,0,0,0,0,28,Prosperity,CH -Courtyard,Courtyards,2,0,2,1,0,0,0,0,0,0,0,0,0,29,Intrigue,Cyard -Crossroads,Crossroads,2,?,?,1,0,0,0,0,0,0,0,0,0,30,Hinterlands,Croads -Curse,Curses,0,0,0,0,0,0,0,0,0,-1,0,0,0,31,Common,Curse -Cutpurse,Cutpurses,4,0,0,1,0,0,1,0,0,0,0,2,0,32,Seaside,Cut -Develop,Develops,3,0,0,1,0,0,0,0,0,0,0,0,0,33,Hinterlands,Dev -Diadem,Diadems,*0,0,0,0,1,0,0,0,0,0,0,?,0,34,Cornucopia,Dia -Duchy,Duchies,5,0,0,0,0,1,0,0,0,3,0,0,0,35,Common,Duchy -Duke,Dukes,5,0,0,0,0,1,0,0,0,?,0,0,0,36,Intrigue,Duke -Duchess,Duchesses,2,0,0,1,0,0,0,0,0,0,0,2,0,37,Hinterlands,Dss -Embargo,Embargoes,2,0,0,1,0,0,0,0,0,0,1,2,0,38,Seaside,Ebarg -Embassy,Embassies,5,0,5,1,0,0,0,0,0,0,0,0,0,39,Hinterlands,Ebass -Envoy,Envoys,4,0,4,1,0,0,0,0,0,0,0,0,0,40,Promotional,Env -Estate,Estates,2,0,0,0,0,1,0,0,0,1,0,0,0,41,Common,Est -Expand,Expands,7,0,0,1,0,0,0,0,0,0,1,0,0,42,Prosperity,Epand -Explorer,Explorers,5,0,0,1,0,0,0,0,0,0,0,0,0,43,Seaside,Expl -Fairgrounds,Fairgrounds,6,0,0,0,0,1,0,0,0,?,0,0,0,44,Cornucopia,Fair -Familiar,Familiars,P3,1,1,1,0,0,1,0,0,0,0,0,0,45,Alchemy,Fam -"Farming Village","Farming Villages",4,2,1,1,0,0,0,0,0,0,0,0,0,46,Cornucopia,FarmV -Farmland,Farmlands,6,0,0,0,0,1,0,0,0,2,0,0,0,47,Hinterlands,Fland -Feast,Feasts,4,0,0,1,0,0,0,0,0,0,1,0,0,48,Dominion,Feast -Festival,Festivals,5,2,0,1,0,0,0,0,0,0,0,2,1,49,Dominion,Fest -"Fishing Village","Fishing Villages",3,2,0,1,0,0,0,0,1,0,0,1,0,50,Seaside,FishV -Followers,Followers,*0,0,2,1,0,0,0,0,0,0,0,0,0,51,Cornucopia,Foll -"Fool's Gold","Fool's Golds",2,0,0,0,1,0,0,1,0,0,0,?,0,52,Hinterlands,Fool -Forge,Forges,7,0,0,1,0,0,0,0,0,0,99,0,0,53,Prosperity,Forge -"Fortune Teller","Fortune Tellers",3,0,0,1,0,0,0,0,0,0,0,2,0,54,Cornucopia,FT -Gardens,Gardens,4,0,0,0,0,1,0,0,0,?,0,0,0,55,Dominion,Gard -"Ghost Ship","Ghost Ships",5,0,2,1,0,0,1,0,0,0,0,0,0,56,Seaside,GS -Gold,Golds,6,0,0,0,1,0,0,0,0,0,0,3,0,57,Common,Gold -Golem,Golems,P4,0,0,1,0,0,0,0,0,0,0,0,0,58,Alchemy,Golem -Goons,Goons,6,0,0,1,0,0,1,0,0,0,0,2,1,59,Prosperity,Goon -Governor,Governors,5,1,?,1,0,0,0,0,0,0,?,0,0,60,Promotional,Gov -"Grand Market","Grand Markets",6,1,1,1,0,0,0,0,0,0,0,2,1,61,Prosperity,Gmark -"Great Hall","Great Halls",3,1,1,1,0,1,0,0,0,1,0,0,0,62,Intrigue,GH -Haggler,Hagglers,5,0,0,1,0,0,0,0,0,0,0,2,0,63,Hinterlands,Hag -Hamlet,Hamlets,2,2,1,1,0,0,0,0,0,0,0,0,1,64,Cornucopia,Ham -Harem,Harems,6,0,0,0,1,1,0,0,0,2,0,2,0,65,Intrigue,Harem -Harvest,Harvests,5,0,0,1,0,0,0,0,0,0,0,?,0,66,Cornucopia,Hvest -Haven,Havens,2,1,1,1,0,0,0,0,1,0,0,0,0,67,Seaside,Hav -Herbalist,Herbalists,2,0,0,1,0,0,0,0,0,0,0,1,1,68,Alchemy,Herb -Highway,Highways,5,1,1,1,0,0,0,0,0,0,0,0,0,69,Hinterlands,Hway -Hoard,Hoards,6,0,0,0,1,0,0,0,0,0,0,2,0,70,Prosperity,Hoard -"Horn of Plenty","Horns of Plenty",5,0,0,0,1,0,0,0,0,0,0,0,0,71,Cornucopia,HoP -"Horse Traders","Horse Traders",4,0,-2,1,0,0,0,1,0,0,0,3,1,72,Cornucopia,HT -"Hunting Party","Hunting Parties",5,1,2,1,0,0,0,0,0,0,0,0,0,73,Cornucopia,Hunt -"Ill-Gotten Gains","Ill-Gotten Gains",5,0,0,0,1,0,0,0,0,0,0,0,0,74,Hinterlands,IGG -Inn,Inns,5,2,2,1,0,0,0,0,0,0,0,0,0,75,Hinterlands,Inn -Ironworks,Ironworks,4,0,0,1,0,0,0,0,0,0,0,1,0,76,Intrigue,Iron -Island,Islands,4,0,0,1,0,1,0,0,0,2,0,0,0,77,Seaside,Isl -"Jack of All Trades","Jacks of All Trades",4,0,0,1,0,0,0,0,0,0,0,0,0,78,Hinterlands,JoaT -Jester,Jesters,5,0,0,1,0,0,1,0,0,0,0,2,0,79,Cornucopia,Jest -"King's Court","King's Courts",7,0,0,1,0,0,0,0,0,0,0,0,0,80,Prosperity,KC -Laboratory,Laboratories,5,1,2,1,0,0,0,0,0,0,0,0,0,81,Dominion,Lab -Library,Libraries,5,0,3,1,0,0,0,0,0,0,0,0,0,82,Dominion,Lib -Lighthouse,Lighthouses,2,1,0,1,0,0,0,1,1,0,0,1,0,83,Seaside,Light -Loan,Loans,3,0,0,0,1,0,0,0,0,0,1,1,0,84,Prosperity,Loan -Lookout,Lookouts,3,1,0,1,0,0,0,0,0,0,1,0,0,85,Seaside,Look -Mandarin,Mandarins,5,0,0,1,3,0,0,0,0,0,0,3,0,86,Hinterlands,Mand -Market,Markets,5,1,1,1,0,0,0,0,0,0,0,1,1,87,Dominion,Mark -Margrave,Margraves,5,0,3,1,0,0,1,0,0,0,0,0,1,88,Hinterlands,Marg -Masquerade,Masquerades,3,0,2,1,0,0,0,0,0,0,1,0,0,89,Intrigue,Masq -Menagerie,Menageries,3,1,3,1,0,0,0,0,0,0,0,0,,90,Cornucopia,Men -"Merchant Ship","Merchant Ships",5,0,0,1,0,0,0,0,1,0,0,2,0,91,Seaside,MS -Militia,Militias,4,0,0,1,0,0,1,0,0,0,0,2,0,92,Dominion,Mil -Mine,Mines,5,0,0,1,0,0,0,0,0,0,1,0,0,93,Dominion,Mine -"Mining Village","Mining Villages",4,2,1,1,0,0,0,0,0,0,1,2,0,94,Intrigue,MinV -Minion,Minions,5,1,0,1,0,0,1,0,0,0,0,2,0,95,Intrigue,Mion -Mint,Mints,5,0,0,1,0,0,0,0,0,0,?,0,0,96,Prosperity,Mint -Moat,Moats,2,0,2,1,0,0,0,1,0,0,0,0,0,97,Dominion,Moa -Moneylender,Moneylenders,4,0,0,1,0,0,0,0,0,0,1,3,0,98,Dominion,Mlend -Monument,Monuments,4,0,0,1,0,0,0,0,0,0,0,2,0,99,Prosperity,Mment -Mountebank,Mountebanks,5,0,0,1,0,0,1,0,0,0,0,2,0,100,Prosperity,Mbank -"Native Village","Native Villages",2,2,0,1,0,0,0,0,0,0,0,0,0,101,Seaside,NatV -Navigator,Navigators,4,0,0,1,0,0,0,0,0,0,0,2,0,102,Seaside,Nav -Nobles,Nobles,6,2,3,1,0,1,0,0,0,2,0,0,0,103,Intrigue,Nbles -"Noble Brigand","Noble Brigands",4,0,0,1,0,0,1,0,0,0,0,1,0,104,Hinterlands,NBri -"Nomad Camp","Nomad Camps",4,0,0,1,0,0,0,0,0,0,0,2,1,105,Hinterlands,NCamp -Oasis,Oases,3,1,1,1,0,0,0,0,0,0,0,1,0,106,Hinterlands,Oasis -Oracle,Oracles,3,0,2,1,0,0,1,0,0,0,0,0,0,107,Hinterlands,Ora -Outpost,Outposts,5,0,0,1,0,0,0,0,1,0,0,0,0,108,Seaside,Out -Pawn,Pawns,2,1,1,1,0,0,0,0,0,0,0,1,1,109,Intrigue,Pawn -"Pearl Diver","Pearl Divers",2,1,1,1,0,0,0,0,0,0,0,0,0,110,Seaside,PDiv -Peddler,Peddlers,8,1,1,1,0,0,0,0,0,0,0,1,0,111,Prosperity,Ped -"Philosopher's Stone","Philosopher's Stones",P3,0,0,0,1,0,0,0,0,0,0,?,0,112,Alchemy,PStone -"Pirate Ship","Pirate Ships",4,0,0,1,0,0,1,0,0,0,0,?,0,113,Seaside,PShip -Platinum,Platinums,9,0,0,0,1,0,0,0,0,0,0,5,0,114,Prosperity,Plat -Possession,Possessions,P6,0,0,1,0,0,0,0,0,0,0,0,0,115,Alchemy,Pos -Potion,Potions,4,0,0,0,1,0,0,0,0,0,0,P,0,116,Alchemy,Pot -Princess,Princesses,*0,0,0,1,0,0,0,0,0,0,0,0,1,117,Cornucopia,Prin -Province,Provinces,8,0,0,0,0,1,0,0,0,6,0,0,0,118,Common,Prov -Quarry,Quarries,4,0,0,0,1,0,0,0,0,0,0,1,0,119,Prosperity,Qua -Rabble,Rabbles,5,0,3,1,0,0,1,0,0,0,0,0,0,120,Prosperity,Rab -Remake,Remakes,4,0,0,1,0,0,0,0,0,0,2,0,0,121,Cornucopia,Rke -Remodel,Remodels,4,0,0,1,0,0,0,0,0,0,1,0,0,122,Dominion,Rdel -"Royal Seal","Royal Seals",5,0,0,0,1,0,0,0,0,0,0,2,0,123,Prosperity,RS -Saboteur,Saboteurs,5,0,0,1,0,0,1,0,0,0,0,0,0,124,Intrigue,Sab -Salvager,Salvagers,4,0,0,1,0,0,0,0,0,0,1,?,1,125,Seaside,Salv -Scheme,Schemes,3,1,1,1,0,0,0,0,0,0,0,0,0,126,Hinterlands,Sch -Scout,Scouts,4,1,0,1,0,0,0,0,0,0,0,0,0,127,Intrigue,Sco -"Scrying Pool","Scrying Pools",P2,1,1,1,0,0,1,0,0,0,0,0,0,128,Alchemy,SP -"Sea Hag","Sea Hags",4,0,0,1,0,0,1,0,0,0,0,0,0,129,Seaside,SHag -"Secret Chamber","Secret Chambers",2,0,0,1,0,0,0,1,0,0,0,?,0,130,Intrigue,SC -"Shanty Town","Shanty Towns",3,2,2,1,0,0,0,0,0,0,0,0,0,131,Intrigue,ST -"Silk Road","Silk Roads",4,0,0,0,0,1,0,0,0,?,0,0,0,132,Hinterlands,SR -Silver,Silvers,3,0,0,0,1,0,0,0,0,0,0,2,0,133,Common,Silv -Smithy,Smithies,4,0,3,1,0,0,0,0,0,0,0,0,0,134,Dominion,Sthy -Smugglers,Smugglers,3,0,0,1,0,0,0,0,0,0,0,0,0,135,Seaside,Smug -"Spice Merchant","Spice Merchants",4,?,?,1,0,0,0,0,0,0,0,?,?,136,Hinterlands,SMrch -Spy,Spies,4,1,1,1,0,0,1,0,0,0,0,0,0,137,Dominion,Spy -Stables,Stables,5,0,0,1,0,0,0,0,0,0,0,0,0,138,Hinterlands,Stab -Stash,Stashes,5,0,0,0,1,0,0,0,0,0,0,2,0,139,Promotional,Sash -Steward,Stewards,3,0,2,1,0,0,0,0,0,0,2,2,0,140,Intrigue,Ste -Swindler,Swindlers,3,0,0,1,0,0,1,0,0,0,0,2,0,141,Intrigue,Swi -Tactician,Tacticians,5,0,0,1,0,0,0,0,1,0,0,0,0,142,Seaside,Tac -Talisman,Talismans,4,0,0,0,1,0,0,0,0,0,0,1,0,143,Prosperity,Tman -Thief,Thieves,4,0,0,1,0,0,1,0,0,0,0,0,0,144,Dominion,Thi -"Throne Room","Throne Rooms",4,0,0,1,0,0,0,0,0,0,0,0,0,145,Dominion,TRoom -Torturer,Torturers,5,0,3,1,0,0,1,0,0,0,0,0,0,146,Intrigue,Tort -Tournament,Tournaments,4,1,1,1,0,0,0,0,0,0,0,1,0,147,Cornucopia,Tou -"Trade Route","Trade Routes",3,0,0,1,0,0,0,0,0,0,1,?,1,148,Prosperity,TRoute -Trader,Traders,4,0,0,1,0,0,0,1,0,0,1,0,0,149,Hinterlands,Tder -"Trading Post","Trading Posts",5,0,0,1,0,0,0,0,0,0,2,0,0,150,Intrigue,TPst -Transmute,Transmutes,P,0,0,1,0,0,0,0,0,0,1,0,0,151,Alchemy,Tmut -"Treasure Map","Treasure Maps",4,0,0,1,0,0,0,0,0,0,2,0,0,152,Seaside,TMap -Treasury,Treasuries,5,1,1,1,0,0,0,0,0,0,0,1,0,153,Seaside,Tsury -Tribute,Tributes,5,?,?,1,0,0,0,0,0,0,0,?,0,154,Intrigue,Trib -"Trusty Steed","Trusty Steeds",*0,?,?,1,0,0,0,0,0,0,0,?,0,155,Cornucopia,TS -Tunnel,Tunnels,3,0,0,0,0,1,0,1,0,2,0,0,0,156,Hinterlands,Tun -University,Universities,P2,2,0,1,0,0,0,0,0,0,0,0,0,157,Alchemy,Un -Upgrade,Upgrades,5,1,1,1,0,0,0,0,0,0,1,0,0,158,Intrigue,Up -Vault,Vaults,5,0,2,1,0,0,0,0,0,0,0,?,0,159,Prosperity,Va -Venture,Ventures,5,0,0,0,1,0,0,0,0,0,0,1,0,160,Prosperity,Ven -Village,Villages,3,2,1,1,0,0,0,0,0,0,0,0,0,161,Dominion,Vil -Vineyard,Vineyards,P,0,0,0,0,1,0,0,0,?,0,0,0,162,Alchemy,Vin -"Walled Village","Walled Villages",4,2,1,1,0,0,0,0,0,0,0,0,0,163,Promotional,Wvil -Warehouse,Warehouses,3,1,0,1,0,0,0,0,0,0,0,0,0,164,Seaside,Whouse -Watchtower,Watchtowers,3,0,2,1,0,0,0,1,0,0,0,0,0,165,Prosperity,Wat -Wharf,Wharves,5,0,2,1,0,0,0,0,1,0,0,0,1,166,Seaside,Wrf -"Wishing Well","Wishing Wells",3,1,1,1,0,0,0,0,0,0,0,0,0,167,Intrigue,WW -Witch,Witches,5,0,2,1,0,0,1,0,0,0,0,0,0,168,Dominion,Wit -Woodcutter,Woodcutters,3,0,0,1,0,0,0,0,0,0,0,2,1,169,Dominion,Wood -"Worker's Village","Worker's Villages",4,2,1,1,0,0,0,0,0,0,0,0,1,170,Prosperity,Wvil -Workshop,Workshops,3,0,0,1,0,0,0,0,0,0,0,0,0,171,Dominion,Wshop -"Young Witch","Young Witches",4,0,2,1,0,0,0,0,0,0,0,0,0,172,Cornucopia,Yng +Singular,Plural,Cost,Actions,Cards,Action,Treasure,Victory,Attack,Reaction,Duration,Ruins,Looter,Shelter,Knight,VP,Trash,Coins,Buys,CoinTokens,Index,Expansion,Abbreviation +Adventurer,Adventurers,6,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Dominion,Adv +Alchemist,Alchemists,P3,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,Alchemy,Alc +Ambassador,Ambassadors,3,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,2,Seaside,Amb +Apothecary,Apothecaries,P2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,Alchemy,Apoth +Apprentice,Apprentices,5,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,Alchemy,App +Archivist,Archivists,5,1,?,1,0,0,0,0,0,0,0,0,0,0,0,?,0,0,5,Fan,Arc +"Bag of Gold","Bags of Gold",*0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,Cornucopia,BoG +Bank,Banks,7,0,0,0,1,0,0,0,0,0,0,0,0,0,0,?,0,0,7,Prosperity,Bank +Baron,Barons,4,0,0,1,0,0,0,0,0,0,0,0,0,0,0,?,1,0,8,Intrigue,Bron +Bazaar,Bazaars,5,2,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,9,Seaside,Baz +Bishop,Bishops,4,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,10,Prosperity,Bish +"Black Market","Black Markets",3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,2,1,0,11,Promotional,BMark +"Border Village","Border Villages",6,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,Hinterlands,Bord +Bridge,Bridges,4,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,13,Intrigue,Bri +Bureaucrat,Bureaucrats,4,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,14,Dominion,Bur +Cache,Caches,5,0,0,0,1,0,0,0,0,0,0,0,0,0,0,3,0,0,15,Hinterlands,Cache +Caravan,Caravans,4,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,16,Seaside,Cvan +Cartographer,Cartographers,5,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,Hinterlands,Cart +Cellar,Cellars,2,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,Dominion,Cel +Chancellor,Chancellors,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,19,Dominion,Chan +Chapel,Chapels,2,0,0,1,0,0,0,0,0,0,0,0,0,0,4,0,0,0,20,Dominion,Chap +City,Cities,5,2,1,1,0,0,0,0,0,0,0,0,0,0,0,?,1,0,21,Prosperity,City +Colony,Colonies,11,0,0,0,0,1,0,0,0,0,0,0,0,10,0,0,0,0,22,Prosperity,Col +Conspirator,Conspirators,4,?,0,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,23,Intrigue,Cons +Contraband,Contrabands,5,0,0,0,1,0,0,0,0,0,0,0,0,0,0,3,1,0,24,Prosperity,Cband +Copper,Coppers,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,25,Common,Cop +Coppersmith,Coppersmiths,4,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,Intrigue,Csmith +"Council Room","Council Rooms",5,0,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,27,Dominion,CR +"Counting House","Counting Houses",5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,Prosperity,CH +Courtyard,Courtyards,2,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,Intrigue,Cyard +Crossroads,Crossroads,2,?,?,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,Hinterlands,Croads +Curse,Curses,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,31,Common,Curse +Cutpurse,Cutpurses,4,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,0,0,32,Seaside,Cut +Develop,Develops,3,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,33,Hinterlands,Dev +Diadem,Diadems,*0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,2,0,0,34,Cornucopia,Dia +Duchess,Duchesses,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,35,Hinterlands,Dss +Duchy,Duchies,5,0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,0,0,36,Common,Duchy +Duke,Dukes,5,0,0,0,0,1,0,0,0,0,0,0,0,?,0,0,0,0,37,Intrigue,Duke +Embargo,Embargoes,2,0,0,1,0,0,0,0,0,0,0,0,0,0,1,2,0,0,38,Seaside,Ebarg +Embassy,Embassies,5,0,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,Hinterlands,Ebass +Envoy,Envoys,4,0,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,Promotional,Env +Estate,Estates,2,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,41,Common,Est +Expand,Expands,7,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,42,Prosperity,Epand +Explorer,Explorers,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,43,Seaside,Expl +Fairgrounds,Fairgrounds,6,0,0,0,0,1,0,0,0,0,0,0,0,?,0,0,0,0,44,Cornucopia,Fair +Familiar,Familiars,P3,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,45,Alchemy,Fam +"Farming Village","Farming Villages",4,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,Cornucopia,FarmV +Farmland,Farmlands,6,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,47,Hinterlands,Fland +Feast,Feasts,4,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,48,Dominion,Feast +Festival,Festivals,5,2,0,1,0,0,0,0,0,0,0,0,0,0,0,2,1,0,49,Dominion,Fest +"Fishing Village","Fishing Villages",3,2,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,50,Seaside,FishV +Followers,Followers,*0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,Cornucopia,Foll +"Fool's Gold","Fool's Golds",2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,?,0,0,52,Hinterlands,Fool +Forge,Forges,7,0,0,1,0,0,0,0,0,0,0,0,0,0,99,0,0,0,53,Prosperity,Forge +"Fortune Teller","Fortune Tellers",3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,54,Cornucopia,FT +Gardens,Gardens,4,0,0,0,0,1,0,0,0,0,0,0,0,?,0,0,0,0,55,Dominion,Gard +"Ghost Ship","Ghost Ships",5,0,2,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,56,Seaside,GS +Gold,Golds,6,0,0,0,1,0,0,0,0,0,0,0,0,0,0,3,0,0,57,Common,Gold +Golem,Golems,P4,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,58,Alchemy,Golem +Goons,Goons,6,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,1,0,59,Prosperity,Goon +Governor,Governors,5,1,?,1,0,0,0,0,0,0,0,0,0,0,?,0,0,0,60,Promotional,Gov +"Grand Market","Grand Markets",6,1,1,1,0,0,0,0,0,0,0,0,0,0,0,2,1,0,61,Prosperity,Gmark +"Great Hall","Great Halls",3,1,1,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,62,Intrigue,GH +Haggler,Hagglers,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,63,Hinterlands,Hag +Hamlet,Hamlets,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,64,Cornucopia,Ham +Harem,Harems,6,0,0,0,1,1,0,0,0,0,0,0,0,2,0,2,0,0,65,Intrigue,Harem +Harvest,Harvests,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,?,0,0,66,Cornucopia,Hvest +Haven,Havens,2,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,67,Seaside,Hav +Herbalist,Herbalists,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,68,Alchemy,Herb +Highway,Highways,5,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,Hinterlands,Hway +Hoard,Hoards,6,0,0,0,1,0,0,0,0,0,0,0,0,0,0,2,0,0,70,Prosperity,Hoard +"Horn of Plenty","Horns of Plenty",5,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,71,Cornucopia,HoP +"Horse Traders","Horse Traders",4,0,-2,1,0,0,0,1,0,0,0,0,0,0,0,3,1,0,72,Cornucopia,HT +"Hunting Party","Hunting Parties",5,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,Cornucopia,Hunt +"Ill-Gotten Gains","Ill-Gotten Gains",5,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,74,Hinterlands,IGG +Inn,Inns,5,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75,Hinterlands,Inn +Ironworks,Ironworks,4,0,0,1,0,0,0,0,0,0,0,0,0,0,0,?,0,0,76,Intrigue,IW +Island,Islands,4,0,0,1,0,1,0,0,0,0,0,0,0,2,0,0,0,0,77,Seaside,Isl +"Jack of All Trades","Jacks of All Trades",4,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,Hinterlands,JoaT +Jester,Jesters,5,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,0,0,79,Cornucopia,Jest +"King's Court","King's Courts",7,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,Prosperity,KC +Laboratory,Laboratories,5,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,81,Dominion,Lab +Library,Libraries,5,0,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,Dominion,Lib +Lighthouse,Lighthouses,2,1,0,1,0,0,0,1,1,0,0,0,0,0,0,1,0,0,83,Seaside,Light +Loan,Loans,3,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0,84,Prosperity,Loan +Lookout,Lookouts,3,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,85,Seaside,Look +Mandarin,Mandarins,5,0,0,1,3,0,0,0,0,0,0,0,0,0,0,3,0,0,86,Hinterlands,Mand +Margrave,Margraves,5,0,3,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,87,Hinterlands,Marg +Market,Markets,5,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,88,Dominion,Mark +Masquerade,Masquerades,3,0,2,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,89,Intrigue,Masq +Menagerie,Menageries,3,1,3,1,0,0,0,0,0,0,0,0,0,0,0,0,,0,90,Cornucopia,Men +"Merchant Ship","Merchant Ships",5,0,0,1,0,0,0,0,1,0,0,0,0,0,0,2,0,0,91,Seaside,MS +Militia,Militias,4,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,0,0,92,Dominion,Mil +Mine,Mines,5,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,93,Dominion,Mine +"Mining Village","Mining Villages",4,2,1,1,0,0,0,0,0,0,0,0,0,0,1,?,0,0,94,Intrigue,MinV +Minion,Minions,5,1,0,1,0,0,1,0,0,0,0,0,0,0,0,?,0,0,95,Intrigue,Mion +Mint,Mints,5,0,0,1,0,0,0,0,0,0,0,0,0,0,?,0,0,0,96,Prosperity,Mint +Moat,Moats,2,0,2,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,97,Dominion,Moa +Moneylender,Moneylenders,4,0,0,1,0,0,0,0,0,0,0,0,0,0,1,?,0,0,98,Dominion,Mlend +Monument,Monuments,4,0,0,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,99,Prosperity,Mment +Mountebank,Mountebanks,5,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,0,0,100,Prosperity,Mbank +"Native Village","Native Villages",2,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,Seaside,NatV +Navigator,Navigators,4,0,0,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,102,Seaside,Nav +"Noble Brigand","Noble Brigands",4,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,103,Hinterlands,NBri +Nobles,Nobles,6,?,?,1,0,1,0,0,0,0,0,0,0,2,0,0,0,0,104,Intrigue,Nbles +"Nomad Camp","Nomad Camps",4,0,0,1,0,0,0,0,0,0,0,0,0,0,0,2,1,0,105,Hinterlands,NCamp +Oasis,Oases,3,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,106,Hinterlands,Oasis +Oracle,Oracles,3,0,2,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,107,Hinterlands,Ora +Outpost,Outposts,5,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,108,Seaside,Out +Pawn,Pawns,2,?,?,1,0,0,0,0,0,0,0,0,0,0,0,?,?,0,109,Intrigue,Pawn +"Pearl Diver","Pearl Divers",2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,Seaside,PDiv +Peddler,Peddlers,8,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,111,Prosperity,Ped +"Philosopher's Stone","Philosopher's Stones",P3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,?,0,0,112,Alchemy,PStone +"Pirate Ship","Pirate Ships",4,0,0,1,0,0,1,0,0,0,0,0,0,0,0,?,0,0,113,Seaside,PShip +Platinum,Platinums,9,0,0,0,1,0,0,0,0,0,0,0,0,0,0,5,0,0,114,Prosperity,Plat +Possession,Possessions,P6,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,115,Alchemy,Pos +Potion,Potions,4,0,0,0,1,0,0,0,0,0,0,0,0,0,0,P,0,0,116,Alchemy,Pot +Princess,Princesses,*0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,117,Cornucopia,Prin +Province,Provinces,8,0,0,0,0,1,0,0,0,0,0,0,0,6,0,0,0,0,118,Common,Prov +Quarry,Quarries,4,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,119,Prosperity,Qua +Rabble,Rabbles,5,0,3,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,120,Prosperity,Rab +Remake,Remakes,4,0,0,1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,121,Cornucopia,Rke +Remodel,Remodels,4,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,122,Dominion,Rdel +"Royal Seal","Royal Seals",5,0,0,0,1,0,0,0,0,0,0,0,0,0,0,2,0,0,123,Prosperity,RS +Saboteur,Saboteurs,5,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,124,Intrigue,Sab +Salvager,Salvagers,4,0,0,1,0,0,0,0,0,0,0,0,0,0,1,?,1,0,125,Seaside,Salv +Scheme,Schemes,3,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,Hinterlands,Sch +Scout,Scouts,4,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,Intrigue,Sco +"Scrying Pool","Scrying Pools",P2,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,128,Alchemy,SP +"Sea Hag","Sea Hags",4,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,129,Seaside,SHag +"Secret Chamber","Secret Chambers",2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,?,0,0,130,Intrigue,SC +"Shanty Town","Shanty Towns",3,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,131,Intrigue,ST +"Silk Road","Silk Roads",4,0,0,0,0,1,0,0,0,0,0,0,0,?,0,0,0,0,132,Hinterlands,SR +Silver,Silvers,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,2,0,0,133,Common,Silv +Smithy,Smithies,4,0,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,Dominion,Sthy +Smugglers,Smugglers,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,Seaside,Smug +"Spice Merchant","Spice Merchants",4,?,?,1,0,0,0,0,0,0,0,0,0,0,0,?,?,0,136,Hinterlands,SMrch +Spy,Spies,4,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,137,Dominion,Spy +Stables,Stables,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,Hinterlands,Stab +Stash,Stashes,5,0,0,0,1,0,0,0,0,0,0,0,0,0,0,2,0,0,139,Promotional,Sash +Steward,Stewards,3,0,2,1,0,0,0,0,0,0,0,0,0,0,2,?,0,0,140,Intrigue,Ste +Swindler,Swindlers,3,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,0,0,141,Intrigue,Swi +Tactician,Tacticians,5,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,142,Seaside,Tac +Talisman,Talismans,4,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,143,Prosperity,Tman +Thief,Thieves,4,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,144,Dominion,Thi +"Throne Room","Throne Rooms",4,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,Dominion,TRoom +Torturer,Torturers,5,0,3,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,146,Intrigue,Tort +Tournament,Tournaments,4,1,?,1,0,0,0,0,0,0,0,0,0,0,0,?,0,0,147,Cornucopia,Tou +"Trade Route","Trade Routes",3,0,0,1,0,0,0,0,0,0,0,0,0,0,1,?,1,0,148,Prosperity,TRoute +Trader,Traders,4,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,149,Hinterlands,Tder +"Trading Post","Trading Posts",5,0,0,1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,150,Intrigue,TPst +Transmute,Transmutes,P,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,151,Alchemy,Tmut +"Treasure Map","Treasure Maps",4,0,0,1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,152,Seaside,TMap +Treasury,Treasuries,5,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,153,Seaside,Tsury +Tribute,Tributes,5,?,?,1,0,0,0,0,0,0,0,0,0,0,0,?,0,0,154,Intrigue,Trib +"Trusty Steed","Trusty Steeds",*0,?,?,1,0,0,0,0,0,0,0,0,0,0,0,?,0,0,155,Cornucopia,TS +Tunnel,Tunnels,3,0,0,0,0,1,0,1,0,0,0,0,0,2,0,0,0,0,156,Hinterlands,Tun +University,Universities,P2,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,157,Alchemy,Un +Upgrade,Upgrades,5,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,158,Intrigue,Up +Vault,Vaults,5,0,2,1,0,0,0,0,0,0,0,0,0,0,0,?,0,0,159,Prosperity,Va +Venture,Ventures,5,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,160,Prosperity,Ven +Village,Villages,3,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,Dominion,Vil +Vineyard,Vineyards,P,0,0,0,0,1,0,0,0,0,0,0,0,?,0,0,0,0,162,Alchemy,Vin +"Walled Village","Walled Villages",4,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,163,Promotional,Wvil +Warehouse,Warehouses,3,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,Seaside,Whouse +Watchtower,Watchtowers,3,0,2,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,165,Prosperity,Wat +Wharf,Wharves,5,0,2,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,166,Seaside,Wrf +"Wishing Well","Wishing Wells",3,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,Intrigue,WW +Witch,Witches,5,0,2,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,168,Dominion,Wit +Woodcutter,Woodcutters,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,2,1,0,169,Dominion,Wood +"Worker's Village","Worker's Villages",4,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,170,Prosperity,Wvil +Workshop,Workshops,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,Dominion,Wshop +"Young Witch","Young Witches",4,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,Cornucopia,Yng +"Abandoned Mine","Abandoned Mines",0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,173,"Dark Ages",AM +Altar,Altars,6,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,174,"Dark Ages",Alt +Armory,Armories,4,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,"Dark Ages",Arm +"Band of Misfits","Bands of Misfits",5,?,?,1,0,0,0,0,0,0,0,0,0,0,?,?,?,0,176,"Dark Ages",BoM +"Bandit Camp","Bandit Camps",5,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,"Dark Ages",BC +Beggar,Beggars,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,178,"Dark Ages",Beg +Catacombs,Catacombs,5,0,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,179,"Dark Ages",Cat +Count,Counts,5,0,0,1,0,0,0,0,0,0,0,0,0,0,?,?,0,0,180,"Dark Ages",Count +Counterfeit,Counterfeits,5,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,181,"Dark Ages",Cf +Cultist,Cultists,5,0,2,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,182,"Dark Ages",Cul +"Dame Anna","Dames Anna",5,0,0,1,0,0,1,0,0,0,0,0,1,0,2,0,0,0,183,"Dark Ages",DAn +"Dame Josephine","Dames Josephine",5,0,0,1,0,1,1,0,0,0,0,0,1,2,0,0,0,0,184,"Dark Ages",DJo +"Dame Molly","Dames Molly",5,2,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,185,"Dark Ages",DMo +"Dame Natalie","Dames Natalie",5,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,186,"Dark Ages",DNat +"Dame Sylvia","Dames Sylvia",5,0,0,1,0,0,1,0,0,0,0,0,1,0,0,2,0,0,187,"Dark Ages",DSyl +"Death Cart","Death Carts",4,0,0,1,0,0,0,0,0,0,1,0,0,0,1,5,0,0,188,"Dark Ages",DC +Feodum,Feoda,4,0,0,0,0,1,0,0,0,0,0,0,0,?,0,0,0,0,189,"Dark Ages",Feo +Forager,Foragers,3,1,0,1,0,0,0,0,0,0,0,0,0,0,1,?,1,0,190,"Dark Ages",Fger +Fortress,Fortresses,4,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,191,"Dark Ages",Ftrs +Graverobber,Graverobbers,5,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,192,"Dark Ages",GR +Hermit,Hermits,3,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,193,"Dark Ages",Hrm +Hovel,Hovels,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,194,"Dark Ages",Hv +"Hunting Grounds","Hunting Grounds",6,0,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,195,"Dark Ages",HG +Ironmonger,Ironmongers,4,1,1,1,0,0,0,0,0,0,0,0,0,0,0,?,0,0,196,"Dark Ages",IM +"Junk Dealer","Junk Dealers",5,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,197,"Dark Ages",JD +Knights,Knights,5,0,0,1,0,0,1,0,0,0,0,0,1,0,0,?,0,0,198,"Dark Ages",Kn +Madman,Madmen,*0,2,?,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199,"Dark Ages",MM +Marauder,Marauders,4,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,200,"Dark Ages",Mard +"Market Square","Market Squares",3,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,201,"Dark Ages",MS +Mercenary,Mercenaries,*0,0,2,1,0,0,1,0,0,0,0,0,0,0,2,?,0,0,202,"Dark Ages",Merc +Mystic,Mystics,5,1,0,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,203,"Dark Ages",Mys +Necropolis,Necropolises,1,2,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,204,"Dark Ages",Nec +"Overgrown Estate","Overgrown Estates",1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,205,"Dark Ages",OE +Pillage,Pillages,5,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,206,"Dark Ages",Pil +"Poor House","Poor Houses",1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,?,0,0,207,"Dark Ages",PH +Procession,Processions,4,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,208,"Dark Ages",Proc +Rats,Rats,4,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,209,"Dark Ages",Rats +Rebuild,Rebuilds,5,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,210,"Dark Ages",Reb +Rogue,Rogues,5,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,0,0,211,"Dark Ages",Rogue +"Ruined Library","Ruined Libraries",0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,212,"Dark Ages",RLib +"Ruined Market","Ruined Markets",0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,213,"Dark Ages",RMar +"Ruined Village","Ruined Villages",0,1,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,214,"Dark Ages",RVil +Ruins,Ruins,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,?,0,0,215,"Dark Ages",Ruins +Sage,Sages,3,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,216,"Dark Ages",Sage +Scavenger,Scavengers,4,0,0,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,217,"Dark Ages",Scav +"Sir Bailey","Sirs Bailey",5,1,1,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,218,"Dark Ages",SBai +"Sir Destry","Sirs Destry",5,0,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,219,"Dark Ages",SDes +"Sir Martin","Sirs Martin",4,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,2,0,220,"Dark Ages",SMar +"Sir Michael","Sirs Michael",5,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,221,"Dark Ages",SMi +"Sir Vander","Sirs Vander",5,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,222,"Dark Ages",SVan +Spoils,Spoils,*0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,3,0,0,223,"Dark Ages",Spoils +Squire,Squires,2,?,0,1,0,0,0,0,0,0,0,0,0,0,0,1,2,0,224,"Dark Ages",Sq +Storeroom,Storerooms,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,?,1,0,225,"Dark Ages",SR +Survivors,Survivors,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,226,"Dark Ages",Surv +Urchin,Urchins,3,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,227,"Dark Ages",Urc +Vagrant,Vagrants,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,"Dark Ages",Vag +"Wandering Minstrel","Wandering Minstrels",4,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,229,"Dark Ages",WM +Advisor,Advisors,4,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,Guilds,Advi +Baker,Bakers,5,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,Guilds,Bak +Butcher,Butchers,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,Guilds,Butc +"Candlestick Maker","Candlestick Makers",2,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,233,Guilds,Cand +Doctor,Doctors,3,0,0,1,0,0,0,0,0,0,0,0,0,0,3,0,0,0,234,Guilds,Doc +Herald,Heralds,4,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,235,Guilds,Hera +Journeyman,Journeymen,5,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,236,Guilds,Jour +Masterpiece,Masterpieces,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,237,Guilds,Mast +"Merchant Guild","Merchant Guilds",5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,238,Guilds,MGui +Plaza,Plazas,4,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,239,Guilds,Plaz +Soothsayer,Soothsayers,5,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,240,Guilds,Sooth +Stonemason,Stonemasons,2,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,241,Guilds,Ston +Taxman,Taxmen,4,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,242,Guilds,Taxm diff --git a/count_buys.py b/count_buys.py index cad506c..b72a0cf 100644 --- a/count_buys.py +++ b/count_buys.py @@ -39,6 +39,8 @@ def __init__(self): self.gains = MVS() self.trashes = MVS() self.returns = MVS() + self.passes = MVS() + self.receives = MVS() self.any_gained = MVS() self.available = MVS() diff --git a/dominioncards.py b/dominioncards.py index df9e342..d424799 100644 --- a/dominioncards.py +++ b/dominioncards.py @@ -33,9 +33,11 @@ def __init__(self, cardlist_row): # instead of in the getter during each call. self.vp = int_or_default(self.vp, 0) self.coins = int_or_default(self.coins, 0) + self.cointokens = int_or_default(self.cointokens, 0) self.trash = int_or_default(self.trash, 1) - self.actions = int_or_default(self.actions, 1) + self.actions = int_or_default(self.actions, 0) self.index = int(self.index) + self.coin_cost = int_or_default(self.cost.replace('P',''),0) def pluralize(self, freq): return self.singular if freq == 1 else self.plural @@ -58,12 +60,24 @@ def is_action(self): def is_attack(self): return self.attack == '1' + def is_shelter(self): + return self.shelter == '1' + + def is_knight(self): + return self.knight == '1' + + def is_ruins(self): + return self.ruins == '1' + def vp_per_card(self): return self.vp def money_value(self): return self.coins + def coin_tokens(self): + return self.cointokens + def trashes(self): return self.trash @@ -73,6 +87,9 @@ def num_plus_actions(self): def get_expansion(self): return self.expansion + def can_trash_self(self): + return self in [Feast, Pillage, MiningVillage, Embargo, TreasureMap, DeathCart] + def __repr__(self): return "%s(%s)" % (self.__class__.__name__, self.singular) @@ -108,6 +125,8 @@ def num_copies_per_game(self, num_players): def get_card(name): """Look up a card by its name.""" try: + if name == "JackOfAllTrades": + name = "Jack of All Trades" return _CARDS[name] except KeyError: raise CardNameError(name) @@ -186,7 +205,8 @@ def opening_cards(): This includes only cards costing between 0 and 5 coin.""" return sorted([card for card in all_cards() - if card.cost in ('0', '2', '3', '4', '5')]) + if (card.cost in ('0','1', '2', '3', '4', '5') and + not card.is_shelter())]) import collections diff --git a/frontend.py b/frontend.py index c1de246..e42e465 100644 --- a/frontend.py +++ b/frontend.py @@ -20,6 +20,7 @@ import game import goals import parse_game +import parse_common import query_matcher import utils from keys import * @@ -259,7 +260,6 @@ def GET(self): expansion_dist[ex] += wt expansion_win_points[ex] += wt * wp - #TODO: a good choice for a template like jinja2 ret = standard_heading("CouncilRoom.com: Dominion Stats: %s" % target_player) @@ -333,7 +333,13 @@ def GET(self): ret += '

Most recent games

\n' qm = query_matcher.QueryMatcher(p1_name=target_player) - for g_id in game_list[:3]: + goko_games = [g for g in game_list if '.txt' in game_list] + if len(goko_games) > 2: + goko_games.sort(reverse=True) + most_recent = goko_games[:3] + else: + most_recent = game_list[:3] + for g_id in most_recent: g = db.games.find_one({'_id': g_id}) game_val = game.Game(g) ret += (query_matcher.GameMatcher(game_val, qm).display_game_snippet() + @@ -442,7 +448,7 @@ def GET(self): 'Council Room Developers') try: return annotate_game.annotate_game(contents, game_id, debug) - except parse_game.BogusGameError, b: + except parse_common.BogusGameError, b: return contents.replace('', body_err_msg + ': foo? ' + str(b)) except Exception, e: @@ -520,6 +526,7 @@ def GET(self): n = db.games.count() ret = standard_heading("CouncilRoom.com: Goal Stats") + ret += '

Goko bots don\'t get to be listed here! If one has snuck in, please report it by sending an email to councilroom-dev@googlegroups.com.

' ret += 'Goal Stats\n

\n' ret += '' ret += '\s*\n' + r'\s*\s*\n' + r'\s*') database = utils.get_mongo_database() history_collection = database.leaderboard_history @@ -66,7 +67,7 @@ def main(): pos = 0 while True: - match = leaderboard_pattern.search(content, pos) + match = iso_leaderboard_pattern.search(content, pos) if not match: break @@ -87,6 +88,28 @@ def main(): last_rank = rank pos = match.end() + pos = 0 + while True: + match = goko_leaderboard_pattern.search(content, pos) + if not match: + break + + num_matches += 1 + skill_mean = float(match.group('skill_mean')) + skill_error = 0 + rank = int(match.group('rank')) + eligible_games_played = 0 + nickname = match.group('nickname') + + normed_nickname = nickname + + if normed_nickname not in nickname_to_entry: + nickname_to_entry[normed_nickname] = [date, skill_mean, skill_error, rank, eligible_games_played] + else: + log.info('normed nickname %s already exists for %s', normed_nickname, date) + + last_rank = rank + pos = match.end() log.info('%d entries matched', num_matches) if num_matches == 0: diff --git a/load_parsed_data.py b/load_parsed_data.py index 83a4edd..ab41a09 100644 --- a/load_parsed_data.py +++ b/load_parsed_data.py @@ -13,7 +13,8 @@ from keys import * parser = utils.incremental_date_range_cmd_line_parser() -find_id = re.compile('game-.*.html') +find_iso_id = re.compile('game-.*.html') +find_goko_id = re.compile('log.*.txt') def process_file(filename, incremental, games_table, log): yyyymmdd = filename[:8] @@ -24,18 +25,26 @@ def process_file(filename, incremental, games_table, log): log.warning("empty contents in %s (make parser not dump empty files?)", filename) return - assert find_id.search(contents), ( + assert (find_iso_id.search(contents) or find_goko_id.search(contents)), ( 'could not get id from %s in file %s' % (contents[:100], filename)) - found_all = True - for match in find_id.finditer(contents): + found_all_iso = True + found_all_goko = True + for match in find_iso_id.finditer(contents): g_id = match.group(0) query = {'_id': g_id} if games_table.find(query).count(): continue else: - found_all = False - if found_all: + found_all_iso = False + for match in find_goko_id.finditer(contents): + g_id = match.group(0) + query = {'_id': g_id} + if games_table.find(query).count(): + continue + else: + found_all_goko = False + if found_all_iso and found_all_goko: log.info("Found all games in DB, deleting file %s", filename) os.system('rm parsed_out/%s'%filename) return diff --git a/multi_scrape.sh b/multi_scrape.sh new file mode 100755 index 0000000..6fbb26c --- /dev/null +++ b/multi_scrape.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +if [ $# -ne 1 ] +then + echo Usage: multi_scrape.sh [goko logdir] + echo Example: multi_scrape.sh 20130513 + exit -1 +fi + +BASE_ARCHIVE=http://archive-dominionlogs.goko.com/$1/ +BASE_RECENT=http://dominionlogs.goko.com/$1/ + +wget --spider $BASE_RECENT && BASE=$BASE_RECENT +wget --spider $BASE_ARCHIVE && BASE=$BASE_ARCHIVE +THREADS=20 + +wget --header='Accept-Encoding: gzip' $BASE -O- | zcat | perl -lne 'print "$1" if /href="(.*?txt)"/' > _all + +if [ `cat _all | wc -l` -gt 0 ] +then + cat _all | split -l 100 - _index. + ls _index.* | xargs -n 1 -P $THREADS wget --base=$BASE --header='Accept-Encoding: gzip' --quiet -i + rm _index.* + echo "Done downloading" +fi + +ls > _old +ls _* >> _old +cat _all _old | sort | uniq -u > _new + +if [ `cat _new | wc -l` -gt 0 ] +then + cat _new | split -l 100 - _index. + ls _index.* | xargs -n 1 -P $THREADS wget --base=$BASE --header='Accept-Encoding: gzip' --quiet -i + rm _index.* + echo "Done doublechecking" +fi + +for x in `cat _all` +do + mv $x $x.gz + gunzip $x.gz +done + +tar cjf $1.all.tar.bz2 -T _all + + +for x in `cat _all` +do + rm $x +done + +rm _all +rm _old +rm _new + diff --git a/optimal_card_ratios.py b/optimal_card_ratios.py index e7721e8..1b612b2 100644 --- a/optimal_card_ratios.py +++ b/optimal_card_ratios.py @@ -150,6 +150,10 @@ def process_game(game): tracker = name_to_progressive_tracker[deck_change.name] for card in deck_change.buys: tracker.adjust_card_count(card, 1) + for card in getattr(deck_change, 'receives',[]): + tracker.adjust_card_count(card, 1) + for card in getattr(deck_change, 'passes',[]): + tracker.adjust_card_count(card, -1) for card in deck_change.gains: tracker.adjust_card_count(card, 1) for card in deck_change.returns: diff --git a/parse_common.py b/parse_common.py new file mode 100644 index 0000000..3cbb05a --- /dev/null +++ b/parse_common.py @@ -0,0 +1,130 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +"""Parse raw game into JSON list of game documents. +Low-level functionality that isn't implementation-specific. +Called from parse_goko_game and parse_iso_game.""" + +import bz2 +import codecs +import collections +import datetime +import itertools +import logging +import logging.handlers +import multiprocessing +import os +import os.path +import pprint +import pymongo +import re +import sys + +from dominioncards import get_card, CardEncoder, indexes, index_to_card +from game import Game +from keys import * +from utils import segments +import dominioncards +import game +import name_merger +import simplejson as json +import utils + +class BogusGameError(Exception): + """ Exception for a degenerate game that should not be + parsed. These are common, and by design, so they should not be + logged except in debug mode. + """ + def __init__(self, reason): + Exception.__init__(self) + self.reason = reason + + def __str__(self): + return repr(self) + + def __repr__(self): + return 'BogusGameError %s' % self.reason + + +class ParsingError(Exception): + """ Exception for a game that cannot be parsed. + """ + def __init__(self, reason): + Exception.__init__(self) + self.reason = reason + + def __str__(self): + return repr(self) + + def __repr__(self): + return 'ParsingError %s' % self.reason + +class ParseTurnHeaderError(Exception): + """ Exception for a game where a turn header cannot be parsed. + """ + def __init__(self, line): + self.line = line + + def __str__(self): + return repr(self) + + def __repr__(self): + return 'ParseTurnHeaderError %s' % self.line + +PLAYER_IND_RE = re.compile('player(?P\d+)') + +def _player_label(ind): + return 'player' + str(ind) + +def delete_keys_with_empty_vals(dict_obj): + """ Remove keys from object associated with values that are False/empty.""" + keys_to_die = [] + for k in dict_obj.keys(): + if isinstance(dict_obj[k], dict): + delete_keys_with_empty_vals(dict_obj[k]) + if not dict_obj[k]: + keys_to_die.append(k) + for k in keys_to_die: + del dict_obj[k] + +def count_money(plays, typeGoko = False): + """ Return the value of the money from playing cards in plays. + + For iso, This does not include money from cards like Steward or Bank, but + does count Copper. + + Counts as much as it can from Goko. Does not count cards that depend on the + game state or on choices (Forager, Harvest, etc.) Does count everything + with a fixed value or a value that depends only on the sequence of plays + (Bank, FG, etc.). + + plays: list of cards. + """ + coppersmith_ct = 0 + money = 0 + treasures = 0 + fg_active = False + for card in plays: + if card.is_treasure(): + treasures += 1 + + if card == dominioncards.Coppersmith: + coppersmith_ct += 1 + elif card == dominioncards.FoolsGold: + if fg_active: + money += 4 + else: + money += 1 + fg_active = True + elif card == dominioncards.Copper: + money += 1 + coppersmith_ct + elif card == dominioncards.Bank and typeGoko: + money += treasures + elif card.is_treasure() or typeGoko: + money += card.money_value() + return money + +def _get_real_name(canon_name, names_list): + return names_list[int(PLAYER_IND_RE.match(canon_name).group('num'))] + + diff --git a/parse_game.py b/parse_game.py index 664b7ce..a687708 100644 --- a/parse_game.py +++ b/parse_game.py @@ -1,7 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- -"""Parse raw game data from isotropic into JSON list of game documents.""" +"""Parse raw game into JSON list of game documents. +High-level functionality that isn't implementation-specific. +Calls parse_goko_game and parse_iso_game.""" import bz2 import codecs @@ -27,150 +29,19 @@ import name_merger import simplejson as json import utils +import parse_iso_game +import parse_goko_game +import parse_common -SECTION_SEP = re.compile('^----------------------$', re.MULTILINE) - -NORM_TURN_HEADER_RE = re.compile( - "--- (?P.+)'s turn (?P\d+) ---") -POSS_TURN_HEADER_RE = re.compile( - "--- (?P.+)'s turn \(possessed by (?P.*)\) ---") -OUTPOST_TURN_HEADER_RE = re.compile( - "--- (?P.+)'s " + re.escape( - "extra turn (from Outpost)")) - -TURN_HEADER_NO_GROUP_RE = re.compile("--- .+'s turn [^-]* ---") -SPLIT_COMMA_AND_RE = re.compile(',| and ') -NUMBER_BEFORE_SPAN = re.compile('(\d+) \d+) â–¼', re.UNICODE) - -KW_ANOTHER_ONE = 'another one' -KW_BUYS = ' buys ' -KW_DISCARDS = ' discards ' -KW_GAINING = ' gaining ' -KW_DRAWS = ' draws ' -KW_GAINS_A = ' gains a' -KW_GAMES_A = ' games a' # short lived bug in iso, spelled gains as games -KW_FOR_MONEY = ' for +$' -KW_GAINS_THE = ' gains the ' -KW_GET = 'get +' -KW_GETS = ' gets +' -KW_GETTING = ' getting +' -KW_IS_TRASHED = ' is trashed.' -KW_PLAYING = ' playing ' -KW_PLAYS = ' plays ' -KW_REPLACING = ' replacing ' -KW_RETURNING = ' returning ' -KW_REVEALING = ' revealing ' -KW_REVEALS = ' reveals ' -KW_REVEALS_A = ' reveals a' -KW_TOKEN = ' token.' -KW_TO_THE_SUPPLY = ' to the supply' -KW_TRASHES = ' trashes ' -KW_TRASHES_IT = 'trashes it.' -KW_TRASHING = ' trashing ' -KW_TURNS_UP_A = ' turns up a' -KW_WHICH_IS_WORTH = ' which is worth +$' -KW_WITH_A = ' with a' -KW_WISHING = ' wishing ' -KW_INSTEAD = ' instead.' KEYWORDS = [locals()[w] for w in dict(locals()) if w.startswith('KW_')] -class BogusGameError(Exception): - """ Exception for a degenerate game that should not be - parsed. These are common, and by design, so they should not be - logged except in debug mode. - """ - def __init__(self, reason): - Exception.__init__(self) - self.reason = reason - - def __str__(self): - return repr(self) - - def __repr__(self): - return 'BogusGameError %s' % self.reason - - -class ParsingError(Exception): - """ Exception for a game that cannot be parsed. - """ - def __init__(self, reason): - Exception.__init__(self) - self.reason = reason - - def __str__(self): - return repr(self) - - def __repr__(self): - return 'ParsingError %s' % self.reason - - -class ParseTurnHeaderError(Exception): - """ Exception for a game where a turn header cannot be parsed. - """ - def __init__(self, line): - self.line = line - - def __str__(self): - return repr(self) - - def __repr__(self): - return 'ParseTurnHeaderError %s' % self.line - - -def capture_cards(line): - """ Given a line of text from isotropic, extract the cards. - - line: string like 'Rob plays a Minion.' - returns: list of the card objects, eg, [Minion] - """ - def _as_int_or_1(string_val): - try: - return int(string_val) - except ValueError: - return 1 - - cards = [] - card_sections = SPLIT_COMMA_AND_RE.split(line) - for sect in card_sections: - split_at_span = sect.split('', 0, start_of_end_span) - if end_of_begin_span == -1: - continue - maybe_plural = subsect[end_of_begin_span + 1: - start_of_end_span] - if maybe_plural == '♦': - continue - try: - card = get_card(maybe_plural) - except KeyError, exception: - raise ParsingError('Failed to find card in line: %s' % line) - cards.extend([card] * mult) - return cards - def assign_win_points(game_dict): """ Set win_points to number of win points for each player in game_dict.""" def win_tuple(deck_dict): """ Return tuple ordered by increasing final standing. """ # negate turns so that max() behaves; points good, turns bad. - num_normal_turns = sum(not (POSSESSION in t or OUTPOST in t) + num_normal_turns = sum(not ( (POSSESSION in t and t[POSSESSION]) or \ + (OUTPOST in t and t[OUTPOST])) for t in deck_dict[TURNS]) return (deck_dict[POINTS], -num_normal_turns) @@ -182,611 +53,42 @@ def win_tuple(deck_dict): for player in decks: player[WIN_POINTS] = win_points if player in winners else 0.0 -def _player_label(ind): - return 'player' + str(ind) - -def associate_game_with_norm_names(game_dict): - """ Fill players field in game_dict with list of normed player names.""" - game_dict[PLAYERS] = [] - for player_deck in game_dict[DECKS]: - normed_name = name_merger.norm_name(player_deck[NAME]) - game_dict[PLAYERS].append(normed_name) - -def associate_turns_with_owner(game_dict, turns): - """ Move each turn in turns to be a member of the corresponding player - in game_dict. - - Remove the names from the turn, since it is redundant with the name - on the player level dict.""" - name_to_owner = {} - for idx, deck in enumerate(game_dict[DECKS]): - deck[NAME] = name_merger.norm_name(deck[NAME]) - name_to_owner[deck[NAME]] = deck - deck[TURNS] = [] - - order_ct = 0 - - for idx, turn in enumerate(turns): - owner = name_to_owner[name_merger.norm_name(turn[NAME])] - owner[TURNS].append(turn) - if not ORDER in owner: - owner[ORDER] = idx + 1 - order_ct += 1 - del turn[NAME] - - if order_ct != len(game_dict[DECKS]): - raise BogusGameError('Did not find turns for all players') - -ONLY_NUMBERS_RE = re.compile('^\d+$') - -def validate_names(decks): - """ Raise an exception for names that might screw up the parsing. - This should happen in less than 1% of real games, but it's just easier - to punt on annoying inputs that to make sure we get them right.""" - used_names = set() - for deck in decks: - name = deck[NAME] - if name in used_names: - raise BogusGameError('Duplicate name %s' % name) - used_names.add(name) - - if name in ['a', 'and', 'turn']: - raise BogusGameError("annoying name " + name) - if '---' in name: - raise BogusGameError('--- in name ' + name) - - if ONLY_NUMBERS_RE.match(name): - raise BogusGameError('name contains only numbers ' + name) - - if name[0] == '.': - raise BogusGameError('name %s starts with period' % name) - for kword in KEYWORDS: - if kword.lstrip() in name or kword.rstrip() in name: - raise BogusGameError('name %s contains keyword %s' % (name, kword)) - - if len(used_names) != len(decks): - raise BogusGameError('not everyone took a turn?') - if len(decks) <= 1: - raise BogusGameError('only one player') - -def canonicalize_names(turns_str, player_names): - """ Return a new string in which all player names are replaced by - player0, player1, ...""" - player_ind_name_pairs = list(enumerate(player_names)) - # Replace longer names first, short names might contain the longer ones. - player_ind_name_pairs.sort(key = lambda ind_name_pair: - -len(ind_name_pair[1])) - for idx, player in player_ind_name_pairs: - # This is complicated (matching extra stuff to the left and right - # of name rather than straight string replace) so that we - # can allow for annoying names like 'd' that occur as - # substrings of regular text. - match_player_name = re.compile( - '(^|[ \(])' + # start with newline, space, or open paren - re.escape(player) + # followed by player name - "([ '\)])", # ending with space or ' or close paren - re.MULTILINE) - def _replace_name_by_label(match): - """ keep surrounding delims, replace player name with playerX""" - return match.group(1) + _player_label(idx) + match.group(2) - turns_str = match_player_name.sub(_replace_name_by_label, turns_str) - - return turns_str + +GOKO_LOG_RE = re.compile("^------------ Game Setup ------------",re.MULTILINE) +ISO_LOG_RE = re.compile("^",re.MULTILINE) def parse_game(game_str, dubious_check = False): """ Parse game_str into game dictionary - game_str: Entire contents of an isotropic log file. + game_str: Entire contents of a log file. dubious_check: If true, raise a BogusGame exception if the game is suspicious. + determines whether the log file is from Goko or iso. Calls specialized + parse functions in parse_iso_game and parse_goko_game + returns a dict with the following fields: decks: A list of player decks, as documend in parse_deck(). supply: A list of cards in the supply. players: A list of normalized player names. game_end: List of cards exhausted that caused the game to end. resigned: True iff some player in the game resigned.. + start_decks: A list of initial player decks. + rating_type: how the game was rated. """ - game_str = game_str.replace('—', '---') - try: - split_sects = SECTION_SEP.split(game_str) - header_str, decks_blob, trash_and_turns = split_sects - except ValueError, exception: - raise ParsingError('Failed to split sections') - game_dict = parse_header(header_str) - decks = parse_decks(decks_blob) - game_dict[DECKS] = decks - validate_names(decks) - - names_list = [d[NAME] for d in game_dict[DECKS]] - turns_str = trash_and_turns.split('Game log')[1] - first_index = turns_str.find('---') - veto_str = turns_str[:first_index] - turns_str = turns_str[first_index:] - turns_str = canonicalize_names(turns_str, names_list) - - turns = parse_turns(turns_str, names_list) - - associate_game_with_norm_names(game_dict) - associate_turns_with_owner(game_dict, turns) - assign_win_points(game_dict) - game_dict[VETO] = parse_vetoes(game_dict, veto_str) + if ISO_LOG_RE.match(game_str): + game_dict = parse_iso_game.parse_game(game_str, dubious_check) + elif GOKO_LOG_RE.match(game_str): + game_dict = parse_goko_game.parse_game(game_str, dubious_check) + + + assign_win_points(game_dict) if dubious_check and Game(game_dict).dubious_quality(): - raise BogusGameError('Dubious Quality') + raise parse_common.BogusGameError('Dubious Quality') return game_dict -def parse_header(header_str): - """ Parse the header string. - - Return a dictionary with game_end, supply, and resigned fields, - like parse_game. - """ - sections = [s for s in header_str.replace(' \n', '\n').split('\n\n') if s] - end_str, supply_str = sections - assert 'gone' in end_str or 'resigned' in end_str, "Not gone or resigned" - if 'gone' in end_str: - resigned = False - gone = capture_cards(end_str.split('\n')[1]) - else: - resigned = True - gone = [] - supply = indexes(capture_cards(supply_str)) - return {GAME_END: indexes(gone), SUPPLY: supply, RESIGNED: resigned} - -PLACEMENT_RE = re.compile('#\d (.*)') -POINTS_RE = re.compile(': (-*\d+) point(s?)(\s|(' + re.escape('') + '))') - -def parse_deck(deck_str): - """ Given an isotropic deck string, return a dictionary containing the - player names - - deck_str: starts with placement and name, ends with last card in deck. - returns dictionary containing the following fields - name: - vp_tokens: number of vp tokens. - deck: Dictionary keyed card name who value is the card frequency. - resigned: True iff this player resigned - """ - try: - name_vp_list, _opening, deck_contents = deck_str.split('\n') - except ValueError, e: - raise ParsingError('Failed right off the bat to split the deck') - vp_tokens = 0 - #print 'vp', name_vp_list - - matched_points = POINTS_RE.search(name_vp_list) - - if matched_points: - point_loc = matched_points.end() - resigned, points = False, int(matched_points.group(1)) - name_points, vp_list = (name_vp_list[:point_loc], - name_vp_list[point_loc + 1:]) - else: - resign_loc = name_vp_list.find('resigned') - assert resign_loc != -1, 'could not find resign in %s' % name_vp_list - resigned, points = True, -100 - name_points, vp_list = (name_vp_list[:resign_loc], - name_vp_list[resign_loc + 1:]) - - last_colon_in_name_points = name_points.rfind(':') - name, _points_or_resign = (name_points[:last_colon_in_name_points], - name_points[last_colon_in_name_points + 1:]) - - def cleanup_name(name): - """ Given a name and placement, get rid of the bold tags and """ - htmlless_name = name.replace('', '').replace('', '') - placement_match = PLACEMENT_RE.match(htmlless_name) - if placement_match: - return placement_match.group(1) - return htmlless_name - - name = cleanup_name(name) - - for chunk in vp_list.split(','): - diamond_loc = chunk.find(u'â–¼') - if diamond_loc != -1: - start_point_loc = max(chunk.rfind('(', 0, diamond_loc - 1), - chunk.rfind(' ', 0, diamond_loc - 1)) - vp_tokens = int(chunk[start_point_loc + 1:diamond_loc - 1]) - - card_list_chunks = deck_contents[ - deck_contents.find(']') + 1:].replace(',', ' ') - card_blobs = [x for x in card_list_chunks.split('') if - '') - card_name = card_blob[right_bracket_index + 1:] - try: - card = get_card(card_name) - except KeyError, exception: - raise ParsingError("Failed to get card. chunk: '%s', card_name: '%s', card_blob: '%s'" % \ - (chunk, card_name, card_blob[right_bracket_index - 10:])) - card_quant = int(card_blob.split()[0]) - deck_comp[str(card.index)] = card_quant - #FIXME: deck_comp is undefined if there's no vp_list - return {NAME: name, POINTS: points, RESIGNED: resigned, - DECK: deck_comp, VP_TOKENS: vp_tokens} - -def parse_decks(decks_blob): - """ Parse and return a list of decks""" - deck_blobs = [s for s in decks_blob.split('\n\n') if s] - return [parse_deck(deck_blob) for deck_blob in deck_blobs] - -VETO_RE = re.compile('(.*) vetoes (.*)\.') -def parse_vetoes(game_dict, veto_str): - matches = VETO_RE.findall(veto_str) - v_dict = {} - if matches: - for (player, card) in matches: - # Use the player index number (as a string) as the - # dictionary key, instead of the player's name, because - # some names contain periods, which are invalid keys for - # structures stored in MongoDB. - player = name_merger.norm_name(player) - try: - v_dict[str(game_dict[PLAYERS].index(player))] = int(capture_cards(card)[0].index) - except ValueError, ve: - raise ParsingError("Failed to handle veto: %s" % ve) - - return v_dict - -def name_and_rest(line, term): - """ Split line about term, return (before, after including term). """ - start_of_term = line.find(term) - assert start_of_term != -1, "start_of_term is -1" - - def _strip_leading(val, dead_chars): - for idx, char in enumerate(val): - if char not in dead_chars: - return val[idx:] - return '' - - name = _strip_leading(line[:start_of_term], ' .').strip() - return name, line[start_of_term + len(term):] - -def delete_keys_with_empty_vals(dict_obj): - """ Remove keys from object associated with values that are False/empty.""" - keys_to_die = [] - for k in dict_obj.keys(): - if isinstance(dict_obj[k], dict): - delete_keys_with_empty_vals(dict_obj[k]) - if not dict_obj[k]: - keys_to_die.append(k) - for k in keys_to_die: - del dict_obj[k] - -def count_money(plays): - """ Return the value of the money from playing cards in plays. - - This does not include money from cards like Steward or Bank, but does - count Copper. - - plays: list of cards. - """ - coppersmith_ct = 0 - money = 0 - for card in plays: - if card == dominioncards.Coppersmith: - coppersmith_ct += 1 - elif card == dominioncards.Copper: - money += 1 + coppersmith_ct - elif card.is_treasure(): - money += card.money_value() - return money - -PLAYER_IND_RE = re.compile('player(?P\d+)') - -class PlayerTracker(object): - ''' The player tracker is used to keep track of the active player being - modified by the gain and trashes actions in a sequence of isotropic - game lines. ''' - - def __init__(self): - self.player_stack = [None] - self.orig_player = None - - def get_active_player(self, line): - ''' Feed the next line to the tracker, it returns the active player.''' - mentioned_players = self._get_player_inds(line) - - indent_level = line.count('...') - if indent_level >= len(self.player_stack): - self.player_stack.append(self.player_stack[-1]) - while len(self.player_stack) > indent_level + 1: - self.player_stack.pop() - - if len(mentioned_players) > 0: - self.player_stack[-1] = mentioned_players[-1] - if self.orig_player is None: - self.orig_player = mentioned_players[-1] - - return self.player_stack[-1] - - def current_player(self): - ''' Return the player whose turn it is. - This requires at least one call to get_active_player() first. ''' - return self.orig_player - - def _get_player_inds(self, line): - '''return list of player indicies in given line. - eg, line "player1 trashes player2's ..." -> [1, 2] - ''' - return map(int, PLAYER_IND_RE.findall(line)) - -def _get_real_name(canon_name, names_list): - return names_list[int(PLAYER_IND_RE.match(canon_name).group('num'))] - -def parse_turn_header(turn_header_line, names_list = None): - """ Given a turn header line return a dictionary containing - information about the turn. All turns have a player name in the key - 'name'. - - Normal turns have a 'turn_no'. - Possession turns have a 'pname' for the name of the possessor. - Outpost turns have the 'outpost' value set to true.""" - - # This could be done with a single really complicated regexp, but I kept - # screwing up the regexp when I tried to join them, and so here we - # have some code to match against the three different cases. - - def _get_name(match, name_key = 'name'): - if names_list is None: - return match.group(name_key) - return _get_real_name(match.group(name_key), names_list) - - parsed_header = {} - norm_match = NORM_TURN_HEADER_RE.search(turn_header_line) - if norm_match: - parsed_header['turn_no'] = int(norm_match.group('turn_no')) - parsed_header['name'] = _get_name(norm_match) - return parsed_header - - poss_match = POSS_TURN_HEADER_RE.search(turn_header_line) - if poss_match: - parsed_header['name'] = _get_name(poss_match) - parsed_header['pname'] = _get_name(poss_match, 'pname') - return parsed_header - - out_match = OUTPOST_TURN_HEADER_RE.search(turn_header_line) - if out_match: - parsed_header['name'] = _get_name(out_match) - parsed_header['outpost'] = True - return parsed_header - - raise ParseTurnHeaderError(turn_header_line) - -def parse_turn(turn_blob, names_list): - """ Parse the information from a given turn. - - Return a dict containing the following fields. If any of the fields have - a value that evaluates to False, do not keep it. - - name: player name. - number: 1 indexed turn number. - plays: List of cards played. - buys: List of cards bought. - gains: List of cards gained. - trashes: List of cards trashed. - returns: List of cards returned. - ps_tokens: Number of pirate ship tokens gained. - vp_tokens: Number of victory point tokens gained. - money: Amount of money available during entire buy phase. - opp: Dict keyed by opponent index in names_list, containing dicts with trashes/gains. - """ - lines = turn_blob.strip().split('\n') - header = lines[0] - parsed_header = parse_turn_header(header, names_list) - - poss, outpost = False, False - - if 'pname' in parsed_header: - possessee_name = parsed_header['name'] - possessee_index = names_list.index(possessee_name) - poss = True - if 'outpost' in parsed_header: - outpost = True - - ret = {GAINS: [], TRASHES: [], BUYS: []} - plays = [] - returns = [] - turn_money = 0 - vp_tokens = 0 - ps_tokens = 0 - opp_turn_info = collections.defaultdict(lambda: {GAINS: [], - TRASHES: [], - BUYS: []}) - tracker = PlayerTracker() - - for line_idx, line in enumerate(lines): - active_player = tracker.get_active_player(line) - if active_player == tracker.current_player(): - targ_obj = ret - else: - # Stop using the player's name here, as it is used as a - # key name in a dict, which can't be stored in MongoDB if - # it contains a dot ('.') or starts with a dollar - # sign. Instead, use the player index number so we can - # extract the name later. - # - # targ_obj = opp_turn_info[names_list[active_player]] - targ_obj = opp_turn_info[str(active_player)] - - has_trashing = KW_TRASHING in line - has_trashes = KW_TRASHES in line - has_gaining = KW_GAINING in line - orig_buys_len = len(targ_obj.get(BUYS, [])) - orig_gains_len = len(targ_obj.get(GAINS, [])) - - did_trading_post_gain = False - - if has_trashes: - if has_gaining: - # Trading post turn, first trashes, then gaining - gain_start = line.find(KW_GAINING) - targ_obj[TRASHES].extend(capture_cards(line[:gain_start])) - targ_obj[GAINS].extend(capture_cards(line[gain_start:])) - did_trading_post_gain = True - else: - targ_obj[TRASHES].extend(capture_cards(line)) - if KW_WITH_A in line: - if KW_REPLACING in line: - new_gained_portion = line[line.find(KW_WITH_A):] - targ_obj[GAINS].extend(capture_cards(new_gained_portion)) - if KW_PLAYS in line or KW_PLAYING in line: - plays.extend(capture_cards(line)) - if has_gaining and not did_trading_post_gain: - if KW_ANOTHER_ONE in line: # mints a gold gaining another one - targ_obj[GAINS].extend(capture_cards(line)) - else: - # gaining always associated with current player? - targ_obj[GAINS].extend( - capture_cards(line[line.find(KW_GAINING):])) - if KW_BUYS in line: - targ_obj[BUYS].extend(capture_cards(line)) - if KW_GAINS_THE in line: - targ_obj[GAINS].extend(capture_cards(line)) - if has_trashing: - if KW_REVEALS in lines[line_idx - 1] and not KW_DRAWS in line: - targ_obj[TRASHES].extend(capture_cards(lines[line_idx - 1])) - if KW_REVEALING in line or KW_REVEALS in line: - # reveals watchtower trashing ... - # noble brigand reveals xx, yy and trashes yy - trashed = capture_cards(line[line.find(KW_TRASHING):]) - targ_obj[TRASHES].extend(trashed) - else: - rest = line - if KW_GAINING in line: - rest = line[:line.find(KW_GAINING)] - targ_obj[TRASHES].extend(capture_cards(rest)) - if KW_GAINS_A in line or KW_GAMES_A in line: - if KW_TOKEN in line: - assert get_card('Pirate Ship') in capture_cards(line), 'Pirate ship not in line' - ps_tokens += 1 - else: - rest = line[max(line.find(KW_GAINS_A), line.find(KW_GAMES_A)):] - targ_obj[GAINS].extend(capture_cards(rest)) - if KW_IS_TRASHED in line: - # Saboteur after revealing cards, name not mentioned on this line. - cards = capture_cards(line) - targ_obj[TRASHES].extend(cards) - if KW_REVEALS in line: - card_revealed = capture_cards(line) - - # arg, ambassador requires looking at the next line to figure - # out how many copies were returned - if (card_revealed and line_idx + 1 < len(lines) and - KW_RETURNING in lines[line_idx + 1] and not - KW_REVEALING in lines[line_idx + 1]): - next_line = lines[line_idx + 1] - num_copies = 1 - num_copies_match = NUMBER_COPIES.search(next_line) - if num_copies_match: - num_copies = int(num_copies_match.group(1)) - returns.extend(card_revealed * num_copies) - if KW_REVEALING in line and KW_TO_THE_SUPPLY in line: - # old style ambassador line - returns.extend(capture_cards(line)) - if KW_GETTING in line or KW_GETS in line or KW_GET in line: - money_match = GETTING_MONEY_RE.search(line) - if money_match: - turn_money += int(money_match.group(1)) - if KW_WHICH_IS_WORTH in line: - worth_match = WHICH_IS_WORTH_RE.search(line) - assert bool(worth_match), line - turn_money += int(worth_match.group(1)) - if KW_FOR_MONEY in line: - worth_match = FOR_MONEY_RE.search(line) - assert bool(worth_match), line - turn_money += int(worth_match.group(1)) - if u'â–¼' in line: - vp_tokens += int(VP_TOKEN_RE.search(line).group('num')) - if KW_INSTEAD in line and not KW_WISHING in line and 'Trader' in line: - if 'buy_or_gain' in targ_obj: - targ_list = targ_obj[targ_obj['buy_or_gain']] - non_silver_ind = len(targ_list) - 1 - while (non_silver_ind >= 0 and - targ_list[non_silver_ind] == 'Silver'): - non_silver_ind -= 1 - # This shouldn't work when there is no non-silver, but then - # non_silver_ind == -1 if there is no non-silver, - # which magically pops the last item. <3 guido. - targ_list.pop(non_silver_ind) - else: - assert 'Ill-Gotten Gains' in plays, ( - "line %s: line\n, targ_obj: %s\n context: %s" % ( - line, str(targ_obj), - '\n'.join(lines[line_idx - 2: line_idx + 2]))) - - now_buys_len = len(targ_obj.get(BUYS, [])) - now_gains_len = len(targ_obj.get(GAINS, [])) - if now_buys_len > orig_buys_len: - targ_obj['buy_or_gain'] = BUYS - if now_gains_len > orig_gains_len: - targ_obj['buy_or_gain'] = GAINS - - assert not (now_buys_len > orig_buys_len and - now_gains_len > orig_gains_len), 'buys or gains mismatch' - - def _delete_if_exists(d, n): - if n in d: - del d[n] - - _delete_if_exists(ret, 'buy_or_gain') - - if poss: - possessee_info = opp_turn_info[str(possessee_index)] - for k in [GAINS, TRASHES]: - _delete_if_exists(possessee_info, k) - - possessee_info[VP_TOKENS], vp_tokens = vp_tokens, 0 - possessee_info[RETURNS], returns = returns, [] - ret[BUYS] = [] # buys handled by possesion gain line. - - for opp in opp_turn_info.keys(): - _delete_if_exists(opp_turn_info[opp], 'buy_or_gain') - delete_keys_with_empty_vals(opp_turn_info[opp]) - - d = opp_turn_info[opp] - for k, v in d.iteritems(): - if k==VP_TOKENS: - d[k] = v - else: - d[k] = indexes(v) - - ret[BUYS] = indexes(ret[BUYS]) - ret[GAINS] = indexes(ret[GAINS]) - ret[TRASHES] = indexes(ret[TRASHES]) - - ret.update({NAME: names_list[tracker.current_player()], - PLAYS: indexes(plays) , RETURNS: indexes(returns), - MONEY: count_money(plays) + turn_money, - VP_TOKENS: vp_tokens, PIRATE_TOKENS: ps_tokens, - POSSESSION: poss, OUTPOST: outpost, - OPP: dict(opp_turn_info)}) - - delete_keys_with_empty_vals(ret) - return ret - -def split_turns(turns_blob): - """ Given a string of game play data, return a list of turn strings - separated by turn headers.""" - turn_texts = [''] - for line in turns_blob.split('\n'): - try: - parse_turn_header(line) - turn_texts.append(line + '\n') - except ParseTurnHeaderError, e: - turn_texts[-1] += line + '\n' - return [t for t in turn_texts if t] - -def parse_turns(turns_blob, names_list): - """ Return a list of turn objects, as documented by parse_turn(). """ - return [parse_turn(text, names_list) for text in split_turns(turns_blob)] - - def save_parse_error(parse_error_col, log, game, message): """ Store parsing errors with the game ID so we can reflow them later """ parse_error = {'game_id': game['_id'], @@ -810,19 +112,23 @@ def parse_game_from_dict(log, parse_error_col, game): if 'game aborted' in contents: log.debug('%s is aborted game', game['_id']) return None + if '403 Forbidden' in contents or '<title>404 Not Found' in contents: + log.debug('%s mis-downloaded game', game['_id']) + return None try: parsed = parse_game(contents, dubious_check = True) parsed['_id'] = game['_id'] parsed['game_date'] = game['game_date'] return parsed - except BogusGameError, bogus_game_exception: - log.debug('%s got BogusGameError: %s', game['_id'], bogus_game_exception.reason) + except parse_common.BogusGameError, bogus_game_exception: + log.debug('%s got BogusGameError: %s', game['_id'], + bogus_game_exception.reason) return None - except ParsingError, pe: + except parse_common.ParsingError, pe: log.warning('%s got ParsingError: %s', game['_id'], pe.reason) save_parse_error(parse_error_col, log, game, pe) return None - except ParseTurnHeaderError, p: + except parse_common.ParseTurnHeaderError, p: log.warning('%s got ParseTurnHeaderError: %s', game['_id'], p) save_parse_error(parse_error_col, log, game, p) return None @@ -841,14 +147,16 @@ def outer_parse_game(filename): if '<b>game aborted' in contents: # print 'skipping aborted game', filename return None + if '<title>403 Forbidden' in contents or '<title>404 Not Found' in contents: + return None try: parsed = parse_game(contents, dubious_check = True) parsed['_id'] = filename.split('/')[-1] return parsed - except BogusGameError, bogus_game_exception: + except parse_common.BogusGameError, bogus_game_exception: # print 'skipped', filename, 'because', bogus_game_exception.reason return None - except ParseTurnHeaderError, p: + except parse_common.ParseTurnHeaderError, p: print 'parse turn header error', p, filename except AssertionError, e: print filename @@ -971,9 +279,12 @@ def check_game_sanity(game_val, log): global __problem_deck_index__ supply = game_val.get_supply() + if game_val.any_resigned(): + return True # Resign leaves deck in arbitrary state, don't catch that + # ignore known bugs. - if set(supply).intersection([get_card('Masquerade'), get_card('Black Market'), get_card('Trader')]): - return True + #if set(supply).intersection([get_card('Masquerade'), get_card('Black Market'), get_card('Trader')]): + #return True # TODO: add score sanity checking here last_state = None @@ -985,9 +296,9 @@ def check_game_sanity(game_val, log): computed_deck_comp = last_state.get_deck_composition( player_deck.name()) - delete_keys_with_empty_vals(parsed_deck_comp) + parse_common.delete_keys_with_empty_vals(parsed_deck_comp) computed_dict_comp = dict(computed_deck_comp) - delete_keys_with_empty_vals(computed_dict_comp) + parse_common.delete_keys_with_empty_vals(computed_dict_comp) if parsed_deck_comp != computed_deck_comp: found_something_wrong = False diff --git a/parse_goko_game.py b/parse_goko_game.py new file mode 100644 index 0000000..d504d84 --- /dev/null +++ b/parse_goko_game.py @@ -0,0 +1,1018 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +"""Parse raw goko game into JSON list of game documents.""" + +import bz2 +import codecs +import collections +import datetime +import itertools +import logging +import logging.handlers +import multiprocessing +import os +import os.path +import pprint +import pymongo +import re +import sys + +from dominioncards import get_card, CardEncoder, indexes, index_to_card +from game import Game +from keys import * +from utils import segments +import dominioncards +import game +import name_merger +import simplejson as json +import utils +import parse_common + +RECEIVES_COIN_TOKENS_RE = re.compile('receives (\d+) coin token') +USES_COIN_TOKENS_RE = re.compile('uses (\d+) coin token') +KW_OVERPAYS = 'overpays for' + +RATING_SYSTEM_RE = re.compile('^Rating system: (.*)$') +GAME_OVER_RE = re.compile('^------------ Game Over ------------$') +EMPTY_LINE_RE = re.compile('^\s*$') +ENDGAME_VP_CHIP_RE = re.compile('^.* - victory point chips: (\d+)$') +ENDGAME_POINTS_RE = re.compile('^.* - total victory points: (-?\d+)$') +START_TURN_RE = re.compile('^---------- (.*): turn (.*?) (\[possessed\] )?----------$') +VP_CHIPS_RE = re.compile('receives (\d+) victory point chips') +HYPHEN_SPLIT_RE = re.compile('^(.*) - (.*)$') +COMMA_SPLIT_RE = re.compile(', ') +NUMBER_CARD_RE = re.compile('\s*(\d+) (.*)') +BANE_RE = re.compile('^Bane card: (.*)$') +PLAYER_AND_START_DECK_RE = re.compile('^(.*) - starting cards: (.*)$') +TAKES_COINS_RE = re.compile('takes (\d+) coin') +RECEIVES_COINS_RE = re.compile('receives (\d+) coin') +TAKES_ACTIONS_RE = re.compile('takes (\d+) action') +RECEIVES_ACTIONS_RE = re.compile('receives (\d+) action') + +KW_SCHEME_CHOICE = 'Scheme choice: ' +KW_MOVES = 'moves ' +KW_MOVES_DECK_TO_DISCARD = 'moves deck to discard' +KW_APPLIED = 'applied ' #applied Watchtower to place X on top of the deck +KW_APPLIES_WHEN_TRASHED = "applies the 'when you trash ability' of " +KW_TO_THE_SUPPLY = ' to the Supply' +KW_PLACE = 'place: ' +KW_CARDS = 'cards: ' +KW_CARDS_IN_DISCARDS = 'cards in discards' +KW_PLAYS = 'plays ' +KW_LOOKS_AT = 'looks at ' +KW_GAINS = 'gains ' +KW_RECEIVES = 'receives ' +KW_RESIGNED = 'resigned' +KW_QUIT = 'quit' +KW_REVEALS_C = 'reveals: ' +KW_REVEALS_HAND = 'reveals hand: ' +KW_HAND = 'hand: ' +KW_REVEALS = 'reveals ' +KW_REVEALS_REACTION = 'reveals reaction ' +KW_REACTION = 'reaction ' +KW_DISCARDS = 'discards ' +KW_DISCARDS_C = 'discards: ' +KW_PLACES = 'places ' +KW_BUYS = 'buys ' +KW_DRAWS = 'draws ' +KW_TRASHES = 'trashes ' +KW_PASSES = 'passes ' +KW_SHUFFLES = 'shuffles deck' +KW_PLACES = 'places ' +KW_DURATION = 'duration ' +KW_SETS_ASIDE = 'sets aside ' +KW_TAKES_SET_ASIDE = 'takes set aside cards: ' +KW_CHOOSES = 'chooses ' +KW_CHOOSES_TWO_CARDS_AND_ONE_ACTION = 'chooses two cards and one action' +KW_RECEIVES_ONE_ACTION = 'receives one action' +KW_EMBARGOES = 'embargoes ' +KW_NAMES = 'names ' +KW_CHOOSES_TWO_COINS = 'chooses two coins' +KW_RETURNS = 'returns ' +KW_PIRATE_COIN = 'receives a pirate coin, now has ' +KW_VP_CHIPS = 'victory point chips' +KW_TAKES = 'takes ' + +ACTION_PHASE = 'ap' +BUY_PHASE = 'bp' +CLEANUP_PHASE = 'cp' + +KEYWORDS = [locals()[w] for w in dict(locals()) if w.startswith('KW_')] + +def parse_player_start_decks(log_lines): + start_decks = [] + start_match = PLAYER_AND_START_DECK_RE.match(log_lines[0]) + while start_match: + line=log_lines.pop(0) + name = start_match.group(1) + start_deck = indexes(capture_cards(start_match.group(2))) + start_decks.append({NAME:name, START_DECK:start_deck}) + + start_match = PLAYER_AND_START_DECK_RE.match(log_lines[0]) + return start_decks + +def parse_supply(log_lines): + line = log_lines.pop(0) + supply_cards_text = line.split(', ') + supply_cards_text[0] = supply_cards_text[0].replace('Supply cards: ','') + supply_cards = [] + for card_name in supply_cards_text: + try: + card = get_card(card_name) + except KeyError, exception: + raise parse_common.ParsingError('%s is not a card in the supply!' + % card_name) + supply_cards.append(card.index) + + bane_match = BANE_RE.match(log_lines[0]) + if bane_match: + try: + bane_card = get_card(bane_match.groups()[0]) + log_lines.pop(0) + except KeyError, exception: + raise parse_common.ParsingError('%s is not a valid bane!' + % card_name) + return supply_cards + +def parse_header(log_lines): + """Parse the goko header. + + It begins with the 'Game Setup' line and ends with the blank line before + the first player's first turn. + """ + + # first line - header line + line = log_lines.pop(0) + assert('Game Setup' in line) + + # next - supply + supply_cards = parse_supply(log_lines) + + # optionally, may say the game type. Old logs won't have this. + rating_system_match = RATING_SYSTEM_RE.match(log_lines[0]) + if rating_system_match: + rating_system = rating_system_match.group(1) + line = log_lines.pop(0) + else: + rating_system = 'unknown' + + # Next N lines will give me the N players and their start decks + start_decks = parse_player_start_decks(log_lines) + names_list = [d[NAME] for d in start_decks] + + # next 2N lines are the players shuffling their decks + # and drawing their starting hands. Then one blank line. + log_lines[0:(len(names_list)*2+1)] = [] + + return {START_DECKS:start_decks, PLAYERS:names_list, SUPPLY:supply_cards, + RATING_SYSTEM:rating_system} + +def validate_names(game_dict, dubious_check): + """ Raise an exception for names that might screw up the parsing. + This should happen in less than 1% of real games, but it's just easier + to punt on annoying inputs that to make sure we get them right. + """ + names = game_dict[PLAYERS] + used_names = set() + for name in names: + if name in used_names: + # unrecoverable! + raise parse_common.BogusGameError('Duplicate name %s' % name) + used_names.add(name) + + if len(names) <= 1 and dubious_check: + # that's recoverable, so only raise error if checking dubious + raise parse_common.BogusGameError('only one player') + + +def capture_cards(line, return_dict=False): + """ Given a section of text from goko, extract the cards. + + line: string like 'plays 1 Silver, 3 Copper' + returns: list of the card objects, eg, [Silver, Copper, Copper, Copper] + """ + for kw in KEYWORDS: + line=line.replace(kw, '') + + + if return_dict: + cards = {} + else: + cards = [] + + if EMPTY_LINE_RE.match(line): + return cards + + card_sections = COMMA_SPLIT_RE.split(line) + for sect in card_sections: + multiple = NUMBER_CARD_RE.match(sect) + if multiple: + mult = int(multiple.group(1)) + sect = multiple.group(2) + else: + mult = 1 + + try: + card = get_card(sect) + except KeyError, exception: + raise parse_common.ParsingError('Failed to find card in line: %s' + % line) + if return_dict: + cards[str(card.index)]=mult + else: + cards.extend([card] * mult) + return cards + +def parse_turn(log_lines, names_list, trash_pile, trade_route_set, removed_from_supply, masq_targets, previous_name): + """ Parse the information from a given turn. + + Maintain the trash pile. This is necessary for Forager money counting. + Maintains the trade route tokens AND the list of all cards gained, which + we need to accurately know when Cities are activated. + + Return a dict containing the following fields. If any of the fields have + a value that evaluates to False, do not keep it. + + name: player name. + number: 1 indexed turn number. + plays: List of cards played. + buys: List of cards bought. + gains: List of cards gained. + trashes: List of cards trashed. + returns: List of cards returned. + passes: List of cards passed with Masquerade. + receives: List of cards received from Masquerade. + ps_tokens: Number of pirate ship tokens gained. + vp_tokens: Number of victory point tokens gained. + money: Amount of money available during entire buy phase. + opp: Dict keyed by opponent index in names_list, containing dicts with trashes/gains/passes/receives. + """ + n_players = len(names_list) + + def pile_size(card, n_players): + if card == dominioncards.Ruins or card == dominioncards.Curse: + return max((n_players - 1)*10, 10) + if card == dominioncards.Province: + if n_players <= 2: + return 8 + if n_players == 3: + return 12 + return 12+(n_players - 4)*3 + if card.is_victory(): + if n_players <= 2: + return 8 + return 12 + if card in [dominioncards.Spoils, dominioncards.Mercenary, + dominioncards.Madman] or card.is_ruins() or card.is_shelter(): + return 999 + if card == dominioncards.Copper: + if n_players < 5: + return 60 + return 120 + if card == dominioncards.Silver: + if n_players < 5: + return 40 + return 80 + if card == dominioncards.Gold: + if n_players < 5: + return 30 + return 60 + if card == dominioncards.Platinum: + return 12 + if card == dominioncards.Potion: + return 16 + return 10 + + def empty_piles(removed_from_supply, n_players): + # For cities... + empty_piles = [] + + # First, piles of different cards + if (sum([removed_from_supply[c] for c in removed_from_supply.keys() if c.is_knight()]) == pile_size(dominioncards.Knights, n_players)): + empty_piles.append(dominioncards.Knights) + if (sum([removed_from_supply[c] for c in removed_from_supply.keys() if c.is_ruins()]) == pile_size(dominioncards.Knights, n_players)): + empty_piles.append(dominioncards.Knights) + + for pile,num in removed_from_supply.items(): + if pile_size(pile, n_players) == num: + empty_piles.append(pile) + return empty_piles + + def _delete_if_exists(d, n): + if n in d: + del d[n] + + def fix_buys_and_gains(buys, gains): + """Goko reports each buy and gain separately. This is correct, but + having everything compatible with iso stats would be nice! So, here + I 'fix' buys and gains so things which are bought and gained are + only reported once, in 'buys', and things which are bought but not + gained (such as due to trader or possession) are not listed. + """ + new_buys = [] + for buy in buys: + if buy in gains: + gains.remove(buy) + new_buys.append(buy) + return (new_buys, gains) + + ret = {PLAYS: [], RETURNS: [], GAINS: [], TRASHES: [], BUYS: [], PASSES: [], + RECEIVES: []} + durations = [] + turn_money = 0 + turn_coin_tokens = 0 + vp_tokens = 0 + ps_tokens = 0 + + # Keep track of last play, and whether it is still 'active' + # for stuff like trashing copper to Moneylender, gaining cards from the + # trash, etc. Card effects which last more than one line. + last_play = None + harvest_reveal = [] + trashed_to_mercenary = 0 + current_phase = None + dup_plays_remaining = -1 + done_self_trashing = False + bom_plays = 0 # For throne room/procession/KC - don't get to rechoose BoM + bom_choice = None + bom_processioned = False # to trash it properly + storeroom_discards = [] + done_resolving = True + coin_tokens = 0 + + action_counter = 0 # All this... just for diadem. :/ + + opp_turn_info = collections.defaultdict(lambda: {GAINS: [], BUYS: [], + TRASHES: [], PASSES: [], + RECEIVES:[]}) + while True: + line = log_lines.pop(0) + turn_start = START_TURN_RE.match(line) + + if turn_start: + action_counter = 1 + ret[NAME] = turn_start.group(1) + ret[NUMBER] = int(turn_start.group(2)) + current_phase = ACTION_PHASE + if turn_start.group(3): + ret[POSSESSION] = True + if previous_name and previous_name not in masq_targets: + masq_targets[previous_name] = ret[NAME] + continue + + # empty line ends the turn, clean up and return + if EMPTY_LINE_RE.match(line): + # Current goko log bug - does not report 1 VP from Bishop + vp_tokens += ret[PLAYS].count(dominioncards.Bishop) + + if last_play == dominioncards.Forager and not done_resolving: + turn_money += sum([d.is_treasure() for d in set(trash_pile)]) + if last_play == dominioncards.Harvest and not done_resolving: + turn_money += len(set(harvest_reveal)) + + money = parse_common.count_money(ret[PLAYS], True) + \ + turn_money + parse_common.count_money(durations, True) - \ + durations.count(dominioncards.HorseTraders)*3 + + (buys, gains) = fix_buys_and_gains(ret[BUYS], ret[GAINS]) + + ret[BUYS] = indexes(buys) + ret[PLAYS] = indexes(ret[PLAYS]) + ret[RETURNS] = indexes(ret[RETURNS]) + ret[GAINS] = indexes(gains) + ret[TRASHES] = indexes(ret[TRASHES]) + ret[PASSES] = indexes(ret[PASSES]) + ret[RECEIVES] = indexes(ret[RECEIVES]) + durations = indexes(durations) + for opp in opp_turn_info.keys(): + _delete_if_exists(opp_turn_info[opp], 'buy_or_gain') + parse_common.delete_keys_with_empty_vals(opp_turn_info[opp]) + + d = opp_turn_info[opp] + for k, v in d.iteritems(): + if k==VP_TOKENS: + d[k] = v + else: + d[k] = indexes(v) + + ret.update({MONEY:money, VP_TOKENS: vp_tokens, + PIRATE_TOKENS: ps_tokens, COIN_TOKENS: coin_tokens, OPP: dict(opp_turn_info)}) + return ret + + + + player_and_rest = HYPHEN_SPLIT_RE.match(line) + active_player = player_and_rest.group(1) + action_taken = player_and_rest.group(2) + + # Card-specific processing: + # Will need to add Stash options whenever stash is implemented. + # These cards all have unstated effects that last longer than one goko + # line. For example, Forager will need to count coins after the next + # 'trash' line - if there is one. Mining Village gives +$2 if trashed - + # on the next line after it is played and it draws a card. + if (last_play == dominioncards.Forager and not done_resolving and + KW_TRASHES not in action_taken): + turn_money += sum([d.is_treasure() for d in set(trash_pile)]) + done_resolving = True + elif (last_play == dominioncards.MiningVillage and + KW_SHUFFLES not in action_taken and + KW_DRAWS not in action_taken and + KW_TRASHES not in action_taken): + done_resolving = True + elif (last_play == dominioncards.Tournament and + KW_REVEALS not in action_taken and + KW_REVEALS_C not in action_taken and + KW_GAINS not in action_taken): + done_resolving = True + elif (last_play == dominioncards.Counterfeit and + (KW_PLAYS not in action_taken or + dominioncards.Spoils not in capture_cards(action_taken))): + done_resolving = True + elif (last_play == dominioncards.Thief and + KW_TRASHES not in action_taken and + KW_SHUFFLES not in action_taken and + KW_REVEALS not in action_taken and + KW_REVEALS_C not in action_taken and + KW_DISCARDS not in action_taken and + KW_DISCARDS_C not in action_taken and + KW_GAINS not in action_taken): + done_resolving = True + elif (last_play == dominioncards.NobleBrigand and + KW_GAINS in action_taken and + dominioncards.NobleBrigand in capture_cards(action_taken)): + done_resolving = True + elif (last_play == dominioncards.NobleBrigand and + KW_TRASHES not in action_taken and + KW_SHUFFLES not in action_taken and + KW_REVEALS not in action_taken and + KW_REVEALS_C not in action_taken and + KW_DISCARDS not in action_taken and + KW_DISCARDS_C not in action_taken and + KW_GAINS not in action_taken): + done_resolving = True + elif (last_play == dominioncards.Rogue and + KW_GAINS not in action_taken): + done_resolving = True + elif (last_play == dominioncards.Graverobber and + KW_GAINS not in action_taken): + done_resolving = True + elif (last_play == dominioncards.Mercenary and + KW_TRASHES not in action_taken and + KW_REVEALS not in action_taken and + KW_DRAWS not in action_taken and + KW_PLACES not in action_taken and + KW_GAINS not in action_taken and + KW_SHUFFLES not in action_taken): + done_resolving = True + trashed_to_mercenary = 0 + elif (last_play == dominioncards.Moneylender and + (KW_TRASHES not in action_taken or + dominioncards.Copper not in capture_cards(action_taken))): + done_resolving = True + elif (last_play == dominioncards.Salvager and + KW_TRASHES not in action_taken): + done_resolving = True + elif (last_play == dominioncards.Baron and + (KW_DISCARDS not in action_taken or + dominioncards.Estate not in capture_cards(action_taken))): + done_resolving = True + elif (last_play == dominioncards.Harvest and + KW_REVEALS not in action_taken and + KW_REVEALS_C not in action_taken and + KW_SHUFFLES not in action_taken): + turn_money += len(set(harvest_reveal)) + harvest_reveal = [] + done_resolving = True + elif (last_play == dominioncards.BandofMisfits and + KW_CHOOSES not in action_taken): + done_resolving = True + elif (last_play == dominioncards.Ironmonger and + KW_DRAWS not in action_taken and + KW_SHUFFLES not in action_taken and + KW_REVEALS_C not in action_taken and + KW_REVEALS not in action_taken): + done_resolving = True + elif (last_play == dominioncards.Ironworks and + KW_GAINS not in action_taken): + done_resolving = True + elif (last_play == dominioncards.Storeroom and + KW_DISCARDS not in action_taken and + KW_DRAWS not in action_taken and + KW_SHUFFLES not in action_taken): + turn_money += len(storeroom_discards) + storeroom_discards = [] + done_resolving = True + + if KW_PLAYS in action_taken: + played = capture_cards(action_taken) + ret[PLAYS].extend(played) + + # special cases + for play in played: + if play.is_action(): + if not(play == dominioncards.Cultist and play == last_play) and play != dominioncards.BandofMisfits: + action_counter -= 1 + action_counter += play.num_plus_actions() + if bom_choice is not None: + if bom_plays == 0: + bom_choice = None + else: + bom_plays -= 1 + + if dup_plays_remaining >= 0 and play != dominioncards.BandofMisfits: + dup_plays_remaining -= 1 + if dup_plays_remaining < 0: + done_self_trashing = False + + if play.is_treasure(): + phase = BUY_PHASE + elif (last_play == dominioncards.ThroneRoom or + last_play == dominioncards.Procession or + last_play == dominioncards.Golem): + action_counter += 2 + elif last_play == dominioncards.KingsCourt: + action_counter += 3 + + if play == dominioncards.PoorHouse: + turn_money += 4 # Subtraction will happen later + elif play == dominioncards.ThroneRoom or play == dominioncards.Procession: + dup_plays_remaining = 2 + elif play == dominioncards.KingsCourt: + dup_plays_remaining = 3 + elif play == dominioncards.Madman and dup_plays_remaining <= 0: + ret[RETURNS].append(play) + elif play == dominioncards.Spoils: + # Spoils always get returned on play... + # ...unless it's Counterfeited. + # Technically, this clause will be incorrect if someone + # plays a counterfeit, selects no treasure to counterfeit, + # and then just plays a spoils. + if (last_play != dominioncards.Counterfeit or + done_resolving): + ret[RETURNS].append(play) + elif play == dominioncards.TradeRoute: + turn_money += len(trade_route_set) + elif play == dominioncards.Tournament: + turn_money += 1 # Might be canceled out later + elif play == dominioncards.Diadem: + turn_money += action_counter + elif play == dominioncards.BandofMisfits: + bom_processioned = False + if last_play == dominioncards.ThroneRoom: + bom_plays = 2 + elif last_play == dominioncards.Procession: + bom_plays = 2 + bom_processioned = True + elif last_play == dominioncards.KingsCourt: + bom_plays = 3 + else: + bom_plays = 1 + elif play == dominioncards.Conspirator and len(ret[PLAYS]) > 2: + action_counter += 1 + elif (play == dominioncards.Crossroads and + ret[PLAYS].count(dominioncards.Crossroads) == 1): + action_counter += 3 + elif play == dominioncards.City: + if len(empty_piles(removed_from_supply, n_players)) >= 2: + turn_money += 1 + + last_play = play + done_resolving = False + continue + + if KW_BUYS in action_taken: + buys = capture_cards(action_taken) + ret[BUYS].extend(buys) + + # easier to deal with the on-buy attack by making it a fake play + if dominioncards.NobleBrigand in buys: + last_play == dominioncards.NobleBrigand + done_resolving = False + continue + + if KW_RETURNS in action_taken: + returned = capture_cards(action_taken) + ret[RETURNS].extend(returned) + for r in returned: + removed_from_supply[r] -= 1 + continue + + if KW_GAINS in action_taken: + gained = capture_cards(action_taken) + trade_route_set.update([g for g in gained if g.is_victory()]) + + if active_player == ret[NAME]: + ret[GAINS].extend(gained) + if(not done_resolving and (last_play == dominioncards.Thief or + last_play == dominioncards.NobleBrigand) and + dominioncards.Mercenary not in gained): + for c in gained: + if not c.is_treasure(): + done_resolving = True + else: + if c in trash_pile: + # Early goko logs have bugs with who reported + # trashing cards. + trash_pile.remove(c) + if(not done_resolving and (last_play == dominioncards.Rogue or + last_play == dominioncards.Graverobber) and + dominioncards.Mercenary not in gained): + for c in gained: + if c in trash_pile: + # BoM as death cart is ambiguous + trash_pile.remove(c) + done_resolving = True + else: + for g in gained: + removed_from_supply[g] += 1 + + if (last_play == dominioncards.Ironworks and + not done_resolving): + if gained[0].is_treasure(): + turn_money += 1 + if gained[0].is_action(): + action_counter += 1 + done_resolving = True + else: + opp_turn_info[str(names_list.index(active_player))][GAINS].extend(gained) + for g in gained: + removed_from_supply[g] += 1 + continue + + # Some old Goko logs mis-attribute trashing from attacks. I'm not + # going to special-case all the various goko bugs that have since been + # fixed, though. So there will be bugs with some old logs. + if KW_TRASHES in action_taken: + trashed = capture_cards(action_taken) + + if active_player == ret[NAME]: + + # Making TR-feast not doublecount Feast trashing + if(last_play not in trashed or not last_play.can_trash_self()): + done_self_trashing = False + if (dup_plays_remaining >= 0 and last_play in trashed and done_self_trashing and last_play.can_trash_self()): + trashed.remove(last_play) #TR+feast + if (last_play in trashed and dup_plays_remaining > 0 and last_play.can_trash_self()): + done_self_trashing = True + + + if (last_play == dominioncards.MiningVillage and + not done_resolving and + dominioncards.MiningVillage in trashed): + turn_money += 2 + elif (last_play == dominioncards.Moneylender and + not done_resolving and + dominioncards.Copper in trashed): + turn_money += 3 + elif last_play == dominioncards.Salvager and not done_resolving: + turn_money += trashed[0].coin_cost + elif last_play == dominioncards.Mercenary and not done_resolving: + trashed_to_mercenary += len(trashed) + if trashed_to_mercenary == 2: + turn_money += 2 + done_resolving = True + trashed_to_mercenary = 0 + + while dominioncards.Fortress in trashed: + trashed.remove(dominioncards.Fortress) + if trashed == bom_choice and (bom_choice[0].can_trash_self() or bom_processioned): + trashed = [dominioncards.BandofMisfits] + if (bom_choice is not None and + dominioncards.TreasureMap in bom_choice and + dominioncards.TreasureMap in trashed): + trashed.remove(dominioncards.TreasureMap) + trashed.extend([dominioncards.BandofMisfits]) + + + if POSSESSION not in ret: + ret[TRASHES].extend(trashed) + trash_pile.extend(trashed) + + if last_play == dominioncards.Forager and not done_resolving: + turn_money +=sum([d.is_treasure() for d in set(trash_pile)]) + done_resolving = True + + else: + while dominioncards.Fortress in trashed: + trashed.remove(dominioncards.Fortress) + opp_turn_info[str(names_list.index(active_player))][TRASHES].extend(trashed) + trash_pile.extend(trashed) + + if last_play in [dominioncards.MiningVillage, dominioncards.Forager, dominioncards.Salvager]: + done_resolving = True + continue + + match = USES_COIN_TOKENS_RE.match(action_taken) + if match: + turn_money += int(match.group(1)) + turn_coin_tokens -= int(match.group(1)) + continue + + match = RECEIVES_COIN_TOKENS_RE.match(action_taken) + if match: + turn_coin_tokens += int(match.group(1)) + continue + + if KW_PASSES in action_taken: + passed_cards = capture_cards(action_taken) + receiver = masq_targets[active_player] + + if active_player == ret[NAME]: + ret[PASSES].extend(passed_cards) + else: + opp_turn_info[str(names_list.index(active_player))][PASSES].extend(passed_cards) + if receiver == ret[NAME]: + ret[RECEIVES].extend(passed_cards) + else: + opp_turn_info[str(names_list.index(receiver))][RECEIVES].extend(passed_cards) + + continue + + if KW_DURATION in action_taken: + duration = capture_cards(action_taken) + durations.extend(duration) + for d in duration: + if d in [dominioncards.FishingVillage, dominioncards.Tactician]: + action_counter += 1 + continue + + if (KW_CHOOSES_TWO_CARDS_AND_ONE_ACTION in action_taken or + KW_RECEIVES_ONE_ACTION in action_taken): + action_counter += 1 + continue + + if KW_CHOOSES_TWO_COINS in action_taken: + turn_money += 2 + continue + + if KW_CHOOSES in action_taken: + if last_play == dominioncards.BandofMisfits and not done_resolving: + bom_choice = capture_cards(action_taken) + if bom_choice[0] == dominioncards.Knights: + bom_choice[0] == dominioncards.SirMartin + continue + + if KW_PIRATE_COIN in action_taken: + ps_tokens += 1 + continue + + if KW_VP_CHIPS in action_taken: + vp_chips_match = VP_CHIPS_RE.match(action_taken) + vp_tokens += int(vp_chips_match.group(1)) + continue + + match = TAKES_COINS_RE.match(action_taken) + if match: + turn_money += int(match.group(1)) + continue + + match = RECEIVES_COINS_RE.match(action_taken) + if match: + turn_money += int(match.group(1)) + continue + + match = TAKES_ACTIONS_RE.match(action_taken) + if match: + action_counter += int(match.group(1)) + continue + + match = RECEIVES_ACTIONS_RE.match(action_taken) + if match: + action_counter += int(match.group(1)) + continue + if KW_DISCARDS in action_taken or KW_DISCARDS_C in action_taken: + if (dominioncards.Estate in capture_cards(action_taken) and + last_play == dominioncards.Baron and + not done_resolving): + turn_money += 4 + done_resolving = True + elif (last_play == dominioncards.SecretChamber): + turn_money += len(capture_cards(action_taken)) + elif (last_play == dominioncards.Vault and + active_player == ret[NAME]): + turn_money += len(capture_cards(action_taken)) + elif (last_play == dominioncards.Storeroom and not done_resolving): + storeroom_discards.extend(capture_cards(action_taken)) + continue + + if (KW_REVEALS_HAND in action_taken): + if last_play == dominioncards.PoorHouse and not done_resolving: + turn_money -= len([tr for tr in capture_cards(action_taken) if tr.is_treasure()]) + if turn_money < 0: + turn_money = 0 + continue + + + if (KW_REVEALS in action_taken or KW_REVEALS_C in action_taken): + if last_play == dominioncards.Harvest: + harvest_reveal.extend(capture_cards(action_taken)) + elif last_play == dominioncards.Herald: + c = capture_cards(action_taken) + if len(c) > 0: + if c[0].is_action(): + action_counter += 1 + if bom_plays > 0: + bom_plays += 1 + if dup_plays_remaining > 0: + dup_plays_remaining += 1 + elif last_play == dominioncards.Golem: + action_counter += len([c for c in capture_cards(action_taken)if (c.is_action() and not c == dominioncards.Golem)]) + elif (last_play == dominioncards.Tournament and + not done_resolving and active_player != ret[NAME] and + dominioncards.Province in capture_cards(action_taken)): + turn_money -= 1 + done_resolving = True + elif (last_play == dominioncards.Ironmonger and not done_resolving): + if capture_cards(action_taken)[0].is_treasure(): + turn_money += 1 + if capture_cards(action_taken)[0].is_action(): + action_counter += 1 + done_resolving = True + continue + + if KW_DRAWS in action_taken: + if last_play == dominioncards.Storeroom: + storeroom_discards = [] + continue + # All remaining actions should be captured; the next few statements + # are those which are not logged in any way (though they could be!) + + if (KW_LOOKS_AT in action_taken or + KW_RECEIVES in action_taken or + KW_PLACES in action_taken or + KW_SETS_ASIDE in action_taken or + KW_TAKES in action_taken or + KW_EMBARGOES in action_taken or + KW_OVERPAYS in action_taken or + KW_NAMES in action_taken or + KW_CARDS_IN_DISCARDS in action_taken or + KW_APPLIED in action_taken or + KW_APPLIES_WHEN_TRASHED in action_taken or + KW_MOVES in action_taken or + KW_MOVES_DECK_TO_DISCARD in action_taken or + KW_SCHEME_CHOICE in action_taken or + KW_SHUFFLES in action_taken or + KW_TAKES_SET_ASIDE in action_taken): + continue + + raise parse_common.BogusGameError('Line did not match any keywords!') + + +def parse_turns(log_lines, names_list, removed_from_supply): + """ + Sequentially go through the log and parse the game, splitting it into turns. + + Also handle outpost and possession turns here. + They require cross-turn information from the end of the *previous* turn. + + In the case of Outpost played during Possession turn, this will mark the + WRONG turn as being an outpost turn, but will still mark one of them. + + Needs number of players so parse_turn can accurately track when vp card + piles have run out, to accurately report number of coins Cities give. + + Starting decks are removed from supply (count supply for city empty piles) + """ + turns = []; + trash_pile = []; + trade_route_set = set([]) + + masq_targets = {} + + previous_name = None # for Possession and Masq + while not GAME_OVER_RE.match(log_lines[0]): + turn = parse_turn(log_lines, names_list, trash_pile, trade_route_set, + removed_from_supply, masq_targets, previous_name) + if POSSESSION in turn: + turn['pname'] = previous_name + elif(len(turns) > 0 and turn[NAME] == turns[-1][NAME] and + POSSESSION not in turn and POSSESSION not in turns[-1]): + turn[OUTPOST] = True + previous_name = turn[NAME] + else: + turn['turn_no'] = True + previous_name = turn[NAME] + turns.append(turn) + + log_lines.pop(0) + return turns + + + +def associate_turns_with_owner(game_dict, turns, dubious_check): + """ Move each turn in turns to be a member of the corresponding player + in game_dict. + + Remove the names from the turn, since it is redundant with the name + on the player level dict.""" + name_to_owner = {} + for idx, deck in enumerate(game_dict[DECKS]): + name_to_owner[deck[NAME]] = deck + deck[TURNS] = [] + + order_ct = 0 + + for idx, turn in enumerate(turns): + owner = name_to_owner[turn[NAME]] + owner[TURNS].append(turn) + if not ORDER in owner: + owner[ORDER] = idx + 1 + order_ct += 1 + del turn[NAME] + + if order_ct != len(game_dict[DECKS]) and dubious_check: + # This may be okay! Only raise if dubious_check + raise parse_common.BogusGameError('Did not find turns for all players') + +def parse_endgame(log_lines): + """ + Parses the endgame section of a goko log. + Everything after the Game Over line. Puts results directly in the game dict. + + Cannot calculate game_end; the trash is not restated in the endgame section, + so there isn't necessarily a way to know why the game ended without going + through the whole game. + """ + + decks = [] + while not KW_PLACE in log_lines[0]: + resigned = False + line = log_lines.pop(0) + hyphen_split_match = HYPHEN_SPLIT_RE.match(line) + name = hyphen_split_match.group(1) + + if KW_RESIGNED in hyphen_split_match.group(2) or KW_QUIT in hyphen_split_match.group(2): + resigned = True + line = log_lines.pop(0) + hyphen_split_match = HYPHEN_SPLIT_RE.match(line) + name = hyphen_split_match.group(1) + + deck_comp = capture_cards(hyphen_split_match.group(2), True) + + line = log_lines.pop(0) + vp_chip_match = ENDGAME_VP_CHIP_RE.match(line) + if vp_chip_match: + vp_tokens = int(vp_chip_match.group(1)) + line=log_lines.pop(0) + else: + vp_tokens = 0 + + points_match = ENDGAME_POINTS_RE.match(line) + total_vp = int(points_match.group(1)) + + # line which says how many turns there were + log_lines.pop(0) + # blank line + log_lines.pop(0) + + # Handle resignations here; give fake -1 point + if resigned: + total_vp = -1 + + decks.append({NAME: name, POINTS: total_vp, RESIGNED: resigned, + DECK: deck_comp, VP_TOKENS: vp_tokens}) + return decks + +def parse_game(game_str, dubious_check = False): + """ Parse game_str into game dictionary. + + game_str: Entire contents of a log file from goko. + dubious_check: If true, raise a BogusGame exception if the game is + suspicious. + + returns a dict with the following fields: + decks: A list of player decks, as documented in parse_endgame. + start_decks: A list of player starting decks. Usually 7c3e. + supply: A list of cards in the supply. + players: A list of normalized player names. + game_end: List of cards exhausted that caused the game to end. + resigned: True iff some player in the game resigned.. + """ + + # Goko logs are not split into sections by an obvious separator + # So analyze sequentially, by lines + log_lines = game_str.split('\n') + + game_dict = parse_header(log_lines) + # start_decks, players, and supply are now set + + validate_names(game_dict, dubious_check) + game_dict[VETO] = {} + + # So much work just to know when two piles are empty for cities! + # Here, need to account for number of coppers/zapped silvers in all start + # decks. Can't get estates to work with zapped start decks and shelters... + removed_from_supply = collections.defaultdict(lambda: 0) + for d in game_dict[START_DECKS]: + for c in d[START_DECK]: + card = index_to_card(c) + if card != dominioncards.Estate and not card.is_shelter(): + removed_from_supply[card] += 1 + + turns = parse_turns(log_lines, game_dict[PLAYERS], removed_from_supply) + decks = parse_endgame(log_lines) + game_dict[DECKS] = decks + associate_turns_with_owner(game_dict, turns, dubious_check) + return game_dict diff --git a/parse_iso_game.py b/parse_iso_game.py new file mode 100644 index 0000000..9af245d --- /dev/null +++ b/parse_iso_game.py @@ -0,0 +1,714 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +"""Parse raw iso game into JSON list of game documents.""" + +import bz2 +import codecs +import collections +import datetime +import itertools +import logging +import logging.handlers +import multiprocessing +import os +import os.path +import pprint +import pymongo +import re +import sys + +from dominioncards import get_card, CardEncoder, indexes, index_to_card +from game import Game +from keys import * +from utils import segments +import dominioncards +import game +import name_merger +import simplejson as json +import utils +import parse_common + +SECTION_SEP = re.compile('^----------------------$', re.MULTILINE) + +NORM_TURN_HEADER_RE = re.compile( + "--- (?P<name>.+)'s turn (?P<turn_no>\d+) ---") +POSS_TURN_HEADER_RE = re.compile( + "--- (?P<name>.+)'s turn \(possessed by (?P<pname>.*)\) ---") +OUTPOST_TURN_HEADER_RE = re.compile( + "--- (?P<name>.+)'s " + re.escape( + "extra turn (from <span class=card-duration>Outpost</span>)")) + +TURN_HEADER_NO_GROUP_RE = re.compile("--- .+'s turn [^-]* ---") +SPLIT_COMMA_AND_RE = re.compile(',| and ') +NUMBER_BEFORE_SPAN = re.compile('(\d+) <span') +NUMBER_COPIES = re.compile('(0|2) copies to') +GETTING_MONEY_RE = re.compile(' \+\$(\d)+') +WHICH_IS_WORTH_RE = re.compile(' which is worth \+\$(\d)+') +FOR_MONEY_RE = re.compile(' for \+\$(\d)+') +VP_TOKEN_RE = re.compile(u'(?P<num>\d+) â–¼', re.UNICODE) + +KW_ANOTHER_ONE = 'another one' +KW_BUYS = ' buys ' +KW_DISCARDS = ' discards ' +KW_GAINING = ' gaining ' +KW_DRAWS = ' draws ' +KW_GAINS_A = ' gains a' +KW_GAMES_A = ' games a' # short lived bug in iso, spelled gains as games +KW_FOR_MONEY = ' for +$' +KW_GAINS_THE = ' gains the ' +KW_GET = 'get +' +KW_GETS = ' gets +' +KW_GETTING = ' getting +' +KW_IS_TRASHED = ' is trashed.' +KW_PLAYING = ' playing ' +KW_PLAYS = ' plays ' +KW_REPLACING = ' replacing ' +KW_RETURNING = ' returning ' +KW_REVEALING = ' revealing ' +KW_REVEALS = ' reveals ' +KW_REVEALS_A = ' reveals a' +KW_TOKEN = ' token.' +KW_TO_THE_SUPPLY = ' to the supply' +KW_TRASHES = ' trashes ' +KW_TRASHES_IT = 'trashes it.' +KW_TRASHING = ' trashing ' +KW_TURNS_UP_A = ' turns up a' +KW_WHICH_IS_WORTH = ' which is worth +$' +KW_WITH_A = ' with a' +KW_WISHING = ' wishing ' +KW_INSTEAD = ' instead.' + + +KEYWORDS = [locals()[w] for w in dict(locals()) if w.startswith('KW_')] + +def capture_cards(line): + """ Given a line of text from isotropic, extract the cards. + + line: string like 'Rob plays a <span class=card-none>Minion</span>.' + returns: list of the card objects, eg, [Minion] + """ + def _as_int_or_1(string_val): + try: + return int(string_val) + except ValueError: + return 1 + + cards = [] + card_sections = SPLIT_COMMA_AND_RE.split(line) + for sect in card_sections: + split_at_span = sect.split('<span') + if not split_at_span: + continue + first = split_at_span[0] + split_first = first.split() + if not split_first: + mult = 1 + else: + mult = _as_int_or_1(split_first[-1]) + + for subsect in split_at_span: + start_of_end_span = subsect.find('</span') + if start_of_end_span == -1: + continue + end_of_begin_span = subsect.rfind('>', 0, start_of_end_span) + if end_of_begin_span == -1: + continue + maybe_plural = subsect[end_of_begin_span + 1: + start_of_end_span] + if maybe_plural == '♦': + continue + try: + card = get_card(maybe_plural) + except KeyError, exception: + raise parse_common.ParsingError('Failed to find card in line: %s' + % line) + cards.extend([card] * mult) + return cards + +def associate_game_with_norm_names(game_dict): + """ Fill players field in game_dict with list of normed player names.""" + game_dict[PLAYERS] = [] + for player_deck in game_dict[DECKS]: + normed_name = name_merger.norm_name(player_deck[NAME]) + game_dict[PLAYERS].append(normed_name) + +ONLY_NUMBERS_RE = re.compile('^\d+$') + +def validate_names(decks): + """ Raise an exception for names that might screw up the parsing. + This should happen in less than 1% of real games, but it's just easier + to punt on annoying inputs that to make sure we get them right. + + Different keywords for goko and iso, naturally.""" + used_names = set() + for deck in decks: + name = deck[NAME] + if name in used_names: + raise parse_common.BogusGameError('Duplicate name %s' % name) + used_names.add(name) + + if name in ['a', 'and', 'turn']: + raise parse_common.BogusGameError("annoying name " + name) + if '---' in name: + raise parse_common.BogusGameError('--- in name ' + name) + + if ONLY_NUMBERS_RE.match(name): + raise parse_common.BogusGameError('name contains only numbers ' + name) + + if name[0] == '.': + raise parse_common.BogusGameError('name %s starts with period' % name) + for kword in KEYWORDS: + if kword.lstrip() in name or kword.rstrip() in name: + raise parse_common.BogusGameError('name %s contains keyword %s' % + (name, kword)) + + if len(used_names) != len(decks): + raise parse_common.BogusGameError('not everyone took a turn?') + if len(decks) <= 1: + raise parse_common.BogusGameError('only one player') + +def canonicalize_names(turns_str, player_names): + """ Return a new string in which all player names are replaced by + player0, player1, ...""" + player_ind_name_pairs = list(enumerate(player_names)) + # Replace longer names first, short names might contain the longer ones. + player_ind_name_pairs.sort(key = lambda ind_name_pair: + -len(ind_name_pair[1])) + for idx, player in player_ind_name_pairs: + # This is complicated (matching extra stuff to the left and right + # of name rather than straight string replace) so that we + # can allow for annoying names like 'd' that occur as + # substrings of regular text. + match_player_name = re.compile( + '(^|[ \(])' + # start with newline, space, or open paren + re.escape(player) + # followed by player name + "([ '\)])", # ending with space or ' or close paren + re.MULTILINE) + def _replace_name_by_label(match): + """ keep surrounding delims, replace player name with playerX""" + return match.group(1) + parse_common._player_label(idx) + match.group(2) + turns_str = match_player_name.sub(_replace_name_by_label, turns_str) + + return turns_str + +def parse_header(header_str): + """ Parse the isotropic header string. + + Return a dictionary with game_end, supply, and resigned fields, + like parse_game. + """ + sections = [s for s in header_str.replace(' \n', '\n').split('\n\n') if s] + end_str, supply_str = sections + assert 'gone' in end_str or 'resigned' in end_str, "Not gone or resigned" + if 'gone' in end_str: + resigned = False + gone = capture_cards(end_str.split('\n')[1]) + else: + resigned = True + gone = [] + supply = indexes(capture_cards(supply_str)) + return {GAME_END: indexes(gone), SUPPLY: supply, RESIGNED: resigned} + +PLACEMENT_RE = re.compile('#\d (.*)') +POINTS_RE = re.compile(': (-*\d+) point(s?)(\s|(' + re.escape('</b>') + '))') + +def make_start_decks(names): + """ + Given list of players, make 7xCopper 3xEstate starting decks for each. + New code for iso logs to match information that is available on goko. + Shelters were (almost) never present on iso, so 7C3E is the start deck. + """ + start_decks = [] + for name in names: + start_decks.append({NAME:name, START_DECK: indexes([dominioncards.Copper]*7+[dominioncards.Estate]*3) }) + return start_decks + + +def parse_deck(deck_str): + """ Given an isotropic deck string, return a dictionary containing the + player names + + deck_str: starts with placement and name, ends with last card in deck. + returns dictionary containing the following fields + name: + vp_tokens: number of vp tokens. + deck: Dictionary keyed card name who value is the card frequency. + resigned: True iff this player resigned + """ + try: + name_vp_list, _opening, deck_contents = deck_str.split('\n') + except ValueError, e: + raise parse_common,ParsingError('Failed to split the deck') + vp_tokens = 0 + #print 'vp', name_vp_list + + matched_points = POINTS_RE.search(name_vp_list) + + if matched_points: + point_loc = matched_points.end() + resigned, points = False, int(matched_points.group(1)) + name_points, vp_list = (name_vp_list[:point_loc], + name_vp_list[point_loc + 1:]) + else: + resign_loc = name_vp_list.find('resigned') + assert resign_loc != -1, 'could not find resign in %s' % name_vp_list + resigned, points = True, -100 + name_points, vp_list = (name_vp_list[:resign_loc], + name_vp_list[resign_loc + 1:]) + + last_colon_in_name_points = name_points.rfind(':') + name, _points_or_resign = (name_points[:last_colon_in_name_points], + name_points[last_colon_in_name_points + 1:]) + + def cleanup_name(name): + """ Given a name and placement, get rid of the bold tags and """ + htmlless_name = name.replace('<b>', '').replace('</b>', '') + placement_match = PLACEMENT_RE.match(htmlless_name) + if placement_match: + return placement_match.group(1) + return htmlless_name + + name = cleanup_name(name) + + for chunk in vp_list.split(','): + diamond_loc = chunk.find(u'â–¼') + if diamond_loc != -1: + start_point_loc = max(chunk.rfind('(', 0, diamond_loc - 1), + chunk.rfind(' ', 0, diamond_loc - 1)) + vp_tokens = int(chunk[start_point_loc + 1:diamond_loc - 1]) + + card_list_chunks = deck_contents[ + deck_contents.find(']') + 1:].replace(',', ' ') + card_blobs = [x for x in card_list_chunks.split('</span>') if + '<span' in x] + deck_comp = {} + for card_blob in card_blobs: + right_bracket_index = card_blob.find('>') + card_name = card_blob[right_bracket_index + 1:] + try: + card = get_card(card_name) + except KeyError, exception: + raise parse_common.ParsingError("Failed to get card. chunk: '%s', card_name: '%s', card_blob: '%s'" % \ + (chunk, card_name, card_blob[right_bracket_index - 10:])) + card_quant = int(card_blob.split()[0]) + deck_comp[str(card.index)] = card_quant + #FIXME: deck_comp is undefined if there's no vp_list + return {NAME: name, POINTS: points, RESIGNED: resigned, + DECK: deck_comp, VP_TOKENS: vp_tokens} + +def parse_decks(decks_blob): + """ Parse and return a list of decks""" + deck_blobs = [s for s in decks_blob.split('\n\n') if s] + return [parse_deck(deck_blob) for deck_blob in deck_blobs] + +VETO_RE = re.compile('(.*) vetoes (.*)\.') +def parse_vetoes(game_dict, veto_str): + matches = VETO_RE.findall(veto_str) + v_dict = {} + if matches: + for (player, card) in matches: + # Use the player index number (as a string) as the + # dictionary key, instead of the player's name, because + # some names contain periods, which are invalid keys for + # structures stored in MongoDB. + player = name_merger.norm_name(player) + try: + v_dict[str(game_dict[PLAYERS].index(player))] = int(capture_cards(card)[0].index) + except ValueError, ve: + raise parse_common.ParsingError("Failed to handle veto: %s" % ve) + + return v_dict + +def associate_turns_with_owner(game_dict, turns): + """ Move each turn in turns to be a member of the corresponding player + in game_dict. + + Remove the names from the turn, since it is redundant with the name + on the player level dict.""" + name_to_owner = {} + for idx, deck in enumerate(game_dict[DECKS]): + deck[NAME] = name_merger.norm_name(deck[NAME]) + name_to_owner[deck[NAME]] = deck + deck[TURNS] = [] + + order_ct = 0 + + for idx, turn in enumerate(turns): + owner = name_to_owner[name_merger.norm_name(turn[NAME])] + owner[TURNS].append(turn) + if not ORDER in owner: + owner[ORDER] = idx + 1 + order_ct += 1 + del turn[NAME] + + if order_ct != len(game_dict[DECKS]): + raise parse_common.BogusGameError('Did not find turns for all players') + +def name_and_rest(line, term): + """ Split line about term, return (before, after including term). """ + start_of_term = line.find(term) + assert start_of_term != -1, "start_of_term is -1" + + def _strip_leading(val, dead_chars): + for idx, char in enumerate(val): + if char not in dead_chars: + return val[idx:] + return '' + + name = _strip_leading(line[:start_of_term], ' .').strip() + return name, line[start_of_term + len(term):] + + +class PlayerTracker(object): + ''' The player tracker is used to keep track of the active player being + modified by the gain and trashes actions in a sequence of isotropic + game lines. ''' + + def __init__(self): + self.player_stack = [None] + self.orig_player = None + + def get_active_player(self, line): + ''' Feed the next line to the tracker, it returns the active player.''' + mentioned_players = self._get_player_inds(line) + + indent_level = line.count('...') + if indent_level >= len(self.player_stack): + self.player_stack.append(self.player_stack[-1]) + while len(self.player_stack) > indent_level + 1: + self.player_stack.pop() + + if len(mentioned_players) > 0: + self.player_stack[-1] = mentioned_players[-1] + if self.orig_player is None: + self.orig_player = mentioned_players[-1] + + return self.player_stack[-1] + + def current_player(self): + ''' Return the player whose turn it is. + This requires at least one call to get_active_player() first. ''' + return self.orig_player + + def _get_player_inds(self, line): + '''return list of player indicies in given line. + eg, line "player1 trashes player2's ..." -> [1, 2] + ''' + return map(int, parse_common.PLAYER_IND_RE.findall(line)) + + +def parse_turn_header(turn_header_line, names_list = None): + """ Given a turn header line return a dictionary containing + information about the turn. All turns have a player name in the key + 'name'. + + Normal turns have a 'turn_no'. + Possession turns have a 'pname' for the name of the possessor. + Outpost turns have the 'outpost' value set to true.""" + + # This could be done with a single really complicated regexp, but I kept + # screwing up the regexp when I tried to join them, and so here we + # have some code to match against the three different cases. + + def _get_name(match, name_key = 'name'): + if names_list is None: + return match.group(name_key) + return parse_common._get_real_name(match.group(name_key), names_list) + + parsed_header = {} + norm_match = NORM_TURN_HEADER_RE.search(turn_header_line) + if norm_match: + parsed_header['turn_no'] = int(norm_match.group('turn_no')) + parsed_header['name'] = _get_name(norm_match) + return parsed_header + + poss_match = POSS_TURN_HEADER_RE.search(turn_header_line) + if poss_match: + parsed_header['name'] = _get_name(poss_match) + parsed_header['pname'] = _get_name(poss_match, 'pname') + return parsed_header + + out_match = OUTPOST_TURN_HEADER_RE.search(turn_header_line) + if out_match: + parsed_header['name'] = _get_name(out_match) + parsed_header['outpost'] = True + return parsed_header + + raise parse_common.ParseTurnHeaderError(turn_header_line) + + +def parse_turn(turn_blob, names_list): + """ Parse the information from a given turn. + + Return a dict containing the following fields. If any of the fields have + a value that evaluates to False, do not keep it. + + name: player name. + number: 1 indexed turn number. + plays: List of cards played. + buys: List of cards bought. + gains: List of cards gained. + trashes: List of cards trashed. + returns: List of cards returned. + ps_tokens: Number of pirate ship tokens gained. + vp_tokens: Number of victory point tokens gained. + money: Amount of money available during entire buy phase. + opp: Dict keyed by opponent index in names_list, containing dicts with trashes/gains. + """ + lines = turn_blob.strip().split('\n') + header = lines[0] + parsed_header = parse_turn_header(header, names_list) + + poss, outpost = False, False + + if 'pname' in parsed_header: + possessee_name = parsed_header['name'] + possessee_index = names_list.index(possessee_name) + poss = True + if 'outpost' in parsed_header: + outpost = True + + ret = {GAINS: [], TRASHES: [], BUYS: []} + plays = [] + returns = [] + turn_money = 0 + vp_tokens = 0 + ps_tokens = 0 + opp_turn_info = collections.defaultdict(lambda: {GAINS: [], + TRASHES: [], + BUYS: []}) + tracker = PlayerTracker() + + for line_idx, line in enumerate(lines): + active_player = tracker.get_active_player(line) + if active_player == tracker.current_player(): + targ_obj = ret + else: + # Stop using the player's name here, as it is used as a + # key name in a dict, which can't be stored in MongoDB if + # it contains a dot ('.') or starts with a dollar + # sign. Instead, use the player index number so we can + # extract the name later. + # + # targ_obj = opp_turn_info[names_list[active_player]] + targ_obj = opp_turn_info[str(active_player)] + + has_trashing = KW_TRASHING in line + has_trashes = KW_TRASHES in line + has_gaining = KW_GAINING in line + orig_buys_len = len(targ_obj.get(BUYS, [])) + orig_gains_len = len(targ_obj.get(GAINS, [])) + + did_trading_post_gain = False + + if has_trashes: + if has_gaining: + # Trading post turn, first trashes, then gaining + gain_start = line.find(KW_GAINING) + targ_obj[TRASHES].extend(capture_cards(line[:gain_start])) + targ_obj[GAINS].extend(capture_cards(line[gain_start:])) + did_trading_post_gain = True + else: + targ_obj[TRASHES].extend(capture_cards(line)) + if KW_WITH_A in line: + if KW_REPLACING in line: + new_gained_portion = line[line.find(KW_WITH_A):] + targ_obj[GAINS].extend(capture_cards(new_gained_portion)) + if KW_PLAYS in line or KW_PLAYING in line: + plays.extend(capture_cards(line)) + if has_gaining and not did_trading_post_gain: + if KW_ANOTHER_ONE in line: # mints a gold gaining another one + targ_obj[GAINS].extend(capture_cards(line)) + else: + # gaining always associated with current player? + targ_obj[GAINS].extend( + capture_cards(line[line.find(KW_GAINING):])) + if KW_BUYS in line: + targ_obj[BUYS].extend(capture_cards(line)) + if KW_GAINS_THE in line: + targ_obj[GAINS].extend(capture_cards(line)) + if has_trashing: + if KW_REVEALS in lines[line_idx - 1] and not KW_DRAWS in line: + targ_obj[TRASHES].extend(capture_cards(lines[line_idx - 1])) + if KW_REVEALING in line or KW_REVEALS in line: + # reveals watchtower trashing ... + # noble brigand reveals xx, yy and trashes yy + trashed = capture_cards(line[line.find(KW_TRASHING):]) + targ_obj[TRASHES].extend(trashed) + else: + rest = line + if KW_GAINING in line: + rest = line[:line.find(KW_GAINING)] + targ_obj[TRASHES].extend(capture_cards(rest)) + if KW_GAINS_A in line or KW_GAMES_A in line: + if KW_TOKEN in line: + assert get_card('Pirate Ship') in capture_cards(line), 'Pirate ship not in line' + ps_tokens += 1 + else: + rest = line[max(line.find(KW_GAINS_A), line.find(KW_GAMES_A)):] + targ_obj[GAINS].extend(capture_cards(rest)) + if KW_IS_TRASHED in line: + # Saboteur after revealing cards, name not mentioned on this line. + cards = capture_cards(line) + targ_obj[TRASHES].extend(cards) + if KW_REVEALS in line: + card_revealed = capture_cards(line) + + # arg, ambassador requires looking at the next line to figure + # out how many copies were returned + if (card_revealed and line_idx + 1 < len(lines) and + KW_RETURNING in lines[line_idx + 1] and not + KW_REVEALING in lines[line_idx + 1]): + next_line = lines[line_idx + 1] + num_copies = 1 + num_copies_match = NUMBER_COPIES.search(next_line) + if num_copies_match: + num_copies = int(num_copies_match.group(1)) + returns.extend(card_revealed * num_copies) + if KW_REVEALING in line and KW_TO_THE_SUPPLY in line: + # old style ambassador line + returns.extend(capture_cards(line)) + if KW_GETTING in line or KW_GETS in line or KW_GET in line: + money_match = GETTING_MONEY_RE.search(line) + if money_match: + turn_money += int(money_match.group(1)) + if KW_WHICH_IS_WORTH in line: + worth_match = WHICH_IS_WORTH_RE.search(line) + assert bool(worth_match), line + turn_money += int(worth_match.group(1)) + if KW_FOR_MONEY in line: + worth_match = FOR_MONEY_RE.search(line) + assert bool(worth_match), line + turn_money += int(worth_match.group(1)) + if u'â–¼' in line: + vp_tokens += int(VP_TOKEN_RE.search(line).group('num')) + if KW_INSTEAD in line and not KW_WISHING in line and 'Trader' in line: + if 'buy_or_gain' in targ_obj: + targ_list = targ_obj[targ_obj['buy_or_gain']] + non_silver_ind = len(targ_list) - 1 + while (non_silver_ind >= 0 and + targ_list[non_silver_ind] == get_card('Silver')): + non_silver_ind -= 1 + # This shouldn't work when there is no non-silver, but then + # non_silver_ind == -1 if there is no non-silver, + # which magically pops the last item. <3 guido. + targ_list.pop(non_silver_ind) + else: + assert 'Ill-Gotten Gains' in plays, ( + "line %s: line\n, targ_obj: %s\n context: %s" % ( + line, str(targ_obj), + '\n'.join(lines[line_idx - 2: line_idx + 2]))) + + now_buys_len = len(targ_obj.get(BUYS, [])) + now_gains_len = len(targ_obj.get(GAINS, [])) + if now_buys_len > orig_buys_len: + targ_obj['buy_or_gain'] = BUYS + if now_gains_len > orig_gains_len: + targ_obj['buy_or_gain'] = GAINS + + assert not (now_buys_len > orig_buys_len and + now_gains_len > orig_gains_len), 'buys or gains mismatch' + + def _delete_if_exists(d, n): + if n in d: + del d[n] + + _delete_if_exists(ret, 'buy_or_gain') + + if poss: + possessee_info = opp_turn_info[str(possessee_index)] + for k in [GAINS, TRASHES]: + _delete_if_exists(possessee_info, k) + + possessee_info[VP_TOKENS], vp_tokens = vp_tokens, 0 + possessee_info[RETURNS], returns = returns, [] + ret[BUYS] = [] # buys handled by possesion gain line. + + for opp in opp_turn_info.keys(): + _delete_if_exists(opp_turn_info[opp], 'buy_or_gain') + parse_common.delete_keys_with_empty_vals(opp_turn_info[opp]) + + d = opp_turn_info[opp] + for k, v in d.iteritems(): + if k==VP_TOKENS: + d[k] = v + else: + d[k] = indexes(v) + + ret[BUYS] = indexes(ret[BUYS]) + ret[GAINS] = indexes(ret[GAINS]) + ret[TRASHES] = indexes(ret[TRASHES]) + + ret.update({NAME: names_list[tracker.current_player()], + PLAYS: indexes(plays) , RETURNS: indexes(returns), + MONEY: parse_common.count_money(plays) + turn_money, + VP_TOKENS: vp_tokens, PIRATE_TOKENS: ps_tokens, + POSSESSION: poss, OUTPOST: outpost, + OPP: dict(opp_turn_info)}) + + parse_common.delete_keys_with_empty_vals(ret) + return ret + +def split_turns(turns_blob): + """ Given a string of game play data, return a list of turn strings + separated by turn headers.""" + turn_texts = [''] + for line in turns_blob.split('\n'): + try: + parse_turn_header(line) + turn_texts.append(line + '\n') + except parse_common.ParseTurnHeaderError, e: + turn_texts[-1] += line + '\n' + return [t for t in turn_texts if t] + +def parse_turns(turns_blob, names_list): + """ Return a list of turn objects, as documented by parse_turn(). """ + return [parse_turn(text, names_list) for text in split_turns(turns_blob)] + + +def parse_game(game_str, dubious_check = False): + """ Parse game_str into game dictionary + + game_str: Entire contents of a log file. + dubious_check: If true, raise a BogusGame exception if the game is + suspicious. + + returns a dict with the following fields: + decks: A list of player decks, as documented in parse_deck(). + supply: A list of cards in the supply. + players: A list of normalized player names. + game_end: List of cards exhausted that caused the game to end. + resigned: True iff some player in the game resigned.. + start_decks: 7coppers and 3estates for all iso logs. + rating_system: 'isotropic' for all iso logs. + """ + game_str = game_str.replace('—', '---') + + try: + split_sects = SECTION_SEP.split(game_str) + header_str, decks_blob, trash_and_turns = split_sects + except ValueError, exception: + raise parse_common.ParsingError('Failed to split sections') + game_dict = parse_header(header_str) + game_dict[RATING_SYSTEM] = 'isotropic' + decks = parse_decks(decks_blob) + game_dict[DECKS] = decks + validate_names(decks) + + names_list = [d[NAME] for d in game_dict[DECKS]] + game_dict[START_DECKS] = make_start_decks(names_list) + + turns_str = trash_and_turns.split('Game log')[1] + first_index = turns_str.find('---') + veto_str = turns_str[:first_index] + turns_str = turns_str[first_index:] + turns_str = canonicalize_names(turns_str, names_list) + + turns = parse_turns(turns_str, names_list) + + associate_game_with_norm_names(game_dict) + associate_turns_with_owner(game_dict, turns) + game_dict[VETO] = parse_vetoes(game_dict, veto_str) + + return game_dict diff --git a/player_page_leaderboard_history_template.html b/player_page_leaderboard_history_template.html index 426a42a..782fc70 100644 --- a/player_page_leaderboard_history_template.html +++ b/player_page_leaderboard_history_template.html @@ -14,7 +14,6 @@ <h2>Leaderboard History</h2> var raw_history_data = $:raw_history_data; var entries = LeaderboardHistory.process_raw_history_data(raw_history_data); LeaderboardHistory.plot_graph(entries, 'Level', 'level_graph', function (entry) { return entry.skill_mean - entry.skill_error; }); - LeaderboardHistory.plot_graph(entries, '# Games', 'num_games_graph', function (entry) { return entry.eligible_games_played; }); }); </script> diff --git a/run_trueskill.py b/run_trueskill.py index f7bf8dd..ebae125 100644 --- a/run_trueskill.py +++ b/run_trueskill.py @@ -123,7 +123,7 @@ def run_trueskill_openings(args, db, log, commit_after=25000): for ind, game in enumerate( utils.progress_meter(scanner.scan(db.games, {}))): - if len(game[DECKS]) >= 2 and len(game[DECKS][1][TURNS]) >= 5: + if ( len(game[DECKS]) >= 2 and len(game[DECKS][1][TURNS]) >= 5 and (RATING_SYSTEM not in game or (RATING_SYSTEM in game and 'adventure' not in game[RATING_SYSTEM] and 'unknown' not in game[RATING_SYSTEM]))): update_skills_for_game(game, opening_skill_table) if ind == args.max_games: diff --git a/scrape.py b/scrape.py index 9c18468..a047a56 100644 --- a/scrape.py +++ b/scrape.py @@ -6,6 +6,7 @@ import datetime import glob import logging +import shutil import os import os.path import subprocess @@ -14,11 +15,15 @@ import time import urllib import utils +import re +import tarfile # if the size of the game log is less than this assume we got an error page SMALL_FILE_SIZE = 5000 -DEBUG = False +default_startdate = datetime.date(2010, 10, 15) + +DEBUG = True GOOD = 0 MISSING = 1 @@ -26,7 +31,14 @@ DOWNLOADED = 3 REPACKAGED = 4 -# make I should just adopt the isotropic format for consistency? +CR_SOURCE = 5 +GOKO_SOURCE = 6 +ISO_SOURCE = 7 + +GOKO_LOG_RE = re.compile('"(log.\w+.\w+.txt)"', re.MULTILINE) + +# Councilroom format is more similar to old isotropic format. +GOKO_FORMAT = '%(year)d%(month)02d%(day)02d/' ISOTROPIC_FORMAT = '%(year)d%(month)02d/%(day)02d/all.tar.bz2' COUNCILROOM_FORMAT = '%(year)d%(month)02d%(day)02d/%(year)d%(month)02d%(day)02d.all.tar.bz2' @@ -39,6 +51,13 @@ def IsotropicGamesCollectionUrl(cur_date): host = 'http://dominion.isotropic.org/gamelog/' return host + FormatDate(ISOTROPIC_FORMAT, cur_date) +def GokoGamesCollectionUrl(cur_date): + host = 'http://archive-dominionlogs.goko.com/' + return host+FormatDate(GOKO_FORMAT, cur_date) + +def GokoSingleGameUrl(cur_date, cur_game): + return GokoGamesCollectionUrl(cur_date)+cur_game + def CouncilroomGamesCollectionUrl(cur_date): host = 'http://councilroom.com/static/scrape_data/' return host + FormatDate(COUNCILROOM_FORMAT, cur_date) @@ -51,25 +70,71 @@ def RemoveSmallFileIfExists(fn): def download_date(str_date, cur_date, saved_games_bundle): urls_by_priority = [ - CouncilroomGamesCollectionUrl(cur_date), - IsotropicGamesCollectionUrl(cur_date), + (CR_SOURCE, CouncilroomGamesCollectionUrl(cur_date)), + (GOKO_SOURCE, GokoGamesCollectionUrl(cur_date)), + (ISO_SOURCE, IsotropicGamesCollectionUrl(cur_date)) ] - for url in urls_by_priority: + for (source, url) in urls_by_priority: if DEBUG: print 'getting', saved_games_bundle, 'at', url - contents = urllib.urlopen(url).read() + try: + contents = urllib.urlopen(url).read() + except IOError: + contents = "0" + if len(contents) > SMALL_FILE_SIZE: if DEBUG: print 'yay, success from', url, 'no more requests for', \ str_date, 'needed' - open(saved_games_bundle, 'w').write(contents) + if source == CR_SOURCE or source == ISO_SOURCE: + open(saved_games_bundle, 'w').write(contents) + elif source == GOKO_SOURCE: + games = re.findall(GOKO_LOG_RE, contents) + bundle_goko_games(cur_date, games, saved_games_bundle) return True elif DEBUG: print 'request to', url, 'failed to find large file' return False +def bundle_goko_games(cur_date, games, saved_games_bundle): + progressfile = tempfile.mktemp() + bundle = tarfile.open(progressfile,'w:bz2') + + orig_dir = os.getcwd() + directory_name = tempfile.mkdtemp() + os.chdir(directory_name) + + if DEBUG: + print len(games), " games to download..." + for cur_game in games: + url = GokoSingleGameUrl(cur_date, cur_game) + retries_remaining = 3 + while retries_remaining > 0: + try: + game_text = urllib.urlopen(url).read() + if '<title>403 Forbidden' not in game_text and '<title>404 Not Found' not in game_text: + game = open(cur_game,'a') + game.write(game_text) + game.close() + + bundle.add(cur_game) + break + else: + retries_remaining = retries_remaining - 1 + if(DEBUG): + print "Failed to download game: ", cur_game + + except: + retries_remaining = retries_remaining - 1 + if(DEBUG): + print "Failed to download game: ", cur_game + bundle.close(); + os.chdir(orig_dir) + os.rename(progressfile, saved_games_bundle) + shutil.rmtree(directory_name) + def unzip_date(directory, filename): os.chdir(directory) cmd = 'tar -xjvf %s >/dev/null 2>/dev/null'%filename @@ -95,12 +160,12 @@ def repackage_archive(filename): Game archives are distributed as .tar.bz2 (a bzip2-compressed tar archive). For speed of serving, we repackage them as .bz2.tar (a - tar archive of bzip2-compressed HTML files). The .bz2.tar file is + tar archive of bzip2-compressed HTML or text files). The .bz2.tar file is a good bit larger, but an individual file can be extracted, decompressed, and served to a client in tenths of a second instead of tens of seconds. At the same time, storage space is still dramatically smaller than a raw folder of uncompressed (or even - compressed) HTML files. + compressed) HTML or text files. """ orig_dir = os.getcwd() @@ -108,6 +173,7 @@ def repackage_archive(filename): # Extract the existing file into a temporary folder directory_name = tempfile.mkdtemp() source_filename = os.path.abspath(filename) + try: subprocess.check_call(["tar", "--auto-compress", "-C", directory_name, "-xf", source_filename]) @@ -116,36 +182,29 @@ def repackage_archive(filename): logging.warning("Unexpected return from tar >>{msg}<<".format(msg=e.output)) raise - # Compress all the game*.html files + # Compress all the game*.html log*txt files. + # Individually, so the argument list doesn't explode from huge numbers of + # goko logs. os.chdir(directory_name) - game_files = glob.glob("game*.html") - if len(game_files) > 0: + game_files = glob.glob("game*.html")+glob.glob("log*.txt") + dest_filename = repackage_filename(source_filename) + + repackaged_archive = tarfile.open(dest_filename,'w') + + for cur_game in game_files: try: - subprocess.check_call(["bzip2"] + game_files) + subprocess.check_call(["bzip2", cur_game]) except subprocess.CalledProcessError, e: #(retcode, cmd, output=output) # Not handling this yet, just re-raise - logging.warning("Unexpected return from bzip >>{msg}<<".format(msg=e.output)) + logging.warning("Unexpected return from bzip or tar >>{msg}<<".format(msg=e.output)) + os.chdir(orig_dir) + shutil.rmtree(directory_name) raise - else: - os.chdir(orig_dir) - os.removedirs(directory_name) - return + repackaged_archive.add(cur_game+'.bz2') - # Tar the results back to the directory where the original file - # came from - dest_filename = repackage_filename(source_filename) - game_files = glob.glob("game*.html.bz2") - try: - subprocess.check_call(["tar", "--remove", "-cf", dest_filename+".part"] + game_files) - except subprocess.CalledProcessError, e: #(retcode, cmd, output=output) - # Not handling this yet, just re-raise - logging.warning("Unexpected return from tar >>{msg}<<".format(msg=e.output)) - raise - - os.rename(dest_filename + ".part", dest_filename) + repackaged_archive.close(); os.chdir(orig_dir) - os.removedirs(directory_name) - + shutil.rmtree(directory_name) def scrape_date(str_date, cur_date, passive=False): #directory = str_date @@ -163,11 +222,10 @@ def scrape_date(str_date, cur_date, passive=False): if passive: return_code = MISSING - elif not download_date(str_date, cur_date, saved_games_bundle): return_code = ERROR - - return_code = DOWNLOADED + else: + return_code = DOWNLOADED # Repackage an existing file, if found if utils.at_least_as_big_as(saved_games_bundle, SMALL_FILE_SIZE) and \ @@ -185,9 +243,11 @@ def scrape_games(): args = parser.parse_args() last_month = '' + + yesterday = datetime.date.today() - datetime.timedelta(days=1) + #Goko updates logs in real time; wait a day so the list is finalized. - for cur_date in utils.daterange(datetime.date(2010, 10, 15), - datetime.date.today()): + for cur_date in utils.daterange(default_startdate, yesterday, reverse=True): str_date = time.strftime("%Y%m%d", cur_date.timetuple()) if not utils.includes_day(args, str_date): if DEBUG: diff --git a/scrape_leaderboard.py b/scrape_leaderboard.py index c752b07..779ddb4 100644 --- a/scrape_leaderboard.py +++ b/scrape_leaderboard.py @@ -38,21 +38,6 @@ def get_date_of_last_cached_leaderboard(): # return the day before the first day on http://bggdl.square7.ch/leaderboard/ return datetime.date(2011, 3, 10) -def get_date_of_current_isotropic_leaderboard(): - try: - connection = httplib.HTTPConnection('dominion.isotropic.org', timeout=30) - connection.request('HEAD', '/leaderboard/') - response = connection.getresponse() - headers = dict(response.getheaders()) - connection.close() - except socket.error: - return - - if response.status == 200: - # just after midnight Pacific time, GMT will have the same calendar date as Pacific time - # so, we can ignore the hour, minute, and second - return date_from_http_header_time(headers['last-modified']) - def save_file(date, data, is_gzipped): if is_gzipped: f = gzip.GzipFile(fileobj=StringIO.StringIO(data)) @@ -89,15 +74,18 @@ def scrape_leaderboard(date, host, url, is_gzipped, assert_same_date): return response.status -def scrape_leaderboard_from_isotropic(date): - return scrape_leaderboard(date, 'dominion.isotropic.org', '/leaderboard/', True, True) - def scrape_leaderboard_from_councilroom(date): return scrape_leaderboard(date, 'councilroom.com', '/static/leaderboard/' + str(date) + '.html.bz2', False, False) def scrape_leaderboard_from_bggdl(date): return scrape_leaderboard(date, 'bggdl.square7.ch', '/leaderboard/leaderboard-' + str(date) + '.html', True, False) +def scrape_leaderboard_from_goko(date): + if (datetime.date.today() != date): + return None + else: + return scrape_leaderboard(date, 'www.goko.com', '/games/Dominion/leaders', False, False) + def run_scrape_function_with_retries(scrape_function, date): num_attempts = 0 @@ -130,26 +118,22 @@ def main(): date_of_last_cached_leaderboard = get_date_of_last_cached_leaderboard() log.info('date of the last cached leaderboard is %s', date_of_last_cached_leaderboard) - date_of_current_isotropic_leaderboard = get_date_of_current_isotropic_leaderboard() - if date_of_current_isotropic_leaderboard is None: - log.warning('could not determine the date of the current isotropic leaderboard, so please try again later') - return - log.info('date of the current isotropic leaderboard is %s', date_of_current_isotropic_leaderboard) + date_of_last_goko_leaderboard = datetime.date.today() one_day_delta = datetime.timedelta(1) date = date_of_last_cached_leaderboard + one_day_delta - while date <= date_of_current_isotropic_leaderboard: + while date <= datetime.date.today(): log.info('Processing %s', date) - if date == date_of_current_isotropic_leaderboard: - log.info('scraping from isotropic') - status = run_scrape_function_with_retries(scrape_leaderboard_from_isotropic, date) + if date == datetime.date.today(): + log.info('scraping from goko') + status = run_scrape_function_with_retries(scrape_leaderboard_from_goko, date) else: log.info('scraping from councilroom') status = run_scrape_function_with_retries(scrape_leaderboard_from_councilroom, date) - if status != 200: + if status != 200 and date <= datetime.date(2013,01,01): log.info('scraping from bggdl') status = run_scrape_function_with_retries(scrape_leaderboard_from_bggdl, date) diff --git a/static/card_list.js b/static/card_list.js index 5f5145c..da70dd3 100644 --- a/static/card_list.js +++ b/static/card_list.js @@ -1 +1 @@ -[{"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Adventurer", "Index": "0", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "6", "Victory": "0", "Buys": "0", "Cards": "2", "Abbreviation": "Adv", "Trash": "0", "Plural": "Adventurers", "Expansion": "Dominion"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Alchemist", "Index": "1", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "P3", "Victory": "0", "Buys": "0", "Cards": "2", "Abbreviation": "Alc", "Trash": "0", "Plural": "Alchemists", "Expansion": "Alchemy"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Ambassador", "Index": "2", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "1", "Cost": "3", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Amb", "Trash": "0", "Plural": "Ambassadors", "Expansion": "Seaside"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Apothecary", "Index": "3", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "P2", "Victory": "0", "Buys": "0", "Cards": "1", "Abbreviation": "Apoth", "Trash": "0", "Plural": "Apothecaries", "Expansion": "Alchemy"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Apprentice", "Index": "4", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "App", "Trash": "1", "Plural": "Apprentices", "Expansion": "Alchemy"}, {"Reaction": "0", "Coins": "?", "Duration": "0", "Singular": "Archivist", "Index": "5", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "?", "Abbreviation": "Arc", "Trash": "0", "Plural": "Archivists", "Expansion": "Fan"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Bag of Gold", "Index": "6", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "*0", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "BoG", "Trash": "0", "Plural": "Bags of Gold", "Expansion": "Cornucopia"}, {"Reaction": "0", "Coins": "?", "Duration": "0", "Singular": "Bank", "Index": "7", "Treasure": "1", "Actions": "0", "VP": "0", "Action": "0", "Attack": "0", "Cost": "7", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Bank", "Trash": "0", "Plural": "Banks", "Expansion": "Prosperity"}, {"Reaction": "0", "Coins": "4", "Duration": "0", "Singular": "Baron", "Index": "8", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "1", "Cards": "0", "Abbreviation": "Bron", "Trash": "0", "Plural": "Barons", "Expansion": "Intrigue"}, {"Reaction": "0", "Coins": "1", "Duration": "0", "Singular": "Bazaar", "Index": "9", "Treasure": "0", "Actions": "2", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "1", "Abbreviation": "Baz", "Trash": "0", "Plural": "Bazaars", "Expansion": "Seaside"}, {"Reaction": "0", "Coins": "1", "Duration": "0", "Singular": "Bishop", "Index": "10", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Bish", "Trash": "1", "Plural": "Bishops", "Expansion": "Prosperity"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Black Market", "Index": "11", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "3", "Victory": "0", "Buys": "1", "Cards": "0", "Abbreviation": "BMark", "Trash": "0", "Plural": "Black Markets", "Expansion": "Promotional"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Border Village", "Index": "12", "Treasure": "0", "Actions": "2", "VP": "0", "Action": "1", "Attack": "0", "Cost": "6", "Victory": "0", "Buys": "0", "Cards": "1", "Abbreviation": "Bord", "Trash": "0", "Plural": "Border Villages", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "1", "Duration": "0", "Singular": "Bridge", "Index": "13", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "1", "Cards": "0", "Abbreviation": "Bri", "Trash": "0", "Plural": "Bridges", "Expansion": "Intrigue"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Bureaucrat", "Index": "14", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "1", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Bur", "Trash": "0", "Plural": "Bureaucrats", "Expansion": "Dominion"}, {"Reaction": "0", "Coins": "3", "Duration": "0", "Singular": "Cache", "Index": "15", "Treasure": "1", "Actions": "0", "VP": "0", "Action": "0", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Cache", "Trash": "0", "Plural": "Caches", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "0", "Duration": "1", "Singular": "Caravan", "Index": "16", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "1", "Abbreviation": "Cvan", "Trash": "0", "Plural": "Caravans", "Expansion": "Seaside"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Cartographer", "Index": "17", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "1", "Abbreviation": "Cart", "Trash": "0", "Plural": "Cartographers", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Cellar", "Index": "18", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "2", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Cel", "Trash": "0", "Plural": "Cellars", "Expansion": "Dominion"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Chancellor", "Index": "19", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "3", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Chan", "Trash": "0", "Plural": "Chancellors", "Expansion": "Dominion"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Chapel", "Index": "20", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "2", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Chap", "Trash": "4", "Plural": "Chapels", "Expansion": "Dominion"}, {"Reaction": "0", "Coins": "1", "Duration": "0", "Singular": "City", "Index": "21", "Treasure": "0", "Actions": "2", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "1", "Cards": "1", "Abbreviation": "City", "Trash": "0", "Plural": "Cities", "Expansion": "Prosperity"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Colony", "Index": "22", "Treasure": "0", "Actions": "0", "VP": "10", "Action": "0", "Attack": "0", "Cost": "11", "Victory": "1", "Buys": "0", "Cards": "0", "Abbreviation": "Col", "Trash": "0", "Plural": "Colonies", "Expansion": "Prosperity"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Conspirator", "Index": "23", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Cons", "Trash": "0", "Plural": "Conspirators", "Expansion": "Intrigue"}, {"Reaction": "0", "Coins": "3", "Duration": "0", "Singular": "Contraband", "Index": "24", "Treasure": "1", "Actions": "0", "VP": "0", "Action": "0", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "1", "Cards": "0", "Abbreviation": "Cband", "Trash": "0", "Plural": "Contrabands", "Expansion": "Prosperity"}, {"Reaction": "0", "Coins": "1", "Duration": "0", "Singular": "Copper", "Index": "25", "Treasure": "1", "Actions": "0", "VP": "0", "Action": "0", "Attack": "0", "Cost": "0", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Cop", "Trash": "0", "Plural": "Coppers", "Expansion": "Common"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Coppersmith", "Index": "26", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Csmith", "Trash": "0", "Plural": "Coppersmiths", "Expansion": "Intrigue"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Council Room", "Index": "27", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "1", "Cards": "4", "Abbreviation": "CR", "Trash": "0", "Plural": "Council Rooms", "Expansion": "Dominion"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Counting House", "Index": "28", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "CH", "Trash": "0", "Plural": "Counting Houses", "Expansion": "Prosperity"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Courtyard", "Index": "29", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "2", "Victory": "0", "Buys": "0", "Cards": "2", "Abbreviation": "Cyard", "Trash": "0", "Plural": "Courtyards", "Expansion": "Intrigue"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Crossroads", "Index": "30", "Treasure": "0", "Actions": "?", "VP": "0", "Action": "1", "Attack": "0", "Cost": "2", "Victory": "0", "Buys": "0", "Cards": "?", "Abbreviation": "Croads", "Trash": "0", "Plural": "Crossroads", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Curse", "Index": "31", "Treasure": "0", "Actions": "0", "VP": "-1", "Action": "0", "Attack": "0", "Cost": "0", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Curse", "Trash": "0", "Plural": "Curses", "Expansion": "Common"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Cutpurse", "Index": "32", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "1", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Cut", "Trash": "0", "Plural": "Cutpurses", "Expansion": "Seaside"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Develop", "Index": "33", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "3", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Dev", "Trash": "0", "Plural": "Develops", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "?", "Duration": "0", "Singular": "Diadem", "Index": "34", "Treasure": "1", "Actions": "0", "VP": "0", "Action": "0", "Attack": "0", "Cost": "*0", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Dia", "Trash": "0", "Plural": "Diadems", "Expansion": "Cornucopia"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Duchy", "Index": "35", "Treasure": "0", "Actions": "0", "VP": "3", "Action": "0", "Attack": "0", "Cost": "5", "Victory": "1", "Buys": "0", "Cards": "0", "Abbreviation": "Duchy", "Trash": "0", "Plural": "Duchies", "Expansion": "Common"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Duke", "Index": "36", "Treasure": "0", "Actions": "0", "VP": "?", "Action": "0", "Attack": "0", "Cost": "5", "Victory": "1", "Buys": "0", "Cards": "0", "Abbreviation": "Duke", "Trash": "0", "Plural": "Dukes", "Expansion": "Intrigue"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Duchess", "Index": "37", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "2", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Dss", "Trash": "0", "Plural": "Duchesses", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Embargo", "Index": "38", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "2", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Ebarg", "Trash": "1", "Plural": "Embargoes", "Expansion": "Seaside"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Embassy", "Index": "39", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "5", "Abbreviation": "Ebass", "Trash": "0", "Plural": "Embassies", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Envoy", "Index": "40", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "4", "Abbreviation": "Env", "Trash": "0", "Plural": "Envoys", "Expansion": "Promotional"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Estate", "Index": "41", "Treasure": "0", "Actions": "0", "VP": "1", "Action": "0", "Attack": "0", "Cost": "2", "Victory": "1", "Buys": "0", "Cards": "0", "Abbreviation": "Est", "Trash": "0", "Plural": "Estates", "Expansion": "Common"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Expand", "Index": "42", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "7", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Epand", "Trash": "1", "Plural": "Expands", "Expansion": "Prosperity"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Explorer", "Index": "43", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Expl", "Trash": "0", "Plural": "Explorers", "Expansion": "Seaside"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Fairgrounds", "Index": "44", "Treasure": "0", "Actions": "0", "VP": "?", "Action": "0", "Attack": "0", "Cost": "6", "Victory": "1", "Buys": "0", "Cards": "0", "Abbreviation": "Fair", "Trash": "0", "Plural": "Fairgrounds", "Expansion": "Cornucopia"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Familiar", "Index": "45", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "1", "Cost": "P3", "Victory": "0", "Buys": "0", "Cards": "1", "Abbreviation": "Fam", "Trash": "0", "Plural": "Familiars", "Expansion": "Alchemy"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Farming Village", "Index": "46", "Treasure": "0", "Actions": "2", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "1", "Abbreviation": "FarmV", "Trash": "0", "Plural": "Farming Villages", "Expansion": "Cornucopia"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Farmland", "Index": "47", "Treasure": "0", "Actions": "0", "VP": "2", "Action": "0", "Attack": "0", "Cost": "6", "Victory": "1", "Buys": "0", "Cards": "0", "Abbreviation": "Fland", "Trash": "0", "Plural": "Farmlands", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Feast", "Index": "48", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Feast", "Trash": "1", "Plural": "Feasts", "Expansion": "Dominion"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Festival", "Index": "49", "Treasure": "0", "Actions": "2", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "1", "Cards": "0", "Abbreviation": "Fest", "Trash": "0", "Plural": "Festivals", "Expansion": "Dominion"}, {"Reaction": "0", "Coins": "1", "Duration": "1", "Singular": "Fishing Village", "Index": "50", "Treasure": "0", "Actions": "2", "VP": "0", "Action": "1", "Attack": "0", "Cost": "3", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "FishV", "Trash": "0", "Plural": "Fishing Villages", "Expansion": "Seaside"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Followers", "Index": "51", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "*0", "Victory": "0", "Buys": "0", "Cards": "2", "Abbreviation": "Foll", "Trash": "0", "Plural": "Followers", "Expansion": "Cornucopia"}, {"Reaction": "1", "Coins": "?", "Duration": "0", "Singular": "Fool's Gold", "Index": "52", "Treasure": "1", "Actions": "0", "VP": "0", "Action": "0", "Attack": "0", "Cost": "2", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Fool", "Trash": "0", "Plural": "Fool's Golds", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Forge", "Index": "53", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "7", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Forge", "Trash": "99", "Plural": "Forges", "Expansion": "Prosperity"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Fortune Teller", "Index": "54", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "3", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "FT", "Trash": "0", "Plural": "Fortune Tellers", "Expansion": "Cornucopia"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Gardens", "Index": "55", "Treasure": "0", "Actions": "0", "VP": "?", "Action": "0", "Attack": "0", "Cost": "4", "Victory": "1", "Buys": "0", "Cards": "0", "Abbreviation": "Gard", "Trash": "0", "Plural": "Gardens", "Expansion": "Dominion"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Ghost Ship", "Index": "56", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "1", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "2", "Abbreviation": "GS", "Trash": "0", "Plural": "Ghost Ships", "Expansion": "Seaside"}, {"Reaction": "0", "Coins": "3", "Duration": "0", "Singular": "Gold", "Index": "57", "Treasure": "1", "Actions": "0", "VP": "0", "Action": "0", "Attack": "0", "Cost": "6", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Gold", "Trash": "0", "Plural": "Golds", "Expansion": "Common"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Golem", "Index": "58", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "P4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Golem", "Trash": "0", "Plural": "Golems", "Expansion": "Alchemy"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Goons", "Index": "59", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "1", "Cost": "6", "Victory": "0", "Buys": "1", "Cards": "0", "Abbreviation": "Goon", "Trash": "0", "Plural": "Goons", "Expansion": "Prosperity"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Governor", "Index": "60", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "?", "Abbreviation": "Gov", "Trash": "?", "Plural": "Governors", "Expansion": "Promotional"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Grand Market", "Index": "61", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "6", "Victory": "0", "Buys": "1", "Cards": "1", "Abbreviation": "Gmark", "Trash": "0", "Plural": "Grand Markets", "Expansion": "Prosperity"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Great Hall", "Index": "62", "Treasure": "0", "Actions": "1", "VP": "1", "Action": "1", "Attack": "0", "Cost": "3", "Victory": "1", "Buys": "0", "Cards": "1", "Abbreviation": "GH", "Trash": "0", "Plural": "Great Halls", "Expansion": "Intrigue"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Haggler", "Index": "63", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Hag", "Trash": "0", "Plural": "Hagglers", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Hamlet", "Index": "64", "Treasure": "0", "Actions": "2", "VP": "0", "Action": "1", "Attack": "0", "Cost": "2", "Victory": "0", "Buys": "1", "Cards": "1", "Abbreviation": "Ham", "Trash": "0", "Plural": "Hamlets", "Expansion": "Cornucopia"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Harem", "Index": "65", "Treasure": "1", "Actions": "0", "VP": "2", "Action": "0", "Attack": "0", "Cost": "6", "Victory": "1", "Buys": "0", "Cards": "0", "Abbreviation": "Harem", "Trash": "0", "Plural": "Harems", "Expansion": "Intrigue"}, {"Reaction": "0", "Coins": "?", "Duration": "0", "Singular": "Harvest", "Index": "66", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Hvest", "Trash": "0", "Plural": "Harvests", "Expansion": "Cornucopia"}, {"Reaction": "0", "Coins": "0", "Duration": "1", "Singular": "Haven", "Index": "67", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "2", "Victory": "0", "Buys": "0", "Cards": "1", "Abbreviation": "Hav", "Trash": "0", "Plural": "Havens", "Expansion": "Seaside"}, {"Reaction": "0", "Coins": "1", "Duration": "0", "Singular": "Herbalist", "Index": "68", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "2", "Victory": "0", "Buys": "1", "Cards": "0", "Abbreviation": "Herb", "Trash": "0", "Plural": "Herbalists", "Expansion": "Alchemy"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Highway", "Index": "69", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "1", "Abbreviation": "Hway", "Trash": "0", "Plural": "Highways", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Hoard", "Index": "70", "Treasure": "1", "Actions": "0", "VP": "0", "Action": "0", "Attack": "0", "Cost": "6", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Hoard", "Trash": "0", "Plural": "Hoards", "Expansion": "Prosperity"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Horn of Plenty", "Index": "71", "Treasure": "1", "Actions": "0", "VP": "0", "Action": "0", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "HoP", "Trash": "0", "Plural": "Horns of Plenty", "Expansion": "Cornucopia"}, {"Reaction": "1", "Coins": "3", "Duration": "0", "Singular": "Horse Traders", "Index": "72", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "1", "Cards": "-2", "Abbreviation": "HT", "Trash": "0", "Plural": "Horse Traders", "Expansion": "Cornucopia"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Hunting Party", "Index": "73", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "2", "Abbreviation": "Hunt", "Trash": "0", "Plural": "Hunting Parties", "Expansion": "Cornucopia"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Ill-Gotten Gains", "Index": "74", "Treasure": "1", "Actions": "0", "VP": "0", "Action": "0", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "IGG", "Trash": "0", "Plural": "Ill-Gotten Gains", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Inn", "Index": "75", "Treasure": "0", "Actions": "2", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "2", "Abbreviation": "Inn", "Trash": "0", "Plural": "Inns", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "1", "Duration": "0", "Singular": "Ironworks", "Index": "76", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Iron", "Trash": "0", "Plural": "Ironworks", "Expansion": "Intrigue"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Island", "Index": "77", "Treasure": "0", "Actions": "0", "VP": "2", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "1", "Buys": "0", "Cards": "0", "Abbreviation": "Isl", "Trash": "0", "Plural": "Islands", "Expansion": "Seaside"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Jack of All Trades", "Index": "78", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "JoaT", "Trash": "0", "Plural": "Jacks of All Trades", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Jester", "Index": "79", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "1", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Jest", "Trash": "0", "Plural": "Jesters", "Expansion": "Cornucopia"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "King's Court", "Index": "80", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "7", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "KC", "Trash": "0", "Plural": "King's Courts", "Expansion": "Prosperity"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Laboratory", "Index": "81", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "2", "Abbreviation": "Lab", "Trash": "0", "Plural": "Laboratories", "Expansion": "Dominion"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Library", "Index": "82", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "3", "Abbreviation": "Lib", "Trash": "0", "Plural": "Libraries", "Expansion": "Dominion"}, {"Reaction": "1", "Coins": "1", "Duration": "1", "Singular": "Lighthouse", "Index": "83", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "2", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Light", "Trash": "0", "Plural": "Lighthouses", "Expansion": "Seaside"}, {"Reaction": "0", "Coins": "1", "Duration": "0", "Singular": "Loan", "Index": "84", "Treasure": "1", "Actions": "0", "VP": "0", "Action": "0", "Attack": "0", "Cost": "3", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Loan", "Trash": "1", "Plural": "Loans", "Expansion": "Prosperity"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Lookout", "Index": "85", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "3", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Look", "Trash": "1", "Plural": "Lookouts", "Expansion": "Seaside"}, {"Reaction": "0", "Coins": "3", "Duration": "0", "Singular": "Mandarin", "Index": "86", "Treasure": "3", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Mand", "Trash": "0", "Plural": "Mandarins", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "1", "Duration": "0", "Singular": "Market", "Index": "87", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "1", "Cards": "1", "Abbreviation": "Mark", "Trash": "0", "Plural": "Markets", "Expansion": "Dominion"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Margrave", "Index": "88", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "1", "Cost": "5", "Victory": "0", "Buys": "1", "Cards": "3", "Abbreviation": "Marg", "Trash": "0", "Plural": "Margraves", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Masquerade", "Index": "89", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "3", "Victory": "0", "Buys": "0", "Cards": "2", "Abbreviation": "Masq", "Trash": "1", "Plural": "Masquerades", "Expansion": "Intrigue"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Menagerie", "Index": "90", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "3", "Victory": "0", "Buys": "", "Cards": "3", "Abbreviation": "Men", "Trash": "0", "Plural": "Menageries", "Expansion": "Cornucopia"}, {"Reaction": "0", "Coins": "2", "Duration": "1", "Singular": "Merchant Ship", "Index": "91", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "MS", "Trash": "0", "Plural": "Merchant Ships", "Expansion": "Seaside"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Militia", "Index": "92", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "1", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Mil", "Trash": "0", "Plural": "Militias", "Expansion": "Dominion"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Mine", "Index": "93", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Mine", "Trash": "1", "Plural": "Mines", "Expansion": "Dominion"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Mining Village", "Index": "94", "Treasure": "0", "Actions": "2", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "1", "Abbreviation": "MinV", "Trash": "1", "Plural": "Mining Villages", "Expansion": "Intrigue"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Minion", "Index": "95", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "1", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Mion", "Trash": "0", "Plural": "Minions", "Expansion": "Intrigue"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Mint", "Index": "96", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Mint", "Trash": "?", "Plural": "Mints", "Expansion": "Prosperity"}, {"Reaction": "1", "Coins": "0", "Duration": "0", "Singular": "Moat", "Index": "97", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "2", "Victory": "0", "Buys": "0", "Cards": "2", "Abbreviation": "Moa", "Trash": "0", "Plural": "Moats", "Expansion": "Dominion"}, {"Reaction": "0", "Coins": "3", "Duration": "0", "Singular": "Moneylender", "Index": "98", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Mlend", "Trash": "1", "Plural": "Moneylenders", "Expansion": "Dominion"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Monument", "Index": "99", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Mment", "Trash": "0", "Plural": "Monuments", "Expansion": "Prosperity"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Mountebank", "Index": "100", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "1", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Mbank", "Trash": "0", "Plural": "Mountebanks", "Expansion": "Prosperity"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Native Village", "Index": "101", "Treasure": "0", "Actions": "2", "VP": "0", "Action": "1", "Attack": "0", "Cost": "2", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "NatV", "Trash": "0", "Plural": "Native Villages", "Expansion": "Seaside"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Navigator", "Index": "102", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Nav", "Trash": "0", "Plural": "Navigators", "Expansion": "Seaside"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Nobles", "Index": "103", "Treasure": "0", "Actions": "2", "VP": "2", "Action": "1", "Attack": "0", "Cost": "6", "Victory": "1", "Buys": "0", "Cards": "3", "Abbreviation": "Nbles", "Trash": "0", "Plural": "Nobles", "Expansion": "Intrigue"}, {"Reaction": "0", "Coins": "1", "Duration": "0", "Singular": "Noble Brigand", "Index": "104", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "1", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "NBri", "Trash": "0", "Plural": "Noble Brigands", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Nomad Camp", "Index": "105", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "1", "Cards": "0", "Abbreviation": "NCamp", "Trash": "0", "Plural": "Nomad Camps", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "1", "Duration": "0", "Singular": "Oasis", "Index": "106", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "3", "Victory": "0", "Buys": "0", "Cards": "1", "Abbreviation": "Oasis", "Trash": "0", "Plural": "Oases", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Oracle", "Index": "107", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "1", "Cost": "3", "Victory": "0", "Buys": "0", "Cards": "2", "Abbreviation": "Ora", "Trash": "0", "Plural": "Oracles", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "0", "Duration": "1", "Singular": "Outpost", "Index": "108", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Out", "Trash": "0", "Plural": "Outposts", "Expansion": "Seaside"}, {"Reaction": "0", "Coins": "1", "Duration": "0", "Singular": "Pawn", "Index": "109", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "2", "Victory": "0", "Buys": "1", "Cards": "1", "Abbreviation": "Pawn", "Trash": "0", "Plural": "Pawns", "Expansion": "Intrigue"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Pearl Diver", "Index": "110", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "2", "Victory": "0", "Buys": "0", "Cards": "1", "Abbreviation": "PDiv", "Trash": "0", "Plural": "Pearl Divers", "Expansion": "Seaside"}, {"Reaction": "0", "Coins": "1", "Duration": "0", "Singular": "Peddler", "Index": "111", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "8", "Victory": "0", "Buys": "0", "Cards": "1", "Abbreviation": "Ped", "Trash": "0", "Plural": "Peddlers", "Expansion": "Prosperity"}, {"Reaction": "0", "Coins": "?", "Duration": "0", "Singular": "Philosopher's Stone", "Index": "112", "Treasure": "1", "Actions": "0", "VP": "0", "Action": "0", "Attack": "0", "Cost": "P3", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "PStone", "Trash": "0", "Plural": "Philosopher's Stones", "Expansion": "Alchemy"}, {"Reaction": "0", "Coins": "?", "Duration": "0", "Singular": "Pirate Ship", "Index": "113", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "1", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "PShip", "Trash": "0", "Plural": "Pirate Ships", "Expansion": "Seaside"}, {"Reaction": "0", "Coins": "5", "Duration": "0", "Singular": "Platinum", "Index": "114", "Treasure": "1", "Actions": "0", "VP": "0", "Action": "0", "Attack": "0", "Cost": "9", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Plat", "Trash": "0", "Plural": "Platinums", "Expansion": "Prosperity"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Possession", "Index": "115", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "P6", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Pos", "Trash": "0", "Plural": "Possessions", "Expansion": "Alchemy"}, {"Reaction": "0", "Coins": "P", "Duration": "0", "Singular": "Potion", "Index": "116", "Treasure": "1", "Actions": "0", "VP": "0", "Action": "0", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Pot", "Trash": "0", "Plural": "Potions", "Expansion": "Alchemy"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Princess", "Index": "117", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "*0", "Victory": "0", "Buys": "1", "Cards": "0", "Abbreviation": "Prin", "Trash": "0", "Plural": "Princesses", "Expansion": "Cornucopia"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Province", "Index": "118", "Treasure": "0", "Actions": "0", "VP": "6", "Action": "0", "Attack": "0", "Cost": "8", "Victory": "1", "Buys": "0", "Cards": "0", "Abbreviation": "Prov", "Trash": "0", "Plural": "Provinces", "Expansion": "Common"}, {"Reaction": "0", "Coins": "1", "Duration": "0", "Singular": "Quarry", "Index": "119", "Treasure": "1", "Actions": "0", "VP": "0", "Action": "0", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Qua", "Trash": "0", "Plural": "Quarries", "Expansion": "Prosperity"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Rabble", "Index": "120", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "1", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "3", "Abbreviation": "Rab", "Trash": "0", "Plural": "Rabbles", "Expansion": "Prosperity"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Remake", "Index": "121", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Rke", "Trash": "2", "Plural": "Remakes", "Expansion": "Cornucopia"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Remodel", "Index": "122", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Rdel", "Trash": "1", "Plural": "Remodels", "Expansion": "Dominion"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Royal Seal", "Index": "123", "Treasure": "1", "Actions": "0", "VP": "0", "Action": "0", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "RS", "Trash": "0", "Plural": "Royal Seals", "Expansion": "Prosperity"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Saboteur", "Index": "124", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "1", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Sab", "Trash": "0", "Plural": "Saboteurs", "Expansion": "Intrigue"}, {"Reaction": "0", "Coins": "?", "Duration": "0", "Singular": "Salvager", "Index": "125", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "1", "Cards": "0", "Abbreviation": "Salv", "Trash": "1", "Plural": "Salvagers", "Expansion": "Seaside"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Scheme", "Index": "126", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "3", "Victory": "0", "Buys": "0", "Cards": "1", "Abbreviation": "Sch", "Trash": "0", "Plural": "Schemes", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Scout", "Index": "127", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Sco", "Trash": "0", "Plural": "Scouts", "Expansion": "Intrigue"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Scrying Pool", "Index": "128", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "1", "Cost": "P2", "Victory": "0", "Buys": "0", "Cards": "1", "Abbreviation": "SP", "Trash": "0", "Plural": "Scrying Pools", "Expansion": "Alchemy"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Sea Hag", "Index": "129", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "1", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "SHag", "Trash": "0", "Plural": "Sea Hags", "Expansion": "Seaside"}, {"Reaction": "1", "Coins": "?", "Duration": "0", "Singular": "Secret Chamber", "Index": "130", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "2", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "SC", "Trash": "0", "Plural": "Secret Chambers", "Expansion": "Intrigue"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Shanty Town", "Index": "131", "Treasure": "0", "Actions": "2", "VP": "0", "Action": "1", "Attack": "0", "Cost": "3", "Victory": "0", "Buys": "0", "Cards": "2", "Abbreviation": "ST", "Trash": "0", "Plural": "Shanty Towns", "Expansion": "Intrigue"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Silk Road", "Index": "132", "Treasure": "0", "Actions": "0", "VP": "?", "Action": "0", "Attack": "0", "Cost": "4", "Victory": "1", "Buys": "0", "Cards": "0", "Abbreviation": "SR", "Trash": "0", "Plural": "Silk Roads", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Silver", "Index": "133", "Treasure": "1", "Actions": "0", "VP": "0", "Action": "0", "Attack": "0", "Cost": "3", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Silv", "Trash": "0", "Plural": "Silvers", "Expansion": "Common"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Smithy", "Index": "134", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "3", "Abbreviation": "Sthy", "Trash": "0", "Plural": "Smithies", "Expansion": "Dominion"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Smugglers", "Index": "135", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "3", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Smug", "Trash": "0", "Plural": "Smugglers", "Expansion": "Seaside"}, {"Reaction": "0", "Coins": "?", "Duration": "0", "Singular": "Spice Merchant", "Index": "136", "Treasure": "0", "Actions": "?", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "?", "Cards": "?", "Abbreviation": "SMrch", "Trash": "0", "Plural": "Spice Merchants", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Spy", "Index": "137", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "1", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "1", "Abbreviation": "Spy", "Trash": "0", "Plural": "Spies", "Expansion": "Dominion"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Stables", "Index": "138", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Stab", "Trash": "0", "Plural": "Stables", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Stash", "Index": "139", "Treasure": "1", "Actions": "0", "VP": "0", "Action": "0", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Sash", "Trash": "0", "Plural": "Stashes", "Expansion": "Promotional"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Steward", "Index": "140", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "3", "Victory": "0", "Buys": "0", "Cards": "2", "Abbreviation": "Ste", "Trash": "2", "Plural": "Stewards", "Expansion": "Intrigue"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Swindler", "Index": "141", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "1", "Cost": "3", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Swi", "Trash": "0", "Plural": "Swindlers", "Expansion": "Intrigue"}, {"Reaction": "0", "Coins": "0", "Duration": "1", "Singular": "Tactician", "Index": "142", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Tac", "Trash": "0", "Plural": "Tacticians", "Expansion": "Seaside"}, {"Reaction": "0", "Coins": "1", "Duration": "0", "Singular": "Talisman", "Index": "143", "Treasure": "1", "Actions": "0", "VP": "0", "Action": "0", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Tman", "Trash": "0", "Plural": "Talismans", "Expansion": "Prosperity"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Thief", "Index": "144", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "1", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Thi", "Trash": "0", "Plural": "Thieves", "Expansion": "Dominion"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Throne Room", "Index": "145", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "TRoom", "Trash": "0", "Plural": "Throne Rooms", "Expansion": "Dominion"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Torturer", "Index": "146", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "1", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "3", "Abbreviation": "Tort", "Trash": "0", "Plural": "Torturers", "Expansion": "Intrigue"}, {"Reaction": "0", "Coins": "1", "Duration": "0", "Singular": "Tournament", "Index": "147", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "1", "Abbreviation": "Tou", "Trash": "0", "Plural": "Tournaments", "Expansion": "Cornucopia"}, {"Reaction": "0", "Coins": "?", "Duration": "0", "Singular": "Trade Route", "Index": "148", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "3", "Victory": "0", "Buys": "1", "Cards": "0", "Abbreviation": "TRoute", "Trash": "1", "Plural": "Trade Routes", "Expansion": "Prosperity"}, {"Reaction": "1", "Coins": "0", "Duration": "0", "Singular": "Trader", "Index": "149", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Tder", "Trash": "1", "Plural": "Traders", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Trading Post", "Index": "150", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "TPst", "Trash": "2", "Plural": "Trading Posts", "Expansion": "Intrigue"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Transmute", "Index": "151", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "P", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Tmut", "Trash": "1", "Plural": "Transmutes", "Expansion": "Alchemy"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Treasure Map", "Index": "152", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "TMap", "Trash": "2", "Plural": "Treasure Maps", "Expansion": "Seaside"}, {"Reaction": "0", "Coins": "1", "Duration": "0", "Singular": "Treasury", "Index": "153", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "1", "Abbreviation": "Tsury", "Trash": "0", "Plural": "Treasuries", "Expansion": "Seaside"}, {"Reaction": "0", "Coins": "?", "Duration": "0", "Singular": "Tribute", "Index": "154", "Treasure": "0", "Actions": "?", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "?", "Abbreviation": "Trib", "Trash": "0", "Plural": "Tributes", "Expansion": "Intrigue"}, {"Reaction": "0", "Coins": "?", "Duration": "0", "Singular": "Trusty Steed", "Index": "155", "Treasure": "0", "Actions": "?", "VP": "0", "Action": "1", "Attack": "0", "Cost": "*0", "Victory": "0", "Buys": "0", "Cards": "?", "Abbreviation": "TS", "Trash": "0", "Plural": "Trusty Steeds", "Expansion": "Cornucopia"}, {"Reaction": "1", "Coins": "0", "Duration": "0", "Singular": "Tunnel", "Index": "156", "Treasure": "0", "Actions": "0", "VP": "2", "Action": "0", "Attack": "0", "Cost": "3", "Victory": "1", "Buys": "0", "Cards": "0", "Abbreviation": "Tun", "Trash": "0", "Plural": "Tunnels", "Expansion": "Hinterlands"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "University", "Index": "157", "Treasure": "0", "Actions": "2", "VP": "0", "Action": "1", "Attack": "0", "Cost": "P2", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Un", "Trash": "0", "Plural": "Universities", "Expansion": "Alchemy"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Upgrade", "Index": "158", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "1", "Abbreviation": "Up", "Trash": "1", "Plural": "Upgrades", "Expansion": "Intrigue"}, {"Reaction": "0", "Coins": "?", "Duration": "0", "Singular": "Vault", "Index": "159", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "2", "Abbreviation": "Va", "Trash": "0", "Plural": "Vaults", "Expansion": "Prosperity"}, {"Reaction": "0", "Coins": "1", "Duration": "0", "Singular": "Venture", "Index": "160", "Treasure": "1", "Actions": "0", "VP": "0", "Action": "0", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Ven", "Trash": "0", "Plural": "Ventures", "Expansion": "Prosperity"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Village", "Index": "161", "Treasure": "0", "Actions": "2", "VP": "0", "Action": "1", "Attack": "0", "Cost": "3", "Victory": "0", "Buys": "0", "Cards": "1", "Abbreviation": "Vil", "Trash": "0", "Plural": "Villages", "Expansion": "Dominion"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Vineyard", "Index": "162", "Treasure": "0", "Actions": "0", "VP": "?", "Action": "0", "Attack": "0", "Cost": "P", "Victory": "1", "Buys": "0", "Cards": "0", "Abbreviation": "Vin", "Trash": "0", "Plural": "Vineyards", "Expansion": "Alchemy"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Walled Village", "Index": "163", "Treasure": "0", "Actions": "2", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "1", "Abbreviation": "Wvil", "Trash": "0", "Plural": "Walled Villages", "Expansion": "Promotional"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Warehouse", "Index": "164", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "3", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Whouse", "Trash": "0", "Plural": "Warehouses", "Expansion": "Seaside"}, {"Reaction": "1", "Coins": "0", "Duration": "0", "Singular": "Watchtower", "Index": "165", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "3", "Victory": "0", "Buys": "0", "Cards": "2", "Abbreviation": "Wat", "Trash": "0", "Plural": "Watchtowers", "Expansion": "Prosperity"}, {"Reaction": "0", "Coins": "0", "Duration": "1", "Singular": "Wharf", "Index": "166", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "5", "Victory": "0", "Buys": "1", "Cards": "2", "Abbreviation": "Wrf", "Trash": "0", "Plural": "Wharves", "Expansion": "Seaside"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Wishing Well", "Index": "167", "Treasure": "0", "Actions": "1", "VP": "0", "Action": "1", "Attack": "0", "Cost": "3", "Victory": "0", "Buys": "0", "Cards": "1", "Abbreviation": "WW", "Trash": "0", "Plural": "Wishing Wells", "Expansion": "Intrigue"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Witch", "Index": "168", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "1", "Cost": "5", "Victory": "0", "Buys": "0", "Cards": "2", "Abbreviation": "Wit", "Trash": "0", "Plural": "Witches", "Expansion": "Dominion"}, {"Reaction": "0", "Coins": "2", "Duration": "0", "Singular": "Woodcutter", "Index": "169", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "3", "Victory": "0", "Buys": "1", "Cards": "0", "Abbreviation": "Wood", "Trash": "0", "Plural": "Woodcutters", "Expansion": "Dominion"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Worker's Village", "Index": "170", "Treasure": "0", "Actions": "2", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "1", "Cards": "1", "Abbreviation": "Wvil", "Trash": "0", "Plural": "Worker's Villages", "Expansion": "Prosperity"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Workshop", "Index": "171", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "3", "Victory": "0", "Buys": "0", "Cards": "0", "Abbreviation": "Wshop", "Trash": "0", "Plural": "Workshops", "Expansion": "Dominion"}, {"Reaction": "0", "Coins": "0", "Duration": "0", "Singular": "Young Witch", "Index": "172", "Treasure": "0", "Actions": "0", "VP": "0", "Action": "1", "Attack": "0", "Cost": "4", "Victory": "0", "Buys": "0", "Cards": "2", "Abbreviation": "Yng", "Trash": "0", "Plural": "Young Witches", "Expansion": "Cornucopia"}] \ No newline at end of file +[{"Index": "0", "Coins": "0", "Cards": "2", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Adventurers", "Singular": "Adventurer", "Shelter": "0", "Expansion": "Dominion", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Adv", "Cost": "6", "Duration": "0"}, {"Index": "1", "Coins": "0", "Cards": "2", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Alchemists", "Singular": "Alchemist", "Shelter": "0", "Expansion": "Alchemy", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Alc", "Cost": "P3", "Duration": "0"}, {"Index": "2", "Coins": "0", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Ambassadors", "Singular": "Ambassador", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Amb", "Cost": "3", "Duration": "0"}, {"Index": "3", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Apothecaries", "Singular": "Apothecary", "Shelter": "0", "Expansion": "Alchemy", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Apoth", "Cost": "P2", "Duration": "0"}, {"Index": "4", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Apprentices", "Singular": "Apprentice", "Shelter": "0", "Expansion": "Alchemy", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "App", "Cost": "5", "Duration": "0"}, {"Index": "5", "Coins": "?", "Cards": "?", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Archivists", "Singular": "Archivist", "Shelter": "0", "Expansion": "Fan", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Arc", "Cost": "5", "Duration": "0"}, {"Index": "6", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Bags of Gold", "Singular": "Bag of Gold", "Shelter": "0", "Expansion": "Cornucopia", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "BoG", "Cost": "*0", "Duration": "0"}, {"Index": "7", "Coins": "?", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Banks", "Singular": "Bank", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "1", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Bank", "Cost": "7", "Duration": "0"}, {"Index": "8", "Coins": "?", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "1", "Trash": "0", "Plural": "Barons", "Singular": "Baron", "Shelter": "0", "Expansion": "Intrigue", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Bron", "Cost": "4", "Duration": "0"}, {"Index": "9", "Coins": "1", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Bazaars", "Singular": "Bazaar", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "2", "Abbreviation": "Baz", "Cost": "5", "Duration": "0"}, {"Index": "10", "Coins": "1", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Bishops", "Singular": "Bishop", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Bish", "Cost": "4", "Duration": "0"}, {"Index": "11", "Coins": "2", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "1", "Trash": "0", "Plural": "Black Markets", "Singular": "Black Market", "Shelter": "0", "Expansion": "Promotional", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "BMark", "Cost": "3", "Duration": "0"}, {"Index": "12", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Border Villages", "Singular": "Border Village", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "2", "Abbreviation": "Bord", "Cost": "6", "Duration": "0"}, {"Index": "13", "Coins": "1", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "1", "Trash": "0", "Plural": "Bridges", "Singular": "Bridge", "Shelter": "0", "Expansion": "Intrigue", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Bri", "Cost": "4", "Duration": "0"}, {"Index": "14", "Coins": "0", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Bureaucrats", "Singular": "Bureaucrat", "Shelter": "0", "Expansion": "Dominion", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Bur", "Cost": "4", "Duration": "0"}, {"Index": "15", "Coins": "3", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Caches", "Singular": "Cache", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "0", "Treasure": "1", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Cache", "Cost": "5", "Duration": "0"}, {"Index": "16", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Caravans", "Singular": "Caravan", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Cvan", "Cost": "4", "Duration": "1"}, {"Index": "17", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Cartographers", "Singular": "Cartographer", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Cart", "Cost": "5", "Duration": "0"}, {"Index": "18", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Cellars", "Singular": "Cellar", "Shelter": "0", "Expansion": "Dominion", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Cel", "Cost": "2", "Duration": "0"}, {"Index": "19", "Coins": "2", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Chancellors", "Singular": "Chancellor", "Shelter": "0", "Expansion": "Dominion", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Chan", "Cost": "3", "Duration": "0"}, {"Index": "20", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "4", "Plural": "Chapels", "Singular": "Chapel", "Shelter": "0", "Expansion": "Dominion", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Chap", "Cost": "2", "Duration": "0"}, {"Index": "21", "Coins": "?", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "1", "Trash": "0", "Plural": "Cities", "Singular": "City", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "2", "Abbreviation": "City", "Cost": "5", "Duration": "0"}, {"Index": "22", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Colonies", "Singular": "Colony", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "10", "Victory": "1", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Col", "Cost": "11", "Duration": "0"}, {"Index": "23", "Coins": "2", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Conspirators", "Singular": "Conspirator", "Shelter": "0", "Expansion": "Intrigue", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "?", "Abbreviation": "Cons", "Cost": "4", "Duration": "0"}, {"Index": "24", "Coins": "3", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "1", "Trash": "0", "Plural": "Contrabands", "Singular": "Contraband", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "1", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Cband", "Cost": "5", "Duration": "0"}, {"Index": "25", "Coins": "1", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Coppers", "Singular": "Copper", "Shelter": "0", "Expansion": "Common", "Looter": "0", "Reaction": "0", "Treasure": "1", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Cop", "Cost": "0", "Duration": "0"}, {"Index": "26", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Coppersmiths", "Singular": "Coppersmith", "Shelter": "0", "Expansion": "Intrigue", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Csmith", "Cost": "4", "Duration": "0"}, {"Index": "27", "Coins": "0", "Cards": "4", "Attack": "0", "CoinTokens": "0", "Buys": "1", "Trash": "0", "Plural": "Council Rooms", "Singular": "Council Room", "Shelter": "0", "Expansion": "Dominion", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "CR", "Cost": "5", "Duration": "0"}, {"Index": "28", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Counting Houses", "Singular": "Counting House", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "CH", "Cost": "5", "Duration": "0"}, {"Index": "29", "Coins": "0", "Cards": "2", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Courtyards", "Singular": "Courtyard", "Shelter": "0", "Expansion": "Intrigue", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Cyard", "Cost": "2", "Duration": "0"}, {"Index": "30", "Coins": "0", "Cards": "?", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Crossroads", "Singular": "Crossroads", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "?", "Abbreviation": "Croads", "Cost": "2", "Duration": "0"}, {"Index": "31", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Curses", "Singular": "Curse", "Shelter": "0", "Expansion": "Common", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "-1", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Curse", "Cost": "0", "Duration": "0"}, {"Index": "32", "Coins": "2", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Cutpurses", "Singular": "Cutpurse", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Cut", "Cost": "4", "Duration": "0"}, {"Index": "33", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Develops", "Singular": "Develop", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Dev", "Cost": "3", "Duration": "0"}, {"Index": "34", "Coins": "2", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Diadems", "Singular": "Diadem", "Shelter": "0", "Expansion": "Cornucopia", "Looter": "0", "Reaction": "0", "Treasure": "1", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Dia", "Cost": "*0", "Duration": "0"}, {"Index": "35", "Coins": "2", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Duchesses", "Singular": "Duchess", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Dss", "Cost": "2", "Duration": "0"}, {"Index": "36", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Duchies", "Singular": "Duchy", "Shelter": "0", "Expansion": "Common", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "3", "Victory": "1", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Duchy", "Cost": "5", "Duration": "0"}, {"Index": "37", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Dukes", "Singular": "Duke", "Shelter": "0", "Expansion": "Intrigue", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "?", "Victory": "1", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Duke", "Cost": "5", "Duration": "0"}, {"Index": "38", "Coins": "2", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Embargoes", "Singular": "Embargo", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Ebarg", "Cost": "2", "Duration": "0"}, {"Index": "39", "Coins": "0", "Cards": "5", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Embassies", "Singular": "Embassy", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Ebass", "Cost": "5", "Duration": "0"}, {"Index": "40", "Coins": "0", "Cards": "4", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Envoys", "Singular": "Envoy", "Shelter": "0", "Expansion": "Promotional", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Env", "Cost": "4", "Duration": "0"}, {"Index": "41", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Estates", "Singular": "Estate", "Shelter": "0", "Expansion": "Common", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "1", "Victory": "1", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Est", "Cost": "2", "Duration": "0"}, {"Index": "42", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Expands", "Singular": "Expand", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Epand", "Cost": "7", "Duration": "0"}, {"Index": "43", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Explorers", "Singular": "Explorer", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Expl", "Cost": "5", "Duration": "0"}, {"Index": "44", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Fairgrounds", "Singular": "Fairgrounds", "Shelter": "0", "Expansion": "Cornucopia", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "?", "Victory": "1", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Fair", "Cost": "6", "Duration": "0"}, {"Index": "45", "Coins": "0", "Cards": "1", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Familiars", "Singular": "Familiar", "Shelter": "0", "Expansion": "Alchemy", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Fam", "Cost": "P3", "Duration": "0"}, {"Index": "46", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Farming Villages", "Singular": "Farming Village", "Shelter": "0", "Expansion": "Cornucopia", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "2", "Abbreviation": "FarmV", "Cost": "4", "Duration": "0"}, {"Index": "47", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Farmlands", "Singular": "Farmland", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "2", "Victory": "1", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Fland", "Cost": "6", "Duration": "0"}, {"Index": "48", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Feasts", "Singular": "Feast", "Shelter": "0", "Expansion": "Dominion", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Feast", "Cost": "4", "Duration": "0"}, {"Index": "49", "Coins": "2", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "1", "Trash": "0", "Plural": "Festivals", "Singular": "Festival", "Shelter": "0", "Expansion": "Dominion", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "2", "Abbreviation": "Fest", "Cost": "5", "Duration": "0"}, {"Index": "50", "Coins": "1", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Fishing Villages", "Singular": "Fishing Village", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "2", "Abbreviation": "FishV", "Cost": "3", "Duration": "1"}, {"Index": "51", "Coins": "0", "Cards": "2", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Followers", "Singular": "Followers", "Shelter": "0", "Expansion": "Cornucopia", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Foll", "Cost": "*0", "Duration": "0"}, {"Index": "52", "Coins": "?", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Fool's Golds", "Singular": "Fool's Gold", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "1", "Treasure": "1", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Fool", "Cost": "2", "Duration": "0"}, {"Index": "53", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "99", "Plural": "Forges", "Singular": "Forge", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Forge", "Cost": "7", "Duration": "0"}, {"Index": "54", "Coins": "2", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Fortune Tellers", "Singular": "Fortune Teller", "Shelter": "0", "Expansion": "Cornucopia", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "FT", "Cost": "3", "Duration": "0"}, {"Index": "55", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Gardens", "Singular": "Gardens", "Shelter": "0", "Expansion": "Dominion", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "?", "Victory": "1", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Gard", "Cost": "4", "Duration": "0"}, {"Index": "56", "Coins": "0", "Cards": "2", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Ghost Ships", "Singular": "Ghost Ship", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "GS", "Cost": "5", "Duration": "0"}, {"Index": "57", "Coins": "3", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Golds", "Singular": "Gold", "Shelter": "0", "Expansion": "Common", "Looter": "0", "Reaction": "0", "Treasure": "1", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Gold", "Cost": "6", "Duration": "0"}, {"Index": "58", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Golems", "Singular": "Golem", "Shelter": "0", "Expansion": "Alchemy", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Golem", "Cost": "P4", "Duration": "0"}, {"Index": "59", "Coins": "2", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "1", "Trash": "0", "Plural": "Goons", "Singular": "Goons", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Goon", "Cost": "6", "Duration": "0"}, {"Index": "60", "Coins": "0", "Cards": "?", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "?", "Plural": "Governors", "Singular": "Governor", "Shelter": "0", "Expansion": "Promotional", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Gov", "Cost": "5", "Duration": "0"}, {"Index": "61", "Coins": "2", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "1", "Trash": "0", "Plural": "Grand Markets", "Singular": "Grand Market", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Gmark", "Cost": "6", "Duration": "0"}, {"Index": "62", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Great Halls", "Singular": "Great Hall", "Shelter": "0", "Expansion": "Intrigue", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "1", "Victory": "1", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "GH", "Cost": "3", "Duration": "0"}, {"Index": "63", "Coins": "2", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Hagglers", "Singular": "Haggler", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Hag", "Cost": "5", "Duration": "0"}, {"Index": "64", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "1", "Trash": "0", "Plural": "Hamlets", "Singular": "Hamlet", "Shelter": "0", "Expansion": "Cornucopia", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Ham", "Cost": "2", "Duration": "0"}, {"Index": "65", "Coins": "2", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Harems", "Singular": "Harem", "Shelter": "0", "Expansion": "Intrigue", "Looter": "0", "Reaction": "0", "Treasure": "1", "Knight": "0", "VP": "2", "Victory": "1", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Harem", "Cost": "6", "Duration": "0"}, {"Index": "66", "Coins": "?", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Harvests", "Singular": "Harvest", "Shelter": "0", "Expansion": "Cornucopia", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Hvest", "Cost": "5", "Duration": "0"}, {"Index": "67", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Havens", "Singular": "Haven", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Hav", "Cost": "2", "Duration": "1"}, {"Index": "68", "Coins": "1", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "1", "Trash": "0", "Plural": "Herbalists", "Singular": "Herbalist", "Shelter": "0", "Expansion": "Alchemy", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Herb", "Cost": "2", "Duration": "0"}, {"Index": "69", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Highways", "Singular": "Highway", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Hway", "Cost": "5", "Duration": "0"}, {"Index": "70", "Coins": "2", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Hoards", "Singular": "Hoard", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "1", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Hoard", "Cost": "6", "Duration": "0"}, {"Index": "71", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Horns of Plenty", "Singular": "Horn of Plenty", "Shelter": "0", "Expansion": "Cornucopia", "Looter": "0", "Reaction": "0", "Treasure": "1", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "HoP", "Cost": "5", "Duration": "0"}, {"Index": "72", "Coins": "3", "Cards": "-2", "Attack": "0", "CoinTokens": "0", "Buys": "1", "Trash": "0", "Plural": "Horse Traders", "Singular": "Horse Traders", "Shelter": "0", "Expansion": "Cornucopia", "Looter": "0", "Reaction": "1", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "HT", "Cost": "4", "Duration": "0"}, {"Index": "73", "Coins": "0", "Cards": "2", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Hunting Parties", "Singular": "Hunting Party", "Shelter": "0", "Expansion": "Cornucopia", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Hunt", "Cost": "5", "Duration": "0"}, {"Index": "74", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Ill-Gotten Gains", "Singular": "Ill-Gotten Gains", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "0", "Treasure": "1", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "IGG", "Cost": "5", "Duration": "0"}, {"Index": "75", "Coins": "0", "Cards": "2", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Inns", "Singular": "Inn", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "2", "Abbreviation": "Inn", "Cost": "5", "Duration": "0"}, {"Index": "76", "Coins": "?", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Ironworks", "Singular": "Ironworks", "Shelter": "0", "Expansion": "Intrigue", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "IW", "Cost": "4", "Duration": "0"}, {"Index": "77", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Islands", "Singular": "Island", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "2", "Victory": "1", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Isl", "Cost": "4", "Duration": "0"}, {"Index": "78", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Jacks of All Trades", "Singular": "Jack of All Trades", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "JoaT", "Cost": "4", "Duration": "0"}, {"Index": "79", "Coins": "2", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Jesters", "Singular": "Jester", "Shelter": "0", "Expansion": "Cornucopia", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Jest", "Cost": "5", "Duration": "0"}, {"Index": "80", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "King's Courts", "Singular": "King's Court", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "KC", "Cost": "7", "Duration": "0"}, {"Index": "81", "Coins": "0", "Cards": "2", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Laboratories", "Singular": "Laboratory", "Shelter": "0", "Expansion": "Dominion", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Lab", "Cost": "5", "Duration": "0"}, {"Index": "82", "Coins": "0", "Cards": "3", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Libraries", "Singular": "Library", "Shelter": "0", "Expansion": "Dominion", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Lib", "Cost": "5", "Duration": "0"}, {"Index": "83", "Coins": "1", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Lighthouses", "Singular": "Lighthouse", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "1", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Light", "Cost": "2", "Duration": "1"}, {"Index": "84", "Coins": "1", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Loans", "Singular": "Loan", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "1", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Loan", "Cost": "3", "Duration": "0"}, {"Index": "85", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Lookouts", "Singular": "Lookout", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Look", "Cost": "3", "Duration": "0"}, {"Index": "86", "Coins": "3", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Mandarins", "Singular": "Mandarin", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "0", "Treasure": "3", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Mand", "Cost": "5", "Duration": "0"}, {"Index": "87", "Coins": "0", "Cards": "3", "Attack": "1", "CoinTokens": "0", "Buys": "1", "Trash": "0", "Plural": "Margraves", "Singular": "Margrave", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Marg", "Cost": "5", "Duration": "0"}, {"Index": "88", "Coins": "1", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "1", "Trash": "0", "Plural": "Markets", "Singular": "Market", "Shelter": "0", "Expansion": "Dominion", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Mark", "Cost": "5", "Duration": "0"}, {"Index": "89", "Coins": "0", "Cards": "2", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Masquerades", "Singular": "Masquerade", "Shelter": "0", "Expansion": "Intrigue", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Masq", "Cost": "3", "Duration": "0"}, {"Index": "90", "Coins": "0", "Cards": "3", "Attack": "0", "CoinTokens": "0", "Buys": "", "Trash": "0", "Plural": "Menageries", "Singular": "Menagerie", "Shelter": "0", "Expansion": "Cornucopia", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Men", "Cost": "3", "Duration": "0"}, {"Index": "91", "Coins": "2", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Merchant Ships", "Singular": "Merchant Ship", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "MS", "Cost": "5", "Duration": "1"}, {"Index": "92", "Coins": "2", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Militias", "Singular": "Militia", "Shelter": "0", "Expansion": "Dominion", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Mil", "Cost": "4", "Duration": "0"}, {"Index": "93", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Mines", "Singular": "Mine", "Shelter": "0", "Expansion": "Dominion", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Mine", "Cost": "5", "Duration": "0"}, {"Index": "94", "Coins": "?", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Mining Villages", "Singular": "Mining Village", "Shelter": "0", "Expansion": "Intrigue", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "2", "Abbreviation": "MinV", "Cost": "4", "Duration": "0"}, {"Index": "95", "Coins": "?", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Minions", "Singular": "Minion", "Shelter": "0", "Expansion": "Intrigue", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Mion", "Cost": "5", "Duration": "0"}, {"Index": "96", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "?", "Plural": "Mints", "Singular": "Mint", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Mint", "Cost": "5", "Duration": "0"}, {"Index": "97", "Coins": "0", "Cards": "2", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Moats", "Singular": "Moat", "Shelter": "0", "Expansion": "Dominion", "Looter": "0", "Reaction": "1", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Moa", "Cost": "2", "Duration": "0"}, {"Index": "98", "Coins": "?", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Moneylenders", "Singular": "Moneylender", "Shelter": "0", "Expansion": "Dominion", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Mlend", "Cost": "4", "Duration": "0"}, {"Index": "99", "Coins": "2", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Monuments", "Singular": "Monument", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Mment", "Cost": "4", "Duration": "0"}, {"Index": "100", "Coins": "2", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Mountebanks", "Singular": "Mountebank", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Mbank", "Cost": "5", "Duration": "0"}, {"Index": "101", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Native Villages", "Singular": "Native Village", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "2", "Abbreviation": "NatV", "Cost": "2", "Duration": "0"}, {"Index": "102", "Coins": "2", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Navigators", "Singular": "Navigator", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Nav", "Cost": "4", "Duration": "0"}, {"Index": "103", "Coins": "1", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Noble Brigands", "Singular": "Noble Brigand", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "NBri", "Cost": "4", "Duration": "0"}, {"Index": "104", "Coins": "0", "Cards": "?", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Nobles", "Singular": "Nobles", "Shelter": "0", "Expansion": "Intrigue", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "2", "Victory": "1", "Action": "1", "Ruins": "0", "Actions": "?", "Abbreviation": "Nbles", "Cost": "6", "Duration": "0"}, {"Index": "105", "Coins": "2", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "1", "Trash": "0", "Plural": "Nomad Camps", "Singular": "Nomad Camp", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "NCamp", "Cost": "4", "Duration": "0"}, {"Index": "106", "Coins": "1", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Oases", "Singular": "Oasis", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Oasis", "Cost": "3", "Duration": "0"}, {"Index": "107", "Coins": "0", "Cards": "2", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Oracles", "Singular": "Oracle", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Ora", "Cost": "3", "Duration": "0"}, {"Index": "108", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Outposts", "Singular": "Outpost", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Out", "Cost": "5", "Duration": "1"}, {"Index": "109", "Coins": "?", "Cards": "?", "Attack": "0", "CoinTokens": "0", "Buys": "?", "Trash": "0", "Plural": "Pawns", "Singular": "Pawn", "Shelter": "0", "Expansion": "Intrigue", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "?", "Abbreviation": "Pawn", "Cost": "2", "Duration": "0"}, {"Index": "110", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Pearl Divers", "Singular": "Pearl Diver", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "PDiv", "Cost": "2", "Duration": "0"}, {"Index": "111", "Coins": "1", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Peddlers", "Singular": "Peddler", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Ped", "Cost": "8", "Duration": "0"}, {"Index": "112", "Coins": "?", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Philosopher's Stones", "Singular": "Philosopher's Stone", "Shelter": "0", "Expansion": "Alchemy", "Looter": "0", "Reaction": "0", "Treasure": "1", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "PStone", "Cost": "P3", "Duration": "0"}, {"Index": "113", "Coins": "?", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Pirate Ships", "Singular": "Pirate Ship", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "PShip", "Cost": "4", "Duration": "0"}, {"Index": "114", "Coins": "5", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Platinums", "Singular": "Platinum", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "1", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Plat", "Cost": "9", "Duration": "0"}, {"Index": "115", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Possessions", "Singular": "Possession", "Shelter": "0", "Expansion": "Alchemy", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Pos", "Cost": "P6", "Duration": "0"}, {"Index": "116", "Coins": "P", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Potions", "Singular": "Potion", "Shelter": "0", "Expansion": "Alchemy", "Looter": "0", "Reaction": "0", "Treasure": "1", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Pot", "Cost": "4", "Duration": "0"}, {"Index": "117", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "1", "Trash": "0", "Plural": "Princesses", "Singular": "Princess", "Shelter": "0", "Expansion": "Cornucopia", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Prin", "Cost": "*0", "Duration": "0"}, {"Index": "118", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Provinces", "Singular": "Province", "Shelter": "0", "Expansion": "Common", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "6", "Victory": "1", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Prov", "Cost": "8", "Duration": "0"}, {"Index": "119", "Coins": "1", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Quarries", "Singular": "Quarry", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "1", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Qua", "Cost": "4", "Duration": "0"}, {"Index": "120", "Coins": "0", "Cards": "3", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Rabbles", "Singular": "Rabble", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Rab", "Cost": "5", "Duration": "0"}, {"Index": "121", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "2", "Plural": "Remakes", "Singular": "Remake", "Shelter": "0", "Expansion": "Cornucopia", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Rke", "Cost": "4", "Duration": "0"}, {"Index": "122", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Remodels", "Singular": "Remodel", "Shelter": "0", "Expansion": "Dominion", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Rdel", "Cost": "4", "Duration": "0"}, {"Index": "123", "Coins": "2", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Royal Seals", "Singular": "Royal Seal", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "1", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "RS", "Cost": "5", "Duration": "0"}, {"Index": "124", "Coins": "0", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Saboteurs", "Singular": "Saboteur", "Shelter": "0", "Expansion": "Intrigue", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Sab", "Cost": "5", "Duration": "0"}, {"Index": "125", "Coins": "?", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "1", "Trash": "1", "Plural": "Salvagers", "Singular": "Salvager", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Salv", "Cost": "4", "Duration": "0"}, {"Index": "126", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Schemes", "Singular": "Scheme", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Sch", "Cost": "3", "Duration": "0"}, {"Index": "127", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Scouts", "Singular": "Scout", "Shelter": "0", "Expansion": "Intrigue", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Sco", "Cost": "4", "Duration": "0"}, {"Index": "128", "Coins": "0", "Cards": "1", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Scrying Pools", "Singular": "Scrying Pool", "Shelter": "0", "Expansion": "Alchemy", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "SP", "Cost": "P2", "Duration": "0"}, {"Index": "129", "Coins": "0", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Sea Hags", "Singular": "Sea Hag", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "SHag", "Cost": "4", "Duration": "0"}, {"Index": "130", "Coins": "?", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Secret Chambers", "Singular": "Secret Chamber", "Shelter": "0", "Expansion": "Intrigue", "Looter": "0", "Reaction": "1", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "SC", "Cost": "2", "Duration": "0"}, {"Index": "131", "Coins": "0", "Cards": "2", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Shanty Towns", "Singular": "Shanty Town", "Shelter": "0", "Expansion": "Intrigue", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "2", "Abbreviation": "ST", "Cost": "3", "Duration": "0"}, {"Index": "132", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Silk Roads", "Singular": "Silk Road", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "?", "Victory": "1", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "SR", "Cost": "4", "Duration": "0"}, {"Index": "133", "Coins": "2", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Silvers", "Singular": "Silver", "Shelter": "0", "Expansion": "Common", "Looter": "0", "Reaction": "0", "Treasure": "1", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Silv", "Cost": "3", "Duration": "0"}, {"Index": "134", "Coins": "0", "Cards": "3", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Smithies", "Singular": "Smithy", "Shelter": "0", "Expansion": "Dominion", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Sthy", "Cost": "4", "Duration": "0"}, {"Index": "135", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Smugglers", "Singular": "Smugglers", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Smug", "Cost": "3", "Duration": "0"}, {"Index": "136", "Coins": "?", "Cards": "?", "Attack": "0", "CoinTokens": "0", "Buys": "?", "Trash": "0", "Plural": "Spice Merchants", "Singular": "Spice Merchant", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "?", "Abbreviation": "SMrch", "Cost": "4", "Duration": "0"}, {"Index": "137", "Coins": "0", "Cards": "1", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Spies", "Singular": "Spy", "Shelter": "0", "Expansion": "Dominion", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Spy", "Cost": "4", "Duration": "0"}, {"Index": "138", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Stables", "Singular": "Stables", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Stab", "Cost": "5", "Duration": "0"}, {"Index": "139", "Coins": "2", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Stashes", "Singular": "Stash", "Shelter": "0", "Expansion": "Promotional", "Looter": "0", "Reaction": "0", "Treasure": "1", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Sash", "Cost": "5", "Duration": "0"}, {"Index": "140", "Coins": "?", "Cards": "2", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "2", "Plural": "Stewards", "Singular": "Steward", "Shelter": "0", "Expansion": "Intrigue", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Ste", "Cost": "3", "Duration": "0"}, {"Index": "141", "Coins": "2", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Swindlers", "Singular": "Swindler", "Shelter": "0", "Expansion": "Intrigue", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Swi", "Cost": "3", "Duration": "0"}, {"Index": "142", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Tacticians", "Singular": "Tactician", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Tac", "Cost": "5", "Duration": "1"}, {"Index": "143", "Coins": "1", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Talismans", "Singular": "Talisman", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "1", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Tman", "Cost": "4", "Duration": "0"}, {"Index": "144", "Coins": "0", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Thieves", "Singular": "Thief", "Shelter": "0", "Expansion": "Dominion", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Thi", "Cost": "4", "Duration": "0"}, {"Index": "145", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Throne Rooms", "Singular": "Throne Room", "Shelter": "0", "Expansion": "Dominion", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "TRoom", "Cost": "4", "Duration": "0"}, {"Index": "146", "Coins": "0", "Cards": "3", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Torturers", "Singular": "Torturer", "Shelter": "0", "Expansion": "Intrigue", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Tort", "Cost": "5", "Duration": "0"}, {"Index": "147", "Coins": "?", "Cards": "?", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Tournaments", "Singular": "Tournament", "Shelter": "0", "Expansion": "Cornucopia", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Tou", "Cost": "4", "Duration": "0"}, {"Index": "148", "Coins": "?", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "1", "Trash": "1", "Plural": "Trade Routes", "Singular": "Trade Route", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "TRoute", "Cost": "3", "Duration": "0"}, {"Index": "149", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Traders", "Singular": "Trader", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "1", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Tder", "Cost": "4", "Duration": "0"}, {"Index": "150", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "2", "Plural": "Trading Posts", "Singular": "Trading Post", "Shelter": "0", "Expansion": "Intrigue", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "TPst", "Cost": "5", "Duration": "0"}, {"Index": "151", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Transmutes", "Singular": "Transmute", "Shelter": "0", "Expansion": "Alchemy", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Tmut", "Cost": "P", "Duration": "0"}, {"Index": "152", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "2", "Plural": "Treasure Maps", "Singular": "Treasure Map", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "TMap", "Cost": "4", "Duration": "0"}, {"Index": "153", "Coins": "1", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Treasuries", "Singular": "Treasury", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Tsury", "Cost": "5", "Duration": "0"}, {"Index": "154", "Coins": "?", "Cards": "?", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Tributes", "Singular": "Tribute", "Shelter": "0", "Expansion": "Intrigue", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "?", "Abbreviation": "Trib", "Cost": "5", "Duration": "0"}, {"Index": "155", "Coins": "?", "Cards": "?", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Trusty Steeds", "Singular": "Trusty Steed", "Shelter": "0", "Expansion": "Cornucopia", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "?", "Abbreviation": "TS", "Cost": "*0", "Duration": "0"}, {"Index": "156", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Tunnels", "Singular": "Tunnel", "Shelter": "0", "Expansion": "Hinterlands", "Looter": "0", "Reaction": "1", "Treasure": "0", "Knight": "0", "VP": "2", "Victory": "1", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Tun", "Cost": "3", "Duration": "0"}, {"Index": "157", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Universities", "Singular": "University", "Shelter": "0", "Expansion": "Alchemy", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "2", "Abbreviation": "Un", "Cost": "P2", "Duration": "0"}, {"Index": "158", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Upgrades", "Singular": "Upgrade", "Shelter": "0", "Expansion": "Intrigue", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Up", "Cost": "5", "Duration": "0"}, {"Index": "159", "Coins": "?", "Cards": "2", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Vaults", "Singular": "Vault", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Va", "Cost": "5", "Duration": "0"}, {"Index": "160", "Coins": "1", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Ventures", "Singular": "Venture", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "1", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Ven", "Cost": "5", "Duration": "0"}, {"Index": "161", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Villages", "Singular": "Village", "Shelter": "0", "Expansion": "Dominion", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "2", "Abbreviation": "Vil", "Cost": "3", "Duration": "0"}, {"Index": "162", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Vineyards", "Singular": "Vineyard", "Shelter": "0", "Expansion": "Alchemy", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "?", "Victory": "1", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Vin", "Cost": "P", "Duration": "0"}, {"Index": "163", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Walled Villages", "Singular": "Walled Village", "Shelter": "0", "Expansion": "Promotional", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "2", "Abbreviation": "Wvil", "Cost": "4", "Duration": "0"}, {"Index": "164", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Warehouses", "Singular": "Warehouse", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Whouse", "Cost": "3", "Duration": "0"}, {"Index": "165", "Coins": "0", "Cards": "2", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Watchtowers", "Singular": "Watchtower", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "1", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Wat", "Cost": "3", "Duration": "0"}, {"Index": "166", "Coins": "0", "Cards": "2", "Attack": "0", "CoinTokens": "0", "Buys": "1", "Trash": "0", "Plural": "Wharves", "Singular": "Wharf", "Shelter": "0", "Expansion": "Seaside", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Wrf", "Cost": "5", "Duration": "1"}, {"Index": "167", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Wishing Wells", "Singular": "Wishing Well", "Shelter": "0", "Expansion": "Intrigue", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "WW", "Cost": "3", "Duration": "0"}, {"Index": "168", "Coins": "0", "Cards": "2", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Witches", "Singular": "Witch", "Shelter": "0", "Expansion": "Dominion", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Wit", "Cost": "5", "Duration": "0"}, {"Index": "169", "Coins": "2", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "1", "Trash": "0", "Plural": "Woodcutters", "Singular": "Woodcutter", "Shelter": "0", "Expansion": "Dominion", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Wood", "Cost": "3", "Duration": "0"}, {"Index": "170", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "1", "Trash": "0", "Plural": "Worker's Villages", "Singular": "Worker's Village", "Shelter": "0", "Expansion": "Prosperity", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "2", "Abbreviation": "Wvil", "Cost": "4", "Duration": "0"}, {"Index": "171", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Workshops", "Singular": "Workshop", "Shelter": "0", "Expansion": "Dominion", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Wshop", "Cost": "3", "Duration": "0"}, {"Index": "172", "Coins": "0", "Cards": "2", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Young Witches", "Singular": "Young Witch", "Shelter": "0", "Expansion": "Cornucopia", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Yng", "Cost": "4", "Duration": "0"}, {"Index": "173", "Coins": "1", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Abandoned Mines", "Singular": "Abandoned Mine", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "1", "Actions": "0", "Abbreviation": "AM", "Cost": "0", "Duration": "0"}, {"Index": "174", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Altars", "Singular": "Altar", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Alt", "Cost": "6", "Duration": "0"}, {"Index": "175", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Armories", "Singular": "Armory", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Arm", "Cost": "4", "Duration": "0"}, {"Index": "176", "Coins": "?", "Cards": "?", "Attack": "0", "CoinTokens": "0", "Buys": "?", "Trash": "?", "Plural": "Bands of Misfits", "Singular": "Band of Misfits", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "?", "Abbreviation": "BoM", "Cost": "5", "Duration": "0"}, {"Index": "177", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Bandit Camps", "Singular": "Bandit Camp", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "2", "Abbreviation": "BC", "Cost": "5", "Duration": "0"}, {"Index": "178", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Beggars", "Singular": "Beggar", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "1", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Beg", "Cost": "2", "Duration": "0"}, {"Index": "179", "Coins": "0", "Cards": "3", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Catacombs", "Singular": "Catacombs", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Cat", "Cost": "5", "Duration": "0"}, {"Index": "180", "Coins": "?", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "?", "Plural": "Counts", "Singular": "Count", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Count", "Cost": "5", "Duration": "0"}, {"Index": "181", "Coins": "1", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "1", "Trash": "1", "Plural": "Counterfeits", "Singular": "Counterfeit", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "1", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Cf", "Cost": "5", "Duration": "0"}, {"Index": "182", "Coins": "0", "Cards": "2", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Cultists", "Singular": "Cultist", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "1", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Cul", "Cost": "5", "Duration": "0"}, {"Index": "183", "Coins": "0", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "2", "Plural": "Dames Anna", "Singular": "Dame Anna", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "1", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "DAn", "Cost": "5", "Duration": "0"}, {"Index": "184", "Coins": "0", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Dames Josephine", "Singular": "Dame Josephine", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "1", "VP": "2", "Victory": "1", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "DJo", "Cost": "5", "Duration": "0"}, {"Index": "185", "Coins": "0", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Dames Molly", "Singular": "Dame Molly", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "1", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "2", "Abbreviation": "DMo", "Cost": "5", "Duration": "0"}, {"Index": "186", "Coins": "0", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Dames Natalie", "Singular": "Dame Natalie", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "1", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "DNat", "Cost": "5", "Duration": "0"}, {"Index": "187", "Coins": "2", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Dames Sylvia", "Singular": "Dame Sylvia", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "1", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "DSyl", "Cost": "5", "Duration": "0"}, {"Index": "188", "Coins": "5", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Death Carts", "Singular": "Death Cart", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "1", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "DC", "Cost": "4", "Duration": "0"}, {"Index": "189", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Feoda", "Singular": "Feodum", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "?", "Victory": "1", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Feo", "Cost": "4", "Duration": "0"}, {"Index": "190", "Coins": "?", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "1", "Trash": "1", "Plural": "Foragers", "Singular": "Forager", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Fger", "Cost": "3", "Duration": "0"}, {"Index": "191", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Fortresses", "Singular": "Fortress", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "2", "Abbreviation": "Ftrs", "Cost": "4", "Duration": "0"}, {"Index": "192", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Graverobbers", "Singular": "Graverobber", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "GR", "Cost": "5", "Duration": "0"}, {"Index": "193", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Hermits", "Singular": "Hermit", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Hrm", "Cost": "3", "Duration": "0"}, {"Index": "194", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Hovels", "Singular": "Hovel", "Shelter": "1", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "1", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Hv", "Cost": "1", "Duration": "0"}, {"Index": "195", "Coins": "0", "Cards": "4", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Hunting Grounds", "Singular": "Hunting Grounds", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "HG", "Cost": "6", "Duration": "0"}, {"Index": "196", "Coins": "?", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Ironmongers", "Singular": "Ironmonger", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "IM", "Cost": "4", "Duration": "0"}, {"Index": "197", "Coins": "1", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Junk Dealers", "Singular": "Junk Dealer", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "JD", "Cost": "5", "Duration": "0"}, {"Index": "198", "Coins": "?", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Knights", "Singular": "Knights", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "1", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Kn", "Cost": "5", "Duration": "0"}, {"Index": "199", "Coins": "0", "Cards": "?", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Madmen", "Singular": "Madman", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "2", "Abbreviation": "MM", "Cost": "*0", "Duration": "0"}, {"Index": "200", "Coins": "0", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Marauders", "Singular": "Marauder", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "1", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Mard", "Cost": "4", "Duration": "0"}, {"Index": "201", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Market Squares", "Singular": "Market Square", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "1", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "MS", "Cost": "3", "Duration": "0"}, {"Index": "202", "Coins": "?", "Cards": "2", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "2", "Plural": "Mercenaries", "Singular": "Mercenary", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Merc", "Cost": "*0", "Duration": "0"}, {"Index": "203", "Coins": "2", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Mystics", "Singular": "Mystic", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Mys", "Cost": "5", "Duration": "0"}, {"Index": "204", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Necropolises", "Singular": "Necropolis", "Shelter": "1", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "2", "Abbreviation": "Nec", "Cost": "1", "Duration": "0"}, {"Index": "205", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Overgrown Estates", "Singular": "Overgrown Estate", "Shelter": "1", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "1", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "OE", "Cost": "1", "Duration": "0"}, {"Index": "206", "Coins": "0", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Pillages", "Singular": "Pillage", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Pil", "Cost": "5", "Duration": "0"}, {"Index": "207", "Coins": "?", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Poor Houses", "Singular": "Poor House", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "PH", "Cost": "1", "Duration": "0"}, {"Index": "208", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Processions", "Singular": "Procession", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Proc", "Cost": "4", "Duration": "0"}, {"Index": "209", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Rats", "Singular": "Rats", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Rats", "Cost": "4", "Duration": "0"}, {"Index": "210", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Rebuilds", "Singular": "Rebuild", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Reb", "Cost": "5", "Duration": "0"}, {"Index": "211", "Coins": "2", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Rogues", "Singular": "Rogue", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Rogue", "Cost": "5", "Duration": "0"}, {"Index": "212", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Ruined Libraries", "Singular": "Ruined Library", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "1", "Actions": "0", "Abbreviation": "RLib", "Cost": "0", "Duration": "0"}, {"Index": "213", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "1", "Trash": "0", "Plural": "Ruined Markets", "Singular": "Ruined Market", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "1", "Actions": "0", "Abbreviation": "RMar", "Cost": "0", "Duration": "0"}, {"Index": "214", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Ruined Villages", "Singular": "Ruined Village", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "1", "Actions": "1", "Abbreviation": "RVil", "Cost": "0", "Duration": "0"}, {"Index": "215", "Coins": "?", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Ruins", "Singular": "Ruins", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "1", "Actions": "0", "Abbreviation": "Ruins", "Cost": "0", "Duration": "0"}, {"Index": "216", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Sages", "Singular": "Sage", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Sage", "Cost": "3", "Duration": "0"}, {"Index": "217", "Coins": "2", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Scavengers", "Singular": "Scavenger", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Scav", "Cost": "4", "Duration": "0"}, {"Index": "218", "Coins": "0", "Cards": "1", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Sirs Bailey", "Singular": "Sir Bailey", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "1", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "SBai", "Cost": "5", "Duration": "0"}, {"Index": "219", "Coins": "0", "Cards": "2", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Sirs Destry", "Singular": "Sir Destry", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "1", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "SDes", "Cost": "5", "Duration": "0"}, {"Index": "220", "Coins": "0", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "2", "Trash": "0", "Plural": "Sirs Martin", "Singular": "Sir Martin", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "1", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "SMar", "Cost": "4", "Duration": "0"}, {"Index": "221", "Coins": "0", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Sirs Michael", "Singular": "Sir Michael", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "1", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "SMi", "Cost": "5", "Duration": "0"}, {"Index": "222", "Coins": "0", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Sirs Vander", "Singular": "Sir Vander", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "1", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "SVan", "Cost": "5", "Duration": "0"}, {"Index": "223", "Coins": "3", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Spoils", "Singular": "Spoils", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "1", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Spoils", "Cost": "*0", "Duration": "0"}, {"Index": "224", "Coins": "1", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "2", "Trash": "0", "Plural": "Squires", "Singular": "Squire", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "?", "Abbreviation": "Sq", "Cost": "2", "Duration": "0"}, {"Index": "225", "Coins": "?", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "1", "Trash": "0", "Plural": "Storerooms", "Singular": "Storeroom", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "SR", "Cost": "3", "Duration": "0"}, {"Index": "226", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Survivors", "Singular": "Survivors", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "1", "Actions": "0", "Abbreviation": "Surv", "Cost": "0", "Duration": "0"}, {"Index": "227", "Coins": "0", "Cards": "1", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Urchins", "Singular": "Urchin", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Urc", "Cost": "3", "Duration": "0"}, {"Index": "228", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Vagrants", "Singular": "Vagrant", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Vag", "Cost": "2", "Duration": "0"}, {"Index": "229", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Wandering Minstrels", "Singular": "Wandering Minstrel", "Shelter": "0", "Expansion": "Dark Ages", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "2", "Abbreviation": "WM", "Cost": "4", "Duration": "0"}, {"Index": "230", "Coins": "0", "Cards": "2", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Advisors", "Singular": "Advisor", "Shelter": "0", "Expansion": "Guilds", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "1", "Abbreviation": "Advi", "Cost": "4", "Duration": "0"}, {"Index": "231", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Bakers", "Singular": "Baker", "Shelter": "0", "Expansion": "Guilds", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Bak", "Cost": "5", "Duration": "0"}, {"Index": "232", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Butchers", "Singular": "Butcher", "Shelter": "0", "Expansion": "Guilds", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Butc", "Cost": "5", "Duration": "0"}, {"Index": "233", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "1", "Buys": "1", "Trash": "0", "Plural": "Candlestick Makers", "Singular": "Candlestick Maker", "Shelter": "0", "Expansion": "Guilds", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Cand", "Cost": "2", "Duration": "0"}, {"Index": "234", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "3", "Plural": "Doctors", "Singular": "Doctor", "Shelter": "0", "Expansion": "Guilds", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Doc", "Cost": "3", "Duration": "0"}, {"Index": "235", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Heralds", "Singular": "Herald", "Shelter": "0", "Expansion": "Guilds", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "1", "Abbreviation": "Hera", "Cost": "4", "Duration": "0"}, {"Index": "236", "Coins": "0", "Cards": "3", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Journeymen", "Singular": "Journeyman", "Shelter": "0", "Expansion": "Guilds", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Jour", "Cost": "5", "Duration": "0"}, {"Index": "237", "Coins": "1", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Masterpieces", "Singular": "Masterpiece", "Shelter": "0", "Expansion": "Guilds", "Looter": "0", "Reaction": "0", "Treasure": "1", "Knight": "0", "VP": "0", "Victory": "0", "Action": "0", "Ruins": "0", "Actions": "0", "Abbreviation": "Mast", "Cost": "3", "Duration": "0"}, {"Index": "238", "Coins": "1", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "1", "Trash": "0", "Plural": "Merchant Guilds", "Singular": "Merchant Guild", "Shelter": "0", "Expansion": "Guilds", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "MGui", "Cost": "5", "Duration": "0"}, {"Index": "239", "Coins": "0", "Cards": "1", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Plazas", "Singular": "Plaza", "Shelter": "0", "Expansion": "Guilds", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "2", "Abbreviation": "Plaz", "Cost": "4", "Duration": "0"}, {"Index": "240", "Coins": "0", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "0", "Plural": "Soothsayers", "Singular": "Soothsayer", "Shelter": "0", "Expansion": "Guilds", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Sooth", "Cost": "5", "Duration": "0"}, {"Index": "241", "Coins": "0", "Cards": "0", "Attack": "0", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Stonemasons", "Singular": "Stonemason", "Shelter": "0", "Expansion": "Guilds", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Ston", "Cost": "2", "Duration": "0"}, {"Index": "242", "Coins": "0", "Cards": "0", "Attack": "1", "CoinTokens": "0", "Buys": "0", "Trash": "1", "Plural": "Taxmen", "Singular": "Taxman", "Shelter": "0", "Expansion": "Guilds", "Looter": "0", "Reaction": "0", "Treasure": "0", "Knight": "0", "VP": "0", "Victory": "0", "Action": "1", "Ruins": "0", "Actions": "0", "Abbreviation": "Taxm", "Cost": "4", "Duration": "0"}] \ No newline at end of file diff --git a/test_dominioncards.py b/test_dominioncards.py index 66bdfa5..515ad50 100644 --- a/test_dominioncards.py +++ b/test_dominioncards.py @@ -8,15 +8,18 @@ class DominionCardsTest(unittest.TestCase): def test_openings(self): openings = dominioncards.opening_cards() - self.assertEquals(len(openings), 140) + self.assertEquals(len(openings), 189) # Valid opening cards # Cost 0 self.assertIn(dominioncards.Copper, openings) + # Cost 1 + self.assertIn(dominioncards.PoorHouse, openings) + # Cost 2 - self.assertIn(dominioncards.Chapel, openings) + self.assertIn(dominioncards.Squire, openings) # Cost 3 self.assertIn(dominioncards.Ambassador, openings) @@ -36,6 +39,9 @@ def test_openings(self): # Too expensive self.assertNotIn(dominioncards.Bank, openings) + # Not in supply + self.assertNotIn(dominioncards.Hovel, openings) + self.assertNotIn(dominioncards.Spoils, openings) def test_initialization(self): """Test various ways of initializing card objects diff --git a/test_game.py b/test_game.py index 4539394..e8a918d 100644 --- a/test_game.py +++ b/test_game.py @@ -21,6 +21,11 @@ def test_gardens(self): self.assertEquals(game.score_deck({dominioncards.Gardens: 2, dominioncards.Copper: 8}), 2) self.assertEquals(game.score_deck({dominioncards.Gardens: 2, dominioncards.Copper: 7}), 0) + def test_feodum(self): + self.assertEquals(game.score_deck({dominioncards.Feodum: 1, dominioncards.Silver: 9}), 3) + self.assertEquals(game.score_deck({dominioncards.Feodum: 2, dominioncards.Silver: 8}), 4) + self.assertEquals(game.score_deck({dominioncards.Feodum: 2, dominioncards.Silver: 2}), 0) + def test_fairgrounds(self): self.assertEquals(game.score_deck({dominioncards.Fairgrounds: 1, dominioncards.Copper: 1, @@ -31,6 +36,7 @@ def test_fairgrounds(self): def test_duke(self): self.assertEquals(game.score_deck({dominioncards.Duke: 2, dominioncards.Duchy: 2}), 10) + def test_simple(self): self.assertEquals(game.score_deck({ dominioncards.Curse: 1, dominioncards.Estate: 1, dominioncards.Duchy: 1, @@ -75,6 +81,82 @@ def test_score(self): 30) +class GokoGameTest(unittest.TestCase): + + def test_masq_game(self): + g = get_test_game('log.50bbfdf8e4b07d338bca0e67.1364827084306.txt') + self.assertEquals(['Kerry Monroe', 'Warlord Bot', 'Conqueror Bot', 'Villager Bot'], g.all_player_names()) + + accum_results = g.cards_gained_per_player() + player_bought = accum_results[game.BOUGHT][u'Kerry Monroe'] + self.assertEquals(player_bought[dominioncards.Library], 1) + self.assertEquals(player_bought[dominioncards.Gold], 8) + self.assertEquals(player_bought[dominioncards.Masquerade], 1) + self.assertEquals(player_bought[dominioncards.TradeRoute], 1) + self.assertEquals(player_bought[dominioncards.HuntingParty], 2) + self.assertEquals(player_bought[dominioncards.Province], 5) + self.assertEquals(player_bought[dominioncards.Duchy], 3) + self.assertEquals(player_bought[dominioncards.Estate], 1) + + player_received = accum_results[game.GAINED][u'Kerry Monroe'] + self.assertEquals(player_received[dominioncards.Copper], 10) + self.assertEquals(player_received[dominioncards.Fortress], 3) + self.assertEquals(player_received[dominioncards.Masquerade], 2) + self.assertEquals(player_received[dominioncards.Silver], 1) + + last_state = None + game_state_iterator = g.game_state_iterator() + for game_state in game_state_iterator: + last_state = game_state + for player_deck in g.get_player_decks(): + + parsed_deck_comp = player_deck.Deck() + computed_deck_comp = last_state.get_deck_composition( + player_deck.name()) + + for card in set(parsed_deck_comp.keys() + + computed_deck_comp.keys()): + self.longMessage = True + self.assertEqual(parsed_deck_comp.get(card, 0), computed_deck_comp.get(card, 0), card) + + + def test_ruins_game(self): + g = get_test_game('log.50612a9b51c36e573294bfd0.1368579645597.txt') + last_state = None + game_state_iterator = g.game_state_iterator() + for game_state in game_state_iterator: + last_state = game_state + for player_deck in g.get_player_decks(): + + parsed_deck_comp = player_deck.Deck() + computed_deck_comp = last_state.get_deck_composition( + player_deck.name()) + + for card in set(parsed_deck_comp.keys() + + computed_deck_comp.keys()): + self.longMessage = True + self.assertEqual(parsed_deck_comp.get(card, 0), computed_deck_comp.get(card, 0), card) + + def test_goko_unknown_error(self): + g = get_test_game('log.50bbfdf8e4b07d338bca0e67.1366508665569.txt') + last_state = None + game_state_iterator = g.game_state_iterator() + for game_state in game_state_iterator: + last_state = game_state + for player_deck in g.get_player_decks(): + + parsed_deck_comp = player_deck.Deck() + computed_deck_comp = last_state.get_deck_composition( + player_deck.name()) + + for card in set(parsed_deck_comp.keys() + + computed_deck_comp.keys()): + self.longMessage = True + self.assertEqual(parsed_deck_comp.get(card, 0), computed_deck_comp.get(card, 0), card) + + + + class PlayerDeckTest(unittest.TestCase): outpost_game = get_test_game('game-20101015-094051-95e0a59e.html') @@ -112,7 +194,9 @@ def test_deck_changes_per_player(self): def test_card_accum_by_self(self): accum_results = self.accum_game.cards_gained_per_player() player_bought = accum_results[game.BOUGHT][u'Wolphmaniac'] + player_gained = accum_results[game.GAINED][u'Wolphmaniac'] self.assertEquals(player_bought[dominioncards.Spy], 10) + self.assertEquals(player_gained[dominioncards.Spy], 10) self.assertEquals(player_bought[dominioncards.Curse], 10) self.assertEquals(player_bought[dominioncards.Goons], 7) self.assertEquals(player_bought[dominioncards.City], 7) diff --git a/test_parse_game.py b/test_parse_game.py index 64d1e27..a06638a 100644 --- a/test_parse_game.py +++ b/test_parse_game.py @@ -5,6 +5,10 @@ except ImportError, e: import unittest import parse_game +import parse_iso_game +import parse_goko_game +import parse_common + from keys import * import dominioncards import codecs @@ -38,67 +42,67 @@ def assert_equal_card_dicts(indexes, names, msg=None): else: raise AssertionError(msg) -class CaptureCardsTest(unittest.TestCase): - def test_capture_cards(self): - captured = parse_game.capture_cards( +class CaptureIsoCardsTest(unittest.TestCase): + def test_iso_capture_cards(self): + captured = parse_iso_game.capture_cards( 'player0 plays 3 <span class=card-treasure>Coppers</span>.') assert_equal_indexed_lists(captured, ['Copper'] * 3) - captured = parse_game.capture_cards( + captured = parse_iso_game.capture_cards( '... ... and plays the <span class=card-none>Throne Room</span> ' 'again.') assert_equal_indexed_lists(captured, ['Throne Room']) - captured = parse_game.capture_cards( + captured = parse_iso_game.capture_cards( '... player0 gains the ' '<span class=card-reaction>Watchtower</span>.') assert_equal_indexed_lists(captured, ['Watchtower']) - captured = parse_game.capture_cards( + captured = parse_iso_game.capture_cards( '... player1 gains a <span class=card-treasure>Copper</span> ' 'and a <span class=card-curse>Curse</span>') assert_equal_indexed_lists(captured, ['Copper', 'Curse']) - captured = parse_game.capture_cards( + captured = parse_iso_game.capture_cards( 'player1 plays a <span class=card-treasure>Platinum</span>, ' '3 <span class=card-treasure>Golds</span>, and a ' '<span class=card-treasure>Copper</span>.') - assert_equal_indexed_lists(captured, ['Platinum', 'Gold', 'Gold', 'Gold', - 'Copper']) + assert_equal_indexed_lists(captured, ['Platinum', 'Gold', 'Gold', + 'Gold', 'Copper']) - captured = parse_game.capture_cards( + captured = parse_iso_game.capture_cards( 'cards in supply: <span cardname="Black Market" ' 'class=card-none>Black Market</span>, ' '<span cardname="Caravan" class=card-duration>Caravan</span>') assert_equal_indexed_lists(captured, ['Black Market', 'Caravan']) - captured = parse_game.capture_cards( + captured = parse_iso_game.capture_cards( 'player0 plays a <span class=card-none>Coppersmith</span>.') assert_equal_indexed_lists(captured, ['Coppersmith']) - captured = parse_game.capture_cards( + captured = parse_iso_game.capture_cards( 'player4 buys an <span class=card-none>Expand</span>') assert_equal_indexed_lists(captured, ['Expand']) - def test_bane(self): - captured = parse_game.capture_cards( + def test_iso_bane(self): + captured = parse_iso_game.capture_cards( '<span cardname="Chapel" class=card-none>Chapel</span>, <span cardname="Moat" class=card-reaction>Moat</span><span class=bane-star>♦</span>,') assert_equal_indexed_lists(captured, ['Chapel', 'Moat']) class DeleteKeysTest(unittest.TestCase): def test_delete_keys_with_empty_vals(self): d1 = {'p6': {}} - parse_game.delete_keys_with_empty_vals(d1) + parse_common.delete_keys_with_empty_vals(d1) self.assertEquals(d1, {}) def test_ultimately_empty_nested_dict(self): d2 = {1: {OPP: {}}} - parse_game.delete_keys_with_empty_vals(d2) + parse_common.delete_keys_with_empty_vals(d2) self.assertEquals(d2, {}) -class PlayerTrackerTest(unittest.TestCase): +class IsoPlayerTrackerTest(unittest.TestCase): def setUp(self): - self.tracker = parse_game.PlayerTracker() + self.tracker = parse_iso_game.PlayerTracker() def test_simple_tracking(self): self.assertEquals(0, self.tracker.get_active_player( @@ -123,34 +127,34 @@ def test_complicated_tracking(self): expected_output, line) self.assertEquals(self.tracker.current_player(), 1) -class ParseTurnHeaderTest(unittest.TestCase): - def test_normal_turn(self): - parsed_turn_header = parse_game.parse_turn_header( +class ParseIsoTurnHeaderTest(unittest.TestCase): + def test_iso_normal_turn(self): + parsed_turn_header = parse_iso_game.parse_turn_header( "--- player0's turn 3 ---", DEF_NAME_LIST) self.assertEquals(parsed_turn_header['name'], 'p0') self.assertEquals(parsed_turn_header['turn_no'], 3) - def test_possesion_turn(self): - parsed_turn_header = parse_game.parse_turn_header( + def test_iso_possesion_turn(self): + parsed_turn_header = parse_iso_game.parse_turn_header( "--- player0's turn (possessed by player1) ---", DEF_NAME_LIST) self.assertEquals(parsed_turn_header['name'], 'p0') self.assertEquals(parsed_turn_header['pname'], 'p1') - def test_outpost_turn(self): - parsed_turn_header = parse_game.parse_turn_header( + def test_iso_outpost_turn(self): + parsed_turn_header = parse_iso_game.parse_turn_header( """--- player0's extra turn (from <span class=card-duration>Outpost</span>) ---""", DEF_NAME_LIST) self.assertEquals(parsed_turn_header['name'], 'p0') self.assertEquals(parsed_turn_header['outpost'], True) - def test_header_with_leading_space(self): - parsed_turn_header = parse_game.parse_turn_header( + def test_iso_header_with_leading_space(self): + parsed_turn_header = parse_iso_game.parse_turn_header( " --- player0's turn 3 ---", DEF_NAME_LIST) self.assertEquals(parsed_turn_header['name'], 'p0') self.assertEquals(parsed_turn_header['turn_no'], 3) -class ParseTurnTest(unittest.TestCase): - def test_parse_turn(self): - turn_info = parse_game.parse_turn( +class ParseIsoTurnTest(unittest.TestCase): + def test_parse_iso_turn(self): + turn_info = parse_iso_game.parse_turn( u"""--- player0's turn 3 --- player0 plays 3 <span class=card-treasure>Coppers</span>. player0 buys a <span class=card-treasure>Silver</span>. @@ -160,8 +164,8 @@ def test_parse_turn(self): assert_equal_card_lists(turn_info[BUYS], ['Silver']) self.assertEquals(turn_info[MONEY], 3) - def test_chapel_turn(self): - turn_info = parse_game.parse_turn( + def test_iso_chapel_turn(self): + turn_info = parse_iso_game.parse_turn( u"""--- player5's turn 4 --- player5 plays a <span class=card-none>Chapel</span>. ... trashing 2 <span class=card-treasure>Coppers</span>. @@ -170,8 +174,8 @@ def test_chapel_turn(self): assert_equal_card_lists(turn_info[TRASHES], ['Copper', 'Copper']) self.assertTrue(OPP not in turn_info) - def test_bishop_turn(self): - turn_info = parse_game.parse_turn( + def test_iso_bishop_turn(self): + turn_info = parse_iso_game.parse_turn( u"""--- player2's turn 7 --- player2 plays a <span class=card-none>Bishop</span>. ... getting +$1 and +1 â–¼. @@ -185,8 +189,8 @@ def test_bishop_turn(self): self.assertEquals(turn_info[VP_TOKENS], 1) self.assertEquals(turn_info[MONEY], 4) - def test_bishop_turn2(self): - turn_info = parse_game.parse_turn( + def test_iso_bishop_turn2(self): + turn_info = parse_iso_game.parse_turn( u"""--- player3's turn 3 --- player3 plays a <span class=card-none>Bishop</span>. ... getting +$1 and +1 â–¼. @@ -199,8 +203,8 @@ def test_bishop_turn2(self): self.assertEquals(turn_info[VP_TOKENS], 2) self.assertEquals(turn_info[MONEY], 4) - def test_bishop_turn3(self): - turn_info = parse_game.parse_turn( + def test_iso_bishop_turn3(self): + turn_info = parse_iso_game.parse_turn( u""" --- player6's turn 4 --- player6 plays a <span class=card-none>Bishop</span>. ... getting +$1 and +1 â–¼. @@ -212,8 +216,8 @@ def test_bishop_turn3(self): assert_equal_card_lists(turn_info[OPP]['3'][TRASHES], ['Copper']) self.assertEquals(turn_info[MONEY], 1) - def test_trader_gain_silver_instead_of_buy(self): - turn_info = parse_game.parse_turn( + def test_iso_trader_gain_silver_instead_of_buy(self): + turn_info = parse_iso_game.parse_turn( u"""--- player1's turn 8 --- player1 plays a <span class=card-duration>Lighthouse</span>. ... getting +1 action and +$1. @@ -227,8 +231,8 @@ def test_trader_gain_silver_instead_of_buy(self): self.assertFalse(BUYS in turn_info, 'should not be here: ' + str(turn_info.get(BUYS, []))) - def test_trader_gain_silver_instead_of_gain(self): - turn_info = parse_game.parse_turn( + def test_iso_trader_gain_silver_instead_of_gain(self): + turn_info = parse_iso_game.parse_turn( u"""--- player1's turn 11 ---</a> player1 plays a <span class=card-none>Torturer</span>. ... drawing 3 cards. @@ -239,8 +243,8 @@ def test_trader_gain_silver_instead_of_gain(self): player1 buys an <span class=card-none>Upgrade</span>.""", DEF_NAME_LIST) assert_equal_card_lists(turn_info[OPP]['2'][GAINS], ['Silver']) - def test_mine_upgrade_turn(self): - turn_info = parse_game.parse_turn(u"""--- player3's turn 12 --- + def test_iso_mine_upgrade_turn(self): + turn_info = parse_iso_game.parse_turn(u"""--- player3's turn 12 --- player3 plays a <span class=card-none>Mine</span>. ... trashing a <span class=card-treasure>Talisman</span> and gaining a <span class=card-treasure>Gold</span>. player3 plays a <span class=card-treasure>Gold</span>, a <span class=card-treasure>Royal Seal</span>, and a <span class=card-treasure>Copper</span>. @@ -251,8 +255,8 @@ def test_mine_upgrade_turn(self): assert_equal_card_lists(turn_info[TRASHES], ['Talisman']) self.assertEquals(turn_info[MONEY], 6) - def test_ambassador_turn(self): - turn_info = parse_game.parse_turn( + def test_iso_ambassador_turn(self): + turn_info = parse_iso_game.parse_turn( u""" --- player8's turn 3 --- player8 plays an <span class=card-none>Ambassador</span>. ... player8 reveals an <span class=card-victory>Estate</span>. @@ -265,7 +269,7 @@ def test_ambassador_turn(self): assert_equal_card_lists(turn_info[OPP]['9'][GAINS], ['Estate']) - def test_ambassador_secret_chamber_response_turn(self): + def test_iso_ambassador_secret_chamber_response_turn(self): input_str = u""" --- player0's turn 16 --- player0 plays an <span class=card-none>Ambassador</span>. ... player1 reveals a <span class=card-reaction>Secret Chamber</span>. @@ -274,14 +278,14 @@ def test_ambassador_secret_chamber_response_turn(self): ... player0 reveals a <span class=card-treasure>Copper</span>. ... returning 2 copies to the supply. ... player1 gains a <span class=card-treasure>Copper</span>.""" - turn_info = parse_game.parse_turn(input_str, DEF_NAME_LIST) + turn_info = parse_iso_game.parse_turn(input_str, DEF_NAME_LIST) self.assertEquals(turn_info[NAME], 'p0') assert_equal_card_lists(turn_info[PLAYS], ['Ambassador']) assert_equal_card_lists(turn_info[RETURNS], ['Copper', 'Copper']) assert_equal_card_lists(turn_info[OPP]['1'][GAINS], ['Copper']) - def test_ambassador3(self): - turn_info = parse_game.parse_turn( + def test_iso_ambassador3(self): + turn_info = parse_iso_game.parse_turn( """ --- player0's turn 6 --- player0 plays an <span class=card-none>Ambassador</span>. ... player0 reveals a <span class=card-treasure>Copper</span>. @@ -291,8 +295,8 @@ def test_ambassador3(self): assert_equal_card_lists(turn_info[RETURNS], ['Copper']) assert_equal_card_lists(turn_info[OPP]['1'][GAINS], ['Copper']) - def test_ambassador4(self): - turn_info = parse_game.parse_turn( + def test_iso_ambassador4(self): + turn_info = parse_iso_game.parse_turn( """--- player0's turn 4 --- player0 plays an <span class=card-none>Ambassador</span>. ... revealing 2 <span class=card-treasure>Coppers</span> and returning them to the supply. @@ -300,8 +304,8 @@ def test_ambassador4(self): """, DEF_NAME_LIST) assert_equal_card_lists(turn_info[RETURNS], ['Copper', 'Copper']) - def test_ambassador5(self): - turn_info = parse_game.parse_turn("""--- player3's turn 8 --- + def test_iso_ambassador5(self): + turn_info = parse_iso_game.parse_turn("""--- player3's turn 8 --- player3 plays a <span class=card-none>Worker's Village</span>. ... drawing 1 card and getting +2 actions and +1 buy. player3 plays an <span class=card-none>Ambassador</span>. @@ -315,8 +319,8 @@ def test_ambassador5(self): assert_equal_card_lists(turn_info[OPP]['0'][GAINS], ['Copper', 'Copper']) - def test_ambassador6(self): - turn_info = parse_game.parse_turn("""--- player0's turn 8 --- + def test_iso_ambassador6(self): + turn_info = parse_iso_game.parse_turn("""--- player0's turn 8 --- player0 plays a <span class=card-none>Scout</span>. ... player0 reveals a <span class=card-treasure>Silver</span>, 2 <span class=card-treasure>Coppers</span>, and a <span class=card-none>Spy</span>. ... putting nothing into the hand. @@ -327,16 +331,16 @@ def test_ambassador6(self): """, ['foo', 'bar']) assert_equal_card_lists(turn_info[OPP]['1'][GAINS], ['Estate']) - def test_ambassador_moat(self): - turn_info = parse_game.parse_turn(u"""--- player0's turn 10 --- + def test_iso_ambassador_moat(self): + turn_info = parse_iso_game.parse_turn(u"""--- player0's turn 10 --- player0 plays an <span class=card-none>Ambassador</span>. ... player1 reveals a <span class=card-reaction>Moat</span>. ... revealing 2 <span class=card-victory>Estates</span> and returning them to the supply.""", DEF_NAME_LIST) assert_equal_card_lists(turn_info[RETURNS], ['Estate', 'Estate']) - def test_swindler_watchtower(self): - turn_info = parse_game.parse_turn(u"""--- player0's turn 8 ---</a> + def test_iso_swindler_watchtower(self): + turn_info = parse_iso_game.parse_turn(u"""--- player0's turn 8 ---</a> player0 plays a <span class=card-none>Swindler</span>. ... player1 turns up a <span class=card-none>Steward</span> and trashes it. ... replacing player1's <span class=card-none>Steward</span> with a <span class=card-reaction>Watchtower</span>. @@ -347,8 +351,8 @@ def test_swindler_watchtower(self): assert_equal_card_lists(turn_info[OPP]['1'][TRASHES], ['Steward', 'Watchtower']) - def test_trading_post_turn(self): - turn_info = parse_game.parse_turn( + def test_iso_trading_post_turn(self): + turn_info = parse_iso_game.parse_turn( """--- player1's turn 11 --- player1 plays a <span class=card-none>Trading Post</span>. ... player1 trashes a <span class=card-treasure>Copper</span> and an <span class=card-victory>Estate</span>, gaining a <span class=card-treasure>Silver</span> in hand. @@ -361,15 +365,15 @@ def test_trading_post_turn(self): assert_equal_card_lists(turn_info[GAINS], ['Silver']) self.assertEquals(turn_info[MONEY], 3) - def test_sea_hag_turn(self): - turn_info = parse_game.parse_turn( + def test_iso_sea_hag_turn(self): + turn_info = parse_iso_game.parse_turn( """--- player0's turn 14 --- player0 plays a <span class=card-none>Sea Hag</span>. ... player1 discards a <span class=card-none>Courtyard</span> and gains a <span class=card-curse>Curse</span> on top of the deck.""", DEF_NAME_LIST) assert_equal_card_lists(turn_info[OPP]['1'][GAINS], ['Curse']) - def test_sea_hag_turn2(self): - turn_info = parse_game.parse_turn(""" + def test_iso_sea_hag_turn2(self): + turn_info = parse_iso_game.parse_turn(""" --- player0's turn 6 --- player0 plays a <span class=card-none>Sea Hag</span>. ... player1 discards nothing and gains a <span class=card-curse>Curse</span> on top of the deck. @@ -379,8 +383,8 @@ def test_sea_hag_turn2(self): assert_equal_card_lists(turn_info[OPP]['1'][GAINS], ['Curse']) self.assertEquals(turn_info[MONEY], 2) - def test_pirate_ship_turn(self): - turn_info = parse_game.parse_turn( + def test_iso_pirate_ship_turn(self): + turn_info = parse_iso_game.parse_turn( u"""--- player8's turn 7 --- player8 plays a <span class=card-none>Pirate Ship</span>. ... attacking the other players. @@ -399,8 +403,8 @@ def test_pirate_ship_turn(self): self.assertTrue(TRASHES not in turn_info) self.assertEquals(turn_info[PIRATE_TOKENS], 1) - def test_noble_brigand_trash(self): - turn_info = parse_game.parse_turn( + def test_iso_noble_brigand_trash(self): + turn_info = parse_iso_game.parse_turn( """--- player1's turn 10 --- player1 plays a <span class=card-none>Noble Brigand</span>. ... getting +$1. @@ -410,8 +414,8 @@ def test_noble_brigand_trash(self): DEF_NAME_LIST) assert_equal_card_lists(turn_info[OPP]['2'][TRASHES], ['Silver']) - def test_noble_brigand_3_p_trash(self): - turn_info = parse_game.parse_turn( + def test_iso_noble_brigand_3_p_trash(self): + turn_info = parse_iso_game.parse_turn( """--- player1's turn 9 --- player1 plays a <span class=card-none>Noble Brigand</span>. ... getting +$1. @@ -422,8 +426,10 @@ def test_noble_brigand_3_p_trash(self): DEF_NAME_LIST) assert_equal_card_lists(turn_info[OPP]['3'][TRASHES], ['Gold']) - def test_noble_brigand_talisman(self): - turn_info = parse_game.parse_turn( + # THIS TEST IS WRONG + # But iso is long dead, so is anybody ever going to fix it? + def test_iso_noble_brigand_talisman(self): + turn_info = parse_iso_game.parse_turn( """--- player1's turn 15 --- player1 plays an <span class=card-none>Alchemist</span>. ... drawing 2 cards and getting +1 action. @@ -431,8 +437,8 @@ def test_noble_brigand_talisman(self): ... gaining a <span class=card-treasure>Talisman</span>. player1 plays 3 <span class=card-treasure>Coppers</span> and a <span class=card-treasure>Talisman</span>. player1 buys a <span class=card-none>Noble Brigand</span>. -... player2 reveals and discards a <span class=card-treasure>Copper</span> and a <span class=card-none>Hunting Party</span>. ... gaining another <span class=card-none>Noble Brigand</span>. +... player2 reveals and discards a <span class=card-treasure>Copper</span> and a <span class=card-none>Hunting Party</span>. <span class=logonly>(player1 draws: an <span class=card-victory>Estate</span>, a <span class=card-none>Scrying Pool</span>, a <span class=card-treasure>Potion</ span>, an <span class=card-none>Alchemist</span>, and a <span class=card-treasure>Silver</span>.)</span> """, DEF_NAME_LIST) @@ -440,8 +446,8 @@ def test_noble_brigand_talisman(self): - def test_bank_turn(self): - turn_info = parse_game.parse_turn(u""" + def test_iso_bank_turn(self): + turn_info = parse_iso_game.parse_turn(u""" --- player2's turn 10 --- player2 plays a <span class=card-treasure>Silver</span>, 2 <span class=card-treasure>Coppers</span>, and a <span class=card-treasure>Gold</span>. player2 plays a <span class=card-treasure>Bank</span>. @@ -450,8 +456,8 @@ def test_bank_turn(self): """, DEF_NAME_LIST) self.assertEquals(turn_info[MONEY], 12) - def test_philospher_stone_turn(self): - turn_info = parse_game.parse_turn(u""" + def test_iso_philospher_stone_turn(self): + turn_info = parse_iso_game.parse_turn(u""" --- player4's turn 15 --- player4 plays a <span class=card-none>Laboratory</span>. ... drawing 2 cards and getting +1 action. @@ -474,8 +480,8 @@ def test_philospher_stone_turn(self): """, DEF_NAME_LIST) self.assertEquals(turn_info[MONEY], 10) - def test_gain_via_workshop_turn(self): - turn_info = parse_game.parse_turn(u""" + def test_iso_gain_via_workshop_turn(self): + turn_info = parse_iso_game.parse_turn(u""" --- player0's turn 4 --- player0 plays a <span class=card-none>Workshop</span>. ... gaining a <span class=card-none>Bridge</span>. @@ -488,8 +494,8 @@ def test_gain_via_workshop_turn(self): assert_equal_card_lists(turn_info[BUYS], ['Pawn']) self.assertEquals(turn_info[MONEY], 2) - def test_golem_chapel_moat_turn(self): - turn_info = parse_game.parse_turn(u"""--- player0's turn 9 --- + def test_iso_golem_chapel_moat_turn(self): + turn_info = parse_iso_game.parse_turn(u"""--- player0's turn 9 --- player0 plays a <span class=card-none>Golem</span>. ... revealing a <span class=card-none>Witch</span>, and a <span class=card-none>Chapel</span>. ... playing the <span class=card-none>Witch</span> first. @@ -501,8 +507,8 @@ def test_golem_chapel_moat_turn(self): assert_equal_card_lists(turn_info[PLAYS], ['Golem', 'Witch', 'Chapel']) assert_equal_card_lists(turn_info[TRASHES], ['Estate']) - def test_throneroom_throneroom_pirateship_chapel_turn(self): - turn_info = parse_game.parse_turn(u"""--- player0's turn 20 --- + def test_iso_throneroom_throneroom_pirateship_chapel_turn(self): + turn_info = parse_iso_game.parse_turn(u"""--- player0's turn 20 --- player0 plays a <span class=card-none>Throne Room</span>. ... and plays a <span class=card-none>Throne Room</span>. ... ... and plays a <span class=card-none>Pirate Ship</span>. @@ -518,8 +524,8 @@ def test_throneroom_throneroom_pirateship_chapel_turn(self): ... ... ... trashing nothing.""", DEF_NAME_LIST) assert_equal_card_lists(turn_info[TRASHES], ['Gardens']) - def test_throne_room_beaurcrat_turn(self): - turn_info = parse_game.parse_turn(u"""--- player1's turn 13 --- + def test_iso_throne_room_bureaucrat_turn(self): + turn_info = parse_iso_game.parse_turn(u"""--- player1's turn 13 --- player1 plays a <span class=card-none>Throne Room</span>. ... and plays a <span class=card-none>Bureaucrat</span>. ... ... gaining a <span class=card-treasure>Silver</span> and putting it on the deck. @@ -531,8 +537,8 @@ def test_throne_room_beaurcrat_turn(self): assert_equal_card_lists(turn_info[GAINS], ['Silver', 'Silver']) self.assertTrue(not OPP in turn_info, turn_info) - def test_witch_turn(self): - turn_info = parse_game.parse_turn(u""" + def test_iso_witch_turn(self): + turn_info = parse_iso_game.parse_turn(u""" --- player0's turn 5 --- player0 plays a <span class=card-none>Witch</span>. ... drawing 2 cards. @@ -545,8 +551,8 @@ def test_witch_turn(self): assert_equal_card_lists(turn_info[OPP]['1'][GAINS], ['Curse']) self.assertEquals(turn_info[MONEY], 2) - def test_swindler_turn(self): - turn_info = parse_game.parse_turn(u"""--- player1's turn 9 --- + def test_iso_swindler_turn(self): + turn_info = parse_iso_game.parse_turn(u"""--- player1's turn 9 --- player1 plays a <span class=card-none>Swindler</span>. ... getting +$2. ... player2 turns up a <span class=card-treasure>Silver</span> and trashes it. @@ -558,8 +564,8 @@ def test_swindler_turn(self): assert_equal_card_lists(turn_info[OPP]['3'][GAINS], ['Shanty Town']) assert_equal_card_lists(turn_info[OPP]['3'][TRASHES], ['Shanty Town']) - def test_swindler_turn2(self): - turn_info = parse_game.parse_turn(u"""--- player0's turn 10 --- + def test_iso_swindler_turn2(self): + turn_info = parse_iso_game.parse_turn(u"""--- player0's turn 10 --- player0 plays a <span class=card-none>Worker's Village</span>. ... drawing 1 card and getting +2 actions and +1 buy. player0 plays a <span class=card-none>Swindler</span>. @@ -577,8 +583,8 @@ def test_swindler_turn2(self): assert_equal_card_lists(turn_info[OPP]['1'][GAINS], ['Curse', 'Estate']) - def test_watchtower_mountebank_turn(self): - turn_info = parse_game.parse_turn(u"""--- player0's turn 18 --- + def test_iso_watchtower_mountebank_turn(self): + turn_info = parse_iso_game.parse_turn(u"""--- player0's turn 18 --- player0 plays a <span class=card-none>Throne Room</span>. ... and plays a <span class=card-none>Mountebank</span>. ... ... getting +$2. @@ -587,8 +593,8 @@ def test_watchtower_mountebank_turn(self): ... ... ... revealing a <span class=card-reaction>Watchtower</span> and trashing the <span class=card-treasure>Copper</span>.""", DEF_NAME_LIST) assert_equal_card_lists(turn_info[OPP]['1'][TRASHES], ['Curse', 'Copper'], turn_info) - def test_mountebank_traders_turn(self): - turn_info = parse_game.parse_turn( + def test_iso_mountebank_traders_turn(self): + turn_info = parse_iso_game.parse_turn( u"""--- player1's turn 6 --- player1 plays a <span class=card-none>Mountebank</span>. ... getting +$2. @@ -602,9 +608,9 @@ def test_mountebank_traders_turn(self): assert_equal_card_lists(turn_info[OPP]['2'][GAINS], ['Silver', 'Silver'], turn_info) - def test_mountebank_traders_turn2(self): + def test_iso_mountebank_traders_turn2(self): # this test is broken because it's an unfixed bug. - turn_info = parse_game.parse_turn( + turn_info = parse_iso_game.parse_turn( u"""--- player1's turn 12 ---</a> player1 plays a <span class=card-none>Mountebank</span>. ... getting +$2. @@ -628,15 +634,15 @@ def test_mountebank_traders_turn2(self): # councilroom.com/game?game_id=game-20111017-111832-61528d54.html&debug=1#ChickenSedan-show-turn-13 # with trader/multiple hoard interaction. - def test_watchtower_buy_curse_turn(self): - turn_info = parse_game.parse_turn(u"""--- player0's turn 11 --- + def test_iso_watchtower_buy_curse_turn(self): + turn_info = parse_iso_game.parse_turn(u"""--- player0's turn 11 --- player0 buys a <span class=card-curse>Curse</span>. ... revealing a <span class=card-reaction>Watchtower</span> and trashing the <span class=card-curse>Curse</span>.""", DEF_NAME_LIST) assert_equal_card_lists(turn_info[BUYS], ['Curse']) assert_equal_card_lists(turn_info[TRASHES], ['Curse']) - def test_thief_turn(self): - turn_info = parse_game.parse_turn(u"""--- player0's turn 10 --- + def test_iso_thief_turn(self): + turn_info = parse_iso_game.parse_turn(u"""--- player0's turn 10 --- player0 plays a <span class=card-none>Thief</span>. ... player1 reveals a <span class=card-treasure>Silver</span> and an <span class=card-victory>Estate</span>. ... player0 trashes one of player1's <span class=card-treasure>Silvers</span>. @@ -645,20 +651,20 @@ def test_thief_turn(self): assert_equal_card_lists(turn_info[OPP]['1'][TRASHES], ['Silver']) assert_equal_card_lists(turn_info[GAINS], ['Silver']) - def test_mint_turn(self): - turn_info = parse_game.parse_turn(u"""--- player0's turn 16 --- + def test_iso_mint_turn(self): + turn_info = parse_iso_game.parse_turn(u"""--- player0's turn 16 --- player0 plays a <span class=card-none>Mint</span>. ... revealing a <span class=card-treasure>Platinum</span> and gaining another one.""", DEF_NAME_LIST) assert_equal_card_lists(turn_info[GAINS], ['Platinum']) - def test_explorer_turn(self): - turn_info = parse_game.parse_turn(u"""--- player1's turn 19 --- + def test_iso_explorer_turn(self): + turn_info = parse_iso_game.parse_turn(u"""--- player1's turn 19 --- player1 plays an <span class=card-none>Explorer</span>. ... revealing a <span class=card-victory>Province</span> and gaining a <span class=card-treasure>Gold</span> in hand.""", DEF_NAME_LIST) assert_equal_card_lists(turn_info[GAINS], ['Gold']) - def test_mining_village_money(self): - turn_info = parse_game.parse_turn(u"""--- player1's turn 9 --- + def test_iso_mining_village_money(self): + turn_info = parse_iso_game.parse_turn(u"""--- player1's turn 9 --- player1 plays a <span class=card-none>Mining Village</span>. ... (player1 reshuffles.) ... drawing 1 card and getting +2 actions. @@ -666,8 +672,8 @@ def test_mining_village_money(self): """, DEF_NAME_LIST) self.assertEquals(turn_info[MONEY], 2) - def test_fools_gold_reveal_turn(self): - turn_info = parse_game.parse_turn( + def test_iso_fools_gold_reveal_turn(self): + turn_info = parse_iso_game.parse_turn( u""" --- player1's turn 10 --- player1 buys a <span class=card-victory>Province</span>. ... player2 reveals a <span class=card-treasure-reaction>Fool's Gold</span>. @@ -677,8 +683,8 @@ def test_fools_gold_reveal_turn(self): assert_equal_card_lists(turn_info[OPP]['2'][TRASHES], ["Fool's Gold"]) assert_equal_card_lists(turn_info[OPP]['2'][GAINS], ["Gold"]) - def test_saboteur_turn(self): - turn_info = parse_game.parse_turn(u"""--- player2's turn 7 --- + def test_iso_saboteur_turn(self): + turn_info = parse_iso_game.parse_turn(u"""--- player2's turn 7 --- player2 plays an <span class=card-none>Ironworks</span>. ... gaining an <span class=card-victory-action>Island</span>. ... (player2 reshuffles.) @@ -692,8 +698,8 @@ def test_saboteur_turn(self): assert_equal_card_lists(turn_info[OPP]['3'][TRASHES], ['Baron']) assert_equal_card_lists(turn_info[OPP]['9'][TRASHES], ['Baron']) - def test_saboteur_turn2(self): - turn_info = parse_game.parse_turn("""--- player9's turn 14 --- + def test_iso_saboteur_turn2(self): + turn_info = parse_iso_game.parse_turn("""--- player9's turn 14 --- player9 plays a <span class=card-none>Saboteur</span>. ... player2 reveals a <span class=card-none>Saboteur</span> and trashes it. ... player2 gains a <span class=card-treasure>Silver</span> to replace it. @@ -706,8 +712,8 @@ def test_saboteur_turn2(self): assert_equal_card_lists(turn_info[OPP]['2'][GAINS], ['Silver']) assert_equal_card_lists(turn_info[OPP]['3'][TRASHES], ['Island']) - def test_lookout_turn(self): - turn_info = parse_game.parse_turn("""--- player2's turn 9 --- + def test_iso_lookout_turn(self): + turn_info = parse_iso_game.parse_turn("""--- player2's turn 9 --- player2 plays a <span class=card-none>Lookout</span>. ... getting +1 action. ... (player2 reshuffles.) @@ -717,8 +723,8 @@ def test_lookout_turn(self): ... putting a card back on the deck.""", DEF_NAME_LIST) assert_equal_card_lists(turn_info[TRASHES], ['Copper']) - def test_coppersmith(self): - turn_info = parse_game.parse_turn(u"""--- player0's turn 3 --- + def test_iso_coppersmith(self): + turn_info = parse_iso_game.parse_turn(u"""--- player0's turn 3 --- player0 plays a <span class=card-none>Coppersmith</span>. ... making each <span class=card-treasure>Copper</span> worth $2. player0 plays a <span class=card-treasure>Silver</span> and 2 <span class=card-treasure>Coppers</span>. @@ -729,16 +735,16 @@ def test_coppersmith(self): ['Coppersmith', 'Silver', 'Copper', 'Copper']) self.assertEquals(turn_info[MONEY], 6) - def test_UTF8_name(self): - turn_info = parse_game.parse_turn(u"""--- player1's turn 1 --- + def test_iso_UTF8_name(self): + turn_info = parse_iso_game.parse_turn(u"""--- player1's turn 1 --- player1 plays 3 <span class=card-treasure>Coppers</span>. player1 buys a <span class=card-none>Workshop</span>. """, ['', u'Görling']) self.assertEquals(turn_info[NAME], u'Görling') self.assertEquals(turn_info[MONEY], 3) - def test_possessed_turn(self): - turn_info = parse_game.parse_turn( + def test_iso_possessed_turn(self): + turn_info = parse_iso_game.parse_turn( u"""--- player0's turn (possessed by player1) --- player0 plays a <span class=card-none>University</span>. ... gaining a <span class=card-none>Mint</span>. @@ -752,8 +758,8 @@ def test_possessed_turn(self): self.assertTrue(turn_info[POSSESSION]) self.assertFalse(OPP in turn_info) - def test_possessed_turn2(self): - turn_info = parse_game.parse_turn( + def test_iso_possessed_turn2(self): + turn_info = parse_iso_game.parse_turn( u"""--- player0's turn (possessed by player1) --- player0 plays a <span class=card-none>Remodel</span>. ... trashing a <span class=card-none>Mountebank</span>. @@ -768,8 +774,8 @@ def test_possessed_turn2(self): assert_equal_card_lists(turn_info[GAINS], ['Gold', 'Remodel']) self.assertFalse(BUYS in turn_info) - def test_possession_ambassador(self): - turn_info = parse_game.parse_turn(u""" + def test_iso_possession_ambassador(self): + turn_info = parse_iso_game.parse_turn(u""" --- player0's turn (possessed by player1) ---</a> player0 plays an <span class=card-none>Ambassador</span>. ... revealing 2 <span class=card-victory>Duchies</span> and returning them to the supply. @@ -782,8 +788,8 @@ def test_possession_ambassador(self): assert_equal_card_lists(turn_info[OPP]['0'][RETURNS], [ 'Duchy', 'Duchy']) - def test_possession_bishop(self): - turn_info = parse_game.parse_turn(u""" + def test_iso_possession_bishop(self): + turn_info = parse_iso_game.parse_turn(u""" --- player0's turn (possessed by player1) ---</b> player0 plays a <span class=card-none>Bishop</span>. ... getting +$1 and +1 â–¼. @@ -798,9 +804,9 @@ def test_possession_bishop(self): self.assertEquals(turn_info[OPP]['0'][VP_TOKENS], 4) -class CanonicalizeNamesTest(unittest.TestCase): - def test_canonicalize_names(self): - replaced = parse_game.canonicalize_names( +class CanonicalizeIsoNamesTest(unittest.TestCase): + def test_iso_canonicalize_names(self): + replaced = parse_iso_game.canonicalize_names( """--- Zor Prime's turn 1 --- Zor Prime plays 3 <span class=card-treasure>Coppers</span>.""", ['Zor Prime']) @@ -808,8 +814,8 @@ def test_canonicalize_names(self): """--- player0's turn 1 --- player0 plays 3 <span class=card-treasure>Coppers</span>.""") - def test_name_as_substring(self): - replaced = parse_game.canonicalize_names( + def test_iso_name_as_substring(self): + replaced = parse_iso_game.canonicalize_names( """--- contain ed's turn 9 --- contain ed plays a <span class=card-none>Swindler</span>. ... getting +$2. @@ -820,8 +826,8 @@ def test_name_as_substring(self): ... getting +$2. ... player0 turns up a <span class=card-treasure>Silver</span> and trashes it.""") - def test_evil_short_name(self): - replaced = parse_game.canonicalize_names( + def test_iso_evil_short_name(self): + replaced = parse_iso_game.canonicalize_names( """ --- d's turn 2 --- d plays 3 <span class=card-treasure>Coppers</span>. d buys a <span class=card-none>Masquerade</span>. @@ -832,9 +838,9 @@ def test_evil_short_name(self): player0 buys a <span class=card-none>Masquerade</span>. (player0 reshuffles.)""") -class SplitTurnsTest(unittest.TestCase): - def test_split_simple(self): - split_turns = parse_game.split_turns( +class SplitIsoTurnsTest(unittest.TestCase): + def test_iso_split_simple(self): + split_turns = parse_iso_game.split_turns( """--- player1's turn 1 --- Foo --- player2's turn 2 --- @@ -843,8 +849,8 @@ def test_split_simple(self): self.assertEquals(split_turns[0], "--- player1's turn 1 ---\nFoo\n") self.assertEquals(split_turns[1], "--- player2's turn 2 ---\nBar\n") - def test_possesion_split(self): - split_turns = parse_game.split_turns( + def test_iso_possesion_split(self): + split_turns = parse_iso_game.split_turns( """--- player0's turn (possessed by player1) --- player0 plays an <span class=card-duration>Outpost</span>. --- player2's turn 2 --- @@ -856,16 +862,16 @@ def test_possesion_split(self): "--- player0's turn (possessed by player1) ---\n" "player0 plays an <span class=card-duration>Outpost</span>.\n") - def test_outpost_split(self): - split_turns = parse_game.split_turns( + def test_iso_outpost_split(self): + split_turns = parse_iso_game.split_turns( """--- player0's turn 1 --- ... foo --- player0's extra turn (from <span class=card-duration>Outpost</span>) --- bar""") self.assertEquals(len(split_turns), 2) - def test_curious_split(self): - split_turns = parse_game.split_turns( + def test_iso_curious_split(self): + split_turns = parse_iso_game.split_turns( u"""--- player3's turn 1 --- player3 plays 3 <span class=card-treasure>Coppers</span>. player3 buys a <span class=card-treasure>Silver</span>. @@ -882,9 +888,9 @@ def test_curious_split(self): (player3 reshuffles.)""") self.assertEquals(len(split_turns), 3) -class ParseTurnsTest(unittest.TestCase): - def test_simple_input(self): - turns_info = parse_game.parse_turns(u"""--- player3's turn 1 --- +class ParseIsoTurnsTest(unittest.TestCase): + def test_iso_simple_input(self): + turns_info = parse_iso_game.parse_turns(u"""--- player3's turn 1 --- player3 plays 3 <span class=card-treasure>Coppers</span>. player3 buys a <span class=card-treasure>Silver</span>. <span class=logonly>(player3 draws: an <span class=card-victory>Estate</span> and 4 <span class=card-treasure>Coppers</span>.)</span> @@ -914,8 +920,8 @@ def test_simple_input(self): assert_equal_card_lists(turn2Z[PLAYS], ['Copper'] * 4) assert_equal_card_lists(turn2Z[BUYS], ['Silver']) - def test_possesion_output_turns(self): - turns = parse_game.parse_turns(u"""--- player0's turn (possessed by player1) --- + def test_iso_possesion_output_turns(self): + turns = parse_iso_game.parse_turns(u"""--- player0's turn (possessed by player1) --- player0 plays an <span class=card-duration>Outpost</span>. player0 plays 3 <span class=card-treasure>Golds</span>. player0 buys a <span class=card-treasure>Gold</span>. @@ -935,9 +941,9 @@ def test_possesion_output_turns(self): self.assertTrue(OUTPOST in turns[1]) assert_equal_card_lists(turns[1][BUYS], ['Gold']) -class ParseDeckTest(unittest.TestCase): - def test_deck(self): - parsed_deck = parse_game.parse_deck(u"""<b>Snead: 75 points</b> (7 <span class=card-victory>Colonies</span>, 2 <span class=card-victory-action>Islands</span>, and an <span class=card-victory>Estate</span>); 22 turns +class ParseIsoDeckTest(unittest.TestCase): + def test_iso_deck(self): + parsed_deck = parse_iso_game.parse_deck(u"""<b>Snead: 75 points</b> (7 <span class=card-victory>Colonies</span>, 2 <span class=card-victory-action>Islands</span>, and an <span class=card-victory>Estate</span>); 22 turns opening: <span class=card-victory-action>Island</span> / <span class=card-treasure>Silver</span> [15 cards] 2 <span class=card-victory-action>Islands</span>, 1 <span class=card-none>Chapel</span>, 1 <span class=card-duration>Tactician</span>, 1 <span class=card-treasure>Silver</span>, 2 <span class=card-treasure>Platinums</span>, 1 <span class=card-victory>Estate</span>, 7 <span class=card-victory>Colonies</span>""") self.assertEquals(parsed_deck[NAME], 'Snead') @@ -952,60 +958,60 @@ def test_deck(self): 'Estate': 1, 'Colony': 7}) - def test_deck_with_resign(self): - parsed_deck = parse_game.parse_deck(u"""<b>#1 kiwi</b>: resigned (1st); 13 turns + def test_iso_deck_with_resign(self): + parsed_deck = parse_iso_game.parse_deck(u"""<b>#1 kiwi</b>: resigned (1st); 13 turns opening: <span class=card-none>Shanty Town</span> / <span class=card-none>Baron</span> [23 cards] 8 <span class=card-none>Shanty Towns</span>, 5 <span class=card-none>Rabbles</span>, 2 <span class=card-none>Expands</span>, 1 <span class=card-none>Market</span>, 6 <span class=card-treasure>Coppers</span>, 1 <span class=card-victory>Estate</span> """) self.assertEquals(parsed_deck[RESIGNED], True) - def test_20101213_style_deck(self): - parsed_deck = parse_game.parse_deck(u"""<b>#1 zorkkorz</b>: 43 points (4 <span class=card-victory>Provinces</span>, 3 <span class=card-victory>Duchies</span>, 2 <span class=card-victory>Dukes</span>, and 2 <span class=card-victory-treasure>Harems</span>); 21 turns + def test_iso_20101213_style_deck(self): + parsed_deck = parse_iso_game.parse_deck(u"""<b>#1 zorkkorz</b>: 43 points (4 <span class=card-victory>Provinces</span>, 3 <span class=card-victory>Duchies</span>, 2 <span class=card-victory>Dukes</span>, and 2 <span class=card-victory-treasure>Harems</span>); 21 turns opening: <span class=card-none>Upgrade</span> / <span class=card-duration>Lighthouse</span> [25 cards] 2 <span class=card-victory>Dukes</span>, 2 <span class=card-victory-treasure>Harems</span>, 2 <span class=card-none>Upgrades</span>, 1 <span class=card-none>Expand</span>, 1 <span class=card-duration>Lighthouse</span>, 4 <span class=card-treasure>Silvers</span>, 6 <span class=card-treasure>Golds</span>, 3 <span class=card-victory>Duchies</span>, 4 <span class=card-victory>Provinces</span> """) self.assertEquals(parsed_deck[NAME], 'zorkkorz') def test20101213_style_deck_with_paren_name(self): - parsed_deck = parse_game.parse_deck(u"""<b>#1 Foo (Bar)</b>: 43 points (4 <span class=card-victory>Provinces</span>, 3 <span class=card-victory>Duchies</span>, 2 <span class=card-victory>Dukes</span>, and 2 <span class=card-victory-treasure>Harems</span>); 21 turns + parsed_deck = parse_iso_game.parse_deck(u"""<b>#1 Foo (Bar)</b>: 43 points (4 <span class=card-victory>Provinces</span>, 3 <span class=card-victory>Duchies</span>, 2 <span class=card-victory>Dukes</span>, and 2 <span class=card-victory-treasure>Harems</span>); 21 turns opening: <span class=card-none>Upgrade</span> / <span class=card-duration>Lighthouse</span> [25 cards] 2 <span class=card-victory>Dukes</span>, 2 <span class=card-victory-treasure>Harems</span>, 2 <span class=card-none>Upgrades</span>, 1 <span class=card-none>Expand</span>, 1 <span class=card-duration>Lighthouse</span>, 4 <span class=card-treasure>Silvers</span>, 6 <span class=card-treasure>Golds</span>, 3 <span class=card-victory>Duchies</span>, 4 <span class=card-victory>Provinces</span> """) self.assertEquals(parsed_deck[NAME], 'Foo (Bar)') - def test_20101226_evil_fing_name(self): - parsed_deck = parse_game.parse_deck(u"""<b>#1 20 points</b>: 43 points (4 <span class=card-victory>Provinces</span>, 3 <span class=card-victory>Duchies</span>, 2 <span class=card-victory>Dukes</span>, and 2 <span class=card-victory-treasure>Harems</span>); 21 turns + def test_iso_20101226_evil_fing_name(self): + parsed_deck = parse_iso_game.parse_deck(u"""<b>#1 20 points</b>: 43 points (4 <span class=card-victory>Provinces</span>, 3 <span class=card-victory>Duchies</span>, 2 <span class=card-victory>Dukes</span>, and 2 <span class=card-victory-treasure>Harems</span>); 21 turns opening: <span class=card-none>Upgrade</span> / <span class=card-duration>Lighthouse</span> [25 cards] 2 <span class=card-victory>Dukes</span>, 2 <span class=card-victory-treasure>Harems</span>, 2 <span class=card-none>Upgrades</span>, 1 <span class=card-none>Expand</span>, 1 <span class=card-duration>Lighthouse</span>, 4 <span class=card-treasure>Silvers</span>, 6 <span class=card-treasure>Golds</span>, 3 <span class=card-victory>Duchies</span>, 4 <span class=card-victory>Provinces</span> """) self.assertEquals(parsed_deck[NAME], '20 points') self.assertEquals(parsed_deck[POINTS], 43) - def test_deck_with_VP(self): - parsed_deck = parse_game.parse_deck(u"""<b>Jon: 19 points</b> (16 â–¼ and a <span class=card-victory>Duchy</span>); 20 turns + def test_iso_deck_with_VP(self): + parsed_deck = parse_iso_game.parse_deck(u"""<b>Jon: 19 points</b> (16 â–¼ and a <span class=card-victory>Duchy</span>); 20 turns opening: <span class=card-none>Salvager</span> / <span class=card-none>Black Market</span> [7 cards] 2 <span class=card-none>Bishops</span>, 1 <span class=card-duration>Tactician</span>, 1 <span class=card-treasure>Silver</span>, 2 <span class=card-treasure>Golds</span>, 1 <span class=card-victory>Duchy</span>""") self.assertEquals(parsed_deck[VP_TOKENS], 16) - def test_deck_with_VP2(self): - parsed_deck = parse_game.parse_deck(u"""<b>Chrome: 12 points</b> (a <span class=card-victory>Province</span> and 6 â–¼); 13 turns + def test_iso_deck_with_VP2(self): + parsed_deck = parse_iso_game.parse_deck(u"""<b>Chrome: 12 points</b> (a <span class=card-victory>Province</span> and 6 â–¼); 13 turns opening: <span class=card-none>Ironworks</span> / <span class=card-none>Black Market</span> [25 cards] 5 <span class=card-duration>Merchant Ships</span>, 5 <span class=card-none>Universities</span>, 2 <span class=card-none>Apprentices</span>, 2 <span class=card-none>Warehouses</span>, 1 <span class=card-none>Bishop</span>, 1 <span class=card-none>Black Market</span>, 1 <span class=card-none>Explorer</span>, 1 <span class=card-none>Worker's Village</span>, 6 <span class=card-treasure>Coppers</span>, 1 <span class=card-victory>Province</span>""") self.assertEquals(parsed_deck[VP_TOKENS], 6) - def test_parse_old_deck_with_paren(self): - parsed_deck = parse_game.parse_deck(u"""<b>Jeremy (player1): 66 points</b> (8 <span class=card-victory>Provinces</span>, 4 <span class=card-victory>Duchies</span>, and 6 <span class=card-victory>Estates</span>); 28 turns + def test_iso_parse_old_deck_with_paren(self): + parsed_deck = parse_iso_game.parse_deck(u"""<b>Jeremy (player1): 66 points</b> (8 <span class=card-victory>Provinces</span>, 4 <span class=card-victory>Duchies</span>, and 6 <span class=card-victory>Estates</span>); 28 turns opening: <span class=card-none>Smithy</span> / <span class=card-treasure>Silver</span> [38 cards] 2 <span class=card-none>Smithies</span>, 7 <span class=card-treasure>Coppers</span>, 5 <span class=card-treasure>Silvers</span>, 6 <span class=card-treasure>Golds</span>, 6 <span class=card-victory>Estates</span>, 4 <span class=card-victory>Duchies</span>, 8 <span class=card-victory>Provinces</span> """) self.assertEquals(parsed_deck[NAME], 'Jeremy (player1)') - def test_deck_with_VP3(self): - parsed_deck = parse_game.parse_deck(u"""<b>Chrome: 12 points</b> (a <span class=card-victory>Province</span> and 26 â–¼); 13 turns + def test_iso_deck_with_VP3(self): + parsed_deck = parse_iso_game.parse_deck(u"""<b>Chrome: 12 points</b> (a <span class=card-victory>Province</span> and 26 â–¼); 13 turns opening: <span class=card-none>Ironworks</span> / <span class=card-none>Black Market</span> [25 cards] 5 <span class=card-duration>Merchant Ships</span>, 5 <span class=card-none>Universities</span>, 2 <span class=card-none>Apprentices</span>, 2 <span class=card-none>Warehouses</span>, 1 <span class=card-none>Bishop</span>, 1 <span class=card-none>Black Market</span>, 1 <span class=card-none>Explorer</span>, 1 <span class=card-none>Worker's Village</span>, 6 <span class=card-treasure>Coppers</span>, 1 <span class=card-victory>Province</span>""") self.assertEquals(parsed_deck[VP_TOKENS], 26) - def test_parse_empty_deck(self): + def test_iso_parse_empty_deck(self): # it's random BS like this that makes writing a dominion log parser # a pain. - parsed_deck = parse_game.parse_deck(u"""<b>torchrat: 0 points</b> (nothing); 24 turns + parsed_deck = parse_iso_game.parse_deck(u"""<b>torchrat: 0 points</b> (nothing); 24 turns opening: <span class=card-none>Moneylender</span> / <span class=card-treasure>Silver</span> [0 cards] """) self.assertEquals(parsed_deck[VP_TOKENS], 0) @@ -1065,9 +1071,9 @@ def test_possession_turn(self): parse_game.assign_win_points(g) self.assertEquals(g[DECKS][0][WIN_POINTS], 1.0) -class ParseGameHeaderTest(unittest.TestCase): - def test_parse_header(self): - parsed_header = parse_game.parse_header(u"""<html><head><link rel="stylesheet" href="/dom/client.css"><title>Dominion Game #2051
AndMyAxe! wins!
+class ParseIsoGameHeaderTest(unittest.TestCase):
+    def test_iso_parse_header(self):
+        parsed_header = parse_iso_game.parse_header(u"""Dominion Game #2051
AndMyAxe! wins!
 All Provinces are gone.
 
 cards in supply: Black Market, Caravan, Chancellor, City, Council Room, Counting House, Explorer, Market, Mine, and Pawn""")
@@ -1083,8 +1089,8 @@ def test_parse_header(self):
                                                     "Mine",
                                                     "Pawn"])
 
-    def test_header_with_resign(self):
-        parsed_header = parse_game.parse_header(u"""Dominion Game #262
uberme wins!
+    def test_iso_header_with_resign(self):
+        parsed_header = parse_iso_game.parse_header(u"""Dominion Game #262
uberme wins!
 All but one player has resigned.
  
 cards in supply: Bank, Black Market, Colony, Hoard, Ironworks, Militia, Moneylender, Platinum, Rabble, Scout, Sea Hag, and Worker's Village
@@ -1093,8 +1099,8 @@ def test_header_with_resign(self):
         self.assertEquals(parsed_header[RESIGNED], True)
 
 
-    def test_parse_header_with_multi_end(self):
-        parsed_header = parse_game.parse_header(u"""Dominion Game #3865
stormybriggs wins!
+    def test_iso_parse_header_with_multi_end(self):
+        parsed_header = parse_iso_game.parse_header(u"""Dominion Game #3865
stormybriggs wins!
 Duchies, Estates, and Peddlers are all gone.
 
 cards in supply: Colony, Grand Market, Loan, Mine, Monument, Outpost, Peddler, Platinum, Stash, Warehouse, Witch, and Worker's Village
@@ -1103,24 +1109,699 @@ def test_parse_header_with_multi_end(self):
                                                       'Peddler'])
         self.assertEquals(parsed_header[RESIGNED], False)
 
-class ValidateNamesTest(unittest.TestCase):
-    def test_keyword_in_name(self):
+class ValidateIsoNamesTest(unittest.TestCase):
+    def test_iso_keyword_in_name(self):
         decks = [{NAME: 'gains a curse'}]
-        self.assertRaises(parse_game.BogusGameError, parse_game.validate_names,
+        self.assertRaises(parse_common.BogusGameError, parse_iso_game.validate_names,
                           decks)
 
-    def test_starts_with_period(self):
+    def test_iso_starts_with_period(self):
         decks = [{NAME: '.evil'}]
-        self.assertRaises(parse_game.BogusGameError, parse_game.validate_names,
+        self.assertRaises(parse_common.BogusGameError, parse_iso_game.validate_names,
                           decks)
 
-    def test_name_is_a(self):
+    def test_iso_name_is_a(self):
         decks = [{NAME: 'a'}]
-        self.assertRaises(parse_game.BogusGameError, parse_game.validate_names,
+        self.assertRaises(parse_common.BogusGameError, parse_iso_game.validate_names,
                           decks)
 
-class ParseGameTest(unittest.TestCase):
-    def test_parse_game(self):
+class ParseGokoGameTest(unittest.TestCase):
+
+    def test_goko_BoM_Graverobber(self):
+        game_contents = codecs.open('testing/testdata/log.512afbf3e4b0feac797bdad9.1363670261150.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+
+    def test_goko_JoaT(self):
+        game_contents = codecs.open('testing/testdata/log.50ff462be4b02b7235c36c70.1364860449322.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][5][PLAYS],
+                                ["Jack of All Trades", "Copper", "Copper",
+                                 "Copper", "Copper"])
+
+
+    def test_goko_city_diadem(self):
+        # Another test of counting city and actions, this time with junking
+        game_contents = codecs.open('testing/testdata/log.50612a9b51c36e573294bfd0.1369817660556.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][18][MONEY], 33)
+
+    def test_goko_turn_1_resign_with_large_supply(self):
+        # Tests everything that can be tested in a game with a turn 1 resign:
+        # Has supply with platinum, colonies, shelters, ruins, and a bane.
+        game_contents = codecs.open('testing/testdata/log.50612a9b51c36e573294bfd0.1367635173776.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents, False)
+        assert_equal_card_lists(parsed_game[SUPPLY],
+                          ["University",
+                           "Trade Route",
+                           "Urchin",
+                           "Marauder",
+                           "Remodel",
+                           "Spice Merchant",
+                           "Tournament",
+                           "Young Witch",
+                           "Goons",
+                           "Hunting Grounds",
+                           "Bank",
+                           "Copper",
+                           "Silver",
+                           "Gold",
+                           "Estate",
+                           "Duchy",
+                           "Province",
+                           "Curse",
+                           "Colony",
+                           "Platinum",
+                           "Potion",
+                           "Ruins"])
+        self.assertEquals(parsed_game[PLAYERS], ['ftl', 'Lord Bottington'])
+        self.assertEquals(parsed_game[RATING_SYSTEM], 'unknown')
+        assert_equal_card_lists(parsed_game[START_DECKS][0][START_DECK], 
+                                ["Necropolis", "Overgrown Estate", 
+                                 "Hovel", "Copper", "Copper", "Copper",
+                                 "Copper", "Copper", "Copper", "Copper"])
+        assert_equal_card_lists(parsed_game[START_DECKS][1][START_DECK], 
+                                ["Necropolis", "Overgrown Estate", 
+                                 "Hovel", "Copper", "Copper", "Copper",
+                                 "Copper", "Copper", "Copper", "Copper"])
+        self.assertEquals(parsed_game[DECKS][0][VP_TOKENS], 0)
+        self.assertEquals(parsed_game[DECKS][0][POINTS], 0)
+        self.assertEquals(parsed_game[DECKS][1][VP_TOKENS], 0)
+
+        self.assertEquals(parsed_game[DECKS][1][POINTS], -1)
+        self.assertEquals(parsed_game[DECKS][1][NAME], 'ftl')
+        self.assertEquals(parsed_game[DECKS][1][ORDER], 1)
+
+    def test_goko_possession_outpost_shenanigans(self):
+        # Possession+golem+outpost insanity! 
+        game_contents = codecs.open('testing/testdata/log.50612a9b51c36e573294bfd0.1369284870596.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        self.assertEquals(parsed_game[DECKS][0][WIN_POINTS], 1.5)
+        self.assertEquals(parsed_game[DECKS][1][WIN_POINTS], 1.5)
+        self.assertEquals(parsed_game[DECKS][2][WIN_POINTS], 0.0)
+        self.assertEquals(parsed_game[DECKS][0][NAME], 'ftl')
+        self.assertEquals(parsed_game[DECKS][1][NAME], 'guest5451')
+        self.assertEquals(parsed_game[DECKS][2][NAME], 'Guest_979018')
+
+        n_turns_possessed = 0
+        n_turns_outpost = 0
+        n_turns_normal = 0
+        for t in parsed_game[DECKS][0][TURNS]:
+            if OUTPOST in t and t[OUTPOST]:
+                n_turns_outpost = n_turns_outpost + 1
+            if POSSESSION in t and t[POSSESSION]:
+                n_turns_possessed = n_turns_possessed + 1
+                self.assertEqual(t['pname'], 'guest5451')
+            if 'turn_no' in t and t['turn_no']:
+                n_turns_normal = n_turns_normal + 1
+
+        self.assertEqual(n_turns_possessed, 22)
+        self.assertEqual(n_turns_outpost, 4)
+        self.assertEqual(n_turns_normal, 13)
+
+    def test_goko_possessed_trashing(self):
+        # Game with Possession, Golem, Bishop, Trading Post. 
+        game_contents = codecs.open('testing/testdata/log.50a6c1abe4b03214bb7822e9.1365829398920.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        self.assertTrue(parsed_game[DECKS][1][TURNS][26][POSSESSION])
+        self.assertEqual(parsed_game[DECKS][1][TURNS][26][VP_TOKENS], 2)
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][26][TRASHES],[])
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][26][GAINS],[])
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][26][OPP]['0'][GAINS],["Pawn"])
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][26][OPP]['0'][TRASHES],["Estate"])
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][18][GAINS],[])
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][18][TRASHES],[])
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][18][OPP]['0'][GAINS],["Silver"])
+
+    def test_goko_multi_card_trashing(self):
+        # Trashing more than one card at a time with chapel
+        game_contents = codecs.open('testing/testdata/log.5191c02ce4b0ce5189dc951a.1368506756212.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][2][TRASHES], 
+                                ['Estate','Copper','Copper','Copper'])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][3][TRASHES], 
+                                ['Copper','Copper','Copper'])
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][4][TRASHES], 
+                                ['Estate','Estate','Copper','Copper'])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][5][TRASHES], 
+                                ['Estate','Copper','Bureaucrat', 'Estate'])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][8][TRASHES], 
+                                ['Copper','Copper','Curse', 'Copper'])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][10][TRASHES], 
+                                ['Curse', 'Estate'])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][11][TRASHES], 
+                                ['Curse'])
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][15][TRASHES], 
+                                ['Curse', 'Curse'])
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][16][TRASHES], 
+                                ['Curse', 'Copper', 'Copper'])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][19][TRASHES], 
+                                ['Curse','Curse'])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][20][TRASHES], 
+                                ['Curse','Curse'])
+
+    def test_goko_watchtower_border_village_mountebank_marauder_spoils(self):
+        # Watchtower test - reacting to a junking attack, buying, and gaining
+        # Also has spoils which get returned. And Noble Brigand. 
+        game_contents = codecs.open('testing/testdata/log.50612a9b51c36e573294bfd0.1368579645597.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        self.assertEqual(parsed_game[RATING_SYSTEM], 'unrated')
+        self.assertEqual(parsed_game[DECKS][0][NAME], 'ftl')
+        self.assertEqual(parsed_game[DECKS][1][NAME], 'Lord Bottington')
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][5][OPP]['1'][GAINS], ["Curse", "Copper", "Ruined Library"])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][5][GAINS], ["Spoils", "Watchtower"])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][5][BUYS], ["Border Village"])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][6][RETURNS], ["Spoils"])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][9][BUYS], ["Estate"])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][9][TRASHES], ["Estate"])
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][15][OPP]['0'][GAINS], ["Ruined Library"])
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][15][OPP]['0'][TRASHES], ["Ruined Library"])
+        self.assertEqual(parsed_game[DECKS][0][TURNS][21][MONEY], 12)
+
+    def test_goko_counterfeit_spoils(self):
+        # Spoils doesn't SAY it gets returned to the supply...  needs to be
+        # manually adjusted. This is tough with Counterfeit. 
+        # Oh, and there's a Rogue here. 
+        game_contents = codecs.open('testing/testdata/log.51500f81e4b0b989d044f1f8.1364838799465.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents, False)
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][10][RETURNS],
+                                ["Spoils"])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][12][RETURNS],
+                                ["Spoils"])
+
+    def test_goko_ambassador_lighthouse(self):
+        # Test ambassador and lighthouse
+        game_contents = codecs.open('testing/testdata/log.51532c8ce4b083ccc5b0febe.1364825843533.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents, False)
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][4][RETURNS],
+                                ["Copper","Copper"])
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][7][RETURNS], [])
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][7][OPP]['0'][GAINS], ["Copper"])
+        self.assertEqual(parsed_game[DECKS][0][TURNS][3][MONEY],4)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][4][MONEY],5)
+
+    def test_goko_multiplayer_quitter(self):
+        # What happens if someone quits in a multiplayer game? 
+        game_contents = codecs.open('testing/testdata/log.51919af0e4b0d001ef25b885.1368496912009.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        self.assertEquals(parsed_game[DECKS][0][WIN_POINTS], 2.0)
+        self.assertEquals(parsed_game[DECKS][1][WIN_POINTS], 2.0)
+        self.assertEquals(parsed_game[DECKS][2][WIN_POINTS], 0.0)
+        self.assertEquals(parsed_game[DECKS][3][WIN_POINTS], 0.0)
+        self.assertEquals(parsed_game[DECKS][0][NAME], 'Defender Bot')
+        self.assertEquals(parsed_game[DECKS][1][NAME], 'Banker Bot')
+        self.assertEquals(parsed_game[DECKS][2][NAME], 'Villager Bot')
+        self.assertEquals(parsed_game[DECKS][3][NAME], 'guest2666.0000')
+        assert_equal_card_lists(parsed_game[DECKS][3][TURNS][2][PLAYS], 
+                                ['Copper', 'Copper','Copper','Copper'])
+
+
+    def test_goko_outpost(self):
+        # Tests outpost - simpler case, no weirdness with possession. 
+        # Also has durations and embargo and smugglers. 
+        # And different start decks!
+        game_contents = codecs.open('testing/testdata/log.5154cd91e4b0a260b599ab6b.1364855887188.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        assert_equal_card_lists(parsed_game[START_DECKS][0][START_DECK], 
+                                ["Silver", "Silver", "Silver", 
+                                 "Silver", "Silver", "Silver",
+                                 "Duchy", "Duchy", "Duchy", "Estate"])
+        assert_equal_card_lists(parsed_game[START_DECKS][1][START_DECK], 
+                                ["Copper", "Copper", "Silver", 
+                                 "Silver", "Silver", "Silver",
+                                 "Silver", "Duchy", "Duchy", "Province"])
+        self.assertTrue(parsed_game[DECKS][2][TURNS][3][OUTPOST])
+        self.assertTrue(parsed_game[DECKS][2][TURNS][5][OUTPOST])
+        self.assertTrue(parsed_game[DECKS][0][TURNS][5][OUTPOST])
+        self.assertTrue(parsed_game[DECKS][2][TURNS][8][OUTPOST])
+        self.assertTrue(parsed_game[DECKS][2][TURNS][11][OUTPOST])
+        self.assertTrue(parsed_game[DECKS][0][TURNS][9][OUTPOST])
+        self.assertFalse(OUTPOST in parsed_game[DECKS][0][TURNS][0])
+
+    def test_goko_possession_forager(self):
+        # Tests possession - simple case, no weirdness with outpost or TR.
+        # Has forager.
+        game_contents = codecs.open('testing/testdata/log.514b28bee4b0b79c883b5a60.1364852529283.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        assert_equal_card_lists(parsed_game[SUPPLY],
+                          ["Vineyard",
+                           "Forager",
+                           "Lookout",
+                           "Navigator",
+                           "Procession",
+                           "Festival",
+                           "Mine",
+                           "Stables",
+                           "Nobles",
+                           "Possession",
+                           "Copper",
+                           "Silver",
+                           "Gold",
+                           "Estate",
+                           "Duchy",
+                           "Province",
+                           "Curse",
+                           "Potion"])
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][3][PLAYS], 
+                                ["Navigator", "Copper", "Copper"])
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][6][PLAYS], 
+                                ["Procession", "Navigator", "Navigator", 
+                                 "Copper", "Copper"])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][9][PLAYS], 
+                                ["Stables", "Festival", "Forager", 
+                                 "Forager", "Potion"])
+        self.assertEqual(parsed_game[DECKS][0][TURNS][9][MONEY], 5)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][14]['pname'], 
+                         'Hazardous_Lazarus')
+        self.assertEqual(parsed_game[DECKS][0][TURNS][14][GAINS], [])
+        self.assertEqual(parsed_game[DECKS][0][TURNS][14][TRASHES], [])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][14][OPP]['0'][GAINS], ["Navigator", "Gold"])
+
+    def test_goko_forager_last_play_of_turn(self):
+        # Forager coin-counting despite being played at odd times
+        game_contents = codecs.open('testing/testdata/log.50612a9b51c36e573294bfd0.1369385726617.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        self.assertEqual(parsed_game[DECKS][1][TURNS][41][MONEY], 2)
+
+    def test_goko_forager_rogue(self):
+        # Forager coin-counting after rogue steals its trashed treasures
+        game_contents = codecs.open('testing/testdata/log.50f5dcbde4b03946044c889a.1364837024406.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][2][MONEY],5)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][4][MONEY],6)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][6][MONEY],6)
+        self.assertEqual(parsed_game[DECKS][2][TURNS][8][MONEY],5)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][9][MONEY],7)
+        self.assertEqual(parsed_game[DECKS][2][TURNS][9][MONEY],8)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][10][MONEY],6)
+        self.assertEqual(parsed_game[DECKS][2][TURNS][16][MONEY],5)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][17][MONEY],4)
+
+    def test_goko_variable_coin_cards_part_1(self):
+        # Cards that give variable payoffs:
+        # These cards give a VARIABLE VALUE when played depending on choices by
+        # the player or the game state. 
+        game_contents = codecs.open('testing/testdata/log.50612a9b51c36e573294bfd0.1369424447034.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        #Moneylender:
+        self.assertEqual(parsed_game[DECKS][0][TURNS][6][MONEY], 4)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][10][MONEY], 0)
+        #Pawn 
+        self.assertEqual(parsed_game[DECKS][0][TURNS][4][MONEY], 5)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][7][MONEY], 3)
+        #Steward 
+        self.assertEqual(parsed_game[DECKS][0][TURNS][14][MONEY], 3)
+        self.assertEqual(parsed_game[DECKS][1][TURNS][18][MONEY], 8)
+        #Baron 
+        self.assertEqual(parsed_game[DECKS][0][TURNS][18][MONEY], 3)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][22][MONEY], 7)
+        #Minion
+        self.assertEqual(parsed_game[DECKS][0][TURNS][23][MONEY], 0)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][8][MONEY], 5)
+
+        #Salvager    
+        self.assertEqual(parsed_game[DECKS][0][TURNS][24][MONEY], 14)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][7][MONEY], 3)
+
+        #Harvest
+        self.assertEqual(parsed_game[DECKS][0][TURNS][11][MONEY], 5)
+        self.assertEqual(parsed_game[DECKS][1][TURNS][20][MONEY], 11)
+
+        #Fool's Gold
+        self.assertEqual(parsed_game[DECKS][0][TURNS][14][MONEY], 3)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][20][MONEY], 8)
+
+        #Count
+        self.assertEqual(parsed_game[DECKS][0][TURNS][21][MONEY], 12)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][23][MONEY], 0)
+
+        #Bank
+        self.assertEqual(parsed_game[DECKS][0][TURNS][27][MONEY], 14)
+
+    def test_goko_variable_coin_cards_part_2(self):
+        # More variable-value tests
+        game_contents = codecs.open('testing/testdata/log.50612a9b51c36e573294bfd0.1369437968246.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+
+        #Secret chamber 
+        self.assertEqual(parsed_game[DECKS][1][TURNS][12][MONEY], 4)
+
+        #Vault
+        self.assertEqual(parsed_game[DECKS][1][TURNS][4][MONEY], 6)
+
+        #Tribute
+        self.assertEqual(parsed_game[DECKS][0][TURNS][4][MONEY], 7)
+
+        #Trade Route
+        self.assertEqual(parsed_game[DECKS][0][TURNS][6][MONEY], 3)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][8][MONEY], 5)
+
+        #Tournament
+        self.assertEqual(parsed_game[DECKS][0][TURNS][7][MONEY], 5)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][8][MONEY], 5)
+
+        #Ironworks
+        self.assertEqual(parsed_game[DECKS][0][TURNS][9][MONEY], 6)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][13][MONEY], 6)
+
+        #Ironmonger
+        self.assertEqual(parsed_game[DECKS][0][TURNS][7][MONEY], 5)
+        self.assertEqual(parsed_game[DECKS][1][TURNS][3][MONEY], 5)
+
+        #Poor House
+        self.assertEqual(parsed_game[DECKS][0][TURNS][15][MONEY], 6)
+
+        # Storeroom
+        self.assertEqual(parsed_game[DECKS][1][TURNS][8][MONEY], 6)
+
+        #Diadem. 
+        self.assertEqual(parsed_game[DECKS][0][TURNS][16][MONEY], 8)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][19][MONEY], 7)
+
+        #City
+        self.assertEqual(parsed_game[DECKS][0][TURNS][11][MONEY], 5)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][18][MONEY], 8)
+
+    def test_goko_diadem(self):
+        game_contents = codecs.open('testing/testdata/log.50612a9b51c36e573294bfd0.1369810215227.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][12][MONEY], 19)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][14][MONEY], 20)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][15][MONEY], 29)
+
+    def test_goko_trashing_fortress(self):
+        # Make sure fortress doesn't count as getting trashed
+        game_contents = codecs.open('testing/testdata/log.50d9be02e4b0a3565c3644d5.1364832440947.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        assert_equal_card_lists(parsed_game[DECKS][2][TURNS][16][PLAYS], 
+                                ["Fortress","Margrave","Fortress","Margrave",
+                                 "Forge"])
+        assert_equal_card_lists(parsed_game[DECKS][2][TURNS][16][TRASHES],[]) 
+        assert_equal_card_lists(parsed_game[DECKS][2][TURNS][16][GAINS],
+                                ["Province"]) 
+
+    def test_goko_masquerade(self):
+        game_contents = codecs.open('testing/testdata/log.50bbfdf8e4b07d338bca0e67.1364827084306.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        assert_equal_card_lists(parsed_game[DECKS][3][TURNS][4][PASSES], ['Copper'])
+        assert_equal_card_lists(parsed_game[DECKS][3][TURNS][4][RECEIVES], ['Estate'])
+
+        assert_equal_card_lists(parsed_game[DECKS][3][TURNS][4][OPP]['1'][PASSES], ['Estate'])
+        assert_equal_card_lists(parsed_game[DECKS][3][TURNS][4][OPP]['1'][RECEIVES], ['Estate'])
+
+        assert_equal_card_lists(parsed_game[DECKS][3][TURNS][4][OPP]['3'][PASSES], ['Copper'])
+        assert_equal_card_lists(parsed_game[DECKS][3][TURNS][4][OPP]['3'][RECEIVES], ['Copper'])
+
+        assert_equal_card_lists(parsed_game[DECKS][3][TURNS][4][OPP]['0'][PASSES], ['Estate'])
+        assert_equal_card_lists(parsed_game[DECKS][3][TURNS][4][OPP]['0'][RECEIVES], ['Copper'])
+
+        assert_equal_card_lists(parsed_game[DECKS][3][TURNS][11][OPP]['0'][PASSES], ['Copper'])
+        assert_equal_card_lists(parsed_game[DECKS][3][TURNS][11][OPP]['0'][RECEIVES], ['Fortress'])
+
+        assert_equal_card_lists(parsed_game[DECKS][3][TURNS][11][OPP]['1'][PASSES], ['Copper'])
+        assert_equal_card_lists(parsed_game[DECKS][3][TURNS][11][OPP]['1'][RECEIVES], ['Copper'])
+
+        assert_equal_card_lists(parsed_game[DECKS][3][TURNS][11][PASSES], ['Copper'])
+        assert_equal_card_lists(parsed_game[DECKS][3][TURNS][11][RECEIVES], ['Copper'])
+
+
+        assert_equal_card_lists(parsed_game[DECKS][3][TURNS][11][OPP]['3'][PASSES], ['Fortress'])
+        assert_equal_card_lists(parsed_game[DECKS][3][TURNS][11][OPP]['3'][RECEIVES], ['Copper'])
+
+    def test_goko_tr_feast(self):
+        game_contents = codecs.open('testing/testdata/log.50f5cc9ae4b0b999402937cf.1365717342731.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][5][TRASHES],
+                                ["Feast"]) # Single feast
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][8][TRASHES],
+                                ["Feast"]) # TR-ed feast
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][10][TRASHES],
+                                ["Feast"]) # TR-ed feast
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][18][TRASHES],
+                                ["Feast"]) # Single feast
+
+
+    def test_goko_trashing_bom_as_things(self):
+        # What happens when Band of Misfits is a mining village?
+        # or if it's a Fortress? Or a Feast, or an Embargo? 
+        game_contents = codecs.open('testing/testdata/log.50612a9b51c36e573294bfd0.1369767124157.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][5][TRASHES],
+                                ["Band of Misfits"]) # As Mining Village
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][8][TRASHES],
+                                ["Band of Misfits"]) # As Feast
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][9][TRASHES],
+                                ["Band of Misfits"]) # As Embargo 
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][10][TRASHES],
+                                ["Band of Misfits"]) # As Treasure Map
+        self.assertEqual(parsed_game[DECKS][1][TURNS][10][MONEY], 6)
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][11][TRASHES],
+                                ["Estate"]) # Bug in goko! Should trash Hermit
+        #assert_equal_card_lists(parsed_game[DECKS][1][TURNS][13][TRASHES],
+                                #["Band of Misfits"]) # As Urchin
+                                # I don't know how to determine Bom as urchin
+        self.assertEqual(parsed_game[DECKS][1][TURNS][14][MONEY], 8)
+
+    def test_goko_kc_tr_trashing_bom_as_things(self):
+        # What happens when Band of Misfits is throned/KCed and then trashed?
+        # Using BoM as Mining Village for this test.
+        game_contents = codecs.open('testing/testdata/log.50612a9b51c36e573294bfd0.1369771564268.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][7][TRASHES],
+                                ["Village", "Band of Misfits"]) # Processioned
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][9][TRASHES],
+                                ["Band of Misfits", "Band of Misfits"]) #KC/TR
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][10][TRASHES],
+                                ["Band of Misfits", "Adventurer", 
+                                 "Band of Misfits"]) 
+        game_contents = codecs.open('testing/testdata/log.50612a9b51c36e573294bfd0.1369774866910.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][8][TRASHES],
+                                ["Band of Misfits", "Mining Village"]) 
+
+    def test_goko_bom_as_nothing(self):
+        # What happens when Band of Misfits is unplayable? 
+        # Nothing particularly difficult to parse, as it turns out. 
+        # Still a worthy test case. 
+        game_contents = codecs.open('testing/testdata/log.50612a9b51c36e573294bfd0.1369375420361.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][5][PLAYS],
+                                ['Band of Misfits','Silver','Copper'])
+
+    def test_goko_mining_village_trashing(self):
+        # Try trashing mining village - with something else like Forge.
+        # Also has Pstone! 
+        game_contents = codecs.open('testing/testdata/log.5158c673e4b0ee7f08a5981a.1364826012999.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][19][TRASHES],
+                               ["Mining Village", "Monument", "Mining Village"])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][19][GAINS],
+                               ["Province"])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][19][BUYS],
+                               ["Duchy"])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][19][PLAYS],
+                               ["Mining Village", "Forge", "Highway",
+                                "Mining Village"])
+        self.assertEqual(parsed_game[DECKS][0][TURNS][19][MONEY],4)
+
+        game_contents = codecs.open('testing/testdata/log.5133cb09e4b07f4f5210613a.1364876441937.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        assert_equal_card_lists(parsed_game[DECKS][2][TURNS][21][TRASHES],
+                                ["Mining Village", "Mining Village", 
+                                 "Mining Village", "Curse"])
+        self.assertEqual(parsed_game[DECKS][2][TURNS][21][MONEY],4)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][17][MONEY],8)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][23][MONEY],8)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][25][MONEY],8)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][26][MONEY],8)
+
+    def test_goko_embargo_nv_watchtower_workshop_island(self):
+        # Tets embargo tokens, native village, watchtower's abilities, also
+        # gains without buying via workshop. 
+        game_contents = codecs.open('testing/testdata/log.5139e809e4b05fa06a3117e7.1364835851103.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        self.assertEqual(parsed_game[DECKS][0][NAME], 'Ali Iskandar Othman')
+        self.assertEqual(parsed_game[DECKS][1][NAME], 'konichiwa')
+        self.assertEqual(parsed_game[DECKS][2][NAME], 'dikdik')
+        self.assertEqual(parsed_game[DECKS][3][NAME], 'sandyttc')
+        assert_equal_card_lists(parsed_game[DECKS][2][TURNS][2][TRASHES],
+                                ['Embargo'])
+        self.assertEqual(parsed_game[DECKS][2][TURNS][2][MONEY],5)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][4][MONEY],1)
+        assert_equal_card_lists(parsed_game[DECKS][3][TURNS][4][BUYS],
+                                ['Witch'])
+        assert_equal_card_lists(parsed_game[DECKS][3][TURNS][4][GAINS],
+                                ['Curse'])
+        assert_equal_card_lists(parsed_game[DECKS][3][TURNS][4][TRASHES],
+                                ['Curse'])
+        assert_equal_card_lists(parsed_game[DECKS][2][TURNS][7][PLAYS], 
+                                ['Witch','Copper','Copper'])
+        assert_equal_card_lists(parsed_game[DECKS][2][TURNS][7][OPP]['3'][GAINS], ['Curse']) 
+        assert_equal_card_lists(parsed_game[DECKS][2][TURNS][7][OPP]['3'][TRASHES], ['Curse']) 
+        assert_equal_card_lists(parsed_game[DECKS][2][TURNS][7][OPP]['1'][GAINS], ['Curse']) 
+        assert_equal_card_lists(parsed_game[DECKS][2][TURNS][7][OPP]['1'][TRASHES], ['Curse']) 
+        assert_equal_card_lists(parsed_game[DECKS][2][TURNS][7][OPP]['2'][GAINS], ['Curse']) 
+        assert_equal_card_lists(parsed_game[DECKS][2][TURNS][7][OPP]['2'][TRASHES], ['Curse']) 
+        assert_equal_card_lists(parsed_game[DECKS][2][TURNS][8][PLAYS], 
+                                ['Embargo', 'Silver', 'Copper'])
+        assert_equal_card_lists(parsed_game[DECKS][2][TURNS][8][TRASHES], 
+                                ['Embargo', 'Curse','Curse'])
+        assert_equal_card_lists(parsed_game[DECKS][2][TURNS][8][GAINS], 
+                                ['Curse','Curse'])
+        assert_equal_card_lists(parsed_game[DECKS][2][TURNS][8][BUYS], 
+                                ['Laboratory'])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][9][BUYS], 
+                                ['Watchtower'])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][9][GAINS], 
+                                ['Pirate Ship'])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][9][PLAYS], 
+                                ['Workshop', 'Copper','Copper','Copper'])
+        self.assertEqual(parsed_game[DECKS][0][TURNS][24][MONEY],9)
+
+
+    def test_goko_contraband_steward_catacombs_bom(self):
+        # Tests catacombs' "look at", Steward's options, Contraband's choices
+        # Band of Misfits, Nomad Camp, Bishop, Mining Village. 
+        game_contents = codecs.open('testing/testdata/log.512c5679e4b0feac797bf37f.1364868216483.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][6][VP_TOKENS],2)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][6][MONEY],4)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][23][MONEY], 10)
+
+    def test_goko_trader_and_spice_merchant(self):
+        # Tests trader's would-gain (on Cache!) and Spice Merchant's choices
+        game_contents = codecs.open('testing/testdata/log.512c1423e4b0feac797beef6.1364833567277.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][2][GAINS],
+                                ["Copper","Copper"])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][2][BUYS],
+                                ["Cache"])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][3][TRASHES],
+                                ["Copper"])
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][3][TRASHES],
+                                ["Estate"])
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][3][GAINS],
+                                ["Silver","Silver"])
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][3][BUYS],
+                                ["Silver"])
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][8][GAINS],
+                                ["Silver","Silver"])
+        assert_equal_card_lists(parsed_game[DECKS][1][TURNS][8][BUYS],
+                                ["Cache"])
+        self.assertEqual(parsed_game[DECKS][1][TURNS][10][MONEY],5)
+
+    def test_goko_junking_attacks(self):
+        # Tests swindler and death cart and procession
+        game_contents = codecs.open('testing/testdata/log.512c07c0e4b0c02658fec563.1364840138250.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][1][BUYS],
+                                ["Death Cart"])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][1][GAINS],
+                                ["Ruined Village", "Ruined Library"])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][6][OPP]['1'][TRASHES], ["Cutpurse"])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][6][OPP]['1'][GAINS], ["Pirate Ship"])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][6][GAINS],
+                                ["Ruined Library", "Ruined Village"])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][6][BUYS],
+                                ["Death Cart"])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][6][PLAYS],
+                                ["Swindler", "Copper","Copper"])
+        self.assertEqual(parsed_game[DECKS][1][TURNS][13][MONEY], 6)
+        self.assertEqual(parsed_game[DECKS][1][TURNS][25][MONEY], 10)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][14][MONEY], 8)
+
+    def test_goko_vp_chip_cards(self):
+        # Tests monument, goons, bishop, as well as scrying pool's spy ability
+        game_contents = codecs.open('testing/testdata/log.50612a9b51c36e573294bfd0.1368044241913.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        self.assertEqual(parsed_game[DECKS][1][TURNS][5][VP_TOKENS], 1)
+        self.assertEqual(parsed_game[DECKS][1][TURNS][6][VP_TOKENS], 1)
+        self.assertEqual(parsed_game[DECKS][1][TURNS][8][VP_TOKENS], 2)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][9][VP_TOKENS], 2)
+        self.assertEqual(parsed_game[DECKS][0][TURNS][16][VP_TOKENS], 61)
+        self.assertEqual(parsed_game[DECKS][0][POINTS], 124)
+        self.assertEqual(parsed_game[DECKS][0][VP_TOKENS], 124)
+        self.assertEqual(parsed_game[DECKS][1][POINTS], 25)
+        self.assertEqual(parsed_game[DECKS][1][VP_TOKENS], 16)
+
+    def test_goko_pirate_ship_market_square(self):
+        # Tests pirate ship as well as Market Square reactions with 
+        # three Warlord Bots
+        game_contents = codecs.open('testing/testdata/log.50612a9b51c36e573294bfd0.1368042932530.txt', encoding='utf-8').read()
+        parsed_game=parse_game.parse_game(game_contents)
+        assert_equal_card_lists(parsed_game[SUPPLY],
+                          ["Hamlet",
+                           "Native Village",
+                           "Market Square",
+                           "Shanty Town",
+                           "Village",
+                           "Farming Village",
+                           "Fortress",
+                           "Pirate Ship",
+                           "Worker's Village",
+                           "Bazaar",
+                           "Copper",
+                           "Silver",
+                           "Gold",
+                           "Estate",
+                           "Duchy",
+                           "Province",
+                           "Curse"])
+        self.assertEquals(parsed_game[PLAYERS], ['ftl', 'Warlord Bot I', 
+                                                 'Warlord Bot II', 
+                                                 'Warlord Bot III'])
+        self.assertEquals(parsed_game[RATING_SYSTEM], 'unknown')
+        assert_equal_card_lists(parsed_game[START_DECKS][0][START_DECK], 
+                                ["Estate", "Estate", "Estate", 
+                                 "Copper", "Copper", "Copper",
+                                 "Copper", "Copper", "Copper", "Copper"])
+        self.assertEquals(parsed_game[START_DECKS][3][START_DECK], 
+                          parsed_game[START_DECKS][0][START_DECK])
+        self.assertEquals(parsed_game[DECKS][0][VP_TOKENS], 0)
+        self.assertEquals(parsed_game[DECKS][1][VP_TOKENS], 0)
+        self.assertEquals(parsed_game[DECKS][2][VP_TOKENS], 0)
+        self.assertEquals(parsed_game[DECKS][3][VP_TOKENS], 0)
+
+        self.assertEquals(parsed_game[DECKS][0][NAME], 'Warlord Bot I')
+        self.assertEquals(parsed_game[DECKS][1][NAME], 'Warlord Bot II')
+        self.assertEquals(parsed_game[DECKS][2][NAME], 'Warlord Bot III')
+        self.assertEquals(parsed_game[DECKS][3][NAME], 'ftl')
+
+        self.assertEquals(parsed_game[DECKS][0][ORDER], 2)
+        self.assertEquals(parsed_game[DECKS][1][ORDER], 3)
+        self.assertEquals(parsed_game[DECKS][2][ORDER], 4)
+        self.assertEquals(parsed_game[DECKS][3][ORDER], 1)
+
+        self.assertEquals(parsed_game[DECKS][0][POINTS], 39)
+        self.assertEquals(parsed_game[DECKS][1][POINTS], 21)
+        self.assertEquals(parsed_game[DECKS][2][POINTS], 15)
+        self.assertEquals(parsed_game[DECKS][3][POINTS], 13)
+
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][2][PLAYS], 
+                                ["Pirate Ship", "Copper", "Copper"])
+        self.assertEquals(parsed_game[DECKS][0][TURNS][2][PIRATE_TOKENS], 1)
+        self.assertEquals(parsed_game[DECKS][0][TURNS][3][PIRATE_TOKENS], 0)
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][9][PLAYS], 
+                                ["Village", "Pirate Ship", 
+                                  "Pirate Ship", "Copper", "Copper"])
+        self.assertEquals(parsed_game[DECKS][0][TURNS][9][MONEY],10)
+        self.assertEquals(parsed_game[DECKS][0][TURNS][9][PIRATE_TOKENS], 1)
+        self.assertEquals(parsed_game[DECKS][0][TURNS][3][PIRATE_TOKENS], 0)
+        self.assertEquals(parsed_game[DECKS][0][WIN_POINTS], 4.0)
+        self.assertEquals(parsed_game[DECKS][1][WIN_POINTS], 0.0)
+        self.assertEquals(parsed_game[DECKS][2][WIN_POINTS], 0.0)
+        self.assertEquals(parsed_game[DECKS][3][WIN_POINTS], 0.0)
+
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][13][BUYS],
+                                ["Province", "Province"])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][13][GAINS],
+                                [])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][4][OPP]['0'][GAINS], ["Gold", "Gold", "Gold"])
+        assert_equal_card_lists(parsed_game[DECKS][0][TURNS][4][OPP]['0'][TRASHES], ["Copper"])
+        
+
+
+class ParseIsoGameTest(unittest.TestCase):
+    def test_iso_parse_game(self):
         parsed_game = parse_game.parse_game(u"""Dominion Game #2083
Alenia wins!
 All Provinces are gone.
 
@@ -1251,11 +1932,11 @@ def test_parse_game(self):
 All but one player has resigned.
 dcg wins!
 
""" - def test_parse_game_with_bogus_check(self): - self.assertRaises(parse_game.BogusGameError, parse_game.parse_game, - ParseGameTest.EVIL_GAME_CONTENTS, True) + def test_iso_parse_game_with_bogus_check(self): + self.assertRaises(parse_common.BogusGameError, parse_iso_game.parse_game, + ParseIsoGameTest.EVIL_GAME_CONTENTS, True) - def test_possesion_minigame(self): + def test_iso_possesion_minigame(self): game_contents = u"""Dominion Game #888
Leeko wins!
 Bazaars, Laboratories, and Curses are all gone.
  
@@ -1321,7 +2002,7 @@ def test_possesion_minigame(self):
         self.assertTrue(michiel_deck[TURNS][2][POSSESSION])
         # pprint.pprint(parsed_game)
 
-    def test_parse_game_with_vetos(self):
+    def test_iso_parse_game_with_vetos(self):
         game_contents = u"""Dominion Game #412275
Arsenic03 wins!
 Harems, Wishing Wells, and Duchies are all gone.
 
@@ -1402,7 +2083,7 @@ def test_parse_game_with_vetos(self):
         assert_equal_card_lists([veto_dict['2']], ["Ambassador"])
 
 
-    def test_name_folding(self):
+    def test_iso_name_folding(self):
         """Player names get folded to remove certain strings/substrings. Check these rules."""
 
         # Names should be consistent between the PLAYERS list and the
diff --git a/testing/testdata/log.50612a9b51c36e573294bfd0.1367635173776.txt b/testing/testdata/log.50612a9b51c36e573294bfd0.1367635173776.txt
new file mode 100644
index 0000000..b3899ca
--- /dev/null
+++ b/testing/testdata/log.50612a9b51c36e573294bfd0.1367635173776.txt
@@ -0,0 +1,27 @@
+------------ Game Setup ------------
+Supply cards: University, Trade Route, Urchin, Marauder, Remodel, Spice Merchant, Tournament, Young Witch, Goons, Hunting Grounds, Bank, Copper, Silver, Gold, Estate, Duchy, Province, Curse, Colony, Platinum, Potion, Ruins
+Bane card: Trade Route
+ftl - starting cards: Necropolis, Overgrown Estate, Hovel, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Lord Bottington - starting cards: Necropolis, Overgrown Estate, Hovel, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+ftl - shuffles deck
+Lord Bottington - shuffles deck
+ftl - draws Hovel, Copper, Overgrown Estate, Copper, Necropolis
+Lord Bottington - draws Copper, Copper, Copper, Hovel, Necropolis
+ 
+---------- ftl: turn 1 ----------
+ 
+------------ Game Over ------------
+Lord Bottington - cards: 1 Necropolis, 7 Copper, 1 Overgrown Estate, 1 Hovel
+Lord Bottington - victory point chips: 0
+Lord Bottington - total victory points: 0
+Lord Bottington - turns: 0
+ 
+ftl - resigned
+ftl - cards: 1 Necropolis, 7 Copper, 1 Overgrown Estate, 1 Hovel
+ftl - victory point chips: 0
+ftl - total victory points: 0
+ftl - turns: 0
+ 
+1st place: Lord Bottington
+2nd place: ftl
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.50612a9b51c36e573294bfd0.1368042932530.txt b/testing/testdata/log.50612a9b51c36e573294bfd0.1368042932530.txt
new file mode 100644
index 0000000..ebf4cdb
--- /dev/null
+++ b/testing/testdata/log.50612a9b51c36e573294bfd0.1368042932530.txt
@@ -0,0 +1,893 @@
+------------ Game Setup ------------
+Supply cards: Hamlet, Native Village, Market Square, Shanty Town, Village, Farming Village, Fortress, Pirate Ship, Worker's Village, Bazaar, Copper, Silver, Gold, Estate, Duchy, Province, Curse
+ftl - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Warlord Bot I - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Warlord Bot II - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Warlord Bot III - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+ftl - shuffles deck
+Warlord Bot I - shuffles deck
+Warlord Bot II - shuffles deck
+Warlord Bot III - shuffles deck
+ftl - draws Copper, Copper, Copper, Copper, Estate
+Warlord Bot I - draws Estate, Copper, Copper, Copper, Copper
+Warlord Bot II - draws Copper, Estate, Copper, Copper, Estate
+Warlord Bot III - draws Copper, Copper, Copper, Copper, Copper
+ 
+---------- ftl: turn 1 ----------
+ftl - plays 4 Copper
+ftl - buys Market Square
+ftl - gains Market Square
+ftl - draws Estate, Copper, Copper, Copper, Estate
+ 
+---------- Warlord Bot I: turn 1 ----------
+Warlord Bot I - plays 4 Copper
+Warlord Bot I - buys Pirate Ship
+Warlord Bot I - gains Pirate Ship
+Warlord Bot I - draws Copper, Estate, Copper, Copper, Estate
+ 
+---------- Warlord Bot II: turn 1 ----------
+Warlord Bot II - plays 3 Copper
+Warlord Bot II - buys Silver
+Warlord Bot II - gains Silver
+Warlord Bot II - draws Copper, Copper, Copper, Copper, Estate
+ 
+---------- Warlord Bot III: turn 1 ----------
+Warlord Bot III - plays 5 Copper
+Warlord Bot III - buys Pirate Ship
+Warlord Bot III - gains Pirate Ship
+Warlord Bot III - draws Estate, Copper, Estate, Copper, Estate
+ 
+---------- ftl: turn 2 ----------
+ftl - plays 3 Copper
+ftl - buys Market Square
+ftl - gains Market Square
+ftl - shuffles deck
+ftl - draws Copper, Estate, Copper, Copper, Market Square
+ 
+---------- Warlord Bot I: turn 2 ----------
+Warlord Bot I - plays 3 Copper
+Warlord Bot I - buys Silver
+Warlord Bot I - gains Silver
+Warlord Bot I - shuffles deck
+Warlord Bot I - draws Estate, Pirate Ship, Copper, Copper, Estate
+ 
+---------- Warlord Bot II: turn 2 ----------
+Warlord Bot II - plays 4 Copper
+Warlord Bot II - buys Pirate Ship
+Warlord Bot II - gains Pirate Ship
+Warlord Bot II - shuffles deck
+Warlord Bot II - draws Copper, Copper, Copper, Silver, Copper
+ 
+---------- Warlord Bot III: turn 2 ----------
+Warlord Bot III - plays 2 Copper
+Warlord Bot III - buys Hamlet
+Warlord Bot III - gains Hamlet
+Warlord Bot III - shuffles deck
+Warlord Bot III - draws Copper, Copper, Estate, Copper, Hamlet
+ 
+---------- ftl: turn 3 ----------
+ftl - plays Market Square
+ftl - draws Copper
+ftl - plays 4 Copper
+ftl - buys Market Square
+ftl - gains Market Square
+ftl - draws Estate, Copper, Copper, Estate, Copper
+ 
+---------- Warlord Bot I: turn 3 ----------
+Warlord Bot I - plays Pirate Ship
+Warlord Bot II - reveals Estate, Copper
+Warlord Bot II - trashes Copper
+Warlord Bot II - discards Estate
+Warlord Bot III - reveals Estate, Estate
+Warlord Bot III - discards: Estate, Estate
+ftl - reveals Market Square
+ftl - shuffles deck
+ftl - reveals Market Square
+ftl - discards: Market Square, Market Square
+Warlord Bot I - receives a pirate coin, now has 1 pirate coin(s)
+Warlord Bot I - plays 2 Copper
+Warlord Bot I - buys Hamlet
+Warlord Bot I - gains Hamlet
+Warlord Bot I - draws Estate, Copper, Copper, Copper, Copper
+ 
+---------- Warlord Bot II: turn 3 ----------
+Warlord Bot II - plays 4 Copper, 1 Silver
+Warlord Bot II - buys Gold
+Warlord Bot II - gains Gold
+Warlord Bot II - draws Estate, Copper, Estate, Pirate Ship, Copper
+ 
+---------- Warlord Bot III: turn 3 ----------
+Warlord Bot III - plays Hamlet
+Warlord Bot III - draws Copper
+Warlord Bot III - plays 4 Copper
+Warlord Bot III - buys Pirate Ship
+Warlord Bot III - gains Pirate Ship
+Warlord Bot III - draws Copper, Copper, Pirate Ship, Copper
+Warlord Bot III - shuffles deck
+Warlord Bot III - draws Copper
+ 
+---------- ftl: turn 4 ----------
+ftl - plays 3 Copper
+ftl - buys Market Square
+ftl - gains Market Square
+ftl - draws Copper, Copper, Copper, Estate, Copper
+ 
+---------- Warlord Bot I: turn 4 ----------
+Warlord Bot I - plays 4 Copper
+Warlord Bot I - buys Pirate Ship
+Warlord Bot I - gains Pirate Ship
+Warlord Bot I - draws Silver, Copper
+Warlord Bot I - shuffles deck
+Warlord Bot I - draws Pirate Ship, Copper, Copper
+ 
+---------- Warlord Bot II: turn 4 ----------
+Warlord Bot II - plays Pirate Ship
+Warlord Bot III - reveals Copper, Estate
+Warlord Bot III - trashes Copper
+Warlord Bot III - discards Estate
+ftl - reveals Market Square
+ftl - shuffles deck
+ftl - reveals Estate
+ftl - discards: Market Square, Estate
+Warlord Bot I - reveals Hamlet, Copper
+Warlord Bot I - trashes Copper
+Warlord Bot I - discards Hamlet
+Warlord Bot II - receives a pirate coin, now has 1 pirate coin(s)
+Warlord Bot II - plays 2 Copper
+Warlord Bot II - buys Hamlet
+Warlord Bot II - gains Hamlet
+Warlord Bot II - shuffles deck
+Warlord Bot II - draws Copper, Copper, Hamlet, Estate, Gold
+ 
+---------- Warlord Bot III: turn 4 ----------
+Warlord Bot III - plays Pirate Ship
+ftl - reveals Copper, Copper
+ftl - trashes Copper
+ftl - discards Copper
+Warlord Bot I - reveals Estate, Pirate Ship
+Warlord Bot I - discards: Estate, Pirate Ship
+Warlord Bot II - reveals Copper, Pirate Ship
+Warlord Bot II - trashes Copper
+Warlord Bot II - discards Pirate Ship
+Warlord Bot III - receives a pirate coin, now has 1 pirate coin(s)
+Warlord Bot III - plays 4 Copper
+Warlord Bot III - buys Pirate Ship
+Warlord Bot III - gains Pirate Ship
+Warlord Bot III - draws Pirate Ship, Hamlet, Copper, Copper, Estate
+ 
+---------- ftl: turn 5 ----------
+ftl - plays 4 Copper
+ftl - buys Market Square
+ftl - gains Market Square
+ftl - draws Copper, Market Square, Market Square, Estate, Market Square
+ 
+---------- Warlord Bot I: turn 5 ----------
+Warlord Bot I - plays Pirate Ship
+Warlord Bot II - reveals Estate, Estate
+Warlord Bot II - discards: Estate, Estate
+Warlord Bot III - reveals Estate
+Warlord Bot III - shuffles deck
+Warlord Bot III - reveals Pirate Ship
+Warlord Bot III - discards: Estate, Pirate Ship
+ftl - shuffles deck
+ftl - reveals Estate, Copper
+ftl - trashes Copper
+ftl - reveals reaction Market Square
+ftl - discards Market Square
+ftl - gains Gold
+ftl - reveals reaction Market Square
+ftl - discards Market Square
+ftl - gains Gold
+ftl - reveals reaction Market Square
+ftl - discards Market Square
+ftl - gains Gold
+ftl - discards Estate
+Warlord Bot I - receives a pirate coin, now has 2 pirate coin(s)
+Warlord Bot I - plays 3 Copper, 1 Silver
+Warlord Bot I - buys Pirate Ship
+Warlord Bot I - gains Pirate Ship
+Warlord Bot I - draws Estate, Copper, Estate, Copper, Copper
+ 
+---------- Warlord Bot II: turn 5 ----------
+Warlord Bot II - plays Hamlet
+Warlord Bot II - draws Copper
+Warlord Bot II - plays 3 Copper, 1 Gold
+Warlord Bot II - buys Pirate Ship
+Warlord Bot II - gains Pirate Ship
+Warlord Bot II - draws Copper, Copper, Silver
+Warlord Bot II - shuffles deck
+Warlord Bot II - draws Copper, Copper
+ 
+---------- Warlord Bot III: turn 5 ----------
+Warlord Bot III - plays Hamlet
+Warlord Bot III - draws Pirate Ship
+Warlord Bot III - discards Estate
+Warlord Bot III - receives one action
+Warlord Bot III - plays Pirate Ship
+ftl - reveals Copper, Market Square
+ftl - trashes Copper
+ftl - discards Market Square
+Warlord Bot I - shuffles deck
+Warlord Bot I - reveals Copper, Copper
+Warlord Bot I - trashes Copper
+Warlord Bot I - discards Copper
+Warlord Bot II - reveals Hamlet, Copper
+Warlord Bot II - trashes Copper
+Warlord Bot II - discards Hamlet
+Warlord Bot III - receives a pirate coin, now has 2 pirate coin(s)
+Warlord Bot III - plays Pirate Ship
+ftl - reveals Copper, Estate
+ftl - trashes Copper
+ftl - discards Estate
+Warlord Bot I - reveals Estate, Pirate Ship
+Warlord Bot I - discards: Estate, Pirate Ship
+Warlord Bot II - reveals Estate, Pirate Ship
+Warlord Bot II - discards: Estate, Pirate Ship
+Warlord Bot III - receives a pirate coin, now has 3 pirate coin(s)
+Warlord Bot III - plays 2 Copper
+Warlord Bot III - buys Native Village
+Warlord Bot III - gains Native Village
+Warlord Bot III - draws Copper, Copper, Copper, Estate, Copper
+ 
+---------- ftl: turn 6 ----------
+ftl - draws Copper, Copper, Market Square
+ftl - shuffles deck
+ftl - draws Market Square, Copper
+ 
+---------- Warlord Bot I: turn 6 ----------
+Warlord Bot I - plays 3 Copper
+Warlord Bot I - buys Village
+Warlord Bot I - gains Village
+Warlord Bot I - draws Hamlet, Pirate Ship, Pirate Ship, Silver, Copper
+ 
+---------- Warlord Bot II: turn 6 ----------
+Warlord Bot II - plays 4 Copper, 1 Silver
+Warlord Bot II - buys Pirate Ship
+Warlord Bot II - gains Pirate Ship
+Warlord Bot II - draws Gold, Estate, Pirate Ship, Estate
+Warlord Bot II - shuffles deck
+Warlord Bot II - draws Pirate Ship
+ 
+---------- Warlord Bot III: turn 6 ----------
+Warlord Bot III - plays 4 Copper
+Warlord Bot III - buys Pirate Ship
+Warlord Bot III - gains Pirate Ship
+Warlord Bot III - shuffles deck
+Warlord Bot III - draws Copper, Estate, Copper, Copper, Estate
+ 
+---------- ftl: turn 7 ----------
+ftl - plays Market Square
+ftl - draws Market Square
+ftl - plays Market Square
+ftl - draws Gold
+ftl - plays Market Square
+ftl - draws Estate
+ftl - plays 3 Copper, 1 Gold
+ftl - buys Market Square
+ftl - gains Market Square
+ftl - buys Market Square
+ftl - gains Market Square
+ftl - draws Gold, Estate, Estate, Gold, Market Square
+ 
+---------- Warlord Bot I: turn 7 ----------
+Warlord Bot I - plays Hamlet
+Warlord Bot I - shuffles deck
+Warlord Bot I - draws Estate
+Warlord Bot I - discards Estate
+Warlord Bot I - receives one action
+Warlord Bot I - plays Pirate Ship
+Warlord Bot II - reveals Copper, Copper
+Warlord Bot II - trashes Copper
+Warlord Bot II - discards Copper
+Warlord Bot III - reveals Pirate Ship, Estate
+Warlord Bot III - discards: Pirate Ship, Estate
+ftl - reveals Market Square
+ftl - shuffles deck
+ftl - reveals Market Square
+ftl - discards: Market Square, Market Square
+Warlord Bot I - receives a pirate coin, now has 3 pirate coin(s)
+Warlord Bot I - plays Pirate Ship
+Warlord Bot II - reveals Estate, Pirate Ship
+Warlord Bot II - discards: Estate, Pirate Ship
+Warlord Bot III - reveals Copper, Pirate Ship
+Warlord Bot III - trashes Copper
+Warlord Bot III - discards Pirate Ship
+ftl - reveals Estate, Gold
+ftl - trashes Gold
+ftl - reveals reaction Market Square
+ftl - discards Market Square
+ftl - gains Gold
+ftl - discards Estate
+Warlord Bot I - receives a pirate coin, now has 4 pirate coin(s)
+Warlord Bot I - plays 1 Silver, 1 Copper
+Warlord Bot I - buys Village
+Warlord Bot I - gains Village
+Warlord Bot I - draws Copper, Estate, Copper, Pirate Ship, Estate
+ 
+---------- Warlord Bot II: turn 7 ----------
+Warlord Bot II - plays Pirate Ship
+Warlord Bot III - reveals Copper, Native Village
+Warlord Bot III - trashes Copper
+Warlord Bot III - discards Native Village
+ftl - reveals Market Square, Market Square
+ftl - discards: Market Square, Market Square
+Warlord Bot I - reveals Copper, Copper
+Warlord Bot I - trashes Copper
+Warlord Bot I - discards Copper
+Warlord Bot II - receives a pirate coin, now has 2 pirate coin(s)
+Warlord Bot II - plays 1 Gold
+Warlord Bot II - buys Village
+Warlord Bot II - gains Village
+Warlord Bot II - draws Silver, Hamlet, Copper, Copper
+Warlord Bot II - shuffles deck
+Warlord Bot II - draws Copper
+ 
+---------- Warlord Bot III: turn 7 ----------
+Warlord Bot III - plays 3 Copper
+Warlord Bot III - buys Village
+Warlord Bot III - gains Village
+Warlord Bot III - draws Copper, Pirate Ship, Hamlet, Pirate Ship
+Warlord Bot III - shuffles deck
+Warlord Bot III - draws Copper
+ 
+---------- ftl: turn 8 ----------
+ftl - plays 2 Gold
+ftl - buys Market Square
+ftl - gains Market Square
+ftl - draws Market Square, Copper, Copper, Market Square, Copper
+ 
+---------- Warlord Bot I: turn 8 ----------
+Warlord Bot I - plays Pirate Ship
+Warlord Bot II - reveals Gold, Estate
+Warlord Bot II - trashes Gold
+Warlord Bot II - discards Estate
+Warlord Bot III - reveals Estate, Pirate Ship
+Warlord Bot III - discards: Estate, Pirate Ship
+ftl - shuffles deck
+ftl - reveals Gold, Market Square
+ftl - trashes Gold
+ftl - reveals reaction Market Square
+ftl - discards Market Square
+ftl - gains Gold
+ftl - reveals reaction Market Square
+ftl - discards Market Square
+ftl - gains Gold
+ftl - discards Market Square
+Warlord Bot I - receives a pirate coin, now has 5 pirate coin(s)
+Warlord Bot I - plays 2 Copper
+Warlord Bot I - buys Hamlet
+Warlord Bot I - gains Hamlet
+Warlord Bot I - draws Village
+Warlord Bot I - shuffles deck
+Warlord Bot I - draws Copper, Hamlet, Estate, Hamlet
+ 
+---------- Warlord Bot II: turn 8 ----------
+Warlord Bot II - plays Hamlet
+Warlord Bot II - draws Pirate Ship
+Warlord Bot II - plays Pirate Ship
+Warlord Bot III - reveals Copper, Copper
+Warlord Bot III - trashes Copper
+Warlord Bot III - discards Copper
+ftl - reveals Market Square, Estate
+ftl - discards: Market Square, Estate
+Warlord Bot I - reveals Pirate Ship, Copper
+Warlord Bot I - trashes Copper
+Warlord Bot I - discards Pirate Ship
+Warlord Bot II - receives a pirate coin, now has 3 pirate coin(s)
+Warlord Bot II - plays 3 Copper, 1 Silver
+Warlord Bot II - buys Bazaar
+Warlord Bot II - gains Bazaar
+Warlord Bot II - draws Estate, Pirate Ship, Village, Pirate Ship, Estate
+ 
+---------- Warlord Bot III: turn 8 ----------
+Warlord Bot III - plays Hamlet
+Warlord Bot III - draws Estate
+Warlord Bot III - discards Estate
+Warlord Bot III - receives one action
+Warlord Bot III - plays Pirate Ship
+ftl - reveals Market Square, Market Square
+ftl - discards: Market Square, Market Square
+Warlord Bot I - reveals Silver, Copper
+Warlord Bot I - trashes Silver
+Warlord Bot I - discards Copper
+Warlord Bot II - shuffles deck
+Warlord Bot II - reveals Copper, Pirate Ship
+Warlord Bot II - trashes Copper
+Warlord Bot II - discards Pirate Ship
+Warlord Bot III - receives a pirate coin, now has 4 pirate coin(s)
+Warlord Bot III - plays Pirate Ship
+ftl - reveals Market Square, Estate
+ftl - discards: Market Square, Estate
+Warlord Bot I - reveals Estate, Estate
+Warlord Bot I - discards: Estate, Estate
+Warlord Bot II - reveals Copper, Hamlet
+Warlord Bot II - trashes Copper
+Warlord Bot II - discards Hamlet
+Warlord Bot III - receives a pirate coin, now has 5 pirate coin(s)
+Warlord Bot III - plays 2 Copper
+Warlord Bot III - buys Native Village
+Warlord Bot III - gains Native Village
+Warlord Bot III - draws Estate, Pirate Ship, Native Village, Village
+Warlord Bot III - shuffles deck
+Warlord Bot III - draws Copper
+ 
+---------- ftl: turn 9 ----------
+ftl - plays 3 Copper
+ftl - buys Market Square
+ftl - gains Market Square
+ftl - draws Estate, Gold, Market Square, Gold
+ftl - shuffles deck
+ftl - draws Market Square
+ 
+---------- Warlord Bot I: turn 9 ----------
+Warlord Bot I - plays Village
+Warlord Bot I - draws Copper
+Warlord Bot I - plays Hamlet
+Warlord Bot I - draws Pirate Ship
+Warlord Bot I - plays Pirate Ship
+Warlord Bot II - reveals Estate, Copper
+Warlord Bot II - trashes Copper
+Warlord Bot II - discards Estate
+Warlord Bot III - reveals Pirate Ship, Estate
+Warlord Bot III - discards: Pirate Ship, Estate
+ftl - reveals Gold, Market Square
+ftl - trashes Gold
+ftl - reveals reaction Market Square
+ftl - discards Market Square
+ftl - gains Gold
+ftl - reveals reaction Market Square
+ftl - discards Market Square
+ftl - gains Gold
+ftl - discards Market Square
+Warlord Bot I - receives a pirate coin, now has 6 pirate coin(s)
+Warlord Bot I - plays Hamlet
+Warlord Bot I - draws Village
+Warlord Bot I - plays Village
+Warlord Bot I - draws Pirate Ship
+Warlord Bot I - plays Pirate Ship
+Warlord Bot II - reveals Bazaar, Silver
+Warlord Bot II - trashes Silver
+Warlord Bot II - discards Bazaar
+Warlord Bot III - reveals Copper, Hamlet
+Warlord Bot III - trashes Copper
+Warlord Bot III - discards Hamlet
+ftl - reveals Market Square, Estate
+ftl - discards: Market Square, Estate
+Warlord Bot I - receives a pirate coin, now has 7 pirate coin(s)
+Warlord Bot I - plays 2 Copper
+Warlord Bot I - buys Hamlet
+Warlord Bot I - gains Hamlet
+Warlord Bot I - shuffles deck
+Warlord Bot I - draws Estate, Village, Pirate Ship, Pirate Ship, Copper
+ 
+---------- Warlord Bot II: turn 9 ----------
+Warlord Bot II - plays Village
+Warlord Bot II - shuffles deck
+Warlord Bot II - draws Estate
+Warlord Bot II - plays Pirate Ship
+Warlord Bot III - reveals Native Village, Pirate Ship
+Warlord Bot III - discards: Native Village, Pirate Ship
+ftl - reveals Market Square, Copper
+ftl - trashes Copper
+ftl - discards Market Square
+Warlord Bot I - reveals Hamlet, Pirate Ship
+Warlord Bot I - discards: Hamlet, Pirate Ship
+Warlord Bot II - receives a pirate coin, now has 4 pirate coin(s)
+Warlord Bot II - plays Pirate Ship
+Warlord Bot III - reveals Estate, Pirate Ship
+Warlord Bot III - discards: Estate, Pirate Ship
+ftl - reveals Market Square, Copper
+ftl - trashes Copper
+ftl - discards Market Square
+Warlord Bot I - reveals Estate, Hamlet
+Warlord Bot I - discards: Estate, Hamlet
+Warlord Bot II - receives a pirate coin, now has 5 pirate coin(s)
+Warlord Bot II - buys Copper
+Warlord Bot II - gains Copper
+Warlord Bot II - draws Bazaar, Hamlet, Pirate Ship
+Warlord Bot II - shuffles deck
+Warlord Bot II - draws Pirate Ship, Estate
+ 
+---------- Warlord Bot III: turn 9 ----------
+Warlord Bot III - plays Village
+Warlord Bot III - draws Copper
+Warlord Bot III - plays Native Village
+Warlord Bot III - shuffles deck
+Warlord Bot III - sets aside Estate
+Warlord Bot III - plays Pirate Ship
+ftl - reveals Market Square, Market Square
+ftl - discards: Market Square, Market Square
+Warlord Bot I - reveals Hamlet, Estate
+Warlord Bot I - discards: Hamlet, Estate
+Warlord Bot II - reveals Estate, Estate
+Warlord Bot II - discards: Estate, Estate
+Warlord Bot III - plays 2 Copper
+Warlord Bot III - buys Hamlet
+Warlord Bot III - gains Hamlet
+Warlord Bot III - draws Hamlet, Pirate Ship, Estate, Native Village, Pirate Ship
+ 
+---------- ftl: turn 10 ----------
+ftl - plays 2 Gold
+ftl - buys Market Square
+ftl - gains Market Square
+ftl - draws Market Square, Estate, Copper, Gold
+ftl - shuffles deck
+ftl - draws Market Square
+ 
+---------- Warlord Bot I: turn 10 ----------
+Warlord Bot I - plays Village
+Warlord Bot I - draws Copper
+Warlord Bot I - plays Pirate Ship
+Warlord Bot II - reveals Pirate Ship, Village
+Warlord Bot II - discards: Pirate Ship, Village
+Warlord Bot III - reveals Pirate Ship
+Warlord Bot III - shuffles deck
+Warlord Bot III - reveals Pirate Ship
+Warlord Bot III - discards: Pirate Ship, Pirate Ship
+ftl - reveals Gold, Market Square
+ftl - trashes Gold
+ftl - reveals reaction Market Square
+ftl - discards Market Square
+ftl - gains Gold
+ftl - reveals reaction Market Square
+ftl - discards Market Square
+ftl - gains Gold
+ftl - discards Market Square
+Warlord Bot I - receives a pirate coin, now has 8 pirate coin(s)
+Warlord Bot I - plays Pirate Ship
+Warlord Bot I - takes 8 coins
+Warlord Bot I - plays 2 Copper
+Warlord Bot I - buys Province
+Warlord Bot I - gains Province
+Warlord Bot I - draws Copper, Village
+Warlord Bot I - shuffles deck
+Warlord Bot I - draws Estate, Hamlet, Village
+ 
+---------- Warlord Bot II: turn 10 ----------
+Warlord Bot II - plays Bazaar
+Warlord Bot II - draws Copper
+Warlord Bot II - plays Pirate Ship
+Warlord Bot III - reveals Village, Copper
+Warlord Bot III - trashes Copper
+Warlord Bot III - discards Village
+ftl - reveals Gold, Market Square
+ftl - trashes Gold
+ftl - discards Market Square
+Warlord Bot I - reveals Copper, Province
+Warlord Bot I - trashes Copper
+Warlord Bot I - discards Province
+Warlord Bot II - receives a pirate coin, now has 6 pirate coin(s)
+Warlord Bot II - plays Hamlet
+Warlord Bot II - shuffles deck
+Warlord Bot II - draws Estate
+Warlord Bot II - plays Pirate Ship
+Warlord Bot III - reveals Hamlet, Estate
+Warlord Bot III - discards: Hamlet, Estate
+ftl - reveals Market Square, Gold
+ftl - trashes Gold
+ftl - discards Market Square
+Warlord Bot I - reveals Hamlet, Pirate Ship
+Warlord Bot I - discards: Hamlet, Pirate Ship
+Warlord Bot II - receives a pirate coin, now has 7 pirate coin(s)
+Warlord Bot II - plays 1 Copper
+Warlord Bot II - buys Hamlet
+Warlord Bot II - gains Hamlet
+Warlord Bot II - draws Pirate Ship, Estate, Village
+Warlord Bot II - shuffles deck
+Warlord Bot II - draws Pirate Ship, Bazaar
+ 
+---------- Warlord Bot III: turn 10 ----------
+Warlord Bot III - plays Native Village
+Warlord Bot III - sets aside Native Village
+Warlord Bot III - plays Pirate Ship
+ftl - reveals Estate, Estate
+ftl - discards: Estate, Estate
+Warlord Bot I - reveals Estate, Hamlet
+Warlord Bot I - discards: Estate, Hamlet
+Warlord Bot II - reveals Pirate Ship, Hamlet
+Warlord Bot II - discards: Pirate Ship, Hamlet
+Warlord Bot III - plays Hamlet
+Warlord Bot III - draws Copper
+Warlord Bot III - plays Pirate Ship
+ftl - reveals Gold, Market Square
+ftl - trashes Gold
+ftl - discards Market Square
+Warlord Bot I - reveals Copper, Estate
+Warlord Bot I - trashes Copper
+Warlord Bot I - discards Estate
+Warlord Bot II - reveals Copper, Estate
+Warlord Bot II - trashes Copper
+Warlord Bot II - discards Estate
+Warlord Bot III - receives a pirate coin, now has 6 pirate coin(s)
+Warlord Bot III - plays 1 Copper
+Warlord Bot III - buys Copper
+Warlord Bot III - gains Copper
+Warlord Bot III - shuffles deck
+Warlord Bot III - draws Native Village, Pirate Ship, Pirate Ship, Estate, Estate
+ 
+---------- ftl: turn 11 ----------
+ftl - plays 1 Copper, 1 Gold
+ftl - buys Shanty Town
+ftl - gains Shanty Town
+ftl - draws Market Square, Market Square, Market Square, Market Square
+ftl - shuffles deck
+ftl - draws Market Square
+ 
+---------- Warlord Bot I: turn 11 ----------
+Warlord Bot I - plays Village
+Warlord Bot I - draws Pirate Ship
+Warlord Bot I - plays Village
+Warlord Bot I - draws Pirate Ship
+Warlord Bot I - plays Pirate Ship
+Warlord Bot I - takes 8 coins
+Warlord Bot I - plays Pirate Ship
+Warlord Bot I - takes 8 coins
+Warlord Bot I - plays Hamlet
+Warlord Bot I - shuffles deck
+Warlord Bot I - draws Pirate Ship
+Warlord Bot I - discards Estate
+Warlord Bot I - receives one buy
+Warlord Bot I - plays Pirate Ship
+Warlord Bot I - takes 8 coins
+Warlord Bot I - plays 1 Copper
+Warlord Bot I - buys Province
+Warlord Bot I - gains Province
+Warlord Bot I - buys Province
+Warlord Bot I - gains Province
+Warlord Bot I - draws Hamlet, Province, Estate, Estate, Hamlet
+ 
+---------- Warlord Bot II: turn 11 ----------
+Warlord Bot II - plays Bazaar
+Warlord Bot II - draws Estate
+Warlord Bot II - plays Village
+Warlord Bot II - draws Hamlet
+Warlord Bot II - plays Pirate Ship
+Warlord Bot III - reveals Copper, Hamlet
+Warlord Bot III - trashes Copper
+Warlord Bot III - discards Hamlet
+ftl - reveals Gold, Market Square
+ftl - trashes Gold
+ftl - reveals reaction Market Square
+ftl - discards Market Square
+ftl - gains Gold
+ftl - reveals reaction Market Square
+ftl - discards Market Square
+ftl - gains Gold
+ftl - reveals reaction Market Square
+ftl - discards Market Square
+ftl - gains Gold
+ftl - reveals reaction Market Square
+ftl - discards Market Square
+ftl - gains Gold
+ftl - reveals reaction Market Square
+ftl - discards Market Square
+ftl - gains Gold
+ftl - discards Market Square
+Warlord Bot I - shuffles deck
+Warlord Bot I - reveals Village, Pirate Ship
+Warlord Bot I - discards: Village, Pirate Ship
+Warlord Bot II - receives a pirate coin, now has 8 pirate coin(s)
+Warlord Bot II - plays Pirate Ship
+Warlord Bot II - takes 8 coins
+Warlord Bot II - plays Hamlet
+Warlord Bot II - shuffles deck
+Warlord Bot II - draws Hamlet
+Warlord Bot II - plays Hamlet
+Warlord Bot II - draws Pirate Ship
+Warlord Bot II - plays Pirate Ship
+Warlord Bot II - takes 8 coins
+Warlord Bot II - buys Province
+Warlord Bot II - gains Province
+Warlord Bot II - draws Estate
+Warlord Bot II - shuffles deck
+Warlord Bot II - draws Pirate Ship, Village, Hamlet, Estate
+ 
+---------- Warlord Bot III: turn 11 ----------
+Warlord Bot III - plays Native Village
+Warlord Bot III - takes set aside cards: Estate, Native Village
+Warlord Bot III - plays Native Village
+Warlord Bot III - sets aside Pirate Ship
+Warlord Bot III - plays Pirate Ship
+ftl - reveals Market Square, Copper
+ftl - trashes Copper
+ftl - discards Market Square
+Warlord Bot I - reveals Pirate Ship, Hamlet
+Warlord Bot I - discards: Pirate Ship, Hamlet
+Warlord Bot II - reveals Hamlet, Estate
+Warlord Bot II - discards: Hamlet, Estate
+Warlord Bot III - receives a pirate coin, now has 7 pirate coin(s)
+Warlord Bot III - plays Pirate Ship
+Warlord Bot III - takes 7 coins
+Warlord Bot III - buys Gold
+Warlord Bot III - gains Gold
+Warlord Bot III - draws Village, Hamlet, Pirate Ship, Copper
+Warlord Bot III - shuffles deck
+Warlord Bot III - draws Pirate Ship
+ 
+---------- ftl: turn 12 ----------
+ftl - draws Market Square, Estate, Shanty Town, Market Square, Market Square
+ 
+---------- Warlord Bot I: turn 12 ----------
+Warlord Bot I - plays Hamlet
+Warlord Bot I - draws Estate
+Warlord Bot I - plays Hamlet
+Warlord Bot I - draws Province
+Warlord Bot I - buys Copper
+Warlord Bot I - gains Copper
+Warlord Bot I - draws Copper, Village, Province, Pirate Ship
+Warlord Bot I - shuffles deck
+Warlord Bot I - draws Estate
+ 
+---------- Warlord Bot II: turn 12 ----------
+Warlord Bot II - plays Village
+Warlord Bot II - draws Pirate Ship
+Warlord Bot II - plays Pirate Ship
+Warlord Bot II - takes 8 coins
+Warlord Bot II - plays Hamlet
+Warlord Bot II - draws Bazaar
+Warlord Bot II - plays Bazaar
+Warlord Bot II - draws Province
+Warlord Bot II - plays Pirate Ship
+Warlord Bot II - takes 8 coins
+Warlord Bot II - buys Province
+Warlord Bot II - gains Province
+Warlord Bot II - draws Pirate Ship
+Warlord Bot II - shuffles deck
+Warlord Bot II - draws Village, Hamlet, Hamlet, Estate
+ 
+---------- Warlord Bot III: turn 12 ----------
+Warlord Bot III - plays Village
+Warlord Bot III - draws Estate
+Warlord Bot III - plays Pirate Ship
+ftl - reveals Gold, Estate
+ftl - trashes Gold
+ftl - reveals reaction Market Square
+ftl - discards Market Square
+ftl - gains Gold
+ftl - reveals reaction Market Square
+ftl - discards Market Square
+ftl - gains Gold
+ftl - reveals reaction Market Square
+ftl - discards Market Square
+ftl - gains Gold
+ftl - discards Estate
+Warlord Bot I - reveals Village, Estate
+Warlord Bot I - discards: Village, Estate
+Warlord Bot II - reveals Pirate Ship, Pirate Ship
+Warlord Bot II - discards: Pirate Ship, Pirate Ship
+Warlord Bot III - receives a pirate coin, now has 8 pirate coin(s)
+Warlord Bot III - plays Hamlet
+Warlord Bot III - draws Estate
+Warlord Bot III - plays Pirate Ship
+Warlord Bot III - takes 8 coins
+Warlord Bot III - plays 1 Copper
+Warlord Bot III - buys Province
+Warlord Bot III - gains Province
+Warlord Bot III - draws Pirate Ship, Native Village, Estate, Native Village, Hamlet
+ 
+---------- ftl: turn 13 ----------
+ftl - plays Shanty Town
+ftl - reveals Estate
+ftl - draws Estate, Gold
+ftl - plays 1 Gold
+ftl - buys Shanty Town
+ftl - gains Shanty Town
+ftl - shuffles deck
+ftl - draws Market Square, Market Square, Market Square, Estate, Market Square
+ 
+---------- Warlord Bot I: turn 13 ----------
+Warlord Bot I - plays Village
+Warlord Bot I - draws Estate
+Warlord Bot I - plays Pirate Ship
+Warlord Bot I - takes 8 coins
+Warlord Bot I - plays 1 Copper
+Warlord Bot I - buys Province
+Warlord Bot I - gains Province
+Warlord Bot I - draws Hamlet, Copper, Province, Hamlet, Province
+ 
+---------- Warlord Bot II: turn 13 ----------
+Warlord Bot II - plays Village
+Warlord Bot II - draws Bazaar
+Warlord Bot II - plays Bazaar
+Warlord Bot II - draws Province
+Warlord Bot II - plays Hamlet
+Warlord Bot II - draws Estate
+Warlord Bot II - plays Pirate Ship
+Warlord Bot II - takes 8 coins
+Warlord Bot II - plays Hamlet
+Warlord Bot II - draws Estate
+Warlord Bot II - buys Province
+Warlord Bot II - gains Province
+Warlord Bot II - draws Province
+Warlord Bot II - shuffles deck
+Warlord Bot II - draws Village, Pirate Ship, Pirate Ship, Province
+ 
+---------- Warlord Bot III: turn 13 ----------
+Warlord Bot III - plays Native Village
+Warlord Bot III - takes set aside cards: Pirate Ship
+Warlord Bot III - plays Native Village
+Warlord Bot III - sets aside Gold
+Warlord Bot III - plays Pirate Ship
+Warlord Bot III - takes 8 coins
+Warlord Bot III - plays Pirate Ship
+Warlord Bot III - takes 8 coins
+Warlord Bot III - plays Hamlet
+Warlord Bot III - shuffles deck
+Warlord Bot III - draws Hamlet
+Warlord Bot III - plays Hamlet
+Warlord Bot III - draws Village
+Warlord Bot III - plays Village
+Warlord Bot III - draws Estate
+Warlord Bot III - buys Province
+Warlord Bot III - gains Province
+Warlord Bot III - draws Pirate Ship, Pirate Ship, Copper, Province, Estate
+ 
+---------- ftl: turn 14 ----------
+ftl - plays Market Square
+ftl - draws Gold
+ftl - plays Market Square
+ftl - draws Gold
+ftl - plays Market Square
+ftl - draws Shanty Town
+ftl - plays Market Square
+ftl - draws Market Square
+ftl - plays Market Square
+ftl - draws Gold
+ftl - plays Shanty Town
+ftl - reveals Estate, Gold, Gold, Gold
+ftl - draws Market Square, Gold
+ftl - plays Market Square
+ftl - draws Gold
+ftl - plays 5 Gold
+ftl - buys Province
+ftl - gains Province
+ftl - buys Duchy
+ftl - gains Duchy
+ftl - buys Estate
+ftl - gains Estate
+ftl - draws Market Square, Market Square, Gold, Gold, Shanty Town
+ 
+---------- Warlord Bot I: turn 14 ----------
+Warlord Bot I - plays Hamlet
+Warlord Bot I - draws Pirate Ship
+Warlord Bot I - plays Hamlet
+Warlord Bot I - draws Pirate Ship
+Warlord Bot I - discards Province
+Warlord Bot I - receives one action
+Warlord Bot I - discards Province
+Warlord Bot I - receives one buy
+Warlord Bot I - plays Pirate Ship
+Warlord Bot I - takes 8 coins
+Warlord Bot I - plays Pirate Ship
+Warlord Bot I - takes 8 coins
+Warlord Bot I - plays 1 Copper
+Warlord Bot I - buys Province
+Warlord Bot I - gains Province
+Warlord Bot I - buys Province
+Warlord Bot I - gains Province
+Warlord Bot I - draws Hamlet
+Warlord Bot I - shuffles deck
+Warlord Bot I - draws Village, Copper, Estate, Province
+ 
+------------ Game Over ------------
+Warlord Bot I - cards: 3 Hamlet, 3 Pirate Ship, 2 Village, 2 Copper, 6 Province, 3 Estate
+Warlord Bot I - total victory points: 39
+Warlord Bot I - turns: 14
+ 
+Warlord Bot II - cards: 3 Pirate Ship, 2 Hamlet, 1 Village, 1 Bazaar, 3 Province, 3 Estate
+Warlord Bot II - total victory points: 21
+Warlord Bot II - turns: 13
+ 
+Warlord Bot III - cards: 4 Pirate Ship, 2 Native Village, 2 Hamlet, 1 Village, 1 Copper, 1 Gold, 3 Estate, 2 Province
+Warlord Bot III - total victory points: 15
+Warlord Bot III - turns: 13
+ 
+ftl - cards: 10 Market Square, 2 Shanty Town, 9 Gold, 4 Estate, 1 Province, 1 Duchy
+ftl - total victory points: 13
+ftl - turns: 14
+ 
+1st place: Warlord Bot I
+2nd place: Warlord Bot II
+3rd place: Warlord Bot III
+4th place: ftl
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.50612a9b51c36e573294bfd0.1368044241913.txt b/testing/testdata/log.50612a9b51c36e573294bfd0.1368044241913.txt
new file mode 100644
index 0000000..005e5ea
--- /dev/null
+++ b/testing/testdata/log.50612a9b51c36e573294bfd0.1368044241913.txt
@@ -0,0 +1,797 @@
+------------ Game Setup ------------
+Supply cards: Cellar, Hamlet, Pearl Diver, Vagrant, Scrying Pool, Village, Bishop, Monument, Counterfeit, Goons, Copper, Silver, Gold, Estate, Duchy, Province, Curse, Colony, Platinum, Potion
+ftl - starting cards: Necropolis, Overgrown Estate, Hovel, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Lord Bottington - starting cards: Necropolis, Overgrown Estate, Hovel, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+ftl - shuffles deck
+Lord Bottington - shuffles deck
+ftl - draws Copper, Copper, Copper, Copper, Overgrown Estate
+Lord Bottington - draws Copper, Necropolis, Copper, Copper, Hovel
+ 
+---------- ftl: turn 1 ----------
+ftl - plays 4 Copper
+ftl - buys Potion
+ftl - gains Potion
+ftl - draws Copper, Copper, Necropolis, Copper, Hovel
+ 
+---------- Lord Bottington: turn 1 ----------
+Lord Bottington - plays Necropolis
+Lord Bottington - plays 3 Copper
+Lord Bottington - buys Silver
+Lord Bottington - gains Silver
+Lord Bottington - draws Copper, Overgrown Estate, Copper, Copper, Copper
+ 
+---------- ftl: turn 2 ----------
+ftl - plays Necropolis
+ftl - plays 3 Copper
+ftl - buys Village
+ftl - gains Village
+ftl - shuffles deck
+ftl - draws Copper, Necropolis, Copper, Copper, Village
+ 
+---------- Lord Bottington: turn 2 ----------
+Lord Bottington - plays 4 Copper
+Lord Bottington - buys Potion
+Lord Bottington - gains Potion
+Lord Bottington - shuffles deck
+Lord Bottington - draws Silver, Copper, Copper, Necropolis, Overgrown Estate
+ 
+---------- ftl: turn 3 ----------
+ftl - plays Village
+ftl - draws Copper
+ftl - plays Necropolis
+ftl - plays 4 Copper
+ftl - buys Potion
+ftl - gains Potion
+ftl - draws Copper, Copper, Potion, Hovel, Copper
+ 
+---------- Lord Bottington: turn 3 ----------
+Lord Bottington - plays Necropolis
+Lord Bottington - plays 2 Copper, 1 Silver
+Lord Bottington - buys Bishop
+Lord Bottington - gains Bishop
+Lord Bottington - draws Copper, Copper, Potion, Copper, Copper
+ 
+---------- ftl: turn 4 ----------
+ftl - plays 3 Copper, 1 Potion
+ftl - buys Scrying Pool
+ftl - gains Scrying Pool
+ftl - draws Overgrown Estate
+ftl - shuffles deck
+ftl - draws Necropolis, Copper, Copper, Village
+ 
+---------- Lord Bottington: turn 4 ----------
+Lord Bottington - plays Potion
+Lord Bottington - plays 4 Copper
+Lord Bottington - buys Scrying Pool
+Lord Bottington - gains Scrying Pool
+Lord Bottington - draws Hovel, Copper
+Lord Bottington - shuffles deck
+Lord Bottington - draws Potion, Scrying Pool, Silver
+ 
+---------- ftl: turn 5 ----------
+ftl - plays Village
+ftl - draws Potion
+ftl - plays 2 Copper, 1 Potion
+ftl - buys Scrying Pool
+ftl - gains Scrying Pool
+ftl - draws Copper, Copper, Scrying Pool, Hovel, Copper
+ 
+---------- Lord Bottington: turn 5 ----------
+Lord Bottington - plays Scrying Pool
+Lord Bottington - discards Copper
+ftl - places Copper on top of deck
+Lord Bottington - reveals Necropolis, Copper
+Lord Bottington - plays Necropolis
+Lord Bottington - plays Potion
+Lord Bottington - plays 2 Copper, 1 Silver
+Lord Bottington - buys Scrying Pool
+Lord Bottington - gains Scrying Pool
+Lord Bottington - draws Copper, Copper, Copper, Bishop, Copper
+ 
+---------- ftl: turn 6 ----------
+ftl - plays Scrying Pool
+ftl - discards Copper
+Lord Bottington - places Overgrown Estate on top of deck
+ftl - reveals Potion
+ftl - plays 3 Copper, 1 Potion
+ftl - buys Scrying Pool
+ftl - gains Scrying Pool
+ftl - draws Copper
+ftl - shuffles deck
+ftl - draws Scrying Pool, Copper, Hovel, Potion
+ 
+---------- Lord Bottington: turn 6 ----------
+Lord Bottington - plays Bishop
+Lord Bottington - trashes Copper
+Lord Bottington - receives 0 victory point chips
+ftl - trashes Hovel
+Lord Bottington - plays 3 Copper
+Lord Bottington - buys Monument
+Lord Bottington - gains Monument
+Lord Bottington - draws Overgrown Estate
+Lord Bottington - shuffles deck
+Lord Bottington - draws Monument, Copper, Necropolis, Potion
+ 
+---------- ftl: turn 7 ----------
+ftl - plays Scrying Pool
+ftl - places Village on top of deck
+Lord Bottington - places Copper on top of deck
+ftl - reveals Village, Copper
+ftl - plays Village
+ftl - draws Copper
+ftl - plays 4 Copper, 1 Potion
+ftl - buys Scrying Pool
+ftl - gains Scrying Pool
+ftl - draws Copper, Copper, Necropolis, Scrying Pool, Overgrown Estate
+ 
+---------- Lord Bottington: turn 7 ----------
+Lord Bottington - plays Necropolis
+Lord Bottington - plays Monument
+Lord Bottington - receives 1 victory point chips
+Lord Bottington - plays Potion
+Lord Bottington - plays 1 Copper
+Lord Bottington - buys Scrying Pool
+Lord Bottington - gains Scrying Pool
+Lord Bottington - draws Copper, Scrying Pool, Silver, Scrying Pool, Hovel
+ 
+---------- ftl: turn 8 ----------
+ftl - plays Scrying Pool
+ftl - places Potion on top of deck
+Lord Bottington - discards Bishop
+ftl - reveals Potion
+ftl - plays Necropolis
+ftl - plays 2 Copper, 1 Potion
+ftl - buys Scrying Pool
+ftl - gains Scrying Pool
+ftl - draws Copper, Scrying Pool
+ftl - shuffles deck
+ftl - draws Village, Scrying Pool, Copper
+ 
+---------- Lord Bottington: turn 8 ----------
+Lord Bottington - plays Scrying Pool
+Lord Bottington - discards Copper
+ftl - places Copper on top of deck
+Lord Bottington - reveals Copper
+Lord Bottington - plays Scrying Pool
+Lord Bottington - discards Copper
+ftl - places Copper on top of deck
+Lord Bottington - reveals Copper
+Lord Bottington - plays 3 Copper, 1 Silver
+Lord Bottington - buys Monument
+Lord Bottington - gains Monument
+Lord Bottington - shuffles deck
+Lord Bottington - draws Scrying Pool, Scrying Pool, Copper, Bishop, Copper
+ 
+---------- ftl: turn 9 ----------
+ftl - plays Village
+ftl - draws Copper
+ftl - plays Scrying Pool
+ftl - places Potion on top of deck
+Lord Bottington - places Copper on top of deck
+ftl - reveals Potion
+ftl - plays Scrying Pool
+ftl - discards Overgrown Estate
+Lord Bottington - places Copper on top of deck
+ftl - reveals Necropolis, Scrying Pool, Copper
+ftl - plays Scrying Pool
+ftl - discards Potion
+Lord Bottington - discards Copper
+ftl - reveals Scrying Pool, Copper
+ftl - plays Scrying Pool
+ftl - discards Copper
+Lord Bottington - discards Monument
+ftl - reveals Scrying Pool, Copper
+ftl - plays Necropolis
+ftl - plays 6 Copper, 1 Potion
+ftl - buys Goons
+ftl - gains Goons
+ftl - shuffles deck
+ftl - draws Copper, Scrying Pool, Potion, Scrying Pool, Necropolis
+ 
+---------- Lord Bottington: turn 9 ----------
+Lord Bottington - plays Scrying Pool
+Lord Bottington - discards Overgrown Estate
+ftl - places Copper on top of deck
+Lord Bottington - reveals Necropolis, Copper
+Lord Bottington - plays Scrying Pool
+Lord Bottington - places Monument on top of deck
+ftl - places Copper on top of deck
+Lord Bottington - reveals Monument, Potion
+Lord Bottington - plays Necropolis
+Lord Bottington - plays Monument
+Lord Bottington - receives 1 victory point chips
+Lord Bottington - plays Bishop
+Lord Bottington - trashes Copper
+Lord Bottington - receives 0 victory point chips
+ftl - trashes Copper
+Lord Bottington - plays Potion
+Lord Bottington - plays 2 Copper
+Lord Bottington - buys Scrying Pool
+Lord Bottington - gains Scrying Pool
+Lord Bottington - draws Silver, Hovel, Copper, Copper, Scrying Pool
+ 
+---------- ftl: turn 10 ----------
+ftl - plays Scrying Pool
+ftl - discards Copper
+Lord Bottington - shuffles deck
+Lord Bottington - discards Scrying Pool
+ftl - reveals Scrying Pool, Goons, Copper
+ftl - plays Scrying Pool
+ftl - places Scrying Pool on top of deck
+Lord Bottington - discards Copper
+ftl - reveals Scrying Pool, Scrying Pool, Copper
+ftl - plays Scrying Pool
+ftl - places Potion on top of deck
+Lord Bottington - places Overgrown Estate on top of deck
+ftl - reveals Potion
+ftl - plays Scrying Pool
+ftl - discards Copper
+Lord Bottington - places Overgrown Estate on top of deck
+ftl - reveals Copper
+ftl - plays Scrying Pool
+ftl - discards Copper
+Lord Bottington - places Overgrown Estate on top of deck
+ftl - reveals Overgrown Estate
+ftl - plays Necropolis
+ftl - plays Goons
+Lord Bottington - discards Hovel
+Lord Bottington - discards Copper
+ftl - plays 3 Copper, 2 Potion
+ftl - buys Scrying Pool
+ftl - receives 1 victory point chips
+ftl - gains Scrying Pool
+ftl - buys Village
+ftl - receives 1 victory point chips
+ftl - gains Village
+ftl - draws Village
+ftl - shuffles deck
+ftl - draws Copper, Copper, Necropolis, Copper
+ 
+---------- Lord Bottington: turn 10 ----------
+Lord Bottington - plays Scrying Pool
+Lord Bottington - discards Overgrown Estate
+ftl - places Copper on top of deck
+Lord Bottington - reveals Scrying Pool, Monument, Copper
+Lord Bottington - plays Scrying Pool
+Lord Bottington - discards Copper
+ftl - places Copper on top of deck
+Lord Bottington - reveals Necropolis, Monument, Potion
+Lord Bottington - plays Necropolis
+Lord Bottington - plays Monument
+Lord Bottington - receives 1 victory point chips
+Lord Bottington - plays Monument
+Lord Bottington - receives 1 victory point chips
+Lord Bottington - plays Potion
+Lord Bottington - plays 2 Copper, 1 Silver
+Lord Bottington - buys Province
+Lord Bottington - gains Province
+Lord Bottington - draws Bishop, Scrying Pool
+Lord Bottington - shuffles deck
+Lord Bottington - draws Scrying Pool, Scrying Pool, Copper
+ 
+---------- ftl: turn 11 ----------
+ftl - plays Village
+ftl - draws Copper
+ftl - plays Necropolis
+ftl - plays 4 Copper
+ftl - buys Bishop
+ftl - gains Bishop
+ftl - draws Scrying Pool, Scrying Pool, Goons, Scrying Pool, Potion
+ 
+---------- Lord Bottington: turn 11 ----------
+Lord Bottington - plays Scrying Pool
+Lord Bottington - places Monument on top of deck
+ftl - places Copper on top of deck
+Lord Bottington - reveals Monument, Potion
+Lord Bottington - plays Scrying Pool
+Lord Bottington - discards Copper
+ftl - places Copper on top of deck
+Lord Bottington - reveals Copper
+Lord Bottington - plays Scrying Pool
+Lord Bottington - discards Overgrown Estate
+ftl - places Copper on top of deck
+Lord Bottington - reveals Silver
+Lord Bottington - plays Monument
+Lord Bottington - receives 1 victory point chips
+Lord Bottington - plays Potion
+Lord Bottington - plays 2 Copper, 1 Silver
+Lord Bottington - buys Gold
+Lord Bottington - gains Gold
+Lord Bottington - draws Scrying Pool, Province, Copper, Hovel, Copper
+ 
+---------- ftl: turn 12 ----------
+ftl - plays Scrying Pool
+ftl - discards Copper
+Lord Bottington - discards Monument
+ftl - reveals Potion
+ftl - plays Scrying Pool
+ftl - discards Overgrown Estate
+Lord Bottington - discards Necropolis
+ftl - reveals Scrying Pool, Scrying Pool, Village, Scrying Pool, Copper
+ftl - plays Scrying Pool
+ftl - shuffles deck
+ftl - discards Copper
+Lord Bottington - shuffles deck
+Lord Bottington - places Copper on top of deck
+ftl - reveals Overgrown Estate
+ftl - plays Village
+ftl - draws Copper
+ftl - plays Scrying Pool
+ftl - places Bishop on top of deck
+Lord Bottington - discards Copper
+ftl - reveals Bishop, Copper
+ftl - plays Bishop
+ftl - trashes Overgrown Estate
+ftl - draws Copper
+ftl - receives 0 victory point chips
+Lord Bottington - trashes Hovel
+ftl - plays Scrying Pool
+ftl - discards Copper
+Lord Bottington - places Overgrown Estate on top of deck
+ftl - shuffles deck
+ftl - reveals Village, Necropolis, Copper
+ftl - plays Village
+ftl - draws Copper
+ftl - plays Goons
+Lord Bottington - discards Province
+ftl - plays 6 Copper, 2 Potion
+ftl - buys Goons
+ftl - receives 1 victory point chips
+ftl - gains Goons
+ftl - buys Village
+ftl - receives 1 victory point chips
+ftl - gains Village
+ftl - shuffles deck
+ftl - draws Copper, Village, Copper, Bishop, Scrying Pool
+ 
+---------- Lord Bottington: turn 12 ----------
+Lord Bottington - plays Scrying Pool
+Lord Bottington - discards Overgrown Estate
+ftl - places Copper on top of deck
+Lord Bottington - reveals Copper
+Lord Bottington - plays 3 Copper
+Lord Bottington - buys Village
+Lord Bottington - gains Village
+Lord Bottington - draws Potion, Gold, Monument, Copper, Necropolis
+ 
+---------- ftl: turn 13 ----------
+ftl - plays Village
+ftl - draws Copper
+ftl - plays Scrying Pool
+ftl - discards Copper
+Lord Bottington - discards Monument
+ftl - reveals Scrying Pool, Goons, Scrying Pool, Copper
+ftl - plays Scrying Pool
+ftl - places Scrying Pool on top of deck
+Lord Bottington - discards Scrying Pool
+ftl - reveals Scrying Pool, Village, Scrying Pool, Copper
+ftl - plays Scrying Pool
+ftl - discards Potion
+Lord Bottington - discards Scrying Pool
+ftl - reveals Necropolis, Potion
+ftl - plays Scrying Pool
+ftl - places Village on top of deck
+Lord Bottington - discards Bishop
+ftl - shuffles deck
+ftl - reveals Village, Scrying Pool, Goons, Potion
+ftl - plays Village
+ftl - draws Copper
+ftl - plays Village
+ftl - plays Necropolis
+ftl - plays Bishop
+ftl - trashes Potion
+ftl - receives 2 victory point chips
+Lord Bottington - trashes Potion
+ftl - plays Goons
+Lord Bottington - discards Copper
+ftl - plays Goons
+ftl - plays 6 Copper, 1 Potion
+ftl - buys Goons
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - gains Goons
+ftl - buys Counterfeit
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - gains Counterfeit
+ftl - shuffles deck
+ftl - draws Potion, Bishop, Copper, Village, Goons
+ 
+---------- Lord Bottington: turn 13 ----------
+Lord Bottington - plays Necropolis
+Lord Bottington - plays Monument
+Lord Bottington - receives 1 victory point chips
+Lord Bottington - plays 1 Gold
+Lord Bottington - buys Bishop
+Lord Bottington - gains Bishop
+Lord Bottington - draws Silver, Scrying Pool
+Lord Bottington - shuffles deck
+Lord Bottington - draws Scrying Pool, Village, Copper
+ 
+---------- ftl: turn 14 ----------
+ftl - plays Village
+ftl - draws Scrying Pool
+ftl - plays Scrying Pool
+ftl - places Scrying Pool on top of deck
+Lord Bottington - places Overgrown Estate on top of deck
+ftl - reveals Scrying Pool, Scrying Pool, Copper
+ftl - plays Scrying Pool
+ftl - discards Copper
+Lord Bottington - places Overgrown Estate on top of deck
+ftl - reveals Goons, Scrying Pool, Village, Copper
+ftl - plays Scrying Pool
+ftl - discards Copper
+Lord Bottington - places Overgrown Estate on top of deck
+ftl - reveals Scrying Pool, Copper
+ftl - plays Scrying Pool
+ftl - discards Counterfeit
+Lord Bottington - places Overgrown Estate on top of deck
+ftl - shuffles deck
+ftl - reveals Village, Scrying Pool, Necropolis, Goons, Copper
+ftl - plays Village
+ftl - draws Copper
+ftl - plays Village
+ftl - draws Counterfeit
+ftl - plays Necropolis
+ftl - plays Goons
+Lord Bottington - discards Copper
+Lord Bottington - discards Silver
+ftl - plays Goons
+ftl - plays Goons
+ftl - plays Bishop
+ftl - trashes Potion
+ftl - receives 2 victory point chips
+ftl - plays Counterfeit
+ftl - plays Copper
+ftl - plays Copper
+ftl - trashes Copper
+ftl - plays 5 Copper
+ftl - buys Goons
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - gains Goons
+ftl - buys Village
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - gains Village
+ftl - buys Village
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - gains Village
+ftl - buys Village
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - gains Village
+ftl - shuffles deck
+ftl - draws Village, Goons, Village, Scrying Pool, Copper
+ 
+---------- Lord Bottington: turn 14 ----------
+Lord Bottington - plays Village
+Lord Bottington - draws Overgrown Estate
+Lord Bottington - plays Scrying Pool
+Lord Bottington - places Gold on top of deck
+ftl - discards Goons
+Lord Bottington - reveals Gold
+Lord Bottington - plays Scrying Pool
+Lord Bottington - places Scrying Pool on top of deck
+ftl - discards Village
+Lord Bottington - reveals Scrying Pool, Bishop, Necropolis, Monument, Province
+Lord Bottington - plays Scrying Pool
+Lord Bottington - discards Copper
+ftl - places Copper on top of deck
+Lord Bottington - reveals Copper
+Lord Bottington - plays Necropolis
+Lord Bottington - plays Monument
+Lord Bottington - receives 1 victory point chips
+Lord Bottington - plays Bishop
+Lord Bottington - trashes Overgrown Estate
+Lord Bottington - draws Bishop
+Lord Bottington - receives 0 victory point chips
+ftl - trashes Copper
+Lord Bottington - plays Bishop
+Lord Bottington - trashes Copper
+Lord Bottington - receives 0 victory point chips
+Lord Bottington - plays 1 Gold
+Lord Bottington - buys Gold
+Lord Bottington - gains Gold
+Lord Bottington - draws Copper, Monument, Scrying Pool, Copper
+Lord Bottington - shuffles deck
+Lord Bottington - draws Silver
+ 
+---------- ftl: turn 15 ----------
+ftl - plays Village
+ftl - draws Copper
+ftl - plays Village
+ftl - draws Scrying Pool
+ftl - plays Scrying Pool
+ftl - discards Counterfeit
+Lord Bottington - discards Bishop
+ftl - reveals Village, Village, Village, Copper
+ftl - plays Scrying Pool
+ftl - places Bishop on top of deck
+Lord Bottington - discards Scrying Pool
+ftl - reveals Bishop, Copper
+ftl - plays Village
+ftl - draws Necropolis
+ftl - plays Goons
+Lord Bottington - discards Copper
+Lord Bottington - discards Copper
+ftl - plays Village
+ftl - draws Scrying Pool
+ftl - plays Bishop
+ftl - trashes Copper
+ftl - receives 0 victory point chips
+ftl - plays Village
+ftl - draws Scrying Pool
+ftl - plays Scrying Pool
+ftl - places Goons on top of deck
+Lord Bottington - discards Gold
+ftl - reveals Goons, Goons, Scrying Pool, Copper
+ftl - plays Scrying Pool
+ftl - places Scrying Pool on top of deck
+Lord Bottington - places Province on top of deck
+ftl - shuffles deck
+ftl - reveals Scrying Pool, Village, Goons, Counterfeit
+ftl - plays Necropolis
+ftl - plays Village
+ftl - plays Goons
+ftl - plays Goons
+ftl - plays Goons
+ftl - plays Counterfeit
+ftl - plays Copper
+ftl - plays Copper
+ftl - trashes Copper
+ftl - plays 2 Copper
+ftl - buys Goons
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - gains Goons
+ftl - buys Monument
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - gains Monument
+ftl - buys Monument
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - gains Monument
+ftl - shuffles deck
+ftl - draws Bishop, Goons, Scrying Pool, Scrying Pool, Village
+ 
+---------- Lord Bottington: turn 15 ----------
+Lord Bottington - plays Scrying Pool
+Lord Bottington - discards Province
+ftl - discards Goons
+Lord Bottington - reveals Copper
+Lord Bottington - plays Monument
+Lord Bottington - receives 1 victory point chips
+Lord Bottington - plays 1 Silver, 1 Copper
+Lord Bottington - buys Duchy
+Lord Bottington - gains Duchy
+Lord Bottington - draws Monument, Gold, Scrying Pool, Bishop, Copper
+ 
+---------- ftl: turn 16 ----------
+ftl - plays Scrying Pool
+ftl - places Goons on top of deck
+Lord Bottington - discards Scrying Pool
+ftl - reveals Goons, Scrying Pool, Village, Scrying Pool, Scrying Pool, Counterfeit
+ftl - plays Scrying Pool
+ftl - discards Copper
+Lord Bottington - discards Necropolis
+ftl - reveals Goons, Village, Village, Village, Monument, Goons, Monument, Scrying Pool, Necropolis, Copper
+ftl - plays Scrying Pool
+ftl - places Village on top of deck
+Lord Bottington - discards Village
+ftl - shuffles deck
+ftl - reveals Village, Copper
+ftl - plays Scrying Pool
+ftl - places Goons on top of deck
+Lord Bottington - shuffles deck
+Lord Bottington - discards Monument
+ftl - reveals Goons
+ftl - plays Scrying Pool
+Lord Bottington - discards Scrying Pool
+ftl - plays Scrying Pool
+Lord Bottington - discards Bishop
+ftl - plays Village
+ftl - plays Village
+ftl - plays Village
+ftl - plays Village
+ftl - plays Village
+ftl - plays Village
+ftl - plays Monument
+ftl - receives 1 victory point chips
+ftl - plays Monument
+ftl - receives 1 victory point chips
+ftl - plays Necropolis
+ftl - plays Goons
+Lord Bottington - discards Monument
+Lord Bottington - discards Copper
+ftl - plays Goons
+ftl - plays Goons
+ftl - plays Goons
+ftl - plays Goons
+ftl - plays Bishop
+ftl - trashes Copper
+ftl - receives 0 victory point chips
+ftl - plays Counterfeit
+ftl - plays Copper
+ftl - plays Copper
+ftl - trashes Copper
+ftl - buys Goons
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - gains Goons
+ftl - buys Goons
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - gains Goons
+ftl - buys Village
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - gains Village
+ftl - buys Village
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - gains Village
+ftl - shuffles deck
+ftl - draws Scrying Pool, Goons, Village, Scrying Pool, Village
+ 
+---------- Lord Bottington: turn 16 ----------
+Lord Bottington - plays Scrying Pool
+Lord Bottington - places Silver on top of deck
+ftl - discards Village
+Lord Bottington - reveals Silver
+Lord Bottington - plays Bishop
+Lord Bottington - trashes Gold
+Lord Bottington - receives 3 victory point chips
+Lord Bottington - plays 1 Silver
+Lord Bottington - buys Village
+Lord Bottington - gains Village
+Lord Bottington - draws Village, Gold, Scrying Pool, Copper, Province
+ 
+---------- ftl: turn 17 ----------
+ftl - plays Scrying Pool
+ftl - places Village on top of deck
+Lord Bottington - places Duchy on top of deck
+ftl - reveals Village, Goons, Scrying Pool, Goons, Village, Necropolis, Bishop, Village, Goons, Counterfeit
+ftl - plays Scrying Pool
+ftl - places Scrying Pool on top of deck
+Lord Bottington - places Duchy on top of deck
+ftl - shuffles deck
+ftl - reveals Scrying Pool, Goons, Village, Scrying Pool, Goons, Goons, Village, Monument, Scrying Pool, Monument, Village
+ftl - plays Necropolis
+ftl - plays Village
+ftl - plays Village
+ftl - plays Village
+ftl - plays Village
+ftl - plays Village
+ftl - plays Village
+ftl - plays Village
+ftl - plays Village
+ftl - plays Bishop
+ftl - trashes Counterfeit
+ftl - receives 2 victory point chips
+Lord Bottington - trashes Copper
+ftl - plays Goons
+Lord Bottington - discards Province
+ftl - plays Goons
+ftl - plays Goons
+ftl - plays Goons
+ftl - plays Goons
+ftl - plays Goons
+ftl - plays Goons
+ftl - plays Monument
+ftl - receives 1 victory point chips
+ftl - plays Monument
+ftl - receives 1 victory point chips
+ftl - buys Goons
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - gains Goons
+ftl - buys Goons
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - gains Goons
+ftl - buys Goons
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - gains Goons
+ftl - buys Copper
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - gains Copper
+ftl - buys Copper
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - gains Copper
+ftl - buys Copper
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - gains Copper
+ftl - buys Copper
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - gains Copper
+ftl - buys Copper
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - receives 1 victory point chips
+ftl - gains Copper
+ftl - shuffles deck
+ftl - draws Village, Goons, Copper, Village, Copper
+ 
+------------ Game Over ------------
+ftl - cards: 10 Goons, 8 Village, 6 Scrying Pool, 2 Monument, 1 Bishop, 1 Necropolis, 5 Copper
+ftl - victory point chips: 124
+ftl - total victory points: 124
+ftl - turns: 17
+ 
+Lord Bottington - cards: 4 Scrying Pool, 2 Village, 2 Monument, 2 Bishop, 1 Necropolis, 3 Copper, 1 Gold, 1 Silver, 1 Province, 1 Duchy
+Lord Bottington - victory point chips: 16
+Lord Bottington - total victory points: 25
+Lord Bottington - turns: 16
+ 
+1st place: ftl
+2nd place: Lord Bottington
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.50612a9b51c36e573294bfd0.1368579645597.txt b/testing/testdata/log.50612a9b51c36e573294bfd0.1368579645597.txt
new file mode 100644
index 0000000..b694e41
--- /dev/null
+++ b/testing/testdata/log.50612a9b51c36e573294bfd0.1368579645597.txt
@@ -0,0 +1,686 @@
+------------ Game Setup ------------
+Supply cards: Watchtower, Workshop, Familiar, Marauder, Noble Brigand, Band of Misfits, Mint, Mountebank, Stables, Border Village, Copper, Silver, Gold, Estate, Duchy, Province, Curse, Colony, Platinum, Potion, Ruins
+Rating system: unrated
+ftl - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Lord Bottington - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+ftl - shuffles deck
+Lord Bottington - shuffles deck
+ftl - draws Estate, Estate, Copper, Copper, Copper
+Lord Bottington - draws Copper, Copper, Copper, Copper, Copper
+ 
+---------- Lord Bottington: turn 1 ----------
+Lord Bottington - plays 5 Copper
+Lord Bottington - buys Mint
+Lord Bottington - trashes Copper, Copper, Copper, Copper, Copper
+Lord Bottington - gains Mint
+Lord Bottington - draws Estate, Estate, Copper, Estate, Copper
+ 
+---------- ftl: turn 1 ----------
+ftl - plays 3 Copper
+ftl - buys Watchtower
+ftl - gains Watchtower
+ftl - draws Copper, Estate, Copper, Copper, Copper
+ 
+---------- Lord Bottington: turn 2 ----------
+Lord Bottington - plays 2 Copper
+Lord Bottington - buys Copper
+Lord Bottington - gains Copper
+Lord Bottington - shuffles deck
+Lord Bottington - draws Estate, Copper, Copper, Mint, Estate
+ 
+---------- ftl: turn 2 ----------
+ftl - plays 4 Copper
+ftl - buys Marauder
+ftl - gains Marauder
+ftl - shuffles deck
+ftl - draws Marauder, Estate, Estate, Copper, Estate
+ 
+---------- Lord Bottington: turn 3 ----------
+Lord Bottington - plays Mint
+Lord Bottington - reveals Copper
+Lord Bottington - gains Copper
+Lord Bottington - plays 2 Copper
+Lord Bottington - draws Estate, Copper
+Lord Bottington - shuffles deck
+Lord Bottington - draws Estate, Copper, Estate
+ 
+---------- ftl: turn 3 ----------
+ftl - plays Marauder
+ftl - gains Spoils
+Lord Bottington - gains Ruined Market
+ftl - draws Copper, Watchtower, Copper, Copper, Copper
+ 
+---------- Lord Bottington: turn 4 ----------
+Lord Bottington - plays 2 Copper
+Lord Bottington - buys Copper
+Lord Bottington - gains Copper
+Lord Bottington - draws Copper, Mint, Copper
+Lord Bottington - shuffles deck
+Lord Bottington - draws Copper, Ruined Market
+ 
+---------- ftl: turn 4 ----------
+ftl - plays Watchtower
+ftl - draws Copper, Copper
+ftl - plays 6 Copper
+ftl - buys Border Village
+ftl - gains Border Village
+ftl - gains Mountebank
+ftl - shuffles deck
+ftl - draws Copper, Copper, Copper, Copper, Copper
+ 
+---------- Lord Bottington: turn 5 ----------
+Lord Bottington - plays Ruined Market
+Lord Bottington - plays 3 Copper
+Lord Bottington - buys Silver
+Lord Bottington - gains Silver
+Lord Bottington - draws Copper, Estate, Estate, Estate, Copper
+ 
+---------- ftl: turn 5 ----------
+ftl - plays 5 Copper
+ftl - buys Mint
+ftl - trashes Copper, Copper, Copper, Copper, Copper
+ftl - gains Mint
+ftl - draws Estate, Mountebank, Border Village, Copper, Marauder
+ 
+---------- Lord Bottington: turn 6 ----------
+Lord Bottington - plays 2 Copper
+Lord Bottington - shuffles deck
+Lord Bottington - draws Copper, Estate, Copper, Estate, Silver
+ 
+---------- ftl: turn 6 ----------
+ftl - plays Border Village
+ftl - draws Spoils
+ftl - plays Mountebank
+Lord Bottington - gains Curse
+Lord Bottington - gains Copper
+ftl - plays Marauder
+ftl - gains Spoils
+Lord Bottington - gains Ruined Library
+ftl - plays 1 Copper
+ftl - plays Spoils
+ftl - buys Border Village
+ftl - gains Border Village
+ftl - gains Watchtower
+ftl - draws Copper, Estate, Watchtower, Estate
+ftl - shuffles deck
+ftl - draws Border Village
+ 
+---------- Lord Bottington: turn 7 ----------
+Lord Bottington - plays 2 Copper, 1 Silver
+Lord Bottington - buys Potion
+Lord Bottington - gains Potion
+Lord Bottington - draws Copper, Copper, Ruined Market, Mint, Estate
+ 
+---------- ftl: turn 7 ----------
+ftl - plays Border Village
+ftl - draws Copper
+ftl - plays Watchtower
+ftl - draws Mountebank, Spoils
+ftl - plays Mountebank
+Lord Bottington - gains Curse
+Lord Bottington - gains Copper
+ftl - plays 2 Copper
+ftl - plays Spoils
+ftl - buys Border Village
+ftl - gains Border Village
+ftl - gains Watchtower
+ftl - draws Estate, Border Village, Mint, Marauder, Watchtower
+ 
+---------- Lord Bottington: turn 8 ----------
+Lord Bottington - plays Ruined Market
+Lord Bottington - plays 2 Copper
+Lord Bottington - draws Copper
+Lord Bottington - shuffles deck
+Lord Bottington - draws Estate, Estate, Potion, Curse
+ 
+---------- ftl: turn 8 ----------
+ftl - plays Border Village
+ftl - shuffles deck
+ftl - draws Copper
+ftl - plays Marauder
+ftl - gains Spoils
+ftl - applied Watchtower to place Spoils on top of the deck
+Lord Bottington - gains Survivors
+ftl - plays Watchtower
+ftl - draws Spoils, Watchtower, Copper
+ftl - plays 2 Copper
+ftl - plays Spoils
+ftl - buys Mountebank
+ftl - gains Mountebank
+ftl - applied Watchtower to place Mountebank on top of the deck
+ftl - draws Mountebank, Watchtower, Border Village, Estate, Mountebank
+ 
+---------- Lord Bottington: turn 9 ----------
+Lord Bottington - plays Potion
+Lord Bottington - plays 1 Copper
+Lord Bottington - draws Estate, Copper, Copper, Copper, Mint
+ 
+---------- ftl: turn 9 ----------
+ftl - plays Border Village
+ftl - draws Border Village
+ftl - plays Border Village
+ftl - draws Estate
+ftl - plays Watchtower
+ftl - shuffles deck
+ftl - draws Mint, Border Village
+ftl - plays Border Village
+ftl - draws Marauder
+ftl - plays Marauder
+ftl - gains Spoils
+Lord Bottington - gains Survivors
+ftl - plays Mountebank
+Lord Bottington - gains Curse
+Lord Bottington - gains Copper
+ftl - plays Mountebank
+Lord Bottington - gains Curse
+Lord Bottington - gains Copper
+ftl - buys Noble Brigand
+Lord Bottington - reveals: Silver, Copper
+Lord Bottington - trashes Silver
+Lord Bottington - discards Copper
+ftl - gains Silver
+ftl - gains Noble Brigand
+ftl - draws Watchtower, Watchtower, Copper, Estate, Copper
+ 
+---------- Lord Bottington: turn 10 ----------
+Lord Bottington - plays Mint
+Lord Bottington - reveals Copper
+Lord Bottington - gains Copper
+Lord Bottington - plays 3 Copper
+Lord Bottington - buys Silver
+Lord Bottington - gains Silver
+Lord Bottington - draws Copper, Ruined Library, Ruined Market, Copper, Curse
+ 
+---------- ftl: turn 10 ----------
+ftl - plays Watchtower
+ftl - shuffles deck
+ftl - draws Noble Brigand, Border Village
+ftl - plays 2 Copper
+ftl - buys Estate
+ftl - gains Estate
+ftl - applied Watchtower to trash Estate
+ftl - trashes Estate
+ftl - draws Watchtower, Spoils, Border Village, Mountebank, Mountebank
+ 
+---------- Lord Bottington: turn 11 ----------
+Lord Bottington - plays Ruined Library
+Lord Bottington - shuffles deck
+Lord Bottington - draws Silver
+Lord Bottington - plays 2 Copper, 1 Silver
+Lord Bottington - buys Marauder
+Lord Bottington - gains Marauder
+Lord Bottington - draws Curse, Potion, Survivors, Copper, Mint
+ 
+---------- ftl: turn 11 ----------
+ftl - plays Border Village
+ftl - draws Border Village
+ftl - plays Border Village
+ftl - draws Estate
+ftl - plays Mountebank
+Lord Bottington - discards Curse
+ftl - plays Mountebank
+Lord Bottington - gains Curse
+Lord Bottington - gains Copper
+ftl - plays Spoils
+ftl - buys Border Village
+ftl - gains Border Village
+ftl - gains Silver
+ftl - applied Watchtower to place Silver on top of the deck
+ftl - applied Watchtower to place Border Village on top of the deck
+ftl - draws Border Village, Silver, Estate, Mint, Silver
+ 
+---------- Lord Bottington: turn 12 ----------
+Lord Bottington - plays Mint
+Lord Bottington - reveals Potion
+Lord Bottington - gains Potion
+Lord Bottington - plays Potion
+Lord Bottington - plays 1 Copper
+Lord Bottington - buys Copper
+Lord Bottington - gains Copper
+Lord Bottington - draws Curse, Estate, Copper, Copper, Estate
+ 
+---------- ftl: turn 12 ----------
+ftl - plays Border Village
+ftl - draws Marauder
+ftl - plays Marauder
+ftl - gains Spoils
+Lord Bottington - gains Abandoned Mine
+ftl - plays Mint
+ftl - reveals Silver
+ftl - gains Silver
+ftl - plays 2 Silver
+ftl - buys Watchtower
+ftl - gains Watchtower
+ftl - shuffles deck
+ftl - draws Watchtower, Silver, Silver, Estate, Silver
+ 
+---------- Lord Bottington: turn 13 ----------
+Lord Bottington - plays 2 Copper
+Lord Bottington - buys Estate
+Lord Bottington - gains Estate
+Lord Bottington - draws Copper, Copper, Copper, Estate, Copper
+ 
+---------- ftl: turn 13 ----------
+ftl - plays Watchtower
+ftl - draws Spoils, Border Village
+ftl - plays 3 Silver
+ftl - plays Spoils
+ftl - buys Platinum
+ftl - gains Platinum
+ftl - draws Noble Brigand, Copper, Watchtower, Mint, Watchtower
+ 
+---------- Lord Bottington: turn 14 ----------
+Lord Bottington - plays 4 Copper
+Lord Bottington - buys Marauder
+Lord Bottington - gains Marauder
+Lord Bottington - draws Curse, Survivors, Copper
+Lord Bottington - shuffles deck
+Lord Bottington - draws Potion, Curse
+ 
+---------- ftl: turn 14 ----------
+ftl - plays Noble Brigand
+Lord Bottington - reveals: Copper, Copper
+Lord Bottington - discards: Copper, Copper
+ftl - draws Border Village, Border Village, Copper, Watchtower, Marauder
+ 
+---------- Lord Bottington: turn 15 ----------
+Lord Bottington - plays Survivors
+Lord Bottington - looks at Ruined Library, Copper
+Lord Bottington - discards: Ruined Library, Copper
+Lord Bottington - plays Potion
+Lord Bottington - plays 1 Copper
+Lord Bottington - buys Copper
+Lord Bottington - gains Copper
+Lord Bottington - draws Copper, Estate, Marauder, Curse, Estate
+ 
+---------- ftl: turn 15 ----------
+ftl - plays Border Village
+ftl - draws Estate
+ftl - plays Border Village
+ftl - draws Mountebank
+ftl - plays Marauder
+ftl - gains Spoils
+ftl - applied Watchtower to place Spoils on top of the deck
+Lord Bottington - gains Survivors
+ftl - plays Watchtower
+ftl - draws Spoils, Estate, Border Village
+ftl - plays Border Village
+ftl - draws Mountebank
+ftl - plays Mountebank
+Lord Bottington - discards Curse
+ftl - plays Mountebank
+Lord Bottington - gains Curse
+Lord Bottington - gains Copper
+ftl - plays 1 Copper
+ftl - plays Spoils
+ftl - buys Border Village
+ftl - gains Border Village
+ftl - gains Stables
+ftl - shuffles deck
+ftl - draws Mountebank, Watchtower, Silver, Copper, Watchtower
+ 
+---------- Lord Bottington: turn 16 ----------
+Lord Bottington - plays Marauder
+Lord Bottington - gains Spoils
+ftl - gains Ruined Library
+ftl - applied Watchtower to trash Ruined Library
+ftl - trashes Ruined Library
+Lord Bottington - plays 1 Copper
+Lord Bottington - draws Copper, Ruined Market, Copper, Curse, Copper
+ 
+---------- ftl: turn 16 ----------
+ftl - plays Mountebank
+Lord Bottington - discards Curse
+ftl - plays 1 Silver, 1 Copper
+ftl - buys Stables
+ftl - gains Stables
+ftl - applied Watchtower to place Stables on top of the deck
+ftl - draws Stables, Border Village, Silver, Mountebank, Border Village
+ 
+---------- Lord Bottington: turn 17 ----------
+Lord Bottington - plays Ruined Market
+Lord Bottington - plays 3 Copper
+Lord Bottington - buys Silver
+Lord Bottington - gains Silver
+Lord Bottington - draws Estate, Copper, Copper, Copper, Curse
+ 
+---------- ftl: turn 17 ----------
+ftl - plays Border Village
+ftl - draws Border Village
+ftl - plays Border Village
+ftl - draws Estate
+ftl - plays Border Village
+ftl - draws Noble Brigand
+ftl - plays Stables
+ftl - discards Silver
+ftl - draws Marauder, Border Village, Stables
+ftl - plays Border Village
+ftl - draws Estate
+ftl - plays Mountebank
+Lord Bottington - discards Curse
+ftl - plays Noble Brigand
+Lord Bottington - reveals: Abandoned Mine, Copper
+Lord Bottington - discards: Abandoned Mine, Copper
+ftl - plays Marauder
+ftl - gains Spoils
+Lord Bottington - gains Ruined Village
+ftl - buys Silver
+ftl - gains Silver
+ftl - draws Platinum, Border Village, Copper, Watchtower, Mint
+ 
+---------- Lord Bottington: turn 18 ----------
+Lord Bottington - plays 3 Copper
+Lord Bottington - buys Silver
+Lord Bottington - gains Silver
+Lord Bottington - draws Estate, Mint, Marauder, Potion, Silver
+ 
+---------- ftl: turn 18 ----------
+ftl - plays Border Village
+ftl - draws Watchtower
+ftl - plays Watchtower
+ftl - draws Estate, Silver
+ftl - plays Mint
+ftl - reveals Platinum
+ftl - gains Platinum
+ftl - applied Watchtower to place Platinum on top of the deck
+ftl - plays 1 Copper, 1 Silver, 1 Platinum
+ftl - buys Gold
+ftl - gains Gold
+ftl - applied Watchtower to place Gold on top of the deck
+ftl - draws Gold, Platinum
+ftl - shuffles deck
+ftl - draws Mountebank, Watchtower, Border Village
+ 
+---------- Lord Bottington: turn 19 ----------
+Lord Bottington - plays Marauder
+Lord Bottington - gains Spoils
+ftl - gains Abandoned Mine
+ftl - applied Watchtower to trash Abandoned Mine
+ftl - trashes Abandoned Mine
+Lord Bottington - plays Potion
+Lord Bottington - plays 1 Silver
+Lord Bottington - buys Estate
+Lord Bottington - gains Estate
+Lord Bottington - draws Survivors
+Lord Bottington - shuffles deck
+Lord Bottington - draws Ruined Library, Marauder, Ruined Market, Silver
+ 
+---------- ftl: turn 19 ----------
+ftl - plays Border Village
+ftl - draws Silver
+ftl - plays Watchtower
+ftl - draws Spoils, Mint
+ftl - plays Mountebank
+Lord Bottington - gains Curse
+Lord Bottington - gains Copper
+ftl - plays 1 Gold, 1 Platinum, 1 Silver
+ftl - buys Colony
+ftl - gains Colony
+ftl - draws Copper, Estate, Border Village, Border Village, Estate
+ 
+---------- Lord Bottington: turn 20 ----------
+Lord Bottington - plays Marauder
+Lord Bottington - gains Spoils
+ftl - gains Ruined Library
+Lord Bottington - plays 1 Silver
+Lord Bottington - buys Estate
+Lord Bottington - gains Estate
+Lord Bottington - draws Silver, Potion, Survivors, Survivors, Copper
+ 
+---------- ftl: turn 20 ----------
+ftl - plays Border Village
+ftl - draws Noble Brigand
+ftl - plays Border Village
+ftl - draws Platinum
+ftl - plays Noble Brigand
+Lord Bottington - reveals: Copper, Curse
+Lord Bottington - discards: Copper, Curse
+ftl - plays 1 Copper, 1 Platinum
+ftl - buys Gold
+ftl - gains Gold
+ftl - draws Watchtower, Border Village, Copper, Border Village, Stables
+ 
+---------- Lord Bottington: turn 21 ----------
+Lord Bottington - plays Survivors
+Lord Bottington - looks at Curse, Copper
+Lord Bottington - discards: Curse, Copper
+Lord Bottington - plays Potion
+Lord Bottington - plays 1 Silver, 1 Copper
+Lord Bottington - buys Silver
+Lord Bottington - gains Silver
+Lord Bottington - draws Abandoned Mine, Marauder, Estate, Mint, Copper
+ 
+---------- ftl: turn 21 ----------
+ftl - plays Border Village
+ftl - draws Estate
+ftl - plays Border Village
+ftl - draws Silver
+ftl - plays Stables
+ftl - discards Copper
+ftl - draws Watchtower, Silver, Mountebank
+ftl - plays Mountebank
+Lord Bottington - gains Curse
+Lord Bottington - gains Copper
+ftl - plays Watchtower
+ftl - draws Stables, Marauder
+ftl - plays Stables
+ftl - discards Silver
+ftl - draws Watchtower, Silver
+ftl - shuffles deck
+ftl - draws Colony
+ftl - plays Marauder
+ftl - gains Spoils
+ftl - applied Watchtower to place Spoils on top of the deck
+ftl - plays 2 Silver
+ftl - buys Gold
+ftl - gains Gold
+ftl - applied Watchtower to place Gold on top of the deck
+ftl - draws Gold, Spoils, Noble Brigand, Estate, Platinum
+ 
+---------- Lord Bottington: turn 22 ----------
+Lord Bottington - plays Marauder
+Lord Bottington - gains Spoils
+Lord Bottington - plays 1 Copper
+Lord Bottington - draws Copper, Copper, Copper, Curse, Estate
+ 
+---------- ftl: turn 22 ----------
+ftl - plays Noble Brigand
+Lord Bottington - reveals: Curse, Spoils
+Lord Bottington - discards: Curse, Spoils
+ftl - plays 1 Gold, 1 Platinum
+ftl - plays Spoils
+ftl - buys Colony
+ftl - gains Colony
+ftl - draws Mint, Platinum, Estate, Copper, Gold
+ 
+---------- Lord Bottington: turn 23 ----------
+Lord Bottington - plays 3 Copper
+Lord Bottington - buys Silver
+Lord Bottington - gains Silver
+Lord Bottington - draws Ruined Village, Copper, Copper, Copper, Estate
+ 
+---------- ftl: turn 23 ----------
+ftl - plays Mint
+ftl - reveals Platinum
+ftl - gains Platinum
+ftl - plays 1 Copper, 1 Gold, 1 Platinum
+ftl - buys Platinum
+ftl - gains Platinum
+ftl - draws Watchtower, Border Village, Silver, Spoils, Copper
+ 
+---------- Lord Bottington: turn 24 ----------
+Lord Bottington - plays 3 Copper
+Lord Bottington - buys Silver
+Lord Bottington - gains Silver
+Lord Bottington - draws Spoils, Silver, Curse, Curse, Copper
+ 
+---------- ftl: turn 24 ----------
+ftl - plays Border Village
+ftl - draws Silver
+ftl - plays Watchtower
+ftl - draws Border Village, Gold
+ftl - plays Border Village
+ftl - draws Mountebank
+ftl - plays Mountebank
+Lord Bottington - discards Curse
+ftl - plays 2 Silver, 1 Copper, 1 Gold
+ftl - plays Spoils
+ftl - buys Colony
+ftl - gains Colony
+ftl - draws Ruined Library, Border Village
+ftl - shuffles deck
+ftl - draws Colony, Platinum, Estate
+ 
+---------- Lord Bottington: turn 25 ----------
+Lord Bottington - plays 1 Silver, 1 Copper
+Lord Bottington - plays Spoils
+Lord Bottington - buys Border Village
+Lord Bottington - gains Border Village
+Lord Bottington - gains Stables
+Lord Bottington - draws Estate, Potion, Copper, Copper, Estate
+ 
+---------- ftl: turn 25 ----------
+ftl - plays Border Village
+ftl - draws Copper
+ftl - plays Ruined Library
+ftl - draws Mountebank
+ftl - plays Mountebank
+Lord Bottington - gains Curse
+Lord Bottington - gains Copper
+ftl - plays 1 Platinum, 1 Copper
+ftl - buys Gold
+ftl - gains Gold
+ftl - draws Border Village, Stables, Watchtower, Border Village, Noble Brigand
+ 
+---------- Lord Bottington: turn 26 ----------
+Lord Bottington - plays Potion
+Lord Bottington - plays 2 Copper
+Lord Bottington - buys Estate
+Lord Bottington - gains Estate
+Lord Bottington - draws Copper
+Lord Bottington - shuffles deck
+Lord Bottington - draws Copper, Copper, Copper, Survivors
+ 
+---------- ftl: turn 26 ----------
+ftl - plays Border Village
+ftl - draws Border Village
+ftl - plays Border Village
+ftl - draws Platinum
+ftl - plays Border Village
+ftl - draws Border Village
+ftl - plays Border Village
+ftl - draws Mint
+ftl - plays Mint
+ftl - reveals Platinum
+ftl - gains Platinum
+ftl - applied Watchtower to place Platinum on top of the deck
+ftl - plays Noble Brigand
+Lord Bottington - reveals: Border Village, Stables
+Lord Bottington - discards: Border Village, Stables
+Lord Bottington - gains Copper
+ftl - plays Watchtower
+ftl - draws Platinum, Platinum, Estate, Watchtower
+ftl - plays Watchtower
+ftl - draws Gold
+ftl - plays Stables
+ftl - discards Gold
+ftl - draws Gold, Silver, Marauder
+ftl - plays Marauder
+ftl - gains Spoils
+ftl - plays 3 Platinum, 1 Gold, 1 Silver
+ftl - buys Colony
+ftl - gains Colony
+ftl - draws Estate, Platinum, Silver, Mountebank, Stables
+ 
+---------- Lord Bottington: turn 27 ----------
+Lord Bottington - plays Survivors
+Lord Bottington - looks at Copper, Copper
+Lord Bottington - discards: Copper, Copper
+Lord Bottington - plays 4 Copper
+Lord Bottington - buys Estate
+Lord Bottington - gains Estate
+Lord Bottington - draws Spoils, Mint, Copper, Curse, Curse
+ 
+---------- ftl: turn 27 ----------
+ftl - plays Stables
+ftl - discards Silver
+ftl - draws Copper, Watchtower, Silver
+ftl - plays Mountebank
+Lord Bottington - discards Curse
+ftl - plays 1 Platinum, 1 Copper, 1 Silver
+ftl - buys Platinum
+ftl - gains Platinum
+ftl - applied Watchtower to place Platinum on top of the deck
+ftl - draws Platinum, Silver, Colony, Colony, Watchtower
+ 
+---------- Lord Bottington: turn 28 ----------
+Lord Bottington - plays 1 Copper
+Lord Bottington - plays Spoils
+Lord Bottington - buys Estate
+Lord Bottington - gains Estate
+Lord Bottington - draws Curse, Spoils, Marauder, Survivors, Silver
+ 
+---------- ftl: turn 28 ----------
+ftl - plays Watchtower
+ftl - draws Gold
+ftl - shuffles deck
+ftl - draws Ruined Library
+ftl - plays 1 Platinum, 1 Silver, 1 Gold
+ftl - buys Platinum
+ftl - gains Platinum
+ftl - draws Copper, Mountebank, Gold, Border Village, Silver
+ 
+---------- Lord Bottington: turn 29 ----------
+Lord Bottington - plays Marauder
+Lord Bottington - gains Spoils
+Lord Bottington - plays 1 Silver
+Lord Bottington - plays Spoils
+Lord Bottington - buys Duchy
+Lord Bottington - gains Duchy
+Lord Bottington - draws Survivors, Silver, Copper, Estate, Ruined Library
+ 
+---------- ftl: turn 29 ----------
+ftl - plays Border Village
+ftl - draws Watchtower
+ftl - plays Watchtower
+ftl - draws Border Village, Gold
+ftl - plays Border Village
+ftl - draws Marauder
+ftl - plays Mountebank
+Lord Bottington - gains Curse
+Lord Bottington - gains Copper
+ftl - plays Marauder
+ftl - gains Spoils
+ftl - plays 2 Gold, 1 Copper, 1 Silver
+ftl - buys Colony
+ftl - gains Colony
+ftl - draws Gold, Mint, Copper, Mountebank, Platinum
+ 
+---------- Lord Bottington: turn 30 ----------
+Lord Bottington - plays Ruined Library
+Lord Bottington - draws Ruined Village
+Lord Bottington - plays 1 Silver, 1 Copper
+Lord Bottington - buys Silver
+Lord Bottington - gains Silver
+Lord Bottington - draws Estate, Estate, Estate, Curse, Potion
+ 
+---------- ftl: turn 30 ----------
+ftl - plays Mountebank
+Lord Bottington - discards Curse
+ftl - plays 1 Gold, 1 Copper, 1 Platinum
+ftl - buys Estate
+ftl - gains Estate
+ftl - draws Noble Brigand, Platinum, Spoils, Silver, Watchtower
+ 
+------------ Game Over ------------
+ftl - cards: 5 Border Village, 4 Watchtower, 2 Stables, 2 Mountebank, 1 Noble Brigand, 1 Mint, 1 Marauder, 1 Ruined Library, 7 Platinum, 4 Gold, 4 Silver, 2 Copper, 2 Spoils, 5 Colony, 4 Estate
+ftl - total victory points: 54
+ftl - turns: 30
+ 
+Lord Bottington - cards: 3 Survivors, 2 Marauder, 19 Copper, 1 Ruined Market, 1 Stables, 1 Border Village, 1 Mint, 1 Ruined Village, 1 Abandoned Mine, 1 Ruined Library, 7 Silver, 2 Spoils, 2 Potion, 9 Estate, 1 Duchy, 10 Curse
+Lord Bottington - total victory points: 2
+Lord Bottington - turns: 30
+ 
+1st place: ftl
+2nd place: Lord Bottington
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.50612a9b51c36e573294bfd0.1369284870596.txt b/testing/testdata/log.50612a9b51c36e573294bfd0.1369284870596.txt
new file mode 100644
index 0000000..dcbaa7b
--- /dev/null
+++ b/testing/testdata/log.50612a9b51c36e573294bfd0.1369284870596.txt
@@ -0,0 +1,1509 @@
+------------ Game Setup ------------
+Supply cards: Vagrant, Scrying Pool, Sage, Fortress, Throne Room, Golem, Apprentice, Outpost, Possession, King's Court, Copper, Silver, Gold, Estate, Duchy, Province, Curse, Potion
+Rating system: unrated
+ftl - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Guest_979018 - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+guest5451 - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+ftl - shuffles deck
+Guest_979018 - shuffles deck
+guest5451 - shuffles deck
+ftl - draws Copper, Copper, Estate, Estate, Estate
+Guest_979018 - draws Estate, Copper, Estate, Copper, Copper
+guest5451 - draws Copper, Estate, Copper, Estate, Copper
+ 
+---------- guest5451: turn 1 ----------
+guest5451 - plays 3 Copper
+guest5451 - buys Silver
+guest5451 - gains Silver
+guest5451 - draws Copper, Copper, Estate, Copper, Copper
+ 
+---------- ftl: turn 1 ----------
+ftl - plays 2 Copper
+ftl - buys Vagrant
+ftl - gains Vagrant
+ftl - draws Copper, Copper, Copper, Copper, Copper
+ 
+---------- Guest_979018: turn 1 ----------
+Guest_979018 - plays 3 Copper
+Guest_979018 - buys Silver
+Guest_979018 - gains Silver
+Guest_979018 - draws Estate, Copper, Copper, Copper, Copper
+ 
+---------- guest5451: turn 2 ----------
+guest5451 - plays 4 Copper
+guest5451 - buys Potion
+guest5451 - gains Potion
+guest5451 - shuffles deck
+guest5451 - draws Estate, Copper, Silver, Copper, Copper
+ 
+---------- ftl: turn 2 ----------
+ftl - plays 5 Copper
+ftl - buys Apprentice
+ftl - gains Apprentice
+ftl - shuffles deck
+ftl - draws Estate, Copper, Copper, Estate, Estate
+ 
+---------- Guest_979018: turn 2 ----------
+Guest_979018 - plays 4 Copper
+Guest_979018 - buys Potion
+Guest_979018 - gains Potion
+Guest_979018 - shuffles deck
+Guest_979018 - draws Copper, Copper, Copper, Estate, Estate
+ 
+---------- guest5451: turn 3 ----------
+guest5451 - plays 3 Copper, 1 Silver
+guest5451 - buys Apprentice
+guest5451 - gains Apprentice
+guest5451 - draws Copper, Copper, Copper, Potion, Copper
+ 
+---------- ftl: turn 3 ----------
+ftl - plays 2 Copper
+ftl - buys Vagrant
+ftl - gains Vagrant
+ftl - draws Apprentice, Copper, Copper, Copper, Copper
+ 
+---------- Guest_979018: turn 3 ----------
+Guest_979018 - plays 3 Copper
+Guest_979018 - buys Silver
+Guest_979018 - gains Silver
+Guest_979018 - draws Potion, Copper, Silver, Estate, Copper
+ 
+---------- guest5451: turn 4 ----------
+guest5451 - plays 4 Copper, 1 Potion
+guest5451 - buys Golem
+guest5451 - gains Golem
+guest5451 - draws Estate, Estate
+guest5451 - shuffles deck
+guest5451 - draws Silver, Copper, Potion
+ 
+---------- ftl: turn 4 ----------
+ftl - plays Apprentice
+ftl - trashes Copper
+ftl - plays 3 Copper
+ftl - buys Silver
+ftl - gains Silver
+ftl - draws Vagrant, Copper
+ftl - shuffles deck
+ftl - draws Copper, Copper, Estate
+ 
+---------- Guest_979018: turn 4 ----------
+Guest_979018 - plays 2 Copper, 1 Potion, 1 Silver
+Guest_979018 - buys Golem
+Guest_979018 - gains Golem
+Guest_979018 - draws Copper, Copper
+Guest_979018 - shuffles deck
+Guest_979018 - draws Golem, Potion, Copper
+ 
+---------- guest5451: turn 5 ----------
+guest5451 - plays 1 Silver, 1 Copper, 1 Potion
+guest5451 - buys Scrying Pool
+guest5451 - gains Scrying Pool
+guest5451 - draws Estate, Copper, Copper, Copper, Apprentice
+ 
+---------- ftl: turn 5 ----------
+ftl - plays Vagrant
+ftl - draws Copper
+ftl - reveals: Copper
+ftl - places Copper on top of deck
+ftl - plays 4 Copper
+ftl - buys Potion
+ftl - gains Potion
+ftl - draws Copper, Estate, Estate, Copper, Apprentice
+ 
+---------- Guest_979018: turn 5 ----------
+Guest_979018 - plays Golem
+Guest_979018 - reveals Estate, Copper, Estate, Copper, Copper, Silver, Silver, Copper, Estate
+Guest_979018 - discards: Estate, Copper, Estate, Copper, Copper, Silver, Silver, Copper, Estate
+Guest_979018 - plays 3 Copper, 1 Potion
+Guest_979018 - buys Scrying Pool
+Guest_979018 - gains Scrying Pool
+Guest_979018 - shuffles deck
+Guest_979018 - draws Estate, Copper, Copper, Copper, Copper
+ 
+---------- guest5451: turn 6 ----------
+guest5451 - plays Apprentice
+guest5451 - trashes Estate
+guest5451 - draws Copper, Copper
+guest5451 - plays 5 Copper
+guest5451 - buys Outpost
+guest5451 - gains Outpost
+guest5451 - draws Golem, Copper
+guest5451 - shuffles deck
+guest5451 - draws Estate, Copper, Silver
+ 
+---------- ftl: turn 6 ----------
+ftl - plays Apprentice
+ftl - trashes Estate
+ftl - draws Vagrant, Silver
+ftl - plays Vagrant
+ftl - shuffles deck
+ftl - draws Copper
+ftl - reveals: Vagrant
+ftl - places Vagrant on top of deck
+ftl - plays 3 Copper, 1 Silver
+ftl - buys Outpost
+ftl - gains Outpost
+ftl - draws Vagrant, Estate, Copper, Copper, Potion
+ 
+---------- Guest_979018: turn 6 ----------
+Guest_979018 - plays 4 Copper
+Guest_979018 - buys Fortress
+Guest_979018 - gains Fortress
+Guest_979018 - draws Copper, Estate, Copper, Estate, Scrying Pool
+ 
+---------- guest5451: turn 7 ----------
+guest5451 - plays Golem
+guest5451 - reveals Outpost, Copper, Copper, Scrying Pool
+guest5451 - discards: Copper, Copper
+guest5451 - plays Scrying Pool
+guest5451 - discards Copper
+ftl - discards Copper
+Guest_979018 - discards Silver
+guest5451 - reveals Estate
+guest5451 - plays Outpost
+guest5451 - plays 2 Copper, 1 Silver
+guest5451 - buys Fortress
+guest5451 - gains Fortress
+guest5451 - draws Copper, Copper, Apprentice
+guest5451 - duration Outpost
+ 
+---------- guest5451: turn 7 ----------
+guest5451 - plays Apprentice
+guest5451 - trashes Copper
+guest5451 - draws Potion
+guest5451 - shuffles deck
+guest5451 - draws Fortress, Copper, Apprentice, Copper
+ 
+---------- ftl: turn 7 ----------
+ftl - plays Vagrant
+ftl - shuffles deck
+ftl - draws Vagrant
+ftl - reveals: Outpost
+ftl - places Outpost on top of deck
+ftl - plays Vagrant
+ftl - draws Outpost
+ftl - reveals: Estate
+ftl - places Estate in hand
+ftl - plays Outpost
+ftl - plays 2 Copper, 1 Potion
+ftl - buys Scrying Pool
+ftl - gains Scrying Pool
+ftl - draws Copper, Apprentice, Silver
+ftl - duration Outpost
+ 
+---------- ftl: turn 7 ----------
+ftl - plays Apprentice
+ftl - trashes Copper
+ftl - plays 1 Silver
+ftl - buys Vagrant
+ftl - gains Vagrant
+ftl - draws Copper, Copper, Copper
+ftl - shuffles deck
+ftl - draws Estate, Vagrant
+ 
+---------- Guest_979018: turn 7 ----------
+Guest_979018 - plays Scrying Pool
+Guest_979018 - places Silver on top of deck
+guest5451 - discards Copper
+ftl - places Estate on top of deck
+Guest_979018 - reveals Silver
+Guest_979018 - plays 2 Copper, 1 Silver
+Guest_979018 - buys Silver
+Guest_979018 - gains Silver
+Guest_979018 - draws Copper, Golem, Potion
+Guest_979018 - shuffles deck
+Guest_979018 - draws Copper, Scrying Pool
+ 
+---------- guest5451: turn 8 ----------
+guest5451 - plays Apprentice
+guest5451 - trashes Fortress
+guest5451 - draws Estate, Silver, Copper, Golem
+guest5451 - plays Fortress
+guest5451 - draws Copper
+guest5451 - plays Golem
+guest5451 - reveals Scrying Pool, Estate, Outpost
+guest5451 - discards Estate
+guest5451 - plays Scrying Pool
+guest5451 - discards Copper
+ftl - places Estate on top of deck
+Guest_979018 - places Estate on top of deck
+guest5451 - shuffles deck
+guest5451 - reveals Copper
+guest5451 - plays Outpost
+guest5451 - plays 5 Copper, 1 Potion, 1 Silver
+guest5451 - buys Possession
+guest5451 - gains Possession
+guest5451 - draws Estate, Copper
+guest5451 - shuffles deck
+guest5451 - draws Apprentice
+guest5451 - duration Outpost
+ 
+---------- guest5451: turn 8 ----------
+guest5451 - plays Apprentice
+guest5451 - trashes Estate
+guest5451 - draws Estate, Possession
+guest5451 - plays Possession
+guest5451 - draws Golem, Scrying Pool, Copper, Copper, Copper
+ 
+---------- ftl: turn 8 [possessed] ----------
+ftl - plays Vagrant
+ftl - draws Estate
+ftl - reveals: Apprentice
+ftl - places Apprentice on top of deck
+ftl - plays 3 Copper
+ftl - buys Silver
+guest5451 - gains Silver
+ftl - draws Apprentice, Scrying Pool, Vagrant, Copper, Copper
+ 
+---------- ftl: turn 8 ----------
+ftl - plays Vagrant
+ftl - draws Potion
+ftl - reveals: Outpost
+ftl - places Outpost on top of deck
+ftl - plays Scrying Pool
+ftl - places Outpost on top of deck
+Guest_979018 - places Estate on top of deck
+guest5451 - places Copper on top of deck
+ftl - reveals Outpost, Vagrant, Silver
+ftl - plays Vagrant
+ftl - shuffles deck
+ftl - draws Estate
+ftl - reveals: Copper
+ftl - places Copper on top of deck
+ftl - plays Apprentice
+ftl - trashes Estate
+ftl - draws Copper, Estate
+ftl - plays Outpost
+ftl - plays 3 Copper, 1 Potion, 1 Silver
+ftl - buys Golem
+ftl - gains Golem
+ftl - draws Vagrant, Copper, Copper
+ftl - duration Outpost
+ 
+---------- ftl: turn 8 ----------
+ftl - plays Vagrant
+ftl - shuffles deck
+ftl - draws Copper
+ftl - reveals: Apprentice
+ftl - places Apprentice on top of deck
+ftl - plays 3 Copper
+ftl - buys Silver
+ftl - gains Silver
+ftl - draws Apprentice, Vagrant, Golem, Vagrant, Estate
+ 
+---------- Guest_979018: turn 8 ----------
+Guest_979018 - plays Scrying Pool
+Guest_979018 - discards Estate
+guest5451 - places Copper on top of deck
+ftl - discards Scrying Pool
+Guest_979018 - reveals Silver
+Guest_979018 - plays Golem
+Guest_979018 - shuffles deck
+Guest_979018 - reveals Silver, Copper, Estate, Silver, Fortress, Estate, Copper, Copper, Copper, Copper, Estate
+Guest_979018 - discards: Silver, Copper, Estate, Silver, Estate, Copper, Copper, Copper, Copper, Estate
+Guest_979018 - plays Fortress
+Guest_979018 - shuffles deck
+Guest_979018 - draws Silver
+Guest_979018 - plays 2 Copper, 2 Silver, 1 Potion
+Guest_979018 - buys Possession
+Guest_979018 - gains Possession
+Guest_979018 - draws Copper, Estate, Silver, Copper, Copper
+ 
+---------- guest5451: turn 9 ----------
+guest5451 - plays Scrying Pool
+guest5451 - discards Copper
+ftl - discards Silver
+Guest_979018 - discards Copper
+guest5451 - reveals Fortress, Copper
+guest5451 - plays Golem
+guest5451 - shuffles deck
+guest5451 - reveals Potion, Silver, Possession, Copper, Silver, Estate, Outpost
+guest5451 - discards: Potion, Silver, Copper, Silver, Estate
+guest5451 - plays Possession
+guest5451 - plays Outpost
+guest5451 - plays 4 Copper
+guest5451 - buys Throne Room
+guest5451 - gains Throne Room
+guest5451 - draws Apprentice, Copper
+guest5451 - shuffles deck
+guest5451 - draws Silver
+guest5451 - duration Outpost
+ 
+---------- guest5451: turn 9 ----------
+guest5451 - plays Apprentice
+guest5451 - trashes Copper
+guest5451 - plays 1 Silver
+guest5451 - buys Vagrant
+guest5451 - gains Vagrant
+guest5451 - draws Scrying Pool, Silver, Copper, Copper, Golem
+ 
+---------- ftl: turn 9 [possessed] ----------
+ftl - plays Vagrant
+ftl - draws Potion
+ftl - reveals: Copper
+ftl - places Copper on top of deck
+ftl - plays Vagrant
+ftl - draws Copper
+ftl - reveals: Copper
+ftl - places Copper on top of deck
+ftl - plays Apprentice
+ftl - trashes Estate
+ftl - draws Copper
+ftl - shuffles deck
+ftl - draws Silver
+ftl - plays Golem
+ftl - reveals Copper, Scrying Pool, Outpost
+ftl - discards Copper
+ftl - plays Scrying Pool
+ftl - discards Copper
+Guest_979018 - discards Estate
+guest5451 - discards Estate
+ftl - reveals Silver
+ftl - plays Outpost
+ftl - plays 2 Copper, 2 Silver, 1 Potion
+ftl - buys Possession
+guest5451 - gains Possession
+ftl - draws Vagrant, Copper
+ftl - shuffles deck
+ftl - draws Vagrant
+ftl - duration Outpost
+ 
+---------- ftl: turn 9 ----------
+ftl - plays Vagrant
+ftl - draws Silver
+ftl - reveals: Golem
+ftl - places Golem on top of deck
+ftl - plays Vagrant
+ftl - draws Golem
+ftl - reveals: Scrying Pool
+ftl - places Scrying Pool on top of deck
+ftl - plays Golem
+ftl - reveals Scrying Pool, Copper, Vagrant
+ftl - discards Copper
+ftl - plays Scrying Pool
+ftl - discards Potion
+Guest_979018 - discards Estate
+guest5451 - places Possession on top of deck
+ftl - reveals Copper
+ftl - plays Vagrant
+ftl - draws Copper
+ftl - reveals: Silver
+ftl - places Silver on top of deck
+ftl - plays 3 Copper, 1 Silver
+ftl - buys Apprentice
+ftl - gains Apprentice
+ftl - draws Silver, Copper, Apprentice
+ftl - shuffles deck
+ftl - draws Potion, Copper
+ 
+---------- Guest_979018: turn 9 ----------
+Guest_979018 - plays 3 Copper, 1 Silver
+Guest_979018 - buys Apprentice
+Guest_979018 - gains Apprentice
+Guest_979018 - draws Copper
+Guest_979018 - shuffles deck
+Guest_979018 - draws Estate, Scrying Pool, Golem, Copper
+ 
+---------- guest5451: turn 10 ----------
+guest5451 - plays Scrying Pool
+guest5451 - places Possession on top of deck
+ftl - places Outpost on top of deck
+Guest_979018 - places Possession on top of deck
+guest5451 - reveals Possession, Copper
+guest5451 - plays Golem
+guest5451 - reveals Throne Room, Copper, Potion, Fortress
+guest5451 - discards: Copper, Potion
+guest5451 - plays Throne Room
+guest5451 - plays Possession
+guest5451 - plays Possession
+guest5451 - plays Fortress
+guest5451 - draws Copper
+guest5451 - plays 4 Copper, 1 Silver
+guest5451 - buys Gold
+guest5451 - gains Gold
+guest5451 - shuffles deck
+guest5451 - draws Copper, Possession, Copper, Potion, Copper
+ 
+---------- ftl: turn 10 [possessed] ----------
+ftl - plays 2 Copper, 1 Silver, 1 Potion
+ftl - buys Golem
+guest5451 - gains Golem
+ftl - draws Outpost, Copper, Estate, Apprentice, Silver
+ 
+---------- ftl: turn 10 [possessed] ----------
+ftl - plays Apprentice
+ftl - trashes Silver
+ftl - draws Vagrant, Vagrant, Vagrant
+ftl - plays Vagrant
+ftl - draws Scrying Pool
+ftl - reveals: Golem
+ftl - places Golem on top of deck
+ftl - plays Vagrant
+ftl - draws Golem
+ftl - reveals: Copper
+ftl - places Copper on top of deck
+ftl - plays Vagrant
+ftl - draws Copper
+ftl - reveals: Copper
+ftl - places Copper on top of deck
+ftl - plays Scrying Pool
+ftl - discards Copper
+Guest_979018 - places Possession on top of deck
+guest5451 - places Throne Room on top of deck
+ftl - shuffles deck
+ftl - reveals Copper
+ftl - plays Golem
+ftl - reveals Silver, Copper, Apprentice, Potion, Copper
+ftl - discards: Silver, Copper, Potion, Copper
+ftl - plays Apprentice
+ftl - trashes Estate
+ftl - shuffles deck
+ftl - draws Copper, Silver
+ftl - plays Outpost
+ftl - plays 4 Copper, 1 Silver
+ftl - buys Gold
+guest5451 - gains Gold
+ftl - draws Copper, Potion
+ftl - shuffles deck
+ftl - draws Vagrant
+ftl - duration Outpost
+ 
+---------- ftl: turn 10 ----------
+ftl - plays Vagrant
+ftl - draws Apprentice
+ftl - reveals: Apprentice
+ftl - places Apprentice on top of deck
+ftl - plays Apprentice
+ftl - trashes Copper
+ftl - draws Apprentice, Vagrant, Vagrant, Copper, Copper
+ 
+---------- Guest_979018: turn 10 ----------
+Guest_979018 - plays Scrying Pool
+Guest_979018 - places Possession on top of deck
+guest5451 - places Throne Room on top of deck
+ftl - discards Silver
+Guest_979018 - reveals Possession, Estate
+Guest_979018 - plays Golem
+Guest_979018 - reveals Apprentice, Copper, Copper, Fortress
+Guest_979018 - discards: Copper, Copper
+Guest_979018 - plays Fortress
+Guest_979018 - draws Copper
+Guest_979018 - plays Apprentice
+Guest_979018 - trashes Estate
+Guest_979018 - draws Copper, Silver
+Guest_979018 - plays Possession
+Guest_979018 - plays 4 Copper, 1 Silver
+Guest_979018 - buys Outpost
+Guest_979018 - gains Outpost
+Guest_979018 - draws Potion, Silver, Estate, Copper, Silver
+ 
+---------- guest5451: turn 11 [possessed] ----------
+guest5451 - plays Possession
+guest5451 - plays 3 Copper, 1 Potion
+guest5451 - buys Scrying Pool
+Guest_979018 - gains Scrying Pool
+guest5451 - draws Throne Room, Apprentice, Copper, Golem, Scrying Pool
+ 
+---------- guest5451: turn 11 ----------
+guest5451 - plays Throne Room
+guest5451 - plays Golem
+guest5451 - reveals Vagrant, Outpost
+guest5451 - plays Vagrant
+guest5451 - draws Silver
+guest5451 - reveals: Estate
+guest5451 - places Estate in hand
+guest5451 - plays Outpost
+guest5451 - plays Golem
+guest5451 - reveals Fortress, Copper, Silver, Gold, Possession
+guest5451 - discards: Copper, Silver, Gold
+guest5451 - plays Possession
+guest5451 - plays Fortress
+guest5451 - shuffles deck
+guest5451 - draws Copper
+guest5451 - plays Apprentice
+guest5451 - trashes Estate
+guest5451 - draws Potion, Gold
+guest5451 - plays Scrying Pool
+guest5451 - discards Copper
+ftl - places Scrying Pool on top of deck
+Guest_979018 - shuffles deck
+Guest_979018 - discards Copper
+guest5451 - reveals Possession, Copper
+guest5451 - plays Possession
+guest5451 - plays 3 Copper, 1 Silver, 1 Potion, 1 Gold
+guest5451 - buys King's Court
+guest5451 - gains King's Court
+guest5451 - draws Copper, Gold, Golem
+guest5451 - duration Outpost
+ 
+---------- guest5451: turn 11 ----------
+guest5451 - plays Golem
+guest5451 - shuffles deck
+guest5451 - reveals Silver, Scrying Pool, Copper, Vagrant
+guest5451 - discards: Silver, Copper
+guest5451 - plays Scrying Pool
+guest5451 - discards Copper
+ftl - places Scrying Pool on top of deck
+Guest_979018 - places Scrying Pool on top of deck
+guest5451 - reveals Throne Room, King's Court, Potion
+guest5451 - plays Vagrant
+guest5451 - draws Copper
+guest5451 - reveals: Apprentice
+guest5451 - places Apprentice on top of deck
+guest5451 - plays King's Court
+guest5451 - plays Throne Room
+guest5451 - plays Throne Room
+guest5451 - plays Throne Room
+guest5451 - plays 2 Copper, 1 Gold, 1 Potion
+guest5451 - buys Golem
+guest5451 - gains Golem
+guest5451 - draws Apprentice, Silver, Copper, Possession, Golem
+ 
+---------- ftl: turn 11 [possessed] ----------
+ftl - plays Vagrant
+ftl - draws Scrying Pool
+ftl - reveals: Copper
+ftl - places Copper on top of deck
+ftl - plays Vagrant
+ftl - draws Copper
+ftl - reveals: Copper
+ftl - places Copper on top of deck
+ftl - plays Scrying Pool
+ftl - discards Copper
+Guest_979018 - places Scrying Pool on top of deck
+guest5451 - discards Gold
+ftl - shuffles deck
+ftl - reveals Golem, Silver
+ftl - plays Golem
+ftl - reveals Outpost, Potion, Apprentice
+ftl - discards Potion
+ftl - plays Outpost
+ftl - plays Apprentice
+ftl - trashes Copper
+ftl - plays Apprentice
+ftl - trashes Copper
+ftl - plays 1 Copper, 1 Silver
+ftl - buys Sage
+guest5451 - gains Sage
+ftl - draws Vagrant, Copper, Silver
+ftl - duration Outpost
+ 
+---------- ftl: turn 11 [possessed] ----------
+ftl - plays Vagrant
+ftl - draws Estate
+ftl - shuffles deck
+ftl - reveals: Apprentice
+ftl - places Apprentice on top of deck
+ftl - plays 1 Copper, 1 Silver
+ftl - buys Sage
+guest5451 - gains Sage
+ftl - draws Apprentice, Potion, Copper, Apprentice, Vagrant
+ 
+---------- ftl: turn 11 [possessed] ----------
+ftl - plays Vagrant
+ftl - draws Copper
+ftl - reveals: Golem
+ftl - places Golem on top of deck
+ftl - plays Apprentice
+ftl - trashes Copper
+ftl - plays Apprentice
+ftl - trashes Copper
+ftl - draws Golem, Scrying Pool, Copper, Vagrant, Silver
+ 
+---------- ftl: turn 11 ----------
+ftl - plays Golem
+ftl - shuffles deck
+ftl - reveals Apprentice, Estate, Copper, Vagrant
+ftl - discards: Estate, Copper
+ftl - plays Vagrant
+ftl - draws Potion
+ftl - reveals: Outpost
+ftl - places Outpost on top of deck
+ftl - plays Apprentice
+ftl - trashes Copper
+ftl - plays Vagrant
+ftl - draws Outpost
+ftl - reveals: Silver
+ftl - places Silver on top of deck
+ftl - plays Scrying Pool
+ftl - discards Silver
+Guest_979018 - places Scrying Pool on top of deck
+guest5451 - places Fortress on top of deck
+ftl - reveals Copper
+ftl - plays Outpost
+ftl - plays 1 Silver, 1 Potion, 1 Copper
+ftl - buys Scrying Pool
+ftl - gains Scrying Pool
+ftl - draws Copper, Apprentice, Vagrant
+ftl - duration Outpost
+ 
+---------- ftl: turn 11 ----------
+ftl - plays Vagrant
+ftl - shuffles deck
+ftl - draws Estate
+ftl - reveals: Potion
+ftl - places Potion on top of deck
+ftl - plays Apprentice
+ftl - trashes Estate
+ftl - draws Potion, Apprentice
+ftl - plays Apprentice
+ftl - trashes Copper
+ftl - draws Vagrant, Copper, Vagrant, Silver, Copper
+ 
+---------- Guest_979018: turn 11 ----------
+Guest_979018 - plays 2 Silver, 1 Potion, 1 Copper
+Guest_979018 - buys Golem
+Guest_979018 - gains Golem
+Guest_979018 - draws Scrying Pool, Copper, Copper, Copper, Silver
+ 
+---------- guest5451: turn 12 ----------
+guest5451 - plays Golem
+guest5451 - reveals Fortress, Possession
+guest5451 - plays Fortress
+guest5451 - shuffles deck
+guest5451 - draws Sage
+guest5451 - plays Possession
+guest5451 - plays Sage
+guest5451 - reveals Outpost
+guest5451 - places Outpost in hand
+guest5451 - plays Apprentice
+guest5451 - trashes Copper
+guest5451 - plays Possession
+guest5451 - plays Outpost
+guest5451 - plays 1 Silver
+guest5451 - buys Vagrant
+guest5451 - gains Vagrant
+guest5451 - draws Golem, Copper, Gold
+guest5451 - duration Outpost
+ 
+---------- guest5451: turn 12 ----------
+guest5451 - plays Golem
+guest5451 - reveals Scrying Pool, Gold, Copper, Vagrant
+guest5451 - discards: Gold, Copper
+guest5451 - plays Scrying Pool
+guest5451 - places Sage on top of deck
+ftl - discards Silver
+Guest_979018 - places Scrying Pool on top of deck
+guest5451 - reveals Sage, King's Court, Throne Room, Silver
+guest5451 - plays Vagrant
+guest5451 - draws Copper
+guest5451 - reveals: Potion
+guest5451 - places Potion on top of deck
+guest5451 - plays King's Court
+guest5451 - plays Throne Room
+guest5451 - plays Sage
+guest5451 - reveals Potion
+guest5451 - places Potion in hand
+guest5451 - plays Sage
+guest5451 - reveals Golem
+guest5451 - places Golem in hand
+guest5451 - plays Throne Room
+guest5451 - plays Golem
+guest5451 - shuffles deck
+guest5451 - reveals Copper, Fortress, Copper, Possession
+guest5451 - discards: Copper, Copper
+guest5451 - plays Fortress
+guest5451 - draws Apprentice
+guest5451 - plays Possession
+guest5451 - plays Golem
+guest5451 - reveals Gold, Vagrant, Golem, Sage
+guest5451 - discards: Gold, Golem
+guest5451 - plays Vagrant
+guest5451 - draws Silver
+guest5451 - reveals: Possession
+guest5451 - places Possession on top of deck
+guest5451 - plays Sage
+guest5451 - reveals Possession
+guest5451 - places Possession in hand
+guest5451 - plays Throne Room
+guest5451 - plays Possession
+guest5451 - plays Possession
+guest5451 - plays Apprentice
+guest5451 - trashes Copper
+guest5451 - plays 2 Silver, 1 Copper, 1 Gold, 1 Potion
+guest5451 - buys King's Court
+guest5451 - gains King's Court
+guest5451 - shuffles deck
+guest5451 - draws Copper, Sage, Silver, Apprentice, Gold
+ 
+---------- ftl: turn 12 [possessed] ----------
+ftl - plays Vagrant
+ftl - draws Scrying Pool
+ftl - reveals: Scrying Pool
+ftl - places Scrying Pool on top of deck
+ftl - plays Scrying Pool
+ftl - places Scrying Pool on top of deck
+Guest_979018 - places Scrying Pool on top of deck
+guest5451 - places King's Court on top of deck
+ftl - shuffles deck
+ftl - reveals Scrying Pool, Golem, Vagrant, Apprentice, Potion
+ftl - plays Vagrant
+ftl - draws Apprentice
+ftl - reveals: Outpost
+ftl - places Outpost on top of deck
+ftl - plays Golem
+ftl - reveals Outpost, Silver
+ftl - discards Silver
+ftl - plays Outpost
+ftl - plays 2 Copper, 1 Silver, 1 Potion
+ftl - buys Throne Room
+guest5451 - gains Throne Room
+ftl - shuffles deck
+ftl - draws Vagrant, Scrying Pool, Silver
+ftl - duration Outpost
+ 
+---------- ftl: turn 12 [possessed] ----------
+ftl - plays Vagrant
+ftl - draws Scrying Pool
+ftl - reveals: Apprentice
+ftl - places Apprentice on top of deck
+ftl - plays Scrying Pool
+ftl - places Apprentice on top of deck
+Guest_979018 - places Scrying Pool on top of deck
+guest5451 - places King's Court on top of deck
+ftl - reveals Apprentice, Potion
+ftl - plays Scrying Pool
+ftl - places Golem on top of deck
+Guest_979018 - places Scrying Pool on top of deck
+guest5451 - places King's Court on top of deck
+ftl - reveals Golem, Apprentice, Vagrant, Vagrant, Copper
+ftl - plays Apprentice
+ftl - trashes Apprentice
+ftl - draws Silver, Copper
+ftl - plays Golem
+ftl - plays 2 Silver, 2 Copper, 1 Potion
+ftl - buys Gold
+guest5451 - gains Gold
+ftl - shuffles deck
+ftl - draws Copper, Silver, Golem, Scrying Pool, Scrying Pool
+ 
+---------- ftl: turn 12 [possessed] ----------
+ftl - plays Golem
+ftl - reveals Vagrant, Vagrant
+ftl - plays Vagrant
+ftl - draws Potion
+ftl - reveals: Apprentice
+ftl - places Apprentice on top of deck
+ftl - plays Vagrant
+ftl - draws Apprentice
+ftl - reveals: Vagrant
+ftl - places Vagrant on top of deck
+ftl - plays Scrying Pool
+ftl - places Vagrant on top of deck
+Guest_979018 - places Scrying Pool on top of deck
+guest5451 - places King's Court on top of deck
+ftl - reveals Vagrant, Outpost, Copper
+ftl - plays Scrying Pool
+ftl - discards Silver
+Guest_979018 - places Scrying Pool on top of deck
+guest5451 - places King's Court on top of deck
+ftl - shuffles deck
+ftl - reveals Silver
+ftl - plays Vagrant
+ftl - draws Apprentice
+ftl - plays Outpost
+ftl - plays Apprentice
+ftl - trashes Apprentice
+ftl - plays 2 Copper, 2 Silver, 1 Potion
+ftl - buys Possession
+guest5451 - gains Possession
+ftl - shuffles deck
+ftl - draws Vagrant, Apprentice, Potion
+ftl - duration Outpost
+ 
+---------- ftl: turn 12 [possessed] ----------
+ftl - plays Vagrant
+ftl - draws Silver
+ftl - reveals: Golem
+ftl - places Golem on top of deck
+ftl - plays Apprentice
+ftl - trashes Potion
+ftl - draws Golem, Copper, Vagrant, Copper
+ftl - plays Golem
+ftl - reveals Vagrant, Silver, Scrying Pool
+ftl - discards Silver
+ftl - plays Scrying Pool
+ftl - places Scrying Pool on top of deck
+Guest_979018 - places Scrying Pool on top of deck
+guest5451 - places King's Court on top of deck
+ftl - shuffles deck
+ftl - reveals Scrying Pool, Silver
+ftl - plays Vagrant
+ftl - draws Apprentice
+ftl - plays Apprentice
+ftl - trashes Scrying Pool
+ftl - plays Vagrant
+ftl - plays 2 Silver, 2 Copper
+ftl - buys Gold
+guest5451 - gains Gold
+ftl - shuffles deck
+ftl - draws Scrying Pool, Copper, Apprentice, Golem, Outpost
+ 
+---------- ftl: turn 12 [possessed] ----------
+ftl - plays Golem
+ftl - reveals Silver, Copper, Silver, Vagrant, Vagrant
+ftl - discards: Silver, Copper, Silver
+ftl - plays Vagrant
+ftl - draws Vagrant
+ftl - reveals: Apprentice
+ftl - places Apprentice on top of deck
+ftl - plays Vagrant
+ftl - draws Apprentice
+ftl - shuffles deck
+ftl - reveals: Scrying Pool
+ftl - places Scrying Pool on top of deck
+ftl - plays Scrying Pool
+ftl - places Scrying Pool on top of deck
+Guest_979018 - places Scrying Pool on top of deck
+guest5451 - places King's Court on top of deck
+ftl - reveals Scrying Pool, Silver
+ftl - plays Apprentice
+ftl - trashes Apprentice
+ftl - draws Silver, Potion, Copper
+ftl - plays Outpost
+ftl - plays 2 Copper, 2 Silver, 1 Potion
+ftl - buys Possession
+guest5451 - gains Possession
+ftl - shuffles deck
+ftl - draws Vagrant, Vagrant, Silver
+ftl - duration Outpost
+ 
+---------- ftl: turn 12 ----------
+ftl - plays Vagrant
+ftl - draws Potion
+ftl - reveals: Golem
+ftl - places Golem on top of deck
+ftl - plays Vagrant
+ftl - draws Golem
+ftl - reveals: Copper
+ftl - places Copper on top of deck
+ftl - plays Golem
+ftl - reveals Copper, Copper, Silver, Scrying Pool, Apprentice
+ftl - discards: Copper, Copper, Silver
+ftl - plays Scrying Pool
+ftl - places Scrying Pool on top of deck
+Guest_979018 - places Scrying Pool on top of deck
+guest5451 - places King's Court on top of deck
+ftl - shuffles deck
+ftl - reveals Scrying Pool, Vagrant, Copper
+ftl - plays Apprentice
+ftl - trashes Vagrant
+ftl - draws Copper, Apprentice
+ftl - plays Scrying Pool
+ftl - places Silver on top of deck
+Guest_979018 - places Scrying Pool on top of deck
+guest5451 - places King's Court on top of deck
+ftl - reveals Silver
+ftl - plays 2 Silver, 2 Copper, 1 Potion
+ftl - buys Possession
+ftl - gains Possession
+ftl - shuffles deck
+ftl - draws Apprentice, Potion, Scrying Pool, Vagrant, Outpost
+ 
+---------- Guest_979018: turn 12 ----------
+Guest_979018 - plays Scrying Pool
+Guest_979018 - places Scrying Pool on top of deck
+guest5451 - places King's Court on top of deck
+ftl - discards Copper
+Guest_979018 - reveals Scrying Pool, Outpost, Copper
+Guest_979018 - plays Scrying Pool
+Guest_979018 - discards Copper
+guest5451 - places King's Court on top of deck
+ftl - places Scrying Pool on top of deck
+Guest_979018 - reveals Estate
+Guest_979018 - plays Outpost
+Guest_979018 - plays 4 Copper, 1 Silver
+Guest_979018 - buys Gold
+Guest_979018 - gains Gold
+Guest_979018 - draws Apprentice, Golem, Fortress
+Guest_979018 - duration Outpost
+ 
+---------- Guest_979018: turn 12 ----------
+Guest_979018 - plays Apprentice
+Guest_979018 - trashes Fortress
+Guest_979018 - draws Possession
+Guest_979018 - shuffles deck
+Guest_979018 - draws Estate, Silver, Copper
+Guest_979018 - plays Fortress
+Guest_979018 - draws Copper
+Guest_979018 - plays Golem
+Guest_979018 - reveals Copper, Copper, Golem, Gold, Silver, Estate, Copper, Scrying Pool, Copper, Copper, Scrying Pool
+Guest_979018 - discards: Copper, Copper, Golem, Gold, Silver, Estate, Copper, Copper, Copper
+Guest_979018 - plays Scrying Pool
+Guest_979018 - places Potion on top of deck
+guest5451 - places King's Court on top of deck
+ftl - places Scrying Pool on top of deck
+Guest_979018 - reveals Potion
+Guest_979018 - plays Scrying Pool
+Guest_979018 - discards Silver
+guest5451 - places King's Court on top of deck
+ftl - places Scrying Pool on top of deck
+Guest_979018 - shuffles deck
+Guest_979018 - reveals Estate
+Guest_979018 - plays Possession
+Guest_979018 - plays 2 Copper, 1 Silver, 1 Potion
+Guest_979018 - buys Golem
+Guest_979018 - gains Golem
+Guest_979018 - draws Copper, Golem, Copper, Silver, Silver
+ 
+---------- guest5451: turn 13 [possessed] ----------
+guest5451 - plays Sage
+guest5451 - reveals King's Court
+guest5451 - places King's Court in hand
+guest5451 - plays Apprentice
+guest5451 - trashes Silver
+guest5451 - draws Possession, Golem, Gold
+guest5451 - plays King's Court
+guest5451 - plays Golem
+guest5451 - reveals King's Court, Vagrant
+guest5451 - plays King's Court
+guest5451 - plays Possession
+guest5451 - plays Possession
+guest5451 - plays Possession
+guest5451 - plays Vagrant
+guest5451 - draws Potion
+guest5451 - reveals: Copper
+guest5451 - places Copper on top of deck
+guest5451 - plays Golem
+guest5451 - reveals Copper, Copper, Possession, Golem, Fortress
+guest5451 - discards: Copper, Copper, Golem
+guest5451 - plays Fortress
+guest5451 - draws Golem
+guest5451 - plays Possession
+guest5451 - plays Golem
+guest5451 - reveals Throne Room, Vagrant
+guest5451 - plays Throne Room
+guest5451 - plays Golem
+guest5451 - reveals Scrying Pool, Sage
+guest5451 - plays Scrying Pool
+guest5451 - places Outpost on top of deck
+ftl - places Scrying Pool on top of deck
+Guest_979018 - discards Copper
+guest5451 - reveals Outpost, Silver
+guest5451 - plays Sage
+guest5451 - shuffles deck
+guest5451 - reveals Possession
+guest5451 - places Possession in hand
+guest5451 - plays Golem
+guest5451 - reveals Gold, Copper, Possession, Throne Room
+guest5451 - discards: Gold, Copper
+guest5451 - plays Throne Room
+guest5451 - plays Possession
+guest5451 - plays Possession
+guest5451 - plays Possession
+guest5451 - plays Vagrant
+guest5451 - draws Golem
+guest5451 - reveals: Gold
+guest5451 - places Gold on top of deck
+guest5451 - plays Golem
+guest5451 - shuffles deck
+guest5451 - reveals Gold, Copper, Copper, Gold
+guest5451 - discards: Gold, Copper, Copper, Gold
+guest5451 - plays Outpost
+guest5451 - plays 2 Gold, 1 Copper, 1 Potion, 1 Silver
+guest5451 - buys King's Court
+Guest_979018 - gains King's Court
+guest5451 - shuffles deck
+guest5451 - draws Golem, Fortress, Possession
+guest5451 - duration Outpost
+ 
+---------- guest5451: turn 13 ----------
+guest5451 - plays Fortress
+guest5451 - draws Potion
+guest5451 - plays Golem
+guest5451 - reveals Sage, Gold, King's Court
+guest5451 - discards Gold
+guest5451 - plays Sage
+guest5451 - reveals Scrying Pool, Gold
+guest5451 - places Gold in hand
+guest5451 - discards Scrying Pool
+guest5451 - plays King's Court
+guest5451 - plays Possession
+guest5451 - plays Possession
+guest5451 - plays Possession
+guest5451 - plays 1 Potion, 1 Gold
+guest5451 - buys Scrying Pool
+guest5451 - gains Scrying Pool
+guest5451 - draws Gold, Copper, Copper, Copper, Vagrant
+ 
+---------- ftl: turn 13 [possessed] ----------
+ftl - plays Scrying Pool
+ftl - places Scrying Pool on top of deck
+Guest_979018 - places Copper on top of deck
+guest5451 - places Sage on top of deck
+ftl - reveals Scrying Pool, Possession, Silver
+ftl - plays Scrying Pool
+ftl - discards Copper
+Guest_979018 - discards Copper
+guest5451 - places Sage on top of deck
+ftl - reveals Golem, Apprentice, Vagrant, Silver
+ftl - plays Vagrant
+ftl - shuffles deck
+ftl - draws Copper
+ftl - reveals: Copper
+ftl - places Copper on top of deck
+ftl - plays Vagrant
+ftl - draws Copper
+ftl - plays Apprentice
+ftl - trashes Copper
+ftl - plays Apprentice
+ftl - trashes Copper
+ftl - plays Possession
+ftl - plays 2 Silver, 1 Potion
+ftl - buys Fortress
+guest5451 - gains Fortress
+ftl - shuffles deck
+ftl - draws Golem, Scrying Pool, Silver, Silver, Vagrant
+ 
+---------- ftl: turn 13 [possessed] ----------
+ftl - plays Golem
+ftl - reveals Outpost, Potion, Apprentice
+ftl - discards Potion
+ftl - plays Apprentice
+ftl - trashes Vagrant
+ftl - draws Scrying Pool, Possession
+ftl - plays Outpost
+ftl - plays Scrying Pool
+ftl - places Apprentice on top of deck
+Guest_979018 - discards Copper
+guest5451 - places Sage on top of deck
+ftl - shuffles deck
+ftl - reveals Apprentice, Vagrant, Copper
+ftl - plays Scrying Pool
+ftl - discards Potion
+Guest_979018 - discards Gold
+guest5451 - places Sage on top of deck
+ftl - reveals Copper
+ftl - plays Vagrant
+ftl - shuffles deck
+ftl - draws Potion
+ftl - plays Possession
+ftl - plays 2 Silver, 2 Copper, 1 Potion
+ftl - buys Possession
+guest5451 - gains Possession
+ftl - shuffles deck
+ftl - draws Copper, Vagrant, Copper
+ftl - duration Outpost
+ 
+---------- ftl: turn 13 [possessed] ----------
+ftl - plays Vagrant
+ftl - draws Apprentice
+ftl - reveals: Possession
+ftl - places Possession on top of deck
+ftl - plays Apprentice
+ftl - trashes Copper
+ftl - draws Possession, Scrying Pool, Apprentice, Silver, Silver
+ 
+---------- ftl: turn 13 [possessed] ----------
+ftl - plays Scrying Pool
+ftl - discards Potion
+Guest_979018 - shuffles deck
+Guest_979018 - discards Copper
+guest5451 - places Sage on top of deck
+ftl - shuffles deck
+ftl - reveals Scrying Pool, Golem, Outpost, Copper
+ftl - plays Golem
+ftl - reveals Vagrant, Potion, Apprentice
+ftl - discards Potion
+ftl - plays Vagrant
+ftl - draws Copper
+ftl - reveals: Vagrant
+ftl - places Vagrant on top of deck
+ftl - plays Apprentice
+ftl - trashes Apprentice
+ftl - draws Vagrant
+ftl - shuffles deck
+ftl - draws Potion
+ftl - plays Possession
+ftl - plays Outpost
+ftl - plays 2 Silver, 2 Copper, 1 Potion
+ftl - buys Possession
+guest5451 - gains Possession
+ftl - shuffles deck
+ftl - draws Vagrant, Silver, Possession
+ftl - duration Outpost
+ 
+---------- ftl: turn 13 [possessed] ----------
+ftl - plays Vagrant
+ftl - draws Vagrant
+ftl - reveals: Silver
+ftl - places Silver on top of deck
+ftl - plays Vagrant
+ftl - draws Silver
+ftl - reveals: Golem
+ftl - places Golem on top of deck
+ftl - plays Possession
+ftl - plays 2 Silver
+ftl - buys Throne Room
+guest5451 - gains Throne Room
+ftl - draws Golem, Copper, Potion, Scrying Pool, Copper
+ 
+---------- ftl: turn 13 [possessed] ----------
+ftl - plays Golem
+ftl - reveals Apprentice, Scrying Pool
+ftl - plays Scrying Pool
+ftl - shuffles deck
+ftl - places Vagrant on top of deck
+Guest_979018 - places Possession on top of deck
+guest5451 - places Sage on top of deck
+ftl - reveals Vagrant, Vagrant, Apprentice, Possession, Outpost, Silver
+ftl - plays Apprentice
+ftl - trashes Apprentice
+ftl - draws Silver
+ftl - plays Possession
+ftl - plays Outpost
+ftl - plays 2 Copper, 2 Silver, 1 Potion
+ftl - buys Golem
+guest5451 - gains Golem
+ftl - shuffles deck
+ftl - draws Vagrant, Silver, Potion
+ftl - duration Outpost
+ 
+---------- ftl: turn 13 [possessed] ----------
+ftl - plays Vagrant
+ftl - draws Silver
+ftl - reveals: Vagrant
+ftl - places Vagrant on top of deck
+ftl - plays 2 Silver, 1 Potion
+ftl - buys Throne Room
+guest5451 - gains Throne Room
+ftl - draws Vagrant, Copper, Scrying Pool, Possession, Golem
+ 
+---------- ftl: turn 13 [possessed] ----------
+ftl - plays Golem
+ftl - reveals Copper, Scrying Pool, Apprentice
+ftl - discards Copper
+ftl - plays Scrying Pool
+ftl - shuffles deck
+ftl - discards Copper
+Guest_979018 - places Possession on top of deck
+guest5451 - places Sage on top of deck
+ftl - reveals Silver
+ftl - plays Apprentice
+ftl - trashes Silver
+ftl - draws Outpost, Vagrant, Potion
+ftl - plays Vagrant
+ftl - draws Silver
+ftl - reveals: Apprentice
+ftl - places Apprentice on top of deck
+ftl - plays Vagrant
+ftl - draws Apprentice
+ftl - shuffles deck
+ftl - reveals: Copper
+ftl - places Copper on top of deck
+ftl - plays Possession
+ftl - plays Outpost
+ftl - plays 1 Copper, 1 Potion, 1 Silver
+ftl - buys Scrying Pool
+guest5451 - gains Scrying Pool
+ftl - draws Copper
+ftl - shuffles deck
+ftl - draws Apprentice, Vagrant
+ftl - duration Outpost
+ 
+---------- ftl: turn 13 [possessed] ----------
+ftl - plays Vagrant
+ftl - draws Vagrant
+ftl - reveals: Scrying Pool
+ftl - places Scrying Pool on top of deck
+ftl - plays Vagrant
+ftl - draws Scrying Pool
+ftl - reveals: Golem
+ftl - places Golem on top of deck
+ftl - plays Scrying Pool
+ftl - places Golem on top of deck
+Guest_979018 - places Possession on top of deck
+guest5451 - places Sage on top of deck
+ftl - reveals Golem, Apprentice, Scrying Pool, Possession, Copper
+ftl - plays Golem
+ftl - shuffles deck
+ftl - reveals Silver, Potion, Silver
+ftl - discards: Silver, Potion, Silver
+ftl - plays 2 Copper
+ftl - buys Vagrant
+guest5451 - gains Vagrant
+ftl - shuffles deck
+ftl - draws Silver, Copper, Scrying Pool, Apprentice, Apprentice
+ 
+---------- ftl: turn 13 [possessed] ----------
+ftl - plays Apprentice
+ftl - trashes Apprentice
+ftl - draws Potion, Copper, Possession, Outpost, Vagrant
+ftl - plays Vagrant
+ftl - draws Silver
+ftl - reveals: Vagrant
+ftl - places Vagrant on top of deck
+ftl - plays Scrying Pool
+ftl - discards Vagrant
+Guest_979018 - places Possession on top of deck
+guest5451 - places Sage on top of deck
+ftl - shuffles deck
+ftl - reveals Scrying Pool, Golem, Vagrant
+ftl - plays Possession
+ftl - plays 2 Silver, 2 Copper, 1 Potion
+ftl - buys Possession
+guest5451 - gains Possession
+ftl - shuffles deck
+ftl - draws Silver, Outpost, Copper, Possession, Golem
+ 
+---------- ftl: turn 13 ----------
+ftl - plays Golem
+ftl - reveals Apprentice, Vagrant
+ftl - plays Vagrant
+ftl - draws Vagrant
+ftl - reveals: Copper
+ftl - places Copper on top of deck
+ftl - plays Apprentice
+ftl - trashes Copper
+ftl - plays Vagrant
+ftl - draws Copper
+ftl - reveals: Scrying Pool
+ftl - places Scrying Pool on top of deck
+ftl - plays Possession
+ftl - plays Outpost
+ftl - plays 1 Silver, 1 Copper
+ftl - buys Sage
+ftl - gains Sage
+ftl - draws Scrying Pool, Scrying Pool, Silver
+ftl - duration Outpost
+ 
+---------- ftl: turn 13 ----------
+ftl - plays Scrying Pool
+ftl - discards Potion
+Guest_979018 - places Possession on top of deck
+guest5451 - places Sage on top of deck
+ftl - shuffles deck
+ftl - reveals Golem, Vagrant, Apprentice, Sage, Possession, Copper
+ftl - plays Golem
+ftl - reveals Silver, Vagrant, Apprentice
+ftl - discards Silver
+ftl - plays Vagrant
+ftl - draws Potion
+ftl - shuffles deck
+ftl - reveals: Silver
+ftl - places Silver on top of deck
+ftl - plays Apprentice
+ftl - trashes Copper
+ftl - plays Vagrant
+ftl - draws Silver
+ftl - plays Possession
+ftl - plays 2 Silver, 1 Potion
+ftl - buys Throne Room
+ftl - gains Throne Room
+ftl - shuffles deck
+ftl - draws Golem, Sage, Vagrant, Silver, Scrying Pool
+ 
+---------- Guest_979018: turn 13 [possessed] ----------
+Guest_979018 - plays Golem
+Guest_979018 - reveals Possession, Potion, Copper, Scrying Pool
+Guest_979018 - discards: Potion, Copper
+Guest_979018 - plays Scrying Pool
+Guest_979018 - places Scrying Pool on top of deck
+guest5451 - places Sage on top of deck
+ftl - places Apprentice on top of deck
+Guest_979018 - reveals Scrying Pool, Copper
+Guest_979018 - plays Possession
+Guest_979018 - plays Scrying Pool
+Guest_979018 - places Apprentice on top of deck
+guest5451 - places Sage on top of deck
+ftl - places Apprentice on top of deck
+Guest_979018 - reveals Apprentice, Estate
+Guest_979018 - plays Apprentice
+Guest_979018 - trashes Silver
+Guest_979018 - draws Golem, Gold, Golem
+Guest_979018 - plays Golem
+Guest_979018 - reveals Copper, Estate, King's Court, Copper, Silver, Fortress
+Guest_979018 - discards: Copper, Estate, Copper, Silver
+Guest_979018 - plays King's Court
+Guest_979018 - plays Golem
+Guest_979018 - shuffles deck
+Guest_979018 - reveals Outpost, Estate, Copper, Silver, Copper, Copper, Potion, Copper
+Guest_979018 - discards: Estate, Copper, Silver, Copper, Copper, Potion, Copper
+Guest_979018 - plays Outpost
+Guest_979018 - plays Golem
+Guest_979018 - shuffles deck
+Guest_979018 - reveals Estate, Silver, Copper, Copper, Potion, Copper, Copper
+Guest_979018 - discards: Estate, Silver, Copper, Copper, Potion, Copper, Copper
+Guest_979018 - plays Golem
+Guest_979018 - shuffles deck
+Guest_979018 - reveals Copper, Estate, Copper, Copper, Copper, Potion, Silver
+Guest_979018 - discards: Copper, Estate, Copper, Copper, Copper, Potion, Silver
+Guest_979018 - plays Fortress
+Guest_979018 - shuffles deck
+Guest_979018 - draws Potion
+Guest_979018 - plays 3 Copper, 1 Silver, 1 Gold, 1 Potion
+Guest_979018 - buys Possession
+ftl - gains Possession
+Guest_979018 - draws Copper, Copper, Estate
+Guest_979018 - duration Outpost
+ 
+---------- Guest_979018: turn 13 [possessed] ----------
+Guest_979018 - plays 2 Copper
+Guest_979018 - buys Vagrant
+ftl - gains Vagrant
+Guest_979018 - draws Copper, Silver, Copper
+Guest_979018 - shuffles deck
+Guest_979018 - draws Copper, Apprentice
+ 
+---------- Guest_979018: turn 13 [possessed] ----------
+Guest_979018 - plays Apprentice
+Guest_979018 - trashes Silver
+Guest_979018 - draws Possession, Copper, Copper
+Guest_979018 - plays Possession
+Guest_979018 - plays 5 Copper
+Guest_979018 - buys Throne Room
+ftl - gains Throne Room
+Guest_979018 - draws Copper, Outpost, Silver, Golem, Scrying Pool
+ 
+---------- Guest_979018: turn 13 [possessed] ----------
+Guest_979018 - plays Golem
+Guest_979018 - reveals King's Court, Fortress
+Guest_979018 - plays Fortress
+Guest_979018 - draws Silver
+Guest_979018 - plays King's Court
+Guest_979018 - plays Scrying Pool
+Guest_979018 - places Scrying Pool on top of deck
+guest5451 - places Sage on top of deck
+ftl - places Apprentice on top of deck
+Guest_979018 - reveals Scrying Pool, Estate
+Guest_979018 - plays Scrying Pool
+Guest_979018 - places Golem on top of deck
+guest5451 - places Sage on top of deck
+ftl - places Apprentice on top of deck
+Guest_979018 - reveals Golem, Golem, Estate
+Guest_979018 - plays Scrying Pool
+Guest_979018 - discards Gold
+guest5451 - places Sage on top of deck
+ftl - places Apprentice on top of deck
+Guest_979018 - reveals Copper
+Guest_979018 - plays Golem
+Guest_979018 - shuffles deck
+Guest_979018 - reveals Potion, Copper, Copper, Copper, Silver, Possession, Apprentice
+Guest_979018 - discards: Potion, Copper, Copper, Copper, Silver
+Guest_979018 - plays Apprentice
+Guest_979018 - trashes Estate
+Guest_979018 - draws Gold, Copper
+Guest_979018 - plays Possession
+Guest_979018 - plays Golem
+Guest_979018 - shuffles deck
+Guest_979018 - reveals Copper, Silver, Copper, Copper, Potion, Copper
+Guest_979018 - discards: Copper, Silver, Copper, Copper, Potion, Copper
+Guest_979018 - plays Scrying Pool
+Guest_979018 - shuffles deck
+Guest_979018 - discards Copper
+guest5451 - places Sage on top of deck
+ftl - places Apprentice on top of deck
+Guest_979018 - reveals Copper
+Guest_979018 - plays Outpost
+Guest_979018 - plays 4 Copper, 2 Silver, 1 Gold
+Guest_979018 - buys King's Court
+ftl - gains King's Court
+Guest_979018 - draws Copper, Copper, Potion
+Guest_979018 - duration Outpost
+ 
+---------- Guest_979018: turn 13 [possessed] ----------
+Guest_979018 - plays 2 Copper, 1 Potion
+Guest_979018 - buys Scrying Pool
+ftl - gains Scrying Pool
+Guest_979018 - draws Silver
+Guest_979018 - shuffles deck
+Guest_979018 - draws Copper, Possession, Scrying Pool, Scrying Pool
+ 
+---------- Guest_979018: turn 13 [possessed] ----------
+Guest_979018 - plays Scrying Pool
+Guest_979018 - discards Copper
+guest5451 - places Sage on top of deck
+ftl - places Apprentice on top of deck
+Guest_979018 - reveals Apprentice, Silver
+Guest_979018 - plays Scrying Pool
+Guest_979018 - discards Copper
+guest5451 - places Sage on top of deck
+ftl - places Apprentice on top of deck
+Guest_979018 - reveals Copper
+Guest_979018 - plays Apprentice
+Guest_979018 - trashes Silver
+Guest_979018 - draws King's Court, Gold, Estate
+Guest_979018 - plays King's Court
+Guest_979018 - plays Possession
+Guest_979018 - plays Possession
+Guest_979018 - plays Possession
+Guest_979018 - plays 2 Copper, 1 Silver, 1 Gold
+Guest_979018 - buys King's Court
+ftl - gains King's Court
+Guest_979018 - draws Outpost, Golem, Silver, Copper, Estate
+ 
+---------- Guest_979018: turn 13 [possessed] ----------
+Guest_979018 - plays Golem
+Guest_979018 - shuffles deck
+Guest_979018 - reveals Copper, Copper, Golem, Fortress, Golem, Potion, Silver, Copper, Copper, Copper, King's Court
+Guest_979018 - discards: Copper, Copper, Golem, Golem, Potion, Silver, Copper, Copper, Copper
+Guest_979018 - plays Fortress
+Guest_979018 - draws Silver
+Guest_979018 - plays King's Court
+Guest_979018 - plays Outpost
+Guest_979018 - plays Outpost
+Guest_979018 - plays Outpost
+Guest_979018 - plays 2 Silver, 1 Copper
+Guest_979018 - buys Throne Room
+ftl - gains Throne Room
+Guest_979018 - draws Scrying Pool, Copper, Scrying Pool
+Guest_979018 - duration Outpost
+ 
+---------- Guest_979018: turn 13 [possessed] ----------
+Guest_979018 - plays Scrying Pool
+Guest_979018 - discards Estate
+guest5451 - places Sage on top of deck
+ftl - places Apprentice on top of deck
+Guest_979018 - reveals Possession, Gold
+Guest_979018 - plays Scrying Pool
+Guest_979018 - places Apprentice on top of deck
+guest5451 - places Sage on top of deck
+ftl - places Apprentice on top of deck
+Guest_979018 - shuffles deck
+Guest_979018 - reveals Apprentice, Golem, Golem, Silver
+Guest_979018 - plays Golem
+Guest_979018 - reveals Golem, Copper, Estate, Copper, Copper, Silver, Estate, Fortress, Silver, Copper, Copper, Copper, Potion
+Guest_979018 - discards: Golem, Copper, Estate, Copper, Copper, Silver, Estate, Silver, Copper, Copper, Copper, Potion
+Guest_979018 - plays Fortress
+Guest_979018 - shuffles deck
+Guest_979018 - draws Golem
+Guest_979018 - plays Apprentice
+Guest_979018 - trashes Golem
+Guest_979018 - draws Estate, Potion, Estate, Copper, Copper, Copper
+Guest_979018 - plays Golem
+Guest_979018 - reveals Silver, Copper, Silver, Copper, Copper
+Guest_979018 - discards: Silver, Copper, Silver, Copper, Copper
+Guest_979018 - plays Possession
+Guest_979018 - plays 4 Copper, 1 Gold, 1 Silver, 1 Potion
+Guest_979018 - buys Golem
+ftl - gains Golem
+Guest_979018 - shuffles deck
+Guest_979018 - draws Copper, Silver, Silver, Copper, Possession
+ 
+---------- Guest_979018: turn 13 [possessed] ----------
+Guest_979018 - plays Possession
+Guest_979018 - plays 2 Copper, 2 Silver
+Guest_979018 - buys Throne Room
+ftl - gains Throne Room
+Guest_979018 - draws Copper, Outpost, Estate, Estate, Golem
+ 
+---------- Guest_979018: turn 13 ----------
+ 
+------------ Game Over ------------
+ftl - cards: 4 Throne Room, 3 Vagrant, 3 Scrying Pool, 2 Possession, 2 Golem, 2 King's Court, 2 Apprentice, 1 Sage, 1 Outpost, 2 Silver, 1 Potion
+ftl - total victory points: 0
+ftl - turns: 13
+ 
+guest5451 - cards: 7 Possession, 4 Golem, 4 Throne Room, 3 Vagrant, 3 Scrying Pool, 2 Fortress, 2 Sage, 2 King's Court, 1 Apprentice, 1 Outpost, 4 Gold, 3 Copper, 2 Silver, 1 Potion
+guest5451 - total victory points: 0
+guest5451 - turns: 13
+ 
+Guest_979018 - quit
+Guest_979018 - cards: 3 Golem, 2 Scrying Pool, 1 King's Court, 1 Apprentice, 1 Possession, 1 Fortress, 1 Outpost, 7 Copper, 3 Silver, 1 Potion, 1 Gold, 2 Estate
+Guest_979018 - total victory points: 2
+Guest_979018 - turns: 12
+ 
+1st place: ftl
+1st place: guest5451
+2nd place: Guest_979018
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.50612a9b51c36e573294bfd0.1369375420361.txt b/testing/testdata/log.50612a9b51c36e573294bfd0.1369375420361.txt
new file mode 100644
index 0000000..2e89bf6
--- /dev/null
+++ b/testing/testdata/log.50612a9b51c36e573294bfd0.1369375420361.txt
@@ -0,0 +1,148 @@
+------------ Game Setup ------------
+Supply cards: Band of Misfits, Bandit Camp, City, Goons, Grand Market, Bank, Expand, Forge, King's Court, Peddler, Copper, Silver, Gold, Estate, Duchy, Province, Curse
+Rating system: unrated
+ftl - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Serf Bot - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+ftl - shuffles deck
+Serf Bot - shuffles deck
+ftl - draws Copper, Copper, Copper, Estate, Copper
+Serf Bot - draws Estate, Copper, Estate, Copper, Copper
+ 
+---------- Serf Bot: turn 1 ----------
+Serf Bot - plays 3 Copper
+Serf Bot - buys Silver
+Serf Bot - gains Silver
+Serf Bot - draws Estate, Copper, Copper, Copper, Copper
+ 
+---------- ftl: turn 1 ----------
+ftl - plays 4 Copper
+ftl - buys Silver
+ftl - gains Silver
+ftl - draws Copper, Copper, Estate, Copper, Estate
+ 
+---------- Serf Bot: turn 2 ----------
+Serf Bot - plays 4 Copper
+Serf Bot - buys Silver
+Serf Bot - gains Silver
+Serf Bot - shuffles deck
+Serf Bot - draws Copper, Estate, Copper, Estate, Silver
+ 
+---------- ftl: turn 2 ----------
+ftl - plays 3 Copper
+ftl - buys Silver
+ftl - gains Silver
+ftl - shuffles deck
+ftl - draws Estate, Copper, Copper, Copper, Estate
+ 
+---------- Serf Bot: turn 3 ----------
+Serf Bot - plays 2 Copper, 1 Silver
+Serf Bot - buys Silver
+Serf Bot - gains Silver
+Serf Bot - draws Copper, Copper, Silver, Copper, Copper
+ 
+---------- ftl: turn 3 ----------
+ftl - plays 3 Copper
+ftl - buys Silver
+ftl - gains Silver
+ftl - draws Copper, Copper, Silver, Estate, Copper
+ 
+---------- Serf Bot: turn 4 ----------
+Serf Bot - plays 4 Copper, 1 Silver
+Serf Bot - buys Goons
+Serf Bot - gains Goons
+Serf Bot - draws Estate, Copper
+Serf Bot - shuffles deck
+Serf Bot - draws Copper, Copper, Silver
+ 
+---------- ftl: turn 4 ----------
+ftl - plays 3 Copper, 1 Silver
+ftl - buys Band of Misfits
+ftl - gains Band of Misfits
+ftl - draws Silver, Copper
+ftl - shuffles deck
+ftl - draws Silver, Copper, Copper
+ 
+---------- Serf Bot: turn 5 ----------
+Serf Bot - plays 3 Copper, 1 Silver
+Serf Bot - buys Bandit Camp
+Serf Bot - gains Bandit Camp
+Serf Bot - draws Copper, Copper, Estate, Goons, Copper
+ 
+---------- ftl: turn 5 ----------
+ftl - plays 3 Copper, 2 Silver
+ftl - buys Forge
+ftl - gains Forge
+ftl - draws Silver, Band of Misfits, Copper, Copper, Estate
+ 
+---------- Serf Bot: turn 6 ----------
+Serf Bot - plays Goons
+ftl - discards Estate
+ftl - discards Copper
+Serf Bot - plays 3 Copper
+Serf Bot - buys Bandit Camp
+Serf Bot - receives 1 victory point chips
+Serf Bot - gains Bandit Camp
+Serf Bot - draws Silver, Copper, Silver, Estate
+Serf Bot - shuffles deck
+Serf Bot - draws Estate
+ 
+---------- ftl: turn 6 ----------
+ftl - plays Band of Misfits
+ftl - plays 1 Silver, 1 Copper
+ftl - buys Silver
+ftl - gains Silver
+ftl - draws Copper, Estate, Copper, Estate
+ftl - shuffles deck
+ftl - draws Copper
+ 
+---------- Serf Bot: turn 7 ----------
+Serf Bot - plays 2 Silver, 1 Copper
+Serf Bot - buys Bandit Camp
+Serf Bot - gains Bandit Camp
+Serf Bot - draws Bandit Camp, Bandit Camp, Silver, Copper, Copper
+ 
+---------- ftl: turn 7 ----------
+ftl - plays 3 Copper
+ftl - buys Silver
+ftl - gains Silver
+ftl - draws Silver, Estate, Copper, Copper, Band of Misfits
+ 
+---------- Serf Bot: turn 8 ----------
+Serf Bot - plays Bandit Camp
+Serf Bot - draws Copper
+Serf Bot - gains Spoils
+Serf Bot - plays Bandit Camp
+Serf Bot - draws Estate
+Serf Bot - gains Spoils
+Serf Bot - plays 3 Copper, 1 Silver
+Serf Bot - buys Peddler
+Serf Bot - gains Peddler
+Serf Bot - draws Copper, Copper, Goons, Copper
+Serf Bot - shuffles deck
+Serf Bot - draws Copper
+ 
+---------- ftl: turn 8 ----------
+ftl - plays Band of Misfits
+ftl - plays 2 Copper, 1 Silver
+ftl - buys Silver
+ftl - gains Silver
+ftl - draws Forge, Silver, Copper, Silver, Silver
+ 
+---------- Serf Bot: turn 9 ----------
+Serf Bot - plays Goons
+ 
+------------ Game Over ------------
+Serf Bot - cards: 3 Bandit Camp, 1 Peddler, 7 Copper, 3 Silver, 2 Spoils, 3 Estate
+Serf Bot - victory point chips: 1
+Serf Bot - total victory points: 4
+Serf Bot - turns: 8
+ 
+ftl - resigned
+ftl - cards: 1 Forge, 1 Band of Misfits, 7 Copper, 6 Silver, 3 Estate
+ftl - victory point chips: 0
+ftl - total victory points: 3
+ftl - turns: 8
+ 
+1st place: Serf Bot
+2nd place: ftl
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.50612a9b51c36e573294bfd0.1369385726617.txt b/testing/testdata/log.50612a9b51c36e573294bfd0.1369385726617.txt
new file mode 100644
index 0000000..8282f66
--- /dev/null
+++ b/testing/testdata/log.50612a9b51c36e573294bfd0.1369385726617.txt
@@ -0,0 +1,852 @@
+------------ Game Setup ------------
+Supply cards: Forager, Storeroom, Village, Horse Traders, Noble Brigand, Silk Road, Cache, Cultist, Inn, Outpost, Copper, Silver, Gold, Estate, Duchy, Province, Curse, Ruins
+Rating system: unrated
+ftl - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Serf Bot - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+ftl - shuffles deck
+Serf Bot - shuffles deck
+ftl - draws Copper, Estate, Estate, Copper, Copper
+Serf Bot - draws Estate, Copper, Copper, Copper, Copper
+ 
+---------- ftl: turn 1 ----------
+ftl - plays 3 Copper
+ftl - buys Forager
+ftl - gains Forager
+ftl - draws Copper, Estate, Copper, Copper, Copper
+ 
+---------- Serf Bot: turn 1 ----------
+Serf Bot - plays 4 Copper
+Serf Bot - buys Noble Brigand
+ftl - shuffles deck
+ftl - reveals: Estate, Copper
+ftl - discards: Estate, Copper
+Serf Bot - gains Noble Brigand
+Serf Bot - draws Copper, Estate, Copper, Estate, Copper
+ 
+---------- ftl: turn 2 ----------
+ftl - plays 4 Copper
+ftl - buys Silver
+ftl - gains Silver
+ftl - draws Copper, Forager, Estate, Copper
+ftl - shuffles deck
+ftl - draws Estate
+ 
+---------- Serf Bot: turn 2 ----------
+Serf Bot - plays 3 Copper
+Serf Bot - buys Storeroom
+Serf Bot - gains Storeroom
+Serf Bot - shuffles deck
+Serf Bot - draws Copper, Noble Brigand, Copper, Copper, Estate
+ 
+---------- ftl: turn 3 ----------
+ftl - plays Forager
+ftl - trashes Copper
+ftl - draws Estate, Copper, Copper, Silver, Copper
+ 
+---------- Serf Bot: turn 3 ----------
+Serf Bot - plays Noble Brigand
+ftl - reveals: Copper, Copper
+ftl - discards: Copper, Copper
+Serf Bot - plays 3 Copper
+Serf Bot - buys Noble Brigand
+ftl - shuffles deck
+ftl - reveals: Estate, Copper
+ftl - discards: Estate, Copper
+Serf Bot - gains Noble Brigand
+Serf Bot - draws Estate, Copper, Copper, Estate, Copper
+ 
+---------- ftl: turn 4 ----------
+ftl - plays 3 Copper, 1 Silver
+ftl - buys Outpost
+ftl - gains Outpost
+ftl - draws Copper, Estate, Copper, Forager
+ftl - shuffles deck
+ftl - draws Copper
+ 
+---------- Serf Bot: turn 4 ----------
+Serf Bot - plays 3 Copper
+Serf Bot - buys Forager
+Serf Bot - gains Forager
+Serf Bot - draws Copper, Storeroom
+Serf Bot - shuffles deck
+Serf Bot - draws Copper, Copper, Estate
+ 
+---------- ftl: turn 5 ----------
+ftl - plays Forager
+ftl - trashes Estate
+ftl - plays 3 Copper
+ftl - buys Village
+ftl - gains Village
+ftl - draws Copper, Estate, Outpost, Copper, Copper
+ 
+---------- Serf Bot: turn 5 ----------
+Serf Bot - plays Storeroom
+Serf Bot - discards Estate
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+Serf Bot - draws Noble Brigand, Copper, Copper, Copper
+Serf Bot - discards Noble Brigand
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+Serf Bot - buys Horse Traders
+Serf Bot - gains Horse Traders
+Serf Bot - draws Noble Brigand, Forager, Estate, Estate, Copper
+ 
+---------- ftl: turn 6 ----------
+ftl - plays Outpost
+ftl - plays 3 Copper
+ftl - buys Forager
+ftl - gains Forager
+ftl - duration Outpost
+ftl - draws Estate, Silver
+ftl - shuffles deck
+ftl - draws Estate
+ 
+---------- ftl: turn 6 ----------
+ftl - draws Copper, Village, Copper, Forager, Copper
+ 
+---------- Serf Bot: turn 6 ----------
+Serf Bot - plays Forager
+Serf Bot - trashes Copper
+Serf Bot - plays Noble Brigand
+ftl - reveals: Copper, Forager
+ftl - discards: Copper, Forager
+Serf Bot - buys Estate
+Serf Bot - gains Estate
+Serf Bot - buys Ruined Library
+Serf Bot - gains Ruined Library
+Serf Bot - shuffles deck
+Serf Bot - draws Estate, Storeroom, Copper, Estate, Estate
+ 
+---------- ftl: turn 7 ----------
+ftl - plays Village
+ftl - draws Copper
+ftl - plays Forager
+ftl - trashes Copper
+ftl - plays 3 Copper
+ftl - buys Forager
+ftl - gains Forager
+ftl - draws Copper
+ftl - shuffles deck
+ftl - draws Estate, Copper, Outpost, Copper
+ 
+---------- Serf Bot: turn 7 ----------
+Serf Bot - plays Storeroom
+Serf Bot - discards Estate
+Serf Bot - discards Estate
+Serf Bot - discards Estate
+Serf Bot - discards Copper
+Serf Bot - draws Copper, Horse Traders, Copper, Copper
+Serf Bot - discards Horse Traders
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+Serf Bot - buys Noble Brigand
+ftl - reveals: Forager, Village
+ftl - discards: Forager, Village
+ftl - gains Copper
+Serf Bot - gains Noble Brigand
+Serf Bot - buys Copper
+Serf Bot - gains Copper
+Serf Bot - draws Estate, Ruined Library, Copper, Copper, Forager
+ 
+---------- ftl: turn 8 ----------
+ftl - plays Outpost
+ftl - plays 3 Copper
+ftl - buys Forager
+ftl - gains Forager
+ftl - duration Outpost
+ftl - draws Estate, Silver, Copper
+ 
+---------- ftl: turn 8 ----------
+ftl - plays 1 Silver, 1 Copper
+ftl - buys Forager
+ftl - gains Forager
+ftl - draws Forager, Copper, Forager
+ftl - shuffles deck
+ftl - draws Silver, Copper
+ 
+---------- Serf Bot: turn 8 ----------
+Serf Bot - plays Forager
+Serf Bot - trashes Copper
+Serf Bot - plays Ruined Library
+Serf Bot - draws Noble Brigand
+Serf Bot - plays 1 Copper
+Serf Bot - buys Estate
+Serf Bot - gains Estate
+Serf Bot - buys Survivors
+Serf Bot - gains Survivors
+Serf Bot - draws Noble Brigand
+Serf Bot - shuffles deck
+Serf Bot - draws Ruined Library, Horse Traders, Copper, Noble Brigand
+ 
+---------- ftl: turn 9 ----------
+ftl - plays Forager
+ftl - trashes Copper
+ftl - plays Forager
+ftl - trashes Copper
+ftl - plays 1 Silver
+ftl - buys Forager
+ftl - gains Forager
+ftl - draws Copper, Copper, Estate, Copper, Forager
+ 
+---------- Serf Bot: turn 9 ----------
+Serf Bot - plays Noble Brigand
+ftl - reveals: Estate, Village
+ftl - discards: Estate, Village
+ftl - gains Copper
+Serf Bot - plays 1 Copper
+Serf Bot - buys Estate
+Serf Bot - gains Estate
+Serf Bot - draws Estate, Estate, Survivors, Estate, Copper
+ 
+---------- ftl: turn 10 ----------
+ftl - plays Forager
+ftl - trashes Estate
+ftl - plays 3 Copper
+ftl - buys Forager
+ftl - gains Forager
+ftl - draws Outpost, Forager, Forager, Copper
+ftl - shuffles deck
+ftl - draws Forager
+ 
+---------- Serf Bot: turn 10 ----------
+Serf Bot - plays Survivors
+Serf Bot - looks at Estate, Copper
+Serf Bot - discards: Estate, Copper
+Serf Bot - plays 1 Copper
+Serf Bot - draws Storeroom, Forager, Copper, Noble Brigand, Copper
+ 
+---------- ftl: turn 11 ----------
+ftl - plays Forager
+ftl - trashes Copper
+ftl - plays Forager
+ftl - trashes Outpost
+ftl - plays Forager
+ftl - draws Forager, Copper, Village, Copper, Forager
+ 
+---------- Serf Bot: turn 11 ----------
+Serf Bot - plays Forager
+Serf Bot - trashes Copper
+Serf Bot - plays Noble Brigand
+ftl - reveals: Copper, Estate
+ftl - discards: Copper, Estate
+Serf Bot - plays 1 Copper
+Serf Bot - buys Silver
+Serf Bot - gains Silver
+Serf Bot - buys Ruined Market
+Serf Bot - gains Ruined Market
+Serf Bot - draws Estate, Copper
+Serf Bot - shuffles deck
+Serf Bot - draws Estate, Estate, Horse Traders
+ 
+---------- ftl: turn 12 ----------
+ftl - plays Village
+ftl - draws Forager
+ftl - plays Forager
+ftl - trashes Copper
+ftl - plays Forager
+ftl - trashes Copper
+ftl - plays Forager
+ftl - draws Forager, Silver, Copper
+ftl - shuffles deck
+ftl - draws Village, Forager
+ 
+---------- Serf Bot: turn 12 ----------
+Serf Bot - plays Horse Traders
+Serf Bot - discards Estate
+Serf Bot - discards Estate
+Serf Bot - plays 1 Copper
+Serf Bot - buys Noble Brigand
+ftl - reveals: Forager, Forager
+ftl - discards: Forager, Forager
+ftl - gains Copper
+Serf Bot - gains Noble Brigand
+Serf Bot - buys Copper
+Serf Bot - gains Copper
+Serf Bot - draws Estate, Ruined Library, Copper, Forager, Copper
+ 
+---------- ftl: turn 13 ----------
+ftl - plays Village
+ftl - draws Copper
+ftl - plays Forager
+ftl - trashes Copper
+ftl - plays Forager
+ftl - trashes Silver
+ftl - plays Copper
+ftl - buys Forager
+ftl - gains Forager
+ftl - draws Estate, Forager, Forager, Forager
+ftl - shuffles deck
+ftl - draws Forager
+ 
+---------- Serf Bot: turn 13 ----------
+Serf Bot - plays Forager
+Serf Bot - trashes Copper
+Serf Bot - plays Ruined Library
+Serf Bot - draws Survivors
+Serf Bot - plays 1 Copper
+Serf Bot - buys Storeroom
+Serf Bot - gains Storeroom
+Serf Bot - draws Noble Brigand, Ruined Market, Storeroom, Estate, Silver
+ 
+---------- ftl: turn 14 ----------
+ftl - plays Forager
+ftl - trashes Estate
+ftl - plays Forager
+ftl - trashes Forager
+ftl - plays Forager
+ftl - buys Forager
+ftl - gains Forager
+ftl - draws Forager, Village, Forager, Copper, Forager
+ 
+---------- Serf Bot: turn 14 ----------
+Serf Bot - plays Noble Brigand
+ftl - reveals: Forager, Copper
+ftl - discards: Forager, Copper
+Serf Bot - plays 1 Silver
+Serf Bot - buys Village
+Serf Bot - gains Village
+Serf Bot - draws Copper, Noble Brigand, Noble Brigand, Copper, Estate
+ 
+---------- ftl: turn 15 ----------
+ftl - plays Village
+ftl - shuffles deck
+ftl - draws Copper
+ftl - plays Forager
+ftl - trashes Copper
+ftl - plays Forager
+ftl - trashes Copper
+ftl - plays Forager
+ftl - draws Forager, Forager, Forager, Forager, Forager
+ 
+---------- Serf Bot: turn 15 ----------
+Serf Bot - plays Noble Brigand
+ftl - shuffles deck
+ftl - reveals: Village, Forager
+ftl - discards: Village, Forager
+ftl - gains Copper
+Serf Bot - plays 2 Copper
+Serf Bot - buys Silver
+Serf Bot - gains Silver
+Serf Bot - shuffles deck
+Serf Bot - draws Village, Storeroom, Noble Brigand, Copper, Forager
+ 
+---------- ftl: turn 16 ----------
+ftl - plays Forager
+ftl - trashes Forager
+ftl - plays Forager
+ftl - trashes Forager
+ftl - plays Forager
+ftl - draws Forager, Forager
+ftl - shuffles deck
+ftl - draws Forager, Copper, Forager
+ 
+---------- Serf Bot: turn 16 ----------
+Serf Bot - plays Village
+Serf Bot - draws Storeroom
+Serf Bot - plays Forager
+Serf Bot - trashes Copper
+Serf Bot - plays Noble Brigand
+ftl - reveals: Village, Forager
+ftl - discards: Village, Forager
+ftl - gains Copper
+Serf Bot - plays Storeroom
+Serf Bot - discards Storeroom
+Serf Bot - draws Estate
+Serf Bot - discards Estate
+Serf Bot - buys Horse Traders
+Serf Bot - gains Horse Traders
+Serf Bot - draws Silver, Silver, Noble Brigand, Ruined Library, Copper
+ 
+---------- ftl: turn 17 ----------
+ftl - plays Forager
+ftl - trashes Copper
+ftl - plays Forager
+ftl - trashes Forager
+ftl - plays Forager
+ftl - draws Forager
+ftl - shuffles deck
+ftl - draws Copper, Forager, Forager, Forager
+ 
+---------- Serf Bot: turn 17 ----------
+Serf Bot - plays Noble Brigand
+ftl - reveals: Forager, Village
+ftl - discards: Forager, Village
+ftl - gains Copper
+Serf Bot - plays 2 Silver, 1 Copper
+Serf Bot - buys Gold
+Serf Bot - gains Gold
+Serf Bot - draws Ruined Market, Estate, Noble Brigand, Estate, Horse Traders
+ 
+---------- ftl: turn 18 ----------
+ftl - plays Forager
+ftl - trashes Copper
+ftl - plays Forager
+ftl - trashes Forager
+ftl - plays Forager
+ftl - shuffles deck
+ftl - draws Village, Forager, Forager, Copper, Forager
+ 
+---------- Serf Bot: turn 18 ----------
+Serf Bot - plays Noble Brigand
+ftl - reveals: Forager
+ftl - discards Forager
+ftl - gains Copper
+Serf Bot - buys Ruined Village
+Serf Bot - gains Ruined Village
+Serf Bot - draws Estate, Estate, Copper, Survivors, Copper
+ 
+---------- ftl: turn 19 ----------
+ftl - plays Village
+ftl - shuffles deck
+ftl - draws Copper
+ftl - plays Forager
+ftl - trashes Copper
+ftl - plays Forager
+ftl - trashes Copper
+ftl - plays Forager
+ftl - draws Forager
+ftl - shuffles deck
+ftl - draws Forager, Forager, Forager, Village
+ 
+---------- Serf Bot: turn 19 ----------
+Serf Bot - plays Survivors
+Serf Bot - looks at Estate, Noble Brigand
+Serf Bot - places Estate on top of deck
+Serf Bot - places Noble Brigand on top of deck
+Serf Bot - plays 2 Copper
+Serf Bot - buys Estate
+Serf Bot - gains Estate
+Serf Bot - draws Noble Brigand, Estate, Copper
+Serf Bot - shuffles deck
+Serf Bot - draws Noble Brigand, Noble Brigand
+ 
+---------- ftl: turn 20 ----------
+ftl - plays Forager
+ftl - trashes Village
+ftl - plays Forager
+ftl - trashes Forager
+ftl - plays Forager
+ftl - shuffles deck
+ftl - draws Forager, Forager, Forager
+ 
+---------- Serf Bot: turn 20 ----------
+Serf Bot - plays Noble Brigand
+ftl - gains Copper
+Serf Bot - plays 1 Copper
+Serf Bot - buys Estate
+Serf Bot - gains Estate
+Serf Bot - draws Copper, Copper, Noble Brigand, Storeroom, Gold
+ 
+---------- ftl: turn 21 ----------
+ftl - plays Forager
+ftl - trashes Forager
+ftl - plays Forager
+ftl - shuffles deck
+ftl - draws Forager, Copper, Forager
+ 
+---------- Serf Bot: turn 21 ----------
+Serf Bot - plays Noble Brigand
+ftl - gains Copper
+Serf Bot - plays 2 Copper, 1 Gold
+Serf Bot - buys Gold
+Serf Bot - gains Gold
+Serf Bot - draws Survivors, Copper, Estate, Horse Traders, Village
+ 
+---------- ftl: turn 22 ----------
+ftl - plays Forager
+ftl - trashes Copper
+ftl - plays Forager
+ftl - shuffles deck
+ftl - draws Forager, Forager, Copper
+ 
+---------- Serf Bot: turn 22 ----------
+Serf Bot - plays Village
+Serf Bot - draws Storeroom
+Serf Bot - plays Horse Traders
+Serf Bot - discards Estate
+Serf Bot - discards Survivors
+Serf Bot - plays Storeroom
+Serf Bot - discards Copper
+Serf Bot - draws Ruined Market
+Serf Bot - discards Ruined Market
+Serf Bot - buys Noble Brigand
+ftl - gains Copper
+Serf Bot - gains Noble Brigand
+Serf Bot - draws Estate, Estate, Ruined Library, Estate, Silver
+ 
+---------- ftl: turn 23 ----------
+ftl - plays Forager
+ftl - trashes Copper
+ftl - plays Forager
+ftl - shuffles deck
+ftl - draws Copper, Forager, Forager
+ 
+---------- Serf Bot: turn 23 ----------
+Serf Bot - plays Ruined Library
+Serf Bot - draws Forager
+Serf Bot - plays 1 Silver
+Serf Bot - buys Estate
+Serf Bot - gains Estate
+Serf Bot - draws Silver, Ruined Village, Estate, Horse Traders, Estate
+ 
+---------- ftl: turn 24 ----------
+ftl - plays Forager
+ftl - trashes Copper
+ftl - plays Forager
+ftl - shuffles deck
+ftl - draws Forager, Forager
+ 
+---------- Serf Bot: turn 24 ----------
+Serf Bot - plays Horse Traders
+Serf Bot - discards Estate
+Serf Bot - discards Estate
+Serf Bot - plays 1 Silver
+Serf Bot - buys Outpost
+Serf Bot - gains Outpost
+Serf Bot - shuffles deck
+Serf Bot - draws Copper, Estate, Ruined Library, Noble Brigand, Copper
+ 
+---------- ftl: turn 25 ----------
+ftl - plays Forager
+ftl - trashes Forager
+ftl - shuffles deck
+ftl - draws Forager
+ 
+---------- Serf Bot: turn 25 ----------
+Serf Bot - plays Noble Brigand
+ftl - gains Copper
+Serf Bot - plays 2 Copper
+Serf Bot - buys Storeroom
+Serf Bot - gains Storeroom
+Serf Bot - draws Ruined Market, Estate, Survivors, Estate, Storeroom
+ 
+---------- ftl: turn 26 ----------
+ftl - plays Forager
+ftl - shuffles deck
+ftl - draws Copper, Forager
+ 
+---------- Serf Bot: turn 26 ----------
+Serf Bot - plays Storeroom
+Serf Bot - discards Survivors
+Serf Bot - discards Ruined Market
+Serf Bot - discards Estate
+Serf Bot - discards Estate
+Serf Bot - draws Outpost, Noble Brigand, Village, Estate
+Serf Bot - discards Outpost
+Serf Bot - discards Village
+Serf Bot - discards Noble Brigand
+Serf Bot - discards Estate
+Serf Bot - buys Horse Traders
+Serf Bot - gains Horse Traders
+Serf Bot - buys Ruined Market
+Serf Bot - gains Ruined Market
+Serf Bot - draws Estate, Silver, Noble Brigand, Estate, Silver
+ 
+---------- ftl: turn 27 ----------
+ftl - plays Forager
+ftl - trashes Copper
+ftl - shuffles deck
+ftl - draws Forager
+ 
+---------- Serf Bot: turn 27 ----------
+Serf Bot - plays Noble Brigand
+ftl - gains Copper
+Serf Bot - plays 2 Silver
+Serf Bot - buys Cache
+Serf Bot - gains Cache
+Serf Bot - gains Copper
+Serf Bot - gains Copper
+Serf Bot - draws Copper, Estate, Ruined Village, Gold, Gold
+ 
+---------- ftl: turn 28 ----------
+ftl - plays Forager
+ftl - shuffles deck
+ftl - draws Forager, Copper
+ 
+---------- Serf Bot: turn 28 ----------
+Serf Bot - plays 2 Gold, 1 Copper
+Serf Bot - buys Gold
+Serf Bot - gains Gold
+Serf Bot - draws Forager, Copper, Noble Brigand, Estate, Storeroom
+ 
+---------- ftl: turn 29 ----------
+ftl - plays Forager
+ftl - trashes Copper
+ftl - shuffles deck
+ftl - draws Forager
+ 
+---------- Serf Bot: turn 29 ----------
+Serf Bot - plays Forager
+Serf Bot - trashes Copper
+Serf Bot - plays Noble Brigand
+ftl - gains Copper
+Serf Bot - buys Silver
+Serf Bot - gains Silver
+Serf Bot - buys Copper
+Serf Bot - gains Copper
+Serf Bot - draws Horse Traders, Estate, Horse Traders, Noble Brigand
+Serf Bot - shuffles deck
+Serf Bot - draws Estate
+ 
+---------- ftl: turn 30 ----------
+ftl - plays Forager
+ftl - shuffles deck
+ftl - draws Forager, Copper
+ 
+---------- Serf Bot: turn 30 ----------
+Serf Bot - plays Noble Brigand
+ftl - gains Copper
+Serf Bot - buys Ruined Market
+Serf Bot - gains Ruined Market
+Serf Bot - draws Estate, Silver, Copper, Estate, Cache
+ 
+---------- ftl: turn 31 ----------
+ftl - plays Forager
+ftl - trashes Copper
+ftl - shuffles deck
+ftl - draws Copper, Forager
+ 
+---------- Serf Bot: turn 31 ----------
+Serf Bot - plays Cache
+Serf Bot - plays 1 Silver, 1 Copper
+Serf Bot - buys Gold
+Serf Bot - gains Gold
+Serf Bot - draws Ruined Market, Horse Traders, Noble Brigand, Noble Brigand, Copper
+ 
+---------- ftl: turn 32 ----------
+ftl - plays Forager
+ftl - trashes Copper
+ftl - shuffles deck
+ftl - draws Forager
+ 
+---------- Serf Bot: turn 32 ----------
+Serf Bot - plays Noble Brigand
+ftl - gains Copper
+Serf Bot - plays 1 Copper
+Serf Bot - buys Estate
+Serf Bot - gains Estate
+Serf Bot - draws Storeroom, Storeroom, Copper, Ruined Market, Storeroom
+ 
+---------- ftl: turn 33 ----------
+ftl - plays Forager
+ftl - shuffles deck
+ftl - draws Forager, Copper
+ 
+---------- Serf Bot: turn 33 ----------
+Serf Bot - plays Storeroom
+Serf Bot - discards Storeroom
+Serf Bot - discards Storeroom
+Serf Bot - discards Ruined Market
+Serf Bot - discards Copper
+Serf Bot - draws Copper, Noble Brigand, Gold, Silver
+Serf Bot - discards Noble Brigand
+Serf Bot - discards Copper
+Serf Bot - plays 1 Gold, 1 Silver
+Serf Bot - buys Noble Brigand
+ftl - gains Copper
+Serf Bot - gains Noble Brigand
+Serf Bot - buys Village
+Serf Bot - gains Village
+Serf Bot - draws Outpost, Survivors, Copper, Estate, Estate
+ 
+---------- ftl: turn 34 ----------
+ftl - plays Forager
+ftl - trashes Copper
+ftl - shuffles deck
+ftl - draws Copper, Forager
+ 
+---------- Serf Bot: turn 34 ----------
+Serf Bot - plays Outpost
+Serf Bot - plays 1 Copper
+Serf Bot - buys Ruined Village
+Serf Bot - gains Ruined Village
+Serf Bot - duration Outpost
+Serf Bot - draws Estate, Estate, Village
+ 
+---------- Serf Bot: turn 34 ----------
+Serf Bot - plays Village
+Serf Bot - draws Ruined Library
+Serf Bot - plays Ruined Library
+Serf Bot - draws Gold
+Serf Bot - plays 1 Gold
+Serf Bot - buys Storeroom
+Serf Bot - gains Storeroom
+Serf Bot - draws Copper, Silver, Ruined Village, Noble Brigand, Forager
+ 
+---------- ftl: turn 35 ----------
+ftl - plays Forager
+ftl - trashes Copper
+ftl - shuffles deck
+ftl - draws Forager
+ 
+---------- Serf Bot: turn 35 ----------
+Serf Bot - plays Forager
+Serf Bot - trashes Copper
+Serf Bot - plays Noble Brigand
+ftl - gains Copper
+Serf Bot - plays 1 Silver
+Serf Bot - buys Inn
+Serf Bot - gains Inn
+Serf Bot - places Ruined Market, Noble Brigand, Horse Traders, Horse Traders, Noble Brigand, Ruined Market, Horse Traders, Noble Brigand, Storeroom, Storeroom, Ruined Market, Noble Brigand, Noble Brigand, Village, Storeroom, Ruined Village, Survivors, Storeroom, Outpost, Village, Ruined Library, Inn on top of deck
+Serf Bot - shuffles deck
+Serf Bot - buys Copper
+Serf Bot - gains Copper
+Serf Bot - draws Estate, Noble Brigand, Storeroom, Storeroom, Noble Brigand
+ 
+---------- ftl: turn 36 ----------
+ftl - plays Forager
+ftl - shuffles deck
+ftl - draws Forager, Copper
+ 
+---------- Serf Bot: turn 36 ----------
+Serf Bot - plays Noble Brigand
+ftl - gains Copper
+Serf Bot - buys Ruined Market
+Serf Bot - gains Ruined Market
+Serf Bot - draws Outpost, Survivors, Gold, Horse Traders, Horse Traders
+ 
+---------- ftl: turn 37 ----------
+ftl - plays Forager
+ftl - trashes Copper
+ftl - shuffles deck
+ftl - draws Forager, Copper
+ 
+---------- Serf Bot: turn 37 ----------
+Serf Bot - plays Outpost
+Serf Bot - plays 1 Gold
+Serf Bot - buys Storeroom
+Serf Bot - gains Storeroom
+Serf Bot - duration Outpost
+Serf Bot - draws Ruined Market, Horse Traders, Ruined Library
+ 
+---------- Serf Bot: turn 37 ----------
+Serf Bot - plays Horse Traders
+Serf Bot - discards Ruined Market
+Serf Bot - discards Ruined Library
+Serf Bot - buys Storeroom
+Serf Bot - gains Storeroom
+Serf Bot - buys Survivors
+Serf Bot - gains Survivors
+Serf Bot - draws Ruined Village, Village, Noble Brigand, Ruined Market, Inn
+ 
+---------- ftl: turn 38 ----------
+ftl - plays Forager
+ftl - trashes Copper
+ftl - shuffles deck
+ftl - draws Forager
+ 
+---------- Serf Bot: turn 38 ----------
+Serf Bot - plays Inn
+Serf Bot - draws Noble Brigand, Village
+Serf Bot - discards Ruined Village
+Serf Bot - discards Ruined Market
+Serf Bot - plays Village
+Serf Bot - draws Ruined Market
+Serf Bot - plays Village
+Serf Bot - draws Noble Brigand
+Serf Bot - plays Noble Brigand
+ftl - gains Copper
+Serf Bot - plays Noble Brigand
+ftl - shuffles deck
+ftl - reveals: Copper
+ftl - discards Copper
+Serf Bot - plays Noble Brigand
+ftl - shuffles deck
+ftl - reveals: Copper
+ftl - discards Copper
+Serf Bot - plays Ruined Market
+Serf Bot - buys Silver
+Serf Bot - gains Silver
+Serf Bot - draws Storeroom, Storeroom
+Serf Bot - shuffles deck
+Serf Bot - draws Copper, Noble Brigand, Noble Brigand
+ 
+---------- ftl: turn 39 ----------
+ftl - plays Forager
+ftl - shuffles deck
+ftl - draws Copper, Forager
+ 
+---------- Serf Bot: turn 39 ----------
+Serf Bot - plays Noble Brigand
+ftl - gains Copper
+Serf Bot - plays 1 Copper
+Serf Bot - buys Estate
+Serf Bot - gains Estate
+Serf Bot - draws Estate, Copper, Estate, Storeroom, Horse Traders
+ 
+---------- ftl: turn 40 ----------
+ftl - plays Forager
+ftl - trashes Copper
+ftl - shuffles deck
+ftl - draws Forager, Copper
+ 
+---------- Serf Bot: turn 40 ----------
+Serf Bot - plays Storeroom
+Serf Bot - discards Horse Traders
+Serf Bot - discards Estate
+Serf Bot - discards Estate
+Serf Bot - discards Copper
+Serf Bot - draws Noble Brigand, Storeroom, Village, Gold
+Serf Bot - discards Storeroom
+Serf Bot - discards Noble Brigand
+Serf Bot - discards Village
+Serf Bot - plays 1 Gold
+Serf Bot - buys Silver
+Serf Bot - gains Silver
+Serf Bot - buys Silver
+Serf Bot - gains Silver
+Serf Bot - draws Gold, Estate, Storeroom, Ruined Market, Estate
+ 
+---------- ftl: turn 41 ----------
+ftl - plays Forager
+ftl - trashes Copper
+ftl - shuffles deck
+ftl - draws Forager
+ 
+---------- Serf Bot: turn 41 ----------
+Serf Bot - plays Storeroom
+Serf Bot - discards Ruined Market
+Serf Bot - discards Estate
+Serf Bot - discards Estate
+Serf Bot - draws Copper, Forager, Silver
+Serf Bot - discards Forager
+Serf Bot - discards Copper
+Serf Bot - plays 1 Gold, 1 Silver
+Serf Bot - buys Horse Traders
+Serf Bot - gains Horse Traders
+Serf Bot - buys Silver
+Serf Bot - gains Silver
+Serf Bot - draws Storeroom, Silver, Noble Brigand, Survivors, Survivors
+ 
+---------- ftl: turn 42 ----------
+ftl - plays Forager
+ftl - shuffles deck
+ftl - draws Forager
+ 
+---------- Serf Bot: turn 42 ----------
+Serf Bot - plays Noble Brigand
+ftl - gains Copper
+Serf Bot - plays 1 Silver
+Serf Bot - buys Village
+Serf Bot - gains Village
+Serf Bot - draws Ruined Market, Copper, Ruined Market, Estate, Cache
+ 
+---------- ftl: turn 43 ----------
+ 
+------------ Game Over ------------
+Serf Bot - cards: 6 Noble Brigand, 6 Storeroom, 4 Ruined Market, 4 Horse Traders, 3 Village, 2 Ruined Village, 2 Survivors, 1 Outpost, 1 Ruined Library, 1 Inn, 1 Forager, 7 Silver, 6 Copper, 4 Gold, 11 Estate, 1 Cache
+Serf Bot - total victory points: 11
+Serf Bot - turns: 42
+ 
+ftl - resigned
+ftl - cards: 1 Forager, 1 Copper
+ftl - total victory points: 0
+ftl - turns: 42
+ 
+1st place: Serf Bot
+2nd place: ftl
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.50612a9b51c36e573294bfd0.1369424447034.txt b/testing/testdata/log.50612a9b51c36e573294bfd0.1369424447034.txt
new file mode 100644
index 0000000..23ae179
--- /dev/null
+++ b/testing/testdata/log.50612a9b51c36e573294bfd0.1369424447034.txt
@@ -0,0 +1,711 @@
+------------ Game Setup ------------
+Supply cards: Fool's Gold, Pawn, Steward, Baron, Moneylender, Salvager, Count, Harvest, Minion, Bank, Copper, Silver, Gold, Estate, Duchy, Province, Curse, Colony, Platinum
+Rating system: unrated
+ftl - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Serf Bot - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+ftl - shuffles deck
+Serf Bot - shuffles deck
+ftl - draws Copper, Copper, Estate, Estate, Copper
+Serf Bot - draws Copper, Copper, Copper, Copper, Estate
+ 
+---------- Serf Bot: turn 1 ----------
+Serf Bot - plays 4 Copper
+Serf Bot - buys Baron
+Serf Bot - gains Baron
+Serf Bot - draws Copper, Estate, Estate, Copper, Copper
+ 
+---------- ftl: turn 1 ----------
+ftl - plays 3 Copper
+ftl - buys Fool's Gold
+ftl - gains Fool's Gold
+ftl - draws Copper, Copper, Copper, Copper, Estate
+ 
+---------- Serf Bot: turn 2 ----------
+Serf Bot - plays 3 Copper
+Serf Bot - buys Silver
+Serf Bot - gains Silver
+Serf Bot - shuffles deck
+Serf Bot - draws Estate, Copper, Copper, Estate, Copper
+ 
+---------- ftl: turn 2 ----------
+ftl - plays 4 Copper
+ftl - buys Salvager
+ftl - gains Salvager
+ftl - shuffles deck
+ftl - draws Copper, Copper, Fool's Gold, Copper, Estate
+ 
+---------- Serf Bot: turn 3 ----------
+Serf Bot - plays 3 Copper
+Serf Bot - buys Steward
+Serf Bot - gains Steward
+Serf Bot - draws Copper, Baron, Copper, Copper, Copper
+ 
+---------- ftl: turn 3 ----------
+ftl - plays 3 Copper, 1 Fool's Gold
+ftl - buys Moneylender
+ftl - gains Moneylender
+ftl - draws Copper, Estate, Estate, Copper, Copper
+ 
+---------- Serf Bot: turn 4 ----------
+Serf Bot - plays 4 Copper
+Serf Bot - buys Moneylender
+Serf Bot - gains Moneylender
+Serf Bot - draws Estate, Silver
+Serf Bot - shuffles deck
+Serf Bot - draws Copper, Moneylender, Steward
+ 
+---------- ftl: turn 4 ----------
+ftl - plays 3 Copper
+ftl - buys Pawn
+ftl - gains Pawn
+ftl - draws Copper, Salvager
+ftl - shuffles deck
+ftl - draws Copper, Pawn, Estate
+ 
+---------- Serf Bot: turn 5 ----------
+Serf Bot - plays Moneylender
+Serf Bot - trashes Copper
+Serf Bot - plays 1 Silver
+Serf Bot - buys Minion
+Serf Bot - gains Minion
+Serf Bot - draws Copper, Copper, Copper, Copper, Estate
+ 
+---------- ftl: turn 5 ----------
+ftl - plays Pawn
+ftl - takes 1 coin
+ftl - takes 1 action
+ftl - plays Salvager
+ftl - trashes Estate
+ftl - plays 2 Copper
+ftl - buys Minion
+ftl - gains Minion
+ftl - draws Estate, Fool's Gold, Copper, Copper, Copper
+ 
+---------- Serf Bot: turn 6 ----------
+Serf Bot - plays 4 Copper
+Serf Bot - buys Salvager
+Serf Bot - gains Salvager
+Serf Bot - draws Estate, Baron, Copper, Copper
+Serf Bot - shuffles deck
+Serf Bot - draws Minion
+ 
+---------- ftl: turn 6 ----------
+ftl - plays 3 Copper, 1 Fool's Gold
+ftl - buys Baron
+ftl - gains Baron
+ftl - draws Copper, Copper, Estate, Moneylender
+ftl - shuffles deck
+ftl - draws Estate
+ 
+---------- Serf Bot: turn 7 ----------
+Serf Bot - plays Minion
+Serf Bot - takes 2 coins
+Serf Bot - plays Baron
+Serf Bot - discards Estate
+Serf Bot - plays 2 Copper
+Serf Bot - buys Salvager
+Serf Bot - gains Salvager
+Serf Bot - buys Moneylender
+Serf Bot - gains Moneylender
+Serf Bot - draws Copper, Silver, Copper, Steward, Moneylender
+ 
+---------- ftl: turn 7 ----------
+ftl - plays Moneylender
+ftl - trashes Copper
+ftl - plays 1 Copper
+ftl - buys Steward
+ftl - gains Steward
+ftl - draws Fool's Gold, Copper, Copper, Pawn, Copper
+ 
+---------- Serf Bot: turn 8 ----------
+Serf Bot - plays Moneylender
+Serf Bot - trashes Copper
+Serf Bot - plays 1 Copper, 1 Silver
+Serf Bot - buys Gold
+Serf Bot - gains Gold
+Serf Bot - draws Salvager, Estate, Copper, Copper, Estate
+ 
+---------- ftl: turn 8 ----------
+ftl - plays Pawn
+ftl - takes 1 action
+ftl - draws Salvager
+ftl - plays Salvager
+ftl - trashes Copper
+ftl - plays 2 Copper, 1 Fool's Gold
+ftl - buys Fool's Gold
+ftl - gains Fool's Gold
+ftl - draws Minion, Baron, Copper, Copper
+ftl - shuffles deck
+ftl - draws Copper
+ 
+---------- Serf Bot: turn 9 ----------
+Serf Bot - plays Salvager
+Serf Bot - trashes Estate
+Serf Bot - plays 2 Copper
+Serf Bot - buys Moneylender
+Serf Bot - gains Moneylender
+Serf Bot - buys Copper
+Serf Bot - gains Copper
+Serf Bot - shuffles deck
+Serf Bot - draws Copper, Moneylender, Copper, Copper, Silver
+ 
+---------- ftl: turn 9 ----------
+ftl - plays Minion
+ftl - takes 2 coins
+ftl - plays Baron
+ftl - gains Estate
+ftl - plays 3 Copper
+ftl - buys Harvest
+ftl - gains Harvest
+ftl - draws Copper, Estate, Estate, Copper, Fool's Gold
+ 
+---------- Serf Bot: turn 10 ----------
+Serf Bot - plays Moneylender
+Serf Bot - trashes Copper
+Serf Bot - plays 2 Copper, 1 Silver
+Serf Bot - buys Bank
+Serf Bot - gains Bank
+Serf Bot - draws Moneylender, Steward, Salvager, Gold, Salvager
+ 
+---------- ftl: turn 10 ----------
+ftl - plays 2 Copper, 1 Fool's Gold
+ftl - buys Fool's Gold
+ftl - gains Fool's Gold
+ftl - draws Fool's Gold, Salvager, Pawn, Steward, Moneylender
+ 
+---------- Serf Bot: turn 11 ----------
+Serf Bot - plays Salvager
+Serf Bot - trashes Moneylender
+Serf Bot - plays 1 Gold
+Serf Bot - buys Harvest
+Serf Bot - gains Harvest
+Serf Bot - buys Pawn
+Serf Bot - gains Pawn
+Serf Bot - draws Estate, Moneylender, Copper, Estate, Baron
+ 
+---------- ftl: turn 11 ----------
+ftl - plays Pawn
+ftl - takes 1 action
+ftl - shuffles deck
+ftl - draws Estate
+ftl - plays Moneylender
+ftl - draws Estate, Estate, Minion, Harvest, Copper
+ 
+---------- Serf Bot: turn 12 ----------
+Serf Bot - plays Moneylender
+Serf Bot - trashes Copper
+Serf Bot - buys Steward
+Serf Bot - gains Steward
+Serf Bot - draws Copper, Minion, Copper
+Serf Bot - shuffles deck
+Serf Bot - draws Harvest, Copper
+ 
+---------- ftl: turn 12 ----------
+ftl - plays Minion
+ftl - takes 2 coins
+ftl - plays Harvest
+ftl - reveals: Copper, Fool's Gold, Fool's Gold, Copper
+ftl - discards: Copper, Fool's Gold, Fool's Gold, Copper
+ftl - plays 1 Copper
+ftl - buys Count
+ftl - gains Count
+ftl - draws Baron, Copper, Copper
+ftl - shuffles deck
+ftl - draws Moneylender, Copper
+ 
+---------- Serf Bot: turn 13 ----------
+Serf Bot - plays Minion
+Serf Bot - takes 2 coins
+Serf Bot - plays Harvest
+Serf Bot - reveals: Moneylender, Estate, Silver, Pawn
+Serf Bot - discards: Moneylender, Estate, Silver, Pawn
+Serf Bot - plays 3 Copper
+Serf Bot - buys Platinum
+Serf Bot - gains Platinum
+Serf Bot - draws Baron, Steward, Salvager, Gold, Bank
+ 
+---------- ftl: turn 13 ----------
+ftl - plays Moneylender
+ftl - trashes Copper
+ftl - plays 2 Copper
+ftl - buys Minion
+ftl - gains Minion
+ftl - draws Fool's Gold, Count, Fool's Gold, Steward, Copper
+ 
+---------- Serf Bot: turn 14 ----------
+Serf Bot - plays Salvager
+Serf Bot - trashes Steward
+Serf Bot - plays 1 Gold
+Serf Bot - plays Bank
+Serf Bot - buys Minion
+Serf Bot - gains Minion
+Serf Bot - buys Silver
+Serf Bot - gains Silver
+Serf Bot - draws Steward, Salvager, Copper, Moneylender, Estate
+ 
+---------- ftl: turn 14 ----------
+ftl - plays Count
+ftl - places Steward on top of deck
+ftl - takes 3 coins
+ftl - plays 2 Fool's Gold, 1 Copper
+ftl - buys Bank
+ftl - gains Bank
+ftl - draws Steward, Estate, Salvager, Fool's Gold, Estate
+ 
+---------- Serf Bot: turn 15 ----------
+Serf Bot - plays Salvager
+Serf Bot - trashes Moneylender
+Serf Bot - plays 1 Copper
+Serf Bot - buys Silver
+Serf Bot - gains Silver
+Serf Bot - buys Pawn
+Serf Bot - gains Pawn
+Serf Bot - shuffles deck
+Serf Bot - draws Moneylender, Silver, Harvest, Platinum, Copper
+ 
+---------- ftl: turn 15 ----------
+ftl - plays Steward
+ftl - takes 2 coins
+ftl - plays 1 Fool's Gold
+ftl - buys Fool's Gold
+ftl - gains Fool's Gold
+ftl - draws Pawn, Minion, Harvest, Copper, Estate
+ 
+---------- Serf Bot: turn 16 ----------
+Serf Bot - plays Harvest
+Serf Bot - reveals: Salvager, Pawn, Salvager, Steward
+Serf Bot - discards: Salvager, Pawn, Salvager, Steward
+Serf Bot - plays 1 Silver, 1 Platinum, 1 Copper
+Serf Bot - buys Colony
+Serf Bot - gains Colony
+Serf Bot - draws Minion, Silver, Pawn, Baron, Silver
+ 
+---------- ftl: turn 16 ----------
+ftl - plays Pawn
+ftl - takes 1 coin
+ftl - takes 1 action
+ftl - plays Minion
+ftl - discards: Harvest, Copper, Estate
+ftl - shuffles deck
+ftl - draws Harvest, Copper, Fool's Gold, Count
+Serf Bot - discards: Minion, Silver, Pawn, Baron, Silver
+Serf Bot - draws Minion, Estate, Copper, Copper
+ftl - plays Count
+ftl - places Harvest on top of deck
+ftl - gains Duchy
+ftl - plays 1 Copper, 1 Fool's Gold
+ftl - buys Fool's Gold
+ftl - gains Fool's Gold
+ftl - draws Harvest, Copper, Moneylender, Minion, Bank
+ 
+---------- Serf Bot: turn 17 ----------
+Serf Bot - plays Minion
+Serf Bot - discards: Estate, Copper, Copper
+Serf Bot - draws Gold, Bank, Copper, Estate
+ftl - discards: Harvest, Copper, Moneylender, Minion, Bank
+ftl - draws Copper, Copper, Estate, Fool's Gold
+Serf Bot - plays 1 Gold, 1 Copper
+Serf Bot - plays Bank
+Serf Bot - buys Bank
+Serf Bot - gains Bank
+Serf Bot - shuffles deck
+Serf Bot - draws Baron, Copper, Estate, Silver, Silver
+ 
+---------- ftl: turn 17 ----------
+ftl - plays 2 Copper, 1 Fool's Gold
+ftl - buys Fool's Gold
+ftl - gains Fool's Gold
+ftl - draws Estate, Fool's Gold, Steward, Fool's Gold, Estate
+ 
+---------- Serf Bot: turn 18 ----------
+Serf Bot - plays Baron
+Serf Bot - discards Estate
+Serf Bot - plays 2 Silver, 1 Copper
+Serf Bot - buys Minion
+Serf Bot - gains Minion
+Serf Bot - buys Moneylender
+Serf Bot - gains Moneylender
+Serf Bot - draws Gold, Pawn, Platinum, Copper, Steward
+ 
+---------- ftl: turn 18 ----------
+ftl - plays Steward
+ftl - trashes Estate, Estate
+ftl - plays 2 Fool's Gold
+ftl - buys Fool's Gold
+ftl - gains Fool's Gold
+ftl - draws Baron, Salvager
+ftl - shuffles deck
+ftl - draws Harvest, Bank, Copper
+ 
+---------- Serf Bot: turn 19 ----------
+Serf Bot - plays Pawn
+Serf Bot - takes 1 action
+Serf Bot - draws Copper
+Serf Bot - plays Steward
+Serf Bot - trashes Copper, Copper
+Serf Bot - plays 1 Gold, 1 Platinum
+Serf Bot - buys Province
+Serf Bot - gains Province
+Serf Bot - draws Bank, Moneylender, Salvager, Silver, Colony
+ 
+---------- ftl: turn 19 ----------
+ftl - plays Baron
+ftl - gains Estate
+ftl - plays 1 Copper
+ftl - plays Bank
+ftl - buys Fool's Gold
+ftl - gains Fool's Gold
+ftl - draws Fool's Gold, Duchy, Pawn, Estate, Fool's Gold
+ 
+---------- Serf Bot: turn 20 ----------
+Serf Bot - plays Salvager
+Serf Bot - trashes Moneylender
+Serf Bot - plays 1 Silver
+Serf Bot - plays Bank
+Serf Bot - buys Baron
+Serf Bot - gains Baron
+Serf Bot - buys Salvager
+Serf Bot - gains Salvager
+Serf Bot - draws Minion, Minion, Harvest, Pawn, Copper
+ 
+---------- ftl: turn 20 ----------
+ftl - plays Pawn
+ftl - takes 1 action
+ftl - draws Fool's Gold
+ftl - plays 3 Fool's Gold
+ftl - buys Platinum
+ftl - gains Platinum
+ftl - draws Fool's Gold, Moneylender, Copper, Fool's Gold, Steward
+ 
+---------- Serf Bot: turn 21 ----------
+Serf Bot - plays Minion
+Serf Bot - takes 2 coins
+Serf Bot - plays Minion
+Serf Bot - takes 2 coins
+Serf Bot - plays Pawn
+Serf Bot - takes 1 action
+Serf Bot - draws Bank
+Serf Bot - plays Harvest
+Serf Bot - reveals: Salvager, Estate
+Serf Bot - shuffles deck
+Serf Bot - reveals: Silver, Copper
+Serf Bot - discards: Salvager, Estate, Silver, Copper
+Serf Bot - plays 1 Copper
+Serf Bot - plays Bank
+Serf Bot - buys Colony
+Serf Bot - gains Colony
+Serf Bot - draws Colony, Moneylender, Baron, Estate, Silver
+ 
+---------- ftl: turn 21 ----------
+ftl - plays Moneylender
+ftl - trashes Copper
+ftl - plays 2 Fool's Gold
+ftl - buys Province
+ftl - gains Province
+ftl - draws Minion, Count, Fool's Gold, Minion, Fool's Gold
+ 
+---------- Serf Bot: turn 22 ----------
+Serf Bot - plays Baron
+Serf Bot - discards Estate
+Serf Bot - plays 1 Silver
+Serf Bot - buys Count
+Serf Bot - gains Count
+Serf Bot - draws Gold, Baron, Silver, Pawn, Bank
+ 
+---------- ftl: turn 22 ----------
+ftl - plays Minion
+ftl - takes 2 coins
+ftl - plays Minion
+ftl - takes 2 coins
+ftl - plays Count
+ftl - gains Copper
+ftl - takes 3 coins
+ftl - plays 2 Fool's Gold
+ftl - buys Colony
+ftl - gains Colony
+ftl - draws Copper, Copper
+ftl - shuffles deck
+ftl - draws Baron, Estate, Fool's Gold
+ 
+---------- Serf Bot: turn 23 ----------
+Serf Bot - plays Pawn
+Serf Bot - takes 1 action
+Serf Bot - draws Minion
+Serf Bot - plays Minion
+Serf Bot - takes 2 coins
+Serf Bot - plays Baron
+Serf Bot - gains Estate
+Serf Bot - plays 1 Gold, 1 Silver
+Serf Bot - plays Bank
+Serf Bot - buys Minion
+Serf Bot - gains Minion
+Serf Bot - buys Harvest
+Serf Bot - gains Harvest
+Serf Bot - draws Platinum, Province, Salvager, Salvager, Steward
+ 
+---------- ftl: turn 23 ----------
+ftl - plays Baron
+ftl - discards Estate
+ftl - plays 2 Copper, 1 Fool's Gold
+ftl - buys Bank
+ftl - gains Bank
+ftl - draws Fool's Gold, Copper, Estate, Colony, Minion
+ 
+---------- Serf Bot: turn 24 ----------
+Serf Bot - plays Salvager
+Serf Bot - trashes Salvager
+Serf Bot - plays 1 Platinum
+Serf Bot - buys Minion
+Serf Bot - gains Minion
+Serf Bot - buys Baron
+Serf Bot - gains Baron
+Serf Bot - shuffles deck
+Serf Bot - draws Baron, Steward, Province, Copper, Gold
+ 
+---------- ftl: turn 24 ----------
+ftl - plays Minion
+ftl - discards: Fool's Gold, Copper, Estate, Colony
+ftl - draws Pawn, Fool's Gold, Harvest, Moneylender
+Serf Bot - discards: Baron, Steward, Province, Copper, Gold
+Serf Bot - draws Estate, Moneylender, Colony, Minion
+ftl - plays Pawn
+ftl - takes 1 action
+ftl - draws Count
+ftl - plays Count
+ftl - places Fool's Gold on top of deck
+ftl - trashes Harvest, Moneylender
+ftl - draws Fool's Gold, Platinum, Salvager, Bank, Copper
+ 
+---------- Serf Bot: turn 25 ----------
+Serf Bot - plays Minion
+Serf Bot - takes 2 coins
+Serf Bot - buys Pawn
+Serf Bot - gains Pawn
+Serf Bot - draws Salvager, Copper, Minion, Silver, Silver
+ 
+---------- ftl: turn 25 ----------
+ftl - plays Salvager
+ftl - trashes Bank
+ftl - plays 1 Fool's Gold, 1 Platinum, 1 Copper
+ftl - buys Colony
+ftl - gains Colony
+ftl - buys Fool's Gold
+ftl - gains Fool's Gold
+ftl - draws Fool's Gold, Fool's Gold, Fool's Gold, Duchy, Province
+ 
+---------- Serf Bot: turn 26 ----------
+Serf Bot - plays Minion
+Serf Bot - takes 2 coins
+Serf Bot - plays Salvager
+Serf Bot - trashes Copper
+Serf Bot - plays 2 Silver
+Serf Bot - buys Gold
+Serf Bot - gains Gold
+Serf Bot - draws Silver, Platinum, Baron, Baron, Salvager
+ 
+---------- ftl: turn 26 ----------
+ftl - plays 3 Fool's Gold
+ftl - buys Platinum
+ftl - gains Platinum
+ftl - draws Fool's Gold, Minion, Fool's Gold, Steward
+ftl - shuffles deck
+ftl - draws Fool's Gold
+ 
+---------- Serf Bot: turn 27 ----------
+Serf Bot - plays Salvager
+Serf Bot - trashes Baron
+Serf Bot - plays 1 Silver, 1 Platinum
+Serf Bot - buys Province
+Serf Bot - gains Province
+ftl - trashes Fool's Gold
+ftl - gains Gold
+ftl - trashes Fool's Gold
+ftl - gains Gold
+ftl - trashes Fool's Gold
+ftl - gains Gold
+Serf Bot - buys Pawn
+Serf Bot - gains Pawn
+Serf Bot - draws Pawn, Minion, Bank, Count, Minion
+ 
+---------- ftl: turn 27 ----------
+ftl - plays Minion
+ftl - discards Steward
+ftl - draws Gold, Gold, Gold, Fool's Gold
+Serf Bot - discards: Pawn, Minion, Bank, Count, Minion
+Serf Bot - draws Estate, Harvest, Estate, Bank
+ftl - plays 3 Gold, 1 Fool's Gold
+ftl - buys Platinum
+ftl - gains Platinum
+ftl - draws Estate, Fool's Gold, Platinum, Bank, Fool's Gold
+ 
+---------- Serf Bot: turn 28 ----------
+Serf Bot - plays Harvest
+Serf Bot - reveals: Harvest, Pawn, Minion, Colony
+Serf Bot - discards: Harvest, Pawn, Minion, Colony
+Serf Bot - plays Bank
+Serf Bot - buys Count
+Serf Bot - gains Count
+Serf Bot - shuffles deck
+Serf Bot - draws Colony, Province, Count, Platinum, Bank
+ 
+---------- ftl: turn 28 ----------
+ftl - plays 2 Fool's Gold, 1 Platinum
+ftl - plays Bank
+ftl - buys Colony
+ftl - gains Colony
+ftl - draws Platinum, Fool's Gold, Colony, Fool's Gold, Province
+ 
+---------- Serf Bot: turn 29 ----------
+Serf Bot - plays Count
+Serf Bot - gains Copper
+Serf Bot - gains Duchy
+Serf Bot - plays 1 Platinum
+Serf Bot - plays Bank
+Serf Bot - buys Bank
+Serf Bot - gains Bank
+Serf Bot - draws Gold, Moneylender, Salvager, Gold, Province
+ 
+---------- ftl: turn 29 ----------
+ftl - plays 2 Fool's Gold, 1 Platinum
+ftl - buys Platinum
+ftl - gains Platinum
+ftl - draws Salvager, Count, Duchy, Copper, Baron
+ 
+---------- Serf Bot: turn 30 ----------
+Serf Bot - plays Salvager
+Serf Bot - trashes Moneylender
+Serf Bot - plays 2 Gold
+Serf Bot - buys Province
+Serf Bot - gains Province
+Serf Bot - buys Estate
+Serf Bot - gains Estate
+Serf Bot - draws Minion, Minion, Estate, Steward, Estate
+ 
+---------- ftl: turn 30 ----------
+ftl - plays Count
+ftl - places Salvager on top of deck
+ftl - gains Duchy
+ftl - draws Salvager, Minion, Estate, Pawn, Copper
+ 
+---------- Serf Bot: turn 31 ----------
+Serf Bot - plays Minion
+Serf Bot - takes 2 coins
+Serf Bot - plays Minion
+Serf Bot - takes 2 coins
+Serf Bot - plays Steward
+Serf Bot - takes 2 coins
+Serf Bot - buys Duchy
+Serf Bot - gains Duchy
+Serf Bot - draws Pawn, Minion, Estate, Baron, Copper
+ 
+---------- ftl: turn 31 ----------
+ftl - plays Pawn
+ftl - takes 1 coin
+ftl - takes 1 action
+ftl - plays Minion
+ftl - discards: Salvager, Estate, Copper
+ftl - draws Copper, Copper, Colony, Fool's Gold
+Serf Bot - discards: Pawn, Minion, Estate, Baron, Copper
+Serf Bot - draws Pawn, Silver, Silver, Harvest
+ftl - plays 2 Copper, 1 Fool's Gold
+ftl - buys Fool's Gold
+ftl - gains Fool's Gold
+ftl - shuffles deck
+ftl - draws Pawn, Count, Colony, Duchy, Gold
+ 
+---------- Serf Bot: turn 32 ----------
+Serf Bot - plays Pawn
+Serf Bot - takes 1 action
+Serf Bot - draws Harvest
+Serf Bot - plays Harvest
+Serf Bot - reveals: Salvager, Bank, Pawn, Silver
+Serf Bot - discards: Salvager, Bank, Pawn, Silver
+Serf Bot - plays 2 Silver
+Serf Bot - buys Province
+Serf Bot - gains Province
+Serf Bot - draws Pawn, Minion, Baron, Colony, Minion
+ 
+---------- ftl: turn 32 ----------
+ftl - plays Pawn
+ftl - takes 1 action
+ftl - draws Platinum
+ftl - plays Count
+ftl - discards Duchy
+ftl - discards Colony
+ftl - takes 3 coins
+ftl - plays 1 Gold, 1 Platinum
+ftl - buys Colony
+ftl - gains Colony
+ftl - draws Salvager, Fool's Gold, Minion, Fool's Gold, Fool's Gold
+ 
+---------- Serf Bot: turn 33 ----------
+Serf Bot - plays Minion
+Serf Bot - takes 2 coins
+Serf Bot - plays Minion
+Serf Bot - takes 2 coins
+Serf Bot - plays Pawn
+Serf Bot - takes 1 action
+Serf Bot - draws Count
+Serf Bot - plays Count
+Serf Bot - places Baron on top of deck
+Serf Bot - gains Duchy
+Serf Bot - buys Salvager
+Serf Bot - gains Salvager
+Serf Bot - draws Baron
+Serf Bot - shuffles deck
+Serf Bot - draws Count, Harvest, Minion, Harvest
+ 
+---------- ftl: turn 33 ----------
+ftl - plays Salvager
+ftl - trashes Minion
+ftl - plays 3 Fool's Gold
+ftl - buys Colony
+ftl - gains Colony
+ftl - draws Baron, Province, Copper, Fool's Gold, Colony
+ 
+---------- Serf Bot: turn 34 ----------
+Serf Bot - plays Minion
+Serf Bot - takes 2 coins
+Serf Bot - plays Baron
+Serf Bot - gains Estate
+Serf Bot - buys Estate
+Serf Bot - gains Estate
+Serf Bot - draws Steward, Province, Silver, Copper, Minion
+ 
+---------- ftl: turn 34 ----------
+ftl - plays Baron
+ftl - gains Estate
+ftl - plays 1 Copper, 1 Fool's Gold
+ftl - buys Estate
+ftl - gains Estate
+ftl - draws Fool's Gold, Bank, Platinum, Fool's Gold, Colony
+ 
+---------- Serf Bot: turn 35 ----------
+Serf Bot - plays Minion
+Serf Bot - takes 2 coins
+Serf Bot - plays Steward
+Serf Bot - takes 2 coins
+Serf Bot - plays 1 Silver, 1 Copper
+Serf Bot - buys Bank
+Serf Bot - gains Bank
+Serf Bot - draws Duchy, Salvager, Estate, Copper, Minion
+ 
+---------- ftl: turn 35 ----------
+ftl - plays 2 Fool's Gold, 1 Platinum
+ftl - plays Bank
+ftl - buys Colony
+ftl - gains Colony
+ftl - draws Copper, Estate, Duchy, Fool's Gold, Gold
+ 
+------------ Game Over ------------
+ftl - cards: 1 Count, 1 Steward, 1 Minion, 1 Baron, 1 Salvager, 1 Pawn, 7 Fool's Gold, 4 Platinum, 4 Copper, 3 Gold, 1 Bank, 6 Colony, 4 Estate, 2 Duchy, 1 Province
+ftl - total victory points: 76
+ftl - turns: 35
+ 
+Serf Bot - cards: 5 Minion, 4 Pawn, 3 Salvager, 2 Count, 2 Baron, 2 Harvest, 1 Steward, 4 Bank, 3 Silver, 2 Gold, 2 Copper, 1 Platinum, 6 Estate, 4 Province, 3 Duchy, 2 Colony
+Serf Bot - total victory points: 59
+Serf Bot - turns: 35
+ 
+1st place: ftl
+2nd place: Serf Bot
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.50612a9b51c36e573294bfd0.1369437968246.txt b/testing/testdata/log.50612a9b51c36e573294bfd0.1369437968246.txt
new file mode 100644
index 0000000..a14859e
--- /dev/null
+++ b/testing/testdata/log.50612a9b51c36e573294bfd0.1369437968246.txt
@@ -0,0 +1,784 @@
+------------ Game Setup ------------
+Supply cards: Poor House, Secret Chamber, Storeroom, Trade Route, Ironmonger, Ironworks, Tournament, City, Tribute, Vault, Copper, Silver, Gold, Estate, Duchy, Province, Curse
+Rating system: unrated
+ftl - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Serf Bot - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+ftl - shuffles deck
+Serf Bot - shuffles deck
+ftl - draws Copper, Copper, Copper, Estate, Copper
+Serf Bot - draws Estate, Copper, Copper, Estate, Copper
+ 
+---------- ftl: turn 1 ----------
+ftl - plays 4 Copper
+ftl - buys Ironworks
+ftl - gains Ironworks
+ftl - draws Copper, Copper, Estate, Estate, Copper
+ 
+---------- Serf Bot: turn 1 ----------
+Serf Bot - plays 3 Copper
+Serf Bot - buys Storeroom
+Serf Bot - gains Storeroom
+Serf Bot - draws Copper, Estate, Copper, Copper, Copper
+ 
+---------- ftl: turn 2 ----------
+ftl - plays 3 Copper
+ftl - buys Silver
+ftl - gains Silver
+ftl - shuffles deck
+ftl - draws Copper, Silver, Estate, Copper, Copper
+ 
+---------- Serf Bot: turn 2 ----------
+Serf Bot - plays 4 Copper
+Serf Bot - buys Ironmonger
+Serf Bot - gains Ironmonger
+Serf Bot - shuffles deck
+Serf Bot - draws Copper, Copper, Copper, Copper, Copper
+ 
+---------- ftl: turn 3 ----------
+ftl - plays 3 Copper, 1 Silver
+ftl - buys Tribute
+ftl - gains Tribute
+ftl - draws Copper, Copper, Copper, Estate, Estate
+ 
+---------- Serf Bot: turn 3 ----------
+Serf Bot - plays 5 Copper
+Serf Bot - buys Vault
+Serf Bot - gains Vault
+Serf Bot - draws Copper, Estate, Ironmonger, Copper, Estate
+ 
+---------- ftl: turn 4 ----------
+ftl - plays 3 Copper
+ftl - buys Trade Route
+ftl - gains Trade Route
+ftl - draws Ironworks, Copper
+ftl - shuffles deck
+ftl - draws Copper, Copper, Tribute
+ 
+---------- Serf Bot: turn 4 ----------
+Serf Bot - plays Ironmonger
+Serf Bot - draws Storeroom
+Serf Bot - reveals: Estate
+Serf Bot - discards Estate
+Serf Bot - shuffles deck
+Serf Bot - draws Copper
+Serf Bot - plays Storeroom
+Serf Bot - discards Estate
+Serf Bot - discards Estate
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+Serf Bot - draws Copper, Copper, Copper, Copper, Vault
+Serf Bot - discards Vault
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+Serf Bot - buys Vault
+Serf Bot - gains Vault
+Serf Bot - draws Estate
+Serf Bot - shuffles deck
+Serf Bot - draws Copper, Estate, Vault, Vault
+ 
+---------- ftl: turn 5 ----------
+ftl - plays Ironworks
+ftl - gains Ironmonger
+ftl - plays Tribute
+Serf Bot - reveals: Estate, Copper
+ftl - receives 2 coins
+ftl - draws Copper, Copper
+Serf Bot - discards: Estate, Copper
+ftl - plays 5 Copper
+ftl - buys City
+ftl - gains City
+ftl - draws Silver, Copper, Trade Route, Copper, Estate
+ 
+---------- Serf Bot: turn 5 ----------
+Serf Bot - plays Vault
+Serf Bot - draws Ironmonger, Storeroom
+Serf Bot - discards Storeroom
+Serf Bot - discards Vault
+Serf Bot - discards Ironmonger
+Serf Bot - discards Estate
+Serf Bot - discards Estate
+Serf Bot - discards Copper
+ftl - discards Trade Route
+ftl - discards Estate
+Serf Bot - buys Gold
+Serf Bot - gains Gold
+Serf Bot - draws Copper, Copper, Copper, Copper, Copper
+ 
+---------- ftl: turn 6 ----------
+ftl - plays 2 Copper, 1 Silver
+ftl - buys Tournament
+ftl - gains Tournament
+ftl - draws Estate
+ftl - shuffles deck
+ftl - draws Tribute, Ironworks, Trade Route, Copper
+ 
+---------- Serf Bot: turn 6 ----------
+Serf Bot - plays 5 Copper
+Serf Bot - buys City
+Serf Bot - gains City
+Serf Bot - shuffles deck
+Serf Bot - draws Gold, Copper, Vault, Estate, Copper
+ 
+---------- ftl: turn 7 ----------
+ftl - plays Ironworks
+ftl - gains Tournament
+ftl - plays Tribute
+Serf Bot - reveals: Copper, Storeroom
+ftl - receives 2 coins
+ftl - receives 2 actions
+Serf Bot - discards: Copper, Storeroom
+ftl - plays Trade Route
+ftl - trashes Estate
+ftl - plays 1 Copper
+ftl - buys Silver
+ftl - gains Silver
+ftl - draws Copper, Copper, Copper, Copper, City
+ 
+---------- Serf Bot: turn 7 ----------
+Serf Bot - plays Vault
+Serf Bot - draws City, Copper
+Serf Bot - discards City
+Serf Bot - discards Estate
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+ftl - discards Copper
+ftl - discards Copper
+Serf Bot - plays 1 Gold
+Serf Bot - buys Province
+Serf Bot - gains Province
+Serf Bot - draws Vault, Estate, Copper, Estate, Ironmonger
+ 
+---------- ftl: turn 8 ----------
+ftl - plays City
+ftl - draws Ironmonger
+ftl - plays Ironmonger
+ftl - draws Tournament
+ftl - reveals: Copper
+ftl - discards Copper
+ftl - plays Tournament
+ftl - draws Estate
+ftl - plays 3 Copper
+ftl - buys City
+ftl - gains City
+ftl - draws Silver, Estate
+ftl - shuffles deck
+ftl - draws Tournament, Ironmonger, Trade Route
+ 
+---------- Serf Bot: turn 8 ----------
+Serf Bot - plays Ironmonger
+Serf Bot - draws Copper
+Serf Bot - reveals: Copper
+Serf Bot - places Copper on top of deck
+Serf Bot - plays Vault
+Serf Bot - draws Copper
+Serf Bot - shuffles deck
+Serf Bot - draws Copper
+Serf Bot - discards Estate
+Serf Bot - discards Estate
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+Serf Bot - buys Gold
+Serf Bot - gains Gold
+Serf Bot - draws Province, Copper, Estate, Copper, Storeroom
+ 
+---------- ftl: turn 9 ----------
+ftl - plays Ironmonger
+ftl - draws City
+ftl - reveals: Copper
+ftl - discards Copper
+ftl - plays City
+ftl - draws Copper
+ftl - plays Trade Route
+ftl - trashes Estate
+ftl - plays Tournament
+Serf Bot - reveals Province
+ftl - plays 1 Silver, 1 Copper
+ftl - buys City
+ftl - gains City
+ftl - draws Tournament, Estate, Copper, City, Copper
+ 
+---------- Serf Bot: turn 9 ----------
+Serf Bot - plays Storeroom
+Serf Bot - discards Province
+Serf Bot - discards Estate
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+Serf Bot - draws Gold, Copper, City, Vault
+Serf Bot - discards Vault
+Serf Bot - discards City
+Serf Bot - discards Copper
+Serf Bot - plays 1 Gold
+Serf Bot - buys Ironworks
+Serf Bot - gains Ironworks
+Serf Bot - buys Secret Chamber
+Serf Bot - gains Secret Chamber
+Serf Bot - shuffles deck
+Serf Bot - draws Secret Chamber, Vault, Estate, City, Copper
+ 
+---------- ftl: turn 10 ----------
+ftl - plays City
+ftl - draws Silver
+ftl - plays Tournament
+ftl - draws Ironworks
+ftl - plays Ironworks
+ftl - gains Silver
+ftl - plays 2 Copper, 1 Silver
+ftl - buys Gold
+ftl - gains Gold
+ftl - draws Tribute, Copper, Copper, Copper
+ftl - shuffles deck
+ftl - draws City
+ 
+---------- Serf Bot: turn 10 ----------
+Serf Bot - plays City
+Serf Bot - draws Storeroom
+Serf Bot - plays Vault
+Serf Bot - draws Copper, Province
+Serf Bot - discards Storeroom
+Serf Bot - discards Secret Chamber
+Serf Bot - discards Province
+Serf Bot - discards Estate
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+ftl - discards Copper
+ftl - discards Copper
+Serf Bot - buys Gold
+Serf Bot - gains Gold
+Serf Bot - draws Copper, Gold, Estate, Copper, Vault
+ 
+---------- ftl: turn 11 ----------
+ftl - plays City
+ftl - draws Gold
+ftl - plays Tribute
+Serf Bot - reveals: Estate, Copper
+ftl - receives 2 coins
+ftl - draws Tournament, Silver
+Serf Bot - discards: Estate, Copper
+ftl - plays Tournament
+ftl - draws Ironmonger
+ftl - plays Tournament
+ftl - draws Copper
+ftl - plays Ironmonger
+ftl - draws Ironworks
+ftl - reveals: Silver
+ftl - discards Silver
+ftl - plays Ironworks
+ftl - gains Storeroom
+ftl - plays 2 Copper, 1 Gold, 1 Silver
+ftl - buys Province
+ftl - gains Province
+ftl - draws Estate, Trade Route, City, Copper, Copper
+ 
+---------- Serf Bot: turn 11 ----------
+Serf Bot - plays Vault
+Serf Bot - draws Gold, Copper
+Serf Bot - discards Estate
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+Serf Bot - plays 2 Gold
+Serf Bot - buys Province
+Serf Bot - gains Province
+Serf Bot - draws Copper, Ironworks, Ironmonger
+Serf Bot - shuffles deck
+Serf Bot - draws Copper, Vault
+ 
+---------- ftl: turn 12 ----------
+ftl - plays City
+ftl - draws City
+ftl - plays City
+ftl - draws Silver
+ftl - plays Trade Route
+ftl - trashes Estate
+ftl - plays 2 Copper, 1 Silver
+ftl - buys City
+ftl - gains City
+ftl - draws Copper
+ftl - shuffles deck
+ftl - draws Silver, Copper, Silver, Copper
+ 
+---------- Serf Bot: turn 12 ----------
+Serf Bot - plays Ironworks
+Serf Bot - gains Tournament
+Serf Bot - plays Ironmonger
+Serf Bot - draws Estate
+Serf Bot - reveals: Copper
+Serf Bot - discards Copper
+Serf Bot - plays Vault
+Serf Bot - draws Copper, Vault
+Serf Bot - discards Vault
+Serf Bot - discards Estate
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+ftl - discards Copper
+ftl - discards Copper
+Serf Bot - buys Gold
+Serf Bot - gains Gold
+Serf Bot - draws Secret Chamber, Estate, Copper, Province, City
+ 
+---------- ftl: turn 13 ----------
+ftl - plays 2 Copper, 2 Silver
+ftl - buys City
+ftl - gains City
+ftl - draws Gold, Copper, City, Trade Route, Silver
+ 
+---------- Serf Bot: turn 13 ----------
+Serf Bot - plays City
+Serf Bot - draws Copper
+Serf Bot - plays Secret Chamber
+Serf Bot - discards Province
+Serf Bot - discards Estate
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+Serf Bot - buys Ironworks
+Serf Bot - gains Ironworks
+Serf Bot - draws Gold, Province, Estate, Copper, Gold
+ 
+---------- ftl: turn 14 ----------
+ftl - plays City
+ftl - draws City
+ftl - plays City
+ftl - draws Ironworks
+ftl - plays Ironworks
+ftl - gains Poor House
+ftl - plays Trade Route
+ftl - trashes Copper
+ftl - plays 1 Gold, 1 Silver
+ftl - buys City
+ftl - gains City
+ftl - draws Storeroom, Copper, Tournament, Tournament, City
+ 
+---------- Serf Bot: turn 14 ----------
+Serf Bot - plays 2 Gold, 1 Copper
+Serf Bot - buys Gold
+Serf Bot - gains Gold
+Serf Bot - draws Storeroom, Gold
+Serf Bot - shuffles deck
+Serf Bot - draws Estate, Ironmonger, Gold
+ 
+---------- ftl: turn 15 ----------
+ftl - plays City
+ftl - draws Province
+ftl - plays Tournament
+ftl - reveals Province
+ftl - discards Province
+ftl - gains Followers
+ftl - draws Followers
+ftl - plays Followers
+ftl - draws Tribute, Copper
+ftl - gains Estate
+Serf Bot - gains Curse
+Serf Bot - discards Estate
+Serf Bot - discards Gold
+ftl - plays Tournament
+ftl - draws City
+ftl - plays City
+ftl - draws Ironmonger
+ftl - plays Ironmonger
+ftl - shuffles deck
+ftl - draws Copper
+ftl - reveals: Silver
+ftl - discards Silver
+ftl - plays Tribute
+Serf Bot - reveals: Vault, Copper
+ftl - receives 2 coins
+ftl - receives 2 actions
+Serf Bot - discards: Vault, Copper
+ftl - plays Storeroom
+ftl - discards Copper
+ftl - discards Copper
+ftl - discards Copper
+ftl - draws City, Gold, Copper
+ftl - discards Copper
+ftl - plays City
+ftl - draws Estate
+ftl - plays Gold
+ftl - buys City
+ftl - gains City
+ftl - buys Tournament
+ftl - gains Tournament
+ftl - draws Poor House, Ironworks, City, City, Silver
+ 
+---------- Serf Bot: turn 15 ----------
+Serf Bot - plays Ironmonger
+Serf Bot - draws Copper
+Serf Bot - reveals: Copper
+Serf Bot - places Copper on top of deck
+Serf Bot - plays Storeroom
+Serf Bot - discards Copper
+Serf Bot - draws Copper
+Serf Bot - discards Copper
+Serf Bot - plays 1 Gold
+Serf Bot - buys Duchy
+Serf Bot - gains Duchy
+Serf Bot - buys Copper
+Serf Bot - gains Copper
+Serf Bot - draws Gold, Copper, Estate, Gold, Copper
+ 
+---------- ftl: turn 16 ----------
+ftl - plays City
+ftl - draws Silver
+ftl - plays City
+ftl - draws Copper
+ftl - plays Poor House
+ftl - reveals hand: Ironworks, Silver, Silver, Copper
+ftl - plays Ironworks
+ftl - gains Storeroom
+ftl - plays 2 Silver, 1 Copper
+ftl - buys City
+ftl - gains City
+ftl - draws Province, Trade Route, Copper, City
+ftl - shuffles deck
+ftl - draws Tournament
+ 
+---------- Serf Bot: turn 16 ----------
+Serf Bot - plays 2 Gold, 2 Copper
+Serf Bot - buys Province
+Serf Bot - gains Province
+Serf Bot - draws City, Secret Chamber, Vault, Gold, Ironworks
+ 
+---------- ftl: turn 17 ----------
+ftl - plays City
+ftl - draws Copper
+ftl - plays Tournament
+ftl - reveals Province
+ftl - discards Province
+ftl - gains Diadem
+ftl - draws Diadem
+ftl - plays Trade Route
+ftl - trashes Copper
+ftl - plays 1 Copper, 1 Diadem
+ftl - buys City
+ftl - gains City
+ftl - buys Storeroom
+ftl - gains Storeroom
+ftl - draws Tribute, Ironworks, Copper, Copper, Ironmonger
+ 
+---------- Serf Bot: turn 17 ----------
+Serf Bot - plays City
+Serf Bot - draws Province, Province
+Serf Bot - plays Ironworks
+Serf Bot - gains Ironworks
+Serf Bot - plays Vault
+Serf Bot - draws Tournament, Estate
+Serf Bot - discards Secret Chamber
+Serf Bot - discards Province
+Serf Bot - discards Province
+Serf Bot - discards Estate
+ftl - discards Copper
+ftl - discards Copper
+Serf Bot - plays Tournament
+Serf Bot - draws Copper
+Serf Bot - plays 1 Gold, 1 Copper
+Serf Bot - buys Province
+Serf Bot - gains Province
+Serf Bot - draws Copper, Ironworks
+Serf Bot - shuffles deck
+Serf Bot - draws Province, Secret Chamber, Duchy
+ 
+---------- ftl: turn 18 ----------
+ftl - plays Ironmonger
+ftl - draws City
+ftl - reveals: City
+ftl - places City on top of deck
+ftl - plays City
+ftl - draws City, Storeroom
+ftl - plays City
+ftl - draws Silver, Estate
+ftl - plays Tribute
+Serf Bot - reveals: Estate, Vault
+ftl - receives 2 actions
+ftl - draws Copper, Silver
+Serf Bot - discards: Estate, Vault
+ftl - plays Storeroom
+ftl - discards Estate
+ftl - discards Copper
+ftl - draws Followers, Storeroom
+ftl - plays Poor House
+ftl - reveals hand: Ironworks, Silver, Silver, Followers, Storeroom
+ftl - plays Followers
+Serf Bot - reveals reaction Secret Chamber
+Serf Bot - draws Copper, Province
+Serf Bot - places Secret Chamber on top of deck
+Serf Bot - places Province on top of deck
+ftl - draws Tournament, City
+ftl - gains Estate
+Serf Bot - gains Curse
+Serf Bot - discards Province
+Serf Bot - discards Duchy
+ftl - plays City
+ftl - draws City, City
+ftl - plays City
+ftl - draws Silver, Tournament
+ftl - plays City
+ftl - draws City, City
+ftl - plays City
+ftl - draws Copper, Gold
+ftl - plays City
+ftl - shuffles deck
+ftl - draws City, City
+ftl - plays City
+ftl - draws Copper, Trade Route
+ftl - plays Trade Route
+ftl - trashes City
+ftl - plays Tournament
+ftl - draws Copper
+ftl - plays Tournament
+ftl - draws Estate
+ftl - plays Ironworks
+ftl - gains Tournament
+ftl - plays Storeroom
+ftl - discards Estate
+ftl - discards Copper
+ftl - discards Copper
+ftl - discards Copper
+ftl - draws Province, Storeroom, Diadem, Tournament
+ftl - discards Province
+ftl - plays Tournament
+ftl - draws Estate
+ftl - plays Storeroom
+ftl - discards Estate
+ftl - draws Copper
+ftl - discards Copper
+ftl - plays 3 Silver, 1 Gold, 1 Diadem
+ftl - buys Tournament
+ftl - gains Tournament
+ftl - buys Tournament
+ftl - gains Tournament
+ftl - buys Tournament
+ftl - gains Tournament
+ftl - buys Tournament
+ftl - gains Tournament
+ftl - buys Tournament
+ftl - gains Tournament
+ftl - draws Copper
+ftl - shuffles deck
+ftl - draws Estate, City, Silver, Province
+ 
+---------- Serf Bot: turn 18 ----------
+Serf Bot - plays Ironworks
+Serf Bot - gains Ironmonger
+Serf Bot - plays 2 Copper
+Serf Bot - buys Estate
+Serf Bot - gains Estate
+Serf Bot - draws Province, Secret Chamber, Province, Estate, Ironworks
+ 
+---------- ftl: turn 19 ----------
+ftl - plays City
+ftl - draws Copper, Gold
+ftl - plays 2 Copper, 1 Silver, 1 Gold
+ftl - buys Province
+ftl - gains Province
+ftl - draws Ironworks, Followers, Copper, City, Poor House
+ 
+---------- Serf Bot: turn 19 ----------
+Serf Bot - plays Ironworks
+Serf Bot - gains Ironmonger
+Serf Bot - plays Secret Chamber
+Serf Bot - discards Province
+Serf Bot - discards Province
+Serf Bot - discards Estate
+Serf Bot - buys Silver
+Serf Bot - gains Silver
+Serf Bot - draws Storeroom, Copper, Copper, City, Copper
+ 
+---------- ftl: turn 20 ----------
+ftl - plays City
+ftl - draws Storeroom, Tribute
+ftl - plays Followers
+ftl - draws Diadem, Copper
+ftl - gains Estate
+Serf Bot - gains Curse
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+ftl - plays Tribute
+Serf Bot - reveals: Copper, Copper
+ftl - receives 2 coins
+Serf Bot - discards: Copper, Copper
+ftl - plays 2 Copper, 1 Diadem
+ftl - buys Duchy
+ftl - gains Duchy
+ftl - buys Estate
+ftl - gains Estate
+ftl - draws City, Copper, Tournament, Ironmonger, Silver
+ 
+---------- Serf Bot: turn 20 ----------
+Serf Bot - plays City
+Serf Bot - draws Ironworks, Vault
+Serf Bot - plays Ironworks
+Serf Bot - gains Ironmonger
+Serf Bot - plays Vault
+Serf Bot - draws Estate, Tournament
+Serf Bot - discards Storeroom
+Serf Bot - discards Estate
+Serf Bot - discards Copper
+ftl - discards Copper
+ftl - discards Silver
+Serf Bot - plays Tournament
+Serf Bot - draws Gold
+Serf Bot - plays 1 Gold
+Serf Bot - buys Duchy
+Serf Bot - gains Duchy
+Serf Bot - buys Storeroom
+Serf Bot - gains Storeroom
+Serf Bot - draws Gold, Copper, Province, Gold, Ironmonger
+ 
+---------- ftl: turn 21 ----------
+ftl - plays City
+ftl - draws Tournament, Storeroom
+ftl - plays Tournament
+Serf Bot - reveals Province
+ftl - plays Tournament
+Serf Bot - reveals Province
+ftl - plays Ironmonger
+ftl - draws City
+ftl - reveals: City
+ftl - places City on top of deck
+ftl - plays City
+ftl - draws City, Tournament
+ftl - plays City
+ftl - draws Estate, Tournament
+ftl - plays Storeroom
+ftl - discards Tournament
+ftl - discards Estate
+ftl - discards Tournament
+ftl - draws Storeroom, City, Tournament
+ftl - discards City
+ftl - discards Tournament
+ftl - discards Storeroom
+ftl - discards Silver
+ftl - buys Duchy
+ftl - gains Duchy
+ftl - buys Estate
+ftl - gains Estate
+ftl - draws City, Tournament, Tournament, Tournament, Trade Route
+ 
+---------- Serf Bot: turn 21 ----------
+Serf Bot - plays Ironmonger
+Serf Bot - draws Gold
+Serf Bot - reveals: Curse
+Serf Bot - discards Curse
+Serf Bot - plays 3 Gold, 1 Copper
+Serf Bot - buys Province
+Serf Bot - gains Province
+Serf Bot - draws Gold
+Serf Bot - shuffles deck
+Serf Bot - draws Copper, Ironworks, Gold, Copper
+ 
+---------- ftl: turn 22 ----------
+ftl - plays City
+ftl - draws City, Tournament
+ftl - plays City
+ftl - shuffles deck
+ftl - draws Silver, Storeroom
+ftl - plays Tournament
+ftl - draws City
+ftl - plays City
+ftl - draws Province, Province
+ftl - plays Tournament
+ftl - draws Ironworks
+ftl - plays Tournament
+ftl - draws Estate
+ftl - plays Trade Route
+ftl - trashes Estate
+ftl - plays Tournament
+ftl - draws Estate
+ftl - plays Ironworks
+ftl - gains Estate
+ftl - draws Duchy
+ftl - plays Storeroom
+ftl - discards Silver
+ftl - discards Province
+ftl - discards Province
+ftl - discards Estate
+ftl - discards Duchy
+ftl - draws Copper, Copper, Silver, City, Tournament
+ftl - plays City
+ftl - draws Storeroom, Storeroom
+ftl - plays Tournament
+ftl - draws Tournament
+ftl - plays Tournament
+ftl - draws Ironmonger
+ftl - plays Ironmonger
+ftl - draws Estate
+ftl - reveals: Estate
+ftl - discards Estate
+ftl - draws City
+ftl - plays City
+ftl - draws City, Gold
+ftl - plays City
+ftl - draws Tournament, Silver
+ftl - plays Tournament
+ftl - draws Estate
+ftl - plays Storeroom
+ftl - discards Copper
+ftl - discards Copper
+ftl - discards Estate
+ftl - discards Estate
+ftl - draws Copper, Diadem, Poor House, Tournament
+ftl - plays Tournament
+ftl - draws Copper
+ftl - plays Storeroom
+ftl - discards Copper
+ftl - discards Poor House
+ftl - discards Copper
+ftl - draws Followers, Tribute, Duchy
+ftl - discards Duchy
+ftl - plays Followers
+ftl - draws Copper, Tournament
+ftl - gains Estate
+Serf Bot - gains Curse
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+ftl - plays Tournament
+ftl - draws City
+ftl - plays City
+ftl - draws City
+ftl - shuffles deck
+ftl - draws Copper
+ftl - plays City
+ftl - draws Estate, Estate
+ftl - plays Tribute
+Serf Bot - reveals: Silver, Gold
+ftl - receives 4 coins
+Serf Bot - discards: Silver, Gold
+ftl - plays 2 Silver, 2 Copper, 1 Gold, 1 Diadem
+ftl - buys Province
+ftl - gains Province
+ftl - buys Duchy
+ftl - gains Duchy
+ftl - buys Duchy
+ftl - gains Duchy
+ftl - buys Duchy
+ftl - gains Duchy
+ftl - buys Duchy
+ftl - gains Duchy
+ftl - buys Gold
+ftl - gains Gold
+ftl - buys Silver
+ftl - gains Silver
+ftl - buys Copper
+ftl - gains Copper
+ftl - buys Poor House
+ftl - gains Poor House
+ftl - draws Copper, Silver, Copper, Duchy, Duchy
+ 
+------------ Game Over ------------
+ftl - cards: 9 Tournament, 8 City, 3 Storeroom, 2 Poor House, 1 Trade Route, 1 Tribute, 1 Followers, 1 Ironmonger, 1 Ironworks, 6 Copper, 4 Silver, 2 Gold, 1 Diadem, 6 Duchy, 6 Estate, 3 Province
+ftl - total victory points: 42
+ftl - turns: 22
+ 
+Serf Bot - cards: 4 Ironmonger, 3 Ironworks, 2 Vault, 2 Storeroom, 1 Secret Chamber, 1 Tournament, 1 City, 8 Copper, 5 Gold, 1 Silver, 5 Province, 4 Estate, 2 Duchy, 4 Curse
+Serf Bot - total victory points: 36
+Serf Bot - turns: 21
+ 
+1st place: ftl
+2nd place: Serf Bot
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.50612a9b51c36e573294bfd0.1369767124157.txt b/testing/testdata/log.50612a9b51c36e573294bfd0.1369767124157.txt
new file mode 100644
index 0000000..72c0bf6
--- /dev/null
+++ b/testing/testdata/log.50612a9b51c36e573294bfd0.1369767124157.txt
@@ -0,0 +1,555 @@
+------------ Game Setup ------------
+Supply cards: Embargo, Hermit, Urchin, Village, Feast, Horse Traders, Mining Village, Procession, Treasure Map, Band of Misfits, Copper, Silver, Gold, Estate, Duchy, Province, Curse, Colony, Platinum
+Rating system: unrated
+ftl - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Serf Bot - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+ftl - shuffles deck
+Serf Bot - shuffles deck
+ftl - draws Estate, Copper, Copper, Copper, Copper
+Serf Bot - draws Copper, Estate, Copper, Copper, Copper
+ 
+---------- ftl: turn 1 ----------
+ftl - plays 4 Copper
+ftl - buys Horse Traders
+ftl - gains Horse Traders
+ftl - draws Copper, Copper, Estate, Estate, Copper
+ 
+---------- Serf Bot: turn 1 ----------
+Serf Bot - plays 4 Copper
+Serf Bot - buys Mining Village
+Serf Bot - gains Mining Village
+Serf Bot - draws Copper, Estate, Copper, Estate, Copper
+ 
+---------- ftl: turn 2 ----------
+ftl - plays 3 Copper
+ftl - buys Village
+ftl - gains Village
+ftl - shuffles deck
+ftl - draws Copper, Copper, Estate, Copper, Copper
+ 
+---------- Serf Bot: turn 2 ----------
+Serf Bot - plays 3 Copper
+Serf Bot - buys Urchin
+Serf Bot - gains Urchin
+Serf Bot - shuffles deck
+Serf Bot - draws Copper, Estate, Estate, Copper, Mining Village
+ 
+---------- ftl: turn 3 ----------
+ftl - plays 4 Copper
+ftl - buys Horse Traders
+ftl - gains Horse Traders
+ftl - draws Horse Traders, Estate, Copper, Village, Copper
+ 
+---------- Serf Bot: turn 3 ----------
+Serf Bot - plays Mining Village
+Serf Bot - draws Copper
+Serf Bot - plays 3 Copper
+Serf Bot - buys Village
+Serf Bot - gains Village
+Serf Bot - draws Copper, Copper, Copper, Urchin, Estate
+ 
+---------- ftl: turn 4 ----------
+ftl - plays Village
+ftl - draws Estate
+ftl - plays Horse Traders
+ftl - discards Estate
+ftl - discards Estate
+ftl - plays 2 Copper
+ftl - buys Band of Misfits
+ftl - gains Band of Misfits
+ftl - draws Copper
+ftl - shuffles deck
+ftl - draws Copper, Village, Copper, Copper
+ 
+---------- Serf Bot: turn 4 ----------
+Serf Bot - plays Urchin
+Serf Bot - draws Copper
+ftl - discards Copper
+Serf Bot - plays 4 Copper
+Serf Bot - buys Procession
+Serf Bot - gains Procession
+Serf Bot - shuffles deck
+Serf Bot - draws Estate, Copper, Copper, Estate, Copper
+ 
+---------- ftl: turn 5 ----------
+ftl - plays Village
+ftl - draws Estate
+ftl - plays 3 Copper
+ftl - buys Village
+ftl - gains Village
+ftl - draws Horse Traders, Copper, Horse Traders, Band of Misfits, Copper
+ 
+---------- Serf Bot: turn 5 ----------
+Serf Bot - plays 3 Copper
+Serf Bot - buys Hermit
+Serf Bot - gains Hermit
+Serf Bot - draws Estate, Procession, Village, Copper, Copper
+ 
+---------- ftl: turn 6 ----------
+ftl - plays Band of Misfits
+ftl - chooses Mining Village
+ftl - plays Mining Village
+ftl - draws Estate
+ftl - trashes Mining Village
+ftl - plays Horse Traders
+ftl - discards Estate
+ftl - discards Copper
+ftl - plays Horse Traders
+ftl - discards Copper
+ftl - buys Band of Misfits
+ftl - gains Band of Misfits
+ftl - buys Village
+ftl - gains Village
+ftl - draws Estate, Copper
+ftl - shuffles deck
+ftl - draws Estate, Horse Traders, Village
+ 
+---------- Serf Bot: turn 6 ----------
+Serf Bot - plays Procession
+Serf Bot - plays Village
+Serf Bot - draws Copper
+Serf Bot - plays Village
+Serf Bot - draws Mining Village
+Serf Bot - trashes Village
+Serf Bot - gains Treasure Map
+Serf Bot - plays Mining Village
+Serf Bot - draws Copper
+Serf Bot - plays 4 Copper
+Serf Bot - buys Feast
+Serf Bot - gains Feast
+Serf Bot - draws Urchin
+Serf Bot - shuffles deck
+Serf Bot - draws Estate, Copper, Estate, Copper
+ 
+---------- ftl: turn 7 ----------
+ftl - plays Village
+ftl - draws Copper
+ftl - plays Horse Traders
+ftl - discards Estate
+ftl - discards Estate
+ftl - plays 2 Copper
+ftl - buys Band of Misfits
+ftl - gains Band of Misfits
+ftl - draws Copper, Copper, Copper, Copper, Horse Traders
+ 
+---------- Serf Bot: turn 7 ----------
+Serf Bot - plays Urchin
+ftl - reveals reaction Horse Traders
+Serf Bot - draws Copper
+Serf Bot - plays 3 Copper
+Serf Bot - buys Urchin
+Serf Bot - gains Urchin
+Serf Bot - draws Copper, Hermit, Copper, Mining Village, Copper
+ 
+---------- ftl: turn 8 ----------
+ftl - duration Horse Traders
+ftl - draws Copper
+ftl - plays Horse Traders
+ftl - discards Copper
+ftl - discards Copper
+ftl - plays 3 Copper
+ftl - buys Band of Misfits
+ftl - gains Band of Misfits
+ftl - draws Estate, Band of Misfits, Village, Village
+ftl - shuffles deck
+ftl - draws Copper
+ 
+---------- Serf Bot: turn 8 ----------
+Serf Bot - plays Mining Village
+Serf Bot - draws Procession
+Serf Bot - plays Procession
+Serf Bot - plays Hermit
+Serf Bot - trashes Estate
+Serf Bot - gains Silver
+Serf Bot - plays Hermit
+Serf Bot - trashes Estate
+Serf Bot - gains Urchin
+Serf Bot - trashes Hermit
+Serf Bot - gains Mining Village
+Serf Bot - plays 3 Copper
+Serf Bot - buys Hermit
+Serf Bot - gains Hermit
+Serf Bot - draws Estate, Copper, Treasure Map, Feast
+Serf Bot - shuffles deck
+Serf Bot - draws Mining Village
+ 
+---------- ftl: turn 9 ----------
+ftl - plays Village
+ftl - draws Copper
+ftl - plays Village
+ftl - draws Copper
+ftl - plays Band of Misfits
+ftl - chooses Feast
+ftl - plays Feast
+ftl - trashes Feast
+ftl - gains Band of Misfits
+ftl - plays 3 Copper
+ftl - buys Village
+ftl - gains Village
+ftl - draws Copper, Horse Traders, Band of Misfits, Copper, Estate
+ 
+---------- Serf Bot: turn 9 ----------
+Serf Bot - plays Mining Village
+Serf Bot - draws Silver
+Serf Bot - plays Feast
+Serf Bot - trashes Feast
+Serf Bot - gains Band of Misfits
+Serf Bot - plays 1 Copper, 1 Silver
+Serf Bot - buys Urchin
+Serf Bot - gains Urchin
+Serf Bot - draws Copper, Copper, Procession, Copper, Urchin
+ 
+---------- ftl: turn 10 ----------
+ftl - plays Band of Misfits
+ftl - chooses Embargo
+ftl - plays Embargo
+ftl - embargoes Colony
+ftl - trashes Embargo
+ftl - plays 2 Copper
+ftl - buys Village
+ftl - gains Village
+ftl - draws Horse Traders, Village, Estate, Band of Misfits, Copper
+ 
+---------- Serf Bot: turn 10 ----------
+Serf Bot - plays Procession
+Serf Bot - plays Urchin
+ftl - reveals reaction Horse Traders
+Serf Bot - draws Copper
+Serf Bot - plays Urchin
+Serf Bot - draws Copper
+Serf Bot - trashes Urchin
+Serf Bot - gains Feast
+Serf Bot - plays 5 Copper
+Serf Bot - buys Band of Misfits
+Serf Bot - gains Band of Misfits
+Serf Bot - draws Copper, Urchin, Hermit, Urchin, Mining Village
+ 
+---------- ftl: turn 11 ----------
+ftl - duration Horse Traders
+ftl - draws Copper
+ftl - plays Village
+ftl - shuffles deck
+ftl - draws Village
+ftl - plays Village
+ftl - draws Horse Traders
+ftl - plays Band of Misfits
+ftl - chooses Treasure Map
+ftl - plays Treasure Map
+ftl - trashes Treasure Map
+ftl - plays Horse Traders
+ftl - discards Estate
+ftl - discards Copper
+ftl - plays Horse Traders
+ftl - discards Copper
+ftl - buys Band of Misfits
+ftl - gains Band of Misfits
+ftl - draws Copper, Village, Copper, Estate, Copper
+ 
+---------- Serf Bot: turn 11 ----------
+Serf Bot - plays Mining Village
+Serf Bot - shuffles deck
+Serf Bot - draws Silver
+Serf Bot - plays Urchin
+Serf Bot - draws Copper
+ftl - discards Estate
+Serf Bot - plays Urchin
+Serf Bot - trashes Urchin
+Serf Bot - gains Mercenary
+Serf Bot - draws Copper
+Serf Bot - plays Hermit
+Serf Bot - gains Silver
+Serf Bot - plays 3 Copper, 1 Silver
+Serf Bot - buys Horse Traders
+Serf Bot - gains Horse Traders
+Serf Bot - draws Estate, Mining Village, Procession, Copper, Treasure Map
+ 
+---------- ftl: turn 12 ----------
+ftl - plays Village
+ftl - draws Band of Misfits
+ftl - plays Band of Misfits
+ftl - chooses Hermit
+ftl - plays Hermit
+ftl - trashes Estate
+ftl - gains Village
+ftl - draws Copper, Village, Copper, Estate, Village
+ 
+---------- Serf Bot: turn 12 ----------
+Serf Bot - plays Mining Village
+Serf Bot - draws Feast
+Serf Bot - plays Procession
+Serf Bot - plays Feast
+Serf Bot - trashes Feast
+Serf Bot - gains Band of Misfits
+Serf Bot - plays Feast
+Serf Bot - trashes Feast
+Serf Bot - gains Band of Misfits
+Serf Bot - plays Treasure Map
+Serf Bot - trashes Treasure Map
+Serf Bot - plays 1 Copper
+Serf Bot - draws Band of Misfits, Copper, Copper, Band of Misfits, Copper
+ 
+---------- ftl: turn 13 ----------
+ftl - plays Village
+ftl - shuffles deck
+ftl - draws Copper
+ftl - plays Village
+ftl - draws Village
+ftl - plays Village
+ftl - draws Village
+ftl - plays Village
+ftl - draws Village
+ftl - plays Village
+ftl - draws Horse Traders
+ftl - plays Horse Traders
+ftl - discards Estate
+ftl - discards Copper
+ftl - plays 2 Copper
+ftl - buys Procession
+ftl - gains Procession
+ftl - draws Band of Misfits, Village, Estate, Copper, Band of Misfits
+ 
+---------- Serf Bot: turn 13 ----------
+Serf Bot - plays Band of Misfits
+Serf Bot - chooses Feast
+Serf Bot - plays Feast
+Serf Bot - trashes Feast
+Serf Bot - gains Procession
+Serf Bot - plays 3 Copper
+Serf Bot - buys Hermit
+Serf Bot - gains Hermit
+Serf Bot - draws Urchin
+Serf Bot - shuffles deck
+Serf Bot - draws Hermit, Mercenary, Procession, Mining Village
+ 
+---------- ftl: turn 14 ----------
+ftl - plays Village
+ftl - draws Horse Traders
+ftl - plays Band of Misfits
+ftl - chooses Urchin
+ftl - plays Urchin
+ftl - draws Copper
+Serf Bot - discards Mercenary
+ftl - plays Band of Misfits
+ftl - chooses Urchin
+ftl - plays Urchin
+ftl - trashes Urchin
+ftl - gains Mercenary
+ftl - draws Copper
+ftl - plays Horse Traders
+ftl - discards Estate
+ftl - discards Copper
+ftl - plays 2 Copper
+ftl - buys Procession
+ftl - gains Procession
+ftl - draws Copper
+ftl - shuffles deck
+ftl - draws Procession, Village, Copper, Village
+ 
+---------- Serf Bot: turn 14 ----------
+Serf Bot - plays Mining Village
+Serf Bot - draws Copper
+Serf Bot - plays Urchin
+Serf Bot - draws Silver
+ftl - discards Copper
+Serf Bot - plays Procession
+Serf Bot - plays Hermit
+Serf Bot - gains Village
+Serf Bot - plays Hermit
+Serf Bot - gains Village
+Serf Bot - trashes Hermit
+Serf Bot - gains Mining Village
+Serf Bot - plays 1 Copper, 1 Silver
+Serf Bot - buys Urchin
+Serf Bot - gains Urchin
+Serf Bot - draws Horse Traders, Band of Misfits, Urchin, Silver, Copper
+ 
+---------- ftl: turn 15 ----------
+ftl - plays Village
+ftl - draws Mercenary
+ftl - plays Procession
+ftl - plays Village
+ftl - draws Copper
+ftl - plays Village
+ftl - draws Horse Traders
+ftl - trashes Village
+ftl - gains Procession
+ftl - plays Mercenary
+Serf Bot - reveals reaction Horse Traders
+ftl - trashes Copper, Copper
+ftl - draws Estate, Village
+Serf Bot - discards Copper
+ftl - plays Village
+ftl - draws Procession
+ftl - plays Procession
+ftl - plays Horse Traders
+ftl - discards Estate
+ftl - plays Horse Traders
+ftl - trashes Horse Traders
+ftl - buys Procession
+ftl - gains Procession
+ftl - buys Procession
+ftl - gains Procession
+ftl - draws Village, Band of Misfits, Copper, Copper, Copper
+ 
+---------- Serf Bot: turn 15 ----------
+Serf Bot - duration Horse Traders
+Serf Bot - draws Procession
+Serf Bot - plays Procession
+Serf Bot - plays Urchin
+Serf Bot - draws Band of Misfits
+ftl - discards Copper
+Serf Bot - plays Urchin
+Serf Bot - draws Copper
+Serf Bot - trashes Urchin
+Serf Bot - gains Treasure Map
+Serf Bot - plays Band of Misfits
+Serf Bot - chooses Feast
+Serf Bot - plays Feast
+Serf Bot - trashes Feast
+Serf Bot - gains Duchy
+Serf Bot - plays Band of Misfits
+Serf Bot - chooses Feast
+Serf Bot - plays Feast
+Serf Bot - trashes Feast
+Serf Bot - gains Duchy
+Serf Bot - plays 1 Silver, 1 Copper
+Serf Bot - buys Hermit
+Serf Bot - gains Hermit
+Serf Bot - draws Estate, Mining Village, Hermit, Copper, Copper
+ 
+---------- ftl: turn 16 ----------
+ftl - plays Village
+ftl - draws Estate
+ftl - plays Band of Misfits
+ftl - chooses Village
+ftl - plays Village
+ftl - draws Village
+ftl - plays Village
+ftl - draws Village
+ftl - plays Village
+ftl - draws Horse Traders
+ftl - plays Horse Traders
+ftl - discards Estate
+ftl - discards Copper
+ftl - plays 1 Copper
+ftl - buys Procession
+ftl - gains Procession
+ftl - draws Copper
+ftl - shuffles deck
+ftl - draws Village, Mercenary, Procession, Procession
+ 
+---------- Serf Bot: turn 16 ----------
+Serf Bot - plays Mining Village
+Serf Bot - draws Copper
+Serf Bot - trashes Mining Village
+Serf Bot - plays Hermit
+Serf Bot - gains Village
+Serf Bot - plays 3 Copper
+Serf Bot - buys Feast
+Serf Bot - gains Feast
+Serf Bot - draws Band of Misfits, Copper
+Serf Bot - shuffles deck
+Serf Bot - draws Mercenary, Hermit, Duchy
+ 
+---------- ftl: turn 17 ----------
+ftl - plays Procession
+ftl - plays Procession
+ftl - plays Village
+ftl - draws Estate
+ftl - plays Village
+ftl - draws Procession
+ftl - trashes Village
+ftl - gains Procession
+ftl - plays Procession
+ftl - plays Procession
+ftl - plays Mercenary
+ftl - trashes Estate, Copper
+ftl - draws Estate, Village
+Serf Bot - discards Duchy
+Serf Bot - discards Mercenary
+ftl - plays Mercenary
+ftl - trashes Estate, Village
+ftl - draws Copper, Copper
+ftl - trashes Mercenary
+ftl - plays Procession
+ftl - trashes Procession
+ftl - trashes Procession
+ftl - plays 2 Copper
+ftl - buys Duchy
+ftl - gains Duchy
+ftl - draws Copper, Horse Traders, Village, Copper, Village
+ 
+---------- Serf Bot: turn 17 ----------
+Serf Bot - plays Band of Misfits
+Serf Bot - chooses Procession
+Serf Bot - plays Procession
+Serf Bot - plays Hermit
+Serf Bot - gains Hermit
+Serf Bot - plays Hermit
+Serf Bot - gains Urchin
+Serf Bot - trashes Hermit
+Serf Bot - gains Mining Village
+Serf Bot - plays 1 Copper
+Serf Bot - buys Copper
+Serf Bot - gains Copper
+Serf Bot - draws Village, Urchin, Estate, Mining Village, Copper
+ 
+---------- ftl: turn 18 ----------
+ftl - plays Village
+ftl - draws Village
+ftl - plays Village
+ftl - draws Procession
+ftl - plays Village
+ftl - draws Procession
+ftl - plays Procession
+ftl - plays Procession
+ftl - plays Horse Traders
+ftl - discards Copper
+ftl - discards Copper
+ftl - plays Horse Traders
+ftl - trashes Horse Traders
+ftl - plays Procession
+ftl - trashes Procession
+ftl - buys Duchy
+ftl - gains Duchy
+ftl - draws Procession, Band of Misfits
+ftl - shuffles deck
+ftl - draws Village, Copper, Copper
+ 
+---------- Serf Bot: turn 18 ----------
+Serf Bot - plays Mining Village
+Serf Bot - draws Horse Traders
+Serf Bot - trashes Mining Village
+Serf Bot - plays Village
+Serf Bot - draws Hermit
+Serf Bot - plays Urchin
+Serf Bot - draws Procession
+ftl - discards Copper
+Serf Bot - plays Procession
+Serf Bot - plays Hermit
+Serf Bot - gains Silver
+Serf Bot - plays Hermit
+Serf Bot - gains Silver
+Serf Bot - trashes Hermit
+Serf Bot - gains Procession
+Serf Bot - plays Horse Traders
+Serf Bot - discards Estate
+Serf Bot - discards Copper
+Serf Bot - buys Silver
+Serf Bot - gains Silver
+Serf Bot - buys Embargo
+Serf Bot - gains Embargo
+Serf Bot - draws Copper, Silver, Village, Urchin, Mining Village
+ 
+------------ Game Over ------------
+Serf Bot - cards: 3 Village, 3 Urchin, 3 Procession, 2 Mining Village, 1 Hermit, 1 Feast, 1 Mercenary, 1 Horse Traders, 1 Band of Misfits, 1 Treasure Map, 1 Embargo, 8 Copper, 5 Silver, 2 Duchy, 1 Estate
+Serf Bot - total victory points: 7
+Serf Bot - turns: 18
+ 
+ftl - cards: 4 Procession, 3 Village, 1 Band of Misfits, 4 Copper, 2 Duchy
+ftl - total victory points: 6
+ftl - turns: 18
+ 
+1st place: Serf Bot
+2nd place: ftl
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.50612a9b51c36e573294bfd0.1369771564268.txt b/testing/testdata/log.50612a9b51c36e573294bfd0.1369771564268.txt
new file mode 100644
index 0000000..126ec26
--- /dev/null
+++ b/testing/testdata/log.50612a9b51c36e573294bfd0.1369771564268.txt
@@ -0,0 +1,371 @@
+------------ Game Setup ------------
+Supply cards: Chapel, Village, Fortress, Mining Village, Procession, Throne Room, Band of Misfits, Adventurer, Forge, King's Court, Copper, Silver, Gold, Estate, Duchy, Province, Curse, Colony, Platinum
+Rating system: unrated
+ftl - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Serf Bot - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+ftl - shuffles deck
+Serf Bot - shuffles deck
+ftl - draws Copper, Copper, Estate, Copper, Copper
+Serf Bot - draws Copper, Estate, Estate, Copper, Copper
+ 
+---------- Serf Bot: turn 1 ----------
+Serf Bot - plays 3 Copper
+Serf Bot - buys Village
+Serf Bot - gains Village
+Serf Bot - draws Estate, Copper, Copper, Copper, Copper
+ 
+---------- ftl: turn 1 ----------
+ftl - plays 4 Copper
+ftl - buys Fortress
+ftl - gains Fortress
+ftl - draws Copper, Estate, Copper, Copper, Estate
+ 
+---------- Serf Bot: turn 2 ----------
+Serf Bot - plays 4 Copper
+Serf Bot - buys Procession
+Serf Bot - gains Procession
+Serf Bot - shuffles deck
+Serf Bot - draws Estate, Estate, Copper, Copper, Copper
+ 
+---------- ftl: turn 2 ----------
+ftl - plays 3 Copper
+ftl - buys Chapel
+ftl - gains Chapel
+ftl - shuffles deck
+ftl - draws Estate, Copper, Copper, Copper, Copper
+ 
+---------- Serf Bot: turn 3 ----------
+Serf Bot - plays 3 Copper
+Serf Bot - buys Village
+Serf Bot - gains Village
+Serf Bot - draws Copper, Copper, Copper, Procession, Village
+ 
+---------- ftl: turn 3 ----------
+ftl - plays 4 Copper
+ftl - buys Procession
+ftl - gains Procession
+ftl - draws Chapel, Copper, Estate, Copper, Fortress
+ 
+---------- Serf Bot: turn 4 ----------
+Serf Bot - plays Procession
+Serf Bot - plays Village
+Serf Bot - draws Estate
+Serf Bot - plays Village
+Serf Bot - draws Copper
+Serf Bot - trashes Village
+Serf Bot - gains Mining Village
+Serf Bot - plays 4 Copper
+Serf Bot - buys Fortress
+Serf Bot - gains Fortress
+Serf Bot - shuffles deck
+Serf Bot - draws Village, Copper, Copper, Copper, Estate
+ 
+---------- ftl: turn 4 ----------
+ftl - plays Fortress
+ftl - draws Copper
+ftl - plays Chapel
+ftl - trashes Copper, Estate, Copper, Copper
+ftl - draws Estate
+ftl - shuffles deck
+ftl - draws Fortress, Copper, Copper, Copper
+ 
+---------- Serf Bot: turn 5 ----------
+Serf Bot - plays Village
+Serf Bot - draws Copper
+Serf Bot - plays 4 Copper
+Serf Bot - buys Fortress
+Serf Bot - gains Fortress
+Serf Bot - draws Mining Village, Estate, Copper, Copper, Fortress
+ 
+---------- ftl: turn 5 ----------
+ftl - plays Fortress
+ftl - draws Estate
+ftl - plays 3 Copper
+ftl - buys Silver
+ftl - gains Silver
+ftl - draws Copper, Chapel, Procession
+ftl - shuffles deck
+ftl - draws Estate, Fortress
+ 
+---------- Serf Bot: turn 6 ----------
+Serf Bot - plays Mining Village
+Serf Bot - draws Copper
+Serf Bot - plays Fortress
+Serf Bot - draws Procession
+Serf Bot - plays 3 Copper
+Serf Bot - buys Village
+Serf Bot - gains Village
+Serf Bot - draws Estate
+Serf Bot - shuffles deck
+Serf Bot - draws Copper, Procession, Estate, Copper
+ 
+---------- ftl: turn 6 ----------
+ftl - plays Procession
+ftl - plays Fortress
+ftl - draws Silver
+ftl - plays Fortress
+ftl - draws Copper
+ftl - trashes Fortress
+ftl - gains Band of Misfits
+ftl - plays Fortress
+ftl - draws Copper
+ftl - plays Chapel
+ftl - trashes Copper, Estate, Copper, Copper
+ftl - draws Copper, Estate
+ftl - shuffles deck
+ftl - draws Chapel, Silver, Procession
+ 
+---------- Serf Bot: turn 7 ----------
+Serf Bot - plays 2 Copper
+Serf Bot - buys Chapel
+Serf Bot - gains Chapel
+Serf Bot - draws Mining Village, Village, Copper, Estate, Fortress
+ 
+---------- ftl: turn 7 ----------
+ftl - plays Procession
+ftl - plays Chapel
+ftl - trashes Copper, Estate, Silver
+ftl - plays Chapel
+ftl - trashes Chapel
+ftl - gains Village
+ftl - draws Fortress, Band of Misfits
+ftl - shuffles deck
+ftl - draws Procession, Village
+ 
+---------- Serf Bot: turn 8 ----------
+Serf Bot - plays Mining Village
+Serf Bot - draws Copper
+Serf Bot - plays Fortress
+Serf Bot - draws Village
+Serf Bot - plays Village
+Serf Bot - draws Copper
+Serf Bot - plays Village
+Serf Bot - draws Copper
+Serf Bot - plays 4 Copper
+Serf Bot - buys Fortress
+Serf Bot - gains Fortress
+Serf Bot - draws Fortress, Copper
+Serf Bot - shuffles deck
+Serf Bot - draws Estate, Fortress, Estate
+ 
+---------- ftl: turn 8 ----------
+ftl - plays Procession
+ftl - plays Village
+ftl - plays Village
+ftl - trashes Village
+ftl - gains Procession
+ftl - plays Fortress
+ftl - shuffles deck
+ftl - draws Procession
+ftl - plays Procession
+ftl - plays Band of Misfits
+ftl - chooses Mining Village
+ftl - plays Mining Village
+ftl - plays Mining Village
+ftl - trashes Mining Village
+ftl - gains Adventurer
+ftl - buys Chapel
+ftl - gains Chapel
+ftl - shuffles deck
+ftl - draws Adventurer, Chapel, Fortress, Procession, Procession
+ 
+---------- Serf Bot: turn 9 ----------
+Serf Bot - plays Fortress
+Serf Bot - draws Chapel
+Serf Bot - plays Fortress
+Serf Bot - draws Fortress
+Serf Bot - plays Fortress
+Serf Bot - draws Estate
+Serf Bot - plays Chapel
+Serf Bot - trashes Estate, Estate, Estate, Copper
+Serf Bot - draws Mining Village, Copper, Copper, Procession, Village
+ 
+---------- ftl: turn 9 ----------
+ftl - plays Procession
+ftl - plays Procession
+ftl - plays Fortress
+ftl - plays Fortress
+ftl - trashes Fortress
+ftl - gains Band of Misfits
+ftl - plays Procession
+ftl - plays Adventurer
+ftl - shuffles deck
+ftl - reveals Band of Misfits
+ftl - discards Band of Misfits
+ftl - plays Adventurer
+ftl - shuffles deck
+ftl - reveals Band of Misfits
+ftl - discards Band of Misfits
+ftl - trashes Adventurer
+ftl - gains King's Court
+ftl - trashes Procession
+ftl - gains Band of Misfits
+ftl - plays Fortress
+ftl - shuffles deck
+ftl - draws King's Court
+ftl - plays King's Court
+ftl - plays Chapel
+ftl - plays Chapel
+ftl - plays Chapel
+ftl - draws Band of Misfits, Band of Misfits
+ftl - shuffles deck
+ftl - draws King's Court, Procession, Chapel
+ 
+---------- Serf Bot: turn 10 ----------
+Serf Bot - plays Procession
+Serf Bot - plays Mining Village
+Serf Bot - draws Copper
+Serf Bot - plays Mining Village
+Serf Bot - draws Copper
+Serf Bot - trashes Mining Village
+Serf Bot - gains Band of Misfits
+Serf Bot - plays Village
+Serf Bot - draws Village
+Serf Bot - plays Village
+Serf Bot - draws Copper
+Serf Bot - plays 5 Copper
+Serf Bot - buys Band of Misfits
+Serf Bot - gains Band of Misfits
+Serf Bot - draws Copper
+Serf Bot - shuffles deck
+Serf Bot - draws Copper, Village, Fortress, Band of Misfits
+ 
+---------- ftl: turn 10 ----------
+ftl - plays King's Court
+ftl - plays Band of Misfits
+ftl - chooses Mining Village
+ftl - plays Mining Village
+ftl - draws Fortress
+ftl - plays Mining Village
+ftl - trashes Mining Village
+ftl - plays Band of Misfits
+ftl - plays Mining Village
+ftl - plays Procession
+ftl - plays Fortress
+ftl - plays Fortress
+ftl - trashes Fortress
+ftl - gains Band of Misfits
+ftl - plays Fortress
+ftl - shuffles deck
+ftl - draws Band of Misfits
+ftl - plays Band of Misfits
+ftl - chooses Throne Room
+ftl - plays Throne Room
+ftl - plays Band of Misfits
+ftl - chooses Mining Village
+ftl - plays Mining Village
+ftl - trashes Mining Village
+ftl - plays Band of Misfits
+ftl - plays Mining Village
+ftl - plays Chapel
+ftl - buys Fortress
+ftl - gains Fortress
+ftl - shuffles deck
+ftl - draws King's Court, Band of Misfits, Chapel, Fortress, Procession
+ 
+---------- Serf Bot: turn 11 ----------
+Serf Bot - plays Fortress
+Serf Bot - draws Procession
+Serf Bot - plays Village
+Serf Bot - draws Band of Misfits
+Serf Bot - plays Procession
+Serf Bot - plays Band of Misfits
+Serf Bot - chooses Throne Room
+Serf Bot - plays Throne Room
+Serf Bot - plays Band of Misfits
+Serf Bot - chooses Mining Village
+Serf Bot - plays Mining Village
+Serf Bot - draws Fortress
+Serf Bot - plays Mining Village
+Serf Bot - draws Chapel
+Serf Bot - plays Throne Room
+Serf Bot - plays Fortress
+Serf Bot - draws Copper
+Serf Bot - plays Fortress
+Serf Bot - draws Fortress
+Serf Bot - trashes Throne Room
+Serf Bot - gains Adventurer
+Serf Bot - plays Fortress
+Serf Bot - draws Copper
+Serf Bot - plays Chapel
+Serf Bot - trashes Copper, Copper
+Serf Bot - plays 2 Copper
+Serf Bot - buys Chapel
+Serf Bot - gains Chapel
+Serf Bot - draws Village, Copper, Copper
+Serf Bot - shuffles deck
+Serf Bot - draws Copper, Procession
+ 
+---------- ftl: turn 11 ----------
+ftl - plays King's Court
+ftl - plays Procession
+ftl - plays Band of Misfits
+ftl - chooses Mining Village
+ftl - plays Mining Village
+ftl - draws Fortress
+ftl - trashes Mining Village
+ftl - plays Band of Misfits
+ftl - plays Mining Village
+ftl - gains Adventurer
+ftl - plays Procession
+ftl - plays Fortress
+ftl - shuffles deck
+ftl - draws Adventurer
+ftl - plays Fortress
+ftl - trashes Fortress
+ftl - gains Band of Misfits
+ftl - plays Procession
+ftl - plays Adventurer
+ftl - shuffles deck
+ftl - reveals Band of Misfits
+ftl - discards Band of Misfits
+ftl - plays Adventurer
+ftl - shuffles deck
+ftl - reveals Band of Misfits
+ftl - discards Band of Misfits
+ftl - trashes Adventurer
+ftl - gains Forge
+ftl - plays Fortress
+ftl - shuffles deck
+ftl - draws Band of Misfits
+ftl - plays Fortress
+ftl - draws Forge
+ftl - plays Band of Misfits
+ftl - chooses Mining Village
+ftl - plays Mining Village
+ftl - trashes Mining Village
+ftl - shuffles deck
+ftl - draws Chapel, Fortress, Fortress, Procession, Forge
+ 
+---------- Serf Bot: turn 12 ----------
+Serf Bot - plays Procession
+Serf Bot - plays Village
+Serf Bot - draws Chapel
+Serf Bot - plays Village
+Serf Bot - draws Fortress
+Serf Bot - trashes Village
+Serf Bot - gains Procession
+Serf Bot - plays Fortress
+Serf Bot - draws Chapel
+Serf Bot - plays Chapel
+Serf Bot - plays Chapel
+Serf Bot - plays 3 Copper
+Serf Bot - buys Village
+Serf Bot - gains Village
+Serf Bot - draws Fortress, Adventurer, Fortress, Village, Copper
+ 
+---------- ftl: turn 12 ----------
+ 
+------------ Game Over ------------
+Serf Bot - cards: 3 Fortress, 2 Village, 2 Procession, 2 Chapel, 1 Adventurer, 1 Band of Misfits, 4 Copper
+Serf Bot - total victory points: 0
+Serf Bot - turns: 12
+ 
+ftl - resigned
+ftl - cards: 2 Fortress, 1 Chapel, 1 Procession, 1 Forge, 1 King's Court
+ftl - total victory points: 0
+ftl - turns: 11
+ 
+1st place: Serf Bot
+2nd place: ftl
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.50612a9b51c36e573294bfd0.1369774866910.txt b/testing/testdata/log.50612a9b51c36e573294bfd0.1369774866910.txt
new file mode 100644
index 0000000..eecd363
--- /dev/null
+++ b/testing/testdata/log.50612a9b51c36e573294bfd0.1369774866910.txt
@@ -0,0 +1,217 @@
+------------ Game Setup ------------
+Supply cards: Chapel, Village, Fortress, Mining Village, Procession, Throne Room, Band of Misfits, Adventurer, Forge, King's Court, Copper, Silver, Gold, Estate, Duchy, Province, Curse, Colony, Platinum
+Rating system: unrated
+ftl - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Serf Bot - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+ftl - shuffles deck
+Serf Bot - shuffles deck
+ftl - draws Copper, Estate, Copper, Estate, Copper
+Serf Bot - draws Copper, Copper, Copper, Estate, Estate
+ 
+---------- ftl: turn 1 ----------
+ftl - plays 3 Copper
+ftl - buys Chapel
+ftl - gains Chapel
+ftl - draws Copper, Copper, Estate, Copper, Copper
+ 
+---------- Serf Bot: turn 1 ----------
+Serf Bot - plays 3 Copper
+Serf Bot - buys Silver
+Serf Bot - gains Silver
+Serf Bot - draws Copper, Copper, Copper, Copper, Estate
+ 
+---------- ftl: turn 2 ----------
+ftl - plays 4 Copper
+ftl - buys Procession
+ftl - gains Procession
+ftl - shuffles deck
+ftl - draws Estate, Chapel, Copper, Copper, Procession
+ 
+---------- Serf Bot: turn 2 ----------
+Serf Bot - plays 4 Copper
+Serf Bot - buys Procession
+Serf Bot - gains Procession
+Serf Bot - shuffles deck
+Serf Bot - draws Silver, Estate, Copper, Copper, Estate
+ 
+---------- ftl: turn 3 ----------
+ftl - plays Procession
+ftl - plays Chapel
+ftl - trashes Estate, Copper, Copper
+ftl - plays Chapel
+ftl - trashes Chapel
+ftl - gains Village
+ftl - draws Copper, Copper, Copper, Copper, Copper
+ 
+---------- Serf Bot: turn 3 ----------
+Serf Bot - plays 2 Copper, 1 Silver
+Serf Bot - buys Throne Room
+Serf Bot - gains Throne Room
+Serf Bot - draws Copper, Copper, Copper, Copper, Estate
+ 
+---------- ftl: turn 4 ----------
+ftl - plays 5 Copper
+ftl - buys Band of Misfits
+ftl - gains Band of Misfits
+ftl - draws Estate, Estate
+ftl - shuffles deck
+ftl - draws Copper, Band of Misfits, Copper
+ 
+---------- Serf Bot: turn 4 ----------
+Serf Bot - plays 4 Copper
+Serf Bot - buys Mining Village
+Serf Bot - gains Mining Village
+Serf Bot - draws Copper, Procession
+Serf Bot - shuffles deck
+Serf Bot - draws Copper, Silver, Copper
+ 
+---------- ftl: turn 5 ----------
+ftl - plays Band of Misfits
+ftl - chooses Chapel
+ftl - plays Chapel
+ftl - trashes Estate, Estate, Copper, Copper
+ftl - draws Procession, Copper, Copper, Village, Copper
+ 
+---------- Serf Bot: turn 5 ----------
+Serf Bot - plays 3 Copper, 1 Silver
+Serf Bot - buys Band of Misfits
+Serf Bot - gains Band of Misfits
+Serf Bot - draws Estate, Mining Village, Copper, Copper, Copper
+ 
+---------- ftl: turn 6 ----------
+ftl - plays Procession
+ftl - plays Village
+ftl - shuffles deck
+ftl - draws Band of Misfits
+ftl - plays Village
+ftl - trashes Village
+ftl - gains Mining Village
+ftl - plays Band of Misfits
+ftl - chooses Mining Village
+ftl - plays Mining Village
+ftl - shuffles deck
+ftl - draws Mining Village
+ftl - plays 3 Copper
+ftl - buys Silver
+ftl - gains Silver
+ftl - shuffles deck
+ftl - draws Mining Village, Copper, Band of Misfits, Procession, Copper
+ 
+---------- Serf Bot: turn 6 ----------
+Serf Bot - plays Mining Village
+Serf Bot - draws Estate
+Serf Bot - plays 3 Copper
+Serf Bot - buys Silver
+Serf Bot - gains Silver
+Serf Bot - draws Throne Room, Estate, Copper
+Serf Bot - shuffles deck
+Serf Bot - draws Copper, Estate
+ 
+---------- ftl: turn 7 ----------
+ftl - plays Mining Village
+ftl - draws Silver
+ftl - plays Band of Misfits
+ftl - chooses Chapel
+ftl - plays Chapel
+ftl - trashes Copper
+ftl - plays 1 Copper, 1 Silver
+ftl - buys Silver
+ftl - gains Silver
+ftl - draws Copper
+ftl - shuffles deck
+ftl - draws Silver, Mining Village, Silver, Band of Misfits
+ 
+---------- Serf Bot: turn 7 ----------
+Serf Bot - plays 2 Copper
+Serf Bot - buys Chapel
+Serf Bot - gains Chapel
+Serf Bot - draws Silver, Copper, Copper, Band of Misfits, Silver
+ 
+---------- ftl: turn 8 ----------
+ftl - plays Mining Village
+ftl - draws Procession
+ftl - plays Band of Misfits
+ftl - chooses Chapel
+ftl - plays Chapel
+ftl - trashes Copper
+ftl - plays 2 Silver
+ftl - buys Fortress
+ftl - gains Fortress
+ftl - draws Copper
+ftl - shuffles deck
+ftl - draws Silver, Fortress, Silver, Procession
+ 
+---------- Serf Bot: turn 8 ----------
+Serf Bot - plays Band of Misfits
+Serf Bot - chooses Mining Village
+Serf Bot - plays Mining Village
+Serf Bot - draws Copper
+Serf Bot - plays 3 Copper, 2 Silver
+Serf Bot - buys King's Court
+Serf Bot - gains King's Court
+Serf Bot - draws Estate, Copper, Copper, Mining Village, Procession
+ 
+---------- ftl: turn 9 ----------
+ftl - plays Procession
+ftl - plays Fortress
+ftl - draws Mining Village
+ftl - plays Fortress
+ftl - draws Band of Misfits
+ftl - trashes Fortress
+ftl - gains Band of Misfits
+ftl - plays Band of Misfits
+ftl - chooses Procession
+ftl - plays Procession
+ftl - plays Fortress
+ftl - shuffles deck
+ftl - draws Band of Misfits
+ftl - plays Fortress
+ftl - trashes Fortress
+ftl - gains Band of Misfits
+ftl - plays Fortress
+ftl - shuffles deck
+ftl - draws Band of Misfits
+ftl - plays Band of Misfits
+ftl - chooses Throne Room
+ftl - plays Throne Room
+ftl - plays Band of Misfits
+ftl - chooses Mining Village
+ftl - plays Mining Village
+ftl - plays Mining Village
+ftl - trashes Mining Village
+ftl - plays Mining Village
+ftl - trashes Mining Village
+ftl - plays 2 Silver, 1 Copper
+ftl - buys King's Court
+ftl - gains King's Court
+ftl - shuffles deck
+ftl - draws Silver, Copper, Band of Misfits, Fortress, King's Court
+ 
+---------- Serf Bot: turn 9 ----------
+Serf Bot - plays Procession
+Serf Bot - plays Mining Village
+Serf Bot - shuffles deck
+Serf Bot - draws Chapel
+Serf Bot - plays Mining Village
+Serf Bot - draws Copper
+Serf Bot - trashes Mining Village
+Serf Bot - gains Band of Misfits
+Serf Bot - plays Chapel
+Serf Bot - trashes Copper, Copper, Copper, Estate
+Serf Bot - draws Estate, Copper, Copper, Estate, Copper
+ 
+---------- ftl: turn 10 ----------
+ 
+------------ Game Over ------------
+Serf Bot - cards: 2 Band of Misfits, 1 Procession, 1 Chapel, 1 Throne Room, 1 King's Court, 4 Copper, 2 Silver, 2 Estate
+Serf Bot - total victory points: 2
+Serf Bot - turns: 9
+ 
+ftl - resigned
+ftl - cards: 2 Band of Misfits, 1 Fortress, 1 King's Court, 1 Procession, 2 Silver, 1 Copper
+ftl - total victory points: 0
+ftl - turns: 9
+ 
+1st place: Serf Bot
+2nd place: ftl
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.50612a9b51c36e573294bfd0.1369810215227.txt b/testing/testdata/log.50612a9b51c36e573294bfd0.1369810215227.txt
new file mode 100644
index 0000000..ff313bc
--- /dev/null
+++ b/testing/testdata/log.50612a9b51c36e573294bfd0.1369810215227.txt
@@ -0,0 +1,667 @@
+------------ Game Setup ------------
+Supply cards: Chapel, Crossroads, Conspirator, Ironmonger, Ironworks, Island, Tournament, Inn, Market, Nobles, Copper, Silver, Gold, Estate, Duchy, Province, Curse, Colony, Platinum
+Rating system: unrated
+ftl - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Serf Bot - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+ftl - shuffles deck
+Serf Bot - shuffles deck
+ftl - draws Estate, Estate, Copper, Copper, Copper
+Serf Bot - draws Copper, Copper, Estate, Copper, Copper
+ 
+---------- Serf Bot: turn 1 ----------
+Serf Bot - plays 4 Copper
+Serf Bot - buys Ironworks
+Serf Bot - gains Ironworks
+Serf Bot - draws Copper, Copper, Copper, Estate, Estate
+ 
+---------- ftl: turn 1 ----------
+ftl - plays 3 Copper
+ftl - buys Chapel
+ftl - gains Chapel
+ftl - draws Copper, Estate, Copper, Copper, Copper
+ 
+---------- Serf Bot: turn 2 ----------
+Serf Bot - plays 3 Copper
+Serf Bot - buys Silver
+Serf Bot - gains Silver
+Serf Bot - shuffles deck
+Serf Bot - draws Copper, Silver, Estate, Estate, Ironworks
+ 
+---------- ftl: turn 2 ----------
+ftl - plays 4 Copper
+ftl - buys Ironworks
+ftl - gains Ironworks
+ftl - shuffles deck
+ftl - draws Copper, Copper, Chapel, Ironworks, Copper
+ 
+---------- Serf Bot: turn 3 ----------
+Serf Bot - plays Ironworks
+Serf Bot - gains Ironmonger
+Serf Bot - plays 1 Copper, 1 Silver
+Serf Bot - buys Silver
+Serf Bot - gains Silver
+Serf Bot - draws Copper, Copper, Copper, Estate, Copper
+ 
+---------- ftl: turn 3 ----------
+ftl - plays Ironworks
+ftl - gains Tournament
+ftl - plays Chapel
+ftl - trashes Copper, Copper, Copper
+ftl - draws Copper, Copper, Estate, Estate, Estate
+ 
+---------- Serf Bot: turn 4 ----------
+Serf Bot - plays 4 Copper
+Serf Bot - buys Conspirator
+Serf Bot - gains Conspirator
+Serf Bot - draws Copper, Copper
+Serf Bot - shuffles deck
+Serf Bot - draws Ironworks, Silver, Copper
+ 
+---------- ftl: turn 4 ----------
+ftl - draws Copper, Copper
+ftl - shuffles deck
+ftl - draws Chapel, Copper, Estate
+ 
+---------- Serf Bot: turn 5 ----------
+Serf Bot - plays Ironworks
+Serf Bot - gains Conspirator
+Serf Bot - plays 3 Copper, 1 Silver
+Serf Bot - buys Inn
+Serf Bot - gains Inn
+Serf Bot - places Conspirator, Inn on top of deck
+Serf Bot - shuffles deck
+Serf Bot - draws Estate, Conspirator, Silver, Ironmonger, Estate
+ 
+---------- ftl: turn 5 ----------
+ftl - plays Chapel
+ftl - trashes Copper, Copper, Estate, Copper
+ftl - draws Tournament, Estate, Copper, Ironworks, Estate
+ 
+---------- Serf Bot: turn 6 ----------
+Serf Bot - plays Ironmonger
+Serf Bot - draws Estate
+Serf Bot - reveals: Conspirator
+Serf Bot - discards Conspirator
+Serf Bot - plays Conspirator
+Serf Bot - plays 1 Silver
+Serf Bot - buys Conspirator
+Serf Bot - gains Conspirator
+Serf Bot - draws Copper, Copper, Copper, Copper, Inn
+ 
+---------- ftl: turn 6 ----------
+ftl - plays Tournament
+ftl - shuffles deck
+ftl - draws Chapel
+ftl - plays Ironworks
+ftl - gains Conspirator
+ftl - plays Chapel
+ftl - trashes Estate, Copper, Estate
+ftl - shuffles deck
+ftl - draws Conspirator, Tournament, Chapel, Ironworks
+ 
+---------- Serf Bot: turn 7 ----------
+Serf Bot - plays Inn
+Serf Bot - shuffles deck
+Serf Bot - draws Ironworks, Conspirator
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+Serf Bot - plays Ironworks
+Serf Bot - gains Tournament
+Serf Bot - plays Conspirator
+Serf Bot - draws Conspirator
+Serf Bot - plays Conspirator
+Serf Bot - draws Conspirator
+Serf Bot - plays Conspirator
+Serf Bot - draws Estate
+Serf Bot - plays 2 Copper
+Serf Bot - buys Province
+Serf Bot - gains Province
+Serf Bot - draws Estate, Silver, Estate, Copper, Ironmonger
+ 
+---------- ftl: turn 7 ----------
+ftl - plays Tournament
+ftl - plays Ironworks
+ftl - gains Ironmonger
+ftl - plays Conspirator
+ftl - shuffles deck
+ftl - draws Ironmonger
+ftl - plays Ironmonger
+ftl - plays Chapel
+ftl - buys Crossroads
+ftl - gains Crossroads
+ftl - shuffles deck
+ftl - draws Crossroads, Ironworks, Chapel, Tournament, Conspirator
+ 
+---------- Serf Bot: turn 8 ----------
+Serf Bot - plays Ironmonger
+Serf Bot - draws Copper
+Serf Bot - reveals: Silver
+Serf Bot - places Silver on top of deck
+Serf Bot - plays 2 Copper, 1 Silver
+Serf Bot - buys Market
+Serf Bot - gains Market
+Serf Bot - draws Silver, Copper
+Serf Bot - shuffles deck
+Serf Bot - draws Market, Ironworks, Copper
+ 
+---------- ftl: turn 8 ----------
+ftl - plays Crossroads
+ftl - reveals hand: Ironworks, Chapel, Tournament, Conspirator
+ftl - plays Ironworks
+ftl - gains Conspirator
+ftl - plays Tournament
+ftl - draws Ironmonger
+ftl - plays Ironmonger
+ftl - shuffles deck
+ftl - draws Conspirator
+ftl - plays Conspirator
+ftl - plays Conspirator
+ftl - plays Chapel
+ftl - buys Market
+ftl - gains Market
+ftl - shuffles deck
+ftl - draws Chapel, Ironworks, Tournament, Conspirator, Market
+ 
+---------- Serf Bot: turn 9 ----------
+Serf Bot - plays Market
+Serf Bot - draws Estate
+Serf Bot - plays Ironworks
+Serf Bot - gains Conspirator
+Serf Bot - plays 2 Copper, 1 Silver
+Serf Bot - buys Inn
+Serf Bot - gains Inn
+Serf Bot - places Conspirator, Inn on top of deck
+Serf Bot - shuffles deck
+Serf Bot - buys Copper
+Serf Bot - gains Copper
+Serf Bot - draws Copper, Conspirator, Silver, Conspirator, Copper
+ 
+---------- ftl: turn 9 ----------
+ftl - plays Tournament
+ftl - draws Ironmonger
+ftl - plays Market
+ftl - draws Conspirator
+ftl - plays Ironmonger
+ftl - draws Crossroads
+ftl - plays Crossroads
+ftl - reveals hand: Chapel, Ironworks, Conspirator, Conspirator
+ftl - plays Conspirator
+ftl - plays Conspirator
+ftl - plays Ironworks
+ftl - gains Conspirator
+ftl - plays Chapel
+ftl - buys Conspirator
+ftl - gains Conspirator
+ftl - buys Crossroads
+ftl - gains Crossroads
+ftl - shuffles deck
+ftl - draws Chapel, Crossroads, Conspirator, Conspirator, Market
+ 
+---------- Serf Bot: turn 10 ----------
+Serf Bot - plays Conspirator
+Serf Bot - plays 2 Copper, 1 Silver
+Serf Bot - buys Gold
+Serf Bot - gains Gold
+Serf Bot - draws Inn, Tournament, Copper, Estate, Province
+ 
+---------- ftl: turn 10 ----------
+ftl - plays Market
+ftl - draws Crossroads
+ftl - plays Crossroads
+ftl - reveals hand: Chapel, Crossroads, Conspirator, Conspirator
+ftl - plays Crossroads
+ftl - reveals hand: Chapel, Conspirator, Conspirator
+ftl - plays Conspirator
+ftl - draws Ironworks
+ftl - plays Conspirator
+ftl - draws Tournament
+ftl - plays Ironworks
+ftl - gains Conspirator
+ftl - plays Tournament
+Serf Bot - reveals Province
+ftl - plays Chapel
+ftl - buys Market
+ftl - gains Market
+ftl - draws Conspirator, Conspirator, Ironmonger
+ftl - shuffles deck
+ftl - draws Chapel, Crossroads
+ 
+---------- Serf Bot: turn 11 ----------
+Serf Bot - plays Inn
+Serf Bot - draws Estate, Copper
+Serf Bot - discards Province
+Serf Bot - discards Estate
+Serf Bot - plays Tournament
+Serf Bot - draws Copper
+Serf Bot - plays 3 Copper
+Serf Bot - buys Ironmonger
+Serf Bot - gains Ironmonger
+Serf Bot - draws Inn, Conspirator, Ironmonger, Conspirator
+Serf Bot - shuffles deck
+Serf Bot - draws Conspirator
+ 
+---------- ftl: turn 11 ----------
+ftl - plays Ironmonger
+ftl - draws Crossroads
+ftl - reveals: Market
+ftl - places Market on top of deck
+ftl - plays Crossroads
+ftl - reveals hand: Conspirator, Conspirator, Chapel, Crossroads
+ftl - plays Crossroads
+ftl - reveals hand: Conspirator, Conspirator, Chapel
+ftl - plays Conspirator
+ftl - draws Market
+ftl - plays Conspirator
+ftl - draws Tournament
+ftl - plays Market
+ftl - draws Market
+ftl - plays Market
+ftl - draws Conspirator
+ftl - plays Tournament
+ftl - draws Conspirator
+ftl - plays Conspirator
+ftl - draws Conspirator
+ftl - plays Conspirator
+ftl - draws Ironworks
+ftl - plays Ironworks
+ftl - gains Conspirator
+ftl - plays Conspirator
+ftl - shuffles deck
+ftl - draws Conspirator
+ftl - plays Conspirator
+ftl - plays Chapel
+ftl - buys Province
+ftl - gains Province
+ftl - buys Tournament
+ftl - gains Tournament
+ftl - shuffles deck
+ftl - draws Conspirator, Conspirator, Conspirator, Ironmonger, Conspirator
+ 
+---------- Serf Bot: turn 12 ----------
+Serf Bot - plays Inn
+Serf Bot - draws Market, Silver
+Serf Bot - discards Conspirator
+Serf Bot - discards Silver
+Serf Bot - plays Market
+Serf Bot - draws Copper
+Serf Bot - plays Conspirator
+Serf Bot - draws Ironmonger
+Serf Bot - plays Conspirator
+Serf Bot - draws Ironworks
+Serf Bot - plays Ironworks
+Serf Bot - gains Ironmonger
+Serf Bot - plays Ironmonger
+Serf Bot - draws Copper
+Serf Bot - reveals: Copper
+Serf Bot - places Copper on top of deck
+Serf Bot - plays Ironmonger
+Serf Bot - draws Copper
+Serf Bot - reveals: Estate
+Serf Bot - places Estate on top of deck
+Serf Bot - draws Estate
+Serf Bot - plays 3 Copper
+Serf Bot - buys Gold
+Serf Bot - gains Gold
+Serf Bot - buys Silver
+Serf Bot - gains Silver
+Serf Bot - draws Inn, Estate, Province, Gold, Estate
+ 
+---------- ftl: turn 12 ----------
+ftl - plays Ironmonger
+ftl - draws Province
+ftl - reveals: Market
+ftl - places Market on top of deck
+ftl - plays Conspirator
+ftl - plays Conspirator
+ftl - draws Market
+ftl - plays Market
+ftl - draws Conspirator
+ftl - plays Conspirator
+ftl - draws Tournament
+ftl - plays Conspirator
+ftl - draws Tournament
+ftl - plays Tournament
+ftl - reveals Province
+Serf Bot - reveals Province
+ftl - discards Province
+ftl - gains Trusty Steed
+ftl - plays Conspirator
+ftl - draws Trusty Steed
+ftl - plays Trusty Steed
+ftl - takes 2 actions
+ftl - draws Chapel, Crossroads
+ftl - plays Crossroads
+ftl - reveals hand: Tournament, Chapel
+ftl - plays Tournament
+Serf Bot - reveals Province
+ftl - plays Chapel
+ftl - buys Nobles
+ftl - gains Nobles
+ftl - buys Market
+ftl - gains Market
+ftl - draws Market, Ironworks, Crossroads, Conspirator
+ftl - shuffles deck
+ftl - draws Conspirator
+ 
+---------- Serf Bot: turn 13 ----------
+Serf Bot - plays Inn
+Serf Bot - draws Copper, Copper
+Serf Bot - discards Province
+Serf Bot - discards Estate
+Serf Bot - plays 2 Copper, 1 Gold
+Serf Bot - buys Market
+Serf Bot - gains Market
+Serf Bot - draws Copper, Copper, Conspirator, Tournament, Copper
+ 
+---------- ftl: turn 13 ----------
+ftl - plays Crossroads
+ftl - reveals hand: Market, Ironworks, Conspirator, Conspirator
+ftl - plays Conspirator
+ftl - plays Conspirator
+ftl - draws Market
+ftl - plays Market
+ftl - draws Conspirator
+ftl - plays Market
+ftl - draws Conspirator
+ftl - plays Conspirator
+ftl - draws Province
+ftl - plays Conspirator
+ftl - draws Market
+ftl - plays Market
+ftl - draws Nobles
+ftl - plays Nobles
+ftl - draws Tournament, Crossroads, Conspirator
+ftl - plays Tournament
+ftl - reveals Province
+ftl - discards Province
+ftl - gains Diadem
+ftl - draws Diadem
+ftl - plays Conspirator
+ftl - draws Trusty Steed
+ftl - plays Trusty Steed
+ftl - takes 2 actions
+ftl - draws Chapel, Tournament
+ftl - plays Crossroads
+ftl - reveals hand: Ironworks, Diadem, Chapel, Tournament
+ftl - plays Ironworks
+ftl - gains Island
+ftl - draws Ironmonger
+ftl - plays Ironmonger
+ftl - draws Conspirator
+ftl - shuffles deck
+ftl - reveals: Province
+ftl - places Province on top of deck
+ftl - draws Province
+ftl - plays Tournament
+ftl - reveals Province
+ftl - discards Province
+ftl - gains Followers
+ftl - draws Followers
+ftl - plays Conspirator
+ftl - draws Island
+ftl - plays Followers
+ftl - shuffles deck
+ftl - draws Province
+ftl - gains Estate
+Serf Bot - gains Curse
+Serf Bot - discards Tournament
+Serf Bot - discards Copper
+ftl - plays 1 Diadem
+ftl - buys Nobles
+ftl - gains Nobles
+ftl - buys Nobles
+ftl - gains Nobles
+ftl - buys Nobles
+ftl - gains Nobles
+ftl - shuffles deck
+ftl - draws Conspirator, Nobles, Diadem, Conspirator, Crossroads
+ 
+---------- Serf Bot: turn 14 ----------
+Serf Bot - plays Conspirator
+Serf Bot - plays 2 Copper
+Serf Bot - buys Ironworks
+Serf Bot - gains Ironworks
+Serf Bot - draws Silver
+Serf Bot - shuffles deck
+Serf Bot - draws Conspirator, Estate, Ironmonger, Province
+ 
+---------- ftl: turn 14 ----------
+ftl - plays Crossroads
+ftl - reveals hand: Conspirator, Nobles, Diadem, Conspirator
+ftl - draws Trusty Steed
+ftl - plays Trusty Steed
+ftl - takes 2 actions
+ftl - draws Crossroads, Conspirator
+ftl - plays Conspirator
+ftl - draws Island
+ftl - plays Conspirator
+ftl - draws Chapel
+ftl - plays Conspirator
+ftl - draws Province
+ftl - plays Crossroads
+ftl - reveals hand: Nobles, Diadem, Island, Chapel, Province
+ftl - draws Ironworks, Estate, Followers
+ftl - plays Followers
+ftl - draws Tournament, Conspirator
+ftl - gains Estate
+Serf Bot - gains Curse
+Serf Bot - discards Province
+Serf Bot - discards Estate
+ftl - plays Conspirator
+ftl - draws Nobles
+ftl - plays Nobles
+ftl - draws Ironmonger, Nobles, Tournament
+ftl - plays Ironmonger
+ftl - draws Conspirator
+ftl - reveals: Market
+ftl - places Market on top of deck
+ftl - plays Conspirator
+ftl - draws Market
+ftl - plays Market
+ftl - draws Market
+ftl - plays Market
+ftl - draws Nobles
+ftl - plays Tournament
+ftl - draws Market
+ftl - plays Tournament
+ftl - draws Conspirator
+ftl - plays Market
+ftl - shuffles deck
+ftl - draws Estate
+ftl - plays Ironworks
+ftl - gains Island
+ftl - shuffles deck
+ftl - draws Island
+ftl - plays Conspirator
+ftl - plays Nobles
+ftl - takes 2 actions
+ftl - plays Island
+ftl - sets aside Province
+ftl - plays Island
+ftl - sets aside Chapel
+ftl - plays 1 Diadem
+ftl - buys Island
+ftl - gains Island
+ftl - buys Island
+ftl - gains Island
+ftl - buys Island
+ftl - gains Island
+ftl - buys Island
+ftl - gains Island
+ftl - shuffles deck
+ftl - draws Nobles, Conspirator, Crossroads, Island, Nobles
+ 
+---------- Serf Bot: turn 15 ----------
+Serf Bot - plays Ironmonger
+Serf Bot - draws Estate
+Serf Bot - reveals: Silver
+Serf Bot - places Silver on top of deck
+Serf Bot - plays Conspirator
+Serf Bot - plays 1 Silver
+Serf Bot - buys Market
+Serf Bot - gains Market
+Serf Bot - draws Silver, Conspirator, Copper, Gold, Copper
+ 
+---------- ftl: turn 15 ----------
+ftl - plays Crossroads
+ftl - reveals hand: Nobles, Conspirator, Island, Nobles
+ftl - draws Nobles, Tournament, Conspirator
+ftl - plays Tournament
+ftl - draws Diadem
+ftl - plays Conspirator
+ftl - draws Conspirator
+ftl - plays Conspirator
+ftl - draws Estate
+ftl - plays Nobles
+ftl - draws Island, Market, Estate
+ftl - plays Market
+ftl - draws Trusty Steed
+ftl - plays Trusty Steed
+ftl - takes 2 actions
+ftl - draws Conspirator, Ironworks
+ftl - plays Ironworks
+ftl - gains Island
+ftl - draws Island
+ftl - plays Conspirator
+ftl - draws Tournament
+ftl - plays Conspirator
+ftl - draws Nobles
+ftl - plays Tournament
+ftl - draws Crossroads
+ftl - plays Crossroads
+ftl - reveals hand: Nobles, Nobles, Island, Diadem, Estate, Island, Estate, Island, Nobles
+ftl - draws Ironmonger, Followers, Market, Conspirator, Conspirator, Market, Island
+ftl - shuffles deck
+ftl - draws Island
+ftl - plays Market
+ftl - plays Market
+ftl - plays Conspirator
+ftl - plays Conspirator
+ftl - plays Nobles
+ftl - takes 2 actions
+ftl - plays Nobles
+ftl - takes 2 actions
+ftl - plays Nobles
+ftl - takes 2 actions
+ftl - plays Ironmonger
+ftl - plays Followers
+ftl - gains Estate
+Serf Bot - gains Curse
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+ftl - plays Island
+ftl - sets aside Estate
+ftl - plays Island
+ftl - sets aside Estate
+ftl - plays Island
+ftl - sets aside Island
+ftl - plays 1 Diadem
+ftl - buys Nobles
+ftl - gains Nobles
+ftl - buys Nobles
+ftl - gains Nobles
+ftl - buys Nobles
+ftl - gains Nobles
+ftl - buys Crossroads
+ftl - gains Crossroads
+ftl - shuffles deck
+ftl - draws Ironworks, Nobles, Tournament, Diadem, Tournament
+ 
+---------- Serf Bot: turn 16 ----------
+Serf Bot - plays Conspirator
+Serf Bot - plays 1 Silver, 1 Gold
+Serf Bot - buys Gold
+Serf Bot - gains Gold
+Serf Bot - draws Copper, Copper, Copper, Ironworks, Copper
+ 
+---------- ftl: turn 16 ----------
+ftl - plays Ironworks
+ftl - gains Island
+ftl - draws Nobles
+ftl - plays Tournament
+ftl - draws Conspirator
+ftl - plays Tournament
+ftl - draws Market
+ftl - plays Conspirator
+ftl - draws Conspirator
+ftl - plays Market
+ftl - draws Followers
+ftl - plays Conspirator
+ftl - draws Island
+ftl - plays Nobles
+ftl - takes 2 actions
+ftl - plays Followers
+ftl - draws Nobles, Conspirator
+ftl - gains Estate
+Serf Bot - gains Curse
+Serf Bot - discards Copper
+Serf Bot - discards Copper
+ftl - plays Conspirator
+ftl - draws Crossroads
+ftl - plays Crossroads
+ftl - reveals hand: Nobles, Diadem, Island, Nobles
+ftl - draws Market, Estate, Market
+ftl - plays Market
+ftl - draws Nobles
+ftl - plays Market
+ftl - draws Conspirator
+ftl - plays Conspirator
+ftl - draws Nobles
+ftl - plays Nobles
+ftl - draws Nobles, Crossroads, Crossroads
+ftl - plays Crossroads
+ftl - reveals hand: Estate, Nobles, Diadem, Island, Nobles, Nobles, Nobles, Crossroads
+ftl - draws Conspirator, Nobles, Trusty Steed, Ironmonger, Conspirator
+ftl - shuffles deck
+ftl - draws Estate
+ftl - plays Nobles
+ftl - takes 2 actions
+ftl - plays Trusty Steed
+ftl - takes 2 coins
+ftl - gains Silver
+ftl - gains Silver
+ftl - gains Silver
+ftl - gains Silver
+ftl - moves deck to discards
+ftl - plays Ironmonger
+ftl - shuffles deck
+ftl - draws Silver
+ftl - reveals: Island
+ftl - discards Island
+ftl - draws Silver
+ftl - plays Conspirator
+ftl - draws Silver
+ftl - plays Conspirator
+ftl - draws Silver
+ftl - plays Crossroads
+ftl - reveals hand: Nobles, Estate, Estate, Nobles, Diadem, Island, Nobles, Nobles, Silver, Silver, Silver, Silver
+ftl - shuffles deck
+ftl - draws Island
+ftl - plays Nobles
+ftl - takes 2 actions
+ftl - plays Island
+ftl - sets aside Estate
+ftl - plays Island
+ftl - sets aside Estate
+ftl - plays 4 Silver, 1 Diadem
+ftl - buys Nobles
+ftl - gains Nobles
+ftl - buys Colony
+ftl - gains Colony
+ftl - buys Colony
+ftl - gains Colony
+ftl - shuffles deck
+ftl - draws Ironmonger, Conspirator, Trusty Steed, Market, Conspirator
+ 
+------------ Game Over ------------
+ftl - cards: 8 Nobles, 8 Island, 6 Conspirator, 3 Crossroads, 3 Market, 2 Tournament, 1 Chapel, 1 Ironmonger, 1 Trusty Steed, 1 Ironworks, 1 Followers, 4 Silver, 1 Diadem, 4 Estate, 2 Colony, 1 Province
+ftl - total victory points: 62
+ftl - turns: 16
+ 
+Serf Bot - cards: 4 Conspirator, 3 Ironmonger, 3 Market, 2 Inn, 2 Ironworks, 1 Tournament, 8 Copper, 3 Silver, 3 Gold, 3 Estate, 1 Province, 4 Curse
+Serf Bot - total victory points: 5
+Serf Bot - turns: 16
+ 
+1st place: ftl
+2nd place: Serf Bot
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.50612a9b51c36e573294bfd0.1369817660556.txt b/testing/testdata/log.50612a9b51c36e573294bfd0.1369817660556.txt
new file mode 100644
index 0000000..baf1b7e
--- /dev/null
+++ b/testing/testdata/log.50612a9b51c36e573294bfd0.1369817660556.txt
@@ -0,0 +1,682 @@
+------------ Game Setup ------------
+Supply cards: Masquerade, Village, Baron, Horse Traders, Tournament, Wandering Minstrel, City, Cultist, Witch, Altar, Copper, Silver, Gold, Estate, Duchy, Province, Curse, Colony, Platinum, Ruins
+Rating system: unrated
+ftl - starting cards: Necropolis, Overgrown Estate, Hovel, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Serf Bot - starting cards: Necropolis, Overgrown Estate, Hovel, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+ftl - shuffles deck
+Serf Bot - shuffles deck
+ftl - draws Copper, Hovel, Overgrown Estate, Necropolis, Copper
+Serf Bot - draws Copper, Hovel, Copper, Overgrown Estate, Copper
+ 
+---------- ftl: turn 1 ----------
+ftl - plays Necropolis
+ftl - plays 2 Copper
+ftl - buys Estate
+ftl - trashes Hovel
+ftl - gains Estate
+ftl - draws Copper, Copper, Copper, Copper, Copper
+ 
+---------- Serf Bot: turn 1 ----------
+Serf Bot - plays 3 Copper
+Serf Bot - buys Masquerade
+Serf Bot - gains Masquerade
+Serf Bot - draws Copper, Copper, Necropolis, Copper, Copper
+ 
+---------- ftl: turn 2 ----------
+ftl - plays 5 Copper
+ftl - buys Witch
+ftl - gains Witch
+ftl - shuffles deck
+ftl - draws Copper, Copper, Copper, Copper, Estate
+ 
+---------- Serf Bot: turn 2 ----------
+Serf Bot - plays Necropolis
+Serf Bot - plays 4 Copper
+Serf Bot - buys Tournament
+Serf Bot - gains Tournament
+Serf Bot - shuffles deck
+Serf Bot - draws Masquerade, Copper, Copper, Tournament, Copper
+ 
+---------- ftl: turn 3 ----------
+ftl - plays 4 Copper
+ftl - buys Wandering Minstrel
+ftl - gains Wandering Minstrel
+ftl - draws Copper, Copper, Witch, Overgrown Estate, Copper
+ 
+---------- Serf Bot: turn 3 ----------
+Serf Bot - plays Tournament
+Serf Bot - draws Necropolis
+Serf Bot - plays Necropolis
+Serf Bot - plays Masquerade
+Serf Bot - draws Copper, Copper
+Serf Bot - passes Copper
+ftl - passes Overgrown Estate
+Serf Bot - trashes Overgrown Estate
+Serf Bot - draws Copper
+Serf Bot - plays 5 Copper
+Serf Bot - buys Gold
+Serf Bot - gains Gold
+Serf Bot - draws Copper, Hovel, Overgrown Estate
+Serf Bot - shuffles deck
+Serf Bot - draws Tournament, Necropolis
+ 
+---------- ftl: turn 4 ----------
+ftl - plays Witch
+ftl - draws Necropolis
+ftl - shuffles deck
+ftl - draws Copper
+Serf Bot - gains Curse
+ftl - plays 5 Copper
+ftl - buys Cultist
+ftl - gains Cultist
+ftl - draws Copper, Estate, Copper, Copper, Wandering Minstrel
+ 
+---------- Serf Bot: turn 4 ----------
+Serf Bot - plays Tournament
+Serf Bot - draws Copper
+Serf Bot - plays Necropolis
+Serf Bot - plays 2 Copper
+Serf Bot - buys Silver
+Serf Bot - gains Silver
+Serf Bot - draws Copper, Copper, Masquerade, Gold, Copper
+ 
+---------- ftl: turn 5 ----------
+ftl - plays Wandering Minstrel
+ftl - shuffles deck
+ftl - draws Copper
+ftl - reveals: Copper, Copper, Necropolis
+ftl - places Necropolis on top of deck
+ftl - discards: Copper, Copper
+ftl - plays 4 Copper
+ftl - buys Horse Traders
+ftl - gains Horse Traders
+ftl - draws Necropolis, Cultist, Copper, Witch, Copper
+ 
+---------- Serf Bot: turn 5 ----------
+Serf Bot - plays Masquerade
+Serf Bot - draws Copper
+Serf Bot - shuffles deck
+Serf Bot - draws Copper
+Serf Bot - passes Copper
+ftl - passes Copper
+Serf Bot - trashes Copper
+Serf Bot - plays 4 Copper, 1 Gold
+Serf Bot - buys Altar
+Serf Bot - gains Altar
+Serf Bot - draws Curse, Hovel, Necropolis, Tournament, Silver
+ 
+---------- ftl: turn 6 ----------
+ftl - plays Necropolis
+ftl - plays Witch
+ftl - shuffles deck
+ftl - draws Copper, Copper
+Serf Bot - gains Curse
+ftl - plays Cultist
+ftl - draws Wandering Minstrel, Copper
+Serf Bot - gains Survivors
+ftl - plays 5 Copper
+ftl - buys City
+ftl - gains City
+ftl - draws Horse Traders, Copper, Estate, Copper, Copper
+ 
+---------- Serf Bot: turn 6 ----------
+Serf Bot - plays Tournament
+Serf Bot - draws Overgrown Estate
+Serf Bot - plays Necropolis
+Serf Bot - plays 1 Silver
+Serf Bot - buys Village
+Serf Bot - gains Village
+Serf Bot - draws Copper
+Serf Bot - shuffles deck
+Serf Bot - draws Overgrown Estate, Curse, Copper, Altar
+ 
+---------- ftl: turn 7 ----------
+ftl - plays Horse Traders
+ftl - discards Estate
+ftl - discards Copper
+ftl - plays 2 Copper
+ftl - buys City
+ftl - gains City
+ftl - shuffles deck
+ftl - draws Copper, Witch, Horse Traders, Copper, Necropolis
+ 
+---------- Serf Bot: turn 7 ----------
+Serf Bot - plays Altar
+Serf Bot - trashes Curse
+Serf Bot - gains Cultist
+Serf Bot - plays 2 Copper
+Serf Bot - buys Estate
+Serf Bot - gains Estate
+Serf Bot - draws Silver, Village, Hovel, Survivors, Tournament
+ 
+---------- ftl: turn 8 ----------
+ftl - plays Necropolis
+ftl - plays Witch
+ftl - draws Copper, Copper
+Serf Bot - gains Curse
+ftl - plays Horse Traders
+ftl - discards Copper
+ftl - discards Copper
+ftl - plays 2 Copper
+ftl - buys City
+ftl - gains City
+ftl - draws Copper, Estate, City, Cultist, Wandering Minstrel
+ 
+---------- Serf Bot: turn 8 ----------
+Serf Bot - plays Village
+Serf Bot - draws Masquerade
+Serf Bot - plays Masquerade
+Serf Bot - draws Copper, Curse
+Serf Bot - passes Curse
+ftl - passes Estate
+Serf Bot - trashes Hovel
+Serf Bot - plays Tournament
+Serf Bot - draws Copper
+Serf Bot - plays Survivors
+Serf Bot - looks at Necropolis, Gold
+Serf Bot - places Necropolis on top of deck
+Serf Bot - places Gold on top of deck
+Serf Bot - plays 2 Copper, 1 Silver
+Serf Bot - buys Witch
+Serf Bot - gains Witch
+Serf Bot - draws Gold, Necropolis, Copper
+Serf Bot - shuffles deck
+Serf Bot - draws Village, Copper
+ 
+---------- ftl: turn 9 ----------
+ftl - plays Wandering Minstrel
+ftl - draws Copper
+ftl - reveals: City, Copper, Copper
+ftl - places City on top of deck
+ftl - discards: Copper, Copper
+ftl - plays City
+ftl - draws City
+ftl - plays Cultist
+ftl - shuffles deck
+ftl - draws Necropolis, Copper
+Serf Bot - gains Ruined Market
+ftl - plays City
+ftl - draws City
+ftl - plays City
+ftl - draws Horse Traders
+ftl - plays Horse Traders
+ftl - discards Necropolis
+ftl - discards Curse
+ftl - plays 3 Copper
+ftl - buys Altar
+ftl - gains Altar
+ftl - draws Copper, Copper, Copper, Copper, Copper
+ 
+---------- Serf Bot: turn 9 ----------
+Serf Bot - plays Village
+Serf Bot - draws Curse
+Serf Bot - plays Necropolis
+Serf Bot - plays 2 Copper, 1 Gold
+Serf Bot - buys Cultist
+Serf Bot - gains Cultist
+Serf Bot - draws Witch, Copper, Masquerade, Silver, Altar
+ 
+---------- ftl: turn 10 ----------
+ftl - plays 5 Copper
+ftl - buys City
+ftl - gains City
+ftl - draws Witch
+ftl - shuffles deck
+ftl - draws Horse Traders, Copper, Copper, Necropolis
+ 
+---------- Serf Bot: turn 10 ----------
+Serf Bot - plays Witch
+ftl - reveals reaction Horse Traders
+Serf Bot - draws Estate, Cultist
+ftl - gains Curse
+Serf Bot - plays 1 Copper, 1 Silver
+Serf Bot - buys Village
+Serf Bot - gains Village
+Serf Bot - draws Copper, Survivors, Estate, Copper, Tournament
+ 
+---------- ftl: turn 11 ----------
+ftl - duration Horse Traders
+ftl - draws Copper
+ftl - plays Necropolis
+ftl - plays Witch
+ftl - draws Curse, City
+Serf Bot - gains Curse
+ftl - plays City
+ftl - draws Copper
+ftl - plays Horse Traders
+ftl - discards Curse
+ftl - discards Copper
+ftl - plays 3 Copper
+ftl - buys Altar
+ftl - gains Altar
+ftl - draws City, Cultist, Copper, City, Copper
+ 
+---------- Serf Bot: turn 11 ----------
+Serf Bot - plays Tournament
+Serf Bot - draws Overgrown Estate
+Serf Bot - plays Survivors
+Serf Bot - shuffles deck
+Serf Bot - looks at Cultist, Masquerade
+Serf Bot - places Masquerade on top of deck
+Serf Bot - places Cultist on top of deck
+Serf Bot - plays 2 Copper
+Serf Bot - buys Masquerade
+Serf Bot - gains Masquerade
+Serf Bot - draws Cultist, Masquerade, Copper, Village, Necropolis
+ 
+---------- ftl: turn 12 ----------
+ftl - plays City
+ftl - draws Copper
+ftl - plays City
+ftl - draws Copper
+ftl - plays Cultist
+ftl - draws City, Altar
+Serf Bot - gains Abandoned Mine
+ftl - plays City
+ftl - draws Wandering Minstrel
+ftl - plays Wandering Minstrel
+ftl - shuffles deck
+ftl - draws Curse
+ftl - reveals: Copper, City, Copper
+ftl - places City on top of deck
+ftl - discards: Copper, Copper
+ftl - plays Altar
+ftl - trashes Curse
+ftl - gains City
+ftl - plays 4 Copper
+ftl - buys Tournament
+ftl - gains Tournament
+ftl - draws City, Horse Traders, Curse, Altar, Copper
+ 
+---------- Serf Bot: turn 12 ----------
+Serf Bot - plays Village
+Serf Bot - draws Curse
+Serf Bot - plays Necropolis
+Serf Bot - plays Cultist
+ftl - reveals reaction Horse Traders
+Serf Bot - draws Estate, Village
+ftl - gains Survivors
+Serf Bot - plays Village
+Serf Bot - draws Silver
+Serf Bot - plays Masquerade
+Serf Bot - draws Ruined Market, Curse
+Serf Bot - passes Curse
+ftl - passes Curse
+Serf Bot - trashes Curse
+Serf Bot - plays Ruined Market
+Serf Bot - plays 1 Copper, 1 Silver
+Serf Bot - buys Silver
+Serf Bot - gains Silver
+Serf Bot - buys Copper
+Serf Bot - gains Copper
+Serf Bot - draws Altar, Copper, Copper, Gold, Witch
+ 
+---------- ftl: turn 13 ----------
+ftl - duration Horse Traders
+ftl - draws Witch
+ftl - plays City
+ftl - draws Copper
+ftl - plays Witch
+ftl - draws Necropolis
+ftl - shuffles deck
+ftl - draws City
+Serf Bot - gains Curse
+ftl - plays City
+ftl - draws City
+ftl - plays City
+ftl - draws Tournament
+ftl - plays Altar
+ftl - trashes Curse
+ftl - gains City
+ftl - plays Tournament
+ftl - draws Copper
+ftl - plays Horse Traders
+ftl - discards Necropolis
+ftl - discards Copper
+ftl - plays 2 Copper
+ftl - buys Altar
+ftl - gains Altar
+ftl - draws Cultist, Altar, Copper, Wandering Minstrel, City
+ 
+---------- Serf Bot: turn 13 ----------
+Serf Bot - plays Witch
+Serf Bot - draws Cultist
+Serf Bot - shuffles deck
+Serf Bot - draws Copper
+ftl - gains Curse
+Serf Bot - plays 3 Copper, 1 Gold
+Serf Bot - buys Gold
+Serf Bot - gains Gold
+Serf Bot - draws Cultist, Curse, Abandoned Mine, Silver, Necropolis
+ 
+---------- ftl: turn 14 ----------
+ftl - plays City
+ftl - draws City
+ftl - plays City
+ftl - draws Copper
+ftl - plays Wandering Minstrel
+ftl - draws Copper
+ftl - reveals: Copper, Survivors, Copper
+ftl - places Survivors on top of deck
+ftl - discards: Copper, Copper
+ftl - plays Cultist
+ftl - draws Survivors
+ftl - shuffles deck
+ftl - draws City
+Serf Bot - gains Ruined Library
+ftl - plays City
+ftl - draws Copper
+ftl - plays Altar
+ftl - trashes Survivors
+ftl - gains City
+ftl - plays 4 Copper
+ftl - buys Tournament
+ftl - gains Tournament
+ftl - draws Necropolis, Copper, City, City, Witch
+ 
+---------- Serf Bot: turn 14 ----------
+Serf Bot - plays Necropolis
+Serf Bot - plays Cultist
+Serf Bot - draws Tournament, Village
+ftl - gains Abandoned Mine
+Serf Bot - plays Village
+Serf Bot - draws Village
+Serf Bot - plays Village
+Serf Bot - draws Copper
+Serf Bot - plays Tournament
+Serf Bot - draws Ruined Market
+Serf Bot - plays Abandoned Mine
+Serf Bot - plays Ruined Market
+Serf Bot - plays 1 Silver, 1 Copper
+Serf Bot - buys Witch
+Serf Bot - gains Witch
+Serf Bot - draws Masquerade, Estate, Overgrown Estate, Curse, Copper
+ 
+---------- ftl: turn 15 ----------
+ftl - plays City
+ftl - draws Copper
+ftl - plays City
+ftl - draws Curse
+ftl - plays Witch
+ftl - draws Altar, Tournament
+Serf Bot - gains Curse
+ftl - plays Tournament
+ftl - draws Copper
+ftl - plays Altar
+ftl - trashes Curse
+ftl - gains City
+ftl - plays Necropolis
+ftl - plays 3 Copper
+ftl - buys Wandering Minstrel
+ftl - gains Wandering Minstrel
+ftl - draws Copper, City, Altar, Horse Traders
+ftl - shuffles deck
+ftl - draws Altar
+ 
+---------- Serf Bot: turn 15 ----------
+Serf Bot - plays Masquerade
+Serf Bot - draws Survivors, Masquerade
+Serf Bot - passes Curse
+ftl - passes Copper
+Serf Bot - trashes Overgrown Estate
+Serf Bot - draws Estate
+Serf Bot - plays 2 Copper
+Serf Bot - buys Estate
+Serf Bot - gains Estate
+Serf Bot - draws Silver, Copper
+Serf Bot - shuffles deck
+Serf Bot - draws Gold, Ruined Market, Curse
+ 
+---------- ftl: turn 16 ----------
+ftl - plays City
+ftl - draws City
+ftl - plays City
+ftl - draws Copper
+ftl - plays Altar
+ftl - trashes Curse
+ftl - gains Cultist
+ftl - plays Altar
+ftl - trashes Copper
+ftl - gains Cultist
+ftl - plays Horse Traders
+ftl - buys Village
+ftl - gains Village
+ftl - draws City, Tournament, City, Copper, Wandering Minstrel
+ 
+---------- Serf Bot: turn 16 ----------
+Serf Bot - plays Ruined Market
+Serf Bot - plays 1 Silver, 1 Copper, 1 Gold
+Serf Bot - buys Silver
+Serf Bot - gains Silver
+Serf Bot - buys Masquerade
+Serf Bot - gains Masquerade
+Serf Bot - draws Copper, Village, Estate, Witch, Survivors
+ 
+---------- ftl: turn 17 ----------
+ftl - plays City
+ftl - draws Altar
+ftl - plays City
+ftl - draws Copper
+ftl - plays Wandering Minstrel
+ftl - draws Necropolis
+ftl - reveals: Abandoned Mine, Copper, City
+ftl - places City on top of deck
+ftl - places Abandoned Mine on top of deck
+ftl - discards Copper
+ftl - plays Tournament
+ftl - draws Abandoned Mine
+ftl - plays Altar
+ftl - trashes Abandoned Mine
+ftl - gains Cultist
+ftl - plays Necropolis
+ftl - plays 2 Copper
+ftl - buys Village
+ftl - gains Village
+ftl - draws City, City, Copper, Cultist, Copper
+ 
+---------- Serf Bot: turn 17 ----------
+Serf Bot - plays Village
+Serf Bot - draws Abandoned Mine
+Serf Bot - plays Witch
+Serf Bot - draws Cultist, Copper
+ftl - gains Curse
+Serf Bot - plays Cultist
+Serf Bot - draws Cultist, Necropolis
+ftl - gains Ruined Village
+Serf Bot - plays Cultist
+Serf Bot - draws Curse, Estate
+ftl - gains Survivors
+Serf Bot - plays 2 Copper
+Serf Bot - buys Estate
+Serf Bot - gains Estate
+Serf Bot - draws Masquerade, Ruined Library, Copper, Copper, Masquerade
+ 
+---------- ftl: turn 18 ----------
+ftl - plays City
+ftl - draws City
+ftl - plays Cultist
+ftl - draws Tournament, City
+Serf Bot - gains Survivors
+ftl - plays City
+ftl - draws Copper
+ftl - plays Tournament
+ftl - draws Wandering Minstrel
+ftl - plays Wandering Minstrel
+ftl - draws Witch
+ftl - shuffles deck
+ftl - reveals: Altar, Necropolis, Ruined Village
+ftl - places Ruined Village on top of deck
+ftl - places Necropolis on top of deck
+ftl - places Altar on top of deck
+ftl - plays Witch
+ftl - draws Altar, Necropolis
+Serf Bot - gains Curse
+ftl - plays City
+ftl - draws Ruined Village, City
+ftl - plays City
+ftl - draws City, Copper
+ftl - plays City
+ftl - draws City, Tournament
+ftl - plays City
+ftl - draws Altar, Cultist
+ftl - plays Cultist
+ftl - draws Copper, Altar
+Serf Bot - gains Ruined Library
+ftl - plays City
+ftl - draws Survivors, Curse
+ftl - plays Tournament
+ftl - draws City
+ftl - plays City
+ftl - draws Wandering Minstrel, Cultist
+ftl - plays Cultist
+ftl - draws Horse Traders, Copper
+ftl - plays Wandering Minstrel
+ftl - draws Cultist
+ftl - reveals: Village, Village
+ftl - places Village on top of deck
+ftl - places Village on top of deck
+ftl - plays Cultist
+ftl - draws Village, Village
+ftl - plays Horse Traders
+ftl - discards Survivors
+ftl - discards Ruined Village
+ftl - plays Village
+ftl - shuffles deck
+ftl - draws Survivors
+ftl - plays Survivors
+ftl - looks at Ruined Village
+ftl - discards Ruined Village
+ftl - plays Village
+ftl - shuffles deck
+ftl - draws Ruined Village
+ftl - plays Altar
+ftl - trashes Curse
+ftl - gains Tournament
+ftl - plays Altar
+ftl - trashes Ruined Village
+ftl - gains Tournament
+ftl - plays Altar
+ftl - trashes Necropolis
+ftl - gains Horse Traders
+ftl - plays 6 Copper
+ftl - buys Province
+ftl - gains Province
+ftl - buys Cultist
+ftl - gains Cultist
+ftl - shuffles deck
+ftl - draws Cultist, Village, Horse Traders, Copper, Copper
+ 
+---------- Serf Bot: turn 18 ----------
+Serf Bot - plays Masquerade
+Serf Bot - draws Altar, Village
+Serf Bot - passes Copper
+ftl - passes Copper
+Serf Bot - trashes Copper
+Serf Bot - plays 1 Copper
+Serf Bot - draws Tournament, Copper, Silver, Copper, Estate
+ 
+---------- ftl: turn 19 ----------
+ftl - plays Village
+ftl - draws Province
+ftl - plays Cultist
+ftl - draws Village, City
+ftl - plays Village
+ftl - draws Copper
+ftl - plays City
+ftl - draws City, City
+ftl - plays City
+ftl - draws Cultist, City
+ftl - plays City
+ftl - draws City, Tournament
+ftl - plays Tournament
+ftl - reveals Province
+ftl - discards Province
+ftl - gains Diadem
+ftl - draws Diadem
+ftl - plays City
+ftl - draws Witch, Altar
+ftl - plays City
+ftl - draws Wandering Minstrel, City
+ftl - plays Cultist
+ftl - draws Copper, Survivors
+ftl - plays Wandering Minstrel
+ftl - draws City
+ftl - reveals: City, Cultist, Cultist
+ftl - places Cultist on top of deck
+ftl - places Cultist on top of deck
+ftl - places City on top of deck
+ftl - plays City
+ftl - draws City, Cultist
+ftl - plays City
+ftl - draws Cultist, Copper
+ftl - plays City
+ftl - draws Wandering Minstrel, Cultist
+ftl - plays Cultist
+ftl - draws Tournament, Tournament
+ftl - plays Cultist
+ftl - draws Horse Traders, Tournament
+ftl - plays Cultist
+ftl - draws Altar, Altar
+ftl - plays Wandering Minstrel
+ftl - draws Copper
+ftl - shuffles deck
+ftl - reveals: Province
+ftl - discards Province
+ftl - plays Tournament
+ftl - shuffles deck
+ftl - draws Province
+ftl - plays Tournament
+ftl - reveals Province
+ftl - discards Province
+ftl - gains Trusty Steed
+ftl - draws Trusty Steed
+ftl - plays Trusty Steed
+ftl - takes 2 actions
+ftl - gains Silver
+ftl - gains Silver
+ftl - gains Silver
+ftl - gains Silver
+ftl - moves deck to discards
+ftl - plays Tournament
+ftl - shuffles deck
+ftl - draws Silver
+ftl - plays Witch
+ftl - draws Silver, Province
+ftl - plays Altar
+ftl - trashes Survivors
+ftl - gains Duchy
+ftl - plays Altar
+ftl - trashes Copper
+ftl - gains Duchy
+ftl - plays Horse Traders
+ftl - discards Province
+ftl - discards Altar
+ftl - plays 5 Copper, 2 Silver, 1 Diadem
+ftl - buys Estate
+ftl - gains Estate
+ftl - buys Estate
+ftl - gains Estate
+ftl - buys Estate
+ftl - gains Estate
+ftl - buys Estate
+ftl - gains Estate
+ftl - buys Colony
+ftl - gains Colony
+ftl - buys Colony
+ftl - gains Colony
+ftl - draws Silver, Silver
+ftl - shuffles deck
+ftl - draws City, Duchy, City
+ 
+------------ Game Over ------------
+ftl - cards: 8 City, 5 Cultist, 4 Tournament, 3 Altar, 2 Horse Traders, 2 Village, 2 Wandering Minstrel, 1 Trusty Steed, 1 Witch, 5 Copper, 4 Silver, 1 Diadem, 4 Estate, 2 Colony, 2 Duchy, 1 Province
+ftl - total victory points: 36
+ftl - turns: 19
+ 
+Serf Bot - cards: 3 Masquerade, 2 Village, 2 Ruined Library, 2 Survivors, 2 Cultist, 2 Witch, 1 Abandoned Mine, 1 Necropolis, 1 Tournament, 1 Ruined Market, 1 Altar, 6 Copper, 3 Silver, 2 Gold, 4 Estate, 3 Curse
+Serf Bot - total victory points: 1
+Serf Bot - turns: 18
+ 
+1st place: ftl
+2nd place: Serf Bot
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.50a0e49ce4b03482c09cbdb0.1363497384350.txt b/testing/testdata/log.50a0e49ce4b03482c09cbdb0.1363497384350.txt
new file mode 100644
index 0000000..20693f9
--- /dev/null
+++ b/testing/testdata/log.50a0e49ce4b03482c09cbdb0.1363497384350.txt
@@ -0,0 +1,662 @@
+------------ Game Setup ------------
+Supply cards: Moat, Chancellor, Village, Workshop, Remodel, Spy, Thief, Throne Room, Library, Market, Copper, Silver, Gold, Estate, Duchy, Province, Curse
+KeyNoir - starting cards: Copper, Copper, Copper, Copper, Copper, Copper, Copper, Estate, Estate, Estate
+Lady Sarra - starting cards: Copper, Copper, Copper, Copper, Copper, Copper, Copper, Estate, Estate, Estate
+KeyNoir - shuffles deck
+Lady Sarra - shuffles deck
+KeyNoir - draws Copper, Copper, Copper, Estate, Copper
+Lady Sarra - draws Copper, Copper, Copper, Estate, Estate
+ 
+---------- Lady Sarra: turn 1 ----------
+Lady Sarra - plays 3 Copper
+Lady Sarra - buys Silver
+Lady Sarra - gains Silver
+Lady Sarra - draws Copper, Copper, Copper, Copper, Estate
+ 
+---------- KeyNoir: turn 1 ----------
+KeyNoir - plays 4 Copper
+KeyNoir - buys Thief
+KeyNoir - gains Thief
+KeyNoir - draws Copper, Copper, Copper, Estate, Estate
+ 
+---------- Lady Sarra: turn 2 ----------
+Lady Sarra - plays 4 Copper
+Lady Sarra - buys Spy
+Lady Sarra - gains Spy
+Lady Sarra - shuffles deck
+Lady Sarra - draws Copper, Copper, Silver, Copper, Spy
+ 
+---------- KeyNoir: turn 2 ----------
+KeyNoir - plays 3 Copper
+KeyNoir - buys Village
+KeyNoir - gains Village
+KeyNoir - shuffles deck
+KeyNoir - draws Copper, Village, Estate, Copper, Copper
+ 
+---------- Lady Sarra: turn 3 ----------
+Lady Sarra - plays Spy
+Lady Sarra - draws Copper
+Lady Sarra - discards Estate
+KeyNoir - places Copper on top of deck
+Lady Sarra - plays 4 Copper, 1 Silver
+Lady Sarra - buys Gold
+Lady Sarra - gains Gold
+Lady Sarra - draws Estate, Estate, Copper, Copper, Copper
+ 
+---------- KeyNoir: turn 3 ----------
+KeyNoir - plays Village
+KeyNoir - draws Copper
+KeyNoir - plays 4 Copper
+KeyNoir - buys Throne Room
+KeyNoir - gains Throne Room
+KeyNoir - draws Copper, Copper, Estate, Estate, Copper
+ 
+---------- Lady Sarra: turn 4 ----------
+Lady Sarra - plays 3 Copper
+Lady Sarra - buys Workshop
+Lady Sarra - gains Workshop
+Lady Sarra - shuffles deck
+Lady Sarra - draws Gold, Copper, Silver, Estate, Estate
+ 
+---------- KeyNoir: turn 4 ----------
+KeyNoir - plays 3 Copper
+KeyNoir - buys Village
+KeyNoir - gains Village
+KeyNoir - draws Thief
+KeyNoir - shuffles deck
+KeyNoir - draws Copper, Copper, Copper, Copper
+ 
+---------- Lady Sarra: turn 5 ----------
+Lady Sarra - plays 1 Gold, 1 Copper, 1 Silver
+Lady Sarra - buys Gold
+Lady Sarra - gains Gold
+Lady Sarra - draws Copper, Copper, Estate, Copper, Copper
+ 
+---------- KeyNoir: turn 5 ----------
+KeyNoir - plays Thief
+Lady Sarra - reveals: Workshop, Copper
+KeyNoir - trashes Copper
+Lady Sarra - discards Workshop
+KeyNoir - plays 4 Copper
+KeyNoir - buys Throne Room
+KeyNoir - gains Throne Room
+KeyNoir - draws Throne Room, Copper, Copper, Estate, Estate
+ 
+---------- Lady Sarra: turn 6 ----------
+Lady Sarra - plays 4 Copper
+Lady Sarra - buys Throne Room
+Lady Sarra - gains Throne Room
+Lady Sarra - draws Spy, Copper
+Lady Sarra - shuffles deck
+Lady Sarra - draws Workshop, Estate, Silver
+ 
+---------- KeyNoir: turn 6 ----------
+KeyNoir - plays Throne Room
+KeyNoir - plays 2 Copper
+KeyNoir - buys Moat
+KeyNoir - gains Moat
+KeyNoir - draws Estate, Copper, Village, Village
+KeyNoir - shuffles deck
+KeyNoir - draws Copper
+ 
+---------- Lady Sarra: turn 7 ----------
+Lady Sarra - plays Spy
+Lady Sarra - draws Gold
+Lady Sarra - places Gold on top of deck
+KeyNoir - places Estate on top of deck
+Lady Sarra - plays Workshop
+Lady Sarra - gains Spy
+Lady Sarra - plays 1 Copper, 1 Silver, 1 Gold
+Lady Sarra - buys Gold
+Lady Sarra - gains Gold
+Lady Sarra - draws Gold, Copper, Copper, Throne Room, Copper
+ 
+---------- KeyNoir: turn 7 ----------
+KeyNoir - plays Village
+KeyNoir - draws Estate
+KeyNoir - plays Village
+KeyNoir - draws Estate
+KeyNoir - plays 2 Copper
+KeyNoir - buys Moat
+KeyNoir - gains Moat
+KeyNoir - draws Copper, Throne Room, Copper, Copper, Moat
+ 
+---------- Lady Sarra: turn 8 ----------
+Lady Sarra - plays 3 Copper, 1 Gold
+Lady Sarra - buys Gold
+Lady Sarra - gains Gold
+Lady Sarra - draws Estate, Estate, Copper, Copper
+Lady Sarra - shuffles deck
+Lady Sarra - draws Copper
+ 
+---------- KeyNoir: turn 8 ----------
+KeyNoir - plays Throne Room
+KeyNoir - plays Moat
+KeyNoir - draws Copper, Copper
+KeyNoir - plays Moat
+KeyNoir - draws Throne Room, Thief
+KeyNoir - plays 5 Copper
+KeyNoir - buys Library
+KeyNoir - gains Library
+KeyNoir - shuffles deck
+KeyNoir - draws Library, Throne Room, Estate, Copper, Copper
+ 
+---------- Lady Sarra: turn 9 ----------
+Lady Sarra - plays 3 Copper
+Lady Sarra - buys Workshop
+Lady Sarra - gains Workshop
+Lady Sarra - draws Spy, Throne Room, Copper, Gold, Copper
+ 
+---------- KeyNoir: turn 9 ----------
+KeyNoir - plays Throne Room
+KeyNoir - plays Library
+KeyNoir - discards Throne Room
+KeyNoir - draws Copper
+KeyNoir - discards Moat
+KeyNoir - draws Estate
+KeyNoir - discards Thief
+KeyNoir - draws Copper
+KeyNoir - discards Village
+KeyNoir - discards Village
+KeyNoir - draws Copper
+KeyNoir - discards: Throne Room, Moat, Thief, Village, Village
+KeyNoir - plays Library
+KeyNoir - plays 5 Copper
+KeyNoir - buys Market
+KeyNoir - gains Market
+KeyNoir - draws Copper, Estate, Copper, Moat
+KeyNoir - shuffles deck
+KeyNoir - draws Village
+ 
+---------- Lady Sarra: turn 10 ----------
+Lady Sarra - plays Throne Room
+Lady Sarra - plays Spy
+KeyNoir - reveals reaction Moat
+Lady Sarra - draws Estate
+Lady Sarra - places Spy on top of deck
+Lady Sarra - plays Spy
+KeyNoir - reveals reaction Moat
+Lady Sarra - draws Spy
+Lady Sarra - places Gold on top of deck
+Lady Sarra - plays Spy
+KeyNoir - reveals reaction Moat
+Lady Sarra - draws Gold
+Lady Sarra - places Silver on top of deck
+Lady Sarra - plays 2 Copper, 2 Gold
+Lady Sarra - buys Province
+Lady Sarra - gains Province
+Lady Sarra - draws Silver, Gold, Gold, Workshop, Copper
+ 
+---------- KeyNoir: turn 10 ----------
+KeyNoir - plays Village
+KeyNoir - draws Copper
+KeyNoir - plays Moat
+KeyNoir - draws Market, Village
+KeyNoir - plays Village
+KeyNoir - draws Estate
+KeyNoir - plays Market
+KeyNoir - draws Throne Room
+KeyNoir - plays Throne Room
+KeyNoir - plays 3 Copper
+KeyNoir - buys Spy
+KeyNoir - gains Spy
+KeyNoir - draws Copper, Copper, Throne Room, Estate, Library
+ 
+---------- Lady Sarra: turn 11 ----------
+Lady Sarra - plays Workshop
+Lady Sarra - gains Spy
+Lady Sarra - plays 2 Gold, 1 Silver, 1 Copper
+Lady Sarra - buys Province
+Lady Sarra - gains Province
+Lady Sarra - shuffles deck
+Lady Sarra - draws Copper, Gold, Copper, Spy, Throne Room
+ 
+---------- KeyNoir: turn 11 ----------
+KeyNoir - plays Throne Room
+KeyNoir - plays Library
+KeyNoir - draws Copper
+KeyNoir - discards Moat
+KeyNoir - draws Copper
+KeyNoir - discards Thief
+KeyNoir - shuffles deck
+KeyNoir - discards Throne Room
+KeyNoir - discards Moat
+KeyNoir - discards Village
+KeyNoir - discards Spy
+KeyNoir - discards Village
+KeyNoir - draws Copper
+KeyNoir - discards Market
+KeyNoir - draws Copper
+KeyNoir - discards: Moat, Thief, Throne Room, Moat, Village, Spy, Village, Market
+KeyNoir - plays Library
+KeyNoir - plays 6 Copper
+KeyNoir - buys Gold
+KeyNoir - gains Gold
+KeyNoir - draws Estate, Estate, Copper
+KeyNoir - shuffles deck
+KeyNoir - draws Spy, Copper
+ 
+---------- Lady Sarra: turn 12 ----------
+Lady Sarra - plays Throne Room
+Lady Sarra - plays Spy
+Lady Sarra - draws Estate
+Lady Sarra - places Gold on top of deck
+KeyNoir - discards Moat
+Lady Sarra - plays Spy
+Lady Sarra - draws Gold
+Lady Sarra - discards Copper
+KeyNoir - discards Market
+Lady Sarra - plays 2 Copper, 2 Gold
+Lady Sarra - buys Province
+Lady Sarra - gains Province
+Lady Sarra - draws Gold, Province, Copper, Silver, Province
+ 
+---------- KeyNoir: turn 12 ----------
+KeyNoir - plays Spy
+KeyNoir - draws Gold
+KeyNoir - discards Copper
+Lady Sarra - places Copper on top of deck
+KeyNoir - plays 2 Copper, 1 Gold
+KeyNoir - buys Market
+KeyNoir - gains Market
+KeyNoir - draws Throne Room, Village, Village, Copper, Throne Room
+ 
+---------- Lady Sarra: turn 13 ----------
+Lady Sarra - plays 1 Gold, 1 Copper, 1 Silver
+Lady Sarra - buys Gold
+Lady Sarra - gains Gold
+Lady Sarra - draws Copper, Gold, Workshop, Spy, Copper
+ 
+---------- KeyNoir: turn 13 ----------
+KeyNoir - plays Throne Room
+KeyNoir - plays Throne Room
+KeyNoir - plays Village
+KeyNoir - draws Copper
+KeyNoir - plays Village
+KeyNoir - draws Thief
+KeyNoir - plays Throne Room
+KeyNoir - plays Thief
+Lady Sarra - reveals: Estate, Spy
+Lady Sarra - discards: Estate, Spy
+KeyNoir - plays Thief
+Lady Sarra - reveals: Workshop, Estate
+Lady Sarra - discards: Workshop, Estate
+KeyNoir - plays Village
+KeyNoir - draws Copper
+KeyNoir - plays 3 Copper
+KeyNoir - buys Village
+KeyNoir - gains Village
+KeyNoir - draws Estate, Library, Moat, Copper
+KeyNoir - shuffles deck
+KeyNoir - draws Copper
+ 
+---------- Lady Sarra: turn 14 ----------
+Lady Sarra - plays Spy
+KeyNoir - reveals reaction Moat
+Lady Sarra - shuffles deck
+Lady Sarra - draws Workshop
+Lady Sarra - discards Estate
+Lady Sarra - plays Workshop
+Lady Sarra - gains Throne Room
+Lady Sarra - plays 2 Copper, 1 Gold
+Lady Sarra - buys Market
+Lady Sarra - gains Market
+Lady Sarra - draws Spy, Copper, Estate, Estate, Gold
+ 
+---------- KeyNoir: turn 14 ----------
+KeyNoir - plays Library
+KeyNoir - discards Village
+KeyNoir - discards Spy
+KeyNoir - discards Thief
+KeyNoir - draws Copper
+KeyNoir - discards Village
+KeyNoir - draws Copper
+KeyNoir - draws Copper
+KeyNoir - discards: Village, Spy, Thief, Village
+KeyNoir - plays 5 Copper
+KeyNoir - buys Market
+KeyNoir - gains Market
+KeyNoir - draws Market, Estate, Estate, Market, Copper
+ 
+---------- Lady Sarra: turn 15 ----------
+Lady Sarra - plays Spy
+Lady Sarra - draws Copper
+Lady Sarra - places Gold on top of deck
+KeyNoir - discards Gold
+Lady Sarra - plays 2 Copper, 1 Gold
+Lady Sarra - buys Market
+Lady Sarra - gains Market
+Lady Sarra - draws Gold, Province, Province, Province, Throne Room
+ 
+---------- KeyNoir: turn 15 ----------
+KeyNoir - plays Market
+KeyNoir - draws Throne Room
+KeyNoir - plays Throne Room
+KeyNoir - plays Market
+KeyNoir - draws Moat
+KeyNoir - plays Market
+KeyNoir - draws Village
+KeyNoir - plays Village
+KeyNoir - draws Copper
+KeyNoir - plays Moat
+KeyNoir - draws Throne Room
+KeyNoir - shuffles deck
+KeyNoir - draws Copper
+KeyNoir - plays Throne Room
+KeyNoir - plays 3 Copper
+KeyNoir - buys Gold
+KeyNoir - gains Gold
+KeyNoir - draws Spy, Library, Thief, Moat, Copper
+ 
+---------- Lady Sarra: turn 16 ----------
+Lady Sarra - plays 1 Gold
+Lady Sarra - buys Village
+Lady Sarra - gains Village
+Lady Sarra - draws Copper, Silver, Spy, Gold, Copper
+ 
+---------- KeyNoir: turn 16 ----------
+KeyNoir - plays Spy
+KeyNoir - draws Estate
+KeyNoir - discards Copper
+Lady Sarra - discards Gold
+KeyNoir - plays Library
+KeyNoir - draws Copper
+KeyNoir - discards Village
+KeyNoir - discards Market
+KeyNoir - discards Village
+KeyNoir - draws Gold
+KeyNoir - draws Copper
+KeyNoir - discards: Village, Market, Village
+KeyNoir - plays 3 Copper, 1 Gold
+KeyNoir - buys Gold
+KeyNoir - gains Gold
+KeyNoir - shuffles deck
+KeyNoir - draws Estate, Throne Room, Library, Copper, Moat
+ 
+---------- Lady Sarra: turn 17 ----------
+Lady Sarra - plays Spy
+KeyNoir - reveals reaction Moat
+Lady Sarra - shuffles deck
+Lady Sarra - draws Estate
+Lady Sarra - places Village on top of deck
+Lady Sarra - plays 2 Copper, 1 Silver, 1 Gold
+Lady Sarra - buys Gold
+Lady Sarra - gains Gold
+Lady Sarra - draws Village, Estate, Copper, Gold, Throne Room
+ 
+---------- KeyNoir: turn 17 ----------
+KeyNoir - plays Throne Room
+KeyNoir - plays Moat
+KeyNoir - draws Copper, Gold
+KeyNoir - plays Moat
+KeyNoir - draws Copper, Village
+KeyNoir - plays 3 Copper, 1 Gold
+KeyNoir - buys Gold
+KeyNoir - gains Gold
+KeyNoir - draws Moat, Estate, Market, Estate, Thief
+ 
+---------- Lady Sarra: turn 18 ----------
+Lady Sarra - plays Throne Room
+Lady Sarra - plays Village
+Lady Sarra - draws Province
+Lady Sarra - plays Village
+Lady Sarra - draws Workshop
+Lady Sarra - plays Workshop
+Lady Sarra - gains Spy
+Lady Sarra - plays 1 Copper, 1 Gold
+Lady Sarra - buys Throne Room
+Lady Sarra - gains Throne Room
+Lady Sarra - draws Copper, Copper, Gold, Market, Province
+ 
+---------- KeyNoir: turn 18 ----------
+KeyNoir - plays Market
+KeyNoir - draws Spy
+KeyNoir - plays Spy
+KeyNoir - draws Gold
+KeyNoir - discards Copper
+Lady Sarra - places Copper on top of deck
+KeyNoir - plays Moat
+KeyNoir - draws Copper, Market
+KeyNoir - plays 1 Gold, 1 Copper
+KeyNoir - buys Market
+KeyNoir - gains Market
+KeyNoir - draws Village, Village, Market, Gold, Throne Room
+ 
+---------- Lady Sarra: turn 19 ----------
+Lady Sarra - plays Market
+Lady Sarra - draws Copper
+Lady Sarra - plays 3 Copper, 1 Gold
+Lady Sarra - buys Throne Room
+Lady Sarra - gains Throne Room
+Lady Sarra - buys Village
+Lady Sarra - gains Village
+Lady Sarra - draws Spy, Province, Gold, Throne Room, Spy
+ 
+---------- KeyNoir: turn 19 ----------
+KeyNoir - plays Throne Room
+KeyNoir - plays Village
+KeyNoir - draws Copper
+KeyNoir - plays Village
+KeyNoir - draws Copper
+KeyNoir - plays Village
+KeyNoir - shuffles deck
+KeyNoir - draws Spy
+KeyNoir - plays Spy
+KeyNoir - draws Copper
+KeyNoir - places Moat on top of deck
+Lady Sarra - discards Market
+KeyNoir - plays Market
+KeyNoir - draws Moat
+KeyNoir - plays Moat
+KeyNoir - draws Market, Market
+KeyNoir - plays Market
+KeyNoir - draws Copper
+KeyNoir - plays Market
+KeyNoir - draws Moat
+KeyNoir - plays Moat
+KeyNoir - draws Copper, Throne Room
+KeyNoir - plays Throne Room
+KeyNoir - plays 5 Copper, 1 Gold
+KeyNoir - buys Province
+KeyNoir - gains Province
+KeyNoir - buys Village
+KeyNoir - gains Village
+KeyNoir - draws Library, Copper, Gold, Estate, Copper
+ 
+---------- Lady Sarra: turn 20 ----------
+Lady Sarra - plays Throne Room
+Lady Sarra - plays Spy
+Lady Sarra - draws Gold
+Lady Sarra - places Workshop on top of deck
+KeyNoir - discards Gold
+Lady Sarra - plays Spy
+Lady Sarra - draws Workshop
+Lady Sarra - discards Estate
+KeyNoir - places Estate on top of deck
+Lady Sarra - plays Spy
+Lady Sarra - shuffles deck
+Lady Sarra - draws Spy
+Lady Sarra - discards Copper
+KeyNoir - places Estate on top of deck
+Lady Sarra - plays Spy
+Lady Sarra - draws Spy
+Lady Sarra - discards Copper
+KeyNoir - places Estate on top of deck
+Lady Sarra - plays Spy
+Lady Sarra - draws Province
+Lady Sarra - discards Copper
+KeyNoir - places Estate on top of deck
+Lady Sarra - plays Workshop
+Lady Sarra - gains Throne Room
+Lady Sarra - plays 2 Gold
+Lady Sarra - buys Gold
+Lady Sarra - gains Gold
+Lady Sarra - draws Gold, Copper, Copper, Throne Room, Estate
+ 
+---------- KeyNoir: turn 20 ----------
+KeyNoir - plays Library
+KeyNoir - draws Estate
+KeyNoir - discards Thief
+KeyNoir - draws Gold
+KeyNoir - discards Village
+KeyNoir - discards Market
+KeyNoir - draws Estate
+KeyNoir - discards: Thief, Village, Market
+KeyNoir - plays 2 Copper, 2 Gold
+KeyNoir - buys Province
+KeyNoir - gains Province
+KeyNoir - shuffles deck
+KeyNoir - draws Market, Copper, Thief, Village, Market
+ 
+---------- Lady Sarra: turn 21 ----------
+Lady Sarra - plays 2 Copper, 1 Gold
+Lady Sarra - buys Duchy
+Lady Sarra - gains Duchy
+Lady Sarra - draws Copper, Silver, Gold, Throne Room, Workshop
+ 
+---------- KeyNoir: turn 21 ----------
+KeyNoir - plays Village
+KeyNoir - draws Copper
+KeyNoir - plays Market
+KeyNoir - draws Estate
+KeyNoir - plays Market
+KeyNoir - draws Gold
+KeyNoir - plays Thief
+Lady Sarra - reveals: Estate, Gold
+KeyNoir - trashes Gold
+Lady Sarra - discards Estate
+KeyNoir - gains Gold
+KeyNoir - plays 2 Copper, 1 Gold
+KeyNoir - buys Duchy
+KeyNoir - gains Duchy
+KeyNoir - buys Moat
+KeyNoir - gains Moat
+KeyNoir - draws Market, Throne Room, Estate, Throne Room, Moat
+ 
+---------- Lady Sarra: turn 22 ----------
+Lady Sarra - plays Throne Room
+Lady Sarra - plays Workshop
+Lady Sarra - gains Spy
+Lady Sarra - plays Workshop
+Lady Sarra - gains Spy
+Lady Sarra - plays 1 Copper, 1 Silver, 1 Gold
+Lady Sarra - buys Duchy
+Lady Sarra - gains Duchy
+Lady Sarra - draws Gold, Market, Village, Market, Throne Room
+ 
+---------- KeyNoir: turn 22 ----------
+KeyNoir - plays Throne Room
+KeyNoir - plays Throne Room
+KeyNoir - plays Market
+KeyNoir - draws Village
+KeyNoir - plays Market
+KeyNoir - draws Village
+KeyNoir - plays Throne Room
+KeyNoir - plays Moat
+KeyNoir - draws Estate, Market
+KeyNoir - plays Moat
+KeyNoir - draws Spy, Library
+KeyNoir - plays Village
+KeyNoir - draws Province
+KeyNoir - plays Village
+KeyNoir - draws Copper
+KeyNoir - plays Market
+KeyNoir - draws Province
+KeyNoir - plays Spy
+KeyNoir - draws Village
+KeyNoir - discards Copper
+Lady Sarra - places Estate on top of deck
+KeyNoir - plays Village
+KeyNoir - draws Gold
+KeyNoir - plays Library
+KeyNoir - draws Gold
+KeyNoir - plays 2 Gold, 1 Copper
+KeyNoir - buys Province
+KeyNoir - gains Province
+KeyNoir - buys Moat
+KeyNoir - gains Moat
+KeyNoir - draws Copper, Moat, Copper, Copper, Gold
+ 
+---------- Lady Sarra: turn 23 ----------
+Lady Sarra - plays Throne Room
+Lady Sarra - plays Market
+Lady Sarra - draws Estate
+Lady Sarra - plays Market
+Lady Sarra - draws Village
+Lady Sarra - plays Village
+Lady Sarra - draws Province
+Lady Sarra - plays Village
+Lady Sarra - shuffles deck
+Lady Sarra - draws Gold
+Lady Sarra - plays Market
+Lady Sarra - draws Gold
+Lady Sarra - plays 3 Gold
+Lady Sarra - buys Province
+Lady Sarra - gains Province
+Lady Sarra - buys Estate
+Lady Sarra - gains Estate
+Lady Sarra - buys Estate
+Lady Sarra - gains Estate
+Lady Sarra - draws Province, Spy, Throne Room, Gold, Duchy
+ 
+---------- KeyNoir: turn 23 ----------
+KeyNoir - plays Moat
+KeyNoir - shuffles deck
+KeyNoir - draws Village, Thief
+KeyNoir - plays 3 Copper, 1 Gold
+KeyNoir - buys Duchy
+KeyNoir - gains Duchy
+KeyNoir - draws Gold, Moat, Copper, Market, Province
+ 
+---------- Lady Sarra: turn 24 ----------
+Lady Sarra - plays Throne Room
+Lady Sarra - plays Spy
+KeyNoir - reveals reaction Moat
+Lady Sarra - draws Copper
+Lady Sarra - places Spy on top of deck
+Lady Sarra - plays Spy
+KeyNoir - reveals reaction Moat
+Lady Sarra - draws Spy
+Lady Sarra - discards Copper
+Lady Sarra - plays Spy
+KeyNoir - reveals reaction Moat
+Lady Sarra - draws Silver
+Lady Sarra - discards Copper
+Lady Sarra - plays 1 Gold, 1 Copper, 1 Silver
+Lady Sarra - buys Duchy
+Lady Sarra - gains Duchy
+Lady Sarra - draws Spy, Copper, Throne Room, Province, Throne Room
+ 
+---------- KeyNoir: turn 24 ----------
+KeyNoir - plays Market
+KeyNoir - draws Market
+KeyNoir - plays Market
+KeyNoir - draws Market
+KeyNoir - plays Market
+KeyNoir - draws Library
+KeyNoir - plays Library
+KeyNoir - draws Estate
+KeyNoir - discards Moat
+KeyNoir - draws Gold
+KeyNoir - discards Spy
+KeyNoir - draws Province
+KeyNoir - discards: Moat, Spy
+KeyNoir - plays 2 Gold, 1 Copper
+KeyNoir - buys Province
+KeyNoir - gains Province
+KeyNoir - buys Estate
+KeyNoir - gains Estate
+KeyNoir - draws Province, Duchy, Copper, Village, Village
+ 
+------------ Game Over ------------
+Lady Sarra - cards: 6 Spy, 5 Throne Room, 2 Workshop, 2 Village, 2 Market, 6 Copper, 6 Gold, 1 Silver, 5 Estate, 4 Province, 3 Duchy
+Lady Sarra - total victory points: 38
+Lady Sarra - turns: 24
+ 
+KeyNoir - cards: 4 Village, 4 Moat, 4 Market, 2 Throne Room, 1 Library, 1 Thief, 1 Spy, 7 Copper, 5 Gold, 4 Estate, 4 Province, 2 Duchy
+KeyNoir - total victory points: 34
+KeyNoir - turns: 24
+ 
+1st place: Lady Sarra
+2nd place: KeyNoir
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.50a6c1abe4b03214bb7822e9.1365829398920.txt b/testing/testdata/log.50a6c1abe4b03214bb7822e9.1365829398920.txt
new file mode 100644
index 0000000..f386827
--- /dev/null
+++ b/testing/testdata/log.50a6c1abe4b03214bb7822e9.1365829398920.txt
@@ -0,0 +1,942 @@
+------------ Game Setup ------------
+Supply cards: Pawn, Oasis, Bishop, Ironworks, Talisman, Golem, Torturer, Trading Post, Treasury, Possession, Copper, Silver, Gold, Estate, Duchy, Province, Curse, Potion
+michaeljb - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Francis Campeau - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+michaeljb - shuffles deck
+Francis Campeau - shuffles deck
+michaeljb - draws Estate, Copper, Estate, Copper, Copper
+Francis Campeau - draws Estate, Copper, Estate, Estate, Copper
+ 
+---------- michaeljb: turn 1 ----------
+michaeljb - plays 3 Copper
+michaeljb - buys Oasis
+michaeljb - gains Oasis
+michaeljb - draws Copper, Copper, Estate, Copper, Copper
+ 
+---------- Francis Campeau: turn 1 ----------
+Francis Campeau - plays Copper
+Francis Campeau - plays Copper
+Francis Campeau - buys Pawn
+Francis Campeau - gains Pawn
+Francis Campeau - draws Copper, Copper, Copper, Copper, Copper
+ 
+---------- michaeljb: turn 2 ----------
+michaeljb - plays 4 Copper
+michaeljb - buys Bishop
+michaeljb - gains Bishop
+michaeljb - shuffles deck
+michaeljb - draws Copper, Copper, Copper, Copper, Estate
+ 
+---------- Francis Campeau: turn 2 ----------
+Francis Campeau - plays Copper
+Francis Campeau - plays Copper
+Francis Campeau - plays Copper
+Francis Campeau - plays Copper
+Francis Campeau - plays Copper
+Francis Campeau - buys Treasury
+Francis Campeau - gains Treasury
+Francis Campeau - shuffles deck
+Francis Campeau - draws Estate, Copper, Copper, Estate, Treasury
+ 
+---------- michaeljb: turn 3 ----------
+michaeljb - plays 4 Copper
+michaeljb - buys Potion
+michaeljb - gains Potion
+michaeljb - draws Bishop, Oasis, Estate, Estate, Copper
+ 
+---------- Francis Campeau: turn 3 ----------
+Francis Campeau - plays Treasury
+Francis Campeau - draws Copper
+Francis Campeau - plays Copper
+Francis Campeau - plays Copper
+Francis Campeau - plays Copper
+Francis Campeau - buys Talisman
+Francis Campeau - gains Talisman
+Francis Campeau - places Treasury on top of deck
+Francis Campeau - draws Treasury, Copper, Copper, Copper, Copper
+ 
+---------- michaeljb: turn 4 ----------
+michaeljb - plays Oasis
+michaeljb - draws Copper
+michaeljb - discards Estate
+michaeljb - plays Bishop
+michaeljb - trashes Estate
+michaeljb - receives 1 victory point chips
+Francis Campeau - trashes Copper
+michaeljb - plays 2 Copper
+michaeljb - buys Silver
+michaeljb - gains Silver
+michaeljb - draws Copper
+michaeljb - shuffles deck
+michaeljb - draws Copper, Bishop, Estate, Copper
+ 
+---------- Francis Campeau: turn 4 ----------
+Francis Campeau - plays Treasury
+Francis Campeau - draws Pawn
+Francis Campeau - plays Pawn
+Francis Campeau - takes 1 coin
+Francis Campeau - draws Estate
+Francis Campeau - plays Copper
+Francis Campeau - plays Copper
+Francis Campeau - plays Copper
+Francis Campeau - buys Torturer
+Francis Campeau - gains Torturer
+Francis Campeau - places Treasury on top of deck
+Francis Campeau - draws Treasury
+Francis Campeau - shuffles deck
+Francis Campeau - draws Copper, Copper, Copper, Estate
+ 
+---------- michaeljb: turn 5 ----------
+michaeljb - plays Bishop
+michaeljb - trashes Estate
+michaeljb - receives 1 victory point chips
+Francis Campeau - trashes Copper
+michaeljb - plays 3 Copper
+michaeljb - buys Silver
+michaeljb - gains Silver
+michaeljb - draws Silver, Potion, Copper, Estate, Copper
+ 
+---------- Francis Campeau: turn 5 ----------
+Francis Campeau - plays Treasury
+Francis Campeau - draws Talisman
+Francis Campeau - plays Copper
+Francis Campeau - plays Talisman
+Francis Campeau - plays Copper
+Francis Campeau - buys Silver
+Francis Campeau - gains Silver
+Francis Campeau - gains Silver
+Francis Campeau - places Treasury on top of deck
+Francis Campeau - draws Treasury, Estate, Copper, Torturer, Copper
+ 
+---------- michaeljb: turn 6 ----------
+michaeljb - plays 2 Copper, 1 Silver, 1 Potion
+michaeljb - buys Golem
+michaeljb - gains Golem
+michaeljb - draws Copper, Copper, Oasis
+michaeljb - shuffles deck
+michaeljb - draws Silver, Potion
+ 
+---------- Francis Campeau: turn 6 ----------
+Francis Campeau - plays Treasury
+Francis Campeau - draws Copper
+Francis Campeau - plays Torturer
+Francis Campeau - draws Pawn, Estate
+Francis Campeau - shuffles deck
+Francis Campeau - draws Copper
+michaeljb - gains Curse
+Francis Campeau - plays Copper
+Francis Campeau - plays Copper
+Francis Campeau - plays Copper
+Francis Campeau - plays Copper
+Francis Campeau - buys Ironworks
+Francis Campeau - gains Ironworks
+Francis Campeau - places Treasury on top of deck
+Francis Campeau - draws Treasury, Talisman, Silver, Estate, Silver
+ 
+---------- michaeljb: turn 7 ----------
+michaeljb - plays Oasis
+michaeljb - draws Estate
+michaeljb - discards Curse
+michaeljb - plays 2 Copper, 1 Silver, 1 Potion
+michaeljb - buys Torturer
+michaeljb - gains Torturer
+michaeljb - draws Copper, Copper, Copper, Copper, Bishop
+ 
+---------- Francis Campeau: turn 7 ----------
+Francis Campeau - plays Treasury
+Francis Campeau - draws Copper
+Francis Campeau - plays Talisman
+Francis Campeau - plays Silver
+Francis Campeau - plays Silver
+Francis Campeau - plays Copper
+Francis Campeau - buys Gold
+Francis Campeau - gains Gold
+Francis Campeau - places Treasury on top of deck
+Francis Campeau - draws Treasury
+Francis Campeau - shuffles deck
+Francis Campeau - draws Ironworks, Copper, Copper, Pawn
+ 
+---------- michaeljb: turn 8 ----------
+michaeljb - plays Bishop
+michaeljb - trashes Copper
+michaeljb - receives 0 victory point chips
+Francis Campeau - trashes Copper
+michaeljb - plays 3 Copper
+michaeljb - buys Silver
+michaeljb - gains Silver
+michaeljb - draws Copper, Silver, Golem
+michaeljb - shuffles deck
+michaeljb - draws Estate, Copper
+ 
+---------- Francis Campeau: turn 8 ----------
+Francis Campeau - plays Treasury
+Francis Campeau - draws Estate
+Francis Campeau - plays Pawn
+Francis Campeau - takes 1 action
+Francis Campeau - draws Silver
+Francis Campeau - plays Ironworks
+Francis Campeau - gains Silver
+Francis Campeau - plays Silver
+Francis Campeau - plays Copper
+Francis Campeau - buys Torturer
+Francis Campeau - gains Torturer
+Francis Campeau - places Treasury on top of deck
+Francis Campeau - draws Treasury, Copper, Estate, Talisman, Copper
+ 
+---------- michaeljb: turn 9 ----------
+michaeljb - plays Golem
+michaeljb - reveals Torturer, Curse, Oasis
+michaeljb - discards Curse
+michaeljb - plays Torturer
+michaeljb - draws Copper, Silver, Potion
+Francis Campeau - discards Estate
+Francis Campeau - discards Copper
+michaeljb - plays Oasis
+michaeljb - draws Silver
+michaeljb - discards Estate
+michaeljb - plays 3 Copper, 3 Silver, 1 Potion
+michaeljb - buys Possession
+michaeljb - gains Possession
+michaeljb - draws Copper, Bishop, Copper, Copper
+michaeljb - shuffles deck
+michaeljb - draws Possession
+ 
+---------- Francis Campeau: turn 9 ----------
+Francis Campeau - plays Treasury
+Francis Campeau - draws Silver
+Francis Campeau - plays Silver
+Francis Campeau - plays Talisman
+Francis Campeau - plays Copper
+Francis Campeau - buys Potion
+Francis Campeau - gains Potion
+Francis Campeau - gains Potion
+Francis Campeau - places Treasury on top of deck
+Francis Campeau - draws Treasury, Gold, Torturer, Estate, Copper
+ 
+---------- michaeljb: turn 10 ----------
+michaeljb - plays Possession
+michaeljb - plays 3 Copper
+michaeljb - buys Pawn
+michaeljb - gains Pawn
+michaeljb - draws Potion, Silver, Oasis, Golem, Estate
+ 
+---------- Francis Campeau: turn 10 [possessed] ----------
+Francis Campeau - plays Treasury
+Francis Campeau - shuffles deck
+Francis Campeau - draws Copper
+Francis Campeau - plays 2 Copper, 1 Gold
+Francis Campeau - buys Torturer
+michaeljb - gains Torturer
+Francis Campeau - discards Treasury
+Francis Campeau - draws Talisman, Silver, Copper, Torturer, Ironworks
+ 
+---------- Francis Campeau: turn 10 ----------
+Francis Campeau - plays Ironworks
+Francis Campeau - gains Oasis
+Francis Campeau - plays Torturer
+Francis Campeau - draws Silver, Potion, Pawn
+michaeljb - gains Curse
+Francis Campeau - plays Potion
+Francis Campeau - plays Silver
+Francis Campeau - plays Copper
+Francis Campeau - plays Silver
+Francis Campeau - plays Talisman
+Francis Campeau - buys Possession
+Francis Campeau - gains Possession
+Francis Campeau - draws Silver, Estate, Estate, Copper, Potion
+ 
+---------- michaeljb: turn 11 ----------
+michaeljb - plays Oasis
+michaeljb - draws Curse
+michaeljb - discards Curse
+michaeljb - plays Golem
+michaeljb - shuffles deck
+michaeljb - reveals Copper, Copper, Torturer, Copper, Silver, Silver, Copper, Pawn
+michaeljb - discards: Copper, Copper, Copper, Silver, Silver, Copper
+michaeljb - plays Torturer
+michaeljb - draws Possession, Bishop, Curse
+Francis Campeau - discards Estate
+Francis Campeau - discards Copper
+michaeljb - plays Pawn
+michaeljb - takes 1 action
+michaeljb - takes 1 coin
+michaeljb - plays Possession
+michaeljb - plays 1 Potion, 1 Silver
+michaeljb - buys Golem
+michaeljb - gains Golem
+michaeljb - draws Copper, Torturer, Copper
+michaeljb - shuffles deck
+michaeljb - draws Copper, Golem
+ 
+---------- Francis Campeau: turn 11 [possessed] ----------
+Francis Campeau - plays 1 Silver, 1 Potion
+Francis Campeau - buys Pawn
+michaeljb - gains Pawn
+Francis Campeau - shuffles deck
+Francis Campeau - draws Copper, Potion, Possession, Estate, Copper
+ 
+---------- Francis Campeau: turn 11 ----------
+Francis Campeau - plays Possession
+Francis Campeau - plays Copper
+Francis Campeau - plays Potion
+Francis Campeau - plays Copper
+Francis Campeau - draws Treasury, Estate, Potion, Gold, Oasis
+ 
+---------- michaeljb: turn 12 [possessed] ----------
+michaeljb - plays Copper
+michaeljb - plays Copper
+michaeljb - plays Copper
+michaeljb - buys Curse
+Francis Campeau - gains Curse
+michaeljb - draws Golem, Torturer, Silver, Copper, Possession
+ 
+---------- michaeljb: turn 12 ----------
+michaeljb - plays Golem
+michaeljb - reveals Oasis, Potion, Curse, Estate, Copper, Silver, Copper, Bishop
+michaeljb - discards: Potion, Curse, Estate, Copper, Silver, Copper
+michaeljb - plays Oasis
+michaeljb - draws Silver
+michaeljb - discards Possession
+michaeljb - plays Bishop
+michaeljb - trashes Copper
+michaeljb - receives 0 victory point chips
+Francis Campeau - trashes Treasury
+michaeljb - plays Torturer
+michaeljb - draws Pawn, Curse
+michaeljb - shuffles deck
+michaeljb - draws Copper
+Francis Campeau - discards Estate
+Francis Campeau - discards Potion
+michaeljb - plays 2 Silver, 1 Copper
+michaeljb - buys Treasury
+michaeljb - gains Treasury
+michaeljb - draws Copper, Pawn, Curse, Torturer, Copper
+ 
+---------- Francis Campeau: turn 12 ----------
+Francis Campeau - plays Oasis
+Francis Campeau - draws Torturer
+Francis Campeau - discards Torturer
+Francis Campeau - plays 1 Gold
+Francis Campeau - buys Potion
+Francis Campeau - gains Potion
+Francis Campeau - draws Copper, Pawn, Talisman, Copper, Ironworks
+ 
+---------- michaeljb: turn 13 ----------
+michaeljb - plays Pawn
+michaeljb - takes 1 action
+michaeljb - takes 1 coin
+michaeljb - plays Torturer
+michaeljb - draws Golem, Possession, Estate
+Francis Campeau - discards Ironworks
+Francis Campeau - discards Copper
+michaeljb - plays 2 Copper
+michaeljb - buys Pawn
+michaeljb - gains Pawn
+michaeljb - draws Silver, Copper, Potion, Copper
+michaeljb - shuffles deck
+michaeljb - draws Torturer
+ 
+---------- Francis Campeau: turn 13 ----------
+Francis Campeau - plays Pawn
+Francis Campeau - takes 1 coin
+Francis Campeau - draws Silver
+Francis Campeau - plays Silver
+Francis Campeau - plays Talisman
+Francis Campeau - plays Copper
+Francis Campeau - buys Trading Post
+Francis Campeau - gains Trading Post
+Francis Campeau - draws Estate, Silver, Silver, Torturer
+Francis Campeau - shuffles deck
+Francis Campeau - draws Potion
+ 
+---------- michaeljb: turn 14 ----------
+michaeljb - plays Torturer
+michaeljb - draws Silver, Golem, Copper
+Francis Campeau - gains Curse
+michaeljb - plays 3 Copper, 2 Silver, 1 Potion
+michaeljb - buys Possession
+michaeljb - gains Possession
+michaeljb - draws Golem, Treasury, Pawn, Possession, Estate
+ 
+---------- Francis Campeau: turn 14 ----------
+Francis Campeau - plays Torturer
+Francis Campeau - draws Pawn, Potion, Gold
+michaeljb - discards Estate
+michaeljb - discards Pawn
+Francis Campeau - plays Gold
+Francis Campeau - plays Potion
+Francis Campeau - plays Potion
+Francis Campeau - plays Silver
+Francis Campeau - plays Silver
+Francis Campeau - buys Golem
+Francis Campeau - gains Golem
+Francis Campeau - draws Potion, Silver, Torturer, Talisman, Curse
+ 
+---------- michaeljb: turn 15 ----------
+michaeljb - plays Treasury
+michaeljb - draws Curse
+michaeljb - plays Golem
+michaeljb - reveals Copper, Oasis, Pawn
+michaeljb - discards Copper
+michaeljb - plays Oasis
+michaeljb - draws Torturer
+michaeljb - discards Curse
+michaeljb - plays Pawn
+michaeljb - takes 1 action
+michaeljb - takes 1 coin
+michaeljb - plays Torturer
+michaeljb - draws Pawn, Curse, Copper
+Francis Campeau - discards Curse
+Francis Campeau - discards Talisman
+michaeljb - plays Pawn
+michaeljb - takes 1 action
+michaeljb - takes 1 coin
+michaeljb - plays Possession
+michaeljb - plays Copper
+michaeljb - buys Treasury
+michaeljb - gains Treasury
+michaeljb - places Treasury on top of deck
+michaeljb - draws Treasury, Bishop, Silver
+michaeljb - shuffles deck
+michaeljb - draws Torturer, Golem
+ 
+---------- Francis Campeau: turn 15 [possessed] ----------
+Francis Campeau - plays Torturer
+Francis Campeau - draws Copper, Oasis, Estate
+michaeljb - discards Bishop
+michaeljb - discards Silver
+Francis Campeau - plays 1 Potion, 1 Silver, 1 Copper
+Francis Campeau - buys Silver
+michaeljb - gains Silver
+Francis Campeau - draws Copper, Ironworks, Copper, Estate, Copper
+ 
+---------- Francis Campeau: turn 15 ----------
+Francis Campeau - plays Ironworks
+Francis Campeau - gains Silver
+Francis Campeau - plays Copper
+Francis Campeau - plays Copper
+Francis Campeau - plays Copper
+Francis Campeau - buys Bishop
+Francis Campeau - gains Bishop
+Francis Campeau - draws Trading Post, Possession
+Francis Campeau - shuffles deck
+Francis Campeau - draws Torturer, Bishop, Ironworks
+ 
+---------- michaeljb: turn 16 ----------
+michaeljb - plays Treasury
+michaeljb - draws Silver
+michaeljb - plays Golem
+michaeljb - reveals Curse, Possession, Copper, Copper, Curse, Treasury
+michaeljb - discards: Curse, Copper, Copper, Curse
+michaeljb - plays Treasury
+michaeljb - draws Pawn
+michaeljb - plays Possession
+michaeljb - plays Pawn
+michaeljb - takes 1 action
+michaeljb - takes 1 coin
+michaeljb - plays Torturer
+michaeljb - draws Oasis, Possession, Copper
+Francis Campeau - discards Bishop
+Francis Campeau - discards Possession
+michaeljb - plays 1 Silver, 1 Copper
+michaeljb - buys Duchy
+michaeljb - gains Duchy
+michaeljb - draws Copper, Potion, Torturer, Pawn, Pawn
+ 
+---------- Francis Campeau: turn 16 [possessed] ----------
+Francis Campeau - plays Trading Post
+Francis Campeau - trashes Torturer, Ironworks
+michaeljb - gains Silver
+Francis Campeau - draws Potion, Copper, Silver, Silver, Potion
+ 
+---------- Francis Campeau: turn 16 ----------
+Francis Campeau - plays Potion
+Francis Campeau - plays Silver
+Francis Campeau - plays Silver
+Francis Campeau - plays Copper
+Francis Campeau - plays Potion
+Francis Campeau - buys Golem
+Francis Campeau - gains Golem
+Francis Campeau - draws Estate, Silver, Gold, Oasis, Copper
+ 
+---------- michaeljb: turn 17 ----------
+michaeljb - plays Pawn
+michaeljb - takes 1 action
+michaeljb - takes 1 coin
+michaeljb - plays Pawn
+michaeljb - takes 1 action
+michaeljb - takes 1 coin
+michaeljb - plays Torturer
+michaeljb - draws Copper, Golem, Estate
+Francis Campeau - discards Copper
+Francis Campeau - discards Estate
+michaeljb - plays 2 Copper, 1 Potion
+michaeljb - buys Golem
+michaeljb - gains Golem
+michaeljb - draws Silver
+michaeljb - shuffles deck
+michaeljb - draws Estate, Golem, Golem, Copper
+ 
+---------- Francis Campeau: turn 17 ----------
+Francis Campeau - plays Oasis
+Francis Campeau - draws Pawn
+Francis Campeau - discards Pawn
+Francis Campeau - plays Gold
+Francis Campeau - plays Silver
+Francis Campeau - buys Duchy
+Francis Campeau - gains Duchy
+Francis Campeau - draws Torturer, Copper, Potion, Estate, Curse
+ 
+---------- michaeljb: turn 18 ----------
+michaeljb - plays Golem
+michaeljb - reveals Possession, Copper, Silver, Duchy, Silver, Pawn
+michaeljb - discards: Copper, Silver, Duchy, Silver
+michaeljb - plays Pawn
+michaeljb - takes 1 action
+michaeljb - draws Copper
+michaeljb - plays Possession
+michaeljb - plays Golem
+michaeljb - reveals Possession, Pawn
+michaeljb - plays Pawn
+michaeljb - takes 1 action
+michaeljb - draws Silver
+michaeljb - plays Possession
+michaeljb - plays 2 Silver, 2 Copper
+michaeljb - buys Duchy
+michaeljb - gains Duchy
+michaeljb - draws Pawn, Bishop, Golem, Curse, Treasury
+ 
+---------- Francis Campeau: turn 18 [possessed] ----------
+Francis Campeau - plays Torturer
+Francis Campeau - draws Talisman, Golem, Estate
+michaeljb - discards Curse
+michaeljb - discards Bishop
+Francis Campeau - plays 1 Copper, 1 Potion
+Francis Campeau - plays Talisman
+Francis Campeau - buys Pawn
+michaeljb - gains Pawn
+michaeljb - gains Pawn
+Francis Campeau - draws Copper, Silver, Curse
+Francis Campeau - shuffles deck
+Francis Campeau - draws Gold, Talisman
+ 
+---------- Francis Campeau: turn 18 [possessed] ----------
+Francis Campeau - plays 1 Copper, 1 Silver, 1 Gold
+Francis Campeau - buys Duchy
+michaeljb - gains Duchy
+Francis Campeau - draws Estate, Silver, Trading Post, Potion, Torturer
+ 
+---------- Francis Campeau: turn 18 ----------
+Francis Campeau - plays Torturer
+Francis Campeau - draws Estate, Curse, Potion
+michaeljb - gains Curse
+Francis Campeau - plays Potion
+Francis Campeau - plays Potion
+Francis Campeau - plays Silver
+Francis Campeau - buys Pawn
+Francis Campeau - gains Pawn
+Francis Campeau - draws Oasis, Copper, Ironworks, Potion, Torturer
+ 
+---------- michaeljb: turn 19 ----------
+michaeljb - plays Treasury
+michaeljb - draws Copper
+michaeljb - plays Pawn
+michaeljb - takes 1 coin
+michaeljb - takes 1 action
+michaeljb - plays Golem
+michaeljb - reveals Silver, Potion, Treasury, Curse, Torturer
+michaeljb - discards: Silver, Potion, Curse
+michaeljb - plays Treasury
+michaeljb - draws Copper
+michaeljb - plays Torturer
+michaeljb - draws Torturer, Oasis
+michaeljb - shuffles deck
+michaeljb - draws Curse
+Francis Campeau - discards Ironworks
+Francis Campeau - discards Potion
+michaeljb - plays Oasis
+michaeljb - draws Copper
+michaeljb - discards Curse
+michaeljb - plays Torturer
+michaeljb - draws Bishop, Golem, Silver
+Francis Campeau - gains Curse
+michaeljb - plays 3 Copper, 1 Silver
+michaeljb - buys Province
+michaeljb - gains Province
+michaeljb - draws Silver, Curse, Copper, Possession, Pawn
+ 
+---------- Francis Campeau: turn 19 ----------
+Francis Campeau - plays Oasis
+Francis Campeau - draws Possession
+Francis Campeau - discards Curse
+Francis Campeau - plays Possession
+Francis Campeau - plays Copper
+Francis Campeau - buys Pawn
+Francis Campeau - gains Pawn
+Francis Campeau - draws Silver, Duchy, Silver, Golem, Golem
+ 
+---------- michaeljb: turn 20 [possessed] ----------
+michaeljb - plays Pawn
+michaeljb - takes 1 action
+michaeljb - draws Copper
+michaeljb - plays Possession
+michaeljb - plays Copper
+michaeljb - plays Copper
+michaeljb - plays Silver
+michaeljb - buys Bishop
+Francis Campeau - gains Bishop
+michaeljb - draws Duchy, Silver, Silver, Golem, Potion
+ 
+---------- michaeljb: turn 20 ----------
+michaeljb - plays Golem
+michaeljb - reveals Possession, Pawn
+michaeljb - plays Pawn
+michaeljb - takes 1 coin
+michaeljb - draws Pawn
+michaeljb - plays Possession
+michaeljb - plays 2 Silver, 1 Potion
+michaeljb - buys Duchy
+michaeljb - gains Duchy
+michaeljb - draws Estate, Duchy, Pawn, Silver, Duchy
+ 
+---------- Francis Campeau: turn 20 [possessed] ----------
+Francis Campeau - plays 2 Silver
+Francis Campeau - buys Pawn
+michaeljb - gains Pawn
+Francis Campeau - draws Bishop, Estate, Copper, Copper, Pawn
+ 
+---------- Francis Campeau: turn 20 [possessed] ----------
+Francis Campeau - plays Pawn
+Francis Campeau - takes 1 action
+Francis Campeau - takes 1 coin
+Francis Campeau - plays Bishop
+Francis Campeau - trashes Estate
+Francis Campeau - receives 1 victory point chips
+michaeljb - trashes Estate
+Francis Campeau - plays 2 Copper
+Francis Campeau - buys Pawn
+michaeljb - gains Pawn
+Francis Campeau - shuffles deck
+Francis Campeau - draws Silver, Golem, Pawn, Pawn, Torturer
+ 
+---------- Francis Campeau: turn 20 ----------
+Francis Campeau - plays Pawn
+Francis Campeau - takes 1 action
+Francis Campeau - draws Silver
+Francis Campeau - plays Pawn
+Francis Campeau - takes 1 action
+Francis Campeau - draws Duchy
+Francis Campeau - plays Golem
+Francis Campeau - reveals Curse, Oasis, Ironworks
+Francis Campeau - discards Curse
+Francis Campeau - plays Ironworks
+Francis Campeau - gains Bishop
+Francis Campeau - plays Oasis
+Francis Campeau - draws Curse
+Francis Campeau - discards Curse
+Francis Campeau - plays Torturer
+Francis Campeau - draws Silver, Copper, Gold
+michaeljb - discards Duchy
+michaeljb - discards Duchy
+Francis Campeau - plays Gold
+Francis Campeau - plays Copper
+Francis Campeau - plays Silver
+Francis Campeau - plays Silver
+Francis Campeau - plays Silver
+Francis Campeau - buys Province
+Francis Campeau - gains Province
+Francis Campeau - draws Silver, Trading Post, Copper, Potion, Estate
+ 
+---------- michaeljb: turn 21 ----------
+michaeljb - plays Pawn
+michaeljb - takes 1 coin
+michaeljb - takes 1 buy
+michaeljb - plays Silver
+michaeljb - buys Silver
+michaeljb - gains Silver
+michaeljb - shuffles deck
+michaeljb - draws Curse, Silver, Curse, Treasury, Torturer
+ 
+---------- Francis Campeau: turn 21 ----------
+Francis Campeau - plays Trading Post
+Francis Campeau - trashes Copper, Estate
+Francis Campeau - gains Silver
+Francis Campeau - plays Silver
+Francis Campeau - plays Potion
+Francis Campeau - plays Silver
+Francis Campeau - buys Golem
+Francis Campeau - gains Golem
+Francis Campeau - draws Talisman, Potion, Copper, Bishop, Bishop
+ 
+---------- michaeljb: turn 22 ----------
+michaeljb - plays Treasury
+michaeljb - draws Silver
+michaeljb - plays Torturer
+michaeljb - draws Golem, Possession, Treasury
+Francis Campeau - discards Talisman
+Francis Campeau - discards Copper
+michaeljb - plays 2 Silver
+michaeljb - buys Duchy
+michaeljb - gains Duchy
+michaeljb - draws Silver, Pawn, Copper, Duchy, Possession
+ 
+---------- Francis Campeau: turn 22 ----------
+Francis Campeau - plays Bishop
+Francis Campeau - trashes Potion
+Francis Campeau - receives 2 victory point chips
+Francis Campeau - draws Copper, Curse, Potion, Possession, Estate
+ 
+---------- michaeljb: turn 23 ----------
+michaeljb - plays Pawn
+michaeljb - takes 1 action
+michaeljb - draws Potion
+michaeljb - plays Possession
+michaeljb - plays 1 Silver, 1 Copper, 1 Potion
+michaeljb - buys Estate
+michaeljb - gains Estate
+michaeljb - draws Oasis, Copper, Pawn, Duchy, Pawn
+ 
+---------- Francis Campeau: turn 23 [possessed] ----------
+Francis Campeau - draws Golem, Torturer, Pawn
+Francis Campeau - shuffles deck
+Francis Campeau - draws Silver, Curse
+ 
+---------- Francis Campeau: turn 23 ----------
+Francis Campeau - plays Pawn
+Francis Campeau - takes 1 action
+Francis Campeau - draws Potion
+Francis Campeau - plays Golem
+Francis Campeau - reveals Copper, Potion, Silver, Silver, Gold, Pawn, Golem, Estate, Bishop
+Francis Campeau - discards: Copper, Potion, Silver, Silver, Gold, Golem, Estate
+Francis Campeau - plays Pawn
+Francis Campeau - takes 1 action
+Francis Campeau - draws Duchy
+Francis Campeau - plays Bishop
+Francis Campeau - trashes Torturer
+Francis Campeau - receives 2 victory point chips
+Francis Campeau - plays Silver
+Francis Campeau - plays Potion
+Francis Campeau - buys Silver
+Francis Campeau - gains Silver
+Francis Campeau - draws Copper, Silver, Bishop, Bishop, Possession
+ 
+---------- michaeljb: turn 24 ----------
+michaeljb - plays Oasis
+michaeljb - draws Pawn
+michaeljb - discards Duchy
+michaeljb - plays Pawn
+michaeljb - takes 1 action
+michaeljb - takes 1 coin
+michaeljb - plays Pawn
+michaeljb - takes 1 coin
+michaeljb - takes 1 action
+michaeljb - plays Pawn
+michaeljb - takes 1 coin
+michaeljb - takes 1 buy
+michaeljb - plays Copper
+michaeljb - buys Duchy
+michaeljb - gains Duchy
+michaeljb - draws Silver, Pawn, Pawn, Curse, Duchy
+ 
+---------- Francis Campeau: turn 24 ----------
+Francis Campeau - plays Bishop
+Francis Campeau - trashes Possession
+Francis Campeau - receives 3 victory point chips
+michaeljb - trashes Curse
+Francis Campeau - plays Silver
+Francis Campeau - plays Copper
+Francis Campeau - buys Silver
+Francis Campeau - gains Silver
+Francis Campeau - draws Talisman, Pawn, Silver, Trading Post, Curse
+ 
+---------- michaeljb: turn 25 ----------
+michaeljb - plays Pawn
+michaeljb - takes 1 action
+michaeljb - takes 1 coin
+michaeljb - plays Pawn
+michaeljb - takes 1 coin
+michaeljb - draws Golem
+michaeljb - plays 1 Silver
+michaeljb - buys Estate
+michaeljb - gains Estate
+michaeljb - draws Silver, Duchy, Bishop, Silver, Copper
+ 
+---------- Francis Campeau: turn 25 ----------
+Francis Campeau - plays Pawn
+Francis Campeau - takes 1 action
+Francis Campeau - draws Ironworks
+Francis Campeau - plays Trading Post
+Francis Campeau - trashes Curse, Ironworks
+Francis Campeau - gains Silver
+Francis Campeau - plays Silver
+Francis Campeau - plays Silver
+Francis Campeau - plays Talisman
+Francis Campeau - buys Duchy
+Francis Campeau - gains Duchy
+Francis Campeau - draws Golem, Torturer, Curse, Province, Copper
+ 
+---------- michaeljb: turn 26 ----------
+michaeljb - plays Bishop
+michaeljb - trashes Silver
+michaeljb - receives 1 victory point chips
+Francis Campeau - trashes Curse
+michaeljb - plays 1 Silver, 1 Copper
+michaeljb - buys Estate
+michaeljb - gains Estate
+michaeljb - draws Torturer, Province, Copper, Copper, Pawn
+ 
+---------- Francis Campeau: turn 26 ----------
+Francis Campeau - plays Golem
+Francis Campeau - shuffles deck
+Francis Campeau - reveals Estate, Oasis, Duchy, Silver, Potion, Silver, Silver, Silver, Trading Post
+Francis Campeau - discards: Estate, Duchy, Silver, Potion, Silver, Silver, Silver
+Francis Campeau - plays Oasis
+Francis Campeau - draws Curse
+Francis Campeau - discards Province
+Francis Campeau - plays Trading Post
+Francis Campeau - trashes Curse, Copper
+Francis Campeau - gains Silver
+Francis Campeau - plays Torturer
+Francis Campeau - draws Bishop, Pawn, Bishop
+michaeljb - discards Province
+michaeljb - discards Copper
+Francis Campeau - plays Silver
+Francis Campeau - buys Estate
+Francis Campeau - gains Estate
+Francis Campeau - draws Talisman, Potion, Silver, Golem, Silver
+ 
+---------- michaeljb: turn 27 ----------
+michaeljb - plays Pawn
+michaeljb - takes 1 action
+michaeljb - takes 1 buy
+michaeljb - plays Torturer
+michaeljb - draws Golem
+michaeljb - shuffles deck
+michaeljb - draws Pawn, Potion
+Francis Campeau - gains Curse
+michaeljb - draws Pawn, Silver, Duchy, Golem, Possession
+ 
+---------- Francis Campeau: turn 27 ----------
+Francis Campeau - plays Golem
+Francis Campeau - reveals Copper, Silver, Bishop, Copper, Golem, Gold, Pawn
+Francis Campeau - discards: Copper, Silver, Copper, Golem, Gold
+Francis Campeau - plays Pawn
+Francis Campeau - takes 1 action
+Francis Campeau - draws Silver
+Francis Campeau - plays Bishop
+Francis Campeau - trashes Curse
+Francis Campeau - receives 0 victory point chips
+Francis Campeau - plays Silver
+Francis Campeau - plays Silver
+Francis Campeau - plays Potion
+Francis Campeau - plays Silver
+Francis Campeau - plays Talisman
+Francis Campeau - buys Province
+Francis Campeau - gains Province
+Francis Campeau - draws Estate, Pawn, Duchy
+Francis Campeau - shuffles deck
+Francis Campeau - draws Golem, Gold
+ 
+---------- michaeljb: turn 28 ----------
+michaeljb - plays Pawn
+michaeljb - takes 1 action
+michaeljb - draws Copper
+michaeljb - plays Golem
+michaeljb - reveals Duchy, Oasis, Golem, Possession
+michaeljb - discards: Duchy, Golem
+michaeljb - plays Oasis
+michaeljb - draws Curse
+michaeljb - discards Duchy
+michaeljb - plays Possession
+michaeljb - plays Possession
+michaeljb - plays 1 Silver, 1 Copper
+michaeljb - buys Estate
+michaeljb - gains Estate
+michaeljb - draws Estate, Copper, Treasury, Estate, Silver
+ 
+---------- Francis Campeau: turn 28 [possessed] ----------
+Francis Campeau - plays Pawn
+Francis Campeau - takes 1 action
+Francis Campeau - takes 1 coin
+Francis Campeau - plays Golem
+Francis Campeau - reveals Potion, Trading Post, Golem, Silver, Estate, Potion, Bishop
+Francis Campeau - discards: Potion, Golem, Silver, Estate, Potion
+Francis Campeau - plays Bishop
+Francis Campeau - trashes Estate
+Francis Campeau - receives 1 victory point chips
+Francis Campeau - plays Trading Post
+Francis Campeau - trashes Duchy, Gold
+michaeljb - gains Silver
+Francis Campeau - buys Estate
+michaeljb - gains Estate
+Francis Campeau - draws Silver, Talisman, Copper, Torturer, Pawn
+ 
+---------- Francis Campeau: turn 28 [possessed] ----------
+Francis Campeau - plays Pawn
+Francis Campeau - takes 1 action
+Francis Campeau - takes 1 coin
+Francis Campeau - plays Torturer
+Francis Campeau - draws Golem, Silver, Silver
+michaeljb - discards Estate
+michaeljb - discards Estate
+Francis Campeau - plays 3 Silver, 1 Copper
+Francis Campeau - buys Province
+michaeljb - gains Province
+Francis Campeau - draws Silver, Copper, Province, Pawn, Silver
+ 
+---------- Francis Campeau: turn 28 ----------
+Francis Campeau - plays Pawn
+Francis Campeau - takes 1 action
+Francis Campeau - draws Bishop
+Francis Campeau - plays Bishop
+Francis Campeau - trashes Copper
+Francis Campeau - receives 0 victory point chips
+Francis Campeau - plays Silver
+Francis Campeau - plays Silver
+Francis Campeau - buys Silver
+Francis Campeau - gains Silver
+Francis Campeau - draws Duchy, Silver, Bishop, Silver, Silver
+ 
+---------- michaeljb: turn 29 ----------
+michaeljb - plays Treasury
+michaeljb - draws Province
+michaeljb - plays 1 Copper, 1 Silver
+michaeljb - buys Estate
+michaeljb - gains Estate
+michaeljb - draws Pawn, Duchy, Duchy, Silver, Silver
+ 
+---------- Francis Campeau: turn 29 ----------
+Francis Campeau - plays Bishop
+Francis Campeau - trashes Silver
+Francis Campeau - receives 1 victory point chips
+Francis Campeau - plays Silver
+Francis Campeau - plays Silver
+Francis Campeau - buys Treasury
+Francis Campeau - gains Treasury
+Francis Campeau - draws Province, Oasis, Estate
+Francis Campeau - shuffles deck
+Francis Campeau - draws Silver, Silver
+ 
+---------- michaeljb: turn 30 ----------
+michaeljb - plays Pawn
+michaeljb - takes 1 coin
+michaeljb - draws Silver
+michaeljb - plays 3 Silver
+michaeljb - buys Estate
+michaeljb - gains Estate
+michaeljb - draws Copper, Estate, Treasury, Curse, Pawn
+ 
+------------ Game Over ------------
+michaeljb - cards: 7 Pawn, 3 Golem, 2 Treasury, 2 Torturer, 2 Possession, 1 Bishop, 1 Oasis, 6 Silver, 5 Copper, 1 Potion, 7 Estate, 6 Duchy, 2 Province, 2 Curse
+michaeljb - victory point chips: 8
+michaeljb - total victory points: 43
+michaeljb - turns: 30
+ 
+Francis Campeau - cards: 3 Pawn, 3 Golem, 3 Bishop, 1 Trading Post, 1 Oasis, 1 Torturer, 1 Treasury, 9 Silver, 2 Potion, 1 Copper, 1 Gold, 1 Talisman, 3 Estate, 2 Duchy, 2 Province
+Francis Campeau - victory point chips: 18
+Francis Campeau - total victory points: 39
+Francis Campeau - turns: 29
+ 
+1st place: michaeljb
+2nd place: Francis Campeau
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.50bbfdf8e4b07d338bca0e67.1364827084306.txt b/testing/testdata/log.50bbfdf8e4b07d338bca0e67.1364827084306.txt
new file mode 100644
index 0000000..91ab03c
--- /dev/null
+++ b/testing/testdata/log.50bbfdf8e4b07d338bca0e67.1364827084306.txt
@@ -0,0 +1,1083 @@
+------------ Game Setup ------------
+Supply cards: Loan, Masquerade, Storeroom, Trade Route, Bureaucrat, Fortress, Navigator, Nomad Camp, Hunting Party, Library, Copper, Silver, Gold, Estate, Duchy, Province, Curse
+Kerry Monroe - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Warlord Bot - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Villager Bot - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Conqueror Bot - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Kerry Monroe - shuffles deck
+Warlord Bot - shuffles deck
+Villager Bot - shuffles deck
+Conqueror Bot - shuffles deck
+Kerry Monroe - draws Copper, Copper, Copper, Copper, Copper
+Warlord Bot - draws Estate, Copper, Copper, Copper, Copper
+Villager Bot - draws Copper, Estate, Copper, Copper, Copper
+Conqueror Bot - draws Estate, Estate, Copper, Copper, Copper
+ 
+---------- Villager Bot: turn 1 ----------
+Villager Bot - plays 4 Copper
+Villager Bot - buys Bureaucrat
+Villager Bot - gains Bureaucrat
+Villager Bot - draws Estate, Copper, Estate, Copper, Copper
+ 
+---------- Conqueror Bot: turn 1 ----------
+Conqueror Bot - plays 3 Copper
+Conqueror Bot - buys Silver
+Conqueror Bot - gains Silver
+Conqueror Bot - draws Copper, Copper, Copper, Estate, Copper
+ 
+---------- Kerry Monroe: turn 1 ----------
+Kerry Monroe - plays 5 Copper
+Kerry Monroe - buys Library
+Kerry Monroe - gains Library
+Kerry Monroe - draws Copper, Estate, Estate, Copper, Estate
+ 
+---------- Warlord Bot: turn 1 ----------
+Warlord Bot - plays 4 Copper
+Warlord Bot - buys Bureaucrat
+Warlord Bot - gains Bureaucrat
+Warlord Bot - draws Copper, Copper, Estate, Estate, Copper
+ 
+---------- Villager Bot: turn 2 ----------
+Villager Bot - plays 3 Copper
+Villager Bot - buys Silver
+Villager Bot - gains Silver
+Villager Bot - shuffles deck
+Villager Bot - draws Copper, Estate, Estate, Bureaucrat, Silver
+ 
+---------- Conqueror Bot: turn 2 ----------
+Conqueror Bot - plays 4 Copper
+Conqueror Bot - buys Bureaucrat
+Conqueror Bot - gains Bureaucrat
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Copper, Estate, Copper, Copper, Bureaucrat
+ 
+---------- Kerry Monroe: turn 2 ----------
+Kerry Monroe - shuffles deck
+Kerry Monroe - draws Copper, Estate, Copper, Copper, Library
+ 
+---------- Warlord Bot: turn 2 ----------
+Warlord Bot - plays 3 Copper
+Warlord Bot - buys Masquerade
+Warlord Bot - gains Masquerade
+Warlord Bot - shuffles deck
+Warlord Bot - draws Copper, Estate, Copper, Bureaucrat, Estate
+ 
+---------- Villager Bot: turn 3 ----------
+Villager Bot - plays Bureaucrat
+Villager Bot - gains Silver
+Conqueror Bot - reveals Estate
+Conqueror Bot - places Estate on top of deck
+Kerry Monroe - reveals Estate
+Kerry Monroe - places Estate on top of deck
+Warlord Bot - reveals Estate
+Warlord Bot - places Estate on top of deck
+Villager Bot - plays 1 Copper, 1 Silver
+Villager Bot - buys Masquerade
+Villager Bot - gains Masquerade
+Villager Bot - draws Silver, Copper, Copper, Copper, Estate
+ 
+---------- Conqueror Bot: turn 3 ----------
+Conqueror Bot - plays Bureaucrat
+Conqueror Bot - gains Silver
+Kerry Monroe - reveals Copper, Copper, Copper, Library
+Warlord Bot - reveals Estate
+Warlord Bot - places Estate on top of deck
+Villager Bot - reveals Estate
+Villager Bot - places Estate on top of deck
+Conqueror Bot - plays 3 Copper
+Conqueror Bot - buys Masquerade
+Conqueror Bot - gains Masquerade
+Conqueror Bot - draws Silver, Estate, Copper, Copper, Estate
+ 
+---------- Kerry Monroe: turn 3 ----------
+Kerry Monroe - plays Library
+Kerry Monroe - draws Estate
+Kerry Monroe - draws Copper
+Kerry Monroe - draws Copper
+Kerry Monroe - draws Copper
+Kerry Monroe - plays 6 Copper
+Kerry Monroe - buys Gold
+Kerry Monroe - gains Gold
+Kerry Monroe - draws Estate, Copper, Estate
+Kerry Monroe - shuffles deck
+Kerry Monroe - draws Copper, Copper
+ 
+---------- Warlord Bot: turn 3 ----------
+Warlord Bot - plays Bureaucrat
+Warlord Bot - gains Silver
+Villager Bot - reveals Silver, Copper, Copper, Copper
+Conqueror Bot - reveals Estate
+Conqueror Bot - places Estate on top of deck
+Kerry Monroe - reveals Estate
+Kerry Monroe - places Estate on top of deck
+Warlord Bot - plays 2 Copper
+Warlord Bot - draws Silver, Estate, Estate, Copper, Copper
+ 
+---------- Villager Bot: turn 4 ----------
+Villager Bot - plays 3 Copper, 1 Silver
+Villager Bot - buys Fortress
+Villager Bot - gains Fortress
+Villager Bot - draws Estate, Copper, Copper, Copper
+Villager Bot - shuffles deck
+Villager Bot - draws Masquerade
+ 
+---------- Conqueror Bot: turn 4 ----------
+Conqueror Bot - plays 2 Copper, 1 Silver
+Conqueror Bot - buys Fortress
+Conqueror Bot - gains Fortress
+Conqueror Bot - draws Estate, Copper, Silver, Estate, Copper
+ 
+---------- Kerry Monroe: turn 4 ----------
+Kerry Monroe - plays 3 Copper
+Kerry Monroe - buys Masquerade
+Kerry Monroe - gains Masquerade
+Kerry Monroe - draws Estate, Gold, Estate, Copper, Copper
+ 
+---------- Warlord Bot: turn 4 ----------
+Warlord Bot - plays 2 Copper, 1 Silver
+Warlord Bot - buys Fortress
+Warlord Bot - gains Fortress
+Warlord Bot - draws Copper, Copper, Masquerade, Copper, Estate
+ 
+---------- Villager Bot: turn 5 ----------
+Villager Bot - plays Masquerade
+Villager Bot - draws Copper, Fortress
+Conqueror Bot - passes Copper
+Warlord Bot - passes Estate
+Villager Bot - passes Copper
+Kerry Monroe - passes Estate
+Villager Bot - trashes Copper
+Villager Bot - plays 2 Copper
+Villager Bot - draws Estate, Silver, Copper, Estate, Copper
+ 
+---------- Conqueror Bot: turn 5 ----------
+Conqueror Bot - plays 2 Copper, 1 Silver
+Conqueror Bot - buys Fortress
+Conqueror Bot - gains Fortress
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Estate, Copper, Bureaucrat, Silver, Estate
+ 
+---------- Kerry Monroe: turn 5 ----------
+Kerry Monroe - plays 3 Copper, 1 Gold
+Kerry Monroe - buys Gold
+Kerry Monroe - gains Gold
+Kerry Monroe - draws Copper, Copper, Library
+Kerry Monroe - shuffles deck
+Kerry Monroe - draws Estate, Estate
+ 
+---------- Warlord Bot: turn 5 ----------
+Warlord Bot - plays Masquerade
+Warlord Bot - shuffles deck
+Warlord Bot - draws Estate, Copper
+Warlord Bot - passes Estate
+Conqueror Bot - passes Copper
+Villager Bot - passes Estate
+Kerry Monroe - passes Estate
+Warlord Bot - trashes Estate
+Warlord Bot - plays 4 Copper
+Warlord Bot - buys Bureaucrat
+Warlord Bot - gains Bureaucrat
+Warlord Bot - draws Bureaucrat, Estate, Copper, Copper, Silver
+ 
+---------- Villager Bot: turn 6 ----------
+Villager Bot - plays 2 Copper, 1 Silver
+Villager Bot - buys Fortress
+Villager Bot - gains Fortress
+Villager Bot - draws Copper, Silver, Bureaucrat
+Villager Bot - shuffles deck
+Villager Bot - draws Copper, Estate
+ 
+---------- Conqueror Bot: turn 6 ----------
+Conqueror Bot - plays Bureaucrat
+Conqueror Bot - gains Silver
+Kerry Monroe - reveals Estate
+Kerry Monroe - places Estate on top of deck
+Warlord Bot - reveals Estate
+Warlord Bot - places Estate on top of deck
+Villager Bot - reveals Estate
+Villager Bot - places Estate on top of deck
+Conqueror Bot - plays 1 Silver
+Conqueror Bot - buys Estate
+Conqueror Bot - gains Estate
+Conqueror Bot - draws Silver, Silver, Copper, Estate, Fortress
+ 
+---------- Kerry Monroe: turn 6 ----------
+Kerry Monroe - plays Library
+Kerry Monroe - draws Estate
+Kerry Monroe - draws Copper
+Kerry Monroe - draws Gold
+Kerry Monroe - draws Gold
+Kerry Monroe - plays 4 Copper, 2 Gold
+Kerry Monroe - buys Province
+Kerry Monroe - gains Province
+Kerry Monroe - draws Copper, Masquerade, Copper, Copper, Copper
+ 
+---------- Warlord Bot: turn 6 ----------
+Warlord Bot - plays Bureaucrat
+Warlord Bot - gains Silver
+Villager Bot - reveals Copper, Silver, Bureaucrat, Copper
+Conqueror Bot - reveals Estate
+Conqueror Bot - places Estate on top of deck
+Kerry Monroe - reveals Copper, Masquerade, Copper, Copper, Copper
+Warlord Bot - plays 2 Copper, 1 Silver
+Warlord Bot - buys Fortress
+Warlord Bot - gains Fortress
+Warlord Bot - draws Silver, Estate, Fortress, Copper
+Warlord Bot - shuffles deck
+Warlord Bot - draws Bureaucrat
+ 
+---------- Villager Bot: turn 7 ----------
+Villager Bot - plays Bureaucrat
+Villager Bot - gains Silver
+Conqueror Bot - reveals Silver, Silver, Copper, Fortress
+Kerry Monroe - reveals Copper, Masquerade, Copper, Copper, Copper
+Warlord Bot - reveals Estate
+Warlord Bot - places Estate on top of deck
+Villager Bot - plays 2 Copper, 1 Silver
+Villager Bot - buys Fortress
+Villager Bot - gains Fortress
+Villager Bot - draws Silver, Estate, Masquerade, Estate, Fortress
+ 
+---------- Conqueror Bot: turn 7 ----------
+Conqueror Bot - plays Fortress
+Conqueror Bot - draws Estate
+Conqueror Bot - plays 2 Silver, 1 Copper
+Conqueror Bot - buys Hunting Party
+Conqueror Bot - gains Hunting Party
+Conqueror Bot - draws Copper, Fortress, Copper, Copper, Masquerade
+ 
+---------- Kerry Monroe: turn 7 ----------
+Kerry Monroe - plays Masquerade
+Kerry Monroe - draws Copper
+Kerry Monroe - shuffles deck
+Kerry Monroe - draws Copper
+Conqueror Bot - passes Copper
+Warlord Bot - passes Copper
+Villager Bot - passes Estate
+Kerry Monroe - passes Copper
+Kerry Monroe - plays 6 Copper
+Kerry Monroe - buys Gold
+Kerry Monroe - gains Gold
+Kerry Monroe - draws Copper, Estate, Copper, Gold, Province
+ 
+---------- Warlord Bot: turn 7 ----------
+Warlord Bot - plays Fortress
+Warlord Bot - draws Estate
+Warlord Bot - plays Bureaucrat
+Warlord Bot - gains Silver
+Villager Bot - reveals Estate
+Villager Bot - places Estate on top of deck
+Conqueror Bot - reveals Estate
+Conqueror Bot - places Estate on top of deck
+Kerry Monroe - reveals Estate
+Kerry Monroe - places Estate on top of deck
+Warlord Bot - plays 1 Silver, 1 Copper
+Warlord Bot - buys Silver
+Warlord Bot - gains Silver
+Warlord Bot - draws Silver, Copper, Copper, Copper, Copper
+ 
+---------- Villager Bot: turn 8 ----------
+Villager Bot - plays Fortress
+Villager Bot - draws Estate
+Villager Bot - plays Masquerade
+Villager Bot - draws Estate, Copper
+Conqueror Bot - passes Copper
+Villager Bot - passes Copper
+Warlord Bot - passes Copper
+Kerry Monroe - passes Copper
+Villager Bot - trashes Copper
+Villager Bot - plays 1 Silver, 1 Copper
+Villager Bot - buys Silver
+Villager Bot - gains Silver
+Villager Bot - draws Copper, Estate, Copper, Silver, Fortress
+ 
+---------- Conqueror Bot: turn 8 ----------
+Conqueror Bot - plays Fortress
+Conqueror Bot - draws Estate
+Conqueror Bot - plays Masquerade
+Conqueror Bot - draws Copper, Copper
+Warlord Bot - passes Copper
+Villager Bot - passes Copper
+Conqueror Bot - passes Copper
+Kerry Monroe - passes Copper
+Conqueror Bot - trashes Copper
+Conqueror Bot - plays 3 Copper
+Conqueror Bot - buys Trade Route
+Conqueror Bot - gains Trade Route
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Copper, Fortress, Estate, Copper, Estate
+ 
+---------- Kerry Monroe: turn 8 ----------
+Kerry Monroe - plays 2 Copper, 1 Gold
+Kerry Monroe - buys Hunting Party
+Kerry Monroe - gains Hunting Party
+Kerry Monroe - draws Estate, Library, Copper, Gold
+Kerry Monroe - shuffles deck
+Kerry Monroe - draws Copper
+ 
+---------- Warlord Bot: turn 8 ----------
+Warlord Bot - plays 4 Copper, 1 Silver
+Warlord Bot - buys Gold
+Warlord Bot - gains Gold
+Warlord Bot - draws Fortress, Copper, Bureaucrat, Masquerade, Silver
+ 
+---------- Villager Bot: turn 9 ----------
+Villager Bot - plays Fortress
+Villager Bot - shuffles deck
+Villager Bot - draws Masquerade
+Villager Bot - plays Masquerade
+Villager Bot - draws Copper, Silver
+Conqueror Bot - passes Copper
+Warlord Bot - passes Copper
+Villager Bot - passes Copper
+Kerry Monroe - passes Estate
+Villager Bot - trashes Copper
+Villager Bot - plays 2 Silver, 2 Copper
+Villager Bot - buys Gold
+Villager Bot - gains Gold
+Villager Bot - draws Estate, Silver, Bureaucrat, Fortress, Copper
+ 
+---------- Conqueror Bot: turn 9 ----------
+Conqueror Bot - plays Fortress
+Conqueror Bot - draws Bureaucrat
+Conqueror Bot - plays Bureaucrat
+Conqueror Bot - gains Silver
+Kerry Monroe - reveals Library, Copper, Gold, Copper, Copper
+Warlord Bot - reveals Estate
+Warlord Bot - places Estate on top of deck
+Villager Bot - reveals Estate
+Villager Bot - places Estate on top of deck
+Conqueror Bot - plays 2 Copper
+Conqueror Bot - buys Estate
+Conqueror Bot - gains Estate
+Conqueror Bot - draws Silver, Copper, Fortress, Hunting Party, Estate
+ 
+---------- Kerry Monroe: turn 9 ----------
+Kerry Monroe - plays Library
+Kerry Monroe - draws Copper
+Kerry Monroe - draws Copper
+Kerry Monroe - draws Gold
+Kerry Monroe - plays 5 Copper, 2 Gold
+Kerry Monroe - buys Province
+Kerry Monroe - gains Province
+Kerry Monroe - draws Copper, Copper, Province, Hunting Party, Copper
+ 
+---------- Warlord Bot: turn 9 ----------
+Warlord Bot - plays Fortress
+Warlord Bot - draws Estate
+Warlord Bot - plays Bureaucrat
+Warlord Bot - gains Silver
+Villager Bot - reveals Silver, Bureaucrat, Fortress, Copper
+Conqueror Bot - reveals Estate
+Conqueror Bot - places Estate on top of deck
+Kerry Monroe - reveals Province
+Kerry Monroe - places Province on top of deck
+Warlord Bot - plays Masquerade
+Warlord Bot - draws Silver, Copper
+Warlord Bot - passes Copper
+Conqueror Bot - passes Copper
+Villager Bot - passes Copper
+Kerry Monroe - passes Copper
+Warlord Bot - trashes Copper
+Warlord Bot - plays 2 Silver
+Warlord Bot - buys Fortress
+Warlord Bot - gains Fortress
+Warlord Bot - draws Estate
+Warlord Bot - shuffles deck
+Warlord Bot - draws Copper, Bureaucrat, Masquerade, Silver
+ 
+---------- Villager Bot: turn 10 ----------
+Villager Bot - plays Fortress
+Villager Bot - draws Estate
+Villager Bot - plays Bureaucrat
+Villager Bot - gains Silver
+Conqueror Bot - reveals Silver, Fortress, Hunting Party, Copper
+Kerry Monroe - reveals Copper, Copper, Hunting Party, Copper
+Warlord Bot - reveals Estate
+Warlord Bot - places Estate on top of deck
+Villager Bot - plays 1 Silver, 1 Copper
+Villager Bot - buys Trade Route
+Villager Bot - gains Trade Route
+Villager Bot - draws Silver, Silver, Fortress, Copper, Estate
+ 
+---------- Conqueror Bot: turn 10 ----------
+Conqueror Bot - plays Fortress
+Conqueror Bot - draws Estate
+Conqueror Bot - plays Hunting Party
+Conqueror Bot - draws Masquerade
+Conqueror Bot - reveals hand: Silver, Copper, Estate, Masquerade
+Conqueror Bot - reveals Silver, Silver, Estate, Estate, Estate, Trade Route
+Conqueror Bot - places Trade Route in hand
+Conqueror Bot - discards: Silver, Silver, Estate, Estate, Estate
+Conqueror Bot - plays Trade Route
+Conqueror Bot - trashes Copper
+Conqueror Bot - plays 1 Silver
+Conqueror Bot - buys Fortress
+Conqueror Bot - gains Fortress
+Conqueror Bot - draws Copper, Silver
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Estate, Masquerade, Trade Route
+ 
+---------- Kerry Monroe: turn 10 ----------
+Kerry Monroe - plays Hunting Party
+Kerry Monroe - draws Province
+Kerry Monroe - reveals hand: Copper, Copper, Copper, Province
+Kerry Monroe - reveals Masquerade
+Kerry Monroe - places Masquerade in hand
+Kerry Monroe - plays Masquerade
+Kerry Monroe - draws Copper, Copper
+Conqueror Bot - passes Copper
+Villager Bot - passes Copper
+Warlord Bot - passes Copper
+Kerry Monroe - passes Copper
+Kerry Monroe - plays 5 Copper
+Kerry Monroe - buys Hunting Party
+Kerry Monroe - gains Hunting Party
+Kerry Monroe - draws Gold
+Kerry Monroe - shuffles deck
+Kerry Monroe - draws Copper, Masquerade, Copper, Hunting Party
+ 
+---------- Warlord Bot: turn 10 ----------
+Warlord Bot - plays Bureaucrat
+Warlord Bot - gains Silver
+Villager Bot - reveals Estate
+Villager Bot - places Estate on top of deck
+Conqueror Bot - reveals Estate
+Conqueror Bot - places Estate on top of deck
+Kerry Monroe - reveals Gold, Copper, Masquerade, Copper, Hunting Party
+Warlord Bot - plays 1 Silver, 1 Copper
+Warlord Bot - buys Trade Route
+Warlord Bot - gains Trade Route
+Warlord Bot - draws Silver, Estate, Fortress, Gold, Silver
+ 
+---------- Villager Bot: turn 11 ----------
+Villager Bot - plays Fortress
+Villager Bot - draws Estate
+Villager Bot - plays 2 Silver, 1 Copper
+Villager Bot - buys Hunting Party
+Villager Bot - gains Hunting Party
+Villager Bot - shuffles deck
+Villager Bot - draws Silver, Masquerade, Copper, Silver, Gold
+ 
+---------- Conqueror Bot: turn 11 ----------
+Conqueror Bot - plays Trade Route
+Conqueror Bot - trashes Copper
+Conqueror Bot - plays 1 Silver
+Conqueror Bot - buys Navigator
+Conqueror Bot - gains Navigator
+Conqueror Bot - draws Estate, Hunting Party, Fortress, Estate, Silver
+ 
+---------- Kerry Monroe: turn 11 ----------
+Kerry Monroe - plays Hunting Party
+Kerry Monroe - draws Copper
+Kerry Monroe - reveals hand: Gold, Copper, Masquerade, Copper, Copper
+Kerry Monroe - reveals Library
+Kerry Monroe - places Library in hand
+Kerry Monroe - plays Library
+Kerry Monroe - draws Copper
+Kerry Monroe - draws Province
+Kerry Monroe - plays 4 Copper, 1 Gold
+Kerry Monroe - buys Gold
+Kerry Monroe - gains Gold
+Kerry Monroe - draws Copper, Copper, Province, Copper, Gold
+ 
+---------- Warlord Bot: turn 11 ----------
+Warlord Bot - plays Fortress
+Warlord Bot - draws Fortress
+Warlord Bot - plays Fortress
+Warlord Bot - draws Estate
+Warlord Bot - plays 2 Silver, 1 Gold
+Warlord Bot - buys Gold
+Warlord Bot - gains Gold
+Warlord Bot - draws Copper, Silver, Copper, Fortress, Silver
+ 
+---------- Villager Bot: turn 12 ----------
+Villager Bot - plays Masquerade
+Villager Bot - draws Fortress, Silver
+Conqueror Bot - passes Fortress
+Villager Bot - passes Copper
+Warlord Bot - passes Copper
+Kerry Monroe - passes Copper
+Villager Bot - trashes Copper
+Villager Bot - plays 3 Silver, 1 Gold
+Villager Bot - buys Province
+Villager Bot - gains Province
+Villager Bot - draws Copper, Bureaucrat, Estate, Trade Route, Silver
+ 
+---------- Conqueror Bot: turn 12 ----------
+Conqueror Bot - plays Hunting Party
+Conqueror Bot - draws Silver
+Conqueror Bot - reveals hand: Estate, Estate, Silver, Copper, Silver
+Conqueror Bot - reveals Estate, Estate, Estate, Estate, Copper, Fortress
+Conqueror Bot - places Fortress in hand
+Conqueror Bot - discards: Estate, Estate, Estate, Estate, Copper
+Conqueror Bot - plays Fortress
+Conqueror Bot - draws Copper
+Conqueror Bot - plays 2 Silver, 2 Copper
+Conqueror Bot - buys Gold
+Conqueror Bot - gains Gold
+Conqueror Bot - draws Estate, Bureaucrat, Fortress, Silver
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Copper
+ 
+---------- Kerry Monroe: turn 12 ----------
+Kerry Monroe - plays Fortress
+Kerry Monroe - draws Gold
+Kerry Monroe - plays 2 Copper, 2 Gold
+Kerry Monroe - buys Province
+Kerry Monroe - gains Province
+Kerry Monroe - draws Copper, Copper, Copper, Hunting Party
+Kerry Monroe - shuffles deck
+Kerry Monroe - draws Copper
+ 
+---------- Warlord Bot: turn 12 ----------
+Warlord Bot - plays Fortress
+Warlord Bot - draws Estate
+Warlord Bot - plays 2 Silver, 2 Copper
+Warlord Bot - buys Gold
+Warlord Bot - gains Gold
+Warlord Bot - draws Silver, Copper, Copper, Bureaucrat
+Warlord Bot - shuffles deck
+Warlord Bot - draws Fortress
+ 
+---------- Villager Bot: turn 13 ----------
+Villager Bot - plays Bureaucrat
+Villager Bot - gains Silver
+Conqueror Bot - reveals Estate
+Conqueror Bot - places Estate on top of deck
+Kerry Monroe - reveals Copper, Copper, Copper, Hunting Party, Copper
+Warlord Bot - reveals Silver, Copper, Copper, Bureaucrat, Fortress
+Villager Bot - plays 1 Copper, 1 Silver
+Villager Bot - buys Trade Route
+Villager Bot - gains Trade Route
+Villager Bot - draws Silver, Estate, Fortress, Copper, Copper
+ 
+---------- Conqueror Bot: turn 13 ----------
+Conqueror Bot - plays Fortress
+Conqueror Bot - draws Estate
+Conqueror Bot - plays Bureaucrat
+Conqueror Bot - gains Silver
+Kerry Monroe - reveals Copper, Copper, Copper, Hunting Party, Copper
+Warlord Bot - reveals Silver, Copper, Copper, Bureaucrat, Fortress
+Villager Bot - reveals Estate
+Villager Bot - places Estate on top of deck
+Conqueror Bot - plays 1 Silver, 1 Copper
+Conqueror Bot - buys Silver
+Conqueror Bot - gains Silver
+Conqueror Bot - draws Silver, Trade Route, Estate, Estate, Copper
+ 
+---------- Kerry Monroe: turn 13 ----------
+Kerry Monroe - plays Hunting Party
+Kerry Monroe - draws Copper
+Kerry Monroe - reveals hand: Copper, Copper, Copper, Copper, Copper
+Kerry Monroe - reveals Copper, Province
+Kerry Monroe - places Province in hand
+Kerry Monroe - discards Copper
+Kerry Monroe - plays 5 Copper
+Kerry Monroe - buys Duchy
+Kerry Monroe - gains Duchy
+Kerry Monroe - draws Copper, Gold, Province, Fortress, Gold
+ 
+---------- Warlord Bot: turn 13 ----------
+Warlord Bot - plays Fortress
+Warlord Bot - draws Copper
+Warlord Bot - plays Bureaucrat
+Warlord Bot - gains Silver
+Villager Bot - reveals Silver, Fortress, Copper, Copper
+Conqueror Bot - reveals Estate
+Conqueror Bot - places Estate on top of deck
+Kerry Monroe - reveals Province
+Kerry Monroe - places Province on top of deck
+Warlord Bot - plays 3 Copper, 1 Silver
+Warlord Bot - buys Hunting Party
+Warlord Bot - gains Hunting Party
+Warlord Bot - draws Silver, Copper, Silver, Masquerade, Estate
+ 
+---------- Villager Bot: turn 14 ----------
+Villager Bot - plays Fortress
+Villager Bot - draws Estate
+Villager Bot - plays 2 Copper, 1 Silver
+Villager Bot - buys Fortress
+Villager Bot - gains Fortress
+Villager Bot - draws Silver, Estate, Hunting Party, Fortress
+Villager Bot - shuffles deck
+Villager Bot - draws Trade Route
+ 
+---------- Conqueror Bot: turn 14 ----------
+Conqueror Bot - plays Trade Route
+Conqueror Bot - trashes Copper
+Conqueror Bot - plays 1 Silver
+Conqueror Bot - buys Duchy
+Conqueror Bot - gains Duchy
+Conqueror Bot - draws Estate, Masquerade, Estate, Hunting Party, Estate
+ 
+---------- Kerry Monroe: turn 14 ----------
+Kerry Monroe - plays Fortress
+Kerry Monroe - draws Province
+Kerry Monroe - plays 2 Gold, 1 Copper
+Kerry Monroe - buys Gold
+Kerry Monroe - gains Gold
+Kerry Monroe - draws Gold, Hunting Party, Copper, Masquerade, Gold
+ 
+---------- Warlord Bot: turn 14 ----------
+Warlord Bot - plays Masquerade
+Warlord Bot - draws Silver, Bureaucrat
+Warlord Bot - passes Copper
+Villager Bot - passes Fortress
+Conqueror Bot - passes Masquerade
+Kerry Monroe - passes Copper
+Warlord Bot - trashes Copper
+Warlord Bot - plays 3 Silver
+Warlord Bot - buys Gold
+Warlord Bot - gains Gold
+Warlord Bot - draws Copper, Estate, Silver, Silver, Gold
+ 
+---------- Villager Bot: turn 15 ----------
+Villager Bot - plays Hunting Party
+Villager Bot - draws Silver
+Villager Bot - reveals hand: Silver, Estate, Trade Route, Copper, Silver
+Villager Bot - reveals Trade Route, Copper, Bureaucrat
+Villager Bot - places Bureaucrat in hand
+Villager Bot - discards: Trade Route, Copper
+Villager Bot - plays Trade Route
+Villager Bot - trashes Copper
+Villager Bot - plays 2 Silver
+Villager Bot - buys Gold
+Villager Bot - gains Gold
+Villager Bot - draws Copper, Silver, Fortress, Province, Silver
+ 
+---------- Conqueror Bot: turn 15 ----------
+Conqueror Bot - plays Fortress
+Conqueror Bot - draws Gold
+Conqueror Bot - plays Hunting Party
+Conqueror Bot - draws Navigator
+Conqueror Bot - reveals hand: Estate, Estate, Estate, Gold, Navigator
+Conqueror Bot - reveals Estate, Silver
+Conqueror Bot - places Silver in hand
+Conqueror Bot - discards Estate
+Conqueror Bot - plays Navigator
+Conqueror Bot - looks at Estate, Fortress, Silver, Copper, Silver
+Conqueror Bot - places Estate on top of deck
+Conqueror Bot - places Copper on top of deck
+Conqueror Bot - places Silver on top of deck
+Conqueror Bot - places Silver on top of deck
+Conqueror Bot - places Fortress on top of deck
+Conqueror Bot - plays 1 Gold, 1 Silver
+Conqueror Bot - buys Duchy
+Conqueror Bot - gains Duchy
+Conqueror Bot - draws Fortress, Silver, Silver, Copper, Estate
+ 
+---------- Kerry Monroe: turn 15 ----------
+Kerry Monroe - plays Hunting Party
+Kerry Monroe - draws Province
+Kerry Monroe - reveals hand: Gold, Masquerade, Gold, Masquerade, Province
+Kerry Monroe - reveals Library
+Kerry Monroe - places Library in hand
+Kerry Monroe - plays Masquerade
+Kerry Monroe - draws Copper
+Kerry Monroe - shuffles deck
+Kerry Monroe - draws Province
+Villager Bot - passes Copper
+Warlord Bot - passes Copper
+Conqueror Bot - passes Copper
+Kerry Monroe - passes Copper
+Kerry Monroe - trashes Copper
+Kerry Monroe - plays 2 Gold
+Kerry Monroe - buys Gold
+Kerry Monroe - gains Gold
+Kerry Monroe - draws Gold, Copper, Copper, Copper, Hunting Party
+ 
+---------- Warlord Bot: turn 15 ----------
+Warlord Bot - plays 2 Silver, 1 Gold, 1 Copper
+Warlord Bot - buys Province
+Warlord Bot - gains Province
+Warlord Bot - draws Gold, Estate, Silver, Fortress, Fortress
+ 
+---------- Villager Bot: turn 16 ----------
+Villager Bot - plays Fortress
+Villager Bot - draws Estate
+Villager Bot - plays 2 Silver, 1 Copper
+Villager Bot - buys Hunting Party
+Villager Bot - gains Hunting Party
+Villager Bot - draws Estate, Fortress, Copper, Fortress, Silver
+ 
+---------- Conqueror Bot: turn 16 ----------
+Conqueror Bot - plays Fortress
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Duchy
+Conqueror Bot - plays 2 Silver, 1 Copper
+Conqueror Bot - buys Duchy
+Conqueror Bot - gains Duchy
+Conqueror Bot - draws Estate, Estate, Silver, Gold, Estate
+ 
+---------- Kerry Monroe: turn 16 ----------
+Kerry Monroe - plays Hunting Party
+Kerry Monroe - draws Province
+Kerry Monroe - reveals hand: Gold, Copper, Copper, Copper, Province
+Kerry Monroe - reveals Copper, Copper, Gold, Gold, Copper, Fortress
+Kerry Monroe - places Fortress in hand
+Kerry Monroe - discards: Copper, Copper, Gold, Gold, Copper
+Kerry Monroe - plays Fortress
+Kerry Monroe - draws Duchy
+Kerry Monroe - plays 3 Copper, 1 Gold
+Kerry Monroe - buys Gold
+Kerry Monroe - gains Gold
+Kerry Monroe - draws Copper
+Kerry Monroe - shuffles deck
+Kerry Monroe - draws Province, Masquerade, Copper, Copper
+ 
+---------- Warlord Bot: turn 16 ----------
+Warlord Bot - plays Fortress
+Warlord Bot - draws Gold
+Warlord Bot - plays Fortress
+Warlord Bot - draws Trade Route
+Warlord Bot - plays 2 Gold, 1 Silver
+Warlord Bot - buys Province
+Warlord Bot - gains Province
+Warlord Bot - shuffles deck
+Warlord Bot - draws Estate, Bureaucrat, Copper, Trade Route, Silver
+ 
+---------- Villager Bot: turn 17 ----------
+Villager Bot - plays Fortress
+Villager Bot - draws Gold
+Villager Bot - plays Fortress
+Villager Bot - draws Masquerade
+Villager Bot - plays Masquerade
+Villager Bot - draws Silver
+Villager Bot - shuffles deck
+Villager Bot - draws Silver
+Villager Bot - passes Copper
+Conqueror Bot - passes Silver
+Warlord Bot - passes Copper
+Kerry Monroe - passes Copper
+Villager Bot - trashes Copper
+Villager Bot - plays 3 Silver, 1 Gold
+Villager Bot - buys Province
+Villager Bot - gains Province
+Villager Bot - draws Bureaucrat, Copper, Copper, Estate, Silver
+ 
+---------- Conqueror Bot: turn 17 ----------
+Conqueror Bot - plays 1 Gold, 1 Copper
+Conqueror Bot - buys Estate
+Conqueror Bot - gains Estate
+Conqueror Bot - draws Fortress, Bureaucrat, Trade Route, Estate, Silver
+ 
+---------- Kerry Monroe: turn 17 ----------
+Kerry Monroe - plays Masquerade
+Kerry Monroe - draws Hunting Party, Gold
+Conqueror Bot - passes Fortress
+Villager Bot - passes Copper
+Warlord Bot - passes Copper
+Kerry Monroe - passes Copper
+Kerry Monroe - trashes Copper
+Kerry Monroe - plays 1 Silver, 1 Gold
+Kerry Monroe - buys Duchy
+Kerry Monroe - gains Duchy
+Kerry Monroe - draws Province, Gold, Province, Gold, Copper
+ 
+---------- Warlord Bot: turn 17 ----------
+Warlord Bot - plays Bureaucrat
+Warlord Bot - gains Silver
+Villager Bot - reveals Estate
+Villager Bot - places Estate on top of deck
+Conqueror Bot - reveals Estate
+Conqueror Bot - places Estate on top of deck
+Kerry Monroe - reveals Province
+Kerry Monroe - places Province on top of deck
+Warlord Bot - plays 1 Silver, 1 Copper
+Warlord Bot - buys Estate
+Warlord Bot - gains Estate
+Warlord Bot - draws Silver, Silver, Fortress, Bureaucrat, Hunting Party
+ 
+---------- Villager Bot: turn 18 ----------
+Villager Bot - plays Bureaucrat
+Villager Bot - gains Silver
+Conqueror Bot - reveals Bureaucrat, Trade Route, Silver, Copper
+Kerry Monroe - reveals Province
+Kerry Monroe - places Province on top of deck
+Warlord Bot - reveals Silver, Silver, Fortress, Bureaucrat, Hunting Party
+Villager Bot - plays 2 Copper, 1 Silver
+Villager Bot - buys Trade Route
+Villager Bot - gains Trade Route
+Villager Bot - draws Silver, Estate, Trade Route, Estate, Province
+ 
+---------- Conqueror Bot: turn 18 ----------
+Conqueror Bot - plays Trade Route
+Conqueror Bot - trashes Copper
+Conqueror Bot - plays 1 Silver
+Conqueror Bot - buys Duchy
+Conqueror Bot - gains Duchy
+Conqueror Bot - draws Estate, Silver, Estate, Hunting Party, Copper
+ 
+---------- Kerry Monroe: turn 18 ----------
+Kerry Monroe - plays 2 Gold, 1 Copper
+Kerry Monroe - buys Duchy
+Kerry Monroe - gains Duchy
+Kerry Monroe - draws Province, Province, Copper, Hunting Party, Gold
+ 
+---------- Warlord Bot: turn 18 ----------
+Warlord Bot - plays Fortress
+Warlord Bot - draws Estate
+Warlord Bot - plays Hunting Party
+Warlord Bot - draws Gold
+Warlord Bot - reveals hand: Silver, Silver, Bureaucrat, Estate, Gold
+Warlord Bot - reveals Fortress
+Warlord Bot - places Fortress in hand
+Warlord Bot - plays Fortress
+Warlord Bot - draws Copper
+Warlord Bot - plays Bureaucrat
+Warlord Bot - gains Silver
+Villager Bot - reveals Province
+Villager Bot - places Province on top of deck
+Conqueror Bot - reveals Estate
+Conqueror Bot - places Estate on top of deck
+Kerry Monroe - reveals Province
+Kerry Monroe - places Province on top of deck
+Warlord Bot - plays 2 Silver, 1 Gold, 1 Copper
+Warlord Bot - buys Province
+Warlord Bot - gains Province
+Warlord Bot - draws Silver, Silver, Gold, Province, Silver
+ 
+---------- Villager Bot: turn 19 ----------
+Villager Bot - plays 1 Silver
+Villager Bot - buys Estate
+Villager Bot - gains Estate
+Villager Bot - draws Province, Trade Route, Silver, Fortress, Gold
+ 
+---------- Conqueror Bot: turn 19 ----------
+Conqueror Bot - plays Hunting Party
+Conqueror Bot - draws Estate
+Conqueror Bot - reveals hand: Silver, Estate, Copper, Estate
+Conqueror Bot - reveals Fortress
+Conqueror Bot - places Fortress in hand
+Conqueror Bot - plays Fortress
+Conqueror Bot - draws Navigator
+Conqueror Bot - plays Navigator
+Conqueror Bot - looks at Estate, Duchy, Silver
+Conqueror Bot - shuffles deck
+Conqueror Bot - looks at Duchy, Gold
+Conqueror Bot - discards: Estate, Duchy, Silver, Duchy, Gold
+Conqueror Bot - plays 1 Silver, 1 Copper
+Conqueror Bot - buys Duchy
+Conqueror Bot - gains Duchy
+Conqueror Bot - draws Fortress, Duchy, Estate, Trade Route, Silver
+ 
+---------- Kerry Monroe: turn 19 ----------
+Kerry Monroe - plays Hunting Party
+Kerry Monroe - draws Province
+Kerry Monroe - reveals hand: Province, Copper, Gold, Province
+Kerry Monroe - reveals Duchy
+Kerry Monroe - places Duchy in hand
+Kerry Monroe - plays 1 Copper, 1 Gold
+Kerry Monroe - buys Trade Route
+Kerry Monroe - gains Trade Route
+Kerry Monroe - draws Copper, Library, Gold, Gold, Masquerade
+ 
+---------- Warlord Bot: turn 19 ----------
+Warlord Bot - plays 3 Silver, 1 Gold
+Warlord Bot - buys Province
+Warlord Bot - gains Province
+Warlord Bot - draws Gold, Masquerade, Province, Gold, Copper
+ 
+---------- Villager Bot: turn 20 ----------
+Villager Bot - plays Fortress
+Villager Bot - draws Silver
+Villager Bot - plays 2 Silver, 1 Gold
+Villager Bot - buys Duchy
+Villager Bot - gains Duchy
+Villager Bot - draws Hunting Party, Hunting Party
+Villager Bot - shuffles deck
+Villager Bot - draws Silver, Copper, Fortress
+ 
+---------- Conqueror Bot: turn 20 ----------
+Conqueror Bot - plays Fortress
+Conqueror Bot - draws Estate
+Conqueror Bot - plays 1 Silver
+Conqueror Bot - buys Estate
+Conqueror Bot - gains Estate
+Conqueror Bot - draws Silver, Estate, Silver, Estate, Copper
+ 
+---------- Kerry Monroe: turn 20 ----------
+Kerry Monroe - plays Library
+Kerry Monroe - draws Gold
+Kerry Monroe - discards Fortress
+Kerry Monroe - draws Copper
+Kerry Monroe - shuffles deck
+Kerry Monroe - discards Trade Route
+Kerry Monroe - draws Province
+Kerry Monroe - discards: Fortress, Trade Route
+Kerry Monroe - plays 3 Gold, 2 Copper
+Kerry Monroe - buys Province
+Kerry Monroe - gains Province
+Kerry Monroe - draws Copper, Gold, Duchy, Province, Duchy
+ 
+---------- Warlord Bot: turn 20 ----------
+Warlord Bot - plays Masquerade
+Warlord Bot - draws Fortress, Silver
+Villager Bot - passes Copper
+Warlord Bot - passes Copper
+Conqueror Bot - passes Copper
+Kerry Monroe - passes Copper
+Warlord Bot - trashes Copper
+Warlord Bot - plays 2 Gold, 1 Silver
+Warlord Bot - buys Province
+Warlord Bot - gains Province
+Warlord Bot - draws Silver, Estate, Copper, Silver
+Warlord Bot - shuffles deck
+Warlord Bot - draws Province
+ 
+---------- Villager Bot: turn 21 ----------
+Villager Bot - plays Fortress
+Villager Bot - draws Province
+Villager Bot - plays Hunting Party
+Villager Bot - draws Trade Route
+Villager Bot - reveals hand: Hunting Party, Silver, Copper, Province, Trade Route
+Villager Bot - reveals Silver, Trade Route, Province, Silver, Duchy
+Villager Bot - places Duchy in hand
+Villager Bot - discards: Silver, Trade Route, Province, Silver
+Villager Bot - plays Hunting Party
+Villager Bot - draws Silver
+Villager Bot - reveals hand: Silver, Copper, Province, Trade Route, Duchy, Silver
+Villager Bot - reveals Silver, Bureaucrat
+Villager Bot - places Bureaucrat in hand
+Villager Bot - discards Silver
+Villager Bot - plays Trade Route
+Villager Bot - trashes Copper
+Villager Bot - plays Bureaucrat
+Villager Bot - gains Silver
+Conqueror Bot - reveals Estate
+Conqueror Bot - places Estate on top of deck
+Kerry Monroe - reveals Province
+Kerry Monroe - places Province on top of deck
+Warlord Bot - reveals Province
+Warlord Bot - places Province on top of deck
+Villager Bot - plays 2 Silver
+Villager Bot - buys Duchy
+Villager Bot - gains Duchy
+Villager Bot - buys Estate
+Villager Bot - gains Estate
+Villager Bot - draws Silver, Estate, Masquerade, Trade Route, Fortress
+ 
+---------- Conqueror Bot: turn 21 ----------
+Conqueror Bot - plays 2 Silver, 1 Copper
+Conqueror Bot - buys Duchy
+Conqueror Bot - gains Duchy
+Conqueror Bot - draws Estate, Estate, Bureaucrat, Duchy, Copper
+ 
+---------- Kerry Monroe: turn 21 ----------
+Kerry Monroe - plays 1 Gold, 1 Copper
+Kerry Monroe - buys Estate
+Kerry Monroe - gains Estate
+Kerry Monroe - draws Province, Gold, Copper, Gold, Hunting Party
+ 
+---------- Warlord Bot: turn 21 ----------
+Warlord Bot - plays 2 Silver, 1 Copper
+Warlord Bot - buys Duchy
+Warlord Bot - gains Duchy
+Warlord Bot - draws Province, Gold, Silver, Province, Copper
+ 
+---------- Villager Bot: turn 22 ----------
+Villager Bot - plays Fortress
+Villager Bot - draws Copper
+Villager Bot - plays Trade Route
+Villager Bot - trashes Copper
+Villager Bot - plays 1 Silver
+Villager Bot - buys Estate
+Villager Bot - gains Estate
+Villager Bot - buys Estate
+Villager Bot - gains Estate
+Villager Bot - draws Estate, Estate, Silver, Fortress, Silver
+ 
+---------- Conqueror Bot: turn 22 ----------
+Conqueror Bot - plays Bureaucrat
+Conqueror Bot - gains Silver
+Kerry Monroe - reveals Province
+Kerry Monroe - places Province on top of deck
+Warlord Bot - reveals Province
+Warlord Bot - places Province on top of deck
+Villager Bot - reveals Estate
+Villager Bot - places Estate on top of deck
+Conqueror Bot - plays 1 Copper
+Conqueror Bot - draws Silver
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Estate, Silver, Gold, Silver
+ 
+---------- Kerry Monroe: turn 22 ----------
+Kerry Monroe - plays Hunting Party
+Kerry Monroe - draws Province
+Kerry Monroe - reveals hand: Gold, Copper, Gold, Province
+Kerry Monroe - reveals Duchy
+Kerry Monroe - places Duchy in hand
+Kerry Monroe - plays 2 Gold, 1 Copper
+Kerry Monroe - buys Gold
+Kerry Monroe - gains Gold
+Kerry Monroe - draws Gold, Hunting Party, Masquerade, Silver, Province
+ 
+---------- Warlord Bot: turn 22 ----------
+Warlord Bot - plays 1 Gold, 1 Silver, 1 Copper
+Warlord Bot - buys Estate
+Warlord Bot - gains Estate
+Warlord Bot - draws Province, Province, Bureaucrat, Trade Route, Fortress
+ 
+---------- Villager Bot: turn 23 ----------
+Villager Bot - plays Fortress
+Villager Bot - draws Estate
+Villager Bot - plays 2 Silver
+Villager Bot - buys Silver
+Villager Bot - gains Silver
+Villager Bot - draws Gold, Gold, Estate
+Villager Bot - shuffles deck
+Villager Bot - draws Hunting Party, Silver
+ 
+---------- Conqueror Bot: turn 23 ----------
+Conqueror Bot - plays 3 Silver, 1 Gold
+Conqueror Bot - buys Gold
+Conqueror Bot - gains Gold
+Conqueror Bot - draws Estate, Estate, Fortress, Silver, Estate
+ 
+---------- Kerry Monroe: turn 23 ----------
+Kerry Monroe - plays Hunting Party
+Kerry Monroe - draws Fortress
+Kerry Monroe - reveals hand: Gold, Masquerade, Silver, Province, Fortress
+Kerry Monroe - shuffles deck
+Kerry Monroe - reveals Masquerade, Copper
+Kerry Monroe - places Copper in hand
+Kerry Monroe - discards Masquerade
+Kerry Monroe - plays Fortress
+Kerry Monroe - draws Gold
+Kerry Monroe - plays Masquerade
+Kerry Monroe - draws Copper, Estate
+Warlord Bot - passes Fortress
+Villager Bot - passes Silver
+Conqueror Bot - passes Fortress
+Kerry Monroe - passes Copper
+Kerry Monroe - trashes Copper
+Kerry Monroe - plays Fortress
+Kerry Monroe - draws Duchy
+Kerry Monroe - plays 2 Gold, 1 Silver
+Kerry Monroe - buys Province
+Kerry Monroe - gains Province
+Kerry Monroe - draws Copper, Province, Fortress, Gold, Hunting Party
+ 
+------------ Game Over ------------
+Kerry Monroe - cards: 3 Fortress, 2 Masquerade, 2 Hunting Party, 1 Library, 1 Trade Route, 8 Gold, 2 Copper, 1 Silver, 5 Province, 3 Duchy, 1 Estate
+Kerry Monroe - total victory points: 40
+Kerry Monroe - turns: 23
+ 
+Warlord Bot - cards: 2 Fortress, 2 Bureaucrat, 1 Masquerade, 1 Trade Route, 1 Hunting Party, 9 Silver, 4 Gold, 4 Copper, 5 Estate, 5 Province, 1 Duchy
+Warlord Bot - total victory points: 38
+Warlord Bot - turns: 22
+ 
+Conqueror Bot - cards: 1 Bureaucrat, 1 Navigator, 1 Trade Route, 1 Fortress, 1 Hunting Party, 7 Silver, 3 Copper, 2 Gold, 9 Estate, 6 Duchy
+Conqueror Bot - total victory points: 27
+Conqueror Bot - turns: 23
+ 
+Villager Bot - cards: 4 Fortress, 3 Trade Route, 2 Hunting Party, 1 Bureaucrat, 1 Masquerade, 8 Silver, 2 Gold, 7 Estate, 2 Duchy, 2 Province
+Villager Bot - total victory points: 25
+Villager Bot - turns: 23
+ 
+1st place: Kerry Monroe
+2nd place: Warlord Bot
+3rd place: Conqueror Bot
+4th place: Villager Bot
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.50bbfdf8e4b07d338bca0e67.1366508665569.txt b/testing/testdata/log.50bbfdf8e4b07d338bca0e67.1366508665569.txt
new file mode 100644
index 0000000..a596fb5
--- /dev/null
+++ b/testing/testdata/log.50bbfdf8e4b07d338bca0e67.1366508665569.txt
@@ -0,0 +1,858 @@
+------------ Game Setup ------------
+Supply cards: Cellar, Duchess, Pearl Diver, Caravan, Horse Traders, Thief, Young Witch, Band of Misfits, Count, Grand Market, Expand, Copper, Silver, Gold, Estate, Duchy, Province, Curse
+Kerry Monroe - starting cards: Necropolis, Overgrown Estate, Hovel, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Warlord Bot - starting cards: Necropolis, Overgrown Estate, Hovel, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Conqueror Bot - starting cards: Necropolis, Overgrown Estate, Hovel, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Banker Bot - starting cards: Necropolis, Overgrown Estate, Hovel, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Kerry Monroe - shuffles deck
+Warlord Bot - shuffles deck
+Conqueror Bot - shuffles deck
+Banker Bot - shuffles deck
+Kerry Monroe - draws Hovel, Copper, Overgrown Estate, Copper, Copper
+Warlord Bot - draws Copper, Copper, Overgrown Estate, Necropolis, Copper
+Conqueror Bot - draws Copper, Overgrown Estate, Necropolis, Copper, Hovel
+Banker Bot - draws Copper, Copper, Copper, Overgrown Estate, Copper
+ 
+---------- Banker Bot: turn 1 ----------
+Banker Bot - plays 4 Copper
+Banker Bot - buys Young Witch
+Banker Bot - gains Young Witch
+Banker Bot - draws Hovel, Copper, Copper, Necropolis, Copper
+ 
+---------- Kerry Monroe: turn 1 ----------
+Kerry Monroe - plays 3 Copper
+Kerry Monroe - buys Silver
+Kerry Monroe - gains Silver
+Kerry Monroe - draws Copper, Copper, Copper, Copper, Necropolis
+ 
+---------- Warlord Bot: turn 1 ----------
+Warlord Bot - plays Necropolis
+Warlord Bot - plays 3 Copper
+Warlord Bot - buys Silver
+Warlord Bot - gains Silver
+Warlord Bot - draws Copper, Copper, Hovel, Copper, Copper
+ 
+---------- Conqueror Bot: turn 1 ----------
+Conqueror Bot - plays Necropolis
+Conqueror Bot - plays 2 Copper
+Conqueror Bot - buys Cellar
+Conqueror Bot - gains Cellar
+Conqueror Bot - draws Copper, Copper, Copper, Copper, Copper
+ 
+---------- Banker Bot: turn 2 ----------
+Banker Bot - plays Necropolis
+Banker Bot - plays 3 Copper
+Banker Bot - buys Silver
+Banker Bot - gains Silver
+Banker Bot - shuffles deck
+Banker Bot - draws Copper, Copper, Copper, Copper, Young Witch
+ 
+---------- Kerry Monroe: turn 2 ----------
+Kerry Monroe - plays Necropolis
+Kerry Monroe - plays 4 Copper
+Kerry Monroe - buys Young Witch
+Kerry Monroe - gains Young Witch
+Kerry Monroe - shuffles deck
+Kerry Monroe - draws Overgrown Estate, Copper, Copper, Necropolis, Copper
+ 
+---------- Warlord Bot: turn 2 ----------
+Warlord Bot - plays 4 Copper
+Warlord Bot - buys Young Witch
+Warlord Bot - gains Young Witch
+Warlord Bot - shuffles deck
+Warlord Bot - draws Necropolis, Copper, Copper, Copper, Silver
+ 
+---------- Conqueror Bot: turn 2 ----------
+Conqueror Bot - plays 5 Copper
+Conqueror Bot - buys Count
+Conqueror Bot - gains Count
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Cellar, Copper, Overgrown Estate, Hovel, Count
+ 
+---------- Banker Bot: turn 3 ----------
+Banker Bot - plays Young Witch
+Banker Bot - draws Overgrown Estate, Silver
+Banker Bot - discards Copper
+Banker Bot - discards Copper
+Conqueror Bot - reveals bane Cellar
+Kerry Monroe - gains Curse
+Warlord Bot - gains Curse
+Banker Bot - plays 2 Copper, 1 Silver
+Banker Bot - buys Young Witch
+Banker Bot - gains Young Witch
+Banker Bot - draws Copper, Necropolis, Hovel, Copper, Copper
+ 
+---------- Kerry Monroe: turn 3 ----------
+Kerry Monroe - plays Necropolis
+Kerry Monroe - plays 3 Copper
+Kerry Monroe - buys Silver
+Kerry Monroe - gains Silver
+Kerry Monroe - draws Silver, Copper, Copper, Hovel, Copper
+ 
+---------- Warlord Bot: turn 3 ----------
+Warlord Bot - plays Necropolis
+Warlord Bot - plays 3 Copper, 1 Silver
+Warlord Bot - buys Young Witch
+Warlord Bot - gains Young Witch
+Warlord Bot - draws Overgrown Estate, Copper, Young Witch, Hovel, Copper
+ 
+---------- Conqueror Bot: turn 3 ----------
+Conqueror Bot - plays Cellar
+Conqueror Bot - discards Copper
+Conqueror Bot - discards Overgrown Estate
+Conqueror Bot - discards Hovel
+Conqueror Bot - draws Copper, Copper, Copper
+Conqueror Bot - plays Count
+Conqueror Bot - gains Copper
+Conqueror Bot - trashes Copper, Copper, Copper
+Conqueror Bot - draws Copper, Necropolis, Copper, Copper
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Hovel
+ 
+---------- Banker Bot: turn 4 ----------
+Banker Bot - plays Necropolis
+Banker Bot - plays 3 Copper
+Banker Bot - buys Silver
+Banker Bot - gains Silver
+Banker Bot - shuffles deck
+Banker Bot - draws Silver, Hovel, Silver, Copper, Copper
+ 
+---------- Kerry Monroe: turn 4 ----------
+Kerry Monroe - plays 3 Copper, 1 Silver
+Kerry Monroe - buys Band of Misfits
+Kerry Monroe - gains Band of Misfits
+Kerry Monroe - draws Young Witch, Copper
+Kerry Monroe - shuffles deck
+Kerry Monroe - draws Silver, Copper, Copper
+ 
+---------- Warlord Bot: turn 4 ----------
+Warlord Bot - plays Young Witch
+Warlord Bot - draws Copper, Copper
+Warlord Bot - discards Overgrown Estate
+Warlord Bot - discards Copper
+Conqueror Bot - gains Curse
+Banker Bot - gains Curse
+Kerry Monroe - gains Curse
+Warlord Bot - plays 3 Copper
+Warlord Bot - buys Silver
+Warlord Bot - gains Silver
+Warlord Bot - shuffles deck
+Warlord Bot - draws Copper, Copper, Curse, Copper, Necropolis
+ 
+---------- Conqueror Bot: turn 4 ----------
+Conqueror Bot - plays Necropolis
+Conqueror Bot - plays 3 Copper
+Conqueror Bot - buys Silver
+Conqueror Bot - gains Silver
+Conqueror Bot - draws Overgrown Estate, Copper, Cellar, Copper, Count
+ 
+---------- Banker Bot: turn 5 ----------
+Banker Bot - plays 2 Silver, 2 Copper
+Banker Bot - buys Gold
+Banker Bot - gains Gold
+Banker Bot - draws Copper, Young Witch, Copper, Overgrown Estate, Young Witch
+ 
+---------- Kerry Monroe: turn 5 ----------
+Kerry Monroe - plays Young Witch
+Kerry Monroe - draws Copper, Copper
+Kerry Monroe - discards Copper
+Kerry Monroe - discards Copper
+Conqueror Bot - reveals bane Cellar
+Warlord Bot - gains Curse
+Banker Bot - gains Curse
+Kerry Monroe - plays 3 Copper, 1 Silver
+Kerry Monroe - buys Band of Misfits
+Kerry Monroe - gains Band of Misfits
+Kerry Monroe - draws Copper, Band of Misfits, Hovel, Silver, Copper
+ 
+---------- Warlord Bot: turn 5 ----------
+Warlord Bot - plays Necropolis
+Warlord Bot - plays 3 Copper
+Warlord Bot - buys Cellar
+Warlord Bot - gains Cellar
+Warlord Bot - draws Overgrown Estate, Copper, Young Witch, Young Witch, Hovel
+ 
+---------- Conqueror Bot: turn 5 ----------
+Conqueror Bot - plays Cellar
+Conqueror Bot - discards Copper
+Conqueror Bot - discards Copper
+Conqueror Bot - discards Overgrown Estate
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Silver, Overgrown Estate, Copper
+Conqueror Bot - plays Count
+Conqueror Bot - gains Copper
+Conqueror Bot - takes 3 coins
+Conqueror Bot - plays 1 Silver, 1 Copper
+Conqueror Bot - buys Gold
+Conqueror Bot - gains Gold
+Conqueror Bot - draws Copper, Necropolis, Copper, Curse, Copper
+ 
+---------- Banker Bot: turn 6 ----------
+Banker Bot - plays Young Witch
+Banker Bot - draws Copper, Necropolis
+Banker Bot - discards Necropolis
+Banker Bot - discards Young Witch
+Kerry Monroe - gains Curse
+Warlord Bot - gains Curse
+Conqueror Bot - gains Curse
+Banker Bot - plays 3 Copper
+Banker Bot - buys Silver
+Banker Bot - gains Silver
+Banker Bot - draws Copper, Copper
+Banker Bot - shuffles deck
+Banker Bot - draws Copper, Necropolis, Copper
+ 
+---------- Kerry Monroe: turn 6 ----------
+Kerry Monroe - plays Band of Misfits
+Kerry Monroe - chooses Young Witch
+Kerry Monroe - plays Young Witch
+Kerry Monroe - draws Curse, Necropolis
+Kerry Monroe - discards Hovel
+Kerry Monroe - discards Curse
+Warlord Bot - gains Curse
+Conqueror Bot - gains Curse
+Banker Bot - gains Curse
+Kerry Monroe - plays 2 Copper, 1 Silver
+Kerry Monroe - buys Caravan
+Kerry Monroe - gains Caravan
+Kerry Monroe - draws Overgrown Estate
+Kerry Monroe - shuffles deck
+Kerry Monroe - draws Copper, Band of Misfits, Copper, Copper
+ 
+---------- Warlord Bot: turn 6 ----------
+Warlord Bot - plays Young Witch
+Warlord Bot - draws Copper, Copper
+Warlord Bot - discards Young Witch
+Warlord Bot - discards Overgrown Estate
+Conqueror Bot - gains Curse
+Banker Bot - gains Curse
+Kerry Monroe - gains Curse
+Warlord Bot - plays 3 Copper
+Warlord Bot - buys Silver
+Warlord Bot - gains Silver
+Warlord Bot - draws Copper, Silver, Silver
+Warlord Bot - shuffles deck
+Warlord Bot - draws Curse, Hovel
+ 
+---------- Conqueror Bot: turn 6 ----------
+Conqueror Bot - plays Necropolis
+Conqueror Bot - plays 3 Copper
+Conqueror Bot - buys Silver
+Conqueror Bot - gains Silver
+Conqueror Bot - draws Copper, Hovel
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Copper, Curse, Overgrown Estate
+ 
+---------- Banker Bot: turn 7 ----------
+Banker Bot - plays Necropolis
+Banker Bot - plays 4 Copper
+Banker Bot - buys Caravan
+Banker Bot - gains Caravan
+Banker Bot - draws Young Witch, Curse, Silver, Curse, Silver
+ 
+---------- Kerry Monroe: turn 7 ----------
+Kerry Monroe - plays Band of Misfits
+Kerry Monroe - chooses Young Witch
+Kerry Monroe - plays Young Witch
+Kerry Monroe - draws Copper, Caravan
+Kerry Monroe - discards Overgrown Estate
+Kerry Monroe - discards Caravan
+Warlord Bot - gains Curse
+Conqueror Bot - gains Curse
+Banker Bot - gains Curse
+Kerry Monroe - plays 4 Copper
+Kerry Monroe - buys Caravan
+Kerry Monroe - gains Caravan
+Kerry Monroe - draws Hovel, Copper, Curse, Curse, Necropolis
+ 
+---------- Warlord Bot: turn 7 ----------
+Warlord Bot - plays 2 Silver, 1 Copper
+Warlord Bot - buys Band of Misfits
+Warlord Bot - gains Band of Misfits
+Warlord Bot - draws Young Witch, Curse, Copper, Young Witch, Copper
+ 
+---------- Conqueror Bot: turn 7 ----------
+Conqueror Bot - plays 2 Copper
+Conqueror Bot - buys Cellar
+Conqueror Bot - gains Cellar
+Conqueror Bot - draws Count, Curse, Curse, Copper, Gold
+ 
+---------- Banker Bot: turn 8 ----------
+Banker Bot - plays Young Witch
+Banker Bot - draws Silver, Copper
+Banker Bot - discards Curse
+Banker Bot - discards Curse
+Kerry Monroe - gains Curse
+Warlord Bot - gains Curse
+Conqueror Bot - gains Curse
+Banker Bot - plays Silver
+Banker Bot - plays Silver
+Banker Bot - plays Silver
+Banker Bot - buys Grand Market
+Banker Bot - gains Grand Market
+Banker Bot - draws Gold, Overgrown Estate, Copper, Young Witch, Copper
+ 
+---------- Kerry Monroe: turn 8 ----------
+Kerry Monroe - draws Silver, Copper, Curse, Copper, Band of Misfits
+ 
+---------- Warlord Bot: turn 8 ----------
+Warlord Bot - plays Young Witch
+Warlord Bot - draws Silver, Copper
+Warlord Bot - discards Curse
+Warlord Bot - discards Young Witch
+Conqueror Bot - gains Curse
+Banker Bot - gains Curse
+Kerry Monroe - gains Curse
+Warlord Bot - plays 3 Copper, 1 Silver
+Warlord Bot - buys Band of Misfits
+Warlord Bot - gains Band of Misfits
+Warlord Bot - draws Necropolis, Copper, Copper, Overgrown Estate, Curse
+ 
+---------- Conqueror Bot: turn 8 ----------
+Conqueror Bot - plays Count
+Conqueror Bot - gains Copper
+Conqueror Bot - takes 3 coins
+Conqueror Bot - plays Gold
+Conqueror Bot - buys Grand Market
+Conqueror Bot - gains Grand Market
+Conqueror Bot - draws Silver, Necropolis, Copper, Copper, Curse
+ 
+---------- Banker Bot: turn 9 ----------
+Banker Bot - plays Young Witch
+Banker Bot - draws Hovel
+Banker Bot - shuffles deck
+Banker Bot - draws Caravan
+Banker Bot - discards Caravan
+Banker Bot - discards Overgrown Estate
+Kerry Monroe - gains Curse
+Warlord Bot - gains Curse
+Conqueror Bot - gains Curse
+Banker Bot - plays 2 Copper, 1 Gold
+Banker Bot - buys Band of Misfits
+Banker Bot - gains Band of Misfits
+Banker Bot - draws Curse, Silver, Silver, Young Witch, Copper
+ 
+---------- Kerry Monroe: turn 9 ----------
+Kerry Monroe - plays Band of Misfits
+Kerry Monroe - chooses Young Witch
+Kerry Monroe - plays Young Witch
+Kerry Monroe - draws Young Witch, Silver
+Kerry Monroe - discards Curse
+Kerry Monroe - discards Young Witch
+Warlord Bot - gains Curse
+Conqueror Bot - gains Curse
+Kerry Monroe - plays 2 Silver, 2 Copper
+Kerry Monroe - buys Gold
+Kerry Monroe - gains Gold
+Kerry Monroe - shuffles deck
+Kerry Monroe - draws Curse, Copper, Young Witch, Hovel, Curse
+ 
+---------- Warlord Bot: turn 9 ----------
+Warlord Bot - plays Necropolis
+Warlord Bot - plays 2 Copper
+Warlord Bot - buys Cellar
+Warlord Bot - gains Cellar
+Warlord Bot - draws Curse, Cellar, Copper
+Warlord Bot - shuffles deck
+Warlord Bot - draws Curse, Copper
+ 
+---------- Conqueror Bot: turn 9 ----------
+Conqueror Bot - plays Necropolis
+Conqueror Bot - plays 2 Copper, 1 Silver
+Conqueror Bot - buys Caravan
+Conqueror Bot - gains Caravan
+Conqueror Bot - draws Silver, Copper, Cellar
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Curse, Copper
+ 
+---------- Banker Bot: turn 10 ----------
+Banker Bot - plays Young Witch
+Banker Bot - draws Curse, Curse
+Banker Bot - discards Curse
+Banker Bot - discards Curse
+Banker Bot - plays 2 Silver, 1 Copper
+Banker Bot - buys Duchy
+Banker Bot - gains Duchy
+Banker Bot - draws Copper, Copper, Copper, Curse, Copper
+ 
+---------- Kerry Monroe: turn 10 ----------
+Kerry Monroe - plays Young Witch
+Kerry Monroe - draws Curse, Curse
+Kerry Monroe - discards Curse
+Kerry Monroe - discards Curse
+Kerry Monroe - draws Caravan, Silver, Overgrown Estate, Necropolis, Band of Misfits
+ 
+---------- Warlord Bot: turn 10 ----------
+Warlord Bot - plays Cellar
+Warlord Bot - discards Copper
+Warlord Bot - discards Copper
+Warlord Bot - discards Curse
+Warlord Bot - discards Curse
+Warlord Bot - draws Copper, Copper, Hovel, Young Witch
+Warlord Bot - plays Young Witch
+Warlord Bot - draws Copper, Curse
+Warlord Bot - discards Curse
+Warlord Bot - discards Copper
+Warlord Bot - plays 2 Copper
+Warlord Bot - buys Cellar
+Warlord Bot - gains Cellar
+Warlord Bot - draws Copper, Curse, Necropolis, Silver, Silver
+ 
+---------- Conqueror Bot: turn 10 ----------
+Conqueror Bot - plays Cellar
+Conqueror Bot - discards Copper
+Conqueror Bot - discards Copper
+Conqueror Bot - discards Curse
+Conqueror Bot - draws Curse, Caravan, Curse
+Conqueror Bot - plays Caravan
+Conqueror Bot - draws Cellar
+Conqueror Bot - plays Cellar
+Conqueror Bot - discards Curse
+Conqueror Bot - discards Curse
+Conqueror Bot - draws Curse, Copper
+Conqueror Bot - plays 1 Silver, 1 Copper
+Conqueror Bot - buys Silver
+Conqueror Bot - gains Silver
+Conqueror Bot - draws Count, Necropolis, Curse, Silver, Copper
+ 
+---------- Banker Bot: turn 11 ----------
+Banker Bot - plays 4 Copper
+Banker Bot - buys Caravan
+Banker Bot - gains Caravan
+Banker Bot - draws Grand Market, Curse, Curse, Necropolis, Silver
+ 
+---------- Kerry Monroe: turn 11 ----------
+Kerry Monroe - plays Caravan
+Kerry Monroe - draws Silver
+Kerry Monroe - plays Necropolis
+Kerry Monroe - plays Band of Misfits
+Kerry Monroe - chooses Horse Traders
+Kerry Monroe - plays Horse Traders
+Kerry Monroe - discards Overgrown Estate
+Kerry Monroe - discards Silver
+Kerry Monroe - plays 1 Silver
+Kerry Monroe - buys Count
+Kerry Monroe - gains Count
+Kerry Monroe - draws Curse, Copper, Gold, Copper, Curse
+ 
+---------- Warlord Bot: turn 11 ----------
+Warlord Bot - plays Necropolis
+Warlord Bot - plays 2 Silver, 1 Copper
+Warlord Bot - buys Duchy
+Warlord Bot - gains Duchy
+Warlord Bot - draws Young Witch, Curse, Cellar, Curse, Silver
+ 
+---------- Conqueror Bot: turn 11 ----------
+Conqueror Bot - duration Caravan
+Conqueror Bot - draws Curse
+Conqueror Bot - plays Necropolis
+Conqueror Bot - plays Count
+Conqueror Bot - gains Copper
+Conqueror Bot - takes 3 coins
+Conqueror Bot - plays 1 Silver, 1 Copper
+Conqueror Bot - buys Duchy
+Conqueror Bot - gains Duchy
+Conqueror Bot - draws Hovel, Copper, Copper, Grand Market, Gold
+ 
+---------- Banker Bot: turn 12 ----------
+Banker Bot - plays Grand Market
+Banker Bot - shuffles deck
+Banker Bot - draws Duchy
+Banker Bot - plays Necropolis
+Banker Bot - plays 1 Silver
+Banker Bot - buys Caravan
+Banker Bot - gains Caravan
+Banker Bot - draws Curse, Copper, Young Witch, Gold, Copper
+ 
+---------- Kerry Monroe: turn 12 ----------
+Kerry Monroe - duration Caravan
+Kerry Monroe - draws Curse
+Kerry Monroe - plays 2 Copper, 1 Gold
+Kerry Monroe - buys Count
+Kerry Monroe - gains Count
+Kerry Monroe - draws Band of Misfits, Copper, Copper, Copper, Caravan
+ 
+---------- Warlord Bot: turn 12 ----------
+Warlord Bot - plays Cellar
+Warlord Bot - discards Curse
+Warlord Bot - discards Curse
+Warlord Bot - draws Curse, Band of Misfits
+Warlord Bot - plays Band of Misfits
+Warlord Bot - chooses Thief
+Warlord Bot - plays Thief
+Conqueror Bot - reveals: Overgrown Estate, Curse
+Conqueror Bot - discards: Overgrown Estate, Curse
+Banker Bot - reveals: Curse, Copper
+Banker Bot - trashes Copper
+Banker Bot - discards Curse
+Kerry Monroe - reveals: Copper
+Kerry Monroe - shuffles deck
+Kerry Monroe - reveals: Copper
+Kerry Monroe - trashes Copper
+Kerry Monroe - discards Copper
+Warlord Bot - plays 1 Silver
+Warlord Bot - buys Cellar
+Warlord Bot - gains Cellar
+Warlord Bot - draws Copper, Band of Misfits, Overgrown Estate, Curse
+Warlord Bot - shuffles deck
+Warlord Bot - draws Copper
+ 
+---------- Conqueror Bot: turn 12 ----------
+Conqueror Bot - plays Grand Market
+Conqueror Bot - draws Curse
+Conqueror Bot - plays 2 Copper, 1 Gold
+Conqueror Bot - buys Duchy
+Conqueror Bot - trashes Hovel
+Conqueror Bot - gains Duchy
+Conqueror Bot - buys Estate
+Conqueror Bot - gains Estate
+Conqueror Bot - draws Copper, Curse
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Copper, Overgrown Estate, Copper
+ 
+---------- Banker Bot: turn 13 ----------
+Banker Bot - plays Young Witch
+Banker Bot - draws Copper, Curse
+Banker Bot - discards Curse
+Banker Bot - discards Curse
+Banker Bot - plays 3 Copper, 1 Gold
+Banker Bot - buys Duchy
+Banker Bot - gains Duchy
+Banker Bot - draws Caravan, Copper, Caravan, Copper, Silver
+ 
+---------- Kerry Monroe: turn 13 ----------
+Kerry Monroe - plays Caravan
+Kerry Monroe - draws Curse
+Kerry Monroe - plays Band of Misfits
+Kerry Monroe - chooses Horse Traders
+Kerry Monroe - plays Horse Traders
+Kerry Monroe - discards Curse
+Kerry Monroe - discards Copper
+Kerry Monroe - plays 2 Copper
+Kerry Monroe - buys Duchy
+Kerry Monroe - gains Duchy
+Kerry Monroe - gains Duchess
+Kerry Monroe - draws Count, Curse, Band of Misfits, Young Witch, Gold
+ 
+---------- Warlord Bot: turn 13 ----------
+Warlord Bot - plays Band of Misfits
+Warlord Bot - chooses Thief
+Warlord Bot - plays Thief
+Conqueror Bot - reveals: Estate, Silver
+Conqueror Bot - trashes Silver
+Conqueror Bot - discards Estate
+Banker Bot - reveals: Overgrown Estate, Band of Misfits
+Banker Bot - discards: Overgrown Estate, Band of Misfits
+Kerry Monroe - reveals: Caravan, Curse
+Kerry Monroe - discards: Caravan, Curse
+Warlord Bot - gains Silver
+Warlord Bot - plays 2 Copper
+Warlord Bot - buys Estate
+Warlord Bot - gains Estate
+Warlord Bot - draws Hovel, Cellar, Young Witch, Band of Misfits, Copper
+ 
+---------- Conqueror Bot: turn 13 ----------
+Conqueror Bot - plays 3 Copper
+Conqueror Bot - buys Estate
+Conqueror Bot - gains Estate
+Conqueror Bot - draws Silver, Cellar, Curse, Curse, Copper
+ 
+---------- Banker Bot: turn 14 ----------
+Banker Bot - plays Caravan
+Banker Bot - draws Hovel
+Banker Bot - plays Caravan
+Banker Bot - draws Curse
+Banker Bot - plays 2 Copper, 1 Silver
+Banker Bot - buys Caravan
+Banker Bot - gains Caravan
+Banker Bot - draws Young Witch, Silver, Copper
+Banker Bot - shuffles deck
+Banker Bot - draws Grand Market, Copper
+ 
+---------- Kerry Monroe: turn 14 ----------
+Kerry Monroe - duration Caravan
+Kerry Monroe - draws Copper
+Kerry Monroe - plays Band of Misfits
+Kerry Monroe - chooses Caravan
+Kerry Monroe - plays Caravan
+Kerry Monroe - draws Count
+Kerry Monroe - plays Count
+Kerry Monroe - places Count on top of deck
+Kerry Monroe - takes 3 coins
+Kerry Monroe - plays Gold
+Kerry Monroe - buys Grand Market
+Kerry Monroe - gains Grand Market
+Kerry Monroe - draws Count, Necropolis, Overgrown Estate, Hovel, Copper
+ 
+---------- Warlord Bot: turn 14 ----------
+Warlord Bot - plays Cellar
+Warlord Bot - discards Copper
+Warlord Bot - discards Hovel
+Warlord Bot - draws Silver, Copper
+Warlord Bot - plays Band of Misfits
+Warlord Bot - chooses Thief
+Warlord Bot - plays Thief
+Conqueror Bot - reveals: Copper, Copper
+Conqueror Bot - trashes Copper
+Conqueror Bot - discards Copper
+Banker Bot - reveals: Band of Misfits, Young Witch
+Banker Bot - discards: Band of Misfits, Young Witch
+Kerry Monroe - reveals: Curse, Silver
+Kerry Monroe - trashes Silver
+Kerry Monroe - discards Curse
+Warlord Bot - gains Silver
+Warlord Bot - plays 1 Silver, 1 Copper
+Warlord Bot - buys Silver
+Warlord Bot - gains Silver
+Warlord Bot - draws Silver, Curse, Copper, Curse, Necropolis
+ 
+---------- Conqueror Bot: turn 14 ----------
+Conqueror Bot - plays Cellar
+Conqueror Bot - discards Copper
+Conqueror Bot - discards Curse
+Conqueror Bot - discards Curse
+Conqueror Bot - draws Curse, Caravan, Gold
+Conqueror Bot - plays Caravan
+Conqueror Bot - draws Count
+Conqueror Bot - plays Count
+Conqueror Bot - gains Copper
+Conqueror Bot - gains Duchy
+Conqueror Bot - plays 1 Silver, 1 Gold
+Conqueror Bot - buys Duchy
+Conqueror Bot - gains Duchy
+Conqueror Bot - draws Curse, Curse, Necropolis, Curse, Curse
+ 
+---------- Banker Bot: turn 15 ----------
+Banker Bot - duration Caravan
+Banker Bot - draws Overgrown Estate
+Banker Bot - duration Caravan
+Banker Bot - draws Curse
+Banker Bot - plays Grand Market
+Banker Bot - draws Copper
+Banker Bot - plays Young Witch
+Banker Bot - draws Curse, Curse
+Banker Bot - discards Curse
+Banker Bot - discards Curse
+Banker Bot - plays 3 Copper, 1 Silver
+Banker Bot - buys Duchy
+Banker Bot - gains Duchy
+Banker Bot - buys Estate
+Banker Bot - gains Estate
+Banker Bot - draws Duchy, Silver, Caravan, Caravan, Silver
+ 
+---------- Kerry Monroe: turn 15 ----------
+Kerry Monroe - duration Caravan
+Kerry Monroe - draws Curse
+Kerry Monroe - plays Necropolis
+Kerry Monroe - plays Count
+Kerry Monroe - discards Overgrown Estate
+Kerry Monroe - discards Hovel
+Kerry Monroe - gains Duchy
+Kerry Monroe - draws Curse, Silver, Curse
+Kerry Monroe - shuffles deck
+Kerry Monroe - draws Copper, Count
+ 
+---------- Warlord Bot: turn 15 ----------
+Warlord Bot - plays Necropolis
+Warlord Bot - plays 1 Silver, 1 Copper
+Warlord Bot - buys Estate
+Warlord Bot - gains Estate
+Warlord Bot - draws Cellar, Young Witch, Curse, Copper, Duchy
+ 
+---------- Conqueror Bot: turn 15 ----------
+Conqueror Bot - duration Caravan
+Conqueror Bot - draws Copper
+Conqueror Bot - plays Necropolis
+Conqueror Bot - plays 1 Copper
+Conqueror Bot - draws Copper, Duchy, Grand Market, Curse, Duchy
+ 
+---------- Banker Bot: turn 16 ----------
+Banker Bot - plays Caravan
+Banker Bot - draws Copper
+Banker Bot - plays Caravan
+Banker Bot - draws Curse
+Banker Bot - plays 2 Silver, 1 Copper
+Banker Bot - buys Duchy
+Banker Bot - gains Duchy
+Banker Bot - draws Hovel, Copper, Copper, Curse, Gold
+ 
+---------- Kerry Monroe: turn 16 ----------
+Kerry Monroe - plays Count
+Kerry Monroe - discards Curse
+Kerry Monroe - discards Curse
+Kerry Monroe - gains Duchy
+Kerry Monroe - plays 1 Silver, 1 Copper
+Kerry Monroe - buys Silver
+Kerry Monroe - gains Silver
+Kerry Monroe - draws Copper, Hovel, Young Witch, Duchess, Curse
+ 
+---------- Warlord Bot: turn 16 ----------
+Warlord Bot - plays Cellar
+Warlord Bot - discards Copper
+Warlord Bot - discards Duchy
+Warlord Bot - discards Curse
+Warlord Bot - draws Copper, Curse, Curse
+Warlord Bot - plays Young Witch
+Warlord Bot - draws Silver, Cellar
+Warlord Bot - discards Curse
+Warlord Bot - discards Curse
+Warlord Bot - plays 1 Copper, 1 Silver
+Warlord Bot - buys Estate
+Warlord Bot - gains Estate
+Warlord Bot - draws Cellar, Curse, Curse
+Warlord Bot - shuffles deck
+Warlord Bot - draws Young Witch, Curse
+ 
+---------- Conqueror Bot: turn 16 ----------
+Conqueror Bot - plays Grand Market
+Conqueror Bot - draws Silver
+Conqueror Bot - plays 1 Copper, 1 Silver
+Conqueror Bot - buys Estate
+Conqueror Bot - gains Estate
+Conqueror Bot - buys Estate
+Conqueror Bot - gains Estate
+Conqueror Bot - draws Cellar
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Curse, Caravan, Duchy, Gold
+ 
+---------- Banker Bot: turn 17 ----------
+Banker Bot - duration Caravan
+Banker Bot - draws Curse
+Banker Bot - duration Caravan
+Banker Bot - draws Necropolis
+Banker Bot - plays Necropolis
+Banker Bot - plays 2 Copper, 1 Gold
+Banker Bot - buys Band of Misfits
+Banker Bot - gains Band of Misfits
+Banker Bot - draws Duchy
+Banker Bot - shuffles deck
+Banker Bot - draws Band of Misfits, Young Witch, Grand Market, Curse
+ 
+---------- Kerry Monroe: turn 17 ----------
+Kerry Monroe - plays Duchess
+Kerry Monroe - discards Curse
+Warlord Bot - discards Copper
+Conqueror Bot - discards Curse
+Banker Bot - discards Copper
+Kerry Monroe - plays 1 Copper
+Kerry Monroe - buys Estate
+Kerry Monroe - trashes Hovel
+Kerry Monroe - gains Estate
+Kerry Monroe - draws Overgrown Estate, Band of Misfits, Copper, Caravan, Count
+ 
+---------- Warlord Bot: turn 17 ----------
+Warlord Bot - plays Cellar
+Warlord Bot - discards Curse
+Warlord Bot - discards Curse
+Warlord Bot - discards Curse
+Warlord Bot - draws Curse, Band of Misfits, Copper
+Warlord Bot - plays Band of Misfits
+Warlord Bot - chooses Thief
+Warlord Bot - plays Thief
+Conqueror Bot - reveals: Curse, Copper
+Conqueror Bot - trashes Copper
+Conqueror Bot - discards Curse
+Banker Bot - reveals: Band of Misfits, Caravan
+Banker Bot - discards: Band of Misfits, Caravan
+Kerry Monroe - reveals: Curse, Caravan
+Kerry Monroe - discards: Curse, Caravan
+Warlord Bot - plays 1 Copper
+Warlord Bot - draws Silver, Hovel, Curse, Estate, Silver
+ 
+---------- Conqueror Bot: turn 17 ----------
+Conqueror Bot - plays Caravan
+Conqueror Bot - draws Estate
+Conqueror Bot - plays Cellar
+Conqueror Bot - discards Duchy
+Conqueror Bot - discards Estate
+Conqueror Bot - discards Curse
+Conqueror Bot - draws Overgrown Estate, Curse, Silver
+Conqueror Bot - plays 1 Gold, 1 Silver
+Conqueror Bot - buys Estate
+Conqueror Bot - gains Estate
+Conqueror Bot - draws Copper, Copper, Duchy, Copper, Grand Market
+ 
+---------- Banker Bot: turn 18 ----------
+Banker Bot - plays Grand Market
+Banker Bot - draws Estate
+Banker Bot - plays Band of Misfits
+Banker Bot - chooses Thief
+Banker Bot - plays Thief
+Kerry Monroe - reveals: Copper, Duchy
+Kerry Monroe - trashes Copper
+Kerry Monroe - discards Duchy
+Warlord Bot - reveals: Necropolis, Silver
+Warlord Bot - trashes Silver
+Warlord Bot - discards Necropolis
+Conqueror Bot - reveals: Curse, Silver
+Conqueror Bot - trashes Silver
+Conqueror Bot - discards Curse
+Banker Bot - gains Silver
+Banker Bot - gains Silver
+Banker Bot - buys Estate
+Banker Bot - gains Estate
+Banker Bot - draws Curse, Curse, Caravan, Young Witch, Curse
+ 
+---------- Kerry Monroe: turn 18 ----------
+Kerry Monroe - plays Caravan
+Kerry Monroe - draws Copper
+Kerry Monroe - plays Band of Misfits
+Kerry Monroe - chooses Caravan
+Kerry Monroe - plays Caravan
+Kerry Monroe - draws Curse
+Kerry Monroe - plays Count
+Kerry Monroe - discards Curse
+Kerry Monroe - discards Overgrown Estate
+Kerry Monroe - takes 3 coins
+Kerry Monroe - plays 2 Copper
+Kerry Monroe - buys Band of Misfits
+Kerry Monroe - gains Band of Misfits
+Kerry Monroe - draws Band of Misfits, Grand Market, Necropolis, Curse, Duchy
+ 
+---------- Warlord Bot: turn 18 ----------
+Warlord Bot - plays 2 Silver
+Warlord Bot - buys Caravan
+Warlord Bot - gains Caravan
+Warlord Bot - draws Copper, Band of Misfits, Copper, Young Witch, Cellar
+ 
+---------- Conqueror Bot: turn 18 ----------
+Conqueror Bot - duration Caravan
+Conqueror Bot - draws Duchy
+Conqueror Bot - plays Grand Market
+Conqueror Bot - draws Cellar
+Conqueror Bot - plays Cellar
+Conqueror Bot - discards Copper
+Conqueror Bot - discards Copper
+Conqueror Bot - discards Copper
+Conqueror Bot - discards Duchy
+Conqueror Bot - discards Duchy
+Conqueror Bot - draws Copper, Curse, Copper, Copper, Estate
+Conqueror Bot - plays 3 Copper
+Conqueror Bot - buys Estate
+Conqueror Bot - gains Estate
+Conqueror Bot - buys Silver
+Conqueror Bot - gains Silver
+Conqueror Bot - draws Estate, Copper, Count, Curse, Curse
+ 
+------------ Game Over ------------
+Conqueror Bot - cards: 2 Cellar, 1 Necropolis, 1 Count, 1 Grand Market, 1 Caravan, 7 Copper, 2 Silver, 1 Gold, 6 Estate, 4 Duchy, 1 Overgrown Estate, 9 Curse
+Conqueror Bot - total victory points: 9
+Conqueror Bot - turns: 18
+ 
+Banker Bot - cards: 4 Caravan, 2 Young Witch, 2 Band of Misfits, 1 Grand Market, 1 Necropolis, 6 Copper, 5 Silver, 1 Gold, 4 Duchy, 2 Estate, 1 Overgrown Estate, 1 Hovel, 6 Curse
+Banker Bot - total victory points: 8
+Banker Bot - turns: 18
+ 
+Kerry Monroe - cards: 3 Caravan, 2 Band of Misfits, 2 Count, 1 Necropolis, 1 Young Witch, 1 Duchess, 1 Grand Market, 5 Copper, 2 Silver, 1 Gold, 3 Duchy, 1 Estate, 1 Overgrown Estate, 7 Curse
+Kerry Monroe - total victory points: 3
+Kerry Monroe - turns: 18
+ 
+Warlord Bot - cards: 4 Cellar, 2 Young Witch, 2 Band of Misfits, 1 Caravan, 1 Necropolis, 7 Copper, 5 Silver, 3 Estate, 1 Overgrown Estate, 1 Duchy, 8 Curse, 1 Hovel
+Warlord Bot - total victory points: -2
+Warlord Bot - turns: 18
+ 
+1st place: Conqueror Bot
+2nd place: Banker Bot
+3rd place: Kerry Monroe
+4th place: Warlord Bot
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.50d9be02e4b0a3565c3644d5.1364832440947.txt b/testing/testdata/log.50d9be02e4b0a3565c3644d5.1364832440947.txt
new file mode 100644
index 0000000..6ce7106
--- /dev/null
+++ b/testing/testdata/log.50d9be02e4b0a3565c3644d5.1364832440947.txt
@@ -0,0 +1,1262 @@
+------------ Game Setup ------------
+Supply cards: Embargo, Scrying Pool, Tunnel, Fortress, Thief, Duke, Margrave, Mint, Outpost, Forge, Copper, Silver, Gold, Estate, Duchy, Province, Curse, Potion
+Asbjørn Lunnan - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Warlord Bot - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Defender Bot - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Asbjørn Lunnan - shuffles deck
+Warlord Bot - shuffles deck
+Defender Bot - shuffles deck
+Asbjørn Lunnan - draws Copper, Copper, Copper, Estate, Copper
+Warlord Bot - draws Copper, Copper, Estate, Copper, Copper
+Defender Bot - draws Copper, Copper, Copper, Copper, Copper
+ 
+---------- Defender Bot: turn 1 ----------
+Defender Bot - plays 5 Copper
+Defender Bot - buys Mint
+Defender Bot - trashes Copper, Copper, Copper, Copper, Copper
+Defender Bot - gains Mint
+Defender Bot - draws Copper, Estate, Estate, Copper, Estate
+ 
+---------- Asbjørn Lunnan: turn 1 ----------
+Asbjørn Lunnan - plays 4 Copper
+Asbjørn Lunnan - buys Silver
+Asbjørn Lunnan - gains Silver
+Asbjørn Lunnan - draws Copper, Estate, Copper, Estate, Copper
+ 
+---------- Warlord Bot: turn 1 ----------
+Warlord Bot - plays 4 Copper
+Warlord Bot - buys Potion
+Warlord Bot - gains Potion
+Warlord Bot - draws Estate, Estate, Copper, Copper, Copper
+ 
+---------- Defender Bot: turn 2 ----------
+Defender Bot - plays 2 Copper
+Defender Bot - buys Embargo
+Defender Bot - gains Embargo
+Defender Bot - shuffles deck
+Defender Bot - draws Estate, Mint, Copper, Estate, Copper
+ 
+---------- Asbjørn Lunnan: turn 2 ----------
+Asbjørn Lunnan - plays 3 Copper
+Asbjørn Lunnan - buys Silver
+Asbjørn Lunnan - gains Silver
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - draws Estate, Copper, Copper, Copper, Silver
+ 
+---------- Warlord Bot: turn 2 ----------
+Warlord Bot - plays 3 Copper
+Warlord Bot - buys Silver
+Warlord Bot - gains Silver
+Warlord Bot - shuffles deck
+Warlord Bot - draws Estate, Silver, Copper, Copper, Copper
+ 
+---------- Defender Bot: turn 3 ----------
+Defender Bot - plays Mint
+Defender Bot - reveals Copper
+Defender Bot - gains Copper
+Defender Bot - plays 2 Copper
+Defender Bot - buys Embargo
+Defender Bot - gains Embargo
+Defender Bot - draws Embargo, Estate
+Defender Bot - shuffles deck
+Defender Bot - draws Mint, Copper, Embargo
+ 
+---------- Asbjørn Lunnan: turn 3 ----------
+Asbjørn Lunnan - plays 3 Copper, 1 Silver
+Asbjørn Lunnan - buys Margrave
+Asbjørn Lunnan - gains Margrave
+Asbjørn Lunnan - draws Copper, Copper, Copper, Estate, Estate
+ 
+---------- Warlord Bot: turn 3 ----------
+Warlord Bot - plays 3 Copper, 1 Silver
+Warlord Bot - buys Margrave
+Warlord Bot - gains Margrave
+Warlord Bot - draws Potion, Copper, Estate, Copper, Copper
+ 
+---------- Defender Bot: turn 4 ----------
+Defender Bot - plays Mint
+Defender Bot - reveals Copper
+Defender Bot - gains Copper
+Defender Bot - plays 1 Copper
+Defender Bot - draws Copper, Estate, Estate, Copper
+Defender Bot - shuffles deck
+Defender Bot - draws Mint
+ 
+---------- Asbjørn Lunnan: turn 4 ----------
+Asbjørn Lunnan - plays 3 Copper
+Asbjørn Lunnan - buys Silver
+Asbjørn Lunnan - gains Silver
+Asbjørn Lunnan - draws Silver, Copper
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - draws Estate, Copper, Margrave
+ 
+---------- Warlord Bot: turn 4 ----------
+Warlord Bot - plays Potion
+Warlord Bot - plays 3 Copper
+Warlord Bot - buys Scrying Pool
+Warlord Bot - gains Scrying Pool
+Warlord Bot - draws Estate, Copper
+Warlord Bot - shuffles deck
+Warlord Bot - draws Estate, Potion, Copper
+ 
+---------- Defender Bot: turn 5 ----------
+Defender Bot - plays Mint
+Defender Bot - reveals Copper
+Defender Bot - gains Copper
+Defender Bot - plays 2 Copper
+Defender Bot - draws Embargo, Copper, Estate, Embargo, Copper
+ 
+---------- Asbjørn Lunnan: turn 5 ----------
+Asbjørn Lunnan - plays Margrave
+Asbjørn Lunnan - draws Copper, Estate, Estate
+Warlord Bot - draws Copper
+Warlord Bot - discards Estate
+Warlord Bot - discards Estate
+Warlord Bot - discards Copper
+Defender Bot - shuffles deck
+Defender Bot - draws Estate
+Defender Bot - discards Estate
+Defender Bot - discards Estate
+Defender Bot - discards Embargo
+Asbjørn Lunnan - plays 3 Copper, 1 Silver
+Asbjørn Lunnan - buys Margrave
+Asbjørn Lunnan - gains Margrave
+Asbjørn Lunnan - draws Copper, Silver, Copper, Silver, Copper
+ 
+---------- Warlord Bot: turn 5 ----------
+Warlord Bot - plays Potion
+Warlord Bot - plays 2 Copper
+Warlord Bot - buys Scrying Pool
+Warlord Bot - gains Scrying Pool
+Warlord Bot - draws Estate, Copper, Copper, Copper, Margrave
+ 
+---------- Defender Bot: turn 6 ----------
+Defender Bot - plays Embargo
+Defender Bot - embargoes Forge
+Defender Bot - trashes Embargo
+Defender Bot - plays 2 Copper
+Defender Bot - buys Potion
+Defender Bot - gains Potion
+Defender Bot - draws Mint, Copper, Copper, Copper, Estate
+ 
+---------- Asbjørn Lunnan: turn 6 ----------
+Asbjørn Lunnan - plays 3 Copper, 2 Silver
+Asbjørn Lunnan - buys Forge
+Asbjørn Lunnan - gains Curse
+Asbjørn Lunnan - gains Forge
+Asbjørn Lunnan - draws Copper
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - draws Copper, Curse, Copper, Margrave
+ 
+---------- Warlord Bot: turn 6 ----------
+Warlord Bot - plays Margrave
+Warlord Bot - draws Silver, Copper, Scrying Pool
+Defender Bot - shuffles deck
+Defender Bot - draws Embargo
+Defender Bot - discards Estate
+Defender Bot - discards Embargo
+Defender Bot - discards Copper
+Asbjørn Lunnan - draws Margrave
+Asbjørn Lunnan - discards Curse
+Asbjørn Lunnan - discards Copper
+Asbjørn Lunnan - discards Margrave
+Warlord Bot - plays 4 Copper, 1 Silver
+Warlord Bot - buys Gold
+Warlord Bot - gains Gold
+Warlord Bot - shuffles deck
+Warlord Bot - draws Copper, Copper, Scrying Pool, Copper, Estate
+ 
+---------- Defender Bot: turn 7 ----------
+Defender Bot - plays Mint
+Defender Bot - reveals Copper
+Defender Bot - gains Copper
+Defender Bot - plays 2 Copper
+Defender Bot - buys Embargo
+Defender Bot - gains Embargo
+Defender Bot - draws Potion, Copper, Copper, Estate, Estate
+ 
+---------- Asbjørn Lunnan: turn 7 ----------
+Asbjørn Lunnan - plays Margrave
+Asbjørn Lunnan - draws Silver, Copper, Estate
+Warlord Bot - draws Copper
+Warlord Bot - discards Estate
+Warlord Bot - discards Copper
+Warlord Bot - discards Copper
+Defender Bot - shuffles deck
+Defender Bot - draws Copper
+Defender Bot - discards Estate
+Defender Bot - discards Estate
+Defender Bot - discards Copper
+Asbjørn Lunnan - plays 3 Copper, 1 Silver
+Asbjørn Lunnan - buys Margrave
+Asbjørn Lunnan - gains Margrave
+Asbjørn Lunnan - draws Estate, Copper, Copper, Silver, Silver
+ 
+---------- Warlord Bot: turn 7 ----------
+Warlord Bot - plays Scrying Pool
+Warlord Bot - discards Estate
+Defender Bot - discards Embargo
+Asbjørn Lunnan - places Estate on top of deck
+Warlord Bot - reveals Silver
+Warlord Bot - plays 2 Copper, 1 Silver
+Warlord Bot - buys Thief
+Warlord Bot - gains Thief
+Warlord Bot - draws Copper, Copper, Scrying Pool, Estate, Potion
+ 
+---------- Defender Bot: turn 8 ----------
+Defender Bot - plays Potion
+Defender Bot - plays 2 Copper
+Defender Bot - buys Scrying Pool
+Defender Bot - gains Scrying Pool
+Defender Bot - draws Estate, Mint, Embargo, Copper, Copper
+ 
+---------- Asbjørn Lunnan: turn 8 ----------
+Asbjørn Lunnan - plays 2 Copper, 2 Silver
+Asbjørn Lunnan - buys Gold
+Asbjørn Lunnan - gains Gold
+Asbjørn Lunnan - draws Estate, Copper, Forge
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - draws Silver, Silver
+ 
+---------- Warlord Bot: turn 8 ----------
+Warlord Bot - plays Scrying Pool
+Warlord Bot - discards Copper
+Defender Bot - places Copper on top of deck
+Asbjørn Lunnan - places Copper on top of deck
+Warlord Bot - reveals Gold
+Warlord Bot - plays Potion
+Warlord Bot - plays 2 Copper, 1 Gold
+Warlord Bot - buys Margrave
+Warlord Bot - gains Margrave
+Warlord Bot - draws Margrave
+Warlord Bot - shuffles deck
+Warlord Bot - draws Thief, Copper, Estate, Copper
+ 
+---------- Defender Bot: turn 9 ----------
+Defender Bot - plays Mint
+Defender Bot - reveals Copper
+Defender Bot - gains Copper
+Defender Bot - plays 2 Copper
+Defender Bot - draws Copper
+Defender Bot - shuffles deck
+Defender Bot - draws Potion, Copper, Estate, Estate
+ 
+---------- Asbjørn Lunnan: turn 9 ----------
+Asbjørn Lunnan - plays Forge
+Asbjørn Lunnan - trashes Estate, Copper, Silver, Silver
+Asbjørn Lunnan - gains Province
+Asbjørn Lunnan - draws Copper, Copper, Margrave, Copper, Silver
+ 
+---------- Warlord Bot: turn 9 ----------
+Warlord Bot - plays Margrave
+Warlord Bot - draws Copper, Copper, Scrying Pool
+Defender Bot - draws Copper
+Defender Bot - discards Estate
+Defender Bot - discards Estate
+Defender Bot - discards Copper
+Asbjørn Lunnan - draws Margrave
+Asbjørn Lunnan - discards Margrave
+Asbjørn Lunnan - discards Copper
+Asbjørn Lunnan - discards Copper
+Warlord Bot - plays 4 Copper
+Warlord Bot - buys Fortress
+Warlord Bot - gains Fortress
+Warlord Bot - draws Silver, Estate, Estate, Copper, Copper
+ 
+---------- Defender Bot: turn 10 ----------
+Defender Bot - plays Potion
+Defender Bot - plays 2 Copper
+Defender Bot - buys Scrying Pool
+Defender Bot - gains Scrying Pool
+Defender Bot - draws Copper, Copper, Embargo, Scrying Pool, Mint
+ 
+---------- Asbjørn Lunnan: turn 10 ----------
+Asbjørn Lunnan - plays Margrave
+Asbjørn Lunnan - draws Estate, Curse, Copper
+Warlord Bot - draws Scrying Pool
+Warlord Bot - discards Estate
+Warlord Bot - discards Estate
+Warlord Bot - discards Copper
+Defender Bot - draws Copper
+Defender Bot - discards Embargo
+Defender Bot - discards Copper
+Defender Bot - discards Copper
+Asbjørn Lunnan - plays 2 Copper, 1 Silver
+Asbjørn Lunnan - buys Fortress
+Asbjørn Lunnan - gains Fortress
+Asbjørn Lunnan - draws Copper, Copper, Margrave, Gold, Estate
+ 
+---------- Warlord Bot: turn 10 ----------
+Warlord Bot - plays Scrying Pool
+Warlord Bot - discards Potion
+Defender Bot - discards Embargo
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - places Curse on top of deck
+Warlord Bot - reveals Margrave, Copper
+Warlord Bot - plays Margrave
+Warlord Bot - draws Gold
+Warlord Bot - shuffles deck
+Warlord Bot - draws Copper, Estate
+Defender Bot - draws Copper
+Defender Bot - discards Copper
+Asbjørn Lunnan - draws Curse
+Asbjørn Lunnan - discards Curse
+Asbjørn Lunnan - discards Estate
+Asbjørn Lunnan - discards Copper
+Warlord Bot - plays 3 Copper, 1 Silver, 1 Gold
+Warlord Bot - buys Fortress
+Warlord Bot - gains Fortress
+Warlord Bot - buys Fortress
+Warlord Bot - gains Fortress
+Warlord Bot - draws Thief, Estate, Scrying Pool, Copper, Copper
+ 
+---------- Defender Bot: turn 11 ----------
+Defender Bot - plays Scrying Pool
+Defender Bot - discards Estate
+Asbjørn Lunnan - discards Silver
+Warlord Bot - places Estate on top of deck
+Defender Bot - shuffles deck
+Defender Bot - reveals Estate
+Defender Bot - plays Mint
+Defender Bot - reveals Copper
+Defender Bot - gains Copper
+Defender Bot - plays 1 Copper
+Defender Bot - draws Copper, Estate, Estate, Embargo, Copper
+ 
+---------- Asbjørn Lunnan: turn 11 ----------
+Asbjørn Lunnan - plays Margrave
+Asbjørn Lunnan - draws Copper, Margrave, Copper
+Warlord Bot - draws Estate
+Warlord Bot - discards Estate
+Warlord Bot - discards Estate
+Warlord Bot - discards Copper
+Defender Bot - draws Copper
+Defender Bot - discards Estate
+Defender Bot - discards Estate
+Defender Bot - discards Copper
+Asbjørn Lunnan - draws Estate, Margrave, Province, Copper, Forge
+ 
+---------- Warlord Bot: turn 11 ----------
+Warlord Bot - plays Scrying Pool
+Warlord Bot - places Fortress on top of deck
+Defender Bot - discards Scrying Pool
+Asbjørn Lunnan - places Copper on top of deck
+Warlord Bot - reveals Fortress, Potion
+Warlord Bot - plays Fortress
+Warlord Bot - draws Margrave
+Warlord Bot - plays Margrave
+Warlord Bot - draws Copper, Copper
+Warlord Bot - shuffles deck
+Warlord Bot - draws Estate
+Defender Bot - draws Embargo
+Defender Bot - discards Embargo
+Asbjørn Lunnan - draws Copper
+Asbjørn Lunnan - discards Estate
+Asbjørn Lunnan - discards Province
+Asbjørn Lunnan - discards Forge
+Warlord Bot - plays Thief
+Defender Bot - reveals: Copper, Potion
+Warlord Bot - trashes Potion
+Defender Bot - discards Copper
+Asbjørn Lunnan - reveals: Fortress
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - reveals: Province
+Asbjørn Lunnan - discards: Fortress, Province
+Warlord Bot - gains Potion
+Warlord Bot - plays Potion
+Warlord Bot - plays 3 Copper
+Warlord Bot - buys Scrying Pool
+Warlord Bot - gains Scrying Pool
+Warlord Bot - draws Silver, Scrying Pool, Margrave, Copper, Copper
+ 
+---------- Defender Bot: turn 12 ----------
+Defender Bot - plays Embargo
+Defender Bot - embargoes Embargo
+Defender Bot - trashes Embargo
+Defender Bot - plays 2 Copper
+Defender Bot - buys Potion
+Defender Bot - gains Potion
+Defender Bot - draws Copper, Copper
+Defender Bot - shuffles deck
+Defender Bot - draws Copper, Copper, Estate
+ 
+---------- Asbjørn Lunnan: turn 12 ----------
+Asbjørn Lunnan - plays Margrave
+Asbjørn Lunnan - draws Copper, Estate, Copper
+Warlord Bot - draws Fortress
+Warlord Bot - discards Copper
+Warlord Bot - discards Copper
+Warlord Bot - discards Silver
+Defender Bot - draws Scrying Pool
+Defender Bot - discards Estate
+Defender Bot - discards Copper
+Defender Bot - discards Copper
+Asbjørn Lunnan - plays 4 Copper
+Asbjørn Lunnan - buys Fortress
+Asbjørn Lunnan - gains Fortress
+Asbjørn Lunnan - draws Gold, Forge, Curse, Copper, Copper
+ 
+---------- Warlord Bot: turn 12 ----------
+Warlord Bot - plays Fortress
+Warlord Bot - draws Gold
+Warlord Bot - plays Scrying Pool
+Warlord Bot - discards Copper
+Defender Bot - discards Scrying Pool
+Asbjørn Lunnan - places Estate on top of deck
+Warlord Bot - reveals Estate
+Warlord Bot - plays Margrave
+Warlord Bot - draws Copper, Estate, Fortress
+Defender Bot - draws Potion
+Defender Bot - discards Copper
+Asbjørn Lunnan - draws Estate
+Asbjørn Lunnan - discards Gold
+Asbjørn Lunnan - discards Estate
+Asbjørn Lunnan - discards Copper
+Warlord Bot - plays Fortress
+Warlord Bot - shuffles deck
+Warlord Bot - draws Copper
+Warlord Bot - plays 2 Copper, 1 Gold
+Warlord Bot - buys Margrave
+Warlord Bot - gains Margrave
+Warlord Bot - draws Scrying Pool, Silver, Potion, Copper, Thief
+ 
+---------- Defender Bot: turn 13 ----------
+Defender Bot - plays Scrying Pool
+Defender Bot - discards Estate
+Asbjørn Lunnan - discards Margrave
+Warlord Bot - places Potion on top of deck
+Defender Bot - reveals Copper
+Defender Bot - plays Potion
+Defender Bot - plays 2 Copper
+Defender Bot - buys Scrying Pool
+Defender Bot - gains Scrying Pool
+Defender Bot - draws Estate, Copper, Copper, Mint, Copper
+ 
+---------- Asbjørn Lunnan: turn 13 ----------
+Asbjørn Lunnan - plays Forge
+Asbjørn Lunnan - trashes Curse, Copper
+Asbjørn Lunnan - gains Copper
+Asbjørn Lunnan - draws Silver, Margrave
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - draws Fortress, Estate, Forge
+ 
+---------- Warlord Bot: turn 13 ----------
+Warlord Bot - plays Scrying Pool
+Warlord Bot - discards Potion
+Defender Bot - discards Embargo
+Asbjørn Lunnan - places Copper on top of deck
+Warlord Bot - reveals Copper
+Warlord Bot - plays Thief
+Defender Bot - shuffles deck
+Defender Bot - reveals: Scrying Pool, Copper
+Warlord Bot - trashes Copper
+Defender Bot - discards Scrying Pool
+Asbjørn Lunnan - reveals: Copper, Gold
+Warlord Bot - trashes Gold
+Asbjørn Lunnan - discards Copper
+Warlord Bot - gains Gold
+Warlord Bot - plays Potion
+Warlord Bot - plays 2 Copper, 1 Silver
+Warlord Bot - buys Scrying Pool
+Warlord Bot - gains Scrying Pool
+Warlord Bot - draws Copper, Margrave, Fortress, Estate, Copper
+ 
+---------- Defender Bot: turn 14 ----------
+Defender Bot - plays Mint
+Defender Bot - reveals Copper
+Defender Bot - gains Copper
+Defender Bot - plays 3 Copper
+Defender Bot - buys Silver
+Defender Bot - gains Silver
+Defender Bot - draws Copper, Estate, Copper, Copper, Copper
+ 
+---------- Asbjørn Lunnan: turn 14 ----------
+Asbjørn Lunnan - plays Fortress
+Asbjørn Lunnan - draws Province
+Asbjørn Lunnan - plays Margrave
+Asbjørn Lunnan - draws Copper, Copper, Fortress
+Warlord Bot - draws Copper
+Warlord Bot - discards Estate
+Warlord Bot - discards Copper
+Warlord Bot - discards Copper
+Defender Bot - draws Scrying Pool
+Defender Bot - discards Estate
+Defender Bot - discards Copper
+Defender Bot - discards Copper
+Asbjørn Lunnan - plays Fortress
+Asbjørn Lunnan - draws Margrave
+Asbjørn Lunnan - plays Margrave
+Asbjørn Lunnan - draws Copper, Estate, Margrave
+Warlord Bot - draws Scrying Pool
+Warlord Bot - discards Copper
+Defender Bot - draws Scrying Pool
+Defender Bot - discards Copper
+Asbjørn Lunnan - plays Forge
+Asbjørn Lunnan - trashes Estate, Copper, Copper, Copper, Estate, Margrave
+Asbjørn Lunnan - plays 1 Silver
+Asbjørn Lunnan - draws Copper, Copper
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - draws Forge, Province, Copper
+ 
+---------- Warlord Bot: turn 14 ----------
+Warlord Bot - plays Fortress
+Warlord Bot - shuffles deck
+Warlord Bot - draws Copper
+Warlord Bot - plays Scrying Pool
+Warlord Bot - places Gold on top of deck
+Defender Bot - places Potion on top of deck
+Asbjørn Lunnan - discards Silver
+Warlord Bot - reveals Gold
+Warlord Bot - plays Margrave
+Warlord Bot - draws Estate, Copper, Fortress
+Defender Bot - draws Potion
+Defender Bot - discards Copper
+Asbjørn Lunnan - draws Fortress
+Asbjørn Lunnan - discards Province
+Asbjørn Lunnan - discards Copper
+Asbjørn Lunnan - discards Copper
+Warlord Bot - plays Fortress
+Warlord Bot - draws Estate
+Warlord Bot - plays 2 Copper, 1 Gold
+Warlord Bot - buys Duchy
+Warlord Bot - gains Duchy
+Warlord Bot - draws Margrave, Potion, Fortress, Copper, Margrave
+ 
+---------- Defender Bot: turn 15 ----------
+Defender Bot - plays Scrying Pool
+Defender Bot - places Embargo on top of deck
+Asbjørn Lunnan - discards Margrave
+Warlord Bot - places Copper on top of deck
+Defender Bot - reveals Embargo, Estate
+Defender Bot - plays Scrying Pool
+Defender Bot - shuffles deck
+Defender Bot - discards Copper
+Asbjørn Lunnan - discards Fortress
+Warlord Bot - places Copper on top of deck
+Defender Bot - reveals Silver
+Defender Bot - plays Embargo
+Defender Bot - embargoes Potion
+Defender Bot - trashes Embargo
+Defender Bot - plays Potion
+Defender Bot - plays 1 Silver
+Defender Bot - buys Scrying Pool
+Defender Bot - gains Scrying Pool
+Defender Bot - draws Copper, Estate, Copper, Scrying Pool, Copper
+ 
+---------- Asbjørn Lunnan: turn 15 ----------
+Asbjørn Lunnan - plays Forge
+Asbjørn Lunnan - trashes Copper, Fortress
+Asbjørn Lunnan - gains Fortress
+Asbjørn Lunnan - draws Margrave
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - draws Fortress, Province, Copper, Margrave
+ 
+---------- Warlord Bot: turn 15 ----------
+Warlord Bot - plays Fortress
+Warlord Bot - draws Copper
+Warlord Bot - plays Margrave
+Warlord Bot - draws Copper, Estate, Silver
+Defender Bot - draws Copper
+Defender Bot - discards Estate
+Defender Bot - discards Copper
+Defender Bot - discards Copper
+Asbjørn Lunnan - draws Fortress
+Asbjørn Lunnan - discards Province
+Asbjørn Lunnan - discards Copper
+Asbjørn Lunnan - discards Fortress
+Warlord Bot - plays Margrave
+Warlord Bot - draws Thief, Scrying Pool, Potion
+Defender Bot - draws Copper
+Defender Bot - discards Copper
+Asbjørn Lunnan - draws Silver
+Asbjørn Lunnan - discards Silver
+Warlord Bot - plays Potion
+Warlord Bot - plays Potion
+Warlord Bot - plays 3 Copper, 1 Silver
+Warlord Bot - buys Scrying Pool
+Warlord Bot - gains Scrying Pool
+Warlord Bot - buys Scrying Pool
+Warlord Bot - gains Scrying Pool
+Warlord Bot - draws Gold, Scrying Pool, Scrying Pool, Copper, Copper
+ 
+---------- Defender Bot: turn 16 ----------
+Defender Bot - plays Scrying Pool
+Defender Bot - discards Estate
+Asbjørn Lunnan - discards Fortress
+Warlord Bot - shuffles deck
+Warlord Bot - discards Margrave
+Defender Bot - reveals Copper
+Defender Bot - plays 3 Copper
+Defender Bot - buys Tunnel
+Defender Bot - gains Tunnel
+Defender Bot - draws Mint, Copper
+Defender Bot - shuffles deck
+Defender Bot - draws Estate, Estate, Scrying Pool
+ 
+---------- Asbjørn Lunnan: turn 16 ----------
+Asbjørn Lunnan - plays Fortress
+Asbjørn Lunnan - draws Copper
+Asbjørn Lunnan - plays Margrave
+Asbjørn Lunnan - draws Forge
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - draws Fortress, Copper
+Warlord Bot - draws Margrave
+Warlord Bot - discards Copper
+Warlord Bot - discards Copper
+Warlord Bot - discards Gold
+Defender Bot - draws Scrying Pool
+Defender Bot - discards Estate
+Defender Bot - discards Estate
+Defender Bot - discards Copper
+Asbjørn Lunnan - plays Fortress
+Asbjørn Lunnan - draws Fortress
+Asbjørn Lunnan - plays Forge
+Asbjørn Lunnan - trashes Copper, Copper, Fortress
+Asbjørn Lunnan - gains Fortress
+Asbjørn Lunnan - plays Fortress
+Asbjørn Lunnan - draws Silver
+Asbjørn Lunnan - plays Margrave
+Asbjørn Lunnan - draws Province
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - draws Fortress
+Warlord Bot - draws Copper
+Warlord Bot - discards Copper
+Defender Bot - draws Copper
+Defender Bot - discards Copper
+Asbjørn Lunnan - plays Fortress
+Asbjørn Lunnan - plays 1 Silver
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - draws Fortress, Silver, Province, Fortress, Fortress
+ 
+---------- Warlord Bot: turn 16 ----------
+Warlord Bot - plays Scrying Pool
+Warlord Bot - places Margrave on top of deck
+Defender Bot - places Estate on top of deck
+Asbjørn Lunnan - discards Margrave
+Warlord Bot - reveals Margrave, Copper
+Warlord Bot - plays Scrying Pool
+Warlord Bot - places Scrying Pool on top of deck
+Defender Bot - places Estate on top of deck
+Asbjørn Lunnan - discards Fortress
+Warlord Bot - reveals Scrying Pool, Copper
+Warlord Bot - plays Scrying Pool
+Warlord Bot - places Fortress on top of deck
+Defender Bot - places Estate on top of deck
+Asbjørn Lunnan - discards Forge
+Warlord Bot - reveals Fortress, Scrying Pool, Fortress, Estate
+Warlord Bot - plays Fortress
+Warlord Bot - draws Gold
+Warlord Bot - plays Fortress
+Warlord Bot - draws Fortress
+Warlord Bot - plays Fortress
+Warlord Bot - draws Potion
+Warlord Bot - plays Scrying Pool
+Warlord Bot - discards Copper
+Defender Bot - places Estate on top of deck
+Asbjørn Lunnan - discards Margrave
+Warlord Bot - reveals Scrying Pool, Potion
+Warlord Bot - plays Scrying Pool
+Warlord Bot - places Scrying Pool on top of deck
+Defender Bot - places Estate on top of deck
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - discards Forge
+Warlord Bot - reveals Scrying Pool, Thief, Duchy
+Warlord Bot - plays Scrying Pool
+Warlord Bot - discards Estate
+Defender Bot - places Estate on top of deck
+Asbjørn Lunnan - discards Margrave
+Warlord Bot - reveals Estate
+Warlord Bot - plays Margrave
+Warlord Bot - draws Copper, Silver
+Warlord Bot - shuffles deck
+Warlord Bot - draws Margrave
+Defender Bot - draws Estate
+Defender Bot - discards Estate
+Asbjørn Lunnan - draws Fortress
+Asbjørn Lunnan - discards Province
+Asbjørn Lunnan - discards Fortress
+Asbjørn Lunnan - discards Fortress
+Warlord Bot - plays Margrave
+Warlord Bot - draws Copper, Copper, Estate
+Defender Bot - draws Copper
+Defender Bot - discards Copper
+Asbjørn Lunnan - draws Margrave
+Asbjørn Lunnan - discards Silver
+Warlord Bot - plays Margrave
+Warlord Bot - draws Copper, Gold, Copper
+Defender Bot - draws Copper
+Defender Bot - discards Copper
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - draws Silver
+Asbjørn Lunnan - discards Fortress
+Warlord Bot - plays Thief
+Defender Bot - reveals: Copper, Copper
+Warlord Bot - trashes Copper
+Defender Bot - discards Copper
+Asbjørn Lunnan - reveals: Province, Fortress
+Asbjørn Lunnan - discards: Province, Fortress
+Warlord Bot - plays Potion
+Warlord Bot - plays Potion
+Warlord Bot - plays 7 Copper, 2 Gold, 1 Silver
+Warlord Bot - buys Duchy
+Warlord Bot - gains Duchy
+Warlord Bot - buys Duchy
+Warlord Bot - gains Duchy
+Warlord Bot - buys Duchy
+Warlord Bot - gains Duchy
+Warlord Bot - shuffles deck
+Warlord Bot - draws Gold, Scrying Pool, Potion, Scrying Pool, Copper
+ 
+---------- Defender Bot: turn 17 ----------
+Defender Bot - plays Scrying Pool
+Defender Bot - places Silver on top of deck
+Asbjørn Lunnan - discards Fortress
+Warlord Bot - places Duchy on top of deck
+Defender Bot - reveals Silver
+Defender Bot - plays Scrying Pool
+Defender Bot - discards Tunnel
+Defender Bot - reveals reaction Tunnel
+Defender Bot - gains Gold
+Asbjørn Lunnan - discards Forge
+Warlord Bot - places Duchy on top of deck
+Defender Bot - reveals Potion
+Defender Bot - plays Mint
+Defender Bot - reveals Potion
+Defender Bot - gains Potion
+Defender Bot - plays Potion
+Defender Bot - plays 1 Silver
+Defender Bot - buys Estate
+Defender Bot - gains Estate
+Defender Bot - draws Scrying Pool, Copper, Scrying Pool, Copper
+Defender Bot - shuffles deck
+Defender Bot - draws Estate
+ 
+---------- Asbjørn Lunnan: turn 17 ----------
+Asbjørn Lunnan - plays Fortress
+Asbjørn Lunnan - draws Margrave
+Asbjørn Lunnan - plays Margrave
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - draws Fortress, Fortress, Province
+Warlord Bot - draws Duchy
+Warlord Bot - discards Duchy
+Warlord Bot - discards Copper
+Warlord Bot - discards Potion
+Defender Bot - draws Copper
+Defender Bot - discards Estate
+Defender Bot - discards Copper
+Defender Bot - discards Copper
+Asbjørn Lunnan - plays Fortress
+Asbjørn Lunnan - draws Forge
+Asbjørn Lunnan - plays Margrave
+Asbjørn Lunnan - draws Fortress
+Warlord Bot - draws Duchy
+Warlord Bot - discards Duchy
+Defender Bot - draws Copper
+Defender Bot - discards Copper
+Asbjørn Lunnan - plays Forge
+Asbjørn Lunnan - trashes Fortress, Fortress
+Asbjørn Lunnan - applies the 'when you trash ability' of Fortress
+Asbjørn Lunnan - applies the 'when you trash ability' of Fortress
+Asbjørn Lunnan - gains Province
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - draws Fortress, Forge, Fortress, Province, Margrave
+ 
+---------- Warlord Bot: turn 17 ----------
+Warlord Bot - plays Scrying Pool
+Warlord Bot - discards Potion
+Defender Bot - discards Gold
+Asbjørn Lunnan - discards Silver
+Warlord Bot - reveals Scrying Pool, Margrave, Copper
+Warlord Bot - plays Scrying Pool
+Warlord Bot - discards Duchy
+Defender Bot - places Copper on top of deck
+Asbjørn Lunnan - discards Fortress
+Warlord Bot - reveals Copper
+Warlord Bot - plays Scrying Pool
+Warlord Bot - discards Copper
+Defender Bot - places Copper on top of deck
+Asbjørn Lunnan - discards Fortress
+Warlord Bot - reveals Copper
+Warlord Bot - plays Margrave
+Warlord Bot - draws Estate, Fortress, Estate
+Defender Bot - draws Copper
+Defender Bot - discards Copper
+Asbjørn Lunnan - draws Province
+Asbjørn Lunnan - discards Province
+Asbjørn Lunnan - discards Province
+Asbjørn Lunnan - discards Margrave
+Warlord Bot - plays 3 Copper, 1 Gold
+Warlord Bot - buys Duke
+Warlord Bot - gains Duke
+Warlord Bot - draws Silver, Estate, Thief, Scrying Pool, Scrying Pool
+ 
+---------- Defender Bot: turn 18 ----------
+Defender Bot - plays Scrying Pool
+Defender Bot - places Mint on top of deck
+Asbjørn Lunnan - discards Margrave
+Warlord Bot - discards Margrave
+Defender Bot - reveals Mint, Copper
+Defender Bot - plays Scrying Pool
+Defender Bot - places Scrying Pool on top of deck
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - discards Margrave
+Warlord Bot - places Copper on top of deck
+Defender Bot - reveals Scrying Pool, Estate
+Defender Bot - plays Scrying Pool
+Defender Bot - discards Tunnel
+Defender Bot - reveals reaction Tunnel
+Defender Bot - gains Gold
+Asbjørn Lunnan - discards Margrave
+Warlord Bot - places Copper on top of deck
+Defender Bot - reveals Estate
+Defender Bot - plays Mint
+Defender Bot - reveals Copper
+Defender Bot - gains Copper
+Defender Bot - plays 2 Copper
+Defender Bot - buys Estate
+Defender Bot - gains Estate
+Defender Bot - draws Potion, Scrying Pool, Copper, Potion, Silver
+ 
+---------- Asbjørn Lunnan: turn 18 ----------
+Asbjørn Lunnan - plays Forge
+Asbjørn Lunnan - trashes Fortress, Fortress
+Asbjørn Lunnan - applies the 'when you trash ability' of Fortress
+Asbjørn Lunnan - applies the 'when you trash ability' of Fortress
+Asbjørn Lunnan - gains Province
+Asbjørn Lunnan - draws Fortress, Province, Silver, Fortress, Province
+ 
+---------- Warlord Bot: turn 18 ----------
+Warlord Bot - plays Scrying Pool
+Warlord Bot - discards Copper
+Defender Bot - places Estate on top of deck
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - discards Fortress
+Warlord Bot - reveals Gold
+Warlord Bot - plays Scrying Pool
+Warlord Bot - discards Copper
+Defender Bot - places Estate on top of deck
+Asbjørn Lunnan - discards Margrave
+Warlord Bot - reveals Duchy
+Warlord Bot - plays Thief
+Defender Bot - reveals: Estate
+Defender Bot - shuffles deck
+Defender Bot - reveals: Copper
+Warlord Bot - trashes Copper
+Defender Bot - discards Estate
+Asbjørn Lunnan - reveals: Margrave, Fortress
+Asbjørn Lunnan - discards: Margrave, Fortress
+Warlord Bot - plays 1 Silver, 1 Gold
+Warlord Bot - buys Duchy
+Warlord Bot - gains Duchy
+Warlord Bot - draws Fortress, Scrying Pool, Fortress, Margrave
+Warlord Bot - shuffles deck
+Warlord Bot - draws Scrying Pool
+ 
+---------- Defender Bot: turn 19 ----------
+Defender Bot - plays Scrying Pool
+Defender Bot - places Scrying Pool on top of deck
+Asbjørn Lunnan - discards Forge
+Warlord Bot - places Estate on top of deck
+Defender Bot - reveals Scrying Pool, Estate
+Defender Bot - plays Scrying Pool
+Defender Bot - discards Tunnel
+Defender Bot - reveals reaction Tunnel
+Defender Bot - gains Gold
+Asbjørn Lunnan - places Province on top of deck
+Warlord Bot - places Estate on top of deck
+Defender Bot - reveals Copper
+Defender Bot - plays Potion
+Defender Bot - plays Potion
+Defender Bot - plays 2 Copper, 1 Silver
+Defender Bot - buys Tunnel
+Defender Bot - gains Tunnel
+Defender Bot - draws Estate, Copper, Estate, Gold, Copper
+ 
+---------- Asbjørn Lunnan: turn 19 ----------
+Asbjørn Lunnan - plays Fortress
+Asbjørn Lunnan - draws Province
+Asbjørn Lunnan - plays Fortress
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - draws Fortress
+Asbjørn Lunnan - plays Fortress
+Asbjørn Lunnan - draws Margrave
+Asbjørn Lunnan - plays Margrave
+Asbjørn Lunnan - draws Margrave, Forge, Fortress
+Warlord Bot - draws Estate
+Warlord Bot - discards Estate
+Warlord Bot - discards Margrave
+Warlord Bot - discards Scrying Pool
+Defender Bot - draws Gold
+Defender Bot - discards Estate
+Defender Bot - discards Estate
+Defender Bot - discards Copper
+Asbjørn Lunnan - plays Forge
+Asbjørn Lunnan - trashes Fortress
+Asbjørn Lunnan - gains Fortress
+Asbjørn Lunnan - plays Fortress
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - draws Fortress
+Asbjørn Lunnan - plays Fortress
+Asbjørn Lunnan - plays Margrave
+Warlord Bot - draws Estate
+Warlord Bot - discards Estate
+Defender Bot - draws Copper
+Defender Bot - discards Copper
+Asbjørn Lunnan - plays 1 Silver
+Asbjørn Lunnan - buys Copper
+Asbjørn Lunnan - gains Copper
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - draws Margrave, Forge, Margrave, Province, Copper
+ 
+---------- Warlord Bot: turn 19 ----------
+Warlord Bot - plays Fortress
+Warlord Bot - draws Estate
+Warlord Bot - plays Fortress
+Warlord Bot - draws Copper
+Warlord Bot - plays Scrying Pool
+Warlord Bot - discards Duchy
+Defender Bot - discards Scrying Pool
+Asbjørn Lunnan - discards Fortress
+Warlord Bot - reveals Silver
+Warlord Bot - plays 1 Copper, 1 Silver
+Warlord Bot - buys Tunnel
+Warlord Bot - gains Tunnel
+Warlord Bot - draws Copper, Copper, Potion, Duchy, Gold
+ 
+---------- Defender Bot: turn 20 ----------
+Defender Bot - plays 2 Gold, 1 Copper
+Defender Bot - buys Duchy
+Defender Bot - gains Duchy
+Defender Bot - draws Estate, Mint, Scrying Pool, Copper, Copper
+ 
+---------- Asbjørn Lunnan: turn 20 ----------
+Asbjørn Lunnan - plays Margrave
+Asbjørn Lunnan - draws Fortress, Fortress, Fortress
+Warlord Bot - draws Duchy
+Warlord Bot - discards Duchy
+Warlord Bot - discards Duchy
+Warlord Bot - discards Copper
+Defender Bot - shuffles deck
+Defender Bot - draws Estate
+Defender Bot - discards Estate
+Defender Bot - discards Estate
+Defender Bot - discards Copper
+Asbjørn Lunnan - draws Fortress, Province, Silver, Province
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - draws Forge
+ 
+---------- Warlord Bot: turn 20 ----------
+Warlord Bot - plays Potion
+Warlord Bot - plays 1 Copper, 1 Gold
+Warlord Bot - buys Tunnel
+Warlord Bot - gains Tunnel
+Warlord Bot - draws Gold, Potion, Duke, Duchy, Margrave
+ 
+---------- Defender Bot: turn 21 ----------
+Defender Bot - plays Scrying Pool
+Defender Bot - places Silver on top of deck
+Asbjørn Lunnan - places Copper on top of deck
+Warlord Bot - discards Scrying Pool
+Defender Bot - reveals Silver
+Defender Bot - plays Mint
+Defender Bot - reveals Silver
+Defender Bot - gains Silver
+Defender Bot - plays 1 Copper, 1 Silver
+Defender Bot - buys Tunnel
+Defender Bot - gains Tunnel
+Defender Bot - draws Estate, Copper, Tunnel, Copper, Estate
+ 
+---------- Asbjørn Lunnan: turn 21 ----------
+Asbjørn Lunnan - plays Fortress
+Asbjørn Lunnan - draws Copper
+Asbjørn Lunnan - plays 1 Silver, 1 Copper
+Asbjørn Lunnan - buys Silver
+Asbjørn Lunnan - gains Silver
+Asbjørn Lunnan - draws Fortress, Province, Fortress, Margrave, Fortress
+ 
+---------- Warlord Bot: turn 21 ----------
+Warlord Bot - plays Margrave
+Warlord Bot - draws Scrying Pool, Copper, Copper
+Defender Bot - draws Gold
+Defender Bot - discards Tunnel
+Defender Bot - discards Estate
+Defender Bot - discards Estate
+Defender Bot - reveals reaction Tunnel
+Defender Bot - gains Gold
+Asbjørn Lunnan - draws Fortress
+Asbjørn Lunnan - discards Province
+Asbjørn Lunnan - discards Fortress
+Asbjørn Lunnan - discards Fortress
+Warlord Bot - plays Potion
+Warlord Bot - plays 2 Copper, 1 Gold
+Warlord Bot - buys Duke
+Warlord Bot - gains Duke
+Warlord Bot - buys Copper
+Warlord Bot - gains Copper
+Warlord Bot - draws Margrave, Copper, Scrying Pool, Thief, Duchy
+ 
+---------- Defender Bot: turn 22 ----------
+Defender Bot - plays 2 Copper, 1 Gold
+Defender Bot - buys Duchy
+Defender Bot - gains Duchy
+Defender Bot - draws Potion, Gold, Copper, Gold, Potion
+ 
+---------- Asbjørn Lunnan: turn 22 ----------
+Asbjørn Lunnan - plays Fortress
+Asbjørn Lunnan - draws Margrave
+Asbjørn Lunnan - plays Margrave
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - draws Province, Silver, Fortress
+Warlord Bot - draws Fortress
+Warlord Bot - discards Duchy
+Warlord Bot - discards Copper
+Warlord Bot - discards Thief
+Defender Bot - draws Estate
+Defender Bot - discards Estate
+Defender Bot - discards Copper
+Defender Bot - discards Potion
+Asbjørn Lunnan - plays Fortress
+Asbjørn Lunnan - draws Fortress
+Asbjørn Lunnan - plays Margrave
+Asbjørn Lunnan - draws Forge, Copper, Province
+Warlord Bot - draws Copper
+Warlord Bot - discards Copper
+Defender Bot - draws Tunnel
+Defender Bot - discards Tunnel
+Defender Bot - reveals reaction Tunnel
+Defender Bot - gains Gold
+Asbjørn Lunnan - plays Forge
+Asbjørn Lunnan - trashes Copper, Fortress, Fortress
+Asbjørn Lunnan - applies the 'when you trash ability' of Fortress
+Asbjørn Lunnan - applies the 'when you trash ability' of Fortress
+Asbjørn Lunnan - gains Province
+Asbjørn Lunnan - draws Fortress, Silver, Province
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - draws Province, Fortress
+ 
+---------- Warlord Bot: turn 22 ----------
+Warlord Bot - plays Fortress
+Warlord Bot - draws Scrying Pool
+Warlord Bot - plays Scrying Pool
+Warlord Bot - shuffles deck
+Warlord Bot - discards Duchy
+Defender Bot - places Copper on top of deck
+Asbjørn Lunnan - discards Fortress
+Warlord Bot - reveals Duchy
+Warlord Bot - plays Scrying Pool
+Warlord Bot - discards Copper
+Defender Bot - places Copper on top of deck
+Asbjørn Lunnan - discards Fortress
+Warlord Bot - reveals Gold
+Warlord Bot - plays Margrave
+Warlord Bot - draws Tunnel, Copper, Estate
+Defender Bot - draws Copper
+Defender Bot - discards Copper
+Asbjørn Lunnan - draws Fortress
+Asbjørn Lunnan - discards Province
+Asbjørn Lunnan - discards Province
+Asbjørn Lunnan - discards Fortress
+Warlord Bot - plays 1 Gold, 1 Copper
+Warlord Bot - buys Tunnel
+Warlord Bot - gains Tunnel
+Warlord Bot - buys Copper
+Warlord Bot - gains Copper
+Warlord Bot - draws Margrave, Copper, Estate, Copper, Silver
+ 
+---------- Defender Bot: turn 23 ----------
+Defender Bot - plays Potion
+Defender Bot - plays 2 Gold
+Defender Bot - buys Duchy
+Defender Bot - gains Duchy
+Defender Bot - draws Scrying Pool, Copper, Scrying Pool, Scrying Pool, Duchy
+ 
+---------- Asbjørn Lunnan: turn 23 ----------
+Asbjørn Lunnan - plays Fortress
+Asbjørn Lunnan - draws Margrave
+Asbjørn Lunnan - plays Margrave
+Asbjørn Lunnan - draws Margrave, Forge, Silver
+Warlord Bot - draws Fortress
+Warlord Bot - discards Estate
+Warlord Bot - discards Copper
+Warlord Bot - discards Copper
+Defender Bot - shuffles deck
+Defender Bot - draws Copper
+Defender Bot - discards Duchy
+Defender Bot - discards Copper
+Defender Bot - discards Copper
+Asbjørn Lunnan - plays Fortress
+Asbjørn Lunnan - draws Province
+Asbjørn Lunnan - plays Margrave
+Asbjørn Lunnan - draws Province
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - draws Province, Fortress
+Warlord Bot - draws Tunnel
+Warlord Bot - discards Tunnel
+Warlord Bot - reveals reaction Tunnel
+Warlord Bot - gains Gold
+Defender Bot - draws Estate
+Defender Bot - discards Estate
+Asbjørn Lunnan - plays Forge
+Asbjørn Lunnan - trashes Fortress
+Asbjørn Lunnan - gains Fortress
+Asbjørn Lunnan - plays 2 Silver
+Asbjørn Lunnan - buys Silver
+Asbjørn Lunnan - gains Silver
+Asbjørn Lunnan - draws Fortress, Fortress, Province
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - draws Fortress, Fortress
+ 
+---------- Warlord Bot: turn 23 ----------
+Warlord Bot - plays Fortress
+Warlord Bot - draws Scrying Pool
+Warlord Bot - plays Scrying Pool
+Warlord Bot - discards Duke
+Defender Bot - places Potion on top of deck
+Asbjørn Lunnan - discards Fortress
+Warlord Bot - reveals Scrying Pool, Duchy
+Warlord Bot - plays Scrying Pool
+Warlord Bot - places Margrave on top of deck
+Defender Bot - places Potion on top of deck
+Asbjørn Lunnan - places Province on top of deck
+Warlord Bot - reveals Margrave, Gold
+Warlord Bot - plays Margrave
+Warlord Bot - draws Thief, Fortress, Copper
+Defender Bot - draws Potion
+Defender Bot - discards Potion
+Asbjørn Lunnan - draws Province
+Asbjørn Lunnan - discards Province
+Asbjørn Lunnan - discards Province
+Asbjørn Lunnan - discards Fortress
+Warlord Bot - plays Fortress
+Warlord Bot - draws Copper
+Warlord Bot - plays Margrave
+Warlord Bot - draws Copper, Potion, Scrying Pool
+Defender Bot - draws Gold
+Defender Bot - discards Gold
+Asbjørn Lunnan - draws Margrave
+Asbjørn Lunnan - discards Fortress
+Warlord Bot - plays Scrying Pool
+Warlord Bot - discards Duke
+Defender Bot - discards Silver
+Asbjørn Lunnan - discards Silver
+Warlord Bot - reveals Potion
+Warlord Bot - plays Thief
+Defender Bot - reveals: Scrying Pool, Duchy
+Defender Bot - discards: Scrying Pool, Duchy
+Asbjørn Lunnan - reveals: Forge, Province
+Asbjørn Lunnan - discards: Forge, Province
+Warlord Bot - plays Potion
+Warlord Bot - plays Potion
+Warlord Bot - plays 3 Copper, 1 Silver, 1 Gold
+Warlord Bot - buys Duchy
+Warlord Bot - gains Duchy
+Warlord Bot - buys Tunnel
+Warlord Bot - gains Tunnel
+Warlord Bot - draws Estate, Scrying Pool, Duchy, Copper, Duchy
+ 
+---------- Defender Bot: turn 24 ----------
+Defender Bot - plays Scrying Pool
+Defender Bot - discards Copper
+Asbjørn Lunnan - discards Silver
+Warlord Bot - shuffles deck
+Warlord Bot - discards Silver
+Defender Bot - reveals Copper
+Defender Bot - plays Scrying Pool
+Defender Bot - discards Potion
+Asbjørn Lunnan - discards Silver
+Warlord Bot - places Duchy on top of deck
+Defender Bot - reveals Gold
+Defender Bot - plays Scrying Pool
+Defender Bot - places Gold on top of deck
+Asbjørn Lunnan - discards Fortress
+Warlord Bot - places Duchy on top of deck
+Defender Bot - reveals Gold
+Defender Bot - plays 2 Gold, 1 Copper
+Defender Bot - buys Duchy
+Defender Bot - gains Duchy
+Defender Bot - draws Tunnel, Estate, Copper, Gold, Estate
+ 
+---------- Asbjørn Lunnan: turn 24 ----------
+Asbjørn Lunnan - plays Fortress
+Asbjørn Lunnan - draws Margrave
+Asbjørn Lunnan - plays Margrave
+Asbjørn Lunnan - draws Province
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - draws Province, Fortress
+Warlord Bot - draws Duchy
+Warlord Bot - discards Duchy
+Warlord Bot - discards Duchy
+Warlord Bot - discards Duchy
+Defender Bot - draws Silver
+Defender Bot - discards Tunnel
+Defender Bot - discards Estate
+Defender Bot - discards Estate
+Defender Bot - reveals reaction Tunnel
+Defender Bot - gains Gold
+Asbjørn Lunnan - plays Fortress
+Asbjørn Lunnan - draws Fortress
+Asbjørn Lunnan - plays Margrave
+Asbjørn Lunnan - draws Fortress, Silver, Forge
+Warlord Bot - draws Copper
+Warlord Bot - discards Estate
+Defender Bot - draws Estate
+Defender Bot - discards Estate
+Asbjørn Lunnan - plays Fortress
+Asbjørn Lunnan - draws Silver
+Asbjørn Lunnan - plays Forge
+Asbjørn Lunnan - trashes Fortress, Fortress
+Asbjørn Lunnan - applies the 'when you trash ability' of Fortress
+Asbjørn Lunnan - applies the 'when you trash ability' of Fortress
+Asbjørn Lunnan - gains Province
+Asbjørn Lunnan - plays Fortress
+Asbjørn Lunnan - draws Fortress
+Asbjørn Lunnan - plays Fortress
+Asbjørn Lunnan - draws Silver
+Asbjørn Lunnan - plays Fortress
+Asbjørn Lunnan - draws Province
+Asbjørn Lunnan - plays 3 Silver
+Asbjørn Lunnan - buys Gold
+Asbjørn Lunnan - gains Gold
+Asbjørn Lunnan - draws Province
+Asbjørn Lunnan - shuffles deck
+Asbjørn Lunnan - draws Silver, Fortress, Province, Province
+ 
+---------- Warlord Bot: turn 24 ----------
+Warlord Bot - plays Scrying Pool
+Warlord Bot - discards Tunnel
+Warlord Bot - reveals reaction Tunnel
+Warlord Bot - gains Gold
+Defender Bot - places Estate on top of deck
+Asbjørn Lunnan - discards Gold
+Warlord Bot - reveals Tunnel
+Warlord Bot - plays 2 Copper
+Warlord Bot - buys Estate
+Warlord Bot - gains Estate
+Warlord Bot - draws Copper, Gold, Copper, Gold, Duchy
+ 
+---------- Defender Bot: turn 25 ----------
+Defender Bot - plays 1 Copper, 1 Gold, 1 Silver
+Defender Bot - buys Duke
+Defender Bot - gains Duke
+Defender Bot - draws Estate, Tunnel, Copper, Copper, Tunnel
+ 
+---------- Asbjørn Lunnan: turn 25 ----------
+ 
+------------ Game Over ------------
+Warlord Bot - cards: 6 Scrying Pool, 3 Fortress, 3 Margrave, 1 Thief, 9 Copper, 4 Gold, 2 Potion, 1 Silver, 6 Duchy, 4 Tunnel, 4 Estate, 2 Duke
+Warlord Bot - total victory points: 42
+Warlord Bot - turns: 24
+ 
+Defender Bot - cards: 4 Scrying Pool, 1 Mint, 7 Copper, 6 Gold, 2 Potion, 2 Silver, 5 Estate, 4 Duchy, 3 Tunnel, 1 Duke
+Defender Bot - total victory points: 27
+Defender Bot - turns: 25
+ 
+Asbjørn Lunnan - quit
+Asbjørn Lunnan - cards: 6 Fortress, 2 Margrave, 1 Forge, 3 Silver, 1 Gold, 5 Province
+Asbjørn Lunnan - total victory points: 30
+Asbjørn Lunnan - turns: 24
+ 
+1st place: Warlord Bot
+2nd place: Defender Bot
+3rd place: Asbjørn Lunnan
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.50f5dcbde4b03946044c889a.1364837024406.txt b/testing/testdata/log.50f5dcbde4b03946044c889a.1364837024406.txt
new file mode 100644
index 0000000..d07f668
--- /dev/null
+++ b/testing/testdata/log.50f5dcbde4b03946044c889a.1364837024406.txt
@@ -0,0 +1,717 @@
+------------ Game Setup ------------
+Supply cards: Poor House, Beggar, Forager, Market Square, Marauder, Bandit Camp, Counterfeit, Pillage, Rebuild, Rogue, Copper, Silver, Gold, Estate, Duchy, Province, Curse, Ruins
+attrill - starting cards: Copper, Copper, Copper, Copper, Copper, Copper, Silver, Hovel, Overgrown Estate, Necropolis
+Bonifacius - starting cards: Copper, Copper, Copper, Copper, Copper, Copper, Copper, Duchy, Duchy, Overgrown Estate
+Soldier - starting cards: Copper, Copper, Copper, Copper, Copper, Copper, Copper, Estate, Estate, Estate
+attrill - shuffles deck
+Bonifacius - shuffles deck
+Soldier - shuffles deck
+attrill - draws Necropolis, Hovel, Copper, Copper, Copper
+Bonifacius - draws Copper, Copper, Copper, Copper, Copper
+Soldier - draws Estate, Estate, Copper, Copper, Copper
+ 
+---------- attrill: turn 1 ----------
+attrill - plays 3 Copper
+attrill - buys Forager
+attrill - gains Forager
+attrill - draws Copper, Overgrown Estate, Silver, Copper, Copper
+ 
+---------- Bonifacius: turn 1 ----------
+Bonifacius - plays 5 Copper
+Bonifacius - buys Counterfeit
+Bonifacius - gains Counterfeit
+Bonifacius - draws Copper, Overgrown Estate, Copper, Duchy, Duchy
+ 
+---------- Soldier: turn 1 ----------
+Soldier - plays 3 Copper
+Soldier - buys Silver
+Soldier - gains Silver
+Soldier - draws Copper, Copper, Estate, Copper, Copper
+ 
+---------- attrill: turn 2 ----------
+attrill - plays 3 Copper, 1 Silver
+attrill - buys Rogue
+attrill - gains Rogue
+attrill - shuffles deck
+attrill - draws Hovel, Rogue, Copper, Silver, Forager
+ 
+---------- Bonifacius: turn 2 ----------
+Bonifacius - plays 2 Copper
+Bonifacius - buys Beggar
+Bonifacius - gains Beggar
+Bonifacius - shuffles deck
+Bonifacius - draws Counterfeit, Beggar, Copper, Copper, Duchy
+ 
+---------- Soldier: turn 2 ----------
+Soldier - plays 4 Copper
+Soldier - buys Marauder
+Soldier - gains Marauder
+Soldier - shuffles deck
+Soldier - draws Copper, Copper, Copper, Estate, Copper
+ 
+---------- attrill: turn 3 ----------
+attrill - plays Forager
+attrill - trashes Hovel
+attrill - plays Rogue
+Bonifacius - reveals reaction Beggar
+Bonifacius - discards Beggar
+Bonifacius - gains Silver
+Bonifacius - gains Silver
+Bonifacius - reveals: Silver, Copper
+Bonifacius - trashes Silver
+Bonifacius - discards Copper
+Soldier - reveals: Silver, Copper
+Soldier - trashes Silver
+Soldier - discards Copper
+attrill - plays 1 Copper, 1 Silver
+attrill - buys Counterfeit
+attrill - gains Counterfeit
+attrill - draws Copper, Overgrown Estate, Copper, Copper, Necropolis
+ 
+---------- Bonifacius: turn 3 ----------
+Bonifacius - plays Counterfeit
+Bonifacius - plays Copper
+Bonifacius - plays Copper
+Bonifacius - trashes Copper
+Bonifacius - plays 1 Copper
+Bonifacius - buys Silver
+Bonifacius - gains Silver
+Bonifacius - buys Poor House
+Bonifacius - gains Poor House
+Bonifacius - draws Copper, Copper, Copper, Overgrown Estate, Duchy
+ 
+---------- Soldier: turn 3 ----------
+Soldier - plays 4 Copper
+Soldier - buys Marauder
+Soldier - gains Marauder
+Soldier - draws Marauder, Copper, Copper, Estate, Estate
+ 
+---------- attrill: turn 4 ----------
+attrill - plays 3 Copper
+attrill - buys Silver
+attrill - gains Silver
+attrill - draws Copper, Copper
+attrill - shuffles deck
+attrill - draws Silver, Copper, Forager
+ 
+---------- Bonifacius: turn 4 ----------
+Bonifacius - plays 3 Copper
+Bonifacius - buys Silver
+Bonifacius - gains Silver
+Bonifacius - draws Copper
+Bonifacius - shuffles deck
+Bonifacius - draws Silver, Copper, Duchy, Copper
+ 
+---------- Soldier: turn 4 ----------
+Soldier - plays Marauder
+Soldier - gains Spoils
+attrill - gains Survivors
+Bonifacius - gains Ruined Library
+Soldier - plays 2 Copper
+Soldier - buys Beggar
+Soldier - gains Beggar
+Soldier - shuffles deck
+Soldier - draws Estate, Copper, Estate, Spoils, Marauder
+ 
+---------- attrill: turn 5 ----------
+attrill - plays Forager
+attrill - trashes Copper
+attrill - plays 2 Copper, 1 Silver
+attrill - buys Gold
+attrill - gains Gold
+attrill - draws Copper, Necropolis, Copper, Rogue, Counterfeit
+ 
+---------- Bonifacius: turn 5 ----------
+Bonifacius - plays 3 Copper, 1 Silver
+Bonifacius - buys Bandit Camp
+Bonifacius - gains Bandit Camp
+Bonifacius - draws Silver, Copper, Poor House, Beggar, Counterfeit
+ 
+---------- Soldier: turn 5 ----------
+Soldier - plays Marauder
+Bonifacius - reveals reaction Beggar
+Bonifacius - discards Beggar
+Bonifacius - gains Silver
+Bonifacius - gains Silver
+Soldier - gains Spoils
+attrill - gains Ruined Library
+Bonifacius - gains Ruined Village
+Soldier - plays 1 Copper
+Soldier - plays Spoils
+Soldier - buys Forager
+Soldier - gains Forager
+Soldier - draws Copper, Marauder, Copper, Copper, Estate
+ 
+---------- attrill: turn 6 ----------
+attrill - plays Rogue
+attrill - gains Silver
+attrill - plays 2 Copper
+attrill - plays Counterfeit
+attrill - buys Counterfeit
+attrill - gains Counterfeit
+attrill - draws Silver, Copper, Overgrown Estate
+attrill - shuffles deck
+attrill - draws Forager, Survivors
+ 
+---------- Bonifacius: turn 6 ----------
+Bonifacius - plays Poor House
+Bonifacius - reveals hand: Silver, Copper, Counterfeit
+Bonifacius - plays Counterfeit
+Bonifacius - plays Copper
+Bonifacius - plays Copper
+Bonifacius - trashes Copper
+Bonifacius - plays 1 Silver
+Bonifacius - buys Gold
+Bonifacius - gains Gold
+Bonifacius - draws Silver, Copper, Silver, Copper, Overgrown Estate
+ 
+---------- Soldier: turn 6 ----------
+Soldier - plays Marauder
+Soldier - gains Spoils
+attrill - gains Abandoned Mine
+Bonifacius - gains Survivors
+Soldier - plays 3 Copper
+Soldier - buys Market Square
+Soldier - gains Market Square
+Soldier - draws Beggar, Copper, Copper, Copper
+Soldier - shuffles deck
+Soldier - draws Estate
+ 
+---------- attrill: turn 7 ----------
+attrill - plays Forager
+attrill - trashes Overgrown Estate
+attrill - draws Ruined Library
+attrill - plays Ruined Library
+attrill - draws Copper
+attrill - plays 2 Copper, 1 Silver
+attrill - buys Gold
+attrill - gains Gold
+attrill - draws Silver, Counterfeit, Copper, Necropolis, Gold
+ 
+---------- Bonifacius: turn 7 ----------
+Bonifacius - plays 2 Silver, 2 Copper
+Bonifacius - buys Gold
+Bonifacius - gains Gold
+Bonifacius - draws Duchy
+Bonifacius - shuffles deck
+Bonifacius - draws Silver, Bandit Camp, Copper, Copper
+ 
+---------- Soldier: turn 7 ----------
+Soldier - plays 3 Copper
+Soldier - buys Market Square
+Soldier - gains Market Square
+Soldier - draws Marauder, Estate, Copper, Estate, Copper
+ 
+---------- attrill: turn 8 ----------
+attrill - plays Necropolis
+attrill - plays Counterfeit
+attrill - plays Gold
+attrill - plays Gold
+attrill - trashes Gold
+attrill - plays 1 Silver, 1 Copper
+attrill - buys Gold
+attrill - gains Gold
+attrill - buys Forager
+attrill - gains Forager
+attrill - draws Rogue, Copper, Silver, Copper, Counterfeit
+ 
+---------- Bonifacius: turn 8 ----------
+Bonifacius - plays Bandit Camp
+Bonifacius - draws Silver
+Bonifacius - gains Spoils
+Bonifacius - plays 2 Silver, 2 Copper
+Bonifacius - buys Gold
+Bonifacius - gains Gold
+Bonifacius - draws Copper, Copper, Ruined Library, Gold, Poor House
+ 
+---------- Soldier: turn 8 ----------
+Soldier - plays Marauder
+Soldier - gains Spoils
+attrill - gains Ruined Village
+Bonifacius - gains Abandoned Mine
+Soldier - plays 2 Copper
+Soldier - draws Spoils, Copper, Marauder, Market Square, Forager
+ 
+---------- attrill: turn 9 ----------
+attrill - plays Rogue
+attrill - gains Gold
+attrill - plays Counterfeit
+attrill - plays Copper
+attrill - plays Copper
+attrill - trashes Copper
+attrill - plays 1 Copper, 1 Silver
+attrill - buys Province
+attrill - gains Province
+attrill - shuffles deck
+attrill - draws Silver, Gold, Necropolis, Ruined Library, Forager
+ 
+---------- Bonifacius: turn 9 ----------
+Bonifacius - plays Ruined Library
+Bonifacius - draws Silver
+Bonifacius - plays 2 Copper, 1 Gold, 1 Silver
+Bonifacius - buys Gold
+Bonifacius - gains Gold
+Bonifacius - draws Overgrown Estate, Survivors, Silver, Gold, Silver
+ 
+---------- Soldier: turn 9 ----------
+Soldier - plays Forager
+Soldier - trashes Copper
+Soldier - reveals reaction Market Square
+Soldier - discards Market Square
+Soldier - gains Gold
+Soldier - plays Marauder
+Soldier - gains Spoils
+attrill - gains Ruined Library
+Bonifacius - gains Ruined Market
+Soldier - plays Spoils
+Soldier - buys Bandit Camp
+Soldier - gains Bandit Camp
+Soldier - draws Spoils, Copper
+Soldier - shuffles deck
+Soldier - draws Spoils, Forager, Estate
+ 
+---------- attrill: turn 10 ----------
+attrill - plays Forager
+attrill - trashes Necropolis
+attrill - plays Ruined Library
+attrill - draws Abandoned Mine
+attrill - plays 1 Silver, 1 Gold
+attrill - buys Gold
+attrill - gains Gold
+attrill - draws Forager, Copper, Survivors, Gold, Ruined Village
+ 
+---------- Bonifacius: turn 10 ----------
+Bonifacius - plays Survivors
+Bonifacius - looks at Ruined Village, Counterfeit
+Bonifacius - discards: Ruined Village, Counterfeit
+Bonifacius - plays 2 Silver, 1 Gold
+Bonifacius - buys Gold
+Bonifacius - gains Gold
+Bonifacius - draws Beggar, Copper, Duchy
+Bonifacius - shuffles deck
+Bonifacius - draws Silver, Silver
+ 
+---------- Soldier: turn 10 ----------
+Soldier - plays Forager
+Soldier - trashes Copper
+Soldier - plays Spoils
+Soldier - plays Spoils
+Soldier - buys Bandit Camp
+Soldier - gains Bandit Camp
+Soldier - buys Market Square
+Soldier - gains Market Square
+Soldier - draws Copper, Copper, Estate, Marauder, Estate
+ 
+---------- attrill: turn 11 ----------
+attrill - plays Forager
+attrill - trashes Ruined Village
+attrill - plays Survivors
+attrill - looks at Copper, Copper
+attrill - discards: Copper, Copper
+attrill - plays 1 Copper, 1 Gold
+attrill - buys Gold
+attrill - gains Gold
+attrill - draws Rogue, Gold, Counterfeit, Silver, Silver
+ 
+---------- Bonifacius: turn 11 ----------
+Bonifacius - plays 2 Silver, 1 Copper
+Bonifacius - buys Pillage
+Bonifacius - gains Pillage
+Bonifacius - draws Spoils, Survivors, Gold, Abandoned Mine, Copper
+ 
+---------- Soldier: turn 11 ----------
+Soldier - plays Marauder
+Soldier - gains Spoils
+attrill - gains Ruined Market
+Bonifacius - gains Ruined Library
+Soldier - plays 2 Copper
+Soldier - draws Market Square, Copper, Marauder, Spoils, Copper
+ 
+---------- attrill: turn 12 ----------
+attrill - plays Rogue
+attrill - gains Silver
+attrill - plays Counterfeit
+attrill - plays Silver
+attrill - plays Silver
+attrill - trashes Silver
+attrill - plays 1 Gold, 1 Silver
+attrill - buys Province
+attrill - gains Province
+attrill - buys Market Square
+attrill - gains Market Square
+attrill - draws Province, Counterfeit, Copper
+attrill - shuffles deck
+attrill - draws Gold, Ruined Library
+ 
+---------- Bonifacius: turn 12 ----------
+Bonifacius - plays Abandoned Mine
+Bonifacius - plays 1 Gold, 1 Copper
+Bonifacius - plays Spoils
+Bonifacius - buys Province
+Bonifacius - gains Province
+Bonifacius - draws Counterfeit, Bandit Camp, Overgrown Estate, Copper, Gold
+ 
+---------- Soldier: turn 12 ----------
+Soldier - plays Market Square
+Soldier - draws Copper
+Soldier - plays Marauder
+Soldier - gains Spoils
+attrill - gains Ruined Market
+Bonifacius - gains Abandoned Mine
+Soldier - plays 3 Copper
+Soldier - plays Spoils
+Soldier - buys Gold
+Soldier - gains Gold
+Soldier - draws Beggar, Bandit Camp, Market Square, Gold
+Soldier - shuffles deck
+Soldier - draws Marauder
+ 
+---------- attrill: turn 13 ----------
+attrill - plays Ruined Library
+attrill - draws Copper
+attrill - plays Counterfeit
+attrill - plays Copper
+attrill - plays Copper
+attrill - trashes Copper
+attrill - plays 1 Copper, 1 Gold
+attrill - buys Rebuild
+attrill - gains Rebuild
+attrill - buys Beggar
+attrill - gains Beggar
+attrill - draws Silver, Gold, Gold, Silver, Ruined Market
+ 
+---------- Bonifacius: turn 13 ----------
+Bonifacius - plays Bandit Camp
+Bonifacius - draws Duchy
+Bonifacius - gains Spoils
+Bonifacius - plays Counterfeit
+Bonifacius - plays Copper
+Bonifacius - plays Copper
+Bonifacius - trashes Copper
+Bonifacius - plays 1 Gold
+Bonifacius - buys Gold
+Bonifacius - gains Gold
+Bonifacius - draws Silver, Ruined Market, Ruined Village, Ruined Library, Gold
+ 
+---------- Soldier: turn 13 ----------
+Soldier - plays Bandit Camp
+Soldier - draws Bandit Camp
+Soldier - gains Spoils
+Soldier - plays Bandit Camp
+Soldier - draws Spoils
+Soldier - gains Spoils
+Soldier - plays Market Square
+Soldier - draws Estate
+Soldier - plays Marauder
+Soldier - gains Spoils
+attrill - gains Survivors
+Bonifacius - gains Ruined Market
+Soldier - plays 1 Gold
+Soldier - plays Spoils
+Soldier - buys Gold
+Soldier - gains Gold
+Soldier - draws Copper, Forager, Copper, Copper, Copper
+ 
+---------- attrill: turn 14 ----------
+attrill - plays Ruined Market
+attrill - plays 2 Silver, 2 Gold
+attrill - buys Province
+attrill - gains Province
+attrill - buys Beggar
+attrill - gains Beggar
+attrill - draws Counterfeit, Abandoned Mine, Ruined Library, Province, Gold
+ 
+---------- Bonifacius: turn 14 ----------
+Bonifacius - plays Ruined Library
+Bonifacius - draws Silver
+Bonifacius - plays 2 Silver, 1 Gold
+Bonifacius - buys Duchy
+Bonifacius - gains Duchy
+Bonifacius - draws Silver, Gold, Gold, Copper, Poor House
+ 
+---------- Soldier: turn 14 ----------
+Soldier - plays Forager
+Soldier - trashes Copper
+Soldier - plays 3 Copper
+Soldier - buys Bandit Camp
+Soldier - gains Bandit Camp
+Soldier - draws Estate, Market Square, Marauder, Market Square, Estate
+ 
+---------- attrill: turn 15 ----------
+attrill - plays Abandoned Mine
+attrill - plays Counterfeit
+attrill - plays Gold
+attrill - plays Gold
+attrill - trashes Gold
+attrill - buys Province
+attrill - gains Province
+attrill - draws Forager, Copper, Silver, Rogue, Forager
+ 
+---------- Bonifacius: turn 15 ----------
+Bonifacius - plays 2 Gold, 1 Silver, 1 Copper
+Bonifacius - buys Province
+Bonifacius - gains Province
+Bonifacius - draws Copper
+Bonifacius - shuffles deck
+Bonifacius - draws Gold, Silver, Duchy, Gold
+ 
+---------- Soldier: turn 15 ----------
+Soldier - plays Market Square
+Soldier - draws Gold
+Soldier - plays Market Square
+Soldier - draws Spoils
+Soldier - plays Marauder
+Soldier - gains Spoils
+attrill - gains Ruined Market
+Bonifacius - gains Ruined Market
+Soldier - plays 1 Gold
+Soldier - plays Spoils
+Soldier - buys Rogue
+Soldier - gains Rogue
+Soldier - draws Copper
+Soldier - shuffles deck
+Soldier - draws Gold, Market Square, Estate, Copper
+ 
+---------- attrill: turn 16 ----------
+attrill - plays Rogue
+attrill - gains Gold
+attrill - plays 1 Copper, 1 Silver
+attrill - buys Rebuild
+attrill - gains Rebuild
+attrill - draws Gold, Market Square, Survivors, Copper
+attrill - shuffles deck
+attrill - draws Silver
+ 
+---------- Bonifacius: turn 16 ----------
+Bonifacius - plays 2 Gold, 1 Copper, 1 Silver
+Bonifacius - buys Province
+Bonifacius - gains Province
+Bonifacius - draws Ruined Market, Pillage, Abandoned Mine, Province, Silver
+ 
+---------- Soldier: turn 16 ----------
+Soldier - plays Market Square
+Soldier - draws Gold
+Soldier - plays 2 Copper, 2 Gold
+Soldier - buys Province
+Soldier - gains Province
+Soldier - buys Ruined Library
+Soldier - gains Ruined Library
+Soldier - draws Gold, Forager, Market Square, Copper, Spoils
+ 
+---------- attrill: turn 17 ----------
+attrill - plays Market Square
+attrill - draws Rebuild
+attrill - plays Rebuild
+attrill - names Province
+attrill - reveals Silver, Province, Gold, Ruined Library, Forager, Rogue, Gold, Silver, Ruined Market, Counterfeit, Province, Copper, Copper, Beggar, Province, Counterfeit, Gold, Province, Ruined Market, Forager, Abandoned Mine, Rebuild, Beggar, Gold, Survivors, Ruined Market, Ruined Library
+attrill - discards: Silver, Province, Gold, Ruined Library, Forager, Rogue, Gold, Silver, Ruined Market, Counterfeit, Province, Copper, Copper, Beggar, Province, Counterfeit, Gold, Province, Ruined Market, Forager, Abandoned Mine, Rebuild, Beggar, Gold, Survivors, Ruined Market, Ruined Library
+attrill - plays Survivors
+attrill - shuffles deck
+attrill - looks at Copper, Gold
+attrill - discards Gold
+attrill - discards Copper
+attrill - plays 1 Gold, 1 Copper, 1 Silver
+attrill - buys Duchy
+attrill - gains Duchy
+attrill - draws Forager, Rebuild, Silver, Forager, Abandoned Mine
+ 
+---------- Bonifacius: turn 17 ----------
+Bonifacius - plays Pillage
+Bonifacius - trashes Pillage
+Soldier - reveals Gold, Forager, Market Square, Copper, Spoils
+Soldier - discards Gold
+attrill - reveals Forager, Rebuild, Silver, Forager, Abandoned Mine
+attrill - discards Rebuild
+Bonifacius - gains Spoils
+Bonifacius - gains Spoils
+Bonifacius - plays 1 Silver
+Bonifacius - buys Estate
+Bonifacius - gains Estate
+Bonifacius - draws Overgrown Estate, Beggar, Gold, Copper, Ruined Library
+ 
+---------- Soldier: turn 17 ----------
+Soldier - plays Forager
+Soldier - trashes Copper
+Soldier - reveals reaction Market Square
+Soldier - discards Market Square
+Soldier - gains Gold
+Soldier - plays Spoils
+Soldier - buys Duchy
+Soldier - gains Duchy
+Soldier - draws Marauder, Bandit Camp, Spoils, Marauder, Rogue
+ 
+---------- attrill: turn 18 ----------
+attrill - plays Forager
+attrill - trashes Abandoned Mine
+attrill - plays Forager
+attrill - trashes Silver
+attrill - buys Estate
+attrill - gains Estate
+attrill - buys Estate
+attrill - gains Estate
+attrill - draws Ruined Market, Gold, Rogue, Beggar, Province
+ 
+---------- Bonifacius: turn 18 ----------
+Bonifacius - plays Ruined Library
+Bonifacius - draws Silver
+Bonifacius - plays 1 Gold, 1 Copper, 1 Silver
+Bonifacius - buys Duchy
+Bonifacius - gains Duchy
+Bonifacius - draws Copper, Gold, Spoils, Bandit Camp, Gold
+ 
+---------- Soldier: turn 18 ----------
+Soldier - plays Bandit Camp
+Soldier - draws Spoils
+Soldier - gains Spoils
+Soldier - plays Rogue
+attrill - reveals reaction Beggar
+attrill - discards Beggar
+attrill - gains Silver
+attrill - gains Silver
+Soldier - gains Pillage
+Soldier - plays Marauder
+Soldier - gains Spoils
+attrill - gains Survivors
+Soldier - plays Spoils
+Soldier - plays Spoils
+Soldier - buys Province
+Soldier - gains Province
+Soldier - draws Bandit Camp, Copper, Estate, Spoils, Bandit Camp
+ 
+---------- attrill: turn 19 ----------
+attrill - plays Rogue
+attrill - gains Silver
+attrill - plays 1 Gold
+attrill - buys Duchy
+attrill - gains Duchy
+attrill - draws Silver, Ruined Market, Copper, Province, Counterfeit
+ 
+---------- Bonifacius: turn 19 ----------
+Bonifacius - plays Bandit Camp
+Bonifacius - draws Counterfeit
+Bonifacius - gains Spoils
+Bonifacius - plays Counterfeit
+Bonifacius - plays Spoils
+Bonifacius - plays Spoils
+Bonifacius - plays 2 Gold, 1 Copper
+Bonifacius - buys Province
+Bonifacius - gains Province
+Bonifacius - buys Duchy
+Bonifacius - gains Duchy
+Bonifacius - draws Gold, Survivors, Silver, Ruined Library, Copper
+ 
+---------- Soldier: turn 19 ----------
+Soldier - plays Bandit Camp
+Soldier - draws Estate
+Soldier - gains Spoils
+Soldier - plays Bandit Camp
+Soldier - draws Market Square
+Soldier - gains Spoils
+Soldier - plays Market Square
+Soldier - draws Beggar
+Soldier - plays 1 Copper
+Soldier - plays Spoils
+Soldier - buys Estate
+Soldier - gains Estate
+Soldier - buys Estate
+Soldier - gains Estate
+Soldier - shuffles deck
+Soldier - draws Marauder, Pillage, Gold, Bandit Camp, Ruined Library
+ 
+---------- attrill: turn 20 ----------
+attrill - plays Ruined Market
+attrill - plays Counterfeit
+attrill - plays Copper
+attrill - plays Copper
+attrill - trashes Copper
+attrill - plays 1 Silver
+attrill - buys Duchy
+attrill - gains Duchy
+attrill - draws Ruined Library, Survivors, Beggar, Gold, Province
+ 
+---------- Bonifacius: turn 20 ----------
+Bonifacius - plays Ruined Library
+Bonifacius - draws Ruined Market
+Bonifacius - plays 1 Gold, 1 Silver, 1 Copper
+Bonifacius - buys Duchy
+Bonifacius - gains Duchy
+Bonifacius - draws Duchy, Duchy, Silver, Province, Ruined Village
+ 
+---------- Soldier: turn 20 ----------
+Soldier - plays Bandit Camp
+Soldier - draws Market Square
+Soldier - gains Spoils
+Soldier - plays Market Square
+Soldier - draws Gold
+Soldier - plays Marauder
+attrill - reveals reaction Beggar
+attrill - discards Beggar
+attrill - gains Silver
+attrill - gains Silver
+Soldier - gains Spoils
+Soldier - plays Pillage
+Soldier - trashes Pillage
+Bonifacius - reveals Duchy, Duchy, Silver, Province, Ruined Village
+Bonifacius - discards Silver
+Soldier - gains Spoils
+Soldier - gains Spoils
+Soldier - plays 2 Gold
+Soldier - buys Duchy
+Soldier - gains Duchy
+Soldier - draws Spoils, Market Square, Gold, Spoils, Estate
+ 
+---------- attrill: turn 21 ----------
+attrill - plays Ruined Library
+attrill - draws Silver
+attrill - plays 1 Gold, 1 Silver
+attrill - buys Duchy
+attrill - gains Duchy
+attrill - draws Province, Silver, Gold, Counterfeit, Ruined Market
+ 
+---------- Bonifacius: turn 21 ----------
+Bonifacius - draws Poor House, Abandoned Mine
+Bonifacius - shuffles deck
+Bonifacius - draws Ruined Market, Duchy, Silver
+ 
+---------- Soldier: turn 21 ----------
+Soldier - plays Market Square
+Soldier - draws Forager
+Soldier - plays 1 Gold
+Soldier - plays Spoils
+Soldier - plays Spoils
+Soldier - buys Province
+Soldier - gains Province
+Soldier - draws Estate, Spoils, Estate, Copper, Estate
+ 
+---------- attrill: turn 22 ----------
+attrill - plays Ruined Market
+attrill - plays Counterfeit
+attrill - plays Gold
+attrill - plays Gold
+attrill - trashes Gold
+attrill - plays 1 Silver
+attrill - buys Province
+attrill - gains Province
+attrill - buys Poor House
+attrill - gains Poor House
+attrill - draws Ruined Library
+attrill - shuffles deck
+attrill - draws Duchy, Estate, Province, Forager
+ 
+------------ Game Over ------------
+attrill - cards: 3 Ruined Market, 3 Survivors, 2 Beggar, 2 Ruined Library, 2 Forager, 2 Rebuild, 1 Poor House, 1 Market Square, 1 Rogue, 7 Silver, 4 Gold, 2 Copper, 2 Counterfeit, 5 Province, 4 Duchy, 2 Estate
+attrill - total victory points: 44
+attrill - turns: 22
+ 
+Bonifacius - cards: 3 Ruined Market, 2 Ruined Library, 2 Abandoned Mine, 1 Poor House, 1 Bandit Camp, 1 Ruined Village, 1 Beggar, 1 Survivors, 6 Gold, 5 Silver, 4 Copper, 3 Spoils, 1 Counterfeit, 6 Duchy, 4 Province, 1 Overgrown Estate, 1 Estate
+Bonifacius - total victory points: 43
+Bonifacius - turns: 21
+ 
+Soldier - cards: 3 Bandit Camp, 3 Market Square, 2 Marauder, 1 Forager, 1 Rogue, 1 Beggar, 1 Ruined Library, 6 Spoils, 4 Gold, 3 Copper, 5 Estate, 3 Province, 2 Duchy
+Soldier - total victory points: 29
+Soldier - turns: 21
+ 
+1st place: attrill
+2nd place: Bonifacius
+3rd place: Soldier
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.50ff462be4b02b7235c36c70.1364860449322.txt b/testing/testdata/log.50ff462be4b02b7235c36c70.1364860449322.txt
new file mode 100644
index 0000000..a943a6b
--- /dev/null
+++ b/testing/testdata/log.50ff462be4b02b7235c36c70.1364860449322.txt
@@ -0,0 +1,481 @@
+------------ Game Setup ------------
+Supply cards: Chapel, JackOfAllTrades, Remake, Wandering Minstrel, Festival, Jester, Junk Dealer, Knights, Vault, Wharf, Copper, Silver, Gold, Estate, Duchy, Province, Curse
+Daniel Jonathan Roy - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Conqueror Bot - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Daniel Jonathan Roy - shuffles deck
+Conqueror Bot - shuffles deck
+Daniel Jonathan Roy - draws Estate, Estate, Copper, Copper, Estate
+Conqueror Bot - draws Estate, Copper, Copper, Copper, Estate
+ 
+---------- Conqueror Bot: turn 1 ----------
+Conqueror Bot - plays 3 Copper
+Conqueror Bot - buys Silver
+Conqueror Bot - gains Silver
+Conqueror Bot - draws Copper, Copper, Copper, Copper, Estate
+ 
+---------- Daniel Jonathan Roy: turn 1 ----------
+Daniel Jonathan Roy - plays 2 Copper
+Daniel Jonathan Roy - buys Chapel
+Daniel Jonathan Roy - gains Chapel
+Daniel Jonathan Roy - draws Copper, Copper, Copper, Copper, Copper
+ 
+---------- Conqueror Bot: turn 2 ----------
+Conqueror Bot - plays 4 Copper
+Conqueror Bot - buys Remake
+Conqueror Bot - gains Remake
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Estate, Silver, Copper, Copper, Copper
+ 
+---------- Daniel Jonathan Roy: turn 2 ----------
+Daniel Jonathan Roy - plays 5 Copper
+Daniel Jonathan Roy - buys Jester
+Daniel Jonathan Roy - gains Jester
+Daniel Jonathan Roy - shuffles deck
+Daniel Jonathan Roy - draws Copper, Copper, Copper, Copper, Estate
+ 
+---------- Conqueror Bot: turn 3 ----------
+Conqueror Bot - plays 3 Copper, 1 Silver
+Conqueror Bot - buys Jester
+Conqueror Bot - gains Jester
+Conqueror Bot - draws Copper, Estate, Copper, Copper, Copper
+ 
+---------- Daniel Jonathan Roy: turn 3 ----------
+Daniel Jonathan Roy - plays 4 Copper
+Daniel Jonathan Roy - buys JackOfAllTrades
+Daniel Jonathan Roy - gains JackOfAllTrades
+Daniel Jonathan Roy - draws Chapel, Jester, Copper, Copper, Estate
+ 
+---------- Conqueror Bot: turn 4 ----------
+Conqueror Bot - plays 4 Copper
+Conqueror Bot - buys JackOfAllTrades
+Conqueror Bot - gains JackOfAllTrades
+Conqueror Bot - draws Remake, Estate
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Copper, Estate, Silver
+ 
+---------- Daniel Jonathan Roy: turn 4 ----------
+Daniel Jonathan Roy - plays Jester
+Conqueror Bot - reveals Jester
+Conqueror Bot - discards Jester
+Daniel Jonathan Roy - gains Jester
+Daniel Jonathan Roy - plays 2 Copper
+Daniel Jonathan Roy - buys Wandering Minstrel
+Daniel Jonathan Roy - gains Wandering Minstrel
+Daniel Jonathan Roy - draws Estate, Copper
+Daniel Jonathan Roy - shuffles deck
+Daniel Jonathan Roy - draws Estate, Jester, Copper
+ 
+---------- Conqueror Bot: turn 5 ----------
+Conqueror Bot - plays Remake
+Conqueror Bot - trashes Estate
+Conqueror Bot - gains Silver
+Conqueror Bot - trashes Estate
+Conqueror Bot - gains Silver
+Conqueror Bot - plays 1 Copper, 1 Silver
+Conqueror Bot - buys Silver
+Conqueror Bot - gains Silver
+Conqueror Bot - draws JackOfAllTrades, Copper, Copper, Copper, Estate
+ 
+---------- Daniel Jonathan Roy: turn 5 ----------
+Daniel Jonathan Roy - plays Jester
+Conqueror Bot - reveals Copper
+Conqueror Bot - discards Copper
+Conqueror Bot - gains Copper
+Daniel Jonathan Roy - plays 2 Copper
+Daniel Jonathan Roy - buys Wandering Minstrel
+Daniel Jonathan Roy - gains Wandering Minstrel
+Daniel Jonathan Roy - draws Jester, Copper, JackOfAllTrades, Copper, Estate
+ 
+---------- Conqueror Bot: turn 6 ----------
+Conqueror Bot - plays JackOfAllTrades
+Conqueror Bot - gains Silver
+Conqueror Bot - discards Copper
+Conqueror Bot - trashes Estate
+Conqueror Bot - plays 4 Copper
+Conqueror Bot - buys Wandering Minstrel
+Conqueror Bot - gains Wandering Minstrel
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Jester, Copper, Wandering Minstrel, Silver, Copper
+ 
+---------- Daniel Jonathan Roy: turn 6 ----------
+Daniel Jonathan Roy - plays JackOfAllTrades
+Daniel Jonathan Roy - gains Silver
+Daniel Jonathan Roy - discards Chapel
+Daniel Jonathan Roy - trashes Estate
+Daniel Jonathan Roy - plays 3 Copper
+Daniel Jonathan Roy - buys Silver
+Daniel Jonathan Roy - gains Silver
+Daniel Jonathan Roy - draws Copper, Copper, Wandering Minstrel
+Daniel Jonathan Roy - shuffles deck
+Daniel Jonathan Roy - draws JackOfAllTrades, Jester
+ 
+---------- Conqueror Bot: turn 7 ----------
+Conqueror Bot - plays Wandering Minstrel
+Conqueror Bot - draws Remake
+Conqueror Bot - reveals: Copper, JackOfAllTrades, Silver
+Conqueror Bot - places JackOfAllTrades on top of deck
+Conqueror Bot - discards: Copper, Silver
+Conqueror Bot - plays Jester
+Daniel Jonathan Roy - reveals Estate
+Daniel Jonathan Roy - discards Estate
+Daniel Jonathan Roy - gains Curse
+Conqueror Bot - plays Remake
+Conqueror Bot - trashes Silver
+Conqueror Bot - gains JackOfAllTrades
+Conqueror Bot - trashes Copper
+Conqueror Bot - plays 1 Copper
+Conqueror Bot - buys Silver
+Conqueror Bot - gains Silver
+Conqueror Bot - draws JackOfAllTrades, Copper, Silver, Copper, Silver
+ 
+---------- Daniel Jonathan Roy: turn 7 ----------
+Daniel Jonathan Roy - plays Wandering Minstrel
+Daniel Jonathan Roy - draws Wandering Minstrel
+Daniel Jonathan Roy - reveals: Copper, Copper, Silver
+Daniel Jonathan Roy - discards: Copper, Copper, Silver
+Daniel Jonathan Roy - plays Wandering Minstrel
+Daniel Jonathan Roy - draws Jester
+Daniel Jonathan Roy - reveals: Copper, Chapel, Estate
+Daniel Jonathan Roy - places Chapel on top of deck
+Daniel Jonathan Roy - discards: Copper, Estate
+Daniel Jonathan Roy - plays Jester
+Conqueror Bot - reveals Silver
+Conqueror Bot - discards Silver
+Daniel Jonathan Roy - gains Silver
+Daniel Jonathan Roy - plays Jester
+Conqueror Bot - reveals Copper
+Conqueror Bot - discards Copper
+Conqueror Bot - gains Copper
+Daniel Jonathan Roy - plays JackOfAllTrades
+Daniel Jonathan Roy - gains Silver
+Daniel Jonathan Roy - discards Chapel
+Daniel Jonathan Roy - plays 4 Copper, 1 Silver
+Daniel Jonathan Roy - buys Dame Molly
+Daniel Jonathan Roy - gains Dame Molly
+Daniel Jonathan Roy - shuffles deck
+Daniel Jonathan Roy - draws Silver, Estate, Copper, Copper, JackOfAllTrades
+ 
+---------- Conqueror Bot: turn 8 ----------
+Conqueror Bot - plays JackOfAllTrades
+Conqueror Bot - gains Silver
+Conqueror Bot - discards Copper
+Conqueror Bot - plays 3 Copper, 2 Silver
+Conqueror Bot - buys Gold
+Conqueror Bot - gains Gold
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Copper, Copper, JackOfAllTrades, Jester, Copper
+ 
+---------- Daniel Jonathan Roy: turn 8 ----------
+Daniel Jonathan Roy - plays JackOfAllTrades
+Daniel Jonathan Roy - gains Silver
+Daniel Jonathan Roy - places Jester on top of deck
+Daniel Jonathan Roy - trashes Estate
+Daniel Jonathan Roy - plays 2 Copper, 1 Silver
+Daniel Jonathan Roy - buys Wandering Minstrel
+Daniel Jonathan Roy - gains Wandering Minstrel
+Daniel Jonathan Roy - draws Copper, Silver, Copper, Silver, Estate
+ 
+---------- Conqueror Bot: turn 9 ----------
+Conqueror Bot - plays Jester
+Daniel Jonathan Roy - reveals Copper
+Daniel Jonathan Roy - discards Copper
+Daniel Jonathan Roy - gains Copper
+Conqueror Bot - plays 3 Copper
+Conqueror Bot - buys Festival
+Conqueror Bot - gains Festival
+Conqueror Bot - draws Copper, Copper, Silver, Silver, Silver
+ 
+---------- Daniel Jonathan Roy: turn 9 ----------
+Daniel Jonathan Roy - plays 2 Copper, 2 Silver
+Daniel Jonathan Roy - buys Gold
+Daniel Jonathan Roy - gains Gold
+Daniel Jonathan Roy - draws Wandering Minstrel, Copper, Wandering Minstrel, Dame Molly, Copper
+ 
+---------- Conqueror Bot: turn 10 ----------
+Conqueror Bot - plays 3 Silver, 2 Copper
+Conqueror Bot - buys Province
+Conqueror Bot - gains Province
+Conqueror Bot - draws Wandering Minstrel, Copper, Gold, Copper, Silver
+ 
+---------- Daniel Jonathan Roy: turn 10 ----------
+Daniel Jonathan Roy - plays Wandering Minstrel
+Daniel Jonathan Roy - draws Silver
+Daniel Jonathan Roy - reveals: Chapel, Curse, Jester
+Daniel Jonathan Roy - places Jester on top of deck
+Daniel Jonathan Roy - places Chapel on top of deck
+Daniel Jonathan Roy - discards Curse
+Daniel Jonathan Roy - plays Wandering Minstrel
+Daniel Jonathan Roy - draws Chapel
+Daniel Jonathan Roy - reveals: Jester
+Daniel Jonathan Roy - shuffles deck
+Daniel Jonathan Roy - reveals: Copper, Silver
+Daniel Jonathan Roy - places Jester on top of deck
+Daniel Jonathan Roy - discards: Copper, Silver
+Daniel Jonathan Roy - plays Dame Molly
+Conqueror Bot - reveals: Silver, Remake
+Conqueror Bot - trashes Silver
+Conqueror Bot - discards Remake
+Daniel Jonathan Roy - plays 2 Copper, 1 Silver
+Daniel Jonathan Roy - buys Remake
+Daniel Jonathan Roy - gains Remake
+Daniel Jonathan Roy - draws Jester, Silver, Wandering Minstrel, Jester, JackOfAllTrades
+ 
+---------- Conqueror Bot: turn 11 ----------
+Conqueror Bot - plays Wandering Minstrel
+Conqueror Bot - draws Copper
+Conqueror Bot - reveals: Silver, JackOfAllTrades
+Conqueror Bot - shuffles deck
+Conqueror Bot - reveals: JackOfAllTrades
+Conqueror Bot - places JackOfAllTrades on top of deck
+Conqueror Bot - places JackOfAllTrades on top of deck
+Conqueror Bot - discards Silver
+Conqueror Bot - plays 3 Copper, 1 Gold, 1 Silver
+Conqueror Bot - buys Province
+Conqueror Bot - gains Province
+Conqueror Bot - draws JackOfAllTrades, JackOfAllTrades, Copper, Jester, Remake
+ 
+---------- Daniel Jonathan Roy: turn 11 ----------
+Daniel Jonathan Roy - plays Wandering Minstrel
+Daniel Jonathan Roy - draws Curse
+Daniel Jonathan Roy - reveals: Copper, Copper, Copper
+Daniel Jonathan Roy - discards: Copper, Copper, Copper
+Daniel Jonathan Roy - plays Jester
+Conqueror Bot - reveals Province
+Conqueror Bot - discards Province
+Conqueror Bot - gains Curse
+Daniel Jonathan Roy - plays Jester
+Conqueror Bot - reveals Copper
+Conqueror Bot - discards Copper
+Conqueror Bot - gains Copper
+Daniel Jonathan Roy - plays 1 Silver
+Daniel Jonathan Roy - buys Gold
+Daniel Jonathan Roy - gains Gold
+Daniel Jonathan Roy - draws Gold, Silver, Silver, Copper, Copper
+ 
+---------- Conqueror Bot: turn 12 ----------
+Conqueror Bot - plays Jester
+Daniel Jonathan Roy - reveals Estate
+Daniel Jonathan Roy - discards Estate
+Daniel Jonathan Roy - gains Curse
+Conqueror Bot - plays 1 Copper
+Conqueror Bot - buys Silver
+Conqueror Bot - gains Silver
+Conqueror Bot - draws Festival, Copper, Copper, Copper, Silver
+ 
+---------- Daniel Jonathan Roy: turn 12 ----------
+Daniel Jonathan Roy - plays 2 Silver, 2 Copper, 1 Gold
+Daniel Jonathan Roy - buys Province
+Daniel Jonathan Roy - gains Province
+Daniel Jonathan Roy - shuffles deck
+Daniel Jonathan Roy - draws Silver, Copper, Copper, Jester, Copper
+ 
+---------- Conqueror Bot: turn 13 ----------
+Conqueror Bot - plays Festival
+Conqueror Bot - plays 3 Copper, 1 Silver
+Conqueror Bot - buys Duchy
+Conqueror Bot - gains Duchy
+Conqueror Bot - buys Estate
+Conqueror Bot - gains Estate
+Conqueror Bot - draws Silver, Silver
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Copper, Festival, JackOfAllTrades
+ 
+---------- Daniel Jonathan Roy: turn 13 ----------
+Daniel Jonathan Roy - plays Jester
+Conqueror Bot - reveals Copper
+Conqueror Bot - discards Copper
+Conqueror Bot - gains Copper
+Daniel Jonathan Roy - plays 3 Copper, 1 Silver
+Daniel Jonathan Roy - buys Gold
+Daniel Jonathan Roy - gains Gold
+Daniel Jonathan Roy - draws Dame Molly, Jester, Remake, Copper, Wandering Minstrel
+ 
+---------- Conqueror Bot: turn 14 ----------
+Conqueror Bot - plays Festival
+Conqueror Bot - plays JackOfAllTrades
+Conqueror Bot - gains Silver
+Conqueror Bot - discards Copper
+Conqueror Bot - plays 3 Silver, 2 Copper
+Conqueror Bot - buys Province
+Conqueror Bot - gains Province
+Conqueror Bot - buys Estate
+Conqueror Bot - gains Estate
+Conqueror Bot - draws JackOfAllTrades, Silver, Copper, Silver, Copper
+ 
+---------- Daniel Jonathan Roy: turn 14 ----------
+Daniel Jonathan Roy - plays Wandering Minstrel
+Daniel Jonathan Roy - draws Wandering Minstrel
+Daniel Jonathan Roy - reveals: Copper, Silver, Curse
+Daniel Jonathan Roy - discards: Copper, Silver, Curse
+Daniel Jonathan Roy - plays Wandering Minstrel
+Daniel Jonathan Roy - draws Chapel
+Daniel Jonathan Roy - reveals: Gold, Silver, Estate
+Daniel Jonathan Roy - discards: Gold, Silver, Estate
+Daniel Jonathan Roy - plays Dame Molly
+Conqueror Bot - reveals: Curse, Copper
+Daniel Jonathan Roy - plays Jester
+Conqueror Bot - reveals Duchy
+Conqueror Bot - discards Duchy
+Conqueror Bot - gains Curse
+Daniel Jonathan Roy - plays Remake
+Daniel Jonathan Roy - trashes Chapel
+Daniel Jonathan Roy - gains Silver
+Daniel Jonathan Roy - trashes Copper
+Daniel Jonathan Roy - buys Chapel
+Daniel Jonathan Roy - gains Chapel
+Daniel Jonathan Roy - draws Copper, Copper, Copper, Silver, Silver
+ 
+---------- Conqueror Bot: turn 15 ----------
+Conqueror Bot - plays JackOfAllTrades
+Conqueror Bot - gains Silver
+Conqueror Bot - discards Copper
+Conqueror Bot - plays 2 Silver, 2 Copper
+Conqueror Bot - buys Duchy
+Conqueror Bot - gains Duchy
+Conqueror Bot - draws Silver, Gold, Jester, Province, Estate
+ 
+---------- Daniel Jonathan Roy: turn 15 ----------
+Daniel Jonathan Roy - plays 3 Copper, 2 Silver
+Daniel Jonathan Roy - buys Gold
+Daniel Jonathan Roy - gains Gold
+Daniel Jonathan Roy - draws Curse, JackOfAllTrades, Wandering Minstrel, Gold, Province
+ 
+---------- Conqueror Bot: turn 16 ----------
+Conqueror Bot - plays Jester
+Daniel Jonathan Roy - shuffles deck
+Daniel Jonathan Roy - reveals Dame Molly
+Daniel Jonathan Roy - discards Dame Molly
+Conqueror Bot - plays 1 Silver, 1 Gold
+Conqueror Bot - buys Duchy
+Conqueror Bot - gains Duchy
+Conqueror Bot - draws Remake, Wandering Minstrel, Copper
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Copper, Silver
+ 
+---------- Daniel Jonathan Roy: turn 16 ----------
+Daniel Jonathan Roy - plays Wandering Minstrel
+Daniel Jonathan Roy - draws Gold
+Daniel Jonathan Roy - reveals: Copper, Jester, Wandering Minstrel
+Daniel Jonathan Roy - places Wandering Minstrel on top of deck
+Daniel Jonathan Roy - places Jester on top of deck
+Daniel Jonathan Roy - discards Copper
+Daniel Jonathan Roy - plays JackOfAllTrades
+Daniel Jonathan Roy - gains Silver
+Daniel Jonathan Roy - places Jester on top of deck
+Daniel Jonathan Roy - trashes Curse
+Daniel Jonathan Roy - plays Jester
+Conqueror Bot - reveals Copper
+Conqueror Bot - discards Copper
+Conqueror Bot - gains Copper
+Daniel Jonathan Roy - plays 2 Gold
+Daniel Jonathan Roy - buys Province
+Daniel Jonathan Roy - gains Province
+Daniel Jonathan Roy - draws Wandering Minstrel, Wandering Minstrel, Silver, Silver, Silver
+ 
+---------- Conqueror Bot: turn 17 ----------
+Conqueror Bot - plays Wandering Minstrel
+Conqueror Bot - draws Copper
+Conqueror Bot - reveals: Curse, Duchy, JackOfAllTrades
+Conqueror Bot - places JackOfAllTrades on top of deck
+Conqueror Bot - discards: Curse, Duchy
+Conqueror Bot - plays Remake
+Conqueror Bot - trashes Silver
+Conqueror Bot - gains Remake
+Conqueror Bot - trashes Copper
+Conqueror Bot - plays 2 Copper
+Conqueror Bot - buys Estate
+Conqueror Bot - gains Estate
+Conqueror Bot - draws JackOfAllTrades, Silver, JackOfAllTrades, Estate, Province
+ 
+---------- Daniel Jonathan Roy: turn 17 ----------
+Daniel Jonathan Roy - plays Wandering Minstrel
+Daniel Jonathan Roy - draws Silver
+Daniel Jonathan Roy - reveals: Copper, Copper, Copper
+Daniel Jonathan Roy - discards: Copper, Copper, Copper
+Daniel Jonathan Roy - plays Wandering Minstrel
+Daniel Jonathan Roy - draws Copper
+Daniel Jonathan Roy - reveals: Gold, Copper, Jester
+Daniel Jonathan Roy - places Jester on top of deck
+Daniel Jonathan Roy - discards: Gold, Copper
+Daniel Jonathan Roy - plays 4 Silver, 1 Copper
+Daniel Jonathan Roy - buys Province
+Daniel Jonathan Roy - gains Province
+Daniel Jonathan Roy - draws Jester, Copper, Estate, Remake, Chapel
+ 
+---------- Conqueror Bot: turn 18 ----------
+Conqueror Bot - plays JackOfAllTrades
+Conqueror Bot - gains Silver
+Conqueror Bot - discards Copper
+Conqueror Bot - plays 2 Silver
+Conqueror Bot - buys Estate
+Conqueror Bot - gains Estate
+Conqueror Bot - draws Silver, Silver, Copper, Gold, Duchy
+ 
+---------- Daniel Jonathan Roy: turn 18 ----------
+Daniel Jonathan Roy - plays Jester
+Conqueror Bot - reveals Copper
+Conqueror Bot - discards Copper
+Conqueror Bot - gains Copper
+Daniel Jonathan Roy - plays Copper
+Daniel Jonathan Roy - buys Estate
+Daniel Jonathan Roy - gains Estate
+Daniel Jonathan Roy - draws Curse, Silver, Gold, Silver
+Daniel Jonathan Roy - shuffles deck
+Daniel Jonathan Roy - draws Dame Molly
+ 
+---------- Conqueror Bot: turn 19 ----------
+Conqueror Bot - plays 2 Silver, 1 Copper, 1 Gold
+Conqueror Bot - buys Province
+Conqueror Bot - gains Province
+Conqueror Bot - draws Duchy, Copper, Silver, Silver, Estate
+ 
+---------- Daniel Jonathan Roy: turn 19 ----------
+Daniel Jonathan Roy - plays Dame Molly
+Conqueror Bot - reveals: Copper, Province
+Daniel Jonathan Roy - plays 2 Silver, 1 Gold
+Daniel Jonathan Roy - buys Duchy
+Daniel Jonathan Roy - gains Duchy
+Daniel Jonathan Roy - draws Copper, JackOfAllTrades, Wandering Minstrel, Gold, Wandering Minstrel
+ 
+---------- Conqueror Bot: turn 20 ----------
+Conqueror Bot - plays 2 Silver, 1 Copper
+Conqueror Bot - buys Duchy
+Conqueror Bot - gains Duchy
+Conqueror Bot - draws Province, Festival, Silver, Curse, Jester
+ 
+---------- Daniel Jonathan Roy: turn 20 ----------
+Daniel Jonathan Roy - plays Wandering Minstrel
+Daniel Jonathan Roy - draws Silver
+Daniel Jonathan Roy - reveals: Province, Copper, Silver
+Daniel Jonathan Roy - discards: Province, Copper, Silver
+Daniel Jonathan Roy - plays Wandering Minstrel
+Daniel Jonathan Roy - draws Jester
+Daniel Jonathan Roy - reveals: Wandering Minstrel, Silver, Chapel
+Daniel Jonathan Roy - places Wandering Minstrel on top of deck
+Daniel Jonathan Roy - places Chapel on top of deck
+Daniel Jonathan Roy - discards Silver
+Daniel Jonathan Roy - plays Jester
+Conqueror Bot - reveals Copper
+Conqueror Bot - discards Copper
+Conqueror Bot - gains Copper
+Daniel Jonathan Roy - plays JackOfAllTrades
+Daniel Jonathan Roy - gains Silver
+Daniel Jonathan Roy - discards Chapel
+Daniel Jonathan Roy - trashes Wandering Minstrel
+Daniel Jonathan Roy - plays 2 Copper, 1 Gold, 1 Silver
+Daniel Jonathan Roy - buys Province
+Daniel Jonathan Roy - gains Province
+Daniel Jonathan Roy - draws Estate, Copper, Estate, Remake, Gold
+ 
+------------ Game Over ------------
+Conqueror Bot - cards: 2 JackOfAllTrades, 2 Remake, 12 Copper, 1 Jester, 1 Festival, 1 Wandering Minstrel, 8 Silver, 1 Gold, 4 Estate, 4 Province, 4 Duchy, 2 Curse
+Conqueror Bot - total victory points: 38
+Conqueror Bot - turns: 20
+ 
+Daniel Jonathan Roy - cards: 2 Jester, 2 Wandering Minstrel, 1 JackOfAllTrades, 1 Remake, 1 Dame Molly, 1 Chapel, 8 Silver, 7 Copper, 4 Gold, 4 Province, 2 Estate, 1 Duchy, 1 Curse
+Daniel Jonathan Roy - total victory points: 28
+Daniel Jonathan Roy - turns: 20
+ 
+1st place: Conqueror Bot
+2nd place: Daniel Jonathan Roy
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.512afbf3e4b0feac797bdad9.1363670261150.txt b/testing/testdata/log.512afbf3e4b0feac797bdad9.1363670261150.txt
new file mode 100644
index 0000000..64410ea
--- /dev/null
+++ b/testing/testdata/log.512afbf3e4b0feac797bdad9.1363670261150.txt
@@ -0,0 +1,551 @@
+------------ Game Setup ------------
+Supply cards: Courtyard, Procession, Remake, Treasure Map, Band of Misfits, Embassy, Graverobber, Library, Grand Market, Nobles, Copper, Silver, Gold, Estate, Duchy, Province, Curse
+Fannish - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+guest4482.0000 - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Fannish - shuffles deck
+guest4482.0000 - shuffles deck
+Fannish - draws Estate, Copper, Copper, Copper, Copper
+guest4482.0000 - draws Copper, Estate, Copper, Copper, Estate
+ 
+---------- guest4482.0000: turn 1 ----------
+guest4482.0000 - plays 3 Copper
+guest4482.0000 - buys Silver
+guest4482.0000 - gains Silver
+guest4482.0000 - draws Copper, Copper, Estate, Copper, Copper
+ 
+---------- Fannish: turn 1 ----------
+Fannish - plays Copper
+Fannish - plays Copper
+Fannish - plays Copper
+Fannish - plays Copper
+Fannish - buys Procession
+Fannish - gains Procession
+Fannish - draws Estate, Copper, Estate, Copper, Copper
+ 
+---------- guest4482.0000: turn 2 ----------
+guest4482.0000 - plays 4 Copper
+guest4482.0000 - buys Treasure Map
+guest4482.0000 - gains Treasure Map
+guest4482.0000 - shuffles deck
+guest4482.0000 - draws Copper, Copper, Treasure Map, Estate, Copper
+ 
+---------- Fannish: turn 2 ----------
+Fannish - plays 3 Copper
+Fannish - buys Silver
+Fannish - gains Silver
+Fannish - shuffles deck
+Fannish - draws Copper, Copper, Copper, Copper, Estate
+ 
+---------- guest4482.0000: turn 3 ----------
+guest4482.0000 - plays 3 Copper
+guest4482.0000 - buys Silver
+guest4482.0000 - gains Silver
+guest4482.0000 - draws Estate, Copper, Copper, Copper, Copper
+ 
+---------- Fannish: turn 3 ----------
+Fannish - plays 4 Copper
+Fannish - buys Treasure Map
+Fannish - gains Treasure Map
+Fannish - draws Copper, Estate, Copper, Copper, Silver
+ 
+---------- guest4482.0000: turn 4 ----------
+guest4482.0000 - plays 4 Copper
+guest4482.0000 - buys Treasure Map
+guest4482.0000 - gains Treasure Map
+guest4482.0000 - draws Silver, Estate
+guest4482.0000 - shuffles deck
+guest4482.0000 - draws Treasure Map, Copper, Copper
+ 
+---------- Fannish: turn 4 ----------
+Fannish - plays 3 Copper, 1 Silver
+Fannish - buys Band of Misfits
+Fannish - gains Band of Misfits
+Fannish - draws Estate, Procession
+Fannish - shuffles deck
+Fannish - draws Estate, Copper, Copper
+ 
+---------- guest4482.0000: turn 5 ----------
+guest4482.0000 - plays 2 Copper, 1 Silver
+guest4482.0000 - buys Courtyard
+guest4482.0000 - gains Courtyard
+guest4482.0000 - draws Copper, Copper, Estate, Copper, Copper
+ 
+---------- Fannish: turn 5 ----------
+Fannish - plays 2 Copper
+Fannish - buys Courtyard
+Fannish - gains Courtyard
+Fannish - draws Treasure Map, Estate, Copper, Copper, Copper
+ 
+---------- guest4482.0000: turn 6 ----------
+guest4482.0000 - plays 4 Copper
+guest4482.0000 - buys Silver
+guest4482.0000 - gains Silver
+guest4482.0000 - draws Estate, Treasure Map, Copper, Silver
+guest4482.0000 - shuffles deck
+guest4482.0000 - draws Estate
+ 
+---------- Fannish: turn 6 ----------
+Fannish - plays Treasure Map
+Fannish - trashes Treasure Map
+Fannish - plays 3 Copper
+Fannish - buys Silver
+Fannish - gains Silver
+Fannish - draws Band of Misfits, Copper, Silver, Copper
+Fannish - shuffles deck
+Fannish - draws Copper
+ 
+---------- guest4482.0000: turn 7 ----------
+guest4482.0000 - plays 1 Copper, 1 Silver
+guest4482.0000 - buys Silver
+guest4482.0000 - gains Silver
+guest4482.0000 - draws Copper, Copper, Copper, Treasure Map, Silver
+ 
+---------- Fannish: turn 7 ----------
+Fannish - plays Band of Misfits
+Fannish - chooses Courtyard
+Fannish - plays Courtyard
+Fannish - draws Estate, Procession, Copper
+Fannish - places Procession on top of deck
+Fannish - plays 4 Copper, 1 Silver
+Fannish - buys Graverobber
+Fannish - gains Graverobber
+Fannish - draws Procession, Silver, Estate, Copper, Copper
+ 
+---------- guest4482.0000: turn 8 ----------
+guest4482.0000 - plays 3 Copper, 1 Silver
+guest4482.0000 - buys Graverobber
+guest4482.0000 - gains Graverobber
+guest4482.0000 - draws Copper, Silver, Copper, Courtyard, Copper
+ 
+---------- Fannish: turn 8 ----------
+Fannish - plays Procession
+Fannish - plays 2 Copper, 1 Silver
+Fannish - buys Treasure Map
+Fannish - gains Treasure Map
+Fannish - draws Estate, Copper, Courtyard
+Fannish - shuffles deck
+Fannish - draws Band of Misfits, Copper
+ 
+---------- guest4482.0000: turn 9 ----------
+guest4482.0000 - plays 3 Copper, 1 Silver
+guest4482.0000 - buys Graverobber
+guest4482.0000 - gains Graverobber
+guest4482.0000 - draws Estate
+guest4482.0000 - shuffles deck
+guest4482.0000 - draws Graverobber, Copper, Silver, Treasure Map
+ 
+---------- Fannish: turn 9 ----------
+Fannish - plays Band of Misfits
+Fannish - chooses Procession
+Fannish - plays Procession
+Fannish - plays Courtyard
+Fannish - draws Copper, Copper, Silver
+Fannish - places Silver on top of deck
+Fannish - plays Courtyard
+Fannish - draws Silver, Copper, Copper
+Fannish - places Silver on top of deck
+Fannish - trashes Courtyard
+Fannish - plays 6 Copper
+Fannish - buys Nobles
+Fannish - gains Nobles
+Fannish - draws Silver, Estate, Graverobber, Procession, Silver
+ 
+---------- guest4482.0000: turn 10 ----------
+guest4482.0000 - plays Graverobber
+guest4482.0000 - gains Treasure Map
+guest4482.0000 - plays 1 Copper, 1 Silver
+guest4482.0000 - buys Silver
+guest4482.0000 - gains Silver
+guest4482.0000 - draws Treasure Map, Copper, Copper, Copper, Silver
+ 
+---------- Fannish: turn 10 ----------
+Fannish - plays Graverobber
+Fannish - plays 2 Silver
+Fannish - buys Treasure Map
+Fannish - gains Treasure Map
+Fannish - draws Estate, Treasure Map, Copper
+Fannish - shuffles deck
+Fannish - draws Copper, Treasure Map
+ 
+---------- guest4482.0000: turn 11 ----------
+guest4482.0000 - plays 3 Copper, 1 Silver
+guest4482.0000 - buys Procession
+guest4482.0000 - gains Procession
+guest4482.0000 - draws Copper, Estate, Courtyard, Silver, Estate
+ 
+---------- Fannish: turn 11 ----------
+Fannish - plays Treasure Map
+Fannish - trashes Treasure Map, Treasure Map
+Fannish - gains Gold
+Fannish - gains Gold
+Fannish - gains Gold
+Fannish - gains Gold
+Fannish - plays 2 Copper
+Fannish - buys Courtyard
+Fannish - gains Courtyard
+Fannish - draws Gold, Gold, Gold, Gold, Copper
+ 
+---------- guest4482.0000: turn 12 ----------
+guest4482.0000 - plays Courtyard
+guest4482.0000 - draws Copper, Treasure Map, Copper
+guest4482.0000 - places Treasure Map on top of deck
+guest4482.0000 - plays 3 Copper, 1 Silver
+guest4482.0000 - buys Library
+guest4482.0000 - gains Library
+guest4482.0000 - draws Treasure Map, Silver, Graverobber
+guest4482.0000 - shuffles deck
+guest4482.0000 - draws Silver, Treasure Map
+ 
+---------- Fannish: turn 12 ----------
+Fannish - plays Gold
+Fannish - plays Gold
+Fannish - buys Grand Market
+Fannish - gains Grand Market
+Fannish - draws Estate, Copper, Estate, Graverobber, Nobles
+ 
+---------- guest4482.0000: turn 13 ----------
+guest4482.0000 - plays Treasure Map
+guest4482.0000 - trashes Treasure Map, Treasure Map
+guest4482.0000 - gains Gold
+guest4482.0000 - gains Gold
+guest4482.0000 - gains Gold
+guest4482.0000 - gains Gold
+guest4482.0000 - plays 2 Silver
+guest4482.0000 - buys Silver
+guest4482.0000 - gains Silver
+guest4482.0000 - draws Gold, Gold, Gold, Gold, Silver
+ 
+---------- Fannish: turn 13 ----------
+Fannish - plays Graverobber
+Fannish - gains Treasure Map
+Fannish - plays Copper
+Fannish - draws Treasure Map, Procession, Band of Misfits, Copper, Copper
+ 
+---------- guest4482.0000: turn 14 ----------
+guest4482.0000 - plays 4 Gold, 1 Silver
+guest4482.0000 - buys Grand Market
+guest4482.0000 - gains Grand Market
+guest4482.0000 - draws Estate, Copper, Library, Estate, Courtyard
+ 
+---------- Fannish: turn 14 ----------
+Fannish - plays Band of Misfits
+Fannish - chooses Treasure Map
+Fannish - plays Treasure Map
+Fannish - trashes Treasure Map, Treasure Map
+Fannish - gains Gold
+Fannish - gains Gold
+Fannish - gains Gold
+Fannish - gains Gold
+Fannish - plays 2 Copper
+Fannish - buys Courtyard
+Fannish - gains Courtyard
+Fannish - draws Gold, Gold, Gold, Gold, Copper
+ 
+---------- guest4482.0000: turn 15 ----------
+guest4482.0000 - plays Courtyard
+guest4482.0000 - draws Copper, Copper, Procession
+guest4482.0000 - places Procession on top of deck
+guest4482.0000 - plays 3 Copper
+guest4482.0000 - buys Silver
+guest4482.0000 - gains Silver
+guest4482.0000 - draws Procession, Copper, Copper, Estate, Silver
+ 
+---------- Fannish: turn 15 ----------
+Fannish - plays Gold
+Fannish - plays Gold
+Fannish - buys Grand Market
+Fannish - gains Grand Market
+Fannish - draws Silver, Silver
+Fannish - shuffles deck
+Fannish - draws Graverobber, Estate, Gold
+ 
+---------- guest4482.0000: turn 16 ----------
+guest4482.0000 - plays 2 Copper, 1 Silver
+guest4482.0000 - buys Treasure Map
+guest4482.0000 - gains Treasure Map
+guest4482.0000 - draws Copper, Copper, Graverobber, Silver, Treasure Map
+ 
+---------- Fannish: turn 16 ----------
+Fannish - plays Graverobber
+Fannish - gains Band of Misfits
+Fannish - plays 2 Silver, 1 Gold
+Fannish - buys Grand Market
+Fannish - gains Grand Market
+Fannish - draws Band of Misfits, Copper, Copper, Copper, Gold
+ 
+---------- guest4482.0000: turn 17 ----------
+guest4482.0000 - plays Graverobber
+guest4482.0000 - gains Treasure Map
+guest4482.0000 - plays 2 Copper, 1 Silver
+guest4482.0000 - buys Silver
+guest4482.0000 - gains Silver
+guest4482.0000 - draws Treasure Map
+guest4482.0000 - shuffles deck
+guest4482.0000 - draws Copper, Silver, Copper, Copper
+ 
+---------- Fannish: turn 17 ----------
+Fannish - plays Band of Misfits
+Fannish - chooses Courtyard
+Fannish - plays Courtyard
+Fannish - draws Gold, Gold, Gold
+Fannish - places Gold on top of deck
+Fannish - plays Gold
+Fannish - plays Gold
+Fannish - buys Grand Market
+Fannish - gains Grand Market
+Fannish - draws Gold, Copper, Copper, Nobles, Gold
+ 
+---------- guest4482.0000: turn 18 ----------
+guest4482.0000 - plays 3 Copper, 1 Silver
+guest4482.0000 - buys Library
+guest4482.0000 - gains Library
+guest4482.0000 - draws Copper, Silver, Grand Market, Gold, Library
+ 
+---------- Fannish: turn 18 ----------
+Fannish - plays Nobles
+Fannish - draws Estate, Gold, Gold
+Fannish - plays Gold
+Fannish - plays Gold
+Fannish - buys Grand Market
+Fannish - gains Grand Market
+Fannish - draws Grand Market, Courtyard, Courtyard, Estate, Grand Market
+ 
+---------- guest4482.0000: turn 19 ----------
+guest4482.0000 - plays Grand Market
+guest4482.0000 - draws Copper
+guest4482.0000 - plays Library
+guest4482.0000 - draws Silver
+guest4482.0000 - discards Courtyard
+guest4482.0000 - draws Gold
+guest4482.0000 - draws Silver
+guest4482.0000 - discards Courtyard
+guest4482.0000 - plays 3 Silver, 2 Gold
+guest4482.0000 - plays Copper
+guest4482.0000 - plays Copper
+guest4482.0000 - buys Nobles
+guest4482.0000 - gains Nobles
+guest4482.0000 - buys Province
+guest4482.0000 - gains Province
+guest4482.0000 - draws Estate, Graverobber, Copper, Treasure Map, Copper
+ 
+---------- Fannish: turn 19 ----------
+Fannish - plays Grand Market
+Fannish - draws Copper
+Fannish - plays Grand Market
+Fannish - draws Procession
+Fannish - plays Procession
+Fannish - plays Courtyard
+Fannish - draws Copper
+Fannish - shuffles deck
+Fannish - draws Copper, Copper
+Fannish - places Estate on top of deck
+Fannish - plays Courtyard
+Fannish - draws Estate, Grand Market, Nobles
+Fannish - places Estate on top of deck
+Fannish - trashes Courtyard
+Fannish - plays 4 Copper
+Fannish - buys Province
+Fannish - gains Province
+Fannish - draws Estate, Gold, Silver, Copper, Gold
+ 
+---------- guest4482.0000: turn 20 ----------
+guest4482.0000 - plays Graverobber
+guest4482.0000 - gains Treasure Map
+guest4482.0000 - plays 2 Copper
+guest4482.0000 - buys Estate
+guest4482.0000 - gains Estate
+guest4482.0000 - draws Treasure Map, Silver, Silver, Procession, Silver
+ 
+---------- Fannish: turn 20 ----------
+Fannish - plays Gold
+Fannish - plays Gold
+Fannish - buys Grand Market
+Fannish - gains Grand Market
+Fannish - draws Gold, Copper, Gold, Graverobber, Band of Misfits
+ 
+---------- guest4482.0000: turn 21 ----------
+guest4482.0000 - plays Procession
+guest4482.0000 - plays Treasure Map
+guest4482.0000 - trashes Treasure Map
+guest4482.0000 - plays Treasure Map
+guest4482.0000 - gains Library
+guest4482.0000 - plays 3 Silver
+guest4482.0000 - buys Nobles
+guest4482.0000 - gains Nobles
+guest4482.0000 - draws Graverobber, Silver, Estate, Treasure Map, Gold
+ 
+---------- Fannish: turn 21 ----------
+Fannish - plays Graverobber
+Fannish - gains Treasure Map
+Fannish - plays Gold
+Fannish - plays Gold
+Fannish - buys Grand Market
+Fannish - gains Grand Market
+Fannish - draws Treasure Map, Estate, Grand Market, Copper, Gold
+ 
+---------- guest4482.0000: turn 22 ----------
+guest4482.0000 - plays Graverobber
+guest4482.0000 - trashes Treasure Map
+guest4482.0000 - gains Grand Market
+guest4482.0000 - plays 1 Silver, 1 Gold
+guest4482.0000 - buys Duchy
+guest4482.0000 - gains Duchy
+guest4482.0000 - draws Gold, Estate
+guest4482.0000 - shuffles deck
+guest4482.0000 - draws Copper, Copper, Procession
+ 
+---------- Fannish: turn 22 ----------
+Fannish - plays Grand Market
+Fannish - draws Gold
+Fannish - plays Gold
+Fannish - plays Gold
+Fannish - buys Grand Market
+Fannish - gains Grand Market
+Fannish - draws Gold, Grand Market, Estate, Gold, Silver
+ 
+---------- guest4482.0000: turn 23 ----------
+guest4482.0000 - plays 2 Copper, 1 Gold
+guest4482.0000 - buys Duchy
+guest4482.0000 - gains Duchy
+guest4482.0000 - draws Copper, Treasure Map, Grand Market, Nobles, Province
+ 
+---------- Fannish: turn 23 ----------
+Fannish - plays Grand Market
+Fannish - shuffles deck
+Fannish - draws Estate
+Fannish - plays 2 Gold, 1 Silver
+Fannish - buys Duchy
+Fannish - gains Duchy
+Fannish - buys Duchy
+Fannish - gains Duchy
+Fannish - draws Band of Misfits, Estate, Gold, Courtyard, Gold
+ 
+---------- guest4482.0000: turn 24 ----------
+guest4482.0000 - plays Grand Market
+guest4482.0000 - draws Graverobber
+guest4482.0000 - plays Nobles
+guest4482.0000 - draws Estate, Grand Market, Silver
+guest4482.0000 - plays 1 Copper, 1 Silver
+guest4482.0000 - buys Silver
+guest4482.0000 - gains Silver
+guest4482.0000 - draws Silver, Copper, Courtyard, Gold, Silver
+ 
+---------- Fannish: turn 24 ----------
+Fannish - plays Courtyard
+Fannish - draws Gold, Grand Market, Copper
+Fannish - places Grand Market on top of deck
+Fannish - plays 3 Gold
+Fannish - buys Province
+Fannish - gains Province
+Fannish - draws Grand Market, Copper, Copper, Grand Market, Gold
+ 
+---------- guest4482.0000: turn 25 ----------
+guest4482.0000 - plays 2 Silver, 1 Copper, 1 Gold
+guest4482.0000 - buys Province
+guest4482.0000 - gains Province
+guest4482.0000 - draws Silver, Silver, Graverobber, Silver, Library
+ 
+---------- Fannish: turn 25 ----------
+Fannish - plays Grand Market
+Fannish - draws Copper
+Fannish - plays Grand Market
+Fannish - draws Grand Market
+Fannish - plays Grand Market
+Fannish - draws Grand Market
+Fannish - plays Grand Market
+Fannish - draws Gold
+Fannish - plays 2 Gold
+Fannish - buys Province
+Fannish - gains Province
+Fannish - buys Duchy
+Fannish - gains Duchy
+Fannish - draws Treasure Map, Gold, Grand Market, Copper, Nobles
+ 
+---------- guest4482.0000: turn 26 ----------
+guest4482.0000 - plays Library
+guest4482.0000 - draws Copper
+guest4482.0000 - discards Library
+guest4482.0000 - draws Silver
+guest4482.0000 - draws Copper
+guest4482.0000 - discards Library
+guest4482.0000 - plays 4 Silver
+guest4482.0000 - buys Province
+guest4482.0000 - gains Province
+guest4482.0000 - draws Estate, Treasure Map, Duchy, Silver, Gold
+ 
+---------- Fannish: turn 26 ----------
+Fannish - plays Grand Market
+Fannish - draws Grand Market
+Fannish - plays Grand Market
+Fannish - draws Copper
+Fannish - plays Nobles
+Fannish - draws Graverobber, Copper, Silver
+Fannish - plays 1 Gold, 1 Silver
+Fannish - plays Copper
+Fannish - plays 2 Copper
+Fannish - buys Duchy
+Fannish - gains Duchy
+Fannish - buys Duchy
+Fannish - gains Duchy
+Fannish - buys Estate
+Fannish - gains Estate
+Fannish - draws Grand Market, Procession, Province
+Fannish - shuffles deck
+Fannish - draws Province, Estate
+ 
+---------- guest4482.0000: turn 27 ----------
+guest4482.0000 - plays 1 Silver, 1 Gold
+guest4482.0000 - buys Duchy
+guest4482.0000 - gains Duchy
+guest4482.0000 - draws Estate, Nobles, Library, Copper, Gold
+ 
+---------- Fannish: turn 27 ----------
+Fannish - plays Procession
+Fannish - plays Grand Market
+Fannish - draws Nobles
+Fannish - plays Grand Market
+Fannish - draws Copper
+Fannish - trashes Grand Market
+Fannish - plays Nobles
+Fannish - draws Grand Market, Treasure Map, Gold
+Fannish - plays Grand Market
+Fannish - draws Gold
+Fannish - plays 2 Gold
+Fannish - buys Province
+Fannish - gains Province
+Fannish - buys Estate
+Fannish - gains Estate
+Fannish - buys Estate
+Fannish - gains Estate
+Fannish - draws Estate, Grand Market, Copper, Courtyard, Copper
+ 
+---------- guest4482.0000: turn 28 ----------
+guest4482.0000 - plays Nobles
+guest4482.0000 - takes 2 actions
+guest4482.0000 - plays Library
+guest4482.0000 - shuffles deck
+guest4482.0000 - draws Gold
+guest4482.0000 - moves Grand Market to hand
+guest4482.0000 - draws Silver
+guest4482.0000 - draws Silver
+guest4482.0000 - plays Grand Market
+guest4482.0000 - draws Silver
+guest4482.0000 - plays 3 Silver, 2 Gold
+guest4482.0000 - buys Nobles
+guest4482.0000 - gains Nobles
+guest4482.0000 - buys Province
+guest4482.0000 - gains Province
+guest4482.0000 - draws Duchy, Treasure Map, Treasure Map, Courtyard, Copper
+ 
+------------ Game Over ------------
+Fannish - cards: 7 Grand Market, 1 Nobles, 1 Band of Misfits, 1 Courtyard, 1 Treasure Map, 1 Procession, 1 Graverobber, 8 Gold, 7 Copper, 2 Silver, 6 Estate, 5 Duchy, 4 Province
+Fannish - total victory points: 47
+Fannish - turns: 27
+ 
+guest4482.0000 - cards: 3 Nobles, 3 Library, 2 Graverobber, 2 Grand Market, 2 Treasure Map, 1 Procession, 1 Courtyard, 9 Silver, 7 Copper, 4 Gold, 4 Province, 4 Estate, 3 Duchy
+guest4482.0000 - total victory points: 43
+guest4482.0000 - turns: 28
+ 
+1st place: Fannish
+2nd place: guest4482.0000
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.512c07c0e4b0c02658fec563.1364840138250.txt b/testing/testdata/log.512c07c0e4b0c02658fec563.1364840138250.txt
new file mode 100644
index 0000000..daf1531
--- /dev/null
+++ b/testing/testdata/log.512c07c0e4b0c02658fec563.1364840138250.txt
@@ -0,0 +1,531 @@
+------------ Game Setup ------------
+Supply cards: Cellar, Hermit, Swindler, Bureaucrat, Cutpurse, Death Cart, Pirate Ship, Procession, Counterfeit, Forge, Copper, Silver, Gold, Estate, Duchy, Province, Curse, Colony, Platinum, Ruins
+treetop70 - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Warlord Bot - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+treetop70 - shuffles deck
+Warlord Bot - shuffles deck
+treetop70 - draws Estate, Copper, Copper, Estate, Copper
+Warlord Bot - draws Copper, Copper, Copper, Copper, Copper
+ 
+---------- treetop70: turn 1 ----------
+treetop70 - plays 3 Copper
+treetop70 - buys Hermit
+treetop70 - gains Hermit
+treetop70 - draws Copper, Copper, Estate, Copper, Copper
+ 
+---------- Warlord Bot: turn 1 ----------
+Warlord Bot - plays 5 Copper
+Warlord Bot - buys Counterfeit
+Warlord Bot - gains Counterfeit
+Warlord Bot - draws Estate, Estate, Estate, Copper, Copper
+ 
+---------- treetop70: turn 2 ----------
+treetop70 - plays 4 Copper
+treetop70 - buys Death Cart
+treetop70 - gains Death Cart
+treetop70 - gains Ruined Village
+treetop70 - gains Ruined Library
+treetop70 - shuffles deck
+treetop70 - draws Hermit, Copper, Copper, Copper, Ruined Library
+ 
+---------- Warlord Bot: turn 2 ----------
+Warlord Bot - plays 2 Copper
+Warlord Bot - buys Cellar
+Warlord Bot - gains Cellar
+Warlord Bot - shuffles deck
+Warlord Bot - draws Copper, Copper, Estate, Copper, Copper
+ 
+---------- treetop70: turn 3 ----------
+treetop70 - plays Hermit
+treetop70 - trashes Ruined Library
+treetop70 - gains Silver
+treetop70 - plays 3 Copper
+treetop70 - buys Silver
+treetop70 - gains Silver
+treetop70 - draws Ruined Village, Copper, Copper, Estate, Copper
+ 
+---------- Warlord Bot: turn 3 ----------
+Warlord Bot - plays 4 Copper
+Warlord Bot - buys Cutpurse
+Warlord Bot - gains Cutpurse
+Warlord Bot - draws Counterfeit, Cellar, Copper, Estate, Copper
+ 
+---------- treetop70: turn 4 ----------
+treetop70 - plays 3 Copper
+treetop70 - buys Swindler
+treetop70 - gains Swindler
+treetop70 - draws Estate, Death Cart, Estate, Copper
+treetop70 - shuffles deck
+treetop70 - draws Copper
+ 
+---------- Warlord Bot: turn 4 ----------
+Warlord Bot - plays Cellar
+Warlord Bot - discards Estate
+Warlord Bot - discards Copper
+Warlord Bot - discards Copper
+Warlord Bot - draws Copper, Estate
+Warlord Bot - shuffles deck
+Warlord Bot - draws Copper
+Warlord Bot - plays Counterfeit
+Warlord Bot - plays Copper
+Warlord Bot - plays Copper
+Warlord Bot - trashes Copper
+Warlord Bot - plays 1 Copper
+Warlord Bot - buys Cutpurse
+Warlord Bot - gains Cutpurse
+Warlord Bot - draws Estate, Copper, Copper, Copper, Copper
+ 
+---------- treetop70: turn 5 ----------
+treetop70 - plays Death Cart
+treetop70 - trashes Death Cart
+treetop70 - plays 2 Copper
+treetop70 - buys Forge
+treetop70 - gains Forge
+treetop70 - draws Silver, Ruined Village, Copper, Copper, Estate
+ 
+---------- Warlord Bot: turn 5 ----------
+Warlord Bot - plays 4 Copper
+Warlord Bot - buys Procession
+Warlord Bot - gains Procession
+Warlord Bot - draws Estate, Cutpurse, Copper
+Warlord Bot - shuffles deck
+Warlord Bot - draws Procession, Copper
+ 
+---------- treetop70: turn 6 ----------
+treetop70 - plays 2 Copper, 1 Silver
+treetop70 - buys Cutpurse
+treetop70 - gains Cutpurse
+treetop70 - draws Copper, Copper, Hermit, Copper, Swindler
+ 
+---------- Warlord Bot: turn 6 ----------
+Warlord Bot - plays Cutpurse
+treetop70 - discards Copper
+Warlord Bot - plays 2 Copper
+Warlord Bot - buys Death Cart
+Warlord Bot - gains Death Cart
+Warlord Bot - gains Abandoned Mine
+Warlord Bot - gains Survivors
+Warlord Bot - draws Estate, Cellar, Copper, Estate, Counterfeit
+ 
+---------- treetop70: turn 7 ----------
+treetop70 - plays Swindler
+Warlord Bot - reveals Cutpurse
+Warlord Bot - trashes Cutpurse
+Warlord Bot - gains Pirate Ship
+treetop70 - plays 2 Copper
+treetop70 - buys Death Cart
+treetop70 - gains Death Cart
+treetop70 - gains Ruined Library
+treetop70 - gains Ruined Village
+treetop70 - draws Silver
+treetop70 - shuffles deck
+treetop70 - draws Forge, Estate, Copper, Hermit
+ 
+---------- Warlord Bot: turn 7 ----------
+Warlord Bot - plays Cellar
+Warlord Bot - discards Estate
+Warlord Bot - discards Estate
+Warlord Bot - discards Copper
+Warlord Bot - draws Copper, Copper, Copper
+Warlord Bot - plays Counterfeit
+Warlord Bot - plays Copper
+Warlord Bot - plays Copper
+Warlord Bot - trashes Copper
+Warlord Bot - plays 2 Copper
+Warlord Bot - buys Silver
+Warlord Bot - gains Silver
+Warlord Bot - buys Cellar
+Warlord Bot - gains Cellar
+Warlord Bot - shuffles deck
+Warlord Bot - draws Cutpurse, Survivors, Copper, Pirate Ship, Abandoned Mine
+ 
+---------- treetop70: turn 8 ----------
+treetop70 - plays Forge
+treetop70 - trashes Silver, Estate, Copper, Hermit
+treetop70 - gains Province
+treetop70 - draws Copper, Ruined Village, Estate, Copper, Swindler
+ 
+---------- Warlord Bot: turn 8 ----------
+Warlord Bot - plays Pirate Ship
+treetop70 - reveals Ruined Library, Silver
+Warlord Bot - trashes Silver
+treetop70 - discards Ruined Library
+Warlord Bot - receives a pirate coin, now has 1 pirate coin(s)
+Warlord Bot - plays 1 Copper
+Warlord Bot - draws Estate, Copper, Counterfeit, Estate, Copper
+ 
+---------- treetop70: turn 9 ----------
+treetop70 - plays Ruined Village
+treetop70 - plays Swindler
+Warlord Bot - reveals Cellar
+Warlord Bot - trashes Cellar
+Warlord Bot - gains Estate
+treetop70 - plays 2 Copper
+treetop70 - buys Death Cart
+treetop70 - gains Death Cart
+treetop70 - gains Ruined Library
+treetop70 - gains Ruined Library
+treetop70 - draws Ruined Village, Copper, Cutpurse, Death Cart, Copper
+ 
+---------- Warlord Bot: turn 9 ----------
+Warlord Bot - plays Counterfeit
+Warlord Bot - plays Copper
+Warlord Bot - plays Copper
+Warlord Bot - trashes Copper
+Warlord Bot - plays 1 Copper
+Warlord Bot - buys Death Cart
+Warlord Bot - gains Death Cart
+Warlord Bot - gains Abandoned Mine
+Warlord Bot - gains Survivors
+Warlord Bot - draws Cellar, Copper, Silver, Death Cart, Estate
+ 
+---------- treetop70: turn 10 ----------
+treetop70 - plays Death Cart
+treetop70 - trashes Ruined Village
+treetop70 - plays Copper
+treetop70 - buys Gold
+treetop70 - gains Gold
+treetop70 - draws Copper, Copper, Estate
+treetop70 - shuffles deck
+treetop70 - draws Ruined Library, Death Cart
+ 
+---------- Warlord Bot: turn 10 ----------
+Warlord Bot - plays Cellar
+Warlord Bot - discards Estate
+Warlord Bot - discards Copper
+Warlord Bot - draws Copper, Procession
+Warlord Bot - plays Death Cart
+Warlord Bot - trashes Procession
+Warlord Bot - plays 1 Silver, 1 Copper
+Warlord Bot - buys Province
+Warlord Bot - gains Province
+Warlord Bot - shuffles deck
+Warlord Bot - draws Estate, Abandoned Mine, Survivors, Cellar, Death Cart
+ 
+---------- treetop70: turn 11 ----------
+treetop70 - plays Death Cart
+treetop70 - trashes Ruined Library
+treetop70 - plays 2 Copper
+treetop70 - buys Gold
+treetop70 - gains Gold
+treetop70 - draws Copper, Cutpurse, Swindler, Province, Forge
+ 
+---------- Warlord Bot: turn 11 ----------
+Warlord Bot - plays Cellar
+Warlord Bot - discards Estate
+Warlord Bot - discards Abandoned Mine
+Warlord Bot - discards Survivors
+Warlord Bot - draws Province, Death Cart, Silver
+Warlord Bot - plays Death Cart
+Warlord Bot - trashes Death Cart
+Warlord Bot - plays 1 Silver
+Warlord Bot - buys Gold
+Warlord Bot - gains Gold
+Warlord Bot - draws Copper, Cutpurse, Estate, Estate, Survivors
+ 
+---------- treetop70: turn 12 ----------
+treetop70 - plays Forge
+treetop70 - trashes Swindler, Cutpurse, Copper
+treetop70 - gains Forge
+treetop70 - draws Ruined Library, Ruined Village, Death Cart, Estate, Copper
+ 
+---------- Warlord Bot: turn 12 ----------
+Warlord Bot - plays Cutpurse
+treetop70 - discards Copper
+Warlord Bot - plays 1 Copper
+Warlord Bot - buys Silver
+Warlord Bot - gains Silver
+Warlord Bot - draws Abandoned Mine, Pirate Ship, Copper, Counterfeit, Copper
+ 
+---------- treetop70: turn 13 ----------
+treetop70 - plays Death Cart
+treetop70 - trashes Ruined Village
+treetop70 - buys Counterfeit
+treetop70 - gains Counterfeit
+treetop70 - draws Copper, Copper, Ruined Library, Gold
+treetop70 - shuffles deck
+treetop70 - draws Province
+ 
+---------- Warlord Bot: turn 13 ----------
+Warlord Bot - plays Pirate Ship
+treetop70 - reveals Forge, Copper
+Warlord Bot - trashes Copper
+treetop70 - discards Forge
+Warlord Bot - receives a pirate coin, now has 2 pirate coin(s)
+Warlord Bot - plays Counterfeit
+Warlord Bot - plays Copper
+Warlord Bot - plays Copper
+Warlord Bot - trashes Copper
+Warlord Bot - plays 1 Copper
+Warlord Bot - buys Death Cart
+Warlord Bot - gains Death Cart
+Warlord Bot - draws Estate, Copper
+Warlord Bot - shuffles deck
+Warlord Bot - draws Silver, Silver, Abandoned Mine
+ 
+---------- treetop70: turn 14 ----------
+treetop70 - plays Ruined Library
+treetop70 - draws Copper
+treetop70 - plays 3 Copper, 1 Gold
+treetop70 - buys Gold
+treetop70 - gains Gold
+treetop70 - draws Death Cart, Copper, Ruined Library, Counterfeit, Estate
+ 
+---------- Warlord Bot: turn 14 ----------
+Warlord Bot - plays Abandoned Mine
+Warlord Bot - plays 2 Silver, 1 Copper
+Warlord Bot - buys Gold
+Warlord Bot - gains Gold
+Warlord Bot - draws Counterfeit, Cellar, Copper, Pirate Ship, Death Cart
+ 
+---------- treetop70: turn 15 ----------
+treetop70 - plays Death Cart
+treetop70 - trashes Ruined Library
+treetop70 - plays Counterfeit
+treetop70 - plays Copper
+treetop70 - plays Copper
+treetop70 - trashes Copper
+treetop70 - buys Province
+treetop70 - gains Province
+treetop70 - draws Forge, Gold, Estate, Death Cart
+treetop70 - shuffles deck
+treetop70 - draws Gold
+ 
+---------- Warlord Bot: turn 15 ----------
+Warlord Bot - plays Cellar
+Warlord Bot - discards Copper
+Warlord Bot - draws Estate
+Warlord Bot - plays Pirate Ship
+treetop70 - reveals Copper, Copper
+Warlord Bot - trashes Copper
+treetop70 - discards Copper
+Warlord Bot - receives a pirate coin, now has 3 pirate coin(s)
+Warlord Bot - plays Counterfeit
+Warlord Bot - draws Province, Estate, Gold, Survivors, Cutpurse
+ 
+---------- treetop70: turn 16 ----------
+treetop70 - plays Death Cart
+treetop70 - trashes Forge
+treetop70 - plays 2 Gold
+treetop70 - buys Colony
+treetop70 - gains Colony
+treetop70 - draws Forge, Gold, Estate, Province, Copper
+ 
+---------- Warlord Bot: turn 16 ----------
+Warlord Bot - plays Cutpurse
+treetop70 - discards Copper
+Warlord Bot - plays 1 Gold
+Warlord Bot - buys Death Cart
+Warlord Bot - gains Death Cart
+Warlord Bot - draws Estate, Death Cart, Abandoned Mine, Survivors, Copper
+ 
+---------- treetop70: turn 17 ----------
+treetop70 - plays Forge
+treetop70 - trashes Gold, Estate
+treetop70 - gains Province
+treetop70 - draws Ruined Library, Counterfeit, Death Cart, Province
+treetop70 - shuffles deck
+treetop70 - draws Estate
+ 
+---------- Warlord Bot: turn 17 ----------
+Warlord Bot - plays Death Cart
+Warlord Bot - trashes Abandoned Mine
+Warlord Bot - plays 1 Copper
+Warlord Bot - buys Gold
+Warlord Bot - gains Gold
+Warlord Bot - shuffles deck
+Warlord Bot - draws Survivors, Cutpurse, Death Cart, Copper, Estate
+ 
+---------- treetop70: turn 18 ----------
+treetop70 - plays Death Cart
+treetop70 - trashes Ruined Library
+treetop70 - plays Counterfeit
+treetop70 - buys Gold
+treetop70 - gains Gold
+treetop70 - draws Province, Copper, Gold, Gold, Copper
+ 
+---------- Warlord Bot: turn 18 ----------
+Warlord Bot - plays Death Cart
+Warlord Bot - trashes Survivors
+Warlord Bot - plays 1 Copper
+Warlord Bot - buys Gold
+Warlord Bot - gains Gold
+Warlord Bot - draws Estate, Death Cart, Estate, Copper, Copper
+ 
+---------- treetop70: turn 19 ----------
+treetop70 - plays 2 Copper, 2 Gold
+treetop70 - buys Province
+treetop70 - gains Province
+treetop70 - draws Colony, Province, Death Cart, Forge
+treetop70 - shuffles deck
+treetop70 - draws Copper
+ 
+---------- Warlord Bot: turn 19 ----------
+Warlord Bot - plays Death Cart
+Warlord Bot - trashes Death Cart
+Warlord Bot - plays 2 Copper
+Warlord Bot - buys Duchy
+Warlord Bot - gains Duchy
+Warlord Bot - draws Gold, Gold, Abandoned Mine, Cellar, Silver
+ 
+---------- treetop70: turn 20 ----------
+treetop70 - plays Forge
+treetop70 - trashes Death Cart, Copper
+treetop70 - gains Death Cart
+treetop70 - draws Gold, Province, Province, Copper, Province
+ 
+---------- Warlord Bot: turn 20 ----------
+Warlord Bot - plays Cellar
+Warlord Bot - discards Abandoned Mine
+Warlord Bot - draws Gold
+Warlord Bot - plays 3 Gold, 1 Silver
+Warlord Bot - buys Colony
+Warlord Bot - gains Colony
+Warlord Bot - draws Survivors, Counterfeit, Death Cart, Pirate Ship, Estate
+ 
+---------- treetop70: turn 21 ----------
+treetop70 - plays 1 Gold, 1 Copper
+treetop70 - buys Bureaucrat
+treetop70 - gains Bureaucrat
+treetop70 - draws Gold, Counterfeit, Estate, Gold, Death Cart
+ 
+---------- Warlord Bot: turn 21 ----------
+Warlord Bot - plays Death Cart
+Warlord Bot - trashes Survivors
+Warlord Bot - plays Counterfeit
+Warlord Bot - buys Duchy
+Warlord Bot - gains Duchy
+Warlord Bot - draws Province, Silver
+Warlord Bot - shuffles deck
+Warlord Bot - draws Gold, Silver, Counterfeit
+ 
+---------- treetop70: turn 22 ----------
+treetop70 - plays Death Cart
+treetop70 - trashes Death Cart
+treetop70 - plays 2 Gold
+treetop70 - buys Colony
+treetop70 - gains Colony
+treetop70 - shuffles deck
+treetop70 - draws Province, Colony, Colony, Province, Counterfeit
+ 
+---------- Warlord Bot: turn 22 ----------
+Warlord Bot - plays Counterfeit
+Warlord Bot - plays 2 Silver, 1 Gold
+Warlord Bot - buys Province
+Warlord Bot - gains Province
+Warlord Bot - draws Cellar, Copper, Estate, Estate, Cutpurse
+ 
+---------- treetop70: turn 23 ----------
+treetop70 - draws Estate, Forge, Gold, Copper, Province
+ 
+---------- Warlord Bot: turn 23 ----------
+Warlord Bot - plays Cellar
+Warlord Bot - discards Estate
+Warlord Bot - discards Estate
+Warlord Bot - discards Copper
+Warlord Bot - draws Copper, Gold, Death Cart
+Warlord Bot - plays Cutpurse
+treetop70 - discards Copper
+Warlord Bot - plays 1 Copper, 1 Gold
+Warlord Bot - buys Duchy
+Warlord Bot - gains Duchy
+Warlord Bot - draws Colony, Duchy, Death Cart, Pirate Ship, Duchy
+ 
+---------- treetop70: turn 24 ----------
+treetop70 - plays Forge
+treetop70 - trashes Gold, Estate
+treetop70 - gains Province
+treetop70 - draws Gold, Death Cart, Province, Bureaucrat, Gold
+ 
+---------- Warlord Bot: turn 24 ----------
+Warlord Bot - plays Pirate Ship
+treetop70 - shuffles deck
+treetop70 - reveals Counterfeit, Colony
+Warlord Bot - trashes Counterfeit
+treetop70 - discards Colony
+Warlord Bot - receives a pirate coin, now has 4 pirate coin(s)
+Warlord Bot - draws Estate, Gold, Estate, Copper, Abandoned Mine
+ 
+---------- treetop70: turn 25 ----------
+treetop70 - plays Death Cart
+treetop70 - trashes Bureaucrat
+treetop70 - plays 2 Gold
+treetop70 - buys Colony
+treetop70 - gains Colony
+treetop70 - draws Copper, Province, Province, Province, Colony
+ 
+---------- Warlord Bot: turn 25 ----------
+Warlord Bot - plays Abandoned Mine
+Warlord Bot - plays 1 Gold, 1 Copper
+Warlord Bot - buys Duchy
+Warlord Bot - gains Duchy
+Warlord Bot - draws Gold
+Warlord Bot - shuffles deck
+Warlord Bot - draws Gold, Counterfeit, Estate, Duchy
+ 
+---------- treetop70: turn 26 ----------
+treetop70 - draws Forge, Province
+treetop70 - shuffles deck
+treetop70 - draws Province, Colony, Copper
+ 
+---------- Warlord Bot: turn 26 ----------
+Warlord Bot - plays Counterfeit
+Warlord Bot - plays Gold
+Warlord Bot - plays Gold
+Warlord Bot - trashes Gold
+Warlord Bot - plays 1 Gold
+Warlord Bot - buys Duchy
+Warlord Bot - gains Duchy
+Warlord Bot - buys Duchy
+Warlord Bot - gains Duchy
+Warlord Bot - draws Province, Cutpurse, Province, Death Cart, Duchy
+ 
+---------- treetop70: turn 27 ----------
+treetop70 - plays Forge
+treetop70 - trashes Colony, Copper
+treetop70 - gains Colony
+treetop70 - draws Gold, Province, Province, Province, Colony
+ 
+---------- Warlord Bot: turn 27 ----------
+Warlord Bot - plays Cutpurse
+treetop70 - reveals Gold, Province, Province, Province, Colony
+Warlord Bot - buys Estate
+Warlord Bot - gains Estate
+Warlord Bot - draws Pirate Ship, Estate, Duchy, Estate, Gold
+ 
+---------- treetop70: turn 28 ----------
+treetop70 - plays 1 Gold
+treetop70 - buys Estate
+treetop70 - gains Estate
+treetop70 - draws Colony, Gold, Death Cart
+treetop70 - shuffles deck
+treetop70 - draws Province, Colony
+ 
+---------- Warlord Bot: turn 28 ----------
+Warlord Bot - plays Pirate Ship
+Warlord Bot - takes 4 coins
+Warlord Bot - plays 1 Gold
+Warlord Bot - buys Duchy
+Warlord Bot - gains Duchy
+Warlord Bot - draws Copper, Abandoned Mine, Silver, Colony, Cellar
+ 
+---------- treetop70: turn 29 ----------
+treetop70 - plays Death Cart
+treetop70 - trashes Death Cart
+treetop70 - plays 1 Gold
+treetop70 - buys Province
+treetop70 - gains Province
+treetop70 - draws Province, Province, Colony, Province, Estate
+ 
+------------ Game Over ------------
+treetop70 - cards: 1 Forge, 2 Gold, 6 Province, 3 Colony, 1 Estate
+treetop70 - total victory points: 67
+treetop70 - turns: 29
+ 
+Warlord Bot - cards: 2 Death Cart, 1 Pirate Ship, 1 Cutpurse, 1 Cellar, 1 Abandoned Mine, 3 Gold, 3 Copper, 2 Silver, 1 Counterfeit, 7 Duchy, 5 Estate, 2 Province, 1 Colony
+Warlord Bot - total victory points: 48
+Warlord Bot - turns: 28
+ 
+1st place: treetop70
+2nd place: Warlord Bot
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.512c1423e4b0feac797beef6.1364833567277.txt b/testing/testdata/log.512c1423e4b0feac797beef6.1364833567277.txt
new file mode 100644
index 0000000..8512017
--- /dev/null
+++ b/testing/testdata/log.512c1423e4b0feac797beef6.1364833567277.txt
@@ -0,0 +1,271 @@
+------------ Game Setup ------------
+Supply cards: Fool's Gold, Woodcutter, Salvager, Smithy, Spice Merchant, Trader, Cache, Explorer, Festival, Hoard, Copper, Silver, Gold, Estate, Duchy, Province, Curse
+Dalton Alvis - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+KingZog3 - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Dalton Alvis - shuffles deck
+KingZog3 - shuffles deck
+Dalton Alvis - draws Copper, Copper, Estate, Copper, Copper
+KingZog3 - draws Estate, Estate, Copper, Copper, Copper
+ 
+---------- KingZog3: turn 1 ----------
+KingZog3 - plays 3 Copper
+KingZog3 - buys Silver
+KingZog3 - gains Silver
+KingZog3 - draws Copper, Copper, Copper, Copper, Estate
+ 
+---------- Dalton Alvis: turn 1 ----------
+Dalton Alvis - plays 4 Copper
+Dalton Alvis - buys Trader
+Dalton Alvis - gains Trader
+Dalton Alvis - draws Estate, Copper, Estate, Copper, Copper
+ 
+---------- KingZog3: turn 2 ----------
+KingZog3 - plays 4 Copper
+KingZog3 - buys Spice Merchant
+KingZog3 - gains Spice Merchant
+KingZog3 - shuffles deck
+KingZog3 - draws Copper, Copper, Silver, Estate, Copper
+ 
+---------- Dalton Alvis: turn 2 ----------
+Dalton Alvis - plays 3 Copper
+Dalton Alvis - buys Silver
+Dalton Alvis - gains Silver
+Dalton Alvis - shuffles deck
+Dalton Alvis - draws Copper, Estate, Copper, Silver, Copper
+ 
+---------- KingZog3: turn 3 ----------
+KingZog3 - plays 3 Copper, 1 Silver
+KingZog3 - buys Cache
+KingZog3 - gains Cache
+KingZog3 - gains Copper
+KingZog3 - gains Copper
+KingZog3 - draws Copper, Copper, Estate, Spice Merchant, Estate
+ 
+---------- Dalton Alvis: turn 3 ----------
+Dalton Alvis - plays 3 Copper, 1 Silver
+Dalton Alvis - buys Explorer
+Dalton Alvis - gains Explorer
+Dalton Alvis - draws Copper, Estate, Copper, Trader, Copper
+ 
+---------- KingZog3: turn 4 ----------
+KingZog3 - plays Spice Merchant
+KingZog3 - trashes Copper
+KingZog3 - chooses two cards and one action
+KingZog3 - draws Copper, Copper
+KingZog3 - plays 3 Copper
+KingZog3 - buys Silver
+KingZog3 - gains Silver
+KingZog3 - shuffles deck
+KingZog3 - draws Copper, Copper, Estate, Spice Merchant, Estate
+ 
+---------- Dalton Alvis: turn 4 ----------
+Dalton Alvis - plays Trader
+Dalton Alvis - trashes Estate
+Dalton Alvis - gains Silver
+Dalton Alvis - gains Silver
+Dalton Alvis - plays 3 Copper
+Dalton Alvis - buys Silver
+Dalton Alvis - gains Silver
+Dalton Alvis - draws Estate, Copper
+Dalton Alvis - shuffles deck
+Dalton Alvis - draws Silver, Copper, Trader
+ 
+---------- KingZog3: turn 5 ----------
+KingZog3 - plays Spice Merchant
+KingZog3 - trashes Copper
+KingZog3 - chooses two cards and one action
+KingZog3 - draws Silver, Copper
+KingZog3 - plays 2 Copper, 1 Silver
+KingZog3 - buys Spice Merchant
+KingZog3 - gains Spice Merchant
+KingZog3 - draws Copper, Estate, Copper, Silver, Cache
+ 
+---------- Dalton Alvis: turn 5 ----------
+Dalton Alvis - plays Trader
+Dalton Alvis - trashes Estate
+Dalton Alvis - gains Silver
+Dalton Alvis - gains Silver
+Dalton Alvis - plays 2 Copper, 1 Silver
+Dalton Alvis - buys Spice Merchant
+Dalton Alvis - gains Spice Merchant
+Dalton Alvis - draws Copper, Silver, Copper, Copper, Estate
+ 
+---------- KingZog3: turn 6 ----------
+KingZog3 - plays 2 Copper, 1 Silver, 1 Cache
+KingZog3 - buys Hoard
+KingZog3 - gains Hoard
+KingZog3 - draws Copper, Copper, Copper
+KingZog3 - shuffles deck
+KingZog3 - draws Estate, Copper
+ 
+---------- Dalton Alvis: turn 6 ----------
+Dalton Alvis - plays 3 Copper, 1 Silver
+Dalton Alvis - buys Festival
+Dalton Alvis - gains Festival
+Dalton Alvis - draws Explorer, Copper, Copper, Silver, Silver
+ 
+---------- KingZog3: turn 7 ----------
+KingZog3 - plays 4 Copper
+KingZog3 - buys Smithy
+KingZog3 - gains Smithy
+KingZog3 - draws Copper, Estate, Cache, Hoard, Silver
+ 
+---------- Dalton Alvis: turn 7 ----------
+Dalton Alvis - plays Explorer
+Dalton Alvis - gains Silver
+Dalton Alvis - plays 3 Silver, 2 Copper
+Dalton Alvis - buys Province
+Dalton Alvis - gains Province
+Dalton Alvis - shuffles deck
+Dalton Alvis - draws Silver, Explorer, Copper, Silver, Silver
+ 
+---------- KingZog3: turn 8 ----------
+KingZog3 - plays 1 Copper, 1 Cache, 1 Silver
+KingZog3 - plays Hoard
+KingZog3 - buys Province
+KingZog3 - gains Gold
+KingZog3 - gains Province
+KingZog3 - draws Copper, Spice Merchant, Estate, Silver, Spice Merchant
+ 
+---------- Dalton Alvis: turn 8 ----------
+Dalton Alvis - plays Explorer
+Dalton Alvis - gains Silver
+Dalton Alvis - plays 4 Silver, 1 Copper
+Dalton Alvis - buys Province
+Dalton Alvis - gains Province
+Dalton Alvis - draws Trader, Copper, Copper, Copper, Silver
+ 
+---------- KingZog3: turn 9 ----------
+KingZog3 - plays Spice Merchant
+KingZog3 - trashes Copper
+KingZog3 - chooses two cards and one action
+KingZog3 - draws Copper
+KingZog3 - shuffles deck
+KingZog3 - draws Gold
+KingZog3 - plays Spice Merchant
+KingZog3 - trashes Copper
+KingZog3 - chooses two cards and one action
+KingZog3 - draws Smithy, Copper
+KingZog3 - plays Smithy
+KingZog3 - draws Copper, Copper, Hoard
+KingZog3 - plays 3 Copper, 1 Silver, 1 Gold
+KingZog3 - plays Hoard
+KingZog3 - buys Province
+KingZog3 - gains Gold
+KingZog3 - gains Province
+KingZog3 - draws Copper, Silver, Estate, Estate, Province
+ 
+---------- Dalton Alvis: turn 9 ----------
+Dalton Alvis - plays 3 Copper, 1 Silver
+Dalton Alvis - buys Cache
+Dalton Alvis - gains Cache
+Dalton Alvis - reveals reaction Trader
+Dalton Alvis - gains Silver
+Dalton Alvis - reveals reaction Trader
+Dalton Alvis - gains Silver
+Dalton Alvis - draws Silver, Festival, Silver, Estate, Copper
+ 
+---------- KingZog3: turn 10 ----------
+KingZog3 - plays 1 Copper, 1 Silver
+KingZog3 - buys Estate
+KingZog3 - gains Estate
+KingZog3 - draws Copper, Cache
+KingZog3 - shuffles deck
+KingZog3 - draws Estate, Copper, Spice Merchant
+ 
+---------- Dalton Alvis: turn 10 ----------
+Dalton Alvis - plays Festival
+Dalton Alvis - plays 2 Silver, 1 Copper
+Dalton Alvis - buys Hoard
+Dalton Alvis - gains Hoard
+Dalton Alvis - draws Silver, Copper, Province, Copper, Spice Merchant
+ 
+---------- KingZog3: turn 11 ----------
+KingZog3 - plays Spice Merchant
+KingZog3 - trashes Copper
+KingZog3 - chooses two cards and one action
+KingZog3 - draws Copper, Copper
+KingZog3 - plays 3 Copper, 1 Cache
+KingZog3 - buys Duchy
+KingZog3 - gains Duchy
+KingZog3 - draws Province, Estate, Estate, Silver, Province
+ 
+---------- Dalton Alvis: turn 11 ----------
+Dalton Alvis - plays Spice Merchant
+Dalton Alvis - trashes Copper
+Dalton Alvis - chooses two coins and one buy
+Dalton Alvis - plays 1 Silver, 1 Copper
+Dalton Alvis - buys Duchy
+Dalton Alvis - gains Duchy
+Dalton Alvis - shuffles deck
+Dalton Alvis - draws Silver, Silver, Silver, Copper, Festival
+ 
+---------- KingZog3: turn 12 ----------
+KingZog3 - plays 1 Silver
+KingZog3 - buys Estate
+KingZog3 - gains Estate
+KingZog3 - draws Spice Merchant, Silver, Gold, Estate, Smithy
+ 
+---------- Dalton Alvis: turn 12 ----------
+Dalton Alvis - plays Festival
+Dalton Alvis - plays 3 Silver, 1 Copper
+Dalton Alvis - buys Province
+Dalton Alvis - gains Province
+Dalton Alvis - draws Copper, Silver, Spice Merchant, Province, Silver
+ 
+---------- KingZog3: turn 13 ----------
+KingZog3 - plays Smithy
+KingZog3 - draws Gold, Copper, Hoard
+KingZog3 - plays 2 Gold, 1 Silver, 1 Copper
+KingZog3 - plays Hoard
+KingZog3 - buys Province
+KingZog3 - gains Gold
+KingZog3 - gains Province
+KingZog3 - shuffles deck
+KingZog3 - draws Estate, Estate, Gold, Gold, Estate
+ 
+---------- Dalton Alvis: turn 13 ----------
+Dalton Alvis - plays Spice Merchant
+Dalton Alvis - trashes Copper
+Dalton Alvis - chooses two coins and one buy
+Dalton Alvis - plays 2 Silver
+Dalton Alvis - buys Duchy
+Dalton Alvis - gains Duchy
+Dalton Alvis - draws Copper, Silver, Silver, Hoard, Silver
+ 
+---------- KingZog3: turn 14 ----------
+KingZog3 - plays 2 Gold
+KingZog3 - buys Duchy
+KingZog3 - gains Duchy
+KingZog3 - draws Gold, Spice Merchant, Province, Smithy, Province
+ 
+---------- Dalton Alvis: turn 14 ----------
+Dalton Alvis - plays 3 Silver, 1 Copper
+Dalton Alvis - plays Hoard
+Dalton Alvis - buys Province
+Dalton Alvis - gains Gold
+Dalton Alvis - gains Province
+Dalton Alvis - draws Copper, Duchy, Trader, Silver, Copper
+ 
+---------- KingZog3: turn 15 ----------
+KingZog3 - plays Smithy
+KingZog3 - draws Hoard, Estate, Cache
+KingZog3 - plays 1 Gold, 1 Cache
+KingZog3 - plays Hoard
+KingZog3 - buys Province
+KingZog3 - gains Gold
+KingZog3 - gains Province
+KingZog3 - draws Province, Spice Merchant, Copper, Silver, Silver
+ 
+------------ Game Over ------------
+KingZog3 - cards: 2 Spice Merchant, 1 Smithy, 4 Copper, 4 Gold, 2 Silver, 1 Cache, 1 Hoard, 5 Estate, 4 Province, 2 Duchy
+KingZog3 - total victory points: 35
+KingZog3 - turns: 15
+ 
+Dalton Alvis - cards: 1 Spice Merchant, 1 Explorer, 1 Trader, 10 Silver, 1 Festival, 5 Copper, 1 Gold, 1 Hoard, 1 Cache, 4 Province, 2 Duchy, 1 Estate
+Dalton Alvis - total victory points: 31
+Dalton Alvis - turns: 14
+ 
+1st place: KingZog3
+2nd place: Dalton Alvis
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.512c5679e4b0feac797bf37f.1364868216483.txt b/testing/testdata/log.512c5679e4b0feac797bf37f.1364868216483.txt
new file mode 100644
index 0000000..d379099
--- /dev/null
+++ b/testing/testdata/log.512c5679e4b0feac797bf37f.1364868216483.txt
@@ -0,0 +1,622 @@
+------------ Game Setup ------------
+Supply cards: Steward, Bishop, Feodum, Mining Village, Noble Brigand, Nomad Camp, Quarry, Band of Misfits, Catacombs, Contraband, Copper, Silver, Gold, Estate, Duchy, Province, Curse
+dannycadence - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Banker Bot - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+dannycadence - shuffles deck
+Banker Bot - shuffles deck
+dannycadence - draws Estate, Copper, Copper, Estate, Copper
+Banker Bot - draws Copper, Copper, Copper, Copper, Copper
+ 
+---------- Banker Bot: turn 1 ----------
+Banker Bot - plays 5 Copper
+Banker Bot - buys Contraband
+Banker Bot - gains Contraband
+Banker Bot - draws Estate, Copper, Estate, Estate, Copper
+ 
+---------- dannycadence: turn 1 ----------
+dannycadence - plays 3 Copper
+dannycadence - buys Steward
+dannycadence - gains Steward
+dannycadence - draws Estate, Copper, Copper, Copper, Copper
+ 
+---------- Banker Bot: turn 2 ----------
+Banker Bot - plays 2 Copper
+Banker Bot - shuffles deck
+Banker Bot - draws Estate, Copper, Estate, Copper, Copper
+ 
+---------- dannycadence: turn 2 ----------
+dannycadence - plays 4 Copper
+dannycadence - buys Nomad Camp
+dannycadence - gains Nomad Camp
+dannycadence - draws Nomad Camp
+dannycadence - shuffles deck
+dannycadence - draws Copper, Estate, Copper, Estate
+ 
+---------- Banker Bot: turn 3 ----------
+Banker Bot - plays 3 Copper
+Banker Bot - buys Steward
+Banker Bot - gains Steward
+Banker Bot - draws Estate, Copper, Copper, Copper, Contraband
+ 
+---------- dannycadence: turn 3 ----------
+dannycadence - plays Nomad Camp
+dannycadence - plays 2 Copper
+dannycadence - buys Mining Village
+dannycadence - gains Mining Village
+dannycadence - draws Copper, Copper, Copper, Copper, Estate
+ 
+---------- Banker Bot: turn 4 ----------
+Banker Bot - plays Contraband
+dannycadence - names Gold as contraband
+Banker Bot - plays 3 Copper
+Banker Bot - buys Silver
+Banker Bot - gains Silver
+Banker Bot - buys Silver
+Banker Bot - gains Silver
+Banker Bot - draws Copper
+Banker Bot - shuffles deck
+Banker Bot - draws Copper, Estate, Copper, Estate
+ 
+---------- dannycadence: turn 4 ----------
+dannycadence - plays 4 Copper
+dannycadence - buys Bishop
+dannycadence - gains Bishop
+dannycadence - draws Copper, Steward
+dannycadence - shuffles deck
+dannycadence - draws Copper, Copper, Copper
+ 
+---------- Banker Bot: turn 5 ----------
+Banker Bot - plays 3 Copper
+Banker Bot - buys Silver
+Banker Bot - gains Silver
+Banker Bot - draws Steward, Silver, Copper, Contraband, Copper
+ 
+---------- dannycadence: turn 5 ----------
+dannycadence - plays Steward
+dannycadence - takes 2 coins
+dannycadence - plays 4 Copper
+dannycadence - buys Gold
+dannycadence - gains Gold
+dannycadence - draws Copper, Estate, Copper, Mining Village, Estate
+ 
+---------- Banker Bot: turn 6 ----------
+Banker Bot - plays Steward
+Banker Bot - trashes Copper, Copper
+Banker Bot - plays Contraband
+dannycadence - names Gold as contraband
+Banker Bot - plays 1 Silver
+Banker Bot - buys Contraband
+Banker Bot - gains Contraband
+Banker Bot - draws Copper, Copper, Silver, Estate
+Banker Bot - shuffles deck
+Banker Bot - draws Copper
+ 
+---------- dannycadence: turn 6 ----------
+dannycadence - plays Mining Village
+dannycadence - draws Nomad Camp
+dannycadence - plays Nomad Camp
+dannycadence - plays 2 Copper
+dannycadence - buys Mining Village
+dannycadence - gains Mining Village
+dannycadence - draws Bishop, Estate, Copper
+dannycadence - shuffles deck
+dannycadence - draws Copper, Copper
+ 
+---------- Banker Bot: turn 7 ----------
+Banker Bot - plays 3 Copper, 1 Silver
+Banker Bot - buys Contraband
+Banker Bot - gains Contraband
+Banker Bot - draws Copper, Estate, Silver, Copper, Silver
+ 
+---------- dannycadence: turn 7 ----------
+dannycadence - plays Bishop
+dannycadence - trashes Estate
+dannycadence - receives 1 victory point chips
+Banker Bot - trashes Copper
+dannycadence - plays 3 Copper
+dannycadence - buys Quarry
+dannycadence - gains Quarry
+dannycadence - draws Estate, Steward, Copper, Mining Village, Gold
+ 
+---------- Banker Bot: turn 8 ----------
+Banker Bot - plays 2 Silver, 1 Copper
+Banker Bot - buys Contraband
+Banker Bot - gains Contraband
+Banker Bot - draws Contraband, Steward, Contraband, Estate
+Banker Bot - shuffles deck
+Banker Bot - draws Estate
+ 
+---------- dannycadence: turn 8 ----------
+dannycadence - plays Mining Village
+dannycadence - draws Copper
+dannycadence - plays Steward
+dannycadence - takes 2 coins
+dannycadence - plays 2 Copper, 1 Gold
+dannycadence - buys Gold
+dannycadence - gains Gold
+dannycadence - draws Mining Village, Copper, Copper, Nomad Camp, Estate
+ 
+---------- Banker Bot: turn 9 ----------
+Banker Bot - plays Steward
+Banker Bot - trashes Estate, Estate
+Banker Bot - plays Contraband
+dannycadence - names Gold as contraband
+Banker Bot - plays Contraband
+dannycadence - names Province as contraband
+Banker Bot - buys Silver
+Banker Bot - gains Silver
+Banker Bot - buys Silver
+Banker Bot - gains Silver
+Banker Bot - draws Silver, Contraband, Copper, Silver, Silver
+ 
+---------- dannycadence: turn 9 ----------
+dannycadence - plays Mining Village
+dannycadence - shuffles deck
+dannycadence - draws Copper
+dannycadence - plays Nomad Camp
+dannycadence - plays 3 Copper
+dannycadence - buys Catacombs
+dannycadence - gains Catacombs
+dannycadence - draws Quarry, Estate, Gold, Copper, Copper
+ 
+---------- Banker Bot: turn 10 ----------
+Banker Bot - plays Contraband
+dannycadence - names Gold as contraband
+Banker Bot - plays 3 Silver, 1 Copper
+Banker Bot - buys Contraband
+Banker Bot - gains Contraband
+Banker Bot - buys Contraband
+Banker Bot - gains Contraband
+Banker Bot - draws Copper, Copper, Copper, Estate, Contraband
+ 
+---------- dannycadence: turn 10 ----------
+dannycadence - plays 2 Copper, 1 Gold
+dannycadence - plays Quarry
+dannycadence - buys Gold
+dannycadence - gains Gold
+dannycadence - draws Copper, Mining Village, Steward, Gold, Bishop
+ 
+---------- Banker Bot: turn 11 ----------
+Banker Bot - plays Contraband
+dannycadence - names Gold as contraband
+Banker Bot - plays 3 Copper
+Banker Bot - buys Contraband
+Banker Bot - gains Contraband
+Banker Bot - shuffles deck
+Banker Bot - draws Copper, Silver, Silver, Contraband, Copper
+ 
+---------- dannycadence: turn 11 ----------
+dannycadence - plays Mining Village
+dannycadence - draws Copper
+dannycadence - plays Steward
+dannycadence - takes 2 coins
+dannycadence - plays Bishop
+dannycadence - trashes Copper
+dannycadence - receives 0 victory point chips
+Banker Bot - trashes Copper
+dannycadence - plays 1 Copper, 1 Gold
+dannycadence - buys Gold
+dannycadence - gains Gold
+dannycadence - shuffles deck
+dannycadence - draws Quarry, Estate, Nomad Camp, Copper, Copper
+ 
+---------- Banker Bot: turn 12 ----------
+Banker Bot - plays Contraband
+dannycadence - names Province as contraband
+Banker Bot - plays 2 Silver, 1 Copper
+Banker Bot - buys Contraband
+Banker Bot - gains Contraband
+Banker Bot - buys Silver
+Banker Bot - gains Silver
+Banker Bot - draws Silver, Silver, Contraband, Silver, Copper
+ 
+---------- dannycadence: turn 12 ----------
+dannycadence - plays Nomad Camp
+dannycadence - plays 2 Copper
+dannycadence - plays Quarry
+dannycadence - buys Band of Misfits
+dannycadence - gains Band of Misfits
+dannycadence - buys Mining Village
+dannycadence - gains Mining Village
+dannycadence - draws Mining Village, Mining Village, Copper, Copper, Gold
+ 
+---------- Banker Bot: turn 13 ----------
+Banker Bot - plays Contraband
+dannycadence - names Gold as contraband
+Banker Bot - plays 3 Silver, 1 Copper
+Banker Bot - buys Contraband
+Banker Bot - gains Contraband
+Banker Bot - buys Contraband
+Banker Bot - gains Contraband
+Banker Bot - draws Contraband, Contraband, Contraband, Copper, Steward
+ 
+---------- dannycadence: turn 13 ----------
+dannycadence - plays Mining Village
+dannycadence - draws Bishop
+dannycadence - plays Mining Village
+dannycadence - draws Steward
+dannycadence - plays Steward
+dannycadence - draws Estate, Catacombs
+dannycadence - plays Catacombs
+dannycadence - looks at Gold, Copper, Copper
+dannycadence - places cards in hand:  Gold, Copper, Copper
+dannycadence - plays Bishop
+dannycadence - trashes Estate
+dannycadence - receives 1 victory point chips
+Banker Bot - trashes Copper
+dannycadence - plays 4 Copper, 2 Gold
+dannycadence - buys Province
+dannycadence - gains Province
+dannycadence - draws Gold, Gold
+dannycadence - shuffles deck
+dannycadence - draws Steward, Copper, Province
+ 
+---------- Banker Bot: turn 14 ----------
+Banker Bot - plays Steward
+Banker Bot - takes 2 coins
+Banker Bot - plays Contraband
+dannycadence - names Province as contraband
+Banker Bot - plays Contraband
+dannycadence - names Duchy as contraband
+Banker Bot - plays Contraband
+dannycadence - names Gold as contraband
+Banker Bot - buys Band of Misfits
+Banker Bot - gains Band of Misfits
+Banker Bot - buys Band of Misfits
+Banker Bot - gains Band of Misfits
+Banker Bot - draws Contraband, Contraband, Estate
+Banker Bot - shuffles deck
+Banker Bot - draws Silver, Contraband
+ 
+---------- dannycadence: turn 14 ----------
+dannycadence - plays Steward
+dannycadence - takes 2 coins
+dannycadence - plays 2 Gold, 1 Copper
+dannycadence - buys Province
+dannycadence - gains Province
+dannycadence - draws Quarry, Band of Misfits, Copper, Gold, Mining Village
+ 
+---------- Banker Bot: turn 15 ----------
+Banker Bot - plays Contraband
+dannycadence - names Province as contraband
+Banker Bot - plays Contraband
+dannycadence - names Duchy as contraband
+Banker Bot - plays Contraband
+dannycadence - names Gold as contraband
+Banker Bot - plays 1 Silver
+Banker Bot - buys Band of Misfits
+Banker Bot - gains Band of Misfits
+Banker Bot - buys Band of Misfits
+Banker Bot - gains Band of Misfits
+Banker Bot - draws Contraband, Silver, Contraband, Contraband, Contraband
+ 
+---------- dannycadence: turn 15 ----------
+dannycadence - plays Mining Village
+dannycadence - draws Mining Village
+dannycadence - plays Mining Village
+dannycadence - draws Copper
+dannycadence - plays Band of Misfits
+dannycadence - chooses Steward
+dannycadence - plays Steward
+dannycadence - takes 2 coins
+dannycadence - plays 2 Copper, 1 Gold
+dannycadence - plays Quarry
+dannycadence - buys Province
+dannycadence - gains Province
+dannycadence - draws Nomad Camp, Copper, Estate, Mining Village, Copper
+ 
+---------- Banker Bot: turn 16 ----------
+Banker Bot - plays Contraband
+dannycadence - names Province as contraband
+Banker Bot - plays Contraband
+dannycadence - names Duchy as contraband
+Banker Bot - plays Contraband
+dannycadence - names Gold as contraband
+Banker Bot - plays Contraband
+dannycadence - names Feodum as contraband
+Banker Bot - plays 1 Silver
+Banker Bot - buys Band of Misfits
+Banker Bot - gains Band of Misfits
+Banker Bot - buys Band of Misfits
+Banker Bot - gains Band of Misfits
+Banker Bot - buys Noble Brigand
+dannycadence - reveals: Gold, Catacombs
+Banker Bot - trashes Gold
+dannycadence - discards Catacombs
+Banker Bot - gains Gold
+Banker Bot - gains Noble Brigand
+Banker Bot - draws Contraband, Copper, Band of Misfits, Steward, Contraband
+ 
+---------- dannycadence: turn 16 ----------
+dannycadence - plays Mining Village
+dannycadence - draws Bishop
+dannycadence - plays Bishop
+dannycadence - trashes Estate
+dannycadence - receives 1 victory point chips
+Banker Bot - trashes Copper
+dannycadence - plays Nomad Camp
+dannycadence - plays 2 Copper
+dannycadence - buys Duchy
+dannycadence - gains Duchy
+dannycadence - draws Copper
+dannycadence - shuffles deck
+dannycadence - draws Province, Catacombs, Copper, Copper
+ 
+---------- Banker Bot: turn 17 ----------
+Banker Bot - plays Band of Misfits
+Banker Bot - chooses Nomad Camp
+Banker Bot - plays Nomad Camp
+Banker Bot - plays Contraband
+dannycadence - names Province as contraband
+Banker Bot - plays Contraband
+dannycadence - names Duchy as contraband
+Banker Bot - buys Mining Village
+Banker Bot - gains Mining Village
+Banker Bot - buys Feodum
+Banker Bot - gains Feodum
+Banker Bot - draws Copper, Silver, Band of Misfits, Silver, Silver
+ 
+---------- dannycadence: turn 17 ----------
+dannycadence - plays Catacombs
+dannycadence - looks at Duchy, Nomad Camp, Copper
+dannycadence - discards: Duchy, Nomad Camp, Copper
+dannycadence - draws Gold, Quarry, Copper
+dannycadence - plays 4 Copper, 1 Gold
+dannycadence - plays Quarry
+dannycadence - buys Province
+dannycadence - gains Province
+dannycadence - draws Bishop, Province, Province, Band of Misfits, Copper
+ 
+---------- Banker Bot: turn 18 ----------
+Banker Bot - plays Band of Misfits
+Banker Bot - chooses Nomad Camp
+Banker Bot - plays Nomad Camp
+Banker Bot - plays 3 Silver, 1 Copper
+Banker Bot - buys Province
+Banker Bot - gains Province
+Banker Bot - draws Silver, Contraband
+Banker Bot - shuffles deck
+Banker Bot - draws Province, Silver, Contraband
+ 
+---------- dannycadence: turn 18 ----------
+dannycadence - plays Band of Misfits
+dannycadence - chooses Mining Village
+dannycadence - plays Mining Village
+dannycadence - draws Mining Village
+dannycadence - plays Mining Village
+dannycadence - draws Gold
+dannycadence - plays Bishop
+dannycadence - trashes Province
+dannycadence - receives 4 victory point chips
+dannycadence - plays 1 Copper, 1 Gold
+dannycadence - buys Duchy
+dannycadence - gains Duchy
+dannycadence - draws Gold, Mining Village, Steward, Mining Village
+dannycadence - shuffles deck
+dannycadence - draws Province
+ 
+---------- Banker Bot: turn 19 ----------
+Banker Bot - plays Contraband
+dannycadence - names Province as contraband
+Banker Bot - plays Contraband
+dannycadence - names Duchy as contraband
+Banker Bot - plays 2 Silver
+Banker Bot - buys Feodum
+Banker Bot - gains Feodum
+Banker Bot - buys Silver
+Banker Bot - gains Silver
+Banker Bot - buys Silver
+Banker Bot - gains Silver
+Banker Bot - draws Copper, Feodum, Silver, Contraband, Noble Brigand
+ 
+---------- dannycadence: turn 19 ----------
+dannycadence - plays Mining Village
+dannycadence - draws Quarry
+dannycadence - plays Mining Village
+dannycadence - draws Copper
+dannycadence - plays Steward
+dannycadence - draws Province, Copper
+dannycadence - plays 2 Copper, 1 Gold
+dannycadence - buys Duchy
+dannycadence - gains Duchy
+dannycadence - draws Gold, Copper, Copper, Mining Village, Bishop
+ 
+---------- Banker Bot: turn 20 ----------
+Banker Bot - plays Noble Brigand
+dannycadence - reveals: Copper, Copper
+dannycadence - discards: Copper, Copper
+Banker Bot - plays Contraband
+dannycadence - names Province as contraband
+Banker Bot - plays 1 Copper, 1 Silver
+Banker Bot - buys Feodum
+Banker Bot - gains Feodum
+Banker Bot - buys Silver
+Banker Bot - gains Silver
+Banker Bot - draws Band of Misfits, Band of Misfits, Estate, Gold, Contraband
+ 
+---------- dannycadence: turn 20 ----------
+dannycadence - plays Mining Village
+dannycadence - draws Duchy
+dannycadence - plays Bishop
+dannycadence - trashes Duchy
+dannycadence - receives 2 victory point chips
+dannycadence - plays 2 Copper, 1 Gold
+dannycadence - buys Duchy
+dannycadence - gains Duchy
+dannycadence - draws Duchy, Catacombs, Province, Gold, Band of Misfits
+ 
+---------- Banker Bot: turn 21 ----------
+Banker Bot - plays Band of Misfits
+Banker Bot - chooses Nomad Camp
+Banker Bot - plays Nomad Camp
+Banker Bot - plays Contraband
+dannycadence - names Province as contraband
+Banker Bot - plays 1 Gold
+Banker Bot - buys Feodum
+Banker Bot - gains Feodum
+Banker Bot - buys Feodum
+Banker Bot - gains Feodum
+Banker Bot - draws Band of Misfits, Silver, Steward, Contraband, Silver
+ 
+---------- dannycadence: turn 21 ----------
+dannycadence - plays Band of Misfits
+dannycadence - chooses Mining Village
+dannycadence - plays Mining Village
+dannycadence - draws Nomad Camp
+dannycadence - plays Catacombs
+dannycadence - shuffles deck
+dannycadence - looks at Copper, Province, Gold
+dannycadence - places cards in hand:  Copper, Province, Gold
+dannycadence - plays Nomad Camp
+dannycadence - plays 2 Gold, 1 Copper
+dannycadence - buys Province
+dannycadence - gains Province
+dannycadence - draws Copper, Mining Village, Copper, Copper, Quarry
+ 
+---------- Banker Bot: turn 22 ----------
+Banker Bot - plays Band of Misfits
+Banker Bot - chooses Nomad Camp
+Banker Bot - plays Nomad Camp
+Banker Bot - plays Contraband
+dannycadence - names Province as contraband
+Banker Bot - plays 2 Silver
+Banker Bot - buys Feodum
+Banker Bot - gains Feodum
+Banker Bot - buys Feodum
+Banker Bot - gains Feodum
+Banker Bot - draws Contraband, Band of Misfits, Contraband, Contraband, Band of Misfits
+ 
+---------- dannycadence: turn 22 ----------
+dannycadence - plays Mining Village
+dannycadence - draws Mining Village
+dannycadence - plays Mining Village
+dannycadence - draws Bishop
+dannycadence - plays Bishop
+dannycadence - trashes Quarry
+dannycadence - receives 2 victory point chips
+dannycadence - plays 3 Copper
+dannycadence - buys Feodum
+dannycadence - gains Feodum
+dannycadence - draws Copper, Mining Village, Copper, Steward, Gold
+ 
+---------- Banker Bot: turn 23 ----------
+Banker Bot - plays Band of Misfits
+Banker Bot - chooses Nomad Camp
+Banker Bot - plays Nomad Camp
+Banker Bot - plays Contraband
+dannycadence - names Province as contraband
+Banker Bot - plays Contraband
+dannycadence - names Duchy as contraband
+Banker Bot - plays Contraband
+dannycadence - names Silver as contraband
+Banker Bot - buys Estate
+Banker Bot - gains Estate
+Banker Bot - buys Estate
+Banker Bot - gains Estate
+Banker Bot - buys Estate
+Banker Bot - gains Estate
+Banker Bot - buys Estate
+Banker Bot - gains Estate
+Banker Bot - buys Estate
+Banker Bot - gains Estate
+Banker Bot - draws Contraband, Band of Misfits, Contraband, Mining Village, Silver
+ 
+---------- dannycadence: turn 23 ----------
+dannycadence - plays Mining Village
+dannycadence - draws Duchy
+dannycadence - plays Steward
+dannycadence - draws Province, Duchy
+dannycadence - plays 2 Copper, 1 Gold
+dannycadence - buys Duchy
+dannycadence - gains Duchy
+dannycadence - shuffles deck
+dannycadence - draws Gold, Copper, Copper, Gold, Steward
+ 
+---------- Banker Bot: turn 24 ----------
+Banker Bot - plays Mining Village
+Banker Bot - shuffles deck
+Banker Bot - draws Feodum
+Banker Bot - trashes Mining Village
+Banker Bot - plays Band of Misfits
+Banker Bot - chooses Nomad Camp
+Banker Bot - plays Nomad Camp
+Banker Bot - plays Contraband
+dannycadence - names Province as contraband
+Banker Bot - plays Contraband
+dannycadence - names Duchy as contraband
+Banker Bot - plays 1 Silver
+Banker Bot - buys Silver
+Banker Bot - gains Silver
+Banker Bot - buys Silver
+Banker Bot - gains Silver
+Banker Bot - buys Silver
+Banker Bot - gains Silver
+Banker Bot - buys Silver
+Banker Bot - gains Silver
+Banker Bot - draws Gold, Silver, Silver, Feodum, Steward
+ 
+---------- dannycadence: turn 24 ----------
+dannycadence - plays Steward
+dannycadence - takes 2 coins
+dannycadence - plays 2 Gold, 2 Copper
+dannycadence - buys Province
+dannycadence - gains Province
+dannycadence - draws Gold, Copper, Copper, Mining Village, Duchy
+ 
+---------- Banker Bot: turn 25 ----------
+Banker Bot - plays Steward
+Banker Bot - takes 2 coins
+Banker Bot - plays 2 Silver, 1 Gold
+Banker Bot - buys Duchy
+Banker Bot - gains Duchy
+Banker Bot - draws Silver, Band of Misfits, Contraband, Contraband, Contraband
+ 
+---------- dannycadence: turn 25 ----------
+dannycadence - plays Mining Village
+dannycadence - draws Duchy
+dannycadence - plays 2 Copper, 1 Gold
+dannycadence - buys Duchy
+dannycadence - gains Duchy
+dannycadence - draws Province, Feodum, Band of Misfits, Duchy, Province
+ 
+---------- Banker Bot: turn 26 ----------
+Banker Bot - plays Band of Misfits
+Banker Bot - chooses Nomad Camp
+Banker Bot - plays Nomad Camp
+Banker Bot - plays Contraband
+dannycadence - names Silver as contraband
+Banker Bot - plays Contraband
+dannycadence - names Province as contraband
+Banker Bot - plays Contraband
+dannycadence - names Duchy as contraband
+Banker Bot - plays 1 Silver
+Banker Bot - buys Gold
+Banker Bot - gains Gold
+Banker Bot - buys Estate
+Banker Bot - gains Estate
+Banker Bot - buys Estate
+Banker Bot - gains Estate
+Banker Bot - draws Silver, Feodum, Silver, Silver, Estate
+ 
+---------- dannycadence: turn 26 ----------
+dannycadence - plays Band of Misfits
+dannycadence - chooses Nomad Camp
+dannycadence - plays Nomad Camp
+dannycadence - buys Estate
+dannycadence - gains Estate
+dannycadence - draws Copper, Duchy, Province, Mining Village, Province
+ 
+------------ Game Over ------------
+dannycadence - cards: 3 Mining Village, 1 Bishop, 1 Nomad Camp, 1 Steward, 1 Catacombs, 1 Band of Misfits, 6 Copper, 3 Gold, 5 Duchy, 5 Province, 1 Feodum, 1 Estate
+dannycadence - victory point chips: 18
+dannycadence - total victory points: 64
+dannycadence - turns: 26
+ 
+Banker Bot - cards: 6 Band of Misfits, 13 Silver, 1 Noble Brigand, 10 Contraband, 1 Steward, 2 Gold, 1 Copper, 8 Estate, 7 Feodum, 1 Province, 1 Duchy
+Banker Bot - victory point chips: 0
+Banker Bot - total victory points: 45
+Banker Bot - turns: 26
+ 
+1st place: dannycadence
+2nd place: Banker Bot
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.5133cb09e4b07f4f5210613a.1364876441937.txt b/testing/testdata/log.5133cb09e4b07f4f5210613a.1364876441937.txt
new file mode 100644
index 0000000..03610e4
--- /dev/null
+++ b/testing/testdata/log.5133cb09e4b07f4f5210613a.1364876441937.txt
@@ -0,0 +1,795 @@
+------------ Game Setup ------------
+Supply cards: Hamlet, Scrying Pool, Smugglers, Watchtower, Woodcutter, Philosopher's Stone, Mining Village, Bazaar, Witch, Forge, Copper, Silver, Gold, Estate, Duchy, Province, Curse, Potion
+Nick Jalbert - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Conqueror Bot - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Villager Bot - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Nick Jalbert - shuffles deck
+Conqueror Bot - shuffles deck
+Villager Bot - shuffles deck
+Nick Jalbert - draws Estate, Estate, Copper, Estate, Copper
+Conqueror Bot - draws Estate, Copper, Estate, Copper, Copper
+Villager Bot - draws Copper, Copper, Copper, Copper, Estate
+ 
+---------- Nick Jalbert: turn 1 ----------
+Nick Jalbert - plays 2 Copper
+Nick Jalbert - buys Hamlet
+Nick Jalbert - gains Hamlet
+Nick Jalbert - draws Copper, Copper, Copper, Copper, Copper
+ 
+---------- Conqueror Bot: turn 1 ----------
+Conqueror Bot - plays 3 Copper
+Conqueror Bot - buys Silver
+Conqueror Bot - gains Silver
+Conqueror Bot - draws Copper, Copper, Copper, Estate, Copper
+ 
+---------- Villager Bot: turn 1 ----------
+Villager Bot - plays 4 Copper
+Villager Bot - buys Potion
+Villager Bot - gains Potion
+Villager Bot - draws Copper, Copper, Copper, Estate, Estate
+ 
+---------- Nick Jalbert: turn 2 ----------
+Nick Jalbert - plays 5 Copper
+Nick Jalbert - buys Witch
+Nick Jalbert - gains Witch
+Nick Jalbert - shuffles deck
+Nick Jalbert - draws Copper, Copper, Copper, Estate, Witch
+ 
+---------- Conqueror Bot: turn 2 ----------
+Conqueror Bot - plays 4 Copper
+Conqueror Bot - buys Potion
+Conqueror Bot - gains Potion
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Copper, Copper, Silver, Potion, Estate
+ 
+---------- Villager Bot: turn 2 ----------
+Villager Bot - plays 3 Copper
+Villager Bot - buys Silver
+Villager Bot - gains Silver
+Villager Bot - shuffles deck
+Villager Bot - draws Copper, Copper, Copper, Copper, Copper
+ 
+---------- Nick Jalbert: turn 3 ----------
+Nick Jalbert - plays Witch
+Nick Jalbert - draws Hamlet, Copper
+Conqueror Bot - gains Curse
+Villager Bot - gains Curse
+Nick Jalbert - plays 4 Copper
+Nick Jalbert - buys Mining Village
+Nick Jalbert - gains Mining Village
+Nick Jalbert - draws Copper, Copper, Estate, Copper, Estate
+ 
+---------- Conqueror Bot: turn 3 ----------
+Conqueror Bot - plays Potion
+Conqueror Bot - plays 2 Copper, 1 Silver
+Conqueror Bot - buys Scrying Pool
+Conqueror Bot - gains Scrying Pool
+Conqueror Bot - draws Copper, Estate, Copper, Estate, Copper
+ 
+---------- Villager Bot: turn 3 ----------
+Villager Bot - plays 5 Copper
+Villager Bot - buys Witch
+Villager Bot - gains Witch
+Villager Bot - draws Estate, Estate, Copper, Potion, Estate
+ 
+---------- Nick Jalbert: turn 4 ----------
+Nick Jalbert - plays 3 Copper
+Nick Jalbert - buys Silver
+Nick Jalbert - gains Silver
+Nick Jalbert - shuffles deck
+Nick Jalbert - draws Copper, Copper, Estate, Copper, Estate
+ 
+---------- Conqueror Bot: turn 4 ----------
+Conqueror Bot - plays 3 Copper
+Conqueror Bot - buys Silver
+Conqueror Bot - gains Silver
+Conqueror Bot - draws Copper, Copper
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Silver, Potion, Copper
+ 
+---------- Villager Bot: turn 4 ----------
+Villager Bot - plays Potion
+Villager Bot - plays 1 Copper
+Villager Bot - draws Copper, Silver
+Villager Bot - shuffles deck
+Villager Bot - draws Copper, Copper, Estate
+ 
+---------- Nick Jalbert: turn 5 ----------
+Nick Jalbert - plays 3 Copper
+Nick Jalbert - buys Silver
+Nick Jalbert - gains Silver
+Nick Jalbert - draws Hamlet, Copper, Estate, Copper, Copper
+ 
+---------- Conqueror Bot: turn 5 ----------
+Conqueror Bot - plays Potion
+Conqueror Bot - plays 3 Copper, 1 Silver
+Conqueror Bot - buys Witch
+Conqueror Bot - gains Witch
+Conqueror Bot - draws Estate, Silver, Estate, Estate, Copper
+ 
+---------- Villager Bot: turn 5 ----------
+Villager Bot - plays 3 Copper, 1 Silver
+Villager Bot - buys Witch
+Villager Bot - gains Witch
+Villager Bot - draws Potion, Witch, Copper, Copper, Curse
+ 
+---------- Nick Jalbert: turn 6 ----------
+Nick Jalbert - plays Hamlet
+Nick Jalbert - draws Copper
+Nick Jalbert - plays 4 Copper
+Nick Jalbert - buys Mining Village
+Nick Jalbert - gains Mining Village
+Nick Jalbert - draws Mining Village, Witch, Silver
+Nick Jalbert - shuffles deck
+Nick Jalbert - draws Copper, Mining Village
+ 
+---------- Conqueror Bot: turn 6 ----------
+Conqueror Bot - plays 1 Silver, 1 Copper
+Conqueror Bot - buys Watchtower
+Conqueror Bot - gains Watchtower
+Conqueror Bot - draws Copper, Copper, Scrying Pool, Curse, Copper
+ 
+---------- Villager Bot: turn 6 ----------
+Villager Bot - plays Witch
+Villager Bot - draws Copper, Copper
+Nick Jalbert - gains Curse
+Conqueror Bot - gains Curse
+Villager Bot - plays Potion
+Villager Bot - plays 4 Copper
+Villager Bot - buys Mining Village
+Villager Bot - gains Mining Village
+Villager Bot - draws Estate, Estate
+Villager Bot - shuffles deck
+Villager Bot - draws Witch, Copper, Potion
+ 
+---------- Nick Jalbert: turn 7 ----------
+Nick Jalbert - plays Mining Village
+Nick Jalbert - draws Copper
+Nick Jalbert - plays Mining Village
+Nick Jalbert - draws Estate
+Nick Jalbert - plays Witch
+Nick Jalbert - draws Estate, Copper
+Conqueror Bot - gains Curse
+Villager Bot - gains Curse
+Nick Jalbert - plays 3 Copper, 1 Silver
+Nick Jalbert - buys Witch
+Nick Jalbert - gains Witch
+Nick Jalbert - draws Copper, Copper, Copper, Estate, Hamlet
+ 
+---------- Conqueror Bot: turn 7 ----------
+Conqueror Bot - plays Scrying Pool
+Conqueror Bot - shuffles deck
+Conqueror Bot - discards Estate
+Villager Bot - discards Mining Village
+Nick Jalbert - places Copper on top of deck
+Conqueror Bot - reveals Curse
+Conqueror Bot - plays 3 Copper
+Conqueror Bot - buys Watchtower
+Conqueror Bot - gains Watchtower
+Conqueror Bot - draws Silver, Witch, Copper, Silver, Curse
+ 
+---------- Villager Bot: turn 7 ----------
+Villager Bot - plays Witch
+Villager Bot - draws Copper, Witch
+Nick Jalbert - gains Curse
+Conqueror Bot - gains Curse
+Villager Bot - plays Potion
+Villager Bot - plays 2 Copper
+Villager Bot - buys Scrying Pool
+Villager Bot - gains Scrying Pool
+Villager Bot - draws Curse, Copper, Copper, Copper, Silver
+ 
+---------- Nick Jalbert: turn 8 ----------
+Nick Jalbert - plays Hamlet
+Nick Jalbert - draws Copper
+Nick Jalbert - plays 4 Copper
+Nick Jalbert - buys Mining Village
+Nick Jalbert - gains Mining Village
+Nick Jalbert - draws Silver
+Nick Jalbert - shuffles deck
+Nick Jalbert - draws Mining Village, Mining Village, Copper, Copper
+ 
+---------- Conqueror Bot: turn 8 ----------
+Conqueror Bot - plays Witch
+Conqueror Bot - draws Estate, Copper
+Villager Bot - gains Curse
+Nick Jalbert - gains Curse
+Conqueror Bot - plays 2 Silver, 2 Copper
+Conqueror Bot - buys Gold
+Conqueror Bot - gains Gold
+Conqueror Bot - draws Watchtower, Potion, Copper, Copper, Estate
+ 
+---------- Villager Bot: turn 8 ----------
+Villager Bot - plays 3 Copper, 1 Silver
+Villager Bot - buys Witch
+Villager Bot - gains Witch
+Villager Bot - draws Copper, Estate, Copper
+Villager Bot - shuffles deck
+Villager Bot - draws Estate, Copper
+ 
+---------- Nick Jalbert: turn 9 ----------
+Nick Jalbert - plays Mining Village
+Nick Jalbert - draws Mining Village
+Nick Jalbert - plays Mining Village
+Nick Jalbert - draws Copper
+Nick Jalbert - plays Mining Village
+Nick Jalbert - draws Silver
+Nick Jalbert - plays 3 Copper, 2 Silver
+Nick Jalbert - buys Forge
+Nick Jalbert - gains Forge
+Nick Jalbert - draws Hamlet, Estate, Copper, Copper, Estate
+ 
+---------- Conqueror Bot: turn 9 ----------
+Conqueror Bot - plays Watchtower
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Curse, Gold
+Conqueror Bot - plays Potion
+Conqueror Bot - plays 2 Copper, 1 Gold
+Conqueror Bot - buys Bazaar
+Conqueror Bot - gains Bazaar
+Conqueror Bot - draws Copper, Silver, Copper, Curse, Curse
+ 
+---------- Villager Bot: turn 9 ----------
+Villager Bot - plays 3 Copper
+Villager Bot - buys Silver
+Villager Bot - gains Silver
+Villager Bot - draws Curse, Mining Village, Witch, Curse, Copper
+ 
+---------- Nick Jalbert: turn 10 ----------
+Nick Jalbert - plays Hamlet
+Nick Jalbert - draws Estate
+Nick Jalbert - discards Estate
+Nick Jalbert - receives one action
+Nick Jalbert - discards Estate
+Nick Jalbert - receives one buy
+Nick Jalbert - plays 2 Copper
+Nick Jalbert - draws Copper, Witch, Witch, Curse, Curse
+ 
+---------- Conqueror Bot: turn 10 ----------
+Conqueror Bot - plays 2 Copper, 1 Silver
+Conqueror Bot - buys Mining Village
+Conqueror Bot - gains Mining Village
+Conqueror Bot - draws Witch, Watchtower, Estate, Copper, Copper
+ 
+---------- Villager Bot: turn 10 ----------
+Villager Bot - plays Mining Village
+Villager Bot - draws Potion
+Villager Bot - plays Witch
+Villager Bot - draws Copper, Witch
+Nick Jalbert - gains Curse
+Conqueror Bot - gains Curse
+Conqueror Bot - applied Watchtower to trash Curse
+Conqueror Bot - trashes Curse
+Villager Bot - plays Witch
+Villager Bot - draws Estate, Silver
+Nick Jalbert - gains Curse
+Conqueror Bot - gains Curse
+Conqueror Bot - applied Watchtower to trash Curse
+Conqueror Bot - trashes Curse
+Villager Bot - plays Potion
+Villager Bot - plays 2 Copper, 1 Silver
+Villager Bot - buys Mining Village
+Villager Bot - gains Mining Village
+Villager Bot - draws Copper, Witch, Scrying Pool, Copper, Curse
+ 
+---------- Nick Jalbert: turn 11 ----------
+Nick Jalbert - plays Witch
+Nick Jalbert - draws Copper
+Nick Jalbert - shuffles deck
+Nick Jalbert - draws Copper
+Conqueror Bot - gains Curse
+Conqueror Bot - applied Watchtower to trash Curse
+Conqueror Bot - trashes Curse
+Villager Bot - gains Curse
+Nick Jalbert - plays 3 Copper
+Nick Jalbert - buys Silver
+Nick Jalbert - gains Silver
+Nick Jalbert - draws Silver, Curse, Copper, Estate, Silver
+ 
+---------- Conqueror Bot: turn 11 ----------
+Conqueror Bot - plays Witch
+Conqueror Bot - draws Silver, Copper
+Villager Bot - gains Curse
+Nick Jalbert - gains Curse
+Conqueror Bot - plays 3 Copper, 1 Silver
+Conqueror Bot - buys Duchy
+Conqueror Bot - gains Duchy
+Conqueror Bot - draws Scrying Pool, Estate, Curse
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Potion, Curse
+ 
+---------- Villager Bot: turn 11 ----------
+Villager Bot - plays Scrying Pool
+Villager Bot - shuffles deck
+Villager Bot - places Mining Village on top of deck
+Nick Jalbert - places Curse on top of deck
+Conqueror Bot - discards Bazaar
+Villager Bot - reveals Mining Village, Copper
+Villager Bot - plays Mining Village
+Villager Bot - draws Silver
+Villager Bot - plays Witch
+Villager Bot - draws Mining Village, Estate
+Nick Jalbert - gains Curse
+Conqueror Bot - gains Curse
+Villager Bot - plays Mining Village
+Villager Bot - draws Curse
+Villager Bot - plays 3 Copper, 1 Silver
+Villager Bot - buys Duchy
+Villager Bot - gains Duchy
+Villager Bot - draws Silver, Curse, Copper, Copper, Witch
+ 
+---------- Nick Jalbert: turn 12 ----------
+Nick Jalbert - plays 2 Silver, 1 Copper
+Nick Jalbert - buys Bazaar
+Nick Jalbert - gains Bazaar
+Nick Jalbert - draws Curse, Copper, Estate, Copper, Mining Village
+ 
+---------- Conqueror Bot: turn 12 ----------
+Conqueror Bot - plays Scrying Pool
+Conqueror Bot - discards Copper
+Villager Bot - discards Witch
+Nick Jalbert - places Estate on top of deck
+Conqueror Bot - reveals Mining Village, Copper
+Conqueror Bot - plays Mining Village
+Conqueror Bot - draws Estate
+Conqueror Bot - plays Potion
+Conqueror Bot - plays 1 Copper
+Conqueror Bot - draws Silver, Watchtower, Duchy, Silver, Curse
+ 
+---------- Villager Bot: turn 12 ----------
+Villager Bot - plays Witch
+Villager Bot - draws Copper, Estate
+Villager Bot - plays 3 Copper, 1 Silver
+Villager Bot - buys Duchy
+Villager Bot - gains Duchy
+Villager Bot - draws Estate, Copper, Curse, Curse, Potion
+ 
+---------- Nick Jalbert: turn 13 ----------
+Nick Jalbert - plays Mining Village
+Nick Jalbert - draws Estate
+Nick Jalbert - plays 2 Copper
+Nick Jalbert - draws Mining Village, Curse, Mining Village, Copper, Forge
+ 
+---------- Conqueror Bot: turn 13 ----------
+Conqueror Bot - plays Watchtower
+Conqueror Bot - draws Watchtower, Copper
+Conqueror Bot - plays 2 Silver, 1 Copper
+Conqueror Bot - buys Duchy
+Conqueror Bot - gains Duchy
+Conqueror Bot - draws Copper, Copper, Curse, Gold, Witch
+ 
+---------- Villager Bot: turn 13 ----------
+Villager Bot - plays Potion
+Villager Bot - plays 1 Copper
+Villager Bot - buys Copper
+Villager Bot - gains Copper
+Villager Bot - shuffles deck
+Villager Bot - draws Mining Village, Curse, Witch, Copper, Copper
+ 
+---------- Nick Jalbert: turn 14 ----------
+Nick Jalbert - plays Mining Village
+Nick Jalbert - draws Hamlet
+Nick Jalbert - plays Mining Village
+Nick Jalbert - shuffles deck
+Nick Jalbert - draws Estate
+Nick Jalbert - plays Forge
+Nick Jalbert - trashes Estate, Hamlet, Copper, Curse
+Nick Jalbert - gains Mining Village
+Nick Jalbert - draws Witch, Curse, Mining Village, Curse, Estate
+ 
+---------- Conqueror Bot: turn 14 ----------
+Conqueror Bot - plays Witch
+Conqueror Bot - draws Copper, Copper
+Conqueror Bot - plays 4 Copper, 1 Gold
+Conqueror Bot - buys Duchy
+Conqueror Bot - gains Duchy
+Conqueror Bot - draws Estate
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Gold, Watchtower, Estate, Copper
+ 
+---------- Villager Bot: turn 14 ----------
+Villager Bot - plays Mining Village
+Villager Bot - draws Witch
+Villager Bot - plays Witch
+Villager Bot - draws Copper, Curse
+Villager Bot - plays Witch
+Villager Bot - draws Witch, Silver
+Villager Bot - plays 3 Copper, 1 Silver
+Villager Bot - buys Duchy
+Villager Bot - gains Duchy
+Villager Bot - draws Estate, Copper, Duchy, Curse, Duchy
+ 
+---------- Nick Jalbert: turn 15 ----------
+Nick Jalbert - plays Mining Village
+Nick Jalbert - draws Silver
+Nick Jalbert - plays Witch
+Nick Jalbert - draws Copper, Witch
+Nick Jalbert - plays Witch
+Nick Jalbert - draws Bazaar, Curse
+Nick Jalbert - plays 1 Silver, 1 Copper
+Nick Jalbert - buys Silver
+Nick Jalbert - gains Silver
+Nick Jalbert - draws Silver, Silver, Curse, Curse, Curse
+ 
+---------- Conqueror Bot: turn 15 ----------
+Conqueror Bot - plays Watchtower
+Conqueror Bot - draws Duchy, Copper
+Conqueror Bot - plays 2 Copper, 1 Gold
+Conqueror Bot - buys Duchy
+Conqueror Bot - gains Duchy
+Conqueror Bot - draws Copper, Duchy, Copper, Silver, Curse
+ 
+---------- Villager Bot: turn 15 ----------
+Villager Bot - plays 1 Copper
+Villager Bot - buys Copper
+Villager Bot - gains Copper
+Villager Bot - draws Copper, Silver, Curse, Potion, Estate
+ 
+---------- Nick Jalbert: turn 16 ----------
+Nick Jalbert - plays 2 Silver
+Nick Jalbert - buys Mining Village
+Nick Jalbert - gains Mining Village
+Nick Jalbert - draws Copper, Copper, Estate, Copper, Copper
+ 
+---------- Conqueror Bot: turn 16 ----------
+Conqueror Bot - plays 2 Copper, 1 Silver
+Conqueror Bot - buys Estate
+Conqueror Bot - gains Estate
+Conqueror Bot - draws Scrying Pool, Watchtower, Duchy, Mining Village, Curse
+ 
+---------- Villager Bot: turn 16 ----------
+Villager Bot - plays Potion
+Villager Bot - plays 1 Copper, 1 Silver
+Villager Bot - buys Philosopher's Stone
+Villager Bot - gains Philosopher's Stone
+Villager Bot - draws Copper, Copper, Estate, Copper, Mining Village
+ 
+---------- Nick Jalbert: turn 17 ----------
+Nick Jalbert - plays 4 Copper
+Nick Jalbert - buys Silver
+Nick Jalbert - gains Silver
+Nick Jalbert - draws Copper
+Nick Jalbert - shuffles deck
+Nick Jalbert - draws Bazaar, Copper, Silver, Curse
+ 
+---------- Conqueror Bot: turn 17 ----------
+Conqueror Bot - plays Mining Village
+Conqueror Bot - draws Copper
+Conqueror Bot - plays Scrying Pool
+Conqueror Bot - discards Curse
+Villager Bot - discards Scrying Pool
+Nick Jalbert - places Curse on top of deck
+Conqueror Bot - reveals Estate
+Conqueror Bot - plays Watchtower
+Conqueror Bot - draws Witch, Copper
+Conqueror Bot - plays Witch
+Conqueror Bot - draws Potion, Bazaar
+Conqueror Bot - plays Potion
+Conqueror Bot - plays 2 Copper
+Conqueror Bot - buys Estate
+Conqueror Bot - gains Estate
+Conqueror Bot - draws Silver, Curse, Curse, Copper
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Potion
+ 
+---------- Villager Bot: turn 17 ----------
+Villager Bot - plays Mining Village
+Villager Bot - draws Curse
+Villager Bot - plays 3 Copper
+Villager Bot - buys Watchtower
+Villager Bot - gains Watchtower
+Villager Bot - shuffles deck
+Villager Bot - draws Watchtower, Witch, Mining Village, Silver, Copper
+ 
+---------- Nick Jalbert: turn 18 ----------
+Nick Jalbert - plays Bazaar
+Nick Jalbert - draws Curse
+Nick Jalbert - plays 2 Copper, 1 Silver
+Nick Jalbert - buys Bazaar
+Nick Jalbert - gains Bazaar
+Nick Jalbert - draws Curse, Estate, Silver, Silver, Copper
+ 
+---------- Conqueror Bot: turn 18 ----------
+Conqueror Bot - plays Potion
+Conqueror Bot - plays 1 Silver, 1 Copper
+Conqueror Bot - buys Estate
+Conqueror Bot - gains Estate
+Conqueror Bot - draws Duchy, Scrying Pool, Witch, Duchy, Copper
+ 
+---------- Villager Bot: turn 18 ----------
+Villager Bot - plays Mining Village
+Villager Bot - draws Curse
+Villager Bot - plays Watchtower
+Villager Bot - draws Philosopher's Stone, Witch
+Villager Bot - plays Witch
+Villager Bot - draws Copper, Curse
+Villager Bot - plays Philosopher's Stone
+Villager Bot - has 0 cards in discards
+Villager Bot - receives 4 coins
+Villager Bot - plays 2 Copper, 1 Silver
+Villager Bot - buys Province
+Villager Bot - gains Province
+Villager Bot - draws Curse, Copper, Estate, Duchy, Silver
+ 
+---------- Nick Jalbert: turn 19 ----------
+Nick Jalbert - plays 2 Silver, 1 Copper
+Nick Jalbert - buys Bazaar
+Nick Jalbert - gains Bazaar
+Nick Jalbert - draws Mining Village, Mining Village, Silver, Curse, Copper
+ 
+---------- Conqueror Bot: turn 19 ----------
+Conqueror Bot - plays Scrying Pool
+Conqueror Bot - discards Estate
+Villager Bot - places Duchy on top of deck
+Nick Jalbert - discards Forge
+Conqueror Bot - reveals Copper
+Conqueror Bot - plays Witch
+Conqueror Bot - draws Duchy, Copper
+Conqueror Bot - plays 3 Copper
+Conqueror Bot - buys Estate
+Conqueror Bot - gains Estate
+Conqueror Bot - draws Estate, Bazaar, Gold, Mining Village, Curse
+ 
+---------- Villager Bot: turn 19 ----------
+Villager Bot - plays 1 Copper, 1 Silver
+Villager Bot - buys Silver
+Villager Bot - gains Silver
+Villager Bot - draws Duchy, Copper, Witch, Scrying Pool, Copper
+ 
+---------- Nick Jalbert: turn 20 ----------
+Nick Jalbert - plays Mining Village
+Nick Jalbert - draws Mining Village
+Nick Jalbert - plays Mining Village
+Nick Jalbert - draws Mining Village
+Nick Jalbert - plays Mining Village
+Nick Jalbert - draws Estate
+Nick Jalbert - plays Mining Village
+Nick Jalbert - draws Silver
+Nick Jalbert - plays 2 Silver, 1 Copper
+Nick Jalbert - buys Duchy
+Nick Jalbert - gains Duchy
+Nick Jalbert - draws Mining Village, Witch, Witch, Curse, Copper
+ 
+---------- Conqueror Bot: turn 20 ----------
+Conqueror Bot - plays Bazaar
+Conqueror Bot - draws Copper
+Conqueror Bot - plays Mining Village
+Conqueror Bot - draws Watchtower
+Conqueror Bot - plays Watchtower
+Conqueror Bot - draws Curse, Curse
+Conqueror Bot - plays 1 Gold, 1 Copper
+Conqueror Bot - buys Duchy
+Conqueror Bot - gains Duchy
+Conqueror Bot - draws Duchy, Copper, Silver, Copper, Estate
+ 
+---------- Villager Bot: turn 20 ----------
+Villager Bot - plays Scrying Pool
+Villager Bot - discards Curse
+Nick Jalbert - places Copper on top of deck
+Conqueror Bot - places Estate on top of deck
+Villager Bot - reveals Mining Village, Copper
+Villager Bot - plays Mining Village
+Villager Bot - draws Duchy
+Villager Bot - trashes Mining Village
+Villager Bot - plays Witch
+Villager Bot - draws Estate, Estate
+Villager Bot - plays 3 Copper
+Villager Bot - buys Duchy
+Villager Bot - gains Duchy
+Villager Bot - draws Copper, Copper, Curse, Copper, Potion
+ 
+---------- Nick Jalbert: turn 21 ----------
+Nick Jalbert - plays Mining Village
+Nick Jalbert - draws Copper
+Nick Jalbert - plays Witch
+Nick Jalbert - draws Curse
+Nick Jalbert - shuffles deck
+Nick Jalbert - draws Silver
+Nick Jalbert - plays Witch
+Nick Jalbert - draws Mining Village, Silver
+Nick Jalbert - plays 2 Copper, 2 Silver
+Nick Jalbert - buys Gold
+Nick Jalbert - gains Gold
+Nick Jalbert - draws Mining Village, Mining Village, Forge, Silver, Mining Village
+ 
+---------- Conqueror Bot: turn 21 ----------
+Conqueror Bot - plays 2 Copper, 1 Silver
+Conqueror Bot - buys Estate
+Conqueror Bot - gains Estate
+Conqueror Bot - draws Estate, Watchtower, Estate
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Estate, Curse
+ 
+---------- Villager Bot: turn 21 ----------
+Villager Bot - plays Potion
+Villager Bot - plays 3 Copper
+Villager Bot - buys Philosopher's Stone
+Villager Bot - gains Philosopher's Stone
+Villager Bot - shuffles deck
+Villager Bot - draws Province, Copper, Silver, Copper, Duchy
+ 
+---------- Nick Jalbert: turn 22 ----------
+Nick Jalbert - plays Mining Village
+Nick Jalbert - draws Curse
+Nick Jalbert - trashes Mining Village
+Nick Jalbert - plays Forge
+Nick Jalbert - trashes Mining Village, Mining Village, Curse
+Nick Jalbert - gains Province
+Nick Jalbert - plays 1 Silver
+Nick Jalbert - buys Mining Village
+Nick Jalbert - gains Mining Village
+Nick Jalbert - draws Curse, Silver, Curse, Estate, Curse
+ 
+---------- Conqueror Bot: turn 22 ----------
+Conqueror Bot - plays Watchtower
+Conqueror Bot - draws Curse, Curse
+Conqueror Bot - buys Copper
+Conqueror Bot - gains Copper
+Conqueror Bot - draws Copper, Witch, Silver, Curse, Copper
+ 
+---------- Villager Bot: turn 22 ----------
+Villager Bot - plays 2 Copper, 1 Silver
+Villager Bot - buys Mining Village
+Villager Bot - gains Mining Village
+Villager Bot - draws Witch, Witch, Copper, Estate, Estate
+ 
+---------- Nick Jalbert: turn 23 ----------
+Nick Jalbert - draws Copper, Silver, Bazaar, Estate, Bazaar
+ 
+---------- Conqueror Bot: turn 23 ----------
+Conqueror Bot - plays Witch
+Conqueror Bot - draws Estate, Scrying Pool
+Conqueror Bot - plays 2 Copper, 1 Silver
+Conqueror Bot - buys Estate
+Conqueror Bot - gains Estate
+Conqueror Bot - draws Estate, Duchy, Duchy, Copper, Potion
+ 
+---------- Villager Bot: turn 23 ----------
+Villager Bot - plays Witch
+Villager Bot - draws Watchtower, Silver
+Villager Bot - plays 1 Copper, 1 Silver
+Villager Bot - buys Estate
+Villager Bot - gains Estate
+Villager Bot - draws Copper, Silver, Witch, Curse, Curse
+ 
+---------- Nick Jalbert: turn 24 ----------
+Nick Jalbert - plays Bazaar
+Nick Jalbert - draws Bazaar
+Nick Jalbert - plays Bazaar
+Nick Jalbert - draws Duchy
+Nick Jalbert - plays Bazaar
+Nick Jalbert - draws Copper
+Nick Jalbert - plays 2 Copper, 1 Silver
+Nick Jalbert - buys Gold
+Nick Jalbert - gains Gold
+Nick Jalbert - draws Copper, Copper
+Nick Jalbert - shuffles deck
+Nick Jalbert - draws Curse, Silver, Gold
+ 
+---------- Conqueror Bot: turn 24 ----------
+Conqueror Bot - plays Potion
+Conqueror Bot - plays 1 Copper
+Conqueror Bot - buys Copper
+Conqueror Bot - gains Copper
+Conqueror Bot - draws Duchy, Watchtower, Estate, Bazaar, Silver
+ 
+---------- Villager Bot: turn 24 ----------
+Villager Bot - plays Witch
+Villager Bot - draws Philosopher's Stone, Curse
+Villager Bot - plays Philosopher's Stone
+Villager Bot - has 14 cards in discards
+Villager Bot - receives 5 coins
+Villager Bot - plays 1 Copper, 1 Silver
+Villager Bot - buys Province
+Villager Bot - gains Province
+Villager Bot - draws Scrying Pool, Duchy, Curse, Copper, Mining Village
+ 
+---------- Nick Jalbert: turn 25 ----------
+Nick Jalbert - plays 2 Copper, 1 Silver, 1 Gold
+Nick Jalbert - buys Gold
+Nick Jalbert - gains Gold
+Nick Jalbert - draws Silver, Gold, Duchy, Mining Village, Bazaar
+ 
+---------- Conqueror Bot: turn 25 ----------
+Conqueror Bot - plays Bazaar
+Conqueror Bot - draws Duchy
+Conqueror Bot - plays Watchtower
+Conqueror Bot - draws Copper, Estate
+Conqueror Bot - plays 1 Silver, 1 Copper
+Conqueror Bot - buys Estate
+Conqueror Bot - gains Estate
+Conqueror Bot - draws Copper, Copper, Mining Village, Duchy, Estate
+ 
+---------- Villager Bot: turn 25 ----------
+Villager Bot - plays Mining Village
+Villager Bot - draws Curse
+Villager Bot - trashes Mining Village
+Villager Bot - plays Scrying Pool
+Villager Bot - discards Estate
+Nick Jalbert - places Province on top of deck
+Conqueror Bot - places Curse on top of deck
+Villager Bot - reveals Duchy
+Villager Bot - plays 1 Copper
+Villager Bot - buys Estate
+Villager Bot - gains Estate
+Villager Bot - draws Philosopher's Stone, Duchy, Copper, Copper, Potion
+ 
+---------- Nick Jalbert: turn 26 ----------
+Nick Jalbert - plays Mining Village
+Nick Jalbert - draws Province
+Nick Jalbert - trashes Mining Village
+Nick Jalbert - plays Bazaar
+Nick Jalbert - draws Estate
+Nick Jalbert - plays 1 Silver, 1 Gold
+Nick Jalbert - buys Province
+Nick Jalbert - gains Province
+Nick Jalbert - draws Silver, Silver, Forge, Mining Village, Curse
+ 
+---------- Conqueror Bot: turn 26 ----------
+Conqueror Bot - plays Mining Village
+Conqueror Bot - draws Curse
+Conqueror Bot - trashes Mining Village
+Conqueror Bot - plays 2 Copper
+Conqueror Bot - buys Estate
+Conqueror Bot - gains Estate
+Conqueror Bot - draws Gold, Copper
+Conqueror Bot - shuffles deck
+Conqueror Bot - draws Bazaar, Watchtower, Curse
+ 
+---------- Villager Bot: turn 26 ----------
+Villager Bot - plays Philosopher's Stone
+Villager Bot - has 30 cards in discards
+Villager Bot - receives 6 coins
+Villager Bot - plays Potion
+Villager Bot - plays 2 Copper
+Villager Bot - buys Province
+Villager Bot - gains Province
+Villager Bot - draws Copper, Copper
+Villager Bot - shuffles deck
+Villager Bot - draws Philosopher's Stone, Estate, Duchy
+ 
+---------- Nick Jalbert: turn 27 ----------
+Nick Jalbert - plays Mining Village
+Nick Jalbert - draws Curse
+Nick Jalbert - plays Forge
+Nick Jalbert - trashes Curse, Curse, Silver, Silver
+Nick Jalbert - gains Gold
+Nick Jalbert - draws Bazaar, Bazaar, Estate, Mining Village, Copper
+ 
+---------- Conqueror Bot: turn 27 ----------
+Conqueror Bot - plays Bazaar
+Conqueror Bot - draws Potion
+Conqueror Bot - plays Watchtower
+Conqueror Bot - draws Duchy, Duchy
+Conqueror Bot - plays Potion
+Conqueror Bot - plays 1 Gold, 1 Copper
+Conqueror Bot - buys Duchy
+Conqueror Bot - gains Duchy
+Conqueror Bot - draws Estate, Curse, Silver, Estate, Copper
+ 
+---------- Villager Bot: turn 27 ----------
+Villager Bot - plays Philosopher's Stone
+Villager Bot - has 0 cards in discards
+Villager Bot - receives 6 coins
+Villager Bot - plays 2 Copper
+Villager Bot - buys Duchy
+Villager Bot - gains Duchy
+Villager Bot - draws Estate, Watchtower, Witch, Duchy, Copper
+ 
+------------ Game Over ------------
+Villager Bot - cards: 3 Witch, 1 Scrying Pool, 1 Watchtower, 1 Mining Village, 9 Copper, 3 Silver, 2 Philosopher's Stone, 1 Potion, 5 Estate, 5 Duchy, 3 Province, 5 Curse
+Villager Bot - total victory points: 33
+Villager Bot - turns: 27
+ 
+Conqueror Bot - cards: 2 Watchtower, 1 Bazaar, 1 Scrying Pool, 1 Witch, 9 Copper, 2 Silver, 11 Estate, 1 Potion, 1 Gold, 6 Duchy, 5 Curse
+Conqueror Bot - total victory points: 24
+Conqueror Bot - turns: 27
+ 
+Nick Jalbert - cards: 3 Bazaar, 2 Witch, 2 Mining Village, 1 Forge, 6 Copper, 4 Gold, 3 Silver, 2 Estate, 2 Province, 1 Duchy, 3 Curse
+Nick Jalbert - total victory points: 14
+Nick Jalbert - turns: 27
+ 
+1st place: Villager Bot
+2nd place: Conqueror Bot
+3rd place: Nick Jalbert
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.5139e809e4b05fa06a3117e7.1364835851103.txt b/testing/testdata/log.5139e809e4b05fa06a3117e7.1364835851103.txt
new file mode 100644
index 0000000..95a9f0f
--- /dev/null
+++ b/testing/testdata/log.5139e809e4b05fa06a3117e7.1364835851103.txt
@@ -0,0 +1,1200 @@
+------------ Game Setup ------------
+Supply cards: Embargo, Native Village, Watchtower, Workshop, Island, Pirate Ship, Spy, Laboratory, Tactician, Witch, Copper, Silver, Gold, Estate, Duchy, Province, Curse
+dikdik - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+sandyttc - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+konichiwa - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Ali Iskandar Othman - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+dikdik - shuffles deck
+sandyttc - shuffles deck
+konichiwa - shuffles deck
+Ali Iskandar Othman - shuffles deck
+dikdik - draws Copper, Copper, Copper, Estate, Copper
+sandyttc - draws Copper, Estate, Copper, Copper, Copper
+konichiwa - draws Copper, Copper, Copper, Estate, Copper
+Ali Iskandar Othman - draws Copper, Copper, Copper, Estate, Copper
+ 
+---------- konichiwa: turn 1 ----------
+konichiwa - plays 4 Copper
+konichiwa - buys Silver
+konichiwa - gains Silver
+konichiwa - draws Estate, Copper, Copper, Estate, Copper
+ 
+---------- Ali Iskandar Othman: turn 1 ----------
+Ali Iskandar Othman - plays 4 Copper
+Ali Iskandar Othman - buys Pirate Ship
+Ali Iskandar Othman - gains Pirate Ship
+Ali Iskandar Othman - draws Copper, Estate, Estate, Copper, Copper
+ 
+---------- dikdik: turn 1 ----------
+dikdik - plays 4 Copper
+dikdik - buys Embargo
+dikdik - gains Embargo
+dikdik - draws Estate, Copper, Copper, Estate, Copper
+ 
+---------- sandyttc: turn 1 ----------
+sandyttc - plays 4 Copper
+sandyttc - buys Island
+sandyttc - gains Island
+sandyttc - draws Copper, Estate, Copper, Estate, Copper
+ 
+---------- konichiwa: turn 2 ----------
+konichiwa - plays 3 Copper
+konichiwa - buys Watchtower
+konichiwa - gains Watchtower
+konichiwa - shuffles deck
+konichiwa - draws Copper, Estate, Copper, Copper, Copper
+ 
+---------- Ali Iskandar Othman: turn 2 ----------
+Ali Iskandar Othman - plays 3 Copper
+Ali Iskandar Othman - buys Workshop
+Ali Iskandar Othman - gains Workshop
+Ali Iskandar Othman - shuffles deck
+Ali Iskandar Othman - draws Copper, Pirate Ship, Estate, Copper, Workshop
+ 
+---------- dikdik: turn 2 ----------
+dikdik - plays 3 Copper
+dikdik - buys Embargo
+dikdik - gains Embargo
+dikdik - shuffles deck
+dikdik - draws Copper, Copper, Copper, Embargo, Estate
+ 
+---------- sandyttc: turn 2 ----------
+sandyttc - plays 3 Copper
+sandyttc - buys Watchtower
+sandyttc - gains Watchtower
+sandyttc - shuffles deck
+sandyttc - draws Copper, Copper, Island, Copper, Copper
+ 
+---------- konichiwa: turn 3 ----------
+konichiwa - plays 4 Copper
+konichiwa - buys Silver
+konichiwa - gains Silver
+konichiwa - draws Copper, Watchtower, Estate, Copper, Copper
+ 
+---------- Ali Iskandar Othman: turn 3 ----------
+Ali Iskandar Othman - plays Pirate Ship
+dikdik - reveals Estate, Copper
+Ali Iskandar Othman - trashes Copper
+dikdik - discards Estate
+sandyttc - reveals Watchtower, Estate
+sandyttc - discards: Watchtower, Estate
+konichiwa - reveals Estate, Silver
+Ali Iskandar Othman - trashes Silver
+konichiwa - discards Estate
+Ali Iskandar Othman - receives a pirate coin, now has 1 pirate coin(s)
+Ali Iskandar Othman - plays 2 Copper
+Ali Iskandar Othman - buys Embargo
+Ali Iskandar Othman - gains Embargo
+Ali Iskandar Othman - draws Copper, Copper, Estate, Copper, Copper
+ 
+---------- dikdik: turn 3 ----------
+dikdik - plays Embargo
+dikdik - embargoes Pirate Ship
+dikdik - trashes Embargo
+dikdik - plays 3 Copper
+dikdik - buys Witch
+dikdik - gains Witch
+dikdik - draws Copper, Embargo, Copper, Copper, Estate
+ 
+---------- sandyttc: turn 3 ----------
+sandyttc - plays Island
+sandyttc - sets aside Copper
+sandyttc - plays 3 Copper
+sandyttc - buys Embargo
+sandyttc - gains Embargo
+sandyttc - draws Copper, Copper, Estate, Estate, Copper
+ 
+---------- konichiwa: turn 4 ----------
+konichiwa - plays Watchtower
+konichiwa - shuffles deck
+konichiwa - draws Copper, Copper
+konichiwa - plays 5 Copper
+konichiwa - buys Laboratory
+konichiwa - gains Laboratory
+konichiwa - draws Estate, Silver, Copper, Copper, Estate
+ 
+---------- Ali Iskandar Othman: turn 4 ----------
+Ali Iskandar Othman - plays 4 Copper
+Ali Iskandar Othman - buys Island
+Ali Iskandar Othman - gains Island
+Ali Iskandar Othman - draws Copper, Estate
+Ali Iskandar Othman - shuffles deck
+Ali Iskandar Othman - draws Pirate Ship, Estate, Workshop
+ 
+---------- dikdik: turn 4 ----------
+dikdik - plays Embargo
+dikdik - embargoes Witch
+dikdik - trashes Embargo
+dikdik - plays 3 Copper
+dikdik - buys Laboratory
+dikdik - gains Laboratory
+dikdik - shuffles deck
+dikdik - draws Copper, Estate, Estate, Copper, Copper
+ 
+---------- sandyttc: turn 4 ----------
+sandyttc - plays 3 Copper
+sandyttc - buys Silver
+sandyttc - gains Silver
+sandyttc - shuffles deck
+sandyttc - draws Silver, Copper, Watchtower, Copper, Copper
+ 
+---------- konichiwa: turn 5 ----------
+konichiwa - plays 2 Copper, 1 Silver
+konichiwa - buys Island
+konichiwa - gains Island
+konichiwa - shuffles deck
+konichiwa - draws Silver, Copper, Estate, Copper, Watchtower
+ 
+---------- Ali Iskandar Othman: turn 5 ----------
+Ali Iskandar Othman - plays Pirate Ship
+dikdik - reveals Laboratory, Estate
+dikdik - discards: Laboratory, Estate
+sandyttc - reveals Estate, Estate
+sandyttc - discards: Estate, Estate
+konichiwa - reveals Copper, Copper
+Ali Iskandar Othman - trashes Copper
+konichiwa - discards Copper
+Ali Iskandar Othman - receives a pirate coin, now has 2 pirate coin(s)
+Ali Iskandar Othman - plays 1 Copper
+Ali Iskandar Othman - draws Copper, Island, Estate, Copper, Copper
+ 
+---------- dikdik: turn 5 ----------
+dikdik - plays 3 Copper
+dikdik - buys Silver
+dikdik - gains Silver
+dikdik - draws Copper, Witch, Copper, Copper
+dikdik - shuffles deck
+dikdik - draws Estate
+ 
+---------- sandyttc: turn 5 ----------
+sandyttc - plays 3 Copper, 1 Silver
+sandyttc - buys Witch
+sandyttc - gains Curse
+sandyttc - applied Watchtower to trash Curse
+sandyttc - trashes Curse
+sandyttc - gains Witch
+sandyttc - applied Watchtower to place Witch on top of the deck
+sandyttc - draws Witch, Copper, Embargo, Copper, Estate
+ 
+---------- konichiwa: turn 6 ----------
+konichiwa - plays Watchtower
+konichiwa - draws Copper, Estate
+konichiwa - plays 3 Copper, 1 Silver
+konichiwa - buys Laboratory
+konichiwa - gains Laboratory
+konichiwa - draws Copper, Copper, Laboratory, Estate, Island
+ 
+---------- Ali Iskandar Othman: turn 6 ----------
+Ali Iskandar Othman - plays Island
+Ali Iskandar Othman - sets aside Estate
+Ali Iskandar Othman - plays 3 Copper
+Ali Iskandar Othman - buys Watchtower
+Ali Iskandar Othman - gains Watchtower
+Ali Iskandar Othman - draws Embargo, Copper, Copper, Copper
+Ali Iskandar Othman - shuffles deck
+Ali Iskandar Othman - draws Copper
+ 
+---------- dikdik: turn 6 ----------
+dikdik - plays Witch
+dikdik - draws Copper, Copper
+sandyttc - gains Curse
+konichiwa - gains Curse
+Ali Iskandar Othman - gains Curse
+dikdik - plays 5 Copper
+dikdik - buys Watchtower
+dikdik - gains Watchtower
+dikdik - draws Estate, Copper, Silver, Laboratory, Estate
+ 
+---------- sandyttc: turn 6 ----------
+sandyttc - plays Witch
+sandyttc - draws Copper
+sandyttc - shuffles deck
+sandyttc - draws Copper
+konichiwa - gains Curse
+Ali Iskandar Othman - gains Curse
+dikdik - gains Curse
+sandyttc - plays 4 Copper
+sandyttc - buys Watchtower
+sandyttc - gains Watchtower
+sandyttc - draws Estate, Copper, Estate, Silver, Curse
+ 
+---------- konichiwa: turn 7 ----------
+konichiwa - plays Laboratory
+konichiwa - shuffles deck
+konichiwa - draws Estate, Silver
+konichiwa - plays Island
+konichiwa - sets aside Estate
+konichiwa - plays 2 Copper, 1 Silver
+konichiwa - buys Island
+konichiwa - gains Island
+konichiwa - draws Copper, Estate, Curse, Copper, Copper
+ 
+---------- Ali Iskandar Othman: turn 7 ----------
+Ali Iskandar Othman - plays Embargo
+Ali Iskandar Othman - embargoes Laboratory
+Ali Iskandar Othman - trashes Embargo
+Ali Iskandar Othman - plays 4 Copper
+Ali Iskandar Othman - buys Pirate Ship
+Ali Iskandar Othman - gains Curse
+Ali Iskandar Othman - gains Pirate Ship
+Ali Iskandar Othman - draws Estate, Copper, Copper, Pirate Ship, Workshop
+ 
+---------- dikdik: turn 7 ----------
+dikdik - plays Laboratory
+dikdik - shuffles deck
+dikdik - draws Copper, Copper
+dikdik - plays 3 Copper, 1 Silver
+dikdik - buys Watchtower
+dikdik - gains Watchtower
+dikdik - draws Watchtower, Witch, Curse, Estate, Copper
+ 
+---------- sandyttc: turn 7 ----------
+sandyttc - plays Silver
+sandyttc - plays 1 Copper
+sandyttc - buys Watchtower
+sandyttc - gains Watchtower
+sandyttc - draws Watchtower, Copper
+sandyttc - shuffles deck
+sandyttc - draws Copper, Embargo, Copper
+ 
+---------- konichiwa: turn 8 ----------
+konichiwa - plays 3 Copper
+konichiwa - buys Watchtower
+konichiwa - gains Watchtower
+konichiwa - draws Watchtower, Laboratory, Copper, Curse
+konichiwa - shuffles deck
+konichiwa - draws Copper
+ 
+---------- Ali Iskandar Othman: turn 8 ----------
+Ali Iskandar Othman - plays Pirate Ship
+dikdik - reveals Copper, Copper
+Ali Iskandar Othman - trashes Copper
+dikdik - discards Copper
+sandyttc - reveals Witch, Silver
+Ali Iskandar Othman - trashes Silver
+sandyttc - discards Witch
+konichiwa - reveals Silver, Watchtower
+Ali Iskandar Othman - trashes Silver
+konichiwa - discards Watchtower
+Ali Iskandar Othman - receives a pirate coin, now has 3 pirate coin(s)
+Ali Iskandar Othman - plays 2 Copper
+Ali Iskandar Othman - buys Embargo
+Ali Iskandar Othman - gains Embargo
+Ali Iskandar Othman - draws Copper, Estate, Watchtower
+Ali Iskandar Othman - shuffles deck
+Ali Iskandar Othman - draws Estate, Copper
+ 
+---------- dikdik: turn 8 ----------
+dikdik - plays Witch
+dikdik - shuffles deck
+dikdik - draws Copper, Laboratory
+sandyttc - gains Curse
+sandyttc - applied Watchtower to trash Curse
+sandyttc - trashes Curse
+konichiwa - gains Curse
+konichiwa - applied Watchtower to trash Curse
+konichiwa - trashes Curse
+Ali Iskandar Othman - gains Curse
+Ali Iskandar Othman - applied Watchtower to trash Curse
+Ali Iskandar Othman - trashes Curse
+dikdik - plays 2 Copper
+dikdik - buys Embargo
+dikdik - gains Embargo
+dikdik - applied Watchtower to place Embargo on top of the deck
+dikdik - draws Embargo, Watchtower, Silver, Copper, Estate
+ 
+---------- sandyttc: turn 8 ----------
+sandyttc - plays Embargo
+sandyttc - embargoes Laboratory
+sandyttc - trashes Embargo
+sandyttc - plays 3 Copper
+sandyttc - buys Tactician
+sandyttc - gains Tactician
+sandyttc - applied Watchtower to place Tactician on top of the deck
+sandyttc - draws Tactician, Copper, Copper, Estate, Estate
+ 
+---------- konichiwa: turn 9 ----------
+konichiwa - plays Laboratory
+konichiwa - draws Laboratory, Copper
+konichiwa - plays Laboratory
+konichiwa - draws Estate, Copper
+konichiwa - plays 4 Copper
+konichiwa - buys Silver
+konichiwa - gains Silver
+konichiwa - applied Watchtower to place Silver on top of the deck
+konichiwa - draws Silver, Island, Copper, Curse, Copper
+ 
+---------- Ali Iskandar Othman: turn 9 ----------
+Ali Iskandar Othman - plays Watchtower
+Ali Iskandar Othman - draws Embargo, Curse
+Ali Iskandar Othman - plays 2 Copper
+Ali Iskandar Othman - buys Estate
+Ali Iskandar Othman - gains Estate
+Ali Iskandar Othman - draws Copper, Copper, Copper, Workshop, Curse
+ 
+---------- dikdik: turn 9 ----------
+dikdik - plays Embargo
+dikdik - embargoes Pirate Ship
+dikdik - trashes Embargo
+dikdik - plays 1 Silver, 1 Copper
+dikdik - buys Laboratory
+dikdik - gains Curse
+dikdik - applied Watchtower to trash Curse
+dikdik - trashes Curse
+dikdik - gains Curse
+dikdik - applied Watchtower to trash Curse
+dikdik - trashes Curse
+dikdik - gains Laboratory
+dikdik - applied Watchtower to place Laboratory on top of the deck
+dikdik - draws Laboratory, Copper, Estate, Copper
+dikdik - shuffles deck
+dikdik - draws Copper
+ 
+---------- sandyttc: turn 9 ----------
+sandyttc - plays Tactician
+sandyttc - discards: Copper, Copper, Estate, Estate
+sandyttc - draws Copper, Watchtower, Watchtower, Estate, Curse
+ 
+---------- konichiwa: turn 10 ----------
+konichiwa - plays Island
+konichiwa - sets aside Curse
+konichiwa - plays 2 Copper, 1 Silver
+konichiwa - buys Island
+konichiwa - gains Island
+konichiwa - draws Estate
+konichiwa - shuffles deck
+konichiwa - draws Island, Copper, Laboratory, Estate
+ 
+---------- Ali Iskandar Othman: turn 10 ----------
+Ali Iskandar Othman - plays Workshop
+Ali Iskandar Othman - gains Pirate Ship
+Ali Iskandar Othman - plays 3 Copper
+Ali Iskandar Othman - buys Watchtower
+Ali Iskandar Othman - gains Watchtower
+Ali Iskandar Othman - draws Copper, Pirate Ship, Curse, Copper, Pirate Ship
+ 
+---------- dikdik: turn 10 ----------
+dikdik - plays Laboratory
+dikdik - draws Copper, Witch
+dikdik - plays Witch
+dikdik - draws Silver, Estate
+sandyttc - gains Curse
+sandyttc - applied Watchtower to trash Curse
+sandyttc - trashes Curse
+konichiwa - gains Curse
+Ali Iskandar Othman - gains Curse
+dikdik - plays 4 Copper, 1 Silver
+dikdik - buys Gold
+dikdik - gains Gold
+dikdik - draws Estate, Laboratory, Watchtower, Watchtower, Copper
+ 
+---------- sandyttc: turn 10 ----------
+sandyttc - duration Tactician
+sandyttc - shuffles deck
+sandyttc - draws Estate, Copper, Witch, Copper, Copper
+sandyttc - plays Witch
+sandyttc - draws Estate, Copper
+konichiwa - gains Curse
+Ali Iskandar Othman - gains Curse
+dikdik - gains Curse
+dikdik - applied Watchtower to trash Curse
+dikdik - trashes Curse
+sandyttc - plays Watchtower
+sandyttc - plays 5 Copper
+sandyttc - buys Laboratory
+sandyttc - gains Curse
+sandyttc - applied Watchtower to trash Curse
+sandyttc - trashes Curse
+sandyttc - gains Curse
+sandyttc - applied Watchtower to trash Curse
+sandyttc - trashes Curse
+sandyttc - gains Laboratory
+sandyttc - applied Watchtower to place Laboratory on top of the deck
+sandyttc - draws Laboratory, Copper, Watchtower
+sandyttc - shuffles deck
+sandyttc - draws Copper, Curse
+ 
+---------- konichiwa: turn 11 ----------
+konichiwa - plays Laboratory
+konichiwa - draws Copper, Laboratory
+konichiwa - plays Laboratory
+konichiwa - draws Copper, Copper
+konichiwa - plays Island
+konichiwa - sets aside Estate
+konichiwa - plays 4 Copper
+konichiwa - buys Island
+konichiwa - gains Island
+konichiwa - draws Silver, Watchtower, Curse, Copper, Copper
+ 
+---------- Ali Iskandar Othman: turn 11 ----------
+Ali Iskandar Othman - plays Pirate Ship
+dikdik - reveals Curse
+dikdik - shuffles deck
+dikdik - reveals Copper
+Ali Iskandar Othman - trashes Copper
+dikdik - discards Curse
+sandyttc - reveals Watchtower, Copper
+Ali Iskandar Othman - trashes Copper
+sandyttc - discards Watchtower
+konichiwa - reveals Watchtower
+konichiwa - shuffles deck
+konichiwa - reveals Laboratory
+konichiwa - discards: Watchtower, Laboratory
+Ali Iskandar Othman - receives a pirate coin, now has 4 pirate coin(s)
+Ali Iskandar Othman - plays 2 Copper
+Ali Iskandar Othman - buys Native Village
+Ali Iskandar Othman - gains Native Village
+Ali Iskandar Othman - shuffles deck
+Ali Iskandar Othman - draws Copper, Estate, Copper, Curse, Workshop
+ 
+---------- dikdik: turn 11 ----------
+dikdik - plays Laboratory
+dikdik - draws Silver, Estate
+dikdik - plays Watchtower
+dikdik - draws Estate
+dikdik - plays 1 Copper, 1 Silver
+dikdik - buys Native Village
+dikdik - gains Native Village
+dikdik - applied Watchtower to place Native Village on top of the deck
+dikdik - draws Native Village, Laboratory, Copper, Gold, Copper
+ 
+---------- sandyttc: turn 11 ----------
+sandyttc - plays Laboratory
+sandyttc - draws Tactician, Estate
+sandyttc - plays Watchtower
+sandyttc - draws Estate
+sandyttc - plays 2 Copper
+sandyttc - buys Native Village
+sandyttc - gains Native Village
+sandyttc - draws Estate, Copper, Copper, Copper, Watchtower
+ 
+---------- konichiwa: turn 12 ----------
+konichiwa - plays Watchtower
+konichiwa - draws Estate, Copper
+konichiwa - plays 3 Copper, 1 Silver
+konichiwa - buys Tactician
+konichiwa - gains Tactician
+konichiwa - draws Curse, Island, Laboratory, Curse, Copper
+ 
+---------- Ali Iskandar Othman: turn 12 ----------
+Ali Iskandar Othman - plays Workshop
+Ali Iskandar Othman - gains Pirate Ship
+Ali Iskandar Othman - plays 2 Copper
+Ali Iskandar Othman - buys Estate
+Ali Iskandar Othman - gains Estate
+Ali Iskandar Othman - draws Copper, Embargo, Curse, Copper, Pirate Ship
+ 
+---------- dikdik: turn 12 ----------
+dikdik - plays Native Village
+dikdik - takes set aside cards: 
+dikdik - plays Laboratory
+dikdik - draws Copper, Witch
+dikdik - plays Witch
+dikdik - shuffles deck
+dikdik - draws Watchtower, Watchtower
+sandyttc - gains Curse
+sandyttc - applied Watchtower to trash Curse
+sandyttc - trashes Curse
+konichiwa - gains Curse
+Ali Iskandar Othman - gains Curse
+dikdik - plays Watchtower
+dikdik - draws Estate
+dikdik - plays 3 Copper, 1 Gold
+dikdik - buys Laboratory
+dikdik - gains Curse
+dikdik - applied Watchtower to trash Curse
+dikdik - trashes Curse
+dikdik - gains Curse
+dikdik - applied Watchtower to trash Curse
+dikdik - trashes Curse
+dikdik - gains Laboratory
+dikdik - applied Watchtower to place Laboratory on top of the deck
+dikdik - draws Laboratory, Estate, Curse, Copper, Laboratory
+ 
+---------- sandyttc: turn 12 ----------
+sandyttc - plays Watchtower
+sandyttc - draws Witch
+sandyttc - shuffles deck
+sandyttc - draws Watchtower
+sandyttc - plays 3 Copper
+sandyttc - buys Silver
+sandyttc - gains Silver
+sandyttc - applied Watchtower to place Silver on top of the deck
+sandyttc - draws Silver, Estate, Copper, Estate, Native Village
+ 
+---------- konichiwa: turn 13 ----------
+konichiwa - plays Laboratory
+konichiwa - draws Copper, Copper
+konichiwa - plays Island
+konichiwa - sets aside Curse
+konichiwa - plays 3 Copper
+konichiwa - buys Silver
+konichiwa - gains Silver
+konichiwa - shuffles deck
+konichiwa - draws Copper, Estate, Tactician, Watchtower, Silver
+ 
+---------- Ali Iskandar Othman: turn 13 ----------
+Ali Iskandar Othman - plays Pirate Ship
+dikdik - reveals Silver, Estate
+Ali Iskandar Othman - trashes Silver
+dikdik - discards Estate
+sandyttc - reveals Copper, Tactician
+Ali Iskandar Othman - trashes Copper
+sandyttc - discards Tactician
+konichiwa - reveals Curse, Silver
+Ali Iskandar Othman - trashes Silver
+konichiwa - discards Curse
+Ali Iskandar Othman - receives a pirate coin, now has 5 pirate coin(s)
+Ali Iskandar Othman - plays 2 Copper
+Ali Iskandar Othman - buys Estate
+Ali Iskandar Othman - gains Estate
+Ali Iskandar Othman - draws Curse, Estate, Copper, Pirate Ship, Watchtower
+ 
+---------- dikdik: turn 13 ----------
+dikdik - plays Laboratory
+dikdik - shuffles deck
+dikdik - draws Copper, Native Village
+dikdik - plays Native Village
+dikdik - takes set aside cards: 
+dikdik - plays Laboratory
+dikdik - draws Copper, Laboratory
+dikdik - plays Laboratory
+dikdik - draws Copper, Estate
+dikdik - plays 4 Copper
+dikdik - buys Silver
+dikdik - gains Silver
+dikdik - draws Gold, Witch, Watchtower, Estate, Watchtower
+ 
+---------- sandyttc: turn 13 ----------
+sandyttc - plays Native Village
+sandyttc - sets aside Watchtower
+sandyttc - plays 1 Silver, 1 Copper
+sandyttc - buys Silver
+sandyttc - gains Silver
+sandyttc - draws Laboratory, Curse
+sandyttc - shuffles deck
+sandyttc - draws Copper, Copper, Silver
+ 
+---------- konichiwa: turn 14 ----------
+konichiwa - plays Tactician
+konichiwa - discards: Copper, Estate, Watchtower, Silver
+konichiwa - draws Copper, Copper, Laboratory, Laboratory, Watchtower
+ 
+---------- Ali Iskandar Othman: turn 14 ----------
+Ali Iskandar Othman - plays Pirate Ship
+dikdik - shuffles deck
+dikdik - reveals Laboratory, Silver
+Ali Iskandar Othman - trashes Silver
+dikdik - discards Laboratory
+sandyttc - reveals Estate, Watchtower
+sandyttc - discards: Estate, Watchtower
+konichiwa - reveals Copper, Copper
+Ali Iskandar Othman - trashes Copper
+konichiwa - discards Copper
+Ali Iskandar Othman - receives a pirate coin, now has 6 pirate coin(s)
+Ali Iskandar Othman - plays 1 Copper
+Ali Iskandar Othman - draws Pirate Ship, Curse, Copper, Curse, Copper
+ 
+---------- dikdik: turn 14 ----------
+dikdik - plays Witch
+dikdik - draws Copper, Estate
+sandyttc - gains Curse
+konichiwa - gains Curse
+konichiwa - applied Watchtower to trash Curse
+konichiwa - trashes Curse
+Ali Iskandar Othman - gains Curse
+dikdik - plays 1 Gold, 1 Copper
+dikdik - buys Silver
+dikdik - gains Silver
+dikdik - applied Watchtower to place Silver on top of the deck
+dikdik - draws Silver, Copper, Curse, Laboratory, Native Village
+ 
+---------- sandyttc: turn 14 ----------
+sandyttc - plays Laboratory
+sandyttc - draws Estate, Witch
+sandyttc - plays Witch
+sandyttc - draws Native Village, Copper
+konichiwa - gains Curse
+konichiwa - applied Watchtower to trash Curse
+konichiwa - trashes Curse
+sandyttc - plays 3 Copper, 1 Silver
+sandyttc - buys Duchy
+sandyttc - gains Duchy
+sandyttc - draws Silver, Copper, Tactician, Watchtower, Estate
+ 
+---------- konichiwa: turn 15 ----------
+konichiwa - duration Tactician
+konichiwa - draws Copper, Curse, Curse
+konichiwa - shuffles deck
+konichiwa - draws Watchtower, Estate
+konichiwa - plays Laboratory
+konichiwa - draws Copper, Copper
+konichiwa - plays Laboratory
+konichiwa - draws Silver, Curse
+konichiwa - plays 5 Copper, 1 Silver
+konichiwa - buys Gold
+konichiwa - gains Gold
+konichiwa - applied Watchtower to place Gold on top of the deck
+konichiwa - draws Gold
+konichiwa - shuffles deck
+konichiwa - draws Copper, Copper, Curse, Silver
+ 
+---------- Ali Iskandar Othman: turn 15 ----------
+Ali Iskandar Othman - plays Pirate Ship
+Ali Iskandar Othman - takes 6 coins
+Ali Iskandar Othman - plays 2 Copper
+Ali Iskandar Othman - buys Province
+Ali Iskandar Othman - gains Province
+Ali Iskandar Othman - draws Native Village, Watchtower, Estate
+Ali Iskandar Othman - shuffles deck
+Ali Iskandar Othman - draws Estate, Curse
+ 
+---------- dikdik: turn 15 ----------
+dikdik - plays Native Village
+dikdik - takes set aside cards: 
+dikdik - plays Laboratory
+dikdik - draws Laboratory, Copper
+dikdik - plays Laboratory
+dikdik - draws Copper, Estate
+dikdik - plays 3 Copper, 1 Silver
+dikdik - buys Duchy
+dikdik - gains Duchy
+dikdik - shuffles deck
+dikdik - draws Witch, Duchy, Laboratory, Copper, Gold
+ 
+---------- sandyttc: turn 15 ----------
+sandyttc - plays Tactician
+sandyttc - discards: Silver, Copper, Watchtower, Estate
+sandyttc - shuffles deck
+sandyttc - draws Watchtower, Duchy, Curse, Copper, Laboratory
+ 
+---------- konichiwa: turn 16 ----------
+konichiwa - plays Silver
+konichiwa - plays 2 Copper, 1 Gold
+konichiwa - buys Gold
+konichiwa - gains Gold
+konichiwa - draws Watchtower, Curse, Estate, Tactician, Copper
+ 
+---------- Ali Iskandar Othman: turn 16 ----------
+Ali Iskandar Othman - plays Native Village
+Ali Iskandar Othman - takes set aside cards: 
+Ali Iskandar Othman - plays Watchtower
+Ali Iskandar Othman - draws Pirate Ship, Pirate Ship, Embargo
+Ali Iskandar Othman - plays Pirate Ship
+dikdik - reveals Copper, Curse
+Ali Iskandar Othman - trashes Copper
+dikdik - discards Curse
+sandyttc - reveals Silver, Estate
+Ali Iskandar Othman - trashes Silver
+sandyttc - discards Estate
+konichiwa - reveals Watchtower, Laboratory
+konichiwa - discards: Watchtower, Laboratory
+Ali Iskandar Othman - receives a pirate coin, now has 7 pirate coin(s)
+Ali Iskandar Othman - draws Copper, Estate, Curse, Copper, Estate
+ 
+---------- dikdik: turn 16 ----------
+dikdik - plays Laboratory
+dikdik - draws Laboratory, Watchtower
+dikdik - plays Laboratory
+dikdik - draws Native Village, Laboratory
+dikdik - plays Native Village
+dikdik - takes set aside cards: 
+dikdik - plays Laboratory
+dikdik - draws Estate, Estate
+dikdik - plays Witch
+dikdik - draws Silver, Copper
+dikdik - plays Watchtower
+dikdik - plays 2 Copper, 1 Gold, 1 Silver
+dikdik - buys Gold
+dikdik - gains Gold
+dikdik - draws Watchtower, Estate, Copper
+dikdik - shuffles deck
+dikdik - draws Laboratory, Duchy
+ 
+---------- sandyttc: turn 16 ----------
+sandyttc - duration Tactician
+sandyttc - draws Silver, Witch, Copper, Copper, Curse
+sandyttc - plays Laboratory
+sandyttc - draws Estate, Estate
+sandyttc - plays Witch
+sandyttc - draws Copper, Native Village
+sandyttc - plays Native Village
+sandyttc - sets aside Watchtower
+sandyttc - plays Watchtower
+sandyttc - plays 4 Copper, 1 Silver
+sandyttc - buys Gold
+sandyttc - gains Gold
+sandyttc - shuffles deck
+sandyttc - draws Copper, Copper, Duchy, Silver, Estate
+ 
+---------- konichiwa: turn 17 ----------
+konichiwa - plays Tactician
+konichiwa - discards: Watchtower, Curse, Estate, Copper
+konichiwa - draws Curse, Laboratory, Copper, Copper
+konichiwa - shuffles deck
+konichiwa - draws Watchtower
+ 
+---------- Ali Iskandar Othman: turn 17 ----------
+Ali Iskandar Othman - plays 2 Copper
+Ali Iskandar Othman - buys Native Village
+Ali Iskandar Othman - gains Native Village
+Ali Iskandar Othman - draws Copper, Curse, Curse, Estate, Watchtower
+ 
+---------- dikdik: turn 17 ----------
+dikdik - plays Laboratory
+dikdik - draws Copper, Laboratory
+dikdik - plays Laboratory
+dikdik - draws Gold, Gold
+dikdik - plays 2 Copper, 2 Gold
+dikdik - buys Province
+dikdik - gains Province
+dikdik - draws Watchtower, Estate, Witch, Curse, Copper
+ 
+---------- sandyttc: turn 17 ----------
+sandyttc - plays 2 Copper, 1 Silver
+sandyttc - buys Island
+sandyttc - gains Island
+sandyttc - draws Curse, Copper, Witch, Native Village, Tactician
+ 
+---------- konichiwa: turn 18 ----------
+konichiwa - duration Tactician
+konichiwa - draws Watchtower, Laboratory, Curse, Gold, Silver
+konichiwa - plays Laboratory
+konichiwa - draws Gold, Curse
+konichiwa - plays Laboratory
+konichiwa - draws Estate, Copper
+konichiwa - plays Watchtower
+konichiwa - plays Watchtower
+konichiwa - plays 3 Copper, 2 Gold, 1 Silver
+konichiwa - buys Province
+konichiwa - gains Province
+konichiwa - buys Silver
+konichiwa - gains Silver
+konichiwa - draws Copper, Copper
+konichiwa - shuffles deck
+konichiwa - draws Province, Curse, Curse
+ 
+---------- Ali Iskandar Othman: turn 18 ----------
+Ali Iskandar Othman - plays Watchtower
+Ali Iskandar Othman - draws Workshop, Copper
+Ali Iskandar Othman - plays 2 Copper
+Ali Iskandar Othman - buys Embargo
+Ali Iskandar Othman - gains Embargo
+Ali Iskandar Othman - draws Copper, Pirate Ship, Curse, Curse, Pirate Ship
+ 
+---------- dikdik: turn 18 ----------
+dikdik - plays Watchtower
+dikdik - draws Laboratory, Silver
+dikdik - plays 1 Copper, 1 Silver
+dikdik - buys Silver
+dikdik - gains Silver
+dikdik - draws Estate, Native Village
+dikdik - shuffles deck
+dikdik - draws Laboratory, Witch, Estate
+ 
+---------- sandyttc: turn 18 ----------
+sandyttc - plays Native Village
+sandyttc - sets aside Gold
+sandyttc - plays Witch
+sandyttc - draws Estate, Curse
+sandyttc - plays Tactician
+sandyttc - discards: Curse, Copper, Estate, Curse
+sandyttc - draws Estate, Copper, Laboratory, Watchtower
+sandyttc - shuffles deck
+sandyttc - draws Native Village
+ 
+---------- konichiwa: turn 19 ----------
+konichiwa - plays 2 Copper
+konichiwa - buys Native Village
+konichiwa - gains Native Village
+konichiwa - draws Estate, Curse, Silver, Copper, Laboratory
+ 
+---------- Ali Iskandar Othman: turn 19 ----------
+Ali Iskandar Othman - plays Pirate Ship
+Ali Iskandar Othman - takes 7 coins
+Ali Iskandar Othman - plays Copper
+Ali Iskandar Othman - buys Province
+Ali Iskandar Othman - gains Province
+Ali Iskandar Othman - draws Province, Curse, Copper, Copper
+Ali Iskandar Othman - shuffles deck
+Ali Iskandar Othman - draws Copper
+ 
+---------- dikdik: turn 19 ----------
+dikdik - plays Native Village
+dikdik - takes set aside cards: 
+dikdik - plays Witch
+dikdik - draws Silver, Copper
+dikdik - plays Laboratory
+dikdik - draws Copper, Gold
+dikdik - plays 2 Copper, 1 Silver, 1 Gold
+dikdik - buys Gold
+dikdik - gains Gold
+dikdik - draws Watchtower, Duchy, Watchtower, Silver, Copper
+ 
+---------- sandyttc: turn 19 ----------
+sandyttc - duration Tactician
+sandyttc - draws Witch, Curse, Island, Copper, Copper
+sandyttc - plays Laboratory
+sandyttc - draws Curse, Estate
+sandyttc - plays Native Village
+sandyttc - takes set aside cards: Watchtower, Watchtower, Gold
+sandyttc - plays Island
+sandyttc - sets aside Curse
+sandyttc - plays Witch
+sandyttc - draws Estate, Duchy
+sandyttc - plays Watchtower
+sandyttc - plays 3 Copper, 1 Gold
+sandyttc - buys Duchy
+sandyttc - gains Duchy
+sandyttc - applied Watchtower to place Duchy on top of the deck
+sandyttc - draws Duchy, Silver, Copper
+sandyttc - shuffles deck
+sandyttc - draws Copper, Tactician
+ 
+---------- konichiwa: turn 20 ----------
+konichiwa - plays Laboratory
+konichiwa - draws Tactician, Gold
+konichiwa - plays 1 Silver, 1 Copper, 1 Gold
+konichiwa - buys Gold
+konichiwa - gains Gold
+konichiwa - draws Copper, Copper, Watchtower, Laboratory, Silver
+ 
+---------- Ali Iskandar Othman: turn 20 ----------
+Ali Iskandar Othman - plays 3 Copper
+Ali Iskandar Othman - buys Native Village
+Ali Iskandar Othman - gains Native Village
+Ali Iskandar Othman - draws Copper, Estate, Province, Pirate Ship, Estate
+ 
+---------- dikdik: turn 20 ----------
+dikdik - plays Watchtower
+dikdik - draws Curse, Gold
+dikdik - plays 1 Silver, 1 Copper, 1 Gold
+dikdik - buys Duchy
+dikdik - gains Duchy
+dikdik - draws Province, Estate, Laboratory, Laboratory
+dikdik - shuffles deck
+dikdik - draws Estate
+ 
+---------- sandyttc: turn 20 ----------
+sandyttc - plays Tactician
+sandyttc - discards: Duchy, Silver, Copper, Copper
+sandyttc - draws Curse, Watchtower, Estate, Estate, Copper
+ 
+---------- konichiwa: turn 21 ----------
+konichiwa - plays Laboratory
+konichiwa - draws Watchtower, Gold
+konichiwa - plays Watchtower
+konichiwa - shuffles deck
+konichiwa - draws Province
+konichiwa - plays 2 Copper, 1 Silver, 1 Gold
+konichiwa - buys Gold
+konichiwa - gains Gold
+konichiwa - applied Watchtower to place Gold on top of the deck
+konichiwa - draws Gold, Curse, Estate, Tactician, Gold
+ 
+---------- Ali Iskandar Othman: turn 21 ----------
+Ali Iskandar Othman - plays Pirate Ship
+Ali Iskandar Othman - takes 7 coins
+Ali Iskandar Othman - plays 1 Copper
+Ali Iskandar Othman - buys Province
+Ali Iskandar Othman - gains Province
+Ali Iskandar Othman - draws Curse, Copper, Estate, Curse, Pirate Ship
+ 
+---------- dikdik: turn 21 ----------
+dikdik - plays Laboratory
+dikdik - draws Watchtower, Silver
+dikdik - plays Laboratory
+dikdik - draws Silver, Gold
+dikdik - plays Watchtower
+dikdik - plays 2 Silver, 1 Gold
+dikdik - buys Duchy
+dikdik - gains Duchy
+dikdik - draws Copper, Duchy, Laboratory, Curse, Gold
+ 
+---------- sandyttc: turn 21 ----------
+sandyttc - duration Tactician
+sandyttc - draws Watchtower, Duchy, Watchtower, Native Village, Estate
+sandyttc - plays Native Village
+sandyttc - takes set aside cards: 
+sandyttc - plays Watchtower
+sandyttc - plays Watchtower
+sandyttc - plays Watchtower
+sandyttc - plays 1 Copper
+sandyttc - draws Witch, Laboratory, Copper, Gold
+sandyttc - shuffles deck
+sandyttc - draws Curse
+ 
+---------- konichiwa: turn 22 ----------
+konichiwa - plays 2 Gold
+konichiwa - buys Island
+konichiwa - gains Island
+konichiwa - draws Curse, Copper, Laboratory, Copper, Gold
+ 
+---------- Ali Iskandar Othman: turn 22 ----------
+Ali Iskandar Othman - plays Pirate Ship
+Ali Iskandar Othman - takes 7 coins
+Ali Iskandar Othman - plays Copper
+Ali Iskandar Othman - buys Province
+Ali Iskandar Othman - gains Province
+Ali Iskandar Othman - draws Curse, Pirate Ship, Embargo, Copper, Native Village
+ 
+---------- dikdik: turn 22 ----------
+dikdik - plays Laboratory
+dikdik - draws Copper, Estate
+dikdik - plays 2 Copper, 1 Gold
+dikdik - buys Duchy
+dikdik - gains Duchy
+dikdik - draws Gold, Native Village, Watchtower, Duchy, Witch
+ 
+---------- sandyttc: turn 22 ----------
+sandyttc - plays Laboratory
+sandyttc - draws Watchtower, Estate
+sandyttc - plays Witch
+sandyttc - draws Silver, Watchtower
+sandyttc - plays 1 Copper, 1 Gold, 1 Silver
+sandyttc - buys Duchy
+sandyttc - gains Duchy
+sandyttc - draws Native Village, Estate, Tactician, Copper, Duchy
+ 
+---------- konichiwa: turn 23 ----------
+konichiwa - plays Laboratory
+konichiwa - draws Curse, Silver
+konichiwa - plays 2 Copper, 1 Gold, 1 Silver
+konichiwa - buys Duchy
+konichiwa - gains Duchy
+konichiwa - draws Native Village, Copper
+konichiwa - shuffles deck
+konichiwa - draws Copper, Island, Copper
+ 
+---------- Ali Iskandar Othman: turn 23 ----------
+Ali Iskandar Othman - plays Pirate Ship
+Ali Iskandar Othman - takes 7 coins
+Ali Iskandar Othman - plays Copper
+Ali Iskandar Othman - buys Province
+Ali Iskandar Othman - gains Province
+Ali Iskandar Othman - draws Watchtower, Curse, Copper, Watchtower, Curse
+ 
+---------- dikdik: turn 23 ----------
+dikdik - plays Native Village
+dikdik - takes set aside cards: 
+dikdik - plays Watchtower
+dikdik - draws Copper
+dikdik - shuffles deck
+dikdik - draws Duchy, Laboratory
+dikdik - plays Laboratory
+dikdik - draws Province, Estate
+dikdik - plays Witch
+dikdik - draws Watchtower, Laboratory
+dikdik - plays 1 Gold, 1 Copper
+dikdik - buys Island
+dikdik - gains Island
+dikdik - applied Watchtower to place Island on top of the deck
+dikdik - draws Island, Duchy, Copper, Duchy, Gold
+ 
+---------- sandyttc: turn 23 ----------
+sandyttc - plays Native Village
+sandyttc - takes set aside cards: 
+sandyttc - plays Tactician
+sandyttc - discards: Estate, Copper, Duchy
+sandyttc - draws Watchtower, Copper, Duchy, Estate, Copper
+ 
+---------- konichiwa: turn 24 ----------
+konichiwa - plays Native Village
+konichiwa - takes set aside cards: 
+konichiwa - plays Island
+konichiwa - sets aside Copper
+konichiwa - plays 2 Copper
+konichiwa - buys Estate
+konichiwa - gains Estate
+konichiwa - draws Province, Tactician, Copper, Curse, Laboratory
+ 
+---------- Ali Iskandar Othman: turn 24 ----------
+Ali Iskandar Othman - plays Watchtower
+Ali Iskandar Othman - draws Workshop, Estate
+Ali Iskandar Othman - draws Pirate Ship, Embargo, Estate, Native Village, Curse
+ 
+---------- dikdik: turn 24 ----------
+dikdik - plays Island
+dikdik - sets aside Duchy
+dikdik - plays 1 Copper, 1 Gold
+dikdik - buys Island
+dikdik - gains Island
+dikdik - draws Estate, Estate, Gold, Copper, Silver
+ 
+---------- sandyttc: turn 24 ----------
+sandyttc - duration Tactician
+sandyttc - shuffles deck
+sandyttc - draws Curse, Watchtower, Estate, Duchy, Watchtower
+sandyttc - plays Watchtower
+sandyttc - plays Watchtower
+sandyttc - plays 2 Copper
+sandyttc - buys Estate
+sandyttc - gains Estate
+sandyttc - draws Laboratory, Witch, Copper, Gold, Duchy
+ 
+---------- konichiwa: turn 25 ----------
+konichiwa - plays Tactician
+konichiwa - discards: Province, Copper, Curse, Laboratory
+konichiwa - draws Curse, Watchtower, Gold, Laboratory, Gold
+ 
+---------- Ali Iskandar Othman: turn 25 ----------
+Ali Iskandar Othman - plays Native Village
+Ali Iskandar Othman - takes set aside cards: 
+Ali Iskandar Othman - plays Embargo
+Ali Iskandar Othman - embargoes Duchy
+Ali Iskandar Othman - trashes Embargo
+Ali Iskandar Othman - plays Pirate Ship
+Ali Iskandar Othman - takes 7 coins
+Ali Iskandar Othman - buys Province
+Ali Iskandar Othman - gains Province
+Ali Iskandar Othman - shuffles deck
+Ali Iskandar Othman - draws Curse, Curse, Curse, Copper, Estate
+ 
+---------- dikdik: turn 25 ----------
+dikdik - plays 1 Gold, 1 Copper, 1 Silver
+dikdik - buys Duchy
+dikdik - gains Duchy
+dikdik - draws Silver, Curse, Laboratory
+dikdik - shuffles deck
+dikdik - draws Copper, Duchy
+ 
+---------- sandyttc: turn 25 ----------
+sandyttc - plays Laboratory
+sandyttc - draws Native Village, Copper
+sandyttc - plays Witch
+sandyttc - draws Silver, Estate
+sandyttc - plays 2 Copper, 1 Gold, 1 Silver
+sandyttc - buys Duchy
+sandyttc - gains Duchy
+sandyttc - shuffles deck
+sandyttc - draws Estate, Duchy, Watchtower, Silver, Copper
+ 
+---------- konichiwa: turn 26 ----------
+konichiwa - duration Tactician
+konichiwa - draws Gold, Estate, Silver, Copper, Gold
+konichiwa - plays Laboratory
+konichiwa - draws Duchy, Silver
+konichiwa - plays Watchtower
+konichiwa - plays 4 Gold, 2 Silver, 1 Copper
+konichiwa - buys Province
+konichiwa - gains Province
+konichiwa - buys Province
+konichiwa - gains Province
+konichiwa - draws Curse, Watchtower
+konichiwa - shuffles deck
+konichiwa - draws Native Village, Gold, Tactician
+ 
+---------- Ali Iskandar Othman: turn 26 ----------
+Ali Iskandar Othman - plays 1 Copper
+Ali Iskandar Othman - draws Curse, Province, Native Village, Copper, Province
+ 
+---------- dikdik: turn 26 ----------
+dikdik - plays Laboratory
+dikdik - draws Estate, Gold
+dikdik - plays 1 Silver, 1 Copper, 1 Gold
+dikdik - buys Duchy
+dikdik - gains Duchy
+dikdik - draws Silver, Estate, Duchy, Witch, Island
+ 
+---------- sandyttc: turn 26 ----------
+sandyttc - plays Watchtower
+sandyttc - draws Copper, Curse
+sandyttc - plays 2 Copper, 1 Silver
+sandyttc - buys Estate
+sandyttc - gains Estate
+sandyttc - draws Estate, Gold, Witch, Native Village, Copper
+ 
+---------- konichiwa: turn 27 ----------
+konichiwa - plays Tactician
+konichiwa - discards: Curse, Watchtower, Native Village, Gold
+konichiwa - draws Laboratory, Watchtower, Gold, Province, Silver
+ 
+---------- Ali Iskandar Othman: turn 27 ----------
+Ali Iskandar Othman - plays Native Village
+Ali Iskandar Othman - takes set aside cards: 
+Ali Iskandar Othman - draws Estate, Curse, Watchtower, Estate, Copper
+ 
+---------- dikdik: turn 27 ----------
+dikdik - plays Witch
+dikdik - draws Estate, Province
+dikdik - plays 1 Silver
+dikdik - buys Estate
+dikdik - gains Estate
+dikdik - draws Watchtower, Gold, Duchy, Copper, Duchy
+ 
+---------- sandyttc: turn 27 ----------
+sandyttc - plays Witch
+sandyttc - draws Laboratory, Duchy
+sandyttc - plays 1 Gold, 1 Copper
+sandyttc - buys Island
+sandyttc - gains Island
+sandyttc - draws Estate, Duchy, Estate, Duchy, Watchtower
+ 
+---------- konichiwa: turn 28 ----------
+konichiwa - duration Tactician
+konichiwa - draws Gold, Curse, Estate, Copper, Estate
+konichiwa - plays Laboratory
+konichiwa - draws Copper, Curse
+konichiwa - plays Watchtower
+konichiwa - plays 2 Gold, 2 Copper, 1 Silver
+konichiwa - buys Province
+konichiwa - gains Province
+konichiwa - buys Estate
+konichiwa - gains Estate
+konichiwa - draws Copper, Silver, Duchy, Province, Province
+ 
+---------- Ali Iskandar Othman: turn 28 ----------
+Ali Iskandar Othman - plays Watchtower
+Ali Iskandar Othman - draws Copper, Pirate Ship
+Ali Iskandar Othman - plays 2 Copper
+Ali Iskandar Othman - buys Estate
+Ali Iskandar Othman - gains Estate
+Ali Iskandar Othman - draws Province, Copper, Workshop, Watchtower, Province
+ 
+---------- dikdik: turn 28 ----------
+dikdik - plays Watchtower
+dikdik - draws Watchtower, Gold
+dikdik - plays 2 Gold, 1 Copper
+dikdik - buys Duchy
+dikdik - gains Duchy
+dikdik - applied Watchtower to place Duchy on top of the deck
+dikdik - draws Duchy, Native Village, Laboratory, Copper, Laboratory
+ 
+---------- sandyttc: turn 28 ----------
+sandyttc - plays Watchtower
+sandyttc - draws Tactician, Copper
+sandyttc - plays Copper
+sandyttc - draws Watchtower
+sandyttc - shuffles deck
+sandyttc - draws Copper, Estate, Silver, Estate
+ 
+---------- konichiwa: turn 29 ----------
+konichiwa - plays 1 Copper, 1 Silver
+konichiwa - buys Watchtower
+konichiwa - gains Watchtower
+konichiwa - draws Laboratory, Copper, Gold
+konichiwa - shuffles deck
+konichiwa - draws Estate, Native Village
+ 
+------------ Game Over ------------
+Ali Iskandar Othman - cards: 4 Pirate Ship, 3 Native Village, 2 Watchtower, 1 Island, 1 Workshop, 1 Embargo, 7 Copper, 7 Estate, 6 Province, 7 Curse
+Ali Iskandar Othman - total victory points: 38
+Ali Iskandar Othman - turns: 28
+ 
+konichiwa - cards: 5 Island, 3 Watchtower, 2 Laboratory, 1 Native Village, 1 Tactician, 5 Copper, 4 Gold, 2 Silver, 5 Estate, 4 Province, 1 Duchy, 5 Curse
+konichiwa - total victory points: 37
+konichiwa - turns: 29
+ 
+dikdik - cards: 3 Laboratory, 2 Island, 2 Watchtower, 1 Native Village, 1 Witch, 3 Copper, 3 Gold, 2 Silver, 7 Duchy, 4 Estate, 1 Province, 1 Curse
+dikdik - total victory points: 34
+dikdik - turns: 28
+ 
+sandyttc - cards: 3 Island, 3 Watchtower, 1 Native Village, 1 Witch, 1 Laboratory, 1 Tactician, 5 Copper, 1 Silver, 1 Gold, 5 Estate, 4 Duchy, 2 Curse
+sandyttc - total victory points: 21
+sandyttc - turns: 28
+ 
+1st place: Ali Iskandar Othman
+2nd place: konichiwa
+3rd place: dikdik
+4th place: sandyttc
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.514b28bee4b0b79c883b5a60.1364852529283.txt b/testing/testdata/log.514b28bee4b0b79c883b5a60.1364852529283.txt
new file mode 100644
index 0000000..f4d365e
--- /dev/null
+++ b/testing/testdata/log.514b28bee4b0b79c883b5a60.1364852529283.txt
@@ -0,0 +1,539 @@
+------------ Game Setup ------------
+Supply cards: Vineyard, Forager, Lookout, Navigator, Procession, Festival, Mine, Stables, Nobles, Possession, Copper, Silver, Gold, Estate, Duchy, Province, Curse, Potion
+Hazardous_Lazarus - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Flina - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Hazardous_Lazarus - shuffles deck
+Flina - shuffles deck
+Hazardous_Lazarus - draws Copper, Copper, Estate, Copper, Copper
+Flina - draws Copper, Copper, Copper, Copper, Copper
+ 
+---------- Hazardous_Lazarus: turn 1 ----------
+Hazardous_Lazarus - plays 4 Copper
+Hazardous_Lazarus - buys Navigator
+Hazardous_Lazarus - gains Navigator
+Hazardous_Lazarus - draws Copper, Copper, Copper, Estate, Estate
+ 
+---------- Flina: turn 1 ----------
+Flina - plays 5 Copper
+Flina - buys Stables
+Flina - gains Stables
+Flina - draws Estate, Estate, Copper, Estate, Copper
+ 
+---------- Hazardous_Lazarus: turn 2 ----------
+Hazardous_Lazarus - plays 3 Copper
+Hazardous_Lazarus - buys Silver
+Hazardous_Lazarus - gains Silver
+Hazardous_Lazarus - shuffles deck
+Hazardous_Lazarus - draws Copper, Copper, Estate, Copper, Silver
+ 
+---------- Flina: turn 2 ----------
+Flina - shuffles deck
+Flina - draws Estate, Copper, Stables, Copper, Copper
+ 
+---------- Hazardous_Lazarus: turn 3 ----------
+Hazardous_Lazarus - plays 3 Copper, 1 Silver
+Hazardous_Lazarus - buys Festival
+Hazardous_Lazarus - gains Festival
+Hazardous_Lazarus - draws Copper, Estate, Estate, Navigator, Copper
+ 
+---------- Flina: turn 3 ----------
+Flina - plays Stables
+Flina - discards Copper
+Flina - draws Copper, Estate, Estate
+Flina - plays 3 Copper
+Flina - buys Forager
+Flina - gains Forager
+Flina - draws Copper, Copper, Copper
+Flina - shuffles deck
+Flina - draws Copper, Estate
+ 
+---------- Hazardous_Lazarus: turn 4 ----------
+Hazardous_Lazarus - plays Navigator
+Hazardous_Lazarus - looks at Copper, Copper
+Hazardous_Lazarus - shuffles deck
+Hazardous_Lazarus - looks at Festival, Copper, Copper
+Hazardous_Lazarus - places Festival on top of deck
+Hazardous_Lazarus - places Copper on top of deck
+Hazardous_Lazarus - places Copper on top of deck
+Hazardous_Lazarus - places Copper on top of deck
+Hazardous_Lazarus - places Copper on top of deck
+Hazardous_Lazarus - plays 2 Copper
+Hazardous_Lazarus - buys Procession
+Hazardous_Lazarus - gains Procession
+Hazardous_Lazarus - draws Copper, Copper, Copper, Copper, Festival
+ 
+---------- Flina: turn 4 ----------
+Flina - plays 4 Copper
+Flina - buys Silver
+Flina - gains Silver
+Flina - draws Estate, Copper, Forager, Copper, Copper
+ 
+---------- Hazardous_Lazarus: turn 5 ----------
+Hazardous_Lazarus - plays Festival
+Hazardous_Lazarus - plays 4 Copper
+Hazardous_Lazarus - buys Nobles
+Hazardous_Lazarus - gains Nobles
+Hazardous_Lazarus - draws Estate, Copper, Silver
+Hazardous_Lazarus - shuffles deck
+Hazardous_Lazarus - draws Festival, Estate
+ 
+---------- Flina: turn 5 ----------
+Flina - plays Forager
+Flina - trashes Estate
+Flina - plays 3 Copper
+Flina - buys Forager
+Flina - gains Forager
+Flina - draws Stables, Estate
+Flina - shuffles deck
+Flina - draws Copper, Copper, Forager
+ 
+---------- Hazardous_Lazarus: turn 6 ----------
+Hazardous_Lazarus - plays Festival
+Hazardous_Lazarus - plays 1 Copper, 1 Silver
+Hazardous_Lazarus - buys Potion
+Hazardous_Lazarus - gains Potion
+Hazardous_Lazarus - draws Copper, Navigator, Copper, Procession, Nobles
+ 
+---------- Flina: turn 6 ----------
+Flina - plays Stables
+Flina - discards Copper
+Flina - draws Copper, Forager, Copper
+Flina - plays Forager
+Flina - trashes Estate
+Flina - plays Forager
+Flina - trashes Copper
+Flina - plays 2 Copper
+Flina - buys Silver
+Flina - gains Silver
+Flina - draws Copper, Copper, Estate, Copper, Silver
+ 
+---------- Hazardous_Lazarus: turn 7 ----------
+Hazardous_Lazarus - plays Procession
+Hazardous_Lazarus - plays Navigator
+Hazardous_Lazarus - looks at Estate, Copper, Copper, Copper, Copper
+Hazardous_Lazarus - discards: Estate, Copper, Copper, Copper, Copper
+Hazardous_Lazarus - plays Navigator
+Hazardous_Lazarus - shuffles deck
+Hazardous_Lazarus - looks at Estate, Festival, Copper, Copper, Copper
+Hazardous_Lazarus - places Festival on top of deck
+Hazardous_Lazarus - places Copper on top of deck
+Hazardous_Lazarus - places Copper on top of deck
+Hazardous_Lazarus - places Copper on top of deck
+Hazardous_Lazarus - places Estate on top of deck
+Hazardous_Lazarus - trashes Navigator
+Hazardous_Lazarus - gains Mine
+Hazardous_Lazarus - plays 2 Copper
+Hazardous_Lazarus - buys Gold
+Hazardous_Lazarus - gains Gold
+Hazardous_Lazarus - draws Estate, Copper, Copper, Copper, Festival
+ 
+---------- Flina: turn 7 ----------
+Flina - plays 3 Copper, 1 Silver
+Flina - buys Festival
+Flina - gains Festival
+Flina - shuffles deck
+Flina - draws Festival, Copper, Copper, Silver, Silver
+ 
+---------- Hazardous_Lazarus: turn 8 ----------
+Hazardous_Lazarus - plays Festival
+Hazardous_Lazarus - plays 3 Copper
+Hazardous_Lazarus - buys Potion
+Hazardous_Lazarus - gains Potion
+Hazardous_Lazarus - draws Potion, Copper, Copper, Silver, Estate
+ 
+---------- Flina: turn 8 ----------
+Flina - plays Festival
+Flina - plays 2 Copper, 2 Silver
+Flina - buys Nobles
+Flina - gains Nobles
+Flina - draws Copper, Forager, Copper, Copper, Copper
+ 
+---------- Hazardous_Lazarus: turn 9 ----------
+Hazardous_Lazarus - plays 2 Copper, 1 Potion, 1 Silver
+Hazardous_Lazarus - buys Navigator
+Hazardous_Lazarus - gains Navigator
+Hazardous_Lazarus - draws Estate
+Hazardous_Lazarus - shuffles deck
+Hazardous_Lazarus - draws Copper, Silver, Gold, Copper
+ 
+---------- Flina: turn 9 ----------
+Flina - plays Forager
+Flina - trashes Copper
+Flina - plays 3 Copper
+Flina - buys Potion
+Flina - gains Potion
+Flina - draws Stables, Estate, Forager
+Flina - shuffles deck
+Flina - draws Forager, Copper
+ 
+---------- Hazardous_Lazarus: turn 10 ----------
+Hazardous_Lazarus - plays 2 Copper, 1 Silver, 1 Gold
+Hazardous_Lazarus - buys Gold
+Hazardous_Lazarus - gains Gold
+Hazardous_Lazarus - draws Copper, Copper, Copper, Copper, Potion
+ 
+---------- Flina: turn 10 ----------
+Flina - plays Stables
+Flina - discards Copper
+Flina - draws Potion, Silver, Festival
+Flina - plays Festival
+Flina - plays Forager
+Flina - trashes Estate
+Flina - plays Forager
+Flina - trashes Silver
+Flina - plays 1 Potion
+Flina - buys Festival
+Flina - gains Festival
+Flina - draws Copper, Copper, Silver, Copper, Nobles
+ 
+---------- Hazardous_Lazarus: turn 11 ----------
+Hazardous_Lazarus - plays 4 Copper, 1 Potion
+Hazardous_Lazarus - buys Navigator
+Hazardous_Lazarus - gains Navigator
+Hazardous_Lazarus - draws Navigator, Mine, Procession, Estate, Potion
+ 
+---------- Flina: turn 11 ----------
+Flina - plays Nobles
+Flina - draws Copper
+Flina - shuffles deck
+Flina - draws Stables, Festival
+Flina - plays 4 Copper, 1 Silver
+Flina - buys Nobles
+Flina - gains Nobles
+Flina - draws Copper, Forager, Potion, Festival, Forager
+ 
+---------- Hazardous_Lazarus: turn 12 ----------
+Hazardous_Lazarus - plays Procession
+Hazardous_Lazarus - plays Navigator
+Hazardous_Lazarus - looks at Copper, Estate, Nobles, Festival
+Hazardous_Lazarus - shuffles deck
+Hazardous_Lazarus - looks at Gold
+Hazardous_Lazarus - places Nobles on top of deck
+Hazardous_Lazarus - places Festival on top of deck
+Hazardous_Lazarus - places Copper on top of deck
+Hazardous_Lazarus - places Estate on top of deck
+Hazardous_Lazarus - places Gold on top of deck
+Hazardous_Lazarus - plays Navigator
+Hazardous_Lazarus - looks at Gold, Estate, Copper, Festival, Nobles
+Hazardous_Lazarus - places Gold on top of deck
+Hazardous_Lazarus - places Estate on top of deck
+Hazardous_Lazarus - places Copper on top of deck
+Hazardous_Lazarus - places Festival on top of deck
+Hazardous_Lazarus - places Nobles on top of deck
+Hazardous_Lazarus - trashes Navigator
+Hazardous_Lazarus - gains Festival
+Hazardous_Lazarus - buys Navigator
+Hazardous_Lazarus - gains Navigator
+Hazardous_Lazarus - draws Nobles, Festival, Copper, Estate, Gold
+ 
+---------- Flina: turn 12 ----------
+Flina - plays Festival
+Flina - plays Forager
+Flina - trashes Copper
+Flina - plays 1 Potion
+Flina - buys Procession
+Flina - gains Procession
+Flina - shuffles deck
+Flina - draws Copper, Copper, Forager, Stables, Procession
+ 
+---------- Hazardous_Lazarus: turn 13 ----------
+Hazardous_Lazarus - plays Festival
+Hazardous_Lazarus - plays Nobles
+Hazardous_Lazarus - draws Potion, Copper, Copper
+Hazardous_Lazarus - plays 3 Copper, 1 Gold, 1 Potion
+Hazardous_Lazarus - buys Possession
+Hazardous_Lazarus - gains Possession
+Hazardous_Lazarus - draws Copper, Copper, Silver, Gold, Navigator
+ 
+---------- Flina: turn 13 ----------
+Flina - plays Procession
+Flina - plays Stables
+Flina - discards Copper
+Flina - draws Silver, Festival, Forager
+Flina - plays Stables
+Flina - discards Copper
+Flina - draws Copper, Nobles, Nobles
+Flina - trashes Stables
+Flina - gains Nobles
+Flina - plays Festival
+Flina - plays Nobles
+Flina - draws Festival, Copper, Potion
+Flina - plays Festival
+Flina - plays Nobles
+Flina - shuffles deck
+Flina - draws Copper, Copper, Nobles
+Flina - plays Forager
+Flina - trashes Copper
+Flina - plays Forager
+Flina - trashes Copper
+Flina - plays Nobles
+Flina - plays 2 Copper, 1 Silver, 1 Potion
+Flina - buys Possession
+Flina - gains Possession
+Flina - buys Gold
+Flina - gains Gold
+Flina - shuffles deck
+Flina - draws Copper, Forager, Nobles, Festival, Nobles
+ 
+---------- Hazardous_Lazarus: turn 14 ----------
+Hazardous_Lazarus - plays Navigator
+Hazardous_Lazarus - looks at Copper, Copper, Estate
+Hazardous_Lazarus - shuffles deck
+Hazardous_Lazarus - looks at Procession, Potion
+Hazardous_Lazarus - discards: Copper, Copper, Estate, Procession, Potion
+Hazardous_Lazarus - plays 2 Copper, 1 Silver, 1 Gold
+Hazardous_Lazarus - buys Province
+Hazardous_Lazarus - gains Province
+Hazardous_Lazarus - draws Navigator, Estate, Festival, Nobles, Possession
+ 
+---------- Flina: turn 14 ----------
+Flina - plays Festival
+Flina - plays Nobles
+Flina - draws Copper, Nobles, Gold
+Flina - plays Nobles
+Flina - takes 2 actions
+Flina - plays Nobles
+Flina - draws Potion, Festival, Silver
+Flina - plays Festival
+Flina - plays Forager
+Flina - trashes Copper
+Flina - plays 1 Copper, 1 Gold, 1 Potion, 1 Silver
+Flina - buys Province
+Flina - gains Province
+Flina - buys Procession
+Flina - gains Procession
+Flina - draws Forager, Procession, Possession
+Flina - shuffles deck
+Flina - draws Silver, Potion
+ 
+---------- Hazardous_Lazarus: turn 15 ----------
+Hazardous_Lazarus - plays Festival
+Hazardous_Lazarus - plays Nobles
+Hazardous_Lazarus - draws Gold, Copper, Potion
+Hazardous_Lazarus - plays Possession
+Hazardous_Lazarus - plays 1 Gold, 1 Copper, 1 Potion
+Hazardous_Lazarus - buys Gold
+Hazardous_Lazarus - gains Gold
+Hazardous_Lazarus - draws Copper, Estate, Copper, Festival, Mine
+ 
+---------- Flina: turn 15 [possessed] ----------
+Flina - plays Procession
+Flina - plays Forager
+Flina - trashes Possession
+Flina - plays Forager
+Flina - trashes Potion
+Flina - trashes Forager
+Hazardous_Lazarus - gains Navigator
+Flina - plays 1 Silver
+Flina - buys Gold
+Hazardous_Lazarus - gains Gold
+Flina - draws Festival, Gold, Nobles, Province, Forager
+ 
+---------- Flina: turn 15 ----------
+Flina - plays Festival
+Flina - plays Nobles
+Flina - draws Nobles, Procession, Copper
+Flina - plays Forager
+Flina - trashes Copper
+Flina - plays Nobles
+Flina - draws Festival, Nobles
+Flina - shuffles deck
+Flina - draws Forager
+Flina - plays 1 Gold
+Flina - buys Gold
+Flina - gains Gold
+Flina - draws Silver, Procession, Possession, Potion
+Flina - shuffles deck
+Flina - draws Nobles
+ 
+---------- Hazardous_Lazarus: turn 16 ----------
+Hazardous_Lazarus - plays Festival
+Hazardous_Lazarus - plays Mine
+Hazardous_Lazarus - trashes Copper
+Hazardous_Lazarus - gains Silver
+Hazardous_Lazarus - plays 1 Copper, 1 Silver
+Hazardous_Lazarus - buys Festival
+Hazardous_Lazarus - gains Festival
+Hazardous_Lazarus - shuffles deck
+Hazardous_Lazarus - draws Gold, Navigator, Procession, Copper, Possession
+ 
+---------- Flina: turn 16 ----------
+Flina - plays Possession
+Flina - plays 1 Silver, 1 Potion
+Flina - buys Vineyard
+Flina - gains Vineyard
+Flina - draws Forager, Festival, Forager, Nobles, Gold
+ 
+---------- Hazardous_Lazarus: turn 17 [possessed] ----------
+Hazardous_Lazarus - plays Procession
+Hazardous_Lazarus - plays Navigator
+Hazardous_Lazarus - looks at Estate, Potion, Potion, Festival, Copper
+Hazardous_Lazarus - discards: Estate, Potion, Potion, Festival, Copper
+Hazardous_Lazarus - plays Navigator
+Hazardous_Lazarus - looks at Festival, Estate, Gold, Gold, Festival
+Hazardous_Lazarus - discards: Festival, Estate, Gold, Gold, Festival
+Hazardous_Lazarus - trashes Navigator
+Flina - gains Festival
+Hazardous_Lazarus - plays 1 Gold, 1 Copper
+Hazardous_Lazarus - buys Province
+Flina - gains Province
+Hazardous_Lazarus - draws Mine, Province, Copper, Copper, Copper
+ 
+---------- Hazardous_Lazarus: turn 17 ----------
+Hazardous_Lazarus - plays Mine
+Hazardous_Lazarus - trashes Copper
+Hazardous_Lazarus - gains Silver
+Hazardous_Lazarus - plays 2 Copper, 1 Silver
+Hazardous_Lazarus - buys Procession
+Hazardous_Lazarus - gains Procession
+Hazardous_Lazarus - draws Navigator, Estate, Silver, Silver, Navigator
+ 
+---------- Flina: turn 17 ----------
+Flina - plays Festival
+Flina - plays Nobles
+Flina - draws Procession, Festival, Province
+Flina - plays Festival
+Flina - plays 1 Gold
+Flina - buys Nobles
+Flina - gains Nobles
+Flina - draws Nobles, Gold
+Flina - shuffles deck
+Flina - draws Festival, Province, Procession
+ 
+---------- Hazardous_Lazarus: turn 18 ----------
+Hazardous_Lazarus - plays Navigator
+Hazardous_Lazarus - looks at Nobles, Gold, Copper
+Hazardous_Lazarus - shuffles deck
+Hazardous_Lazarus - looks at Festival, Gold
+Hazardous_Lazarus - places Nobles on top of deck
+Hazardous_Lazarus - places Gold on top of deck
+Hazardous_Lazarus - places Copper on top of deck
+Hazardous_Lazarus - places Festival on top of deck
+Hazardous_Lazarus - places Gold on top of deck
+Hazardous_Lazarus - plays 2 Silver
+Hazardous_Lazarus - buys Nobles
+Hazardous_Lazarus - gains Nobles
+Hazardous_Lazarus - draws Gold, Festival, Copper, Gold, Nobles
+ 
+---------- Flina: turn 18 ----------
+Flina - plays Festival
+Flina - plays Nobles
+Flina - draws Vineyard, Festival, Silver
+Flina - plays Festival
+Flina - plays Procession
+Flina - plays 1 Gold, 1 Silver
+Flina - buys Province
+Flina - gains Province
+Flina - draws Forager, Province, Nobles, Possession, Festival
+ 
+---------- Hazardous_Lazarus: turn 19 ----------
+Hazardous_Lazarus - plays Festival
+Hazardous_Lazarus - plays Nobles
+Hazardous_Lazarus - draws Possession, Festival, Copper
+Hazardous_Lazarus - plays Festival
+Hazardous_Lazarus - plays Possession
+Hazardous_Lazarus - plays 2 Gold, 2 Copper
+Hazardous_Lazarus - buys Province
+Hazardous_Lazarus - gains Province
+Hazardous_Lazarus - buys Estate
+Hazardous_Lazarus - gains Estate
+Hazardous_Lazarus - buys Estate
+Hazardous_Lazarus - gains Estate
+Hazardous_Lazarus - draws Copper, Copper, Estate, Gold, Procession
+ 
+---------- Flina: turn 19 [possessed] ----------
+Flina - plays Festival
+Flina - plays Nobles
+Flina - draws Nobles, Forager, Nobles
+Flina - plays Nobles
+Flina - takes 2 actions
+Flina - plays Nobles
+Flina - draws Procession, Gold, Potion
+Flina - plays Procession
+Flina - plays Forager
+Flina - trashes Possession
+Flina - plays Forager
+Flina - trashes Forager
+Flina - trashes Forager
+Hazardous_Lazarus - gains Procession
+Flina - plays 1 Gold, 1 Potion
+Flina - buys Province
+Hazardous_Lazarus - gains Province
+Flina - shuffles deck
+Flina - draws Nobles, Province, Vineyard, Province, Gold
+ 
+---------- Flina: turn 19 ----------
+Flina - plays Nobles
+Flina - draws Procession, Festival, Festival
+Flina - plays 1 Gold
+Flina - buys Forager
+Flina - gains Forager
+Flina - draws Potion, Nobles, Nobles, Province, Gold
+ 
+---------- Hazardous_Lazarus: turn 20 ----------
+Hazardous_Lazarus - plays Procession
+Hazardous_Lazarus - plays 2 Copper, 1 Gold
+Hazardous_Lazarus - buys Duchy
+Hazardous_Lazarus - gains Duchy
+Hazardous_Lazarus - draws Copper, Gold, Mine, Procession, Potion
+ 
+---------- Flina: turn 20 ----------
+Flina - plays Nobles
+Flina - takes 2 actions
+Flina - plays Nobles
+Flina - draws Festival, Silver, Procession
+Flina - plays Procession
+Flina - plays Festival
+Flina - plays Festival
+Flina - trashes Festival
+Flina - gains Nobles
+Flina - plays 1 Potion, 1 Gold, 1 Silver
+Flina - buys Province
+Flina - gains Province
+Flina - buys Vineyard
+Flina - gains Vineyard
+Flina - draws Nobles
+Flina - shuffles deck
+Flina - draws Forager, Province, Nobles, Nobles
+ 
+---------- Hazardous_Lazarus: turn 21 ----------
+Hazardous_Lazarus - plays Procession
+Hazardous_Lazarus - plays Mine
+Hazardous_Lazarus - trashes Copper
+Hazardous_Lazarus - gains Silver
+Hazardous_Lazarus - plays Mine
+Hazardous_Lazarus - trashes Silver
+Hazardous_Lazarus - gains Gold
+Hazardous_Lazarus - trashes Mine
+Hazardous_Lazarus - gains Nobles
+Hazardous_Lazarus - plays 2 Gold, 1 Potion
+Hazardous_Lazarus - buys Possession
+Hazardous_Lazarus - gains Possession
+Hazardous_Lazarus - draws Silver, Province, Navigator, Festival, Estate
+ 
+---------- Flina: turn 21 ----------
+Flina - plays Nobles
+Flina - takes 2 actions
+Flina - plays Nobles
+Flina - draws Forager, Gold, Gold
+Flina - plays Forager
+Flina - trashes Forager
+Flina - plays Nobles
+Flina - draws Province, Festival, Vineyard
+Flina - plays 2 Gold
+Flina - buys Province
+Flina - gains Province
+Flina - draws Festival, Province, Forager, Possession, Procession
+ 
+------------ Game Over ------------
+Flina - cards: 5 Nobles, 2 Festival, 2 Forager, 2 Procession, 1 Possession, 2 Gold, 1 Silver, 1 Potion, 5 Province, 2 Vineyard
+Flina - total victory points: 48
+Flina - turns: 21
+ 
+Hazardous_Lazarus - cards: 3 Nobles, 3 Navigator, 3 Festival, 3 Procession, 2 Possession, 5 Gold, 4 Copper, 3 Silver, 2 Potion, 5 Estate, 3 Province, 1 Duchy
+Hazardous_Lazarus - total victory points: 32
+Hazardous_Lazarus - turns: 21
+ 
+1st place: Flina
+2nd place: Hazardous_Lazarus
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.51500f81e4b0b989d044f1f8.1364838799465.txt b/testing/testdata/log.51500f81e4b0b989d044f1f8.1364838799465.txt
new file mode 100644
index 0000000..3b24962
--- /dev/null
+++ b/testing/testdata/log.51500f81e4b0b989d044f1f8.1364838799465.txt
@@ -0,0 +1,439 @@
+------------ Game Setup ------------
+Supply cards: Squire, Hermit, Storeroom, Urchin, Marauder, Counterfeit, Graverobber, Knights, Rogue, Hunting Grounds, Copper, Silver, Gold, Estate, Duchy, Province, Curse, Ruins
+like a rainbow - starting cards: Copper, Copper, Copper, Copper, Copper, Copper, Copper, Hovel, Overgrown Estate, Necropolis
+Rayne - starting cards: Copper, Copper, Copper, Copper, Copper, Copper, Copper, Estate, Estate, Overgrown Estate
+Archer - starting cards: Copper, Copper, Copper, Copper, Copper, Copper, Copper, Estate, Estate, Estate
+like a rainbow - shuffles deck
+Rayne - shuffles deck
+Archer - shuffles deck
+like a rainbow - draws Necropolis, Overgrown Estate, Hovel, Copper, Copper
+Rayne - draws Copper, Copper, Overgrown Estate, Estate, Copper
+Archer - draws Copper, Copper, Copper, Copper, Copper
+ 
+---------- Archer: turn 1 ----------
+Archer - plays 5 Copper
+Archer - buys Dame Sylvia
+Archer - gains Dame Sylvia
+Archer - draws Copper, Estate, Estate, Copper, Estate
+ 
+---------- like a rainbow: turn 1 ----------
+like a rainbow - plays 2 Copper
+like a rainbow - buys Squire
+like a rainbow - gains Squire
+like a rainbow - draws Copper, Copper, Copper, Copper, Copper
+ 
+---------- Rayne: turn 1 ----------
+Rayne - plays 3 Copper
+Rayne - buys Urchin
+Rayne - gains Urchin
+Rayne - draws Copper, Copper, Copper, Copper, Estate
+ 
+---------- Archer: turn 2 ----------
+Archer - plays 2 Copper
+Archer - buys Squire
+Archer - gains Squire
+Archer - shuffles deck
+Archer - draws Copper, Copper, Dame Sylvia, Copper, Estate
+ 
+---------- like a rainbow: turn 2 ----------
+like a rainbow - plays 5 Copper
+like a rainbow - buys Dame Anna
+like a rainbow - gains Dame Anna
+like a rainbow - shuffles deck
+like a rainbow - draws Overgrown Estate, Hovel, Copper, Squire, Copper
+ 
+---------- Rayne: turn 2 ----------
+Rayne - plays 4 Copper
+Rayne - buys Marauder
+Rayne - gains Marauder
+Rayne - shuffles deck
+Rayne - draws Urchin, Copper, Estate, Marauder, Copper
+ 
+---------- Archer: turn 3 ----------
+Archer - plays Dame Sylvia
+like a rainbow - reveals: Copper, Dame Anna
+like a rainbow - trashes Dame Anna
+like a rainbow - discards Copper
+Rayne - reveals: Overgrown Estate, Copper
+Archer - trashes Dame Sylvia
+Archer - plays 3 Copper
+Archer - buys Counterfeit
+Archer - gains Counterfeit
+Archer - draws Estate, Copper, Estate, Copper, Copper
+ 
+---------- like a rainbow: turn 3 ----------
+like a rainbow - plays Squire
+like a rainbow - gains Silver
+like a rainbow - plays 2 Copper
+like a rainbow - buys Squire
+like a rainbow - gains Squire
+like a rainbow - draws Copper, Copper, Copper, Copper, Necropolis
+ 
+---------- Rayne: turn 3 ----------
+Rayne - plays Urchin
+Rayne - draws Copper
+Archer - discards Estate
+like a rainbow - discards Necropolis
+Rayne - plays Marauder
+Rayne - trashes Urchin
+Rayne - gains Mercenary
+Rayne - gains Spoils
+Archer - gains Abandoned Mine
+like a rainbow - gains Ruined Village
+Rayne - plays 3 Copper
+Rayne - buys Urchin
+Rayne - gains Urchin
+Rayne - draws Estate, Copper, Copper, Copper
+Rayne - shuffles deck
+Rayne - draws Copper
+ 
+---------- Archer: turn 4 ----------
+Archer - plays 3 Copper
+Archer - buys Silver
+Archer - gains Silver
+Archer - draws Copper, Squire
+Archer - shuffles deck
+Archer - draws Estate, Copper, Abandoned Mine
+ 
+---------- like a rainbow: turn 4 ----------
+like a rainbow - plays 4 Copper
+like a rainbow - buys Marauder
+like a rainbow - gains Marauder
+like a rainbow - shuffles deck
+like a rainbow - draws Hovel, Squire, Copper, Overgrown Estate, Marauder
+ 
+---------- Rayne: turn 4 ----------
+Rayne - plays 4 Copper
+Rayne - buys Urchin
+Rayne - gains Urchin
+Rayne - draws Copper, Estate, Urchin, Overgrown Estate, Marauder
+ 
+---------- Archer: turn 5 ----------
+Archer - plays Squire
+Archer - takes 2 actions
+Archer - plays Abandoned Mine
+Archer - plays 2 Copper
+Archer - buys Marauder
+Archer - gains Marauder
+Archer - draws Copper, Copper, Copper, Estate, Copper
+ 
+---------- like a rainbow: turn 5 ----------
+like a rainbow - plays Squire
+like a rainbow - takes 2 actions
+like a rainbow - plays Marauder
+like a rainbow - gains Spoils
+Rayne - gains Abandoned Mine
+Archer - gains Ruined Market
+like a rainbow - plays 1 Copper
+like a rainbow - buys Squire
+like a rainbow - gains Squire
+like a rainbow - draws Copper, Silver, Ruined Village, Necropolis, Copper
+ 
+---------- Rayne: turn 5 ----------
+Rayne - plays Urchin
+Rayne - draws Copper
+Archer - discards Estate
+like a rainbow - discards Ruined Village
+Rayne - plays Marauder
+Rayne - gains Spoils
+Archer - gains Ruined Village
+like a rainbow - gains Ruined Market
+Rayne - plays 2 Copper
+Rayne - buys Squire
+Rayne - gains Squire
+Rayne - draws Mercenary, Spoils, Copper
+Rayne - shuffles deck
+Rayne - draws Estate, Squire
+ 
+---------- Archer: turn 6 ----------
+Archer - plays 4 Copper
+Archer - buys Marauder
+Archer - gains Marauder
+Archer - draws Copper, Estate, Silver, Counterfeit
+Archer - shuffles deck
+Archer - draws Marauder
+ 
+---------- like a rainbow: turn 6 ----------
+like a rainbow - plays Necropolis
+like a rainbow - plays 2 Copper, 1 Silver
+like a rainbow - buys Squire
+like a rainbow - gains Squire
+like a rainbow - draws Copper, Squire, Copper, Copper, Copper
+ 
+---------- Rayne: turn 6 ----------
+Rayne - plays Squire
+Rayne - takes 2 actions
+Rayne - plays 1 Copper
+Rayne - plays Spoils
+Rayne - buys Urchin
+Rayne - gains Urchin
+Rayne - draws Copper, Copper, Urchin, Copper, Overgrown Estate
+ 
+---------- Archer: turn 7 ----------
+Archer - plays Marauder
+Archer - gains Spoils
+like a rainbow - gains Ruined Village
+Rayne - gains Ruined Market
+Archer - plays Counterfeit
+Archer - plays Copper
+Archer - plays Copper
+Archer - trashes Copper
+Archer - plays 1 Silver
+Archer - buys Rogue
+Archer - gains Rogue
+Archer - draws Estate, Copper, Copper, Marauder, Estate
+ 
+---------- like a rainbow: turn 7 ----------
+like a rainbow - plays Squire
+like a rainbow - gains Silver
+like a rainbow - plays 4 Copper
+like a rainbow - buys Graverobber
+like a rainbow - gains Graverobber
+like a rainbow - shuffles deck
+like a rainbow - draws Spoils, Copper, Graverobber, Overgrown Estate, Hovel
+ 
+---------- Rayne: turn 7 ----------
+Rayne - plays Urchin
+Rayne - draws Marauder
+Archer - discards Estate
+like a rainbow - discards Overgrown Estate
+Rayne - plays Marauder
+Rayne - gains Spoils
+Archer - gains Ruined Library
+like a rainbow - gains Ruined Village
+Rayne - plays 3 Copper
+Rayne - buys Urchin
+Rayne - gains Urchin
+Rayne - draws Copper, Spoils, Copper, Urchin, Copper
+ 
+---------- Archer: turn 8 ----------
+Archer - plays Marauder
+Archer - gains Spoils
+like a rainbow - gains Survivors
+Rayne - gains Ruined Market
+Archer - plays 2 Copper
+Archer - buys Squire
+Archer - gains Squire
+Archer - draws Copper, Squire, Copper, Ruined Market, Abandoned Mine
+ 
+---------- like a rainbow: turn 8 ----------
+like a rainbow - plays Graverobber
+like a rainbow - gains Dame Anna
+like a rainbow - plays 1 Copper
+like a rainbow - plays Spoils
+like a rainbow - buys Urchin
+like a rainbow - gains Urchin
+like a rainbow - draws Dame Anna, Squire, Copper, Copper, Marauder
+ 
+---------- Rayne: turn 8 ----------
+Rayne - plays Urchin
+Rayne - draws Estate
+Archer - discards Ruined Market
+like a rainbow - discards Copper
+Rayne - plays 3 Copper
+Rayne - plays Spoils
+Rayne - buys Gold
+Rayne - gains Gold
+Rayne - draws Abandoned Mine
+Rayne - shuffles deck
+Rayne - draws Copper, Marauder, Spoils, Mercenary
+ 
+---------- Archer: turn 9 ----------
+Archer - plays Squire
+Archer - takes 2 actions
+Archer - plays Abandoned Mine
+Archer - plays 2 Copper
+Archer - buys Marauder
+Archer - gains Marauder
+Archer - draws Ruined Village, Copper, Copper
+Archer - shuffles deck
+Archer - draws Rogue, Ruined Library
+ 
+---------- like a rainbow: turn 9 ----------
+like a rainbow - plays Squire
+like a rainbow - takes 2 actions
+like a rainbow - plays Marauder
+like a rainbow - gains Spoils
+Rayne - gains Ruined Library
+Archer - gains Ruined Village
+like a rainbow - plays Dame Anna
+like a rainbow - trashes Copper
+Rayne - reveals: Copper, Copper
+Archer - reveals: Estate, Estate
+like a rainbow - draws Ruined Market, Silver, Copper, Silver, Squire
+ 
+---------- Rayne: turn 9 ----------
+Rayne - plays Marauder
+Rayne - gains Spoils
+Archer - gains Ruined Library
+like a rainbow - gains Abandoned Mine
+Rayne - plays 1 Copper
+Rayne - plays Spoils
+Rayne - buys Urchin
+Rayne - gains Urchin
+Rayne - draws Ruined Market, Copper, Copper, Urchin, Ruined Market
+ 
+---------- Archer: turn 10 ----------
+Archer - plays Rogue
+Archer - gains Dame Sylvia
+Archer - plays 2 Copper
+Archer - buys Silver
+Archer - gains Silver
+Archer - draws Spoils, Counterfeit, Squire, Copper, Ruined Market
+ 
+---------- like a rainbow: turn 10 ----------
+like a rainbow - plays Squire
+like a rainbow - takes 2 actions
+like a rainbow - plays Ruined Market
+like a rainbow - plays 2 Silver, 1 Copper
+like a rainbow - buys Hunting Grounds
+like a rainbow - gains Hunting Grounds
+like a rainbow - draws Squire, Copper, Copper, Squire, Copper
+ 
+---------- Rayne: turn 10 ----------
+Rayne - plays Urchin
+Rayne - draws Copper
+Archer - discards Ruined Market
+like a rainbow - discards Copper
+Rayne - plays Ruined Market
+Rayne - plays 3 Copper
+Rayne - buys Urchin
+Rayne - gains Urchin
+Rayne - draws Estate, Gold, Overgrown Estate, Estate, Urchin
+ 
+---------- Archer: turn 11 ----------
+Archer - plays Squire
+Archer - gains Silver
+Archer - plays Counterfeit
+Archer - plays Spoils
+Archer - plays Spoils
+Archer - plays 1 Copper
+Archer - buys Province
+Archer - gains Province
+Archer - draws Squire, Copper, Abandoned Mine, Marauder, Silver
+ 
+---------- like a rainbow: turn 11 ----------
+like a rainbow - plays Squire
+like a rainbow - takes 2 actions
+like a rainbow - plays Squire
+like a rainbow - takes 2 buys
+like a rainbow - plays 2 Copper
+like a rainbow - buys Squire
+like a rainbow - gains Squire
+like a rainbow - buys Squire
+like a rainbow - gains Squire
+like a rainbow - draws Ruined Village, Ruined Village, Necropolis
+like a rainbow - shuffles deck
+like a rainbow - draws Marauder, Squire
+ 
+---------- Rayne: turn 11 ----------
+Rayne - plays Urchin
+Rayne - draws Urchin
+Archer - discards Abandoned Mine
+like a rainbow - discards Ruined Village
+Rayne - plays Urchin
+Rayne - draws Squire
+Rayne - plays Squire
+Rayne - gains Silver
+Rayne - plays 1 Gold
+Rayne - buys Urchin
+Rayne - gains Urchin
+Rayne - draws Copper, Urchin
+Rayne - shuffles deck
+Rayne - draws Copper, Copper, Urchin
+ 
+---------- Archer: turn 12 ----------
+Archer - plays Squire
+Archer - takes 2 actions
+Archer - plays Marauder
+Archer - gains Spoils
+like a rainbow - gains Ruined Library
+Rayne - gains Survivors
+Archer - plays 1 Copper, 1 Silver
+Archer - buys Estate
+Archer - gains Estate
+Archer - draws Copper, Copper, Estate, Marauder, Spoils
+ 
+---------- like a rainbow: turn 12 ----------
+like a rainbow - plays Squire
+like a rainbow - takes 2 actions
+like a rainbow - plays Marauder
+like a rainbow - gains Spoils
+Rayne - gains Ruined Market
+Archer - gains Ruined Library
+like a rainbow - draws Survivors, Copper, Hunting Grounds, Silver, Ruined Market
+ 
+---------- Rayne: turn 12 ----------
+Rayne - plays Urchin
+Rayne - draws Ruined Market
+Archer - discards Estate
+like a rainbow - discards Survivors
+Rayne - plays Urchin
+Rayne - draws Ruined Market
+Rayne - plays Ruined Market
+Rayne - plays 3 Copper
+Rayne - buys Estate
+Rayne - gains Estate
+Rayne - draws Gold, Urchin, Urchin, Squire, Marauder
+ 
+---------- Archer: turn 13 ----------
+Archer - plays Marauder
+Archer - gains Spoils
+Archer - plays 2 Copper
+Archer - plays Spoils
+Archer - buys Duchy
+Archer - gains Duchy
+Archer - draws Marauder
+Archer - shuffles deck
+Archer - draws Ruined Market, Spoils, Silver, Ruined Village
+ 
+---------- like a rainbow: turn 13 ----------
+like a rainbow - plays Hunting Grounds
+like a rainbow - draws Overgrown Estate, Squire, Abandoned Mine, Dame Anna
+like a rainbow - plays 1 Copper, 1 Silver
+like a rainbow - buys Squire
+like a rainbow - gains Squire
+like a rainbow - draws Ruined Village, Squire, Copper, Spoils, Copper
+ 
+---------- Rayne: turn 13 ----------
+Rayne - plays Urchin
+Rayne - draws Copper
+Archer - discards Ruined Village
+like a rainbow - discards Ruined Village
+Rayne - plays Urchin
+Rayne - draws Copper
+Rayne - plays Squire
+Rayne - takes 2 actions
+Rayne - plays Marauder
+Rayne - gains Spoils
+Rayne - plays 2 Copper, 1 Gold
+Rayne - buys Duchy
+Rayne - gains Duchy
+Rayne - draws Abandoned Mine, Overgrown Estate, Mercenary, Estate, Silver
+ 
+---------- Archer: turn 14 ----------
+Archer - plays Marauder
+Archer - gains Spoils
+Archer - plays 1 Silver
+Archer - plays Spoils
+Archer - buys Urchin
+Archer - gains Urchin
+Archer - draws Silver, Ruined Library, Squire, Duchy, Estate
+ 
+------------ Game Over ------------
+Archer - cards: 3 Marauder, 3 Ruined Library, 2 Squire, 2 Ruined Village, 1 Abandoned Mine, 1 Rogue, 1 Ruined Market, 1 Urchin, 1 Dame Sylvia, 6 Copper, 3 Silver, 2 Spoils, 1 Counterfeit, 4 Estate, 1 Province, 1 Duchy
+Archer - total victory points: 13
+Archer - turns: 14
+ 
+Rayne - cards: 7 Urchin, 3 Ruined Market, 1 Mercenary, 1 Marauder, 1 Squire, 1 Survivors, 1 Abandoned Mine, 1 Ruined Library, 7 Copper, 2 Spoils, 1 Silver, 1 Gold, 3 Estate, 1 Overgrown Estate, 1 Duchy
+Rayne - total victory points: 6
+Rayne - turns: 13
+ 
+like a rainbow - cards: 7 Squire, 3 Ruined Village, 1 Graverobber, 1 Hunting Grounds, 1 Ruined Library, 1 Marauder, 1 Necropolis, 1 Survivors, 1 Urchin, 1 Dame Anna, 1 Ruined Market, 1 Abandoned Mine, 6 Copper, 2 Silver, 2 Spoils, 1 Overgrown Estate, 1 Hovel
+like a rainbow - total victory points: 0
+like a rainbow - turns: 13
+ 
+1st place: Archer
+2nd place: Rayne
+3rd place: like a rainbow
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.51532c8ce4b083ccc5b0febe.1364825843533.txt b/testing/testdata/log.51532c8ce4b083ccc5b0febe.1364825843533.txt
new file mode 100644
index 0000000..6961cd1
--- /dev/null
+++ b/testing/testdata/log.51532c8ce4b083ccc5b0febe.1364825843533.txt
@@ -0,0 +1,341 @@
+------------ Game Setup ------------
+Supply cards: Lighthouse, Native Village, University, Ambassador, Oasis, Storeroom, Conspirator, Harvest, Trading Post, Harem, Copper, Silver, Gold, Estate, Duchy, Province, Curse, Potion
+Hurtig - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Buustamon - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Hurtig - shuffles deck
+Buustamon - shuffles deck
+Hurtig - draws Copper, Copper, Copper, Copper, Copper
+Buustamon - draws Estate, Copper, Copper, Copper, Copper
+ 
+---------- Buustamon: turn 1 ----------
+Buustamon - plays 4 Copper
+Buustamon - buys Silver
+Buustamon - gains Silver
+Buustamon - draws Copper, Copper, Estate, Estate, Copper
+ 
+---------- Hurtig: turn 1 ----------
+Hurtig - plays 5 Copper
+Hurtig - buys Trading Post
+Hurtig - gains Trading Post
+Hurtig - draws Estate, Copper, Estate, Copper, Estate
+ 
+---------- Buustamon: turn 2 ----------
+Buustamon - plays 3 Copper
+Buustamon - buys Ambassador
+Buustamon - gains Ambassador
+Buustamon - shuffles deck
+Buustamon - draws Estate, Copper, Copper, Copper, Silver
+ 
+---------- Hurtig: turn 2 ----------
+Hurtig - plays 2 Copper
+Hurtig - buys Lighthouse
+Hurtig - gains Lighthouse
+Hurtig - shuffles deck
+Hurtig - draws Copper, Copper, Estate, Copper, Estate
+ 
+---------- Buustamon: turn 3 ----------
+Buustamon - plays 3 Copper, 1 Silver
+Buustamon - buys Trading Post
+Buustamon - gains Trading Post
+Buustamon - draws Estate, Copper, Estate, Copper, Copper
+ 
+---------- Hurtig: turn 3 ----------
+Hurtig - plays 3 Copper
+Hurtig - buys Silver
+Hurtig - gains Silver
+Hurtig - draws Trading Post, Copper, Lighthouse, Copper, Copper
+ 
+---------- Buustamon: turn 4 ----------
+Buustamon - plays 3 Copper
+Buustamon - buys Silver
+Buustamon - gains Silver
+Buustamon - draws Copper, Ambassador
+Buustamon - shuffles deck
+Buustamon - draws Copper, Silver, Estate
+ 
+---------- Hurtig: turn 4 ----------
+Hurtig - plays Lighthouse
+Hurtig - plays Trading Post
+Hurtig - trashes Copper, Copper
+Hurtig - gains Silver
+Hurtig - plays 1 Copper, 1 Silver
+Hurtig - buys Silver
+Hurtig - gains Silver
+Hurtig - draws Copper, Estate
+Hurtig - shuffles deck
+Hurtig - draws Copper, Copper, Copper
+ 
+---------- Buustamon: turn 5 ----------
+Buustamon - plays Ambassador
+Buustamon - reveals Copper
+Buustamon - returns Copper to the Supply
+Buustamon - returns Copper to the Supply
+Buustamon - draws Estate, Copper, Trading Post, Copper, Copper
+ 
+---------- Hurtig: turn 5 ----------
+Hurtig - duration Lighthouse
+Hurtig - plays 4 Copper
+Hurtig - buys Silver
+Hurtig - gains Silver
+Hurtig - draws Silver, Silver, Estate, Copper, Silver
+ 
+---------- Buustamon: turn 6 ----------
+Buustamon - plays Trading Post
+Buustamon - trashes Copper, Estate
+Buustamon - gains Silver
+Buustamon - plays 2 Copper, 1 Silver
+Buustamon - buys Native Village
+Buustamon - gains Native Village
+Buustamon - draws Estate, Silver, Copper, Copper
+Buustamon - shuffles deck
+Buustamon - draws Trading Post
+ 
+---------- Hurtig: turn 6 ----------
+Hurtig - plays 3 Silver, 1 Copper
+Hurtig - buys Harem
+Hurtig - gains Harem
+Hurtig - draws Trading Post, Estate
+Hurtig - shuffles deck
+Hurtig - draws Silver, Harem, Copper
+ 
+---------- Buustamon: turn 7 ----------
+Buustamon - plays Trading Post
+Buustamon - trashes Copper, Copper
+Buustamon - gains Silver
+Buustamon - plays 2 Silver
+Buustamon - buys Native Village
+Buustamon - gains Native Village
+Buustamon - draws Silver, Silver, Ambassador, Copper, Copper
+ 
+---------- Hurtig: turn 7 ----------
+Hurtig - plays Trading Post
+Hurtig - trashes Estate, Copper
+Hurtig - gains Silver
+Hurtig - plays 2 Silver, 1 Harem
+Hurtig - buys Harem
+Hurtig - gains Harem
+Hurtig - draws Silver, Estate, Lighthouse, Copper, Silver
+ 
+---------- Buustamon: turn 8 ----------
+Buustamon - plays Ambassador
+Buustamon - reveals Copper
+Hurtig - gains Copper
+Buustamon - plays 2 Silver, 2 Copper
+Buustamon - buys Gold
+Buustamon - gains Gold
+Buustamon - draws Estate, Native Village
+Buustamon - shuffles deck
+Buustamon - draws Silver, Silver, Estate
+ 
+---------- Hurtig: turn 8 ----------
+Hurtig - plays Lighthouse
+Hurtig - plays 2 Silver, 1 Copper
+Hurtig - buys Harem
+Hurtig - gains Harem
+Hurtig - draws Copper, Silver, Copper, Estate, Copper
+ 
+---------- Buustamon: turn 9 ----------
+Buustamon - plays Native Village
+Buustamon - sets aside Silver
+Buustamon - plays 2 Silver
+Buustamon - draws Copper, Silver, Gold, Ambassador, Native Village
+ 
+---------- Hurtig: turn 9 ----------
+Hurtig - duration Lighthouse
+Hurtig - plays 3 Copper, 1 Silver
+Hurtig - buys Harem
+Hurtig - gains Harem
+Hurtig - shuffles deck
+Hurtig - draws Copper, Copper, Copper, Silver, Copper
+ 
+---------- Buustamon: turn 10 ----------
+Buustamon - plays Native Village
+Buustamon - sets aside Copper
+Buustamon - plays Ambassador
+Buustamon - reveals Copper
+Buustamon - returns Copper to the Supply
+Hurtig - gains Copper
+Buustamon - draws Trading Post
+Buustamon - shuffles deck
+Buustamon - draws Ambassador, Estate, Silver, Native Village
+ 
+---------- Hurtig: turn 10 ----------
+Hurtig - plays 4 Copper, 1 Silver
+Hurtig - buys Harem
+Hurtig - gains Harem
+Hurtig - draws Harem, Silver, Harem, Lighthouse, Estate
+ 
+---------- Buustamon: turn 11 ----------
+Buustamon - plays Native Village
+Buustamon - sets aside Native Village
+Buustamon - plays Ambassador
+Buustamon - reveals Estate
+Buustamon - returns Estate to the Supply
+Hurtig - gains Estate
+Buustamon - plays Trading Post
+Buustamon - trashes Silver
+Buustamon - draws Silver, Gold, Estate, Silver
+Buustamon - shuffles deck
+Buustamon - draws Ambassador
+ 
+---------- Hurtig: turn 11 ----------
+Hurtig - plays Lighthouse
+Hurtig - plays 2 Harem, 1 Silver
+Hurtig - buys Harem
+Hurtig - gains Harem
+Hurtig - draws Harem, Silver, Harem, Trading Post, Copper
+ 
+---------- Buustamon: turn 12 ----------
+Buustamon - plays Ambassador
+Buustamon - reveals Estate
+Buustamon - returns Estate to the Supply
+Buustamon - plays 2 Silver, 1 Gold
+Buustamon - buys Gold
+Buustamon - gains Gold
+Buustamon - draws Trading Post, Native Village
+Buustamon - shuffles deck
+Buustamon - draws Gold, Silver, Gold
+ 
+---------- Hurtig: turn 12 ----------
+Hurtig - duration Lighthouse
+Hurtig - plays Trading Post
+Hurtig - trashes Copper, Silver
+Hurtig - gains Silver
+Hurtig - plays 2 Harem, 1 Silver
+Hurtig - buys Harem
+Hurtig - gains Harem
+Hurtig - draws Estate, Silver, Silver
+Hurtig - shuffles deck
+Hurtig - draws Harem, Trading Post
+ 
+---------- Buustamon: turn 13 ----------
+Buustamon - plays Native Village
+Buustamon - sets aside Ambassador
+Buustamon - plays 2 Gold, 1 Silver
+Buustamon - buys Province
+Buustamon - gains Province
+Buustamon - draws Silver
+Buustamon - shuffles deck
+Buustamon - draws Province, Silver, Gold, Gold
+ 
+---------- Hurtig: turn 13 ----------
+Hurtig - plays 2 Silver, 1 Harem
+Hurtig - buys Harem
+Hurtig - gains Harem
+Hurtig - draws Harem, Copper, Harem, Harem, Harem
+ 
+---------- Buustamon: turn 14 ----------
+Buustamon - plays 2 Silver, 2 Gold
+Buustamon - buys Province
+Buustamon - gains Province
+Buustamon - draws Trading Post, Native Village
+Buustamon - shuffles deck
+Buustamon - draws Gold, Silver, Silver
+ 
+---------- Hurtig: turn 14 ----------
+Hurtig - plays 4 Harem, 1 Copper
+Hurtig - buys Province
+Hurtig - gains Province
+Hurtig - draws Estate, Copper, Harem, Silver, Copper
+ 
+---------- Buustamon: turn 15 ----------
+Buustamon - plays Native Village
+Buustamon - sets aside Province
+Buustamon - plays 2 Silver, 1 Gold
+Buustamon - buys Gold
+Buustamon - gains Gold
+Buustamon - draws Gold, Province
+Buustamon - shuffles deck
+Buustamon - draws Silver, Gold, Native Village
+ 
+---------- Hurtig: turn 15 ----------
+Hurtig - plays 2 Copper, 1 Harem, 1 Silver
+Hurtig - buys Ambassador
+Hurtig - gains Ambassador
+Hurtig - draws Silver, Copper, Lighthouse, Copper, Estate
+ 
+---------- Buustamon: turn 16 ----------
+Buustamon - plays 2 Gold, 1 Silver
+Buustamon - buys Province
+Buustamon - gains Province
+Buustamon - draws Silver, Gold, Trading Post
+Buustamon - shuffles deck
+Buustamon - draws Province, Silver
+ 
+---------- Hurtig: turn 16 ----------
+Hurtig - plays Lighthouse
+Hurtig - plays 2 Copper, 1 Silver
+Hurtig - buys Native Village
+Hurtig - gains Native Village
+Hurtig - draws Harem, Silver
+Hurtig - shuffles deck
+Hurtig - draws Copper, Harem, Estate
+ 
+---------- Buustamon: turn 17 ----------
+Buustamon - plays Trading Post
+Buustamon - trashes Silver, Silver
+Buustamon - gains Silver
+Buustamon - draws Gold, Native Village, Province, Gold
+Buustamon - shuffles deck
+Buustamon - draws Silver
+ 
+---------- Hurtig: turn 17 ----------
+Hurtig - duration Lighthouse
+Hurtig - plays 2 Harem, 1 Silver, 1 Copper
+Hurtig - buys Province
+Hurtig - gains Province
+Hurtig - draws Trading Post, Estate, Province, Copper, Ambassador
+ 
+---------- Buustamon: turn 18 ----------
+Buustamon - plays 2 Gold, 1 Silver
+Buustamon - buys Province
+Buustamon - gains Province
+Buustamon - draws Gold, Province, Trading Post
+Buustamon - shuffles deck
+Buustamon - draws Gold, Province
+ 
+---------- Hurtig: turn 18 ----------
+Hurtig - plays Trading Post
+Hurtig - trashes Estate, Copper
+Hurtig - gains Silver
+Hurtig - plays 1 Silver
+Hurtig - buys Estate
+Hurtig - gains Estate
+Hurtig - draws Harem, Copper, Silver, Harem, Copper
+ 
+---------- Buustamon: turn 19 ----------
+Buustamon - plays 2 Gold
+Buustamon - buys Gold
+Buustamon - gains Gold
+Buustamon - draws Silver, Province, Native Village, Gold
+Buustamon - shuffles deck
+Buustamon - draws Gold
+ 
+---------- Hurtig: turn 19 ----------
+Hurtig - plays 2 Harem, 2 Copper, 1 Silver
+Hurtig - buys Province
+Hurtig - gains Province
+Hurtig - draws Native Village, Estate, Silver, Harem, Harem
+ 
+---------- Buustamon: turn 20 ----------
+Buustamon - plays Native Village
+Buustamon - sets aside Gold
+Buustamon - plays 2 Gold, 1 Silver
+Buustamon - buys Province
+Buustamon - gains Province
+Buustamon - draws Trading Post, Province, Gold, Province
+Buustamon - shuffles deck
+Buustamon - draws Province
+ 
+------------ Game Over ------------
+Hurtig - cards: 1 Native Village, 1 Lighthouse, 1 Trading Post, 1 Ambassador, 8 Harem, 6 Silver, 4 Copper, 3 Estate, 3 Province
+Hurtig - total victory points: 37
+Hurtig - turns: 19
+ 
+Buustamon - cards: 2 Native Village, 1 Trading Post, 1 Ambassador, 4 Gold, 2 Silver, 1 Copper, 5 Province
+Buustamon - total victory points: 30
+Buustamon - turns: 20
+ 
+1st place: Hurtig
+2nd place: Buustamon
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.5154cd91e4b0a260b599ab6b.1364855887188.txt b/testing/testdata/log.5154cd91e4b0a260b599ab6b.1364855887188.txt
new file mode 100644
index 0000000..342efb3
--- /dev/null
+++ b/testing/testdata/log.5154cd91e4b0a260b599ab6b.1364855887188.txt
@@ -0,0 +1,767 @@
+------------ Game Setup ------------
+Supply cards: Embargo, Native Village, Pearl Diver, Smugglers, Warehouse, Caravan, Cutpurse, Bazaar, Laboratory, Outpost, Copper, Silver, Gold, Estate, Duchy, Province, Curse
+radleybrown - starting cards: Silver, Silver, Silver, Silver, Silver, Silver, Duchy, Duchy, Duchy, Estate
+Soldier - starting cards: Copper, Copper, Silver, Silver, Silver, Silver, Silver, Duchy, Duchy, Province
+Serf Hague - starting cards: Copper, Copper, Copper, Copper, Copper, Copper, Copper, Estate, Estate, Estate
+radleybrown - shuffles deck
+Soldier - shuffles deck
+Serf Hague - shuffles deck
+radleybrown - draws Silver, Silver, Silver, Duchy, Duchy
+Soldier - draws Duchy, Province, Silver, Silver, Duchy
+Serf Hague - draws Estate, Copper, Estate, Copper, Estate
+ 
+---------- Serf Hague: turn 1 ----------
+Serf Hague - plays 2 Copper
+Serf Hague - buys Pearl Diver
+Serf Hague - gains Pearl Diver
+Serf Hague - draws Copper, Copper, Copper, Copper, Copper
+ 
+---------- radleybrown: turn 1 ----------
+radleybrown - plays 3 Silver
+radleybrown - buys Outpost
+radleybrown - gains Outpost
+radleybrown - draws Estate, Silver, Silver, Duchy, Silver
+ 
+---------- Soldier: turn 1 ----------
+Soldier - plays 2 Silver
+Soldier - buys Cutpurse
+Soldier - gains Cutpurse
+Soldier - draws Copper, Silver, Silver, Copper, Silver
+ 
+---------- Serf Hague: turn 2 ----------
+Serf Hague - plays 5 Copper
+Serf Hague - buys Outpost
+Serf Hague - gains Outpost
+Serf Hague - shuffles deck
+Serf Hague - draws Copper, Copper, Estate, Outpost, Copper
+ 
+---------- radleybrown: turn 2 ----------
+radleybrown - plays 3 Silver
+radleybrown - buys Gold
+radleybrown - gains Gold
+radleybrown - shuffles deck
+radleybrown - draws Silver, Silver, Duchy, Gold, Duchy
+ 
+---------- Soldier: turn 2 ----------
+Soldier - plays 3 Silver, 2 Copper
+Soldier - buys Province
+Soldier - gains Province
+Soldier - shuffles deck
+Soldier - draws Copper, Silver, Silver, Duchy, Copper
+ 
+---------- Serf Hague: turn 3 ----------
+Serf Hague - plays Outpost
+Serf Hague - plays 3 Copper
+Serf Hague - buys Warehouse
+Serf Hague - gains Warehouse
+Serf Hague - draws Estate, Copper, Copper
+Serf Hague - duration Outpost
+ 
+---------- Serf Hague: turn 3 ----------
+Serf Hague - plays 2 Copper
+Serf Hague - buys Embargo
+Serf Hague - gains Embargo
+Serf Hague - draws Copper, Estate, Pearl Diver, Copper
+Serf Hague - shuffles deck
+Serf Hague - draws Outpost
+ 
+---------- radleybrown: turn 3 ----------
+radleybrown - plays 2 Silver, 1 Gold
+radleybrown - buys Gold
+radleybrown - gains Gold
+radleybrown - draws Silver, Duchy, Silver, Estate, Silver
+ 
+---------- Soldier: turn 3 ----------
+Soldier - plays 2 Copper, 2 Silver
+Soldier - buys Gold
+Soldier - gains Gold
+Soldier - draws Province, Duchy, Cutpurse, Province, Silver
+ 
+---------- Serf Hague: turn 4 ----------
+Serf Hague - plays Pearl Diver
+Serf Hague - draws Copper
+Serf Hague - places Estate on bottom of deck
+Serf Hague - plays Outpost
+Serf Hague - plays 3 Copper
+Serf Hague - buys Smugglers
+Serf Hague - gains Smugglers
+Serf Hague - draws Embargo, Copper, Estate
+Serf Hague - duration Outpost
+ 
+---------- Serf Hague: turn 4 ----------
+Serf Hague - plays Embargo
+Serf Hague - embargoes Warehouse
+Serf Hague - trashes Embargo
+Serf Hague - plays 1 Copper
+Serf Hague - buys Silver
+Serf Hague - gains Silver
+Serf Hague - draws Copper, Copper, Warehouse, Copper, Estate
+ 
+---------- radleybrown: turn 4 ----------
+radleybrown - plays 3 Silver
+radleybrown - buys Outpost
+radleybrown - gains Outpost
+radleybrown - draws Outpost, Silver
+radleybrown - shuffles deck
+radleybrown - draws Gold, Silver, Silver
+ 
+---------- Soldier: turn 4 ----------
+Soldier - plays Cutpurse
+Serf Hague - discards Copper
+radleybrown - reveals Outpost, Silver, Gold, Silver, Silver
+Soldier - plays 1 Silver
+Soldier - buys Cutpurse
+Soldier - gains Cutpurse
+Soldier - draws Silver, Silver
+Soldier - shuffles deck
+Soldier - draws Gold, Copper, Silver
+ 
+---------- Serf Hague: turn 5 ----------
+Serf Hague - plays Warehouse
+Serf Hague - shuffles deck
+Serf Hague - draws Copper, Smugglers, Pearl Diver
+Serf Hague - discards Estate
+Serf Hague - discards Copper
+Serf Hague - discards Copper
+Serf Hague - plays Pearl Diver
+Serf Hague - draws Copper
+Serf Hague - places Estate on bottom of deck
+Serf Hague - plays Smugglers
+Serf Hague - gains Cutpurse
+Serf Hague - plays 2 Copper
+Serf Hague - buys Pearl Diver
+Serf Hague - gains Pearl Diver
+Serf Hague - draws Outpost, Copper, Silver, Copper, Copper
+ 
+---------- radleybrown: turn 5 ----------
+radleybrown - plays Outpost
+radleybrown - plays 3 Silver, 1 Gold
+radleybrown - buys Province
+radleybrown - gains Province
+radleybrown - draws Outpost, Silver, Silver
+radleybrown - duration Outpost
+ 
+---------- radleybrown: turn 5 ----------
+radleybrown - plays 2 Silver
+radleybrown - buys Caravan
+radleybrown - gains Caravan
+radleybrown - draws Duchy, Silver, Duchy, Duchy, Estate
+ 
+---------- Soldier: turn 5 ----------
+Soldier - plays 3 Silver, 1 Gold, 1 Copper
+Soldier - buys Province
+Soldier - gains Province
+Soldier - draws Duchy, Duchy, Province, Copper, Silver
+ 
+---------- Serf Hague: turn 6 ----------
+Serf Hague - plays Outpost
+Serf Hague - plays 3 Copper, 1 Silver
+Serf Hague - buys Outpost
+Serf Hague - gains Outpost
+Serf Hague - draws Estate, Estate
+Serf Hague - shuffles deck
+Serf Hague - draws Copper
+Serf Hague - duration Outpost
+ 
+---------- Serf Hague: turn 6 ----------
+Serf Hague - plays 1 Copper
+Serf Hague - draws Estate, Copper, Smugglers, Copper, Cutpurse
+ 
+---------- radleybrown: turn 6 ----------
+radleybrown - plays 1 Silver
+radleybrown - buys Native Village
+radleybrown - gains Native Village
+radleybrown - draws Gold
+radleybrown - shuffles deck
+radleybrown - draws Silver, Estate, Gold, Province
+ 
+---------- Soldier: turn 6 ----------
+Soldier - plays 1 Copper, 1 Silver
+Soldier - buys Native Village
+Soldier - gains Native Village
+Soldier - draws Cutpurse, Province, Silver, Cutpurse
+Soldier - shuffles deck
+Soldier - draws Copper
+ 
+---------- Serf Hague: turn 7 ----------
+Serf Hague - plays Cutpurse
+radleybrown - reveals Gold, Silver, Estate, Gold, Province
+Soldier - discards Copper
+Serf Hague - plays 2 Copper
+Serf Hague - buys Cutpurse
+Serf Hague - gains Cutpurse
+Serf Hague - draws Pearl Diver, Silver, Pearl Diver, Copper, Warehouse
+ 
+---------- radleybrown: turn 7 ----------
+radleybrown - plays 2 Gold, 1 Silver
+radleybrown - buys Province
+radleybrown - gains Province
+radleybrown - draws Outpost, Silver, Duchy, Silver, Silver
+ 
+---------- Soldier: turn 7 ----------
+Soldier - plays Cutpurse
+Serf Hague - discards Copper
+radleybrown - reveals Outpost, Silver, Duchy, Silver, Silver
+Soldier - plays 1 Silver
+Soldier - buys Caravan
+Soldier - gains Caravan
+Soldier - draws Duchy, Silver, Copper, Silver, Province
+ 
+---------- Serf Hague: turn 8 ----------
+Serf Hague - plays Pearl Diver
+Serf Hague - draws Outpost
+Serf Hague - places Copper on bottom of deck
+Serf Hague - plays Pearl Diver
+Serf Hague - draws Copper
+Serf Hague - places Copper on bottom of deck
+Serf Hague - plays Warehouse
+Serf Hague - draws Copper, Copper
+Serf Hague - shuffles deck
+Serf Hague - draws Cutpurse
+Serf Hague - discards Cutpurse
+Serf Hague - discards Copper
+Serf Hague - discards Copper
+Serf Hague - plays Outpost
+Serf Hague - plays 1 Silver, 1 Copper
+Serf Hague - buys Smugglers
+Serf Hague - gains Smugglers
+Serf Hague - draws Smugglers, Estate, Outpost
+Serf Hague - duration Outpost
+ 
+---------- Serf Hague: turn 8 ----------
+Serf Hague - plays Smugglers
+Serf Hague - gains Caravan
+Serf Hague - buys Copper
+Serf Hague - gains Copper
+Serf Hague - draws Copper, Cutpurse, Estate, Copper, Estate
+ 
+---------- radleybrown: turn 8 ----------
+radleybrown - plays Outpost
+radleybrown - plays 3 Silver
+radleybrown - buys Gold
+radleybrown - gains Gold
+radleybrown - draws Silver, Caravan, Outpost
+radleybrown - duration Outpost
+ 
+---------- radleybrown: turn 8 ----------
+radleybrown - plays Caravan
+radleybrown - draws Duchy
+radleybrown - plays 1 Silver
+radleybrown - buys Native Village
+radleybrown - gains Native Village
+radleybrown - draws Native Village, Duchy, Silver
+radleybrown - shuffles deck
+radleybrown - draws Native Village, Gold
+ 
+---------- Soldier: turn 8 ----------
+Soldier - plays 2 Silver, 1 Copper
+Soldier - buys Laboratory
+Soldier - gains Laboratory
+Soldier - draws Native Village, Silver, Silver, Duchy, Province
+ 
+---------- Serf Hague: turn 9 ----------
+Serf Hague - plays Cutpurse
+radleybrown - reveals Native Village, Duchy, Silver, Native Village, Gold
+Soldier - reveals Native Village, Silver, Silver, Duchy, Province
+Serf Hague - plays 2 Copper
+Serf Hague - buys Cutpurse
+Serf Hague - gains Cutpurse
+Serf Hague - draws Copper, Copper
+Serf Hague - shuffles deck
+Serf Hague - draws Cutpurse, Pearl Diver, Smugglers
+ 
+---------- radleybrown: turn 9 ----------
+radleybrown - duration Caravan
+radleybrown - draws Silver
+radleybrown - plays Native Village
+radleybrown - sets aside Province
+radleybrown - plays Native Village
+radleybrown - sets aside Silver
+radleybrown - plays 2 Silver, 1 Gold
+radleybrown - buys Gold
+radleybrown - gains Gold
+radleybrown - draws Silver, Outpost, Duchy, Gold, Province
+ 
+---------- Soldier: turn 9 ----------
+Soldier - plays Native Village
+Soldier - sets aside Gold
+Soldier - plays 2 Silver
+Soldier - buys Caravan
+Soldier - gains Caravan
+Soldier - shuffles deck
+Soldier - draws Cutpurse, Silver, Caravan, Province, Copper
+ 
+---------- Serf Hague: turn 10 ----------
+Serf Hague - plays Pearl Diver
+Serf Hague - draws Estate
+Serf Hague - places Estate on bottom of deck
+Serf Hague - plays Cutpurse
+radleybrown - reveals Silver, Outpost, Duchy, Gold, Province
+Soldier - discards Copper
+Serf Hague - plays 2 Copper
+Serf Hague - buys Cutpurse
+Serf Hague - gains Cutpurse
+Serf Hague - draws Warehouse, Copper, Pearl Diver, Cutpurse, Outpost
+ 
+---------- radleybrown: turn 10 ----------
+radleybrown - plays Outpost
+radleybrown - plays 1 Silver, 1 Gold
+radleybrown - buys Duchy
+radleybrown - gains Duchy
+radleybrown - draws Duchy, Gold, Outpost
+radleybrown - duration Outpost
+ 
+---------- radleybrown: turn 10 ----------
+radleybrown - plays 1 Gold
+radleybrown - buys Warehouse
+radleybrown - gains Curse
+radleybrown - gains Warehouse
+radleybrown - draws Estate, Silver, Silver
+radleybrown - shuffles deck
+radleybrown - draws Gold, Duchy
+ 
+---------- Soldier: turn 10 ----------
+Soldier - plays Caravan
+Soldier - draws Silver
+Soldier - plays Cutpurse
+Serf Hague - discards Copper
+radleybrown - reveals Estate, Silver, Silver, Gold, Duchy
+Soldier - plays 2 Silver
+Soldier - buys Gold
+Soldier - gains Gold
+Soldier - draws Native Village, Silver, Province, Caravan, Laboratory
+ 
+---------- Serf Hague: turn 11 ----------
+Serf Hague - plays Pearl Diver
+Serf Hague - draws Copper
+Serf Hague - places Estate on bottom of deck
+Serf Hague - plays Warehouse
+Serf Hague - draws Copper, Copper, Copper
+Serf Hague - discards Cutpurse
+Serf Hague - discards Copper
+Serf Hague - discards Copper
+Serf Hague - plays Outpost
+Serf Hague - plays 2 Copper
+Serf Hague - buys Pearl Diver
+Serf Hague - gains Pearl Diver
+Serf Hague - draws Copper, Estate, Smugglers
+Serf Hague - duration Outpost
+ 
+---------- Serf Hague: turn 11 ----------
+Serf Hague - plays Smugglers
+Serf Hague - gains Gold
+Serf Hague - plays 1 Copper
+Serf Hague - buys Copper
+Serf Hague - gains Copper
+Serf Hague - draws Caravan, Outpost, Silver, Cutpurse, Estate
+ 
+---------- radleybrown: turn 11 ----------
+radleybrown - plays 2 Silver, 1 Gold
+radleybrown - buys Gold
+radleybrown - gains Gold
+radleybrown - draws Gold, Gold, Silver, Outpost, Duchy
+ 
+---------- Soldier: turn 11 ----------
+Soldier - duration Caravan
+Soldier - draws Copper
+Soldier - plays Native Village
+Soldier - takes set aside cards: Gold
+Soldier - plays Laboratory
+Soldier - draws Cutpurse, Province
+Soldier - plays Caravan
+Soldier - draws Duchy
+Soldier - plays Cutpurse
+Serf Hague - reveals Caravan, Outpost, Silver, Cutpurse, Estate
+radleybrown - reveals Gold, Gold, Silver, Outpost, Duchy
+Soldier - plays 1 Silver, 1 Copper, 1 Gold
+Soldier - buys Province
+Soldier - gains Province
+Soldier - draws Silver, Duchy, Silver
+Soldier - shuffles deck
+Soldier - draws Province, Laboratory
+ 
+---------- Serf Hague: turn 12 ----------
+Serf Hague - plays Caravan
+Serf Hague - shuffles deck
+Serf Hague - draws Copper
+Serf Hague - plays Outpost
+Serf Hague - plays 1 Silver, 1 Copper
+Serf Hague - buys Smugglers
+Serf Hague - gains Smugglers
+Serf Hague - draws Copper, Cutpurse, Smugglers
+Serf Hague - duration Outpost
+ 
+---------- Serf Hague: turn 12 ----------
+Serf Hague - duration Caravan
+Serf Hague - draws Copper
+Serf Hague - plays Cutpurse
+radleybrown - reveals Gold, Gold, Silver, Outpost, Duchy
+Soldier - reveals Silver, Duchy, Silver, Province, Laboratory
+Serf Hague - plays 2 Copper
+Serf Hague - buys Caravan
+Serf Hague - gains Caravan
+Serf Hague - draws Pearl Diver, Gold, Pearl Diver, Copper, Cutpurse
+ 
+---------- radleybrown: turn 12 ----------
+radleybrown - plays Outpost
+radleybrown - plays 2 Gold, 1 Silver
+radleybrown - buys Province
+radleybrown - gains Province
+radleybrown - draws Curse, Caravan, Native Village
+radleybrown - duration Outpost
+ 
+---------- radleybrown: turn 12 ----------
+radleybrown - plays Caravan
+radleybrown - draws Gold
+radleybrown - plays Native Village
+radleybrown - sets aside Warehouse
+radleybrown - plays 1 Gold
+radleybrown - buys Smugglers
+radleybrown - gains Smugglers
+radleybrown - draws Outpost, Native Village, Province, Duchy, Duchy
+ 
+---------- Soldier: turn 12 ----------
+Soldier - duration Caravan
+Soldier - draws Silver
+Soldier - plays Laboratory
+Soldier - draws Silver, Province
+Soldier - plays 4 Silver
+Soldier - buys Province
+Soldier - gains Province
+Soldier - draws Cutpurse, Duchy, Native Village, Silver, Province
+ 
+---------- Serf Hague: turn 13 ----------
+Serf Hague - plays Pearl Diver
+Serf Hague - draws Pearl Diver
+Serf Hague - places Estate on bottom of deck
+Serf Hague - plays Pearl Diver
+Serf Hague - draws Cutpurse
+Serf Hague - places Estate on bottom of deck
+Serf Hague - plays Pearl Diver
+Serf Hague - draws Warehouse
+Serf Hague - places Estate on bottom of deck
+Serf Hague - plays Warehouse
+Serf Hague - draws Smugglers, Estate, Copper
+Serf Hague - discards Estate
+Serf Hague - discards Smugglers
+Serf Hague - discards Cutpurse
+Serf Hague - plays Cutpurse
+radleybrown - reveals Outpost, Native Village, Province, Duchy, Duchy
+Soldier - reveals Cutpurse, Duchy, Native Village, Silver, Province
+Serf Hague - plays 2 Copper, 1 Gold
+Serf Hague - buys Gold
+Serf Hague - gains Gold
+Serf Hague - draws Copper, Copper, Copper, Outpost, Copper
+ 
+---------- radleybrown: turn 13 ----------
+radleybrown - duration Caravan
+radleybrown - draws Silver
+radleybrown - plays Native Village
+radleybrown - sets aside Silver
+radleybrown - plays Outpost
+radleybrown - plays 1 Silver
+radleybrown - buys Native Village
+radleybrown - gains Native Village
+radleybrown - shuffles deck
+radleybrown - draws Duchy, Gold, Silver
+radleybrown - duration Outpost
+ 
+---------- radleybrown: turn 13 ----------
+radleybrown - plays 1 Gold, 1 Silver
+radleybrown - buys Duchy
+radleybrown - gains Duchy
+radleybrown - draws Gold, Province, Silver, Duchy, Gold
+ 
+---------- Soldier: turn 13 ----------
+Soldier - plays Native Village
+Soldier - sets aside Gold
+Soldier - plays Cutpurse
+Serf Hague - discards Copper
+radleybrown - reveals Gold, Province, Silver, Duchy, Gold
+Soldier - plays 1 Silver
+Soldier - buys Caravan
+Soldier - gains Caravan
+Soldier - draws Province, Cutpurse, Copper, Copper, Gold
+ 
+---------- Serf Hague: turn 14 ----------
+Serf Hague - plays Outpost
+Serf Hague - plays 3 Copper
+Serf Hague - buys Silver
+Serf Hague - gains Silver
+Serf Hague - draws Estate
+Serf Hague - shuffles deck
+Serf Hague - draws Smugglers, Copper
+Serf Hague - duration Outpost
+ 
+---------- Serf Hague: turn 14 ----------
+Serf Hague - plays Smugglers
+Serf Hague - gains Caravan
+Serf Hague - plays 1 Copper
+Serf Hague - draws Estate, Copper, Smugglers, Copper, Warehouse
+ 
+---------- radleybrown: turn 14 ----------
+radleybrown - plays 2 Gold, 1 Silver
+radleybrown - buys Province
+radleybrown - gains Province
+radleybrown - draws Gold, Silver, Caravan, Duchy, Estate
+ 
+---------- Soldier: turn 14 ----------
+Soldier - plays Cutpurse
+Serf Hague - discards Copper
+radleybrown - reveals Gold, Silver, Caravan, Duchy, Estate
+Soldier - plays 2 Copper, 1 Gold
+Soldier - buys Duchy
+Soldier - gains Duchy
+Soldier - draws Caravan
+Soldier - shuffles deck
+Soldier - draws Province, Cutpurse, Province, Silver
+ 
+---------- Serf Hague: turn 15 ----------
+Serf Hague - plays Warehouse
+Serf Hague - draws Silver, Copper, Copper
+Serf Hague - discards Estate
+Serf Hague - discards Copper
+Serf Hague - discards Copper
+Serf Hague - plays Smugglers
+Serf Hague - gains Duchy
+Serf Hague - plays 1 Silver, 1 Copper
+Serf Hague - buys Silver
+Serf Hague - gains Silver
+Serf Hague - draws Caravan, Outpost, Copper, Copper, Pearl Diver
+ 
+---------- radleybrown: turn 15 ----------
+radleybrown - plays Caravan
+radleybrown - draws Curse
+radleybrown - plays 1 Gold, 1 Silver
+radleybrown - buys Duchy
+radleybrown - gains Duchy
+radleybrown - draws Silver, Outpost, Native Village, Gold, Native Village
+ 
+---------- Soldier: turn 15 ----------
+Soldier - plays Caravan
+Soldier - draws Silver
+Soldier - plays Cutpurse
+Serf Hague - discards Copper
+radleybrown - reveals Silver, Outpost, Native Village, Gold, Native Village
+Soldier - plays 2 Silver
+Soldier - buys Duchy
+Soldier - gains Duchy
+Soldier - draws Province, Caravan, Cutpurse, Duchy, Province
+ 
+---------- Serf Hague: turn 16 ----------
+Serf Hague - plays Caravan
+Serf Hague - draws Cutpurse
+Serf Hague - plays Pearl Diver
+Serf Hague - draws Copper
+Serf Hague - places Silver on top of deck
+Serf Hague - plays Outpost
+Serf Hague - plays 2 Copper
+Serf Hague - buys Estate
+Serf Hague - gains Estate
+Serf Hague - draws Silver, Cutpurse, Estate
+Serf Hague - duration Outpost
+ 
+---------- Serf Hague: turn 16 ----------
+Serf Hague - duration Caravan
+Serf Hague - draws Gold
+Serf Hague - plays Cutpurse
+radleybrown - reveals Silver, Outpost, Native Village, Gold, Native Village
+Soldier - reveals Province, Caravan, Cutpurse, Duchy, Province
+Serf Hague - plays 1 Silver, 1 Gold
+Serf Hague - buys Gold
+Serf Hague - gains Gold
+Serf Hague - draws Cutpurse, Gold, Smugglers, Caravan, Copper
+ 
+---------- radleybrown: turn 16 ----------
+radleybrown - duration Caravan
+radleybrown - draws Native Village
+radleybrown - plays Native Village
+radleybrown - sets aside Smugglers
+radleybrown - plays Native Village
+radleybrown - sets aside Province
+radleybrown - plays Native Village
+radleybrown - sets aside Duchy
+radleybrown - plays Outpost
+radleybrown - plays 1 Silver, 1 Gold
+radleybrown - buys Duchy
+radleybrown - gains Duchy
+radleybrown - shuffles deck
+radleybrown - draws Duchy, Native Village, Estate
+radleybrown - duration Outpost
+ 
+---------- radleybrown: turn 16 ----------
+radleybrown - plays Native Village
+radleybrown - takes set aside cards: Province, Silver, Warehouse, Silver, Smugglers, Province, Duchy
+radleybrown - plays Warehouse
+radleybrown - draws Duchy, Silver, Duchy
+radleybrown - discards Duchy
+radleybrown - discards Duchy
+radleybrown - discards Duchy
+radleybrown - plays Smugglers
+radleybrown - gains Gold
+radleybrown - plays 3 Silver
+radleybrown - buys Gold
+radleybrown - gains Gold
+radleybrown - draws Gold, Silver, Gold, Outpost, Curse
+ 
+---------- Soldier: turn 16 ----------
+Soldier - duration Caravan
+Soldier - draws Duchy
+Soldier - plays Caravan
+Soldier - draws Silver
+Soldier - plays Cutpurse
+Serf Hague - discards Copper
+radleybrown - reveals Gold, Silver, Gold, Outpost, Curse
+Soldier - plays 1 Silver
+Soldier - buys Caravan
+Soldier - gains Caravan
+Soldier - draws Gold, Duchy, Copper, Province, Silver
+ 
+---------- Serf Hague: turn 17 ----------
+Serf Hague - plays Caravan
+Serf Hague - draws Cutpurse
+Serf Hague - plays Cutpurse
+radleybrown - reveals Gold, Silver, Gold, Outpost, Curse
+Soldier - discards Copper
+Serf Hague - plays 1 Gold
+Serf Hague - buys Outpost
+Serf Hague - gains Outpost
+Serf Hague - draws Pearl Diver, Pearl Diver
+Serf Hague - shuffles deck
+Serf Hague - draws Pearl Diver, Estate, Copper
+ 
+---------- radleybrown: turn 17 ----------
+radleybrown - plays Outpost
+radleybrown - plays 2 Gold, 1 Silver
+radleybrown - buys Province
+radleybrown - gains Province
+radleybrown - draws Native Village, Gold, Province
+radleybrown - duration Outpost
+ 
+---------- radleybrown: turn 17 ----------
+radleybrown - plays Native Village
+radleybrown - sets aside Native Village
+radleybrown - plays 1 Gold
+radleybrown - buys Silver
+radleybrown - gains Silver
+radleybrown - draws Duchy, Gold, Caravan, Silver, Duchy
+ 
+---------- Soldier: turn 17 ----------
+Soldier - duration Caravan
+Soldier - draws Silver
+Soldier - plays 2 Silver, 1 Gold
+Soldier - buys Estate
+Soldier - gains Estate
+Soldier - draws Caravan, Native Village, Laboratory, Copper
+Soldier - shuffles deck
+Soldier - draws Caravan
+ 
+---------- Serf Hague: turn 18 ----------
+Serf Hague - duration Caravan
+Serf Hague - draws Copper
+Serf Hague - plays Pearl Diver
+Serf Hague - draws Copper
+Serf Hague - places Estate on bottom of deck
+Serf Hague - plays Pearl Diver
+Serf Hague - draws Outpost
+Serf Hague - places Estate on bottom of deck
+Serf Hague - plays Pearl Diver
+Serf Hague - draws Cutpurse
+Serf Hague - places Estate on bottom of deck
+Serf Hague - plays Outpost
+Serf Hague - plays 3 Copper
+Serf Hague - buys Estate
+Serf Hague - gains Estate
+Serf Hague - draws Smugglers, Outpost, Cutpurse
+Serf Hague - duration Outpost
+ 
+---------- Serf Hague: turn 18 ----------
+Serf Hague - plays Cutpurse
+radleybrown - reveals Duchy, Gold, Caravan, Silver, Duchy
+Soldier - discards Copper
+Serf Hague - buys Estate
+Serf Hague - gains Estate
+Serf Hague - draws Gold, Smugglers, Copper, Duchy, Cutpurse
+ 
+---------- radleybrown: turn 18 ----------
+radleybrown - plays Caravan
+radleybrown - draws Gold
+radleybrown - plays 2 Gold, 1 Silver
+radleybrown - buys Province
+radleybrown - gains Province
+radleybrown - draws Duchy, Silver, Province
+radleybrown - shuffles deck
+radleybrown - draws Curse, Province
+ 
+---------- Soldier: turn 18 ----------
+Soldier - plays Native Village
+Soldier - takes set aside cards: Gold
+Soldier - plays Laboratory
+Soldier - draws Cutpurse, Province
+Soldier - plays Caravan
+Soldier - draws Cutpurse
+Soldier - plays Caravan
+Soldier - draws Duchy
+Soldier - plays Cutpurse
+Serf Hague - discards Copper
+radleybrown - reveals Duchy, Silver, Province, Curse, Province
+Soldier - plays Cutpurse
+Serf Hague - reveals Gold, Smugglers, Duchy, Cutpurse
+radleybrown - reveals Duchy, Silver, Province, Curse, Province
+Soldier - plays 1 Gold
+Soldier - buys Estate
+Soldier - gains Estate
+Soldier - draws Province, Silver, Duchy, Gold, Silver
+ 
+---------- Serf Hague: turn 19 ----------
+Serf Hague - plays Cutpurse
+radleybrown - reveals Duchy, Silver, Province, Curse, Province
+Soldier - reveals Province, Silver, Duchy, Gold, Silver
+Serf Hague - plays 1 Gold
+Serf Hague - buys Laboratory
+Serf Hague - gains Laboratory
+Serf Hague - draws Copper, Silver, Silver, Caravan, Gold
+ 
+---------- radleybrown: turn 19 ----------
+radleybrown - duration Caravan
+radleybrown - draws Gold
+radleybrown - plays 1 Silver, 1 Gold
+radleybrown - buys Outpost
+radleybrown - gains Outpost
+radleybrown - draws Duchy, Province, Native Village, Duchy, Gold
+ 
+---------- Soldier: turn 19 ----------
+Soldier - duration Caravan
+Soldier - draws Copper
+Soldier - duration Caravan
+Soldier - draws Silver
+Soldier - plays 3 Silver, 1 Gold, 1 Copper
+Soldier - buys Estate
+Soldier - gains Estate
+Soldier - draws Caravan, Province, Caravan, Silver, Province
+ 
+---------- Serf Hague: turn 20 ----------
+Serf Hague - plays Caravan
+Serf Hague - draws Copper
+Serf Hague - plays 2 Copper, 2 Silver, 1 Gold
+Serf Hague - buys Province
+Serf Hague - gains Province
+Serf Hague - draws Copper, Estate, Copper, Smugglers, Cutpurse
+ 
+------------ Game Over ------------
+radleybrown - cards: 3 Native Village, 3 Outpost, 1 Caravan, 1 Warehouse, 1 Smugglers, 7 Silver, 7 Gold, 7 Duchy, 6 Province, 1 Estate, 1 Curse
+radleybrown - total victory points: 57
+radleybrown - turns: 19
+ 
+Soldier - cards: 4 Caravan, 2 Cutpurse, 1 Native Village, 1 Laboratory, 5 Silver, 2 Copper, 2 Gold, 5 Province, 4 Duchy, 3 Estate
+Soldier - total victory points: 45
+Soldier - turns: 19
+ 
+Serf Hague - cards: 4 Cutpurse, 3 Outpost, 3 Smugglers, 3 Caravan, 3 Pearl Diver, 1 Warehouse, 1 Laboratory, 9 Copper, 3 Gold, 3 Silver, 6 Estate, 1 Duchy, 1 Province
+Serf Hague - total victory points: 15
+Serf Hague - turns: 20
+ 
+1st place: radleybrown
+2nd place: Soldier
+3rd place: Serf Hague
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.5158c673e4b0ee7f08a5981a.1364826012999.txt b/testing/testdata/log.5158c673e4b0ee7f08a5981a.1364826012999.txt
new file mode 100644
index 0000000..cacfdb6
--- /dev/null
+++ b/testing/testdata/log.5158c673e4b0ee7f08a5981a.1364826012999.txt
@@ -0,0 +1,635 @@
+------------ Game Setup ------------
+Supply cards: Vagrant, Oracle, Coppersmith, Mining Village, Monument, Highway, Ill-Gotten Gains, Merchant Ship, Fairgrounds, Forge, Copper, Silver, Gold, Estate, Duchy, Province, Curse
+Kyre - starting cards: Necropolis, Overgrown Estate, Hovel, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+radimir0609 - starting cards: Necropolis, Overgrown Estate, Hovel, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Kyre - shuffles deck
+radimir0609 - shuffles deck
+Kyre - draws Copper, Hovel, Copper, Copper, Copper
+radimir0609 - draws Hovel, Copper, Necropolis, Overgrown Estate, Copper
+ 
+---------- radimir0609: turn 1 ----------
+radimir0609 - plays 2 Copper
+radimir0609 - buys Vagrant
+radimir0609 - gains Vagrant
+radimir0609 - draws Copper, Copper, Copper, Copper, Copper
+ 
+---------- Kyre: turn 1 ----------
+Kyre - plays 4 Copper
+Kyre - buys Monument
+Kyre - gains Monument
+Kyre - draws Copper, Copper, Overgrown Estate, Copper, Necropolis
+ 
+---------- radimir0609: turn 2 ----------
+radimir0609 - plays 5 Copper
+radimir0609 - buys Highway
+radimir0609 - gains Highway
+radimir0609 - shuffles deck
+radimir0609 - draws Copper, Hovel, Copper, Highway, Overgrown Estate
+ 
+---------- Kyre: turn 2 ----------
+Kyre - plays Necropolis
+Kyre - plays 3 Copper
+Kyre - buys Oracle
+Kyre - gains Oracle
+Kyre - shuffles deck
+Kyre - draws Copper, Oracle, Copper, Monument, Hovel
+ 
+---------- radimir0609: turn 3 ----------
+radimir0609 - plays Highway
+radimir0609 - draws Copper
+radimir0609 - plays 3 Copper
+radimir0609 - buys Monument
+radimir0609 - gains Monument
+radimir0609 - draws Copper, Copper, Copper, Copper, Vagrant
+ 
+---------- Kyre: turn 3 ----------
+Kyre - plays Monument
+Kyre - receives 1 victory point chips
+Kyre - plays 2 Copper
+Kyre - buys Monument
+Kyre - gains Monument
+Kyre - draws Copper, Overgrown Estate, Copper, Copper, Copper
+ 
+---------- radimir0609: turn 4 ----------
+radimir0609 - plays Vagrant
+radimir0609 - draws Necropolis
+radimir0609 - shuffles deck
+radimir0609 - reveals: Overgrown Estate
+radimir0609 - places Overgrown Estate in hand
+radimir0609 - plays 4 Copper
+radimir0609 - buys Silver
+radimir0609 - gains Silver
+radimir0609 - draws Copper, Hovel, Copper, Monument, Copper
+ 
+---------- Kyre: turn 4 ----------
+Kyre - plays 4 Copper
+Kyre - buys Mining Village
+Kyre - gains Mining Village
+Kyre - draws Copper, Necropolis
+Kyre - shuffles deck
+Kyre - draws Copper, Oracle, Copper
+ 
+---------- radimir0609: turn 5 ----------
+radimir0609 - plays Monument
+radimir0609 - receives 1 victory point chips
+radimir0609 - plays 3 Copper
+radimir0609 - buys Ill-Gotten Gains
+radimir0609 - gains Ill-Gotten Gains
+Kyre - gains Curse
+radimir0609 - draws Highway
+radimir0609 - shuffles deck
+radimir0609 - draws Copper, Silver, Hovel, Necropolis
+ 
+---------- Kyre: turn 5 ----------
+Kyre - plays Necropolis
+Kyre - plays Oracle
+Kyre - reveals: Copper, Hovel
+Kyre - discards: Copper, Hovel
+radimir0609 - reveals: Ill-Gotten Gains, Copper
+radimir0609 - discards: Ill-Gotten Gains, Copper
+Kyre - draws Overgrown Estate, Mining Village
+Kyre - plays Mining Village
+Kyre - draws Copper
+Kyre - plays 4 Copper
+Kyre - buys Mining Village
+Kyre - gains Mining Village
+Kyre - draws Copper, Monument, Copper, Monument
+Kyre - shuffles deck
+Kyre - draws Copper
+ 
+---------- radimir0609: turn 6 ----------
+radimir0609 - plays Necropolis
+radimir0609 - plays Highway
+radimir0609 - draws Overgrown Estate
+radimir0609 - plays 1 Copper, 1 Silver
+radimir0609 - buys Mining Village
+radimir0609 - gains Mining Village
+radimir0609 - draws Copper, Monument, Copper, Copper, Vagrant
+ 
+---------- Kyre: turn 6 ----------
+Kyre - plays Monument
+Kyre - receives 1 victory point chips
+Kyre - plays 3 Copper
+Kyre - buys Highway
+Kyre - gains Highway
+Kyre - draws Mining Village, Copper, Mining Village, Copper, Copper
+ 
+---------- radimir0609: turn 7 ----------
+radimir0609 - plays Vagrant
+radimir0609 - draws Copper
+radimir0609 - reveals: Copper
+radimir0609 - places Copper on top of deck
+radimir0609 - plays Monument
+radimir0609 - receives 1 victory point chips
+radimir0609 - plays 4 Copper
+radimir0609 - buys Gold
+radimir0609 - gains Gold
+radimir0609 - draws Copper
+radimir0609 - shuffles deck
+radimir0609 - draws Hovel, Copper, Necropolis, Copper
+ 
+---------- Kyre: turn 7 ----------
+Kyre - plays Mining Village
+Kyre - draws Overgrown Estate
+Kyre - plays Mining Village
+Kyre - draws Curse
+Kyre - plays 3 Copper
+Kyre - buys Oracle
+Kyre - gains Oracle
+Kyre - draws Copper, Hovel, Oracle, Necropolis
+Kyre - shuffles deck
+Kyre - draws Copper
+ 
+---------- radimir0609: turn 8 ----------
+radimir0609 - plays 3 Copper
+radimir0609 - buys Oracle
+radimir0609 - gains Oracle
+radimir0609 - draws Mining Village, Copper, Highway, Copper, Gold
+ 
+---------- Kyre: turn 8 ----------
+Kyre - plays Necropolis
+Kyre - plays Oracle
+Kyre - reveals: Copper, Monument
+Kyre - places Monument on top of deck
+Kyre - places Copper on top of deck
+radimir0609 - reveals: Copper, Monument
+radimir0609 - discards: Copper, Monument
+Kyre - draws Copper, Monument
+Kyre - plays Monument
+Kyre - receives 1 victory point chips
+Kyre - plays 3 Copper
+Kyre - buys Highway
+Kyre - gains Highway
+Kyre - draws Curse, Copper, Overgrown Estate, Monument, Mining Village
+ 
+---------- radimir0609: turn 9 ----------
+radimir0609 - plays Mining Village
+radimir0609 - draws Overgrown Estate
+radimir0609 - plays Highway
+radimir0609 - draws Ill-Gotten Gains
+radimir0609 - plays Ill-Gotten Gains
+radimir0609 - plays 2 Copper, 1 Gold
+radimir0609 - buys Forge
+radimir0609 - gains Forge
+radimir0609 - draws Silver, Vagrant, Copper
+radimir0609 - shuffles deck
+radimir0609 - draws Highway, Copper
+ 
+---------- Kyre: turn 9 ----------
+Kyre - plays Mining Village
+Kyre - draws Copper
+Kyre - plays Monument
+Kyre - receives 1 victory point chips
+Kyre - plays 2 Copper
+Kyre - buys Mining Village
+Kyre - gains Mining Village
+Kyre - draws Oracle, Copper, Copper, Mining Village, Highway
+ 
+---------- radimir0609: turn 10 ----------
+radimir0609 - plays Vagrant
+radimir0609 - draws Copper
+radimir0609 - reveals: Copper
+radimir0609 - places Copper on top of deck
+radimir0609 - plays Highway
+radimir0609 - draws Copper
+radimir0609 - plays 4 Copper, 1 Silver
+radimir0609 - buys Monument
+radimir0609 - gains Monument
+radimir0609 - draws Forge, Overgrown Estate, Copper, Copper, Gold
+ 
+---------- Kyre: turn 10 ----------
+Kyre - plays Mining Village
+Kyre - shuffles deck
+Kyre - draws Monument
+Kyre - plays Highway
+Kyre - draws Copper
+Kyre - plays Oracle
+Kyre - reveals: Copper, Hovel
+Kyre - discards: Copper, Hovel
+radimir0609 - reveals: Hovel, Ill-Gotten Gains
+radimir0609 - places Ill-Gotten Gains on top of deck
+radimir0609 - places Hovel on top of deck
+Kyre - draws Copper, Mining Village
+Kyre - plays Mining Village
+Kyre - draws Necropolis
+Kyre - plays Monument
+Kyre - receives 1 victory point chips
+Kyre - plays 4 Copper
+Kyre - buys Forge
+Kyre - gains Forge
+Kyre - draws Mining Village, Overgrown Estate, Highway, Oracle, Copper
+ 
+---------- radimir0609: turn 11 ----------
+radimir0609 - plays Forge
+radimir0609 - trashes Overgrown Estate, Copper, Copper
+radimir0609 - draws Hovel
+radimir0609 - plays 1 Gold
+radimir0609 - buys Oracle
+radimir0609 - gains Oracle
+radimir0609 - draws Ill-Gotten Gains, Oracle, Necropolis, Mining Village, Monument
+ 
+---------- Kyre: turn 11 ----------
+Kyre - plays Mining Village
+Kyre - draws Copper
+Kyre - plays Highway
+Kyre - draws Monument
+Kyre - plays Oracle
+Kyre - reveals: Curse
+Kyre - shuffles deck
+Kyre - reveals: Highway
+Kyre - discards: Curse, Highway
+radimir0609 - reveals: Copper
+radimir0609 - shuffles deck
+radimir0609 - reveals: Silver
+radimir0609 - discards: Copper, Silver
+Kyre - draws Copper, Copper
+Kyre - plays Monument
+Kyre - receives 1 victory point chips
+Kyre - plays 4 Copper
+Kyre - buys Forge
+Kyre - gains Forge
+Kyre - draws Copper, Hovel, Necropolis, Mining Village, Mining Village
+ 
+---------- radimir0609: turn 12 ----------
+radimir0609 - plays Necropolis
+radimir0609 - plays Monument
+radimir0609 - receives 1 victory point chips
+radimir0609 - plays Mining Village
+radimir0609 - draws Oracle
+radimir0609 - plays Oracle
+radimir0609 - reveals: Forge, Gold
+radimir0609 - places Forge on top of deck
+radimir0609 - places Gold on top of deck
+Kyre - reveals: Copper, Forge
+Kyre - discards: Copper, Forge
+radimir0609 - draws Gold, Forge
+radimir0609 - plays Ill-Gotten Gains
+radimir0609 - plays 1 Gold
+radimir0609 - buys Gold
+radimir0609 - gains Gold
+radimir0609 - draws Monument, Copper, Highway, Hovel, Copper
+ 
+---------- Kyre: turn 12 ----------
+Kyre - plays Mining Village
+Kyre - draws Monument
+Kyre - plays Mining Village
+Kyre - draws Oracle
+Kyre - plays Oracle
+Kyre - reveals: Copper
+Kyre - shuffles deck
+Kyre - reveals: Mining Village
+Kyre - discards: Copper, Mining Village
+radimir0609 - reveals: Copper, Copper
+radimir0609 - places Copper on top of deck
+radimir0609 - places Copper on top of deck
+Kyre - draws Copper, Highway
+Kyre - plays Highway
+Kyre - draws Copper
+Kyre - plays Monument
+Kyre - receives 1 victory point chips
+Kyre - plays Necropolis
+Kyre - plays 3 Copper
+Kyre - buys Merchant Ship
+Kyre - gains Merchant Ship
+Kyre - draws Copper, Oracle, Highway, Forge, Overgrown Estate
+ 
+---------- radimir0609: turn 13 ----------
+radimir0609 - plays Highway
+radimir0609 - draws Copper
+radimir0609 - plays Monument
+radimir0609 - receives 1 victory point chips
+radimir0609 - plays 3 Copper
+radimir0609 - buys Merchant Ship
+radimir0609 - gains Merchant Ship
+radimir0609 - draws Copper, Vagrant
+radimir0609 - shuffles deck
+radimir0609 - draws Copper, Gold, Oracle
+ 
+---------- Kyre: turn 13 ----------
+Kyre - plays Forge
+Kyre - trashes Highway, Overgrown Estate, Copper
+Kyre - draws Forge
+Kyre - gains Gold
+Kyre - draws Monument, Curse, Copper, Copper
+Kyre - shuffles deck
+Kyre - draws Monument
+ 
+---------- radimir0609: turn 14 ----------
+radimir0609 - plays Vagrant
+radimir0609 - draws Copper
+radimir0609 - reveals: Oracle
+radimir0609 - places Oracle on top of deck
+radimir0609 - plays Oracle
+radimir0609 - reveals: Oracle, Monument
+radimir0609 - places Oracle on top of deck
+radimir0609 - places Monument on top of deck
+Kyre - reveals: Gold, Copper
+Kyre - discards: Gold, Copper
+radimir0609 - draws Monument, Oracle
+radimir0609 - plays 3 Copper, 1 Gold
+radimir0609 - buys Mining Village
+radimir0609 - gains Mining Village
+radimir0609 - draws Forge, Silver, Copper, Merchant Ship, Ill-Gotten Gains
+ 
+---------- Kyre: turn 14 ----------
+Kyre - plays Monument
+Kyre - receives 1 victory point chips
+Kyre - plays 2 Copper
+Kyre - buys Mining Village
+Kyre - gains Mining Village
+Kyre - draws Forge, Mining Village, Highway, Mining Village, Hovel
+ 
+---------- radimir0609: turn 15 ----------
+radimir0609 - plays Forge
+radimir0609 - trashes Copper
+radimir0609 - gains Copper
+radimir0609 - plays 1 Silver
+radimir0609 - plays Ill-Gotten Gains
+radimir0609 - buys Silver
+radimir0609 - gains Silver
+radimir0609 - draws Monument, Necropolis, Mining Village, Hovel, Gold
+ 
+---------- Kyre: turn 15 ----------
+Kyre - plays Mining Village
+Kyre - draws Merchant Ship
+Kyre - plays Mining Village
+Kyre - draws Copper
+Kyre - plays Highway
+Kyre - draws Copper
+Kyre - plays Merchant Ship
+Kyre - plays Forge
+Kyre - trashes Hovel, Copper, Copper
+Kyre - gains Copper
+Kyre - buys Vagrant
+Kyre - gains Vagrant
+Kyre - draws Mining Village, Necropolis, Oracle, Oracle, Forge
+ 
+---------- radimir0609: turn 16 ----------
+radimir0609 - plays Necropolis
+radimir0609 - plays Monument
+radimir0609 - receives 1 victory point chips
+radimir0609 - plays Mining Village
+radimir0609 - draws Highway
+radimir0609 - plays Highway
+radimir0609 - draws Copper
+radimir0609 - plays 1 Gold, 1 Copper
+radimir0609 - buys Gold
+radimir0609 - gains Gold
+radimir0609 - shuffles deck
+radimir0609 - draws Copper, Copper, Gold, Highway, Monument
+ 
+---------- Kyre: turn 16 ----------
+Kyre - duration Merchant Ship
+Kyre - plays Mining Village
+Kyre - draws Copper
+Kyre - plays Oracle
+Kyre - shuffles deck
+Kyre - reveals: Gold, Highway
+Kyre - places Highway on top of deck
+Kyre - places Gold on top of deck
+radimir0609 - reveals: Ill-Gotten Gains, Silver
+radimir0609 - discards: Ill-Gotten Gains, Silver
+Kyre - draws Gold, Highway
+Kyre - plays Necropolis
+Kyre - plays Oracle
+Kyre - reveals: Monument, Copper
+Kyre - places Monument on top of deck
+Kyre - places Copper on top of deck
+radimir0609 - reveals: Vagrant, Mining Village
+radimir0609 - discards: Vagrant, Mining Village
+Kyre - draws Copper, Monument
+Kyre - plays Highway
+Kyre - draws Monument
+Kyre - plays Monument
+Kyre - receives 1 victory point chips
+Kyre - plays 2 Copper, 1 Gold
+Kyre - buys Province
+Kyre - gains Province
+Kyre - draws Mining Village, Curse, Copper, Vagrant, Copper
+ 
+---------- radimir0609: turn 17 ----------
+radimir0609 - plays Highway
+radimir0609 - draws Merchant Ship
+radimir0609 - plays Monument
+radimir0609 - receives 1 victory point chips
+radimir0609 - plays 2 Copper, 1 Gold
+radimir0609 - buys Mining Village
+radimir0609 - gains Mining Village
+radimir0609 - draws Copper, Necropolis, Oracle, Gold, Gold
+ 
+---------- Kyre: turn 17 ----------
+Kyre - plays Vagrant
+Kyre - draws Copper
+Kyre - reveals: Mining Village
+Kyre - places Mining Village on top of deck
+Kyre - plays Mining Village
+Kyre - draws Mining Village
+Kyre - plays Mining Village
+Kyre - draws Mining Village
+Kyre - plays Mining Village
+Kyre - draws Forge
+Kyre - plays Forge
+Kyre - trashes Copper, Copper, Curse, Copper
+Kyre - gains Copper
+Kyre - shuffles deck
+Kyre - draws Province, Highway, Copper, Necropolis, Mining Village
+ 
+---------- radimir0609: turn 18 ----------
+radimir0609 - plays Necropolis
+radimir0609 - plays Oracle
+radimir0609 - reveals: Hovel, Copper
+radimir0609 - discards: Hovel, Copper
+Kyre - reveals: Copper, Monument
+Kyre - discards: Copper, Monument
+radimir0609 - draws Oracle, Silver
+radimir0609 - plays Oracle
+radimir0609 - reveals: Monument, Copper
+radimir0609 - places Monument on top of deck
+radimir0609 - places Copper on top of deck
+Kyre - reveals: Forge, Oracle
+Kyre - discards: Forge, Oracle
+radimir0609 - draws Copper, Monument
+radimir0609 - plays 2 Copper, 2 Gold, 1 Silver
+radimir0609 - buys Province
+radimir0609 - gains Province
+radimir0609 - draws Forge, Mining Village
+radimir0609 - shuffles deck
+radimir0609 - draws Copper, Highway, Ill-Gotten Gains
+ 
+---------- Kyre: turn 18 ----------
+Kyre - plays Mining Village
+Kyre - draws Merchant Ship
+Kyre - plays Highway
+Kyre - draws Vagrant
+Kyre - plays Vagrant
+Kyre - draws Mining Village
+Kyre - reveals: Monument
+Kyre - places Monument on top of deck
+Kyre - plays Mining Village
+Kyre - draws Monument
+Kyre - plays Merchant Ship
+Kyre - plays Monument
+Kyre - receives 1 victory point chips
+Kyre - buys Merchant Ship
+Kyre - gains Merchant Ship
+Kyre - draws Mining Village, Gold, Copper, Forge, Oracle
+ 
+---------- radimir0609: turn 19 ----------
+radimir0609 - plays Mining Village
+radimir0609 - draws Province
+radimir0609 - plays Highway
+radimir0609 - draws Silver
+radimir0609 - plays Forge
+radimir0609 - trashes Copper, Ill-Gotten Gains
+radimir0609 - gains Highway
+radimir0609 - plays 1 Silver
+radimir0609 - buys Silver
+radimir0609 - gains Silver
+radimir0609 - draws Vagrant, Gold, Silver, Copper, Oracle
+ 
+---------- Kyre: turn 19 ----------
+Kyre - duration Merchant Ship
+Kyre - plays Mining Village
+Kyre - draws Mining Village
+Kyre - plays Mining Village
+Kyre - shuffles deck
+Kyre - draws Mining Village
+Kyre - plays Oracle
+Kyre - reveals: Monument, Copper
+Kyre - discards: Monument, Copper
+radimir0609 - reveals: Merchant Ship, Hovel
+radimir0609 - discards: Merchant Ship, Hovel
+Kyre - draws Forge, Oracle
+Kyre - plays Mining Village
+Kyre - draws Copper
+Kyre - trashes Mining Village
+Kyre - plays Oracle
+Kyre - reveals: Mining Village, Province
+Kyre - discards: Mining Village, Province
+radimir0609 - reveals: Necropolis, Copper
+radimir0609 - places Copper on top of deck
+radimir0609 - places Necropolis on top of deck
+Kyre - draws Vagrant, Necropolis
+Kyre - plays Vagrant
+Kyre - draws Merchant Ship
+Kyre - reveals: Monument
+Kyre - places Monument on top of deck
+Kyre - plays Merchant Ship
+Kyre - plays Forge
+Kyre - trashes Copper, Copper, Necropolis, Forge
+Kyre - gains Province
+Kyre - plays 1 Gold
+Kyre - buys Province
+Kyre - gains Province
+Kyre - draws Monument, Highway
+Kyre - shuffles deck
+Kyre - draws Province, Mining Village, Forge
+ 
+---------- radimir0609: turn 20 ----------
+radimir0609 - plays Vagrant
+radimir0609 - draws Necropolis
+radimir0609 - reveals: Copper
+radimir0609 - places Copper on top of deck
+radimir0609 - plays Necropolis
+radimir0609 - plays Oracle
+radimir0609 - reveals: Copper, Copper
+radimir0609 - discards: Copper, Copper
+Kyre - reveals: Oracle, Merchant Ship
+Kyre - discards: Oracle, Merchant Ship
+radimir0609 - draws Copper, Gold
+radimir0609 - plays 2 Gold, 2 Copper, 1 Silver
+radimir0609 - buys Province
+radimir0609 - gains Province
+radimir0609 - draws Mining Village, Oracle, Monument, Gold, Mining Village
+ 
+---------- Kyre: turn 20 ----------
+Kyre - duration Merchant Ship
+Kyre - plays Mining Village
+Kyre - draws Mining Village
+Kyre - plays Forge
+Kyre - trashes Mining Village, Monument
+Kyre - gains Province
+Kyre - plays Highway
+Kyre - draws Mining Village
+Kyre - plays Mining Village
+Kyre - draws Province
+Kyre - trashes Mining Village
+Kyre - buys Duchy
+Kyre - gains Duchy
+Kyre - draws Monument, Province, Copper, Oracle, Vagrant
+ 
+---------- radimir0609: turn 21 ----------
+radimir0609 - plays Mining Village
+radimir0609 - draws Monument
+radimir0609 - plays Monument
+radimir0609 - receives 1 victory point chips
+radimir0609 - plays Mining Village
+radimir0609 - shuffles deck
+radimir0609 - draws Gold
+radimir0609 - plays Monument
+radimir0609 - receives 1 victory point chips
+radimir0609 - plays Oracle
+radimir0609 - reveals: Highway, Silver
+radimir0609 - places Highway on top of deck
+radimir0609 - places Silver on top of deck
+Kyre - reveals: Gold
+Kyre - shuffles deck
+Kyre - reveals: Oracle
+Kyre - discards: Gold, Oracle
+radimir0609 - draws Silver, Highway
+radimir0609 - plays 2 Gold, 1 Silver
+radimir0609 - buys Province
+radimir0609 - gains Province
+radimir0609 - draws Forge, Mining Village, Necropolis, Silver, Copper
+ 
+---------- Kyre: turn 21 ----------
+Kyre - plays Vagrant
+Kyre - draws Merchant Ship
+Kyre - reveals: Duchy
+Kyre - places Duchy in hand
+Kyre - plays Monument
+Kyre - receives 1 victory point chips
+Kyre - plays 1 Copper
+Kyre - buys Estate
+Kyre - gains Estate
+Kyre - draws Highway, Forge, Merchant Ship, Province, Province
+ 
+---------- radimir0609: turn 22 ----------
+radimir0609 - plays Necropolis
+radimir0609 - plays Mining Village
+radimir0609 - draws Merchant Ship
+radimir0609 - plays Merchant Ship
+radimir0609 - plays 1 Silver, 1 Copper
+radimir0609 - buys Duchy
+radimir0609 - gains Duchy
+radimir0609 - draws Highway, Oracle, Copper, Province, Copper
+ 
+---------- Kyre: turn 22 ----------
+Kyre - plays Highway
+Kyre - draws Mining Village
+Kyre - plays Mining Village
+Kyre - draws Province
+Kyre - trashes Mining Village
+Kyre - plays Merchant Ship
+Kyre - plays Forge
+Kyre - trashes Province
+Kyre - gains Province
+Kyre - buys Duchy
+Kyre - gains Duchy
+Kyre - shuffles deck
+Kyre - draws Province, Highway, Monument, Copper, Oracle
+ 
+------------ Game Over ------------
+Kyre - cards: 2 Oracle, 2 Merchant Ship, 1 Vagrant, 1 Monument, 1 Highway, 1 Forge, 1 Copper, 1 Gold, 4 Province, 2 Duchy, 1 Estate
+Kyre - victory point chips: 11
+Kyre - total victory points: 42
+Kyre - turns: 22
+ 
+radimir0609 - cards: 3 Mining Village, 2 Highway, 2 Monument, 2 Oracle, 1 Merchant Ship, 1 Vagrant, 1 Necropolis, 1 Forge, 4 Copper, 3 Gold, 3 Silver, 3 Province, 1 Duchy, 1 Hovel
+radimir0609 - victory point chips: 8
+radimir0609 - total victory points: 29
+radimir0609 - turns: 22
+ 
+1st place: Kyre
+2nd place: radimir0609
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.51919af0e4b0d001ef25b885.1368496912009.txt b/testing/testdata/log.51919af0e4b0d001ef25b885.1368496912009.txt
new file mode 100644
index 0000000..d7de96a
--- /dev/null
+++ b/testing/testdata/log.51919af0e4b0d001ef25b885.1368496912009.txt
@@ -0,0 +1,100 @@
+------------ Game Setup ------------
+Supply cards: Village, Feast, Gardens, Moneylender, Remodel, Smithy, Throne Room, Festival, Market, Adventurer, Copper, Silver, Gold, Estate, Duchy, Province, Curse
+Rating system: casual
+guest2666.0000 - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Defender Bot - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Banker Bot - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Villager Bot - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+guest2666.0000 - shuffles deck
+Defender Bot - shuffles deck
+Banker Bot - shuffles deck
+Villager Bot - shuffles deck
+guest2666.0000 - draws Estate, Estate, Copper, Copper, Estate
+Defender Bot - draws Copper, Estate, Estate, Copper, Copper
+Banker Bot - draws Copper, Copper, Copper, Estate, Copper
+Villager Bot - draws Copper, Copper, Estate, Copper, Copper
+ 
+---------- Villager Bot: turn 1 ----------
+Villager Bot - plays 4 Copper
+Villager Bot - buys Moneylender
+Villager Bot - gains Moneylender
+Villager Bot - draws Copper, Copper, Estate, Estate, Copper
+ 
+---------- guest2666.0000: turn 1 ----------
+guest2666.0000 - plays 2 Copper
+guest2666.0000 - buys Estate
+guest2666.0000 - gains Estate
+guest2666.0000 - draws Copper, Copper, Copper, Copper, Copper
+ 
+---------- Defender Bot: turn 1 ----------
+Defender Bot - plays 3 Copper
+Defender Bot - buys Silver
+Defender Bot - gains Silver
+Defender Bot - draws Estate, Copper, Copper, Copper, Copper
+ 
+---------- Banker Bot: turn 1 ----------
+Banker Bot - plays 4 Copper
+Banker Bot - buys Silver
+Banker Bot - gains Silver
+Banker Bot - draws Copper, Copper, Estate, Estate, Copper
+ 
+---------- Villager Bot: turn 2 ----------
+Villager Bot - plays 3 Copper
+Villager Bot - buys Silver
+Villager Bot - gains Silver
+Villager Bot - shuffles deck
+Villager Bot - draws Copper, Copper, Copper, Copper, Silver
+ 
+---------- guest2666.0000: turn 2 ----------
+guest2666.0000 - plays 5 Copper
+guest2666.0000 - buys Duchy
+guest2666.0000 - gains Duchy
+guest2666.0000 - shuffles deck
+guest2666.0000 - draws Copper, Copper, Estate, Copper, Copper
+ 
+---------- Defender Bot: turn 2 ----------
+Defender Bot - plays 4 Copper
+Defender Bot - buys Moneylender
+Defender Bot - gains Moneylender
+Defender Bot - shuffles deck
+Defender Bot - draws Copper, Silver, Copper, Moneylender, Estate
+ 
+---------- Banker Bot: turn 2 ----------
+Banker Bot - plays 3 Copper
+Banker Bot - buys Silver
+Banker Bot - gains Silver
+Banker Bot - shuffles deck
+Banker Bot - draws Estate, Silver, Estate, Copper, Copper
+ 
+---------- Villager Bot: turn 3 ----------
+Villager Bot - plays 4 Copper, 1 Silver
+Villager Bot - buys Gold
+Villager Bot - gains Gold
+Villager Bot - draws Estate, Copper, Copper, Estate, Estate
+ 
+---------- guest2666.0000: turn 3 ----------
+guest2666.0000 - plays 4 Copper
+ 
+------------ Game Over ------------
+Defender Bot - cards: 1 Moneylender, 7 Copper, 1 Silver, 3 Estate
+Defender Bot - total victory points: 3
+Defender Bot - turns: 2
+ 
+Banker Bot - cards: 7 Copper, 2 Silver, 3 Estate
+Banker Bot - total victory points: 3
+Banker Bot - turns: 2
+ 
+Villager Bot - cards: 1 Moneylender, 7 Copper, 1 Gold, 1 Silver, 3 Estate
+Villager Bot - total victory points: 3
+Villager Bot - turns: 3
+ 
+guest2666.0000 - quit
+guest2666.0000 - cards: 3 Copper, 4 Estate, 1 Duchy
+guest2666.0000 - total victory points: 7
+guest2666.0000 - turns: 2
+ 
+1st place: Defender Bot
+1st place: Banker Bot
+2nd place: Villager Bot
+3rd place: guest2666.0000
+ 
\ No newline at end of file
diff --git a/testing/testdata/log.5191c02ce4b0ce5189dc951a.1368506756212.txt b/testing/testdata/log.5191c02ce4b0ce5189dc951a.1368506756212.txt
new file mode 100644
index 0000000..14f07eb
--- /dev/null
+++ b/testing/testdata/log.5191c02ce4b0ce5189dc951a.1368506756212.txt
@@ -0,0 +1,784 @@
+------------ Game Setup ------------
+Supply cards: Chapel, Village, Bureaucrat, Militia, Remodel, Smithy, Thief, Festival, Market, Witch, Copper, Silver, Gold, Estate, Duchy, Province, Curse
+Rating system: casual
+guest3852 - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+Warlord Bot - starting cards: Estate, Estate, Estate, Copper, Copper, Copper, Copper, Copper, Copper, Copper
+guest3852 - shuffles deck
+Warlord Bot - shuffles deck
+guest3852 - draws Estate, Copper, Copper, Copper, Copper
+Warlord Bot - draws Copper, Copper, Estate, Copper, Copper
+ 
+---------- guest3852: turn 1 ----------
+guest3852 - plays 4 Copper
+guest3852 - buys Bureaucrat
+guest3852 - gains Bureaucrat
+guest3852 - draws Copper, Estate, Copper, Estate, Copper
+ 
+---------- Warlord Bot: turn 1 ----------
+Warlord Bot - plays 4 Copper
+Warlord Bot - buys Militia
+Warlord Bot - gains Militia
+Warlord Bot - draws Estate, Estate, Copper, Copper, Copper
+ 
+---------- guest3852: turn 2 ----------
+guest3852 - plays 3 Copper
+guest3852 - buys Chapel
+guest3852 - gains Chapel
+guest3852 - shuffles deck
+guest3852 - draws Copper, Copper, Estate, Estate, Estate
+ 
+---------- Warlord Bot: turn 2 ----------
+Warlord Bot - plays 3 Copper
+Warlord Bot - buys Chapel
+Warlord Bot - gains Chapel
+Warlord Bot - shuffles deck
+Warlord Bot - draws Copper, Chapel, Estate, Copper, Copper
+ 
+---------- guest3852: turn 3 ----------
+guest3852 - draws Copper, Copper, Copper, Chapel, Bureaucrat
+ 
+---------- Warlord Bot: turn 3 ----------
+Warlord Bot - plays Chapel
+Warlord Bot - trashes Estate, Copper, Copper, Copper
+Warlord Bot - draws Copper, Estate, Militia, Copper, Copper
+ 
+---------- guest3852: turn 4 ----------
+guest3852 - plays Chapel
+guest3852 - trashes Copper, Copper, Copper
+guest3852 - draws Copper, Copper
+guest3852 - shuffles deck
+guest3852 - draws Copper, Estate, Estate
+ 
+---------- Warlord Bot: turn 4 ----------
+Warlord Bot - plays Militia
+guest3852 - discards Estate
+guest3852 - discards Estate
+Warlord Bot - plays 3 Copper
+Warlord Bot - buys Witch
+Warlord Bot - gains Witch
+Warlord Bot - draws Copper, Estate
+Warlord Bot - shuffles deck
+Warlord Bot - draws Chapel, Copper, Estate
+ 
+---------- guest3852: turn 5 ----------
+guest3852 - plays 3 Copper
+guest3852 - buys Silver
+guest3852 - gains Silver
+guest3852 - draws Chapel, Estate, Copper, Bureaucrat
+guest3852 - shuffles deck
+guest3852 - draws Estate
+ 
+---------- Warlord Bot: turn 5 ----------
+Warlord Bot - plays Chapel
+Warlord Bot - trashes Estate, Estate, Copper, Copper
+Warlord Bot - draws Militia, Copper, Copper, Witch
+Warlord Bot - shuffles deck
+Warlord Bot - draws Chapel
+ 
+---------- guest3852: turn 6 ----------
+guest3852 - plays Chapel
+guest3852 - trashes Estate, Copper, Bureaucrat, Estate
+guest3852 - draws Silver, Copper, Estate, Copper, Copper
+ 
+---------- Warlord Bot: turn 6 ----------
+Warlord Bot - plays Witch
+guest3852 - gains Curse
+Warlord Bot - plays 2 Copper
+Warlord Bot - shuffles deck
+Warlord Bot - draws Copper, Copper, Chapel, Witch, Militia
+ 
+---------- guest3852: turn 7 ----------
+guest3852 - plays 3 Copper, 1 Silver
+guest3852 - buys Festival
+guest3852 - gains Festival
+guest3852 - shuffles deck
+guest3852 - draws Copper, Silver, Estate, Festival, Curse
+ 
+---------- Warlord Bot: turn 7 ----------
+Warlord Bot - plays Witch
+guest3852 - gains Curse
+Warlord Bot - plays 2 Copper
+Warlord Bot - shuffles deck
+Warlord Bot - draws Witch, Copper, Militia, Copper, Chapel
+ 
+---------- guest3852: turn 8 ----------
+guest3852 - plays Festival
+guest3852 - plays 1 Copper, 1 Silver
+guest3852 - buys Witch
+guest3852 - gains Witch
+guest3852 - draws Copper, Copper, Chapel
+guest3852 - shuffles deck
+guest3852 - draws Curse, Copper
+ 
+---------- Warlord Bot: turn 8 ----------
+Warlord Bot - plays Witch
+guest3852 - gains Curse
+Warlord Bot - plays 2 Copper
+Warlord Bot - shuffles deck
+Warlord Bot - draws Witch, Militia, Chapel, Copper, Copper
+ 
+---------- guest3852: turn 9 ----------
+guest3852 - plays Chapel
+guest3852 - trashes Copper, Copper, Curse, Copper
+guest3852 - draws Festival, Silver, Estate, Curse, Witch
+ 
+---------- Warlord Bot: turn 9 ----------
+Warlord Bot - plays Witch
+guest3852 - gains Curse
+Warlord Bot - plays 2 Copper
+Warlord Bot - shuffles deck
+Warlord Bot - draws Witch, Copper, Chapel, Copper, Militia
+ 
+---------- guest3852: turn 10 ----------
+guest3852 - plays Festival
+guest3852 - plays Witch
+guest3852 - shuffles deck
+guest3852 - draws Curse, Curse
+Warlord Bot - gains Curse
+guest3852 - draws Chapel
+guest3852 - shuffles deck
+guest3852 - draws Silver, Curse, Estate, Witch
+ 
+---------- Warlord Bot: turn 10 ----------
+Warlord Bot - plays Witch
+Warlord Bot - shuffles deck
+Warlord Bot - draws Curse
+guest3852 - gains Curse
+Warlord Bot - plays 2 Copper
+Warlord Bot - shuffles deck
+Warlord Bot - draws Copper, Curse, Chapel, Copper, Militia
+ 
+---------- guest3852: turn 11 ----------
+guest3852 - plays Chapel
+guest3852 - trashes Curse, Estate
+guest3852 - draws Curse, Festival, Curse
+guest3852 - shuffles deck
+guest3852 - draws Curse, Witch
+ 
+---------- Warlord Bot: turn 11 ----------
+Warlord Bot - plays Militia
+guest3852 - discards Curse
+guest3852 - discards Curse
+Warlord Bot - plays 2 Copper
+Warlord Bot - buys Militia
+Warlord Bot - gains Militia
+Warlord Bot - draws Witch
+Warlord Bot - shuffles deck
+Warlord Bot - draws Militia, Copper, Copper, Militia
+ 
+---------- guest3852: turn 12 ----------
+guest3852 - plays Festival
+guest3852 - plays Witch
+guest3852 - draws Chapel, Silver
+Warlord Bot - gains Curse
+guest3852 - plays Chapel
+guest3852 - trashes Curse
+guest3852 - plays 1 Silver
+guest3852 - buys Militia
+guest3852 - gains Militia
+guest3852 - shuffles deck
+guest3852 - draws Curse, Militia, Festival, Silver, Curse
+ 
+---------- Warlord Bot: turn 12 ----------
+Warlord Bot - plays Witch
+Warlord Bot - draws Curse, Chapel
+guest3852 - gains Curse
+Warlord Bot - plays 2 Copper
+Warlord Bot - shuffles deck
+Warlord Bot - draws Militia, Copper, Curse, Militia, Curse
+ 
+---------- guest3852: turn 13 ----------
+guest3852 - plays Festival
+guest3852 - plays Militia
+Warlord Bot - discards Curse
+Warlord Bot - discards Curse
+guest3852 - plays 1 Silver
+guest3852 - buys Festival
+guest3852 - gains Festival
+guest3852 - draws Chapel, Witch
+guest3852 - shuffles deck
+guest3852 - draws Silver, Festival, Curse
+ 
+---------- Warlord Bot: turn 13 ----------
+Warlord Bot - plays Militia
+guest3852 - discards Curse
+guest3852 - discards Chapel
+Warlord Bot - plays 1 Copper
+Warlord Bot - buys Village
+Warlord Bot - gains Village
+Warlord Bot - draws Chapel, Witch, Copper
+Warlord Bot - shuffles deck
+Warlord Bot - draws Village, Copper
+ 
+---------- guest3852: turn 14 ----------
+guest3852 - plays Festival
+guest3852 - plays Witch
+guest3852 - draws Curse, Militia
+Warlord Bot - gains Curse
+guest3852 - plays Militia
+Warlord Bot - discards Copper
+Warlord Bot - discards Copper
+guest3852 - plays 1 Silver
+guest3852 - buys Smithy
+guest3852 - gains Smithy
+guest3852 - draws Festival, Curse
+guest3852 - shuffles deck
+guest3852 - draws Militia, Festival, Chapel
+ 
+---------- Warlord Bot: turn 14 ----------
+Warlord Bot - plays Village
+Warlord Bot - draws Curse
+Warlord Bot - plays Witch
+Warlord Bot - draws Curse, Militia
+guest3852 - gains Curse
+Warlord Bot - plays Militia
+guest3852 - discards Chapel
+guest3852 - discards Curse
+Warlord Bot - draws Militia
+Warlord Bot - shuffles deck
+Warlord Bot - draws Curse, Curse, Copper, Copper
+ 
+---------- guest3852: turn 15 ----------
+guest3852 - plays Festival
+guest3852 - plays Militia
+Warlord Bot - discards Curse
+Warlord Bot - discards Curse
+guest3852 - plays Festival
+guest3852 - buys Festival
+guest3852 - gains Festival
+guest3852 - draws Silver, Witch, Curse, Curse, Smithy
+ 
+---------- Warlord Bot: turn 15 ----------
+Warlord Bot - plays Militia
+guest3852 - discards Witch
+guest3852 - discards Curse
+Warlord Bot - plays 2 Copper
+Warlord Bot - buys Village
+Warlord Bot - gains Village
+Warlord Bot - draws Village, Chapel, Militia, Curse, Witch
+ 
+---------- guest3852: turn 16 ----------
+guest3852 - plays Smithy
+guest3852 - shuffles deck
+guest3852 - draws Chapel, Militia, Curse
+guest3852 - draws Curse, Festival, Festival, Curse, Witch
+ 
+---------- Warlord Bot: turn 16 ----------
+Warlord Bot - plays Village
+Warlord Bot - shuffles deck
+Warlord Bot - draws Curse
+Warlord Bot - plays Militia
+guest3852 - discards Curse
+guest3852 - discards Curse
+Warlord Bot - plays Chapel
+Warlord Bot - trashes Curse, Curse
+Warlord Bot - draws Militia, Copper, Village, Curse, Copper
+ 
+---------- guest3852: turn 17 ----------
+guest3852 - plays Festival
+guest3852 - plays Festival
+guest3852 - plays Witch
+guest3852 - draws Festival
+guest3852 - shuffles deck
+guest3852 - draws Curse
+guest3852 - plays Festival
+guest3852 - buys Smithy
+guest3852 - gains Smithy
+guest3852 - draws Curse, Curse, Smithy, Silver, Chapel
+ 
+---------- Warlord Bot: turn 17 ----------
+Warlord Bot - plays Village
+Warlord Bot - shuffles deck
+Warlord Bot - draws Chapel
+Warlord Bot - plays Militia
+guest3852 - discards Curse
+guest3852 - discards Curse
+Warlord Bot - plays Chapel
+Warlord Bot - trashes Curse, Copper, Copper
+Warlord Bot - draws Militia, Village, Witch
+Warlord Bot - shuffles deck
+Warlord Bot - draws Militia, Village
+ 
+---------- guest3852: turn 18 ----------
+guest3852 - draws Curse, Militia
+guest3852 - shuffles deck
+guest3852 - draws Witch, Silver, Festival
+ 
+---------- Warlord Bot: turn 18 ----------
+Warlord Bot - plays Village
+Warlord Bot - draws Chapel
+Warlord Bot - plays Village
+Warlord Bot - plays Militia
+guest3852 - discards Curse
+guest3852 - discards Silver
+Warlord Bot - plays Militia
+Warlord Bot - buys Militia
+Warlord Bot - gains Militia
+Warlord Bot - shuffles deck
+Warlord Bot - draws Militia, Militia, Militia, Village, Village
+ 
+---------- guest3852: turn 19 ----------
+guest3852 - plays Festival
+guest3852 - plays Witch
+guest3852 - draws Smithy, Smithy
+guest3852 - plays Smithy
+guest3852 - draws Curse, Chapel, Festival
+guest3852 - draws Curse, Curse, Festival
+guest3852 - shuffles deck
+guest3852 - draws Smithy, Festival
+ 
+---------- Warlord Bot: turn 19 ----------
+Warlord Bot - plays Village
+Warlord Bot - draws Chapel
+Warlord Bot - plays Village
+Warlord Bot - draws Witch
+Warlord Bot - plays Militia
+guest3852 - discards Curse
+guest3852 - discards Curse
+Warlord Bot - plays Militia
+Warlord Bot - plays Militia
+Warlord Bot - buys Gold
+Warlord Bot - gains Gold
+Warlord Bot - shuffles deck
+Warlord Bot - draws Militia, Village, Militia, Witch, Chapel
+ 
+---------- guest3852: turn 20 ----------
+guest3852 - plays Festival
+guest3852 - plays Festival
+guest3852 - plays Smithy
+guest3852 - draws Curse, Chapel, Curse
+guest3852 - plays Chapel
+guest3852 - trashes Curse, Curse
+guest3852 - buys Village
+guest3852 - gains Village
+guest3852 - draws Witch, Silver, Festival, Smithy, Militia
+ 
+---------- Warlord Bot: turn 20 ----------
+Warlord Bot - plays Village
+Warlord Bot - draws Gold
+Warlord Bot - plays Militia
+guest3852 - discards Silver
+guest3852 - discards Militia
+Warlord Bot - plays Militia
+Warlord Bot - plays 1 Gold
+Warlord Bot - buys Festival
+Warlord Bot - gains Festival
+Warlord Bot - draws Village, Militia
+Warlord Bot - shuffles deck
+Warlord Bot - draws Festival, Militia, Witch
+ 
+---------- guest3852: turn 21 ----------
+guest3852 - plays Festival
+guest3852 - plays Smithy
+guest3852 - shuffles deck
+guest3852 - draws Village, Curse, Curse
+guest3852 - plays Village
+guest3852 - draws Chapel
+guest3852 - plays Witch
+guest3852 - draws Festival, Silver
+guest3852 - plays Festival
+guest3852 - plays Chapel
+guest3852 - trashes Curse, Curse
+guest3852 - plays 1 Silver
+guest3852 - buys Village
+guest3852 - gains Village
+guest3852 - buys Village
+guest3852 - gains Village
+guest3852 - draws Festival, Militia, Smithy
+guest3852 - shuffles deck
+guest3852 - draws Village, Silver
+ 
+---------- Warlord Bot: turn 21 ----------
+Warlord Bot - plays Festival
+Warlord Bot - plays Village
+Warlord Bot - draws Chapel
+Warlord Bot - plays Militia
+guest3852 - discards Silver
+guest3852 - discards Militia
+Warlord Bot - plays Militia
+Warlord Bot - plays Witch
+Warlord Bot - draws Gold, Militia
+Warlord Bot - plays 1 Gold
+Warlord Bot - buys Festival
+Warlord Bot - gains Festival
+Warlord Bot - buys Militia
+Warlord Bot - gains Militia
+Warlord Bot - draws Village
+Warlord Bot - shuffles deck
+Warlord Bot - draws Witch, Militia, Chapel, Festival
+ 
+---------- guest3852: turn 22 ----------
+guest3852 - plays Festival
+guest3852 - plays Smithy
+guest3852 - draws Smithy, Witch, Village
+guest3852 - plays Village
+guest3852 - draws Village
+guest3852 - plays Smithy
+guest3852 - draws Festival, Chapel, Festival
+guest3852 - plays Village
+guest3852 - shuffles deck
+guest3852 - draws Silver
+guest3852 - plays Village
+guest3852 - draws Militia
+guest3852 - plays Festival
+guest3852 - plays Witch
+guest3852 - plays Festival
+guest3852 - plays Militia
+Warlord Bot - discards Chapel
+Warlord Bot - discards Witch
+guest3852 - plays 1 Silver
+guest3852 - buys Gold
+guest3852 - gains Gold
+guest3852 - buys Smithy
+guest3852 - gains Smithy
+guest3852 - shuffles deck
+guest3852 - draws Smithy, Festival, Witch, Smithy, Chapel
+ 
+---------- Warlord Bot: turn 22 ----------
+Warlord Bot - plays Festival
+Warlord Bot - plays Village
+Warlord Bot - draws Gold
+Warlord Bot - plays Militia
+guest3852 - discards Witch
+guest3852 - discards Chapel
+Warlord Bot - plays 1 Gold
+Warlord Bot - buys Militia
+Warlord Bot - gains Militia
+Warlord Bot - buys Village
+Warlord Bot - gains Village
+Warlord Bot - draws Festival, Village, Militia, Militia, Militia
+ 
+---------- guest3852: turn 23 ----------
+guest3852 - plays Festival
+guest3852 - plays Smithy
+guest3852 - draws Gold, Silver, Village
+guest3852 - plays Village
+guest3852 - draws Smithy
+guest3852 - plays Smithy
+guest3852 - draws Festival, Village, Militia
+guest3852 - plays Village
+guest3852 - draws Village
+guest3852 - plays Smithy
+guest3852 - draws Festival
+guest3852 - shuffles deck
+guest3852 - draws Witch, Chapel
+guest3852 - plays Festival
+guest3852 - plays Militia
+Warlord Bot - discards Militia
+Warlord Bot - discards Militia
+guest3852 - plays Village
+guest3852 - plays Festival
+guest3852 - plays Witch
+guest3852 - plays 1 Gold, 1 Silver
+guest3852 - buys Gold
+guest3852 - gains Gold
+guest3852 - buys Village
+guest3852 - gains Village
+guest3852 - buys Village
+guest3852 - gains Village
+guest3852 - shuffles deck
+guest3852 - draws Smithy, Festival, Gold, Gold, Village
+ 
+---------- Warlord Bot: turn 23 ----------
+Warlord Bot - plays Festival
+Warlord Bot - plays Village
+Warlord Bot - shuffles deck
+Warlord Bot - draws Village
+Warlord Bot - plays Village
+Warlord Bot - draws Gold
+Warlord Bot - plays Militia
+guest3852 - discards Gold
+guest3852 - discards Gold
+Warlord Bot - plays 1 Gold
+Warlord Bot - buys Village
+Warlord Bot - gains Village
+Warlord Bot - buys Militia
+Warlord Bot - gains Militia
+Warlord Bot - draws Militia, Chapel, Militia, Village, Witch
+ 
+---------- guest3852: turn 24 ----------
+guest3852 - plays Festival
+guest3852 - plays Village
+guest3852 - draws Village
+guest3852 - plays Smithy
+guest3852 - draws Village, Festival, Silver
+guest3852 - plays Village
+guest3852 - draws Witch
+guest3852 - plays Village
+guest3852 - draws Militia
+guest3852 - plays Festival
+guest3852 - plays Witch
+guest3852 - draws Chapel, Festival
+guest3852 - plays Festival
+guest3852 - plays Militia
+Warlord Bot - discards Chapel
+Warlord Bot - discards Witch
+guest3852 - plays 1 Silver
+guest3852 - buys Smithy
+guest3852 - gains Smithy
+guest3852 - buys Smithy
+guest3852 - gains Smithy
+guest3852 - draws Village, Smithy, Smithy, Village
+guest3852 - shuffles deck
+guest3852 - draws Smithy
+ 
+---------- Warlord Bot: turn 24 ----------
+Warlord Bot - plays Village
+Warlord Bot - draws Militia
+Warlord Bot - plays Militia
+guest3852 - discards Village
+guest3852 - discards Smithy
+Warlord Bot - plays Militia
+Warlord Bot - buys Village
+Warlord Bot - gains Village
+Warlord Bot - draws Festival, Militia
+Warlord Bot - shuffles deck
+Warlord Bot - draws Village, Militia, Militia
+ 
+---------- guest3852: turn 25 ----------
+guest3852 - plays Village
+guest3852 - draws Festival
+guest3852 - plays Smithy
+guest3852 - draws Village, Festival, Gold
+guest3852 - plays Festival
+guest3852 - plays Smithy
+guest3852 - draws Militia, Festival, Chapel
+guest3852 - plays Village
+guest3852 - draws Smithy
+guest3852 - plays Festival
+guest3852 - plays Festival
+guest3852 - plays Smithy
+guest3852 - draws Gold, Village, Silver
+guest3852 - plays Village
+guest3852 - draws Smithy
+guest3852 - plays Militia
+Warlord Bot - discards Militia
+Warlord Bot - discards Militia
+guest3852 - plays Smithy
+guest3852 - draws Witch, Village
+guest3852 - shuffles deck
+guest3852 - draws Smithy
+guest3852 - plays Village
+guest3852 - draws Village
+guest3852 - plays Smithy
+guest3852 - plays Village
+guest3852 - plays Witch
+guest3852 - plays 2 Gold, 1 Silver
+guest3852 - buys Province
+guest3852 - gains Province
+guest3852 - buys Province
+guest3852 - gains Province
+guest3852 - shuffles deck
+guest3852 - draws Smithy, Silver, Militia, Province, Smithy
+ 
+---------- Warlord Bot: turn 25 ----------
+Warlord Bot - plays Festival
+Warlord Bot - plays Village
+Warlord Bot - draws Chapel
+Warlord Bot - plays Militia
+guest3852 - discards Province
+guest3852 - discards Smithy
+Warlord Bot - buys Estate
+Warlord Bot - gains Estate
+Warlord Bot - buys Estate
+Warlord Bot - gains Estate
+Warlord Bot - draws Witch, Gold, Village, Militia, Village
+ 
+---------- guest3852: turn 26 ----------
+guest3852 - plays Militia
+Warlord Bot - discards Gold
+Warlord Bot - discards Witch
+guest3852 - draws Gold, Chapel, Village, Village, Smithy
+ 
+---------- Warlord Bot: turn 26 ----------
+Warlord Bot - plays Village
+Warlord Bot - draws Militia
+Warlord Bot - plays Village
+Warlord Bot - draws Village
+Warlord Bot - plays Village
+Warlord Bot - draws Village
+Warlord Bot - plays Village
+Warlord Bot - draws Militia
+Warlord Bot - plays Militia
+guest3852 - discards Chapel
+guest3852 - discards Gold
+Warlord Bot - plays Militia
+Warlord Bot - plays Militia
+Warlord Bot - buys Duchy
+Warlord Bot - gains Duchy
+Warlord Bot - draws Festival
+Warlord Bot - shuffles deck
+Warlord Bot - draws Village, Estate, Witch, Militia
+ 
+---------- guest3852: turn 27 ----------
+guest3852 - plays Village
+guest3852 - draws Smithy
+guest3852 - plays Village
+guest3852 - draws Smithy
+guest3852 - plays Smithy
+guest3852 - draws Village, Village, Festival
+guest3852 - plays Smithy
+guest3852 - draws Province, Witch, Gold
+guest3852 - plays Village
+guest3852 - draws Festival
+guest3852 - plays Festival
+guest3852 - plays Village
+guest3852 - draws Village
+guest3852 - plays Smithy
+guest3852 - draws Festival
+guest3852 - shuffles deck
+guest3852 - draws Silver, Militia
+guest3852 - plays Festival
+guest3852 - plays Village
+guest3852 - draws Smithy
+guest3852 - plays Festival
+guest3852 - plays Smithy
+guest3852 - draws Gold, Smithy, Province
+guest3852 - plays Smithy
+guest3852 - draws Chapel
+guest3852 - plays Militia
+Warlord Bot - discards Estate
+Warlord Bot - discards Witch
+guest3852 - plays 2 Gold, 1 Silver
+guest3852 - buys Province
+guest3852 - gains Province
+guest3852 - buys Province
+guest3852 - gains Province
+guest3852 - shuffles deck
+guest3852 - draws Smithy, Village, Festival, Smithy, Silver
+ 
+---------- Warlord Bot: turn 27 ----------
+Warlord Bot - plays Festival
+Warlord Bot - plays Village
+Warlord Bot - draws Militia
+Warlord Bot - plays Militia
+guest3852 - discards Silver
+guest3852 - discards Festival
+Warlord Bot - plays Militia
+Warlord Bot - buys Duchy
+Warlord Bot - gains Duchy
+Warlord Bot - draws Estate, Festival, Duchy, Militia, Village
+ 
+---------- guest3852: turn 28 ----------
+guest3852 - plays Village
+guest3852 - draws Smithy
+guest3852 - plays Smithy
+guest3852 - draws Smithy, Village, Smithy
+guest3852 - plays Village
+guest3852 - draws Province
+guest3852 - plays Smithy
+guest3852 - draws Village, Festival, Chapel
+guest3852 - plays Village
+guest3852 - draws Village
+guest3852 - plays Smithy
+guest3852 - draws Witch, Militia, Festival
+guest3852 - plays Festival
+guest3852 - plays Smithy
+guest3852 - draws Village, Province, Province
+guest3852 - plays Village
+guest3852 - draws Gold
+guest3852 - plays Village
+guest3852 - draws Gold
+guest3852 - plays Smithy
+guest3852 - draws Province
+guest3852 - shuffles deck
+guest3852 - draws Festival, Silver
+guest3852 - plays Festival
+guest3852 - plays Festival
+guest3852 - plays Militia
+Warlord Bot - discards Duchy
+Warlord Bot - discards Estate
+guest3852 - plays Witch
+guest3852 - plays 2 Gold, 1 Silver
+guest3852 - buys Province
+guest3852 - gains Province
+guest3852 - buys Province
+guest3852 - gains Province
+guest3852 - shuffles deck
+guest3852 - draws Silver, Province, Province, Village, Smithy
+ 
+---------- Warlord Bot: turn 28 ----------
+Warlord Bot - plays Festival
+Warlord Bot - plays Village
+Warlord Bot - draws Village
+Warlord Bot - plays Village
+Warlord Bot - draws Gold
+Warlord Bot - plays Militia
+guest3852 - discards Province
+guest3852 - discards Province
+Warlord Bot - plays 1 Gold
+Warlord Bot - buys Duchy
+Warlord Bot - gains Duchy
+Warlord Bot - buys Estate
+Warlord Bot - gains Estate
+Warlord Bot - draws Militia, Village, Militia, Village, Chapel
+ 
+---------- guest3852: turn 29 ----------
+guest3852 - plays Village
+guest3852 - draws Chapel
+guest3852 - plays Smithy
+guest3852 - draws Province, Witch, Smithy
+guest3852 - plays Smithy
+guest3852 - draws Village, Village, Province
+guest3852 - draws Smithy, Gold, Smithy, Province, Province
+ 
+---------- Warlord Bot: turn 29 ----------
+Warlord Bot - plays Village
+Warlord Bot - draws Militia
+Warlord Bot - plays Village
+Warlord Bot - shuffles deck
+Warlord Bot - draws Village
+Warlord Bot - plays Village
+Warlord Bot - draws Gold
+Warlord Bot - plays Militia
+guest3852 - discards Province
+guest3852 - discards Smithy
+Warlord Bot - plays Militia
+Warlord Bot - plays Militia
+Warlord Bot - plays 1 Gold
+Warlord Bot - buys Province
+Warlord Bot - gains Province
+Warlord Bot - draws Festival, Duchy, Estate, Festival, Duchy
+ 
+---------- guest3852: turn 30 ----------
+guest3852 - plays Smithy
+guest3852 - draws Village, Militia, Festival
+guest3852 - draws Festival, Festival, Village, Smithy, Gold
+ 
+---------- Warlord Bot: turn 30 ----------
+Warlord Bot - plays Festival
+Warlord Bot - plays Festival
+Warlord Bot - buys Estate
+Warlord Bot - gains Estate
+Warlord Bot - buys Estate
+Warlord Bot - gains Estate
+Warlord Bot - draws Estate, Village, Militia, Village, Militia
+ 
+---------- guest3852: turn 31 ----------
+guest3852 - plays Festival
+guest3852 - plays Festival
+guest3852 - plays Village
+guest3852 - shuffles deck
+guest3852 - draws Village
+guest3852 - plays Village
+guest3852 - draws Province
+guest3852 - plays Smithy
+guest3852 - draws Festival, Province, Chapel
+guest3852 - plays Festival
+guest3852 - plays 1 Gold
+guest3852 - buys Province
+guest3852 - gains Province
+guest3852 - draws Province, Gold, Province, Village, Smithy
+ 
+------------ Game Over ------------
+guest3852 - cards: 5 Village, 5 Smithy, 3 Festival, 1 Chapel, 1 Witch, 1 Militia, 2 Gold, 1 Silver, 7 Province
+guest3852 - total victory points: 42
+guest3852 - turns: 31
+ 
+Warlord Bot - cards: 6 Militia, 5 Village, 2 Festival, 1 Chapel, 1 Witch, 1 Gold, 5 Estate, 3 Duchy, 1 Province
+Warlord Bot - total victory points: 20
+Warlord Bot - turns: 30
+ 
+1st place: guest3852
+2nd place: Warlord Bot
+ 
\ No newline at end of file
diff --git a/update.py b/update.py
index a9f5139..4de591e 100644
--- a/update.py
+++ b/update.py
@@ -9,6 +9,7 @@
 import time
 
 import analyze
+import analyze2
 import background.tasks
 import count_buys
 import dominionstats.utils.log
@@ -83,11 +84,12 @@ def watch_and_log(signature, log_interval=15, timeout=600):
 def main(parsed_args):
     """Primary update cycle"""
 
-    # Scrape and load the data from isotropic, proceeding from the
-    # current day backwards, until no games are inserted
+    # Scrape and load the data from goko, proceeding from the
+    # previous day backwards, until no games are inserted
+    today = datetime.date.today()
     log.info("Starting scrape for raw games")
-    for date in utils.daterange(datetime.date(2010, 10, 15),
-                                datetime.date.today(), reverse=True):
+    dates = utils.daterange(datetime.date(2010,10,14), today, reverse=True)
+    for date in dates:
         log.info("Invoking scrape_raw_games async task for %s", date)
         async_result = watch_and_log(background.tasks.scrape_raw_games.s(date))
         inserted = async_result.get()
@@ -104,28 +106,21 @@ def main(parsed_args):
 
     # Check for goals
     log.info("Starting search for goals acheived")
-    for date in utils.daterange(datetime.date(2010, 10, 15),
-                                datetime.date.today(), reverse=True):
+    # Check for game_stats
+    log.info("Starting game_stats summarization")
+    dates = utils.daterange(datetime.date(2010,10,14), today, reverse=True)
+    for date in dates:
         log.info("Invoking calc_goals_for_days async task for %s", date)
         async_result = watch_and_log(background.tasks.calc_goals_for_days.s([date]))
         inserted = async_result.get()
 
-        if inserted == 0:
-            log.info("No games parsed for goals on %s", date)
-            break
-
-    # Check for game_stats
-    log.info("Starting game_stats summarization")
-    for date in utils.daterange(datetime.date(2010, 10, 15),
-                                datetime.date.today(), reverse=True):
         log.info("Invoking summarize_game_stats_for_days async task for %s", date)
         async_result = watch_and_log(background.tasks.summarize_game_stats_for_days.s([date]))
-        inserted = async_result.get()
-
         if inserted == 0:
-            log.info("No new games summarized on %s", date)
+            log.info("No games parsed for goals on %s", date)
             break
 
+
     # Invoke the count_buys script
     log.info("Counting buys")
     count_buys.main(parsed_args)
@@ -150,6 +145,8 @@ def main(parsed_args):
     log.info("Loading the leaderboard")
     load_leaderboard.main()
 
+    log.info("Starting analyze2") # This is slow. Is it fast enough on cr?
+    analyze2.main(parsed_args)
     log.info("Done with the update.py process")
 
 
diff --git a/update_loop.py b/update_loop.py
index 6374f59..ecc6047 100644
--- a/update_loop.py
+++ b/update_loop.py
@@ -37,6 +37,5 @@
         os.system(cmd)
         os.system('mv %s static/status' % status_fn)
     print 'sleeping'
-    time.sleep(60*15)  # try to update every 15 mins
-
+    time.sleep(60*60*6)  # try to update every 6 hours. 
 
Goal NameTotal Times Achieved% OccurrenceDescriptionLeaders' diff --git a/game.py b/game.py index fc53ac3..a8fdf7d 100644 --- a/game.py +++ b/game.py @@ -7,6 +7,7 @@ import collections import itertools +import re from dominioncards import index_to_card, EVERY_SET_CARDS from keys import * @@ -22,7 +23,7 @@ class PlayerDeckChange(object): " This represents a change to a players deck in response to a game event." - CATEGORIES = ['buys', 'gains', 'returns', 'trashes'] + CATEGORIES = ['buys', 'gains', 'receives', 'returns', 'trashes', 'passes'] def __init__(self, name): self.name = name @@ -55,7 +56,7 @@ def changes(self): return s def accumulates(self): - return self.buys + self.gains + return self.buys + self.gains + self.receives @@ -71,6 +72,8 @@ def __init__(self, turn_dict, game_dict, player, turn_no, poss_no): self.buys = turn_decode(turn_dict, BUYS) self.returns = turn_decode(turn_dict, RETURNS) self.trashes = turn_decode(turn_dict, TRASHES) + self.passes = turn_decode(turn_dict, PASSES) + self.receives = turn_decode(turn_dict, RECEIVES) self.turn_no = turn_no self.poss_no = poss_no self.is_outpost = OUTPOST in turn_dict @@ -84,6 +87,8 @@ def __init__(self, turn_dict, game_dict, player, turn_no, poss_no): getattr(change, 'gains' ).extend(turn_decode(info_dict, GAINS)) getattr(change, 'trashes').extend(turn_decode(info_dict, TRASHES)) getattr(change, 'returns').extend(turn_decode(info_dict, RETURNS)) + getattr(change, 'receives').extend(turn_decode(info_dict, RECEIVES)) + getattr(change, 'passes').extend(turn_decode(info_dict, PASSES)) change.vp_tokens += info_dict.get(VP_TOKENS, 0) self.opp_info[opp_name] = change @@ -109,6 +114,10 @@ def plays_list(self): played.append('Trashes: %s' % self.trashes) if self.returns: played.append('Returns: %s' % self.returns) + if self.passes: + played.append('Passes: %s' % self.passes) + if self.receives: + played.append('Receives: %s' % self.receives) return played @@ -116,8 +125,14 @@ def get_player(self): return self.player def player_accumulates(self): + return self.buys + self.gains + self.receives + + def player_accumulates_except_receives(self): return self.buys + self.gains + def player_receives(self): + return self.receives + def get_turn_no(self): return self.turn_no @@ -157,6 +172,8 @@ def deck_changes(self): setattr(my_change, 'buys' , self.buys) setattr(my_change, 'trashes', self.trashes) setattr(my_change, 'returns', self.returns) + setattr(my_change, 'passes', self.passes) + setattr(my_change, 'receives', self.receives) my_change.vp_tokens += self.vp_tokens for change in self.opp_info.itervalues(): @@ -171,7 +188,7 @@ def __init__(self, player_deck_dict, game): self.player_name = player_deck_dict[NAME] self.win_points = player_deck_dict[WIN_POINTS] self.points = player_deck_dict[POINTS] - self.deck = {} + self.deck = dict() for (index, count) in player_deck_dict[DECK].iteritems(): self.deck[ index_to_card(int(index)) ] = count self.turn_order = player_deck_dict[ORDER] @@ -233,6 +250,11 @@ def __init__(self, game_dict): # pprint.pprint(game_dict) self.player_decks = [PlayerDeck(pd, self) for pd in game_dict[DECKS]] + if START_DECKS in game_dict: + self.player_start_decks = game_dict[START_DECKS] + else: + self.player_start_decks = None + self.id = game_dict.get('_id', '') for raw_pd, pd in zip(game_dict[DECKS], self.player_decks): @@ -255,6 +277,13 @@ def __init__(self, game_dict): x.get_poss_no())) + def get_player_start_deck(self, player_name): + """ Return the initial deck for the named player. """ + for p in self.player_start_decks: + if p[NAME] == player_name: + return p[START_DECK] + assert ValueError, "%s not in players" % player_name + def get_player_deck(self, player_name): """ Return the deck for the named player. """ for p in self.player_decks: @@ -280,8 +309,13 @@ def all_player_names(self): @staticmethod def get_date_from_id(game_id): - yyyymmdd_date = game_id.split('-')[1] - return yyyymmdd_date + GOKO_ID_RE = re.compile('([\d]{4}[\d]{2}[\d]{2})/log.*') + match = GOKO_ID_RE.match(game_id) + if match: + return match.group(1) + else: + yyyymmdd_date = game_id.split('-')[1] + return yyyymmdd_date @staticmethod def get_datetime_from_id(game_id): @@ -295,6 +329,9 @@ def date(self): def get_id(self): return self.id + def goko_url(self): + return 'http://archive-dominionlogs.goko.com/%s' % self.id + def isotropic_url(self): yyyymmdd_date = Game.get_date_from_id(self.id) path = '%s/%s/%s.gz' % (yyyymmdd_date[:6], yyyymmdd_date[-2:], self.id) @@ -349,7 +386,7 @@ def cards_gained_per_player(self): Structure is an array of dict of dicts, containing how the cards were acquired (game.BOUGHT and game.GAINED), then player - name and card. + name and card. Lump in Masq receiving with gains. This keeps track of cards accumulated on a player's turn and those gained during the turns of other players. @@ -363,9 +400,11 @@ def cards_gained_per_player(self): pd in self.get_player_decks()) for turn in self.get_turns(): - for accumed_card in turn.player_accumulates(): + for accumed_card in turn.player_accumulates_except_receives(): ret[BOUGHT][turn.get_player().name()][accumed_card] += 1 ret[GAINED][turn.get_player().name()][accumed_card] += 1 + for accumed_card in turn.player_receives(): + ret[GAINED][turn.get_player().name()][accumed_card] += 1 for name, change in turn.get_opp_info().iteritems(): for card in change.accumulates(): ret[GAINED][name][card] += 1 @@ -433,6 +472,8 @@ def __repr__(self, print_turns=False): def score_deck(deck_comp): """ Given a dict of cards (as card.Card) and frequency, return the score. """ ret = 0 + if dominioncards.Feodum in deck_comp: + ret += score_feodum(deck_comp) if dominioncards.Gardens in deck_comp: ret += score_gardens(deck_comp) if dominioncards.Duke in deck_comp: @@ -449,6 +490,9 @@ def score_deck(deck_comp): return ret +def score_feodum(deck_comp): + return deck_comp[dominioncards.Feodum] * (deck_comp.get(dominioncards.Silver, 0)/3) + def score_gardens(deck_comp): deck_size = sum(deck_comp.itervalues()) return deck_size / 10 * deck_comp[dominioncards.Gardens] @@ -474,20 +518,26 @@ def __init__(self, game): sort_by_turn_order=True) self.supply = ConvertibleDefaultDict(value_type=int) num_players = len(game.get_player_decks()) - for cardinst in itertools.chain(EVERY_SET_CARDS, - game.get_supply()): + for cardinst in set(EVERY_SET_CARDS + game.get_supply()): self.supply[cardinst] = cardinst.num_copies_per_game(num_players) self.player_decks = ConvertibleDefaultDict( value_type=lambda: ConvertibleDefaultDict(int)) + self.player_start_decks = ConvertibleDefaultDict( + value_type=lambda: ConvertibleDefaultDict(int)) self.player_vp_tokens = collections.defaultdict(int) - self.supply[dominioncards.Copper] = self.supply[dominioncards.Copper] - ( - len(self.turn_ordered_players) * 7) + if game.player_start_decks is None: + self.supply[dominioncards.Copper] = self.supply[dominioncards.Copper] - (len(self.turn_ordered_players) * 7) - for player in self.turn_ordered_players: - self.player_decks[player.name()][dominioncards.Copper] = 7 - self.player_decks[player.name()][dominioncards.Estate] = 3 + for player in self.turn_ordered_players: + self.player_decks[player.name()][dominioncards.Copper] = 7 + self.player_decks[player.name()][dominioncards.Estate] = 3 + else: + for start_deck in game.player_start_decks: + for card in start_deck[START_DECK]: + self.supply[dominioncards.index_to_card(card)] -= 1 + self.player_decks[start_deck[NAME]][dominioncards.index_to_card(card)] += 1 self.turn_ind = 0 @@ -537,10 +587,11 @@ def apply_diff(cards, name, supply_dir, deck_dir): self.player_decks[name][cardinst] += deck_dir for deck_change in turn.deck_changes(): - apply_diff(getattr(deck_change, 'buys') + getattr(deck_change, 'gains'), - deck_change.name, -1, 1) + apply_diff(getattr(deck_change, 'buys') + getattr(deck_change, 'gains') + getattr(deck_change, 'receives'), + deck_change.name, 0, 1) apply_diff(getattr(deck_change, 'trashes'), deck_change.name, 0, -1) apply_diff(getattr(deck_change, 'returns'), deck_change.name, 1, -1) + apply_diff(getattr(deck_change, 'passes'), deck_change.name, 0, -1) self.player_vp_tokens[deck_change.name] += deck_change.vp_tokens def turn_label(self, for_anchor=False, for_display=False): diff --git a/goal_stats.py b/goal_stats.py index 1309165..8fa7b29 100644 --- a/goal_stats.py +++ b/goal_stats.py @@ -5,6 +5,7 @@ log = logging.getLogger(__name__) log.addHandler(logging.NullHandler()) +import AIs import collections import operator @@ -56,13 +57,17 @@ def main(parsed_args): i = 0 while leaders < 3 and i < len(psorted): (player, count) = psorted[i] - players = [player] + players = [] + if player not in AIs.names: + players = [player] i += 1 while i < len(psorted) and psorted[i][1] == count: - players.append(psorted[i][0]) + if psorted[i][0] not in AIs.names: + players.append(psorted[i][0]) i += 1 leaders += len(players) - top.append((players, count)) + if len(players) > 0: + top.append((players, count)) mongo_val = {'_id': goal_name, 'count': total, 'top': top} gstats_db.save(mongo_val) diff --git a/goals.py b/goals.py index a323679..c799993 100644 --- a/goals.py +++ b/goals.py @@ -117,7 +117,7 @@ def CheckMatchPurplePileDriver(g): return ret def CheckMatchDoublePileDriver(g): - """Gained all copies of twp different cards and won.""" + """Gained all copies of two different cards and won.""" gain_map = CollectedAllCopies(g) ret = [] diff --git a/goko.py b/goko.py new file mode 100644 index 0000000..6e607c7 --- /dev/null +++ b/goko.py @@ -0,0 +1,246 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# TODO: Add copyright notice here + +"""Scraping support for Goko. +""" + +import boto.s3.connection +import bson.binary +import bz2 +import cStringIO +import datetime +import io +import logging +import sys +import tarfile +import urllib2 + +import utils +import os +import shutil +import subprocess +import tempfile +import time + + +# Module-level logging instance +log = logging.getLogger(__name__) + +#s3_location = 'ftl-goko-councilroom-test-bucket' +s3_location = 'static.councilroom.mccllstr.com' + +class GokoProcessingDate(object): + # TODO: This is a partial implementation + + tracker = None + date = None + date_dict = None + + class Key(object): + """Names of MongoDB keys""" + GAME_DATE = 'game_date' + STEPS = 'steps' + + def __init__(self, tracker, date): + self.tracker = tracker + self.date = date + + self.date_dict = tracker.tracker_col.find_one({self.Key.GAME_DATE: date,}) + if self.date_dict == None: + self.date_dict = {self.Key.GAME_DATE: date, + self.Key.STEPS: []} + tracker.tracker_col.save(self.date_dict) + + +class GokoTracker(object): + """ + """ + # TODO: This is a partial implementation + + db = None + tracker_col = None + leaderboard_history_col = None + raw_games_col = None + + def __init__(self, db): + self.db = db + self.tracker_col = db.goko_tracker + self.raw_games_col = db.raw_games + + def scraped_game_count(self, date): + """Count the number of raw games loaded for the specified date + + date is a string in the format 'YYYYMMDD' + """ + return self.raw_games_col.find({'game_date': date}).count() + + + + +def dates_needing_scraping(db): + # TODO: This is a partial implementation + it = GokoTracker(db) + + yesterday = datetime.date.today() - datetime.timedelta(days=1) + for cur_datetime in utils.datetimerange(datetime.date(2012,8,5), + yesterday): + str_date = time.strftime("%Y%m%d", cur_date.timetuple()) + + # Check on the status of the day in our scraper tracker + raw_game_count = raw_games_col.find({'game_date': str_date}).count() + + +class ScrapeError(Exception): + """Indicates an error with the requested scrape.""" + def __init__(self, reason): + self.args = reason, + self.reason = reason + + def __str__(self): + return '' % self.reason + + +class GokoScraper: + """Implements the functions necessary to scrape data (games, not yet + leaderboards) from Goko or its related mirrors. + """ + + db = None + rawgames_col = None + s3conn = None + + def __init__(self, db, rawgames_name='raw_games'): + self.db = db + if db: + self.rawgames_col = db[rawgames_name] + + + def our_gamelog_filename(self, gamedate): + """Returns our filename of the rawgame archive for the specified datetime.date""" + return '{date.year:04d}{date.month:02d}{date.day:02d}.all.tar.bz2'.format(date=gamedate) + + def gamelog_local_filename(self,gamedate): + """Returns the local path to the rawgame archive for the specified datetime.date""" + return 'static/scrape_data/{filename}'.format(filename=self.our_gamelog_filename(gamedate)) + + def gamelog_s3_keyname(self, gamedate): + """Returns the S3 keyname for the rawgame archive for the specified datetime.date""" + return 'scrape_data/{filename}'.format(filename=self.our_gamelog_filename(gamedate)) + + + def goko_rawgame_url(self, gamedate): + """Returns the URL to the rawgame folder at goko for the specified datetime.date""" + return 'http://archive-dominionlogs.goko.com/{date.year:04d}{date.month:02d}{date.day:02d}/'.format(date=gamedate) + + + def s3_rawgame_url(self, gamedate): + """Returns the URL to the rawgame archive in S3 for the specified datetime.date""" + return 'http://'+s3_location+'/{keyname}'.format(keyname=self.gamelog_s3_keyname(gamedate)) + + + def establish_s3_connection(self): + """Get a boto connection for s3 operations using credentials from the ini file""" + if self.s3conn is None: + self.s3conn = boto.s3.connection.S3Connection(**utils.get_aws_credentials()) + + + def is_rawgames_in_s3(self, date): + """Returns true if there is a whole-day rawgame archive in S3 for the specified date""" + self.establish_s3_connection() + + bucket = self.s3conn.get_bucket(s3_location) + return bucket.get_key(self.gamelog_s3_keyname(date)) is not None + + + def copy_rawgames_to_s3(self, date): + """Copy the day's archive of rawgames from goko to our S3 bucket. + Does not save a local copy.""" + + current_directory = os.getcwd() + directory_name = tempfile.mkdtemp() + os.chdir(directory_name) + str_date = time.strftime("%Y%m%d", date.timetuple()) + try: + subprocess.check_call([current_directory + '/multi_scrape.sh', str_date]) + except subprocess.CalledProcessError, e: + logging.warning("Unexpected return from scraper: {msg}".format(msg=e.output)) + os.chdir(orig_dir) + shutil.rmtree(directory_name) + raise + + os.chdir(current_directory) + + self.establish_s3_connection() + + # Upload the contents to s3 in the appropriate key + bucket = self.s3conn.get_bucket(s3_location) + key = bucket.get_key(self.gamelog_s3_keyname(date)) + if not key: + log.debug("Creating new key") + key = bucket.new_key(self.gamelog_s3_keyname(date)) + log.debug("Starting upload from local copy to s3") + key.set_contents_from_filename(directory_name+'/'+self.our_gamelog_filename(date), + cb=lambda sent, total: log.info('Transferred %d of %d', sent, total), + replace=False, policy='public-read') + shutil.rmtree(directory_name) + + + def get_rawgames_from_s3(self, date): + """Return the whole-day rawgame archive from our S3 bucket for + the specified datetime.date""" + self.establish_s3_connection() + bucket = self.s3conn.get_bucket(s3_location) + key = bucket.get_key(self.gamelog_s3_keyname(date)) + return key.get_contents_as_string() + + + def get_rawgames_from_s3_as_filelike(self, date): + """Return the whole-day rawgame archive from our S3 bucket for + the specified datetime.date, wrapped in a filelike object""" + return cStringIO.StringIO(self.get_rawgames_from_s3(date)) + + + def scrape_and_store_rawgames(self, date): + """Top-level function to scrape rawgames from goko and + store them in the local database. + + Accepts a datetime.date as the date to scrape. + Returns the number of games inserted. + + Will skip (noop) dates that have already been loaded. + """ + yyyy_mm_dd = date.strftime('%Y%m%d') + + # We expect to operate from data stored in our S3 bucket, so + # check that it is available, first. + if not self.is_rawgames_in_s3(date): + # Not in S3 yet, get it and store it + self.copy_rawgames_to_s3(date) + + # Retrieve the game archive for the specified date + rawgames_archive_contents = self.get_rawgames_from_s3_as_filelike(date) + + # Insert the individual games into MongoDB + insert_count = 0 + with tarfile.open(fileobj=rawgames_archive_contents) as t: + # Figure out how many raw games are in the database, + # compared with how many are in the tarfile + database_count = self.rawgames_col.find({'game_date': yyyy_mm_dd}).count() + tarfile_count = len(t.getmembers()) + if tarfile_count <= database_count: + log.info("Raw games for %s have already been loaded", yyyy_mm_dd) + else: + # Insert all the games + for tarinfo in t: + log.debug("Working on %s", yyyy_mm_dd+'/'+tarinfo.name) + g = { u'_id': yyyy_mm_dd+'/'+tarinfo.name, + u'game_date': yyyy_mm_dd, + u'text': bson.Binary(bz2.compress(t.extractfile(tarinfo).read())) } + self.rawgames_col.save(g, safe=True) + insert_count += 1 + + rawgames_archive_contents.close() + + return insert_count diff --git a/index.html b/index.html index c7a2926..e5df4c2 100644 --- a/index.html +++ b/index.html @@ -8,10 +8,8 @@

CouncilRoom.com

- This site contains a front end to the Dominion game logs - hosted on the wonderful - - Isotropic Dominion server. + This site contains a front end to Dominion game logs from the now-defunct + Isotropic Dominion server and from Goko. The code backing this website is open source and available at the @@ -29,11 +27,11 @@

CouncilRoom.com

(rob.speer@gmail.com), and hawaiian shirts (David Lu!!), and tlstyer (Tim Styer), and - Mike McCallister . + Mike McCallister, and ftl (Max G). Graphic design by NemoRathwald/Matt Arnold (mat_REMOVE_t.ma_THIS_tta_FOR_rn@_SPAM_gma_PROTECTION,_il.c_HUMANS!_om) (BGG profile).

- card winningness graphs + winningness graphs
currently not working
- player pages + player pages
Name: case sensitive
@@ -72,7 +70,7 @@

CouncilRoom.com

card groupings - (new!) + (not available)
 

Forum

diff --git a/keys.py b/keys.py index 76a71cb..988f715 100644 --- a/keys.py +++ b/keys.py @@ -1,27 +1,34 @@ SUPPLY = 'S' PLAYERS = 'P' DECKS = 'D' +START_DECKS = 'I' GAME_END = 'G' RESIGNED = 'R' VETO = 'X' +RATING_SYSTEM = 'Y' VP_TOKENS = 'V' WIN_POINTS = 'W' TURNS = 'T' ORDER = 'O' DECK = ':' +START_DECK = ';' POINTS = '*' NAME = 'N' +NUMBER = '#' RESULT = '~' BUYS = 'b' GAINS = 'g' MONEY = 'm' OPP = 'o' +REVEALS = 'v' PLAYS = '!' TRASHES = 't' +PASSES = 's' +RECEIVES = 'z' RETURNS = 'r' OUTPOST = '0' POSSESSION = 'p' PIRATE_TOKENS = '%' - +COIN_TOKENS = 'k' diff --git a/load_leaderboard.py b/load_leaderboard.py index 14822ce..8ecd191 100644 --- a/load_leaderboard.py +++ b/load_leaderboard.py @@ -18,11 +18,12 @@ def main(): filename_pattern = re.compile(r'^(?P\d\d\d\d-\d\d-\d\d)\.html\.bz2$') - leaderboard_pattern = re.compile(r'
(?P-?\d+\.\d+) ± ' + \ + iso_leaderboard_pattern = re.compile(r'(?P-?\d+\.\d+) ± ' + \ r'(?P-?\d+\.\d+)' + \ r'(?P\d+)' + \ r'(?P\d+)' + \ r'(?P[^<]*) <') + goko_leaderboard_pattern = re.compile(r'\s+(?P\d+)]*>(?P.*)(?P\d+)