From 07c9bbbb2c6ddde460f48245699f27eaf66b8ac3 Mon Sep 17 00:00:00 2001 From: Daniel Karbach Date: Sat, 30 Mar 2024 19:54:06 +0100 Subject: [PATCH] tentative inverted logic --- icons.sh | 2 +- package.json | 1 + public/item/bottle-good-bee.png | Bin 0 -> 5567 bytes public/item/bunny-head.png | Bin 0 -> 4576 bytes public/item/crystal-switch-blue.png | Bin 0 -> 694 bytes public/item/crystal-switch-red.png | Bin 0 -> 685 bytes public/item/crystal-switch.png | Bin 0 -> 805 bytes public/item/ganon.png | Bin 0 -> 9502 bytes public/item/gt.png | Bin 0 -> 1204 bytes public/item/link-head.png | Bin 0 -> 4574 bytes public/item/triforce-piece.png | Bin 0 -> 7435 bytes public/item/triforce.png | Bin 0 -> 8433 bytes public/items-v2.png | Bin 0 -> 50600 bytes resources/js/components/common/ZeldaIcon.js | 36 +- .../js/components/tracker/ConfigDialog.js | 111 ++++ .../js/components/tracker/Map/Overworld.js | 102 ++- resources/js/components/tracker/Toolbar.js | 106 ++- resources/js/helpers/logic.js | 606 +++++++++++++----- resources/js/helpers/tracker.js | 22 +- resources/js/hooks/tracker.js | 5 +- resources/js/i18n/de.js | 27 + resources/js/i18n/en.js | 27 + resources/sass/common.scss | 2 - resources/sass/tracker.scss | 6 + 24 files changed, 832 insertions(+), 221 deletions(-) create mode 100644 public/item/bottle-good-bee.png create mode 100644 public/item/bunny-head.png create mode 100644 public/item/crystal-switch-blue.png create mode 100644 public/item/crystal-switch-red.png create mode 100644 public/item/crystal-switch.png create mode 100644 public/item/ganon.png create mode 100644 public/item/gt.png create mode 100644 public/item/link-head.png create mode 100644 public/item/triforce-piece.png create mode 100644 public/item/triforce.png create mode 100644 public/items-v2.png diff --git a/icons.sh b/icons.sh index c9fe293..b402292 100755 --- a/icons.sh +++ b/icons.sh @@ -1,6 +1,6 @@ #!/bin/bash -gm montage -geometry '32x32>' -background transparent -gravity center -tile 8x100 public/item/*.png public/items-v1.png +gm montage -geometry '32x32>' -background transparent -gravity center -tile 8x100 public/item/*.png public/items-v2.png echo 'const ITEM_MAP = [' for i in public/item/*.png diff --git a/package.json b/package.json index 78f5453..1fdb362 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "tabWidth": 4 } ], + "no-use-before-define": "error", "no-extra-parens": [ "warn", "all", diff --git a/public/item/bottle-good-bee.png b/public/item/bottle-good-bee.png new file mode 100644 index 0000000000000000000000000000000000000000..25fd63041232b4adf0865d9dc402dd011adcf29d GIT binary patch literal 5567 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 C&R?4V literal 0 HcmV?d00001 diff --git a/public/item/bunny-head.png b/public/item/bunny-head.png new file mode 100644 index 0000000000000000000000000000000000000000..c97d8f588d625553aed025f714b046033cb244bb GIT binary patch literal 4576 zcmeHKeN+=y77r?Z#19no_)!+e5f!SFnMo!lnI@27A(@yAB!CJi zR{VfUS*=Seib{*t1-rT`)mAN9b!|`AuDYePimt0x5NzvOt*+fS0r@!XIeR>3`ya`f zulw%(-FtuU-gn+xmk>X9xO9S4B9RO?#uyU869QMr;DO+7k_Lx^M_X=Es*p%|Ag7DB za+xe7S8;#QRmrf+eL5(6A@BM&}JU-tVD0wCam1=GTvxn=9T)tX}-_m$YKo z)PEnpI`=0{+}_Y7v7c2cPJa4X^`sgiQ>QE6_LNu``27o&NB-VwPHZI;w@)LTr-JLx zOwm4`c463&NsDVEGYacG%ZEqqX*X2O&iOhnFL*G#If0pcHFCj&#g6$+st=ZYxP>b_ z#>fWpk=4xHSJvz^S3aI3w9uLB^cMzLBbNAA?4EA+UeYGrc|Y!j>@_LXMbQyK$!k?5 zbth9I`xUPkIctJ$?IZH7jOdB2Z`rEzC*H}n96Cv=Z)E5t~xkoaTZp8e`o~}8ZIkcm2vXq>!!9ADP(Rrfa+67x~^NNe9poH5DxL#t?jI>X`m@_vm4B zibj@g-Sh6BH)y=2b$JgT=8pa6qARza2J2%lFa`5NOBLVjFIE-XRLHg;B9?7^Idsj# zx4mEN7#cXsm6rXe#N9|0+FmPp#agM3o3SM?wT()~ldg}yUbFMnKcF|#lGXgO!;;Y`)mHh)W^F=8)r;fLm1Ac?^r)!#;Np6F?dU-eAw)*uOAs$2SM>w$n|H?UJXq=Gc~>S`c$v`F(53h7iAo zrW2>LQp$fUIR887``zE~6OU!pgjMCn!;gL_5pt zr05J*fGn(ybLimqqsL*0V{~we(uA3udN!Sl$#t;{bK{ff+zeX7z_TKxS}zFz?5sdR zUVEm)O?q{(50?b*q8NoCpNf#7gHufjke+w35FsOE7!u{>vgL4u6w&;(6xV1pC?-ecas+4~?i`0ec@c+uvIxK;%=hg+Z=G%G>@a2W@1G?)TY;j{&j%P|#zpk^X! zMxj9{3qi}3m}Mr#D0)E5cX6O9smz{HiBJrHQeiBnCM*_&k}GM1ph0y|8V!T63MEEZ z<*Z5}?}&z>$!OkXr@(Y_cFM-0PKV9sLnNG>lVH@rav9bwNywxGD=+{(z&RM+pwS6R4Wz6ZCp7Zj=x*LBcqkV;#|C%= zT!8}haRr5SPE~kseNQ?o&I6zf!4yb0WjKs>CX0$I#T8=#q9H zrdS8q0eQet>5f`C1st;mTIS6)NW#Vc>|;SgfMkd>W|3PW8POnKerNa^1_%cUMpM+F z+xQZ+$g3Lju;CL+*+eyPEyR7ODU5A zS7Rf!WN~a|!uWL?_Zc1xIUCEc%#^@$LEcC#hH&f`QMVr;qe>~Q< zKa$?_&%L}?HEPu6^DD0Y*m~_?RI%>j*Ec@h_4~7WD!gE`sxdvRpr-m;d-Y2h0eC>+ z&XYH0|FvboeW{kX)N=9Pyvqo!ZD_~QOxCwspl{e#2FPY!>S@fS_m^f?WU zL-)H{U3L9Fs`P7bSmd8K$by>J)ap*CWFh`-C12eim-lf>&T{F#b%$CVJHs|sHsAWZ z?$Cqy<#?~ e>s}hT>qNk&h|)0n=0*=7TVjlgH`GR&SN#{TERKEv literal 0 HcmV?d00001 diff --git a/public/item/crystal-switch-blue.png b/public/item/crystal-switch-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..17c5c42bd4af301580380cb9746b1e025a65c088 GIT binary patch literal 694 zcmV;n0!jUeP)EX>4Tx04R}tkv&MmKp2MKrb?w$9PA+CkfAzR5EXHhDi*;)X)CnqU~=gnG-*gu zTpR`0f`dPcRR4rtTK|Hf* z>74h8qpTt+#OK8023?T&k?XR{Z=A~x3p_Jw zjFl;S-RIqX-oE`?)9K$2QdV-B0+hmD0000RP)t-sa45mxh&Z6Q`1sg(u=x16(D-%ro!DGLnrC*i&8wunSL72@zv1eWYr1GFQs3Ic1Qh=VE@&nK!M!#ov@R-SeuqH}q z?r?9BbA$yD^gN?3*`Y%K5~KG5j7QT=1?-1<0W-jPmH=k5_pze{<8_-?-$8#n#=`15 c*c!14KAO&)xz*2_-T(jq07*qoM6N<$f&_dn0RR91 literal 0 HcmV?d00001 diff --git a/public/item/crystal-switch-red.png b/public/item/crystal-switch-red.png new file mode 100644 index 0000000000000000000000000000000000000000..318ef3b5ebcb646d0cb7b987ea494c4bfb5c07e6 GIT binary patch literal 685 zcmV;e0#f~nP)EX>4Tx04R}tkv&MmKp2MKrb?w$9PA+CkfAzR5EXHhDi*;)X)CnqU~=gnG-*gu zTpR`0f`dPcRR4rtTK|Hf* z>74h8qpTt+#OK8023?T&k?XR{Z=A~x3p_Jw zjFl;S-RIqX-oE`?)9K$2QdV-B0+hmD0000LP)t-sVQg@qps?WJ@c5XR*f==&`1m+D zIRAhOumAu60d!JMQvg8b*k%9#00Cl4M??UK1szBL000SaNLh0L01FcU01FcV0GgZ_ z00007bV*G`2j>S23@J0s@8zoi004nWL_t(2&wbB}4S+BR1W;D!3ar2iu5c^d{v&wc zH!VsN^rwxyCwiO)r)3OL_|E&fQ~Hr0BjMN@17Pa|3P)!UIhZIH+$DnY{tyaP3rqKI$(EQ~}4kg*=q*`9urGb2rbtf@T}JaOD;3YOxM>)PHf0 Thy__400000NkvXXu0mjf^adqK literal 0 HcmV?d00001 diff --git a/public/item/crystal-switch.png b/public/item/crystal-switch.png new file mode 100644 index 0000000000000000000000000000000000000000..f2d647d438e0e729971ac6444ba8e590577fcfe4 GIT binary patch literal 805 zcmV+=1KRwFP)EX>4Tx04R}tkv&MmKp2MKrb?w$9PA+CkfAzR5EXHhDi*;)X)CnqU~=gnG-*gu zTpR`0f`dPcRR4rtTK|Hf* z>74h8qpTt+#OK8023?T&k?XR{Z=A~x3p_Jw zjFl;S-RIqX-oE`?)9K$2QdV-B0+hmD00006VoOIv00000008+zyMF)x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru=LZZ7DmtGY4$J@m0U}96K~z}7-Bz&;gfI+rUKET( zfdmaRFauK{reFqUpaF@3RoH;;zdGq-#WBzLwiag>PjJl|L2d7itJ^-zUx26nR_$r!nD-hhZQhqIsT!|83jm&C`_l9R)ZeAXW*p3S=7dvMfEOP19U5 z*A(SS*!O|hob%lOj}rp1xtF@dz5+#2ykl~T7~R2R$vOEx`@TCHPKXmN%R)p%bzReU ztlfUGwZPX!Y^Mf};|QLxs;VF}j05V z>H^ING^RY)u`r`Rrsa@#!Md)&Y6hhFQVrRA6H3l_7knM$-u|l?O7K3GJRLE7gLemK jZeM}B{vh?c*%#3Vngq4}`u#@*00000NkvXXu0mjfYyW3q literal 0 HcmV?d00001 diff --git a/public/item/ganon.png b/public/item/ganon.png new file mode 100644 index 0000000000000000000000000000000000000000..89fe005a677da287c2d72575cd2414539347fdb2 GIT binary patch literal 9502 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 Jv65}j{{iG8ZfXDk literal 0 HcmV?d00001 diff --git a/public/item/gt.png b/public/item/gt.png new file mode 100644 index 0000000000000000000000000000000000000000..cc95d58ea2469d6f3b7f9ad8eb8a89a75be6a4b5 GIT binary patch literal 1204 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 literal 0 HcmV?d00001 diff --git a/public/items-v2.png b/public/items-v2.png new file mode 100644 index 0000000000000000000000000000000000000000..d479d84269dc9c5985bbf4901a62c1ce40f2bae2 GIT binary patch literal 50600 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 z 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 EA5{pw@&Et; literal 0 HcmV?d00001 diff --git a/resources/js/components/common/ZeldaIcon.js b/resources/js/components/common/ZeldaIcon.js index 230b14e..3504dcf 100644 --- a/resources/js/components/common/ZeldaIcon.js +++ b/resources/js/components/common/ZeldaIcon.js @@ -19,15 +19,20 @@ const ITEM_MAP = [ 'book', 'boots', 'bottle-bee', + 'bottle-good-bee', 'bottle', 'bowless-silvers', 'bow', 'bugnet', + 'bunny-head', 'byrna', 'cape', 'chest', 'compass', 'crystal', + 'crystal-switch-blue', + 'crystal-switch', + 'crystal-switch-red', 'duck', 'ether', 'fairy', @@ -37,11 +42,13 @@ const ITEM_MAP = [ 'fire-shield', 'flippers', 'flute', + 'ganon', 'glove', 'gold-sword', 'green-mail', 'green-pendant', 'green-potion', + 'gt', 'half-magic', 'hammer', 'heart-0', @@ -56,6 +63,7 @@ const ITEM_MAP = [ 'kholdstare', 'lamp', 'lanmolas', + 'link-head', 'map', 'master-sword', 'mirror', @@ -84,20 +92,32 @@ const ITEM_MAP = [ 'sword-3', 'sword-4', 'tempered-sword', + 'triforce-piece', + 'triforce', 'trinexx', 'vitreous', ]; +const ITEM_MAP_WIDTH = 8; + +const ITEM_MAP_HEIGHT = Math.ceil(ITEM_MAP.length / ITEM_MAP_WIDTH); + +const ITEM_MAP_URL = '/items-v2.png'; + const isOnItemMap = name => ITEM_MAP.includes(name); -const getItemMapX = name => ITEM_MAP.indexOf(name) % 8; +const getItemMapX = name => ITEM_MAP.indexOf(name) % ITEM_MAP_WIDTH; -const getItemMapY = name => Math.floor(ITEM_MAP.indexOf(name) / 8); +const getItemMapY = name => Math.floor(ITEM_MAP.indexOf(name) / ITEM_MAP_WIDTH); const getItemMapStyle = name => { const x = getItemMapX(name); const y = getItemMapY(name); - return { backgroundPosition: `-${x * 100}% -${y * 100}%` }; + return { + backgroundImage: `url(${ITEM_MAP_URL})`, + backgroundPosition: `-${x * 100}% -${y * 100}%`, + backgroundSize: `${ITEM_MAP_WIDTH * 100}% ${ITEM_MAP_HEIGHT * 100}%`, + }; }; const getIconURL = name => { @@ -116,10 +136,6 @@ const getIconURL = name => { case 'dungeon-tr': case 'dungeon-tt': return `/dungeon/${name.substr(8)}.png`; - case 'crystal-switch': - case 'crystal-switch-blue': - case 'crystal-switch-red': - return `/icon/${name}.png`; default: return ''; } @@ -138,9 +154,9 @@ const ZeldaIcon = ({ name, svg, title }) => { const clipX = getItemMapX(strippedName); const clipY = getItemMapY(strippedName); return + +

{t('tracker.config.logic')}

+ + {t('tracker.config.worldState')} + + {['open', 'inverted'].map(n => + + )} + + + + {t('tracker.config.glitches')} + + {['none', 'owg', 'hmg', 'mg', 'nl'].map(n => + + )} + + + + {t('tracker.config.bossShuffle')} + + + + +

{t('tracker.config.goal')}

+ + {t('tracker.config.gtCrystals')} + + {['?', 0, 1, 2, 3, 4, 5, 6, 7].map(n => + + )} + + + + {t('tracker.config.ganonCrystals')} + + {['?', 0, 1, 2, 3, 4, 5, 6, 7].map(n => + + )} + + + + {t('tracker.config.goal')} + + {['ganon', 'fast', 'ad', 'ped', 'trinity', 'thunt', 'ghunt'].map(n => + + )} + + + +
+

{t('tracker.config.wildItems')}

{ const { t } = useTranslation(); @@ -687,7 +733,7 @@ const makeBackground = (src, level) => { }; const Overworld = () => { - const { dungeons, logic, setManualState, state } = useTracker(); + const { config, dungeons, logic, setManualState, state } = useTracker(); const mapDungeon = React.useCallback(dungeon => { const definition = dungeons.find(d => d.id === dungeon.id); @@ -769,11 +815,23 @@ const Overworld = () => { }; }, [logic, setManualState, state]); - const lwDungeons = React.useMemo(() => LW_DUNGEONS.map(mapDungeon), [mapDungeon]); - const lwLocations = React.useMemo(() => LW_LOCATIONS.map(mapLocation), [mapLocation]); + const lwDungeons = React.useMemo(() => + (config.worldState === 'inverted' ? INVERTED_LW_DUNGEONS : LW_DUNGEONS) + .map(mapDungeon) + , [mapDungeon]); + const lwLocations = React.useMemo(() => + (config.worldState === 'inverted' ? INVERTED_LW_LOCATIONS : LW_LOCATIONS) + .map(mapLocation) + , [mapLocation]); - const dwDungeons = React.useMemo(() => DW_DUNGEONS.map(mapDungeon), [mapDungeon]); - const dwLocations = React.useMemo(() => DW_LOCATIONS.map(mapLocation), [mapLocation]); + const dwDungeons = React.useMemo(() => + (config.worldState === 'inverted' ? INVERTED_DW_DUNGEONS : DW_DUNGEONS) + .map(mapDungeon) + , [mapDungeon]); + const dwLocations = React.useMemo(() => + (config.worldState === 'inverted' ? INVERTED_DW_LOCATIONS : DW_LOCATIONS) + .map(mapLocation) + , [mapLocation]); return { const [showConfigDialog, setShowConfigDialog] = React.useState(false); const { config, saveConfig } = useTracker(); + const { t } = useTranslation(); - const controller = React.useMemo(() => ({ + const handleConfigChange = React.useCallback(({ target: { name, value } }) => { + saveConfig({ [name]: value }); + }, [saveConfig]); + + const bossController = React.useMemo(() => ({ + getActive: (state, icons) => config.bossShuffle ? icons[0] : null, + getDefault: (state, icons) => icons[0], + handlePrimary: () => { + saveConfig({ bossShuffle: !config.bossShuffle}); + }, + handleSecondary: () => null, + }), [config, saveConfig]); + + const wildController = React.useMemo(() => ({ getActive: (state, icons) => config[mapWild[icons[0]]] ? icons[0] : null, getDefault: (state, icons) => icons[0], handlePrimary: (state, setState, icons) => { @@ -28,6 +45,15 @@ const Toolbar = () => { handleSecondary: () => null, }), [config, saveConfig]); + const worldController = React.useMemo(() => ({ + getActive: (state, icons) => config.worldState === 'inverted' ? icons[1] : icons[0], + getDefault: (state, icons) => icons[0], + handlePrimary: () => { + saveConfig({ worldState: config.worldState == 'inverted' ? 'open' : 'inverted' }); + }, + handleSecondary: () => null, + }), [config, saveConfig]); + return
@@ -38,12 +64,78 @@ const Toolbar = () => { > - - - - + + + + + + +
+
+ + + + + + {['?', 0, 1, 2, 3, 4, 5, 6, 7].map(n => + + )} + + + + + + + + {['?', 0, 1, 2, 3, 4, 5, 6, 7].map(n => + + )} + + + + + + + + {['ganon', 'fast', 'ad', 'ped', 'trinity', 'thunt', 'ghunt'].map(n => + + )} + + +
+
+
- setShowConfigDialog(false)} show={showConfigDialog} /> ; diff --git a/resources/js/helpers/logic.js b/resources/js/helpers/logic.js index 1754941..5225613 100644 --- a/resources/js/helpers/logic.js +++ b/resources/js/helpers/logic.js @@ -13,8 +13,17 @@ const and = (...predicates) => (...args) => const or = (...predicates) => (...args) => predicates.reduce((acc, cur) => acc || cur(...args), false); +const when = (condition, then, otherwise) => (...args) => + condition(...args) ? then(...args) : otherwise(...args); + +const alwaysAvailable = () => true; + +const neverAvailable = () => false; + const fromBool = b => (...args) => b(...args) ? 'available' : 'unavailable'; +const isInverted = (config) => config.worldState === 'inverted'; + const agaDead = (config, dungeons, state) => hasDungeonBoss(state, dungeons.find(d => d.id === 'ct')); @@ -34,7 +43,7 @@ const countRedCrystals = (config, dungeons, state) => dungeons const hasRedCrystals = n => (...args) => countRedCrystals(...args) >= n; const hasGTCrystals = (config, dungeons, state) => - countCrystals(config, dungeons, state) >= getGTCrystals(state); + countCrystals(config, dungeons, state) >= getGTCrystals(config); const countPendants = (config, dungeons, state) => dungeons .filter(dungeon => @@ -128,14 +137,14 @@ const hasTRMedallion = (config, dungeons, state) => // Abilities -const canActivateFlute = () => true; - const canBomb = () => true; const canBonk = hasBoots; const canDarkRoom = hasLamp; +const canShootArrows = hasBow; + const canFlipSwitches = or( canBomb, hasBoom, @@ -149,14 +158,26 @@ const canFlipSwitches = or( hasIceRod, ); -const canFly = or(hasBird, and(hasFlute, canActivateFlute)); - const canGetGoodBee = and(hasBugnet, hasBottle(), or(canBonk, and(hasSword(), hasQuake))); const canLift = (config, dungeons, state) => state['lift'] >= 1; const canHeavyLift = (config, dungeons, state) => state['lift'] >= 2; +const canActivateFlute = when(isInverted, + and( + hasMoonpearl, + or( + // partial copy of east light world + agaDead, + and(hasMoonpearl, or(and(canLift, hasHammer), canHeavyLift)), + ), + ), + alwaysAvailable, +); + +const canFly = or(hasBird, and(hasFlute, canActivateFlute)); + const canKill = damage => damage && damage < 6 ? or(hasBow, hasFireRod, hasHammer, hasSomaria, hasSword(1), canBomb, hasByrna) : or(hasBow, hasFireRod, hasHammer, hasSomaria, hasSword(1)); @@ -167,8 +188,6 @@ const canMeltThings = or(hasFireRod, and(hasBombos, canMedallion)); const canPassCurtains = hasSword(); -const canShootArrows = hasBow; - const canSwim = (config, dungeons, state) => !!state['flippers']; const canTablet = and(hasBook, hasSword(2)); @@ -184,53 +203,100 @@ const westDeathMountain = or( and(canLift, canDarkRoom), ); -const eastDeathMountain = and( +const westDarkDeathMountain = when(isInverted, + or(canFly, and(canLift, canDarkRoom)), westDeathMountain, - or( - hasHookshot, - and(hasHammer, hasMirror), - ), ); -const northDeathMountain = and( - westDeathMountain, +const eastDeathMountain = when(isInverted, or( - hasMirror, - and(hasHammer, hasHookshot), + and(canHeavyLift, or( + // copy of eastDarkDeathMountain, to avoid circular reference + westDarkDeathMountain, + and(westDeathMountain, hasMoonpearl, hasHookshot, hasMirror), + )), + and(westDeathMountain, hasMoonpearl, hasHookshot), + ), + and( + westDeathMountain, + or( + hasHookshot, + and(hasHammer, hasMirror), + ), ), ); -const eastDarkDeathMountain = and( - eastDeathMountain, - canHeavyLift, +const northDeathMountain = when(isInverted, + and(eastDeathMountain, hasMoonpearl, hasHammer), + and( + westDeathMountain, + or( + hasMirror, + and(hasHammer, hasHookshot), + ), + ), ); -const westDarkDeathMountain = westDeathMountain; - -const eastDarkWorld = and( - hasMoonpearl, +const eastDarkDeathMountain = when(isInverted, or( - agaDead, + westDarkDeathMountain, + and(westDeathMountain, hasMoonpearl, hasHookshot, hasMirror), + ), + and( + eastDeathMountain, canHeavyLift, - and(canLift, hasHammer), ), ); -const westDarkWorld = and( - hasMoonpearl, +const eastLightWorld = when(isInverted, or( - and(canLift, hasHammer), - canHeavyLift, - and(eastDarkWorld, hasHookshot, or(canSwim, canLift, hasHammer)), + agaDead, + and(hasMoonpearl, or(and(canLift, hasHammer), canHeavyLift)), + and(canFly, canHeavyLift), ), + alwaysAvailable, ); -const southDarkWorld = or( - westDarkWorld, - and(eastDarkWorld, hasMoonpearl, hasHammer), +const westLightWorld = eastLightWorld; + +const southLightWorld = eastLightWorld; + +const eastDarkWorld = when(isInverted, + or(canFly, canSwim, hasHammer, and(hasMoonpearl, eastLightWorld)), + and( + hasMoonpearl, + or( + agaDead, + canHeavyLift, + and(canLift, hasHammer), + ), + ), ); -const mireArea = and(canFly, canHeavyLift); +const westDarkWorld = when(isInverted, + alwaysAvailable, + and( + hasMoonpearl, + or( + and(canLift, hasHammer), + canHeavyLift, + and(eastDarkWorld, hasHookshot, or(canSwim, canLift, hasHammer)), + ), + ), +); + +const southDarkWorld = when(isInverted, + alwaysAvailable, + or( + westDarkWorld, + and(eastDarkWorld, hasMoonpearl, hasHammer), + ), +); + +const mireArea = when(isInverted, + or(canFly, and(hasMirror, southLightWorld)), + and(canFly, canHeavyLift), +); // Bosses @@ -285,58 +351,112 @@ const canKillGTBoss = which => (config, dungeons, state) => { // Dungeons -const canEnterCT = or(hasCape, hasSword(2)); +const canEnterHC = when(isInverted, + and(hasMoonpearl, eastLightWorld), + alwaysAvailable, +); + +const canEnterCT = when(isInverted, + westDarkDeathMountain, + or(hasCape, hasSword(2)), +); -const canEnterGT = and(eastDarkDeathMountain, hasGTCrystals, hasMoonpearl); +const canEnterGT = when(isInverted, + and(eastLightWorld, hasGTCrystals, hasMoonpearl), + and(eastDarkDeathMountain, hasGTCrystals, hasMoonpearl), +); + +const canEnterEP = when(isInverted, + and(hasMoonpearl, eastLightWorld), + alwaysAvailable, +); -const canEnterDPFront = or(hasBook, and(mireArea, hasMirror)); -const canEnterDPBack = or(and(canEnterDPFront, canLift), and(mireArea, hasMirror)); +const canEnterDPFront = when(isInverted, + and(southLightWorld, hasBook), + or(hasBook, and(mireArea, hasMirror)), +); +const canEnterDPBack = when(isInverted, + and(canEnterDPFront, canLift), + or(and(canEnterDPFront, canLift), and(mireArea, hasMirror)), +); const canEnterTH = northDeathMountain; -const canEnterPD = and(eastDarkWorld, hasMoonpearl); +const canEnterPD = when(isInverted, + eastDarkWorld, + and(eastDarkWorld, hasMoonpearl), +); -const canEnterSP = and(southDarkWorld, hasMirror, hasMoonpearl, canSwim); +const canEnterSP = when(isInverted, + and(southLightWorld, hasMirror, hasMoonpearl, canSwim), + and(southDarkWorld, hasMirror, hasMoonpearl, canSwim), +); -const canEnterSWFront = and(westDarkWorld, hasMoonpearl); -const canEnterSWMid = and(westDarkWorld, hasMoonpearl); -const canEnterSWBack = and(westDarkWorld, hasMoonpearl, hasFireRod); +const canEnterSWFront = when(isInverted, + westDarkWorld, + and(westDarkWorld, hasMoonpearl), +); +const canEnterSWMid = canEnterSWFront; +const canEnterSWBack = and(canEnterSWMid, hasFireRod); -const canEnterTT = and(westDarkWorld, hasMoonpearl); +const canEnterTT = when(isInverted, + westDarkWorld, + and(westDarkWorld, hasMoonpearl), +); -const canEnterIP = and(canSwim, canHeavyLift, hasMoonpearl, canMeltThings); +const canEnterIP = when(isInverted, + and(canSwim, canMeltThings), + and(canSwim, canHeavyLift, hasMoonpearl, canMeltThings), +); const rightSideIP = or(hasHookshot, hasSmall('ip')); -const canEnterMM = and( - mireArea, - hasMoonpearl, - hasMMMedallion, - canMedallion, - or(canBonk, hasHookshot), - canKill(8), +const canEnterMM = when(isInverted, + and( + mireArea, + hasMMMedallion, + canMedallion, + or(canBonk, hasHookshot), + canKill(8), + ), + and( + mireArea, + hasMoonpearl, + hasMMMedallion, + canMedallion, + or(canBonk, hasHookshot), + canKill(8), + ), ); -const canEnterTRFront = and( - eastDeathMountain, - canHeavyLift, - hasHammer, - hasMoonpearl, - canMedallion, - hasTRMedallion, +const canEnterTRFront = when(isInverted, + and( + eastDarkDeathMountain, + canMedallion, + hasTRMedallion, + hasSomaria, + ), + and( + eastDeathMountain, + canHeavyLift, + hasHammer, + hasMoonpearl, + canMedallion, + hasTRMedallion, + hasSomaria, + ), +); +const canEnterTRWest = when(isInverted, + and(eastDeathMountain, hasMirror), + neverAvailable, ); -const canEnterTRWest = and(canEnterTRFront, canBomb, hasSmall('tr', 2)); const canEnterTREast = and(canEnterTRWest, or(hasHookshot, hasSomaria)); -const canEnterTRBack = and( - or(canEnterTRWest, canEnterTREast), - or(canBomb, canBonk), - hasBig('tr'), - hasSmall('tr', 3), - hasSomaria, - canDarkRoom, +const canEnterTRBack = when(isInverted, + and(eastDeathMountain, hasMirror), + neverAvailable, ); const laserBridge = or( and( - or(canEnterDPFront, canEnterTRWest, canEnterTREast), + or(canEnterTRFront, canEnterTRWest, canEnterTREast), canDarkRoom, hasSomaria, hasBig('tr'), @@ -358,111 +478,18 @@ const canRescueSmith = and(westDarkWorld, hasMoonpearl, canHeavyLift); const Logic = {}; -Logic.open = { - fallback: () => 'available', - aginah: fromBool(canBomb), - blacksmith: fromBool(canRescueSmith), - 'blinds-hut-top': fromBool(canBomb), - 'bombos-tablet': fromBool(and(southDarkWorld, hasMirror, canTablet)), - 'bonk-rocks': fromBool(canBonk), - brewery: fromBool(and(westDarkWorld, canBomb, hasMoonpearl)), - 'bumper-cave': fromBool(and(westDarkWorld, hasMoonpearl, canLift, hasCape)), - 'c-house': fromBool(and(westDarkWorld, hasMoonpearl)), - catfish: fromBool(and(eastDarkWorld, hasMoonpearl)), - 'cave-45': fromBool(and(southDarkWorld, hasMirror)), - checkerboard: fromBool(and(mireArea, hasMirror)), - 'chest-game': fromBool(and(westDarkWorld, hasMoonpearl)), - 'chicken-house': fromBool(canBomb), - 'desert-ledge': fromBool(canEnterDPFront), - 'digging-game': fromBool(and(southDarkWorld, hasMoonpearl)), - 'ether-tablet': fromBool(and(northDeathMountain, canTablet)), - 'floating-island': fromBool( - and(eastDarkDeathMountain, hasMoonpearl, canLift, canBomb, hasMirror), - ), - 'flute-spot': fromBool(hasShovel), - 'graveyard-ledge': fromBool(and(westDarkWorld, hasMoonpearl, hasMirror)), - 'hammer-pegs': fromBool(and(westDarkWorld, hasHammer, hasMoonpearl, canHeavyLift)), - hobo: fromBool(canSwim), - 'hookshot-cave-tl': fromBool(and(eastDarkDeathMountain, hasMoonpearl, canLift, hasHookshot)), - 'hookshot-cave-tr': fromBool(and(eastDarkDeathMountain, hasMoonpearl, canLift, hasHookshot)), - 'hookshot-cave-bl': fromBool(and(eastDarkDeathMountain, hasMoonpearl, canLift, hasHookshot)), - 'hookshot-cave-br': fromBool( - and(eastDarkDeathMountain, hasMoonpearl, canLift, or(hasHookshot, canBonk)), - ), - 'hype-cave-npc': fromBool(and(southDarkWorld, hasMoonpearl, canBomb)), - 'hype-cave-top': fromBool(and(southDarkWorld, hasMoonpearl, canBomb)), - 'hype-cave-right': fromBool(and(southDarkWorld, hasMoonpearl, canBomb)), - 'hype-cave-left': fromBool(and(southDarkWorld, hasMoonpearl, canBomb)), - 'hype-cave-bottom': fromBool(and(southDarkWorld, hasMoonpearl, canBomb)), - 'ice-rod-cave': fromBool(canBomb), - 'kak-well-top': fromBool(canBomb), - 'kings-tomb': fromBool(and(canBonk, or(canHeavyLift, and(westDarkWorld, hasMirror)))), - 'lake-hylia-island': fromBool( - and(canSwim, hasMirror, hasMoonpearl, or(eastDarkWorld, southDarkWorld)), - ), - library: fromBool(canBonk), - lumberjack: fromBool(and(canBonk, agaDead)), - 'magic-bat': fromBool(and(hasPowder, - or(hasHammer, and(westDarkWorld, hasMoonpearl, canHeavyLift, hasMirror)), - )), - 'mimic-cave': fromBool(and(canEnterTREast, hasMirror, hasHammer)), - 'mini-moldorm-left': fromBool(canBomb), - 'mini-moldorm-right': fromBool(canBomb), - 'mini-moldorm-far-left': fromBool(canBomb), - 'mini-moldorm-far-right': fromBool(canBomb), - 'mini-moldorm-npc': fromBool(canBomb), - 'mire-shed-left': fromBool(and(mireArea, hasMoonpearl)), - 'mire-shed-right': fromBool(and(mireArea, hasMoonpearl)), - 'old-man': fromBool(and(westDeathMountain, canDarkRoom)), - 'paradox-lower-far-left': fromBool(paradoxLower), - 'paradox-lower-left': fromBool(paradoxLower), - 'paradox-lower-right': fromBool(paradoxLower), - 'paradox-lower-far-right': fromBool(paradoxLower), - 'paradox-lower-mid': fromBool(paradoxLower), - 'paradox-upper-left': fromBool(and(eastDeathMountain, canBomb)), - 'paradox-upper-right': fromBool(and(eastDeathMountain, canBomb)), - pedestal: fromBool(hasPendants(3)), - 'potion-shop': fromBool(hasMushroom), - 'purple-chest': fromBool(and(canRescueSmith, hasMoonpearl, canHeavyLift)), - pyramid: fromBool(eastDarkWorld), - 'pyramid-fairy-left': fromBool(and(hasRedCrystals(2), southDarkWorld, canBridgeRedBomb)), - 'pyramid-fairy-right': fromBool(and(hasRedCrystals(2), southDarkWorld, canBridgeRedBomb)), - 'race-game': fromBool(or(canBomb, canBonk)), - saha: fromBool(hasGreenPendant), - 'saha-left': fromBool(or(canBomb, canBonk)), - 'saha-mid': fromBool(or(canBomb, canBonk)), - 'saha-right': fromBool(or(canBomb, canBonk)), - 'sick-kid': fromBool(hasBottle(1)), - 'spec-rock': fromBool(and(westDeathMountain, hasMirror)), - 'spec-rock-cave': fromBool(westDeathMountain), - 'spike-cave': fromBool(and( - westDarkDeathMountain, - hasMoonpearl, - hasHammer, - canLift, - or(hasByrna, and(hasCape, hasMagicBars(2))), - )), - 'spiral-cave': fromBool(eastDeathMountain), - stumpy: fromBool(and(southDarkWorld, hasMoonpearl)), - 'super-bunny-top': fromBool(and(eastDarkDeathMountain, hasMoonpearl)), - 'super-bunny-bottom': fromBool(and(eastDarkDeathMountain, hasMoonpearl)), - 'waterfall-fairy-left': fromBool(canSwim), - 'waterfall-fairy-right': fromBool(canSwim), - zora: fromBool(or(canLift, canSwim)), - 'zora-ledge': fromBool(canSwim), +Logic.dungeonInterior = { 'hc-boom': fromBool(and(hasSmall('hc'), canKill())), 'hc-cell': fromBool(and(hasSmall('hc'), canKill())), 'dark-cross': fromBool(canTorchDarkRoom), 'sewers-left': fromBool(or(canLift, and(canTorchDarkRoom, hasSmall('hc'), canKill()))), 'sewers-mid': fromBool(or(canLift, and(canTorchDarkRoom, hasSmall('hc'), canKill()))), 'sewers-right': fromBool(or(canLift, and(canTorchDarkRoom, hasSmall('hc'), canKill()))), - ct: fromBool(canEnterCT), 'ct-1': fromBool(canKill()), 'ct-2': fromBool(and(canKill(), hasSmall('ct'), canDarkRoom)), 'ct-boss-killable': fromBool(and( canKill(), hasSmall('ct', 2), canDarkRoom, canPassCurtains, canKillBoss('ct'), )), - gt: fromBool(canEnterGT), 'gt-tile-room': fromBool(hasSomaria), 'gt-compass-tl': fromBool(and(hasSomaria, hasFireRod, hasSmall('gt', 4))), 'gt-compass-tr': fromBool(and(hasSomaria, hasFireRod, hasSmall('gt', 4))), @@ -548,7 +575,6 @@ Logic.open = { 'ep-boss-defeated': fromBool(and( canShootArrows, canTorchDarkRoom, hasBig('ep'), canKillBoss('ep'), )), - dp: fromBool(or(canEnterDPFront, canEnterDPBack)), 'dp-big-chest': fromBool(and(canEnterDPFront, hasBig('dp'))), 'dp-big-key-chest': fromBool(and(canEnterDPFront, hasSmall('dp'), canKill())), 'dp-compass-chest': fromBool(and(canEnterDPFront, hasSmall('dp'))), @@ -561,7 +587,6 @@ Logic.open = { hasSmall('dp'), canKillBoss('dp'), )), - th: fromBool(canEnterTH), 'th-basement-cage': fromBool(canFlipSwitches), 'th-map-chest': fromBool(canFlipSwitches), 'th-big-key-chest': fromBool(and(canFlipSwitches, hasSmall('th'), canTorch)), @@ -572,7 +597,6 @@ Logic.open = { hasBig('th'), canKillBoss('th'), )), - pd: fromBool(canEnterPD), 'pd-stalfos-basement': fromBool(or(hasSmall('pd', 1), and(canShootArrows, hasHammer))), 'pd-big-key-chest': fromBool(hasSmall('pd', 6)), 'pd-arena-bridge': fromBool(or(hasSmall('pd', 1), and(canShootArrows, hasHammer))), @@ -588,7 +612,6 @@ Logic.open = { 'pd-boss-defeated': fromBool(and( canDarkRoom, hasBig('pd'), hasSmall('pd', 6), canShootArrows, hasHammer, canKillBoss('pd'), )), - sp: fromBool(canEnterSP), 'sp-map-chest': fromBool(and(hasSmall('sp'), canBomb)), 'sp-big-chest': fromBool(and(hasSmall('sp'), hasHammer, hasBig('sp'))), 'sp-compass-chest': fromBool(and(hasSmall('sp'), hasHammer)), @@ -598,18 +621,15 @@ Logic.open = { 'sp-flooded-right': fromBool(and(hasSmall('sp'), hasHammer, hasHookshot)), 'sp-waterfall': fromBool(and(hasSmall('sp'), hasHammer, hasHookshot)), 'sp-boss-defeated': fromBool(and(hasSmall('sp'), hasHammer, hasHookshot, canKillBoss('sp'))), - sw: fromBool(or(canEnterSWFront, canEnterSWMid, canEnterSWBack)), 'sw-big-chest': fromBool(and(canEnterSWFront, hasBig('sw'))), 'sw-bridge-chest': fromBool(canEnterSWBack), 'sw-boss-defeated': fromBool(and( canEnterSWBack, canPassCurtains, hasFireRod, hasSmall('sw', 3), canKillBoss('sw'), )), - tt: fromBool(canEnterTT), 'tt-attic': fromBool(and(hasBig('tt'), hasSmall('tt'), canBomb)), 'tt-cell': fromBool(hasBig('tt')), 'tt-big-chest': fromBool(and(hasBig('tt'), hasSmall('tt'), hasHammer)), 'tt-boss-defeated': fromBool(and(hasBig('tt'), hasSmall('tt'), canKillBoss('tt'))), - ip: fromBool(canEnterIP), 'ip-big-key-chest': fromBool(and(rightSideIP, hasHammer, canLift)), 'ip-map-chest': fromBool(and(rightSideIP, hasHammer, canLift)), 'ip-spike-chest': fromBool(rightSideIP), @@ -622,14 +642,12 @@ Logic.open = { or(hasSmall('ip', 2), and(hasSomaria, hasSmall('ip'))), canKillBoss('ip'), )), - mm: fromBool(canEnterMM), 'mm-lobby-chest': fromBool(or(hasBig('mm'), hasSmall('mm'))), 'mm-compass-chest': fromBool(and(canTorch, hasSmall('mm', 3))), 'mm-big-key-chest': fromBool(and(canTorch, hasSmall('mm', 3))), 'mm-big-chest': fromBool(hasBig('mm')), 'mm-map-chest': fromBool(or(hasBig('mm'), hasSmall('mm'))), 'mm-boss-defeated': fromBool(and(hasBig('mm'), canDarkRoom, hasSomaria, canKillBoss('mm'))), - tr: fromBool(or(canEnterTRFront, canEnterTRWest, canEnterTREast, canEnterTRBack)), 'tr-roller-left': fromBool(and(hasFireRod, hasSomaria, or( canEnterTRFront, and(or(canEnterTRWest, canEnterTREast), hasSmall('tr', 4)), @@ -679,4 +697,250 @@ Logic.open = { )), }; +Logic.open = { + fallback: fromBool(alwaysAvailable), + aginah: fromBool(canBomb), + blacksmith: fromBool(canRescueSmith), + 'blinds-hut-top': fromBool(canBomb), + 'bombos-tablet': fromBool(and(southDarkWorld, hasMirror, canTablet)), + 'bonk-rocks': fromBool(canBonk), + brewery: fromBool(and(westDarkWorld, canBomb, hasMoonpearl)), + 'bumper-cave': fromBool(and(westDarkWorld, hasMoonpearl, canLift, hasCape)), + 'c-house': fromBool(and(westDarkWorld, hasMoonpearl)), + catfish: fromBool(and(eastDarkWorld, hasMoonpearl)), + 'cave-45': fromBool(and(southDarkWorld, hasMirror)), + checkerboard: fromBool(and(mireArea, hasMirror)), + 'chest-game': fromBool(and(westDarkWorld, hasMoonpearl)), + 'chicken-house': fromBool(canBomb), + 'desert-ledge': fromBool(canEnterDPFront), + 'digging-game': fromBool(and(southDarkWorld, hasMoonpearl)), + 'ether-tablet': fromBool(and(northDeathMountain, canTablet)), + 'floating-island': fromBool( + and(eastDarkDeathMountain, hasMoonpearl, canLift, canBomb, hasMirror), + ), + 'flute-spot': fromBool(hasShovel), + 'graveyard-ledge': fromBool(and(westDarkWorld, hasMoonpearl, hasMirror)), + 'hammer-pegs': fromBool(and(westDarkWorld, hasHammer, hasMoonpearl, canHeavyLift)), + hobo: fromBool(canSwim), + 'hookshot-cave-tl': fromBool(and(eastDarkDeathMountain, hasMoonpearl, canLift, hasHookshot)), + 'hookshot-cave-tr': fromBool(and(eastDarkDeathMountain, hasMoonpearl, canLift, hasHookshot)), + 'hookshot-cave-bl': fromBool(and(eastDarkDeathMountain, hasMoonpearl, canLift, hasHookshot)), + 'hookshot-cave-br': fromBool( + and(eastDarkDeathMountain, hasMoonpearl, canLift, or(hasHookshot, canBonk)), + ), + 'hype-cave-npc': fromBool(and(southDarkWorld, hasMoonpearl, canBomb)), + 'hype-cave-top': fromBool(and(southDarkWorld, hasMoonpearl, canBomb)), + 'hype-cave-right': fromBool(and(southDarkWorld, hasMoonpearl, canBomb)), + 'hype-cave-left': fromBool(and(southDarkWorld, hasMoonpearl, canBomb)), + 'hype-cave-bottom': fromBool(and(southDarkWorld, hasMoonpearl, canBomb)), + 'ice-rod-cave': fromBool(canBomb), + 'kak-well-top': fromBool(canBomb), + 'kings-tomb': fromBool(and(canBonk, or(canHeavyLift, and(westDarkWorld, hasMirror)))), + 'lake-hylia-island': fromBool( + and(canSwim, hasMirror, hasMoonpearl, or(eastDarkWorld, southDarkWorld)), + ), + library: fromBool(canBonk), + lumberjack: fromBool(and(canBonk, agaDead)), + 'magic-bat': fromBool(and(hasPowder, + or(hasHammer, and(westDarkWorld, hasMoonpearl, canHeavyLift, hasMirror)), + )), + 'mimic-cave': fromBool(and(canEnterTRFront, canBomb, hasSmall('tr', 2), hasMirror, hasHammer)), + 'mini-moldorm-left': fromBool(canBomb), + 'mini-moldorm-right': fromBool(canBomb), + 'mini-moldorm-far-left': fromBool(canBomb), + 'mini-moldorm-far-right': fromBool(canBomb), + 'mini-moldorm-npc': fromBool(canBomb), + 'mire-shed-left': fromBool(and(mireArea, hasMoonpearl)), + 'mire-shed-right': fromBool(and(mireArea, hasMoonpearl)), + 'old-man': fromBool(and(westDeathMountain, canDarkRoom)), + 'paradox-lower-far-left': fromBool(paradoxLower), + 'paradox-lower-left': fromBool(paradoxLower), + 'paradox-lower-right': fromBool(paradoxLower), + 'paradox-lower-far-right': fromBool(paradoxLower), + 'paradox-lower-mid': fromBool(paradoxLower), + 'paradox-upper-left': fromBool(and(eastDeathMountain, canBomb)), + 'paradox-upper-right': fromBool(and(eastDeathMountain, canBomb)), + pedestal: fromBool(hasPendants(3)), + 'potion-shop': fromBool(hasMushroom), + 'purple-chest': fromBool(and(canRescueSmith, hasMoonpearl, canHeavyLift)), + pyramid: fromBool(eastDarkWorld), + 'pyramid-fairy-left': fromBool(and(hasRedCrystals(2), southDarkWorld, canBridgeRedBomb)), + 'pyramid-fairy-right': fromBool(and(hasRedCrystals(2), southDarkWorld, canBridgeRedBomb)), + 'race-game': fromBool(or(canBomb, canBonk)), + saha: fromBool(hasGreenPendant), + 'saha-left': fromBool(or(canBomb, canBonk)), + 'saha-mid': fromBool(or(canBomb, canBonk)), + 'saha-right': fromBool(or(canBomb, canBonk)), + 'sick-kid': fromBool(hasBottle(1)), + 'spec-rock': fromBool(and(westDeathMountain, hasMirror)), + 'spec-rock-cave': fromBool(westDeathMountain), + 'spike-cave': fromBool(and( + westDarkDeathMountain, + hasMoonpearl, + hasHammer, + canLift, + or(hasByrna, and(hasCape, hasMagicBars(2))), + )), + 'spiral-cave': fromBool(eastDeathMountain), + stumpy: fromBool(and(southDarkWorld, hasMoonpearl)), + 'super-bunny-top': fromBool(and(eastDarkDeathMountain, hasMoonpearl)), + 'super-bunny-bottom': fromBool(and(eastDarkDeathMountain, hasMoonpearl)), + 'waterfall-fairy-left': fromBool(canSwim), + 'waterfall-fairy-right': fromBool(canSwim), + zora: fromBool(or(canLift, canSwim)), + 'zora-ledge': fromBool(canSwim), + ct: fromBool(canEnterCT), + gt: fromBool(canEnterGT), + dp: fromBool(or(canEnterDPFront, canEnterDPBack)), + th: fromBool(canEnterTH), + pd: fromBool(canEnterPD), + sp: fromBool(canEnterSP), + sw: fromBool(or(canEnterSWFront, canEnterSWMid, canEnterSWBack)), + tt: fromBool(canEnterTT), + ip: fromBool(canEnterIP), + mm: fromBool(canEnterMM), + tr: fromBool(or(canEnterTRFront, canEnterTRWest, canEnterTREast, canEnterTRBack)), + ...Logic.dungeonInterior, +}; + +Logic.inverted = { + fallback: fromBool(alwaysAvailable), + aginah: fromBool(and(southLightWorld, hasMoonpearl, canBomb)), + blacksmith: fromBool(and(or(canHeavyLift, hasMirror), westLightWorld)), + 'blinds-hut-top': fromBool(and(westLightWorld, hasMoonpearl, canBomb)), + 'blinds-hut-far-left': fromBool(and(westLightWorld, hasMoonpearl)), + 'blinds-hut-left': fromBool(and(westLightWorld, hasMoonpearl)), + 'blinds-hut-right': fromBool(and(westLightWorld, hasMoonpearl)), + 'blinds-hut-far-right': fromBool(and(westLightWorld, hasMoonpearl)), + 'bombos-tablet': fromBool(and(southLightWorld, canTablet)), + 'bonk-rocks': fromBool(and(westLightWorld, hasMoonpearl, canBonk)), + 'bottle-vendor': fromBool(westLightWorld), + brewery: fromBool(canBomb), + 'bumper-cave': fromBool(and(canLift, hasCape, hasMoonpearl, hasMirror, westLightWorld)), + catfish: fromBool(or( + and(eastDarkWorld, canLift), + and(hasMirror, southLightWorld, hasMoonpearl, canSwim), + )), + 'cave-45': fromBool(and(southLightWorld, hasMoonpearl)), + checkerboard: fromBool(and(southLightWorld, hasMoonpearl, canLift)), + 'chicken-house': fromBool(and(westLightWorld, hasMoonpearl, canBomb)), + 'desert-ledge': fromBool(and(hasMoonpearl, canEnterDPFront)), + 'ether-tablet': fromBool(and(northDeathMountain, canTablet)), + 'floating-island': fromBool(and(eastDeathMountain)), + 'flooded-chest': fromBool(and(southLightWorld, hasMoonpearl)), + 'flute-spot': fromBool(and(southLightWorld, hasMoonpearl, hasShovel)), + 'graveyard-ledge': fromBool(and(westLightWorld, hasMoonpearl)), + 'hammer-pegs': fromBool(and(hasHammer, or(canHeavyLift, and(westLightWorld, hasMirror)))), + hobo: fromBool(and(southLightWorld, hasMoonpearl, canSwim)), + 'hookshot-cave-tl': fromBool(and( + eastDarkDeathMountain, + hasHookshot, + or(canLift, and(canBomb, hasMirror, eastDeathMountain)), + )), + 'hookshot-cave-tr': fromBool(and( + eastDarkDeathMountain, + hasHookshot, + or(canLift, and(canBomb, hasMirror, eastDeathMountain)), + )), + 'hookshot-cave-bl': fromBool(and( + eastDarkDeathMountain, + hasHookshot, + or(canLift, and(canBomb, hasMirror, eastDeathMountain)), + )), + 'hookshot-cave-br': fromBool(and( + eastDarkDeathMountain, + or(canBonk, hasHookshot), + or(canLift, and(canBomb, hasMirror, eastDeathMountain)), + )), + 'hype-cave-npc': fromBool(canBomb), + 'hype-cave-top': fromBool(canBomb), + 'hype-cave-right': fromBool(canBomb), + 'hype-cave-left': fromBool(canBomb), + 'hype-cave-bottom': fromBool(canBomb), + 'ice-rod-cave': fromBool(and(southLightWorld, hasMoonpearl, canBomb)), + 'kak-well-top': fromBool(and(westLightWorld, hasMoonpearl, canBomb)), + 'kak-well-left': fromBool(and(westLightWorld, hasMoonpearl)), + 'kak-well-mid': fromBool(and(westLightWorld, hasMoonpearl)), + 'kak-well-right': fromBool(and(westLightWorld, hasMoonpearl)), + 'kak-well-bottom': fromBool(and(westLightWorld, hasMoonpearl)), + 'kings-tomb': fromBool(and(westLightWorld, hasMoonpearl, canBonk, canHeavyLift)), + 'lake-hylia-island': fromBool( + and(southLightWorld, hasMoonpearl, canSwim), + ), + library: fromBool(and(southLightWorld, hasMoonpearl, canBonk)), + lumberjack: fromBool(and(westLightWorld, hasMoonpearl, canBonk, agaDead)), + 'lost-woods-hideout': fromBool(and(westLightWorld, hasMoonpearl)), + 'magic-bat': fromBool(and(westLightWorld, hasMoonpearl, hasPowder, hasHammer)), + 'maze-race': fromBool(and(southLightWorld, hasMoonpearl, or(canBomb, canBonk))), + 'mimic-cave': fromBool(and( + eastDeathMountain, + hasMoonpearl, + hasHammer, + )), + 'mini-moldorm-far-left': fromBool(and(southLightWorld, hasMoonpearl, canBomb, canKill)), + 'mini-moldorm-left': fromBool(and(southLightWorld, hasMoonpearl, canBomb, canKill)), + 'mini-moldorm-right': fromBool(and(southLightWorld, hasMoonpearl, canBomb, canKill)), + 'mini-moldorm-far-right': fromBool(and(southLightWorld, hasMoonpearl, canBomb, canKill)), + 'mini-moldorm-npc': fromBool(and(southLightWorld, hasMoonpearl, canBomb, canKill)), + 'mire-shed-left': fromBool(mireArea), + 'mire-shed-right': fromBool(mireArea), + 'mushroom-spot': fromBool(and(westLightWorld, hasMoonpearl)), + 'old-man': fromBool(and(westDeathMountain, canDarkRoom)), + 'paradox-lower-far-left': fromBool(and(hasMoonpearl, paradoxLower)), + 'paradox-lower-left': fromBool(and(hasMoonpearl, paradoxLower)), + 'paradox-lower-mid': fromBool(and(hasMoonpearl, paradoxLower)), + 'paradox-lower-right': fromBool(and(hasMoonpearl, paradoxLower)), + 'paradox-lower-far-right': fromBool(and(hasMoonpearl, paradoxLower)), + 'paradox-upper-left': fromBool(and(eastDeathMountain, hasMoonpearl, canBomb)), + 'paradox-upper-right': fromBool(and(eastDeathMountain, hasMoonpearl, canBomb)), + pedestal: fromBool(and(westLightWorld, hasPendants(3))), + 'potion-shop': fromBool(and(eastLightWorld, hasMushroom, hasMoonpearl)), + 'purple-chest': fromBool(and(or(canHeavyLift, hasMirror), westLightWorld, southLightWorld)), + pyramid: fromBool(eastDarkWorld), + 'pyramid-fairy-left': fromBool(and(hasRedCrystals(2), hasMirror)), + 'pyramid-fairy-right': fromBool(and(hasRedCrystals(2), hasMirror)), + 'race-game': fromBool(and(westLightWorld, hasMoonpearl, or(canBomb, canBonk))), + saha: fromBool(and(eastLightWorld, hasGreenPendant)), + 'saha-left': fromBool(and(eastLightWorld, hasMoonpearl, or(canBomb, canBonk))), + 'saha-mid': fromBool(and(eastLightWorld, hasMoonpearl, or(canBomb, canBonk))), + 'saha-right': fromBool(and(eastLightWorld, or(canBomb, canBonk))), + 'secret-passage': fromBool(and(eastLightWorld, hasMoonpearl)), + 'sick-kid': fromBool(and(westLightWorld, hasBottle(1))), + 'spec-rock': fromBool(northDeathMountain), + 'spec-rock-cave': fromBool(westDeathMountain), + 'spike-cave': fromBool(and( + westDarkDeathMountain, + hasHammer, + canLift, + or(hasByrna, and(hasCape, hasMagicBars(2))), + )), + 'spiral-cave': fromBool(and( + eastDeathMountain, + hasMoonpearl, + )), + 'sunken-treasure': fromBool(and(southLightWorld, hasMoonpearl)), + 'super-bunny-top': fromBool(eastDarkDeathMountain), + 'super-bunny-bottom': fromBool(eastDarkDeathMountain), + tavern: fromBool(and(westLightWorld, hasMoonpearl)), + uncle: fromBool(and(eastLightWorld, hasMoonpearl)), + 'waterfall-fairy-left': fromBool(and(eastLightWorld, hasMoonpearl, canSwim)), + 'waterfall-fairy-right': fromBool(and(eastLightWorld, hasMoonpearl, canSwim)), + zora: fromBool(and(eastLightWorld, hasMoonpearl, or(canLift, canSwim))), + 'zora-ledge': fromBool(and(eastLightWorld, hasMoonpearl, canSwim)), + hc: fromBool(canEnterHC), + ct: fromBool(canEnterCT), + gt: fromBool(canEnterGT), + ep: fromBool(canEnterEP), + dp: fromBool(canEnterDPFront), + th: fromBool(canEnterTH), + pd: fromBool(canEnterPD), + sp: fromBool(canEnterSP), + sw: fromBool(or(canEnterSWFront, canEnterSWMid, canEnterSWBack)), + tt: fromBool(canEnterTT), + ip: fromBool(canEnterIP), + mm: fromBool(canEnterMM), + tr: fromBool(or(canEnterTRFront, canEnterTRWest, canEnterTREast, canEnterTRBack)), + ...Logic.dungeonInterior, +}; + export default Logic; diff --git a/resources/js/helpers/tracker.js b/resources/js/helpers/tracker.js index 8b210d2..2089433 100644 --- a/resources/js/helpers/tracker.js +++ b/resources/js/helpers/tracker.js @@ -1573,11 +1573,18 @@ export const UNDERWORLD_LOCATIONS = [ }, ]; +export const getConfigValue = (config, name, fallback) => + Object.prototype.hasOwnProperty.call(config, name) ? config[name] : fallback; + export const applyLogic = (config, dungeons, state) => { const logic = Logic[config.worldState]; const map = {}; for (const name in logic) { - map[name] = logic[name](config, dungeons, state); + try { + map[name] = logic[name](config, dungeons, state); + } catch (e) { + console.error('error evaluating', name, e); + } } return map; }; @@ -1675,9 +1682,9 @@ export const aggregateLocationStatus = (names, logic, state) => { export const countRemainingLocations = (state, locations) => locations.reduce((acc, cur) => state[cur] ? acc : acc + 1, 0); -export const getGanonCrystals = (state) => state['ganon-crystals']; +export const getGanonCrystals = (config) => getConfigValue(config, 'ganon-crystals', 7); -export const getGTCrystals = (state) => state['gt-crystals']; +export const getGTCrystals = (config) => getConfigValue(config, 'gt-crystals', 7); export const getGTBoss = (state, which) => state[`gt-${which}-boss`]; @@ -1685,7 +1692,9 @@ export const hasDungeonBoss = (state, dungeon) => !dungeon.boss || !!state[`${dungeon.id}-boss-defeated`]; export const getDungeonBoss = (state, dungeon) => - state[`${dungeon.id}-boss`] || dungeon.boss || null; + dungeon.bosses.length > 1 + ? state[`${dungeon.id}-boss`] || dungeon.boss || null + : dungeon.bosses[0]; export const hasDungeonPrize = (state, dungeon) => !dungeon.prize || !!state[`${dungeon.id}-prize-acquired`]; @@ -1776,8 +1785,6 @@ export const makeEmptyState = () => { }); state['mm-medallion'] = null; state['tr-medallion'] = null; - state['gt-crystals'] = 7; - state['ganon-crystals'] = 7; return state; }; @@ -1917,6 +1924,9 @@ export const mergeStates = (autoState, manualState) => { if (manualState[`${dungeon.id}-map`]) { next[`${dungeon.id}-map`] = true; } + if (manualState[`${dungeon.id}-boss`]) { + next[`${dungeon.id}-boss`] = manualState[`${dungeon.id}-boss`]; + } if (manualState[`${dungeon.id}-boss-defeated`]) { next[`${dungeon.id}-boss-defeated`] = true; } diff --git a/resources/js/hooks/tracker.js b/resources/js/hooks/tracker.js index 4004152..ec1e8ce 100644 --- a/resources/js/hooks/tracker.js +++ b/resources/js/hooks/tracker.js @@ -2,6 +2,7 @@ import PropTypes from 'prop-types'; import React from 'react'; import { + BOSSES, CONFIG, DUNGEONS, applyLogic, @@ -51,8 +52,8 @@ export const TrackerProvider = ({ children }) => { if (config.wildBig && dungeon.bk && !dungeon.dropBk) { ++newDungeon.items; } - if (!config.bossShuffle && dungeon.boss) { - newDungeon.bosses = [dungeon.boss]; + if (dungeon.boss) { + newDungeon.bosses = config.bossShuffle ? BOSSES : [dungeon.boss]; } return newDungeon; }); diff --git a/resources/js/i18n/de.js b/resources/js/i18n/de.js index 87b6198..9647da5 100644 --- a/resources/js/i18n/de.js +++ b/resources/js/i18n/de.js @@ -502,6 +502,28 @@ export default { }, tracker: { config: { + bossShuffle: 'Boss Shuffle', + ganonCrystals: 'Ganon Crystals', + glitches: 'Glitches', + glitchRules: { + hmg: 'HMG', + mg: 'Major', + nl: 'No Logic', + none: 'Keine', + owg: 'OWG', + }, + goal: 'Ziel', + goals: { + ad: 'All Dungeons', + fast: 'Fast Ganon', + ganon: 'Ganon', + ghunt: 'Ganon Hunt', + ped: 'Pedestal', + thunt: 'Triforce Hunt', + trinity: 'Trinity', + }, + gtCrystals: 'GT Crystals', + logic: 'Logik', showBig: 'Big Keys', showCompass: 'Kompanden', showItemOptions: { @@ -518,6 +540,11 @@ export default { wildItems: 'Wild Dungeon Items', wildMap: 'Maps', wildSmall: 'Small Keys', + worldState: 'World State', + worldStates: { + inverted: 'Inverted', + open: 'Open', + }, }, location: { aginah: 'Aginah', diff --git a/resources/js/i18n/en.js b/resources/js/i18n/en.js index 9ca7a6b..7554f6e 100644 --- a/resources/js/i18n/en.js +++ b/resources/js/i18n/en.js @@ -502,6 +502,28 @@ export default { }, tracker: { config: { + bossShuffle: 'Boss Shuffle', + ganonCrystals: 'Ganon Crystals', + glitches: 'Glitches', + glitchRules: { + hmg: 'HMG', + mg: 'Major', + nl: 'No Logic', + none: 'None', + owg: 'OWG', + }, + goal: 'Goal', + goals: { + ad: 'All Dungeons', + fast: 'Fast Ganon', + ganon: 'Ganon', + ghunt: 'Ganon Hunt', + ped: 'Pedestal', + thunt: 'Triforce Hunt', + trinity: 'Trinity', + }, + gtCrystals: 'GT Crystals', + logic: 'Logic', showBig: 'Big Keys', showCompass: 'Compasses', showItemOptions: { @@ -518,6 +540,11 @@ export default { wildItems: 'Wild Dungeon Items', wildMap: 'Maps', wildSmall: 'Small Keys', + worldState: 'World State', + worldStates: { + inverted: 'Inverted', + open: 'Open', + }, }, location: { aginah: 'Aginah', diff --git a/resources/sass/common.scss b/resources/sass/common.scss index 8fe76bb..0d61af3 100644 --- a/resources/sass/common.scss +++ b/resources/sass/common.scss @@ -271,8 +271,6 @@ h1 { display: inline-block; width: 100%; height: 100%; - background: url(/items-v1.png); - background-size: 800% 1100%; } .strike { position: absolute; diff --git a/resources/sass/tracker.scss b/resources/sass/tracker.scss index c4541e2..27bd55e 100644 --- a/resources/sass/tracker.scss +++ b/resources/sass/tracker.scss @@ -195,11 +195,17 @@ } } .tracker-toolbar { + label .zelda-icon, .toggle-icon { display: inline-block; width: 2em; height: 2em; } + .form-select { + background-image: none; + padding-right: 0.75rem; + border: none; + } } .zelda-icon { width: 100%; -- 2.39.2