X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;ds=inline;f=resources%2Fjs%2Fpages%2FDoorsTracker.js;fp=resources%2Fjs%2Fpages%2FDoorsTracker.js;h=be98f82778a9221406ccfc3975eaf2d8312ddea3;hb=16662be0b3432d67307ae8c2bb798362d77bab99;hp=0000000000000000000000000000000000000000;hpb=d8ca13d8ccb5efe181198d0e5243a26c9f807aa1;p=alttp.git
diff --git a/resources/js/pages/DoorsTracker.js b/resources/js/pages/DoorsTracker.js
new file mode 100644
index 0000000..be98f82
--- /dev/null
+++ b/resources/js/pages/DoorsTracker.js
@@ -0,0 +1,188 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+
+import ZeldaIcon from '../components/common/ZeldaIcon';
+
+const DUNGEONS = [
+ 'hc',
+ 'ct',
+ 'ep',
+ 'dp',
+ 'th',
+ 'pd',
+ 'sp',
+ 'sw',
+ 'tt',
+ 'ip',
+ 'mm',
+ 'tr',
+ 'gt',
+];
+
+const ITEMS = [
+ 'compass',
+ 'map',
+ 'big-key',
+ 'bow',
+ 'hookshot',
+ 'fire-rod',
+ 'lamp',
+ 'hammer',
+ 'somaria',
+ 'fighter-sword',
+ 'boots',
+ 'glove',
+ 'flippers',
+];
+
+const ITEM_CLASSES = {
+ 'compass': 'dungeon-item',
+ 'map': 'dungeon-item',
+ 'big-key': 'dungeon-item',
+ 'bow': 'item',
+ 'hookshot': 'item',
+ 'fire-rod': 'item',
+ 'lamp': 'item',
+ 'hammer': 'item',
+ 'somaria': 'item',
+ 'fighter-sword': 'item',
+ 'boots': 'item',
+ 'glove': 'item',
+ 'flippers': 'item',
+};
+
+const nextCSwitch = cur => {
+ switch (cur) {
+ case 'blue':
+ return 'red';
+ case 'red':
+ return '';
+ default:
+ return 'blue';
+ }
+};
+
+const prevCSwitch = cur => nextCSwitch(nextCSwitch(cur));
+
+const DoorsTracker = () => {
+ const [state, setState] = React.useState(DUNGEONS.reduce((state, dungeon) => ({
+ ...state,
+ [dungeon]: ITEMS.reduce((items, item) => ({
+ ...items,
+ [item]: false,
+ }), {
+ boss: true,
+ cswitch: '',
+ keys: 1,
+ }),
+ }), {}));
+
+ const handleItemClick = React.useCallback((dungeon, item) => e => {
+ setState(state => ({
+ ...state,
+ [dungeon]: {
+ ...state[dungeon],
+ [item]: !state[dungeon][item],
+ },
+ }));
+ e.preventDefault();
+ e.stopPropagation();
+ });
+
+ const handleCSwitchClick = React.useCallback(dungeon => e => {
+ setState(state => ({
+ ...state,
+ [dungeon]: {
+ ...state[dungeon],
+ cswitch: nextCSwitch(state[dungeon].cswitch),
+ },
+ }));
+ e.preventDefault();
+ e.stopPropagation();
+ });
+
+ const handleCSwitchRightClick = React.useCallback(dungeon => e => {
+ setState(state => ({
+ ...state,
+ [dungeon]: {
+ ...state[dungeon],
+ cswitch: prevCSwitch(state[dungeon].cswitch),
+ },
+ }));
+ e.preventDefault();
+ e.stopPropagation();
+ });
+
+ const handleKeysClick = React.useCallback(dungeon => e => {
+ setState(state => ({
+ ...state,
+ [dungeon]: {
+ ...state[dungeon],
+ keys: state[dungeon].keys + 1,
+ },
+ }));
+ e.preventDefault();
+ e.stopPropagation();
+ });
+
+ const handleKeysRightClick = React.useCallback(dungeon => e => {
+ setState(state => ({
+ ...state,
+ [dungeon]: {
+ ...state[dungeon],
+ keys: Math.max(state[dungeon].keys - 1, 0),
+ },
+ }));
+ e.preventDefault();
+ e.stopPropagation();
+ });
+
+ return <>
+