From 0ade2524cebb5c10cd4d8d43c6b415ebf0e3e343 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Thu, 3 Dec 2020 22:09:46 +0100 Subject: [PATCH] tsumego solver 5000 is go --- LICENSE | 2 +- i18n.py | 5 +- katrain/__main__.py | 6 +- katrain/core/engine.py | 19 ++-- katrain/core/game.py | 25 +++-- katrain/core/game_node.py | 7 +- katrain/gui.kv | 6 +- katrain/gui/badukpan.py | 89 ++++++++++++++---- .../i18n/locales/cn/LC_MESSAGES/katrain.mo | Bin 13771 -> 13977 bytes .../i18n/locales/cn/LC_MESSAGES/katrain.po | 20 +++- .../i18n/locales/de/LC_MESSAGES/katrain.mo | Bin 15935 -> 16137 bytes .../i18n/locales/de/LC_MESSAGES/katrain.po | 20 +++- .../i18n/locales/en/LC_MESSAGES/katrain.mo | Bin 15195 -> 15399 bytes .../i18n/locales/en/LC_MESSAGES/katrain.po | 19 +++- .../i18n/locales/es/LC_MESSAGES/katrain.mo | Bin 15329 -> 15533 bytes .../i18n/locales/es/LC_MESSAGES/katrain.po | 21 ++++- .../i18n/locales/fr/LC_MESSAGES/katrain.mo | Bin 17041 -> 17240 bytes .../i18n/locales/fr/LC_MESSAGES/katrain.po | 20 +++- .../i18n/locales/jp/LC_MESSAGES/katrain.mo | Bin 17450 -> 17641 bytes .../i18n/locales/jp/LC_MESSAGES/katrain.po | 21 ++++- .../i18n/locales/ko/LC_MESSAGES/katrain.mo | Bin 17012 -> 17173 bytes .../i18n/locales/ko/LC_MESSAGES/katrain.po | 19 +++- .../i18n/locales/ru/LC_MESSAGES/katrain.mo | Bin 21781 -> 21963 bytes .../i18n/locales/ru/LC_MESSAGES/katrain.po | 20 +++- katrain/img/Save-Game-As.png | Bin 0 -> 5293 bytes katrain/img/insert.png | Bin 0 -> 4156 bytes katrain/popups.kv | 16 +--- 27 files changed, 252 insertions(+), 83 deletions(-) create mode 100644 katrain/img/Save-Game-As.png create mode 100644 katrain/img/insert.png diff --git a/LICENSE b/LICENSE index c972dd9..9911f0c 100644 --- a/LICENSE +++ b/LICENSE @@ -5,7 +5,7 @@ For on related licenses for these binaries and libraries see https://github.com/ 2. Icons from www.flaticon.com, used with permission with the following attributions: - Equalize icon and Thrash Icon: derived from work by bqlqn from www.flaticon.com -- Local search icon: derived from work by Pixel Perfect from www.flaticon.com +- Local search icon, Insert icon: derived from work by Pixel Perfect from www.flaticon.com - Other Menu icons and Flag icons: derived from work by Freepik from www.flaticon.com 3. The True Type Font DIGITAL-7 version 1.02 by Sizenko Alexander, which is free for non-commercial use. diff --git a/i18n.py b/i18n.py index def6029..e9be731 100644 --- a/i18n.py +++ b/i18n.py @@ -101,12 +101,13 @@ for lang in locales: print("Fixed", pofile[lang], "and converted ->", mofile) -for file in glob.glob("katrain/**/*.py") + glob.glob("katrain/**/*.kv"): +for file in glob.glob("**/*.py") + glob.glob("**/*.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 + stripped_msgid = msgid.strip("\"'") + if stripped_msgid and msgid[0] in ['"', "'"] and stripped_msgid not in strings_to_langs: # not code print(f"Missing {msgid} used in code at \t{file}:{i} \t'{line.strip()}'") errors += 1 diff --git a/katrain/__main__.py b/katrain/__main__.py index 756909b..418db75 100644 --- a/katrain/__main__.py +++ b/katrain/__main__.py @@ -324,6 +324,10 @@ class KaTrainGui(Screen, KaTrainBase): def _do_analyze_extra(self, mode, **kwargs): self.game.analyze_extra(mode, **kwargs) + def _do_select_box(self): + self.controls.set_status(i18n._("analysis:region:start"), STATUS_INFO) + self.board_gui.selecting_region_of_interest = True + def _do_new_game_popup(self): self.controls.timer.paused = True if not self.new_game_popup: @@ -489,7 +493,7 @@ class KaTrainGui(Screen, KaTrainBase): "s": ("analyze-extra", "equalize"), "d": ("analyze-extra", "sweep"), "f": ("analyze-extra", "alternative"), - "g": ("analyze-extra", "local"), + "g": ("select-box",), "i": ("insert-mode",), "p": ("play", None), "n": ("next-mistake",), diff --git a/katrain/core/engine.py b/katrain/core/engine.py index 998c02f..a5f67ff 100644 --- a/katrain/core/engine.py +++ b/katrain/core/engine.py @@ -6,7 +6,7 @@ import subprocess import threading import time import traceback -from typing import Callable, Dict, Optional +from typing import Callable, Dict, Optional, List from kivy.utils import platform @@ -112,6 +112,7 @@ class KataGoEngine: self.terminate_query(query_id) self.queries = {} + def restart(self): self.queries = {} self.shutdown(finish=False) @@ -249,7 +250,7 @@ class KataGoEngine: analyze_fast: bool = False, time_limit=True, find_alternatives: bool = False, - find_local: bool = False, + region_of_interest: Optional[List] = None, priority: int = 0, ownership: Optional[bool] = None, next_move: Optional[GameNode] = None, @@ -278,22 +279,20 @@ class KataGoEngine: "untilDepth": 1, } ] - elif find_local: - distance = 5 - last_move = analysis_node.move - if last_move is None or last_move.is_pass: - return + elif region_of_interest: + xmin, xmax, ymin, ymax = region_of_interest avoid = [ { "moves": [ Move((x, y)).gtp() for x in range(0, size_x) for y in range(0, size_y) - if max(abs(x - last_move.coords[0]), abs(y - last_move.coords[1])) > distance + if x < xmin or x > xmax or y < ymin or y > ymax ], - "player": analysis_node.next_player, - "untilDepth": 1, + "player": player, + "untilDepth": 10000, } + for player in "BW" ] else: avoid = [] diff --git a/katrain/core/game.py b/katrain/core/game.py index 65519db..f68799f 100644 --- a/katrain/core/game.py +++ b/katrain/core/game.py @@ -62,6 +62,8 @@ class Game: self.insert_mode = False self.insert_after = None + self.region_of_interest = None + if move_tree: self.root = move_tree self.komi = self.root.komi @@ -233,7 +235,11 @@ class Game: played_node = self.current_node.play(move) self.current_node = played_node if analyze: - played_node.analyze(self.engines[played_node.next_player]) + if self.region_of_interest: + played_node.analyze(self.engines[played_node.next_player],analyze_fast=True) + played_node.analyze(self.engines[played_node.next_player],region_of_interest=self.region_of_interest) + else: + played_node.analyze(self.engines[played_node.next_player]) return played_node def set_current_node(self, node): @@ -410,6 +416,17 @@ class Game: f.write(sgf) return i18n._("sgf written").format(file_name=filename) + def set_region_of_interest(self,region_of_interest): + x1, x2, y1, y2 =region_of_interest + xmin, xmax = min(x1, x2), max(x1, x2) + ymin, ymax = min(y1, y2), max(y1, y2) + if not (xmin==xmax and ymin==ymax): + self.region_of_interest = [xmin,xmax,ymin,ymax] + else: + self.region_of_interest = None + self.katrain.controls.set_status("",OUTPUT_INFO) + + def analyze_extra(self, mode, **kwargs): stones = {s.coords for s in self.stones} cn = self.current_node @@ -426,7 +443,7 @@ class Game: visits = cn.analysis_visits_requested + engine.config["max_visits"] self.katrain.controls.set_status(i18n._("extra analysis").format(visits=visits), STATUS_ANALYSIS) self.katrain.controls.set_status(i18n._("extra analysis").format(visits=visits), STATUS_ANALYSIS) - cn.analyze(engine, visits=visits, priority=-1_000, time_limit=False) + cn.analyze(engine, visits=visits, priority=-1_000, region_of_interest=self.region_of_interest, time_limit=False) return if mode == "game": nodes = self.root.nodes_in_tree @@ -467,10 +484,6 @@ class Game: visits = engine.config["fast_visits"] self.katrain.controls.set_status(i18n._("sweep analysis").format(visits=visits), STATUS_ANALYSIS) priority = -1_000_000_000 - elif mode == "local": # also do a quick update on current candidates so it doesn't look too weird - self.katrain.controls.set_status(i18n._("local analysis"), STATUS_ANALYSIS) - cn.analyze(engine, priority=-500, time_limit=False, find_local="local") - return elif mode in ["equalize", "alternative", "local"]: if not cn.analysis_complete and mode != "local": self.katrain.controls.set_status(i18n._("wait-before-equalize"), STATUS_INFO, self.current_node) diff --git a/katrain/core/game_node.py b/katrain/core/game_node.py index dfee82b..bd7ec9a 100644 --- a/katrain/core/game_node.py +++ b/katrain/core/game_node.py @@ -145,13 +145,14 @@ class GameNode(SGFNode): refine_move=None, analyze_fast=False, find_alternatives=False, - find_local=False, + region_of_interest = None, report_every=0.25, ): + additional_moves = bool(find_alternatives or region_of_interest) engine.request_analysis( self, callback=lambda result, partial_result: self.set_analysis( - result, refine_move, find_alternatives or find_local, partial_result + result, refine_move, additional_moves, partial_result ), priority=priority, visits=visits, @@ -159,7 +160,7 @@ class GameNode(SGFNode): time_limit=time_limit, next_move=refine_move, find_alternatives=find_alternatives, - find_local=find_local, + region_of_interest=region_of_interest, report_every=report_every, ) diff --git a/katrain/gui.kv b/katrain/gui.kv index 209d633..2cab646 100644 --- a/katrain/gui.kv +++ b/katrain/gui.kv @@ -751,13 +751,13 @@ shortcut: 'f' on_action: root.katrain("analyze-extra", "alternative") AnalysisMenuItem: - text: i18n._("analysis:local") + text: i18n._("analysis:region") icon: 'img/local.png' shortcut: 'g' - on_action: root.katrain("analyze-extra", "local") + on_action: root.katrain("select-box",) AnalysisMenuItem: text: i18n._("analysis:insert") - icon: 'img/local.png' + icon: 'img/insert.png' shortcut: 'i' on_action: root.katrain("insert-mode") AnalysisMenuItem: diff --git a/katrain/gui/badukpan.py b/katrain/gui/badukpan.py index 40b06e4..a79f263 100644 --- a/katrain/gui/badukpan.py +++ b/katrain/gui/badukpan.py @@ -48,6 +48,9 @@ class BadukPanWidget(Widget): self.gridpos_y = [] self.grid_size = 0 self.stone_size = 0 + self.selecting_region_of_interest = False + self.region_of_interest = [] + self.active_pv_moves = [] self.animating_pv = None self.last_mouse_pos = (0, 0) @@ -57,6 +60,12 @@ class BadukPanWidget(Widget): self.bind(size=self.redraw_trigger, pos=self.redraw_trigger) Clock.schedule_interval(self.animate_pv, 0.1) + def play_stone_sound(self, *_args): + if self.katrain.config("timer/sound"): + sound = random.choice(self.stones_sounds) + if sound: + sound.play() + # stone placement functions def _find_closest(self, pos, gridpos): return sorted([(abs(p - pos), i) for i, p in enumerate(gridpos)])[0] @@ -74,23 +83,42 @@ class BadukPanWidget(Widget): if prev_ghost != self.ghost_stone: self.draw_hover_contents() + def update_box_selection(self, touch, second_point=True): + if not self.gridpos_x: + return + _, xp = self._find_closest(touch.x, self.gridpos_x) + _, yp = self._find_closest(touch.y, self.gridpos_y) + if second_point and len(self.region_of_interest) == 4: + self.region_of_interest[1] = xp + self.region_of_interest[3] = yp + else: + self.region_of_interest = [xp, xp, yp, yp] + self.draw_hover_contents() + def on_touch_down(self, touch): self.set_animating_pv(None, None) # any click kills PV from label/move if "button" in touch.profile and touch.button != "left": return - self.check_next_move_ghost(touch) + if self.selecting_region_of_interest: + self.update_box_selection(touch, second_point=False) + else: + self.check_next_move_ghost(touch) def on_touch_move(self, touch): if "button" in touch.profile and touch.button != "left": return - return self.check_next_move_ghost(touch) + if self.selecting_region_of_interest: + return self.update_box_selection(touch) + else: + return self.check_next_move_ghost(touch) def on_mouse_pos(self, *args): # https://gist.github.com/opqopq/15c707dc4cffc2b6455f if self.get_root_window(): # don't proceed if I'm not displayed <=> If have no parent pos = args[1] rel_pos = self.to_widget(*pos) # compensate for relative layout inside = self.collide_point(*rel_pos) - if inside and self.active_pv_moves: + + if inside and self.active_pv_moves and not self.selecting_region_of_interest: near_move = [ (pv, node) for move, pv, node in self.active_pv_moves @@ -109,17 +137,17 @@ class BadukPanWidget(Widget): self.set_animating_pv(None, None) # any click kills PV from label/move self.last_mouse_pos = pos - def play_stone_sound(self, *_args): - if self.katrain.config("timer/sound"): - sound = random.choice(self.stones_sounds) - if sound: - sound.play() - def on_touch_up(self, touch): if ("button" in touch.profile and touch.button != "left") or not self.gridpos_x: return katrain = self.katrain - if self.ghost_stone and ("button" not in touch.profile or touch.button == "left"): + if self.selecting_region_of_interest: + if len(self.region_of_interest) == 4: + self.katrain.game.set_region_of_interest(self.region_of_interest) + self.region_of_interest = [] + self.selecting_region_of_interest = False + + elif self.ghost_stone and ("button" not in touch.profile or touch.button == "left"): game = self.katrain and self.katrain.game current_node = game and self.katrain.game.current_node if ( @@ -429,6 +457,20 @@ class BadukPanWidget(Widget): self.draw_hover_contents() + def draw_roi_box(self,region_of_interest,width=2): + xmin, xmax, ymin, ymax = region_of_interest + Color(*LIGHTER_BACKGROUND_COLOR) + Line( + rectangle=( + self.gridpos_x[xmin] - self.grid_size/6, + self.gridpos_y[ymin] - self.grid_size/6, + (xmax - xmin + 1/3) * self.grid_size, + (ymax - ymin + 1/3) * self.grid_size, + ), + dash_length=10,dash_offset=10, + width=width, + ) + def draw_hover_contents(self, *_args): ghost_alpha = POLICY_ALPHA katrain = self.katrain @@ -442,6 +484,7 @@ class BadukPanWidget(Widget): with self.canvas.after: self.canvas.after.clear() + self.active_pv_moves = [] # hints or PV hint_moves = [] @@ -582,16 +625,24 @@ class BadukPanWidget(Widget): width=dp(1.2), ) - # hover next move ghost stone - if self.ghost_stone: - self.draw_stone(*self.ghost_stone, next_player, alpha=ghost_alpha) + if self.selecting_region_of_interest and len(self.region_of_interest) == 4: + x1, x2, y1, y2 = self.region_of_interest + self.draw_roi_box([min(x1, x2), max(x1, x2), min(y1, y2), max(y1, y2)],width=2) + else: + # hover next move ghost stone + if self.ghost_stone: + self.draw_stone(*self.ghost_stone, next_player, alpha=ghost_alpha) + + animating_pv = self.animating_pv + if animating_pv: + pv, node, start_time, _ = animating_pv + delay = self.katrain.config("general/anim_pv_time", 0.5) + up_to_move = (time.time() - start_time) / delay + self.draw_pv(pv, node, up_to_move) + + if self.katrain.game.region_of_interest: + self.draw_roi_box(self.katrain.game.region_of_interest, width=1) # dashed - animating_pv = self.animating_pv - if animating_pv: - pv, node, start_time, _ = animating_pv - delay = self.katrain.config("general/anim_pv_time", 0.5) - up_to_move = (time.time() - start_time) / delay - self.draw_pv(pv, node, up_to_move) def animate_pv(self, _dt): if self.animating_pv: diff --git a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.mo index 0b8839b5a9bd8971e759e5ec95977f9af1651eb6..8459233755f387725f61236a11740f395f9ed4e3 100644 GIT binary patch delta 3699 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 diff --git a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po index fe94413..c7c47a9 100644 --- a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.po @@ -657,9 +657,6 @@ msgstr "" msgid "ai:simple" msgstr "简明风格" -msgid "analysis:local" -msgstr "寻找局部走法" - msgid "local analysis" msgstr "正在寻找局部走法" @@ -739,3 +736,20 @@ msgstr "Inserting exchange(s) done, copied {num_copied} following moves." msgid "finish inserting before navigating" msgstr "" "Navigation is disabled in insert mode, finish insert mode by pressing 'i'. " + +#. TODO - in new game options +msgid "player names" +msgstr "Player Names" + +#. TODO - Option in dropdown to insert some moves between the current and next +msgid "analysis:insert" +msgstr "Insert moves" + +#. TODO - Status message +msgid "analysis:region:start" +msgstr "" +"Drag to select the region of interest. Selecting a single point removes it." + +#. TODO - Restrict analysis to a specific region +msgid "analysis:region" +msgstr "Set region of interest" diff --git a/katrain/i18n/locales/de/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/de/LC_MESSAGES/katrain.mo index eb73abcf2e22c327a10bae19bf736e742b4e35ca..fc8bb2b8a09733c626c154bf5a7b77a95ef84582 100644 GIT binary patch delta 3698 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 Mt7C1Kz^9l*E#2R9=_*$&hOqXRD3$$ ze<`xl`-cC{@h_f#r-M{8=ADrLjG?%SdQaSj5x5^?@q6r!*KPd|jHKQ@)R+Y9i>i;t zaLmOnI34-(n^}B@(NKx%P;K3S-Kg(GP0)zUZN9~5Jco~BD|W)aQ2}Z)^^eBhn2bGe z9CpQg)H*XTl=Y2|f(9;bZ!l&(YKPlV1NK>upeAa;j(8Qd^PlbWyQqL4+V)^p(N23H zv6*<(^TDWjGbHPqEDD+^8`W_#YNxI`pcl2%DqF8X^{YeHG9RPHH=uTYz&<~Tn&*o3 zHmd(aRKE~*>DNvjKGbm-^2}t}dM+yB*HAm3g_=Nvl(E$qh1*c$_acAh7#|Ao2iyJ& zYTP~4!a;nf-Yb&)tB_2CCLDztn1lS8SNUL!nS%;!F)E-sRKI##--XK1UQ{NIVlbXW z^}B#t=LTw>2dKcqqsYI`D2bW|4nbY6k*JP2w(g<=SZG~kpKn1O(QeeZChHkw4RaH< za2skPVWd(05>Xi&>8GHM<84E}trwvNzJ(fCgWBOHR3JN06Yaw|Jb|oXZlUJuK=j&q z4{LwyM|~J-{3O(d{e={i(sESFs%(d4s0G#`bDCYK1rDR$`*Wy??pQm}S>q$EaoCG` z5^5u(QLpI))K^R%^5-`%^QjJVP!Ydvtwk+dkL@W&^=m@yu*J4tvHphI(O;-cb>Le| z0fwT+C!pGsQK`>puXFz6C}_f5)POgvb5Rj5Lk(Do+TnU+(`GAb;ytKwhfoWgvh9~` z{RS$q`=||dBz-a#gY^EVP|z6TPhccA8L zLT&6gs^3-AJb$A4>wNs0FqDFfLoGNEwbK!(fmx`4a#43>8mfPxZTF%ku0r*%MrCLN zcE-<9{Tor2^)PCkpL%irinx^qj?HxB3tJQPMs*mBI`d51o^73m+F6Nx?nm`sjaq06 zYTlh#f(J1fQ&|0RoPx@bKaTv94YP&@?cg(3YTbD-k)DSEKK72TOF|p zmpm5upOdj{Yd7^c^4yBYu^A5xG-gZ(V^(m$E!3L_8M6r24dzvTgrg$g?Uyq(kb!E{ z?cagXtZ%-e!2K{Ss8s!m#ANQGb{5Tn>Z}H!BF{qY13J8CkP8I5gUFj~P9WF7+(HH1n_cr_ne=q>uZD>qix@cx^z43^F63Q z4xs`*i8|w(sEyo52O~+Vc9@3B%uC3zo7YhbuR&fQ^y40i^$t!ZlJ!y zZ=nLai!t~B6+q<3K>HBX5vHN~7oc`J9Th;SeZCNNH?|=g_M7kQgR`jDt_?XR(~paw zJ1_+`!7S8-^HBjWL1nHEdHv01Ydz}De1zK2Db(9>9u?SSRK~7jh~EF-?SnSdgq<@3 zUlgHunR+TJBVkVk0*S|-)CXC!PytOw1zd>wYOO>qScS^mV$}RKsKC}@WDoN+3!cVj@k&E}NJXch;!>|$?pu30A|<}uEh;W6HJ(yWNu{^gn;EEQdVQX9U&H-~ zm7Rl}QqOGH+pr+U6VvUv_JPjqvWm5>sd3ZuT%Qvd;FJ|Q#ic&C-1Yj*xN=XC<12H# zZizd?=lEv2|I;hg$!mXHTw3IK950l(&YNXSLT46my-u+&wIO(Dba3|GUrN;Fo*= delta 3518 zcmYM#3rv<(9LMp$Tm(!3U!Yem;fn~SqOXdI;#`W?w6buM@GjDv_J);;E?SQ+a|_yZ zLu{ItWh;x7X*kg?wwWoYq-l1UC|Zrmd8yR~mTP@~yl2ZHpL5Q0ZvX!|&%?fTmn*%i zzNk9m-#7fv;Qy!HRWqC4>wo3N_&-WG>r|_v1e7iN`Ps&!9GV9@W1c)9@}PV={}x z;Xu?n`54doHkpD3&hBb3TaJow9cnF=&X1Qm*wh#HuMiYSPRybv|PEL6r8VG^!E^?w!lvDf*f4Zi2vkGT3t z)WVlg^ZeSI{HtT9dl17@ik61jNFHhf<5B&lyLt&KBW0+_S7Izyq55q^El`Wv=v%0b z9z`8V3u@dYANkj1y6!r5qU!PV)&_E%qfrx0LmkNiRKI1;myn@Whg$euR3Jy(^V6sd zT}So1>G%RNhiyZRuSZ4xne#06qkb7R{$EtY z2}GfcrlT_EKEf7Mz=j&1Zwma)l6MW)4fvMD6P=Wk{dM!IppOky3 z`6KzI=V{1>JsT7**jUuU)3GbXsE*4}5w3OZ)y}P`h<2kgRgcL$#*os>47V468paw>8uxd|0O`MAApM%QGXpF{3Q2mQhmvj+op(@md ztC6hR9@O~5sqXzhMT5@zTlb*d*@22ImJhj}r=unuj9RD=HSshI;d~s3%{T!6L}e(Q z-4KfnK?N`sORzYd^WQ?Do`zXCjz579Vhv{EA?(T!@?)+1(!_T$h*=M?348*zvDZ-T zZ(tstL1M5@)Z64^Qr)p!oPmQq3Pltu@f04#Nw}eJIOSiWQgsfsz%^9L?_e%Q2lzvU zd8i|L8+l|OqUJe=`eT)p70#3&cT&$oT}rQ+f>L=N73mdJ%Gyz>>O?IZ#n(hfkc8@= zjp{edwHKi#EJod(QdGZkJc!TXRm{#dn}ZSk%}(n5FQssdhCq(lci4u9u#xa?V~Bh= z;XKaep>AgVIpD9Tmk%;qkNJZsM=%Dp;nbnw4CJ70{}j}vn~hutTY<{dE7(u(|7Hq` z>?71!9Y~~fqGxm^U0|B7GeQbAg5;U;8;9|K8(vZ zV+za2C;xga9;0C~MC>*){DJXd9`&K94bMYfAggrsI@HDv zpfYpXc@ep0);f~>YsV4fOK0UnrOc1LF%$KC7%GJmkXPACQ4_31ZD<#2!}~EFKSnLs zjN14G)V!^({U_9&y6L$NcTo#Pjt=iQ33bLpP?3$n0M155xEht2TI3k*P1M2{P#>u4 zsQKbJ2L+ajyd;*1(U^tWkT-yWpTba7s;0UJi&1B{3^ia2D#C53h4;GW2T*t72UMgs zCOobO^2%F2l5LxVI{O;b_}$2Sp1n^&J3WF*SrhV_+t<#EsLOH*6-f*?NpD3@)W(ug znMy-Voa5T_QS*&OeG!ZB8kV6_KdDgtIseBgq|mU?xf->hYSfN*pgy4=pcXucN?jvr zfn%tRokI0LiyGgCeee!y!Ps$pj4%alVki_STVAoGp|018sOZqjrAtD!(Y_%KPx>}Q pH?;fb`h8QESCj|39t56$YSptVD^}Ic2&OkQ1yf=hZWN4<`VVxXRB-?R diff --git a/katrain/i18n/locales/en/LC_MESSAGES/katrain.po b/katrain/i18n/locales/en/LC_MESSAGES/katrain.po index 6c3478c..9d3a04c 100644 --- a/katrain/i18n/locales/en/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/en/LC_MESSAGES/katrain.po @@ -109,9 +109,14 @@ msgstr "Deeper full game analysis" msgid "analysis:alternatives" msgstr "Find alternative moves" -#. Analyze again but allow only nearby moves -msgid "analysis:local" -msgstr "Find local responses" +#. Restrict analysis to a specific region +msgid "analysis:region" +msgstr "Set region of interest" + +#. Status message +msgid "analysis:region:start" +msgstr "" +"Drag to select the region of interest. Selecting a single point removes it." #. Keep improving current position analysis when there is nothing else to do msgid "analysis:continuous" @@ -120,6 +125,10 @@ msgstr "Toggle continuous analysis" msgid "analysis:aimove" msgstr "Force AI Move" +#. Option in dropdown to insert some moves between the current and next +msgid "analysis:insert" +msgstr "Insert moves" + #. status message msgid "extra analysis" msgstr "Performing additional analysis to {visits} visits" @@ -343,6 +352,10 @@ msgstr "Update Timer" msgid "New Game title" msgstr "Setup New Game" +#. in new game options +msgid "player names" +msgstr "Player Names" + msgid "board size" msgstr "Board size" diff --git a/katrain/i18n/locales/es/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/es/LC_MESSAGES/katrain.mo index 2ae865f782f69182726bd56ef2d424afd7097746..202c0f63145e5966c9b4f943cd8824bd290fadad 100644 GIT binary patch delta 3725 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 diff --git a/katrain/i18n/locales/es/LC_MESSAGES/katrain.po b/katrain/i18n/locales/es/LC_MESSAGES/katrain.po index 454cd9e..1164e3d 100644 --- a/katrain/i18n/locales/es/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/es/LC_MESSAGES/katrain.po @@ -713,10 +713,6 @@ msgstr "Plays moves that lead to simplifying the board state." msgid "ai:simple" msgstr "Simple Style" -#. TODO - Analyze again but allow only nearby moves -msgid "analysis:local" -msgstr "Find local responses" - #. TODO - status message msgid "local analysis" msgstr "Searching for local responses" @@ -799,3 +795,20 @@ msgstr "Inserting exchange(s) done, copied {num_copied} following moves." msgid "finish inserting before navigating" msgstr "" "Navigation is disabled in insert mode, finish insert mode by pressing 'i'. " + +#. TODO - in new game options +msgid "player names" +msgstr "Player Names" + +#. TODO - Option in dropdown to insert some moves between the current and next +msgid "analysis:insert" +msgstr "Insert moves" + +#. TODO - Status message +msgid "analysis:region:start" +msgstr "" +"Drag to select the region of interest. Selecting a single point removes it." + +#. TODO - Restrict analysis to a specific region +msgid "analysis:region" +msgstr "Set region of interest" diff --git a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.mo index 7814ed01708746e79d795dbd07c0e540091672ae..00a6d1e39de5bb5823997ed39b33ff103d8454de 100644 GIT binary patch delta 3701 zcmZwJdyvg#9LMqRv1@bN#bUA8{mHs4OEK=k*6ysy-Rvm0Xm_1mtG(o$qZzWDWH7F) zS;nAY#$`$-Oj`;?5~(KDMk-A*M5z=KWsKgR^Lu9cC$oEA&-47A%lG*{&+n`k7YDvx z5{Q1E9KX)^cZT2g{GLis&1_}jf3~K$ih3*Dfz9zCw!u%aFzGWvagtd&rlIP? zuo+Ik`>+uCiP~&Fo6;~3)nS=)BQ~PG3pK$$WN!NiQ}7Hn!K)aLcTfRpGWAcvRLsPd zn2QZ@GHRV7Ok#bDP|(0du?DjZs2#q78gRh*0cxU?7>5^7JHPCn-#`U?*R?lb745Vo z5}UP0J@0{WJPzjXUH#jjUn6 zq87e~+DKE}xEwV!wXg4)qdRHg!a zYbn4a)cAB%dnPLN{bO~`KbL|goPZiI(>WIv@eaI*h^)GhqVbsJ`sQ$}P z8QO^TaWAU>KGbDBidyGfTh3n*U!{R#vpBx6H9;z>Ll4xM4|eS%ol{XeD|64IsQ%Tc zg*Kz+-Gxu#d)N)LSbZo?L|x{ZcI3Ycg_miFT`DZ3ejayVE`Jh>@CpvZu^r4h;Zh`K z+vV!V(4+n{4#GxhX5%pzwSje*k2^36|3>|_?GjD*QT5dsN0GqGtO=T-7U+p=(uQJxoP;l6HR|Y+iCP(Ik6W<^#$og%1*M`67vd$<`#CGa zPh}h-7*(kiz-K;B)AdelevL_4Us$K+wYacLs0=GP9R#1<>cD?)TceWXX=8GI0?(M!Su=6Dj@tRA-_tR~{;r`KZ(vqAqU;N8vK$ z`q*jI9l3^@r!nV3jFyJV*ceP?eVar=Y(;%BD!@&yz6U!}KZZKv z%c#Jvp#rr5{!t{N=532Tup_G97>rJ&FpYv1d>y%%b`W)$zQt_3i8{OfyaFkhi={Xf zb(@c&CccgeD2-P@cOV;eNk=26Y^BcC?s@GX^3QSGVHy}~mv9)S5B4LRj#{7`HStDN zir>MZ*kFjCxja+`#$Y@??%JoJ0xm+XkIhG}i)}})o7D{=|BC!J4LX~Qhx|WG%27Fg|`*Pv3l8Fe(TVeBqpD)o!V{j+Nf&)BvYdlG;tB?lFUY> zx(aoGc~*$Z$a+-DUqyZK>~X${I--Nf>u$%LCr~^67&R{Nu-`8MRd0^kP)f`w z?>YrdoPoMT-BGFRi>(6e5S6mYkN8JWjylVEsD9O`quPuLcsIu35!AfLPz!#7dduoi z89R$fx`h{1!0XOHjvq)f-1vmjif}L#sX5iWXZujFq_nca3MvZ9=7mec zgZ=v8aHJpPHBSQPOhvx5KAtCyD_dt6#k;uUydC<}T|S278mV@r6YkzTc_ X{rWU)GQO-}UNGd1jfFC5SYG_UJ$03q delta 3539 zcmYM$3rv<(9LMqV!i$O|AcArcg$NYE@P-JaqK0T%maH_B6v5n!1WhDaV2@U^MYT#K z=SrQ}O=dUWrZl@vEiq%G!qQnO>eO6nEgjxweSbV>%ORh0p66Wt=YP(5Uyjy$USH>N zevj}r8UA(he=z?)@1>eC3;X@=Ac{rQqp%wL<4YKgn=u4;+xk9?pne>O;w4)T4K*g5 zdLs75G02Z&a`+v_gPEuXk6O#HFZEi~fc3~&W)lv?_wWw<61{jB6<`Od{aK8~>llfV zOcIQ#sCmX>DD#_pDX3#%&jVw8s1??rIy6`}pa$B4f#^rAe2;y<9~E%BeSQ?R(lba5 z=1=?nCTiSXL=nvVCY*u>ibXX{L9H}X4R9K2rT5$V0#v(FWGqvK>i;}y<*(ZJ&8Trc zv3`YW-;Qec8#-F)U$#L26^bSt)iDvZq72l^b5H}!L1k(*5{!zvIMpAO6-HRsCF-)CTK(j zx*ZkhXQ(Y{NA)`rLH>1^x@^O1sCp=^6+p6eJZhi<)Rq*X+AXs_i*z+jsEOZ4Eu_`H z{|=R*E>yeAwjSV+S3L+vbxcBa9E)0EJ}Qv8s0m9j4xd5BFmIsxx1d)3h4p*9llpN~ z|J$e)hp`G}G!B(9CxwC?1y+n|zueaAPyy7V0%}ApWUKX4 zR0a;AwzdOx2v1?p{l7p#dv^sjKp^?nfMKW!2csrTK?RnDnjjxF-~!Z&%2Dkc)Htu9 z+P{T88M5v{&36DDt?(xb>i8>a!i%Uw(v9jEz{cu%7;4}cRQqI9X2xR>&PKJLi#nu> zP!rXn0&YOEZnmQO?~bwe{~!;v*FW1AXRY0+mG$9+T<_yh1E!%S%0UfWfXi_q4#zf} zh<~FFaR$+(;55{DWw-=a$FcwKP&mnh60GMdZ~|VyBut8TPjvyRUW^I24zuxHd=O8f z0vtVr?-87W>DYw&R^5ln)CtrXyNavvhC`u}Ld{U3^YD>~)zs4y-IO<@2H1(3;1IGX za}3Ah6?_iUxa``Z4^bIv#b!K+`m!n`dS#*l*Wz=iL+N<$a#IP%#!I_9CyLIJ9MA*%mls6$t3>nm_O^;%r);ctRut~B*E>_>u!{Xb73h8MwXToopz za@BC-2xErf=`>^FF=QkYW9r=mf}=9{7{=UDY)b$iOrza}+#Kuv;n8QDoATjElFcL} z8Kwx8i8UCn`@eyL4#h51s=ql+BM?C z*o>O+8Y%;xEcfgrU>@~cbQEbFg@M?BKHP>ny&+r$4LkuAP$_ESdQ_&?Bim{|vUb|{ z*O6T{L0l1vCLJf?QdEF%qsI4VlYb3-k_WReAjiG851>-_GAaX&=*7+Uc{3{D9msJp zUn9rETtLp3iOzKcpM=_)GE^oup|+?QxoGBtT=K7p+IgS}I&Fhvs7TMCw&owy;pu&k zo5B&uc{BN_En9_Z_X=uDwxPz|fjT1}qcXi8b(Vg>LD=O`P)e`c7eN!cPrrv>?_zz6MZXAX~Cc9ro(^09NkIGmLa)Hd7s7!RAGJP8PeBu7P1#<}%;T7as zn}4mIJa>hGsE#?Pc9U)WKGX{5SRX-sa227>P6;Z5Phu1U*P$}Ceu^^h@EJ})d$COvOA^_&6M);geAU;Vt-S= zGH+0MWl3>)V^G9M|NMxxLH@IY7RNU>j~kGz=hZc4T4nW9Reh_feNPuxtgNzCU&YF5 U-%8&TRsPP*F~R-;lk>g*0XVT^*#H0l diff --git a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po index 3aefa0d..0b97b3c 100644 --- a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po @@ -743,9 +743,6 @@ msgstr "" msgid "ai:simple" msgstr "Modéré" -msgid "analysis:local" -msgstr "Proposer des coups locaux" - msgid "local analysis" msgstr "Recherche de coups locaux." @@ -825,3 +822,20 @@ msgstr "Inserting exchange(s) done, copied {num_copied} following moves." msgid "finish inserting before navigating" msgstr "" "Navigation is disabled in insert mode, finish insert mode by pressing 'i'. " + +#. TODO - in new game options +msgid "player names" +msgstr "Player Names" + +#. TODO - Option in dropdown to insert some moves between the current and next +msgid "analysis:insert" +msgstr "Insert moves" + +#. TODO - Status message +msgid "analysis:region:start" +msgstr "" +"Drag to select the region of interest. Selecting a single point removes it." + +#. TODO - Restrict analysis to a specific region +msgid "analysis:region" +msgstr "Set region of interest" diff --git a/katrain/i18n/locales/jp/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/jp/LC_MESSAGES/katrain.mo index 0b59b070f12c5e83ab467402cfd0863ac0420a74..3b93629d8f34c4678f37bcc40c0d558cee47f598 100644 GIT binary patch delta 3723 zcmZwJd2Ccw6vy#9Qp%zfC=iKd0`|_iq zpX)>ZH>pWaI{qEwe?R^oO;*jh_1*sSYKj}E_r~qm6Pqy|Kfx>Ul+}O3RO(lzIM*Mu zQ1waJ152?JE<}EOcMqT4X;^{kP;WkiU8%o<3h)*Z+kJ$6@EBf&zhDyng_@v(sed2L zz`>Y?CD;Y$qw*}m6!N<`1r1!CXmIXn)Cylh4cKMAj|y}UJ761X<)`iW@2Cm4TYG1+ zXr*b$++07@^P#A?d6N9Dkb(luKy{phT4_WbFos%boz>T(`fWmTxff95n@}r%&z>Ja z#W`tSK=p4&_3OqeeXZ2vLmfvU&s?F^OHnhv6SeYtPysYZJGK#f;da#coyd>-kPl7p zOKblLHSQuRaWWsO_f2L0RTxZz0!}~;ycPLzcksa&cQ0yUt5Fl$gzC4=>W!!!+KJkU zeb^a~p!yw0^HGzlB4fcF1>WJP%jcYMK zM{>AxsKo!E7Sf$qGr6xd<>O%8z#0G)vpD$!h_a+(mab=(VwWD z3h}L_38tXN_eZr4Ms0mwqR#o3P*A{9)PTiiEo#PVPy^PXR`@isX!krS@H?n+dr=8K zv-a<-eg-wMOQ;2PVEbe`ChPqlPC;ip26Y*ypaRcC?Z`Y-fO1rVm_1*KO1u^|!Of_^ z4XAi6sD*us>eq&f^9QQG&c|246bdpEmGFAhO2?rF7NRCpin=RhsQyc=J%$Qghw5LC z+M#E#BfgI6{}$@9wxaTU+n4j#jDMklV{;w&!d8F`REMFcGtam78D<%3WtH~aNA=%` zO0*Rf_Z6(dJvbS2$u6r={Tegb|IrkhX<%2}1=N7f{3`qemtz!5u5qpa-^MKb9rZS( zQqj)jU=EJJ@i-TU<721=wO}zGLJw2>2jfTk6tt45sMlfvhB0im;)sxQ*Lpmoea?U& z;Txz4H>0-tC@RhwoQUnH3Fq_DYl6#BN3;?ZXFckdn17mrF3VZmhwZ3|ygw*7>yOPZ zP=QXO5}idQ{u^~fY1zS+W~2IzL_IICdMT=3nbntKtKR=w3g>t*;ac8(%wZqPLj3y0 z+cD{SzV~tdV2%M#4B=woz+pkZciHEUsQ10Wxvv=CHp00B*fNs7SMb`73RYe*Hn@DX z$eZXM$8_?$hD3q)7j;(0k!#@2VQ=i57u2&*mnI*(;Z)SyFdO^eU3fFzhpfr9qWb-0 zUPMmQC5;PqA{!I${}>f`P+%6L5>L1Kov5u_VlKDmYmm)xTTtUaK;4N0$USpEqT(cR zBQ-t)2jCFYLT*7{E1gfF1J+uH6{r<##zNeKI`hzkpgj#YQJ;Vcc+lE^#i7)D=R0>D z7NI6kftrwyin|px;nsZipIveLX&{FSab-C!myeop6>_Yu4i(^4)D|DG_H?egRx-_; zjT*Pm>QT(3?jzU2ZAMM(0BWLtOyvACD0nvp2?|iRcL8dKi;-MzDJs#6*8Zm1Z0&nd zJ9G$@;Coc!u9J9mF$c91x1hdR7oy@V^(iRP{nntmRMhuf!*D<9$S)yzeV1Dl{AE&PF2*r*cmy@E-Kao^%&*O#QHd|2 zE^oUTDt2xx^^U0L1!gfS&UAAQcGvsA$U4N#2e3CCSK+7-e*vK;vj3)F2Tq^@ok#V% zZ0$Wtf_@%$qJ1>#w_gEjB1NdPpN86@QtYYAQAR;qTZIZ(XFh?Pj%z4sTF|XFDY>FL z7Kz56INEb~zi6bqqNdt~tHYHmVimFcpq?L#hokYPOFh?hO!lh7RgqZJgIAYj`O^~v zy{ek!k(fKR3+zaA(HA}pT>Ubm?iN#$> zG+ge*YrI&bGO{S{#qW;%Pp@2WR^o9*b-5SzVo(|Jmeml1&Rr6Ty^45lQ;)oPU9P&V RGQ1)Z^=2j}SU$Nm>0dB;q`v?F delta 3556 zcmYM#dyvjm9LMqR?pkZf-VkDQ4F;>9Ss07cV;>$1<|HA56okimD zanw5PFoE^04;LCZBz(hc0;<9pr~!-I<*13)V+Y!ff{Odq z+tC60svAkDfsIfD+o3A#i%MiLYQeFXhHoHq*hvrnTTuz__5Krn|7+CN|LE;IsQLcJ zB)$Jt`Fhj9dZ>&uPy^bdD(rV{OhheM2en{2DzT2J1^S{U%t2L@hl&eO^DIThuf^~VxqDIT z9mPNue#3WsI7h#HPL+RimOoxUqB_8 z!b`6ss)L%R8S2MsF6voXfX8q(Dv{vDMv=1~=jNj(dK0zK0@T85P)D!>wWWtqaUt*j z*4uYbapm5QYixFeb~4_^^H_i-P0XH;;{5xtpF^X}-fK#hc&`~h$@qG67RBNg;XoU~ zKA)t$yS3RRCJ5Sa44Cr-zhu#7P1{B)kL?h7_>z$q%37h$ys!HL>Zqn;n%@6~T-4yk zrtl531K5!E1+0qqQEx-VOf!{xP|UgtikJZ) z0*`vYIb;*;7HXnu9U~Q_B9Du;LrpXoHEujA;Tfo-S%W;_wi#pai1!~y6>t-?F@YyI z&>0WnLLFmpIW9m=Sf_L3es|;)Y%Fq0wgi>HUQ|LM)cD(|gp;$_9jt{+WrL8@v4yCF z4`K$M&SL*H!2@m#z*HV(b-awKWTm?iHE@Tw4`Ukb5b_wOqrKx5Rx*{B7ExD${+3;57CVKJ(b5GpRdhZ!%3)klqg z7L`aY@{-tiZ%;xc6y$TEfpf4HzUu)yQQvI)P+M1qs_ZW6>3@hVu}XI2tUI9=oPvC} z*c|smY)|_Hs{bK|ceZEP!0JXWtT`&vj;N=$yW0yp(0;X)I&Mg?{WcbGkg3e3egoQnFDn}ter4(iMcQ9JYw>MM3F zDv|A|`HJ0h$fnsXw4Ql+4aQ8EoLjV_>ck4Mc~i#b<}Hg&X;m~lr69Jbtme>qSvL;7 zeWUn5X~Fhuht`%AE-o$jeYz`OUpJe6yS{DP)qS%o Tm(ANyRFXM7zNl$-NrnFal{bRx diff --git a/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po b/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po index e1d37d3..4efa6ca 100644 --- a/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po @@ -698,10 +698,6 @@ msgstr "" msgid "ai:simple" msgstr "簡明派" -#. Analyze again but allow only nearby moves -msgid "analysis:local" -msgstr "近辺の応手に絞って分析" - #. status message msgid "local analysis" msgstr "近辺の応手を分析中" @@ -783,3 +779,20 @@ msgstr "Inserting exchange done and copied {num_copied} following moves." msgid "finish inserting before navigating" msgstr "" "Navigation is disabled in insert mode, finish insert mode by pressing 'i'. " + +#. TODO - in new game options +msgid "player names" +msgstr "Player Names" + +#. TODO - Option in dropdown to insert some moves between the current and next +msgid "analysis:insert" +msgstr "Insert moves" + +#. TODO - Status message +msgid "analysis:region:start" +msgstr "" +"Drag to select the region of interest. Selecting a single point removes it." + +#. TODO - Restrict analysis to a specific region +msgid "analysis:region" +msgstr "Set region of interest" diff --git a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.mo index 94a611d37a4a5ec0988c5ab3ea04641c59c26c57..0a42567fb69f4b01e00e5fc8532ba14c7bf93464 100644 GIT binary patch delta 3663 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 SbrF7sg#CN$tx9&$F8>?Z4Uhi- literal 0 HcmV?d00001 diff --git a/katrain/img/insert.png b/katrain/img/insert.png new file mode 100644 index 0000000000000000000000000000000000000000..f1a7a01fa164c784afcdb5414420c58d693bcdc2 GIT binary patch literal 4156 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' - size_hint: 0.1, 1 - AnchorLayout: - LabelledIntInput: - input_property: "trainer/low_visits" - Label: - size_hint: 0.1, 1 - text: i18n._('visits') - Label: + AnchorLayout: + LabelledIntInput: + input_property: "trainer/low_visits" DescriptionLabel: font_size: DESC_FONT_SIZE * 0.8 text: i18n._("show ai dots") @@ -396,7 +388,7 @@ spacing: CP_SPACING padding: CP_PADDING DescriptionLabel: - text: i18n._("names") + text: i18n._("player names") AnchorLayout: LabelledTextInput: text: ''