create-pixi-vn 2.0.2 → 2.0.4
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/index.js +1 -1
- package/package.json +5 -4
- package/template-react-vite-muijoy/package-lock.json +4 -4
- package/template-react-vite-muijoy/package.json +1 -1
- package/template-react-vite-muijoy/src/assets/ink-manifest.gen.json +1 -0
- package/template-react-vite-muijoy/src/components/menus/main-menu.tsx +1 -2
- package/template-react-vite-muijoy/src/components/menus/save-menu/save-slots.tsx +2 -2
- package/template-react-vite-muijoy/src/components/scrrens/narration/narration-cards.tsx +1 -1
- package/template-react-vite-muijoy/src/components/ui/image.tsx +7 -38
- package/template-react-vite-muijoy/src/content/labels/start.label.ts +2 -4
- package/template-react-vite-muijoy/src/pixi-vn-keys.gen.d.ts +20 -0
- package/template-react-vite-muijoy/vite.config.ts +1 -0
- package/template-react-vite-muijoy-ink/package-lock.json +3 -3
- package/template-react-vite-muijoy-ink/package.json +2 -2
- package/template-react-vite-muijoy-ink/src/components/menus/save-menu/save-slots.tsx +2 -2
- package/template-react-vite-muijoy-ink/src/components/scrrens/narration/narration-cards.tsx +1 -1
- package/template-react-vite-muijoy-ink/src/components/ui/image.tsx +7 -38
- package/template-react-vite-muijoy-ink/src/pixi-vn-keys.gen.d.ts +22 -0
- package/template-react-vite-muijoy-ink/vite.config.ts +1 -0
- package/template-react-vite-muijoy-ink-tauri/package-lock.json +3 -3
- package/template-react-vite-muijoy-ink-tauri/package.json +2 -2
- package/template-react-vite-muijoy-ink-tauri/src/components/menus/save-menu/save-slots.tsx +2 -2
- package/template-react-vite-muijoy-ink-tauri/src/components/scrrens/narration/narration-cards.tsx +1 -1
- package/template-react-vite-muijoy-ink-tauri/src/components/ui/image.tsx +7 -38
- package/template-react-vite-muijoy-ink-tauri/src/pixi-vn-keys.gen.d.ts +22 -0
- package/template-react-vite-muijoy-ink-tauri/vite.config.ts +1 -0
- package/template-react-vite-muijoy-tauri/package-lock.json +4 -4
- package/template-react-vite-muijoy-tauri/package.json +1 -1
- package/template-react-vite-muijoy-tauri/src/assets/ink-manifest.gen.json +1 -0
- package/template-react-vite-muijoy-tauri/src/components/menus/main-menu.tsx +1 -2
- package/template-react-vite-muijoy-tauri/src/components/menus/save-menu/save-slots.tsx +2 -2
- package/template-react-vite-muijoy-tauri/src/components/scrrens/narration/narration-cards.tsx +1 -1
- package/template-react-vite-muijoy-tauri/src/components/ui/image.tsx +7 -38
- package/template-react-vite-muijoy-tauri/src/content/labels/start.label.ts +2 -4
- package/template-react-vite-muijoy-tauri/src/pixi-vn-keys.gen.d.ts +20 -0
- package/template-react-vite-muijoy-tauri/vite.config.ts +1 -0
- package/template-react-vite-muijoy-electron/.eslintrc.cjs +0 -29
- package/template-react-vite-muijoy-electron/.vscode/extensions.json +0 -9
- package/template-react-vite-muijoy-electron/.vscode/launch.json +0 -32
- package/template-react-vite-muijoy-electron/.vscode/settings.json +0 -49
- package/template-react-vite-muijoy-electron/README.md +0 -207
- package/template-react-vite-muijoy-electron/_gitignore +0 -107
- package/template-react-vite-muijoy-electron/forge.config.cts +0 -73
- package/template-react-vite-muijoy-electron/forge.env.d.ts +0 -1
- package/template-react-vite-muijoy-electron/index.html +0 -13
- package/template-react-vite-muijoy-electron/ionic.config.json +0 -7
- package/template-react-vite-muijoy-electron/package-lock.json +0 -16984
- package/template-react-vite-muijoy-electron/package.json +0 -85
- package/template-react-vite-muijoy-electron/public/apple-touch-icon.png +0 -0
- package/template-react-vite-muijoy-electron/public/favicon.ico +0 -0
- package/template-react-vite-muijoy-electron/public/mask-icon.svg +0 -890
- package/template-react-vite-muijoy-electron/public/pixi-vn.svg +0 -23
- package/template-react-vite-muijoy-electron/public/pwa-192x192.png +0 -0
- package/template-react-vite-muijoy-electron/public/pwa-512x512.png +0 -0
- package/template-react-vite-muijoy-electron/public/robots.txt +0 -3
- package/template-react-vite-muijoy-electron/src/App.css +0 -42
- package/template-react-vite-muijoy-electron/src/App.tsx +0 -16
- package/template-react-vite-muijoy-electron/src/AppRoutes.tsx +0 -66
- package/template-react-vite-muijoy-electron/src/Home.tsx +0 -27
- package/template-react-vite-muijoy-electron/src/Imports.tsx +0 -34
- package/template-react-vite-muijoy-electron/src/atoms/autoInfoState.ts +0 -50
- package/template-react-vite-muijoy-electron/src/atoms/dialogueCardHeightState.ts +0 -23
- package/template-react-vite-muijoy-electron/src/atoms/dialogueCardImageWidthState.ts +0 -23
- package/template-react-vite-muijoy-electron/src/atoms/hideInterfaceState.ts +0 -6
- package/template-react-vite-muijoy-electron/src/atoms/nextStepLoadingState.ts +0 -6
- package/template-react-vite-muijoy-electron/src/atoms/openGameSaveScreenState.ts +0 -6
- package/template-react-vite-muijoy-electron/src/atoms/openHistoryScreenState.ts +0 -6
- package/template-react-vite-muijoy-electron/src/atoms/openSettingsState.ts +0 -6
- package/template-react-vite-muijoy-electron/src/atoms/saveLoadAlertState.ts +0 -26
- package/template-react-vite-muijoy-electron/src/atoms/saveScreenPageState.ts +0 -23
- package/template-react-vite-muijoy-electron/src/atoms/skipEnabledState.ts +0 -6
- package/template-react-vite-muijoy-electron/src/atoms/typewriterDelayState.ts +0 -23
- package/template-react-vite-muijoy-electron/src/atoms/typewriterIsAnimatedState.ts +0 -6
- package/template-react-vite-muijoy-electron/src/components/ChoiceButton.tsx +0 -19
- package/template-react-vite-muijoy-electron/src/components/DragHandleDivider.tsx +0 -40
- package/template-react-vite-muijoy-electron/src/components/MenuButton.tsx +0 -37
- package/template-react-vite-muijoy-electron/src/components/ModalConfirmation.tsx +0 -70
- package/template-react-vite-muijoy-electron/src/components/ModalDialog.tsx +0 -103
- package/template-react-vite-muijoy-electron/src/components/NextButton.tsx +0 -94
- package/template-react-vite-muijoy-electron/src/components/SettingButton.tsx +0 -44
- package/template-react-vite-muijoy-electron/src/components/SliderResizer.tsx +0 -53
- package/template-react-vite-muijoy-electron/src/components/TextMenuButton.tsx +0 -41
- package/template-react-vite-muijoy-electron/src/components/Typewriter.tsx +0 -335
- package/template-react-vite-muijoy-electron/src/components/TypographyShadow.tsx +0 -15
- package/template-react-vite-muijoy-electron/src/i18n.ts +0 -29
- package/template-react-vite-muijoy-electron/src/index.css +0 -9
- package/template-react-vite-muijoy-electron/src/interceptors/EventInterceptor.tsx +0 -49
- package/template-react-vite-muijoy-electron/src/interceptors/SkipAutoInterceptor.tsx +0 -67
- package/template-react-vite-muijoy-electron/src/main.tsx +0 -39
- package/template-react-vite-muijoy-electron/src/models/Character.ts +0 -86
- package/template-react-vite-muijoy-electron/src/models/GameSaveData.ts +0 -9
- package/template-react-vite-muijoy-electron/src/pixi-vn.d.ts +0 -36
- package/template-react-vite-muijoy-electron/src/providers/ThemeProvider.tsx +0 -165
- package/template-react-vite-muijoy-electron/src/screens/ChoiceMenu.tsx +0 -130
- package/template-react-vite-muijoy-electron/src/screens/GameSaveScreen.tsx +0 -274
- package/template-react-vite-muijoy-electron/src/screens/HistoryScreen.tsx +0 -155
- package/template-react-vite-muijoy-electron/src/screens/LoadingScreen.tsx +0 -40
- package/template-react-vite-muijoy-electron/src/screens/MainMenu.tsx +0 -98
- package/template-react-vite-muijoy-electron/src/screens/NarrationScreen.tsx +0 -220
- package/template-react-vite-muijoy-electron/src/screens/QuickTools.tsx +0 -168
- package/template-react-vite-muijoy-electron/src/screens/Settings.tsx +0 -536
- package/template-react-vite-muijoy-electron/src/screens/modals/SaveLoadAlert.tsx +0 -135
- package/template-react-vite-muijoy-electron/src/screens/modals/TextInput.tsx +0 -61
- package/template-react-vite-muijoy-electron/src/use_query/useQueryInterface.ts +0 -73
- package/template-react-vite-muijoy-electron/src/use_query/useQueryLastSave.ts +0 -18
- package/template-react-vite-muijoy-electron/src/use_query/useQuerySaves.ts +0 -18
- package/template-react-vite-muijoy-electron/src/utilities/actions-utility.ts +0 -10
- package/template-react-vite-muijoy-electron/src/utilities/component-utility.ts +0 -25
- package/template-react-vite-muijoy-electron/src/utilities/indexedDB-utility.ts +0 -196
- package/template-react-vite-muijoy-electron/src/utilities/navigate-utility.ts +0 -18
- package/template-react-vite-muijoy-electron/src/utilities/save-utility.ts +0 -125
- package/template-react-vite-muijoy-electron/src/values/characters.ts +0 -11
- package/template-react-vite-muijoy-electron/src/values/translations/strings_en.json +0 -60
- package/template-react-vite-muijoy-electron/src/vite-env.d.ts +0 -4
- package/template-react-vite-muijoy-electron/src-electron/icons/icon.icns +0 -0
- package/template-react-vite-muijoy-electron/src-electron/icons/icon.ico +0 -0
- package/template-react-vite-muijoy-electron/src-electron/icons/icon.png +0 -0
- package/template-react-vite-muijoy-electron/src-electron/index.css +0 -7
- package/template-react-vite-muijoy-electron/src-electron/main.ts +0 -59
- package/template-react-vite-muijoy-electron/src-electron/preload.ts +0 -2
- package/template-react-vite-muijoy-electron/src-electron/renderer.ts +0 -31
- package/template-react-vite-muijoy-electron/tsconfig.json +0 -32
- package/template-react-vite-muijoy-electron/tsconfig.node.json +0 -11
- package/template-react-vite-muijoy-electron/vite.base.config.ts +0 -93
- package/template-react-vite-muijoy-electron/vite.config.ts +0 -54
- package/template-react-vite-muijoy-electron/vite.main.config.ts +0 -9
- package/template-react-vite-muijoy-electron/vite.preload.config.ts +0 -9
- package/template-react-vite-muijoy-electron/vite.renderer.config.ts +0 -9
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { narration } from '@drincs/pixi-vn';
|
|
2
|
-
import { Button, Input } from '@mui/joy';
|
|
3
|
-
import { useQueryClient } from '@tanstack/react-query';
|
|
4
|
-
import { useState } from 'react';
|
|
5
|
-
import { useTranslation } from 'react-i18next';
|
|
6
|
-
import { useRecoilValue } from 'recoil';
|
|
7
|
-
import { typewriterIsAnimatedState } from '../../atoms/typewriterIsAnimatedState';
|
|
8
|
-
import ModalDialogCustom from '../../components/ModalDialog';
|
|
9
|
-
import Typewriter from '../../components/Typewriter';
|
|
10
|
-
import { INTERFACE_DATA_USE_QUEY_KEY, useQueryDialogue, useQueryInputValue } from '../../use_query/useQueryInterface';
|
|
11
|
-
|
|
12
|
-
export default function TextInput() {
|
|
13
|
-
const { data: { text } = {} } = useQueryDialogue()
|
|
14
|
-
const { data: { isRequired, type } = { currentValue: undefined, isRequired: false } } = useQueryInputValue();
|
|
15
|
-
const open = (!useRecoilValue(typewriterIsAnimatedState)) && isRequired
|
|
16
|
-
const [tempValue, setTempValue] = useState();
|
|
17
|
-
const queryClient = useQueryClient()
|
|
18
|
-
const { t } = useTranslation(["ui"]);
|
|
19
|
-
|
|
20
|
-
return (
|
|
21
|
-
<ModalDialogCustom
|
|
22
|
-
open={open}
|
|
23
|
-
setOpen={(value) => {
|
|
24
|
-
if (!value) {
|
|
25
|
-
narration.inputValue = tempValue
|
|
26
|
-
queryClient.invalidateQueries({ queryKey: [INTERFACE_DATA_USE_QUEY_KEY] })
|
|
27
|
-
}
|
|
28
|
-
}}
|
|
29
|
-
canBeIgnored={false}
|
|
30
|
-
color="primary"
|
|
31
|
-
actions={<>
|
|
32
|
-
<Button
|
|
33
|
-
key={'exit'}
|
|
34
|
-
color='primary'
|
|
35
|
-
variant="outlined"
|
|
36
|
-
onClick={() => {
|
|
37
|
-
narration.inputValue = tempValue
|
|
38
|
-
queryClient.invalidateQueries({ queryKey: [INTERFACE_DATA_USE_QUEY_KEY] })
|
|
39
|
-
}}
|
|
40
|
-
>
|
|
41
|
-
{t("confirm")}
|
|
42
|
-
</Button>
|
|
43
|
-
<Input
|
|
44
|
-
value={tempValue}
|
|
45
|
-
type={type}
|
|
46
|
-
onChange={(e) => {
|
|
47
|
-
let value: any = e.target.value;
|
|
48
|
-
if (e.target.type === "number") {
|
|
49
|
-
value = e.target.valueAsNumber
|
|
50
|
-
}
|
|
51
|
-
setTempValue(value)
|
|
52
|
-
}}
|
|
53
|
-
/>
|
|
54
|
-
</>}
|
|
55
|
-
>
|
|
56
|
-
{text && <Typewriter
|
|
57
|
-
text={text}
|
|
58
|
-
/>}
|
|
59
|
-
</ModalDialogCustom>
|
|
60
|
-
);
|
|
61
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { CharacterBaseModel, getCharacterById, narration } from "@drincs/pixi-vn";
|
|
2
|
-
import { useQuery } from "@tanstack/react-query";
|
|
3
|
-
import { useTranslation } from "react-i18next";
|
|
4
|
-
|
|
5
|
-
export const INTERFACE_DATA_USE_QUEY_KEY = "interface_data_use_quey_key";
|
|
6
|
-
|
|
7
|
-
const CAN_GO_BACK_USE_QUEY_KEY = "can_go_back_use_quey_key";
|
|
8
|
-
export function useQueryCanGoBack() {
|
|
9
|
-
return useQuery({
|
|
10
|
-
queryKey: [INTERFACE_DATA_USE_QUEY_KEY, CAN_GO_BACK_USE_QUEY_KEY],
|
|
11
|
-
queryFn: () => {
|
|
12
|
-
return narration.canGoBack
|
|
13
|
-
},
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const CHOICE_MENU_OPTIONS_USE_QUEY_KEY = "choice_menu_options_use_quey_key";
|
|
18
|
-
export function useQueryChoiceMenuOptions() {
|
|
19
|
-
return useQuery({
|
|
20
|
-
queryKey: [INTERFACE_DATA_USE_QUEY_KEY, CHOICE_MENU_OPTIONS_USE_QUEY_KEY],
|
|
21
|
-
queryFn: () => {
|
|
22
|
-
return narration.choiceMenuOptions || []
|
|
23
|
-
},
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const INPUT_VALUE_USE_QUEY_KEY = "input_value_use_quey_key";
|
|
28
|
-
export function useQueryInputValue() {
|
|
29
|
-
return useQuery({
|
|
30
|
-
queryKey: [INTERFACE_DATA_USE_QUEY_KEY, INPUT_VALUE_USE_QUEY_KEY],
|
|
31
|
-
queryFn: () => {
|
|
32
|
-
return {
|
|
33
|
-
isRequired: narration.isRequiredInput,
|
|
34
|
-
type: narration.inputType,
|
|
35
|
-
currentValue: narration.inputValue,
|
|
36
|
-
}
|
|
37
|
-
},
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const DIALOGUE_USE_QUEY_KEY = "dialogue_use_quey_key";
|
|
42
|
-
export function useQueryDialogue() {
|
|
43
|
-
const { t: tNarration } = useTranslation(["narration"]);
|
|
44
|
-
|
|
45
|
-
return useQuery({
|
|
46
|
-
queryKey: [INTERFACE_DATA_USE_QUEY_KEY, DIALOGUE_USE_QUEY_KEY],
|
|
47
|
-
queryFn: () => {
|
|
48
|
-
let dialogue = narration.dialogue
|
|
49
|
-
let newText: string | undefined = dialogue?.text
|
|
50
|
-
let newCharacter: CharacterBaseModel | undefined = undefined
|
|
51
|
-
if (dialogue) {
|
|
52
|
-
newCharacter = dialogue.character ? getCharacterById(dialogue.character) : undefined
|
|
53
|
-
if (!newCharacter && dialogue.character) {
|
|
54
|
-
newCharacter = new CharacterBaseModel(dialogue.character, { name: tNarration(dialogue.character) })
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
return {
|
|
58
|
-
text: newText,
|
|
59
|
-
character: newCharacter,
|
|
60
|
-
}
|
|
61
|
-
},
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const CAN_GO_NEXT_USE_QUEY_KEY = "can_go_next_use_quey_key";
|
|
66
|
-
export function useQueryCanGoNext() {
|
|
67
|
-
return useQuery({
|
|
68
|
-
queryKey: [INTERFACE_DATA_USE_QUEY_KEY, CAN_GO_NEXT_USE_QUEY_KEY],
|
|
69
|
-
queryFn: () => {
|
|
70
|
-
return narration.canGoNext && !narration.isRequiredInput
|
|
71
|
-
},
|
|
72
|
-
});
|
|
73
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { useQuery } from "@tanstack/react-query";
|
|
2
|
-
import { getLastSaveFromIndexDB } from "../utilities/save-utility";
|
|
3
|
-
|
|
4
|
-
export const LAST_SAVE_USE_QUEY_KEY = "last_save_use_quey_key";
|
|
5
|
-
|
|
6
|
-
export default function useQueryLastSave() {
|
|
7
|
-
return useQuery({
|
|
8
|
-
queryKey: [LAST_SAVE_USE_QUEY_KEY],
|
|
9
|
-
queryFn: async () => {
|
|
10
|
-
return getLastSaveFromIndexDB()
|
|
11
|
-
.then((res) => {
|
|
12
|
-
return res || null
|
|
13
|
-
}).catch((err) => {
|
|
14
|
-
throw err
|
|
15
|
-
})
|
|
16
|
-
},
|
|
17
|
-
});
|
|
18
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { useQuery } from "@tanstack/react-query";
|
|
2
|
-
import { getSaveFromIndexDB } from "../utilities/save-utility";
|
|
3
|
-
|
|
4
|
-
export const SAVES_USE_QUEY_KEY = "saves_use_quey_key";
|
|
5
|
-
|
|
6
|
-
export default function useQuerySaves({ id }: { id: number }) {
|
|
7
|
-
return useQuery({
|
|
8
|
-
queryKey: [SAVES_USE_QUEY_KEY, id],
|
|
9
|
-
queryFn: async () => {
|
|
10
|
-
return getSaveFromIndexDB(id)
|
|
11
|
-
.then((res) => {
|
|
12
|
-
return res || null
|
|
13
|
-
}).catch((err) => {
|
|
14
|
-
throw err
|
|
15
|
-
})
|
|
16
|
-
},
|
|
17
|
-
});
|
|
18
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { clearAllGameDatas, narration } from "@drincs/pixi-vn";
|
|
2
|
-
|
|
3
|
-
export async function goBack(navigate: (path: string) => void) {
|
|
4
|
-
await narration.goBack(navigate)
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export function gameEnd(navigate: (path: string) => void) {
|
|
8
|
-
clearAllGameDatas()
|
|
9
|
-
navigate('/')
|
|
10
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
type WindowsSize = {
|
|
2
|
-
x: number,
|
|
3
|
-
y: number,
|
|
4
|
-
}
|
|
5
|
-
export function resizeWindowsHandler<T>(mouseDownEvent: React.MouseEvent<T, MouseEvent>, size: WindowsSize, setSize: React.Dispatch<React.SetStateAction<WindowsSize>>) {
|
|
6
|
-
const startSize = size;
|
|
7
|
-
const startPosition = { x: mouseDownEvent.pageX, y: mouseDownEvent.pageY };
|
|
8
|
-
|
|
9
|
-
function onMouseMove(mouseMoveEvent: any) {
|
|
10
|
-
setSize(() => {
|
|
11
|
-
let x = startSize.x - startPosition.x + mouseMoveEvent.pageX
|
|
12
|
-
let y = startSize.y + startPosition.y - mouseMoveEvent.pageY
|
|
13
|
-
return {
|
|
14
|
-
x: x > 1 ? x : 2,
|
|
15
|
-
y: y > 1 ? y : 2,
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
function onMouseUp() {
|
|
20
|
-
document.body.removeEventListener("mousemove", onMouseMove);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
document.body.addEventListener("mousemove", onMouseMove);
|
|
24
|
-
document.body.addEventListener("mouseup", onMouseUp, { once: true });
|
|
25
|
-
}
|
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
const INDEXED_DB_VERSION = 2;
|
|
2
|
-
const INDEXED_DB_NAME = "game_db";
|
|
3
|
-
export const INDEXED_DB_SAVE_TABLE = "saves";
|
|
4
|
-
|
|
5
|
-
export function initializeIndexedDB(): Promise<void> {
|
|
6
|
-
return new Promise((resolve, reject) => {
|
|
7
|
-
let request = indexedDB.open(INDEXED_DB_NAME, INDEXED_DB_VERSION);
|
|
8
|
-
// check if the object store exists
|
|
9
|
-
request.onupgradeneeded = function (_event) {
|
|
10
|
-
let db = request.result;
|
|
11
|
-
if (!db.objectStoreNames.contains(INDEXED_DB_SAVE_TABLE)) {
|
|
12
|
-
// create the object store
|
|
13
|
-
let objectStore = db.createObjectStore(INDEXED_DB_SAVE_TABLE, { keyPath: 'id', autoIncrement: true });
|
|
14
|
-
objectStore.createIndex("id", "id", { unique: true });
|
|
15
|
-
objectStore.createIndex("date", "date", { unique: false });
|
|
16
|
-
objectStore.createIndex("name", "name", { unique: false });
|
|
17
|
-
objectStore.createIndex("gameVersion", "gameVersion", { unique: false });
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
request.onsuccess = function (_event) {
|
|
22
|
-
resolve()
|
|
23
|
-
};
|
|
24
|
-
request.onerror = function (event) {
|
|
25
|
-
console.error("Error opening indexDB", event)
|
|
26
|
-
reject()
|
|
27
|
-
}
|
|
28
|
-
})
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export async function putRowIntoIndexDB<T extends {}>(tableName: string, data: T): Promise<T> {
|
|
32
|
-
return new Promise((resolve, reject) => {
|
|
33
|
-
let request = indexedDB.open(INDEXED_DB_NAME);
|
|
34
|
-
|
|
35
|
-
request.onsuccess = function (_event) {
|
|
36
|
-
let db = request.result;
|
|
37
|
-
// run onupgradeneeded before onsuccess
|
|
38
|
-
if (!db.objectStoreNames.contains(tableName)) {
|
|
39
|
-
console.error("Object store rescues does not exist")
|
|
40
|
-
reject()
|
|
41
|
-
}
|
|
42
|
-
let transaction = db.transaction([tableName], "readwrite");
|
|
43
|
-
let objectStore = transaction.objectStore(tableName);
|
|
44
|
-
let setRequest = objectStore.put(data)
|
|
45
|
-
setRequest.onsuccess = function (_event) {
|
|
46
|
-
resolve(data)
|
|
47
|
-
}
|
|
48
|
-
setRequest.onerror = function (event) {
|
|
49
|
-
console.error("Error adding save data to indexDB", event)
|
|
50
|
-
reject()
|
|
51
|
-
}
|
|
52
|
-
};
|
|
53
|
-
request.onerror = function (event) {
|
|
54
|
-
console.error("Error adding save data to indexDB", event)
|
|
55
|
-
}
|
|
56
|
-
})
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export async function getRowFromIndexDB<T extends {}>(tableName: string, id: any): Promise<T | null> {
|
|
60
|
-
return new Promise((resolve, reject) => {
|
|
61
|
-
let request = indexedDB.open(INDEXED_DB_NAME);
|
|
62
|
-
request.onsuccess = function (_event) {
|
|
63
|
-
let db = request.result;
|
|
64
|
-
// check if the object store exists
|
|
65
|
-
if (!db.objectStoreNames.contains(tableName)) {
|
|
66
|
-
resolve(null)
|
|
67
|
-
return
|
|
68
|
-
}
|
|
69
|
-
let transaction = db.transaction([tableName], "readwrite");
|
|
70
|
-
let objectStore = transaction.objectStore(tableName);
|
|
71
|
-
let getRequest = objectStore.get(id);
|
|
72
|
-
getRequest.onsuccess = function (_event) {
|
|
73
|
-
resolve(getRequest.result)
|
|
74
|
-
}
|
|
75
|
-
getRequest.onerror = function (event) {
|
|
76
|
-
console.error("Error getting save data from indexDB", event)
|
|
77
|
-
reject()
|
|
78
|
-
}
|
|
79
|
-
};
|
|
80
|
-
request.onerror = function (event) {
|
|
81
|
-
console.error("Error opening indexDB", event)
|
|
82
|
-
reject()
|
|
83
|
-
}
|
|
84
|
-
})
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
export async function getLastRowFromIndexDB<T extends {}>(tableName: string): Promise<T | null> {
|
|
88
|
-
return new Promise((resolve, reject) => {
|
|
89
|
-
let request = indexedDB.open(INDEXED_DB_NAME);
|
|
90
|
-
request.onsuccess = function (_event) {
|
|
91
|
-
let db = request.result;
|
|
92
|
-
// check if the object store exists
|
|
93
|
-
if (!db.objectStoreNames.contains(tableName)) {
|
|
94
|
-
resolve(null)
|
|
95
|
-
return
|
|
96
|
-
}
|
|
97
|
-
let transaction = db.transaction([tableName], "readwrite");
|
|
98
|
-
let objectStore = transaction.objectStore(tableName);
|
|
99
|
-
let getRequest = objectStore.openCursor(null, "prev");
|
|
100
|
-
getRequest.onsuccess = function (_event) {
|
|
101
|
-
let cursor = getRequest.result;
|
|
102
|
-
if (cursor) {
|
|
103
|
-
resolve(cursor.value)
|
|
104
|
-
} else {
|
|
105
|
-
resolve(null)
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
getRequest.onerror = function (event) {
|
|
109
|
-
console.error("Error getting save data from indexDB", event)
|
|
110
|
-
reject()
|
|
111
|
-
}
|
|
112
|
-
};
|
|
113
|
-
request.onerror = function (event) {
|
|
114
|
-
console.error("Error opening indexDB", event)
|
|
115
|
-
reject()
|
|
116
|
-
}
|
|
117
|
-
})
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
export async function deleteRowFromIndexDB(tableName: string, id: any): Promise<void> {
|
|
121
|
-
return new Promise((resolve, reject) => {
|
|
122
|
-
let request = indexedDB.open(INDEXED_DB_NAME);
|
|
123
|
-
request.onsuccess = function (_event) {
|
|
124
|
-
let db = request.result;
|
|
125
|
-
let transaction = db.transaction([tableName], "readwrite");
|
|
126
|
-
let objectStore = transaction.objectStore(tableName);
|
|
127
|
-
let deleteRequest = objectStore.delete(id);
|
|
128
|
-
deleteRequest.onsuccess = function (_event) {
|
|
129
|
-
resolve()
|
|
130
|
-
}
|
|
131
|
-
deleteRequest.onerror = function (event) {
|
|
132
|
-
console.error("Error deleting save data from indexDB", event)
|
|
133
|
-
reject()
|
|
134
|
-
}
|
|
135
|
-
};
|
|
136
|
-
request.onerror = function (event) {
|
|
137
|
-
console.error("Error deleting save data from indexDB", event)
|
|
138
|
-
}
|
|
139
|
-
})
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
export async function getListFromIndexDB<T extends {}>(
|
|
143
|
-
tableName: string,
|
|
144
|
-
options: {
|
|
145
|
-
order?: { field: keyof T, direction: IDBCursorDirection },
|
|
146
|
-
pagination?: { offset: number, limit: number }
|
|
147
|
-
} = {}
|
|
148
|
-
): Promise<T[]> {
|
|
149
|
-
return new Promise((resolve, reject) => {
|
|
150
|
-
let request = indexedDB.open(INDEXED_DB_NAME);
|
|
151
|
-
request.onsuccess = function (_event) {
|
|
152
|
-
let db = request.result;
|
|
153
|
-
// check if the object store exists
|
|
154
|
-
if (!db.objectStoreNames.contains(tableName)) {
|
|
155
|
-
resolve([])
|
|
156
|
-
return
|
|
157
|
-
}
|
|
158
|
-
let transaction = db.transaction([tableName], "readwrite");
|
|
159
|
-
let objectStore = transaction.objectStore(tableName);
|
|
160
|
-
let getRequest = options.order ?
|
|
161
|
-
objectStore.index(options.order.field as string).openCursor(null, options.order.direction) :
|
|
162
|
-
objectStore.openCursor();
|
|
163
|
-
let results: T[] = []
|
|
164
|
-
let counter = 0;
|
|
165
|
-
let limit = options.pagination?.limit ?? Infinity;
|
|
166
|
-
let offset = options.pagination?.offset ?? 0;
|
|
167
|
-
let advanced = false;
|
|
168
|
-
getRequest.onsuccess = (_event) => {
|
|
169
|
-
let cursor = getRequest.result;
|
|
170
|
-
if (cursor) {
|
|
171
|
-
if (counter >= offset) {
|
|
172
|
-
results.push(cursor.value)
|
|
173
|
-
if (results.length >= limit) {
|
|
174
|
-
resolve(results)
|
|
175
|
-
advanced = true;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
counter++;
|
|
179
|
-
cursor.continue();
|
|
180
|
-
} else {
|
|
181
|
-
if (!advanced) {
|
|
182
|
-
resolve(results)
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
};
|
|
186
|
-
getRequest.onerror = function (event) {
|
|
187
|
-
console.error("Error getting save data from indexDB", event)
|
|
188
|
-
reject()
|
|
189
|
-
}
|
|
190
|
-
};
|
|
191
|
-
request.onerror = function (event) {
|
|
192
|
-
console.error("Error opening indexDB", event)
|
|
193
|
-
reject()
|
|
194
|
-
}
|
|
195
|
-
})
|
|
196
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { NavigateFunction, NavigateOptions, To, useNavigate } from "react-router-dom";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* https://pixi-vn.web.app/advanced/intercept-events.html#back-and-forward-buttons
|
|
5
|
-
*/
|
|
6
|
-
export function useMyNavigate(): NavigateFunction {
|
|
7
|
-
const navigate = useNavigate();
|
|
8
|
-
|
|
9
|
-
return (to: To | number, options?: NavigateOptions) => {
|
|
10
|
-
if (typeof to === "number") {
|
|
11
|
-
navigate(to);
|
|
12
|
-
}
|
|
13
|
-
else {
|
|
14
|
-
navigate(to, options);
|
|
15
|
-
}
|
|
16
|
-
window.history.pushState(null, window.location.href, window.location.href);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import { canvas, getSaveData, loadSaveData } from "@drincs/pixi-vn";
|
|
2
|
-
import GameSaveData from "../models/GameSaveData";
|
|
3
|
-
import { deleteRowFromIndexDB, getLastRowFromIndexDB, getListFromIndexDB, getRowFromIndexDB, INDEXED_DB_SAVE_TABLE, putRowIntoIndexDB } from "./indexedDB-utility";
|
|
4
|
-
|
|
5
|
-
const SAVE_FILE_EXTENSION = "json"
|
|
6
|
-
|
|
7
|
-
export function getSave(image?: string): GameSaveData {
|
|
8
|
-
return {
|
|
9
|
-
saveData: getSaveData(),
|
|
10
|
-
gameVersion: __APP_VERSION__,
|
|
11
|
-
date: new Date(),
|
|
12
|
-
name: "",
|
|
13
|
-
image: image
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export async function loadSave(saveData: GameSaveData, navigate: (path: string) => void) {
|
|
18
|
-
navigate("/loading")
|
|
19
|
-
// load the save data from the JSON string
|
|
20
|
-
await loadSaveData(saveData.saveData, navigate)
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export async function putSaveIntoIndexDB(info: Partial<GameSaveData> & { id?: number } = {}, data = getSave()): Promise<GameSaveData & { id: number }> {
|
|
24
|
-
let image = await canvas.extractImage()
|
|
25
|
-
let item = {
|
|
26
|
-
...data,
|
|
27
|
-
image: image,
|
|
28
|
-
...info,
|
|
29
|
-
}
|
|
30
|
-
if (item.id === undefined) {
|
|
31
|
-
let lastSave = await getLastRowFromIndexDB<GameSaveData & { id: number }>(INDEXED_DB_SAVE_TABLE)
|
|
32
|
-
if (lastSave) {
|
|
33
|
-
item.id = lastSave.id + 1
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
item.id = 0
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
await putRowIntoIndexDB(INDEXED_DB_SAVE_TABLE, item)
|
|
40
|
-
if (item.id) {
|
|
41
|
-
return item as GameSaveData & { id: number }
|
|
42
|
-
}
|
|
43
|
-
return await getLastSaveFromIndexDB() as GameSaveData & { id: number }
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export async function getSaveFromIndexDB(id: number): Promise<GameSaveData & { id: number } | null> {
|
|
47
|
-
return await getRowFromIndexDB(INDEXED_DB_SAVE_TABLE, id)
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export async function getLastSaveFromIndexDB(): Promise<GameSaveData & { id: number } | null> {
|
|
51
|
-
let list = await getListFromIndexDB<GameSaveData & { id: number }>(INDEXED_DB_SAVE_TABLE, { pagination: { limit: 1, offset: 0 }, order: { field: "date", direction: "prev" } })
|
|
52
|
-
if (list.length > 0) {
|
|
53
|
-
return list[0]
|
|
54
|
-
}
|
|
55
|
-
return null
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export async function deleteSaveFromIndexDB(id: number): Promise<void> {
|
|
59
|
-
return await deleteRowFromIndexDB(INDEXED_DB_SAVE_TABLE, id)
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export function downloadGameSave(data: GameSaveData = getSave()) {
|
|
63
|
-
const jsonString = JSON.stringify(data);
|
|
64
|
-
// download the save data as a JSON file
|
|
65
|
-
const blob = new Blob([jsonString], { type: "application/json" });
|
|
66
|
-
// download the file
|
|
67
|
-
const url = URL.createObjectURL(blob);
|
|
68
|
-
const a = document.createElement('a');
|
|
69
|
-
a.href = url;
|
|
70
|
-
a.download = `${__APP_NAME__}-${__APP_VERSION__}-${data.name} ${data.date.toISOString()}.${SAVE_FILE_EXTENSION}`;
|
|
71
|
-
a.click();
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
export function loadGameSaveFromFile(navigate: (path: string) => void, afterLoad?: () => void) {
|
|
75
|
-
// load the save data from a JSON file
|
|
76
|
-
const input = document.createElement('input');
|
|
77
|
-
input.type = 'file';
|
|
78
|
-
input.accept = `application/${SAVE_FILE_EXTENSION}`;
|
|
79
|
-
input.onchange = (e) => {
|
|
80
|
-
const file = (e.target as HTMLInputElement).files?.[0];
|
|
81
|
-
if (file) {
|
|
82
|
-
const reader = new FileReader();
|
|
83
|
-
reader.onload = (e) => {
|
|
84
|
-
const jsonString = e.target?.result as string;
|
|
85
|
-
navigate("/loading")
|
|
86
|
-
let data: GameSaveData = JSON.parse(jsonString)
|
|
87
|
-
// load the save data from the JSON string
|
|
88
|
-
loadSave(data, navigate)
|
|
89
|
-
.then(() => {
|
|
90
|
-
afterLoad && afterLoad();
|
|
91
|
-
}).catch(() => {
|
|
92
|
-
navigate("/narration")
|
|
93
|
-
})
|
|
94
|
-
};
|
|
95
|
-
reader.readAsText(file);
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
|
-
input.click();
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
export async function addRefreshSave() {
|
|
102
|
-
const data = getSave()
|
|
103
|
-
let jsonString = JSON.stringify(data);
|
|
104
|
-
if (jsonString) {
|
|
105
|
-
localStorage.setItem("refresh_save", jsonString)
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
export async function loadRefreshSave(navigate: (path: string) => void) {
|
|
110
|
-
const jsonString = localStorage.getItem("refresh_save")
|
|
111
|
-
if (jsonString) {
|
|
112
|
-
navigate("/loading")
|
|
113
|
-
let data: GameSaveData = JSON.parse(jsonString)
|
|
114
|
-
return loadSave(data, navigate)
|
|
115
|
-
.then(() => {
|
|
116
|
-
localStorage.removeItem("refreshSave")
|
|
117
|
-
})
|
|
118
|
-
.catch(() => {
|
|
119
|
-
navigate("/")
|
|
120
|
-
})
|
|
121
|
-
}
|
|
122
|
-
else {
|
|
123
|
-
navigate("/")
|
|
124
|
-
}
|
|
125
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { saveCharacter } from "@drincs/pixi-vn";
|
|
2
|
-
import Character from "../models/Character";
|
|
3
|
-
|
|
4
|
-
export const juliette = new Character('___pixivn_juliette___', {
|
|
5
|
-
name: 'Juliette',
|
|
6
|
-
age: 25,
|
|
7
|
-
icon: "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT4eMoz7DH8l_Q-iCzSc1xyu_C2iryWh2O9_FcDBpY04w&s",
|
|
8
|
-
color: "#ac0086"
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
saveCharacter(juliette);
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"ui": {
|
|
3
|
-
"allert_error_occurred": "An error occurred, please report it to the developer",
|
|
4
|
-
"attention": "Attention",
|
|
5
|
-
"auto_forward_time": "Auto Forward Time",
|
|
6
|
-
"auto_forward_time_description": "Choose the time in seconds before the dialogue auto-forwards. If \"{{textSpeedName}}\" is enabled, the auto-forward will be executed after the typewriter effect is completed. (You can edit this value if \"{{autoName}}\" is enabled)",
|
|
7
|
-
"auto_forward_time_restricted": "Auto",
|
|
8
|
-
"back": "Back",
|
|
9
|
-
"cancel": "Cancel",
|
|
10
|
-
"confirm": "Confirm",
|
|
11
|
-
"continue": "Continue",
|
|
12
|
-
"delete": "Delete",
|
|
13
|
-
"dialogues": "Dialogues",
|
|
14
|
-
"display": "Display",
|
|
15
|
-
"enter_fullscreen": "Enter Fullscreen",
|
|
16
|
-
"example": "Example",
|
|
17
|
-
"exit": "Exit",
|
|
18
|
-
"exit_fullscreen": "Exit Fullscreen",
|
|
19
|
-
"fail_delete": "Delete failed",
|
|
20
|
-
"fail_load": "Load failed",
|
|
21
|
-
"fail_save": "Save failed",
|
|
22
|
-
"fullscreen": "Fullscreen",
|
|
23
|
-
"fullscreen_description": "Toggle fullscreen mode.",
|
|
24
|
-
"hide_ui": "Hide UI",
|
|
25
|
-
"history": "History",
|
|
26
|
-
"load": "Load",
|
|
27
|
-
"load_from_file": "Load from File",
|
|
28
|
-
"load_last_save": "Load Last Save",
|
|
29
|
-
"load_last_save_restricted": "L.Load",
|
|
30
|
-
"next": "Next",
|
|
31
|
-
"off": "Off",
|
|
32
|
-
"primary_color": "Primary Color",
|
|
33
|
-
"primary_color_description": "Choose the primary color for the theme.",
|
|
34
|
-
"quick_save": "Quick Save",
|
|
35
|
-
"quick_save_restricted": "Q.Save",
|
|
36
|
-
"return_main_menu": "Return to Main Menu",
|
|
37
|
-
"save": "Save",
|
|
38
|
-
"save_as": "Save As",
|
|
39
|
-
"save_slot": "Save Slot",
|
|
40
|
-
"save_to_file": "Save to File",
|
|
41
|
-
"search": "Search",
|
|
42
|
-
"settings": "Settings",
|
|
43
|
-
"settings_restricted": "Prefs",
|
|
44
|
-
"skip": "Skip",
|
|
45
|
-
"solid_color": "Solid Color",
|
|
46
|
-
"solid_color_description": "Choose the solid color for the theme. It can be black or white and will be contrasting with the primary color. So if the primary color is dark, the solid color will be white, and a the other way around.",
|
|
47
|
-
"start": "Start",
|
|
48
|
-
"success_delete": "Delete successful",
|
|
49
|
-
"success_load": "Load successful",
|
|
50
|
-
"success_save": "Save successful",
|
|
51
|
-
"text_speed": "Text Speed",
|
|
52
|
-
"text_speed_description": "Choose the speed of the typewriter effect. If is set to 0 ( off ) the text will appear instantly.",
|
|
53
|
-
"theme_mode": "Theme Mode",
|
|
54
|
-
"theme_mode_description": "Choose between light, dark, or system theme mode.",
|
|
55
|
-
"you_sure_to_delete_save": "Are you sure you want to delete this save file?",
|
|
56
|
-
"you_sure_to_load_save": "Are you sure you want to load this save file?",
|
|
57
|
-
"you_sure_to_return_main_menu": "Are you sure you want to return to the main menu? All unsaved progress will be lost."
|
|
58
|
-
},
|
|
59
|
-
"narration": {}
|
|
60
|
-
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|