almost done refactoring the store

This commit is contained in:
ad044 2021-01-24 20:43:38 +04:00
parent 751f8793e1
commit 5e804c51a0
67 changed files with 535 additions and 630 deletions

View file

@ -4,8 +4,7 @@ import "./static/css/page.css";
import { Canvas } from "react-three-fiber"; import { Canvas } from "react-three-fiber";
import MediaPlayer from "./components/MediaScene/MediaPlayer"; import MediaPlayer from "./components/MediaScene/MediaPlayer";
import MediaScene from "./scenes/MediaScene"; import MediaScene from "./scenes/MediaScene";
import EventManager from "./core/StateManagers/EventManager"; import { useStore } from "./store";
import { useSceneStore } from "./store";
import GateScene from "./scenes/GateScene"; import GateScene from "./scenes/GateScene";
import BootScene from "./scenes/BootScene"; import BootScene from "./scenes/BootScene";
import SSknScene from "./scenes/SSknScene"; import SSknScene from "./scenes/SSknScene";
@ -16,7 +15,7 @@ import EndScene from "./scenes/EndScene";
import IdleMediaScene from "./scenes/IdleMediaScene"; import IdleMediaScene from "./scenes/IdleMediaScene";
const App = () => { const App = () => {
const currentScene = useSceneStore((state) => state.currentScene); const currentScene = useStore((state) => state.currentScene);
useEffect(() => { useEffect(() => {
document.title = "< index >"; document.title = "< index >";

View file

@ -8,7 +8,7 @@ import authorizeInactiveLetters from "../../static/sprite/authorize_inactive_let
import authorizeActiveLetters from "../../static/sprite/authorize_active_letters.png"; import authorizeActiveLetters from "../../static/sprite/authorize_active_letters.png";
import { useLoader } from "react-three-fiber"; import { useLoader } from "react-three-fiber";
import * as THREE from "three"; import * as THREE from "three";
import { useAuthorizeUserStore, useBootStore } from "../../store"; import { useAuthorizeUserStore } from "../../store";
import { OrbitControls } from "@react-three/drei"; import { OrbitControls } from "@react-three/drei";
type BootAuthorizeUserProps = { type BootAuthorizeUserProps = {

View file

@ -7,7 +7,7 @@ import mouth1 from "../static/sprite/mouth_1.png";
import mouth2 from "../static/sprite/mouth_2.png"; import mouth2 from "../static/sprite/mouth_2.png";
import mouth3 from "../static/sprite/mouth_3.png"; import mouth3 from "../static/sprite/mouth_3.png";
import mouth4 from "../static/sprite/mouth_4.png"; import mouth4 from "../static/sprite/mouth_4.png";
import { useMainSceneStore } from "../store"; import { useStore } from "../store";
import { LainConstructor } from "./MainScene/Lain"; import { LainConstructor } from "./MainScene/Lain";
type LainTaKProps = { type LainTaKProps = {
@ -39,7 +39,7 @@ const LainSpeak = (props: LainTaKProps) => {
/> />
); );
const analyser = useMainSceneStore((state) => state.audioAnalyser); const analyser = useStore((state) => state.audioAnalyser);
const mouthRef = useRef<THREE.SpriteMaterial>(); const mouthRef = useRef<THREE.SpriteMaterial>();
useFrame(() => { useFrame(() => {

View file

@ -32,7 +32,7 @@ import leanRightSpriteSheet from "../../static/sprite/lean_right.png";
import lookAroundSpriteSheet from "../../static/sprite/look_around.png"; import lookAroundSpriteSheet from "../../static/sprite/look_around.png";
import playWithHairSpriteSheet from "../../static/sprite/play_with_hair.png"; import playWithHairSpriteSheet from "../../static/sprite/play_with_hair.png";
import { useMainSceneStore } from "../../store"; import { useStore } from "../../store";
type LainConstructorProps = { type LainConstructorProps = {
sprite: string; sprite: string;
@ -353,7 +353,7 @@ type LainProps = {
}; };
const Lain = (props: LainProps) => { const Lain = (props: LainProps) => {
const lainMoveState = useMainSceneStore((state) => state.lainMoveState); const lainMoveState = useStore((state) => state.lainMoveState);
const lainAnimationDispatch = useMemo(() => { const lainAnimationDispatch = useMemo(() => {
const anims = { const anims = {

View file

@ -2,7 +2,7 @@ import React, { useCallback, useEffect, useMemo, useState } from "react";
import * as THREE from "three"; import * as THREE from "three";
import PauseSquare from "./PauseSquare"; import PauseSquare from "./PauseSquare";
import StaticBigLetter from "../../TextRenderer/StaticBigLetter"; import StaticBigLetter from "../../TextRenderer/StaticBigLetter";
import { useMainSceneStore } from "../../../store"; import { useStore } from "../../../store";
import { useLoader } from "react-three-fiber"; import { useLoader } from "react-three-fiber";
type PauseProps = { type PauseProps = {
@ -10,7 +10,7 @@ type PauseProps = {
}; };
const Pause = (props: PauseProps) => { const Pause = (props: PauseProps) => {
const exit = useMainSceneStore((state) => state.pauseExitAnimation); const exit = useStore((state) => state.pauseExitAnimation);
const [showActiveComponent, setShowActiveComponent] = useState(false); const [showActiveComponent, setShowActiveComponent] = useState(false);
const [animation, setAnimation] = useState(false); const [animation, setAnimation] = useState(false);
const [intro, setIntro] = useState(true); const [intro, setIntro] = useState(true);
@ -25,7 +25,7 @@ const Pause = (props: PauseProps) => {
[wordFont] [wordFont]
); );
const activeComponent = useMainSceneStore( const activeComponent = useStore(
useCallback( useCallback(
(state) => (state) =>
showActiveComponent showActiveComponent

View file

@ -3,7 +3,7 @@ import * as THREE from "three";
import { useLoader } from "react-three-fiber"; import { useLoader } from "react-three-fiber";
import pauseGrayBoxes from "../../../static/sprite/pause_gray_boxes.png"; import pauseGrayBoxes from "../../../static/sprite/pause_gray_boxes.png";
import { a, useSpring } from "@react-spring/three"; import { a, useSpring } from "@react-spring/three";
import { useMainSceneStore } from "../../../store"; import { useStore } from "../../../store";
type PauseSquareProps = { type PauseSquareProps = {
colIdx: number; colIdx: number;
@ -15,7 +15,7 @@ type PauseSquareProps = {
}; };
const PauseSquare = memo((props: PauseSquareProps) => { const PauseSquare = memo((props: PauseSquareProps) => {
const exitAnimation = useMainSceneStore((state) => state.pauseExitAnimation); const exitAnimation = useStore((state) => state.pauseExitAnimation);
const grayBoxesTex = useLoader(THREE.TextureLoader, pauseGrayBoxes); const grayBoxesTex = useLoader(THREE.TextureLoader, pauseGrayBoxes);

View file

@ -8,7 +8,7 @@ import longHudMirrored from "../../../static/sprite/long_hud_mirrored.png";
import boringHud from "../../../static/sprite/long_hud_boring.png"; import boringHud from "../../../static/sprite/long_hud_boring.png";
import boringHudMirrored from "../../../static/sprite/long_hud_boring_mirrored.png"; import boringHudMirrored from "../../../static/sprite/long_hud_boring_mirrored.png";
import { a, useSpring } from "@react-spring/three"; import { a, useSpring } from "@react-spring/three";
import { useMainSceneStore } from "../../../store"; import { useStore } from "../../../store";
import MediumLetter from "../../TextRenderer/MediumLetter"; import MediumLetter from "../../TextRenderer/MediumLetter";
export type HUDType = { export type HUDType = {
@ -33,11 +33,11 @@ export type HUDType = {
}; };
const HUD = memo(() => { const HUD = memo(() => {
const greenText = useMainSceneStore((state) => const greenText = useStore((state) =>
state.activeNode.title.split("") state.activeNode.title.split("")
); );
const active = useMainSceneStore((state) => Number(state.hudActive)); const active = useStore((state) => Number(state.hudActive));
const currentHud = useMainSceneStore((state) => state.hud); const currentHud = useStore((state) => state.hud);
const hudElementState = useSpring({ const hudElementState = useSpring({
bigHUDPositionX: active, bigHUDPositionX: active,

View file

@ -5,7 +5,7 @@ import horizontalHud from "../../../static/sprite/select_level_hud_horizontal.pn
import levelSelectionText from "../../../static/sprite/select_level_text.png"; import levelSelectionText from "../../../static/sprite/select_level_text.png";
import upArrow from "../../../static/sprite/select_level_up_arrow.png"; import upArrow from "../../../static/sprite/select_level_up_arrow.png";
import downArrow from "../../../static/sprite/select_level_down_arrow.png"; import downArrow from "../../../static/sprite/select_level_down_arrow.png";
import { useMainSceneStore } from "../../../store"; import { useStore } from "../../../store";
import { useLoader } from "react-three-fiber"; import { useLoader } from "react-three-fiber";
import * as THREE from "three"; import * as THREE from "three";
import { a, useSpring } from "@react-spring/three"; import { a, useSpring } from "@react-spring/three";
@ -24,11 +24,11 @@ const LevelSelection = () => {
const upArrowTex = useLoader(THREE.TextureLoader, upArrow); const upArrowTex = useLoader(THREE.TextureLoader, upArrow);
const downArrowTex = useLoader(THREE.TextureLoader, downArrow); const downArrowTex = useLoader(THREE.TextureLoader, downArrow);
const toggled = useMainSceneStore( const toggled = useStore(
useCallback((state) => Number(state.subscene === "level_selection"), []) useCallback((state) => Number(state.mainSubscene === "level_selection"), [])
); );
const selectedLevel = useMainSceneStore((state) => state.selectedLevel) const selectedLevel = useStore((state) => state.selectedLevel)
.toString() .toString()
.padStart(2, "0"); .padStart(2, "0");

View file

@ -3,19 +3,19 @@ import { useFrame, useLoader } from "react-three-fiber";
import middleRingTexture from "../../../static/sprite/middle_ring_tex.png"; import middleRingTexture from "../../../static/sprite/middle_ring_tex.png";
import * as THREE from "three"; import * as THREE from "three";
import { a, useSpring } from "@react-spring/three"; import { a, useSpring } from "@react-spring/three";
import { useMainSceneStore } from "../../../store"; import { useStore } from "../../../store";
import MiddleRingPart from "./MiddleRing/MiddleRingPart"; import MiddleRingPart from "./MiddleRing/MiddleRingPart";
const MiddleRing = () => { const MiddleRing = () => {
const middleRingTex = useLoader(THREE.TextureLoader, middleRingTexture); const middleRingTex = useLoader(THREE.TextureLoader, middleRingTexture);
const pos = useMainSceneStore((state) => state.middleRingPos); const pos = useStore((state) => state.middleRingPos);
const rot = useMainSceneStore((state) => state.middleRingRot); const rot = useStore((state) => state.middleRingRot);
const wobbleAmp = useMainSceneStore((state) => state.middleRingWobbleAmp); const wobbleAmp = useStore((state) => state.middleRingWobbleAmp);
const noiseAmp = useMainSceneStore((state) => state.middleRingNoiseAmp); const noiseAmp = useStore((state) => state.middleRingNoiseAmp);
const rotating = useMainSceneStore((state) => state.middleRingRotating); const rotating = useStore((state) => state.middleRingRotating);
const mainRingVisible = useMainSceneStore( const mainRingVisible = useStore(
(state) => !state.fakeMiddleRingVisible (state) => !state.fakeMiddleRingVisible
); );

View file

@ -3,7 +3,7 @@ import middleRingTexture from "../../../../static/sprite/middle_ring_tex.png";
import { useLoader } from "react-three-fiber"; import { useLoader } from "react-three-fiber";
import * as THREE from "three"; import * as THREE from "three";
import { a, useSpring } from "@react-spring/three"; import { a, useSpring } from "@react-spring/three";
import { useMainSceneStore } from "../../../../store"; import { useStore } from "../../../../store";
type MiddleRingPartProps = { type MiddleRingPartProps = {
position: number[]; position: number[];
@ -21,16 +21,16 @@ const MiddleRingPart = (props: MiddleRingPartProps) => {
const [{ posX, posZ }, set] = useSpring(() => ({ const [{ posX, posZ }, set] = useSpring(() => ({
posX: posX:
props.position[0] / props.position[0] /
useMainSceneStore.getState().middleRingPartSeparatorVal, useStore.getState().middleRingPartSeparatorVal,
posZ: posZ:
props.position[2] / props.position[2] /
useMainSceneStore.getState().middleRingPartSeparatorVal, useStore.getState().middleRingPartSeparatorVal,
config: { duration: 600 }, config: { duration: 600 },
})); }));
useEffect(() => { useEffect(() => {
useMainSceneStore.subscribe(set, (state) => ({ useStore.subscribe(set, (state) => ({
posX: props.position[0] / state.middleRingPartSeparatorVal, posX: props.position[0] / state.middleRingPartSeparatorVal,
posZ: props.position[2] / state.middleRingPartSeparatorVal, posZ: props.position[2] / state.middleRingPartSeparatorVal,
})); }));

View file

@ -1,6 +1,6 @@
import React, { Suspense, useEffect, useMemo } from "react"; import React, { Suspense, useEffect, useMemo } from "react";
import { a, useSpring } from "@react-spring/three"; import { a, useSpring } from "@react-spring/three";
import { useMainSceneStore } from "../../../store"; import { useStore } from "../../../store";
import ActiveLevelNodes from "./Site/ActiveLevelNodes"; import ActiveLevelNodes from "./Site/ActiveLevelNodes";
import Rings from "./Site/Rings"; import Rings from "./Site/Rings";
import site_a from "../../../resources/site_a.json"; import site_a from "../../../resources/site_a.json";
@ -39,8 +39,8 @@ type SiteProps = {
}; };
const Site = (props: SiteProps) => { const Site = (props: SiteProps) => {
const siteRot = useMainSceneStore((state) => state.siteRot); const siteRot = useStore((state) => state.siteRot);
const sitePos = useMainSceneStore((state) => state.sitePos); const sitePos = useStore((state) => state.sitePos);
const siteState = useSpring({ const siteState = useSpring({
siteRotX: siteRot[0], siteRotX: siteRot[0],
siteRotY: siteRot[1], siteRotY: siteRot[1],

View file

@ -1,24 +1,24 @@
import React, { useMemo, memo } from "react"; import React, { useMemo, memo } from "react";
import Node from "./Node"; import Node from "./Node";
import node_positions from "../../../../resources/node_positions.json"; import node_positions from "../../../../resources/node_positions.json";
import { useMainSceneStore } from "../../../../store"; import { useStore } from "../../../../store";
import { isNodeVisible } from "../../../../core/nodeSelector"; import { isNodeVisible } from "../../../../core/nodeSelector";
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 { NodeDataType } from "../Site"; import { NodeDataType } from "../Site";
const ActiveLevelNodes = memo(() => { const ActiveLevelNodes = memo(() => {
const activeNodeId = useMainSceneStore((state) => state.activeNode.id); const activeNodeId = useStore((state) => state.activeNode.id);
const gameProgress = useMainSceneStore((state) => state.gameProgress); const gameProgress = useStore((state) => state.gameProgress);
const currentSite = useMainSceneStore((state) => state.activeSite); const currentSite = useStore((state) => state.activeSite);
const siteData = useMemo(() => (currentSite === "a" ? site_a : site_b), [ const siteData = useMemo(() => (currentSite === "a" ? site_a : site_b), [
currentSite, currentSite,
]); ]);
const activeLevel = useMainSceneStore((state) => state.activeLevel); const activeLevel = useStore((state) => state.activeLevel);
const visibleNodes = useMemo( const visibleNodes = useMemo(
() => siteData[activeLevel as keyof typeof siteData], () => siteData[activeLevel as keyof typeof siteData],

View file

@ -1,21 +1,21 @@
import React, { useMemo, memo } from "react"; import React, { useMemo, memo } from "react";
import Node from "./Node"; import Node from "./Node";
import node_positions from "../../../../resources/node_positions.json"; import node_positions from "../../../../resources/node_positions.json";
import { useMainSceneStore } from "../../../../store"; import { useStore } from "../../../../store";
import { isNodeVisible } from "../../../../core/nodeSelector"; import { isNodeVisible } from "../../../../core/nodeSelector";
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";
const InactiveLevelNodes = memo(() => { const InactiveLevelNodes = memo(() => {
const gameProgress = useMainSceneStore((state) => state.gameProgress); const gameProgress = useStore((state) => state.gameProgress);
const currentSite = useMainSceneStore((state) => state.activeSite); const currentSite = useStore((state) => state.activeSite);
const siteData = useMemo(() => (currentSite === "a" ? site_a : site_b), [ const siteData = useMemo(() => (currentSite === "a" ? site_a : site_b), [
currentSite, currentSite,
]); ]);
const activeLevel = useMainSceneStore((state) => state.activeLevel); const activeLevel = useStore((state) => state.activeLevel);
const visibleNodes = useMemo(() => { const visibleNodes = useMemo(() => {
const obj = {}; const obj = {};

View file

@ -17,7 +17,7 @@ import LdaActive from "../../../../static/sprite/Lda_active.png";
import MULTI from "../../../../static/sprite/MULTI.png"; import MULTI from "../../../../static/sprite/MULTI.png";
import MULTIActive from "../../../../static/sprite/MULTI_active.png"; import MULTIActive from "../../../../static/sprite/MULTI_active.png";
import level_y_values from "../../../../resources/level_y_values.json"; import level_y_values from "../../../../resources/level_y_values.json";
import { useMainSceneStore } from "../../../../store"; import { useStore } from "../../../../store";
type NodeContructorProps = { type NodeContructorProps = {
nodeName: string; nodeName: string;
@ -122,7 +122,7 @@ const Node = memo((props: NodeContructorProps) => {
})); }));
useEffect(() => { useEffect(() => {
useMainSceneStore.subscribe(set, (state) => ({ useStore.subscribe(set, (state) => ({
activeNodePosX: state.activeNodeState.interactedWith activeNodePosX: state.activeNodeState.interactedWith
? state.activeNodePos[0] ? state.activeNodePos[0]
: props.position[0], : props.position[0],

View file

@ -1,14 +1,14 @@
import React from "react"; import React from "react";
import { useMainSceneStore } from "../../../../store"; import { useStore } from "../../../../store";
import NodeExplosion from "./NodeAnimations/NodeExplosion"; import NodeExplosion from "./NodeAnimations/NodeExplosion";
import NodeRip from "./NodeAnimations/NodeRip"; import NodeRip from "./NodeAnimations/NodeRip";
const NodeAnimations = () => { const NodeAnimations = () => {
const nodeShrinking = useMainSceneStore( const nodeShrinking = useStore(
(state) => state.activeNodeState.shrinking (state) => state.activeNodeState.shrinking
); );
const nodeExploding = useMainSceneStore( const nodeExploding = useStore(
(state) => state.activeNodeState.exploding (state) => state.activeNodeState.exploding
); );

View file

@ -4,10 +4,10 @@ import node_explosion_line_positions from "../../../../../resources/node_explosi
import { useFrame } from "react-three-fiber"; import { useFrame } from "react-three-fiber";
import GoldNode from "./NodeExplosion/GoldNode"; import GoldNode from "./NodeExplosion/GoldNode";
import { useMainSceneStore } from "../../../../../store"; import { useStore } from "../../../../../store";
const NodeExplosion = () => { const NodeExplosion = () => {
const explosionVisible = useMainSceneStore( const explosionVisible = useStore(
(state) => state.activeNodeState.exploding (state) => state.activeNodeState.exploding
); );

View file

@ -16,7 +16,7 @@ import Lda from "../../../../../../static/sprite/Lda.png";
import LdaGold from "../../../../../../static/sprite/Lda_gold.png"; import LdaGold from "../../../../../../static/sprite/Lda_gold.png";
import MULTI from "../../../../../../static/sprite/MULTI.png"; import MULTI from "../../../../../../static/sprite/MULTI.png";
import MULTIGold from "../../../../../../static/sprite/MULTI_gold.png"; import MULTIGold from "../../../../../../static/sprite/MULTI_gold.png";
import { useMainSceneStore } from "../../../../../../store"; import { useStore } from "../../../../../../store";
type GLTFResult = GLTF & { type GLTFResult = GLTF & {
nodes: { nodes: {
@ -35,7 +35,7 @@ type GoldNodeProps = {
const GoldNode = (props: GoldNodeProps) => { const GoldNode = (props: GoldNodeProps) => {
const { nodes } = useLoader<GLTFResult>(GLTFLoader, "models/goldNode.glb"); const { nodes } = useLoader<GLTFResult>(GLTFLoader, "models/goldNode.glb");
const activeNodeName = useMainSceneStore( const activeNodeName = useStore(
(state) => state.activeNode.node_name (state) => state.activeNode.node_name
); );

View file

@ -1,11 +1,11 @@
import React, { useEffect, useRef, useState } from "react"; import React, { useEffect, useRef, useState } from "react";
import TriangleNode from "./NodeRip/TriangleNode"; import TriangleNode from "./NodeRip/TriangleNode";
import { useMainSceneStore } from "../../../../../store"; import { useStore } from "../../../../../store";
import RipLine from "./NodeRip/RipLine"; import RipLine from "./NodeRip/RipLine";
import { useFrame } from "react-three-fiber"; import { useFrame } from "react-three-fiber";
const NodeRip = () => { const NodeRip = () => {
const nodeShrinking = useMainSceneStore( const nodeShrinking = useStore(
(state) => state.activeNodeState.shrinking (state) => state.activeNodeState.shrinking
); );
const [shouldAnimate, setShouldAnimate] = useState(false); const [shouldAnimate, setShouldAnimate] = useState(false);

View file

@ -3,15 +3,15 @@ import level_y_values from "../../../../resources/level_y_values.json";
import PurpleRing from "./PurpleRing"; import PurpleRing from "./PurpleRing";
import GrayRing from "./GrayRing"; import GrayRing from "./GrayRing";
import CyanCrystal from "./CyanCrystal"; import CyanCrystal from "./CyanCrystal";
import { useMainSceneStore } from "../../../../store"; import { useStore } from "../../../../store";
type RingsProps = { type RingsProps = {
activateAllRings: boolean; activateAllRings: boolean;
}; };
const Rings = memo((props: RingsProps) => { const Rings = memo((props: RingsProps) => {
const activeLevel = useMainSceneStore((state) => state.activeLevel); const activeLevel = useStore((state) => state.activeLevel);
const currentSite = useMainSceneStore((state) => state.activeSite); const currentSite = useStore((state) => state.activeSite);
const visibleRings = useMemo(() => { const visibleRings = useMemo(() => {
const rings: [string, number][] = []; const rings: [string, number][] = [];

View file

@ -2,7 +2,7 @@ import React, { memo, useRef, useState } from "react";
import { useFrame, useLoader } from "react-three-fiber"; import { useFrame, useLoader } from "react-three-fiber";
import * as THREE from "three"; import * as THREE from "three";
import orbSprite from "../../../static/sprite/orb.png"; import orbSprite from "../../../static/sprite/orb.png";
import { useMainSceneStore } from "../../../store"; import { useStore } from "../../../store";
// initialize outside the component otherwise it gets overwritten when it rerenders // initialize outside the component otherwise it gets overwritten when it rerenders
let orbIdx = 0; let orbIdx = 0;

View file

@ -1,11 +1,11 @@
import React, { createRef, MutableRefObject, useMemo } from "react"; import React, { createRef, MutableRefObject, useMemo, memo } from "react";
import * as THREE from "three"; import * as THREE from "three";
import { useFrame } from "react-three-fiber"; import { useFrame } from "react-three-fiber";
import AudioVisualizerColumn from "./AudioVisualizerColumn"; import AudioVisualizerColumn from "./AudioVisualizerColumn";
import { useMainSceneStore } from "../../../store"; import { useStore } from "../../../store";
const AudioVisualizer = () => { const AudioVisualizer = memo(() => {
const analyser = useMainSceneStore((state) => state.audioAnalyser); const analyser = useStore((state) => state.audioAnalyser);
const columnRefs = useMemo( const columnRefs = useMemo(
() => () =>
@ -84,6 +84,6 @@ const AudioVisualizer = () => {
))} ))}
</group> </group>
); );
}; });
export default AudioVisualizer; export default AudioVisualizer;

View file

@ -1,27 +1,27 @@
import React, {useEffect, useState} from "react"; import React, { useEffect, useState } from "react";
import {useIdleStore, useMainSceneStore, useSceneStore,} from "../../store"; import { useStore } from "../../store";
import {a, useSpring} from "@react-spring/three"; import { a, useSpring } from "@react-spring/three";
import dummy from "../../static/sprite/dummy.png"; import dummy from "../../static/sprite/dummy.png";
import * as THREE from "three"; import * as THREE from "three";
import {useLoader} from "react-three-fiber"; import { useLoader } from "react-three-fiber";
const Images = () => { const Images = () => {
const idleNodeImages = useIdleStore((state) => state.images); const idleNodeImages = useStore((state) => state.idleImages);
const nodeImages = useMainSceneStore( const nodeImages = useStore(
(state) => state.activeNode.image_table_indices (state) => state.activeNode.image_table_indices
); );
const currentScene = useSceneStore((state) => state.currentScene); const currentScene = useStore((state) => state.currentScene);
const [imageScaleY, setImageScaleY] = useState(3.75); const [imageScaleY, setImageScaleY] = useState(3.75);
const [sceneImages, setSceneImages] = useState([] as any); const [sceneImages, setSceneImages] = useState([] as any);
const [activeImage, setActiveImage] = useState<THREE.Texture>(); const [activeImage, setActiveImage] = useState<THREE.Texture>();
const currentSite = useMainSceneStore((state) => state.activeSite); const currentSite = useStore((state) => state.activeSite);
const dummyTex = useLoader(THREE.TextureLoader, dummy); const dummyTex = useLoader(THREE.TextureLoader, dummy);
const mediaPercentageElapsed = useMainSceneStore( const mediaPercentageElapsed = useStore(
(state) => state.mediaPercentageElapsed (state) => state.mediaPercentageElapsed
); );

View file

@ -1,10 +1,10 @@
import React, { useState } from "react"; import React, { memo, useState } from "react";
import * as THREE from "three"; import * as THREE from "three";
import { useFrame, useLoader } from "react-three-fiber"; import { useFrame, useLoader } from "react-three-fiber";
import lofSpriteSheet from "../../static/sprite/lof_spritesheet.png"; import lofSpriteSheet from "../../static/sprite/lof_spritesheet.png";
import { PlainAnimator } from "three-plain-animator/lib/plain-animator"; import { PlainAnimator } from "three-plain-animator/lib/plain-animator";
const Lof = () => { const Lof = memo(() => {
const lofTex: any = useLoader(THREE.TextureLoader, lofSpriteSheet); const lofTex: any = useLoader(THREE.TextureLoader, lofSpriteSheet);
const [animator] = useState(() => { const [animator] = useState(() => {
@ -18,10 +18,10 @@ const Lof = () => {
}); });
return ( return (
<sprite position={[-2, 1.8, -3]} scale={[0.8, 0.8, 0.8]}> <sprite position={[-2, 1.8, 0]} scale={[0.8, 0.8, 0.8]}>
<spriteMaterial attach="material" map={lofTex} /> <spriteMaterial attach="material" map={lofTex} />
</sprite> </sprite>
); );
}; });
export default Lof; export default Lof;

View file

@ -1,5 +1,5 @@
import React, { useMemo, useRef } from "react"; import React, { useMemo, useRef } from "react";
import { useMainSceneStore } from "../../store"; import { useStore } from "../../store";
import loadingBarContainer from "../../static/sprite/media_loading_bar_container.png"; import loadingBarContainer from "../../static/sprite/media_loading_bar_container.png";
import loadingBar from "../../static/sprite/media_loading_bar.png"; import loadingBar from "../../static/sprite/media_loading_bar.png";
import loadingBar10Perc from "../../static/sprite/media_loading_bar_10perc.png"; import loadingBar10Perc from "../../static/sprite/media_loading_bar_10perc.png";
@ -12,7 +12,7 @@ import { useFrame, useLoader } from "react-three-fiber";
import * as THREE from "three"; import * as THREE from "three";
const MediaLoadingBar = () => { const MediaLoadingBar = () => {
const mediaPercentageElapsed = useMainSceneStore( const mediaPercentageElapsed = useStore(
(state) => state.mediaPercentageElapsed (state) => state.mediaPercentageElapsed
); );
const loadingBarContainerTex = useLoader( const loadingBarContainerTex = useLoader(

View file

@ -6,12 +6,7 @@ import React, {
useRef, useRef,
useState, useState,
} from "react"; } from "react";
import { import { useStore } from "../../store";
useEndSceneStore,
useIdleStore,
useMainSceneStore,
useSceneStore,
} from "../../store";
import t from "../../static/webvtt/test.vtt"; import t from "../../static/webvtt/test.vtt";
import endroll from "../../static/movie/ENDROLL1.STR[0].webm"; import endroll from "../../static/movie/ENDROLL1.STR[0].webm";
import xa0001 from "../../static/audio/a/Xa0001.mp4"; import xa0001 from "../../static/audio/a/Xa0001.mp4";
@ -20,34 +15,34 @@ import xa0006 from "../../static/audio/a/Xa0006.mp4";
const MediaPlayer = () => { const MediaPlayer = () => {
const [mediaSource, setMediaSource] = useState<any>(); const [mediaSource, setMediaSource] = useState<any>();
const currentScene = useSceneStore((state) => state.currentScene); const currentScene = useStore((state) => state.currentScene);
const setScene = useSceneStore((state) => state.setScene); const setScene = useStore((state) => state.setScene);
const setPercentageElapsed = useMainSceneStore( const setPercentageElapsed = useStore(
(state) => state.setPercentageElapsed (state) => state.setPercentageElapsed
); );
const idleMedia = useIdleStore((state) => state.media); const idleMedia = useStore((state) => state.idleMedia);
const nodeMedia = useMainSceneStore((state) => state.activeNode.media_file); const nodeMedia = useStore((state) => state.activeNode.media_file);
const triggersFinalVideo = useMainSceneStore( const triggersFinalVideo = useStore(
(state) => state.activeNode.triggers_final_video (state) => state.activeNode.triggers_final_video
); );
const requestRef = useRef(); const requestRef = useRef();
const videoRef = createRef<HTMLVideoElement>(); const videoRef = createRef<HTMLVideoElement>();
const currentSite = useMainSceneStore((state) => state.activeSite); const currentSite = useStore((state) => state.activeSite);
// end scene specific stuff // end scene specific stuff
const endMediaPlayedCount = useEndSceneStore( const endMediaPlayedCount = useStore(
(state) => state.mediaPlayedCount (state) => state.endMediaPlayedCount
); );
const incrementEndMediaPlayedCount = useEndSceneStore( const incrementEndMediaPlayedCount = useStore(
(state) => state.incrementMediaPlayedCount (state) => state.incrementEndMediaPlayedCount
); );
const resetEndMediaPlayedCount = useEndSceneStore( const resetEndMediaPlayedCount = useStore(
(state) => state.resetMediaPlayedCount (state) => state.resetEndMediaPlayedCount
); );
const updateTime = useCallback(() => { const updateTime = useCallback(() => {
@ -60,7 +55,7 @@ const MediaPlayer = () => {
const duration = videoRef.current.duration; const duration = videoRef.current.duration;
const percentageElapsed = Math.floor((timeElapsed / duration) * 100); const percentageElapsed = Math.floor((timeElapsed / duration) * 100);
if (percentageElapsed % 5 === 0) { if (percentageElapsed % 5 === 0 && percentageElapsed !== 0) {
setPercentageElapsed(percentageElapsed); setPercentageElapsed(percentageElapsed);
if (percentageElapsed === 100) { if (percentageElapsed === 100) {
videoRef.current.currentTime = 0; videoRef.current.currentTime = 0;

View file

@ -1,11 +1,8 @@
import React, { useMemo } from "react"; import React, { useCallback, useMemo, memo } from "react";
import TriangularPrism from "./LeftSide/TriangularPrism"; import TriangularPrism from "./LeftSide/TriangularPrism";
import Cube from "./LeftSide/Cube"; import Cube from "./LeftSide/Cube";
import { useSpring, a } from "@react-spring/three"; import { useSpring, a } from "@react-spring/three";
import { useStore } from "../../../store";
type LeftSideProps = {
activeMediaComponent: string;
};
export type ShapeProps = { export type ShapeProps = {
position: number[]; position: number[];
@ -13,9 +10,25 @@ export type ShapeProps = {
active?: boolean; active?: boolean;
}; };
const LeftSide = (props: LeftSideProps) => { const LeftSide = memo(() => {
const cubesActive = props.activeMediaComponent === "exit"; const activeMediaComponent = useStore(
const trianglesActive = props.activeMediaComponent === "play"; useCallback(
(state) =>
state.mediaComponentMatrix[state.mediaComponentMatrixIndices.sideIdx][
state.mediaComponentMatrixIndices.sideIdx === 0
? state.mediaComponentMatrixIndices.leftSideIdx
: state.mediaComponentMatrixIndices.rightSideIdx
],
[]
)
);
const cubesActive = useMemo(() => activeMediaComponent === "exit", [
activeMediaComponent,
]);
const trianglesActive = useMemo(() => activeMediaComponent === "play", [
activeMediaComponent,
]);
const groupSpringConfig = useMemo(() => ({ duration: 500 }), []); const groupSpringConfig = useMemo(() => ({ duration: 500 }), []);
const groupSpringFinalDest = useMemo( const groupSpringFinalDest = useMemo(
@ -100,6 +113,6 @@ const LeftSide = (props: LeftSideProps) => {
</a.group> </a.group>
</group> </group>
); );
}; });
export default LeftSide; export default LeftSide;

View file

@ -2,10 +2,10 @@ import { useFrame, useLoader } from "react-three-fiber";
import * as THREE from "three"; import * as THREE from "three";
import grayTextureFile from "../../../../static/sprite/gray_box.png"; import grayTextureFile from "../../../../static/sprite/gray_box.png";
import darkGrayTextureFile from "../../../../static/sprite/dark_gray_box.png"; import darkGrayTextureFile from "../../../../static/sprite/dark_gray_box.png";
import React, { useRef } from "react"; import React, {memo, useRef} from "react";
import { ShapeProps } from "../LeftSide"; import { ShapeProps } from "../LeftSide";
const Cube = (props: ShapeProps) => { const Cube = memo((props: ShapeProps) => {
const grayTex = useLoader(THREE.TextureLoader, grayTextureFile); const grayTex = useLoader(THREE.TextureLoader, grayTextureFile);
const darkGrayTex = useLoader(THREE.TextureLoader, darkGrayTextureFile); const darkGrayTex = useLoader(THREE.TextureLoader, darkGrayTextureFile);
@ -34,6 +34,6 @@ const Cube = (props: ShapeProps) => {
/> />
</mesh> </mesh>
); );
}; });
export default Cube; export default Cube;

View file

@ -2,7 +2,7 @@ import { useFrame, useLoader } from "react-three-fiber";
import * as THREE from "three"; import * as THREE from "three";
import grayTextureFile from "../../../../static/sprite/gray_box.png"; import grayTextureFile from "../../../../static/sprite/gray_box.png";
import darkGrayTextureFile from "../../../../static/sprite/dark_gray_box.png"; import darkGrayTextureFile from "../../../../static/sprite/dark_gray_box.png";
import React, { useRef } from "react"; import React, { memo, useRef } from "react";
import { ShapeProps } from "../LeftSide"; import { ShapeProps } from "../LeftSide";
import { GLTF, GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader"; import { GLTF, GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
@ -15,7 +15,7 @@ type GLTFResult = GLTF & {
}; };
}; };
const TriangularPrism = (props: ShapeProps) => { const TriangularPrism = memo((props: ShapeProps) => {
const grayTex = useLoader(THREE.TextureLoader, grayTextureFile); const grayTex = useLoader(THREE.TextureLoader, grayTextureFile);
const darkGrayTex = useLoader(THREE.TextureLoader, darkGrayTextureFile); const darkGrayTex = useLoader(THREE.TextureLoader, darkGrayTextureFile);
@ -33,7 +33,7 @@ const TriangularPrism = (props: ShapeProps) => {
return ( return (
<mesh <mesh
scale={[0.45/2, 0.5/2, 0.45/2]} scale={[0.45 / 2, 0.5 / 2, 0.45 / 2]}
position={props.position as [number, number, number]} position={props.position as [number, number, number]}
rotation-y={0.15} rotation-y={0.15}
rotation-z={-0.02} rotation-z={-0.02}
@ -46,6 +46,6 @@ const TriangularPrism = (props: ShapeProps) => {
/> />
</mesh> </mesh>
); );
}; });
export default TriangularPrism; export default TriangularPrism;

View file

@ -1,26 +1,21 @@
import React, { useCallback, useMemo } from "react"; import React, { memo, useCallback, useMemo } from "react";
import { useMainSceneStore, useMediaWordStore } from "../../../store"; import { useStore } from "../../../store";
import Word from "./RightSide/Word"; import Word from "./RightSide/Word";
import { a, useSpring } from "@react-spring/three"; import { a, useSpring } from "@react-spring/three";
import word_position_states from "../../../resources/word_position_states.json"; import word_position_states from "../../../resources/word_position_states.json";
import * as THREE from "three"; import * as THREE from "three";
import Lof from "../Lof";
type RightSideProps = { const RightSide = memo(() => {
activeMediaComponent: string; const words = useStore((state) => state.activeNode.words);
};
const RightSide = (props: RightSideProps) => { const wordPositionState = useStore(
const words = useMainSceneStore((state) => state.activeNode.words);
const posStateIdx = useMediaWordStore(
(state) => state.posStateIdx
).toString();
const wordPositionState = useMediaWordStore(
useCallback( useCallback(
() => (state) =>
word_position_states[posStateIdx as keyof typeof word_position_states], word_position_states[
[posStateIdx] state.mediaWordPosStateIdx.toString() as keyof typeof word_position_states
],
[]
) )
); );
@ -45,8 +40,21 @@ const RightSide = (props: RightSideProps) => {
[] []
); );
const activeMediaComponent = useStore(
useCallback(
(state) =>
state.mediaComponentMatrix[state.mediaComponentMatrixIndices.sideIdx][
state.mediaComponentMatrixIndices.sideIdx === 0
? state.mediaComponentMatrixIndices.leftSideIdx
: state.mediaComponentMatrixIndices.rightSideIdx
],
[]
)
);
return ( return (
<group position={[0, 0, -3]}> <group position={[0, 0, -3]}>
<Lof />
<a.group <a.group
position-x={wordPositionStateSpring.crossPosX} position-x={wordPositionStateSpring.crossPosX}
position-y={wordPositionStateSpring.crossPosY} position-y={wordPositionStateSpring.crossPosY}
@ -74,22 +82,22 @@ const RightSide = (props: RightSideProps) => {
word={words[1]} word={words[1]}
posX={wordPositionStateSpring.fstWordPosX} posX={wordPositionStateSpring.fstWordPosX}
posY={wordPositionStateSpring.fstWordPosY} posY={wordPositionStateSpring.fstWordPosY}
active={props.activeMediaComponent === "fstWord"} active={activeMediaComponent === "fstWord"}
/> />
<Word <Word
word={words[2]} word={words[2]}
posX={wordPositionStateSpring.sndWordPosX} posX={wordPositionStateSpring.sndWordPosX}
posY={wordPositionStateSpring.sndWordPosY} posY={wordPositionStateSpring.sndWordPosY}
active={props.activeMediaComponent === "sndWord"} active={activeMediaComponent === "sndWord"}
/> />
<Word <Word
word={words[3]} word={words[3]}
posX={wordPositionStateSpring.thirdWordPosX} posX={wordPositionStateSpring.thirdWordPosX}
posY={wordPositionStateSpring.thirdWordPosY} posY={wordPositionStateSpring.thirdWordPosY}
active={props.activeMediaComponent === "thirdWord"} active={activeMediaComponent === "thirdWord"}
/> />
</group> </group>
); );
}; });
export default RightSide; export default RightSide;

View file

@ -1,4 +1,4 @@
import React from "react"; import React, { memo } from "react";
import ssknBackground from "../../static/sprite/sskn_background.png"; import ssknBackground from "../../static/sprite/sskn_background.png";
import ssknBackgroundText from "../../static/sprite/sskn_background_text.png"; import ssknBackgroundText from "../../static/sprite/sskn_background_text.png";
import { useLoader } from "react-three-fiber"; import { useLoader } from "react-three-fiber";
@ -6,7 +6,7 @@ import * as THREE from "three";
import ssknTopLabel from "../../static/sprite/sskn_top_label.png"; import ssknTopLabel from "../../static/sprite/sskn_top_label.png";
import ssknDango from "../../static/sprite/sskn_dango.png"; import ssknDango from "../../static/sprite/sskn_dango.png";
const SSknBackground = () => { const SSknBackground = memo(() => {
const ssknBackgroundTex = useLoader(THREE.TextureLoader, ssknBackground); const ssknBackgroundTex = useLoader(THREE.TextureLoader, ssknBackground);
const ssknBackgroundTextTex = useLoader( const ssknBackgroundTextTex = useLoader(
THREE.TextureLoader, THREE.TextureLoader,
@ -41,6 +41,6 @@ const SSknBackground = () => {
</sprite> </sprite>
</> </>
); );
}; });
export default SSknBackground; export default SSknBackground;

View file

@ -1,4 +1,4 @@
import React from "react"; import React, { memo } from "react";
import ssknOk from "../../static/sprite/sskn_ok.png"; import ssknOk from "../../static/sprite/sskn_ok.png";
import ssknOkInactive from "../../static/sprite/sskn_ok_inactive.png"; import ssknOkInactive from "../../static/sprite/sskn_ok_inactive.png";
import ssknCancel from "../../static/sprite/sskn_cancel.png"; import ssknCancel from "../../static/sprite/sskn_cancel.png";
@ -8,7 +8,6 @@ import ssknArrow from "../../static/sprite/sskn_arrow.png";
import ssknTextWrapper from "../../static/sprite/sskn_text_wrapper.png"; import ssknTextWrapper from "../../static/sprite/sskn_text_wrapper.png";
import ssknTextWrapperInactive from "../../static/sprite/sskn_text_wrapper_inactive.png"; import ssknTextWrapperInactive from "../../static/sprite/sskn_text_wrapper_inactive.png";
import ssknLine from "../../static/sprite/sskn_line.png"; import ssknLine from "../../static/sprite/sskn_line.png";
import ssknLoadingBar from "../../static/sprite/SSkn_loading_bar.png";
import { useLoader } from "react-three-fiber"; import { useLoader } from "react-three-fiber";
import * as THREE from "three"; import * as THREE from "three";
import SSknLoadingBar from "./SSknLoadingBar"; import SSknLoadingBar from "./SSknLoadingBar";
@ -18,7 +17,7 @@ type SSknHUDProps = {
loading: boolean; loading: boolean;
}; };
const SSknHUD = (props: SSknHUDProps) => { const SSknHUD = memo((props: SSknHUDProps) => {
const ssknOkTex = useLoader(THREE.TextureLoader, ssknOk); const ssknOkTex = useLoader(THREE.TextureLoader, ssknOk);
const ssknOkInactiveTex = useLoader(THREE.TextureLoader, ssknOkInactive); const ssknOkInactiveTex = useLoader(THREE.TextureLoader, ssknOkInactive);
const ssknCancelTex = useLoader(THREE.TextureLoader, ssknCancel); const ssknCancelTex = useLoader(THREE.TextureLoader, ssknCancel);
@ -102,6 +101,6 @@ const SSknHUD = (props: SSknHUDProps) => {
</sprite> </sprite>
</> </>
); );
}; });
export default SSknHUD; export default SSknHUD;

View file

@ -1,9 +1,9 @@
import React, { useRef } from "react"; import React, { memo, useRef } from "react";
import ssknIcon from "../../static/sprite/SSkn_icon.png"; import ssknIcon from "../../static/sprite/SSkn_icon.png";
import { useFrame, useLoader } from "react-three-fiber"; import { useFrame, useLoader } from "react-three-fiber";
import * as THREE from "three"; import * as THREE from "three";
const SSknIcon = () => { const SSknIcon = memo(() => {
const ssknIconTex = useLoader(THREE.TextureLoader, ssknIcon); const ssknIconTex = useLoader(THREE.TextureLoader, ssknIcon);
const ssknIconRef = useRef<THREE.Object3D>(); const ssknIconRef = useRef<THREE.Object3D>();
const ssknIconShadowRef = useRef<THREE.Object3D>(); const ssknIconShadowRef = useRef<THREE.Object3D>();
@ -49,6 +49,6 @@ const SSknIcon = () => {
</mesh> </mesh>
</> </>
); );
}; });
export default SSknIcon; export default SSknIcon;

View file

@ -1,31 +1,81 @@
import React from "react"; import React, { memo, useCallback, useEffect, useState } from "react";
import { useMediaBigTextStore } from "../../store"; import { useStore } from "../../store";
import { a, useTrail } from "@react-spring/three"; import { a, useTrail } from "@react-spring/three";
import BigLetter from "./BigLetter"; import BigLetter from "./BigLetter";
const MediaYellowTextAnimator = () => { const MediaYellowTextAnimator = memo(() => {
const transformState = useMediaBigTextStore((state) => state.transformState); const [lastLeftComponent, setLastLeftComponent] = useState("play");
const textArr = useMediaBigTextStore((state) => state.text).split(""); const [textArr, setTextArr] = useState("Play".split(""));
const [posY, setPosY] = useState(0.05);
const [xOffset, setXOffset] = useState(0);
const trail = useTrail(textArr.length, { const trail = useTrail(textArr.length, {
posX: transformState.posX, posY: posY,
posY: transformState.posY,
config: { duration: 280 }, config: { duration: 280 },
}); });
const activeMediaComponent = useStore(
useCallback(
(state) =>
state.mediaComponentMatrix[state.mediaComponentMatrixIndices.sideIdx][
state.mediaComponentMatrixIndices.sideIdx === 0
? state.mediaComponentMatrixIndices.leftSideIdx
: state.mediaComponentMatrixIndices.rightSideIdx
],
[]
)
);
useEffect(() => {
if (
(activeMediaComponent === "play" || activeMediaComponent === "exit") &&
activeMediaComponent !== lastLeftComponent
) {
setLastLeftComponent(activeMediaComponent);
setXOffset(-1);
setTimeout(() => {
if (activeMediaComponent === "play") {
setPosY(0.05);
} else {
setPosY(-0.08);
}
}, 400);
setTimeout(() => {
setTextArr(
(
activeMediaComponent.charAt(0).toUpperCase() +
activeMediaComponent.slice(1)
).split("")
);
}, 1000);
setTimeout(() => {
setXOffset(0);
}, 1200);
}
}, [activeMediaComponent, lastLeftComponent]);
useEffect(() => {
return () => {
setLastLeftComponent("play");
};
}, []);
return ( return (
<group position={[0, 0, 10]}> <group position={[0, 0, 10]}>
{trail.map(({ posX, posY }, idx) => ( {trail.map(({ posY }, idx) => (
<a.group <a.group
key={idx} key={idx}
position-x={posX}
position-y={posY} position-y={posY}
position-x={-0.8}
position-z={-8.7} position-z={-8.7}
scale={[0.04, 0.06, 0.04]} scale={[0.04, 0.06, 0.04]}
> >
<BigLetter <BigLetter
color={"yellow"} color={"yellow"}
xOffset={transformState.xOffset} xOffset={xOffset}
letter={textArr[idx]} letter={textArr[idx]}
letterIdx={idx} letterIdx={idx}
key={idx} key={idx}
@ -34,6 +84,6 @@ const MediaYellowTextAnimator = () => {
))} ))}
</group> </group>
); );
}; });
export default MediaYellowTextAnimator; export default MediaYellowTextAnimator;

View file

@ -6,7 +6,7 @@ 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";
import { a, useSpring } from "@react-spring/three"; import { a, useSpring } from "@react-spring/three";
import React, { useMemo, memo } from "react"; import React, { useMemo, memo } from "react";
import { useMainSceneStore } from "../../store"; import { useStore } from "../../store";
const StaticBigLetter = memo( const StaticBigLetter = memo(
(props: { (props: {
@ -20,7 +20,7 @@ const StaticBigLetter = memo(
colIdx?: number; colIdx?: number;
intro?: boolean; intro?: boolean;
}) => { }) => {
const exitAnimation = useMainSceneStore( const exitAnimation = useStore(
(state) => state.pauseExitAnimation (state) => state.pauseExitAnimation
); );

View file

@ -1,24 +1,24 @@
import React, { useEffect, useRef } from "react"; import React, { useEffect, useRef } from "react";
import { useMainSceneStore } from "../../store"; import { useStore } from "../../store";
import { a, 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 xOffset = useMainSceneStore((state) => state.bigTextXOffset); const xOffset = useStore((state) => state.bigTextXOffset);
const visible = useMainSceneStore((state) => state.bigTextVisible); const visible = useStore((state) => state.bigTextVisible);
const color = useMainSceneStore((state) => state.bigTextColor); const color = useStore((state) => state.bigTextColor);
const textRef = useRef(useMainSceneStore.getState().bigText.split("")); const textRef = useRef(useStore.getState().bigText.split(""));
const [trail, set] = useTrail(textRef.current.length, () => ({ const [trail, set] = useTrail(textRef.current.length, () => ({
posX: useMainSceneStore.getState().bigTextPos[0], posX: useStore.getState().bigTextPos[0],
posY: useMainSceneStore.getState().bigTextPos[1], posY: useStore.getState().bigTextPos[1],
config: { duration: 280 }, config: { duration: 280 },
})); }));
useEffect( useEffect(
() => () =>
useMainSceneStore.subscribe( useStore.subscribe(
(state) => { (state) => {
textRef.current = (state as any).bigText.split(""); textRef.current = (state as any).bigText.split("");
}, },
@ -28,7 +28,7 @@ const YellowTextRenderer = (props: { visible?: boolean }) => {
); );
useEffect(() => { useEffect(() => {
useMainSceneStore.subscribe(set, (state) => ({ useStore.subscribe(set, (state) => ({
posX: state.bigTextPos[0], posX: state.bigTextPos[0],
posY: state.bigTextPos[1], posY: state.bigTextPos[1],
})); }));

View file

@ -1,6 +1,6 @@
import { useCallback, useEffect } from "react"; import { useCallback, useEffect } from "react";
import { StateManagerProps } from "../EventManager"; import { StateManagerProps } from "../EventManager";
import { useAuthorizeUserStore, useBootStore } from "../../../store"; import { useAuthorizeUserStore } from "../../../store";
const BootAuthorizeUserManager = (props: StateManagerProps) => { const BootAuthorizeUserManager = (props: StateManagerProps) => {
const setActiveLetterTextureOffset = useAuthorizeUserStore( const setActiveLetterTextureOffset = useAuthorizeUserStore(

View file

@ -1,13 +1,10 @@
import { useCallback, useEffect } from "react"; import { useCallback, useEffect } from "react";
import { StateManagerProps } from "../EventManager"; import { StateManagerProps } from "../EventManager";
import { useBootStore } from "../../../store"; import { useStore } from "../../../store";
const BootComponentManager = (props: StateManagerProps) => { const BootComponentManager = (props: StateManagerProps) => {
const toggleComponentMatrixIdx = useBootStore( const toggleComponentMatrixIdx = useStore(
(state) => state.toggleComponentMatrixIdx (state) => state.toggleBootComponentMatrixIdx
);
const setAuthorizeUserMatrixIdx = useBootStore(
(state) => state.setAuthorizeUserMatrixIdx
); );
const dispatchObject = useCallback( const dispatchObject = useCallback(
@ -29,13 +26,9 @@ const BootComponentManager = (props: StateManagerProps) => {
case "authorize_user_up": case "authorize_user_up":
case "authorize_user_left": case "authorize_user_left":
case "authorize_user_down": case "authorize_user_down":
return {
action: setAuthorizeUserMatrixIdx,
value: newAuthorizeUserMatrixIdx,
};
} }
}, },
[setAuthorizeUserMatrixIdx, toggleComponentMatrixIdx] [toggleComponentMatrixIdx]
); );
useEffect(() => { useEffect(() => {

View file

@ -1,5 +1,5 @@
import { useCallback, useEffect } from "react"; import { useCallback, useEffect } from "react";
import { useMainSceneStore, useSiteSaveStore } from "../../../store"; import { useStore, useSiteSaveStore } from "../../../store";
import { StateManagerProps } from "../EventManager"; import { StateManagerProps } from "../EventManager";
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";
@ -18,21 +18,21 @@ const GameLoader = (props: StateManagerProps) => {
// const setActiveLevel = useLevelStore((state) => state.setActiveLevel); // const setActiveLevel = useLevelStore((state) => state.setActiveLevel);
// big text setter // big text setter
const setBigTexPos = useMainSceneStore((state) => state.setBigTextPos); const setBigTexPos = useStore((state) => state.setBigTextPos);
const setBigText = useMainSceneStore((state) => state.setBigText); const setBigText = useStore((state) => state.setBigText);
// site setter // site setter
const setSiteRot = useMainSceneStore((state) => state.setSiteRot); const setSiteRot = useStore((state) => state.setSiteRot);
const setCurrentSite = useMainSceneStore((state) => state.setActiveSite); const setCurrentSite = useStore((state) => state.setActiveSite);
// node setter // node setter
const setActiveNode = useMainSceneStore((state) => state.setNode); const setActiveNode = useStore((state) => state.setNode);
const setNodeMatrixIndices = useMainSceneStore( const setNodeMatrixIndices = useStore(
(state) => state.setNodeMatrixIndices (state) => state.setNodeMatrixIndices
); );
// node hud setter // node hud setter
const setHud = useMainSceneStore((state) => state.setHud); const setHud = useStore((state) => state.setHud);
const changeSite = useCallback((site: string) => { const changeSite = useCallback((site: string) => {
// load new site // load new site

View file

@ -1,10 +1,10 @@
import { useCallback, useEffect } from "react"; import { useCallback, useEffect } from "react";
import { StateManagerProps } from "../EventManager"; import { StateManagerProps } from "../EventManager";
import { useMainSceneStore, useSceneStore } from "../../../store"; import { useStore } from "../../../store";
const SceneManager = (props: StateManagerProps) => { const SceneManager = (props: StateManagerProps) => {
const setScene = useSceneStore((state) => state.setScene); const setScene = useStore((state) => state.setScene);
const setMainSceneIntro = useMainSceneStore((state) => state.setIntro); const setMainSceneIntro = useStore((state) => state.setIntro);
const dispatchObject = useCallback( const dispatchObject = useCallback(
(eventState: { event: string; scene: string }) => { (eventState: { event: string; scene: string }) => {

View file

@ -1,10 +1,10 @@
import { useCallback, useEffect } from "react"; import { useCallback, useEffect } from "react";
import { StateManagerProps } from "../EventManager"; import { StateManagerProps } from "../EventManager";
import { useBootStore, useMainSceneStore } from "../../../store"; import { useStore } from "../../../store";
const SubsceneManager = (props: StateManagerProps) => { const SubsceneManager = (props: StateManagerProps) => {
const setMainSubscene = useMainSceneStore((state) => state.setSubscene); const setMainSubscene = useStore((state) => state.setMainSubscene);
const setBootSubscene = useBootStore((state) => state.setSubscene); const setBootSubscene = useStore((state) => state.setBootSubscene);
const dispatchObject = useCallback( const dispatchObject = useCallback(
(eventState: { event: string }) => { (eventState: { event: string }) => {
@ -62,7 +62,7 @@ const SubsceneManager = (props: StateManagerProps) => {
if (dispatchedObject) { if (dispatchedObject) {
setTimeout(() => { setTimeout(() => {
dispatchedObject.action(dispatchedObject.value); dispatchedObject.action(dispatchedObject.value as any);
}, dispatchedObject.delay); }, dispatchedObject.delay);
} }
} }

View file

@ -1,5 +1,5 @@
import React, { useCallback, useEffect, useRef, useState } from "react"; import React, { useCallback, useEffect, useRef, useState } from "react";
import { useMainSceneStore } from "../../store"; import { useStore } from "../../store";
import handleMainSceneEvent from "../mainSceneEventHandler"; import handleMainSceneEvent from "../mainSceneEventHandler";
import { getKeyCodeAssociation } from "../utils/keyPressUtils"; import { getKeyCodeAssociation } from "../utils/keyPressUtils";
import NodeManager from "./MainSceneManagers/NodeManager"; import NodeManager from "./MainSceneManagers/NodeManager";
@ -24,25 +24,25 @@ type MainSceneEventManagerProps = {
const MainSceneEventManager = (props: MainSceneEventManagerProps) => { const MainSceneEventManager = (props: MainSceneEventManagerProps) => {
// all the possible context needed to calculate new state // all the possible context needed to calculate new state
const currentSite = useMainSceneStore((state) => state.activeSite); const currentSite = useStore((state) => state.activeSite);
const activeNodeId = useMainSceneStore((state) => state.activeNode.id); const activeNodeId = useStore((state) => state.activeNode.id);
const nodeMatrixIndices = useMainSceneStore( const nodeMatrixIndices = useStore(
(state) => state.activeNodeMatrixIndices (state) => state.activeNodeMatrixIndices
); );
const siteRotY = useMainSceneStore((state) => state.siteRot[1]); const siteRotY = useStore((state) => state.siteRot[1]);
const sitePosY = useMainSceneStore((state) => state.sitePos[1]); const sitePosY = useStore((state) => state.sitePos[1]);
const activeLevel = useMainSceneStore((state) => state.activeLevel); const activeLevel = useStore((state) => state.activeLevel);
const mainSubscene = useMainSceneStore((state) => state.subscene); const mainSubscene = useStore((state) => state.mainSubscene);
const selectedLevel = useMainSceneStore((state) => state.selectedLevel); const selectedLevel = useStore((state) => state.selectedLevel);
const pauseMatrixIdx = useMainSceneStore( const pauseMatrixIdx = useStore(
(state) => state.pauseComponentMatrixIdx (state) => state.pauseComponentMatrixIdx
); );
const activePauseComponent = useMainSceneStore( const activePauseComponent = useStore(
useCallback((state) => state.pauseComponentMatrix[pauseMatrixIdx], [ useCallback((state) => state.pauseComponentMatrix[pauseMatrixIdx], [
pauseMatrixIdx, pauseMatrixIdx,
]) ])
); );
const gameProgress = useMainSceneStore((state) => state.gameProgress); const gameProgress = useStore((state) => state.gameProgress);
const timePassedSinceLastKeyPress = useRef(-1); const timePassedSinceLastKeyPress = useRef(-1);

View file

@ -1,15 +1,15 @@
import { useCallback, useEffect } from "react"; import { useCallback, useEffect } from "react";
import { useMainSceneStore } from "../../../store"; import { useStore } from "../../../store";
import { NodeDataType } from "../../../components/MainScene/SyncedComponents/Site"; import { NodeDataType } from "../../../components/MainScene/SyncedComponents/Site";
import { StateManagerProps } from "../EventManager"; import { StateManagerProps } from "../EventManager";
import { HUDType } from "../../../components/MainScene/SyncedComponents/HUD"; import { HUDType } from "../../../components/MainScene/SyncedComponents/HUD";
const BigTextManager = (props: StateManagerProps) => { const BigTextManager = (props: StateManagerProps) => {
const setText = useMainSceneStore((state) => state.setBigText); const setText = useStore((state) => state.setBigText);
const setColor = useMainSceneStore((state) => state.setBigTextColor); const setColor = useStore((state) => state.setBigTextColor);
const setVisible = useMainSceneStore((state) => state.setBigTextVisible); const setVisible = useStore((state) => state.setBigTextVisible);
const setXOffset = useMainSceneStore((state) => state.setBigTextXOffset); const setXOffset = useStore((state) => state.setBigTextXOffset);
const setPos = useMainSceneStore((state) => state.setBigTextPos); const setPos = useStore((state) => state.setBigTextPos);
const animateYellowTextWithMove = useCallback( const animateYellowTextWithMove = useCallback(
( (

View file

@ -3,11 +3,11 @@ import { StateManagerProps } from "../EventManager";
import { SiteType } from "../../../components/MainScene/SyncedComponents/Site"; import { SiteType } from "../../../components/MainScene/SyncedComponents/Site";
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 { useIdleStore } from "../../../store"; import { useStore } from "../../../store";
const IdleManager = (props: StateManagerProps) => { const IdleManager = (props: StateManagerProps) => {
const setImages = useIdleStore((state) => state.setImages); const setImages = useStore((state) => state.setIdleImages);
const setMedia = useIdleStore((state) => state.setMedia); const setMedia = useStore((state) => state.setIdleMedia);
const playIdleMedia = useCallback( const playIdleMedia = useCallback(
(site: string) => { (site: string) => {

View file

@ -1,9 +1,9 @@
import { useCallback, useEffect } from "react"; import { useCallback, useEffect } from "react";
import { useMainSceneStore } from "../../../store"; import { useStore } from "../../../store";
import { StateManagerProps } from "../EventManager"; import { StateManagerProps } from "../EventManager";
const LainManager = (props: StateManagerProps) => { const LainManager = (props: StateManagerProps) => {
const setLainMoveState = useMainSceneStore((state) => state.setLainMoveState); const setLainMoveState = useStore((state) => state.setLainMoveState);
const dispatchObject = useCallback( const dispatchObject = useCallback(
(eventState: { event: string }) => { (eventState: { event: string }) => {

View file

@ -1,9 +1,9 @@
import { useCallback, useEffect } from "react"; import { useCallback, useEffect } from "react";
import { StateManagerProps } from "../EventManager"; import { StateManagerProps } from "../EventManager";
import { useMainSceneStore } from "../../../store"; import { useStore } from "../../../store";
const LevelManager = (props: StateManagerProps) => { const LevelManager = (props: StateManagerProps) => {
const setActiveLevel = useMainSceneStore((state) => state.setActiveLevel); const setActiveLevel = useStore((state) => state.setActiveLevel);
const dispatchObject = useCallback( const dispatchObject = useCallback(
(eventState: { event: string; level: string }) => { (eventState: { event: string; level: string }) => {

View file

@ -1,9 +1,9 @@
import { useCallback, useEffect } from "react"; import { useCallback, useEffect } from "react";
import { StateManagerProps } from "../EventManager"; import { StateManagerProps } from "../EventManager";
import { useMainSceneStore } from "../../../store"; import { useStore } from "../../../store";
const LevelSelectionManager = (props: StateManagerProps) => { const LevelSelectionManager = (props: StateManagerProps) => {
const setSelectedLevel = useMainSceneStore((state) => state.setSelectedLevel); const setSelectedLevel = useStore((state) => state.setSelectedLevel);
const dispatchObject = useCallback( const dispatchObject = useCallback(
(eventState: { event: string; selectedLevelIdx: number }) => { (eventState: { event: string; selectedLevelIdx: number }) => {

View file

@ -1,18 +1,18 @@
import { useCallback, useEffect } from "react"; import { useCallback, useEffect } from "react";
import { useMainSceneStore } from "../../../store"; import { useStore } from "../../../store";
const MiddleRingManager = (props: any) => { const MiddleRingManager = (props: any) => {
const setRot = useMainSceneStore((state) => state.setMiddleRingRot); const setRot = useStore((state) => state.setMiddleRingRot);
const setPos = useMainSceneStore((state) => state.setMiddleRingPos); const setPos = useStore((state) => state.setMiddleRingPos);
const setRotating = useMainSceneStore((state) => state.setMiddleRingRotating); const setRotating = useStore((state) => state.setMiddleRingRotating);
const setNoiseAmp = useMainSceneStore((state) => state.setMiddleRingNoiseAmp); const setNoiseAmp = useStore((state) => state.setMiddleRingNoiseAmp);
const setWobbleAmp = useMainSceneStore( const setWobbleAmp = useStore(
(state) => state.setMiddleRingWobbleAmp (state) => state.setMiddleRingWobbleAmp
); );
const setFakeRingVisible = useMainSceneStore( const setFakeRingVisible = useStore(
(state) => state.setFakeMiddleRingVisible (state) => state.setFakeMiddleRingVisible
); );
const setPartSeparatorVal = useMainSceneStore( const setPartSeparatorVal = useStore(
(state) => state.setMiddleRingPartSeparatorVal (state) => state.setMiddleRingPartSeparatorVal
); );

View file

@ -1,11 +1,11 @@
import { useCallback, useEffect } from "react"; import { useCallback, useEffect } from "react";
import { useMainSceneStore } from "../../../store"; import { useStore } from "../../../store";
import { StateManagerProps } from "../EventManager"; import { StateManagerProps } from "../EventManager";
import {HUDType} from "../../../components/MainScene/SyncedComponents/HUD"; import {HUDType} from "../../../components/MainScene/SyncedComponents/HUD";
const NodeHUDManager = (props: StateManagerProps) => { const NodeHUDManager = (props: StateManagerProps) => {
const set = useMainSceneStore((state) => state.setHud); const set = useStore((state) => state.setHud);
const toggleActive = useMainSceneStore((state) => state.toggleHudActive); const toggleActive = useStore((state) => state.toggleHudActive);
const moveAndChangeNode = useCallback( const moveAndChangeNode = useCallback(
(hud: HUDType) => { (hud: HUDType) => {

View file

@ -1,14 +1,14 @@
import { useCallback, useEffect } from "react"; import { useCallback, useEffect } from "react";
import { useMainSceneStore } from "../../../store"; import { useStore } from "../../../store";
import { StateManagerProps } from "../EventManager"; import { StateManagerProps } from "../EventManager";
import { NodeDataType } from "../../../components/MainScene/SyncedComponents/Site"; import { NodeDataType } from "../../../components/MainScene/SyncedComponents/Site";
const NodeManager = (props: StateManagerProps) => { const NodeManager = (props: StateManagerProps) => {
const setActiveNode = useMainSceneStore((state) => state.setNode); const setActiveNode = useStore((state) => state.setNode);
const setActiveNodePos = useMainSceneStore((state) => state.setNodePos); const setActiveNodePos = useStore((state) => state.setNodePos);
const setActiveNodeRot = useMainSceneStore((state) => state.setNodeRot); const setActiveNodeRot = useStore((state) => state.setNodeRot);
const setActiveNodeState = useMainSceneStore((state) => state.setNodeState); const setActiveNodeState = useStore((state) => state.setNodeState);
const setNodeMatrixIndices = useMainSceneStore( const setNodeMatrixIndices = useStore(
(state) => state.setNodeMatrixIndices (state) => state.setNodeMatrixIndices
); );

View file

@ -1,12 +1,12 @@
import { useCallback, useEffect } from "react"; import { useCallback, useEffect } from "react";
import { StateManagerProps } from "../EventManager"; import { StateManagerProps } from "../EventManager";
import { useMainSceneStore } from "../../../store"; import { useStore } from "../../../store";
const PauseComponentManager = (props: StateManagerProps) => { const PauseComponentManager = (props: StateManagerProps) => {
const setComponentMatrixIdx = useMainSceneStore( const setComponentMatrixIdx = useStore(
(state) => state.setPauseComponentMatrixIdx (state) => state.setPauseComponentMatrixIdx
); );
const setExitAnimation = useMainSceneStore( const setExitAnimation = useStore(
(state) => state.setPauseExitAnimation (state) => state.setPauseExitAnimation
); );

View file

@ -1,11 +1,11 @@
import { useCallback, useEffect } from "react"; import { useCallback, useEffect } from "react";
import { useMainSceneStore } from "../../../store"; import { useStore } from "../../../store";
import { StateManagerProps } from "../EventManager"; import { StateManagerProps } from "../EventManager";
const SiteManager = (props: StateManagerProps) => { const SiteManager = (props: StateManagerProps) => {
const setPos = useMainSceneStore((state) => state.setSitePos); const setPos = useStore((state) => state.setSitePos);
const setRot = useMainSceneStore((state) => state.setSiteRot); const setRot = useStore((state) => state.setSiteRot);
const setRotX = useMainSceneStore((state) => state.setSiteRotX); const setRotX = useStore((state) => state.setSiteRotX);
const dispatchObject = useCallback( const dispatchObject = useCallback(
(eventState: { event: string; sitePosY: number; siteRotY: number }) => { (eventState: { event: string; sitePosY: number; siteRotY: number }) => {

View file

@ -1,14 +1,13 @@
import React, { useCallback, useEffect, useState } from "react"; import React, { useCallback, useEffect, useState } from "react";
import { useMainSceneStore, useMediaWordStore } from "../../store"; import { useStore } from "../../store";
import { getKeyCodeAssociation } from "../utils/keyPressUtils"; import { getKeyCodeAssociation } from "../utils/keyPressUtils";
import SceneManager from "./GameManagers/SceneManager"; import SceneManager from "./GameManagers/SceneManager";
import handleMediaSceneEvent from "../mediaSceneEventHandler"; import handleMediaSceneEvent from "../mediaSceneEventHandler";
import MediaComponentManager from "./MediaSceneManagers/MediaComponentManager"; import MediaComponentManager from "./MediaSceneManagers/MediaComponentManager";
import MediaYellowTextManager from "./MediaSceneManagers/MediaYellowTextManager";
const MediaSceneEventManager = () => { const MediaSceneEventManager = () => {
// all the possible context needed to calculate new state // all the possible context needed to calculate new state
const activeMediaComponent = useMainSceneStore( const activeMediaComponent = useStore(
useCallback( useCallback(
(state) => (state) =>
state.mediaComponentMatrix[state.mediaComponentMatrixIndices.sideIdx][ state.mediaComponentMatrix[state.mediaComponentMatrixIndices.sideIdx][
@ -20,11 +19,13 @@ const MediaSceneEventManager = () => {
) )
); );
const rightSideComponentIdx = useMainSceneStore( const rightSideComponentIdx = useStore(
(state) => state.mediaComponentMatrixIndices.rightSideIdx (state) => state.mediaComponentMatrixIndices.rightSideIdx
); );
const wordPosStateIdx = useMediaWordStore((state) => state.posStateIdx); const wordPosStateIdx = useStore(
(state) => state.mediaWordPosStateIdx
);
const [eventState, setEventState] = useState<any>(); const [eventState, setEventState] = useState<any>();
@ -60,7 +61,6 @@ const MediaSceneEventManager = () => {
<> <>
<MediaComponentManager eventState={eventState!} /> <MediaComponentManager eventState={eventState!} />
<SceneManager eventState={eventState!} /> <SceneManager eventState={eventState!} />
<MediaYellowTextManager eventState={eventState!} />
</> </>
); );
}; };

View file

@ -1,26 +1,28 @@
import { useCallback, useEffect } from "react"; import { useCallback, useEffect } from "react";
import { StateManagerProps } from "../EventManager"; import { StateManagerProps } from "../EventManager";
import { useMainSceneStore, useMediaWordStore } from "../../../store"; import { useStore } from "../../../store";
import * as THREE from "three"; import * as THREE from "three";
const MediaComponentManager = (props: StateManagerProps) => { const MediaComponentManager = (props: StateManagerProps) => {
const toggleSide = useMainSceneStore((state) => state.toggleMediaSide); const toggleSide = useStore((state) => state.toggleMediaSide);
const setLeftComponentMatrixIdx = useMainSceneStore( const setLeftComponentMatrixIdx = useStore(
(state) => state.setMediaLeftComponentMatrixIdx (state) => state.setMediaLeftComponentMatrixIdx
); );
const setRightComponentMatrixIdx = useMainSceneStore( const setRightComponentMatrixIdx = useStore(
(state) => state.setMediaRightComponentMatrixIdx (state) => state.setMediaRightComponentMatrixIdx
); );
const setWordPosStateIdx = useMediaWordStore((state) => state.setPosStateIdx); const setWordPosStateIdx = useStore(
(state) => state.setMediaWordPosStateIdx
);
const resetComponentMatrixIndices = useMainSceneStore( const resetComponentMatrixIndices = useStore(
(state) => state.resetMediaComponentMatrixIndices (state) => state.resetMediaComponentMatrixIndices
); );
const resetWordPosStateIdx = useMediaWordStore( const resetWordPosStateIdx = useStore(
(state) => state.resetPosStateIdx (state) => state.resetMediaWordPosStateIdx
); );
const setAudioAnalyser = useMainSceneStore((state) => state.setAudioAnalyser); const setAudioAnalyser = useStore((state) => state.setAudioAnalyser);
const playMedia = useCallback(() => { const playMedia = useCallback(() => {
const mediaElement = document.getElementById("media") as HTMLMediaElement; const mediaElement = document.getElementById("media") as HTMLMediaElement;

View file

@ -1,69 +0,0 @@
import { useCallback, useEffect } from "react";
import { useMediaBigTextStore } from "../../../store";
import { StateManagerProps } from "../EventManager";
const MediaYellowTextManager = (props: StateManagerProps) => {
const setTransformState = useMediaBigTextStore(
(state) => state.setTransformState
);
const setText = useMediaBigTextStore((state) => state.setText);
const animateMediaYellowText = useCallback(
(
targetMediaComponentText: string,
targetMediaComponentTextPos: number[]
) => {
// make current text shrink
setTransformState(-1, "xOffset");
setTimeout(() => {
setTransformState(targetMediaComponentTextPos[0], "posX");
setTransformState(targetMediaComponentTextPos[1], "posY");
}, 400);
setTimeout(() => {
setText(targetMediaComponentText);
}, 1000);
setTimeout(() => {
// unshrink text
setTransformState(0, "xOffset");
}, 1200);
},
[setText, setTransformState]
);
const dispatchObject = useCallback(
(eventState: { event: string }) => {
switch (eventState.event) {
case "media_leftside_up":
case "throw_node_media":
return {
action: animateMediaYellowText,
value: ["Play", [-0.8, 0.05, 0.6]],
};
case "media_leftside_down":
return {
action: animateMediaYellowText,
value: ["Exit", [-0.8, -0.08, 0.6]],
};
}
},
[animateMediaYellowText]
);
useEffect(() => {
if (props.eventState) {
const dispatchedObject = dispatchObject(props.eventState);
if (dispatchedObject) {
(dispatchedObject.action as any).apply(null, dispatchedObject.value);
}
}
}, [props.eventState, dispatchObject]);
return null;
};
export default MediaYellowTextManager;

View file

@ -2,18 +2,16 @@ import React, { useCallback, useEffect, useState } from "react";
import { getKeyCodeAssociation } from "../utils/keyPressUtils"; import { getKeyCodeAssociation } from "../utils/keyPressUtils";
import SceneManager from "./GameManagers/SceneManager"; import SceneManager from "./GameManagers/SceneManager";
import handleSSknSceneEvent from "../ssknSceneEventHandler"; import handleSSknSceneEvent from "../ssknSceneEventHandler";
import { useSSknStore } from "../../store"; import { useStore } from "../../store";
import SSknComponentManager from "./SSknSceneManagers/SSknComponentManager"; import SSknComponentManager from "./SSknSceneManagers/SSknComponentManager";
const SSknSceneManager = () => { const SSknSceneManager = () => {
// all the possible context needed to calculate new state // all the possible context needed to calculate new state
const ssknComponentMatrixIdx = useSSknStore( const activeSSknComponent = useStore(
(state) => state.componentMatrixIdx useCallback(
); (state) => state.ssknComponentMatrix[state.ssknComponentMatrixIdx],
const activeSSknComponent = useSSknStore( []
useCallback((state) => state.componentMatrix[ssknComponentMatrixIdx], [ )
ssknComponentMatrixIdx,
])
); );
const [eventState, setEventState] = useState<any>(); const [eventState, setEventState] = useState<any>();

View file

@ -1,19 +1,24 @@
import { useCallback, useEffect } from "react"; import { useCallback, useEffect } from "react";
import { StateManagerProps } from "../EventManager"; import { StateManagerProps } from "../EventManager";
import { useSSknStore } from "../../../store"; import { useStore } from "../../../store";
const SSknComponentManager = (props: StateManagerProps) => { const SSknComponentManager = (props: StateManagerProps) => {
const toggleComponentMatrixIdx = useSSknStore( const toggleComponentMatrixIdx = useStore(
(state) => state.toggleComponentMatrixIdx (state) => state.toggleSSknComponentMatrixIdx
); );
const resetComponentMatrixIdx = useSSknStore( const resetComponentMatrixIdx = useStore(
(state) => state.resetComponentMatrixIdx (state) => state.resetSSknComponentMatrixIdx
); );
const toggleLoading = useSSknStore((state) => state.toggleLoading); const setSSknLoading = useStore((state) => state.setSSknLoading);
const dispatchObject = useCallback( const dispatchObject = useCallback(
(eventState: { event: string }) => { (eventState: { event: string }) => {
switch (eventState.event) { switch (eventState.event) {
case "throw_node_sskn":
case "rip_node_sskn":
return {
action: resetComponentMatrixIdx,
};
case "sskn_ok_down": case "sskn_ok_down":
case "sskn_cancel_up": case "sskn_cancel_up":
return { return {
@ -21,11 +26,17 @@ const SSknComponentManager = (props: StateManagerProps) => {
}; };
case "sskn_ok_select": case "sskn_ok_select":
return { return {
action: toggleLoading, action: setSSknLoading,
value: true,
};
case "sskn_cancel_select":
return {
action: setSSknLoading,
value: false,
}; };
} }
}, },
[toggleComponentMatrixIdx, toggleLoading] [resetComponentMatrixIdx, setSSknLoading, toggleComponentMatrixIdx]
); );
useEffect(() => { useEffect(() => {
@ -33,7 +44,7 @@ const SSknComponentManager = (props: StateManagerProps) => {
const dispatchedObject = dispatchObject(props.eventState); const dispatchedObject = dispatchObject(props.eventState);
if (dispatchedObject) { if (dispatchedObject) {
dispatchedObject.action(); dispatchedObject.action(dispatchedObject.value as any);
} }
} }
}, [props.eventState, dispatchObject]); }, [props.eventState, dispatchObject]);

View file

@ -2,20 +2,21 @@ import React, { useCallback, useEffect, useState } from "react";
import BootAccela from "../components/Boot/BootAccela"; import BootAccela from "../components/Boot/BootAccela";
import BootAnimation from "../components/Boot/BootAnimation"; import BootAnimation from "../components/Boot/BootAnimation";
import BootMainMenuComponents from "../components/Boot/BootMainMenuComponents"; import BootMainMenuComponents from "../components/Boot/BootMainMenuComponents";
import { useBootStore } from "../store"; import { useStore } from "../store";
import BootAuthorizeUser from "../components/Boot/BootAuthorizeUser"; import BootAuthorizeUser from "../components/Boot/BootAuthorizeUser";
import BootLoadData from "../components/Boot/BootLoadData"; import BootLoadData from "../components/Boot/BootLoadData";
const BootScene = () => { const BootScene = () => {
const activeSubscene = useBootStore((state) => state.subscene); const activeSubscene = useStore((state) => state.bootSubscene);
const activeBootElement = useBootStore(
const activeBootElement = useStore(
useCallback( useCallback(
(state) => (state) =>
state.componentMatrix[ state.bootComponentMatrix[
activeSubscene as keyof typeof state.componentMatrix activeSubscene as keyof typeof state.bootComponentMatrix
][ ][
state.componentMatrixIndices[ state.bootComponentMatrixIndices[
activeSubscene as keyof typeof state.componentMatrixIndices activeSubscene as keyof typeof state.bootComponentMatrixIndices
] ]
], ],
[activeSubscene] [activeSubscene]

View file

@ -1,9 +1,9 @@
import React, { useEffect } from "react"; import React, { useEffect } from "react";
import { useMainSceneStore, useSceneStore } from "../store"; import { useStore } from "../store";
const ChangeDiscScene = () => { const ChangeDiscScene = () => {
const setScene = useSceneStore((state) => state.setScene); const setScene = useStore((state) => state.setScene);
const currentSite = useMainSceneStore((state) => state.activeSite); const currentSite = useStore((state) => state.activeSite);
useEffect(() => { useEffect(() => {
if (currentSite === "a") { if (currentSite === "a") {

View file

@ -1,13 +1,15 @@
import React, { useEffect, useRef, useState } from "react"; import React, { useEffect, useRef, useState } from "react";
import * as THREE from "three"; import * as THREE from "three";
import { useFrame } from "react-three-fiber"; import { useFrame } from "react-three-fiber";
import { useEndSceneStore, useMainSceneStore } from "../store"; import { useStore } from "../store";
import EndSelectionScreen from "../components/EndScene/EndSelectionScreen"; import EndSelectionScreen from "../components/EndScene/EndSelectionScreen";
const EndScene = () => { const EndScene = () => {
const setAudioAnalyser = useMainSceneStore((state) => state.setAudioAnalyser); const setAudioAnalyser = useStore((state) => state.setAudioAnalyser);
const mediaPlayedCount = useEndSceneStore((state) => state.mediaPlayedCount); const mediaPlayedCount = useStore(
(state) => state.endMediaPlayedCount
);
const mainCylinderRef = useRef<THREE.Object3D>(); const mainCylinderRef = useRef<THREE.Object3D>();

View file

@ -3,11 +3,11 @@ import GateSide from "../components/GateScene/GateSide";
import { OrbitControls } from "@react-three/drei"; import { OrbitControls } from "@react-three/drei";
import GateHUD from "../components/GateScene/GateHUD"; import GateHUD from "../components/GateScene/GateHUD";
import GateMiddleObject from "../components/GateScene/GateMiddleObject"; import GateMiddleObject from "../components/GateScene/GateMiddleObject";
import { useGateStore } from "../store"; import { useStore } from "../store";
import GateSceneManager from "../core/StateManagers/GateSceneManager"; import GateSceneManager from "../core/StateManagers/GateSceneManager";
const GateScene = () => { const GateScene = () => {
const gateLvl = useGateStore((state) => state.gateLvl); const gateLvl = useStore((state) => state.gateLvl);
const [introAnim, setIntroAnim] = useState(true); const [introAnim, setIntroAnim] = useState(true);
useEffect(() => { useEffect(() => {

View file

@ -1,9 +1,9 @@
import React, { useEffect } from "react"; import React, { useEffect } from "react";
import { useIdleStore } from "../store"; import { useStore } from "../store";
import Images from "../components/MediaScene/Images"; import Images from "../components/MediaScene/Images";
const IdleMediaScene = () => { const IdleMediaScene = () => {
const idleMedia = useIdleStore((state) => state.media); const idleMedia = useStore((state) => state.idleMedia);
useEffect(() => { useEffect(() => {
document.getElementsByTagName("canvas")[0].className = document.getElementsByTagName("canvas")[0].className =

View file

@ -3,14 +3,14 @@ import { OrbitControls } from "@react-three/drei";
import React, { Suspense, useEffect, useMemo } from "react"; import React, { Suspense, useEffect, useMemo } from "react";
import Lain from "../components/MainScene/Lain"; import Lain from "../components/MainScene/Lain";
import Preloader from "../components/Preloader"; import Preloader from "../components/Preloader";
import { useMainSceneStore } from "../store"; import { useStore } from "../store";
import Pause from "../components/MainScene/PauseSubscene/Pause"; import Pause from "../components/MainScene/PauseSubscene/Pause";
import SyncedComponentLoader from "../components/MainScene/SyncedComponentLoader"; import SyncedComponentLoader from "../components/MainScene/SyncedComponentLoader";
import LevelSelection from "../components/MainScene/SyncedComponents/LevelSelection"; import LevelSelection from "../components/MainScene/SyncedComponents/LevelSelection";
const MainScene = () => { const MainScene = () => {
const currentSubscene = useMainSceneStore((state) => state.subscene); const currentSubscene = useStore((state) => state.mainSubscene);
const shouldIntro = useMainSceneStore((state) => state.intro); const shouldIntro = useStore((state) => state.intro);
const isPaused = useMemo(() => currentSubscene === "pause", [ const isPaused = useMemo(() => currentSubscene === "pause", [
currentSubscene, currentSubscene,

View file

@ -1,36 +1,32 @@
import React, { useCallback, useEffect } from "react"; import React, { useCallback, useEffect, useMemo } from "react";
import { useMainSceneStore } from "../store"; import { useStore } from "../store";
import LeftSide from "../components/MediaScene/Selectables/LeftSide"; import LeftSide from "../components/MediaScene/Selectables/LeftSide";
import RightSide from "../components/MediaScene/Selectables/RightSide"; import RightSide from "../components/MediaScene/Selectables/RightSide";
import AudioVisualizer from "../components/MediaScene/AudioVisualizer/AudioVisualizer"; import AudioVisualizer from "../components/MediaScene/AudioVisualizer/AudioVisualizer";
import MediaLoadingBar from "../components/MediaScene/MediaLoadingBar"; import MediaLoadingBar from "../components/MediaScene/MediaLoadingBar";
import NodeNameContainer from "../components/MediaScene/NodeNameContainer"; import NodeNameContainer from "../components/MediaScene/NodeNameContainer";
import Lof from "../components/MediaScene/Lof";
import Images from "../components/MediaScene/Images"; import Images from "../components/MediaScene/Images";
import MediumLetter from "../components/TextRenderer/MediumLetter"; import MediumLetter from "../components/TextRenderer/MediumLetter";
import MediaYellowTextAnimator from "../components/TextRenderer/MediaYellowTextAnimator"; import MediaYellowTextAnimator from "../components/TextRenderer/MediaYellowTextAnimator";
import MediaSceneEventManager from "../core/StateManagers/MediaSceneEventManager"; import MediaSceneEventManager from "../core/StateManagers/MediaSceneEventManager";
const MediaScene = () => { const MediaScene = () => {
const activeNodeName = useMainSceneStore((state) => const nodeNameText = useStore(
state.activeNode.node_name.split("")
);
const activeNodeMedia = useMainSceneStore(
(state) => state.activeNode.media_file
);
const activeMediaComponent = useMainSceneStore(
useCallback( useCallback(
(state) => (state) =>
state.mediaComponentMatrix[state.mediaComponentMatrixIndices.sideIdx][ state.activeNode.node_name
state.mediaComponentMatrixIndices.sideIdx === 0 .split("")
? state.mediaComponentMatrixIndices.leftSideIdx .map((letter: string, idx: number) => (
: state.mediaComponentMatrixIndices.rightSideIdx <MediumLetter letter={letter} letterIdx={idx} key={idx} />
], )),
[] []
) )
); );
const activeNodeMedia = useStore(
(state) => state.activeNode.media_file
);
useEffect(() => { useEffect(() => {
document.getElementsByTagName("canvas")[0].className = document.getElementsByTagName("canvas")[0].className =
"media-scene-background"; "media-scene-background";
@ -44,21 +40,18 @@ const MediaScene = () => {
<perspectiveCamera position-z={3}> <perspectiveCamera position-z={3}>
<group position={[0.4, -0.3, 0]}> <group position={[0.4, -0.3, 0]}>
<pointLight intensity={1.2} color={0xffffff} position={[-2, 0, 0]} /> <pointLight intensity={1.2} color={0xffffff} position={[-2, 0, 0]} />
<LeftSide activeMediaComponent={activeMediaComponent!} /> <LeftSide />
<group position={[0, 0.5, -3]}> <group position={[0, 0.5, -3]}>
<MediaLoadingBar /> <MediaLoadingBar />
<NodeNameContainer /> <NodeNameContainer />
</group> </group>
<group scale={[0.06, 0.12, 0]} position={[0.8, 1.37, 0]}> <group scale={[0.06, 0.12, 0]} position={[0.8, 1.37, 0]}>
{activeNodeName.map((letter: string, idx: number) => ( {nodeNameText}
<MediumLetter letter={letter} letterIdx={idx} key={idx} />
))}
</group> </group>
<MediaYellowTextAnimator /> <MediaYellowTextAnimator />
<group visible={activeNodeMedia.includes("XA")}> <group visible={activeNodeMedia.includes("XA")}>
<RightSide activeMediaComponent={activeMediaComponent!} /> <RightSide />
<Lof />
<AudioVisualizer /> <AudioVisualizer />
<Images /> <Images />
</group> </group>

View file

@ -1,10 +1,12 @@
import React from "react"; import React from "react";
import PolytanBear from "../components/PolytanScene/PolytanBear"; import PolytanBear from "../components/PolytanScene/PolytanBear";
import PolytanBackground from "../components/PolytanScene/PolytanBackground"; import PolytanBackground from "../components/PolytanScene/PolytanBackground";
import { usePolytanStore } from "../store"; import { useStore } from "../store";
const PolytanScene = () => { const PolytanScene = () => {
const unlockedParts = usePolytanStore((state) => state.unlockedParts); const unlockedParts = useStore(
(state) => state.polytanUnlockedParts
);
return ( return (
<perspectiveCamera> <perspectiveCamera>

View file

@ -2,20 +2,18 @@ import React, { useCallback } from "react";
import SSknIcon from "../components/SSknScene/SSknIcon"; import SSknIcon from "../components/SSknScene/SSknIcon";
import SSknBackground from "../components/SSknScene/SSknBackground"; import SSknBackground from "../components/SSknScene/SSknBackground";
import SSknHUD from "../components/SSknScene/SSknHUD"; import SSknHUD from "../components/SSknScene/SSknHUD";
import { useSSknStore } from "../store"; import { useStore } from "../store";
import SSknSceneManager from "../core/StateManagers/SSknSceneManager"; import SSknSceneManager from "../core/StateManagers/SSknSceneManager";
const SSknScene = () => { const SSknScene = () => {
const ssknComponentMatrixIdx = useSSknStore( const activeSSknComponent = useStore(
(state) => state.componentMatrixIdx useCallback(
); (state) => state.ssknComponentMatrix[state.ssknComponentMatrixIdx],
const activeSSknComponent = useSSknStore( []
useCallback((state) => state.componentMatrix[ssknComponentMatrixIdx], [ )
ssknComponentMatrixIdx,
])
); );
const loading = useSSknStore((state) => state.loading); const loading = useStore((state) => state.ssknLoading);
return ( return (
<> <>

View file

@ -1,16 +1,16 @@
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import LainSpeak from "../components/LainSpeak"; import LainSpeak from "../components/LainSpeak";
import * as THREE from "three"; import * as THREE from "three";
import { useMainSceneStore, useSceneStore } from "../store"; import { useStore } from "../store";
const TaKScene = () => { const TaKScene = () => {
const setAudioAnalyser = useMainSceneStore((state) => state.setAudioAnalyser); const setAudioAnalyser = useStore((state) => state.setAudioAnalyser);
const setScene = useSceneStore((state) => state.setScene); const setScene = useStore((state) => state.setScene);
const [isIntro, setIsIntro] = useState(true); const [isIntro, setIsIntro] = useState(true);
const [isOutro, setIsOutro] = useState(false); const [isOutro, setIsOutro] = useState(false);
const percentageElapsed = useMainSceneStore( const percentageElapsed = useStore(
(state) => state.mediaPercentageElapsed (state) => state.mediaPercentageElapsed
); );

View file

@ -6,19 +6,6 @@ import game_progress from "./resources/initial_progress.json";
import { HUDType } from "./components/MainScene/SyncedComponents/HUD"; import { HUDType } from "./components/MainScene/SyncedComponents/HUD";
import { NodeDataType } from "./components/MainScene/SyncedComponents/Site"; import { NodeDataType } from "./components/MainScene/SyncedComponents/Site";
type EndState = {
mediaPlayedCount: number;
incrementMediaPlayedCount: () => void;
resetMediaPlayedCount: () => void;
};
type IdleState = {
media: any;
images: any;
setMedia: (to: any) => void;
setImages: (to: any) => void;
};
type SiteSaveState = { type SiteSaveState = {
a: { a: {
activeNodeId: string; activeNodeId: string;
@ -38,152 +25,7 @@ type SiteSaveState = {
}; };
}; };
type SceneState = { export const useAuthorizeUserStore = create<any>((set) => ({
currentScene: string;
setScene: (to: string) => void;
};
type MediaWordState = {
posStateIdx: number;
setPosStateIdx: (to: number) => void;
resetPosStateIdx: () => void;
};
export type BigTextState = {
visible: boolean;
disableTrail: boolean;
text: string;
color: string;
transformState: {
posX: number;
posY: number;
xOffset: number;
};
};
export type MediaState = {
audioAnalyser: any;
mediaPercentageElapsed: number;
componentMatrix: [[string, string], [string, string, string]];
componentMatrixIndices: {
sideIdx: number;
leftSideIdx: number;
rightSideIdx: number;
};
};
export type BootState = {
componentMatrix: {
main_menu: [string, string];
load_data: [string, string];
authorize_user: number[];
};
componentMatrixIndices: {
// 0 or 1
main_menu: number;
// 0 or 1
load_data: number;
authorize_user: number;
};
subscene: string;
};
export type AuthorizeUserState = {
bgLettersPos: {
x: number;
y: number;
};
activeLetterTextureOffset: {
x: number;
y: number;
};
setBgLettersPos: (to: { x: number; y: number }) => void;
setActiveLetterTexOffset: (to: { x: number; y: number }) => void;
};
export type GreenTextState = {
text: string;
transformState: {
posX: { initial: number; final: number };
posY: number;
xOffset: number;
};
active: number;
};
type GateState = {
gateLvl: number;
incrementGateLvl: () => void;
};
type SSknState = {
componentMatrix: string[];
componentMatrixIdx: number;
toggleComponentMatrixIdx: () => void;
resetComponentMatrixIdx: () => void;
loading: boolean;
toggleLoading: () => void;
};
export type MediaBigTextState = {
text: string;
transformState: {
posX: number;
posY: number;
xOffset: number;
};
};
export const useMediaBigTextStore = create(
combine(
{
transformState: {
posX: -0.8,
posY: 0.05,
xOffset: 0,
},
text: "Play",
} as MediaBigTextState,
(set) => ({
setText: (to: string) => set(() => ({ text: to })),
setTransformState: (to: number, at: string) =>
set((state) => ({
transformState: { ...state.transformState, [at]: to },
})),
})
)
);
export const useIdleStore = create<IdleState>((set) => ({
media: "INS01.STR",
// this may be undefined depending on whether or not the media is audio or not
images: undefined,
setMedia: (to) => set(() => ({ media: to })),
setImages: (to) => set(() => ({ images: to })),
}));
export const useMediaWordStore = create<MediaWordState>((set) => ({
posStateIdx: 1,
setPosStateIdx: (to) => set(() => ({ posStateIdx: to })),
resetPosStateIdx: () => set(() => ({ posStateIdx: 1 })),
}));
export const useSSknStore = create<SSknState>((set) => ({
componentMatrix: ["sskn_ok", "sskn_cancel"],
componentMatrixIdx: 0,
loading: false,
toggleComponentMatrixIdx: () =>
set((state) => ({ componentMatrixIdx: Number(!state.componentMatrixIdx) })),
resetComponentMatrixIdx: () => set(() => ({ componentMatrixIdx: 0 })),
toggleLoading: () => set(() => ({ loading: true })),
}));
export const useSceneStore = create<SceneState>((set) => ({
currentScene: "media",
setScene: (to) => set(() => ({ currentScene: to })),
}));
export const useAuthorizeUserStore = create<AuthorizeUserState>((set) => ({
bgLettersPos: { bgLettersPos: {
x: 3.35, x: 3.35,
y: -0.7, y: -0.7,
@ -198,10 +40,12 @@ export const useAuthorizeUserStore = create<AuthorizeUserState>((set) => ({
set(() => ({ activeLetterTextureOffset: to })), set(() => ({ activeLetterTextureOffset: to })),
})); }));
type MainSceneState = { type State = {
currentScene: string;
gameProgress: typeof game_progress; gameProgress: typeof game_progress;
subscene: string; mainSubscene: string;
intro: boolean; intro: boolean;
@ -252,32 +96,75 @@ type MainSceneState = {
// level selection // level selection
selectedLevel: number; selectedLevel: number;
levelSelectionToggled: boolean;
// pause // pause
pauseComponentMatrix: [string, string, string, string, string]; pauseComponentMatrix: ["load", "about", "change", "save", "exit"];
pauseComponentMatrixIdx: number; pauseComponentMatrixIdx: number;
pauseExitAnimation: boolean; pauseExitAnimation: boolean;
// media/media scene // media/media scene
audioAnalyser: undefined | THREE.AudioAnalyser; audioAnalyser: undefined | THREE.AudioAnalyser;
mediaPercentageElapsed: number; mediaPercentageElapsed: number;
mediaComponentMatrix: [[string, string], [string, string, string]]; mediaComponentMatrix: [["play", "exit"], ["fstWord", "sndWord", "thirdWord"]];
mediaComponentMatrixIndices: { mediaComponentMatrixIndices: {
sideIdx: 0 | 1; sideIdx: 0 | 1;
leftSideIdx: 0 | 1; leftSideIdx: 0 | 1;
rightSideIdx: 0 | 1 | 2; rightSideIdx: 0 | 1 | 2;
}; };
mediaWordPosStateIdx: number;
// idle scene
idleMedia: string;
idleImages: any;
// sskn scene
ssknComponentMatrix: ["sskn_ok", "sskn_cancel"];
ssknComponentMatrixIdx: 0 | 1;
ssknLoading: boolean;
// polytan scene
polytanUnlockedParts: {
body: boolean;
head: boolean;
leftArm: boolean;
rightArm: boolean;
leftLeg: boolean;
rightLeg: boolean;
};
// gate scene
gateLvl: number;
// boot scene
bootComponentMatrix: {
main_menu: ["authorize_user", "load_data"];
load_data: ["load_data_yes", "load_data_no"];
authorize_user: typeof authorize_user_letters.letters;
};
bootComponentMatrixIndices: {
// 0 or 1
main_menu: 0 | 1;
// 0 or 1
load_data: 0 | 1;
authorize_user: 0;
};
bootSubscene: "main_menu" | "load_data" | "authorize_user";
// end scene
endMediaPlayedCount: number;
}; };
export const useMainSceneStore = create( export const useStore = create(
combine( combine(
{ {
// scene data
currentScene: "main",
// game progress // game progress
gameProgress: game_progress, gameProgress: game_progress,
// subscene // main subscene
subscene: "site", mainSubscene: "site",
// whether or not to play the intro anim // whether or not to play the intro anim
intro: true, intro: true,
@ -394,10 +281,55 @@ export const useMainSceneStore = create(
// 0 or 1 or 2 ("fstWord", "sndWord" or "thirdWord") // 0 or 1 or 2 ("fstWord", "sndWord" or "thirdWord")
rightSideIdx: 0, rightSideIdx: 0,
}, },
} as MainSceneState, mediaWordPosStateIdx: 1,
// idle scene
idleMedia: "INS01.STR",
// this may be undefined depending on whether or not the media is audio or not
idleImages: undefined,
// sskn scene
ssknComponentMatrix: ["sskn_ok", "sskn_cancel"],
ssknComponentMatrixIdx: 0,
ssknLoading: false,
// polytan scene
polytanUnlockedParts: {
body: true,
head: false,
leftArm: false,
rightArm: false,
leftLeg: false,
rightLeg: false,
},
// gate scene
gateLvl: 4,
// boot scene
bootComponentMatrix: {
main_menu: ["authorize_user", "load_data"],
load_data: ["load_data_yes", "load_data_no"],
authorize_user: authorize_user_letters.letters,
},
bootComponentMatrixIndices: {
// 0 or 1
main_menu: 0,
// 0 or 1
load_data: 0,
authorize_user: 0,
},
bootSubscene: "main_menu",
// end scene
endMediaPlayedCount: 0,
} as State,
(set) => ({ (set) => ({
// subscene setters // scene data setters
setSubscene: (to: string) => set(() => ({ subscene: to })), setScene: (to: string) => set(() => ({ currentScene: to })),
// main subscene setter
setMainSubscene: (to: string) => set(() => ({ mainSubscene: to })),
// intro setters // intro setters
setIntro: (to: boolean) => set(() => ({ intro: to })), setIntro: (to: boolean) => set(() => ({ intro: to })),
@ -507,68 +439,53 @@ export const useMainSceneStore = create(
set(() => ({ mediaPercentageElapsed: to })), set(() => ({ mediaPercentageElapsed: to })),
setAudioAnalyser: (to: THREE.AudioAnalyser) => setAudioAnalyser: (to: THREE.AudioAnalyser) =>
set(() => ({ audioAnalyser: to })), set(() => ({ audioAnalyser: to })),
}) setMediaWordPosStateIdx: (to: number) =>
) set(() => ({ mediaWordPosStateIdx: to })),
); resetMediaWordPosStateIdx: () => set(() => ({ mediaWordPosStateIdx: 1 })),
export const useBootStore = create( // idle media setters
combine( setIdleMedia: (to: any) => set(() => ({ idleMedia: to })),
{ setIdleImages: (to: any) => set(() => ({ idleImages: to })),
componentMatrix: {
main_menu: ["authorize_user", "load_data"], // sskn scene setters
load_data: ["load_data_yes", "load_data_no"], toggleSSknComponentMatrixIdx: () =>
authorize_user: authorize_user_letters.letters,
},
componentMatrixIndices: {
// 0 or 1
main_menu: 0,
// 0 or 1
load_data: 0,
authorize_user: 0,
},
// main_menu, load_data or authorize_user
subscene: "main_menu",
} as BootState,
(set) => ({
setSubscene: (to: string) => set(() => ({ subscene: to })),
toggleComponentMatrixIdx: (subscene: string) =>
set((state) => ({ set((state) => ({
componentMatrixIndices: { ssknComponentMatrixIdx: Number(!state.ssknComponentMatrixIdx) as
...state.componentMatrixIndices, | 0
| 1,
})),
resetSSknComponentMatrixIdx: () =>
set(() => ({ ssknComponentMatrixIdx: 0 })),
setSSknLoading: (to: boolean) => set(() => ({ ssknLoading: to })),
// gate scene setters
incrementGateLvl: () => set((state) => ({ gateLvl: state.gateLvl + 1 })),
// boot scene setters
setBootSubscene: (to: "load_data" | "authorize_user" | "main_menu") =>
set(() => ({ bootSubscene: to })),
toggleBootComponentMatrixIdx: (subscene: "load_data" | "main_menu") =>
set((state) => ({
bootComponentMatrixIndices: {
...state.bootComponentMatrixIndices,
[subscene]: Number( [subscene]: Number(
!state.componentMatrixIndices[ !state.bootComponentMatrixIndices[
subscene as keyof typeof state.componentMatrixIndices subscene as keyof typeof state.bootComponentMatrixIndices
] ]
), ),
}, },
})), })),
setAuthorizeUserMatrixIdx: (to: number) =>
// end scene setters
incrementEndMediaPlayedCount: () =>
set((state) => ({ set((state) => ({
componentMatrixIndices: { endMediaPlayedCount: state.endMediaPlayedCount + 1,
...state.componentMatrixIndices,
authorize_user: to,
},
})), })),
resetEndMediaPlayedCount: () => set(() => ({ endMediaPlayedCount: 0 })),
}) })
) )
); );
export const usePolytanStore = create<any>((set) => ({
unlockedParts: {
body: true,
head: false,
leftArm: false,
rightArm: false,
leftLeg: false,
rightLeg: false,
},
}));
export const useGateStore = create<GateState>((set) => ({
gateLvl: 4,
incrementGateLvl: () => set((state) => ({ gateLvl: state.gateLvl + 1 })),
}));
export const useSiteSaveStore = create( export const useSiteSaveStore = create(
combine( combine(
{ {
@ -609,12 +526,5 @@ export const useSiteSaveStore = create(
) )
); );
export const useEndSceneStore = create<EndState>((set) => ({
mediaPlayedCount: 0,
incrementMediaPlayedCount: () =>
set((state) => ({ mediaPlayedCount: state.mediaPlayedCount + 1 })),
resetMediaPlayedCount: () => set(() => ({ mediaPlayedCount: 0 })),
}));
export const getMainSceneContext = () => export const getMainSceneContext = () =>
useMainSceneStore.getState().activeNode; useStore.getState().activeNode;