【MUSH框架】基于MUSH的模块化机器人设计之底层框架_【一个脚本走天下v20141214】
本帖最后由 littleknife 于 2015-10-24 09:16 AM 编辑****************************************************************************************
一、【一个脚本】的核心思路:
以模块化脚本框架引用方式实现机器人的集成化,使得复杂机器的编写成为可能;单一的配置文件配置MUSH的运行状态,使得配置MUSH更加简洁。
****************************************************************************************
(1)设置文件的编辑变成统一【一个脚本】,使机器的撰写更加方便。MUSH的设置文件主要包含变量、脚本、触发、Alias等,都是各自的文件,要想设置好一个机器人需要自己存储这些文件。而更换机器人就要把它们都换一遍,这里的【一个脚本走天下】其核心思路就是考虑以前用惯了zmud的用.mud文件的思路,以一个文件引用所有的东西。而脚本框架的应用则彻底不再依靠MUSH的触发、变量、alias的配置文件意思。
(2)框架所提供的整合代码的思路,使得复杂的冗长的lua代码被实质上整合到【一个脚本】里,所以这也是其核心思路之一。通过这种模块化的集成,力图只制作一个集成脚本【框架脚本】就可以完成机器人的研发。而【底层框架】则为大多数应用层机器人提供了核心的函数及方法。
其实这种模块化的思路好多玩家已经在自觉不自觉的使用了。所以,机器达人们请不要见笑,鲁班门前弄大斧了。
作为自己的一篇学习笔记、一篇心得体会,发出来供大家共勉,抛砖引玉罢了。有心的朋友请您提出宝贵的意见和建议,谢谢!
****************************************************************************************
****************************************************************************************
★pkuxkx2014【一个脚本走天下】之《底层框架》集成模块文件V20141214:
补充MUSH自带的wait.lua模块:将此文件拷贝至MUSH\lua目录下。
****************************************************************************************
【注:此脚本框架文件不可与城际互联插件同时使用,否则相互冲突。压缩包中的db库是城际互联节点库,请拷贝至MUSHclient.exe目录下。】
****************************************************************************************
★成功加载《底层框架》后的界面效果如下:
****************************************************************************************
****************************************************************************************
二、【一个脚本】框架的先续基础内容:你若想弄清楚下面的内容,得提前知道的内容是:
****************************************************************************************
如何建立一个MUSH的总文件MCL文件;
如何在这个文件的引用.lua脚本;
基本MUSH的常识性知识:比如什么是MUSH的变量,Lua的变量、正则表达式是什么、什么是触发等等。
MUD游戏的基本常识性知识:行走、吃饭、喝水、看东西、学习、打坐、吐纳,这些都是什么意思。
基本的lua编程基础:比如什么是lua,什么是表格。基本lua程序语言的写法等等。
****************************************************************************************
三、【底层框架】的使用方法:
****************************************************************************************
首先,用一个总的配置文件(这里是pkuxkx_littleknife.lua)作为主引用文件,里面有一定的初始设置。其中包含底层框架
模块文件xkx_frame.mod的载入,通过这个mod文件(mod文件是我自己定义的文件,格式就是文本文件)固定几个底层模块(*.mod),
如:行走系统模块、系统函数模块、战斗模块、学习练习模块等等。注意:这里有载入顺序问题,顺序不对也许会出错。
最后,则是以表格loadlua_list作为应用层模块的引用来调各个【应用层模块】。
---------------------------------------------------------------------------------------------------------------------------
pkuxkx_playerid.lua:总配置文件,只需要对这个总配置文件进行适当的修改即可完成载入模块的目的。
---------------------------------------------------------------------------------------------------------------------------
关于各个mod文件: 【 鉴于一楼资源紧张,各mod模块中的函数简介放在二楼。】
在mod目录下,还有一些以mod为扩展名的文本文件。这些被我称为底层引用库文件,主要是提供一些实用函数。
鉴于广大同学的建议,这里不再详细说明各个mod的函数,有些东西也都是自己按需要加入到底层框架中。只是在下面【应用模块】中以实例
的形式把常用的底层函数加以介绍吧。相信,随着时间的推移。多数同学会形成自己的底层框架支持函数。
---------------------------------------------------------------------------------------------------------------------------
****************************************************************************************
四、【应用层模块】的设计与使用:如何用框架来做应用层模块,就是怎么来用MUSH做模块化机器人的问题。
****************************************************************************************
首先,是你开发的【应用层模块】应放在总配置文件pkuxkx_playerid.lua(即调用文件,压缩包里的是pkuxkx_littleknfie.lua)的loadlua_list表中。形如下图:
其次,你只要集中精力弄自己的应用模块,及合理使用框架函数即可。
比如我编了个quest_hubiao.lua的机器人,怎么加入到框架中?就是loadlua_list表加一行“quest_hubiao.lua”即可。
注:这里的mod和lua文件都是文本文件、lua代码,格式上没有区别。只是我为了区分已完成的模块自定义为Mod。研发和测试代码我用Lua扩展名而已。
****************************************************************************************
1、封装模块(面向对象程序设计):
应用层模块的研发,我的建议是用封装模块的形式做,也就是面向对象程序设计的思路。即:无论是【应用中心】还是【任务模块】均采用封
装的形式进行封装。其好处是均以对象的方式使用,可以随时整合到各个使用机器人中。
-----具体的封装代码:
AppMOD={
new=function()
local _AppMOD={}
setmetatable(_AppMOD,{__index=AppMOD})
return _AppMOD
end,
interval=5,
timeout=20,
help="格式:帮助文件",
-------------------------------------
Sleeproomno=player.Sleeproomno,
Eatfoodroomno=player.Eatfoodroomno,
Trainingroomno=player.Trainingroomno,
-------------------------------------
aimroomno="",
aimroomname="",
-------------------------------------
jobnpcname="",
jobnpcid="",
jobnpcmenpai="",
jobwords="",
}
function AppMOD:finish()
end
function AppMOD:fail()
end
AppMOD_button=function()
print(AppMOD.help)
SetCommandSelection (1, -1)
PasteCommand("#AppMOD ")
end
AppMOD_alias=function(name, line, wildcards)
do_AppMOD(wildcards,AppMOD_ok,AppMOD_fail)
end
do_AppMOD=function(wildcards,AppMOD_ok,AppMOD_fail)
local tmp_AppMOD=AppMOD.new()
tmp_AppMOD.finish=AppMOD_ok
tmp_AppMOD.fail=AppMOD_fail
tmp_AppMOD:start(wildcards)
end
function AppMOD:start(wildcards)
wait.make(function()
self:update()
local f=function() self:check(wildcards) end
getinfo(f)
end)
end
-----封装后模块的应用:
(1)do_AppMOD(wildcards,AppMOD_ok,AppMOD_fail),命令引用。
(2)脚本定义引用:形如:
local xkd_studyliterate=qxuexi.new()
local condition={"shi","literate",100,nil,"west;west"}
xkd_studyliterate.Sleeproomno=self.Sleeproomno
xkd_studyliterate.Eatfoodroomno=self.Eatfoodroomno
xkd_studyliterate.menpai="xkd"
xkd_studyliterate.finish=function()
self.need_studyliterate=false
self:main()
end
xkd_studyliterate:start(condition)
****************************************************************************************
2、应用模块的研发实例:
【应用实例】的代码文件是:xkd_rb.lua。其中里面包含了【应用中心】xkd_center的代码,执行层【任务模块】xkd_Diaoyu的代码。限于篇幅,请自行下载前面的压缩文件查阅。
在新的框架模块下,应用模块的研发是基于一个总的【应用中心】的任务框架思路来完成的,其核心设计思想是尽可能的实现总协调的目的。定义是:判定自身状态并指向执行层的【任务模块】,也就是总调度文件的意思。下面以一个非pkuxkx的【侠客岛钓鱼机器】的例子说明下用法。
(1)【应用中心】的代码:
贴完代码,我才发现,这个代码的格式整理真是头痛的要命。故此,限于篇幅我已经在pkuxkx_mod2014这个压缩包里,涵盖了相关代码。也注释了部分内容。这里提供的还是一个框架性质的代码文件。希望诸位能理解,也希望借此给哪些新入MUSH的玩家以借鉴性的作用。
(2)【任务模块】,即执行层的代码:这里钓鱼就是任务。这里任务的定义是通过一系列命令可以获取经验和潜能的事件。
(3)一个完整的执行层【任务模块】框架代码:
AppMOD={
new=function()
local _AppMOD={}
setmetatable(_AppMOD,{__index=AppMOD})
return _AppMOD
end,
interval=5,
timeout=20,
help="格式:帮助文件",
-------------------------------------
Sleeproomno=player.Sleeproomno,
Eatfoodroomno=player.Eatfoodroomno,
Trainingroomno=player.Trainingroomno,
-------------------------------------
aimroomno="",
aimroomname="",
-------------------------------------
jobnpcname="",
jobnpcid="",
jobnpcmenpai="",
jobwords="",
}
function AppMOD:finish()
end
function AppMOD:fail()
end
AppMOD_button=function()
print(AppMOD.help)
SetCommandSelection (1, -1)
PasteCommand("#AppMOD ")
end
AppMOD_alias=function(name, line, wildcards)
do_AppMOD(wildcards,AppMOD_ok,AppMOD_fail)
end
do_AppMOD=function(wildcards,AppMOD_ok,AppMOD_fail)
local tmp_AppMOD=AppMOD.new()
tmp_AppMOD.finish=AppMOD_ok
tmp_AppMOD.fail=AppMOD_fail
tmp_AppMOD:start(wildcards)
end
function AppMOD:start(wildcards)
wait.make(function()
self:update()
local f=function() self:check(wildcards) end
getinfo(f)
end)
end
function AppMOD:check(wildcards)
local askjob=function() self:askcmd() end
local endf=function()
do_walkgo(self.masterroomno,0.2,askjob,askjob)
end
if me.hp["neili"]<=1.2*me.hp["neilimax"] then
do_dazuo(1.2,"curmaxneili",endf,endf)
else
busytest(endf)
end
end
function AppMOD:askcmd()
end
function AppMOD:cooltime()
end
function AppMOD:main()
end
-----------------------------------------------
function AppMOD:dosomething1()
end
function AppMOD:dosomething2()
end
function AppMOD:dosomething3()
end
function AppMOD:dosomething4()
end
-----------------------------------------------
function AppMOD:update()
localAppMOD_triggerlist={
{name="AppMOD_dosth1",regexp="Here is trigger1 RegularExpression",script=function() self:dosomething1()end,},
{name="AppMOD_dosth2",regexp="Here is trigger2 RegularExpression",script=function() self:dosomething2()end,},
{name="AppMOD_dosth3",regexp="Here is trigger3 RegularExpression",script=function() self:dosomething3()end,},
{name="AppMOD_dosth4",regexp="Here is trigger4 RegularExpression",script=function() self:dosomething4()end,},
}
---Creat Trigger-->>
for k,v in pairs(AppMOD_triggerlist) do
addtri(v.name,v.regexp,"q_AppMOD",v.script)
end
---End Creat Trigger--<<
local noecho_trilist={
"noecho_tri1",
"noecho_tri2",
}
local _noechotri=linktri(noecho_trilist)
addtri("AppMOD_noecho",_noechotri,"q_AppMOD","")
SetTriggerOption("AppMOD_noecho","omit_from_output",1)
EnableTriggerGroup("q_AppMOD",1)
end
AddAlias("alias_AppMOD_button","#AppMOD_button","",alias_flag.Enabled + alias_flag.Replace ,"AppMOD_button")
AddAlias("alias_AppMOD","#AppMOD (.*)","",alias_flag.Enabled + alias_flag.Replace+ alias_flag.RegularExpression ,"AppMOD_alias")
SetAliasOption("alias_AppMOD","group","job_AppMOD")
SetAliasOption("alias_AppMOD_button","group","job_AppMOD")
至此,通过本次的说明更新性,希望能给有用MUSH编写机器的玩家给以帮助。
最后,本作只是一个自学笔记,在各位机器达人面前弄斧献丑,不要见笑。
******************************************************************************************************
【一个脚本框架】近期更新记录:
20141214:针对框架文件加入map_p2palias.mod模块,此模块为城际互联算法模块,在xkx_frame.mod中默认加载,可自行屏蔽。实现框架脚本内直接应用城际互联(故不需加载插件,若加载插件则屏蔽此模块即可)的作用。
******************************************************************************************************
【底层框架】各MOD文件所提供的常用函数简介
本帖最后由 littleknife 于 2014-11-14 12:25 PM 编辑【底层框架】各MOD文件所提供的常用函数简介:
-----************************************************************
system.mod文件中主要函数介绍:
-----************************************************************
-----************************************************************
----函数名:busy模块。busytest(busyfinish,t,...)
----此模块用来判定自身是否处于busy。
----输入:函数名,间隔时间,参数表
----输出:在不忙的情况下,执行busyfinish。
-----************************************************************
-----************************************************************
----函数名:delay(t,delayfinish,...),waitend(t,waitfun,...),infoend(func,...)
----delay和waitend均为等待几秒后执行目标函数。
----infoend为信息结束函数,即等待信息都显示完毕后执行目标函数的意思。
-----************************************************************
-----************************************************************
----函数名: Convert2Seconds(seconds):时间转换函数。
----输入: seconds ----字符串格式。
----输出:hours, minutes, seconds ----小时、分钟、秒。
----说明: 此函数提供的是将秒计时转换为小时、分钟、秒的格式。
-----************************************************************
-----************************************************************
----函数名: ltrim (r, s), rtrim (r, s):左截、右截取串函数。
----输入:r:截取或去掉的字符串,s:源字符串。
----输出:截取后字符串。
----说明:无。
-----************************************************************
-----************************************************************
----函数名:触发脚本书写函数:addtri,addtri_multiline,addtri_noecho
----addtri(triname,trimatch,trigroup,triscript,triflag,trisequence)
----输入:触发名字,触发内容,触发群名,脚本名或函数名,标示,顺序。
----输出:建立触发。
----说明:这里的新模块下的触发建立函数,主要是封装模块的核心。其triscript已经可以识别函数名的直接填写。这无疑使得模块封装更加方便。
-----************************************************************
-----************************************************************
----函数名:Alias添加函数:addali(非正则模式),addali_reg(正则模式)。
----addali=function(aliname,alimatch,aligroup,aliscript)
----输入:Alias名,触发内容,触发群名,触发脚本。
----输出:建立Alias。
----说明:这里的addali也是通过脚本aliscipt的方式运行Alias。
-----************************************************************
-----************************************************************
----函数名:删除触发,删除触发群,删除变量:
----deltri(triname),deltrigp(groupname),delvar(varname)
----输入:触发名或触发群名,变量名。
----输出:删除对应单独的触发或对应的触发群;删除变量。
----说明:无。
-----************************************************************
-----************************************************************
----函数名:linktri函数:linktri2(triggerlist)
----输入:触发名或触发群名,变量名。
----输出:把triggerlist表里的触发字符串连接成一个触发。
----说明:连接数字项表格个各个值成为trigger。
----此函数默认占用w="",w=全部表达式,列表中的参数从w开始。
----括号开始的变量为w=("..rtrim("|",_str)..")",里面有()则为w,第一个w=""
-----************************************************************
-----************************************************************
----函数名:ctonum(str)---中文数字转换函数。
----输入:str="一百三十五"
----输出:135
----说明:无
-----************************************************************
-----************************************************************
----两个表格的操作函数:针对数字项表格的操作函数。
----并集函数: table_union(a,b),交集函数:table_intersection (a,b),
----移除重复项函数:talbe_removeduplicate(t),
----相等判定函数:table_is_equal(list1,list2),
----查询索引函数:simTableIndex(str,list)
----表格是否为空表判定函数: table_is_empty(t)
-----************************************************************
-----************************************************************
----system.allstop()
----说明:重新刷新脚本函数。全部停止重置机器。
-----************************************************************
-----************************************************************
-----************************************************************
status.mod文件中主要函数介绍:
-----************************************************************
-----************************************************************
----函数名:status_oncha(name, line, w,s),status_onjifa(name, line, w)技能查询并存储函数。
----说明:应用此函数可以把skills和jifa skills都存入到me.skills表和me.jifa表,以及MUSH变量表中。
-----************************************************************
-----************************************************************
----函数模块名:me模块。
----说明:主要是自身状态的基本参数。提供睡觉、吃饭、发呆检测模块供参考。
-----************************************************************
-----************************************************************
----函数模块名:Convert_KM(value)
----说明:把亿、万模式转换为数字。
-----************************************************************
-----************************************************************
----函数模块名:skills模块
----说明:抓取自身技能,提供me.skills表和me.jifa表。
-----************************************************************
-----************************************************************
----函数名:me.Checkitem(Comparelist)
----说明:获取自身物品列表。这是一个方法型函数。Comparelist为对比表。
-----************************************************************
-----************************************************************
----函数名:me.idhere(Callback)
----IDhere列表函数。
-----************************************************************
-----************************************************************
----函数模块:npc模块:
----抓取NPC名字,颜色,门派等信息的模块。
-----************************************************************
-----************************************************************
walk.mod文件中主要函数介绍:
-----************************************************************
主要行走模块:do_walkgo(pathstring,steptime,walk_ok,walk_fail)
steptime:每步间隔时间(秒)。
walk_ok:行走后执行动作函数;
walk_fail:行走失败后执行动作函数;
-----************************************************************
rest.mod文件中主要函数介绍:(这部分模块由于系统及自身喜好不同,也许存在些BUG。有兴趣的自己查阅修正吧。)
-----************************************************************
打坐吐纳模块:do_dazuo(goal,condition,dazuo_ok,dazuo_fail),do_tuna(goal,condition,tuna_ok,tuna_fail)
学习、练习模块:do_qxuexi(wildcards,qxuexi_ok,qxuexi_fail),do_qlianxi(wildcards,qlianxi_ok,qlianxi_fail)
读书模块:do_qreadbook(wildcards,qreadbook_ok,qreadbook_fail)
状态检查模块: checkstatus(item,condition,goal)
修炼模块:do_xiulian(xiulian_ok,xiulian_fail)
【任务模块】实例:执行层的研发_新版领悟模块参考代码。
本帖最后由 littleknife 于 2014-12-14 07:06 PM 编辑本实例以新版领悟模块为参考实例,推出参考代码。供广大MUSHer爱好者参考使用。。仅供学习。。使用请保留版权信息,谢谢。
------------***********************************************
-- File name : quest_lingwu.mod
-- Description : 领悟模块,2014版。涵盖命令行模式和脚本模式。需配合基础框架,绘图模块参考了子襄(isstillsun)的代码。
-- Version: 20140420
-- Author: littleknife(applehoo@126.com)
--问题:武器、食物需自己带在身上。
------------***********************************************
论坛代码不好显示,这里下载自行研究吧:
侠客岛读石壁机器人就是这样的,学习之 超教棒,支持一下ttk_00 木有违规,发吧 胡小刀,这些模块都完成之后,把这个和其他的好用的mush工具,一起整理一下弄一个新的北侠专用mush打包放主页去,当然懒做的话给份名单,我来帮忙 ttk_20 噢了。 来晚了,顶顶 哈哈,果断精华