create-pixi-vn 1.7.1 → 1.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/template-nqtr-react-vite-muijoy/package.json +2 -2
- package/template-nqtr-react-vite-muijoy/src/constans.ts +1 -0
- package/template-nqtr-react-vite-muijoy/src/hooks/useMinigame.ts +54 -0
- package/template-nqtr-react-vite-muijoy/src/hooks/useMyNavigate.ts +1 -1
- package/template-nqtr-react-vite-muijoy/src/screens/NarrationScreen.tsx +4 -1
- package/template-nqtr-react-vite-muijoy-ink/package.json +2 -2
- package/template-nqtr-react-vite-muijoy-ink/src/constans.ts +1 -0
- package/template-nqtr-react-vite-muijoy-ink/src/hooks/useMinigame.ts +54 -0
- package/template-nqtr-react-vite-muijoy-ink/src/hooks/useMyNavigate.ts +1 -1
- package/template-nqtr-react-vite-muijoy-ink/src/screens/NarrationScreen.tsx +4 -1
- package/template-nqtr-react-vite-muijoy-ink-tauri/package.json +2 -2
- package/template-nqtr-react-vite-muijoy-ink-tauri/src/constans.ts +1 -0
- package/template-nqtr-react-vite-muijoy-ink-tauri/src/hooks/useMinigame.ts +54 -0
- package/template-nqtr-react-vite-muijoy-ink-tauri/src/hooks/useMyNavigate.ts +1 -1
- package/template-nqtr-react-vite-muijoy-ink-tauri/src/screens/NarrationScreen.tsx +4 -1
- package/template-nqtr-react-vite-muijoy-tauri/package.json +2 -2
- package/template-nqtr-react-vite-muijoy-tauri/src/constans.ts +1 -0
- package/template-nqtr-react-vite-muijoy-tauri/src/hooks/useMinigame.ts +54 -0
- package/template-nqtr-react-vite-muijoy-tauri/src/hooks/useMyNavigate.ts +1 -1
- package/template-nqtr-react-vite-muijoy-tauri/src/screens/NarrationScreen.tsx +4 -1
- package/template-react-vite-muijoy/package.json +1 -1
- package/template-react-vite-muijoy/src/constans.ts +1 -0
- package/template-react-vite-muijoy/src/hooks/useMinigame.ts +54 -0
- package/template-react-vite-muijoy/src/hooks/useMyNavigate.ts +1 -1
- package/template-react-vite-muijoy/src/screens/NarrationScreen.tsx +4 -1
- package/template-react-vite-muijoy-ink/package.json +1 -1
- package/template-react-vite-muijoy-ink/src/constans.ts +1 -0
- package/template-react-vite-muijoy-ink/src/hooks/useMinigame.ts +54 -0
- package/template-react-vite-muijoy-ink/src/hooks/useMyNavigate.ts +1 -1
- package/template-react-vite-muijoy-ink/src/labels/animations-labels.ts +1 -1
- package/template-react-vite-muijoy-ink/src/screens/NarrationScreen.tsx +4 -1
- package/template-react-vite-muijoy-ink-tauri/package.json +1 -1
- package/template-react-vite-muijoy-ink-tauri/src/constans.ts +1 -0
- package/template-react-vite-muijoy-ink-tauri/src/hooks/useMinigame.ts +54 -0
- package/template-react-vite-muijoy-ink-tauri/src/hooks/useMyNavigate.ts +1 -1
- package/template-react-vite-muijoy-ink-tauri/src/labels/animations-labels.ts +1 -1
- package/template-react-vite-muijoy-ink-tauri/src/screens/NarrationScreen.tsx +4 -1
- package/template-react-vite-muijoy-tauri/package.json +1 -1
- package/template-react-vite-muijoy-tauri/src/constans.ts +1 -0
- package/template-react-vite-muijoy-tauri/src/hooks/useMinigame.ts +54 -0
- package/template-react-vite-muijoy-tauri/src/hooks/useMyNavigate.ts +1 -1
- package/template-react-vite-muijoy-tauri/src/screens/NarrationScreen.tsx +4 -1
- package/template-story-react-vite-muijoy/package.json +1 -1
- package/template-story-react-vite-muijoy/src/constans.ts +1 -0
- package/template-story-react-vite-muijoy/src/hooks/useMinigame.ts +54 -0
- package/template-story-react-vite-muijoy/src/hooks/useMyNavigate.ts +1 -1
- package/template-story-react-vite-muijoy/src/screens/NarrationScreen.tsx +4 -1
- package/template-story-react-vite-muijoy-ink/package.json +1 -1
- package/template-story-react-vite-muijoy-ink/src/constans.ts +1 -0
- package/template-story-react-vite-muijoy-ink/src/hooks/useMinigame.ts +54 -0
- package/template-story-react-vite-muijoy-ink/src/hooks/useMyNavigate.ts +1 -1
- package/template-story-react-vite-muijoy-ink/src/labels/animations-labels.ts +1 -1
- package/template-story-react-vite-muijoy-ink/src/screens/NarrationScreen.tsx +4 -1
- package/template-story-react-vite-muijoy-ink-tauri/package.json +1 -1
- package/template-story-react-vite-muijoy-ink-tauri/src/constans.ts +1 -0
- package/template-story-react-vite-muijoy-ink-tauri/src/hooks/useMinigame.ts +54 -0
- package/template-story-react-vite-muijoy-ink-tauri/src/hooks/useMyNavigate.ts +1 -1
- package/template-story-react-vite-muijoy-ink-tauri/src/labels/animations-labels.ts +1 -1
- package/template-story-react-vite-muijoy-ink-tauri/src/screens/NarrationScreen.tsx +4 -1
- package/template-story-react-vite-muijoy-tauri/package.json +1 -1
- package/template-story-react-vite-muijoy-tauri/src/constans.ts +1 -0
- package/template-story-react-vite-muijoy-tauri/src/hooks/useMinigame.ts +54 -0
- package/template-story-react-vite-muijoy-tauri/src/hooks/useMyNavigate.ts +1 -1
- package/template-story-react-vite-muijoy-tauri/src/screens/NarrationScreen.tsx +4 -1
package/package.json
CHANGED
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
"preview": "vite preview"
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@drincs/nqtr": "^0.5.
|
|
15
|
-
"@drincs/pixi-vn": "^1.3.
|
|
14
|
+
"@drincs/nqtr": "^0.5.7",
|
|
15
|
+
"@drincs/pixi-vn": "^1.3.13",
|
|
16
16
|
"@emotion/react": "^11.14.0",
|
|
17
17
|
"@emotion/styled": "^11.14.1",
|
|
18
18
|
"@mui/icons-material": "^7.3.1",
|
|
@@ -8,6 +8,7 @@ export const REFRESH_SAVE_LOCAL_STORAGE_KEY = "refresh_save";
|
|
|
8
8
|
export const SELECTED_QUEST_STORAGE_KEY = "selected_quest";
|
|
9
9
|
|
|
10
10
|
export const CANVAS_UI_LAYER_NAME = "ui";
|
|
11
|
+
export const CANVAS_MINIGAME_LAYER_NAME = "minigame";
|
|
11
12
|
|
|
12
13
|
export const SKIP_DELAY = 100;
|
|
13
14
|
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { canvas, Layer, PIXI } from "@drincs/pixi-vn";
|
|
2
|
+
import { useEffect, useRef } from "react";
|
|
3
|
+
import { CANVAS_MINIGAME_LAYER_NAME } from "../constans";
|
|
4
|
+
|
|
5
|
+
export default function useMinigame(
|
|
6
|
+
game: (layer: Layer) => void,
|
|
7
|
+
props?: {
|
|
8
|
+
onStart?: () => Promise<void>;
|
|
9
|
+
onExit?: (layer: Layer) => void;
|
|
10
|
+
}
|
|
11
|
+
) {
|
|
12
|
+
const loading = useRef(false);
|
|
13
|
+
|
|
14
|
+
// Keep latest callbacks in refs to avoid effect restarts
|
|
15
|
+
const startRef = useRef<() => Promise<void>>(props?.onStart ?? (async () => {}));
|
|
16
|
+
const exitRef = useRef<(layer: Layer) => void>(props?.onExit);
|
|
17
|
+
|
|
18
|
+
// Update refs when props change, without changing effect identity
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
startRef.current = props?.onStart ?? (async () => {});
|
|
21
|
+
}, [props?.onStart]);
|
|
22
|
+
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
exitRef.current = props?.onExit;
|
|
25
|
+
}, [props?.onExit]);
|
|
26
|
+
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
// Create the layer and start the game once
|
|
29
|
+
loading.current = true;
|
|
30
|
+
const layer = canvas.addLayer(CANVAS_MINIGAME_LAYER_NAME, new PIXI.Container());
|
|
31
|
+
if (!layer) {
|
|
32
|
+
console.error("Failed to create UI layer for minigame");
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
let cancelled = false;
|
|
37
|
+
|
|
38
|
+
startRef.current().then(() => {
|
|
39
|
+
if (cancelled) return;
|
|
40
|
+
loading.current = false;
|
|
41
|
+
game(layer);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
return () => {
|
|
45
|
+
cancelled = true;
|
|
46
|
+
canvas.removeLayer(CANVAS_MINIGAME_LAYER_NAME);
|
|
47
|
+
if (exitRef.current) {
|
|
48
|
+
exitRef.current(layer);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}, [game]);
|
|
52
|
+
|
|
53
|
+
return { loading };
|
|
54
|
+
}
|
|
@@ -2,7 +2,7 @@ import { Assets } from "@drincs/pixi-vn";
|
|
|
2
2
|
import { NavigateFunction, NavigateOptions, To, useNavigate } from "react-router-dom";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* https://pixi-vn.web.app/
|
|
5
|
+
* https://pixi-vn.web.app/it/start/interface-navigate#block-back-forward
|
|
6
6
|
*/
|
|
7
7
|
export default function useMyNavigate(): NavigateFunction {
|
|
8
8
|
const navigate = useNavigate();
|
|
@@ -207,7 +207,10 @@ function NarrationScreenText({ paragraphRef }: { paragraphRef: RefObject<HTMLDiv
|
|
|
207
207
|
}, []);
|
|
208
208
|
|
|
209
209
|
return (
|
|
210
|
-
<p
|
|
210
|
+
<p
|
|
211
|
+
className={`prose ${mode === "dark" ? "dark:prose-invert" : ""}`}
|
|
212
|
+
style={{ margin: 0, padding: 0, maxWidth: "100%" }}
|
|
213
|
+
>
|
|
211
214
|
<span>
|
|
212
215
|
<Markdown
|
|
213
216
|
remarkPlugins={[remarkGfm]}
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
"preview": "vite preview"
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@drincs/nqtr": "^0.5.
|
|
15
|
-
"@drincs/pixi-vn": "^1.3.
|
|
14
|
+
"@drincs/nqtr": "^0.5.7",
|
|
15
|
+
"@drincs/pixi-vn": "^1.3.13",
|
|
16
16
|
"@drincs/pixi-vn-ink": "^0.8.0",
|
|
17
17
|
"@emotion/react": "^11.14.0",
|
|
18
18
|
"@emotion/styled": "^11.14.1",
|
|
@@ -8,6 +8,7 @@ export const REFRESH_SAVE_LOCAL_STORAGE_KEY = "refresh_save";
|
|
|
8
8
|
export const SELECTED_QUEST_STORAGE_KEY = "selected_quest";
|
|
9
9
|
|
|
10
10
|
export const CANVAS_UI_LAYER_NAME = "ui";
|
|
11
|
+
export const CANVAS_MINIGAME_LAYER_NAME = "minigame";
|
|
11
12
|
|
|
12
13
|
export const SKIP_DELAY = 100;
|
|
13
14
|
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { canvas, Layer, PIXI } from "@drincs/pixi-vn";
|
|
2
|
+
import { useEffect, useRef } from "react";
|
|
3
|
+
import { CANVAS_MINIGAME_LAYER_NAME } from "../constans";
|
|
4
|
+
|
|
5
|
+
export default function useMinigame(
|
|
6
|
+
game: (layer: Layer) => void,
|
|
7
|
+
props?: {
|
|
8
|
+
onStart?: () => Promise<void>;
|
|
9
|
+
onExit?: (layer: Layer) => void;
|
|
10
|
+
}
|
|
11
|
+
) {
|
|
12
|
+
const loading = useRef(false);
|
|
13
|
+
|
|
14
|
+
// Keep latest callbacks in refs to avoid effect restarts
|
|
15
|
+
const startRef = useRef<() => Promise<void>>(props?.onStart ?? (async () => {}));
|
|
16
|
+
const exitRef = useRef<(layer: Layer) => void>(props?.onExit);
|
|
17
|
+
|
|
18
|
+
// Update refs when props change, without changing effect identity
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
startRef.current = props?.onStart ?? (async () => {});
|
|
21
|
+
}, [props?.onStart]);
|
|
22
|
+
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
exitRef.current = props?.onExit;
|
|
25
|
+
}, [props?.onExit]);
|
|
26
|
+
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
// Create the layer and start the game once
|
|
29
|
+
loading.current = true;
|
|
30
|
+
const layer = canvas.addLayer(CANVAS_MINIGAME_LAYER_NAME, new PIXI.Container());
|
|
31
|
+
if (!layer) {
|
|
32
|
+
console.error("Failed to create UI layer for minigame");
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
let cancelled = false;
|
|
37
|
+
|
|
38
|
+
startRef.current().then(() => {
|
|
39
|
+
if (cancelled) return;
|
|
40
|
+
loading.current = false;
|
|
41
|
+
game(layer);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
return () => {
|
|
45
|
+
cancelled = true;
|
|
46
|
+
canvas.removeLayer(CANVAS_MINIGAME_LAYER_NAME);
|
|
47
|
+
if (exitRef.current) {
|
|
48
|
+
exitRef.current(layer);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}, [game]);
|
|
52
|
+
|
|
53
|
+
return { loading };
|
|
54
|
+
}
|
|
@@ -2,7 +2,7 @@ import { Assets } from "@drincs/pixi-vn";
|
|
|
2
2
|
import { NavigateFunction, NavigateOptions, To, useNavigate } from "react-router-dom";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* https://pixi-vn.web.app/
|
|
5
|
+
* https://pixi-vn.web.app/it/start/interface-navigate#block-back-forward
|
|
6
6
|
*/
|
|
7
7
|
export default function useMyNavigate(): NavigateFunction {
|
|
8
8
|
const navigate = useNavigate();
|
|
@@ -207,7 +207,10 @@ function NarrationScreenText({ paragraphRef }: { paragraphRef: RefObject<HTMLDiv
|
|
|
207
207
|
}, []);
|
|
208
208
|
|
|
209
209
|
return (
|
|
210
|
-
<p
|
|
210
|
+
<p
|
|
211
|
+
className={`prose ${mode === "dark" ? "dark:prose-invert" : ""}`}
|
|
212
|
+
style={{ margin: 0, padding: 0, maxWidth: "100%" }}
|
|
213
|
+
>
|
|
211
214
|
<span>
|
|
212
215
|
<Markdown
|
|
213
216
|
remarkPlugins={[remarkGfm]}
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
"tauri": "tauri"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@drincs/nqtr": "^0.5.
|
|
16
|
-
"@drincs/pixi-vn": "^1.3.
|
|
15
|
+
"@drincs/nqtr": "^0.5.7",
|
|
16
|
+
"@drincs/pixi-vn": "^1.3.13",
|
|
17
17
|
"@drincs/pixi-vn-ink": "^0.8.0",
|
|
18
18
|
"@emotion/react": "^11.14.0",
|
|
19
19
|
"@emotion/styled": "^11.14.1",
|
|
@@ -8,6 +8,7 @@ export const REFRESH_SAVE_LOCAL_STORAGE_KEY = "refresh_save";
|
|
|
8
8
|
export const SELECTED_QUEST_STORAGE_KEY = "selected_quest";
|
|
9
9
|
|
|
10
10
|
export const CANVAS_UI_LAYER_NAME = "ui";
|
|
11
|
+
export const CANVAS_MINIGAME_LAYER_NAME = "minigame";
|
|
11
12
|
|
|
12
13
|
export const SKIP_DELAY = 100;
|
|
13
14
|
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { canvas, Layer, PIXI } from "@drincs/pixi-vn";
|
|
2
|
+
import { useEffect, useRef } from "react";
|
|
3
|
+
import { CANVAS_MINIGAME_LAYER_NAME } from "../constans";
|
|
4
|
+
|
|
5
|
+
export default function useMinigame(
|
|
6
|
+
game: (layer: Layer) => void,
|
|
7
|
+
props?: {
|
|
8
|
+
onStart?: () => Promise<void>;
|
|
9
|
+
onExit?: (layer: Layer) => void;
|
|
10
|
+
}
|
|
11
|
+
) {
|
|
12
|
+
const loading = useRef(false);
|
|
13
|
+
|
|
14
|
+
// Keep latest callbacks in refs to avoid effect restarts
|
|
15
|
+
const startRef = useRef<() => Promise<void>>(props?.onStart ?? (async () => {}));
|
|
16
|
+
const exitRef = useRef<(layer: Layer) => void>(props?.onExit);
|
|
17
|
+
|
|
18
|
+
// Update refs when props change, without changing effect identity
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
startRef.current = props?.onStart ?? (async () => {});
|
|
21
|
+
}, [props?.onStart]);
|
|
22
|
+
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
exitRef.current = props?.onExit;
|
|
25
|
+
}, [props?.onExit]);
|
|
26
|
+
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
// Create the layer and start the game once
|
|
29
|
+
loading.current = true;
|
|
30
|
+
const layer = canvas.addLayer(CANVAS_MINIGAME_LAYER_NAME, new PIXI.Container());
|
|
31
|
+
if (!layer) {
|
|
32
|
+
console.error("Failed to create UI layer for minigame");
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
let cancelled = false;
|
|
37
|
+
|
|
38
|
+
startRef.current().then(() => {
|
|
39
|
+
if (cancelled) return;
|
|
40
|
+
loading.current = false;
|
|
41
|
+
game(layer);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
return () => {
|
|
45
|
+
cancelled = true;
|
|
46
|
+
canvas.removeLayer(CANVAS_MINIGAME_LAYER_NAME);
|
|
47
|
+
if (exitRef.current) {
|
|
48
|
+
exitRef.current(layer);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}, [game]);
|
|
52
|
+
|
|
53
|
+
return { loading };
|
|
54
|
+
}
|
|
@@ -2,7 +2,7 @@ import { Assets } from "@drincs/pixi-vn";
|
|
|
2
2
|
import { NavigateFunction, NavigateOptions, To, useNavigate } from "react-router-dom";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* https://pixi-vn.web.app/
|
|
5
|
+
* https://pixi-vn.web.app/it/start/interface-navigate#block-back-forward
|
|
6
6
|
*/
|
|
7
7
|
export default function useMyNavigate(): NavigateFunction {
|
|
8
8
|
const navigate = useNavigate();
|
|
@@ -207,7 +207,10 @@ function NarrationScreenText({ paragraphRef }: { paragraphRef: RefObject<HTMLDiv
|
|
|
207
207
|
}, []);
|
|
208
208
|
|
|
209
209
|
return (
|
|
210
|
-
<p
|
|
210
|
+
<p
|
|
211
|
+
className={`prose ${mode === "dark" ? "dark:prose-invert" : ""}`}
|
|
212
|
+
style={{ margin: 0, padding: 0, maxWidth: "100%" }}
|
|
213
|
+
>
|
|
211
214
|
<span>
|
|
212
215
|
<Markdown
|
|
213
216
|
remarkPlugins={[remarkGfm]}
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
"tauri": "tauri"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@drincs/nqtr": "^0.5.
|
|
16
|
-
"@drincs/pixi-vn": "^1.3.
|
|
15
|
+
"@drincs/nqtr": "^0.5.7",
|
|
16
|
+
"@drincs/pixi-vn": "^1.3.13",
|
|
17
17
|
"@emotion/react": "^11.14.0",
|
|
18
18
|
"@emotion/styled": "^11.14.1",
|
|
19
19
|
"@mui/icons-material": "^7.3.1",
|
|
@@ -8,6 +8,7 @@ export const REFRESH_SAVE_LOCAL_STORAGE_KEY = "refresh_save";
|
|
|
8
8
|
export const SELECTED_QUEST_STORAGE_KEY = "selected_quest";
|
|
9
9
|
|
|
10
10
|
export const CANVAS_UI_LAYER_NAME = "ui";
|
|
11
|
+
export const CANVAS_MINIGAME_LAYER_NAME = "minigame";
|
|
11
12
|
|
|
12
13
|
export const SKIP_DELAY = 100;
|
|
13
14
|
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { canvas, Layer, PIXI } from "@drincs/pixi-vn";
|
|
2
|
+
import { useEffect, useRef } from "react";
|
|
3
|
+
import { CANVAS_MINIGAME_LAYER_NAME } from "../constans";
|
|
4
|
+
|
|
5
|
+
export default function useMinigame(
|
|
6
|
+
game: (layer: Layer) => void,
|
|
7
|
+
props?: {
|
|
8
|
+
onStart?: () => Promise<void>;
|
|
9
|
+
onExit?: (layer: Layer) => void;
|
|
10
|
+
}
|
|
11
|
+
) {
|
|
12
|
+
const loading = useRef(false);
|
|
13
|
+
|
|
14
|
+
// Keep latest callbacks in refs to avoid effect restarts
|
|
15
|
+
const startRef = useRef<() => Promise<void>>(props?.onStart ?? (async () => {}));
|
|
16
|
+
const exitRef = useRef<(layer: Layer) => void>(props?.onExit);
|
|
17
|
+
|
|
18
|
+
// Update refs when props change, without changing effect identity
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
startRef.current = props?.onStart ?? (async () => {});
|
|
21
|
+
}, [props?.onStart]);
|
|
22
|
+
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
exitRef.current = props?.onExit;
|
|
25
|
+
}, [props?.onExit]);
|
|
26
|
+
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
// Create the layer and start the game once
|
|
29
|
+
loading.current = true;
|
|
30
|
+
const layer = canvas.addLayer(CANVAS_MINIGAME_LAYER_NAME, new PIXI.Container());
|
|
31
|
+
if (!layer) {
|
|
32
|
+
console.error("Failed to create UI layer for minigame");
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
let cancelled = false;
|
|
37
|
+
|
|
38
|
+
startRef.current().then(() => {
|
|
39
|
+
if (cancelled) return;
|
|
40
|
+
loading.current = false;
|
|
41
|
+
game(layer);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
return () => {
|
|
45
|
+
cancelled = true;
|
|
46
|
+
canvas.removeLayer(CANVAS_MINIGAME_LAYER_NAME);
|
|
47
|
+
if (exitRef.current) {
|
|
48
|
+
exitRef.current(layer);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}, [game]);
|
|
52
|
+
|
|
53
|
+
return { loading };
|
|
54
|
+
}
|
|
@@ -2,7 +2,7 @@ import { Assets } from "@drincs/pixi-vn";
|
|
|
2
2
|
import { NavigateFunction, NavigateOptions, To, useNavigate } from "react-router-dom";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* https://pixi-vn.web.app/
|
|
5
|
+
* https://pixi-vn.web.app/it/start/interface-navigate#block-back-forward
|
|
6
6
|
*/
|
|
7
7
|
export default function useMyNavigate(): NavigateFunction {
|
|
8
8
|
const navigate = useNavigate();
|
|
@@ -207,7 +207,10 @@ function NarrationScreenText({ paragraphRef }: { paragraphRef: RefObject<HTMLDiv
|
|
|
207
207
|
}, []);
|
|
208
208
|
|
|
209
209
|
return (
|
|
210
|
-
<p
|
|
210
|
+
<p
|
|
211
|
+
className={`prose ${mode === "dark" ? "dark:prose-invert" : ""}`}
|
|
212
|
+
style={{ margin: 0, padding: 0, maxWidth: "100%" }}
|
|
213
|
+
>
|
|
211
214
|
<span>
|
|
212
215
|
<Markdown
|
|
213
216
|
remarkPlugins={[remarkGfm]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { canvas, Layer, PIXI } from "@drincs/pixi-vn";
|
|
2
|
+
import { useEffect, useRef } from "react";
|
|
3
|
+
import { CANVAS_MINIGAME_LAYER_NAME } from "../constans";
|
|
4
|
+
|
|
5
|
+
export default function useMinigame(
|
|
6
|
+
game: (layer: Layer) => void,
|
|
7
|
+
props?: {
|
|
8
|
+
onStart?: () => Promise<void>;
|
|
9
|
+
onExit?: (layer: Layer) => void;
|
|
10
|
+
}
|
|
11
|
+
) {
|
|
12
|
+
const loading = useRef(false);
|
|
13
|
+
|
|
14
|
+
// Keep latest callbacks in refs to avoid effect restarts
|
|
15
|
+
const startRef = useRef<() => Promise<void>>(props?.onStart ?? (async () => {}));
|
|
16
|
+
const exitRef = useRef<(layer: Layer) => void>(props?.onExit);
|
|
17
|
+
|
|
18
|
+
// Update refs when props change, without changing effect identity
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
startRef.current = props?.onStart ?? (async () => {});
|
|
21
|
+
}, [props?.onStart]);
|
|
22
|
+
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
exitRef.current = props?.onExit;
|
|
25
|
+
}, [props?.onExit]);
|
|
26
|
+
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
// Create the layer and start the game once
|
|
29
|
+
loading.current = true;
|
|
30
|
+
const layer = canvas.addLayer(CANVAS_MINIGAME_LAYER_NAME, new PIXI.Container());
|
|
31
|
+
if (!layer) {
|
|
32
|
+
console.error("Failed to create UI layer for minigame");
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
let cancelled = false;
|
|
37
|
+
|
|
38
|
+
startRef.current().then(() => {
|
|
39
|
+
if (cancelled) return;
|
|
40
|
+
loading.current = false;
|
|
41
|
+
game(layer);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
return () => {
|
|
45
|
+
cancelled = true;
|
|
46
|
+
canvas.removeLayer(CANVAS_MINIGAME_LAYER_NAME);
|
|
47
|
+
if (exitRef.current) {
|
|
48
|
+
exitRef.current(layer);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}, [game]);
|
|
52
|
+
|
|
53
|
+
return { loading };
|
|
54
|
+
}
|
|
@@ -2,7 +2,7 @@ import { Assets } from "@drincs/pixi-vn";
|
|
|
2
2
|
import { NavigateFunction, NavigateOptions, To, useNavigate } from "react-router-dom";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* https://pixi-vn.web.app/
|
|
5
|
+
* https://pixi-vn.web.app/it/start/interface-navigate#block-back-forward
|
|
6
6
|
*/
|
|
7
7
|
export default function useMyNavigate(): NavigateFunction {
|
|
8
8
|
const navigate = useNavigate();
|
|
@@ -207,7 +207,10 @@ function NarrationScreenText({ paragraphRef }: { paragraphRef: RefObject<HTMLDiv
|
|
|
207
207
|
}, []);
|
|
208
208
|
|
|
209
209
|
return (
|
|
210
|
-
<p
|
|
210
|
+
<p
|
|
211
|
+
className={`prose ${mode === "dark" ? "dark:prose-invert" : ""}`}
|
|
212
|
+
style={{ margin: 0, padding: 0, maxWidth: "100%" }}
|
|
213
|
+
>
|
|
211
214
|
<span>
|
|
212
215
|
<Markdown
|
|
213
216
|
remarkPlugins={[remarkGfm]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { canvas, Layer, PIXI } from "@drincs/pixi-vn";
|
|
2
|
+
import { useEffect, useRef } from "react";
|
|
3
|
+
import { CANVAS_MINIGAME_LAYER_NAME } from "../constans";
|
|
4
|
+
|
|
5
|
+
export default function useMinigame(
|
|
6
|
+
game: (layer: Layer) => void,
|
|
7
|
+
props?: {
|
|
8
|
+
onStart?: () => Promise<void>;
|
|
9
|
+
onExit?: (layer: Layer) => void;
|
|
10
|
+
}
|
|
11
|
+
) {
|
|
12
|
+
const loading = useRef(false);
|
|
13
|
+
|
|
14
|
+
// Keep latest callbacks in refs to avoid effect restarts
|
|
15
|
+
const startRef = useRef<() => Promise<void>>(props?.onStart ?? (async () => {}));
|
|
16
|
+
const exitRef = useRef<(layer: Layer) => void>(props?.onExit);
|
|
17
|
+
|
|
18
|
+
// Update refs when props change, without changing effect identity
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
startRef.current = props?.onStart ?? (async () => {});
|
|
21
|
+
}, [props?.onStart]);
|
|
22
|
+
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
exitRef.current = props?.onExit;
|
|
25
|
+
}, [props?.onExit]);
|
|
26
|
+
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
// Create the layer and start the game once
|
|
29
|
+
loading.current = true;
|
|
30
|
+
const layer = canvas.addLayer(CANVAS_MINIGAME_LAYER_NAME, new PIXI.Container());
|
|
31
|
+
if (!layer) {
|
|
32
|
+
console.error("Failed to create UI layer for minigame");
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
let cancelled = false;
|
|
37
|
+
|
|
38
|
+
startRef.current().then(() => {
|
|
39
|
+
if (cancelled) return;
|
|
40
|
+
loading.current = false;
|
|
41
|
+
game(layer);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
return () => {
|
|
45
|
+
cancelled = true;
|
|
46
|
+
canvas.removeLayer(CANVAS_MINIGAME_LAYER_NAME);
|
|
47
|
+
if (exitRef.current) {
|
|
48
|
+
exitRef.current(layer);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}, [game]);
|
|
52
|
+
|
|
53
|
+
return { loading };
|
|
54
|
+
}
|
|
@@ -2,7 +2,7 @@ import { Assets } from "@drincs/pixi-vn";
|
|
|
2
2
|
import { NavigateFunction, NavigateOptions, To, useNavigate } from "react-router-dom";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* https://pixi-vn.web.app/
|
|
5
|
+
* https://pixi-vn.web.app/it/start/interface-navigate#block-back-forward
|
|
6
6
|
*/
|
|
7
7
|
export default function useMyNavigate(): NavigateFunction {
|
|
8
8
|
const navigate = useNavigate();
|
|
@@ -207,7 +207,10 @@ function NarrationScreenText({ paragraphRef }: { paragraphRef: RefObject<HTMLDiv
|
|
|
207
207
|
}, []);
|
|
208
208
|
|
|
209
209
|
return (
|
|
210
|
-
<p
|
|
210
|
+
<p
|
|
211
|
+
className={`prose ${mode === "dark" ? "dark:prose-invert" : ""}`}
|
|
212
|
+
style={{ margin: 0, padding: 0, maxWidth: "100%" }}
|
|
213
|
+
>
|
|
211
214
|
<span>
|
|
212
215
|
<Markdown
|
|
213
216
|
remarkPlugins={[remarkGfm]}
|