forked from code-gopher/DnfHelper-Python
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmap_data.py
More file actions
124 lines (101 loc) · 4.2 KB
/
map_data.py
File metadata and controls
124 lines (101 loc) · 4.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
from common import globle
from game import address as addr, call, address
class MapData:
mem = None
def __init__(self, mem):
self.mem = mem
def encode(self, data_ptr: int, value: int):
"""加密"""
# data_ptr += 4
# data_ptr = data_ptr ^ 0x1F2A025C
return self.mem.write_int(data_ptr, value)
def decode(self, data_ptr: int) -> int:
"""解密"""
value = self.mem.read_int(data_ptr)
# value = value ^ 0x1F2A025C
# value -= 4
return value
def get_stat(self) -> int:
"""0选角 1城镇 2选图 3图内 5选择频道"""
return self.mem.read_int(addr.YXZTAddr)
def is_town(self) -> bool:
"""是否城镇"""
person_ptr = call.person_ptr()
if self.mem.read_int(person_ptr + addr.DtPyAddr) == 0:
return True
return False
def is_open_door(self) -> bool:
"""是否开门"""
person_ptr = call.person_ptr()
encode_data = self.mem.read_long(self.mem.read_long(person_ptr + addr.DtPyAddr) + 16)
if self.decode(encode_data + addr.SfKmAddr) == 0:
return True
return False
def is_boss_room(self):
"""是否boss房"""
cut = self.get_cut_room()
boss = self.get_boss_room()
if cut.x == boss.x and cut.y == boss.y:
return True
return False
def is_pass(self):
"""是否通关"""
rw = self.mem
room_data = rw.read_long(rw.read_long(rw.read_long(addr.FJBHAddr) + addr.SJAddr) + addr.MxPyAddr)
data_val = rw.read_int(room_data + addr.GouHuoAddr)
if data_val == 2 or data_val == 0:
return True
return False
def get_boss_room(self) -> globle.CoordinateType:
"""获取boss房间坐标"""
result = globle.CoordinateType()
rw = self.mem
room_data = rw.read_long(rw.read_long(rw.read_long(addr.FJBHAddr) + addr.SJAddr) + addr.MxPyAddr)
result.x = self.decode(room_data + addr.BOSSRoomXAddr)
result.y = self.decode(room_data + addr.BOSSRoomYAddr)
return result
def get_cut_room(self) -> globle.CoordinateType:
"""获取当前房间坐标"""
result = globle.CoordinateType()
rw = self.mem
room_data = rw.read_long(rw.read_long(rw.read_long(addr.FJBHAddr) + addr.SJAddr) + addr.MxPyAddr)
result.x = self.mem.read_int(room_data + addr.CutRoomXAddr)
result.y = self.mem.read_int(room_data + addr.CutRoomYAddr)
return result
def get_pl(self) -> int:
"""获取当前pl值"""
return self.decode(addr.MaxPlAddr) - self.decode(addr.CutPlAddr)
def get_role_level(self) -> int:
"""获取角色等级"""
return self.mem.read_int(addr.JSDjAddr)
def get_map_name(self):
"""获取地图名称"""
pass
def read_coordinate(self, param: int) -> globle.CoordinateType:
"""读取坐标"""
coordinate = globle.CoordinateType()
if self.mem.read_int(param + addr.LxPyAddr) == 273:
ptr = self.mem.read_long(param + addr.DqZbAddr)
coordinate.x = int(self.mem.read_float(ptr + 0))
coordinate.y = int(self.mem.read_float(ptr + 4))
coordinate.z = int(self.mem.read_float(ptr + 8))
else:
ptr = self.mem.read_long(param + addr.FxPyAddr)
coordinate.x = int(self.mem.read_float(ptr + 32))
coordinate.y = int(self.mem.read_float(ptr + 36))
coordinate.z = int(self.mem.read_float(ptr + 40))
return coordinate
def is_dialog_a(self):
return self.mem.read_int(addr.DHAddr) == 1
def is_dialog_b(self):
return self.mem.read_int(addr.DHAddrB) == 1
def is_dialog_esc(self):
return self.mem.read_int(addr.EscDHAddr) == 1
def back_pack_weight(self) -> int:
"""取背包负重"""
rw_addr = call.person_ptr()
back_pack_ptr = self.mem.read_long(rw_addr + address.WplAddr) # 物品栏
cut_weigh = self.decode(back_pack_ptr + address.DqFzAddr) # 当前负重
max_weigh = self.decode(rw_addr + address.ZdFzAddr) # 最大负重
result = float(cut_weigh) / float(max_weigh) * 100
return int(result)