reimplement easy item pool

Some changes were made. The design chosen is to keep the changes to the same range of changes that hard and expert apply (so no change in lamp count, for example), while trying to keep easy as similar as it was.
This commit is contained in:
Fabian Dill 2020-08-01 06:22:59 +02:00
parent 3743f44bd6
commit 86025745ac
3 changed files with 55 additions and 14 deletions

View File

@ -300,10 +300,11 @@ def distribute_items_restrictive(world, gftower_trash=False, fill_locations=None
fast_fill(world, prioitempool, fill_locations) fast_fill(world, prioitempool, fill_locations)
fast_fill(world, restitempool, fill_locations) fast_fill(world, restitempool, fill_locations)
unplaced = [item.name for item in progitempool + prioitempool + restitempool]
unfilled = [location.name for location in fill_locations]
logging.getLogger('').debug('Unplaced items: %s - Unfilled Locations: %s', if unplaced or unfilled:
[item.name for item in progitempool + prioitempool + restitempool], logging.warning('Unplaced items: %s - Unfilled Locations: %s', unplaced, unfilled)
[location.name for location in fill_locations])
def fast_fill(world, item_pool, fill_locations): def fast_fill(world, item_pool, fill_locations):

View File

@ -8,17 +8,28 @@ from EntranceShuffle import connect_entrance
from Fill import FillError, fill_restrictive from Fill import FillError, fill_restrictive
from Items import ItemFactory from Items import ItemFactory
# This file sets the item pools for various modes. Timed modes and triforce hunt are enforced first, and then extra items are specified per mode to fill in the remaining space.
# Some basic items that various modes require are placed here, including pendants and crystals. Medallion requirements for the two relevant entrances are also decided.
#This file sets the item pools for various modes. Timed modes and triforce hunt are enforced first, and then extra items are specified per mode to fill in the remaining space. alwaysitems = ['Bombos', 'Book of Mudora', 'Cane of Somaria', 'Ether', 'Fire Rod', 'Flippers', 'Flute', 'Hammer',
#Some basic items that various modes require are placed here, including pendants and crystals. Medallion requirements for the two relevant entrances are also decided. 'Hookshot', 'Ice Rod', 'Lamp',
'Cape', 'Magic Powder', 'Mushroom', 'Pegasus Boots', 'Quake', 'Shovel', 'Bug Catching Net',
alwaysitems = ['Bombos', 'Book of Mudora', 'Cane of Somaria', 'Ether', 'Fire Rod', 'Flippers', 'Flute', 'Hammer', 'Hookshot', 'Ice Rod', 'Lamp', 'Cane of Byrna', 'Blue Boomerang', 'Red Boomerang']
'Cape', 'Magic Powder', 'Mushroom', 'Pegasus Boots', 'Quake', 'Shovel', 'Bug Catching Net', 'Cane of Byrna', 'Blue Boomerang', 'Red Boomerang']
progressivegloves = ['Progressive Glove'] * 2 progressivegloves = ['Progressive Glove'] * 2
basicgloves = ['Power Glove', 'Titans Mitts'] basicgloves = ['Power Glove', 'Titans Mitts']
normalbottles = ['Bottle', 'Bottle (Red Potion)', 'Bottle (Green Potion)', 'Bottle (Blue Potion)', 'Bottle (Fairy)', 'Bottle (Bee)', 'Bottle (Good Bee)'] normalbottles = ['Bottle', 'Bottle (Red Potion)', 'Bottle (Green Potion)', 'Bottle (Blue Potion)', 'Bottle (Fairy)',
hardbottles = ['Bottle', 'Bottle (Red Potion)', 'Bottle (Green Potion)', 'Bottle (Blue Potion)', 'Bottle (Bee)', 'Bottle (Good Bee)'] 'Bottle (Bee)', 'Bottle (Good Bee)']
hardbottles = ['Bottle', 'Bottle (Red Potion)', 'Bottle (Green Potion)', 'Bottle (Blue Potion)', 'Bottle (Bee)',
'Bottle (Good Bee)']
easybaseitems = (['Sanctuary Heart Container'] + ['Rupees (300)'] * 4 + ['Magic Upgrade (1/2)'] * 2 +
['Boss Heart Container'] * 10 + ['Piece of Heart'] * 12)
easyextra = ['Piece of Heart'] * 12 + ['Rupees (300)']
easyfirst15extra = ['Rupees (100)'] + ['Arrows (10)'] * 7 + ['Bombs (3)'] * 7
easysecond10extra = ['Bombs (3)'] * 7 + ['Rupee (1)', 'Rupees (50)', 'Bombs (10)']
easythird5extra = ['Rupees (50)'] * 2 + ['Bombs (3)'] * 2 + ['Arrows (10)']
easyfinal25extra = ['Rupees (50)'] * 4 + ['Rupees (20)'] * 14 + ['Rupee (1)'] + ['Arrows (10)'] * 4 + ['Rupees (5)'] * 2
normalbaseitems = (['Magic Upgrade (1/2)', 'Single Arrow', 'Sanctuary Heart Container', 'Arrows (10)', 'Bombs (10)'] + normalbaseitems = (['Magic Upgrade (1/2)', 'Single Arrow', 'Sanctuary Heart Container', 'Arrows (10)', 'Bombs (10)'] +
['Rupees (300)'] * 4 + ['Boss Heart Container'] * 10 + ['Piece of Heart'] * 24) ['Rupees (300)'] * 4 + ['Boss Heart Container'] * 10 + ['Piece of Heart'] * 24)
@ -40,8 +51,36 @@ Difficulty = namedtuple('Difficulty',
total_items_to_place = 153 total_items_to_place = 153
difficulties = { difficulties = {
'easy': Difficulty(
baseitems=easybaseitems,
bottles=normalbottles,
bottle_count=8,
same_bottle=False,
progressiveshield=['Progressive Shield'] * 6,
basicshield=['Blue Shield', 'Red Shield', 'Mirror Shield'] * 2,
progressivearmor=['Progressive Armor'] * 4,
basicarmor=['Blue Mail', 'Red Mail'] * 2,
swordless=['Rupees (20)'] * 8,
progressivesword=['Progressive Sword'] * 8,
basicsword=['Master Sword', 'Tempered Sword', 'Golden Sword', 'Fighter Sword'] * 2,
progressivebow=["Progressive Bow"] * 2,
basicbow=['Bow', 'Silver Bow'] * 2,
timedohko=['Green Clock'] * 25,
timedother=['Green Clock'] * 20 + ['Blue Clock'] * 10 + ['Red Clock'] * 5,
# +5 more Red Clocks if there is room
triforcehunt=['Triforce Piece'] * 30,
retro=['Small Key (Universal)'] * 27,
extras=[easyextra, easyfirst15extra, easysecond10extra, easythird5extra, easyfinal25extra],
progressive_sword_limit=8,
progressive_shield_limit=6,
progressive_armor_limit=2,
progressive_bow_limit=4,
progressive_bottle_limit=8,
boss_heart_container_limit=10,
heart_piece_limit=24,
),
'normal': Difficulty( 'normal': Difficulty(
baseitems = normalbaseitems, baseitems=normalbaseitems,
bottles=normalbottles, bottles=normalbottles,
bottle_count=4, bottle_count=4,
same_bottle=False, same_bottle=False,
@ -125,9 +164,10 @@ difficulties = {
} }
def generate_itempool(world, player): def generate_itempool(world, player):
if world.difficulty[player] not in ['normal', 'hard', 'expert']: if world.difficulty[player] not in difficulties:
raise NotImplementedError(f"Diffulty {world.difficulty[player]}") raise NotImplementedError(f"Diffulty {world.difficulty[player]}")
if world.goal[player] not in {'ganon', 'pedestal', 'dungeons', 'triforcehunt', 'localtriforcehunt', 'ganontriforcehunt', 'localganontriforcehunt', 'crystals'}: if world.goal[player] not in {'ganon', 'pedestal', 'dungeons', 'triforcehunt', 'localtriforcehunt',
'ganontriforcehunt', 'localganontriforcehunt', 'crystals'}:
raise NotImplementedError(f"Goal {world.goal[player]}") raise NotImplementedError(f"Goal {world.goal[player]}")
if world.mode[player] not in {'open', 'standard', 'inverted'}: if world.mode[player] not in {'open', 'standard', 'inverted'}:
raise NotImplementedError(f"Mode {world.mode[player]}") raise NotImplementedError(f"Mode {world.mode[player]}")

View File

@ -24,7 +24,6 @@ glitches_required: # Determine the logic required to complete the seed
minor_glitches: 0 # puts fake flipper and super bunny shenanigans into logic minor_glitches: 0 # puts fake flipper and super bunny shenanigans into logic
overworld_glitches: 0 # Assumes the player knows how to perform overworld glitches like fake flipper, water walk, etc overworld_glitches: 0 # Assumes the player knows how to perform overworld glitches like fake flipper, water walk, etc
no_logic: 0 # Items are places completely at random and with no regard for logic. Your fire rod could be on Trinexx no_logic: 0 # Items are places completely at random and with no regard for logic. Your fire rod could be on Trinexx
item_placement: basic # This is based on Entrance Randomizer, which does not (yet?) support advanced
meta_ignore: # Nullify options specified in the meta.yaml file. Adding an option here guarantees it will not occur in your seed, even if the .yaml file specifies it meta_ignore: # Nullify options specified in the meta.yaml file. Adding an option here guarantees it will not occur in your seed, even if the .yaml file specifies it
world_state: world_state:
- inverted # Never play inverted seeds - inverted # Never play inverted seeds
@ -134,6 +133,7 @@ weapons: # Specifically, swords
vanilla: 0 # Swords are placed in vanilla locations in your own game (Uncle, Pyramid Fairy, Smiths, Pedestal) vanilla: 0 # Swords are placed in vanilla locations in your own game (Uncle, Pyramid Fairy, Smiths, Pedestal)
swordless: 0 # Your swords are replaced by rupees. Gameplay changes have been made to accommodate this change. swordless: 0 # Your swords are replaced by rupees. Gameplay changes have been made to accommodate this change.
item_pool: item_pool:
easy: 0 # doubled upgrades, progressives etc.
normal: 1 # Item availability remains unchanged from the vanilla game normal: 1 # Item availability remains unchanged from the vanilla game
hard: 0 # Reduced upgrade availability (max: 14 hearts, green mail, tempered sword, fire shield, no silvers unless swordless) hard: 0 # Reduced upgrade availability (max: 14 hearts, green mail, tempered sword, fire shield, no silvers unless swordless)
expert: 0 # Minimum upgrade availability (max: 8 hearts, green mail, master sword, fighter shield, no silvers unless swordless) expert: 0 # Minimum upgrade availability (max: 8 hearts, green mail, master sword, fighter shield, no silvers unless swordless)