53 Commits

Author SHA1 Message Date
Vick Scarlet
dd5a003801 update: dependencies 2026-01-26 18:21:44 +08:00
Vick Scarlet
ddc87ebf40 update: dependencies 2026-01-26 17:50:24 +08:00
dependabot[bot]
23bcae0b74 Bump js-yaml in the npm_and_yarn group across 1 directory
Bumps the npm_and_yarn group with 1 update in the / directory: [js-yaml](https://github.com/nodeca/js-yaml).


Updates `js-yaml` from 4.1.0 to 4.1.1
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/compare/4.1.0...4.1.1)

---
updated-dependencies:
- dependency-name: js-yaml
  dependency-version: 4.1.1
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-26 15:14:19 +08:00
dependabot[bot]
e075dfc23d Bump vite in the npm_and_yarn group across 1 directory
Bumps the npm_and_yarn group with 1 update in the / directory: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `vite` from 6.3.6 to 6.4.1
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/create-vite@6.4.1/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 6.4.1
  dependency-type: direct:development
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-26 15:09:16 +08:00
Vick Scarlet
9088ab0eb1 add: support template prop 2026-01-26 14:47:35 +08:00
dependabot[bot]
39388c6eaf Bump the npm_and_yarn group across 1 directory with 2 updates
Bumps the npm_and_yarn group with 2 updates in the / directory: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) and [brace-expansion](https://github.com/juliangruber/brace-expansion).


Updates `vite` from 6.2.5 to 6.3.6
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v6.3.6/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v6.3.6/packages/vite)

Updates `brace-expansion` from 2.0.1 to 2.0.2
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/v2.0.1...v2.0.2)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 6.3.6
  dependency-type: direct:development
  dependency-group: npm_and_yarn
- dependency-name: brace-expansion
  dependency-version: 2.0.2
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-24 17:46:20 +08:00
神戸小鳥
0ce9b0ed02 Add Dependabot configuration for updates
Configured Dependabot for version updates with a weekly schedule.
2025-09-24 17:45:01 +08:00
Vick Scarlet
aee4fcf164 fix: 修复冲突天赋漏填出错 2025-05-17 21:27:01 +08:00
Vick Scarlet
5c0fe56915 fix: 修复冲突天赋漏填出错 2025-05-17 21:17:21 +08:00
Vick Scarlet
b82da6c9a7 delete: unuse 2025-04-06 20:38:54 +08:00
su226
b1ffae9eaf fix: wrong data 2025-04-06 19:39:05 +08:00
Vick Scarlet
fee986432d update: use min lib 2025-04-05 18:37:04 +08:00
Vick Scarlet
25fc74398a update: readme 2025-04-05 18:26:55 +08:00
Vick Scarlet
35c5fe36fb update: readme 2025-04-05 18:03:43 +08:00
Vick Scarlet
3f58e3deae fix: script 2025-04-05 17:58:08 +08:00
Vick Scarlet
788c864e71 change: vite build base 2025-04-05 17:47:35 +08:00
Vick Scarlet
680a4f8a5a remove: unuse 2025-04-05 17:43:21 +08:00
Vick Scarlet
8f46e286dd update: depence 2025-04-05 17:40:22 +08:00
Vick Scarlet
2eaf7a1ba2 update: toolchan 2025-04-05 17:27:00 +08:00
Vick Scarlet
6b58fa99cf change: ui 2025-04-05 12:35:59 +08:00
Vick Scarlet
5d1b623230 add: banner 2025-04-05 12:29:01 +08:00
Vick Scarlet
6e442c14c1 update: afd url 2024-09-17 18:31:30 +08:00
Vick Scarlet
2eadb6fb23 update event 2024-07-31 19:40:42 +08:00
Vick Scarlet
d19afd7b1a update special thanks 2024-02-02 16:33:05 +08:00
Vick Scarlet
98eda94f66 update: special thanks 2023-10-12 19:07:46 +08:00
Vick Scarlet
e0f5cb71c5 update specialthanks 2023-02-14 19:43:30 +08:00
Vick Scarlet
58140fd4d2 fix #379 2023-01-03 09:39:52 +08:00
Vick Scarlet
b44e0e65a5 update: specialthanks 2023-01-03 09:38:51 +08:00
Vick Scarlet
cc460d6108 update specialthanks 2022-11-15 22:02:46 +08:00
Vick Scarlet
1dd1927612 dev: update v-transform 2022-10-07 14:19:18 +08:00
Vick Scarlet
21d4c9d568 update specialthanks 2022-09-24 16:36:49 +08:00
Vick Scarlet
35eac7d19d update data 2022-09-12 14:05:09 +08:00
Vick Scarlet
c1ed14385a update special thanks 2022-09-01 23:19:47 +08:00
Vick Scarlet
50ad3d35e7 update: events 2022-08-29 15:35:11 +08:00
Vick Scarlet
4df53d9f58 update specialthanks 2022-08-18 15:10:38 +08:00
Vick Scarlet
8a6f50dda6 update specialthanks 2022-07-16 13:32:10 +08:00
Miller-du
49488505e2 Update webpack.config.cjs 2022-06-08 11:39:31 +08:00
Vick Scarlet
dd64e8f44e update specialthanks 2022-05-31 04:15:31 +08:00
Vick Scarlet
b39772fd94 update event 2022-05-17 22:17:08 +08:00
Vick Scarlet
fc1135a621 update new event 2022-04-28 01:21:05 +08:00
Vick Scarlet
d7ea91a1b8 update specialthanks 2022-04-27 16:39:16 +08:00
Vick Scarlet
53a8729968 fix test 2022-04-07 15:44:22 +08:00
Vick Scarlet
ad93703a45 update specialthanks 2022-04-07 15:21:56 +08:00
Vick Scarlet
329c2f09c4 update specialthanks 2022-03-30 15:20:38 +08:00
Vick Scarlet
1f7434a133 update specialthanks 2022-03-04 19:39:20 +08:00
Vick Scarlet
145211ba9a fix: #367 delete not exists branch 2022-02-21 10:13:31 +08:00
Vick Scarlet
1d58fd6bfd update achievement 2022-02-15 18:44:02 +08:00
Vick Scarlet
26d4e09bc8 update specialthanks 2022-02-14 22:52:08 +08:00
Vick Scarlet
49619fbaa2 Merge branch 'master' of https://github.com/VickScarlet/lifeRestart 2022-01-31 17:26:39 +08:00
Vick Scarlet
751a0dec0f hotfix 2022-01-31 17:24:29 +08:00
Vick Scarlet
bc560c393b hotfix event
Squashed commit of the following:

commit f8724b9ffd
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sat Jan 29 01:08:39 2022 +0800

    update event
2022-01-29 01:13:37 +08:00
Vick Scarlet
8eb0e44845 Squashed commit of the following:
commit 89e30db1fb
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Fri Jan 28 13:49:32 2022 +0800

    update events

commit 870d711162
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Jan 27 16:50:19 2022 +0800

    update event

commit b327eb1765
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Jan 27 16:36:02 2022 +0800

    update event

commit 4e845bc2eb
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Jan 27 16:35:56 2022 +0800

    fix ui feel

commit bd508913c5
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Jan 27 16:35:22 2022 +0800

    update special thanks

commit d097b3bc15
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Jan 27 16:04:55 2022 +0800

    add unique character

commit 8d71b73e94
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Tue Jan 25 21:27:29 2022 +0800

    fix: bug
    save load

commit 286828abe7
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Tue Jan 25 18:15:22 2022 +0800

    add game mode

commit 0e3c885ad3
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Jan 6 20:09:20 2022 +0800

    update special thanks

commit b421082374
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Fri Dec 31 20:26:20 2021 +0800

    update specialthanks

commit 765a69294b
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Tue Dec 14 19:10:03 2021 +0800

    fix ios goto

commit 8eb8c3ca72
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Tue Dec 14 19:03:37 2021 +0800

    add event grade

commit ab705dd46c
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Tue Dec 14 18:48:42 2021 +0800

    build version

commit a1e4232369
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Tue Dec 14 18:47:05 2021 +0800

    change talent replace before property allocate

commit f4d7b3ae3c
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Tue Dec 14 18:06:18 2021 +0800

    add event grade

commit 0567e40ddc
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Dec 2 21:28:10 2021 +0800

    add particle

commit f17003925e
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Dec 2 20:14:26 2021 +0800

    change ui

commit f8beda1d8f
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Dec 2 19:08:30 2021 +0800

    change popup message ui

commit 915a2aa17d
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Dec 2 18:34:29 2021 +0800

    new build

commit b5edabc104
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Dec 2 18:18:46 2021 +0800

    add hint message

commit a143feadaf
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Dec 2 17:57:31 2021 +0800

    fix copy bug

commit eab1975791
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Dec 2 17:56:28 2021 +0800

    add save/load

commit acf9b92134
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Dec 2 14:35:33 2021 +0800

    add theme switch

commit 488a6054ab
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Wed Dec 1 18:30:36 2021 +0800

    fix uiManager bug

commit f0317eaf14
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Wed Dec 1 16:07:03 2021 +0800

    add message popup

commit eb02d1ee6f
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sun Nov 28 21:22:54 2021 +0800

    change relocation

commit 60503eae47
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sun Nov 28 19:27:16 2021 +0800

    change ScaleButton -> Laya.runtime.ScaleButton

commit 52ef5909c1
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sun Nov 28 19:26:31 2021 +0800

    change ScaleButton -> Laya.runtime.ScaleButton

commit 0284f6aa71
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sun Nov 28 19:05:24 2021 +0800

    config webpack

commit 0e272ffd99
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sun Nov 28 13:17:41 2021 +0800

    add thanks

commit e1e2ab4701
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sun Nov 28 11:40:21 2021 +0800

    add light theme

commit 4f55c00f86
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sat Nov 27 22:27:39 2021 +0800

    fix bug

commit 1d07bdfc46
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sat Nov 27 21:48:47 2021 +0800

    daily update

commit 52d6a0ca8f
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Wed Nov 24 23:10:04 2021 +0800

    daily update

commit f8dd720d4d
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Wed Nov 24 19:08:13 2021 +0800

    daily update

commit d088c1a862
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sun Nov 21 21:41:46 2021 +0800

    remove useless

commit a711fcf3ed
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Tue Nov 16 00:53:05 2021 +0800

    add achievement popup
    add page adaptive
    add talent extends

commit 05e02de3db
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sat Nov 13 01:24:04 2021 +0800

    add github and discord

commit bff0109cc5
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sat Nov 13 00:30:01 2021 +0800

    add trajectory auto mode

commit 54c04f65c2
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Fri Nov 12 19:54:31 2021 +0800

    fix property judge negative number bug

commit 660739530b
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Fri Nov 12 19:48:58 2021 +0800

    update achievement

commit c94e9e7433
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Nov 11 21:37:45 2021 +0800

    update daily

commit c06cd9ea62
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Tue Nov 9 00:08:05 2021 +0800

    update daily

commit 2666983f89
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sun Nov 7 23:00:22 2021 +0800

    add uiManager auto scan and load skin resource

commit 22fa5d755a
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sun Nov 7 22:17:04 2021 +0800

    update framework

commit f40698d63e
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sun Oct 31 00:13:22 2021 +0800

    add laya
2022-01-28 14:03:05 +08:00
Vick Scarlet
14f9340d0a Squashed commit of the following:
commit 870d711162
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Jan 27 16:50:19 2022 +0800

    update event

commit b327eb1765
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Jan 27 16:36:02 2022 +0800

    update event

commit 4e845bc2eb
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Jan 27 16:35:56 2022 +0800

    fix ui feel

commit bd508913c5
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Jan 27 16:35:22 2022 +0800

    update special thanks

commit d097b3bc15
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Jan 27 16:04:55 2022 +0800

    add unique character

commit 8d71b73e94
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Tue Jan 25 21:27:29 2022 +0800

    fix: bug
    save load

commit 286828abe7
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Tue Jan 25 18:15:22 2022 +0800

    add game mode

commit 0e3c885ad3
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Jan 6 20:09:20 2022 +0800

    update special thanks

commit b421082374
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Fri Dec 31 20:26:20 2021 +0800

    update specialthanks

commit 765a69294b
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Tue Dec 14 19:10:03 2021 +0800

    fix ios goto

commit 8eb8c3ca72
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Tue Dec 14 19:03:37 2021 +0800

    add event grade

commit ab705dd46c
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Tue Dec 14 18:48:42 2021 +0800

    build version

commit a1e4232369
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Tue Dec 14 18:47:05 2021 +0800

    change talent replace before property allocate

commit f4d7b3ae3c
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Tue Dec 14 18:06:18 2021 +0800

    add event grade

commit 0567e40ddc
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Dec 2 21:28:10 2021 +0800

    add particle

commit f17003925e
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Dec 2 20:14:26 2021 +0800

    change ui

commit f8beda1d8f
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Dec 2 19:08:30 2021 +0800

    change popup message ui

commit 915a2aa17d
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Dec 2 18:34:29 2021 +0800

    new build

commit b5edabc104
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Dec 2 18:18:46 2021 +0800

    add hint message

commit a143feadaf
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Dec 2 17:57:31 2021 +0800

    fix copy bug

commit eab1975791
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Dec 2 17:56:28 2021 +0800

    add save/load

commit acf9b92134
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Dec 2 14:35:33 2021 +0800

    add theme switch

commit 488a6054ab
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Wed Dec 1 18:30:36 2021 +0800

    fix uiManager bug

commit f0317eaf14
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Wed Dec 1 16:07:03 2021 +0800

    add message popup

commit eb02d1ee6f
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sun Nov 28 21:22:54 2021 +0800

    change relocation

commit 60503eae47
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sun Nov 28 19:27:16 2021 +0800

    change ScaleButton -> Laya.runtime.ScaleButton

commit 52ef5909c1
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sun Nov 28 19:26:31 2021 +0800

    change ScaleButton -> Laya.runtime.ScaleButton

commit 0284f6aa71
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sun Nov 28 19:05:24 2021 +0800

    config webpack

commit 0e272ffd99
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sun Nov 28 13:17:41 2021 +0800

    add thanks

commit e1e2ab4701
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sun Nov 28 11:40:21 2021 +0800

    add light theme

commit 4f55c00f86
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sat Nov 27 22:27:39 2021 +0800

    fix bug

commit 1d07bdfc46
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sat Nov 27 21:48:47 2021 +0800

    daily update

commit 52d6a0ca8f
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Wed Nov 24 23:10:04 2021 +0800

    daily update

commit f8dd720d4d
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Wed Nov 24 19:08:13 2021 +0800

    daily update

commit d088c1a862
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sun Nov 21 21:41:46 2021 +0800

    remove useless

commit a711fcf3ed
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Tue Nov 16 00:53:05 2021 +0800

    add achievement popup
    add page adaptive
    add talent extends

commit 05e02de3db
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sat Nov 13 01:24:04 2021 +0800

    add github and discord

commit bff0109cc5
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sat Nov 13 00:30:01 2021 +0800

    add trajectory auto mode

commit 54c04f65c2
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Fri Nov 12 19:54:31 2021 +0800

    fix property judge negative number bug

commit 660739530b
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Fri Nov 12 19:48:58 2021 +0800

    update achievement

commit c94e9e7433
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Thu Nov 11 21:37:45 2021 +0800

    update daily

commit c06cd9ea62
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Tue Nov 9 00:08:05 2021 +0800

    update daily

commit 2666983f89
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sun Nov 7 23:00:22 2021 +0800

    add uiManager auto scan and load skin resource

commit 22fa5d755a
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sun Nov 7 22:17:04 2021 +0800

    update framework

commit f40698d63e
Author: Vick Scarlet <scarlet_vick@outlook.com>
Date:   Sun Oct 31 00:13:22 2021 +0800

    add laya
2022-01-28 00:39:35 +08:00
114 changed files with 5139 additions and 185779 deletions

11
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,11 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
version: 2
updates:
- package-ecosystem: "" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "weekly"

29
.github/workflows/deploy.yml vendored Normal file
View File

@@ -0,0 +1,29 @@
name: Build and Deploy
on:
push:
branches: [main]
permissions:
contents: write
jobs:
build-and-deploy:
concurrency: ci-${{ github.ref }} # Recommended if you intend to make multiple deployments in quick succession.
runs-on: ubuntu-latest
steps:
- name: Checkout 🛎️
uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10
- name: Install and Build 🔧 # This example project is built using npm and outputs the result to the 'build' folder. Replace with the commands required to build your project, or remove this step entirely if your site is pre-built.
run: |
pnpm install
pnpm xlsx2json
pnpm build
- name: Deploy 🚀
uses: JamesIves/github-pages-deploy-action@v4
with:
folder: template # The folder the action should deploy.

View File

@@ -1,31 +0,0 @@
# This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
name: Node.js CI
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14.x, 16.x]
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- run: npm install
- run: npm run build --if-present
- run: npm test

5
.gitignore vendored
View File

@@ -107,4 +107,7 @@ utils/xlsxTransform-*
/.idea
__localStorage.json
__localStorage.json
template/public
public/data

View File

@@ -1,3 +0,0 @@
{
"esversion": 9
}

29
.vscode/launch.json vendored
View File

@@ -4,40 +4,15 @@
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Launch Chrome",
"request": "launch",
"type": "pwa-chrome",
"url": "http://127.0.0.1:8000/public/index.html",
"webRoot": "${workspaceFolder}"
},
{
"type": "node",
"request": "launch",
"name": "test",
"program": "${workspaceFolder}/test",
"skipFiles": [
"<node_internals>/**"
"<node_internals>/**",
"**/node_modumes/**"
]
},
{
"type": "node",
"request": "launch",
"name": "xlsx2json",
"program": "${workspaceFolder}/node_modules/v-transform/src/index.js",
"args": ["transform", "jobs/xlsx2json/config.json"],
"skipFiles": [
"<node_internals>/**"
]
},
{
"name": "Attach by Process ID",
"processId": "${command:PickProcess}",
"request": "attach",
"skipFiles": [
"<node_internals>/**"
],
"type": "node"
},
]
}

1
CNAME
View File

@@ -1 +0,0 @@
liferestart.syaro.io

View File

@@ -14,38 +14,22 @@
<summary><strong>网页版</strong></summary>
<br />
1. 下载项目代码。
```bash
# 1. 下载项目代码
git clone https://github.com/VickScarlet/lifeRestart.git my-project
# 2. 进入目录安装依赖
cd my-project
pnpm install
# 3. 转换XLSX表
pnpm xlsx2json
# 4. 启动本地开发服务器
pnpm dev
```
2. 进入目录安装依赖
```bash
yarn install
```
或者
```bash
npm install
```
3. 启动本地服务器。
```bash
yarn dev
```
或者
```bash
npm run dev
```
4. 启动完成后会自动打开浏览器访问 [http://localhost:8081/view/index.html](http://localhost:8081/view/index.html)。
启动完成后打开浏览器访问 [http://localhost:5173](http://localhost:5173)
</details>

View File

@@ -14,38 +14,23 @@ English | [简体中文](./README-zh_CN.md)
<summary><strong>Web Version</strong></summary>
<br />
1. Clone project code.
```bash
# 1. Clone project code.
git clone git@github.com:VickScarlet/lifeRestart.git my-project
cd my-project
# 2. Installation dependence.
pnpm install
# 3. Transform XLSX
pnpm xlsx2json
# 4. Start local dev server.
pnpm dev
```
2. Installation dependence.
```bash
yarn install
```
Or
```bash
npm install
```
3. Start local server.
```bash
yarn dev
```
Or
```bash
npm run dev
```
4. After the startup is complete, will automatically open a browser and visit [http://localhost:8081/view/index.html](http://localhost:8081/view/index.html).
After the startup is complete, open a browser and visit [http://localhost:5173](http://localhost:5173).
</details>
<details>

Binary file not shown.

Binary file not shown.

BIN
data/en-us/character.xlsx Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
data/zh-cn/character.xlsx Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -15,12 +15,22 @@
<meta name="laya" screenorientation ="landscape"/>
<meta http-equiv="expires" content="0"/>
<meta http-equiv="Cache-Control" content="no-siteapp"/>
<font-face font-family="方正像素12" src="fonts/方正像素12.ttf"/>
<title>Life Restart</title>
<!--
<script type="text/javascript" src="libs/laya/laya.core.js"></script>
<script type="text/javascript" src="libs/laya/laya.webgl.js"></script>
<script type="text/javascript" src="libs/laya/laya.filter.js"></script>
<script type="text/javascript" src="libs/laya/laya.html.js"></script>
<script type="text/javascript" src="libs/laya/laya.particle.js"></script>
<script type="text/javascript" src="libs/laya/laya.ui.js"></script>
-->
<script type="text/javascript" src="libs/laya/min/laya.core.min.js"></script>
<script type="text/javascript" src="libs/laya/min/laya.webgl.min.js"></script>
<script type="text/javascript" src="libs/laya/min/laya.filter.min.js"></script>
<script type="text/javascript" src="libs/laya/min/laya.particle.min.js"></script>
<script type="text/javascript" src="libs/laya/min/laya.ui.min.js"></script>
<script type="module" src="src/index.js"></script>
</head>
<body style="background:black"></body>
</html>

View File

@@ -1,19 +0,0 @@
{
"configurations": [
{
"source": [
"../../data/specialthanks-afd.xlsx",
"../../data/specialthanks-dun.xlsx"
],
"target": "../../public/data"
},
{
"source": "../../data/zh-cn",
"target": "../../public/data/zh-cn"
},
{
"source": "../../data/en-us",
"target": "../../public/data/en-us"
}
]
}

View File

@@ -1,12 +1,10 @@
{
// See http://go.microsoft.com/fwlink/?LinkId=759670
// for the documentation about the jsconfig.json format
"compilerOptions": {
"target": "es5"
},
"exclude": [
"node_modules",
"public",
"view"
]
// See http://go.microsoft.com/fwlink/?LinkId=759670
// for the documentation about the jsconfig.json format
"compilerOptions": {
"module": "esnext",
"target": "es6",
},
"include":["src", "repl", "vite.config.js"],
"exclude": ["node_modules", "public", "view"]
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,8 +1,8 @@
{
"x":0,
"type":"View",
"selectedBox":1,
"selecteID":12,
"selectedBox":93,
"selecteID":94,
"props":{"y":1218,"x":562,"width":1125,"sceneColor":"#000000","sceneBg":"laya/views/view/CyberTheme/CyberMain.png","runtime":"Laya.runtime.ViewBase","height":2436,"anchorY":0.5,"anchorX":0.5},
"nodeParent":-1,
"label":"View",
@@ -548,14 +548,13 @@
"props":{"width":1,"left":0,"height":1,"bottom":0},
"nodeParent":1,
"label":"Box",
"isOpen":true,
"isOpen":false,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":85,
"child":[
{
"x":30,
"type":"Box",
"props":{"y":-175,"x":100,"width":160,"var":"btnGithub","runtime":"Laya.runtime.ScaleButton","name":"btnGithub","height":160,"anchorY":0.5,"anchorX":0.5},
"nodeParent":85,
@@ -580,7 +579,6 @@
}]
},
{
"x":30,
"type":"Box",
"props":{"y":-355,"x":100,"width":160,"var":"btnDiscord","runtime":"Laya.runtime.ScaleButton","name":"btnDiscord","height":160,"anchorY":0.5,"anchorX":0.5},
"nodeParent":85,
@@ -611,14 +609,13 @@
"props":{"right":0,"bottom":0},
"nodeParent":1,
"label":"Box",
"isOpen":true,
"isOpen":false,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":88,
"child":[
{
"x":30,
"type":"Box",
"props":{"y":-300,"x":-100,"width":110,"runtime":"Laya.runtime.ScaleButton","height":110,"anchorY":0.5,"anchorX":0.5},
"nodeParent":88,
@@ -630,7 +627,6 @@
"compId":90,
"child":[
{
"x":45,
"type":"Box",
"props":{"width":110,"var":"btnSaveLoad","runtime":"Laya.runtime.ColorfulBox","name":"btnSmall","height":110,"centerY":0,"centerX":0,"anchorY":0.5,"anchorX":0.5},
"nodeParent":90,
@@ -642,7 +638,6 @@
"compId":91,
"child":[
{
"x":60,
"type":"Image",
"props":{"width":80,"skin":"images/icons/icon_save.png","height":80,"centerY":0,"centerX":0},
"nodeParent":91,
@@ -657,7 +652,6 @@
}]
},
{
"x":30,
"type":"Box",
"props":{"y":-175,"x":-100,"width":110,"runtime":"Laya.runtime.ScaleButton","height":110,"anchorY":0.5,"anchorX":0.5},
"nodeParent":88,
@@ -669,7 +663,6 @@
"compId":89,
"child":[
{
"x":45,
"type":"Box",
"props":{"width":110,"var":"btnThemes","runtime":"Laya.runtime.ColorfulBox","name":"btnThemes","height":110,"centerY":0,"centerX":0,"anchorY":0.5,"anchorX":0.5},
"nodeParent":89,
@@ -694,6 +687,32 @@
}]
}]
}]
},
{
"x":15,
"type":"Box",
"props":{"x":572,"var":"banner","centerX":0,"bottom":100,"anchorY":1,"anchorX":0.5},
"nodeParent":1,
"label":"Box(banner)",
"isOpen":true,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":93,
"child":[
{
"x":30,
"type":"Label",
"props":{"text":"UI_Banner","fontSize":40,"font":"方正像素12","color":"#00fffd"},
"nodeParent":93,
"label":"Label",
"isDirectory":false,
"isAniNode":true,
"hasChild":false,
"compId":94,
"child":[
]
}]
}],
"animations":[
{

View File

@@ -0,0 +1,128 @@
{
"x":0,
"type":"View",
"selectedBox":1,
"selecteID":8,
"props":{"width":1125,"sceneColor":"#000000","height":2436},
"nodeParent":-1,
"label":"View",
"isOpen":true,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":1,
"child":[
{
"x":15,
"type":"Box",
"props":{"y":10,"x":10,"width":600,"var":"btnCustom","runtime":"Laya.runtime.ScaleButton","name":"btn","height":400,"centerY":-400,"centerX":0},
"nodeParent":1,
"label":"Box(btnCustom)",
"isOpen":true,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":2,
"child":[
{
"x":30,
"type":"Image",
"props":{"top":-15,"skin":"images/border/achievement_complete@3x.png","right":-15,"left":-15,"bottom":-15},
"nodeParent":2,
"label":"Image",
"isDirectory":false,
"isAniNode":true,
"hasChild":false,
"compId":10,
"child":[
]
},
{
"x":30,
"type":"Label",
"props":{"top":50,"text":"UI_CustomMode","fontSize":80,"font":"方正像素12","color":"#ffffff","centerX":0,"bold":true},
"nodeParent":2,
"label":"Label",
"isDirectory":false,
"isAniNode":true,
"hasChild":false,
"compId":4,
"child":[
]
},
{
"x":30,
"type":"Label",
"props":{"top":200,"text":"UI_CustomModeDescription","right":0,"left":0,"leading":20,"fontSize":40,"font":"方正像素12","color":"#bcbcbc","bottom":0,"align":"center"},
"nodeParent":2,
"label":"Label",
"isDirectory":false,
"isAniNode":true,
"hasChild":false,
"compId":5,
"child":[
]
}]
},
{
"x":15,
"type":"Box",
"props":{"y":10,"x":20,"width":600,"var":"btnCelebrity","runtime":"Laya.runtime.ScaleButton","name":"btn","height":400,"centerY":400,"centerX":0},
"nodeParent":1,
"label":"Box(btnCelebrity)",
"isOpen":true,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":3,
"child":[
{
"x":30,
"type":"Image",
"props":{"y":-15,"x":-15,"top":-15,"skin":"images/border/achievement_complete@3x.png","right":-15,"left":-15,"bottom":-15},
"nodeParent":3,
"label":"Image",
"isDirectory":false,
"isAniNode":true,
"hasChild":false,
"compId":11,
"child":[
]
},
{
"x":30,
"type":"Label",
"props":{"top":50,"text":"UI_CelebrityMode","fontSize":80,"font":"方正像素12","color":"#ffffff","centerX":0,"bold":true},
"nodeParent":3,
"label":"Label",
"isDirectory":false,
"isAniNode":true,
"hasChild":false,
"compId":7,
"child":[
]
},
{
"x":30,
"type":"Label",
"props":{"top":200,"text":"UI_CelebrityModeDescription","right":0,"left":0,"leading":20,"fontSize":40,"font":"方正像素12","color":"#bcbcbc","bottom":0,"align":"center"},
"nodeParent":3,
"label":"Label",
"isDirectory":false,
"isAniNode":true,
"hasChild":false,
"compId":8,
"child":[
]
}]
}],
"animations":[
{
"nodes":[
],
"name":"ani1",
"id":1,
"frameRate":24,
"action":0
}]
}

View File

@@ -0,0 +1,306 @@
{
"x":0,
"type":"View",
"selectedBox":1,
"selecteID":28,
"props":{"width":1125,"sceneColor":"#000000","height":2436},
"nodeParent":-1,
"label":"View",
"isOpen":true,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":1,
"child":[
{
"x":15,
"type":"Label",
"props":{"y":80,"text":"UI_Title_Celebrity","name":"title","fontSize":80,"font":"SimHei","color":"#ffffff","centerX":0},
"nodeParent":1,
"label":"Label(title)",
"isDirectory":false,
"isAniNode":true,
"hasChild":false,
"compId":19,
"child":[
]
},
{
"x":15,
"type":"Panel",
"props":{"var":"panelCharacter","vScrollBarSkin":" ","top":200,"right":0,"name":"panelCharacter","left":0,"bottom":700},
"nodeParent":1,
"label":"Panel(panelCharacter)",
"isOpen":true,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":2,
"child":[
{
"x":30,
"type":"VBox",
"props":{"y":10,"width":1000,"var":"vboxCharacter","space":20,"name":"vboxCharacter","centerX":0},
"nodeParent":2,
"label":"VBox(vboxCharacter)",
"isOpen":true,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":8,
"child":[
{
"x":45,
"type":"Box",
"props":{"right":0,"name":"boxCharacter","left":0},
"nodeParent":8,
"label":"Box(boxCharacter)",
"isOpen":false,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":10,
"child":[
{
"type":"Box",
"props":{"y":0,"runtime":"Laya.runtime.ColorfulBox","right":0,"name":"boxName","left":0,"height":100},
"nodeParent":10,
"label":"Box(boxName)",
"isOpen":false,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":12,
"child":[
{
"type":"Label",
"props":{"valign":"middle","text":"颜值10 智力10 体质10 家境Π","name":"label","fontSize":55,"font":"SimHei","color":"#ffffff","centerY":0,"centerX":0,"align":"center"},
"nodeParent":12,
"label":"Label(label)",
"isDirectory":false,
"isAniNode":true,
"hasChild":false,
"compId":18,
"child":[
]
}]
},
{
"type":"VBox",
"props":{"top":100,"space":20,"runtime":"Laya.runtime.ColorfulBox","right":25,"name":"vboxStates","left":25},
"nodeParent":10,
"label":"VBox(vboxStates)",
"isOpen":true,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":11,
"child":[
{
"type":"Label",
"props":{"valign":"middle","text":"颜值10 智力10 体质10 家境Π","name":"label","height":100,"fontSize":55,"font":"SimHei","color":"#ffffff","centerX":0,"align":"center"},
"nodeParent":11,
"label":"Label(label)",
"isDirectory":false,
"isAniNode":true,
"hasChild":false,
"compId":14,
"child":[
]
}]
}]
},
{
"x":45,
"type":"Box",
"props":{"runtime":"Laya.runtime.ColorfulBox","right":25,"name":"boxTalent","left":25,"height":100},
"nodeParent":8,
"label":"Box(boxTalent)",
"isOpen":false,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":15,
"child":[
{
"type":"Label",
"props":{"valign":"middle","text":"颜值10 智力10 体质10 家境Π","name":"label","fontSize":50,"font":"SimHei","color":"#ffffff","centerY":0,"centerX":0,"align":"center"},
"nodeParent":15,
"label":"Label(label)",
"isDirectory":false,
"isAniNode":true,
"hasChild":false,
"compId":17,
"child":[
]
}]
},
{
"x":45,
"type":"Box",
"props":{"y":10,"x":10,"right":0,"name":"boxUniqueUnGenerate","left":0},
"nodeParent":8,
"label":"Box(boxUniqueUnGenerate)",
"isOpen":true,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":20,
"child":[
{
"x":60,
"type":"Box",
"props":{"y":0,"runtime":"Laya.runtime.ColorfulBox","right":0,"name":"boxName","left":0,"height":100},
"nodeParent":20,
"label":"Box(boxName)",
"isOpen":true,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":21,
"child":[
{
"x":75,
"type":"Label",
"props":{"valign":"middle","text":"UI_UniqueWaTaShi","name":"label","fontSize":55,"font":"SimHei","color":"#ffffff","centerY":0,"centerX":0,"align":"center"},
"nodeParent":21,
"label":"Label(label)",
"isDirectory":false,
"isAniNode":true,
"hasChild":false,
"compId":22,
"child":[
]
}]
},
{
"x":60,
"type":"VBox",
"props":{"top":100,"space":20,"runtime":"Laya.runtime.ColorfulBox","right":25,"name":"vboxStates","left":25},
"nodeParent":20,
"label":"VBox(vboxStates)",
"isOpen":true,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":23,
"child":[
{
"x":75,
"type":"Label",
"props":{"y":1,"valign":"middle","text":"UI_UniqueWaTaShiContent","right":0,"name":"label","left":0,"leading":30,"fontSize":55,"font":"SimHei","color":"#ffffff","align":"center"},
"nodeParent":23,
"label":"Label(label)",
"isOpen":true,
"isDirectory":false,
"isAniNode":true,
"hasChild":false,
"compId":24,
"child":[
]
},
{
"x":75,
"type":"Box",
"props":{"y":2,"right":0,"name":"boxBtn","left":0,"height":150},
"nodeParent":23,
"label":"Box(boxBtn)",
"isOpen":true,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":25,
"child":[
{
"x":90,
"type":"Box",
"props":{"runtime":"Laya.runtime.ColorfulBox","right":50,"name":"btn","left":50,"height":120,"centerY":0},
"nodeParent":25,
"label":"Box(btn)",
"isOpen":true,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":26,
"child":[
{
"x":105,
"type":"Label",
"props":{"y":30,"x":290,"text":"UI_GenerateNow","name":"label","fontSize":60,"font":"SimHei","color":"#ffffff","centerY":0,"centerX":0},
"nodeParent":26,
"label":"Label(label)",
"isDirectory":false,
"isAniNode":true,
"hasChild":false,
"compId":27,
"child":[
]
}]
}]
}]
}]
}]
}]
},
{
"x":15,
"type":"Box",
"props":{"width":480,"var":"btnRetry","runtime":"Laya.runtime.ColorfulBox","name":"btnRetry","height":150,"centerX":0,"bottom":400},
"nodeParent":1,
"label":"Box(btnRetry)",
"isOpen":true,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":4,
"child":[
{
"x":30,
"type":"Label",
"props":{"text":"UI_AllNot","name":"label","fontSize":60,"font":"SimHei","color":"#ffffff","centerY":0,"centerX":0},
"nodeParent":4,
"label":"Label(label)",
"isDirectory":false,
"isAniNode":true,
"hasChild":false,
"compId":5,
"child":[
]
}]
},
{
"x":15,
"type":"Box",
"props":{"width":480,"var":"btnNext","runtime":"Laya.runtime.ColorfulBox","name":"btnNext","height":150,"centerX":0,"bottom":150},
"nodeParent":1,
"label":"Box(btnNext)",
"isOpen":true,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":6,
"child":[
{
"x":30,
"type":"Label",
"props":{"text":"UI_Make_New_Life","name":"label","fontSize":60,"font":"SimHei","color":"#ffffff","centerY":0,"centerX":0},
"nodeParent":6,
"label":"Label(label)",
"isDirectory":false,
"isAniNode":true,
"hasChild":false,
"compId":7,
"child":[
]
}]
}],
"animations":[
{
"nodes":[
],
"name":"ani1",
"id":1,
"frameRate":24,
"action":0
}]
}

View File

@@ -1,8 +1,8 @@
{
"x":0,
"type":"View",
"selectedBox":99,
"selecteID":100,
"selectedBox":101,
"selecteID":102,
"props":{"y":1218,"x":562,"width":1125,"sceneColor":"#000000","runtime":"Laya.runtime.ViewBase","height":2436,"anchorY":0.5,"anchorX":0.5},
"nodeParent":-1,
"label":"View",
@@ -276,6 +276,32 @@
"child":[
]
}]
},
{
"x":15,
"type":"Box",
"props":{"x":562,"var":"banner","centerX":0,"bottom":100,"anchorY":1,"anchorX":0.5},
"nodeParent":1,
"label":"Box(banner)",
"isOpen":true,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":101,
"child":[
{
"x":30,
"type":"Label",
"props":{"text":"UI_Banner","name":"title","fontSize":40,"font":"SimHei","color":"#ffffff"},
"nodeParent":101,
"label":"Label(title)",
"isDirectory":false,
"isAniNode":true,
"hasChild":false,
"compId":102,
"child":[
]
}]
}],
"animations":[
{

View File

@@ -0,0 +1,128 @@
{
"x":0,
"type":"View",
"selectedBox":1,
"selecteID":11,
"props":{"width":1125,"sceneColor":"#000000","height":2436},
"nodeParent":-1,
"label":"View",
"isOpen":true,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":1,
"child":[
{
"x":15,
"type":"Box",
"props":{"width":600,"var":"btnCustom","runtime":"Laya.runtime.ColorfulBox","name":"btn","height":400,"centerY":-400,"centerX":0},
"nodeParent":1,
"label":"Box(btnCustom)",
"isOpen":true,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":2,
"child":[
{
"x":30,
"type":"Label",
"props":{"top":50,"text":"UI_CustomMode","name":"font_default","fontSize":80,"font":"SimHei","color":"#ffffff","centerX":0,"bold":true},
"nodeParent":2,
"label":"Label(font_default)",
"isDirectory":false,
"isAniNode":true,
"hasChild":false,
"compId":4,
"child":[
]
},
{
"x":30,
"type":"Label",
"props":{"top":200,"text":"UI_CustomModeDescription","right":0,"name":"font_default","left":0,"leading":20,"fontSize":40,"font":"SimHei","color":"#ffffff","bottom":0,"align":"center"},
"nodeParent":2,
"label":"Label(font_default)",
"isDirectory":false,
"isAniNode":true,
"hasChild":false,
"compId":5,
"child":[
]
},
{
"x":30,
"type":"Label",
"props":{"runtime":"Laya.runtime.ColorAgentLabel","name":"label"},
"nodeParent":2,
"label":"Label(label)",
"isDirectory":false,
"isAniNode":true,
"hasChild":false,
"compId":10,
"child":[
]
}]
},
{
"x":15,
"type":"Box",
"props":{"x":10,"width":600,"var":"btnCelebrity","runtime":"Laya.runtime.ColorfulBox","name":"btn","height":400,"centerY":400,"centerX":0},
"nodeParent":1,
"label":"Box(btnCelebrity)",
"isOpen":true,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":3,
"child":[
{
"x":30,
"type":"Label",
"props":{"top":50,"text":"UI_CelebrityMode","name":"font_default","fontSize":80,"font":"SimHei","color":"#ffffff","centerX":0,"bold":true},
"nodeParent":3,
"label":"Label(font_default)",
"isDirectory":false,
"isAniNode":true,
"hasChild":false,
"compId":8,
"child":[
]
},
{
"x":30,
"type":"Label",
"props":{"top":200,"text":"UI_CelebrityModeDescription","right":0,"name":"font_default","left":0,"leading":20,"fontSize":40,"font":"SimHei","color":"#ffffff","bottom":0,"align":"center"},
"nodeParent":3,
"label":"Label(font_default)",
"isDirectory":false,
"isAniNode":true,
"hasChild":false,
"compId":9,
"child":[
]
},
{
"x":30,
"type":"Label",
"props":{"y":10,"x":10,"runtime":"Laya.runtime.ColorAgentLabel","name":"label"},
"nodeParent":3,
"label":"Label(label)",
"isDirectory":false,
"isAniNode":true,
"hasChild":false,
"compId":11,
"child":[
]
}]
}],
"animations":[
{
"nodes":[
],
"name":"ani1",
"id":1,
"frameRate":24,
"action":0
}]
}

View File

@@ -2,7 +2,7 @@
"x":0,
"type":"View",
"selectedBox":1,
"selecteID":153,
"selecteID":95,
"props":{"width":1125,"sceneColor":"#000000","runtime":"Laya.runtime.ViewBase","height":2436},
"nodeParent":-1,
"label":"View",

View File

@@ -2,8 +2,8 @@
"x":0,
"type":"Dialog",
"selectedBox":1,
"selecteID":15,
"props":{"width":645,"sceneColor":"#000000","height":250},
"selecteID":25,
"props":{"width":645,"sceneColor":"#000000","height":400},
"nodeParent":-1,
"label":"Dialog",
"isOpen":true,
@@ -15,17 +15,16 @@
{
"x":15,
"type":"Box",
"props":{"top":0,"right":0,"left":0,"bottom":150},
"props":{"top":0,"right":0,"left":0,"bottom":300},
"nodeParent":1,
"label":"Box",
"isOpen":true,
"isOpen":false,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":15,
"child":[
{
"x":30,
"type":"Box",
"props":{"y":0,"x":0,"width":645,"height":2},
"nodeParent":15,
@@ -50,7 +49,6 @@
}]
},
{
"x":30,
"type":"Box",
"props":{"width":645,"height":2,"centerX":0,"bottom":0},
"nodeParent":15,
@@ -75,7 +73,6 @@
}]
},
{
"x":30,
"type":"Box",
"props":{"width":645,"height":100,"centerY":0,"centerX":0,"alpha":0.2},
"nodeParent":15,
@@ -87,7 +84,6 @@
"compId":22,
"child":[
{
"x":45,
"type":"Rect",
"props":{"width":645,"lineWidth":1,"height":100,"fillColor":"#000000"},
"nodeParent":22,
@@ -104,7 +100,7 @@
{
"x":15,
"type":"TextInput",
"props":{"wordWrap":false,"var":"input","valign":"middle","top":0,"text":"content","right":0,"overflow":"scroll","left":0,"fontSize":35,"font":"SimHei","color":"#ffffff","bottom":150},
"props":{"wordWrap":false,"var":"input","valign":"middle","top":0,"text":"content","right":0,"overflow":"scroll","left":0,"fontSize":35,"font":"SimHei","color":"#ffffff","bottom":300},
"nodeParent":1,
"label":"TextInput(input)",
"isDirectory":false,
@@ -117,7 +113,7 @@
{
"x":15,
"type":"Box",
"props":{"width":120,"var":"btnSave","runtime":"Laya.runtime.ColorfulBox","name":"btnSmall","left":5,"height":120,"bottom":5,"anchorY":0.5,"anchorX":0.5},
"props":{"width":120,"var":"btnSave","runtime":"Laya.runtime.ColorfulBox","name":"btnSmall","left":5,"height":120,"bottom":155,"anchorY":0.5,"anchorX":0.5},
"nodeParent":1,
"label":"Box(btnSave)",
"isOpen":false,
@@ -142,7 +138,7 @@
{
"x":15,
"type":"Box",
"props":{"width":120,"var":"btnLoad","runtime":"Laya.runtime.ColorfulBox","name":"btnSmall","left":130,"height":120,"bottom":5,"anchorY":0.5,"anchorX":0.5},
"props":{"width":120,"var":"btnLoad","runtime":"Laya.runtime.ColorfulBox","name":"btnSmall","left":130,"height":120,"bottom":155,"anchorY":0.5,"anchorX":0.5},
"nodeParent":1,
"label":"Box(btnLoad)",
"isOpen":false,
@@ -167,7 +163,7 @@
{
"x":15,
"type":"Box",
"props":{"y":335,"width":120,"var":"btnRead","runtime":"Laya.runtime.ColorfulBox","name":"btnSmall","left":260,"height":120,"bottom":5,"anchorY":0.5,"anchorX":0.5},
"props":{"width":120,"var":"btnRead","runtime":"Laya.runtime.ColorfulBox","name":"btnSmall","left":260,"height":120,"bottom":155,"anchorY":0.5,"anchorX":0.5},
"nodeParent":1,
"label":"Box(btnRead)",
"isOpen":false,
@@ -192,7 +188,7 @@
{
"x":15,
"type":"Box",
"props":{"y":335,"width":120,"var":"btnWrite","runtime":"Laya.runtime.ColorfulBox","name":"btnSmall","left":390,"height":120,"bottom":5,"anchorY":0.5,"anchorX":0.5},
"props":{"width":120,"var":"btnWrite","runtime":"Laya.runtime.ColorfulBox","name":"btnSmall","left":390,"height":120,"bottom":155,"anchorY":0.5,"anchorX":0.5},
"nodeParent":1,
"label":"Box(btnWrite)",
"isOpen":false,
@@ -217,7 +213,7 @@
{
"x":15,
"type":"Box",
"props":{"y":10,"x":10,"width":120,"var":"btnClose","runtime":"Laya.runtime.ColorfulBox","right":5,"name":"btnSmall","height":120,"bottom":5,"anchorY":0.5,"anchorX":0.5},
"props":{"x":10,"width":120,"var":"btnClose","runtime":"Laya.runtime.ColorfulBox","right":5,"name":"btnSmall","height":120,"bottom":155,"anchorY":0.5,"anchorX":0.5},
"nodeParent":1,
"label":"Box(btnClose)",
"isOpen":false,
@@ -238,6 +234,32 @@
"child":[
]
}]
},
{
"x":15,
"type":"Box",
"props":{"y":20,"var":"btnBackup","runtime":"Laya.runtime.ColorfulBox","right":5,"name":"btnBackup","left":5,"height":120,"bottom":5,"anchorY":0.5,"anchorX":0.5},
"nodeParent":1,
"label":"Box(btnBackup)",
"isOpen":true,
"isDirectory":true,
"isAniNode":true,
"hasChild":true,
"compId":25,
"child":[
{
"x":30,
"type":"Label",
"props":{"text":"UI_BackupBtn","name":"label","fontSize":50,"font":"SimHei","color":"#ffffff","centerY":0,"centerX":0,"bold":true,"anchorY":0.5,"anchorX":0.5},
"nodeParent":25,
"label":"Label(label)",
"isDirectory":false,
"isAniNode":true,
"hasChild":false,
"compId":26,
"child":[
]
}]
}],
"animations":[
{

View File

@@ -1,24 +1,19 @@
{
"name": "life_restart",
"type": "module",
"bin": "repl/index.js",
"version": "2.0.0",
"main": "repl/index.js",
"version": "2.1.0",
"author": "Vick Scarlet <vick@syaro.io>",
"scripts": {
"test": "node test",
"xlsxTransform": "vt transform data",
"xlsx2json": "vt transform jobs/xlsx2json/config.json",
"dev": "webpack serve --open /view/index.html",
"build": "webpack --mode production"
"xlsx2json": "vt transform -d public \"data/**/*.xlsx\"",
"dev": "vite",
"build": "vite build",
"start": "vite preview",
"test": "vitest"
},
"devDependencies": {
"@babel/core": "^7.15.4",
"@babel/preset-env": "^7.15.4",
"babel-loader": "^8.2.2",
"core-js": "^3.17.2",
"html-webpack-plugin": "^5.5.0",
"v-transform": "^1.0.2",
"webpack": "^5.64.4",
"webpack-cli": "^4.8.0",
"webpack-dev-server": "^4.1.0"
"v-transform": "^2.2.0",
"vite": "^7.3.1",
"vitest": "^4.0.18"
}
}

987
pnpm-lock.yaml generated Normal file
View File

@@ -0,0 +1,987 @@
lockfileVersion: '9.0'
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
importers:
.:
devDependencies:
v-transform:
specifier: ^2.2.0
version: 2.2.0
vite:
specifier: ^7.3.1
version: 7.3.1
vitest:
specifier: ^4.0.18
version: 4.0.18
packages:
'@esbuild/aix-ppc64@0.27.2':
resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
'@esbuild/android-arm64@0.27.2':
resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
'@esbuild/android-arm@0.27.2':
resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==}
engines: {node: '>=18'}
cpu: [arm]
os: [android]
'@esbuild/android-x64@0.27.2':
resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==}
engines: {node: '>=18'}
cpu: [x64]
os: [android]
'@esbuild/darwin-arm64@0.27.2':
resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
'@esbuild/darwin-x64@0.27.2':
resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==}
engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
'@esbuild/freebsd-arm64@0.27.2':
resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
'@esbuild/freebsd-x64@0.27.2':
resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==}
engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
'@esbuild/linux-arm64@0.27.2':
resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
'@esbuild/linux-arm@0.27.2':
resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==}
engines: {node: '>=18'}
cpu: [arm]
os: [linux]
'@esbuild/linux-ia32@0.27.2':
resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==}
engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
'@esbuild/linux-loong64@0.27.2':
resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==}
engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
'@esbuild/linux-mips64el@0.27.2':
resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==}
engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
'@esbuild/linux-ppc64@0.27.2':
resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
'@esbuild/linux-riscv64@0.27.2':
resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==}
engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
'@esbuild/linux-s390x@0.27.2':
resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==}
engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
'@esbuild/linux-x64@0.27.2':
resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==}
engines: {node: '>=18'}
cpu: [x64]
os: [linux]
'@esbuild/netbsd-arm64@0.27.2':
resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [netbsd]
'@esbuild/netbsd-x64@0.27.2':
resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==}
engines: {node: '>=18'}
cpu: [x64]
os: [netbsd]
'@esbuild/openbsd-arm64@0.27.2':
resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openbsd]
'@esbuild/openbsd-x64@0.27.2':
resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==}
engines: {node: '>=18'}
cpu: [x64]
os: [openbsd]
'@esbuild/openharmony-arm64@0.27.2':
resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openharmony]
'@esbuild/sunos-x64@0.27.2':
resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==}
engines: {node: '>=18'}
cpu: [x64]
os: [sunos]
'@esbuild/win32-arm64@0.27.2':
resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
'@esbuild/win32-ia32@0.27.2':
resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==}
engines: {node: '>=18'}
cpu: [ia32]
os: [win32]
'@esbuild/win32-x64@0.27.2':
resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [win32]
'@isaacs/balanced-match@4.0.1':
resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==}
engines: {node: 20 || >=22}
'@isaacs/brace-expansion@5.0.0':
resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==}
engines: {node: 20 || >=22}
'@jridgewell/sourcemap-codec@1.5.5':
resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
'@rollup/rollup-android-arm-eabi@4.56.0':
resolution: {integrity: sha512-LNKIPA5k8PF1+jAFomGe3qN3bbIgJe/IlpDBwuVjrDKrJhVWywgnJvflMt/zkbVNLFtF1+94SljYQS6e99klnw==}
cpu: [arm]
os: [android]
'@rollup/rollup-android-arm64@4.56.0':
resolution: {integrity: sha512-lfbVUbelYqXlYiU/HApNMJzT1E87UPGvzveGg2h0ktUNlOCxKlWuJ9jtfvs1sKHdwU4fzY7Pl8sAl49/XaEk6Q==}
cpu: [arm64]
os: [android]
'@rollup/rollup-darwin-arm64@4.56.0':
resolution: {integrity: sha512-EgxD1ocWfhoD6xSOeEEwyE7tDvwTgZc8Bss7wCWe+uc7wO8G34HHCUH+Q6cHqJubxIAnQzAsyUsClt0yFLu06w==}
cpu: [arm64]
os: [darwin]
'@rollup/rollup-darwin-x64@4.56.0':
resolution: {integrity: sha512-1vXe1vcMOssb/hOF8iv52A7feWW2xnu+c8BV4t1F//m9QVLTfNVpEdja5ia762j/UEJe2Z1jAmEqZAK42tVW3g==}
cpu: [x64]
os: [darwin]
'@rollup/rollup-freebsd-arm64@4.56.0':
resolution: {integrity: sha512-bof7fbIlvqsyv/DtaXSck4VYQ9lPtoWNFCB/JY4snlFuJREXfZnm+Ej6yaCHfQvofJDXLDMTVxWscVSuQvVWUQ==}
cpu: [arm64]
os: [freebsd]
'@rollup/rollup-freebsd-x64@4.56.0':
resolution: {integrity: sha512-KNa6lYHloW+7lTEkYGa37fpvPq+NKG/EHKM8+G/g9WDU7ls4sMqbVRV78J6LdNuVaeeK5WB9/9VAFbKxcbXKYg==}
cpu: [x64]
os: [freebsd]
'@rollup/rollup-linux-arm-gnueabihf@4.56.0':
resolution: {integrity: sha512-E8jKK87uOvLrrLN28jnAAAChNq5LeCd2mGgZF+fGF5D507WlG/Noct3lP/QzQ6MrqJ5BCKNwI9ipADB6jyiq2A==}
cpu: [arm]
os: [linux]
'@rollup/rollup-linux-arm-musleabihf@4.56.0':
resolution: {integrity: sha512-jQosa5FMYF5Z6prEpTCCmzCXz6eKr/tCBssSmQGEeozA9tkRUty/5Vx06ibaOP9RCrW1Pvb8yp3gvZhHwTDsJw==}
cpu: [arm]
os: [linux]
'@rollup/rollup-linux-arm64-gnu@4.56.0':
resolution: {integrity: sha512-uQVoKkrC1KGEV6udrdVahASIsaF8h7iLG0U0W+Xn14ucFwi6uS539PsAr24IEF9/FoDtzMeeJXJIBo5RkbNWvQ==}
cpu: [arm64]
os: [linux]
'@rollup/rollup-linux-arm64-musl@4.56.0':
resolution: {integrity: sha512-vLZ1yJKLxhQLFKTs42RwTwa6zkGln+bnXc8ueFGMYmBTLfNu58sl5/eXyxRa2RarTkJbXl8TKPgfS6V5ijNqEA==}
cpu: [arm64]
os: [linux]
'@rollup/rollup-linux-loong64-gnu@4.56.0':
resolution: {integrity: sha512-FWfHOCub564kSE3xJQLLIC/hbKqHSVxy8vY75/YHHzWvbJL7aYJkdgwD/xGfUlL5UV2SB7otapLrcCj2xnF1dg==}
cpu: [loong64]
os: [linux]
'@rollup/rollup-linux-loong64-musl@4.56.0':
resolution: {integrity: sha512-z1EkujxIh7nbrKL1lmIpqFTc/sr0u8Uk0zK/qIEFldbt6EDKWFk/pxFq3gYj4Bjn3aa9eEhYRlL3H8ZbPT1xvA==}
cpu: [loong64]
os: [linux]
'@rollup/rollup-linux-ppc64-gnu@4.56.0':
resolution: {integrity: sha512-iNFTluqgdoQC7AIE8Q34R3AuPrJGJirj5wMUErxj22deOcY7XwZRaqYmB6ZKFHoVGqRcRd0mqO+845jAibKCkw==}
cpu: [ppc64]
os: [linux]
'@rollup/rollup-linux-ppc64-musl@4.56.0':
resolution: {integrity: sha512-MtMeFVlD2LIKjp2sE2xM2slq3Zxf9zwVuw0jemsxvh1QOpHSsSzfNOTH9uYW9i1MXFxUSMmLpeVeUzoNOKBaWg==}
cpu: [ppc64]
os: [linux]
'@rollup/rollup-linux-riscv64-gnu@4.56.0':
resolution: {integrity: sha512-in+v6wiHdzzVhYKXIk5U74dEZHdKN9KH0Q4ANHOTvyXPG41bajYRsy7a8TPKbYPl34hU7PP7hMVHRvv/5aCSew==}
cpu: [riscv64]
os: [linux]
'@rollup/rollup-linux-riscv64-musl@4.56.0':
resolution: {integrity: sha512-yni2raKHB8m9NQpI9fPVwN754mn6dHQSbDTwxdr9SE0ks38DTjLMMBjrwvB5+mXrX+C0npX0CVeCUcvvvD8CNQ==}
cpu: [riscv64]
os: [linux]
'@rollup/rollup-linux-s390x-gnu@4.56.0':
resolution: {integrity: sha512-zhLLJx9nQPu7wezbxt2ut+CI4YlXi68ndEve16tPc/iwoylWS9B3FxpLS2PkmfYgDQtosah07Mj9E0khc3Y+vQ==}
cpu: [s390x]
os: [linux]
'@rollup/rollup-linux-x64-gnu@4.56.0':
resolution: {integrity: sha512-MVC6UDp16ZSH7x4rtuJPAEoE1RwS8N4oK9DLHy3FTEdFoUTCFVzMfJl/BVJ330C+hx8FfprA5Wqx4FhZXkj2Kw==}
cpu: [x64]
os: [linux]
'@rollup/rollup-linux-x64-musl@4.56.0':
resolution: {integrity: sha512-ZhGH1eA4Qv0lxaV00azCIS1ChedK0V32952Md3FtnxSqZTBTd6tgil4nZT5cU8B+SIw3PFYkvyR4FKo2oyZIHA==}
cpu: [x64]
os: [linux]
'@rollup/rollup-openbsd-x64@4.56.0':
resolution: {integrity: sha512-O16XcmyDeFI9879pEcmtWvD/2nyxR9mF7Gs44lf1vGGx8Vg2DRNx11aVXBEqOQhWb92WN4z7fW/q4+2NYzCbBA==}
cpu: [x64]
os: [openbsd]
'@rollup/rollup-openharmony-arm64@4.56.0':
resolution: {integrity: sha512-LhN/Reh+7F3RCgQIRbgw8ZMwUwyqJM+8pXNT6IIJAqm2IdKkzpCh/V9EdgOMBKuebIrzswqy4ATlrDgiOwbRcQ==}
cpu: [arm64]
os: [openharmony]
'@rollup/rollup-win32-arm64-msvc@4.56.0':
resolution: {integrity: sha512-kbFsOObXp3LBULg1d3JIUQMa9Kv4UitDmpS+k0tinPBz3watcUiV2/LUDMMucA6pZO3WGE27P7DsfaN54l9ing==}
cpu: [arm64]
os: [win32]
'@rollup/rollup-win32-ia32-msvc@4.56.0':
resolution: {integrity: sha512-vSSgny54D6P4vf2izbtFm/TcWYedw7f8eBrOiGGecyHyQB9q4Kqentjaj8hToe+995nob/Wv48pDqL5a62EWtg==}
cpu: [ia32]
os: [win32]
'@rollup/rollup-win32-x64-gnu@4.56.0':
resolution: {integrity: sha512-FeCnkPCTHQJFbiGG49KjV5YGW/8b9rrXAM2Mz2kiIoktq2qsJxRD5giEMEOD2lPdgs72upzefaUvS+nc8E3UzQ==}
cpu: [x64]
os: [win32]
'@rollup/rollup-win32-x64-msvc@4.56.0':
resolution: {integrity: sha512-H8AE9Ur/t0+1VXujj90w0HrSOuv0Nq9r1vSZF2t5km20NTfosQsGGUXDaKdQZzwuLts7IyL1fYT4hM95TI9c4g==}
cpu: [x64]
os: [win32]
'@standard-schema/spec@1.1.0':
resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
'@types/chai@5.2.3':
resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==}
'@types/deep-eql@4.0.2':
resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==}
'@types/estree@1.0.8':
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
'@vitest/expect@4.0.18':
resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==}
'@vitest/mocker@4.0.18':
resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==}
peerDependencies:
msw: ^2.4.9
vite: ^6.0.0 || ^7.0.0-0
peerDependenciesMeta:
msw:
optional: true
vite:
optional: true
'@vitest/pretty-format@4.0.18':
resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==}
'@vitest/runner@4.0.18':
resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==}
'@vitest/snapshot@4.0.18':
resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==}
'@vitest/spy@4.0.18':
resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==}
'@vitest/utils@4.0.18':
resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==}
argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
assertion-error@2.0.1:
resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
engines: {node: '>=12'}
chai@6.2.2:
resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==}
engines: {node: '>=18'}
commander@14.0.2:
resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==}
engines: {node: '>=20'}
es-module-lexer@1.7.0:
resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
esbuild@0.27.2:
resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==}
engines: {node: '>=18'}
hasBin: true
estree-walker@3.0.3:
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
expect-type@1.3.0:
resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==}
engines: {node: '>=12.0.0'}
fdir@6.5.0:
resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
engines: {node: '>=12.0.0'}
peerDependencies:
picomatch: ^3 || ^4
peerDependenciesMeta:
picomatch:
optional: true
fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
glob@13.0.0:
resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==}
engines: {node: 20 || >=22}
js-yaml@4.1.1:
resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
hasBin: true
lru-cache@11.2.5:
resolution: {integrity: sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==}
engines: {node: 20 || >=22}
magic-string@0.30.21:
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
minimatch@10.1.1:
resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==}
engines: {node: 20 || >=22}
minipass@7.1.2:
resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
engines: {node: '>=16 || 14 >=14.17'}
nanoid@3.3.11:
resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
obug@2.1.1:
resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==}
path-scurry@2.0.1:
resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==}
engines: {node: 20 || >=22}
pathe@2.0.3:
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
picomatch@4.0.3:
resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
engines: {node: '>=12'}
postcss@8.5.6:
resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
engines: {node: ^10 || ^12 || >=14}
rollup@4.56.0:
resolution: {integrity: sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
siginfo@2.0.0:
resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
stackback@0.0.2:
resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
std-env@3.10.0:
resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==}
tinybench@2.9.0:
resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
tinyexec@1.0.2:
resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==}
engines: {node: '>=18'}
tinyglobby@0.2.15:
resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
engines: {node: '>=12.0.0'}
tinyrainbow@3.0.3:
resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==}
engines: {node: '>=14.0.0'}
v-transform@2.2.0:
resolution: {integrity: sha512-UwUlkx7HFNqk1hKHVe3InG1tYXZPDoqd9UJ9qB3cg7ROuGQr+XjiZnxkSyZaBBBQSf7Ewo9ATr7L2LKBAGo+0A==}
hasBin: true
vite@7.3.1:
resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
'@types/node': ^20.19.0 || >=22.12.0
jiti: '>=1.21.0'
less: ^4.0.0
lightningcss: ^1.21.0
sass: ^1.70.0
sass-embedded: ^1.70.0
stylus: '>=0.54.8'
sugarss: ^5.0.0
terser: ^5.16.0
tsx: ^4.8.1
yaml: ^2.4.2
peerDependenciesMeta:
'@types/node':
optional: true
jiti:
optional: true
less:
optional: true
lightningcss:
optional: true
sass:
optional: true
sass-embedded:
optional: true
stylus:
optional: true
sugarss:
optional: true
terser:
optional: true
tsx:
optional: true
yaml:
optional: true
vitest@4.0.18:
resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==}
engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0}
hasBin: true
peerDependencies:
'@edge-runtime/vm': '*'
'@opentelemetry/api': ^1.9.0
'@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0
'@vitest/browser-playwright': 4.0.18
'@vitest/browser-preview': 4.0.18
'@vitest/browser-webdriverio': 4.0.18
'@vitest/ui': 4.0.18
happy-dom: '*'
jsdom: '*'
peerDependenciesMeta:
'@edge-runtime/vm':
optional: true
'@opentelemetry/api':
optional: true
'@types/node':
optional: true
'@vitest/browser-playwright':
optional: true
'@vitest/browser-preview':
optional: true
'@vitest/browser-webdriverio':
optional: true
'@vitest/ui':
optional: true
happy-dom:
optional: true
jsdom:
optional: true
why-is-node-running@2.3.0:
resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
engines: {node: '>=8'}
hasBin: true
xlsx@https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz:
resolution: {tarball: https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz}
version: 0.20.3
engines: {node: '>=0.8'}
hasBin: true
snapshots:
'@esbuild/aix-ppc64@0.27.2':
optional: true
'@esbuild/android-arm64@0.27.2':
optional: true
'@esbuild/android-arm@0.27.2':
optional: true
'@esbuild/android-x64@0.27.2':
optional: true
'@esbuild/darwin-arm64@0.27.2':
optional: true
'@esbuild/darwin-x64@0.27.2':
optional: true
'@esbuild/freebsd-arm64@0.27.2':
optional: true
'@esbuild/freebsd-x64@0.27.2':
optional: true
'@esbuild/linux-arm64@0.27.2':
optional: true
'@esbuild/linux-arm@0.27.2':
optional: true
'@esbuild/linux-ia32@0.27.2':
optional: true
'@esbuild/linux-loong64@0.27.2':
optional: true
'@esbuild/linux-mips64el@0.27.2':
optional: true
'@esbuild/linux-ppc64@0.27.2':
optional: true
'@esbuild/linux-riscv64@0.27.2':
optional: true
'@esbuild/linux-s390x@0.27.2':
optional: true
'@esbuild/linux-x64@0.27.2':
optional: true
'@esbuild/netbsd-arm64@0.27.2':
optional: true
'@esbuild/netbsd-x64@0.27.2':
optional: true
'@esbuild/openbsd-arm64@0.27.2':
optional: true
'@esbuild/openbsd-x64@0.27.2':
optional: true
'@esbuild/openharmony-arm64@0.27.2':
optional: true
'@esbuild/sunos-x64@0.27.2':
optional: true
'@esbuild/win32-arm64@0.27.2':
optional: true
'@esbuild/win32-ia32@0.27.2':
optional: true
'@esbuild/win32-x64@0.27.2':
optional: true
'@isaacs/balanced-match@4.0.1': {}
'@isaacs/brace-expansion@5.0.0':
dependencies:
'@isaacs/balanced-match': 4.0.1
'@jridgewell/sourcemap-codec@1.5.5': {}
'@rollup/rollup-android-arm-eabi@4.56.0':
optional: true
'@rollup/rollup-android-arm64@4.56.0':
optional: true
'@rollup/rollup-darwin-arm64@4.56.0':
optional: true
'@rollup/rollup-darwin-x64@4.56.0':
optional: true
'@rollup/rollup-freebsd-arm64@4.56.0':
optional: true
'@rollup/rollup-freebsd-x64@4.56.0':
optional: true
'@rollup/rollup-linux-arm-gnueabihf@4.56.0':
optional: true
'@rollup/rollup-linux-arm-musleabihf@4.56.0':
optional: true
'@rollup/rollup-linux-arm64-gnu@4.56.0':
optional: true
'@rollup/rollup-linux-arm64-musl@4.56.0':
optional: true
'@rollup/rollup-linux-loong64-gnu@4.56.0':
optional: true
'@rollup/rollup-linux-loong64-musl@4.56.0':
optional: true
'@rollup/rollup-linux-ppc64-gnu@4.56.0':
optional: true
'@rollup/rollup-linux-ppc64-musl@4.56.0':
optional: true
'@rollup/rollup-linux-riscv64-gnu@4.56.0':
optional: true
'@rollup/rollup-linux-riscv64-musl@4.56.0':
optional: true
'@rollup/rollup-linux-s390x-gnu@4.56.0':
optional: true
'@rollup/rollup-linux-x64-gnu@4.56.0':
optional: true
'@rollup/rollup-linux-x64-musl@4.56.0':
optional: true
'@rollup/rollup-openbsd-x64@4.56.0':
optional: true
'@rollup/rollup-openharmony-arm64@4.56.0':
optional: true
'@rollup/rollup-win32-arm64-msvc@4.56.0':
optional: true
'@rollup/rollup-win32-ia32-msvc@4.56.0':
optional: true
'@rollup/rollup-win32-x64-gnu@4.56.0':
optional: true
'@rollup/rollup-win32-x64-msvc@4.56.0':
optional: true
'@standard-schema/spec@1.1.0': {}
'@types/chai@5.2.3':
dependencies:
'@types/deep-eql': 4.0.2
assertion-error: 2.0.1
'@types/deep-eql@4.0.2': {}
'@types/estree@1.0.8': {}
'@vitest/expect@4.0.18':
dependencies:
'@standard-schema/spec': 1.1.0
'@types/chai': 5.2.3
'@vitest/spy': 4.0.18
'@vitest/utils': 4.0.18
chai: 6.2.2
tinyrainbow: 3.0.3
'@vitest/mocker@4.0.18(vite@7.3.1)':
dependencies:
'@vitest/spy': 4.0.18
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
vite: 7.3.1
'@vitest/pretty-format@4.0.18':
dependencies:
tinyrainbow: 3.0.3
'@vitest/runner@4.0.18':
dependencies:
'@vitest/utils': 4.0.18
pathe: 2.0.3
'@vitest/snapshot@4.0.18':
dependencies:
'@vitest/pretty-format': 4.0.18
magic-string: 0.30.21
pathe: 2.0.3
'@vitest/spy@4.0.18': {}
'@vitest/utils@4.0.18':
dependencies:
'@vitest/pretty-format': 4.0.18
tinyrainbow: 3.0.3
argparse@2.0.1: {}
assertion-error@2.0.1: {}
chai@6.2.2: {}
commander@14.0.2: {}
es-module-lexer@1.7.0: {}
esbuild@0.27.2:
optionalDependencies:
'@esbuild/aix-ppc64': 0.27.2
'@esbuild/android-arm': 0.27.2
'@esbuild/android-arm64': 0.27.2
'@esbuild/android-x64': 0.27.2
'@esbuild/darwin-arm64': 0.27.2
'@esbuild/darwin-x64': 0.27.2
'@esbuild/freebsd-arm64': 0.27.2
'@esbuild/freebsd-x64': 0.27.2
'@esbuild/linux-arm': 0.27.2
'@esbuild/linux-arm64': 0.27.2
'@esbuild/linux-ia32': 0.27.2
'@esbuild/linux-loong64': 0.27.2
'@esbuild/linux-mips64el': 0.27.2
'@esbuild/linux-ppc64': 0.27.2
'@esbuild/linux-riscv64': 0.27.2
'@esbuild/linux-s390x': 0.27.2
'@esbuild/linux-x64': 0.27.2
'@esbuild/netbsd-arm64': 0.27.2
'@esbuild/netbsd-x64': 0.27.2
'@esbuild/openbsd-arm64': 0.27.2
'@esbuild/openbsd-x64': 0.27.2
'@esbuild/openharmony-arm64': 0.27.2
'@esbuild/sunos-x64': 0.27.2
'@esbuild/win32-arm64': 0.27.2
'@esbuild/win32-ia32': 0.27.2
'@esbuild/win32-x64': 0.27.2
estree-walker@3.0.3:
dependencies:
'@types/estree': 1.0.8
expect-type@1.3.0: {}
fdir@6.5.0(picomatch@4.0.3):
optionalDependencies:
picomatch: 4.0.3
fsevents@2.3.3:
optional: true
glob@13.0.0:
dependencies:
minimatch: 10.1.1
minipass: 7.1.2
path-scurry: 2.0.1
js-yaml@4.1.1:
dependencies:
argparse: 2.0.1
lru-cache@11.2.5: {}
magic-string@0.30.21:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
minimatch@10.1.1:
dependencies:
'@isaacs/brace-expansion': 5.0.0
minipass@7.1.2: {}
nanoid@3.3.11: {}
obug@2.1.1: {}
path-scurry@2.0.1:
dependencies:
lru-cache: 11.2.5
minipass: 7.1.2
pathe@2.0.3: {}
picocolors@1.1.1: {}
picomatch@4.0.3: {}
postcss@8.5.6:
dependencies:
nanoid: 3.3.11
picocolors: 1.1.1
source-map-js: 1.2.1
rollup@4.56.0:
dependencies:
'@types/estree': 1.0.8
optionalDependencies:
'@rollup/rollup-android-arm-eabi': 4.56.0
'@rollup/rollup-android-arm64': 4.56.0
'@rollup/rollup-darwin-arm64': 4.56.0
'@rollup/rollup-darwin-x64': 4.56.0
'@rollup/rollup-freebsd-arm64': 4.56.0
'@rollup/rollup-freebsd-x64': 4.56.0
'@rollup/rollup-linux-arm-gnueabihf': 4.56.0
'@rollup/rollup-linux-arm-musleabihf': 4.56.0
'@rollup/rollup-linux-arm64-gnu': 4.56.0
'@rollup/rollup-linux-arm64-musl': 4.56.0
'@rollup/rollup-linux-loong64-gnu': 4.56.0
'@rollup/rollup-linux-loong64-musl': 4.56.0
'@rollup/rollup-linux-ppc64-gnu': 4.56.0
'@rollup/rollup-linux-ppc64-musl': 4.56.0
'@rollup/rollup-linux-riscv64-gnu': 4.56.0
'@rollup/rollup-linux-riscv64-musl': 4.56.0
'@rollup/rollup-linux-s390x-gnu': 4.56.0
'@rollup/rollup-linux-x64-gnu': 4.56.0
'@rollup/rollup-linux-x64-musl': 4.56.0
'@rollup/rollup-openbsd-x64': 4.56.0
'@rollup/rollup-openharmony-arm64': 4.56.0
'@rollup/rollup-win32-arm64-msvc': 4.56.0
'@rollup/rollup-win32-ia32-msvc': 4.56.0
'@rollup/rollup-win32-x64-gnu': 4.56.0
'@rollup/rollup-win32-x64-msvc': 4.56.0
fsevents: 2.3.3
siginfo@2.0.0: {}
source-map-js@1.2.1: {}
stackback@0.0.2: {}
std-env@3.10.0: {}
tinybench@2.9.0: {}
tinyexec@1.0.2: {}
tinyglobby@0.2.15:
dependencies:
fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3
tinyrainbow@3.0.3: {}
v-transform@2.2.0:
dependencies:
commander: 14.0.2
glob: 13.0.0
js-yaml: 4.1.1
xlsx: https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz
vite@7.3.1:
dependencies:
esbuild: 0.27.2
fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3
postcss: 8.5.6
rollup: 4.56.0
tinyglobby: 0.2.15
optionalDependencies:
fsevents: 2.3.3
vitest@4.0.18:
dependencies:
'@vitest/expect': 4.0.18
'@vitest/mocker': 4.0.18(vite@7.3.1)
'@vitest/pretty-format': 4.0.18
'@vitest/runner': 4.0.18
'@vitest/snapshot': 4.0.18
'@vitest/spy': 4.0.18
'@vitest/utils': 4.0.18
es-module-lexer: 1.7.0
expect-type: 1.3.0
magic-string: 0.30.21
obug: 2.1.1
pathe: 2.0.3
picomatch: 4.0.3
std-env: 3.10.0
tinybench: 2.9.0
tinyexec: 1.0.2
tinyglobby: 0.2.15
tinyrainbow: 3.0.3
vite: 7.3.1
why-is-node-running: 2.3.0
transitivePeerDependencies:
- jiti
- less
- lightningcss
- msw
- sass
- sass-embedded
- stylus
- sugarss
- terser
- tsx
- yaml
why-is-node-running@2.3.0:
dependencies:
siginfo: 2.0.0
stackback: 0.0.2
xlsx@https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz: {}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,74 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
<meta name="description" content="やり直すんだ。そして、次はうまくやる。"/>
<meta name="keywords" content="人生重开模拟器 liferestart life restart remake 人生重来"/>
<meta name="renderer" content="webkit"/>
<meta name="apple-mobile-web-app-capable" content="yes"/>
<meta name="full-screen" content="true"/>
<meta name="x5-fullscreen" content="true"/>
<meta name="360-fullscreen" content="true"/>
<meta name="theme-color" content="#157878"/>
<meta name="laya" screenorientation ="landscape"/>
<meta http-equiv="expires" content="0"/>
<meta http-equiv="Cache-Control" content="no-siteapp"/>
<font-face font-family="方正像素12" src="fonts/方正像素12.ttf"/>
<title>Life Restart</title>
</head>
<body style="background:black">
<!--以下引用了常用类库,如果不使用,可以删除-->
<!--核心包,封装了显示对象渲染,事件,时间管理,时间轴动画,缓动,消息交互,socket本地存储鼠标触摸声音加载颜色滤镜位图字体等-->
<script type="text/javascript" src="libs/laya/laya.core.js"></script>
<!--提供了微信小游戏的适配-->
<!-- <script type="text/javascript" src="libs/laya/laya.wxmini.js"></script> -->
<!--提供了百度小游戏的适配-->
<!-- <script type="text/javascript" src="libs/laya/laya.bdmini.js"></script> -->
<!--提供了小米小游戏的适配-->
<!-- <script type="text/javascript" src="libs/laya/laya.xmmini.js"></script> -->
<!--提供了OPPO小游戏的适配-->
<!-- <script type="text/javascript" src="libs/laya/laya.quickgamemini.js"></script> -->
<!--提供了bilibili小游戏的适配-->
<!-- <script type="text/javascript" src="libs/laya/laya.bilimini.js"></script> -->
<!--提供了Alipay小游戏的适配-->
<!-- <script type="text/javascript" src="libs/laya/laya.Alipaymini.js"></script> -->
<!--提供了qq小游戏的适配-->
<!-- <script type="text/javascript" src="libs/laya/laya.qqmini.js"></script> -->
<!--提供了字节跳动小游戏的适配-->
<!-- <script type="text/javascript" src="libs/laya/laya.ttmini.js"></script> -->
<!--提供了华为快游戏的适配-->
<!-- <script type="text/javascript" src="libs/laya/laya.hwmini.js"></script> -->
<!--提供了淘宝商家应用的适配-->
<!-- <script type="text/javascript" src="libs/laya/laya.tbmini.js"></script> -->
<!--提供了淘宝小部件的适配-->
<!-- <script type="text/javascript" src="libs/laya/laya.tbplugin.js"></script> -->
<!--封装了webgl渲染管线如果使用webgl渲染可以在初始化时调用Laya.init(1000,800,laya.webgl.WebGL);-->
<script type="text/javascript" src="libs/laya/laya.webgl.js"></script>
<!--提供了VIVO小游戏的适配-->
<!-- <script type="text/javascript" src="libs/laya/laya.vvmini.js"></script> -->
<!--是动画模块包含了swf动画骨骼动画等-->
<!-- <script type="text/javascript" src="libs/laya/laya.ani.js"></script> -->
<!--包含更多webgl滤镜比如外发光阴影模糊以及更多-->
<script type="text/javascript" src="libs/laya/laya.filter.js"></script>
<!--封装了html动态排版功能-->
<!-- <script type="text/javascript" src="libs/laya/laya.html.js"></script> -->
<!--粒子类库-->
<script type="text/javascript" src="libs/laya/laya.particle.js"></script>
<!--提供tileMap解析支持-->
<!-- <script type="text/javascript" src="libs/laya/laya.tiledmap.js"></script> -->
<!--提供了制作UI的各种组件实现-->
<script type="text/javascript" src="libs/laya/laya.ui.js"></script>
<!-- 提供LayaAir3d接口 -->
<!-- <script type="text/javascript" src="libs/laya/laya.d3.js"></script> -->
<!-- 物理引擎matter.js -->
<!--自定义的js(src文件夹下)文件自动添加到下面jsfile模块标签里面里js的顺序可以手动修改修改后保留修改的顺序新增加的js会默认依次追加到标签里-->
<!--删除标签ide不会自动添加js文件请谨慎操作-->
<!--jsfile--startTag-->
<script type="module" src="../src/index.js"></script>
<!--jsfile--endTag-->
</body>
</html>

View File

@@ -1 +0,0 @@
<!doctype html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"><meta name="description" content="やり直すんだ。そして、次はうまくやる。"/><meta name="keywords" content="人生重开模拟器 liferestart life restart remake 人生重来"/><meta name="renderer" content="webkit"/><meta name="apple-mobile-web-app-capable" content="yes"/><meta name="full-screen" content="true"/><meta name="x5-fullscreen" content="true"/><meta name="360-fullscreen" content="true"/><meta name="theme-color" content="#157878"/><meta name="laya" screenorientation="landscape"/><meta http-equiv="expires" content="0"/><meta http-equiv="Cache-Control" content="no-siteapp"/><title>Life Restart</title><script src="libs/laya/min/laya.core.min.js"></script><script src="libs/laya/min/laya.webgl.min.js"></script><script src="libs/laya/min/laya.filter.min.js"></script><script src="libs/laya/min/laya.particle.min.js"></script><script src="libs/laya/min/laya.ui.min.js"></script><script defer="defer" src="chunk/main.a3242.js"></script></head><body style="background:black"></body></html>

File diff suppressed because it is too large Load Diff

View File

@@ -1,32 +1,44 @@
import App from './app.js';
import { readFile, writeFile } from 'fs/promises';
import { fileURLToPath } from 'url'
import { dirname } from 'path'
const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)
import App from './app.js'
import { readFile, writeFile } from 'fs/promises'
async function main() {
try {
globalThis.localStorage = JSON.parse(await readFile('__localStorage.json'));
globalThis.localStorage = JSON.parse(
await readFile(__dirname + '/__localStorage.json')
)
} catch (e) {
globalThis.localStorage = {};
globalThis.localStorage = {}
}
localStorage.getItem = key => localStorage[key]===void 0? null: localStorage[key];
localStorage.setItem = (key, value) => (localStorage[key] = value);
localStorage.getItem = key =>
localStorage[key] === void 0 ? null : localStorage[key]
localStorage.setItem = (key, value) => (localStorage[key] = value)
globalThis.dumpLocalStorage = async ()=>await writeFile('__localStorage.json', JSON.stringify( global.localStorage))
globalThis.dumpLocalStorage = async () =>
await writeFile(
__dirname + '/__localStorage.json',
JSON.stringify(global.localStorage)
)
const app = new App();
const app = new App()
app.io(
repl => process.stdin.on('data', data=>repl(data.toString().trim())),
(data, isRepl) => process.stdout.write(`${data}${isRepl?'\n>':''}`),
code=>process.exit(code)
repl => process.stdin.on('data', data => repl(data.toString().trim())),
(data, isRepl) => process.stdout.write(`${data}${isRepl ? '\n>' : ''}`),
code => process.exit(code)
)
await app.initial();
await app.initial()
}
main();
main()
// process.stdin.setRawMode(true);
// process.openStdin().on('keypress', function (chunk, key) {
// process.stdout.write('Get Chunk: ' + chunk + '\n');
// if (key && key.ctrl && key.name == 'c') process.exit();
// });
// });

View File

@@ -1,3 +1,4 @@
import './ui/laya.patch.js';
import './ui/runtime.js';
import './ui/pluginFunction.js'
import './ui/promisesLaya.js'
@@ -6,21 +7,21 @@ import UIManager from './ui/uiManager.js';
import * as utils from './functions/util.js';
globalThis.UIManager =
globalThis.UI =
UIManager;
globalThis.UI =
UIManager;
globalThis.$_ = utils;
globalThis.goto = async tag => {
let url;
switch(tag) {
switch (tag) {
case 'github': url = 'https://github.com/VickScarlet/lifeRestart'; break;
case 'discord': url = 'https://discord.gg/U3qrf49NMQ'; break;
case 'sponsor_afd': url = 'https://afdian.net/@LifeRestart'; break;
case 'sponsor_afd': url = 'https://afdian.com/a/LifeRestart'; break;
case 'sponsor_ddf': url = 'https://dun.mianbaoduo.com/@vickscarlet'; break;
}
try {
if(Laya.Browser.onIOS) {
if (Laya.Browser.onIOS) {
window.location.href = url;
} else {
window.open(url, '_blank');
@@ -29,8 +30,8 @@ globalThis.goto = async tag => {
console.error(error);
}
}
class App{
constructor(){
class App {
constructor() {
this.name = 'lifeRestart';
this.version = '2.0.0';
console.log(`${this.name} ${this.version}`);
@@ -49,10 +50,10 @@ class App{
//class laya.webgl.text.CharSegment
class CharSegment {
constructor() {
this._sourceStr=null;
this._sourceStr = null;
}
textToSpit(str) {
this._sourceStr=str;
this._sourceStr = str;
var texLen = str.length;
var idx = -1;
this._words = [];
@@ -66,18 +67,18 @@ class App{
}
}
}
getChar(i){
getChar(i) {
return this._words;
}
getCharCode(i){
getCharCode(i) {
return this._words[i].codePointAt(0);
}
length(){
length() {
return this._words.length;
}
}
Laya.class(CharSegment,'laya.webgl.text.CharSegment');
Laya.imps(CharSegment.prototype,{"laya.webgl.text.ICharSegment":true})
Laya.class(CharSegment, 'laya.webgl.text.CharSegment');
Laya.imps(CharSegment.prototype, { "laya.webgl.text.ICharSegment": true })
// Laya.init(1125, 2436, Laya.WebGL);
@@ -102,15 +103,15 @@ class App{
const screenWidth = window.innerWidth;
const screenHeight = window.innerHeight;
const screenRatio = screenWidth / screenHeight;
if(screenRatio > designRatio) {
if (screenRatio > designRatio) {
return [
Math.min(screenWidth*designHeight/screenHeight, maxWidth),
Math.min(screenWidth * designHeight / screenHeight, maxWidth),
designHeight
]
} else {
return [
designWidth,
Math.min(screenHeight*designWidth/screenWidth, maxHeight)
Math.min(screenHeight * designWidth / screenWidth, maxHeight)
]
}
}
@@ -120,7 +121,7 @@ class App{
}
async #setLanguage(language) {
switch(language) {
switch (language) {
case App.languages['en-us']:
case App.languages['zh-cn']:
this.#language = language;
@@ -130,23 +131,23 @@ class App{
break;
}
globalThis.$lang =
Laya.Text.langPacks =
Laya.Text.langPacks =
(await import(`./i18n/${this.#language}.js`)).default;
}
resigterEvent() {
$$on('achievement', achievement => {
$ui.popup(UI.popups.ACHIEVEMENT, {achievement});
$ui.popup(UI.popups.ACHIEVEMENT, { achievement });
})
$$on('message', ([message, ...args]) => {
if(Array.isArray(message)) {
message = message.map(([m, ...a]) => $_.format($lang[m], ...a)) .join('\n');
if (Array.isArray(message)) {
message = message.map(([m, ...a]) => $_.format($lang[m], ...a)).join('\n');
} else {
message = $_.format(
$lang[message], ...args
);
}
$ui.popup(UI.popups.MESSAGE, {message});
$ui.popup(UI.popups.MESSAGE, { message });
})
}
@@ -158,12 +159,8 @@ class App{
this.#initLaya();
globalThis.$ui = UIManager.getInstance();
if(theme=='default') {
if(!localStorage.getItem('__')) {
localStorage.setItem('__', 1);
localStorage.setItem('theme', 'cyber');
}
theme = localStorage.getItem('theme');
if (theme == 'default') {
theme = localStorage.getItem('theme') || 'default';
}
$ui.theme = theme;
@@ -171,8 +168,8 @@ class App{
await $ui.setLoading(UI.pages.LOADING);
await $ui.switchView(UI.pages.LOADING);
await core.initial(
dataSet=>Laya.promises.loader.load(`data/${this.#language}/${dataSet}.json`, null, Laya.Loader.JSON),
dataSet=>Laya.promises.loader.load(`data/${dataSet}.json`, null, Laya.Loader.JSON),
dataSet => Laya.promises.loader.load(`data/${this.#language}/${dataSet}.json`, null, Laya.Loader.JSON),
dataSet => Laya.promises.loader.load(`data/${dataSet}.json`, null, Laya.Loader.JSON),
);
await $ui.switchView(UI.pages.MAIN);

View File

@@ -43,7 +43,7 @@ function parseCondition(condition) {
return conditions;
}
function checkCondition(property, condition) {
export function checkCondition(property, condition) {
const conditions = parseCondition(condition);
return checkParsedConditions(property, conditions);
}
@@ -113,7 +113,7 @@ function checkProp(property, condition) {
}
}
function extractMaxTriggers(condition) {
export function extractMaxTriggers(condition) {
// Assuming only age related talents can be triggered multiple times.
const RE_AGE_CONDITION = /AGE\?\[([0-9\,]+)\]/;
const match_object = RE_AGE_CONDITION.exec(condition);
@@ -124,6 +124,4 @@ function extractMaxTriggers(condition) {
const age_list = match_object[1].split(",");
return age_list.length;
}
export { checkCondition, extractMaxTriggers };
}

View File

@@ -0,0 +1,103 @@
import { expect, test, describe } from 'vitest'
import { checkCondition } from './condition'
function withProp(prop) {
const p = {
get(key) {
return prop[key]
},
}
return condition => checkCondition(p, condition)
}
describe('condition', () => {
const check = withProp({
n1: 0,
n2: -10,
n3: 10,
nl1: [1, 2, 3],
nl2: [0],
nl3: [],
})
test('gt(>)', () => {
expect(check('n3>11')).toBe(false)
expect(check('n3>10')).toBe(false)
expect(check('n3>9')).toBe(true)
})
test('gte(>=)', () => {
expect(check('n3>=11')).toBe(false)
expect(check('n3>=10')).toBe(true)
expect(check('n3>=9')).toBe(true)
})
test('lt(<)', () => {
expect(check('n3<9')).toBe(false)
expect(check('n3<10')).toBe(false)
expect(check('n3<11')).toBe(true)
})
test('lte(<=)', () => {
expect(check('n3<=9')).toBe(false)
expect(check('n3<=10')).toBe(true)
expect(check('n3<=11')).toBe(true)
})
test('eq(=)', () => {
expect(check('n3=9')).toBe(false)
expect(check('n3=10')).toBe(true)
expect(check('n3=11')).toBe(false)
expect(check('nl1=0')).toBe(false)
expect(check('nl1=1')).toBe(true)
expect(check('nl1=2')).toBe(true)
expect(check('nl1=3')).toBe(true)
})
test('ne(!=)', () => {
expect(check('n3!=9')).toBe(true)
expect(check('n3!=10')).toBe(false)
expect(check('n3!=11')).toBe(true)
expect(check('nl1!=0')).toBe(true)
expect(check('nl1!=1')).toBe(false)
expect(check('nl1!=2')).toBe(false)
expect(check('nl1!=3')).toBe(false)
})
test('in(?)', () => {
expect(check('n3?[1,2,3]')).toBe(false)
expect(check('n3?[10,11,12]')).toBe(true)
expect(check('nl1?[0,1]')).toBe(true)
expect(check('nl2?[1,2,3]')).toBe(false)
expect(check('nl3?[1,2,3]')).toBe(false)
expect(check('nl2?[]')).toBe(false)
expect(check('nl3?[]')).toBe(false)
})
test('notin(!)', () => {
expect(check('n3![1,2,3]')).toBe(true)
expect(check('n3![10,11,12]')).toBe(false)
expect(check('nl1![0,1]')).toBe(false)
expect(check('nl2![1,2,3]')).toBe(true)
expect(check('nl3![1,2,3]')).toBe(true)
expect(check('nl2![]')).toBe(true)
expect(check('nl3![]')).toBe(true)
})
test('and(&)', () => {
expect(check('n1>=0&n2<0')).toBe(true)
expect(check('n2>0&n3>0')).toBe(false)
expect(check('n2<0&n3<0')).toBe(false)
expect(check('n2<0&n3>0')).toBe(true)
expect(check('n1=0&n2<0&n3>0')).toBe(true)
expect(check('n1=0&n2>0&n3>0')).toBe(false)
})
test('or(|)', () => {
expect(check('n1>=0|n2<0')).toBe(true)
expect(check('n2>0|n3>0')).toBe(true)
expect(check('n2<0|n3<0')).toBe(true)
expect(check('n2<0|n3>0')).toBe(true)
expect(check('n2>0|n3<0')).toBe(false)
expect(check('n1=0|n2<0|n3>0')).toBe(true)
expect(check('n1=0|n2>0|n3>0')).toBe(true)
expect(check('n1!=0|n2>0|n3<0')).toBe(false)
})
test('mix', () => {
expect(check('(n1=0|n2<0|n3>0)&(n1=0|n2>0|n3>0)')).toBe(true)
expect(check('(n1=0|n2<0|n3>0)&(n1!=0|n2>0|n3<0)')).toBe(false)
expect(check('n1=0|n2<0|n3>0&n1!=0|n2>0|n3<0')).toBe(true)
expect(check('(n1>0|n1?[-10,0])&(n2>0|n3![0,1])')).toBe(true)
expect(check('(n1>0&n1?[-10,0])|(n2<0&n3![0,1])')).toBe(true)
})
})

View File

@@ -1,6 +1,7 @@
function clone(value) {
switch(typeof value) {
case 'object':
if(value === null) return null;
if(Array.isArray(value)) return value.map(v=>clone(v));
const newObj = {};
for(const key in value) newObj[key] = clone(value[key]);

View File

@@ -27,10 +27,11 @@ export default ({
UI_Title_Remake: 'Remake Simulate',
UI_Title_Subsequent: 'The rubbish life doesn\'t want to stay for a second',
UI_Remake: 'Remake Now',
UI_Remake: 'Remake Now',
UI_Thanks: 'Thx',
UI_Achievement: 'Achv',
UI_Cyber_Theme_Art_Design: 'UI Design by 晰晰',
UI_Banner: '作者的新作《纸上谈亲》已上线小程序\n微信/抖音搜索“纸上谈亲”即可游玩~',
UI_Title_Talent: 'Talent Draw',
UI_Talent_Draw: '!10 Pulls!',
@@ -125,17 +126,31 @@ export default ({
UI_Write: 'Paste',
UI_CopySuccess: 'Copy to clipboard success',
UI_CopyFaild: 'Copy to clipboard faild',
UI_CopyFailed: 'Copy to clipboard Failed',
UI_PasteSuccessDecodeSuccess: 'Load Success!',
UI_PasteSuccessDecodeFaild: 'Paste success, but load faild!',
UI_PasteFaildDecodeSuccess: 'Paste faild, use input load success!',
UI_PasteFaildDecodeFaild: 'Paste faild, use input load faild!',
UI_PasteSuccessDecodeFailed: 'Paste success, but load Failed!',
UI_PasteFailedDecodeSuccess: 'Paste Failed, use input load success!',
UI_PasteFailedDecodeFailed: 'Paste Failed, use input load Failed!',
UI_LoadSuccess: 'Load Success!',
UI_LoadFaild: 'Load Faild!',
UI_LoadFailed: 'Load Failed!',
UI_Title_Celebrity: 'Past life was...',
UI_CustomMode: 'Custom',
UI_CustomModeDescription: '10 Talent\nCustom property',
UI_CelebrityMode: 'Celebrity',
UI_CelebrityModeDescription: 'Past life is celebrity\nRebirth to modern',
UI_AllNot: '↻All Not',
UI_UniqueWaTaShi: 'Unique of mine',
UI_UniqueWaTaShiContent: '\nUnique character card different from other 60 million player\nAll property, All talent, All random\nAll has only one chance',
UI_GenerateNow: 'Generate Now',
M_NoRank: 'There is no rank',
M_PleaseSelectOne: 'Please Select One',
M_UnGenerate: 'Unique Character no generate',
M_DisableExtendTalent: 'Celebrity mode can\'t extends talent',
F_RemakeTimes: 'Remake {0} Times',
F_AchievementCount: 'Achievement {0}',
@@ -145,4 +160,5 @@ export default ({
F_TalentSelectNotComplect: 'Please select {0} talent',
F_PropertyPointLeft: 'You have left {0} property point',
F_TalentReplace: 'Talent replace [{source.name}] -> [{target.name}]',
F_PropertyStr: 'CHR{CHR} INT{INT} STR{STR} MNY{MNY}'
});

View File

@@ -15,6 +15,8 @@ export default ({
UI_Loading: '加载中...',
UI_Error: '错误',
UI_BackupBtn: '上面没有效果就试试这个吧',
UI_Colon: '',
UI_Times: '次',
UI_Count: '个',
@@ -27,10 +29,11 @@ export default ({
UI_Title_Remake: '人生重开模拟器',
UI_Title_Subsequent: '这垃圾人生一秒也不想待了',
UI_Remake: '立即重开',
UI_Remake: '立即重开',
UI_Thanks: '感谢',
UI_Achievement: '成就',
UI_Cyber_Theme_Art_Design: 'UI 设计 by 晰晰',
UI_Banner: '作者的新作《纸上谈亲》已上线小程序\n微信/抖音搜索“纸上谈亲”即可游玩~',
UI_Title_Talent: '天赋抽卡',
UI_Talent_Draw: '10连抽',
@@ -125,17 +128,30 @@ export default ({
UI_Write: '粘贴',
UI_LoadSuccess: '读档成功!',
UI_LoadFaild: '读档失败!',
UI_LoadFailed: '读档失败!',
UI_CopySuccess: '成功复制存档到剪贴板',
UI_CopyFaild: '复制存档到剪贴板失败,请手动复制存档内容',
UI_CopyFailed: '复制存档到剪贴板失败,请手动复制存档内容',
UI_PasteSuccessDecodeSuccess: '读档成功!',
UI_PasteSuccessDecodeFaild: '粘贴剪贴板存档内容成功,但剪贴板内容读档失败',
UI_PasteFaildDecodeSuccess: '粘贴剪贴板存档内容失败,使用输入的内容读档成功',
UI_PasteFaildDecodeFaild: '粘贴剪贴板存档内容失败,使用输入的内容读档失败',
UI_PasteSuccessDecodeFailed: '粘贴剪贴板存档内容成功,但剪贴板内容读档失败',
UI_PasteFailedDecodeSuccess: '粘贴剪贴板存档内容失败,使用输入的内容读档成功',
UI_PasteFailedDecodeFailed: '粘贴剪贴板存档内容失败,使用输入的内容读档失败',
UI_Title_Celebrity: '你的前世是...',
UI_CustomMode: '经典模式',
UI_CustomModeDescription: '10连抽天赋\n自由分配属性',
UI_CelebrityMode: '名人模式',
UI_CelebrityModeDescription: '前世是古代名人\n重开到了现代',
UI_AllNot: '↻都不是',
UI_UniqueWaTaShi: '独一无二的我',
UI_UniqueWaTaShiContent: '\n6000万玩家中独一无二的角色卡\n所有属性 所有天赋 随机生成\n 每人只能生成一次',
UI_GenerateNow: '立即生成',
M_NoRank: '别卷了,没有排行榜',
M_PleaseSelectOne: '请选择一个名人',
M_UnGenerate: '独一无二的我还没有生成',
M_DisableExtendTalent: '名人模式不能继承天赋',
F_RemakeTimes: '已重开{0}次',
F_AchievementCount: '成就达成{0}个',
@@ -145,4 +161,5 @@ export default ({
F_TalentSelectNotComplect: '要选满{0}个天赋',
F_PropertyPointLeft: '你还有 {0} 属性点没有分配完',
F_TalentReplace: '天赋替换【{source.name}】->【{target.name}】',
F_PropertyStr: '颜值{CHR} 智力{INT} 体质{STR} 家境{MNY}'
});

View File

@@ -196,5 +196,29 @@ core.config({
],
},
},
characterConfig: { // config for character
characterPullCount: 3,
rateableKnife: 10,
propertyWeight: [
[ 0, 1],
[ 1, 2],
[ 2, 3],
[ 3, 4],
[ 4, 5],
[ 5, 6],
[ 6, 5],
[ 7, 4],
[ 8, 3],
[ 9, 2],
[10, 1],
],
talentWeight: [
[ 1, 1],
[ 2, 2],
[ 3, 3],
[ 4, 2],
[ 5, 1],
],
},
});
game.start(query);

View File

@@ -1,8 +1,7 @@
import { clone } from '../functions/util.js';
import { checkCondition } from '../functions/condition.js';
class Achievement {
constructor() {}
constructor(system) {
this.#system = system;
}
// 时机
Opportunity = {
@@ -12,6 +11,7 @@ class Achievement {
END: "END", // 游戏完成,点击重开 重开次数在这之后才会+1
};
#system;
#achievements;
initial({achievements}) {
@@ -23,7 +23,11 @@ class Achievement {
return Object.keys(this.#achievements).length;
}
list(property) {
get #prop() {
return this.#system.request(this.#system.Module.PROPERTY);
}
list() {
return Object
.values(this.#achievements)
.map(({
@@ -32,34 +36,34 @@ class Achievement {
})=>({
id, name, opportunity,
description, hide, grade,
isAchieved: this.isAchieved(id, property),
isAchieved: this.isAchieved(id, this.#prop),
}));
}
get(achievementId) {
const achievement = this.#achievements[achievementId];
if(!achievement) throw new Error(`[ERROR] No Achievement[${achievementId}]`);
return clone(achievement);
return this.#system.clone(achievement);
}
check(achievementId, property) {
check(achievementId) {
const { condition } = this.get(achievementId);
return checkCondition(property, condition);
return this.#system.check(condition);
}
isAchieved(achievementId, property) {
for(const [achieved] of (property.get(property.TYPES.ACHV)||[]))
isAchieved(achievementId) {
for(const [achieved] of (this.#prop.get(this.#prop.TYPES.ACHV)||[]))
if(achieved == achievementId) return true;
return false;
}
achieve(opportunity, property) {
this.list(property)
achieve(opportunity) {
this.list()
.filter(({isAchieved})=>!isAchieved)
.filter(({opportunity: o})=>o==opportunity)
.filter(({id})=>this.check(id, property))
.filter(({id})=>this.check(id, this.#prop))
.forEach(({id})=>{
property.achieve(property.TYPES.ACHV, id)
this.#prop.achieve(this.#prop.TYPES.ACHV, id)
$$event('achievement', this.get(id))
});
}

134
src/modules/character.js Normal file
View File

@@ -0,0 +1,134 @@
class Character {
constructor(system) {
this.#system = system;
}
#system;
#characters;
#characterPullCount;
#rateableKnife;
#rate;
#pipe = [];
#uniqueWaTaShi;
#propertyWeight;
#talentWeight
initial({characters}) {
this.#characters = characters;
const uniqueWaTaShi = localStorage.getItem('uniqueWaTaShi');
if(uniqueWaTaShi != null || uniqueWaTaShi != 'undefined')
this.#uniqueWaTaShi = JSON.parse(uniqueWaTaShi);
return this.count;
}
get count() {
return Object.keys(this.#characters).length;
}
config({
characterPullCount = 3,
rateableKnife = 10,
propertyWeight,
talentWeight,
} = {}) {
this.#characterPullCount = characterPullCount;
this.#rateableKnife = rateableKnife;
this.#propertyWeight = propertyWeight;
this.#talentWeight = talentWeight;
}
get #unique() {
if(this.#uniqueWaTaShi) {
return this.#system.clone(this.#uniqueWaTaShi);
}
const now = Date.now();
this.#pipe.push(now);
if(this.#pipe.length < 10) return null;
const time = this.#pipe.shift();
if(now - time > 10000) return null;
return {unique: true, generate: false};
}
set #unique(data) {
this.#uniqueWaTaShi = this.#system.clone(data);
this.#uniqueWaTaShi.unique = true;
this.#uniqueWaTaShi.generate = true;
localStorage.setItem(
'uniqueWaTaShi',
JSON.stringify(this.#uniqueWaTaShi)
);
}
get #weightRandom() {
return this.#system.function(this.#system.Function.UTIL).weightRandom;
}
generateUnique() {
if(this.#uniqueWaTaShi) return this.#unique;
const weightRandom = this.#weightRandom;
const {CHR, INT, STR, MNY} = this.#system.PropertyTypes;
this.#unique = {
property: {
[CHR]: weightRandom(this.#propertyWeight),
[INT]: weightRandom(this.#propertyWeight),
[STR]: weightRandom(this.#propertyWeight),
[MNY]: weightRandom(this.#propertyWeight),
},
talent: this.#system
.request(this.#system.Module.TALENT)
.random(weightRandom(this.#talentWeight)),
}
return this.#unique;
}
random() {
return {
unique: this.#unique,
normal: this.#rateable(),
}
}
#rateable() {
if(!this.#rate) {
this.#rate = {};
for(const id in this.#characters) {
this.#rate[id] = 1;
}
}
const r = [];
const weightRandom = this.#weightRandom;
new Array(this.#characterPullCount)
.fill(0)
.forEach(()=>{
r.push(
weightRandom(Object
.keys(this.#rate)
.filter(id=>!r.includes(id))
.map(id=>([id,this.#rate[id]]))
)
)
});
let min = Infinity;
for(const id in this.#rate) {
if(r.includes(id)) {
min = Math.min(min, this.#rate[id]);
continue;
}
min = Math.min(min, ++ this.#rate[id]);
}
if(min > this.#rateableKnife) {
for(const id in this.#rate) {
this.#rate[id] -= this.#rateableKnife;
}
}
return r.map(id=>this.#system.clone(this.#characters[id]));
}
}
export default Character;

View File

@@ -1,9 +1,9 @@
import { clone } from '../functions/util.js';
import { checkCondition } from '../functions/condition.js';
class Event {
constructor() {}
constructor(system) {
this.#system = system;
}
#system;
#events;
initial({events}) {
@@ -24,18 +24,18 @@ class Event {
return Object.keys(this.#events).length;
}
check(eventId, property) {
check(eventId) {
const { include, exclude, NoRandom } = this.get(eventId);
if(NoRandom) return false;
if(exclude && checkCondition(property, exclude)) return false;
if(include) return checkCondition(property, include);
if(exclude && this.#system.check(exclude)) return false;
if(include) return this.#system.check(include);
return true;
}
get(eventId) {
const event = this.#events[eventId];
if(!event) throw new Error(`[ERROR] No Event[${eventId}]`);
return clone(event);
return this.#system.clone(event);
}
information(eventId) {
@@ -43,11 +43,11 @@ class Event {
return { description };
}
do(eventId, property) {
do(eventId) {
const { effect, branch, event: description, postEvent, grade } = this.get(eventId);
if(branch)
for(const [cond, next] of branch)
if(checkCondition(property, cond))
if(this.#system.check(cond))
return { effect, next, description, grade };
return { effect, postEvent, description, grade };
}

View File

@@ -1,21 +1,39 @@
import { clone, weightRandom, getListValuesMap, getConvertedMap } from '../functions/util.js'
import * as util from '../functions/util.js';
import * as fCondition from '../functions/condition.js';
import Property from './property.js';
import Event from './event.js';
import Talent from './talent.js';
import Achievement from './achievement.js';
import Character from './character.js';
class Life {
constructor() {
this.#property = new Property();
this.#event = new Event();
this.#talent = new Talent();
this.#achievement = new Achievement();
this.#property = new Property(this);
this.#event = new Event(this);
this.#talent = new Talent(this);
this.#achievement = new Achievement(this);
this.#character = new Character(this);
}
Module = {
PROPERTY: 'PROPERTY',
TALENT: 'TALENT',
EVENT: 'EVENT',
ACHIEVEMENT: 'ACHIEVEMENT',
CHARACTER: 'CHARACTER',
}
Function = {
CONDITION: 'CONDITION',
UTIL: 'UTIL',
}
#property;
#event;
#talent;
#achievement;
#character;
#triggerTalents;
#defaultPropertyPoints;
#talentSelectLimit;
@@ -25,22 +43,23 @@ class Life {
#initialData;
async initial(i18nLoad, commonLoad) {
const [age, talents, events, achievements, specialThanks] = await Promise.all([
const [age, talents, events, achievements, characters, specialThanks] = await Promise.all([
i18nLoad('age'),
i18nLoad('talents'),
i18nLoad('events'),
i18nLoad('achievement'),
i18nLoad('character'),
commonLoad('specialthanks'),
]);
this.#specialThanks = specialThanks;
const total = {
[this.PropertyTypes.TACEV]: this.#achievement.initial({achievements}),
[this.PropertyTypes.TACHV]: this.#achievement.initial({achievements}),
[this.PropertyTypes.TEVT]: this.#event.initial({events}),
[this.PropertyTypes.TTLT]: this.#talent.initial({talents}),
};
this.#property.initial({age, total});
this.#character.initial({characters});
}
config({
@@ -50,6 +69,7 @@ class Life {
defaultPropertys = {}, // default propertys
talentConfig, // config for talent
propertyConfig, // config for property
characterConfig, // config for character
} = {}) {
this.#defaultPropertyPoints = defaultPropertyPoints;
this.#talentSelectLimit = talentSelectLimit;
@@ -57,26 +77,50 @@ class Life {
this.#defaultPropertys = defaultPropertys;
this.#talent.config(talentConfig);
this.#property.config(propertyConfig);
this.#character.config(characterConfig);
}
request(module) {
switch (module) {
case this.Module.ACHIEVEMENT: return this.#achievement;
case this.Module.CHARACTER: return this.#character;
case this.Module.EVENT: return this.#event;
case this.Module.PROPERTY: return this.#property;
case this.Module.TALENT: return this.#talent;
default: return null;
}
}
function(type) {
switch (type) {
case this.Function.CONDITION: return fCondition;
case this.Function.UTIL: return util;
}
}
check(condition) {
return fCondition.checkCondition(this.#property,condition);
}
clone(...args) {
return util.clone(...args);
}
remake(talents) {
this.#initialData = clone(this.#defaultPropertys);
this.#initialData.TLT = clone(talents);
this.#initialData = util.clone(this.#defaultPropertys);
this.#initialData.TLT = util.clone(talents);
this.#triggerTalents = {};
return this.talentReplace(this.#initialData.TLT);
}
start(allocation) {
for(const key in allocation) {
this.#initialData[key] = clone(allocation[key]);
this.#initialData[key] = util.clone(allocation[key]);
}
this.#property.restart(this.#initialData);
this.doTalent()
this.#property.restartLastStep();
this.#achievement.achieve(
this.AchievementOpportunity.START,
this.#property
);
this.#achievement.achieve(this.AchievementOpportunity.START);
}
getPropertyPoints() {
@@ -96,10 +140,7 @@ class Life {
const isEnd = this.#property.isEnd();
const content = [talentContent, eventContent].flat();
this.#achievement.achieve(
this.AchievementOpportunity.TRAJECTORY,
this.#property
)
this.#achievement.achieve(this.AchievementOpportunity.TRAJECTORY);
return { age, content, isEnd };
}
@@ -125,7 +166,7 @@ class Life {
const contents = [];
for(const talentId of talents) {
const result = this.#talent.do(talentId, this.#property);
const result = this.#talent.do(talentId);
if(!result) continue;
this.#triggerTalents[talentId] = this.getTalentCurrentTriggerCount(talentId) + 1;
const { effect, name, description, grade } = result;
@@ -133,7 +174,7 @@ class Life {
type: this.PropertyTypes.TLT,
name,
grade,
description,
description: this.format(description),
})
if(!effect) continue;
this.#property.effect(effect);
@@ -142,13 +183,13 @@ class Life {
}
doEvent(eventId) {
const { effect, next, description, postEvent, grade } = this.#event.do(eventId, this.#property);
const { effect, next, description, postEvent, grade } = this.#event.do(eventId);
this.#property.change(this.PropertyTypes.EVT, eventId);
this.#property.effect(effect);
const content = {
type: this.PropertyTypes.EVT,
description,
postEvent,
description: this.format(description),
postEvent: postEvent && this.format(postEvent),
grade,
}
if(next) return [content, this.doEvent(next)].flat();
@@ -156,7 +197,7 @@ class Life {
}
random(events) {
return weightRandom(
return util.weightRandom(
events.filter(
([eventId])=>this.#event.check(eventId, this.#property)
)
@@ -173,20 +214,52 @@ class Life {
);
}
characterRandom() {
const characters = this.#character.random();
const replaceTalent = v=>v.talent=v.talent.map(
id=>this.#talent.get(id)
);
characters.normal.forEach(replaceTalent);
if(characters.unique && characters.unique.talent)
replaceTalent(characters.unique);
return characters;
}
talentExtend(talentId) {
this.#property.set(this.PropertyTypes.EXT, talentId);
}
exclusive(talents, exclusive) {
return this.#talent.exclusive(talents, exclusive);
exclude(talents, exclusive) {
return this.#talent.exclude(talents, exclusive);
}
generateUnique() {
this.#character.generateUnique();
}
#getJudges(...types) {
return getListValuesMap(types.flat(), key => this.#property.judge(key));
return util.getListValuesMap(types.flat(), key => this.#property.judge(key));
}
#getPropertys(...types) {
return getListValuesMap(types.flat(), key => this.#property.get(key));
return util.getListValuesMap(types.flat(), key => this.#property.get(key));
}
format(discription) {
return discription.replaceAll(/\{\s*[0-9a-zA-Z_-]+\s*?\}/g, (match) => this.#format(match));
}
#format(key) {
switch (key.slice(1, -1).trim().toLowerCase()) {
case 'currentyear': return new Date().getFullYear()
case 'age': return this.#property.get(this.PropertyTypes.AGE)
case 'charm': return this.#property.get(this.PropertyTypes.CHR)
case 'intelligence': return this.#property.get(this.PropertyTypes.INT)
case 'strength': return this.#property.get(this.PropertyTypes.STR)
case 'money': return this.#property.get(this.PropertyTypes.MNY)
case 'spirit': return this.#property.get(this.PropertyTypes.SPR)
default: return key
}
}
get lastExtendTalent() {
@@ -194,10 +267,7 @@ class Life {
}
get summary() {
this.#achievement.achieve(
this.AchievementOpportunity.SUMMARY,
this.#property
)
this.#achievement.achieve(this.AchievementOpportunity.SUMMARY);
const pt = this.PropertyTypes;
@@ -243,16 +313,13 @@ class Life {
get PropertyTypes() { return this.#property.TYPES; }
get AchievementOpportunity() { return this.#achievement.Opportunity; }
get talentSelectLimit() { return this.#talentSelectLimit; }
get propertyAllocateLimit() { return clone(this.#propertyAllocateLimit); }
get propertyAllocateLimit() { return util.clone(this.#propertyAllocateLimit); }
get propertys() { return this.#property.getPropertys(); }
get times() { return this.#property.get(this.PropertyTypes.TMS) || 0; }
set times(v) {
this.#property.set(this.PropertyTypes.TMS, v);
this.#achievement.achieve(
this.AchievementOpportunity.END,
this.#property
)
this.#achievement.achieve(this.AchievementOpportunity.END);
}
get specialThanks() { return this.#specialThanks; }
}

View File

@@ -1,7 +1,7 @@
import { max, min, sum, clone, listRandom } from '../functions/util.js';
class Property {
constructor() {}
constructor(system) {
this.#system = system;
}
TYPES = {
// 本局
@@ -70,11 +70,16 @@ class Property {
]
}
#system;
#ageData;
#data = {};
#total;
#judge;
get #util() {
return this.#system.function(this.#system.Function.UTIL);
}
initial({age, total}) {
this.#ageData = age;
for(const a in age) {
@@ -151,6 +156,7 @@ class Property {
}
get(prop) {
const util = this.#util;
switch(prop) {
case this.TYPES.AGE:
case this.TYPES.CHR:
@@ -161,14 +167,14 @@ class Property {
case this.TYPES.LIF:
case this.TYPES.TLT:
case this.TYPES.EVT:
return clone(this.#data[prop]);
return util.clone(this.#data[prop]);
case this.TYPES.LAGE:
case this.TYPES.LCHR:
case this.TYPES.LINT:
case this.TYPES.LSTR:
case this.TYPES.LMNY:
case this.TYPES.LSPR:
return min(
return util.min(
this.#data[prop],
this.get(this.fallback(prop))
);
@@ -178,7 +184,7 @@ class Property {
case this.TYPES.HSTR:
case this.TYPES.HMNY:
case this.TYPES.HSPR:
return max(
return util.max(
this.#data[prop],
this.get(this.fallback(prop))
);
@@ -189,7 +195,7 @@ class Property {
const HSTR = this.get(this.TYPES.HSTR);
const HMNY = this.get(this.TYPES.HMNY);
const HSPR = this.get(this.TYPES.HSPR);
return Math.floor(sum(HCHR, HINT, HSTR, HMNY, HSPR)*2 + HAGE/2);
return Math.floor(util.sum(HCHR, HINT, HSTR, HMNY, HSPR)*2 + HAGE/2);
case this.TYPES.TMS:
return this.lsget('times') || 0;
case this.TYPES.EXT:
@@ -253,7 +259,7 @@ class Property {
case this.TYPES.LIF:
case this.TYPES.TLT:
case this.TYPES.EVT:
this.hl(prop, this.#data[prop] = clone(value));
this.hl(prop, this.#data[prop] = this.#system.clone(value));
this.achieve(prop, value);
return;
case this.TYPES.TMS:
@@ -267,7 +273,7 @@ class Property {
}
getPropertys() {
return clone({
return this.#system.clone({
[this.TYPES.AGE]: this.get(this.TYPES.AGE),
[this.TYPES.CHR]: this.get(this.TYPES.CHR),
[this.TYPES.INT]: this.get(this.TYPES.INT),
@@ -315,7 +321,8 @@ class Property {
hookSpecial(prop) {
switch(prop) {
case this.TYPES.RDM: return listRandom(this.SPECIAL.RDM);
case this.TYPES.RDM:
return this.#util.listRandom(this.SPECIAL.RDM);
default: return prop;
}
}
@@ -334,15 +341,6 @@ class Property {
const d = this.#judge[prop];
let length = d.length;
// progress judge
// const p = 1/length;
// const progress = () => {
// const min = d[length][0] || 0;
// const max = d[length+1]?.[0] || value;
// if(max == min) return 1;
// return p * (length + (value - min) / (max - min));
// }
const progress = () => Math.max(Math.min(value, 10), 0) / 10;
while(length--) {
@@ -363,7 +361,7 @@ class Property {
}
getAgeData(age) {
return clone(this.#ageData[age]);
return this.#system.clone(this.#ageData[age]);
}
hl(prop, value) {
@@ -378,8 +376,8 @@ class Property {
default: return;
}
const [l, h] = keys;
this.#data[l] = min(this.#data[l], value);
this.#data[h] = max(this.#data[h], value);
this.#data[l] = this.#util.min(this.#data[l], value);
this.#data[h] = this.#util.max(this.#data[h], value);
}
achieve(prop, newData) {
@@ -411,7 +409,7 @@ class Property {
lsget(key) {
const data = localStorage.getItem(key);
if(data === null) return;
if(data === null || data === 'undefined') return;
return JSON.parse(data);
}

View File

@@ -1,9 +1,9 @@
import { clone, weightRandom } from '../functions/util.js';
import { checkCondition, extractMaxTriggers } from '../functions/condition.js';
class Talent {
constructor() {}
constructor(system) {
this.#system = system;
}
#system;
#talents;
#talentPullCount;
#talentRate;
@@ -11,11 +11,12 @@ class Talent {
initial({talents}) {
this.#talents = talents;
const emt = this.#system.function(this.#system.Function.CONDITION).extractMaxTriggers;
for(const id in talents) {
const talent = talents[id];
talent.id= Number(id);
talent.grade = Number(talent.grade);
talent.max_triggers = extractMaxTriggers(talent.condition);
talent.max_triggers = emt(talent.condition);
if(talent.replacement) {
for(let key in talent.replacement) {
const obj = {};
@@ -34,6 +35,10 @@ class Talent {
return Object.keys(this.#talents).length;
}
get #prop() {
return this.#system.request(this.#system.Module.PROPERTY);
}
config({
talentPullCount = 10, // number of talents to pull from the talent pool
talentRate = { 1:100, 2:10, 3:1, total: 1000 }, // rate of talent pull
@@ -45,15 +50,15 @@ class Talent {
}
check(talentId, property) {
check(talentId) {
const { condition } = this.get(talentId);
return checkCondition(property, condition);
return this.#system.check(this.#prop, condition);
}
get(talentId) {
const talent = this.#talents[talentId];
if(!talent) throw new Error(`[ERROR] No Talent[${talentId}]`);
return clone(talent);
return this.#system.clone(talent);
}
information(talentId) {
@@ -61,12 +66,19 @@ class Talent {
return { grade, name, description };
}
exclusive(talends, exclusiveId) {
const { exclusive } = this.get(exclusiveId);
if(!exclusive) return null;
for(const talent of talends) {
for(const e of exclusive) {
if(talent == e) return talent;
exclude(talents, excludeId) {
const { exclude } = this.get(excludeId);
for(const talent of talents) {
if(exclude) {
for(const e of exclude) {
if(talent == e) return talent;
}
}
const excludeReverse = this.get(talent).exclude;
if(excludeReverse) {
for (const e of excludeReverse) {
if (excludeId == e) return talent
}
}
}
return null;
@@ -81,7 +93,7 @@ class Talent {
}
getRate(additionValues = {}) {
const rate = clone(this.#talentRate);
const rate = this.#system.clone(this.#talentRate);
const addition = { 1:1, 2:1, 3:1, };
Object.keys(additionValues).forEach(key => {
@@ -103,13 +115,14 @@ class Talent {
let randomNumber = Math.floor(Math.random() * rate.total);
if((randomNumber -= rate[3]) < 0) return 3;
if((randomNumber -= rate[2]) < 0) return 2;
if((randomNumber -= rate[1]) < 0) return 1;
if((randomNumber - rate[1]) < 0) return 1;
return 0;
}
const talentList = {};
for(const talentId in this.#talents) {
const { id, grade, name, description } = this.#talents[talentId];
const { id, grade, name, description, exclusive } = this.#talents[talentId];
if(!!exclusive) continue;
if(id == include) {
include = { grade, name, description, id };
continue;
@@ -130,6 +143,19 @@ class Talent {
});
}
random(count) {
const talents = Object
.keys(this.#talents)
.filter(id=>!this.#talents[id].exclusive);
return new Array(count)
.fill(1)
.map(()=>talents.splice(
Math.floor(Math.random()*talents.length)%talents.length,
1
)[0]
);
}
allocationAddition(talents) {
if(Array.isArray(talents)) {
let addition = 0;
@@ -140,9 +166,9 @@ class Talent {
return Number(this.get(talents).status) || 0;
}
do(talentId, property) {
do(talentId) {
const { effect, condition, grade, name, description } = this.get(talentId);
if(condition && !checkCondition(property, condition))
if(condition && !this.#system.check(condition))
return null;
return { effect, grade, name, description };
}
@@ -153,32 +179,34 @@ class Talent {
if(!replacement) return null;
const list = [];
if(replacement.grade) {
this.forEach(({id, grade})=>{
this.forEach(({id, grade, exclusive})=>{
if(exclusive) return;
if(!replacement.grade[grade]) return;
if(this.exclusive(talents, id)) return;
if(this.exclude(talents, id)) return;
list.push([id, replacement.grade[grade]]);
})
}
if(replacement.talent) {
for(let id in replacement.talent) {
id = Number(id);
if(this.exclusive(talents, id)) continue;
if(this.exclude(talents, id)) continue;
list.push([id, replacement.talent[id]]);
}
}
return list;
}
const wr = this.#system.function(this.#system.Function.UTIL).weightRandom;
const replace = (talent, talents) => {
const replaceList = getReplaceList(talent, talents);
if(!replaceList) return talent;
const rand = weightRandom(replaceList);
const rand = wr(replaceList);
return replace(
rand, talents.concat(rand)
);
}
const newTalents = clone(talents);
const newTalents = this.#system.clone(talents);
const result = {};
for(const talent of talents) {
const replaceId = replace(talent, newTalents);
@@ -193,7 +221,7 @@ class Talent {
forEach(callback) {
if(typeof callback != 'function') return;
for(const id in this.#talents)
callback(clone(this.#talents[id]), id);
callback(this.#system.clone(this.#talents[id]), id);
}
}

47
src/ui/laya.patch.js Normal file
View File

@@ -0,0 +1,47 @@
// 滚动条太灵敏
const SCROLL_START_DISTANCE = 30;
Laya.ScrollBar.prototype.loop=function(){
var mouseY=Laya.stage.mouseY;
var mouseX=Laya.stage.mouseX;
this._lastOffset=this.isVertical ? (mouseY-this._lastPoint.y):(mouseX-this._lastPoint.x);
if (this._clickOnly){
if (Math.abs(this._lastOffset *(this.isVertical ? Laya.stage._canvasTransform.getScaleY():Laya.stage._canvasTransform.getScaleX()))> SCROLL_START_DISTANCE){
this._clickOnly=false;
this._offsets || (this._offsets=[]);
this._offsets.length=0;
this._target.mouseEnabled=false;
if (!this.hide && this.autoHide){
this.alpha=1;
this.visible=true;
}
this.event(/*laya.events.Event.START*/"start");
}else return;
}
this._offsets.push(this._lastOffset);
this._lastPoint.x=mouseX;
this._lastPoint.y=mouseY;
if (this._lastOffset===0)return;
if (!this._checkElastic){
if (this.elasticDistance > 0){
if (!this._checkElastic && this._lastOffset !=0){
if ((this._lastOffset > 0 && this._value <=this.min)|| (this._lastOffset < 0 && this._value >=this.max)){
this._isElastic=true;
this._checkElastic=true;
}else {
this._isElastic=false;
}
}
}else {
this._checkElastic=true;
}
}
if (this._isElastic){
if (this._value <=this.min){
this.value-=this._lastOffset *Math.max(0,(1-((this.min-this._value)/ this.elasticDistance)));
}else if (this._value >=this.max){
this.value-=this._lastOffset *Math.max(0,(1-((this._value-this.max)/ this.elasticDistance)));
}
}else {
this.value-=this._lastOffset;
}
}

File diff suppressed because one or more lines are too long

View File

@@ -475,6 +475,12 @@ class ColorfulBox extends Laya.Box {
label.text = value;
}
get cacheAs() {return super.cacheAs;}
set cacheAs(value) {
if(value=='bitmap') debugger;
super.cacheAs = value;
}
}
runtime.BlankBox =
@@ -534,4 +540,32 @@ class BlankBox extends Laya.Box {
super.height = value;
this.#draw();
}
}
runtime.ColorAgentLabel =
class ColorAgentLabel extends Laya.Label {
constructor(...args) {
super(...args);
}
get #brothers() {
const brothers = [];
if(!this.parent) return brothers;
const deepFind = p => {
if(!p._childs) return;
for(const c of p._childs) {
if(c == this) continue;
if(c instanceof Laya.Label) brothers.push(c);
deepFind(c);
}
}
deepFind(this.parent);
return brothers;
}
get color() {return this.super.color;}
set color(c) {
super.color = c;
this.#brothers.forEach(b=>b.color=c);
}
}

View File

@@ -0,0 +1,136 @@
export default class CyberCelebrity extends ui.view.CyberTheme.CelebrityUI {
constructor() {
super();
this.btnRetry.on(Laya.Event.CLICK, this, ()=>this.random());
this.btnNext.on(Laya.Event.CLICK, this, this.next);
this.panelCharacter.vScrollBar.elasticDistance = 150;
}
#selected;
static #createComponent = Laya.plugin.extractComponents(CyberCelebrity.uiView, ['boxCharacter','boxTalent','boxUniqueUnGenerate']);
#createCharacterItem(dataSource, click) {
const {name, property, talent} = dataSource;
const item = CyberCelebrity.#createComponent('boxCharacter');
const vboxStates = item.getChildByName('vboxStates');
const boxName = item.getChildByName('boxName');
boxName.getChildByName('label').text = name;
const p = $_.clone(property);
for(const k in p)
if(Math.abs(p[k] - Math.PI) < 0.0000001)
p[k] = 'π';
vboxStates.getChildByName('label').text = $_.format($lang.F_PropertyStr, p);
for(const t of talent) {
const i = CyberCelebrity.#createComponent('boxTalent');
i.getChildByName('label').text = $_.format($lang.F_TalentSelection, t);
i.y = vboxStates.height+vboxStates.space;
let g = i.getChildByName(`grade${t.grade}`);
if(g) g.visible = true;
vboxStates.addChild(i);
}
const box = new Laya.Box();
box.height = vboxStates.space;
box.y = vboxStates.height;
vboxStates.addChild(box);
vboxStates.scaleY = 0;
item.dataSource = dataSource;
item.switch = showDetails => vboxStates.scaleY = !!showDetails?1:0;
item.click = (cb, caller) => {
boxName.offAll(Laya.Event.CLICK);
boxName.on(Laya.Event.CLICK, caller || this, cb);
}
if(click) item.click(click);
return item;
}
#createUniqueUnGenerateItem(generate) {
const item = CyberCelebrity.#createComponent('boxUniqueUnGenerate');
const boxName = item.getChildByName('boxName');
const vboxStates = item.getChildByName('vboxStates');
const label = vboxStates.getChildByName('label');
const boxBtn = vboxStates.getChildByName('boxBtn');
const btn = boxBtn.getChildByName('btn');
label.event(Laya.Event.RESIZE);
vboxStates.scaleY = 0;
item.dataSource = false;
item.switch = showDetails => vboxStates.scaleY = !!showDetails?1:0;
item.click = (cb, caller) => {
boxName.offAll(Laya.Event.CLICK);
boxName.on(Laya.Event.CLICK, caller || this, cb);
}
item.generate = (cb, caller) => {
btn.offAll(Laya.Event.CLICK);
btn.on(Laya.Event.CLICK, caller || this, cb);
}
if(generate) item.generate(generate);
return item;
}
init() {
this.random();
}
close() {
this.#selected = null;
this.vboxCharacter.destroyChildren(true);
}
random(g) {
this.#selected = null;
this.vboxCharacter.destroyChildren(true);
const {unique, normal} = core.characterRandom();
const items = [];
const uniqueItem = this.generateUnique(unique, ()=>{
core.generateUnique();
this.random(normal);
});
if(uniqueItem) items.push(uniqueItem);
(g||normal).forEach(character => items.push(this.#createCharacterItem(character)));
items.forEach((item, i) => {
item.y = i;
this.vboxCharacter.addChild(item);
item.click(()=>{
if(this.#selected) this.#selected.switch(false);
this.#selected = item;
item.switch(true);
item.event(Laya.Event.RESIZE);
})
});
if(g&&uniqueItem) {
this.#selected = uniqueItem;
uniqueItem.switch(true);
uniqueItem.event(Laya.Event.RESIZE);
}
}
generateUnique(data, generate) {
if(!data) return null;
if(!data.generate) return this.#createUniqueUnGenerateItem(generate);
data.name = $lang.UI_UniqueWaTaShi;
return this.#createCharacterItem(data);
}
next() {
if(!this.#selected) return $$event('message', ['M_PleaseSelectOne']);
if(!this.#selected.dataSource) return $$event('message', ['M_UnGenerate']);
const {property: propertyAllocate, talent: talents} = this.#selected.dataSource;
const replace = core.remake(talents.map(talent => talent.id));
if(replace.length > 0) {
$$event('message', [replace.map(v => ['F_TalentReplace', v])]);
}
$ui.switchView(
UI.pages.TRAJECTORY,
{
propertyAllocate, talents,
enableExtend: false,
}
);
}
}

View File

@@ -1,7 +1,7 @@
export default class CyberMain extends ui.view.CyberTheme.CyberMainUI {
constructor() {
super();
this.btnRemake.on(Laya.Event.CLICK, this, ()=>$ui.switchView(UI.pages.TALENT));
this.btnRemake.on(Laya.Event.CLICK, this, ()=>$ui.switchView(UI.pages.MODE));
this.btnAchievement.on(Laya.Event.CLICK, this, ()=>$ui.switchView(UI.pages.ACHIEVEMENT));
this.btnThanks.on(Laya.Event.CLICK, this, ()=>$ui.switchView(UI.pages.THANKS));
this.btnGithub.on(Laya.Event.CLICK, this, goto, ['github']);
@@ -30,6 +30,7 @@ export default class CyberMain extends ui.view.CyberTheme.CyberMainUI {
}
init() {
this.banner.visible =
this.btnDiscord.visible =
this.btnAchievement.visible =
this.btnThanks.visible = !!core.times;

View File

@@ -0,0 +1,7 @@
export default class CyberMode extends ui.view.CyberTheme.ModeUI {
constructor() {
super();
this.btnCustom.on(Laya.Event.CLICK, this, ()=>$ui.switchView(UI.pages.TALENT));
this.btnCelebrity.on(Laya.Event.CLICK, this, ()=>$ui.switchView(UI.pages.CELEBRITY));
}
}

View File

@@ -67,6 +67,7 @@ export default class CyberProperty extends ui.view.CyberTheme.CyberPropertyUI {
{
propertyAllocate: this.#propertyAllocate,
talents: this.listSelectedTalents.array,
enableExtend: true,
}
);
}

View File

@@ -6,6 +6,7 @@ export default class CyberSummary extends ui.view.CyberTheme.CyberSummaryUI {
}
#selectedTalent;
#enableExtend;
onAgain() {
core.talentExtend(this.#selectedTalent);
@@ -13,8 +14,10 @@ export default class CyberSummary extends ui.view.CyberTheme.CyberSummaryUI {
$ui.switchView(UI.pages.MAIN);
}
init({talents}) {
init({talents, enableExtend}) {
const {summary, lastExtendTalent} = core;
this.#enableExtend = enableExtend;
const gradeFilters = $ui.common.filter;
const gradeColors = $ui.common.grade;
@@ -68,7 +71,11 @@ export default class CyberSummary extends ui.view.CyberTheme.CyberSummaryUI {
if(b == lastExtendTalent) return 1;
return bg - ag;
});
this.#selectedTalent = talents[0].id;
if(this.#enableExtend) {
this.#selectedTalent = talents[0].id;
} else {
this.#selectedTalent = lastExtendTalent;
}
this.listSelectedTalents.array = talents;
}
@@ -115,6 +122,9 @@ export default class CyberSummary extends ui.view.CyberTheme.CyberSummaryUI {
}
onSelectTalent(talentId) {
if(!this.#enableExtend) {
return $$event('message', ['M_DisableExtendTalent']);
}
if(talentId == this.#selectedTalent) {
this.#selectedTalent = null;
} else {

View File

@@ -40,7 +40,7 @@ export default class CyberTalent extends ui.view.CyberTheme.CyberTalentUI {
}
const talents = [...this.#selected].map(index => this.listTalents.array[index]);
$ui.switchView(UI.pages.PROPERTY, { talents });
$ui.switchView(UI.pages.PROPERTY, { talents, enableExtend: true});
}
renderTalent(box, index) {
@@ -99,7 +99,7 @@ export default class CyberTalent extends ui.view.CyberTheme.CyberTalentUI {
if(this.#selected.size >= core.talentSelectLimit) {
return $$event('message', ['F_TalentSelectLimit', core.talentSelectLimit]);
}
const exclusive = core.exclusive(
const exclusive = core.exclude(
[...this.#selected].map(index => this.listTalents.array[index].id),
this.listTalents.array[index].id
);

View File

@@ -66,8 +66,10 @@ export default class CyberTrajectory extends ui.view.CyberTheme.CyberTrajectoryU
#isEnd;
#trajectoryItems;
#talents;
#enableExtend;
init({propertyAllocate, talents}) {
init({propertyAllocate, talents, enableExtend}) {
this.#enableExtend = enableExtend;
this.boxParticle.visible = false;
this.boxSpeed.visible = true;
this.btnSummary.visible = false;
@@ -109,16 +111,16 @@ export default class CyberTrajectory extends ui.view.CyberTheme.CyberTrajectoryU
if(isEnd) {
this.boxSpeed.visible = false;
this.btnSummary.visible = true;
Laya.timer.frameOnce(1,this,()=>{
this.panelTrajectory.scrollTo(0, this.panelTrajectory.contentHeight);
});
}
this.panelTrajectory.scrollTo(0, this.panelTrajectory.contentHeight);
this.renderTrajectory(age, content);
if(age >= 100) {
this.boxParticle.visible = true;
}
Laya.timer.frameOnce(1, this, () => {
this.panelTrajectory.scrollTo(0, this.panelTrajectory.contentHeight);
});
this.updateProperty();
}
@@ -141,12 +143,12 @@ export default class CyberTrajectory extends ui.view.CyberTheme.CyberTrajectoryU
);
this.vboxTrajectory.addChild(item);
this.#trajectoryItems.push(item);
this.#trajectoryItems.forEach((item, index) => item.y = index);
item.y = this.vboxTrajectory.height;
}
onSummary() {
const talents = this.#talents;
$ui.switchView(UI.pages.SUMMARY, {talents});
$ui.switchView(UI.pages.SUMMARY, { talents, enableExtend: this.#enableExtend });
}
get speed() {

View File

@@ -0,0 +1,143 @@
export default class Celebrity extends ui.view.DefaultTheme.CelebrityUI {
constructor() {
super();
this.btnRetry.on(Laya.Event.CLICK, this, ()=>this.random());
this.btnNext.on(Laya.Event.CLICK, this, this.next);
this.panelCharacter.vScrollBar.elasticDistance = 150;
}
#selected;
static #createComponent = Laya.plugin.extractComponents(Celebrity.uiView, ['boxCharacter','boxTalent','boxUniqueUnGenerate']);
#createCharacterItem(dataSource, click) {
const {name, property, talent} = dataSource;
const style = $ui.common.characterItem;
const item = Celebrity.#createComponent('boxCharacter');
const vboxStates = item.getChildByName('vboxStates');
const boxName = item.getChildByName('boxName');
boxName.label = name;
const p = $_.clone(property);
for(const k in p)
if(Math.abs(p[k] - Math.PI) < 0.0000001)
p[k] = 'π';
vboxStates.label = $_.format($lang.F_PropertyStr, p);
$_.deepMapSet(boxName, style.name);
$_.deepMapSet(vboxStates, style.state);
for(const t of talent) {
const i = Celebrity.#createComponent('boxTalent');
i.label = $_.format($lang.F_TalentSelection, t);
i.y = vboxStates.height+vboxStates.space;
$_.deepMapSet(i, $ui.common.card[t.grade].normal);
vboxStates.addChild(i);
}
const box = new Laya.Box();
box.height = vboxStates.space;
box.y = vboxStates.height;
vboxStates.addChild(box);
vboxStates.scaleY = 0;
item.dataSource = dataSource;
item.switch = showDetails => vboxStates.scaleY = !!showDetails?1:0;
item.click = (cb, caller) => {
boxName.offAll(Laya.Event.CLICK);
boxName.on(Laya.Event.CLICK, caller || this, cb);
}
if(click) item.click(click);
return item;
}
#createUniqueUnGenerateItem(generate) {
const style = $ui.common.characterItem;
const item = Celebrity.#createComponent('boxUniqueUnGenerate');
const boxName = item.getChildByName('boxName');
const vboxStates = item.getChildByName('vboxStates');
const label = vboxStates.getChildByName('label');
const boxBtn = vboxStates.getChildByName('boxBtn');
const btn = boxBtn.getChildByName('btn');
$_.deepMapSet(boxName, style.name);
$_.deepMapSet(vboxStates, style.state);
$_.deepMapSet(btn, style.name);
boxBtn.y = label.height + vboxStates.space;
label.event(Laya.Event.RESIZE);
vboxStates.scaleY = 0;
item.dataSource = false;
item.switch = showDetails => vboxStates.scaleY = !!showDetails?1:0;
item.click = (cb, caller) => {
boxName.offAll(Laya.Event.CLICK);
boxName.on(Laya.Event.CLICK, caller || this, cb);
}
item.generate = (cb, caller) => {
btn.offAll(Laya.Event.CLICK);
btn.on(Laya.Event.CLICK, caller || this, cb);
}
if(generate) item.generate(generate);
return item;
}
init() {
this.random();
}
close() {
this.#selected = null;
this.vboxCharacter.destroyChildren(true);
}
random(g) {
this.#selected = null;
this.vboxCharacter.destroyChildren(true);
const {unique, normal} = core.characterRandom();
const items = [];
const uniqueItem = this.generateUnique(unique, ()=>{
core.generateUnique();
this.random(normal);
});
if(uniqueItem) items.push(uniqueItem);
(g||normal).forEach(character => items.push(this.#createCharacterItem(character)));
items.forEach((item, i) => {
item.y = i;
this.vboxCharacter.addChild(item);
item.click(()=>{
if(this.#selected) this.#selected.switch(false);
this.#selected = item;
item.switch(true);
item.event(Laya.Event.RESIZE);
})
});
if(g&&uniqueItem) {
this.#selected = uniqueItem;
uniqueItem.switch(true);
uniqueItem.event(Laya.Event.RESIZE);
}
}
generateUnique(data, generate) {
if(!data) return null;
if(!data.generate) return this.#createUniqueUnGenerateItem(generate);
data.name = $lang.UI_UniqueWaTaShi;
return this.#createCharacterItem(data);
}
next() {
if(!this.#selected) return $$event('message', ['M_PleaseSelectOne']);
if(!this.#selected.dataSource) return $$event('message', ['M_UnGenerate']);
const {property: propertyAllocate, talent: talents} = this.#selected.dataSource;
const replace = core.remake(talents.map(talent => talent.id));
if(replace.length > 0) {
$$event('message', [replace.map(v => ['F_TalentReplace', v])]);
}
$ui.switchView(
UI.pages.TRAJECTORY,
{
propertyAllocate, talents,
enableExtend: false,
}
);
}
}

View File

@@ -1,7 +1,7 @@
export default class Main extends ui.view.DefaultTheme.MainUI {
constructor() {
super();
this.btnRemake.on(Laya.Event.CLICK, this, ()=>$ui.switchView(UI.pages.TALENT));
this.btnRemake.on(Laya.Event.CLICK, this, ()=>$ui.switchView(UI.pages.MODE));
this.btnAchievement.on(Laya.Event.CLICK, this, ()=>$ui.switchView(UI.pages.ACHIEVEMENT));
this.btnThanks.on(Laya.Event.CLICK, this, ()=>$ui.switchView(UI.pages.THANKS));
this.btnGithub.on(Laya.Event.CLICK, this, goto, ['github']);
@@ -17,6 +17,7 @@ export default class Main extends ui.view.DefaultTheme.MainUI {
}
init() {
this.banner.visible =
this.btnDiscord.visible =
this.btnAchievement.visible =
this.btnThanks.visible = !!core.times;

View File

@@ -0,0 +1,7 @@
export default class Mode extends ui.view.DefaultTheme.ModeUI {
constructor() {
super();
this.btnCustom.on(Laya.Event.CLICK, this, ()=>$ui.switchView(UI.pages.TALENT));
this.btnCelebrity.on(Laya.Event.CLICK, this, ()=>$ui.switchView(UI.pages.CELEBRITY));
}
}

View File

@@ -67,6 +67,7 @@ export default class Property extends ui.view.DefaultTheme.PropertyUI {
{
propertyAllocate: this.#propertyAllocate,
talents: this.listSelectedTalents.array,
enableExtend: true,
}
);
}

View File

@@ -7,6 +7,7 @@ export default class Summary extends ui.view.DefaultTheme.SummaryUI {
}
#selectedTalent;
#enableExtend;
onAgain() {
core.talentExtend(this.#selectedTalent);
@@ -14,8 +15,9 @@ export default class Summary extends ui.view.DefaultTheme.SummaryUI {
$ui.switchView(UI.pages.MAIN);
}
init({talents}) {
init({talents, enableExtend}) {
const {summary, lastExtendTalent} = core;
this.#enableExtend = enableExtend;
this.listSummary.array = [
[core.PropertyTypes.HCHR, $lang.UI_Property_Charm],
@@ -38,7 +40,11 @@ export default class Summary extends ui.view.DefaultTheme.SummaryUI {
if(b == lastExtendTalent) return 1;
return bg - ag;
});
this.#selectedTalent = talents[0].id;
if(this.#enableExtend) {
this.#selectedTalent = talents[0].id;
} else {
this.#selectedTalent = lastExtendTalent;
}
this.listSelectedTalents.array = talents;
}
renderSummary(box) {
@@ -57,6 +63,9 @@ export default class Summary extends ui.view.DefaultTheme.SummaryUI {
}
onSelectTalent(talentId) {
if(!this.#enableExtend) {
return $$event('message', ['M_DisableExtendTalent']);
}
if(talentId == this.#selectedTalent) {
this.#selectedTalent = null;
} else {

View File

@@ -8,7 +8,6 @@ export default class Talent extends ui.view.DefaultTheme.TalentUI {
}
#selected = new Set();
init() {
this.pageDrawCard.visible = true;
this.pageResult.visible = false;
@@ -30,7 +29,7 @@ export default class Talent extends ui.view.DefaultTheme.TalentUI {
}
const talents = [...this.#selected].map(index => this.listTalents.array[index]);
$ui.switchView(UI.pages.PROPERTY, { talents });
$ui.switchView(UI.pages.PROPERTY, { talents, enableExtend: true });
}
renderTalent(box, index) {
@@ -55,7 +54,7 @@ export default class Talent extends ui.view.DefaultTheme.TalentUI {
if(this.#selected.size >= core.talentSelectLimit) {
return $$event('message', ['F_TalentSelectLimit', core.talentSelectLimit]);
}
const exclusive = core.exclusive(
const exclusive = core.exclude(
[...this.#selected].map(index => this.listTalents.array[index].id),
this.listTalents.array[index].id
);

Some files were not shown because too many files have changed in this diff Show More