深入浅出制作全自动Mud机器人-问与答
Script脚本
1
帖子
1
发布者
11
浏览
-
问与答是一个最为典型简单的Mud解密,是大部分Mud任务的基础与核心,可以作为我们研究Mud解密的入口。
对于一个标准的问答对话来说,一般是
- 主动发起ask
- 游戏提示 你向XXXX打听关于XXXX的事情
- 可能有部分干扰,没听清之类
- 紧跟着你打听的内容,NPC会进行回复。同时NPC也会恢复其他玩家的问题,这时可能对你有所干扰。
这时,很多老玩家可能会向你介绍多行匹配这一神器。
但很可惜,这只是试图逃避正确解决问答问题的逃课行为。
多行匹配完全不适合问答解密上。因为多行匹配无法进行逻辑处理,无法引入状态。也无法标准化处理。
因此,多行匹配在问答问题上,只能算是一个补丁。如果你的机器建立在大量补丁上,很快就会带来难以解决的架构问题。
那么,怎么来进行一个标准化的问答呢?
很简单,对NPC的回答进行录制。
在ask npc时,同时发送你的ask指令和同步指令。对应的,你会预期两个服务器的回复
- 你想XXX大厅关于XXX的事情:开始录制,把这行之后的每一行都追加到一个数组里
- 你的同步响应:结束录制,ask结束,进行下一步处理。
这样,就把问答问题,转换为对一个字符串数组的按行分析。
再配合简单的状态机形式,一般就是一个局部的Mode变量,就行解决大部分的问题了。
以hongchenjs的长安任务为例,需要向梁兴禄发起ask 任务,处理的代码如下
Changan.Check = function () { if (App.Data.Ask.Answers.length) { if (App.Data.Ask.Answers[0].Line == "梁兴禄对你说道:本府不是已经给你派发了差事,完不成的话就先跟我取消。") { Changan.Fail(); return; } if (App.Data.Ask.Answers[0].Line == "梁兴禄对你说道:你的江湖经验已经很高了,再在衙门里也混不出个名堂了。") { Quest.Cooldown(10 * 60 * 60 * 1000) App.Next(); return } if (App.Data.Ask.Answers[0].Line == "梁兴禄盯着你看了看,说道:“你刚取消过一次任务,过一分钟再来吧。”") { Quest.Cooldown(60 * 1000) // App.Core.Timeslice.Change("") App.Next(); return } if (App.Data.Ask.Answers[0].Line.match(matcherTooMany)) { Quest.Cooldown(4 * 3600 * 1000) // App.Core.Timeslice.Change("") App.Next(); return } if (App.Data.Ask.Answers[0].Line == "梁兴禄对你说道:嗯,既然你有心为衙门出力,我便给你个差事。") { Changan.All++; App.Send("changanjob") if (App.Data.Ask.Answers[1].Line == "梁兴禄说着便拿出一份公函交给你。") { Changan.Gonghan() return } Changan.Check2() return } } App.Fail() } Changan.Check2 = function () { let result = App.Data.Ask.Answers[1].Line.match(matcherCode) if (result) { Changan.Data.Name = result[2]; for (var i = 3; i < App.Data.Ask.Answers.length; i++) { let token = App.Data.Ask.Answers[i].Line.match(matcherCodeToken) if (token) { Changan.Data.Code += token[1].trim() } else { break } } Changan.Data.Type = "code" Changan.DoCode() return } else { App.Log("未知的长安任务对话") Changan.Fail() return } }能很好的看出怎么用标准录制的问答信息,来解决复杂谜题。
-
J jarlyyn 被引用 于这个主题
-
J jarlyyn 被引用 于这个主题