找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3294|回复: 0
打印 上一主题 下一主题
收起左侧

发点这几天研究龙OL的一些代码

[复制链接]
跳转到指定楼层
楼主
ID:108531 发表于 2016-3-12 16:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
'此模块用于游戏数据的读取,操作,存储。
'Items:物品 Normal:普通 Task:任务 Current:当前 Floor:地表 PertainId:属于
Option Explicit
'-------角色数据结构定义-----------
Private Type Role_Struct
    Name As String
    Id As Long
    Level As Integer
    Point(0 To 2) As Long
    Hp(0 To 1) As Long
    Mp(0 To 1) As Long
End Type
'-------物品数据结构定义-----------
Private Type Items_Struct
    Name As String
    Id As Long
    Type As Integer
    Number As Long
    Need_Level As Integer
End Type
'-------地面物品结构定义------------
Private Type Floor_Items_Struct
    Name As String
    Id As Long
    Type As Long
    Number As Long
    PertainId As Long
    Point(0 To 2) As Long
End Type
'-------怪物数据结构定义------------
Private Type Monster_Struct
    Name As String
    Id As Long
    Type As Integer
    Level As Integer
    Hp(0 To 1) As Long
    Mp(0 To 1) As Long
    Point(0 To 2) As Long
End Type
'-------游戏数据申明-----------------
'-------基址及偏移部分--------
Private Const Game_Address = &H704010
Private Const Item_Address = &H705010
Private Const FloorItem_Address = &H704DC8
Private Const Call_Address = &H419900
Private Const Task_Bag_Offset = &H78
Private Const Normal_Bag_Offset = &H68
Private Const Game_Call_Offset = &H64
'-------基址及偏移部分--------
Public Role_Data As Role_Struct
Public Role_Items(0 To 1, 0 To 19) As Items_Struct
Public Floor_Items(0 To 199) As Floor_Items_Struct, FloorItemsMax As Long
Public Monster_Data(0 To 199) As Monster_Struct, MonsterMax As Integer
Public Buff_Address As Long, Select_Monster As Monster_Struct
'-------过程用于得到角色信息数据------------
Public Sub GetRoleData()
Dim Role_Address As Long
    Role_Address = RM(Game_Address + &H70, 4)
    With Role_Data
        .Name = StripNulls(RM(Role_Address + &H144, &H10, 2))
        .Id = RM(Role_Address + &H13C, 4)
        .Level = RM(Role_Address + &H15C, 4)
        .Hp(0) = RM(Role_Address + &H184, 4)
        .Hp(1) = RM(Role_Address + &H180, 4)
        .Mp(0) = RM(Role_Address + &H18C, 4)
        .Mp(1) = RM(Role_Address + &H188, 4)
        .Point(0) = RM(Role_Address + &H14, 4, 1) \ 50
        .Point(1) = RM(Role_Address + &H18, 4, 1) \ 50
        .Point(2) = RM(Role_Address + &H1C, 4, 1) \ 50
    End With
End Sub
'------过程用于读取角色任务背包信息-------------
Public Sub ReadTaskBag()
    GetRoleItems 1, Task_Bag_Offset
End Sub
'------过程用于读取角色普通背包信息-------------
Public Sub ReadNormalBag()
    GetRoleItems 0, Normal_Bag_Offset
End Sub
'------过程得到当前选定怪物信息--------------
Public Sub GetSelectMonster()
Dim Select_Address As Long
     Select_Address = RM(Game_Address + &H70, 4)
     With Select_Monster
        .Id = RM(Select_Address + &H13C, 4)
        .Level = RM(Select_Address + &H15C, 4)
        .Name = RM(Select_Address + &H144, &H10, 2)
        .Hp(0) = RM(Select_Address + &H184, 4)
        .Hp(1) = RM(Select_Address + &H180, 4)
        .Mp(0) = RM(Select_Address + &H18C, 4)
        .Mp(1) = RM(Select_Address + &H188, 4)
        .Point(0) = RM(Select_Address + &H14, 4, 1) \ 50
        .Point(1) = RM(Select_Address + &H18, 4, 1) \ 50
        .Point(2) = RM(Select_Address + &H1C, 4, 1) \ 50
    End With
End Sub
'-------过程用于得到地面物品信息数据----------------------------
Public Sub GetFloorItems()
Dim HeadAddress As Long
    HeadAddress = RM(RM(&H704F78 + &H64 + 4, 4) + 4, 4)
    GetFloorItemsData HeadAddress
    GetFloorItemName
End Sub
Public Sub GetFloorItemsData(ByVal BaseAddress As Long)
Dim FloorAddress As Long
    If RM(BaseAddress + &H21, 1) = 0 Then
        GetFloorItemsData RM(BaseAddress, 4)
        Floor_Items(FloorItemsMax).Id = RM(BaseAddress + &H10, 4)
        FloorAddress = RM(BaseAddress + &H18, 4)
        With Floor_Items(FloorItemsMax)
            .Type = RM(FloorAddress + &HC, 4)
            .Number = RM(FloorAddress + &H10, 4)
            .PertainId = RM(FloorAddress + &H14, 4)
            .Point(0) = RM(FloorAddress + &H34, 4, 1) \ 50
            .Point(1) = RM(FloorAddress + &H38, 4, 1) \ 50
            .Point(2) = RM(FloorAddress + &H3C, 4, 1) \ 50
        End With
        FloorItemsMax = FloorItemsMax + 1
        GetFloorItemsData RM(BaseAddress + &H8, 4)
    End If
End Sub
Public Sub GetFloorItemName()
Dim HeadAddress1 As Long, Headaddress2 As Long, tmp_Address As Long
Dim Dest_Address As Long, i As Long, j As Long, k As Long
Dim testAddress As Long
    HeadAddress1 = RM(RM(FloorItem_Address + 8, 4) + 4, 4)
    Headaddress2 = RM(RM(FloorItem_Address + &H14, 4) + 4, 4)
    For i = 0 To FloorItemsMax - 1
        k = Floor_Items(i).Type
        If k = -&HB Then
            Floor_Items(i).Name = Floor_Items(i).Number & "银"
        Else
            If k < &H7A1200 Then
                tmp_Address = HeadAddress1
                Do While RM(tmp_Address + &HB1, 1) = 0
                    j = RM(tmp_Address + &HC, 4)
                    If (j < k) Then
                        tmp_Address = RM(tmp_Address + &H8, 4)
                    Else
                        Dest_Address = tmp_Address
                        If (j = k) Then Exit Do
                        tmp_Address = RM(tmp_Address, 4)
                    End If
                    DoEvents
                Loop
            Else
                tmp_Address = Headaddress2
                Do While RM(tmp_Address + &H12D, 1) = 0
                    j = RM(tmp_Address + &HC, 4)
                    If (j < k) Then
                        tmp_Address = RM(tmp_Address + &H8, 4)
                    Else
                        Dest_Address = tmp_Address
                        If (j = k) Then Exit Do
                        tmp_Address = RM(tmp_Address, 4)
                    End If
                    DoEvents
                Loop
            End If
            Floor_Items(i).Name = StripNulls(RM(RM(Dest_Address + &H10 + &H99, 4) + &H40, &H10, 2))
        End If
    Next
End Sub

'-------过程用于得到怪物数组信息数据------------
Public Sub GetMonster()
Dim HeadAddress As Long
    HeadAddress = RM(RM(Game_Address + &H78, 4) + 4, 4)
    GetMonsterData HeadAddress
End Sub
Public Sub GetMonsterData(ByVal BaseAddress As Long)
Dim MonsterAddress As Long
    If RM(BaseAddress + &H15, 1) = 0 Then
        GetMonsterData RM(BaseAddress, 4)
        MonsterAddress = RM(BaseAddress + &H10, 4)
        With Monster_Data(MonsterMax)
            .Id = RM(MonsterAddress + &H13C, 4)
            .Level = RM(MonsterAddress + &H15C, 4)
            .Type = RM(RM(MonsterAddress + &H2E4, 4) + 4, 1)
            .Name = StripNulls(RM(MonsterAddress + &H144, &H10, 2))
            .Hp(0) = RM(MonsterAddress + &H184, 4)
            .Hp(1) = RM(MonsterAddress + &H180, 4)
            .Mp(0) = RM(MonsterAddress + &H18C, 4)
            .Mp(1) = RM(MonsterAddress + &H188, 4)
            .Point(0) = RM(MonsterAddress + &H14, 4, 1) \ 50
            .Point(1) = RM(MonsterAddress + &H18, 4, 1) \ 50
            .Point(2) = RM(MonsterAddress + &H1C, 4, 1) \ 50
        End With
        MonsterMax = MonsterMax + 1
        GetMonsterData RM(BaseAddress + &H8, 4)
    End If
End Sub
'-------过程用于得到角色物品信息数据-------------
'参数1:背包序号,参数2:背包偏移
'背包数据结构为以(有物品的)背包序号(生成的)二叉排序树
Public Sub GetRoleItems(Bag_SerNum As Integer, Bag_Offset As Long)
Dim Items_First_Address As Long, tmp_Address As Long, Dest_Address As Long, Type_Address As Long
Dim i As Integer, j As Integer
    j = -1
    Items_First_Address = RM(RM(RM(Item_Address + Bag_Offset, 4) + 8, 4) + 4, 4)
    For i = 0 To 19
        tmp_Address = Items_First_Address                   '二叉树根结点
        Do While RM(tmp_Address + &H15, 1) = 0              '是否为叶子结点
            j = RM(tmp_Address + &HC, 1)                    '读取背包序号
            If (j < i) Then           '                     '大于根结点
                tmp_Address = RM(tmp_Address + &H8, 4)      '查找右子树
            ElseIf (j = i) Then                             '等于根结点
                Dest_Address = tmp_Address                  '查找到
                Exit Do                                     '跳出循环
            ElseIf (j > i) Then                             '小于根结结点
                tmp_Address = RM(tmp_Address, 4)            '查找左子树
            End If
            DoEvents
        Loop
        If i <> j Then                                      '不相等则说明没有找到,即该背包格子为空
            With Role_Items(Bag_SerNum, i)
                .Name = ""
                .Id = 0
                .Need_Level = .Id
                .Number = .Id
                .Type = .Id
            End With
        Else
            Dest_Address = RM(Dest_Address + &H10, 4)       '得到背包格子类物品的基址
            Type_Address = RM(RM(Dest_Address, 4) + &H8, 4) '得到物品类型的地址
            With Role_Items(Bag_SerNum, i)
                .Name = StripNulls(RM(RM(RM(Dest_Address + &H8, 4) + &H99, 4) + &H40, &H10, 2)) '物品名称
                .Id = RM(Dest_Address + &H14, 4)            '物品ID
                .Need_Level = 1
                .Number = RM(Dest_Address + &H18, 1)        '物品数量
                If RM(Type_Address, 1) = &H8B Then          '得到物品类型
                    .Type = RM(RM(Dest_Address + &H8, 4) + &H7A, 1)
                Else
                    .Type = RM(Dest_Address + &H8C, 1)
                End If
            End With
        End If
    Next
End Sub
'-------New一块数据区用于游戏Call用--------------
Public Sub NewBuff()
    Buff_Address = NewMEM(&H100)
End Sub
'-------Delect数据区--------------
Public Sub DelectBuff()
    DelectMEM Buff_Address, &H100
End Sub
'-------过程ID选则人物-----------------
Public Sub SelectPeopleId(ByVal Id As Long)
    Init_FunDataAddress Buff_Address, &H688490
    WM Buff_Address + &H24, "01000000"
    WM Buff_Address + &H28, NumberToByte(Id, 4)
    WM Buff_Address + &H38, "01000000"
    GameFun Buff_Address
    Over_FunDataAddress Buff_Address, &H38
End Sub
'-------过程ID选则怪物-----------------
Public Sub SelectMonsterId(ByVal Id As Long)
    Init_FunDataAddress Buff_Address, &H688490
    WM Buff_Address + &H24, "01000000"
    WM Buff_Address + &H28, NumberToByte(Id, 4)
    WM Buff_Address + &H48, "02000000"
    GameFun Buff_Address
    Over_FunDataAddress Buff_Address, &H48
End Sub
'-------过程游戏角色使用物品---------------------------
Public Sub RoleUseItems(ByVal ItemId As Long)
    WM Buff_Address, "ED0090E6"
    WM Buff_Address + &H24, "01000000"
    WM Buff_Address + &H28, NumberToByte(ItemId, 4)
    WM Buff_Address + &H2C, "0100FFFF"
    WM Buff_Address + &H68, "01000000"
    GameFun Buff_Address
End Sub

'-------游戏功能调用CALL-----------------
Public Sub Init_FunDataAddress(ByVal FunDataAddress As Long, ByVal InitData As Long)
Dim asm As New AsmCall
    With asm
       .Pushad
       .Push 0
       .Push InitData
       .Mov_ECX FunDataAddress
       .Mov_EAX &H44E130
       .Call_EAX
       .Popad
       .Ret
       .Run_ASM Pid
    End With
End Sub

Public Sub GameFun(ByVal FunDataAddress As Long)
Dim asm As New AsmCall
    With asm
       .Pushad
       .Push FunDataAddress
       .Mov_EAX Item_Address
       .Mov_EAX_DWORD_Ptr_EAX_Add Game_Call_Offset
       .Mov_ECX_EAX
       .Mov_EAX Call_Address
       .Call_EAX
       .Popad
       .Ret
       .Run_ASM Pid
     End With
End Sub
Public Sub Over_FunDataAddress(ByVal FunDataAddress As Long, ByVal Offset As Long)
Dim asm As New AsmCall
    With asm
       .Pushad
       .Mov_DWORD_Ptr FunDataAddress + Offset, -1
       .Mov_ECX FunDataAddress
       .Mov_EAX &H5789D0
       .Call_EAX
       .Popad
       .Ret
       .Run_ASM Pid
    End With
End Sub


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表