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 EndScene from "./scenes/EndScene";
|
||||
import IdleMediaScene from "./scenes/IdleMediaScene";
|
||||
import KeyPressHandler from "./core/state-management/KeyPressHandler";
|
||||
import Preloader from "./core/Preloader";
|
||||
|
||||
const App = () => {
|
||||
const currentScene = useStore((state) => state.currentScene);
|
||||
|
@ -41,7 +43,9 @@ const App = () => {
|
|||
<div id="game-root" className="game">
|
||||
<span className="canvas">
|
||||
<Canvas concurrent>
|
||||
<KeyPressHandler />
|
||||
<Suspense fallback={null}>
|
||||
<Preloader />
|
||||
{dispatchScene[currentScene as keyof typeof dispatchScene]}
|
||||
</Suspense>
|
||||
</Canvas>
|
||||
|
|
|
@ -6,9 +6,6 @@ import GrayPlanes from "./SyncedComponents/GrayPlanes";
|
|||
import Starfield from "./SyncedComponents/Starfield";
|
||||
import Site from "./SyncedComponents/Site";
|
||||
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 { useStore } from "../../store";
|
||||
|
||||
|
@ -64,9 +61,6 @@ const SyncedComponentLoader = (props: SyncedComponentLoaderProps) => {
|
|||
introFinished={introFinished}
|
||||
/>
|
||||
<Site shouldIntro={props.shouldIntro} introFinished={introFinished} />
|
||||
<MainSceneEventManager
|
||||
loaded={props.shouldIntro ? introFinished : true}
|
||||
/>
|
||||
<Lain shouldIntro={props.shouldIntro} />
|
||||
</>
|
||||
);
|
||||
|
|
|
@ -8,7 +8,7 @@ import { useStore } from "../../../store";
|
|||
import lerp from "../../../utils/lerp";
|
||||
import GreenTextRenderer from "../../TextRenderer/GreenTextRenderer";
|
||||
import usePrevious from "../../../hooks/usePrevious";
|
||||
import {getNodeHud} from "../../../utils/nodeUtils";
|
||||
import {getNodeHud} from "../../../utils/node-utils";
|
||||
|
||||
export type HUDType = {
|
||||
mirrored: number;
|
||||
|
|
|
@ -32,24 +32,24 @@ const MiddleRingPart = (props: MiddleRingPartProps) => {
|
|||
const posZ = props.position[2];
|
||||
setTimeout(() => {
|
||||
setPos({ posX: posX / 0.9, posZ: posZ / 0.9 });
|
||||
}, 500);
|
||||
}, 300);
|
||||
setTimeout(() => {
|
||||
setPos({ posX: posX, posZ: posZ });
|
||||
}, 900);
|
||||
}, 700);
|
||||
setTimeout(() => {
|
||||
setPos({ posX: posX / 0.9, posZ: posZ / 0.9 });
|
||||
}, 1300);
|
||||
}, 1100);
|
||||
setTimeout(() => {
|
||||
setPos({ posX: posX, posZ: posZ });
|
||||
}, 1700);
|
||||
}, 1500);
|
||||
|
||||
setTimeout(() => {
|
||||
setPos({ posX: posX / 0.2, posZ: posZ / 0.2 });
|
||||
}, 2500);
|
||||
}, 2300);
|
||||
|
||||
setTimeout(() => {
|
||||
setPos({ posX: posX, posZ: posZ });
|
||||
}, 3200);
|
||||
}, 3000);
|
||||
}
|
||||
}, [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 level_y_values from "../../../resources/level_y_values.json";
|
||||
import usePrevious from "../../../hooks/usePrevious";
|
||||
import { filterInvisibleNodes } from "../../../utils/nodeUtils";
|
||||
import { filterInvisibleNodes } from "../../../utils/node-utils";
|
||||
|
||||
export type NodeDataType = {
|
||||
id: string;
|
||||
|
|
|
@ -6,7 +6,7 @@ import site_a from "../../../../resources/site_a.json";
|
|||
import site_b from "../../../../resources/site_b.json";
|
||||
import { NodeDataType, SiteType } from "../Site";
|
||||
import usePrevious from "../../../../hooks/usePrevious";
|
||||
import {isNodeVisible} from "../../../../utils/nodeUtils";
|
||||
import {isNodeVisible} from "../../../../utils/node-utils";
|
||||
|
||||
type ActiveLevelNodesProps = {
|
||||
visibleNodes: SiteType;
|
||||
|
|
|
@ -4,7 +4,7 @@ import { useStore } from "../../../../store";
|
|||
import { SiteType } from "../Site";
|
||||
import InactiveLevelNode from "./InactiveLevelNode";
|
||||
import usePrevious from "../../../../hooks/usePrevious";
|
||||
import { generateInactiveNodes } from "../../../../utils/nodeUtils";
|
||||
import { generateInactiveNodes } from "../../../../utils/node-utils";
|
||||
|
||||
type ActiveLevelNodesProps = {
|
||||
visibleNodes: SiteType;
|
||||
|
|
|
@ -3,7 +3,7 @@ import { useStore } from "../../store";
|
|||
import { a, useTrail } from "@react-spring/three";
|
||||
import BigLetter from "./BigLetter";
|
||||
import usePrevious from "../../hooks/usePrevious";
|
||||
import {getNodeHud} from "../../utils/nodeUtils";
|
||||
import {getNodeHud} from "../../utils/node-utils";
|
||||
|
||||
const YellowTextRenderer = (props: { visible?: boolean }) => {
|
||||
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 {
|
|
@ -1,4 +1,4 @@
|
|||
const handleMediaSceneEvent = (mediaSceneContext: any) => {
|
||||
const handleMediaKeyPress = (mediaSceneContext: any) => {
|
||||
const {
|
||||
keyPress,
|
||||
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 setBootSubscene = useStore.getState().setBootSubscene;
|
|
@ -1,4 +1,4 @@
|
|||
import { useStore } from "../../../store";
|
||||
import { useStore } from "../../../../store";
|
||||
|
||||
const idleManager = (eventState: any) => {
|
||||
const dispatchAction = (eventState: {
|
|
@ -1,4 +1,4 @@
|
|||
import { useStore } from "../../../../store";
|
||||
import { useStore } from "../../../../../store";
|
||||
|
||||
const levelSelectionManager = (eventState: any) => {
|
||||
const setSelectedLevel = useStore.getState().setSelectedLevel;
|
|
@ -1,4 +1,4 @@
|
|||
import { useStore } from "../../../store";
|
||||
import { useStore } from "../../../../store";
|
||||
|
||||
const mainSubsceneManager = (eventState: any) => {
|
||||
const setMainSubscene = useStore.getState().setMainSubscene;
|
|
@ -1,4 +1,4 @@
|
|||
import { useStore } from "../../../../store";
|
||||
import { useStore } from "../../../../../store";
|
||||
|
||||
type PauseManagerProps = { event: string; pauseMatrixIdx: number };
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
import { useStore } from "../../../../store";
|
||||
import { useStore } from "../../../../../store";
|
||||
|
||||
const lainManager = (eventState: any) => {
|
||||
const setLainMoveState = useStore.getState().setLainMoveState;
|
|
@ -1,4 +1,4 @@
|
|||
import { useStore } from "../../../../store";
|
||||
import { useStore } from "../../../../../store";
|
||||
|
||||
const levelManager = (eventState: any) => {
|
||||
const setActiveLevel = useStore.getState().setActiveLevel;
|
|
@ -1,5 +1,5 @@
|
|||
import { useStore } from "../../../../store";
|
||||
import { NodeDataType } from "../../../../components/MainScene/SyncedComponents/Site";
|
||||
import { useStore } from "../../../../../store";
|
||||
import { NodeDataType } from "../../../../../components/MainScene/SyncedComponents/Site";
|
||||
|
||||
const nodeManager = (eventState: any) => {
|
||||
const setActiveNode = useStore.getState().setNode;
|
|
@ -1,4 +1,4 @@
|
|||
import { useStore } from "../../../../store";
|
||||
import { useStore } from "../../../../../store";
|
||||
|
||||
const siteManager = (eventState: any) => {
|
||||
const setRotY = useStore.getState().setSiteRotY;
|
|
@ -1,4 +1,4 @@
|
|||
import { useStore } from "../../../store";
|
||||
import { useStore } from "../../../../store";
|
||||
import { useCallback } from "react";
|
||||
import * as THREE from "three";
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
import { useStore } from "../../store";
|
||||
import { useStore } from "../../../store";
|
||||
|
||||
const sceneManager = (eventState: any) => {
|
||||
const dispatchAction = (eventState: { event: string; scene: string }) => {
|
||||
|
@ -38,7 +38,7 @@ const sceneManager = (eventState: any) => {
|
|||
case "pause_change_select":
|
||||
return {
|
||||
action: () =>
|
||||
useStore.setState({ currentScene: "change_dic", intro: true }),
|
||||
useStore.setState({ currentScene: "change_disc", intro: true }),
|
||||
delay: 0,
|
||||
};
|
||||
case "play_idle_media":
|
|
@ -1,4 +1,4 @@
|
|||
import { useStore } from "../../../store";
|
||||
import { useStore } from "../../../../store";
|
||||
|
||||
const ssknManager = (eventState: any) => {
|
||||
const toggleComponentMatrixIdx = useStore.getState()
|
|
@ -1,10 +1,10 @@
|
|||
import React, { useCallback, useEffect, useState } from "react";
|
||||
import BootAccela from "../components/Boot/BootAccela";
|
||||
import BootAnimation from "../components/Boot/BootAnimation";
|
||||
import BootMainMenuComponents from "../components/Boot/BootMainMenuComponents";
|
||||
import BootAccela from "../components/BootScene/BootAccela";
|
||||
import BootAnimation from "../components/BootScene/BootAnimation";
|
||||
import BootMainMenuComponents from "../components/BootScene/BootMainMenuComponents";
|
||||
import { useStore } from "../store";
|
||||
import BootAuthorizeUser from "../components/Boot/BootAuthorizeUser";
|
||||
import BootLoadData from "../components/Boot/BootLoadData";
|
||||
import BootAuthorizeUser from "../components/BootScene/BootAuthorizeUser";
|
||||
import BootLoadData from "../components/BootScene/BootLoadData";
|
||||
|
||||
const BootScene = () => {
|
||||
const activeSubscene = useStore((state) => state.bootSubscene);
|
||||
|
|
|
@ -4,7 +4,6 @@ import { OrbitControls } from "@react-three/drei";
|
|||
import GateHUD from "../components/GateScene/GateHUD";
|
||||
import GateMiddleObject from "../components/GateScene/GateMiddleObject";
|
||||
import { useStore } from "../store";
|
||||
import GateSceneManager from "../core/StateManagers/GateSceneManager";
|
||||
|
||||
const GateScene = () => {
|
||||
const gateLvl = useStore((state) => state.gateLvl);
|
||||
|
@ -23,7 +22,6 @@ const GateScene = () => {
|
|||
<GateSide />
|
||||
<GateHUD intro={introAnim} gateLvl={gateLvl} />
|
||||
<GateMiddleObject intro={introAnim} gateLvl={gateLvl} />
|
||||
<GateSceneManager />
|
||||
</perspectiveCamera>
|
||||
);
|
||||
};
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { OrbitControls } from "@react-three/drei";
|
||||
import React, { Suspense, useEffect, useMemo } from "react";
|
||||
import Preloader from "../components/Preloader";
|
||||
import Preloader from "../core/Preloader";
|
||||
import { useStore } from "../store";
|
||||
import Pause from "../components/MainScene/PauseSubscene/Pause";
|
||||
import SyncedComponentLoader from "../components/MainScene/SyncedComponentLoader";
|
||||
|
@ -22,7 +22,6 @@ const MainScene = () => {
|
|||
return (
|
||||
<perspectiveCamera position-z={3}>
|
||||
<Suspense fallback={null}>
|
||||
<Preloader />
|
||||
<LevelSelection />
|
||||
<Pause />
|
||||
<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 LeftSide from "../components/MediaScene/Selectables/LeftSide";
|
||||
import RightSide from "../components/MediaScene/Selectables/RightSide";
|
||||
|
@ -8,7 +8,6 @@ import NodeNameContainer from "../components/MediaScene/NodeNameContainer";
|
|||
import Images from "../components/MediaScene/Images";
|
||||
import GreenTextRenderer from "../components/TextRenderer/GreenTextRenderer";
|
||||
import MediaYellowTextAnimator from "../components/TextRenderer/MediaYellowTextAnimator";
|
||||
import MediaSceneEventManager from "../core/StateManagers/MediaSceneEventManager";
|
||||
|
||||
const MediaScene = () => {
|
||||
const activeNodeMedia = useStore((state) => state.activeNode.media_file);
|
||||
|
@ -42,7 +41,6 @@ const MediaScene = () => {
|
|||
<Images />
|
||||
</group>
|
||||
</group>
|
||||
<MediaSceneEventManager />
|
||||
</perspectiveCamera>
|
||||
);
|
||||
};
|
||||
|
|
|
@ -3,7 +3,6 @@ import SSknIcon from "../components/SSknScene/SSknIcon";
|
|||
import SSknBackground from "../components/SSknScene/SSknBackground";
|
||||
import SSknHUD from "../components/SSknScene/SSknHUD";
|
||||
import { useStore } from "../store";
|
||||
import SSknSceneManager from "../core/StateManagers/SSknSceneManager";
|
||||
|
||||
const SSknScene = () => {
|
||||
const activeSSknComponent = useStore(
|
||||
|
@ -20,7 +19,6 @@ const SSknScene = () => {
|
|||
<SSknBackground />
|
||||
<SSknIcon />
|
||||
<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 authorize_user_letters from "./resources/authorize_user_letters.json";
|
||||
import game_progress from "./resources/initial_progress.json";
|
||||
import { HUDType } from "./components/MainScene/SyncedComponents/HUD";
|
||||
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 = {
|
||||
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 = () => {
|
||||
const state = useStore.getState();
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ import site_b from "../resources/site_b.json";
|
|||
import { SiteType } from "../components/MainScene/SyncedComponents/Site";
|
||||
import { useStore } from "../store";
|
||||
|
||||
const getIdleMedia = (site: string) => {
|
||||
export const getRandomIdleMedia = (site: string) => {
|
||||
const siteAIdleNodes = {
|
||||
audio: [
|
||||
"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