doumimi 发表于 2024-8-23 16:43:22

【Paotin++】入门系列之四: 最常用内置函数

本帖最后由 doumimi 于 2024-8-23 04:44 PM 编辑

系列贴目录: 【Paotin++】入门系列之一: 客户端基础 - 技术园地 - 北大侠客行MUD论坛 - Powered by Discuz! (pkuxkx.com)

这篇给大家介绍一下PaoTin++客户端最常用的一些函数。

还是那句话,PT本身是个大宝藏,里面包含了3万行代码, 而且文档也非常的丰富。 大家可以没事多看看HELP paotin。本文章分为两节介绍,一部分函数是跟游戏相关的,一部分是pt 对tt语法的增强xtintin部分。


游戏相关

一、 背包管理

这几个方法可以查询【物品/穿戴/手持/金钱】等方面的内容。 为了保证数据的准确性,请执行这些函数之前,执行一次 i2。并且通过sync.Wait 等待i2 执行完成。

## 函数 char.backpack.Query <范围> <ID 或名称>
    查询角色是否携带有某样物品。如果有,则返回 ID 和名称;否则返回空串。
    查询范围:
      Item:       所有物品(但不包括包袱里的内容)
      Wear:       穿戴
      Wield:      手持的装备(武器或盾牌)
      Equip:      携带的装备
      Autoload:   Autoload 的装备
      ItemID:   id 命令看到的数据
      Cash:       金钱

## 函数 char.backpack.Has <范围> <ID 或名称>
    查询角色是否携带有某样物品。如果有,则返回真,否则返回假。
    查询范围参见 HELP char.backpack.Query。

## 函数 char.backpack.Amount <范围> <名称或/和 ID>
    查询角色是否携带有某样物品。如果有,则返回其数量,否则返回 0。
    查询范围参见 HELP char.backpack.Query。

应用场景:
1. 做任务的时候,判断武器和装备是否都穿上了。
2. 需要购买,或者交钱的时候,判断是否带钱。 或者身上的钱太多了,影响负重、害怕丢失的时候,可以去钱庄存钱。
3. 检查关键道具,比如火折,香蕉,石子,四宝,酒袋,干粮 带了没有。

例子:
okLog @char.backpack.Amount{Item;coin}
47
okLog @char.backpack.Amount{Item;gold}
1

okLog @char.backpack.Amount{Item;干粮}
83

okLog @char.backpack.Query{Wield;shield}
百战之盾/<font color="#ff0000">左手</font>/shield
okLog @char.backpack.Query{Wield;shutong gun}
熟铜棍/<font color="#ff0000">右手</font>/shutong gun
补充说明
1. 通常Amount能代替Has方法。
2. 在查询Wield 带了什么武器的时候,会返回武器是在左手或者右手。
3. 同样功能也可以通过 #var char.Item   #var char.Wield   #var char.Cash 来实现。具体 这里面有提到。

二、 角色解析

判断角色的状态,是否在战斗中,是否繁忙
## 函数 char.IsBusy
    如果角色正忙,则返回真,否则返回假。无参数。

## 函数 char.IsIdle
    如果角色不忙,则返回真,否则返回假。无参数。

## 函数 char.InCombat
    如果角色正处于战斗中,则返回真,否则返回假。无参数。应用场景:
1. 是否在战斗: 我有个简陋的战斗模块,每隔0.3秒,判断一下,如果战斗中,就根据状态,选择自动pfm,自动recover,还是要send quit.
2. 是否busy: 做一些任务的时候,有时候会busy, 如果直接进行下面的逻辑,肯定是没法处理的。 这时候就需要判断一下是否busy,如果busy,就可能需要 先不执行下面的逻辑, 等待几秒后再retry.

三、 技能模块

判断技能等级、技能上线、以及当前jifa的技能。
## 函数 char.SkillLimit [<技能名称>]
    如果指定了技能名称,则返回该技能所能达到的技能上限。
    如果没有指定或者技能不存在,则返回本人的武功技能上限。
    如果技能上限获取失败,默认值为基本内功的上限,如果基本内功上限也没有获取到,则默认为 1。

## 函数 char.SkillLevel <技能中文名称>
    返回该技能的当前等级。没学会的技能等级为 0。

## 函数 char.GetJifaSkill <混合参数>
    提供技能激发情况查询。
    共分为三种情况:
    1,输入参数为基本技能,输出对应的特殊技能名称。如果未激发则为空
    2,输入参数为特殊技能,输出对应的基本技能名称。结果可能为多个。如果未激发则为空
    3,输入参数为激发类型,则输出对应的基本技能名称。又分为以下两种情形:
      (1),输入参数为常用拳脚或者常用兵器,则输出相应的基本技能名称。
         由于存在互备的情形,因此结果是一个字符串列表,可能包含多个技能名称
      (2),其它内功、躲闪、招架及武功种类,则输出对应的特殊技能名称

## 函数 char.SkillJifaLevel <技能中文名称>
    返回技能激发等级,数据来自 jifa/enable 命令。
    如果技能未被激发,那么分两种情况:
       1. 如果输入的技能名称为基本功夫,则取 jifa 数据。 如果 jifa 数据取不到,则取技能当前等级的一半。
       2. 如果输入的技能名称为特殊功夫,则取技能的当前等级。应用场景:
1. 通常在 打坐、吐纳、练习领悟、学习 的机器的时候使用。
例子:
okLog @char.GetJifaSkill{基本内功}
混天气功
okLog @char.SkillJifaLevel{基本内功}
305
okLog @char.SkillLevel{基本内功}
192.02
okLog @char.SkillLimit{基本内功}
197
四、 宝石管理

可以对宝石的名称、id、code进行转换
## 函数 gem.NameToID <宝石中文名>
    将宝石的中文名转换成背包中的英文 ID。

## 函数 gem.NameToCode <宝石中文名>
    将宝石的中文名转换成锦囊中的英文序号。

## 函数 gem.CodeToName <宝石序号>
    将锦囊中的宝石序号转换成中文名。

## 函数 gem.CodeToNameB <宝石序号>
    将锦囊中的宝石序号转换成漂亮的中文名。应用场景:
1. 自动合宝石的机器。
2. 自动交易宝石的机器。
3. 计算宝石价值的机器。


例子:
okLog @gem.NameToID{火☆ 玄冰}
huo bing
okLog @gem.NameToCode{火☆ 玄冰}
B6A
okLog @gem.CodeToName{B6A}
火☆玄冰
okLog @gem.CodeToNameB{B6A}
火☆ 玄冰






doumimi 发表于 2024-8-23 16:44:12

XTintin相关

xtintin是对于tintin语法的增强, 是完全基于tintin的原始语法的。对于一些操作进行了封装,编程了很多好用的函数。
1. 这部分只需要大致了解即可, 最好需要用的时候当做手册来查询,平时也很难全部记住。
2. 如果你对tintin的语法很熟练,这些函数其实完全不用也没关系, 看个人的习惯。

HELP xtintin !

一、math

math 提供了非常多数学方面的运算。大家可以通过HELP math来查看.我对于这些方法都加了简单的注释,大家应该一看就懂。
lib/xtintin 模块的 math.Sum    求和
lib/xtintin 模块的 math.Min    求最小值
lib/xtintin 模块的 math.Max    求最大值
lib/xtintin 模块的 math.Int    求整,四舍五入
lib/xtintin 模块的 math.Inc    别名, 增、减操作
lib/xtintin 模块的 math.Avg    求平均值
lib/xtintin 模块的 math.Abs    求绝对值
lib/xtintin 模块的 math.Sign   取符号
lib/xtintin 模块的 math.Root   开根
lib/xtintin 模块的 math.Eval   通用计算
lib/xtintin 模块的 math.Ceil   向上取整
lib/xtintin 模块的 math.Power幂
lib/xtintin 模块的 math.Floor向下取整
lib/xtintin 模块的 math.Random取 %1 %2 中间的一个随机值
lib/xtintin 模块的 math.ParseCN   将汉字转化为数字

例子:
okLog @math.Int{4.5}
5
okLog @math.Int{4.4}
4
okLog @math.Avg{4;5;6}
5
okLog @math.Min{1;2;3}
1
okLog @math.Max{1;2;3}
3
okLog @math.Eval{123 + 45 / 5}
132
okLog @math.ParseCN{一百五十六}
156补充说明:
1. @math.Eval 是一个通用的计算模块, 大家如果不想记太多的函数的话,就记这一个也可以,已经能完成绝大多数的操作了, 比如求平均,就自己加一加,然后再除以个数。
2. @math.ParseCN 也非常好用, 他会将一个汉字变成数字,在mud游戏中很多地方都可能遇到。 具体看下上面的例子就明白了。

二、 字符串

str模块提供了非常多的字符串相关的操作, 下面是 我经常会用到的。

str.Trim      去掉空格
str.ToLower   转换成小写
str.ToUpper   转换成大写
str.Split       把字符串分割开
str.Replace    替换字符
str.Left    按照<b><font color="#ff0000">宽度</font></b>截取字符串左边的内容,
str.Right   按照<b><font color="#ff0000">宽度</font></b>截取字符串右边的内容,
str.Sub    从左开始截取,截取指定<b><font color="#ff0000">宽度</font></b>
例子:
okLog @str.Trim{你好   };
你好
okLog @str.Len{你好}
4
okLog @str.ToLower{ABCD};
abcd
okLog @str.ToUpper{abcd};
ABCD
okLog @str.Split{扬州的武庙;的}
扬州;武庙
okLog @str.Replace{11111aaaa2222;a;b}
11111bbbb2222
okLog @str.Left{123456789;5}
12345
okLog @str.Right{123456789;5}
56789
okLog @str.Sub{123456789;3;3}
456
okLog @str.Sub{你好;2;2}特别说明:1. 字符有Len求长度, 以及Width求显示宽度, 然后截取的那三个函数,都是按照宽度来截取的。 汉字是2个宽度, 所以如果有汉字,或者】这种中文全角符号,那么需要特殊考虑.

三、列表
在看列表之前,请先看一下HELPDataType,在tintin中,所有的数据结构,都可以看成是字符串, 所以表格,列表,都可以看成是字符串。
注意,由于 TinTin++ 自身语法的缺陷,字符串列表的第一个元素只能是简单字符串,不能是列表、字符串列表、表格,其余元素不受此限制。

普通列表可以用 @list 相关的方法 , 如果是字符串列表是 可以用@slist以及@list的所有方法.


PS: 我感觉Tintin本身的list的功能已经很好用了。 那些 基本的 add, find, delete, create, size ,sort, order, get 等方法我个人更习惯用tintin原生的。
这里比较推荐一个 Reverse方法,可能会经常用到。
#list temp create {a;b;c;d}; okLog @list.Reverse{$temp};
{1}{d}{2}{c}{3}{b}{4}{a}

#list temp create {11;2};#list temp <b>order</b>;#var temp;
#VARIABLE {temp}
{
    {1} {2}
    {2} {11}
}
#list temp create {11;2};#list temp <b>sort</b>;#var temp;
#VARIABLE {temp}
{
    {1} {11}
    {2} {2}
}



四、集合Set

集合真的是太厉害了!
Pt用list实现了集合set的功能, 集合的特性就是里面的所有元素都不重复, 也就是说, 你往一个set里面加入 1,2,2,3,3,4那么最终集合中的元素会是 1,2,3,4 。重复的2和3都被过滤掉了。集合的方法特别多, 简单的 create、 add、 size 之类的就不细说了。 重点说三个,交集, 并集, 以及Diff

先定义两个列表
#var temp {@set.Create{1;2;3;4;5;1;2;3}};
#var temp2 {@set.Create{4;4;5;5;6;6;7;7;8}};
#VARIABLE {temp}
{
    {1} {1}
    {2} {2}
    {3} {3}
    {4} {4}
    {5} {5}
}


#VARIABLE {temp2}
{
    {1} {4}
    {2} {5}
    {3} {6}
    {4} {7}
    {5} {8}
}

取并集
#var temp3 {@set.Union{{$temp};{$temp2}}};
#VARIABLE {temp3}
{
    {1} {1}
    {2} {2}
    {3} {3}
    {4} {4}
    {5} {5}
    {6} {6}
    {7} {7}
    {8} {8}
}

取交集
#var temp4 {@set.Intersection{{$temp};{$temp2}}};
#VARIABLE {temp4}
{
    {1} {4}
    {2} {5}
}

取A-B差集
#VARIABLE {temp5}
{
    {1} {1}
    {2} {2}
    {3} {3}
}
应用场景:

[*]偷学
[*]经书、乱序 等其他需要进行一些文字对比的地方。

五、转换

fp系列函数的主要功能就是对列表或者表格进行 转换、过滤。 掌握了之后写代码会非常的优雅。

lib/xtintin 模块的 fp.Map                         遍历表格,进行内容转换
lib/xtintin 模块的 fp.MapIf                      遍历表格,根据条件,进行内容转化
lib/xtintin 模块的 fp.Select                      遍历字符串列表,根据条件过滤
lib/xtintin 模块的 fp.Filter                     遍历表格,根据条件过滤
lib/xtintin 模块的 fp.Transform                遍历字符串列表,转换Item
lib/xtintin 模块的 fp.FilterMap                  遍历表格,既过滤,又转换
lib/xtintin 模块的 fp.TransformIf            遍历字符串列表, 根据条件,对于内容进行转换。
lib/xtintin 模块的 fp.SelectTransform      遍历字符串列表, 既过滤,又转换
例子:
#var temp {a;b;c;d;5;6;7};

okLog {@fp.<font color="#ff0000">Transform</font>{{$temp};gan che to VALUE}};
{gan che to a;gan che to b;gan che to c;gan che to d;gan che to 5;gan che to 6;gan che to 7}

okLog {@fp.<font color="#ff0000">TransformIf</font>{{$temp};{"VALUE" == "%d"};{gan che to VALUE}}};
{a;b;c;d;gan che to 5;gan che to 6;gan che to 7}

#var temp {
    {扬州} {{name}{扬州}{area}{yes}}
    {当铺} {{name}{当铺}{area}{no}}
};
#VARIABLE {temp}
{
    {当铺}
    {
      {area} {no}
      {name} {当铺}
    }
    {扬州}
    {
      {area} {yes}
      {name} {扬州}
    }
}

#var temp2 {@fp.<font color="#ff0000">Filter</font>{{$temp};{"VALUE" == "yes"}}};
#VARIABLE {temp2}
{
    {扬州}
    {
      {area} {yes}
      {name} {扬州}
    }
}
特别说明:1. 可以看到上面例子中给了两个功能,一个是将字符串进行转换, 一个是对表格类型的数据进行过滤。 都只用了一行函数就完成了整个操作。 非常非常的优雅。 如果自己实现通过遍历也是可以的,就是可能要5、6行代码才行。
2. 这个系列的函数虽然看着很多,但是只要记住核心的功能就是进行转化和过滤就行。 Map和transform对应转化,Filter和select对应过滤。 分别对应了表格和字符串列表的方法。

   
六、路径
路径相关的函数也经常会用到,毕竟mud里面最重要的就是赶路
## 函数 path.Reverse <路径>
   给出路径对应的反向路径。

## 函数 path.Long <路径>
   返回长版本的路径。路径中的每个方向命令都会被扩展成完整的单词。

## 函数 path.Short <路径>
   返回长版本的路径。路径中的每个方向命令都会被简化。应用场景:1. 所有跟路线有关的场景,尤其是固定路线, 比如推车,巡山等都可能用到。
例子:
#var temp {west;east;north;south};
okLog @path.<font color="#ff0000">Short</font>{$temp};
w;e;n;s


#var temp {w;e;n;s}
okLog @path.<font color="#ff0000">Long</font>{$temp};
west;east;north;south


#var temp {w;e;n;s;north};
okLog @path.<font color="#ff0000">Reverse</font>{$temp};
south;n;s;w;e

七、其他
剩下一个我经常用的函数就是时间,非常简单,直接给个例子
okLog @time.FormatNow{} 获得了100颗天木;
2024-08-23 16:29:06 获得了100颗天木


好了,暂时就到这里了,之后遇见好用的函数,还会回来补充到帖子里面。

jinger 发表于 2024-8-23 16:54:16

tanggwa 发表于 2024-8-23 17:03:42

普及贴,赞一个
页: [1]
查看完整版本: 【Paotin++】入门系列之四: 最常用内置函数