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_dataclass = RaftOptions
options: RaftOptions options: RaftOptions
extraItemNamePool: list[str] | None = None
required_client_version = (0, 3, 4) required_client_version = (0, 3, 4)
def create_items(self): def create_items(self):
@@ -52,52 +54,52 @@ class RaftWorld(World):
pool = [] pool = []
frequencyItems = [] frequencyItems = []
for item in item_table: 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"]: if isFillingFrequencies and "Frequency" in item["name"]:
frequencyItems.append(raft_item) frequencyItems.append(raft_item)
else: else:
pool.append(raft_item) pool.append(raft_item)
extraItemNamePool = [] self.extraItemNamePool = []
extras = len(location_table) - len(item_table) - 1 # Victory takes up 1 unaccounted-for slot 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))
if self.options.filler_item_types != self.options.filler_item_types.option_resource_packs: # Use duplicate items if (self.options.filler_item_types != self.options.filler_item_types.option_duplicates): # Use resource packs
dupeItemPool = item_table.copy() for packItem in resourcePackItems:
# Remove frequencies if necessary for i in range(minimumResourcePackAmount, maximumResourcePackAmount + 1):
if self.options.island_frequency_locations != self.options.island_frequency_locations.option_anywhere: # Not completely random locations self.extraItemNamePool.append(createResourcePackName(i, packItem))
# If we let frequencies stay in with progressive-frequencies, the progressive-frequency item
# will be included 7 times. This is a massive flood of progressive-frequency items, so we if self.options.filler_item_types != self.options.filler_item_types.option_resource_packs: # Use duplicate items
# instead add progressive-frequency as its own item a smaller amount of times to prevent dupeItemPool = item_table.copy()
# flooding the duplicate item pool with them. # Remove frequencies if necessary
if self.options.island_frequency_locations == self.options.island_frequency_locations.option_progressive: if self.options.island_frequency_locations != self.options.island_frequency_locations.option_anywhere: # Not completely random locations
for _ in range(2): # If we let frequencies stay in with progressive-frequencies, the progressive-frequency item
# Progressives are not in item_pool, need to create faux item for duplicate item pool # will be included 7 times. This is a massive flood of progressive-frequency items, so we
# This can still be filtered out later by duplicate_items setting # instead add progressive-frequency as its own item a smaller amount of times to prevent
dupeItemPool.append({ "name": "progressive-frequency", "progression": True }) # Progressive frequencies need to be included # flooding the duplicate item pool with them.
# Always remove non-progressive Frequency items if self.options.island_frequency_locations == self.options.island_frequency_locations.option_progressive:
dupeItemPool = (itm for itm in dupeItemPool if "Frequency" not in itm["name"]) for _ in range(2):
# Progressives are not in item_pool, need to create faux item for duplicate item pool
# Remove progression or non-progression items if necessary # This can still be filtered out later by duplicate_items setting
if (self.options.duplicate_items == self.options.duplicate_items.option_progression): # Progression only dupeItemPool.append({ "name": "progressive-frequency", "progression": True }) # Progressive frequencies need to be included
dupeItemPool = (itm for itm in dupeItemPool if itm["progression"] == True) # Always remove non-progressive Frequency items
elif (self.options.duplicate_items == self.options.duplicate_items.option_non_progression): # Non-progression only dupeItemPool = (itm for itm in dupeItemPool if "Frequency" not in itm["name"])
dupeItemPool = (itm for itm in dupeItemPool if itm["progression"] == False)
# Remove progression or non-progression items if necessary
dupeItemPool = list(dupeItemPool) if (self.options.duplicate_items == self.options.duplicate_items.option_progression): # Progression only
# Finally, add items as necessary dupeItemPool = (itm for itm in dupeItemPool if itm["progression"] == True)
if len(dupeItemPool) > 0: elif (self.options.duplicate_items == self.options.duplicate_items.option_non_progression): # Non-progression only
for item in dupeItemPool: dupeItemPool = (itm for itm in dupeItemPool if itm["progression"] == False)
extraItemNamePool.append(item["name"])
dupeItemPool = list(dupeItemPool)
# Finally, add items as necessary
for item in dupeItemPool:
self.extraItemNamePool.append(self.replace_item_name_as_necessary(item))
if (len(extraItemNamePool) > 0): assert self.extraItemNamePool, f"Don't know what extra items to create for {self.player_name}."
for randomItem in self.random.choices(extraItemNamePool, k=extras):
raft_item = self.create_item_replaceAsNecessary(randomItem) for randomItem in self.random.choices(self.extraItemNamePool, k=extras):
pool.append(raft_item) raft_item = self.create_item(randomItem)
pool.append(raft_item)
self.multiworld.itempool += pool self.multiworld.itempool += pool
@@ -108,19 +110,35 @@ class RaftWorld(World):
if frequencyItems: if frequencyItems:
self.place_frequencyItems(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): def set_rules(self):
set_rules(self.multiworld, self.player) set_rules(self.multiworld, self.player)
def create_regions(self): def create_regions(self):
create_regions(self.multiworld, self.player) create_regions(self.multiworld, self.player)
def create_item_replaceAsNecessary(self, name: str) -> Item: def replace_item_name_as_necessary(self, name: str) -> str:
isFrequency = "Frequency" in name if name not in progressive_table:
shouldUseProgressive = bool((isFrequency and self.options.island_frequency_locations == self.options.island_frequency_locations.option_progressive) return name
or (not isFrequency and self.options.progressive_items)) if "Frequency" in name:
if shouldUseProgressive and name in progressive_table: if self.options.island_frequency_locations == self.options.island_frequency_locations.option_progressive:
name = progressive_table[name] return progressive_table[name]
return self.create_item(name) elif self.options.progressive_items:
return progressive_table[name]
return name
def create_item(self, name: str) -> Item: def create_item(self, name: str) -> Item:
item = lookup_name_to_item[name] item = lookup_name_to_item[name]