def game_changed(self, game): end_iter = self.textbuffer.get_end_iter start = end_iter().get_offset() board = game.getBoardAtPly(game.ply, variation=0).board self.textbuffer.insert(end_iter(), "%s " % self.__movestr(board)) startIter = self.textbuffer.get_iter_at_offset(start) endIter = self.textbuffer.get_iter_at_offset(end_iter().get_offset()) self.textbuffer.apply_tag_by_name("move", startIter, endIter) node = {} node["board"] = board node["start"] = startIter.get_offset() node["end"] = end_iter().get_offset() node["parent"] = None node["level"] = 0 self.nodelist.append(node) if self.showEmt and self.gamemodel.timed: elapsed = self.gamemodel.timemodel.getElapsedMoveTime(board.plyCount - self.gamemodel.lowply) self.textbuffer.insert_with_tags_by_name(end_iter(), "%s " % formatTime(elapsed), "emt") self.update_selected_node()
def game_changed(self, game, ply): board = game.getBoardAtPly(ply, variation=0).board # if self.update() insterted all nodes before (f.e opening_changed), do nothing if self.nodelist and self.nodelist[-1]["board"] == board: return end_iter = self.textbuffer.get_end_iter start = end_iter().get_offset() movestr = self.__movestr(board) self.textbuffer.insert(end_iter(), "%s " % movestr) startIter = self.textbuffer.get_iter_at_offset(start) endIter = self.textbuffer.get_iter_at_offset(end_iter().get_offset()) self.textbuffer.apply_tag_by_name("move", startIter, endIter) self.colorize_node(board.plyCount, startIter, endIter) node = {} node["board"] = board node["start"] = startIter.get_offset() node["end"] = end_iter().get_offset() node["parent"] = None node["level"] = 0 self.nodelist.append(node) if self.showEmt and self.gamemodel.timed: elapsed = self.gamemodel.timemodel.getElapsedMoveTime( board.plyCount - self.gamemodel.lowply) self.textbuffer.insert_with_tags_by_name( end_iter(), "%s " % formatTime(elapsed), "emt") self.update_selected_node()
def game_changed(self, game, ply): board = game.getBoardAtPly(ply, variation=0).board # if self.update() insterted all nodes before (f.e opening_changed), do nothing if self.nodelist and self.nodelist[-1]["board"] == board: return end_iter = self.textbuffer.get_end_iter start = end_iter().get_offset() movestr = self.__movestr(board) self.textbuffer.insert(end_iter(), "%s " % movestr) startIter = self.textbuffer.get_iter_at_offset(start) endIter = self.textbuffer.get_iter_at_offset(end_iter().get_offset()) self.textbuffer.apply_tag_by_name("move", startIter, endIter) self.colorize_node(board.plyCount, startIter, endIter) node = {} node["board"] = board node["start"] = startIter.get_offset() node["end"] = end_iter().get_offset() node["parent"] = None node["level"] = 0 self.nodelist.append(node) if self.showEmt and self.gamemodel.timed: elapsed = self.gamemodel.timemodel.getElapsedMoveTime(board.plyCount - self.gamemodel.lowply) self.textbuffer.insert_with_tags_by_name(end_iter(), "%s " % formatTime(elapsed), "emt") self.update_selected_node()
def insert_nodes(self, board, level=0, parent=None, result=None): """ Recursively builds the node tree """ end_iter = self.textbuffer.get_end_iter # Convenience shortcut to the function while True: start = end_iter().get_offset() if board is None: break # Initial game or variation comment if board.prev is None: for index, child in enumerate(board.children): if isinstance(child, basestring): if 0: # TODO board.plyCount == self.gamemodel.lowply: self.insert_comment(child + "\n", board, index, parent, level) else: self.insert_comment(child, board, index, parent, level) board = board.next continue if board.fen_was_applied: self.insert_node(board, end_iter(), -1, level, parent) if self.showEmt and level == 0 and board.fen_was_applied and self.gamemodel.timemodel.hasTimes: elapsed = self.gamemodel.timemodel.getElapsedMoveTime(board.plyCount - self.gamemodel.lowply) self.textbuffer.insert_with_tags_by_name(end_iter(), "%s " % formatTime(elapsed), "emt") if self.showEval and level == 0 and board.fen_was_applied and board.plyCount in self.gamemodel.scores: moves, score, depth = self.gamemodel.scores[board.plyCount] score = score * -1 if board.color == BLACK else score endIter = self.textbuffer.get_iter_at_offset(end_iter().get_offset()) self.textbuffer.insert_with_tags_by_name(end_iter(), "%s " % prettyPrintScore(score, depth), "emt") for index, child in enumerate(board.children): if isinstance(child, basestring): # comment self.insert_comment(child, board, index, parent, level) else: # variation diff, opening_node = self.variation_start(end_iter(), -1, level) self.insert_nodes(child[0], level+1, parent=board) self.variation_end(end_iter(), -1, level, child[1], board, opening_node) if board.next: board = board.next else: break if result and result != "*": self.textbuffer.insert_with_tags_by_name(end_iter(), " "+result, "move")
def analysis_changed(self, gamemodel, ply): if self.boardview.animating: return if not self.boardview.shownIsMainLine(): return board = gamemodel.getBoardAtPly(ply).board node = None if self.showEval or self.showBlunder: for n in self.nodelist: if n["board"] == board: start = self.textbuffer.get_iter_at_offset(n["start"]) end = self.textbuffer.get_iter_at_offset(n["end"]) node = n break if node is None: return if self.showBlunder: self.colorize_node(ply, start, end) emt_eval = "" if self.showEmt and self.gamemodel.timemodel.hasTimes: elapsed = gamemodel.timemodel.getElapsedMoveTime(board.plyCount - gamemodel.lowply) emt_eval = "%s " % formatTime(elapsed) if self.showEval: if board.plyCount in gamemodel.scores: moves, score, depth = gamemodel.scores[board.plyCount] score = score * -1 if board.color == BLACK else score emt_eval += "%s " % prettyPrintScore(score, depth) if emt_eval: if node == self.nodelist[-1]: next_node = None self.textbuffer.delete(end, self.textbuffer.get_end_iter()) else: next_node = self.nodelist[self.nodelist.index(node) + 1] next_start = self.textbuffer.get_iter_at_offset( next_node["start"]) self.textbuffer.delete(end, next_start) self.textbuffer.insert_with_tags_by_name(end, emt_eval, "emt") if next_node is not None: diff = end.get_offset() - next_node["start"] for node in self.nodelist[self.nodelist.index(next_node):]: node["start"] += diff node["end"] += diff
def analysis_changed(self, gamemodel, ply): if self.boardview.animating: return if not self.boardview.shownIsMainLine(): return board = gamemodel.getBoardAtPly(ply).board node = None if self.showEval or self.showBlunder: for n in self.nodelist: if n["board"] == board: start = self.textbuffer.get_iter_at_offset(n["start"]) end = self.textbuffer.get_iter_at_offset(n["end"]) node = n break if node is None: return if self.showBlunder: self.colorize_node(ply, start, end) emt_eval = "" if self.showEmt and self.gamemodel.timemodel.hasTimes: elapsed = gamemodel.timemodel.getElapsedMoveTime(board.plyCount - gamemodel.lowply) emt_eval = "%s " % formatTime(elapsed) if self.showEval: if board.plyCount in gamemodel.scores: moves, score, depth = gamemodel.scores[board.plyCount] score = score * -1 if board.color == BLACK else score emt_eval += "%s " % prettyPrintScore(score, depth) if emt_eval: if node == self.nodelist[-1]: next_node = None self.textbuffer.delete(end, self.textbuffer.get_end_iter()) else: next_node = self.nodelist[self.nodelist.index(node) + 1] next_start = self.textbuffer.get_iter_at_offset(next_node[ "start"]) self.textbuffer.delete(end, next_start) self.textbuffer.insert_with_tags_by_name(end, emt_eval, "emt") if next_node is not None: diff = end.get_offset() - next_node["start"] for node in self.nodelist[self.nodelist.index(next_node):]: node["start"] += diff node["end"] += diff
def walk(node, result, model, save_emt=False, save_eval=False, vari=False): """Prepares a game data for .pgn storage. Recursively walks the node tree to collect moves and comments into a resulting movetext string. Arguments: node - list (a tree of lboards created by the pgn parser) result - str (movetext strings)""" def store(text): if len(result) > 1 and result[-1] == "(": result[-1] = "(%s" % text elif text == ")": result[-1] = "%s)" % result[-1] else: result.append(text) while True: if node is None: break # Initial game or variation comment if node.prev is None: for child in node.children: if isinstance(child, str): store("{%s}" % child) node = node.next continue movecount = move_count(node, black_periods=(save_emt or save_eval) and "TimeControl" in model.tags) if movecount is not None: if movecount: store(movecount) move = node.lastMove store(toSAN(node.prev, move)) if (save_emt or save_eval) and not vari: emt_eval = "" if "TimeControl" in model.tags and save_emt: elapsed = model.timemodel.getElapsedMoveTime( node.plyCount - model.lowply) emt_eval = "[%%emt %s]" % formatTime(elapsed, clk2pgn=True) if node.plyCount in model.scores and save_eval: moves, score, depth = model.scores[node.plyCount] if node.color == BLACK: score = -score emt_eval += "[%%eval %0.2f/%s]" % (score / 100.0, depth) if emt_eval: store("{%s}" % emt_eval) for nag in node.nags: if nag: store(nag) for child in node.children: if isinstance(child, str): child = re.sub("\[%.*?\]", "", child) # comment if child: store("{%s}" % child) else: # variations if node.fen_was_applied: store("(") walk(child[0], result, model, save_emt, save_eval, vari=True) store(")") # variation after last played move is not valid pgn # but we will save it as in comment else: store("{Analyzer's primary variation:") walk(child[0], result, model, save_emt, save_eval, vari=True) store("}") if node.next: node = node.next else: break
def walk(node, result, model, save_emt=False, save_eval=False, vari=False): """Prepares a game data for .pgn storage. Recursively walks the node tree to collect moves and comments into a resulting movetext string. Arguments: node - list (a tree of lboards created by the pgn parser) result - str (movetext strings)""" def store(text): if len(result) > 1 and result[-1] == "(": result[-1] = "(%s" % text elif text == ")": result[-1] = "%s)" % result[-1] else: result.append(text) while True: if node is None: break # Initial game or variation comment if node.prev is None: for child in node.children: if isinstance(child, basestring): store("{%s}" % child) node = node.next continue movecount = move_count(node, black_periods=(save_emt or save_eval) and "TimeControl" in model.tags) if movecount is not None: if movecount: store(movecount) move = node.lastMove store(toSAN(node.prev, move)) if (save_emt or save_eval) and not vari: emt_eval = "" if "TimeControl" in model.tags and save_emt: elapsed = model.timemodel.getElapsedMoveTime( node.plyCount - model.lowply) emt_eval = "[%%emt %s]" % formatTime(elapsed, clk2pgn=True) if node.plyCount in model.scores and save_eval: moves, score, depth = model.scores[node.plyCount] if node.color == BLACK: score = -score emt_eval += "[%%eval %0.2f/%s]" % (score / 100.0, depth) if emt_eval: store("{%s}" % emt_eval) for nag in node.nags: if nag: store(nag) for child in node.children: if isinstance(child, basestring): child = re.sub("\[%.*?\]", "", child) # comment if child: store("{%s}" % child) else: # variations if node.fen_was_applied: store("(") walk(child[0], result, model, save_emt, save_eval, vari=True) store(")") # variation after last played move is not valid pgn # but we will save it as in comment else: store("{Analyzer's primary variation:") walk(child[0], result, model, save_emt, save_eval, vari=True) store("}") if node.next: node = node.next else: break