mirror of
https://github.com/ad044/lainTSX.git
synced 2024-10-22 23:19:06 +00:00
tweaked the code, added right side node selection algo
This commit is contained in:
parent
26e04ae838
commit
27ab0b18ac
3 changed files with 259 additions and 126 deletions
|
@ -107,6 +107,7 @@ 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;
|
||||
|
|
|
@ -45,9 +45,11 @@ const handleMainSceneEvent = (gameContext: any) => {
|
|||
let newScene = gameContext.scene;
|
||||
|
||||
if (subscene === "site") {
|
||||
let selectedNodeData;
|
||||
switch (keyPress) {
|
||||
case "LEFT":
|
||||
const selectedNodeData = nodeSelector({
|
||||
case "RIGHT":
|
||||
selectedNodeData = nodeSelector({
|
||||
keyPress: keyPress,
|
||||
nodeMatIdx: nodeMatIdx,
|
||||
nodeColIdx: nodeColIdx,
|
||||
|
@ -98,17 +100,6 @@ const handleMainSceneEvent = (gameContext: any) => {
|
|||
event = "change_node";
|
||||
}
|
||||
break;
|
||||
case "RIGHT":
|
||||
newNodeColIdx = nodeColIdx + 1;
|
||||
if (newNodeColIdx > 3) {
|
||||
event = "move_right";
|
||||
newNodeMatIdx = newNodeMatIdx - 1 < 1 ? 8 : newNodeMatIdx - 1;
|
||||
newNodeColIdx = 3;
|
||||
newSiteRotY += -Math.PI / 4;
|
||||
} else {
|
||||
event = "change_node";
|
||||
}
|
||||
break;
|
||||
case "CIRCLE":
|
||||
// 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
|
||||
|
@ -154,7 +145,6 @@ const handleMainSceneEvent = (gameContext: any) => {
|
|||
const newActiveHudId =
|
||||
hudAssocs[`${newNodeRowIdx}${newNodeColIdx}` as keyof typeof hudAssocs];
|
||||
|
||||
console.log(newActiveNodeId)
|
||||
return {
|
||||
event: event,
|
||||
newNodeColIdx: newNodeColIdx,
|
||||
|
|
|
@ -49,136 +49,278 @@ const isNodeVisible = (
|
|||
}
|
||||
};
|
||||
|
||||
const nodeSelector = (context: NodeSelectorContext) => {
|
||||
const unlockedNodes = context.unlockedNodes;
|
||||
const findNodeAfterMoving = (
|
||||
direction: string,
|
||||
unlockedNodes: typeof unlocked_nodes,
|
||||
level: string,
|
||||
nodeMatIdx: number,
|
||||
nodeRowIdx: number
|
||||
) => {
|
||||
let newNodeId;
|
||||
let newNodeRowIdx = nodeRowIdx;
|
||||
let newNodeMatIdx = nodeMatIdx;
|
||||
let newNodeColIdx;
|
||||
|
||||
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;
|
||||
if (direction === "left") {
|
||||
newNodeColIdx = 0;
|
||||
|
||||
newNodeColIdx = 0;
|
||||
let newNodeRowIdx = context.nodeRowIdx;
|
||||
newNodeMatIdx = nodeMatIdx + 1 > 8 ? 1 : nodeMatIdx + 1;
|
||||
newNodeId = getNodeId(level, newNodeMatIdx, nodeRowIdx, newNodeColIdx);
|
||||
|
||||
let newNodeId = getNodeId(
|
||||
context.level,
|
||||
newNodeMatIdx,
|
||||
newNodeRowIdx,
|
||||
newNodeColIdx
|
||||
);
|
||||
let triedRows: number[] = [];
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
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,
|
||||
level,
|
||||
newNodeMatIdx,
|
||||
newNodeRowIdx,
|
||||
newNodeColIdx
|
||||
);
|
||||
} else {
|
||||
newNodeColIdx++;
|
||||
triedRows = [];
|
||||
newNodeRowIdx = 0;
|
||||
}
|
||||
}
|
||||
newNodeId = getNodeId(level, newNodeMatIdx, newNodeRowIdx, newNodeColIdx);
|
||||
}
|
||||
} else if (direction === "right") {
|
||||
newNodeColIdx = 3;
|
||||
|
||||
newNodeMatIdx = nodeMatIdx - 1 < 1 ? 8 : nodeMatIdx - 1;
|
||||
newNodeId = getNodeId(level, newNodeMatIdx, nodeRowIdx, 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(
|
||||
level,
|
||||
newNodeMatIdx,
|
||||
newNodeRowIdx,
|
||||
newNodeColIdx
|
||||
);
|
||||
} else {
|
||||
newNodeColIdx--;
|
||||
triedRows = [];
|
||||
newNodeRowIdx = 0;
|
||||
}
|
||||
}
|
||||
newNodeId = getNodeId(level, newNodeMatIdx, newNodeRowIdx, newNodeColIdx);
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
newNodeId: newNodeId,
|
||||
newNodeMatIdx: newNodeMatIdx,
|
||||
newNodeRowIdx: newNodeRowIdx,
|
||||
newNodeColIdx: newNodeColIdx,
|
||||
};
|
||||
};
|
||||
|
||||
const findNode = (
|
||||
direction: string,
|
||||
unlockedNodes: typeof unlocked_nodes,
|
||||
level: string,
|
||||
nodeMatIdx: number,
|
||||
nodeRowIdx: number,
|
||||
nodeColIdx: number
|
||||
) => {
|
||||
let newNodeId;
|
||||
let newNodeRowIdx = nodeRowIdx;
|
||||
let newNodeMatIdx = nodeMatIdx;
|
||||
let newNodeColIdx = nodeColIdx;
|
||||
if (direction === "left") {
|
||||
newNodeColIdx--;
|
||||
|
||||
let newNodeId = getNodeId(
|
||||
level,
|
||||
newNodeMatIdx,
|
||||
newNodeRowIdx,
|
||||
newNodeColIdx
|
||||
);
|
||||
|
||||
let triedRows: number[] = [];
|
||||
|
||||
if (newNodeColIdx < 0)
|
||||
return findNodeAfterMoving(
|
||||
"left",
|
||||
unlockedNodes,
|
||||
level,
|
||||
nodeMatIdx,
|
||||
nodeRowIdx
|
||||
);
|
||||
|
||||
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) {
|
||||
return findNodeAfterMoving(
|
||||
"left",
|
||||
unlockedNodes,
|
||||
level,
|
||||
nodeMatIdx,
|
||||
nodeRowIdx
|
||||
);
|
||||
} else {
|
||||
newNodeColIdx--;
|
||||
triedRows = [];
|
||||
newNodeRowIdx = 0;
|
||||
}
|
||||
}
|
||||
newNodeId = getNodeId(level, newNodeMatIdx, newNodeRowIdx, newNodeColIdx);
|
||||
}
|
||||
} else if (direction === "right") {
|
||||
newNodeColIdx++;
|
||||
|
||||
let newNodeId = getNodeId(
|
||||
level,
|
||||
newNodeMatIdx,
|
||||
newNodeRowIdx,
|
||||
newNodeColIdx
|
||||
);
|
||||
|
||||
let triedRows: number[] = [];
|
||||
|
||||
if (newNodeColIdx > 3)
|
||||
return findNodeAfterMoving(
|
||||
"right",
|
||||
unlockedNodes,
|
||||
level,
|
||||
nodeMatIdx,
|
||||
nodeRowIdx
|
||||
);
|
||||
|
||||
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) {
|
||||
return findNodeAfterMoving(
|
||||
"right",
|
||||
unlockedNodes,
|
||||
level,
|
||||
nodeMatIdx,
|
||||
nodeRowIdx
|
||||
);
|
||||
} else {
|
||||
newNodeColIdx++;
|
||||
triedRows = [];
|
||||
newNodeRowIdx = 0;
|
||||
}
|
||||
}
|
||||
newNodeId = getNodeId(level, newNodeMatIdx, newNodeRowIdx, newNodeColIdx);
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
newNodeId: newNodeId,
|
||||
newNodeMatIdx: newNodeMatIdx,
|
||||
newNodeRowIdx: newNodeRowIdx,
|
||||
newNodeColIdx: newNodeColIdx,
|
||||
};
|
||||
};
|
||||
|
||||
const nodeSelector = (context: NodeSelectorContext) => {
|
||||
let newNodeData;
|
||||
switch (context.keyPress) {
|
||||
case "LEFT":
|
||||
newNodeData = findNode(
|
||||
"left",
|
||||
context.unlockedNodes,
|
||||
context.level,
|
||||
context.nodeMatIdx,
|
||||
context.nodeRowIdx,
|
||||
context.nodeColIdx
|
||||
);
|
||||
|
||||
if (newNodeData) {
|
||||
const didMove = context.nodeMatIdx !== newNodeData.newNodeMatIdx;
|
||||
return {
|
||||
event: event,
|
||||
newNodeMatIdx: newNodeMatIdx,
|
||||
newNodeRowIdx: newNodeRowIdx,
|
||||
newNodeColIdx: newNodeColIdx,
|
||||
newSiteRotY: newSiteRotY,
|
||||
event: didMove ? "move_left" : "change_node",
|
||||
newNodeMatIdx: newNodeData.newNodeMatIdx,
|
||||
newNodeRowIdx: newNodeData.newNodeRowIdx,
|
||||
newNodeColIdx: newNodeData.newNodeColIdx,
|
||||
newSiteRotY: didMove
|
||||
? context.siteRotY + Math.PI / 4
|
||||
: context.siteRotY,
|
||||
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
|
||||
);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case "RIGHT":
|
||||
newNodeData = findNode(
|
||||
"right",
|
||||
context.unlockedNodes,
|
||||
context.level,
|
||||
context.nodeMatIdx,
|
||||
context.nodeRowIdx,
|
||||
context.nodeColIdx
|
||||
);
|
||||
|
||||
if (newNodeData) {
|
||||
const didMove = context.nodeMatIdx !== newNodeData.newNodeMatIdx;
|
||||
return {
|
||||
event: event,
|
||||
newNodeMatIdx: newNodeMatIdx,
|
||||
newNodeRowIdx: newNodeRowIdx,
|
||||
newNodeColIdx: newNodeColIdx,
|
||||
newSiteRotY: newSiteRotY,
|
||||
event: didMove ? "move_right" : "change_node",
|
||||
newNodeMatIdx: newNodeData.newNodeMatIdx,
|
||||
newNodeRowIdx: newNodeData.newNodeRowIdx,
|
||||
newNodeColIdx: newNodeData.newNodeColIdx,
|
||||
newSiteRotY: didMove
|
||||
? context.siteRotY - Math.PI / 4
|
||||
: context.siteRotY,
|
||||
newSitePosY: context.sitePosY,
|
||||
newLevel: context.level,
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue