Items are now working!

This commit is contained in:
MarioSpore
2025-08-07 00:38:42 -04:00
parent 4123961e81
commit f38a5fbadd

View File

@@ -1,8 +1,6 @@
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from .Locations import grinch_locations from .Locations import grinch_locations
from .Items import ALL_ITEMS_TABLE from .Items import ALL_ITEMS_TABLE
from NetUtils import ClientStatus
import asyncio
import worlds._bizhawk as bizhawk import worlds._bizhawk as bizhawk
from worlds._bizhawk.client import BizHawkClient from worlds._bizhawk.client import BizHawkClient
from worlds.Files import APDeltaPatch from worlds.Files import APDeltaPatch
@@ -16,12 +14,15 @@ class GrinchClient(BizHawkClient):
system = "PSX" system = "PSX"
patch_suffix = ".apgrinch" patch_suffix = ".apgrinch"
items_handling = 0b111 items_handling = 0b111
last_received_index = 0
def __init__(self): def __init__(self):
super().__init__() super().__init__()
async def validate_rom(self, ctx: "BizHawkClientContext") -> bool: async def validate_rom(self, ctx: "BizHawkClientContext") -> bool:
from CommonClient import logger
# TODO Check the ROM data to see if it matches against bytes expected
grinch_identifier_ram_address: int = 0x00928C grinch_identifier_ram_address: int = 0x00928C
bytes_expected: bytes = bytes.fromhex("e903c14f4becf89082f43ec936a68e62") bytes_expected: bytes = bytes.fromhex("e903c14f4becf89082f43ec936a68e62")
try: try:
@@ -30,7 +31,7 @@ class GrinchClient(BizHawkClient):
psx_rom_name = bytes_actual.decode("ascii") psx_rom_name = bytes_actual.decode("ascii")
if psx_rom_name != "SLUS_011.97": if psx_rom_name != "SLUS_011.97":
logger.info("Invalid rom detected. You are not playing Grinch USA Version.") logger.error("Invalid rom detected. You are not playing Grinch USA Version.")
raise Exception("Invalid rom detected. You are not playing Grinch USA Version.") raise Exception("Invalid rom detected. You are not playing Grinch USA Version.")
except Exception(): except Exception():
return False return False
@@ -38,7 +39,7 @@ class GrinchClient(BizHawkClient):
ctx.game = self.game ctx.game = self.game
ctx.items_handling = self.items_handling ctx.items_handling = self.items_handling
ctx.want_slot_data = True ctx.want_slot_data = True
ctx.watcher_timeout = 0.5 ctx.watcher_timeout = 0.125
return True return True
@@ -50,7 +51,6 @@ class GrinchClient(BizHawkClient):
if ctx.server is None or ctx.server.socket.closed or ctx.slot_data is None: if ctx.server is None or ctx.server.socket.closed or ctx.slot_data is None:
return return
try: try:
# # Read save data # # Read save data
# save_data = await bizhawk.read( # save_data = await bizhawk.read(
@@ -72,7 +72,7 @@ class GrinchClient(BizHawkClient):
# "status": ClientStatus.CLIENT_GOAL # "status": ClientStatus.CLIENT_GOAL
# }]) # }])
await self.location_checker(ctx) await self.location_checker(ctx)
# await self.receiving_items_handler(ctx) await self.receiving_items_handler(ctx)
except bizhawk.RequestFailedError: except bizhawk.RequestFailedError:
# The connector didn't respond. Exit handler and return to main loop to reconnect # The connector didn't respond. Exit handler and return to main loop to reconnect
@@ -91,7 +91,7 @@ class GrinchClient(BizHawkClient):
for addr_to_update in grinch_loc_ram_data.update_ram_addr: for addr_to_update in grinch_loc_ram_data.update_ram_addr:
is_binary = True if not addr_to_update.binary_bit_pos is None else False is_binary = True if not addr_to_update.binary_bit_pos is None else False
current_ram_address_value = int.from_bytes((await bizhawk.read(ctx.bizhawk_ctx, [( current_ram_address_value = int.from_bytes((await bizhawk.read(ctx.bizhawk_ctx, [(
addr_to_update.ram_address, addr_to_update.bit_size, "MainRAM")]))[0]) addr_to_update.ram_address, addr_to_update.bit_size, "MainRAM")]))[0], "little")
if is_binary: if is_binary:
if (current_ram_address_value & (1 << addr_to_update.binary_bit_pos)) > 0: if (current_ram_address_value & (1 << addr_to_update.binary_bit_pos)) > 0:
ctx.locations_checked.add(missing_location) ctx.locations_checked.add(missing_location)
@@ -104,9 +104,30 @@ class GrinchClient(BizHawkClient):
await ctx.check_locations(ctx.locations_checked) await ctx.check_locations(ctx.locations_checked)
async def receiving_items_handler(self, ctx: "BizHawkClientContext"): async def receiving_items_handler(self, ctx: "BizHawkClientContext"):
for item_received in ctx.items_received: # Len will give us the size of the items received list & we will track that against how many items we received already
local_item = ctx.item_names.lookup_in_game(item_received) # If the list says that we have 3 items and we already received items, we will ignore and continue.
# Otherwise, we will get the new items and give them to the player.
if len(ctx.items_received) == self.last_received_index:
return
# Ensures we only get the new items that we want to give the player
new_items_only = ctx.items_received[self.last_received_index:]
for item_received in new_items_only:
local_item = ctx.item_names.lookup_in_game(item_received.item)
grinch_item_ram_data = ALL_ITEMS_TABLE[local_item] grinch_item_ram_data = ALL_ITEMS_TABLE[local_item]
for addr_to_update in grinch_item_ram_data.update_ram_addr: for addr_to_update in grinch_item_ram_data.update_ram_addr:
is_binary = True if not addr_to_update.binary_bit_pos is None else False is_binary = True if not addr_to_update.binary_bit_pos is None else False
if is_binary:
current_ram_address_value = int.from_bytes((await bizhawk.read(ctx.bizhawk_ctx, [(
addr_to_update.ram_address, addr_to_update.bit_size, "MainRAM")]))[0], "little")
current_ram_address_value = (current_ram_address_value | (1 << addr_to_update.binary_bit_pos))
else:
current_ram_address_value = addr_to_update.value
# Write the updated value back into RAM
await bizhawk.write(ctx.bizhawk_ctx, [(addr_to_update.ram_address,
current_ram_address_value.to_bytes(addr_to_update.bit_size, "little"), "MainRAM")])
self.last_received_index += 1