cleaned up node selector a bit, level selector works properly

This commit is contained in:
ad044 2020-12-14 22:28:54 +04:00
parent 6c3374de01
commit 2b911fd6c4
7 changed files with 220 additions and 283 deletions

View file

@ -7,6 +7,7 @@ const YellowTextRenderer = (props: { visible?: boolean }) => {
const disableTrail = useBigTextStore((state) => state.disableTrail); const disableTrail = useBigTextStore((state) => state.disableTrail);
const transformState = useBigTextStore((state) => state.transformState); const transformState = useBigTextStore((state) => state.transformState);
const visible = useBigTextStore((state) => state.visible);
const color = useBigTextStore((state) => state.color); const color = useBigTextStore((state) => state.color);
const textArrRef = useRef(useBigTextStore.getState().text.split("")); const textArrRef = useRef(useBigTextStore.getState().text.split(""));
@ -40,7 +41,7 @@ const YellowTextRenderer = (props: { visible?: boolean }) => {
); );
return ( return (
<group position={[0, 0, 10]} visible={props.visible}> <group position={[0, 0, 10]} visible={props.visible && visible}>
{disableTrail {disableTrail
? textArrRef.current.map((letter, idx) => ( ? textArrRef.current.map((letter, idx) => (
<a.group <a.group

View file

@ -17,7 +17,8 @@ const GreenTextManager = (props: StateManagerProps) => {
newActiveNodeId: string, newActiveNodeId: string,
newActiveHudId: string, newActiveHudId: string,
newLevel: string, newLevel: string,
delay: number delay: number,
shouldToggleAtStart: boolean
) => { ) => {
const targetGreenText = (site_a as SiteType)[newLevel][newActiveNodeId] const targetGreenText = (site_a as SiteType)[newLevel][newActiveNodeId]
.title; .title;
@ -25,7 +26,7 @@ const GreenTextManager = (props: StateManagerProps) => {
const targetGreenTextPosData = const targetGreenTextPosData =
node_huds[newActiveHudId as keyof typeof node_huds].medium_text; node_huds[newActiveHudId as keyof typeof node_huds].medium_text;
toggleActive(); if (shouldToggleAtStart) toggleActive();
setTimeout(() => { setTimeout(() => {
setTransformState( setTransformState(
@ -74,12 +75,12 @@ const GreenTextManager = (props: StateManagerProps) => {
case "site_right": case "site_right":
return { return {
action: toggleAndSetGreenText, action: toggleAndSetGreenText,
value: [newActiveNodeId, newActiveHudId, newLevel, 3903.704], value: [newActiveNodeId, newActiveHudId, newLevel, 3900, true],
}; };
case "change_node": case "change_node":
return { return {
action: toggleAndSetGreenText, action: toggleAndSetGreenText,
value: [newActiveNodeId, newActiveHudId, newLevel, 500], value: [newActiveNodeId, newActiveHudId, newLevel, 500, true],
}; };
case "throw_node_media": case "throw_node_media":
return { return {
@ -90,6 +91,12 @@ const GreenTextManager = (props: StateManagerProps) => {
return { return {
action: toggleActive, action: toggleActive,
}; };
case "select_level_up":
case "select_level_down":
return {
action: toggleAndSetGreenText,
value: [newActiveNodeId, newActiveHudId, newLevel, 3900, false],
};
} }
}, },
[initializeGreenTextForMediaScene, toggleActive, toggleAndSetGreenText] [initializeGreenTextForMediaScene, toggleActive, toggleAndSetGreenText]

View file

@ -39,17 +39,15 @@ const NodeManager = (props: StateManagerProps) => {
delay: number, delay: number,
isMoving: boolean, isMoving: boolean,
newActiveNodeId: string, newActiveNodeId: string,
newNodeColIdx: number, newNodeMatrixIndices: {
newNodeRowIdx: number, matrixIdx: number;
newNodeMatIdx: number rowIdx: number;
colIdx: number;
}
) => { ) => {
setTimeout(() => { setTimeout(() => {
setActiveNodeState(newActiveNodeId, "id"); setActiveNodeState(newActiveNodeId, "id");
setNodeMatrixIndices({ setNodeMatrixIndices(newNodeMatrixIndices);
matrixIdx: newNodeMatIdx,
rowIdx: newNodeRowIdx,
colIdx: newNodeColIdx,
});
}, delay); }, delay);
}, },
[setActiveNodeState, setNodeMatrixIndices] [setActiveNodeState, setNodeMatrixIndices]
@ -59,9 +57,11 @@ const NodeManager = (props: StateManagerProps) => {
( (
event: string, event: string,
newActiveNodeId: string, newActiveNodeId: string,
newNodeColIdx: number, newNodeMatrixIndices: {
newNodeRowIdx: number, matrixIdx: number;
newNodeMatIdx: number rowIdx: number;
colIdx: number;
}
) => { ) => {
switch (event) { switch (event) {
case "site_up": case "site_up":
@ -72,26 +72,12 @@ const NodeManager = (props: StateManagerProps) => {
case "select_level_down": case "select_level_down":
return { return {
action: updateActiveNode, action: updateActiveNode,
value: [ value: [3900, true, newActiveNodeId, newNodeMatrixIndices],
3900,
true,
newActiveNodeId,
newNodeColIdx,
newNodeRowIdx,
newNodeMatIdx,
],
}; };
case "change_node": case "change_node":
return { return {
action: updateActiveNode, action: updateActiveNode,
value: [ value: [0, false, newActiveNodeId, newNodeMatrixIndices],
0,
false,
newActiveNodeId,
newNodeColIdx,
newNodeRowIdx,
newNodeMatIdx,
],
}; };
case "throw_node_media": case "throw_node_media":
case "throw_node_gate": case "throw_node_gate":
@ -109,17 +95,12 @@ 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 newNodeMatrixIndices = props.eventState.newNodeMatrixIndices;
const newNodeRowIdx = props.eventState.newNodeRowIdx;
const newNodeColIdx = props.eventState.newNodeColIdx;
const newNodeMatIdx = props.eventState.newNodeMatIdx;
const dispatchedObject = dispatchObject( const dispatchedObject = dispatchObject(
eventAction, eventAction,
newActiveNodeId, newActiveNodeId,
newNodeColIdx, newNodeMatrixIndices
newNodeRowIdx,
newNodeMatIdx
); );
if (dispatchedObject) { if (dispatchedObject) {

View file

@ -16,6 +16,8 @@ const YellowTextManager = (props: StateManagerProps) => {
const setColor = useBigTextStore((state) => state.setColor); const setColor = useBigTextStore((state) => state.setColor);
const setVisible = useBigTextStore((state) => state.setVisible);
const animateYellowTextWithMove = useCallback( const animateYellowTextWithMove = useCallback(
( (
posXOffset: number, posXOffset: number,
@ -185,6 +187,30 @@ const YellowTextManager = (props: StateManagerProps) => {
[setColor, setText, setTransformState] [setColor, setText, setTransformState]
); );
const toggleVisibleAfterLevelSelect = useCallback(
(activeNodeId: string, activeHudId: string, level: string) => {
setVisible(false);
setTimeout(() => {
setTransformState(
node_huds[activeHudId as keyof typeof node_huds].big_text[0],
"posX"
);
setTransformState(
node_huds[activeHudId as keyof typeof node_huds].big_text[1],
"posY"
);
setColor("yellow");
setText((site_a as SiteType)[level][activeNodeId].node_name);
}, 400);
setTimeout(() => {
setVisible(true);
}, 3900);
},
[setColor, setText, setTransformState, setVisible]
);
const dispatchObject = useCallback( const dispatchObject = useCallback(
( (
event: string, event: string,
@ -252,8 +278,6 @@ const YellowTextManager = (props: StateManagerProps) => {
value: [newActiveNodeId, newActiveHudId, newLevel], value: [newActiveNodeId, newActiveHudId, newLevel],
}; };
case "level_selection_back": case "level_selection_back":
case "select_level_up":
case "select_level_down":
return { return {
action: levelSelectionBack, action: levelSelectionBack,
value: [newActiveNodeId, newActiveHudId, newLevel], value: [newActiveNodeId, newActiveHudId, newLevel],
@ -262,6 +286,12 @@ const YellowTextManager = (props: StateManagerProps) => {
return { return {
action: initializeLevelSelection, action: initializeLevelSelection,
}; };
case "select_level_up":
case "select_level_down":
return {
action: toggleVisibleAfterLevelSelect,
value: [newActiveNodeId, newActiveHudId, newLevel],
};
} }
}, },
[ [
@ -272,6 +302,7 @@ const YellowTextManager = (props: StateManagerProps) => {
initializeYellowTextForMainScene, initializeYellowTextForMainScene,
initializeYellowTextForMediaScene, initializeYellowTextForMediaScene,
levelSelectionBack, levelSelectionBack,
toggleVisibleAfterLevelSelect,
] ]
); );

View file

@ -1,21 +1,6 @@
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 nodeSelector from "./nodeSelector"; import nodeSelector, { getNodeHudId, getNodeId } from "./nodeSelector";
const hudAssocs = {
"00": "fg_hud_1",
"10": "fg_hud_2",
"20": "fg_hud_3",
"01": "bg_hud_1",
"11": "bg_hud_2",
"21": "bg_hud_3",
"02": "bg_hud_4",
"12": "bg_hud_5",
"22": "bg_hud_6",
"03": "fg_hud_4",
"13": "fg_hud_5",
"23": "fg_hud_6",
};
const handleMainSceneEvent = (gameContext: any) => { const handleMainSceneEvent = (gameContext: any) => {
let event; let event;
@ -27,17 +12,14 @@ const handleMainSceneEvent = (gameContext: any) => {
const activePauseComponent = gameContext.activePauseComponent; const activePauseComponent = gameContext.activePauseComponent;
const unlockedNodes = gameContext.unlockedNodes; const unlockedNodes = gameContext.unlockedNodes;
const nodeColIdx = gameContext.nodeMatrixIndices.colIdx; let nodeMatrixIndices = gameContext.nodeMatrixIndices;
const nodeRowIdx = gameContext.nodeMatrixIndices.rowIdx;
const nodeMatIdx = gameContext.nodeMatrixIndices.matrixIdx;
const level = parseInt(gameContext.activeLevel); const level = parseInt(gameContext.activeLevel);
const siteRotY = gameContext.siteTransformState.rotY; const siteRotY = gameContext.siteTransformState.rotY;
const sitePosY = gameContext.siteTransformState.posY; const sitePosY = gameContext.siteTransformState.posY;
let newActiveNodeId; let newActiveNodeId;
let newNodeMatIdx = gameContext.nodeMatrixIndices.matrixIdx; let newActiveHudId;
let newNodeColIdx = gameContext.nodeMatrixIndices.colIdx;
let newNodeRowIdx = gameContext.nodeMatrixIndices.rowIdx;
let newLevel = parseInt(gameContext.activeLevel); let newLevel = parseInt(gameContext.activeLevel);
let newSiteRotY = gameContext.siteTransformState.rotY; let newSiteRotY = gameContext.siteTransformState.rotY;
let newSitePosY = gameContext.siteTransformState.posY; let newSitePosY = gameContext.siteTransformState.posY;
@ -52,9 +34,7 @@ const handleMainSceneEvent = (gameContext: any) => {
case "UP": case "UP":
selectedNodeData = nodeSelector({ selectedNodeData = nodeSelector({
action: `site_${keyPress.toLowerCase()}`, action: `site_${keyPress.toLowerCase()}`,
nodeMatIdx: nodeMatIdx, nodeMatrixIndices: nodeMatrixIndices,
nodeColIdx: nodeColIdx,
nodeRowIdx: nodeRowIdx,
level: level, level: level,
siteRotY: siteRotY, siteRotY: siteRotY,
sitePosY: sitePosY, sitePosY: sitePosY,
@ -64,12 +44,11 @@ const handleMainSceneEvent = (gameContext: any) => {
if (selectedNodeData) { if (selectedNodeData) {
event = selectedNodeData.event; event = selectedNodeData.event;
newActiveNodeId = selectedNodeData.newActiveNodeId; newActiveNodeId = selectedNodeData.newActiveNodeId;
newNodeMatIdx = selectedNodeData.newNodeMatIdx; nodeMatrixIndices = selectedNodeData.newNodeMatrixIndices;
newNodeColIdx = selectedNodeData.newNodeColIdx;
newNodeRowIdx = selectedNodeData.newNodeRowIdx;
newSiteRotY = selectedNodeData.newSiteRotY; newSiteRotY = selectedNodeData.newSiteRotY;
newSitePosY = selectedNodeData.newSitePosY; newSitePosY = selectedNodeData.newSitePosY;
newLevel = selectedNodeData.newLevel; newLevel = selectedNodeData.newLevel;
newActiveHudId = selectedNodeData.newActiveHudId;
} }
break; break;
@ -77,11 +56,7 @@ const handleMainSceneEvent = (gameContext: any) => {
// 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
// new active blue orb here. // new active blue orb here.
newActiveNodeId = newActiveNodeId = getNodeId(gameContext.activeLevel, nodeMatrixIndices);
gameContext.activeLevel +
node_matrices[newNodeMatIdx.toString() as keyof typeof node_matrices][
newNodeRowIdx as number
][newNodeColIdx as number];
const nodeType = (site_a as any)[newLevel][newActiveNodeId].type; const nodeType = (site_a as any)[newLevel][newActiveNodeId].type;
@ -109,14 +84,9 @@ const handleMainSceneEvent = (gameContext: any) => {
return { event: "toggle_pause" }; return { event: "toggle_pause" };
} }
const newActiveHudId =
hudAssocs[`${newNodeRowIdx}${newNodeColIdx}` as keyof typeof hudAssocs];
return { return {
event: event, event: event,
newNodeColIdx: newNodeColIdx, newNodeMatrixIndices: nodeMatrixIndices,
newNodeRowIdx: newNodeRowIdx,
newNodeMatIdx: newNodeMatIdx,
newSitePosY: newSitePosY, newSitePosY: newSitePosY,
newSiteRotY: newSiteRotY, newSiteRotY: newSiteRotY,
newLevel: newLevel.toString().padStart(2, "0"), newLevel: newLevel.toString().padStart(2, "0"),
@ -143,23 +113,14 @@ const handleMainSceneEvent = (gameContext: any) => {
case "X": case "X":
return { return {
event: "level_selection_back", event: "level_selection_back",
newActiveNodeId: newActiveNodeId: getNodeId(gameContext.level, nodeMatrixIndices),
newLevel + newActiveHudId: getNodeHudId(nodeMatrixIndices),
node_matrices[
newNodeMatIdx.toString() as keyof typeof node_matrices
][newNodeRowIdx as number][newNodeColIdx as number],
newActiveHudId:
hudAssocs[
`${newNodeRowIdx}${newNodeColIdx}` as keyof typeof hudAssocs
],
newLevel: newLevel, newLevel: newLevel,
}; };
case "CIRCLE": case "CIRCLE":
const selectedNodeData = nodeSelector({ const selectedNodeData = nodeSelector({
action: "select_level", action: "select_level",
nodeMatIdx: nodeMatIdx, nodeMatrixIndices: nodeMatrixIndices,
nodeColIdx: nodeColIdx,
nodeRowIdx: nodeRowIdx,
level: selectedLevel, level: selectedLevel,
siteRotY: siteRotY, siteRotY: siteRotY,
sitePosY: sitePosY, sitePosY: sitePosY,
@ -167,55 +128,18 @@ const handleMainSceneEvent = (gameContext: any) => {
}); });
if (level === selectedLevel) break; if (level === selectedLevel) break;
else if (selectedLevel < level && selectedNodeData) { if (selectedNodeData) {
const event =
selectedLevel < level ? "select_level_down" : "select_level_up";
return { return {
event: "select_level_down", event: event,
newLevel: selectedLevel.toString().padStart(0, "2"), newLevel: selectedLevel.toString().padStart(2, "0"),
newSitePosY: -selectedNodeData.newSitePosY,
newActiveNodeId: selectedNodeData.newActiveNodeId, newActiveNodeId: selectedNodeData.newActiveNodeId,
newNodeMatIdx: selectedNodeData.newNodeMatIdx, newActiveHudId: selectedNodeData.newActiveHudId,
newNodeColIdx: selectedNodeData.newNodeColIdx, newNodeMatrixIndices: selectedNodeData.newNodeMatrixIndices,
newNodeRowIdx: selectedNodeData.newNodeRowIdx,
newActiveHudId:
hudAssocs[
`${selectedNodeData.newNodeRowIdx}${selectedNodeData.newNodeColIdx}` as keyof typeof hudAssocs
],
};
} else if (selectedLevel > level && selectedNodeData) {
return {
event: "select_level_up",
newLevel: selectedLevel.toString().padStart(0, "2"),
newSitePosY: -selectedNodeData.newSitePosY, newSitePosY: -selectedNodeData.newSitePosY,
newActiveNodeId: selectedNodeData.newActiveNodeId,
newNodeMatIdx: selectedNodeData.newNodeMatIdx,
newNodeColIdx: selectedNodeData.newNodeColIdx,
newNodeRowIdx: selectedNodeData.newNodeRowIdx,
newActiveHudId:
hudAssocs[
`${selectedNodeData.newNodeRowIdx}${selectedNodeData.newNodeColIdx}` as keyof typeof hudAssocs
],
}; };
} }
// if (oldLevel === newLevel) break;
// else if (newLevel < oldLevel) {
// return {
// event: "select_level_down",
// newLevel: newLevel,
// newSitePosY:
// level_y_values[newLevel as keyof typeof level_y_values],
// };
// } else {
// return {
// event: "select_level_up",
// newLevel: newLevel,
// newSitePosY: -level_y_values[
// newLevel as keyof typeof level_y_values
// ],
// newActiveNodeId: "2022",
// newActiveHudId: "fg_hud_1",
// };
// }
} }
} else if (subscene === "pause") { } else if (subscene === "pause") {
switch (keyPress) { switch (keyPress) {

View file

@ -6,25 +6,52 @@ import level_y_values from "../resources/level_y_values.json";
type NodeSelectorContext = { type NodeSelectorContext = {
action: string; action: string;
nodeMatIdx: number; nodeMatrixIndices: { matrixIdx: number; rowIdx: number; colIdx: number };
nodeColIdx: number;
nodeRowIdx: number;
level: number; level: number;
siteRotY: number; siteRotY: number;
sitePosY: number; sitePosY: number;
unlockedNodes: typeof unlocked_nodes; unlockedNodes: typeof unlocked_nodes;
}; };
const getNodeId = ( const hudAssocs = {
"00": "fg_hud_1",
"10": "fg_hud_2",
"20": "fg_hud_3",
"01": "bg_hud_1",
"11": "bg_hud_2",
"21": "bg_hud_3",
"02": "bg_hud_4",
"12": "bg_hud_5",
"22": "bg_hud_6",
"03": "fg_hud_4",
"13": "fg_hud_5",
"23": "fg_hud_6",
};
export const getNodeId = (
level: number, level: number,
nodeMatIdx: number, nodeMatrixIndices: {
nodeRowIdx: number, matrixIdx: number;
nodeColIdx: number rowIdx: number;
) => colIdx: number;
}
) => {
return (
level.toString().padStart(2, "0") + level.toString().padStart(2, "0") +
node_matrices[nodeMatIdx.toString() as keyof typeof node_matrices][ node_matrices[
nodeRowIdx nodeMatrixIndices.matrixIdx.toString() as keyof typeof node_matrices
][nodeColIdx]; ][nodeMatrixIndices.rowIdx][nodeMatrixIndices.colIdx]
);
};
export const getNodeHudId = (nodeMatrixIndices: {
matrixIdx: number;
rowIdx: number;
colIdx: number;
}) =>
hudAssocs[
`${nodeMatrixIndices.rowIdx}${nodeMatrixIndices.colIdx}` as keyof typeof hudAssocs
];
const isNodeVisible = ( const isNodeVisible = (
nodeId: string, nodeId: string,
@ -63,51 +90,39 @@ const tryRow = (row: number, triedRows: number[]) => {
const findNodeAfterLevelSelection = ( const findNodeAfterLevelSelection = (
unlockedNodes: typeof unlocked_nodes, unlockedNodes: typeof unlocked_nodes,
targetLevel: number, targetLevel: number,
nodeMatIdx: number, nodeMatrixIndices: { matrixIdx: number; rowIdx: number; colIdx: number }
nodeRowIdx: number,
nodeColIdx: number
) => { ) => {
let newNodeRowIdx = nodeRowIdx; let newMatIndices = nodeMatrixIndices;
let newNodeMatIdx = nodeMatIdx;
let newNodeColIdx = nodeColIdx;
let triedCols: number[] = []; let triedCols: number[] = [];
let newNodeId = getNodeId( let newNodeId = getNodeId(targetLevel, newMatIndices);
targetLevel,
newNodeMatIdx,
newNodeRowIdx,
newNodeColIdx
);
while (!isNodeVisible(newNodeId, unlockedNodes)) { while (!isNodeVisible(newNodeId, unlockedNodes)) {
if (triedCols.length < 4) { if (triedCols.length < 4) {
triedCols.push(newNodeColIdx); triedCols.push(newMatIndices.colIdx);
const colToTry = tryCol(newNodeColIdx, triedCols); const colToTry = tryCol(newMatIndices.colIdx, triedCols);
if (colToTry !== undefined) { if (colToTry !== undefined) {
newNodeColIdx = colToTry; newMatIndices.colIdx = colToTry;
} }
} else { } else {
newNodeRowIdx++; newMatIndices.rowIdx++;
triedCols = []; triedCols = [];
newNodeColIdx = 0; newMatIndices.colIdx = 0;
} }
newNodeId = getNodeId( newNodeId = getNodeId(targetLevel, newMatIndices);
targetLevel,
newNodeMatIdx,
newNodeRowIdx,
newNodeColIdx
);
} }
const newNodeHudId = getNodeHudId(newMatIndices);
return { return {
newLevel: targetLevel, newLevel: targetLevel,
newNodeId: newNodeId, newNodeId: newNodeId,
newNodeRowIdx: newNodeRowIdx, newNodeHudId: newNodeHudId,
newNodeColIdx: newNodeColIdx, newNodeMatrixIndices: newMatIndices,
newSitePosY: newSitePosY:
level_y_values[ level_y_values[
targetLevel.toString().padStart(0, "2") as keyof typeof level_y_values targetLevel.toString().padStart(2, "0") as keyof typeof level_y_values
], ],
}; };
}; };
@ -116,104 +131,81 @@ const findNodeVertical = (
direction: string, direction: string,
unlockedNodes: typeof unlocked_nodes, unlockedNodes: typeof unlocked_nodes,
level: number, level: number,
nodeMatIdx: number, nodeMatrixIndices: { matrixIdx: number; rowIdx: number; colIdx: number }
nodeRowIdx: number,
nodeColIdx: number
) => { ) => {
let newNodeId; let newNodeId;
let newLevel = level; let newLevel = level;
let newNodeRowIdx = nodeRowIdx; let newMatIndices = nodeMatrixIndices;
let newNodeMatIdx = nodeMatIdx;
let newNodeColIdx = nodeColIdx;
if (direction === "down") { if (direction === "down") {
newNodeRowIdx++; newMatIndices.rowIdx++;
let triedCols: number[] = []; let triedCols: number[] = [];
if (newNodeRowIdx > 2) { if (newMatIndices.rowIdx > 2) {
newNodeRowIdx = 0; newMatIndices.rowIdx = 0;
newLevel = level - 1; newLevel = level - 1;
} }
newNodeId = getNodeId( newNodeId = getNodeId(newLevel, newMatIndices);
newLevel,
newNodeMatIdx,
newNodeRowIdx,
newNodeColIdx
);
while (!isNodeVisible(newNodeId, unlockedNodes)) { while (!isNodeVisible(newNodeId, unlockedNodes)) {
if (triedCols.length < 4) { if (triedCols.length < 4) {
triedCols.push(newNodeColIdx); triedCols.push(newMatIndices.colIdx);
const colToTry = tryCol(newNodeColIdx, triedCols); const colToTry = tryCol(newMatIndices.colIdx, triedCols);
if (colToTry !== undefined) { if (colToTry !== undefined) {
newNodeColIdx = colToTry; newMatIndices.colIdx = colToTry;
} }
} else { } else {
if (newNodeRowIdx === 2) { if (newMatIndices.rowIdx === 2) {
newNodeRowIdx = 0; newMatIndices.rowIdx = 0;
newLevel = level - 1; newLevel = level - 1;
} else { } else {
newNodeRowIdx++; newMatIndices.rowIdx++;
newMatIndices.colIdx = 0;
triedCols = []; triedCols = [];
newNodeColIdx = 0;
} }
} }
newNodeId = getNodeId( newNodeId = getNodeId(newLevel, newMatIndices);
newLevel,
newNodeMatIdx,
newNodeRowIdx,
newNodeColIdx
);
} }
} else if (direction === "up") { } else if (direction === "up") {
newNodeRowIdx--; newMatIndices.rowIdx--;
let triedCols: number[] = []; let triedCols: number[] = [];
if (newNodeRowIdx < 0) { if (newMatIndices.rowIdx < 0) {
newNodeRowIdx = 2; newMatIndices.rowIdx = 2;
newLevel = level + 1; newLevel = level + 1;
} }
newNodeId = getNodeId( newNodeId = getNodeId(newLevel, newMatIndices);
newLevel,
newNodeMatIdx,
newNodeRowIdx,
newNodeColIdx
);
while (!isNodeVisible(newNodeId, unlockedNodes)) { while (!isNodeVisible(newNodeId, unlockedNodes)) {
if (triedCols.length < 4) { if (triedCols.length < 4) {
triedCols.push(newNodeColIdx); triedCols.push(newMatIndices.colIdx);
const colToTry = tryCol(newNodeColIdx, triedCols); const colToTry = tryCol(newMatIndices.colIdx, triedCols);
if (colToTry !== undefined) { if (colToTry !== undefined) {
newNodeColIdx = colToTry; newMatIndices.colIdx = colToTry;
} }
} else { } else {
if (newNodeRowIdx === 0) { if (newMatIndices.rowIdx === 0) {
newNodeRowIdx = 2; newMatIndices.rowIdx = 2;
newLevel = level + 1; newLevel = level + 1;
} else { } else {
newNodeRowIdx--; newMatIndices.rowIdx--;
newMatIndices.colIdx = 0;
triedCols = []; triedCols = [];
newNodeColIdx = 0;
} }
} }
newNodeId = getNodeId( newNodeId = getNodeId(newLevel, newMatIndices);
newLevel,
newNodeMatIdx,
newNodeRowIdx,
newNodeColIdx
);
} }
} }
return { return {
newNodeId: newNodeId, newNodeId: newNodeId,
newNodeHudId: getNodeHudId(newMatIndices),
newLevel: newLevel, newLevel: newLevel,
newNodeRowIdx: newNodeRowIdx, newNodeMatrixIndices: newMatIndices,
newNodeColIdx: newNodeColIdx,
}; };
}; };
@ -221,89 +213,92 @@ const findNodeHorizontal = (
direction: string, direction: string,
unlockedNodes: typeof unlocked_nodes, unlockedNodes: typeof unlocked_nodes,
level: number, level: number,
nodeMatIdx: number, nodeMatrixIndices: { matrixIdx: number; rowIdx: number; colIdx: number }
nodeRowIdx: number,
nodeColIdx: number
) => { ) => {
let newNodeId; let newNodeId;
let newNodeRowIdx = nodeRowIdx; let newMatIndices = nodeMatrixIndices;
let newNodeMatIdx = nodeMatIdx;
let newNodeColIdx = nodeColIdx;
if (direction === "left") { if (direction === "left") {
let didMove = false; let didMove = false;
newNodeColIdx--; newMatIndices.colIdx--;
let triedRows: number[] = []; let triedRows: number[] = [];
if (newNodeColIdx < 0) { if (newMatIndices.colIdx < 0) {
newNodeColIdx = 0; didMove = true;
newNodeMatIdx = nodeMatIdx + 1 > 8 ? 1 : nodeMatIdx + 1; newMatIndices.colIdx = 0;
newMatIndices.matrixIdx =
newMatIndices.matrixIdx + 1 > 8 ? 1 : newMatIndices.matrixIdx + 1;
} }
newNodeId = getNodeId(level, newNodeMatIdx, newNodeRowIdx, newNodeColIdx); newNodeId = getNodeId(level, newMatIndices);
while (!isNodeVisible(newNodeId, unlockedNodes)) { while (!isNodeVisible(newNodeId, unlockedNodes)) {
if (triedRows.length < 3) { if (triedRows.length < 3) {
triedRows.push(newNodeRowIdx); triedRows.push(newMatIndices.rowIdx);
const rowToTry = tryRow(newNodeRowIdx, triedRows); const rowToTry = tryRow(newMatIndices.rowIdx, triedRows);
if (rowToTry !== undefined) { if (rowToTry !== undefined) {
newNodeRowIdx = rowToTry; newMatIndices.rowIdx = rowToTry;
} }
} else { } else {
if (newNodeColIdx < 0) { if (newMatIndices.colIdx < 0) {
didMove = true; didMove = true;
newNodeColIdx = 0; newMatIndices.colIdx = 0;
newNodeMatIdx = nodeMatIdx + 1 > 8 ? 1 : nodeMatIdx + 1; newMatIndices.matrixIdx =
newMatIndices.matrixIdx + 1 > 8 ? 1 : newMatIndices.matrixIdx + 1;
} else { } else {
didMove ? newNodeColIdx++ : newNodeColIdx--; didMove ? newMatIndices.colIdx++ : newMatIndices.colIdx--;
triedRows = []; triedRows = [];
newNodeRowIdx = 0; newMatIndices.rowIdx = 0;
} }
} }
newNodeId = getNodeId(level, newNodeMatIdx, newNodeRowIdx, newNodeColIdx); newNodeId = getNodeId(level, newMatIndices);
} }
} else if (direction === "right") { } else if (direction === "right") {
let didMove = false; let didMove = false;
newNodeColIdx++; newMatIndices.colIdx++;
let triedRows: number[] = []; let triedRows: number[] = [];
if (newNodeColIdx > 3) { if (newMatIndices.colIdx > 3) {
newNodeColIdx = 3; newMatIndices.colIdx = 3;
newNodeMatIdx = nodeMatIdx - 1 < 1 ? 8 : nodeMatIdx - 1; newMatIndices.matrixIdx =
newMatIndices.matrixIdx - 1 < 1 ? 8 : newMatIndices.matrixIdx - 1;
} }
newNodeId = getNodeId(level, newNodeMatIdx, newNodeRowIdx, newNodeColIdx); newNodeId = getNodeId(level, newMatIndices);
while (!isNodeVisible(newNodeId, unlockedNodes)) { while (!isNodeVisible(newNodeId, unlockedNodes)) {
if (triedRows.length < 3) { if (triedRows.length < 3) {
triedRows.push(newNodeRowIdx); triedRows.push(newMatIndices.rowIdx);
const rowToTry = tryRow(newNodeRowIdx, triedRows); const rowToTry = tryRow(newMatIndices.rowIdx, triedRows);
if (rowToTry !== undefined) { if (rowToTry !== undefined) {
newNodeRowIdx = rowToTry; newMatIndices.rowIdx = rowToTry;
} }
} else { } else {
if (newNodeColIdx > 3) { if (newMatIndices.colIdx > 3) {
didMove = true; didMove = true;
newNodeColIdx = 3; newMatIndices.colIdx = 3;
newNodeMatIdx = nodeMatIdx - 1 < 1 ? 8 : nodeMatIdx - 1; newMatIndices.matrixIdx =
newMatIndices.matrixIdx - 1 < 1 ? 8 : newMatIndices.matrixIdx - 1;
} else { } else {
didMove ? newNodeColIdx-- : newNodeColIdx++; didMove ? newMatIndices.colIdx-- : newMatIndices.colIdx++;
triedRows = []; triedRows = [];
newNodeRowIdx = 0; newMatIndices.rowIdx = 0;
} }
} }
newNodeId = getNodeId(level, newNodeMatIdx, newNodeRowIdx, newNodeColIdx); newNodeId = getNodeId(level, newMatIndices);
} }
} }
const newNodeHudId = getNodeHudId(newMatIndices);
return { return {
newNodeId: newNodeId, newNodeId: newNodeId,
newNodeMatIdx: newNodeMatIdx, newNodeHudId: newNodeHudId,
newNodeRowIdx: newNodeRowIdx, newNodeMatrixIndices: newMatIndices,
newNodeColIdx: newNodeColIdx,
}; };
}; };
@ -319,21 +314,21 @@ const nodeSelector = (context: NodeSelectorContext) => {
move, move,
context.unlockedNodes, context.unlockedNodes,
context.level, context.level,
context.nodeMatIdx, Object.assign({}, context.nodeMatrixIndices)
context.nodeRowIdx,
context.nodeColIdx
); );
if (newNodeData) { if (newNodeData) {
const didMove = context.nodeMatIdx !== newNodeData.newNodeMatIdx; const didMove =
context.nodeMatrixIndices.matrixIdx !==
newNodeData.newNodeMatrixIndices.matrixIdx;
const siteRotYModifier = move === "left" ? Math.PI / 4 : -Math.PI / 4; const siteRotYModifier = move === "left" ? Math.PI / 4 : -Math.PI / 4;
return { return {
event: didMove ? context.action : "change_node", event: didMove ? context.action : "change_node",
newActiveNodeId: newNodeData.newNodeId, newActiveNodeId: newNodeData.newNodeId,
newNodeMatIdx: newNodeData.newNodeMatIdx, newActiveHudId: newNodeData.newNodeHudId,
newNodeRowIdx: newNodeData.newNodeRowIdx, newNodeMatrixIndices: newNodeData.newNodeMatrixIndices,
newNodeColIdx: newNodeData.newNodeColIdx,
newSiteRotY: didMove newSiteRotY: didMove
? context.siteRotY + siteRotYModifier ? context.siteRotY + siteRotYModifier
: context.siteRotY, : context.siteRotY,
@ -350,9 +345,7 @@ const nodeSelector = (context: NodeSelectorContext) => {
move, move,
context.unlockedNodes, context.unlockedNodes,
context.level, context.level,
context.nodeMatIdx, context.nodeMatrixIndices
context.nodeRowIdx,
context.nodeColIdx
); );
if (newNodeData) { if (newNodeData) {
@ -361,9 +354,8 @@ const nodeSelector = (context: NodeSelectorContext) => {
return { return {
event: didMove ? context.action : "change_node", event: didMove ? context.action : "change_node",
newActiveNodeId: newNodeData.newNodeId, newActiveNodeId: newNodeData.newNodeId,
newNodeMatIdx: context.nodeMatIdx, newNodeMatrixIndices: newNodeData.newNodeMatrixIndices,
newNodeRowIdx: newNodeData.newNodeRowIdx, newActiveHudId: newNodeData.newNodeHudId,
newNodeColIdx: newNodeData.newNodeColIdx,
newSiteRotY: context.siteRotY, newSiteRotY: context.siteRotY,
newSitePosY: didMove newSitePosY: didMove
? context.sitePosY + sitePosYModifier ? context.sitePosY + sitePosYModifier
@ -376,19 +368,17 @@ const nodeSelector = (context: NodeSelectorContext) => {
newNodeData = findNodeAfterLevelSelection( newNodeData = findNodeAfterLevelSelection(
context.unlockedNodes, context.unlockedNodes,
context.level, context.level,
context.nodeMatIdx, context.nodeMatrixIndices
context.nodeRowIdx,
context.nodeColIdx
); );
if (newNodeData) { if (newNodeData) {
return { return {
newActiveNodeId: newNodeData.newNodeId, newActiveNodeId: newNodeData.newNodeId,
newNodeMatIdx: context.nodeMatIdx, newNodeMatrixIndices: newNodeData.newNodeMatrixIndices,
newNodeRowIdx: newNodeData.newNodeRowIdx, newActiveHudId: newNodeData.newNodeHudId,
newNodeColIdx: newNodeData.newNodeColIdx, newSiteRotY: context.siteRotY,
newSitePosY: newNodeData.newSitePosY,
newLevel: newNodeData.newLevel, newLevel: newNodeData.newLevel,
newSitePosY: newNodeData.newSitePosY,
}; };
} }
} }

View file

@ -91,6 +91,7 @@ type MediaWordState = {
}; };
export type BigTextState = { export type BigTextState = {
visible: boolean;
disableTrail: boolean; disableTrail: boolean;
text: string; text: string;
color: string; color: string;
@ -162,6 +163,7 @@ type MainSceneState = {
export const useBigTextStore = create( export const useBigTextStore = create(
combine( combine(
{ {
visible: true,
color: "yellow", color: "yellow",
disableTrail: false, disableTrail: false,
text: "Play", text: "Play",
@ -188,6 +190,7 @@ export const useBigTextStore = create(
}, },
})), })),
setColor: (to: string) => set(() => ({ color: to })), setColor: (to: string) => set(() => ({ color: to })),
setVisible: (to: boolean) => set(() => ({ visible: to })),
}) })
) )
); );