mirror of
https://github.com/ad044/lainTSX.git
synced 2024-10-22 23:19:06 +00:00
performance tweaks
This commit is contained in:
parent
f5b214b79d
commit
edb67baf9a
15 changed files with 12400 additions and 12371 deletions
|
@ -23,7 +23,7 @@ type BlueOrbContructorProps = {
|
|||
sprite: string;
|
||||
position: number[];
|
||||
rotation: number[];
|
||||
active: boolean;
|
||||
active?: boolean;
|
||||
level: string;
|
||||
};
|
||||
|
||||
|
|
52
src/components/MainScene/CurrentLevelNodes.tsx
Normal file
52
src/components/MainScene/CurrentLevelNodes.tsx
Normal file
|
@ -0,0 +1,52 @@
|
|||
import React, { useMemo } from "react";
|
||||
import BlueOrb from "./BlueOrb";
|
||||
import blue_orb_positions from "../../resources/blue_orb_positions.json";
|
||||
import site_a from "../../resources/site_a.json";
|
||||
import { useBlueOrbStore, useLevelStore, useSiteStore } from "../../store";
|
||||
import { a, useSpring } from "@react-spring/three";
|
||||
|
||||
const CurrentLevelNodes = () => {
|
||||
const activeBlueOrbId = useBlueOrbStore((state) => state.activeBlueOrbId);
|
||||
const currentLevel = useLevelStore((state) => state.currentLevel);
|
||||
|
||||
const currentLevelNodes = useMemo(
|
||||
() => site_a[currentLevel as keyof typeof site_a],
|
||||
[currentLevel]
|
||||
);
|
||||
|
||||
const siteRotY = useSiteStore((state) => state.siteRotY);
|
||||
const sitePosY = useSiteStore((state) => state.sitePosY);
|
||||
|
||||
const siteState = useSpring({
|
||||
siteRotY: siteRotY,
|
||||
sitePosY: sitePosY,
|
||||
config: { duration: 1200 },
|
||||
});
|
||||
|
||||
return (
|
||||
<a.group rotation-y={siteState.siteRotY} position-y={siteState.sitePosY}>
|
||||
{Object.entries(currentLevelNodes).map((blueOrb: [string, any]) => {
|
||||
return (
|
||||
<BlueOrb
|
||||
sprite={blueOrb[1].node_name}
|
||||
position={
|
||||
blue_orb_positions[
|
||||
blueOrb[0].substr(2) as keyof typeof blue_orb_positions
|
||||
].position
|
||||
}
|
||||
rotation={
|
||||
blue_orb_positions[
|
||||
blueOrb[0].substr(2) as keyof typeof blue_orb_positions
|
||||
].rotation
|
||||
}
|
||||
key={blueOrb[1].node_name}
|
||||
active={blueOrb[0] === activeBlueOrbId}
|
||||
level={blueOrb[0].substr(0, 2)}
|
||||
/>
|
||||
);
|
||||
})}
|
||||
</a.group>
|
||||
);
|
||||
};
|
||||
|
||||
export default CurrentLevelNodes;
|
|
@ -1,22 +0,0 @@
|
|||
import React from "react";
|
||||
import PurpleRing from "./PurpleRing";
|
||||
import GrayRing from "./GrayRing";
|
||||
import CyanCrystal from "./CyanCrystal";
|
||||
|
||||
//constructor for levels
|
||||
type LevelProps = {
|
||||
levelPosY: number;
|
||||
level: string;
|
||||
};
|
||||
|
||||
const Level = (props: LevelProps) => {
|
||||
return (
|
||||
<group position={[0, props.levelPosY, 0]}>
|
||||
<PurpleRing purpleRingPosY={0.44} level={props.level} />
|
||||
<GrayRing grayRingPosY={-0.29} />
|
||||
<CyanCrystal crystalRingPosY={-0.45} />
|
||||
</group>
|
||||
);
|
||||
};
|
||||
|
||||
export default Level;
|
|
@ -1,16 +1,51 @@
|
|||
import React, { memo, Suspense } from "react";
|
||||
import React, { memo, Suspense, useMemo } from "react";
|
||||
import site_a from "../../resources/site_a.json";
|
||||
import Level from "./Level";
|
||||
import level_y_values from "../../resources/level_y_values.json";
|
||||
import blue_orb_positions from "../../resources/blue_orb_positions.json";
|
||||
import BlueOrb from "./BlueOrb";
|
||||
import { a, useSpring } from "@react-spring/three";
|
||||
import { useBlueOrbStore, useLevelStore, useSiteStore } from "../../store";
|
||||
import { useLevelStore, useSiteStore } from "../../store";
|
||||
import PurpleRing from "./PurpleRing";
|
||||
import GrayRing from "./GrayRing";
|
||||
import CyanCrystal from "./CyanCrystal";
|
||||
|
||||
export type NodeDataType = {
|
||||
SLPS_016_0x_offset: string;
|
||||
image_table_indices: { 1: string; 2: string; 3: string };
|
||||
is_hidden: string;
|
||||
media_file: string;
|
||||
node_name: string;
|
||||
protocol_lines: {
|
||||
1: string;
|
||||
2: string;
|
||||
3: string;
|
||||
};
|
||||
site: string;
|
||||
type: string;
|
||||
title: string;
|
||||
unlocked_by: string;
|
||||
upgrade_requirement: string;
|
||||
words: { 1: string; 2: string; 3: string };
|
||||
};
|
||||
|
||||
export type LevelType = {
|
||||
[key: string]: NodeDataType;
|
||||
};
|
||||
|
||||
export type SiteType = {
|
||||
[key: string]: LevelType;
|
||||
};
|
||||
|
||||
const Site = memo(() => {
|
||||
const activeBlueOrbId = useBlueOrbStore((state) => state.activeBlueOrbId);
|
||||
|
||||
const activeLevels = useLevelStore((state) => state.activeLevels);
|
||||
const visibleNodes = useMemo(() => {
|
||||
const obj = {};
|
||||
activeLevels.forEach((level) => {
|
||||
Object.assign(obj, site_a[level as keyof typeof site_a]);
|
||||
});
|
||||
|
||||
return obj;
|
||||
}, [activeLevels]);
|
||||
|
||||
const siteRotY = useSiteStore((state) => state.siteRotY);
|
||||
const sitePosY = useSiteStore((state) => state.sitePosY);
|
||||
|
@ -23,43 +58,32 @@ const Site = memo(() => {
|
|||
|
||||
return (
|
||||
<Suspense fallback={null}>
|
||||
{/*distance between LEVELS is 1.5*/}
|
||||
<a.group rotation-y={siteState.siteRotY} position-y={siteState.sitePosY}>
|
||||
{Object.entries(level_y_values).map((level: [string, number]) => {
|
||||
if (activeLevels.includes(level[0].toString()))
|
||||
return (
|
||||
<Level
|
||||
levelPosY={level[1]}
|
||||
key={level[1]}
|
||||
level={level[0].toString()}
|
||||
/>
|
||||
);
|
||||
})}
|
||||
|
||||
{Object.entries(site_a).map((blueOrb) => {
|
||||
if (
|
||||
// (blueOrb as any)[1]["unlocked_by"] === "-1" &&
|
||||
activeLevels.includes(blueOrb[0].substr(0, 2))
|
||||
)
|
||||
return (
|
||||
<BlueOrb
|
||||
sprite={blueOrb[1].node_name}
|
||||
position={
|
||||
blue_orb_positions[
|
||||
blueOrb[0].substr(2) as keyof typeof blue_orb_positions
|
||||
].position
|
||||
}
|
||||
rotation={
|
||||
blue_orb_positions[
|
||||
blueOrb[0].substr(2) as keyof typeof blue_orb_positions
|
||||
].rotation
|
||||
}
|
||||
key={blueOrb[1].node_name}
|
||||
active={blueOrb[0] === activeBlueOrbId}
|
||||
level={blueOrb[0].substr(0, 2)}
|
||||
/>
|
||||
);
|
||||
})}
|
||||
{Object.entries(level_y_values).map((level: [string, number]) => (
|
||||
<group position={[0, level[1], 0]} key={level[0]}>
|
||||
<PurpleRing purpleRingPosY={0.44} level={level[0]} />
|
||||
<GrayRing grayRingPosY={-0.29} />
|
||||
<CyanCrystal crystalRingPosY={-0.45} />
|
||||
</group>
|
||||
))}
|
||||
{Object.entries(visibleNodes).map((blueOrb: [string, any]) => (
|
||||
<BlueOrb
|
||||
sprite={blueOrb[1].node_name}
|
||||
position={
|
||||
blue_orb_positions[
|
||||
blueOrb[0].substr(2) as keyof typeof blue_orb_positions
|
||||
].position
|
||||
}
|
||||
rotation={
|
||||
blue_orb_positions[
|
||||
blueOrb[0].substr(2) as keyof typeof blue_orb_positions
|
||||
].rotation
|
||||
}
|
||||
key={blueOrb[1].node_name}
|
||||
level={blueOrb[0].substr(0, 2)}
|
||||
/>
|
||||
))}
|
||||
)
|
||||
</a.group>
|
||||
</Suspense>
|
||||
);
|
||||
|
|
|
@ -10,35 +10,23 @@ const BlueOrbHUDManager = (props: StateManagerProps) => {
|
|||
|
||||
const dispatchObject = useCallback(
|
||||
(event: string, targetBlueOrbHudId: string) => {
|
||||
const dispatcherObjects = {
|
||||
move_up: {
|
||||
action: setActiveBlueOrbHudId,
|
||||
value: targetBlueOrbHudId,
|
||||
actionDelay: 3903.704,
|
||||
},
|
||||
move_down: {
|
||||
action: setActiveBlueOrbHudId,
|
||||
value: targetBlueOrbHudId,
|
||||
actionDelay: 3903.704,
|
||||
},
|
||||
move_left: {
|
||||
action: setActiveBlueOrbHudId,
|
||||
value: targetBlueOrbHudId,
|
||||
actionDelay: 3903.704,
|
||||
},
|
||||
move_right: {
|
||||
action: setActiveBlueOrbHudId,
|
||||
value: targetBlueOrbHudId,
|
||||
actionDelay: 3903.704,
|
||||
},
|
||||
change_blue_orb: {
|
||||
action: setActiveBlueOrbHudId,
|
||||
value: targetBlueOrbHudId,
|
||||
actionDelay: 500,
|
||||
},
|
||||
};
|
||||
|
||||
return dispatcherObjects[event as keyof typeof dispatcherObjects];
|
||||
switch (event) {
|
||||
case "move_up":
|
||||
case "move_down":
|
||||
case "move_left":
|
||||
case "move_right":
|
||||
return {
|
||||
action: setActiveBlueOrbHudId,
|
||||
value: targetBlueOrbHudId,
|
||||
actionDelay: 3903.704,
|
||||
};
|
||||
case "change_blue_orb":
|
||||
return {
|
||||
action: setActiveBlueOrbHudId,
|
||||
value: targetBlueOrbHudId,
|
||||
actionDelay: 500,
|
||||
};
|
||||
}
|
||||
},
|
||||
[setActiveBlueOrbHudId]
|
||||
);
|
||||
|
|
|
@ -83,7 +83,6 @@ const BlueOrbManager = (props: StateManagerProps) => {
|
|||
newBlueOrbColIdx: number,
|
||||
newBlueOrbRowIdx: number
|
||||
) => {
|
||||
if (isMoving) setActiveBlueOrb("");
|
||||
setTimeout(() => {
|
||||
setActiveBlueOrb(newActiveBlueOrbId);
|
||||
setBlueOrbMatrixIndices({
|
||||
|
@ -102,68 +101,39 @@ const BlueOrbManager = (props: StateManagerProps) => {
|
|||
newBlueOrbColIdx: number,
|
||||
newBlueOrbRowIdx: number
|
||||
) => {
|
||||
const dispatcherObjects: BlueOrbDispatcher = {
|
||||
move_up: {
|
||||
action: updateActiveBlueOrb,
|
||||
value: [
|
||||
3903.704,
|
||||
true,
|
||||
newActiveBlueOrbId,
|
||||
newBlueOrbColIdx,
|
||||
newBlueOrbRowIdx,
|
||||
],
|
||||
},
|
||||
move_down: {
|
||||
action: updateActiveBlueOrb,
|
||||
value: [
|
||||
3903.704,
|
||||
true,
|
||||
newActiveBlueOrbId,
|
||||
newBlueOrbColIdx,
|
||||
newBlueOrbRowIdx,
|
||||
],
|
||||
},
|
||||
move_left: {
|
||||
action: updateActiveBlueOrb,
|
||||
value: [
|
||||
3903.704,
|
||||
true,
|
||||
newActiveBlueOrbId,
|
||||
newBlueOrbColIdx,
|
||||
newBlueOrbRowIdx,
|
||||
],
|
||||
},
|
||||
move_right: {
|
||||
action: updateActiveBlueOrb,
|
||||
value: [
|
||||
3903.704,
|
||||
true,
|
||||
newActiveBlueOrbId,
|
||||
newBlueOrbColIdx,
|
||||
newBlueOrbRowIdx,
|
||||
],
|
||||
},
|
||||
change_blue_orb: {
|
||||
action: updateActiveBlueOrb,
|
||||
value: [
|
||||
0,
|
||||
false,
|
||||
newActiveBlueOrbId,
|
||||
newBlueOrbColIdx,
|
||||
newBlueOrbRowIdx,
|
||||
],
|
||||
},
|
||||
throw_blue_orb_media: {
|
||||
action: animateActiveBlueOrbThrow,
|
||||
value: [0, true],
|
||||
},
|
||||
throw_blue_orb_gate: {
|
||||
action: animateActiveBlueOrbThrow,
|
||||
value: [0, true],
|
||||
},
|
||||
};
|
||||
|
||||
return dispatcherObjects[event as keyof typeof dispatcherObjects];
|
||||
switch (event) {
|
||||
case "move_up":
|
||||
case "move_down":
|
||||
case "move_left":
|
||||
case "move_right":
|
||||
return {
|
||||
action: updateActiveBlueOrb,
|
||||
value: [
|
||||
3903.704,
|
||||
true,
|
||||
newActiveBlueOrbId,
|
||||
newBlueOrbColIdx,
|
||||
newBlueOrbRowIdx,
|
||||
],
|
||||
};
|
||||
case "change_blue_orb":
|
||||
return {
|
||||
action: updateActiveBlueOrb,
|
||||
value: [
|
||||
0,
|
||||
false,
|
||||
newActiveBlueOrbId,
|
||||
newBlueOrbColIdx,
|
||||
newBlueOrbRowIdx,
|
||||
],
|
||||
};
|
||||
case "throw_blue_orb_media":
|
||||
case "throw_blue_orb_gate":
|
||||
return {
|
||||
action: animateActiveBlueOrbThrow,
|
||||
value: [0, true],
|
||||
};
|
||||
}
|
||||
},
|
||||
[animateActiveBlueOrbThrow, updateActiveBlueOrb]
|
||||
);
|
||||
|
@ -183,7 +153,7 @@ const BlueOrbManager = (props: StateManagerProps) => {
|
|||
);
|
||||
|
||||
if (dispatchedObject) {
|
||||
dispatchedObject.action.apply(null, dispatchedObject.value);
|
||||
dispatchedObject.action.apply(null, dispatchedObject.value as never);
|
||||
}
|
||||
}
|
||||
}, [props.eventState, setActiveBlueOrb, dispatchObject]);
|
||||
|
|
|
@ -9,42 +9,41 @@ const BootManager = (props: StateManagerProps) => {
|
|||
|
||||
const dispatchObject = useCallback(
|
||||
(event: string) => {
|
||||
const dispatcherObjects = {
|
||||
main_menu_down: {
|
||||
action: setActiveBootElement,
|
||||
value: "load_data",
|
||||
},
|
||||
main_menu_up: {
|
||||
action: setActiveBootElement,
|
||||
value: "authorize_user",
|
||||
},
|
||||
load_data_left: {
|
||||
action: setActiveBootElement,
|
||||
value: "load_data_yes",
|
||||
},
|
||||
load_data_right: {
|
||||
action: setActiveBootElement,
|
||||
value: "load_data_no",
|
||||
},
|
||||
authorize_user_back: {
|
||||
action: setActiveBootElement,
|
||||
value: "authorize_user",
|
||||
},
|
||||
select_authorize_user: {
|
||||
action: setActiveBootElement,
|
||||
value: "authorize_user",
|
||||
},
|
||||
select_load_data_no: {
|
||||
action: setActiveBootElement,
|
||||
value: "load_data",
|
||||
},
|
||||
select_load_data: {
|
||||
action: setActiveBootElement,
|
||||
value: "load_data_yes"
|
||||
}
|
||||
};
|
||||
|
||||
return dispatcherObjects[event as keyof typeof dispatcherObjects];
|
||||
switch (event) {
|
||||
case "main_menu_down":
|
||||
return {
|
||||
action: setActiveBootElement,
|
||||
value: "load_data",
|
||||
};
|
||||
case "main_menu_up":
|
||||
return {
|
||||
action: setActiveBootElement,
|
||||
value: "authorize_user",
|
||||
};
|
||||
case "load_data_left":
|
||||
return {
|
||||
action: setActiveBootElement,
|
||||
value: "load_data_yes",
|
||||
};
|
||||
case "load_data_right":
|
||||
return {
|
||||
action: setActiveBootElement,
|
||||
value: "load_data_no",
|
||||
};
|
||||
case "authorize_user_back":
|
||||
case "select_authorize_user":
|
||||
return {
|
||||
action: setActiveBootElement,
|
||||
value: "authorize_user",
|
||||
};
|
||||
case "load_data_no":
|
||||
return {
|
||||
action: setActiveBootElement,
|
||||
value: "load_data",
|
||||
};
|
||||
case "select_load_data":
|
||||
return { action: setActiveBootElement, value: "load_data_yes" };
|
||||
}
|
||||
},
|
||||
[setActiveBootElement]
|
||||
);
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
import { MutableRefObject, useCallback, useEffect, useRef } from "react";
|
||||
import { useBlueOrbStore, useTextRendererStore } from "../../store";
|
||||
import site_a from "../../resources/site_a.json";
|
||||
import { useCallback, useEffect } from "react";
|
||||
import { useTextRendererStore } from "../../store";
|
||||
import { StateManagerProps } from "./EventManager";
|
||||
import blue_orb_huds from "../../resources/blue_orb_huds.json";
|
||||
import site_a from "../../resources/site_a.json";
|
||||
import { SiteType } from "../../components/MainScene/Site";
|
||||
|
||||
const GreenTextManager = (props: StateManagerProps) => {
|
||||
const setGreenText = useTextRendererStore((state) => state.setGreenText);
|
||||
|
@ -16,20 +17,15 @@ const GreenTextManager = (props: StateManagerProps) => {
|
|||
(state) => state.toggleGreenText
|
||||
);
|
||||
|
||||
const blueOrbDataRef: MutableRefObject<
|
||||
{ activeBlueOrbId: string } | undefined
|
||||
> = useRef();
|
||||
|
||||
const activeBlueOrbId = useBlueOrbStore((state) => state.activeBlueOrbId);
|
||||
|
||||
blueOrbDataRef.current = {
|
||||
activeBlueOrbId: activeBlueOrbId,
|
||||
};
|
||||
|
||||
const toggleAndSetGreenText = useCallback(
|
||||
(newActiveBlueOrbId: string, newActiveHudId: string, delay: number) => {
|
||||
const targetGreenText =
|
||||
site_a[newActiveBlueOrbId as keyof typeof site_a].title;
|
||||
(
|
||||
newActiveBlueOrbId: string,
|
||||
newActiveHudId: string,
|
||||
newLevel: string,
|
||||
delay: number
|
||||
) => {
|
||||
const targetGreenText = (site_a as SiteType)[newLevel][newActiveBlueOrbId]
|
||||
.title;
|
||||
|
||||
const targetGreenTextPosData =
|
||||
blue_orb_huds[newActiveHudId as keyof typeof blue_orb_huds].medium_text;
|
||||
|
@ -49,47 +45,44 @@ const GreenTextManager = (props: StateManagerProps) => {
|
|||
[setGreenText, setGreenTextPosX, setGreenTextPosY, toggleGreenText]
|
||||
);
|
||||
|
||||
const initializeGreenTextForMediaScene = useCallback(() => {
|
||||
setTimeout(() => {
|
||||
setGreenText(
|
||||
site_a[blueOrbDataRef.current!.activeBlueOrbId as keyof typeof site_a]
|
||||
.node_name
|
||||
);
|
||||
setGreenTextPosX({ initial: 0.0, final: 0.009 });
|
||||
setGreenTextPosY(0.675);
|
||||
}, 3950);
|
||||
}, [setGreenText, setGreenTextPosX, setGreenTextPosY]);
|
||||
const initializeGreenTextForMediaScene = useCallback(
|
||||
(activeBlueOrbId: string, level: string) => {
|
||||
setTimeout(() => {
|
||||
setGreenText((site_a as SiteType)[level][activeBlueOrbId].node_name);
|
||||
setGreenTextPosX({ initial: 0.0, final: 0.009 });
|
||||
setGreenTextPosY(0.675);
|
||||
}, 3950);
|
||||
},
|
||||
[setGreenText, setGreenTextPosX, setGreenTextPosY]
|
||||
);
|
||||
|
||||
const dispatchObject = useCallback(
|
||||
(event: string, newActiveBlueOrbId: string, newActiveHudId: string) => {
|
||||
const dispatcherObjects = {
|
||||
move_up: {
|
||||
action: toggleAndSetGreenText,
|
||||
value: [newActiveBlueOrbId, newActiveHudId, 3903.704],
|
||||
},
|
||||
move_down: {
|
||||
action: toggleAndSetGreenText,
|
||||
value: [newActiveBlueOrbId, newActiveHudId, 3903.704],
|
||||
},
|
||||
move_left: {
|
||||
action: toggleAndSetGreenText,
|
||||
value: [newActiveBlueOrbId, newActiveHudId, 3903.704],
|
||||
},
|
||||
move_right: {
|
||||
action: toggleAndSetGreenText,
|
||||
value: [newActiveBlueOrbId, newActiveHudId, 3903.704],
|
||||
},
|
||||
change_blue_orb: {
|
||||
action: toggleAndSetGreenText,
|
||||
value: [newActiveBlueOrbId, newActiveHudId, 500],
|
||||
},
|
||||
throw_blue_orb_media: {
|
||||
action: initializeGreenTextForMediaScene,
|
||||
value: [],
|
||||
},
|
||||
};
|
||||
|
||||
return dispatcherObjects[event as keyof typeof dispatcherObjects];
|
||||
(
|
||||
event: string,
|
||||
newActiveBlueOrbId: string,
|
||||
newActiveHudId: string,
|
||||
newLevel: string
|
||||
) => {
|
||||
switch (event) {
|
||||
case "move_up":
|
||||
case "move_down":
|
||||
case "move_left":
|
||||
case "move_right":
|
||||
return {
|
||||
action: toggleAndSetGreenText,
|
||||
value: [newActiveBlueOrbId, newActiveHudId, newLevel, 3903.704],
|
||||
};
|
||||
case "change_blue_orb":
|
||||
return {
|
||||
action: toggleAndSetGreenText,
|
||||
value: [newActiveBlueOrbId, newActiveHudId, newLevel, 500],
|
||||
};
|
||||
case "throw_blue_orb_media":
|
||||
return {
|
||||
action: initializeGreenTextForMediaScene,
|
||||
value: [newActiveBlueOrbId, newLevel],
|
||||
};
|
||||
}
|
||||
},
|
||||
[initializeGreenTextForMediaScene, toggleAndSetGreenText]
|
||||
);
|
||||
|
@ -99,11 +92,13 @@ const GreenTextManager = (props: StateManagerProps) => {
|
|||
const eventAction = props.eventState.event;
|
||||
const newActiveBlueOrbId = props.eventState.newActiveBlueOrbId;
|
||||
const newActiveHudId = props.eventState.newActiveHudId;
|
||||
const newLevel = props.eventState.newLevel;
|
||||
|
||||
const dispatchedObject = dispatchObject(
|
||||
eventAction,
|
||||
newActiveBlueOrbId,
|
||||
newActiveHudId
|
||||
newActiveHudId,
|
||||
newLevel
|
||||
);
|
||||
|
||||
if (dispatchedObject) {
|
||||
|
|
|
@ -8,12 +8,11 @@ const LevelManager = (props: StateManagerProps) => {
|
|||
|
||||
const updateLevel = useCallback(
|
||||
(newLevel: string) => {
|
||||
setCurrentLevel(newLevel);
|
||||
setTimeout(() => {
|
||||
setCurrentLevel(newLevel);
|
||||
setActiveLevels([
|
||||
(parseInt(newLevel) - 2).toString().padStart(2, "0"),
|
||||
(parseInt(newLevel) - 1).toString().padStart(2, "0"),
|
||||
parseInt(newLevel).toString().padStart(2, "0"),
|
||||
(parseInt(newLevel) + 1).toString().padStart(2, "0"),
|
||||
(parseInt(newLevel) + 2).toString().padStart(2, "0"),
|
||||
]);
|
||||
|
|
|
@ -1,18 +1,24 @@
|
|||
import { useCallback, useEffect } from "react";
|
||||
import { useCallback, useEffect, useMemo } from "react";
|
||||
|
||||
import { StateManagerProps } from "./EventManager";
|
||||
import site_a from "../../resources/site_a.json";
|
||||
import image_table from "../../resources/image_table.json";
|
||||
import { ImageSrc, useImageStore } from "../../store";
|
||||
import { ImageSrc, useImageStore, useLevelStore } from "../../store";
|
||||
import { LevelType } from "../../components/MainScene/Site";
|
||||
|
||||
const MediaImageManager = (props: StateManagerProps) => {
|
||||
const setImages = useImageStore((state) => state.setImages);
|
||||
|
||||
const currentLevel = useLevelStore((state) => state.currentLevel);
|
||||
const currentLevelData: LevelType = useMemo(
|
||||
() => site_a[currentLevel as keyof typeof site_a],
|
||||
[currentLevel]
|
||||
);
|
||||
|
||||
const updateSceneImages = useCallback(
|
||||
(newActiveBlueOrbId: string) => {
|
||||
const node_name =
|
||||
site_a[newActiveBlueOrbId as keyof typeof site_a].node_name;
|
||||
const images = image_table[node_name as keyof typeof image_table];
|
||||
const nodeName = currentLevelData[newActiveBlueOrbId].node_name;
|
||||
const images = image_table[nodeName as keyof typeof image_table];
|
||||
|
||||
Object.values(images).forEach((img) => {
|
||||
switch (img.substr(img.length - 1)) {
|
||||
|
@ -42,7 +48,7 @@ const MediaImageManager = (props: StateManagerProps) => {
|
|||
}
|
||||
});
|
||||
},
|
||||
[setImages]
|
||||
[currentLevelData, setImages]
|
||||
);
|
||||
|
||||
const dispatchObject = useCallback(
|
||||
|
|
|
@ -1,23 +1,22 @@
|
|||
import { MutableRefObject, useCallback, useEffect, useRef } from "react";
|
||||
import { useCallback, useEffect } from "react";
|
||||
import blue_orb_huds from "../../resources/blue_orb_huds.json";
|
||||
import site_a from "../../resources/site_a.json";
|
||||
import {
|
||||
useBlueOrbStore,
|
||||
useHudStore,
|
||||
useTextRendererStore,
|
||||
} from "../../store";
|
||||
import { useTextRendererStore } from "../../store";
|
||||
import { SiteType } from "../../components/MainScene/Site";
|
||||
|
||||
type AnimateYellowTextWithMove = (
|
||||
yellowLetterPosYOffset: number,
|
||||
yellowLetterPosXOffset: number,
|
||||
newActiveHudId: string,
|
||||
newActiveBlueOrbId: string,
|
||||
newLevel: string,
|
||||
delay: number
|
||||
) => void;
|
||||
|
||||
type AnimateYellowTextWithoutMove = (
|
||||
newActiveHudId: string,
|
||||
newActiveBlueOrbId: string
|
||||
newActiveBlueOrbId: string,
|
||||
newLevel: string
|
||||
) => void;
|
||||
|
||||
type AnimateMediaYellowText = (
|
||||
|
@ -25,39 +24,7 @@ type AnimateMediaYellowText = (
|
|||
targetMediaTextPos: number[]
|
||||
) => void;
|
||||
|
||||
type YellowTextDispatchData = {
|
||||
action:
|
||||
| AnimateYellowTextWithMove
|
||||
| AnimateYellowTextWithoutMove
|
||||
| AnimateMediaYellowText;
|
||||
value?: any;
|
||||
};
|
||||
|
||||
type YellowTextDispatcher = {
|
||||
move_up: YellowTextDispatchData;
|
||||
move_down: YellowTextDispatchData;
|
||||
move_left: YellowTextDispatchData;
|
||||
move_right: YellowTextDispatchData;
|
||||
change_blue_orb: YellowTextDispatchData;
|
||||
play_down: YellowTextDispatchData;
|
||||
exit_up: YellowTextDispatchData;
|
||||
throw_blue_orb_media: YellowTextDispatchData;
|
||||
exit_media_scene: YellowTextDispatchData;
|
||||
};
|
||||
|
||||
const YellowTextManager = (props: any) => {
|
||||
const activeBlueOrbId = useBlueOrbStore((state) => state.activeBlueOrbId);
|
||||
const activeHudId = useHudStore((state) => state.activeHudId);
|
||||
|
||||
const blueOrbDataRef: MutableRefObject<
|
||||
{ activeBlueOrbId: string; activeHudId: string } | undefined
|
||||
> = useRef();
|
||||
|
||||
blueOrbDataRef.current = {
|
||||
activeBlueOrbId: activeBlueOrbId,
|
||||
activeHudId: activeHudId,
|
||||
};
|
||||
|
||||
const setYellowText = useTextRendererStore((state) => state.setYellowText);
|
||||
|
||||
const setYellowTextOffsetXCoeff = useTextRendererStore(
|
||||
|
@ -83,6 +50,7 @@ const YellowTextManager = (props: any) => {
|
|||
yellowLetterPosYOffset: number,
|
||||
newActiveHudId: string,
|
||||
newActiveBlueOrbId: string,
|
||||
newLevel: string,
|
||||
delay: number
|
||||
) => {
|
||||
// animate the letters to match that of site's
|
||||
|
@ -109,7 +77,7 @@ const YellowTextManager = (props: any) => {
|
|||
);
|
||||
// set new text according to the node name
|
||||
setYellowText(
|
||||
site_a[newActiveBlueOrbId as keyof typeof site_a].node_name
|
||||
(site_a as SiteType)[newLevel][newActiveBlueOrbId].node_name
|
||||
);
|
||||
}, 3000);
|
||||
|
||||
|
@ -129,7 +97,7 @@ const YellowTextManager = (props: any) => {
|
|||
);
|
||||
|
||||
const animateYellowTextWithoutMove: AnimateYellowTextWithoutMove = useCallback(
|
||||
(newActiveHudId: string, newActiveBlueOrbId: string) => {
|
||||
(newActiveHudId: string, newActiveBlueOrbId: string, level: string) => {
|
||||
// make current hud big text shrink
|
||||
setYellowTextOffsetXCoeff(-1);
|
||||
|
||||
|
@ -148,7 +116,7 @@ const YellowTextManager = (props: any) => {
|
|||
setTimeout(() => {
|
||||
// set new text according to the node name
|
||||
setYellowText(
|
||||
site_a[newActiveBlueOrbId as keyof typeof site_a].node_name
|
||||
(site_a as SiteType)[level][newActiveBlueOrbId].node_name
|
||||
);
|
||||
}, 1000);
|
||||
|
||||
|
@ -203,69 +171,93 @@ const YellowTextManager = (props: any) => {
|
|||
}, 3950);
|
||||
}, [setYellowText, setYellowTextPosX, setYellowTextPosY]);
|
||||
|
||||
const initializeYellowTextForMainScene = useCallback(() => {
|
||||
if (blueOrbDataRef.current) {
|
||||
setYellowText(
|
||||
site_a[blueOrbDataRef.current!.activeBlueOrbId as keyof typeof site_a]
|
||||
.node_name
|
||||
);
|
||||
const initializeYellowTextForMainScene = useCallback(
|
||||
(activeBlueOrbId: string, level: string) => {
|
||||
setYellowText((site_a as SiteType)[level][activeBlueOrbId].node_name);
|
||||
setYellowTextPosX(
|
||||
blue_orb_huds[
|
||||
blueOrbDataRef.current!.activeHudId as keyof typeof blue_orb_huds
|
||||
].big_text[0]
|
||||
blue_orb_huds[activeBlueOrbId as keyof typeof blue_orb_huds].big_text[0]
|
||||
);
|
||||
setYellowTextPosY(
|
||||
blue_orb_huds[
|
||||
blueOrbDataRef.current!.activeHudId as keyof typeof blue_orb_huds
|
||||
].big_text[1]
|
||||
blue_orb_huds[activeBlueOrbId as keyof typeof blue_orb_huds].big_text[1]
|
||||
);
|
||||
}
|
||||
}, [setYellowText, setYellowTextPosX, setYellowTextPosY]);
|
||||
},
|
||||
[setYellowText, setYellowTextPosX, setYellowTextPosY]
|
||||
);
|
||||
|
||||
const dispatchObject = useCallback(
|
||||
(
|
||||
event: string,
|
||||
newActiveHudId: string | undefined,
|
||||
newActiveBlueOrbId: string | undefined
|
||||
newActiveBlueOrbId: string | undefined,
|
||||
newLevel: string
|
||||
) => {
|
||||
const dispatcherObjects: YellowTextDispatcher = {
|
||||
move_up: {
|
||||
action: animateYellowTextWithMove,
|
||||
value: [0, -1.5, newActiveHudId, newActiveBlueOrbId, 1300],
|
||||
},
|
||||
move_down: {
|
||||
action: animateYellowTextWithMove,
|
||||
value: [0, 1.5, newActiveHudId, newActiveBlueOrbId, 1300],
|
||||
},
|
||||
move_left: {
|
||||
action: animateYellowTextWithMove,
|
||||
value: [Math.PI / 4, 0, newActiveHudId, newActiveBlueOrbId, 1100],
|
||||
},
|
||||
move_right: {
|
||||
action: animateYellowTextWithMove,
|
||||
value: [-Math.PI / 4, 0, newActiveHudId, newActiveBlueOrbId, 1100],
|
||||
},
|
||||
change_blue_orb: {
|
||||
action: animateYellowTextWithoutMove,
|
||||
value: [newActiveHudId, newActiveBlueOrbId],
|
||||
},
|
||||
exit_up: {
|
||||
action: animateMediaYellowText,
|
||||
value: ["Play", [-0.8, 0.05, 0.6]],
|
||||
},
|
||||
play_down: {
|
||||
action: animateMediaYellowText,
|
||||
value: ["Exit", [-0.8, -0.08, 0.6]],
|
||||
},
|
||||
throw_blue_orb_media: {
|
||||
action: initializeYellowTextForMediaScene,
|
||||
},
|
||||
exit_media_scene: {
|
||||
action: initializeYellowTextForMainScene,
|
||||
},
|
||||
};
|
||||
|
||||
return dispatcherObjects[event as keyof typeof dispatcherObjects];
|
||||
switch (event) {
|
||||
case "move_up":
|
||||
return {
|
||||
action: animateYellowTextWithMove,
|
||||
value: [
|
||||
0,
|
||||
-1.5,
|
||||
newActiveHudId,
|
||||
newActiveBlueOrbId,
|
||||
newLevel,
|
||||
1300,
|
||||
],
|
||||
};
|
||||
case "move_down":
|
||||
return {
|
||||
action: animateYellowTextWithMove,
|
||||
value: [0, 1.5, newActiveHudId, newActiveBlueOrbId, newLevel, 1300],
|
||||
};
|
||||
case "move_left":
|
||||
return {
|
||||
action: animateYellowTextWithMove,
|
||||
value: [
|
||||
Math.PI / 4,
|
||||
0,
|
||||
newActiveHudId,
|
||||
newActiveBlueOrbId,
|
||||
newLevel,
|
||||
1100,
|
||||
],
|
||||
};
|
||||
case "move_right":
|
||||
return {
|
||||
action: animateYellowTextWithMove,
|
||||
value: [
|
||||
-Math.PI / 4,
|
||||
0,
|
||||
newActiveHudId,
|
||||
newActiveBlueOrbId,
|
||||
newLevel,
|
||||
1100,
|
||||
],
|
||||
};
|
||||
case "exit_up":
|
||||
return {
|
||||
action: animateMediaYellowText,
|
||||
value: ["Play", [-0.8, 0.05, 0.6]],
|
||||
};
|
||||
case "change_blue_orb":
|
||||
return {
|
||||
action: animateYellowTextWithoutMove,
|
||||
value: [newActiveHudId, newActiveBlueOrbId, newLevel],
|
||||
};
|
||||
case "play_down":
|
||||
return {
|
||||
action: animateMediaYellowText,
|
||||
value: ["Exit", [-0.8, -0.08, 0.6]],
|
||||
};
|
||||
case "throw_blue_orb_media":
|
||||
return {
|
||||
action: initializeYellowTextForMediaScene,
|
||||
};
|
||||
case "exit_media_scene":
|
||||
return {
|
||||
action: initializeYellowTextForMainScene,
|
||||
value: [newActiveBlueOrbId, newLevel],
|
||||
};
|
||||
}
|
||||
},
|
||||
[
|
||||
animateMediaYellowText,
|
||||
|
@ -282,11 +274,13 @@ const YellowTextManager = (props: any) => {
|
|||
|
||||
const newActiveBlueOrbId = props.eventState.newActiveBlueOrbId;
|
||||
const newActiveHudId = props.eventState.newActiveHudId;
|
||||
const newLevel = props.eventState.newLevel;
|
||||
|
||||
const dispatchedObject = dispatchObject(
|
||||
eventAction,
|
||||
newActiveHudId,
|
||||
newActiveBlueOrbId
|
||||
newActiveBlueOrbId,
|
||||
newLevel
|
||||
);
|
||||
|
||||
if (dispatchedObject) {
|
||||
|
|
|
@ -96,8 +96,8 @@ const handleMainSceneEvent = (gameContext: GameContext) => {
|
|||
newSiteRotIdx as keyof typeof available_blue_orbs_on_projection
|
||||
][newBlueOrbRowIdx as number][newBlueOrbColIdx as number];
|
||||
|
||||
const blueOrbType =
|
||||
site_a[newActiveBlueOrbId as keyof typeof site_a].type;
|
||||
const blueOrbType = (site_a as any)[newLevel][newActiveBlueOrbId]
|
||||
.type;
|
||||
|
||||
const eventAnimation = "throw_blue_orb_";
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -9,10 +9,16 @@ import MainSceneIntro from "../components/MainSceneIntro";
|
|||
import GrayPlanes from "../components/MainScene/GrayPlanes";
|
||||
import MiddleRing from "../components/MainScene/MiddleRing";
|
||||
import Starfield from "../components/MainScene/Starfield";
|
||||
import {useBlueOrbStore, useHudStore, useLainStore, useMainGroupStore} from "../store";
|
||||
import {
|
||||
useBlueOrbStore,
|
||||
useHudStore,
|
||||
useLainStore,
|
||||
useMainGroupStore,
|
||||
} from "../store";
|
||||
import TextRenderer from "../components/TextRenderer/TextRenderer";
|
||||
import HUD from "../components/MainScene/HUD";
|
||||
import YellowOrb from "../components/MainScene/YellowOrb";
|
||||
import CurrentLevelNodes from "../components/MainScene/CurrentLevelNodes";
|
||||
|
||||
const MainScene = () => {
|
||||
const setLainMoveState = useLainStore((state) => state.setLainMoveState);
|
||||
|
@ -54,6 +60,7 @@ const MainScene = () => {
|
|||
>
|
||||
<Preloader />
|
||||
<Site />
|
||||
<CurrentLevelNodes />
|
||||
<HUD />
|
||||
<TextRenderer />
|
||||
<YellowOrb />
|
||||
|
|
|
@ -298,7 +298,7 @@ export const useMiddleRingStore = create<MiddleRingState>((set) => ({
|
|||
|
||||
export const useLevelStore = create<LevelState>((set) => ({
|
||||
currentLevel: "04",
|
||||
activeLevels: ["02", "03", "04", "05", "06"],
|
||||
activeLevels: ["02", "03", "05", "06"],
|
||||
setActiveLevels: (to) => set(() => ({ activeLevels: to })),
|
||||
setCurrentLevel: (to) => set(() => ({ currentLevel: to })),
|
||||
}));
|
||||
|
@ -394,7 +394,7 @@ export const useMediaWordStore = create<MediaWordState>((set) => ({
|
|||
}));
|
||||
|
||||
export const useSceneStore = create<SceneState>((set) => ({
|
||||
currentScene: "gate",
|
||||
currentScene: "main",
|
||||
setScene: (to) => set(() => ({ currentScene: to })),
|
||||
}));
|
||||
|
||||
|
|
Loading…
Reference in a new issue