ku10 Enhance

ku10.com增强:课程倒放、跳转Gomocalc分析

目前为 2023-10-21 提交的版本。查看 最新版本

  1. /* eslint-disable no-multi-spaces */
  2.  
  3. // ==UserScript==
  4. // @name ku10 Enhance
  5. // @namespace PY-DNG userscripts
  6. // @version 0.2.1
  7. // @description ku10.com增强:课程倒放、跳转Gomocalc分析
  8. // @description:en try to take over the world!
  9. // @author PY-DNG
  10. // @license GPL-3.0-or-later
  11. // @match *://ku10.com/
  12. // @match *://ku10.com/#*
  13. // @require https://gf.qytechs.cn/scripts/456034-basic-functions-for-userscripts/code/script.js?version=1226884
  14. // @icon data:image/png;base64,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
  15. // @grant none
  16. // ==/UserScript==
  17.  
  18. /* global LogLevel DoLog Err $ $All $CrE $AEL $$CrE addStyle detectDom destroyEvent copyProp copyProps parseArgs escJsStr replaceText getUrlArgv dl_browser dl_GM AsyncManager */
  19. /* global record_player */
  20.  
  21. (function __MAIN__() {
  22. 'use strict';
  23.  
  24. $('#play_control>.buttons').insertAdjacentElement('afterbegin', $$CrE({
  25. tagName: 'div',
  26. props: { innerText: '<' },
  27. classes: ['button'],
  28. listeners: [['click', e => record_player.back()]]
  29. }));
  30.  
  31. record_player.jumpto = function(i) {
  32. const obj = this;
  33.  
  34. const list = $('#chat_content');
  35.  
  36. if (i < obj.pointer) {
  37. // Remove 'future' messages
  38. for (let j = obj.pointer; j > i; j--) {
  39. const noMsgActions = ['BACK', 'RESET', 'FIRST', 'NEXT', 'LOAD', 'LAST', 'GOTO'];
  40. if (!noMsgActions.includes(obj.record[j-1].action)) {
  41. while ($(list.children[list.children.length-1], '.chat-sys')) {
  42. list.children[list.children.length-1].remove();
  43. }
  44. list.children[list.children.length-1].remove();
  45. }
  46. }
  47.  
  48. // Reload board
  49. const boardStatus = calcBoard(i);
  50. obj.boardHandler.load(boardStatus.game);
  51. obj.boardHandler.endgame = boardStatus.endgame;
  52. obj.pointer = i;
  53. } else {
  54. // Load history messages
  55. for (let j = obj.pointer; j < i; j++) {
  56. obj.play();
  57. }
  58. }
  59. }
  60.  
  61. record_player.back = function() {
  62. record_player.pointer > 0 ? record_player.jumpto(record_player.pointer-1) : record_player.sysMsg('已经是第一条了');
  63. }
  64.  
  65. // Analyze in gomocalc
  66. $AEL($('.controlbar>button'), 'click', function(e) {
  67. if (e.target.matches('.controlbar>button:first-child')) {
  68. record_player.pause();
  69. const gomocalcStr = ku10ToGomocalc(record_player.boardHandler.currgame);
  70. window.open(`https://gomocalc.com/#/${gomocalcStr}`, 'analyze');
  71. e.stopImmediatePropagation();
  72. }
  73. }, { capture: true });
  74.  
  75. // No selections in buttons
  76. addStyle('.button {user-select: none;}');
  77.  
  78. function calcBoard(i) {
  79. let game = '', endgame = '';
  80. for (let j = 0; j < i; j++) {
  81. const record = record_player.record[j];
  82. switch (record.action) {
  83. case 'MOVE': {
  84. game += record.content;
  85. if (endgame.substring(0, game.length) !== game) {
  86. endgame = game;
  87. }
  88. break;
  89. }
  90. case 'BACK': {
  91. game = game.substring(0, game.length-2);
  92. break;
  93. }
  94. case 'RESET': {
  95. game = endgame = '';
  96. break;
  97. }
  98. case 'FIRST': {
  99. game = endgame.substring(0, 2);
  100. break;
  101. }
  102. case 'NEXT': {
  103. game = endgame.substring(0, game.length+2);
  104. break;
  105. }
  106. case 'LOAD': {
  107. game = endgame = record.content;
  108. break;
  109. }
  110. case 'LAST': {
  111. game = endgame;
  112. break;
  113. }
  114. case 'GOTO': {
  115. while (game.length > record.content * 2) {
  116. game = game.substring(0, game.length-2);
  117. }
  118. while (game.length < record.content * 2) {
  119. game = endgame.substring(0, game.length+2);
  120. }
  121. break;
  122. }
  123. }
  124. }
  125. return {game, endgame};
  126. }
  127.  
  128. function ku10ToGomocalc(ku10) {
  129. const xConvert = numStr => 'abcdefghijklmno'.charAt(parseInt(numStr, 16) - 1);
  130. const yConvert = numStr => ('123456789abcdef'.indexOf(numStr) + 1).toString();
  131. let gomocalc = '';
  132. for (let i = 0; i < ku10.length; i = i + 2) {
  133. const [x, y] = [ku10.charAt(i), ku10.charAt(i+1)];
  134. gomocalc += xConvert(x) + yConvert(y);
  135. }
  136. return gomocalc;
  137. }
  138. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址