tweaked the code, added right side node selection algo

This commit is contained in:
ad044 2020-12-09 19:57:53 +04:00
parent 26e04ae838
commit 27ab0b18ac
3 changed files with 259 additions and 126 deletions

View file

@ -107,6 +107,7 @@ const NodeManager = (props: StateManagerProps) => {
if (props.eventState) { if (props.eventState) {
const eventAction = props.eventState.event; const eventAction = props.eventState.event;
const newActiveNodeId = props.eventState.newActiveNodeId; const newActiveNodeId = props.eventState.newActiveNodeId;
console.log(newActiveNodeId)
const newNodeRowIdx = props.eventState.newNodeRowIdx; const newNodeRowIdx = props.eventState.newNodeRowIdx;
const newNodeColIdx = props.eventState.newNodeColIdx; const newNodeColIdx = props.eventState.newNodeColIdx;
const newNodeMatIdx = props.eventState.newNodeMatIdx; const newNodeMatIdx = props.eventState.newNodeMatIdx;

View file

@ -45,9 +45,11 @@ const handleMainSceneEvent = (gameContext: any) => {
let newScene = gameContext.scene; let newScene = gameContext.scene;
if (subscene === "site") { if (subscene === "site") {
let selectedNodeData;
switch (keyPress) { switch (keyPress) {
case "LEFT": case "LEFT":
const selectedNodeData = nodeSelector({ case "RIGHT":
selectedNodeData = nodeSelector({
keyPress: keyPress, keyPress: keyPress,
nodeMatIdx: nodeMatIdx, nodeMatIdx: nodeMatIdx,
nodeColIdx: nodeColIdx, nodeColIdx: nodeColIdx,
@ -98,17 +100,6 @@ const handleMainSceneEvent = (gameContext: any) => {
event = "change_node"; event = "change_node";
} }
break; 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": case "CIRCLE":
// in this case we have to check the type of the blue orb // 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 // and dispatch an action depending on that, so we have to precalculate the
@ -154,7 +145,6 @@ 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,

View file

@ -49,35 +49,30 @@ const isNodeVisible = (
} }
}; };
const nodeSelector = (context: NodeSelectorContext) => { const findNodeAfterMoving = (
const unlockedNodes = context.unlockedNodes; direction: string,
unlockedNodes: typeof unlocked_nodes,
switch (context.keyPress) { level: string,
case "LEFT": nodeMatIdx: number,
let newNodeColIdx = context.nodeColIdx - 1; nodeRowIdx: number
if (newNodeColIdx < 0) { ) => {
const event = "move_left"; let newNodeId;
const newNodeMatIdx = let newNodeRowIdx = nodeRowIdx;
context.nodeMatIdx + 1 > 8 ? 1 : context.nodeMatIdx + 1; let newNodeMatIdx = nodeMatIdx;
const newSiteRotY = context.siteRotY + Math.PI / 4; let newNodeColIdx;
if (direction === "left") {
newNodeColIdx = 0; newNodeColIdx = 0;
let newNodeRowIdx = context.nodeRowIdx;
let newNodeId = getNodeId( newNodeMatIdx = nodeMatIdx + 1 > 8 ? 1 : nodeMatIdx + 1;
context.level, newNodeId = getNodeId(level, newNodeMatIdx, nodeRowIdx, newNodeColIdx);
newNodeMatIdx,
newNodeRowIdx,
newNodeColIdx
);
let triedRows: number[] = []; let triedRows: number[] = [];
while (!isNodeVisible(newNodeId, unlockedNodes)) { while (!isNodeVisible(newNodeId, unlockedNodes)) {
if (triedRows.length < 3) { if (triedRows.length < 3) {
triedRows.push(newNodeRowIdx); triedRows.push(newNodeRowIdx);
if (newNodeRowIdx === 1 && !triedRows.includes(0)) if (newNodeRowIdx === 1 && !triedRows.includes(0)) newNodeRowIdx = 0;
newNodeRowIdx = 0;
else if (newNodeRowIdx === 1 && !triedRows.includes(2)) else if (newNodeRowIdx === 1 && !triedRows.includes(2))
newNodeRowIdx = 2; newNodeRowIdx = 2;
else if (newNodeRowIdx === 2 && !triedRows.includes(0)) else if (newNodeRowIdx === 2 && !triedRows.includes(0))
@ -91,7 +86,7 @@ const nodeSelector = (context: NodeSelectorContext) => {
} else { } else {
if (newNodeColIdx === 3) { if (newNodeColIdx === 3) {
newNodeId = getNodeId( newNodeId = getNodeId(
context.level, level,
newNodeMatIdx, newNodeMatIdx,
newNodeRowIdx, newNodeRowIdx,
newNodeColIdx newNodeColIdx
@ -102,45 +97,20 @@ const nodeSelector = (context: NodeSelectorContext) => {
newNodeRowIdx = 0; newNodeRowIdx = 0;
} }
} }
newNodeId = getNodeId( newNodeId = getNodeId(level, newNodeMatIdx, newNodeRowIdx, newNodeColIdx);
context.level,
newNodeMatIdx,
newNodeRowIdx,
newNodeColIdx
);
} }
} else if (direction === "right") {
newNodeColIdx = 3;
return { newNodeMatIdx = nodeMatIdx - 1 < 1 ? 8 : nodeMatIdx - 1;
event: event, newNodeId = getNodeId(level, newNodeMatIdx, nodeRowIdx, newNodeColIdx);
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[] = []; let triedRows: number[] = [];
while (!isNodeVisible(newNodeId, unlockedNodes)) { while (!isNodeVisible(newNodeId, unlockedNodes)) {
if (triedRows.length < 3) { if (triedRows.length < 3) {
triedRows.push(newNodeRowIdx); triedRows.push(newNodeRowIdx);
if (newNodeRowIdx === 1 && !triedRows.includes(0)) if (newNodeRowIdx === 1 && !triedRows.includes(0)) newNodeRowIdx = 0;
newNodeRowIdx = 0;
else if (newNodeRowIdx === 1 && !triedRows.includes(2)) else if (newNodeRowIdx === 1 && !triedRows.includes(2))
newNodeRowIdx = 2; newNodeRowIdx = 2;
else if (newNodeRowIdx === 2 && !triedRows.includes(0)) else if (newNodeRowIdx === 2 && !triedRows.includes(0))
@ -154,7 +124,7 @@ const nodeSelector = (context: NodeSelectorContext) => {
} else { } else {
if (newNodeColIdx === 0) { if (newNodeColIdx === 0) {
newNodeId = getNodeId( newNodeId = getNodeId(
context.level, level,
newNodeMatIdx, newNodeMatIdx,
newNodeRowIdx, newNodeRowIdx,
newNodeColIdx newNodeColIdx
@ -165,20 +135,192 @@ const nodeSelector = (context: NodeSelectorContext) => {
newNodeRowIdx = 0; newNodeRowIdx = 0;
} }
} }
newNodeId = getNodeId( newNodeId = getNodeId(level, newNodeMatIdx, newNodeRowIdx, newNodeColIdx);
context.level, }
}
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, newNodeMatIdx,
newNodeRowIdx, newNodeRowIdx,
newNodeColIdx 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 { return {
event: event, newNodeId: newNodeId,
newNodeMatIdx: newNodeMatIdx, newNodeMatIdx: newNodeMatIdx,
newNodeRowIdx: newNodeRowIdx, newNodeRowIdx: newNodeRowIdx,
newNodeColIdx: newNodeColIdx, newNodeColIdx: newNodeColIdx,
newSiteRotY: newSiteRotY, };
};
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: 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,
};
}
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: 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, newSitePosY: context.sitePosY,
newLevel: context.level, newLevel: context.level,
}; };