Pokemon Emerald: Fix unguarded wonder trade write (#3939)
This commit is contained in:
parent
1c0cec0de2
commit
f8d3c26e3c
|
@ -133,6 +133,7 @@ class PokemonEmeraldClient(BizHawkClient):
|
||||||
latest_wonder_trade_reply: dict
|
latest_wonder_trade_reply: dict
|
||||||
wonder_trade_cooldown: int
|
wonder_trade_cooldown: int
|
||||||
wonder_trade_cooldown_timer: int
|
wonder_trade_cooldown_timer: int
|
||||||
|
queued_received_trade: Optional[str]
|
||||||
|
|
||||||
death_counter: Optional[int]
|
death_counter: Optional[int]
|
||||||
previous_death_link: float
|
previous_death_link: float
|
||||||
|
@ -153,6 +154,7 @@ class PokemonEmeraldClient(BizHawkClient):
|
||||||
self.previous_death_link = 0
|
self.previous_death_link = 0
|
||||||
self.ignore_next_death_link = False
|
self.ignore_next_death_link = False
|
||||||
self.current_map = None
|
self.current_map = None
|
||||||
|
self.queued_received_trade = None
|
||||||
|
|
||||||
async def validate_rom(self, ctx: "BizHawkClientContext") -> bool:
|
async def validate_rom(self, ctx: "BizHawkClientContext") -> bool:
|
||||||
from CommonClient import logger
|
from CommonClient import logger
|
||||||
|
@ -548,22 +550,29 @@ class PokemonEmeraldClient(BizHawkClient):
|
||||||
(sb1_address + 0x37CC, [1], "System Bus"),
|
(sb1_address + 0x37CC, [1], "System Bus"),
|
||||||
])
|
])
|
||||||
elif trade_is_sent != 0 and wonder_trade_pokemon_data[19] != 2:
|
elif trade_is_sent != 0 and wonder_trade_pokemon_data[19] != 2:
|
||||||
# Game is waiting on receiving a trade. See if there are any available trades that were not
|
# Game is waiting on receiving a trade.
|
||||||
# sent by this player, and if so, try to receive one.
|
if self.queued_received_trade is not None:
|
||||||
if self.wonder_trade_cooldown_timer <= 0 and f"pokemon_wonder_trades_{ctx.team}" in ctx.stored_data:
|
# Client is holding a trade, ready to write it into the game
|
||||||
|
success = await bizhawk.guarded_write(ctx.bizhawk_ctx, [
|
||||||
|
(sb1_address + 0x377C, json_to_pokemon_data(self.queued_received_trade), "System Bus"),
|
||||||
|
], [guards["SAVE BLOCK 1"]])
|
||||||
|
|
||||||
|
# Notify the player if it was written, otherwise hold it for the next loop
|
||||||
|
if success:
|
||||||
|
logger.info("Wonder trade received!")
|
||||||
|
self.queued_received_trade = None
|
||||||
|
|
||||||
|
elif self.wonder_trade_cooldown_timer <= 0 and f"pokemon_wonder_trades_{ctx.team}" in ctx.stored_data:
|
||||||
|
# See if there are any available trades that were not sent by this player. If so, try to receive one.
|
||||||
if any(item[0] != ctx.slot
|
if any(item[0] != ctx.slot
|
||||||
for key, item in ctx.stored_data.get(f"pokemon_wonder_trades_{ctx.team}", {}).items()
|
for key, item in ctx.stored_data.get(f"pokemon_wonder_trades_{ctx.team}", {}).items()
|
||||||
if key != "_lock" and orjson.loads(item[1])["species"] <= 386):
|
if key != "_lock" and orjson.loads(item[1])["species"] <= 386):
|
||||||
received_trade = await self.wonder_trade_receive(ctx)
|
self.queued_received_trade = await self.wonder_trade_receive(ctx)
|
||||||
if received_trade is None:
|
if self.queued_received_trade is None:
|
||||||
self.wonder_trade_cooldown_timer = self.wonder_trade_cooldown
|
self.wonder_trade_cooldown_timer = self.wonder_trade_cooldown
|
||||||
self.wonder_trade_cooldown *= 2
|
self.wonder_trade_cooldown *= 2
|
||||||
self.wonder_trade_cooldown += random.randrange(0, 500)
|
self.wonder_trade_cooldown += random.randrange(0, 500)
|
||||||
else:
|
else:
|
||||||
await bizhawk.write(ctx.bizhawk_ctx, [
|
|
||||||
(sb1_address + 0x377C, json_to_pokemon_data(received_trade), "System Bus"),
|
|
||||||
])
|
|
||||||
logger.info("Wonder trade received!")
|
|
||||||
self.wonder_trade_cooldown = 5000
|
self.wonder_trade_cooldown = 5000
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Reference in New Issue