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,
|
||||
])
|
||||
);
|
||||
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":
|
||||
|
|
|
@ -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
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