diff --git a/playerSettings.yaml b/playerSettings.yaml index c08a1cb8..24bf07f8 100644 --- a/playerSettings.yaml +++ b/playerSettings.yaml @@ -223,7 +223,17 @@ Factorio: min_expansion_cooldown: 14400 # 1 to 60 min in ticks max_expansion_cooldown: 216000 # 5 to 180 min in ticks Minecraft: - advancement_goal: 50 # Number of advancements required (out of 92 total) to spawn the Ender Dragon and complete the game. + advancement_goal: 50 # Number of advancements required (87 max) to spawn the Ender Dragon and complete the game. + egg_shards_required: # Number of dragon egg shards to collect (30 max) before the Ender Dragon will spawn. + 0: 1 + 5: 0 + 10: 0 + 20: 0 + egg_shards_available: # Number of egg shards available in the pool (30 max). + 0: 1 + 5: 0 + 10: 0 + 20: 0 combat_difficulty: # Modifies the level of items logically required for exploring dangerous areas and fighting bosses. easy: 0 normal: 1 diff --git a/worlds/minecraft/Items.py b/worlds/minecraft/Items.py index ebde8db8..63e10ea0 100644 --- a/worlds/minecraft/Items.py +++ b/worlds/minecraft/Items.py @@ -55,15 +55,16 @@ item_table = { "Structure Compass (Bastion Remnant)": ItemData(45040, True), "Structure Compass (End City)": ItemData(45041, True), "Shulker Box": ItemData(45042, False), + "Dragon Egg Shard": ItemData(45043, True), "Bee Trap (Minecraft)": ItemData(45100, False), "Victory": ItemData(None, True) } +# 33 required items required_items = { "Archery": 1, "Progressive Resource Crafting": 2, - # "Resource Blocks": 1, "Brewing": 1, "Enchanting": 1, "Bucket": 1, diff --git a/worlds/minecraft/Options.py b/worlds/minecraft/Options.py index aad2abb6..df1e53c9 100644 --- a/worlds/minecraft/Options.py +++ b/worlds/minecraft/Options.py @@ -20,6 +20,11 @@ class BeeTraps(Range): range_end = 100 +class EggShards(Range): + range_start = 0 + range_end = 30 + + minecraft_options: typing.Dict[str, type(Option)] = { "advancement_goal": AdvancementGoal, "combat_difficulty": CombatDifficulty, @@ -28,5 +33,7 @@ minecraft_options: typing.Dict[str, type(Option)] = { "include_postgame_advancements": Toggle, "shuffle_structures": Toggle, "structure_compasses": Toggle, - "bee_traps": BeeTraps + "bee_traps": BeeTraps, + "egg_shards_required": EggShards, + "egg_shards_available": EggShards } \ No newline at end of file diff --git a/worlds/minecraft/Rules.py b/worlds/minecraft/Rules.py index 034968c8..17584b31 100644 --- a/worlds/minecraft/Rules.py +++ b/worlds/minecraft/Rules.py @@ -117,8 +117,9 @@ def set_rules(world: MultiWorld, player: int): # 92 total advancements. Goal is to complete X advancements and then Free the End. # There are 5 advancements which cannot be included for dragon spawning (4 postgame, Free the End) # Hence the true maximum is (92 - 5) = 87 - goal = int(world.advancement_goal[player].value) - can_complete = lambda state: len(reachable_locations(state)) >= goal and state.can_reach('The End', 'Region', player) and state._mc_can_kill_ender_dragon(player) + goal = world.advancement_goal[player] + egg_shards = min(world.egg_shards_required[player], world.egg_shards_available[player]) + can_complete = lambda state: len(reachable_locations(state)) >= goal and state.has("Dragon Egg Shard", player, egg_shards) and state.can_reach('The End', 'Region', player) and state._mc_can_kill_ender_dragon(player) if world.logic[player] != 'nologic': world.completion_condition[player] = lambda state: state.has('Victory', player) diff --git a/worlds/minecraft/__init__.py b/worlds/minecraft/__init__.py index 05732bb2..5c293a66 100644 --- a/worlds/minecraft/__init__.py +++ b/worlds/minecraft/__init__.py @@ -29,12 +29,14 @@ class MinecraftWorld(World): exits = [connection[0] for connection in default_connections] return { 'world_seed': self.world.slot_seeds[self.player].getrandbits(32), - # consistent and doesn't interfere with other generation 'seed_name': self.world.seed_name, 'player_name': self.world.get_player_names(self.player), 'player_id': self.player, 'client_version': client_version, 'structures': {exit: self.world.get_entrance(exit, self.player).connected_region.name for exit in exits}, + 'advancement_goal': self.world.advancement_goal[self.player], + 'egg_shards_required': self.world.egg_shards_required[self.player], + 'egg_shards_available': self.world.egg_shards_available[self.player], 'race': self.world.is_race } @@ -51,6 +53,8 @@ class MinecraftWorld(World): structures = [connection[1] for connection in default_connections] for struct_name in structures: itempool.append(f"Structure Compass ({struct_name})") + # Add dragon egg shards + itempool += ["Dragon Egg Shard"] * self.world.egg_shards_available[self.player] # Add bee traps if desired bee_trap_quantity = ceil(self.world.bee_traps[self.player] * (len(self.location_names)-len(itempool)) * 0.01) itempool += ["Bee Trap (Minecraft)"] * bee_trap_quantity