fgColor: '#000000',
name: 'Kokiri Forest',
short: 'KF',
+ map: {
+ pos: { x: 210, y: 240 },
+ size: { x: 150, y: 100, },
+ bg: {
+ src: '/media/oot/minimap/kf.png',
+ off: { x: 0, y: 0 },
+ scale: 1.3,
+ },
+ },
entrances: [
{
id: 'bro',
bgColor: '#b6d7a8',
fgColor: '#000000',
- name: 'Brothers\' House',
+ name: 'Know-It-All Brothers\' House',
short: 'Bros',
type: 'Interior',
+ pos: { x: 13, y: 57 },
},
{
id: 'link',
name: 'Link\'s House',
short: 'Links',
type: 'SpecialInterior',
+ pos: { x: 36, y: 74 },
},
{
id: 'sariah',
name: 'Sariah\'s House',
short: 'Sariahs',
type: 'Interior',
+ pos: { x: 47, y: 66 },
},
{
id: 'twin',
bgColor: '#b6d7a8',
fgColor: '#000000',
- name: 'Twins\' House',
+ name: 'House of Twins',
short: 'Twins',
type: 'Interior',
+ pos: { x: 58, y: 64 },
},
{
id: 'shop',
bgColor: '#b6d7a8',
fgColor: '#000000',
- name: 'Shop',
+ name: 'Kokiri Shop',
short: 'Shop',
type: 'Interior',
+ pos: { x: 53, y: 42 },
},
{
id: 'mido',
bgColor: '#b6d7a8',
fgColor: '#000000',
- name: 'Mido\'s House',
+ name: 'Great Mido\'s House',
short: 'Mido',
type: 'Interior',
+ pos: { x: 28, y: 38 },
},
{
id: 'deku',
short: 'Deku',
spacer: true,
type: 'Dungeon',
+ pos: { x: 114, y: 26 },
},
{
id: 'storms',
name: 'Storms Grotto',
short: 'Storms Grotto',
type: 'Grotto',
+ pos: { x: 25, y: 25 },
},
{
id: 'hf',
name: 'Hyrule Field',
short: 'HF',
type: 'Overworld',
+ pos: { x: 4, y: 45 },
},
{
id: 'lw',
name: 'Lost Woods',
short: 'LW',
type: 'Overworld',
+ pos: { x: 31, y: 21 },
},
],
},
fgColor: '#000000',
name: 'Lost Woods',
short: 'LW',
+ map: {
+ pos: { x: 370, y: 220 },
+ size: { x: 75, y: 100, },
+ bg: {
+ src: '/media/oot/minimap/lw.png',
+ off: { x: 0, y: 0 },
+ scale: 1.3,
+ },
+ },
entrances: [
{
id: 'gcg',
bgColor: '#b7b7b7',
fgColor: '#000000',
- name: 'GC Grotto',
+ name: 'Goron City Grotto',
short: 'GC Grotto',
type: 'Grotto',
+ pos: { x: 45, y: 40 },
},
{
id: 'tg',
name: 'Theater Grotto',
short: 'Theater Grotto',
type: 'Grotto',
+ pos: { x: 32, y: 25 },
},
{
id: 'sfmg',
name: 'SFM Grotto',
short: 'SFM Grotto',
type: 'Grotto',
+ pos: { x: 40, y: 12 },
},
{
id: 'kf',
short: 'KF',
spacer: true,
type: 'Overworld',
+ pos: { x: 31, y: 60 },
},
{
id: 'gc',
name: 'Goron City',
short: 'GC',
type: 'Overworld',
+ pos: { x: 44, y: 33 },
},
{
id: 'zr',
name: 'Zora\'s River',
short: 'ZR',
type: 'Overworld',
+ pos: { x: 68, y: 38 },
},
{
id: 'sfm',
name: 'Sacred Forest Maedows',
short: 'SFM',
type: 'Overworld',
+ pos: { x: 45, y: 6 },
},
],
},
fgColor: '#000000',
name: 'Sacred Forest Maedows',
short: 'SFM',
+ map: {
+ pos: { x: 460, y: 220 },
+ size: { x: 35, y: 100, },
+ bg: {
+ src: '/media/oot/minimap/sfm.png',
+ off: { x: -20, y: 0 },
+ scale: 4.3,
+ },
+ },
entrances: [
{
id: 'forest',
name: 'Forest Temple',
short: 'Forest Temple',
type: 'Dungeon',
+ pos: { x: 18, y: 5 },
},
{
id: 'wolf',
name: 'Wolf Grotto',
short: 'Wolf Grotto',
type: 'Grotto',
+ pos: { x: 14, y: 87 },
},
{
id: 'fairy',
name: 'Fairy Grotto',
short: 'Fairy Grotto',
type: 'Grotto',
+ pos: { x: 18, y: 60 },
},
{
id: 'storms',
name: 'Storms Grotto',
short: 'Storms Grotto',
type: 'Grotto',
+ pos: { x: 25, y: 18 },
},
{
id: 'lw',
name: 'Lost Woods',
short: 'LW',
type: 'Overworld',
+ pos: { x: 14, y: 95 },
},
],
},
fgColor: '#000000',
name: 'Graveyard',
short: 'Grave',
+ map: {
+ pos: { x: 310, y: 170 },
+ size: { x: 100, y: 35, },
+ bg: {
+ src: '/media/oot/minimap/gy.png',
+ off: { x: 0, y: -5 },
+ scale: 1.5,
+ },
+ },
entrances: [
{
id: 'dh',
name: 'Dampe Hut',
short: 'Dampe Hut',
type: 'Interior',
+ pos: { x: 22, y: 26 },
},
{
id: 'shadow',
name: 'Shadow Temple',
short: 'Shadow',
type: 'Dungeon',
+ pos: { x: 90, y: 16 },
},
{
id: 'shield',
name: 'Shield Grave',
short: 'Shield Grave',
type: 'Grave',
+ pos: { x: 30, y: 19 },
},
{
id: 'race',
name: 'Dampe Race',
short: 'Dampe Race',
type: 'Grave',
+ pos: { x: 25, y: 7 },
},
{
id: 'sun',
name: 'Sun Song Grave',
short: 'Sun Song Gr',
type: 'Grave',
+ pos: { x: 41, y: 21 },
},
{
id: 'family',
name: 'Family Tomb',
short: 'Family Tomb',
type: 'Grave',
+ pos: { x: 52, y: 15 },
},
{
id: 'kak',
name: 'Kakariko',
short: 'Kak',
type: 'Overworld',
+ pos: { x: 5, y: 20 },
},
],
},
fgColor: '#000000',
name: 'Kakariko Village',
short: 'Kak',
+ map: {
+ pos: { x: 190, y: 140 },
+ size: { x: 125, y: 100, },
+ bg: {
+ src: '/media/oot/minimap/kak.png',
+ off: { x: -7, y: 0 },
+ scale: 1.7,
+ },
+ },
entrances: [
{
id: 'talon',
bgColor: '#f9cb9c',
fgColor: '#000000',
- name: 'Talon\'s House',
+ name: 'Carpenter Boss House',
short: 'Talons',
type: 'Interior',
+ pos: { x: 66, y: 51 },
},
{
id: 'skull',
name: 'Skulltula House',
short: 'Skulltula',
type: 'Interior',
+ pos: { x: 58, y: 73 },
},
{
id: 'impaf',
name: 'Impa Front',
short: 'Impa Front',
type: 'Interior',
+ pos: { x: 58, y: 92 },
},
{
id: 'impab',
name: 'Impa Back',
short: 'Impa Back',
type: 'Interior',
+ pos: { x: 71, y: 91 },
},
{
id: 'shield',
bgColor: '#f9cb9c',
fgColor: '#000000',
- name: 'Shield Shop',
+ name: 'Shield Shop (Bazaar)',
short: 'Shield Shop',
type: 'Interior',
+ pos: { x: 60, y: 28 },
},
{
id: 'potion',
name: 'Potion Shop',
short: 'Potion Shop',
type: 'SpecialInterior',
+ pos: { x: 70, y: 28 },
},
{
id: 'back',
name: 'Shop Back',
short: 'Shop Back',
type: 'SpecialInterior',
+ pos: { x: 80, y: 28 },
},
{
id: 'witch',
name: 'Witch',
short: 'Witch',
type: 'Interior',
+ pos: { x: 84, y: 46 },
},
{
id: 'arch',
name: 'Archery',
short: 'Archery',
type: 'Interior',
+ pos: { x: 72, y: 67 },
},
{
id: 'mill',
name: 'Windmill',
short: 'Windmill',
type: 'SpecialInterior',
+ pos: { x: 96, y: 59 },
},
{
id: 'botw',
short: 'Bottom Well',
spacer: true,
type: 'Dungeon',
+ pos: { x: 84, y: 59 },
},
{
id: 'open',
name: 'Open Grotto',
short: 'Open Grotto',
type: 'Grotto',
+ pos: { x: 86, y: 37 },
},
{
id: 'redead',
name: 'Redead Grotto',
short: 'Redead Grotto',
type: 'Grotto',
+ pos: { x: 58, y: 57 },
},
{
id: 'hf',
name: 'Hyrule Field',
short: 'HF',
type: 'Overworld',
+ pos: { x: 10, y: 74 },
},
{
id: 'dmt',
name: 'Death Mountain Trail',
short: 'DMT',
type: 'Overworld',
+ pos: { x: 67, y: 8 },
},
{
id: 'gy',
name: 'Graveyard',
short: 'Grave',
type: 'Overworld',
+ pos: { x: 112, y: 83 },
},
],
},
fgColor: '#000000',
name: 'Market 1',
short: 'M1',
+ map: {
+ pos: { x: 100, y: 80 },
+ size: { x: 100, y: 60, },
+ bg: {
+ src: '/media/oot/minimap/m1.png',
+ off: { x: 0, y: -6 },
+ scale: 1.0,
+ },
+ },
entrances: [
{
id: 'shield',
name: 'Shield Shop',
short: 'Shield Shop',
type: 'Interior',
+ pos: { x: 81, y: 36 },
},
{
id: 'potion',
name: 'Potion Shop',
short: 'Potion Shop',
type: 'Interior',
+ pos: { x: 81, y: 27 },
},
{
id: 'mask',
name: 'Mask Shop',
short: 'Mask Shop',
type: 'Interior',
+ pos: { x: 75, y: 14 },
},
{
id: 'sling',
bgColor: '#b4a7d6',
fgColor: '#000000',
- name: 'Slingshot/Arrow Game',
+ name: 'Slingshot Game',
short: 'Sling Game',
type: 'Interior',
+ pos: { x: 60, y: 14 },
},
{
id: 'chuu',
name: 'Bombchu Bowling',
short: 'Bombchu',
type: 'Interior',
+ pos: { x: 54, y: 30 },
},
{
id: 'tcg',
name: 'Treasure Chest Game',
short: 'TCG',
type: 'Interior',
+ pos: { x: 52, y: 48 },
},
{
id: 'alleyl',
name: 'Backalley Left',
short: 'Alley L',
type: 'Overworld',
+ pos: { x: 26, y: 48 },
},
{
id: 'alleyr',
name: 'Backalley Right',
short: 'Alley R',
type: 'Overworld',
+ pos: { x: 18, y: 10 },
},
{
id: 'tot',
name: 'Temple of Time',
short: 'ToT',
type: 'Overworld',
+ pos: { x: 92, y: 15 },
},
{
id: 'hc',
name: 'Hyrule Castle',
short: 'HC',
type: 'Overworld',
+ pos: { x: 67, y: 7 },
},
{
id: 'm2',
name: 'Market 2',
short: 'M2',
type: 'Overworld',
+ pos: { x: 66, y: 50 },
},
],
},
fgColor: '#000000',
name: 'Market 2',
short: 'M2',
+ map: {
+ pos: { x: 205, y: 85 },
+ size: { x: 18, y: 50, },
+ bg: {
+ src: '/media/oot/minimap/m2.png',
+ off: { x: -3, y: -3 },
+ scale: 3.6,
+ },
+ },
entrances: [
{
id: 'bp',
name: 'Big Poe',
short: 'Big Poe',
type: 'Interior',
+ pos: { x: 15.5, y: 32 },
},
{
id: 'hf',
name: 'Hyrule Field',
short: 'HF',
type: 'Overworld',
+ pos: { x: 8.5, y: 47.5 },
},
{
id: 'm1',
name: 'Market 1',
short: 'M1',
type: 'Overworld',
+ pos: { x: 8.5, y: 3 },
},
],
},
fgColor: '#000000',
name: 'Hyrule Castle',
short: 'HC',
+ map: {
+ pos: { x: 100, y: 0 },
+ size: { x: 120, y: 70, },
+ bg: {
+ src: '/media/oot/minimap/hc-gc.png',
+ off: { x: 0, y: 0 },
+ scale: 1.2,
+ },
+ },
entrances: [
{
id: 'hcfairy',
name: 'Hyrule Castle Fairy',
short: 'HC Fairy',
type: 'Interior',
+ pos: { x: 61, y: 23 },
},
{
id: 'gfairy',
name: 'Ganon\'s Castle Fairy',
short: 'Ganon Fairy',
type: 'Interior',
+ pos: { x: 116, y: 51 },
},
{
id: 'igc',
name: 'Inside Ganon\'s Castle',
short: 'IGC',
type: 'DungeonSpecial',
+ pos: { x: 83, y: 30 },
},
{
id: 'storms',
name: 'Storms Grotto',
short: 'Storms Grotto',
type: 'Grotto',
+ pos: { x: 30, y: 29 },
},
{
id: 'm1',
name: 'Market 1',
short: 'M1',
type: 'Overworld',
+ pos: { x: 60, y: 66 },
},
],
},
fgColor: '#000000',
name: 'Hyrule Field',
short: 'HF',
+ map: {
+ pos: { x: 90, y: 150 },
+ size: { x: 100, y: 100, },
+ bg: {
+ src: '/media/oot/minimap/hf.png',
+ off: { x: -16, y: 0 },
+ scale: 1.8,
+ },
+ },
entrances: [
{
id: 'destiny',
name: 'Destiny Grotto',
short: 'Destiny Grotto',
type: 'Grotto',
+ pos: { x: 33, y: 7 },
},
{
id: 'tektite',
name: 'Tektite Grotto',
short: 'Tektite',
type: 'Grotto',
+ pos: { x: 30, y: 23 },
},
{
id: 'nw',
bgColor: '#b7b7b7',
fgColor: '#000000',
- name: 'Northwest Grotto',
+ name: 'Northwest Grotto (near Market)',
short: 'NW Grotto',
type: 'Grotto',
+ pos: { x: 48, y: 13 },
},
{
id: 'nk',
name: 'Grotto near Kakariko',
short: 'near Kak Gro',
type: 'Grotto',
+ pos: { x: 68, y: 8 },
},
{
id: 'se',
name: 'Southeast Grotto',
short: 'SE Grotto',
type: 'Grotto',
+ pos: { x: 55, y: 78 },
},
{
id: 'open',
name: 'Open Grotto',
short: 'Open Grotto',
type: 'Grotto',
+ pos: { x: 35, y: 86 },
},
{
id: 'sg',
name: 'South Grotto',
short: 'South Grotto',
type: 'Grotto',
+ pos: { x: 28, y: 87 },
},
{
id: 'cow',
name: 'Cow Grotto',
short: 'Cow Grotto',
type: 'Grotto',
+ pos: { x: 13, y: 47 },
},
{
id: 'town',
short: 'Town',
spacer: true,
type: 'Overworld',
+ pos: { x: 57, y: 10 },
},
{
id: 'llr',
name: 'Lon Lon Ranch',
short: 'LLR',
type: 'Overworld',
+ pos: { x: 45, y: 44 },
},
{
id: 'kak',
name: 'Kakariko',
short: 'Kak',
type: 'Overworld',
+ pos: { x: 80, y: 10 },
},
{
id: 'zr',
name: 'Zora\'s River',
short: 'ZR',
type: 'Overworld',
+ pos: { x: 94, y: 30 },
},
{
id: 'kf',
name: 'Kokiri Forest',
short: 'KF',
type: 'Overworld',
+ pos: { x: 87, y: 57 },
},
{
id: 'lh',
name: 'Lake Hylia',
short: 'LH',
type: 'Overworld',
+ pos: { x: 25, y: 95 },
},
{
id: 'gv',
name: 'Gerudo Valley',
short: 'GV',
type: 'Overworld',
+ pos: { x: 6, y: 51 },
},
],
},
fgColor: '#000000',
name: 'Zora\'s River',
short: 'ZR',
+ map: {
+ pos: { x: 330, y: 100 },
+ size: { x: 100, y: 60, },
+ bg: {
+ src: '/media/oot/minimap/zr.png',
+ off: { x: 0, y: 0 },
+ scale: 1.3,
+ },
+ },
entrances: [
{
id: 'storms',
name: 'Storms Grotto',
short: 'Storms Grotto',
type: 'Grotto',
+ pos: { x: 8, y: 28 },
},
{
id: 'open',
name: 'Open Grotto',
short: 'Open Grotto',
type: 'Grotto',
+ pos: { x: 36, y: 32 },
},
{
id: 'boulder',
name: 'Boulder Grotto',
short: 'Boulder Grotto',
type: 'Grotto',
+ pos: { x: 40, y: 24 },
},
{
id: 'hf',
short: 'HF',
spacer: true,
type: 'Overworld',
+ pos: { x: 10, y: 52 },
},
{
id: 'lw',
name: 'Lost Woods',
short: 'LW',
type: 'Overworld',
+ pos: { x: 90.5, y: 18 },
},
{
id: 'zd',
name: 'Zora\'s Domain',
short: 'ZD',
type: 'Overworld',
+ pos: { x: 96, y: 9 },
},
],
},
fgColor: '#000000',
name: 'Zora\'s Domain',
short: 'ZD',
+ map: {
+ pos: { x: 410, y: 100 },
+ size: { x: 80, y: 100, },
+ bg: {
+ src: '/media/oot/minimap/zd.png',
+ off: { x: -15, y: -5 },
+ scale: 2.3,
+ },
+ },
entrances: [
{
id: 'shop',
name: 'Shop',
short: 'Shop',
type: 'Interior',
+ pos: { x: 55, y: 85 },
},
{
id: 'storms',
name: 'Storms Grotto',
short: 'Storms Grotto',
type: 'Grotto',
+ pos: { x: 16, y: 64 },
},
{
id: 'zr',
name: 'Zora\'s River',
short: 'ZR',
type: 'Overworld',
+ pos: { x: 6, y: 73 },
},
{
id: 'lh',
name: 'Lake Hylia',
short: 'LH',
type: 'Overworld',
+ pos: { x: 35, y: 72 },
},
{
id: 'zf',
name: 'Zora\'s Fountain',
short: 'ZF',
type: 'Overworld',
+ pos: { x: 58, y: 15 },
},
],
},
fgColor: '#000000',
name: 'Zora\'s Fountain',
short: 'ZF',
+ map: {
+ pos: { x: 410, y: 0 },
+ size: { x: 90, y: 100, },
+ bg: {
+ src: '/media/oot/minimap/zf.png',
+ off: { x: -5, y: 0 },
+ scale: 2.1,
+ },
+ },
entrances: [
{
id: 'wall',
name: 'Fairy Wall',
short: 'Fairy Wall',
type: 'Interior',
+ pos: { x: 61, y: 90 },
},
{
id: 'jabu',
name: 'Jabu Jabu\'s Belly',
short: 'Jabu',
type: 'Dungeon',
+ pos: { x: 34, y: 38 },
},
{
id: 'ice',
name: 'Ice Cavern',
short: 'Ice Cavern',
type: 'Dungeon',
+ pos: { x: 52, y: 10 },
},
{
id: 'zd',
name: 'Zora\'s Domain',
short: 'ZD',
type: 'Overworld',
+ pos: { x: 12, y: 55 },
},
],
},
fgColor: '#000000',
name: 'Lake Hylia',
short: 'LH',
+ map: {
+ pos: { x: 0, y: 265 },
+ size: { x: 90, y: 100, },
+ bg: {
+ src: '/media/oot/minimap/lh.png',
+ off: { x: -15, y: -5 },
+ scale: 1.9,
+ },
+ },
entrances: [
{
id: 'dive',
name: 'Lab Diving',
short: 'Lab Dive',
type: 'Interior',
+ pos: { x: 30, y: 43 },
},
{
id: 'fishing',
name: 'Fishing Game',
short: 'Fishing',
type: 'Interior',
+ pos: { x: 68, y: 43 },
},
{
id: 'water',
name: 'Water Temple',
short: 'Water Temple',
type: 'Dungeon',
+ pos: { x: 45, y: 65 },
},
{
id: 'owl',
name: 'Owl Grotto',
short: 'Owl Grotto',
type: 'Grotto',
+ pos: { x: 24, y: 65 },
},
{
id: 'hf',
name: 'Hyrule Field',
short: 'HF',
type: 'Overworld',
+ pos: { x: 35, y: 5 },
},
{
id: 'zd',
name: 'Zora\'s Domain',
short: 'ZD',
type: 'Overworld',
+ pos: { x: 45, y: 40 },
},
],
},
fgColor: '#000000',
name: 'Lon Lon Ranch',
short: 'LLR',
+ map: {
+ pos: { x: 100, y: 260 },
+ size: { x: 80, y: 100, },
+ bg: {
+ src: '/media/oot/minimap/llr.png',
+ off: { x: -22, y: -6 },
+ scale: 2.6,
+ },
+ },
entrances: [
{
id: 'chicken',
name: 'Chicken Game',
short: 'Chicken',
type: 'Interior',
+ pos: { x: 54, y: 13 },
},
{
id: 'stable',
name: 'Stable',
short: 'Stable',
type: 'Interior',
+ pos: { x: 50, y: 19 },
},
{
id: 'tower',
name: 'Tower',
short: 'Tower',
type: 'Interior',
+ pos: { x: 17, y: 82 },
},
{
id: 'grotto',
name: 'Grotto',
short: 'Grotto',
type: 'Grotto',
+ pos: { x: 60, y: 85 },
},
{
id: 'hf',
name: 'Hyrule Field',
short: 'HF',
type: 'Overworld',
+ pos: { x: 60, y: 5 },
},
],
},
fgColor: '#000000',
name: 'Gerudo Valley',
short: 'GV',
+ map: {
+ pos: { x: 0, y: 190 },
+ size: { x: 100, y: 75, },
+ bg: {
+ src: '/media/oot/minimap/gv.png',
+ off: { x: -17, y: -5 },
+ scale: 1.9,
+ },
+ },
entrances: [
{
id: 'tent',
name: 'Tent',
short: 'Tent',
type: 'Interior',
+ pos: { x: 44, y: 33 },
},
{
id: 'str2',
name: 'Strength 2 Grotto',
short: 'Str2 Grotto',
type: 'Grotto',
+ pos: { x: 60, y: 60 },
},
{
id: 'storms',
name: 'Storms Grotto',
short: 'Storms Grotto',
type: 'Grotto',
+ pos: { x: 39, y: 27 },
},
{
id: 'hf',
name: 'Hyrule Field',
short: 'HF',
type: 'Overworld',
+ pos: { x: 93, y: 45 },
},
{
id: 'gf',
name: 'Gerudo Fortress',
short: 'GF',
type: 'Overworld',
+ pos: { x: 6, y: 22 },
},
{
id: 'wf',
short: 'Waterfall',
oneway: true,
type: 'OverworldOneWay',
+ pos: { x: 58, y: 69 },
},
],
},
fgColor: '#000000',
name: 'Gerudo Fortress',
short: 'GF',
+ map: {
+ pos: { x: 0, y: 90 },
+ size: { x: 90, y: 100, },
+ bg: {
+ src: '/media/oot/minimap/gf.png',
+ off: { x: -5, y: -35 },
+ scale: 2.5,
+ },
+ },
entrances: [
{
id: 'gtg',
name: 'Gerudo Training Grounds',
short: 'GTG',
type: 'Dungeon',
+ pos: { x: 48, y: 60 },
},
{
id: 'storms',
name: 'Storms Grotto',
short: 'Storms Grotto',
type: 'Grotto',
+ pos: { x: 52, y: 47 },
},
{
id: 'gv',
name: 'Gerudo Valley',
short: 'GV',
type: 'Overworld',
+ pos: { x: 43, y: 93 },
},
{
id: 'hw',
name: 'Haunted Wasteland',
short: 'Waste',
type: 'Overworld',
+ pos: { x: 7, y: 13 },
},
],
},
fgColor: '#000000',
name: 'Desert Colossus',
short: 'DCol',
+ map: {
+ pos: { x: 0, y: 0 },
+ size: { x: 100, y: 90, },
+ bg: {
+ src: '/media/oot/minimap/dcol.png',
+ off: { x: 0, y: -2 },
+ scale: 2.0,
+ },
+ },
entrances: [
{
id: 'spirit',
name: 'Spirit Temple',
short: 'Spirit',
type: 'Dungeon',
+ pos: { x: 10, y: 43.5 },
},
{
id: 'fairy',
name: 'Fairy',
short: 'Fairy',
type: 'Interior',
+ pos: { x: 62, y: 21 },
},
{
id: 'str2',
name: 'Strength 2 Grotto',
short: 'Str2 Grotto',
type: 'Grotto',
+ pos: { x: 32, y: 28 },
},
{
id: 'hw',
name: 'Haunted Wasteland',
short: 'Waste',
type: 'Overworld',
+ pos: { x: 85, y: 40 },
},
],
},
fgColor: '#000000',
name: 'Death Mountain Crater',
short: 'DMC',
+ map: {
+ pos: { x: 320, y: 0 },
+ size: { x: 90, y: 100, },
+ bg: {
+ src: '/media/oot/minimap/dmc.png',
+ off: { x: -15, y: -3 },
+ scale: 1.9,
+ },
+ },
entrances: [
{
id: 'fairy',
name: 'Fairy',
short: 'Fairy',
type: 'Interior',
+ pos: { x: 17, y: 68 },
},
{
id: 'fire',
name: 'Fire Temple',
short: 'Fire',
type: 'Dungeon',
+ pos: { x: 48, y: 6 },
},
{
id: 'boulder',
name: 'Boulder Grotto',
short: 'Boulder Gro',
type: 'Grotto',
+ pos: { x: 49, y: 86 },
},
{
id: 'hammer',
name: 'Hammer Grotto',
short: 'Hammer Gro',
type: 'Grotto',
+ pos: { x: 12, y: 35 },
},
{
id: 'gc',
name: 'Goron City',
short: 'GC',
type: 'Overworld',
+ pos: { x: 7, y: 46 },
},
{
id: 'dmt',
name: 'Death Mountain Trail',
short: 'DMT',
type: 'Overworld',
+ pos: { x: 25, y: 90 },
},
],
},
fgColor: '#000000',
name: 'Death Mountain Trail',
short: 'DMT',
+ map: {
+ pos: { x: 280, y: 70 },
+ size: { x: 40, y: 100, },
+ bg: {
+ src: '/media/oot/minimap/dmt.png',
+ off: { x: -12, y: 0 },
+ scale: 3.8,
+ },
+ },
entrances: [
{
id: 'dc',
name: 'Dodongo\'s Cavern',
short: 'DC',
type: 'Dungeon',
+ pos: { x: 8, y: 53 },
},
{
id: 'fairy',
name: 'Fairy',
short: 'Fairy',
type: 'Interior',
+ pos: { x: 22, y: 10 },
},
{
id: 'storms',
name: 'Storms Grotto',
short: 'Storms Grotto',
type: 'Grotto',
+ pos: { x: 23, y: 48 },
},
{
id: 'cow',
name: 'Cow Grotto',
short: 'Cow Grotto',
type: 'Grotto',
+ pos: { x: 20, y: 57 },
},
{
id: 'kak',
short: 'Kak',
spacer: true,
type: 'Overworld',
+ pos: { x: 15, y: 94 },
},
{
id: 'gc',
name: 'Goron City',
short: 'GC',
type: 'Overworld',
+ pos: { x: 24, y: 40 },
},
{
id: 'dmc',
name: 'Death Mountain Crater',
short: 'DMC',
type: 'Overworld',
+ pos: { x: 29, y: 5 },
},
],
},
fgColor: '#000000',
name: 'Goron City',
short: 'GC',
+ map: {
+ pos: { x: 220, y: 0 },
+ size: { x: 90, y: 100, },
+ bg: {
+ src: '/media/oot/minimap/gc.png',
+ off: { x: -2, y: 0 },
+ scale: 2.0,
+ },
+ },
entrances: [
{
id: 'shop',
name: 'Shop',
short: 'Shop',
type: 'Interior',
+ pos: { x: 42, y: 50 },
},
{
id: 'times',
name: 'Times Grotto',
short: 'Times Grotto',
type: 'Grotto',
+ pos: { x: 80, y: 17 },
},
{
id: 'dmt',
name: 'Death Mountain Trail',
short: 'DMT',
type: 'Overworld',
+ pos: { x: 50.5, y: 95 },
},
{
id: 'lw',
name: 'Lost Woods',
short: 'LW',
type: 'Overworld',
+ pos: { x: 64, y: 93 },
},
{
id: 'dmc',
name: 'Death Mountain Crater',
short: 'DMC',
type: 'Overworld',
+ pos: { x: 51.5, y: 5 },
},
],
},
};
};
+const vecAdd = (a, b) => ({ x: a.x + b.x, y: a.y + b.y });
+
+const vecMul = (v, f) => ({ x: v.x * f, y: v.y * f });
+
const SelectBox = ({ id, name, onChange, options, value }) => {
const [open, setOpen] = React.useState(false);
const [search, setSearch] = React.useState('');
entranceId: PropTypes.string,
};
+const MapEntrance = ({ entrance }) => {
+ const { connections, setConnection } = useTracker();
+
+ return <circle
+ cx={entrance.pos.x}
+ cy={entrance.pos.y}
+ r="3"
+ className={`entrance${connections[entrance.id] === 'trash' ? ' is-trash' : ''}`}
+ fill={entrance.color}
+ stroke="#000000"
+ onClick={() => {
+ if (connections[entrance.id] === 'trash') {
+ setConnection(entrance.id, null);
+ } else {
+ setConnection(entrance.id, 'trash');
+ }
+ }}
+ >
+ <title>{entrance.name}</title>
+ </circle>;
+};
+
+MapEntrance.propTypes = {
+ entrance: PropTypes.shape({
+ color: PropTypes.string,
+ id: PropTypes.string,
+ name: PropTypes.string,
+ pos: PropTypes.shape({
+ x: PropTypes.number,
+ y: PropTypes.number,
+ })
+ })
+};
+
const MixedPoolsTracker = () => {
const [connections, setConnections] = React.useState({});
return sg;
}, [connections]);
+ const maps = React.useMemo(() => {
+ return AREAS
+ .filter((area) => !!area.map)
+ .map((area) => ({
+ id: area.id,
+ pos: area.map.pos,
+ size: area.map.size,
+ bg: {
+ src: area.map.bg.src,
+ pos: vecAdd(area.map.pos, area.map.bg.off),
+ size: vecMul(area.map.size, area.map.bg.scale),
+ },
+ entrances: area.entrances
+ .filter((entrance) => entrance.pos)
+ .map((entrance) => ({
+ id: `${area.id}.${entrance.id}`,
+ name: entranceFull({ ...entrance, area }),
+ pos: vecAdd(area.map.pos, entrance.pos),
+ color: entrance.bgColor,
+ })),
+ }));
+ }, []);
+
+ const connectors = React.useMemo(() => {
+ return [connections, maps];
+ }, []);
+
return <CONTEXT.Provider value={context}>
<div className="mixed-pools-tracker">
+ <div className="map">
+ <svg viewBox="0 0 500 370">
+ {maps.map((map) =>
+ <g key={map.id} title={map.name}>
+ <image
+ href={map.bg.src}
+ pointerEvents="none"
+ x={map.bg.pos.x} y={map.bg.pos.y}
+ width={map.bg.size.x}
+ />
+ {map.entrances.map((entrance) =>
+ <MapEntrance key={entrance.id} entrance={entrance} />
+ )}
+ </g>
+ )}
+ </svg>
+ </div>
<div className="columns">
{superGroups.map((sg) =>
<div className="column" key={sg.key}>