sachet.tin 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. #nop vim: set filetype=tt:;
  2. /*
  3. 本文件属于 PaoTin++ 的一部分
  4. ===========
  5. PaoTin++ © 2020~2024 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
  6. 你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
  7. ===========
  8. */
  9. #var basic_char_sachet[META] {
  10. {NAME} {锦囊管理}
  11. {DESC} {全生命周期维护锦囊数据,让你随时随地通过变量 char[锦囊] 掌握锦囊情况}
  12. {AUTHOR} {担子炮}
  13. {NOTE} {本文件属于 PaoTin++ 的一部分}
  14. };
  15. event.Define {char/sachet/sync} {无参} {$MODULE} {已经获取到 jiancha 命令输出结果,并更新 char[锦囊]。};
  16. event.Define {char/sachet/add} {无参} {$MODULE} {宝石已放入宝石袋,char[锦囊] 已同步更新。};
  17. event.Define {char/sachet/remove} {无参} {$MODULE} {从宝石袋中取出了宝石,char[锦囊] 已同步更新。};
  18. #var gem.name2code {
  19. {天} {8}
  20. {泽} {7}
  21. {火} {6}
  22. {雷} {5}
  23. {风} {4}
  24. {水} {3}
  25. {山} {2}
  26. {地} {1}
  27. {☆} {a}
  28. {★} {b}
  29. {◎} {c}
  30. {精金} {J}
  31. {木灵} {M}
  32. {玄冰} {B}
  33. {炎晶} {Y}
  34. {玉髓} {S}
  35. {月魄} {P}
  36. {日魂} {R}
  37. {神龙骨} {G}
  38. {凤凰羽} {F}
  39. {麒麟角} {Q}
  40. {玄武甲} {X}
  41. };
  42. #var gem.name2id {
  43. {天} {tian}
  44. {泽} {ze}
  45. {火} {huo}
  46. {雷} {lei}
  47. {风} {feng}
  48. {水} {shui}
  49. {山} {shan}
  50. {地} {di}
  51. {精金} {jin}
  52. {木灵} {mu}
  53. {玄冰} {bing}
  54. {炎晶} {yan}
  55. {玉髓} {sui}
  56. {月魄} {yue}
  57. {日魂} {ri}
  58. {神龙骨} {gu}
  59. {凤凰羽} {yu}
  60. {麒麟角} {jiao}
  61. {玄武甲} {jia}
  62. };
  63. #var gem.code2name {};
  64. #func {basic_char_sachet.Init} {
  65. #local name {};
  66. #var gem.code2name {};
  67. #foreach {*gem.name2code[]} {name} {
  68. #local code {$gem.name2code[$name]};
  69. #var gem.code2name[$code] {$name};
  70. };
  71. };
  72. #var char[锦囊] {};
  73. VAR {锦囊最多可以存储的宝石数量} {char.sachet.Max} {10};
  74. VAR {锦囊当前已经存储的宝石数量} {char.sachet.Amount} {0};
  75. #list char[锦囊] create {};
  76. /*
  77. 宝石囊的名字现在有好几种版本:钵盂(僧侣)、布袋(丐帮)、人偶(五毒教)、锦囊(其他门派)
  78. 以上功能都一样,区别在于名字和 ID 不同。
  79. 另外,jiancha 命令现在要求必须带 ID 才能看到宝石内容,否则只能看到数量,因此实际上存在带参数
  80. 和不带参数两个版本。
  81. 格式分别如下:
  82. 不带参数:
  83. 钵盂[141/141]
  84. 带参数:
  85. 钵盂(Bo yu) [141/141]
  86. 这是一只紫金色的钵盂,在出家人手中很常见。
  87. ╭───五行宝石──┬─────────┬─────────┬──────────╮
  88. │[J4A]风☆精金*1 │[M5B]雷★木灵*17 │[B7A]泽☆玄冰*1 │[Y3B]水★炎晶*2 │
  89. │[J3A]水☆精金*2 │[M4B]风★木灵*48 │[B4A]风☆玄冰*4 │[Y2B]山★炎晶*1 │
  90. │[J2A]山☆精金*2 │[M3B]水★木灵*8 │[B3A]水☆玄冰*34 │[Y1B]地★炎晶*1 │
  91. │[J1A]地☆精金*1 │[M2B]山★木灵*2 │[B2A]山☆玄冰*1 │ │
  92. │ │[M1B]地★木灵*4 │ │ │
  93. ├───日月及中性五行宝石───────┴─────────┴──────────┤
  94. │[S4C]风◎玉髓*3 │
  95. │[S3C]水◎玉髓*1 │
  96. │[S2C]山◎玉髓*3 │
  97. ├───四灵宝石──────┬─────────────┬────────────┤
  98. │[G1B]地★神龙骨*1 │[Q4B]风★麒麟角*1 │[X2B]山★玄武甲*1 │
  99. │ │[Q1A]地☆麒麟角*1 │[X1B]地★玄武甲*1 │
  100. ╰─────────────┴─────────────┴───北大侠客行────╯
  101. 对玩家来说,jiancha 后面带不同 ID 颇有不便,所以现在改成统一 jiancha gem 表示查看详情。
  102. */
  103. #alias {jiancha} {char.sachet.jiancha};
  104. #alias {char.sachet.jiancha} {
  105. #local id {%0};
  106. #if { "$id" == "" } {
  107. xtt.Send {jiancha};
  108. #return;
  109. };
  110. #if { "$id" == "gem" } {
  111. #switch {"$char[档案][门派]"} {
  112. #case {"{少林派|峨嵋派|天龙寺|大轮寺}"} {#local id {bo yu}};
  113. #case {"五毒教"} {#local id {ren ou}};
  114. #case {"丐帮"} {#local id {baoshi dai}};
  115. #default {#local id {jin nang}};
  116. };
  117. };
  118. #var char.sachet.bak {$char[锦囊]};
  119. #list char[锦囊] create {};
  120. #line oneshot #action {^{人偶|布袋|钵盂|锦囊}(%*) [%*/%*]{|ID=char.sachet}$} {
  121. #var char.sachet.Amount {%%3};
  122. #var char.sachet.Max {%%4};
  123. char.sachet.parse.output;
  124. ga.Wait {sachet.find.bug};
  125. };
  126. xtt.Send {jiancha $id};
  127. };
  128. #alias {char.sachet.parse.output} {
  129. #class char-parse-sachet open;
  130. #action {^├───%*宝石───────┴─────────┴──────────┤$} {
  131. #nop;
  132. };
  133. #action {^│%*│$} {
  134. #local line {%%1};
  135. #replace line {│} {;};
  136. #local item {};
  137. #foreach {$line} {item} {
  138. #if { "$item" == "" } {
  139. #continue;
  140. };
  141. #nop {[M5B]雷★木灵*30};
  142. #local item {@__char_sachet_parse__{{$item}}};
  143. #var char[锦囊] {$char[锦囊]{$item[序号]}{$item}};
  144. };
  145. };
  146. #action {^╰──{(─|┴)+}─%S────╯{|ID=char.sachet}$} {
  147. #class char-parse-sachet kill;
  148. };
  149. event.HandleOnce GA {char.sachet} {char} {
  150. #class char-parse-sachet kill;
  151. okLog 锦囊数据已更新。;
  152. event.Emit char/sachet/sync;
  153. #nop 吞参数专用,不要删除本行,也不要在末尾加分号或是别的语句
  154. };
  155. #class char-parse-sachet close;
  156. };
  157. #func {__char_sachet_parse__} {
  158. #local item {%1};
  159. #nop 通过触发捕获到的星号可能是带斜杠的,所以这里要去掉。;
  160. #replace {item} {[%S]$GEMLVL$GEMGEN$GEMKIND{?:\\|}*%d} {
  161. {序号}{&1}
  162. {等级}{&2}
  163. {阴阳}{&3}
  164. {种类}{&4}
  165. {数量}{&5}
  166. };
  167. #return {$item};
  168. };
  169. ///=== {
  170. // #@ gem.NameToCode <宝石中文名>
  171. // 将宝石的中文名转换成锦囊中的英文序号。
  172. // };
  173. #func {gem.NameToCode} {
  174. #local gem {%1};
  175. #replace gem {$GEMLVL$GEMGEN{?: |}$GEMKIND} {
  176. {等级}{&1}
  177. {阴阳}{&2}
  178. {种类}{&3}
  179. };
  180. #local gem {$gem};
  181. #if { &gem[] == 0 } {
  182. #return;
  183. };
  184. #return {$gem.name2code[$gem[种类]]$gem.name2code[$gem[等级]]@str.ToUpper{$gem.name2code[$gem[阴阳]]}};
  185. };
  186. ///=== {
  187. // #@ gem.NameToID <宝石中文名>
  188. // 将宝石的中文名转换成背包中的英文 ID。
  189. // };
  190. #func {gem.NameToID} {
  191. #local gem {%1};
  192. #replace gem {$GEMLVL$GEMGEN{?: |}$GEMKIND} {
  193. {等级}{&1}
  194. {阴阳}{&2}
  195. {种类}{&3}
  196. };
  197. #local gem {$gem};
  198. #if { &gem[] == 0 } {
  199. #return;
  200. };
  201. #return {$gem.name2id[$gem[等级]] $gem.name2id[$gem[种类]]};
  202. };
  203. ///=== {
  204. // #@ gem.CodeToName <宝石序号>
  205. // 将锦囊中的宝石序号转换成中文名。
  206. // };
  207. #func {gem.CodeToName} {
  208. #local gem {%1};
  209. #replace gem {%.%.%.} {
  210. {种类}{&1}
  211. {等级}{&2}
  212. {阴阳}{&3}
  213. };
  214. #local gem {$gem};
  215. #if { &gem[] == 0 } {
  216. #return;
  217. };
  218. #return {$gem.code2name[$gem[等级]]$gem.code2name[@str.ToLower{$gem[阴阳]}]$gem.code2name[$gem[种类]]};
  219. };
  220. ///=== {
  221. // #@ gem.CodeToNameB <宝石序号>
  222. // 将锦囊中的宝石序号转换成漂亮的中文名。
  223. // };
  224. #func {gem.CodeToNameB} {
  225. #local gem {@gem.CodeToName{%1}};
  226. #return {@Beautify{$gem}};
  227. };
  228. VAR {锦囊最近一次操作的宝石名称} {char.sachet.Gem} {};
  229. #action {^你从{锦囊|钵盂|布袋|人偶}里面取出一颗$GEM。$E} {
  230. #local gem {%2};
  231. #var char.sachet.Gem {$gem};
  232. #local code {@gem.NameToCode{$gem}};
  233. math.Inc char[锦囊][$code][数量] -1;
  234. #if { $char[锦囊][$code][数量] <= 0 } {
  235. #unvar char[锦囊][$code];
  236. };
  237. event.Emit char/sachet/remove;
  238. };
  239. #action {^你将手中$GEM放进了{锦囊|钵盂|布袋|人偶}。$E} {
  240. #local gem {%1};
  241. #var char.sachet.Gem {$gem};
  242. #local code {@gem.NameToCode{$gem}};
  243. #replace gem {$GEMLVL$GEMGEN{?: |}$GEMKIND} {
  244. {等级}{&1}
  245. {阴阳}{&2}
  246. {种类}{&3}
  247. };
  248. #local gem {$gem};
  249. #if { "$char[锦囊][$code]" == "" } {
  250. #var char[锦囊][$code] {
  251. {序号} {$code}
  252. {数量} {0}
  253. {种类} {$gem[种类]}
  254. {等级} {$gem[等级]}
  255. {阴阳} {$gem[阴阳]}
  256. };
  257. };
  258. math.Inc char[锦囊][$code][数量];
  259. event.Emit char/sachet/add;
  260. };
  261. #action {^$PLAYER给你一{颗|枚}$GEM。$E} {
  262. pack @gem.NameToID{%3};
  263. };
  264. #action {^从$NPC身上掉了出来一颗$GEM$E} {
  265. pack @gem.NameToID{%2};
  266. };
  267. #alias {sachet.find.bug} {
  268. #if { &char.sachet.bak[] == 0 } {
  269. #return;
  270. };
  271. #local found {0};
  272. #local code {};
  273. #foreach {*char[锦囊][]} {code} {
  274. #if { "$char[锦囊][$code][数量]" != "$char.sachet.bak[$code][数量]" } {
  275. #local found {1};
  276. #local level {$char[锦囊][$code][等级]};
  277. #local yiny {$char[锦囊][$code][阴阳]};
  278. #local kind {$char[锦囊][$code][种类]};
  279. #local count {$char.sachet.bak[$code][数量]};
  280. #local real {$char[锦囊][$code][数量]};
  281. errLog 发现 BUG:PaoTin++ 维护的锦囊数据中,$level$yiny$kind的数量为$count,实际应为$real。;
  282. };
  283. #unvar char.sachet.bak[$code];
  284. };
  285. #if { &char.sachet.bak[] != 0 } {
  286. #local found {1};
  287. errLog 发现 BUG:PaoTin++ 维护的锦囊数据中,以下内容与实际锦囊情况不符:;
  288. #var char.sachet.bak;
  289. };
  290. #if { $found } {
  291. errLog 看来锦囊管理模块还需要持续完善呀。;
  292. };
  293. #else {
  294. okLog 锦囊数据核对无误。锦囊管理模块非常完美!;
  295. };
  296. };