From e6b58aa2be7c0fd8e393f962c69809f0a1228854 Mon Sep 17 00:00:00 2001 From: massimilianodelliubaldini <8584296+massimilianodelliubaldini@users.noreply.github.com> Date: Sat, 7 Sep 2024 15:30:23 -0400 Subject: [PATCH] Fix deathlink reset stalls on a busy client. (#47) --- worlds/jakanddaxter/Client.py | 3 +- worlds/jakanddaxter/client/MemoryReader.py | 46 ++++++++++++---------- worlds/jakanddaxter/client/ReplClient.py | 12 ------ 3 files changed, 26 insertions(+), 35 deletions(-) diff --git a/worlds/jakanddaxter/Client.py b/worlds/jakanddaxter/Client.py index 66fc60b1e2..f71e94ef75 100644 --- a/worlds/jakanddaxter/Client.py +++ b/worlds/jakanddaxter/Client.py @@ -222,10 +222,9 @@ class JakAndDaxterContext(CommonContext): await self.send_death(death_text) logger.info(death_text) - # Reset all flags. + # Reset all flags, but leave the death count alone. self.memr.send_deathlink = False self.memr.cause_of_death = "" - await self.repl.reset_deathlink() def on_deathlink_check(self): create_task_log_exception(self.ap_inform_deathlink()) diff --git a/worlds/jakanddaxter/client/MemoryReader.py b/worlds/jakanddaxter/client/MemoryReader.py index e3d8900fe8..2b33af349e 100644 --- a/worlds/jakanddaxter/client/MemoryReader.py +++ b/worlds/jakanddaxter/client/MemoryReader.py @@ -59,7 +59,8 @@ buzzers_received_offset = offsets.define(sizeof_uint8, 16) specials_received_offset = offsets.define(sizeof_uint8, 32) # Deathlink information. -died_offset = offsets.define(sizeof_uint8) +death_count_offset = offsets.define(sizeof_uint32) +death_cause_offset = offsets.define(sizeof_uint8) deathlink_enabled_offset = offsets.define(sizeof_uint8) # Move Rando information. @@ -98,41 +99,41 @@ def as_float(value: int) -> int: # "Jak" to be replaced by player name in the Client. -def autopsy(died: int) -> str: - if died in [1, 2, 3, 4]: +def autopsy(cause: int) -> str: + if cause in [1, 2, 3, 4]: return random.choice(["Jak said goodnight.", "Jak stepped into the light.", "Jak gave Daxter his insect collection.", "Jak did not follow Step 1."]) - if died == 5: + if cause == 5: return "Jak fell into an endless pit." - if died == 6: + if cause == 6: return "Jak drowned in the spicy water." - if died == 7: + if cause == 7: return "Jak tried to tackle a Lurker Shark." - if died == 8: + if cause == 8: return "Jak hit 500 degrees." - if died == 9: + if cause == 9: return "Jak took a bath in a pool of dark eco." - if died == 10: + if cause == 10: return "Jak got bombarded with flaming 30-ton boulders." - if died == 11: + if cause == 11: return "Jak hit 800 degrees." - if died == 12: + if cause == 12: return "Jak ceased to be." - if died == 13: + if cause == 13: return "Jak got eaten by the dark eco plant." - if died == 14: + if cause == 14: return "Jak burned up." - if died == 15: + if cause == 15: return "Jak hit the ground hard." - if died == 16: + if cause == 16: return "Jak crashed the zoomer." - if died == 17: + if cause == 17: return "Jak got Flut Flut hurt." - if died == 18: + if cause == 18: return "Jak poisoned the whole darn catch." - if died == 19: + if cause == 19: return "Jak collided with too many obstacles." return "Jak died." @@ -154,6 +155,7 @@ class JakAndDaxterMemoryReader: deathlink_enabled: bool = False send_deathlink: bool = False cause_of_death: str = "" + death_count: int = 0 # Orbsanity handling orbsanity_enabled: bool = False @@ -286,10 +288,12 @@ class JakAndDaxterMemoryReader: self.location_outbox.append(special_ap_id) logger.debug("Checked special: " + str(next_special)) - died = self.read_goal_address(died_offset, sizeof_uint8) - if died > 0: + death_count = self.read_goal_address(death_count_offset, sizeof_uint32) + death_cause = self.read_goal_address(death_cause_offset, sizeof_uint8) + if death_count > self.death_count: + self.cause_of_death = autopsy(death_cause) # The way he names his variables? Wack! self.send_deathlink = True - self.cause_of_death = autopsy(died) + self.death_count += 1 # Listen for any changes to this setting. deathlink_flag = self.read_goal_address(deathlink_enabled_offset, sizeof_uint8) diff --git a/worlds/jakanddaxter/client/ReplClient.py b/worlds/jakanddaxter/client/ReplClient.py index b6cd5206e7..ed0dd7084f 100644 --- a/worlds/jakanddaxter/client/ReplClient.py +++ b/worlds/jakanddaxter/client/ReplClient.py @@ -79,10 +79,6 @@ class JakAndDaxterReplClient: if self.received_deathlink: await self.receive_deathlink() - - # Reset all flags. - # As a precaution, we should reset our own deathlink flag as well. - await self.reset_deathlink() self.received_deathlink = False # This helper function formats and sends `form` as a command to the REPL. @@ -331,14 +327,6 @@ class JakAndDaxterReplClient: logger.error(f"Unable to receive deathlink signal!") return ok - async def reset_deathlink(self) -> bool: - ok = await self.send_form("(set! (-> *ap-info-jak1* died) 0)") - if ok: - logger.debug(f"Reset deathlink flag!") - else: - logger.error(f"Unable to reset deathlink flag!") - return ok - async def subtract_traded_orbs(self, orb_count: int) -> bool: # To protect against momentary server disconnects,