93 lines
2.2 KiB
Python
93 lines
2.2 KiB
Python
import json
|
|
roomAddress = 0xFFF6
|
|
mapIdAddress = 0xFFF7
|
|
indoorFlagAddress = 0xDBA5
|
|
entranceRoomOffset = 0xD800
|
|
screenCoordAddress = 0xFFFA
|
|
|
|
mapMap = {
|
|
0x00: 0x01,
|
|
0x01: 0x01,
|
|
0x02: 0x01,
|
|
0x03: 0x01,
|
|
0x04: 0x01,
|
|
0x05: 0x01,
|
|
0x06: 0x02,
|
|
0x07: 0x02,
|
|
0x08: 0x02,
|
|
0x09: 0x02,
|
|
0x0A: 0x02,
|
|
0x0B: 0x02,
|
|
0x0C: 0x02,
|
|
0x0D: 0x02,
|
|
0x0E: 0x02,
|
|
0x0F: 0x02,
|
|
0x10: 0x02,
|
|
0x11: 0x02,
|
|
0x12: 0x02,
|
|
0x13: 0x02,
|
|
0x14: 0x02,
|
|
0x15: 0x02,
|
|
0x16: 0x02,
|
|
0x17: 0x02,
|
|
0x18: 0x02,
|
|
0x19: 0x02,
|
|
0x1D: 0x01,
|
|
0x1E: 0x01,
|
|
0x1F: 0x01,
|
|
0xFF: 0x03,
|
|
}
|
|
|
|
class GpsTracker:
|
|
room = None
|
|
location_changed = False
|
|
screenX = 0
|
|
screenY = 0
|
|
indoors = None
|
|
|
|
def __init__(self, gameboy) -> None:
|
|
self.gameboy = gameboy
|
|
|
|
async def read_byte(self, b):
|
|
return (await self.gameboy.async_read_memory(b))[0]
|
|
|
|
async def read_location(self):
|
|
indoors = await self.read_byte(indoorFlagAddress)
|
|
|
|
if indoors != self.indoors and self.indoors != None:
|
|
self.indoorsChanged = True
|
|
|
|
self.indoors = indoors
|
|
|
|
mapId = await self.read_byte(mapIdAddress)
|
|
if mapId not in mapMap:
|
|
print(f'Unknown map ID {hex(mapId)}')
|
|
return
|
|
|
|
mapDigit = mapMap[mapId] << 8 if indoors else 0
|
|
last_room = self.room
|
|
self.room = await self.read_byte(roomAddress) + mapDigit
|
|
|
|
coords = await self.read_byte(screenCoordAddress)
|
|
self.screenX = coords & 0x0F
|
|
self.screenY = (coords & 0xF0) >> 4
|
|
|
|
if (self.room != last_room):
|
|
self.location_changed = True
|
|
|
|
last_message = {}
|
|
async def send_location(self, socket, diff=False):
|
|
if self.room is None:
|
|
return
|
|
message = {
|
|
"type":"location",
|
|
"refresh": True,
|
|
"version":"1.0",
|
|
"room": f'0x{self.room:02X}',
|
|
"x": self.screenX,
|
|
"y": self.screenY,
|
|
}
|
|
if message != self.last_message:
|
|
self.last_message = message
|
|
await socket.send(json.dumps(message))
|