Raft: Implement get_filler_item_name and refactor filler item code a bit (#4782)

* refactor filler item creation for Raft, implement get_filler_item_name

* wrong indent

* Update worlds/raft/__init__.py

Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

---------

Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>
This commit is contained in:
NewSoupVi
2025-05-24 23:02:27 +02:00
committed by GitHub
parent 4119763e23
commit eba757d2cd

View File

@@ -40,6 +40,8 @@ class RaftWorld(World):
options_dataclass = RaftOptions
options: RaftOptions
extraItemNamePool: list[str] | None = None
required_client_version = (0, 3, 4)
def create_items(self):
@@ -52,19 +54,19 @@ class RaftWorld(World):
pool = []
frequencyItems = []
for item in item_table:
raft_item = self.create_item_replaceAsNecessary(item["name"])
raft_item = self.create_item(self.replace_item_name_as_necessary(item["name"]))
if isFillingFrequencies and "Frequency" in item["name"]:
frequencyItems.append(raft_item)
else:
pool.append(raft_item)
extraItemNamePool = []
self.extraItemNamePool = []
extras = len(location_table) - len(item_table) - 1 # Victory takes up 1 unaccounted-for slot
if extras > 0:
if (self.options.filler_item_types != self.options.filler_item_types.option_duplicates): # Use resource packs
for packItem in resourcePackItems:
for i in range(minimumResourcePackAmount, maximumResourcePackAmount + 1):
extraItemNamePool.append(createResourcePackName(i, packItem))
self.extraItemNamePool.append(createResourcePackName(i, packItem))
if self.options.filler_item_types != self.options.filler_item_types.option_resource_packs: # Use duplicate items
dupeItemPool = item_table.copy()
@@ -90,13 +92,13 @@ class RaftWorld(World):
dupeItemPool = list(dupeItemPool)
# Finally, add items as necessary
if len(dupeItemPool) > 0:
for item in dupeItemPool:
extraItemNamePool.append(item["name"])
self.extraItemNamePool.append(self.replace_item_name_as_necessary(item))
if (len(extraItemNamePool) > 0):
for randomItem in self.random.choices(extraItemNamePool, k=extras):
raft_item = self.create_item_replaceAsNecessary(randomItem)
assert self.extraItemNamePool, f"Don't know what extra items to create for {self.player_name}."
for randomItem in self.random.choices(self.extraItemNamePool, k=extras):
raft_item = self.create_item(randomItem)
pool.append(raft_item)
self.multiworld.itempool += pool
@@ -108,19 +110,35 @@ class RaftWorld(World):
if frequencyItems:
self.place_frequencyItems(frequencyItems)
def get_filler_item_name(self) -> str:
# A normal Raft world will have an extraItemNamePool defined after create_items.
if self.extraItemNamePool:
return self.random.choice(self.extraItemNamePool)
# If this is a "fake" world, e.g. item links with link replacement: Resource packs are always be safe to create
minRPSpecified = self.options.minimum_resource_pack_amount.value
maxRPSpecified = self.options.maximum_resource_pack_amount.value
minimumResourcePackAmount = min(minRPSpecified, maxRPSpecified)
maximumResourcePackAmount = max(minRPSpecified, maxRPSpecified)
resource_amount = self.random.randint(minimumResourcePackAmount, maximumResourcePackAmount)
resource_type = self.random.choice(resourcePackItems)
return createResourcePackName(resource_amount, resource_type)
def set_rules(self):
set_rules(self.multiworld, self.player)
def create_regions(self):
create_regions(self.multiworld, self.player)
def create_item_replaceAsNecessary(self, name: str) -> Item:
isFrequency = "Frequency" in name
shouldUseProgressive = bool((isFrequency and self.options.island_frequency_locations == self.options.island_frequency_locations.option_progressive)
or (not isFrequency and self.options.progressive_items))
if shouldUseProgressive and name in progressive_table:
name = progressive_table[name]
return self.create_item(name)
def replace_item_name_as_necessary(self, name: str) -> str:
if name not in progressive_table:
return name
if "Frequency" in name:
if self.options.island_frequency_locations == self.options.island_frequency_locations.option_progressive:
return progressive_table[name]
elif self.options.progressive_items:
return progressive_table[name]
return name
def create_item(self, name: str) -> Item:
item = lookup_name_to_item[name]