added up movement, cleaning up the node selector

This commit is contained in:
ad044 2020-12-12 01:49:34 +04:00
parent 630537f8ac
commit a4f50525f8
2 changed files with 127 additions and 287 deletions

View file

@ -50,6 +50,7 @@ const handleMainSceneEvent = (gameContext: any) => {
case "LEFT": case "LEFT":
case "RIGHT": case "RIGHT":
case "DOWN": case "DOWN":
case "UP":
selectedNodeData = nodeSelector({ selectedNodeData = nodeSelector({
keyPress: keyPress, keyPress: keyPress,
nodeMatIdx: nodeMatIdx, nodeMatIdx: nodeMatIdx,
@ -71,21 +72,6 @@ const handleMainSceneEvent = (gameContext: any) => {
newLevel = selectedNodeData.newLevel; newLevel = selectedNodeData.newLevel;
} }
break;
case "UP":
newNodeRowIdx = nodeRowIdx - 1;
if (newNodeRowIdx < 0) {
event = "move_up";
newLevel = (parseInt(gameContext.activeLevel) + 1)
.toString()
.padStart(2, "0");
newNodeRowIdx = 2;
newSitePosY -= 1.5;
} else {
event = "change_node";
}
break; 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

View file

@ -49,173 +49,6 @@ const isNodeVisible = (
} }
}; };
const findNodeAfterMoving = (
direction: string,
unlockedNodes: typeof unlocked_nodes,
level: string,
nodeMatIdx: number,
nodeRowIdx: number
) => {
let newNodeId;
let newNodeRowIdx = nodeRowIdx;
let newNodeMatIdx = nodeMatIdx;
let newNodeColIdx;
if (direction === "left") {
newNodeColIdx = 0;
newNodeMatIdx = nodeMatIdx + 1 > 8 ? 1 : 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 === 3) {
newNodeId = getNodeId(
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 findNodeAfterMovingVertical = (
direction: string,
unlockedNodes: typeof unlocked_nodes,
level: string,
nodeMatIdx: number,
nodeColIdx: number
) => {
let newNodeId;
let newNodeRowIdx;
let newNodeColIdx = nodeColIdx;
let newLevel = (parseInt(level) - 1).toString().padStart(2, "0");
if (direction === "down") {
newNodeRowIdx = 0;
console.log(newNodeColIdx);
newNodeId = getNodeId(newLevel, nodeMatIdx, newNodeRowIdx, newNodeColIdx);
let triedCols: number[] = [];
while (!isNodeVisible(newNodeId, unlockedNodes)) {
if (triedCols.length < 4) {
triedCols.push(newNodeColIdx);
if (newNodeColIdx === 1 && !triedCols.includes(0)) newNodeColIdx = 0;
else if (newNodeColIdx === 1 && !triedCols.includes(2))
newNodeColIdx = 2;
else if (newNodeColIdx === 1 && !triedCols.includes(3))
newNodeColIdx = 3;
else if (newNodeColIdx === 2 && !triedCols.includes(1))
newNodeColIdx = 1;
else if (newNodeColIdx === 2 && !triedCols.includes(3))
newNodeColIdx = 3;
else if (newNodeColIdx === 2 && !triedCols.includes(0))
newNodeColIdx = 0;
else if (newNodeColIdx === 3 && !triedCols.includes(2))
newNodeColIdx = 2;
else if (newNodeColIdx === 3 && !triedCols.includes(1))
newNodeColIdx = 1;
else if (newNodeColIdx === 3 && !triedCols.includes(0))
newNodeColIdx = 0;
else if (newNodeColIdx === 0 && !triedCols.includes(1))
newNodeColIdx = 1;
else if (newNodeColIdx === 0 && !triedCols.includes(2))
newNodeColIdx = 2;
else if (newNodeColIdx === 0 && !triedCols.includes(3))
newNodeColIdx = 3;
} else {
if (newNodeRowIdx === 2) {
newNodeId = getNodeId(
newLevel,
nodeMatIdx,
newNodeRowIdx,
newNodeColIdx
);
} else {
newNodeRowIdx++;
triedCols = [];
}
}
newNodeId = getNodeId(newLevel, nodeMatIdx, newNodeRowIdx, newNodeColIdx);
}
}
return {
newNodeId: newNodeId,
newNodeRowIdx: newNodeRowIdx,
newNodeColIdx: newNodeColIdx,
newLevel: newLevel,
};
};
const findNodeVertical = ( const findNodeVertical = (
direction: string, direction: string,
unlockedNodes: typeof unlocked_nodes, unlockedNodes: typeof unlocked_nodes,
@ -225,26 +58,23 @@ const findNodeVertical = (
nodeColIdx: number nodeColIdx: number
) => { ) => {
let newNodeId; let newNodeId;
let newLevel = level;
let newNodeRowIdx = nodeRowIdx; let newNodeRowIdx = nodeRowIdx;
let newNodeMatIdx = nodeMatIdx; let newNodeMatIdx = nodeMatIdx;
let newNodeColIdx = nodeColIdx; let newNodeColIdx = nodeColIdx;
if (direction === "down") { if (direction === "down") {
newNodeRowIdx++; newNodeRowIdx++;
let triedCols: number[] = []; let triedCols: number[] = [];
if (newNodeRowIdx > 2) { if (newNodeRowIdx > 2) {
return findNodeAfterMovingVertical( newNodeRowIdx = 0;
"down", newLevel = (parseInt(level) - 1).toString().padStart(2, "0");
unlockedNodes,
level,
nodeMatIdx,
nodeColIdx
);
} }
let newNodeId = getNodeId( let newNodeId = getNodeId(
level, newLevel,
newNodeMatIdx, newNodeMatIdx,
newNodeRowIdx, newNodeRowIdx,
newNodeColIdx newNodeColIdx
@ -278,30 +108,101 @@ const findNodeVertical = (
newNodeColIdx = 3; newNodeColIdx = 3;
} else { } else {
if (newNodeRowIdx === 2) { if (newNodeRowIdx === 2) {
return findNodeAfterMovingVertical( newNodeRowIdx = 0;
"down", newLevel = (parseInt(level) - 1).toString().padStart(2, "0");
unlockedNodes,
level,
nodeMatIdx,
nodeColIdx
);
} else { } else {
newNodeRowIdx++; newNodeRowIdx++;
triedCols = []; triedCols = [];
newNodeColIdx = 0; newNodeColIdx = 0;
} }
} }
newNodeId = getNodeId(level, newNodeMatIdx, newNodeRowIdx, newNodeColIdx); newNodeId = getNodeId(
newLevel,
newNodeMatIdx,
newNodeRowIdx,
newNodeColIdx
);
}
} else if (direction === "up") {
newNodeRowIdx--;
let triedCols: number[] = [];
if (newNodeRowIdx < 0) {
newNodeRowIdx = 2;
newLevel = (parseInt(level) + 1).toString().padStart(2, "0");
}
let newNodeId = getNodeId(
newLevel,
newNodeMatIdx,
newNodeRowIdx,
newNodeColIdx
);
while (!isNodeVisible(newNodeId, unlockedNodes)) {
if (triedCols.length < 4) {
triedCols.push(newNodeColIdx);
if (newNodeColIdx === 1 && !triedCols.includes(0)) newNodeColIdx = 0;
else if (newNodeColIdx === 1 && !triedCols.includes(2))
newNodeColIdx = 2;
else if (newNodeColIdx === 1 && !triedCols.includes(3))
newNodeColIdx = 3;
else if (newNodeColIdx === 2 && !triedCols.includes(1))
newNodeColIdx = 1;
else if (newNodeColIdx === 2 && !triedCols.includes(3))
newNodeColIdx = 3;
else if (newNodeColIdx === 2 && !triedCols.includes(0))
newNodeColIdx = 0;
else if (newNodeColIdx === 3 && !triedCols.includes(2))
newNodeColIdx = 2;
else if (newNodeColIdx === 3 && !triedCols.includes(1))
newNodeColIdx = 1;
else if (newNodeColIdx === 3 && !triedCols.includes(0))
newNodeColIdx = 0;
else if (newNodeColIdx === 0 && !triedCols.includes(1))
newNodeColIdx = 1;
else if (newNodeColIdx === 0 && !triedCols.includes(2))
newNodeColIdx = 2;
else if (newNodeColIdx === 0 && !triedCols.includes(3))
newNodeColIdx = 3;
} else {
if (newNodeRowIdx === 0) {
newNodeRowIdx = 2;
newLevel = (parseInt(level) + 1).toString().padStart(2, "0");
} else {
newNodeRowIdx--;
triedCols = [];
newNodeColIdx = 0;
}
}
newNodeId = getNodeId(
newLevel,
newNodeMatIdx,
newNodeRowIdx,
newNodeColIdx
);
} }
} }
return { return {
newNodeId: newNodeId, newNodeId: newNodeId,
newLevel: level, newLevel: newLevel,
newNodeRowIdx: newNodeRowIdx, newNodeRowIdx: newNodeRowIdx,
newNodeColIdx: newNodeColIdx, newNodeColIdx: newNodeColIdx,
}; };
}; };
const tryRow = (row: number, triedRows: number[]) => {
console.log(row);
console.log(triedRows);
if (row === 1 && !triedRows.includes(0)) return 0;
else if (row === 1 && !triedRows.includes(2)) return 2;
else if (row === 2 && !triedRows.includes(0)) return 0;
else if (row === 2 && !triedRows.includes(1)) return 1;
else if (row === 0 && !triedRows.includes(1)) return 1;
else if (row === 0 && !triedRows.includes(2)) return 2;
};
const findNode = ( const findNode = (
direction: string, direction: string,
unlockedNodes: typeof unlocked_nodes, unlockedNodes: typeof unlocked_nodes,
@ -317,6 +218,13 @@ const findNode = (
if (direction === "left") { if (direction === "left") {
newNodeColIdx--; newNodeColIdx--;
let triedRows: number[] = [];
if (newNodeColIdx < 0) {
newNodeColIdx = 0;
newNodeMatIdx = nodeMatIdx + 1 > 8 ? 1 : nodeMatIdx + 1;
}
let newNodeId = getNodeId( let newNodeId = getNodeId(
level, level,
newNodeMatIdx, newNodeMatIdx,
@ -324,40 +232,17 @@ const findNode = (
newNodeColIdx newNodeColIdx
); );
let triedRows: number[] = [];
if (newNodeColIdx < 0)
return findNodeAfterMoving(
"left",
unlockedNodes,
level,
nodeMatIdx,
nodeRowIdx
);
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)) newNodeRowIdx = 0; const newTry = tryRow(newNodeRowIdx, triedRows);
else if (newNodeRowIdx === 1 && !triedRows.includes(2)) if (newTry !== undefined) {
newNodeRowIdx = 2; newNodeRowIdx = newTry;
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 { } else {
if (newNodeColIdx === 0) { if (newNodeColIdx === 0) {
return findNodeAfterMoving( newNodeColIdx = 0;
"left", newNodeMatIdx = nodeMatIdx + 1 > 8 ? 1 : nodeMatIdx + 1;
unlockedNodes,
level,
nodeMatIdx,
nodeRowIdx
);
} else { } else {
newNodeColIdx--; newNodeColIdx--;
triedRows = []; triedRows = [];
@ -369,6 +254,13 @@ const findNode = (
} else if (direction === "right") { } else if (direction === "right") {
newNodeColIdx++; newNodeColIdx++;
let triedRows: number[] = [];
if (newNodeColIdx > 3) {
newNodeColIdx = 3;
newNodeMatIdx = nodeMatIdx - 1 < 1 ? 8 : nodeMatIdx - 1;
}
let newNodeId = getNodeId( let newNodeId = getNodeId(
level, level,
newNodeMatIdx, newNodeMatIdx,
@ -376,40 +268,17 @@ const findNode = (
newNodeColIdx newNodeColIdx
); );
let triedRows: number[] = [];
if (newNodeColIdx > 3)
return findNodeAfterMoving(
"right",
unlockedNodes,
level,
nodeMatIdx,
nodeRowIdx
);
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)) newNodeRowIdx = 0; const newTry = tryRow(newNodeRowIdx, triedRows);
else if (newNodeRowIdx === 1 && !triedRows.includes(2)) if (newTry !== undefined) {
newNodeRowIdx = 2; newNodeRowIdx = newTry;
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 { } else {
if (newNodeColIdx === 3) { if (newNodeColIdx === 3) {
return findNodeAfterMoving( newNodeColIdx = 3;
"right", newNodeMatIdx = nodeMatIdx - 1 < 1 ? 8 : nodeMatIdx - 1;
unlockedNodes,
level,
nodeMatIdx,
nodeRowIdx
);
} else { } else {
newNodeColIdx++; newNodeColIdx++;
triedRows = []; triedRows = [];
@ -430,35 +299,13 @@ const findNode = (
const nodeSelector = (context: NodeSelectorContext) => { const nodeSelector = (context: NodeSelectorContext) => {
let newNodeData; let newNodeData;
const move = context.keyPress.toLowerCase();
switch (context.keyPress) { switch (context.keyPress) {
case "LEFT": 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": case "RIGHT":
newNodeData = findNode( newNodeData = findNode(
"right", move,
context.unlockedNodes, context.unlockedNodes,
context.level, context.level,
context.nodeMatIdx, context.nodeMatIdx,
@ -468,13 +315,15 @@ const nodeSelector = (context: NodeSelectorContext) => {
if (newNodeData) { if (newNodeData) {
const didMove = context.nodeMatIdx !== newNodeData.newNodeMatIdx; const didMove = context.nodeMatIdx !== newNodeData.newNodeMatIdx;
const siteRotYModifier = move === "left" ? Math.PI / 4 : -Math.PI / 4;
return { return {
event: didMove ? "move_right" : "change_node", event: didMove ? `move_${move}` : "change_node",
newNodeMatIdx: newNodeData.newNodeMatIdx, newNodeMatIdx: newNodeData.newNodeMatIdx,
newNodeRowIdx: newNodeData.newNodeRowIdx, newNodeRowIdx: newNodeData.newNodeRowIdx,
newNodeColIdx: newNodeData.newNodeColIdx, newNodeColIdx: newNodeData.newNodeColIdx,
newSiteRotY: didMove newSiteRotY: didMove
? context.siteRotY - Math.PI / 4 ? context.siteRotY + siteRotYModifier
: context.siteRotY, : context.siteRotY,
newSitePosY: context.sitePosY, newSitePosY: context.sitePosY,
newLevel: context.level, newLevel: context.level,
@ -482,8 +331,9 @@ const nodeSelector = (context: NodeSelectorContext) => {
} }
break; break;
case "DOWN": case "DOWN":
case "UP":
newNodeData = findNodeVertical( newNodeData = findNodeVertical(
"down", move,
context.unlockedNodes, context.unlockedNodes,
context.level, context.level,
context.nodeMatIdx, context.nodeMatIdx,
@ -493,16 +343,20 @@ const nodeSelector = (context: NodeSelectorContext) => {
if (newNodeData) { if (newNodeData) {
const didMove = context.level !== newNodeData.newLevel; const didMove = context.level !== newNodeData.newLevel;
const sitePosYModifier = move === "up" ? -1.5 : 1.5;
return { return {
event: didMove ? "move_down" : "change_node", event: didMove ? `move_${move}` : "change_node",
newNodeMatIdx: context.nodeMatIdx, newNodeMatIdx: context.nodeMatIdx,
newNodeRowIdx: newNodeData.newNodeRowIdx, newNodeRowIdx: newNodeData.newNodeRowIdx,
newNodeColIdx: newNodeData.newNodeColIdx, newNodeColIdx: newNodeData.newNodeColIdx,
newSiteRotY: context.siteRotY, newSiteRotY: context.siteRotY,
newSitePosY: didMove ? context.sitePosY + 1.5 : context.sitePosY, newSitePosY: didMove
? context.sitePosY + sitePosYModifier
: context.sitePosY,
newLevel: newNodeData.newLevel, newLevel: newNodeData.newLevel,
}; };
} }
break;
} }
}; };