create-pixi-vn 2.0.3 → 2.0.5

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.
Files changed (125) hide show
  1. package/dist/index.mjs +36 -36
  2. package/index.js +1 -1
  3. package/package.json +5 -4
  4. package/template-react-vite-muijoy/package-lock.json +4 -4
  5. package/template-react-vite-muijoy/package.json +1 -1
  6. package/template-react-vite-muijoy/src/assets/ink-manifest.gen.json +1 -0
  7. package/template-react-vite-muijoy/src/components/menus/main-menu.tsx +1 -2
  8. package/template-react-vite-muijoy/src/components/menus/save-menu/index.tsx +5 -6
  9. package/template-react-vite-muijoy/src/content/labels/start.label.ts +2 -4
  10. package/{template-react-vite-muijoy-tauri/src/lib/stores/useGameSaveScreenStore.ts → template-react-vite-muijoy/src/lib/stores/save-menu-pagination-store.ts} +3 -3
  11. package/template-react-vite-muijoy/src/pixi-vn-keys.gen.d.ts +20 -0
  12. package/template-react-vite-muijoy/vite.config.ts +1 -0
  13. package/template-react-vite-muijoy-ink/package-lock.json +3 -3
  14. package/template-react-vite-muijoy-ink/package.json +2 -2
  15. package/template-react-vite-muijoy-ink/src/components/menus/save-menu/index.tsx +5 -6
  16. package/{template-react-vite-muijoy-ink-tauri/src/lib/stores/useGameSaveScreenStore.ts → template-react-vite-muijoy-ink/src/lib/stores/save-menu-pagination-store.ts} +3 -3
  17. package/template-react-vite-muijoy-ink/src/pixi-vn-keys.gen.d.ts +22 -0
  18. package/template-react-vite-muijoy-ink/vite.config.ts +1 -0
  19. package/template-react-vite-muijoy-ink-tauri/package-lock.json +3 -3
  20. package/template-react-vite-muijoy-ink-tauri/package.json +2 -2
  21. package/template-react-vite-muijoy-ink-tauri/src/components/menus/save-menu/index.tsx +5 -6
  22. package/{template-react-vite-muijoy-ink/src/lib/stores/useGameSaveScreenStore.ts → template-react-vite-muijoy-ink-tauri/src/lib/stores/save-menu-pagination-store.ts} +3 -3
  23. package/template-react-vite-muijoy-ink-tauri/src/pixi-vn-keys.gen.d.ts +22 -0
  24. package/template-react-vite-muijoy-ink-tauri/vite.config.ts +1 -0
  25. package/template-react-vite-muijoy-tauri/package-lock.json +4 -4
  26. package/template-react-vite-muijoy-tauri/package.json +1 -1
  27. package/template-react-vite-muijoy-tauri/src/assets/ink-manifest.gen.json +1 -0
  28. package/template-react-vite-muijoy-tauri/src/components/menus/main-menu.tsx +1 -2
  29. package/template-react-vite-muijoy-tauri/src/components/menus/save-menu/index.tsx +5 -6
  30. package/template-react-vite-muijoy-tauri/src/content/labels/start.label.ts +2 -4
  31. package/{template-react-vite-muijoy/src/lib/stores/useGameSaveScreenStore.ts → template-react-vite-muijoy-tauri/src/lib/stores/save-menu-pagination-store.ts} +3 -3
  32. package/template-react-vite-muijoy-tauri/src/pixi-vn-keys.gen.d.ts +20 -0
  33. package/template-react-vite-muijoy-tauri/vite.config.ts +1 -0
  34. package/template-react-vite-muijoy-electron/.eslintrc.cjs +0 -29
  35. package/template-react-vite-muijoy-electron/.vscode/extensions.json +0 -9
  36. package/template-react-vite-muijoy-electron/.vscode/launch.json +0 -32
  37. package/template-react-vite-muijoy-electron/.vscode/settings.json +0 -49
  38. package/template-react-vite-muijoy-electron/README.md +0 -207
  39. package/template-react-vite-muijoy-electron/_gitignore +0 -107
  40. package/template-react-vite-muijoy-electron/forge.config.cts +0 -73
  41. package/template-react-vite-muijoy-electron/forge.env.d.ts +0 -1
  42. package/template-react-vite-muijoy-electron/index.html +0 -13
  43. package/template-react-vite-muijoy-electron/ionic.config.json +0 -7
  44. package/template-react-vite-muijoy-electron/package-lock.json +0 -16984
  45. package/template-react-vite-muijoy-electron/package.json +0 -85
  46. package/template-react-vite-muijoy-electron/public/apple-touch-icon.png +0 -0
  47. package/template-react-vite-muijoy-electron/public/favicon.ico +0 -0
  48. package/template-react-vite-muijoy-electron/public/mask-icon.svg +0 -890
  49. package/template-react-vite-muijoy-electron/public/pixi-vn.svg +0 -23
  50. package/template-react-vite-muijoy-electron/public/pwa-192x192.png +0 -0
  51. package/template-react-vite-muijoy-electron/public/pwa-512x512.png +0 -0
  52. package/template-react-vite-muijoy-electron/public/robots.txt +0 -3
  53. package/template-react-vite-muijoy-electron/src/App.css +0 -42
  54. package/template-react-vite-muijoy-electron/src/App.tsx +0 -16
  55. package/template-react-vite-muijoy-electron/src/AppRoutes.tsx +0 -66
  56. package/template-react-vite-muijoy-electron/src/Home.tsx +0 -27
  57. package/template-react-vite-muijoy-electron/src/Imports.tsx +0 -34
  58. package/template-react-vite-muijoy-electron/src/atoms/autoInfoState.ts +0 -50
  59. package/template-react-vite-muijoy-electron/src/atoms/dialogueCardHeightState.ts +0 -23
  60. package/template-react-vite-muijoy-electron/src/atoms/dialogueCardImageWidthState.ts +0 -23
  61. package/template-react-vite-muijoy-electron/src/atoms/hideInterfaceState.ts +0 -6
  62. package/template-react-vite-muijoy-electron/src/atoms/nextStepLoadingState.ts +0 -6
  63. package/template-react-vite-muijoy-electron/src/atoms/openGameSaveScreenState.ts +0 -6
  64. package/template-react-vite-muijoy-electron/src/atoms/openHistoryScreenState.ts +0 -6
  65. package/template-react-vite-muijoy-electron/src/atoms/openSettingsState.ts +0 -6
  66. package/template-react-vite-muijoy-electron/src/atoms/saveLoadAlertState.ts +0 -26
  67. package/template-react-vite-muijoy-electron/src/atoms/saveScreenPageState.ts +0 -23
  68. package/template-react-vite-muijoy-electron/src/atoms/skipEnabledState.ts +0 -6
  69. package/template-react-vite-muijoy-electron/src/atoms/typewriterDelayState.ts +0 -23
  70. package/template-react-vite-muijoy-electron/src/atoms/typewriterIsAnimatedState.ts +0 -6
  71. package/template-react-vite-muijoy-electron/src/components/ChoiceButton.tsx +0 -19
  72. package/template-react-vite-muijoy-electron/src/components/DragHandleDivider.tsx +0 -40
  73. package/template-react-vite-muijoy-electron/src/components/MenuButton.tsx +0 -37
  74. package/template-react-vite-muijoy-electron/src/components/ModalConfirmation.tsx +0 -70
  75. package/template-react-vite-muijoy-electron/src/components/ModalDialog.tsx +0 -103
  76. package/template-react-vite-muijoy-electron/src/components/NextButton.tsx +0 -94
  77. package/template-react-vite-muijoy-electron/src/components/SettingButton.tsx +0 -44
  78. package/template-react-vite-muijoy-electron/src/components/SliderResizer.tsx +0 -53
  79. package/template-react-vite-muijoy-electron/src/components/TextMenuButton.tsx +0 -41
  80. package/template-react-vite-muijoy-electron/src/components/Typewriter.tsx +0 -335
  81. package/template-react-vite-muijoy-electron/src/components/TypographyShadow.tsx +0 -15
  82. package/template-react-vite-muijoy-electron/src/i18n.ts +0 -29
  83. package/template-react-vite-muijoy-electron/src/index.css +0 -9
  84. package/template-react-vite-muijoy-electron/src/interceptors/EventInterceptor.tsx +0 -49
  85. package/template-react-vite-muijoy-electron/src/interceptors/SkipAutoInterceptor.tsx +0 -67
  86. package/template-react-vite-muijoy-electron/src/main.tsx +0 -39
  87. package/template-react-vite-muijoy-electron/src/models/Character.ts +0 -86
  88. package/template-react-vite-muijoy-electron/src/models/GameSaveData.ts +0 -9
  89. package/template-react-vite-muijoy-electron/src/pixi-vn.d.ts +0 -36
  90. package/template-react-vite-muijoy-electron/src/providers/ThemeProvider.tsx +0 -165
  91. package/template-react-vite-muijoy-electron/src/screens/ChoiceMenu.tsx +0 -130
  92. package/template-react-vite-muijoy-electron/src/screens/GameSaveScreen.tsx +0 -274
  93. package/template-react-vite-muijoy-electron/src/screens/HistoryScreen.tsx +0 -155
  94. package/template-react-vite-muijoy-electron/src/screens/LoadingScreen.tsx +0 -40
  95. package/template-react-vite-muijoy-electron/src/screens/MainMenu.tsx +0 -98
  96. package/template-react-vite-muijoy-electron/src/screens/NarrationScreen.tsx +0 -220
  97. package/template-react-vite-muijoy-electron/src/screens/QuickTools.tsx +0 -168
  98. package/template-react-vite-muijoy-electron/src/screens/Settings.tsx +0 -536
  99. package/template-react-vite-muijoy-electron/src/screens/modals/SaveLoadAlert.tsx +0 -135
  100. package/template-react-vite-muijoy-electron/src/screens/modals/TextInput.tsx +0 -61
  101. package/template-react-vite-muijoy-electron/src/use_query/useQueryInterface.ts +0 -73
  102. package/template-react-vite-muijoy-electron/src/use_query/useQueryLastSave.ts +0 -18
  103. package/template-react-vite-muijoy-electron/src/use_query/useQuerySaves.ts +0 -18
  104. package/template-react-vite-muijoy-electron/src/utilities/actions-utility.ts +0 -10
  105. package/template-react-vite-muijoy-electron/src/utilities/component-utility.ts +0 -25
  106. package/template-react-vite-muijoy-electron/src/utilities/indexedDB-utility.ts +0 -196
  107. package/template-react-vite-muijoy-electron/src/utilities/navigate-utility.ts +0 -18
  108. package/template-react-vite-muijoy-electron/src/utilities/save-utility.ts +0 -125
  109. package/template-react-vite-muijoy-electron/src/values/characters.ts +0 -11
  110. package/template-react-vite-muijoy-electron/src/values/translations/strings_en.json +0 -60
  111. package/template-react-vite-muijoy-electron/src/vite-env.d.ts +0 -4
  112. package/template-react-vite-muijoy-electron/src-electron/icons/icon.icns +0 -0
  113. package/template-react-vite-muijoy-electron/src-electron/icons/icon.ico +0 -0
  114. package/template-react-vite-muijoy-electron/src-electron/icons/icon.png +0 -0
  115. package/template-react-vite-muijoy-electron/src-electron/index.css +0 -7
  116. package/template-react-vite-muijoy-electron/src-electron/main.ts +0 -59
  117. package/template-react-vite-muijoy-electron/src-electron/preload.ts +0 -2
  118. package/template-react-vite-muijoy-electron/src-electron/renderer.ts +0 -31
  119. package/template-react-vite-muijoy-electron/tsconfig.json +0 -32
  120. package/template-react-vite-muijoy-electron/tsconfig.node.json +0 -11
  121. package/template-react-vite-muijoy-electron/vite.base.config.ts +0 -93
  122. package/template-react-vite-muijoy-electron/vite.config.ts +0 -54
  123. package/template-react-vite-muijoy-electron/vite.main.config.ts +0 -9
  124. package/template-react-vite-muijoy-electron/vite.preload.config.ts +0 -9
  125. 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
- }
@@ -1,4 +0,0 @@
1
- /// <reference types="vite/client" />
2
-
3
- declare const __APP_VERSION__: string;
4
- declare const __APP_NAME__: string;
@@ -1,7 +0,0 @@
1
- body {
2
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica,
3
- Arial, sans-serif;
4
- margin: auto;
5
- max-width: 38rem;
6
- padding: 2rem;
7
- }