From 26e04ae8387cf8d63e68f2726d862dafdb1dd902 Mon Sep 17 00:00:00 2001 From: ad044 Date: Tue, 8 Dec 2020 23:39:25 +0400 Subject: [PATCH] working on node selection algorithm, left side done kind of --- src/core/StateManagers/EventManager.tsx | 2 + src/core/mainSceneEventHandler.ts | 36 ++++- src/core/nodeSelector.ts | 189 ++++++++++++++++++++++++ 3 files changed, 219 insertions(+), 8 deletions(-) create mode 100644 src/core/nodeSelector.ts diff --git a/src/core/StateManagers/EventManager.tsx b/src/core/StateManagers/EventManager.tsx index ae8e4a8..b8cacf9 100644 --- a/src/core/StateManagers/EventManager.tsx +++ b/src/core/StateManagers/EventManager.tsx @@ -70,6 +70,7 @@ const EventManager = () => { pauseMatrixIdx, ]) ); + const unlockedNodes = useNodeStore((state) => state.unlockedNodes); // media scene const mediaComponentMatrixIndices = useMediaStore( @@ -152,6 +153,7 @@ const EventManager = () => { levelSelectionIdx: levelSelectionIdx, pauseMatrixIdx: pauseMatrixIdx, activePauseComponent: activePauseComponent, + unlockedNodes: unlockedNodes, }); break; case "media": diff --git a/src/core/mainSceneEventHandler.ts b/src/core/mainSceneEventHandler.ts index 5766fa7..be40881 100644 --- a/src/core/mainSceneEventHandler.ts +++ b/src/core/mainSceneEventHandler.ts @@ -1,6 +1,8 @@ import node_matrices from "../resources/node_matrices.json"; import site_a from "../resources/site_a.json"; import level_y_values from "../resources/level_y_values.json"; +import nodeSelector from "./nodeSelector"; +import unlocked_nodes from "../resources/unlocked_nodes.json"; const hudAssocs = { "00": "fg_hud_1", @@ -25,9 +27,14 @@ const handleMainSceneEvent = (gameContext: any) => { const levelSelectionIdx = gameContext.levelSelectionIdx; const pauseMatrixIdx = gameContext.pauseMatrixIdx; const activePauseComponent = gameContext.activePauseComponent; + const unlockedNodes = gameContext.unlockedNodes; const nodeColIdx = gameContext.nodeMatrixIndices.colIdx; const nodeRowIdx = gameContext.nodeMatrixIndices.rowIdx; + const nodeMatIdx = gameContext.nodeMatrixIndices.matrixIdx; + const level = gameContext.activeLevel; + const siteRotY = gameContext.siteTransformState.rotY; + const sitePosY = gameContext.siteTransformState.posY; let newNodeMatIdx = gameContext.nodeMatrixIndices.matrixIdx; let newNodeColIdx = gameContext.nodeMatrixIndices.colIdx; @@ -40,15 +47,27 @@ const handleMainSceneEvent = (gameContext: any) => { if (subscene === "site") { switch (keyPress) { case "LEFT": - newNodeColIdx = nodeColIdx - 1; - if (newNodeColIdx < 0) { - event = "move_left"; - newNodeMatIdx = newNodeMatIdx + 1 > 8 ? 1 : newNodeMatIdx + 1; - newNodeColIdx = 0; - newSiteRotY -= -Math.PI / 4; - } else { - event = "change_node"; + const selectedNodeData = nodeSelector({ + keyPress: keyPress, + nodeMatIdx: nodeMatIdx, + nodeColIdx: nodeColIdx, + nodeRowIdx: nodeRowIdx, + level: level, + siteRotY: siteRotY, + sitePosY: sitePosY, + unlockedNodes: unlockedNodes, + }); + + if (selectedNodeData) { + event = selectedNodeData.event; + newNodeMatIdx = selectedNodeData.newNodeMatIdx; + newNodeColIdx = selectedNodeData.newNodeColIdx; + newNodeRowIdx = selectedNodeData.newNodeRowIdx; + newSiteRotY = selectedNodeData.newSiteRotY; + newSitePosY = selectedNodeData.newSitePosY; + newLevel = selectedNodeData.newLevel; } + break; case "DOWN": newNodeRowIdx = nodeRowIdx + 1; @@ -135,6 +154,7 @@ const handleMainSceneEvent = (gameContext: any) => { const newActiveHudId = hudAssocs[`${newNodeRowIdx}${newNodeColIdx}` as keyof typeof hudAssocs]; + console.log(newActiveNodeId) return { event: event, newNodeColIdx: newNodeColIdx, diff --git a/src/core/nodeSelector.ts b/src/core/nodeSelector.ts new file mode 100644 index 0000000..fb629f5 --- /dev/null +++ b/src/core/nodeSelector.ts @@ -0,0 +1,189 @@ +import node_matrices from "../resources/node_matrices.json"; +import site_a from "../resources/site_a.json"; +import { SiteType } from "../components/MainScene/Site"; +import unlocked_nodes from "../resources/unlocked_nodes.json"; + +type NodeSelectorContext = { + keyPress: string; + nodeMatIdx: number; + nodeColIdx: number; + nodeRowIdx: number; + level: string; + siteRotY: number; + sitePosY: number; + unlockedNodes: typeof unlocked_nodes; +}; + +const getNodeId = ( + level: string, + nodeMatIdx: number, + nodeRowIdx: number, + nodeColIdx: number +) => + level + + node_matrices[nodeMatIdx.toString() as keyof typeof node_matrices][ + nodeRowIdx + ][nodeColIdx]; + +const isNodeVisible = ( + nodeId: string, + unlockedNodes: typeof unlocked_nodes +) => { + const nodeLevel = nodeId.substr(0, 2); + const nodeData = (site_a as SiteType)[nodeLevel][nodeId]; + if (nodeData) { + const unlockedBy = nodeData.unlocked_by; + + let unlocked; + if (unlockedBy === "-1") unlocked = true; + else + unlocked = + unlockedNodes[unlockedBy as keyof typeof unlockedNodes].unlocked; + + // ishidden checker needs tweaking, this is temp + return ( + unlocked && (nodeData.is_hidden === "0" || nodeData.is_hidden === "3") + ); + } else { + return false; + } +}; + +const nodeSelector = (context: NodeSelectorContext) => { + const unlockedNodes = context.unlockedNodes; + + switch (context.keyPress) { + case "LEFT": + let newNodeColIdx = context.nodeColIdx - 1; + if (newNodeColIdx < 0) { + const event = "move_left"; + const newNodeMatIdx = + context.nodeMatIdx + 1 > 8 ? 1 : context.nodeMatIdx + 1; + const newSiteRotY = context.siteRotY + Math.PI / 4; + + newNodeColIdx = 0; + let newNodeRowIdx = context.nodeRowIdx; + + let newNodeId = getNodeId( + context.level, + newNodeMatIdx, + newNodeRowIdx, + newNodeColIdx + ); + + let triedRows: number[] = []; + + while (!isNodeVisible(newNodeId, unlockedNodes)) { + if (triedRows.length < 3) { + triedRows.push(newNodeRowIdx); + if (newNodeRowIdx === 1 && !triedRows.includes(0)) + newNodeRowIdx = 0; + else if (newNodeRowIdx === 1 && !triedRows.includes(2)) + newNodeRowIdx = 2; + else if (newNodeRowIdx === 2 && !triedRows.includes(0)) + newNodeRowIdx = 0; + else if (newNodeRowIdx === 2 && !triedRows.includes(1)) + newNodeRowIdx = 1; + else if (newNodeRowIdx === 0 && !triedRows.includes(1)) + newNodeRowIdx = 1; + else if (newNodeRowIdx === 0 && !triedRows.includes(2)) + newNodeRowIdx = 2; + } else { + if (newNodeColIdx === 3) { + newNodeId = getNodeId( + context.level, + newNodeMatIdx, + newNodeRowIdx, + newNodeColIdx + ); + } else { + newNodeColIdx++; + triedRows = []; + newNodeRowIdx = 0; + } + } + newNodeId = getNodeId( + context.level, + newNodeMatIdx, + newNodeRowIdx, + newNodeColIdx + ); + } + + return { + event: event, + newNodeMatIdx: newNodeMatIdx, + newNodeRowIdx: newNodeRowIdx, + newNodeColIdx: newNodeColIdx, + newSiteRotY: newSiteRotY, + newSitePosY: context.sitePosY, + newLevel: context.level, + }; + } else { + let event = "change_node"; + + let newNodeRowIdx = context.nodeRowIdx; + + let newNodeMatIdx = context.nodeMatIdx; + let newSiteRotY = context.siteRotY; + + let newNodeId = getNodeId( + context.level, + newNodeMatIdx, + newNodeRowIdx, + newNodeColIdx + ); + + let triedRows: number[] = []; + + while (!isNodeVisible(newNodeId, unlockedNodes)) { + if (triedRows.length < 3) { + triedRows.push(newNodeRowIdx); + if (newNodeRowIdx === 1 && !triedRows.includes(0)) + newNodeRowIdx = 0; + else if (newNodeRowIdx === 1 && !triedRows.includes(2)) + newNodeRowIdx = 2; + else if (newNodeRowIdx === 2 && !triedRows.includes(0)) + newNodeRowIdx = 0; + else if (newNodeRowIdx === 2 && !triedRows.includes(1)) + newNodeRowIdx = 1; + else if (newNodeRowIdx === 0 && !triedRows.includes(1)) + newNodeRowIdx = 1; + else if (newNodeRowIdx === 0 && !triedRows.includes(2)) + newNodeRowIdx = 2; + } else { + if (newNodeColIdx === 0) { + newNodeId = getNodeId( + context.level, + newNodeMatIdx, + newNodeRowIdx, + newNodeColIdx + ); + } else { + newNodeColIdx--; + triedRows = []; + newNodeRowIdx = 0; + } + } + newNodeId = getNodeId( + context.level, + newNodeMatIdx, + newNodeRowIdx, + newNodeColIdx + ); + } + + return { + event: event, + newNodeMatIdx: newNodeMatIdx, + newNodeRowIdx: newNodeRowIdx, + newNodeColIdx: newNodeColIdx, + newSiteRotY: newSiteRotY, + newSitePosY: context.sitePosY, + newLevel: context.level, + }; + } + } +}; + +export default nodeSelector;