more fixing

This commit is contained in:
ad044 2021-03-15 01:24:35 +04:00
parent 604ff41008
commit 6003e80e73
8 changed files with 112 additions and 85 deletions

View file

@ -67,7 +67,7 @@ const MediaPlayer = () => {
return ( return (
<> <>
<video id="media" ref={videoRef} controls> <video id="media" ref={videoRef}>
<track id={"track"} ref={trackRef} kind="metadata" default /> <track id={"track"} ref={trackRef} kind="metadata" default />
</video> </video>
<div id={"subtitle-container"}> <div id={"subtitle-container"}>

View file

@ -459,13 +459,10 @@ export const changeMediaSide = (calculatedState: {
], ],
}); });
export const playMedia = (calculatedState: { activeNode: NodeData }) => ({ export const playMedia = {
state: [{ mutation: { mediaPercentageElapsed: 0, inputCooldown: 500 } }], state: [{ mutation: { mediaPercentageElapsed: 0, inputCooldown: 500 } }],
effects: [ effects: [playMediaElement],
playMediaElement, };
() => setNodeViewed(calculatedState.activeNode.node_name),
],
});
export const exitMedia = { export const exitMedia = {
state: [ state: [

View file

@ -121,7 +121,7 @@ const handleMainSceneInput = (
true true
); );
if (!nodeData) return; if (!nodeData) return resetInputCooldown;
const lainMoveAnimation = `move_${direction}`; const lainMoveAnimation = `move_${direction}`;
const newSiteRot = [ const newSiteRot = [
@ -145,9 +145,7 @@ const handleMainSceneInput = (
siteRot: newSiteRot, siteRot: newSiteRot,
activeNode: newNode, activeNode: newNode,
}); });
} else { } else return changeNode({ activeNode: newNode });
return changeNode({ activeNode: newNode });
}
} }
case "UP": case "UP":
case "DOWN": { case "DOWN": {
@ -195,7 +193,7 @@ const handleMainSceneInput = (
activeNode.id === "" || activeNode.id === "" ||
!isNodeVisible(activeNode, gameProgress) !isNodeVisible(activeNode, gameProgress)
) )
return; return resetInputCooldown;
if (activeNode.upgrade_requirement > gameProgress.sskn_level) { if (activeNode.upgrade_requirement > gameProgress.sskn_level) {
const rejectEvents = [knockNodeAndFall, knockNode, explodeNode]; const rejectEvents = [knockNodeAndFall, knockNode, explodeNode];
@ -229,7 +227,7 @@ const handleMainSceneInput = (
case "CIRCLE": case "CIRCLE":
if (!canLainMove) return resetInputCooldown; if (!canLainMove) return resetInputCooldown;
if (level === selectedLevel) return; if (level === selectedLevel) return resetInputCooldown;
const direction = selectedLevel > level ? "up" : "down"; const direction = selectedLevel > level ? "up" : "down";

View file

@ -59,7 +59,7 @@ const handleMediaSceneInput = (
) as HTMLMediaElement; ) as HTMLMediaElement;
if (!mediaElement.paused) return; if (!mediaElement.paused) return;
return playMedia({ activeNode: activeNode }); return playMedia;
case "exit": case "exit":
return exitMedia; return exitMedia;
} }

View file

@ -55,7 +55,11 @@ const ChangeDiscScene = () => {
</sprite> </sprite>
{[...Array(2).keys()].map((idx) => ( {[...Array(2).keys()].map((idx) => (
<sprite scale={[9, 0.03, 0]} position={[0, 0.5 - idx / 10, 0]}> <sprite
scale={[9, 0.03, 0]}
position={[0, 0.5 - idx / 10, 0]}
key={idx}
>
<spriteMaterial attach="material" map={discLineTex} /> <spriteMaterial attach="material" map={discLineTex} />
</sprite> </sprite>
))} ))}
@ -68,13 +72,21 @@ const ChangeDiscScene = () => {
</sprite> </sprite>
{[...Array(7).keys()].map((idx) => ( {[...Array(7).keys()].map((idx) => (
<sprite scale={[9, 0.03, 0]} position={[0, -1.5 - idx / 9, 0]}> <sprite
scale={[9, 0.03, 0]}
position={[0, -1.5 - idx / 9, 0]}
key={idx}
>
<spriteMaterial attach="material" map={discLineTex} /> <spriteMaterial attach="material" map={discLineTex} />
</sprite> </sprite>
))} ))}
{[...Array(2).keys()].map((idx) => ( {[...Array(2).keys()].map((idx) => (
<sprite scale={[8, 0.13, 0]} position={[0, -2.2 - idx / 8, 0]}> <sprite
scale={[8, 0.13, 0]}
position={[0, -2.2 - idx / 8, 0]}
key={idx}
>
<spriteMaterial attach="material" map={discSlopeLineTex} /> <spriteMaterial attach="material" map={discSlopeLineTex} />
</sprite> </sprite>
))} ))}

View file

@ -1,10 +1,8 @@
import React, { useEffect, useMemo, useRef, useState } from "react"; import React, { useEffect, useMemo, 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 { useStore } from "../store"; import { createAudioAnalyser, useStore } from "../store";
import EndSelectionScreen from "../components/EndScene/EndSelectionScreen"; import EndSelectionScreen from "../components/EndScene/EndSelectionScreen";
import endroll from "../static/media/movie/ENDROLL1.STR[0].mp4";
import endrollVtt from "../static/media/webvtt/Endroll.vtt";
import introSpeech from "../static/media/audio/LAIN21.XA[31].mp4"; import introSpeech from "../static/media/audio/LAIN21.XA[31].mp4";
import outroSpeech from "../static/media/audio/LAIN21.XA[16].mp4"; import outroSpeech from "../static/media/audio/LAIN21.XA[16].mp4";
import LainSpeak from "../components/LainSpeak"; import LainSpeak from "../components/LainSpeak";
@ -18,6 +16,7 @@ const EndScene = () => {
const setSelectionVisible = useStore( const setSelectionVisible = useStore(
(state) => state.setEndSceneSelectionVisible (state) => state.setEndSceneSelectionVisible
); );
const setAudioAnalyser = useStore((state) => state.setAudioAnalyser);
useFrame(() => { useFrame(() => {
if (mainCylinderRef.current) { if (mainCylinderRef.current) {
@ -43,13 +42,16 @@ const EndScene = () => {
const playerName = useStore((state) => state.playerName); const playerName = useStore((state) => state.playerName);
const playerNameVoices = useMemo(() => playerName.split(""), [playerName]); const playerNameVoices = useMemo(() => playerName.split(""), [playerName]);
const setInputCooldown = useStore((state) => state.setInputCooldown);
useEffect(() => { useEffect(() => {
const mediaElement = document.getElementById("media") as HTMLMediaElement; const mediaElement = document.getElementById("media") as HTMLMediaElement;
const playNextMedia = async () => { if (mediaElement) {
playedMediaCountRef.current++; const playMedia = async (idx: number) => {
mediaElement.currentTime = 0; switch (idx) {
if (playedMediaCountRef.current === 1) { case 0:
setAudioAnalyser(createAudioAnalyser());
setObjectsVisible(true); setObjectsVisible(true);
setIsIntro(true); setIsIntro(true);
@ -59,57 +61,41 @@ const EndScene = () => {
mediaElement.load(); mediaElement.load();
mediaElement.play(); mediaElement.play();
setIsIntro(false); setIsIntro(false);
} break;
default:
if ( import("../static/voice/" + playerNameVoices[idx - 1] + ".mp4")
playedMediaCountRef.current > 1 && .then((media) => {
playedMediaCountRef.current < playerNameVoices.length + 1
) {
import(
"../static/voice/" +
playerNameVoices[playedMediaCountRef.current - 1] +
".WAV"
).then((media) => {
mediaElement.src = media.default; mediaElement.src = media.default;
mediaElement.load(); mediaElement.load();
mediaElement.play(); mediaElement.play();
}); })
} .catch((e) => console.log(e));
break;
if (playedMediaCountRef.current === playerNameVoices.length + 1) { case playerNameVoices.length + 1:
mediaElement.src = outroSpeech; mediaElement.src = outroSpeech;
mediaElement.load(); mediaElement.load();
mediaElement.play(); mediaElement.play();
await sleep(4000);
setIsOutro(true); setIsOutro(true);
await sleep(4000);
setSceneOutro(true); setSceneOutro(true);
await sleep(3000); await sleep(3000);
setObjectsVisible(false); setObjectsVisible(false);
setShowSelectionScreen(true); setShowSelectionScreen(true);
setSelectionVisible(true); setSelectionVisible(true);
setInputCooldown(0);
} }
}; };
mediaElement.addEventListener("ended", playNextMedia); playMedia(0);
}, [playerNameVoices, setSelectionVisible]); mediaElement.addEventListener("ended", () => {
playedMediaCountRef.current++;
useEffect(() => { playMedia(playedMediaCountRef.current);
const mediaElement = document.getElementById("media") as HTMLMediaElement; });
const trackElement = document.getElementById("track") as HTMLTrackElement;
if (mediaElement) {
mediaElement.currentTime = 0;
trackElement.src = endrollVtt;
mediaElement.src = endroll;
mediaElement.load();
mediaElement.play();
} }
}, []); }, [playerNameVoices, setAudioAnalyser, setInputCooldown, setSelectionVisible]);
return ( return (
<> <>

View file

@ -1,4 +1,4 @@
import React, { useEffect, useMemo, useState } from "react"; import React, { useEffect, useMemo, useRef, useState } from "react";
import { createAudioAnalyser, useStore } from "../store"; import { createAudioAnalyser, 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";
@ -9,6 +9,8 @@ import Images from "../components/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 Loading from "../components/Loading"; import Loading from "../components/Loading";
import endroll from "../static/media/movie/ENDROLL1.STR[0].mp4";
import endrollVtt from "../static/media/webvtt/Endroll.vtt";
const MediaScene = () => { const MediaScene = () => {
const percentageElapsed = useStore((state) => state.mediaPercentageElapsed); const percentageElapsed = useStore((state) => state.mediaPercentageElapsed);
@ -23,15 +25,47 @@ const MediaScene = () => {
(state) => state.incrementFinalVideoViewCount (state) => state.incrementFinalVideoViewCount
); );
const endrollPlayingRef = useRef(false);
const mediaSceneGroupRef = useRef<THREE.Group>();
const setNodeViewed = useStore.getState().setNodeViewed;
useEffect(() => { useEffect(() => {
if (percentageElapsed === 100 && activeNode.triggers_final_video) { if (percentageElapsed === 100) {
setScene("end"); setNodeViewed(activeNode.node_name);
if (endrollPlayingRef.current) setScene("end");
else if (!endrollPlayingRef.current && activeNode.triggers_final_video) {
if (mediaSceneGroupRef.current)
mediaSceneGroupRef.current.visible = false;
const mediaElement = document.getElementById(
"media"
) as HTMLMediaElement;
const trackElement = document.getElementById(
"track"
) as HTMLTrackElement;
if (mediaElement) {
mediaElement.currentTime = 0;
trackElement.src = endrollVtt;
mediaElement.src = endroll;
mediaElement.load();
mediaElement.play();
incrementFinalVideoViewCount(); incrementFinalVideoViewCount();
endrollPlayingRef.current = true;
}
}
} }
}, [ }, [
activeNode.node_name,
activeNode.triggers_final_video, activeNode.triggers_final_video,
incrementFinalVideoViewCount, incrementFinalVideoViewCount,
percentageElapsed, percentageElapsed,
setNodeViewed,
setScene, setScene,
]); ]);
@ -87,7 +121,7 @@ const MediaScene = () => {
}, [setInputCooldown]); }, [setInputCooldown]);
return ( return (
<group position-z={3}> <group position-z={3} ref={mediaSceneGroupRef}>
{loaded ? ( {loaded ? (
<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]} />

View file

@ -224,7 +224,7 @@ export const useStore = create(
siteSaveState: { siteSaveState: {
a: { a: {
activeNode: { activeNode: {
...getNodeById("0408", "a"), ...getNodeById("0414", "a"),
matrixIndices: { matrixIdx: 7, rowIdx: 1, colIdx: 0 }, matrixIndices: { matrixIdx: 7, rowIdx: 1, colIdx: 0 },
}, },
siteRot: [0, 0, 0], siteRot: [0, 0, 0],