Compare commits

..

68 Commits

Author SHA1 Message Date
90deaa84b4 Update Scenes and avatar/weapon colors 2023-08-22 22:40:33 +08:00
403cc3fe52 Add GC 1.7 2023-08-22 22:24:01 +08:00
dd4eb36c17 Update Banners from https://github.com/Zhaokugua/Grasscutter_Banners 2023-08-22 22:23:08 +08:00
2645e16bee Add Resources update tool 2023-08-22 22:17:47 +08:00
82668c4c6a Update All 4.0 Ids 2023-08-22 22:17:18 +08:00
8fce4a8995 Update 4.0 Ids(Activity/Dungeon/Weapon) 2023-08-22 00:16:35 +08:00
Deuteriunt
4cfbebcc5a Update Activity/Avatar/Weapon ids(CHS) (#202) 2023-08-20 14:57:40 +08:00
40db4236ba Add Commandline Usages 2023-08-02 18:06:43 +08:00
eef4687ed6 Clean up all code using CodeMaid 2023-08-02 17:43:01 +08:00
e9a3f4014e Remove debug code 2023-08-02 17:27:50 +08:00
749aae02ca Add GC v1.6.3 2023-08-02 17:26:14 +08:00
fc3fd10081 Add Server connection records (close #199) 2023-08-02 17:25:31 +08:00
65e664f35f Add shortcut keys Alt+[0~9] to switch pages (close #201) 2023-07-28 21:21:57 +08:00
ab9a617619 Allows setting individual key as HotKey 2023-07-25 21:17:02 +08:00
f629bc9993 Add HotKey Screenshot 2023-07-22 00:21:06 +08:00
dc7f48139e Update Command versions 2023-07-22 00:14:01 +08:00
da8c511d60 Update version to v1.11.0 2023-07-22 00:11:14 +08:00
eb60f402a4 Add Setting Upgrade 2023-07-22 00:11:01 +08:00
c82ce1ea35 Add HotKey Page (close #190) 2023-07-22 00:10:40 +08:00
9524ea5ab4 Update connection failure text (close #196) 2023-07-21 22:02:53 +08:00
caf18eaa7a Merge branch 'main' of https://github.com/jie65535/GrasscutterCommandGenerator 2023-07-21 21:41:20 +08:00
2cdcb4a599 Update spawn level maximum to 200 (close #198) 2023-07-21 21:41:00 +08:00
Deuteriunt
3407ca61fd Update 3.8 Activity ID (#195)
* main

* Update WeaponColor.txt

* Update 3.8 Activity ID and untranslated sentences

* Remove redundant changes

* Update Weapon.txt

---------

Co-authored-by: jie65535 <jie65535@qq.com>
2023-07-07 23:40:56 +08:00
964b7ced8b Merge pull request #194 from TomyJan/main
add new skins for custom command `All skins`
2023-06-28 21:02:20 +08:00
TomyJan
702267003b add new skins for custom command All skins 2023-06-28 20:52:20 +08:00
abf970b783 Update host url check 2023-06-26 22:56:32 +08:00
6855b6299f Add Kot key utils from https://github.com/jie65535/KeyGo 2023-06-18 18:19:51 +08:00
b77d242bd9 Update version to v1.10.1 2023-06-18 18:02:49 +08:00
01016b1fa1 Fix tips 2023-06-18 18:02:39 +08:00
b2b656b6cb Support for command line arguments (#155) 2023-06-18 18:02:02 +08:00
aabe6664b4 Update Cutscene translates(CHT) 2023-06-10 11:28:19 +08:00
馬良※チノ
5869a72645 Cutscenes translation (#189)
* 200201

* i forgot xd

* 区分渊下宫与三界路飨祭

* 踏鞴砂

* 沙漠书 激活小塔柱子

* 3.6小活动(风沙轰鸣) 打沙虫动画

* 甘露池

* i forget x2 xd

* idk x3 lmao

* Update Cutscene.txt
2023-06-10 10:11:11 +08:00
df3ab12165 Update Activity editor screenshots 2023-06-09 23:59:47 +08:00
03fe8909d0 Update Activity Translates 2023-06-09 23:54:10 +08:00
2ec4bc9333 Remove unused dependencies 2023-06-09 23:07:48 +08:00
c1b89a2b9a Update Tools page 2023-06-09 22:42:33 +08:00
6706525e77 Update Dungeon resources 2023-06-09 22:42:11 +08:00
981b8377d8 Add /troubleshoot to custom commands 2023-06-09 21:52:00 +08:00
945329d109 Link https://github.com/Zhaokugua/Grasscutter_Banners 2023-06-09 21:47:06 +08:00
304f3484e3 Update 3.7.2 banners from https://github.com/Zhaokugua/Grasscutter_Banners 2023-06-09 21:38:24 +08:00
47ad6dae6a Update Cutscene screenshot 2023-06-09 21:35:42 +08:00
0448bb0ea9 Update Cutscene Translates 2023-06-09 21:35:16 +08:00
moux23333
5009d148a1 Cutscenes translation 3 (#188) 2023-06-09 14:00:15 +08:00
馬良※チノ
8427103a7e Cutscenes translation 2 (#187)
* 116 117

* 75-86

* Update Cutscene.txt
2023-06-09 13:23:01 +08:00
2767cb44d7 Fix cutscene encoding 2023-06-09 00:18:57 +08:00
moux23333
416ffd6435 Cutscenes translation (#186)
* Cutscenes translation 1

* Cutscene translation 2
2023-06-08 23:52:41 +08:00
ff554ce369 Update PageScene localization 2023-06-08 22:52:27 +08:00
0698671c05 Update Cutscene.txt 2023-06-08 22:51:56 +08:00
67468cf28b Throw ping exception 2023-06-08 21:21:03 +08:00
058a6b7ab2 Update version to v1.10.0 2023-06-08 21:19:36 +08:00
1ccb3656c2 Add Cutscene command to Scene page 2023-06-08 21:19:26 +08:00
6da7e1d4d0 Fix Artifact MainAttribution changes without refreshing 2023-05-30 20:20:18 +08:00
119c8c87ee Remove temp file 2023-05-30 20:03:23 +08:00
2758b4d896 Update version to v1.9.1 2023-05-30 19:58:31 +08:00
d8c7f0ad56 Update 3.7 Resources 2023-05-30 19:58:00 +08:00
0d8b51f199 Update PageAbout.resx 2023-05-29 20:12:52 +08:00
6e296edf11 Update README.md 2023-05-29 20:08:18 +08:00
072066ac87 Update README_zh-tw.md 2023-05-29 20:08:08 +08:00
a359dea603 Update README_zh-cn.md 2023-05-29 20:07:56 +08:00
29decd4899 Update README.md 2023-05-29 20:06:44 +08:00
92a5d53d35 Update 3.7 first half banners from https://github.com/Zhaokugua/Grasscutter_Banners 2023-05-25 19:25:29 +08:00
40e33dcb1c Update All activity ids-3.7 from https://github.com/dplek/Genshin-Activity-ids 2023-05-25 19:23:00 +08:00
Deuteriunt
2b2757ccff Add 3.7 Avatar and Weapon id (#182)
* main

* Update WeaponColor.txt

---------

Co-authored-by: jie65535 <jie65535@qq.com>
2023-05-25 12:39:44 +08:00
f57f4097ac Fix UI issue 2023-05-14 19:05:42 +08:00
5865441074 Fix activity id not set 2023-05-14 18:54:03 +08:00
2d916392c1 Fix CHS and CHT Achievement 2023-05-14 18:52:50 +08:00
dec3b2261f Fix Activity add issue 2023-05-14 18:52:25 +08:00
5b0cb912e4 Fix null ptr 2023-05-14 18:33:37 +08:00
160 changed files with 38536 additions and 14419 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 48 KiB

View File

@@ -5,7 +5,7 @@
[![Github All Releases](https://img.shields.io/github/downloads/jie65535/GrasscutterCommandGenerator/total.svg)](https://github.com/jie65535/GrasscutterCommandGenerator/releases)
[![GitHub release](https://img.shields.io/github/v/release/jie65535/GrasscutterCommandGenerator)](https://github.com/jie65535/GrasscutterCommandGenerator/releases/latest)
[![Build](https://github.com/jie65535/GrasscutterCommandGenerator/actions/workflows/build.yml/badge.svg)](https://github.com/jie65535/GrasscutterCommandGenerator/actions/workflows/build.yml)
[![QQ Group](https://pub.idqqimg.com/wpa/images/group.png)](https://qm.qq.com/cgi-bin/qm/qr?k=PdS9--b-n8LEAmYjX8fNFXtKDcsp4NHN&jump_from=webapi&authKey=7ty3ZCKYMKLGWLmO8O84qiNAZ0EuCnSGF+acP+74xuDMKYXXNjuPP7iUzffHz4r2)
[![QQ Group](https://pub.idqqimg.com/wpa/images/group.png)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=fBizzp6RwJsIY7gFlmd4L-WG0V3aF8X3&authKey=mTjf%2B7jCIZess1HTRi05e5yi%2FHKA1auMwE8%2FJ960PFWk8WMATST654gWPi4OTHTZ&noverify=0&group_code=835489603)
English | [简体中文](README_zh-cn.md) | [繁體中文](README_zh-tw.md) | [Русский](README_ru-RU.md)
@@ -17,8 +17,40 @@ Support 简体中文, 繁體中文, English and Русский languages.
> **Warning**: app look may be different rather than on screenshots. It may also contain translation errors and a lack of certain resources. **We're welcome everyone to contribute to their [improvement](/Source/GrasscutterTools/Resources/en-us)**
## Remote command
The server require [gc-opencommand-plugin](https://github.com/jie65535/gc-opencommand-plugin) support
![OpenCommand](Doc/Screenshots/OpenCommand.gif)
> If you cannot connect to the server, please make sure the server address is correct.
>
> It is recommended to configure the server to HTTP mode, as shown in the figure(config.json):
> ![ConfigHttp](Doc/Screenshots/ConfigHttp.png)
>
> You can visit http://127.0.0.1/status/server with a browser to test whether the service is working properly.
>
> If you are not using port `80`, specify the port number to access in the url: http://127.0.0.1:443
## Update log
### GrasscutterTools-v1.11
![HotKey](Doc/Screenshots-en/21-HotKey.png)
Commandline Usages:
```bash
GcTools.exe -help
GcTools.exe -version
GcTools.exe -c "cmd arg"
GcTools.exe -c "cmd1 arg" && GcTools -c "cmd2 arg1 arg2"
GcTools.exe -host http://127.0.0.1:443 -token 123456 -c "cmd1 arg1 arg2 | cmd2 | cmd3 arg"
```
### GrasscutterTools-v1.10
![Cutscene](Doc/Screenshots-en/7-ChangeScene.png)
![Activity Editor](Doc/Screenshots-en/20-ActivityEditor.png)
### GrasscutterTools-v1.9
![Achievement Page](Doc/Screenshots-en/19-AchievementPage.png)
@@ -46,21 +78,6 @@ Added [AttackModifier](https://github.com/NotThorny/AttackModifier), [AttackInfu
![Mail Editor](Doc/Screenshots-en/16-MailEditor.png)
## Remote command
The server require [gc-opencommand-plugin](https://github.com/jie65535/gc-opencommand-plugin) support
![OpenCommand](Doc/Screenshots/OpenCommand.gif)
> If you cannot connect to the server, please make sure the server address is correct.
>
> It is recommended to configure the server to HTTP mode, as shown in the figure(config.json):
> ![ConfigHttp](Doc/Screenshots/ConfigHttp.png)
>
> You can visit http://127.0.0.1/status/server with a browser to test whether the service is working properly.
>
> If you are not using port `80`, specify the port number to access in the url: http://127.0.0.1:443
---

View File

@@ -16,8 +16,42 @@ GCG поддерживает 简体中文 (китайский упр.), 繁體
> **Warning**: вид приложения может отличаться от скриншотов. Также в нём могут присутствовать ошибки в переводе и отсутсвие некоторых ресурсов. **Мы приглашаем всех сделать вклад в их [улучшение](/Source/GrasscutterTools/Resources/ru-ru)**
## Удаленная команда (OpenCommand)
Чтобы использовать команды прямо из GCG, серверу требуется плагин [gc-opencommand-plugin](https://github.com/jie65535/gc-opencommand-plugin).
![Open Command](Doc/Screenshots/OpenCommand.gif)
> Если вы не можете подключиться к серверу, проверьте правильность написания его URL-адреса.
>
> Рекомендуется изменить секцию HTTP в конфиге как на скриншоте ниже (конфиг - файл config.json):
>
> ![ConfigHttp](Doc/Screenshots/ConfigHttp.png)
>
> Для проверки можете посетить http://127.0.0.1/status/server в браузере, чтобы проверить работоспособность OpenCommand.
>
> Если вы не указали порт `80` в конфиге, вам нужно указать свой порт в URL-адресе (например, http://127.0.0.1:443)
## Лог обновлений
### GrasscutterTools-v1.11
![HotKey](Doc/Screenshots-en/21-HotKey.png)
Commandline Usages:
```bash
GcTools.exe -help
GcTools.exe -version
GcTools.exe -c "cmd arg"
GcTools.exe -c "cmd1 arg" && GcTools -c "cmd2 arg1 arg2"
GcTools.exe -host http://127.0.0.1:443 -token 123456 -c "cmd1 arg1 arg2 | cmd2 | cmd3 arg"
```
### GrasscutterTools-v1.10
![Cutscene](Doc/Screenshots-ru/12-Scenes.png)
![Activity Editor](Doc/Screenshots-ru/20-ActivityEditor.png)
### GrasscutterTools-v1.9
![Achievement Page](Doc/Screenshots-ru/19-AchievementPage.png)
@@ -45,22 +79,6 @@ GCG поддерживает 简体中文 (китайский упр.), 繁體
![Редактор писем](Doc/Screenshots-ru/10-Mail.png)
## Удаленная команда (OpenCommand)
Чтобы использовать команды прямо из GCG, серверу требуется плагин [gc-opencommand-plugin](https://github.com/jie65535/gc-opencommand-plugin).
![Open Command](Doc/Screenshots/OpenCommand.gif)
> Если вы не можете подключиться к серверу, проверьте правильность написания его URL-адреса.
>
> Рекомендуется изменить секцию HTTP в конфиге как на скриншоте ниже (конфиг - файл config.json):
>
> ![ConfigHttp](Doc/Screenshots/ConfigHttp.png)
>
> Для проверки можете посетить http://127.0.0.1/status/server в браузере, чтобы проверить работоспособность OpenCommand.
>
> Если вы не указали порт `80` в конфиге, вам нужно указать свой порт в URL-адресе (например, http://127.0.0.1:443)
---
## Скриншоты

View File

@@ -5,7 +5,7 @@
[![Github All Releases](https://img.shields.io/github/downloads/jie65535/GrasscutterCommandGenerator/total.svg)](https://github.com/jie65535/GrasscutterCommandGenerator/releases)
[![GitHub release](https://img.shields.io/github/v/release/jie65535/GrasscutterCommandGenerator)](https://github.com/jie65535/GrasscutterCommandGenerator/releases/latest)
[![Build](https://github.com/jie65535/GrasscutterCommandGenerator/actions/workflows/build.yml/badge.svg)](https://github.com/jie65535/GrasscutterCommandGenerator/actions/workflows/build.yml)
[![QQ Group](https://pub.idqqimg.com/wpa/images/group.png)](https://qm.qq.com/cgi-bin/qm/qr?k=PdS9--b-n8LEAmYjX8fNFXtKDcsp4NHN&jump_from=webapi&authKey=7ty3ZCKYMKLGWLmO8O84qiNAZ0EuCnSGF+acP+74xuDMKYXXNjuPP7iUzffHz4r2)
[![QQ Group](https://pub.idqqimg.com/wpa/images/group.png)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=fBizzp6RwJsIY7gFlmd4L-WG0V3aF8X3&authKey=mTjf%2B7jCIZess1HTRi05e5yi%2FHKA1auMwE8%2FJ960PFWk8WMATST654gWPi4OTHTZ&noverify=0&group_code=835489603)
[English](README.md) | 简体中文 | [繁體中文](README_zh-tw.md) | [Русский](README_ru-RU.md)
@@ -17,7 +17,40 @@
> **Warning**: 应用程序的外观可能与截图上的不同。它也可能包含翻译错误和缺乏某些资源。**我们欢迎各位为此工具做出贡献并<a href="./Source/GrasscutterTools/Resources/zh-cn">改进</a> : )**
## Update log
## 远程执行
服务端需要 [gc-opencommand-plugin](https://github.com/jie65535/gc-opencommand-plugin) 插件支持
![OpenCommand](Doc/Screenshots/OpenCommand.gif)
> 如果你无法连接到服务器,请确认填写的服务器地址是否正确。
>
> 建议配置服务器为HTTP模式如图所示(config.json)
> ![ConfigHttp](Doc/Screenshots/ConfigHttp.png)
>
> 你可以用浏览器访问 http://127.0.0.1/status/server 来测试服务是否正常工作。
>
> 如果使用的不是`80`端口则要在url中指定访问的端口号http://127.0.0.1:443
## 更新概要
### GrasscutterTools-v1.11
![HotKey](Doc/Screenshots/21-HotKey.png)
命令行用法:
```bash
GcTools.exe -help
GcTools.exe -version
GcTools.exe -c "cmd arg"
GcTools.exe -c "cmd1 arg" && GcTools -c "cmd2 arg1 arg2"
GcTools.exe -host http://127.0.0.1:443 -token 123456 -c "cmd1 arg1 arg2 | cmd2 | cmd3 arg"
```
### GrasscutterTools-v1.10
![Cutscene](Doc/Screenshots/7-ChangeScene.png)
![Activity Editor](Doc/Screenshots/20-ActivityEditor.png)
### GrasscutterTools-v1.9
![Achievement Page](Doc/Screenshots/19-AchievementPage.png)
@@ -50,21 +83,6 @@
![Mail Editor](Doc/Screenshots/16-MailEditor.png)
## 远程执行
服务端需要 [gc-opencommand-plugin](https://github.com/jie65535/gc-opencommand-plugin) 插件支持
![OpenCommand](Doc/Screenshots/OpenCommand.gif)
> 如果你无法连接到服务器,请确认填写的服务器地址是否正确。
>
> 建议配置服务器为HTTP模式如图所示(config.json)
> ![ConfigHttp](Doc/Screenshots/ConfigHttp.png)
>
> 你可以用浏览器访问 http://127.0.0.1/status/server 来测试服务是否正常工作。
>
> 如果使用的不是`80`端口则要在url中指定访问的端口号http://127.0.0.1:443
---
## 软件截图

View File

@@ -5,7 +5,7 @@
[![Github All Releases](https://img.shields.io/github/downloads/jie65535/GrasscutterCommandGenerator/total.svg)](https://github.com/jie65535/GrasscutterCommandGenerator/releases)
[![GitHub release](https://img.shields.io/github/v/release/jie65535/GrasscutterCommandGenerator)](https://github.com/jie65535/GrasscutterCommandGenerator/releases/latest)
[![Build](https://github.com/jie65535/GrasscutterCommandGenerator/actions/workflows/build.yml/badge.svg)](https://github.com/jie65535/GrasscutterCommandGenerator/actions/workflows/build.yml)
[![QQ Group](https://pub.idqqimg.com/wpa/images/group.png)](https://qm.qq.com/cgi-bin/qm/qr?k=PdS9--b-n8LEAmYjX8fNFXtKDcsp4NHN&jump_from=webapi&authKey=7ty3ZCKYMKLGWLmO8O84qiNAZ0EuCnSGF+acP+74xuDMKYXXNjuPP7iUzffHz4r2)
[![QQ Group](https://pub.idqqimg.com/wpa/images/group.png)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=fBizzp6RwJsIY7gFlmd4L-WG0V3aF8X3&authKey=mTjf%2B7jCIZess1HTRi05e5yi%2FHKA1auMwE8%2FJ960PFWk8WMATST654gWPi4OTHTZ&noverify=0&group_code=835489603)
[English](README.md) | [简体中文](README_zh-cn.md) | 繁體中文 | [Русский](README_ru-RU.md)
@@ -17,8 +17,40 @@
> **Warning**: 程式中的實際外觀可能會與截圖中的內容不同。其中也可能包含翻譯錯誤及缺乏特定資源。**我們歡迎各位為此工具做出貢獻並[改進](/Source/GrasscutterTools/Resources/zh-tw)**
## 遠端控制
伺服器需要安裝 [gc-opencommand-plugin](https://github.com/jie65535/gc-opencommand-plugin) 插件
![OpenCommand](Doc/Screenshots-tw/OpenCommand.gif)
> 如果你無法連接至伺服器,請確認輸入的伺服器位址是否正確。
>
> 建議將伺服器調整為HTTP模式如下圖所示(config.json):
> ![ConfigHttp](Doc/Screenshots-tw/ConfigHttp.png)
>
> 你可藉由任何瀏覽器輸入網址 http://127.0.0.1/status/server 以測試伺服器是否正常運作。
>
> 如果你並非使用`80`端口, 則須在網址後輸入指定端口: http://127.0.0.1:443
## 更新日誌
### GrasscutterTools-v1.11
![HotKey](Doc/Screenshots/21-HotKey.png)
Commandline Usages:
```bash
GcTools.exe -help
GcTools.exe -version
GcTools.exe -c "cmd arg"
GcTools.exe -c "cmd1 arg" && GcTools -c "cmd2 arg1 arg2"
GcTools.exe -host http://127.0.0.1:443 -token 123456 -c "cmd1 arg1 arg2 | cmd2 | cmd3 arg"
```
### GrasscutterTools-v1.10
![Cutscene](Doc/Screenshots-tw/7-ChangeScene.png)
![Activity Editor](Doc/Screenshots-tw/20-ActivityEditor.png)
### GrasscutterTools-v1.9
![Achievement Page](Doc/Screenshots-tw/19-AchievementPage.png)
@@ -50,21 +82,6 @@
![Mail Editor](Doc/Screenshots-tw/16-MailEditor.png)
## 遠端控制
伺服器需要安裝 [gc-opencommand-plugin](https://github.com/jie65535/gc-opencommand-plugin) 插件
![OpenCommand](Doc/Screenshots-tw/OpenCommand.gif)
> 如果你無法連接至伺服器,請確認輸入的伺服器位址是否正確。
>
> 建議將伺服器調整為HTTP模式如下圖所示(config.json):
> ![ConfigHttp](Doc/Screenshots-tw/ConfigHttp.png)
>
> 你可藉由任何瀏覽器輸入網址 http://127.0.0.1/status/server 以測試伺服器是否正常運作。
>
> 如果你並非使用`80`端口, 則須在網址後輸入指定端口: http://127.0.0.1:443
---

View File

@@ -70,6 +70,12 @@
<setting name="ActivityConfigJsonPath" serializeAs="String">
<value />
</setting>
<setting name="ProjectResourcePath" serializeAs="String">
<value />
</setting>
<setting name="IsUpgraded" serializeAs="String">
<value>False</value>
</setting>
</GrasscutterTools.Properties.Settings>
</userSettings>
</configuration>

View File

@@ -36,7 +36,7 @@ namespace GrasscutterTools.Forms
{
#region - -
private List<ActivityConfigItem> ActivityConfigItems;
private List<ActivityConfigItem> ActivityConfigItems = new List<ActivityConfigItem>();
#endregion - -
@@ -231,19 +231,22 @@ namespace GrasscutterTools.Forms
private async void BtnAddOrUpdate_Click(object sender, EventArgs e)
{
var activityId = (int)NUDActivityId.Value;
var isNew = false;
var item = ActivityConfigItems.Find(it => it.ActivityId == activityId);
if (item == null)
{
item = new ActivityConfigItem();
ActivityConfigItems.Add(item);
ListActivityConfigItems.Items.Add(Convert(item));
isNew = true;
}
item.ActivityId = activityId;
item.ActivityType = (int)NUDActivityType.Value;
item.ScheduleId = (int)NUDScheduleId.Value;
try
{
item.MeetCondList = TxtMeetCondList.Text.Split(',').Select(it => int.Parse(it.Trim())).ToList();
item.MeetCondList = !string.IsNullOrEmpty(TxtMeetCondList.Text)
? TxtMeetCondList.Text.Split(',').Select(it => int.Parse(it.Trim())).ToList()
: new List<int>();
}
catch (Exception)
{
@@ -258,6 +261,12 @@ namespace GrasscutterTools.Forms
item.BeginTime = DTPBeginTime.Value.Date;
item.EndTime = DTPEndTime.Value.Date.AddDays(1).AddSeconds(-1);
if (isNew)
{
ActivityConfigItems.Add(item);
ListActivityConfigItems.Items.Add(Convert(item));
}
BtnDelete.Enabled = true;
await UIUtil.ButtonComplete(BtnAddOrUpdate);
}

View File

@@ -30,10 +30,10 @@ namespace GrasscutterTools.Forms
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormGachaBannersEditor3));
System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea9 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
System.Windows.Forms.DataVisualization.Charting.Legend legend9 = new System.Windows.Forms.DataVisualization.Charting.Legend();
System.Windows.Forms.DataVisualization.Charting.Series series17 = new System.Windows.Forms.DataVisualization.Charting.Series();
System.Windows.Forms.DataVisualization.Charting.Series series18 = new System.Windows.Forms.DataVisualization.Charting.Series();
System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea2 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
System.Windows.Forms.DataVisualization.Charting.Legend legend2 = new System.Windows.Forms.DataVisualization.Charting.Legend();
System.Windows.Forms.DataVisualization.Charting.Series series3 = new System.Windows.Forms.DataVisualization.Charting.Series();
System.Windows.Forms.DataVisualization.Charting.Series series4 = new System.Windows.Forms.DataVisualization.Charting.Series();
this.GrpBannerValues = new System.Windows.Forms.GroupBox();
this.BtnAddOrUpdate = new System.Windows.Forms.Button();
this.CmbTitlePath = new System.Windows.Forms.ComboBox();
@@ -59,7 +59,6 @@ namespace GrasscutterTools.Forms
this.LblSortId = new System.Windows.Forms.Label();
this.NUDGachaType = new System.Windows.Forms.NumericUpDown();
this.NUDSortId = new System.Windows.Forms.NumericUpDown();
this.LblGachaTypeTip = new System.Windows.Forms.Label();
this.LblEndTime = new System.Windows.Forms.Label();
this.LblScheduleId = new System.Windows.Forms.Label();
this.LblBeginTime = new System.Windows.Forms.Label();
@@ -93,6 +92,7 @@ namespace GrasscutterTools.Forms
this.LblPoolWeight5 = new System.Windows.Forms.Label();
this.ChartWeights = new System.Windows.Forms.DataVisualization.Charting.Chart();
this.GrpBanners = new System.Windows.Forms.GroupBox();
this.LnkCheckLatestBanners = new System.Windows.Forms.LinkLabel();
this.ListBanners = new System.Windows.Forms.ListBox();
this.FLPBannersControl = new System.Windows.Forms.FlowLayoutPanel();
this.BtnDelete = new System.Windows.Forms.Button();
@@ -145,7 +145,6 @@ namespace GrasscutterTools.Forms
this.GrpBannerValues.Controls.Add(this.LblSortId);
this.GrpBannerValues.Controls.Add(this.NUDGachaType);
this.GrpBannerValues.Controls.Add(this.NUDSortId);
this.GrpBannerValues.Controls.Add(this.LblGachaTypeTip);
this.GrpBannerValues.Controls.Add(this.LblEndTime);
this.GrpBannerValues.Controls.Add(this.LblScheduleId);
this.GrpBannerValues.Controls.Add(this.LblBeginTime);
@@ -345,11 +344,6 @@ namespace GrasscutterTools.Forms
0,
0});
//
// LblGachaTypeTip
//
resources.ApplyResources(this.LblGachaTypeTip, "LblGachaTypeTip");
this.LblGachaTypeTip.Name = "LblGachaTypeTip";
//
// LblEndTime
//
resources.ApplyResources(this.LblEndTime, "LblEndTime");
@@ -569,44 +563,52 @@ namespace GrasscutterTools.Forms
// ChartWeights
//
resources.ApplyResources(this.ChartWeights, "ChartWeights");
chartArea9.AxisX.Minimum = 0D;
chartArea9.AxisY.Maximum = 100D;
chartArea9.AxisY.Minimum = 0D;
chartArea9.AxisY.Title = "%";
chartArea9.Name = "ChartArea1";
this.ChartWeights.ChartAreas.Add(chartArea9);
legend9.Name = "Legend1";
this.ChartWeights.Legends.Add(legend9);
chartArea2.AxisX.Minimum = 0D;
chartArea2.AxisY.Maximum = 100D;
chartArea2.AxisY.Minimum = 0D;
chartArea2.AxisY.Title = "%";
chartArea2.Name = "ChartArea1";
this.ChartWeights.ChartAreas.Add(chartArea2);
legend2.Name = "Legend1";
this.ChartWeights.Legends.Add(legend2);
this.ChartWeights.Name = "ChartWeights";
series17.ChartArea = "ChartArea1";
series17.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
series17.Color = System.Drawing.Color.OrangeRed;
series17.Label = "(#VALX, #VAL)";
series17.Legend = "Legend1";
series17.LegendText = "5*";
series17.Name = "SeriesWeight5";
series17.XValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Int32;
series17.YValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Double;
series18.ChartArea = "ChartArea1";
series18.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
series18.Color = System.Drawing.Color.Purple;
series18.Label = "(#VALX, #VAL)";
series18.Legend = "Legend1";
series18.LegendText = "4*";
series18.Name = "SeriesWeight4";
series18.XValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Int32;
series18.YValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Double;
this.ChartWeights.Series.Add(series17);
this.ChartWeights.Series.Add(series18);
series3.ChartArea = "ChartArea1";
series3.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
series3.Color = System.Drawing.Color.OrangeRed;
series3.Label = "(#VALX, #VAL)";
series3.Legend = "Legend1";
series3.LegendText = "5*";
series3.Name = "SeriesWeight5";
series3.XValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Int32;
series3.YValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Double;
series4.ChartArea = "ChartArea1";
series4.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
series4.Color = System.Drawing.Color.Purple;
series4.Label = "(#VALX, #VAL)";
series4.Legend = "Legend1";
series4.LegendText = "4*";
series4.Name = "SeriesWeight4";
series4.XValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Int32;
series4.YValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Double;
this.ChartWeights.Series.Add(series3);
this.ChartWeights.Series.Add(series4);
//
// GrpBanners
//
resources.ApplyResources(this.GrpBanners, "GrpBanners");
this.GrpBanners.Controls.Add(this.LnkCheckLatestBanners);
this.GrpBanners.Controls.Add(this.ListBanners);
this.GrpBanners.Controls.Add(this.FLPBannersControl);
this.GrpBanners.Name = "GrpBanners";
this.GrpBanners.TabStop = false;
//
// LnkCheckLatestBanners
//
resources.ApplyResources(this.LnkCheckLatestBanners, "LnkCheckLatestBanners");
this.LnkCheckLatestBanners.Name = "LnkCheckLatestBanners";
this.LnkCheckLatestBanners.TabStop = true;
this.LnkCheckLatestBanners.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LnkCheckLatestBanners_LinkClicked);
//
// ListBanners
//
resources.ApplyResources(this.ListBanners, "ListBanners");
@@ -693,6 +695,7 @@ namespace GrasscutterTools.Forms
this.GrpBalance.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.ChartWeights)).EndInit();
this.GrpBanners.ResumeLayout(false);
this.GrpBanners.PerformLayout();
this.FLPBannersControl.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
@@ -708,7 +711,6 @@ namespace GrasscutterTools.Forms
private System.Windows.Forms.Label LblSortId;
private System.Windows.Forms.NumericUpDown NUDGachaType;
private System.Windows.Forms.NumericUpDown NUDSortId;
private System.Windows.Forms.Label LblGachaTypeTip;
private System.Windows.Forms.Label LblEndTime;
private System.Windows.Forms.Label LblScheduleId;
private System.Windows.Forms.Label LblBeginTime;
@@ -767,5 +769,6 @@ namespace GrasscutterTools.Forms
private System.Windows.Forms.ComboBox CmbTitlePath;
private System.Windows.Forms.Label LblTitlePath;
private System.Windows.Forms.Button BtnClear;
private System.Windows.Forms.LinkLabel LnkCheckLatestBanners;
}
}

View File

@@ -28,6 +28,7 @@ using System.Windows.Forms;
using GrasscutterTools.Game;
using GrasscutterTools.Game.Gacha;
using GrasscutterTools.Properties;
using GrasscutterTools.Utils;
using Newtonsoft.Json;
@@ -259,6 +260,11 @@ namespace GrasscutterTools.Forms
#region - -
private void LnkCheckLatestBanners_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
UIUtil.OpenURL("https://github.com/Zhaokugua/Grasscutter_Banners");
}
private void InitCheckedListBoxs()
{
ListFallbackItems.BeginUpdate();

View File

@@ -206,12 +206,6 @@
<data name="LblSortId.Text" xml:space="preserve">
<value>Sort</value>
</data>
<data name="LblGachaTypeTip.Size" type="System.Drawing.Size, System.Drawing">
<value>123, 17</value>
</data>
<data name="LblGachaTypeTip.Text" xml:space="preserve">
<value>Increment from 400</value>
</data>
<data name="LblEndTime.Size" type="System.Drawing.Size, System.Drawing">
<value>62, 17</value>
</data>
@@ -443,6 +437,15 @@
<data name="GrpBanners.Text" xml:space="preserve">
<value>Banners</value>
</data>
<data name="LnkCheckLatestBanners.Location" type="System.Drawing.Point, System.Drawing">
<value>141, -1</value>
</data>
<data name="LnkCheckLatestBanners.Size" type="System.Drawing.Size, System.Drawing">
<value>129, 17</value>
</data>
<data name="LnkCheckLatestBanners.Text" xml:space="preserve">
<value>Check latest Banners</value>
</data>
<data name="BtnDelete.Text" xml:space="preserve">
<value>Delete</value>
</data>

View File

@@ -144,6 +144,9 @@
<data name="&gt;&gt;ChkRemoveC6FormPool.Type" xml:space="preserve">
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="LblEventChance4.Text" xml:space="preserve">
<value>4星活动爆率</value>
</data>
<data name="&gt;&gt;DTPEndTime.Parent" xml:space="preserve">
<value>GrpBannerValues</value>
</data>
@@ -166,25 +169,25 @@
<value>34, 28</value>
</data>
<data name="&gt;&gt;LblSortIdTip.ZOrder" xml:space="preserve">
<value>31</value>
<value>30</value>
</data>
<data name="ColUpId.Width" type="System.Int32, mscorlib">
<value>65</value>
</data>
<data name="&gt;&gt;LblGachaTypeTip.ZOrder" xml:space="preserve">
<value>24</value>
</data>
<data name="LblCostItemAmount1.Text" xml:space="preserve">
<value>单抽消耗</value>
</data>
<data name="&gt;&gt;LblSortIdTip.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LnkCheckLatestBanners.Parent" xml:space="preserve">
<value>GrpBanners</value>
</data>
<data name="LblCostItem.Size" type="System.Drawing.Size, System.Drawing">
<value>56, 17</value>
</data>
<data name="&gt;&gt;NUDEventChance5.Name" xml:space="preserve">
<value>NUDEventChance5</value>
<data name="GrpBannerValues.Text" xml:space="preserve">
<value>卡池参数</value>
</data>
<data name="&gt;&gt;NUDGachaType.Type" xml:space="preserve">
<value>System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
@@ -222,8 +225,8 @@
<data name="&gt;&gt;LblBeginTime.Name" xml:space="preserve">
<value>LblBeginTime</value>
</data>
<data name="&gt;&gt;ColUpName.Name" xml:space="preserve">
<value>ColUpName</value>
<data name="LnkCheckLatestBanners.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="ListBanners.Size" type="System.Drawing.Size, System.Drawing">
<value>270, 512</value>
@@ -246,6 +249,9 @@
<data name="LblCostItem.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="&gt;&gt;LnkCheckLatestBanners.Type" xml:space="preserve">
<value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="ListFallbackItems.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
@@ -343,9 +349,6 @@
<data name="GrpBalance.Location" type="System.Drawing.Point, System.Drawing">
<value>294, 504</value>
</data>
<data name="&gt;&gt;GrpWeights.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="RbCostItem223.Text" xml:space="preserve">
<value>纠缠之缘</value>
</data>
@@ -385,6 +388,9 @@
<data name="&gt;&gt;LblBannersJson.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LnkCheckLatestBanners.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="&gt;&gt;BtnClear.Name" xml:space="preserve">
<value>BtnClear</value>
</data>
@@ -400,8 +406,11 @@
<data name="LblWeight5.Location" type="System.Drawing.Point, System.Drawing">
<value>55, 32</value>
</data>
<data name="NUDEventChance5.Size" type="System.Drawing.Size, System.Drawing">
<value>63, 23</value>
</data>
<data name="&gt;&gt;LblScheduleIdTip.ZOrder" xml:space="preserve">
<value>29</value>
<value>28</value>
</data>
<data name="ChkRemoveC6FormPool.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
@@ -439,8 +448,8 @@
<data name="TxtWeight4.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 23</value>
</data>
<data name="&gt;&gt;NUDGachaType.ZOrder" xml:space="preserve">
<value>22</value>
<data name="&gt;&gt;LnkOpenOldEditor.Type" xml:space="preserve">
<value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;NUDCostItemAmount10.Parent" xml:space="preserve">
<value>GrpBannerValues</value>
@@ -466,6 +475,9 @@
<data name="&gt;&gt;ListBanners.Type" xml:space="preserve">
<value>System.Windows.Forms.ListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BtnLoad.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="LblCostItemAmount10.TabIndex" type="System.Int32, mscorlib">
<value>17</value>
</data>
@@ -559,6 +571,9 @@
<data name="&gt;&gt;LblCostItemAmount10.Name" xml:space="preserve">
<value>LblCostItemAmount10</value>
</data>
<data name="BtnSave.Text" xml:space="preserve">
<value>保存</value>
</data>
<data name="LblCostItemAmount1.TabIndex" type="System.Int32, mscorlib">
<value>15</value>
</data>
@@ -579,7 +594,7 @@
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblBeginTime.ZOrder" xml:space="preserve">
<value>27</value>
<value>26</value>
</data>
<data name="&gt;&gt;NUDSortId.Name" xml:space="preserve">
<value>NUDSortId</value>
@@ -632,7 +647,7 @@
<value>ChartWeights</value>
</data>
<data name="&gt;&gt;RbCostItem224.ZOrder" xml:space="preserve">
<value>33</value>
<value>32</value>
</data>
<data name="GrpUpPool.Size" type="System.Drawing.Size, System.Drawing">
<value>210, 351</value>
@@ -653,7 +668,7 @@
<value>740, 401</value>
</data>
<data name="&gt;&gt;FLPBannersControl.ZOrder" xml:space="preserve">
<value>1</value>
<value>2</value>
</data>
<data name="&gt;&gt;FLPBannersControl.Type" xml:space="preserve">
<value>System.Windows.Forms.FlowLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
@@ -673,6 +688,9 @@
<data name="LnkWeightHelp.Location" type="System.Drawing.Point, System.Drawing">
<value>402, 0</value>
</data>
<data name="&gt;&gt;NUDGachaType.ZOrder" xml:space="preserve">
<value>22</value>
</data>
<data name="&gt;&gt;LblOptions.ZOrder" xml:space="preserve">
<value>8</value>
</data>
@@ -691,8 +709,8 @@
<data name="BtnDelete.Size" type="System.Drawing.Size, System.Drawing">
<value>100, 23</value>
</data>
<data name="&gt;&gt;BtnDelete.Name" xml:space="preserve">
<value>BtnDelete</value>
<data name="GrpFallbackPool.Location" type="System.Drawing.Point, System.Drawing">
<value>962, 41</value>
</data>
<data name="LblWeight5.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
@@ -718,20 +736,20 @@
<data name="LblOptions.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblGachaTypeTip.Size" type="System.Drawing.Size, System.Drawing">
<value>125, 17</value>
</data>
<data name="BtnAddOrUpdate.Text" xml:space="preserve">
<value>√ 添加或更新</value>
</data>
<data name="NUDCostItemAmount10.Size" type="System.Drawing.Size, System.Drawing">
<value>110, 23</value>
</data>
<data name="&gt;&gt;NUDEventChance5.Name" xml:space="preserve">
<value>NUDEventChance5</value>
</data>
<data name="CmbPrefab.TabIndex" type="System.Int32, mscorlib">
<value>9</value>
</data>
<data name="GrpFallbackPool.Location" type="System.Drawing.Point, System.Drawing">
<value>962, 41</value>
<data name="&gt;&gt;GrpWeights.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="&gt;&gt;ListFallbackItems.Name" xml:space="preserve">
<value>ListFallbackItems</value>
@@ -761,7 +779,7 @@
<value>204, 329</value>
</data>
<data name="&gt;&gt;LblPrefabPath.ZOrder" xml:space="preserve">
<value>35</value>
<value>34</value>
</data>
<data name="&gt;&gt;LblSortIdTip.Name" xml:space="preserve">
<value>LblSortIdTip</value>
@@ -779,7 +797,7 @@
<value>29</value>
</data>
<data name="&gt;&gt;LblCostItem.ZOrder" xml:space="preserve">
<value>34</value>
<value>33</value>
</data>
<data name="&gt;&gt;ColFallbackName.Type" xml:space="preserve">
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
@@ -796,9 +814,6 @@
<data name="ListFallbackItems.Size" type="System.Drawing.Size, System.Drawing">
<value>204, 329</value>
</data>
<data name="&gt;&gt;LblGachaTypeTip.Parent" xml:space="preserve">
<value>GrpBannerValues</value>
</data>
<data name="&gt;&gt;LblSortId.Name" xml:space="preserve">
<value>LblSortId</value>
</data>
@@ -835,25 +850,12 @@
<data name="LblTitlePath.Text" xml:space="preserve">
<value>封面标题</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblBannerType.ZOrder" xml:space="preserve">
<value>32</value>
<value>31</value>
</data>
<data name="GrpBannerValues.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Right</value>
</data>
<data name="ListUpItems.Groups1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACJTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0dyb3VwBAAAAAZIZWFkZXIPSGVhZGVyQWxpZ25tZW50A1Rh
ZwROYW1lAQQCAShTeXN0ZW0uV2luZG93cy5Gb3Jtcy5Ib3Jpem9udGFsQWxpZ25tZW50AgAAAAIAAAAG
AwAAAAo15pif5q2m5ZmoBfz///8oU3lzdGVtLldpbmRvd3MuRm9ybXMuSG9yaXpvbnRhbEFsaWdubWVu
dAEAAAAHdmFsdWVfXwAIAgAAAAAAAAAKBgUAAAAJR3JvdXBVcFc1Cw==
</value>
</data>
<data name="LblEventChance5.Text" xml:space="preserve">
<value>5星活动爆率</value>
</data>
@@ -873,7 +875,7 @@
<value>RbCostItem223</value>
</data>
<data name="&gt;&gt;LblEndTime.ZOrder" xml:space="preserve">
<value>25</value>
<value>24</value>
</data>
<data name="&gt;&gt;BtnDelete.ZOrder" xml:space="preserve">
<value>0</value>
@@ -884,8 +886,8 @@
<data name="LblEventChance5.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="TxtPoolWeight5.Location" type="System.Drawing.Point, System.Drawing">
<value>112, 29</value>
<data name="LnkCheckLatestBanners.Size" type="System.Drawing.Size, System.Drawing">
<value>80, 17</value>
</data>
<data name="GrpFallbackPool.Size" type="System.Drawing.Size, System.Drawing">
<value>210, 351</value>
@@ -921,8 +923,8 @@
<data name="&gt;&gt;NUDEventChance4.Parent" xml:space="preserve">
<value>GrpBannerValues</value>
</data>
<data name="&gt;&gt;RbCostItem223.Parent" xml:space="preserve">
<value>GrpBannerValues</value>
<data name="BtnClear.Size" type="System.Drawing.Size, System.Drawing">
<value>100, 23</value>
</data>
<data name="&gt;&gt;BtnSave.Name" xml:space="preserve">
<value>BtnSave</value>
@@ -939,9 +941,6 @@
<data name="&gt;&gt;LblWeight4.Name" xml:space="preserve">
<value>LblWeight4</value>
</data>
<data name="LblTitlePath.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="ChkAutoStripRateUpFromFallback.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
@@ -954,8 +953,8 @@
<data name="NUDSortId.TabIndex" type="System.Int32, mscorlib">
<value>24</value>
</data>
<data name="LblEventChance4Tip.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
<data name="&gt;&gt;GrpBannerValues.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="GrpBannerValues.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
@@ -976,7 +975,7 @@
<value>2</value>
</data>
<data name="&gt;&gt;ListBanners.ZOrder" xml:space="preserve">
<value>0</value>
<value>1</value>
</data>
<data name="&gt;&gt;LnkOpenOldEditor.ZOrder" xml:space="preserve">
<value>10</value>
@@ -1002,9 +1001,6 @@
<data name="LblBeginTime.Size" type="System.Drawing.Size, System.Drawing">
<value>56, 17</value>
</data>
<data name="ListFallbackItems.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="ChkRemoveC6FormPool.TabIndex" type="System.Int32, mscorlib">
<value>33</value>
</data>
@@ -1044,8 +1040,8 @@
<data name="LblWeight4.Location" type="System.Drawing.Point, System.Drawing">
<value>55, 61</value>
</data>
<data name="&gt;&gt;LnkOpenOldEditor.Type" xml:space="preserve">
<value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<data name="LblEventChance4Tip.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblPoolWeight4.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
@@ -1080,8 +1076,8 @@
<data name="LblCostItemAmount1.Location" type="System.Drawing.Point, System.Drawing">
<value>50, 175</value>
</data>
<data name="GrpBanners.Size" type="System.Drawing.Size, System.Drawing">
<value>276, 563</value>
<data name="ChkAutoStripRateUpFromFallback.Size" type="System.Drawing.Size, System.Drawing">
<value>151, 21</value>
</data>
<data name="&gt;&gt;BtnSave.ZOrder" xml:space="preserve">
<value>1</value>
@@ -1113,11 +1109,8 @@
<data name="&gt;&gt;CmbTitlePath.Parent" xml:space="preserve">
<value>GrpBannerValues</value>
</data>
<data name="&gt;&gt;GrpBannerValues.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;NUDScheduleId.ZOrder" xml:space="preserve">
<value>28</value>
<value>27</value>
</data>
<data name="&gt;&gt;LblPoolWeight4.Parent" xml:space="preserve">
<value>GrpBalance</value>
@@ -1125,6 +1118,9 @@
<data name="BtnLoad.Text" xml:space="preserve">
<value>加载</value>
</data>
<data name="LnkCheckLatestBanners.Text" xml:space="preserve">
<value>查看最新卡池</value>
</data>
<data name="NUDSortId.Size" type="System.Drawing.Size, System.Drawing">
<value>100, 23</value>
</data>
@@ -1146,6 +1142,9 @@
<data name="&gt;&gt;LblEventChance4.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="LnkCheckLatestBanners.Location" type="System.Drawing.Point, System.Drawing">
<value>190, 0</value>
</data>
<data name="&gt;&gt;LblPoolWeight5.Parent" xml:space="preserve">
<value>GrpBalance</value>
</data>
@@ -1170,8 +1169,8 @@
<data name="LblEventChance5Tip.TabIndex" type="System.Int32, mscorlib">
<value>28</value>
</data>
<data name="&gt;&gt;LblCostItemAmount1.Parent" xml:space="preserve">
<value>GrpBannerValues</value>
<data name="LblSortIdTip.Location" type="System.Drawing.Point, System.Drawing">
<value>218, 233</value>
</data>
<data name="&gt;&gt;LnkWeightHelp.Name" xml:space="preserve">
<value>LnkWeightHelp</value>
@@ -1182,6 +1181,9 @@
<data name="&gt;&gt;RbCostItem224.Name" xml:space="preserve">
<value>RbCostItem224</value>
</data>
<data name="TxtPoolWeight5.Location" type="System.Drawing.Point, System.Drawing">
<value>112, 29</value>
</data>
<data name="&gt;&gt;ChkRemoveC6FormPool.Name" xml:space="preserve">
<value>ChkRemoveC6FormPool</value>
</data>
@@ -1239,6 +1241,9 @@
<data name="LblBannersJson.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="&gt;&gt;RbCostItem223.Parent" xml:space="preserve">
<value>GrpBannerValues</value>
</data>
<data name="&gt;&gt;LblEventChance4Tip.ZOrder" xml:space="preserve">
<value>14</value>
</data>
@@ -1368,6 +1373,9 @@
<data name="GrpUpPool.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Right</value>
</data>
<data name="LnkCheckLatestBanners.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="BtnLoad.Size" type="System.Drawing.Size, System.Drawing">
<value>100, 23</value>
</data>
@@ -1383,8 +1391,8 @@
<data name="LblPoolWeight5.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblGachaTypeTip.Location" type="System.Drawing.Point, System.Drawing">
<value>218, 28</value>
<data name="GrpBalance.Size" type="System.Drawing.Size, System.Drawing">
<value>440, 100</value>
</data>
<data name="CmbBannerType.Location" type="System.Drawing.Point, System.Drawing">
<value>112, 84</value>
@@ -1392,14 +1400,11 @@
<data name="LblBannerType.Location" type="System.Drawing.Point, System.Drawing">
<value>50, 87</value>
</data>
<data name="LblScheduleId.Size" type="System.Drawing.Size, System.Drawing">
<value>72, 17</value>
</data>
<data name="&gt;&gt;GrpUpPool.Type" xml:space="preserve">
<value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="LblEventChance4.Text" xml:space="preserve">
<value>4星活动爆率</value>
<data name="&gt;&gt;LnkWeightHelp.Parent" xml:space="preserve">
<value>GrpWeights</value>
</data>
<data name="LblEventChance4.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
@@ -1410,8 +1415,8 @@
<data name="&gt;&gt;BtnClear.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="ChkAutoStripRateUpFromFallback.Size" type="System.Drawing.Size, System.Drawing">
<value>151, 21</value>
<data name="&gt;&gt;BtnDelete.Name" xml:space="preserve">
<value>BtnDelete</value>
</data>
<data name="&gt;&gt;LnkOpenOldEditor.Name" xml:space="preserve">
<value>LnkOpenOldEditor</value>
@@ -1425,8 +1430,8 @@
<data name="&gt;&gt;RbCostItem224.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BtnLoad.Parent" xml:space="preserve">
<value>$this</value>
<data name="LblScheduleIdTip.Text" xml:space="preserve">
<value>ID要求唯一</value>
</data>
<data name="LblWeight4.Text" xml:space="preserve">
<value>4星权重</value>
@@ -1467,30 +1472,27 @@
<data name="NUDCostItemAmount1.Location" type="System.Drawing.Point, System.Drawing">
<value>112, 173</value>
</data>
<data name="NUDEventChance5.Size" type="System.Drawing.Size, System.Drawing">
<value>63, 23</value>
<data name="&gt;&gt;LblCostItemAmount1.Parent" xml:space="preserve">
<value>GrpBannerValues</value>
</data>
<data name="&gt;&gt;LnkWeightHelp.Type" xml:space="preserve">
<value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="$this.Font" type="System.Drawing.Font, System.Drawing">
<value>微软雅黑, 9pt</value>
<data name="&gt;&gt;LblCostItemAmount1.Name" xml:space="preserve">
<value>LblCostItemAmount1</value>
</data>
<data name="GrpBanners.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 41</value>
</data>
<data name="&gt;&gt;CmbBannerType.ZOrder" xml:space="preserve">
<value>29</value>
</data>
<data name="&gt;&gt;GrpWeights.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblCostItemAmount1.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="&gt;&gt;LblGachaTypeTip.Name" xml:space="preserve">
<value>LblGachaTypeTip</value>
</data>
<data name="&gt;&gt;LblCostItemAmount1.Name" xml:space="preserve">
<value>LblCostItemAmount1</value>
</data>
<data name="$this.MinimumSize" type="System.Drawing.Size, System.Drawing">
<value>1200, 655</value>
</data>
@@ -1542,14 +1544,14 @@
<data name="&gt;&gt;ListFallbackItems.Type" xml:space="preserve">
<value>System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblPoolWeight4.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<data name="$this.Font" type="System.Drawing.Font, System.Drawing">
<value>微软雅黑, 9pt</value>
</data>
<data name="LblPoolWeight5.Location" type="System.Drawing.Point, System.Drawing">
<value>43, 32</value>
</data>
<data name="LblGachaTypeTip.Text" xml:space="preserve">
<value>从400开始顺序递增</value>
<data name="&gt;&gt;ChkAutoStripRateUpFromFallback.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="LblTitlePath.Size" type="System.Drawing.Size, System.Drawing">
<value>56, 17</value>
@@ -1560,8 +1562,8 @@
<data name="&gt;&gt;LblCostItemAmount1.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="FLPBannersControl.Size" type="System.Drawing.Size, System.Drawing">
<value>270, 29</value>
<data name="&gt;&gt;ColUpName.Name" xml:space="preserve">
<value>ColUpName</value>
</data>
<data name="&gt;&gt;TxtWeight4.ZOrder" xml:space="preserve">
<value>1</value>
@@ -1614,9 +1616,6 @@
<data name="BtnAddOrUpdate.Size" type="System.Drawing.Size, System.Drawing">
<value>150, 23</value>
</data>
<data name="LblScheduleIdTip.Text" xml:space="preserve">
<value>ID要求唯一</value>
</data>
<data name="&gt;&gt;LblEventChance5.ZOrder" xml:space="preserve">
<value>20</value>
</data>
@@ -1656,14 +1655,11 @@
<data name="&gt;&gt;GrpBalance.Type" xml:space="preserve">
<value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="LblGachaTypeTip.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="BtnDelete.Text" xml:space="preserve">
<value>删除</value>
</data>
<data name="LblGachaTypeTip.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
<data name="ListFallbackItems.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="NUDCostItemAmount1.TabIndex" type="System.Int32, mscorlib">
<value>16</value>
@@ -1674,8 +1670,8 @@
<data name="&gt;&gt;LblPoolWeight4.Name" xml:space="preserve">
<value>LblPoolWeight4</value>
</data>
<data name="&gt;&gt;ChkAutoStripRateUpFromFallback.ZOrder" xml:space="preserve">
<value>7</value>
<data name="FLPBannersControl.Size" type="System.Drawing.Size, System.Drawing">
<value>270, 29</value>
</data>
<data name="LblPrefabPath.Size" type="System.Drawing.Size, System.Drawing">
<value>56, 17</value>
@@ -1704,9 +1700,6 @@
<data name="ChkAutoStripRateUpFromFallback.TabIndex" type="System.Int32, mscorlib">
<value>34</value>
</data>
<data name="&gt;&gt;LblGachaTypeTip.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="LblEventChance5Tip.Text" xml:space="preserve">
<value>%</value>
</data>
@@ -1737,14 +1730,14 @@
<data name="&gt;&gt;LblBannersJson.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LnkWeightHelp.Parent" xml:space="preserve">
<value>GrpWeights</value>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="LblEventChance4.Location" type="System.Drawing.Point, System.Drawing">
<value>221, 262</value>
</data>
<data name="GrpBalance.Size" type="System.Drawing.Size, System.Drawing">
<value>440, 100</value>
<data name="GrpBanners.Size" type="System.Drawing.Size, System.Drawing">
<value>276, 563</value>
</data>
<data name="LblGachaType.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
@@ -1759,7 +1752,7 @@
<value>8</value>
</data>
<data name="&gt;&gt;RbCostItem223.ZOrder" xml:space="preserve">
<value>36</value>
<value>35</value>
</data>
<data name="&gt;&gt;LblWeight5.Parent" xml:space="preserve">
<value>GrpWeights</value>
@@ -1800,8 +1793,8 @@
<data name="LblEventChance4.Size" type="System.Drawing.Size, System.Drawing">
<value>75, 17</value>
</data>
<data name="LblSortIdTip.Location" type="System.Drawing.Point, System.Drawing">
<value>218, 233</value>
<data name="LblScheduleId.Size" type="System.Drawing.Size, System.Drawing">
<value>72, 17</value>
</data>
<data name="NUDScheduleId.Size" type="System.Drawing.Size, System.Drawing">
<value>100, 23</value>
@@ -1824,8 +1817,8 @@
<data name="&gt;&gt;NUDCostItemAmount10.Type" xml:space="preserve">
<value>System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="BtnClear.Size" type="System.Drawing.Size, System.Drawing">
<value>100, 23</value>
<data name="&gt;&gt;LnkCheckLatestBanners.Name" xml:space="preserve">
<value>LnkCheckLatestBanners</value>
</data>
<data name="NUDEventChance4.Size" type="System.Drawing.Size, System.Drawing">
<value>63, 23</value>
@@ -1834,7 +1827,7 @@
<value>CmbPrefab</value>
</data>
<data name="&gt;&gt;LblScheduleId.ZOrder" xml:space="preserve">
<value>26</value>
<value>25</value>
</data>
<data name="GrpBannerValues.Location" type="System.Drawing.Point, System.Drawing">
<value>294, 41</value>
@@ -1869,14 +1862,21 @@
<data name="&gt;&gt;LblEventChance4Tip.Parent" xml:space="preserve">
<value>GrpBannerValues</value>
</data>
<data name="BtnSave.Text" xml:space="preserve">
<value>保存</value>
<data name="ListUpItems.Groups1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACJTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0dyb3VwBAAAAAZIZWFkZXIPSGVhZGVyQWxpZ25tZW50A1Rh
ZwROYW1lAQQCAShTeXN0ZW0uV2luZG93cy5Gb3Jtcy5Ib3Jpem9udGFsQWxpZ25tZW50AgAAAAIAAAAG
AwAAAAo15pif5q2m5ZmoBfz///8oU3lzdGVtLldpbmRvd3MuRm9ybXMuSG9yaXpvbnRhbEFsaWdubWVu
dAEAAAAHdmFsdWVfXwAIAgAAAAAAAAAKBgUAAAAJR3JvdXBVcFc1Cw==
</value>
</data>
<data name="GrpBannerValues.Text" xml:space="preserve">
<value>卡池参数</value>
<data name="&gt;&gt;LblPoolWeight4.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;CmbBannerType.ZOrder" xml:space="preserve">
<value>30</value>
<data name="LblTitlePath.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="ListUpItems.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 19</value>

View File

@@ -217,12 +217,6 @@
<data name="LblSortId.Text" xml:space="preserve">
<value>Сорт.</value>
</data>
<data name="LblGachaTypeTip.Size" type="System.Drawing.Size, System.Drawing">
<value>116, 17</value>
</data>
<data name="LblGachaTypeTip.Text" xml:space="preserve">
<value>Увеличение с 400</value>
</data>
<data name="LblEndTime.Location" type="System.Drawing.Point, System.Drawing">
<value>249, 204</value>
</data>
@@ -466,6 +460,15 @@
<data name="GrpBanners.Text" xml:space="preserve">
<value>Banners</value>
</data>
<data name="LnkCheckLatestBanners.Location" type="System.Drawing.Point, System.Drawing">
<value>73, 0</value>
</data>
<data name="LnkCheckLatestBanners.Size" type="System.Drawing.Size, System.Drawing">
<value>203, 17</value>
</data>
<data name="LnkCheckLatestBanners.Text" xml:space="preserve">
<value>Проверьте последние баннеры</value>
</data>
<data name="BtnDelete.Text" xml:space="preserve">
<value>- Удалить</value>
</data>

View File

@@ -144,9 +144,6 @@
<data name="LblSortId.Text" xml:space="preserve">
<value>順序</value>
</data>
<data name="LblGachaTypeTip.Text" xml:space="preserve">
<value>從400開始順序遞增</value>
</data>
<data name="LblEndTime.Text" xml:space="preserve">
<value>結束時間</value>
</data>
@@ -178,9 +175,6 @@
<data name="GrpBannerValues.Text" xml:space="preserve">
<value>卡池參數</value>
</data>
<data name="GrpFallbackPool.Text" xml:space="preserve">
<value>基礎池</value>
</data>
<data name="ListFallbackItems.Groups" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
@@ -231,6 +225,9 @@
dAEAAAAHdmFsdWVfXwAIAgAAAAAAAAAKBgUAAAAHR3JvdXBXMws=
</value>
</data>
<data name="GrpFallbackPool.Text" xml:space="preserve">
<value>基礎池</value>
</data>
<data name="ListUpItems.Groups" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
@@ -271,9 +268,6 @@
dAEAAAAHdmFsdWVfXwAIAgAAAAAAAAAKBgUAAAAJR3JvdXBVcFc0Cw==
</value>
</data>
<data name="GrpWeights.Text" xml:space="preserve">
<value>卡池權重與保底機制</value>
</data>
<data name="LnkWeightHelp.Text" xml:space="preserve">
<value>幫助</value>
</data>
@@ -283,8 +277,8 @@
<data name="LblWeight5.Text" xml:space="preserve">
<value>5星權重</value>
</data>
<data name="GrpBalance.Text" xml:space="preserve">
<value>角色和武器平衡機制(僅混合池有效)</value>
<data name="GrpWeights.Text" xml:space="preserve">
<value>卡池權重與保底機制</value>
</data>
<data name="LblPoolWeight4.Text" xml:space="preserve">
<value>4星池權重</value>
@@ -292,12 +286,12 @@
<data name="LblPoolWeight5.Text" xml:space="preserve">
<value>5星池權重</value>
</data>
<data name="GrpBalance.Text" xml:space="preserve">
<value>角色和武器平衡機制(僅混合池有效)</value>
</data>
<data name="BtnDelete.Text" xml:space="preserve">
<value>刪除</value>
</data>
<data name="label1.Text" xml:space="preserve">
<value>Banners.json 路徑:</value>
</data>
<data name="BtnLoad.Text" xml:space="preserve">
<value>加載</value>
</data>

View File

@@ -44,6 +44,22 @@ namespace GrasscutterTools.Forms
if (DesignMode) return;
Common.KeyGo = new KeyGo(Handle);
Common.KeyGo.HotKeyTriggerEvent += OnHotKeyTrigger;
try
{
if (!Settings.Default.IsUpgraded)
{
Settings.Default.Upgrade();
Settings.Default.IsUpgraded = true;
}
}
catch (Exception ex)
{
Logger.W(TAG, "Upgrade Settings failed.", ex);
}
try
{
var location = Settings.Default.MainFormLocation;
@@ -94,7 +110,21 @@ namespace GrasscutterTools.Forms
ph.OnLanguageChanged = () => FormMain_Load(this, EventArgs.Empty);
var poc = CreatePage<PageOpenCommand>();
poc.ShowTipInRunButton = msg => ShowTip(msg, BtnInvokeOpenCommand);
CreatePage<PageCustomCommands>();
var pcc = CreatePage<PageCustomCommands>();
var phk = CreatePage<PageHotKey>();
pcc.OnAddHotKey = tag =>
{
phk.AddNewHotKey(tag);
// 跳转到快捷键界面
for (var i = 0; i < TCMain.Controls.Count; i++)
{
if (TCMain.Controls[i].Controls[0] == phk)
{
ListPages.SelectedIndex = i;
break;
}
}
};
CreatePage<PageGiveArtifact>();
CreatePage<PageSpawn>();
CreatePage<PageGiveItem>();
@@ -108,7 +138,9 @@ namespace GrasscutterTools.Forms
CreatePage<PageAchievement>();
CreatePage<PageSetProp>();
CreatePage<PageAbout>();
//AddPageToGui(CreatePage<PageTools>("Tools"));
#if DEBUG
CreatePage<PageTools>();
#endif
TCMain.ResumeLayout();
Logger.I(TAG, "InitPages completed");
}
@@ -124,6 +156,7 @@ namespace GrasscutterTools.Forms
Resources.PageHomeTitle,
Resources.PageOpenCommandTitle,
Resources.PageCustomCommandsTitle,
Resources.PageHotKey,
Resources.PageGetArtifactTitle,
Resources.PageSpawnTitle,
Resources.PageGiveItemTitle,
@@ -137,6 +170,9 @@ namespace GrasscutterTools.Forms
Resources.PageAchievementTitle,
Resources.PageSetPropTitle,
Resources.PageAboutTitle,
#if DEBUG
"Tools",
#endif
});
}
@@ -186,7 +222,7 @@ namespace GrasscutterTools.Forms
tp.Controls.Add(page);
return page;
}
private void ListPages_SelectedIndexChanged(object sender, EventArgs e)
{
TCMain.SelectedIndex = ListPages.SelectedIndex;
@@ -269,6 +305,32 @@ namespace GrasscutterTools.Forms
#endregion - Init -
#region - HotKey -
/// <summary>
/// 快捷键触发时执行
/// </summary>
private void OnHotKeyTrigger(object sender, HotKeyTriggerEventArgs e)
{
BeginInvoke(new Func<Task>(() => RunRawCommands(e.HotKeyItem.Commands)));
e.Handle = true;
}
private const int WM_HOTKEY = 0x312;
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg)
{
case WM_HOTKEY:
Common.KeyGo.ProcessHotKey(m.WParam.ToInt32());
break;
}
}
#endregion - HotKey -
#region - Command -
/// <summary>
@@ -370,10 +432,20 @@ namespace GrasscutterTools.Forms
ShowTip(Resources.CommandContentCannotBeEmpty, CmbCommand);
return;
}
if (cmd.IndexOf('|') == -1)
await RunCommands(FormatCommand(cmd));
else
await RunCommands(cmd.Split('|').Select(it => FormatCommand(it)).ToArray());
await RunRawCommands(cmd);
}
/// <summary>
/// 运行原始命令
/// </summary>
/// <param name="commands">命令字符串</param>
/// <returns>是否执行成功</returns>
private async Task<bool> RunRawCommands(string commands)
{
if (commands.IndexOf('|') == -1)
return await RunCommands(FormatCommand(commands));
return await RunCommands(commands.Split('|').Select(FormatCommand).ToArray());
}
/// <summary>
@@ -470,11 +542,11 @@ namespace GrasscutterTools.Forms
{
if (WindowState == FormWindowState.Maximized)
WindowState = FormWindowState.Normal;
TCMain.Anchor &= ~AnchorStyles.Bottom;
NavContainer.Anchor &= ~AnchorStyles.Bottom;
GrpCommand.Anchor |= AnchorStyles.Top;
Size = new Size(Width, Height + TxtCommandRunLogMinHeight);
MinimumSize = new Size(MinimumSize.Width, MinimumSize.Height + TxtCommandRunLogMinHeight);
TCMain.Anchor |= AnchorStyles.Bottom;
NavContainer.Anchor |= AnchorStyles.Bottom;
GrpCommand.Anchor &= ~AnchorStyles.Top;
}
@@ -509,6 +581,13 @@ namespace GrasscutterTools.Forms
// F5 为执行命令
OnOpenCommandInvoke();
}
else if (e.Alt && e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9)
{
// Alt+数字键 = 跳转到对应页面
var i = e.KeyCode == Keys.D0 ? 9 : e.KeyCode - Keys.D1;
if (i < ListPages.Items.Count)
ListPages.SelectedIndex = i;
}
}
/// <summary>
@@ -523,10 +602,14 @@ namespace GrasscutterTools.Forms
/// <param name="control">控件</param>
private void ShowTip(string message, Control control)
{
if (InvokeRequired)
{
BeginInvoke(new Action(() => ShowTip(message, control)));
return;
}
TTip.Show(message, control, 0, control.Size.Height, 3000);
}
#endregion - General -
}
}

View File

@@ -62,4 +62,4 @@ namespace GrasscutterTools.Game.Activity
[JsonProperty("endTime")]
public DateTime EndTime { get; set; }
}
}
}

View File

@@ -0,0 +1,32 @@
/**
* Grasscutter Tools
* Copyright (C) 2023 jie65535
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
**/
using Newtonsoft.Json;
namespace GrasscutterTools.Game.Activity
{
internal class NewActivityItem
{
[JsonProperty("activityId")]
public int ActivityId { get; set; }
[JsonProperty("nameTextMapHash")]
public string NameTextMapHash { get; set; }
}
}

View File

@@ -142,11 +142,36 @@ namespace GrasscutterTools.Game
/// </summary>
public static readonly Version V1_5_0 = new Version(1, 5, 0);
/// <summary>
/// 2023/6/1
/// </summary>
public static readonly Version V1_6_0 = new Version(1, 6, 0);
/// <summary>
/// 2023/6/2
/// </summary>
public static readonly Version V1_6_1 = new Version(1, 6, 1);
/// <summary>
/// 2023/7/1
/// </summary>
public static readonly Version V1_6_2 = new Version(1, 6, 2);
/// <summary>
/// 2023/8/1
/// </summary>
public static readonly Version V1_6_3 = new Version(1, 6, 3);
/// <summary>
/// 2023/??
/// </summary>
public static readonly Version V1_7_0 = new Version(1, 7, 0);
// More...
/// <summary>
/// Date
/// </summary>
//public static readonly Version V1_4_4 = new Version(1, 4, 4);
//public static readonly Version V1_6_3 = new Version(1, 6, 3);
public static Version[] List { get; } = new Version[] {
V1_2_1,
@@ -160,7 +185,11 @@ namespace GrasscutterTools.Game
V1_4_3,
V1_4_7,
V1_5_0,
//V1_5_1,
V1_6_0,
V1_6_1,
V1_6_2,
V1_6_3,
V1_7_0,
};
#endregion - Version List -

View File

@@ -0,0 +1,32 @@
/**
* Grasscutter Tools
* Copyright (C) 2023 jie65535
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
**/
using Newtonsoft.Json;
namespace GrasscutterTools.Game.CutScene
{
internal class CutSceneItem
{
[JsonProperty("id")]
public int Id { get; set; }
[JsonProperty("path")]
public string Path { get; set; }
}
}

View File

@@ -0,0 +1,13 @@
using Newtonsoft.Json;
namespace GrasscutterTools.Game.Data.Excels
{
[ResourceType("AchievementExcelConfigData.json")]
internal class AchievementData : GameResource
{
[JsonProperty("isDisuse")]
public bool IsDisuse { get; set; }
public bool IsUsed => !IsDisuse;
}
}

View File

@@ -0,0 +1,14 @@
using GrasscutterTools.Game.Props;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
namespace GrasscutterTools.Game.Data.Excels
{
[ResourceType("AvatarExcelConfigData.json")]
internal class AvatarData : GameResource
{
[JsonProperty("qualityType"), JsonConverter(typeof(StringEnumConverter))]
public QualityType QualityType { get; set; }
}
}

View File

@@ -0,0 +1,7 @@
namespace GrasscutterTools.Game.Data.Excels
{
[ResourceType("DungeonExcelConfigData.json")]
internal class DungeonData : GameResource
{
}
}

View File

@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GrasscutterTools.Game.Data.Excels
{
[ResourceType("GadgetExcelConfigData.json")]
internal class GadgetData
{
}
}

View File

@@ -0,0 +1,14 @@
using Newtonsoft.Json;
namespace GrasscutterTools.Game.Data.Excels
{
[ResourceType("HomeWorldBgmExcelConfigData.json")]
internal class HomeWorldBgmData : GameResource
{
[JsonProperty("homeBgmId")]
public override int Id { get; set; }
[JsonProperty("bgmNameTextMapHash")]
public long BgmNameTextMapHash { get; set; }
}
}

View File

@@ -0,0 +1,7 @@
namespace GrasscutterTools.Game.Data.Excels
{
[ResourceType("HomeWorldFurnitureExcelConfigData.json")]
internal class HomeWorldFurnitureData : GameResource
{
}
}

View File

@@ -0,0 +1,9 @@
using Newtonsoft.Json;
namespace GrasscutterTools.Game.Data.Excels
{
[ResourceType("MainQuestExcelConfigData.json")]
internal class MainQuestData : GameResource
{
}
}

View File

@@ -0,0 +1,22 @@
using System.Collections.Generic;
using GrasscutterTools.Game.Inventory;
using GrasscutterTools.Game.Props;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
namespace GrasscutterTools.Game.Data.Excels
{
[ResourceType("MaterialExcelConfigData.json")]
internal class MaterialData : GameResource
{
[JsonProperty("itemType"), JsonConverter(typeof(StringEnumConverter))]
public ItemType ItemType { get; set; }
[JsonProperty("materialType"), JsonConverter(typeof(StringEnumConverter))]
public MaterialType MaterialType { get; set; }
[JsonProperty("itemUse")]
public List<ItemUseData> ItemUse { get; set; }
}
}

View File

@@ -0,0 +1,15 @@
using GrasscutterTools.Game.Props;
using Newtonsoft.Json;
namespace GrasscutterTools.Game.Data.Excels
{
[ResourceType("MonsterExcelConfigData.json")]
internal class MonsterData : GameResource
{
[JsonProperty("monsterName")]
public string MonsterName { get; set; }
[JsonProperty("type")]
public MonsterType Type { get; set; }
}
}

View File

@@ -0,0 +1,17 @@
using Newtonsoft.Json;
namespace GrasscutterTools.Game.Data.Excels
{
[ResourceType("QuestExcelConfigData.json")]
internal class QuestData : GameResource
{
[JsonProperty("subId")]
public override int Id { get; set; }
[JsonProperty("mainId")]
public int MainId { get; set; }
[JsonProperty("order")]
public int Order { get; set; }
}
}

View File

@@ -0,0 +1,7 @@
namespace GrasscutterTools.Game.Data.Excels
{
[ResourceType("ReliquaryExcelConfigData.json")]
internal class ReliquaryData : GameResource
{
}
}

View File

@@ -0,0 +1,15 @@
using GrasscutterTools.Game.Props;
using Newtonsoft.Json;
namespace GrasscutterTools.Game.Data.Excels
{
[ResourceType("SceneExcelConfigData.json")]
internal class SceneData : GameResource
{
[JsonProperty("type")]
public SceneType SceneType { get; set; }
[JsonProperty("scriptData")]
public string ScriptData { get; set; }
}
}

View File

@@ -0,0 +1,11 @@
using Newtonsoft.Json;
namespace GrasscutterTools.Game.Data.Excels
{
[ResourceType("WeaponExcelConfigData.json")]
internal class WeaponData : GameResource
{
[JsonProperty("rankLevel")]
public int RankLevel { get; set; }
}
}

View File

@@ -0,0 +1,19 @@
using Newtonsoft.Json;
namespace GrasscutterTools.Game.Data
{
internal abstract class GameResource
{
[JsonProperty("id")]
public virtual int Id { get; set; }
[JsonProperty("nameTextMapHash")]
public long NameTextMapHash { get; set; }
[JsonProperty("titleTextMapHash")]
public string TitleTextMapHash { get; set; }
[JsonProperty("descTextMapHash")]
public long DescTextMapHash { get; set; }
}
}

View File

@@ -0,0 +1,269 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using GrasscutterTools.Game.Data.Excels;
using GrasscutterTools.Game.Inventory;
using GrasscutterTools.Game.Props;
using GrasscutterTools.GOOD;
using GrasscutterTools.Utils;
using Newtonsoft.Json;
namespace GrasscutterTools.Game.Data
{
internal class GameResources
{
public Dictionary<int, AchievementData> AchievementData { get; set; }
public Dictionary<int, AvatarData> AvatarData { get; set; }
public Dictionary<int, HomeWorldBgmData> HomeWorldBgmData { get; set; }
public Dictionary<int, DungeonData> DungeonData { get; set; }
public Dictionary<int, HomeWorldFurnitureData> HomeWorldFurnitureData { get; set; }
public Dictionary<int, MainQuestData> MainQuestData { get; set; }
public Dictionary<int, QuestData> QuestData { get; set; }
public Dictionary<int, MaterialData> MaterialData { get; set; }
public Dictionary<int, MonsterData> MonsterData { get; set; }
public Dictionary<int, ReliquaryData> ReliquaryData { get; set; }
public Dictionary<int, SceneData> SceneData { get; set; }
public Dictionary<int, WeaponData> WeaponData { get; set; }
public TextMapData TextMapData { get; set; }
public GameResources(string resourcesDirPath, TextMapData textMapData)
{
TextMapData = textMapData;
var properties = typeof(GameResources).GetProperties();
foreach (var property in properties)
{
var type = property.PropertyType;
if (!type.IsGenericType) continue;
var gameResourceType = type.GetGenericArguments()[1];
var attributes = (ResourceTypeAttribute[])gameResourceType.GetCustomAttributes(typeof(ResourceTypeAttribute), true);
if (attributes.Length < 1) continue;
var dataFile = Path.Combine(resourcesDirPath, "ExcelBinOutput", attributes[0].Name);
var data = LoadDataFile(gameResourceType, dataFile);
property.SetValue(this, data, null);
}
var illegalWeaponIds = new SparseSet(
"10000-10008, 11411, 11506-11508, 12505, 12506, 12508, 12509," +
"13503, 13506, 14411, 14503, 14505, 14508, 15504-15506, 20001");
foreach (var id in WeaponData.Keys.Where(id => illegalWeaponIds.Contains(id)).ToList())
WeaponData.Remove(id);
var illegalRelicIds = new SparseSet(
"20002, 20004, 23300-24825"
);
//var illegalRelicIds = new SparseSet(
// "20001, 23300-23340, 23383-23385, 78310-78554, 99310-99554"
//);
foreach (var id in ReliquaryData.Keys.Where(id => illegalRelicIds.Contains(id)).ToList())
ReliquaryData.Remove(id);
var illegalItemIds = new SparseSet(
"3004-3008, 3018-3022"
);
//var illegalItemIds = new SparseSet(
// "3004-3008, 3018-3022, 100086, 100087, 100100-101000, 101106-101110, 101306, 101500-104000," +
// "105001, 105004, 106000-107000, 107011, 108000, 109000-110000," +
// "115000-130000, 200200-200899, 220050, 220054"
//);
foreach (var id in MaterialData.Keys.Where(id => illegalItemIds.Contains(id)).ToList())
MaterialData.Remove(id);
foreach (var id in AvatarData.Keys.Where(id => id < 10000002 || id >= 11000000).ToList())
AvatarData.Remove(id);
}
private static object LoadDataFile(Type type, string path)
{
var list = (IList)JsonConvert.DeserializeObject(File.ReadAllText(path), typeof(List<>).MakeGenericType(type));
if (list == null) return null;
var dicType = typeof(Dictionary<,>).MakeGenericType(typeof(int), type);
var dic = (IDictionary)Activator.CreateInstance(dicType);
foreach (GameResource gameResource in list)
dic.Add(gameResource.Id, gameResource);
return dic;
}
private Dictionary<string, string> Languages = new Dictionary<string, string>
{
["zh-cn"] = "TextMapCHS",
["zh-tw"] = "TextMapCHT",
["en-us"] = "TextMapEN",
["ru-ru"] = "TextMapRU",
};
public void ConvertResources(string projectResourcesDir)
{
var currentCultureInfo = Thread.CurrentThread.CurrentUICulture;
try
{
var sb = new StringBuilder(MaterialData.Count * 24);
foreach (var language in Languages)
{
var dir = Path.Combine(projectResourcesDir, language.Key);
TextMapData.LoadTextMap(TextMapData.TextMapFilePaths[Array.IndexOf(TextMapData.TextMapFiles, language.Value)]);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(language.Key);
GameData.LoadResources();
File.WriteAllLines(
Path.Combine(dir, "Achievement.txt"),
AchievementData.Values.Where(it => it.IsUsed)
.Select(it => $"{it.Id}:{TextMapData.GetText(it.TitleTextMapHash.ToString())} - {TextMapData.GetText(it.DescTextMapHash.ToString())}"),
Encoding.UTF8);
File.WriteAllLines(
Path.Combine(dir, "Artifact.txt"),
ReliquaryData.Values.OrderBy(it => it.Id).Select(it => $"{it.Id}:{TextMapData.GetText(it.NameTextMapHash.ToString())}"),
Encoding.UTF8);
File.WriteAllLines(
Path.Combine(dir, "Avatar.txt"),
MaterialData.Values
.Where(it => it.MaterialType == MaterialType.MATERIAL_AVATAR)
.Select(it => $"{it.Id}:{TextMapData.GetText(it.NameTextMapHash.ToString())}"),
Encoding.UTF8);
File.WriteAllLines(
Path.Combine(dir, "Dungeon.txt"),
DungeonData.Values.Select(it => $"{it.Id}:{TextMapData.GetText(it.NameTextMapHash.ToString())}"),
Encoding.UTF8);
sb.Clear();
foreach (var itemTypes in MaterialData.Values.GroupBy(it => it.ItemType))
{
sb.Append("// ").AppendLine(itemTypes.Key.ToTranslatedString(language.Key));
if (itemTypes.Key == ItemType.ITEM_MATERIAL)
{
foreach (var m in itemTypes
.GroupBy(it => it.MaterialType)
.Where(it => it.Key != MaterialType.MATERIAL_NONE)
.OrderBy(it => it.Average(m => m.Id)))
{
sb.Append("// ").AppendLine(m.Key.ToTranslatedString(language.Key));
if (m.Key == MaterialType.MATERIAL_BGM)
{
foreach (var materialData in m)
sb.AppendFormat("{0}:{1} - {2}",
materialData.Id,
TextMapData.GetText(materialData.NameTextMapHash.ToString()),
TextMapData.GetText(HomeWorldBgmData[int.Parse(materialData.ItemUse[0].UseParam[0])].BgmNameTextMapHash.ToString())
).AppendLine();
}
else
{
foreach (var materialData in m)
sb.AppendFormat("{0}:{1}", materialData.Id, TextMapData.GetText(materialData.NameTextMapHash.ToString())).AppendLine();
}
sb.AppendLine();
}
}
else
{
foreach (var materialData in itemTypes)
sb.AppendFormat("{0}:{1}", materialData.Id, TextMapData.GetText(materialData.NameTextMapHash.ToString())).AppendLine();
sb.AppendLine();
}
}
sb.Append("// ").AppendLine(ItemType.ITEM_FURNITURE.ToTranslatedString(language.Key));
foreach (var value in HomeWorldFurnitureData.Values)
sb.AppendFormat("{0}:{1}", value.Id, TextMapData.GetText(value.NameTextMapHash.ToString())).AppendLine();
File.WriteAllText(Path.Combine(dir, "Item.txt"), sb.ToString(), Encoding.UTF8);
sb.Clear();
foreach (var monsterType in MonsterData.Values.OrderBy(it => it.Id)
.GroupBy(it => it.Type)
.OrderBy(it => it.Key))
{
sb.Append("// ").AppendLine(monsterType.Key.ToTranslatedString(language.Key));
foreach (var monsterData in monsterType)
{
if (TextMapData.TryGetText(monsterData.NameTextMapHash.ToString(), out var text))
{
sb.AppendFormat("{0}:{1}", monsterData.Id, text);
}
else
{
var name = GameData.Monsters[monsterData.Id];
if (name == ItemMap.EmptyName)
sb.AppendFormat("{0}:{1} - {2}", monsterData.Id, monsterData.MonsterName, text);
else
sb.AppendFormat("{0}:{1}", monsterData.Id, name);
}
sb.AppendLine();
}
sb.AppendLine();
}
File.WriteAllText(
Path.Combine(dir, "Monsters.txt"),
sb.ToString(),
Encoding.UTF8);
File.WriteAllLines(
Path.Combine(dir, "Quest.txt"),
QuestData.Values.OrderBy(it => it.Id).Select(it => $"{it.Id}:{TextMapData.GetText(MainQuestData[it.MainId].TitleTextMapHash)} - {TextMapData.GetText(it.DescTextMapHash.ToString())}"),
Encoding.UTF8);
sb.Clear();
foreach (var it in SceneData.Values.OrderBy(it => it.Id))
{
var name = GameData.Scenes[it.Id];
sb.AppendLine($"{it.Id}:{(name == ItemMap.EmptyName ? it.ScriptData : name)}");
}
File.WriteAllText(
Path.Combine(dir, "Scene.txt"),
sb.ToString(),
Encoding.UTF8);
File.WriteAllLines(
Path.Combine(dir, "Weapon.txt"),
WeaponData.Values.Select(it => $"{it.Id}:{TextMapData.GetText(it.NameTextMapHash.ToString())}"),
Encoding.UTF8);
}
File.WriteAllLines(
Path.Combine(projectResourcesDir, "AvatarColor.txt"),
AvatarData.Values.Select(it => $"{it.Id % 1000 + 1000}:{(int)it.QualityType}"),
Encoding.UTF8);
File.WriteAllLines(
Path.Combine(projectResourcesDir, "WeaponColor.txt"),
WeaponData.Values.Select(it => $"{it.Id}:{(it.RankLevel >= 5 ? "yellow" : it.RankLevel >= 4 ? "purple" : "blue")}"),
Encoding.UTF8);
}
finally
{
Thread.CurrentThread.CurrentUICulture = currentCultureInfo;
}
}
}
}

View File

@@ -0,0 +1,15 @@
using System;
namespace GrasscutterTools.Game.Data
{
[AttributeUsage(AttributeTargets.Class, Inherited = false)]
public class ResourceTypeAttribute : Attribute
{
public string Name { get; set; }
public ResourceTypeAttribute(string name)
{
Name = name;
}
}
}

View File

@@ -0,0 +1,32 @@
/**
* Grasscutter Tools
* Copyright (C) 2023 jie65535
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
**/
using Newtonsoft.Json;
namespace GrasscutterTools.Game.Dungeon
{
internal class DungeonItem
{
[JsonProperty("id")]
public int Id { get; set; }
[JsonProperty("nameTextMapHash")]
public string NameTextMapHash { get; set; }
}
}

View File

@@ -33,6 +33,7 @@ namespace GrasscutterTools.Game
ArtifactSubAttribution = new ItemMap(Resources.ArtifactSubAttribution);
Avatars = new ItemMap(Resources.Avatar);
AvatarColors = new ItemMap(Resources.AvatarColor);
CutScenes = new ItemMap(Resources.Cutscene);
Items = new ItemMapGroup(Resources.Item);
Monsters = new ItemMapGroup(Resources.Monsters);
Gadgets = new ItemMapGroup(Resources.Gadget);
@@ -62,6 +63,8 @@ namespace GrasscutterTools.Game
public static ItemMap AvatarColors { get; private set; }
public static ItemMap CutScenes { get; private set; }
public static ItemMapGroup Items { get; private set; }
public static ItemMapGroup Monsters { get; private set; }

View File

@@ -0,0 +1,48 @@

// ReSharper disable InconsistentNaming
using System.Collections.Generic;
namespace GrasscutterTools.Game.Inventory
{
internal enum ItemType
{
ITEM_NONE = 0,
ITEM_VIRTUAL = 1,
ITEM_MATERIAL = 2,
ITEM_RELIQUARY = 3,
ITEM_WEAPON = 4,
ITEM_DISPLAY = 5,
ITEM_FURNITURE = 6,
}
internal static class ItemTypeExtension
{
private static readonly Dictionary<ItemType, string> TextMapCHS = new Dictionary<ItemType, string>
{
[ItemType.ITEM_NONE] = "未分类",
[ItemType.ITEM_VIRTUAL] = "虚拟道具",
[ItemType.ITEM_MATERIAL] = "材料",
[ItemType.ITEM_RELIQUARY] = "圣遗物",
[ItemType.ITEM_WEAPON] = "物品",
[ItemType.ITEM_DISPLAY] = "任务",
[ItemType.ITEM_FURNITURE] = "尘歌壶摆设",
};
private static readonly Dictionary<ItemType, string> TextMapEN = new Dictionary<ItemType, string>
{
[ItemType.ITEM_NONE] = "None",
[ItemType.ITEM_VIRTUAL] = "Virtual",
[ItemType.ITEM_MATERIAL] = "Material",
[ItemType.ITEM_RELIQUARY] = "Reliquary",
[ItemType.ITEM_WEAPON] = "Weapon",
[ItemType.ITEM_DISPLAY] = "Display",
[ItemType.ITEM_FURNITURE] = "Furniture",
};
public static string ToTranslatedString(this ItemType materialType, string language)
{
return language.StartsWith("zh") ? TextMapCHS[materialType] : TextMapEN[materialType];
}
}
}

View File

@@ -0,0 +1,175 @@

// ReSharper disable InconsistentNaming
// ReSharper disable IdentifierTypo
using System;
using System.Collections.Generic;
namespace GrasscutterTools.Game.Inventory
{
/// <summary>
/// 材料类型
/// </summary>
internal enum MaterialType
{
MATERIAL_NONE = 0,
MATERIAL_FOOD = 1,
MATERIAL_QUEST = 2,
MATERIAL_EXCHANGE = 4,
MATERIAL_CONSUME = 5,
MATERIAL_EXP_FRUIT = 6,
MATERIAL_AVATAR = 7,
MATERIAL_ADSORBATE = 8,
MATERIAL_CRICKET = 9,
MATERIAL_ELEM_CRYSTAL = 10,
MATERIAL_WEAPON_EXP_STONE = 11,
MATERIAL_CHEST = 12,
MATERIAL_RELIQUARY_MATERIAL = 13,
MATERIAL_AVATAR_MATERIAL = 14,
MATERIAL_NOTICE_ADD_HP = 15,
MATERIAL_SEA_LAMP = 16,
MATERIAL_SELECTABLE_CHEST = 17,
MATERIAL_FLYCLOAK = 18,
MATERIAL_NAMECARD = 19,
MATERIAL_TALENT = 20,
MATERIAL_WIDGET = 21,
MATERIAL_CHEST_BATCH_USE = 22,
MATERIAL_FAKE_ABSORBATE = 23,
MATERIAL_CONSUME_BATCH_USE = 24,
MATERIAL_WOOD = 25,
MATERIAL_FURNITURE_FORMULA = 27,
MATERIAL_CHANNELLER_SLAB_BUFF = 28,
MATERIAL_FURNITURE_SUITE_FORMULA = 29,
MATERIAL_COSTUME = 30,
MATERIAL_HOME_SEED = 31,
MATERIAL_FISH_BAIT = 32,
MATERIAL_FISH_ROD = 33,
MATERIAL_SUMO_BUFF = 34, // sumo 活动道具never appear
MATERIAL_FIREWORKS = 35,
MATERIAL_BGM = 36,
MATERIAL_SPICE_FOOD = 37,
MATERIAL_ACTIVITY_ROBOT = 38,
MATERIAL_ACTIVITY_GEAR = 39,
MATERIAL_ACTIVITY_JIGSAW = 40,
MATERIAL_ARANARA = 41,
MATERIAL_GCG_CARD = 42,
MATERIAL_GCG_CARD_FACE = 43, // 影幻卡面
MATERIAL_GCG_CARD_BACK = 44,
MATERIAL_GCG_FIELD = 45,
MATERIAL_DESHRET_MANUAL = 46,
MATERIAL_RENAME_ITEM = 47,
MATERIAL_GCG_EXCHANGE_ITEM = 48,
MATERIAL_QUEST_EVENT_BOOK = 49,
}
internal static class MaterialTypeExtension
{
private static readonly Dictionary<MaterialType, string> TextMapCHS = new Dictionary<MaterialType, string>
{
[MaterialType.MATERIAL_NONE] = "空",
[MaterialType.MATERIAL_FOOD] = "食物",
[MaterialType.MATERIAL_QUEST] = "任务",
[MaterialType.MATERIAL_EXCHANGE] = "收集物",
[MaterialType.MATERIAL_CONSUME] = "消耗品",
[MaterialType.MATERIAL_EXP_FRUIT] = "经验书",
[MaterialType.MATERIAL_AVATAR] = "角色",
[MaterialType.MATERIAL_ADSORBATE] = "能量球",
[MaterialType.MATERIAL_CRICKET] = "蛐蛐",
[MaterialType.MATERIAL_ELEM_CRYSTAL] = "神瞳",
[MaterialType.MATERIAL_WEAPON_EXP_STONE] = "武器锻造矿",
[MaterialType.MATERIAL_CHEST] = "宝箱",
[MaterialType.MATERIAL_RELIQUARY_MATERIAL] = "圣遗物经验瓶",
[MaterialType.MATERIAL_AVATAR_MATERIAL] = "角色天赋材料",
[MaterialType.MATERIAL_NOTICE_ADD_HP] = "回血食物",
[MaterialType.MATERIAL_SEA_LAMP] = "海灯节",
[MaterialType.MATERIAL_SELECTABLE_CHEST] = "自选礼包",
[MaterialType.MATERIAL_FLYCLOAK] = "风之翼",
[MaterialType.MATERIAL_NAMECARD] = "名片卡",
[MaterialType.MATERIAL_TALENT] = "天赋材料",
[MaterialType.MATERIAL_WIDGET] = "装饰物",
[MaterialType.MATERIAL_CHEST_BATCH_USE] = "礼包",
[MaterialType.MATERIAL_FAKE_ABSORBATE] = "MATERIAL_FAKE_ABSORBATE",
[MaterialType.MATERIAL_CONSUME_BATCH_USE] = "树脂",
[MaterialType.MATERIAL_WOOD] = "树木",
[MaterialType.MATERIAL_FURNITURE_FORMULA] = "尘歌壶室内摆设",
[MaterialType.MATERIAL_CHANNELLER_SLAB_BUFF] = "增益Buff",
[MaterialType.MATERIAL_FURNITURE_SUITE_FORMULA] = "尘歌壶摆设套装",
[MaterialType.MATERIAL_COSTUME] = "皮肤",
[MaterialType.MATERIAL_HOME_SEED] = "种子",
[MaterialType.MATERIAL_FISH_BAIT] = "鱼饵",
[MaterialType.MATERIAL_FISH_ROD] = "鱼竿",
[MaterialType.MATERIAL_SUMO_BUFF] = "MATERIAL_SUMO_BUFF",
[MaterialType.MATERIAL_FIREWORKS] = "烟花",
[MaterialType.MATERIAL_BGM] = "旋曜玉帛",
[MaterialType.MATERIAL_SPICE_FOOD] = "香气四溢的食物",
[MaterialType.MATERIAL_ACTIVITY_ROBOT] = "活动-兑换券",
[MaterialType.MATERIAL_ACTIVITY_GEAR] = "活动-齿轮",
[MaterialType.MATERIAL_ACTIVITY_JIGSAW] = "活动-部件",
[MaterialType.MATERIAL_ARANARA] = "兰纳罗",
[MaterialType.MATERIAL_GCG_CARD] = "七圣召唤-卡片",
[MaterialType.MATERIAL_GCG_CARD_FACE] = "七圣召唤-卡片-正面",
[MaterialType.MATERIAL_GCG_CARD_BACK] = "七圣召唤-卡片-背面",
[MaterialType.MATERIAL_GCG_FIELD] = "七圣召唤-卡片-场地",
[MaterialType.MATERIAL_DESHRET_MANUAL] = "沙漠书",
[MaterialType.MATERIAL_RENAME_ITEM] = "改名卡",
[MaterialType.MATERIAL_GCG_EXCHANGE_ITEM] = "七圣召唤-特殊卡",
[MaterialType.MATERIAL_QUEST_EVENT_BOOK] = "案件记录册",
};
private static readonly Dictionary<MaterialType, string> TextMapEN = new Dictionary<MaterialType, string>
{
[MaterialType.MATERIAL_NONE] = "None",
[MaterialType.MATERIAL_FOOD] = "Food",
[MaterialType.MATERIAL_QUEST] = "Quest",
[MaterialType.MATERIAL_EXCHANGE] = "Exchange",
[MaterialType.MATERIAL_CONSUME] = "Consume",
[MaterialType.MATERIAL_EXP_FRUIT] = "Exp_fruit",
[MaterialType.MATERIAL_AVATAR] = "Avatar",
[MaterialType.MATERIAL_ADSORBATE] = "Adsorbate",
[MaterialType.MATERIAL_CRICKET] = "Cricket",
[MaterialType.MATERIAL_ELEM_CRYSTAL] = "Elem_crystal",
[MaterialType.MATERIAL_WEAPON_EXP_STONE] = "Weapon_exp_stone",
[MaterialType.MATERIAL_CHEST] = "Chest",
[MaterialType.MATERIAL_RELIQUARY_MATERIAL] = "Reliquary_material",
[MaterialType.MATERIAL_AVATAR_MATERIAL] = "Avatar_material",
[MaterialType.MATERIAL_NOTICE_ADD_HP] = "Notice_add_hp",
[MaterialType.MATERIAL_SEA_LAMP] = "Sea_lamp",
[MaterialType.MATERIAL_SELECTABLE_CHEST] = "Selectable_chest",
[MaterialType.MATERIAL_FLYCLOAK] = "Flycloak",
[MaterialType.MATERIAL_NAMECARD] = "Namecard",
[MaterialType.MATERIAL_TALENT] = "Talent",
[MaterialType.MATERIAL_WIDGET] = "Widget",
[MaterialType.MATERIAL_CHEST_BATCH_USE] = "Chest_batch_use",
[MaterialType.MATERIAL_FAKE_ABSORBATE] = "Fake_absorbate",
[MaterialType.MATERIAL_CONSUME_BATCH_USE] = "Consume_batch_use",
[MaterialType.MATERIAL_WOOD] = "Wood",
[MaterialType.MATERIAL_FURNITURE_FORMULA] = "Furniture_formula",
[MaterialType.MATERIAL_CHANNELLER_SLAB_BUFF] = "Channeller_slab_buff",
[MaterialType.MATERIAL_FURNITURE_SUITE_FORMULA] = "Furniture_suite_formula",
[MaterialType.MATERIAL_COSTUME] = "Costume",
[MaterialType.MATERIAL_HOME_SEED] = "Home_seed",
[MaterialType.MATERIAL_FISH_BAIT] = "Fish_bait",
[MaterialType.MATERIAL_FISH_ROD] = "Fish_rod",
[MaterialType.MATERIAL_SUMO_BUFF] = "Sumo_buff",
[MaterialType.MATERIAL_FIREWORKS] = "Fireworks",
[MaterialType.MATERIAL_BGM] = "Bgm",
[MaterialType.MATERIAL_SPICE_FOOD] = "Spice_food",
[MaterialType.MATERIAL_ACTIVITY_ROBOT] = "Activity_robot",
[MaterialType.MATERIAL_ACTIVITY_GEAR] = "Activity_gear",
[MaterialType.MATERIAL_ACTIVITY_JIGSAW] = "Activity_jigsaw",
[MaterialType.MATERIAL_ARANARA] = "Aranara",
[MaterialType.MATERIAL_GCG_CARD] = "Gcg_card",
[MaterialType.MATERIAL_GCG_CARD_FACE] = "Gcg_card_face",
[MaterialType.MATERIAL_GCG_CARD_BACK] = "Gcg_card_back",
[MaterialType.MATERIAL_GCG_FIELD] = "Gcg_field",
[MaterialType.MATERIAL_DESHRET_MANUAL] = "Deshret_manual",
[MaterialType.MATERIAL_RENAME_ITEM] = "Rename_item",
[MaterialType.MATERIAL_GCG_EXCHANGE_ITEM] = "Gcg_exchange_item",
[MaterialType.MATERIAL_QUEST_EVENT_BOOK] = "Quest_event_book",
};
public static string ToTranslatedString(this MaterialType materialType, string language)
{
return language.StartsWith("zh") ? TextMapCHS[materialType] : TextMapEN[materialType];
}
}
}

View File

@@ -71,7 +71,8 @@ namespace GrasscutterTools.Game
{
get
{
foreach (var map in Values) {
foreach (var map in Values)
{
var n = map[id];
if (n != ItemMap.EmptyName)
return n;

View File

@@ -0,0 +1,10 @@
using Newtonsoft.Json;
namespace GrasscutterTools.Game.Props
{
internal class ItemUseData
{
[JsonProperty("useParam")]
public string[] UseParam { get; set; }
}
}

View File

@@ -0,0 +1,51 @@

// ReSharper disable InconsistentNaming
using System.Collections.Generic;
namespace GrasscutterTools.Game.Props
{
/// <summary>
/// 怪物种类
/// </summary>
internal enum MonsterType
{
MONSTER_NONE = 0,
MONSTER_ORDINARY = 1,
MONSTER_BOSS = 2,
MONSTER_ENV_ANIMAL = 3,
MONSTER_LITTLE_MONSTER = 4,
MONSTER_FISH = 5,
MONSTER_PARTNER = 6,
}
internal static class ItemTypeExtension
{
private static readonly Dictionary<MonsterType, string> TextMapCHS = new Dictionary<MonsterType, string>
{
[MonsterType.MONSTER_NONE] = "未分类",
[MonsterType.MONSTER_ORDINARY] = "普通怪物",
[MonsterType.MONSTER_BOSS] = "BOSS",
[MonsterType.MONSTER_ENV_ANIMAL] = "动物",
[MonsterType.MONSTER_LITTLE_MONSTER] = "小怪",
[MonsterType.MONSTER_FISH] = "鱼",
[MonsterType.MONSTER_PARTNER] = "友军",
};
private static readonly Dictionary<MonsterType, string> TextMapEN = new Dictionary<MonsterType, string>
{
[MonsterType.MONSTER_NONE] = "None",
[MonsterType.MONSTER_ORDINARY] = "Ordinary",
[MonsterType.MONSTER_BOSS] = "Boss",
[MonsterType.MONSTER_ENV_ANIMAL] = "Env_animal",
[MonsterType.MONSTER_LITTLE_MONSTER] = "Little_monster",
[MonsterType.MONSTER_FISH] = "Fish",
[MonsterType.MONSTER_PARTNER] = "Partner",
};
public static string ToTranslatedString(this MonsterType materialType, string language)
{
return language.StartsWith("zh") ? TextMapCHS[materialType] : TextMapEN[materialType];
}
}
}

View File

@@ -0,0 +1,44 @@

// ReSharper disable InconsistentNaming
namespace GrasscutterTools.Game.Props
{
internal enum QualityType
{
/// <summary>
/// 无
/// </summary>
QUALITY_NONE = 0,
/// <summary>
/// 一星
/// </summary>
QUALITY_WHITE = 1,
/// <summary>
/// 二星
/// </summary>
QUALITY_GREEN = 2,
/// <summary>
/// 三星
/// </summary>
QUALITY_BLUE = 3,
/// <summary>
/// 四星
/// </summary>
QUALITY_PURPLE = 4,
/// <summary>
/// 五星
/// </summary>
QUALITY_ORANGE = 5,
/// <summary>
/// 限定五星
/// </summary>
//QUALITY_ORANGE_SP = 105,
QUALITY_ORANGE_SP = 5,
}
}

View File

@@ -0,0 +1,16 @@

// ReSharper disable InconsistentNaming
namespace GrasscutterTools.Game.Props
{
public enum SceneType
{
SCENE_NONE = 0,
SCENE_WORLD = 1,
SCENE_DUNGEON = 2,
SCENE_ROOM = 3,
SCENE_HOME_WORLD = 4,
SCENE_HOME_ROOM = 5,
SCENE_ACTIVITY = 6,
}
}

View File

@@ -17,6 +17,7 @@
*
**/
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
@@ -31,15 +32,20 @@ namespace GrasscutterTools.Game
{
LoadManualTextMap(Path.Combine(resourcesDirPath, "ExcelBinOutput", "ManualTextMapConfigData.json"));
LoadTextMaps(Path.Combine(resourcesDirPath, "TextMap"));
LoadTextMap(TextMapFilePaths[Array.IndexOf(TextMapFiles, "TextMapCHS")]);
DefaultTextMap = TextMap;
}
public Dictionary<string, string> ManualTextMap;
public Dictionary<string, string> DefaultTextMap;
public Dictionary<string, string> TextMap;
public string[] TextMapFilePaths;
public string[] TextMapFiles;
private void LoadManualTextMap(string manualTextMapPath)
{
if (!File.Exists(manualTextMapPath)) return;
using (var fs = File.OpenRead(manualTextMapPath))
using (var sr = new StreamReader(fs))
using (var reader = new JsonTextReader(sr))
@@ -81,5 +87,31 @@ namespace GrasscutterTools.Game
}
}
}
public bool Contains(string textMapPath) => TextMap.ContainsKey(textMapPath) || DefaultTextMap.ContainsKey(textMapPath);
public string GetText(string textMapHash)
{
return TextMap.TryGetValue(textMapHash, out var text) ? text
: DefaultTextMap.TryGetValue(textMapHash, out text) ? "[CHS] - " + text
: "[N/A] " + textMapHash;
}
public bool TryGetText(string textMapHash, out string text)
{
if (TextMap.TryGetValue(textMapHash, out text))
{
return true;
}
if (DefaultTextMap.TryGetValue(textMapHash, out text))
{
text = "[CHS] - " + text;
return true;
}
text = "[N/A] " + textMapHash;
return false;
}
}
}

View File

@@ -136,21 +136,46 @@
<DependentUpon>FormTextMapBrowser.cs</DependentUpon>
</Compile>
<Compile Include="Game\Activity\ActivityConfigItem.cs" />
<Compile Include="Game\Activity\NewActivityItem.cs" />
<Compile Include="Game\CommandVersion.cs" />
<Compile Include="Game\CutScene\CutSceneItem.cs" />
<Compile Include="Game\Data\Excels\AvatarData.cs" />
<Compile Include="Game\Data\Excels\AchievementData.cs" />
<Compile Include="Game\Data\Excels\DungeonData.cs" />
<Compile Include="Game\Data\Excels\GadgetData.cs" />
<Compile Include="Game\Data\Excels\HomeWorldBgmData.cs" />
<Compile Include="Game\Data\Excels\HomeWorldFurnitureData.cs" />
<Compile Include="Game\Data\Excels\MaterialData.cs" />
<Compile Include="Game\Data\Excels\MainQuestData.cs" />
<Compile Include="Game\Data\Excels\QuestData.cs" />
<Compile Include="Game\Data\Excels\ReliquaryData.cs" />
<Compile Include="Game\Data\Excels\MonsterData.cs" />
<Compile Include="Game\Data\Excels\SceneData.cs" />
<Compile Include="Game\Data\GameResource.cs" />
<Compile Include="Game\Data\GameResources.cs" />
<Compile Include="Game\Data\ResourceTypeAttribute.cs" />
<Compile Include="Game\Drop\DropData.cs" />
<Compile Include="Game\Drop\DropInfo.cs" />
<Compile Include="Game\Dungeon\DungeonItem.cs" />
<Compile Include="Game\Gacha\GachaBanner3.cs" />
<Compile Include="Game\Gacha\GachaBanner2.cs" />
<Compile Include="Game\GameCommand.cs" />
<Compile Include="Game\Gacha\BannerType.cs" />
<Compile Include="Game\Gacha\GachaBanner.cs" />
<Compile Include="Game\GameData.cs" />
<Compile Include="Game\Inventory\ItemType.cs" />
<Compile Include="Game\Inventory\MaterialType.cs" />
<Compile Include="Game\Data\Excels\WeaponData.cs" />
<Compile Include="Game\ItemMap.cs" />
<Compile Include="Game\ItemMapGroup.cs" />
<Compile Include="Game\Mail\Mail.cs" />
<Compile Include="Game\Mail\MailItem.cs" />
<Compile Include="Game\Player\PlayerData.cs" />
<Compile Include="Game\Props\ItemUseData.cs" />
<Compile Include="Game\Props\MonsterType.cs" />
<Compile Include="Game\Props\PlayerProperty.cs" />
<Compile Include="Game\Props\QualityType.cs" />
<Compile Include="Game\Props\SceneType.cs" />
<Compile Include="Game\SetStatsCommand.cs" />
<Compile Include="Game\Shop\ItemParamData.cs" />
<Compile Include="Game\Shop\ShopGoodsData.cs" />
@@ -216,6 +241,12 @@
<Compile Include="Pages\PageHome.Designer.cs">
<DependentUpon>PageHome.cs</DependentUpon>
</Compile>
<Compile Include="Pages\PageHotKey.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Pages\PageHotKey.Designer.cs">
<DependentUpon>PageHotKey.cs</DependentUpon>
</Compile>
<Compile Include="Pages\PageMail.cs">
<SubType>UserControl</SubType>
</Compile>
@@ -277,11 +308,17 @@
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
</Compile>
<Compile Include="Utils\AppHotKey.cs" />
<Compile Include="Utils\ArtifactUtils.cs" />
<Compile Include="Utils\Common.cs" />
<Compile Include="Utils\GuiRedirect.cs" />
<Compile Include="Utils\KeyGo.cs" />
<Compile Include="Utils\HotKeyItem.cs" />
<Compile Include="Utils\HttpHelper.cs" />
<Compile Include="Utils\Logger.cs" />
<Compile Include="Utils\GithubHelper.cs" />
<Compile Include="Utils\SparseSet.cs" />
<Compile Include="Utils\ToggleParser.cs" />
<Compile Include="Utils\UIUtil.cs" />
<EmbeddedResource Include="Forms\FormActivityEditor.en-US.resx">
<DependentUpon>FormActivityEditor.cs</DependentUpon>
@@ -437,6 +474,7 @@
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageGiveArtifact.resx">
<DependentUpon>PageGiveArtifact.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageGiveArtifact.ru-RU.resx">
<DependentUpon>PageGiveArtifact.cs</DependentUpon>
@@ -481,6 +519,18 @@
<EmbeddedResource Include="Pages\PageHome.zh-TW.resx">
<DependentUpon>PageHome.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageHotKey.en-US.resx">
<DependentUpon>PageHotKey.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageHotKey.resx">
<DependentUpon>PageHotKey.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageHotKey.ru-RU.resx">
<DependentUpon>PageHotKey.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageHotKey.zh-TW.resx">
<DependentUpon>PageHotKey.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Pages\PageMail.en-US.resx">
<DependentUpon>PageMail.cs</DependentUpon>
</EmbeddedResource>
@@ -635,6 +685,7 @@
</ItemGroup>
<ItemGroup>
<Content Include="Resources\en-us\Achievement.txt" />
<Content Include="Resources\en-us\Activity.txt" />
<Content Include="Resources\en-us\Artifact.txt" />
<Content Include="Resources\en-us\ArtifactCat.txt" />
<Content Include="Resources\en-us\ArtifactMainAttribution.txt" />
@@ -642,6 +693,7 @@
<Content Include="Resources\en-us\Avatar.txt" />
<Content Include="Resources\en-us\CustomCommands.txt" />
<None Include="Resources\en-us\Dungeon.txt" />
<Content Include="Resources\en-us\Cutscene.txt" />
<Content Include="Resources\en-us\GachaBennerTitle.txt" />
<Content Include="Resources\en-us\GachaBennerPrefab.txt" />
<Content Include="Resources\en-us\Gadget.txt" />
@@ -655,6 +707,7 @@
<None Include="Resources\Newtonsoft.Json.dll" />
<Content Include="Resources\MyTools.java" />
<Content Include="Resources\ru-ru\Achievement.txt" />
<Content Include="Resources\ru-ru\Activity.txt" />
<Content Include="Resources\ru-ru\Artifact.txt" />
<Content Include="Resources\ru-ru\ArtifactCat.txt" />
<Content Include="Resources\ru-ru\ArtifactMainAttribution.txt" />
@@ -662,6 +715,7 @@
<Content Include="Resources\ru-ru\Avatar.txt" />
<Content Include="Resources\ru-ru\CustomCommands.txt" />
<None Include="Resources\ru-ru\Dungeon.txt" />
<Content Include="Resources\ru-ru\Cutscene.txt" />
<Content Include="Resources\ru-ru\GachaBennerTitle.txt" />
<Content Include="Resources\ru-ru\GachaBennerPrefab.txt" />
<Content Include="Resources\ru-ru\Gadget.txt" />
@@ -687,6 +741,7 @@
<Content Include="Resources\zh-cn\CustomCommands.txt" />
<Content Include="Resources\AvatarColor.txt" />
<None Include="Resources\zh-cn\Dungeon.txt" />
<Content Include="Resources\zh-cn\Cutscene.txt" />
<Content Include="Resources\zh-cn\GachaBannerTitle.txt" />
<Content Include="Resources\zh-cn\GachaBennerPrefab.txt" />
<Content Include="Resources\zh-cn\Gadget.txt" />
@@ -698,6 +753,7 @@
<Content Include="Resources\zh-cn\ShopType.txt" />
<Content Include="Resources\zh-cn\Weapon.txt" />
<Content Include="Resources\zh-tw\Achievement.txt" />
<Content Include="Resources\zh-tw\Activity.txt" />
<Content Include="Resources\zh-tw\ArtifactCat.txt" />
<Content Include="Resources\zh-tw\ArtifactMainAttribution.txt" />
<Content Include="Resources\zh-tw\Artifact.txt" />
@@ -705,6 +761,7 @@
<Content Include="Resources\zh-tw\Avatar.txt" />
<Content Include="Resources\zh-tw\CustomCommands.txt" />
<None Include="Resources\zh-tw\Dungeon.txt" />
<Content Include="Resources\zh-tw\Cutscene.txt" />
<Content Include="Resources\zh-tw\GachaBennerTitle.txt" />
<Content Include="Resources\zh-tw\GachaBennerPrefab.txt" />
<Content Include="Resources\zh-tw\Item.txt" />
@@ -731,9 +788,6 @@
<PackageReference Include="Resource.Embedder">
<Version>2.2.0</Version>
</PackageReference>
<PackageReference Include="System.IO.Compression.ZipFile">
<Version>4.3.0</Version>
</PackageReference>
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

View File

@@ -46,15 +46,15 @@ namespace GrasscutterTools.OpenCommand
public async Task<bool> Ping()
{
try
{
var response = await DoRequest("ping");
return response.RetCode == 200;
}
catch (Exception)
{
return false;
}
//try
//{
var response = await DoRequest("ping");
return response.RetCode == 200;
//}
//catch (Exception)
//{
// return false;
//}
}
public async Task SendCode(int playerId)

View File

@@ -141,7 +141,7 @@
如果愿意请我喝一杯奶茶,那就更好了 : )
指令生成有问题或者有新的功能请求都可以来Github提出
欢迎加入内测Q群: 457427536 (需要回答正确答案)</value>
欢迎加入内测Q群: 835489603 (需要回答正确答案)</value>
</data>
<data name="&gt;&gt;GrasscutterToolsSupport.Parent" xml:space="preserve">
<value>$this</value>
@@ -268,4 +268,4 @@
<metadata name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>ru-RU</value>
</metadata>
</root>
</root>

View File

@@ -1,6 +1,7 @@
using System;
using System.Linq;
using System.Windows.Forms;
using GrasscutterTools.Game;
using GrasscutterTools.Properties;
using GrasscutterTools.Utils;
@@ -98,4 +99,4 @@ namespace GrasscutterTools.Pages
GenSelected("/achievement progress", NUDProgress.Text);
}
}
}
}

View File

@@ -38,6 +38,7 @@
this.BtnRemoveCustomCommand = new System.Windows.Forms.Button();
this.BtnSaveCustomCommand = new System.Windows.Forms.Button();
this.TxtCustomName = new System.Windows.Forms.TextBox();
this.BtnAddHotKey = new System.Windows.Forms.Button();
this.GrpCustomCommands.SuspendLayout();
this.SuspendLayout();
//
@@ -100,10 +101,18 @@
this.TxtCustomName.Name = "TxtCustomName";
this.TxtCustomName.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TxtCustomName_KeyDown);
//
// BtnAddHotKey
//
resources.ApplyResources(this.BtnAddHotKey, "BtnAddHotKey");
this.BtnAddHotKey.Name = "BtnAddHotKey";
this.BtnAddHotKey.UseVisualStyleBackColor = true;
this.BtnAddHotKey.Click += new System.EventHandler(this.BtnAddHotKey_Click);
//
// PageCustomCommands
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.BtnAddHotKey);
this.Controls.Add(this.BtnExportCustomCommands);
this.Controls.Add(this.BtnLoadCustomCommands);
this.Controls.Add(this.LblCustomName);
@@ -130,5 +139,6 @@
private System.Windows.Forms.Button BtnRemoveCustomCommand;
private System.Windows.Forms.Button BtnSaveCustomCommand;
private System.Windows.Forms.TextBox TxtCustomName;
private System.Windows.Forms.Button BtnAddHotKey;
}
}

View File

@@ -248,5 +248,18 @@ namespace GrasscutterTools.Pages
LoadCustomCommandControls(Resources.CustomCommands);
}
}
public Action<string> OnAddHotKey;
private void BtnAddHotKey_Click(object sender, EventArgs e)
{
var name = TxtCustomName.Text.Trim();
if (string.IsNullOrEmpty(name))
{
MessageBox.Show(Resources.CommandTagCannotBeEmpty, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
OnAddHotKey?.Invoke(name);
}
}
}

View File

@@ -119,19 +119,19 @@
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="BtnExportCustomCommands.Location" type="System.Drawing.Point, System.Drawing">
<value>573, 209</value>
<value>573, 206</value>
</data>
<data name="BtnExportCustomCommands.Size" type="System.Drawing.Size, System.Drawing">
<value>70, 23</value>
<value>70, 30</value>
</data>
<data name="BtnExportCustomCommands.Text" xml:space="preserve">
<value>Export</value>
</data>
<data name="BtnLoadCustomCommands.Location" type="System.Drawing.Point, System.Drawing">
<value>497, 209</value>
<value>497, 206</value>
</data>
<data name="BtnLoadCustomCommands.Size" type="System.Drawing.Size, System.Drawing">
<value>70, 23</value>
<value>70, 30</value>
</data>
<data name="BtnLoadCustomCommands.Text" xml:space="preserve">
<value>Load</value>
@@ -155,24 +155,30 @@
<value>Restore</value>
</data>
<data name="BtnRemoveCustomCommand.Location" type="System.Drawing.Point, System.Drawing">
<value>421, 209</value>
<value>421, 206</value>
</data>
<data name="BtnRemoveCustomCommand.Size" type="System.Drawing.Size, System.Drawing">
<value>70, 23</value>
<value>70, 30</value>
</data>
<data name="BtnRemoveCustomCommand.Text" xml:space="preserve">
<value>× Delete</value>
</data>
<data name="BtnSaveCustomCommand.Location" type="System.Drawing.Point, System.Drawing">
<value>345, 209</value>
<value>345, 206</value>
</data>
<data name="BtnSaveCustomCommand.Size" type="System.Drawing.Size, System.Drawing">
<value>70, 23</value>
<value>70, 30</value>
</data>
<data name="BtnSaveCustomCommand.Text" xml:space="preserve">
<value>√ Save</value>
</data>
<data name="TxtCustomName.Size" type="System.Drawing.Size, System.Drawing">
<value>298, 23</value>
<value>217, 23</value>
</data>
<data name="BtnAddHotKey.Location" type="System.Drawing.Point, System.Drawing">
<value>264, 206</value>
</data>
<data name="BtnAddHotKey.Text" xml:space="preserve">
<value>HotKey</value>
</data>
</root>

View File

@@ -117,283 +117,310 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="BtnExportCustomCommands.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
</data>
<data name="BtnExportCustomCommands.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="BtnExportCustomCommands.Location" type="System.Drawing.Point, System.Drawing">
<value>590, 209</value>
</data>
<data name="BtnExportCustomCommands.Size" type="System.Drawing.Size, System.Drawing">
<value>50, 23</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="BtnExportCustomCommands.TabIndex" type="System.Int32, mscorlib">
<value>14</value>
</data>
<data name="BtnExportCustomCommands.Text" xml:space="preserve">
<value>导出</value>
</data>
<data name="&gt;&gt;BtnExportCustomCommands.Name" xml:space="preserve">
<value>BtnExportCustomCommands</value>
</data>
<data name="&gt;&gt;BtnExportCustomCommands.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BtnExportCustomCommands.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;BtnExportCustomCommands.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="BtnLoadCustomCommands.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
</data>
<data name="BtnLoadCustomCommands.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="BtnLoadCustomCommands.Location" type="System.Drawing.Point, System.Drawing">
<value>534, 209</value>
</data>
<data name="BtnLoadCustomCommands.Size" type="System.Drawing.Size, System.Drawing">
<value>50, 23</value>
</data>
<data name="BtnLoadCustomCommands.TabIndex" type="System.Int32, mscorlib">
<value>13</value>
</data>
<data name="BtnLoadCustomCommands.Text" xml:space="preserve">
<value>载入</value>
</data>
<data name="&gt;&gt;BtnLoadCustomCommands.Name" xml:space="preserve">
<value>BtnLoadCustomCommands</value>
</data>
<data name="&gt;&gt;BtnLoadCustomCommands.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BtnLoadCustomCommands.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;BtnLoadCustomCommands.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="LblCustomName.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="LblCustomName.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblCustomName.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblCustomName.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 212</value>
</data>
<data name="LblCustomName.Size" type="System.Drawing.Size, System.Drawing">
<value>32, 17</value>
</data>
<data name="LblCustomName.TabIndex" type="System.Int32, mscorlib">
<value>9</value>
</data>
<data name="LblCustomName.Text" xml:space="preserve">
<value>标签</value>
</data>
<data name="&gt;&gt;LblCustomName.Name" xml:space="preserve">
<value>LblCustomName</value>
</data>
<data name="&gt;&gt;LblCustomName.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblCustomName.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblCustomName.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="GrpCustomCommands.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left, Right</value>
</data>
<data name="LnkResetCustomCommands.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
</data>
<data name="LnkResetCustomCommands.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LnkResetCustomCommands.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LnkResetCustomCommands.Location" type="System.Drawing.Point, System.Drawing">
<value>602, -1</value>
</data>
<data name="LnkResetCustomCommands.Size" type="System.Drawing.Size, System.Drawing">
<value>32, 17</value>
</data>
<data name="LnkResetCustomCommands.TabIndex" type="System.Int32, mscorlib">
<value>8</value>
<data name="BtnAddHotKey.Text" xml:space="preserve">
<value>快捷键</value>
</data>
<data name="LnkResetCustomCommands.Text" xml:space="preserve">
<value>重置</value>
</data>
<data name="&gt;&gt;LnkResetCustomCommands.Name" xml:space="preserve">
<value>LnkResetCustomCommands</value>
</data>
<data name="&gt;&gt;LnkResetCustomCommands.Type" xml:space="preserve">
<value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LnkResetCustomCommands.Parent" xml:space="preserve">
<value>GrpCustomCommands</value>
</data>
<data name="&gt;&gt;LnkResetCustomCommands.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="FLPCustomCommands.AutoScroll" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="FLPCustomCommands.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="FLPCustomCommands.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 19</value>
</data>
<data name="FLPCustomCommands.Size" type="System.Drawing.Size, System.Drawing">
<value>634, 174</value>
</data>
<data name="FLPCustomCommands.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="&gt;&gt;FLPCustomCommands.Name" xml:space="preserve">
<value>FLPCustomCommands</value>
</data>
<data name="&gt;&gt;FLPCustomCommands.Type" xml:space="preserve">
<value>System.Windows.Forms.FlowLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;FLPCustomCommands.Parent" xml:space="preserve">
<value>GrpCustomCommands</value>
</data>
<data name="&gt;&gt;FLPCustomCommands.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="GrpCustomCommands.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 7</value>
</data>
<data name="GrpCustomCommands.Size" type="System.Drawing.Size, System.Drawing">
<value>640, 196</value>
</data>
<data name="GrpCustomCommands.TabIndex" type="System.Int32, mscorlib">
<value>8</value>
</data>
<data name="GrpCustomCommands.Text" xml:space="preserve">
<value>列表</value>
</data>
<data name="&gt;&gt;GrpCustomCommands.Name" xml:space="preserve">
<value>GrpCustomCommands</value>
</data>
<data name="&gt;&gt;GrpCustomCommands.Type" xml:space="preserve">
<value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;GrpCustomCommands.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;GrpCustomCommands.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="BtnRemoveCustomCommand.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
</data>
<data name="BtnRemoveCustomCommand.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="BtnRemoveCustomCommand.Location" type="System.Drawing.Point, System.Drawing">
<value>468, 209</value>
</data>
<data name="BtnRemoveCustomCommand.Size" type="System.Drawing.Size, System.Drawing">
<value>60, 23</value>
</data>
<data name="BtnRemoveCustomCommand.TabIndex" type="System.Int32, mscorlib">
<value>12</value>
</data>
<data name="BtnRemoveCustomCommand.Text" xml:space="preserve">
<value>× 删除</value>
</data>
<data name="&gt;&gt;BtnRemoveCustomCommand.Name" xml:space="preserve">
<value>BtnRemoveCustomCommand</value>
</data>
<data name="&gt;&gt;BtnRemoveCustomCommand.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BtnRemoveCustomCommand.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;BtnRemoveCustomCommand.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="BtnSaveCustomCommand.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
</data>
<data name="BtnSaveCustomCommand.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="BtnSaveCustomCommand.Location" type="System.Drawing.Point, System.Drawing">
<value>402, 209</value>
</data>
<data name="BtnSaveCustomCommand.Size" type="System.Drawing.Size, System.Drawing">
<value>60, 23</value>
</data>
<data name="BtnSaveCustomCommand.TabIndex" type="System.Int32, mscorlib">
<value>11</value>
</data>
<data name="BtnSaveCustomCommand.Text" xml:space="preserve">
<value>√ 保存</value>
</data>
<data name="&gt;&gt;BtnSaveCustomCommand.Name" xml:space="preserve">
<value>BtnSaveCustomCommand</value>
</data>
<data name="&gt;&gt;BtnSaveCustomCommand.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BtnSaveCustomCommand.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;BtnSaveCustomCommand.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="TxtCustomName.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left, Right</value>
</data>
<data name="TxtCustomName.Location" type="System.Drawing.Point, System.Drawing">
<value>41, 209</value>
</data>
<data name="TxtCustomName.Size" type="System.Drawing.Size, System.Drawing">
<value>355, 23</value>
</data>
<data name="TxtCustomName.TabIndex" type="System.Int32, mscorlib">
<value>10</value>
</data>
<data name="&gt;&gt;TxtCustomName.Name" xml:space="preserve">
<value>TxtCustomName</value>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.11.0.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
</data>
<data name="&gt;&gt;TxtCustomName.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="BtnSaveCustomCommand.Location" type="System.Drawing.Point, System.Drawing">
<value>405, 206</value>
</data>
<data name="BtnRemoveCustomCommand.Location" type="System.Drawing.Point, System.Drawing">
<value>471, 206</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="BtnLoadCustomCommands.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
</data>
<data name="LnkResetCustomCommands.Size" type="System.Drawing.Size, System.Drawing">
<value>32, 17</value>
</data>
<data name="&gt;&gt;BtnExportCustomCommands.Name" xml:space="preserve">
<value>BtnExportCustomCommands</value>
</data>
<data name="BtnLoadCustomCommands.Location" type="System.Drawing.Point, System.Drawing">
<value>537, 206</value>
</data>
<data name="LnkResetCustomCommands.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="GrpCustomCommands.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 3</value>
</data>
<data name="BtnRemoveCustomCommand.Size" type="System.Drawing.Size, System.Drawing">
<value>60, 30</value>
</data>
<data name="TxtCustomName.Location" type="System.Drawing.Point, System.Drawing">
<value>41, 210</value>
</data>
<data name="&gt;&gt;FLPCustomCommands.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="LnkResetCustomCommands.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
</data>
<data name="&gt;&gt;BtnExportCustomCommands.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="BtnExportCustomCommands.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="&gt;&gt;BtnLoadCustomCommands.Name" xml:space="preserve">
<value>BtnLoadCustomCommands</value>
</data>
<data name="BtnRemoveCustomCommand.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="FLPCustomCommands.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="LblCustomName.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="&gt;&gt;LnkResetCustomCommands.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="BtnAddHotKey.TabIndex" type="System.Int32, mscorlib">
<value>15</value>
</data>
<data name="&gt;&gt;BtnLoadCustomCommands.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblCustomName.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="TxtCustomName.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left, Right</value>
</data>
<data name="BtnExportCustomCommands.Text" xml:space="preserve">
<value>导出</value>
</data>
<data name="&gt;&gt;LnkResetCustomCommands.Name" xml:space="preserve">
<value>LnkResetCustomCommands</value>
</data>
<data name="LblCustomName.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LnkResetCustomCommands.TabIndex" type="System.Int32, mscorlib">
<value>8</value>
</data>
<data name="&gt;&gt;BtnRemoveCustomCommand.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="LblCustomName.Size" type="System.Drawing.Size, System.Drawing">
<value>32, 17</value>
</data>
<data name="BtnLoadCustomCommands.Size" type="System.Drawing.Size, System.Drawing">
<value>50, 30</value>
</data>
<data name="&gt;&gt;BtnLoadCustomCommands.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="BtnLoadCustomCommands.TabIndex" type="System.Int32, mscorlib">
<value>13</value>
</data>
<data name="LblCustomName.Text" xml:space="preserve">
<value>标签</value>
</data>
<data name="&gt;&gt;TxtCustomName.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;TxtCustomName.ZOrder" xml:space="preserve">
<data name="BtnSaveCustomCommand.Size" type="System.Drawing.Size, System.Drawing">
<value>60, 30</value>
</data>
<data name="&gt;&gt;GrpCustomCommands.Name" xml:space="preserve">
<value>GrpCustomCommands</value>
</data>
<data name="&gt;&gt;BtnAddHotKey.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="&gt;&gt;BtnRemoveCustomCommand.Name" xml:space="preserve">
<value>BtnRemoveCustomCommand</value>
</data>
<data name="BtnAddHotKey.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
</data>
<data name="&gt;&gt;GrpCustomCommands.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="BtnExportCustomCommands.Size" type="System.Drawing.Size, System.Drawing">
<value>50, 30</value>
</data>
<data name="&gt;&gt;FLPCustomCommands.Name" xml:space="preserve">
<value>FLPCustomCommands</value>
</data>
<data name="BtnExportCustomCommands.TabIndex" type="System.Int32, mscorlib">
<value>14</value>
</data>
<data name="BtnExportCustomCommands.Location" type="System.Drawing.Point, System.Drawing">
<value>593, 206</value>
</data>
<data name="&gt;&gt;BtnLoadCustomCommands.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="&gt;&gt;GrpCustomCommands.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="FLPCustomCommands.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="&gt;&gt;BtnSaveCustomCommand.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="LblCustomName.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="&gt;&gt;BtnSaveCustomCommand.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="FLPCustomCommands.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 19</value>
</data>
<data name="TxtCustomName.Size" type="System.Drawing.Size, System.Drawing">
<value>277, 23</value>
</data>
<data name="LnkResetCustomCommands.Location" type="System.Drawing.Point, System.Drawing">
<value>602, -1</value>
</data>
<data name="GrpCustomCommands.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left, Right</value>
</data>
<data name="BtnSaveCustomCommand.Text" xml:space="preserve">
<value>√ 保存</value>
</data>
<data name="&gt;&gt;LnkResetCustomCommands.Parent" xml:space="preserve">
<value>GrpCustomCommands</value>
</data>
<data name="&gt;&gt;FLPCustomCommands.Type" xml:space="preserve">
<value>System.Windows.Forms.FlowLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>7, 17</value>
</data>
<data name="BtnAddHotKey.Size" type="System.Drawing.Size, System.Drawing">
<value>75, 30</value>
</data>
<data name="&gt;&gt;LblCustomName.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="&gt;&gt;TxtCustomName.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="&gt;&gt;BtnRemoveCustomCommand.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;BtnSaveCustomCommand.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="BtnAddHotKey.Location" type="System.Drawing.Point, System.Drawing">
<value>324, 206</value>
</data>
<data name="&gt;&gt;FLPCustomCommands.Parent" xml:space="preserve">
<value>GrpCustomCommands</value>
</data>
<data name="&gt;&gt;LnkResetCustomCommands.Type" xml:space="preserve">
<value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="LnkResetCustomCommands.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="BtnExportCustomCommands.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
</data>
<data name="FLPCustomCommands.Size" type="System.Drawing.Size, System.Drawing">
<value>634, 178</value>
</data>
<data name="GrpCustomCommands.Size" type="System.Drawing.Size, System.Drawing">
<value>640, 200</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>PageCustomCommands</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.7.4.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
<data name="GrpCustomCommands.Text" xml:space="preserve">
<value>列表</value>
</data>
<data name="BtnRemoveCustomCommand.Text" xml:space="preserve">
<value>× 删除</value>
</data>
<data name="&gt;&gt;LblCustomName.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BtnExportCustomCommands.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="&gt;&gt;TxtCustomName.Name" xml:space="preserve">
<value>TxtCustomName</value>
</data>
<data name="TxtCustomName.TabIndex" type="System.Int32, mscorlib">
<value>10</value>
</data>
<data name="FLPCustomCommands.AutoScroll" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="&gt;&gt;GrpCustomCommands.Type" xml:space="preserve">
<value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="BtnSaveCustomCommand.TabIndex" type="System.Int32, mscorlib">
<value>11</value>
</data>
<data name="BtnSaveCustomCommand.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
</data>
<data name="BtnRemoveCustomCommand.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
</data>
<data name="&gt;&gt;BtnAddHotKey.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="LblCustomName.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 213</value>
</data>
<data name="&gt;&gt;BtnAddHotKey.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;BtnSaveCustomCommand.Name" xml:space="preserve">
<value>BtnSaveCustomCommand</value>
</data>
<data name="BtnRemoveCustomCommand.TabIndex" type="System.Int32, mscorlib">
<value>12</value>
</data>
<data name="BtnLoadCustomCommands.Text" xml:space="preserve">
<value>载入</value>
</data>
<data name="GrpCustomCommands.TabIndex" type="System.Int32, mscorlib">
<value>8</value>
</data>
<data name="BtnSaveCustomCommand.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblCustomName.TabIndex" type="System.Int32, mscorlib">
<value>9</value>
</data>
<data name="BtnLoadCustomCommands.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="&gt;&gt;LblCustomName.Name" xml:space="preserve">
<value>LblCustomName</value>
</data>
<data name="&gt;&gt;BtnAddHotKey.Name" xml:space="preserve">
<value>BtnAddHotKey</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
</root>

View File

@@ -119,19 +119,19 @@
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="BtnExportCustomCommands.Location" type="System.Drawing.Point, System.Drawing">
<value>545, 209</value>
<value>548, 206</value>
</data>
<data name="BtnExportCustomCommands.Size" type="System.Drawing.Size, System.Drawing">
<value>95, 23</value>
<value>95, 30</value>
</data>
<data name="BtnExportCustomCommands.Text" xml:space="preserve">
<value>Экспорт</value>
</data>
<data name="BtnLoadCustomCommands.Location" type="System.Drawing.Point, System.Drawing">
<value>444, 209</value>
<value>447, 206</value>
</data>
<data name="BtnLoadCustomCommands.Size" type="System.Drawing.Size, System.Drawing">
<value>95, 23</value>
<value>95, 30</value>
</data>
<data name="BtnLoadCustomCommands.Text" xml:space="preserve">
<value>Загрузить</value>
@@ -155,24 +155,33 @@
<value>Сбросить</value>
</data>
<data name="BtnRemoveCustomCommand.Location" type="System.Drawing.Point, System.Drawing">
<value>343, 209</value>
<value>346, 206</value>
</data>
<data name="BtnRemoveCustomCommand.Size" type="System.Drawing.Size, System.Drawing">
<value>95, 23</value>
<value>95, 30</value>
</data>
<data name="BtnRemoveCustomCommand.Text" xml:space="preserve">
<value>x Удалить</value>
</data>
<data name="BtnSaveCustomCommand.Location" type="System.Drawing.Point, System.Drawing">
<value>242, 209</value>
<value>245, 206</value>
</data>
<data name="BtnSaveCustomCommand.Size" type="System.Drawing.Size, System.Drawing">
<value>95, 23</value>
<value>95, 30</value>
</data>
<data name="BtnSaveCustomCommand.Text" xml:space="preserve">
<value>√ Сохранить</value>
</data>
<data name="TxtCustomName.Size" type="System.Drawing.Size, System.Drawing">
<value>195, 23</value>
<value>120, 23</value>
</data>
<data name="BtnAddHotKey.Location" type="System.Drawing.Point, System.Drawing">
<value>167, 206</value>
</data>
<data name="BtnAddHotKey.Size" type="System.Drawing.Size, System.Drawing">
<value>72, 30</value>
</data>
<data name="BtnAddHotKey.Text" xml:space="preserve">
<value>Горячая.</value>
</data>
</root>

View File

@@ -129,4 +129,7 @@
<data name="BtnRemoveCustomCommand.Text" xml:space="preserve">
<value>× 刪除</value>
</data>
<data name="BtnAddHotKey.Text" xml:space="preserve">
<value>快捷鍵</value>
</data>
</root>

View File

@@ -172,6 +172,7 @@
this.CmbMainAttribution.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.CmbMainAttribution.FormattingEnabled = true;
this.CmbMainAttribution.Name = "CmbMainAttribution";
this.CmbMainAttribution.SelectedIndexChanged += new System.EventHandler(this.ArtifactInputChanged);
//
// LblMainAttribution
//

View File

@@ -706,6 +706,6 @@
<value>PageGiveArtifact</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.7.4.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.9.0.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
</data>
</root>

View File

@@ -200,6 +200,5 @@ namespace GrasscutterTools.Pages
LnkNewVersion.Visible = false;
}
}
}
}

View File

@@ -0,0 +1,149 @@
namespace GrasscutterTools.Pages
{
partial class PageHotKey
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PageHotKey));
this.LvHotKeyList = new System.Windows.Forms.ListView();
this.ColTag = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.ColHotKey = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.ColCommand = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.GrpHotKeyList = new System.Windows.Forms.GroupBox();
this.BtnRemove = new System.Windows.Forms.Button();
this.BtnAddOrUpdate = new System.Windows.Forms.Button();
this.TxtHotKey = new System.Windows.Forms.TextBox();
this.LblHotKeyLabel = new System.Windows.Forms.Label();
this.TxtTag = new System.Windows.Forms.TextBox();
this.LblTagLabel = new System.Windows.Forms.Label();
this.GrpHotKeyList.SuspendLayout();
this.SuspendLayout();
//
// LvHotKeyList
//
this.LvHotKeyList.CheckBoxes = true;
this.LvHotKeyList.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.ColTag,
this.ColHotKey,
this.ColCommand});
resources.ApplyResources(this.LvHotKeyList, "LvHotKeyList");
this.LvHotKeyList.HideSelection = false;
this.LvHotKeyList.Name = "LvHotKeyList";
this.LvHotKeyList.UseCompatibleStateImageBehavior = false;
this.LvHotKeyList.View = System.Windows.Forms.View.Details;
this.LvHotKeyList.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.LvHotKeyList_ItemCheck);
this.LvHotKeyList.SelectedIndexChanged += new System.EventHandler(this.LvHotKeyList_SelectedIndexChanged);
//
// ColTag
//
resources.ApplyResources(this.ColTag, "ColTag");
//
// ColHotKey
//
resources.ApplyResources(this.ColHotKey, "ColHotKey");
//
// ColCommand
//
resources.ApplyResources(this.ColCommand, "ColCommand");
//
// GrpHotKeyList
//
resources.ApplyResources(this.GrpHotKeyList, "GrpHotKeyList");
this.GrpHotKeyList.Controls.Add(this.LvHotKeyList);
this.GrpHotKeyList.Name = "GrpHotKeyList";
this.GrpHotKeyList.TabStop = false;
//
// BtnRemove
//
resources.ApplyResources(this.BtnRemove, "BtnRemove");
this.BtnRemove.Name = "BtnRemove";
this.BtnRemove.UseVisualStyleBackColor = true;
this.BtnRemove.Click += new System.EventHandler(this.BtnRemove_Click);
//
// BtnAddOrUpdate
//
resources.ApplyResources(this.BtnAddOrUpdate, "BtnAddOrUpdate");
this.BtnAddOrUpdate.Name = "BtnAddOrUpdate";
this.BtnAddOrUpdate.UseVisualStyleBackColor = true;
this.BtnAddOrUpdate.Click += new System.EventHandler(this.BtnAddOrUpdate_Click);
//
// TxtHotKey
//
resources.ApplyResources(this.TxtHotKey, "TxtHotKey");
this.TxtHotKey.BackColor = System.Drawing.Color.White;
this.TxtHotKey.Name = "TxtHotKey";
this.TxtHotKey.ReadOnly = true;
this.TxtHotKey.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TxtHotKey_KeyDown);
//
// LblHotKeyLabel
//
resources.ApplyResources(this.LblHotKeyLabel, "LblHotKeyLabel");
this.LblHotKeyLabel.Name = "LblHotKeyLabel";
//
// TxtTag
//
resources.ApplyResources(this.TxtTag, "TxtTag");
this.TxtTag.Name = "TxtTag";
//
// LblTagLabel
//
resources.ApplyResources(this.LblTagLabel, "LblTagLabel");
this.LblTagLabel.Name = "LblTagLabel";
//
// PageHotKey
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.BtnRemove);
this.Controls.Add(this.BtnAddOrUpdate);
this.Controls.Add(this.GrpHotKeyList);
this.Controls.Add(this.TxtHotKey);
this.Controls.Add(this.TxtTag);
this.Controls.Add(this.LblHotKeyLabel);
this.Controls.Add(this.LblTagLabel);
this.Name = "PageHotKey";
this.GrpHotKeyList.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ListView LvHotKeyList;
private System.Windows.Forms.ColumnHeader ColHotKey;
private System.Windows.Forms.ColumnHeader ColTag;
private System.Windows.Forms.ColumnHeader ColCommand;
private System.Windows.Forms.GroupBox GrpHotKeyList;
private System.Windows.Forms.Button BtnRemove;
private System.Windows.Forms.Button BtnAddOrUpdate;
private System.Windows.Forms.TextBox TxtHotKey;
private System.Windows.Forms.Label LblHotKeyLabel;
private System.Windows.Forms.TextBox TxtTag;
private System.Windows.Forms.Label LblTagLabel;
}
}

View File

@@ -0,0 +1,264 @@
/**
* Grasscutter Tools
* Copyright (C) 2023 jie65535
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
**/
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using GrasscutterTools.Properties;
using GrasscutterTools.Utils;
using Newtonsoft.Json;
namespace GrasscutterTools.Pages
{
internal partial class PageHotKey : BasePage
{
private const string TAG = nameof(PageHotKey);
public PageHotKey()
{
InitializeComponent();
LvHotKeyList.FullRowSelect = true;
if (DesignMode) return;
InitHotKeys();
}
/// <summary>
/// 热键保存位置
/// </summary>
private readonly string HotKeysFilePath = Common.GetAppDataFile("HotKeys.json");
/// <summary>
/// 热键配置是否存在更改
/// </summary>
private bool HotKeysChanged;
/// <summary>
/// 初始化快捷键
/// </summary>
private void InitHotKeys()
{
if (!File.Exists(HotKeysFilePath))
return;
try
{
Logger.I(TAG, "Loading HotKey json file from: " + HotKeysFilePath);
Common.KeyGo.Items = JsonConvert.DeserializeObject<List<HotKeyItem>>(File.ReadAllText(HotKeysFilePath));
LvHotKeyList.Items.AddRange(Common.KeyGo.Items.Select(HotKeyItemToViewItem).ToArray());
Logger.I(TAG, "Start Register All HotKeys");
Common.KeyGo.RegAllKey();
}
catch (Exception ex)
{
Logger.W(TAG, "Parsing HotKeys.json failed.", ex);
}
}
/// <summary>
/// 关闭时触发,取消注册并保存更改
/// </summary>
public override void OnClosed()
{
Logger.I(TAG, "Cancel all HotKeys");
Common.KeyGo.UnRegAllKey();
if (!HotKeysChanged) return;
Logger.I(TAG, "Save all HotKeys to: " + HotKeysFilePath);
File.WriteAllText(HotKeysFilePath, JsonConvert.SerializeObject(Common.KeyGo.Items));
}
/// <summary>
/// 将实体转为视图对象
/// </summary>
private static ListViewItem HotKeyItemToViewItem(HotKeyItem item) => new ListViewItem(new[]
{
item.Tag,
item.HotKey,
item.Commands
})
{ Checked = item.IsEnabled };
/// <summary>
/// 列表选中项改变时触发
/// </summary>
private void LvHotKeyList_SelectedIndexChanged(object sender, EventArgs e)
{
if (LvHotKeyList.SelectedIndices.Count == 0) return;
var i = LvHotKeyList.SelectedIndices[0];
var hotKeyItem = Common.KeyGo.Items[i];
TxtTag.Text = hotKeyItem.Tag;
TxtHotKey.Text = hotKeyItem.HotKey;
SetCommand(hotKeyItem.Commands);
}
/// <summary>
/// 点击添加或更新按钮时触发
/// </summary>
private void BtnAddOrUpdate_Click(object sender, EventArgs e)
{
var tag = TxtTag.Text.Trim();
var commands = GetCommand();
var hotKey = TxtHotKey.Text;
if (string.IsNullOrEmpty(tag) || string.IsNullOrEmpty(commands) || string.IsNullOrEmpty(hotKey))
{
MessageBox.Show(Resources.EmptyInputTip, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
try
{
var i = Common.KeyGo.Items.FindIndex(it => it.Tag == tag);
if (i == -1)
{
var item = new HotKeyItem
{
Tag = tag,
Commands = commands,
HotKey = hotKey
};
Logger.I(TAG, $"New HotKey item [{hotKey}]");
Common.KeyGo.AddHotKey(item);
LvHotKeyList.Items.Add(HotKeyItemToViewItem(item));
}
else
{
var item = Common.KeyGo.Items[i];
item.Commands = commands;
if (item.HotKey != hotKey)
{
Logger.I(TAG, $"Update HotKey from [{item.HotKey}] to [{hotKey}]");
item.HotKey = hotKey;
Common.KeyGo.ChangeHotKey(item);
}
LvHotKeyList.Items[i] = HotKeyItemToViewItem(item);
}
HotKeysChanged = true;
}
catch (Exception ex)
{
Logger.E(TAG, "AddOrUpdate HotKey failed", ex);
MessageBox.Show(ex.Message, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// 点击移除按钮时触发
/// </summary>
private void BtnRemove_Click(object sender, EventArgs e)
{
try
{
var tag = TxtTag.Text.Trim();
var i = Common.KeyGo.Items.FindIndex(it => it.Tag == tag);
if (i == -1) return;
var item = Common.KeyGo.Items[i];
Logger.I(TAG, $"Remove HotKey [{item.HotKey}] \"{item.Tag}\"");
Common.KeyGo.DelHotKey(item);
LvHotKeyList.Items.RemoveAt(i);
HotKeysChanged = true;
}
catch (Exception ex)
{
Logger.E(TAG, "Remove HotKey failed", ex);
MessageBox.Show(ex.Message, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// 快捷键选项卡按键按下时触发
/// </summary>
private void TxtHotKey_KeyDown(object sender, KeyEventArgs e)
{
// ESC键清空当前快捷键
if (e.KeyCode == Keys.Escape)
{
TxtHotKey.Text = "";
return;
}
// 可选的功能键
//// 必须带功能键
//if (e.Modifiers == Keys.None)
// return;
// 必须是组合键
if (e.KeyCode == Keys.ControlKey || e.KeyCode == Keys.ShiftKey || e.KeyCode == Keys.Menu)
return;
var text = e.KeyCode.ToString();
if (e.Control)
text = "Ctrl + " + text;
if (e.Shift)
text = "Shift + " + text;
if (e.Alt)
text = "Alt + " + text;
TxtHotKey.Text = text;
}
/// <summary>
/// 列表中的复选框改变时触发
/// </summary>
private void LvHotKeyList_ItemCheck(object sender, ItemCheckEventArgs e)
{
var isEnable = e.NewValue == CheckState.Checked;
try
{
var item = Common.KeyGo.Items[e.Index];
if (isEnable)
{
// 尝试注册快捷键
Logger.I(TAG, $"Register hotKey [{item.HotKey}] as \"{item.Tag}\"");
Common.KeyGo.RegKey(item);
}
else
{
// 尝试注销快捷键
Logger.I(TAG, $"Cancel hotKey [{item.HotKey}]");
Common.KeyGo.UnRegKey(item);
}
// 更新使能状态
item.IsEnabled = isEnable;
}
catch (Exception ex)
{
// 如果操作失败,还原选项,禁止设置
e.NewValue = e.CurrentValue;
Logger.E(TAG, (isEnable ? "Enable" : "Disable") + " HotKey failed", ex);
MessageBox.Show(ex.Message, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// 添加热键快捷设置方法
/// </summary>
/// <param name="tag">标签名</param>
public void AddNewHotKey(string tag)
{
TxtHotKey.Tag = "";
TxtTag.Text = tag;
}
}
}

View File

@@ -0,0 +1,151 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ColTag.Text" xml:space="preserve">
<value>Tag</value>
</data>
<data name="ColHotKey.Text" xml:space="preserve">
<value>HotKey</value>
</data>
<data name="ColCommand.Text" xml:space="preserve">
<value>Commands</value>
</data>
<data name="GrpHotKeyList.Text" xml:space="preserve">
<value>HotKeys</value>
</data>
<data name="BtnRemove.Text" xml:space="preserve">
<value>- Remove</value>
</data>
<data name="BtnAddOrUpdate.Text" xml:space="preserve">
<value>√ AddOrUpdate</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="LblHotKeyLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>50, 17</value>
</data>
<data name="LblHotKeyLabel.Text" xml:space="preserve">
<value>HotKey</value>
</data>
<data name="LblTagLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>30, 17</value>
</data>
<data name="LblTagLabel.Text" xml:space="preserve">
<value>Tag</value>
</data>
</root>

View File

@@ -0,0 +1,387 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ColTag.Text" xml:space="preserve">
<value>标签</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="ColTag.Width" type="System.Int32, mscorlib">
<value>150</value>
</data>
<data name="ColHotKey.Text" xml:space="preserve">
<value>快捷键</value>
</data>
<data name="ColHotKey.Width" type="System.Int32, mscorlib">
<value>100</value>
</data>
<data name="ColCommand.Text" xml:space="preserve">
<value>命令</value>
</data>
<data name="ColCommand.Width" type="System.Int32, mscorlib">
<value>350</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="LvHotKeyList.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="LvHotKeyList.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 19</value>
</data>
<data name="LvHotKeyList.Size" type="System.Drawing.Size, System.Drawing">
<value>634, 178</value>
</data>
<data name="LvHotKeyList.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="&gt;&gt;LvHotKeyList.Name" xml:space="preserve">
<value>LvHotKeyList</value>
</data>
<data name="&gt;&gt;LvHotKeyList.Type" xml:space="preserve">
<value>System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LvHotKeyList.Parent" xml:space="preserve">
<value>GrpHotKeyList</value>
</data>
<data name="&gt;&gt;LvHotKeyList.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="GrpHotKeyList.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left, Right</value>
</data>
<data name="GrpHotKeyList.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 3</value>
</data>
<data name="GrpHotKeyList.Size" type="System.Drawing.Size, System.Drawing">
<value>640, 200</value>
</data>
<data name="GrpHotKeyList.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="GrpHotKeyList.Text" xml:space="preserve">
<value>快捷执行列表</value>
</data>
<data name="&gt;&gt;GrpHotKeyList.Name" xml:space="preserve">
<value>GrpHotKeyList</value>
</data>
<data name="&gt;&gt;GrpHotKeyList.Type" xml:space="preserve">
<value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;GrpHotKeyList.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;GrpHotKeyList.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="BtnRemove.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
</data>
<data name="BtnRemove.Location" type="System.Drawing.Point, System.Drawing">
<value>543, 206</value>
</data>
<data name="BtnRemove.Size" type="System.Drawing.Size, System.Drawing">
<value>100, 30</value>
</data>
<data name="BtnRemove.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="BtnRemove.Text" xml:space="preserve">
<value>- 删除</value>
</data>
<data name="&gt;&gt;BtnRemove.Name" xml:space="preserve">
<value>BtnRemove</value>
</data>
<data name="&gt;&gt;BtnRemove.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BtnRemove.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;BtnRemove.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="BtnAddOrUpdate.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
</data>
<data name="BtnAddOrUpdate.Location" type="System.Drawing.Point, System.Drawing">
<value>387, 206</value>
</data>
<data name="BtnAddOrUpdate.Size" type="System.Drawing.Size, System.Drawing">
<value>150, 30</value>
</data>
<data name="BtnAddOrUpdate.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="BtnAddOrUpdate.Text" xml:space="preserve">
<value>√ 添加或更新</value>
</data>
<data name="&gt;&gt;BtnAddOrUpdate.Name" xml:space="preserve">
<value>BtnAddOrUpdate</value>
</data>
<data name="&gt;&gt;BtnAddOrUpdate.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BtnAddOrUpdate.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;BtnAddOrUpdate.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="TxtHotKey.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left, Right</value>
</data>
<data name="TxtHotKey.Location" type="System.Drawing.Point, System.Drawing">
<value>262, 210</value>
</data>
<data name="TxtHotKey.Size" type="System.Drawing.Size, System.Drawing">
<value>119, 23</value>
</data>
<data name="TxtHotKey.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="TxtHotKey.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="&gt;&gt;TxtHotKey.Name" xml:space="preserve">
<value>TxtHotKey</value>
</data>
<data name="&gt;&gt;TxtHotKey.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;TxtHotKey.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;TxtHotKey.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="LblHotKeyLabel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left, Right</value>
</data>
<data name="LblHotKeyLabel.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblHotKeyLabel.Location" type="System.Drawing.Point, System.Drawing">
<value>212, 213</value>
</data>
<data name="LblHotKeyLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>44, 17</value>
</data>
<data name="LblHotKeyLabel.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="LblHotKeyLabel.Text" xml:space="preserve">
<value>快捷键</value>
</data>
<data name="&gt;&gt;LblHotKeyLabel.Name" xml:space="preserve">
<value>LblHotKeyLabel</value>
</data>
<data name="&gt;&gt;LblHotKeyLabel.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblHotKeyLabel.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblHotKeyLabel.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="TxtTag.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left, Right</value>
</data>
<data name="TxtTag.Location" type="System.Drawing.Point, System.Drawing">
<value>41, 210</value>
</data>
<data name="TxtTag.Size" type="System.Drawing.Size, System.Drawing">
<value>165, 23</value>
</data>
<data name="TxtTag.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="&gt;&gt;TxtTag.Name" xml:space="preserve">
<value>TxtTag</value>
</data>
<data name="&gt;&gt;TxtTag.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;TxtTag.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;TxtTag.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="LblTagLabel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="LblTagLabel.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblTagLabel.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 213</value>
</data>
<data name="LblTagLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>32, 17</value>
</data>
<data name="LblTagLabel.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="LblTagLabel.Text" xml:space="preserve">
<value>标签</value>
</data>
<data name="&gt;&gt;LblTagLabel.Name" xml:space="preserve">
<value>LblTagLabel</value>
</data>
<data name="&gt;&gt;LblTagLabel.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblTagLabel.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblTagLabel.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>7, 17</value>
</data>
<data name="&gt;&gt;ColTag.Name" xml:space="preserve">
<value>ColTag</value>
</data>
<data name="&gt;&gt;ColTag.Type" xml:space="preserve">
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;ColHotKey.Name" xml:space="preserve">
<value>ColHotKey</value>
</data>
<data name="&gt;&gt;ColHotKey.Type" xml:space="preserve">
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;ColCommand.Name" xml:space="preserve">
<value>ColCommand</value>
</data>
<data name="&gt;&gt;ColCommand.Type" xml:space="preserve">
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>PageHotKey</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.11.0.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
</data>
</root>

View File

@@ -0,0 +1,151 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ColTag.Text" xml:space="preserve">
<value>Tag</value>
</data>
<data name="ColHotKey.Text" xml:space="preserve">
<value>HotKey</value>
</data>
<data name="ColCommand.Text" xml:space="preserve">
<value>Commands</value>
</data>
<data name="GrpHotKeyList.Text" xml:space="preserve">
<value>HotKeys</value>
</data>
<data name="BtnRemove.Text" xml:space="preserve">
<value>- Remove</value>
</data>
<data name="BtnAddOrUpdate.Text" xml:space="preserve">
<value>√ AddOrUpdate</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="LblHotKeyLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>50, 17</value>
</data>
<data name="LblHotKeyLabel.Text" xml:space="preserve">
<value>HotKey</value>
</data>
<data name="LblTagLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>30, 17</value>
</data>
<data name="LblTagLabel.Text" xml:space="preserve">
<value>Tag</value>
</data>
</root>

View File

@@ -0,0 +1,138 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ColTag.Text" xml:space="preserve">
<value>標籤</value>
</data>
<data name="ColHotKey.Text" xml:space="preserve">
<value>快捷鍵</value>
</data>
<data name="GrpHotKeyList.Text" xml:space="preserve">
<value>快捷執行列表</value>
</data>
<data name="BtnRemove.Text" xml:space="preserve">
<value>- 刪除</value>
</data>
<data name="LblHotKeyLabel.Text" xml:space="preserve">
<value>快捷鍵</value>
</data>
<data name="LblTagLabel.Text" xml:space="preserve">
<value>標籤</value>
</data>
</root>

View File

@@ -57,7 +57,7 @@
this.TxtToken = new System.Windows.Forms.TextBox();
this.LblToken = new System.Windows.Forms.Label();
this.LblConsoleTip = new System.Windows.Forms.Label();
this.TxtHost = new System.Windows.Forms.TextBox();
this.TxtHost = new System.Windows.Forms.ComboBox();
this.BtnQueryServerStatus = new System.Windows.Forms.Button();
this.LblHost = new System.Windows.Forms.Label();
this.GrpServerStatus.SuspendLayout();
@@ -287,6 +287,7 @@
resources.ApplyResources(this.TxtHost, "TxtHost");
this.TxtHost.Name = "TxtHost";
this.TxtHost.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TxtHost_KeyDown);
this.TxtHost.SelectedIndexChanged += new System.EventHandler(this.TxtHost_SelectedIndexChanged);
//
// BtnQueryServerStatus
//
@@ -361,7 +362,7 @@
private System.Windows.Forms.TextBox TxtToken;
private System.Windows.Forms.Label LblToken;
private System.Windows.Forms.Label LblConsoleTip;
private System.Windows.Forms.TextBox TxtHost;
private System.Windows.Forms.ComboBox TxtHost;
private System.Windows.Forms.Button BtnQueryServerStatus;
private System.Windows.Forms.Label LblHost;
}

View File

@@ -38,11 +38,16 @@ namespace GrasscutterTools.Pages
{
internal partial class PageOpenCommand : BasePage
{
private const string TAG = nameof(PageOpenCommand);
public PageOpenCommand()
{
InitializeComponent();
if (DesignMode) return;
InitServerRecords();
TxtHost.Items.AddRange(ServerRecords.Select(it => it.Host).ToArray());
NUDRemotePlayerId.Value = Settings.Default.RemoteUid;
TxtHost.Text = Settings.Default.Host;
if (!string.IsNullOrEmpty(Settings.Default.Host) && !string.IsNullOrEmpty(Settings.Default.TokenCache))
@@ -53,6 +58,60 @@ namespace GrasscutterTools.Pages
}
}
#region - -
private class ServerRecord
{
public string Tag { get; set; }
public string Host { get; set; }
public int Uid { get; set; }
public string Token { get; set; }
}
private readonly string ServerRecordsFilePath = Common.GetAppDataFile("Servers.json");
private List<ServerRecord> ServerRecords = new List<ServerRecord>();
//{
// new ServerRecord
// {
// Host = "http://127.0.0.1:443",
// Tag = "Localhost",
// Token = "123456",
// Uid = 10001,
// }
//};
private void InitServerRecords()
{
if (!File.Exists(ServerRecordsFilePath))
return;
try
{
Logger.I(TAG, "Loading ServerRecords json file from: " + ServerRecordsFilePath);
ServerRecords = JsonConvert.DeserializeObject<List<ServerRecord>>(File.ReadAllText(ServerRecordsFilePath));
}
catch (Exception ex)
{
Logger.W(TAG, "Parsing Servers.json failed.", ex);
}
}
private void SaveServerRecords()
{
try
{
if (ServerRecords.Count == 0)
return;
File.WriteAllText(ServerRecordsFilePath, JsonConvert.SerializeObject(ServerRecords));
}
catch (Exception ex)
{
Logger.W(TAG, "Save all server records failed.", ex);
}
}
#endregion - -
/// <summary>
/// 在运行按钮上显示提示,要求主窗口设置
/// </summary>
@@ -109,14 +168,9 @@ namespace GrasscutterTools.Pages
/// <param name="host">主机地址</param>
private async Task UpdateServerStatus(string host)
{
// "http://127.0.0.1/" -> "http://127.0.0.1"
host = host.TrimEnd('/');
var status = await DispatchServerAPI.QueryServerStatus(host);
LblServerVersion.Text = status.Version;
if (status.MaxPlayer >= 0)
LblPlayerCount.Text = $"{status.PlayerCount}/{status.MaxPlayer}";
else
LblPlayerCount.Text = status.PlayerCount.ToString();
LblPlayerCount.Text = status.MaxPlayer > 0 ? $"{status.PlayerCount}/{status.MaxPlayer}" : status.PlayerCount.ToString();
}
/// <summary>
@@ -127,6 +181,20 @@ namespace GrasscutterTools.Pages
if (e.KeyCode == Keys.Enter) BtnQueryServerStatus_Click(BtnQueryServerStatus, e);
}
/// <summary>
/// 地址栏选中项改变时触发
/// </summary>
private void TxtHost_SelectedIndexChanged(object sender, EventArgs e)
{
if (TxtHost.SelectedIndex >= 0 && TxtHost.SelectedIndex < ServerRecords.Count)
{
// 还原记录
var record = ServerRecords[TxtHost.SelectedIndex];
TxtToken.Text = record.Token;
NUDRemotePlayerId.Value = record.Uid;
}
}
/// <summary>
/// 点击查询服务器状态按钮时触发
/// </summary>
@@ -137,9 +205,11 @@ namespace GrasscutterTools.Pages
btn.Cursor = Cursors.WaitCursor;
try
{
// "http://127.0.0.1/" -> "http://127.0.0.1"
var host = TxtHost.Text.TrimEnd('/');
try
{
await UpdateServerStatus(TxtHost.Text);
await UpdateServerStatus(host);
}
catch (Exception ex)
{
@@ -147,8 +217,21 @@ namespace GrasscutterTools.Pages
return;
}
Common.OC = new OpenCommandAPI(TxtHost.Text);
if (await Common.OC.Ping())
var isOcEnabled = false;
try
{
Common.OC = new OpenCommandAPI(host);
isOcEnabled = await Common.OC.Ping();
}
catch (Exception ex)
{
#if DEBUG
MessageBox.Show(ex.ToString(), Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
#else
MessageBox.Show(ex.Message, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
#endif
}
if (isOcEnabled)
{
LblOpenCommandSupport.Text = "√";
LblOpenCommandSupport.ForeColor = Color.Green;
@@ -237,6 +320,25 @@ namespace GrasscutterTools.Pages
GrpRemoteCommand.Enabled = false;
ShowTipInRunButton?.Invoke(Resources.ConnectedTip);
ButtonOpenGOODImport.Enabled = true;
var r = ServerRecords.Find(it => it.Host == TxtHost.Text);
if (r != null)
{
r.Token = Common.OC.Token;
r.Uid = (int)NUDRemotePlayerId.Value;
}
else
{
ServerRecords.Add(new ServerRecord
{
Host = Common.OC.Host,
Tag = "TODO",
Token = Common.OC.Token,
Uid = (int)NUDRemotePlayerId.Value
});
TxtHost.Items.Add(Common.OC.Host);
}
SaveServerRecords();
}
catch (Exception ex)
{

View File

@@ -45,6 +45,7 @@
this.LblSceneDescription = new System.Windows.Forms.Label();
this.ListScenes = new System.Windows.Forms.ListBox();
this.LblTp = new System.Windows.Forms.Label();
this.RbListCutScene = new System.Windows.Forms.RadioButton();
((System.ComponentModel.ISupportInitialize)(this.NUDTpZ)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.NUDTpY)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.NUDTpX)).BeginInit();
@@ -167,9 +168,9 @@
//
// CmbClimateType
//
resources.ApplyResources(this.CmbClimateType, "CmbClimateType");
this.CmbClimateType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.CmbClimateType.FormattingEnabled = true;
resources.ApplyResources(this.CmbClimateType, "CmbClimateType");
this.CmbClimateType.Name = "CmbClimateType";
this.CmbClimateType.SelectedIndexChanged += new System.EventHandler(this.CmbClimateType_SelectedIndexChanged);
//
@@ -195,10 +196,18 @@
resources.ApplyResources(this.LblTp, "LblTp");
this.LblTp.Name = "LblTp";
//
// RbListCutScene
//
resources.ApplyResources(this.RbListCutScene, "RbListCutScene");
this.RbListCutScene.Name = "RbListCutScene";
this.RbListCutScene.UseVisualStyleBackColor = true;
this.RbListCutScene.CheckedChanged += new System.EventHandler(this.RbListCutScene_CheckedChanged);
//
// PageScene
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.RbListCutScene);
this.Controls.Add(this.RbListDungeons);
this.Controls.Add(this.RbListScene);
this.Controls.Add(this.TxtSceneFilter);
@@ -242,5 +251,6 @@
private System.Windows.Forms.Label LblSceneDescription;
private System.Windows.Forms.ListBox ListScenes;
private System.Windows.Forms.Label LblTp;
private System.Windows.Forms.RadioButton RbListCutScene;
}
}

View File

@@ -75,6 +75,15 @@ namespace GrasscutterTools.Pages
Scenes = GameData.Dungeons.Lines;
}
/// <summary>
/// 选中过场时触发
/// </summary>
private void RbListCutScene_CheckedChanged(object sender, EventArgs e)
{
if (RbListCutScene.Checked)
Scenes = GameData.CutScenes.Lines;
}
/// <summary>
/// 场景列表过滤器输入项改变时触发
/// </summary>
@@ -113,6 +122,10 @@ namespace GrasscutterTools.Pages
{
SetCommand("/dungeon", id.ToString());
}
else if (RbListCutScene.Checked)
{
SetCommand("/cutscene", id.ToString());
}
}
/// <summary>

View File

@@ -173,4 +173,13 @@ Tip: You can quickly teleport through the 'fishing hook' pin on the map in-game.
In the command, you can use ~ to indicate the current position, and ~N to indicate the relative current N
</value>
</data>
<data name="RbListCutScene.Location" type="System.Drawing.Point, System.Drawing">
<value>252, 59</value>
</data>
<data name="RbListCutScene.Size" type="System.Drawing.Size, System.Drawing">
<value>78, 21</value>
</data>
<data name="RbListCutScene.Text" xml:space="preserve">
<value>Cutscene</value>
</data>
</root>

View File

@@ -118,454 +118,472 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="RbListDungeons.AutoSize" type="System.Boolean, mscorlib">
<data name="LblTpX.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="RbListDungeons.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="RbListDungeons.Location" type="System.Drawing.Point, System.Drawing">
<value>287, 30</value>
</data>
<data name="RbListDungeons.Size" type="System.Drawing.Size, System.Drawing">
<value>50, 21</value>
</data>
<data name="RbListDungeons.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="RbListDungeons.Text" xml:space="preserve">
<value>秘境</value>
</data>
<data name="&gt;&gt;RbListDungeons.Name" xml:space="preserve">
<value>RbListDungeons</value>
</data>
<data name="&gt;&gt;RbListDungeons.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;RbListDungeons.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;RbListDungeons.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="RbListScene.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="RbListScene.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="RbListScene.Location" type="System.Drawing.Point, System.Drawing">
<value>287, 3</value>
</data>
<data name="RbListScene.Size" type="System.Drawing.Size, System.Drawing">
<value>50, 21</value>
</data>
<data name="RbListScene.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="RbListScene.Text" xml:space="preserve">
<value>场景</value>
</data>
<data name="&gt;&gt;RbListScene.Name" xml:space="preserve">
<value>RbListScene</value>
</data>
<data name="&gt;&gt;RbListScene.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;RbListScene.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;RbListScene.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="TxtSceneFilter.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
</data>
<data name="TxtSceneFilter.Location" type="System.Drawing.Point, System.Drawing">
<value>343, 2</value>
</data>
<data name="TxtSceneFilter.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 23</value>
</data>
<data name="TxtSceneFilter.TabIndex" type="System.Int32, mscorlib">
<value>14</value>
</data>
<data name="&gt;&gt;TxtSceneFilter.Name" xml:space="preserve">
<value>TxtSceneFilter</value>
</data>
<data name="&gt;&gt;TxtSceneFilter.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;TxtSceneFilter.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;TxtSceneFilter.ZOrder" xml:space="preserve">
<value>2</value>
<data name="BtnTeleport.Text" xml:space="preserve">
<value>传送</value>
</data>
<data name="ChkIncludeSceneId.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="BtnTeleport.Size" type="System.Drawing.Size, System.Drawing">
<value>75, 23</value>
</data>
<data name="ChkIncludeSceneId.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
<data name="&gt;&gt;TxtSceneFilter.Name" xml:space="preserve">
<value>TxtSceneFilter</value>
</data>
<data name="ChkIncludeSceneId.Enabled" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="ChkIncludeSceneId.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="LblTpX.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="ChkIncludeSceneId.Location" type="System.Drawing.Point, System.Drawing">
<value>87, 187</value>
</data>
<data name="ChkIncludeSceneId.Size" type="System.Drawing.Size, System.Drawing">
<value>76, 21</value>
</data>
<data name="ChkIncludeSceneId.TabIndex" type="System.Int32, mscorlib">
<value>13</value>
</data>
<data name="ChkIncludeSceneId.Text" xml:space="preserve">
<value>含场景ID</value>
</data>
<data name="&gt;&gt;ChkIncludeSceneId.Name" xml:space="preserve">
<value>ChkIncludeSceneId</value>
</data>
<data name="&gt;&gt;ChkIncludeSceneId.Type" xml:space="preserve">
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;ChkIncludeSceneId.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;ChkIncludeSceneId.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="LblTpZ.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="LblTpZ.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblTpZ.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblTpZ.Location" type="System.Drawing.Point, System.Drawing">
<value>215, 158</value>
</data>
<data name="LblTpZ.Size" type="System.Drawing.Size, System.Drawing">
<value>14, 17</value>
</data>
<data name="LblTpZ.TabIndex" type="System.Int32, mscorlib">
<value>10</value>
</data>
<data name="LblTpZ.Size" type="System.Drawing.Size, System.Drawing">
<value>14, 17</value>
</data>
<data name="&gt;&gt;RbListCutScene.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="&gt;&gt;LblTpY.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="NUDTpY.Size" type="System.Drawing.Size, System.Drawing">
<value>80, 23</value>
</data>
<data name="RbListScene.Location" type="System.Drawing.Point, System.Drawing">
<value>287, 3</value>
</data>
<data name="NUDTpZ.Location" type="System.Drawing.Point, System.Drawing">
<value>235, 156</value>
</data>
<data name="ListScenes.Location" type="System.Drawing.Point, System.Drawing">
<value>343, 28</value>
</data>
<data name="&gt;&gt;CmbClimateType.ZOrder" xml:space="preserve">
<value>12</value>
</data>
<data name="&gt;&gt;LblSceneDescription.Name" xml:space="preserve">
<value>LblSceneDescription</value>
</data>
<data name="&gt;&gt;BtnTeleport.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="LblTp.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="&gt;&gt;NUDTpZ.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblSceneDescription.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="NUDTpX.Location" type="System.Drawing.Point, System.Drawing">
<value>23, 156</value>
</data>
<data name="LblSceneDescription.Size" type="System.Drawing.Size, System.Drawing">
<value>56, 17</value>
</data>
<data name="&gt;&gt;ChkIncludeSceneId.Type" xml:space="preserve">
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;CmbClimateType.Name" xml:space="preserve">
<value>CmbClimateType</value>
</data>
<data name="&gt;&gt;ChkIncludeSceneId.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="&gt;&gt;NUDTpY.Type" xml:space="preserve">
<value>System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="LblSceneDescription.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblTpY.Size" type="System.Drawing.Size, System.Drawing">
<value>14, 17</value>
</data>
<data name="LblTpX.Size" type="System.Drawing.Size, System.Drawing">
<value>14, 17</value>
</data>
<data name="&gt;&gt;RbListScene.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="NUDTpY.Location" type="System.Drawing.Point, System.Drawing">
<value>129, 156</value>
</data>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>7, 17</value>
</data>
<data name="&gt;&gt;LblTpX.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="LblTpX.Text" xml:space="preserve">
<value>x</value>
</data>
<data name="RbListDungeons.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="CmbClimateType.Location" type="System.Drawing.Point, System.Drawing">
<value>65, 29</value>
</data>
<data name="LblTpZ.Text" xml:space="preserve">
<value>z</value>
</data>
<data name="ChkIncludeSceneId.Enabled" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="LblClimateType.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 32</value>
</data>
<data name="LblTpX.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
</data>
<data name="&gt;&gt;ListScenes.Name" xml:space="preserve">
<value>ListScenes</value>
</data>
<data name="&gt;&gt;LblTpZ.Name" xml:space="preserve">
<value>LblTpZ</value>
</data>
<data name="ChkIncludeSceneId.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="&gt;&gt;NUDTpX.ZOrder" xml:space="preserve">
<value>11</value>
</data>
<data name="RbListScene.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="ChkIncludeSceneId.TabIndex" type="System.Int32, mscorlib">
<value>13</value>
</data>
<data name="&gt;&gt;LblTpZ.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="&gt;&gt;LblTpZ.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblTpZ.Parent" xml:space="preserve">
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>PageScene</value>
</data>
<data name="&gt;&gt;NUDTpY.ZOrder" xml:space="preserve">
<value>10</value>
</data>
<data name="&gt;&gt;LblTp.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblTpY.Name" xml:space="preserve">
<value>LblTpY</value>
</data>
<data name="NUDTpZ.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="&gt;&gt;NUDTpX.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblTpZ.ZOrder" xml:space="preserve">
<value>4</value>
<data name="ChkIncludeSceneId.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="ListScenes.ItemHeight" type="System.Int32, mscorlib">
<value>17</value>
</data>
<data name="&gt;&gt;RbListCutScene.Name" xml:space="preserve">
<value>RbListCutScene</value>
</data>
<data name="&gt;&gt;NUDTpZ.ZOrder" xml:space="preserve">
<value>9</value>
</data>
<data name="LblTpY.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="LblTpY.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
<data name="&gt;&gt;RbListScene.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;RbListScene.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="ListScenes.TabIndex" type="System.Int32, mscorlib">
<value>15</value>
</data>
<data name="NUDTpZ.Size" type="System.Drawing.Size, System.Drawing">
<value>80, 23</value>
</data>
<data name="&gt;&gt;NUDTpX.Type" xml:space="preserve">
<value>System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="BtnTeleport.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="RbListCutScene.Location" type="System.Drawing.Point, System.Drawing">
<value>287, 57</value>
</data>
<data name="RbListCutScene.Text" xml:space="preserve">
<value>过场</value>
</data>
<data name="LblTpY.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="&gt;&gt;BtnTeleport.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="&gt;&gt;NUDTpZ.Type" xml:space="preserve">
<value>System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="RbListDungeons.Text" xml:space="preserve">
<value>秘境</value>
</data>
<data name="RbListCutScene.Size" type="System.Drawing.Size, System.Drawing">
<value>50, 21</value>
</data>
<data name="RbListDungeons.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblTpY.Location" type="System.Drawing.Point, System.Drawing">
<value>109, 158</value>
</data>
<data name="LblTpY.Size" type="System.Drawing.Size, System.Drawing">
<value>14, 17</value>
<data name="LblTp.Size" type="System.Drawing.Size, System.Drawing">
<value>296, 51</value>
</data>
<data name="LblTpY.TabIndex" type="System.Int32, mscorlib">
<value>8</value>
</data>
<data name="LblTpY.Text" xml:space="preserve">
<value>y</value>
</data>
<data name="&gt;&gt;LblTpY.Name" xml:space="preserve">
<value>LblTpY</value>
</data>
<data name="&gt;&gt;LblTpY.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblTpY.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblTpY.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="BtnTeleport.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="BtnTeleport.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="BtnTeleport.Location" type="System.Drawing.Point, System.Drawing">
<value>6, 185</value>
</data>
<data name="BtnTeleport.Size" type="System.Drawing.Size, System.Drawing">
<value>75, 23</value>
</data>
<data name="BtnTeleport.TabIndex" type="System.Int32, mscorlib">
<value>12</value>
</data>
<data name="BtnTeleport.Text" xml:space="preserve">
<value>传送</value>
</data>
<data name="&gt;&gt;BtnTeleport.Name" xml:space="preserve">
<value>BtnTeleport</value>
</data>
<data name="&gt;&gt;BtnTeleport.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BtnTeleport.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;BtnTeleport.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="LblTpX.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="LblTpX.AutoSize" type="System.Boolean, mscorlib">
<data name="RbListCutScene.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblTpX.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
<data name="LblTpZ.Location" type="System.Drawing.Point, System.Drawing">
<value>215, 158</value>
</data>
<data name="LblTpX.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 158</value>
</data>
<data name="LblTpX.Size" type="System.Drawing.Size, System.Drawing">
<value>14, 17</value>
</data>
<data name="LblTpX.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
</data>
<data name="LblTpX.Text" xml:space="preserve">
<value>x</value>
</data>
<data name="&gt;&gt;LblTpX.Name" xml:space="preserve">
<value>LblTpX</value>
</data>
<data name="&gt;&gt;LblTpX.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblTpX.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblTpX.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="NUDTpZ.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="NUDTpZ.Location" type="System.Drawing.Point, System.Drawing">
<value>235, 156</value>
</data>
<data name="NUDTpZ.Size" type="System.Drawing.Size, System.Drawing">
<value>80, 23</value>
</data>
<data name="NUDTpZ.TabIndex" type="System.Int32, mscorlib">
<value>11</value>
</data>
<data name="&gt;&gt;NUDTpZ.Name" xml:space="preserve">
<value>NUDTpZ</value>
</data>
<data name="&gt;&gt;NUDTpZ.Type" xml:space="preserve">
<value>System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;NUDTpZ.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;NUDTpZ.ZOrder" xml:space="preserve">
<value>8</value>
</data>
<data name="NUDTpY.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="NUDTpY.Location" type="System.Drawing.Point, System.Drawing">
<value>129, 156</value>
</data>
<data name="NUDTpY.Size" type="System.Drawing.Size, System.Drawing">
<value>80, 23</value>
</data>
<data name="NUDTpY.TabIndex" type="System.Int32, mscorlib">
<value>9</value>
</data>
<data name="&gt;&gt;NUDTpY.Name" xml:space="preserve">
<value>NUDTpY</value>
</data>
<data name="&gt;&gt;NUDTpY.Type" xml:space="preserve">
<value>System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;NUDTpY.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;NUDTpY.ZOrder" xml:space="preserve">
<value>9</value>
</data>
<data name="NUDTpX.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="NUDTpX.Location" type="System.Drawing.Point, System.Drawing">
<value>23, 156</value>
</data>
<data name="NUDTpX.Size" type="System.Drawing.Size, System.Drawing">
<value>80, 23</value>
</data>
<data name="NUDTpX.TabIndex" type="System.Int32, mscorlib">
<value>7</value>
<data name="&gt;&gt;RbListCutScene.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;NUDTpX.Name" xml:space="preserve">
<value>NUDTpX</value>
</data>
<data name="&gt;&gt;NUDTpX.Type" xml:space="preserve">
<value>System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;NUDTpX.Parent" xml:space="preserve">
<data name="&gt;&gt;LblTpZ.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;NUDTpX.ZOrder" xml:space="preserve">
<value>10</value>
</data>
<data name="CmbClimateType.Location" type="System.Drawing.Point, System.Drawing">
<value>65, 29</value>
</data>
<data name="CmbClimateType.Size" type="System.Drawing.Size, System.Drawing">
<value>121, 25</value>
</data>
<data name="CmbClimateType.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="&gt;&gt;CmbClimateType.Name" xml:space="preserve">
<value>CmbClimateType</value>
</data>
<data name="&gt;&gt;CmbClimateType.Type" xml:space="preserve">
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;CmbClimateType.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;CmbClimateType.ZOrder" xml:space="preserve">
<value>11</value>
</data>
<data name="LblClimateType.AutoSize" type="System.Boolean, mscorlib">
<data name="RbListDungeons.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblClimateType.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblClimateType.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 32</value>
</data>
<data name="LblClimateType.Size" type="System.Drawing.Size, System.Drawing">
<value>56, 17</value>
</data>
<data name="LblClimateType.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="LblClimateType.Text" xml:space="preserve">
<value>设置天气</value>
</data>
<data name="&gt;&gt;LblClimateType.Name" xml:space="preserve">
<value>LblClimateType</value>
</data>
<data name="&gt;&gt;LblClimateType.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblClimateType.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblClimateType.ZOrder" xml:space="preserve">
<value>12</value>
</data>
<data name="LblSceneDescription.AutoSize" type="System.Boolean, mscorlib">
<data name="LblTpY.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblSceneDescription.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
<data name="NUDTpZ.TabIndex" type="System.Int32, mscorlib">
<value>11</value>
</data>
<data name="LblSceneDescription.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 3</value>
</data>
<data name="LblSceneDescription.Size" type="System.Drawing.Size, System.Drawing">
<value>56, 17</value>
</data>
<data name="LblSceneDescription.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="LblSceneDescription.Text" xml:space="preserve">
<value>场景控制</value>
</data>
<data name="&gt;&gt;LblSceneDescription.Name" xml:space="preserve">
<value>LblSceneDescription</value>
</data>
<data name="&gt;&gt;LblSceneDescription.Type" xml:space="preserve">
<data name="&gt;&gt;LblTpY.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblSceneDescription.Parent" xml:space="preserve">
<data name="CmbClimateType.Size" type="System.Drawing.Size, System.Drawing">
<value>121, 25</value>
</data>
<data name="LblTpX.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 158</value>
</data>
<data name="LblClimateType.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="ChkIncludeSceneId.Text" xml:space="preserve">
<value>含场景ID</value>
</data>
<data name="&gt;&gt;CmbClimateType.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblSceneDescription.ZOrder" xml:space="preserve">
<value>13</value>
<data name="LblTpZ.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="ListScenes.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left, Right</value>
<data name="&gt;&gt;RbListDungeons.Name" xml:space="preserve">
<value>RbListDungeons</value>
</data>
<data name="ListScenes.ItemHeight" type="System.Int32, mscorlib">
<value>17</value>
</data>
<data name="ListScenes.Location" type="System.Drawing.Point, System.Drawing">
<value>343, 28</value>
</data>
<data name="ListScenes.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 208</value>
</data>
<data name="ListScenes.TabIndex" type="System.Int32, mscorlib">
<value>15</value>
</data>
<data name="&gt;&gt;ListScenes.Name" xml:space="preserve">
<value>ListScenes</value>
</data>
<data name="&gt;&gt;ListScenes.Type" xml:space="preserve">
<value>System.Windows.Forms.ListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;ListScenes.Parent" xml:space="preserve">
<data name="&gt;&gt;ChkIncludeSceneId.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;ListScenes.ZOrder" xml:space="preserve">
<value>14</value>
<data name="RbListDungeons.Location" type="System.Drawing.Point, System.Drawing">
<value>287, 30</value>
</data>
<data name="&gt;&gt;LblTpY.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.10.0.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
</data>
<data name="LblTp.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="LblClimateType.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="RbListScene.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="&gt;&gt;ListScenes.Type" xml:space="preserve">
<value>System.Windows.Forms.ListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BtnTeleport.Name" xml:space="preserve">
<value>BtnTeleport</value>
</data>
<data name="NUDTpY.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="RbListCutScene.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="BtnTeleport.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="ListScenes.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 208</value>
</data>
<data name="&gt;&gt;LblTp.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="BtnTeleport.TabIndex" type="System.Int32, mscorlib">
<value>12</value>
</data>
<data name="CmbClimateType.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="ChkIncludeSceneId.Location" type="System.Drawing.Point, System.Drawing">
<value>87, 187</value>
</data>
<data name="LblTpY.Text" xml:space="preserve">
<value>y</value>
</data>
<data name="LblSceneDescription.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="&gt;&gt;LblSceneDescription.ZOrder" xml:space="preserve">
<value>14</value>
</data>
<data name="RbListScene.Size" type="System.Drawing.Size, System.Drawing">
<value>50, 21</value>
</data>
<data name="LblTp.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblTp.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<data name="LblTpZ.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="LblClimateType.Size" type="System.Drawing.Size, System.Drawing">
<value>56, 17</value>
</data>
<data name="RbListCutScene.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="&gt;&gt;RbListScene.Name" xml:space="preserve">
<value>RbListScene</value>
</data>
<data name="LblTpY.TabIndex" type="System.Int32, mscorlib">
<value>8</value>
</data>
<data name="&gt;&gt;RbListDungeons.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="LblSceneDescription.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="&gt;&gt;LblTpX.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="TxtSceneFilter.Location" type="System.Drawing.Point, System.Drawing">
<value>343, 2</value>
</data>
<data name="ChkIncludeSceneId.Size" type="System.Drawing.Size, System.Drawing">
<value>76, 21</value>
</data>
<data name="TxtSceneFilter.Size" type="System.Drawing.Size, System.Drawing">
<value>300, 23</value>
</data>
<data name="LblTpZ.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="&gt;&gt;ChkIncludeSceneId.Name" xml:space="preserve">
<value>ChkIncludeSceneId</value>
</data>
<data name="&gt;&gt;NUDTpY.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="TxtSceneFilter.TabIndex" type="System.Int32, mscorlib">
<value>14</value>
</data>
<data name="&gt;&gt;LblClimateType.ZOrder" xml:space="preserve">
<value>13</value>
</data>
<data name="&gt;&gt;CmbClimateType.Type" xml:space="preserve">
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;RbListCutScene.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;TxtSceneFilter.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="LblSceneDescription.Text" xml:space="preserve">
<value>场景控制</value>
</data>
<data name="&gt;&gt;LblTpX.ZOrder" xml:space="preserve">
<value>8</value>
</data>
<data name="NUDTpX.Size" type="System.Drawing.Size, System.Drawing">
<value>80, 23</value>
</data>
<data name="&gt;&gt;RbListDungeons.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblTp.ZOrder" xml:space="preserve">
<value>16</value>
</data>
<data name="&gt;&gt;NUDTpY.Name" xml:space="preserve">
<value>NUDTpY</value>
</data>
<data name="LblTp.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 102</value>
</data>
<data name="LblTp.Size" type="System.Drawing.Size, System.Drawing">
<value>296, 51</value>
<data name="LblClimateType.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="LblTp.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
<data name="ChkIncludeSceneId.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="RbListScene.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="LblTpX.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="NUDTpX.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="ListScenes.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left, Right</value>
</data>
<data name="RbListScene.Text" xml:space="preserve">
<value>场景</value>
</data>
<data name="NUDTpX.TabIndex" type="System.Int32, mscorlib">
<value>7</value>
</data>
<data name="BtnTeleport.Location" type="System.Drawing.Point, System.Drawing">
<value>6, 185</value>
</data>
<data name="&gt;&gt;LblTp.Name" xml:space="preserve">
<value>LblTp</value>
</data>
<data name="&gt;&gt;TxtSceneFilter.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="&gt;&gt;LblClimateType.Name" xml:space="preserve">
<value>LblClimateType</value>
</data>
<data name="&gt;&gt;ListScenes.ZOrder" xml:space="preserve">
<value>15</value>
</data>
<data name="TxtSceneFilter.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
</data>
<data name="LblTp.Text" xml:space="preserve">
<value>坐标传送
@@ -573,28 +591,40 @@
命令中可以用~表示当前位置,~100表示相对当前100
</value>
</data>
<data name="&gt;&gt;LblTp.Name" xml:space="preserve">
<value>LblTp</value>
<data name="&gt;&gt;LblTpX.Name" xml:space="preserve">
<value>LblTpX</value>
</data>
<data name="&gt;&gt;LblTp.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;LblTp.Parent" xml:space="preserve">
<data name="&gt;&gt;RbListDungeons.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblTp.ZOrder" xml:space="preserve">
<value>15</value>
<data name="&gt;&gt;NUDTpZ.Name" xml:space="preserve">
<value>NUDTpZ</value>
</data>
<data name="&gt;&gt;ListScenes.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;LblSceneDescription.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="LblSceneDescription.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 3</value>
</data>
<data name="&gt;&gt;BtnTeleport.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="RbListDungeons.Size" type="System.Drawing.Size, System.Drawing">
<value>50, 21</value>
</data>
<data name="&gt;&gt;LblClimateType.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="NUDTpY.TabIndex" type="System.Int32, mscorlib">
<value>9</value>
</data>
<data name="LblTp.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>7, 17</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>PageScene</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.7.4.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
</data>
</root>

View File

@@ -197,4 +197,13 @@
В команде вы можете использовать ~, чтобы указать текущую позицию, и ~N, чтобы указать смещение на N относительно текущей позиции
</value>
</data>
<data name="RbListCutScene.Location" type="System.Drawing.Point, System.Drawing">
<value>237, 56</value>
</data>
<data name="RbListCutScene.Size" type="System.Drawing.Size, System.Drawing">
<value>82, 21</value>
</data>
<data name="RbListCutScene.Text" xml:space="preserve">
<value>Катсцена</value>
</data>
</root>

View File

@@ -145,4 +145,7 @@
命令中可以用~表示當前位置,~N 表示相對當前N
</value>
</data>
<data name="RbListCutScene.Text" xml:space="preserve">
<value>過場</value>
</data>
</root>

View File

@@ -1,7 +1,7 @@
using System;
using System.Globalization;
using System.Linq;
using System.Windows.Forms;
using GrasscutterTools.Game.Props;
using GrasscutterTools.Properties;
@@ -94,4 +94,4 @@ namespace GrasscutterTools.Pages
LblPlayerPropertyDesc.Text = selectedItem.Description;
}
}
}
}

View File

@@ -316,7 +316,7 @@
//
resources.ApplyResources(this.NUDEntityLevel, "NUDEntityLevel");
this.NUDEntityLevel.Maximum = new decimal(new int[] {
90,
200,
0,
0,
0});

View File

@@ -1909,6 +1909,6 @@
<value>PageSpawn</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.7.4.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
<value>GrasscutterTools.Pages.BasePage, GrasscutterTools, Version=1.10.1.0, Culture=neutral, PublicKeyToken=de2b1c089621e923</value>
</data>
</root>

View File

@@ -78,7 +78,7 @@ namespace GrasscutterTools.Pages
try
{
Tasks = JsonConvert.DeserializeObject<List<LoopTask>>(File.ReadAllText(TasksJsonPath));
ListTasks.Items.AddRange(Tasks.Select(t => TaskToViewItem(t)).ToArray());
ListTasks.Items.AddRange(Tasks.Select(TaskToViewItem).ToArray());
}
catch (Exception ex)
{

View File

@@ -29,11 +29,18 @@
private void InitializeComponent()
{
this.BtnUpdateResources = new System.Windows.Forms.Button();
this.BtnConvertCutScene = new System.Windows.Forms.Button();
this.LblProjectResRoot = new System.Windows.Forms.Label();
this.TxtProjectResRoot = new System.Windows.Forms.TextBox();
this.LblGcResRoot = new System.Windows.Forms.Label();
this.TxtGcResRoot = new System.Windows.Forms.TextBox();
this.BtnUpdateAllResources = new System.Windows.Forms.Button();
this.BtnUpdateActivity = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// BtnUpdateResources
//
this.BtnUpdateResources.Location = new System.Drawing.Point(3, 3);
this.BtnUpdateResources.Location = new System.Drawing.Point(41, 195);
this.BtnUpdateResources.Name = "BtnUpdateResources";
this.BtnUpdateResources.Size = new System.Drawing.Size(100, 30);
this.BtnUpdateResources.TabIndex = 0;
@@ -41,18 +48,95 @@
this.BtnUpdateResources.UseVisualStyleBackColor = true;
this.BtnUpdateResources.Click += new System.EventHandler(this.BtnUpdateResources_Click);
//
// BtnConvertCutScene
//
this.BtnConvertCutScene.Location = new System.Drawing.Point(147, 195);
this.BtnConvertCutScene.Name = "BtnConvertCutScene";
this.BtnConvertCutScene.Size = new System.Drawing.Size(150, 30);
this.BtnConvertCutScene.TabIndex = 0;
this.BtnConvertCutScene.Text = "Convert Cutscene";
this.BtnConvertCutScene.UseVisualStyleBackColor = true;
this.BtnConvertCutScene.Click += new System.EventHandler(this.BtnConvertCutScene_Click);
//
// LblProjectResRoot
//
this.LblProjectResRoot.AutoSize = true;
this.LblProjectResRoot.Location = new System.Drawing.Point(38, 34);
this.LblProjectResRoot.Name = "LblProjectResRoot";
this.LblProjectResRoot.Size = new System.Drawing.Size(141, 17);
this.LblProjectResRoot.TabIndex = 1;
this.LblProjectResRoot.Text = "项目 Resources/ 路径:";
//
// TxtProjectResRoot
//
this.TxtProjectResRoot.Location = new System.Drawing.Point(185, 31);
this.TxtProjectResRoot.Name = "TxtProjectResRoot";
this.TxtProjectResRoot.Size = new System.Drawing.Size(413, 23);
this.TxtProjectResRoot.TabIndex = 2;
//
// LblGcResRoot
//
this.LblGcResRoot.AutoSize = true;
this.LblGcResRoot.Location = new System.Drawing.Point(44, 63);
this.LblGcResRoot.Name = "LblGcResRoot";
this.LblGcResRoot.Size = new System.Drawing.Size(135, 17);
this.LblGcResRoot.TabIndex = 3;
this.LblGcResRoot.Text = "GC_Resources/ 路径:";
//
// TxtGcResRoot
//
this.TxtGcResRoot.Location = new System.Drawing.Point(185, 60);
this.TxtGcResRoot.Name = "TxtGcResRoot";
this.TxtGcResRoot.Size = new System.Drawing.Size(413, 23);
this.TxtGcResRoot.TabIndex = 4;
//
// BtnUpdateAllResources
//
this.BtnUpdateAllResources.Location = new System.Drawing.Point(41, 100);
this.BtnUpdateAllResources.Name = "BtnUpdateAllResources";
this.BtnUpdateAllResources.Size = new System.Drawing.Size(150, 30);
this.BtnUpdateAllResources.TabIndex = 0;
this.BtnUpdateAllResources.Text = "Update All Resources";
this.BtnUpdateAllResources.UseVisualStyleBackColor = true;
this.BtnUpdateAllResources.Click += new System.EventHandler(this.BtnUpdateAllResources_Click);
//
// BtnUpdateActivity
//
this.BtnUpdateActivity.Location = new System.Drawing.Point(197, 100);
this.BtnUpdateActivity.Name = "BtnUpdateActivity";
this.BtnUpdateActivity.Size = new System.Drawing.Size(150, 30);
this.BtnUpdateActivity.TabIndex = 0;
this.BtnUpdateActivity.Text = "Update Activity";
this.BtnUpdateActivity.UseVisualStyleBackColor = true;
this.BtnUpdateActivity.Click += new System.EventHandler(this.BtnUpdateActivity_Click);
//
// PageTools
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.TxtGcResRoot);
this.Controls.Add(this.LblGcResRoot);
this.Controls.Add(this.TxtProjectResRoot);
this.Controls.Add(this.LblProjectResRoot);
this.Controls.Add(this.BtnUpdateActivity);
this.Controls.Add(this.BtnUpdateAllResources);
this.Controls.Add(this.BtnConvertCutScene);
this.Controls.Add(this.BtnUpdateResources);
this.Name = "PageTools";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button BtnUpdateResources;
private System.Windows.Forms.Button BtnConvertCutScene;
private System.Windows.Forms.Label LblProjectResRoot;
private System.Windows.Forms.TextBox TxtProjectResRoot;
private System.Windows.Forms.Label LblGcResRoot;
private System.Windows.Forms.TextBox TxtGcResRoot;
private System.Windows.Forms.Button BtnUpdateAllResources;
private System.Windows.Forms.Button BtnUpdateActivity;
}
}

View File

@@ -1,8 +1,19 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GrasscutterTools.Game;
using GrasscutterTools.Game.Activity;
using GrasscutterTools.Game.CutScene;
using GrasscutterTools.Game.Data;
using GrasscutterTools.Game.Dungeon;
using GrasscutterTools.Properties;
using Newtonsoft.Json;
namespace GrasscutterTools.Pages
{
internal partial class PageTools : BasePage
@@ -12,6 +23,12 @@ namespace GrasscutterTools.Pages
InitializeComponent();
}
public override void OnLoad()
{
TxtGcResRoot.Text = Settings.Default.ResourcesDirPath;
TxtProjectResRoot.Text = Settings.Default.ProjectResourcePath;
}
private void BtnUpdateResources_Click(object sender, EventArgs e)
{
var src = new OpenFileDialog
@@ -62,5 +79,135 @@ namespace GrasscutterTools.Pages
}
}
}
private void BtnConvertCutScene_Click(object sender, EventArgs e)
{
var src = new OpenFileDialog
{
Title = "请选择 Json 格式的 Cutscene.txt",
Multiselect = false,
};
if (src.ShowDialog() != DialogResult.OK)
return;
try
{
var cutScenes = JsonConvert.DeserializeObject<List<CutSceneItem>>(File.ReadAllText(src.FileName));
File.WriteAllLines(src.FileName, cutScenes.Select(it => $"{it.Id}:{it.Path.Substring(it.Path.IndexOf('/') + 1)}"));
MessageBox.Show("OK", Resources.Tips, MessageBoxButtons.OK);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private bool CheckInputPaths()
{
if (string.IsNullOrEmpty(TxtProjectResRoot.Text) || string.IsNullOrEmpty(TxtGcResRoot.Text))
{
MessageBox.Show("请先填写资源目录路径!", Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
if (Directory.Exists(TxtProjectResRoot.Text) && Directory.Exists(TxtGcResRoot.Text))
{
Settings.Default.ResourcesDirPath = TxtGcResRoot.Text;
Settings.Default.ProjectResourcePath = TxtProjectResRoot.Text;
return true;
}
else
{
MessageBox.Show("请填写正确的Res路径", Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
}
private TextMapData TextMapData;
private GameResources GameResources;
private void BtnUpdateAllResources_Click(object sender, EventArgs e)
{
try
{
if (!CheckInputPaths()) return;
if (TextMapData == null)
TextMapData = new TextMapData(TxtGcResRoot.Text);
if (GameResources == null)
GameResources = new GameResources(TxtGcResRoot.Text, TextMapData);
GameResources.ConvertResources(TxtProjectResRoot.Text);
MessageBox.Show("OK", Resources.Tips, MessageBoxButtons.OK);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void BtnUpdateActivity_Click(object sender, EventArgs e)
{
try
{
if (!CheckInputPaths()) return;
var json = File.ReadAllText(
Path.Combine(TxtGcResRoot.Text, "ExcelBinOutput", "NewActivityExcelConfigData.json"),
Encoding.UTF8);
var activityItems = JsonConvert.DeserializeObject<List<NewActivityItem>>(json);
if (TextMapData == null)
TextMapData = new TextMapData(TxtGcResRoot.Text);
UpdateActivityForLanguage(activityItems, "TextMapCHT", "zh-tw");
UpdateActivityForLanguage(activityItems, "TextMapEN", "en-us");
UpdateActivityForLanguage(activityItems, "TextMapRU", "ru-ru");
MessageBox.Show("OK", Resources.Tips, MessageBoxButtons.OK);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void UpdateActivityForLanguage(IReadOnlyCollection<NewActivityItem> activityItems, string textMap, string language)
{
var i = Array.IndexOf(TextMapData.TextMapFiles, textMap);
TextMapData.LoadTextMap(TextMapData.TextMapFilePaths[i]);
var activityMap = new Dictionary<int, string>(activityItems.Count);
foreach (var item in activityItems)
activityMap[item.ActivityId] = TextMapData.GetText(item.NameTextMapHash);
var buffer = new StringBuilder();
foreach (var item in GameData.Activity)
{
buffer.Append("// ").AppendLine(item.Key);
foreach (var id in item.Value.Ids)
{
buffer.Append(id).Append(':');
buffer.AppendLine(activityMap.TryGetValue(id, out var title) ? title : item.Value[id]);
}
}
var activityFilePath = Path.Combine(TxtProjectResRoot.Text, language, "Activity.txt");
File.WriteAllText(activityFilePath, buffer.ToString(), Encoding.UTF8);
//File.WriteAllLines(
// activityFilePath,
// activityItems.Select(it => $"{it.ActivityId}:{TextMapData.GetText(it.NameTextMapHash)}"),
// Encoding.UTF8);
}
}
}
}

View File

@@ -18,11 +18,13 @@
**/
using System;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using GrasscutterTools.OpenCommand;
using GrasscutterTools.Properties;
using GrasscutterTools.Utils;
@@ -63,8 +65,12 @@ namespace GrasscutterTools
/// 应用程序的主入口点。
/// </summary>
[STAThread]
private static void Main()
private static int Main(string[] args)
{
var result = HandleCommandLine(args);
if (result != -1)
return result;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
@@ -91,8 +97,127 @@ namespace GrasscutterTools
Application.Run(new Forms.FormMain());
Logger.I(TAG, "Program end.");
return 0;
}
#region - -
/// <summary>
/// 处理命令行参数并返回处理结果
/// </summary>
/// <param name="args">命令行参数</param>
/// <returns>返回-1表示继续启动应用程序。返回其它值表示退出应用并将该值作为返回结果。</returns>
private static int HandleCommandLine(string[] args)
{
var parser = new ToggleParser(args);
if (parser.IsEmpty) return -1;
try
{
GuiRedirect.Redirect();
// 是否启动日志
if (parser.HasToggle("debug") || parser.HasToggle("log"))
Logger.IsSaveLogs = true;
if (parser.HasToggle("v") || parser.HasToggle("version"))
{
Console.WriteLine("v" + Common.AppVersion.ToString(3));
return 0;
}
if (parser.HasToggle("h") || parser.HasToggle("help") || parser.HasToggle("?"))
{
Console.WriteLine("Usages:");
Console.WriteLine(" GcTools.exe -help");
Console.WriteLine(" GcTools.exe -version");
Console.WriteLine(" GcTools.exe -c \"cmd arg\"");
Console.WriteLine(" GcTools.exe -c \"cmd1 arg\" && GcTools -c \"cmd2 arg1 arg2\"");
Console.WriteLine(" GcTools.exe -host http://127.0.0.1:443 -token 123456 -c \"cmd1 arg1 arg2 | cmd2 | cmd3 arg\"");
return 0;
}
// 服务器地址
var host = parser.GetToggleValueOrDefault("host", Settings.Default.Host);
// 服务器令牌
var token = parser.GetToggleValueOrDefault("token", Settings.Default.TokenCache);
if (Settings.Default.Host != host || Settings.Default.TokenCache != token)
{
Settings.Default.Host = host;
Settings.Default.TokenCache = token;
Settings.Default.Save();
}
#if DEBUG
Logger.I(TAG, $"Host: {Settings.Default.Host} Token: {Settings.Default.TokenCache}");
#endif
// UID
//Settings.Default.RemoteUid = decimal.Parse(parser.GetToggleValueOrDefault("uid", Settings.Default.RemoteUid.ToString()));
if (!string.IsNullOrEmpty(Settings.Default.Host) && !string.IsNullOrEmpty(Settings.Default.TokenCache))
{
Common.OC = new OpenCommandAPI(Settings.Default.Host, Settings.Default.TokenCache);
}
// 解析并执行命令
var cmd = parser.GetToggleValueOrDefault("c", string.Empty);
if (string.IsNullOrEmpty(cmd)) cmd = parser.GetToggleValueOrDefault("command", string.Empty);
if (!string.IsNullOrEmpty(cmd))
{
return RunCommand(cmd) ? 0 : 1;
}
}
catch (Exception ex)
{
Logger.E(TAG, "Parse command failed!", ex);
}
return -1;
}
/// <summary>
/// 执行命令
/// </summary>
/// <param name="commands">GC命令由|分割多条命令</param>
/// <returns>返回是否执行成功</returns>
private static bool RunCommand(string commands)
{
if (Common.OC == null || !Common.OC.CanInvoke)
{
Console.WriteLine(Resources.RequireOpenCommandTip);
Logger.E(TAG, Resources.RequireOpenCommandTip);
return false;
}
try
{
foreach (var cmd in commands.Split('|').Select(FormatCommand))
{
var msg = Common.OC.Invoke(cmd).Result;
Console.WriteLine(string.IsNullOrEmpty(msg) ? "OK" : msg);
}
return true;
}
catch (Exception ex)
{
Console.WriteLine(ex);
Logger.E(TAG, "RunCommand Error:", ex);
return false;
}
}
/// <summary>
/// 格式化命令
/// (去除收尾空白,替换换行)
/// </summary>
/// <param name="raw">原始输入</param>
/// <returns>格式化后可执行命令</returns>
private static string FormatCommand(string raw)
{
return raw.Trim().Replace("\\r", "\r").Replace("\\n", "\n");
}
#endregion - -
#region - -
private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)

View File

@@ -31,5 +31,5 @@ using System.Runtime.InteropServices;
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.9.0")]
[assembly: AssemblyFileVersion("1.9.0")]
[assembly: AssemblyVersion("1.12.0")]
[assembly: AssemblyFileVersion("1.12.0")]

View File

@@ -61,25 +61,25 @@ namespace GrasscutterTools.Properties {
}
/// <summary>
/// 查找类似 80001:風與異鄉人 - 使用元素吹散一株蒲公英。
///80002:千嶂仞 - 掌握「岩」的元素力。
///80003:流水叮 - 集全套《清泉之心》。
///80004:神戟狂言凌霄 - 集全套《神霄折戟》。
///80005:醉客狼的相遇 - 集全套《醉客事》。
///80006:清泉、白馬與月光 - 集全套《竹林月夜》。
///80007:人鑄賦形 - 造一把四星武器。
///80008:生存家 - 掌握10種菜餚的製作方
///80009:生存家 - 掌握20種菜餚的製作方
///80010:生存家 - 掌握40種菜餚的製作方
///80011:星級大廚 - 10料理食譜達到熟
///80012:星級大廚 - 20料理食譜達到熟
///80013:星級大廚 - 40料理食譜達到熟
///80014:如日方升的旅程 - 角色首次突破至2
///80015:如日方升的旅程 - 角色首次突破至4
///80016:如日方升的旅程 - 角色首次突破至6
///80017:百錘千鍊 - 將一把武器突破至2
///80018:百錘千鍊 - 將一把武器突破至4
///80019:百錘千鍊 - 將一把武器 [字符串的其余部分被截断]&quot;; 的本地化字符串。
/// 查找类似 80001:风与异乡人 - 使用元素吹散一株蒲公英。
///80002:千嶂仞 - 掌握「岩」的元素力。
///80003:流水叮 - 集全套《清泉之心》。
///80004:神戟狂言凌霄 - 集全套《神霄折戟》。
///80005:醉客狼的相遇 - 集全套《醉客事》。
///80006:清泉、白马与月光 - 集全套《竹林月夜》。
///80007:人铸赋形 - 造一把四星武器。
///80008:生存家 - 掌握10种菜肴的制作方
///80009:生存家 - 掌握20种菜肴的制作方
///80010:生存家 - 掌握40种菜肴的制作方
///80011:星级大厨 - 10料理食谱达到熟
///80012:星级大厨 - 20料理食谱达到熟
///80013:星级大厨 - 40料理食谱达到熟
///80014:如日方升的旅程 - 角色首次突破至2
///80015:如日方升的旅程 - 角色首次突破至4
///80016:如日方升的旅程 - 角色首次突破至6
///80017:百炼千锤 - 将一个武器突破至2
///80018:百炼千锤 - 将一个武器突破至4
///80019:百炼千锤 - 将一个武器 [字符串的其余部分被截断]&quot;; 的本地化字符串。
/// </summary>
internal static string Achievement {
get {
@@ -88,45 +88,42 @@ namespace GrasscutterTools.Properties {
}
/// <summary>
/// 查找类似 //Activity ids-3.6 by dplek
///// Activity
///2001:1.1未归的熄星
///2002:1.3海灯节
///2003:1.4风花节
///2004:1.5导能原盘-诸论
///2005:1.6盛夏!海岛?大冒险!
///2006:2.0谒索雷痕
///2007:2.1韶光抚月
///2008:2.2雾海悬谜境
///2009:2.3皑尘与
///2010:2.4飞彩镌流年
///2011:2.5三界路飨祭
///2012:2.6堇庭华彩
///2013:2.7荒梦藏虞渊
///2014:2.8远海诗夏游纪
///2015:3.0雕琢童心
///2016:3.1杯中遥吟之歌
///2017:3.2智巧灵蕈大竞逐
///2018:3.3秋津森夜试胆会
///2019:3.4磬弦奏华夜
///2020:3.5风花的呼吸
///// 1.0
///1001:海灯节
///5001:元素烘炉test
///5002:且试身手
///5003:百货奇货
///// 1.1
///5004:映天之章
///5005:元素烘炉
///5006:佳肴尚温
///5007:飞行挑战
///// 1.2
///3001:白垩与黑龙
///5008:三清玲之章(废稿
///5009:古闻之章(钟离传说-1
///5010:鲸天之章(公子传说-1
///5011:秘宝迷踪
///5012:百 [字符串的其余部分被截断]&quot;; 的本地化字符串。
/// 查找类似 //Activity ids-3.8 by dplek
///// Activity
///2001:1.1未归的熄星
///2002:1.3海灯节
///2003:1.4风花节
///2004:1.5导能原盘-诸论
///2005:1.6盛夏!海岛?大冒险!
///2006:2.0谒索雷痕
///2007:2.1韶光抚月
///2008:2.2雾海悬谜境
///2009:2.3皑尘与雪
///2010:2.4飞彩镌流年
///2011:2.5三界路飨祭
///2012:2.6堇庭华彩
///2013:2.7荒梦藏虞渊
///2014:2.8远海诗夏游纪
///2015:3.0雕琢童心
///2016:3.1杯中遥吟之歌
///2017:3.2智巧灵蕈大竞逐
///2018:3.3秋津森夜试胆会
///2019:3.4磬弦奏华夜
///2020:3.5风花的呼吸
///2021:3.6盛典与慧业
///2022:3.7决战!召唤之巅!
///// 1.0
///1001:海灯节
///5001:元素烘炉test
///5002:且试身手
///5003:百货奇货
///// 1.1
///5004:映天之章
///5005:元素烘炉
///5006:佳肴尚温
///5007:飞行挑战
///5009:古闻之章(钟离传说-1
///50 [字符串的其余部分被截断]&quot;; 的本地化字符串。
/// </summary>
internal static string Activity {
get {
@@ -395,13 +392,13 @@ namespace GrasscutterTools.Properties {
///1058:八重神子
///1059:鹿野院平藏
///1060:夜兰
///1061:绮良良
///1062:埃洛伊
///1063:申鹤
///1064:云堇
///1065:久岐忍
///1066:神里绫人
///1067:柯莱
///1068:多 [字符串的其余部分被截断]&quot;; 的本地化字符串。
///1067: [字符串的其余部分被截断]&quot;; 的本地化字符串。
/// </summary>
internal static string Avatar {
get {
@@ -637,6 +634,48 @@ namespace GrasscutterTools.Properties {
}
}
/// <summary>
/// 查找类似 1:[测试]空画面
///2:[测试]空画面
///3:[疑似剧情]风起地七天神像激活
///4:未知秘境内某门开启
///5:未知秘境内某门开启
///6:无画面(UI会闪一下)
///7:未知区域画面旋转
///8:进入风龙废墟秘境
///9:达达乌帕谷剑屏障解锁
///200201:[剧情]蒙德主线特瓦林最后战斗 秘境ID:20018(测试)或20025(正式)
///10:风龙废墟解除三层封印1
///11:风龙废墟解除三层封印2
///12:风龙废墟解除三层封印3
///13:秘境奖励领取时
///14:未知区域画面旋转
///15:不明地下视角
///16:不明地下视角
///17:忍冬之树普通
///18:忍冬之树形态1
///19:忍冬之树1升级2
///20:忍冬之树形态2
///21:忍冬之树2升级3
///22:雪山冰本进入时
///23:不明地下视角
///24:不明地下视角
///25:稻妻神樱树远景
///26:[世界任务]神樱大祓净化进度1
///27:[世界任务]神樱大祓净化进度2
///28:[世界任务]神樱大祓净化进度3
///29:[世界任务]神樱大祓净化进度4
///30:[世界任务]神樱大祓净化进度5
///31:稻妻荒海机关解锁
///32:稻妻八酝岛阵代屋敷秘境解锁
///33:稻妻清籁岛木 [字符串的其余部分被截断]&quot;; 的本地化字符串。
/// </summary>
internal static string Cutscene {
get {
return ResourceManager.GetString("Cutscene", resourceCulture);
}
}
/// <summary>
/// 查找类似 1:深入狼之殿
///2:丘丘人大本营(test)
@@ -991,24 +1030,20 @@ namespace GrasscutterTools.Properties {
///20010201:大型草史莱姆
///20010202:大型草史莱姆-强攻强化
///20010301:风史莱姆
///20010302:风史莱姆(塔防)
///20010381:Slime_Wind_02 - [N/A] 1192875865
///20010401:大型风史莱姆
///20010402:大型风史莱姆(塔防)
///20010403:大型风史莱姆-强攻强化
///20010481:Slime_Wind_03 - [N/A] 401698273
///20010501:雷史莱姆
///20010502:雷史莱姆(塔防)
///20010503:Slime_Electric_02_SimpleStick - [N/A] 1834387465
///20010581:Slime_Electric_02 - [N/A] 3442560241
///20010601:大型雷史莱姆
///20010602:大型雷史莱姆(塔防)
///20010604:大型雷史莱姆-强攻强化
///20010605:Slime_Electric_03_SimpleStick - [N/A] 3051091649
///20010701:变异雷史莱姆
///20010702:变异雷史莱姆-强攻强化
///20010703:变异雷史莱姆(塔防)
///20010801:冰史莱姆
///20010802:冰史莱姆-雪山活动
///20010803:冰史莱姆(塔防)
///20010901:大型冰史莱姆
///20010605:Slime_Electric_03_SimpleStick - [N/A] 3051091649
///20010681:Sl [字符串的其余部分被截断]&quot;; 的本地化字符串。
/// </summary>
internal static string Monsters {
@@ -1125,6 +1160,15 @@ namespace GrasscutterTools.Properties {
return ResourceManager.GetString("PageHomeTitle", resourceCulture);
}
}
/// <summary>
/// 查找类似 快捷键 的本地化字符串。
/// </summary>
internal static string PageHotKey {
get {
return ResourceManager.GetString("PageHotKey", resourceCulture);
}
}
/// <summary>
/// 查找类似 邮件 的本地化字符串。

View File

@@ -354,4 +354,13 @@ Improvement suggestions have been submitted, please use caution to send emails t
<data name="PlayerProperty" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\en-us\PlayerProperty.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="Cutscene" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\en-us\Cutscene.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312</value>
</data>
<data name="Activity" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\en-us\Activity.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="PageHotKey" xml:space="preserve">
<value>HotKey</value>
</data>
</root>

View File

@@ -369,4 +369,10 @@
<data name="PageSetPropTitle" xml:space="preserve">
<value>属性</value>
</data>
<data name="Cutscene" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\zh-cn\Cutscene.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="PageHotKey" xml:space="preserve">
<value>快捷键</value>
</data>
</root>

View File

@@ -342,4 +342,13 @@
<data name="PlayerProperty" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ru-ru\PlayerProperty.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="Cutscene" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ru-ru\Cutscene.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312</value>
</data>
<data name="Activity" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ru-ru\Activity.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="PageHotKey" xml:space="preserve">
<value>Горячая клавиша</value>
</data>
</root>

View File

@@ -348,4 +348,13 @@
<data name="PageSetPropTitle" xml:space="preserve">
<value>屬性</value>
</data>
<data name="Cutscene" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\zh-tw\Cutscene.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="Activity" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\zh-tw\Activity.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="PageHotKey" xml:space="preserve">
<value>快捷鍵</value>
</data>
</root>

View File

@@ -262,5 +262,29 @@ namespace GrasscutterTools.Properties {
this["ActivityConfigJsonPath"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string ProjectResourcePath {
get {
return ((string)(this["ProjectResourcePath"]));
}
set {
this["ProjectResourcePath"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool IsUpgraded {
get {
return ((bool)(this["IsUpgraded"]));
}
set {
this["IsUpgraded"] = value;
}
}
}
}

View File

@@ -62,5 +62,11 @@
<Setting Name="ActivityConfigJsonPath" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="ProjectResourcePath" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="IsUpgraded" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
</Settings>
</SettingsFile>

View File

@@ -1,5 +1,4 @@
1001:4
1002:5
1002:5
1003:5
1005:5
1006:4
@@ -46,6 +45,7 @@
1058:5
1059:4
1060:5
1061:4
1062:5
1063:5
1064:4
@@ -66,4 +66,7 @@
1079:5
1080:4
1081:4
1082:5
1082:5
1083:4
1084:5
1085:4

View File

@@ -1,4 +1,594 @@
[
{
"comment": "4.0.1 Lyney",
"gachaType": 301,
"scheduleId": 4,
"prefabPath": "GachaShowPanel_A145",
"titlePath": "UI_GACHA_SHOW_PANEL_A0145_TITLE",
"costItemId": 223,
"endTime": 1924992000,
"sortId": 982,
"rateUpItems4": [ 1083, 1032, 1014 ],
"rateUpItems5": [ 1084 ],
"fallbackItems3": [ 11301, 11302, 11306, 12301, 12302, 12305, 13303, 14301, 14302, 14304, 15301, 15302, 15304 ],
"fallbackItems4Pool1": [ 1014, 1020, 1023, 1024, 1025, 1027, 1031, 1032, 1034, 1036, 1039, 1043, 1044, 1045, 1048, 1053, 1055, 1056, 1064 ],
"fallbackItems4Pool2": [ 11401, 11402, 11403, 11405, 12401, 12402, 12403, 12405, 13401, 13407, 14401, 14402, 14403, 14409, 15401, 15402, 15403, 15405 ],
"fallbackItems5Pool1": [ 1003, 1016, 1042, 1035, 1041 ],
"fallbackItems5Pool2": [],
"weights4": [
[ 1, 510 ],
[ 8, 510 ],
[ 10, 10000 ]
],
"weights5": [
[ 1, 80 ],
[ 73, 80 ],
[ 90, 10000 ]
],
"poolBalanceWeights4": [
[ 1, 255 ],
[ 17, 255 ],
[ 21, 10455 ]
],
"poolBalanceWeights5": [
[ 1, 30 ],
[ 147, 150 ],
[ 181, 10230 ]
],
"bannerType": "EVENT"
},
{
"comment": "4.0.1 Yelan",
"gachaType": 400,
"scheduleId": 3,
"prefabPath": "GachaShowPanel_A146",
"titlePath": "UI_GACHA_SHOW_PANEL_A081_TITLE",
"costItemId": 223,
"endTime": 1924992000,
"sortId": 982,
"rateUpItems4": [ 1083, 1032, 1014 ],
"rateUpItems5": [ 1060 ],
"fallbackItems3": [ 11301, 11302, 11306, 12301, 12302, 12305, 13303, 14301, 14302, 14304, 15301, 15302, 15304 ],
"fallbackItems4Pool1": [ 1014, 1020, 1023, 1024, 1025, 1027, 1031, 1032, 1034, 1036, 1039, 1043, 1044, 1045, 1048, 1053, 1055, 1056, 1064 ],
"fallbackItems4Pool2": [ 11401, 11402, 11403, 11405, 12401, 12402, 12403, 12405, 13401, 13407, 14401, 14402, 14403, 14409, 15401, 15402, 15403, 15405 ],
"fallbackItems5Pool1": [ 1003, 1016, 1042, 1035, 1041 ],
"fallbackItems5Pool2": [],
"weights4": [
[ 1, 510 ],
[ 8, 510 ],
[ 10, 10000 ]
],
"weights5": [
[ 1, 80 ],
[ 73, 80 ],
[ 90, 10000 ]
],
"poolBalanceWeights4": [
[ 1, 255 ],
[ 17, 255 ],
[ 21, 10455 ]
],
"poolBalanceWeights5": [
[ 1, 30 ],
[ 147, 150 ],
[ 181, 10230 ]
],
"bannerType": "EVENT"
},
{
"comment": "4.0.1",
"gachaType": 302,
"scheduleId": 2,
"prefabPath": "GachaShowPanel_A147",
"titlePath": "UI_GACHA_SHOW_PANEL_A020_TITLE",
"costItemId": 223,
"endTime": 1924992000,
"sortId": 2,
"rateUpItems4": [ 11403, 12410, 15403, 13407, 14403 ],
"rateUpItems5": [ 15512, 15508 ],
"fallbackItems3": [ 11301, 11302, 11306, 12301, 12302, 12305, 13303, 14301, 14302, 14304, 15301, 15302, 15304 ],
"fallbackItems4Pool1": [ 13401, 14401, 12401, 11402, 15402 ],
"fallbackItems4Pool2": [],
"fallbackItems5Pool1": [ 11509, 13507 ],
"fallbackItems5Pool2": [],
"weights4": [
[ 1, 600 ],
[ 7, 600 ],
[ 8, 6600 ],
[ 10, 12600 ]
],
"weights5": [
[ 1, 100 ],
[ 62, 100 ],
[ 73, 7800 ],
[ 80, 10000 ]
],
"poolBalanceWeights4": [
[ 1, 255 ],
[ 17, 255 ],
[ 21, 10455 ]
],
"poolBalanceWeights5": [
[ 1, 30 ],
[ 147, 150 ],
[ 181, 10230 ]
],
"eventChance4": 75,
"eventChance5": 75,
"bannerType": "WEAPON"
},
{
"comment": "3.8.2 Sangonomiya Kokomi",
"gachaType": 301,
"scheduleId": 4,
"prefabPath": "GachaShowPanel_A142",
"titlePath": "UI_GACHA_SHOW_PANEL_A053_TITLE",
"costItemId": 223,
"endTime": 1924992000,
"sortId": 982,
"rateUpItems4": [ 1076, 1045, 1048 ],
"rateUpItems5": [ 1054 ],
"fallbackItems3": [ 11301, 11302, 11306, 12301, 12302, 12305, 13303, 14301, 14302, 14304, 15301, 15302, 15304 ],
"fallbackItems4Pool1": [ 1014, 1020, 1023, 1024, 1025, 1027, 1031, 1032, 1034, 1036, 1039, 1043, 1044, 1045, 1048, 1053, 1055, 1056, 1064 ],
"fallbackItems4Pool2": [ 11401, 11402, 11403, 11405, 12401, 12402, 12403, 12405, 13401, 13407, 14401, 14402, 14403, 14409, 15401, 15402, 15403, 15405 ],
"fallbackItems5Pool1": [ 1003, 1016, 1042, 1035, 1041 ],
"fallbackItems5Pool2": [],
"weights4": [
[ 1, 510 ],
[ 8, 510 ],
[ 10, 10000 ]
],
"weights5": [
[ 1, 80 ],
[ 73, 80 ],
[ 90, 10000 ]
],
"poolBalanceWeights4": [
[ 1, 255 ],
[ 17, 255 ],
[ 21, 10455 ]
],
"poolBalanceWeights5": [
[ 1, 30 ],
[ 147, 150 ],
[ 181, 10230 ]
],
"bannerType": "EVENT"
},
{
"comment": "3.8.2 Wanderer",
"gachaType": 400,
"scheduleId": 3,
"prefabPath": "GachaShowPanel_A143",
"titlePath": "UI_GACHA_SHOW_PANEL_A0109_TITLE",
"costItemId": 223,
"endTime": 1924992000,
"sortId": 982,
"rateUpItems4": [ 1076, 1045, 1048 ],
"rateUpItems5": [ 1075 ],
"fallbackItems3": [ 11301, 11302, 11306, 12301, 12302, 12305, 13303, 14301, 14302, 14304, 15301, 15302, 15304 ],
"fallbackItems4Pool1": [ 1014, 1020, 1023, 1024, 1025, 1027, 1031, 1032, 1034, 1036, 1039, 1043, 1044, 1045, 1048, 1053, 1055, 1056, 1064 ],
"fallbackItems4Pool2": [ 11401, 11402, 11403, 11405, 12401, 12402, 12403, 12405, 13401, 13407, 14401, 14402, 14403, 14409, 15401, 15402, 15403, 15405 ],
"fallbackItems5Pool1": [ 1003, 1016, 1042, 1035, 1041 ],
"fallbackItems5Pool2": [],
"weights4": [
[ 1, 510 ],
[ 8, 510 ],
[ 10, 10000 ]
],
"weights5": [
[ 1, 80 ],
[ 73, 80 ],
[ 90, 10000 ]
],
"poolBalanceWeights4": [
[ 1, 255 ],
[ 17, 255 ],
[ 21, 10455 ]
],
"poolBalanceWeights5": [
[ 1, 30 ],
[ 147, 150 ],
[ 181, 10230 ]
],
"bannerType": "EVENT"
},
{
"comment": "3.8.2",
"gachaType": 302,
"scheduleId": 2,
"prefabPath": "GachaShowPanel_A144",
"titlePath": "UI_GACHA_SHOW_PANEL_A020_TITLE",
"costItemId": 223,
"endTime": 1924992000,
"sortId": 2,
"rateUpItems4": [ 11405, 12402, 14410, 13401, 15401 ],
"rateUpItems5": [ 14512, 14506 ],
"fallbackItems3": [ 11301, 11302, 11306, 12301, 12302, 12305, 13303, 14301, 14302, 14304, 15301, 15302, 15304 ],
"fallbackItems4Pool1": [ 13401, 14401, 12401, 11402, 15402 ],
"fallbackItems4Pool2": [],
"fallbackItems5Pool1": [ 11509, 13507 ],
"fallbackItems5Pool2": [],
"weights4": [
[ 1, 600 ],
[ 7, 600 ],
[ 8, 6600 ],
[ 10, 12600 ]
],
"weights5": [
[ 1, 100 ],
[ 62, 100 ],
[ 73, 7800 ],
[ 80, 10000 ]
],
"poolBalanceWeights4": [
[ 1, 255 ],
[ 17, 255 ],
[ 21, 10455 ]
],
"poolBalanceWeights5": [
[ 1, 30 ],
[ 147, 150 ],
[ 181, 10230 ]
],
"eventChance4": 75,
"eventChance5": 75,
"bannerType": "WEAPON"
},
{
"comment": "3.8.1 Eula",
"gachaType": 301,
"scheduleId": 4,
"prefabPath": "GachaShowPanel_A139",
"titlePath": "UI_GACHA_SHOW_PANEL_A041_TITLE",
"costItemId": 223,
"endTime": 1924992000,
"sortId": 982,
"rateUpItems4": [ 1080, 1020, 1050 ],
"rateUpItems5": [ 1051 ],
"fallbackItems3": [ 11301, 11302, 11306, 12301, 12302, 12305, 13303, 14301, 14302, 14304, 15301, 15302, 15304 ],
"fallbackItems4Pool1": [ 1014, 1020, 1023, 1024, 1025, 1027, 1031, 1032, 1034, 1036, 1039, 1043, 1044, 1045, 1048, 1053, 1055, 1056, 1064 ],
"fallbackItems4Pool2": [ 11401, 11402, 11403, 11405, 12401, 12402, 12403, 12405, 13401, 13407, 14401, 14402, 14403, 14409, 15401, 15402, 15403, 15405 ],
"fallbackItems5Pool1": [ 1003, 1016, 1042, 1035, 1041 ],
"fallbackItems5Pool2": [],
"weights4": [
[ 1, 510 ],
[ 8, 510 ],
[ 10, 10000 ]
],
"weights5": [
[ 1, 80 ],
[ 73, 80 ],
[ 90, 10000 ]
],
"poolBalanceWeights4": [
[ 1, 255 ],
[ 17, 255 ],
[ 21, 10455 ]
],
"poolBalanceWeights5": [
[ 1, 30 ],
[ 147, 150 ],
[ 181, 10230 ]
],
"bannerType": "EVENT"
},
{
"comment": "3.8.1 Klee",
"gachaType": 400,
"scheduleId": 3,
"prefabPath": "GachaShowPanel_A140",
"titlePath": "UI_GACHA_SHOW_PANEL_A018_TITLE",
"costItemId": 223,
"endTime": 1924992000,
"sortId": 982,
"rateUpItems4": [ 1080, 1020, 1050 ],
"rateUpItems5": [ 1029 ],
"fallbackItems3": [ 11301, 11302, 11306, 12301, 12302, 12305, 13303, 14301, 14302, 14304, 15301, 15302, 15304 ],
"fallbackItems4Pool1": [ 1014, 1020, 1023, 1024, 1025, 1027, 1031, 1032, 1034, 1036, 1039, 1043, 1044, 1045, 1048, 1053, 1055, 1056, 1064 ],
"fallbackItems4Pool2": [ 11401, 11402, 11403, 11405, 12401, 12402, 12403, 12405, 13401, 13407, 14401, 14402, 14403, 14409, 15401, 15402, 15403, 15405 ],
"fallbackItems5Pool1": [ 1003, 1016, 1042, 1035, 1041 ],
"fallbackItems5Pool2": [],
"weights4": [
[ 1, 510 ],
[ 8, 510 ],
[ 10, 10000 ]
],
"weights5": [
[ 1, 80 ],
[ 73, 80 ],
[ 90, 10000 ]
],
"poolBalanceWeights4": [
[ 1, 255 ],
[ 17, 255 ],
[ 21, 10455 ]
],
"poolBalanceWeights5": [
[ 1, 30 ],
[ 147, 150 ],
[ 181, 10230 ]
],
"bannerType": "EVENT"
},
{
"comment": "3.8.1",
"gachaType": 302,
"scheduleId": 2,
"prefabPath": "GachaShowPanel_A141",
"titlePath": "UI_GACHA_SHOW_PANEL_A020_TITLE",
"costItemId": 223,
"endTime": 1924992000,
"sortId": 2,
"rateUpItems4": [ 11410, 15410, 12405, 13407, 14409 ],
"rateUpItems5": [ 12503, 14502 ],
"fallbackItems3": [ 11301, 11302, 11306, 12301, 12302, 12305, 13303, 14301, 14302, 14304, 15301, 15302, 15304 ],
"fallbackItems4Pool1": [ 13401, 14401, 12401, 11402, 15402 ],
"fallbackItems4Pool2": [],
"fallbackItems5Pool1": [ 11509, 13507 ],
"fallbackItems5Pool2": [],
"weights4": [
[ 1, 600 ],
[ 7, 600 ],
[ 8, 6600 ],
[ 10, 12600 ]
],
"weights5": [
[ 1, 100 ],
[ 62, 100 ],
[ 73, 7800 ],
[ 80, 10000 ]
],
"poolBalanceWeights4": [
[ 1, 255 ],
[ 17, 255 ],
[ 21, 10455 ]
],
"poolBalanceWeights5": [
[ 1, 30 ],
[ 147, 150 ],
[ 181, 10230 ]
],
"eventChance4": 75,
"eventChance5": 75,
"bannerType": "WEAPON"
},
{
"comment": "3.7.2 Alhaitham",
"gachaType": 301,
"scheduleId": 121,
"prefabPath": "GachaShowPanel_A136",
"titlePath": "UI_GACHA_SHOW_PANEL_A0115_TITLE",
"costItemId": 223,
"endTime": 1924992000,
"sortId": 982,
"rateUpItems4": [ 1077, 1023, 1059 ],
"rateUpItems5": [ 1078 ],
"fallbackItems3": [ 11301, 11302, 11306, 12301, 12302, 12305, 13303, 14301, 14302, 14304, 15301, 15302, 15304 ],
"fallbackItems4Pool1": [ 1014, 1020, 1023, 1024, 1025, 1027, 1031, 1032, 1034, 1036, 1039, 1043, 1044, 1045, 1048, 1053, 1055, 1056, 1064 ],
"fallbackItems4Pool2": [ 11401, 11402, 11403, 11405, 12401, 12402, 12403, 12405, 13401, 13407, 14401, 14402, 14403, 14409, 15401, 15402, 15403, 15405 ],
"fallbackItems5Pool1": [ 1003, 1016, 1042, 1035, 1041 ],
"fallbackItems5Pool2": [],
"weights4": [
[ 1, 510 ],
[ 8, 510 ],
[ 10, 10000 ]
],
"weights5": [
[ 1, 80 ],
[ 73, 80 ],
[ 90, 10000 ]
],
"poolBalanceWeights4": [
[ 1, 255 ],
[ 17, 255 ],
[ 21, 10455 ]
],
"poolBalanceWeights5": [
[ 1, 30 ],
[ 147, 150 ],
[ 181, 10230 ]
],
"bannerType": "EVENT"
},
{
"comment": "3.7.2 Kaedehara Kazuha",
"gachaType": 400,
"scheduleId": 120,
"prefabPath": "GachaShowPanel_A137",
"titlePath": "UI_GACHA_SHOW_PANEL_A045_TITLE",
"costItemId": 223,
"endTime": 1924992000,
"sortId": 982,
"rateUpItems4": [ 1077, 1023, 1059 ],
"rateUpItems5": [ 1047 ],
"fallbackItems3": [ 11301, 11302, 11306, 12301, 12302, 12305, 13303, 14301, 14302, 14304, 15301, 15302, 15304 ],
"fallbackItems4Pool1": [ 1014, 1020, 1023, 1024, 1025, 1027, 1031, 1032, 1034, 1036, 1039, 1043, 1044, 1045, 1048, 1053, 1055, 1056, 1064 ],
"fallbackItems4Pool2": [ 11401, 11402, 11403, 11405, 12401, 12402, 12403, 12405, 13401, 13407, 14401, 14402, 14403, 14409, 15401, 15402, 15403, 15405 ],
"fallbackItems5Pool1": [ 1003, 1016, 1042, 1035, 1041 ],
"fallbackItems5Pool2": [],
"weights4": [
[ 1, 510 ],
[ 8, 510 ],
[ 10, 10000 ]
],
"weights5": [
[ 1, 80 ],
[ 73, 80 ],
[ 90, 10000 ]
],
"poolBalanceWeights4": [
[ 1, 255 ],
[ 17, 255 ],
[ 21, 10455 ]
],
"poolBalanceWeights5": [
[ 1, 30 ],
[ 147, 150 ],
[ 181, 10230 ]
],
"bannerType": "EVENT"
},
{
"comment": "3.7.2",
"gachaType": 302,
"scheduleId": 119,
"prefabPath": "GachaShowPanel_A138",
"titlePath": "UI_GACHA_SHOW_PANEL_A020_TITLE",
"costItemId": 223,
"endTime": 1924992000,
"sortId": 2,
"rateUpItems4": [ 13416, 15416, 11401, 12403, 14401 ],
"rateUpItems5": [ 11503, 11512 ],
"fallbackItems3": [ 11301, 11302, 11306, 12301, 12302, 12305, 13303, 14301, 14302, 14304, 15301, 15302, 15304 ],
"fallbackItems4Pool1": [ 13401, 14401, 12401, 11402, 15402 ],
"fallbackItems4Pool2": [],
"fallbackItems5Pool1": [ 11509, 13507 ],
"fallbackItems5Pool2": [],
"weights4": [
[ 1, 600 ],
[ 7, 600 ],
[ 8, 6600 ],
[ 10, 12600 ]
],
"weights5": [
[ 1, 100 ],
[ 62, 100 ],
[ 73, 7800 ],
[ 80, 10000 ]
],
"poolBalanceWeights4": [
[ 1, 255 ],
[ 17, 255 ],
[ 21, 10455 ]
],
"poolBalanceWeights5": [
[ 1, 30 ],
[ 147, 150 ],
[ 181, 10230 ]
],
"eventChance4": 75,
"eventChance5": 75,
"bannerType": "WEAPON"
},
{
"comment": "3.7.1 Yoimiya",
"gachaType": 301,
"scheduleId": 118,
"prefabPath": "GachaShowPanel_A133",
"titlePath": "UI_GACHA_SHOW_PANEL_A049_TITLE",
"costItemId": 223,
"endTime": 1924992000,
"sortId": 982,
"rateUpItems4": [ 1036, 1064, 1061 ],
"rateUpItems5": [ 1049 ],
"fallbackItems3": [ 11301, 11302, 11306, 12301, 12302, 12305, 13303, 14301, 14302, 14304, 15301, 15302, 15304 ],
"fallbackItems4Pool1": [ 1014, 1020, 1023, 1024, 1025, 1027, 1031, 1032, 1034, 1036, 1039, 1043, 1044, 1045, 1048, 1053, 1055, 1056, 1064 ],
"fallbackItems4Pool2": [ 11401, 11402, 11403, 11405, 12401, 12402, 12403, 12405, 13401, 13407, 14401, 14402, 14403, 14409, 15401, 15402, 15403, 15405 ],
"fallbackItems5Pool1": [ 1003, 1016, 1042, 1035, 1041 ],
"fallbackItems5Pool2": [],
"weights4": [
[ 1, 510 ],
[ 8, 510 ],
[ 10, 10000 ]
],
"weights5": [
[ 1, 80 ],
[ 73, 80 ],
[ 90, 10000 ]
],
"poolBalanceWeights4": [
[ 1, 255 ],
[ 17, 255 ],
[ 21, 10455 ]
],
"poolBalanceWeights5": [
[ 1, 30 ],
[ 147, 150 ],
[ 181, 10230 ]
],
"bannerType": "EVENT"
},
{
"comment": "3.7.1 Yae Miko",
"gachaType": 400,
"scheduleId": 117,
"prefabPath": "GachaShowPanel_A134",
"titlePath": "UI_GACHA_SHOW_PANEL_A071_TITLE",
"costItemId": 223,
"endTime": 1924992000,
"sortId": 982,
"rateUpItems4": [ 1036, 1064, 1061 ],
"rateUpItems5": [ 1058 ],
"fallbackItems3": [ 11301, 11302, 11306, 12301, 12302, 12305, 13303, 14301, 14302, 14304, 15301, 15302, 15304 ],
"fallbackItems4Pool1": [ 1014, 1020, 1023, 1024, 1025, 1027, 1031, 1032, 1034, 1036, 1039, 1043, 1044, 1045, 1048, 1053, 1055, 1056, 1064 ],
"fallbackItems4Pool2": [ 11401, 11402, 11403, 11405, 12401, 12402, 12403, 12405, 13401, 13407, 14401, 14402, 14403, 14409, 15401, 15402, 15403, 15405 ],
"fallbackItems5Pool1": [ 1003, 1016, 1042, 1035, 1041 ],
"fallbackItems5Pool2": [],
"weights4": [
[ 1, 510 ],
[ 8, 510 ],
[ 10, 10000 ]
],
"weights5": [
[ 1, 80 ],
[ 73, 80 ],
[ 90, 10000 ]
],
"poolBalanceWeights4": [
[ 1, 255 ],
[ 17, 255 ],
[ 21, 10455 ]
],
"poolBalanceWeights5": [
[ 1, 30 ],
[ 147, 150 ],
[ 181, 10230 ]
],
"bannerType": "EVENT"
},
{
"comment": "3.7.1",
"gachaType": 302,
"scheduleId": 116,
"prefabPath": "GachaShowPanel_A135",
"titlePath": "UI_GACHA_SHOW_PANEL_A020_TITLE",
"costItemId": 223,
"endTime": 1924992000,
"sortId": 2,
"rateUpItems4": [ 12416, 11402, 13401, 14402, 15405 ],
"rateUpItems5": [ 15509, 14509 ],
"fallbackItems3": [ 11301, 11302, 11306, 12301, 12302, 12305, 13303, 14301, 14302, 14304, 15301, 15302, 15304 ],
"fallbackItems4Pool1": [ 13401, 14401, 12401, 11402, 15402 ],
"fallbackItems4Pool2": [],
"fallbackItems5Pool1": [ 11509, 13507 ],
"fallbackItems5Pool2": [],
"weights4": [
[ 1, 600 ],
[ 7, 600 ],
[ 8, 6600 ],
[ 10, 12600 ]
],
"weights5": [
[ 1, 100 ],
[ 62, 100 ],
[ 73, 7800 ],
[ 80, 10000 ]
],
"poolBalanceWeights4": [
[ 1, 255 ],
[ 17, 255 ],
[ 21, 10455 ]
],
"poolBalanceWeights5": [
[ 1, 30 ],
[ 147, 150 ],
[ 181, 10230 ]
],
"eventChance4": 75,
"eventChance5": 75,
"bannerType": "WEAPON"
},
{
"comment": "3.6.2 Baizhu",
"gachaType": 301,

View File

@@ -1,4 +1,6 @@
11301:blue
11101:blue
11201:blue
11301:blue
11302:blue
11303:blue
11304:blue
@@ -25,6 +27,9 @@
11420:purple
11421:purple
11422:purple
11424:purple
11425:purple
11426:purple
11501:yellow
11502:yellow
11503:yellow
@@ -34,6 +39,8 @@
11510:yellow
11511:yellow
11512:yellow
12101:blue
12201:blue
12301:blue
12302:blue
12303:blue
@@ -57,12 +64,16 @@
12416:purple
12417:purple
12418:purple
12424:purple
12425:purple
12501:yellow
12502:yellow
12503:yellow
12504:yellow
12510:yellow
12511:yellow
13101:blue
13201:blue
13301:blue
13302:blue
13303:blue
@@ -81,6 +92,8 @@
13416:purple
13417:purple
13419:purple
13424:purple
13425:purple
13501:yellow
13502:yellow
13504:yellow
@@ -88,6 +101,8 @@
13507:yellow
13509:yellow
13511:yellow
14101:blue
14201:blue
14301:blue
14302:blue
14303:blue
@@ -110,6 +125,8 @@
14415:purple
14416:purple
14417:purple
14424:purple
14425:purple
14501:yellow
14502:yellow
14504:yellow
@@ -117,6 +134,8 @@
14509:yellow
14511:yellow
14512:yellow
15101:blue
15201:blue
15301:blue
15302:blue
15303:blue
@@ -141,6 +160,9 @@
15416:purple
15417:purple
15418:purple
15419:purple
15424:purple
15425:purple
15501:yellow
15502:yellow
15503:yellow
@@ -148,4 +170,4 @@
15508:yellow
15509:yellow
15511:yellow
20001:yellow
15512:yellow

View File

@@ -89,7 +89,6 @@
80089:Tatara Tales - Resolve the crisis at the Mikage Furnace.
80090:Echo of Fury - Complete "Orobashi's Legacy."
80091:Tales of Monstrous Madness - Collect the entire "Toki Alley Tales" series.
80092:Illustrious in Inazuma - Reach Reputation Lv. 10 in Inazuma.
80093:Lightning-Riding Adventurer (I) - Complete 6 Open World mechanism-activated Time Trial Challenges on Narukami Island, Kannazuka, and Yashiori Island in Inazuma.
80094:Lightning-Riding Adventurer (I) - Complete 12 Open World mechanism-activated Time Trial Challenges on Narukami Island, Kannazuka, and Yashiori Island in Inazuma.
80095:Lightning-Riding Adventurer (I) - Complete 24 Open World mechanism-activated Time Trial Challenges on Narukami Island, Kannazuka, and Yashiori Island in Inazuma.
@@ -103,13 +102,13 @@
80105:Lightning-Riding Treasure Hunter (II) - Open 40 chests on Watatsumi Island and Seirai Island in Inazuma.
80106:Lightning-Riding Treasure Hunter (II) - Open 80 chests on Watatsumi Island and Seirai Island in Inazuma.
80107:Lightning-Riding Treasure Hunter (II) - Open 160 chests on Watatsumi Island and Seirai Island in Inazuma.
80108:Seirai Stormchasers - Complete "Seirai Stormchasers"
80109:The Same Moonlight - Complete "The Moon-Bathed Deep"
80110:Lightning-Riding Adventurer (II) - Complete 6 Open World mechanism-activated Time Trial Challenges on Watatsumi Island and Seirai Island in Inazuma.
80111:Lightning-Riding Adventurer (II) - Complete 12 Open World mechanism-activated Time Trial Challenges on Watatsumi Island and Seirai Island in Inazuma.
80112:Lightning-Riding Adventurer (II) - Complete 24 Open World mechanism-activated Time Trial Challenges on Watatsumi Island and Seirai Island in Inazuma.
80108:Seirai Stormchasers - Complete "Seirai Stormchasers"
80109:The Same Moonlight - Complete "The Moon-Bathed Deep"
80113:Continental Explorer: Tsurumi Island - Light up the Tsurumi Island map.
80114:Fog's Edge - Unlock all Teleport Waypoints in Tsurumi Island.
80114:Fog's Edge - Unlock all Teleport Waypoints on Tsurumi Island.
80115:Sanctuary Pilgrim: Tsurumi Island - Unlock all the Shrines of Depths on Tsurumi Island.
80116:Flashes in the Night - Follow 6 Electro Seelie on Tsurumi Island.
80119:Foggy Guidance - Follow 6 Seelie on Tsurumi Island to their Seelie Courts.
@@ -157,7 +156,7 @@
80161:Forest Roamer - Unlock all Teleport Waypoints in the following areas in Sumeru: Avidya Forest, Lokapala Jungle, Ardravi Valley, Ashavan Realm, Vissudha Field, Lost Nursery, and Vanarana.
80162:Sanctuary Pilgrim: Sumeru Boscage - Unlock all the Shrines of Depths in the following areas in Sumeru: Avidya Forest, Lokapala Jungle, Ardravi Valley, Ashavan Realm, Vissudha Field, Lost Nursery, and Vanarana.
80163:Fluorescent Bloom - Upgrade the Statues of The Seven in Sumeru to their maximum level.
80164:Culmination of the Great Dream - Reach the Max Level of the Tree of Dreams in Vanarana
80164:Culmination of the Great Dream - Reach the Max Level of the Tree of Dreams in Vanarana.
80165:Woodland Guide - Follow a total of 10 Seelie to their Seelie Courts in Avidya Forest, Lokapala Jungle, Ardravi Valley, Ashavan Realm, Vissudha Field, Lost Nursery, and Vanarana.
80166:Woodland Guide - Follow a total of 20 Seelie to their Seelie Courts in Avidya Forest, Lokapala Jungle, Ardravi Valley, Ashavan Realm, Vissudha Field, Lost Nursery, and Vanarana.
80167:Woodland Guide - Follow a total of 40 Seelie to their Seelie Courts in Avidya Forest, Lokapala Jungle, Ardravi Valley, Ashavan Realm, Vissudha Field, Lost Nursery, and Vanarana.
@@ -205,16 +204,15 @@
80215:Chaos Divided - Defeat 2 or more Character Cards from the opponent's deck in one single action a total of {param0} time(s) in victorious games.
80216:Chaos Divided - Defeat 2 or more Character Cards from the opponent's deck in one single action a total of {param0} time(s) in victorious games.
80217:Chaos Divided - Defeat 2 or more Character Cards from the opponent's deck in one single action a total of {param0} time(s) in victorious games.
80218:Legendary High Roller - Obtain {param0} Lucky Coins in total
80219:Legendary High Roller - Obtain {param0} Lucky Coins in total
80220:Legendary High Roller - Obtain {param0} Lucky Coins in total
80218:Legendary High Roller - Obtain {param0} Lucky Coins in total.
80219:Legendary High Roller - Obtain {param0} Lucky Coins in total.
80220:Legendary High Roller - Obtain {param0} Lucky Coins in total.
80221:Miniaturized Dice-Shaker - Deal 8 or more points of damage in one single action a total of {param0} time(s) in victorious games.
80222:Miniaturized Dice-Shaker - Deal 8 or more points of damage in one single action a total of {param0} time(s) in victorious games.
80223:Miniaturized Dice-Shaker - Deal 8 or more points of damage in one single action a total of {param0} time(s) in victorious games.
80224:Continental Explorer: Dune Dreams (II) - Light up the maps of the following area in Sumeru: Desert of Hadramaveth.
80225:Over Sandstorms and Mirages (II) - Unlock all Teleport Waypoints in the following area in Sumeru: Desert of Hadramaveth.
80226:Sanctuary Pilgrim: Dune Dreams (II) - Unlock all the Shrines of Depths in the following area in Sumeru: Desert of Hadramaveth.
80227:The Dirge of Bilqis - Complete "The Dirge of Bilqis."
80228:The Desert Will Guide You Home (II) - Follow {param0} Seelie in the Desert of Hadramaveth to their Seelie Courts.
80229:The Desert Will Guide You Home (II) - Follow {param0} Seelie in the Desert of Hadramaveth to their Seelie Courts.
80230:The Desert Will Guide You Home (II) - Follow {param0} Seelie in the Desert of Hadramaveth to their Seelie Courts.
@@ -224,6 +222,7 @@
80234:Quicksand Adventurer (II) - Complete {param0} Open World Time Trial Challenges in the Desert of Hadramaveth.
80235:Quicksand Adventurer (II) - Complete {param0} Open World Time Trial Challenges in the Desert of Hadramaveth.
80236:Quicksand Adventurer (II) - Complete {param0} Open World Time Trial Challenges in the Desert of Hadramaveth.
80227:The Dirge of Bilqis - Complete "The Dirge of Bilqis."
80237:Continental Explorer: Blessed Hamada - Light up the maps of the following areas in Sumeru: Gavireh Lajavard and Realm of Farakhkert.
80238:Descending Into the Depths of Desolation - Unlock all Teleport Waypoints in the following areas in Sumeru: Gavireh Lajavard and Realm of Farakhkert.
80239:Sanctuary Pilgrim: Blessed Hamada - Unlock all the Shrines of Depths in the following areas in Sumeru: Gavireh Lajavard and Realm of Farakhkert.
@@ -236,8 +235,28 @@
80246:Badlands Adventurer - Complete a total of {param0} Open World Time Trial Challenges in Gavireh Lajavard and Realm of Farakhkert.
80247:Badlands Adventurer - Complete a total of {param0} Open World Time Trial Challenges in Gavireh Lajavard and Realm of Farakhkert.
80248:Badlands Adventurer - Complete a total of {param0} Open World Time Trial Challenges in Gavireh Lajavard and Realm of Farakhkert.
80249:Khvarena of Good and Evil - Complete "Khvarena of Good and Evil."
80250:Alkanet Amrita - Upgrade the Amrita Pool to its maximum level.
80249:Khvarena of Good and Evil - Complete "Khvarena of Good and Evil."
80252:Continental Explorer: Land of Harmonious Springs (I) - Light up the maps of the following areas in Fontaine: Court of Fontaine Region, Belleau Region, and Beryl Region.
80253:Font of All Waters (I) - Unlock all Teleport Waypoints in the following areas in Fontaine: Court of Fontaine Region, Belleau Region, and Beryl Region.
80254:Sanctuary Pilgrim: Land of Harmonious Springs (I) - Unlock all the Shrines of Depths in the following areas in Fontaine: Court of Fontaine Region, Belleau Region, and Beryl Region.
80255:Like Waters Clear - Upgrade the Statues of The Seven in Fontaine to their maximum level.
80256:Dew Song - Reach the Max Level of the Fountain of Lucine in the Court of Fontaine.
80257:Tides Will Guide You Home (I) - Follow {param0} Seelie in the Court of Fontaine Region, Belleau Region, and Beryl Region to their Seelie Courts.
80258:Tides Will Guide You Home (I) - Follow {param0} Seelie in the Court of Fontaine Region, Belleau Region, and Beryl Region to their Seelie Courts.
80259:Tides Will Guide You Home (I) - Follow {param0} Seelie in the Court of Fontaine Region, Belleau Region, and Beryl Region to their Seelie Courts.
80260:Waveriding Treasure Hunter (I) - Open {param0} chests in the Court of Fontaine Region, Belleau Region, and Beryl Region.
80261:Waveriding Treasure Hunter (I) - Open {param0} chests in the Court of Fontaine Region, Belleau Region, and Beryl Region.
80262:Waveriding Treasure Hunter (I) - Open {param0} chests in the Court of Fontaine Region, Belleau Region, and Beryl Region.
80263:Waveriding Adventurer (I) - Complete {param0} Open World Time Trial Challenges in the Court of Fontaine Region, Belleau Region, and Beryl Region.
80264:Waveriding Adventurer (I) - Complete {param0} Open World Time Trial Challenges in the Court of Fontaine Region, Belleau Region, and Beryl Region.
80265:Waveriding Adventurer (I) - Complete {param0} Open World Time Trial Challenges in the Court of Fontaine Region, Belleau Region, and Beryl Region.
80266:Ann in Wonderland - Complete the tale of the Narzissenkreuz Adventure Team.
80267:Limner, Dreamer, and Robotic Dog - Discover the secret to be found within Elynas.
80268:Land of Fair Springs - Obtain the power of Hydro.
80269:Renart the Deceiver - Collect the entire "Fables de Fontaine" series.
80270:Robben versus Chesterton - Collect the entire "Robben versus Chesterton: Iridescent Brooch" series.
80271:Compendium of Misery - Collect the entire "The History of the Decline and Fall of Remuria" series.
81000:Overlooking View - Reach the very top of Qingyun Peak.
81001:The Remains of the Gale - Reach the top of the tower in Stormterror's Lair.
81002:"Seeds of Stories, Brought by the Wind..." - Reach the nameless island northeast of Mondstadt.
@@ -257,6 +276,7 @@
81023:Friends the World Over - Meet all sorts of people during your adventure.
81024:Megastar in Mondstadt - Reach Reputation Lv. 8 in Mondstadt.
81025:Legend in Liyue - Reach Reputation Lv. 8 in Liyue.
80092:Illustrious in Inazuma - Reach Reputation Lv. 10 in Inazuma.
81026:QUEST CLEAR - Complete 10 Bounties.
81027:QUEST CLEAR - Complete 20 Bounties.
81028:QUEST CLEAR - Complete 30 Bounties.
@@ -453,7 +473,7 @@
81238:Vamadha-Go-Round - Turn every Vamadha that holds a hidden treasure chest.
81239:In the Name of Anfortas - Visit the place where the heroes met their end.
81240:Call of the Nameless City - Quiet the mysterious parchment.
81241:Walking with Water and Wind - Complete "Until Vana is Healed."
81241:Walking with Water and Wind - Complete "Until Vana Is Healed."
81242:...Let Me Fade With Memory - Complete "Vimana Agama."
81243:Now Let Time Resume - Complete Aradasha's unfinished business.
81244:Please Play Safely - Play with the Aranara in the forest.
@@ -538,6 +558,7 @@
81327:A Fascinating Journey - Complete "An Artist Adrift."
81328:"This Mystery Is Solved!" - Complete "Monumental Study."
81329:Homeward-Bound Spirits - Complete "Pale Fire."
81339:The Sea of Fertility - All the ponds in the Vourukasha Oasis are now revitalized.
81331:The Brave Shall Not Falter - Pass all the trials set by Jarjar.
81332:Bifröst - Complete all the "Soul Bell" challenges.
81333:Seven Dish Dance - Complete all "Percussive Prancing Mushroom" challenges.
@@ -546,7 +567,39 @@
81336:Soaring in the Skies of Sary-Ozek - Keep Sorush in flight for a while.
81337:Whose Descendant Are You, and What's Your Name? - Call upon the power of Khvarena with Sorush for the first time.
81338:Use the Force, Sorush - Launch Nirodha Fruits with Sorush's help to melt {param0} crystals condensed from Amrita.
81339:The Sea of Fertility - All the ponds in the Vourukasha Oasis are now revitalized.
81340:Angle Eraser - Suppress the Beastly Rift using the power of the crystals.
81341:Core Cooling - Cause the roiling lake to become placid once more.
81342:The White Ship - "She's sailing on the sea of dreams..."
81344:Encyclopedia of Natural Philosophy - Use the glass wall and an indecipherable book to discover the gathering place of an old society.
81345:A Fontainian Message - Have a friendly chat with Virgil.
81346:Nothing but a Hound Dog... - Help Mamere fix Seymour.
81347:It's Fish, I Added Fish - Taste the wonderful "birthday cake" with the Melusine.
81348:Welcome to Fontaine - Complete a cruise on the aquabus.
81349:Sogno di Volare - Complete a flight with the Antoine Roger Aircraft.
81350:Birth of the Modern Clock - Help Puca find a way to "use" the ore.
81351:Waterworld Future - Gaze upon the "water" beneath the "surface."
81352:Aesthetics of Ugliness - And thus does Fontaine take two steps further toward beauty.
81353:Like Tears in the Rain - Find the impostor amidst the Hunter's Rays.
81355:These Are a Few of My... - ...Favorite Things.
81356:An Eye for an Eye - Take care of those annoying Bullet Barnacles!
81357:Do You Believe In Rapture? - Help build a Blubberbeast paradise.
81358:Hardships Experienced... - "To obtain the holy blade that might defeat the demon king, the knight broke into the ancient city, sealed using magic..."
81359:And After That... - "The knight defeated the demon king, saving the imprisoned princess. Light has returned to the kingdom..."
81360:A Study in Sable - Find a more... special subject of the Institute of Natural Philosophy's study.
81361:Twenty Thousand Leagues Under the Sea - Go with the flow...
81362:Truly Mouthwatering! - Help Henri change his fate.
81363:Song of the Ancients - Hear now the melody of ancient eons.
81364:Ninianne of the Lake - Defeat the local legend, Ninianne of the Lake.
81365:Vivianne of the Lake - Defeat the local legend, Vivianne of the Lake.
81366:Fontaine Expects That Everyone Will Do Their Duty - An item, returned to its rightful owner...
81367:In Search of Frittered Time - Reach Reputation Lv. 10 in Fontaine.
81368:Blubby, Chubby, Creative Evolution - Accompany the small Blubberbeast as it grows big and strong.
81369:Ocean Circuit Judge - Defeat the local legend, Ocean Circuit Judge.
81370:Iron Viscount - Defeat the local legend, Iron Viscount.
81371:Dobharcu, Lord of the Hidden - Defeat the local legend, Dobharcu, Lord of the Hidden.
81372:Fading Veteran - Defeat the local legend, Fading Veteran.
81373:Swords of the Gorge - Defeat the local legends, the Swords of the Gorge.
81374:The Fairy Knight Twins - Defeat the local legends, the Fairy Knight Twins
82001:Nothing Special, Just Practice - Hit a falcon mid-flight with your bow.
82002:Master Sniper - Strike an opponent's weak point from afar with an Aimed Shot.
82003:Der Freischütz - Strike an opponent's weak point from extremely far away with an Aimed Shot.
@@ -642,6 +695,7 @@
82096:I'll Skip the Spa, Thanks - Defeat a Mirror Maiden without being trapped by its Water Prison.
82097:It's Quiet... Too Quiet... - Defeat the Pyro Hypostasis after it enters its extinguished state only once
82098:The Battle of Narukami Island - Defeat the Perpetual Mechanical Array in its weakened state.
82109:The Finishing Touch - Defeat Azhdaha without ever having gained a shield.
82099:If I Run Fast Enough... - Defeat a Maguu Kenki without being hit by its phantom's attacks.
82100:In This Solemn Matter Let No One Interfere! - Defeat a Maguu Kenki without triggering its "Oushi no Omote" parry.
82101:Fine, I'll Do It Myself - Defeat a Primo Geovishap without reflecting its Primordial Shower.
@@ -652,7 +706,6 @@
82106:Fight Fire With Fire - Defeat a Kairagi: Fiery Might while their weapon is infused with Pyro.
82107:Ride the Lightning - Defeat a Kairagi: Dancing Thunder while their weapon is infused with Electro.
82108:I Hear Thunder... - Be struck by the lightning called down by a Crackling Axe Mitachurl...
82109:The Finishing Touch - Defeat Azhdaha without ever having gained a shield.
82110:Dry Clean - Defeat the Hydro Hypostasis without destroying a single one of its Water Droplets (except when it is restoring HP.)
82111:Bio-Oceanic Weapon - Be hit by a certain animal created by the Hydro Hypostasis...
82112:Love and Non-Communication - Defeat a Thunder Manifestation without ever being locked onto.
@@ -687,7 +740,7 @@
82141:Daisy, Daisy - Break the Algorithm of Semi-Intransient Matrix of Overseer Network by hitting its cores with the Quicken, Aggravate, or Spread reactions.
82142:Stop It, Mr. Robot! - Interrupt the charged attack of the Aeonblight Drake by attacking the core on its head.
82143:Nanomachines, Son! - Defeat an activated Jadeplume Terrorshroom while it is unleashing a powerful skill...
82144:Establishing a Beachhead - Witness the overclocking impact of the Algorithm of Semi-Intransient Matrix of Overseer Network
82144:Establishing a Beachhead - Witness the overclocking impact of the Algorithm of Semi-Intransient Matrix of Overseer Network.
82145:The Invisible Hand - Defeat the Primal Construct without disabling its invisible state.
82146:Grassy Blasty, Sparks 'n' Splash - Defeat 4 opponents with Burgeon within 2s (x1).
82147:Grassy Blasty, Sparks 'n' Splash - Defeat 4 opponents with Burgeon within 2s (x5).
@@ -710,6 +763,12 @@
82167:Proof by Exhaustion - Defeat Iniquitous Baptists of all possible elemental combinations.
82168:When You Say Nothing at All - Destroy all Elemental Rings to paralyze the Iniquitous Baptist when it begins to channel its attack.
82169:Like the Sun's Passage - Defeat the Guardian of Apep's Oasis without any character being attacked by aftershocks of the apocalypse.
82175:The White Path Between Two Rivers - Lose in the duel against the legendary Hunter's Ray...
82176:Cell, Splinter - Use Pneuma or Ousia attacks to interrupt the Breacher Primus's stress state.
82177:Too Hot to Handle! - Constantly attempt to freeze Tainted Hydro Phantasms...
82178:Funerary Storm - Use a Pneuma attack to weaken the whirlwind Coppelia creates during the performance's climax.
82179:The King Is Dead, Long Live the King! - Interrupt the Emperor of Fire and Iron's Searing Coronation.
82180:Icebound Oath - Use an Ousia attack to remove the shield that Coppelius deploys during the performance's climax.
84000:The End of the Beginning - Complete the Mondstadt Archon Quests.
84001:The Outlander Who Caught the Wind - Complete "The Outlander Who Caught the Wind."
84002:For a Tomorrow Without Tears - Complete "For a Tomorrow Without Tears."
@@ -734,10 +793,8 @@
84021:I'll Let You Off... This Time - Defeat Childe.
84022:Derailed - Defeat the Overlord of the Vortex.
84023:Final Farewell - Take part in the Rite of Parting.
84024:A New Star Approaches - Complete "A New Star Approaches".
84024:A New Star Approaches - Complete "A New Star Approaches."
84025:Gears of Destiny - Complete the quest "Bough Keeper: Dainsleif".
84026:Fantastic Voyage: Prologue - Complete "Fantastic Voyage" and unlock all endings.
84028:Behold, Mine Evil-Espying Eye! - Correctly interpret all clues.
84029:The Bandit, the Lunatic, and the Pitch-Black Enigma - Uncover the Grand Thief's fate.
84030:Where Fate Comes to a Crossroads - Escape the eerie ruins.
84031:Sneering at the Power of the Gods - Learn of the "Loom of Fate"...
@@ -762,9 +819,7 @@
84050:Duel Before the Throne - Emerge victorious in the duel before the throne.
84051:Their Wishes - Bring all the wishes upon the Statue of the Omnipresent God to fruition.
84052:Omnipresence Over Mortals - Complete "Omnipresence Over Mortals."
84053:"All is Well" - Help Wang Ping'an renovate Pervases' temple.
84054:Anna's Adventures - Help Anna become an adventurer.
84055:Prelude to the Journey - A young man is about to embark on a long journey...
84053:"All Is Well" - Help Wang Ping'an renovate Pervases' temple.
84056:Rise of the Jade Chamber - Complete the reconstruction of the Jade Chamber.
84057:Majesty of the Deep - Defeat Beisht, Avenger of the Vortex.
84058:A Former Dream - Witness the truth of the village's history.
@@ -805,52 +860,14 @@
84093:The Sickness Unto Near-Death - Create the medicine that will bring hope.
84094:The Far Side of Fate - Witness the miracle granted by the "Sinner."
84095:Caribert - Complete "Caribert."
84100:Archaic Lord of Lightning and Blitz - Witness the awesome meteorological power of Bennett's phenomenally bad luck.
84101:The Power of Luck - Activate the mechanisms and obtain the treasure without making any mistakes.
84102:A Line That May Be Crossed - Complete "Wellspring of Healing" and unlock all endings.
84103:A Maid of Strength and Virtue - Complete "Chivalric Training" and unlock all endings.
84104:Evil Is Banished - Complete "Signs of Evil" and unlock all endings.
84105:Mondstadt's Spiciest Surprise - Sample Barbara's Chilibrew.
84106:"...For I Am Duty Bound" - Help Noelle discover the source of her strength.
84107:Red Hot Chili Popsicles - Make a popsicle using the wrong recipe and provoke Chongyun's Pure-Yang Spirit.
84108:An Idol's Last Line of Defense - Successfully persuade Albert and Barbara's other fans to leave.
84109:A World Known Only Unto Roses - Read Noelle's study notes.
84110:Stress Relief - Complete "Knightly Exam Prep" and unlock all endings.
84111:Invulnerable Maid-Knight - Listen to "A Knight's Journey Through Liyue" with Noelle.
84112:Mondstadt's Note-Taker General - Read Noelle's study notes.
84113:Diona Special, Stirred, Not Shaken - Complete "The Cat and the Cocktail" and unlock all endings.
84114:But There's a Catch... - Help Diona find a special base drink.
84115:Kitten Queen - Bring all the cats back to The Cat's Tail.
84116:Everyone's Happy - Complete "A Housekeeper's Daily Chores" and unlock all endings.
84117:Housekeeper Extraordinaire - Complete the big cleanup within the time limit
84118:From the Sea Never Returning - Learn of Inu Shoushou's story together with Thoma
84119:Taller by Half - Complete "Yoohoo Art: Seichou no Jutsu" and unlock all endings.
84120:Mujina-Class Ninja - Obtain Sayu's highest rating during agility training.
84121:Dish Effect: Mobility Decreased - You were unable to prevent Sayu's reckless consumption...
84122:Honorary Crux Member - Complete "When the Crux Shines Bright" and unlock all endings.
84123:Wine Unburdens - Take part in the Qingce banquet with Beidou
84124:Guyun Buyers' Club - Find out the truth behind the deal Beidou's making
84125:General of Watatsumi - Complete "The Canine General's Special Operations" and unlock all endings
84126:Changing Times - Draw all fortune slips at the Grand Narukami Shrine.
84127:To Tell or Not to Tell, That Is the Question - Discover Ms. Hina's true identity at the Yae Publishing House.
84128:Megrez's Companion Star - Complete "The Jade Chamber's Returning Guest" and unlock all endings.
84129:You've Got to Have Reserves - Fish? The more the merrier, of course!
84130:Overprotectiveness - A single stone births a thousand ripples. It seems like Ningguang's day off is not to be.
84131:The Lingering Song - Complete "A Song That Knows Grace" and unlock all endings.
84132:May This Moment Be Made to Last - Take a commemorative photo with Yun Jin.
84133:A Strict Master Trains a Talented Pupil - Complete the practice session without hitting a single blue scarecrow.
84134:Arataki Gang Chief Advisor - Complete "The Gang's Daily Deeds" and unlock all endings.
84135:One More Look! - Gaze upon the glory that is Kuki Shinobu in a shrine maiden outfit.
84136:"Upstairs..." - Be dissuaded before alerting Kujou Sara and Kuki Shinobu.
84137:You Thought We Were For Real, Eh? - Complete "Trap 'Em by Storm" and unlock all endings.
84138:An Ideal Detective Am I - Correctly analyze the motives and the truth behind the crime the first time.
84139:Sangonomiya Supplications - Ask Gorou whether Kokomi knows about the happenings on Watatsumi Island.
84140:Optimal Solution - Complete "A Confounding Conundrum" and unlock all endings.
84141:To You in a Hundred Years - Read all the letters sent to Faruzan.
84142:Mechanics: From Beginner to...? - Guess correctly the smallest number of moves it will take to solve a seven-layer Pagoda Stack.
84143:The Name Is Layla - Complete "Ever Silent Stars" and unlock all endings.
84144:She's Already Tense - Help Layla finish her thesis without causing her further anxiety.
84145:Secret of Seelie and the Star-Lit Sky - Obtain the authentic letter of the Wisdom Seelie.
84096:Like Water Disappearing Into Water - Hear about the "prophecy" that has been circulating around Fontaine.
84097:A Detective in Action - Investigate the truth of the incident as Lyney's "attorney."
84098:A Twist of Great Magic - The Oratrice Mecanique d'Analyse Cardinale has delivered a verdict of not guilty.
84099:Prelude of Blancheur and Noirceur - Complete "Prelude of Blancheur and Noirceur."
84300:Lennék én folyóvíz - Hear the Oceanid's call and connect with her consciousness.
84301:Once Upon a Time in Fleuve Cendre - Learn about Navia's father at the Spina di Rosula's stronghold.
84302:Tragedy Repeats Itself - Reveal the truth behind the "serial disappearances case."
84303:As Light Rain Falls Without Reason - Complete "As Light Rain Falls Without Reason."
84501:...Odomu? - Successfully conduct cultural exchange with the hilichurls in "Language Exchange."
84502:Yo dala? - Successfully conduct cultural exchange with the hilichurls in "Poetry Exchange."
84503:Perfectionist - Complete all of Tsarevich's commissions flawlessly in "Reliable Helper."
@@ -891,6 +908,8 @@
84540:Guess Who? - Find out who Zhenyu really is.
84541:Well, At Least It Ended - Hear Junkichi out as he puts his story together.
84542:Her and Her Cat - Follow Neko up Mt. Yougou to find "Hibiki"'s trail.
84054:Anna's Adventures - Help Anna become an adventurer.
84055:Prelude to the Journey - A young man is about to embark on a long journey...
84543:Aha! What's on the Hook? - Fish some strange things up with Kayvan...
84544:Kalimi's Fungus - Watch Hatim make a killing on the exchange!
84545:When Wealth Comes A-Knockin' - Give Hatim some Apple Cider.
@@ -914,6 +933,11 @@
84563:A Lingering Fragrance - Witness Nermin's tale.
84564:Swordseeker - Witness the tale of Lan and the "Unseen Razor."
84565:To Walk The Horizon...? - Witness Sun Yu's tale.
84566:Office on the Avenue - Witness various miscellaneous matters in the Court of Fontaine.
84567:Not Your Average Joe - Brew a special blend of coffee.
84568:Aesthetic Critique - Listen to Depierris' theories regarding "aesthetics."
84569:Second Childhood - Play with the kids, and witness their story.
84570:A Sudden Squall - Witness Iaune's work travails.
85000:Nothing to Lose But Time - Unlock the secrets of two sundials.
85001:Interview With a Bygone God - Hear the story of a bygone deity.
85002:Crouching Dragon, Hidden Chi - Learn about the tale of the Chi.
@@ -921,6 +945,60 @@
85004:Shadow Over Luhua Pool - Help Vermeer get the scenery of his dreams.
85005:Ready Player Zero - Play a simple game with Childish Jiang.
85006:Trees Should Blend Their Roots and Shade, for That Is Where the Home Is Made - Witness the story of Yuan Hong's household.
84026:Fantastic Voyage: Prologue - Complete "Fantastic Voyage" and unlock all endings.
84100:Archaic Lord of Lightning and Blitz - Witness the awesome meteorological power of Bennett's phenomenally bad luck.
84101:The Power of Luck - Activate the mechanisms and obtain the treasure without making any mistakes.
84104:Evil Is Banished - Complete "Signs of Evil" and unlock all endings.
84028:Behold, Mine Evil-Espying Eye! - Correctly interpret all clues.
84107:Red Hot Chili Popsicles - Make a popsicle using the wrong recipe and provoke Chongyun's Pure-Yang Spirit.
84102:A Line That May Be Crossed - Complete "Wellspring of Healing" and unlock all endings.
84108:An Idol's Last Line of Defense - Successfully persuade Albert and Barbara's other fans to leave.
84105:Mondstadt's Spiciest Surprise - Sample Barbara's Chilibrew.
84103:A Maid of Strength and Virtue - Complete "Chivalric Training" and unlock all endings.
84106:"...For I Am Duty Bound" - Help Noelle discover the source of her strength.
84109:A World Known Only Unto Roses - Read Noelle's study notes.
84110:Stress Relief - Complete "Knightly Exam Prep" and unlock all endings.
84111:Invulnerable Maid-Knight - Listen to "A Knight's Journey Through Liyue" with Noelle.
84112:Mondstadt's Note-Taker General - Read Noelle's study notes.
84113:Diona Special, Stirred, Not Shaken - Complete "The Cat and the Cocktail" and unlock all endings.
84114:But There's a Catch... - Help Diona find a special base drink.
84115:Kitten Queen - Bring all the cats back to The Cat's Tail.
84116:Everyone's Happy - Complete "A Housekeeper's Daily Chores" and unlock all endings.
84117:Housekeeper Extraordinaire - Complete the big cleanup within the time limit
84118:From the Sea Never Returning - Learn of Inu Shoushou's story together with Thoma
84119:Taller by Half - Complete "Yoohoo Art: Seichou no Jutsu" and unlock all endings.
84120:Mujina-Class Ninja - Obtain Sayu's highest rating during agility training.
84121:Dish Effect: Mobility Decreased - You were unable to prevent Sayu's reckless consumption...
84122:Honorary Crux Member - Complete "When the Crux Shines Bright" and unlock all endings.
84123:Wine Unburdens - Take part in the Qingce banquet with Beidou
84124:Guyun Buyers' Club - Find out the truth behind the deal Beidou's making
84125:General of Watatsumi - Complete "The Canine General's Special Operations" and unlock all endings
84126:Changing Times - Draw all fortune slips at the Grand Narukami Shrine.
84127:To Tell or Not to Tell, That Is the Question - Discover Ms. Hina's true identity at the Yae Publishing House.
84128:Megrez's Companion Star - Complete "The Jade Chamber's Returning Guest" and unlock all endings.
84129:You've Got to Have Reserves - Fish? The more the merrier, of course!
84130:Overprotectiveness - A single stone births a thousand ripples. It seems like Ningguang's day off is not to be.
84131:The Lingering Song - Complete "A Song That Knows Grace" and unlock all endings.
84132:May This Moment Be Made to Last - Take a commemorative photo with Yun Jin.
84133:A Strict Master Trains a Talented Pupil - Complete the practice session without hitting a single blue scarecrow.
84134:Arataki Gang Chief Advisor - Complete "The Gang's Daily Deeds" and unlock all endings.
84135:One More Look! - Gaze upon the glory that is Kuki Shinobu in a shrine maiden outfit.
84136:"Upstairs..." - Be dissuaded before alerting Kujou Sara and Kuki Shinobu.
84137:You Thought We Were For Real, Eh? - Complete "Trap 'Em by Storm" and unlock all endings.
84138:An Ideal Detective Am I - Correctly analyze the motives and the truth behind the crime the first time.
84139:Sangonomiya Supplications - Ask Gorou whether Kokomi knows about the happenings on Watatsumi Island.
84140:Optimal Solution - Complete "A Confounding Conundrum" and unlock all endings.
84141:To You in a Hundred Years - Read all the letters sent to Faruzan.
84142:Mechanics: From Beginner to...? - Guess correctly the smallest number of moves it will take to solve a seven-layer Pagoda Stack.
84143:The Name Is Layla - Complete "Ever Silent Stars" and unlock all endings.
84144:She's Already Tense - Help Layla finish her thesis without causing her further anxiety.
84145:Secret of Seelie and the Star-Lit Sky - Obtain the authentic letter of the Wisdom Seelie.
84146:Art and Life - Complete "The Pendulum of Weal and Woe" and unlock all endings.
84147:School Days - Find the annotated books in the House of Daena.
84148:An Architect's Romanticism - Chat about the future with Kaveh in the desert.
84149:Make Merry - Complete "Shenanigans and Sweet Wine" and unlock all endings.
84150:Lucky Coin - Participate in the wager set up by Kaeya.
84151:Shh... Listen! - Listen to the voice coming from the confinement room.
86001:You Came, You Saw, We Co-Oped - Complete Domains together with other players 5 times.
86002:You Came, You Saw, We Co-Oped - Complete Domains together with other players 20 times.
86003:You Came, You Saw, We Co-Oped - Complete Domains together with other players 100 times.
@@ -934,13 +1012,13 @@
86011:This Is Fine - Defeat a Pyro Regisvine in Co-Op Mode.
86012:A Fish Called Rhodeia - Defeat an Oceanid in Co-Op Mode.
86013:Wolf Pact - Defeat the king of Wolvendom in Co-Op Mode.
86021:A Delusion's Abilities Don't Decide a Battle's Outcome - Defeat Childe in Co-Op Mode.
86015:Moving Mountains - Defeat a Primo Geovishap in Co-Op Mode.
86016:Blast From the Past - Defeat Azhdaha in Co-Op Mode.
86017:Put on Ice - Defeat a Cryo Hypostasis in Co-Op Mode.
86018:No Strings Attached, Anymore - Defeat a Maguu Kenki in Co-Op Mode.
86019:Operation Bonfire - Defeat a Pyro Hypostasis in Co-Op Mode.
86020:The Not-So-Perpetual Mechanical Array - Defeat a Perpetual Mechanic Array in Co-Op Mode.
86021:A Delusion's Abilities Don't Decide a Battle's Outcome - Defeat Childe in Co-Op Mode.
86022:Our Hearts as One - Defeat a Thunder Manifestation in Co-Op Mode.
86023:Water, Basically - Defeat a Hydro Hypostasis in Co-Op Mode.
86024:Dashing Through the Snow... and the Flames - Defeat Signora in Co-Op Mode.
@@ -948,4 +1026,13 @@
86026:Brave the Lightning's Glow... - Defeat the Raiden Shogun in Co-Op Mode.
86027:Surpassing the Ancients' Wisdom - Defeat the Ruin Serpent in Co-Op Mode.
86028:I'm a Flexitarian - Defeat a Jadeplume Terrorshroom in Co-Op Mode.
86029:Electric Shock Hazard - Defeat an Electro Regisvine in Co-Op Mode.
86029:Electric Shock Hazard - Defeat an Electro Regisvine in Co-Op Mode.
86030:End of the Eternal Return - Defeat the Aeonblight Drake in Co-Op Mode.
86031:Ever So Slightly Inferior - Defeat the Algorithm of Semi-Intransient Matrix of Overseer Network in Co-Op Mode.
86032:The Greenery Out of Space - Defeat a Dendro Hypostasis in Co-Op Mode.
86033:Dance Like You Want to Win! - Defeat Shouki no Kami, the Prodigal in Co-Op Mode.
86034:Desert-Dwellers' Rite of Passage - Defeat the Setekh Wenut in Co-Op Mode.
86035:Presumption of Guilt - Defeat the Iniquitous Baptist in Co-Op Mode.
86036:Proof of the Reed Sea Conqueror - Defeat the Guardian of Apep's Oasis in Co-Op Mode.
86037:The Power of Science is Staggering! - Complete one form of the "Icewind Suite" challenge in Co-Op Mode.
86038:A Successful Hunt - Defeat the Emperor of Fire and Iron in Co-Op Mode.

View File

@@ -0,0 +1,232 @@
// Activity
2001:Unreconciled Stars
2002:Lantern Rite
2003:Windblume Festival
2004:Energy Amplifier
2005:Midsummer Island Adventure
2006:Thunder Sojourn
2007:Moonlight Merriment
2008:Labyrinth Warriors
2009:Shadows Amidst Snowstorms
2010:Fleeting Colors in Flight
2011:Three Realms Gateway Offering
2012:Hues of the Violet Garden
2013:Perilous Trail
2014:Summertime Odyssey
2015:Graven Innocence
2016:Of Ballads and Brews
2017:Fabulous Fungus Frenzy
2018:Akitsu Kimodameshi
2019:The Exquisite Night Chimes
2020:Windblume's Breath
2021:A Parade of Providence
2022:Duel! The Summoners' Summit!
2023:Secret Summer Paradise
2024:Mega Meka Melee
// 1.0
1001:Lantern Rite
5001:Elemental Crucible
5002:Test Run
5003:Marvelous Merchandise
// 1.1
5004:Astrolabos Chapter
5005:Elemental Crucible
5006:While It's Warm
5007:Gliding Challenge
5009:Historia Antiqua Chapter
5010:Monoceros Caeli Chapter
// 1.2
3001:The Chalk Prince and the Dragon
5008:Pristina Nola Chapter
5011:Lost Riches
5012:Marvelous Merchandise
5014:Hypostatic Symphony
// 1.3
5015:Sinae Unicornis Chapter
5016:Five Flushes of Fortune
5017:Vishaps and Where to Find Them
6002:Even Mountains Tremble
6003:Outland Gastronomy
5018:Papilio Charontis Chapter
5019:Contending Tides
// 1.4
5020:Wishful Drops
5021:Hangout Event
// 1.5
5022:Battlefront: Misty Dungeon
5023:Windtrace
5024:Mimi Tomo
5025:Historia Antiqua Chapter
5026:Chilled to the Bone
5027:A Teapot to Call Home
5028:Hangout Event
5029:Aphros Delos Chapter
// 1.6
5030:Never-Ending Battle
5031:Legend of the Vagabond Sword
5032:Kaboomball Kombat
5033:Echoing Tales
6005:Autumn Winds, Scarlet Leaves
// 2.0
6003:Outland Gastronomy
5034:Phantom Flow
5035:Lost Riches
5036:Bellowing Blaze
5037:Theater Mechanicus: Stage of Wonders
5038:Carassius Auratus Chapter
5039:Grus Nivis Chapter
// 2.1
5040:Hyakunin Ikki
5041:Lunar Realm
5042:Mendacious Waves
5043:Distant Storm
5044:Spectral Secrets
5045:Dracaena Somnolenta Chapter
5046:Imperatrix Umbrosa Chapter
// 2.2
5047:Dreams of Bloom
5048:Hangout Event
5049:Shadow of the Ancients
5050:Tuned to the World's Sounds
// 2.3
5051:Bantan Sango Case Files: The Warrior Dog
5052:Exploding Population
5053:Energy Amplifier
5054:Misty Dungeon: Realm of Light
5059:Taurus Iracundus Chapter
5056:Hangout Event
5060:Beastly Rift
// 2.4
5055:Eight Locales Over Mountains and Seas
5057:Hangout Event
5058:A Study in Potions
5061:With Sleet and Storm
5063:The Crane Returns on the Wind
5064:Enkanomiya
// 2.5
5062:Of Drink A-Dreaming
5065:Divine Ingenuity
5066:Spices From the West
5069:Divina Vulpes Chapter
5070:Imperatrix Umbrosa Chapter
5076:Hyakunin Ikki
// 2.6
5067:Vibro-Crystal Research
5068:Outside the Canvas, Inside the Lens
5071:Chasmic Serpent
5074:Hangout Event
5075:The Chasm
5077:Requiem of the Echoing Depths
5078:Cypressus Custos Chapter
// 2.7
5080:Core of the Apparatus
5081:Umbrabilis Orchis Chapter
5079:A Muddy Bizarre Adventure
5072:The Almighty Arataki Great and Glorious Drumalong Festival
5073:Hangout Event
// 2.8
5082:Evermotion Mechanical Painting
5083:Reminiscent Regimen
5084:Resonating Visions
5085:Hidden Strife
5088:Acer Palmatum Chapter
5097:Hangout Event
// 3.0
5086:Murkwood Fungal Raptor
5087:Tablet Analytics
5089:Rumbleflower
5090:Fayz Trials
5091:Lost Riches
5092:Vulpes Zerda Chapter
5093:Dharma Forest
// 3.1
5094:Hyakunin Ikki
5095:Wind Chaser
5096:Star-Seeker's Sojourn
5098:test废弃
5100:Lupus Aureus Chapter
5101:Lotos Somno Chapter
5102:Searing Dreams in the Sea of Sand
5103:Perpetual Motion Dragon
5104:Matrix of Overseer Network
5105:Dreams, Emptiness, Deception
// 3.2
5098:test废弃
5099:Adventurer's Trials
5107:Hypostatic Symphony: Dissonant Verse
5108:Outside the Canvas, Inside the Lens: Greenery Chapter
5109:Akasha Pulses, the Kalpa Flame Rises
5113:Sapientia Oromasdis Chapter
5106:The Verdant Takeover
// 3.3
5110:Battlefield of Dice, Cats, and Cards
5111:Windtrace
5112:Across the Wilderness
5114:Misty Dungeon: Realm of Sand
5115:Inversion of Genesis
// 3.4
5116:Second Blooming
5117:Warrior's Spirit
5118:Almighty Arataki Extraordinary and Exhilarating Extreme Beetle Brawl
5119:Heated Battle Mode: The Profound Purpose of Practice
5121:Vultur Volans Chapter
5122:Lord of the Desert
5126:Desert of Hadramaveth
5127:Hangout Event
// 3.5
5120:Fungus Mechanicus
5123:Vibro-Crystal Verification
5124:Caribert
5125:Spices From the West: Northerly Search
5130:Mantichora Chapter
// 3.6
5128:Fulminating Sandstorm
5129:Brewing Developments
5131:Girdle of the Sands
5132:The Recollector's Path
5134:Cleansing of Sin
5136:Lagenaria Chapter
5139:Sapientia Oromasdis Chapter
5144:Hangout Event
// 3.7
5133:Divine Ingenuity: Collector's Chapter
5135:Feast of the Departed Warriors
5138:Fayz Trials: Hypothesis
5137:Carassius Auratus Chapter
5143:The Forge Realm's Temper
5146:Genius Invokation TCG: Radiant Secrets
// 3.8
5140:Perilous Expedition
5141:Adventurer's Trials: Advanced
5142:Shared Sight
5145:Hangout Event
5148:The Forge Realm's Temper: Endless Swarm
5119:Heated Battle Mode: The Profound Purpose of Practice
// 4.0
5148:The Forge Realm's Temper: Endless Swarm
5119:Heated Battle Mode: The Profound Purpose of Practice
5147:Studies in Light and Shadow: A Fontaine of Enchantment
5149:Felis Fuscus Chapter
5150:Relic Records: Creations of the Hydro Nation
5151:Verdict of Blades
5153:Lone Suzerain of Land and Sea
5154:Gear and Clockwork Roundelay
5158:The Terrestrial Sea, Origin of All Waters
// newcomers and special events
101: The way ahead is set
1014:Send Barbara activity
1023: Hit the abyss to send Xiangling activity
8001: Return of the Stars
10001: (test) 1.0 check-in
10002: (test) High value one-time check-in
10003: grasp the daily
10004: grasp the daily
10005: Honglv hidden gold
10006:Honglv hidden gold
10007:Honglv hidden gold
10010: grasp the daily
10011: Wealth comes to the door
10012: Tales from a foreign land
10013: Cloud Meteor Run
50001: People of all walks of life
50002: shallow singing prayer

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