refactoring the store

This commit is contained in:
ad044 2021-01-20 21:43:58 +04:00
parent e3764925fa
commit 81593d4266
10 changed files with 307 additions and 332 deletions

View file

@ -67,7 +67,6 @@ const HUD = () => {
] ]
); );
console.log('called')
const longHudTex = useLoader(THREE.TextureLoader, longHud); const longHudTex = useLoader(THREE.TextureLoader, longHud);
const longHudMirroredTex = useLoader(THREE.TextureLoader, longHudMirrored); const longHudMirroredTex = useLoader(THREE.TextureLoader, longHudMirrored);

View file

@ -1,6 +1,5 @@
import orangeFont from "../../static/sprite/orange_font_texture.png"; import orangeFont from "../../static/sprite/orange_font_texture.png";
import yellowFont from "../../static/sprite/yellow_font_texture.png"; import yellowFont from "../../static/sprite/yellow_font_texture.png";
import whiteFont from "../../static/sprite/white_and_green_texture.png";
import * as THREE from "three"; import * as THREE from "three";
import { useLoader } from "react-three-fiber"; import { useLoader } from "react-three-fiber";
import orange_font_json from "../../resources/font_data/big_font.json"; import orange_font_json from "../../resources/font_data/big_font.json";
@ -12,62 +11,55 @@ const BigLetter = memo(
color: string; color: string;
letter: string; letter: string;
letterIdx: number; letterIdx: number;
xOffsetCoeff: number; xOffset: number;
}) => { }) => {
const colorToTexture = (color: string) => { const tex = useMemo(
const colorTexture = { () =>
orange: orangeFont, props.color === "orange" || props.letterIdx === 0
yellow: yellowFont, ? orangeFont
white: whiteFont, : yellowFont,
}; [props.color, props.letterIdx]
return colorTexture[color as keyof typeof colorTexture]; );
};
// first letter in big font is always orange in this case so make it orange if so. else, const colorTexture: THREE.Texture = useLoader(THREE.TextureLoader, tex);
// run through the function.
const color =
props.letterIdx === 0 ? orangeFont : colorToTexture(props.color);
const colorTexture: THREE.Texture = useLoader(THREE.TextureLoader, color); const lineYOffset = useMemo(() => {
// i have yet to figure out a genrealizable way of
// calculating the y offset, this shit will do for now
// also, we dont have all the lines since i dont need them yet.
// also, baseline offsets dont work properly since i dont need them yet either
// should be trivial to calculate though, im just lazy
const getLineNum = (letter: string) => {
const lineOne = "ABCDEFGHIJKLMNOPQ"; const lineOne = "ABCDEFGHIJKLMNOPQ";
const lineTwo = "RSTUVWXYZ01234567"; const lineTwo = "RSTUVWXYZ01234567";
const lineThree = "89abcdefghijklmnopqrs"; const lineThree = "89abcdefghijklmnopqrs";
if (letter === " ") return 5; let lineNum: number;
if (props.letter === " ") {
if (lineOne.includes(letter)) { lineNum = 5;
return 1;
} else if (lineTwo.includes(letter)) {
return 2;
} else if (lineThree.includes(letter)) {
return 3;
} else { } else {
return 4; if (lineOne.includes(props.letter)) {
lineNum = 1;
} else if (lineTwo.includes(props.letter)) {
lineNum = 2;
} else if (lineThree.includes(props.letter)) {
lineNum = 3;
} else {
lineNum = 4;
}
} }
};
const lineYOffsets = useMemo( const offsets = {
() => ({
1: 0.884, 1: 0.884,
2: 0.765, 2: 0.765,
3: 0.648, 3: 0.648,
4: 0.47, 4: 0.47,
5: 1, 5: 1,
}), };
[] return offsets[lineNum as keyof typeof offsets];
); }, [props.letter]);
const letterData = const letterData = useMemo(
() =>
orange_font_json.glyphs[ orange_font_json.glyphs[
props.letter as keyof typeof orange_font_json.glyphs props.letter as keyof typeof orange_font_json.glyphs
]; ],
[props.letter]
);
const geom = useMemo(() => { const geom = useMemo(() => {
const geometry = new THREE.PlaneBufferGeometry(); const geometry = new THREE.PlaneBufferGeometry();
@ -80,25 +72,21 @@ const BigLetter = memo(
u = (u * letterData[2]) / 256 + letterData[0] / 256; u = (u * letterData[2]) / 256 + letterData[0] / 256;
v = v = (v * letterData[3]) / 136 + lineYOffset - letterData[4] / 136;
(v * letterData[3]) / 136 +
lineYOffsets[getLineNum(props.letter)] -
letterData[4] / 136;
uvAttribute.setXY(i, u, v); uvAttribute.setXY(i, u, v);
} }
return geometry; return geometry;
}, [letterData, lineYOffsets, props.letter]); }, [letterData, lineYOffset]);
const textRendererState = useSpring({ const letterState = useSpring({
letterOffsetXCoeff: xOffset: props.letterIdx + 0.3 + (props.letterIdx + 0.3) * props.xOffset,
props.letterIdx + 0.3 + (props.letterIdx + 0.3) * props.xOffsetCoeff,
config: { duration: 200 }, config: { duration: 200 },
}); });
return ( return (
<a.mesh <a.mesh
position-x={textRendererState.letterOffsetXCoeff} position-x={letterState.xOffset}
position-y={-letterData[4] / 12.5} position-y={-letterData[4] / 12.5}
scale={[1, 1, 0]} scale={[1, 1, 0]}
geometry={geom} geometry={geom}

View file

@ -25,7 +25,7 @@ const MediaYellowTextAnimator = () => {
> >
<BigLetter <BigLetter
color={"yellow"} color={"yellow"}
xOffsetCoeff={transformState.xOffset} xOffset={transformState.xOffset}
letter={textArr[idx]} letter={textArr[idx]}
letterIdx={idx} letterIdx={idx}
key={idx} key={idx}

View file

@ -7,45 +7,44 @@ import React, { useMemo, memo } from "react";
const MediumLetter = memo((props: { letter: string; letterIdx: number }) => { const MediumLetter = memo((props: { letter: string; letterIdx: number }) => {
const colorTexture = useLoader(THREE.TextureLoader, greenFont); const colorTexture = useLoader(THREE.TextureLoader, greenFont);
// i have yet to figure out a genrealizable way of
// calculating the y offset, this shit will do for now const lineYOffset = useMemo(() => {
// also, we dont have all the lines since i dont need them yet.
// also, baseline offsets dont work properly since i dont need them yet either
// should be trivial to calculate though, im just lazy
const getLineNum = (letter: string) => {
const lineOne = "ABCDEFGHIJKLMNOPQQRSTUVW"; const lineOne = "ABCDEFGHIJKLMNOPQQRSTUVW";
const lineTwo = "XYZ0123456789abcdefghij"; const lineTwo = "XYZ0123456789abcdefghij";
const lineThree = "klmnopqrstuvwxyz,.*"; const lineThree = "klmnopqrstuvwxyz,.*";
if (letter === " ") return 5; let lineNum: number;
if (props.letter === " ") {
if (lineOne.includes(letter)) { lineNum = 5;
return 1;
} else if (lineTwo.includes(letter)) {
return 2;
} else if (lineThree.includes(letter)) {
return 3;
} else { } else {
return 4; if (lineOne.includes(props.letter)) {
lineNum = 1;
} else if (lineTwo.includes(props.letter)) {
lineNum = 2;
} else if (lineThree.includes(props.letter)) {
lineNum = 3;
} else {
lineNum = 4;
}
} }
};
// 5th one is just a space, this is my hacky way of doing it. const offsets = {
const lineYOffsets = useMemo(
() => ({
1: 0.355, 1: 0.355,
2: 0.297, 2: 0.297,
3: 0.238, 3: 0.238,
4: 0.18, 4: 0.18,
5: 1, 5: 1,
}), };
[] return offsets[lineNum as keyof typeof offsets];
); }, [props.letter]);
const letterData = const letterData = useMemo(
() =>
medium_font_json.glyphs[ medium_font_json.glyphs[
props.letter as keyof typeof medium_font_json.glyphs props.letter as keyof typeof medium_font_json.glyphs
]; ],
[props.letter]
);
const geom = useMemo(() => { const geom = useMemo(() => {
const geometry = new THREE.PlaneBufferGeometry(); const geometry = new THREE.PlaneBufferGeometry();
@ -58,16 +57,13 @@ const MediumLetter = memo((props: { letter: string; letterIdx: number }) => {
u = (u * letterData[2]) / 256 + letterData[0] / 256; u = (u * letterData[2]) / 256 + letterData[0] / 256;
v = v = (v * letterData[3]) / 136 + lineYOffset - letterData[4] / 136;
(v * letterData[3]) / 136 +
lineYOffsets[getLineNum(props.letter)] -
letterData[4] / 136;
uvAttribute.setXY(i, u, v); uvAttribute.setXY(i, u, v);
} }
return geometry; return geometry;
}, [letterData, lineYOffsets, props.letter]); }, [letterData, lineYOffset]);
return ( return (
<a.mesh <a.mesh

View file

@ -1,66 +1,42 @@
import React, { useEffect, useRef } from "react"; import React, { useEffect, useRef } from "react";
import { BigTextState, useBigTextStore } from "../../store"; import { useMainSceneStore } from "../../store";
import { a, useSpring, useTrail } from "@react-spring/three"; import { a, useTrail } from "@react-spring/three";
import BigLetter from "./BigLetter"; import BigLetter from "./BigLetter";
const YellowTextRenderer = (props: { visible?: boolean }) => { const YellowTextRenderer = (props: { visible?: boolean }) => {
const disableTrail = useBigTextStore((state) => state.disableTrail); const xOffset = useMainSceneStore((state) => state.bigTextXOffset);
const transformState = useBigTextStore((state) => state.transformState); const visible = useMainSceneStore((state) => state.bigTextVisible);
const color = useMainSceneStore((state) => state.bigTextColor);
const visible = useBigTextStore((state) => state.visible); const textRef = useRef(useMainSceneStore.getState().bigText.split(""));
const color = useBigTextStore((state) => state.color);
const textArrRef = useRef(useBigTextStore.getState().text.split("")); const [trail, set] = useTrail(textRef.current.length, () => ({
posX: 0,
const transformRef = useRef(useBigTextStore.getState().transformState); posY: 0,
// this is used to animate the letters moving one after another
const trail = useTrail(textArrRef.current.length, {
posX: transformRef.current.posX,
posY: transformRef.current.posY,
config: { duration: 280 }, config: { duration: 280 },
}); }));
// this is used when the whole GROUP itself needs to be animated
const spring = useSpring({
posX: transformState.posX,
posY: transformState.posY,
config: { duration: 1200 },
});
useEffect( useEffect(
() => () =>
useBigTextStore.subscribe( useMainSceneStore.subscribe(
(state) => { (state) => {
transformRef.current = (state as BigTextState).transformState; textRef.current = (state as any).bigText.split("");
textArrRef.current = (state as BigTextState).text.split("");
}, },
(state) => state (state) => state
), ),
[] []
); );
useEffect(() => {
useMainSceneStore.subscribe(set, (state) => ({
posX: state.bigTextPos[0],
posY: state.bigTextPos[1],
}));
}, [set]);
return ( return (
<group position={[0, 0, 10]} visible={props.visible && visible}> <group position={[0, 0, 10]} visible={props.visible && visible}>
{disableTrail {trail.map(({ posX, posY }, idx) => (
? textArrRef.current.map((letter, idx) => (
<a.group
key={idx}
position-x={spring.posX}
position-y={spring.posY}
position-z={-8.7}
scale={[0.04, 0.06, 0.04]}
>
<BigLetter
color={color}
xOffsetCoeff={0}
letter={textArrRef.current[idx]}
letterIdx={idx}
key={idx}
/>
</a.group>
))
: trail.map(({ posX, posY }, idx) => (
<a.group <a.group
key={idx} key={idx}
position-x={posX} position-x={posX}
@ -70,8 +46,8 @@ const YellowTextRenderer = (props: { visible?: boolean }) => {
> >
<BigLetter <BigLetter
color={color} color={color}
xOffsetCoeff={transformRef.current.xOffset} xOffset={xOffset}
letter={textArrRef.current[idx]} letter={textRef.current[idx]}
letterIdx={idx} letterIdx={idx}
key={idx} key={idx}
/> />

View file

@ -20,7 +20,7 @@ import {
} from "../../store"; } from "../../store";
import MediaComponentManager from "./MediaSceneManagers/MediaComponentManager"; import MediaComponentManager from "./MediaSceneManagers/MediaComponentManager";
import SceneManager from "./GameManagers/SceneManager"; import SceneManager from "./GameManagers/SceneManager";
import YellowTextManager from "./MainSceneManagers/YellowTextManager"; import BigTextManager from "./MainSceneManagers/BigTextManager";
import LevelManager from "./MainSceneManagers/LevelManager"; import LevelManager from "./MainSceneManagers/LevelManager";
import BootComponentManager from "./BootSceneManagers/BootComponentManager"; import BootComponentManager from "./BootSceneManagers/BootComponentManager";
import SSknComponentManager from "./SSknSceneManagers/SSknComponentManager"; import SSknComponentManager from "./SSknSceneManagers/SSknComponentManager";
@ -283,7 +283,7 @@ const EventManager = () => {
<MiddleRingManager eventState={eventState!} /> <MiddleRingManager eventState={eventState!} />
<MediaComponentManager eventState={eventState!} /> <MediaComponentManager eventState={eventState!} />
<SceneManager eventState={eventState!} /> <SceneManager eventState={eventState!} />
<YellowTextManager eventState={eventState!} /> <BigTextManager eventState={eventState!} />
<LevelManager eventState={eventState!} /> <LevelManager eventState={eventState!} />
<BootComponentManager eventState={eventState!} /> <BootComponentManager eventState={eventState!} />
<SSknComponentManager eventState={eventState!} /> <SSknComponentManager eventState={eventState!} />

View file

@ -1,9 +1,8 @@
import { useCallback, useEffect } from "react"; import { useCallback, useEffect } from "react";
import { import {
useBigTextStore,
useGreenTextStore,
useHudStore, useHudStore,
useLevelStore, useLevelStore,
useMainSceneStore,
useNodeStore, useNodeStore,
useSiteSaveStore, useSiteSaveStore,
useSiteStore, useSiteStore,
@ -25,17 +24,9 @@ const GameLoader = (props: StateManagerProps) => {
// level setter // level setter
const setActiveLevel = useLevelStore((state) => state.setActiveLevel); const setActiveLevel = useLevelStore((state) => state.setActiveLevel);
// yellow text setter // big text setter
const setYellowTextTransformState = useBigTextStore( const setBigTexPos = useMainSceneStore((state) => state.setBigTextPos);
(state) => state.setTransformState const setBigText = useMainSceneStore((state) => state.setBigText);
);
const setYellowText = useBigTextStore((state) => state.setText);
// green text setter
const setGreenText = useGreenTextStore((state) => state.setText);
const setGreenTextTransformState = useGreenTextStore(
(state) => state.setTransformState
);
// site setter // site setter
const setSiteTransformState = useSiteStore( const setSiteTransformState = useSiteStore(
@ -69,39 +60,15 @@ const GameLoader = (props: StateManagerProps) => {
setActiveLevel(siteToLoad.level); setActiveLevel(siteToLoad.level);
// load new site yellow text // load new site yellow text
setYellowTextTransformState( setBigTexPos(
node_huds[siteToLoad.nodeHudId as keyof typeof node_huds].big_text[0], node_huds[siteToLoad.nodeHudId as keyof typeof node_huds].big_text[0]
"posX"
);
setYellowTextTransformState(
node_huds[siteToLoad.nodeHudId as keyof typeof node_huds].big_text[1],
"posY"
); );
const targetYellowText = (siteData as SiteType)[siteToLoad.level][ const targetYellowText = (siteData as SiteType)[siteToLoad.level][
siteToLoad.activeNodeId siteToLoad.activeNodeId
].node_name; ].node_name;
setYellowText(targetYellowText); setBigText(targetYellowText);
// load new site green text
const targetGreenText = (siteData as SiteType)[siteToLoad.level][
siteToLoad.activeNodeId
].title;
const targetGreenTextPosData =
node_huds[siteToLoad.nodeHudId as keyof typeof node_huds].medium_text;
setGreenTextTransformState(
{
initial: targetGreenTextPosData.initial_position[0],
final: targetGreenTextPosData.position[0],
},
"posX"
);
setGreenTextTransformState(targetGreenTextPosData.position[1], "posY");
setGreenText(targetGreenText);
// load new site node // load new site node
setActiveNodeState(siteToLoad.activeNodeId, "id"); setActiveNodeState(siteToLoad.activeNodeId, "id");
@ -113,14 +80,12 @@ const GameLoader = (props: StateManagerProps) => {
[ [
setActiveLevel, setActiveLevel,
setActiveNodeState, setActiveNodeState,
setBigTexPos,
setBigText,
setCurrentSite, setCurrentSite,
setGreenText,
setGreenTextTransformState,
setHudId, setHudId,
setNodeMatrixIndices, setNodeMatrixIndices,
setSiteTransformState, setSiteTransformState,
setYellowText,
setYellowTextTransformState,
siteASaveState, siteASaveState,
siteBSaveState, siteBSaveState,
] ]

View file

@ -15,7 +15,7 @@ import SiteManager from "./MainSceneManagers/SiteManager";
import LainManager from "./MainSceneManagers/LainManager"; import LainManager from "./MainSceneManagers/LainManager";
import MiddleRingManager from "./MainSceneManagers/MiddleRingManager"; import MiddleRingManager from "./MainSceneManagers/MiddleRingManager";
import SceneManager from "./GameManagers/SceneManager"; import SceneManager from "./GameManagers/SceneManager";
import YellowTextManager from "./MainSceneManagers/YellowTextManager"; import BigTextManager from "./MainSceneManagers/BigTextManager";
import LevelManager from "./MainSceneManagers/LevelManager"; import LevelManager from "./MainSceneManagers/LevelManager";
import LevelSelectionManager from "./MainSceneManagers/LevelSelectionManager"; import LevelSelectionManager from "./MainSceneManagers/LevelSelectionManager";
import SubsceneManager from "./GameManagers/SubsceneManager"; import SubsceneManager from "./GameManagers/SubsceneManager";
@ -148,7 +148,7 @@ const MainSceneEventManager = (props: MainSceneEventManagerProps) => {
<LainManager eventState={eventState!} /> <LainManager eventState={eventState!} />
<MiddleRingManager eventState={eventState!} /> <MiddleRingManager eventState={eventState!} />
<SceneManager eventState={eventState!} /> <SceneManager eventState={eventState!} />
<YellowTextManager eventState={eventState!} /> <BigTextManager eventState={eventState!} />
<LevelManager eventState={eventState!} /> <LevelManager eventState={eventState!} />
<LevelSelectionManager eventState={eventState!} /> <LevelSelectionManager eventState={eventState!} />
<SubsceneManager eventState={eventState!} /> <SubsceneManager eventState={eventState!} />

View file

@ -1,29 +1,21 @@
import { useCallback, useEffect, useMemo } from "react"; import { useCallback, useEffect } from "react";
import node_huds from "../../../resources/node_huds.json"; import node_huds from "../../../resources/node_huds.json";
import site_a from "../../../resources/site_a.json"; import site_a from "../../../resources/site_a.json";
import site_b from "../../../resources/site_b.json"; import site_b from "../../../resources/site_b.json";
import { useBigTextStore, useSiteStore } from "../../../store"; import { useMainSceneStore } from "../../../store";
import { SiteType } from "../../../components/MainScene/SyncedComponents/Site"; import { SiteType } from "../../../components/MainScene/SyncedComponents/Site";
import { StateManagerProps } from "../EventManager"; import { StateManagerProps } from "../EventManager";
const YellowTextManager = (props: StateManagerProps) => { const BigTextManager = (props: StateManagerProps) => {
const setTransformState = useBigTextStore((state) => state.setTransformState); const setText = useMainSceneStore((state) => state.setBigText);
const addToTransformState = useBigTextStore( const setColor = useMainSceneStore((state) => state.setBigTextColor);
(state) => state.addToTransformState const setVisible = useMainSceneStore((state) => state.setBigTextVisible);
const setXOffset = useMainSceneStore((state) => state.setBigTextXOffset);
const setPos = useMainSceneStore((state) => state.setBigTextPos);
const siteData = useMainSceneStore(
useCallback((state) => (state.activeSite === "a" ? site_a : site_b), [])
); );
const setText = useBigTextStore((state) => state.setText);
const setDisableTrail = useBigTextStore((state) => state.setDisableTrail);
const setColor = useBigTextStore((state) => state.setColor);
const setVisible = useBigTextStore((state) => state.setVisible);
const currentSite = useSiteStore((state) => state.currentSite);
const siteData = useMemo(() => (currentSite === "a" ? site_a : site_b), [
currentSite,
]);
const animateYellowTextWithMove = useCallback( const animateYellowTextWithMove = useCallback(
( (
@ -34,30 +26,21 @@ const YellowTextManager = (props: StateManagerProps) => {
newLevel: string, newLevel: string,
delay: number delay: number
) => { ) => {
setDisableTrail(true);
// animate the letters to match that of site's // animate the letters to match that of site's
// to create an illusion of not moving // to create an illusion of not moving
setTimeout(() => { // setTimeout(() => {
addToTransformState(posXOffset, "posX"); // addToTransformState(posXOffset, "posX");
addToTransformState(posYOffset, "posY"); // addToTransformState(posYOffset, "posY");
}, delay); // }, delay);
setTimeout(() => { setTimeout(() => {
// make current hud big text shrink // make current hud big text shrink
setTransformState(-1, "xOffset"); setXOffset(-1, "xOffset");
}, 2500); }, 2500);
setTimeout(() => { setTimeout(() => {
// animate it to new pos x/y // animate it to new pos x/y
setTransformState( setPos(node_huds[newActiveHudId as keyof typeof node_huds].big_text);
node_huds[newActiveHudId as keyof typeof node_huds].big_text[0],
"posX"
);
setTransformState(
node_huds[newActiveHudId as keyof typeof node_huds].big_text[1],
"posY"
);
// set new text according to the node name // set new text according to the node name
const targetText = const targetText =
newActiveNodeId === "UNKNOWN" newActiveNodeId === "UNKNOWN"
@ -65,32 +48,24 @@ const YellowTextManager = (props: StateManagerProps) => {
: (siteData as SiteType)[newLevel][newActiveNodeId].node_name; : (siteData as SiteType)[newLevel][newActiveNodeId].node_name;
setText(targetText); setText(targetText);
setDisableTrail(false);
}, 3000); }, 3000);
// unshrink text // unshrink text
setTimeout(() => { setTimeout(() => {
setTransformState(0, "xOffset"); setXOffset(0);
}, 3900); }, 3900);
}, },
[addToTransformState, setDisableTrail, setText, setTransformState, siteData] [setPos, setText, setXOffset, siteData]
); );
const animateYellowTextWithoutMove = useCallback( const animateYellowTextWithoutMove = useCallback(
(newActiveHudId: string, newActiveNodeId: string, level: string) => { (newActiveHudId: string, newActiveNodeId: string, level: string) => {
// make current hud big text shrink // make current hud big text shrink
setTransformState(-1, "xOffset"); setXOffset(-1);
setTimeout(() => { setTimeout(() => {
// animate it to new pos x/y // animate it to new pos x/y
setTransformState( setPos(node_huds[newActiveHudId as keyof typeof node_huds].big_text);
node_huds[newActiveHudId as keyof typeof node_huds].big_text[0],
"posX"
);
setTransformState(
node_huds[newActiveHudId as keyof typeof node_huds].big_text[1],
"posY"
);
}, 400); }, 400);
setTimeout(() => { setTimeout(() => {
@ -100,19 +75,17 @@ const YellowTextManager = (props: StateManagerProps) => {
setTimeout(() => { setTimeout(() => {
// unshrink text // unshrink text
setTransformState(0, "xOffset"); setXOffset(0);
}, 1200); }, 1200);
}, },
[setText, setTransformState, siteData] [setPos, setText, setXOffset, siteData]
); );
const initializeLevelSelection = useCallback(() => { const initializeLevelSelection = useCallback(() => {
setTransformState(-1, "xOffset"); setXOffset(-1);
setTimeout(() => { setTimeout(() => {
setTransformState(-0.02, "posX"); setPos([-0.02, 0.005, -8.7]);
setTransformState(0.005, "posY");
}, 400); }, 400);
setTimeout(() => { setTimeout(() => {
@ -121,23 +94,16 @@ const YellowTextManager = (props: StateManagerProps) => {
}, 1000); }, 1000);
setTimeout(() => { setTimeout(() => {
setTransformState(0, "xOffset"); setXOffset(0);
}, 1200); }, 1200);
}, [setColor, setText, setTransformState]); }, [setColor, setPos, setText, setXOffset]);
const levelSelectionBack = useCallback( const levelSelectionBack = useCallback(
(activeNodeId: string, activeHudId: string, level: string) => { (activeNodeId: string, activeHudId: string, level: string) => {
setTransformState(-1, "xOffset"); setXOffset(-1);
setTimeout(() => { setTimeout(() => {
setTransformState( setPos(node_huds[activeHudId as keyof typeof node_huds].big_text);
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"
);
}, 400); }, 400);
setTimeout(() => { setTimeout(() => {
@ -146,10 +112,10 @@ const YellowTextManager = (props: StateManagerProps) => {
}, 1000); }, 1000);
setTimeout(() => { setTimeout(() => {
setTransformState(0, "xOffset"); setXOffset(0);
}, 1200); }, 1200);
}, },
[setColor, setText, setTransformState, siteData] [setColor, setPos, setText, setXOffset, siteData]
); );
const toggleVisibleAfterLevelSelect = useCallback( const toggleVisibleAfterLevelSelect = useCallback(
@ -157,14 +123,7 @@ const YellowTextManager = (props: StateManagerProps) => {
setVisible(false); setVisible(false);
setTimeout(() => { setTimeout(() => {
setTransformState( setPos(node_huds[activeHudId as keyof typeof node_huds].big_text[0]);
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"); setColor("yellow");
const targetText = const targetText =
activeNodeId === "UNKNOWN" activeNodeId === "UNKNOWN"
@ -178,7 +137,7 @@ const YellowTextManager = (props: StateManagerProps) => {
setVisible(true); setVisible(true);
}, 3900); }, 3900);
}, },
[setColor, setText, setTransformState, setVisible, siteData] [setColor, setPos, setText, setVisible, siteData]
); );
const dispatchObject = useCallback( const dispatchObject = useCallback(
@ -298,4 +257,4 @@ const YellowTextManager = (props: StateManagerProps) => {
return null; return null;
}; };
export default YellowTextManager; export default BigTextManager;

View file

@ -1,6 +1,8 @@
import create from "zustand"; import create from "zustand";
import { combine } from "zustand/middleware"; import { combine } from "zustand/middleware";
import * as THREE from "three"; import * as THREE from "three";
import site_a from "./resources/site_a.json";
import site_b from "./resources/site_b.json";
import authorize_user_letters from "./resources/authorize_user_letters.json"; import authorize_user_letters from "./resources/authorize_user_letters.json";
import game_progress from "./resources/initial_progress.json"; import game_progress from "./resources/initial_progress.json";
@ -239,66 +241,6 @@ export const useMediaBigTextStore = create(
) )
); );
export const useBigTextStore = create(
combine(
{
visible: true,
color: "yellow",
disableTrail: false,
text: "Tda028",
transformState: {
posX: -0.35,
posY: 0.23,
xOffset: 0,
},
} as BigTextState,
(set) => ({
setDisableTrail: (to: boolean) => set(() => ({ disableTrail: to })),
setText: (to: string) => set(() => ({ text: to })),
setTransformState: (to: number, at: string) =>
set((state) => ({
transformState: { ...state.transformState, [at]: to },
})),
addToTransformState: (val: number, at: string) =>
set((state) => ({
transformState: {
...state.transformState,
[at]:
state.transformState[at as keyof typeof state.transformState] +
val,
},
})),
setColor: (to: string) => set(() => ({ color: to })),
setVisible: (to: boolean) => set(() => ({ visible: to })),
})
)
);
export const useGreenTextStore = create(
combine(
{
text: "TOUKO's DIARY",
transformState: {
posX: { initial: 1.18, final: 0.18 },
posY: 0.16,
xOffset: 0,
},
active: 1,
} as GreenTextState,
(set) => ({
setText: (to: string) => set(() => ({ text: to })),
setTransformState: (
to: number | { initial: number; final: number },
at: string
) =>
set((state) => ({
transformState: { ...state.transformState, [at]: to },
})),
toggleActive: () => set((state) => ({ active: Number(!state.active) })),
})
)
);
export const useHudStore = create<HUDState>((set) => ({ export const useHudStore = create<HUDState>((set) => ({
id: "fg_hud_1", id: "fg_hud_1",
active: 1, active: 1,
@ -506,12 +448,162 @@ export const useAuthorizeUserStore = create<AuthorizeUserState>((set) => ({
set(() => ({ activeLetterTextureOffset: to })), set(() => ({ activeLetterTextureOffset: to })),
})); }));
export const useMainSceneStore = create<MainSceneState>((set) => ({ export const useMainSceneStore = create(
intro: true, combine(
{
// game progress
gameProgress: game_progress,
// subscene
subscene: "site", subscene: "site",
setSubscene: (to) => set(() => ({ subscene: to })),
setIntro: (to) => set(() => ({ intro: to })), // whether or not to play the intro anim
})); intro: true,
// big text (the one that displays node names)
bigText: "Tda028",
bigTextVisible: true,
bigTextColor: "yellow",
bigTextPos: [-0.35, 0.23, 0],
bigTextXOffset: 0,
// hud
hudId: "fg_hud_1",
hudActive: 1,
// nodes
activeNodeId: "0422",
activeNodeMatrixIndices: { matrixIdx: 7, rowIdx: 0, colIdx: 0 },
activeNodePos: [0, 0, 0],
activeNodeRot: [0, 0, 0],
activeNodeState: {
interactedWith: false,
exploding: false,
shrinking: false,
visible: true,
},
// lain
lainMoveState: "standing",
// starfield
mainStarfieldVisible: true,
introStarfieldVisible: false,
mainStarBoostVal: 0.2,
// site
activeSite: "a",
siteRot: [0, 0, 0],
sitePos: [0, 0, 0],
// middle ring
middleRingPos: [0, -0.11, 0],
middleRingRot: [0, 0, 0],
middleRingWobbleAmp: 0,
middleRingNoiseAmp: 0,
middleRingPartSeparatorVal: 1,
middleRingAnimDuration: 600,
middleRingRotating: true,
fakeMiddleRingVisible: false,
// level
activeLevel: "04",
// level selection
selectedLevel: 4,
levelSelectionToggled: 0,
// pause
pauseComponentMatrix: ["load", "about", "change", "save", "exit"],
pauseComponentMatrixIdx: 2,
pauseExitAnimation: false,
} as any,
(set) => ({
// subscene setters
setSubscene: (to: "pause" | "level_selection") =>
set(() => ({ subscene: to })),
// intro setters
setIntro: (to: boolean) => set(() => ({ intro: to })),
// big text setters
setBigText: (to: string) => set(() => ({ bigText: to })),
setBigTextVisible: (to: boolean) => set(() => ({ bigTextVisible: to })),
setBigTextColor: (to: "yellow" | "orange") =>
set(() => ({ bigTextColor: to })),
setBigTextPos: (to: number[]) => set(() => ({ bigTextPos: to })),
setBigTextXOffset: (to: number) => set(() => ({ bigTextXOffset: to })),
// hud setters
setHudId: (to: string) => set(() => ({ hudId: to })),
toggleHudActive: () =>
set((state) => ({ hudActive: Number(!state.hudActive) })),
// node setters
setActiveNodeId: (to: string) => set(() => ({ activeNodeId: to })),
setActiveNodeMatrixIndices: (to: {
matrixIdx: number;
rowIdx: number;
colIdx: number;
}) => set(() => ({ activeNodeMatrixIndices: to })),
setActiveNodePos: (to: number[]) => set(() => ({ activeNodePos: to })),
setActiveNodeRot: (to: number[]) => set(() => ({ activeNodeRot: to })),
setActiveNodeState: (
to: boolean,
at: "interactedWith" | "visible" | "exploding" | "shrinking"
) =>
set((state) => ({
activeNodeState: { ...state.activeNodeState, [at]: to },
})),
// lain setters
setLainMoveState: (to: string) => set(() => ({ lainMoveState: to })),
// starfield setters
setMainStarfieldVisible: (to: boolean) =>
set(() => ({ mainStarfieldVisible: to })),
setMainStarBoostVal: (to: number) =>
set(() => ({ mainStarBoostVal: to })),
setIntroStarfieldVisible: (to: boolean) =>
set(() => ({ introStarfieldVisible: to })),
// site setters
setActiveSite: (to: "a" | "b") => set(() => ({ activeSite: to })),
setSiteRot: (to: number[]) => set(() => ({ siteRot: to })),
setSitePos: (to: number[]) => set(() => ({ sitePos: to })),
// middle ring setters
setMiddleRingPos: (to: number[]) => set(() => ({ middleRingPos: to })),
setMiddleRingRot: (to: number[]) => set(() => ({ middleRingRot: to })),
setMiddleRingWobbleAmp: (to: number) =>
set(() => ({ middleRingWobbleAmp: to })),
setMiddleRingNoiseAmp: (to: number) =>
set(() => ({ middleRingNoiseAmp: to })),
setMiddleRingPartSeparatorVal: (to: number) =>
set(() => ({ middleRingPartSeparatorVal: to })),
setMiddleRingRotating: (to: boolean) =>
set(() => ({ middleRingRotating: to })),
setFakeMiddleRingVisible: (to: boolean) =>
set(() => ({ fakeMiddleRingVisible: to })),
// level setters
setActiveLevel: (to: string) => set(() => ({ activeLevel: to })),
// level selection setters
setSelectedLevel: (to: number) => set(() => ({ selectedLevel: to })),
toggleLevelSelection: () =>
set((state) => ({
levelSelectionToggled: Number(!state.levelSelectionToggled),
})),
// pause setters
setPauseComponentMatrixIdx: (to: number) =>
set(() => ({ pauseComponentMatrixIdx: to })),
setPauseExitAnimation: (to: boolean) =>
set(() => ({ pauseExitAnimation: to })),
})
)
);
export const useBootStore = create( export const useBootStore = create(
combine( combine(