Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Minecraft updates #13

Merged
merged 77 commits into from
May 15, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
c59267e
Minecraft locations, items, and generation without logic
Apr 12, 2021
ef2a067
added id lookup for minecraft
Apr 12, 2021
96cf422
typing import fix in minecraft/Items.py
Apr 12, 2021
6b21400
fix 2
Apr 12, 2021
1fe67c1
implementing Minecraft options and hard/postgame advancement exclusion
Apr 13, 2021
e209053
first logic pass (75/80)
Apr 13, 2021
5830182
logic pass 2 and proper completion conditions
Apr 13, 2021
2e149c4
added insane difficulty pool, modified method of excluding item pools…
Apr 13, 2021
8879c27
bump network_data_package version
Apr 13, 2021
959ec03
minecraft testing framework
espeon65536 Apr 13, 2021
f0bdc3e
switch Ancient Debris to Netherite Scrap to avoid advancement trigger…
espeon65536 Apr 13, 2021
332c6ea
Testing now functions, split tests up by advancement pane, added some…
espeon65536 Apr 14, 2021
1f7092e
Newer testing framework: every advancement gets its own function, for…
espeon65536 Apr 14, 2021
36171dc
fixed logic for The End... Again...
espeon65536 Apr 14, 2021
08c6a6d
changed option names to "include_hard_advancements" etc.
espeon65536 Apr 14, 2021
576f5e0
village/pillager-related advancements now require can_adventure: weap…
espeon65536 Apr 14, 2021
2799493
a few minecraft tests
espeon65536 Apr 14, 2021
7b702a4
rename "Flint & Steel" to "Flint and Steel" for parity with in-game name
espeon65536 Apr 14, 2021
6bcd7f2
Merge branch 'main' of https://github.com/ArchipelagoMW/Archipelago i…
espeon65536 Apr 15, 2021
e9ab15b
additional MC tests
espeon65536 Apr 15, 2021
e4fcb34
more tests, mostly nether-related tests
espeon65536 Apr 15, 2021
303ecc3
more tests, removed anvil path for Two Birds One Arrow
espeon65536 Apr 17, 2021
de97a5f
Merge branch 'main' of https://github.com/ArchipelagoMW/Archipelago i…
espeon65536 Apr 17, 2021
d351564
include Minecraft slot data, and a world seed for each Minecraft play…
espeon65536 Apr 17, 2021
51e407a
Added new items: ender pearls, lapis, porkchops
espeon65536 Apr 18, 2021
b8b63d4
All remaining Minecraft tests
espeon65536 Apr 18, 2021
c55f810
formatting of Minecraft tests and logic for better readability
espeon65536 Apr 18, 2021
d440b03
require Wither kill for Monsters Hunted
espeon65536 Apr 18, 2021
f1da6e6
properly removed 8 Emeralds item from item pool
espeon65536 Apr 18, 2021
d77eb51
enchanting required for wither; fishing rod required for water breath…
espeon65536 Apr 19, 2021
60bd580
Added 12 new advancements (ported from old achievement system)
espeon65536 Apr 19, 2021
c23053a
renamed "On a Rail" for consistency with modern advancements
espeon65536 Apr 19, 2021
4c6c996
tests for the new advancements
espeon65536 Apr 19, 2021
979cbc3
moved slot_data generation for minecraft into worlds/minecraft/__init…
espeon65536 Apr 20, 2021
ac05fe0
output minecraft options in the spoiler log
espeon65536 Apr 20, 2021
3f21d5e
modified advancement goal values for new advancements
espeon65536 Apr 23, 2021
939a887
make non-native Minecraft items appear as Shovel in ALttP, and unknow…
espeon65536 Apr 24, 2021
d9b86ec
fixed glowstone block logic for Not Quite Nine Lives
espeon65536 Apr 25, 2021
9d9706e
setup for shuffling MC structures: building ER world and shuffling re…
espeon65536 Apr 25, 2021
22395b7
ensured Nether Fortresses can't be placed in the End
espeon65536 Apr 25, 2021
6cdae20
finished logic for structure randomization
espeon65536 Apr 25, 2021
7964ac5
fixed nonnative items always showing up as Hammers in ALttP shops
espeon65536 Apr 25, 2021
9288245
output minecraft structure info in the spoiler
espeon65536 Apr 25, 2021
d7a8c99
generate .apmc file for communication with MC client
espeon65536 Apr 26, 2021
e6a7797
fixed structure rando always using the same seed
espeon65536 Apr 26, 2021
c65fe90
move stuff to worlds/minecraft/Regions.py
espeon65536 Apr 26, 2021
b5fb0dc
make output apmc file have consistent name with other files
espeon65536 Apr 26, 2021
d4dc71e
added minecraft bottle macro; fixed tests imports
espeon65536 Apr 26, 2021
d601e23
generalizing MC region generation
espeon65536 Apr 28, 2021
984c66c
restructured structure shuffling in preparation for structure plando
espeon65536 Apr 29, 2021
7df81bc
only output structure rando info in spoiler if they are shuffled
espeon65536 Apr 29, 2021
857d7ec
Force structure rando to always be off, for the stable release
espeon65536 Apr 29, 2021
6406460
added Minecraft options to player settings
espeon65536 Apr 29, 2021
a6aaabd
formally added combat_difficulty as an option
espeon65536 Apr 29, 2021
734cd80
Added Ender Dragon into playthrough, cleaned up goal map
espeon65536 Apr 29, 2021
fcc67cb
Added new difficulties: Easy, Normal, Hard combat
espeon65536 Apr 29, 2021
3808357
moved .apmc generation time to prevent outputs on failed generation
espeon65536 Apr 29, 2021
4df7edf
updated tests for new combat logic
espeon65536 Apr 29, 2021
64610b9
Merge branch 'main' of https://github.com/ArchipelagoMW/Archipelago i…
espeon65536 Apr 29, 2021
5ed09ac
Fixed bug causing generation to fail; removed Nether Fortress event s…
espeon65536 Apr 29, 2021
0250133
moved all MC-specific functions into gen_minecraft
espeon65536 Apr 30, 2021
436ae77
renamed "logic_version" to "client_version"
espeon65536 Apr 30, 2021
79ca072
bug fixes
espeon65536 May 1, 2021
e488eb2
moved link_minecraft_regions into minecraft init, left create_regions…
espeon65536 May 1, 2021
d7f9146
Merge branch 'main' of https://github.com/ArchipelagoMW/Archipelago i…
espeon65536 May 2, 2021
62233f3
added seed_name, player_name, client_version to apmc file
espeon65536 May 4, 2021
beca1fc
reenabled structure shuffle
espeon65536 May 4, 2021
4b8425b
Merge branch 'main' of https://github.com/ArchipelagoMW/Archipelago i…
espeon65536 May 5, 2021
d955a27
added entrance tests for minecraft
espeon65536 May 5, 2021
8871a2a
Merge branch 'main' of https://github.com/ArchipelagoMW/Archipelago i…
espeon65536 May 10, 2021
2501774
Minecraft logic updates
espeon65536 May 13, 2021
ce0ac4d
embed all apmc info into slot_data
espeon65536 May 13, 2021
391a917
updated MC tests for logic changes
espeon65536 May 13, 2021
182c736
Merge branch 'main' of https://github.com/ArchipelagoMW/Archipelago i…
espeon65536 May 14, 2021
80251be
put apmc into zipfile
espeon65536 May 14, 2021
6c590c7
Merge branch 'main' of https://github.com/ArchipelagoMW/Archipelago i…
espeon65536 May 15, 2021
d5bfd6d
Merge branch 'main' of https://github.com/ArchipelagoMW/Archipelago i…
espeon65536 May 15, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions BaseClasses.py
Original file line number Diff line number Diff line change
Expand Up @@ -880,13 +880,12 @@ def complete_raid(self, player: int):
self.has('Progressive Armor', player) and self.has('Shield', player)

def can_kill_wither(self, player: int):
build_wither = self.fortress_loot(player) and (self.can_reach('The Nether', 'Region', player) or self.can_piglin_trade(player))
normal_kill = self.has("Progressive Weapons", player, 3) and self.has("Progressive Armor", player, 2) and self.can_brew_potions(player) and self.can_enchant(player)
if self.combat_difficulty(player) == 'easy':
return build_wither and normal_kill and self.has('Archery', player)
return self.fortress_loot(player) and normal_kill and self.has('Archery', player)
elif self.combat_difficulty(player) == 'hard': # cheese kill using bedrock ceilings
return build_wither and (normal_kill or self.can_reach('The Nether', 'Region', player) or self.can_reach('The End', 'Region', player))
return build_wither and normal_kill
return self.fortress_loot(player) and (normal_kill or self.can_reach('The Nether', 'Region', player) or self.can_reach('The End', 'Region', player))
return self.fortress_loot(player) and normal_kill

def can_kill_ender_dragon(self, player: int):
if self.combat_difficulty(player) == 'easy':
Expand Down
12 changes: 11 additions & 1 deletion MultiMystery.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ def feedback(text: str):
create_spoiler = multi_mystery_options["create_spoiler"]
zip_roms = multi_mystery_options["zip_roms"]
zip_diffs = multi_mystery_options["zip_diffs"]
zip_apmcs = multi_mystery_options["zip_apmcs"]
zip_spoiler = multi_mystery_options["zip_spoiler"]
zip_multidata = multi_mystery_options["zip_multidata"]
zip_format = multi_mystery_options["zip_format"]
Expand Down Expand Up @@ -132,7 +133,7 @@ def feedback(text: str):
asyncio.run(MultiClient.run_game(os.path.join(output_path, file)))
break

if any((zip_roms, zip_multidata, zip_spoiler, zip_diffs)):
if any((zip_roms, zip_multidata, zip_spoiler, zip_diffs, zip_apmcs)):
import zipfile

compression = {1: zipfile.ZIP_DEFLATED,
Expand Down Expand Up @@ -177,6 +178,13 @@ def _handle_diff_file(file: str):
remove_zipped_file(file)


def _handle_apmc_file(file: str):
if zip_apmcs:
pack_file(file)
if zip_apmcs == 2:
remove_zipped_file(file)


with concurrent.futures.ThreadPoolExecutor() as pool:
futures = []
with zipfile.ZipFile(zipname, "w", compression=compression, compresslevel=9) as zf:
Expand All @@ -186,6 +194,8 @@ def _handle_diff_file(file: str):
futures.append(pool.submit(_handle_sfc_file, file))
elif file.endswith(".apbp"):
futures.append(pool.submit(_handle_diff_file, file))
elif file.endswith(".apmc"):
futures.append(pool.submit(_handle_apmc_file, file))

if zip_multidata and os.path.exists(os.path.join(output_path, multidataname)):
pack_file(multidataname)
Expand Down
5 changes: 5 additions & 0 deletions host.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,11 @@ multi_mystery_options:
# -1 -> Create them without zipping
# 2 -> Delete the non-zipped one.
zip_diffs: 2
# Zip apmc files for Minecraft
# 0 -> Don't zip
# 1 -> Create a zip
# 2 -> Create a zip and delete apmc files inside of it
zip_apmcs: 1
# Zip spoiler log
# 1 -> Include the spoiler log in the zip
# 2 -> Delete the non-zipped one
Expand Down
27 changes: 16 additions & 11 deletions test/minecraft/TestAdvancements.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,15 +89,19 @@ def test_42006(self):
["A Furious Cocktail", False, [], ['Brewing']],
["A Furious Cocktail", False, [], ['Bottles']],
["A Furious Cocktail", False, [], ['Fishing Rod']],
["A Furious Cocktail", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']],
["A Furious Cocktail", True, ['Ingot Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket',
'Progressive Weapons', 'Progressive Armor', 'Brewing', 'Bottles', 'Fishing Rod']],
["A Furious Cocktail", False, ['Progressive Tools', 'Progressive Tools'], ['Progressive Tools']],
["A Furious Cocktail", True, ['Ingot Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools',
'Progressive Weapons', 'Progressive Armor', 'Brewing', 'Bottles', 'Fishing Rod']],
["A Furious Cocktail", True, ['Ingot Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket',
'Progressive Weapons', 'Shield', 'Brewing', 'Bottles', 'Fishing Rod']],
["A Furious Cocktail", True, ['Ingot Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools',
'Progressive Weapons', 'Shield', 'Brewing', 'Bottles', 'Fishing Rod']],
'Progressive Weapons', 'Progressive Weapons', 'Progressive Weapons',
'Progressive Armor', 'Progressive Armor',
'Enchanting', 'Brewing', 'Bottles', 'Resource Blocks', 'Fishing Rod']],
# ["A Furious Cocktail", True, ['Ingot Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket',
# 'Progressive Weapons', 'Progressive Armor', 'Brewing', 'Bottles', 'Fishing Rod']],
# ["A Furious Cocktail", True, ['Ingot Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools',
# 'Progressive Weapons', 'Progressive Armor', 'Brewing', 'Bottles', 'Fishing Rod']],
# ["A Furious Cocktail", True, ['Ingot Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket',
# 'Progressive Weapons', 'Shield', 'Brewing', 'Bottles', 'Fishing Rod']],
# ["A Furious Cocktail", True, ['Ingot Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools',
# 'Progressive Weapons', 'Shield', 'Brewing', 'Bottles', 'Fishing Rod']],
])

def test_42007(self):
Expand Down Expand Up @@ -934,7 +938,8 @@ def test_42069(self):
["Uneasy Alliance", False, [], ['Ingot Crafting']],
["Uneasy Alliance", False, [], ['Flint and Steel']],
["Uneasy Alliance", False, [], ['Progressive Tools', 'Progressive Tools'], ['Progressive Tools']],
["Uneasy Alliance", True, ['Progressive Tools', 'Progressive Tools', 'Progressive Tools', 'Flint and Steel', 'Ingot Crafting']],
["Uneasy Alliance", False, [], ['Fishing Rod']],
["Uneasy Alliance", True, ['Progressive Tools', 'Progressive Tools', 'Progressive Tools', 'Flint and Steel', 'Ingot Crafting', 'Fishing Rod']],
])

def test_42070(self):
Expand Down Expand Up @@ -1076,8 +1081,8 @@ def test_42085(self):
self.run_location_tests([
["On a Rail", False, []],
["On a Rail", False, [], ['Ingot Crafting']],
["On a Rail", False, [], ['Progressive Tools']],
["On a Rail", True, ['Ingot Crafting', 'Progressive Tools']],
["On a Rail", False, ['Progressive Tools'], ['Progressive Tools', 'Progressive Tools']],
["On a Rail", True, ['Ingot Crafting', 'Progressive Tools', 'Progressive Tools']],
])

def test_42086(self):
Expand Down
12 changes: 8 additions & 4 deletions worlds/minecraft/Rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,11 @@ def reachable_locations(state):
set_rule(world.get_location("Very Very Frightening", player), lambda state: state.has("Channeling Book", player) and state.can_use_anvil(player) and state.can_enchant(player))
set_rule(world.get_location("Hot Stuff", player), lambda state: state.has("Bucket", player) and state.has_iron_ingots(player))
set_rule(world.get_location("Free the End", player), lambda state: can_complete(state))
set_rule(world.get_location("A Furious Cocktail", player), lambda state: state.can_brew_potions(player) and state.has("Fishing Rod", player) and state.can_reach('The Nether', 'Region', player))
set_rule(world.get_location("A Furious Cocktail", player), lambda state: state.can_brew_potions(player) and
state.has("Fishing Rod", player) and # Water Breathing
state.can_reach('The Nether', 'Region', player) and # Regeneration, Fire Resistance, gold nuggets
state.can_reach('Village', 'Region', player) and # Night Vision, Invisibility
state.can_reach('Bring Home the Beacon', 'Location', player)) # Resistance
set_rule(world.get_location("Best Friends Forever", player), lambda state: True)
set_rule(world.get_location("Bring Home the Beacon", player), lambda state: state.can_kill_wither(player) and state.has_diamond_pickaxe(player) and
state.has("Ingot Crafting", player) and state.has("Resource Blocks", player))
Expand Down Expand Up @@ -116,7 +120,7 @@ def reachable_locations(state):
set_rule(world.get_location("Country Lode, Take Me Home", player), lambda state: state.can_reach("Hidden in the Depths", "Location", player) and state.has_gold_ingots(player))
set_rule(world.get_location("Bee Our Guest", player), lambda state: state.has("Campfire", player) and state.has_bottle_mc(player))
set_rule(world.get_location("What a Deal!", player), lambda state: True)
set_rule(world.get_location("Uneasy Alliance", player), lambda state: state.has_diamond_pickaxe(player))
set_rule(world.get_location("Uneasy Alliance", player), lambda state: state.has_diamond_pickaxe(player) and state.has('Fishing Rod', player))
set_rule(world.get_location("Diamonds!", player), lambda state: state.has("Progressive Tools", player, 2) and state.has_iron_ingots(player))
set_rule(world.get_location("A Terrible Fortress", player), lambda state: True) # since you don't have to fight anything
set_rule(world.get_location("A Throwaway Joke", player), lambda state: True) # kill drowned
Expand All @@ -134,10 +138,10 @@ def reachable_locations(state):
set_rule(world.get_location("Hot Topic", player), lambda state: state.has("Ingot Crafting", player))
set_rule(world.get_location("Bake Bread", player), lambda state: True)
set_rule(world.get_location("The Lie", player), lambda state: state.has_iron_ingots(player) and state.has("Bucket", player))
set_rule(world.get_location("On a Rail", player), lambda state: state.has_iron_ingots(player))
set_rule(world.get_location("On a Rail", player), lambda state: state.has_iron_ingots(player) and state.has('Progressive Tools', player, 2)) # powered rails
set_rule(world.get_location("Time to Strike!", player), lambda state: True)
set_rule(world.get_location("Cow Tipper", player), lambda state: True)
set_rule(world.get_location("When Pigs Fly", player), lambda state: state.fortress_loot(player) and state.has("Fishing Rod", player) and state.can_adventure(player)) # saddles in fortress chests
set_rule(world.get_location("Overkill", player), lambda state: state.can_brew_potions(player) and state.has("Progressive Weapons", player)) # strength 1, stone axe crit
set_rule(world.get_location("Overkill", player), lambda state: state.can_brew_potions(player) and (state.has("Progressive Weapons", player) or state.can_reach('The Nether', 'Region', player))) # strength 1 + stone axe crit OR strength 2 + wood axe crit
set_rule(world.get_location("Librarian", player), lambda state: state.has("Enchanting", player))
set_rule(world.get_location("Overpowered", player), lambda state: state.has("Resource Blocks", player) and state.has_gold_ingots(player))
15 changes: 8 additions & 7 deletions worlds/minecraft/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,9 @@

client_version = (0, 3)

def generate_mc_data(world: MultiWorld, player: int):
import base64, json
from Utils import output_path

def get_mc_data(world: MultiWorld, player: int):
exits = ["Overworld Structure 1", "Overworld Structure 2", "Nether Structure 1", "Nether Structure 2", "The End Structure"]
data = {
return {
'world_seed': Random(world.rom_seeds[player]).getrandbits(32), # consistent and doesn't interfere with other generation
'seed_name': world.seed_name,
'player_name': world.get_player_names(player),
Expand All @@ -23,16 +20,20 @@ def generate_mc_data(world: MultiWorld, player: int):
'structures': {exit: world.get_entrance(exit, player).connected_region.name for exit in exits}
}

def generate_mc_data(world: MultiWorld, player: int):
import base64, json
from Utils import output_path

data = get_mc_data(world, player)
filename = f"AP_{world.seed_name}_P{player}_{world.get_player_names(player)}.apmc"
with open(output_path(filename), 'wb') as f:
f.write(base64.b64encode(bytes(json.dumps(data), 'utf-8')))

def fill_minecraft_slot_data(world: MultiWorld, player: int):
slot_data = {}
slot_data = get_mc_data(world, player)
for option_name in minecraft_options:
option = getattr(world, option_name)[player]
slot_data[option_name] = int(option.value)
slot_data['client_version'] = client_version
return slot_data

# Generates the item pool given the table and frequencies in Items.py.
Expand Down