ROL(废墟中的失落王国) ComboManager v0.82 (小精灵)(115分流)
本帖最后由 ifelon 于 2011-11-4 15:51 编辑小精灵下载:http://115.com/file/e6gvqxd5#ComboManager0.82.rar
源代码见文末。小精灵用xxx的按键精灵做的,理论上应该没有广告……
于是最近沉迷ROL中……连招系统相当有意思,大概是以前没怎么玩过这类自己组合连招的游戏,觉得相当有趣~不过手笨,想尝试一个新的招数总要试很多次才能成功,所以探索速度很慢……于是ComboManager诞生了……
这个脚本的初衷就是用来调试和尝试新的连招,使得在探索新招数的时候不至于因为手笨半途而废。就目前残缺的功能来说基本上也只能做到这一点……以后可以绑定F1~F10不同的连招,就成了懒人专用了……总之就是这样。
使用方法:在小精灵设置面板输入combo串,如“z z x z z500 300 z500”,意思是按下z z x z,按下z 500毫秒,无动作300毫秒,按下z 500毫秒。以此类推。
只有按键没有按下时间的则为默认按下时间;为了避免按得过快,每个动作后都有一个默认延迟(这两个时间均可在设置页面设置)。
关于并行串:简单来说就是模拟多个按键同时按下,或者分时按下分时放开,有重叠的情况。用方括号包围起来的combo串表示
比如z z x z z500 z500 700 c 代表一个武武魔武+2次剑1技能+瞬跳+剑2技能。其中c键的按下是在z1000过程中发出的。
注意不能写成z500 700 ,因为并行串是绝对同时开始,这种写法表示两个z同时按下,游戏是无法识别的。
几个实例(目前等级低还没做高级combo的串……欢迎大家分享):
【长剑(剑1剑2),指轮不问】
新手combo(节选):(地上)斩-斩-魔-斩-剑1-剑1-瞬跳-(空中)剑2-剑1
combo串:z z x z 400 z500 z500 700 c
(心得:长剑的话,新手等级,剑1剑2对应的按键时间都恰好是500毫秒的整数倍,注意某些地方需要加入一点延时)
【长剑(剑1剑2),指轮不问】
新手combo(我自己摸索的30hit):(地上)斩-斩-魔-斩-剑1-剑1-瞬跳-(空中)魔-魔-斩-(地上)斩-斩-魔-斩-剑2
combo串:z z x z 400 z500 z500 700 c x x z 1500 z z x z z1000 (30hit,靠墙32hit,只用到了长剑第1和第2个技能)
changelog
0.82 2011-11-4
*修复了并行串不识别大写字母的bug
0.81 2011-11-4
*又完全重写了代码……
+提供了对所有字母键(区分大小写),几乎所有键盘符号(上档符号除外)的支持
+并行串的同时运行数量和长度现在没有任何限制
*新的程序架构使用单线程机制,实现了并行串的硬时间线,不会因为子线程的不稳定性导致失误
0.55 2011-11-3
*完全重写了程序代码
+提供了使用并行串而不是两个并行combo串来实现多按键的功能
+最多支持三个键同时按下,并行串的步骤限制为100(应该足够了除非你要冲击300hit)
+加了很多程序注释
0.31 2011-11-2
*修复了一个小bug
*重写了全局变量的使用方法,大幅减少多线程的延迟
+采用多线程实现了多按键机制,目前支持三线程
0.07 2011-11-2
+实现了combo串的解读和自动生成按键脚本
TO DO:
*可绑定不同的combo到快捷键
*可储存多个combo,以及选择启用的combo和对应的快捷键
*可保存combo到文件,并起名字,附加简单的注释
按键精灵代码(按键精灵8以上语法)
//ver 0.82 2011.11.4
//by Byzod
//Beep
Dim ComboStr, DefaultDelay, DefaultKeytime, Key(), T()
ComboStr = Trim(Form1.Combo.text)//输入combo串
DefaultKeytime = CStr(Int(Form1.DefaultKeytime.text))
DefaultDelay = CStr(Int(Form1.DefaultDelay.text))
//----------------------------初步处理数据-----------------------------
num = 1
sn = -1
//计算并列串的数量
do While num > 0
sn=sn+1
num = InStr(num+1, ComboStr, "[")
Loop
//计算步骤的数量并预分配执行数组
num = UBound(Split(ComboStr))+1
ReDim Key(2*num),T(2*num)
//Msgbox """"&ComboStr&"""步骤:"&num&chr(13)&"执行数组长度:"&UBound(Key) //debug
//若combo串存在并列串才操作,否则直接解释执行
If sn > 0 Then
Ln = 1
Rn = 1
i = 0
Redim sL(sn), sR(sn)
//寻找[]的位置
DoWhile Ln > 0
Ln = InStr(Ln + 1, ComboStr, "[")
sL(i) = Ln
Rn = InStr(Rn + 1, ComboStr, "]")
sR(i) = Rn
i=i+1
Loop
Redim SubStr(sn,2) //并列串数组,最后一维0为字符串,1为时间起点(字符串)
//获取并列串
For i = 0 To sn-1
SubStr(i,0)=Mid(ComboStr,sL(i)-1,sR(i)-sL(i)+2)
Next
//MsgBox SubStr(0)&chr(13)&SubStr(1)&chr(13)&SubStr(2) //debug
//处理源combo串
For i = 0 To sn-1
ComboStr=Replace(ComboStr,SubStr(i,0),"_"+CStr(i),1,1)
Next
//MsgBox ComboStr //debug
//处理并列串
For i = 0 To sn-1
SubStr(i,0) = Trim(Replace(SubStr(i,0), "[", ""))
SubStr(i,0) = Trim(Replace(SubStr(i,0), "]", ""))
Next
//MsgBox SubStr(0)&chr(13)&SubStr(1)//&chr(13)&SubStr(2) //debug
End If
//----------------解释combo串和并行串,生成未排序的执行数组--------------
ComboRaw = Split(ComboStr)
ComboL = UBound(ComboRaw)
TPoint = 0 //TPoint为时间锚点
KeyIndex = 0//已经解释的执行单元数量
//将主串格式化到执行数组中
For i = 0 To ComboL
ComboTemp = Split(ComboRaw(i), "_")
For j = 1 To UBound(ComboTemp)
//将该步中同时发起的并行串的时间起点全部设为同样的值(字符串)
SubStr(Cint(ComboTemp(j)),1) = Cstr(TPoint)
Next
kt = Left(ComboTemp(0), 1)
//asc(0)=48,asc(9)=57, 小于48大于57,则为非数字
//asc(A)=65, asc(Z)=90, 大写字母
//需要按下shift的符号:33-38,40-43,58,60,62,94,95,123-126
If Asc(kt) < 48 OR Asc(kt) > 57 Then
//d 代表按下, u 代表放开. D/U 代表shift+按下/放开
If Asc(kt) > 64 AND Asc(kt) < 91 Then
Key(KeyIndex) = "D" + kt
Key(KeyIndex + 1) = "U" + kt
Else
Key(KeyIndex) = "d" + kt
Key(KeyIndex + 1) = "u" + kt
End If
T(KeyIndex) = TPoint
If Len(Mid(ComboTemp(0), 2)) <>0 Then
TPoint = TPoint + CInt(Mid(ComboTemp(0), 2))
Else
TPoint = TPoint + CInt(DefaultKeytime)
End If
T(KeyIndex + 1) = TPoint
TPoint = TPoint + CInt(DefaultDelay)
KeyIndex = KeyIndex + 2 //因为走了两个执行单元
Else
//无按键则直接延时
TPoint = TPoint + CInt(ComboTemp(0))
End If
Next
//MsgBox Key(0)&" "&Key(1) //debug
//将并行串格式化到执行数组中
For i = 0 To sn-1
SubCombo = Split(SubStr(i,0))
SubComboL = UBound(SubCombo)
SubTPoint = Cint(SubStr(i, 1))
//MsgBoxi&" "&SubStr(i)//debug
For j = 0 To SubComboL
kt = Left(SubCombo(j), 1)
//asc(0)=48,asc(9)=57, 小于48大于57,则为非数字
//asc(A)=65, asc(Z)=90, 大写字母
//需要按下shift的符号:33-38,40-43,58,60,62,94,95,123-126
If Asc(kt) < 48 OR Asc(kt) > 57 Then
//d 代表按下, u 代表放开. D/U 代表shift+按下/放开
If Asc(kt) > 64 AND Asc(kt) < 91 Then
Key(KeyIndex) = "D" + kt
Key(KeyIndex + 1) = "U" + kt
Else
Key(KeyIndex) = "d" + kt
Key(KeyIndex + 1) = "u" + kt
End If
T(KeyIndex) = SubTPoint
If Len(Mid(SubCombo(j), 2)) <>0 Then
SubTPoint = SubTPoint + CInt(Mid(SubCombo(j), 2))
Else
SubTPoint = SubTPoint + CInt(DefaultKeytime)
End If
T(KeyIndex + 1) = SubTPoint
SubTPoint = SubTPoint + CInt(DefaultDelay)
KeyIndex = KeyIndex + 2 //因为走了两个执行单元
Else
//无按键则直接延时
SubTPoint = SubTPoint + CInt(SubCombo(j))
End If
Next
Next
//------------------------------执行数组排序----------------------------
//大数组桶装法排序
redim Kstr(0),Tstr(0)
For i=0 To KeyIndex -1
If T(i) > ubound(Tstr)
Redim Preserve Tstr(T(i))
Redim Preserve Kstr(T(i))
End If
Tstr(T(i)) = Tstr(T(i)) & T(i) & "|"
Kstr(T(i)) = Kstr(T(i)) & Key(i) & "|"
Next
KeyTmp = join(KStr, "")
KeyTmp=mid(KeyTmp,1,len(KeyTmp) - 1)
TTmp = join(TStr, "")
TTmp = mid(TTmp, 1, len(TTmp) - 1)
//MsgBox "Key="&join(Key, "|")&chr(13)&"T="&Join(T,"|")&chr(13)&"KeyTmp="&KeyTmp&chr(13)&"TTmp="&TTmp //debug
//输出执行数组
ExKey=split(KeyTmp,"|")
ExT = split(TTmp, "|")
//MsgBox "ExKey="&join(ExKey, ",")&chr(13)&"ExT="&join(ExT, ",")//debug
//----------------------------------执行--------------------------------
For i = 0 To KeyIndex
kt = ExKey(i)
Select Case Left(kt, 1)
Case "d"
KeyDown right(kt, 1), 1
Case "u"
KeyUp right(kt, 1), 1
Case "D"
KeyDown 16, 1
KeyDown right(kt, 1), 1
Case "U"
KeyUp right(kt, 1), 1
KeyUp 16, 1
Case Else
//reserved
End Select
Delay ExT(i+1)-ExT(i)
Next
{:3_154:}神物,没想到竟然现在还有人为此游戏制作此等物。看来此游戏还真是老当益壮啊 :L半路去玩rolo然后被某桑羞辱的体无完肤的少年路过 顶,
可惜游戏没汉化 哈哈,更新到0.55啦,终于实现了并行串的功能……应该短时间内不会再更新了 我食言了ww
更新到了0.82,可以输入任意字母(包括大写)了
并行串数量和长度的限制也没有了,脚本也单线程了,皆大欢喜~
现在可以用到任何游戏上去了……相当于一个简化命令版的按键精灵了……应该不会继续加功能了,我没有重写按键精灵的打算= =b
页:
[1]