NHSE/NHSE.WinForms/Subforms/InventoryEditor.cs
2020-03-27 21:01:46 -07:00

283 lines
9.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using NHSE.Core;
namespace NHSE.WinForms
{
public partial class InventoryEditor : Form
{
private readonly Player Player;
private readonly InventorySet[] Inventory;
private readonly string[] items;
// assume that all pouches have the same amount of columns
private int ColumnItem;
private int ColumnCount;
private int ColumnUse;
private int ColumnFlag1;
private int ColumnFlag2;
private int ColumnFlag3;
public InventoryEditor(Player player)
{
InitializeComponent();
Player = player;
Inventory = GetInventory(player);
items = GameInfo.Strings.itemlist.ToArray(); // simple copy, we're gonna mutate
var set = new HashSet<string>();
for (int i = 0; i < items.Length; i++)
{
var item = items[i];
if (string.IsNullOrEmpty(item))
items[i] = $"(Item #{i:000})";
else if (set.Contains(item))
items[i] += $" (#{i:000})";
else
set.Add(item);
}
CreateViews();
LoadItems();
}
private static InventorySet[] GetInventory(Player player)
{
return new[]
{
new InventorySet(InventoryType.Pocket1, player.Personal.Pocket2),
new InventorySet(InventoryType.Pocket2, player.Personal.Pocket1),
new InventorySet(InventoryType.Storage, player.Personal.Storage),
};
}
private void SetInventory(Player player)
{
player.Personal.Pocket2 = Inventory[0].Items;
player.Personal.Pocket1 = Inventory[1].Items;
player.Personal.Storage = Inventory[2].Items;
}
private void CreateViews()
{
foreach (var p in Inventory)
{
var tab = new TabPage {Name = $"Tab_{p.Type}", Text = p.Type.ToString()};
var dgv = GetDGV(p);
ControlGrids.Add(p.Type, dgv);
tab.Controls.Add(dgv);
TC_Groups.TabPages.Add(tab);
TC_Groups.ShowToolTips = true;
tab.ToolTipText = p.Type.ToString();
}
}
private DataGridView GetDGV(InventorySet pouch)
{
// Add DataGrid
var dgv = GetBaseDataGrid(pouch);
// Get Columns
var item = GetItemColumn(ColumnItem = 0);
var count = GetCountColumn(ColumnCount = 1);
var use = GetUseColumn(ColumnUse = 2);
var flag1 = GetFlagColumn(ColumnFlag1 = 3, nameof(Item.Flags0));
var flag2 = GetFlagColumn(ColumnFlag2 = 4, nameof(Item.Flags1));
var flag3 = GetFlagColumn(ColumnFlag3 = 5, nameof(Item.Flags2));
dgv.Columns.Add(item);
dgv.Columns.Add(count);
dgv.Columns.Add(use);
dgv.Columns.Add(flag1);
dgv.Columns.Add(flag2);
dgv.Columns.Add(flag3);
// Populate with rows
var itemarr = items;
item.Items.AddRange(itemarr);
dgv.Rows.Add(pouch.Items.Count);
dgv.CancelEdit();
return dgv;
}
private static DataGridView GetBaseDataGrid(InventorySet pouch)
{
return new DataGridView
{
Dock = DockStyle.Fill,
Text = pouch.Type.ToString(),
Name = "DGV_" + pouch.Type,
AllowUserToAddRows = false,
AllowUserToDeleteRows = false,
AllowUserToResizeRows = false,
AllowUserToResizeColumns = false,
RowHeadersVisible = false,
MultiSelect = false,
ShowEditingIcon = false,
EditMode = DataGridViewEditMode.EditOnEnter,
ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single,
ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize,
SelectionMode = DataGridViewSelectionMode.CellSelect,
CellBorderStyle = DataGridViewCellBorderStyle.None,
};
}
private static DataGridViewComboBoxColumn GetItemColumn(int c)
{
return new DataGridViewComboBoxColumn
{
HeaderText = "Item",
DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing,
DisplayIndex = c,
Width = 135,
FlatStyle = FlatStyle.Flat,
};
}
private static DataGridViewColumn GetCountColumn(int c)
{
return new DataGridViewTextBoxColumn
{
HeaderText = "Count",
DisplayIndex = c,
Width = 45,
DefaultCellStyle = {Alignment = DataGridViewContentAlignment.MiddleCenter},
MaxInputLength = 3,
};
}
private static DataGridViewColumn GetUseColumn(int c)
{
return new DataGridViewTextBoxColumn
{
HeaderText = "Uses",
DisplayIndex = c,
Width = 45,
DefaultCellStyle = { Alignment = DataGridViewContentAlignment.MiddleCenter },
MaxInputLength = 3,
};
}
private static DataGridViewColumn GetFlagColumn(int c, string name)
{
return new DataGridViewTextBoxColumn
{
HeaderText = name,
DisplayIndex = c,
Width = 45,
DefaultCellStyle = { Alignment = DataGridViewContentAlignment.MiddleCenter },
MaxInputLength = 3,
};
}
private void LoadItems()
{
foreach (var list in Inventory)
{
var dgv = GetGrid(list.Type);
GetList(dgv, list);
}
}
private readonly Dictionary<InventoryType, DataGridView> ControlGrids = new Dictionary<InventoryType, DataGridView>();
private DataGridView GetGrid(InventoryType type) => ControlGrids[type];
private DataGridView GetGrid(int group) => ControlGrids[Inventory[group].Type];
private void SetInventory()
{
foreach (var pouch in Inventory)
{
var dgv = GetGrid(pouch.Type);
SetList(dgv, pouch);
}
}
private void GetList(DataGridView dgv, InventorySet pouch)
{
for (int i = 0; i < dgv.Rows.Count; i++)
{
var cells = dgv.Rows[i].Cells;
var item = pouch.Items[i];
// Treat NONE as 0
var id = item.ItemId;
if (id == Item.NONE)
id = 0;
cells[ColumnItem].Value = items[id];
cells[ColumnCount].Value = item.Count;
cells[ColumnUse].Value = item.UseCount;
cells[ColumnFlag1].Value = item.Flags0;
cells[ColumnFlag2].Value = item.Flags1;
cells[ColumnFlag3].Value = item.Flags2;
}
}
private void SetList(DataGridView dgv, InventorySet pouch)
{
for (int i = 0; i < dgv.Rows.Count; i++)
{
var cells = dgv.Rows[i].Cells;
var str = cells[ColumnItem].Value.ToString();
var itemindex = Array.IndexOf(items, str);
int.TryParse(cells[ColumnCount].Value?.ToString(), out int itemcnt);
int.TryParse(cells[ColumnUse].Value?.ToString(), out int uses);
int.TryParse(cells[ColumnFlag1].Value?.ToString(), out int flags1);
int.TryParse(cells[ColumnFlag2].Value?.ToString(), out int flags2);
int.TryParse(cells[ColumnFlag3].Value?.ToString(), out int flags3);
var item = pouch.Items[i];
// Undo our handling of NONE
if (itemindex <= 0)
itemindex = Item.NONE;
item.ItemId = (ushort)itemindex;
item.Count = (byte)itemcnt;
item.UseCount = (ushort)uses;
item.Flags0 = (byte)flags1;
item.Flags1 = (byte)flags2;
item.Flags1 = (byte)flags3;
}
}
private void B_Cancel_Click(object sender, EventArgs e) => Close();
private void B_Save_Click(object sender, EventArgs e)
{
SetInventory();
SetInventory(Player);
Close();
}
private void B_Copy_Click(object sender, EventArgs e)
{
var dgv = GetGrid(TC_Groups.SelectedIndex);
int max = (int)NUD_Copy.Value;
var first = dgv.Rows[0].Cells;
for (int i = 1; i < max; i++)
{
var cells = dgv.Rows[i].Cells;
cells[ColumnItem].Value = first[ColumnItem].Value;
cells[ColumnCount].Value = first[ColumnCount].Value;
cells[ColumnUse].Value = first[ColumnUse].Value;
cells[ColumnFlag1].Value = first[ColumnFlag1].Value;
cells[ColumnFlag2].Value = first[ColumnFlag2].Value;
cells[ColumnFlag3].Value = first[ColumnFlag3].Value;
}
System.Media.SystemSounds.Asterisk.Play();
}
}
}