def release(self, pos): if self.piece_flying: self.piece_flying = False x = self.piece_in(pos) if (x and (self.side if self.kind & KIND_PLAYING else self.turn) == x.isupper()): self.piece_clicked = x self.selected.clear() self.selected.append(pos) return None # MOVE if len(self.selected): if len(self.selected) > 1: self.selected.pop() self.selected.append(pos) if self.kind & KIND_OBSERVING: ns = self._history[-1].make(self.selected) if ns: self.set_state(ns) self.altline = True else: self.selected.pop() elif (self.kind ^ KIND_PLAYING) or (self.side == self.turn) : self.move_sent = True return (postopos(self.selected[0]) +postopos(self.selected[1])) return None
def set_state(self, new_state): if isinstance(new_state, GameState): state = new_state else: state = Style12(new_state) self.interruptus = False self.last_style12 = state if not self._history.update(state) and self.opponent != '': self.fill_history(state) if state in self._history or self.kind & KIND_EXAMINING: r = self._history.set_mainline(state) if self.board and self.board.movetree: if r: self.board.movetree.set_mainline(*r) else: self.board.movetree.repopulate() elif self.board and self.board.movetree: self.board.movetree.update_node(state) self.move_sent = False if state is self._history[-1]: self.turn = state.turn #flush premove if (self.kind & KIND_PLAYING and len(self.selected) == 2 and self.side == self.turn and self.halfmove != state.halfmove): config.cli.send_cmd((postopos(self.selected[0])+ postopos(self.selected[1])), save_history=False) # move was ilegal? preserve selected piece elif (len(self.selected) == 2 and self.halfmove == state.halfmove): self.selected.pop() elif (self.kind & KIND_PLAYING and len(self.selected) == 1 and self.side == self.turn): pass elif state is not self._history[-1]: pass else: self.selected.clear() self.halfmove = state.halfmove if (not self.player_names == state.names or (abs(self._kind) == 2 and self._kind != state.relation)): self.number = state.game_number self.player = [state.names[0]+self.rating[0], state.names[1]+self.rating[1]] self.player_names = state.names self._kind = state.relation self.kind = (KIND_PLAYING if abs(self._kind) == 1 else KIND_OBSERVING if self._kind == 0 else KIND_EXAMINING if self._kind == 2 else KIND_ISOLATED if self._kind == -3 else KIND_OBSERVING | KIND_EXAMINING) self.side = ((self.turn and (self._kind == 1)) or ((self._kind == -1) and not self.turn) or (self.kind ^ KIND_PLAYING and (self.player_names[0] != config.fics_user or self.player_names[1] == config.fics_user))) self.opponent = self.player_names[not self.side] self.me = self.player_names[self.side] self.itime = state.itime self.iinc = state.iinc self.name = ('Game {}: '.format(state.game_number) + ('Observing ' if self.kind & KIND_OBSERVING else 'Examining ' if self.kind & KIND_EXAMINING else '')+ ' v/s '.join(self.player[::-1])+' - '+ '/'.join([self.itime, self.iinc])+ # (' - '+self.rated if self.rated else '' )+ (' - ' + self.result if self.result else '') ).strip() if self.kind & KIND_OBSERVING: self.get_old_moves() if self.kind & (KIND_EXAMINING | KIND_PLAYING): config.gui.seek_graph_destroy() if self.board: self.board.reset(True) for hdl in self.player_names: config.update_handle(hdl) else: if self.board: self.board.reset(False)