From b95897562870a7ec2113a5e2d4e5eefbb981ecef Mon Sep 17 00:00:00 2001 From: Sander Land Date: Sat, 5 Dec 2020 20:21:02 +0100 Subject: [PATCH 1/2] play to end/collapse --- LICENSE | 1 + katrain/__main__.py | 11 ++- katrain/core/game.py | 51 +++++++++- katrain/core/game_node.py | 31 +++++- katrain/gui.kv | 12 ++- katrain/gui/widgets/movetree.py | 91 ++++++++++++++---- .../i18n/locales/cn/LC_MESSAGES/katrain.mo | Bin 13977 -> 14213 bytes .../i18n/locales/cn/LC_MESSAGES/katrain.po | 14 +++ .../i18n/locales/de/LC_MESSAGES/katrain.mo | Bin 16137 -> 16373 bytes .../i18n/locales/de/LC_MESSAGES/katrain.po | 14 +++ .../i18n/locales/en/LC_MESSAGES/katrain.mo | Bin 15399 -> 15635 bytes .../i18n/locales/en/LC_MESSAGES/katrain.po | 14 +++ .../i18n/locales/es/LC_MESSAGES/katrain.mo | Bin 15533 -> 15769 bytes .../i18n/locales/es/LC_MESSAGES/katrain.po | 14 +++ .../i18n/locales/fr/LC_MESSAGES/katrain.mo | Bin 17240 -> 17476 bytes .../i18n/locales/fr/LC_MESSAGES/katrain.po | 14 +++ .../i18n/locales/jp/LC_MESSAGES/katrain.mo | Bin 17641 -> 17877 bytes .../i18n/locales/jp/LC_MESSAGES/katrain.po | 14 +++ .../i18n/locales/ko/LC_MESSAGES/katrain.mo | Bin 17173 -> 17409 bytes .../i18n/locales/ko/LC_MESSAGES/katrain.po | 14 +++ .../i18n/locales/ru/LC_MESSAGES/katrain.mo | Bin 21963 -> 22199 bytes .../i18n/locales/ru/LC_MESSAGES/katrain.po | 14 +++ katrain/img/Collapse.png | Bin 0 -> 6200 bytes 23 files changed, 281 insertions(+), 28 deletions(-) create mode 100644 katrain/img/Collapse.png diff --git a/LICENSE b/LICENSE index 9911f0c..5690eb2 100644 --- a/LICENSE +++ b/LICENSE @@ -7,6 +7,7 @@ For on related licenses for these binaries and libraries see https://github.com/ - Equalize icon and Thrash Icon: derived from work by bqlqn 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 +- Collapse branch icon: derived from work by Kirill Kazachek 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/katrain/__main__.py b/katrain/__main__.py index 8c5c24c..01b1493 100644 --- a/katrain/__main__.py +++ b/katrain/__main__.py @@ -324,6 +324,9 @@ class KaTrainGui(Screen, KaTrainBase): def _do_analyze_extra(self, mode, **kwargs): self.game.analyze_extra(mode, **kwargs) + def _do_play_to_end(self): + self.game.play_to_end() + def _do_select_box(self): self.controls.set_status(i18n._("analysis:region:start"), STATUS_INFO) self.board_gui.selecting_region_of_interest = True @@ -498,6 +501,7 @@ class KaTrainGui(Screen, KaTrainBase): "g": ("select-box",), "i": ("insert-mode",), "p": ("play", None), + "l": ("play-to-end",), "n": ("next-mistake",), "b": ("undo", "branch"), "down": ("switch-branch", 1), @@ -517,7 +521,6 @@ class KaTrainGui(Screen, KaTrainBase): def _on_keyboard_down(self, _keyboard, keycode, _text, modifiers): if self.controls.note.focus: return # when making notes, don't allow keyboard shortcuts - popup = self.popup_open if popup: if keycode[1] in ["f5", "f6", "f7", "f8"]: # switch between popups @@ -552,6 +555,12 @@ class KaTrainGui(Screen, KaTrainBase): self("undo", 999) elif keycode[1] == "end": self("redo", 999) + elif keycode[1] == "pageup": + self.controls.move_tree.make_selected_node_main_branch() + elif keycode[1] == "delete" and ctrl_pressed: + self.controls.move_tree.delete_selected_node() + elif keycode[1] == "c" and not ctrl_pressed: + self.controls.move_tree.toggle_selected_node_collapse() elif keycode[1] == "n" and ctrl_pressed: self("new-game-popup") elif keycode[1] == "l" and ctrl_pressed: diff --git a/katrain/core/game.py b/katrain/core/game.py index 00d8bac..00b1ad9 100644 --- a/katrain/core/game.py +++ b/katrain/core/game.py @@ -93,6 +93,14 @@ class Game: self.set_current_node(self.root) self.main_time_used = 0 + + # restore shortcuts + shortcut_id_to_node = {node.get_property("KTSID", None): node for node in self.root.nodes_in_tree} + for node in self.root.nodes_in_tree: + shortcut_id = node.get_property("KTSF", None) + if shortcut_id and shortcut_id in shortcut_id_to_node: + shortcut_id_to_node[shortcut_id].add_shortcut(node) + threading.Thread( target=lambda: self.analyze_all_nodes(-1_000_000, analyze_fast=analyze_fast, even_if_present=False), daemon=True, @@ -264,7 +272,9 @@ class Game: n_times = 9999 break_on_branch = True for _ in range(n_times): - if not cn.is_root: + if cn.shortcut_from: + cn = cn.shortcut_from + elif not cn.is_root: cn = cn.parent if break_on_branch and len(cn.children) > 1: break @@ -276,7 +286,11 @@ class Game: cn = self.current_node # avoid race conditions for move in range(n_times): if cn.children: - cn = cn.ordered_children[0] + child = cn.ordered_children[0] + shortcut_to = [m for m, v in cn.shortcuts_to if child == v] # are we about to go to a shortcut node? + if shortcut_to: + child = shortcut_to[0] + cn = child if ( move > 0 and stop_on_mistake is not None @@ -512,6 +526,39 @@ class Game: engine, priority=priority, visits=visits, refine_move=move, time_limit=False, report_every=None ) # explicitly requested so take as long as you need + def play_to_end(self): + cn = self.current_node + count = 0 + if not cn.analysis_exists: + return + + def analyze_and_play_policy(node): + nonlocal count, cn + cand = node.candidate_moves + if cand: + move = Move.from_gtp(cand[0]["move"], player=node.next_player) + else: + polmoves = node.policy_ranking + move = polmoves[0][1] if polmoves else Move(None) + if move.is_pass: + cn.add_shortcut(node) + self.set_current_node(node) + self.katrain.controls.set_status("", STATUS_INFO) + return + count += 1 + new_node = GameNode(parent=node, move=move) + self.katrain.controls.set_status(i18n._("playtoend:status").format(num_moves=count), STATUS_INFO) + + def set_analysis(result, _partial): + new_node.set_analysis(result) + analyze_and_play_policy(new_node) + + self.engines[node.next_player].request_analysis( + new_node, callback=set_analysis, visits=1, + ) + + threading.Thread(target=analyze_and_play_policy, args=(cn,), daemon=True).start() + def analyze_undo(self, node): train_config = self.katrain.config("trainer") move = node.move diff --git a/katrain/core/game_node.py b/katrain/core/game_node.py index 5fdfda2..c3995ba 100644 --- a/katrain/core/game_node.py +++ b/katrain/core/game_node.py @@ -57,9 +57,26 @@ class GameNode(SGFNode): self.time_used = 0 self.undo_threshold = random.random() # for fractional undos self.end_state = None + self.shortcuts_to = [] + self.shortcut_from = None self.analysis_loaded = False self.clear_analysis() + def add_shortcut(self, to_node): # collapses the branch between them + nodes = [to_node] + while nodes[-1].parent and nodes[-1] != self: # ensure on path + nodes.append(nodes[-1].parent) + if nodes[-1] == self and len(nodes) > 2: + via = nodes[-2] + self.shortcuts_to.append((to_node, via)) # and first child + to_node.shortcut_from = self + + def remove_shortcut(self): + from_node = self.shortcut_from + if from_node: + from_node.shortcuts_to = [(m, v) for m, v in from_node.shortcuts_to if m != self] + self.shortcut_from = None + def add_list_property(self, property: str, values: List): if property == "KT": try: @@ -121,6 +138,14 @@ class GameNode(SGFNode): *comments, f"\nSGF with generated by {PROGRAM_NAME} {VERSION}{SGF_INTERNAL_COMMENTS_MARKER}.\n", ] + if self.shortcut_from: + properties["KTSF"] = [id(self.shortcut_from)] + elif "KTSF" in properties: + del properties["KTSF"] + if self.shortcuts_to: + properties["KTSID"] = [id(self)] + elif "KTSID" in properties: + del properties["KTSID"] if note: comments.append(f"{self.note}") if comments: @@ -178,7 +203,11 @@ class GameNode(SGFNode): cur.update(move_analysis) def set_analysis( - self, analysis_json: Dict, refine_move: Optional[Move], additional_moves: bool, partial_result: bool = False + self, + analysis_json: Dict, + refine_move: Optional[Move] = None, + additional_moves: bool = False, + partial_result: bool = False, ): if refine_move: pvtail = analysis_json["moveInfos"][0]["pv"] if analysis_json["moveInfos"] else [] diff --git a/katrain/gui.kv b/katrain/gui.kv index eb5b3a3..1613850 100644 --- a/katrain/gui.kv +++ b/katrain/gui.kv @@ -650,9 +650,10 @@ font_size: self.height * 0.5 size_hint_y: None - height: 50 + height: dp(50) background_color: BOX_BACKGROUND_COLOR - content_width: icon.width + label.texture_size[0] * 1.33 + width_margin: 1.33 + content_width: icon.width + label.texture_size[0] * self.width_margin MDFloatLayout: id: icon size_hint: None, 1 @@ -716,7 +717,7 @@ : on_close: app.gui.analysis_controls.close_dropdown() background_color: LIGHTER_BACKGROUND_COLOR - height: 45 + height: dp(45) canvas.before: Color: rgba: WHITE @@ -777,6 +778,11 @@ icon: 'img/ai.png' shortcut: 'enter' on_action: root.katrain("ai-move") + AnalysisMenuItem: + text: i18n._("analysis:playtoend") + icon: 'img/ai.png' + shortcut: 'l' + on_action: root.katrain("play-to-end") : diff --git a/katrain/gui/widgets/movetree.py b/katrain/gui/widgets/movetree.py index 844dd41..ca36e0a 100644 --- a/katrain/gui/widgets/movetree.py +++ b/katrain/gui/widgets/movetree.py @@ -25,6 +25,7 @@ from katrain.gui.style import ( STONE_TEXT_COLORS, WHITE, YELLOW, + GREY, ) @@ -84,23 +85,43 @@ class MoveTreeCanvas(Widget): self.menu_selected_node = selected_node def delete_selected_node(self): - if self.menu_selected_node and self.menu_selected_node.parent: - parent = self.menu_selected_node.parent - parent.children.remove(self.menu_selected_node) + selected_node = self.menu_selected_node or self.scroll_view_widget.current_node + if selected_node and selected_node.parent: + if selected_node.shortcut_from: + parent = selected_node.shortcut_from + via = [v for m, v in parent.shortcuts_to if m == selected_node] + selected_node.remove_shortcut() + if via: # should always be + parent.children.remove(via[0]) + else: + parent = selected_node.parent + parent.children.remove(selected_node) self.set_game_node(parent) self.is_open = False def make_selected_node_main_branch(self): - - if self.menu_selected_node and self.menu_selected_node.parent: - node = self.menu_selected_node + selected_node = self.menu_selected_node or self.scroll_view_widget.current_node + if selected_node and selected_node.parent: + node = selected_node while node.parent is not None: node.parent.children.remove(node) node.parent.children.insert(0, node) node = node.parent - self.set_game_node(self.menu_selected_node) + self.set_game_node(selected_node) self.is_open = False + def toggle_selected_node_collapse(self): + selected_node = self.menu_selected_node or self.scroll_view_widget.current_node + if selected_node and selected_node.parent: + if selected_node.shortcut_from: + selected_node.remove_shortcut() + else: # find branching point + node = selected_node.parent + while len(node.children) == 1 and not node.is_root and not node.shortcut_from: + node = node.parent + node.add_shortcut(selected_node) + self.scroll_view_widget.redraw_tree_trigger() + def switch_branch(self, direction=1): pos = self.move_pos.get(self.scroll_view_widget.current_node) if not self.scroll_view_widget: @@ -120,24 +141,36 @@ class MoveTreeCanvas(Widget): root = current_node.root + def children_with_shortcuts(move): + shortcuts = move.shortcuts_to + via = [v for m, v in shortcuts] # children that are shortcut + return [m for m in move.ordered_children if m not in via] + [m for m, v in shortcuts] + self.move_pos = {root: (0, 0)} - stack = root.ordered_children[::-1] + stack = children_with_shortcuts(root)[::-1] next_y_pos = defaultdict(int) # x pos -> max y pos children = defaultdict(list) # since AI self-play etc may modify the tree between layout and draw! - children[root] = root.ordered_children + children[root] = [*stack] while stack: move = stack.pop() - x = move.depth - y = max(next_y_pos[x], self.move_pos[move.parent][1]) + if move.shortcut_from: + parent = move.shortcut_from + else: + parent = move.parent + + if parent: + x = self.move_pos[parent][0] + 1 + else: + x = 0 + y = max(next_y_pos[x], self.move_pos[parent][1]) next_y_pos[x] = y + 1 next_y_pos[x - 1] = max(next_y_pos[x], next_y_pos[x - 1]) self.move_pos[move] = (x, y) - children[move] = move.ordered_children - for c in children[move][::-1]: # stack, so push top child last to process first - stack.append(c) + children[move] = children_with_shortcuts(move) + stack += children[move][::-1] # stack, so push top child last to process first - def draw_stone(pos, player): - draw_circle(pos, self.move_size / 2 - 0.5, STONE_COLORS[player]) + def draw_stone(pos, player, special_color=None): + draw_circle(pos, self.move_size / 2 - 0.5, (special_color or STONE_COLORS[player])) Color(*STONE_TEXT_COLORS[player]) Line(circle=(*pos, self.move_size / 2), width=1) @@ -152,7 +185,7 @@ 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} + special_nodes = {current_node: YELLOW, self.menu_selected_node: RED} if insert_node: special_nodes[insert_node.parent] = GREEN @@ -176,9 +209,10 @@ class MoveTreeCanvas(Widget): 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), ) - draw_stone(pos, node.player) + collapsed_color = LIGHTGREY if node.shortcut_from else None + draw_stone(pos, node.player, collapsed_color) text = str(node.depth) - Color(*STONE_COLORS["W" if node.player == "B" else "B"]) + Color(*STONE_COLORS["W" if node.player == "B" and not node.shortcut_from else "B"]) draw_text(pos=pos, text=text, font_size=self.move_size * 1.75 / (1 + 1 * len(text)), font_name="Roboto") if current_node in self.move_xy_pos: @@ -209,6 +243,9 @@ class MoveTree(ScrollView, BackgroundMixin): def make_selected_node_main_branch(self): self.move_tree_canvas.make_selected_node_main_branch() + def toggle_selected_node_collapse(self): + self.move_tree_canvas.toggle_selected_node_collapse() + def scroll_to_pixel(self, x, y): if not self._viewport: return @@ -249,14 +286,26 @@ Builder.load_string( MoveTreeDropdownItem: text: i18n._("Delete Node") icon: 'img/delete.png' - shortcut: '' + shortcut: 'Ctrl+Del' on_action: root.katrain.controls.move_tree.delete_selected_node() -background_color: LIGHTER_BACKGROUND_COLOR + -height: dp(45) + -width_margin: 1.6 MoveTreeDropdownItem: text: i18n._("Make Main Branch") icon: 'img/Branch.png' - shortcut: '' + shortcut: 'PgUp' on_action: root.katrain.controls.move_tree.make_selected_node_main_branch() -background_color: LIGHTER_BACKGROUND_COLOR + -height: dp(45) + -width_margin: 1.6 + MoveTreeDropdownItem: + text: i18n._("Toggle Collapse Branch") + icon: 'img/Collapse.png' + shortcut: 'c' + on_action: root.katrain.controls.move_tree.toggle_selected_node_collapse() + -background_color: LIGHTER_BACKGROUND_COLOR + -height: dp(45) + -width_margin: 1.6 """ ) diff --git a/katrain/i18n/locales/cn/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/cn/LC_MESSAGES/katrain.mo index 8459233755f387725f61236a11740f395f9ed4e3..b7e88de5f4b45e3021736e12ef3292637000999b 100644 GIT binary patch delta 3758 zcmYM%3vA727{~Ef(N;&>RcYOidns)(moT#p-GaGf-K??2jykDYdyciI=v+?3TxOd~ z#fG@ej0uL6ZNz29ESPK-D2 zt#JHzfqyOeR}-zsxdV;J7bMql;_cSHA9dnm7N0@&yNK+`Rinn=M`a+IQ>eWeYMwN+ z532tV45?!d1wJmHFLf+K=5PxvUWq!f}tqb4|x%3LKj#v0UktxnO!qc-3{)n}r{ z4MaZfg(UK?!t2&hV$MZPyc{*bR^;Qpy1&&zel}jE~ENiL!Iz%Bq{CzY6D56L*rVa7VeI! z?{D!C)W*hOqJICcQP9c!=3G=pR-*2DJ?f#{jhbj5Dl6a9!<=#sVHL~Yk7(%=xGVm!nR+5jAcbYC{K5&&+YuxHDFN2{rEx zRR24uOx5STTpwFB=l(UIEfsodGf)c+L+v;hxo+o2O)$^eKS166Csx1LJdQfqIcu** z&37NQP6HOvyiIW$rneyfZ7F4>MGlaO z%FuAs_#AA5ld%Ub!hU!Fb%47e3Y{s`XZ1AfjvDwf>aGe=&%$hc3g_Vq6wR$+B;w=_CjrFE9zO< zg}VDgsLY)(E6uCsU*;2qcX4-yW%d3 zFQVT4w@?#CWjOaVCZPI{HuJ20Dk>9SAh+axu=s8U_s{d-;xi)yvycbd4Mq)^VD&RF zi+C||D0djirmI11AeBZQ57!YB@Oe~VTCNU(O=`YWRZ+W#T?+1Bv`t z`RTh%OvK@+_E*hf)D| z=AssufLbtM@lO@N|UTtncEwl$U-!atq3s!#xwQlG(1)VgmS7bmZ#9(9-l(^86kQf-As=eK>E=Atg5~Bab3<6}e+vaYOrKf91@nq|12y5F z<^!v5&?ho+A}ZA>I2}8q`fo6IpfkIc?Jgx3%yfHe4b~Ez5cvO6~87t z6BS$NEei&G{)rW-Nj3Eo9!332g5F?hNkvrZ+Sr7l)2Dd-6EhzTuUO~V6PKFpEeU$2 z&_7Tb^aKN*d~cD@qj|=ppN|@ex#Px;G}S)XIepUl4nYwupqC@QxYup27UQu r-I&JbWn0s{1wl_nMuumGzqDw4QDCaCWR@pPcp=}!jEb~gZ`S<}cc+^_ delta 3533 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 F>Ob)%q0j&T delta 3533 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 delta 3533 zcmYM$dyvjm7{Kx48fn*hv6dyfxnxu0w-vKKo{>DAsQFgl zzvKLC&cE+#TMOa!wEt~FaS8RtxB(mB4$Q*uupa&r>sK*By$s+ z^DL&bet4OJ1Lxju2;p6Hha1rW+oSu?i4I~7Jd5u9*ZBMz8t|>yUWZlOX(J@I&>Vf< z0iCzIvVJI};6ww_j>FNNj!oPFmB?CQJvzP&-TAKg{0KTvW%M%I{}$RW zja??)X$~KD?1DTCg|R*ajreJF=i|`{9Aw6pVnf`3j^Bp-g#&yT;E%EWH+0-}bm7{3 zSZ|sj{}%FSaKc{bz`@90c#03kgvn@NbJ2iSqW#v!`lo1ywxOBWk9F_}+V3Q~&Utj5 zn`qz}4avV})S8+D^U=%I6YV%S*2ka$%#JRJ&)1+wv;`fvGx`IvM!0}3T!n6=K54XH zE}F5PNeXrx5F3hOeH=P)7CNvL-Qj99kWJ`B+c6stBWr|<=zP_P-kmp!w!(X;cR|NL zj&3+PmVzmL2~Al^?63e`;B92i@F}{$Ui7^`j!twXT8++*Peik^DfQOqM*5FwpT{~KzH;vnyG4hYZ+iVI=&^^o`h&gv3?#6>;}4_8l+FN zu(t1iM+%;CSM)LtKqnrAW@IEf!8mk*De?Inbm3Aoz*XqPo6z}oq8mGe_B)Ht^B3CR z^GP~kIt9%}7i@>_vx%{aze_ zW+<6W{>esIPJ=u61V>;wF2i(w5(nd2Y=@WeZp>;CGlc$X7NQeBiJfsi_Qo&Jz^=sh zD$J+enMv4lC{9xFwVH-rwo)93OYtH62@hb4mLc@RbLdgz<)kuIfG*G6HV_RFOXOrhk zcnB+SSGy1%s20K^4)`GTiuNJQ!M8i`Dp%*I$oK8b*(sHQ#pvzdgqf@#zNEnY2nW$r z{f@*GuAw{2
    EwrJ#q=uRGu^^xf19fObHY;?W~^pc)M=e>?O8174r&&4{dAMz=9 z_T6m2-k5>?V*4=kk`Vy( zDR@SYqi;ho*2k$>i1TB8Kk_9Oj^SXugzmI&m(=T3gf1`_Ij!)1tnWikGn|g~8U?BO zTNIH09z5ts1IHM~U@v?F6Ig+)5l&)5OzWCTaV~N?VIsQY)##aSL{nXk8MqsHlfz-; z8ib2zz|Gh-FIMQ*jr`j%j0Pj0gr;V3^iAacg;i)qzDAGgFq*Mr*Z@z(=ac1s7a|M!p=KcvWm)hhDnP@%dIXkUeO?N6<6AfNtal=3s)f zy2AoAGmjz19-cuLUXHv#A^8CXC#*nsb^=}S6!P|j^XPZ@MKrK$*aUB)0VH~++VjyP zEI|7gqdOgq2Jm8hJ{!Fo8;}hr!?*FlG4!>oLXIii!$t58j6f$Ck4`uP4R{`!xs}N4 zAKs6yMeodq=!TA>Z^sEVurp}Je!(=~|3Bk{Ds;kHy;ENl>3D{ECp07V`=kPCj*Y3e zj~1c<4MzhWi+;7vL>DYUGdCBVzZ4B@1t!{1c!z=$Y{o3yfiCzxK8%%p%C@H!RWECw iQCPjKBvDzbY*N;gx@A{$E7Qs@bY5Sl?AM<8HU9%P#$Fx( diff --git a/katrain/i18n/locales/en/LC_MESSAGES/katrain.po b/katrain/i18n/locales/en/LC_MESSAGES/katrain.po index 9d3a04c..3663e67 100644 --- a/katrain/i18n/locales/en/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/en/LC_MESSAGES/katrain.po @@ -118,6 +118,16 @@ msgid "analysis:region:start" msgstr "" "Drag to select the region of interest. Selecting a single point removes it." +#. Menu option +msgid "analysis:playtoend" +msgstr "Fast playout to game end" + +#. Status message +msgid "playtoend:status" +msgstr "" +"Playing game to the end with policy strategy, please wait ... {num_moves} " +"moves played." + #. Keep improving current position analysis when there is nothing else to do msgid "analysis:continuous" msgstr "Toggle continuous analysis" @@ -759,6 +769,10 @@ msgstr "Number of visits per move" msgid "Delete Node" msgstr "Delete Node" +#. on move tree editing +msgid "Toggle Collapse Branch" +msgstr "Expand/Collapse" + #. on move tree editing msgid "Make Main Branch" msgstr "Make Main Branch" diff --git a/katrain/i18n/locales/es/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/es/LC_MESSAGES/katrain.mo index 202c0f63145e5966c9b4f943cd8824bd290fadad..f36f7d93956541035c988d5810ef08587d062e1c 100644 GIT binary patch delta 3757 zcmYM$4NR3)9LMn^BH$Y+D1!L%V5#^9nxZ7yv;@nRW;0)ArgzAY!VAe&yE(jbq?olV zltyiqX(_&?cC+DoYJ(|i(-cdS%$XK4Rz@Xi*7tYsakA<$wO?JkNE9_x&Zl zy6Dg{!@rCCb>pugOf_Q;wEy2O6c1AGjOVc<-o!Zk2isz7WU$@~qp7E3Pn>A$ZtOsP z8HQsi^6{Au_>SVj7F2`1))Ux<`X$tW*O9qQGsa>#o!Vg!48;Mc00*PmXJS{Jft}EU zt?>=iJZmtL`OPO3)X^WfV9asU3co{jsJAwu2D*<5Acj#|Vt-Tyl2PqPq5>ahuTMg) zcqS6N$+GtsU~A?#MJiwkYM^&f4cDPoyxrd4hg$L1wtfcH?h+D{sYms{gUUb{tI+*; z)Hq4j;i&fG(5Hq|DDW{ke5s)q8N-y=dO2!En@}0pjT)c|mAP7s!3I=+%}&uoq5^PG z*HcjaMk62dOf>mdVUE2~Xe~w!yaqME7UW|p`O?5Or~ogc0&7IIYqs?WqEV(|P#JMB z0tcenrD7lhG2~wpP2mC`^Aca$tEH%pD^Pn~ifXsT)(@issI}g(_iv-NGLkf@Uz{}s ziOpo9CZ2&>NUqN|Sb|DXDXQUmTld@g5md)>sE*fAEBp%;NK2yAgq<(}2OzPS@u=}; zqE_y<7GW>yzPBi7fSsrne}zivNmR-%*!x#d6a0?MX(Fg-g6^pIz!20p6Ra~){qw8~ zF`oKT)I!RU$JS>mDCnKD1NoRQ_)>!!RK%C8^{9!PF_2>3N@^E}T456Edb%|OwV+9; zOwB|EIM3eq2ClRJ#T1nKcLEoT`4BbWHdKd0)^AWRnk%UGKciOo2a*(X4;4T(=}^CJ zsEG%mu8*|!aj3v1V+TF|vnXg~Zfh|rBju>Q{s?s_ccTW{i^|L~)IeuZ6V=)KH&Frn zi3&7~ylebUsPX!t7MPAcHJnI61IYWqy%o#HlwROHD6qK?WJc@Ow)PBs{LBDRhQHN#^ zmSHvOaL#%tn3=h#6&Ik|c~Pl;6P5aMR6v_iXR8u5Ulnqwedc?6;V0ApO{f9F*pGu4 zgUxsbpT?Tr#{7s~`mnF~H@0YD%&oq`_DxCr?oYuUvD(VUB*9N?b zsmjH2Hb{}}$DVi`74fgA6y8A|ZPPI&xT1c@TqX^5n&+SbUxW&LC2ECb$P;KPZ2bso zymP39+{C`xixGo^r*bx`qX)^dDM7trw_+q7LY;+EsJ%OD{Q>njT}K7dfa-T26=3ub zegQEFwRKOS0(};JYB-C6dTO(^&ncMco1?7j2E@?ji>;(qPBcbD*0E3V_e`-H)nAmHlof#!th|E>8KSME+;4UEO#Ft8wA0$OlapDm=Jp6jXD0as%@#3*FCZdDB5fpgmnCYkvi;;6 zL}lnM>I`(@t)oD?V+i&~1vm&b(J-8bqfq_UqE@^M)$TNsNuN1yFWg3L#lNT(M2_Ud zVmDL(8L0anWKpIVwH5o3Z8vqO)W&cy)UFRI^{J?U9z$g+6In!)PxG;t~GRYFo5=`0UYaK)R`HB<8kt6|El&gLSm=n=j7yNJ5S{2<+%z9vz^Bm zxZGLu{8yvKhD7AKyq^4Q_gsHmbVIAC2epxf9+zifp+6*USevMfR|{P3xhW62`%`<} zZWov7D)cx7w9jAYaXk4>j%$9lqj3hN6t$kp^;~yO@FF)o^8)vr#krn&PC)U delta 3533 zcmYM$3y_Xg7{Kwf>weo^pKV*$-9_%AC6`S*JB^Vj*K%16snE!1*czi&UyW%C88vRL zgp!F&CbLBp2~(p6MKWb7mqAoYDicHf|NEVp%Q7-o!QAB5;d0w z{vGAF1;1a{wiUvQjsEvWE*H|i0oP$;{19_-KQ_QKvHb@oXgA0RArD)j?PAQr;aCSB zM1GQCDxaC$n2mOr7hQq%X>UX)*n-R*_F)bl#fEqRYvNTjKqs?*4mQJ%n2r6h9*#xV zc?dIDKRnKb1Ls!X2%!?qa6LL;dvq^4(E+T1r_jvL#^;yNfUm{-by>wsvys?B3-ozs zblzUd`k{miCmMuy9ED~&$qrbCW;!Rf=cE0WAZvxS==dr$^N-{6L+CswqQ9a2uc7@K zk!8|M^ZBr2A@VGg#P)DB;t6QxQ_%?=WW^R?6I_Rm--i5z&-gIFZ{z)+&~bmG3)kku zcGCp)_o5>=oUkuCa47N<#`D3LFar&2E*j7hwBPF3-h@_Y8(N7^u`V7$`yE5qIghS$ z1r0o_3H5i6+R}1h7xZxTK|2nO?MY|=<Jk+6G(GE=0%Q zhbEky%!MVLiI!|m>`;L&upF5)Y(f{(qgBU<`i z)ou2_KNn6o93Aj*^a(WL3Ut5%G{Z_H>F@?R@dxO*-RJ^`W{YX!JBa=_QBV&H-3jElxP*g zZP*6;;skWv$|M(Nz6CvO`*8psLMLjP$Dd>zfevh+pW2Fv=){krsjwJ5)qAi99!Fk)kWIsi6r%H&Vgk#0 zQ2&8kRB)ph52CM0M$c5lgV2dfF$3qLC9Xu@=hJBBnPg#rIp|&&p#8fcZ*nL`jzuU% z&%pC&pl{tu{mo!6H{6>u=xMLlD^;Qdat=caY=C#5TQvmjHxhI3eyq+2&A1}^Ci)uh z#w@&wb+92{4hEc^keiE(Vx!7*V zx0PGa1P#13^5%x_=)z-D&y(Q=E(j_tM<+OlY-{)fEou9r)I>#S$?rk~8G%-)6w`2W z^bsV6FcsaZwdlC@Xo8z#dn@|?&#;RNCp?T!cnmG=S$qwzqZL`n$uyGUiZmDj6U+P7xS{{W-}QRe^v diff --git a/katrain/i18n/locales/es/LC_MESSAGES/katrain.po b/katrain/i18n/locales/es/LC_MESSAGES/katrain.po index 1164e3d..45344fd 100644 --- a/katrain/i18n/locales/es/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/es/LC_MESSAGES/katrain.po @@ -812,3 +812,17 @@ msgstr "" #. TODO - Restrict analysis to a specific region msgid "analysis:region" msgstr "Set region of interest" + +#. TODO - on move tree editing +msgid "Toggle Collapse Branch" +msgstr "Expand/Collapse" + +#. TODO - Menu option +msgid "analysis:playtoend" +msgstr "Fast playout to game end" + +#. TODO - Status message +msgid "playtoend:status" +msgstr "" +"Playing game to the end with policy strategy, please wait ... {num_moves} " +"moves played." diff --git a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.mo index 00a6d1e39de5bb5823997ed39b33ff103d8454de..12c5a257b358b23f2e52a2f7a86652a5e505b980 100644 GIT binary patch delta 3759 zcmYM$dvJ_b7{~FGAd;$th*%=>q7{Sth_E?YM6Vz)^6aI;;W$G~*n=8v1<;CF8ew--2HdFrS*XB=+4ga$ z9Zx}GH+lB?Y>Z=lQ?3FoK~1y*)$v2rj=!+azd`NzkgcCW^{YW*GIgl&4X6ynunRqJ zi<+mawI8bgFbt~WBno^?0YB8S6q&;;vGvuc9es+*zz);|hf$e3gRSryYP?pbXyQ=; zIH>ka)VM*&$BaoN|0+zg5B$~&)Wnsj3AP{~vzs59_&6%S3#h>ULiMY+^;n`&rdpvg z;$STHK=td3;S97Q|5|7g4SdX-{Lon~Kn+}sI_s6Fep_t)J5&H?te5Tcd#Iy~CrujX zvSuQ&nGvXkb5R>94B8H5s1&V4b^O@YL$-bZHSjcQ;P0p%-a!S@i0HIn5~g4V5{ns$ znr{kf=RRvWcA_3!PC*lFN9}k&Dy1h-DLZSQUqmhNH?pRQrJ@B=QQrf-QS*$lPC<I+aCS&h85L9>~HzH_!AAM+JI)ZsWP;u>omYTd+i*cH{DZ5@u< z&^T14rl10xZl9Ni+d2OV3QGOE;Ra(qLQS|8HDI6hBH1&~NO zG_E~r;hw1WEL$Ij3Ty(l(EI-y1?|jdtw3dDHR`O_p)TbP)I@twnK_7>=x5YIwf6Z{ zQ~>{?0*xW>nm-9OUpLeSvoWZSV<~8&si*-nP!pC~7o!%eMD2J3YTQ;-KzmVl<}hm9 zDcfF)n)eE-|7}#Jn()2c1XJ2^{uY9S38on{5nEsn%tz)nD^RKW5_RbgVL2Yf zVjSrhlM`jkE-aybzhmSm-r}X!_%hT2tC7u{&DakQ;@jAOI=WyvVJk&Ta06DM1`c>C z^4skNR7S?&LiC_6=WnQ#)}ijiUDPEtPe;x+)*6qx8%d~fX{bBV1?e9&eJE&xEY#)8 zvGob~3H4WT8asW21=OdelTzwOuq|HU{QMZ*-I&ohC&QR@{GN2CVqH%b#@I{(!GvDC zaoDamn~4q@Gp|o%C+DAu{Kaw^mHMWA`Qrjpk!+cPs7y>nj@kH8cVh)A9b4on4HSEQ`5{;0wI&IVYgzt)Cs5)KMY~QkOBgo0f0gxB%ryF(ez H_iX$h+GVAP delta 3535 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 delta 3535 zcmYM$3v7;89LMqVYD=+Jy=|=*qo~pr)1tIB+OBb%kY>ZG$xKnf7`oQTnuka%Zb4>Q zTtc!%rjgl}S8UWeQM0gO%q5%I)-@ZYF2P7F-S++U`6rWlKj)n1od5sap0~ZcG0?I; z;QbN|f8X)%D*t=(|58WQoZA%jzt2+KOg$d=VRx*<1U!pf@lUHiz##Rm(a!b8Ua0yQ zjKLD@gyqPO=N9tWjfRz|4(rXG*oFE5RDi=sYsecbl!gP$o zV(g5is62Bpn*8o93L3b!y}`L1s1@!<4LE9^Lqy;6clI@s^fIjO6REqR-#r~WAzQFe%p~;?jzLr5NhRL+w+U4I8Ej~ zRR1wAkRSIgADZBg)_xN; z?lCHHM?O?f46^?!q|=~)xu}6tkstROAB=I!P!n5=n$UJszr9vJh}xkesGT^4k$4f+ z?;0x4EmWSTsENnKvi~}xRB9SH2z9wep*l{r`aIMG-Z3}Z^F62|I)oZmZ(c@nxK>o+ ze^CqR#x|;7AJmSG@+hd|IBO`i`h3*DRj7d*P%GSxnn*1w&{0gr3rG%k2Nf^C?6vYZ zvmf@Qo{btm4Ygpef`YbmIcm#ltiw7~f)9|G?jR~b1M0oMiVAe!4A5EQgJv=&Qcp!K zWDM#xor3y`c^Ucf+)O^zVHs-1Ys{^v#Cx%Qi&6dRQ7b%W?M>!w)QbK>?NoqoEln^Q zHNH2hJsq|6Iqh}MznFpomY@dAHLFlFUWXd65w*e{$fDhcsK8&M#+^VV_`%wLv-&O6 z#GarQ6vp<+1nj8ye=r4|@o>~-9ES=#1+^ouq5{lEC8)ILt5JzJpeDEr6}T1^uO79q z?@|4lQE?uj`s;i=1&pR3lTir=qE?~2KFKUYt?UhZ?xFf`K_%LQihBST z<8d5|L&z?dp!yw5X8(s#sH1^haraOIBKcK#7OQbN7C+})K7N6{@FD7L2vX6`q+uEk z#Zfo|2jf=Mg6gpd&tnP(d;8;uc@(sg@u=5gCeFs$W&;ilIM+XgXS7f6<0t$aHQ_qc zR$oHJxrL*#4K?9BUV2Ti8g)dgQE@h*eu;TEDCn}>##7jan#jq1{#k!#UO@$FLM6J5 zO8gJ%h~iTHEloxB%R)WRw|WVxUzybxVT0cPDhjPU$nDR&k7?{Vsbp25Y!zJvUJU$M`psV6?~+)s>e9_m~p)@RYT1Fvnizw!km{L5E`yoqibCXnCN zwikGRQD=1xxdyHk<1sSFulGV-nmmlc@u;_98uq}~@g-b=tjRT?`rR}iBd6)YNBTRF zitX?Ja20rvZx*2vPqg|h)Yes))%JWHvN>)yYWz2-JJE>TGxrB7PB=GGS|B{K0$49qqQe+)wPld<}}o}a;q=LWa=Jr zE!-~D#2Qf(eKeZ$Poj|Wf}bECb$e%`W;hqgG5_cKH ztBYxTjWttqPML22jLmikv~E5dTvOe|CdRjITwf1;a$|kj-djbH-9!;P>CO-E^nI|C~|HD^$67S ze6t7@XQDYByXpO(V;w5ZRTxjlHJBaXFCf%J&b;XFz;#rhJE(q7tv#mL@0Ws|Xdj09 z?U#?5NFnO%C!lty1iR~Ulu^*uE=C2cG2cT@$JG{xjz*Ps2xY_+bO_Z1n<7GQCNy^m TmG@f`8*0gE?Hn3hxIg?qZfskl diff --git a/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po b/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po index 4efa6ca..33ee94f 100644 --- a/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/jp/LC_MESSAGES/katrain.po @@ -796,3 +796,17 @@ msgstr "" #. TODO - Restrict analysis to a specific region msgid "analysis:region" msgstr "Set region of interest" + +#. TODO - on move tree editing +msgid "Toggle Collapse Branch" +msgstr "Expand/Collapse" + +#. TODO - Menu option +msgid "analysis:playtoend" +msgstr "Fast playout to game end" + +#. TODO - Status message +msgid "playtoend:status" +msgstr "" +"Playing game to the end with policy strategy, please wait ... {num_moves} " +"moves played." diff --git a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.mo index 0a42567fb69f4b01e00e5fc8532ba14c7bf93464..aa42ac63ec686f6a32f0fe853c9a5b0f6ac82bb0 100644 GIT binary patch delta 3760 zcmYM$32anF9LMp03oWe*Ep2JbRUQh;xj;nFB2c-E5Jd%o1rb)*wAHe0x?8bISrG+P zRG@%pf>-dUT&e4Ya#@wA7y*NLpak$tLGb{!$l>?5Z-`{s&&<4;|IGa7y|-PtFlqkc zq}ai%mMe{aU-Q2c|Bt1rX11mE|K?HLO1&L^j&1QM=HnT>5Odr3^@}l!`Vj1bH@JEj zGpWzVR=6Db#Ox`)Giazsb=d6u7%!lH02S~@WG-vQTx`Xli?9G&VsF#}`=k1g!46oA zIT*!sd)#aENTJSL}`J&P#FlI`WK=WKFYO^ zN9}kjvUZ#4u2*3?^INS7xCj+!8LHzN)Q;D?>u;lW{JyL2MfE#?tjU^C<4>V7kjgG} zy*(;U59c6M|4|rI$B7j9SP5V1ScAl{MXtUYwWAkN8E8NS*on&Ae$2*WsPUSeqP0OS zz(ck7Lya4XeC+xx@~^@ScOl|jfC^lP3Q&)H>@B_&co%Ac-=Y@wE2>|!tEaIVWhxt$ z5f9U_531i4n8-jj`PW1fY2agb@TIewhZ?vLb=J#K{pwwPJ8A*@ojTy?p7d3DnYT);%9sY${NDEe{33IR`_D0rX z*P`N0MeRK7ti_9|$Cgk~fK8|!??9#W6I9B+aMur^Cioqh)6%GDg3hS-zyMU7vCgTe z@#W5HY)^e2Y9p(W$2Mj!Q_wqS1M;!g_)>>ms1+Y@HlZeN#zcyFE2&>TYKJ{g?L(ZS zQ5zbM%G6ZU0!!WXnnXM2zkq^LzckTc_B1NsI@Ew|&fTaN%^_6(A5c5|6G@7lMlB$V zbZA^B)Wm&J?S-yB3bnACFjLR}Gz!{T*tr0ek=3ZPeg<_@HlPA+MrGzbRG`mL6CHHd zkD?ZE61C7&@~-$fsCYe58ytc$b-aOs0!>E^xDyqy#<>tRVI6A6&!fhzLoH|v>Ymw& z8n@TAA4J9d8P)#;DpM)Ems7A~2hLvuy3(M#Hh`LFENaEY$Z=a372rX4eHH5LUvTZO zJ9naX_JzCNgo<|xHBUN|C~hv^iM>0L|FIOFpkWLiL1myPKZU(;Flyr4@ez#RD|ikg z_)2H9VOUULb}3FnE$jj8iYt&V_682YeRv&acJY6lro<>*PD3?biS?)*A3=`Kno%jv z^2}yoCk*0z3?!L-htsKN@i41j6>=ZiT+~^wK<)TNyb9mJC3q6mKX(5m{z{kNr!;It z?Vz@s|LgWBl0937jkq3lb5?ZsGjkW}o>+uR@lw~m2K9c}h{|ZAYu|(FcNmEqvtKD_ zCF$f(H&He!>_*lM6(?|~%6 zicmWXp~h9Aj_?7@#x5{D1W_dGc0XQ&TTu%*hu2|dk^dLW6dXvs7B$hUsEmBz+=JT40aV;yP)GA` z!WaQ5+)6_WX3-92I7^&iRKRLffcsqiF;{;QJJ9|Tp1?+T{ml`6|3*}%_MndRTh!6~ zj#-l^B#rb}l!GbM^HB>aK)qVKqf#0`O>`w{ArnydLJ*a?8mz*{M#dj*U7Vadv7)4; zJmih6C@&9IMnc|*s$h6#Y5YjWHOXn^!J24AC_F2kpLHxH<9w|!5)DSHBk|BIl>}#pJjF>H_;32;8@W&xF7aEr8ZAv+ z^yZXBOTEg9^0JvVUL;x-jD|{T`Vb}*WLa~9Wl=8>2zd8~t7lK2U2#_^QtKs1Oca_G Kh$j!rPWca9h^tBf delta 3535 zcmYM#3rv<(9LMqhE25&@e7S=LD47UaB6*|mjl7gLm6$HmbmlG5)fAmsvNvOMilWxQ z)J!)WGi6%#I!#?vnmDaon0Z+(b6#?mQbv+Gv+s}RY&Cj6=bY!9|2gM>&hxl*xvyrK zFZi>+ZH@8YS^n?B|EJrjX0|Hof0HOyQBS~H?2Lyn8NbC&c-7T!p`UuEXtQ*D2vsk{ zSS-f&_%iYrv{HU!XjqKuu)?_!J5sMh1=xqgw&R$HXE73QVq3h2TA+fde_xuzp&P8Vv zs{egdzbJMY)J`+_QO7*wnFU*o`LoIVFvjMg7FK~;P&KOG7FXYm%FqE+CK|8|2m^AY8se}x?BTM9mlx(4AcUaIIGViyBw&`~jK6en(CG z0JV`A(x`r!sEiE^Qc%a?u3>_!&q57+12wP`wZl!Qh3r5DI*4i5h|FO(Q1N`MUOSI> zcE@hi^HAf*p*9?xNkJ){k4jm&>#z(p!Fxzd+l`vw2 z$Eg1MP?z-xYMu)zoWE9llLn5>!uVh-Kq{(34(iMYyY`XJiKv~;bKGMAC8Mq8K_Sq|Gg-DLxU!6!Ijv7e+qYEHJ0I!uH0Y@VGq28T3E_Myvvx4 zG}$ODz}fgL)*^FT6ZXT7>Adq;h}!U?AO()YR-;n99jD_SoQjDVW_^5Suj3Tz+nG)M z+Ve7VpR6 zyAb)Xm)ZnWdpFegpdTugBV7A9Y`q((otL2&uo`uD)}zL6!##Tc_flw~VJ3Mk!O4%1 zUi<_z*?DbGv*+P}Ul z;%-9jwe7?NY(Vw@34=<-B?`I>k^Q|L#iDL!76z~Y6=(@&U?rAd9V+kxREE+9c=Z74 z5>7%bbR8O7vkk8`bY4 z)X{wA>L;A%Fq!tN$aS#?s0`!|=KGIDgUP>Ew3r6D9+jH?&U$1{JBpgarv};a#3|)a%j<^}GP} z;VHp%oQB$Y1*YO!{J+c+PnRwZL1b zh225zB#iUY*(Rc%=OEd&JXfFVo|mEGE=Q7Q>+mUTMCJ`z+z{_mnT33;>{aCA+dHU< z8c?s%dFN%+4w_JbeF5)CVw`a}iS{Ja!WKB+biR#>w*sT|{#Uz(t*s4ayHKe-gw1#c zHQ;NOtqISdGISYrmVcs-B)rI5a02R%^u%z?MJ*%`^(7sI%489y>a3olpun?GXS@)V u+A5rnTZ=*mqb9To^@Q4vTu7#vbEJu9Y`#+Fjf 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 Date: Sat, 5 Dec 2020 22:00:03 +0100 Subject: [PATCH 2/2] fixes --- LICENSE | 2 +- katrain/core/game.py | 2 +- katrain/gui.kv | 2 +- katrain/i18n/locales/en/LC_MESSAGES/katrain.po | 2 +- katrain/img/Finish.png | Bin 0 -> 2995 bytes katrain/img/swap.png | Bin 7482 -> 0 bytes 6 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 katrain/img/Finish.png delete mode 100644 katrain/img/swap.png diff --git a/LICENSE b/LICENSE index 5690eb2..a652d7a 100644 --- a/LICENSE +++ b/LICENSE @@ -6,7 +6,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, 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 +- Other Menu icons, Finish, and Flag icons: derived from work by Freepik from www.flaticon.com - Collapse branch icon: derived from work by Kirill Kazachek 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/katrain/core/game.py b/katrain/core/game.py index 00b1ad9..ea886bb 100644 --- a/katrain/core/game.py +++ b/katrain/core/game.py @@ -554,7 +554,7 @@ class Game: analyze_and_play_policy(new_node) self.engines[node.next_player].request_analysis( - new_node, callback=set_analysis, visits=1, + new_node, callback=set_analysis, priority=-1000, analyze_fast=True, ) threading.Thread(target=analyze_and_play_policy, args=(cn,), daemon=True).start() diff --git a/katrain/gui.kv b/katrain/gui.kv index 1613850..29adef8 100644 --- a/katrain/gui.kv +++ b/katrain/gui.kv @@ -780,7 +780,7 @@ on_action: root.katrain("ai-move") AnalysisMenuItem: text: i18n._("analysis:playtoend") - icon: 'img/ai.png' + icon: 'img/Finish.png' shortcut: 'l' on_action: root.katrain("play-to-end") diff --git a/katrain/i18n/locales/en/LC_MESSAGES/katrain.po b/katrain/i18n/locales/en/LC_MESSAGES/katrain.po index 3663e67..eed3f21 100644 --- a/katrain/i18n/locales/en/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/en/LC_MESSAGES/katrain.po @@ -125,7 +125,7 @@ msgstr "Fast playout to game end" #. Status message msgid "playtoend:status" msgstr "" -"Playing game to the end with policy strategy, please wait ... {num_moves} " +"Playing the game quickly to the end, please wait ... {num_moves} moved played." "moves played." #. Keep improving current position analysis when there is nothing else to do diff --git a/katrain/img/Finish.png b/katrain/img/Finish.png new file mode 100644 index 0000000000000000000000000000000000000000..e7397a429b768762c34d09ad6da2f24b2726af09 GIT binary patch literal 2995 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 B-|hea