using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using JXHelper.Config;
using JXHelper.Core;
namespace JXHelper.UI;
///
/// Hộp thoại Chiêu thức hỗ trợ & Phái đặc thù (Mô phỏng 100% chuẩn giao diện và cơ chế AutoVLBS).
/// Quản lý 4 phân hệ:
/// 1. Chiêu trấn phái + hỗ trợ (#1, #2, #3)
/// 2. Chiêu thức luân chuyển (#4, #5 - Bùa chú Ngũ Độc / Debuff theo thời gian)
/// 3. Gán chiêu thức mặc định khi bắt đầu (Trái / Phải)
/// 4. Phân hệ Nga My (Từ Hàng Phổ Độ bơm cả nhóm + Hỗ trợ Lưu Thủy - Mộng Điệp)
///
public partial class SupportSkillsForm : Form
{
private readonly BotConfig _config;
private readonly string _characterName;
private readonly string _sect;
private readonly CharacterSkillProfile _profile;
public event Action? OnConfigSaved;
public SupportSkillsForm(BotConfig config, string characterName, string? sect = null)
{
InitializeComponent();
_config = config;
_characterName = characterName;
_sect = !string.IsNullOrEmpty(sect) ? sect : (!string.IsNullOrEmpty(config.DetectedSect) ? config.DetectedSect : "Cái Bang");
_profile = SkillScanner.ScanCharacterSkills(_characterName, _sect);
Text = $"Chieu thuc ho tro - [{_characterName} ({_sect})]";
PopulateSkillDropdowns();
LoadConfigToUi();
btnSave.Click += (s, e) => SaveUiToConfig();
btnClose.Click += (s, e) => Close();
}
private void PopulateSkillDropdowns()
{
// 1. Chiêu hỗ trợ (#1, #2, #3)
var buffList = new List { "" };
foreach (var sk in _profile.BuffSkills)
{
if (!buffList.Contains(sk.Name)) buffList.Add(sk.Name);
}
foreach (var def in SkillDatabase.GetSkillsBySect(_sect).Where(s => s.IsBuff))
{
if (!buffList.Contains(def.Name)) buffList.Add(def.Name);
}
cboBuff1Skill.Items.AddRange(buffList.ToArray());
cboBuff2Skill.Items.AddRange(buffList.ToArray());
cboBuff3Skill.Items.AddRange(buffList.ToArray());
// 2. Chiêu thức luân chuyển (#4, #5 - Bùa chú / Curses cho Ngũ Độc hoặc chiêu buff)
var curseList = new List { "" };
foreach (var sk in _profile.CurseSkills)
{
if (!curseList.Contains(sk.Name)) curseList.Add(sk.Name);
}
foreach (var def in SkillDatabase.GetCurseSkillsBySect(_sect))
{
if (!curseList.Contains(def.Name)) curseList.Add(def.Name);
}
// Nếu không phải Ngũ Độc, cho phép chọn bất kỳ chiêu nào trong môn phái
foreach (var def in SkillDatabase.GetSkillsBySect(_sect))
{
if (!curseList.Contains(def.Name)) curseList.Add(def.Name);
}
cboCurse1Skill.Items.AddRange(curseList.ToArray());
cboCurse2Skill.Items.AddRange(curseList.ToArray());
// 3. Chiêu mặc định Trái & Phải
var attackList = new List { "" };
foreach (var sk in _profile.AttackSkills)
{
if (!attackList.Contains(sk.Name)) attackList.Add(sk.Name);
}
foreach (var def in SkillDatabase.GetSkillsBySect(_sect).Where(s => !s.IsPassive))
{
if (!attackList.Contains(def.Name)) attackList.Add(def.Name);
}
cboLeftSkill.Items.AddRange(attackList.ToArray());
cboRightSkill.Items.AddRange(curseList.Union(buffList).Union(attackList).Distinct().ToArray());
}
private void LoadConfigToUi()
{
// Nhóm 1: Trấn phái + hỗ trợ
chkBuff1.Checked = _config.Buff1Enabled;
SelectComboItem(cboBuff1Skill, _config.Buff1SkillName);
numBuff1Ms.Value = Math.Clamp(_config.Buff1IntervalSeconds * 1000, numBuff1Ms.Minimum, numBuff1Ms.Maximum);
chkBuff2.Checked = _config.Buff2Enabled;
SelectComboItem(cboBuff2Skill, _config.Buff2SkillName);
numBuff2Ms.Value = Math.Clamp(_config.Buff2IntervalSeconds * 1000, numBuff2Ms.Minimum, numBuff2Ms.Maximum);
chkBuff3.Checked = _config.Buff3Enabled;
SelectComboItem(cboBuff3Skill, _config.Buff3SkillName);
numBuff3Ms.Value = Math.Clamp(_config.Buff3IntervalSeconds * 1000, numBuff3Ms.Minimum, numBuff3Ms.Maximum);
// Nhóm 2: Chiêu thức luân chuyển
radCurseTime.Checked = _config.CurseTriggerMode == 0;
radCurseHp.Checked = _config.CurseTriggerMode == 1;
radCurseMp.Checked = _config.CurseTriggerMode == 2;
chkCurse1.Checked = _config.Curse1Enabled;
SelectComboItem(cboCurse1Skill, _config.Curse1SkillName);
numCurse1Ms.Value = Math.Clamp(_config.Curse1IntervalMs, numCurse1Ms.Minimum, numCurse1Ms.Maximum);
chkCurse2.Checked = _config.Curse2Enabled;
SelectComboItem(cboCurse2Skill, _config.Curse2SkillName);
numCurse2Ms.Value = Math.Clamp(_config.Curse2IntervalMs, numCurse2Ms.Minimum, numCurse2Ms.Maximum);
// Nhóm 3: Gán chiêu mặc định
chkAssignLeft.Checked = _config.AssignLeftSkillEnabled;
SelectComboItem(cboLeftSkill, _config.DefaultLeftSkillName);
chkAssignRight.Checked = _config.AssignRightSkillEnabled;
SelectComboItem(cboRightSkill, _config.DefaultRightSkillName);
// Nhóm 4: Nga My
chkNgaMySupport.Checked = _config.NgaMySupportComboEnabled;
cboNgaMyCombo.SelectedIndex = Math.Clamp(_config.NgaMySupportComboMode, 0, 2);
chkNgaMyHeal.Checked = _config.NgaMyHealEnabled;
numNgaMyHp.Value = Math.Clamp(_config.NgaMyHealHpPercent, numNgaMyHp.Minimum, numNgaMyHp.Maximum);
numNgaMyDelay.Value = Math.Clamp(_config.NgaMyHealDelayMs, numNgaMyDelay.Minimum, numNgaMyDelay.Maximum);
chkNgaMyParty.Checked = _config.NgaMyHealParty;
// Nhóm 5: Ngũ Độc (Chuẩn Auto Kim Yến)
chkNguDocCurseChain.Checked = _config.NguDocCurseChainEnabled;
chkNguDocBossOnly.Checked = _config.NguDocBossOnly;
chkNguDocUHon.Checked = _config.NguDocCurseUHon;
chkNguDocVanCo.Checked = _config.NguDocCurseVanCo;
chkNguDocThiDoc.Checked = _config.NguDocCurseThiDoc;
chkNguDocHoaCot.Checked = _config.NguDocCurseHoaCot;
numNguDocDelay.Value = Math.Clamp(_config.NguDocCurseDelayMs, numNguDocDelay.Minimum, numNguDocDelay.Maximum);
numNguDocDuration.Value = Math.Clamp(_config.NguDocCurseDurationSec, numNguDocDuration.Minimum, numNguDocDuration.Maximum);
// Tự động kích hoạt tab tương ứng với môn phái của nhân vật
if (_sect.Equals("Nga My", StringComparison.OrdinalIgnoreCase))
{
tabSkills.SelectedTab = tabNgaMy;
grpNgaMy.ForeColor = System.Drawing.Color.MidnightBlue;
}
else if (_sect.Equals("Ngũ Độc", StringComparison.OrdinalIgnoreCase))
{
tabSkills.SelectedTab = tabNguDoc;
grpNguDoc.ForeColor = System.Drawing.Color.DarkGreen;
}
else
{
tabSkills.SelectedTab = tabBuff;
}
}
private void SelectComboItem(ComboBox cbo, string? value)
{
if (!string.IsNullOrEmpty(value) && cbo.Items.Contains(value))
{
cbo.SelectedItem = value;
}
else if (cbo.Items.Count > 0)
{
cbo.SelectedIndex = 0;
}
}
public void SaveUiToConfig(bool silent = false)
{
// 1. Trấn phái + hỗ trợ
_config.Buff1Enabled = chkBuff1.Checked;
_config.Buff1SkillName = cboBuff1Skill.SelectedItem?.ToString() ?? "";
_config.Buff1IntervalSeconds = Math.Max(5, (int)(numBuff1Ms.Value / 1000));
_config.Buff2Enabled = chkBuff2.Checked;
_config.Buff2SkillName = cboBuff2Skill.SelectedItem?.ToString() ?? "";
_config.Buff2IntervalSeconds = Math.Max(5, (int)(numBuff2Ms.Value / 1000));
_config.Buff3Enabled = chkBuff3.Checked;
_config.Buff3SkillName = cboBuff3Skill.SelectedItem?.ToString() ?? "";
_config.Buff3IntervalSeconds = Math.Max(5, (int)(numBuff3Ms.Value / 1000));
// 2. Chiêu thức luân chuyển (Curse Rotation)
_config.CurseTriggerMode = radCurseTime.Checked ? 0 : (radCurseHp.Checked ? 1 : 2);
_config.Curse1Enabled = chkCurse1.Checked;
_config.Curse1SkillName = cboCurse1Skill.SelectedItem?.ToString() ?? "";
_config.Curse1IntervalMs = (int)numCurse1Ms.Value;
_config.Curse2Enabled = chkCurse2.Checked;
_config.Curse2SkillName = cboCurse2Skill.SelectedItem?.ToString() ?? "";
_config.Curse2IntervalMs = (int)numCurse2Ms.Value;
_config.CurseRotationEnabled = _config.Curse1Enabled || _config.Curse2Enabled;
// 3. Gán chiêu mặc định
_config.AssignLeftSkillEnabled = chkAssignLeft.Checked;
_config.DefaultLeftSkillName = cboLeftSkill.SelectedItem?.ToString() ?? "";
_config.AssignRightSkillEnabled = chkAssignRight.Checked;
_config.DefaultRightSkillName = cboRightSkill.SelectedItem?.ToString() ?? "";
// 4. Nga My
_config.NgaMySupportComboEnabled = chkNgaMySupport.Checked;
_config.NgaMySupportComboMode = cboNgaMyCombo.SelectedIndex >= 0 ? cboNgaMyCombo.SelectedIndex : 0;
_config.NgaMyHealEnabled = chkNgaMyHeal.Checked;
_config.NgaMyHealHpPercent = (int)numNgaMyHp.Value;
_config.NgaMyHealDelayMs = (int)numNgaMyDelay.Value;
_config.NgaMyHealParty = chkNgaMyParty.Checked;
// 5. Ngũ Độc (Chuẩn Auto Kim Yến)
_config.NguDocCurseChainEnabled = chkNguDocCurseChain.Checked;
_config.NguDocBossOnly = chkNguDocBossOnly.Checked;
_config.NguDocCurseUHon = chkNguDocUHon.Checked;
_config.NguDocCurseVanCo = chkNguDocVanCo.Checked;
_config.NguDocCurseThiDoc = chkNguDocThiDoc.Checked;
_config.NguDocCurseHoaCot = chkNguDocHoaCot.Checked;
_config.NguDocCurseDelayMs = (int)numNguDocDelay.Value;
_config.NguDocCurseDurationSec = (int)numNguDocDuration.Value;
if (_config.NguDocCurseChainEnabled)
{
_config.CurseRotationEnabled = true;
}
// Lưu cấu hình độc lập cho nhân vật
_config.SaveForCharacter(_characterName);
OnConfigSaved?.Invoke(_config);
if (!silent)
{
MessageBox.Show(this, $"Đã lưu cấu hình chiêu thức hỗ trợ thành công cho nhân vật '{_characterName}'!",
"JXHelper - Thành công", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
DialogResult = DialogResult.OK;
Close();
}
}