From da42fc4e0febc2c318b383e71158c0bc115b4333 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Thu, 3 Dec 2020 18:04:29 +0100 Subject: [PATCH] insert mode --- i18n.py | 12 ++- katrain/__main__.py | 6 ++ katrain/config.json | 8 -- katrain/core/ai.py | 2 +- katrain/core/game.py | 74 +++++++++++++++++- katrain/core/game_node.py | 14 ++-- katrain/gui.kv | 5 ++ katrain/gui/badukpan.py | 17 ++-- katrain/gui/controlspanel.py | 4 +- katrain/gui/kivyutils.py | 3 +- katrain/gui/style.py | 2 +- katrain/gui/widgets/__init__.py | 4 +- katrain/gui/widgets/movetree.py | 26 ++++-- .../i18n/locales/cn/LC_MESSAGES/katrain.mo | Bin 14177 -> 13771 bytes .../i18n/locales/cn/LC_MESSAGES/katrain.po | 31 ++++---- .../i18n/locales/de/LC_MESSAGES/katrain.mo | Bin 15941 -> 15935 bytes .../i18n/locales/de/LC_MESSAGES/katrain.po | 26 +++--- .../i18n/locales/en/LC_MESSAGES/katrain.mo | Bin 15601 -> 15195 bytes .../i18n/locales/en/LC_MESSAGES/katrain.po | 30 +++---- .../i18n/locales/es/LC_MESSAGES/katrain.mo | Bin 15735 -> 15329 bytes .../i18n/locales/es/LC_MESSAGES/katrain.po | 31 ++++---- .../i18n/locales/fr/LC_MESSAGES/katrain.mo | Bin 17454 -> 17041 bytes .../i18n/locales/fr/LC_MESSAGES/katrain.po | 31 ++++---- .../i18n/locales/jp/LC_MESSAGES/katrain.mo | Bin 18003 -> 17450 bytes .../i18n/locales/jp/LC_MESSAGES/katrain.po | 26 +++--- .../i18n/locales/ko/LC_MESSAGES/katrain.mo | Bin 17418 -> 17012 bytes .../i18n/locales/ko/LC_MESSAGES/katrain.po | 31 ++++---- .../i18n/locales/ru/LC_MESSAGES/katrain.mo | Bin 22692 -> 21781 bytes .../i18n/locales/ru/LC_MESSAGES/katrain.po | 30 ++++--- requirements.txt | 1 - setup.py | 3 +- tests/test_ai.py | 9 ++- tests/test_board.py | 2 +- 33 files changed, 256 insertions(+), 172 deletions(-) diff --git a/i18n.py b/i18n.py index 37f1dc0..def6029 100644 --- a/i18n.py +++ b/i18n.py @@ -1,7 +1,8 @@ +import copy +import glob import os import re import sys -import copy from collections import defaultdict import polib @@ -100,4 +101,13 @@ for lang in locales: print("Fixed", pofile[lang], "and converted ->", mofile) +for file in glob.glob("katrain/**/*.py") + glob.glob("katrain/**/*.kv"): + with open(file, "r") as f: + for i, line in enumerate(f.readlines()): + matches = [m.strip() for m in re.findall(r"i18n._\((.*?)\)", line)] + for msgid in matches: + if msgid[0] in ['"', "'"] and msgid.strip("\"'") not in strings_to_langs: # not code + print(f"Missing {msgid} used in code at \t{file}:{i} \t'{line.strip()}'") + errors += 1 + sys.exit(int(errors)) diff --git a/katrain/__main__.py b/katrain/__main__.py index 44b0bde..756909b 100644 --- a/katrain/__main__.py +++ b/katrain/__main__.py @@ -273,6 +273,11 @@ class KaTrainGui(Screen, KaTrainBase): # self.controls.rank_graph.initialize_from_game(self.game.root) self.update_state(redraw_board=True) + def _do_insert_mode(self, mode="toggle"): + self.game.set_insert_mode(mode) + if self.play_analyze_mode != MODE_ANALYZE: + self.play_mode.switch_ui_mode() + def _do_ai_move(self, node=None): if node is None or self.game.current_node == node: mode = self.next_player_info.strategy @@ -485,6 +490,7 @@ class KaTrainGui(Screen, KaTrainBase): "d": ("analyze-extra", "sweep"), "f": ("analyze-extra", "alternative"), "g": ("analyze-extra", "local"), + "i": ("insert-mode",), "p": ("play", None), "n": ("next-mistake",), "down": ("switch-branch", 1), diff --git a/katrain/config.json b/katrain/config.json index 0ba024b..22ad83d 100644 --- a/katrain/config.json +++ b/katrain/config.json @@ -98,14 +98,6 @@ "attach_penalty": 1, "tenuki_penalty": 0.5 }, - "ai:settle": { - "max_points_lost": 1.75, - "settled_weight": 1.0, - "opponent_fac": 0.5, - "min_visits": 3, - "attach_penalty": 1, - "tenuki_penalty": 0.5 - }, "ai:p:weighted": { "weaken_fac": 1.25, "pick_override": 1.0, diff --git a/katrain/core/ai.py b/katrain/core/ai.py index b15a1d6..8c7da85 100644 --- a/katrain/core/ai.py +++ b/katrain/core/ai.py @@ -18,6 +18,7 @@ from katrain.core.constants import ( AI_RANK, AI_SCORELOSS, AI_SCORELOSS_ELO, + AI_SETTLE_STONES, AI_SIMPLE_OWNERSHIP, AI_STRATEGIES_PICK, AI_STRATEGIES_POLICY, @@ -32,7 +33,6 @@ from katrain.core.constants import ( OUTPUT_DEBUG, OUTPUT_ERROR, OUTPUT_INFO, - AI_SETTLE_STONES, ) from katrain.core.game import Game, GameNode, Move from katrain.core.utils import var_to_grid diff --git a/katrain/core/game.py b/katrain/core/game.py index 2d5c8f4..65519db 100644 --- a/katrain/core/game.py +++ b/katrain/core/game.py @@ -1,3 +1,4 @@ +import copy import math import os import re @@ -8,17 +9,18 @@ from typing import Dict, List, Optional, Union from kivy.clock import Clock from katrain.core.constants import ( + ANALYSIS_FORMAT_VERSION, HOMEPAGE, OUTPUT_DEBUG, OUTPUT_INFO, PLAYER_AI, + PLAYER_HUMAN, + PROGRAM_NAME, STATUS_ANALYSIS, + STATUS_ERROR, STATUS_INFO, STATUS_TEACHING, - PLAYER_HUMAN, VERSION, - PROGRAM_NAME, - ANALYSIS_FORMAT_VERSION, ) from katrain.core.engine import KataGoEngine from katrain.core.game_node import GameNode @@ -57,6 +59,9 @@ class Game: self.game_id = datetime.strftime(datetime.now(), "%Y-%m-%d %H %M %S") self.sgf_filename = sgf_filename + self.insert_mode = False + self.insert_after = None + if move_tree: self.root = move_tree self.komi = self.root.komi @@ -165,6 +170,55 @@ class Game: if -1 not in neighbours(self.chains[this_chain]): # TODO: NZ rules? raise IllegalMoveException("Suicide") + def set_insert_mode(self, mode): + if mode == "toggle": + mode = not self.insert_mode + if mode == self.insert_mode: + return + self.insert_mode = mode + if mode: + children = self.current_node.ordered_children + if not children: + self.insert_mode = False + else: + self.insert_after = self.current_node.ordered_children[0] + self.katrain.controls.set_status(i18n._("starting insert mode"), STATUS_INFO) + else: + copy_from_node = self.insert_after + copy_to_node = self.current_node + num_copied = 0 + if copy_to_node != self.insert_after.parent: + above_insertion_root = self.insert_after.parent.nodes_from_root + already_inserted_moves = [ + n.move for n in copy_to_node.nodes_from_root if n not in above_insertion_root and n.move + ] + print(already_inserted_moves) + try: + while True: + if copy_from_node.move not in already_inserted_moves: + for m in copy_from_node.move_with_placements: + self._validate_move_and_update_chains(m, True) + # this inserts + copy_to_node = GameNode( + parent=copy_to_node, properties=copy.deepcopy(copy_from_node.properties) + ) + num_copied += 1 + if not copy_from_node.children: + break + copy_from_node = copy_from_node.ordered_children[0] + except: + pass # illegal move = stop + self._calculate_groups() # recalculate groups + self.katrain.controls.set_status( + i18n._("ending insert mode").format(num_copied=num_copied), STATUS_INFO + ) + self.analyze_all_nodes(analyze_fast=True, even_if_present=False) + else: + self.katrain.controls.set_status("", STATUS_INFO) + self.katrain.controls.move_tree.insert_node = self.insert_after if self.insert_mode else None + self.katrain.controls.move_tree.redraw() + self.katrain.update_state(redraw_board=True) + # Play a Move from the current position, raise IllegalMoveException if invalid. def play(self, move: Move, ignore_ko: bool = False, analyze=True): board_size_x, board_size_y = self.board_size @@ -183,17 +237,31 @@ class Game: return played_node def set_current_node(self, node): + if self.insert_mode: + self.katrain.controls.set_status(i18n._("finish inserting before navigating"), STATUS_ERROR) + return + self.current_node = node self._calculate_groups() def undo(self, n_times=1): + # allow undo/delete only in insert mode cn = self.current_node # avoid race conditions + if self.insert_mode: + if n_times == 1 and cn not in self.insert_after.nodes_from_root: + cn.parent.children = [c for c in cn.parent.children if c != cn] + self.current_node = cn.parent + self._calculate_groups() + return + for _ in range(n_times): if not cn.is_root: cn = cn.parent self.set_current_node(cn) def redo(self, n_times=1, stop_on_mistake=None): + if self.insert_mode: + return cn = self.current_node # avoid race conditions for move in range(n_times): if cn.children: diff --git a/katrain/core/game_node.py b/katrain/core/game_node.py index 341f7bb..dfee82b 100644 --- a/katrain/core/game_node.py +++ b/katrain/core/game_node.py @@ -1,21 +1,21 @@ +import base64 import copy +import gzip +import json import random from typing import Dict, List, Optional, Tuple from katrain.core.constants import ( - VERSION, + ANALYSIS_FORMAT_VERSION, + PROGRAM_NAME, SGF_INTERNAL_COMMENTS_MARKER, SGF_SEPARATOR_MARKER, - PROGRAM_NAME, - ANALYSIS_FORMAT_VERSION, + VERSION, ) from katrain.core.lang import i18n from katrain.core.sgf_parser import Move, SGFNode -from katrain.core.utils import evaluation_class, var_to_grid, pack_floats, unpack_floats +from katrain.core.utils import evaluation_class, pack_floats, unpack_floats, var_to_grid from katrain.gui.style import INFO_PV_COLOR -import base64 -import gzip -import json def analysis_dumps(analysis): diff --git a/katrain/gui.kv b/katrain/gui.kv index bdf1e73..209d633 100644 --- a/katrain/gui.kv +++ b/katrain/gui.kv @@ -755,6 +755,11 @@ icon: 'img/local.png' shortcut: 'g' on_action: root.katrain("analyze-extra", "local") + AnalysisMenuItem: + text: i18n._("analysis:insert") + icon: 'img/local.png' + shortcut: 'i' + on_action: root.katrain("insert-mode") AnalysisMenuItem: text: i18n._("analysis:game") icon: 'img/analysis.png' diff --git a/katrain/gui/badukpan.py b/katrain/gui/badukpan.py index 26a08a1..40b06e4 100644 --- a/katrain/gui/badukpan.py +++ b/katrain/gui/badukpan.py @@ -20,19 +20,19 @@ from kivymd.uix.floatlayout import MDFloatLayout from katrain.core.constants import ( MODE_PLAY, OUTPUT_DEBUG, - STATUS_TEACHING, OUTPUT_EXTRA_DEBUG, - TOP_MOVE_OPTIONS, - TOP_MOVE_NOTHING, + STATUS_TEACHING, TOP_MOVE_DELTA_SCORE, - TOP_MOVE_SCORE, - TOP_MOVE_WINRATE, TOP_MOVE_DELTA_WINRATE, + TOP_MOVE_NOTHING, + TOP_MOVE_OPTIONS, + TOP_MOVE_SCORE, TOP_MOVE_VISITS, + TOP_MOVE_WINRATE, ) from katrain.core.game import Move from katrain.core.lang import i18n -from katrain.core.utils import evaluation_class, var_to_grid, format_visits +from katrain.core.utils import evaluation_class, format_visits, var_to_grid from katrain.gui.kivyutils import BackgroundMixin, draw_circle, draw_text from katrain.gui.popups import I18NPopup, ReAnalyzeGamePopup from katrain.gui.style import * @@ -226,7 +226,10 @@ class BadukPanWidget(Widget): for i in range(board_size_y) ] - Color(1, 0.95, 0.8, 1) # image is a bit too light + if katrain.game.insert_mode: + Color(1, 1, 1, 0.75) # dreamy + else: + Color(1, 0.95, 0.8, 1) # image is a bit too light Rectangle( pos=(self.gridpos_x[0] - self.grid_size * 1.5, self.gridpos_y[0] - self.grid_size * 1.5), size=(self.grid_size * x_grid_spaces, self.grid_size * y_grid_spaces), diff --git a/katrain/gui/controlspanel.py b/katrain/gui/controlspanel.py index 9d5d45a..652a84d 100644 --- a/katrain/gui/controlspanel.py +++ b/katrain/gui/controlspanel.py @@ -2,11 +2,11 @@ import time from kivy.clock import Clock from kivy.core.audio import SoundLoader -from kivy.properties import ObjectProperty, OptionProperty, NumericProperty +from kivy.properties import NumericProperty, ObjectProperty, OptionProperty from kivy.uix.boxlayout import BoxLayout from kivymd.uix.floatlayout import MDFloatLayout -from katrain.core.constants import MODE_PLAY, MODE_ANALYZE, STATUS_ERROR, STATUS_ANALYSIS, PLAYER_HUMAN +from katrain.core.constants import MODE_ANALYZE, MODE_PLAY, PLAYER_HUMAN, STATUS_ANALYSIS, STATUS_ERROR from katrain.core.lang import rank_label from katrain.gui.kivyutils import AnalysisToggle, CollapsablePanel diff --git a/katrain/gui/kivyutils.py b/katrain/gui/kivyutils.py index 35f641c..c024a74 100644 --- a/katrain/gui/kivyutils.py +++ b/katrain/gui/kivyutils.py @@ -1,7 +1,6 @@ from kivy.clock import Clock from kivy.core.text import Label as CoreLabel from kivy.core.text.markup import MarkupLabel as CoreMarkupLabel - from kivy.core.window import Window from kivy.graphics import * from kivy.properties import ( @@ -12,7 +11,7 @@ from kivy.properties import ( OptionProperty, StringProperty, ) -from kivy.uix.behaviors import ButtonBehavior, ToggleButtonBehavior, FocusBehavior +from kivy.uix.behaviors import ButtonBehavior, FocusBehavior, ToggleButtonBehavior from kivy.uix.boxlayout import BoxLayout from kivy.uix.button import Button from kivy.uix.label import Label diff --git a/katrain/gui/style.py b/katrain/gui/style.py index 7c300df..092d054 100644 --- a/katrain/gui/style.py +++ b/katrain/gui/style.py @@ -16,7 +16,7 @@ GREEN = [0.1, 0.8, 0.1, 1] YELLOW = [0.8, 0.8, 0.1, 1] DARKRED = [0.3, 0.1, 0.1, 1] ORANGE = [242 / 255, 96 / 255, 34 / 255, 1] - +LIGHT_ORANGE = [1, 0.5, 0.25, 1] # gui colors BACKGROUND_COLOR = [36 / 255, 48 / 255, 62 / 255, 1] BOX_BACKGROUND_COLOR = [46 / 255, 65 / 255, 88 / 255, 1] diff --git a/katrain/gui/widgets/__init__.py b/katrain/gui/widgets/__init__.py index f5ccb45..e5bec48 100644 --- a/katrain/gui/widgets/__init__.py +++ b/katrain/gui/widgets/__init__.py @@ -1,6 +1,6 @@ -from katrain.gui.widgets.graph import ScoreGraph, RankGraph -from katrain.gui.widgets.movetree import MoveTree from katrain.gui.widgets.filebrowser import I18NFileBrowser +from katrain.gui.widgets.graph import RankGraph, ScoreGraph +from katrain.gui.widgets.movetree import MoveTree from katrain.gui.widgets.selection_slider import SelectionSlider __all__ = ["ScoreGraph", "RankGraph", "MoveTree", "I18NFileBrowser", "SelectionSlider"] diff --git a/katrain/gui/widgets/movetree.py b/katrain/gui/widgets/movetree.py index e9f1d73..7d90e6b 100644 --- a/katrain/gui/widgets/movetree.py +++ b/katrain/gui/widgets/movetree.py @@ -12,8 +12,12 @@ from kivymd.app import MDApp from katrain.gui.kivyutils import BackgroundMixin, draw_circle, draw_text from katrain.gui.style import ( BACKGROUND_COLOR, + DARKRED, + GREEN, + LIGHT_ORANGE, LIGHTER_BACKGROUND_COLOR, LIGHTGREY, + ORANGE, OUTLINE_COLORS, RED, STONE_COLORS, @@ -106,10 +110,9 @@ class MoveTreeCanvas(Widget): return self.set_game_node(same_x_moves[new_index][1]) - def draw_move_tree(self, current_node): + def draw_move_tree(self, current_node, insert_node): if not self.scroll_view_widget or not current_node: return - spacing = 5 moves_vert = 3 self.move_size = (self.scroll_view_widget.height - (moves_vert + 1) * spacing) / moves_vert @@ -148,6 +151,15 @@ class MoveTreeCanvas(Widget): self.move_xy_pos = {n: xy_pos(x, y) for n, (x, y) in self.move_pos.items()} + special_nodes = {self.menu_selected_node: RED, current_node: YELLOW} + + if insert_node: + special_nodes[insert_node.parent] = GREEN + insert_path = current_node + while insert_path != insert_node.parent and insert_path.parent: + special_nodes[insert_path] = ORANGE if insert_path == current_node else LIGHT_ORANGE + insert_path = insert_path.parent + with self.canvas: self.canvas.clear() Color(*LIGHTGREY) @@ -157,8 +169,8 @@ class MoveTreeCanvas(Widget): Line(points=[x, y, x, cy, cx, cy], width=1) for node, pos in self.move_xy_pos.items(): - if node == self.menu_selected_node or node == current_node: - Color(*(RED if node == self.menu_selected_node else YELLOW)) + if node in special_nodes: + Color(*special_nodes[node]) Rectangle( pos=[c - self.move_size / 2 - spacing / 2 for c in self.move_xy_pos[node]], size=(self.move_size + spacing, self.move_size + spacing), @@ -177,11 +189,15 @@ class MoveTree(ScrollView, BackgroundMixin): def __init__(self, **kwargs): super().__init__(**kwargs) + self.insert_node = None self.redraw_tree_trigger = Clock.create_trigger( - lambda _dt: self.move_tree_canvas.draw_move_tree(self.current_node) + lambda _dt: self.move_tree_canvas.draw_move_tree(self.current_node, self.insert_node) ) self.bind(current_node=self.redraw_tree_trigger, size=self.redraw_tree_trigger) + def redraw(self): + self.redraw_tree_trigger() + def switch_branch(self, direction): self.move_tree_canvas.switch_branch(direction) diff --git a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.mo index 0e03668e4dc4751d10c128ba4bfc98dfdd6c354f..0b8839b5a9bd8971e759e5ec95977f9af1651eb6 100644 GIT binary patch delta 3774 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 AlK=n! diff --git a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po index 4a0dba9..fe94413 100644 --- a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po @@ -671,23 +671,6 @@ msgstr "" msgid "Make Main Branch" msgstr "设为实战变化" -#. TODO - DEPRECATED -msgid "aihelp:settle" -msgstr "" -"Plays moves that lead to clarity on stones' status, favouring solid moves " -"rather than complex sabaki. Of moves that lose at most 'max_points_lost' " -"points and with at least 'min_visits', prefer moves that lose fewer points, " -"settle own stones more (with importance settled_weight), settle opponent's " -"stones more (importance settled_weight * opponent_fac), avoid tenuki (more " -"than 5 spaces, importance tenuki_penalty), and avoid attachments (importance" -" attachment_penalty). Weights can be negative to make it complicate the game" -" instead, and wide root noise (in general settings) can be used to further " -"play according to the style at the cost of strength. " - -#. TODO - DEPRECATED -msgid "ai:settle" -msgstr "Settle Style" - #. TODO - setting: what to show on top move (e.g. point loss, visits, ...) msgid "stats on top move" msgstr "Stats on top moves" @@ -742,3 +725,17 @@ msgstr "Save SGF File" # sgf save as button msgid "Save File" msgstr "Save File" + +#. TODO - status message on starting insert mode +msgid "starting insert mode" +msgstr "Starting insert mode, press 'i' to finish inserting." + +#. TODO - status message on ending insert mode and copying the moves +msgid "ending insert mode" +msgstr "Inserting exchange(s) done, copied {num_copied} following moves." + +#. TODO - when a user tries to go to a different move/node while in insert +#. mode +msgid "finish inserting before navigating" +msgstr "" +"Navigation is disabled in insert mode, finish insert mode by pressing 'i'. " diff --git a/katrain/i18n/locales/de/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/de/LC_MESSAGES/katrain.mo index 00a1586e9fbdbba7021279a357b141630eac6363..eb73abcf2e22c327a10bae19bf736e742b4e35ca 100644 GIT binary patch delta 3774 zcmZYB3ry8z7{~Ef@J@2|26*`+f}$v?fQh<@blzx|)bKh7a=@c-j^p4J^^~R+W_Ybg zQ`1ayZO)EUo0^sPjO8pX@3WOQ^U~DjC9S?c&bv96Q$FweKkwyvp7;G9JUDybZ2yJm z`YR28e&k;p{_Sa~o-t#aJ+>9iar9f@RE)w!*cv~?Fx+AL-(WQTv)CSQ*nW7pF_H8W zuo3n|{`yT8KO=ZB1T|okbrLqEUx`|9A+naK!IroQpTaM(J|05_cpNqUGREP3Y>v&@ zqzR^=_UVP;>~99p(8RpD2gbNj8O}gWsIsm=EwlzhF@VZ^r~Q0CD&SiC{AX0AzalZ1 zYxeWMQR_A&iYDxDB57!$IMl#oRHhjkfX|~ceZlreqsA2>YZ)JE{(MyC)%NrCsCBkk z_o2quqQ;#^zcT&P4hW$`(?p^sCZIA(LuHWTA@2qblZ4rlA38s134_u_hn2K`H7ze-$;Z#<~Tyz;5dSjHO?TO5_UawY-b^ zN_mJ{Ka?N(JPrxiZ@L5+6VIVGypFmgcTp2VI9NT8KrI}L8lQx!OeQwKT-5jxs7pE? zwNWK1;3}l*W-V&|j#&HtALfD1`jq|Pvh^-1v&MXp>+^Wjf?ZJ?WuX=xgp+YBX5kU+ zfuTg94Kt9XOfIS-#W)cw;yM4VG|uy2I4`3%&=d8ka@N3Mz4 zie2z9R^ctw5zQgW6nq1}!fmKuR^@ydkfWJ~i*Xt1Qu>|5U@1GH?n1il_qPs3l`J2X zp$l~frd#Ku&axV{;5yXNY(gE?c07jr@jO;{sbZ%)uS$AeYL{HVvT-A)Xq zIkPioOTRzq9Hl>kbcfS#)0GQKzm#)WgrmFhgXfn~8(-gXC}2KyaQ3FV=KQ&2~+6tzwbCg6rl>aPF}@<8w98C1zHq87Z0(b#}+m0@et z!s*DpG%sN*tVCtL95w%AjKQs_quY-Awm%S65q~a?SQ;-|J*Y_EL{7sj zMcv{S!+E5c~_xbETzD zq1#gsc%|9>kmVyIj|F-}c|szK+@2E0?eV$FE1WWKkt?t|CcR#VVz1=#JI&?m9yr}|eaKL|tJmYWeNK_v zS5R2WL^s{Xfu}l81YMVmQ#jL^QttBkv|uN9r|wQ*X2zrjJ^mMVYH*mwI2GO}S7L7W Kz{RZM(Ek8P*uOUb delta 3522 zcmYM#4NR3)9LMp)o63vwc2O>%UO__)Bm_js7lxHd8cj02PHI_K$(PK@bQyLl$TG!B zRxP!$vNUCC`Y<<32hPkl=G;_jC7Pv`CYD<2%B=5?=WMy_{hV{2bN=U?|2fa4rRG3Q z@JvGZJBEKJ_@BoA=5DGPGqLCY_Mte5dJ+aO9$&y@tjB2FXzM#Mf%;MGk7sQC4#rWB z?`2GPOh-OJGlcJ08b+czOt4PJDC%=j0T&}N%nIy{?_msX!*KipwZK+X|8`8li|D~{ zCW%BZYMu=2#r&p#f(DN3YB0u++F=!Hz*1`+D$r^S!wsmNZ?exF)Pncg_Cu(ho>ew5#(?O_?`KXLC zw!PKXkHwRJEue!21^V4SP@~#o`J&0BqZU+vTEP9NfREVv6Q~T$L1kbG_P|re}ALM?P(0{Pb&ouWYlJ5ZPFqV1?&s`o}MAjdie6{s9_L;+O41=i)L2|qw>V5@C! zL1m^LnZle8+J>99A%eVWU@~gpVARfvQ41K4nrIrP;sRu-S&0hRh}!W^>ps-DiV78F2jWTACADg*0K zNBR-!&NXA#`@e^R&g?5xfK#Y|=hOkOpeDS9T396Kp+J35JIO*lAB7q}3DwV!iZk0< zjhg3W)W+Vzpa#BAK@)93U5;kdz!uxyh6>z{>i+{OBiAtkBRP2Wk40U|G}J^RP?;Ey zB-hM9jbCJ+*Llgm&bYxo*kEl&?d$;R`8TM5zn~_%i3%Lf5Byy8VllpodDx1Y@EX$9 zM6xPnBm=8354YpmRL;MgLK%Ph3e|uba2%DQOE>_pV>TxBbtfpreCpMxqxjU;KgV3^ zSCEhC*U!z=DAe7Wj1@Q)%dja(;TnY-_z+&~?;b^=&mA}xwUa5x@tb)#1nck(+>ScB zVpf@j_hBnOi~1v#o9-S-KGst&M_tAaR3?MxDQKrxZNp#I?ip^%Jg6O}qwYX~wFGsR z6Hx&xQ30Q}E<_#Ki+B|4u><`B>4Qasj5(zDe?5iMGz9MAD}+BPna1p=IBqa!OuakX zI!rx{ZI@I32|K9|=R8*8z#L=#!Ou|Rw+(d{vYm4vsb&vqq2Hl0co|8u3BN~|o%0_^ zfw@dB#^N;O-k2&>>T6LuS&Q1?X5>1UU8u~QKxO6vD$Z3@zZ7nw+A~oZ%16ET#i)5o zRcC%PnSw6ebo-zhOR3i(n=}V83jaU_{ui~dm|^x-quTS3(=%hR2R?}fI0yBbHli}} z3F`Iz5`%h;zNMfY{f2&w;cBZs3(1zLMGbI}V>E}6SKo9Zr)Rn`i{ATejKc?UJo=Hf znh&uAPoTzmc-4w9r;z-6CaExl_n>a~5!Aqws0DN)SvK**-J>c+)hkg8 zUyVL&LZ!S773U-lz%!_MO%eImdzr*?l;RZB*$=`5EJ5w80u^`xav#kq?1Q^dJ3fXQ ze-;z*66#3qppGJXgnJh}sEzqh*FS zdPmxnq5=m{mu@kJ;xb!*36+u8(2K!0ZDBKNrTdX%GHs{;A;oUM9;lUjQEyr%X5$pp zEq?`h^UP}0LieIF_&sWa*R5gqy7MF=84H>;3cR)^)0&04G))sV>V(IfsfkuKS#NlGNawg?7>v?6hEgFw895aD}D^a@EO!=Gar?S zMW~6Eq83(*dYxX!RNRERocmEn@-t4rza4+ih_Hx2b@jYJgFo)LTXKByOG2G3iFqN; z9Zy-9Q<*$9I;Ntlldq!s`FR1y$w-V2&Gt1M8Jg-`$jJ$B*jJe3R1I4d>XZ~#MK~SB HGsFG^7L8v= diff --git a/katrain/i18n/locales/de/LC_MESSAGES/katrain.po b/katrain/i18n/locales/de/LC_MESSAGES/katrain.po index 98fa667..a50b06b 100644 --- a/katrain/i18n/locales/de/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/de/LC_MESSAGES/katrain.po @@ -707,18 +707,6 @@ msgstr "" msgid "ai:simple" msgstr "Einfacher Stil" -#. TODO - DEPRECATED -msgid "aihelp:settle" -msgstr "" -"Spielt Züge, die dazu zu einer Vereinfachung des Brettzustandes führen. Von " -"Zügen,die höchstens 'max_points_lost' Punkte verlieren und mit wenigstens " -"'min_visits' Visits, bevorzuge die Züge, die weniger Punkte verlieren, " -"eigenes Gebiet mehr sichern" - -#. TODO - DEPRECATED -msgid "ai:settle" -msgstr "Settle Style" - msgid "analysis:local" msgstr "Finde lokale Antworten" @@ -789,3 +777,17 @@ msgstr "Save SGF File" # sgf save as button msgid "Save File" msgstr "Save File" + +#. TODO - status message on starting insert mode +msgid "starting insert mode" +msgstr "Starting insert mode, press 'i' to finish inserting." + +#. TODO - status message on ending insert mode and copying the moves +msgid "ending insert mode" +msgstr "Inserting exchange(s) done, copied {num_copied} following moves." + +#. TODO - when a user tries to go to a different move/node while in insert +#. mode +msgid "finish inserting before navigating" +msgstr "" +"Navigation is disabled in insert mode, finish insert mode by pressing 'i'. " diff --git a/katrain/i18n/locales/en/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/en/LC_MESSAGES/katrain.mo index a8528ea5ffe347ae37521356c19e64c7d571dce8..818091fa06f15f8f3756c10e4722567d949f78dc 100644 GIT binary patch delta 3775 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 diff --git a/katrain/i18n/locales/en/LC_MESSAGES/katrain.po b/katrain/i18n/locales/en/LC_MESSAGES/katrain.po index b244f04..6c3478c 100644 --- a/katrain/i18n/locales/en/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/en/LC_MESSAGES/katrain.po @@ -615,23 +615,6 @@ msgstr "" "root noise (in general settings) can be used to increase play according to " "the style at the cost of strength. " -#. DEPRECATED -msgid "ai:settle" -msgstr "Settle Style" - -#. DEPRECATED -msgid "aihelp:settle" -msgstr "" -"Plays moves that lead to clarity on stones' status, favouring solid moves " -"rather than complex sabaki. Of moves that lose at most 'max_points_lost' " -"points and with at least 'min_visits', prefer moves that lose fewer points, " -"settle own stones more (with importance settled_weight), settle opponent's " -"stones more (importance settled_weight * opponent_fac), avoid tenuki (more " -"than 5 spaces, importance tenuki_penalty), and avoid attachments (importance" -" attachment_penalty). Weights can be negative to make it complicate the game" -" instead, and wide root noise (in general settings) can be used to further " -"play according to the style at the cost of strength. " - msgid "ai:jigo" msgstr "KataJigo" @@ -810,3 +793,16 @@ msgstr "---" #. top move stats show threshold description msgid "show stats if" msgstr "Show stats if more than ... visits" + +#. status message on starting insert mode +msgid "starting insert mode" +msgstr "Starting insert mode, press 'i' to finish inserting." + +#. status message on ending insert mode and copying the moves +msgid "ending insert mode" +msgstr "Inserting exchange(s) done, copied {num_copied} following moves." + +#. when a user tries to go to a different move/node while in insert mode +msgid "finish inserting before navigating" +msgstr "" +"Navigation is disabled in insert mode, finish insert mode by pressing 'i'. " diff --git a/katrain/i18n/locales/es/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/es/LC_MESSAGES/katrain.mo index c4bd3c5210dfc59ca60d6c4967deab2645e70eaa..2ae865f782f69182726bd56ef2d424afd7097746 100644 GIT binary patch delta 3775 zcmZYA32;qU9LMqFJ%k{6u|$aF#*$bfArecf9i?`v!=RMWM4ou{yl3)aO?mBTDMrpZt1m*Z$Rz-gF(i!lk;VJ+Nd+xxLD?Q_^1@7Q)+oG~8S zDHwxU$WPeh@;jaz15g2@t?ytg?Gn_0^O3PkDJJ31AXM z=9Yc_1T}7TR#B7rjfV>j)EE_*ipn%c0oWUr=@8oo8rife%sbIHI+H*48elf%>7gWE?84&^j0CYF45q-h@hIhkbqw zRiR6$xW8=M6{fDb;X!q5iR#!Hm0=&$LWZFxoPfzV8yUlVit4`wmH8g)57>hCIaL3D zQ5naRg({kis#rLc3k77NCg_R8no+0;{HXW*Jycw&bqi{MUDkuxh;|t&k!z^e@&W3T z@)R|`n_qg~7+G-Gw2NMt?x>0TV`Yg^frY3HXW09TtSe9%tw&XA3u=Me?ein{{wY-H zFWB~N)Oe54qxZiKpEq@EhFWnZszWv^!(PbZ%^=jm@=)=UZTnr+0_LL@v>cVl2J2Q- z1&*S&_9W^M{(+V6{|zp*clS{PxT&`Wj7Lq_1T|qQYGGYb6ZAn1I0luG9~Boyjq?dA zel1p3$hsXh-$4v3!_!=-V+Cr$+o(hG0M*gO#_E1NYT!nw_|~Y(biryk7!^MZbx6mf zCMrQKco9-{vjNqATO<4aALfSk`mB9$)%pOHSq(nqdY+6Lusv#`T-3n*(2rxWEgr>I z__uwY#A@`%tph57ftZIQliB}bE_QHZyaI^ofJ;yV>_S!OqHX_)8MNb?8q*D5#;!OW zmC@Ju67Iw9_yp-}JQ4?K5o#w~3?P?kA-vHG=4fkL+KEiuA2yao|3tD@()^z4ZQmQdks_@ZCi*{(x zhK~g8(|D2Rci31z?Gx>cIYhfhx-lEk&3@(J=ct8MAVo7bPz#P_zjWx5kr&Klp%NO1 zX{z05E_90DM`gYWb*MI@GTdwZ30a%DY@gT8j6P36k~i6?FXkwW!^x<9+PhLN)bUHyLiVA9XHa|e52}>UP;s#xqc+2M+F7U!d!Z&8jjG55)I_Don`}0q z65N43@fe2np4aLWElncMqn&{%_#HB*DMy{+s#*MD!W86Sn-QprgisT#!MeB=`{QAJ z1wC}qTQL;1;KitM*L0@-D%Ejr=urHIY_mztj%NM_YJsCrdz+7npNhP(CX5^dvj(;2 zM^FpBj!K{!Wzg27p$_*zRE35k$Igt)q5eAk^SGhCT51DVph~(9D>Fi6eAs#g_1e0- zL=RaHjG;XQwcrt`t$Q1_b%nNFjGC_mwU7m2E|l3aRB1L~B7TD!@DMh@AJM_f$S1;7 z(G*Y^;Y~bs!egj~m7&HDmvf=O3RH#n4F`k z(#E3(Y>sZsLQU8ORgoU3h4i)#M#Yan^`B&&i5}V?VLvQI^QzzP>xqA+%99co$nG+`E1q!`wLT#ObV8EO1ObAZ( zc?+D9z_cmjqt|nsi9x?VI79JMg44aBj7Uo7ldeIp+i8OV#}{%6e4)I2KRtakpRYXK yd12L+**N*LoT)|LP)H-D`O-3+$laW()jIue-RaRV#W=;m7e}IRM&xep0@r`4AiQw^ delta 4151 zcmZ|Se{7Z29mnxg+QMijlokqD#6wZqLd(xGKz=M?Qzn~e+!lU>**x4nx4riEKHYtu zwiGdU1c!mioDy*88WI#uWE+;tHklf9?gs|O2(vho2`ljr6*q@VhFeUx_vb!`;XgCb z*K^Kueto~^oToU{dv#0hLS@Nb!+(F|?-c$X8>x~pU%TPD6M4Lg@&xp896o@Pa5t9Y zv#xv;D=DACoAH7x4`T)8abt`bg|*0^oSDhbu~aNUHMrBc0m~?Npa$$g#xOgv8lS+= z<4>^!UqUVLRaE=)cq6`#*y4N$HPH95 z7@tN({+xTCM=kgjSAP-}>6^$J%%9!+%cybxDVe{p91T>)ved8|73r<0h6_-UE_dbC z&TpXF--nE4I#J_1h|0iD_x?wy@eVtWquT!tb87e&4~qB$*Wgp+k13;49c!Eos0bIK zGO-dh&{|Xm+pr2BMD=?N`C|_7Lkk^n^{=|}nQ`P_3wVbL4fJ>SLY1l?%MYqdEowo{ zs0G}P8t@)hZb4<}epCi}@pHHx)$S40_)no0dKk6P*DA@s_Gpj_b$kbPxZZaS)k@`R z)B>8ED^LU7joKm~)h=-EKuy?>3g9QM{sbyB=aDJQyE#{J)m4;|S9P3(>R6A8>^9T_ zR-q+$XL<5#eayN~Fp(pax!ny65+z z2I_EbMGdgqxeq5(K7b0~IOGJL5)A?-hYTJG-p1IA51xKHSvw8l+Hm7v;-B| zovwbPGl`0*3zea*s0HqH@1Jz_&!AF1;L0aZ;0@k4x6z;459`cQUm-O zYQj%Y3meUTXrPIxNE%S@m!bOKg=)7RHBOr|Ld~-c71$3jr;hu1&_vIp4#zQ6#}lsp zG-}}UsP>mo8Tkj6;%GKr?Z=`H%e_u^^iF;rx~ zLB0PIYQXnU6J13OT*3!Fjgzqfci=7f0_y!B>X+IFr~pQ>IuENb!tNUOzeNqGXu{RB z)&QGPDe8CSXK^;=Q@9xajf-%>O>smWxRml%T!JqmP0Yur$j45N&(;jQgYqoYIN2Nz zZ}M;$)$uzw$6N7BRH}ZB8eq`*ABf8&e@>b&Duxlal1?fvVNnsE;2Cj;i*#2t**Wg3DP`*`f?sYW$<;>cjX*vtKM=BVX5};G7sbM3aVrA{CFV~ z(Nb<~qcX7zHSkfa#8dbcynrjPj#cP(BvA`Jh#L3kLiS%N zxmpj7Ocj0R3tf6q>npaK;7FjSb?J`jKWE%Oj=X`vrt<#-<7|J zn(z+PLheNcwlT+pQgT0P;w`8FAHxZ_A1xk1J`v_Ds{KdE`85B*DxAy5V>W&nm7x%| z=Z_+n!|X*Z?1!lF51`uRp5s9gzU~?fp;GsrE0^CEr@j)k;%Uf@G;>fBu5<4nMv`Lo zq57XeW$=o7U%~-UhO1Bun1W;^XKvx4h>E$+`AATv8MQT?sE%1wL=U*~Hq->WPy_a( zQhW%N$pP%glc=poE{g*QQJLLVD7W%I5f-#jCY>rP zFSM~=kNVPne#Z3uWw}J!%ci0}8)R%41sOlALoezM8*S3-3A(eXOq&gZbgI>M20eag zvtHEhXKmE(Wo#no>`MEaZRlMG>2qRn9>1}T53R0OUY~e*z zXA6Z~XuV9U?M+4PYMS=FLfcfPr6(1pqOh*fc4hq}6UMV&A2{jvQX7xhXu~+Lp!ZrB zw9opszA$jAvn$9(UMAtYcC9VFeyXiKYG};;uV+^m(PyH%(B;7m@PGT-nKp2JT9RI( zq0y2qvK0B5?v9kLFU()a(n1?{c?qA4erB+^Sxc_V&v@ymPu&qL5f|gPi1VIpYgL^x{x3aLD+C@itf-S%)lnQvxTG3mG=6qmq-NJ zRvi}JXqHfCOna(ALPsD-QknHLZBhGdYwn>}X!AdAnp&JMpZA9m`5Dc{rTP1oY#;Go DjzLcA diff --git a/katrain/i18n/locales/es/LC_MESSAGES/katrain.po b/katrain/i18n/locales/es/LC_MESSAGES/katrain.po index 6424d3d..454cd9e 100644 --- a/katrain/i18n/locales/es/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/es/LC_MESSAGES/katrain.po @@ -713,23 +713,6 @@ msgstr "Plays moves that lead to simplifying the board state." msgid "ai:simple" msgstr "Simple Style" -#. TODO - DEPRECATED -msgid "aihelp:settle" -msgstr "" -"Plays moves that lead to clarity on stones' status, favouring solid moves " -"rather than complex sabaki. Of moves that lose at most 'max_points_lost' " -"points and with at least 'min_visits', prefer moves that lose fewer points, " -"settle own stones more (with importance settled_weight), settle opponent's " -"stones more (importance settled_weight * opponent_fac), avoid tenuki (more " -"than 5 spaces, importance tenuki_penalty), and avoid attachments (importance" -" attachment_penalty). Weights can be negative to make it complicate the game" -" instead, and wide root noise (in general settings) can be used to further " -"play according to the style at the cost of strength. " - -#. TODO - DEPRECATED -msgid "ai:settle" -msgstr "Settle Style" - #. TODO - Analyze again but allow only nearby moves msgid "analysis:local" msgstr "Find local responses" @@ -802,3 +785,17 @@ msgstr "Save SGF File" # sgf save as button msgid "Save File" msgstr "Save File" + +#. TODO - status message on starting insert mode +msgid "starting insert mode" +msgstr "Starting insert mode, press 'i' to finish inserting." + +#. TODO - status message on ending insert mode and copying the moves +msgid "ending insert mode" +msgstr "Inserting exchange(s) done, copied {num_copied} following moves." + +#. TODO - when a user tries to go to a different move/node while in insert +#. mode +msgid "finish inserting before navigating" +msgstr "" +"Navigation is disabled in insert mode, finish insert mode by pressing 'i'. " diff --git a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.mo index e51cd5cfc49c9bb96b07b255ea16b2e48b37a6bc..7814ed01708746e79d795dbd07c0e540091672ae 100644 GIT binary patch delta 3781 zcmZYB3y_Uv9LMoz&+dlSWwF?c%e$6kS(aRP*JTk)L@^?fcK00Xu+A}iENbaUQK_b~ zWK1q&bz`J*8Z^2M3TdaUsEo>WkO?(0YccBk+xM9Q3sJ8x ziwghVEM~Rg-x2<|=KrVnsAkO6Mt5vQaT@g&ScXmUB}~Ni7>7G;eJ?hnejMB3Wm|9D z*qC_gsaOy1Lw>?0hu=+T7=`NasC5?JOT8R5;c{dyvld(8yVwvv#~3_}3a}d0{~RV` zEhbvsMq>oE^Ii7&K2*R}w*42> zPR}ASm_P0Fo2Ys3A&Lg9Z{jIvqGVLZbkt7!r~?i|?esxgpMvV=MdmUg)c9vnJAc(a zuSCuBk@X8y|0-0!-!QD5{$)FOs8BTVsDY`d9c7_*o`afT94ceeu{oBZ`oD<$m^J)T zfLm<)Zd?BvweV5YJQtdhe|5ZWAJpS1MU#vQBoh_DKvchxwmu1!kwVnYgIFKSQT?7n zEl`09bTcZ@Pf$lvg&KFX8Tr>`I%PXvN7WnCTLE;m_C-yUk2;cRsD8!Pr;(v%HEQAa zP#f88pMQhO&?!{EE4JX3z6AP?zlCZQH6LA~coQ2o|gx1uK4W8IHQ)T>Y% zIgffRYfv94w@~v(^GnZ@k$}Udi(4?+sD(#jU5Zg1i%~mVVB1$%SD|*a0hOt(r~r4_ z=Lc>352)0iu=Pu*`EFpm-v35?ylG%tRK!`R0liT>9Et>QMxz2NK=q$(>x)nUEJp=Y zf!fGM>&K`J96}v!HR=+c#=7_aA_bk@Rn!F0##0E)?KLe_G4H({E>nN{)$@g66%uFpayz4ShY7nO`L@4-w~CWz8H&R zQ2ocFF6ngCLglD{S0Gt88&TtTCfWD@01Z0ppX`Hk)*95#>hnRa=P9TOyP_7#K~0>G zvvDeR#)CKz|3+QnETT!rVW|0LVIeL~;r!pGaFT{1T+UZuf4qoknAXO<)%mD;0Xn!0 zv+*5#2v4E{?Aey@5gdY^z(ti%JTFRNKZuS^8+8C;6Gl;M~TZYtwYcOemV zJ5y0-nqkdC-HAS^fqAIAkdNv=0X6V0V;FOLa4a4^n0mS!x!KG8!=rw0 zH|3p?B%47x0GOz)asconXMNk>qW83#*3)VM>DJY^-YQSrlig6sU&a@jUkbbCJKLVBd38;yu zBS|vFsD2eV5i3y(UPomhs-Jsz9L%Ghi(y5&h(b$TfqvYCy1j9{3Yxe-Dj+Xv;pM1I ztwfI1d|*9dpVuO%YGQdsD4I+hgg#V&Z=vRoWRrhQe3FLI=*e;4+p(zBy^P901;*fd z+g^zZcnfk}%$LaZFc*>gWfF7Uzz3m@W)>h}ujNH(G7-GaI!AEGk74|SKm$5wbMOhGBFwGUzk zx;txuI_peSAlay$jzmt!l%giwiX5-mjSAojDz(w%I{|y30vV3l`50TDWDP$~L8wMON+JB&sR%t7@VZ0ir8b~w)Z2?6n4#{aibG{A0X4q0wW~D;704*$bj$=a zLrO}VLVutjGO0Z+WwA1HSGfsn6so--%t^+nb-?;X{ChCkpB&9v?6 zQRtfyEcH2og8Ba9f_bz=zDpP#-LzE2yN0(+OllYz)}eEwNNul8v3aBFW>zQP!lIc4 zfns0hP=@0T27H-LQE;x`=XJ^hWpk#x<;Bj7U`a`Ef%?x0&i947N7iOP?-@PTE*lIu z{*dGKhYAWy80n{aC-O|^uBhvF;}kyW%q{hWLYlFYzf*UoqB^&ABzHic*q;B3J=5)~ Se$Kq$-Lo;id!%H@UeAAV6uhSZ delta 4179 zcmZwJ3yf989mnyxu+Z{mm&Y!kI6Um`B7#IMf;^P1F;E36wg^?%!`-vHhrN5x<({*w z2;@`*TIwUEMr?VMmh}}$iEv39A{A+)#b}L(jI|6R^nQ$!N+j` zKIhs8u!{DZcom*M;N zAnwBod>OUDS5f1S<7hmM!?A)z`r#zf;R(8PvvhcU}gCu~Jcc*waC73c}< zja{gdKkwd`P#gZ0>pzA%=^v0in3L}PKTvW1Em^<39R=#owlr`g>ZDhr240Uk>1@|t z;Jh0({(dBuX-CCbkIKLn_kJfT-d^V+)cD_GqJbxP(1|~G11=&zrazsUIL29zI^lFw zCg!06Ek$Lp1&85!)V!_8kJ-&HZFIluf7P|$t|b53zZU^z-$NDGX*W=#)EO_Y92)e+>JW%0q0TFymwFsd>@s;f1)y!TyO(297lnxkS+Ta%Ve!J^`29@&tu6+a*?=2jv&;MV_4-_A2#~HrvG@&o*gu{_N znk%vVaYQXN+qD;>HgFGWLq6&ttDKur8Q6ik(mkk}JBa1a|6v|KH=#0dJCa;;FKT||-ftX5{&mMsx))u}gQ%0e zhI;=;RKSl=3w??TT)`K78;-&{+=R1nAF6oI;8#$)QoLGRfiv-0+%<;#&+^c~pT3*$ zd7OZMMbEH> z@PQ1UGHjv!4erHexc@^ujN-+gYbgx;7Z>?;Y@NjJ@!&Ol^zbBk?TepX%Z4yB)tLKm z;B|Zn_2RpKnlT<;xIR7Ea?(UnO$+J@zKdkt>_U=b4&$)$=bs0z&74OSN#*o3^%GGw za4V|#zKyzym8dFz$i3f&n)eb;!QWsxW2lULj>_Bs3QQTULS<|;_ND&J1Rk`*NvPD_ z;@WrPINB>wcl;P?Bim4S_blov4xj?Rf+Wkljv99kzlj+tRtqjgW#9o+EhU&}hue7= zi7#M)M^IH?R<4Fbi-FK7!iVuTk-T ze>3@4;2t_=qn(we>VDLTeXPLH^~b15lW!*O#R=5OK1AJZ4{9R==B6hdjnt9(8Y1>m}29(8(5}P7olUK(orVw_^?MJ*b6WMn19T4Xnkps6R$Ex2CC` zgv!_gR0i5n8U7CHdu5aJQDkF@*~&wP7dxFlL7nWUsEH>~CphWaAEHux#(5qU_%l?^ zn0aaD`s0WUA7NC6rZ%K0Z$Mq$A{=a*C^8;&H!*6*8?iS&jS9R2wcyWC#q=YO50G*(XB$e(2UYa$eo&J0)>cuwadrdYDZ8ql>gLsV%^EN6^szopE zh$h=+Z*|yF4Du~D3Ufh|n_cwcR==nqd7BN}3pxKm8+j|dwqS}~)cik7gpqGqsy&S2 z#MZWZ4>lIUARkAKIeKbs+OS@}$#w>DtA?_xC}wDoZ(JQjK^)aiwuPeK%z~HiU4fhZ zPI}WAlWmlqJM8@87>qCawyqpFXfGsTG4}FV-wkYP?DT_{*0}!C%tC>b<>T7O<-rAD z?*E@^C)v==X>9hgL?T^eDfaUnZGo*TuV2p6jW#MIUe+h2mqkm*H5UB5my6eEI(bM# zcya7yTie-9Wa}=Qa;g8n)27&^<%2{v%YCfyZQgJ3;$XF}yKVQ{d>h2NrlgPyvR+Jg zt8ZJpcKY*CObw*#b_PwpErwxi^I<@8>w>&(@$-Js%at=m5k&Q0EYT79<HD3(j1 zKy6tsn+=OiDi#*jB9UrOcdACVk{h>SGrdJW-x9Y@v85kP>*`ZlH+^%j(!!aG`;^|D I`%16>0AcxBS^xk5 diff --git a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po index 284dc3a..3aefa0d 100644 --- a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po @@ -743,23 +743,6 @@ msgstr "" msgid "ai:simple" msgstr "Modéré" -#. TODO - DEPRECATED -msgid "aihelp:settle" -msgstr "" -"Plays moves that lead to clarity on stones' status, favouring solid moves " -"rather than complex sabaki. Of moves that lose at most 'max_points_lost' " -"points and with at least 'min_visits', prefer moves that lose fewer points, " -"settle own stones more (with importance settled_weight), settle opponent's " -"stones more (importance settled_weight * opponent_fac), avoid tenuki (more " -"than 5 spaces, importance tenuki_penalty), and avoid attachments (importance" -" attachment_penalty). Weights can be negative to make it complicate the game" -" instead, and wide root noise (in general settings) can be used to further " -"play according to the style at the cost of strength. " - -#. TODO - DEPRECATED -msgid "ai:settle" -msgstr "Settle Stones Style" - msgid "analysis:local" msgstr "Proposer des coups locaux" @@ -828,3 +811,17 @@ msgstr "Save SGF File" # sgf save as button msgid "Save File" msgstr "Save File" + +#. TODO - status message on starting insert mode +msgid "starting insert mode" +msgstr "Starting insert mode, press 'i' to finish inserting." + +#. TODO - status message on ending insert mode and copying the moves +msgid "ending insert mode" +msgstr "Inserting exchange(s) done, copied {num_copied} following moves." + +#. TODO - when a user tries to go to a different move/node while in insert +#. mode +msgid "finish inserting before navigating" +msgstr "" +"Navigation is disabled in insert mode, finish insert mode by pressing 'i'. " diff --git a/katrain/i18n/locales/jp/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/jp/LC_MESSAGES/katrain.mo index 0f962aa46cff35f97b1e65f19bba59156453e242..0b59b070f12c5e83ab467402cfd0863ac0420a74 100644 GIT binary patch delta 3777 zcmZYA32anV6vpw>7AS~x0~A`2hX^Q^vV&BX%HoDd1PxjjoYH9-DKn%k0s=k-!=?#F zP=w$T!Js4(bWlJP6$qj*VieH0Z$TxX#;v$u{C_hiF+@`4cb9YTJ@?-CX5N1wYtz!K z@Ux<34;%ju^S=}SUumJ5*)47U^IVFzQg4s5un_OZ4)_?h#+SUl8;huaj9u^tujl2N z6;SVrx!5213$2{bd>XDo1>EG`foD;lhnjFPGMBBvb8sV`jk~ZJ9zZ4dE-L;Q7ULh- z4%@LvE4&D`&H&6~eH%kT11F^$%wnh=&Or@W?yf>j^f=~V61DSf-oFQxaLU_1MD6q& zBnLa;{ePk6Z9x{TSly@auYGf{JK#gC7+W89ae+o6v z^X_Y?_!KJcQw+7!pFAL&3PmeG4eW~AQ6JRK%TW_dK%LkWY>Tr{@yn1uTg`_OeAe5y zdwm~j;UlPdzANPX6?n=!a_OaL#i&F|Q3(u3#a-$3$*2>lLhU?(EpZ+y?mpB4D^ZEA zM_n7N^V8P)w*{hL+xSI!q1>KvfcaN zMxD@?sJI`!o*i<75;fnSSfKa64PS2>cpfU_KBxf$Q9B%kByZzTiA7NH)4e_)mB3oVq=M8vjy9fB)a4L3e%BJC3MhueI)UBT0}tXQ_zU*N zQi8RkN*smLF~H5J@rO_w`5N^s{EiVk9eQC(7qh-uW^Z669X|(|1;=;IWIP#l)H6{N zEyiKE29@wpRDwmk^tz%>sCh0#{a7tRJu6FaAFe?q65ie|bJw+QJ!+x_sD+lG7G8_G zf-R^ceH|5-^8OFJei9YeN~h*JqhM*^?~sw+s16 z#<{&%6n9;m4z!y%=eMZ8SZ4MS6NG)a2CVGIFIl!(&;FU6Hy@OF_zIC1%6g;je5`vL z>Z)dAiQfOE6x!3UA>Cm1GIphY6x-k_)Z5Tvuo=l)A*y|_I|jKmn~2(ZJ?dx|y35=L zu|4gpz5X2Lv%YOr0rz^qVdN0(IBKG{Loz!kMjjU%fSPC`YTPtb!gEkpvle;4Z6oI3 z9`An>wSn)k0`qu+L*4NN3hJoBRk#E-VW**)_7TV}*i__}Yy~QTZK#A&sPQLI2^W@g zI@kf3$|fMUV@pv9@5DZMpq%s91b@*m4vTq|)lq}m$s_K1)W9uXe;rGxr;x|MzDFfi z%qyWpM`1C>QS&cDJ*>~55_|y}VmpR${#xia@5mmW3223CFF>78XVe0HQ48OQJiyk7 zI*GNYZ_+KOaXU~8?elsHwSkYke%$L#p*Q4?$ON=QEpP#9;R@6OliV2cXCWW@CftSE zNeUI$YNQ!2h;>1YzZR891bInpn%AeJ5(?`nXy8KZfRB2>^QdpO?Wm(WhT7RrsHgul zmSXFQ%w1oCS}=ipx7b4WX&gv>KdS#Urcd^=w4rs*6s#92(;=v*c7!_$2T{M=`{%oh zP!lb8SEF{c!TYzmJ5d|ljs3ICK13zbdbHw09uNwes0omN z=t9(;FGHQsL#VIVb*Mx(qvqS?9!3t$j-y>xR~J;p;*sPHZT`q!d1JwWWWU0Ac0qM4 zUK_;X4bl3>U`C=knq1d*VAlCHv3RUunzt*WDq54Mj|TC`ow3?TBQ428?Z)L4)~k5N z@N+tBZk>FmTacG58uV@RimTEyD=0c=>a<9_HX2kX;?W=yuMVarX2zn`!Myma8B;Rl z1wl=st}ZcK@iP*4MjOhKr^*jzkGs~FO~iv(Lr@)Sh*Z@vGDh{k%u9navQF^{0I=U;4D#8ChM delta 3684 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 delta 4173 zcmZ|QeQ*_58OQMx2uMO`AW-rGlm)~jn1nj=E~HSb5d@l%zR`)M+nY_YJTxG1!cz4DKeC5sZ|lEGU)er_f+r?nUK$( zvuB_4oada~oZnQ?|Fweb$+E(2hJU~1|3v=pAFh@$D@I+loXeH8uSXBZ;0CO~tvC|D zXWRR*jP?V*7teL^@Qaa|N1}wAQjm5OPPyyE=G0bKhkK3^X zU%*0q36)cE6Ah40`vEM$@*tVGQ-4X1IMFQIvq9elc<$0vhC&8 z+fd`bh{Q78s5lRxDzMq!e+m`vdFuhx_}4J2fxqKIEB=!ma2feA#dPYy3D#QF3g@CK zaWg8=ou~?S;8=VB_1rg+AG3pBN_4O7KV;iS$54MI@CF?U^uE2JPW6}ai!L)2mC!6y z0=J+7HrsY9szPf~73jqg_z-H`7F7HvQHef}O7w6U_17L9qeBnAfjV68*nt|Q_IOkR z_0~pIpj%N}tWP$gQx|*g{t5=RE4sa?0^E6qrhcIm#IYsZbZH3pGO7i zvfhshu+{n)R?^;qTEGF+YxzsmC*>$A{xN(1T_n-0xg1}Zk=)h9Rj88AL9^8iQ3X_KZUBu-*FfgvGE#TiaL}NQ4`HWRiX(gu4zF%AKLqyDyhHr_)&Xfw{<^iWj{yV z|2-<;S=2-qQGpBjz;|IKF2}FpXK)ZzfpW5$fzweFH{&Dd;vPIVf&CA;c$`0djaV|t zn2+J-P!nfx3T{Mx%(MLZ6uykh@Cq`Q`RomRrZIu@a64+ngGiCg+o%fbPhuMsql-b7 zi-rPYeuJ$Vz-$_L53=26Eo!efqE`GZoR8nfE%-;&`1I5`(e-$g_EV@oQeD&H1Ot4T zc0cMcuKZ|Rk?d_;=rDMw(x&W<4XF2j3#ybmZT}0XaR*T=A3!DWHtOvB)!x61DtXa# zUOlYBi#UL*@n@9zZ+ibLs>!^716IRF2J35$`G5frvT?W5UjOm@Kr>j!cc1nv^~Su* z{i2!1Y{Lt7lmFid4 zlc>G^3sMAAI5&Q9CTiRq)S+rZO>hr#piK&|$9~jAJ5eit4s{j=Q44q-$KzSdD!{+F zaBvhycQrPk0&YZA;ybqe3hMB^iAu1NhDzCh9B{J&^_}QKcFFW&BYqc~@HA?^x&_88 z#sv$gzb4o~$1S)MHQ)^Dke#>f0^T|GmtqA@LXLx(gIaL{DVFI&CGw*6*QiRoXZ;6~ zySa>tH+v!VS80|mj0ZNMO0x1)E2t-ekRL>J~aI}8J|F{{6|=YuOV-YIfW!`Mo>?c_|wSTrWtiOw_-EyKuz#I zYJ~+i#qml}iA_W$G!3nFQHa`)OrGy@M$Do)?DC1TTnT;udjBeTs(w=ZN+Q#@!Fa2+T0bm z-Rq?{j#1}?@rr}q50}CCjOWzk1N+_CbdZVMRKl|Z+gf`)zoRp%z4~N2&FWK8b!h8g z1Nhzl=TT>d6WC{3+ua0_C>K?Vyi`w@@6_by&sS--6K2zH!lR_uM2p9@roEJ#jQaFA zb%;Z_QRF5%yU8YWYOZkmhVTZXyw6+H_c$Sd)Z0eA-hr$`b6j6SUKt@lqX8XM>YFeB+tI+}YW?hUAXT NyJ2{)=B5=x{{xinTCe~B diff --git a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po index 012114a..3fe3b13 100644 --- a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po @@ -682,23 +682,6 @@ msgstr "" "이 판에 대해\n" "덤과 규칙 등 조절" -#. TODO - DEPRECATED -msgid "ai:settle" -msgstr "Settle Style" - -#. TODO - DEPRECATED -msgid "aihelp:settle" -msgstr "" -"Plays moves that lead to clarity on stones' status, favouring solid moves " -"rather than complex sabaki. Of moves that lose at most 'max_points_lost' " -"points and with at least 'min_visits', prefer moves that lose fewer points, " -"settle own stones more (with importance settled_weight), settle opponent's " -"stones more (importance settled_weight * opponent_fac), avoid tenuki (more " -"than 5 spaces, importance tenuki_penalty), and avoid attachments (importance" -" attachment_penalty). Weights can be negative to make it complicate the game" -" instead, and wide root noise (in general settings) can be used to further " -"play according to the style at the cost of strength. " - msgid "Make Main Branch" msgstr "주 변화로 만들기" @@ -756,3 +739,17 @@ msgstr "Save SGF File" # sgf save as button msgid "Save File" msgstr "Save File" + +#. TODO - status message on starting insert mode +msgid "starting insert mode" +msgstr "Starting insert mode, press 'i' to finish inserting." + +#. TODO - status message on ending insert mode and copying the moves +msgid "ending insert mode" +msgstr "Inserting exchange(s) done, copied {num_copied} following moves." + +#. TODO - when a user tries to go to a different move/node while in insert +#. mode +msgid "finish inserting before navigating" +msgstr "" +"Navigation is disabled in insert mode, finish insert mode by pressing 'i'. " diff --git a/katrain/i18n/locales/ru/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/ru/LC_MESSAGES/katrain.mo index f44aec680b16378f3eef48684e8c586d8fd6f05a..38dece25ea0cffa98802474b7dc907e8fa609c95 100644 GIT binary patch delta 3777 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 diff --git a/katrain/i18n/locales/ru/LC_MESSAGES/katrain.po b/katrain/i18n/locales/ru/LC_MESSAGES/katrain.po index 1b74dc9..dd19fc8 100644 --- a/katrain/i18n/locales/ru/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/ru/LC_MESSAGES/katrain.po @@ -706,22 +706,6 @@ msgstr "" msgid "ai:simple" msgstr "Простой стиль" -msgid "aihelp:settle" -msgstr "" -"Делает ходы, ведущие к ясности в статусе камней, предпочитая надёжные ходы, " -"нежели сложное сабаки. Из ходов, теряющих не более чем 'max_points_lost' " -"очков и имеющих как минимум 'min_visits', предпочитает ходы, укрепляющие " -"собственную территорию (коэффициент settled_weight), укрепляющие территорию " -"оппонента (коэффициент settled_weight * opponent_fac), избегает тэнуки " -"(более 5 пунктов, коэффициент tenuki_penalty), и избегает прилипаний " -"(коэффициент attachment_penalty). Коэффициенты могут быть отрицательными, " -"чтобы напротив сделать игру сложнее. 'Уровень шума' (в 'Настройках системы')" -" может быть использован для увеличения вариативности игры за счёт небольшой " -"потери силы. " - -msgid "ai:settle" -msgstr "Надёжный стиль" - msgid "analysis:local" msgstr "Найти локальные ответы" @@ -790,3 +774,17 @@ msgstr "Save SGF File" # sgf save as button msgid "Save File" msgstr "Save File" + +#. TODO - status message on starting insert mode +msgid "starting insert mode" +msgstr "Starting insert mode, press 'i' to finish inserting." + +#. TODO - status message on ending insert mode and copying the moves +msgid "ending insert mode" +msgstr "Inserting exchange(s) done, copied {num_copied} following moves." + +#. TODO - when a user tries to go to a different move/node while in insert +#. mode +msgid "finish inserting before navigating" +msgstr "" +"Navigation is disabled in insert mode, finish insert mode by pressing 'i'. " diff --git a/requirements.txt b/requirements.txt index 8965eac..67fb1d9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,3 @@ -bson==0.5.10 certifi==2020.6.20 chardet==3.0.4 Cython==0.29.14 diff --git a/setup.py b/setup.py index 2ca7be5..b192bbf 100644 --- a/setup.py +++ b/setup.py @@ -1,5 +1,5 @@ -import re import os +import re from setuptools import find_packages, setup @@ -42,7 +42,6 @@ setup( "wheel", "setuptools", "urllib3", - "bson", "importlib_resources ;python_version<'3.7'", "cython>=0.24,<=0.29.14,!=0.27,!=0.27.2", # kivy wants this "kivy==2.0.0rc2;platform_system=='Darwin'", # rc3 failing on mac diff --git a/tests/test_ai.py b/tests/test_ai.py index e49c366..a0403fb 100644 --- a/tests/test_ai.py +++ b/tests/test_ai.py @@ -1,11 +1,12 @@ -import pytest import os -from katrain.core.ai import generate_ai_move, ai_rank_estimation -from katrain.core.constants import AI_STRATEGIES_RECOMMENDED_ORDER, AI_STRATEGIES, OUTPUT_INFO + +import pytest + +from katrain.core.ai import ai_rank_estimation, generate_ai_move from katrain.core.base_katrain import KaTrainBase +from katrain.core.constants import AI_STRATEGIES, AI_STRATEGIES_RECOMMENDED_ORDER, OUTPUT_INFO from katrain.core.engine import KataGoEngine from katrain.core.game import Game -from katrain.core.constants import AI_STRATEGIES class TestAI: diff --git a/tests/test_board.py b/tests/test_board.py index f177304..15a8361 100644 --- a/tests/test_board.py +++ b/tests/test_board.py @@ -1,7 +1,7 @@ import pytest +from katrain.core.base_katrain import OUTPUT_INFO, KaTrainBase from katrain.core.game import Game, IllegalMoveException, Move -from katrain.core.base_katrain import KaTrainBase, OUTPUT_INFO from katrain.core.game_node import GameNode