|
'此模塊用于游戲數據的讀取,操作,存儲。
'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
|
|