diff --git a/.mailmap b/.mailmap new file mode 100644 index 00000000..1aecc0db --- /dev/null +++ b/.mailmap @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/EntranceShuffle.py b/EntranceShuffle.py index 658f3e8a..c2806835 100644 --- a/EntranceShuffle.py +++ b/EntranceShuffle.py @@ -2626,6 +2626,8 @@ mandatory_connections = [('Links House S&Q', 'Links House'), ('Bumper Cave Entrance Mirror Spot', 'Death Mountain Entrance'), ('Bumper Cave Ledge Drop', 'West Dark World'), ('Bumper Cave Ledge Mirror Spot', 'Death Mountain Return Ledge'), + ('Bumper Cave Bottom to Top', 'Bumper Cave (top)'), + ('Bumper Cave Top To Bottom', 'Bumper Cave (bottom)'), ('Skull Woods Forest', 'Skull Woods Forest'), ('Desert Ledge Mirror Spot', 'Desert Ledge'), ('Desert Ledge (Northeast) Mirror Spot', 'Desert Ledge (Northeast)'), @@ -2754,6 +2756,8 @@ inverted_mandatory_connections = [('Links House S&Q', 'Inverted Links House'), ('Bumper Cave Entrance Rock', 'Bumper Cave Entrance'), ('Bumper Cave Entrance Drop', 'West Dark World'), ('Bumper Cave Ledge Drop', 'West Dark World'), + ('Bumper Cave Bottom to Top', 'Bumper Cave (top)'), + ('Bumper Cave Top To Bottom', 'Bumper Cave (bottom)'), ('Skull Woods Forest', 'Skull Woods Forest'), ('Paradox Cave Push Block Reverse', 'Paradox Cave Chest Area'), ('Paradox Cave Push Block', 'Paradox Cave Front'), @@ -2977,8 +2981,8 @@ default_connections = [('Links House', 'Links House'), ('C-Shaped House', 'C-Shaped House'), ('Chest Game', 'Chest Game'), ('Dark World Hammer Peg Cave', 'Dark World Hammer Peg Cave'), - ('Bumper Cave (Bottom)', 'Bumper Cave'), - ('Bumper Cave (Top)', 'Bumper Cave'), + ('Bumper Cave (Bottom)', 'Bumper Cave (bottom)'), + ('Bumper Cave (Top)', 'Bumper Cave (top)'), ('Red Shield Shop', 'Red Shield Shop'), ('Dark Sanctuary Hint', 'Dark Sanctuary Hint'), ('Fortune Teller (Dark)', 'Fortune Teller (Dark)'), @@ -3140,7 +3144,7 @@ inverted_default_connections = [('Waterfall of Wishing', 'Waterfall of Wishing' ('Inverted Big Bomb Shop', 'Inverted Big Bomb Shop'), ('Inverted Dark Sanctuary', 'Inverted Dark Sanctuary'), ('Inverted Dark Sanctuary Exit', 'West Dark World'), - ('Old Man Cave (West)', 'Bumper Cave'), + ('Old Man Cave (West)', 'Bumper Cave (bottom)'), ('Old Man Cave (East)', 'Death Mountain Return Cave (left)'), ('Old Man Cave Exit (West)', 'West Dark World'), ('Old Man Cave Exit (East)', 'Dark Death Mountain'), @@ -3149,7 +3153,7 @@ inverted_default_connections = [('Waterfall of Wishing', 'Waterfall of Wishing' ('Bumper Cave (Top)', 'Dark Death Mountain Healer Fairy'), ('Bumper Cave Exit (Top)', 'Death Mountain Return Ledge'), ('Bumper Cave Exit (Bottom)', 'Light World'), - ('Death Mountain Return Cave (West)', 'Bumper Cave'), + ('Death Mountain Return Cave (West)', 'Bumper Cave (top)'), ('Death Mountain Return Cave (East)', 'Death Mountain Return Cave (right)'), ('Death Mountain Return Cave Exit (West)', 'Death Mountain'), ('Death Mountain Return Cave Exit (East)', 'Death Mountain'), diff --git a/InvertedRegions.py b/InvertedRegions.py index 175b2b76..a02bfbea 100644 --- a/InvertedRegions.py +++ b/InvertedRegions.py @@ -184,7 +184,8 @@ def create_inverted_regions(world, player): create_cave_region(player, 'Chest Game', 'a game of 16 chests', ['Chest Game']), create_cave_region(player, 'Red Shield Shop', 'the rare shop', ['Red Shield Shop - Left', 'Red Shield Shop - Middle', 'Red Shield Shop - Right']), create_cave_region(player, 'Inverted Dark Sanctuary', 'a storyteller', None, ['Inverted Dark Sanctuary Exit']), - create_cave_region(player, 'Bumper Cave', 'a connector', None, ['Bumper Cave Exit (Bottom)', 'Bumper Cave Exit (Top)']), + create_cave_region(player, 'Bumper Cave (bottom)', 'a connector', None, ['Bumper Cave Exit (Bottom)', 'Bumper Cave Bottom to Top']), + create_cave_region(player, 'Bumper Cave (top)', 'a connector', None, ['Bumper Cave Exit (Top)', 'Bumper Cave Top To Bottom']), create_dw_region(player, 'Skull Woods Forest', None, ['Skull Woods First Section Hole (East)', 'Skull Woods First Section Hole (West)', 'Skull Woods First Section Hole (North)', 'Skull Woods First Section Door', 'Skull Woods Second Section Door (East)']), create_dw_region(player, 'Skull Woods Forest (West)', None, ['Skull Woods Second Section Hole', 'Skull Woods Second Section Door (West)', 'Skull Woods Final Section']), diff --git a/Main.py b/Main.py index d77f6f58..68ef7583 100644 --- a/Main.py +++ b/Main.py @@ -33,7 +33,7 @@ from source.overworld.EntranceShuffle2 import link_entrances_new from source.tools.BPS import create_bps_from_data from source.classes.CustomSettings import CustomSettings -__version__ = '1.0.1.3-x' +__version__ = '1.2.0.0-x' from source.classes.BabelFish import BabelFish diff --git a/PotShuffle.py b/PotShuffle.py index fd59f6cc..29a561c9 100644 --- a/PotShuffle.py +++ b/PotShuffle.py @@ -745,11 +745,11 @@ vanilla_pots = { 0xE7: [Pot(68, 5, PotItem.OneRupee, 'Death Mountain Return Cave (right)', obj=RoomObject(0x0AB389, [0x8B, 0x2B, 0xFA])), Pot(72, 5, PotItem.OneRupee, 'Death Mountain Return Cave (right)', obj=RoomObject(0x0AB38C, [0x93, 0x2B, 0xFA]))], 0xE8: [Pot(96, 4, PotItem.Heart, 'Superbunny Cave (Bottom)', obj=RoomObject(0x0AA98E, [0xC3, 0x23, 0xFA]))], - 0xEB: [Pot(206, 8, PotItem.FiveRupees, 'Bumper Cave', obj=RoomObject(0x0AADE7, [0x9F, 0x47, 0xFA])), - Pot(210, 8, PotItem.FiveRupees, 'Bumper Cave', obj=RoomObject(0x0AADEA, [0xA7, 0x47, 0xFA])), - Pot(88, 14, PotItem.SmallMagic, 'Bumper Cave', obj=RoomObject(0x0AADED, [0xB3, 0x73, 0xFA])), - Pot(92, 14, PotItem.Heart, 'Bumper Cave', obj=RoomObject(0x0AADF0, [0xBB, 0x73, 0xFA])), - Pot(96, 14, PotItem.SmallMagic, 'Bumper Cave', obj=RoomObject(0x0AADF3, [0xC3, 0x73, 0xFA]))], + 0xEB: [Pot(206, 8, PotItem.FiveRupees, 'Bumper Cave (bottom)', obj=RoomObject(0x0AADE7, [0x9F, 0x47, 0xFA])), + Pot(210, 8, PotItem.FiveRupees, 'Bumper Cave (bottom)', obj=RoomObject(0x0AADEA, [0xA7, 0x47, 0xFA])), + Pot(88, 14, PotItem.SmallMagic, 'Bumper Cave (bottom)', obj=RoomObject(0x0AADED, [0xB3, 0x73, 0xFA])), + Pot(92, 14, PotItem.Heart, 'Bumper Cave (bottom)', obj=RoomObject(0x0AADF0, [0xBB, 0x73, 0xFA])), + Pot(96, 14, PotItem.SmallMagic, 'Bumper Cave (bottom)', obj=RoomObject(0x0AADF3, [0xC3, 0x73, 0xFA]))], 0xF1: [Pot(64, 5, PotItem.Heart, 'Old Man Cave', obj=RoomObject(0x0AA6B2, [0x83, 0x2B, 0xFA]))], 0xF3: [Pot(0x28, 0x14, PotItem.Nothing, 'Elder House', obj=RoomObject(0x0AA76F, [0x53, 0xA3, 0xFA])), Pot(0x2C, 0x14, PotItem.Nothing, 'Elder House', obj=RoomObject(0x0AA772, [0x5B, 0xA3, 0xFA])), @@ -851,10 +851,10 @@ vanilla_pots = { Pot(100, 22, PotItem.Heart, 'Dark Lake Hylia Ledge Spike Cave', obj=RoomObject(0x0AB62A, [0xCB, 0xB3, 0xFA])), Pot(88, 28, PotItem.Heart, 'Dark Lake Hylia Ledge Spike Cave', obj=RoomObject(0x0AB633, [0xB3, 0xE3, 0xFA])), Pot(100, 28, PotItem.Heart, 'Dark Lake Hylia Ledge Spike Cave', obj=RoomObject(0x0AB636, [0xCB, 0xE3, 0xFA]))], - 0x127: [Pot(24, 25, PotItem.Nothing, 'Dark World Hammer Peg Cave', obj=RoomObject(0x2A801A, [0x33, 0xCB, 0xFA])), - Pot(28, 25, PotItem.Nothing, 'Dark World Hammer Peg Cave', obj=RoomObject(0x2A801D, [0x3B, 0xCB, 0xFA])), - Pot(32, 25, PotItem.Nothing, 'Dark World Hammer Peg Cave', obj=RoomObject(0x2A8020, [0x43, 0xCB, 0xFA])), - Pot(36, 25, PotItem.Nothing, 'Dark World Hammer Peg Cave', obj=RoomObject(0x2A8023, [0x4B, 0xCB, 0xFA]))], + 0x127: [Pot(24, 25, PotItem.Nothing, 'Dark World Hammer Peg Cave', obj=RoomObject(0x2B801A, [0x33, 0xCB, 0xFA])), + Pot(28, 25, PotItem.Nothing, 'Dark World Hammer Peg Cave', obj=RoomObject(0x2B801D, [0x3B, 0xCB, 0xFA])), + Pot(32, 25, PotItem.Nothing, 'Dark World Hammer Peg Cave', obj=RoomObject(0x2B8020, [0x43, 0xCB, 0xFA])), + Pot(36, 25, PotItem.Nothing, 'Dark World Hammer Peg Cave', obj=RoomObject(0x2B8023, [0x4B, 0xCB, 0xFA]))], } diff --git a/README.md b/README.md index f2980840..c7ad7b42 100644 --- a/README.md +++ b/README.md @@ -4,15 +4,39 @@ This is a door randomizer for _The Legend of Zelda: A Link to the Past_ for the based on the Entrance Randomizer found at [KevinCathcart's Github Project.](https://github.com/KevinCathcart/ALttPEntranceRandomizer) See https://alttpr.com/ for more details on the normal randomizer. -# Known Issues +# Documentation +1. [Setup and Installation](#setup-and-installation) +2. [Commonly Missed Things](#commonly-missed-things) (** **Read This If New** **) +3. [Settings](#settings) + 1. [Dungeon Randomization](#dungeon-settings) + 1. [Dungeon Door Shuffle](#door-shuffle---doorshuffle) + 2. [Intensity Level](#intensity---intensity-number) + 3. [Key Drop Shuffle (Legacy)](#key-drop-shuffle-legacy---keydropshuffle) + 4. [Pottery](#pottery) + 5. [Shuffle Enemy Key Drops](#shuffle-enemy-key-drops---dropshuffle) + 6. [Experimental Features](#experimental-features) + 7. [Crossed Dungeon Specific Settings](#crossed-dungeon-specific-settings) + 2. [Item Randomization Changes](#item-randomization) + 1. [New "Items"](#new-items) + 2. [Shopsanity](#shopsanity) + 3. [Logic Level](#logic-level) + 4. [Goal](#goal) + 5. [Item Sorting](#item-sorting) + 6. [Forbidden Boss Items](#forbidden-boss-items) + 3. [Entrance Randomization](#entrance-randomization) + 1. [Shuffle Links House](#shuffle-links-house) + 2. [Overworld Map](#overworld-map) + 4. [Enemizer](#enemizer) + 5. [Game Options](#game-options) + 6. [Generation Setup & Miscellaneous](#generation-setup--miscellaneous) -[List of Known Issues and Their Status](https://docs.google.com/document/d/1Bk-m-QRvH5iF60ndptKYgyaV7P93D3TiG8xmdxp_bdQ/edit?usp=sharing) +## Setup and Installation -# Feedback and Bug Reports +### Feedback and Bug Reports Please just DM me on discord for now. I (Aerinon) can be found at the [ALTTP Randomizer discord](https://discordapp.com/invite/alttprandomizer). -# Installation +### Installation Click on @@ -22,7 +46,7 @@ Go down to Assets and find a build for your system (Windows, Mac, or Linux) Download and unzip. Find the DungeonRandomizer.exe or equivalent -# Installation from source +### Installation from source See these instructions. @@ -36,7 +60,8 @@ To use the CLI, run ```DungeonRandomizer.py```. Alternatively, run ```Gui.py``` for a simple graphical user interface. -# Commonly Missed Things and Differences from other Randomizers +# Commonly Missed Things +#### and Differences from other Randomizers Most of these apply only when the door shuffle is not vanilla. @@ -76,69 +101,111 @@ You start with a “Mirror Scroll”, a dumbed-down mirror that only works in du # Settings +## Dungeon Settings + Only extra settings are found here. All entrance randomizer settings are supported. See their [readme](https://github.com/KevinCathcart/ALttPEntranceRandomizer/blob/master/README.md) -## Door Shuffle (--doorShuffle) +### Door Shuffle (--doorShuffle) -### Basic +* Vanilla - Doors are not shuffled +* Basic - Doors are shuffled only within a single dungeon. +* Crossed - Doors are shuffled between dungeons as well. -Doors are shuffled only within a single dungeon. +### Intensity (--intensity number) -### Crossed +* Level 1 - Normal door and spiral staircases are shuffled +* Level 2 - Same as Level 1 plus open edges and both types of straight staircases are shuffled. +* Level 3 - Same as Level 2 plus Dungeon Lobbies are shuffled -Doors are shuffled between dungeons as well. - -### Vanilla - -Doors are not shuffled. - -## Intensity (--intensity number) - -#### Level 1 -Normal door and spiral staircases are shuffled -#### Level 2 -Same as Level 1 plus open edges and both types of straight staircases are shuffled. -#### Level 3 -Same as Level 2 plus Dungeon Lobbies are shuffled - -## KeyDropShuffle (--keydropshuffle) +### Key Drop Shuffle (Legacy) (--keydropshuffle) Adds 33 new locations to the randomization pool. The 32 small keys found under pots and dropped by enemies and the Big -Key drop location are added to the pool. The keys normally found there are added to the item pool. Retro adds -32 generic keys to the pool instead. +Key drop location are added to the pool. The keys normally found there are added to the item pool. Retro adds +32 generic keys to the pool instead. This has been can be controlled more granularly with the [Pottery](#pottery) and +[Shuffle Enemy Key Drops](#shuffle-enemy-key-drops---dropshuffle) -## Crossed Dungeon Specific Settings +### Pottery -### Mixed Travel (--mixed_travel value) +New pottery option that control which pots (and large blocks) are in the locations pool: -Due to Hammerjump, Hovering in PoD Arena, and the Mire Big Key Chest bomb jump two sections of a supertile that are +* None: No pots are in the pool, like normal randomizer +* Key Pots: The pots that have keys are in the pool. This is about half of the old keydropshuffle option +* Cave Pots: The pots that are not found in dungeons are in the pool. (Includes the large block in Spike Cave). Does + not include key pots. +* Cave + Keys Pots: Both non-dungeon pots and pots that used to have keys are in the pool. +* Reduced Dungeon Pots: Same as Cave+Keys but also roughly a quarter of dungeon pots are added to the location pool picked at random. This is a dynamic mode so pots in the pool will be colored. Pots out of the pool will have vanilla contents. +* Clustered Dungeon Pots: Like reduced but pots are grouped by logical sets and roughly 50% of pots are chosen from those groups. This is a dynamic mode like the above. +* Excludes Empty Pots: All pots that had some sort of objects under them are chosen to be in the location pool. This excludes most large blocks and some pots out of dungeons. +* Dungeon Pots: The pots that are in dungeons are in the pool. (Includes serveral large blocks) +* Lottery: All pots and large blocks are in the pool. + +By default, switches remain in their vanilla location (unless you turn on the legacy option below) + +CLI `--pottery