diff options
Diffstat (limited to 'planetwars-matchrunner')
-rw-r--r-- | planetwars-matchrunner/bots/broken_bot/bot.py | 1 | ||||
-rw-r--r-- | planetwars-matchrunner/bots/simplebot/simplebot.py | 33 | ||||
-rw-r--r-- | planetwars-matchrunner/match.log | 56 | ||||
-rw-r--r-- | planetwars-matchrunner/src/bin/testmatch.rs | 25 | ||||
-rw-r--r-- | planetwars-matchrunner/src/bot_runner.rs | 6 | ||||
-rw-r--r-- | planetwars-matchrunner/src/lib.rs | 4 | ||||
-rw-r--r-- | planetwars-matchrunner/src/match_context.rs | 14 | ||||
-rw-r--r-- | planetwars-matchrunner/src/match_log.rs | 2 | ||||
-rw-r--r-- | planetwars-matchrunner/src/pw_match.rs | 4 |
9 files changed, 123 insertions, 22 deletions
diff --git a/planetwars-matchrunner/bots/broken_bot/bot.py b/planetwars-matchrunner/bots/broken_bot/bot.py new file mode 100644 index 0000000..e4af2dd --- /dev/null +++ b/planetwars-matchrunner/bots/broken_bot/bot.py @@ -0,0 +1 @@ +SYNTAX IS OVER PARTY
\ No newline at end of file diff --git a/planetwars-matchrunner/bots/simplebot/simplebot.py b/planetwars-matchrunner/bots/simplebot/simplebot.py new file mode 100644 index 0000000..b2a6b8f --- /dev/null +++ b/planetwars-matchrunner/bots/simplebot/simplebot.py @@ -0,0 +1,33 @@ +import sys, json + +def move(command): + """ print a command record to stdout """ + moves = [] + if command is not None: + moves.append(command) + + print(json.dumps({ 'moves': moves })) + # flush the buffer, so that the gameserver can receive the json-encoded line. + sys.stdout.flush() + + +for line in sys.stdin: + state = json.loads(line) + # you are always player 1. + my_planets = [p for p in state['planets'] if p['owner'] == 1] + other_planets = [p for p in state['planets'] if p['owner'] != 1] + + if not my_planets or not other_planets: + # we don't own any planets, so we can't make any moves. + move(None) + else: + # find my planet that has the most ships + planet = max(my_planets, key=lambda p: p['ship_count']) + # find enemy planet that has the least ships + destination = min(other_planets, key=lambda p: p['ship_count']) + # attack! + move({ + 'origin': planet['name'], + 'destination': destination['name'], + 'ship_count': planet['ship_count'] - 1 + }) diff --git a/planetwars-matchrunner/match.log b/planetwars-matchrunner/match.log new file mode 100644 index 0000000..59d55dc --- /dev/null +++ b/planetwars-matchrunner/match.log @@ -0,0 +1,56 @@ +{"type":"stderr","player_id":2,"message":" File \"/workdir/bot.py\", line 1"} +{"type":"stderr","player_id":2,"message":" SYNTAX IS OVER PARTY"} +{"type":"stderr","player_id":2,"message":" ^^"} +{"type":"stderr","player_id":2,"message":"SyntaxError: invalid syntax"} +{"type":"gamestate","planets":[{"ship_count":2,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":6,"x":-3.0,"y":5.0,"owner":null,"name":"duteros"},{"ship_count":6,"x":3.0,"y":5.0,"owner":null,"name":"tritos"},{"ship_count":7,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":0,"ship_count":5,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":5}]} +{"type":"gamestate","planets":[{"ship_count":2,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":6,"x":-3.0,"y":5.0,"owner":null,"name":"duteros"},{"ship_count":6,"x":3.0,"y":5.0,"owner":null,"name":"tritos"},{"ship_count":8,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":0,"ship_count":5,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":4},{"id":1,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":5}]} +{"type":"gamestate","planets":[{"ship_count":2,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":6,"x":-3.0,"y":5.0,"owner":null,"name":"duteros"},{"ship_count":6,"x":3.0,"y":5.0,"owner":null,"name":"tritos"},{"ship_count":9,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":0,"ship_count":5,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":3},{"id":1,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":4},{"id":2,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":5}]} +{"type":"gamestate","planets":[{"ship_count":2,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":6,"x":-3.0,"y":5.0,"owner":null,"name":"duteros"},{"ship_count":6,"x":3.0,"y":5.0,"owner":null,"name":"tritos"},{"ship_count":10,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":0,"ship_count":5,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":2},{"id":1,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":3},{"id":2,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":4},{"id":3,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":5}]} +{"type":"gamestate","planets":[{"ship_count":2,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":6,"x":-3.0,"y":5.0,"owner":null,"name":"duteros"},{"ship_count":6,"x":3.0,"y":5.0,"owner":null,"name":"tritos"},{"ship_count":11,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":0,"ship_count":5,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":1},{"id":1,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":2},{"id":2,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":3},{"id":3,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":4},{"id":4,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":5}]} +{"type":"gamestate","planets":[{"ship_count":2,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":1,"x":-3.0,"y":5.0,"owner":null,"name":"duteros"},{"ship_count":6,"x":3.0,"y":5.0,"owner":null,"name":"tritos"},{"ship_count":12,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":5,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":5},{"id":1,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":1},{"id":2,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":2},{"id":3,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":3},{"id":4,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":4}]} +{"type":"gamestate","planets":[{"ship_count":2,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":0,"x":-3.0,"y":5.0,"owner":null,"name":"duteros"},{"ship_count":6,"x":3.0,"y":5.0,"owner":null,"name":"tritos"},{"ship_count":13,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":5,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":4},{"id":6,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":5},{"id":2,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":1},{"id":3,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":2},{"id":4,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":3}]} +{"type":"gamestate","planets":[{"ship_count":2,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":1,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":6,"x":3.0,"y":5.0,"owner":null,"name":"tritos"},{"ship_count":14,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":5,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":3},{"id":6,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":4},{"id":7,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":5},{"id":3,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":1},{"id":4,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":2}]} +{"type":"gamestate","planets":[{"ship_count":2,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":3,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":6,"x":3.0,"y":5.0,"owner":null,"name":"tritos"},{"ship_count":15,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":5,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":2},{"id":6,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":3},{"id":7,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":4},{"id":8,"ship_count":1,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":10},{"id":4,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":1}]} +{"type":"gamestate","planets":[{"ship_count":3,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":3,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":6,"x":3.0,"y":5.0,"owner":null,"name":"tritos"},{"ship_count":16,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":5,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":1},{"id":6,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":2},{"id":7,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":3},{"id":8,"ship_count":1,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":9},{"id":9,"ship_count":2,"origin":"duteros","destination":"tritos","owner":1,"turns_remaining":5}]} +{"type":"gamestate","planets":[{"ship_count":2,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":5,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":6,"x":3.0,"y":5.0,"owner":null,"name":"tritos"},{"ship_count":17,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":10,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":10},{"id":6,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":1},{"id":7,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":2},{"id":8,"ship_count":1,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":8},{"id":9,"ship_count":2,"origin":"duteros","destination":"tritos","owner":1,"turns_remaining":4}]} +{"type":"gamestate","planets":[{"ship_count":3,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":3,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":6,"x":3.0,"y":5.0,"owner":null,"name":"tritos"},{"ship_count":18,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":10,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":9},{"id":11,"ship_count":4,"origin":"duteros","destination":"tritos","owner":1,"turns_remaining":5},{"id":7,"ship_count":1,"origin":"protos","destination":"duteros","owner":1,"turns_remaining":1},{"id":8,"ship_count":1,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":7},{"id":9,"ship_count":2,"origin":"duteros","destination":"tritos","owner":1,"turns_remaining":3}]} +{"type":"gamestate","planets":[{"ship_count":2,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":5,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":6,"x":3.0,"y":5.0,"owner":null,"name":"tritos"},{"ship_count":19,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":10,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":8},{"id":11,"ship_count":4,"origin":"duteros","destination":"tritos","owner":1,"turns_remaining":4},{"id":12,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":10},{"id":8,"ship_count":1,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":6},{"id":9,"ship_count":2,"origin":"duteros","destination":"tritos","owner":1,"turns_remaining":2}]} +{"type":"gamestate","planets":[{"ship_count":3,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":2,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":6,"x":3.0,"y":5.0,"owner":null,"name":"tritos"},{"ship_count":20,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":10,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":7},{"id":11,"ship_count":4,"origin":"duteros","destination":"tritos","owner":1,"turns_remaining":3},{"id":12,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":9},{"id":8,"ship_count":1,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":5},{"id":9,"ship_count":2,"origin":"duteros","destination":"tritos","owner":1,"turns_remaining":1},{"id":13,"ship_count":4,"origin":"duteros","destination":"tritos","owner":1,"turns_remaining":5}]} +{"type":"gamestate","planets":[{"ship_count":2,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":3,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":4,"x":3.0,"y":5.0,"owner":null,"name":"tritos"},{"ship_count":21,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":10,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":6},{"id":11,"ship_count":4,"origin":"duteros","destination":"tritos","owner":1,"turns_remaining":2},{"id":12,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":8},{"id":8,"ship_count":1,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":4},{"id":14,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":10},{"id":13,"ship_count":4,"origin":"duteros","destination":"tritos","owner":1,"turns_remaining":4}]} +{"type":"gamestate","planets":[{"ship_count":3,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":2,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":4,"x":3.0,"y":5.0,"owner":null,"name":"tritos"},{"ship_count":22,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":10,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":5},{"id":11,"ship_count":4,"origin":"duteros","destination":"tritos","owner":1,"turns_remaining":1},{"id":12,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":7},{"id":8,"ship_count":1,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":3},{"id":14,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":9},{"id":13,"ship_count":4,"origin":"duteros","destination":"tritos","owner":1,"turns_remaining":3},{"id":15,"ship_count":2,"origin":"duteros","destination":"tritos","owner":1,"turns_remaining":5}]} +{"type":"gamestate","planets":[{"ship_count":2,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":3,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":0,"x":3.0,"y":5.0,"owner":null,"name":"tritos"},{"ship_count":23,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":10,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":4},{"id":16,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":10},{"id":12,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":6},{"id":8,"ship_count":1,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":2},{"id":14,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":8},{"id":13,"ship_count":4,"origin":"duteros","destination":"tritos","owner":1,"turns_remaining":2},{"id":15,"ship_count":2,"origin":"duteros","destination":"tritos","owner":1,"turns_remaining":4}]} +{"type":"gamestate","planets":[{"ship_count":3,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":2,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":0,"x":3.0,"y":5.0,"owner":null,"name":"tritos"},{"ship_count":24,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":10,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":3},{"id":16,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":9},{"id":12,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":5},{"id":8,"ship_count":1,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":1},{"id":14,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":7},{"id":13,"ship_count":4,"origin":"duteros","destination":"tritos","owner":1,"turns_remaining":1},{"id":15,"ship_count":2,"origin":"duteros","destination":"tritos","owner":1,"turns_remaining":3},{"id":17,"ship_count":2,"origin":"duteros","destination":"tritos","owner":1,"turns_remaining":5}]} +{"type":"gamestate","planets":[{"ship_count":2,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":3,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":5,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":25,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":10,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":2},{"id":16,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":8},{"id":12,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":4},{"id":18,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":10},{"id":14,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":6},{"id":17,"ship_count":2,"origin":"duteros","destination":"tritos","owner":1,"turns_remaining":4},{"id":15,"ship_count":2,"origin":"duteros","destination":"tritos","owner":1,"turns_remaining":2}]} +{"type":"gamestate","planets":[{"ship_count":3,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":4,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":2,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":26,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":10,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":1},{"id":16,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":7},{"id":12,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":3},{"id":18,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":9},{"id":14,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":5},{"id":17,"ship_count":2,"origin":"duteros","destination":"tritos","owner":1,"turns_remaining":3},{"id":15,"ship_count":2,"origin":"duteros","destination":"tritos","owner":1,"turns_remaining":1},{"id":19,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":9}]} +{"type":"gamestate","planets":[{"ship_count":4,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":2,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":7,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":27,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":20,"ship_count":3,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":11},{"id":16,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":6},{"id":12,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":2},{"id":18,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":8},{"id":14,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":4},{"id":17,"ship_count":2,"origin":"duteros","destination":"tritos","owner":1,"turns_remaining":2},{"id":19,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":8}]} +{"type":"gamestate","planets":[{"ship_count":5,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":3,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":2,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":28,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":20,"ship_count":3,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":10},{"id":16,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":5},{"id":12,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":1},{"id":18,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":7},{"id":14,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":3},{"id":17,"ship_count":2,"origin":"duteros","destination":"tritos","owner":1,"turns_remaining":1},{"id":19,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":7},{"id":21,"ship_count":6,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":9}]} +{"type":"gamestate","planets":[{"ship_count":2,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":4,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":7,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":29,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":20,"ship_count":3,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":9},{"id":16,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":4},{"id":22,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":10},{"id":18,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":6},{"id":14,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":2},{"id":21,"ship_count":6,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":8},{"id":19,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":6}]} +{"type":"gamestate","planets":[{"ship_count":3,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":5,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":2,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":30,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":20,"ship_count":3,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":8},{"id":16,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":3},{"id":22,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":9},{"id":18,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":5},{"id":14,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":1},{"id":21,"ship_count":6,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":7},{"id":19,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":5},{"id":23,"ship_count":6,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":9}]} +{"type":"gamestate","planets":[{"ship_count":4,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":2,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":5,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":31,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":20,"ship_count":3,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":7},{"id":16,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":2},{"id":22,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":8},{"id":18,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":4},{"id":24,"ship_count":4,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":11},{"id":21,"ship_count":6,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":6},{"id":19,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":4},{"id":23,"ship_count":6,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":8}]} +{"type":"gamestate","planets":[{"ship_count":5,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":3,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":2,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":32,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":20,"ship_count":3,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":6},{"id":16,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":1},{"id":22,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":7},{"id":18,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":3},{"id":24,"ship_count":4,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":10},{"id":21,"ship_count":6,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":5},{"id":19,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":3},{"id":23,"ship_count":6,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":7},{"id":25,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":9}]} +{"type":"gamestate","planets":[{"ship_count":2,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":4,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":5,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":33,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":20,"ship_count":3,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":5},{"id":26,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":10},{"id":22,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":6},{"id":18,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":2},{"id":24,"ship_count":4,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":9},{"id":21,"ship_count":6,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":4},{"id":19,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":2},{"id":23,"ship_count":6,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":6},{"id":25,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":8}]} +{"type":"gamestate","planets":[{"ship_count":3,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":5,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":2,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":34,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":20,"ship_count":3,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":4},{"id":26,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":9},{"id":22,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":5},{"id":18,"ship_count":2,"origin":"protos","destination":"tritos","owner":1,"turns_remaining":1},{"id":24,"ship_count":4,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":8},{"id":21,"ship_count":6,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":3},{"id":19,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":1},{"id":23,"ship_count":6,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":5},{"id":25,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":7},{"id":27,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":9}]} +{"type":"gamestate","planets":[{"ship_count":4,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":2,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":5,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":35,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":2,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":20,"ship_count":3,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":3},{"id":26,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":8},{"id":22,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":4},{"id":28,"ship_count":4,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":11},{"id":24,"ship_count":4,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":7},{"id":21,"ship_count":6,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":2},{"id":27,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":8},{"id":23,"ship_count":6,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":4},{"id":25,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":6}]} +{"type":"gamestate","planets":[{"ship_count":5,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":3,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":2,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":36,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":2,"x":3.0,"y":-5.0,"owner":null,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":20,"ship_count":3,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":2},{"id":26,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":7},{"id":22,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":3},{"id":28,"ship_count":4,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":10},{"id":24,"ship_count":4,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":6},{"id":21,"ship_count":6,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":1},{"id":27,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":7},{"id":23,"ship_count":6,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":3},{"id":25,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":5},{"id":29,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":9}]} +{"type":"gamestate","planets":[{"ship_count":2,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":4,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":3,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":37,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":4,"x":3.0,"y":-5.0,"owner":1,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":20,"ship_count":3,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":1},{"id":26,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":6},{"id":22,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":2},{"id":28,"ship_count":4,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":9},{"id":24,"ship_count":4,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":5},{"id":30,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":10},{"id":27,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":6},{"id":23,"ship_count":6,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":2},{"id":25,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":4},{"id":29,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":8}]} +{"type":"gamestate","planets":[{"ship_count":3,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":2,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":4,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":38,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":8,"x":3.0,"y":-5.0,"owner":1,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":31,"ship_count":3,"origin":"duteros","destination":"extos","owner":1,"turns_remaining":9},{"id":26,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":5},{"id":22,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":1},{"id":28,"ship_count":4,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":8},{"id":24,"ship_count":4,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":4},{"id":30,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":9},{"id":27,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":5},{"id":23,"ship_count":6,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":1},{"id":25,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":3},{"id":29,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":7}]} +{"type":"gamestate","planets":[{"ship_count":4,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":3,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":5,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":39,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":12,"x":3.0,"y":-5.0,"owner":1,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":31,"ship_count":3,"origin":"duteros","destination":"extos","owner":1,"turns_remaining":8},{"id":26,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":4},{"id":32,"ship_count":7,"origin":"pemptos","destination":"extos","owner":1,"turns_remaining":5},{"id":28,"ship_count":4,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":7},{"id":24,"ship_count":4,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":3},{"id":30,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":8},{"id":27,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":4},{"id":29,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":6},{"id":25,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":2}]} +{"type":"gamestate","planets":[{"ship_count":5,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":4,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":6,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":40,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":2,"x":3.0,"y":-5.0,"owner":1,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":31,"ship_count":3,"origin":"duteros","destination":"extos","owner":1,"turns_remaining":7},{"id":26,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":3},{"id":32,"ship_count":7,"origin":"pemptos","destination":"extos","owner":1,"turns_remaining":4},{"id":28,"ship_count":4,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":6},{"id":24,"ship_count":4,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":2},{"id":30,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":7},{"id":27,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":3},{"id":29,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":5},{"id":25,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":1},{"id":33,"ship_count":11,"origin":"pemptos","destination":"extos","owner":1,"turns_remaining":5}]} +{"type":"gamestate","planets":[{"ship_count":6,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":5,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":2,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":41,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":7,"x":3.0,"y":-5.0,"owner":1,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":31,"ship_count":3,"origin":"duteros","destination":"extos","owner":1,"turns_remaining":6},{"id":26,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":2},{"id":32,"ship_count":7,"origin":"pemptos","destination":"extos","owner":1,"turns_remaining":3},{"id":28,"ship_count":4,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":5},{"id":24,"ship_count":4,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":1},{"id":30,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":6},{"id":27,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":2},{"id":29,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":4},{"id":34,"ship_count":5,"origin":"tritos","destination":"extos","owner":1,"turns_remaining":11},{"id":33,"ship_count":11,"origin":"pemptos","destination":"extos","owner":1,"turns_remaining":4}]} +{"type":"gamestate","planets":[{"ship_count":7,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":6,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":3,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":42,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":1,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":31,"ship_count":3,"origin":"duteros","destination":"extos","owner":1,"turns_remaining":5},{"id":26,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":1},{"id":32,"ship_count":7,"origin":"pemptos","destination":"extos","owner":1,"turns_remaining":2},{"id":28,"ship_count":4,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":4},{"id":35,"ship_count":6,"origin":"pemptos","destination":"extos","owner":1,"turns_remaining":5},{"id":30,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":5},{"id":27,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":1},{"id":29,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":3},{"id":34,"ship_count":5,"origin":"tritos","destination":"extos","owner":1,"turns_remaining":10},{"id":33,"ship_count":11,"origin":"pemptos","destination":"extos","owner":1,"turns_remaining":3}]} +{"type":"gamestate","planets":[{"ship_count":2,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":7,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":4,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":43,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":15,"x":3.0,"y":-5.0,"owner":1,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":null,"name":"extos"}],"expeditions":[{"id":31,"ship_count":3,"origin":"duteros","destination":"extos","owner":1,"turns_remaining":4},{"id":36,"ship_count":6,"origin":"protos","destination":"extos","owner":1,"turns_remaining":5},{"id":32,"ship_count":7,"origin":"pemptos","destination":"extos","owner":1,"turns_remaining":1},{"id":28,"ship_count":4,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":3},{"id":35,"ship_count":6,"origin":"pemptos","destination":"extos","owner":1,"turns_remaining":4},{"id":30,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":4},{"id":33,"ship_count":11,"origin":"pemptos","destination":"extos","owner":1,"turns_remaining":2},{"id":29,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":2},{"id":34,"ship_count":5,"origin":"tritos","destination":"extos","owner":1,"turns_remaining":9}]} +{"type":"gamestate","planets":[{"ship_count":3,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":8,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":5,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":44,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":2,"x":3.0,"y":-5.0,"owner":1,"name":"pemptos"},{"ship_count":1,"x":-3.0,"y":-5.0,"owner":1,"name":"extos"}],"expeditions":[{"id":31,"ship_count":3,"origin":"duteros","destination":"extos","owner":1,"turns_remaining":3},{"id":36,"ship_count":6,"origin":"protos","destination":"extos","owner":1,"turns_remaining":4},{"id":37,"ship_count":14,"origin":"pemptos","destination":"extos","owner":1,"turns_remaining":5},{"id":28,"ship_count":4,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":2},{"id":35,"ship_count":6,"origin":"pemptos","destination":"extos","owner":1,"turns_remaining":3},{"id":30,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":3},{"id":33,"ship_count":11,"origin":"pemptos","destination":"extos","owner":1,"turns_remaining":1},{"id":29,"ship_count":4,"origin":"tritos","destination":"pemptos","owner":1,"turns_remaining":1},{"id":34,"ship_count":5,"origin":"tritos","destination":"extos","owner":1,"turns_remaining":8}]} +{"type":"gamestate","planets":[{"ship_count":4,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":2,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":6,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":45,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":7,"x":3.0,"y":-5.0,"owner":1,"name":"pemptos"},{"ship_count":13,"x":-3.0,"y":-5.0,"owner":1,"name":"extos"}],"expeditions":[{"id":31,"ship_count":3,"origin":"duteros","destination":"extos","owner":1,"turns_remaining":2},{"id":36,"ship_count":6,"origin":"protos","destination":"extos","owner":1,"turns_remaining":3},{"id":37,"ship_count":14,"origin":"pemptos","destination":"extos","owner":1,"turns_remaining":4},{"id":28,"ship_count":4,"origin":"duteros","destination":"pemptos","owner":1,"turns_remaining":1},{"id":35,"ship_count":6,"origin":"pemptos","destination":"extos","owner":1,"turns_remaining":2},{"id":30,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":2},{"id":38,"ship_count":7,"origin":"duteros","destination":"tetartos","owner":1,"turns_remaining":10},{"id":34,"ship_count":5,"origin":"tritos","destination":"extos","owner":1,"turns_remaining":7}]} +{"type":"gamestate","planets":[{"ship_count":5,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":3,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":7,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":46,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":12,"x":3.0,"y":-5.0,"owner":1,"name":"pemptos"},{"ship_count":2,"x":-3.0,"y":-5.0,"owner":1,"name":"extos"}],"expeditions":[{"id":31,"ship_count":3,"origin":"duteros","destination":"extos","owner":1,"turns_remaining":1},{"id":36,"ship_count":6,"origin":"protos","destination":"extos","owner":1,"turns_remaining":2},{"id":37,"ship_count":14,"origin":"pemptos","destination":"extos","owner":1,"turns_remaining":3},{"id":39,"ship_count":12,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":10},{"id":35,"ship_count":6,"origin":"pemptos","destination":"extos","owner":1,"turns_remaining":1},{"id":30,"ship_count":4,"origin":"protos","destination":"pemptos","owner":1,"turns_remaining":1},{"id":38,"ship_count":7,"origin":"duteros","destination":"tetartos","owner":1,"turns_remaining":9},{"id":34,"ship_count":5,"origin":"tritos","destination":"extos","owner":1,"turns_remaining":6}]} +{"type":"gamestate","planets":[{"ship_count":6,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":4,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":8,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":47,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":1,"name":"pemptos"},{"ship_count":12,"x":-3.0,"y":-5.0,"owner":1,"name":"extos"}],"expeditions":[{"id":40,"ship_count":11,"origin":"pemptos","destination":"tetartos","owner":1,"turns_remaining":5},{"id":36,"ship_count":6,"origin":"protos","destination":"extos","owner":1,"turns_remaining":1},{"id":37,"ship_count":14,"origin":"pemptos","destination":"extos","owner":1,"turns_remaining":2},{"id":39,"ship_count":12,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":9},{"id":34,"ship_count":5,"origin":"tritos","destination":"extos","owner":1,"turns_remaining":5},{"id":38,"ship_count":7,"origin":"duteros","destination":"tetartos","owner":1,"turns_remaining":8}]} +{"type":"gamestate","planets":[{"ship_count":7,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":5,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":9,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":48,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":7,"x":3.0,"y":-5.0,"owner":1,"name":"pemptos"},{"ship_count":8,"x":-3.0,"y":-5.0,"owner":1,"name":"extos"}],"expeditions":[{"id":40,"ship_count":11,"origin":"pemptos","destination":"tetartos","owner":1,"turns_remaining":4},{"id":41,"ship_count":11,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":10},{"id":37,"ship_count":14,"origin":"pemptos","destination":"extos","owner":1,"turns_remaining":1},{"id":39,"ship_count":12,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":8},{"id":34,"ship_count":5,"origin":"tritos","destination":"extos","owner":1,"turns_remaining":4},{"id":38,"ship_count":7,"origin":"duteros","destination":"tetartos","owner":1,"turns_remaining":7}]} +{"type":"gamestate","planets":[{"ship_count":8,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":6,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":2,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":49,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":8,"x":3.0,"y":-5.0,"owner":1,"name":"pemptos"},{"ship_count":23,"x":-3.0,"y":-5.0,"owner":1,"name":"extos"}],"expeditions":[{"id":40,"ship_count":11,"origin":"pemptos","destination":"tetartos","owner":1,"turns_remaining":3},{"id":41,"ship_count":11,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":9},{"id":42,"ship_count":8,"origin":"tritos","destination":"tetartos","owner":1,"turns_remaining":5},{"id":39,"ship_count":12,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":7},{"id":34,"ship_count":5,"origin":"tritos","destination":"extos","owner":1,"turns_remaining":3},{"id":38,"ship_count":7,"origin":"duteros","destination":"tetartos","owner":1,"turns_remaining":6}]} +{"type":"gamestate","planets":[{"ship_count":9,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":7,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":3,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":50,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":9,"x":3.0,"y":-5.0,"owner":1,"name":"pemptos"},{"ship_count":2,"x":-3.0,"y":-5.0,"owner":1,"name":"extos"}],"expeditions":[{"id":40,"ship_count":11,"origin":"pemptos","destination":"tetartos","owner":1,"turns_remaining":2},{"id":41,"ship_count":11,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":8},{"id":42,"ship_count":8,"origin":"tritos","destination":"tetartos","owner":1,"turns_remaining":4},{"id":39,"ship_count":12,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":6},{"id":34,"ship_count":5,"origin":"tritos","destination":"extos","owner":1,"turns_remaining":2},{"id":38,"ship_count":7,"origin":"duteros","destination":"tetartos","owner":1,"turns_remaining":5},{"id":43,"ship_count":22,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":10}]} +{"type":"gamestate","planets":[{"ship_count":2,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":8,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":4,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":51,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":10,"x":3.0,"y":-5.0,"owner":1,"name":"pemptos"},{"ship_count":3,"x":-3.0,"y":-5.0,"owner":1,"name":"extos"}],"expeditions":[{"id":40,"ship_count":11,"origin":"pemptos","destination":"tetartos","owner":1,"turns_remaining":1},{"id":41,"ship_count":11,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":7},{"id":42,"ship_count":8,"origin":"tritos","destination":"tetartos","owner":1,"turns_remaining":3},{"id":39,"ship_count":12,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":5},{"id":34,"ship_count":5,"origin":"tritos","destination":"extos","owner":1,"turns_remaining":1},{"id":38,"ship_count":7,"origin":"duteros","destination":"tetartos","owner":1,"turns_remaining":4},{"id":43,"ship_count":22,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":9},{"id":44,"ship_count":8,"origin":"protos","destination":"tetartos","owner":1,"turns_remaining":11}]} +{"type":"gamestate","planets":[{"ship_count":3,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":9,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":5,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":41,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":2,"x":3.0,"y":-5.0,"owner":1,"name":"pemptos"},{"ship_count":9,"x":-3.0,"y":-5.0,"owner":1,"name":"extos"}],"expeditions":[{"id":45,"ship_count":9,"origin":"pemptos","destination":"tetartos","owner":1,"turns_remaining":5},{"id":41,"ship_count":11,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":6},{"id":42,"ship_count":8,"origin":"tritos","destination":"tetartos","owner":1,"turns_remaining":2},{"id":39,"ship_count":12,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":4},{"id":44,"ship_count":8,"origin":"protos","destination":"tetartos","owner":1,"turns_remaining":10},{"id":38,"ship_count":7,"origin":"duteros","destination":"tetartos","owner":1,"turns_remaining":3},{"id":43,"ship_count":22,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":8}]} +{"type":"gamestate","planets":[{"ship_count":4,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":2,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":6,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":42,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":3,"x":3.0,"y":-5.0,"owner":1,"name":"pemptos"},{"ship_count":10,"x":-3.0,"y":-5.0,"owner":1,"name":"extos"}],"expeditions":[{"id":45,"ship_count":9,"origin":"pemptos","destination":"tetartos","owner":1,"turns_remaining":4},{"id":41,"ship_count":11,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":5},{"id":42,"ship_count":8,"origin":"tritos","destination":"tetartos","owner":1,"turns_remaining":1},{"id":39,"ship_count":12,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":3},{"id":44,"ship_count":8,"origin":"protos","destination":"tetartos","owner":1,"turns_remaining":9},{"id":38,"ship_count":7,"origin":"duteros","destination":"tetartos","owner":1,"turns_remaining":2},{"id":43,"ship_count":22,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":7},{"id":46,"ship_count":8,"origin":"duteros","destination":"tetartos","owner":1,"turns_remaining":10}]} +{"type":"gamestate","planets":[{"ship_count":5,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":3,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":7,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":35,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":4,"x":3.0,"y":-5.0,"owner":1,"name":"pemptos"},{"ship_count":2,"x":-3.0,"y":-5.0,"owner":1,"name":"extos"}],"expeditions":[{"id":45,"ship_count":9,"origin":"pemptos","destination":"tetartos","owner":1,"turns_remaining":3},{"id":41,"ship_count":11,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":4},{"id":47,"ship_count":9,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":10},{"id":39,"ship_count":12,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":2},{"id":44,"ship_count":8,"origin":"protos","destination":"tetartos","owner":1,"turns_remaining":8},{"id":38,"ship_count":7,"origin":"duteros","destination":"tetartos","owner":1,"turns_remaining":1},{"id":43,"ship_count":22,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":6},{"id":46,"ship_count":8,"origin":"duteros","destination":"tetartos","owner":1,"turns_remaining":9}]} +{"type":"gamestate","planets":[{"ship_count":6,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":4,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":2,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":29,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":5,"x":3.0,"y":-5.0,"owner":1,"name":"pemptos"},{"ship_count":3,"x":-3.0,"y":-5.0,"owner":1,"name":"extos"}],"expeditions":[{"id":45,"ship_count":9,"origin":"pemptos","destination":"tetartos","owner":1,"turns_remaining":2},{"id":41,"ship_count":11,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":3},{"id":47,"ship_count":9,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":9},{"id":39,"ship_count":12,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":1},{"id":44,"ship_count":8,"origin":"protos","destination":"tetartos","owner":1,"turns_remaining":7},{"id":48,"ship_count":6,"origin":"tritos","destination":"tetartos","owner":1,"turns_remaining":5},{"id":43,"ship_count":22,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":5},{"id":46,"ship_count":8,"origin":"duteros","destination":"tetartos","owner":1,"turns_remaining":8}]} +{"type":"gamestate","planets":[{"ship_count":2,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":5,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":3,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":18,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":6,"x":3.0,"y":-5.0,"owner":1,"name":"pemptos"},{"ship_count":4,"x":-3.0,"y":-5.0,"owner":1,"name":"extos"}],"expeditions":[{"id":45,"ship_count":9,"origin":"pemptos","destination":"tetartos","owner":1,"turns_remaining":1},{"id":41,"ship_count":11,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":2},{"id":47,"ship_count":9,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":8},{"id":49,"ship_count":5,"origin":"protos","destination":"tetartos","owner":1,"turns_remaining":11},{"id":44,"ship_count":8,"origin":"protos","destination":"tetartos","owner":1,"turns_remaining":6},{"id":48,"ship_count":6,"origin":"tritos","destination":"tetartos","owner":1,"turns_remaining":4},{"id":43,"ship_count":22,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":4},{"id":46,"ship_count":8,"origin":"duteros","destination":"tetartos","owner":1,"turns_remaining":7}]} +{"type":"gamestate","planets":[{"ship_count":3,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":6,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":4,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":10,"x":6.0,"y":0.0,"owner":2,"name":"tetartos"},{"ship_count":2,"x":3.0,"y":-5.0,"owner":1,"name":"pemptos"},{"ship_count":5,"x":-3.0,"y":-5.0,"owner":1,"name":"extos"}],"expeditions":[{"id":50,"ship_count":5,"origin":"pemptos","destination":"tetartos","owner":1,"turns_remaining":5},{"id":41,"ship_count":11,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":1},{"id":47,"ship_count":9,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":7},{"id":49,"ship_count":5,"origin":"protos","destination":"tetartos","owner":1,"turns_remaining":10},{"id":44,"ship_count":8,"origin":"protos","destination":"tetartos","owner":1,"turns_remaining":5},{"id":48,"ship_count":6,"origin":"tritos","destination":"tetartos","owner":1,"turns_remaining":3},{"id":43,"ship_count":22,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":3},{"id":46,"ship_count":8,"origin":"duteros","destination":"tetartos","owner":1,"turns_remaining":6}]} +{"type":"gamestate","planets":[{"ship_count":4,"x":-6.0,"y":0.0,"owner":1,"name":"protos"},{"ship_count":2,"x":-3.0,"y":5.0,"owner":1,"name":"duteros"},{"ship_count":5,"x":3.0,"y":5.0,"owner":1,"name":"tritos"},{"ship_count":0,"x":6.0,"y":0.0,"owner":null,"name":"tetartos"},{"ship_count":3,"x":3.0,"y":-5.0,"owner":1,"name":"pemptos"},{"ship_count":6,"x":-3.0,"y":-5.0,"owner":1,"name":"extos"}],"expeditions":[{"id":50,"ship_count":5,"origin":"pemptos","destination":"tetartos","owner":1,"turns_remaining":4},{"id":51,"ship_count":5,"origin":"duteros","destination":"tetartos","owner":1,"turns_remaining":10},{"id":47,"ship_count":9,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":6},{"id":49,"ship_count":5,"origin":"protos","destination":"tetartos","owner":1,"turns_remaining":9},{"id":44,"ship_count":8,"origin":"protos","destination":"tetartos","owner":1,"turns_remaining":4},{"id":48,"ship_count":6,"origin":"tritos","destination":"tetartos","owner":1,"turns_remaining":2},{"id":43,"ship_count":22,"origin":"extos","destination":"tetartos","owner":1,"turns_remaining":2},{"id":46,"ship_count":8,"origin":"duteros","destination":"tetartos","owner":1,"turns_remaining":5}]} diff --git a/planetwars-matchrunner/src/bin/testmatch.rs b/planetwars-matchrunner/src/bin/testmatch.rs index db160cf..4a9d10e 100644 --- a/planetwars-matchrunner/src/bin/testmatch.rs +++ b/planetwars-matchrunner/src/bin/testmatch.rs @@ -10,16 +10,9 @@ async fn main() { _run_match(map_path).await; } -const IMAGE: &'static str = "python:3.10-slim-buster"; +const IMAGE: &str = "python:3.10-slim-buster"; async fn _run_match(map_path: String) { - let code_dir_path = PathBuf::from("../simplebot"); - let bot_spec = DockerBotSpec { - image: IMAGE.to_string(), - code_path: code_dir_path, - argv: vec!["python".to_string(), "simplebot.py".to_string()], - }; - run_match(MatchConfig { map_path: PathBuf::from(map_path), map_name: "hex".to_string(), @@ -27,13 +20,25 @@ async fn _run_match(map_path: String) { players: vec![ MatchPlayer { name: "a".to_string(), - bot_spec: Box::new(bot_spec.clone()), + bot_spec: Box::new(DockerBotSpec { + image: IMAGE.to_string(), + // code_path: PathBuf::from("../simplebot"), + code_path: PathBuf::from("./bots/simplebot"), + argv: vec!["python".to_string(), "simplebot.py".to_string()], + }), }, MatchPlayer { name: "b".to_string(), - bot_spec: Box::new(bot_spec.clone()), + bot_spec: Box::new(DockerBotSpec { + image: IMAGE.to_string(), + code_path: PathBuf::from("./bots/broken_bot"), + argv: vec!["python".to_string(), "bot.py".to_string()], + }), }, ], }) .await; + + // TODO: use a joinhandle to wait for the logger to finish + tokio::time::sleep(std::time::Duration::from_secs(1)).await; } diff --git a/planetwars-matchrunner/src/bot_runner.rs b/planetwars-matchrunner/src/bot_runner.rs index adb5907..d40a133 100644 --- a/planetwars-matchrunner/src/bot_runner.rs +++ b/planetwars-matchrunner/src/bot_runner.rs @@ -35,7 +35,7 @@ pub fn run_local_bot(player_id: u32, event_bus: Arc<Mutex<EventBus>>, bot: Bot) }; tokio::spawn(runner.run()); - return LocalBotHandle { tx }; + LocalBotHandle { tx } } pub struct LocalBotRunner { @@ -90,11 +90,11 @@ impl Bot { let stdout = child.stdout.take().unwrap(); let reader = BufReader::new(stdout).lines(); - return BotProcess { + BotProcess { stdin: child.stdin.take().unwrap(), stdout: reader, child, - }; + } } } diff --git a/planetwars-matchrunner/src/lib.rs b/planetwars-matchrunner/src/lib.rs index 0be0b3d..b7a9e53 100644 --- a/planetwars-matchrunner/src/lib.rs +++ b/planetwars-matchrunner/src/lib.rs @@ -72,7 +72,7 @@ pub async fn run_match(config: MatchConfig) { start_bot( player_id, event_bus.clone(), - &player.bot_spec, + player.bot_spec.as_ref(), match_logger.clone(), ) }) @@ -111,7 +111,7 @@ pub async fn run_match(config: MatchConfig) { async fn start_bot( player_id: u32, event_bus: Arc<Mutex<EventBus>>, - bot_spec: &Box<dyn BotSpec>, + bot_spec: &dyn BotSpec, match_logger: MatchLogger, ) -> (u32, Box<dyn PlayerHandle>) { let player_handle = bot_spec.run_bot(player_id, event_bus, match_logger).await; diff --git a/planetwars-matchrunner/src/match_context.rs b/planetwars-matchrunner/src/match_context.rs index 6ea60c3..1dac09b 100644 --- a/planetwars-matchrunner/src/match_context.rs +++ b/planetwars-matchrunner/src/match_context.rs @@ -57,11 +57,11 @@ impl MatchCtx { timeout, }); - return Request { + Request { player_id, request_id, event_bus: self.event_bus.clone(), - }; + } } pub fn players(&self) -> Vec<u32> { @@ -97,6 +97,12 @@ impl EventBus { } } +impl Default for EventBus { + fn default() -> Self { + EventBus::new() + } +} + impl EventBus { pub fn resolve_request(&mut self, id: RequestId, result: RequestResult<Vec<u8>>) { if self.request_responses.contains_key(&id) { @@ -138,9 +144,9 @@ impl Future for Request { event_bus .wakers .entry(request_id) - .or_insert_with(|| AtomicWaker::new()) + .or_insert_with(AtomicWaker::new) .register(cx.waker()); - return Poll::Pending; + Poll::Pending } } diff --git a/planetwars-matchrunner/src/match_log.rs b/planetwars-matchrunner/src/match_log.rs index 9991f99..30751fd 100644 --- a/planetwars-matchrunner/src/match_log.rs +++ b/planetwars-matchrunner/src/match_log.rs @@ -29,7 +29,7 @@ pub async fn create_log_sink(log_file_path: &Path) -> MatchLogger { .await .expect("Could not create log file"); tokio::spawn(run_log_sink(rx, log_file)); - return tx; + tx } async fn run_log_sink(mut rx: mpsc::UnboundedReceiver<MatchLogMessage>, mut file: File) { diff --git a/planetwars-matchrunner/src/pw_match.rs b/planetwars-matchrunner/src/pw_match.rs index c114d78..c9a7f7b 100644 --- a/planetwars-matchrunner/src/pw_match.rs +++ b/planetwars-matchrunner/src/pw_match.rs @@ -74,7 +74,7 @@ impl PwMatch { .iter() .filter(|p| p.alive) .map(move |player| { - let state_for_player = pw_serializer::serialize_rotated(&state, player.id - 1); + let state_for_player = pw_serializer::serialize_rotated(state, player.id - 1); match_ctx .request( player.id.try_into().unwrap(), @@ -115,7 +115,7 @@ impl PwMatch { }) .collect(); - return proto::PlayerAction::Commands(commands); + proto::PlayerAction::Commands(commands) } } |