GrasscutterCommandGenerator/Source/GrasscutterTools/Pages/PageGiveArtifact.cs
2022-11-26 23:47:46 +08:00

248 lines
9.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using GrasscutterTools.Game;
using GrasscutterTools.Properties;
using GrasscutterTools.Utils;
namespace GrasscutterTools.Pages
{
internal partial class PageGiveArtifact : BasePage
{
public PageGiveArtifact()
{
InitializeComponent();
if (DesignMode) return;
CommandVersion.VersionChanged += (_, _1) => ChangeTPArtifact();
}
/// <summary>
/// 副词条集
/// </summary>
private Dictionary<string, List<KeyValuePair<int, string>>> subAttrs;
/// <summary>
/// 部位标签集
/// </summary>
private string[] ArtifactPartLabels;
/// <summary>
/// 初始化圣遗物列表
/// </summary>
public override void OnLoad()
{
CmbArtifactSet.Items.Clear();
CmbArtifactSet.Items.AddRange(GameData.ArtifactCats.Names);
CmbMainAttribution.Items.Clear();
CmbMainAttribution.Items.AddRange(GameData.ArtifactMainAttribution.Lines);
subAttrs = new Dictionary<string, List<KeyValuePair<int, string>>>();
for (int i = 0; i < GameData.ArtifactSubAttribution.Count; i++)
{
var name = GameData.ArtifactSubAttribution.Names[i];
var pi = name.IndexOf('+');
var prefix = name.Substring(0, pi);
var value = name.Substring(pi);
if (!subAttrs.TryGetValue(prefix, out List<KeyValuePair<int, string>> list))
{
list = new List<KeyValuePair<int, string>>();
subAttrs[prefix] = list;
}
list.Add(new KeyValuePair<int, string>(GameData.ArtifactSubAttribution.Ids[i], value));
}
CmbSubAttribution.Items.Clear();
CmbSubAttribution.Items.AddRange(subAttrs.Keys.ToArray());
ArtifactPartLabels = Resources.ArtifactPartLabels.Split(',');
ChangeTPArtifact();
}
/// <summary>
/// 圣遗物套装下拉框选中项改变时触发
/// </summary>
private void CmbArtifactSet_SelectedIndexChanged(object sender, EventArgs e)
{
if (CmbArtifactSet.SelectedIndex < 0)
return;
var setId = GameData.ArtifactCats.Ids[CmbArtifactSet.SelectedIndex];
var beginIndex = Array.FindIndex(GameData.Artifacts.Ids, id => id / 1000 == setId);
var endIndex = Array.FindLastIndex(GameData.Artifacts.Ids, id => id / 1000 == setId);
// 限制星级输入范围
NUDArtifactStars.Minimum = GameData.Artifacts.Ids[beginIndex] / 100 % 10;
NUDArtifactStars.Maximum = GameData.Artifacts.Ids[endIndex] / 100 % 10;
var parts = GameData.Artifacts.Names.Skip(beginIndex).Take(endIndex - beginIndex + 1).Distinct().ToArray();
var i = CmbArtifactPart.SelectedIndex;
CmbArtifactPart.Items.Clear();
CmbArtifactPart.Items.AddRange(parts);
if (i < parts.Length) // 重新选中
CmbArtifactPart.SelectedIndex = i;
ArtifactInputChanged(sender, e);
}
/// <summary>
/// 圣遗物部件选中项改变时触发
/// </summary>
private void CmbArtifactPart_SelectedIndexChanged(object sender, EventArgs e)
{
if (CmbArtifactPart.SelectedIndex < 0)
{
LblArtifactName.Text = "";
return;
}
var name = CmbArtifactPart.SelectedItem as string;
var id = GameData.Artifacts.Ids[Array.IndexOf(GameData.Artifacts.Names, name)];
var pardIndex = id / 10 % 10 - 1;
if (pardIndex < ArtifactPartLabels?.Length)
LblArtifactName.Text = ArtifactPartLabels[pardIndex];
else
LblArtifactName.Text = "";
ArtifactInputChanged(sender, e);
}
/// <summary>
/// 圣遗物页面输入改变时调用
/// </summary>
private void ArtifactInputChanged(object sender, EventArgs e)
{
// 圣遗物ID五位数ABCDE其中AB是圣遗物类型魔女/水/风套......
// C是星级5就是五星D是圣遗物部位E是初始词条数量
if (CmbArtifactSet.SelectedIndex < 0 || CmbArtifactPart.SelectedIndex < 0)
return;
//var setId = GameData.ArtifactCats.Ids[CmbArtifactSet.SelectedIndex];
//var part = CmbArtifactPart.SelectedIndex+1;
//var index = Array.FindLastIndex(
// GameData.Artifacts.Ids,
// it => it / 1000 == setId // 套装ID
// //&& it / 100 % 10 == NUDArtifactStars.Value // 星级
// && it / 10 % 10 == part // 部位
// );
var name = CmbArtifactPart.SelectedItem as string;
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)
{
if (CommandVersion.Check(CommandVersion.V1_2_2))
SetCommand("/give", $"{id} lv{NUDArtifactLevel.Value}");
else
SetCommand("/giveart", $"{id} {NUDArtifactLevel.Value}");
}
else
{
var t = CmbMainAttribution.SelectedItem as string;
var mainAttr = ItemMap.ToId(t);
var subAttrs = "";
if (ListSubAttributionChecked.Items.Count > 0)
{
var subAttrDir = new Dictionary<int, int>(ListSubAttributionChecked.Items.Count);
foreach (string item in ListSubAttributionChecked.Items)
{
var subId = ItemMap.ToId(item);
var times = int.Parse(item.Substring(item.LastIndexOf('x') + 1));
if (subAttrDir.ContainsKey(subId))
subAttrDir[subId] += times;
else
subAttrDir[subId] = times;
}
foreach (var kv in subAttrDir)
{
if (kv.Value > 1)
subAttrs += $"{kv.Key},{kv.Value} ";
else
subAttrs += $"{kv.Key} ";
}
}
if (CommandVersion.Check(CommandVersion.V1_2_2))
SetCommand("/give", $"{id} lv{NUDArtifactLevel.Value} {mainAttr} {subAttrs}");
else
SetCommand("/giveart", $"{id} {mainAttr} {subAttrs}{NUDArtifactLevel.Value}");
}
}
/// <summary>
/// 副词条下拉框选中项改变时触发
/// </summary>
private void CmbSubAttribution_SelectedIndexChanged(object sender, EventArgs e)
{
CmbSubAttributionValue.Items.Clear();
if (CmbSubAttribution.SelectedIndex >= 0)
{
CmbSubAttributionValue.Items.AddRange(subAttrs[CmbSubAttribution.SelectedItem as string].Select(kv => kv.Value).ToArray());
CmbSubAttributionValue.SelectedIndex = 0;
}
}
/// <summary>
/// 点击添加副词条按钮时触发
/// </summary>
private void BtnAddSubAttr_Click(object sender, EventArgs e)
{
if (CmbSubAttribution.SelectedIndex >= 0 && CmbSubAttributionValue.SelectedIndex >= 0)
{
var name = CmbSubAttribution.SelectedItem as string;
var kv = subAttrs[name][CmbSubAttributionValue.SelectedIndex];
ListSubAttributionChecked.Items.Add($"{kv.Key}:{name}{kv.Value} x{NUDSubAttributionTimes.Value}");
ArtifactInputChanged(null, EventArgs.Empty);
}
}
/// <summary>
/// 已添加的副词条列表选中项改变时触发
/// </summary>
private void ListSubAttributionChecked_SelectedIndexChanged(object sender, EventArgs e)
{
if (ListSubAttributionChecked.SelectedIndex >= 0)
{
ListSubAttributionChecked.Items.RemoveAt(ListSubAttributionChecked.SelectedIndex);
ListSubAttributionChecked.ClearSelected();
ArtifactInputChanged(null, EventArgs.Empty);
}
}
/// <summary>
/// 清除词条链接标签点击时触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void LblClearSubAttrCheckedList_Click(object sender, EventArgs e)
{
CmbMainAttribution.SelectedIndex = -1;
ListSubAttributionChecked.Items.Clear();
ArtifactInputChanged(null, EventArgs.Empty);
}
/// <summary>
/// 改变圣遗物等级输入范围旧版本范围是1-21
/// </summary>
private void ChangeTPArtifact()
{
if (CommandVersion.Check(CommandVersion.V1_2_2))
{
NUDArtifactLevel.Minimum = 0;
NUDArtifactLevel.Maximum = 20;
}
else
{
NUDArtifactLevel.Minimum = 1;
NUDArtifactLevel.Maximum = 21;
}
LblArtifactLevelTip.Text = $"[{NUDArtifactLevel.Minimum}-{NUDArtifactLevel.Maximum}]";
}
/// <summary>
/// 点击CharacterBuilder链接标签时触发
/// </summary>
private void LnkCharacterBuilder_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
UIUtil.OpenURL("https://github.com/Penelopeep/CharacterBuilder");
}
}
}