mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 20:21:32 -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,19 +54,19 @@ 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
|
if (self.options.filler_item_types != self.options.filler_item_types.option_duplicates): # Use resource packs
|
||||||
for packItem in resourcePackItems:
|
for packItem in resourcePackItems:
|
||||||
for i in range(minimumResourcePackAmount, maximumResourcePackAmount + 1):
|
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
|
if self.options.filler_item_types != self.options.filler_item_types.option_resource_packs: # Use duplicate items
|
||||||
dupeItemPool = item_table.copy()
|
dupeItemPool = item_table.copy()
|
||||||
@@ -90,13 +92,13 @@ class RaftWorld(World):
|
|||||||
|
|
||||||
dupeItemPool = list(dupeItemPool)
|
dupeItemPool = list(dupeItemPool)
|
||||||
# Finally, add items as necessary
|
# Finally, add items as necessary
|
||||||
if len(dupeItemPool) > 0:
|
|
||||||
for item in dupeItemPool:
|
for item in dupeItemPool:
|
||||||
extraItemNamePool.append(item["name"])
|
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):
|
||||||
|
raft_item = self.create_item(randomItem)
|
||||||
pool.append(raft_item)
|
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