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
 | 
			
		||||
    wonder_trade_cooldown: int
 | 
			
		||||
    wonder_trade_cooldown_timer: int
 | 
			
		||||
    queued_received_trade: Optional[str]
 | 
			
		||||
 | 
			
		||||
    death_counter: Optional[int]
 | 
			
		||||
    previous_death_link: float
 | 
			
		||||
| 
						 | 
				
			
			@ -153,6 +154,7 @@ class PokemonEmeraldClient(BizHawkClient):
 | 
			
		|||
        self.previous_death_link = 0
 | 
			
		||||
        self.ignore_next_death_link = False
 | 
			
		||||
        self.current_map = None
 | 
			
		||||
        self.queued_received_trade = None
 | 
			
		||||
 | 
			
		||||
    async def validate_rom(self, ctx: "BizHawkClientContext") -> bool:
 | 
			
		||||
        from CommonClient import logger
 | 
			
		||||
| 
						 | 
				
			
			@ -548,22 +550,29 @@ class PokemonEmeraldClient(BizHawkClient):
 | 
			
		|||
                    (sb1_address + 0x37CC, [1], "System Bus"),
 | 
			
		||||
                ])
 | 
			
		||||
            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
 | 
			
		||||
                # sent by this player, and if so, try to receive one.
 | 
			
		||||
                if self.wonder_trade_cooldown_timer <= 0 and f"pokemon_wonder_trades_{ctx.team}" in ctx.stored_data:
 | 
			
		||||
                # Game is waiting on receiving a trade.
 | 
			
		||||
                if self.queued_received_trade is not None:
 | 
			
		||||
                    # 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
 | 
			
		||||
                            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):
 | 
			
		||||
                        received_trade = await self.wonder_trade_receive(ctx)
 | 
			
		||||
                        if received_trade is None:
 | 
			
		||||
                        self.queued_received_trade = await self.wonder_trade_receive(ctx)
 | 
			
		||||
                        if self.queued_received_trade is None:
 | 
			
		||||
                            self.wonder_trade_cooldown_timer = self.wonder_trade_cooldown
 | 
			
		||||
                            self.wonder_trade_cooldown *= 2
 | 
			
		||||
                            self.wonder_trade_cooldown += random.randrange(0, 500)
 | 
			
		||||
                        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
 | 
			
		||||
 | 
			
		||||
                else:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue