Exemplo n.º 1
0
    def read(self, line):
        li = line.split("|")
        self.position.read_fen(li[0])
        nli = len(li)
        if nli > 1:
            self.label = li[1]

            if nli > 2:
                solucion = li[2]
                ok, game_obj = Game.pgn_game('[FEN "%s"]\n%s' % (self.position.fen(), solucion))
                if ok:
                    self.game_obj = game_obj

                    if nli > 3:
                        txt = li[3].replace("]", "]\n").replace(" [", "[")
                        ok, game_original = Game.pgn_game(txt)
                        if ok:
                            ok = False
                            for n in range(len(game_original) - 1, -1, -1):
                                move = game_original.move(n)
                                if move.position == self.position:
                                    ok = True
                                    if n + 1 != len(game_original):
                                        game_original.li_moves = game_original.li_moves[: n + 1]
                                    break
                        if ok:
                            self.game_original = game_original
                            self.game_original.set_unknown()
Exemplo n.º 2
0
    def read_game_raw(self, raw):
        p = Game.Game()
        xpgn = raw["_DATA_"]
        ok = False
        if xpgn:
            if xpgn.startswith(BODY_SAVE):
                ok, p = Game.pgn_game(xpgn[len(BODY_SAVE):].strip())
            else:
                try:
                    p.restore(xpgn)
                    ok = True
                except:
                    ok = False

        if not ok:
            fen, pv = self.read_xpv(raw["XPV"])
            if fen:
                p.set_fen(fen)
            p.read_pv(pv)

        litags = []
        for field in self.li_fields:
            if not (field in ("XPV", "_DATA_", "PLYCOUNT")):
                v = raw[field]
                if v:
                    litags.append((drots.get(field,
                                             Util.primera_mayuscula(field)),
                                   v if type(v) == str else str(v)))
        litags.append(("PlyCount", str(raw["PLYCOUNT"])))

        p.set_tags(litags)
        p.assign_opening()
        p.resultado()
        return p
Exemplo n.º 3
0
 def paste_pgn(self):
     texto = QTUtil.traePortapapeles()
     if texto:
         ok, game = Game.pgn_game(texto)
         if not ok:
             QTUtil2.message_error(self.main_window, _("The text from the clipboard does not contain a chess game in PGN format"))
             return
         self.replace_game(game)
Exemplo n.º 4
0
    def work_read_position(self):
        if self.w_reinforcement_working:
            pos = self.reinforcement.get_working_position()
        else:
            pos = self.current_position()
        posfen = self.liOrder[pos]
        txt = self.liFNS[posfen]
        li = txt.split("|")

        fen = li[0]
        if fen.endswith(" 0"):
            fen = fen[:-1] + "1"
        label = li[1]
        solucion = li[2]
        ok, game_obj = Game.pgn_game('[FEN "%s"]\n%s' % (fen, solucion))

        game_base = None
        if len(li) > 3:
            txt = li[3].replace("]", "]\n").replace(" [", "[")
            ok, game_base = Game.pgn_game(txt)
            if ok:
                cp = Position.Position()
                cp.read_fen(fen)
                ok = False
                for n in range(len(game_base) - 1, -1, -1):
                    move = game_base.move(n)
                    if move.position == cp:
                        ok = True
                        if n + 1 != len(game_base):
                            game_base.li_moves = game_base.li_moves[:n + 1]
                        break
            if not ok:
                game_base = None

        if game_base:
            game_base.set_unknown()

        self.w_label = label

        return game_obj, game_base
Exemplo n.º 5
0
    def read_line(self, line):
        li = line.strip().split("|")
        self.fen, self.label, pgn_moves = li[0], li[1], li[2]

        self.pgn = '[FEN "%s"]\n\n%s' % (self.fen, pgn_moves)
        ok, p = Game.pgn_game(self.pgn)
        self.pv = p.pv()
        self.limoves = self.pv.split(" ")

        nmoves = len(self.limoves)
        self.num_moves = int(len(self.limoves) / 2)
        if nmoves % 2 == 1:
            self.num_moves += 1
        return self
Exemplo n.º 6
0
 def paste(self, texto):
     try:
         if "." in texto or '"' in texto:
             ok, game = Game.pgn_game(texto)
             if not ok:
                 return
         elif "/" in texto:
             game = Game.Game(fen=texto)
         else:
             return
         self.opening_block = None
         self.xfichero = None
         self.xpgn = None
         self.xjugadaInicial = None
         dic = self.creaDic()
         dic["GAME"] = game.save()
         dic["WHITEBOTTOM"] = game.last_position.is_white
         self.reiniciar(dic)
     except:
         pass
Exemplo n.º 7
0
    def current_pgn(self):
        pgn = ""
        for key, value in self.li_labels:
            key = key.strip()
            value = value.strip()
            if key and value:
                pgn += '[%s "%s"]\n' % (key, value)
        pgn += "\n%s\n" % self.em_body.texto().strip()
        if "\r\n" in pgn:
            pgn = pgn.replace("\r\n", "\n")

        if self.chb_remove_c_v.isChecked():
            ok, p = Game.pgn_game(pgn)

            pgn = ""
            for k, v in p.li_tags:
                pgn += '[%s "%s"]\n' % (k, v)
            pgn += "\n\n"
            pgn += p.pgnBase()

        return pgn
Exemplo n.º 8
0
    def read_pgn_recno(self, recno):
        raw = self.read_complete_recno(recno)
        litags = []
        result = "*"
        for field in self.li_fields:
            if not (field in ("XPV", "_DATA_", "PLYCOUNT")):
                v = raw[field]
                if v:
                    litags.append(
                        (drots.get(field,
                                   field), v if type(v) == str else str(v)))
                    if field == "RESULT":
                        result = v if type(v) == str else str(v)
        dcabs = self.recuperaConfig("dcabs")
        if "Plycount" in dcabs:
            litags.append(("PlyCount", str(raw["PLYCOUNT"])))
        xpgn = raw["_DATA_"]
        if xpgn:
            if xpgn.startswith(BODY_SAVE):
                ok, p = Game.pgn_game(xpgn[len(BODY_SAVE):].strip())
            else:
                p = Game.Game()
                p.restore(xpgn)
            p.set_tags(litags)
            return p.pgn(), p.resultado()

        xpv = raw["XPV"]
        if xpv.startswith("|"):
            nada, fen, xpv = xpv.split("|")
            pv = xpv_pv(xpv) if xpv else ""
            game = Game.pv_game(fen, pv)
            pgn = game.pgnBase()
        else:
            pgn = xpv_pgn(raw["XPV"])
        tags = []
        for t, v in litags:
            tags.append('[%s "%s"]' % (t, v))
        pgn = "\n".join(tags) + "\n" + "\n" + pgn
        return pgn, result
Exemplo n.º 9
0
    def edit(self, row):

        if row is None:
            name = ""
            eco = ""
            pgn = ""
            estandar = True
            titulo = _("New opening")

        else:
            reg = self.lista[row]

            name = reg["NOMBRE"]
            eco = reg["ECO"]
            pgn = reg["PGN"]
            estandar = reg["ESTANDAR"]

            titulo = name

        # Datos
        liGen = [(None, None)]
        liGen.append((_("Name") + ":", name))
        config = FormLayout.Editbox("ECO", ancho=30, rx="[A-Z, a-z][0-9][0-9]")
        liGen.append((config, eco))
        liGen.append((_("Add to standard list") + ":", estandar))

        # Editamos
        resultado = FormLayout.fedit(liGen, title=titulo, parent=self, anchoMinimo=460, icon=Iconos.Opening())
        if resultado is None:
            return

        accion, liResp = resultado
        name = liResp[0].strip()
        if not name:
            return
        eco = liResp[1].upper()
        estandar = liResp[2]

        fen = FEN_INITIAL

        self.procesador.procesador = self.procesador  # ya que edit_variation espera un manager

        if pgn:
            ok, game = Game.pgn_game(pgn)
            if not ok:
                game = Game.Game()
        else:
            game = Game.Game()

        resp = Variations.edit_variation(self.procesador, game, titulo=name, is_white_bottom=True)

        if resp:
            game = resp

            reg = {}
            reg["NOMBRE"] = name
            reg["ECO"] = eco
            reg["PGN"] = game.pgnBaseRAW()
            reg["A1H8"] = game.pv()
            reg["ESTANDAR"] = estandar

            if row is None:
                self.lista.append(reg)
                self.grid.refresh()
                self.grabar()
            else:
                self.lista[row] = reg
            self.grid.refresh()
            self.grabar()
Exemplo n.º 10
0
    def utilities_gs(self):
        mt = _("Engine").lower()
        mt = _X(_("Disable %1"), mt) if self.play_against_engine else _X(
            _("Enable %1"), mt)
        sep = (None, None, None)

        liMasOpciones = (
            (None, _("Change the initial position"), Iconos.PGN()),
            sep,
            ("position", _("Edit start position") + " [S]", Iconos.Datos()),
            sep,
            ("initial", _("Basic position") + " [B]", Iconos.Board()),
            sep,
            ("opening", _("Opening"), Iconos.Opening()),
            sep,
            ("pasteposicion", _("Paste FEN position") + " [V]",
             Iconos.Pegar16()),
            sep,
            ("leerpgn", _("Read PGN file"), Iconos.PGN_Importar()),
            sep,
            ("pastepgn", _("Paste PGN") + " [V]", Iconos.Pegar16()),
            sep,
            ("voyager", _("Voyager 2"), Iconos.Voyager()),
            (None, None, True),
            sep,
            ("books", _("Consult a book"), Iconos.Libros()),
            sep,
            ("engine", mt, Iconos.Motores()),
            sep,
        )

        resp = self.utilidades(liMasOpciones)
        if resp == "books":
            liMovs = self.librosConsulta(True)
            if liMovs:
                for x in range(len(liMovs) - 1, -1, -1):
                    from_sq, to_sq, promotion = liMovs[x]
                    self.player_has_moved(from_sq, to_sq, promotion)

        elif resp == "initial":
            self.basic_initial_position()

        elif resp == "opening":
            me = self.unMomento()
            w = WindowOpenings.WOpenings(self.main_window, self.configuration,
                                         self.opening_block)
            me.final()
            if w.exec_():
                self.opening_block = w.resultado()
                self.xfichero = None
                self.xpgn = None
                self.xjugadaInicial = None
                self.reiniciar()

        elif resp == "position":
            self.startPosition()

        elif resp == "pasteposicion":
            texto = QTUtil.traePortapapeles()
            if texto:
                cp = Position.Position()
                try:
                    cp.read_fen(str(texto))
                    self.xfichero = None
                    self.xpgn = None
                    self.xjugadaInicial = None
                    self.new_game()
                    self.game.set_position(first_position=cp)
                    self.opening_block = None
                    self.reiniciar()
                except:
                    pass

        elif resp == "leerpgn":
            self.leerpgn()

        elif resp == "pastepgn":
            texto = QTUtil.traePortapapeles()
            if texto:
                ok, game = Game.pgn_game(texto)
                if not ok:
                    QTUtil2.message_error(
                        self.main_window,
                        _("The text from the clipboard does not contain a chess game in PGN format"
                          ))
                    return
                self.xfichero = None
                self.xpgn = None
                self.xjugadaInicial = None
                self.opening_block = None
                dic = self.creaDic()
                dic["GAME"] = game.save()
                dic["WHITEBOTTOM"] = game.first_position.is_white
                self.reiniciar(dic)

        elif resp == "engine":
            self.set_label1("")
            if self.play_against_engine:
                if self.xrival:
                    self.xrival.terminar()
                    self.xrival = None
                self.play_against_engine = False
            else:
                self.cambioRival()

        elif resp == "voyager":
            ptxt = Voyager.voyagerPartida(self.main_window, self.game)
            if ptxt:
                self.xfichero = None
                self.xpgn = None
                self.xjugadaInicial = None
                dic = self.creaDic()
                dic["GAME"] = ptxt
                dic["WHITEBOTTOM"] = self.board.is_white_bottom
                self.reiniciar(dic)
Exemplo n.º 11
0
    def configurarGS(self):
        mt = _("Engine").lower()
        mt = _X(_("Disable %1"), mt) if self.play_against_engine else _X(
            _("Enable %1"), mt)

        sep = (None, None, None)

        liMasOpciones = [
            ("rotacion", _("Auto-rotate board"), Iconos.JS_Rotacion()),
            sep,
            ("opening", _("Opening"), Iconos.Opening()),
            sep,
            ("position", _("Edit start position"), Iconos.Datos()),
            sep,
            ("pasteposicion", _("Paste FEN position"), Iconos.Pegar16()),
            sep,
            ("leerpgn", _("Read PGN"), Iconos.PGN_Importar()),
            sep,
            ("pastepgn", _("Paste PGN"), Iconos.Pegar16()),
            sep,
            ("engine", mt, Iconos.Motores()),
            sep,
            ("voyager", _("Voyager 2"), Iconos.Voyager()),
        ]
        resp = self.configurar(liMasOpciones,
                               siCambioTutor=True,
                               siSonidos=True)

        if resp == "rotacion":
            self.auto_rotate = not self.auto_rotate
            is_white = self.game.last_position.is_white
            if self.auto_rotate:
                if is_white != self.board.is_white_bottom:
                    self.board.rotaBoard()
        elif resp == "opening":
            me = self.unMomento()
            w = WindowOpenings.WOpenings(self.main_window, self.configuration,
                                         self.opening_block)
            me.final()
            if w.exec_():
                self.opening_block = w.resultado()
                self.xfichero = None
                self.xpgn = None
                self.xjugadaInicial = None
                self.reiniciar()

        elif resp == "position":
            self.startPosition()

        elif resp == "pasteposicion":
            texto = QTUtil.traePortapapeles()
            if texto:
                cp = Position.Position()
                try:
                    cp.read_fen(str(texto))
                    self.xfichero = None
                    self.xpgn = None
                    self.xjugadaInicial = None
                    self.new_game()
                    self.game.set_position(first_position=cp)
                    self.opening_block = None
                    self.reiniciar()
                except:
                    pass

        elif resp == "leerpgn":
            self.leerpgn()

        elif resp == "pastepgn":
            texto = QTUtil.traePortapapeles()
            if texto:
                ok, game = Game.pgn_game(texto)
                if not ok:
                    QTUtil2.message_error(
                        self.main_window,
                        _("The text from the clipboard does not contain a chess game in PGN format"
                          ))
                    return
                self.xfichero = None
                self.xpgn = None
                self.xjugadaInicial = None
                self.opening_block = None
                dic = self.creaDic()
                dic["GAME"] = game.save()
                dic["WHITEBOTTOM"] = game.first_position.is_white
                self.reiniciar(dic)

        elif resp == "engine":
            self.set_label1("")
            if self.play_against_engine:
                if self.xrival:
                    self.xrival.terminar()
                    self.xrival = None
                self.play_against_engine = False
            else:
                self.cambioRival()

        elif resp == "voyager":
            ptxt = Voyager.voyagerPartida(self.main_window, self.game)
            if ptxt:
                self.xfichero = None
                self.xpgn = None
                self.xjugadaInicial = None
                dic = self.creaDic()
                dic["GAME"] = ptxt
                dic["WHITEBOTTOM"] = self.board.is_white_bottom
                self.reiniciar(dic)