]> git.localhorst.tv Git - alttp.git/blobdiff - resources/js/hooks/tracker.js
base logic test cases
[alttp.git] / resources / js / hooks / tracker.js
index b77ee58dbf48233524feee501facad34a7242ab9..ce01c4b94079dd646e17f9263882a85544bc3153 100644 (file)
@@ -1,7 +1,14 @@
 import PropTypes from 'prop-types';
 import React from 'react';
 
-import { CONFIG, DUNGEONS, makeEmptyState, mergeStates } from '../helpers/tracker';
+import {
+       CONFIG,
+       DUNGEONS,
+       applyLogic,
+       configureDungeons,
+       makeEmptyState,
+       mergeStates,
+} from '../helpers/tracker';
 
 const context = React.createContext({});
 
@@ -13,6 +20,7 @@ export const TrackerProvider = ({ children }) => {
        const [autoState, setAutoState] = React.useState(makeEmptyState());
        const [manualState, setManualState] = React.useState(makeEmptyState());
        const [dungeons, setDungeons] = React.useState(DUNGEONS);
+       const [logic, setLogic] = React.useState({});
 
        const saveConfig = React.useCallback((values) => {
                setConfig(s => {
@@ -25,30 +33,12 @@ export const TrackerProvider = ({ children }) => {
        React.useEffect(() => {
                const savedConfig = localStorage.getItem('tracker.config');
                if (savedConfig) {
-                       setConfig(JSON.parse(savedConfig));
+                       setConfig(c => ({ ...c, ...JSON.parse(savedConfig) }));
                }
        }, []);
 
        React.useEffect(() => {
-               const newDungeons = DUNGEONS.map(dungeon => {
-                       const newDungeon = JSON.parse(JSON.stringify(dungeon));
-                       if (config.wildMap && dungeon.map) {
-                               ++newDungeon.items;
-                       }
-                       if (config.wildCompass && dungeon.compass) {
-                               ++newDungeon.items;
-                       }
-                       if (config.wildSmall) {
-                               newDungeon.items += dungeon.sk;
-                       }
-                       if (config.wildBig && dungeon.bk && !dungeon.dropBk) {
-                               ++newDungeon.items;
-                       }
-                       if (!config.bossShuffle && dungeon.boss) {
-                               newDungeon.bosses = [dungeon.boss];
-                       }
-                       return newDungeon;
-               });
+               const newDungeons = configureDungeons(config);
                setDungeons(newDungeons);
        }, [config]);
 
@@ -56,10 +46,14 @@ export const TrackerProvider = ({ children }) => {
                setState(mergeStates(autoState, manualState));
        }, [autoState, manualState]);
 
-       const value = React.useMemo(() => {
-               return { config, saveConfig, dungeons, setAutoState, setManualState, state };
+       React.useEffect(() => {
+               setLogic(applyLogic(config, dungeons, state));
        }, [config, dungeons, state]);
 
+       const value = React.useMemo(() => {
+               return { config, dungeons, logic, saveConfig, setAutoState, setManualState, state };
+       }, [config, dungeons, logic, state]);
+
        return <context.Provider value={value}>
                {children}
        </context.Provider>;