diff --git a/src/context.ts b/src/context.ts index 7b00108..f6de514 100644 --- a/src/context.ts +++ b/src/context.ts @@ -27,4 +27,5 @@ export type UIContext = { cut: number; undo: number; redo: number; + paused: boolean; }; diff --git a/src/main.ts b/src/main.ts index 56e30db..f9c158d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,4 +1,4 @@ -import { Application, Container } from "pixi.js"; +import { Application, Container, type Ticker } from "pixi.js"; import type { Writable } from "svelte/store"; import type { Context, UIContext } from "./context.ts"; import { Grid } from "./grid.ts"; @@ -11,6 +11,16 @@ export async function setup( stageDefinition: StageDefinition, uiContext: Writable, ) { + let paused = false; + uiContext.subscribe((v) => { + paused = v.paused; + }); + const unlessPaused = (f: (ticker: Ticker) => void) => (ticker: Ticker) => { + if (!paused) { + f(ticker); + } + }; + function tick() { // highlight is re-rendered every tick const highlight = player.createHighlight(cx); @@ -50,19 +60,23 @@ export async function setup( elapsed: 0, uiContext, }; - app.ticker.add((ticker) => { - cx.elapsed += ticker.deltaTime; - }); + app.ticker.add( + unlessPaused((ticker) => { + cx.elapsed += ticker.deltaTime; + }), + ); const player = new Player(cx, bunnyTexture); - app.ticker.add((ticker) => player.tick(cx, ticker)); + app.ticker.add(unlessPaused((ticker) => player.tick(cx, ticker))); app.stage.addChild(player.sprite); let cleanup: undefined | (() => void) = undefined; - app.ticker.add(() => { - if (cleanup) cleanup(); - cleanup = tick(); - }); + app.ticker.add( + unlessPaused(() => { + if (cleanup) cleanup(); + cleanup = tick(); + }), + ); // Append the application canvas to the document body el.appendChild(app.canvas); diff --git a/src/ui-components/Ability.svelte b/src/ui-components/Ability.svelte index 692645a..baed080 100644 --- a/src/ui-components/Ability.svelte +++ b/src/ui-components/Ability.svelte @@ -2,9 +2,13 @@ import Key from "./Key.svelte"; type Props = { name: string; key: string; num: number }; const { name, num, key }: Props = $props(); +let isMacOS: boolean = $state(false); +$effect(() => { + isMacOS = navigator.userAgent.includes("Mac OS X"); +}); - - 0} /> + + 0} /> {name} {isFinite(num) ? num : "∞"} diff --git a/src/ui-components/Game.svelte b/src/ui-components/Game.svelte index 86e0e93..e02a10f 100644 --- a/src/ui-components/Game.svelte +++ b/src/ui-components/Game.svelte @@ -1,10 +1,12 @@
@@ -32,7 +46,9 @@ $effect(() => { style="position: fixed; left: 0; top: 0; right: 0; display: flex; align-items: baseline;" > Stage: - {stageNum} + {stageNum} + + to pause Clipboard:
@@ -62,6 +78,24 @@ $effect(() => {
+ {#if $uiContext.paused} + + {/if}
diff --git a/src/ui-components/Key.svelte b/src/ui-components/Key.svelte index 5bc33fa..0688091 100644 --- a/src/ui-components/Key.svelte +++ b/src/ui-components/Key.svelte @@ -1,13 +1,9 @@ - {isMacOS ? "⌘+" + key : "Ctrl+" + key} + {key}