From 206f8cf5ed3d1952fa90c95360738b1ffbedab3f Mon Sep 17 00:00:00 2001 From: JaredWeakStrike <96694163+JaredWeakStrike@users.noreply.github.com> Date: Wed, 22 Mar 2023 10:21:41 -0400 Subject: [PATCH] KH2: fixed bugs of rc1 (#1565) KH2Client: - Now checks if the world id is in the list of checks. This fixed sending out stuff on the movie - Cleaned up unused inports - Not getting starting invo if the game is not open when you connect to the server __init__: -Cleaned up print statements - Fixed the spoiler log not outputting the right amount of mcguffins after fixing them in the case of the player messing up their settings Openkh: -Fixed putting the correct dummy item on levels --- KH2Client.py | 27 +++++++++------------------ worlds/kh2/OpenKH.py | 2 +- worlds/kh2/__init__.py | 28 ++++++++++++++++++---------- 3 files changed, 28 insertions(+), 29 deletions(-) diff --git a/KH2Client.py b/KH2Client.py index 7c3f6911..2068e11e 100644 --- a/KH2Client.py +++ b/KH2Client.py @@ -1,11 +1,10 @@ import os import asyncio import ModuleUpdate -import typing import json import Utils from pymem import pymem -from worlds.kh2.Items import DonaldAbility_Table, GoofyAbility_Table, exclusionItem_table, CheckDupingItems +from worlds.kh2.Items import exclusionItem_table, CheckDupingItems from worlds.kh2 import all_locations, item_dictionary_table, exclusion_table from worlds.kh2.WorldLocations import * @@ -89,6 +88,7 @@ class KH2Context(CommonContext): "StatIncrease": {}, "Boost": {}, }}, + # 1,3,255 are in this list in case the player gets locations in those "worlds" and I need to still have them checked "worldIdChecks": { "1": [], # world of darkness (story cutscenes) "2": [], @@ -136,9 +136,9 @@ class KH2Context(CommonContext): self.game_connected = False self.finalxemnas = False self.worldid = { - 1: TWTNW_Checks, # world of darkness (story cutscenes) + # 1: {}, # world of darkness (story cutscenes) 2: TT_Checks, - 3: TT_Checks, # destiny island doesn't have checks to ima put tt checks here + # 3: {}, # destiny island doesn't have checks to ima put tt checks here 4: HB_Checks, 5: BC_Checks, 6: Oc_Checks, @@ -154,7 +154,7 @@ class KH2Context(CommonContext): 16: PR_Checks, 17: SP_Checks, 18: TWTNW_Checks, - 255: HB_Checks, # starting screen + # 255: {}, # starting screen } # 0x2A09C00+0x40 is the sve anchor. +1 is the last saved room self.sveroom = 0x2A09C00 + 0x41 @@ -304,22 +304,22 @@ class KH2Context(CommonContext): if item.location not in self.kh2seedsave["checked_locations"][str(item.player)] \ and item.location not in {-1, -2}: self.kh2seedsave["checked_locations"][str(item.player)].append(item.location) - if not self.kh2seedsave["starting_inventory"] and self.kh2connected: + if not self.kh2seedsave["starting_inventory"]: self.kh2seedsave["starting_inventory"] = True if cmd in {"RoomUpdate"}: if "checked_locations" in args: new_locations = set(args["checked_locations"]) # TODO: make this take locations from other players on the same slot so proper coop happens - #items_to_give = [self.kh2slotdata["LocalItems"][str(location_id)] for location_id in new_locations if + # items_to_give = [self.kh2slotdata["LocalItems"][str(location_id)] for location_id in new_locations if # location_id in self.kh2LocalItems.keys()] self.checked_locations |= new_locations async def checkWorldLocations(self): try: currentworldint = int.from_bytes(self.kh2.read_bytes(self.kh2.base_address + 0x0714DB8, 1), "big") - curworldid = self.worldid[currentworldint] - if currentworldint != 1: + if currentworldint in self.worldid: + curworldid = self.worldid[currentworldint] for location, data in curworldid.items(): if location not in self.locations_checked \ and (int.from_bytes( @@ -442,16 +442,9 @@ class KH2Context(CommonContext): return isChecked async def give_item(self, item, ItemType="ServerItems"): - while not self.kh2connected: - await asyncio.sleep(1) try: itemname = self.lookup_id_to_item[item] itemcode = self.item_name_to_data[itemname] - # cannot give items during loading screens - # 0x8E9DA3=load 0xAB8BC7=black 0x2A148E8=controllable 0x715568=room transition - while int.from_bytes(self.kh2.read_bytes(self.kh2.base_address + self.Now, 1), "big") in {255, 1}: - await asyncio.sleep(1) - if itemcode.ability: abilityInvoType = 0 TwilightZone = 2 @@ -459,7 +452,6 @@ class KH2Context(CommonContext): abilityInvoType = 1 TwilightZone = -2 if itemname in {"High Jump", "Quick Run", "Dodge Roll", "Aerial Dodge", "Glide"}: - self.kh2seedsave["AmountInvo"][ItemType]["Growth"][itemname] += 1 return @@ -609,7 +601,6 @@ class KH2Context(CommonContext): for itemName in master_keyblade: itemData = self.item_name_to_data[itemName] - # if isChecked: # if the inventory slot for that keyblade is less than the amount they should have if int.from_bytes(self.kh2.read_bytes(self.kh2.base_address + self.Save + itemData.memaddr, 1), "big") <= 0: diff --git a/worlds/kh2/OpenKH.py b/worlds/kh2/OpenKH.py index a1f9cc36..284b9f94 100644 --- a/worlds/kh2/OpenKH.py +++ b/worlds/kh2/OpenKH.py @@ -195,7 +195,7 @@ def patch_kh2(self, output_directory): if data.item.player == self.player: itemcode = item_dictionary_table[data.item.name].kh2id else: - itemcode = 461 + itemcode = 90 # castle map else: increaseStat(self.multiworld.per_slot_randoms[self.player].randint(0, 3)) itemcode = 0 diff --git a/worlds/kh2/__init__.py b/worlds/kh2/__init__.py index a9b86fa2..99037ec4 100644 --- a/worlds/kh2/__init__.py +++ b/worlds/kh2/__init__.py @@ -1,6 +1,6 @@ - from BaseClasses import Tutorial, ItemClassification +import logging from .Items import * from .Locations import all_locations, setup_locations, exclusion_table @@ -97,7 +97,8 @@ class KH2World(World): if item in ActionAbility_Table.keys() or item in SupportAbility_Table.keys(): # cannot have more than the quantity for abilties if value > item_dictionary_table[item].quantity: - print(f"{self.multiworld.get_file_safe_player_name(self.player)} cannot have more than {item_dictionary_table[item].quantity} of {item}") + logging.info(f"{self.multiworld.get_file_safe_player_name(self.player)} cannot have more than {item_dictionary_table[item].quantity} of {item}" + f"Changing the amount to the max amount") value = item_dictionary_table[item].quantity self.item_quantity_dict[item] -= value @@ -128,9 +129,12 @@ class KH2World(World): luckyemblemamount = self.multiworld.LuckyEmblemsAmount[self.player].value luckyemblemrequired = self.multiworld.LuckyEmblemsRequired[self.player].value if luckyemblemamount < luckyemblemrequired: + logging.info(f"Lucky Emblem Amount {self.multiworld.LuckyEmblemsAmount[self.player].value} is less than required " + f"{self.multiworld.LuckyEmblemsRequired[self.player].value} for player {self.multiworld.get_file_safe_player_name(self.player)}." + f" Setting amount to {self.multiworld.LuckyEmblemsRequired[self.player].value}") luckyemblemamount = max(luckyemblemamount, luckyemblemrequired) - print(f"Lucky Emblem Amount {self.multiworld.LuckyEmblemsAmount[self.player].value} is less than required \ - {self.multiworld.LuckyEmblemsRequired[self.player].value} for player {self.multiworld.get_file_safe_player_name(self.player)}") + self.multiworld.LuckyEmblemsAmount[self.player].value = luckyemblemamount + self.item_quantity_dict[ItemName.LuckyEmblem] = item_dictionary_table[ItemName.LuckyEmblem].quantity + luckyemblemamount # give this proof to unlock the final door once the player has the amount of lucky emblem required self.item_quantity_dict[ItemName.ProofofNonexistence] = 0 @@ -146,19 +150,23 @@ class KH2World(World): self.RandomSuperBoss.remove(location) # Testing if the player has the right amount of Bounties for Completion. if len(self.RandomSuperBoss) < self.BountiesAmount: - print(f"{self.multiworld.get_file_safe_player_name(self.player)} has too many bounties than bosses") + logging.info(f"{self.multiworld.get_file_safe_player_name(self.player)} has too many bounties than bosses." + f" Setting total bounties to {len(self.RandomSuperBoss)}") self.BountiesAmount = len(self.RandomSuperBoss) - self.multiworld.BountyAmount[self.player].value = len(self.RandomSuperBoss) + self.multiworld.BountyAmount[self.player].value = self.BountiesAmount if len(self.RandomSuperBoss) < self.BountiesRequired: - print(f"{self.multiworld.get_file_safe_player_name(self.player)} has too many required bounties") + logging.info(f"{self.multiworld.get_file_safe_player_name(self.player)} has too many required bounties." + f" Setting required bounties to {len(self.RandomSuperBoss)}") self.BountiesRequired = len(self.RandomSuperBoss) - self.multiworld.BountyRequired[self.player].value = len(self.RandomSuperBoss) + self.multiworld.BountyRequired[self.player].value = self.BountiesRequired if self.BountiesAmount < self.BountiesRequired: + logging.info(f"Bounties Amount {self.multiworld.BountyAmount[self.player].value} is less than required " + f"{self.multiworld.BountyRequired[self.player].value} for player {self.multiworld.get_file_safe_player_name(self.player)}." + f" Setting amount to {self.multiworld.BountyRequired[self.player].value}") self.BountiesAmount = max(self.BountiesAmount, self.BountiesRequired) - print(f"Bounties Amount {self.multiworld.BountyAmount[self.player].value} is less than required \ - {self.multiworld.BountyRequired[self.player].value} for player {self.multiworld.get_file_safe_player_name(self.player)}") + self.multiworld.BountyAmount[self.player].value = self.BountiesAmount self.multiworld.start_hints[self.player].value.add(ItemName.Bounty) self.item_quantity_dict[ItemName.ProofofNonexistence] = 0