From c3935829780659e2a35cf305f5086248b5e0159d Mon Sep 17 00:00:00 2001 From: dylan <> Date: Sat, 20 Apr 2024 23:51:46 -0700 Subject: [PATCH] Small improvement --- src/client/player/Player.tsx | 43 ++++++++++++++++++++++++++++++++++-- src/client/player/data.ts | 16 ++++++++++++++ 2 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 src/client/player/data.ts diff --git a/src/client/player/Player.tsx b/src/client/player/Player.tsx index f9fdf6b..7d73445 100644 --- a/src/client/player/Player.tsx +++ b/src/client/player/Player.tsx @@ -3,6 +3,7 @@ import { Mathuscript, parseMathuscript } from "./parse"; import katex from "katex"; import { useCallback, useLayoutEffect, useMemo, useRef, useState } from "react"; import { MathText } from "./MathText"; +import { characterData } from "./data"; type VisualState = { characters: {name: string, emotion: string, x: number}[], @@ -19,6 +20,7 @@ const afterStep = (state: VisualState, step: Mathuscript[number]): VisualState = let char = characters.find(c => c.name === step.name); if (!char) { char = {name: step.name, emotion: "default", x: 0.5}; + characters.push(char); } char.emotion = step.emotion ?? char.emotion; dialog.name = step.name; @@ -28,6 +30,13 @@ const afterStep = (state: VisualState, step: Mathuscript[number]): VisualState = return newState; } +const getCharData = (name: string | null) => { + if (name && name in characterData) { + return characterData[name as keyof typeof characterData]; + } + return null; +} + export const MathuscriptPlayer = (props: { script: string }) => { const {script} = props; const parsedScript = useMemo(() => parseMathuscript(script), [script]); @@ -45,6 +54,8 @@ export const MathuscriptPlayer = (props: { script: string }) => { } }, [index, parsedScript, setIndex, setVisualState]); + const speakingChar = getCharData(visualState.dialog.name); + return ( <>
{ background-size: 118%; background-position-x: center; background-position-y: bottom; + overflow: hidden; `}>
{ {visualState.board.text}
+
+ { + visualState.characters.map(c => { + // TODO: make it change with emotion + const char = getCharData(c.name); + if (!char) { + return null; + } + return + }) + } +
{ color: white; `}> { - visualState.dialog.name && <> - {visualState.dialog.name}. {visualState.dialog.text} + speakingChar && <> + {speakingChar.displayName}. {visualState.dialog.text} }
diff --git a/src/client/player/data.ts b/src/client/player/data.ts new file mode 100644 index 0000000..0f72983 --- /dev/null +++ b/src/client/player/data.ts @@ -0,0 +1,16 @@ +export const characterData = { + bridget: { + displayName: "Bridget", + assets: { + default: "/assets/bridget.png", + fallback: "/assets/bridget.png", + }, + }, + axelle: { + displayName: "Axelle", + assets: { + default: "/assets/bridget.png", + fallback: "/assets/bridget.png", + }, + } +} \ No newline at end of file