NHSE/NHSE.WinForms/Subforms/Villager/VillagerDIYTimerEditor.cs
2020-12-02 12:52:12 -08:00

74 lines
2.7 KiB
C#

using NHSE.Core;
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace NHSE.WinForms
{
public partial class VillagerDIYTimerEditor : Form
{
private readonly List<ComboItem> Recipes = GameInfo.Strings.CreateItemDataSource(RecipeList.Recipes, false);
private readonly IVillager Villager;
private byte Hour, Minute, Second;
private ushort RecipeIndex;
public VillagerDIYTimerEditor(IVillager v)
{
Villager = v;
Hour = Villager.DIYEndHour;
Minute = Villager.DIYEndMinute;
Second = Villager.DIYEndSecond;
InitializeComponent();
// Both hour and minute will be 255 in most cases when villager is idling.
// If another villager's end time is earlier, this villager will not craft UNLESS the villager is crafting an "event" item, in which case it seems it will take priority.
bool idleState = Hour == byte.MaxValue || Minute == byte.MaxValue;
DT_Time.Value = idleState ? new DateTime(1970, 01, 01, 0, 0, 0) : new DateTime(1970, 01, 01, Hour, Minute, Second);
CHK_Crafting.Checked = DT_Time.Enabled = !idleState;
CB_Recipe.DisplayMember = nameof(ComboItem.Text);
CB_Recipe.ValueMember = nameof(ComboItem.Value);
CB_Recipe.DataSource = Recipes;
RecipeIndex = Villager.DIYRecipeIndex;
CB_Recipe.SelectedValue = (int)RecipeIndex;
}
private void CB_Recipe_SelectedIndexChanged(object sender, EventArgs e)
{
var val = WinFormsUtil.GetIndex((ComboBox)sender);
RecipeIndex = (ushort)Math.Max(0, Math.Min(ushort.MaxValue, val));
}
private void B_Cancel_Click(object sender, EventArgs e) => Close();
private void B_Save_Click(object sender, EventArgs e)
{
Villager.DIYEndHour = Hour;
Villager.DIYEndMinute = Minute;
Villager.DIYEndSecond = Second;
Villager.DIYRecipeIndex = RecipeIndex;
DialogResult = DialogResult.OK;
Close();
}
private void CHK_Crafting_CheckedChanged(object sender, EventArgs e)
{
Hour = CHK_Crafting.Checked ? (byte)DT_Time.Value.Hour : byte.MaxValue;
Minute = CHK_Crafting.Checked ? (byte)DT_Time.Value.Minute : byte.MaxValue;
DT_Time.Enabled = CHK_Crafting.Checked;
}
private void DT_Time_ValueChanged(object sender, EventArgs e)
{
Hour = (byte)DT_Time.Value.Hour;
Minute = (byte)DT_Time.Value.Minute;
Second = (byte)DT_Time.Value.Second;
}
}
}