From 09fba10a5363bd601acead7224d9efcd6d41f13d Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Sat, 22 Feb 2020 18:04:35 +0100 Subject: [PATCH] some QOL --- Items.py | 2 ++ MultiClient.py | 18 ++++++++++++++--- MultiServer.py | 53 +++++++++++++++++++++++++++++++++----------------- 3 files changed, 52 insertions(+), 21 deletions(-) diff --git a/Items.py b/Items.py index 7edd4987..f46e8488 100644 --- a/Items.py +++ b/Items.py @@ -179,3 +179,5 @@ item_table = {'Bow': (True, False, None, 0x0B, 'You have\nchosen the\narcher cla lookup_lower_name_to_id = {name.lower(): data[3] for name, data in item_table.items()} lookup_lower_name_to_name = {name.lower(): name for name in item_table} lookup_id_to_name = {data[3]: name for name, data in item_table.items()} + +hint_blacklist = {"Triforce"} \ No newline at end of file diff --git a/MultiClient.py b/MultiClient.py index 2e810003..185dd210 100644 --- a/MultiClient.py +++ b/MultiClient.py @@ -14,6 +14,10 @@ ModuleUpdate.update() import colorama import websockets import aioconsole +try: + import tqdm +except: + tqdm = None import Items import Regions @@ -74,7 +78,7 @@ def color(text, *args): return color_code(*args) + text + color_code('reset') -RECONNECT_DELAY = 30 +RECONNECT_DELAY = 5 ROM_START = 0x000000 WRAM_START = 0xF50000 @@ -415,7 +419,11 @@ async def snes_connect(ctx : Context, address): asyncio.create_task(snes_autoreconnect(ctx)) async def snes_autoreconnect(ctx: Context): - await asyncio.sleep(RECONNECT_DELAY) + if tqdm: + for _ in tqdm.trange(100, unit='%', leave=False): + await asyncio.sleep(RECONNECT_DELAY/100) + else: + await asyncio.sleep(RECONNECT_DELAY) if ctx.snes_reconnect_address and ctx.snes_socket is None: await snes_connect(ctx, ctx.snes_reconnect_address) @@ -601,7 +609,11 @@ async def server_loop(ctx : Context, address = None): asyncio.create_task(server_autoreconnect(ctx)) async def server_autoreconnect(ctx: Context): - await asyncio.sleep(RECONNECT_DELAY) + if tqdm: + for _ in tqdm.trange(100, unit='%', leave=False): + await asyncio.sleep(RECONNECT_DELAY/100) + else: + await asyncio.sleep(RECONNECT_DELAY) if ctx.server_address and ctx.server_task is None: ctx.server_task = asyncio.create_task(server_loop(ctx)) diff --git a/MultiServer.py b/MultiServer.py index d23ccabe..78e03b31 100644 --- a/MultiServer.py +++ b/MultiServer.py @@ -57,13 +57,15 @@ class Context: self.location_checks = collections.defaultdict(set) self.hint_cost = hint_cost self.location_check_points = location_check_points - self.hints_used = collections.defaultdict(lambda: 0) + self.hints_used = collections.defaultdict(int) + self.hints_sent = collections.defaultdict(set) def get_save(self) -> dict: return { "rom_names": list(self.rom_names.items()), "received_items": tuple((k, [i.__dict__ for i in v]) for k, v in self.received_items.items()), "hints_used" : tuple((key,value) for key, value in self.hints_used.items()), + "hints_sent" : tuple((key,tuple(value)) for key, value in self.hints_sent.items()), "location_checks" : tuple((key,tuple(value)) for key, value in self.location_checks.items()) } @@ -74,6 +76,7 @@ class Context: raise Exception('Save file mismatch, will start a new game') self.received_items = received_items self.hints_used.update({tuple(key): value for key, value in savedata["hints_used"]}) + self.hints_sent.update({tuple(key): set(value) for key, value in savedata["hints_sent"]}) self.location_checks.update({tuple(key): set(value) for key, value in savedata["location_checks"]}) logging.info(f'Loaded save file with {sum([len(p) for p in received_items.values()])} received items ' f'for {len(received_items)} players') @@ -410,35 +413,49 @@ async def process_client_cmd(ctx: Context, client: Client, cmd, args): "for example !hint Lamp or !hint Link's House. " f"A hint costs {ctx.hint_cost} points. " f"You have {points_available} points.") + for item_name in ctx.hints_sent[client.team, client.slot]: + if item_name in Items.item_table: # item name + hints = collect_hints(ctx, client.team, client.slot, item_name) + else: # location name + hints = collect_hints_location(ctx, client.team, client.slot, item_name) + notify_hints(ctx, client.team, hints) else: item_name, usable, response = get_intended_text(item_name) if usable: - if item_name in Items.item_table: # item name + if item_name in Items.hint_blacklist: + notify_client(client, f"Sorry, \"{item_name}\" is marked as non-hintable.") + hints = [] + elif item_name in Items.item_table: # item name hints = collect_hints(ctx, client.team, client.slot, item_name) else: # location name hints = collect_hints_location(ctx, client.team, client.slot, item_name) if hints: - found = 0 - for hint in hints: - found += 1 - hint.found - if not found: + if item_name in ctx.hints_sent[client.team, client.slot]: notify_hints(ctx, client.team, hints) - notify_client(client, "No new items found, points refunded.") + notify_client(client, "Hint was previously used, no points deducted.") else: - if ctx.hint_cost: - can_pay = points_available // (ctx.hint_cost * found) >= 1 - else: - can_pay = True - - if can_pay: - ctx.hints_used[client.team, client.slot] += found + found = 0 + for hint in hints: + found += 1 - hint.found + if not found: notify_hints(ctx, client.team, hints) - save(ctx) + notify_client(client, "No new items found, no points deducted.") else: - notify_client(client, f"You can't afford the hint. " - f"You have {points_available} points and need at least {ctx.hint_cost}, " - f"more if multiple items are still to be found.") + if ctx.hint_cost: + can_pay = points_available // (ctx.hint_cost * found) >= 1 + else: + can_pay = True + + if can_pay: + ctx.hints_used[client.team, client.slot] += found + ctx.hints_sent[client.team, client.slot].add(item_name) + notify_hints(ctx, client.team, hints) + save(ctx) + else: + notify_client(client, f"You can't afford the hint. " + f"You have {points_available} points and need at least {ctx.hint_cost}, " + f"more if multiple items are still to be found.") else: notify_client(client, "Nothing found. Item/Location may not exist.") else: