mirror of
https://github.com/ad044/lainTSX.git
synced 2024-10-22 23:19:06 +00:00
refactor done i think, gotta fix some bugs
This commit is contained in:
parent
cd584dd33b
commit
f3dfff3c26
46 changed files with 196 additions and 485 deletions
|
@ -13,6 +13,8 @@ import TaKScene from "./scenes/TaKScene";
|
||||||
import ChangeDiscScene from "./scenes/ChangeDiscScene";
|
import ChangeDiscScene from "./scenes/ChangeDiscScene";
|
||||||
import EndScene from "./scenes/EndScene";
|
import EndScene from "./scenes/EndScene";
|
||||||
import IdleMediaScene from "./scenes/IdleMediaScene";
|
import IdleMediaScene from "./scenes/IdleMediaScene";
|
||||||
|
import KeyPressHandler from "./core/state-management/KeyPressHandler";
|
||||||
|
import Preloader from "./core/Preloader";
|
||||||
|
|
||||||
const App = () => {
|
const App = () => {
|
||||||
const currentScene = useStore((state) => state.currentScene);
|
const currentScene = useStore((state) => state.currentScene);
|
||||||
|
@ -41,7 +43,9 @@ const App = () => {
|
||||||
<div id="game-root" className="game">
|
<div id="game-root" className="game">
|
||||||
<span className="canvas">
|
<span className="canvas">
|
||||||
<Canvas concurrent>
|
<Canvas concurrent>
|
||||||
|
<KeyPressHandler />
|
||||||
<Suspense fallback={null}>
|
<Suspense fallback={null}>
|
||||||
|
<Preloader />
|
||||||
{dispatchScene[currentScene as keyof typeof dispatchScene]}
|
{dispatchScene[currentScene as keyof typeof dispatchScene]}
|
||||||
</Suspense>
|
</Suspense>
|
||||||
</Canvas>
|
</Canvas>
|
||||||
|
|
|
@ -6,9 +6,6 @@ import GrayPlanes from "./SyncedComponents/GrayPlanes";
|
||||||
import Starfield from "./SyncedComponents/Starfield";
|
import Starfield from "./SyncedComponents/Starfield";
|
||||||
import Site from "./SyncedComponents/Site";
|
import Site from "./SyncedComponents/Site";
|
||||||
import MiddleRing from "./SyncedComponents/MiddleRing";
|
import MiddleRing from "./SyncedComponents/MiddleRing";
|
||||||
import MainSceneEventManager from "../../core/StateManagers/MainSceneEventManager";
|
|
||||||
import Pause from "./PauseSubscene/Pause";
|
|
||||||
import { a } from "@react-spring/three";
|
|
||||||
import Lain from "./Lain";
|
import Lain from "./Lain";
|
||||||
import { useStore } from "../../store";
|
import { useStore } from "../../store";
|
||||||
|
|
||||||
|
@ -64,9 +61,6 @@ const SyncedComponentLoader = (props: SyncedComponentLoaderProps) => {
|
||||||
introFinished={introFinished}
|
introFinished={introFinished}
|
||||||
/>
|
/>
|
||||||
<Site shouldIntro={props.shouldIntro} introFinished={introFinished} />
|
<Site shouldIntro={props.shouldIntro} introFinished={introFinished} />
|
||||||
<MainSceneEventManager
|
|
||||||
loaded={props.shouldIntro ? introFinished : true}
|
|
||||||
/>
|
|
||||||
<Lain shouldIntro={props.shouldIntro} />
|
<Lain shouldIntro={props.shouldIntro} />
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|
|
@ -8,7 +8,7 @@ import { useStore } from "../../../store";
|
||||||
import lerp from "../../../utils/lerp";
|
import lerp from "../../../utils/lerp";
|
||||||
import GreenTextRenderer from "../../TextRenderer/GreenTextRenderer";
|
import GreenTextRenderer from "../../TextRenderer/GreenTextRenderer";
|
||||||
import usePrevious from "../../../hooks/usePrevious";
|
import usePrevious from "../../../hooks/usePrevious";
|
||||||
import {getNodeHud} from "../../../utils/nodeUtils";
|
import {getNodeHud} from "../../../utils/node-utils";
|
||||||
|
|
||||||
export type HUDType = {
|
export type HUDType = {
|
||||||
mirrored: number;
|
mirrored: number;
|
||||||
|
|
|
@ -32,24 +32,24 @@ const MiddleRingPart = (props: MiddleRingPartProps) => {
|
||||||
const posZ = props.position[2];
|
const posZ = props.position[2];
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
setPos({ posX: posX / 0.9, posZ: posZ / 0.9 });
|
setPos({ posX: posX / 0.9, posZ: posZ / 0.9 });
|
||||||
}, 500);
|
}, 300);
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
setPos({ posX: posX, posZ: posZ });
|
setPos({ posX: posX, posZ: posZ });
|
||||||
}, 900);
|
}, 700);
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
setPos({ posX: posX / 0.9, posZ: posZ / 0.9 });
|
setPos({ posX: posX / 0.9, posZ: posZ / 0.9 });
|
||||||
}, 1300);
|
}, 1100);
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
setPos({ posX: posX, posZ: posZ });
|
setPos({ posX: posX, posZ: posZ });
|
||||||
}, 1700);
|
}, 1500);
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
setPos({ posX: posX / 0.2, posZ: posZ / 0.2 });
|
setPos({ posX: posX / 0.2, posZ: posZ / 0.2 });
|
||||||
}, 2500);
|
}, 2300);
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
setPos({ posX: posX, posZ: posZ });
|
setPos({ posX: posX, posZ: posZ });
|
||||||
}, 3200);
|
}, 3000);
|
||||||
}
|
}
|
||||||
}, [props.position, setPos, subscene]);
|
}, [props.position, setPos, subscene]);
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ 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 level_y_values from "../../../resources/level_y_values.json";
|
import level_y_values from "../../../resources/level_y_values.json";
|
||||||
import usePrevious from "../../../hooks/usePrevious";
|
import usePrevious from "../../../hooks/usePrevious";
|
||||||
import { filterInvisibleNodes } from "../../../utils/nodeUtils";
|
import { filterInvisibleNodes } from "../../../utils/node-utils";
|
||||||
|
|
||||||
export type NodeDataType = {
|
export type NodeDataType = {
|
||||||
id: string;
|
id: string;
|
||||||
|
|
|
@ -6,7 +6,7 @@ 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, SiteType } from "../Site";
|
import { NodeDataType, SiteType } from "../Site";
|
||||||
import usePrevious from "../../../../hooks/usePrevious";
|
import usePrevious from "../../../../hooks/usePrevious";
|
||||||
import {isNodeVisible} from "../../../../utils/nodeUtils";
|
import {isNodeVisible} from "../../../../utils/node-utils";
|
||||||
|
|
||||||
type ActiveLevelNodesProps = {
|
type ActiveLevelNodesProps = {
|
||||||
visibleNodes: SiteType;
|
visibleNodes: SiteType;
|
||||||
|
|
|
@ -4,7 +4,7 @@ import { useStore } from "../../../../store";
|
||||||
import { SiteType } from "../Site";
|
import { SiteType } from "../Site";
|
||||||
import InactiveLevelNode from "./InactiveLevelNode";
|
import InactiveLevelNode from "./InactiveLevelNode";
|
||||||
import usePrevious from "../../../../hooks/usePrevious";
|
import usePrevious from "../../../../hooks/usePrevious";
|
||||||
import { generateInactiveNodes } from "../../../../utils/nodeUtils";
|
import { generateInactiveNodes } from "../../../../utils/node-utils";
|
||||||
|
|
||||||
type ActiveLevelNodesProps = {
|
type ActiveLevelNodesProps = {
|
||||||
visibleNodes: SiteType;
|
visibleNodes: SiteType;
|
||||||
|
|
|
@ -3,7 +3,7 @@ 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";
|
||||||
import usePrevious from "../../hooks/usePrevious";
|
import usePrevious from "../../hooks/usePrevious";
|
||||||
import {getNodeHud} from "../../utils/nodeUtils";
|
import {getNodeHud} from "../../utils/node-utils";
|
||||||
|
|
||||||
const YellowTextRenderer = (props: { visible?: boolean }) => {
|
const YellowTextRenderer = (props: { visible?: boolean }) => {
|
||||||
const activeNode = useStore((state) => state.activeNode);
|
const activeNode = useStore((state) => state.activeNode);
|
||||||
|
|
|
@ -1,26 +0,0 @@
|
||||||
import React from "react";
|
|
||||||
|
|
||||||
const getKeyCodeAssociation = (keyCode: number): string => {
|
|
||||||
const keyCodeAssocs = {
|
|
||||||
40: "DOWN", // down arrow
|
|
||||||
37: "LEFT", // left arrow
|
|
||||||
38: "UP", // up arrow
|
|
||||||
39: "RIGHT", // right arrow
|
|
||||||
88: "CIRCLE", // x key
|
|
||||||
90: "X", // z key
|
|
||||||
68: "TRIANGLE", // d key
|
|
||||||
69: "L2", // e key
|
|
||||||
32: "SPACE",
|
|
||||||
};
|
|
||||||
return keyCodeAssocs[keyCode as keyof typeof keyCodeAssocs];
|
|
||||||
};
|
|
||||||
|
|
||||||
export type StateManagerProps = {
|
|
||||||
eventState: any;
|
|
||||||
};
|
|
||||||
|
|
||||||
const EventManager = () => {
|
|
||||||
return <></>;
|
|
||||||
};
|
|
||||||
|
|
||||||
export default EventManager;
|
|
|
@ -1,41 +0,0 @@
|
||||||
import React, { useCallback, useEffect, useState } from "react";
|
|
||||||
import { getKeyCodeAssociation } from "../../utils/keyPressUtils";
|
|
||||||
|
|
||||||
const GateSceneManager = () => {
|
|
||||||
const [eventState, setEventState] = useState<any>();
|
|
||||||
|
|
||||||
const [loaded, setLoaded] = useState(false);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
setTimeout(() => {
|
|
||||||
setLoaded(true);
|
|
||||||
|
|
||||||
return () => {
|
|
||||||
setLoaded(false);
|
|
||||||
};
|
|
||||||
}, 3500);
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const handleKeyPress = useCallback((event) => {
|
|
||||||
const { keyCode } = event;
|
|
||||||
|
|
||||||
const keyPress = getKeyCodeAssociation(keyCode);
|
|
||||||
|
|
||||||
if (keyPress && loaded) {
|
|
||||||
const event = { event: "exit_gate" };
|
|
||||||
setEventState(event);
|
|
||||||
}
|
|
||||||
}, [loaded]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
window.addEventListener("keydown", handleKeyPress);
|
|
||||||
|
|
||||||
return () => {
|
|
||||||
window.removeEventListener("keydown", handleKeyPress);
|
|
||||||
};
|
|
||||||
}, [handleKeyPress]);
|
|
||||||
|
|
||||||
return <SceneManager eventState={eventState!} />;
|
|
||||||
};
|
|
||||||
|
|
||||||
export default GateSceneManager;
|
|
|
@ -1,108 +0,0 @@
|
||||||
import React, { useCallback, useEffect, useMemo, useRef } from "react";
|
|
||||||
import { getMainSceneContext, useStore } from "../../store";
|
|
||||||
import handleMainSceneEvent from "../mainSceneEventHandler";
|
|
||||||
import { getKeyCodeAssociation } from "../../utils/keyPressUtils";
|
|
||||||
import { useFrame } from "react-three-fiber";
|
|
||||||
import levelSelectionManager from "../setters/main/level_selection/levelSelectionManager";
|
|
||||||
import lainManager from "../setters/main/site/lainManager";
|
|
||||||
import levelManager from "../setters/main/site/levelManager";
|
|
||||||
import nodeManager from "../setters/main/site/nodeManager";
|
|
||||||
import pauseManager from "../setters/main/pause/pauseManager";
|
|
||||||
import siteManager from "../setters/main/site/siteManager";
|
|
||||||
import mainSubsceneManager from "../setters/main/mainSubsceneManager";
|
|
||||||
import sceneManager from "../setters/sceneManager";
|
|
||||||
|
|
||||||
type MainSceneEventManagerProps = {
|
|
||||||
loaded: boolean;
|
|
||||||
};
|
|
||||||
|
|
||||||
const MainSceneEventManager = (props: MainSceneEventManagerProps) => {
|
|
||||||
const mainSubscene = useStore((state) => state.mainSubscene);
|
|
||||||
|
|
||||||
const timePassedSinceLastKeyPress = useRef(-1);
|
|
||||||
|
|
||||||
const mainSceneSetters = useMemo(
|
|
||||||
() => [
|
|
||||||
levelSelectionManager,
|
|
||||||
nodeManager,
|
|
||||||
levelManager,
|
|
||||||
lainManager,
|
|
||||||
siteManager,
|
|
||||||
pauseManager,
|
|
||||||
mainSubsceneManager,
|
|
||||||
sceneManager,
|
|
||||||
],
|
|
||||||
[]
|
|
||||||
);
|
|
||||||
|
|
||||||
useFrame(() => {
|
|
||||||
const now = Date.now();
|
|
||||||
if (
|
|
||||||
timePassedSinceLastKeyPress.current > -1 &&
|
|
||||||
mainSubscene !== "pause" &&
|
|
||||||
mainSubscene !== "level_selection"
|
|
||||||
) {
|
|
||||||
if (now > timePassedSinceLastKeyPress.current + 5000) {
|
|
||||||
// setEventState({
|
|
||||||
// event: "play_idle_media",
|
|
||||||
// scene: "idle_media",
|
|
||||||
// site: currentSite,
|
|
||||||
// });
|
|
||||||
timePassedSinceLastKeyPress.current = -1;
|
|
||||||
} else if (now > timePassedSinceLastKeyPress.current + 10000) {
|
|
||||||
const moves = [
|
|
||||||
"prayer",
|
|
||||||
"touch_sleeve",
|
|
||||||
"thinking",
|
|
||||||
"stretch_2",
|
|
||||||
"stretch",
|
|
||||||
"spin",
|
|
||||||
"scratch_head",
|
|
||||||
"blush",
|
|
||||||
"hands_behind_head",
|
|
||||||
"hands_on_hips",
|
|
||||||
"hands_on_hips_2",
|
|
||||||
"hands_together",
|
|
||||||
"lean_forward",
|
|
||||||
"lean_left",
|
|
||||||
"lean_right",
|
|
||||||
"look_around",
|
|
||||||
"play_with_hair",
|
|
||||||
];
|
|
||||||
|
|
||||||
const event = moves[Math.floor(Math.random() * moves.length)];
|
|
||||||
// setEventState({ event: event });
|
|
||||||
timePassedSinceLastKeyPress.current = now - 2500;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const handleKeyPress = useCallback(
|
|
||||||
(event) => {
|
|
||||||
const { keyCode } = event;
|
|
||||||
|
|
||||||
const keyPress = getKeyCodeAssociation(keyCode);
|
|
||||||
|
|
||||||
if (keyPress && props.loaded) {
|
|
||||||
timePassedSinceLastKeyPress.current = Date.now() + 2500;
|
|
||||||
const ctx = { ...getMainSceneContext(), keyPress: keyPress };
|
|
||||||
|
|
||||||
const event = handleMainSceneEvent(ctx);
|
|
||||||
mainSceneSetters.forEach((fn) => fn(event));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
[mainSceneSetters, props.loaded]
|
|
||||||
);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
window.addEventListener("keydown", handleKeyPress);
|
|
||||||
|
|
||||||
return () => {
|
|
||||||
window.removeEventListener("keydown", handleKeyPress);
|
|
||||||
};
|
|
||||||
}, [handleKeyPress]);
|
|
||||||
|
|
||||||
return null;
|
|
||||||
};
|
|
||||||
|
|
||||||
export default MainSceneEventManager;
|
|
|
@ -1,39 +0,0 @@
|
||||||
import React, { useCallback, useEffect, useMemo } from "react";
|
|
||||||
import { getMediaSceneContext } from "../../store";
|
|
||||||
import { getKeyCodeAssociation } from "../../utils/keyPressUtils";
|
|
||||||
import mediaManager from "../setters/media/mediaManager";
|
|
||||||
import handleMediaSceneEvent from "../mediaSceneEventHandler";
|
|
||||||
import sceneManager from "../setters/sceneManager";
|
|
||||||
|
|
||||||
const MediaSceneEventManager = () => {
|
|
||||||
const mediaSceneSetters = useMemo(() => [mediaManager, sceneManager], []);
|
|
||||||
|
|
||||||
const handleKeyPress = useCallback(
|
|
||||||
(event) => {
|
|
||||||
const { keyCode } = event;
|
|
||||||
|
|
||||||
const keyPress = getKeyCodeAssociation(keyCode);
|
|
||||||
|
|
||||||
if (keyPress) {
|
|
||||||
const ctx = { ...getMediaSceneContext(), keyPress: keyPress };
|
|
||||||
|
|
||||||
const event = handleMediaSceneEvent(ctx);
|
|
||||||
|
|
||||||
mediaSceneSetters.forEach((fn) => fn(event));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
[mediaSceneSetters]
|
|
||||||
);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
window.addEventListener("keydown", handleKeyPress);
|
|
||||||
|
|
||||||
return () => {
|
|
||||||
window.removeEventListener("keydown", handleKeyPress);
|
|
||||||
};
|
|
||||||
}, [handleKeyPress]);
|
|
||||||
|
|
||||||
return null;
|
|
||||||
};
|
|
||||||
|
|
||||||
export default MediaSceneEventManager;
|
|
|
@ -1,39 +0,0 @@
|
||||||
import React, { useCallback, useEffect, useMemo } from "react";
|
|
||||||
import { getKeyCodeAssociation } from "../../utils/keyPressUtils";
|
|
||||||
import handleSSknSceneEvent from "../ssknSceneEventHandler";
|
|
||||||
import { getSSknSceneContext } from "../../store";
|
|
||||||
import ssknManager from "../setters/sskn/ssknManager";
|
|
||||||
import sceneManager from "../setters/sceneManager";
|
|
||||||
|
|
||||||
const SSknSceneManager = () => {
|
|
||||||
const ssknSceneSetters = useMemo(() => [ssknManager, sceneManager], []);
|
|
||||||
|
|
||||||
const handleKeyPress = useCallback(
|
|
||||||
(event) => {
|
|
||||||
const { keyCode } = event;
|
|
||||||
|
|
||||||
const keyPress = getKeyCodeAssociation(keyCode);
|
|
||||||
|
|
||||||
if (keyPress) {
|
|
||||||
const ctx = { ...getSSknSceneContext(), keyPress: keyPress };
|
|
||||||
|
|
||||||
const event = handleSSknSceneEvent(ctx);
|
|
||||||
|
|
||||||
ssknSceneSetters.forEach((fn) => fn(event));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
[ssknSceneSetters]
|
|
||||||
);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
window.addEventListener("keydown", handleKeyPress);
|
|
||||||
|
|
||||||
return () => {
|
|
||||||
window.removeEventListener("keydown", handleKeyPress);
|
|
||||||
};
|
|
||||||
}, [handleKeyPress]);
|
|
||||||
|
|
||||||
return null;
|
|
||||||
};
|
|
||||||
|
|
||||||
export default SSknSceneManager;
|
|
|
@ -1,77 +0,0 @@
|
||||||
const handleAuthorizeUserEvent = (gameContext: any) => {
|
|
||||||
const keyPress = gameContext.keyPress;
|
|
||||||
|
|
||||||
const bgLettersPos = gameContext.bgLettersPos;
|
|
||||||
const activeLetterTexOffset = gameContext.activeLetterTexOffset;
|
|
||||||
const matrixIdx = gameContext.matrixIdx;
|
|
||||||
|
|
||||||
const currentSubscene = "authorize_user";
|
|
||||||
|
|
||||||
switch (keyPress) {
|
|
||||||
case "LEFT":
|
|
||||||
const utmostLeftIndices = [0, 13, 26, 39, 52];
|
|
||||||
if (utmostLeftIndices.includes(matrixIdx)) {
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
return {
|
|
||||||
event: `${currentSubscene}_left`,
|
|
||||||
newBgLettersPos: { x: bgLettersPos.x + 0.3, y: bgLettersPos.y },
|
|
||||||
newActiveLetterTexOffset: {
|
|
||||||
x: activeLetterTexOffset.x - 0.0775,
|
|
||||||
y: activeLetterTexOffset.y,
|
|
||||||
},
|
|
||||||
newAuthorizeUserMatrixIdx: matrixIdx - 1,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
case "RIGHT":
|
|
||||||
const utmostRightIndices = [12, 25, 38, 51, 64];
|
|
||||||
if (utmostRightIndices.includes(matrixIdx)) {
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
return {
|
|
||||||
event: `${currentSubscene}_right`,
|
|
||||||
newBgLettersPos: { x: bgLettersPos.x - 0.3, y: bgLettersPos.y },
|
|
||||||
newActiveLetterTexOffset: {
|
|
||||||
x: activeLetterTexOffset.x + 0.0775,
|
|
||||||
y: activeLetterTexOffset.y,
|
|
||||||
},
|
|
||||||
newAuthorizeUserMatrixIdx: matrixIdx + 1,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
case "DOWN":
|
|
||||||
const utmostLowIndices = Array.from(new Array(13), (x, i) => i + 52);
|
|
||||||
if (utmostLowIndices.includes(matrixIdx)) {
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
return {
|
|
||||||
event: `${currentSubscene}_down`,
|
|
||||||
newBgLettersPos: { x: bgLettersPos.x, y: bgLettersPos.y + 0.25 },
|
|
||||||
newActiveLetterTexOffset: {
|
|
||||||
x: activeLetterTexOffset.x,
|
|
||||||
y: activeLetterTexOffset.y - 0.2,
|
|
||||||
},
|
|
||||||
newAuthorizeUserMatrixIdx: matrixIdx + 13,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
case "UP":
|
|
||||||
const utmostHighIndices = Array.from(new Array(13), (x, i) => i);
|
|
||||||
if (utmostHighIndices.includes(matrixIdx)) {
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
return {
|
|
||||||
event: `${currentSubscene}_up`,
|
|
||||||
newBgLettersPos: { x: bgLettersPos.x, y: bgLettersPos.y - 0.25 },
|
|
||||||
newActiveLetterTexOffset: {
|
|
||||||
x: activeLetterTexOffset.x,
|
|
||||||
y: activeLetterTexOffset.y + 0.2,
|
|
||||||
},
|
|
||||||
newAuthorizeUserMatrixIdx: matrixIdx - 13,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
case "X": {
|
|
||||||
return { event: "authorize_user_back" };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export default handleAuthorizeUserEvent;
|
|
|
@ -1,44 +0,0 @@
|
||||||
import handleAuthorizeUserEvent from "./authorizeUserEventHandler";
|
|
||||||
|
|
||||||
const handleBootEvent = (gameContext: any) => {
|
|
||||||
const keyPress = gameContext.keyPress;
|
|
||||||
|
|
||||||
const activeBootElement = gameContext.activeBootElement;
|
|
||||||
const currentSubscene = gameContext.bootSubscene;
|
|
||||||
const authorizeUserBgLettersPos = gameContext.authorizeUserBgLettersPos;
|
|
||||||
const authorizeUserActiveLetterTexOffset =
|
|
||||||
gameContext.authorizeUserActiveLetterTexOffset;
|
|
||||||
const authorizeUserMatrixIdx = gameContext.authorizeUserMatrixIdx;
|
|
||||||
|
|
||||||
if (currentSubscene === "authorize_user") {
|
|
||||||
return handleAuthorizeUserEvent({
|
|
||||||
keyPress: keyPress,
|
|
||||||
bgLettersPos: authorizeUserBgLettersPos,
|
|
||||||
activeLetterTexOffset: authorizeUserActiveLetterTexOffset,
|
|
||||||
matrixIdx: authorizeUserMatrixIdx,
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
switch (keyPress) {
|
|
||||||
case "DOWN":
|
|
||||||
case "UP":
|
|
||||||
case "LEFT":
|
|
||||||
case "RIGHT":
|
|
||||||
return {
|
|
||||||
event: `${currentSubscene}_${keyPress.toLowerCase()}`,
|
|
||||||
subscene: currentSubscene,
|
|
||||||
};
|
|
||||||
case "X":
|
|
||||||
return {
|
|
||||||
event: `${currentSubscene}_back`,
|
|
||||||
subscene: currentSubscene,
|
|
||||||
};
|
|
||||||
case "CIRCLE":
|
|
||||||
return {
|
|
||||||
event: `${activeBootElement}_select`,
|
|
||||||
subscene: currentSubscene,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export default handleBootEvent;
|
|
100
src/core/state-management/KeyPressHandler.tsx
Normal file
100
src/core/state-management/KeyPressHandler.tsx
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
import { useCallback, useEffect, useMemo, useRef } from "react";
|
||||||
|
import {
|
||||||
|
getMainSceneContext,
|
||||||
|
getMediaSceneContext,
|
||||||
|
getSSknSceneContext,
|
||||||
|
useStore,
|
||||||
|
} from "../../store";
|
||||||
|
import { getKeyCodeAssociation } from "../../utils/keyPressUtils";
|
||||||
|
import mediaManager from "../state-management/setters/media/mediaManager";
|
||||||
|
import handleMediaSceneEvent from "./scene-keypress-handlers/handleMediaKeyPress";
|
||||||
|
import sceneManager from "../state-management/setters/sceneManager";
|
||||||
|
import levelSelectionManager from "./setters/main/level_selection/levelSelectionManager";
|
||||||
|
import nodeManager from "./setters/main/site/nodeManager";
|
||||||
|
import levelManager from "./setters/main/site/levelManager";
|
||||||
|
import lainManager from "./setters/main/site/lainManager";
|
||||||
|
import siteManager from "./setters/main/site/siteManager";
|
||||||
|
import pauseManager from "./setters/main/pause/pauseManager";
|
||||||
|
import mainSubsceneManager from "./setters/main/mainSubsceneManager";
|
||||||
|
import ssknManager from "./setters/sskn/ssknManager";
|
||||||
|
import handleSSknSceneEvent from "./scene-keypress-handlers/handleSSknKeyPress";
|
||||||
|
import handleMainSceneEvent from "./scene-keypress-handlers/handleMainKeyPress";
|
||||||
|
|
||||||
|
const KeyPressHandler = () => {
|
||||||
|
const mediaSceneSetters = useMemo(() => [mediaManager, sceneManager], []);
|
||||||
|
const ssknSceneSetters = useMemo(() => [ssknManager, sceneManager], []);
|
||||||
|
const mainSceneSetters = useMemo(
|
||||||
|
() => [
|
||||||
|
levelSelectionManager,
|
||||||
|
nodeManager,
|
||||||
|
levelManager,
|
||||||
|
lainManager,
|
||||||
|
siteManager,
|
||||||
|
pauseManager,
|
||||||
|
mainSubsceneManager,
|
||||||
|
sceneManager,
|
||||||
|
],
|
||||||
|
[]
|
||||||
|
);
|
||||||
|
|
||||||
|
const scene = useStore((state) => state.currentScene);
|
||||||
|
|
||||||
|
const timePassedSinceLastKeyPress = useRef(-1);
|
||||||
|
|
||||||
|
const handleKeyPress = useCallback(
|
||||||
|
(event) => {
|
||||||
|
const { keyCode } = event;
|
||||||
|
|
||||||
|
const keyPress = getKeyCodeAssociation(keyCode);
|
||||||
|
|
||||||
|
const now = Date.now();
|
||||||
|
|
||||||
|
if (keyPress && now > timePassedSinceLastKeyPress.current + 1500) {
|
||||||
|
timePassedSinceLastKeyPress.current = Date.now();
|
||||||
|
|
||||||
|
const sceneFns = (() => {
|
||||||
|
switch (scene) {
|
||||||
|
case "main":
|
||||||
|
return {
|
||||||
|
contextProvider: getMainSceneContext,
|
||||||
|
handler: handleMainSceneEvent,
|
||||||
|
setters: mainSceneSetters,
|
||||||
|
};
|
||||||
|
case "media":
|
||||||
|
return {
|
||||||
|
contextProvider: getMediaSceneContext,
|
||||||
|
handler: handleMediaSceneEvent,
|
||||||
|
setters: mediaSceneSetters,
|
||||||
|
};
|
||||||
|
case "sskn":
|
||||||
|
return {
|
||||||
|
contextProvider: getSSknSceneContext,
|
||||||
|
handler: handleSSknSceneEvent,
|
||||||
|
setters: ssknSceneSetters,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
|
||||||
|
if (sceneFns) {
|
||||||
|
const { contextProvider, handler, setters } = { ...sceneFns };
|
||||||
|
const ctx = { ...contextProvider(), keyPress: keyPress };
|
||||||
|
const event = handler(ctx);
|
||||||
|
setters.forEach((fn) => fn(event));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[mainSceneSetters, mediaSceneSetters, scene, ssknSceneSetters]
|
||||||
|
);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
window.addEventListener("keydown", handleKeyPress);
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
window.removeEventListener("keydown", handleKeyPress);
|
||||||
|
};
|
||||||
|
}, [handleKeyPress]);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default KeyPressHandler;
|
|
@ -0,0 +1,33 @@
|
||||||
|
const handleBootKeyPress = (gameContext: any) => {
|
||||||
|
const keyPress = gameContext.keyPress;
|
||||||
|
|
||||||
|
const activeBootElement = gameContext.activeBootElement;
|
||||||
|
const currentSubscene = gameContext.bootSubscene;
|
||||||
|
const authorizeUserBgLettersPos = gameContext.authorizeUserBgLettersPos;
|
||||||
|
const authorizeUserActiveLetterTexOffset =
|
||||||
|
gameContext.authorizeUserActiveLetterTexOffset;
|
||||||
|
const authorizeUserMatrixIdx = gameContext.authorizeUserMatrixIdx;
|
||||||
|
|
||||||
|
switch (keyPress) {
|
||||||
|
case "DOWN":
|
||||||
|
case "UP":
|
||||||
|
case "LEFT":
|
||||||
|
case "RIGHT":
|
||||||
|
return {
|
||||||
|
event: `${currentSubscene}_${keyPress.toLowerCase()}`,
|
||||||
|
subscene: currentSubscene,
|
||||||
|
};
|
||||||
|
case "X":
|
||||||
|
return {
|
||||||
|
event: `${currentSubscene}_back`,
|
||||||
|
subscene: currentSubscene,
|
||||||
|
};
|
||||||
|
case "CIRCLE":
|
||||||
|
return {
|
||||||
|
event: `${activeBootElement}_select`,
|
||||||
|
subscene: currentSubscene,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default handleBootKeyPress;
|
|
@ -1,4 +1,4 @@
|
||||||
import {findNode, getNodeById} from "../utils/nodeUtils";
|
import {findNode, getNodeById} from "../../../utils/node-utils";
|
||||||
|
|
||||||
const handleMainSceneEvent = (mainSceneContext: any) => {
|
const handleMainSceneEvent = (mainSceneContext: any) => {
|
||||||
const {
|
const {
|
|
@ -1,4 +1,4 @@
|
||||||
const handleMediaSceneEvent = (mediaSceneContext: any) => {
|
const handleMediaKeyPress = (mediaSceneContext: any) => {
|
||||||
const {
|
const {
|
||||||
keyPress,
|
keyPress,
|
||||||
activeMediaComponent,
|
activeMediaComponent,
|
||||||
|
@ -65,4 +65,4 @@ const handleMediaSceneEvent = (mediaSceneContext: any) => {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export default handleMediaSceneEvent;
|
export default handleMediaKeyPress;
|
|
@ -1,4 +1,4 @@
|
||||||
import { useStore } from "../../../store";
|
import { useStore } from "../../../../store";
|
||||||
|
|
||||||
const bootSubsceneManager = (eventState: any) => {
|
const bootSubsceneManager = (eventState: any) => {
|
||||||
const setBootSubscene = useStore.getState().setBootSubscene;
|
const setBootSubscene = useStore.getState().setBootSubscene;
|
|
@ -1,4 +1,4 @@
|
||||||
import { useStore } from "../../../store";
|
import { useStore } from "../../../../store";
|
||||||
|
|
||||||
const idleManager = (eventState: any) => {
|
const idleManager = (eventState: any) => {
|
||||||
const dispatchAction = (eventState: {
|
const dispatchAction = (eventState: {
|
|
@ -1,4 +1,4 @@
|
||||||
import { useStore } from "../../../../store";
|
import { useStore } from "../../../../../store";
|
||||||
|
|
||||||
const levelSelectionManager = (eventState: any) => {
|
const levelSelectionManager = (eventState: any) => {
|
||||||
const setSelectedLevel = useStore.getState().setSelectedLevel;
|
const setSelectedLevel = useStore.getState().setSelectedLevel;
|
|
@ -1,4 +1,4 @@
|
||||||
import { useStore } from "../../../store";
|
import { useStore } from "../../../../store";
|
||||||
|
|
||||||
const mainSubsceneManager = (eventState: any) => {
|
const mainSubsceneManager = (eventState: any) => {
|
||||||
const setMainSubscene = useStore.getState().setMainSubscene;
|
const setMainSubscene = useStore.getState().setMainSubscene;
|
|
@ -1,4 +1,4 @@
|
||||||
import { useStore } from "../../../../store";
|
import { useStore } from "../../../../../store";
|
||||||
|
|
||||||
type PauseManagerProps = { event: string; pauseMatrixIdx: number };
|
type PauseManagerProps = { event: string; pauseMatrixIdx: number };
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { useStore } from "../../../../store";
|
import { useStore } from "../../../../../store";
|
||||||
|
|
||||||
const lainManager = (eventState: any) => {
|
const lainManager = (eventState: any) => {
|
||||||
const setLainMoveState = useStore.getState().setLainMoveState;
|
const setLainMoveState = useStore.getState().setLainMoveState;
|
|
@ -1,4 +1,4 @@
|
||||||
import { useStore } from "../../../../store";
|
import { useStore } from "../../../../../store";
|
||||||
|
|
||||||
const levelManager = (eventState: any) => {
|
const levelManager = (eventState: any) => {
|
||||||
const setActiveLevel = useStore.getState().setActiveLevel;
|
const setActiveLevel = useStore.getState().setActiveLevel;
|
|
@ -1,5 +1,5 @@
|
||||||
import { useStore } from "../../../../store";
|
import { useStore } from "../../../../../store";
|
||||||
import { NodeDataType } from "../../../../components/MainScene/SyncedComponents/Site";
|
import { NodeDataType } from "../../../../../components/MainScene/SyncedComponents/Site";
|
||||||
|
|
||||||
const nodeManager = (eventState: any) => {
|
const nodeManager = (eventState: any) => {
|
||||||
const setActiveNode = useStore.getState().setNode;
|
const setActiveNode = useStore.getState().setNode;
|
|
@ -1,4 +1,4 @@
|
||||||
import { useStore } from "../../../../store";
|
import { useStore } from "../../../../../store";
|
||||||
|
|
||||||
const siteManager = (eventState: any) => {
|
const siteManager = (eventState: any) => {
|
||||||
const setRotY = useStore.getState().setSiteRotY;
|
const setRotY = useStore.getState().setSiteRotY;
|
|
@ -1,4 +1,4 @@
|
||||||
import { useStore } from "../../../store";
|
import { useStore } from "../../../../store";
|
||||||
import { useCallback } from "react";
|
import { useCallback } from "react";
|
||||||
import * as THREE from "three";
|
import * as THREE from "three";
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { useStore } from "../../store";
|
import { useStore } from "../../../store";
|
||||||
|
|
||||||
const sceneManager = (eventState: any) => {
|
const sceneManager = (eventState: any) => {
|
||||||
const dispatchAction = (eventState: { event: string; scene: string }) => {
|
const dispatchAction = (eventState: { event: string; scene: string }) => {
|
||||||
|
@ -38,7 +38,7 @@ const sceneManager = (eventState: any) => {
|
||||||
case "pause_change_select":
|
case "pause_change_select":
|
||||||
return {
|
return {
|
||||||
action: () =>
|
action: () =>
|
||||||
useStore.setState({ currentScene: "change_dic", intro: true }),
|
useStore.setState({ currentScene: "change_disc", intro: true }),
|
||||||
delay: 0,
|
delay: 0,
|
||||||
};
|
};
|
||||||
case "play_idle_media":
|
case "play_idle_media":
|
|
@ -1,4 +1,4 @@
|
||||||
import { useStore } from "../../../store";
|
import { useStore } from "../../../../store";
|
||||||
|
|
||||||
const ssknManager = (eventState: any) => {
|
const ssknManager = (eventState: any) => {
|
||||||
const toggleComponentMatrixIdx = useStore.getState()
|
const toggleComponentMatrixIdx = useStore.getState()
|
|
@ -1,10 +1,10 @@
|
||||||
import React, { useCallback, useEffect, useState } from "react";
|
import React, { useCallback, useEffect, useState } from "react";
|
||||||
import BootAccela from "../components/Boot/BootAccela";
|
import BootAccela from "../components/BootScene/BootAccela";
|
||||||
import BootAnimation from "../components/Boot/BootAnimation";
|
import BootAnimation from "../components/BootScene/BootAnimation";
|
||||||
import BootMainMenuComponents from "../components/Boot/BootMainMenuComponents";
|
import BootMainMenuComponents from "../components/BootScene/BootMainMenuComponents";
|
||||||
import { useStore } from "../store";
|
import { useStore } from "../store";
|
||||||
import BootAuthorizeUser from "../components/Boot/BootAuthorizeUser";
|
import BootAuthorizeUser from "../components/BootScene/BootAuthorizeUser";
|
||||||
import BootLoadData from "../components/Boot/BootLoadData";
|
import BootLoadData from "../components/BootScene/BootLoadData";
|
||||||
|
|
||||||
const BootScene = () => {
|
const BootScene = () => {
|
||||||
const activeSubscene = useStore((state) => state.bootSubscene);
|
const activeSubscene = useStore((state) => state.bootSubscene);
|
||||||
|
|
|
@ -4,7 +4,6 @@ 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 { useStore } from "../store";
|
import { useStore } from "../store";
|
||||||
import GateSceneManager from "../core/StateManagers/GateSceneManager";
|
|
||||||
|
|
||||||
const GateScene = () => {
|
const GateScene = () => {
|
||||||
const gateLvl = useStore((state) => state.gateLvl);
|
const gateLvl = useStore((state) => state.gateLvl);
|
||||||
|
@ -23,7 +22,6 @@ const GateScene = () => {
|
||||||
<GateSide />
|
<GateSide />
|
||||||
<GateHUD intro={introAnim} gateLvl={gateLvl} />
|
<GateHUD intro={introAnim} gateLvl={gateLvl} />
|
||||||
<GateMiddleObject intro={introAnim} gateLvl={gateLvl} />
|
<GateMiddleObject intro={introAnim} gateLvl={gateLvl} />
|
||||||
<GateSceneManager />
|
|
||||||
</perspectiveCamera>
|
</perspectiveCamera>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { OrbitControls } from "@react-three/drei";
|
import { OrbitControls } from "@react-three/drei";
|
||||||
import React, { Suspense, useEffect, useMemo } from "react";
|
import React, { Suspense, useEffect, useMemo } from "react";
|
||||||
import Preloader from "../components/Preloader";
|
import Preloader from "../core/Preloader";
|
||||||
import { useStore } 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";
|
||||||
|
@ -22,7 +22,6 @@ const MainScene = () => {
|
||||||
return (
|
return (
|
||||||
<perspectiveCamera position-z={3}>
|
<perspectiveCamera position-z={3}>
|
||||||
<Suspense fallback={null}>
|
<Suspense fallback={null}>
|
||||||
<Preloader />
|
|
||||||
<LevelSelection />
|
<LevelSelection />
|
||||||
<Pause />
|
<Pause />
|
||||||
<SyncedComponentLoader paused={isPaused} shouldIntro={shouldIntro} />
|
<SyncedComponentLoader paused={isPaused} shouldIntro={shouldIntro} />
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import React, { useCallback, useEffect, useMemo } from "react";
|
import React, { useEffect } from "react";
|
||||||
import { useStore } 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";
|
||||||
|
@ -8,7 +8,6 @@ import NodeNameContainer from "../components/MediaScene/NodeNameContainer";
|
||||||
import Images from "../components/MediaScene/Images";
|
import Images from "../components/MediaScene/Images";
|
||||||
import GreenTextRenderer from "../components/TextRenderer/GreenTextRenderer";
|
import GreenTextRenderer from "../components/TextRenderer/GreenTextRenderer";
|
||||||
import MediaYellowTextAnimator from "../components/TextRenderer/MediaYellowTextAnimator";
|
import MediaYellowTextAnimator from "../components/TextRenderer/MediaYellowTextAnimator";
|
||||||
import MediaSceneEventManager from "../core/StateManagers/MediaSceneEventManager";
|
|
||||||
|
|
||||||
const MediaScene = () => {
|
const MediaScene = () => {
|
||||||
const activeNodeMedia = useStore((state) => state.activeNode.media_file);
|
const activeNodeMedia = useStore((state) => state.activeNode.media_file);
|
||||||
|
@ -42,7 +41,6 @@ const MediaScene = () => {
|
||||||
<Images />
|
<Images />
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
<MediaSceneEventManager />
|
|
||||||
</perspectiveCamera>
|
</perspectiveCamera>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
@ -3,7 +3,6 @@ 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 { useStore } from "../store";
|
import { useStore } from "../store";
|
||||||
import SSknSceneManager from "../core/StateManagers/SSknSceneManager";
|
|
||||||
|
|
||||||
const SSknScene = () => {
|
const SSknScene = () => {
|
||||||
const activeSSknComponent = useStore(
|
const activeSSknComponent = useStore(
|
||||||
|
@ -20,7 +19,6 @@ const SSknScene = () => {
|
||||||
<SSknBackground />
|
<SSknBackground />
|
||||||
<SSknIcon />
|
<SSknIcon />
|
||||||
<SSknHUD activeSSknComponent={activeSSknComponent} loading={loading} />
|
<SSknHUD activeSSknComponent={activeSSknComponent} loading={loading} />
|
||||||
<SSknSceneManager />
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
61
src/store.ts
61
src/store.ts
|
@ -3,28 +3,7 @@ import { combine } from "zustand/middleware";
|
||||||
import * as THREE from "three";
|
import * as THREE from "three";
|
||||||
import authorize_user_letters from "./resources/authorize_user_letters.json";
|
import authorize_user_letters from "./resources/authorize_user_letters.json";
|
||||||
import game_progress from "./resources/initial_progress.json";
|
import game_progress from "./resources/initial_progress.json";
|
||||||
import { HUDType } from "./components/MainScene/SyncedComponents/HUD";
|
|
||||||
import { NodeDataType } from "./components/MainScene/SyncedComponents/Site";
|
import { NodeDataType } from "./components/MainScene/SyncedComponents/Site";
|
||||||
import { useCallback } from "react";
|
|
||||||
|
|
||||||
type SiteSaveState = {
|
|
||||||
a: {
|
|
||||||
activeNodeId: string;
|
|
||||||
nodeMatrixIndices: { matrixIdx: number; rowIdx: number; colIdx: number };
|
|
||||||
nodeHudId: string;
|
|
||||||
siteRotY: number;
|
|
||||||
sitePosY: number;
|
|
||||||
level: string;
|
|
||||||
};
|
|
||||||
b: {
|
|
||||||
activeNodeId: string;
|
|
||||||
nodeMatrixIndices: { matrixIdx: number; rowIdx: number; colIdx: number };
|
|
||||||
nodeHudId: string;
|
|
||||||
siteRotY: number;
|
|
||||||
sitePosY: number;
|
|
||||||
level: string;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
type State = {
|
type State = {
|
||||||
currentScene: string;
|
currentScene: string;
|
||||||
|
@ -379,46 +358,6 @@ export const useStore = create(
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
export const useSiteSaveStore = create(
|
|
||||||
combine(
|
|
||||||
{
|
|
||||||
a: {
|
|
||||||
activeNodeId: "0422",
|
|
||||||
nodeMatrixIndices: { matrixIdx: 7, rowIdx: 0, colIdx: 0 },
|
|
||||||
nodeHudId: "fg_hud_1",
|
|
||||||
siteRotY: 0,
|
|
||||||
sitePosY: 0,
|
|
||||||
level: "04",
|
|
||||||
},
|
|
||||||
b: {
|
|
||||||
activeNodeId: "0414",
|
|
||||||
nodeMatrixIndices: { matrixIdx: 7, rowIdx: 1, colIdx: 0 },
|
|
||||||
nodeHudId: "fg_hud_2",
|
|
||||||
siteRotY: 0,
|
|
||||||
sitePosY: 0,
|
|
||||||
level: "04",
|
|
||||||
},
|
|
||||||
} as SiteSaveState,
|
|
||||||
(set) => ({
|
|
||||||
setSiteSaveState: (
|
|
||||||
site: string,
|
|
||||||
to: {
|
|
||||||
activeNodeId: string;
|
|
||||||
nodeMatrixIndices: {
|
|
||||||
matrixIdx: number;
|
|
||||||
rowIdx: number;
|
|
||||||
colIdx: number;
|
|
||||||
};
|
|
||||||
nodeHudId: string;
|
|
||||||
siteRotY: number;
|
|
||||||
sitePosY: number;
|
|
||||||
level: string;
|
|
||||||
}
|
|
||||||
) => set(() => ({ [site]: to })),
|
|
||||||
})
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
export const getMainSceneContext = () => {
|
export const getMainSceneContext = () => {
|
||||||
const state = useStore.getState();
|
const state = useStore.getState();
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ import site_b from "../resources/site_b.json";
|
||||||
import { SiteType } from "../components/MainScene/SyncedComponents/Site";
|
import { SiteType } from "../components/MainScene/SyncedComponents/Site";
|
||||||
import { useStore } from "../store";
|
import { useStore } from "../store";
|
||||||
|
|
||||||
const getIdleMedia = (site: string) => {
|
export const getRandomIdleMedia = (site: string) => {
|
||||||
const siteAIdleNodes = {
|
const siteAIdleNodes = {
|
||||||
audio: [
|
audio: [
|
||||||
"0000",
|
"0000",
|
||||||
|
@ -81,4 +81,26 @@ const getIdleMedia = (site: string) => {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export default getIdleMedia;
|
export const getRandomIdleLainAnim = () => {
|
||||||
|
const moves = [
|
||||||
|
"prayer",
|
||||||
|
"touch_sleeve",
|
||||||
|
"thinking",
|
||||||
|
"stretch_2",
|
||||||
|
"stretch",
|
||||||
|
"spin",
|
||||||
|
"scratch_head",
|
||||||
|
"blush",
|
||||||
|
"hands_behind_head",
|
||||||
|
"hands_on_hips",
|
||||||
|
"hands_on_hips_2",
|
||||||
|
"hands_together",
|
||||||
|
"lean_forward",
|
||||||
|
"lean_left",
|
||||||
|
"lean_right",
|
||||||
|
"look_around",
|
||||||
|
"play_with_hair",
|
||||||
|
];
|
||||||
|
|
||||||
|
return moves[Math.floor(Math.random() * moves.length)];
|
||||||
|
};
|
Loading…
Reference in a new issue