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))
 |