aboutsummaryrefslogtreecommitdiffstats
path: root/src/app/game/page.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/game/page.tsx')
-rw-r--r--src/app/game/page.tsx34
1 files changed, 25 insertions, 9 deletions
diff --git a/src/app/game/page.tsx b/src/app/game/page.tsx
index 7e6e9c3..aa953a7 100644
--- a/src/app/game/page.tsx
+++ b/src/app/game/page.tsx
@@ -30,6 +30,7 @@ import {
CurrentWrap,
LineTimingMeta,
LineTimingValue,
+ LineTimingRow,
LineTimingBar,
LineTimingFill,
CharRow,
@@ -66,7 +67,7 @@ import {
HomeBtn,
} from "./page.styles";
import { gReducer, initialGState } from "./game.stat";
-import { formatTime, parseLrcLines } from "./game.utils";
+import { formatTime, parseLrcLines, calculateCPSNeeded } from "./game.utils";
type GamePhase = "idle" | "countdown" | "playing" | "paused" | "finished";
@@ -82,6 +83,7 @@ function GameInner() {
const [currentMs, setCurrentMs] = useState(0);
const [lineTimingPct, setLineTimingPct] = useState(0);
const [lineRemainingMs, setLineRemainingMs] = useState(0);
+ const [currentLineTime, setCurrentLineTime] = useState(0);
const [duration, setDuration] = useState(0);
const [progressPct, setProgressPct] = useState(0);
const [gameDurationMs, setGameDurationMs] = useState(0);
@@ -169,6 +171,7 @@ function GameInner() {
lineAnimRef.current = { startMs: 0, endMs: 0, startPerf: 0 };
setLineTimingPct(0);
setLineRemainingMs(0);
+ setCurrentLineTime(-1);
return;
}
const start = gameLines[idx].millisecond;
@@ -179,7 +182,9 @@ function GameInner() {
startPerf: performance.now(),
};
setLineTimingPct(0);
- setLineRemainingMs(Math.max(0, end - start));
+ const currentLineTime = end - start;
+ setLineRemainingMs(Math.max(0, currentLineTime));
+ setCurrentLineTime(Math.max(currentLineTime, currentLineTime));
}, [g.displayedLineIdx, gameLines]);
useEffect(() => {
@@ -561,12 +566,23 @@ function GameInner() {
</UpcomingText>
</UpcomingWrap>
<CurrentWrap style={{ position: "relative" }}>
- <LineTimingMeta>
- Time left:{" "}
- <LineTimingValue>
- {Math.max(0, lineRemainingMs / 1000).toFixed(1)}s
- </LineTimingValue>
- </LineTimingMeta>
+ <LineTimingRow>
+ <LineTimingMeta>
+ Time left:{" "}
+ <LineTimingValue>
+ {Math.max(0, lineRemainingMs / 1000).toFixed(1)}s
+ </LineTimingValue>
+ </LineTimingMeta>
+ <LineTimingMeta>
+ Estimated CPS:{" "}
+ <LineTimingValue>
+ {calculateCPSNeeded(
+ gameLines[g.displayedLineIdx].content,
+ currentLineTime / 1000
+ ).toFixed(1)}
+ </LineTimingValue>
+ </LineTimingMeta>
+ </LineTimingRow>
<LineTimingBar>
<LineTimingFill $pct={lineTimingPct} />
</LineTimingBar>
@@ -625,7 +641,7 @@ function GameInner() {
</CharRow>
{clearShowing && <ClearToast>CLEAR!</ClearToast>}
<CompletedLineFade>
- {g.lineCompleted ? "Cleared - waiting for next line..." : ""}
+ {g.lineCompleted ? "Cleared - waiting for next line..." : gameLines[g.displayedLineIdx].content}
</CompletedLineFade>
</CurrentWrap>
</>
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage