Compare commits

..

25 Commits

Author SHA1 Message Date
cfb94e70b7 Remove deprecated methods 2022-08-26 12:59:25 +08:00
ab9b955c31 Fix command syntax error 2022-08-26 12:57:25 +08:00
4e4b47a9e6 Update version to v1.6.2 2022-08-26 12:55:50 +08:00
3da3bc4f23 Implementation Freeze stats(#97) 2022-08-26 12:55:40 +08:00
7cc46eb677 Fix Deepwood Memories Invisible 2022-08-26 12:28:56 +08:00
b9d1a2c2cd Fix run button disabled after command failed 2022-08-25 23:54:51 +08:00
a0cc908983 Fix Windows Defender virus reporting problem
by Remove Costuar/Fody
2022-08-25 22:02:43 +08:00
7dc7c7c8ac Update Check Gitee 2022-08-25 18:55:31 +08:00
ad4ca74e71 Add /prop unlockmap (#92) 2022-08-25 14:04:52 +08:00
a079685be8 Allow main stat to be empty 2022-08-25 12:29:06 +08:00
6703037527 Upgrade to PackageReference 2022-08-25 11:38:25 +08:00
417f0b7334 Update Prefabs 2022-08-24 22:35:40 +08:00
45aec44f39 Update Artifact Sets 2022-08-24 22:20:32 +08:00
7dd1e78512 Update Version to v1.6.0 2022-08-24 22:13:18 +08:00
418dfec289 Update 3.0 Resources 2022-08-24 22:11:06 +08:00
bc69a1c4ba Fix UI Issue 2022-07-28 12:22:59 +08:00
63f7eda5c3 Update version to v1.5.5
Fix GOODData Init issue
2022-07-28 08:41:08 +08:00
879bc34358 Update version to v1.5.4 2022-07-27 21:44:28 +08:00
c5a6d7f041 Add GOOD Help 2022-07-27 21:33:49 +08:00
20b1aca700 Fix UI occlusion issue 2022-07-27 20:42:02 +08:00
fb1a332f2c Fix textMapId field changed issue 2022-07-27 20:38:48 +08:00
867bdd1d00 Update README 2022-07-23 10:44:56 +08:00
5e28d1e625 Corrected format 2022-07-23 10:37:57 +08:00
e6ecde9951 Add help for server not connecting 2022-07-23 10:34:07 +08:00
gotoAndDie
2cb9f08caa Implement import from GOOD dump (#86)
* Implement import from GOOD dump

* Optimized implementation

* Add available urls

* Add prompt

Co-authored-by: Leo <chun.huang@student.manchester.ac.uk>
Co-authored-by: 筱傑 <jie65535@qq.com>
2022-07-23 10:18:51 +08:00
73 changed files with 90638 additions and 78426 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@@ -10,24 +10,24 @@
请从 [Releases](https://github.com/jie65535/GrasscutterCommandGenerator/releases) 中获取最新版本
本工具支持 简中, 繁中, English 与 Русский 等语言。
## 远程执行
服务端需要 [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
## TODO List
- [x] 多语言支持
- [x] 简体中文
- [x] 繁体中文
- [x] 英语
- [x] 俄语
- [x] 远程执行命令
- [ ] ~~邮件编辑器(无进度)~~
- [ ] ~~商店编辑器(无进度)~~
- [ ] 服务器公告编辑器(无进度)
---
## 软件截图

View File

@@ -10,24 +10,24 @@
Please download the latest version from [Releases](https://github.com/jie65535/GrasscutterCommandGenerator/releases)
Support 简中, 繁中, English and Русский languages.
## 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
## TODO List
- [x] Multi-language support
- [x] Simplified Chinese
- [x] Traditional Chinese
- [x] English
- [x] Russian
- [x] Execute command remotely
- [ ] ~~Mail Editor (no progress)~~
- [ ] ~~Shop Editor (no progress)~~
- [ ] Announcement Editor (no progress)
---
## Screenshots

View File

@@ -10,24 +10,24 @@
Пожалуйса загрузите последнюю версию с [Releases](https://github.com/jie65535/GrasscutterCommandGenerator/releases)
Support 简中, 繁中, English and Русский languages.
## Удаленная команда
Сервер требует [gc-opencommand-plugin](https://github.com/jie65535/gc-opencommand-plugin) помощь
![Open Command](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
## Список задач
- [x] Многоязычная поддержка
- [x] Упрощенный китайский
- [x] сложный китайский
- [х] английский
- [х] Русский
- [x] Выполнить команду удаленно
- [ ] ~~Редактор почты (нет прогресса)~~
- [ ] ~~Редактор магазина (нет прогресса)~~
- [ ] Announcement Editor (no progress)
---
## Скриншоты

View File

@@ -1,6 +1,5 @@
using System;
using System.ComponentModel;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

View File

@@ -18,7 +18,6 @@
**/
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

View File

@@ -19,7 +19,6 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

View File

@@ -35,6 +35,11 @@ namespace GrasscutterTools.Forms
this.GrpCommand = new System.Windows.Forms.GroupBox();
this.BtnInvokeOpenCommand = new System.Windows.Forms.Button();
this.TPRemoteCall = new System.Windows.Forms.TabPage();
this.LnkLinks = new System.Windows.Forms.LinkLabel();
this.LnkGOODHelp = new System.Windows.Forms.LinkLabel();
this.LnkInventoryKamera = new System.Windows.Forms.LinkLabel();
this.LblGOODHelp = new System.Windows.Forms.Label();
this.ButtonOpenGOODImport = new System.Windows.Forms.Button();
this.LblHostTip = new System.Windows.Forms.Label();
this.GrpServerStatus = new System.Windows.Forms.GroupBox();
this.LnkOpenCommandLabel = new System.Windows.Forms.LinkLabel();
@@ -127,9 +132,9 @@ namespace GrasscutterTools.Forms
this.NUDWeaponLevel = new System.Windows.Forms.NumericUpDown();
this.ListWeapons = new System.Windows.Forms.ListBox();
this.TPStats = new System.Windows.Forms.TabPage();
this.LblResetStatsCommand = new System.Windows.Forms.LinkLabel();
this.LblResetStatsTip = new System.Windows.Forms.Label();
this.GrpSetStats = new System.Windows.Forms.GroupBox();
this.BtnUnlockStat = new System.Windows.Forms.Button();
this.BtnLockStat = new System.Windows.Forms.Button();
this.LblStatTip = new System.Windows.Forms.Label();
this.LblStatPercent = new System.Windows.Forms.Label();
this.NUDStat = new System.Windows.Forms.NumericUpDown();
@@ -318,6 +323,11 @@ namespace GrasscutterTools.Forms
// TPRemoteCall
//
resources.ApplyResources(this.TPRemoteCall, "TPRemoteCall");
this.TPRemoteCall.Controls.Add(this.LnkLinks);
this.TPRemoteCall.Controls.Add(this.LnkGOODHelp);
this.TPRemoteCall.Controls.Add(this.LnkInventoryKamera);
this.TPRemoteCall.Controls.Add(this.LblGOODHelp);
this.TPRemoteCall.Controls.Add(this.ButtonOpenGOODImport);
this.TPRemoteCall.Controls.Add(this.LblHostTip);
this.TPRemoteCall.Controls.Add(this.GrpServerStatus);
this.TPRemoteCall.Controls.Add(this.GrpRemoteCommand);
@@ -327,6 +337,40 @@ namespace GrasscutterTools.Forms
this.TPRemoteCall.Name = "TPRemoteCall";
this.TPRemoteCall.UseVisualStyleBackColor = true;
//
// LnkLinks
//
resources.ApplyResources(this.LnkLinks, "LnkLinks");
this.LnkLinks.Name = "LnkLinks";
this.LnkLinks.TabStop = true;
this.LnkLinks.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LnkLinks_LinkClicked);
//
// LnkGOODHelp
//
resources.ApplyResources(this.LnkGOODHelp, "LnkGOODHelp");
this.LnkGOODHelp.Cursor = System.Windows.Forms.Cursors.Help;
this.LnkGOODHelp.Name = "LnkGOODHelp";
this.LnkGOODHelp.TabStop = true;
this.LnkGOODHelp.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LnkGOODHelp_LinkClicked);
//
// LnkInventoryKamera
//
resources.ApplyResources(this.LnkInventoryKamera, "LnkInventoryKamera");
this.LnkInventoryKamera.Name = "LnkInventoryKamera";
this.LnkInventoryKamera.TabStop = true;
this.LnkInventoryKamera.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LnkInventoryKamera_LinkClicked);
//
// LblGOODHelp
//
resources.ApplyResources(this.LblGOODHelp, "LblGOODHelp");
this.LblGOODHelp.Name = "LblGOODHelp";
//
// ButtonOpenGOODImport
//
resources.ApplyResources(this.ButtonOpenGOODImport, "ButtonOpenGOODImport");
this.ButtonOpenGOODImport.Name = "ButtonOpenGOODImport";
this.ButtonOpenGOODImport.UseVisualStyleBackColor = true;
this.ButtonOpenGOODImport.Click += new System.EventHandler(this.ButtonOpenGOODImport_Click);
//
// LblHostTip
//
resources.ApplyResources(this.LblHostTip, "LblHostTip");
@@ -1128,30 +1172,17 @@ namespace GrasscutterTools.Forms
// TPStats
//
resources.ApplyResources(this.TPStats, "TPStats");
this.TPStats.Controls.Add(this.LblResetStatsCommand);
this.TPStats.Controls.Add(this.LblResetStatsTip);
this.TPStats.Controls.Add(this.GrpSetStats);
this.TPStats.Controls.Add(this.GrpTalentLevel);
this.TPStats.Controls.Add(this.LblStatsDescription);
this.TPStats.Name = "TPStats";
this.TPStats.UseVisualStyleBackColor = true;
//
// LblResetStatsCommand
//
resources.ApplyResources(this.LblResetStatsCommand, "LblResetStatsCommand");
this.LblResetStatsCommand.Name = "LblResetStatsCommand";
this.LblResetStatsCommand.TabStop = true;
this.LblResetStatsCommand.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LblResetStatsCommand_LinkClicked);
//
// LblResetStatsTip
//
resources.ApplyResources(this.LblResetStatsTip, "LblResetStatsTip");
this.LblResetStatsTip.ForeColor = System.Drawing.SystemColors.ActiveCaption;
this.LblResetStatsTip.Name = "LblResetStatsTip";
//
// GrpSetStats
//
resources.ApplyResources(this.GrpSetStats, "GrpSetStats");
this.GrpSetStats.Controls.Add(this.BtnUnlockStat);
this.GrpSetStats.Controls.Add(this.BtnLockStat);
this.GrpSetStats.Controls.Add(this.LblStatTip);
this.GrpSetStats.Controls.Add(this.LblStatPercent);
this.GrpSetStats.Controls.Add(this.NUDStat);
@@ -1159,6 +1190,20 @@ namespace GrasscutterTools.Forms
this.GrpSetStats.Name = "GrpSetStats";
this.GrpSetStats.TabStop = false;
//
// BtnUnlockStat
//
resources.ApplyResources(this.BtnUnlockStat, "BtnUnlockStat");
this.BtnUnlockStat.Name = "BtnUnlockStat";
this.BtnUnlockStat.UseVisualStyleBackColor = true;
this.BtnUnlockStat.Click += new System.EventHandler(this.BtnUnlockStat_Click);
//
// BtnLockStat
//
resources.ApplyResources(this.BtnLockStat, "BtnLockStat");
this.BtnLockStat.Name = "BtnLockStat";
this.BtnLockStat.UseVisualStyleBackColor = true;
this.BtnLockStat.Click += new System.EventHandler(this.BtnLockStat_Click);
//
// LblStatTip
//
resources.ApplyResources(this.LblStatTip, "LblStatTip");
@@ -2237,12 +2282,17 @@ namespace GrasscutterTools.Forms
private System.Windows.Forms.Label LblArtifactLevelTip;
private System.Windows.Forms.Label LblClearSpawnLogs;
private System.Windows.Forms.Label LblClearGiveItemLogs;
private System.Windows.Forms.LinkLabel LblResetStatsCommand;
private System.Windows.Forms.Label LblResetStatsTip;
private System.Windows.Forms.Label LblAvatarConstellation;
private System.Windows.Forms.NumericUpDown NUDAvatarConstellation;
private System.Windows.Forms.Label LblConstellationTip;
private System.Windows.Forms.Button BtnGiveAllChar;
private System.Windows.Forms.Label LblHostTip;
private System.Windows.Forms.Button ButtonOpenGOODImport;
private System.Windows.Forms.LinkLabel LnkInventoryKamera;
private System.Windows.Forms.Label LblGOODHelp;
private System.Windows.Forms.LinkLabel LnkGOODHelp;
private System.Windows.Forms.LinkLabel LnkLinks;
private System.Windows.Forms.Button BtnUnlockStat;
private System.Windows.Forms.Button BtnLockStat;
}
}

View File

@@ -28,8 +28,12 @@ using System.Windows.Forms;
using GrasscutterTools.DispatchServer;
using GrasscutterTools.Game;
using GrasscutterTools.GOOD;
using GrasscutterTools.OpenCommand;
using GrasscutterTools.Properties;
using GrasscutterTools.Utils;
using Newtonsoft.Json;
namespace GrasscutterTools.Forms
{
@@ -134,11 +138,12 @@ namespace GrasscutterTools.Forms
private void LoadUpdate()
{
#if !DEBUG
Task.Run(() =>
Task.Run(async () =>
{
try
{
var info = Github.ReleaseAPI.GetReleasesLastest("jie65535", "GrasscutterCommandGenerator").Result;
await Task.Delay(5000);
var info = await ReleaseAPI.GetReleasesLastest("jie65535", "GrasscutterCommandGenerator");
if (Version.TryParse(info.TagName.Substring(1), out Version lastestVersion) && AppVersion < lastestVersion)
{
if (!string.IsNullOrEmpty(Settings.Default.CheckedLastVersion)
@@ -153,7 +158,7 @@ namespace GrasscutterTools.Forms
MessageBoxButtons.YesNo,
MessageBoxIcon.Information);
if (r == DialogResult.Yes)
System.Diagnostics.Process.Start(info.Url);
OpenURL(info.Url);
else if (r == DialogResult.No)
Settings.Default.CheckedLastVersion = lastestVersion.ToString();
}));
@@ -202,6 +207,125 @@ namespace GrasscutterTools.Forms
TextMapBrowser.TopMost = false;
}
}
async private void ButtonOpenGOODImport_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog1 = new OpenFileDialog
{
Filter = "GOOD file (*.GOOD;*.json)|*.GOOD;*.json|All files (*.*)|*.*",
};
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
if (DialogResult.Yes != MessageBox.Show(Resources.GOODImportText + openFileDialog1.FileName + "?",
Resources.GOODImportTitle, MessageBoxButtons.YesNo))
return;
try
{
GOOD.GOOD good = JsonConvert.DeserializeObject<GOOD.GOOD>(File.ReadAllText(openFileDialog1.FileName));
var commands_list = new List<string>();
var missingItems = new List<string>();
if (good.Characters != null)
{
foreach (var character in good.Characters)
{
if (character.Name != "Traveler")
{
if (GOODData.Avatars.TryGetValue(character.Name, out var character_id))
commands_list.Add("/give " + character_id + " lv" + character.Level + "c" + character.Constellation);
else
missingItems.Add(character.Name);
// TODO: Implement command to set talent level when giving character in Grasscutter
}
}
}
if (good.Weapons != null)
{
foreach (var weapon in good.Weapons)
{
if (GOODData.Weapons.TryGetValue(weapon.Name, out var weapon_id))
commands_list.Add("/give " + weapon_id + " lv" + weapon.Level + "r" + weapon.RefinementLevel);
else
missingItems.Add(weapon.Name);
// TODO: Implement command to give weapon directly to character in Grasscutter
}
}
if (good.Artifacts != null)
{
foreach (var artifact in good.Artifacts)
{
// Format: set rarity slot
if (!GOODData.ArtifactCats.TryGetValue(artifact.SetName, out var artifact_set_id))
{
missingItems.Add(artifact.SetName);
continue;
}
var artifact_id = artifact_set_id.ToString() + artifact.Rarity.ToString() + GOODData.ArtifactSlotMap[artifact.GearSlot] + "4";
var artifact_mainStat_id = GOODData.ArtifactMainAttribution[artifact.MainStat];
var artifact_substats = "";
var artifact_substat_prefix = artifact.Rarity + "0";
int substat_count = 0;
foreach (var substat in artifact.SubStats)
{
if (substat.Value <= 0)
continue;
substat_count++;
var substat_key = substat.Stat;
var substat_key_id = GOODData.ArtifactSubAttribution[substat_key];
var substat_indices = ArtifactUtils.SplitSubstats(substat_key, artifact.Rarity, substat.Value);
foreach (int index in substat_indices)
{
artifact_substats += artifact_substat_prefix + substat_key_id + index.ToString() + " ";
}
}
// HACK: Add def+2 substat to counteract Grasscutter automatically adding another substat
if (substat_count == 4)
artifact_substats += "101081 ";
commands_list.Add("/give " + artifact_id + " lv" + artifact.Level + " " + artifact_mainStat_id + " " + artifact_substats);
// TODO: Implement command to give artifact directly to character in Grasscutter
}
}
// TODO: Materials
//if (good.Materials != null)
//{
// foreach (var material in good.Materials)
// {
// }
//}
var msg = string.Format("Loaded {0} Characters\nLoaded {1} Weapons\nLoaded {2} Artifacts\n",
good.Characters?.Count ?? 0,
good.Weapons?.Count ?? 0,
good.Artifacts?.Count ?? 0
);
if (missingItems.Count > 0)
{
msg += string.Format("There are {0} pieces of data that cannot be parsed, including:\n{1}",
missingItems.Count,
string.Join("\n", missingItems.Take(10)));
if (missingItems.Count > 10)
msg += "......";
}
msg += "Do you want to start?";
if (DialogResult.Yes != MessageBox.Show(msg, Resources.Tips, MessageBoxButtons.YesNo, MessageBoxIcon.Information))
return;
if (await RunCommands(commands_list.ToArray()))
MessageBox.Show(Resources.GOODImportSuccess);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void CmbLanguage_SelectedIndexChanged(object sender, EventArgs e)
{
@@ -495,8 +619,14 @@ namespace GrasscutterTools.Forms
var id = GameData.Artifacts.Ids[Array.LastIndexOf(GameData.Artifacts.Names, name)];
id = id / 1000 * 1000 + (int)NUDArtifactStars.Value * 100 + id % 100;
if (CmbMainAttribution.SelectedIndex < 0)
return;
{
if (ChkNewCommand.Checked)
SetCommand("/give", $"{id} lv{NUDArtifactLevel.Value}");
else
SetCommand("/giveart", $"{id} {NUDArtifactLevel.Value}");
}
else
{
var t = CmbMainAttribution.SelectedItem as string;
var mainAttr = t.Substring(0, t.IndexOf(':')).Trim();
@@ -527,6 +657,7 @@ namespace GrasscutterTools.Forms
else
SetCommand("/giveart", $"{id} {mainAttr} {subAttrs}{NUDArtifactLevel.Value}");
}
}
private void ListSubAttributionChecked_SelectedIndexChanged(object sender, EventArgs e)
{
@@ -540,6 +671,7 @@ namespace GrasscutterTools.Forms
private void LblClearSubAttrCheckedList_Click(object sender, EventArgs e)
{
CmbMainAttribution.SelectedIndex = -1;
ListSubAttributionChecked.Items.Clear();
ArtifactInputChanged(null, EventArgs.Empty);
}
@@ -968,6 +1100,8 @@ namespace GrasscutterTools.Forms
{
if (CmbStat.SelectedIndex < 0)
return;
else
BtnLockStat.Enabled = BtnUnlockStat.Enabled = true;
var stat = SetStatsCommand.Stats[CmbStat.SelectedIndex];
LblStatPercent.Visible = stat.Percent;
@@ -976,16 +1110,23 @@ namespace GrasscutterTools.Forms
SetCommand("/setstats", $"{stat.ArgName} {NUDStat.Value}{(stat.Percent ? "%" : "")}");
}
private void BtnLockStat_Click(object sender, EventArgs e)
{
var stat = SetStatsCommand.Stats[CmbStat.SelectedIndex];
SetCommand("/setstats", $"lock {stat.ArgName} {NUDStat.Value}{(stat.Percent ? "%" : "")}");
}
private void BtnUnlockStat_Click(object sender, EventArgs e)
{
var stat = SetStatsCommand.Stats[CmbStat.SelectedIndex];
SetCommand("/setstats", $"unlock {stat.ArgName}");
}
private void LnkSetTalentClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
SetCommand("/talent", $"{(sender as LinkLabel).Tag} {NUDTalentLevel.Value}");
}
private void LblResetStatsCommand_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
SetCommand("/give 101");
}
#endregion - -
#region - -
@@ -1041,16 +1182,7 @@ namespace GrasscutterTools.Forms
private void LnkGithub_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
try
{
System.Diagnostics.Process.Start("https://github.com/jie65535/GrasscutterCommandGenerator");
}
catch (Exception)
{
MessageBox.Show(Resources.BrowserOpenFailedTip
+ "\n https://github.com/jie65535/GrasscutterCommandGenerator",
Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
OpenURL("https://github.com/jie65535/GrasscutterCommandGenerator");
}
#endregion - -
@@ -1069,9 +1201,9 @@ namespace GrasscutterTools.Forms
private void SetCommand(string command, string args)
{
if (ChkIncludeUID.Checked)
SetCommand($"{command} @{NUDUid.Value} {args}");
SetCommand($"{command} @{NUDUid.Value} {args.Trim()}");
else
SetCommand($"{command} {args}");
SetCommand($"{command} {args.Trim()}");
}
private async void BtnCopy_Click(object sender, EventArgs e)
@@ -1093,31 +1225,43 @@ namespace GrasscutterTools.Forms
private async void BtnInvokeOpenCommand_Click(object sender, EventArgs e)
{
if (OC == null || !OC.CanInvoke)
{
ShowTip(Resources.RequireOpenCommandTip, BtnInvokeOpenCommand);
TCMain.SelectedTab = TPRemoteCall;
return;
}
if (!BtnInvokeOpenCommand.Enabled) return;
if (TxtCommand.Text.Length < 2)
{
ShowTip(Resources.CommandContentCannotBeEmpty, TxtCommand);
return;
}
await RunCommands(TxtCommand.Text);
}
private async Task<bool> RunCommands(params string[] commands)
{
if (OC == null || !OC.CanInvoke)
{
ShowTip(Resources.RequireOpenCommandTip, BtnInvokeOpenCommand);
TCMain.SelectedTab = TPRemoteCall;
return false;
}
ExpandCommandRunLog();
try
{
BtnInvokeOpenCommand.Enabled = false;
BtnInvokeOpenCommand.Cursor = Cursors.WaitCursor;
int i = 0;
foreach (var command in commands)
{
TxtCommandRunLog.AppendText(">");
TxtCommandRunLog.AppendText(TxtCommand.Text);
TxtCommandRunLog.AppendText(command);
if (commands.Length > 1)
TxtCommandRunLog.AppendText($" ({++i}/{commands.Length})");
TxtCommandRunLog.AppendText(Environment.NewLine);
var cmd = TxtCommand.Text.Substring(1);
var btn = sender as Button;
btn.Enabled = false;
var cmd = command.Substring(1);
try
{
var msg = await OC.Invoke(cmd);
TxtCommandRunLog.AppendText(string.IsNullOrEmpty(msg) ? "OK" : msg);
TxtCommandRunLog.AppendText(Environment.NewLine);
//ShowTip(string.IsNullOrEmpty(msg) ? "OK" : msg, btn);
}
catch (Exception ex)
{
@@ -1125,10 +1269,17 @@ namespace GrasscutterTools.Forms
TxtCommandRunLog.AppendText(ex.Message);
TxtCommandRunLog.AppendText(Environment.NewLine);
MessageBox.Show(ex.Message, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
TxtCommandRunLog.ScrollToCaret();
btn.Cursor = Cursors.Default;
btn.Enabled = true;
}
}
finally
{
BtnInvokeOpenCommand.Cursor = Cursors.Default;
BtnInvokeOpenCommand.Enabled = true;
}
return true;
}
private const int TxtCommandRunLogMinHeight = 150;
@@ -1332,6 +1483,7 @@ namespace GrasscutterTools.Forms
GrpRemoteCommand.Enabled = false;
BtnInvokeOpenCommand.Focus();
ShowTip(Resources.ConnectedTip, BtnInvokeOpenCommand);
ButtonOpenGOODImport.Enabled = true;
}
catch (Exception ex)
{
@@ -1357,16 +1509,7 @@ namespace GrasscutterTools.Forms
private void LnkOpenCommandLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
try
{
System.Diagnostics.Process.Start("https://github.com/jie65535/gc-opencommand-plugin");
}
catch (Exception)
{
MessageBox.Show(Resources.BrowserOpenFailedTip
+ "\n https://github.com/jie65535/gc-opencommand-plugin",
Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
OpenURL("https://github.com/jie65535/gc-opencommand-plugin");
}
private void LnkRCHelp_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
@@ -1374,6 +1517,45 @@ namespace GrasscutterTools.Forms
MessageBox.Show(Resources.OpenCommandHelp, Resources.Help, MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void LnkInventoryKamera_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
OpenURL("https://github.com/Andrewthe13th/Inventory_Kamera");
}
private void LnkGOODHelp_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
OpenURL("https://frzyc.github.io/genshin-optimizer/#/doc");
}
private void LnkLinks_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
var links = new List<string>
{
"https://frzyc.github.io/genshin-optimizer/",
"https://genshin.aspirine.su/",
"https://genshin.mingyulab.com/",
"https://genshin-center.com/",
"https://github.com/Andrewthe13th/Inventory_Kamera",
"https://github.com/daydreaming666/Amenoma",
"https://seelie.me/",
"https://www.mona-uranai.com/",
};
MessageBox.Show(string.Join("\n", links), "Links", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void OpenURL(string url)
{
try
{
System.Diagnostics.Process.Start(url);
}
catch (Exception)
{
MessageBox.Show(Resources.BrowserOpenFailedTip + "\n " + url,
Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
#endregion - -
#region - -

View File

@@ -136,6 +136,15 @@
<data name="TPRemoteCall.Text" xml:space="preserve">
<value>Remote</value>
</data>
<data name="LnkInventoryKamera.Text" xml:space="preserve">
<value>InventoryKamera</value>
</data>
<data name="LblGOODHelp.Text" xml:space="preserve">
<value>Come and import your official server archive into GC!</value>
</data>
<data name="ButtonOpenGOODImport.Text" xml:space="preserve">
<value>Import GOOD</value>
</data>
<data name="LblHostTip.Location" type="System.Drawing.Point, System.Drawing">
<value>108, 16</value>
</data>
@@ -208,6 +217,9 @@
<data name="BtnSendVerificationCode.Text" xml:space="preserve">
<value>Send Code</value>
</data>
<data name="TPConsoleCheck.Size" type="System.Drawing.Size, System.Drawing">
<value>296, 111</value>
</data>
<data name="TPConsoleCheck.Text" xml:space="preserve">
<value>Console</value>
</data>
@@ -509,27 +521,15 @@ Tip: Most of the scenes have no effect and cannot be entered.</value>
<data name="TPStats.Text" xml:space="preserve">
<value>Stats</value>
</data>
<data name="LblResetStatsCommand.Location" type="System.Drawing.Point, System.Drawing">
<value>126, 135</value>
</data>
<data name="LblResetStatsCommand.Size" type="System.Drawing.Size, System.Drawing">
<value>112, 17</value>
</data>
<data name="LblResetStatsCommand.Text" xml:space="preserve">
<value>When getting CEP</value>
</data>
<data name="LblResetStatsTip.Location" type="System.Drawing.Point, System.Drawing">
<value>235, 135</value>
</data>
<data name="LblResetStatsTip.Size" type="System.Drawing.Size, System.Drawing">
<value>243, 17</value>
</data>
<data name="LblResetStatsTip.Text" xml:space="preserve">
<value>the current character's stats will be reset</value>
</data>
<data name="GrpSetStats.Text" xml:space="preserve">
<value>Stats</value>
</data>
<data name="BtnUnlockStat.Text" xml:space="preserve">
<value>Unlock</value>
</data>
<data name="BtnLockStat.Text" xml:space="preserve">
<value>Lock</value>
</data>
<data name="LblStatTip.Text" xml:space="preserve">
<value>Tip</value>
</data>
@@ -856,4 +856,8 @@ Therefore, the quest can be added and finished, but not necessarily work.</value
<data name="ChkIncludeUID.Text" xml:space="preserve">
<value>Include UID</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="$this.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>Inherit</value>
</data>
</root>

File diff suppressed because it is too large Load Diff

View File

@@ -139,6 +139,15 @@
<data name="TPRemoteCall.Text" xml:space="preserve">
<value>Подключение к БД</value>
</data>
<data name="LnkInventoryKamera.Text" xml:space="preserve">
<value>InventoryKamera</value>
</data>
<data name="LblGOODHelp.Text" xml:space="preserve">
<value>Приходите и импортируйте свой официальный архив сервера в GC!</value>
</data>
<data name="ButtonOpenGOODImport.Text" xml:space="preserve">
<value>импорт GOOD</value>
</data>
<data name="LblHostTip.Location" type="System.Drawing.Point, System.Drawing">
<value>83, 16</value>
</data>
@@ -211,6 +220,9 @@
<data name="BtnSendVerificationCode.Text" xml:space="preserve">
<value>Отправить код</value>
</data>
<data name="TPConsoleCheck.Size" type="System.Drawing.Size, System.Drawing">
<value>296, 111</value>
</data>
<data name="TPConsoleCheck.Text" xml:space="preserve">
<value>консоль</value>
</data>
@@ -218,7 +230,7 @@
<value>Подключить</value>
</data>
<data name="LblConsoleTip.Font" type="System.Drawing.Font, System.Drawing">
<value>微软雅黑, 8pt, style=Italic</value>
<value>Microsoft YaHei UI, 8pt, style=Italic</value>
</data>
<data name="LblConsoleTip.Location" type="System.Drawing.Point, System.Drawing">
<value>15, 34</value>
@@ -397,7 +409,7 @@
<value>False</value>
</data>
<data name="LblTp.Font" type="System.Drawing.Font, System.Drawing">
<value>微软雅黑, 8pt</value>
<value>Microsoft YaHei UI, 8pt</value>
</data>
<data name="LblTp.Location" type="System.Drawing.Point, System.Drawing">
<value>6, 89</value>
@@ -558,27 +570,15 @@
<data name="TPStats.Text" xml:space="preserve">
<value>Статы</value>
</data>
<data name="LblResetStatsCommand.Location" type="System.Drawing.Point, System.Drawing">
<value>88, 135</value>
</data>
<data name="LblResetStatsCommand.Size" type="System.Drawing.Size, System.Drawing">
<value>130, 17</value>
</data>
<data name="LblResetStatsCommand.Text" xml:space="preserve">
<value>При получении CEP</value>
</data>
<data name="LblResetStatsTip.Location" type="System.Drawing.Point, System.Drawing">
<value>214, 135</value>
</data>
<data name="LblResetStatsTip.Size" type="System.Drawing.Size, System.Drawing">
<value>301, 17</value>
</data>
<data name="LblResetStatsTip.Text" xml:space="preserve">
<value>атрибуты текущего персонажа будут сброшены</value>
</data>
<data name="GrpSetStats.Text" xml:space="preserve">
<value>Статистика</value>
</data>
<data name="BtnUnlockStat.Text" xml:space="preserve">
<value>разморозить</value>
</data>
<data name="BtnLockStat.Text" xml:space="preserve">
<value>заморозить</value>
</data>
<data name="LblStatTip.Text" xml:space="preserve">
<value>Совет</value>
</data>
@@ -977,6 +977,10 @@
<data name="ChkIncludeUID.Text" xml:space="preserve">
<value>Включить UID</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="$this.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>Inherit</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>GrasscutterTools - перевод Юрий Дворецкий</value>
</data>

View File

@@ -123,11 +123,23 @@
<data name="ChkAutoCopy.Text" xml:space="preserve">
<value>自動</value>
</data>
<data name="GrpCommand.Text" xml:space="preserve">
<value>命令(按住 Ctrl 自動執行)</value>
</data>
<data name="BtnInvokeOpenCommand.Text" xml:space="preserve">
<value>執行(F5)</value>
</data>
<data name="GrpCommand.Text" xml:space="preserve">
<value>命令(按住 Ctrl 自動執行)</value>
<data name="TPRemoteCall.Text" xml:space="preserve">
<value>遠程</value>
</data>
<data name="LnkInventoryKamera.Text" xml:space="preserve">
<value>存檔掃描開源工具</value>
</data>
<data name="LblGOODHelp.Text" xml:space="preserve">
<value>快來把你的官服存檔導入GC吧</value>
</data>
<data name="ButtonOpenGOODImport.Text" xml:space="preserve">
<value>導入GOOD檔案</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="LblHostTip.Size" type="System.Drawing.Size, System.Drawing">
@@ -136,6 +148,9 @@
<data name="LblHostTip.Text" xml:space="preserve">
<value>請確保地址中包含 http:// 或 https://</value>
</data>
<data name="GrpServerStatus.Text" xml:space="preserve">
<value>伺服器狀態</value>
</data>
<data name="LnkOpenCommandLabel.Text" xml:space="preserve">
<value>遠程執行插件</value>
</data>
@@ -145,8 +160,11 @@
<data name="LblPlayerCountLabel.Text" xml:space="preserve">
<value>當前玩家數</value>
</data>
<data name="GrpServerStatus.Text" xml:space="preserve">
<value>伺服器狀態</value>
<data name="GrpRemoteCommand.Text" xml:space="preserve">
<value>遠程執行</value>
</data>
<data name="TPPlayerCheck.Text" xml:space="preserve">
<value>玩家驗證</value>
</data>
<data name="LnkRCHelp.Text" xml:space="preserve">
<value>幫助</value>
@@ -160,8 +178,8 @@
<data name="BtnSendVerificationCode.Text" xml:space="preserve">
<value>發送驗證碼</value>
</data>
<data name="TPPlayerCheck.Text" xml:space="preserve">
<value>玩家驗證</value>
<data name="TPConsoleCheck.Size" type="System.Drawing.Size, System.Drawing">
<value>296, 111</value>
</data>
<data name="BtnConsoleConnect.Text" xml:space="preserve">
<value>連接</value>
@@ -170,17 +188,14 @@
<value>請注意,控制台狀態下普通命令必須指定目標
即設置包含UID</value>
</data>
<data name="GrpRemoteCommand.Text" xml:space="preserve">
<value>遠程執行</value>
</data>
<data name="BtnQueryServerStatus.Text" xml:space="preserve">
<value>查詢</value>
</data>
<data name="LblHost.Text" xml:space="preserve">
<value>伺服器地址</value>
</data>
<data name="TPRemoteCall.Text" xml:space="preserve">
<value>遠程</value>
<data name="TPAbout.Text" xml:space="preserve">
<value>關於</value>
</data>
<data name="LblSupportDescription.Text" xml:space="preserve">
<value>割草機工具箱
@@ -190,15 +205,15 @@
如果願意請我喝一杯奶茶,那就更好了 : )
指令生成有問題或者有新的功能請求都可以來Github提出</value>
</data>
<data name="TPAbout.Text" xml:space="preserve">
<value>關於</value>
</data>
<data name="BtnBan.Text" xml:space="preserve">
<value>封號</value>
</data>
<data name="LblBanUID.Text" xml:space="preserve">
<value>目標UID</value>
</data>
<data name="GrpAccount.Text" xml:space="preserve">
<value>賬號管理</value>
</data>
<data name="BtnDeleteAccount.Text" xml:space="preserve">
<value>- 刪除</value>
</data>
@@ -208,8 +223,8 @@
<data name="LblAccountUserName.Text" xml:space="preserve">
<value>用戶名</value>
</data>
<data name="GrpAccount.Text" xml:space="preserve">
<value>賬號管理</value>
<data name="GrpPermission.Text" xml:space="preserve">
<value>權限管理</value>
</data>
<data name="LblPerm.Text" xml:space="preserve">
<value>權限</value>
@@ -217,8 +232,8 @@
<data name="LblPermUID.Text" xml:space="preserve">
<value>目標UID</value>
</data>
<data name="GrpPermission.Text" xml:space="preserve">
<value>權限管理</value>
<data name="TPScene.Text" xml:space="preserve">
<value>場景</value>
</data>
<data name="ChkIncludeSceneId.Text" xml:space="preserve">
<value>含場景ID</value>
@@ -239,9 +254,6 @@
提示:大部分場景沒有作用,無法進入。</value>
</data>
<data name="TPScene.Text" xml:space="preserve">
<value>場景</value>
</data>
<data name="BtnSaveGiveItemLog.Text" xml:space="preserve">
<value>√ 記錄</value>
</data>
@@ -281,27 +293,27 @@
<data name="LblWeaponLevel.Text" xml:space="preserve">
<value>等級</value>
</data>
<data name="LblResetStatsCommand.Text" xml:space="preserve">
<value>獲得角色經驗時</value>
</data>
<data name="LblResetStatsTip.Text" xml:space="preserve">
<value>當前角色屬性將會重置</value>
<data name="TPStats.Text" xml:space="preserve">
<value>數據</value>
</data>
<data name="GrpSetStats.Text" xml:space="preserve">
<value>角色屬性</value>
</data>
<data name="LnkTalentNormalATK.Text" xml:space="preserve">
<value>普通攻擊</value>
<data name="BtnUnlockStat.Text" xml:space="preserve">
<value>解鎖</value>
</data>
<data name="BtnLockStat.Text" xml:space="preserve">
<value>鎖定</value>
</data>
<data name="GrpTalentLevel.Text" xml:space="preserve">
<value>技能等級</value>
</data>
<data name="LnkTalentNormalATK.Text" xml:space="preserve">
<value>普通攻擊</value>
</data>
<data name="LblStatsDescription.Text" xml:space="preserve">
<value>設置當前活躍角色數據</value>
</data>
<data name="TPStats.Text" xml:space="preserve">
<value>數據</value>
</data>
<data name="BtnGiveAllChar.Text" xml:space="preserve">
<value>一鍵獲得所有角色</value>
</data>
@@ -317,15 +329,15 @@
<data name="GrpSpawnRecord.Text" xml:space="preserve">
<value>生成記錄本</value>
</data>
<data name="GrpEntityType.Text" xml:space="preserve">
<value>列表分類</value>
</data>
<data name="RbEntityAnimal.Text" xml:space="preserve">
<value>生物誌</value>
</data>
<data name="RbEntityMonster.Text" xml:space="preserve">
<value>討伐對象</value>
</data>
<data name="GrpEntityType.Text" xml:space="preserve">
<value>列表分類</value>
</data>
<data name="LblSpawnDescription.Text" xml:space="preserve">
<value>在玩家附近召喚生物</value>
</data>
@@ -335,6 +347,12 @@
<data name="LblEntityLevel.Text" xml:space="preserve">
<value>等級</value>
</data>
<data name="TPQuest.Text" xml:space="preserve">
<value>任務</value>
</data>
<data name="GrpQuestFilters.Text" xml:space="preserve">
<value>列表過濾</value>
</data>
<data name="ChkQuestFilterTEST.Text" xml:space="preserve">
<value>測試任務</value>
</data>
@@ -344,9 +362,6 @@
<data name="ChkQuestFilterHIDDEN.Text" xml:space="preserve">
<value>隱藏的任務</value>
</data>
<data name="GrpQuestFilters.Text" xml:space="preserve">
<value>列表過濾</value>
</data>
<data name="BtnFinishQuest.Text" xml:space="preserve">
<value>完成任務</value>
</data>
@@ -358,8 +373,8 @@
提示:許多任務需要服務端腳本支持
囙此任務可以接,可以完成,但是不一定可以做</value>
</data>
<data name="TPQuest.Text" xml:space="preserve">
<value>任務</value>
<data name="TPArtifact.Text" xml:space="preserve">
<value>聖遺物</value>
</data>
<data name="LblArtifactSet.Text" xml:space="preserve">
<value>套裝</value>
@@ -376,8 +391,8 @@
<data name="LblArtifactStars.Text" xml:space="preserve">
<value>星級</value>
</data>
<data name="TPArtifact.Text" xml:space="preserve">
<value>聖遺物</value>
<data name="TPCustom.Text" xml:space="preserve">
<value>自定義</value>
</data>
<data name="BtnExportCustomCommands.Text" xml:space="preserve">
<value>導出</value>
@@ -391,8 +406,8 @@
<data name="BtnRemoveCustomCommand.Text" xml:space="preserve">
<value>× 刪除</value>
</data>
<data name="TPCustom.Text" xml:space="preserve">
<value>自定義</value>
<data name="TPHome.Text" xml:space="preserve">
<value>主頁</value>
</data>
<data name="BtnOpenTextMap.Text" xml:space="preserve">
<value>文本瀏覽器</value>
@@ -403,7 +418,8 @@
<data name="ChkTopMost.Text" xml:space="preserve">
<value>置頂</value>
</data>
<data name="TPHome.Text" xml:space="preserve">
<value>主頁</value>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="$this.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>Inherit</value>
</data>
</root>

View File

@@ -18,7 +18,6 @@
**/
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text.RegularExpressions;
using System.Windows.Forms;

View File

@@ -134,7 +134,7 @@
<value>80, 21</value>
</data>
<data name="ChkTopMost.Text" xml:space="preserve">
<value>Always on top</value>
<value>TopMost</value>
</data>
<data name="LblResourcesPath.Size" type="System.Drawing.Size, System.Drawing">
<value>294, 17</value>

View File

@@ -0,0 +1,94 @@
/**
* Grasscutter Tools
* Copyright (C) 2022 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.GOOD
{
/// <summary>
/// Artifact data representation
/// Doc: https://frzyc.github.io/genshin-optimizer/#/doc
/// Modified from https://github.com/Andrewthe13th/Inventory_Kamera/blob/master/InventoryKamera/game/Artifact.cs
/// </summary>
public class Artifact
{
/// <summary>
/// e.g. "GladiatorsFinale"
/// </summary>
[JsonProperty("setKey")]
public string SetName { get; set; }
/// <summary>
/// //e.g. "plume"
/// type SlotKey = "flower" | "plume" | "sands" | "goblet" | "circlet"
/// </summary>
[JsonProperty("slotKey")]
public string GearSlot { get; set; }
/// <summary>
/// 1-5 inclusive
/// </summary>
[JsonProperty("rarity")]
public int Rarity { get; set; }
/// <summary>
/// mainStatKey
/// </summary>
[JsonProperty("mainStatKey")]
public string MainStat { get; set; }
/// <summary>
/// 0-20 inclusive
/// </summary>
[JsonProperty("level")]
public int Level { get; set; }
/// <summary>
/// substats
/// </summary>
[JsonProperty("substats")]
public SubStat[] SubStats { get; set; }
/// <summary>
/// where "" means not equipped.
/// </summary>
[JsonProperty("location")]
public string EquippedCharacter { get; set; }
/// <summary>
/// Whether the artifact is locked in game.
/// </summary>
[JsonProperty("lock")]
public bool Lock { get; set; }
public struct SubStat
{
/// <summary>
/// e.g. "critDMG_"
/// </summary>
[JsonProperty("key")]
public string Stat { get; set; }
/// <summary>
/// e.g. 19.4
/// </summary>
[JsonProperty("value")]
public double Value { get; set; }
}
}
}

View File

@@ -0,0 +1,72 @@
/**
* Grasscutter Tools
* Copyright (C) 2022 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.GOOD
{
/// <summary>
/// Character data representation
/// Doc: https://frzyc.github.io/genshin-optimizer/#/doc
/// Modified from https://github.com/Andrewthe13th/Inventory_Kamera/blob/master/InventoryKamera/game/Character.cs
/// </summary>
public class Character
{
/// <summary>
/// e.g. "Rosaria"
/// </summary>
[JsonProperty("key")]
public string Name { get; set; }
/// <summary>
/// 1-90 inclusive
/// </summary>
[JsonProperty("level")]
public int Level { get; set; }
/// <summary>
/// 0-6 inclusive
/// </summary>
[JsonProperty("constellation")]
public int Constellation { get; set; }
/// <summary>
/// 0-6 inclusive. need to disambiguate 80/90 or 80/80
/// </summary>
[JsonProperty("ascension")]
public int Ascension { get; set; }
/// <summary>
/// does not include boost from constellations. 1-15 inclusive
/// </summary>
[JsonProperty("talent")]
public Talents Talents { get; set; }
}
public struct Talents
{
[JsonProperty("auto")]
public int Auto { get; set; }
[JsonProperty("skill")]
public int Skill { get; set; }
[JsonProperty("burst")]
public int Burst { get; set; }
}
}

View File

@@ -0,0 +1,63 @@
/**
* Grasscutter Tools
* Copyright (C) 2022 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.Collections.Generic;
using Newtonsoft.Json;
namespace GrasscutterTools.GOOD
{
/// <summary>
/// Genshin Open Object Description (GOOD)
/// Doc: https://frzyc.github.io/genshin-optimizer/#/doc
/// Modified from https://github.com/Andrewthe13th/Inventory_Kamera/blob/master/InventoryKamera/data/GOOD.cs
///
/// Available for
/// https://frzyc.github.io/genshin-optimizer/
/// https://github.com/Andrewthe13th/Inventory_Kamera
/// https://genshin.aspirine.su/
/// https://seelie.me/
/// https://github.com/daydreaming666/Amenoma
/// https://www.mona-uranai.com/
/// https://genshin.mingyulab.com/
/// https://genshin-center.com/
/// </summary>
public class GOOD
{
[JsonProperty("format")]
public string Format { get; set; }
[JsonProperty("version")]
public int Version { get; set; }
[JsonProperty("source")]
public string Source { get; set; }
[JsonProperty("weapons", DefaultValueHandling = DefaultValueHandling.Ignore)]
public List<Weapon> Weapons { get; set; }
[JsonProperty("artifacts", DefaultValueHandling = DefaultValueHandling.Ignore)]
public List<Artifact> Artifacts { get; set; }
[JsonProperty("characters", DefaultValueHandling = DefaultValueHandling.Ignore)]
public List<Character> Characters { get; set; }
[JsonProperty("materials", DefaultValueHandling = DefaultValueHandling.Ignore)]
public Dictionary<string, int> Materials { get; set; }
}
}

View File

@@ -0,0 +1,108 @@
/**
* Grasscutter Tools
* Copyright (C) 2022 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.Collections.Generic;
using System.Globalization;
using System.Text.RegularExpressions;
using GrasscutterTools.Game;
using GrasscutterTools.Properties;
namespace GrasscutterTools.GOOD
{
public static class GOODData
{
static GOODData()
{
var cultureInfo = CultureInfo.GetCultureInfo("en-US");
var regex = new Regex(@"[\W]", RegexOptions.Compiled);
Dictionary<string, int> ToGOODMap(ItemMap itemMap)
{
var dic = new Dictionary<string, int>(itemMap.Count);
for (int i = 0; i < itemMap.Count; i++)
{
var name = itemMap.Names[i];
var pascalCase = cultureInfo.TextInfo.ToTitleCase(name);
var nameGOOD = regex.Replace(pascalCase, string.Empty);
dic[nameGOOD] = itemMap.Ids[i];
//dic.Add(nameGOOD, itemMap.Ids[i]);
}
return dic;
}
var artifactCats = new ItemMap(Resources.ResourceManager.GetString("ArtifactCat", cultureInfo));
var avatars = new ItemMap(Resources.ResourceManager.GetString("Avatar", cultureInfo));
var weapons = new ItemMap(Resources.ResourceManager.GetString("Weapon", cultureInfo));
ArtifactCats = ToGOODMap(artifactCats);
Avatars = ToGOODMap(avatars);
Weapons = ToGOODMap(weapons);
}
public static Dictionary<string, int> ArtifactCats { get; private set; }
public static Dictionary<string, string> ArtifactSlotMap = new Dictionary<string, string> {
{"goblet", "1"}, {"plume", "2"}, {"circlet", "3"}, {"flower", "4"}, {"sands", "5"}
};
public static Dictionary<string, int> ArtifactMainAttribution { get; } = new Dictionary<string, int>
{
{ "hp" , 10001 },
{ "hp_" , 10002 },
{ "atk" , 10003 },
{ "atk_" , 10004 },
{ "def" , 10005 },
{ "def_" , 10006 },
{ "enerRech_" , 10007 },
{ "eleMas" , 10008 },
{ "critRate_" , 13007 },
{ "critDMG_" , 13008 },
{ "heal_" , 13009 },
{ "pyro_dmg_" , 15008 },
{ "electro_dmg_" , 15009 },
{ "cryo_dmg_" , 15010 },
{ "hydro_dmg_" , 15011 },
{ "anemo_dmg_" , 15012 },
{ "geo_dmg_" , 15013 },
{ "dendro_dmg_" , 15014 },
{ "physical_dmg_", 15015 },
};
public static Dictionary<string, int> ArtifactSubAttribution { get; } = new Dictionary<string, int>
{
{ "hp" , 102 },
{ "hp_" , 103 },
{ "atk" , 105 },
{ "atk_" , 106 },
{ "def" , 108 },
{ "def_" , 109 },
{ "critRate_", 120 },
{ "critDMG_" , 122 },
{ "enerRech_", 123 },
{ "eleMas" , 124 },
};
public static Dictionary<string, int> Avatars { get; private set; }
public static Dictionary<string, int> Weapons { get; private set; }
}
}

View File

@@ -0,0 +1,68 @@
/**
* Grasscutter Tools
* Copyright (C) 2022 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.ComponentModel;
using Newtonsoft.Json;
namespace GrasscutterTools.GOOD
{
/// <summary>
/// Weapon data representation
/// Doc: https://frzyc.github.io/genshin-optimizer/#/doc
/// Modified from https://github.com/Andrewthe13th/Inventory_Kamera/blob/master/InventoryKamera/game/Weapon.cs
/// </summary>
public class Weapon
{
/// <summary>
/// e.g. "CrescentPike"
/// </summary>
[JsonProperty("key")]
public string Name { get; set; }
/// <summary>
/// 1-90 inclusive
/// </summary>
[JsonProperty("level")]
public int Level { get; set; }
/// <summary>
/// 0-6 inclusive. need to disambiguate 80/90 or 80/80
/// </summary>
[JsonProperty("ascension")]
public int AscensionLevel { get; set; }
/// <summary>
/// 1-5 inclusive
/// </summary>
[JsonProperty("refinement")]
public int RefinementLevel { get; set; }
/// <summary>
/// where "" means not equipped.
/// </summary>
[JsonProperty("location")]
[DefaultValue("")]
public string EquippedCharacter { get; set; }
/// <summary>
/// Whether the weapon is locked in game.
/// </summary>
[JsonProperty("lock")]
public bool Lock { get; set; }
}
}

View File

@@ -16,8 +16,6 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
**/
using System.ComponentModel;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

View File

@@ -38,7 +38,7 @@ namespace GrasscutterTools.Game
if (si > 0 && int.TryParse(line.Substring(0, si).Trim(), out int id))
{
var name = line.Substring(si + 1).Trim();
if (!string.IsNullOrEmpty(name))
if (!string.IsNullOrEmpty(name) && name != "null")
{
//IdMap[id] = name;
//NameMap[name] = id;

View File

@@ -46,7 +46,7 @@ namespace GrasscutterTools.Game
ManualTextMap = new Dictionary<string, string>();
while (reader.Read())
{
if (reader.TokenType == JsonToken.PropertyName && (string)reader.Value == "TextMapId")
if (reader.TokenType == JsonToken.PropertyName && ((string)reader.Value == "TextMapId" || (string)reader.Value == "textMapId"))
{
var textMapId = reader.ReadAsString();
reader.Read();

View File

@@ -1,7 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\Resource.Embedder.2.2.0\build\Resource.Embedder.props" Condition="Exists('..\packages\Resource.Embedder.2.2.0\build\Resource.Embedder.props')" />
<Import Project="..\packages\Costura.Fody.5.7.0\build\Costura.Fody.props" Condition="Exists('..\packages\Costura.Fody.5.7.0\build\Costura.Fody.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -40,160 +38,18 @@
<PropertyGroup>
<ApplicationIcon>Resources\IconGrasscutter.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup>
<ApplicationManifest>Properties\app.manifest</ApplicationManifest>
</PropertyGroup>
<PropertyGroup />
<ItemGroup>
<Reference Include="Costura, Version=5.7.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Costura.Fody.5.7.0\lib\netstandard1.0\Costura.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Build.Framework" />
<Reference Include="Microsoft.Build.Utilities.v4.0" />
<Reference Include="Microsoft.Win32.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
<SpecificVersion>False</SpecificVersion>
<HintPath>Resources\Newtonsoft.Json.dll</HintPath>
<EmbedInteropTypes>False</EmbedInteropTypes>
<Private>False</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.AppContext, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.AppContext.4.3.0\lib\net463\System.AppContext.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.ComponentModel.Composition" />
<Reference Include="System.Console, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Console.4.3.0\lib\net46\System.Console.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Core" />
<Reference Include="System.Diagnostics.DiagnosticSource, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Diagnostics.DiagnosticSource.4.3.0\lib\net46\System.Diagnostics.DiagnosticSource.dll</HintPath>
</Reference>
<Reference Include="System.Diagnostics.Tracing, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Diagnostics.Tracing.4.3.0\lib\net462\System.Diagnostics.Tracing.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Globalization.Calendars, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Globalization.Calendars.4.3.0\lib\net46\System.Globalization.Calendars.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.IO, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.4.3.0\lib\net462\System.IO.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.IO.Compression, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.IO.Compression.FileSystem" />
<Reference Include="System.IO.Compression.ZipFile, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.Compression.ZipFile.4.3.0\lib\net46\System.IO.Compression.ZipFile.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.IO.FileSystem, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.IO.FileSystem.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Linq, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Linq.4.3.0\lib\net463\System.Linq.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Linq.Expressions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Linq.Expressions.4.3.0\lib\net463\System.Linq.Expressions.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Net.Http, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Http.4.3.0\lib\net46\System.Net.Http.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Net.Sockets, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Reflection, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Reflection.4.3.0\lib\net462\System.Reflection.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Runtime, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Runtime.Extensions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.Extensions.4.3.0\lib\net462\System.Runtime.Extensions.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Runtime.InteropServices, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.InteropServices.4.3.0\lib\net463\System.Runtime.InteropServices.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Security.Cryptography.Algorithms, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net463\System.Security.Cryptography.Algorithms.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Security.Cryptography.Encoding, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Security.Cryptography.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Security.Cryptography.X509Certificates, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Text.RegularExpressions, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Text.RegularExpressions.4.3.0\lib\net463\System.Text.RegularExpressions.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Windows.Forms.DataVisualization" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="System.Xml.ReaderWriter, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Controls\TextBoxXP.cs">
@@ -233,7 +89,11 @@
<Compile Include="Game\ItemMap.cs" />
<Compile Include="Game\SetStatsCommand.cs" />
<Compile Include="Game\TextMapData.cs" />
<Compile Include="Github\ReleaseAPI.cs" />
<Compile Include="GOOD\GOOD.cs" />
<Compile Include="GOOD\Artifact.cs" />
<Compile Include="GOOD\Character.cs" />
<Compile Include="GOOD\GOODData.cs" />
<Compile Include="GOOD\Weapon.cs" />
<Compile Include="OpenCommand\OpenCommandAPI.cs" />
<Compile Include="MultiLanguage.cs" />
<Compile Include="Program.cs" />
@@ -243,7 +103,9 @@
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
</Compile>
<Compile Include="Utils\ArtifactUtils.cs" />
<Compile Include="Utils\HttpHelper.cs" />
<Compile Include="Utils\ReleaseAPI.cs" />
<EmbeddedResource Include="Forms\FormGachaBannerEditor2.en-us.resx">
<DependentUpon>FormGachaBannerEditor2.cs</DependentUpon>
</EmbeddedResource>
@@ -281,6 +143,7 @@
</EmbeddedResource>
<EmbeddedResource Include="Forms\FormMain.zh-TW.resx">
<DependentUpon>FormMain.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Forms\FormTextMapBrowser.en-US.resx">
<DependentUpon>FormTextMapBrowser.cs</DependentUpon>
@@ -329,8 +192,6 @@
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="packages.config" />
<None Include="Properties\app.manifest" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
@@ -363,6 +224,7 @@
<Content Include="Resources\en-us\Quest.txt" />
<Content Include="Resources\en-us\Scene.txt" />
<Content Include="Resources\en-us\Weapon.txt" />
<None Include="Resources\Newtonsoft.Json.dll" />
<Content Include="Resources\ru-ru\Animal.txt" />
<Content Include="Resources\ru-ru\Artifact.txt" />
<Content Include="Resources\ru-ru\ArtifactCat.txt" />
@@ -419,24 +281,11 @@
<ProductName>Microsoft .NET Framework 4.8 %28x86 和 x64%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Resource.Embedder">
<Version>2.2.0</Version>
</PackageReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Costura.Fody.5.7.0\build\Costura.Fody.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Costura.Fody.5.7.0\build\Costura.Fody.props'))" />
<Error Condition="!Exists('..\packages\Costura.Fody.5.7.0\build\Costura.Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Costura.Fody.5.7.0\build\Costura.Fody.targets'))" />
<Error Condition="!Exists('..\packages\Fody.6.6.1\build\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Fody.6.6.1\build\Fody.targets'))" />
<Error Condition="!Exists('..\packages\Resource.Embedder.2.2.0\build\Resource.Embedder.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Resource.Embedder.2.2.0\build\Resource.Embedder.props'))" />
<Error Condition="!Exists('..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets'))" />
</Target>
<Import Project="..\packages\Costura.Fody.5.7.0\build\Costura.Fody.targets" Condition="Exists('..\packages\Costura.Fody.5.7.0\build\Costura.Fody.targets')" />
<Import Project="..\packages\Fody.6.6.1\build\Fody.targets" Condition="Exists('..\packages\Fody.6.6.1\build\Fody.targets')" />
<Import Project="..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets" Condition="Exists('..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets')" />
</Project>

View File

@@ -17,6 +17,8 @@
*
**/
using System;
using System.Globalization;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Windows.Forms;
@@ -27,6 +29,33 @@ namespace GrasscutterTools
{
internal static class Program
{
static Program()
{
AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly;
}
private static Assembly OnResolveAssembly(object sender, ResolveEventArgs args)
{
//var executingAssembly = Assembly.GetExecutingAssembly();
//var assemblyName = new AssemblyName(args.Name);
//var path = assemblyName.Name + ".dll";
//if (assemblyName.CultureInfo.Equals(CultureInfo.InvariantCulture) == false)
// path = $@"{assemblyName.CultureInfo}\{path}";
//using (var stream = executingAssembly.GetManifestResourceStream(path))
//{
// if (stream == null) return null;
// var assemblyRawBytes = new byte[stream.Length];
// stream.Read(assemblyRawBytes, 0, assemblyRawBytes.Length);
// return Assembly.Load(assemblyRawBytes);
//}
// 手工加载嵌入的dll文件
if (new AssemblyName(args.Name).Name == "Newtonsoft.Json")
return Assembly.Load(Resources.Newtonsoft_Json);
return null;
}
/// <summary>
/// 应用程序的主入口点。
/// </summary>

View File

@@ -5,12 +5,12 @@ using System.Runtime.InteropServices;
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("GrasscutterTools")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyDescription("Grasscutter Command Generator")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyCompany("jie65535")]
[assembly: AssemblyProduct("GrasscutterTools")]
[assembly: AssemblyCopyright("Copyright © jie65535 2022")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyTrademark("jie65535")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
@@ -31,5 +31,5 @@ using System.Runtime.InteropServices;
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.5.3")]
[assembly: AssemblyFileVersion("1.0.0")]
[assembly: AssemblyVersion("1.6.2")]
[assembly: AssemblyFileVersion("1.6.2")]

View File

@@ -67,25 +67,6 @@ namespace GrasscutterTools.Properties {
///28010104:将军蟹
///28010105:薄红蟹
///28010106:螃蟹
///28020101: 雪狐
///28020102: 红狐
///28020103: 送礼雪狐
///28020104: 送大礼雪狐
///28020105: 雪狐
///28020106: 红狐
///28020201: 松鼠
///28030101: 蓝翎鹭
///28030102: 菫鹮
///28030201: 茶羽鹰
///28030202: 棕翎鹰
///28030203: 石鸢
///28030204: 白练鹰
///28050101: 风晶蝶
///28050102: 岩晶蝶
///28050103: 冰晶蝶
///28050104: 雷晶蝶
///28050105: 珊瑚蝶
///28050301: 吉光虫
///28010201:蓝角蜥
///28010202:红角蜥
///28010203:绿角蜥
@@ -95,7 +76,28 @@ namespace GrasscutterTools.Properties {
///28010207:嗜髓蜥
///28010301:青蛙
///28010302:泥蛙
///2801030 [字符串的其余部分被截断]&quot;; 的本地化字符串。
///28010303:蓝蛙
///28010401:藤纹陆鳗鳗
///28010402:深海鳗鳗
///28010403:赤鳍陆鳗鳗
///28020101:雪狐
///28020102:红狐
///28020103:送礼雪狐
///28020104:送大礼雪狐
///28020105:雪狐
///28020106:红狐
///28020201:松鼠
///28020301:野林猪
///28020302:小野林猪
///28020303:雪猪
///28020304:「大雪猪王」
///28020305:冰冻雪猪
///28020306:雪猪
///28020307:野林猪
///28020308:冰冻雪猪
///28020309:「大雪猪王」
///28020401:北地犬
/// [字符串的其余部分被截断]&quot;; 的本地化字符串。
/// </summary>
internal static string Animal {
get {
@@ -104,46 +106,46 @@ namespace GrasscutterTools.Properties {
}
/// <summary>
/// 查找类似 51110: 异国之盏
///51111: 异国之盏
///51112: 异国之盏
///51113: 异国之盏
///51114: 异国之盏
///51120: 归乡之羽
///51121: 归乡之羽
///51122: 归乡之羽
///51123: 归乡之羽
///51124: 归乡之羽
///51130: 感别之冠
///51131: 感别之冠
///51132: 感别之冠
///51133: 感别之冠
///51134: 感别之
///51140: 故人之心
///51141: 故人之心
///51142: 故人之心
///51143: 故人之心
///51144: 故人之心
///51150: 逐光之石
///51151: 逐光之石
///51152: 逐光之石
///51153: 逐光之石
///51154: 逐光之石
///51210: 异国之盏
///51211: 异国之盏
///51212: 异国之盏
///51213: 异国之盏
///51214: 异国之盏
///51220: 归乡之羽
///51221: 归乡之羽
///51222: 归乡之
///51223: 归乡之
///51224: 归乡之羽
///51230: 感别之冠
///51231: 感别之冠
///51232: 感别之冠
///51233: 感别之冠
///51234 [字符串的其余部分被截断]&quot;; 的本地化字符串。
/// 查找类似 20412:迷误者之灯
///20413:迷误者之灯
///20422:翠蔓的智者
///20423:翠蔓的智者
///20432:月桂的宝冠
///20433:月桂的宝冠
///20442:迷宫的游人
///20443:迷宫的游人
///20452:贤智的定期
///20453:贤智的定期
///20513:迷误者之灯
///20514:迷误者之灯
///20523:翠蔓的智者
///20524:翠蔓的智者
///20533:月桂的宝
///20534:月桂的宝冠
///20543:迷宫的游人
///20544:迷宫的游人
///20553:贤智的定期
///20554:贤智的定期
///21412:如蜜的终宴
///21413:如蜜的终宴
///21422:裁断的翎羽
///21423:裁断的翎羽
///21432:沙王的投影
///21433:沙王的投影
///21442:梦中的铁花
///21443:梦中的铁花
///21452:沉金的岁月
///21453:沉金的岁月
///21513:如蜜的终宴
///21514:如蜜的终宴
///21523:裁断的翎
///21524:裁断的翎
///21533:沙王的投影
///21534:沙王的投影
///21543:梦中的铁花
///21544:梦中的铁花
///21553:沉金的岁月
///21554 [字符串的其余部分被截断]&quot;; 的本地化字符串。
/// </summary>
internal static string Artifact {
get {
@@ -152,7 +154,9 @@ namespace GrasscutterTools.Properties {
}
/// <summary>
/// 查找类似 51: 行者之心
/// 查找类似 20:深林的记忆
///21:饰金之梦
///51:行者之心
///52:勇士之心
///53:守护之心
///54:奇迹
@@ -302,40 +306,60 @@ namespace GrasscutterTools.Properties {
}
/// <summary>
/// 查找类似 10000001 : 凯特
///10000002 : 神里绫华
///10000003 : 琴
///10000005 : 旅行者
///10000006 : 丽莎
///10000007 : 旅行者
///10000014 : 芭芭拉
///10000015 : 凯亚
///10000016 : 迪卢克
///10000020 : 雷泽
///10000021 : 安柏
///10000022 : 温迪
///10000023 : 香菱
///10000024 : 北斗
///10000025 : 行秋
///10000026 : 魈
///10000027 : 凝光
///10000029 : 可莉
///10000030 : 钟离
///10000031 : 菲谢尔
///10000032 : 班尼特
///10000033 : 达达利亚
///10000034 : 诺艾尔
///10000035 : 七七
///10000036 : 重云
///10000037 : 甘雨
///10000038 : 阿贝多
///10000039 : 迪奥
///10000041 : 莫娜
///10000042 : 刻晴
///10000043 : 砂糖
///10000044 : 辛焱
///10000045 : 罗莎莉亚
///1000 [字符串的其余部分被截断]&quot;; 的本地化字符串。
/// 查找类似 1002:神里绫华
///1003:琴
///1005:空
///1006:丽莎
///1007:荧
///1014:芭芭拉
///1015:凯亚
///1016:迪卢克
///1020:雷泽
///1021:安柏
///1022:温迪
///1023:香菱
///1024:北斗
///1025:行秋
///1026:魈
///1027:凝光
///1029:可莉
///1030:钟离
///1031:菲谢尔
///1032:班尼特
///1033:达达利亚
///1034:诺艾尔
///1035:七七
///1036:重云
///1037:甘雨
///1038:阿贝多
///1039:迪奥娜
///1041:莫
///1042:刻晴
///1043:砂糖
///1044:辛焱
///1045:罗莎莉亚
///1046:胡桃
///1047:枫原万叶
///1048:烟绯
///1049:宵宫
///1050:托马
///1051:优菈
///1052:雷电将军
///1053:早柚
///1054:珊瑚宫心海
///1055:五郎
///1056:九条裟罗
///1057:荒泷一斗
///1058:八重神子
///1059:鹿野院平藏
///1060:夜兰
///1062:埃洛伊
///1063:申鹤
///1064:云堇
///1065:久岐忍
///1066:神里绫人
///1067:柯莱
///1068:多 [字符串的其余部分被截断]&quot;; 的本地化字符串。
/// </summary>
internal static string Avatar {
get {
@@ -484,21 +508,25 @@ namespace GrasscutterTools.Properties {
/// <summary>
/// 查找类似 无敌
////prop godmode on
////prop god on
///无限体力
////prop nostamina on
////prop ns on
///无限能量
////prop unlimitedenergy on
////prop ue on
///升到60级
////give 102 x1880200
///设置世界等级
////prop worldlevel 8
////prop wl 8
///点亮地图
////prop unlockmap 1
///一键解锁深渊
////prop abyss 12
////prop ut 12
///设置纪行等级
////prop bp 50
///设置好感等级
////setfetterlevel 10
///奶
////heal
////h
///自杀
////kill 0
///全队充能
@@ -513,8 +541,8 @@ namespace GrasscutterTools.Properties {
////give 224 x10000
///十万原石
////give 201 x100000
///十万摩拉
////give 202 x100000
///一亿摩拉
////give 202 x100000000
///重载配置
////reload
///重登
@@ -524,11 +552,9 @@ namespace GrasscutterTools.Properties {
///清空全部角色命之座(需重登)
////resetconst all
///清空背包
////clear all
////clear all lv90 r5 5*
///清空武器
////clear wp
///清空圣遗物
////clea [字符串的其余部分被截断]&quot;; 的本地化字符串。
//// [字符串的其余部分被截断]&quot;; 的本地化字符串。
/// </summary>
internal static string CustomCommands {
get {
@@ -580,7 +606,11 @@ namespace GrasscutterTools.Properties {
///061:鬼门斗宴
///065:出尘入世
///071:华紫樱绯
///076: 苍流踏花 的本地化字符串。
///076:苍流踏花
///081:素霓伣天
///091:提纳里池(非原名)
///092:钟离池(非原名)
///093:猎人之径池(非原名) 的本地化字符串。
/// </summary>
internal static string GachaBennerPrefab {
get {
@@ -588,6 +618,33 @@ namespace GrasscutterTools.Properties {
}
}
/// <summary>
/// 查找类似 导入成功! 的本地化字符串。
/// </summary>
internal static string GOODImportSuccess {
get {
return ResourceManager.GetString("GOODImportSuccess", resourceCulture);
}
}
/// <summary>
/// 查找类似 是否导入 的本地化字符串。
/// </summary>
internal static string GOODImportText {
get {
return ResourceManager.GetString("GOODImportText", resourceCulture);
}
}
/// <summary>
/// 查找类似 导入GOOD档案 的本地化字符串。
/// </summary>
internal static string GOODImportTitle {
get {
return ResourceManager.GetString("GOODImportTitle", resourceCulture);
}
}
/// <summary>
/// 查找类似 帮助 的本地化字符串。
/// </summary>
@@ -640,8 +697,6 @@ namespace GrasscutterTools.Properties {
/// <summary>
/// 查找类似 101:角色经验
///102:冒险阅历
///103 : 星尘
///104 : 星辉
///105:好感经验
///106:原粹树脂
///107:传说钥匙
@@ -678,9 +733,18 @@ namespace GrasscutterTools.Properties {
///138:完璧玉符
///139:降魔玉符
///140:幽蕴砺石
///141:花簇簇的漂流物
///142:战策碎珀
///143:巧思手记
///144:随想草稿
///145:古铁钱
///201:原石
///2 [字符串的其余部分被截断]&quot;; 的本地化字符串。
///202:摩拉
///203:创世结晶
///204:洞天宝钱
///314:声望经验·稻妻
///315:声望经验·蒙德
///316:声 [字符串的其余部分被截断]&quot;; 的本地化字符串。
/// </summary>
internal static string Item {
get {
@@ -689,36 +753,38 @@ namespace GrasscutterTools.Properties {
}
/// <summary>
/// 查找类似 21010101: 丘丘人
///21020101: 木盾丘丘暴徒
///21020201: 火斧丘丘暴徒
///21020202: 火斧丘丘暴徒
///21020301: 岩盾丘丘暴徒
///21020401: 丘丘霜铠王
///21020501: 丘丘岩盔王
///21020601: 冰盾丘丘暴徒
///21020701: 雷斧丘丘暴徒
///21020703: 雷斧丘丘暴徒
///21020801: 丘丘雷兜王
///20010101: 草史莱姆
/// 查找类似 20010101:草史莱姆
///20010201:大型草史莱姆
///20010202:大型草史莱姆
///20010301:风史莱姆
///20010302:风史莱姆
///20010401:大型风史莱姆
///20010402:大型风史莱姆
///20010403:大型风史莱姆
///29010101: 裂空的魔龙
///29010102: 裂空的魔龙
///29010103: 裂空的魔龙
///29010104: 裂空的魔龙
///29020101: 北风的王狼,奔狼的领主
///29020102: 北风的王狼,奔狼的领主
///29030103: 「公子」
///29030106: 「公子」
///29040101: 若陀龙王
///29040102: 若陀龙王
///29040103: 若陀龙王
///29040104: 若陀龙王
///290401 [字符串的其余部分被截断]&quot;; 的本地化字符串。
///20010501:雷史莱姆
///20010502:雷史莱姆
///20010601:大型雷史莱姆
///20010602:大型雷史莱姆
///20010604:大型雷史莱姆
///20010701:变异雷史莱姆
///20010702:变异雷史莱姆
///20010703:变异雷史莱姆
///20010801:冰史莱姆
///20010802:冰史莱姆
///20010803:冰史莱姆
///20010901:大型冰史莱姆
///20010902:大型冰史莱姆
///20010903:大型冰史莱姆
///20010904:大型冰史莱姆
///20011001:水史莱姆
///20011002:水史莱姆
///20011101:大型水史莱姆
///20011102:大型水史莱姆
///20011103:大型水史莱姆
///20011201:火史莱姆
///20011202:火史莱姆
///20011203:火史莱姆
///20011301:大型 [字符串的其余部分被截断]&quot;; 的本地化字符串。
/// </summary>
internal static string Monster {
get {
@@ -726,6 +792,16 @@ namespace GrasscutterTools.Properties {
}
}
/// <summary>
/// 查找 System.Byte[] 类型的本地化资源。
/// </summary>
internal static byte[] Newtonsoft_Json {
get {
object obj = ResourceManager.GetObject("Newtonsoft_Json", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// 查找类似 版本名:{0}
///更新时间:{1}
@@ -793,33 +869,29 @@ namespace GrasscutterTools.Properties {
///player.**
///server.*
///server.**
///player.changescene
///permission
///player.clearinv
///player.clearinv.others
///player.enterdungeon
///player.enterdungeon.others
///player.give
///player.giveall
///player.giveart
///player.givechar
///player.godmode
///player.give.others
///player.heal
///player.heal.others
///player.killcharacter
///player.killcharacter.others
///player.quest
///player.quest.others
///player.resetconstellation
///player.resetconstellation.others
///player.setfetterlevel
///player.setfetterlevel.others
///player.setprop
///player.setprop.others
///player.setstats
///player.setstats.others
///player.settalent
///player.setworldlevel
///player.teleport
///player.tpall
///player.weather
///server.broadcast
///server.coop
///server.drop
///server.kick
///server.killall
///server.reload
///server.resetshop
///server.sendmail
///server.sendmessage
///p [字符串的其余部分被截断]&quot;; 的本地化字符串。
/// </summary>
internal static string Permissions {
get {
@@ -837,27 +909,20 @@ namespace GrasscutterTools.Properties {
}
/// <summary>
/// <summary>
/// 查找类似 30302 : 女神像解锁$HIDDEN -
///30303 : 女神像解锁$HIDDEN -
///30304 : 女神像解锁$HIDDEN -
///30305 : 女神像解锁$HIDDEN -
///30306 : 女神像解锁$HIDDEN -
///30307 : 女神像解锁$HIDDEN -
///30308 : 女神像解锁$HIDDEN -
///30309 : 女神像解锁$HIDDEN -
///30310 : 女神像解锁$HIDDEN -
///30311 : 女神像解锁$HIDDEN -
///30312 : 女神像解锁$HIDDEN -
///30313 : 女神像解锁$HIDDEN -
///30314 : 女神像解锁$HIDDEN -
///30315 : 女神像解锁$HIDDEN -
///30316 : 女神像解锁$HIDDEN -
///30317 : 女神像解锁$HIDDEN -
///30600 : 昔日的风 - 在庙宇门口跟安柏见面
///30601 : 昔日的风 - 与安柏对话
///30602 : 昔日的风 - 进入庙宇
///30603 : 昔日的风 - 探索庙宇深处
/// 查找类似 30302:女神像解锁$HIDDEN - [N/A] 362713143
///30303:女神像解锁$HIDDEN - [N/A] 715511863
///30304:女神像解锁$HIDDEN - [N/A] 163018255
///30305:女神像解锁$HIDDEN - [N/A] 3694648119
///30306:女神像解锁$HIDDEN - [N/A] 3223799591
///30307:女神像解锁$HIDDEN - [N/A] 1232757671
///30308:女神像解锁$HIDDEN - [N/A] 3056513767
///30309:女神像解锁$HIDDEN - [N/A] 2426653367
///30310:女神像解锁$HIDDEN - [N/A] 2003131071
///30311:女神像解锁$HIDDEN - [N/A] 105277231
///30312:女神像解锁$HIDDEN - [N/A] 3391806215
///30313:女神像解锁$HIDDEN - [N/A] 1357500887
///30314:女神像解锁$HIDDEN - [N/A] 3054344935
///30315:女神像 [字符串的其余部分被截断]&quot;; 的本地化字符串。
/// </summary>
internal static string Quest {
get {
@@ -884,38 +949,34 @@ namespace GrasscutterTools.Properties {
}
/// <summary>
/// <summary>
/// 查找类似 1 : 提瓦特
/// 查找类似 1: BigWorld_LevelStreaming
///2: BigWorld_LevelStreaming
///3: 提瓦特
///3 : 提瓦特
///4: 金苹果群岛(1.6)
///5: 渊下宫
///6: 层岩巨渊·地下矿区
///7: 三界路飨祭
///7 : 三界路飨祭
///2001 : 罗浮洞
///2002 : 翠黛峰
///2003 : 清琼岛
///2004 : 绘绮庭
///2201 : 尘歌壶室内_蒙德
///2202 : 尘歌壶室内_璃月
///2203 : 尘歌壶室内_稻妻
///20008: 深入狼之殿
///20008: 丘丘人大本营(test)
///20008: 丘丘人巢穴(test)
///20007: 小岩洞据点(test)
///20007: 小岩洞据点(test)
///20007: 小岩洞秘境(test)
///20006: 遗迹遇险点(test)
///20006: 丘丘人小据点(test)
///20006: 丘丘人大据点(test)
///1006: 密林、废墟与龙之泪
///1017: 壶中天
///1019: 洞天云海地城玩法测试(test)
///1011: 角色战斗测试(test)
///9: 金苹果群岛(2.8)
///1001: 移动平台性能测试(test)
///1001: 移动平台性能测试(test)
///50003: 战斗性能测试(test)
///50004: 电桩电源白盒(test)
///1002: ClimbTest2
///1003: TheBigWorld
///1004: Knight_Inside_Test
///1005: ChurchSteal
///1006: 密林、废墟与龙之泪
///1008: ChurchLobby
///1009: AngelShare
///1011: 角色战斗测试(test)
///1013: SneakAdvancedTest
///1015: 飞翔是勇气的奖励
///1016: 飞翔是勇气的奖励
///1017: 壶中天
///1018: Chateau
///1019: 洞天云海地城玩法测试(test)
///1023: Level_Yurenzhong
///1024: 黑夜循环地城(test)
///1030: TestIntercept_LiYue
///1031: 爬塔丘丘人模板(test)
///1032: 云海白 [字符串的其余部分被截断]&quot;; 的本地化字符串。
/// </summary>
internal static string Scene {
get {
@@ -1000,11 +1061,17 @@ namespace GrasscutterTools.Properties {
///11413:腐殖之剑
///11414:天目影打刀
///11415:辰砂之纺锤
///11416:笼钓瓶一心
///11419:「一心传」名刀
///11420:「一心传」名刀
///11421:「一心传」名刀
///11501:风鹰剑
///11502:天空之刃
///11503:苍古自由之誓
///11504:斫峰之刃
///11505:磐岩结绿
///11506:磐岩结绿
///11507:凭虚
///11509:雾切之回光
///11510:波乱月白经津
///12101:训练大剑
@@ -1014,7 +1081,7 @@ namespace GrasscutterTools.Properties {
///12303:白铁大剑
///12304:石英大剑
///12305:以理服人
///12305 : 以理服人
///12306: [字符串的其余部分被截断]&quot;; 的本地化字符串。
/// </summary>
internal static string Weapon {
get {

View File

@@ -255,4 +255,14 @@ Do you want to check for updates? Selecting No will no longer remind you of this
<data name="WeaponColor" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\WeaponColor.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="GOODImportText" xml:space="preserve">
<value>Do you wish to import </value>
</data>
<data name="GOODImportTitle" xml:space="preserve">
<value>Import GOOD dump file</value>
</data>
<data name="GOODImportSuccess" xml:space="preserve">
<value>Import success!</value>
</data>
</root>

View File

@@ -184,6 +184,9 @@
<data name="GachaBennerPrefab" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\zh-cn\GachaBennerPrefab.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="SettingSaveError" xml:space="preserve">
<value>保存设置时异常:</value>
</data>
<data name="Help" xml:space="preserve">
<value>帮助</value>
</data>
@@ -243,9 +246,6 @@
<data name="SettingLoadError" xml:space="preserve">
<value>加载设置时异常:</value>
</data>
<data name="SettingSaveError" xml:space="preserve">
<value>保存设置时异常:</value>
</data>
<data name="Tips" xml:space="preserve">
<value>提示</value>
</data>
@@ -264,4 +264,16 @@
<data name="WeaponColor" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\WeaponColor.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="GOODImportText" xml:space="preserve">
<value>是否导入 </value>
</data>
<data name="GOODImportTitle" xml:space="preserve">
<value>导入GOOD档案</value>
</data>
<data name="GOODImportSuccess" xml:space="preserve">
<value>导入成功!</value>
</data>
<data name="Newtonsoft_Json" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Newtonsoft.Json.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

View File

@@ -252,4 +252,13 @@
<data name="WeaponColor" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\WeaponColor.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="GOODImportText" xml:space="preserve">
<value>是否導入 </value>
</data>
<data name="GOODImportTitle" xml:space="preserve">
<value>導入GOOD檔案</value>
</data>
<data name="GOODImportSuccess" xml:space="preserve">
<value>導入成功!</value>
</data>
</root>

View File

@@ -1,73 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- UAC 清单选项
如果想要更改 Windows 用户帐户控制级别,请使用
以下节点之一替换 requestedExecutionLevel 节点。
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
指定 requestedExecutionLevel 元素将禁用文件和注册表虚拟化。
如果你的应用程序需要此虚拟化来实现向后兼容性,则移除此
元素。
-->
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
<applicationRequestMinimum>
<defaultAssemblyRequest permissionSetReference="Custom" />
<PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true" ID="Custom" SameSite="site" />
</applicationRequestMinimum>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- 设计此应用程序与其一起工作且已针对此应用程序进行测试的
Windows 版本的列表。取消评论适当的元素,
Windows 将自动选择最兼容的环境。 -->
<!-- Windows Vista -->
<!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
<!-- Windows 7 -->
<!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
<!-- Windows 8 -->
<!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
<!-- Windows 8.1 -->
<!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
<!-- 指示该应用程序可感知 DPI 且 Windows 在 DPI 较高时将不会对其进行
自动缩放。Windows Presentation Foundation (WPF)应用程序自动感知 DPI无需
选择加入。选择加入此设置的 Windows 窗体应用程序(面向 .NET Framework 4.6)还应
在其 app.config 中将 "EnableWindowsFormsHighDpiAutoResizing" 设置设置为 "true"。
将应用程序设为感知长路径。请参阅 https://docs.microsoft.com/windows/win32/fileio/maximum-file-path-limitation -->
<!--
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
</windowsSettings>
</application>
-->
<!-- 启用 Windows 公共控件和对话框的主题(Windows XP 和更高版本) -->
<!--
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
-->
</assembly>

Binary file not shown.

View File

@@ -142,3 +142,4 @@
15507:yellow
15508:yellow
15509:yellow
15511:yellow

View File

@@ -1,4 +1,44 @@
51110: Goblet of the Sojourner
20412:Lamp of the Lost
20413:Lamp of the Lost
20422:Scholar of Vines
20423:Scholar of Vines
20432:Laurel Coronet
20433:Laurel Coronet
20442:Labyrinth Wayfarer
20443:Labyrinth Wayfarer
20452:A Time of Insight
20453:A Time of Insight
20513:Lamp of the Lost
20514:Lamp of the Lost
20523:Scholar of Vines
20524:Scholar of Vines
20533:Laurel Coronet
20534:Laurel Coronet
20543:Labyrinth Wayfarer
20544:Labyrinth Wayfarer
20553:A Time of Insight
20554:A Time of Insight
21412:Honeyed Final Feast
21413:Honeyed Final Feast
21422:Feather of Judgment
21423:Feather of Judgment
21432:Shadow of the Sand King
21433:Shadow of the Sand King
21442:Dreaming Steelbloom
21443:Dreaming Steelbloom
21452:The Sunken Years
21453:The Sunken Years
21513:Honeyed Final Feast
21514:Honeyed Final Feast
21523:Feather of Judgment
21524:Feather of Judgment
21533:Shadow of the Sand King
21534:Shadow of the Sand King
21543:Dreaming Steelbloom
21544:Dreaming Steelbloom
21553:The Sunken Years
21554:The Sunken Years
51110:Goblet of the Sojourner
51111:Goblet of the Sojourner
51112:Goblet of the Sojourner
51113:Goblet of the Sojourner

View File

@@ -1,4 +1,6 @@
51: Resolution of Sojourner
20:Deepwood Memories
21:Gilded Dreams
51:Resolution of Sojourner
52:Brave Heart
53:Defender's Will
54:Tiny Miracle

View File

@@ -50,3 +50,6 @@
1064:Yun Jin
1065:Kuki Shinobu
1066:Kamisato Ayato
1067:Collei
1068:Dori
1069:Tighnari

View File

@@ -8,6 +8,8 @@ Level up to 60
/give 102 x1880200
Set World Level
/prop wl 8
Unlock Map
/prop unlockmap 1
Unlock The Tower
/prop ut 12
Set BattlePass Level

View File

@@ -34,3 +34,6 @@
071:Everbloom Violet
076:Azure Excursion
081:Discerner of Enigmas
091:Tighnari banner (Non original name)
092:Zhongli banner (Non original name)
093:Hunter's Path banner (Non original name)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -149,3 +149,4 @@
15507:Polar Star
15508:Aqua Simulacra
15509:Thundering Pulse
15511:Hunter's Path

View File

@@ -1,3 +1,43 @@
20412:Лампа заблудших
20413:Лампа заблудших
20422:Мудрец лозы
20423:Мудрец лозы
20432:Лавровый венец
20433:Лавровый венец
20442:Странник лабиринта
20443:Странник лабиринта
20452:Час осмысления
20453:Час осмысления
20513:Лампа заблудших
20514:Лампа заблудших
20523:Мудрец лозы
20524:Мудрец лозы
20533:Лавровый венец
20534:Лавровый венец
20543:Странник лабиринта
20544:Странник лабиринта
20553:Час осмысления
20554:Час осмысления
21412:Последний медовый пир
21413:Последний медовый пир
21422:Перо суждения
21423:Перо суждения
21432:Тень Короля песков
21433:Тень Короля песков
21442:Сон железного цветка
21443:Сон железного цветка
21452:Золотые годы
21453:Золотые годы
21513:Последний медовый пир
21514:Последний медовый пир
21523:Перо суждения
21524:Перо суждения
21533:Тень Короля песков
21534:Тень Короля песков
21543:Сон железного цветка
21544:Сон железного цветка
21553:Золотые годы
21554:Золотые годы
51110:Кубок временщика
51111:Кубок временщика
51112:Кубок временщика

View File

@@ -1,4 +1,6 @@
51 Решимость временщика
20:Deepwood Memories
21:Gilded Dreams
51:Решимость временщика
52:Душа храбреца
53:Воля защитника
54:Маленькое чудо

View File

@@ -50,3 +50,6 @@
1064:Юнь Цзинь
1065:Куки Синобу
1066:Камисато Аято
1067:Коллеи
1068:Дори
1069:Тигнари

View File

@@ -8,6 +8,8 @@
/give 102 x1880200
Уровень мира
/prop wl 8
Разгадка карту
/prop unlockmap 1
Разгадка бездны
/prop ut 12
Уровень Боевой пропуск

View File

@@ -34,3 +34,6 @@
071:Вечноцветущий пурпур
076:Лазурный поход
081:Белая радуга
091:Tighnari banner (Non original name)
092:Zhongli banner (Non original name)
093:Hunter's Path banner (Non original name)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -149,3 +149,4 @@
15507:Полярная звезда
15508:Аква симулякрум
15509:Громовой пульс
15511:Охотничья тропа

View File

@@ -227,3 +227,22 @@
28250104:尘歌壶:雷晶蝶
28250105:尘歌壶:珊瑚蝶
28250301:尘歌壶:吉光虫
28020313:大蕈猪?
28030313:暝彩鸟
28020314:蕈猪
28060101:棘冠鳄
28060201:长鬓虎
28060601:牦牦驮兽
28040801:真果角鲀
28040802:沉波蜜桃
28040803:吹沙角鲀
28040804:暮云角鲀
28040901:青金斧枪鱼
28040902:翡玉斧枪鱼
28050106:草晶蝶
28010304:丛林树蛙
28010208:赤尾蜥
31010101:友军 打手丘丘人
31020101:友军 木盾丘丘暴徒
31020201:友军 火斧丘丘暴徒
35210101:友军 娜菈

View File

@@ -1,4 +1,44 @@
51110: 异国之盏
20412:迷误者之灯
20413:迷误者之灯
20422:翠蔓的智者
20423:翠蔓的智者
20432:月桂的宝冠
20433:月桂的宝冠
20442:迷宫的游人
20443:迷宫的游人
20452:贤智的定期
20453:贤智的定期
20513:迷误者之灯
20514:迷误者之灯
20523:翠蔓的智者
20524:翠蔓的智者
20533:月桂的宝冠
20534:月桂的宝冠
20543:迷宫的游人
20544:迷宫的游人
20553:贤智的定期
20554:贤智的定期
21412:如蜜的终宴
21413:如蜜的终宴
21422:裁断的翎羽
21423:裁断的翎羽
21432:沙王的投影
21433:沙王的投影
21442:梦中的铁花
21443:梦中的铁花
21452:沉金的岁月
21453:沉金的岁月
21513:如蜜的终宴
21514:如蜜的终宴
21523:裁断的翎羽
21524:裁断的翎羽
21533:沙王的投影
21534:沙王的投影
21543:梦中的铁花
21544:梦中的铁花
21553:沉金的岁月
21554:沉金的岁月
51110:异国之盏
51111:异国之盏
51112:异国之盏
51113:异国之盏

View File

@@ -1,4 +1,6 @@
51: 行者之心
20:深林的记忆
21:饰金之梦
51:行者之心
52:勇士之心
53:守护之心
54:奇迹

View File

@@ -50,3 +50,6 @@
1064:云堇
1065:久岐忍
1066:神里绫人
1067:柯莱
1068:多莉
1069:提纳里

View File

@@ -8,6 +8,8 @@
/give 102 x1880200
设置世界等级
/prop wl 8
点亮地图
/prop unlockmap 1
一键解锁深渊
/prop ut 12
设置纪行等级

View File

@@ -34,3 +34,6 @@
071:华紫樱绯
076:苍流踏花
081:素霓伣天
091:提纳里池(非原名)
092:钟离池(非原名)
093:猎人之径池(非原名)

File diff suppressed because it is too large Load Diff

View File

@@ -338,3 +338,25 @@
29060201:祸津御建鸣神命
29060202:祸津御建鸣神命
29060203:祸津御建鸣神命
20060701:草飘浮灵
24030201:遗迹龙兽·地巡
24030101:遗迹龙兽·空巡
25210101:镀金旅团·阵前斧手
25210201:镀金旅团·机弩兵
25210301:镀金旅团·鸦喙戟手
25210401:镀金旅团·破阵者
25210501:镀金旅团·刀舞者
25310101:镀金旅团·沙中净水
25310201:镀金旅团·炽阳凝冰
25310301:镀金旅团·白日鸣雷
26020301:掣电树
26090201:浮游草蕈兽
26090201:旋转雷蕈兽
26090401:旋转冰蕈兽
26090501:伸缩火蕈兽
26090701:伸缩风蕈兽
26090801:伸缩岩蕈兽
26090901:陆行水本真蕈
26120101:有翼草本真蕈
26120201:有翼冰本真蕈
26110101:翠翎恐蕈

File diff suppressed because it is too large Load Diff

View File

@@ -149,3 +149,4 @@
15507:冬极白星
15508:若水
15509:飞雷之弦振
15511:猎人之径

View File

@@ -227,3 +227,22 @@
28250104: 塵歌壺:雷晶蝶
28250105: 塵歌壺:珊瑚蝶
28250301: 塵歌壺:吉光蟲
28020313: 大蕈猪?
28030313: 暝彩鸟
28020314: 蕈猪
28060101: 棘冠鳄
28060201: 长鬓虎
28060601: 牦牦驮兽
28040801: 真果角鲀
28040802: 沉波蜜桃
28040803: 吹沙角鲀
28040804: 暮云角鲀
28040901: 青金斧枪鱼
28040902: 翡玉斧枪鱼
28050106: 草晶蝶
28010304: 丛林树蛙
28010208: 赤尾蜥
31010101: 友军 打手丘丘人
31020101: 友军 木盾丘丘暴徒
31020201: 友军 火斧丘丘暴徒
35210101: 友军 娜菈

View File

@@ -1,3 +1,43 @@
20412:迷誤者之燈
20413:迷誤者之燈
20422:翠蔓的智者
20423:翠蔓的智者
20432:月桂的寶冠
20433:月桂的寶冠
20442:迷宮的遊人
20443:迷宮的遊人
20452:賢智的定期
20453:賢智的定期
20513:迷誤者之燈
20514:迷誤者之燈
20523:翠蔓的智者
20524:翠蔓的智者
20533:月桂的寶冠
20534:月桂的寶冠
20543:迷宮的遊人
20544:迷宮的遊人
20553:賢智的定期
20554:賢智的定期
21412:如蜜的終宴
21413:如蜜的終宴
21422:裁斷的翎羽
21423:裁斷的翎羽
21432:沙王的投影
21433:沙王的投影
21442:夢中的鐵花
21443:夢中的鐵花
21452:沉金的歲月
21453:沉金的歲月
21513:如蜜的終宴
21514:如蜜的終宴
21523:裁斷的翎羽
21524:裁斷的翎羽
21533:沙王的投影
21534:沙王的投影
21543:夢中的鐵花
21544:夢中的鐵花
21553:沉金的歲月
21554:沉金的歲月
51110:異國之盞
51111:異國之盞
51112:異國之盞

View File

@@ -1,3 +1,5 @@
20:深林的記憶
21:飾金之夢
51:行者之心
52:勇士之心
53:守護之心

View File

@@ -50,3 +50,6 @@
1064:雲堇
1065:久岐忍
1066:神里綾人
1067:柯萊
1068:多莉
1069:提納里

View File

@@ -8,6 +8,8 @@
/give 102 x1880200
設置世界等級
/prop wl 8
點亮地圖
/prop unlockmap 1
一鍵解鎖深淵
/prop ut 12
設置紀行等級

View File

@@ -34,3 +34,6 @@
071:華紫櫻緋
076:蒼流踏花
081:素霓俔天
091:提納里池(非原名)
092:钟离池(非原名)
093:獵人之徑池(非原名)

File diff suppressed because it is too large Load Diff

View File

@@ -338,3 +338,25 @@
29060201:禍津御建鳴神命
29060202:禍津御建鳴神命
29060203:禍津御建鳴神命
20060701:草飄浮靈
24030201:遺跡龍獸·地巡
24030101:遺跡龍獸·空巡
25210101:鍍金旅團·陣前斧手
25210201:鍍金旅團·機弩兵
25210301:鍍金旅團·鴉喙戟手
25210401:鍍金旅團·破陣者
25210501:鍍金旅團·刀舞者
25310101:鍍金旅團·沙中淨水
25310201:鍍金旅團·熾陽凝冰
25310301:鍍金旅團·白日鳴雷
26020301:掣電樹
26090201:浮游草蕈獸
26090201:旋轉雷蕈獸
26090401:旋轉冰蕈獸
26090501:伸縮火蕈獸
26090701:伸縮風蕈獸
26090801:伸縮岩蕈獸
26090901:陸行水本真蕈
26120101:有翼草本真蕈
26120201:有翼冰本真蕈
26110101:翠翎恐蕈

File diff suppressed because it is too large Load Diff

View File

@@ -149,3 +149,4 @@
15507:冬極白星
15508:若水
15509:飛雷之弦振
15511:獵人之徑

View File

@@ -0,0 +1,222 @@
/**
* Grasscutter Tools
* Copyright (C) 2022 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.Linq;
namespace GrasscutterTools.Utils
{
class SubstatSumEquality : IEqualityComparer<List<KeyValuePair<int, double>>>
{
public bool Equals(List<KeyValuePair<int, double>> left, List<KeyValuePair<int, double>> right)
{
if (sum_substat(left) == sum_substat(right))
return true;
else
return false;
}
public int GetHashCode(List<KeyValuePair<int, double>> dict)
{
return sum_substat(dict).GetHashCode();
}
public static double sum_substat(List<KeyValuePair<int, double>> dict)
{
double sum = 0;
foreach (KeyValuePair<int, double> kvp in dict)
{
sum += kvp.Value;
}
return sum;
}
}
class ArtifactUtils
{
public static Dictionary<string, double[][]> substats_rolls = new Dictionary<string, double[][]>
{
{
"hp",
new double[][] {
new double[] {23.9, 29.88},
new double[] {50.19, 60.95, 71.7},
new double[] {100.38, 114.72, 129.06, 143.4},
new double[] {167.3, 191.2, 215.1, 239},
new double[] {209.13, 239, 268.88, 298.75}
}
},
{
"hp_",
new double[][] {
new double[] {1.17, 1.46},
new double[] {1.63, 1.98, 2.33},
new double[] {2.45, 2.8, 3.15, 3.5},
new double[] {3.26, 3.73, 4.2, 4.66},
new double[] {4.08, 4.66, 5.25, 5.83}
}
},
{
"atk",
new double[][] {
new double[] {1.56, 1.95},
new double[] {3.27, 3.97, 4.67},
new double[] {6.54, 7.47, 8.4, 9.34},
new double[] {10.89, 12.45, 14, 15.56},
new double[] {13.62, 15.56, 17.51, 19.45 }
}
},
{
"atk_",
new double[][] {
new double[] {1.17, 1.46},
new double[] {1.63, 1.98, 2.33},
new double[] {2.45, 2.8, 3.15, 3.5},
new double[] {3.26, 3.73, 4.2, 4.66},
new double[] {4.08, 4.66, 5.25, 5.83}
}
},
{
"def",
new double[][] {
new double[] {1.85, 2.31},
new double[] {3.89, 4.72, 5.56},
new double[] {10, 11.11, 7.78, 8.89},
new double[] {12.96, 14.82, 16.67, 18.52},
new double[] {16.2, 18.52, 20.83, 23.15}
}
},
{
"def_",
new double[][] {
new double[] {1.46, 1.82},
new double[] {2.04, 2.48, 2.91},
new double[] {3.06, 3.5, 3.93, 4.37},
new double[] {4.08, 4.66, 5.25, 5.83},
new double[] {5.1, 5.83, 6.56, 7.29}
}
},
{
"critRate_",
new double[][] {
new double[] {.78, .97},
new double[] {1.09, 1.32, 1.55},
new double[] {1.63, 1.86, 2.1, 2.33},
new double[] {2.18, 2.49, 2.8, 3.11},
new double[] {2.72, 3.11, 3.5, 3.89}
}
},
{
"critDMG_",
new double[][] {
new double[] {1.55, 1.94},
new double[] {2.18, 2.64, 3.11},
new double[] {3.26, 3.73, 4.2, 4.66},
new double[] {4.35, 4.97, 5.6, 6.22},
new double[] {5.44, 6.22, 6.99, 7.77}
}
},
{
"eleMas",
new double[][] {
new double[] {4.66, 5.83},
new double[] {6.53, 7.93, 9.33},
new double[] {11.19, 12.59, 13.99, 9.79},
new double[] {13.06, 14.92, 16.79, 18.65},
new double[] {16.32, 18.65, 20.98, 23.31}
}
},
{
"enerRech_",
new double[][] {
new double[] {1.3, 1.62},
new double[] {1.81, 2.2, 2.59},
new double[] {2.72, 3.11, 3.5, 3.89},
new double[] {3.63, 4.14, 4.66, 5.18},
new double[] {4.53, 5.18, 5.83, 6.48}
}
}
};
// ArtifactSub -> Rarity -> Stat value -> Stat index list
public static Dictionary<string, Dictionary<int, List<KeyValuePair<double, int[]>>>> substats_dict;
public static int[] SplitSubstats(string type, int rarity, double value)
{
if (!substats_initiated)
{
InitSubstats();
substats_initiated = true;
}
double last_stat_diff = 99999;
int[] last_stat_list = { 4, 4, 4, 4, 4, 4 };
foreach (KeyValuePair<double, int[]> value_to_list in substats_dict[type][rarity])
{
if (Math.Abs(value - value_to_list.Key) >= last_stat_diff)
{
return last_stat_list;
}
last_stat_diff = value - value_to_list.Key;
last_stat_list = value_to_list.Value;
}
// Default, should never happen
return last_stat_list;
}
private static void InitSubstats()
{
substats_dict = new Dictionary<string, Dictionary<int, List<KeyValuePair<double, int[]>>>>();
foreach (KeyValuePair<string, double[][]> stat_block_info in substats_rolls)
{
string stat_name = stat_block_info.Key;
substats_dict[stat_name] = new Dictionary<int, List<KeyValuePair<double, int[]>>>();
for (int rarity_index = 0; rarity_index < stat_block_info.Value.Length; rarity_index++)
{
var substat_options = new List<KeyValuePair<int, double>>();
// Substat index == 0 means no substat upgrade
substat_options.Add(new KeyValuePair<int, double>(0, 0));
for (int substat_index = 0; substat_index < substats_rolls[stat_name][rarity_index].Length; substat_index++)
{
substat_options.Add(new KeyValuePair<int, double>(substat_index+1, substats_rolls[stat_name][rarity_index][substat_index]));
}
var substat_sum_data = (from s1 in substat_options from s2 in substat_options from s3 in substat_options from s4 in substat_options from s5 in substat_options from s6 in substat_options select new { s1, s2, s3, s4, s5, s6 })
.Select(x => new List<KeyValuePair<int, double>> { x.s1, x.s2, x.s3, x.s4, x.s5, x.s6 })
.Distinct(new SubstatSumEquality());
var stats_map = new List<KeyValuePair<double, int[]>>();
foreach (List<KeyValuePair<int, double>> val in substat_sum_data.ToArray().OrderBy(list => SubstatSumEquality.sum_substat(list)))
{
var index_list = new List<int>();
foreach (KeyValuePair<int, double> pair in val)
{
if (pair.Key != 0)
index_list.Add(pair.Key);
}
stats_map.Add(new KeyValuePair<double, int[]>(SubstatSumEquality.sum_substat(val), index_list.ToArray()));
}
substats_dict[stat_name][rarity_index + 1] = stats_map;
}
}
}
private static bool substats_initiated = false;
}
}

View File

@@ -2,11 +2,11 @@
using System.Net.Http.Headers;
using System.Threading.Tasks;
using GrasscutterTools.Utils;
using Newtonsoft.Json;
namespace GrasscutterTools.Github
namespace GrasscutterTools.Utils
{
public static class ReleaseAPI
internal class ReleaseAPI
{
public static async Task<ReleaseInfo> GetReleasesLastest(string username, string repo)
{
@@ -14,15 +14,14 @@ namespace GrasscutterTools.Github
try
{
HttpHelper.HttpClient.DefaultRequestHeaders.UserAgent.Add(headerValue);
var r = await HttpHelper.GetAsync<dynamic>($"https://api.github.com/repos/{username}/{repo}/releases/latest");
return new ReleaseInfo
return await HttpHelper.GetAsync<ReleaseInfo>($"https://api.github.com/repos/{username}/{repo}/releases/latest");
}
catch
{
TagName = r.tag_name,
Url = r.html_url,
CraeteTime = r.created_at,
Name = r.name,
Body = r.body
};
// 如果Github无法访问尝试从Gitee获取
var release = await HttpHelper.GetAsync<ReleaseInfo>($"https://gitee.com/api/v5/repos/{username}/{repo}/releases/latest");
release.Url = $"https://gitee.com/{username}/{repo}/releases";
return release;
}
finally
{
@@ -32,14 +31,19 @@ namespace GrasscutterTools.Github
public class ReleaseInfo
{
[JsonProperty("tag_name")]
public string TagName { get; set; }
[JsonProperty("html_url")]
public string Url { get; set; }
[JsonProperty("created_at")]
public DateTimeOffset CraeteTime { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("body")]
public string Body { get; set; }
}
}

View File

@@ -1,53 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Costura.Fody" version="5.7.0" targetFramework="net48" developmentDependency="true" />
<package id="Fody" version="6.6.1" targetFramework="net48" developmentDependency="true" />
<package id="Microsoft.NETCore.Platforms" version="1.1.0" targetFramework="net48" />
<package id="Microsoft.Win32.Primitives" version="4.3.0" targetFramework="net48" />
<package id="NETStandard.Library" version="2.0.3" targetFramework="net48" />
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="net452" />
<package id="Resource.Embedder" version="2.2.0" targetFramework="net48" />
<package id="System.AppContext" version="4.3.0" targetFramework="net48" />
<package id="System.Collections" version="4.3.0" targetFramework="net48" />
<package id="System.Collections.Concurrent" version="4.3.0" targetFramework="net48" />
<package id="System.Console" version="4.3.0" targetFramework="net48" />
<package id="System.Diagnostics.Debug" version="4.3.0" targetFramework="net48" />
<package id="System.Diagnostics.DiagnosticSource" version="4.3.0" targetFramework="net48" />
<package id="System.Diagnostics.Tools" version="4.3.0" targetFramework="net48" />
<package id="System.Diagnostics.Tracing" version="4.3.0" targetFramework="net48" />
<package id="System.Globalization" version="4.3.0" targetFramework="net48" />
<package id="System.Globalization.Calendars" version="4.3.0" targetFramework="net48" />
<package id="System.IO" version="4.3.0" targetFramework="net48" />
<package id="System.IO.Compression" version="4.3.0" targetFramework="net48" />
<package id="System.IO.Compression.ZipFile" version="4.3.0" targetFramework="net48" />
<package id="System.IO.FileSystem" version="4.3.0" targetFramework="net48" />
<package id="System.IO.FileSystem.Primitives" version="4.3.0" targetFramework="net48" />
<package id="System.Linq" version="4.3.0" targetFramework="net48" />
<package id="System.Linq.Expressions" version="4.3.0" targetFramework="net48" />
<package id="System.Net.Http" version="4.3.0" targetFramework="net48" />
<package id="System.Net.Primitives" version="4.3.0" targetFramework="net48" />
<package id="System.Net.Sockets" version="4.3.0" targetFramework="net48" />
<package id="System.ObjectModel" version="4.3.0" targetFramework="net48" />
<package id="System.Reflection" version="4.3.0" targetFramework="net48" />
<package id="System.Reflection.Extensions" version="4.3.0" targetFramework="net48" />
<package id="System.Reflection.Primitives" version="4.3.0" targetFramework="net48" />
<package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="net48" />
<package id="System.Runtime" version="4.3.0" targetFramework="net48" />
<package id="System.Runtime.Extensions" version="4.3.0" targetFramework="net48" />
<package id="System.Runtime.Handles" version="4.3.0" targetFramework="net48" />
<package id="System.Runtime.InteropServices" version="4.3.0" targetFramework="net48" />
<package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net48" />
<package id="System.Runtime.Numerics" version="4.3.0" targetFramework="net48" />
<package id="System.Security.Cryptography.Algorithms" version="4.3.0" targetFramework="net48" />
<package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="net48" />
<package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net48" />
<package id="System.Security.Cryptography.X509Certificates" version="4.3.0" targetFramework="net48" />
<package id="System.Text.Encoding" version="4.3.0" targetFramework="net48" />
<package id="System.Text.Encoding.Extensions" version="4.3.0" targetFramework="net48" />
<package id="System.Text.RegularExpressions" version="4.3.0" targetFramework="net48" />
<package id="System.Threading" version="4.3.0" targetFramework="net48" />
<package id="System.Threading.Tasks" version="4.3.0" targetFramework="net48" />
<package id="System.Threading.Timer" version="4.3.0" targetFramework="net48" />
<package id="System.Xml.ReaderWriter" version="4.3.0" targetFramework="net48" />
<package id="System.Xml.XDocument" version="4.3.0" targetFramework="net48" />
</packages>