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
This commit is contained in:
parent
0c6b1827fe
commit
206f8cf5ed
27
KH2Client.py
27
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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue