def _process_fen(self, fen, raw): level_map = ('rnbqkbnr/pppppppp/8/q7/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/1q6/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/2q5/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/3q4/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/4q3/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/5q2/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/6q1/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/7q/8/8/PPPPPPPP/RNBQKBNR') book_map = ('rnbqkbnr/pppppppp/8/8/8/q7/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/8/1q6/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/8/2q5/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/8/3q4/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/8/4q3/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/8/5q2/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/8/6q1/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/8/7q/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/q7/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/1q6/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/2q5/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/3q4/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/4q3/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/5q2/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/6q1/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/7q/8/PPPPPPPP/RNBQKBNR') engine_map = ('rnbqkbnr/pppppppp/q7/8/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/1q6/8/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/2q5/8/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/3q4/8/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/4q3/8/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/5q2/8/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/6q1/8/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/7q/8/8/8/PPPPPPPP/RNBQKBNR') shutdown_map = ('rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQQBNR', 'RNBQQBNR/PPPPPPPP/8/8/8/8/pppppppp/rnbkqbnr', '8/8/8/8/8/8/8/3QQ3', '3QQ3/8/8/8/8/8/8/8') reboot_map = ('rnbqqbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR', 'RNBKQBNR/PPPPPPPP/8/8/8/8/pppppppp/rnbqqbnr', '8/8/8/8/8/8/8/3qq3', '3qq3/8/8/8/8/8/8/8') mode_map = {'rnbqkbnr/pppppppp/8/Q7/8/8/PPPPPPPP/RNBQKBNR': Mode.NORMAL, 'rnbqkbnr/pppppppp/8/1Q6/8/8/PPPPPPPP/RNBQKBNR': Mode.BRAIN, 'rnbqkbnr/pppppppp/8/2Q5/8/8/PPPPPPPP/RNBQKBNR': Mode.ANALYSIS, 'rnbqkbnr/pppppppp/8/3Q4/8/8/PPPPPPPP/RNBQKBNR': Mode.KIBITZ, 'rnbqkbnr/pppppppp/8/4Q3/8/8/PPPPPPPP/RNBQKBNR': Mode.OBSERVE, 'rnbqkbnr/pppppppp/8/5Q2/8/8/PPPPPPPP/RNBQKBNR': Mode.PONDER, 'rnbqkbnr/pppppppp/8/7Q/8/8/PPPPPPPP/RNBQKBNR': Mode.REMOTE} drawresign_map = {'8/8/8/3k4/4K3/8/8/8': GameResult.WIN_WHITE, '8/8/8/3K4/4k3/8/8/8': GameResult.WIN_WHITE, '8/8/8/4k3/3K4/8/8/8': GameResult.WIN_BLACK, '8/8/8/4K3/3k4/8/8/8': GameResult.WIN_BLACK, '8/8/8/3kK3/8/8/8/8': GameResult.DRAW, '8/8/8/3Kk3/8/8/8/8': GameResult.DRAW, '8/8/8/8/3kK3/8/8/8': GameResult.DRAW, '8/8/8/8/3Kk3/8/8/8': GameResult.DRAW} bit_board = chess.Board(fen + ' w - - 0 1') # try a standard board and check for any starting pos if bit_board.chess960_pos(ignore_castling=True): logging.debug('flipping the board - W infront') self.dgtmenu.set_position_reverse_flipboard(False) bit_board = chess.Board(fen[::-1] + ' w - - 0 1') # try a revered board and check for any starting pos if bit_board.chess960_pos(ignore_castling=True): logging.debug('flipping the board - B infront') self.dgtmenu.set_position_reverse_flipboard(True) if self.dgtmenu.get_flip_board() and raw: # Flip the board if needed fen = fen[::-1] logging.debug('DGT-Fen [%s]', fen) if fen == self.dgtmenu.get_dgt_fen(): logging.debug('ignore same fen') return self.dgtmenu.set_dgt_fen(fen) self.drawresign_fen = self._drawresign() # Fire the appropriate event if fen in level_map: eng = self.dgtmenu.get_engine() level_dict = eng['level_dict'] if level_dict: inc = len(level_dict) / 7 level = min(floor(inc * level_map.index(fen)), len(level_dict) - 1) # type: int self.dgtmenu.set_engine_level(level) msg = sorted(level_dict)[level] text = self.dgttranslate.text('M10_level', msg) text.wait = self._exit_menu() logging.debug('map: New level %s', msg) write_picochess_ini('engine-level', msg) Observable.fire(Event.LEVEL(options=level_dict[msg], level_text=text, level_name=msg)) else: logging.debug('engine doesnt support levels') elif fen in book_map: book_index = book_map.index(fen) try: book = self.dgtmenu.all_books[book_index] self.dgtmenu.set_book(book_index) logging.debug('map: Opening book [%s]', book['file']) text = book['text'] text.beep = self.dgttranslate.bl(BeepLevel.MAP) text.maxtime = 1 text.wait = self._exit_menu() Observable.fire(Event.SET_OPENING_BOOK(book=book, book_text=text, show_ok=False)) except IndexError: pass elif fen in engine_map: if self.dgtmenu.installed_engines: try: self.dgtmenu.set_engine_index(engine_map.index(fen)) eng = self.dgtmenu.get_engine() level_dict = eng['level_dict'] logging.debug('map: Engine name [%s]', eng['name']) eng_text = eng['text'] eng_text.beep = self.dgttranslate.bl(BeepLevel.MAP) eng_text.maxtime = 1 eng_text.wait = self._exit_menu() if level_dict: len_level = len(level_dict) if self.dgtmenu.get_engine_level() is None or len_level <= self.dgtmenu.get_engine_level(): self.dgtmenu.set_engine_level(len_level - 1) msg = sorted(level_dict)[self.dgtmenu.get_engine_level()] options = level_dict[msg] # cause of "new-engine", send options lateron - now only {} Observable.fire(Event.LEVEL(options={}, level_text=self.dgttranslate.text('M10_level', msg), level_name=msg)) else: msg = None options = {} write_picochess_ini('engine-level', msg) Observable.fire(Event.NEW_ENGINE(eng=eng, eng_text=eng_text, options=options, show_ok=False)) self.dgtmenu.set_engine_restart(True) except IndexError: pass else: DispatchDgt.fire(self.dgttranslate.text('Y10_erroreng')) elif fen in mode_map: logging.debug('map: Interaction mode [%s]', mode_map[fen]) if mode_map[fen] == Mode.REMOTE and not self.dgtmenu.inside_room: DispatchDgt.fire(self.dgttranslate.text('Y10_errorroom')) elif mode_map[fen] == Mode.NORMAL or self.dgtmenu.get_engine_has_ponder(): self.dgtmenu.set_mode(mode_map[fen]) text = self.dgttranslate.text(mode_map[fen].value) text.beep = self.dgttranslate.bl(BeepLevel.MAP) text.maxtime = 1 # wait 1sec not forever text.wait = self._exit_menu() Observable.fire(Event.SET_INTERACTION_MODE(mode=mode_map[fen], mode_text=text, show_ok=False)) else: # only allow a pondering mode if engine supports that DispatchDgt.fire(self.dgttranslate.text('Y10_erroreng')) elif fen in self.dgtmenu.tc_fixed_map: logging.debug('map: Time control fixed') self.dgtmenu.set_time_mode(TimeMode.FIXED) self.dgtmenu.set_time_fixed(list(self.dgtmenu.tc_fixed_map.keys()).index(fen)) text = self.dgttranslate.text('M10_tc_fixed', self.dgtmenu.tc_fixed_list[self.dgtmenu.get_time_fixed()]) text.wait = self._exit_menu() timectrl = self.dgtmenu.tc_fixed_map[fen] # type: TimeControl Observable.fire(Event.SET_TIME_CONTROL(tc_init=timectrl.get_parameters(), time_text=text, show_ok=False)) elif fen in self.dgtmenu.tc_blitz_map: logging.debug('map: Time control blitz') self.dgtmenu.set_time_mode(TimeMode.BLITZ) self.dgtmenu.set_time_blitz(list(self.dgtmenu.tc_blitz_map.keys()).index(fen)) text = self.dgttranslate.text('M10_tc_blitz', self.dgtmenu.tc_blitz_list[self.dgtmenu.get_time_blitz()]) text.wait = self._exit_menu() timectrl = self.dgtmenu.tc_blitz_map[fen] # type: TimeControl Observable.fire(Event.SET_TIME_CONTROL(tc_init=timectrl.get_parameters(), time_text=text, show_ok=False)) elif fen in self.dgtmenu.tc_fisch_map: logging.debug('map: Time control fischer') self.dgtmenu.set_time_mode(TimeMode.FISCHER) self.dgtmenu.set_time_fisch(list(self.dgtmenu.tc_fisch_map.keys()).index(fen)) text = self.dgttranslate.text('M10_tc_fisch', self.dgtmenu.tc_fisch_list[self.dgtmenu.get_time_fisch()]) text.wait = self._exit_menu() timectrl = self.dgtmenu.tc_fisch_map[fen] # type: TimeControl Observable.fire(Event.SET_TIME_CONTROL(tc_init=timectrl.get_parameters(), time_text=text, show_ok=False)) elif fen in shutdown_map: logging.debug('map: shutdown') self._power_off() elif fen in reboot_map: logging.debug('map: reboot') self._reboot() elif self.drawresign_fen in drawresign_map: if not self._inside_main_menu(): logging.debug('map: drawresign') Observable.fire(Event.DRAWRESIGN(result=drawresign_map[self.drawresign_fen])) else: bit_board = chess.Board(fen + ' w - - 0 1') pos960 = bit_board.chess960_pos(ignore_castling=True) if pos960 is not None: if pos960 == 518 or self.dgtmenu.get_engine_has_960(): logging.debug('map: New game') Observable.fire(Event.NEW_GAME(pos960=pos960)) else: # self._reset_moves_and_score() DispatchDgt.fire(self.dgttranslate.text('Y10_error960')) else: Observable.fire(Event.FEN(fen=fen))
def _process_fen(self, fen: str, raw: bool): level_map = ('rnbqkbnr/pppppppp/8/q7/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/1q6/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/2q5/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/3q4/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/4q3/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/5q2/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/6q1/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/7q/8/8/PPPPPPPP/RNBQKBNR') book_map = ('rnbqkbnr/pppppppp/8/8/8/q7/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/8/1q6/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/8/2q5/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/8/3q4/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/8/4q3/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/8/5q2/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/8/6q1/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/8/7q/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/q7/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/1q6/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/2q5/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/3q4/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/4q3/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/5q2/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/6q1/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/8/8/7q/8/PPPPPPPP/RNBQKBNR') engine_map = ('rnbqkbnr/pppppppp/q7/8/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/1q6/8/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/2q5/8/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/3q4/8/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/4q3/8/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/5q2/8/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/6q1/8/8/8/PPPPPPPP/RNBQKBNR', 'rnbqkbnr/pppppppp/7q/8/8/8/PPPPPPPP/RNBQKBNR') shutdown_map = ('rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQQBNR', 'RNBQQBNR/PPPPPPPP/8/8/8/8/pppppppp/rnbkqbnr', '8/8/8/8/8/8/8/3QQ3', '3QQ3/8/8/8/8/8/8/8') reboot_map = ('rnbqqbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR', 'RNBKQBNR/PPPPPPPP/8/8/8/8/pppppppp/rnbqqbnr', '8/8/8/8/8/8/8/3qq3', '3qq3/8/8/8/8/8/8/8') mode_map = { 'rnbqkbnr/pppppppp/8/Q7/8/8/PPPPPPPP/RNBQKBNR': Mode.NORMAL, 'rnbqkbnr/pppppppp/8/1Q6/8/8/PPPPPPPP/RNBQKBNR': Mode.BRAIN, 'rnbqkbnr/pppppppp/8/2Q5/8/8/PPPPPPPP/RNBQKBNR': Mode.ANALYSIS, 'rnbqkbnr/pppppppp/8/3Q4/8/8/PPPPPPPP/RNBQKBNR': Mode.KIBITZ, 'rnbqkbnr/pppppppp/8/4Q3/8/8/PPPPPPPP/RNBQKBNR': Mode.OBSERVE, 'rnbqkbnr/pppppppp/8/5Q2/8/8/PPPPPPPP/RNBQKBNR': Mode.PONDER, 'rnbqkbnr/pppppppp/8/7Q/8/8/PPPPPPPP/RNBQKBNR': Mode.REMOTE } drawresign_map = { '8/8/8/3k4/4K3/8/8/8': GameResult.WIN_WHITE, '8/8/8/3K4/4k3/8/8/8': GameResult.WIN_WHITE, '8/8/8/4k3/3K4/8/8/8': GameResult.WIN_BLACK, '8/8/8/4K3/3k4/8/8/8': GameResult.WIN_BLACK, '8/8/8/3kK3/8/8/8/8': GameResult.DRAW, '8/8/8/3Kk3/8/8/8/8': GameResult.DRAW, '8/8/8/8/3kK3/8/8/8': GameResult.DRAW, '8/8/8/8/3Kk3/8/8/8': GameResult.DRAW } bit_board = chess.Board( fen + ' w - - 0 1' ) # try a standard board and check for any starting pos if bit_board.chess960_pos(ignore_castling=True): logging.debug('flipping the board - W infront') self.dgtmenu.set_position_reverse_flipboard(False) bit_board = chess.Board( fen[::-1] + ' w - - 0 1') # try a revered board and check for any starting pos if bit_board.chess960_pos(ignore_castling=True): logging.debug('flipping the board - B infront') self.dgtmenu.set_position_reverse_flipboard(True) if self.dgtmenu.get_flip_board() and raw: # Flip the board if needed fen = fen[::-1] logging.debug('DGT-Fen [%s]', fen) if fen == self.dgtmenu.get_dgt_fen(): logging.debug('ignore same fen') return self.dgtmenu.set_dgt_fen(fen) _, _, _, rnk_5, rnk_4, _, _, _ = fen.split('/') self.drawresign_fen = '8/8/8/' + rnk_5 + '/' + rnk_4 + '/8/8/8' # Fire the appropriate event if fen in level_map: eng = self.dgtmenu.get_engine() level_dict = eng['level_dict'] if level_dict: inc = len(level_dict) / 7 level = min(floor(inc * level_map.index(fen)), len(level_dict) - 1) # type: int self.dgtmenu.set_engine_level(level) msg = sorted(level_dict)[level] text = self.dgttranslate.text('M10_level', msg) text.wait = self._exit_menu() logging.debug('map: New level %s', msg) if not self.dgtmenu.remote_engine: write_picochess_ini('engine-level', msg) EvtObserver.fire( Event.NEW_LEVEL(options=level_dict[msg], level_text=text, level_name=msg)) else: logging.debug('engine doesnt support levels') elif fen in book_map: book_index = book_map.index(fen) try: book = self.dgtmenu.all_books[book_index] self.dgtmenu.set_book(book_index) logging.debug('map: Opening book [%s]', book['file']) text = book['text'] text.beep = self.dgttranslate.bl(BeepLevel.MAP) text.maxtime = 1 text.wait = self._exit_menu() EvtObserver.fire( Event.NEW_BOOK(book=book, book_text=text, show_ok=False)) except IndexError: pass elif fen in engine_map: if self.dgtmenu.installed_engines: try: self.dgtmenu.set_engine_index(engine_map.index(fen)) eng = self.dgtmenu.get_engine() level_dict = eng['level_dict'] logging.debug('map: Engine name [%s]', eng['name']) eng_text = eng['text'] eng_text.beep = self.dgttranslate.bl(BeepLevel.MAP) eng_text.maxtime = 1 eng_text.wait = self._exit_menu() if level_dict: len_level = len(level_dict) if self.dgtmenu.get_engine_level( ) is None or len_level <= self.dgtmenu.get_engine_level( ): self.dgtmenu.set_engine_level(len_level - 1) msg = sorted(level_dict)[ self.dgtmenu.get_engine_level()] options = level_dict[ msg] # cause of "new-engine", send options lateron - now only {} EvtObserver.fire( Event.NEW_LEVEL(options={}, level_text=self.dgttranslate.text( 'M10_level', msg), level_name=msg)) else: msg = None options = {} if not self.dgtmenu.remote_engine: write_picochess_ini('engine-level', msg) EvtObserver.fire( Event.NEW_ENGINE(eng=eng, eng_text=eng_text, options=options, show_ok=False)) self.dgtmenu.set_engine_restart(True) except IndexError: pass else: DgtObserver.fire(self.dgttranslate.text('Y10_erroreng')) elif fen in mode_map: logging.debug('map: Interaction mode [%s]', mode_map[fen]) if mode_map[fen] == Mode.REMOTE and not self.dgtmenu.inside_room: DgtObserver.fire(self.dgttranslate.text('Y10_errorroom')) elif mode_map[ fen] == Mode.BRAIN and not self.dgtmenu.get_engine_has_ponder( ): DgtObserver.fire(self.dgttranslate.text('Y10_erroreng')) else: self.dgtmenu.set_mode(mode_map[fen]) text = self.dgttranslate.text(mode_map[fen].value) text.beep = self.dgttranslate.bl(BeepLevel.MAP) text.maxtime = 1 # wait 1sec not forever text.wait = self._exit_menu() EvtObserver.fire( Event.INTERACTION_MODE(mode=mode_map[fen], mode_text=text, show_ok=False)) elif fen in self.dgtmenu.tc_fixed_map: logging.debug('map: Time control fixed') self.dgtmenu.set_time_mode(TimeMode.FIXED) self.dgtmenu.set_time_fixed( list(self.dgtmenu.tc_fixed_map.keys()).index(fen)) text = self.dgttranslate.text( 'M10_tc_fixed', self.dgtmenu.tc_fixed_list[self.dgtmenu.get_time_fixed()]) text.wait = self._exit_menu() timectrl = self.dgtmenu.tc_fixed_map[fen] # type: TimeControl EvtObserver.fire( Event.TIME_CONTROL(tc_init=timectrl.get_parameters(), time_text=text, show_ok=False)) elif fen in self.dgtmenu.tc_blitz_map: logging.debug('map: Time control blitz') self.dgtmenu.set_time_mode(TimeMode.BLITZ) self.dgtmenu.set_time_blitz( list(self.dgtmenu.tc_blitz_map.keys()).index(fen)) text = self.dgttranslate.text( 'M10_tc_blitz', self.dgtmenu.tc_blitz_list[self.dgtmenu.get_time_blitz()]) text.wait = self._exit_menu() timectrl = self.dgtmenu.tc_blitz_map[fen] # type: TimeControl EvtObserver.fire( Event.TIME_CONTROL(tc_init=timectrl.get_parameters(), time_text=text, show_ok=False)) elif fen in self.dgtmenu.tc_fisch_map: logging.debug('map: Time control fischer') self.dgtmenu.set_time_mode(TimeMode.FISCHER) self.dgtmenu.set_time_fisch( list(self.dgtmenu.tc_fisch_map.keys()).index(fen)) text = self.dgttranslate.text( 'M10_tc_fisch', self.dgtmenu.tc_fisch_list[self.dgtmenu.get_time_fisch()]) text.wait = self._exit_menu() timectrl = self.dgtmenu.tc_fisch_map[fen] # type: TimeControl EvtObserver.fire( Event.TIME_CONTROL(tc_init=timectrl.get_parameters(), time_text=text, show_ok=False)) elif fen in shutdown_map: logging.debug('map: shutdown') self._power_off() elif fen in reboot_map: logging.debug('map: reboot') self._reboot() elif self.drawresign_fen in drawresign_map: logging.debug('map: drawresign') EvtObserver.fire( Event.DRAW_RESIGN(result=drawresign_map[self.drawresign_fen])) else: bit_board = chess.Board(fen + ' w - - 0 1') pos960 = bit_board.chess960_pos(ignore_castling=True) if pos960 is not None: if pos960 == 518 or self.dgtmenu.get_engine_has_960(): logging.debug('map: New game') EvtObserver.fire(Event.NEW_GAME(pos960=pos960)) else: # self._reset_moves_and_score() DgtObserver.fire(self.dgttranslate.text('Y10_error960')) else: EvtObserver.fire(Event.NEW_FEN(fen=fen))