X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=resources%2Fjs%2Fhelpers%2Ftracker.js;fp=resources%2Fjs%2Fhelpers%2Ftracker.js;h=bc18847fcc10e47ad7f0a8c8405b64ce0323a37b;hb=24489254a5d05efd6fe7dceb2cffe5fdb49ab7b7;hp=92508d46f1bc9434b97e641c8132a4fd94f0a095;hpb=4e24f36eb5d6907697c106ca15c2c405728d78a8;p=alttp.git diff --git a/resources/js/helpers/tracker.js b/resources/js/helpers/tracker.js index 92508d4..bc18847 100644 --- a/resources/js/helpers/tracker.js +++ b/resources/js/helpers/tracker.js @@ -1598,24 +1598,59 @@ export const unclearAll = names => state => { return { ...state, ...changes }; }; -export const hasDungeonBoss = (state, dungeon) => !!state[`${dungeon.id}-boss-defeated`]; +export const countClearedLocations = (state, locations) => + locations.reduce((acc, cur) => state[cur] ? acc + 1 : acc, 0); + +export const hasClearedLocations = (state, locations) => + countClearedLocations(state, locations) === locations.length; + +export const countRemainingLocations = (state, locations) => + locations.reduce((acc, cur) => state[cur] ? acc : acc + 1, 0); + +export const hasDungeonBoss = (state, dungeon) => + !dungeon.boss || !!state[`${dungeon.id}-boss-defeated`]; export const getDungeonBoss = (state, dungeon) => state[`${dungeon.id}-boss`] || dungeon.boss || null; -export const hasDungeonPrize = (state, dungeon) => !!state[`${dungeon.id}-prize-acquired`]; +export const hasDungeonPrize = (state, dungeon) => + !dungeon.prize || !!state[`${dungeon.id}-prize-acquired`]; export const getDungeonPrize = (state, dungeon) => state[`${dungeon.id}-prize`] || null; +export const getDungeonClearedItems = (state, dungeon) => state[`${dungeon.id}-checks`] || 0; + +export const getDungeonRemainingItems = (state, dungeon) => + Math.max(0, dungeon.items - getDungeonClearedItems(state, dungeon)); + +export const getDungeonAcquiredSKs = (state, dungeon) => state[`${dungeon.id}-small-key`] || 0; + export const isDungeonCleared = (state, dungeon) => { - const cleared = state[`${dungeon.id}-checks`] || 0; - const total = dungeon.items; - const hasItems = cleared >= total; - const hasBoss = !dungeon.boss || hasDungeonBoss(state, dungeon); - const hasPrize = !dungeon.porize || hasDungeonPrize(state, dungeon); + const hasItems = !getDungeonRemainingItems(state, dungeon); + const hasBoss = hasDungeonBoss(state, dungeon); + const hasPrize = hasDungeonPrize(state, dungeon); return hasItems && hasBoss && hasPrize; }; +export const toggleBossDefeated = dungeon => toggleBoolean(`${dungeon.id}-boss-defeated`); + +export const setBossDefeated = (dungeon, defeated) => + state => ({ ...state, [`${dungeon.id}-boss-defeated`]: !!defeated }); + +export const togglePrizeAcquired = dungeon => toggleBoolean(`${dungeon.id}-prize-acquired`); + +export const setPrizeAcquired = (dungeon, acquired) => + state => ({ ...state, [`${dungeon.id}-prize-acquired`]: !!acquired }); + +export const addDungeonCheck = dungeon => increment(`${dungeon.id}-checks`, dungeon.items); + +export const removeDungeonCheck = dungeon => decrement(`${dungeon.id}-checks`, dungeon.items); + +export const resetDungeonChecks = dungeon => state => ({ ...state, [`${dungeon.id}-checks`]: 0 }); + +export const completeDungeonChecks = dungeon => + state => ({ ...state, [`${dungeon.id}-checks`]: dungeon.items }); + export const makeEmptyState = () => { const state = {}; BOOLEAN_STATES.forEach(p => {