working on node selection algorithm, left side done kind of

This commit is contained in:
ad044 2020-12-08 23:39:25 +04:00
parent 3a76c4d75d
commit 26e04ae838
3 changed files with 219 additions and 8 deletions

View file

@ -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":

View file

@ -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,

189
src/core/nodeSelector.ts Normal file
View file

@ -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;