要按我说,好感度啊,什么的,全都是虚幻。真正的情感还是要来源于制作者本身。
编辑于2020.2.6 转载请注明作者
好感度是个什么玩意
问得好,最早的铃心好感度回复我也不知道我是怎么想的,就做出来了。当时大概的想法是通过好感度来限制某些功能的使用——后来在逐渐的演化中,变成了一个更好的表达机器人人设的手段。
好感度回复的预期是什么样的
- 能够通过某些手段升高好感度
- 能够查询目前好感度的值
- 能够通过好感度进行区分回复
首先,我们需要一个储存好感度的文件。在预期使用数量较少(小于2万)的情况下,采用读写配置文件的方法还是比较快的。
1 2 3 4 5 6 7 8 9 10 11 |
#好感度增加 【赋值变量路径>=<【运行目录】\app\config】 #赋值路径方便调用 【写配置【变量路径】\favor.txt>=<personal>=<【发送者QQ】>=<【计算【读配置【变量路径】\favor.txt>=<personal>=<【发送者QQ】>=<0】+【随机数1-6】】】 #一个累加器结构,跟投喂的一样,会随机加1-6的好感度 #其中配置项是以【发送者QQ】作为标识的 唔姆唔姆,谢谢你!(好感度up) #回复内容 |
好了,现在好感度增加有了,我们还需要一个好感度查询,让用户能够自由的查询自己的好感度。
1 2 |
#好感度查询 您的好感度是:【读配置【变量路径】\favor.txt>=<personal>=<【发送者QQ】>=<0】 |
好了,一个简单的好感度查询功能我们也有了。
接下来,我们就需要一个极其重要的部分——那就是一个受好感度参数控制的回复系统。
受参数限制的回复系统&基础的嵌套比较思想
首先我们的想法肯定是——好感度高于某个值,回复就由第一级回复切换至第二级——这个想法是相当正确的,因此我们找到了这样的一个变量。
1 |
【比较[被比较数值]>=<[比较数值]>=<[前者大返回]>=<[否则返回]】 |
由此,我们就有了初代的好感度回复代码!
1 2 3 |
#好感度区分回复 【赋值变量好感度>=<【读配置【变量路径】\favor.txt>=<personal>=<【发送者QQ】>=<0】】 【比较【变量好感度】>=<100>=<唔...如果真的想牵手的话,也不是不可以。>=<?!你是不是变态!放开我的手!】 |
简单吧!这样我们就有了一个非常基础的好感度回复。
如果我们要多个好感度区间的话,可以增加更多的比较来进行判断。
1 2 3 |
#好感度区分回复 【赋值变量好感度>=<【读配置【变量路径】\favor.txt>=<personal>=<【发送者QQ】>=<0】】 【比较【变量好感度】>=<200>=<啊...可以抱我一下下吗?我有点冷...>=<【比较【变量好感度】>=<100>=<唔...如果真的想牵手的话,也不是不可以。>=<?!你是不是变态!放开我的手!】】 |
同样,按照这个规律,我们可以嵌套三层,四层,五层...甚至更多层。
但是我们很容易就会发现——当嵌套层数增加的时候,别说是一般人了,地中海都会迷惑——在早期的无编辑器时代,这种排查括号的工作相当的繁琐,尽管现在有了,但是一般人也搞不定太多的嵌套括号的。
所以这种书写方式,我只推荐低于四层的时候可以写写,再多了,就几乎没法做了。
真的没有办法了吗?
有,怎么可能没有。下面就是本篇的难点和重点——利用循环代替嵌套形式的比较——如果感觉困难的话,可以选择性的跳过。
在理想的情况下,我们想要的最好的添加好感度回复的方法是这样的。
1 |
第一级回复[标识符]第二级回复[标识符]第三级回复[标识符]...第N级回复 |
因此,根据这个目标,我规定了一个书写好感度回复的标准格式。
1 |
好感度一级[20]好感度二级[40]好感度三级[80]好感度四级 |
上面的就是一个好感度回复的结构示例,其代表的意思是——好感度低于20就触发回复“好感度一级”,如果处于20-40之间,就触发“好感度二级”,以此类推——直到好感度大于80,则回复“好感度四级”
好,有了这个思路之后,我们就需要针对性的开发一个读取的方式。
请注意,下文内容可能引起不适,相对于前文的简单内容难度可能略大——但是我们会在后面的一篇“迭代法介绍”中专门的讲解这类处理方式。在这里,你只需要知道这是一种近乎万能的处理方式即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
【赋值变量迭代内容>=<第一级[20]第二级[40]第三级】 【赋值变量好感度>=<【读配置【变量路径】\favor.txt>=<personal>=<【发送者QQ】>=<0】】 #将好感度回复内容赋值到迭代内容中,将好感度赋值到好感度变量中 【赋值变量纠正参数>=<【计算【变量好感度】+1】】 【循环20>=< #迭代次数20次,代表可以处理20个好感度区间,理论上可以支持无限好感度区间 【判断【赋值变量上限>=<【正则\[[\d]+\]>=<【变量迭代内容】>=<1】】【变量上限】>=<【正则\[[\d]+\]>=<【变量迭代内容】>=<2】 #利用正则表达式匹配[好感度值],并且通过比较序号1和序号2的正则匹配内容是否相同,来防止循环无法正常跳出的情况 >=< 【比较【变量纠正参数】 #正则得到的【变量上限】为[10]这样的带中括号文本,利用【取整】函数获得其中的数字 >=<【取整【变量上限】】 >=<【赋值变量迭代内容>=<【文本-取文本右【变量迭代内容】>=<【变量上限】】】>=< #如果该部分的好感度上限小于你的好感度,更新迭代内容,缩短原文本长度,重新回到开始进行迭代,直到只剩最后一个级别回复或者满足好感度要求为止 【文本-取文本左【变量迭代内容】>=<【变量上限】】【跳出】】 #如果该部分的好感度上限大于你的好感度,则直接输出【变量上限】左侧的所有文本并且跳出 >=<【文本-取文本右【变量迭代内容】>=<【变量上限】】【跳出】 #如果前面的两个正则结果相同,说明在后续没有[好感度值]的标识符号,因此代表是最后一级回复,直接输出文本右端并且跳出 】】 #结束回复 |
如果看不懂没关系——考虑到大部分使用者都看不懂,因此我采用了铃心的最新科研成果——函数系统,将其打包成函数了!
1 2 3 4 5 6 |
#[参数1]为回复内容,[参数2]为好感度 【函数好感度>=< 【赋值变量迭代内容>=<[参数1]】【赋值变量纠正参数>=<【计算[参数2]+1】】【循环100>=<【判断【赋值变量上限>=<【正则\[[\d]+\]>=<【变量迭代内容】>=<1】】【变量上限】>=<>=<【比较【变量纠正参数】>=<【取整【变量上限】】>=<【赋值变量迭代内容>=<【文本-取文本右【变量迭代内容】>=<【变量上限】】】>=<【文本-取文本左【变量迭代内容】>=<【变量上限】】【跳出】】>=<【文本-取文本右【变量迭代内容】>=<【变量上限】】【跳出】】】】 #示例 【好感度啊啊啊啊啊,滚开臭男人![50]切...喜欢看的话,就这样吧...[80]【随取臭男人...只许摸这一次哦...>=<切...人家才不是喜欢你——不要蹬鼻子上脸!】[150]明明...切,我不是说你啦![200]呜呜呜...这样人家还怎么嫁人嘛!>=<【读配置【变量路径】\favor.txt>=<personal>=<【发送者QQ】>=<0】】 |
函数的具体使用方法可以参考铃心的变量文档,在这里我就不多赘述什么了。
这里采用的方案其实本质上来说还是传统的比较方案。只是用了一个循环迭代的思想,来读取了一个理想化格式的好感度回复而已。
3.3更新:Fori循环查找进行区间回复
作者为铃心群老大,因为看到我写的迭代觉得太复杂了,就用Fori写了一个,缺陷是不能够处理[]信息。但是可以在中间加入一个【替换】来进行处理,防止[]导致的歧义。总体上是优越于我的迭代方案的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
【赋值变量区间文本>=< 小于100[100]100-199[200]200-299[300]300+ 】 【赋值变量比较数值>=<211】 #函数内容 【函数区间比较>=< 【赋值变量结果>=< 【Fori 【赋值变量起始值>=<【文本-取文本右[内容]>=<[】】 【判真【逻辑[参数2]<【变量起始值】】>=<【文本-取文本左[内容]>=<[】【跳出】】 >=<[参数1]>=<]】】 【判空【变量结果】>=<【文本-取文本右[参数1]>=<]】】】 #请注意!区间文本中不能含有[]符号,否则会导致歧义!可以通过替换方法进行预处理来防止这种情况出现 #使用函数 【区间比较【变量区间文本】>=<【变量比较数值】】 |
4.4更新
由于旧版无法匹配负数,因此特此带来兼容负数的函数更新:
1 2 3 4 |
#函数部分 【函数好感度>=<【赋值变量迭代内容>=<[参数1]】【赋值变量纠正参数>=<【计算[参数2]+1】】【循环100>=<【判断【赋值变量上限>=<【正则\[-?[\d]+\]>=<【变量迭代内容】>=<1】】【变量上限】>=<>=<【比较【变量纠正参数】>=<【替换【变量上限】>=<[||]>=<】>=<【赋值变量迭代内容>=<【文本-取文本右【变量迭代内容】>=<【变量上限】】】>=<【文本-取文本左【变量迭代内容】>=<【变量上限】】【跳出】】>=<【文本-取文本右【变量迭代内容】>=<【变量上限】】【跳出】】】】 #测试部分 【好感度1[-20]2[-10]3[0]4[10]5[20]6>=<-5】 |
1 2 3 4 |
#又用判循更新了一次 【函数区间回复>=<【赋值变量迭代内容>=<[参数1]】【判循【逻辑[【CQ转义【变量迭代内容】】]reg[【CQ转义\[-?[\d]+\]】]】>=<【赋值变量上限>=<【正则\[-?[\d]+\]>=<【变量迭代内容】>=<1】】【赋值变量迭代内容>=<【比较【计算[参数2]+1】>=<【替换【变量上限】>=<[||]>=<】>=<【文本-取文本右【变量迭代内容】>=<【变量上限】】>=<【文本-取文本左【变量迭代内容】>=<【变量上限】】】】】【变量迭代内容】】 #测试部分 【区间回复1[-20]2[-10]3[0]4[10]5[20]6>=<10】 |
结语
给力吗?最后一个给力吗?
其实就是这样,在开发的过程中,我们也会偷懒——但是偷懒正是我们不断改进的主要方案。
好感度系统的函数化,极大的降低了书写好感度回复的难度和成本,使得几乎所有人都可以快速的完成好感度区间回复的编辑。
同时,由于铃心的特殊性,在好感度回复中也可以调用铃心原有的变量。是不会有任何影响的。
对于本篇来说,我们接触了基本的嵌套思想,并且见识了利用现有的变量到底可以做到什么地步。
在下一篇,我会以开关系统的发展和演化来向大家介绍如何设计一个不错的铃心功能,敬请期待!
其实好感度回复的那个,我是直接把我骰子用的复制过来了,根本没有测试过。
如果出错了,请务必用留言通知我!
Comments | 28 comments
此前好感度有一个小小的bug,当好感度等于边界值的情况下,比较函数会失效,传回最高好感度区间的数值,需要调换比较中参数的位置来修复。
目前已经修复。
唔,咱查询好感和回复一直都是零,好迷惑阿
@唯心 是不是因为路径问题?这个理论上是不会出现问题的。你所说的查询为0,很有可能是没有新建好感度配置,或者增加模块出了问题。
@唯心 在第一行补充一下 【赋值变量路径>=<【运行目录】\app\config】就可以了
有没有办法让机器人回复上涨的好感度数值是多少呢?
@萌新闪闪的眼神 帖子中已经有对应部分的说明。
请问如果想要在同一个好感度区间插入几条不同的回复,随机选一条该怎么做?
@cacslis 使用【随取】或者【选择】即可
那么什么时候讲迭代法介绍呢
未使用函数的循环在好感在最高和第二高之间会因为正则表达中第一和第二相同跳到最后从而输出最高好感的话。
如何处理这一段?
@bio和pip 很有可能是因为【比较】的问题,比较的返回时[前者大返回]、[否则返回],因此如果出现了相等的情况就会返还最大值。
此时只需要将比较的两个参数调换位置,就可以规避这个问题。
在下文中的函数中,已经发现该问题并进行了解决。如果还有问题,请戳QQ
太给力了!谢谢♥
请问一下,打包好的函数要怎么在指令中使用呢……可能是我打开变量文档的方式不对,并没有弄懂函数具体的使用方法……【卑微】
@Vindur 只需要执行一次,那么就可以调用了。(推荐在[初始化xxx]中,加入函数。这样每次初始化的时候都会执行函数的录入)
@Vindur 添加一条自定义回复,触发关键词用[初始化1],对应的回复内容就把作者的这段函数原封不动的抄上去。
然后就可以直接调用作者范例里【好感度回复内容1[好感度阈值1]回复内容2[好感度阈值2]回复内容3[好感度阈值3]>=<触发者好感度】的格式了。
弄完之后查询和回复都是0,但是txt上有显示增加,怎么处理啊
@乆亓仝屴 大概率是你读配置出问题了. . .自己好好检查一次吧。
想请教一下,请问如果框架换成mirai后变量路径应该怎么填呢……orz
@Poriacocos 在铃心自带的回复调试哪里发【运行目录】就能看到了
大概要在回复里面复制哪些呢(看着有点多,怎么改都生成出奇怪的东西)
大佬好,想问一下mirai框架下变量路径应该怎么填orz是单纯在MiraiNative/data下的铃心数据目录里填吗
@Yumeaki5 在铃心自带的回复调试哪里发【运行目录】就能看到了
大佬大佬,请问cqxq的变量路径怎么填啊(☍﹏⁰)
@Anonymous 在铃心自带的回复调试哪里发【运行目录】就能看到了。
请问这个要怎么使用呢,那么多代码小白不知道复制哪个怎么使用
你好,冒昧打扰了,我在学习这部分的时候直接将上面铃心群大佬的Fori循环整个代码放到铃心里,在epk可以正常跑,但是放进铃心后qq回复的前面会带上很长一段空行,请问这要怎么改
@猫罐子 后续试了一下发现是拷过去后要把epk里所有的换行都删掉再放进铃心里就正常了……(虽然不太明白原理是啥)
@猫罐子 这是因为我博客的code模块显示的时候,前面的行号会变成奇怪的空格。所以复制的时候要么用code模块右上角的复制,要么双击code模块变成原文本之后再ctrl+c