diff --git a/src/components/TextRenderer/YellowTextRenderer.tsx b/src/components/TextRenderer/YellowTextRenderer.tsx index e5a18ea..2baf596 100644 --- a/src/components/TextRenderer/YellowTextRenderer.tsx +++ b/src/components/TextRenderer/YellowTextRenderer.tsx @@ -7,6 +7,7 @@ const YellowTextRenderer = (props: { visible?: boolean }) => { const disableTrail = useBigTextStore((state) => state.disableTrail); const transformState = useBigTextStore((state) => state.transformState); + const visible = useBigTextStore((state) => state.visible); const color = useBigTextStore((state) => state.color); const textArrRef = useRef(useBigTextStore.getState().text.split("")); @@ -40,7 +41,7 @@ const YellowTextRenderer = (props: { visible?: boolean }) => { ); return ( - + {disableTrail ? textArrRef.current.map((letter, idx) => ( { newActiveNodeId: string, newActiveHudId: string, newLevel: string, - delay: number + delay: number, + shouldToggleAtStart: boolean ) => { const targetGreenText = (site_a as SiteType)[newLevel][newActiveNodeId] .title; @@ -25,7 +26,7 @@ const GreenTextManager = (props: StateManagerProps) => { const targetGreenTextPosData = node_huds[newActiveHudId as keyof typeof node_huds].medium_text; - toggleActive(); + if (shouldToggleAtStart) toggleActive(); setTimeout(() => { setTransformState( @@ -74,12 +75,12 @@ const GreenTextManager = (props: StateManagerProps) => { case "site_right": return { action: toggleAndSetGreenText, - value: [newActiveNodeId, newActiveHudId, newLevel, 3903.704], + value: [newActiveNodeId, newActiveHudId, newLevel, 3900, true], }; case "change_node": return { action: toggleAndSetGreenText, - value: [newActiveNodeId, newActiveHudId, newLevel, 500], + value: [newActiveNodeId, newActiveHudId, newLevel, 500, true], }; case "throw_node_media": return { @@ -90,6 +91,12 @@ const GreenTextManager = (props: StateManagerProps) => { return { action: toggleActive, }; + case "select_level_up": + case "select_level_down": + return { + action: toggleAndSetGreenText, + value: [newActiveNodeId, newActiveHudId, newLevel, 3900, false], + }; } }, [initializeGreenTextForMediaScene, toggleActive, toggleAndSetGreenText] diff --git a/src/core/StateManagers/NodeManager.tsx b/src/core/StateManagers/NodeManager.tsx index 716decb..aeeda6e 100644 --- a/src/core/StateManagers/NodeManager.tsx +++ b/src/core/StateManagers/NodeManager.tsx @@ -39,17 +39,15 @@ const NodeManager = (props: StateManagerProps) => { delay: number, isMoving: boolean, newActiveNodeId: string, - newNodeColIdx: number, - newNodeRowIdx: number, - newNodeMatIdx: number + newNodeMatrixIndices: { + matrixIdx: number; + rowIdx: number; + colIdx: number; + } ) => { setTimeout(() => { setActiveNodeState(newActiveNodeId, "id"); - setNodeMatrixIndices({ - matrixIdx: newNodeMatIdx, - rowIdx: newNodeRowIdx, - colIdx: newNodeColIdx, - }); + setNodeMatrixIndices(newNodeMatrixIndices); }, delay); }, [setActiveNodeState, setNodeMatrixIndices] @@ -59,9 +57,11 @@ const NodeManager = (props: StateManagerProps) => { ( event: string, newActiveNodeId: string, - newNodeColIdx: number, - newNodeRowIdx: number, - newNodeMatIdx: number + newNodeMatrixIndices: { + matrixIdx: number; + rowIdx: number; + colIdx: number; + } ) => { switch (event) { case "site_up": @@ -72,26 +72,12 @@ const NodeManager = (props: StateManagerProps) => { case "select_level_down": return { action: updateActiveNode, - value: [ - 3900, - true, - newActiveNodeId, - newNodeColIdx, - newNodeRowIdx, - newNodeMatIdx, - ], + value: [3900, true, newActiveNodeId, newNodeMatrixIndices], }; case "change_node": return { action: updateActiveNode, - value: [ - 0, - false, - newActiveNodeId, - newNodeColIdx, - newNodeRowIdx, - newNodeMatIdx, - ], + value: [0, false, newActiveNodeId, newNodeMatrixIndices], }; case "throw_node_media": case "throw_node_gate": @@ -109,17 +95,12 @@ const NodeManager = (props: StateManagerProps) => { if (props.eventState) { const eventAction = props.eventState.event; const newActiveNodeId = props.eventState.newActiveNodeId; - console.log(newActiveNodeId) - const newNodeRowIdx = props.eventState.newNodeRowIdx; - const newNodeColIdx = props.eventState.newNodeColIdx; - const newNodeMatIdx = props.eventState.newNodeMatIdx; + const newNodeMatrixIndices = props.eventState.newNodeMatrixIndices; const dispatchedObject = dispatchObject( eventAction, newActiveNodeId, - newNodeColIdx, - newNodeRowIdx, - newNodeMatIdx + newNodeMatrixIndices ); if (dispatchedObject) { diff --git a/src/core/StateManagers/YellowTextManager.tsx b/src/core/StateManagers/YellowTextManager.tsx index 75fc30a..1cf4b47 100644 --- a/src/core/StateManagers/YellowTextManager.tsx +++ b/src/core/StateManagers/YellowTextManager.tsx @@ -16,6 +16,8 @@ const YellowTextManager = (props: StateManagerProps) => { const setColor = useBigTextStore((state) => state.setColor); + const setVisible = useBigTextStore((state) => state.setVisible); + const animateYellowTextWithMove = useCallback( ( posXOffset: number, @@ -185,6 +187,30 @@ const YellowTextManager = (props: StateManagerProps) => { [setColor, setText, setTransformState] ); + const toggleVisibleAfterLevelSelect = useCallback( + (activeNodeId: string, activeHudId: string, level: string) => { + setVisible(false); + + setTimeout(() => { + setTransformState( + node_huds[activeHudId as keyof typeof node_huds].big_text[0], + "posX" + ); + setTransformState( + node_huds[activeHudId as keyof typeof node_huds].big_text[1], + "posY" + ); + setColor("yellow"); + setText((site_a as SiteType)[level][activeNodeId].node_name); + }, 400); + + setTimeout(() => { + setVisible(true); + }, 3900); + }, + [setColor, setText, setTransformState, setVisible] + ); + const dispatchObject = useCallback( ( event: string, @@ -252,8 +278,6 @@ const YellowTextManager = (props: StateManagerProps) => { value: [newActiveNodeId, newActiveHudId, newLevel], }; case "level_selection_back": - case "select_level_up": - case "select_level_down": return { action: levelSelectionBack, value: [newActiveNodeId, newActiveHudId, newLevel], @@ -262,6 +286,12 @@ const YellowTextManager = (props: StateManagerProps) => { return { action: initializeLevelSelection, }; + case "select_level_up": + case "select_level_down": + return { + action: toggleVisibleAfterLevelSelect, + value: [newActiveNodeId, newActiveHudId, newLevel], + }; } }, [ @@ -272,6 +302,7 @@ const YellowTextManager = (props: StateManagerProps) => { initializeYellowTextForMainScene, initializeYellowTextForMediaScene, levelSelectionBack, + toggleVisibleAfterLevelSelect, ] ); diff --git a/src/core/mainSceneEventHandler.ts b/src/core/mainSceneEventHandler.ts index 45243e7..eb6caef 100644 --- a/src/core/mainSceneEventHandler.ts +++ b/src/core/mainSceneEventHandler.ts @@ -1,21 +1,6 @@ import node_matrices from "../resources/node_matrices.json"; import site_a from "../resources/site_a.json"; -import nodeSelector from "./nodeSelector"; - -const hudAssocs = { - "00": "fg_hud_1", - "10": "fg_hud_2", - "20": "fg_hud_3", - "01": "bg_hud_1", - "11": "bg_hud_2", - "21": "bg_hud_3", - "02": "bg_hud_4", - "12": "bg_hud_5", - "22": "bg_hud_6", - "03": "fg_hud_4", - "13": "fg_hud_5", - "23": "fg_hud_6", -}; +import nodeSelector, { getNodeHudId, getNodeId } from "./nodeSelector"; const handleMainSceneEvent = (gameContext: any) => { let event; @@ -27,17 +12,14 @@ const handleMainSceneEvent = (gameContext: any) => { const activePauseComponent = gameContext.activePauseComponent; const unlockedNodes = gameContext.unlockedNodes; - const nodeColIdx = gameContext.nodeMatrixIndices.colIdx; - const nodeRowIdx = gameContext.nodeMatrixIndices.rowIdx; - const nodeMatIdx = gameContext.nodeMatrixIndices.matrixIdx; + let nodeMatrixIndices = gameContext.nodeMatrixIndices; + const level = parseInt(gameContext.activeLevel); const siteRotY = gameContext.siteTransformState.rotY; const sitePosY = gameContext.siteTransformState.posY; let newActiveNodeId; - let newNodeMatIdx = gameContext.nodeMatrixIndices.matrixIdx; - let newNodeColIdx = gameContext.nodeMatrixIndices.colIdx; - let newNodeRowIdx = gameContext.nodeMatrixIndices.rowIdx; + let newActiveHudId; let newLevel = parseInt(gameContext.activeLevel); let newSiteRotY = gameContext.siteTransformState.rotY; let newSitePosY = gameContext.siteTransformState.posY; @@ -52,9 +34,7 @@ const handleMainSceneEvent = (gameContext: any) => { case "UP": selectedNodeData = nodeSelector({ action: `site_${keyPress.toLowerCase()}`, - nodeMatIdx: nodeMatIdx, - nodeColIdx: nodeColIdx, - nodeRowIdx: nodeRowIdx, + nodeMatrixIndices: nodeMatrixIndices, level: level, siteRotY: siteRotY, sitePosY: sitePosY, @@ -64,12 +44,11 @@ const handleMainSceneEvent = (gameContext: any) => { if (selectedNodeData) { event = selectedNodeData.event; newActiveNodeId = selectedNodeData.newActiveNodeId; - newNodeMatIdx = selectedNodeData.newNodeMatIdx; - newNodeColIdx = selectedNodeData.newNodeColIdx; - newNodeRowIdx = selectedNodeData.newNodeRowIdx; + nodeMatrixIndices = selectedNodeData.newNodeMatrixIndices; newSiteRotY = selectedNodeData.newSiteRotY; newSitePosY = selectedNodeData.newSitePosY; newLevel = selectedNodeData.newLevel; + newActiveHudId = selectedNodeData.newActiveHudId; } break; @@ -77,11 +56,7 @@ const handleMainSceneEvent = (gameContext: any) => { // in this case we have to check the type of the blue orb // and dispatch an action depending on that, so we have to precalculate the // new active blue orb here. - newActiveNodeId = - gameContext.activeLevel + - node_matrices[newNodeMatIdx.toString() as keyof typeof node_matrices][ - newNodeRowIdx as number - ][newNodeColIdx as number]; + newActiveNodeId = getNodeId(gameContext.activeLevel, nodeMatrixIndices); const nodeType = (site_a as any)[newLevel][newActiveNodeId].type; @@ -109,14 +84,9 @@ const handleMainSceneEvent = (gameContext: any) => { return { event: "toggle_pause" }; } - const newActiveHudId = - hudAssocs[`${newNodeRowIdx}${newNodeColIdx}` as keyof typeof hudAssocs]; - return { event: event, - newNodeColIdx: newNodeColIdx, - newNodeRowIdx: newNodeRowIdx, - newNodeMatIdx: newNodeMatIdx, + newNodeMatrixIndices: nodeMatrixIndices, newSitePosY: newSitePosY, newSiteRotY: newSiteRotY, newLevel: newLevel.toString().padStart(2, "0"), @@ -143,23 +113,14 @@ const handleMainSceneEvent = (gameContext: any) => { case "X": return { event: "level_selection_back", - newActiveNodeId: - newLevel + - node_matrices[ - newNodeMatIdx.toString() as keyof typeof node_matrices - ][newNodeRowIdx as number][newNodeColIdx as number], - newActiveHudId: - hudAssocs[ - `${newNodeRowIdx}${newNodeColIdx}` as keyof typeof hudAssocs - ], + newActiveNodeId: getNodeId(gameContext.level, nodeMatrixIndices), + newActiveHudId: getNodeHudId(nodeMatrixIndices), newLevel: newLevel, }; case "CIRCLE": const selectedNodeData = nodeSelector({ action: "select_level", - nodeMatIdx: nodeMatIdx, - nodeColIdx: nodeColIdx, - nodeRowIdx: nodeRowIdx, + nodeMatrixIndices: nodeMatrixIndices, level: selectedLevel, siteRotY: siteRotY, sitePosY: sitePosY, @@ -167,55 +128,18 @@ const handleMainSceneEvent = (gameContext: any) => { }); if (level === selectedLevel) break; - else if (selectedLevel < level && selectedNodeData) { + if (selectedNodeData) { + const event = + selectedLevel < level ? "select_level_down" : "select_level_up"; return { - event: "select_level_down", - newLevel: selectedLevel.toString().padStart(0, "2"), - newSitePosY: -selectedNodeData.newSitePosY, + event: event, + newLevel: selectedLevel.toString().padStart(2, "0"), newActiveNodeId: selectedNodeData.newActiveNodeId, - newNodeMatIdx: selectedNodeData.newNodeMatIdx, - newNodeColIdx: selectedNodeData.newNodeColIdx, - newNodeRowIdx: selectedNodeData.newNodeRowIdx, - newActiveHudId: - hudAssocs[ - `${selectedNodeData.newNodeRowIdx}${selectedNodeData.newNodeColIdx}` as keyof typeof hudAssocs - ], - }; - } else if (selectedLevel > level && selectedNodeData) { - return { - event: "select_level_up", - newLevel: selectedLevel.toString().padStart(0, "2"), + newActiveHudId: selectedNodeData.newActiveHudId, + newNodeMatrixIndices: selectedNodeData.newNodeMatrixIndices, newSitePosY: -selectedNodeData.newSitePosY, - newActiveNodeId: selectedNodeData.newActiveNodeId, - newNodeMatIdx: selectedNodeData.newNodeMatIdx, - newNodeColIdx: selectedNodeData.newNodeColIdx, - newNodeRowIdx: selectedNodeData.newNodeRowIdx, - newActiveHudId: - hudAssocs[ - `${selectedNodeData.newNodeRowIdx}${selectedNodeData.newNodeColIdx}` as keyof typeof hudAssocs - ], }; } - - // if (oldLevel === newLevel) break; - // else if (newLevel < oldLevel) { - // return { - // event: "select_level_down", - // newLevel: newLevel, - // newSitePosY: - // level_y_values[newLevel as keyof typeof level_y_values], - // }; - // } else { - // return { - // event: "select_level_up", - // newLevel: newLevel, - // newSitePosY: -level_y_values[ - // newLevel as keyof typeof level_y_values - // ], - // newActiveNodeId: "2022", - // newActiveHudId: "fg_hud_1", - // }; - // } } } else if (subscene === "pause") { switch (keyPress) { diff --git a/src/core/nodeSelector.ts b/src/core/nodeSelector.ts index 27c8780..dc545c9 100644 --- a/src/core/nodeSelector.ts +++ b/src/core/nodeSelector.ts @@ -6,25 +6,52 @@ import level_y_values from "../resources/level_y_values.json"; type NodeSelectorContext = { action: string; - nodeMatIdx: number; - nodeColIdx: number; - nodeRowIdx: number; + nodeMatrixIndices: { matrixIdx: number; rowIdx: number; colIdx: number }; level: number; siteRotY: number; sitePosY: number; unlockedNodes: typeof unlocked_nodes; }; -const getNodeId = ( +const hudAssocs = { + "00": "fg_hud_1", + "10": "fg_hud_2", + "20": "fg_hud_3", + "01": "bg_hud_1", + "11": "bg_hud_2", + "21": "bg_hud_3", + "02": "bg_hud_4", + "12": "bg_hud_5", + "22": "bg_hud_6", + "03": "fg_hud_4", + "13": "fg_hud_5", + "23": "fg_hud_6", +}; + +export const getNodeId = ( level: number, - nodeMatIdx: number, - nodeRowIdx: number, - nodeColIdx: number -) => - level.toString().padStart(2, "0") + - node_matrices[nodeMatIdx.toString() as keyof typeof node_matrices][ - nodeRowIdx - ][nodeColIdx]; + nodeMatrixIndices: { + matrixIdx: number; + rowIdx: number; + colIdx: number; + } +) => { + return ( + level.toString().padStart(2, "0") + + node_matrices[ + nodeMatrixIndices.matrixIdx.toString() as keyof typeof node_matrices + ][nodeMatrixIndices.rowIdx][nodeMatrixIndices.colIdx] + ); +}; + +export const getNodeHudId = (nodeMatrixIndices: { + matrixIdx: number; + rowIdx: number; + colIdx: number; +}) => + hudAssocs[ + `${nodeMatrixIndices.rowIdx}${nodeMatrixIndices.colIdx}` as keyof typeof hudAssocs + ]; const isNodeVisible = ( nodeId: string, @@ -63,51 +90,39 @@ const tryRow = (row: number, triedRows: number[]) => { const findNodeAfterLevelSelection = ( unlockedNodes: typeof unlocked_nodes, targetLevel: number, - nodeMatIdx: number, - nodeRowIdx: number, - nodeColIdx: number + nodeMatrixIndices: { matrixIdx: number; rowIdx: number; colIdx: number } ) => { - let newNodeRowIdx = nodeRowIdx; - let newNodeMatIdx = nodeMatIdx; - let newNodeColIdx = nodeColIdx; + let newMatIndices = nodeMatrixIndices; let triedCols: number[] = []; - let newNodeId = getNodeId( - targetLevel, - newNodeMatIdx, - newNodeRowIdx, - newNodeColIdx - ); + let newNodeId = getNodeId(targetLevel, newMatIndices); while (!isNodeVisible(newNodeId, unlockedNodes)) { if (triedCols.length < 4) { - triedCols.push(newNodeColIdx); - const colToTry = tryCol(newNodeColIdx, triedCols); + triedCols.push(newMatIndices.colIdx); + const colToTry = tryCol(newMatIndices.colIdx, triedCols); if (colToTry !== undefined) { - newNodeColIdx = colToTry; + newMatIndices.colIdx = colToTry; } } else { - newNodeRowIdx++; + newMatIndices.rowIdx++; triedCols = []; - newNodeColIdx = 0; + newMatIndices.colIdx = 0; } - newNodeId = getNodeId( - targetLevel, - newNodeMatIdx, - newNodeRowIdx, - newNodeColIdx - ); + newNodeId = getNodeId(targetLevel, newMatIndices); } + const newNodeHudId = getNodeHudId(newMatIndices); + return { newLevel: targetLevel, newNodeId: newNodeId, - newNodeRowIdx: newNodeRowIdx, - newNodeColIdx: newNodeColIdx, + newNodeHudId: newNodeHudId, + newNodeMatrixIndices: newMatIndices, newSitePosY: level_y_values[ - targetLevel.toString().padStart(0, "2") as keyof typeof level_y_values + targetLevel.toString().padStart(2, "0") as keyof typeof level_y_values ], }; }; @@ -116,104 +131,81 @@ const findNodeVertical = ( direction: string, unlockedNodes: typeof unlocked_nodes, level: number, - nodeMatIdx: number, - nodeRowIdx: number, - nodeColIdx: number + nodeMatrixIndices: { matrixIdx: number; rowIdx: number; colIdx: number } ) => { let newNodeId; let newLevel = level; - let newNodeRowIdx = nodeRowIdx; - let newNodeMatIdx = nodeMatIdx; - let newNodeColIdx = nodeColIdx; + let newMatIndices = nodeMatrixIndices; if (direction === "down") { - newNodeRowIdx++; + newMatIndices.rowIdx++; let triedCols: number[] = []; - if (newNodeRowIdx > 2) { - newNodeRowIdx = 0; + if (newMatIndices.rowIdx > 2) { + newMatIndices.rowIdx = 0; newLevel = level - 1; } - newNodeId = getNodeId( - newLevel, - newNodeMatIdx, - newNodeRowIdx, - newNodeColIdx - ); + newNodeId = getNodeId(newLevel, newMatIndices); while (!isNodeVisible(newNodeId, unlockedNodes)) { if (triedCols.length < 4) { - triedCols.push(newNodeColIdx); - const colToTry = tryCol(newNodeColIdx, triedCols); + triedCols.push(newMatIndices.colIdx); + const colToTry = tryCol(newMatIndices.colIdx, triedCols); if (colToTry !== undefined) { - newNodeColIdx = colToTry; + newMatIndices.colIdx = colToTry; } } else { - if (newNodeRowIdx === 2) { - newNodeRowIdx = 0; + if (newMatIndices.rowIdx === 2) { + newMatIndices.rowIdx = 0; newLevel = level - 1; } else { - newNodeRowIdx++; + newMatIndices.rowIdx++; + newMatIndices.colIdx = 0; triedCols = []; - newNodeColIdx = 0; } } - newNodeId = getNodeId( - newLevel, - newNodeMatIdx, - newNodeRowIdx, - newNodeColIdx - ); + newNodeId = getNodeId(newLevel, newMatIndices); } } else if (direction === "up") { - newNodeRowIdx--; + newMatIndices.rowIdx--; let triedCols: number[] = []; - if (newNodeRowIdx < 0) { - newNodeRowIdx = 2; + if (newMatIndices.rowIdx < 0) { + newMatIndices.rowIdx = 2; newLevel = level + 1; } - newNodeId = getNodeId( - newLevel, - newNodeMatIdx, - newNodeRowIdx, - newNodeColIdx - ); + newNodeId = getNodeId(newLevel, newMatIndices); while (!isNodeVisible(newNodeId, unlockedNodes)) { if (triedCols.length < 4) { - triedCols.push(newNodeColIdx); - const colToTry = tryCol(newNodeColIdx, triedCols); + triedCols.push(newMatIndices.colIdx); + const colToTry = tryCol(newMatIndices.colIdx, triedCols); if (colToTry !== undefined) { - newNodeColIdx = colToTry; + newMatIndices.colIdx = colToTry; } } else { - if (newNodeRowIdx === 0) { - newNodeRowIdx = 2; + if (newMatIndices.rowIdx === 0) { + newMatIndices.rowIdx = 2; newLevel = level + 1; } else { - newNodeRowIdx--; + newMatIndices.rowIdx--; + newMatIndices.colIdx = 0; triedCols = []; - newNodeColIdx = 0; } } - newNodeId = getNodeId( - newLevel, - newNodeMatIdx, - newNodeRowIdx, - newNodeColIdx - ); + newNodeId = getNodeId(newLevel, newMatIndices); } } + return { newNodeId: newNodeId, + newNodeHudId: getNodeHudId(newMatIndices), newLevel: newLevel, - newNodeRowIdx: newNodeRowIdx, - newNodeColIdx: newNodeColIdx, + newNodeMatrixIndices: newMatIndices, }; }; @@ -221,89 +213,92 @@ const findNodeHorizontal = ( direction: string, unlockedNodes: typeof unlocked_nodes, level: number, - nodeMatIdx: number, - nodeRowIdx: number, - nodeColIdx: number + nodeMatrixIndices: { matrixIdx: number; rowIdx: number; colIdx: number } ) => { let newNodeId; - let newNodeRowIdx = nodeRowIdx; - let newNodeMatIdx = nodeMatIdx; - let newNodeColIdx = nodeColIdx; + let newMatIndices = nodeMatrixIndices; + if (direction === "left") { let didMove = false; - newNodeColIdx--; + newMatIndices.colIdx--; let triedRows: number[] = []; - if (newNodeColIdx < 0) { - newNodeColIdx = 0; - newNodeMatIdx = nodeMatIdx + 1 > 8 ? 1 : nodeMatIdx + 1; + if (newMatIndices.colIdx < 0) { + didMove = true; + newMatIndices.colIdx = 0; + newMatIndices.matrixIdx = + newMatIndices.matrixIdx + 1 > 8 ? 1 : newMatIndices.matrixIdx + 1; } - newNodeId = getNodeId(level, newNodeMatIdx, newNodeRowIdx, newNodeColIdx); + newNodeId = getNodeId(level, newMatIndices); while (!isNodeVisible(newNodeId, unlockedNodes)) { if (triedRows.length < 3) { - triedRows.push(newNodeRowIdx); - const rowToTry = tryRow(newNodeRowIdx, triedRows); + triedRows.push(newMatIndices.rowIdx); + const rowToTry = tryRow(newMatIndices.rowIdx, triedRows); if (rowToTry !== undefined) { - newNodeRowIdx = rowToTry; + newMatIndices.rowIdx = rowToTry; } } else { - if (newNodeColIdx < 0) { + if (newMatIndices.colIdx < 0) { didMove = true; - newNodeColIdx = 0; - newNodeMatIdx = nodeMatIdx + 1 > 8 ? 1 : nodeMatIdx + 1; + newMatIndices.colIdx = 0; + newMatIndices.matrixIdx = + newMatIndices.matrixIdx + 1 > 8 ? 1 : newMatIndices.matrixIdx + 1; } else { - didMove ? newNodeColIdx++ : newNodeColIdx--; + didMove ? newMatIndices.colIdx++ : newMatIndices.colIdx--; triedRows = []; - newNodeRowIdx = 0; + newMatIndices.rowIdx = 0; } } - newNodeId = getNodeId(level, newNodeMatIdx, newNodeRowIdx, newNodeColIdx); + newNodeId = getNodeId(level, newMatIndices); } } else if (direction === "right") { let didMove = false; - newNodeColIdx++; + newMatIndices.colIdx++; let triedRows: number[] = []; - if (newNodeColIdx > 3) { - newNodeColIdx = 3; - newNodeMatIdx = nodeMatIdx - 1 < 1 ? 8 : nodeMatIdx - 1; + if (newMatIndices.colIdx > 3) { + newMatIndices.colIdx = 3; + newMatIndices.matrixIdx = + newMatIndices.matrixIdx - 1 < 1 ? 8 : newMatIndices.matrixIdx - 1; } - newNodeId = getNodeId(level, newNodeMatIdx, newNodeRowIdx, newNodeColIdx); + newNodeId = getNodeId(level, newMatIndices); while (!isNodeVisible(newNodeId, unlockedNodes)) { if (triedRows.length < 3) { - triedRows.push(newNodeRowIdx); - const rowToTry = tryRow(newNodeRowIdx, triedRows); + triedRows.push(newMatIndices.rowIdx); + const rowToTry = tryRow(newMatIndices.rowIdx, triedRows); if (rowToTry !== undefined) { - newNodeRowIdx = rowToTry; + newMatIndices.rowIdx = rowToTry; } } else { - if (newNodeColIdx > 3) { + if (newMatIndices.colIdx > 3) { didMove = true; - newNodeColIdx = 3; - newNodeMatIdx = nodeMatIdx - 1 < 1 ? 8 : nodeMatIdx - 1; + newMatIndices.colIdx = 3; + newMatIndices.matrixIdx = + newMatIndices.matrixIdx - 1 < 1 ? 8 : newMatIndices.matrixIdx - 1; } else { - didMove ? newNodeColIdx-- : newNodeColIdx++; + didMove ? newMatIndices.colIdx-- : newMatIndices.colIdx++; triedRows = []; - newNodeRowIdx = 0; + newMatIndices.rowIdx = 0; } } - newNodeId = getNodeId(level, newNodeMatIdx, newNodeRowIdx, newNodeColIdx); + newNodeId = getNodeId(level, newMatIndices); } } + const newNodeHudId = getNodeHudId(newMatIndices); + return { newNodeId: newNodeId, - newNodeMatIdx: newNodeMatIdx, - newNodeRowIdx: newNodeRowIdx, - newNodeColIdx: newNodeColIdx, + newNodeHudId: newNodeHudId, + newNodeMatrixIndices: newMatIndices, }; }; @@ -319,21 +314,21 @@ const nodeSelector = (context: NodeSelectorContext) => { move, context.unlockedNodes, context.level, - context.nodeMatIdx, - context.nodeRowIdx, - context.nodeColIdx + Object.assign({}, context.nodeMatrixIndices) ); if (newNodeData) { - const didMove = context.nodeMatIdx !== newNodeData.newNodeMatIdx; + const didMove = + context.nodeMatrixIndices.matrixIdx !== + newNodeData.newNodeMatrixIndices.matrixIdx; + const siteRotYModifier = move === "left" ? Math.PI / 4 : -Math.PI / 4; return { event: didMove ? context.action : "change_node", newActiveNodeId: newNodeData.newNodeId, - newNodeMatIdx: newNodeData.newNodeMatIdx, - newNodeRowIdx: newNodeData.newNodeRowIdx, - newNodeColIdx: newNodeData.newNodeColIdx, + newActiveHudId: newNodeData.newNodeHudId, + newNodeMatrixIndices: newNodeData.newNodeMatrixIndices, newSiteRotY: didMove ? context.siteRotY + siteRotYModifier : context.siteRotY, @@ -350,9 +345,7 @@ const nodeSelector = (context: NodeSelectorContext) => { move, context.unlockedNodes, context.level, - context.nodeMatIdx, - context.nodeRowIdx, - context.nodeColIdx + context.nodeMatrixIndices ); if (newNodeData) { @@ -361,9 +354,8 @@ const nodeSelector = (context: NodeSelectorContext) => { return { event: didMove ? context.action : "change_node", newActiveNodeId: newNodeData.newNodeId, - newNodeMatIdx: context.nodeMatIdx, - newNodeRowIdx: newNodeData.newNodeRowIdx, - newNodeColIdx: newNodeData.newNodeColIdx, + newNodeMatrixIndices: newNodeData.newNodeMatrixIndices, + newActiveHudId: newNodeData.newNodeHudId, newSiteRotY: context.siteRotY, newSitePosY: didMove ? context.sitePosY + sitePosYModifier @@ -376,19 +368,17 @@ const nodeSelector = (context: NodeSelectorContext) => { newNodeData = findNodeAfterLevelSelection( context.unlockedNodes, context.level, - context.nodeMatIdx, - context.nodeRowIdx, - context.nodeColIdx + context.nodeMatrixIndices ); if (newNodeData) { return { newActiveNodeId: newNodeData.newNodeId, - newNodeMatIdx: context.nodeMatIdx, - newNodeRowIdx: newNodeData.newNodeRowIdx, - newNodeColIdx: newNodeData.newNodeColIdx, - newSitePosY: newNodeData.newSitePosY, + newNodeMatrixIndices: newNodeData.newNodeMatrixIndices, + newActiveHudId: newNodeData.newNodeHudId, + newSiteRotY: context.siteRotY, newLevel: newNodeData.newLevel, + newSitePosY: newNodeData.newSitePosY, }; } } diff --git a/src/store.ts b/src/store.ts index 7d98c11..65c70df 100644 --- a/src/store.ts +++ b/src/store.ts @@ -91,6 +91,7 @@ type MediaWordState = { }; export type BigTextState = { + visible: boolean; disableTrail: boolean; text: string; color: string; @@ -162,6 +163,7 @@ type MainSceneState = { export const useBigTextStore = create( combine( { + visible: true, color: "yellow", disableTrail: false, text: "Play", @@ -188,6 +190,7 @@ export const useBigTextStore = create( }, })), setColor: (to: string) => set(() => ({ color: to })), + setVisible: (to: boolean) => set(() => ({ visible: to })), }) ) );