skills.tin 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. #nop vim: set filetype=tt:;
  2. /*
  3. 本文件属于 PaoTin++ 的一部分
  4. ===========
  5. PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
  6. 你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
  7. ===========
  8. */
  9. #var basic_char_skills[META] {
  10. {NAME} {技能列表}
  11. {DESC} {解析 skills 命令的输出结果,并写入到 char[Skills]}
  12. {AUTHOR} {担子炮}
  13. {NOTE} {技能小点和激发关系分别由 skbrief 和 jifa 命令提供,都合并在一起}
  14. {CONFIG} {
  15. }
  16. };
  17. #nop ╭───技能列表(共十六项)─┬─────────────┬──────┬──────┬──────╮
  18. #nop │名称 │ID │描述 │级别 │最大级别 │
  19. #nop ├───一项职业技能────┼─────────────┼──────┼──────┼──────┤
  20. #nop │ 占卜之术 │divination │不足挂齿 │82.0 │387 │
  21. #nop ├───六项基本知识────┼─────────────┼──────┼──────┼──────┤
  22. #nop │ 禅宗心法 │buddhism │半生不熟 │153.0 │- │
  23. #nop │ 鉴定之术 │identification │初窥门径 │54.0 │- │
  24. #nop │ 读书写字 │literate │半生不熟 │152.0 │- │
  25. #nop │ 医术 │medical-skill │新学乍用 │30.0 │- │
  26. #nop │ 妙手空空 │stealing │新学乍用 │10.0 │- │
  27. #nop │ 道家养生术 │taoism │深不可测 │948.23 │- │
  28. #nop ├───六项基本功夫────┼─────────────┼──────┼──────┼──────┤
  29. #nop │ 基本拳法 │cuff │半生不熟 │386.0 │387 │
  30. #nop │ 基本轻功 │dodge │半生不熟 │386.0 │387 │
  31. #nop │ 基本内功 │force │半生不熟 │386.0 │387 │
  32. #nop │ 基本招架 │parry │半生不熟 │386.0 │387 │
  33. #nop │ 基本剑法 │sword │半生不熟 │386.0 │387 │
  34. #nop ├───四项特殊功夫────┼─────────────┼──────┼──────┼──────┤
  35. #nop │□太极剑法 │taiji-jian │半生不熟 │386.0 │387 │
  36. #nop │□太极拳 │taiji-quan │半生不熟 │386.0 │387 │
  37. #nop │□太极神功 │taiji-shengong │第五重楼 │387.0 │387 │
  38. #nop │□梯云纵 │tiyunzong │半生不熟 │386.0 │387 │
  39. #nop ╰─────────────┴─────────────┴──────┴────北大侠客行────╯
  40. #nop;
  41. load-lib event;
  42. event.Define {char/skills} {无参} {$MODULE} {已经获取到 skills 命令输出结果,并更新 char[Skills]。};
  43. event.Define {char/skbrief} {无参} {$MODULE} {已经获取到 skbrief 命令输出结果,并更新 char[Skills]。};
  44. #func {basic_char_skills.Init} {
  45. #class data/basic/char open;
  46. #var char[Skills] {};
  47. #class data/basic/char close;
  48. #delay char.skills.init {skills;jifa} 1;
  49. #return true;
  50. };
  51. #alias {skills} {char.Skills};
  52. #alias {sk} {char.Skills};
  53. #alias {cha} {char.Skills};
  54. #alias {skbrief} {char.Skbrief {%1} nogag};
  55. #alias {char.Skills} {
  56. #local args {%0};
  57. #if { "$args" == "" } {
  58. #line oneshot #action {^╭───技能列表(共%*项){(─|┬)*}──╮$} {
  59. #var char[Skills][count] {@math.ParseCN{%%1}};
  60. char.skills.parse.output;
  61. };
  62. };
  63. xtt.Send skills %0;
  64. };
  65. #alias {char.skills.parse.output} {
  66. #class {ParseSkills} open;
  67. #var char[Skills][currentType] {};
  68. #var char[Skills][nameList] {};
  69. #gag {^│名称};
  70. #action {^├───%%1项%%2──} {
  71. #var char[Skills][currentType] {%%2};
  72. };
  73. #local RST {\e[0m};
  74. #local RST__ {\e[2;37;0m};
  75. #local __I__ {$RST__│};
  76. #action {~^$RST│%*│%*│%*│%*│%*│{|ID=char.skills}} {
  77. #local line {%%0};
  78. #local code {%%2};
  79. #local level {%%4};
  80. #local limit {%%5};
  81. #replace {code} {\x1b[2;37;0m} {};
  82. #replace {level} {\x1b[2;37;0m} {};
  83. #replace {limit} {\x1b[2;37;0m} {};
  84. #replace level {+} {};
  85. #if { "$limit" == "%s%d%s" } {
  86. #math limit {$limit + 0};
  87. };
  88. #elseif { "$limit" == "%s-%s" } {
  89. #nop 知识类技能没有上限;
  90. #local limit {0};
  91. };
  92. #else {
  93. #return;
  94. };
  95. #nop 给技能加上彩色进度条,用来表示当前级别距离上限的程度;
  96. #local newCode {@__char_skills_colorit__{{$code};$level;$limit}};
  97. #replace code { } {};
  98. #replace line {$code\x1b[2;37;0m%s} {$newCode\e[0m};
  99. #echo {%s} {@Beautify{{$line}}};
  100. #local line {Skill/%%1/%%2/%%3/%%4/$limit};
  101. #replace line { } {};
  102. #showme {$line};
  103. #line gag;
  104. };
  105. #action {^Skill/{□|Θ|}%%2/%%3/%%4/%%5/%%6$} {
  106. #local type ${char[Skills][currentType]};
  107. #local enabled {%%1};
  108. #local name {%%2};
  109. #local code {%%3};
  110. #local rank {%%4};
  111. #local level {%%5};
  112. #local limit {%%6};
  113. #replace name { } {};
  114. #if { "$enabled" == "□" } {
  115. #format enabled {true};
  116. };
  117. #else {
  118. #format enabled {false};
  119. };
  120. #list char[Skills][nameList] add {$name};
  121. #var {char[Skills][$name]} {
  122. $char[Skills][$name]
  123. {name}{$name}
  124. {type}{$type}
  125. {enabled}{$enabled}
  126. {code}{$code}
  127. {rank}{$rank}
  128. {level}{$level}
  129. {limit}{$limit}
  130. };
  131. #line gag;
  132. };
  133. #action {^╰───{(┴|─)*}─%S────╯{|ID=char.skills}$} {
  134. char.skills.parse.done;
  135. };
  136. #action {^你不是查看过吗?{|ID=char/skills}$} {
  137. char.skills.parse.done;
  138. };
  139. #alias {char.skills.parse.done} {
  140. #local __unused {%%0};
  141. event.UnHandle GA {char.skills};
  142. #local nameList {$char[Skills][nameList]};
  143. #local count {$char[Skills][count]};
  144. #unvar char[Skills][currentType];
  145. #unvar char[Skills][nameList];
  146. #unvar char[Skills][count];
  147. #class {ParseSkills} kill;
  148. #if { &nameList[] != $count } {
  149. #line sub var #delay 0 {
  150. errLog skills 命令结果解析不完整,识别到了 &nameList[] 条记录。数据可能有误,请联系开发者。;
  151. };
  152. #return;
  153. };
  154. #list nameList collapse {|};
  155. #local skillName {};
  156. #foreach {*char[Skills][]} {skillName} {
  157. #if { "$skillName" != "{$nameList}" } {
  158. #unvar {char[Skills][$skillName]};
  159. };
  160. };
  161. };
  162. event.HandleOnce GA {char.skills} {char} {char.skills.parse.done};
  163. #class {ParseSkills} close;
  164. };
  165. #func {__char_skills_colorit__} {
  166. #local code {%1};
  167. #local level {%2};
  168. #local limit {%3};
  169. #local p {@math.Int{@math.Eval{$level * 100 / $limit}}};
  170. #local color {@util.Grade{$p;<071>;15;<171>;30;<003>;60;<074>;90;<134>;100;<132>;101;<506>}};
  171. #local spaceLen {@str.Len{$code}};
  172. #local code {@str.Trim{$code}};
  173. #local textLen {@str.Len{$code}};
  174. #math spaceLen {$spaceLen - $textLen};
  175. #cat code {@str.AlignRight{{$p%}; $spaceLen}};
  176. #local {rest} {@math.Eval{100 - $p}};
  177. #return {@util.ColorBar{{$code};$color;$p;<g08>;$rest}};
  178. };
  179. #alias {char.Skbrief} {
  180. #local id {%1};
  181. #line oneshot #action {^系统回馈:R:skbrief-begin$} {
  182. #class char-skbrief-parse-output open;
  183. #line oneshot #action {^#%d/%d{|ID=char/skbrief}$} {
  184. #local skill {};
  185. #foreach {*char[Skills][]} {skill} {
  186. #if { "$char[Skills][$skill][code]" == "%1" } {
  187. #var char[Skills][$skill][lvl] {%%%1};
  188. #var char[Skills][$skill][point] {%%%2};
  189. event.Emit {char/skbrief};
  190. #break;
  191. };
  192. };
  193. #local gag {@default{%2;gag}};
  194. #if { "$gag" == "gag" } {
  195. #line gag;
  196. };
  197. };
  198. #line oneshot #action {^系统回馈:R:skbrief-end$} {
  199. #line gag;
  200. #class char-skbrief-parse-output kill;
  201. };
  202. #class char-skbrief-parse-output close;
  203. #line gag;
  204. };
  205. #if { "$id" == "" } {
  206. #return;
  207. };
  208. #send {#response R:skbrief-begin;skbrief $id;response R:skbrief-end#};
  209. };