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)
收工。
等我截图