北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
楼主: jarlyyn

杰哥乱弹琴之任务多行文字处理

[复制链接]
 楼主| 发表于 2024-5-22 13:40:32 | 显示全部楼层
本帖最后由 jarlyyn 于 2024-5-22 01:42 PM 编辑

接着上干货。

比如我们要处理少林诵经任务,取出诵经正文
  1. 法会因由分品第一
  2. ================================================================
  3. ==                                                            ==
  4. ==                    如是我闻一时佛在舍卫国祗树给孤独园与大比                    ==
  5. ==                    丘众千二百五十人俱尔时世尊食时著衣持钵入                    ==
  6. ==                    舍卫大城乞食于其城中次第乞已还至本处饭食                    ==
  7. ==                    讫收衣钵洗足已敷座而坐                    ==
  8. ==                                                            ==
  9. ================================================================
  10. 金刚经                                         第一页/总七十四页
  11. 上一页(pageup)/下一页(pagedown)                   诵经(chanting)
复制代码


我们打开mush,先创建一个#test别名,发送到script,内容如下

  1. Simulate([[法会因由分品第一
  2. ================================================================
  3. ==                                                            ==
  4. ==                    如是我闻一时佛在舍卫国祗树给孤独园与大比                    ==
  5. ==                    丘众千二百五十人俱尔时世尊食时著衣持钵入                    ==
  6. ==                    舍卫大城乞食于其城中次第乞已还至本处饭食                    ==
  7. ==                    讫收衣钵洗足已敷座而坐                    ==
  8. ==                                                            ==
  9. ================================================================
  10. 金刚经                                         第一页/总七十四页
  11. 上一页(pageup)/下一页(pagedown)                   诵经(chanting)
  12. ]])
复制代码


然后我们分析下,这不就是从第一个全是等号的开始记录,到第二个全是等号的结束,获取之间所有的内容,裁切掉两边边框,获取内容去空格么。

所以我们按这个逻辑写一个触发,匹配^===+$,

内容发送到script,如下

  1. if HcluaTriTestStart==nil then
  2.     HcluaTriTestStart=true
  3.     Hclua.HC.recorder:start(999)
  4. else
  5.     HcluaTriTestStart=nil
  6.     Hclua.HC.recorder:stop()
  7.     local lines=Hclua.HC.recorder:getLines()
  8.     table.remove(lines)
  9.     lines=Hclua.HC.lineutils.sliceLines(lines,3,#Hclua.HC.history:current().Text -4)
  10.     local output=Hclua.HC.lineutils.combineLines(lines,true)
  11.     output=string.gsub(output,' ','')
  12.    print(output)
  13. end
复制代码


很明显,如果没标志位,recorder开始记录。

如果有标志位,说明是第二次,那么停止记录器,获取所有记录,去除最后一行(全是=号的),把边上4格裁了

切出来的区块,合并正文,替换掉空格,输出。

简单不?

来个结果图


至少个人觉得,这个算比较简单的,了解思路后新人也能轻松写出来,还不用和多行触发做苦苦斗争。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2024-5-22 14:00:28 | 显示全部楼层
本帖最后由 jarlyyn 于 2024-5-22 02:01 PM 编辑

然后是mudlet版本
别名

  1.   feedTriggers([[
  2. 法会因由分品第一
  3. ================================================================
  4. ==                                                            ==
  5. ==                    如是我闻一时佛在舍卫国祗树给孤独园与大比                    ==
  6. ==                    丘众千二百五十人俱尔时世尊食时著衣持钵入                    ==
  7. ==                    舍卫大城乞食于其城中次第乞已还至本处饭食                    ==
  8. ==                    讫收衣钵洗足已敷座而坐                    ==
  9. ==                                                            ==
  10. ================================================================
  11. 金刚经                                         第一页/总七十四页
  12. 上一页(pageup)/下一页(pagedown)                   诵经(chanting)
  13. ]])
复制代码


触发

  1. if HcluaTriTestStart==nil then
  2.     HcluaTriTestStart=true
  3.     Hclua.HC.recorder:start(999)
  4. else
  5.     HcluaTriTestStart=nil
  6.     Hclua.HC.recorder:stop()
  7.     local lines=Hclua.HC.recorder:getLines()
  8.     table.remove(lines)
  9.     lines=Hclua.HC.lineutils.linesUTF8Mono(lines,3,utf8.len(Hclua.HC.history:current().Text)-4)
  10.     local output=Hclua.HC.lineutils.combineLines(lines,true)
  11.     output=string.gsub(output,' ','')
  12.    print('\n'..output)
  13. end

复制代码


可以看到,除了 Hclua.HC.lineutils.linesUTF8Mono 替换了Hclua.HC.lineutils.sliceLins,utf8.len替换了#其他代码可以说是一模一样(甚至这个特殊的例子不替换都行).

最终结果:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2024-5-22 14:18:50 | 显示全部楼层
本帖最后由 jarlyyn 于 2024-5-22 02:23 PM 编辑

接下来我们再来段干货。
首先为了避嫌,我就不直接举例主流任务,免得大家连夜改机器。

假设我们有一个新主流任务,叫通缉,会在城门口看到通缉令,上面有个人脸,然后我们要对比各npc的脸,甚至自己的脸,看是否一致,再做后期操作。

这个任务我们需要的就是获取并保存某个npc给到的图形,储存起来,然后再再需要对比的地方,把同样的图形裁切下来,判断是否相等。

我们先做一个别名,#wanted,将最后一个看到的脸(全局变量look)设为通缉

  1. print('通缉嫌疑人')
  2. print(look)
  3. wanted=look
复制代码


然后做查看NPC的触发,匹配npc头像上的等级 ^\s+ LV\s+\d+\s+$

  1. print('开始抓取')
  2. Hclua.HC.recorder:start(10)
  3. Send('response R:look')
复制代码



然后匹配response R:look
  1. Hclua.HC.recorder:stop()
  2. look=Hclua.HC.lineutils.combineLinesShort(
  3. Hclua.HC.lineutils.sliceLines(
  4. Hclua.HC.recorder:getLines(),
  5. 4,6,3
  6. ))
  7. print('抓取外貌')
  8. print(look)
  9. if look==wanted then
  10. print('是嫌疑人!!!')
  11. else
  12. print('不是嫌疑人')
  13. end
复制代码
  1. Hclua.HC.recorder:stop()
  2. look=Hclua.HC.lineutils.combineLinesShort(
  3. Hclua.HC.lineutils.linesUTF8Mono(
  4. Hclua.HC.recorder:getLines(),
  5. 4,6,3
  6. ))
  7. print('抓取外貌')
  8. print(look)
  9. if look==wanted then
  10. print('是嫌疑人!!!')
  11. else
  12. print('不是嫌疑人')
  13. end
复制代码



这时候我们look npc,比如天神随从,就能打印出脸谱,并判断是否是被通缉的了



使用#wanted 设置通缉,就能玩了



当然,我们要不放弃任何一个嫌疑人,包括自己

截取score中的头像

  1. look=Hclua.HC.lineutils.combineLinesShort(
  2. Hclua.HC.lineutils.sliceLines(
  3. Hclua.HC.history:getLines(3,3),
  4. 71,6,3
  5. ))
  6. print('抓取外貌')
  7. print(look)
  8. if look==wanted then
  9. print('是嫌疑人!!!')
  10. else
  11. print('不是嫌疑人')
  12. end
复制代码
  1. look=Hclua.HC.lineutils.combineLinesShort(
  2. Hclua.HC.lineutils.linesUTF8Mono(
  3. Hclua.HC.history:getLines(3,3),
  4. 71,6,3
  5. ))
  6. print('抓取外貌')
  7. print(look)
  8. if look==wanted then
  9. print('是嫌疑人!!!')
  10. else
  11. print('不是嫌疑人')
  12. end
复制代码



嘿嘿,不放过我自己



然后是i中的外貌

  1. look=Hclua.HC.lineutils.combineLinesShort(
  2. Hclua.HC.lineutils.sliceLines(
  3. Hclua.HC.history:getLines(3,9),
  4. 50,6,3
  5. ))
  6. print('抓取外貌')
  7. print(look)
  8. if look==wanted then
  9. print('是嫌疑人!!!')
  10. else
  11. print('不是嫌疑人')
  12. end
复制代码
  1. look=Hclua.HC.lineutils.combineLinesShort(
  2. Hclua.HC.lineutils.linesUTF8Mono(
  3. Hclua.HC.history:getLines(3,9),
  4. 50,6,3
  5. ))
  6. print('抓取外貌')
  7. print(look)
  8. if look==wanted then
  9. print('是嫌疑人!!!')
  10. else
  11. print('不是嫌疑人')
  12. end
复制代码





这是不是传说中的严于律己?



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2024-5-22 14:25:31 | 显示全部楼层
上一楼的脚本里

抓NPC的就是典型的recorder应用,不定行数触发,固定触发start,自己触发一个response 判断内容

而抓item和score,由于格式较为固定,都是典型的history应用,倒数获取指定行数的内容。

然后判断图形是否相等,就是line:toShort()功能的初始设计目标,能直接用等号判断图像块相同。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2024-5-22 14:26:48 | 显示全部楼层
打完收工,休息几天再更新带#wait功能的限流队列metronome的使用说明
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2024-5-23 22:04:59 | 显示全部楼层
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2024-5-24 15:28:29 | 显示全部楼层
好东西啊,用这个文字竖版也能转成横向的吧?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2024-5-24 15:33:44 | 显示全部楼层
phagspa 发表于 2024-5-24 03:28 PM
好东西啊,用这个文字竖版也能转成横向的吧?

这个没做。

主要牵涉到什么算列,没法自动计算。

不过可以手动裁切位置,再拼一下。

等下我看看能不能找个demo
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2024-5-24 15:54:50 | 显示全部楼层
jarlyyn 发表于 2024-5-24 03:33 PM
这个没做。

主要牵涉到什么算列,没法自动计算。

感谢大佬,我自己弄的转成横向文字老是错位的,对不齐
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2024-5-24 16:30:17 | 显示全部楼层
本帖最后由 jarlyyn 于 2024-5-24 04:37 PM 编辑
phagspa 发表于 2024-5-24 03:28 PM
好东西啊,用这个文字竖版也能转成横向的吧?

先是测试别名,#test2,就不截图了
  1. Simulate([[
  2. ┌────────┐
  3. │      测      亲│
  4. │      试      爱│
  5. │      信测    的│
  6. │      息试    玩│
  7. │      3 信    家│
  8. │      测息      │
  9. │      试1       │
  10. │      信测      │
  11. │      息试      │
  12. │      4 信      │
  13. │测      息      │
  14. │试      2       │
  15. └────────┘

  16. ]])
复制代码


然后是第一个触发,^┌(─)+┐$ 老规矩,开始录像
  1. Hclua.HC.recorder:start(999)
复制代码


接着第二个触发,结束的 ^└(─)+┘$

功能比较简单,去掉下边框,去掉最左边4行(签名和左边框),去掉最右边4行(抬头和右边框)
然后从右向左,每2格切一竖条,不带换行拼接后,再汇总,去空格

  1. Hclua.HC.recorder:stop()
  2. local lines=Hclua.HC.recorder:getLines()
  3. table.remove(lines)
  4. lines=Hclua.HC.lineutils.sliceLines(lines,5,#lines[1].Text-8)
  5. local result=''
  6. local i=#lines[1].Text-1
  7. while i>0 do
  8. result=result..Hclua.HC.lineutils.combineLines(Hclua.HC.lineutils.sliceLines(lines,i,2),true)
  9. i=i-2
  10. end
  11. result=string.gsub(result,' ','')
  12. print(result)
复制代码


收工。

等我截图

北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-12-26 11:09 AM , Processed in 0.012520 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表