#nop vim: set filetype=tt:; /* 本文件属于 PaoTin++ 的一部分 =========== PaoTin++ © 2020~2024 的所有版权均由担子炮(dzp ) 享有并保留一切法律权利 你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。 =========== */ #var basic_char_sachet[META] { {NAME} {锦囊管理} {DESC} {全生命周期维护锦囊数据,让你随时随地通过变量 char[锦囊] 掌握锦囊情况} {AUTHOR} {担子炮} {NOTE} {本文件属于 PaoTin++ 的一部分} }; event.Define {char/sachet/sync} {无参} {$MODULE} {已经获取到 jiancha 命令输出结果,并更新 char[锦囊]。}; event.Define {char/sachet/add} {无参} {$MODULE} {宝石已放入宝石袋,char[锦囊] 已同步更新。}; event.Define {char/sachet/remove} {无参} {$MODULE} {从宝石袋中取出了宝石,char[锦囊] 已同步更新。}; #var gem.name2code { {天} {8} {泽} {7} {火} {6} {雷} {5} {风} {4} {水} {3} {山} {2} {地} {1} {☆} {a} {★} {b} {◎} {c} {精金} {J} {木灵} {M} {玄冰} {B} {炎晶} {Y} {玉髓} {S} {月魄} {P} {日魂} {R} {神龙骨} {G} {凤凰羽} {F} {麒麟角} {Q} {玄武甲} {X} }; #var gem.name2id { {天} {tian} {泽} {ze} {火} {huo} {雷} {lei} {风} {feng} {水} {shui} {山} {shan} {地} {di} {精金} {jin} {木灵} {mu} {玄冰} {bing} {炎晶} {yan} {玉髓} {sui} {月魄} {yue} {日魂} {ri} {神龙骨} {gu} {凤凰羽} {yu} {麒麟角} {jiao} {玄武甲} {jia} }; #var gem.code2name {}; #func {basic_char_sachet.Init} { #local name {}; #var gem.code2name {}; #foreach {*gem.name2code[]} {name} { #local code {$gem.name2code[$name]}; #var gem.code2name[$code] {$name}; }; load-config gem; #return {true}; }; #var char[锦囊] {}; VAR {锦囊最多可以存储的宝石数量} {char.sachet.Max} {10}; VAR {锦囊当前已经存储的宝石数量} {char.sachet.Amount} {0}; #list char[锦囊] create {}; /* 宝石囊的名字现在有好几种版本:钵盂(僧侣)、布袋(丐帮)、人偶(五毒教)、锦囊(其他门派) 以上功能都一样,区别在于名字和 ID 不同。 另外,jiancha 命令现在要求必须带 ID 才能看到宝石内容,否则只能看到数量,因此实际上存在带参数 和不带参数两个版本。 格式分别如下: 不带参数: 钵盂[141/141] 带参数: 钵盂(Bo yu) [141/141] 这是一只紫金色的钵盂,在出家人手中很常见。 ╭───五行宝石──┬─────────┬─────────┬──────────╮ │[J4A]风☆精金*1 │[M5B]雷★木灵*17 │[B7A]泽☆玄冰*1 │[Y3B]水★炎晶*2 │ │[J3A]水☆精金*2 │[M4B]风★木灵*48 │[B4A]风☆玄冰*4 │[Y2B]山★炎晶*1 │ │[J2A]山☆精金*2 │[M3B]水★木灵*8 │[B3A]水☆玄冰*34 │[Y1B]地★炎晶*1 │ │[J1A]地☆精金*1 │[M2B]山★木灵*2 │[B2A]山☆玄冰*1 │ │ │ │[M1B]地★木灵*4 │ │ │ ├───日月及中性五行宝石───────┴─────────┴──────────┤ │[S4C]风◎玉髓*3 │ │[S3C]水◎玉髓*1 │ │[S2C]山◎玉髓*3 │ ├───四灵宝石──────┬─────────────┬────────────┤ │[G1B]地★神龙骨*1 │[Q4B]风★麒麟角*1 │[X2B]山★玄武甲*1 │ │ │[Q1A]地☆麒麟角*1 │[X1B]地★玄武甲*1 │ ╰─────────────┴─────────────┴───北大侠客行────╯ 对玩家来说,jiancha 后面带不同 ID 颇有不便,所以现在改成统一 jiancha gem 表示查看详情。 */ #alias {jiancha} {char.sachet.jiancha}; #alias {char.sachet.jiancha} { #local id {%0}; #if { "$id" == "" } { xtt.Send {jiancha}; #return; }; #if { "$id" == "gem" } { #switch {"$char[档案][门派]"} { #case {"{少林派|峨嵋派|天龙寺|大轮寺}"} {#local id {bo yu}}; #case {"五毒教"} {#local id {ren ou}}; #case {"丐帮"} {#local id {baoshi dai}}; #default {#local id {jin nang}}; }; }; #var char.sachet.bak {$char[锦囊]}; #list char[锦囊] create {}; #line oneshot #action {^{人偶|布袋|钵盂|锦囊}(%*) [%*/%*]{|ID=char.sachet}$} { #var char.sachet.Amount {%%3}; #var char.sachet.Max {%%4}; char.sachet.parse.output; ga.Wait {sachet.find.bug}; }; xtt.Send {jiancha $id}; }; #alias {char.sachet.parse.output} { #class char-parse-sachet open; #action {^├───%*宝石───────┴─────────┴──────────┤$} { #nop; }; #action {^│%*│$} { #local line {%%1}; #replace line {│} {;}; #local item {}; #foreach {$line} {item} { #if { "$item" == "" } { #continue; }; #nop {[M5B]雷★木灵*30}; #local item {@__char_sachet_parse__{{$item}}}; #var char[锦囊] {$char[锦囊]{$item[序号]}{$item}}; }; }; #action {^╰──{(─|┴)+}─%S────╯{|ID=char.sachet}$} { #class char-parse-sachet kill; }; event.HandleOnce GA {char.sachet} {char} { #class char-parse-sachet kill; okLog 锦囊数据已更新。; event.Emit char/sachet/sync; #nop 吞参数专用,不要删除本行,也不要在末尾加分号或是别的语句 }; #class char-parse-sachet close; }; #func {__char_sachet_parse__} { #local item {%1}; #nop 通过触发捕获到的星号可能是带斜杠的,所以这里要去掉。; #replace {item} {[%S]$GEMLVL$GEMGEN$GEMKIND{?:\\|}*%d} { {序号}{&1} {等级}{&2} {阴阳}{&3} {种类}{&4} {数量}{&5} }; #return {$item}; }; ///=== { // #@ gem.NameToCode <宝石中文名> // 将宝石的中文名转换成锦囊中的英文序号。 // }; #func {gem.NameToCode} { #local gem {%1}; #replace gem {$GEMLVL$GEMGEN{?: |}$GEMKIND} { {等级}{&1} {阴阳}{&2} {种类}{&3} }; #local gem {$gem}; #if { &gem[] == 0 } { #return {}; }; #return {$gem.name2code[$gem[种类]]$gem.name2code[$gem[等级]]@str.ToUpper{$gem.name2code[$gem[阴阳]]}}; }; ///=== { // #@ gem.NameToID <宝石中文名> // 将宝石的中文名转换成背包中的英文 ID。 // }; #func {gem.NameToID} { #local gem {%1}; #replace gem {$GEMLVL$GEMGEN{?: |}$GEMKIND} { {等级}{&1} {阴阳}{&2} {种类}{&3} }; #local gem {$gem}; #if { &gem[] == 0 } { #return {}; }; #return {$gem.name2id[$gem[等级]] $gem.name2id[$gem[种类]]}; }; ///=== { // #@ gem.CodeToName <宝石序号> // 将锦囊中的宝石序号转换成中文名。 // }; #func {gem.CodeToName} { #local gem {%1}; #replace gem {%.%.%.} { {种类}{&1} {等级}{&2} {阴阳}{&3} }; #local gem {$gem}; #if { &gem[] == 0 } { #return {}; }; #return {$gem.code2name[$gem[等级]]$gem.code2name[@str.ToLower{$gem[阴阳]}]$gem.code2name[$gem[种类]]}; }; ///=== { // #@ gem.CodeToNameB <宝石序号> // 将锦囊中的宝石序号转换成漂亮的中文名。 // }; #func {gem.CodeToNameB} { #local gem {@gem.CodeToName{%1}}; #return {@Beautify{$gem}}; }; VAR {锦囊最近一次操作的宝石名称} {char.sachet.Gem} {}; #action {^你从{锦囊|钵盂|布袋|人偶}里面取出一颗$GEM。$E} { #local gem {%2}; #var char.sachet.Gem {$gem}; #if { $char.sachet.Max == 10 } { jiancha gem; #return; }; #local code {@gem.NameToCode{$gem}}; math.Inc char.sachet.Amount -1; math.Inc char[锦囊][$code][数量] -1; #if { $char[锦囊][$code][数量] <= 0 } { #unvar char[锦囊][$code]; }; event.Emit char/sachet/remove; }; #action {^你将手中$GEM放进了{锦囊|钵盂|布袋|人偶}。$E} { #local gem {%1}; #var char.sachet.Gem {$gem}; #if { $char.sachet.Max == 10 } { jiancha gem; #return; }; #local code {@gem.NameToCode{$gem}}; #replace gem {$GEMLVL$GEMGEN{?: |}$GEMKIND} { {等级}{&1} {阴阳}{&2} {种类}{&3} }; #local gem {$gem}; #if { "$char[锦囊][$code]" == "" } { #var char[锦囊][$code] { {序号} {$code} {数量} {0} {种类} {$gem[种类]} {等级} {$gem[等级]} {阴阳} {$gem[阴阳]} }; }; math.Inc char.sachet.Amount; math.Inc char[锦囊][$code][数量]; event.Emit char/sachet/add; }; #action {^$PLAYER给你一{颗|枚}$GEM。$E} { pack @gem.NameToID{%3}; }; #action {^从$NPC身上掉了出来一颗$GEM$E} { pack @gem.NameToID{%2}; }; #alias {sachet.find.bug} { #if { &char.sachet.bak[] == 0 || $char.sachet.Max == 10 } { #return; }; #local found {0}; #local code {}; #foreach {*char[锦囊][]} {code} { #if { "$char[锦囊][$code][数量]" != "$char.sachet.bak[$code][数量]" } { #local found {1}; #local count {$char.sachet.bak[$code][数量]}; #local real {$char[锦囊][$code][数量]}; errLog 发现 BUG:PaoTin++ 维护的锦囊数据中,@gem.CodeToNameB{$code}的数量为@defaultNum{$count;0},实际应为$real。; }; #unvar char.sachet.bak[$code]; }; #if { &char.sachet.bak[] != 0 } { #local found {1}; errLog 发现 BUG:PaoTin++ 维护的锦囊数据中,以下内容与实际锦囊情况不符:; #var char.sachet.bak; }; #if { $found } { errLog 看来锦囊管理模块还需要持续完善呀。; }; #else { okLog 锦囊数据核对无误。锦囊管理模块非常完美!; }; }; VAR {宝石金店价格表} {gem.Price} {}; VAR {宝石价格系数} {gem.PriceScale} {}; ///=== { // #@ gem.Value [ <中文名称> | <锦囊序号> ] // 对宝石进行估值。如果省略参数,则估算整个锦囊中的所有宝石的价值总和。 // 参数可以是宝石的中文名称或锦囊序号。如天★木灵、M8B、m8b 都是可以的。 // 估值结果受宝石金店价格表和宝石价格系数的影响,此二者玩家皆可自定义配置。 // }; #func {gem.Value} { #local gem {%1}; #if { "$gem" == "" } { #return @gem.ValueAll{}; }; #if { "$gem" == "%+3w" } { #local gem {@gem.CodeToName{$gem}}; }; #replace gem {$GEMLVL$GEMGEN{?: |}$GEMKIND} { {等级}{&1} {阴阳}{&2} {种类}{&3} }; #local gem {$gem}; #if { &gem[] == 0 } { #return 0; }; #local value {$gem.Price[$gem[等级]]}; #local scale {$gem.PriceScale[$gem[种类]]}; #math value {$value * $scale}; #if { "$gem[阴阳]/$gem[种类]" == "◎/{神龙骨|凤凰羽|麒麟角|玄武甲}" } { #math value {$value * 2}; }; #return {$value}; }; ///=== { // #@ gem.ValueAll // 估算整个锦囊中的所有宝石的价值总和。 // }; #func {gem.ValueAll} { #local where {@str.Trim{%0}}; #local sum {0}; #if { "$where" == "" } { #local code {}; #foreach {*char[锦囊][]} {code} { #local value {@gem.Value{$code}}; #local amount {$char[锦囊][$code][数量]}; #math sum {$sum + $value * $amount}; }; #return $sum; }; #local bag {}; #if { "$where" == "bag %d" } { #replace where {^bag } {}; #local bag {$char.Bag[$where]}; }; #elseif { "$where" == "backpack" } { #local bag {$char.Gem}; }; #local key {}; #foreach {*bag[]} {key} { #local name {$bag[$key][name]}; #local amount {$bag[$key][amount]}; #local value {@gem.Value{$name}}; #math sum {$sum + $value * $amount}; }; #return {$sum}; }; ///=== { // ## gem.SafelyPack <宝石中文名称或锦囊序号> // 将宝石放入宝石袋。 // 如果宝石囊已满,则会自动取出价值最低的宝石,好腾出空间放入新宝石。 // 参数可以是宝石的中文名称或锦囊序号。如天★木灵、M8B、m8b 都是可以的。 // 宝石价值按照宝石金店价格表和宝石价格系数计算。 // }; #alias {gem.SafelyPack} { #local gem {%1}; #if { "$gem" == "%+3w" } { #local gem {@gem.CodeToName{@str.ToUpper{$gem}}}; }; #local gem {@gem.NameToID{$gem}}; #if { "$gem" == "" } { xtt.Usage %90; #return; }; #if { "$gem" == "" } { xtt.Usage %90; #return; }; #if { $char.sachet.Amount < $char.sachet.Max } { pack $gem; #return; }; #local minValue {999999}; #local minCode {}; #local code {}; #foreach {*char[锦囊][]} {code} { #local value {@gem.Value{$code}}; #if { $value < $minValue } { #local minValue {$value}; #local minCode {@str.ToLower{$code}}; }; }; #if { "$minCode" != "" } { pickgem $minCode; pack $gem; }; };