ifelon 发表于 2011-11-2 16:49

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

anby 发表于 2011-11-2 17:27

{:3_154:}神物,没想到竟然现在还有人为此游戏制作此等物。看来此游戏还真是老当益壮啊

eleven6001 发表于 2011-11-3 01:26

:L半路去玩rolo然后被某桑羞辱的体无完肤的少年路过

poyu883 发表于 2011-11-3 13:16

顶,
可惜游戏没汉化

ifelon 发表于 2011-11-3 19:58

哈哈,更新到0.55啦,终于实现了并行串的功能……应该短时间内不会再更新了

ifelon 发表于 2011-11-4 15:53

我食言了ww
更新到了0.82,可以输入任意字母(包括大写)了
并行串数量和长度的限制也没有了,脚本也单线程了,皆大欢喜~

现在可以用到任何游戏上去了……相当于一个简化命令版的按键精灵了……应该不会继续加功能了,我没有重写按键精灵的打算= =b

xinwuhen84 发表于 2013-1-2 02:49

页: [1]
查看完整版本: ROL(废墟中的失落王国) ComboManager v0.82 (小精灵)(115分流)