Просмотр исходного кода

feat(pkuxkx): 为锦囊增加两个功能,gem.Value 用来估算宝石价值,gem.SafelyPack 用来努力收纳宝石

dzp 1 год назад
Родитель
Сommit
82508966b7

+ 26 - 0
mud/pkuxkx/etc/gem.tin

@@ -0,0 +1,26 @@
+#nop vim: set filetype=tt:;
+
+#var {gem.Price} {
+    {地}    {2}
+    {山}    {4}
+    {水}    {13}
+    {风}    {40}
+    {雷}    {130}
+    {火}    {400}
+    {泽}    {1400}
+    {天}    {4200}
+};
+
+#var {gem.PriceScale} {
+    {日魂}      {9.10}
+    {月魄}      {3.10}
+    {玄武甲}    {1.60}
+    {凤凰羽}    {1.50}
+    {麒麟角}    {1.40}
+    {神龙骨}    {1.30}
+    {木灵}      {1.20}
+    {玉髓}      {1.03}
+    {玄冰}      {1.02}
+    {精金}      {1.01}
+    {炎晶}      {1.00}
+};

+ 37 - 7
mud/pkuxkx/plugins/basic/char/backpack.tin

@@ -103,7 +103,7 @@ event.Define {char/bag}         {无参} {$MODULE} {look bag 命令运行完毕
         #local type {Bag[$char.backpack.currentBag]};
     };
 
-    #if { "$type" != "{Item|Cash|Wear|Wield|Equip|Bag\[\d+\]}" } {
+    #if { "$type" != "{Item|Cash|Wear|Wield|Equip|Gem|Bag\[\d+\]}" } {
         #return;
     };
 
@@ -234,6 +234,10 @@ event.Define {char/bag}         {无参} {$MODULE} {look bag 命令运行完毕
         char.backpack.set {Equip} {%%1} {%%2} {%%3 %%4} {%%5};
     } {4.3};
 
+    #action {^{?:(?:(${汉字数词})颗)?}$GEM(%*)$} {
+        char.backpack.set {Gem} {%%1} {颗} {%%2} {%%3};
+    } {4.2};
+
     #nop 其它物品;
     #action {^{?:(${汉字数词})(${汉字量词})|}%S(%*)$} {
         char.backpack.set {Item} {%%1} {%%2} {%%3} {%%4};
@@ -375,28 +379,42 @@ event.Define {char/bag}         {无参} {$MODULE} {look bag 命令运行完毕
 //    查询角色是否携带有某样物品。如果有,则返回 ID 和名称;否则返回空串。
 //    查询范围:
 //      Item:       所有物品(但不包括包袱里的内容)
+//      Cash:       现金
 //      Wear:       穿戴
 //      Wield:      手持的装备(武器或盾牌)
 //      Equip:      携带的装备
+//      Gem:        背包里的宝石
 //      Autoload:   Autoload 的装备
 //      ItemID:     id 命令看到的数据
-//      Bag:        包袱里的物品
+//      BagN:       包袱里的物品,其中 N 表示是包袱的序号,省略表示 Bag1
 // };
 #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}" } {
+    #if { "$range" != "{Item|Cash|Wear|Wield|Equip|Gem|Autoload|ItemID|Bag\s*\d+}" } {
         xtt.Usage $func;
         #return;
     };
 
+    #local container {};
+
+    #if { "$range" == "Bag%s%d" } {
+        #local container {$range};
+        #replace container {^Bag%s%d$} {&2};
+        #local container {@defaultNum{$container;1}};
+        #local container {$char.Bag[$container]};
+    };
+    #else {
+        #local container {${char.$range}};
+    };
+
     #local items {};
     #local var {};
-    #local items {@table.Keys{char.$range;{$key/%*}}};
+    #local items {@table.Keys{container;{$key/%*}}};
     #if { "$items" == "" } {
-        #local items {@table.Keys{char.$range;{%*/$key}}};
+        #local items {@table.Keys{container;{%*/$key}}};
     };
 
     #return {$items};
@@ -427,7 +445,19 @@ event.Define {char/bag}         {无参} {$MODULE} {look bag 命令运行完毕
     #local range    {%1};
     #local key      {%2};
 
-    #local info {${char.${range}[$key]}};
+    #local container {};
+
+    #if { "$range" == "Bag%s%d" } {
+        #local container {$range};
+        #replace container {^Bag%s%d$} {&2};
+        #local container {@defaultNum{$container;1}};
+        #local container {$char.Bag[$container]};
+    };
+    #else {
+        #local container {${char.$range}};
+    };
+
+    #local info {$container[$key]};
     #if { "$info" == "" } {
         #local items {@char.backpack.Query{{$range};{$key}}};
 
@@ -441,7 +471,7 @@ event.Define {char/bag}         {无参} {$MODULE} {look bag 命令运行完毕
             #return -1;
         };
 
-        #local info {${char.${range}[$items]}};
+        #return @char.backpack.Amount{$range;$items};
     };
 
     #return {@defaultNum{$info[amount];1}};

+ 137 - 4
mud/pkuxkx/plugins/basic/char/sachet.tin

@@ -75,6 +75,10 @@ event.Define {char/sachet/remove}   {无参}  {$MODULE} {从宝石袋中取出
         #local code {$gem.name2code[$name]};
         #var gem.code2name[$code] {$name};
     };
+
+    load-config gem;
+
+    #return {true};
 };
 
 #var char[锦囊] {};
@@ -212,7 +216,7 @@ VAR {锦囊当前已经存储的宝石数量} {char.sachet.Amount}   {0};
     #local gem {$gem};
 
     #if { &gem[] == 0 } {
-        #return;
+        #return {};
     };
 
     #return {$gem.name2code[$gem[种类]]$gem.name2code[$gem[等级]]@str.ToUpper{$gem.name2code[$gem[阴阳]]}};
@@ -234,7 +238,7 @@ VAR {锦囊当前已经存储的宝石数量} {char.sachet.Amount}   {0};
     #local gem {$gem};
 
     #if { &gem[] == 0 } {
-        #return;
+        #return {};
     };
 
     #return {$gem.name2id[$gem[等级]] $gem.name2id[$gem[种类]]};
@@ -256,7 +260,7 @@ VAR {锦囊当前已经存储的宝石数量} {char.sachet.Amount}   {0};
     #local gem {$gem};
 
     #if { &gem[] == 0 } {
-        #return;
+        #return {};
     };
 
     #return {$gem.code2name[$gem[等级]]$gem.code2name[@str.ToLower{$gem[阴阳]}]$gem.code2name[$gem[种类]]};
@@ -325,7 +329,7 @@ VAR {锦囊最近一次操作的宝石名称} {char.sachet.Gem} {};
 };
 
 #alias {sachet.find.bug} {
-    #if { &char.sachet.bak[] == 0 } {
+    #if { &char.sachet.bak[] == 0 || $char.sachet.Max == 10 } {
         #return;
     };
 
@@ -354,3 +358,132 @@ VAR {锦囊最近一次操作的宝石名称} {char.sachet.Gem} {};
         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{$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;
+    };
+};