ソースを参照

SQUASH: feat(ui/walk): 用小键盘走路

dzp 1 年間 前
コミット
07bf9248a0
3 ファイル変更135 行追加49 行削除
  1. 65 18
      etc/ui-settings.tin
  2. 1 0
      plugins/lib/ui/__main__.tin
  3. 69 31
      plugins/lib/ui/walk.tin

+ 65 - 18
etc/ui-settings.tin

@@ -34,26 +34,73 @@ VAR {命令提示符,默认为空} prompt-prompt {};
 
 #nop 热键绑定;
 #list global-key-bindings create {
-    {{key}{\cd}     {meaning}{命令行智能切换}           {action}{cli.SmartToggle}}
-    {{key}{\co\cd}  {meaning}{禁止/允许命令和触发}      {action}{xtt.ToggleDisableCommands}}
-    {{key}{\cos}    {meaning}{禁止/允许状态栏更新}      {action}{prompt.ToggleSwitch}}
-    {{key}{\cob}    {meaning}{禁止/允许界面宽字符美化}  {action}{beautify.ToggleSwitch}}
-    {{key}{\col}    {meaning}{查看选项列表}             {action}{option.List}}
-    {{key}{\cod}    {meaning}{开启/关闭调试模式}        {action}{option.Toggle DebugLog}}
-    {{key}{\coD}    {meaning}{开启/关闭调试日志}        {action}{option.Toggle DebugLogEcho}}
-    {{key}{\coe}    {meaning}{开启/关闭命令发送回显}    {action}{option.Toggle EchoCommand}}
-    {{key}{\cok}    {meaning}{开启/关闭小键盘走路}      {action}{option.Toggle KeypadWalk}}
+    {{key}{\cd}     {meaning}{命令行智能切换}               {action}{cli.SmartToggle}}
+    {{key}{\co\cd}  {meaning}{禁止/允许命令和触发}          {action}{xtt.ToggleDisableCommands}}
+    {{key}{\cos}    {meaning}{禁止/允许状态栏更新}          {action}{prompt.ToggleSwitch}}
+    {{key}{\cob}    {meaning}{禁止/允许界面宽字符美化}      {action}{beautify.ToggleSwitch}}
+    {{key}{\col}    {meaning}{查看选项列表}                 {action}{option.List}}
+    {{key}{\cod}    {meaning}{开启/关闭调试模式}            {action}{option.Toggle DebugLog}}
+    {{key}{\coD}    {meaning}{开启/关闭调试日志}            {action}{option.Toggle DebugLogEcho}}
+    {{key}{\coe}    {meaning}{开启/关闭命令发送回显}        {action}{option.Toggle EchoCommand}}
+    {{key}{\cok}    {meaning}{开启/关闭小键盘走路}          {action}{option.Toggle KeypadWalk}}
+    {{key}{\coK}    {meaning}{开启/关闭屏幕虚拟键盘走路}    {action}{option.Toggle ScreenKeypad}}
 };
 
-VAR {小键盘走路的键盘扫描码} {global-keypad-walking} {
-    {north}         {\e[A}
-    {south}         {\e[B}
-    {east}          {\e[C}
-    {west}          {\e[D}
-    {northeast}     {\e[5~}
-    {southeast}     {\e[6~}
-    {northwest}     {\e[H}
-    {southwest}     {\e[F}
+VAR {小键盘走路的键盘扫描码} {global-keypad-code} {
+    {Home}          {\e[H}
+    {End}           {\e[F}
+    {Up}            {\e[A}
+    {Down}          {\e[B}
+    {Left}          {\e[D}
+    {Right}         {\e[C}
+    {Center}        {\e[G}
+    {PageUp}        {\e[5~}
+    {PageDown}      {\e[6~}
+    {Enter}         {\n}
+    {ShiftHome}     {\e[1;2H}
+    {ShiftEnd}      {\e[1;2F}
+    {ShiftUp}       {\e[1;2A}
+    {ShiftDown}     {\e[1;2B}
+    {ShiftLeft}     {\e[1;2D}
+    {ShiftRight}    {\e[1;2C}
+    {ShiftCenter}   {\e[1;2G}
+    {ShiftPageUp}   {\e[5;2~}
+    {ShiftPageDown} {\e[6;2~}
+    {KeyH}          {h}
+    {KeyJ}          {j}
+    {KeyK}          {k}
+    {KeyL}          {l}
+    {ShiftKeyH}     {H}
+    {ShiftKeyJ}     {J}
+    {ShiftKeyK}     {K}
+    {ShiftKeyL}     {L}
+};
+
+VAR {小键盘走路的功能映射表} {global-keypad-walking} {};
+
+#list {global-keypad-walking} create {
+    {{key}{Up}          {type}{dir}     {args}{northdown;north;northup;up;northwest;northeast}}
+    {{key}{Down}        {type}{dir}     {args}{southdown;south;southup;down;southwest;southeast}}
+    {{key}{Left}        {type}{dir}     {args}{westdown;west;westup;out;northwest;southwest}}
+    {{key}{Right}       {type}{dir}     {args}{eastdown;east;eastup;enter;northeast;southeast}}
+    {{key}{Home}        {type}{dir}     {args}{northwest;westup;northup}}
+    {{key}{End}         {type}{dir}     {args}{southwest;westdown;southup}}
+    {{key}{PageUp}      {type}{dir}     {args}{northeast;eastup;northdown}}
+    {{key}{PageDown}    {type}{dir}     {args}{southeast;eastdown;southdown}}
+    {{key}{ShiftUp}     {type}{dir}     {args}{northup;north}}
+    {{key}{ShiftDown}   {type}{dir}     {args}{southup;south}}
+    {{key}{ShiftLeft}   {type}{dir}     {args}{westup;west}}
+    {{key}{ShiftRight}  {type}{dir}     {args}{eastup;east}}
+    {{key}{Enter}       {type}{cmd}     {args}{get all}}
+    {{key}{Center}      {type}{cmd}     {args}{look}}
+    {{key}{KeyK}        {type}{dir}     {args}{northdown;north;northup;up;northwest;northeast}}
+    {{key}{KeyJ}        {type}{dir}     {args}{southdown;south;southup;down;southwest;southeast}}
+    {{key}{KeyH}        {type}{dir}     {args}{westdown;west;westup;out;northwest;southwest}}
+    {{key}{KeyL}        {type}{dir}     {args}{eastdown;east;eastup;enter;northeast;southeast}}
+    {{key}{ShiftKeyK}   {type}{dir}     {args}{northup;north}}
+    {{key}{ShiftKeyJ}   {type}{dir}     {args}{southup;south}}
+    {{key}{ShiftKeyH}   {type}{dir}     {args}{westup;west}}
+    {{key}{ShiftKeyL}   {type}{dir}     {args}{eastup;east}}
 };
 
 VAR {HP摘要刷新时机,三选一:{总是|从不|自动}} char.HPSummarize.Echo {自动};

+ 1 - 0
plugins/lib/ui/__main__.tin

@@ -4,6 +4,7 @@ load-module lib/ui/tmux;
 load-module lib/ui/prompt;
 load-module lib/ui/beautify;
 load-module lib/ui/keyboard;
+load-module lib/ui/walk;
 
 /*
 鼠标支持尚不完善,和 tmux 相比还很弱,

+ 69 - 31
plugins/lib/ui/walk.tin

@@ -7,32 +7,36 @@ PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 
 */
 
 ///=== {
-///// 触屏走路模块允许玩家通过点击屏幕上的不同区域来控制角色向不同方向移动。
-///// 本模块对手机用户可能有一些帮助。
+///// 小键盘和触屏走路模块允许玩家通过小键盘,或者点击屏幕上的不同区域来控制角色向不同方向移动。
+///// 本模块对手机用户可能有一些帮助,也可满足喜欢小键盘的玩家诉求
 /////
-///// 首次使用的用户可能需要先通过 ui.walk.Guide 别名来学习虚拟按键的方位布局。
+///// 对于手机用户来说,建议先通过 ui.walk.Guide 别名来学习虚拟按键的方位布局。
 /////
-///// 需要特别说明的是,本模块会自动和地图系统进行集成。通过监测房间出口,会对
-///// 键位做细微的调整。
+///// 需要特别说明的是,本模块会自动和地图系统进行集成。通过监测房间出口,会对键位做细微的调整。
 ///// 举例来说,如果东方只有一个 eastup 出口,那么 east/eastup/eastdown 三个键位
 ///// 的作用就都是 eastup,如果只有一个 eastdown 也一样。南、北、西三个方向同理。
 /////
-///// 本模块加载后立即生效,如果你需要暂时禁用,可以用 ui.walk.Disable 别名。
-///// 稍后可以通过 ui.walk.Enable 重新启用。
+///// 本模块加载后默认并不启用,你需要通过开启 PaoTin++ 全局选项来开启对应功能。
+///// 目前有两个功能:
+/////    - KeypadWalk:   小键盘走路,默认已绑定到快捷键 <ctrl+o> <k>
+/////    - ScreenKeypad: 屏幕虚拟键盘走路,默认已绑定到快捷键 <ctrl+o> <K>
+/////
+///// 你也可以在脚本中通过 option 标准方法 option.Toggle/Enable/Disable 来开启或关闭它们。
+///// 请查阅 HELP option
 // };
 
 #var lib_ui_walk[META] {
-    {NAME}      {触屏走路}
+    {NAME}      {触屏和小键盘走路}
     {DESC}      {支持鼠标和触摸屏操作,点击屏幕不同区域,可以进入不同出口}
     {AUTHOR}    {担子炮}
 };
 
 option.Define {KeypadWalk} {Bool} {是否开启小键盘走路} {false};
+option.Define {ScreenKeypad} {Bool} {是否开启屏幕虚拟键盘} {false};
 
 #func {lib_ui_walk.Init} {
-    ui.walk.Enable;
-    event.Handle {option/changed} {option/changed/KeypadWalk} {lib/ui/walk} {ui.walk.keypad.Toggle};
-    option.Disable KeypadWalk;
+    event.Handle {option/changed} {option/changed/KeypadWalk} {lib/ui/walk} {ui.walk.Keypad.Toggle};
+    event.Handle {option/changed} {option/changed/ScreenKeypad} {lib/ui/walk} {ui.walk.ScreenKeypad.Toggle};
     #return {true};
 };
 
@@ -59,21 +63,19 @@ option.Define {KeypadWalk} {Bool} {是否开启小键盘走路} {false};
 };
 
 ///=== {
-// ## ui.walk.Enable
-//    开启触屏走路。
-//    本别名没有参数。
-// };
-#alias {ui.walk.Enable} {
-    ui.walk.setup;
-};
-
-///=== {
-// ## ui.walk.Disable
-//    禁用触屏走路。
+// ## ui.walk.ScreenKeypad.Toggle
+//    开启/关闭屏幕虚拟键盘走路。
 //    本别名没有参数。
 // };
-#alias {ui.walk.Disable} {
-    #class ui.walk.mouse kill;
+#alias {ui.walk.ScreenKeypad.Toggle} {
+    #if { @option.IsDisable{ScreenKeypad} } {
+        #class ui.walk.mouse kill;
+        errLog 屏幕虚拟键盘走路已关闭。;
+    };
+    #else {
+        ui.walk.setup;
+        okLog 屏幕虚拟键盘走路已开启。;
+    };
 };
 
 ///=== {
@@ -218,19 +220,55 @@ VAR {触屏走路插件的走路命令,默认为 go} ui.walk.cmd {go};
     $ui.walk.cmd $dir;
 };
 
-#alias {ui.walk.keypad.Toggle} {
+#alias {ui.walk.Keypad.Toggle} {
     #if { @option.IsDisable{KeypadWalk} } {
-        okLog 小键盘走路已关闭。;
         #class ui.walk.Keypad kill;
+        errLog 小键盘走路已关闭。;
     };
     #else {
-        okLog 小键盘走路已开启。;
         #class ui.walk.Keypad open;
-        #local dir {};
-        #foreach {*global-keypad-walking[]} {dir} {
-            #local code {$global-keypad-walking[$dir]};
-            #line sub var #macro {$code} {ui.walk.go $dir};
+        #local idx {};
+        #foreach {*global-keypad-walking[]} {idx} {
+            #local entry {$global-keypad-walking[$idx]};
+            #local name {$entry[key]};
+            #local type {$entry[type]};
+            #local args {$entry[args]};
+            #if { &global-keypad-code[$name] == 0 } {
+                #continue;
+            };
+            #local code {$global-keypad-code[$name]};
+            #line sub var #macro {$code} {ui.walk.keypad.do $name $type {$args}};
         };
         #class ui.walk.Keypad close;
+        okLog 小键盘走路已开启。;
+    };
+};
+
+#alias {ui.walk.keypad.do} {
+    #local key  {%1};
+    #local type {%2};
+    #local args {%3};
+
+    #if { "$key" == "Enter" } {
+        #local input {};
+        #cursor get input;
+        #if { {$input} !== {} } {
+            #cursor clear;
+            $input;
+            #return;
+        };
+    };
+
+    #if { "$type" == "cmd" } {
+        $args;
+        #return;
+    };
+
+    #local dir {};
+    #foreach {$args} {dir} {
+        #if { @sset.Contains{{$gMapRoom[exits]};$dir} } {
+            ui.walk.go $dir;
+            #return;
+        };
     };
 };