找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3312|回復(fù): 0
收起左側(cè)

發(fā)點(diǎn)這幾天研究龍OL的一些代碼

[復(fù)制鏈接]
ID:108531 發(fā)表于 2016-3-12 16:00 | 顯示全部樓層 |閱讀模式
'此模塊用于游戲數(shù)據(jù)的讀取,操作,存儲(chǔ)。
'Items:物品 Normal:普通 Task:任務(wù) Current:當(dāng)前 Floor:地表 PertainId:屬于
Option Explicit
'-------角色數(shù)據(jù)結(jié)構(gòu)定義-----------
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
'-------物品數(shù)據(jù)結(jié)構(gòu)定義-----------
Private Type Items_Struct
    Name As String
    Id As Long
    Type As Integer
    Number As Long
    Need_Level As Integer
End Type
'-------地面物品結(jié)構(gòu)定義------------
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
'-------怪物數(shù)據(jù)結(jié)構(gòu)定義------------
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
'-------游戲數(shù)據(jù)申明-----------------
'-------基址及偏移部分--------
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
'-------過程用于得到角色信息數(shù)據(jù)------------
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
'------過程用于讀取角色任務(wù)背包信息-------------
Public Sub ReadTaskBag()
    GetRoleItems 1, Task_Bag_Offset
End Sub
'------過程用于讀取角色普通背包信息-------------
Public Sub ReadNormalBag()
    GetRoleItems 0, Normal_Bag_Offset
End Sub
'------過程得到當(dāng)前選定怪物信息--------------
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
'-------過程用于得到地面物品信息數(shù)據(jù)----------------------------
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

'-------過程用于得到怪物數(shù)組信息數(shù)據(jù)------------
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
'-------過程用于得到角色物品信息數(shù)據(jù)-------------
'參數(shù)1:背包序號(hào),參數(shù)2:背包偏移
'背包數(shù)據(jù)結(jié)構(gòu)為以(有物品的)背包序號(hào)(生成的)二叉排序樹
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                   '二叉樹根結(jié)點(diǎn)
        Do While RM(tmp_Address + &H15, 1) = 0              '是否為葉子結(jié)點(diǎn)
            j = RM(tmp_Address + &HC, 1)                    '讀取背包序號(hào)
            If (j < i) Then           '                     '大于根結(jié)點(diǎn)
                tmp_Address = RM(tmp_Address + &H8, 4)      '查找右子樹
            ElseIf (j = i) Then                             '等于根結(jié)點(diǎn)
                Dest_Address = tmp_Address                  '查找到
                Exit Do                                     '跳出循環(huán)
            ElseIf (j > i) Then                             '小于根結(jié)結(jié)點(diǎn)
                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)        '物品數(shù)量
                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一塊數(shù)據(jù)區(qū)用于游戲Call用--------------
Public Sub NewBuff()
    Buff_Address = NewMEM(&H100)
End Sub
'-------Delect數(shù)據(jù)區(qū)--------------
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

'-------游戲功能調(diào)用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


相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表