site changing works

This commit is contained in:
ad044 2021-02-02 15:49:16 +04:00
parent f3dfff3c26
commit 1e0a412ede
31 changed files with 158 additions and 37 deletions

BIN
public/models/cut_cube.glb Normal file

Binary file not shown.

BIN
public/models/gold_node.glb Normal file

Binary file not shown.

View file

@ -13,8 +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 KeyPressHandler from "./components/KeyPressHandler";
import Preloader from "./core/Preloader"; import Preloader from "./components/Preloader";
const App = () => { const App = () => {
const currentScene = useStore((state) => state.currentScene); const currentScene = useStore((state) => state.currentScene);

View file

@ -21,7 +21,7 @@ type MirrorProps = {
const Mirror = (props: MirrorProps) => { const Mirror = (props: MirrorProps) => {
const mirrorTex = useLoader(THREE.TextureLoader, mirrorTexture); const mirrorTex = useLoader(THREE.TextureLoader, mirrorTexture);
const { nodes } = useLoader<GLTFResult>(GLTFLoader, "models/gatePass.glb"); const { nodes } = useLoader<GLTFResult>(GLTFLoader, "models/gate_mirror.glb");
const mirrorGroupRef = useRef<THREE.Object3D>(); const mirrorGroupRef = useRef<THREE.Object3D>();
const materialRef = useRef<THREE.MeshBasicMaterial>(); const materialRef = useRef<THREE.MeshBasicMaterial>();

View file

@ -4,21 +4,23 @@ import {
getMediaSceneContext, getMediaSceneContext,
getSSknSceneContext, getSSknSceneContext,
useStore, useStore,
} from "../../store"; } from "../store";
import { getKeyCodeAssociation } from "../../utils/keyPressUtils"; import { getKeyCodeAssociation } from "../utils/keyPressUtils";
import mediaManager from "../state-management/setters/media/mediaManager"; import mediaManager from "../core/setters/media/mediaManager";
import handleMediaSceneEvent from "./scene-keypress-handlers/handleMediaKeyPress"; import handleMediaSceneEvent from "../core/scene-keypress-handlers/handleMediaKeyPress";
import sceneManager from "../state-management/setters/sceneManager"; import sceneManager from "../core/setters/sceneManager";
import levelSelectionManager from "./setters/main/level_selection/levelSelectionManager"; import levelSelectionManager from "../core/setters/main/level_selection/levelSelectionManager";
import nodeManager from "./setters/main/site/nodeManager"; import nodeManager from "../core/setters/main/site/nodeManager";
import levelManager from "./setters/main/site/levelManager"; import levelManager from "../core/setters/main/site/levelManager";
import lainManager from "./setters/main/site/lainManager"; import lainManager from "../core/setters/main/site/lainManager";
import siteManager from "./setters/main/site/siteManager"; import siteManager from "../core/setters/main/site/siteManager";
import pauseManager from "./setters/main/pause/pauseManager"; import pauseManager from "../core/setters/main/pause/pauseManager";
import mainSubsceneManager from "./setters/main/mainSubsceneManager"; import mainSubsceneManager from "../core/setters/main/mainSubsceneManager";
import ssknManager from "./setters/sskn/ssknManager"; import ssknManager from "../core/setters/sskn/ssknManager";
import handleSSknSceneEvent from "./scene-keypress-handlers/handleSSknKeyPress"; import handleSSknSceneEvent from "../core/scene-keypress-handlers/handleSSknKeyPress";
import handleMainSceneEvent from "./scene-keypress-handlers/handleMainKeyPress"; import handleMainSceneEvent from "../core/scene-keypress-handlers/handleMainKeyPress";
import gameLoader from "../core/setters/gameLoader";
import gameSaver from "../core/setters/gameSaver";
const KeyPressHandler = () => { const KeyPressHandler = () => {
const mediaSceneSetters = useMemo(() => [mediaManager, sceneManager], []); const mediaSceneSetters = useMemo(() => [mediaManager, sceneManager], []);
@ -33,6 +35,8 @@ const KeyPressHandler = () => {
pauseManager, pauseManager,
mainSubsceneManager, mainSubsceneManager,
sceneManager, sceneManager,
gameLoader,
gameSaver,
], ],
[] []
); );
@ -49,7 +53,7 @@ const KeyPressHandler = () => {
const now = Date.now(); const now = Date.now();
if (keyPress && now > timePassedSinceLastKeyPress.current + 1500) { if (keyPress) {
timePassedSinceLastKeyPress.current = Date.now(); timePassedSinceLastKeyPress.current = Date.now();
const sceneFns = (() => { const sceneFns = (() => {

View file

@ -15,7 +15,7 @@ type GLTFResult = GLTF & {
}; };
const CyanCrystal = memo((props: CrystalRingProps) => { const CyanCrystal = memo((props: CrystalRingProps) => {
const { nodes } = useLoader<GLTFResult>(GLTFLoader, "models/cyancrystal.glb"); const { nodes } = useLoader<GLTFResult>(GLTFLoader, "models/cyan_crystal.glb");
return ( return (
<mesh <mesh

View file

@ -33,7 +33,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/gold_node.glb");
const activeNodeName = useStore( const activeNodeName = useStore(
(state) => state.activeNode.node_name (state) => state.activeNode.node_name

View file

@ -19,7 +19,7 @@ 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);
const { nodes } = useLoader<GLTFResult>(GLTFLoader, "models/cutcube.glb"); const { nodes } = useLoader<GLTFResult>(GLTFLoader, "models/cut_cube.glb");
const prismRef = useRef<THREE.Object3D>(); const prismRef = useRef<THREE.Object3D>();

View file

@ -1,4 +1,4 @@
import {findNode, getNodeById} from "../../../utils/node-utils"; import { findNode, getNodeById } from "../../utils/node-utils";
const handleMainSceneEvent = (mainSceneContext: any) => { const handleMainSceneEvent = (mainSceneContext: any) => {
const { const {
@ -209,6 +209,7 @@ const handleMainSceneEvent = (mainSceneContext: any) => {
case "CIRCLE": case "CIRCLE":
return { return {
event: `pause_${activePauseComponent}_select`, event: `pause_${activePauseComponent}_select`,
site: currentSite,
}; };
} }
} }

View file

@ -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;

View file

@ -0,0 +1,22 @@
import { useStore } from "../../store";
const gameLoader = (eventState: any) => {
const loadSiteSaveState = useStore.getState().loadSiteSaveState;
const dispatchAction = (eventState: { event: string; site: "a" | "b" }) => {
switch (eventState.event) {
case "pause_change_select":
return {
action: () => loadSiteSaveState(eventState.site === "a" ? "b" : "a"),
};
}
};
const { action } = { ...dispatchAction(eventState) };
if (action) {
action();
}
};
export default gameLoader;

View file

@ -0,0 +1,23 @@
import { getSiteState, useStore } from "../../store";
const gameSaver = (eventState: any) => {
const setSiteSaveState = useStore.getState().setSiteSaveState;
const dispatchAction = (eventState: { event: string; site: "a" | "b" }) => {
switch (eventState.event) {
case "pause_change_select":
return {
action: () =>
setSiteSaveState(eventState.site, getSiteState(eventState.site)),
};
}
};
const { action } = { ...dispatchAction(eventState) };
if (action) {
action();
}
};
export default gameSaver;

View file

@ -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: {

View file

@ -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;

View file

@ -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;

View file

@ -1,4 +1,4 @@
import { useStore } from "../../../../../store"; import { useStore } from "../../../../store";
type PauseManagerProps = { event: string; pauseMatrixIdx: number }; type PauseManagerProps = { event: string; pauseMatrixIdx: number };

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;
@ -18,6 +18,7 @@ const siteManager = (eventState: any) => {
delay: 3600, delay: 3600,
}; };
case "pause_exit_select": case "pause_exit_select":
case "pause_change_select":
return { return {
action: () => setRotX(0), action: () => setRotX(0),
delay: 0, delay: 0,

View file

@ -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";

View file

@ -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 }) => {

View file

@ -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()

View file

@ -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 "../core/Preloader"; import Preloader from "../components/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";

View file

@ -4,6 +4,7 @@ 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 { NodeDataType } from "./components/MainScene/SyncedComponents/Site"; import { NodeDataType } from "./components/MainScene/SyncedComponents/Site";
import { getNodeById } from "./utils/node-utils";
type State = { type State = {
currentScene: string; currentScene: string;
@ -92,6 +93,21 @@ type State = {
// end scene // end scene
endMediaPlayedCount: number; endMediaPlayedCount: number;
// save state
siteSaveState: {
a: {
activeNode: NodeDataType;
siteRot: number[];
activeLevel: string;
};
b: {
activeNode: NodeDataType;
siteRot: number[];
activeLevel: string;
};
};
}; };
export const useStore = create( export const useStore = create(
@ -223,6 +239,26 @@ export const useStore = create(
// end scene // end scene
endMediaPlayedCount: 0, endMediaPlayedCount: 0,
// save states for loading the game/changing sites
siteSaveState: {
a: {
activeNode: {
...getNodeById("0422", "a"),
matrixIndices: { matrixIdx: 7, rowIdx: 0, colIdx: 0 },
},
siteRot: [0, 0, 0],
activeLevel: "04",
},
b: {
activeNode: {
...getNodeById("0414", "b"),
matrixIndices: { matrixIdx: 7, rowIdx: 1, colIdx: 0 },
},
siteRot: [0, 0, 0],
activeLevel: "04",
},
},
} as State, } as State,
(set) => ({ (set) => ({
// scene data setters // scene data setters
@ -354,10 +390,44 @@ export const useStore = create(
endMediaPlayedCount: state.endMediaPlayedCount + 1, endMediaPlayedCount: state.endMediaPlayedCount + 1,
})), })),
resetEndMediaPlayedCount: () => set(() => ({ endMediaPlayedCount: 0 })), resetEndMediaPlayedCount: () => set(() => ({ endMediaPlayedCount: 0 })),
// site state setters
setSiteSaveState: (
site: string,
to: {
activeNode: NodeDataType;
siteRot: number[];
activeLevel: string;
}
) =>
set((state) => ({
siteSaveState: { ...state.siteSaveState, [site]: to },
})),
loadSiteSaveState: (site: "a" | "b") =>
set((state) => {
const stateToLoad = state.siteSaveState[site];
return {
activeSite: site,
activeNode: stateToLoad.activeNode,
siteRot: stateToLoad.siteRot,
activeLevel: stateToLoad.activeLevel,
};
}),
}) })
) )
); );
export const getSiteState = (site: "a" | "b") => {
const siteState = useStore.getState().siteSaveState[site];
return {
activeNode: siteState.activeNode,
siteRot: siteState.siteRot,
activeLevel: siteState.activeLevel,
};
};
export const getMainSceneContext = () => { export const getMainSceneContext = () => {
const state = useStore.getState(); const state = useStore.getState();