Ver Fonte

feat(pkuxkx): 全新的背包管理模块

dzp há 2 anos atrás
pai
commit
d7a5f2b4a1

+ 38 - 0
mud/pkuxkx/etc/affix.tin

@@ -0,0 +1,38 @@
+#var 幼朱雀 {影踪|蚕丝};
+#var 幼玄武 {铁血|玄铁};
+#var 幼青龙 {万象|金藤};
+#var 幼白虎 {天驱|虎皮};
+
+#var 小朱雀 {影踪|蚕丝|凤舞|荆棘|朱邙};
+#var 小玄武 {铁血|玄铁|地煞|无锋|玄奕};
+#var 小青龙 {万象|金藤|天罗|酥骨|青鲤};
+#var 小白虎 {天驱|虎皮|血牙|悲风|虎怒};
+
+#var 大朱雀 {朱璇|素商|赤璋|浴火|幻影|阿房};
+#var 大玄武 {玄蛇|严节|玄璜|镇海|玄沌|建章};
+#var 大青龙 {啸日|青阳|青圭|腾风|天眷|长乐};
+#var 大白虎 {虎贲|朱明|白琥|啸岳|寒岭|未央};
+
+#var 老朱雀 {鹰视|午文|天诛|易水寒|南明离火|扶摇|陵光神君|迦楼罗|朱雀};
+#var 老玄武 {无当|子文|太虚|万人敌|北水玄元|冥灵|执明神君|不动明王|玄武};
+#var 老青龙 {煮酒|卯文|噬魂|酒中仙|东乙青木|蔽日|孟章神君|摩利支天|青龙};
+#var 老白虎 {陷阵|酉文|虎魄|兰陵王|西庚锐金|羊角|监兵神君|因陀罗|白虎};
+
+#var 朱雀   {${小朱雀}|${大朱雀}|${老朱雀}};
+#var 玄武   {${小玄武}|${大玄武}|${老玄武}};
+#var 青龙   {${小青龙}|${大青龙}|${老青龙}};
+#var 白虎   {${小白虎}|${大白虎}|${老白虎}};
+
+#var 全职业装 {${白虎}|${朱雀}|${玄武}|${青龙}};
+
+#var 帮派套装 {龙王|药叉|金眼雕|鹿鼎公|南海鳄神|明光铠};
+#var 江湖套装 {帝释天|阿修罗|焚情|忘情|神驼|图穷|垂丝海棠|佛骨|五圣|镜花水月|剑歌|${帮派套装}};
+
+#var 随机装备 {机杼|苍野|青幽|百战|鬼烈|巨灵|深罡|九日};
+#var 随机首饰 {恶来|玄狐|洛神|盘瓠|儵忽|帝江|烛阴|盘古};
+#var 随机武器 {沉水|赤焰|荡寇|彗月|照夜|追日|断阙|刑天};
+#var 武器种类 {剑|刀|杖|鞭|斧|枪|锤|戟|匕|针|箫|钩};
+
+#var 随机部位 {盔|披风|袍|腰带|护腕|靴|盾|手套|铠甲};
+#var 首饰部位 {戒指|项链};
+#var 职业部位 {盔|披风|袍|腰带|护腕|靴|盾|护手|板甲|布甲|鳞甲|皮甲|面具|护心|护肩|腿甲};

+ 176 - 0
mud/pkuxkx/etc/loots.tin

@@ -0,0 +1,176 @@
+#nop vim: set filetype=tt:;
+
+/*
+本文件属于 PaoTin++ 的一部分
+===========
+PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
+你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
+===========
+*/
+
+#nop 战利品属性表。;
+
+/*
+价值(value)字段有几种情况:
+    - sell 去当铺卖掉
+    - donate 捐献可以获得道德
+    - drop 扔掉
+    - xiang 扔功德箱里
+    - store 存储物柜里
+    - dang 当到当铺里
+    - give 给大米
+*/
+#var gLootPool {
+    {牛皮酒袋/jiudai}               {{kind}{饮料}   {unit}{个}  {value}{sell}   }
+    {酸梅汤/suanmei tang}           {{kind}{饮料}   {unit}{杯}  {value}{sell}   }
+
+    {包子/baozi}                    {{kind}{食物}   {unit}{个}  {value}{sell}   }
+    {生煎馒头/shengjian mantou}     {{kind}{食物}   {unit}{个}  {value}{sell}   }
+    {馒头/man tou}                  {{kind}{食物}   {unit}{个}  {value}{sell}   }
+    {鲜肉粽子/xianrou zongzi}       {{kind}{食物}   {unit}{个}  {value}{sell}   }
+    {清蒸鲫鱼/qingzheng jiyu}       {{kind}{食物}   {unit}{份}  {value}{sell}   }
+    {素煎饺/jian jiao}              {{kind}{食物}   {unit}{只}  {value}{sell}   }
+    {烤鸡腿/jitui}                  {{kind}{食物}   {unit}{根}  {value}{sell}   }
+    {冬菜包/dongcai bao}            {{kind}{食物}   {unit}{盘}  {value}{sell}   }
+    {扬州炒饭/yangzhou chaofan}     {{kind}{食物}   {unit}{碗}  {value}{sell}   }
+    {五香花生/huasheng}             {{kind}{食物}   {unit}{碟}  {value}{sell}   }
+    {南翔小笼/nanxiang xiaolong}    {{kind}{食物}   {unit}{笼}  {value}{sell}   }
+
+    {羊下水/yang xiashui}           {{kind}{食材}   {unit}{副}  {value}{sell}   }
+    {扇贝/shan bei}                 {{kind}{食材}   {unit}{只}  {value}{sell}   }
+    {猪心/zhu xin}                  {{kind}{食材}   {unit}{只}  {value}{sell}   }
+    {生海胆/hai dan}                {{kind}{食材}   {unit}{只}  {value}{sell}   }
+    {生蚝/sheng hao}                {{kind}{食材}   {unit}{只}  {value}{sell}   }
+    {辣椒/la jiao}                  {{kind}{食材}   {unit}{只}  {value}{sell}   }
+    {鸡蛋/ji dan}                   {{kind}{食材}   {unit}{只}  {value}{sell}   }
+    {兽肉/shou rou}                 {{kind}{食材}   {unit}{块}  {value}{sell}   }
+    {宠物肉/chongwu rou}            {{kind}{食材}   {unit}{块}  {value}{sell}   }
+    {排骨/pai gu}                   {{kind}{食材}   {unit}{块}  {value}{sell}   }
+    {牛腱子/niu jian}               {{kind}{食材}   {unit}{块}  {value}{sell}   }
+    {猪肉/zhu rou}                  {{kind}{食材}   {unit}{块}  {value}{sell}   }
+    {生牛肉/sheng niurou}           {{kind}{食材}   {unit}{块}  {value}{sell}   }
+    {生猪肉/sheng zhurou}           {{kind}{食材}   {unit}{块}  {value}{sell}   }
+    {生羊肉/sheng yangrou}          {{kind}{食材}   {unit}{块}  {value}{sell}   }
+    {盐块/yan kuai}                 {{kind}{食材}   {unit}{块}  {value}{sell}   }
+    {糖块/tang kuai}                {{kind}{食材}   {unit}{块}  {value}{sell}   }
+    {羊肩肉/yang jianrou}           {{kind}{食材}   {unit}{块}  {value}{sell}   }
+    {羊腿肉/yang tui}               {{kind}{食材}   {unit}{块}  {value}{sell}   }
+    {翡翠豆腐/doufu}                {{kind}{食材}   {unit}{块}  {value}{sell}   }
+    {螃蟹肉/pangxie rou}            {{kind}{食材}   {unit}{块}  {value}{sell}   }
+    {蹄膀/ti bang}                  {{kind}{食材}   {unit}{块}  {value}{sell}   }
+    {鸭翅/ya chi}                   {{kind}{食材}   {unit}{块}  {value}{sell}   }
+    {鸭腿/ya tui}                   {{kind}{食材}   {unit}{块}  {value}{sell}   }
+    {五花肉/wuhua rou}              {{kind}{食材}   {unit}{条}  {value}{sell}   }
+    {海参/hai shen}                 {{kind}{食材}   {unit}{条}  {value}{sell}   }
+    {牛鞭/niu bian}                 {{kind}{食材}   {unit}{根}  {value}{sell}   }
+    {鸡翅/ji chi}                   {{kind}{食材}   {unit}{根}  {value}{sell}   }
+    {鸡腿/ji tui}                   {{kind}{食材}   {unit}{根}  {value}{sell}   }
+    {米饭/mi fan}                   {{kind}{食材}   {unit}{碗}  {value}{sell}   }
+    {羊奶/yang nai}                 {{kind}{食材}   {unit}{碗}  {value}{sell}   }
+
+    {胡椒粉/hujiao fen}             {{kind}{食材}   {unit}{撮}  {value}{drop}   }
+    {姜/jiang}                      {{kind}{食材}   {unit}{只}  {value}{drop}   }
+    {葱/cong}                       {{kind}{食材}   {unit}{根}  {value}{drop}   }
+    {盐粒/yan li}                   {{kind}{食材}   {unit}{块}  {value}{drop}   }
+    {面团/mian tuan}                {{kind}{食材}   {unit}{块}  {value}{drop}   }
+    {荣华月饼/shangyueshipin}       {{kind}{食物}   {unit}{个}  {value}{drop}   }
+
+    {三国志/sanguo zhi}             {{kind}{史书}   {unit}{套}  {value}{sell}   }
+    {北史/bei shi}                  {{kind}{史书}   {unit}{套}  {value}{sell}   }
+    {北齐书/beiqi shu}              {{kind}{史书}   {unit}{套}  {value}{sell}   }
+    {南史/nan shi}                  {{kind}{史书}   {unit}{套}  {value}{sell}   }
+    {南齐书/nanqi shu}              {{kind}{史书}   {unit}{套}  {value}{sell}   }
+    {史记/shi ji}                   {{kind}{史书}   {unit}{套}  {value}{sell}   }
+    {后汉书/houhan shu}             {{kind}{史书}   {unit}{套}  {value}{sell}   }
+    {周书/zhou shu}                 {{kind}{史书}   {unit}{套}  {value}{sell}   }
+    {宋书/song shu}                 {{kind}{史书}   {unit}{套}  {value}{sell}   }
+    {宋史/song shi}                 {{kind}{史书}   {unit}{套}  {value}{sell}   }
+    {新五代史/xin wudaishi}         {{kind}{史书}   {unit}{套}  {value}{sell}   }
+    {新唐书/xin tangshu}            {{kind}{史书}   {unit}{套}  {value}{sell}   }
+    {旧五代史/jiu wudaishi}         {{kind}{史书}   {unit}{套}  {value}{sell}   }
+    {旧唐书/jiu tangshu}            {{kind}{史书}   {unit}{套}  {value}{sell}   }
+    {晋书/jin shu}                  {{kind}{史书}   {unit}{套}  {value}{sell}   }
+    {梁书/liang shu}                {{kind}{史书}   {unit}{套}  {value}{sell}   }
+    {汉书/han shu}                  {{kind}{史书}   {unit}{套}  {value}{sell}   }
+    {辽史/liao shi}                 {{kind}{史书}   {unit}{套}  {value}{sell}   }
+    {金史/jin shi}                  {{kind}{史书}   {unit}{套}  {value}{sell}   }
+    {陈书/chen shu}                 {{kind}{史书}   {unit}{套}  {value}{sell}   }
+    {隋书/sui shu}                  {{kind}{史书}   {unit}{套}  {value}{sell}   }
+    {魏书/wei shu}                  {{kind}{史书}   {unit}{套}  {value}{sell}   }
+
+    {铜钹/tong bo}                  {{kind}{兵器}   {unit}{对}  {value}{sell}   }
+    {判官笔/panguan bi}             {{kind}{兵器}   {unit}{把}  {value}{sell}   }
+    {板斧/banfu}                    {{kind}{兵器}   {unit}{把}  {value}{sell}   }
+    {药锄/yaochu}                   {{kind}{兵器}   {unit}{把}  {value}{sell}   }
+    {蝎尾鞭/xiewei bian}            {{kind}{兵器}   {unit}{把}  {value}{sell}   }
+    {铁刀/blade}                    {{kind}{兵器}   {unit}{把}  {value}{sell}   }
+    {铁剑/sword}                    {{kind}{兵器}   {unit}{把}  {value}{sell}   }
+    {铁匕/dagger}                   {{kind}{兵器}   {unit}{把}  {value}{sell}   }
+    {铁匕首/tie bishou}             {{kind}{兵器}   {unit}{把}  {value}{sell}   }
+    {铁戟/halberd}                  {{kind}{兵器}   {unit}{把}  {value}{sell}   }
+    {铁斧/axe}                      {{kind}{兵器}   {unit}{把}  {value}{sell}   }
+    {铁杖/staff}                    {{kind}{兵器}   {unit}{把}  {value}{sell}   }
+    {铁枪/spear}                    {{kind}{兵器}   {unit}{把}  {value}{sell}   }
+    {铁锤/hammer}                   {{kind}{兵器}   {unit}{把}  {value}{sell}   }
+    {铁鞭/whip}                     {{kind}{兵器}   {unit}{把}  {value}{sell}   }
+    {锄头/chu tou}                  {{kind}{兵器}   {unit}{把}  {value}{sell}   }
+    {锯子/ju zi}                    {{kind}{兵器}   {unit}{把}  {value}{sell}   }
+    {狼牙箭/langya jian}            {{kind}{兵器}   {unit}{支}  {value}{sell}   }
+    {玉箫/yu xiao}                  {{kind}{兵器}   {unit}{支}  {value}{sell}   }
+    {箭/yu jian}                    {{kind}{兵器}   {unit}{支}  {value}{sell}   }
+    {方天画戟/fangtian ji}          {{kind}{兵器}   {unit}{杆}  {value}{sell}   }
+    {长枪/chang qiang}              {{kind}{兵器}   {unit}{杆}  {value}{sell}   }
+    {长矛/changmao}                 {{kind}{兵器}   {unit}{杆}  {value}{sell}   }
+    {降魔杵/xiangmo chu}            {{kind}{兵器}   {unit}{杆}  {value}{sell}   }
+    {马槊/ma shuo}                  {{kind}{兵器}   {unit}{杆}  {value}{sell}   }
+    {钢刀/blade}                    {{kind}{兵器}   {unit}{柄}  {value}{sell}   }
+    {钢剑/jian}                     {{kind}{兵器}   {unit}{柄}  {value}{sell}   }
+    {铁斧/tie fu}                   {{kind}{兵器}   {unit}{柄}  {value}{sell}   }
+    {铁钩/tie gou}                  {{kind}{兵器}   {unit}{柄}  {value}{sell}   }
+    {长剑/changjian}                {{kind}{兵器}   {unit}{柄}  {value}{sell}   }
+    {长弓/chang gong}               {{kind}{兵器}   {unit}{柄}  {value}{sell}   }
+    {长柄重斧/changbing zhongfu}    {{kind}{兵器}   {unit}{柄}  {value}{sell}   }
+    {长鞭/chang bian}               {{kind}{兵器}   {unit}{柄}  {value}{sell}   }
+    {法杵/fa chu}                   {{kind}{兵器}   {unit}{根}  {value}{sell}   }
+    {竹棒/zhubang}                  {{kind}{兵器}   {unit}{根}  {value}{sell}   }
+    {钢杖/gangzhang}                {{kind}{兵器}   {unit}{根}  {value}{sell}   }
+    {铁桨/tie jiang}                {{kind}{兵器}   {unit}{根}  {value}{sell}   }
+
+    {禅杖/chan zhang}               {{kind}{兵器}   {unit}{根}  {value}{donate;drop}}
+    {齐眉棍/qimei gun}              {{kind}{兵器}   {unit}{根}  {value}{donate;drop}}
+    {%+花枝/%*}                     {{kind}{花枝}               {value}{donate;drop}}
+
+    {铁蒺藜/tie jili}               {{kind}{暗器}   {unit}{枚}  {value}{sell}   }
+    {无影针/wuying zhen}            {{kind}{暗器}   {unit}{根}  {value}{sell}   }
+
+    {盲盒/mang he}                  {{kind}{杂物}   {unit}{只}  {value}{reserve}}
+    {折扇/zhe shan}                 {{kind}{杂物}   {unit}{把}  {value}{sell}   }
+    {骑弓/qi gong}                  {{kind}{杂物}   {unit}{柄}  {value}{sell}   }
+    {瓷酒瓶/lanling jiu}            {{kind}{杂物}   {unit}{只}  {value}{sell}   }
+    {飞镖/fei biao}                 {{kind}{杂物}   {unit}{只}  {value}{sell}   }
+    {烟杆/yan gan}                  {{kind}{杂物}   {unit}{根}  {value}{sell}   }
+
+    {花铲/hua chan}                 {{kind}{杂物}   {unit}{把}  {value}{drop}   }
+    {茶/cha}                        {{kind}{杂物}   {unit}{根}  {value}{drop}   }
+    {指劲/jin}                      {{kind}{杂物}   {unit}{道}  {value}{drop}   }
+    {菜肴/dish}                     {{kind}{杂物}   {unit}{份}  {value}{drop}   }
+    {食物/food}                     {{kind}{杂物}   {unit}{件}  {value}{drop}   }
+    {烧糊的残渣/can zha}            {{kind}{杂物}   {unit}{团}  {value}{drop}   }
+    {小糖块/tang kuai}              {{kind}{杂物}   {unit}{块}  {value}{drop}   }
+    {花瓣/hua ban}                  {{kind}{杂物}   {unit}{朵}  {value}{drop}   }
+
+    {丁香/ding xiang}               {{kind}{花卉}   {unit}{朵}  {value}{sell}   }
+    {康乃馨/kangnaixin}             {{kind}{花卉}   {unit}{朵}  {value}{sell}   }
+    {火鹤/huo he}                   {{kind}{花卉}   {unit}{朵}  {value}{sell}   }
+    {牡丹/mu dan}                   {{kind}{花卉}   {unit}{朵}  {value}{sell}   }
+    {百合/bai he}                   {{kind}{花卉}   {unit}{朵}  {value}{sell}   }
+    {石斛兰/shihu lan}              {{kind}{花卉}   {unit}{朵}  {value}{sell}   }
+    {秋海棠/qiu haitang}            {{kind}{花卉}   {unit}{朵}  {value}{sell}   }
+    {红玫瑰/hong meigui}            {{kind}{花卉}   {unit}{朵}  {value}{sell}   }
+    {蝴蝶兰/hudie lan}              {{kind}{花卉}   {unit}{朵}  {value}{sell}   }
+    {郁金香/yu jinxiang}            {{kind}{花卉}   {unit}{朵}  {value}{sell}   }
+    {马蹄莲/mati lian}              {{kind}{花卉}   {unit}{朵}  {value}{sell}   }
+    {白玫瑰/bai meigui}             {{kind}{花卉}   {unit}{朵}  {value}{sell}   }
+    {情人草/qingren cao}            {{kind}{花卉}   {unit}{株}  {value}{sell}   }
+    {金鱼草/jinyu cao}              {{kind}{花卉}   {unit}{朵}  {value}{sell}   }
+};

+ 1 - 1
mud/pkuxkx/plugins/basic/char/__init__.tin

@@ -3,7 +3,7 @@
 load-module {basic/char/hp};
 load-module {basic/char/skills};
 load-module {basic/char/status};
-load-module {basic/char/i2};
+load-module {basic/char/backpack};
 load-module {basic/char/sachet};
 load-module {basic/char/score};
 load-module {basic/char/gmcp};

+ 522 - 0
mud/pkuxkx/plugins/basic/char/backpack.tin

@@ -0,0 +1,522 @@
+#nop vim: set filetype=tt:;
+
+/*
+本文件属于 PaoTin++ 的一部分
+===========
+PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
+你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
+===========
+*/
+
+#var basic_char_backpack[META] {
+    {NAME}      {背包管理}
+    {DESC}      {解析背包内容,识别物品信息,并储存到变量。并提供必要的整理工具}
+    {AUTHOR}    {担子炮}
+    {NOTE}      {本文件属于 PaoTin++ 的一部分}
+};
+
+/*
+i2 格式:
+你身上带著下列这些东西(负重 27%):
+九十一两白银(Silver)
+一粒牛黃血竭丹(Xuejie dan)
+二个竹壶(Zhuhu)
+三块干粮(Gan liang)
+大砍刀(Dakan dao)
+青锋剑(Qingfeng sword)
+北侠战袍(Pkuxkx zhanpao)
+北侠战甲(Pkuxkx zhanjia)
+北侠战衣(Pkuxkx zhanyi)
+北侠战盔(Pkuxkx zhankui)
+北侠战靴(Pkuxkx zhanxue)
+锦囊(Jin nang)
+
+-------------------------------------------
+你左手拿着:大砍刀(Dakan dao)
+你右手拿着:青锋剑(Qingfeng sword)
+
+-------------------------------------------
+你身上穿着:
+北侠战袍(Pkuxkx zhanpao)
+北侠战甲(Pkuxkx zhanjia)
+北侠战衣(Pkuxkx zhanyi)
+北侠战盔(Pkuxkx zhankui)
+北侠战靴(Pkuxkx zhanxue)
+锦囊(Jin nang)
+*/
+
+VAR {所有随身物品,包括武器装备食物饮料,但不包括包袱里的内容} char.Item  {};
+VAR {现金(银票/黄金/白银/铜板)}   char.Cash           {};
+VAR {已经穿戴的装备}                char.Wear           {};
+VAR {已经装备的武器}                char.Wield          {};
+VAR {没有穿戴的装备}                char.Equip          {};
+VAR {已经 autoload 的装备}          char.Autoload       {};
+VAR {背包里所有物品的 ID}           char.ItemID         {};
+VAR {包袱及其内容}                  char.Bag            {};
+
+VAR {背包内容是否已经脏了}          char.backpack.IsDirty {1};
+
+event.Define {char/i2}          {无参} {$MODULE} {i2 命令运行完毕,背包数据已更新};
+event.Define {char/id}          {无参} {$MODULE} {id 命令运行完毕,背包数据已更新};
+event.Define {char/backpack}    {无参} {$MODULE} {i2 和 id 命令运行完毕,背包数据已更新};
+event.Define {char/bag}         {无参} {$MODULE} {look bag 命令运行完毕,背包数据已更新};
+
+#func {basic_char_backpack.Init} {
+    load-config affix;
+    load-config loots;
+    #return true;
+};
+
+#alias {char.reset.i2} {
+    #var char.Item      {};
+    #var char.Cash      {};
+    #var char.Wear      {};
+    #var char.Wield     {};
+    #var char.Equip     {};
+    #var char.Autoload  {};
+    #var char.ItemID    {};
+};
+
+#alias {char.reset.bag} {
+    #local id {%1};
+    #if { "$id" != "%+1..d" } {
+        #return;
+    };
+    #var char.Bag[$id]  {};
+};
+
+#var 汉字数词 {(?:零|一|二|三|四|五|六|七|八|九|十|百|千|万|亿)+};
+#var 汉字量词 {(?:本|块|碗|件|册|柄|把|根|枚|个|粒|味|0)};
+#var 词缀修饰 {(?:[^ ][^ ])+};
+
+#alias {char.backpack.set} {
+    #local type     {%1};
+    #local amount   {%2};
+    #local unit     {%3};
+    #local name     {%4};
+    #local id       {@str.ToLower{%5}};
+
+    #if { "$char.backpack.currentType" == "穿戴" } {
+        #local type {Wear};
+    };
+    #elseif { "$char.backpack.currentType" == "包袱" } {
+        #local type {Bag[$char.backpack.currentBag]};
+    };
+
+    #if { "$type" != "{Item|Cash|Wear|Wield|Equip|Bag\[\d+\]}" } {
+        #return;
+    };
+
+    #if { "$type" == "Item" } {
+        #if { "$amount" == "" && "$name" == "{${汉字数词}}%+1u%+1..u" } {
+            #local new {$name};
+            #replace new {^{${汉字数词}}%+1u%+1..u$} {
+                {amount}    {&1}
+                {unit}      {&2}
+                {name}      {&3}
+            };
+            #local new {$new};
+            #local keys {@table.Keys{gLootPool;{$new[name]/$id}}};
+            #local count {@sset.Size{$keys}};
+            #if { $count == 0 } {
+                warnLog 疑似未知掉落物「$new[name]/$id」,单位为「$new[unit]」,请确认。;
+            };
+            #elseif { $count == 1 } {
+                #if { "$gLootPool[$keys][unit]" == "$new[unit]" } {
+                    #local name     {$new[name]};
+                    #local unit     {$new[unit]};
+                    #local amount   {$new[amount]};
+                };
+                #else {
+                    warnLog 掉落物「$new[name]/$id」的单位「$new[unit]」与数据库中($gLootPool[$keys][unit])不符,请确认。;
+                };
+            };
+        };
+    };
+
+    #if { "$amount" == "" } {
+        #local amount {1};
+    };
+    #else {
+        #local amount {@math.ParseCN{$amount}};
+    };
+
+    #if { "$type" == "Wear" } {
+        #if { "$char.Wear[$name/$id]" != "" } {
+            #local amount {@math.Eval{$char.Wear[$name/$id][amount] + 1}};
+        };
+    };
+
+    #var {char.${type}[$name/$id]} {
+        {name}      {$name}
+        {id}        {@str.ToLower{$id}}
+        {amount}    {$amount}
+    };
+
+    #if { "$type" == "{Equip|Cash}" } {
+        #var {char.Item[$name/$id]} {
+            {name}      {$name}
+            {id}        {@str.ToLower{$id}}
+            {amount}    {$amount}
+        };
+    };
+};
+
+#action {^这是一个粗布做的大包袱,里面可以装很多东西。$E} {
+    #local bag {@ga.ThisCmd{}};
+    #replace bag {^%* bag%s%d$} {&3};
+    char.backpack.parse {bag} {$bag};
+};
+
+#action {^你身上带著下列这些东西(负重 %1%):$E} {
+    #var char.backpack.IsDirty 0;
+    char.backpack.parse i2;
+};
+
+#alias {char.backpack.parse} {
+    #local where {%1};
+    #local index {%2};
+
+    #class ParseItems open;
+
+    #var char.backpack.currentType {随身};
+    #var char.backpack.currentBag  {1};
+
+    #if { "$where" == "i2" } {
+        char.reset.i2;
+    };
+    #elseif { "$where" == "bag" } {
+        #local index {@defaultNum{$index;1}};
+        #var char.backpack.currentType {包袱};
+        #var char.backpack.currentBag {$index};
+        char.reset.bag $index;
+    };
+
+    #nop 九十一两白银(Silver);
+    #action {^{?:(?:(${汉字数词})(两|文|张))?}{黄金|白银|铜板|一千两银票}(%*)$} {
+        char.backpack.set {Cash} {%%1} {%%2} {%%3} {%%4};
+    } {4.2};
+
+    #action {^{?:(?:(${汉字数词})件)?}{${全职业装}}之{${职业部位}}(%*)$} {
+        char.backpack.set {Equip} {%%1} {件} {%%2之%%3} {%%4};
+    } {4.2};
+
+    #action {^{?:(?:(${汉字数词})件)?}{${随机装备}}之{${随机部位}}(%*)$} {
+        char.backpack.set {Equip} {%%1} {件} {%%2之%%3} {%%4};
+    } {4.2};
+
+    #action {^{?:(?:(${汉字数词})件)?}{${随机首饰}}之{${首饰部位}}(%*)$} {
+        char.backpack.set {Equip} {%%1} {件} {%%2之%%3} {%%4};
+    } {4.2};
+
+    #action {^{?:(?:(${汉字数词})件)?}{${江湖套装}}%S(%*)$} {
+        char.backpack.set {Equip} {%%1} {件} {%%2之%%3} {%%4};
+    } {4.2};
+
+    #action {^{?:(?:(${汉字数词})柄)?}{${随机武器}}之{${武器种类}}(%*)$} {
+        char.backpack.set {Equip} {%%1} {柄} {%%2之%%3} {%%4};
+    } {4.2};
+
+    #nop 镶嵌了宝石的随机装备或职业装备;
+    #action {^{?:(?:(${汉字数词})(柄|件))?}%S %S之%S(%*)$} {
+        char.backpack.set {Equip} {%%1} {%%2} {%%3 %%4之%%5} {%%6};
+    } {4.2};
+
+    #nop 镶嵌了宝石的江湖套装;
+    #action {^{?:(${汉字数词})(${汉字量词})|}%S %S(%*)$} {
+        char.backpack.set {Equip} {%%1} {%%2} {%%3 %%4} {%%5};
+    } {4.3};
+
+    #nop 其它物品;
+    #action {^{?:(${汉字数词})(${汉字量词})|}%S(%*)$} {
+        char.backpack.set {Item} {%%1} {%%2} {%%3} {%%4};
+    } {4.3};
+
+    #nop 其它物品;
+    #action {^%S(%*)$} {
+        char.backpack.set {Item} {一} {个} {%%1} {%%2};
+    } {4.4};
+
+    #nop 你左手拿着:大砍刀(Dakan dao);
+    #nop 你右手拿着:青锋剑(Qingfeng sword);
+    #action {^你{左手|右手}拿着:%*(%*)$} {
+        #local hand     {%%1};
+        #local item     {%%2};
+        #local id       {@str.ToLower{%%3}};
+        #var char.Wield[$item/$hand/$id] {
+            {hand}  {$hand}
+            {item}  {$item}
+            {id}    {$id}
+        };
+    } {4.1};
+
+    #action {^你手里什么也没拿$} {
+        #var char.Wield {};
+    };
+
+    #action {^你身上穿着:$} {
+        #var char.backpack.currentType {穿戴};
+    };
+
+    event.HandleOnce GA {backpack/i2} {char/backpack} {
+        event.Emit char/i2;
+        #class ParseItems kill;
+        #0
+    };
+
+    #class ParseItems close;
+};
+
+#action {^你身上携带物品的别称如下 :$E} {
+    #class ParseItems open;
+
+    #var {char.ItemID} {};
+
+    #action {^%*%s = %*{|ID=char/ItemID}$} {
+        #local name {@str.Trim{%%1}};
+        #local ids  {@str.Split{{%%3};{, }}};
+        #local uuid {};
+        #local type {};
+        #local id {};
+        #foreach {$ids} {id} {
+            #if { "$id" == "my %*" } {
+                #replace {id} {my } {};
+                #local type {$id};
+                #continue;
+            };
+            #if { "$id" == "{am|wp}_%d" } {
+                #local uuid {$id};
+                #continue;
+            };
+
+            #local amount {1};
+            #if { &char.ItemID[$name/$id] > 0 } {
+                #local amount {@math.Eval{ $char.ItemID[$name/$id][amount] + 1 }};
+            };
+
+            #var {char.ItemID[$name/$id]} {
+                {name}      {$name}
+                {id}        {$id}
+                {amount}    {$amount}
+                {ids}       {$ids}
+            };
+        };
+
+        #if { "$uuid" != "" } {
+            #var {char.Autoload[$type/$uuid]} {
+                {name}  {$name}
+                {type}  {$type}
+                {uuid}  {$uuid}
+                {ids}   {$ids}
+            };
+        };
+    } {4};
+
+    event.HandleOnce GA {backpack/id} {char/backpack} {
+        event.Emit char/id;
+        #class ParseItems kill;
+        #0
+    };
+
+    #class ParseItems close;
+};
+
+///=== {
+// ## char.backpack.Refresh [<是否强制刷新>]
+//    刷新背包数据。
+//    默认会检测 char.backpack.IsDirty 变量,除非必要负责不向服务器发送任何命令。
+//    但用户可以传递参数 true 以启用强制刷新。
+// };
+#alias {char.backpack.Refresh} {
+    #local force {@default{%1;false}};
+
+    #if { !@isTrue{$force} && !$char.backpack.IsDirty } {
+        warnLog 背包数据未发生变更,无需刷新。;
+        #return;
+    };
+
+    #class char.backpack.refresh open;
+
+    #gag {^%*{|ID=char/backpack/refresh}$};
+
+    #action {^等等,系统喘气中......{|ID=char/backpack/Refresh}$} {
+        errLog 物品 ID 数据刷新失败,稍后即将重试。;
+        #ungag {^%*{|ID=char/backpack/refresh}$};
+        #delay char.backpack.refresh {
+            #class char.backpack.refresh assign #gag {^%*{|ID=char/backpack/refresh}$};
+            id;
+        } 10;
+    };
+
+    #nop i2 命令不会失败,但 id 命令有 CD,会失败。;
+    i2; id;
+
+    event.HandleOnce {char/id} {char.backpack.refresh} {char/backpack} {
+        okLog 背包数据已刷新。;
+        #class char.backpack.refresh kill;
+        event.Emit char/backpack;
+        #0
+    };
+
+    #undelay char.backpack.refresh;
+
+    #class char.backpack.refresh close;
+};
+
+///=== {
+// #@ char.backpack.Query <范围> <ID 或名称>
+//    查询角色是否携带有某样物品。如果有,则返回 ID 和名称;否则返回空串。
+//    查询范围:
+//      Item:       所有物品(但不包括包袱里的内容)
+//      Wear:       穿戴
+//      Wield:      手持的装备(武器或盾牌)
+//      Equip:      携带的装备
+//      Autoload:   Autoload 的装备
+//      ItemID:     id 命令看到的数据
+//      Bag:        包袱里的物品
+// };
+#func {char.backpack.Query} {
+    #local range    {%1};
+    #local key      {%2};
+    #local func     {@default{%3;char.backpack.Query}};
+
+    #if { "$range" != "{Item|Cash|Wear|Wield|Equip|Autoload|ItemID}" } {
+        xtt.Usage $func;
+        #return;
+    };
+
+    #local items {};
+    #local var {};
+    #local items {@table.Keys{char.$range;{$key/%*}}};
+    #if { "$items" == "" } {
+        #local items {@table.Keys{char.$range;{%*/$key}}};
+    };
+
+    #return {$items};
+};
+
+///=== {
+// #@ char.backpack.Has <范围> <ID 或名称>
+//    查询角色是否携带有某样物品。如果有,则返回真,否则返回假。
+//    查询范围参见 HELP char.backpack.Query。
+// };
+#func {char.backpack.Has} {
+    #local items {@char.backpack.Query{{%1};{%2}}};
+
+    #if { "$items" == "" } {
+        #return 0;
+    };
+    #else {
+        #return 1;
+    };
+};
+
+///=== {
+// ## char.backpack.SellAll
+//    把身上的低价值物品全部卖掉。
+// };
+#alias {char.backpack.SellAll} {
+    #if { $char.backpack.IsDirty } {
+        char.backpack.Refresh;
+        event.HandleOnce {char/backpack} {char.backpack.SellAll} {char/backpack} {char.backpack.SellAll};
+        #return;
+    };
+
+    #class char.backpack.SellAll open;
+
+    #var char.backpack.SellAll.index {&char.Item[]};
+
+    #alias {char.backpack.SellAll.do} {
+        #if { $char.backpack.SellAll.index == 0 } {
+            okLog 背包里的所有杂物都已经卖完了。;
+            char.backpack.Refresh true;
+            #undelay char.backpack.SellAll.do;
+            #class char.backpack.SellAll kill;
+            #return;
+        };
+
+        #if { @char.IsBusy{} } {
+            #delay char.backpack.SellAll.do {char.backpack.SellAll.do} 1;
+            #return;
+        };
+
+        #local item {$char.Item[+$char.backpack.SellAll.index]};
+        math.Inc char.backpack.SellAll.index -1;
+        #local attr {$gLootPool[$item[name]/$item[id]]};
+        #if { "$attr[value]" == "sell" } {
+            #if { $item[amount] == 1 } {
+                sell $item[id];
+            };
+            #else {
+                sell $item[id] for $item[amount];
+            };
+            #delay char.backpack.SellAll.do {char.backpack.SellAll.do} 1;
+            #return;
+        };
+
+        #delay char.backpack.SellAll.do {char.backpack.SellAll.do} 0;
+    };
+
+    char.backpack.SellAll.do;
+
+    #class char.backpack.SellAll close;
+};
+
+///=== {
+// ## char.backpack.DropAll
+//    把身上的不能卖的低价值物品全部扔掉。
+// };
+#alias {char.backpack.DropAll} {
+    #if { $char.backpack.IsDirty } {
+        char.backpack.Refresh;
+        event.HandleOnce {char/backpack} {char.backpack.DropAll} {char/backpack} {char.backpack.DropAll};
+        #return;
+    };
+
+    #class char.backpack.DropAll open;
+
+    #var char.backpack.DropAll.index {&char.Item[]};
+
+    #alias {char.backpack.DropAll.do} {
+        #if { $char.backpack.DropAll.index == 0 } {
+            okLog 背包里的所有杂物都已经扔完了。;
+            char.backpack.Refresh true;
+            #undelay char.backpack.DropAll.do;
+            #class char.backpack.DropAll kill;
+            #return;
+        };
+
+        #if { @char.IsBusy{} } {
+            #delay char.backpack.DropAll.do {char.backpack.DropAll.do} 1;
+            #return;
+        };
+
+        #local item {$char.Item[+$char.backpack.DropAll.index]};
+        math.Inc char.backpack.DropAll.index -1;
+        #local attr {$gLootPool[$item[name]/$item[id]]};
+        #if { "$attr[value]" == "drop" } {
+            #if { $item[amount] == 1 } {
+                drop $item[id];
+            };
+            #elseif { $item[amount] <= 10 } {
+                do $item[amount] drop $item[id];
+            };
+            #else {
+                #$item[amount] drop $item[id];
+            };
+            #delay char.backpack.DropAll.do {char.backpack.DropAll.do} 1;
+            #return;
+        };
+
+        #delay char.backpack.DropAll.do {char.backpack.DropAll.do} 0;
+    };
+
+    char.backpack.DropAll.do;
+
+    #class char.backpack.DropAll close;
+};
+
+#action {^你放下手中的%*。$E}           {#var char.backpack.IsDirty 1};
+#action {^你举起%*之盾遮护自身。$E}     {#var char.backpack.IsDirty 1};
+#action {^你装备%*做武器。$E}           {#var char.backpack.IsDirty 1};
+#action {^你打开盲盒,发现了%*。$E}     {#var char.backpack.IsDirty 1};

+ 0 - 209
mud/pkuxkx/plugins/basic/char/i2.tin

@@ -1,209 +0,0 @@
-#nop vim: set filetype=tt:;
-
-/*
-本文件属于 PaoTin++ 的一部分
-===========
-PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
-你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
-===========
-*/
-
-#var basic_char_i2[META] {
-    {NAME}      {背包信息}
-    {DESC}      {解析背包内容,识别随身物品、穿戴、装备信息,并储存到变量}
-    {AUTHOR}    {担子炮}
-    {NOTE}      {本文件属于 PaoTin++ 的一部分}
-};
-
-/*
-i2 格式:
-你身上带著下列这些东西(负重 27%):
-九十一两白银(Silver)
-一粒牛黃血竭丹(Xuejie dan)
-二个竹壶(Zhuhu)
-三块干粮(Gan liang)
-大砍刀(Dakan dao)
-青锋剑(Qingfeng sword)
-北侠战袍(Pkuxkx zhanpao)
-北侠战甲(Pkuxkx zhanjia)
-北侠战衣(Pkuxkx zhanyi)
-北侠战盔(Pkuxkx zhankui)
-北侠战靴(Pkuxkx zhanxue)
-锦囊(Jin nang)
-
--------------------------------------------
-你左手拿着:大砍刀(Dakan dao)
-你右手拿着:青锋剑(Qingfeng sword)
-
--------------------------------------------
-你身上穿着:
-北侠战袍(Pkuxkx zhanpao)
-北侠战甲(Pkuxkx zhanjia)
-北侠战衣(Pkuxkx zhanyi)
-北侠战盔(Pkuxkx zhankui)
-北侠战靴(Pkuxkx zhanxue)
-锦囊(Jin nang)
-*/
-
-#func {basic_char_i2.Init} {
-    char.reset.i2;
-    char.reset.bag;
-    char.reset.sachet;
-    #return true;
-};
-
-#alias {char.reset.i2} {
-    #class data/basic/char open;
-    #nop 随身物品;
-    #var char-Item      {};
-    #nop 穿戴;
-    #var char-Wear      {};
-    #nop 武器;
-    #var char-Wield     {};
-    #nop 装备;
-    #var char-Equip     {};
-    #class data/basic/char close;
-};
-
-#alias {char.reset.bag} {
-    #class data/basic/char open;
-    #nop 包袱;
-    #var char-Bag       {};
-    #class data/basic/char close;
-};
-
-#alias {char.reset.sachet} {
-    #class data/basic/char open;
-    #nop 宝石袋;
-    #var char-Sachet    {};
-    #class data/basic/char close;
-};
-
-#action {^你身上带著下列这些东西(负重 %1%):$} {
-    #class {ParseItems} open;
-
-    char.reset.i2;
-    #var char-Item[currentType] {随身};
-
-    #nop 你左手拿着:大砍刀(Dakan dao);
-    #nop 你右手拿着:青锋剑(Qingfeng sword);
-    #action {^你{左手|右手}拿着:%%2(%%3)$} {
-        #local hand     {%%1};
-        #local item     {%%2};
-        #local id       {@str.ToLower{%%3}};
-        #var char-Wield[$hand] {
-            {item}{$item}
-            {id}{$id}
-        };
-    } {4};
-
-    #action {^你身上穿着:$} {
-        #var char-Item[currentType] {装备};
-    };
-
-    #nop 九十一两白银(Silver);
-    #action {^{(零|一|二|三|四|五|六|七|八|九|十|百|千|万|亿)+}{两|文|张}{黄金|白银|铜板|一千两银票}(%*)$} {
-        #local amount   {@math.ParseCN{%%1}};
-        #local unit     {%%3};
-        #local item     {%%4};
-        #local id       {@str.ToLower{%%5}};
-
-        #var {char-Item[$item]} {
-            {id}{@str.ToLower{$id}}
-            {amount}{@math.ParseCN{$amount}}
-        };
-    } {4};
-
-    #local 武器等级 {沉水|赤焰|荡寇|彗月|照夜|追日|断阙|刑天};
-    #local 武器种类 {剑|刀|杖|鞭|斧|枪|锤|戟|匕|针|萧|钩};
-
-    #local 装备等级 {机杼|苍野|青幽|百战|鬼烈|巨灵|深罡|九日};
-    #local 装备种类 {铠甲|靴|袍|手套|盔|盾|披风|腰带|护腕};
-
-    #local 饰品等级 {恶来|玄狐|洛神|盘瓠|儵忽|帝江|烛阴|盘古};
-    #local 饰品种类 {戒指|项链};
-
-    #local 职业等级 {(..)+};
-    #local 职业部位 {盔|护腕|披风|护手|袍|腰带|盾|靴|项链|戒指|(板|布|鳞|皮)甲|面具|护心|护肩|腿甲};
-
-    #local 汉字数词 {(?:零|一|二|三|四|五|六|七|八|九|十|百|千|万|亿)+};
-    #local 汉字量词 {(?:本|块|碗|件|册|柄|把|根|枚|个|粒|味|0)};
-    #local 词缀修饰 {(?:[^ ][^ ])+};
-
-    #nop 物品;
-    #action {^{?:(${汉字数词})(${汉字量词})|}%S(%*)$} {
-        #local amount   {@math.ParseCN{%%1}};
-        #local item     {%%3};
-        #local id       {@str.ToLower{%%4}};
-        #if { $amount == 0 } {
-            #local amount {1};
-        };
-        #var {char-Item[$item]} {
-            {id}{$id}
-            {amount}{$amount}
-        };
-    } {4};
-
-    #nop 职业装和随机装;
-    #nop 二件玄铁之护手(Gauntlet);
-    #nop 玄铁之板甲(Armor);
-    #nop 天兵华彩 巨灵之手套(Hands);
-    #action {^{((零|一|二|三|四|五|六|七|八|九|十|百|千|万|亿)+件)?}{(([^ ]+)[ ])?}%S之%S(%S)$} {
-        #local amount   {%%3};
-        #local title    {%%6};
-        #local rank     {%%7};
-        #local item     {%%8};
-        #local id       {@str.ToLower{%%9}};
-
-        #if { "${char-Item[currentType]}" == "装备" } {
-            #return;
-        };
-
-        #if { "$amount" == "" } { #format amount {%s} {一} };
-        #format amount {%s} {@math.ParseCN{$amount}};
-
-        #if { "${char-Equip[$id]}" != "" } {
-            #math amount { ${char-Equip[$id]} + $amount };
-        };
-
-        #var {char-Equip[$id]} {$amount};
-    } {4};
-
-    #nop 二把竹剑(Zhujian);
-    #action {^{(零|一|二|三|四|五|六|七|八|九|十|百|千|万|亿)+}{${汉字量词}}%S(%*)$} {
-        #local amount   {@math.ParseCN{%%1}};
-        #local unit     {%%3};
-        #local item     {%%4};
-        #local id       {@str.ToLower{%%5}};
-        #var {char-Item[$item]} {
-            {id}{$id}
-            {amount}{$amount}
-        };
-    };
-
-    #nop 大砍刀(Dakan dao);
-    #nop 青锋剑(Qingfeng sword);
-    #action {^%%1(%%2)$} {
-        #local item {%%1};
-        #local id   {@str.ToLower{%%2}};
-        #if { "${char-Item[currentType]}" == "装备" } {
-            #var {char-Wear[$item]} {{id}{$id}};
-        };
-        #elseif { "${char-Item[currentType]}" == "随身" } {
-            #var {char-Item[$item]} {{id}{$id}};
-        };
-        #elseif { "${char-Item[currentType]}" == "包袱" } {
-            #var {char-Bag[$item]} {{id}{$id}};
-        };
-        #elseif { "${char-Item[currentType]}" == "宝石袋" } {
-            #var {char-Sachet[$item]} {{id}{$id}};
-        };
-    } {9};
-
-    #delay 3 {
-        #unvar char-Item[currentType];
-        #class {ParseItems} kill;
-    };
-
-    #class {ParseItems} close;
-};