Archipelago/worlds/oot/ItemPool.py

1414 lines
54 KiB
Python
Raw Normal View History

Ocarina of Time (#64) * first commit (not including OoT data files yet) * added some basic options * rule parser works now at least * make sure to commit everything this time * temporary change to BaseClasses for oot * overworld location graph builds mostly correctly * adding oot data files * commenting out world options until later since they only existed to make the RuleParser work * conversion functions between AP ids and OOT ids * world graph outputs * set scrub prices * itempool generates, entrances connected, way too many options added * fixed set_rules and set_shop_rules * temp baseclasses changes * Reaches the fill step now, old event-based system retained in case the new way breaks * Song placements and misc fixes everywhere * temporary changes to make oot work * changed root exits for AP fill framework * prevent infinite recursion due to OoT sharing usage of the address field * age reachability works hopefully, songs are broken again * working spoiler log generation on beatable-only * Logic tricks implemented * need this for logic tricks * fixed map/compass being placed on Serenade location * kill unreachable events before filling the world * add a bunch of utility functions to prepare for rom patching * move OptionList into generic options * fixed some silly bugs with OptionList * properly seed all random behavior (so far) * ROM generation working * fix hints trying to get alttp dungeon hint texts * continue fixing hints * add oot to network data package * change item and location IDs to 66000 and 67000 range respectively * push removed items to precollected items * fixed various issues with cross-contamination with multiple world generation * reenable glitched logic (hopefully) * glitched world files age-check fix * cleaned up some get_locations calls * added token shuffle and scrub shuffle, modified some options slightly to make the parsing work * reenable MQ dungeons * fix forest mq exception * made targeting style an option for now, will be cosmetic later * reminder to move targeting to cosmetics * some oot option maintenance * enabled starting time of day * fixed issue breaking shop slots in multiworld generation * added "off" option for text shuffle and hints * shopsanity functionality restored * change patch file extension * remove unnecessary utility functions + imports * update MIT license * change option to "patch_uncompressed_rom" instead of "compress_rom" * compliance with new AutoWorld systems * Kill only internal events, remove non-internal big poe event in code * re-add the big poe event and handle it correctly * remove extra method in Range option * fix typo * Starting items, starting with consumables option * do not remove nonexistent item * move set_shop_rules to after shop items are placed * some cleanup * add retries for song placement * flagged Skull Mask and Mask of Truth as advancement items * update OoT to use LogicMixin * Fixed trying to assign starting items from the wrong players * fixed song retry step * improved option handling, comments, and starting item replacements * DefaultOnToggle writes Yes or No to spoiler * enable compression of output if Compress executable is present * clean up compression * check whether (de)compressor exists before running the process * allow specification of rom path in host.yaml * check if decompressed file already exists before decompressing again * fix triforce hunt generation * rename all the oot state functions with prefix * OoT: mark triforce pieces as completion goal for triforce hunt * added overworld and any-dungeon shuffle for dungeon items * Hide most unshuffled locations and events from the list of locations in spoiler * build oot option ranges with a generic function instead of defining each separately * move oot output-type control to host.yaml instead of individual yamls * implement dungeon song shuffle * minor improvements to overworld dungeon item shuffle * remove random ice trap names in shops, mostly to avoid maintaining a massive censor list * always output patch file to folder, remove option to generate ROM in preparation for removal * re-add the fix for infinite recursion due to not being light or dark world * change AP-sendable to Ocarina of Time model, since the triforce piece has some extra code apparently * oot: remove item_names and location_names * oot: minor fixes * oot: comment out ROM patching * oot: only add CollectionState objects on creation if actually needed * main entrance shuffle method and entrances-based rules * fix entrances based rules * disable master quest and big poe count options for client compatibility * use get_player_name instead of get_player_names * fix OptionList * fix oot options for new option system * new coop section in oot rom: expand player names to 16 bytes, write AP_PLAYER_NAME at end of PLAYER_NAMES * fill AP player name in oot rom with 0 instead of 0xDF * encode player name with ASCII for fixed-width * revert oot player name array to 8 bytes per name * remove Pierre location if fast scarecrow is on * check player name length * "free_scarecrow" not "fast_scarecrow" * OoT locations now properly store the AP ID instead of the oot internal ID * oot __version__ updates in lockstep with AP version * pull in unmodified oot cosmetic files * also grab JSONDump since it's needed apparently * gather extra needed methods, modify imports * delete cosmetics log, replace all instances of SettingsList with OOTWorld * cosmetic options working, except for sound effects (due to ear-safe issues) * SFX, Music, and Fanfare randomization reenabled * move OoT data files into the worlds folder * move Compress and Decompress into oot data folder * Replace get_all_state with custom method to avoid the cache * OoT ROM: increment item counter before setting incoming item/player values to 0, preventing desync issues * set data_version to 0 * make Kokiri Sword shuffle off by default * reenable "Random Choice" for various cosmetic options * kill Ruto's Letter turnin if open fountain also fix for shopsanity * place Buy Goron/Zora Tunic first in shop shuffle * make ice traps appear as other items instead of breaking generation * managed to break ice traps on non-major-only * only handle ice traps if they are on * fix shopsanity for non-oot games, and write player name instead of player number * light arrows hint uses player name instead of player number * Reenable "skip child zelda" option * fix entrances_based_rules * fix ganondorf hint if starting with light arrows * fix dungeonitem shuffle and shopsanity interaction * remove has_all_of, has_any_of, count_of in BaseClasses, replace usage with has_all, has_any, has_group * force local giveable item on ZL if skip_child_zelda and shuffle_song_items is any * keep bosses and bombchu bowling chus out of data package * revert workaround for infinite recursion and fix it properly * fix shared shop id caches during patching process * fix shop text box overflows, as much as possible * add default oot host.yaml option * add .apz5, .n64, .z64 to gitignore * Properly document and name all (functioning) OOT options * clean up some imports * remove unnecessary files from oot's data * fix typo in gitignore * readd the Compress and Decompress utilities, since they are needed for generation * cleanup of imports and some minor optimizations * increase shop offset for item IDs to 0xCB * remove shop item AP ids entirely * prevent triforce pieces for other players from being received by yourself * add "excluded" property to Location * Hint system adapted and reenabled; hints still unseeded * make hints deterministic with lists instead of sets * do not allow hints to point to Light Arrows on non-vanilla bridge * foreign locations hint as their full name in OoT rather than their region * checkedLocations now stores hint names by player ID, so that the same location in different worlds can have hints associated * consolidate versioning in Utils * ice traps appear as major items rather than any progression item * set prescription and claim check as defaults for adult trade item settings * add oot options to playerSettings * allow case-insensitive logic tricks in yaml * fix oot shopsanity option formatting * Write OoT override info even if local item, enabling local checks to show up immediately in the client * implement CollectionState.can_live_dmg for oot glitched logic * filter item names for invalid characters when patching shops * make ice traps appear according to the settings of the world they are shuffled into, rather than the original world * set hidden-spoiler items and locations with Shop items to events * make GF carpenters, Gerudo Card, Malon, ZL, and Impa events if the relevant settings are enabled, preventing them from appearing in the client on game start * Fix oot Glitched and No Logic generation * fix indenting * Greatly reduce displayed cosmetic options * Change oot data version to 1 * add apz5 distribution to webhost * print player name if an ALttP dungeon contains a good item for OoT world * delete unneeded commented code * remove OcarinaSongs import to satisfy lint
2021-09-02 12:35:05 +00:00
from collections import namedtuple
from itertools import chain
from .Items import item_table
from .LocationList import location_groups
from decimal import Decimal, ROUND_HALF_UP
# Generates itempools and places fixed items based on settings.
alwaysitems = ([
'Biggoron Sword',
'Boomerang',
'Lens of Truth',
'Megaton Hammer',
'Iron Boots',
'Goron Tunic',
'Zora Tunic',
'Hover Boots',
'Mirror Shield',
'Stone of Agony',
'Fire Arrows',
'Ice Arrows',
'Light Arrows',
'Dins Fire',
'Farores Wind',
'Nayrus Love',
'Rupee (1)']
+ ['Progressive Hookshot'] * 2
+ ['Deku Shield']
+ ['Hylian Shield']
+ ['Progressive Strength Upgrade'] * 3
+ ['Progressive Scale'] * 2
+ ['Recovery Heart'] * 6
+ ['Bow'] * 3
+ ['Slingshot'] * 3
+ ['Bomb Bag'] * 3
+ ['Bombs (5)'] * 2
+ ['Bombs (10)']
+ ['Bombs (20)']
+ ['Arrows (5)']
+ ['Arrows (10)'] * 5
+ ['Progressive Wallet'] * 2
+ ['Magic Meter'] * 2
+ ['Double Defense']
+ ['Deku Stick Capacity'] * 2
+ ['Deku Nut Capacity'] * 2
+ ['Piece of Heart (Treasure Chest Game)'])
easy_items = ([
'Biggoron Sword',
'Kokiri Sword',
'Boomerang',
'Lens of Truth',
'Megaton Hammer',
'Iron Boots',
'Goron Tunic',
'Zora Tunic',
'Hover Boots',
'Mirror Shield',
'Fire Arrows',
'Light Arrows',
'Dins Fire',
'Progressive Hookshot',
'Progressive Strength Upgrade',
'Progressive Scale',
'Progressive Wallet',
'Magic Meter',
'Deku Stick Capacity',
'Deku Nut Capacity',
'Bow',
'Slingshot',
'Bomb Bag',
'Double Defense'] +
['Heart Container'] * 16 +
['Piece of Heart'] * 3)
normal_items = (
['Heart Container'] * 8 +
['Piece of Heart'] * 35)
item_difficulty_max = {
'plentiful': {},
'balanced': {},
'scarce': {
'Bombchus': 3,
'Bombchus (5)': 1,
'Bombchus (10)': 2,
'Bombchus (20)': 0,
'Magic Meter': 1,
'Double Defense': 0,
'Deku Stick Capacity': 1,
'Deku Nut Capacity': 1,
'Bow': 2,
'Slingshot': 2,
'Bomb Bag': 2,
'Heart Container': 0,
},
'minimal': {
'Bombchus': 1,
'Bombchus (5)': 1,
'Bombchus (10)': 0,
'Bombchus (20)': 0,
'Nayrus Love': 0,
'Magic Meter': 1,
'Double Defense': 0,
'Deku Stick Capacity': 0,
'Deku Nut Capacity': 0,
'Bow': 1,
'Slingshot': 1,
'Bomb Bag': 1,
'Heart Container': 0,
'Piece of Heart': 0,
},
}
DT_vanilla = (
['Recovery Heart'] * 2)
DT_MQ = (
['Deku Shield'] * 2 +
['Rupees (50)'])
DC_vanilla = (
['Rupees (20)'])
DC_MQ = (
['Hylian Shield'] +
['Rupees (5)'])
JB_MQ = (
['Deku Nuts (5)'] * 4 +
['Recovery Heart'] +
['Deku Shield'] +
['Deku Stick (1)'])
FoT_vanilla = (
['Recovery Heart'] +
['Arrows (10)'] +
['Arrows (30)'])
FoT_MQ = (
['Arrows (5)'])
FiT_vanilla = (
['Rupees (200)'])
FiT_MQ = (
['Bombs (20)'] +
['Hylian Shield'])
SpT_vanilla = (
['Deku Shield'] * 2 +
['Recovery Heart'] +
['Bombs (20)'])
SpT_MQ = (
['Rupees (50)'] * 2 +
['Arrows (30)'])
ShT_vanilla = (
['Arrows (30)'])
ShT_MQ = (
['Arrows (5)'] * 2 +
['Rupees (20)'])
BW_vanilla = (
['Recovery Heart'] +
['Bombs (10)'] +
['Rupees (200)'] +
['Deku Nuts (5)'] +
['Deku Nuts (10)'] +
['Deku Shield'] +
['Hylian Shield'])
GTG_vanilla = (
['Arrows (30)'] * 3 +
['Rupees (200)'])
GTG_MQ = (
['Rupee (Treasure Chest Game)'] * 2 +
['Arrows (10)'] +
['Rupee (1)'] +
['Rupees (50)'])
GC_vanilla = (
['Rupees (5)'] * 3 +
['Arrows (30)'])
GC_MQ = (
['Arrows (10)'] * 2 +
['Bombs (5)'] +
['Rupees (20)'] +
['Recovery Heart'])
normal_bottles = [
'Bottle',
'Bottle with Milk',
'Bottle with Red Potion',
'Bottle with Green Potion',
'Bottle with Blue Potion',
'Bottle with Fairy',
'Bottle with Fish',
'Bottle with Bugs',
'Bottle with Poe',
'Bottle with Big Poe',
'Bottle with Blue Fire']
bottle_count = 4
dungeon_rewards = [
'Kokiri Emerald',
'Goron Ruby',
'Zora Sapphire',
'Forest Medallion',
'Fire Medallion',
'Water Medallion',
'Shadow Medallion',
'Spirit Medallion',
'Light Medallion'
]
normal_rupees = (
['Rupees (5)'] * 13 +
['Rupees (20)'] * 5 +
['Rupees (50)'] * 7 +
['Rupees (200)'] * 3)
shopsanity_rupees = (
['Rupees (5)'] * 2 +
['Rupees (20)'] * 10 +
['Rupees (50)'] * 10 +
['Rupees (200)'] * 5 +
['Progressive Wallet'])
vanilla_shop_items = {
'KF Shop Item 1': 'Buy Deku Shield',
'KF Shop Item 2': 'Buy Deku Nut (5)',
'KF Shop Item 3': 'Buy Deku Nut (10)',
'KF Shop Item 4': 'Buy Deku Stick (1)',
'KF Shop Item 5': 'Buy Deku Seeds (30)',
'KF Shop Item 6': 'Buy Arrows (10)',
'KF Shop Item 7': 'Buy Arrows (30)',
'KF Shop Item 8': 'Buy Heart',
'Kak Potion Shop Item 1': 'Buy Deku Nut (5)',
'Kak Potion Shop Item 2': 'Buy Fish',
'Kak Potion Shop Item 3': 'Buy Red Potion [30]',
'Kak Potion Shop Item 4': 'Buy Green Potion',
'Kak Potion Shop Item 5': 'Buy Blue Fire',
'Kak Potion Shop Item 6': 'Buy Bottle Bug',
'Kak Potion Shop Item 7': 'Buy Poe',
'Kak Potion Shop Item 8': 'Buy Fairy\'s Spirit',
'Market Bombchu Shop Item 1': 'Buy Bombchu (5)',
'Market Bombchu Shop Item 2': 'Buy Bombchu (10)',
'Market Bombchu Shop Item 3': 'Buy Bombchu (10)',
'Market Bombchu Shop Item 4': 'Buy Bombchu (10)',
'Market Bombchu Shop Item 5': 'Buy Bombchu (20)',
'Market Bombchu Shop Item 6': 'Buy Bombchu (20)',
'Market Bombchu Shop Item 7': 'Buy Bombchu (20)',
'Market Bombchu Shop Item 8': 'Buy Bombchu (20)',
'Market Potion Shop Item 1': 'Buy Green Potion',
'Market Potion Shop Item 2': 'Buy Blue Fire',
'Market Potion Shop Item 3': 'Buy Red Potion [30]',
'Market Potion Shop Item 4': 'Buy Fairy\'s Spirit',
'Market Potion Shop Item 5': 'Buy Deku Nut (5)',
'Market Potion Shop Item 6': 'Buy Bottle Bug',
'Market Potion Shop Item 7': 'Buy Poe',
'Market Potion Shop Item 8': 'Buy Fish',
'Market Bazaar Item 1': 'Buy Hylian Shield',
'Market Bazaar Item 2': 'Buy Bombs (5) [35]',
'Market Bazaar Item 3': 'Buy Deku Nut (5)',
'Market Bazaar Item 4': 'Buy Heart',
'Market Bazaar Item 5': 'Buy Arrows (10)',
'Market Bazaar Item 6': 'Buy Arrows (50)',
'Market Bazaar Item 7': 'Buy Deku Stick (1)',
'Market Bazaar Item 8': 'Buy Arrows (30)',
'Kak Bazaar Item 1': 'Buy Hylian Shield',
'Kak Bazaar Item 2': 'Buy Bombs (5) [35]',
'Kak Bazaar Item 3': 'Buy Deku Nut (5)',
'Kak Bazaar Item 4': 'Buy Heart',
'Kak Bazaar Item 5': 'Buy Arrows (10)',
'Kak Bazaar Item 6': 'Buy Arrows (50)',
'Kak Bazaar Item 7': 'Buy Deku Stick (1)',
'Kak Bazaar Item 8': 'Buy Arrows (30)',
'ZD Shop Item 1': 'Buy Zora Tunic',
'ZD Shop Item 2': 'Buy Arrows (10)',
'ZD Shop Item 3': 'Buy Heart',
'ZD Shop Item 4': 'Buy Arrows (30)',
'ZD Shop Item 5': 'Buy Deku Nut (5)',
'ZD Shop Item 6': 'Buy Arrows (50)',
'ZD Shop Item 7': 'Buy Fish',
'ZD Shop Item 8': 'Buy Red Potion [50]',
'GC Shop Item 1': 'Buy Bombs (5) [25]',
'GC Shop Item 2': 'Buy Bombs (10)',
'GC Shop Item 3': 'Buy Bombs (20)',
'GC Shop Item 4': 'Buy Bombs (30)',
'GC Shop Item 5': 'Buy Goron Tunic',
'GC Shop Item 6': 'Buy Heart',
'GC Shop Item 7': 'Buy Red Potion [40]',
'GC Shop Item 8': 'Buy Heart',
}
min_shop_items = (
['Buy Deku Shield'] +
['Buy Hylian Shield'] +
['Buy Goron Tunic'] +
['Buy Zora Tunic'] +
['Buy Deku Nut (5)'] * 2 + ['Buy Deku Nut (10)'] +
['Buy Deku Stick (1)'] * 2 +
['Buy Deku Seeds (30)'] +
['Buy Arrows (10)'] * 2 + ['Buy Arrows (30)'] + ['Buy Arrows (50)'] +
['Buy Bombchu (5)'] + ['Buy Bombchu (10)'] * 2 + ['Buy Bombchu (20)'] +
['Buy Bombs (5) [25]'] + ['Buy Bombs (5) [35]'] + ['Buy Bombs (10)'] + ['Buy Bombs (20)'] +
['Buy Green Potion'] +
['Buy Red Potion [30]'] +
['Buy Blue Fire'] +
['Buy Fairy\'s Spirit'] +
['Buy Bottle Bug'] +
['Buy Fish'])
vanilla_deku_scrubs = {
'ZR Deku Scrub Grotto Rear': 'Buy Red Potion [30]',
'ZR Deku Scrub Grotto Front': 'Buy Green Potion',
'SFM Deku Scrub Grotto Rear': 'Buy Red Potion [30]',
'SFM Deku Scrub Grotto Front': 'Buy Green Potion',
'LH Deku Scrub Grotto Left': 'Buy Deku Nut (5)',
'LH Deku Scrub Grotto Right': 'Buy Bombs (5) [35]',
'LH Deku Scrub Grotto Center': 'Buy Arrows (30)',
'GV Deku Scrub Grotto Rear': 'Buy Red Potion [30]',
'GV Deku Scrub Grotto Front': 'Buy Green Potion',
'LW Deku Scrub Near Deku Theater Right': 'Buy Deku Nut (5)',
'LW Deku Scrub Near Deku Theater Left': 'Buy Deku Stick (1)',
'LW Deku Scrub Grotto Rear': 'Buy Arrows (30)',
'Colossus Deku Scrub Grotto Rear': 'Buy Red Potion [30]',
'Colossus Deku Scrub Grotto Front': 'Buy Green Potion',
'DMC Deku Scrub': 'Buy Bombs (5) [35]',
'DMC Deku Scrub Grotto Left': 'Buy Deku Nut (5)',
'DMC Deku Scrub Grotto Right': 'Buy Bombs (5) [35]',
'DMC Deku Scrub Grotto Center': 'Buy Arrows (30)',
'GC Deku Scrub Grotto Left': 'Buy Deku Nut (5)',
'GC Deku Scrub Grotto Right': 'Buy Bombs (5) [35]',
'GC Deku Scrub Grotto Center': 'Buy Arrows (30)',
'LLR Deku Scrub Grotto Left': 'Buy Deku Nut (5)',
'LLR Deku Scrub Grotto Right': 'Buy Bombs (5) [35]',
'LLR Deku Scrub Grotto Center': 'Buy Arrows (30)',
}
deku_scrubs_items = (
['Deku Nuts (5)'] * 5 +
['Deku Stick (1)'] +
['Bombs (5)'] * 5 +
['Recovery Heart'] * 4 +
['Rupees (5)'] * 4) # ['Green Potion']
songlist = [
'Zeldas Lullaby',
'Eponas Song',
'Suns Song',
'Sarias Song',
'Song of Time',
'Song of Storms',
'Minuet of Forest',
'Prelude of Light',
'Bolero of Fire',
'Serenade of Water',
'Nocturne of Shadow',
'Requiem of Spirit']
skulltula_locations = ([
'KF GS Know It All House',
'KF GS Bean Patch',
'KF GS House of Twins',
'LW GS Bean Patch Near Bridge',
'LW GS Bean Patch Near Theater',
'LW GS Above Theater',
'SFM GS',
'HF GS Near Kak Grotto',
'HF GS Cow Grotto',
'Market GS Guard House',
'HC GS Tree',
'HC GS Storms Grotto',
'OGC GS',
'LLR GS Tree',
'LLR GS Rain Shed',
'LLR GS House Window',
'LLR GS Back Wall',
'Kak GS House Under Construction',
'Kak GS Skulltula House',
'Kak GS Guards House',
'Kak GS Tree',
'Kak GS Watchtower',
'Kak GS Above Impas House',
'Graveyard GS Wall',
'Graveyard GS Bean Patch',
'DMT GS Bean Patch',
'DMT GS Near Kak',
'DMT GS Falling Rocks Path',
'DMT GS Above Dodongos Cavern',
'GC GS Boulder Maze',
'GC GS Center Platform',
'DMC GS Crate',
'DMC GS Bean Patch',
'ZR GS Ladder',
'ZR GS Tree',
'ZR GS Near Raised Grottos',
'ZR GS Above Bridge',
'ZD GS Frozen Waterfall',
'ZF GS Tree',
'ZF GS Above the Log',
'ZF GS Hidden Cave',
'LH GS Bean Patch',
'LH GS Lab Wall',
'LH GS Small Island',
'LH GS Tree',
'LH GS Lab Crate',
'GV GS Small Bridge',
'GV GS Bean Patch',
'GV GS Behind Tent',
'GV GS Pillar',
'GF GS Archery Range',
'GF GS Top Floor',
'Wasteland GS',
'Colossus GS Bean Patch',
'Colossus GS Tree',
'Colossus GS Hill'])
tradeitems = (
'Pocket Egg',
'Pocket Cucco',
'Cojiro',
'Odd Mushroom',
'Poachers Saw',
'Broken Sword',
'Prescription',
'Eyeball Frog',
'Eyedrops',
'Claim Check')
tradeitemoptions = (
'pocket_egg',
'pocket_cucco',
'cojiro',
'odd_mushroom',
'poachers_saw',
'broken_sword',
'prescription',
'eyeball_frog',
'eyedrops',
'claim_check')
fixedlocations = {
'Ganon': 'Triforce',
'Pierre': 'Scarecrow Song',
'Deliver Rutos Letter': 'Deliver Letter',
'Master Sword Pedestal': 'Time Travel',
'Market Bombchu Bowling Bombchus': 'Bombchu Drop',
}
droplocations = {
'Deku Baba Sticks': 'Deku Stick Drop',
'Deku Baba Nuts': 'Deku Nut Drop',
'Stick Pot': 'Deku Stick Drop',
'Nut Pot': 'Deku Nut Drop',
'Nut Crate': 'Deku Nut Drop',
'Blue Fire': 'Blue Fire',
'Lone Fish': 'Fish',
'Fish Group': 'Fish',
'Bug Rock': 'Bugs',
'Bug Shrub': 'Bugs',
'Wandering Bugs': 'Bugs',
'Fairy Pot': 'Fairy',
'Free Fairies': 'Fairy',
'Wall Fairy': 'Fairy',
'Butterfly Fairy': 'Fairy',
'Gossip Stone Fairy': 'Fairy',
'Bean Plant Fairy': 'Fairy',
'Fairy Pond': 'Fairy',
'Big Poe Kill': 'Big Poe',
}
vanillaBK = {
'Fire Temple Boss Key Chest': 'Boss Key (Fire Temple)',
'Shadow Temple Boss Key Chest': 'Boss Key (Shadow Temple)',
'Spirit Temple Boss Key Chest': 'Boss Key (Spirit Temple)',
'Water Temple Boss Key Chest': 'Boss Key (Water Temple)',
'Forest Temple Boss Key Chest': 'Boss Key (Forest Temple)',
'Fire Temple MQ Boss Key Chest': 'Boss Key (Fire Temple)',
'Shadow Temple MQ Boss Key Chest': 'Boss Key (Shadow Temple)',
'Spirit Temple MQ Boss Key Chest': 'Boss Key (Spirit Temple)',
'Water Temple MQ Boss Key Chest': 'Boss Key (Water Temple)',
'Forest Temple MQ Boss Key Chest': 'Boss Key (Forest Temple)',
}
vanillaMC = {
'Bottom of the Well Compass Chest': 'Compass (Bottom of the Well)',
'Deku Tree Compass Chest': 'Compass (Deku Tree)',
'Dodongos Cavern Compass Chest': 'Compass (Dodongos Cavern)',
'Fire Temple Compass Chest': 'Compass (Fire Temple)',
'Forest Temple Blue Poe Chest': 'Compass (Forest Temple)',
'Ice Cavern Compass Chest': 'Compass (Ice Cavern)',
'Jabu Jabus Belly Compass Chest': 'Compass (Jabu Jabus Belly)',
'Shadow Temple Compass Chest': 'Compass (Shadow Temple)',
'Spirit Temple Compass Chest': 'Compass (Spirit Temple)',
'Water Temple Compass Chest': 'Compass (Water Temple)',
'Bottom of the Well Map Chest': 'Map (Bottom of the Well)',
'Deku Tree Map Chest': 'Map (Deku Tree)',
'Dodongos Cavern Map Chest': 'Map (Dodongos Cavern)',
'Fire Temple Map Chest': 'Map (Fire Temple)',
'Forest Temple Map Chest': 'Map (Forest Temple)',
'Ice Cavern Map Chest': 'Map (Ice Cavern)',
'Jabu Jabus Belly Map Chest': 'Map (Jabu Jabus Belly)',
'Shadow Temple Map Chest': 'Map (Shadow Temple)',
'Spirit Temple Map Chest': 'Map (Spirit Temple)',
'Water Temple Map Chest': 'Map (Water Temple)',
'Bottom of the Well MQ Compass Chest': 'Compass (Bottom of the Well)',
'Deku Tree MQ Compass Chest': 'Compass (Deku Tree)',
'Dodongos Cavern MQ Compass Chest': 'Compass (Dodongos Cavern)',
'Fire Temple MQ Compass Chest': 'Compass (Fire Temple)',
'Forest Temple MQ Compass Chest': 'Compass (Forest Temple)',
'Ice Cavern MQ Compass Chest': 'Compass (Ice Cavern)',
'Jabu Jabus Belly MQ Compass Chest': 'Compass (Jabu Jabus Belly)',
'Shadow Temple MQ Compass Chest': 'Compass (Shadow Temple)',
'Spirit Temple MQ Compass Chest': 'Compass (Spirit Temple)',
'Water Temple MQ Compass Chest': 'Compass (Water Temple)',
'Bottom of the Well MQ Map Chest': 'Map (Bottom of the Well)',
'Deku Tree MQ Map Chest': 'Map (Deku Tree)',
'Dodongos Cavern MQ Map Chest': 'Map (Dodongos Cavern)',
'Fire Temple MQ Map Chest': 'Map (Fire Temple)',
'Forest Temple MQ Map Chest': 'Map (Forest Temple)',
'Ice Cavern MQ Map Chest': 'Map (Ice Cavern)',
'Jabu Jabus Belly MQ Map Chest': 'Map (Jabu Jabus Belly)',
'Shadow Temple MQ Map Chest': 'Map (Shadow Temple)',
'Spirit Temple MQ Map Chest': 'Map (Spirit Temple)',
'Water Temple MQ Map Chest': 'Map (Water Temple)',
}
vanillaSK = {
'Bottom of the Well Front Left Fake Wall Chest': 'Small Key (Bottom of the Well)',
'Bottom of the Well Right Bottom Fake Wall Chest': 'Small Key (Bottom of the Well)',
'Bottom of the Well Freestanding Key': 'Small Key (Bottom of the Well)',
'Fire Temple Big Lava Room Blocked Door Chest': 'Small Key (Fire Temple)',
'Fire Temple Big Lava Room Lower Open Door Chest': 'Small Key (Fire Temple)',
'Fire Temple Boulder Maze Shortcut Chest': 'Small Key (Fire Temple)',
'Fire Temple Boulder Maze Lower Chest': 'Small Key (Fire Temple)',
'Fire Temple Boulder Maze Side Room Chest': 'Small Key (Fire Temple)',
'Fire Temple Boulder Maze Upper Chest': 'Small Key (Fire Temple)',
'Fire Temple Near Boss Chest': 'Small Key (Fire Temple)',
'Fire Temple Highest Goron Chest': 'Small Key (Fire Temple)',
'Forest Temple First Stalfos Chest': 'Small Key (Forest Temple)',
'Forest Temple First Room Chest': 'Small Key (Forest Temple)',
'Forest Temple Floormaster Chest': 'Small Key (Forest Temple)',
'Forest Temple Red Poe Chest': 'Small Key (Forest Temple)',
'Forest Temple Well Chest': 'Small Key (Forest Temple)',
'Ganons Castle Light Trial Invisible Enemies Chest': 'Small Key (Ganons Castle)',
'Ganons Castle Light Trial Lullaby Chest': 'Small Key (Ganons Castle)',
'Gerudo Training Grounds Beamos Chest': 'Small Key (Gerudo Training Grounds)',
'Gerudo Training Grounds Eye Statue Chest': 'Small Key (Gerudo Training Grounds)',
'Gerudo Training Grounds Hammer Room Switch Chest': 'Small Key (Gerudo Training Grounds)',
'Gerudo Training Grounds Heavy Block Third Chest': 'Small Key (Gerudo Training Grounds)',
'Gerudo Training Grounds Hidden Ceiling Chest': 'Small Key (Gerudo Training Grounds)',
'Gerudo Training Grounds Near Scarecrow Chest': 'Small Key (Gerudo Training Grounds)',
'Gerudo Training Grounds Stalfos Chest': 'Small Key (Gerudo Training Grounds)',
'Gerudo Training Grounds Underwater Silver Rupee Chest': 'Small Key (Gerudo Training Grounds)',
'Gerudo Training Grounds Freestanding Key': 'Small Key (Gerudo Training Grounds)',
'Shadow Temple After Wind Hidden Chest': 'Small Key (Shadow Temple)',
'Shadow Temple Early Silver Rupee Chest': 'Small Key (Shadow Temple)',
'Shadow Temple Falling Spikes Switch Chest': 'Small Key (Shadow Temple)',
'Shadow Temple Invisible Floormaster Chest': 'Small Key (Shadow Temple)',
'Shadow Temple Freestanding Key': 'Small Key (Shadow Temple)',
'Spirit Temple Child Early Torches Chest': 'Small Key (Spirit Temple)',
'Spirit Temple Early Adult Right Chest': 'Small Key (Spirit Temple)',
'Spirit Temple Near Four Armos Chest': 'Small Key (Spirit Temple)',
'Spirit Temple Statue Room Hand Chest': 'Small Key (Spirit Temple)',
'Spirit Temple Sun Block Room Chest': 'Small Key (Spirit Temple)',
'Water Temple Central Bow Target Chest': 'Small Key (Water Temple)',
'Water Temple Central Pillar Chest': 'Small Key (Water Temple)',
'Water Temple Cracked Wall Chest': 'Small Key (Water Temple)',
'Water Temple Dragon Chest': 'Small Key (Water Temple)',
'Water Temple River Chest': 'Small Key (Water Temple)',
'Water Temple Torches Chest': 'Small Key (Water Temple)',
'Bottom of the Well MQ Dead Hand Freestanding Key': 'Small Key (Bottom of the Well)',
'Bottom of the Well MQ East Inner Room Freestanding Key': 'Small Key (Bottom of the Well)',
'Fire Temple MQ Big Lava Room Blocked Door Chest': 'Small Key (Fire Temple)',
'Fire Temple MQ Near Boss Chest': 'Small Key (Fire Temple)',
'Fire Temple MQ Lizalfos Maze Side Room Chest': 'Small Key (Fire Temple)',
'Fire Temple MQ Chest On Fire': 'Small Key (Fire Temple)',
'Fire Temple MQ Freestanding Key': 'Small Key (Fire Temple)',
'Forest Temple MQ Wolfos Chest': 'Small Key (Forest Temple)',
'Forest Temple MQ First Room Chest': 'Small Key (Forest Temple)',
'Forest Temple MQ Raised Island Courtyard Lower Chest': 'Small Key (Forest Temple)',
'Forest Temple MQ Raised Island Courtyard Upper Chest': 'Small Key (Forest Temple)',
'Forest Temple MQ Redead Chest': 'Small Key (Forest Temple)',
'Forest Temple MQ Well Chest': 'Small Key (Forest Temple)',
'Ganons Castle MQ Shadow Trial Eye Switch Chest': 'Small Key (Ganons Castle)',
'Ganons Castle MQ Spirit Trial Sun Back Left Chest': 'Small Key (Ganons Castle)',
'Ganons Castle MQ Forest Trial Freestanding Key': 'Small Key (Ganons Castle)',
'Gerudo Training Grounds MQ Dinolfos Chest': 'Small Key (Gerudo Training Grounds)',
'Gerudo Training Grounds MQ Flame Circle Chest': 'Small Key (Gerudo Training Grounds)',
'Gerudo Training Grounds MQ Underwater Silver Rupee Chest': 'Small Key (Gerudo Training Grounds)',
'Shadow Temple MQ Falling Spikes Switch Chest': 'Small Key (Shadow Temple)',
'Shadow Temple MQ Invisible Blades Invisible Chest': 'Small Key (Shadow Temple)',
'Shadow Temple MQ Early Gibdos Chest': 'Small Key (Shadow Temple)',
'Shadow Temple MQ Near Ship Invisible Chest': 'Small Key (Shadow Temple)',
'Shadow Temple MQ Wind Hint Chest': 'Small Key (Shadow Temple)',
'Shadow Temple MQ Freestanding Key': 'Small Key (Shadow Temple)',
'Spirit Temple MQ Child Hammer Switch Chest': 'Small Key (Spirit Temple)',
'Spirit Temple MQ Child Climb South Chest': 'Small Key (Spirit Temple)',
'Spirit Temple MQ Map Room Enemy Chest': 'Small Key (Spirit Temple)',
'Spirit Temple MQ Entrance Back Left Chest': 'Small Key (Spirit Temple)',
'Spirit Temple MQ Entrance Front Right Chest': 'Small Key (Spirit Temple)',
'Spirit Temple MQ Mirror Puzzle Invisible Chest': 'Small Key (Spirit Temple)',
'Spirit Temple MQ Silver Block Hallway Chest': 'Small Key (Spirit Temple)',
'Water Temple MQ Central Pillar Chest': 'Small Key (Water Temple)',
'Water Temple MQ Freestanding Key': 'Small Key (Water Temple)',
}
junk_pool_base = [
('Bombs (5)', 8),
('Bombs (10)', 2),
('Arrows (5)', 8),
('Arrows (10)', 2),
('Deku Stick (1)', 5),
('Deku Nuts (5)', 5),
('Deku Seeds (30)', 5),
('Rupees (5)', 10),
('Rupees (20)', 4),
('Rupees (50)', 1),
]
pending_junk_pool = []
junk_pool = []
remove_junk_items = [
'Bombs (5)',
'Deku Nuts (5)',
'Deku Stick (1)',
'Recovery Heart',
'Arrows (5)',
'Arrows (10)',
'Arrows (30)',
'Rupees (5)',
'Rupees (20)',
'Rupees (50)',
'Rupees (200)',
'Deku Nuts (10)',
'Bombs (10)',
'Bombs (20)',
'Deku Seeds (30)',
'Ice Trap',
]
remove_junk_set = set(remove_junk_items)
exclude_from_major = [
'Deliver Letter',
'Sell Big Poe',
'Magic Bean',
'Zeldas Letter',
'Bombchus (5)',
'Bombchus (10)',
'Bombchus (20)',
'Odd Potion',
'Triforce Piece'
]
item_groups = {
'Junk': remove_junk_items,
'JunkSong': ('Prelude of Light', 'Serenade of Water'),
'AdultTrade': tradeitems,
'Bottle': normal_bottles,
'Spell': ('Dins Fire', 'Farores Wind', 'Nayrus Love'),
'Shield': ('Deku Shield', 'Hylian Shield'),
'Song': songlist,
'NonWarpSong': songlist[0:6],
'WarpSong': songlist[6:],
'HealthUpgrade': ('Heart Container', 'Piece of Heart'),
'ProgressItem': [name for (name, data) in item_table.items() if data[0] == 'Item' and data[1]],
'MajorItem': [name for (name, data) in item_table.items() if (data[0] == 'Item' or data[0] == 'Song') and data[1] and name not in exclude_from_major],
'DungeonReward': dungeon_rewards,
'ForestFireWater': ('Forest Medallion', 'Fire Medallion', 'Water Medallion'),
'FireWater': ('Fire Medallion', 'Water Medallion'),
}
random = None
def get_junk_pool(ootworld):
junk_pool[:] = list(junk_pool_base)
if ootworld.junk_ice_traps == 'on':
junk_pool.append(('Ice Trap', 10))
elif ootworld.junk_ice_traps in ['mayhem', 'onslaught']:
junk_pool[:] = [('Ice Trap', 1)]
return junk_pool
def get_junk_item(count=1, pool=None, plando_pool=None):
global random
if count < 1:
raise ValueError("get_junk_item argument 'count' must be greater than 0.")
return_pool = []
if pending_junk_pool:
pending_count = min(len(pending_junk_pool), count)
return_pool = [pending_junk_pool.pop() for _ in range(pending_count)]
count -= pending_count
if pool and plando_pool:
jw_list = [(junk, weight) for (junk, weight) in junk_pool
if junk not in plando_pool or pool.count(junk) < plando_pool[junk].count]
try:
junk_items, junk_weights = zip(*jw_list)
except ValueError:
raise RuntimeError("Not enough junk is available in the item pool to replace removed items.")
else:
junk_items, junk_weights = zip(*junk_pool)
return_pool.extend(random.choices(junk_items, weights=junk_weights, k=count))
return return_pool
def replace_max_item(items, item, max):
count = 0
for i,val in enumerate(items):
if val == item:
if count >= max:
items[i] = get_junk_item()[0]
count += 1
def generate_itempool(ootworld):
world = ootworld.world
player = ootworld.player
global random
random = world.random
junk_pool = get_junk_pool(ootworld)
fixed_locations = filter(lambda loc: loc.name in fixedlocations, ootworld.get_locations())
Ocarina of Time (#64) * first commit (not including OoT data files yet) * added some basic options * rule parser works now at least * make sure to commit everything this time * temporary change to BaseClasses for oot * overworld location graph builds mostly correctly * adding oot data files * commenting out world options until later since they only existed to make the RuleParser work * conversion functions between AP ids and OOT ids * world graph outputs * set scrub prices * itempool generates, entrances connected, way too many options added * fixed set_rules and set_shop_rules * temp baseclasses changes * Reaches the fill step now, old event-based system retained in case the new way breaks * Song placements and misc fixes everywhere * temporary changes to make oot work * changed root exits for AP fill framework * prevent infinite recursion due to OoT sharing usage of the address field * age reachability works hopefully, songs are broken again * working spoiler log generation on beatable-only * Logic tricks implemented * need this for logic tricks * fixed map/compass being placed on Serenade location * kill unreachable events before filling the world * add a bunch of utility functions to prepare for rom patching * move OptionList into generic options * fixed some silly bugs with OptionList * properly seed all random behavior (so far) * ROM generation working * fix hints trying to get alttp dungeon hint texts * continue fixing hints * add oot to network data package * change item and location IDs to 66000 and 67000 range respectively * push removed items to precollected items * fixed various issues with cross-contamination with multiple world generation * reenable glitched logic (hopefully) * glitched world files age-check fix * cleaned up some get_locations calls * added token shuffle and scrub shuffle, modified some options slightly to make the parsing work * reenable MQ dungeons * fix forest mq exception * made targeting style an option for now, will be cosmetic later * reminder to move targeting to cosmetics * some oot option maintenance * enabled starting time of day * fixed issue breaking shop slots in multiworld generation * added "off" option for text shuffle and hints * shopsanity functionality restored * change patch file extension * remove unnecessary utility functions + imports * update MIT license * change option to "patch_uncompressed_rom" instead of "compress_rom" * compliance with new AutoWorld systems * Kill only internal events, remove non-internal big poe event in code * re-add the big poe event and handle it correctly * remove extra method in Range option * fix typo * Starting items, starting with consumables option * do not remove nonexistent item * move set_shop_rules to after shop items are placed * some cleanup * add retries for song placement * flagged Skull Mask and Mask of Truth as advancement items * update OoT to use LogicMixin * Fixed trying to assign starting items from the wrong players * fixed song retry step * improved option handling, comments, and starting item replacements * DefaultOnToggle writes Yes or No to spoiler * enable compression of output if Compress executable is present * clean up compression * check whether (de)compressor exists before running the process * allow specification of rom path in host.yaml * check if decompressed file already exists before decompressing again * fix triforce hunt generation * rename all the oot state functions with prefix * OoT: mark triforce pieces as completion goal for triforce hunt * added overworld and any-dungeon shuffle for dungeon items * Hide most unshuffled locations and events from the list of locations in spoiler * build oot option ranges with a generic function instead of defining each separately * move oot output-type control to host.yaml instead of individual yamls * implement dungeon song shuffle * minor improvements to overworld dungeon item shuffle * remove random ice trap names in shops, mostly to avoid maintaining a massive censor list * always output patch file to folder, remove option to generate ROM in preparation for removal * re-add the fix for infinite recursion due to not being light or dark world * change AP-sendable to Ocarina of Time model, since the triforce piece has some extra code apparently * oot: remove item_names and location_names * oot: minor fixes * oot: comment out ROM patching * oot: only add CollectionState objects on creation if actually needed * main entrance shuffle method and entrances-based rules * fix entrances based rules * disable master quest and big poe count options for client compatibility * use get_player_name instead of get_player_names * fix OptionList * fix oot options for new option system * new coop section in oot rom: expand player names to 16 bytes, write AP_PLAYER_NAME at end of PLAYER_NAMES * fill AP player name in oot rom with 0 instead of 0xDF * encode player name with ASCII for fixed-width * revert oot player name array to 8 bytes per name * remove Pierre location if fast scarecrow is on * check player name length * "free_scarecrow" not "fast_scarecrow" * OoT locations now properly store the AP ID instead of the oot internal ID * oot __version__ updates in lockstep with AP version * pull in unmodified oot cosmetic files * also grab JSONDump since it's needed apparently * gather extra needed methods, modify imports * delete cosmetics log, replace all instances of SettingsList with OOTWorld * cosmetic options working, except for sound effects (due to ear-safe issues) * SFX, Music, and Fanfare randomization reenabled * move OoT data files into the worlds folder * move Compress and Decompress into oot data folder * Replace get_all_state with custom method to avoid the cache * OoT ROM: increment item counter before setting incoming item/player values to 0, preventing desync issues * set data_version to 0 * make Kokiri Sword shuffle off by default * reenable "Random Choice" for various cosmetic options * kill Ruto's Letter turnin if open fountain also fix for shopsanity * place Buy Goron/Zora Tunic first in shop shuffle * make ice traps appear as other items instead of breaking generation * managed to break ice traps on non-major-only * only handle ice traps if they are on * fix shopsanity for non-oot games, and write player name instead of player number * light arrows hint uses player name instead of player number * Reenable "skip child zelda" option * fix entrances_based_rules * fix ganondorf hint if starting with light arrows * fix dungeonitem shuffle and shopsanity interaction * remove has_all_of, has_any_of, count_of in BaseClasses, replace usage with has_all, has_any, has_group * force local giveable item on ZL if skip_child_zelda and shuffle_song_items is any * keep bosses and bombchu bowling chus out of data package * revert workaround for infinite recursion and fix it properly * fix shared shop id caches during patching process * fix shop text box overflows, as much as possible * add default oot host.yaml option * add .apz5, .n64, .z64 to gitignore * Properly document and name all (functioning) OOT options * clean up some imports * remove unnecessary files from oot's data * fix typo in gitignore * readd the Compress and Decompress utilities, since they are needed for generation * cleanup of imports and some minor optimizations * increase shop offset for item IDs to 0xCB * remove shop item AP ids entirely * prevent triforce pieces for other players from being received by yourself * add "excluded" property to Location * Hint system adapted and reenabled; hints still unseeded * make hints deterministic with lists instead of sets * do not allow hints to point to Light Arrows on non-vanilla bridge * foreign locations hint as their full name in OoT rather than their region * checkedLocations now stores hint names by player ID, so that the same location in different worlds can have hints associated * consolidate versioning in Utils * ice traps appear as major items rather than any progression item * set prescription and claim check as defaults for adult trade item settings * add oot options to playerSettings * allow case-insensitive logic tricks in yaml * fix oot shopsanity option formatting * Write OoT override info even if local item, enabling local checks to show up immediately in the client * implement CollectionState.can_live_dmg for oot glitched logic * filter item names for invalid characters when patching shops * make ice traps appear according to the settings of the world they are shuffled into, rather than the original world * set hidden-spoiler items and locations with Shop items to events * make GF carpenters, Gerudo Card, Malon, ZL, and Impa events if the relevant settings are enabled, preventing them from appearing in the client on game start * Fix oot Glitched and No Logic generation * fix indenting * Greatly reduce displayed cosmetic options * Change oot data version to 1 * add apz5 distribution to webhost * print player name if an ALttP dungeon contains a good item for OoT world * delete unneeded commented code * remove OcarinaSongs import to satisfy lint
2021-09-02 12:35:05 +00:00
for location in fixed_locations:
item = fixedlocations[location.name]
location.place_locked_item(ootworld.create_item(item))
Ocarina of Time (#64) * first commit (not including OoT data files yet) * added some basic options * rule parser works now at least * make sure to commit everything this time * temporary change to BaseClasses for oot * overworld location graph builds mostly correctly * adding oot data files * commenting out world options until later since they only existed to make the RuleParser work * conversion functions between AP ids and OOT ids * world graph outputs * set scrub prices * itempool generates, entrances connected, way too many options added * fixed set_rules and set_shop_rules * temp baseclasses changes * Reaches the fill step now, old event-based system retained in case the new way breaks * Song placements and misc fixes everywhere * temporary changes to make oot work * changed root exits for AP fill framework * prevent infinite recursion due to OoT sharing usage of the address field * age reachability works hopefully, songs are broken again * working spoiler log generation on beatable-only * Logic tricks implemented * need this for logic tricks * fixed map/compass being placed on Serenade location * kill unreachable events before filling the world * add a bunch of utility functions to prepare for rom patching * move OptionList into generic options * fixed some silly bugs with OptionList * properly seed all random behavior (so far) * ROM generation working * fix hints trying to get alttp dungeon hint texts * continue fixing hints * add oot to network data package * change item and location IDs to 66000 and 67000 range respectively * push removed items to precollected items * fixed various issues with cross-contamination with multiple world generation * reenable glitched logic (hopefully) * glitched world files age-check fix * cleaned up some get_locations calls * added token shuffle and scrub shuffle, modified some options slightly to make the parsing work * reenable MQ dungeons * fix forest mq exception * made targeting style an option for now, will be cosmetic later * reminder to move targeting to cosmetics * some oot option maintenance * enabled starting time of day * fixed issue breaking shop slots in multiworld generation * added "off" option for text shuffle and hints * shopsanity functionality restored * change patch file extension * remove unnecessary utility functions + imports * update MIT license * change option to "patch_uncompressed_rom" instead of "compress_rom" * compliance with new AutoWorld systems * Kill only internal events, remove non-internal big poe event in code * re-add the big poe event and handle it correctly * remove extra method in Range option * fix typo * Starting items, starting with consumables option * do not remove nonexistent item * move set_shop_rules to after shop items are placed * some cleanup * add retries for song placement * flagged Skull Mask and Mask of Truth as advancement items * update OoT to use LogicMixin * Fixed trying to assign starting items from the wrong players * fixed song retry step * improved option handling, comments, and starting item replacements * DefaultOnToggle writes Yes or No to spoiler * enable compression of output if Compress executable is present * clean up compression * check whether (de)compressor exists before running the process * allow specification of rom path in host.yaml * check if decompressed file already exists before decompressing again * fix triforce hunt generation * rename all the oot state functions with prefix * OoT: mark triforce pieces as completion goal for triforce hunt * added overworld and any-dungeon shuffle for dungeon items * Hide most unshuffled locations and events from the list of locations in spoiler * build oot option ranges with a generic function instead of defining each separately * move oot output-type control to host.yaml instead of individual yamls * implement dungeon song shuffle * minor improvements to overworld dungeon item shuffle * remove random ice trap names in shops, mostly to avoid maintaining a massive censor list * always output patch file to folder, remove option to generate ROM in preparation for removal * re-add the fix for infinite recursion due to not being light or dark world * change AP-sendable to Ocarina of Time model, since the triforce piece has some extra code apparently * oot: remove item_names and location_names * oot: minor fixes * oot: comment out ROM patching * oot: only add CollectionState objects on creation if actually needed * main entrance shuffle method and entrances-based rules * fix entrances based rules * disable master quest and big poe count options for client compatibility * use get_player_name instead of get_player_names * fix OptionList * fix oot options for new option system * new coop section in oot rom: expand player names to 16 bytes, write AP_PLAYER_NAME at end of PLAYER_NAMES * fill AP player name in oot rom with 0 instead of 0xDF * encode player name with ASCII for fixed-width * revert oot player name array to 8 bytes per name * remove Pierre location if fast scarecrow is on * check player name length * "free_scarecrow" not "fast_scarecrow" * OoT locations now properly store the AP ID instead of the oot internal ID * oot __version__ updates in lockstep with AP version * pull in unmodified oot cosmetic files * also grab JSONDump since it's needed apparently * gather extra needed methods, modify imports * delete cosmetics log, replace all instances of SettingsList with OOTWorld * cosmetic options working, except for sound effects (due to ear-safe issues) * SFX, Music, and Fanfare randomization reenabled * move OoT data files into the worlds folder * move Compress and Decompress into oot data folder * Replace get_all_state with custom method to avoid the cache * OoT ROM: increment item counter before setting incoming item/player values to 0, preventing desync issues * set data_version to 0 * make Kokiri Sword shuffle off by default * reenable "Random Choice" for various cosmetic options * kill Ruto's Letter turnin if open fountain also fix for shopsanity * place Buy Goron/Zora Tunic first in shop shuffle * make ice traps appear as other items instead of breaking generation * managed to break ice traps on non-major-only * only handle ice traps if they are on * fix shopsanity for non-oot games, and write player name instead of player number * light arrows hint uses player name instead of player number * Reenable "skip child zelda" option * fix entrances_based_rules * fix ganondorf hint if starting with light arrows * fix dungeonitem shuffle and shopsanity interaction * remove has_all_of, has_any_of, count_of in BaseClasses, replace usage with has_all, has_any, has_group * force local giveable item on ZL if skip_child_zelda and shuffle_song_items is any * keep bosses and bombchu bowling chus out of data package * revert workaround for infinite recursion and fix it properly * fix shared shop id caches during patching process * fix shop text box overflows, as much as possible * add default oot host.yaml option * add .apz5, .n64, .z64 to gitignore * Properly document and name all (functioning) OOT options * clean up some imports * remove unnecessary files from oot's data * fix typo in gitignore * readd the Compress and Decompress utilities, since they are needed for generation * cleanup of imports and some minor optimizations * increase shop offset for item IDs to 0xCB * remove shop item AP ids entirely * prevent triforce pieces for other players from being received by yourself * add "excluded" property to Location * Hint system adapted and reenabled; hints still unseeded * make hints deterministic with lists instead of sets * do not allow hints to point to Light Arrows on non-vanilla bridge * foreign locations hint as their full name in OoT rather than their region * checkedLocations now stores hint names by player ID, so that the same location in different worlds can have hints associated * consolidate versioning in Utils * ice traps appear as major items rather than any progression item * set prescription and claim check as defaults for adult trade item settings * add oot options to playerSettings * allow case-insensitive logic tricks in yaml * fix oot shopsanity option formatting * Write OoT override info even if local item, enabling local checks to show up immediately in the client * implement CollectionState.can_live_dmg for oot glitched logic * filter item names for invalid characters when patching shops * make ice traps appear according to the settings of the world they are shuffled into, rather than the original world * set hidden-spoiler items and locations with Shop items to events * make GF carpenters, Gerudo Card, Malon, ZL, and Impa events if the relevant settings are enabled, preventing them from appearing in the client on game start * Fix oot Glitched and No Logic generation * fix indenting * Greatly reduce displayed cosmetic options * Change oot data version to 1 * add apz5 distribution to webhost * print player name if an ALttP dungeon contains a good item for OoT world * delete unneeded commented code * remove OcarinaSongs import to satisfy lint
2021-09-02 12:35:05 +00:00
drop_locations = filter(lambda loc: loc.type == 'Drop', ootworld.get_locations())
Ocarina of Time (#64) * first commit (not including OoT data files yet) * added some basic options * rule parser works now at least * make sure to commit everything this time * temporary change to BaseClasses for oot * overworld location graph builds mostly correctly * adding oot data files * commenting out world options until later since they only existed to make the RuleParser work * conversion functions between AP ids and OOT ids * world graph outputs * set scrub prices * itempool generates, entrances connected, way too many options added * fixed set_rules and set_shop_rules * temp baseclasses changes * Reaches the fill step now, old event-based system retained in case the new way breaks * Song placements and misc fixes everywhere * temporary changes to make oot work * changed root exits for AP fill framework * prevent infinite recursion due to OoT sharing usage of the address field * age reachability works hopefully, songs are broken again * working spoiler log generation on beatable-only * Logic tricks implemented * need this for logic tricks * fixed map/compass being placed on Serenade location * kill unreachable events before filling the world * add a bunch of utility functions to prepare for rom patching * move OptionList into generic options * fixed some silly bugs with OptionList * properly seed all random behavior (so far) * ROM generation working * fix hints trying to get alttp dungeon hint texts * continue fixing hints * add oot to network data package * change item and location IDs to 66000 and 67000 range respectively * push removed items to precollected items * fixed various issues with cross-contamination with multiple world generation * reenable glitched logic (hopefully) * glitched world files age-check fix * cleaned up some get_locations calls * added token shuffle and scrub shuffle, modified some options slightly to make the parsing work * reenable MQ dungeons * fix forest mq exception * made targeting style an option for now, will be cosmetic later * reminder to move targeting to cosmetics * some oot option maintenance * enabled starting time of day * fixed issue breaking shop slots in multiworld generation * added "off" option for text shuffle and hints * shopsanity functionality restored * change patch file extension * remove unnecessary utility functions + imports * update MIT license * change option to "patch_uncompressed_rom" instead of "compress_rom" * compliance with new AutoWorld systems * Kill only internal events, remove non-internal big poe event in code * re-add the big poe event and handle it correctly * remove extra method in Range option * fix typo * Starting items, starting with consumables option * do not remove nonexistent item * move set_shop_rules to after shop items are placed * some cleanup * add retries for song placement * flagged Skull Mask and Mask of Truth as advancement items * update OoT to use LogicMixin * Fixed trying to assign starting items from the wrong players * fixed song retry step * improved option handling, comments, and starting item replacements * DefaultOnToggle writes Yes or No to spoiler * enable compression of output if Compress executable is present * clean up compression * check whether (de)compressor exists before running the process * allow specification of rom path in host.yaml * check if decompressed file already exists before decompressing again * fix triforce hunt generation * rename all the oot state functions with prefix * OoT: mark triforce pieces as completion goal for triforce hunt * added overworld and any-dungeon shuffle for dungeon items * Hide most unshuffled locations and events from the list of locations in spoiler * build oot option ranges with a generic function instead of defining each separately * move oot output-type control to host.yaml instead of individual yamls * implement dungeon song shuffle * minor improvements to overworld dungeon item shuffle * remove random ice trap names in shops, mostly to avoid maintaining a massive censor list * always output patch file to folder, remove option to generate ROM in preparation for removal * re-add the fix for infinite recursion due to not being light or dark world * change AP-sendable to Ocarina of Time model, since the triforce piece has some extra code apparently * oot: remove item_names and location_names * oot: minor fixes * oot: comment out ROM patching * oot: only add CollectionState objects on creation if actually needed * main entrance shuffle method and entrances-based rules * fix entrances based rules * disable master quest and big poe count options for client compatibility * use get_player_name instead of get_player_names * fix OptionList * fix oot options for new option system * new coop section in oot rom: expand player names to 16 bytes, write AP_PLAYER_NAME at end of PLAYER_NAMES * fill AP player name in oot rom with 0 instead of 0xDF * encode player name with ASCII for fixed-width * revert oot player name array to 8 bytes per name * remove Pierre location if fast scarecrow is on * check player name length * "free_scarecrow" not "fast_scarecrow" * OoT locations now properly store the AP ID instead of the oot internal ID * oot __version__ updates in lockstep with AP version * pull in unmodified oot cosmetic files * also grab JSONDump since it's needed apparently * gather extra needed methods, modify imports * delete cosmetics log, replace all instances of SettingsList with OOTWorld * cosmetic options working, except for sound effects (due to ear-safe issues) * SFX, Music, and Fanfare randomization reenabled * move OoT data files into the worlds folder * move Compress and Decompress into oot data folder * Replace get_all_state with custom method to avoid the cache * OoT ROM: increment item counter before setting incoming item/player values to 0, preventing desync issues * set data_version to 0 * make Kokiri Sword shuffle off by default * reenable "Random Choice" for various cosmetic options * kill Ruto's Letter turnin if open fountain also fix for shopsanity * place Buy Goron/Zora Tunic first in shop shuffle * make ice traps appear as other items instead of breaking generation * managed to break ice traps on non-major-only * only handle ice traps if they are on * fix shopsanity for non-oot games, and write player name instead of player number * light arrows hint uses player name instead of player number * Reenable "skip child zelda" option * fix entrances_based_rules * fix ganondorf hint if starting with light arrows * fix dungeonitem shuffle and shopsanity interaction * remove has_all_of, has_any_of, count_of in BaseClasses, replace usage with has_all, has_any, has_group * force local giveable item on ZL if skip_child_zelda and shuffle_song_items is any * keep bosses and bombchu bowling chus out of data package * revert workaround for infinite recursion and fix it properly * fix shared shop id caches during patching process * fix shop text box overflows, as much as possible * add default oot host.yaml option * add .apz5, .n64, .z64 to gitignore * Properly document and name all (functioning) OOT options * clean up some imports * remove unnecessary files from oot's data * fix typo in gitignore * readd the Compress and Decompress utilities, since they are needed for generation * cleanup of imports and some minor optimizations * increase shop offset for item IDs to 0xCB * remove shop item AP ids entirely * prevent triforce pieces for other players from being received by yourself * add "excluded" property to Location * Hint system adapted and reenabled; hints still unseeded * make hints deterministic with lists instead of sets * do not allow hints to point to Light Arrows on non-vanilla bridge * foreign locations hint as their full name in OoT rather than their region * checkedLocations now stores hint names by player ID, so that the same location in different worlds can have hints associated * consolidate versioning in Utils * ice traps appear as major items rather than any progression item * set prescription and claim check as defaults for adult trade item settings * add oot options to playerSettings * allow case-insensitive logic tricks in yaml * fix oot shopsanity option formatting * Write OoT override info even if local item, enabling local checks to show up immediately in the client * implement CollectionState.can_live_dmg for oot glitched logic * filter item names for invalid characters when patching shops * make ice traps appear according to the settings of the world they are shuffled into, rather than the original world * set hidden-spoiler items and locations with Shop items to events * make GF carpenters, Gerudo Card, Malon, ZL, and Impa events if the relevant settings are enabled, preventing them from appearing in the client on game start * Fix oot Glitched and No Logic generation * fix indenting * Greatly reduce displayed cosmetic options * Change oot data version to 1 * add apz5 distribution to webhost * print player name if an ALttP dungeon contains a good item for OoT world * delete unneeded commented code * remove OcarinaSongs import to satisfy lint
2021-09-02 12:35:05 +00:00
for drop_location in drop_locations:
item = droplocations[drop_location.name]
drop_location.place_locked_item(ootworld.create_item(item))
Ocarina of Time (#64) * first commit (not including OoT data files yet) * added some basic options * rule parser works now at least * make sure to commit everything this time * temporary change to BaseClasses for oot * overworld location graph builds mostly correctly * adding oot data files * commenting out world options until later since they only existed to make the RuleParser work * conversion functions between AP ids and OOT ids * world graph outputs * set scrub prices * itempool generates, entrances connected, way too many options added * fixed set_rules and set_shop_rules * temp baseclasses changes * Reaches the fill step now, old event-based system retained in case the new way breaks * Song placements and misc fixes everywhere * temporary changes to make oot work * changed root exits for AP fill framework * prevent infinite recursion due to OoT sharing usage of the address field * age reachability works hopefully, songs are broken again * working spoiler log generation on beatable-only * Logic tricks implemented * need this for logic tricks * fixed map/compass being placed on Serenade location * kill unreachable events before filling the world * add a bunch of utility functions to prepare for rom patching * move OptionList into generic options * fixed some silly bugs with OptionList * properly seed all random behavior (so far) * ROM generation working * fix hints trying to get alttp dungeon hint texts * continue fixing hints * add oot to network data package * change item and location IDs to 66000 and 67000 range respectively * push removed items to precollected items * fixed various issues with cross-contamination with multiple world generation * reenable glitched logic (hopefully) * glitched world files age-check fix * cleaned up some get_locations calls * added token shuffle and scrub shuffle, modified some options slightly to make the parsing work * reenable MQ dungeons * fix forest mq exception * made targeting style an option for now, will be cosmetic later * reminder to move targeting to cosmetics * some oot option maintenance * enabled starting time of day * fixed issue breaking shop slots in multiworld generation * added "off" option for text shuffle and hints * shopsanity functionality restored * change patch file extension * remove unnecessary utility functions + imports * update MIT license * change option to "patch_uncompressed_rom" instead of "compress_rom" * compliance with new AutoWorld systems * Kill only internal events, remove non-internal big poe event in code * re-add the big poe event and handle it correctly * remove extra method in Range option * fix typo * Starting items, starting with consumables option * do not remove nonexistent item * move set_shop_rules to after shop items are placed * some cleanup * add retries for song placement * flagged Skull Mask and Mask of Truth as advancement items * update OoT to use LogicMixin * Fixed trying to assign starting items from the wrong players * fixed song retry step * improved option handling, comments, and starting item replacements * DefaultOnToggle writes Yes or No to spoiler * enable compression of output if Compress executable is present * clean up compression * check whether (de)compressor exists before running the process * allow specification of rom path in host.yaml * check if decompressed file already exists before decompressing again * fix triforce hunt generation * rename all the oot state functions with prefix * OoT: mark triforce pieces as completion goal for triforce hunt * added overworld and any-dungeon shuffle for dungeon items * Hide most unshuffled locations and events from the list of locations in spoiler * build oot option ranges with a generic function instead of defining each separately * move oot output-type control to host.yaml instead of individual yamls * implement dungeon song shuffle * minor improvements to overworld dungeon item shuffle * remove random ice trap names in shops, mostly to avoid maintaining a massive censor list * always output patch file to folder, remove option to generate ROM in preparation for removal * re-add the fix for infinite recursion due to not being light or dark world * change AP-sendable to Ocarina of Time model, since the triforce piece has some extra code apparently * oot: remove item_names and location_names * oot: minor fixes * oot: comment out ROM patching * oot: only add CollectionState objects on creation if actually needed * main entrance shuffle method and entrances-based rules * fix entrances based rules * disable master quest and big poe count options for client compatibility * use get_player_name instead of get_player_names * fix OptionList * fix oot options for new option system * new coop section in oot rom: expand player names to 16 bytes, write AP_PLAYER_NAME at end of PLAYER_NAMES * fill AP player name in oot rom with 0 instead of 0xDF * encode player name with ASCII for fixed-width * revert oot player name array to 8 bytes per name * remove Pierre location if fast scarecrow is on * check player name length * "free_scarecrow" not "fast_scarecrow" * OoT locations now properly store the AP ID instead of the oot internal ID * oot __version__ updates in lockstep with AP version * pull in unmodified oot cosmetic files * also grab JSONDump since it's needed apparently * gather extra needed methods, modify imports * delete cosmetics log, replace all instances of SettingsList with OOTWorld * cosmetic options working, except for sound effects (due to ear-safe issues) * SFX, Music, and Fanfare randomization reenabled * move OoT data files into the worlds folder * move Compress and Decompress into oot data folder * Replace get_all_state with custom method to avoid the cache * OoT ROM: increment item counter before setting incoming item/player values to 0, preventing desync issues * set data_version to 0 * make Kokiri Sword shuffle off by default * reenable "Random Choice" for various cosmetic options * kill Ruto's Letter turnin if open fountain also fix for shopsanity * place Buy Goron/Zora Tunic first in shop shuffle * make ice traps appear as other items instead of breaking generation * managed to break ice traps on non-major-only * only handle ice traps if they are on * fix shopsanity for non-oot games, and write player name instead of player number * light arrows hint uses player name instead of player number * Reenable "skip child zelda" option * fix entrances_based_rules * fix ganondorf hint if starting with light arrows * fix dungeonitem shuffle and shopsanity interaction * remove has_all_of, has_any_of, count_of in BaseClasses, replace usage with has_all, has_any, has_group * force local giveable item on ZL if skip_child_zelda and shuffle_song_items is any * keep bosses and bombchu bowling chus out of data package * revert workaround for infinite recursion and fix it properly * fix shared shop id caches during patching process * fix shop text box overflows, as much as possible * add default oot host.yaml option * add .apz5, .n64, .z64 to gitignore * Properly document and name all (functioning) OOT options * clean up some imports * remove unnecessary files from oot's data * fix typo in gitignore * readd the Compress and Decompress utilities, since they are needed for generation * cleanup of imports and some minor optimizations * increase shop offset for item IDs to 0xCB * remove shop item AP ids entirely * prevent triforce pieces for other players from being received by yourself * add "excluded" property to Location * Hint system adapted and reenabled; hints still unseeded * make hints deterministic with lists instead of sets * do not allow hints to point to Light Arrows on non-vanilla bridge * foreign locations hint as their full name in OoT rather than their region * checkedLocations now stores hint names by player ID, so that the same location in different worlds can have hints associated * consolidate versioning in Utils * ice traps appear as major items rather than any progression item * set prescription and claim check as defaults for adult trade item settings * add oot options to playerSettings * allow case-insensitive logic tricks in yaml * fix oot shopsanity option formatting * Write OoT override info even if local item, enabling local checks to show up immediately in the client * implement CollectionState.can_live_dmg for oot glitched logic * filter item names for invalid characters when patching shops * make ice traps appear according to the settings of the world they are shuffled into, rather than the original world * set hidden-spoiler items and locations with Shop items to events * make GF carpenters, Gerudo Card, Malon, ZL, and Impa events if the relevant settings are enabled, preventing them from appearing in the client on game start * Fix oot Glitched and No Logic generation * fix indenting * Greatly reduce displayed cosmetic options * Change oot data version to 1 * add apz5 distribution to webhost * print player name if an ALttP dungeon contains a good item for OoT world * delete unneeded commented code * remove OcarinaSongs import to satisfy lint
2021-09-02 12:35:05 +00:00
# set up item pool
(pool, placed_items, skip_in_spoiler_locations) = get_pool_core(ootworld)
ootworld.itempool = [ootworld.create_item(item) for item in pool]
for (location_name, item) in placed_items.items():
location = world.get_location(location_name, player)
location.place_locked_item(ootworld.create_item(item))
Ocarina of Time (#64) * first commit (not including OoT data files yet) * added some basic options * rule parser works now at least * make sure to commit everything this time * temporary change to BaseClasses for oot * overworld location graph builds mostly correctly * adding oot data files * commenting out world options until later since they only existed to make the RuleParser work * conversion functions between AP ids and OOT ids * world graph outputs * set scrub prices * itempool generates, entrances connected, way too many options added * fixed set_rules and set_shop_rules * temp baseclasses changes * Reaches the fill step now, old event-based system retained in case the new way breaks * Song placements and misc fixes everywhere * temporary changes to make oot work * changed root exits for AP fill framework * prevent infinite recursion due to OoT sharing usage of the address field * age reachability works hopefully, songs are broken again * working spoiler log generation on beatable-only * Logic tricks implemented * need this for logic tricks * fixed map/compass being placed on Serenade location * kill unreachable events before filling the world * add a bunch of utility functions to prepare for rom patching * move OptionList into generic options * fixed some silly bugs with OptionList * properly seed all random behavior (so far) * ROM generation working * fix hints trying to get alttp dungeon hint texts * continue fixing hints * add oot to network data package * change item and location IDs to 66000 and 67000 range respectively * push removed items to precollected items * fixed various issues with cross-contamination with multiple world generation * reenable glitched logic (hopefully) * glitched world files age-check fix * cleaned up some get_locations calls * added token shuffle and scrub shuffle, modified some options slightly to make the parsing work * reenable MQ dungeons * fix forest mq exception * made targeting style an option for now, will be cosmetic later * reminder to move targeting to cosmetics * some oot option maintenance * enabled starting time of day * fixed issue breaking shop slots in multiworld generation * added "off" option for text shuffle and hints * shopsanity functionality restored * change patch file extension * remove unnecessary utility functions + imports * update MIT license * change option to "patch_uncompressed_rom" instead of "compress_rom" * compliance with new AutoWorld systems * Kill only internal events, remove non-internal big poe event in code * re-add the big poe event and handle it correctly * remove extra method in Range option * fix typo * Starting items, starting with consumables option * do not remove nonexistent item * move set_shop_rules to after shop items are placed * some cleanup * add retries for song placement * flagged Skull Mask and Mask of Truth as advancement items * update OoT to use LogicMixin * Fixed trying to assign starting items from the wrong players * fixed song retry step * improved option handling, comments, and starting item replacements * DefaultOnToggle writes Yes or No to spoiler * enable compression of output if Compress executable is present * clean up compression * check whether (de)compressor exists before running the process * allow specification of rom path in host.yaml * check if decompressed file already exists before decompressing again * fix triforce hunt generation * rename all the oot state functions with prefix * OoT: mark triforce pieces as completion goal for triforce hunt * added overworld and any-dungeon shuffle for dungeon items * Hide most unshuffled locations and events from the list of locations in spoiler * build oot option ranges with a generic function instead of defining each separately * move oot output-type control to host.yaml instead of individual yamls * implement dungeon song shuffle * minor improvements to overworld dungeon item shuffle * remove random ice trap names in shops, mostly to avoid maintaining a massive censor list * always output patch file to folder, remove option to generate ROM in preparation for removal * re-add the fix for infinite recursion due to not being light or dark world * change AP-sendable to Ocarina of Time model, since the triforce piece has some extra code apparently * oot: remove item_names and location_names * oot: minor fixes * oot: comment out ROM patching * oot: only add CollectionState objects on creation if actually needed * main entrance shuffle method and entrances-based rules * fix entrances based rules * disable master quest and big poe count options for client compatibility * use get_player_name instead of get_player_names * fix OptionList * fix oot options for new option system * new coop section in oot rom: expand player names to 16 bytes, write AP_PLAYER_NAME at end of PLAYER_NAMES * fill AP player name in oot rom with 0 instead of 0xDF * encode player name with ASCII for fixed-width * revert oot player name array to 8 bytes per name * remove Pierre location if fast scarecrow is on * check player name length * "free_scarecrow" not "fast_scarecrow" * OoT locations now properly store the AP ID instead of the oot internal ID * oot __version__ updates in lockstep with AP version * pull in unmodified oot cosmetic files * also grab JSONDump since it's needed apparently * gather extra needed methods, modify imports * delete cosmetics log, replace all instances of SettingsList with OOTWorld * cosmetic options working, except for sound effects (due to ear-safe issues) * SFX, Music, and Fanfare randomization reenabled * move OoT data files into the worlds folder * move Compress and Decompress into oot data folder * Replace get_all_state with custom method to avoid the cache * OoT ROM: increment item counter before setting incoming item/player values to 0, preventing desync issues * set data_version to 0 * make Kokiri Sword shuffle off by default * reenable "Random Choice" for various cosmetic options * kill Ruto's Letter turnin if open fountain also fix for shopsanity * place Buy Goron/Zora Tunic first in shop shuffle * make ice traps appear as other items instead of breaking generation * managed to break ice traps on non-major-only * only handle ice traps if they are on * fix shopsanity for non-oot games, and write player name instead of player number * light arrows hint uses player name instead of player number * Reenable "skip child zelda" option * fix entrances_based_rules * fix ganondorf hint if starting with light arrows * fix dungeonitem shuffle and shopsanity interaction * remove has_all_of, has_any_of, count_of in BaseClasses, replace usage with has_all, has_any, has_group * force local giveable item on ZL if skip_child_zelda and shuffle_song_items is any * keep bosses and bombchu bowling chus out of data package * revert workaround for infinite recursion and fix it properly * fix shared shop id caches during patching process * fix shop text box overflows, as much as possible * add default oot host.yaml option * add .apz5, .n64, .z64 to gitignore * Properly document and name all (functioning) OOT options * clean up some imports * remove unnecessary files from oot's data * fix typo in gitignore * readd the Compress and Decompress utilities, since they are needed for generation * cleanup of imports and some minor optimizations * increase shop offset for item IDs to 0xCB * remove shop item AP ids entirely * prevent triforce pieces for other players from being received by yourself * add "excluded" property to Location * Hint system adapted and reenabled; hints still unseeded * make hints deterministic with lists instead of sets * do not allow hints to point to Light Arrows on non-vanilla bridge * foreign locations hint as their full name in OoT rather than their region * checkedLocations now stores hint names by player ID, so that the same location in different worlds can have hints associated * consolidate versioning in Utils * ice traps appear as major items rather than any progression item * set prescription and claim check as defaults for adult trade item settings * add oot options to playerSettings * allow case-insensitive logic tricks in yaml * fix oot shopsanity option formatting * Write OoT override info even if local item, enabling local checks to show up immediately in the client * implement CollectionState.can_live_dmg for oot glitched logic * filter item names for invalid characters when patching shops * make ice traps appear according to the settings of the world they are shuffled into, rather than the original world * set hidden-spoiler items and locations with Shop items to events * make GF carpenters, Gerudo Card, Malon, ZL, and Impa events if the relevant settings are enabled, preventing them from appearing in the client on game start * Fix oot Glitched and No Logic generation * fix indenting * Greatly reduce displayed cosmetic options * Change oot data version to 1 * add apz5 distribution to webhost * print player name if an ALttP dungeon contains a good item for OoT world * delete unneeded commented code * remove OcarinaSongs import to satisfy lint
2021-09-02 12:35:05 +00:00
if location_name in skip_in_spoiler_locations:
location.show_in_spoiler = False
# def try_collect_heart_container(world, pool):
# if 'Heart Container' in pool:
# pool.remove('Heart Container')
# pool.extend(get_junk_item())
# world.state.collect(ItemFactory('Heart Container'))
# return True
# return False
# def try_collect_pieces_of_heart(world, pool):
# n = pool.count('Piece of Heart') + pool.count('Piece of Heart (Treasure Chest Game)')
# if n >= 4:
# for i in range(4):
# if 'Piece of Heart' in pool:
# pool.remove('Piece of Heart')
# world.state.collect(ItemFactory('Piece of Heart'))
# else:
# pool.remove('Piece of Heart (Treasure Chest Game)')
# world.state.collect(ItemFactory('Piece of Heart (Treasure Chest Game)'))
# pool.extend(get_junk_item())
# return True
# return False
# def collect_pieces_of_heart(world, pool):
# success = try_collect_pieces_of_heart(world, pool)
# if not success:
# try_collect_heart_container(world, pool)
# def collect_heart_container(world, pool):
# success = try_collect_heart_container(world, pool)
# if not success:
# try_collect_pieces_of_heart(world, pool)
def get_pool_core(world):
global random
pool = []
placed_items = {
'HC Zeldas Letter': 'Zeldas Letter',
}
skip_in_spoiler_locations = []
if world.shuffle_kokiri_sword:
pool.append('Kokiri Sword')
else:
placed_items['KF Kokiri Sword Chest'] = 'Kokiri Sword'
ruto_bottles = 1
if world.zora_fountain == 'open':
ruto_bottles = 0
elif world.item_pool_value == 'plentiful':
ruto_bottles += 1
if world.skip_child_zelda:
placed_items['HC Malon Egg'] = 'Recovery Heart'
skip_in_spoiler_locations.append('HC Malon Egg')
elif world.shuffle_weird_egg:
pool.append('Weird Egg')
else:
placed_items['HC Malon Egg'] = 'Weird Egg'
if world.shuffle_ocarinas:
pool.extend(['Ocarina'] * 2)
if world.item_pool_value == 'plentiful':
pending_junk_pool.append('Ocarina')
else:
placed_items['LW Gift from Saria'] = 'Ocarina'
placed_items['HF Ocarina of Time Item'] = 'Ocarina'
if world.shuffle_cows:
pool.extend(get_junk_item(10 if world.dungeon_mq['Jabu Jabus Belly'] else 9))
else:
cow_locations = ['LLR Stables Left Cow', 'LLR Stables Right Cow', 'LLR Tower Left Cow', 'LLR Tower Right Cow',
'KF Links House Cow', 'Kak Impas House Cow', 'GV Cow', 'DMT Cow Grotto Cow', 'HF Cow Grotto Cow']
if world.dungeon_mq['Jabu Jabus Belly']:
cow_locations.append('Jabu Jabus Belly MQ Cow')
for loc in cow_locations:
placed_items[loc] = 'Milk'
skip_in_spoiler_locations.append(loc)
if world.shuffle_beans:
pool.append('Magic Bean Pack')
if world.item_pool_value == 'plentiful':
pending_junk_pool.append('Magic Bean Pack')
else:
placed_items['ZR Magic Bean Salesman'] = 'Magic Bean'
skip_in_spoiler_locations.append('ZR Magic Bean Salesman')
if world.shuffle_medigoron_carpet_salesman:
pool.append('Giants Knife')
else:
placed_items['GC Medigoron'] = 'Giants Knife'
skip_in_spoiler_locations.append('GC Medigoron')
if world.dungeon_mq['Deku Tree']:
skulltula_locations_final = skulltula_locations + [
'Deku Tree MQ GS Lobby',
'Deku Tree MQ GS Compass Room',
'Deku Tree MQ GS Basement Graves Room',
'Deku Tree MQ GS Basement Back Room']
else:
skulltula_locations_final = skulltula_locations + [
'Deku Tree GS Compass Room',
'Deku Tree GS Basement Vines',
'Deku Tree GS Basement Gate',
'Deku Tree GS Basement Back Room']
if world.dungeon_mq['Dodongos Cavern']:
skulltula_locations_final.extend([
'Dodongos Cavern MQ GS Scrub Room',
'Dodongos Cavern MQ GS Song of Time Block Room',
'Dodongos Cavern MQ GS Lizalfos Room',
'Dodongos Cavern MQ GS Larvae Room',
'Dodongos Cavern MQ GS Back Area'])
else:
skulltula_locations_final.extend([
'Dodongos Cavern GS Side Room Near Lower Lizalfos',
'Dodongos Cavern GS Vines Above Stairs',
'Dodongos Cavern GS Back Room',
'Dodongos Cavern GS Alcove Above Stairs',
'Dodongos Cavern GS Scarecrow'])
if world.dungeon_mq['Jabu Jabus Belly']:
skulltula_locations_final.extend([
'Jabu Jabus Belly MQ GS Tailpasaran Room',
'Jabu Jabus Belly MQ GS Invisible Enemies Room',
'Jabu Jabus Belly MQ GS Boomerang Chest Room',
'Jabu Jabus Belly MQ GS Near Boss'])
else:
skulltula_locations_final.extend([
'Jabu Jabus Belly GS Water Switch Room',
'Jabu Jabus Belly GS Lobby Basement Lower',
'Jabu Jabus Belly GS Lobby Basement Upper',
'Jabu Jabus Belly GS Near Boss'])
if world.dungeon_mq['Forest Temple']:
skulltula_locations_final.extend([
'Forest Temple MQ GS First Hallway',
'Forest Temple MQ GS Block Push Room',
'Forest Temple MQ GS Raised Island Courtyard',
'Forest Temple MQ GS Level Island Courtyard',
'Forest Temple MQ GS Well'])
else:
skulltula_locations_final.extend([
'Forest Temple GS First Room',
'Forest Temple GS Lobby',
'Forest Temple GS Raised Island Courtyard',
'Forest Temple GS Level Island Courtyard',
'Forest Temple GS Basement'])
if world.dungeon_mq['Fire Temple']:
skulltula_locations_final.extend([
'Fire Temple MQ GS Above Fire Wall Maze',
'Fire Temple MQ GS Fire Wall Maze Center',
'Fire Temple MQ GS Big Lava Room Open Door',
'Fire Temple MQ GS Fire Wall Maze Side Room',
'Fire Temple MQ GS Skull On Fire'])
else:
skulltula_locations_final.extend([
'Fire Temple GS Song of Time Room',
'Fire Temple GS Boulder Maze',
'Fire Temple GS Scarecrow Climb',
'Fire Temple GS Scarecrow Top',
'Fire Temple GS Boss Key Loop'])
if world.dungeon_mq['Water Temple']:
skulltula_locations_final.extend([
'Water Temple MQ GS Before Upper Water Switch',
'Water Temple MQ GS Freestanding Key Area',
'Water Temple MQ GS Lizalfos Hallway',
'Water Temple MQ GS River',
'Water Temple MQ GS Triple Wall Torch'])
else:
skulltula_locations_final.extend([
'Water Temple GS Behind Gate',
'Water Temple GS River',
'Water Temple GS Falling Platform Room',
'Water Temple GS Central Pillar',
'Water Temple GS Near Boss Key Chest'])
if world.dungeon_mq['Spirit Temple']:
skulltula_locations_final.extend([
'Spirit Temple MQ GS Symphony Room',
'Spirit Temple MQ GS Leever Room',
'Spirit Temple MQ GS Nine Thrones Room West',
'Spirit Temple MQ GS Nine Thrones Room North',
'Spirit Temple MQ GS Sun Block Room'])
else:
skulltula_locations_final.extend([
'Spirit Temple GS Metal Fence',
'Spirit Temple GS Sun on Floor Room',
'Spirit Temple GS Hall After Sun Block Room',
'Spirit Temple GS Boulder Room',
'Spirit Temple GS Lobby'])
if world.dungeon_mq['Shadow Temple']:
skulltula_locations_final.extend([
'Shadow Temple MQ GS Falling Spikes Room',
'Shadow Temple MQ GS Wind Hint Room',
'Shadow Temple MQ GS After Wind',
'Shadow Temple MQ GS After Ship',
'Shadow Temple MQ GS Near Boss'])
else:
skulltula_locations_final.extend([
'Shadow Temple GS Like Like Room',
'Shadow Temple GS Falling Spikes Room',
'Shadow Temple GS Single Giant Pot',
'Shadow Temple GS Near Ship',
'Shadow Temple GS Triple Giant Pot'])
if world.dungeon_mq['Bottom of the Well']:
skulltula_locations_final.extend([
'Bottom of the Well MQ GS Basement',
'Bottom of the Well MQ GS Coffin Room',
'Bottom of the Well MQ GS West Inner Room'])
else:
skulltula_locations_final.extend([
'Bottom of the Well GS West Inner Room',
'Bottom of the Well GS East Inner Room',
'Bottom of the Well GS Like Like Cage'])
if world.dungeon_mq['Ice Cavern']:
skulltula_locations_final.extend([
'Ice Cavern MQ GS Scarecrow',
'Ice Cavern MQ GS Ice Block',
'Ice Cavern MQ GS Red Ice'])
else:
skulltula_locations_final.extend([
'Ice Cavern GS Spinning Scythe Room',
'Ice Cavern GS Heart Piece Room',
'Ice Cavern GS Push Block Room'])
if world.tokensanity == 'off':
for location in skulltula_locations_final:
placed_items[location] = 'Gold Skulltula Token'
skip_in_spoiler_locations.append(location)
elif world.tokensanity == 'dungeons':
for location in skulltula_locations_final:
if world.get_location(location).scene >= 0x0A:
placed_items[location] = 'Gold Skulltula Token'
skip_in_spoiler_locations.append(location)
else:
pool.append('Gold Skulltula Token')
elif world.tokensanity == 'overworld':
for location in skulltula_locations_final:
if world.get_location(location).scene < 0x0A:
placed_items[location] = 'Gold Skulltula Token'
skip_in_spoiler_locations.append(location)
else:
pool.append('Gold Skulltula Token')
else:
pool.extend(['Gold Skulltula Token'] * 100)
if world.bombchus_in_logic:
pool.extend(['Bombchus'] * 4)
if world.dungeon_mq['Jabu Jabus Belly']:
pool.extend(['Bombchus'])
if world.dungeon_mq['Spirit Temple']:
pool.extend(['Bombchus'] * 2)
if not world.dungeon_mq['Bottom of the Well']:
pool.extend(['Bombchus'])
if world.dungeon_mq['Gerudo Training Grounds']:
pool.extend(['Bombchus'])
if world.shuffle_medigoron_carpet_salesman:
pool.append('Bombchus')
else:
pool.extend(['Bombchus (5)'] + ['Bombchus (10)'] * 2)
if world.dungeon_mq['Jabu Jabus Belly']:
pool.extend(['Bombchus (10)'])
if world.dungeon_mq['Spirit Temple']:
pool.extend(['Bombchus (10)'] * 2)
if not world.dungeon_mq['Bottom of the Well']:
pool.extend(['Bombchus (10)'])
if world.dungeon_mq['Gerudo Training Grounds']:
pool.extend(['Bombchus (10)'])
if world.dungeon_mq['Ganons Castle']:
pool.extend(['Bombchus (10)'])
else:
pool.extend(['Bombchus (20)'])
if world.shuffle_medigoron_carpet_salesman:
pool.append('Bombchus (10)')
if not world.shuffle_medigoron_carpet_salesman:
placed_items['Wasteland Bombchu Salesman'] = 'Bombchus (10)'
skip_in_spoiler_locations.append('Wasteland Bombchu Salesman')
pool.extend(['Ice Trap'])
if not world.dungeon_mq['Gerudo Training Grounds']:
pool.extend(['Ice Trap'])
if not world.dungeon_mq['Ganons Castle']:
pool.extend(['Ice Trap'] * 4)
if world.gerudo_fortress == 'open':
placed_items['GF North F1 Carpenter'] = 'Recovery Heart'
placed_items['GF North F2 Carpenter'] = 'Recovery Heart'
placed_items['GF South F1 Carpenter'] = 'Recovery Heart'
placed_items['GF South F2 Carpenter'] = 'Recovery Heart'
skip_in_spoiler_locations.extend(['GF North F1 Carpenter', 'GF North F2 Carpenter', 'GF South F1 Carpenter', 'GF South F2 Carpenter'])
elif world.shuffle_fortresskeys in ['any_dungeon', 'overworld', 'keysanity']:
if world.gerudo_fortress == 'fast':
pool.append('Small Key (Gerudo Fortress)')
placed_items['GF North F2 Carpenter'] = 'Recovery Heart'
placed_items['GF South F1 Carpenter'] = 'Recovery Heart'
placed_items['GF South F2 Carpenter'] = 'Recovery Heart'
skip_in_spoiler_locations.extend(['GF North F2 Carpenter', 'GF South F1 Carpenter', 'GF South F2 Carpenter'])
else:
pool.extend(['Small Key (Gerudo Fortress)'] * 4)
if world.item_pool_value == 'plentiful':
pending_junk_pool.append('Small Key (Gerudo Fortress)')
else:
if world.gerudo_fortress == 'fast':
placed_items['GF North F1 Carpenter'] = 'Small Key (Gerudo Fortress)'
placed_items['GF North F2 Carpenter'] = 'Recovery Heart'
placed_items['GF South F1 Carpenter'] = 'Recovery Heart'
placed_items['GF South F2 Carpenter'] = 'Recovery Heart'
skip_in_spoiler_locations.extend(['GF North F2 Carpenter', 'GF South F1 Carpenter', 'GF South F2 Carpenter'])
else:
placed_items['GF North F1 Carpenter'] = 'Small Key (Gerudo Fortress)'
placed_items['GF North F2 Carpenter'] = 'Small Key (Gerudo Fortress)'
placed_items['GF South F1 Carpenter'] = 'Small Key (Gerudo Fortress)'
placed_items['GF South F2 Carpenter'] = 'Small Key (Gerudo Fortress)'
if world.shuffle_gerudo_card and world.gerudo_fortress != 'open':
pool.append('Gerudo Membership Card')
elif world.shuffle_gerudo_card:
pending_junk_pool.append('Gerudo Membership Card')
placed_items['GF Gerudo Membership Card'] = 'Ice Trap'
skip_in_spoiler_locations.append('GF Gerudo Membership Card')
else:
placed_items['GF Gerudo Membership Card'] = 'Gerudo Membership Card'
if world.shuffle_gerudo_card and world.item_pool_value == 'plentiful':
pending_junk_pool.append('Gerudo Membership Card')
if world.item_pool_value == 'plentiful' and world.shuffle_smallkeys in ['any_dungeon', 'overworld', 'keysanity']:
pending_junk_pool.append('Small Key (Bottom of the Well)')
pending_junk_pool.append('Small Key (Forest Temple)')
pending_junk_pool.append('Small Key (Fire Temple)')
pending_junk_pool.append('Small Key (Water Temple)')
pending_junk_pool.append('Small Key (Shadow Temple)')
pending_junk_pool.append('Small Key (Spirit Temple)')
pending_junk_pool.append('Small Key (Gerudo Training Grounds)')
pending_junk_pool.append('Small Key (Ganons Castle)')
if world.item_pool_value == 'plentiful' and world.shuffle_bosskeys in ['any_dungeon', 'overworld', 'keysanity']:
pending_junk_pool.append('Boss Key (Forest Temple)')
pending_junk_pool.append('Boss Key (Fire Temple)')
pending_junk_pool.append('Boss Key (Water Temple)')
pending_junk_pool.append('Boss Key (Shadow Temple)')
pending_junk_pool.append('Boss Key (Spirit Temple)')
if world.item_pool_value == 'plentiful' and world.shuffle_ganon_bosskey in ['any_dungeon', 'overworld', 'keysanity']:
pending_junk_pool.append('Boss Key (Ganons Castle)')
if world.shopsanity == 'off':
placed_items.update(vanilla_shop_items)
if world.bombchus_in_logic:
placed_items['KF Shop Item 8'] = 'Buy Bombchu (5)'
placed_items['Market Bazaar Item 4'] = 'Buy Bombchu (5)'
placed_items['Kak Bazaar Item 4'] = 'Buy Bombchu (5)'
pool.extend(normal_rupees)
skip_in_spoiler_locations.extend(vanilla_shop_items.keys())
if world.bombchus_in_logic:
skip_in_spoiler_locations.remove('KF Shop Item 8')
skip_in_spoiler_locations.remove('Market Bazaar Item 4')
skip_in_spoiler_locations.remove('Kak Bazaar Item 4')
else:
remain_shop_items = list(vanilla_shop_items.values())
pool.extend(min_shop_items)
for item in min_shop_items:
remain_shop_items.remove(item)
shop_slots_count = len(remain_shop_items)
shop_nonitem_count = len(world.shop_prices)
shop_item_count = shop_slots_count - shop_nonitem_count
pool.extend(random.sample(remain_shop_items, shop_item_count))
if shop_nonitem_count:
pool.extend(get_junk_item(shop_nonitem_count))
if world.shopsanity == '0':
pool.extend(normal_rupees)
else:
pool.extend(shopsanity_rupees)
if world.shuffle_scrubs != 'off':
if world.dungeon_mq['Deku Tree']:
pool.append('Deku Shield')
if world.dungeon_mq['Dodongos Cavern']:
pool.extend(['Deku Stick (1)', 'Deku Shield', 'Recovery Heart'])
else:
pool.extend(['Deku Nuts (5)', 'Deku Stick (1)', 'Deku Shield'])
if not world.dungeon_mq['Jabu Jabus Belly']:
pool.append('Deku Nuts (5)')
if world.dungeon_mq['Ganons Castle']:
pool.extend(['Bombs (5)', 'Recovery Heart', 'Rupees (5)', 'Deku Nuts (5)'])
else:
pool.extend(['Bombs (5)', 'Recovery Heart', 'Rupees (5)'])
pool.extend(deku_scrubs_items)
for _ in range(7):
pool.append('Arrows (30)' if random.randint(0,3) > 0 else 'Deku Seeds (30)')
else:
if world.dungeon_mq['Deku Tree']:
placed_items['Deku Tree MQ Deku Scrub'] = 'Buy Deku Shield'
skip_in_spoiler_locations.append('Deku Tree MQ Deku Scrub')
if world.dungeon_mq['Dodongos Cavern']:
placed_items['Dodongos Cavern MQ Deku Scrub Lobby Rear'] = 'Buy Deku Stick (1)'
placed_items['Dodongos Cavern MQ Deku Scrub Lobby Front'] = 'Buy Deku Seeds (30)'
placed_items['Dodongos Cavern MQ Deku Scrub Staircase'] = 'Buy Deku Shield'
placed_items['Dodongos Cavern MQ Deku Scrub Side Room Near Lower Lizalfos'] = 'Buy Red Potion [30]'
skip_in_spoiler_locations.extend(['Dodongos Cavern MQ Deku Scrub Lobby Rear',
'Dodongos Cavern MQ Deku Scrub Lobby Front',
'Dodongos Cavern MQ Deku Scrub Staircase',
'Dodongos Cavern MQ Deku Scrub Side Room Near Lower Lizalfos'])
else:
placed_items['Dodongos Cavern Deku Scrub Near Bomb Bag Left'] = 'Buy Deku Nut (5)'
placed_items['Dodongos Cavern Deku Scrub Side Room Near Dodongos'] = 'Buy Deku Stick (1)'
placed_items['Dodongos Cavern Deku Scrub Near Bomb Bag Right'] = 'Buy Deku Seeds (30)'
placed_items['Dodongos Cavern Deku Scrub Lobby'] = 'Buy Deku Shield'
skip_in_spoiler_locations.extend(['Dodongos Cavern Deku Scrub Near Bomb Bag Left',
'Dodongos Cavern Deku Scrub Side Room Near Dodongos',
'Dodongos Cavern Deku Scrub Near Bomb Bag Right',
'Dodongos Cavern Deku Scrub Lobby'])
if not world.dungeon_mq['Jabu Jabus Belly']:
placed_items['Jabu Jabus Belly Deku Scrub'] = 'Buy Deku Nut (5)'
skip_in_spoiler_locations.append('Jabu Jabus Belly Deku Scrub')
if world.dungeon_mq['Ganons Castle']:
placed_items['Ganons Castle MQ Deku Scrub Right'] = 'Buy Deku Nut (5)'
placed_items['Ganons Castle MQ Deku Scrub Center-Left'] = 'Buy Bombs (5) [35]'
placed_items['Ganons Castle MQ Deku Scrub Center'] = 'Buy Arrows (30)'
placed_items['Ganons Castle MQ Deku Scrub Center-Right'] = 'Buy Red Potion [30]'
placed_items['Ganons Castle MQ Deku Scrub Left'] = 'Buy Green Potion'
skip_in_spoiler_locations.extend(['Ganons Castle MQ Deku Scrub Right',
'Ganons Castle MQ Deku Scrub Center-Left',
'Ganons Castle MQ Deku Scrub Center',
'Ganons Castle MQ Deku Scrub Center-Right',
'Ganons Castle MQ Deku Scrub Left'])
else:
placed_items['Ganons Castle Deku Scrub Center-Left'] = 'Buy Bombs (5) [35]'
placed_items['Ganons Castle Deku Scrub Center-Right'] = 'Buy Arrows (30)'
placed_items['Ganons Castle Deku Scrub Right'] = 'Buy Red Potion [30]'
placed_items['Ganons Castle Deku Scrub Left'] = 'Buy Green Potion'
skip_in_spoiler_locations.extend(['Ganons Castle Deku Scrub Right',
'Ganons Castle Deku Scrub Center-Left',
'Ganons Castle Deku Scrub Center-Right',
'Ganons Castle Deku Scrub Left'])
placed_items.update(vanilla_deku_scrubs)
skip_in_spoiler_locations.extend(vanilla_deku_scrubs.keys())
pool.extend(alwaysitems)
if world.dungeon_mq['Deku Tree']:
pool.extend(DT_MQ)
else:
pool.extend(DT_vanilla)
if world.dungeon_mq['Dodongos Cavern']:
pool.extend(DC_MQ)
else:
pool.extend(DC_vanilla)
if world.dungeon_mq['Jabu Jabus Belly']:
pool.extend(JB_MQ)
if world.dungeon_mq['Forest Temple']:
pool.extend(FoT_MQ)
else:
pool.extend(FoT_vanilla)
if world.dungeon_mq['Fire Temple']:
pool.extend(FiT_MQ)
else:
pool.extend(FiT_vanilla)
if world.dungeon_mq['Spirit Temple']:
pool.extend(SpT_MQ)
else:
pool.extend(SpT_vanilla)
if world.dungeon_mq['Shadow Temple']:
pool.extend(ShT_MQ)
else:
pool.extend(ShT_vanilla)
if not world.dungeon_mq['Bottom of the Well']:
pool.extend(BW_vanilla)
if world.dungeon_mq['Gerudo Training Grounds']:
pool.extend(GTG_MQ)
else:
pool.extend(GTG_vanilla)
if world.dungeon_mq['Ganons Castle']:
pool.extend(GC_MQ)
else:
pool.extend(GC_vanilla)
for i in range(bottle_count):
if i >= ruto_bottles:
bottle = random.choice(normal_bottles)
pool.append(bottle)
else:
pool.append('Rutos Letter')
earliest_trade = tradeitemoptions.index(world.logic_earliest_adult_trade)
latest_trade = tradeitemoptions.index(world.logic_latest_adult_trade)
if earliest_trade > latest_trade:
earliest_trade, latest_trade = latest_trade, earliest_trade
tradeitem = random.choice(tradeitems[earliest_trade:latest_trade+1])
world.selected_adult_trade_item = tradeitem
pool.append(tradeitem)
pool.extend(songlist)
if world.shuffle_song_items == 'any' and world.item_pool_value == 'plentiful':
pending_junk_pool.extend(songlist)
if world.free_scarecrow:
item = world.create_item('Scarecrow Song')
world.world.push_precollected(item)
world.remove_from_start_inventory.append(item.name)
if world.no_epona_race:
item = world.create_item('Epona')
world.world.push_precollected(item)
world.remove_from_start_inventory.append(item.name)
if world.shuffle_mapcompass == 'remove' or world.shuffle_mapcompass == 'startwith':
for item in [item for dungeon in world.dungeons for item in dungeon.dungeon_items]:
world.world.push_precollected(item)
world.remove_from_start_inventory.append(item.name)
pool.extend(get_junk_item())
if world.shuffle_smallkeys == 'remove':
for item in [item for dungeon in world.dungeons for item in dungeon.small_keys]:
world.world.push_precollected(item)
world.remove_from_start_inventory.append(item.name)
pool.extend(get_junk_item())
if world.shuffle_bosskeys == 'remove':
for item in [item for dungeon in world.dungeons if dungeon.name != 'Ganons Castle' for item in dungeon.boss_key]:
world.world.push_precollected(item)
world.remove_from_start_inventory.append(item.name)
pool.extend(get_junk_item())
if world.shuffle_ganon_bosskey in ['remove', 'triforce']:
for item in [item for dungeon in world.dungeons if dungeon.name == 'Ganons Castle' for item in dungeon.boss_key]:
world.world.push_precollected(item)
world.remove_from_start_inventory.append(item.name)
pool.extend(get_junk_item())
if world.shuffle_mapcompass == 'vanilla':
for location, item in vanillaMC.items():
try:
world.get_location(location)
placed_items[location] = item
except KeyError:
continue
if world.shuffle_smallkeys == 'vanilla':
for location, item in vanillaSK.items():
try:
world.get_location(location)
placed_items[location] = item
except KeyError:
continue
# Logic cannot handle vanilla key layout in some dungeons
# this is because vanilla expects the dungeon major item to be
# locked behind the keys, which is not always true in rando.
# We can resolve this by starting with some extra keys
if world.dungeon_mq['Spirit Temple']:
# Yes somehow you need 3 keys. This dungeon is bonkers
2021-11-21 06:31:44 +00:00
items = [world.create_item('Small Key (Spirit Temple)') for i in range(3)]
for item in items:
world.world.push_precollected(item)
world.remove_from_start_inventory.append(item.name)
Ocarina of Time (#64) * first commit (not including OoT data files yet) * added some basic options * rule parser works now at least * make sure to commit everything this time * temporary change to BaseClasses for oot * overworld location graph builds mostly correctly * adding oot data files * commenting out world options until later since they only existed to make the RuleParser work * conversion functions between AP ids and OOT ids * world graph outputs * set scrub prices * itempool generates, entrances connected, way too many options added * fixed set_rules and set_shop_rules * temp baseclasses changes * Reaches the fill step now, old event-based system retained in case the new way breaks * Song placements and misc fixes everywhere * temporary changes to make oot work * changed root exits for AP fill framework * prevent infinite recursion due to OoT sharing usage of the address field * age reachability works hopefully, songs are broken again * working spoiler log generation on beatable-only * Logic tricks implemented * need this for logic tricks * fixed map/compass being placed on Serenade location * kill unreachable events before filling the world * add a bunch of utility functions to prepare for rom patching * move OptionList into generic options * fixed some silly bugs with OptionList * properly seed all random behavior (so far) * ROM generation working * fix hints trying to get alttp dungeon hint texts * continue fixing hints * add oot to network data package * change item and location IDs to 66000 and 67000 range respectively * push removed items to precollected items * fixed various issues with cross-contamination with multiple world generation * reenable glitched logic (hopefully) * glitched world files age-check fix * cleaned up some get_locations calls * added token shuffle and scrub shuffle, modified some options slightly to make the parsing work * reenable MQ dungeons * fix forest mq exception * made targeting style an option for now, will be cosmetic later * reminder to move targeting to cosmetics * some oot option maintenance * enabled starting time of day * fixed issue breaking shop slots in multiworld generation * added "off" option for text shuffle and hints * shopsanity functionality restored * change patch file extension * remove unnecessary utility functions + imports * update MIT license * change option to "patch_uncompressed_rom" instead of "compress_rom" * compliance with new AutoWorld systems * Kill only internal events, remove non-internal big poe event in code * re-add the big poe event and handle it correctly * remove extra method in Range option * fix typo * Starting items, starting with consumables option * do not remove nonexistent item * move set_shop_rules to after shop items are placed * some cleanup * add retries for song placement * flagged Skull Mask and Mask of Truth as advancement items * update OoT to use LogicMixin * Fixed trying to assign starting items from the wrong players * fixed song retry step * improved option handling, comments, and starting item replacements * DefaultOnToggle writes Yes or No to spoiler * enable compression of output if Compress executable is present * clean up compression * check whether (de)compressor exists before running the process * allow specification of rom path in host.yaml * check if decompressed file already exists before decompressing again * fix triforce hunt generation * rename all the oot state functions with prefix * OoT: mark triforce pieces as completion goal for triforce hunt * added overworld and any-dungeon shuffle for dungeon items * Hide most unshuffled locations and events from the list of locations in spoiler * build oot option ranges with a generic function instead of defining each separately * move oot output-type control to host.yaml instead of individual yamls * implement dungeon song shuffle * minor improvements to overworld dungeon item shuffle * remove random ice trap names in shops, mostly to avoid maintaining a massive censor list * always output patch file to folder, remove option to generate ROM in preparation for removal * re-add the fix for infinite recursion due to not being light or dark world * change AP-sendable to Ocarina of Time model, since the triforce piece has some extra code apparently * oot: remove item_names and location_names * oot: minor fixes * oot: comment out ROM patching * oot: only add CollectionState objects on creation if actually needed * main entrance shuffle method and entrances-based rules * fix entrances based rules * disable master quest and big poe count options for client compatibility * use get_player_name instead of get_player_names * fix OptionList * fix oot options for new option system * new coop section in oot rom: expand player names to 16 bytes, write AP_PLAYER_NAME at end of PLAYER_NAMES * fill AP player name in oot rom with 0 instead of 0xDF * encode player name with ASCII for fixed-width * revert oot player name array to 8 bytes per name * remove Pierre location if fast scarecrow is on * check player name length * "free_scarecrow" not "fast_scarecrow" * OoT locations now properly store the AP ID instead of the oot internal ID * oot __version__ updates in lockstep with AP version * pull in unmodified oot cosmetic files * also grab JSONDump since it's needed apparently * gather extra needed methods, modify imports * delete cosmetics log, replace all instances of SettingsList with OOTWorld * cosmetic options working, except for sound effects (due to ear-safe issues) * SFX, Music, and Fanfare randomization reenabled * move OoT data files into the worlds folder * move Compress and Decompress into oot data folder * Replace get_all_state with custom method to avoid the cache * OoT ROM: increment item counter before setting incoming item/player values to 0, preventing desync issues * set data_version to 0 * make Kokiri Sword shuffle off by default * reenable "Random Choice" for various cosmetic options * kill Ruto's Letter turnin if open fountain also fix for shopsanity * place Buy Goron/Zora Tunic first in shop shuffle * make ice traps appear as other items instead of breaking generation * managed to break ice traps on non-major-only * only handle ice traps if they are on * fix shopsanity for non-oot games, and write player name instead of player number * light arrows hint uses player name instead of player number * Reenable "skip child zelda" option * fix entrances_based_rules * fix ganondorf hint if starting with light arrows * fix dungeonitem shuffle and shopsanity interaction * remove has_all_of, has_any_of, count_of in BaseClasses, replace usage with has_all, has_any, has_group * force local giveable item on ZL if skip_child_zelda and shuffle_song_items is any * keep bosses and bombchu bowling chus out of data package * revert workaround for infinite recursion and fix it properly * fix shared shop id caches during patching process * fix shop text box overflows, as much as possible * add default oot host.yaml option * add .apz5, .n64, .z64 to gitignore * Properly document and name all (functioning) OOT options * clean up some imports * remove unnecessary files from oot's data * fix typo in gitignore * readd the Compress and Decompress utilities, since they are needed for generation * cleanup of imports and some minor optimizations * increase shop offset for item IDs to 0xCB * remove shop item AP ids entirely * prevent triforce pieces for other players from being received by yourself * add "excluded" property to Location * Hint system adapted and reenabled; hints still unseeded * make hints deterministic with lists instead of sets * do not allow hints to point to Light Arrows on non-vanilla bridge * foreign locations hint as their full name in OoT rather than their region * checkedLocations now stores hint names by player ID, so that the same location in different worlds can have hints associated * consolidate versioning in Utils * ice traps appear as major items rather than any progression item * set prescription and claim check as defaults for adult trade item settings * add oot options to playerSettings * allow case-insensitive logic tricks in yaml * fix oot shopsanity option formatting * Write OoT override info even if local item, enabling local checks to show up immediately in the client * implement CollectionState.can_live_dmg for oot glitched logic * filter item names for invalid characters when patching shops * make ice traps appear according to the settings of the world they are shuffled into, rather than the original world * set hidden-spoiler items and locations with Shop items to events * make GF carpenters, Gerudo Card, Malon, ZL, and Impa events if the relevant settings are enabled, preventing them from appearing in the client on game start * Fix oot Glitched and No Logic generation * fix indenting * Greatly reduce displayed cosmetic options * Change oot data version to 1 * add apz5 distribution to webhost * print player name if an ALttP dungeon contains a good item for OoT world * delete unneeded commented code * remove OcarinaSongs import to satisfy lint
2021-09-02 12:35:05 +00:00
#if not world.dungeon_mq['Fire Temple']:
# world.state.collect(ItemFactory('Small Key (Fire Temple)'))
if world.shuffle_bosskeys == 'vanilla':
for location, item in vanillaBK.items():
try:
world.get_location(location)
placed_items[location] = item
except KeyError:
continue
if not world.keysanity and not world.dungeon_mq['Fire Temple']:
item = world.create_item('Small Key (Fire Temple)')
world.world.push_precollected(item)
world.remove_from_start_inventory.append(item.name)
if world.triforce_hunt:
triforce_count = int((Decimal(100 + world.extra_triforce_percentage)/100 * world.triforce_goal).to_integral_value(rounding=ROUND_HALF_UP))
Ocarina of Time (#64) * first commit (not including OoT data files yet) * added some basic options * rule parser works now at least * make sure to commit everything this time * temporary change to BaseClasses for oot * overworld location graph builds mostly correctly * adding oot data files * commenting out world options until later since they only existed to make the RuleParser work * conversion functions between AP ids and OOT ids * world graph outputs * set scrub prices * itempool generates, entrances connected, way too many options added * fixed set_rules and set_shop_rules * temp baseclasses changes * Reaches the fill step now, old event-based system retained in case the new way breaks * Song placements and misc fixes everywhere * temporary changes to make oot work * changed root exits for AP fill framework * prevent infinite recursion due to OoT sharing usage of the address field * age reachability works hopefully, songs are broken again * working spoiler log generation on beatable-only * Logic tricks implemented * need this for logic tricks * fixed map/compass being placed on Serenade location * kill unreachable events before filling the world * add a bunch of utility functions to prepare for rom patching * move OptionList into generic options * fixed some silly bugs with OptionList * properly seed all random behavior (so far) * ROM generation working * fix hints trying to get alttp dungeon hint texts * continue fixing hints * add oot to network data package * change item and location IDs to 66000 and 67000 range respectively * push removed items to precollected items * fixed various issues with cross-contamination with multiple world generation * reenable glitched logic (hopefully) * glitched world files age-check fix * cleaned up some get_locations calls * added token shuffle and scrub shuffle, modified some options slightly to make the parsing work * reenable MQ dungeons * fix forest mq exception * made targeting style an option for now, will be cosmetic later * reminder to move targeting to cosmetics * some oot option maintenance * enabled starting time of day * fixed issue breaking shop slots in multiworld generation * added "off" option for text shuffle and hints * shopsanity functionality restored * change patch file extension * remove unnecessary utility functions + imports * update MIT license * change option to "patch_uncompressed_rom" instead of "compress_rom" * compliance with new AutoWorld systems * Kill only internal events, remove non-internal big poe event in code * re-add the big poe event and handle it correctly * remove extra method in Range option * fix typo * Starting items, starting with consumables option * do not remove nonexistent item * move set_shop_rules to after shop items are placed * some cleanup * add retries for song placement * flagged Skull Mask and Mask of Truth as advancement items * update OoT to use LogicMixin * Fixed trying to assign starting items from the wrong players * fixed song retry step * improved option handling, comments, and starting item replacements * DefaultOnToggle writes Yes or No to spoiler * enable compression of output if Compress executable is present * clean up compression * check whether (de)compressor exists before running the process * allow specification of rom path in host.yaml * check if decompressed file already exists before decompressing again * fix triforce hunt generation * rename all the oot state functions with prefix * OoT: mark triforce pieces as completion goal for triforce hunt * added overworld and any-dungeon shuffle for dungeon items * Hide most unshuffled locations and events from the list of locations in spoiler * build oot option ranges with a generic function instead of defining each separately * move oot output-type control to host.yaml instead of individual yamls * implement dungeon song shuffle * minor improvements to overworld dungeon item shuffle * remove random ice trap names in shops, mostly to avoid maintaining a massive censor list * always output patch file to folder, remove option to generate ROM in preparation for removal * re-add the fix for infinite recursion due to not being light or dark world * change AP-sendable to Ocarina of Time model, since the triforce piece has some extra code apparently * oot: remove item_names and location_names * oot: minor fixes * oot: comment out ROM patching * oot: only add CollectionState objects on creation if actually needed * main entrance shuffle method and entrances-based rules * fix entrances based rules * disable master quest and big poe count options for client compatibility * use get_player_name instead of get_player_names * fix OptionList * fix oot options for new option system * new coop section in oot rom: expand player names to 16 bytes, write AP_PLAYER_NAME at end of PLAYER_NAMES * fill AP player name in oot rom with 0 instead of 0xDF * encode player name with ASCII for fixed-width * revert oot player name array to 8 bytes per name * remove Pierre location if fast scarecrow is on * check player name length * "free_scarecrow" not "fast_scarecrow" * OoT locations now properly store the AP ID instead of the oot internal ID * oot __version__ updates in lockstep with AP version * pull in unmodified oot cosmetic files * also grab JSONDump since it's needed apparently * gather extra needed methods, modify imports * delete cosmetics log, replace all instances of SettingsList with OOTWorld * cosmetic options working, except for sound effects (due to ear-safe issues) * SFX, Music, and Fanfare randomization reenabled * move OoT data files into the worlds folder * move Compress and Decompress into oot data folder * Replace get_all_state with custom method to avoid the cache * OoT ROM: increment item counter before setting incoming item/player values to 0, preventing desync issues * set data_version to 0 * make Kokiri Sword shuffle off by default * reenable "Random Choice" for various cosmetic options * kill Ruto's Letter turnin if open fountain also fix for shopsanity * place Buy Goron/Zora Tunic first in shop shuffle * make ice traps appear as other items instead of breaking generation * managed to break ice traps on non-major-only * only handle ice traps if they are on * fix shopsanity for non-oot games, and write player name instead of player number * light arrows hint uses player name instead of player number * Reenable "skip child zelda" option * fix entrances_based_rules * fix ganondorf hint if starting with light arrows * fix dungeonitem shuffle and shopsanity interaction * remove has_all_of, has_any_of, count_of in BaseClasses, replace usage with has_all, has_any, has_group * force local giveable item on ZL if skip_child_zelda and shuffle_song_items is any * keep bosses and bombchu bowling chus out of data package * revert workaround for infinite recursion and fix it properly * fix shared shop id caches during patching process * fix shop text box overflows, as much as possible * add default oot host.yaml option * add .apz5, .n64, .z64 to gitignore * Properly document and name all (functioning) OOT options * clean up some imports * remove unnecessary files from oot's data * fix typo in gitignore * readd the Compress and Decompress utilities, since they are needed for generation * cleanup of imports and some minor optimizations * increase shop offset for item IDs to 0xCB * remove shop item AP ids entirely * prevent triforce pieces for other players from being received by yourself * add "excluded" property to Location * Hint system adapted and reenabled; hints still unseeded * make hints deterministic with lists instead of sets * do not allow hints to point to Light Arrows on non-vanilla bridge * foreign locations hint as their full name in OoT rather than their region * checkedLocations now stores hint names by player ID, so that the same location in different worlds can have hints associated * consolidate versioning in Utils * ice traps appear as major items rather than any progression item * set prescription and claim check as defaults for adult trade item settings * add oot options to playerSettings * allow case-insensitive logic tricks in yaml * fix oot shopsanity option formatting * Write OoT override info even if local item, enabling local checks to show up immediately in the client * implement CollectionState.can_live_dmg for oot glitched logic * filter item names for invalid characters when patching shops * make ice traps appear according to the settings of the world they are shuffled into, rather than the original world * set hidden-spoiler items and locations with Shop items to events * make GF carpenters, Gerudo Card, Malon, ZL, and Impa events if the relevant settings are enabled, preventing them from appearing in the client on game start * Fix oot Glitched and No Logic generation * fix indenting * Greatly reduce displayed cosmetic options * Change oot data version to 1 * add apz5 distribution to webhost * print player name if an ALttP dungeon contains a good item for OoT world * delete unneeded commented code * remove OcarinaSongs import to satisfy lint
2021-09-02 12:35:05 +00:00
pending_junk_pool.extend(['Triforce Piece'] * triforce_count)
if world.shuffle_ganon_bosskey == 'on_lacs':
placed_items['ToT Light Arrows Cutscene'] = 'Boss Key (Ganons Castle)'
elif world.shuffle_ganon_bosskey == 'vanilla':
placed_items['Ganons Tower Boss Key Chest'] = 'Boss Key (Ganons Castle)'
if world.item_pool_value == 'plentiful':
pool.extend(easy_items)
else:
pool.extend(normal_items)
if not world.shuffle_kokiri_sword:
replace_max_item(pool, 'Kokiri Sword', 0)
if world.junk_ice_traps == 'off':
replace_max_item(pool, 'Ice Trap', 0)
elif world.junk_ice_traps == 'onslaught':
for item in [item for item, weight in junk_pool_base] + ['Recovery Heart', 'Bombs (20)', 'Arrows (30)']:
replace_max_item(pool, item, 0)
for item,max in item_difficulty_max[world.item_pool_value].items():
replace_max_item(pool, item, max)
if world.damage_multiplier in ['ohko', 'quadruple'] and world.item_pool_value == 'minimal':
pending_junk_pool.append('Nayrus Love')
# world.distribution.alter_pool(world, pool)
# Make sure our pending_junk_pool is empty. If not, remove some random junk here.
if pending_junk_pool:
remove_junk_pool, _ = zip(*junk_pool_base)
# Omits Rupees (200) and Deku Nuts (10)
remove_junk_pool = list(remove_junk_pool) + ['Recovery Heart', 'Bombs (20)', 'Arrows (30)', 'Ice Trap']
junk_candidates = [item for item in pool if item in remove_junk_pool]
while pending_junk_pool:
pending_item = pending_junk_pool.pop()
if not junk_candidates:
raise RuntimeError("Not enough junk exists in item pool for %s to be added." % pending_item)
junk_item = random.choice(junk_candidates)
junk_candidates.remove(junk_item)
pool.remove(junk_item)
pool.append(pending_item)
return (pool, placed_items, skip_in_spoiler_locations)
def add_dungeon_items(ootworld):
"""Adds maps, compasses, small keys, boss keys, and Ganon boss key into item pool if they are not placed."""
skip_add_settings = {'remove', 'startwith', 'vanilla', 'on_lacs'}
for dungeon in ootworld.dungeons:
if ootworld.shuffle_mapcompass not in skip_add_settings:
ootworld.itempool.extend(dungeon.dungeon_items)
if ootworld.shuffle_smallkeys not in skip_add_settings:
ootworld.itempool.extend(dungeon.small_keys)
if dungeon.name != 'Ganons Castle' and ootworld.shuffle_bosskeys not in skip_add_settings:
ootworld.itempool.extend(dungeon.boss_key)
if dungeon.name == 'Ganons Castle' and ootworld.shuffle_ganon_bosskey not in skip_add_settings:
ootworld.itempool.extend(dungeon.boss_key)