mirror of
https://github.com/ad044/lainTSX.git
synced 2024-10-22 23:19:06 +00:00
working on node selection algorithm, left side done kind of
This commit is contained in:
parent
3a76c4d75d
commit
26e04ae838
3 changed files with 219 additions and 8 deletions
|
@ -70,6 +70,7 @@ const EventManager = () => {
|
||||||
pauseMatrixIdx,
|
pauseMatrixIdx,
|
||||||
])
|
])
|
||||||
);
|
);
|
||||||
|
const unlockedNodes = useNodeStore((state) => state.unlockedNodes);
|
||||||
|
|
||||||
// media scene
|
// media scene
|
||||||
const mediaComponentMatrixIndices = useMediaStore(
|
const mediaComponentMatrixIndices = useMediaStore(
|
||||||
|
@ -152,6 +153,7 @@ const EventManager = () => {
|
||||||
levelSelectionIdx: levelSelectionIdx,
|
levelSelectionIdx: levelSelectionIdx,
|
||||||
pauseMatrixIdx: pauseMatrixIdx,
|
pauseMatrixIdx: pauseMatrixIdx,
|
||||||
activePauseComponent: activePauseComponent,
|
activePauseComponent: activePauseComponent,
|
||||||
|
unlockedNodes: unlockedNodes,
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case "media":
|
case "media":
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
import node_matrices from "../resources/node_matrices.json";
|
import node_matrices from "../resources/node_matrices.json";
|
||||||
import site_a from "../resources/site_a.json";
|
import site_a from "../resources/site_a.json";
|
||||||
import level_y_values from "../resources/level_y_values.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 = {
|
const hudAssocs = {
|
||||||
"00": "fg_hud_1",
|
"00": "fg_hud_1",
|
||||||
|
@ -25,9 +27,14 @@ const handleMainSceneEvent = (gameContext: any) => {
|
||||||
const levelSelectionIdx = gameContext.levelSelectionIdx;
|
const levelSelectionIdx = gameContext.levelSelectionIdx;
|
||||||
const pauseMatrixIdx = gameContext.pauseMatrixIdx;
|
const pauseMatrixIdx = gameContext.pauseMatrixIdx;
|
||||||
const activePauseComponent = gameContext.activePauseComponent;
|
const activePauseComponent = gameContext.activePauseComponent;
|
||||||
|
const unlockedNodes = gameContext.unlockedNodes;
|
||||||
|
|
||||||
const nodeColIdx = gameContext.nodeMatrixIndices.colIdx;
|
const nodeColIdx = gameContext.nodeMatrixIndices.colIdx;
|
||||||
const nodeRowIdx = gameContext.nodeMatrixIndices.rowIdx;
|
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 newNodeMatIdx = gameContext.nodeMatrixIndices.matrixIdx;
|
||||||
let newNodeColIdx = gameContext.nodeMatrixIndices.colIdx;
|
let newNodeColIdx = gameContext.nodeMatrixIndices.colIdx;
|
||||||
|
@ -40,15 +47,27 @@ const handleMainSceneEvent = (gameContext: any) => {
|
||||||
if (subscene === "site") {
|
if (subscene === "site") {
|
||||||
switch (keyPress) {
|
switch (keyPress) {
|
||||||
case "LEFT":
|
case "LEFT":
|
||||||
newNodeColIdx = nodeColIdx - 1;
|
const selectedNodeData = nodeSelector({
|
||||||
if (newNodeColIdx < 0) {
|
keyPress: keyPress,
|
||||||
event = "move_left";
|
nodeMatIdx: nodeMatIdx,
|
||||||
newNodeMatIdx = newNodeMatIdx + 1 > 8 ? 1 : newNodeMatIdx + 1;
|
nodeColIdx: nodeColIdx,
|
||||||
newNodeColIdx = 0;
|
nodeRowIdx: nodeRowIdx,
|
||||||
newSiteRotY -= -Math.PI / 4;
|
level: level,
|
||||||
} else {
|
siteRotY: siteRotY,
|
||||||
event = "change_node";
|
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;
|
break;
|
||||||
case "DOWN":
|
case "DOWN":
|
||||||
newNodeRowIdx = nodeRowIdx + 1;
|
newNodeRowIdx = nodeRowIdx + 1;
|
||||||
|
@ -135,6 +154,7 @@ const handleMainSceneEvent = (gameContext: any) => {
|
||||||
const newActiveHudId =
|
const newActiveHudId =
|
||||||
hudAssocs[`${newNodeRowIdx}${newNodeColIdx}` as keyof typeof hudAssocs];
|
hudAssocs[`${newNodeRowIdx}${newNodeColIdx}` as keyof typeof hudAssocs];
|
||||||
|
|
||||||
|
console.log(newActiveNodeId)
|
||||||
return {
|
return {
|
||||||
event: event,
|
event: event,
|
||||||
newNodeColIdx: newNodeColIdx,
|
newNodeColIdx: newNodeColIdx,
|
||||||
|
|
189
src/core/nodeSelector.ts
Normal file
189
src/core/nodeSelector.ts
Normal 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;
|
Loading…
Reference in a new issue