@@ -40,6 +40,7 @@ async def validate_rom(self, ctx):
40
40
if rom_name is None or rom_name == bytes ([0 ] * ROMNAME_SIZE ) or rom_name [:3 ] != b"ZSM" :
41
41
return False
42
42
43
+ ctx .smz3_new_message_queue = rom_name [7 ] in b"1234567890"
43
44
ctx .game = self .game
44
45
ctx .items_handling = 0b101 # local items and remote start inventory
45
46
@@ -53,6 +54,22 @@ async def game_watcher(self, ctx):
53
54
if ctx .server is None or ctx .slot is None :
54
55
# not successfully connected to a multiworld server, cannot process the game sending items
55
56
return
57
+
58
+ send_progress_addr_ptr_offset = 0x680
59
+ send_progress_size = 8
60
+ send_progress_message_byte_offset = 4
61
+ send_progress_addr_table_offset = 0x700
62
+ recv_progress_addr_ptr_offset = 0x600
63
+ recv_progress_size = 4
64
+ recv_progress_addr_table_offset = 0x602
65
+ if ctx .smz3_new_message_queue :
66
+ send_progress_addr_ptr_offset = 0xD3C
67
+ send_progress_size = 2
68
+ send_progress_message_byte_offset = 0
69
+ send_progress_addr_table_offset = 0xDA0
70
+ recv_progress_addr_ptr_offset = 0xD36
71
+ recv_progress_size = 2
72
+ recv_progress_addr_table_offset = 0xD38
56
73
57
74
currentGame = await snes_read (ctx , SRAM_START + 0x33FE , 2 )
58
75
if (currentGame is not None ):
@@ -69,22 +86,22 @@ async def game_watcher(self, ctx):
69
86
ctx .finished_game = True
70
87
return
71
88
72
- data = await snes_read (ctx , SMZ3_RECV_PROGRESS_ADDR + 0xD3C , 4 )
89
+ data = await snes_read (ctx , SMZ3_RECV_PROGRESS_ADDR + send_progress_addr_ptr_offset , 4 )
73
90
if data is None :
74
91
return
75
92
76
93
recv_index = data [0 ] | (data [1 ] << 8 )
77
94
recv_item = data [2 ] | (data [3 ] << 8 )
78
95
79
96
while (recv_index < recv_item ):
80
- item_address = recv_index * 2
81
- message = await snes_read (ctx , SMZ3_RECV_PROGRESS_ADDR + 0xDA0 + item_address , 2 )
82
- is_z3_item = ((message [1 ] & 0x80 ) != 0 )
83
- masked_part = (message [1 ] & 0x7F ) if is_z3_item else message [1 ]
84
- item_index = ((message [0 ] | (masked_part << 8 )) >> 3 ) + (256 if is_z3_item else 0 )
97
+ item_address = recv_index * send_progress_size
98
+ message = await snes_read (ctx , SMZ3_RECV_PROGRESS_ADDR + send_progress_addr_table_offset + item_address , send_progress_size )
99
+ is_z3_item = ((message [send_progress_message_byte_offset + 1 ] & 0x80 ) != 0 )
100
+ masked_part = (message [send_progress_message_byte_offset + 1 ] & 0x7F ) if is_z3_item else message [send_progress_message_byte_offset + 1 ]
101
+ item_index = ((message [send_progress_message_byte_offset ] | (masked_part << 8 )) >> 3 ) + (256 if is_z3_item else 0 )
85
102
86
103
recv_index += 1
87
- snes_buffered_write (ctx , SMZ3_RECV_PROGRESS_ADDR + 0xD3C , bytes ([recv_index & 0xFF , (recv_index >> 8 ) & 0xFF ]))
104
+ snes_buffered_write (ctx , SMZ3_RECV_PROGRESS_ADDR + send_progress_addr_ptr_offset , bytes ([recv_index & 0xFF , (recv_index >> 8 ) & 0xFF ]))
88
105
89
106
from .TotalSMZ3 .Location import locations_start_id
90
107
from . import convertLocSMZ3IDToAPID
@@ -95,7 +112,7 @@ async def game_watcher(self, ctx):
95
112
snes_logger .info (f'New Check: { location } ({ len (ctx .locations_checked )} /{ len (ctx .missing_locations ) + len (ctx .checked_locations )} )' )
96
113
await ctx .send_msgs ([{"cmd" : 'LocationChecks' , "locations" : [location_id ]}])
97
114
98
- data = await snes_read (ctx , SMZ3_RECV_PROGRESS_ADDR + 0xD36 , 4 )
115
+ data = await snes_read (ctx , SMZ3_RECV_PROGRESS_ADDR + recv_progress_addr_ptr_offset , 4 )
99
116
if data is None :
100
117
return
101
118
@@ -107,9 +124,12 @@ async def game_watcher(self, ctx):
107
124
item_id = item .item - items_start_id
108
125
109
126
player_id = item .player if item .player < SMZ3_ROM_PLAYER_LIMIT else 0
110
- snes_buffered_write (ctx , SMZ3_RECV_PROGRESS_ADDR + item_out_ptr * 2 , bytes ([player_id , item_id ]))
127
+ snes_buffered_write (ctx ,
128
+ SMZ3_RECV_PROGRESS_ADDR + item_out_ptr * recv_progress_size ,
129
+ bytes ([player_id , item_id ]) if ctx .smz3_new_message_queue else
130
+ bytes ([player_id & 0xFF , (player_id >> 8 ) & 0xFF , item_id & 0xFF , (item_id >> 8 ) & 0xFF ]))
111
131
item_out_ptr += 1
112
- snes_buffered_write (ctx , SMZ3_RECV_PROGRESS_ADDR + 0xD38 , bytes ([item_out_ptr & 0xFF , (item_out_ptr >> 8 ) & 0xFF ]))
132
+ snes_buffered_write (ctx , SMZ3_RECV_PROGRESS_ADDR + recv_progress_addr_table_offset , bytes ([item_out_ptr & 0xFF , (item_out_ptr >> 8 ) & 0xFF ]))
113
133
logging .info ('Received %s from %s (%s) (%d/%d in list)' % (
114
134
color (ctx .item_names [item .item ], 'red' , 'bold' ), color (ctx .player_names [item .player ], 'yellow' ),
115
135
ctx .location_names [item .location ], item_out_ptr , len (ctx .items_received )))
0 commit comments