import time
turn_delay = 0.5
+sleep_timeout = None
[game, graphics] = [None, None]
def make_player(name, colour):
+ debug(name)
if name[0] == '@':
if name[1:] == "human":
return HumanPlayer(name, colour)
s = name[1:].split(":")
if s[0] == "network":
- address = None
+ ip = None
+ port = 4562
+ #print str(s)
if len(s) > 1:
- address = s[1]
- return NetworkReceiver(colour, address)
+ if s[1] != "":
+ ip = s[1]
+ if len(s) > 2:
+ port = int(s[2])
+
+ if ip == None:
+ if colour == "black":
+ port += 1
+ elif colour == "white":
+ port += 1
+
+ return NetworkPlayer(colour, Network((ip, port)), None)
if s[0] == "internal":
import inspect
sys.stderr.write(sys.argv[0] + " : Can't find an internal agent matching \"" + s[1] + "\"\n")
sys.stderr.write(sys.argv[0] + " : Choices are: " + str(map(lambda e : e[0], internal_agents)) + "\n")
return None
-
+ if s[0] == "fifo":
+ if len(s) > 1:
+ return FifoPlayer(s[1], colour)
+ else:
+ return FifoPlayer(str(os.getpid())+"."+colour, colour)
else:
return ExternalAgent(name, colour)
global src_file
global graphics_enabled
global always_reveal_states
+ global sleep_timeout
+
+
+ retry_illegal = False
+ server_addr = None
max_moves = None
src_file = None
i += 1
arg = argv[i]
if arg[0] != '-':
- p = make_player(arg, colour)
- if not isinstance(p, Player):
- sys.stderr.write(sys.argv[0] + " : Fatal error creating " + colour + " player\n")
- return 100
- players.append(p)
- if colour == "white":
- colour = "black"
- elif colour == "black":
- pass
- else:
- sys.stderr.write(sys.argv[0] + " : Too many players (max 2)\n")
+ players.append(arg)
continue
# Option parsing goes here
elif arg[1] == '-' and arg[2:] == "reveal":
always_reveal_states = True
elif (arg[1] == '-' and arg[2:] == "graphics"):
- graphics_enabled = not graphics_enabled
+ graphics_enabled = True
+ elif (arg[1] == '-' and arg[2:] == "no-graphics"):
+ graphics_enabled = False
elif (arg[1] == '-' and arg[2:].split("=")[0] == "file"):
# Load game from file
if len(arg[2:].split("=")) == 1:
if f[0:7] == "http://":
src_file = HttpReplay(f)
else:
- src_file = open(f.split(":")[0], "r", 0)
+ src_file = FileReplay(f.split(":")[0])
if len(f.split(":")) == 2:
max_moves = int(f.split(":")[1])
-
+
+ elif (arg[1] == '-' and arg[2:].split("=")[0] == "server"):
+ #debug("Server: " + str(arg[2:]))
+ if len(arg[2:].split("=")) <= 1:
+ server_addr = True
+ else:
+ server_addr = arg[2:].split("=")[1]
+
elif (arg[1] == '-' and arg[2:].split("=")[0] == "log"):
# Log file
if len(arg[2:].split("=")) == 1:
- log_files.append(LogFile(sys.stdout))
+ log_files.append(LogFile(sys.stdout,""))
else:
f = arg[2:].split("=")[1]
- if f[0] == '@':
+ if f == "":
+ log_files.append(LogFile(sys.stdout, ""))
+ elif f[0] == '@':
log_files.append(ShortLog(f[1:]))
else:
- log_files.append(LogFile(open(f, "w", 0)))
+ log_files.append(LogFile(open(f, "w", 0), f))
elif (arg[1] == '-' and arg[2:].split("=")[0] == "delay"):
# Delay
if len(arg[2:].split("=")) == 1:
agent_timeout = -1
else:
agent_timeout = float(arg[2:].split("=")[1])
-
+ elif (arg[1] == '-' and arg[2:].split("=")[0] == "blackout"):
+ # Screen saver delay
+ if len(arg[2:].split("=")) == 1:
+ sleep_timeout = -1
+ else:
+ sleep_timeout = float(arg[2:].split("=")[1])
+ elif (arg[1] == '-' and arg[2:] == "retry-illegal"):
+ retry_illegal = not retry_illegal
elif (arg[1] == '-' and arg[2:] == "help"):
# Help
os.system("less data/help.txt") # The best help function
return 0
-
-
+
+ # Dedicated server?
+
+ #debug("server_addr = " + str(server_addr))
+
+ if server_addr != None:
+ if server_addr == True:
+ return dedicated_server()
+ else:
+ if len(players) > 1:
+ sys.stderr.write("Only a single player may be provided when --server is used\n")
+ return 1
+ if len(players) == 1:
+ return client(server_addr, players[0])
+ else:
+ return client(server_addr)
+
+ for i in xrange(len(players)):
+ p = make_player(players[i], colour)
+ if not isinstance(p, Player):
+ sys.stderr.write(sys.argv[0] + " : Fatal error creating " + colour + " player\n")
+ return 100
+ players[i] = p
+ if colour == "white":
+ colour = "black"
+ elif colour == "black":
+ pass
+ else:
+ sys.stderr.write(sys.argv[0] + " : Too many players (max 2)\n")
+
# Create the board
# Construct a GameThread! Make it global! Damn the consequences!
board = Board(style)
board.max_moves = max_moves
game = GameThread(board, players)
+ game.retry_illegal = retry_illegal
if graphics_enabled == True:
try:
graphics = GraphicsThread(game.board, grid_sz = [64,64]) # Construct a GraphicsThread!
+
+ graphics.sleep_timeout = sleep_timeout
except Exception,e:
graphics = None
# If there are no players listed, display a nice pretty menu
if len(players) != 2:
if graphics != None:
+
+ server_addr = graphics.SelectServer()
+ if server_addr != None:
+ pygame.quit() # Time to say goodbye
+ if server_addr == True:
+ return dedicated_server()
+ else:
+ return client(server_addr)
+
players = graphics.SelectPlayers(players)
else:
sys.stderr.write(sys.argv[0] + " : Usage " + sys.argv[0] + " white black\n")
sys.stderr.write(sys.argv[0] + " : Graphics window closed before players chosen\n")
return 45
-
- # Wrap NetworkSender players around original players if necessary
- for i in range(len(players)):
- if isinstance(players[i], NetworkReceiver):
- players[i].board = board # Network players need direct access to the board
- for j in range(len(players)):
- if j == i:
- continue
- if isinstance(players[j], NetworkSender) or isinstance(players[j], NetworkReceiver):
+ old = players[:]
+ for p in old:
+ if isinstance(p, NetworkPlayer):
+ for i in range(len(old)):
+ if old[i] == p or isinstance(old[i], NetworkPlayer):
continue
- players[j] = NetworkSender(players[j], players[i].address)
- players[j].board = board
-
- # Connect the networked players
+ players[i] = NetworkPlayer(old[i].colour, p.network, old[i])
+
for p in players:
- if isinstance(p, NetworkSender) or isinstance(p, NetworkReceiver):
- if graphics != None:
- graphics.board.display_grid(graphics.window, graphics.grid_sz)
- graphics.message("Connecting to " + p.colour + " player...")
- p.connect()
-
+ #debug(str(p))
+ if isinstance(p, NetworkPlayer):
+ p.board = game.board
+ if not p.network.connected:
+ if not p.network.server:
+ time.sleep(0.2)
+ p.network.connect()
+
# If using windows, select won't work; use horrible TimeoutPlayer hack
if agent_timeout > 0:
if src_file != None and src_file != sys.stdin:
src_file.close()
+ sys.stdout.write(game.final_result + "\n")
+
return error
+
+
+
+
+
+
+
# This is how python does a main() function...
if __name__ == "__main__":
+ retcode = 0
try:
- sys.exit(main(sys.argv))
+ retcode = main(sys.argv)
except KeyboardInterrupt:
sys.stderr.write(sys.argv[0] + " : Got KeyboardInterrupt. Stopping everything\n")
if isinstance(graphics, StoppableThread):
game.stop()
if game.is_alive():
game.join()
-
- sys.exit(102)
+ retcode = 102
+ #except Exception, e:
+ # sys.stderr.write(sys.argv[0] + " : " + e.message + "\n")
+ # retcode = 103
+
+ try:
+ sys.stdout.close()
+ except:
+ pass
+ try:
+ sys.stderr.close()
+ except:
+ pass
+ sys.exit(retcode)
+