doumimi 发表于 2024-7-9 15:32:58

【Paotin++】武当新人门派任务0-10w

本帖最后由 doumimi 于 2024-7-9 04:16 PM 编辑

小萌新分享一下 使用Paotin++来辅助完成武当新手任务的一些思路。 如果有内容的违规,我会积极配合修改。

下面来说下武当新手任务,逐个进行拆解。
[*]采气
[*]阵法
[*]炼丹
[*]诵经
[*]侠客

从我个人感觉由简单到难来说明。

1. 采气
采气的流程如下:
[*]去天柱峰下。
[*]输入 caiqi 。
[*]采气完成后, 返回武当广场交任务。

采气的流程比较简单,有个问题就是要如何去【天柱峰下】以及返回, 我们通过lm看一下地图,可以看到去【天柱峰下】有两条路:

[*]一条是笔直向上,通过 后门-◎ 密林◎-朝天宫。
[*]一条是从山下绕过去,通过 太子岩-雷神洞-南岩峰。

我们先看第一条路, 其中地图中有个地方是 ◎ 密林◎, 这个路径比较短, 但是,地图中如果有某个地方带有 ◎标识,那么说明这个是个迷宫,路径会经常变化。 这种就不太利于我们做机器来辅助完成任务。 所以我们选择第二条路线,那么第二条路线很长,我们如何快速、稳定的走到目的地,解决走路径的问题。好在 Pt提供了一个优秀解决方案,path.Walk , 炮爷称之为千里通。具体path如何使用请看HELP path或者另外一篇文章介绍。
然后我们就可以写如下内容到某个文件里面, 比如 wudang.tin 。 在游戏中 通过LM 、 KM 、 RLM 来 加载、卸载、重新加载这个模块来让 内容生效。 加载完成之后也可以输入MODS 看下当前有哪些模块被加载。
#action {冲虚道长说道:「道家炼气最讲究时辰和地点} {goto-caiqi};

#alias {goto-caiqi} {
    xiashan;#nop 道德不够的话,需要ask song about 下山, 这个地方就不写了,大家自己补充吧;
    #delay 2 {path.Walk {武当山的武当广场-武当山的天柱峰下} {caiqi}};
};

#action {大脑一片空明,感觉一股热气在任督二脉盘旋} {path.Walk 武当山的天柱峰下-武当山的武当广场 {#delay 1 {ask chongxu about success}}};

每天只有子午两个时辰可以采气,错过了时间段,就只能等几个时辰或者是放弃任务。

#action {仅子午两个时辰能够进行采气!} { caiqi-fail };
#alias caiqi-retry {okLog 10秒后我再试试;#delay {10} caiqi};
#alias caiqi-fail {path.Walk 武当山的天柱峰下-武当山的武当广场 {#delay 1 {ask chongxu about fail}}};



2. 阵法
这个任务自动化有两个地方需要注意。
1. 如何自动根据提示走位。
2. 去哪个小校场并且正确返回。
2. 1 自动走位问题
先梳理一下走位的逻辑。
阵法教习从远处跑过说到:今天练『正五行阵』,请大家注意走位(zouwei)!
『正五行阵』按照五行相生进行排阵,金生水,水生木,木生火,火生土,土生金。
『反五行阵』按照五行相克进行排阵,金克木,木克土,土克水,水克火,火克金。
大家一会儿按照我公布的方位走(zouwei)到自己负责的位置中,然后注意按照『正五行阵』开始走位(zouwei)。

username一会儿站在xx位。
然后隔一段时间会提示:大家从自己现在的位置按照『%1五行阵』的要求往下走一步。

什么意思呢?
假如现在是正五行阵。 那么如果我在金, 下一步要 zouwei 水, 假如我在水,下一步要zouwei 木。。。。。
假如现在是反五行阵, 那么如果我在金, 下一步要 zouwei 木, 如果我在木,下一步要zouwei 土。。。。。
梳理完逻辑之后,我们发现 下一步的命令需要根据 【当前位置】以及阵法【正或反】来判断 。那么我们就要用到 if 或者 switch来啦。
#action {%*一会儿站在%1位。} {
    #var weizhi %1;
    #delay {1} {#send zouwei %1};
};
#action {大家从自己现在的位置按照『%1五行阵』的要求往下走一步。} {
    #if {"%1" == "正"} {
      #switch {"$weizhi"}{
            #case {"金"}{#send zouwei 水;#var weizhi 水};
            #case {"水"}{#send zouwei 木;#var weizhi 木};
            #case {"木"}{#send zouwei 火;#var weizhi 火};
            #case {"火"}{#send zouwei 土;#var weizhi 土};
            #case {"土"}{#send zouwei 金;#var weizhi 金};
      }
    };
    #else {
      #switch {"$weizhi"}{
            #case {"金"}{#send zouwei 木;#var weizhi 木};
            #case {"木"}{#send zouwei 土;#var weizhi 土};
            #case {"土"}{#send zouwei 水;#var weizhi 水};
            #case {"水"}{#send zouwei 火;#var weizhi 火};
            #case {"火"}{#send zouwei 金;#var weizhi 金};
      }
    }      
};
关于上面的代码, 大家一定要注意, 在if或者switch、case的判断中,如果要判断的内容是字符串,一定要加上引号才行。

2.2 校场判断
房间中已经有人在演习阵法,请等对方演习结束再进去吧。
有时候会有这种提示, 这时候我们希望能够自动的尝试另外的房间。 这边创建了两个列表,一个是去校场的,一个是对应的返回的。 假如用了 zhenfa-room 去做任务,就用zhenfa-room-back 来返回。#var zhenfa-room {};
#var zhenfa-room-back {};
#list zhenfa-room create {nw;w;sw;ne;e;se};
#list zhenfa-room-back create {se;e;ne;sw;w;nw};

#alias {goto-zhenfa} {
    #action {房间中已经有人在演习阵法,请等对方演习结束再进去吧。} {
      math.Inc room.number;
      goto-zhenfa;
    };
    $zhenfa-room[${room.number}];
    zhenfa;
};

回去的时候就可以通过 $zhenfa-room-back[${room.number}] 这个变量来返回。因为定义的var都是全局变量,那么大家还要找一个时机把 room.number 重新设置成1, 或者再完善一些, 如果所有的room都被占用了, 也要修改room.number, 重来一遍。


3. 炼丹

炼丹其实也比较简单,其中主要的难点是用到的颜色判断。 这篇文章里面有作业可抄。
【paotin++】新人向的炮艇驾驶手册 - 技术园地 - 北大侠客行MUD论坛 - Powered by Discuz! (pkuxkx.com)

关于颜色匹配也可以看一下大师的明教萌新攻略。
分享一个10w经验的明教小萌新PaoTin++成长之路 - 技术园地 - 北大侠客行MUD论坛 - Powered by Discuz! (pkuxkx.com)

具体的颜色可以从var/log/userid/socket.log 里面来找。实话说,我颜色匹配用的也不太熟练,这些颜色都是 ANSI转译码。 应该也包含一些字体相关的内容,等我再熟悉一些,可能会再单独介绍一下这部分内容。
4. 诵经
关于借书、还书、通过匹配提取书名、章节、第几页 这个就不说了,相信大家根据上面说的都能做到。
额外提一嘴, tintin中匹配的参数如果遇到嵌套的话, 会从%1 变成%%1 。 每嵌套多一层,就多一个 %

诵经任务难点:

[*]诵经的地点有很多。
[*]定位page。
[*]获取诵经内容。


4.1 多地点
多地点的这个问题没办法,录路径或者录地图是必修课之一, 大家就手动录制吧(北侠严谨分享地图数据)。pt已经提供了很方便的千里通+小键盘走路。 加上武当门派wiki中也有一些路径,可以直接拿来用。


4.2 诵经的内容

关于诵经的内容。 先说最笨的思路,那就是把6本庄子 + 2本道德经的每一页的内容获取到,然后放在机器里面。一共大约1000页。
比如这样的
#alias {庄子·内篇「上卷」_庄子·内篇·养生主(20)} {#var sj.page 88;#var sj.words 人吊亦吊人号亦号怪其不倚户观化乃至三号也};
ok肯定是ok的,但是这个工作量太大了,有没有办法把 诵经出现的那些内容给抓出来呢? 有. 用单行匹配的思路和多行匹配的思路都可以。

4.2.1 单行匹配
#var sj.content {};
#action {==                  %+1..100S                  ==} {#var sj.content $sj.content%1};
上面这种方法就是一行一行匹配,然后给字符串拼接起来。 更多的匹配请看一下tintin 文档中的pcre章节。简单说一下, %+1..100S就是匹配 1-100个非空格的字符。 实际诵经每行的内容不会有这么多,不过也没关系。


4.2.2 多行匹配
#action {================================================================\n%a\n================================================================}{   
    #var sj.content %1;
    #replace sj.content {=}{};
    #replace sj.content { }{};
    #replace sj.content {\n}{};
    #showme $sj.content;
};
多行匹配是%a ,这是个固定的特殊用法, 更多的匹配请看一下tintin 文档中的pcre章节。 匹配完成之后,需要处理一下 空格、换行以及== 这个符号。


4.3 定位page
任务给的信息是这样的 庄子·内篇·养生主(20) 。
我们要获取到具体的页数。那么如果知道了养生主的第一页是69 ,那么我们就可以进行推算, 养生主(2) = 70 ... 养生主(20) = 88;
我们提炼出来公式 page = 该章节第一页 + 任务给的页数 -1 。比如 养生主(2) 的page=69 +2 - 1 = 70
下面我给出庄子的index。 道德经的大家可以自己取翻一下加进来。

#local skip $book-index[$sj.phase]; #nop phase 是章节名称;
#math sj.page {$sj.page-in-phase + $skip - 1};
#send page $sj.page;


#var book-index {

{庄子·内篇·逍遥游}{1}
{庄子·内篇·齐物论}{21}
{庄子·内篇·养生主}{69}
{庄子·内篇·人间世}{1}
{庄子·内篇·德充符}{46}
{庄子·内篇·大宗师}{77}
{庄子·内篇·应帝王}{124}

{庄子·外篇·骈拇}{1}
{庄子·外篇·马蹄}{4}
{庄子·外篇·胠箧}{12}
{庄子·外篇·在宥}{31}
{庄子·外篇·天地}{66}
{庄子·外篇·天道}{116}
{庄子·外篇·天运}{151}
{庄子·外篇·刻意}{190}
{庄子·外篇·缮性}{201}

{庄子·外篇·秋水}{1}
{庄子·外篇·至乐}{51}
{庄子·外篇·达生}{69}
{庄子·外篇·山木}{107}
{庄子·外篇·田子方}{143}
{庄子·外篇·知北游}{177}

{庄子·杂篇·庚桑楚}{1}
{庄子·杂篇·徐无鬼}{42}
{庄子·杂篇·则阳}{98}
{庄子·杂篇·外物}{141}
{庄子·杂篇·寓言}{168}

{庄子·杂篇·让王}{1}
{庄子·杂篇·盗跖}{47}
{庄子·杂篇·说剑}{99}
{庄子·杂篇·渔父}{114}
{庄子·杂篇·列御寇}{139}
{庄子·杂篇·天下}{165}

};


5. 侠客

侠客任务难度很大,血量1000以下最好直接放弃,有可能会被一些大轮寺的一棍子就抡死,我个人感觉敌人的强度是固定的,所以级别越高越好打,等级高了一两剑就死。 不过级别稍微高一些的话,做新手任务收益已经很低了,可以在这里刷刷道德和声望、蝙蝠血甲卖点小钱。 等级低时, 做之前一定要做好autopfm, 可以用定时器 + $char 里面的属性判断 气势血量之类的属性。
如果大家已经完全掌握了上面那些任务是怎么做的, 这个任务除了迷宫其实没什么太难的地方,通过录制路径 + action就能完成。
然后关于迷宫,
1. 一方面大家可以每周录制一遍路径,这个路径应该是会在服务器重启的时候变换。 这样缺点是比较麻烦。
2. 或者大家可以用一些遍历算法比如dfs或者bfs来寻找出路, 好在是这个迷宫路径比较短, 问题是动态遍历算法可能不太好实现。
3. 我个人的方法,就是一进入迷宫,就两个地方来回走,不停的刷怪,可以获得一些经验和钱。 刷够时间,被关进监狱后,给狱卒10 sivler,之后就是正常的任务流程,通过action来完成就行。

迷宫的地图既然是随机的,那么如何才能实现两个地方来回走呢? 好在PT又提供了强大的轮子!
轮子1 之 gMapRoom !!!


#var gMapRoom;

#ali wd.get-shulin-out {
    #var wd.sl.exits {};
    #list wd.sl.exits create $gMapRoom;
    #FOREACH {$wd.sl.exits[]} {d} {
      okLog 方向$d;
      #if {"$d" != "out"} {
            #var wd.shulin.out $d;
            okLog $wd.shulin.out;
            #return;
      };
    };
};gMapRoom 这个变量包含了当前房间的房间名、出口、物品清单等实用信息。大家可以随便找个房间,输入 #var gMapRoom 来查看。它的内容是 pt 自主抓去的,我们玩家只要学会怎么使用就可以了。类似的还有 char 变量、char 变量等等,如果不清楚有哪些变量的话,可以用 VARS 查看,支持模糊查找。

轮子2 之 @char.IsBusy{}@char.IsCombat{}#var char
在不停刷怪的时候,我是通过一个定时器,在两个地点之间来回走, 那么什么时候该走,什么时候该战斗,就是通过上面这个封装好的函数来实现的。并且在需要判断一些任务状态的时候,是通过$char 来判断的,非常好用,也推荐大家一定要试一下 #var char , 里面包含了HP, Status, 档案, 技能等属性。







doumimi 发表于 2024-7-9 15:33:25

占个坑

qwerpoi 发表于 2024-7-9 15:46:00

大佬牛x

jarlyyn 发表于 2024-7-9 15:58:52

武当走阵我是看哪个位置没人走去哪个,不管正反。

doumimi 发表于 2024-7-9 16:11:37

本帖最后由 doumimi 于 2024-7-9 04:16 PM 编辑

jarlyyn 发表于 2024-7-9 03:58 PM
武当走阵我是看哪个位置没人走去哪个,不管正反。
那个也可以的,也是一种思路,等其他人都走完,抓到所有走过的位置, 然后用排除法。强!

oldhorse 发表于 2024-7-12 12:13:31

学习,感谢,我的武当新手任务机器可以照着修改了
页: [1]
查看完整版本: 【Paotin++】武当新人门派任务0-10w