MultiClient: signal an event when receiving item data to improve responsiveness
This commit is contained in:
parent
b36c981eb4
commit
f843c401c7
|
@ -24,6 +24,7 @@ class Context:
|
|||
self.server_address = server_address
|
||||
|
||||
self.exit_event = asyncio.Event()
|
||||
self.watcher_event = asyncio.Event()
|
||||
|
||||
self.input_queue = asyncio.Queue()
|
||||
self.input_requests = 0
|
||||
|
@ -647,6 +648,7 @@ async def process_server_cmd(ctx : Context, cmd, args):
|
|||
if start_index == len(ctx.items_received):
|
||||
for item in items:
|
||||
ctx.items_received.append(ReceivedItem(*item))
|
||||
ctx.watcher_event.set()
|
||||
|
||||
if cmd == 'LocationInfo':
|
||||
for location, item, player in args:
|
||||
|
@ -655,6 +657,7 @@ async def process_server_cmd(ctx : Context, cmd, args):
|
|||
item_name = replacements.get(item, get_item_name_from_id(item))
|
||||
print(f"Saw {color(item_name, 'red', 'bold')} at {list(Regions.location_table.keys())[location - 1]}")
|
||||
ctx.locations_info[location] = (item, player)
|
||||
ctx.watcher_event.set()
|
||||
|
||||
if cmd == 'ItemSent':
|
||||
player_sent, location, player_recvd, item = args
|
||||
|
@ -822,7 +825,11 @@ async def track_locations(ctx : Context, roomid, roomdata):
|
|||
|
||||
async def game_watcher(ctx : Context):
|
||||
while not ctx.exit_event.is_set():
|
||||
await asyncio.sleep(2)
|
||||
try:
|
||||
await asyncio.wait_for(ctx.watcher_event.wait(), 2)
|
||||
except asyncio.TimeoutError:
|
||||
pass
|
||||
ctx.watcher_event.clear()
|
||||
|
||||
if not ctx.rom:
|
||||
rom = await snes_read(ctx, ROMNAME_START, ROMNAME_SIZE)
|
||||
|
@ -857,12 +864,6 @@ async def game_watcher(ctx : Context):
|
|||
assert SCOUT_LOCATION_ADDR == RECV_PROGRESS_ADDR + 7
|
||||
scout_location = data[7]
|
||||
|
||||
if scout_location > 0 and scout_location not in ctx.locations_scouted:
|
||||
ctx.locations_scouted.add(scout_location)
|
||||
print(f'Scouting item at {list(Regions.location_table.keys())[scout_location - 1]}')
|
||||
await send_msgs(ctx.socket, [['LocationScouts', [scout_location]]])
|
||||
await track_locations(ctx, roomid, roomdata)
|
||||
|
||||
if recv_index < len(ctx.items_received) and recv_item == 0:
|
||||
item = ctx.items_received[recv_index]
|
||||
print('Received %s from %s (%s) (%d/%d in list)' % (
|
||||
|
@ -879,6 +880,12 @@ async def game_watcher(ctx : Context):
|
|||
|
||||
await snes_flush_writes(ctx)
|
||||
|
||||
if scout_location > 0 and scout_location not in ctx.locations_scouted:
|
||||
ctx.locations_scouted.add(scout_location)
|
||||
print(f'Scouting item at {list(Regions.location_table.keys())[scout_location - 1]}')
|
||||
await send_msgs(ctx.socket, [['LocationScouts', [scout_location]]])
|
||||
await track_locations(ctx, roomid, roomdata)
|
||||
|
||||
async def main():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('--snes', default='localhost:8080', help='Address of the QUsb2snes server.')
|
||||
|
|
Loading…
Reference in New Issue