mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 12:11:33 -06:00
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:
@@ -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]
|
||||||
|
Reference in New Issue
Block a user