From e3a81c1bed2f1b9ebed64d6347c0105ae28cb413 Mon Sep 17 00:00:00 2001 From: espeon65536 Date: Sat, 31 Jul 2021 02:41:58 -0500 Subject: [PATCH] Minecraft: randomly determine junk items filling the itempool --- worlds/minecraft/Items.py | 38 ++++++++++++++++++++++++++++++++++++ worlds/minecraft/__init__.py | 26 ++++++++++++------------ 2 files changed, 52 insertions(+), 12 deletions(-) diff --git a/worlds/minecraft/Items.py b/worlds/minecraft/Items.py index 22cb0cc1..e2f91037 100644 --- a/worlds/minecraft/Items.py +++ b/worlds/minecraft/Items.py @@ -60,6 +60,44 @@ item_table = { "Victory": ItemData(None, True) } +required_items = { + "Archery": 1, + "Ingot Crafting": 1, + "Resource Blocks": 1, + "Brewing": 1, + "Enchanting": 1, + "Bucket": 1, + "Flint and Steel": 1, + "Bed": 1, + "Bottles": 1, + "Shield": 1, + "Fishing Rod": 1, + "Campfire": 1, + "Progressive Weapons": 3, + "Progressive Tools": 3, + "Progressive Armor": 2, + "8 Netherite Scrap": 2, + "Channeling Book": 1, + "Silk Touch Book": 1, + "Sharpness III Book": 1, + "Piercing IV Book": 1, + "Looting III Book": 1, + "Infinity Book": 1, + "3 Ender Pearls": 4, + "Saddle": 1, +} + +junk_weights = { + "4 Emeralds": 2, + "4 Diamond Ore": 1, + "16 Iron Ore": 1, + "50 XP": 4, + "16 Porkchops": 2, + "8 Gold Ore": 1, + "Rotten Flesh": 1, + "32 Arrows": 1, +} + # If not listed here then has frequency 1 item_frequencies = { "Progressive Weapons": 3, diff --git a/worlds/minecraft/__init__.py b/worlds/minecraft/__init__.py index decab364..2922a6d2 100644 --- a/worlds/minecraft/__init__.py +++ b/worlds/minecraft/__init__.py @@ -1,7 +1,7 @@ import os -from .Items import MinecraftItem, item_table, item_frequencies +from .Items import MinecraftItem, item_table, required_items, junk_weights from .Locations import MinecraftAdvancement, advancement_table, exclusion_table, events_table from .Regions import mc_regions, link_minecraft_structures, default_connections from .Rules import set_rules @@ -40,19 +40,21 @@ class MinecraftWorld(World): # Generate item pool itempool = [] - pool_counts = item_frequencies.copy() - # Replace Rotten Flesh with bee traps - if self.world.bee_traps[self.player]: - pool_counts.update({"Rotten Flesh": 0, "Bee Trap (Minecraft)": 4}) - # Add structure compasses to the pool, replacing 50 XP + # Add all required progression items + for (name, num) in required_items.items(): + itempool += [name] * num + # Add structure compasses if desired if self.world.structure_compasses[self.player]: structures = [connection[1] for connection in default_connections] for struct_name in structures: - pool_counts[f"Structure Compass ({struct_name})"] = 1 - pool_counts["50 XP"] -= 1 - for item_name in item_table: - for count in range(pool_counts.get(item_name, 1)): - itempool.append(self.create_item(item_name)) + itempool.append(f"Structure Compass ({struct_name})") + # Add bee traps if desired + if self.world.bee_traps[self.player]: + itempool += ["Bee Trap (Minecraft)"] * 4 + # Fill remaining items with randomly generated junk + itempool += self.world.random.choices(list(junk_weights.keys()), weights=list(junk_weights.values()), k=len(self.location_names)-len(itempool)) + # Convert itempool into real items + itempool = [item for item in map(lambda name: self.create_item(name), itempool)] # Choose locations to automatically exclude based on settings exclusion_pool = set() @@ -65,7 +67,7 @@ class MinecraftWorld(World): # Prefill the Ender Dragon with the completion condition completion = self.create_item("Victory") self.world.get_location("Ender Dragon", self.player).place_locked_item(completion) - itempool.remove(completion) + self.world.itempool += itempool def set_rules(self):