# A thread that runs the game
class GameThread(StoppableThread):
- def __init__(self, board, players):
+ def __init__(self, board, players, server = True):
StoppableThread.__init__(self)
self.board = board
self.players = players
self.lock = threading.RLock() #lock for access of self.state
self.cond = threading.Condition() # conditional for some reason, I forgot
self.final_result = ""
+ self.server = server
+
+
+
for p in self.players:
with self.lock:
- if isinstance(p, NetworkSender):
- self.state["turn"] = p.base_player # "turn" contains the player who's turn it is
- else:
- self.state["turn"] = p
- #try:
- if True:
+ self.state["turn"] = p.base_player()
+ try:
+ #if True:
[x,y] = p.select() # Player selects a square
if self.stopped():
+ #debug("Quitting in select")
break
-
- if not (isinstance(p, Network) and p.server == False):
- result = self.board.select(x, y, colour = p.colour)
+
+ if isinstance(p, NetworkPlayer):
+ if p.network.server == True:
+ result = self.board.select(x, y, colour = p.colour)
+ else:
+ result = None
+
else:
- #debug(str(self) + " don't update local board")
- result = ""
+ result = self.board.select(x, y, colour = p.colour)
result = p.update(result)
+ if self.stopped():
+ break
for p2 in self.players:
- if p2 != p:
- result = p2.update(result) # Inform players of what happened
+ if p2 == p:
+ continue
+ p2.update(result) # Inform players of what happened
+ if self.stopped():
+ break
+
+ if self.stopped():
+ break
log(result)
graphics.state["dest"] = None
continue
- try:
- [x2,y2] = p.get_move() # Player selects a destination
- except:
- self.stop()
+ #try:
+ [x2,y2] = p.get_move() # Player selects a destination
+ #except:
+ # self.stop()
if self.stopped():
+ #debug("Quitting in get_move")
break
-
- result = str(x) + " " + str(y) + " -> " + str(x2) + " " + str(y2)
- log(result)
-
- self.board.update_move(x, y, x2, y2)
+ if isinstance(p, NetworkPlayer):
+ if p.network.server == True:
+ result = str(x) + " " + str(y) + " -> " + str(x2) + " " + str(y2)
+ self.board.update_move(x, y, x2, y2)
+ else:
+ result = None
+
+ else:
+ result = str(x) + " " + str(y) + " -> " + str(x2) + " " + str(y2)
+ self.board.update_move(x, y, x2, y2)
+
+ result = p.update(result)
+ if self.stopped():
+ break
for p2 in self.players:
+ if p2 == p:
+ continue
p2.update(result) # Inform players of what happened
+ if self.stopped():
+ break
+
+ if self.stopped():
+ break
+
+
+
+ log(result)
+
graphics.state["dest"] = None
graphics.state["moves"] = None
- # Commented out exception stuff for now, because it makes it impossible to tell if I made an IndentationError somewhere
- # except Exception,e:
- # result = e.message
- # #sys.stderr.write(result + "\n")
- #
- # self.stop()
- # with self.lock:
- # self.final_result = self.state["turn"].colour + " " + e.message
-
- end = self.board.end_condition()
- if end != None:
- with self.lock:
- if end == "DRAW":
- self.final_result = self.state["turn"].colour + " " + end
- else:
- self.final_result = end
- self.stop()
+
+ end = self.board.end_condition()
+ if end != None:
+ with self.lock:
+ if end == "DRAW":
+ self.final_result = self.state["turn"].colour + " " + end
+ else:
+ self.final_result = end
+ self.stop()
- if self.stopped():
+ if self.stopped():
+ break
+ except Exception,e:
+ #if False:
+ result = e.message
+ sys.stderr.write("qchess.py exception: "+result + "\n")
+
+ self.stop()
+
+ with self.lock:
+ self.final_result = self.state["turn"].colour + " " + e.message
break
+
for p2 in self.players:
p2.quit(self.final_result)