diff --git a/Source/GrasscutterTools/Forms/FormDropEditor.Designer.cs b/Source/GrasscutterTools/Forms/FormDropEditor.Designer.cs
index d5604b8..d30d0df 100644
--- a/Source/GrasscutterTools/Forms/FormDropEditor.Designer.cs
+++ b/Source/GrasscutterTools/Forms/FormDropEditor.Designer.cs
@@ -37,6 +37,7 @@
this.TxtItemFilter = new System.Windows.Forms.TextBox();
this.ListDropData = new System.Windows.Forms.ListBox();
this.GrpDropList = new System.Windows.Forms.GroupBox();
+ this.BtnCopyAll = new System.Windows.Forms.Button();
this.BtnClear = new System.Windows.Forms.Button();
this.BtnPaste = new System.Windows.Forms.Button();
this.BtnCopy = new System.Windows.Forms.Button();
@@ -55,7 +56,6 @@
this.ListItems = new System.Windows.Forms.ListBox();
this.GrpMonsterList = new System.Windows.Forms.GroupBox();
this.GrpItemList = new System.Windows.Forms.GroupBox();
- this.BtnCopyAll = new System.Windows.Forms.Button();
this.GrpDropList.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.NUDMaxWeight)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.NUDMinWeight)).BeginInit();
@@ -110,6 +110,7 @@
this.ListMonsters.ItemHeight = 17;
this.ListMonsters.Location = new System.Drawing.Point(6, 51);
this.ListMonsters.Name = "ListMonsters";
+ this.ListMonsters.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended;
this.ListMonsters.Size = new System.Drawing.Size(238, 344);
this.ListMonsters.TabIndex = 4;
this.ListMonsters.SelectedIndexChanged += new System.EventHandler(this.ListMonsters_SelectedIndexChanged);
@@ -176,6 +177,17 @@
this.GrpDropList.TabStop = false;
this.GrpDropList.Text = "掉落列表";
//
+ // BtnCopyAll
+ //
+ this.BtnCopyAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.BtnCopyAll.Location = new System.Drawing.Point(87, 202);
+ this.BtnCopyAll.Name = "BtnCopyAll";
+ this.BtnCopyAll.Size = new System.Drawing.Size(75, 23);
+ this.BtnCopyAll.TabIndex = 22;
+ this.BtnCopyAll.Text = "复制全部";
+ this.BtnCopyAll.UseVisualStyleBackColor = true;
+ this.BtnCopyAll.Click += new System.EventHandler(this.BtnCopyAll_Click);
+ //
// BtnClear
//
this.BtnClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
@@ -410,17 +422,6 @@
this.GrpItemList.TabStop = false;
this.GrpItemList.Text = "物品列表";
//
- // BtnCopyAll
- //
- this.BtnCopyAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
- this.BtnCopyAll.Location = new System.Drawing.Point(87, 202);
- this.BtnCopyAll.Name = "BtnCopyAll";
- this.BtnCopyAll.Size = new System.Drawing.Size(75, 23);
- this.BtnCopyAll.TabIndex = 22;
- this.BtnCopyAll.Text = "复制全部";
- this.BtnCopyAll.UseVisualStyleBackColor = true;
- this.BtnCopyAll.Click += new System.EventHandler(this.BtnCopyAll_Click);
- //
// FormDropEditor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F);
diff --git a/Source/GrasscutterTools/Forms/FormDropEditor.cs b/Source/GrasscutterTools/Forms/FormDropEditor.cs
index 8718163..f9c121c 100644
--- a/Source/GrasscutterTools/Forms/FormDropEditor.cs
+++ b/Source/GrasscutterTools/Forms/FormDropEditor.cs
@@ -10,14 +10,32 @@ using GrasscutterTools.Properties;
using Newtonsoft.Json;
+using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel;
+
namespace GrasscutterTools.Forms
{
public partial class FormDropEditor : Form
{
#region - 成员 -
+ ///
+ /// 掉落池
+ /// Key:怪物ID
+ /// Value:掉落列表
+ ///
private Dictionary> Banners;
+ ///
+ /// 怪物集
+ ///
+ private readonly string[] Monsters;
+
+ ///
+ /// 当前选中项的掉落列表
+ /// (当选中多条时,数据为交集)
+ ///
+ private readonly List DropList = new List();
+
#endregion - 成员 -
#region - 构造与窗体事件 -
@@ -28,7 +46,12 @@ namespace GrasscutterTools.Forms
Icon = Resources.IconGrasscutter;
- ListMonsters.Items.AddRange(GameData.Monsters.Lines);
+ Monsters = new string[GameData.Monsters.Lines.Length + GameData.Animals.Lines.Length];
+ GameData.Monsters.Lines.CopyTo(Monsters, 0);
+ GameData.Animals.Lines.CopyTo(Monsters, GameData.Monsters.Lines.Length);
+ Array.Sort(Monsters);
+
+ ListMonsters.Items.AddRange(Monsters);
ListItems.Items.AddRange(GameData.Items.Lines);
Banners = new Dictionary>();
@@ -158,7 +181,7 @@ namespace GrasscutterTools.Forms
var filter = TxtMonsterFilter.Text.Trim();
ListMonsters.BeginUpdate();
ListMonsters.Items.Clear();
- ListMonsters.Items.AddRange(GameData.Monsters.Lines.Where(n => n.Contains(filter)).ToArray());
+ ListMonsters.Items.AddRange(Monsters.Where(n => n.Contains(filter)).ToArray());
ListMonsters.EndUpdate();
}
@@ -167,13 +190,61 @@ namespace GrasscutterTools.Forms
///
private void ListMonsters_SelectedIndexChanged(object sender, EventArgs e)
{
- var monster = ListMonsters.SelectedItem as string;
- if (string.IsNullOrEmpty(monster)) return;
- var id = int.Parse(monster.Substring(0, monster.IndexOf(':')).Trim());
+ if (ListMonsters.SelectedItems.Count == 0) return;
+
+ // 掉落物列表标题显示
+ var sp = GrpDropList.Text.IndexOf(" | ");
+ if (sp >= 0) GrpDropList.Text = GrpDropList.Text.Remove(sp);
+ if (ListMonsters.SelectedItems.Count == 1)
+ {
+ var item = ListMonsters.SelectedItem as string;
+ GrpDropList.Text += " | " + item;
+ }
+ else
+ {
+ GrpDropList.Text += " | Monsters x" + ListMonsters.SelectedItems.Count.ToString();
+ }
+
+ // 获取选中项中相同的掉落物集合(仅物品、掉落数量、掉落概率完全一致的显示)
+ DropList.Clear();
+ var first = true;
+ foreach (string item in ListMonsters.SelectedItems)
+ {
+ var monsterId = int.Parse(item.Substring(0, item.IndexOf(':')).Trim());
+ if (Banners.TryGetValue(monsterId, out List dropList))
+ {
+ if (first)
+ {
+ DropList.AddRange(dropList);
+ first = false;
+ }
+ else if (DropList.Count > 0)
+ {
+ // 仅保留交集
+ var intersect = DropList.Intersect(dropList).ToList();
+ DropList.Clear();
+ DropList.AddRange(intersect);
+ }
+ else
+ {
+ break;
+ }
+ }
+ else
+ {
+ DropList.Clear();
+ break;
+ }
+ }
+
+ // 显示到列表
ListDropData.BeginUpdate();
ListDropData.Items.Clear();
- if (Banners.TryGetValue(id, out List dropList))
- ListDropData.Items.AddRange(dropList.ToArray());
+ if (DropList.Count > 0)
+ {
+ ListDropData.Items.AddRange(DropList.Select(it => it.ToString()).ToArray());
+ ListDropData.SelectedIndex = 0;
+ }
ListDropData.EndUpdate();
}
@@ -186,9 +257,11 @@ namespace GrasscutterTools.Forms
///
private void ListDropData_SelectedIndexChanged(object sender, EventArgs e)
{
- var dropData = ListDropData.SelectedItem as DropData;
- if (dropData == null) return;
- TxtItem.Text = $"{dropData.ItemId}: {GameData.Items[dropData.ItemId]}";
+ if (ListDropData.SelectedIndex == -1) return;
+
+ var dropData = DropList[ListDropData.SelectedIndex];
+
+ TxtItem.Text = $"{dropData.ItemId} : {GameData.Items[dropData.ItemId]}";
NUDMinCount.Value = dropData.MinCount;
NUDMaxCount.Value = dropData.MaxCount;
NUDMinWeight.Value = dropData.MinWeight;
@@ -244,9 +317,7 @@ namespace GrasscutterTools.Forms
///
private void ListItems_SelectedIndexChanged(object sender, EventArgs e)
{
- var item = ListItems.SelectedItem as string;
- if (string.IsNullOrEmpty(item)) return;
- TxtItem.Text = item;
+ TxtItem.Text = ListItems.SelectedItem as string;
}
#endregion - 物品列表 -
diff --git a/Source/GrasscutterTools/Game/Drop/DropData.cs b/Source/GrasscutterTools/Game/Drop/DropData.cs
index 254cbfa..658d317 100644
--- a/Source/GrasscutterTools/Game/Drop/DropData.cs
+++ b/Source/GrasscutterTools/Game/Drop/DropData.cs
@@ -2,7 +2,7 @@
namespace GrasscutterTools.Game.Drop
{
- public class DropData
+ public struct DropData
{
///
/// 物品ID