Ocarina of Time 7.0 (#1277)

## What is this fixing or adding?
- Adds the majority of OoTR 7.0 features:
  - Pot shuffle, Freestanding item shuffle, Crate shuffle, Beehive shuffle
  - Key rings mode
  - Dungeon shortcuts to speed up dungeons
  - "Regional" shuffle for dungeon items
  - New options for shop pricing in shopsanity
  - Expanded Ganon's Boss Key shuffle options
  - Pre-planted beans
  - Improved Chest Appearance Matches Contents mode
  - Blue Fire Arrows
  - Bonk self-damage
  - Finer control over MQ dungeons and spawn position randomization
- Several bugfixes as a result of the update:
  - Items recognized by the server and valid starting items are now in a 1-to-1 correspondence. In particular, starting with keys is now supported.
  - Entrance randomization success rate improved. Hopefully it is now at 100%. 

Co-authored-by: Zach Parks <zach@alliware.com>
This commit is contained in:
espeon65536
2022-12-10 21:11:40 -06:00
committed by GitHub
parent 2cdd03f786
commit aee0df5359
110 changed files with 37691 additions and 18648 deletions

View File

@@ -64,37 +64,37 @@ class OOTItem(Item):
# None -> Normal
# Item: (type, Progressive, GetItemID, special),
item_table = {
'Bombs (5)': ('Item', None, 0x01, None),
'Deku Nuts (5)': ('Item', None, 0x02, None),
'Bombs (5)': ('Item', None, 0x01, {'junk': 8}),
'Deku Nuts (5)': ('Item', None, 0x02, {'junk': 5}),
'Bombchus (10)': ('Item', True, 0x03, None),
'Boomerang': ('Item', True, 0x06, None),
'Deku Stick (1)': ('Item', None, 0x07, None),
'Deku Stick (1)': ('Item', None, 0x07, {'junk': 5}),
'Lens of Truth': ('Item', True, 0x0A, None),
'Megaton Hammer': ('Item', True, 0x0D, None),
'Cojiro': ('Item', True, 0x0E, None),
'Cojiro': ('Item', True, 0x0E, {'trade': True}),
'Bottle': ('Item', True, 0x0F, {'bottle': float('Inf')}),
'Bottle with Milk': ('Item', True, 0x14, {'bottle': float('Inf')}),
'Rutos Letter': ('Item', True, 0x15, None),
'Deliver Letter': ('Item', True, None, {'bottle': float('Inf')}),
'Sell Big Poe': ('Item', True, None, {'bottle': float('Inf')}),
'Magic Bean': ('Item', True, 0x16, None),
'Skull Mask': ('Item', True, 0x17, None),
'Spooky Mask': ('Item', None, 0x18, None),
'Keaton Mask': ('Item', None, 0x1A, None),
'Bunny Hood': ('Item', None, 0x1B, None),
'Mask of Truth': ('Item', True, 0x1C, None),
'Pocket Egg': ('Item', True, 0x1D, None),
'Pocket Cucco': ('Item', True, 0x1E, None),
'Odd Mushroom': ('Item', True, 0x1F, None),
'Odd Potion': ('Item', True, 0x20, None),
'Poachers Saw': ('Item', True, 0x21, None),
'Broken Sword': ('Item', True, 0x22, None),
'Prescription': ('Item', True, 0x23, None),
'Eyeball Frog': ('Item', True, 0x24, None),
'Eyedrops': ('Item', True, 0x25, None),
'Claim Check': ('Item', True, 0x26, None),
'Magic Bean': ('Item', True, 0x16, {'progressive': 10}),
'Skull Mask': ('Item', True, 0x17, {'trade': True}),
'Spooky Mask': ('Item', None, 0x18, {'trade': True}),
'Keaton Mask': ('Item', None, 0x1A, {'trade': True}),
'Bunny Hood': ('Item', None, 0x1B, {'trade': True}),
'Mask of Truth': ('Item', True, 0x1C, {'trade': True}),
'Pocket Egg': ('Item', True, 0x1D, {'trade': True}),
'Pocket Cucco': ('Item', True, 0x1E, {'trade': True}),
'Odd Mushroom': ('Item', True, 0x1F, {'trade': True}),
'Odd Potion': ('Item', True, 0x20, {'trade': True}),
'Poachers Saw': ('Item', True, 0x21, {'trade': True}),
'Broken Sword': ('Item', True, 0x22, {'trade': True}),
'Prescription': ('Item', True, 0x23, {'trade': True}),
'Eyeball Frog': ('Item', True, 0x24, {'trade': True}),
'Eyedrops': ('Item', True, 0x25, {'trade': True}),
'Claim Check': ('Item', True, 0x26, {'trade': True}),
'Kokiri Sword': ('Item', True, 0x27, None),
'Giants Knife': ('Item', True, 0x28, None),
'Giants Knife': ('Item', None, 0x28, None),
'Deku Shield': ('Item', None, 0x29, None),
'Hylian Shield': ('Item', None, 0x2A, None),
'Mirror Shield': ('Item', True, 0x2B, None),
@@ -104,28 +104,27 @@ item_table = {
'Hover Boots': ('Item', True, 0x2F, None),
'Stone of Agony': ('Item', True, 0x39, None),
'Gerudo Membership Card': ('Item', True, 0x3A, None),
'Heart Container': ('Item', None, 0x3D, None),
'Piece of Heart': ('Item', None, 0x3E, None),
'Heart Container': ('Item', True, 0x3D, {'alias': ('Piece of Heart', 4), 'progressive': float('Inf')}),
'Piece of Heart': ('Item', True, 0x3E, {'progressive': float('Inf')}),
'Boss Key': ('BossKey', True, 0x3F, None),
'Compass': ('Compass', None, 0x40, None),
'Map': ('Map', None, 0x41, None),
'Small Key': ('SmallKey', True, 0x42, {'progressive': float('Inf')}),
'Weird Egg': ('Item', True, 0x47, None),
'Recovery Heart': ('Item', None, 0x48, None),
'Arrows (5)': ('Item', None, 0x49, None),
'Arrows (10)': ('Item', None, 0x4A, None),
'Arrows (30)': ('Item', None, 0x4B, None),
'Rupee (1)': ('Item', None, 0x4C, None),
'Rupees (5)': ('Item', None, 0x4D, None),
'Rupees (20)': ('Item', None, 0x4E, None),
'Heart Container (Boss)': ('Item', None, 0x4F, None),
'Weird Egg': ('Item', True, 0x47, {'trade': True}),
'Recovery Heart': ('Item', None, 0x48, {'junk': 0}),
'Arrows (5)': ('Item', None, 0x49, {'junk': 8}),
'Arrows (10)': ('Item', None, 0x4A, {'junk': 2}),
'Arrows (30)': ('Item', None, 0x4B, {'junk': 0}),
'Rupee (1)': ('Item', None, 0x4C, {'junk': -1}),
'Rupees (5)': ('Item', None, 0x4D, {'junk': 10}),
'Rupees (20)': ('Item', None, 0x4E, {'junk': 4}),
'Milk': ('Item', None, 0x50, None),
'Goron Mask': ('Item', None, 0x51, None),
'Zora Mask': ('Item', None, 0x52, None),
'Gerudo Mask': ('Item', None, 0x53, None),
'Rupees (50)': ('Item', None, 0x55, None),
'Rupees (200)': ('Item', None, 0x56, None),
'Biggoron Sword': ('Item', True, 0x57, None),
'Rupees (50)': ('Item', None, 0x55, {'junk': 1}),
'Rupees (200)': ('Item', None, 0x56, {'junk': 0}),
'Biggoron Sword': ('Item', None, 0x57, None),
'Fire Arrows': ('Item', True, 0x58, None),
'Ice Arrows': ('Item', True, 0x59, None),
'Light Arrows': ('Item', True, 0x5A, None),
@@ -133,15 +132,15 @@ item_table = {
'Dins Fire': ('Item', True, 0x5C, None),
'Nayrus Love': ('Item', True, 0x5E, None),
'Farores Wind': ('Item', True, 0x5D, None),
'Deku Nuts (10)': ('Item', None, 0x64, None),
'Bombs (10)': ('Item', None, 0x66, None),
'Bombs (20)': ('Item', None, 0x67, None),
'Deku Seeds (30)': ('Item', None, 0x69, None),
'Deku Nuts (10)': ('Item', None, 0x64, {'junk': 0}),
'Bombs (10)': ('Item', None, 0x66, {'junk': 2}),
'Bombs (20)': ('Item', None, 0x67, {'junk': 0}),
'Deku Seeds (30)': ('Item', None, 0x69, {'junk': 5}),
'Bombchus (5)': ('Item', True, 0x6A, None),
'Bombchus (20)': ('Item', True, 0x6B, None),
'Rupee (Treasure Chest Game)': ('Item', None, 0x72, None),
'Piece of Heart (Treasure Chest Game)': ('Item', None, 0x76, None),
'Ice Trap': ('Item', None, 0x7C, None),
'Piece of Heart (Treasure Chest Game)': ('Item', True, 0x76, {'alias': ('Piece of Heart', 1), 'progressive': float('Inf')}),
'Ice Trap': ('Item', None, 0x7C, {'junk': 0}),
'Progressive Hookshot': ('Item', True, 0x80, {'progressive': 2}),
'Progressive Strength Upgrade': ('Item', True, 0x81, {'progressive': 3}),
'Bomb Bag': ('Item', True, 0x82, None),
@@ -168,40 +167,41 @@ item_table = {
'Boss Key (Water Temple)': ('BossKey', True, 0x97, None),
'Boss Key (Spirit Temple)': ('BossKey', True, 0x98, None),
'Boss Key (Shadow Temple)': ('BossKey', True, 0x99, None),
'Boss Key (Ganons Castle)': ('GanonBossKey',True,0x9A,None),
'Compass (Deku Tree)': ('Compass', None, 0x9B, None),
'Compass (Dodongos Cavern)': ('Compass', None, 0x9C, None),
'Compass (Jabu Jabus Belly)': ('Compass', None, 0x9D, None),
'Compass (Forest Temple)': ('Compass', None, 0x9E, None),
'Compass (Fire Temple)': ('Compass', None, 0x9F, None),
'Compass (Water Temple)': ('Compass', None, 0xA0, None),
'Compass (Spirit Temple)': ('Compass', None, 0xA1, None),
'Compass (Shadow Temple)': ('Compass', None, 0xA2, None),
'Compass (Bottom of the Well)': ('Compass', None, 0xA3, None),
'Compass (Ice Cavern)': ('Compass', None, 0xA4, None),
'Map (Deku Tree)': ('Map', None, 0xA5, None),
'Map (Dodongos Cavern)': ('Map', None, 0xA6, None),
'Map (Jabu Jabus Belly)': ('Map', None, 0xA7, None),
'Map (Forest Temple)': ('Map', None, 0xA8, None),
'Map (Fire Temple)': ('Map', None, 0xA9, None),
'Map (Water Temple)': ('Map', None, 0xAA, None),
'Map (Spirit Temple)': ('Map', None, 0xAB, None),
'Map (Shadow Temple)': ('Map', None, 0xAC, None),
'Map (Bottom of the Well)': ('Map', None, 0xAD, None),
'Map (Ice Cavern)': ('Map', None, 0xAE, None),
'Boss Key (Ganons Castle)': ('GanonBossKey', True, 0x9A, None),
'Compass (Deku Tree)': ('Compass', False, 0x9B, None),
'Compass (Dodongos Cavern)': ('Compass', False, 0x9C, None),
'Compass (Jabu Jabus Belly)': ('Compass', False, 0x9D, None),
'Compass (Forest Temple)': ('Compass', False, 0x9E, None),
'Compass (Fire Temple)': ('Compass', False, 0x9F, None),
'Compass (Water Temple)': ('Compass', False, 0xA0, None),
'Compass (Spirit Temple)': ('Compass', False, 0xA1, None),
'Compass (Shadow Temple)': ('Compass', False, 0xA2, None),
'Compass (Bottom of the Well)': ('Compass', False, 0xA3, None),
'Compass (Ice Cavern)': ('Compass', False, 0xA4, None),
'Map (Deku Tree)': ('Map', False, 0xA5, None),
'Map (Dodongos Cavern)': ('Map', False, 0xA6, None),
'Map (Jabu Jabus Belly)': ('Map', False, 0xA7, None),
'Map (Forest Temple)': ('Map', False, 0xA8, None),
'Map (Fire Temple)': ('Map', False, 0xA9, None),
'Map (Water Temple)': ('Map', False, 0xAA, None),
'Map (Spirit Temple)': ('Map', False, 0xAB, None),
'Map (Shadow Temple)': ('Map', False, 0xAC, None),
'Map (Bottom of the Well)': ('Map', False, 0xAD, None),
'Map (Ice Cavern)': ('Map', False, 0xAE, None),
'Small Key (Forest Temple)': ('SmallKey', True, 0xAF, {'progressive': float('Inf')}),
'Small Key (Fire Temple)': ('SmallKey', True, 0xB0, {'progressive': float('Inf')}),
'Small Key (Water Temple)': ('SmallKey', True, 0xB1, {'progressive': float('Inf')}),
'Small Key (Spirit Temple)': ('SmallKey', True, 0xB2, {'progressive': float('Inf')}),
'Small Key (Shadow Temple)': ('SmallKey', True, 0xB3, {'progressive': float('Inf')}),
'Small Key (Bottom of the Well)': ('SmallKey', True, 0xB4, {'progressive': float('Inf')}),
'Small Key (Gerudo Training Ground)': ('SmallKey',True, 0xB5, {'progressive': float('Inf')}),
'Small Key (Thieves Hideout)': ('HideoutSmallKey',True, 0xB6, {'progressive': float('Inf')}),
'Small Key (Gerudo Training Ground)': ('SmallKey', True, 0xB5, {'progressive': float('Inf')}),
'Small Key (Thieves Hideout)': ('HideoutSmallKey', True, 0xB6, {'progressive': float('Inf')}),
'Small Key (Ganons Castle)': ('SmallKey', True, 0xB7, {'progressive': float('Inf')}),
'Double Defense': ('Item', True, 0xB8, None),
'Magic Bean Pack': ('Item', True, 0xC9, None),
'Double Defense': ('Item', None, 0xB8, None),
'Buy Magic Bean': ('Item', True, 0x16, {'alias': ('Magic Bean', 10), 'progressive': 10}),
'Magic Bean Pack': ('Item', True, 0xC9, {'alias': ('Magic Bean', 10), 'progressive': 10}),
'Triforce Piece': ('Item', True, 0xCA, {'progressive': float('Inf')}),
'Zeldas Letter': ('Item', True, 0x0B, None),
'Zeldas Letter': ('Item', True, 0x0B, {'trade': True}),
'Time Travel': ('Event', True, None, None),
'Scarecrow Song': ('Event', True, None, None),
'Triforce': ('Event', True, None, None),
@@ -224,6 +224,7 @@ item_table = {
'Bugs': ('Drop', True, None, None),
'Big Poe': ('Drop', True, None, None),
'Bombchu Drop': ('Drop', True, None, None),
'Deku Shield Drop': ('Drop', True, None, None),
# Consumable refills defined mostly to placate 'starting with' options
'Arrows': ('Refill', None, None, None),
@@ -306,15 +307,25 @@ item_table = {
'item_id': 0x65,
}),
'Small Key Ring (Forest Temple)': ('SmallKey', True, 0xCB, {'alias': ('Small Key (Forest Temple)', 10), 'progressive': float('Inf')}),
'Small Key Ring (Fire Temple)': ('SmallKey', True, 0xCC, {'alias': ('Small Key (Fire Temple)', 10), 'progressive': float('Inf')}),
'Small Key Ring (Water Temple)': ('SmallKey', True, 0xCD, {'alias': ('Small Key (Water Temple)', 10), 'progressive': float('Inf')}),
'Small Key Ring (Spirit Temple)': ('SmallKey', True, 0xCE, {'alias': ('Small Key (Spirit Temple)', 10), 'progressive': float('Inf')}),
'Small Key Ring (Shadow Temple)': ('SmallKey', True, 0xCF, {'alias': ('Small Key (Shadow Temple)', 10), 'progressive': float('Inf')}),
'Small Key Ring (Bottom of the Well)': ('SmallKey', True, 0xD0, {'alias': ('Small Key (Bottom of the Well)', 10), 'progressive': float('Inf')}),
'Small Key Ring (Gerudo Training Ground)': ('SmallKey', True, 0xD1, {'alias': ('Small Key (Gerudo Training Ground)', 10), 'progressive': float('Inf')}),
'Small Key Ring (Thieves Hideout)': ('HideoutSmallKey', True, 0xD2, {'alias': ('Small Key (Thieves Hideout)', 10), 'progressive': float('Inf')}),
'Small Key Ring (Ganons Castle)': ('SmallKey', True, 0xD3, {'alias': ('Small Key (Ganons Castle)', 10), 'progressive': float('Inf')}),
'Buy Deku Nut (5)': ('Shop', True, 0x00, {'object': 0x00BB, 'price': 15}),
'Buy Arrows (30)': ('Shop', False, 0x01, {'object': 0x00D8, 'price': 60}),
'Buy Arrows (50)': ('Shop', False, 0x02, {'object': 0x00D8, 'price': 90}),
'Buy Bombs (5) [25]': ('Shop', False, 0x03, {'object': 0x00CE, 'price': 25}),
'Buy Bombs (5) for 25 Rupees': ('Shop', False, 0x03, {'object': 0x00CE, 'price': 25}),
'Buy Deku Nut (10)': ('Shop', True, 0x04, {'object': 0x00BB, 'price': 30}),
'Buy Deku Stick (1)': ('Shop', True, 0x05, {'object': 0x00C7, 'price': 10}),
'Buy Bombs (10)': ('Shop', False, 0x06, {'object': 0x00CE, 'price': 50}),
'Buy Fish': ('Shop', True, 0x07, {'object': 0x00F4, 'price': 200}),
'Buy Red Potion [30]': ('Shop', False, 0x08, {'object': 0x00EB, 'price': 30}),
'Buy Red Potion for 30 Rupees': ('Shop', False, 0x08, {'object': 0x00EB, 'price': 30}),
'Buy Green Potion': ('Shop', False, 0x09, {'object': 0x00EB, 'price': 30}),
'Buy Blue Potion': ('Shop', False, 0x0A, {'object': 0x00EB, 'price': 100}),
'Buy Hylian Shield': ('Shop', True, 0x0C, {'object': 0x00DC, 'price': 80}),
@@ -334,9 +345,9 @@ item_table = {
'Buy Arrows (10)': ('Shop', False, 0x2C, {'object': 0x00D8, 'price': 20}),
'Buy Bombs (20)': ('Shop', False, 0x2D, {'object': 0x00CE, 'price': 80}),
'Buy Bombs (30)': ('Shop', False, 0x2E, {'object': 0x00CE, 'price': 120}),
'Buy Bombs (5) [35]': ('Shop', False, 0x2F, {'object': 0x00CE, 'price': 35}),
'Buy Red Potion [40]': ('Shop', False, 0x30, {'object': 0x00EB, 'price': 40}),
'Buy Red Potion [50]': ('Shop', False, 0x31, {'object': 0x00EB, 'price': 50}),
'Buy Bombs (5) for 35 Rupees': ('Shop', False, 0x2F, {'object': 0x00CE, 'price': 35}),
'Buy Red Potion for 40 Rupees': ('Shop', False, 0x30, {'object': 0x00EB, 'price': 40}),
'Buy Red Potion for 50 Rupees': ('Shop', False, 0x31, {'object': 0x00EB, 'price': 50}),
'Kokiri Emerald': ('DungeonReward', True, None,
{