X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=resources%2Fjs%2Fcomponents%2Ftracker%2FToggleIcon.js;h=6de9f63632652dea775d0eca42259e5f15d0425d;hb=1a3d040147c19d24b8d02ec8e594eb06b8efc1ff;hp=49375ef97695b09f00b9998f484e5962ad21d11d;hpb=b5a50d74cf042fa7fc874d8184dc37ae20bb74dd;p=alttp.git diff --git a/resources/js/components/tracker/ToggleIcon.js b/resources/js/components/tracker/ToggleIcon.js index 49375ef..6de9f63 100644 --- a/resources/js/components/tracker/ToggleIcon.js +++ b/resources/js/components/tracker/ToggleIcon.js @@ -3,19 +3,23 @@ import React from 'react'; import ZeldaIcon from '../common/ZeldaIcon'; import { + addDungeonCheck, decrement, getDungeonBoss, + getDungeonRemainingItems, getDungeonPrize, hasDungeonBoss, hasDungeonPrize, highestActive, increment, + removeDungeonCheck, toggleBoolean, + toggleBossDefeated, } from '../../helpers/tracker'; import { useTracker } from '../../hooks/tracker'; -const ToggleIcon = ({ controller, className, icons }) => { - const { state, setState } = useTracker(); +const ToggleIcon = ({ controller, className, icons, svg }) => { + const { setManualState, state } = useTracker(); const activeController = controller || ToggleIcon.nullController; const active = activeController.getActive(state, icons); const defaultIcon = activeController.getDefault(state, icons); @@ -28,15 +32,32 @@ const ToggleIcon = ({ controller, className, icons }) => { if (className) { classNames.push(className); } + if (svg) { + return { + activeController.handlePrimary(state, setManualState, icons); + e.preventDefault(); + e.stopPropagation(); + }} + onContextMenu={(e) => { + activeController.handleSecondary(state, setManualState, icons); + e.preventDefault(); + e.stopPropagation(); + }} + > + + ; + } return { - activeController.handlePrimary(state, setState, icons); + activeController.handlePrimary(state, setManualState, icons); e.preventDefault(); e.stopPropagation(); }} onContextMenu={(e) => { - activeController.handleSecondary(state, setState, icons); + activeController.handleSecondary(state, setManualState, icons); e.preventDefault(); e.stopPropagation(); }} @@ -93,6 +114,27 @@ const previousString = property => (state, setState, icons) => { setState(s => ({ ...s, [property]: previous })); }; +ToggleIcon.bottleController = ctrl => ({ + getActive: (state, icons) => state[ctrl] ? icons[state[ctrl] - 1] : null, + getDefault: () => 'bottle', + handlePrimary: (state, setState, icons) => { + if (state[ctrl] === 0) { + // skip over mushroom + setState(s => ({ ...s, [ctrl]: 2 })); + } else { + setState(increment(ctrl, icons.length)); + } + }, + handleSecondary: (state, setState, icons) => { + if (state[ctrl] === 2) { + // skip over mushroom + setState(s => ({ ...s, [ctrl]: 0 })); + } else { + setState(decrement(ctrl, icons.length)); + } + }, +}); + ToggleIcon.countController = max => ({ getActive: highestActive, getDefault: firstIcon, @@ -110,23 +152,23 @@ ToggleIcon.dungeonBossController = (dungeon) => ({ handlePrimary: dungeon.bosses.length > 1 ? nextString(`${dungeon.id}-boss`) : (state, setState) => { - setState(toggleBoolean(`${dungeon.id}-boss-defeated`)); + setState(toggleBossDefeated(dungeon)); }, handleSecondary: dungeon.bosses.length > 1 ? previousString(`${dungeon.id}-boss`) : (state, setState) => { - setState(toggleBoolean(`${dungeon.id}-boss-defeated`)); + setState(toggleBossDefeated(dungeon)); }, }); -ToggleIcon.dungeonCheckController = (dungeon, max) => ({ - getActive: (state, icons) => state[`${dungeon.id}-checks`] < max ? icons[1] : null, +ToggleIcon.dungeonCheckController = (dungeon) => ({ + getActive: (state, icons) => getDungeonRemainingItems(state, dungeon) ? icons[1] : null, getDefault: firstIcon, handlePrimary: (state, setState) => { - setState(increment(`${dungeon.id}-checks`, max)); + setState(addDungeonCheck(dungeon)); }, handleSecondary: (state, setState) => { - setState(decrement(`${dungeon.id}-checks`, max)); + setState(removeDungeonCheck(dungeon)); }, }); @@ -163,17 +205,48 @@ ToggleIcon.medallionController = { getActive: highestActive, getDefault: firstIcon, handlePrimary: nextIcon, - handleSecondary: doNothing, + handleSecondary: (state, setState, icons) => { + const mm = state['mm-medallion']; + const tr = state['tr-medallion']; + const isMM = mm === icons[0]; + const isTR = tr === icons[0]; + console.log({ mm, isMM, tr, isTR }); + if (!isMM && !isTR) { + // empty: set as MM if mire is unset, else set as TR if TR is unset + if (!mm) { + setState(s => ({ ...s, 'mm-medallion': icons[0] })); + } else if (!tr) { + setState(s => ({ ...s, 'tr-medallion': icons[0] })); + } + } else if (isMM && !isTR) { + // MM: if TR is free, switch to TR, otherwise remove MM + if (!tr) { + setState(s => ({ ...s, 'mm-medallion': null, 'tr-medallion': icons[0] })); + } else { + setState(s => ({ ...s, 'mm-medallion': null })); + } + } else if (!isMM && isTR) { + // TR: if MM is free, switch to both, otherwise remove TR + if (!mm) { + setState(s => ({ ...s, 'mm-medallion': icons[0] })); + } else { + setState(s => ({ ...s, 'tr-medallion': null })); + } + } else { + // both: remove both + setState(s => ({ ...s, 'mm-medallion': null, 'tr-medallion': null })); + } + }, }; ToggleIcon.modulusController = ctrl => ({ getActive: (state, icons) => icons[(state[ctrl] || 0) % icons.length], getDefault: firstIcon, handlePrimary: (state, setState, icons) => { - setState(increment(icons[0], icons.length)); + setState(increment(ctrl, icons.length)); }, handleSecondary: (state, setState, icons) => { - setState(decrement(icons[0], icons.length)); + setState(decrement(ctrl, icons.length)); }, }); @@ -213,6 +286,7 @@ ToggleIcon.propTypes = { handleSecondary: PropTypes.func, }), icons: PropTypes.arrayOf(PropTypes.string), + svg: PropTypes.bool, }; export default ToggleIcon;