jarlyyn 发表于 2024-5-22 13:40:32

本帖最后由 jarlyyn 于 2024-5-22 01:42 PM 编辑

接着上干货。

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

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

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

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

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

内容发送到script,如下

if HcluaTriTestStart==nil then
    HcluaTriTestStart=true
    Hclua.HC.recorder:start(999)
else
    HcluaTriTestStart=nil
    Hclua.HC.recorder:stop()
    local lines=Hclua.HC.recorder:getLines()
    table.remove(lines)
    lines=Hclua.HC.lineutils.sliceLines(lines,3,#Hclua.HC.history:current().Text -4)
    local output=Hclua.HC.lineutils.combineLines(lines,true)
    output=string.gsub(output,' ','')
   print(output)
end

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

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

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

简单不?

来个结果图


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

jarlyyn 发表于 2024-5-22 14:00:28

本帖最后由 jarlyyn 于 2024-5-22 02:01 PM 编辑

然后是mudlet版本
别名

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

触发

if HcluaTriTestStart==nil then
    HcluaTriTestStart=true
    Hclua.HC.recorder:start(999)
else
    HcluaTriTestStart=nil
    Hclua.HC.recorder:stop()
    local lines=Hclua.HC.recorder:getLines()
    table.remove(lines)
    lines=Hclua.HC.lineutils.linesUTF8Mono(lines,3,utf8.len(Hclua.HC.history:current().Text)-4)
    local output=Hclua.HC.lineutils.combineLines(lines,true)
    output=string.gsub(output,' ','')
   print('\n'..output)
end



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

最终结果:


jarlyyn 发表于 2024-5-22 14:18:50

本帖最后由 jarlyyn 于 2024-5-22 02:23 PM 编辑

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

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

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

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

print('通缉嫌疑人')
print(look)
wanted=look


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

print('开始抓取')
Hclua.HC.recorder:start(10)
Send('response R:look')


然后匹配response R:look
Hclua.HC.recorder:stop()
look=Hclua.HC.lineutils.combineLinesShort(
Hclua.HC.lineutils.sliceLines(
Hclua.HC.recorder:getLines(),
4,6,3
))
print('抓取外貌')
print(look)
if look==wanted then
print('是嫌疑人!!!')
else
print('不是嫌疑人')
endHclua.HC.recorder:stop()
look=Hclua.HC.lineutils.combineLinesShort(
Hclua.HC.lineutils.linesUTF8Mono(
Hclua.HC.recorder:getLines(),
4,6,3
))
print('抓取外貌')
print(look)
if look==wanted then
print('是嫌疑人!!!')
else
print('不是嫌疑人')
end


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



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



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

截取score中的头像

look=Hclua.HC.lineutils.combineLinesShort(
Hclua.HC.lineutils.sliceLines(
Hclua.HC.history:getLines(3,3),
71,6,3
))
print('抓取外貌')
print(look)
if look==wanted then
print('是嫌疑人!!!')
else
print('不是嫌疑人')
endlook=Hclua.HC.lineutils.combineLinesShort(
Hclua.HC.lineutils.linesUTF8Mono(
Hclua.HC.history:getLines(3,3),
71,6,3
))
print('抓取外貌')
print(look)
if look==wanted then
print('是嫌疑人!!!')
else
print('不是嫌疑人')
end


嘿嘿,不放过我自己



然后是i中的外貌

look=Hclua.HC.lineutils.combineLinesShort(
Hclua.HC.lineutils.sliceLines(
Hclua.HC.history:getLines(3,9),
50,6,3
))
print('抓取外貌')
print(look)
if look==wanted then
print('是嫌疑人!!!')
else
print('不是嫌疑人')
endlook=Hclua.HC.lineutils.combineLinesShort(
Hclua.HC.lineutils.linesUTF8Mono(
Hclua.HC.history:getLines(3,9),
50,6,3
))
print('抓取外貌')
print(look)
if look==wanted then
print('是嫌疑人!!!')
else
print('不是嫌疑人')
end




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



jarlyyn 发表于 2024-5-22 14:25:31

上一楼的脚本里

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

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

然后判断图形是否相等,就是line:toShort()功能的初始设计目标,能直接用等号判断图像块相同。

jarlyyn 发表于 2024-5-22 14:26:48

打完收工,休息几天再更新带#wait功能的限流队列metronome的使用说明

fourteen 发表于 2024-5-23 22:04:59

phagspa 发表于 2024-5-24 15:28:29

好东西啊,用这个文字竖版也能转成横向的吧?

jarlyyn 发表于 2024-5-24 15:33:44

phagspa 发表于 2024-5-24 03:28 PM
好东西啊,用这个文字竖版也能转成横向的吧?

这个没做。

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

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

等下我看看能不能找个demo

phagspa 发表于 2024-5-24 15:54:50

jarlyyn 发表于 2024-5-24 03:33 PM
这个没做。

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


感谢大佬,我自己弄的转成横向文字老是错位的,对不齐

jarlyyn 发表于 2024-5-24 16:30:17

本帖最后由 jarlyyn 于 2024-5-24 04:37 PM 编辑

phagspa 发表于 2024-5-24 03:28 PM
好东西啊,用这个文字竖版也能转成横向的吧?
先是测试别名,#test2,就不截图了
Simulate([[
┌────────┐
│      测      亲│
│      试      爱│
│      信测    的│
│      息试    玩│
│      3 信    家│
│      测息      │
│      试1       │
│      信测      │
│      息试      │
│      4 信      │
│测      息      │
│试      2       │
└────────┘

]])

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

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

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

Hclua.HC.recorder:stop()
local lines=Hclua.HC.recorder:getLines()
table.remove(lines)
lines=Hclua.HC.lineutils.sliceLines(lines,5,#lines.Text-8)
local result=''
local i=#lines.Text-1
while i>0 do
result=result..Hclua.HC.lineutils.combineLines(Hclua.HC.lineutils.sliceLines(lines,i,2),true)
i=i-2
end
result=string.gsub(result,' ','')
print(result)


收工。

等我截图

页: 1 [2] 3
查看完整版本: 杰哥乱弹琴之任务多行文字处理