fgColor: '#000000',
name: 'Brothers\' House',
short: 'Bros',
+ type: 'Interior',
},
{
id: 'link',
fgColor: '#000000',
name: 'Link\'s House',
short: 'Links',
+ type: 'SpecialInterior',
},
{
id: 'sariah',
fgColor: '#000000',
name: 'Sariah\'s House',
short: 'Sariahs',
+ type: 'Interior',
},
{
id: 'twin',
fgColor: '#000000',
name: 'Twins\' House',
short: 'Twins',
+ type: 'Interior',
},
{
id: 'shop',
fgColor: '#000000',
name: 'Shop',
short: 'Shop',
+ type: 'Interior',
},
{
id: 'mido',
fgColor: '#000000',
name: 'Mido\'s House',
short: 'Mido',
+ type: 'Interior',
},
{
id: 'deku',
name: 'Deku Tree',
short: 'Deku',
spacer: true,
+ type: 'Dungeon',
},
{
id: 'storms',
fgColor: '#000000',
name: 'Storms Grotto',
short: 'Storms Grotto',
+ type: 'Grotto',
},
{
id: 'hf',
fgColor: '#000000',
name: 'Hyrule Field',
short: 'HF',
+ type: 'Overworld',
},
{
id: 'lw',
fgColor: '#000000',
name: 'Lost Woods',
short: 'LW',
+ type: 'Overworld',
},
],
},
fgColor: '#000000',
name: 'GC Grotto',
short: 'GC Grotto',
+ type: 'Grotto',
},
{
id: 'tg',
fgColor: '#000000',
name: 'Theater Grotto',
short: 'Theater Grotto',
+ type: 'Grotto',
},
{
id: 'sfmg',
fgColor: '#000000',
name: 'SFM Grotto',
short: 'SFM Grotto',
+ type: 'Grotto',
},
{
id: 'kf',
name: 'Kokiri Forest',
short: 'KF',
spacer: true,
+ type: 'Overworld',
},
{
id: 'gc',
fgColor: '#000000',
name: 'Goron City',
short: 'GC',
+ type: 'Overworld',
},
{
id: 'zr',
fgColor: '#000000',
name: 'Zora\'s River',
short: 'ZR',
+ type: 'Overworld',
},
{
id: 'sfm',
fgColor: '#000000',
name: 'Sacred Forest Maedows',
short: 'SFM',
+ type: 'Overworld',
},
],
},
fgColor: '#000000',
name: 'Forest Temple',
short: 'Forest Temple',
+ type: 'Dungeon',
},
{
id: 'wolf',
fgColor: '#000000',
name: 'Wolf Grotto',
short: 'Wolf Grotto',
+ type: 'Grotto',
},
{
id: 'fairy',
fgColor: '#000000',
name: 'Fairy Grotto',
short: 'Fairy Grotto',
+ type: 'Grotto',
},
{
id: 'storms',
fgColor: '#000000',
name: 'Storms Grotto',
short: 'Storms Grotto',
+ type: 'Grotto',
},
{
id: 'lw',
fgColor: '#000000',
name: 'Lost Woods',
short: 'LW',
+ type: 'Overworld',
},
],
},
fgColor: '#000000',
name: 'Dampe Hut',
short: 'Dampe Hut',
+ type: 'Interior',
},
{
id: 'shadow',
fgColor: '#000000',
name: 'Shadow Temple',
short: 'Shadow',
+ type: 'Dungeon',
},
{
id: 'shield',
fgColor: '#000000',
name: 'Shield Grave',
short: 'Shield Grave',
+ type: 'Grave',
},
{
id: 'race',
fgColor: '#000000',
name: 'Dampe Race',
short: 'Dampe Race',
+ type: 'Grave',
},
{
id: 'sun',
fgColor: '#000000',
name: 'Sun Song Grave',
short: 'Sun Song Gr',
+ type: 'Grave',
},
{
id: 'family',
fgColor: '#000000',
name: 'Family Tomb',
short: 'Family Tomb',
+ type: 'Grave',
},
{
id: 'kak',
fgColor: '#000000',
name: 'Kakariko',
short: 'Kak',
+ type: 'Overworld',
},
],
},
fgColor: '#000000',
name: 'Talon\'s House',
short: 'Talons',
+ type: 'Interior',
},
{
id: 'skull',
fgColor: '#000000',
name: 'Skulltula House',
short: 'Skulltula',
+ type: 'Interior',
},
{
id: 'impaf',
fgColor: '#000000',
name: 'Impa Front',
short: 'Impa Front',
+ type: 'Interior',
},
{
id: 'impab',
fgColor: '#000000',
name: 'Impa Back',
short: 'Impa Back',
+ type: 'Interior',
},
{
id: 'shield',
fgColor: '#000000',
name: 'Shield Shop',
short: 'Shield Shop',
+ type: 'Interior',
},
{
id: 'potion',
fgColor: '#000000',
name: 'Potion Shop',
short: 'Potion Shop',
+ type: 'SpecialInterior',
},
{
id: 'back',
fgColor: '#000000',
name: 'Shop Back',
short: 'Shop Back',
+ type: 'SpecialInterior',
},
{
id: 'witch',
fgColor: '#000000',
name: 'Witch',
short: 'Witch',
+ type: 'Interior',
},
{
id: 'arch',
fgColor: '#000000',
name: 'Archery',
short: 'Archery',
+ type: 'Interior',
},
{
id: 'mill',
fgColor: '#000000',
name: 'Windmill',
short: 'Windmill',
+ type: 'SpecialInterior',
},
{
id: 'botw',
name: 'Bottom of the Well',
short: 'Bottom Well',
spacer: true,
+ type: 'Dungeon',
},
{
id: 'open',
fgColor: '#000000',
name: 'Open Grotto',
short: 'Open Grotto',
+ type: 'Grotto',
},
{
id: 'redead',
fgColor: '#000000',
name: 'Redead Grotto',
short: 'Redead Grotto',
+ type: 'Grotto',
},
{
id: 'hf',
fgColor: '#000000',
name: 'Hyrule Field',
short: 'HF',
+ type: 'Overworld',
},
{
id: 'dmt',
fgColor: '#000000',
name: 'Death Mountain Trail',
short: 'DMT',
+ type: 'Overworld',
},
{
id: 'gy',
fgColor: '#000000',
name: 'Graveyard',
short: 'Grave',
+ type: 'Overworld',
},
],
},
fgColor: '#000000',
name: 'Shield Shop',
short: 'Shield Shop',
+ type: 'Interior',
},
{
id: 'potion',
fgColor: '#000000',
name: 'Potion Shop',
short: 'Potion Shop',
+ type: 'Interior',
},
{
id: 'mask',
fgColor: '#000000',
name: 'Mask Shop',
short: 'Mask Shop',
+ type: 'Interior',
},
{
id: 'sling',
fgColor: '#000000',
name: 'Slingshot/Arrow Game',
short: 'Sling Game',
+ type: 'Interior',
},
{
id: 'chuu',
fgColor: '#000000',
name: 'Bombchu Bowling',
short: 'Bombchu',
+ type: 'Interior',
},
{
id: 'tcg',
fgColor: '#000000',
name: 'Treasure Chest Game',
short: 'TCG',
+ type: 'Interior',
},
{
id: 'alleyl',
fgColor: '#000000',
name: 'Backalley Left',
short: 'Alley L',
+ type: 'Overworld',
},
{
id: 'alleyr',
fgColor: '#000000',
name: 'Backalley Right',
short: 'Alley R',
+ type: 'Overworld',
},
{
id: 'tot',
fgColor: '#000000',
name: 'Temple of Time',
short: 'ToT',
+ type: 'Overworld',
},
{
id: 'hc',
fgColor: '#000000',
name: 'Hyrule Castle',
short: 'HC',
+ type: 'Overworld',
},
{
id: 'm2',
fgColor: '#000000',
name: 'Market 2',
short: 'M2',
+ type: 'Overworld',
},
],
},
fgColor: '#000000',
name: 'Big Poe',
short: 'Big Poe',
+ type: 'Interior',
},
{
id: 'hf',
fgColor: '#000000',
name: 'Hyrule Field',
short: 'HF',
+ type: 'Overworld',
},
{
id: 'm1',
fgColor: '#000000',
name: 'Market 1',
short: 'M1',
+ type: 'Overworld',
},
],
},
fgColor: '#000000',
name: 'Hyrule Castle Fairy',
short: 'HC Fairy',
+ type: 'Interior',
},
{
id: 'gfairy',
fgColor: '#000000',
name: 'Ganon\'s Castle Fairy',
short: 'Ganon Fairy',
+ type: 'Interior',
},
{
id: 'igc',
fgColor: '#000000',
name: 'Inside Ganon\'s Castle',
short: 'IGC',
+ type: 'DungeonSpecial',
},
{
id: 'storms',
fgColor: '#000000',
name: 'Storms Grotto',
short: 'Storms Grotto',
+ type: 'Grotto',
},
{
id: 'm1',
fgColor: '#000000',
name: 'Market 1',
short: 'M1',
+ type: 'Overworld',
},
],
},
fgColor: '#000000',
name: 'Destiny Grotto',
short: 'Destiny Grotto',
+ type: 'Grotto',
},
{
id: 'tektite',
fgColor: '#000000',
name: 'Tektite Grotto',
short: 'Tektite',
+ type: 'Grotto',
},
{
id: 'nw',
fgColor: '#000000',
name: 'Northwest Grotto',
short: 'NW Grotto',
+ type: 'Grotto',
},
{
id: 'nk',
fgColor: '#000000',
name: 'Grotto near Kakariko',
short: 'near Kak Gro',
+ type: 'Grotto',
},
{
id: 'se',
fgColor: '#000000',
name: 'Southeast Grotto',
short: 'SE Grotto',
+ type: 'Grotto',
},
{
id: 'open',
fgColor: '#000000',
name: 'Open Grotto',
short: 'Open Grotto',
+ type: 'Grotto',
},
{
id: 'sg',
fgColor: '#000000',
name: 'South Grotto',
short: 'South Grotto',
+ type: 'Grotto',
},
{
id: 'cow',
fgColor: '#000000',
name: 'Cow Grotto',
short: 'Cow Grotto',
+ type: 'Grotto',
},
{
id: 'town',
name: 'Town',
short: 'Town',
spacer: true,
+ type: 'Overworld',
},
{
id: 'llr',
fgColor: '#000000',
name: 'Lon Lon Ranch',
short: 'LLR',
+ type: 'Overworld',
},
{
id: 'kak',
fgColor: '#000000',
name: 'Kakariko',
short: 'Kak',
+ type: 'Overworld',
},
{
id: 'zr',
fgColor: '#000000',
name: 'Zora\'s River',
short: 'ZR',
+ type: 'Overworld',
},
{
id: 'kf',
fgColor: '#000000',
name: 'Kokiri Forest',
short: 'KF',
+ type: 'Overworld',
},
{
id: 'lh',
fgColor: '#000000',
name: 'Lake Hylia',
short: 'LH',
+ type: 'Overworld',
},
{
id: 'gv',
fgColor: '#000000',
name: 'Gerudo Valley',
short: 'GV',
+ type: 'Overworld',
},
],
},
fgColor: '#000000',
name: 'Storms Grotto',
short: 'Storms Grotto',
+ type: 'Grotto',
},
{
id: 'open',
fgColor: '#000000',
name: 'Open Grotto',
short: 'Open Grotto',
+ type: 'Grotto',
},
{
id: 'boulder',
fgColor: '#000000',
name: 'Boulder Grotto',
short: 'Boulder Grotto',
+ type: 'Grotto',
},
{
id: 'hf',
name: 'Hyrule Field',
short: 'HF',
spacer: true,
+ type: 'Overworld',
},
{
id: 'lw',
fgColor: '#000000',
name: 'Lost Woods',
short: 'LW',
+ type: 'Overworld',
},
{
id: 'zd',
fgColor: '#000000',
name: 'Zora\'s Domain',
short: 'ZD',
+ type: 'Overworld',
},
],
},
fgColor: '#000000',
name: 'Shop',
short: 'Shop',
+ type: 'Interior',
},
{
id: 'storms',
fgColor: '#000000',
name: 'Storms Grotto',
short: 'Storms Grotto',
+ type: 'Grotto',
},
{
id: 'zr',
fgColor: '#000000',
name: 'Zora\'s River',
short: 'ZR',
+ type: 'Overworld',
},
{
id: 'lh',
fgColor: '#000000',
name: 'Lake Hylia',
short: 'LH',
+ type: 'Overworld',
},
{
id: 'zf',
fgColor: '#000000',
name: 'Zora\'s Fountain',
short: 'ZF',
+ type: 'Overworld',
},
],
},
fgColor: '#000000',
name: 'Fairy Wall',
short: 'Fairy Wall',
+ type: 'Interior',
},
{
id: 'jabu',
fgColor: '#000000',
name: 'Jabu Jabu\'s Belly',
short: 'Jabu',
+ type: 'Dungeon',
},
{
id: 'ice',
fgColor: '#000000',
name: 'Ice Cavern',
short: 'Ice Cavern',
+ type: 'Dungeon',
},
{
id: 'zd',
fgColor: '#000000',
name: 'Zora\'s Domain',
short: 'ZD',
+ type: 'Overworld',
},
],
},
fgColor: '#000000',
name: 'Lab Diving',
short: 'Lab Dive',
+ type: 'Interior',
},
{
id: 'fishing',
fgColor: '#000000',
name: 'Fishing Game',
short: 'Fishing',
+ type: 'Interior',
},
{
id: 'water',
fgColor: '#000000',
name: 'Water Temple',
short: 'Water Temple',
+ type: 'Dungeon',
},
{
id: 'owl',
fgColor: '#000000',
name: 'Owl Grotto',
short: 'Owl Grotto',
+ type: 'Grotto',
},
{
id: 'hf',
fgColor: '#000000',
name: 'Hyrule Field',
short: 'HF',
+ type: 'Overworld',
},
{
id: 'zd',
fgColor: '#000000',
name: 'Zora\'s Domain',
short: 'ZD',
+ type: 'Overworld',
},
],
},
fgColor: '#000000',
name: 'Chicken Game',
short: 'Chicken',
+ type: 'Interior',
},
{
id: 'stable',
fgColor: '#000000',
name: 'Stable',
short: 'Stable',
+ type: 'Interior',
},
{
id: 'tower',
fgColor: '#000000',
name: 'Tower',
short: 'Tower',
+ type: 'Interior',
},
{
id: 'grotto',
fgColor: '#000000',
name: 'Grotto',
short: 'Grotto',
+ type: 'Grotto',
},
{
id: 'hf',
fgColor: '#000000',
name: 'Hyrule Field',
short: 'HF',
+ type: 'Overworld',
},
],
},
fgColor: '#000000',
name: 'Tent',
short: 'Tent',
+ type: 'Interior',
},
{
id: 'str2',
fgColor: '#000000',
name: 'Strength 2 Grotto',
short: 'Str2 Grotto',
+ type: 'Grotto',
},
{
id: 'storms',
fgColor: '#000000',
name: 'Storms Grotto',
short: 'Storms Grotto',
+ type: 'Grotto',
},
{
id: 'hf',
fgColor: '#000000',
name: 'Hyrule Field',
short: 'HF',
+ type: 'Overworld',
},
{
id: 'gf',
fgColor: '#000000',
name: 'Gerudo Fortress',
short: 'GF',
+ type: 'Overworld',
},
{
id: 'wf',
name: 'Waterfall',
short: 'Waterfall',
oneway: true,
+ type: 'OverworldOneWay',
},
],
},
fgColor: '#000000',
name: 'Gerudo Training Grounds',
short: 'GTG',
+ type: 'Dungeon',
},
{
id: 'storms',
fgColor: '#000000',
name: 'Storms Grotto',
short: 'Storms Grotto',
+ type: 'Grotto',
},
{
id: 'gv',
fgColor: '#000000',
name: 'Gerudo Valley',
short: 'GV',
+ type: 'Overworld',
},
{
id: 'hw',
fgColor: '#000000',
name: 'Haunted Wasteland',
short: 'Waste',
+ type: 'Overworld',
},
],
},
fgColor: '#000000',
name: 'Spirit Temple',
short: 'Spirit',
+ type: 'Dungeon',
},
{
id: 'fairy',
fgColor: '#000000',
name: 'Fairy',
short: 'Fairy',
+ type: 'Interior',
},
{
id: 'str2',
fgColor: '#000000',
name: 'Strength 2 Grotto',
short: 'Str2 Grotto',
+ type: 'Grotto',
},
{
id: 'hw',
fgColor: '#000000',
name: 'Haunted Wasteland',
short: 'Waste',
+ type: 'Overworld',
},
],
},
fgColor: '#000000',
name: 'Gerudo Fortress',
short: 'GF',
+ type: 'Overworld',
},
{
id: 'dcol',
fgColor: '#000000',
name: 'Desert Colossus',
short: 'DCol',
+ type: 'Overworld',
},
],
},
fgColor: '#000000',
name: 'Fairy',
short: 'Fairy',
+ type: 'Interior',
},
{
id: 'fire',
fgColor: '#000000',
name: 'Fire Temple',
short: 'Fire',
+ type: 'Dungeon',
},
{
id: 'boulder',
fgColor: '#000000',
name: 'Boulder Grotto',
short: 'Boulder Gro',
+ type: 'Grotto',
},
{
id: 'hammer',
fgColor: '#000000',
name: 'Hammer Grotto',
short: 'Hammer Gro',
+ type: 'Grotto',
},
{
id: 'gc',
fgColor: '#000000',
name: 'Goron City',
short: 'GC',
+ type: 'Overworld',
},
{
id: 'dmt',
fgColor: '#000000',
name: 'Death Mountain Trail',
short: 'DMT',
+ type: 'Overworld',
},
],
},
fgColor: '#000000',
name: 'Dodongo\'s Cavern',
short: 'DC',
+ type: 'Dungeon',
},
{
id: 'fairy',
fgColor: '#000000',
name: 'Fairy',
short: 'Fairy',
+ type: 'Interior',
},
{
id: 'storms',
fgColor: '#000000',
name: 'Storms Grotto',
short: 'Storms Grotto',
+ type: 'Grotto',
},
{
id: 'cow',
fgColor: '#000000',
name: 'Cow Grotto',
short: 'Cow Grotto',
+ type: 'Grotto',
},
{
id: 'kak',
name: 'Kakariko',
short: 'Kak',
spacer: true,
+ type: 'Overworld',
},
{
id: 'gc',
fgColor: '#000000',
name: 'Goron City',
short: 'GC',
+ type: 'Overworld',
},
{
id: 'dmc',
fgColor: '#000000',
name: 'Death Mountain Crater',
short: 'DMC',
+ type: 'Overworld',
},
],
},
fgColor: '#000000',
name: 'Shop',
short: 'Shop',
+ type: 'Interior',
},
{
id: 'times',
fgColor: '#000000',
name: 'Times Grotto',
short: 'Times Grotto',
+ type: 'Grotto',
},
{
id: 'dmt',
fgColor: '#000000',
name: 'Death Mountain Trail',
short: 'DMT',
+ type: 'Overworld',
},
{
id: 'lw',
fgColor: '#000000',
name: 'Lost Woods',
short: 'LW',
+ type: 'Overworld',
},
{
id: 'dmc',
fgColor: '#000000',
name: 'Death Mountain Crater',
short: 'DMC',
+ type: 'Overworld',
},
],
},
fgColor: '#000000',
name: 'Temple of Time',
short: 'Temple',
+ type: 'SpecialInterior',
},
{
id: 'm1',
fgColor: '#000000',
name: 'Market 1',
short: 'M1',
+ type: 'Overworld',
},
],
},
fgColor: '#000000',
name: 'Main',
short: 'Main',
+ type: 'Dungeon',
},
{
id: 'end',
fgColor: '#000000',
name: 'End',
short: 'End',
+ type: 'ChildBoss',
},
],
},
fgColor: '#000000',
name: 'Gohma',
short: 'Gohma',
+ type: 'ChildBoss',
},
{
id: 'dc',
fgColor: '#000000',
name: 'Main',
short: 'Main',
+ type: 'Dungeon',
},
{
id: 'end',
fgColor: '#000000',
name: 'End',
short: 'End',
+ type: 'ChildBoss',
},
],
},
fgColor: '#000000',
name: 'King Dodongo',
short: 'Dodongo',
+ type: 'ChildBoss',
},
{
id: 'jabu',
fgColor: '#000000',
name: 'Main',
short: 'Main',
+ type: 'Dungeon',
},
{
id: 'end',
fgColor: '#000000',
name: 'End',
short: 'End',
+ type: 'ChildBoss',
},
],
},
fgColor: '#000000',
name: 'Barinade',
short: 'Barinade',
+ type: 'ChildBoss',
},
{
id: 'forest',
name: 'Main',
short: 'Main',
spacer: true,
+ type: 'Dungeon',
},
{
id: 'end',
name: 'End',
short: 'End',
spacer: true,
+ type: 'AdultBoss',
},
],
},
name: 'Phantom Ganon',
short: 'PG',
spacer: true,
+ type: 'AdultBoss',
},
{
id: 'fire',
fgColor: '#000000',
name: 'Main',
short: 'Main',
+ type: 'Dungeon',
},
{
id: 'end',
fgColor: '#000000',
name: 'End',
short: 'End',
+ type: 'AdultBoss',
},
],
},
fgColor: '#000000',
name: 'Volvagia',
short: 'Volvagia',
+ type: 'AdultBoss',
},
{
id: 'water',
fgColor: '#000000',
name: 'Main',
short: 'Main',
+ type: 'Dungeon',
},
{
id: 'end',
fgColor: '#000000',
name: 'End',
short: 'End',
+ type: 'AdultBoss',
},
],
},
fgColor: '#000000',
name: 'Morpha',
short: 'Morpha',
+ type: 'AdultBoss',
},
{
id: 'shadow',
fgColor: '#000000',
name: 'Main',
short: 'Main',
+ type: 'Dungeon',
},
{
id: 'end',
fgColor: '#000000',
name: 'End',
short: 'End',
+ type: 'AdultBoss',
},
],
},
fgColor: '#000000',
name: 'Bongo Bongo',
short: 'Bongo Bongo',
+ type: 'AdultBoss',
},
{
id: 'spirit',
fgColor: '#000000',
name: 'Main',
short: 'Main',
+ type: 'Dungeon',
},
{
id: 'end',
fgColor: '#000000',
name: 'End',
short: 'End',
+ type: 'AdultBoss',
},
],
},
fgColor: '#000000',
name: 'Twinrova',
short: 'Twinrova',
+ type: 'AdultBoss',
},
{
id: 'igc',
name: 'Main',
short: 'Main',
spacer: true,
+ type: 'Dungeon',
},
{
id: 'end',
name: 'End',
short: 'End',
spacer: true,
+ type: 'SpecialBoss',
},
],
},
name: 'Ganon',
short: 'Ganon',
spacer: true,
+ type: 'SpecialBoss',
},
{
id: 'botw',
fgColor: '#000000',
name: 'Bottom of the Well',
short: 'Bottom Well',
+ type: 'Dungeon',
},
{
id: 'ice',
fgColor: '#000000',
name: 'Ice Cavern',
short: 'Ice Cavern',
+ type: 'Dungeon',
},
{
id: 'gtg',
fgColor: '#000000',
name: 'Gerudo Training Grounds',
short: 'GTG',
+ type: 'Dungeon',
+ },
+ {
+ id: 'songs',
+ bgColor: '#000000',
+ fgColor: '#ffffff',
+ name: 'Warp Songs',
+ short: 'Songs',
+ entrances: [
+ {
+ id: 'minuet',
+ bgColor: '#38761d',
+ fgColor: '#ffffff',
+ name: 'Minuet of Forest',
+ short: 'Minuet',
+ oneway: true,
+ type: 'WarpSong',
+ },
+ {
+ id: 'bolero',
+ bgColor: '#38761d',
+ fgColor: '#ffffff',
+ name: 'Bolero of Fire',
+ short: 'Bolero',
+ oneway: true,
+ type: 'WarpSong',
+ },
+ {
+ id: 'serenade',
+ bgColor: '#38761d',
+ fgColor: '#ffffff',
+ name: 'Serenade of Water',
+ short: 'Serenade',
+ oneway: true,
+ type: 'WarpSong',
+ },
+ {
+ id: 'nocturne',
+ bgColor: '#38761d',
+ fgColor: '#ffffff',
+ name: 'Nocturne of Shadow',
+ short: 'Nocturne',
+ oneway: true,
+ type: 'WarpSong',
+ },
+ {
+ id: 'requiem',
+ bgColor: '#38761d',
+ fgColor: '#ffffff',
+ name: 'Requiem of Spirit',
+ short: 'Requiem',
+ oneway: true,
+ type: 'WarpSong',
+ },
+ {
+ id: 'prelude',
+ bgColor: '#38761d',
+ fgColor: '#ffffff',
+ name: 'Prelude of Light',
+ short: 'Prelude',
+ oneway: true,
+ type: 'WarpSong',
+ },
+ ],
+ },
+ {
+ id: 'spawns',
+ bgColor: '#000000',
+ fgColor: '#ffffff',
+ name: 'Spawns',
+ short: 'Spawns',
+ entrances: [
+ {
+ id: 'child',
+ bgColor: '#38761d',
+ fgColor: '#ffffff',
+ name: 'Child Spawn',
+ short: 'Child',
+ oneway: true,
+ type: 'Spawn',
+ },
+ {
+ id: 'adult',
+ bgColor: '#38761d',
+ fgColor: '#ffffff',
+ name: 'Adult Spawn',
+ short: 'Adult',
+ oneway: true,
+ type: 'Spawn',
+ },
+ ],
+ },
+ {
+ id: 'owls',
+ bgColor: '#000000',
+ fgColor: '#ffffff',
+ name: 'Owl Drops',
+ short: 'Owls',
+ entrances: [
+ {
+ id: 'lhowl',
+ bgColor: '#38761d',
+ fgColor: '#ffffff',
+ name: 'Lake Hylia Owl',
+ short: 'LH Owl',
+ oneway: true,
+ type: 'OwlDrop',
+ },
+ {
+ id: 'dmtowl',
+ bgColor: '#38761d',
+ fgColor: '#ffffff',
+ name: 'Death Mountain Trail Owl',
+ short: 'Trail Owl',
+ oneway: true,
+ type: 'OwlDrop',
+ },
+ ],
},
];
},
];
+const TYPE_RESTRICTIONS = {
+ OverworldOneWay: [
+ 'WarpSong',
+ 'BlueWarp',
+ 'OwlDrop',
+ 'OverworldOneWay',
+ 'Overworld',
+ 'Extra',
+ ],
+ OwlDrop: [
+ 'WarpSong',
+ 'BlueWarp',
+ 'OwlDrop',
+ 'OverworldOneWay',
+ 'Overworld',
+ 'Extra',
+ ],
+ Spawn: [
+ 'Spawn',
+ 'WarpSong',
+ 'BlueWarp',
+ 'OwlDrop',
+ 'OverworldOneWay',
+ 'Overworld',
+ 'Interior',
+ 'SpecialInterior',
+ 'Extra',
+ ],
+ WarpSong: [
+ 'Spawn',
+ 'WarpSong',
+ 'BlueWarp',
+ 'OwlDrop',
+ 'OverworldOneWay',
+ 'Overworld',
+ 'Interior',
+ 'SpecialInterior',
+ 'Extra',
+ ],
+};
+
const CONTEXT = React.createContext({});
const useTracker = () => React.useContext(CONTEXT);
const EntranceRow = ({ entranceId }) => {
const entrance = React.useMemo(() => getEntrance(entranceId), [entranceId]);
- if (!entrance) {
- return <div className="entrance-row empty" />;
- }
+ const { connections, entrances, setConnection } = useTracker();
- const { connections, freeEntrances, setConnection } = useTracker();
+ const options = React.useMemo(() => {
+ if (entrance.type && TYPE_RESTRICTIONS[entrance.type]) {
+ return entrances.filter((e) =>
+ e.type && TYPE_RESTRICTIONS[entrance.type].includes(e.type));
+ }
+ return entrances;
+ }, [entrances]);
- const classNames = ['entrance-row'];
- if (entrance.spacer) classNames.push('mt-2');
- if (connections[entrance.id] === 'trash') classNames.push('is-trash');
+ const className = React.useMemo(() => {
+ const classNames = ['entrance-row'];
+ if (entrance.spacer) classNames.push('mt-2');
+ if (connections[entrance.id] === 'trash') classNames.push('is-trash');
+ return classNames.join(' ');
+ }, [entrance, connections]);
- return <div className={classNames.join(' ')}>
+ return <div className={className}>
<label
className="entrance-label"
htmlFor={entranceId}
id={entranceId}
name={entranceId}
onChange={({ target: { name, value } }) => setConnection(name, value)}
- options={freeEntrances}
+ options={options}
value={connections[entranceId]}
/>
</div>;
const setConnection = React.useCallback((src, dst) => {
setConnections((c) => {
const newConn = { ...c };
- if (getEntrance(c[src])) {
+ const srcEntrance = getEntrance(src);
+ const oldTarget = getEntrance(c[src]);
+ if (oldTarget && (!srcEntrance || !srcEntrance.oneway)) {
// unset old connection
newConn[c[src]] = null;
}
newConn[src] = dst;
- if (dst && getEntrance(src)) {
+ if (dst && srcEntrance && !srcEntrance.oneway) {
newConn[dst] = src;
}
return newConn;
return options;
}, []);
- const freeEntrances = React.useMemo(() => {
- return entrances.filter((entrance) => {
- return entrance.multi ||
- !Object.entries(connections).find(([, b]) => b === entrance.id);
- });
- }, [connections, entrances]);
+ const warpTargets = React.useMemo(() => {
+ const targets = [];
+ return targets;
+ }, []);
const context = React.useMemo(() => ({
- connections, entrances, freeEntrances, setConnection,
- }), [connections, entrances, freeEntrances, setConnection]);
+ connections, entrances, setConnection, warpTargets,
+ }), [connections, entrances, setConnection, warpTargets]);
const superGroups = React.useMemo(() => {
const sg = [
</EntranceGroup>
</div>
)}
+ <div className="column">
+ {AREAS.slice(43, 44).map((area) =>
+ <EntranceGroup group={area} key={area.id}>
+ {area.entrances.map((entrance) =>
+ <EntranceRow
+ entranceId={`${area.id}.${entrance.id}`}
+ key={entrance.id}
+ />
+ )}
+ </EntranceGroup>
+ )}
+ </div>
+ <div className="column">
+ {AREAS.slice(44, 46).map((area) =>
+ <EntranceGroup group={area} key={area.id}>
+ {area.entrances.map((entrance) =>
+ <EntranceRow
+ entranceId={`${area.id}.${entrance.id}`}
+ key={entrance.id}
+ />
+ )}
+ </EntranceGroup>
+ )}
+ </div>
</div>
</div>
</CONTEXT.Provider>;