diff --git a/RotationSolver.Default/AssemblyInfo.cs b/RotationSolver.Default/AssemblyInfo.cs
deleted file mode 100644
index 0496e7b42..000000000
--- a/RotationSolver.Default/AssemblyInfo.cs
+++ /dev/null
@@ -1 +0,0 @@
-[assembly: AuthorHash("Ig4lHXUohMZNIeheUtAtRg==")]
\ No newline at end of file
diff --git a/RotationSolver.Default/Healer/AST_Default.cs b/RotationSolver.Default/Healer/AST_Default.cs
deleted file mode 100644
index c1c8e69e0..000000000
--- a/RotationSolver.Default/Healer/AST_Default.cs
+++ /dev/null
@@ -1,243 +0,0 @@
-namespace RotationSolver.Default.Healer;
-
-[RotationDesc(ActionID.Divination)]
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Healer/AST_Default.cs")]
-public sealed class AST_Default : AST_Base
-{
- public override string GameVersion => "6.28";
-
- public override string RotationName => "Default";
-
- protected override IRotationConfigSet CreateConfiguration()
- => base.CreateConfiguration()
- .SetFloat("UseEarthlyStarTime", 15, "Use the Earthly Star in Count down time", 4, 20);
-
- static IBaseAction AspectedBeneficDefense { get; } = new BaseAction(ActionID.AspectedBenefic, true, isEot: true)
- {
- ChoiceTarget = TargetFilter.FindAttackedTarget,
- ActionCheck = b => b.IsJobCategory(JobRole.Tank),
- TargetStatus = new StatusID[] { StatusID.AspectedBenefic },
- };
-
- protected override IAction CountDownAction(float remainTime)
- {
- if (remainTime < Malefic.CastTime + Service.Config.CountDownAhead
- && Malefic.CanUse(out var act)) return act;
- if (remainTime < 3 && UseBurstMedicine(out act)) return act;
- if (remainTime < 4 && AspectedBeneficDefense.CanUse(out act)) return act;
- if (remainTime < Configs.GetFloat("UseEarthlyStarTime")
- && EarthlyStar.CanUse(out act)) return act;
- if (remainTime < 30 && Draw.CanUse(out act)) return act;
-
- return base.CountDownAction(remainTime);
- }
-
- [RotationDesc(ActionID.CelestialIntersection, ActionID.Exaltation)]
- protected override bool DefenseSingleAbility(byte abilitiesRemaining, out IAction act)
- {
- //天星交错
- if (CelestialIntersection.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
-
- //给T减伤,这个很重要。
- if (Exaltation.CanUse(out act)) return true;
- return false;
- }
-
- [RotationDesc(ActionID.CollectiveUnconscious)]
- protected override bool DefenseAreaAbility(byte abilitiesRemaining, out IAction act)
- {
- //来个命运之轮
- if (CollectiveUnconscious.CanUse(out act)) return true;
-
- return base.DefenseAreaAbility(abilitiesRemaining, out act);
- }
-
- protected override bool GeneralGCD(out IAction act)
- {
- //Add AspectedBeneficwhen not in combat.
- if (NotInCombatDelay && AspectedBeneficDefense.CanUse(out act)) return true;
-
- //群体输出
- if (Gravity.CanUse(out act)) return true;
-
- //单体输出
- if (Combust.CanUse(out act)) return true;
- if (Malefic.CanUse(out act)) return true;
- if (Combust.CanUse(out act, CanUseOption.MustUse)) return true;
-
- act = null!;
- return false;
- }
-
- [RotationDesc(ActionID.AspectedHelios, ActionID.Helios)]
- protected override bool HealAreaGCD(out IAction act)
- {
- //阳星相位
- if (AspectedHelios.CanUse(out act)) return true;
-
- //阳星
- if (Helios.CanUse(out act)) return true;
-
- act = null!;
- return false;
- }
-
- protected override bool EmergencyAbility(byte abilityRemain, IAction nextGCD, out IAction act)
- {
- if (base.EmergencyAbility(abilityRemain, nextGCD, out act)) return true;
-
- if (PartyHealers.Count() == 1 && Player.HasStatus(false, StatusID.Silence)
- && HasHostilesInRange && EchoDrops.CanUse(out act)) return true;
-
-
- if (!InCombat) return false;
-
- //如果要群奶了,先上个天宫图!
- if (nextGCD.IsTheSameTo(true, AspectedHelios, Helios))
- {
- if (Horoscope.CanUse(out act)) return true;
-
- //中间学派
- if (NeutralSect.CanUse(out act)) return true;
- }
-
- //如果要单奶了,先上星位合图!
- if (nextGCD.IsTheSameTo(true, Benefic, Benefic2, AspectedBenefic))
- {
- if (Synastry.CanUse(out act)) return true;
- }
- return false;
- }
-
- protected override bool GeneralAbility(byte abilitiesRemaining, out IAction act)
- {
- //如果当前还没有卡牌,那就抽一张
- if (Draw.CanUse(out act)) return true;
-
- bool canUse = Astrodyne.ActionCheck(Service.Player);
-
- //如果当前卡牌已经拥有了,就重抽
- if (!canUse && Redraw.CanUse(out act)) return true;
-
- act = null;
- return false;
- }
-
- [RotationDesc(ActionID.AspectedBenefic, ActionID.Benefic2, ActionID.Benefic)]
- protected override bool HealSingleGCD(out IAction act)
- {
- //吉星相位
- if (AspectedBenefic.CanUse(out act)
- && (IsMoving || AspectedBenefic.Target.GetHealthRatio() > 0.4)) return true;
-
- //福星
- if (Benefic2.CanUse(out act)) return true;
-
- //吉星
- if (Benefic.CanUse(out act)) return true;
-
- act = null;
- return false;
- }
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- if (InBurst && !IsMoving && Divination.CanUse(out act)) return true;
-
- //如果当前还没有皇冠卡牌,那就抽一张
- if (MinorArcana.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
-
- //如果当前还没有卡牌,那就抽一张
- if (Draw.CanUse(out act, InBurst ? CanUseOption.EmptyOrSkipCombo : CanUseOption.None)) return true;
-
- //光速,创造更多的内插能力技的机会。
- if (IsMoving && Lightspeed.CanUse(out act)) return true;
-
-
- if (!IsMoving)
- {
- //如果没有地星也没有巨星,那就试试看能不能放个。
- if (!Player.HasStatus(true, StatusID.EarthlyDominance, StatusID.GiantDominance))
- {
- if (EarthlyStar.CanUse(out act, CanUseOption.MustUse)) return true;
- }
- //加星星的进攻Buff
- if (Astrodyne.CanUse(out act)) return true;
- }
-
- if (DrawnCrownCard == CardType.LORD || MinorArcana.WillHaveOneChargeGCD(1))
- {
- //进攻牌,随便发。或者CD要转好了,赶紧发掉。
- if (MinorArcana.CanUse(out act)) return true;
- }
-
- //发牌
- if (abilitiesRemaining == 1)
- {
- if (PlayCard(out act)) return true;
- }
-
- return false;
- }
-
- [RotationDesc(ActionID.EssentialDignity, ActionID.CelestialIntersection, ActionID.CelestialOpposition,
- ActionID.EarthlyStar, ActionID.Horoscope)]
- protected override bool HealSingleAbility(byte abilitiesRemaining, out IAction act)
- {
- //常规奶
- if (EssentialDignity.CanUse(out act)) return true;
- //带盾奶
- if (CelestialIntersection.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
-
- //奶量牌,要看情况。
- if (DrawnCrownCard == CardType.LADY && MinorArcana.CanUse(out act)) return true;
-
- var tank = PartyTanks;
- var isBoss = Malefic.IsTargetBoss;
- if (EssentialDignity.IsCoolingDown && tank.Count() == 1 && tank.Any(t => t.GetHealthRatio() < 0.5) && !isBoss)
- {
- //群Hot
- if (CelestialOpposition.CanUse(out act)) return true;
-
- //如果有巨星主宰
- if (Player.HasStatus(true, StatusID.GiantDominance))
- {
- //需要回血的时候炸了。
- act = EarthlyStar;
- return true;
- }
-
- //天宫图
- if (!Player.HasStatus(true, StatusID.HoroscopeHelios, StatusID.Horoscope) && Horoscope.CanUse(out act)) return true;
- //阳星天宫图
- if (Player.HasStatus(true, StatusID.HoroscopeHelios) && Horoscope.CanUse(out act)) return true;
- //超紧急情况天宫图
- if (tank.Any(t => t.GetHealthRatio() < 0.3) && Horoscope.CanUse(out act)) return true;
- }
-
- return false;
- }
-
- [RotationDesc(ActionID.CelestialOpposition, ActionID.EarthlyStar, ActionID.Horoscope)]
- protected override bool HealAreaAbility(byte abilitiesRemaining, out IAction act)
- {
- //群Hot
- if (CelestialOpposition.CanUse(out act)) return true;
-
- //如果有巨星主宰
- if (Player.HasStatus(true, StatusID.GiantDominance))
- {
- //需要回血的时候炸了。
- act = EarthlyStar;
- return true;
- }
-
- //天宫图
- if (Player.HasStatus(true, StatusID.HoroscopeHelios) && Horoscope.CanUse(out act)) return true;
-
- //奶量牌,要看情况。
- if (DrawnCrownCard == CardType.LADY && MinorArcana.CanUse(out act)) return true;
-
- return false;
- }
-}
diff --git a/RotationSolver.Default/Healer/SCH_Default.cs b/RotationSolver.Default/Healer/SCH_Default.cs
deleted file mode 100644
index a8079c034..000000000
--- a/RotationSolver.Default/Healer/SCH_Default.cs
+++ /dev/null
@@ -1,227 +0,0 @@
-namespace RotationSolver.Default.Healer;
-
-[RotationDesc(ActionID.ChainStratagem)]
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Healer/SCH_Default.cs")]
-public sealed class SCH_Default : SCH_Base
-{
- public override string GameVersion => "6.28";
-
- public override string RotationName => "Default";
-
- protected override bool CanHealSingleSpell => base.CanHealSingleSpell && (Configs.GetBool("GCDHeal") || PartyHealers.Count() < 2);
- protected override bool CanHealAreaSpell => base.CanHealAreaSpell && (Configs.GetBool("GCDHeal") || PartyHealers.Count() < 2);
-
- protected override IRotationConfigSet CreateConfiguration()
- {
- return base.CreateConfiguration().SetBool("GCDHeal", false, "Aut use GCD to heal")
- .SetBool("prevDUN", false, "Recitation in 15 seconds.")
- .SetBool("GiveT", false, "Give Recitation to Tank");
- }
-
- protected override bool EmergencyAbility(byte abilityRemain, IAction nextGCD, out IAction act)
- {
- //秘策绑定单盾群盾
- if (nextGCD.IsTheSameTo(true, Succor, Adloquium))
- {
- if (Recitation.CanUse(out act)) return true;
- }
-
- //Remove Aetherpact
- foreach (var item in PartyMembers)
- {
- if (item.GetHealthRatio() < 0.9) continue;
- if (item.HasStatus(true, StatusID.Aetherpact))
- {
- act = Aetherpact;
- return true;
- }
- }
-
- return base.EmergencyAbility(abilityRemain, nextGCD, out act);
- }
-
- protected override bool GeneralGCD(out IAction act)
- {
- //召唤小仙女
- if (SummonEos.CanUse(out act)) return true;
-
- //DoT
- if (Bio.CanUse(out act)) return true;
-
- //AOE
- if (ArtOfWar.CanUse(out act)) return true;
-
- //Single
- if (Ruin.CanUse(out act)) return true;
- if (Ruin2.CanUse(out act)) return true;
-
- //Add dot.
- if (Bio.CanUse(out act, CanUseOption.MustUse)) return true;
-
- return false;
- }
-
- [RotationDesc(ActionID.Adloquium, ActionID.Physick)]
- protected override bool HealSingleGCD(out IAction act)
- {
- //鼓舞激励之策
- if (Adloquium.CanUse(out act)) return true;
-
- //医术
- if (Physick.CanUse(out act)) return true;
-
- return false;
- }
-
- [RotationDesc(ActionID.Aetherpact, ActionID.Protraction, ActionID.SacredSoil, ActionID.Excogitation, ActionID.Lustrate, ActionID.Aetherpact)]
- protected override bool HealSingleAbility(byte abilitiesRemaining, out IAction act)
- {
- //判断是否有人有线
- var haveLink = PartyMembers.Any(p => p.HasStatus(true, StatusID.Aetherpact));
-
- //以太契约
- if (Aetherpact.CanUse(out act) && FairyGauge >= 70 && !haveLink) return true;
-
- //生命回生法
- if (Protraction.CanUse(out act)) return true;
-
- //野战治疗阵
- if (SacredSoil.CanUse(out act)) return true;
-
- //深谋远虑之策
- if (Excogitation.CanUse(out act)) return true;
-
- //生命活性法
- if (Lustrate.CanUse(out act)) return true;
-
- //以太契约
- if (Aetherpact.CanUse(out act) && !haveLink) return true;
-
- return false;
- }
-
- [RotationDesc(ActionID.Excogitation)]
- protected override bool DefenseSingleAbility(byte abilitiesRemaining, out IAction act)
- {
- if (Excogitation.CanUse(out act)) return true;
- return false;
- }
-
- [RotationDesc(ActionID.Succor)]
- protected override bool HealAreaGCD(out IAction act)
- {
- //士气高扬之策
- if (Succor.CanUse(out act)) return true;
-
- return false;
- }
-
-
- [RotationDesc(ActionID.SummonSeraph, ActionID.Consolation, ActionID.WhisperingDawn, ActionID.SacredSoil, ActionID.Indomitability)]
- protected override bool HealAreaAbility(byte abilitiesRemaining, out IAction act)
- {
- //慰藉
- if(WhisperingDawn.ElapsedOneChargeAfterGCD(1) || FeyIllumination.ElapsedOneChargeAfterGCD(1) || FeyBlessing.ElapsedOneChargeAfterGCD(1))
- {
- if (SummonSeraph.CanUse(out act)) return true;
- }
- if (Consolation.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
-
- //异想的祥光
- if (FeyBlessing.CanUse(out act)) return true;
-
- //仙光的低语
- if (WhisperingDawn.CanUse(out act)) return true;
-
- //野战治疗阵
- if (SacredSoil.CanUse(out act)) return true;
-
- //不屈不挠之策
- if (Indomitability.CanUse(out act)) return true;
-
- act = null;
- return false;
- }
-
- [RotationDesc(ActionID.Succor)]
- protected override bool DefenseAreaGCD(out IAction act)
- {
- if (Succor.CanUse(out act)) return true;
- return false;
- }
-
- [RotationDesc(ActionID.FeyIllumination, ActionID.Expedient, ActionID.SummonSeraph, ActionID.Consolation, ActionID.SacredSoil)]
- protected override bool DefenseAreaAbility(byte abilitiesRemaining, out IAction act)
- {
- //异想的幻光
- if (FeyIllumination.CanUse(out act)) return true;
-
- //疾风怒涛之计
- if (Expedient.CanUse(out act)) return true;
-
- //慰藉
-
-
- if (WhisperingDawn.ElapsedOneChargeAfterGCD(1) || FeyIllumination.ElapsedOneChargeAfterGCD(1) || FeyBlessing.ElapsedOneChargeAfterGCD(1))
- {
- if (SummonSeraph.CanUse(out act)) return true;
- }
- if (Consolation.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
-
- //野战治疗阵
- if (SacredSoil.CanUse(out act)) return true;
-
- return false;
- }
-
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- if (InBurst)
- {
- //连环计
- if (ChainStratagem.CanUse(out act)) return true;
- }
-
- if (Dissipation.EnoughLevel && Dissipation.WillHaveOneChargeGCD(3) && Dissipation.IsEnabled || Aetherflow.WillHaveOneChargeGCD(3))
- {
- //能量吸收
- if (EnergyDrain.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
- }
-
- //转化
- if (Dissipation.CanUse(out act)) return true;
-
- //以太超流
- if (Aetherflow.CanUse(out act)) return true;
-
- act = null;
- return false;
- }
-
- //15秒秘策单盾扩散
- protected override IAction CountDownAction(float remainTime)
- {
- if (remainTime < Ruin.CastTime + Service.Config.CountDownAhead
- && Ruin.CanUse(out var act)) return act;
-
- if (Configs.GetBool("prevDUN") && remainTime <= 15 && !DeploymentTactics.IsCoolingDown && PartyMembers.Count() > 1)
- {
-
- if (!Recitation.IsCoolingDown) return Recitation;
- if (!PartyMembers.Any((n) => n.HasStatus(true, StatusID.Galvanize)))
- {
- //如果还没上激励就给t一个激励
- if (Configs.GetBool("GiveT"))
- {
- return Adloquium;
- }
- }
- else
- {
- return DeploymentTactics;
- }
- }
- return base.CountDownAction(remainTime);
- }
-}
\ No newline at end of file
diff --git a/RotationSolver.Default/Healer/SGE_Default.cs b/RotationSolver.Default/Healer/SGE_Default.cs
deleted file mode 100644
index 322ff8932..000000000
--- a/RotationSolver.Default/Healer/SGE_Default.cs
+++ /dev/null
@@ -1,279 +0,0 @@
-namespace RotationSolver.Default.Healer;
-
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Healer/SGE_Default.cs")]
-public sealed class SGE_Default : SGE_Base
-{
- public override string GameVersion => "6.18";
-
- public override string RotationName => "Default";
-
-
- ///
- /// þ
- ///
- private static BaseAction MEukrasianDiagnosis { get; } = new(ActionID.EukrasianDiagnosis, true)
- {
- ChoiceTarget = (Targets, mustUse) =>
- {
- var targets = Targets.GetJobCategory(JobRole.Tank);
- if (!targets.Any()) return null;
- return targets.First();
- },
- ActionCheck = b =>
- {
- if (InCombat) return false;
- if (b == Player) return false;
- if (b.HasStatus(false, StatusID.EukrasianDiagnosis, StatusID.EukrasianPrognosis, StatusID.Galvanize)) return false;
- return true;
- }
- };
-
- protected override bool CanHealSingleSpell => base.CanHealSingleSpell && (Configs.GetBool("GCDHeal") || PartyHealers.Count() < 2);
- protected override bool CanHealAreaSpell => base.CanHealAreaSpell && (Configs.GetBool("GCDHeal") || PartyHealers.Count() < 2);
-
- protected override IRotationConfigSet CreateConfiguration()
- {
- return base.CreateConfiguration().SetBool("GCDHeal", false, "Auto Use GCD to heal.");
- }
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- act = null!;
- return false;
- }
-
- protected override bool EmergencyAbility(byte abilitiesRemaining, IAction nextGCD, out IAction act)
- {
- if (base.EmergencyAbility(abilitiesRemaining, nextGCD, out act)) return true;
-
- //¸
- if (nextGCD.IsTheSameTo(false, Pneuma, EukrasianDiagnosis,
- EukrasianPrognosis, Diagnosis, Prognosis))
- {
- //
- if (Zoe.CanUse(out act)) return true;
- }
-
- if (nextGCD == Diagnosis)
- {
- //
- if (Krasis.CanUse(out act)) return true;
- }
-
- return base.EmergencyAbility(abilitiesRemaining, nextGCD, out act);
- }
-
- [RotationDesc(ActionID.Haima, ActionID.Taurochole)]
- protected override bool DefenseSingleAbility(byte abilitiesRemaining, out IAction act)
- {
- if (Addersgall == 0 || Dyskrasia.CanUse(out _))
- {
- if (Haima.CanUse(out act)) return true;
- }
-
- //ţ֭
- if (Taurochole.CanUse(out act) && Taurochole.Target.GetHealthRatio() < 0.8) return true;
-
- return base.DefenseSingleAbility(abilitiesRemaining, out act);
- }
-
- [RotationDesc(ActionID.EukrasianDiagnosis)]
- protected override bool DefenseSingleGCD(out IAction act)
- {
- //
- if (EukrasianDiagnosis.CanUse(out act))
- {
- if (EukrasianDiagnosis.Target.HasStatus(false,
- StatusID.EukrasianDiagnosis,
- StatusID.EukrasianPrognosis,
- StatusID.Galvanize
- )) return false;
-
- //
- if (Eukrasia.CanUse(out act)) return true;
-
- act = EukrasianDiagnosis;
- return true;
- }
-
- return base.DefenseSingleGCD(out act);
- }
-
- [RotationDesc(ActionID.Panhaima, ActionID.Kerachole, ActionID.Holos)]
- protected override bool DefenseAreaAbility(byte abilityRemain, out IAction act)
- {
- //Ѫ
- if (Addersgall == 0 && PartyMembersAverHP < 0.7)
- {
- if (Panhaima.CanUse(out act)) return true;
- }
-
- //֭
- if (Kerachole.CanUse(out act)) return true;
-
- //
- if (Holos.CanUse(out act)) return true;
-
- return base.DefenseAreaAbility(abilityRemain, out act);
- }
-
- [RotationDesc(ActionID.EukrasianPrognosis)]
- protected override bool DefenseAreaGCD(out IAction act)
- {
- //Ԥ
- if (EukrasianPrognosis.CanUse(out act))
- {
- if (EukrasianDiagnosis.Target.HasStatus(false,
- StatusID.EukrasianDiagnosis,
- StatusID.EukrasianPrognosis,
- StatusID.Galvanize
- )) return false;
-
- //
- if (Eukrasia.CanUse(out act)) return true;
-
- act = EukrasianPrognosis;
- return true;
- }
-
- return base.DefenseAreaGCD(out act);
- }
-
- protected override bool GeneralAbility(byte abilitiesRemaining, out IAction act)
- {
- //Ĺ
- if (Kardia.CanUse(out act)) return true;
-
- //
- if (Addersgall == 0 && Rhizomata.CanUse(out act)) return true;
-
- //
- if (Soteria.CanUse(out act) && PartyMembers.Any(b => b.HasStatus(true, StatusID.Kardion) && b.GetHealthRatio() < Service.Config.HealthSingleAbility)) return true;
-
- //
- if (Pepsis.CanUse(out act)) return true;
-
- act = null!;
- return false;
- }
-
- protected override bool GeneralGCD(out IAction act)
- {
- var option = CanUseOption.MustUse;
- if (IsMoving || Dyskrasia.CanUse(out _)) option |= CanUseOption.EmptyOrSkipCombo;
- // һλ
- if (Phlegma3.CanUse(out act, option)) return true;
- if (!Phlegma3.EnoughLevel && Phlegma2.CanUse(out act, option)) return true;
- if (!Phlegma2.EnoughLevel && Phlegma.CanUse(out act, option)) return true;
-
- //ʧ
- if (Dyskrasia.CanUse(out act)) return true;
-
- if (EukrasianDosis.CanUse(out var enAct))
- {
- //Dot
- if (Eukrasia.CanUse(out act)) return true;
- act = enAct;
- return true;
- }
-
- //עҩ
- if (Dosis.CanUse(out act)) return true;
-
- //
- if (Toxikon.CanUse(out act, CanUseOption.MustUse)) return true;
-
- //սTˢζ
- if (MEukrasianDiagnosis.CanUse(out _))
- {
- //
- if (Eukrasia.CanUse(out act)) return true;
-
- act = MEukrasianDiagnosis;
- return true;
- }
- if (Eukrasia.CanUse(out act)) return true;
-
- return false;
- }
-
- [RotationDesc(ActionID.Taurochole, ActionID.Druochole, ActionID.Holos, ActionID.Physis, ActionID.Panhaima)]
- protected override bool HealSingleAbility(byte abilitiesRemaining, out IAction act)
- {
- //ţ֭
- if (Taurochole.CanUse(out act)) return true;
-
- //֭
- if (Druochole.CanUse(out act)) return true;
-
- //Դʱ뷶Χƻѹ
- var tank = PartyTanks;
- var isBoss = Dosis.Target.IsBoss();
- if (Addersgall == 0 && tank.Count() == 1 && tank.Any(t => t.GetHealthRatio() < 0.6f) && !isBoss)
- {
- //
- if (Holos.CanUse(out act)) return true;
-
- //
- if (Physis.CanUse(out act)) return true;
-
- //Ѫ
- if (Panhaima.CanUse(out act)) return true;
- }
-
- return base.HealSingleAbility(abilitiesRemaining, out act);
- }
-
- [RotationDesc(ActionID.Diagnosis)]
- protected override bool HealSingleGCD(out IAction act)
- {
- if (Diagnosis.CanUse(out act)) return true;
- return false;
- }
-
- [RotationDesc(ActionID.Pneuma, ActionID.Prognosis, ActionID.EukrasianPrognosis)]
- protected override bool HealAreaGCD(out IAction act)
- {
- if (PartyMembersAverHP < 0.65f || Dyskrasia.CanUse(out _) && PartyTanks.Any(t => t.GetHealthRatio() < 0.6f))
- {
- //Ϣ
- if (Pneuma.CanUse(out act, CanUseOption.MustUse)) return true;
- }
-
- //Ԥ
- if (EukrasianPrognosis.Target.HasStatus(false, StatusID.EukrasianDiagnosis, StatusID.EukrasianPrognosis, StatusID.Galvanize))
- {
- if (Prognosis.CanUse(out act)) return true;
- }
-
- if (EukrasianPrognosis.CanUse(out _))
- {
- //
- if (Eukrasia.CanUse(out act)) return true;
-
- act = EukrasianPrognosis;
- return true;
- }
-
- act = null;
- return false;
- }
-
- [RotationDesc(ActionID.Kerachole, ActionID.Physis, ActionID.Holos, ActionID.Ixochole)]
- protected override bool HealAreaAbility(byte abilitiesRemaining, out IAction act)
- {
- //֭
- if (Kerachole.CanUse(out act) && Level >= 78) return true;
-
- //
- if (Physis.CanUse(out act)) return true;
-
- //
- if (Holos.CanUse(out act) && PartyMembersAverHP < 0.65f) return true;
-
- //֭
- if (Ixochole.CanUse(out act)) return true;
-
- return false;
- }
-}
diff --git a/RotationSolver.Default/Healer/WHM_Default.cs b/RotationSolver.Default/Healer/WHM_Default.cs
deleted file mode 100644
index d1ac0a027..000000000
--- a/RotationSolver.Default/Healer/WHM_Default.cs
+++ /dev/null
@@ -1,172 +0,0 @@
-namespace RotationSolver.Default.Healer;
-
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Healer/WHM_Default.cs")]
-public sealed class WHM_Default : WHM_Base
-{
- public override string GameVersion => "6.28";
-
- public override string RotationName => "Default";
-
- protected override IRotationConfigSet CreateConfiguration()
- {
- return base.CreateConfiguration().SetBool("UseLilyWhenFull", true, "Auto use Lily when full")
- .SetBool("UsePreRegen", false, "Regen on Tank in 5 seconds.");
- }
- public static IBaseAction RegenDefense { get; } = new BaseAction(ActionID.Regen, true, isEot: true, isTimeline: true)
- {
- ChoiceTarget = TargetFilter.FindAttackedTarget,
- TargetStatus = Regen.TargetStatus,
- };
-
- protected override bool GeneralGCD(out IAction act)
- {
- //苦难之心
- if (AfflatusMisery.CanUse(out act, CanUseOption.MustUse)) return true;
-
- //泄蓝花 团队缺血时优先狂喜之心
- bool liliesNearlyFull = Lily == 2 && LilyAfter(17);
- bool liliesFullNoBlood = Lily == 3 && BloodLily < 3;
- if (Configs.GetBool("UseLilyWhenFull") && (liliesNearlyFull || liliesFullNoBlood) && AfflatusMisery.EnoughLevel)
- {
- if (PartyMembersAverHP < 0.7)
- {
- if (AfflatusRapture.CanUse(out act)) return true;
- }
- if (AfflatusSolace.CanUse(out act)) return true;
- }
-
- //群体输出
- if (Holy.CanUse(out act)) return true;
-
- //单体输出
- if (Aero.CanUse(out act, IsMoving ? CanUseOption.MustUse : CanUseOption.None)) return true;
- if (Stone.CanUse(out act)) return true;
-
- act = null;
- return false;
- }
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- //加个神速咏唱
- if (PresenseOfMind.CanUse(out act)) return true;
-
- //加个法令
- if (HasHostilesInRange && Assize.CanUse(out act, CanUseOption.MustUse)) return true;
-
- return false;
- }
-
- protected override bool EmergencyAbility(byte abilitiesRemaining, IAction nextGCD, out IAction act)
- {
- //加个无中生有
- if (nextGCD is BaseAction action && action.MPNeed >= 1000 &&
- ThinAir.CanUse(out act)) return true;
-
- //加个全大赦,狂喜之心 医济医治愈疗
- if (nextGCD.IsTheSameTo(true, AfflatusRapture, Medica, Medica2, Cure3))
- {
- if (PlenaryIndulgence.CanUse(out act)) return true;
- }
-
- return base.EmergencyAbility(abilitiesRemaining, nextGCD, out act);
- }
-
- [RotationDesc(ActionID.AfflatusSolace, ActionID.Regen, ActionID.Cure2, ActionID.Cure)]
- protected override bool HealSingleGCD(out IAction act)
- {
- //安慰之心
- if (AfflatusSolace.CanUse(out act)) return true;
-
- //再生
- if (Regen.CanUse(out act)
- && (IsMoving || Regen.Target.GetHealthRatio() > 0.4)) return true;
-
- //救疗
- if (Cure2.CanUse(out act)) return true;
-
- //治疗
- if (Cure.CanUse(out act)) return true;
-
- return false;
- }
-
- [RotationDesc(ActionID.Benediction, ActionID.Asylum, ActionID.DivineBenison, ActionID.Tetragrammaton)]
- protected override bool HealSingleAbility(byte abilitiesRemaining, out IAction act)
- {
- if (Benediction.CanUse(out act) &&
- Benediction.Target.GetHealthRatio() < 0.3) return true;
-
- //庇护所
- if (!IsMoving && Asylum.CanUse(out act)) return true;
-
- //神祝祷
- if (DivineBenison.CanUse(out act)) return true;
-
- //神名
- if (Tetragrammaton.CanUse(out act)) return true;
- return false;
- }
-
- [RotationDesc(ActionID.AfflatusRapture, ActionID.Medica2, ActionID.Cure3, ActionID.Medica)]
- protected override bool HealAreaGCD(out IAction act)
- {
- //狂喜之心
- if (AfflatusRapture.CanUse(out act)) return true;
-
- int hasMedica2 = PartyMembers.Count((n) => n.HasStatus(true, StatusID.Medica2));
-
- //医济 在小队半数人都没有医济buff and 上次没放医济时使用
- if (Medica2.CanUse(out act) && hasMedica2 < PartyMembers.Count() / 2 && !IsLastAction(true, Medica2)) return true;
-
- //愈疗
- if (Cure3.CanUse(out act)) return true;
-
- //医治
- if (Medica.CanUse(out act)) return true;
-
- return false;
- }
-
- [RotationDesc(ActionID.Asylum)]
- protected override bool HealAreaAbility(byte abilitiesRemaining, out IAction act)
- {
- if (Asylum.CanUse(out act)) return true;
- return false;
- }
-
- [RotationDesc(ActionID.DivineBenison, ActionID.Aquaveil)]
- protected override bool DefenseSingleAbility(byte abilitiesRemaining, out IAction act)
- {
- //神祝祷
- if (DivineBenison.CanUse(out act)) return true;
-
- //水流幕
- if (Aquaveil.CanUse(out act)) return true;
- return false;
- }
-
- [RotationDesc(ActionID.Temperance, ActionID.LiturgyOfTheBell)]
- protected override bool DefenseAreaAbility(byte abilitiesRemaining, out IAction act)
- {
- //节制
- if (Temperance.CanUse(out act)) return true;
-
- //礼仪之铃
- if (LiturgyOfTheBell.CanUse(out act)) return true;
- return false;
- }
-
- protected override IAction CountDownAction(float remainTime)
- {
- if (remainTime < Stone.CastTime + Service.Config.CountDownAhead
- && Stone.CanUse(out var act)) return act;
-
- if (Configs.GetBool("UsePreRegen") && remainTime <= 5 && remainTime > 3)
- {
- if (RegenDefense.CanUse(out act)) return act;
- if (DivineBenison.CanUse(out act)) return act;
- }
- return base.CountDownAction(remainTime);
- }
-}
\ No newline at end of file
diff --git a/RotationSolver.Default/Magical/BLM_Default.cs b/RotationSolver.Default/Magical/BLM_Default.cs
deleted file mode 100644
index 56e52a11d..000000000
--- a/RotationSolver.Default/Magical/BLM_Default.cs
+++ /dev/null
@@ -1,365 +0,0 @@
-namespace RotationSolver.Default.Magical;
-
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Magical/BLM_Default.cs")]
-public class BLM_Default : BLM_Base
-{
- public override string GameVersion => "6.31";
-
- public override string RotationName => "Default";
-
- private static bool NeedToGoIce
- {
- get
- {
- //Can use Despair.
- if (Despair.EnoughLevel && Player.CurrentMp >= Despair.MPNeed) return false;
-
- //Can use Fire1
- if (Fire.EnoughLevel && Player.CurrentMp >= Fire.MPNeed) return false;
-
- return true;
- }
- }
-
- private static bool NeedToTransposeGoIce(bool usedOne)
- {
- if (!NeedToGoIce) return false;
- if (!Paradox.EnoughLevel) return false;
- var compare = usedOne ? -1 : 0;
- var count = PolyglotStacks;
- if (count == compare++) return false;
- if (count == compare++ && !EnchinaEndAfterGCD(2)) return false;
- if (count >= compare && (HasFire || Swiftcast.WillHaveOneChargeGCD(2) || TripleCast.WillHaveOneChargeGCD(2))) return true;
- if (!HasFire && !Swiftcast.WillHaveOneChargeGCD(2) && !TripleCast.CanUse(out _, gcdCountForAbility: 8)) return false;
- return true;
- }
-
- protected override IRotationConfigSet CreateConfiguration()
- => base.CreateConfiguration()
- .SetBool("UseTransposeForParadox", true, "Use Transpose to Fire for Paradox")
- .SetBool("ExtendTimeSafely", false, "Extend Fire Element Time Safely")
- .SetBool("UseN15", false, "Use N15");
-
- protected override IAction CountDownAction(float remainTime)
- {
- IAction act;
- if (remainTime < Fire3.CastTime + Service.Config.CountDownAhead)
- {
- if (Fire3.CanUse(out act)) return act;
- }
- if (remainTime <= 12 && SharpCast.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return act;
- return base.CountDownAction(remainTime);
- }
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- if (InBurst && UseBurstMedicine(out act)) return true;
- if (InUmbralIce)
- {
- if (UmbralIceStacks == 2 && !HasFire
- && !IsLastGCD(ActionID.Paradox))
- {
- if (Swiftcast.CanUse(out act)) return true;
- if (TripleCast.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
- }
-
- if (UmbralIceStacks < 3 && LucidDreaming.CanUse(out act)) return true;
- if (SharpCast.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
- }
- if (InAstralFire)
- {
- if (!CombatElapsedLess(6) && CombatElapsedLess(9) && LeyLines.CanUse(out act)) return true;
- if (TripleCast.CanUse(out act, gcdCountForAbility: 5)) return true;
- }
- if (Amplifier.CanUse(out act)) return true;
- return false;
- }
-
- protected override bool EmergencyAbility(byte abilitiesRemaining, IAction nextGCD, out IAction act)
- {
- //To Fire
- if (Player.CurrentMp >= 7200 && UmbralIceStacks == 2 && Paradox.EnoughLevel)
- {
- if ((HasFire || HasSwift) && abilitiesRemaining == 1 && Transpose.CanUse(out act)) return true;
- }
- if (nextGCD.IsTheSameTo(false, Fire3) && HasFire && abilitiesRemaining == 1)
- {
- if (Transpose.CanUse(out act)) return true;
- }
-
- //Using Manafont
- if (InAstralFire)
- {
- if (Player.CurrentMp == 0 && abilitiesRemaining == 2 && Manafont.CanUse(out act)) return true;
- //To Ice
- if (NeedToTransposeGoIce(true) && Transpose.CanUse(out act)) return true;
- }
-
- return base.EmergencyAbility(abilitiesRemaining, nextGCD, out act);
- }
-
- protected override bool GeneralGCD(out IAction act)
- {
- if (InFireOrIce(out act, out var mustGo)) return true;
- if (mustGo) return false;
- //Triplecast for moving.
- if (IsMoving && HasHostilesInRange && TripleCast.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
-
- if (AddElementBase(out act)) return true;
- if (Scathe.CanUse(out act)) return true;
- if (MaintainStatus(out act)) return true;
-
- return false;
- }
-
- private bool InFireOrIce(out IAction act, out bool mustGo)
- {
- act = null;
- mustGo = false;
- if (InUmbralIce)
- {
- if (GoFire(out act)) return true;
- if (MaintainIce(out act)) return true;
- if (DoIce(out act)) return true;
- }
- if (InAstralFire)
- {
- if (GoIce(out act)) return true;
- if (MaintainFire(out act)) return true;
- if (DoFire(out act)) return true;
- }
- return false;
- }
-
- private static bool GoIce(out IAction act)
- {
- act = null;
-
- if (!NeedToGoIce) return false;
-
- //Use Manafont or transpose.
- if ((!Manafont.IsCoolingDown || NeedToTransposeGoIce(false))
- && UseInstanceSpell(out act)) return true;
-
- //Go to Ice.
- if (Blizzard2.CanUse(out act)) return true;
- if (Blizzard3.CanUse(out act)) return true;
- if (Transpose.CanUse(out act)) return true;
- if (Blizzard.CanUse(out act)) return true;
- return false;
- }
-
- private static bool MaintainIce(out IAction act)
- {
- act = null;
- if (UmbralIceStacks == 1)
- {
- if (Blizzard2.CanUse(out act)) return true;
-
- if (Player.Level == 90 && Blizzard.CanUse(out act)) return true;
- if (Blizzard3.CanUse(out act)) return true;
- }
- if (UmbralIceStacks == 2 && Player.Level < 90)
- {
- if (Blizzard2.CanUse(out act)) return true;
- if (Blizzard.CanUse(out act)) return true;
- }
- return false;
- }
-
- private static bool DoIce(out IAction act)
- {
- if (IsLastAction(ActionID.UmbralSoul, ActionID.Transpose)
- && IsParadoxActive && Blizzard.CanUse(out act)) return true;
-
- if (UmbralIceStacks == 3 && UsePolyglot(out act)) return true;
-
- //Add Hearts
- if (UmbralIceStacks == 3 &&
- Blizzard4.EnoughLevel && UmbralHearts < 3 && !IsLastGCD
- (ActionID.Blizzard4, ActionID.Freeze))
- {
- if (Freeze.CanUse(out act)) return true;
- if (Blizzard4.CanUse(out act)) return true;
- }
-
- if (AddThunder(out act, 5)) return true;
- if (UmbralIceStacks == 2 && UsePolyglot(out act, 0)) return true;
-
- if (IsParadoxActive)
- {
- if (Blizzard.CanUse(out act)) return true;
- }
-
- if (Blizzard2.CanUse(out act)) return true;
- if (Blizzard4.CanUse(out act)) return true;
- if (Blizzard.CanUse(out act)) return true;
- return false;
- }
-
- private static bool GoFire(out IAction act)
- {
- act = null;
-
- //Transpose line
- if (UmbralIceStacks < 3) return false;
-
- //Need more MP
- if (Player.CurrentMp < 9600) return false;
-
- if (IsParadoxActive)
- {
- if (Blizzard.CanUse(out act)) return true;
- }
-
- //Go to Fire.
- if (Fire2.CanUse(out act)) return true;
- if (Fire3.CanUse(out act)) return true;
- if (Transpose.CanUse(out act)) return true;
- if (Fire.CanUse(out act)) return true;
-
- return false;
- }
-
- private bool MaintainFire(out IAction act)
- {
- switch (AstralFireStacks)
- {
- case 1:
- if (Fire2.CanUse(out act)) return true;
- if (Configs.GetBool("UseN15"))
- {
- if (HasFire && Fire3.CanUse(out act)) return true;
- if (IsParadoxActive && Fire.CanUse(out act)) return true;
- }
- if (Fire3.CanUse(out act)) return true;
- break;
- case 2:
- if (Fire2.CanUse(out act)) return true;
- if (Fire.CanUse(out act)) return true;
- break;
- }
-
- if (ElementTimeEndAfterGCD(Configs.GetBool("ExtendTimeSafely") ? 3u : 2u))
- {
- if (Player.CurrentMp >= Fire.MPNeed * 2 + 800 && Fire.CanUse(out act)) return true;
- if (Flare.CanUse(out act)) return true;
- if (Despair.CanUse(out act)) return true;
- }
-
- act = null;
- return false;
- }
-
- private static bool DoFire(out IAction act)
- {
- if (UsePolyglot(out act)) return true;
-
- // Add thunder only at combat start.
- if (CombatElapsedLess(5))
- {
- if (AddThunder(out act, 0)) return true;
- }
-
- if (TripleCast.CanUse(out act)) return true;
-
- if (AddThunder(out act, 0) && Player.WillStatusEndGCD(1, 0, true,
- StatusID.Thundercloud)) return true;
-
- if (UmbralHearts < 2 && Flare.CanUse(out act)) return true;
- if (Fire2.CanUse(out act)) return true;
-
- if (Player.CurrentMp >= Fire.MPNeed + 800)
- {
- if (Fire4.EnoughLevel)
- {
- if (Fire4.CanUse(out act)) return true;
- }
- else if (HasFire)
- {
- if(Fire3.CanUse(out act)) return true;
- }
- if (Fire.CanUse(out act)) return true;
- }
-
- if (Despair.CanUse(out act)) return true;
-
- return false;
- }
-
- private static bool UseInstanceSpell(out IAction act)
- {
- if (UsePolyglot(out act)) return true;
- if (HasThunder && AddThunder(out act, 1)) return true;
- if (UsePolyglot(out act, 0)) return true;
- return false;
- }
-
- private static bool AddThunder(out IAction act, uint gcdCount = 3)
- {
- act = null;
- //Return if just used.
- if (IsLastGCD(ActionID.Thunder, ActionID.Thunder2, ActionID.Thunder3, ActionID.Thunder4)) return false;
-
- //So long for thunder.
- if (Thunder.CanUse(out _) && !Thunder.Target.WillStatusEndGCD(gcdCount, 0, true,
- StatusID.Thunder, StatusID.Thunder2, StatusID.Thunder3, StatusID.Thunder4))
- return false;
-
- if (Thunder2.CanUse(out act)) return true;
- if (Thunder.CanUse(out act)) return true;
-
- return false;
- }
-
- private static bool AddElementBase(out IAction act)
- {
- if (Player.CurrentMp >= 7200)
- {
- if (Fire2.CanUse(out act)) return true;
- if (Fire3.CanUse(out act)) return true;
- if (Fire.CanUse(out act)) return true;
- }
- else
- {
- if (Blizzard2.CanUse(out act)) return true;
- if (Blizzard3.CanUse(out act)) return true;
- if (Blizzard.CanUse(out act)) return true;
- }
- return false;
- }
-
- private static bool UsePolyglot(out IAction act, uint gcdCount = 3)
- {
- if (gcdCount == 0 || IsPolyglotStacksMaxed && EnchinaEndAfterGCD(gcdCount))
- {
- if (Foul.CanUse(out act)) return true;
- if (Xenoglossy.CanUse(out act)) return true;
- }
-
- act = null;
- return false;
- }
-
- private bool MaintainStatus(out IAction act)
- {
- act = null;
- if (CombatElapsedLess(6)) return false;
- if (UmbralSoul.CanUse(out act)) return true;
- if (InAstralFire && Transpose.CanUse(out act)) return true;
- if (Configs.GetBool("UseTransposeForParadox") &&
- InUmbralIce && !IsParadoxActive && UmbralIceStacks == 3
- && Transpose.CanUse(out act)) return true;
-
- return false;
- }
-
- [RotationDesc(ActionID.BetweenTheLines, ActionID.LeyLines)]
- protected override bool HealSingleAbility(byte abilitiesRemaining, out IAction act)
- {
- if (BetweenTheLines.CanUse(out act)) return true;
- if (LeyLines.CanUse(out act, CanUseOption.MustUse)) return true;
-
- return base.HealSingleAbility(abilitiesRemaining, out act);
- }
-}
diff --git a/RotationSolver.Default/Magical/BLU_Default.cs b/RotationSolver.Default/Magical/BLU_Default.cs
deleted file mode 100644
index 691155c1a..000000000
--- a/RotationSolver.Default/Magical/BLU_Default.cs
+++ /dev/null
@@ -1,457 +0,0 @@
-namespace RotationSolver.Default.Magical;
-
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Magical/BLU_Default.cs")]
-public sealed class BLU_Default : BLU_Base
-{
- public override string GameVersion => "6.18";
-
- public override string RotationName => "Default";
-
- protected override bool CanHealAreaSpell => base.CanHealAreaSpell && BlueId == BLUID.Healer;
- protected override bool CanHealSingleSpell => base.CanHealSingleSpell && BlueId == BLUID.Healer;
-
- protected override IRotationConfigSet CreateConfiguration()
- {
- return base.CreateConfiguration()
- .SetBool("MoonFluteBreak", false, "MoonFlute")
- .SetBool("SingleAOE", true, "Single AOE")
- .SetBool("GamblerKill", false, "Gambler Kill")
- .SetBool("UseFinalSting", false, "Use FinalSting")
- .SetFloat("FinalStingHP", 0, "FinalStingHP");
- }
-
- private bool MoonFluteBreak => Configs.GetBool("MoonFluteBreak");
- private bool UseFinalSting => Configs.GetBool("UseFinalSting");
- private float FinalStingHP => Configs.GetFloat("FinalStingHP");
- ///
- /// 0-70练级,快速练级,滑舌拉怪
- ///
- private bool QuickLevel => false;
- ///
- /// 赌几率秒杀
- ///
- private bool GamblerKill => Configs.GetBool("GamblerKill");
- ///
- /// 单体时是否释放高伤害AOE
- ///
- private bool SingleAOE => Configs.GetBool("SingleAOE");
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- act = null;
- return false;
- }
-
- protected override bool EmergencyAbility(byte abilitiesRemaining, IAction nextGCD, out IAction act)
- {
- if (nextGCD.IsTheSameTo(false, SelfDestruct, FinalSting))
- {
- if (Swiftcast.CanUse(out act)) return true;
- }
- return base.EmergencyAbility(abilitiesRemaining, nextGCD, out act);
- }
-
- protected override bool MoveForwardGCD(out IAction act)
- {
- //正义飞踢
- if (JKick.CanUse(out act, CanUseOption.MustUse)) return true;
- return base.MoveForwardGCD(out act);
- }
-
- protected override bool GeneralGCD(out IAction act)
- {
- act = null;
- //狂战士副作用期间
- if (Player.HasStatus(true, StatusID.WaningNocturne)) return false;
- //鬼宿脚
- if (PhantomFlurry.IsCoolingDown && !PhantomFlurry.ElapsedOneChargeAfter(1) || Player.HasStatus(true, StatusID.PhantomFlurry))
- {
- if (!Player.WillStatusEnd(0.1f, true, StatusID.PhantomFlurry) && Player.WillStatusEnd(1, true, StatusID.PhantomFlurry) && PhantomFlurry2.CanUse(out act, CanUseOption.MustUse)) return true;
- return false;
- }
- //穿甲散弹
- if (Player.HasStatus(true, StatusID.SurpanakhaFury))
- {
- if (Surpanakha.CanUse(out act, CanUseOption.MustUse | CanUseOption.EmptyOrSkipCombo)) return true;
- }
-
- //终极针组合
- if (UseFinalSting && CanUseFinalSting(out act)) return true;
-
- //爆发
- if (MoonFluteBreak && DBlueBreak(out act)) return true;
-
- //高伤害
- if (PrimalSpell(out act)) return true;
- //群体
- if (AreaGCD(out act)) return true;
- //单体填充
- if (SingleGCD(out act)) return true;
-
-
- act = null;
- return false;
- }
-
- protected override bool HealSingleGCD(out IAction act)
- {
- if (BlueId == BLUID.Healer)
- {
- //有某些非常危险的状态。
- if (SpecialType == SpecialCommandType.EsunaStanceNorth && WeakenPeople.Any() || DyingPeople.Any())
- {
- if (Exuviation.CanUse(out act, CanUseOption.MustUse)) return true;
- }
- if (AngelsSnack.CanUse(out act)) return true;
- if (Stotram.CanUse(out act)) return true;
- if (PomCure.CanUse(out act)) return true;
- }
- else
- {
- if (WhiteWind.CanUse(out act, CanUseOption.MustUse)) return true;
- }
-
- return base.HealSingleGCD(out act);
- }
-
- ///
- /// D青爆发
- ///
- ///
- ///
- private bool DBlueBreak(out IAction act)
- {
- if (TripleTrident.OnSlot && TripleTrident.WillHaveOneChargeGCD(OnSlotCount(Whistle, Tingle), 0))
- {
- //口笛
- if (Whistle.CanUse(out act)) return true;
- //哔哩哔哩
- if (!Player.HasStatus(true, StatusID.Tingling)
- && Tingle.CanUse(out act, CanUseOption.MustUse)) return true;
- if (OffGuard.CanUse(out act)) return true;
- //鱼叉
- if (TripleTrident.CanUse(out act, CanUseOption.MustUse)) return true;
- }
-
- if (AllOnSlot(Whistle, FinalSting, BasicInstinct) && UseFinalSting)
- {
- if (Whistle.CanUse(out act)) return true;
- //破防
- if (OffGuard.CanUse(out act)) return true;
- //哔哩哔哩
- if (Tingle.CanUse(out act)) return true;
- }
-
- //月笛
- if (CanUseMoonFlute(out act)) return true;
-
- if (!Player.HasStatus(true, StatusID.WaxingNocturne)) return false;
-
- //月下彼岸花
- if (NightBloom.CanUse(out act, CanUseOption.MustUse)) return true;
- //地火喷发
- if (Eruption.CanUse(out act, CanUseOption.MustUse)) return true;
- //马特拉魔术
- if (MatraMagic.CanUse(out act, CanUseOption.MustUse)) return true;
- //正义飞踢
- if (JKick.CanUse(out act, CanUseOption.MustUse)) return true;
- //捕食
- if (Devour.CanUse(out act, CanUseOption.MustUse)) return true;
- //轰雷
- if (ShockStrike.CanUse(out act, CanUseOption.MustUse)) return true;
- //冰雪乱舞
- if (GlassDance.CanUse(out act, CanUseOption.MustUse)) return true;
- //魔法锤
- if (MagicHammer.CanUse(out act, CanUseOption.MustUse)) return true;
- //穿甲散弹
- if (Surpanakha.CurrentCharges >= 3 && Surpanakha.CanUse(out act, CanUseOption.MustUse | CanUseOption.EmptyOrSkipCombo)) return true;
- //鬼宿脚
- if (PhantomFlurry.CanUse(out act, CanUseOption.MustUse)) return true;
-
- //冰雾
- if (WhiteDeath.CanUse(out act)) return true;
- //如意大旋风
- if (InBurst && !MoonFluteBreak && BothEnds.CanUse(out act, CanUseOption.MustUse)) return true;
- //类星体
- if (Quasar.CanUse(out act, CanUseOption.MustUse)) return true;
- //飞翎雨
- if (FeatherRain.CanUse(out act, CanUseOption.MustUse)) return true;
- //山崩
- if (MountainBuster.CanUse(out act, CanUseOption.MustUse)) return true;
- //冰雪乱舞
- if (MountainBuster.CanUse(out act, CanUseOption.MustUse)) return true;
-
- //音爆
- if (SonicBoom.CanUse(out act)) return true;
-
- return false;
- }
-
-
- ///
- /// 月笛条件
- ///
- ///
- ///
- private bool CanUseMoonFlute(out IAction act)
- {
- if (!MoonFlute.CanUse(out act) && !HasHostilesInRange) return false;
-
- if (Player.HasStatus(true, StatusID.WaxingNocturne)) return false;
-
- if (Player.HasStatus(true, StatusID.Harmonized)) return true;
-
- return false;
- }
-
- ///
- /// 终极针组合
- ///
- ///
- ///
- private bool CanUseFinalSting(out IAction act)
- {
- act = null;
- if (!UseFinalSting) return false;
- if (!FinalSting.CanUse(out _)) return false;
-
- var useFinalSting = Player.HasStatus(true, StatusID.WaxingNocturne, StatusID.Harmonized);
-
- if (AllOnSlot(Whistle, MoonFlute, FinalSting) && !AllOnSlot(BasicInstinct))
- {
- if ((float)Target.CurrentHp / Target.MaxHp > FinalStingHP) return false;
-
- if (Whistle.CanUse(out act)) return true;
- if (MoonFlute.CanUse(out act)) return true;
- if (useFinalSting && FinalSting.CanUse(out act)) return true;
- }
-
- if (AllOnSlot(Whistle, MoonFlute, FinalSting, BasicInstinct))
- {
- //破防
- if (Player.HasStatus(true, StatusID.WaxingNocturne) && OffGuard.CanUse(out act)) return true;
-
- if ((float)Target.CurrentHp / Target.MaxHp > FinalStingHP) return false;
- if (Whistle.CanUse(out act)) return true;
- if (MoonFlute.CanUse(out act)) return true;
- if (useFinalSting && FinalSting.CanUse(out act)) return true;
- }
-
- return false;
- }
-
- ///
- /// 单体GCD填充
- ///
- ///
- ///
- private bool SingleGCD(out IAction act)
- {
- act = null;
- if (Player.HasStatus(true, StatusID.WaxingNocturne)) return false;
-
- //滑舌 +眩晕 0-70练级用
- if (QuickLevel && StickyTongue.CanUse(out act)) return true;
-
- //苦闷之歌
- if (AllOnSlot(Bristle, SongOfTorment) && SongOfTorment.CanUse(out _))
- {
- //怒发冲冠
- if (Bristle.CanUse(out act)) return true;
- if (SongOfTorment.CanUse(out act)) return true;
- }
- if (SongOfTorment.CanUse(out act)) return true;
-
- //复仇冲击
- if (RevengeBlast.CanUse(out act)) return true;
- //赌徒行为
- if (GamblerKill)
- {
- //导弹
- if (Missile.CanUse(out act)) return true;
- //螺旋尾
- if (TailScrew.CanUse(out act)) return true;
- //死亡宣告
- if (Doom.CanUse(out act)) return true;
- }
-
- //锋利菜刀 近战 眩晕增伤
- if (SharpenedKnife.CanUse(out act)) return true;
-
- //吸血 回蓝
- if (Player.CurrentMp < 1000 && BloodDrain.CanUse(out act)) return true;
- //音爆
- if (SonicBoom.CanUse(out act)) return true;
- if (DrillCannons.CanUse(out act, CanUseOption.MustUse)) return true;
- //永恒射线 无法 +眩晕1s
- if (PerpetualRay.CanUse(out act)) return true;
- //深渊贯穿 无物 +麻痹
- if (AbyssalTransfixion.CanUse(out act)) return true;
- //逆流 雷法 +加重
- if (Reflux.CanUse(out act)) return true;
- //水炮
- if (WaterCannon.CanUse(out act)) return true;
-
- //小侦测
- if (CondensedLibra.CanUse(out act)) return true;
-
- //滑舌 +眩晕
- if (StickyTongue.CanUse(out act)) return true;
-
- //投掷沙丁鱼(打断)
- if (FlyingSardine.CanUse(out act)) return true;
-
- return false;
- }
-
- ///
- /// 范围GCD填充
- ///
- ///
- ///
- private bool AreaGCD(out IAction act)
- {
- act = null;
- if (Player.HasStatus(true, StatusID.WaxingNocturne)) return false;
-
- //赌徒行为
- if (GamblerKill)
- {
- //火箭炮
- if (Launcher.CanUse(out act, CanUseOption.MustUse)) return true;
- //5级即死
- if (Level5Death.CanUse(out act, CanUseOption.MustUse)) return true;
- }
-
- if (false)
- {
- if (AcornBomb.CanUse(out act, CanUseOption.MustUse)) return true;
- if (Faze.CanUse(out act, CanUseOption.MustUse)) return true;
- if (Snort.CanUse(out act, CanUseOption.MustUse)) return true;
- if (BadBreath.CanUse(out act, CanUseOption.MustUse)) return true;
- if (Chirp.CanUse(out act, CanUseOption.MustUse)) return true;
- if (Level5Petrify.CanUse(out act, CanUseOption.MustUse)) return true;
- }
-
- //陆行鸟陨石
- if (HasCompanion && ChocoMeteor.CanUse(out act, CanUseOption.MustUse)) return true;
-
- if (HostileTargets.GetObjectInRadius(6).Count() < 3)
- {
- //水力吸引
- if (HydroPull.CanUse(out act)) return true;
- }
-
- //寒冰咆哮
- if (TheRamVoice.CanUse(out act)) return true;
-
- //超振动
- if (!IsMoving && Target.HasStatus(false, StatusID.DeepFreeze) && TheRamVoice.CanUse(out act)) return true;
-
- //雷电咆哮
- if (TheDragonVoice.CanUse(out act)) return true;
-
- //冰焰
- if (Blaze.CanUse(out act)) return true;
- if (FeculentFlood.CanUse(out act)) return true;
- //火炎放射
- if (FlameThrower.CanUse(out act)) return true;
- //水流吐息
- if (AquaBreath.CanUse(out act)) return true;
- //高压电流
- if (HighVoltage.CanUse(out act)) return true;
- //怒视
- if (Glower.CanUse(out act)) return true;
- //平原震裂
- if (PlainCracker.CanUse(out act)) return true;
- //诡异视线
- if (TheLook.CanUse(out act)) return true;
- //喷墨
- if (InkJet.CanUse(out act)) return true;
- if (FireAngon.CanUse(out act)) return true;
- if (MindBlast.CanUse(out act)) return true;
- if (AlpineDraft.CanUse(out act)) return true;
- if (ProteanWave.CanUse(out act)) return true;
- if (Northerlies.CanUse(out act)) return true;
- if (Electrogenesis.CanUse(out act)) return true;
- if (WhiteKnightsTour.CanUse(out act)) return true;
- if (BlackKnightsTour.CanUse(out act)) return true;
- if (Tatamigaeshi.CanUse(out act)) return true;
-
- if (MustardBomb.CanUse(out act)) return true;
- if (AetherialSpark.CanUse(out act)) return true;
- if (MaledictionOfWater.CanUse(out act)) return true;
- if (FlyingFrenzy.CanUse(out act)) return true;
- if (DrillCannons.CanUse(out act)) return true;
- if (Weight4Tonze.CanUse(out act)) return true;
- if (Needles1000.CanUse(out act)) return true;
- if (Kaltstrahl.CanUse(out act)) return true;
- if (PeripheralSynthesis.CanUse(out act)) return true;
- if (FlameThrower.CanUse(out act)) return true;
- if (FlameThrower.CanUse(out act)) return true;
- if (SaintlyBeam.CanUse(out act)) return true;
-
- return false;
- }
-
- ///
- /// 有CD的技能
- ///
- ///
- ///
- private bool PrimalSpell(out IAction act)
- {
- act = null;
- if (Player.HasStatus(true, StatusID.WaxingNocturne)) return false;
-
- //冰雾
- if (WhiteDeath.CanUse(out act)) return true;
- //玄天武水壁
- if (DivineCataract.CanUse(out act)) return true;
-
- //斗灵弹
- if (TheRoseOfDestruction.CanUse(out act)) return true;
-
- //渔叉三段
- if (InBurst && !MoonFluteBreak && TripleTrident.CanUse(out act)) return true;
- //马特拉魔术
- if (InBurst && !MoonFluteBreak && MatraMagic.CanUse(out act)) return true;
-
- //捕食
- if (Devour.CanUse(out act)) return true;
- //魔法锤
- //if (MagicHammer.ShouldUse(out act)) return true;
-
- var option = SingleAOE ? CanUseOption.MustUse : CanUseOption.None;
- //月下彼岸花
- if (InBurst && !MoonFluteBreak && NightBloom.CanUse(out act, option)) return true;
- //如意大旋风
- if (InBurst && !MoonFluteBreak && BothEnds.CanUse(out act, option)) return true;
-
- //穿甲散弹
- if (InBurst && !MoonFluteBreak && Surpanakha.CurrentCharges >= 3 && Surpanakha.CanUse(out act, option | CanUseOption.EmptyOrSkipCombo)) return true;
-
- //类星体
- if (Quasar.CanUse(out act, option)) return true;
- //正义飞踢
- if (!IsMoving && JKick.CanUse(out act, option)) return true;
-
- //地火喷发
- if (Eruption.CanUse(out act, option)) return true;
- //飞翎雨
- if (FeatherRain.CanUse(out act, option)) return true;
-
- //轰雷
- if (ShockStrike.CanUse(out act, option)) return true;
- //山崩
- if (MountainBuster.CanUse(out act, option)) return true;
-
- //冰雪乱舞
- if (MountainBuster.CanUse(out act, option)) return true;
-
- //if (MountainBuster.ShouldUse(out act, option)) return true;
-
-
- return false;
- }
-}
diff --git a/RotationSolver.Default/Magical/RDM_Default.cs b/RotationSolver.Default/Magical/RDM_Default.cs
deleted file mode 100644
index b1cd297ff..000000000
--- a/RotationSolver.Default/Magical/RDM_Default.cs
+++ /dev/null
@@ -1,160 +0,0 @@
-namespace RotationSolver.Default.Magical;
-
-[RotationDesc(ActionID.Embolden)]
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Magical/RDM_Default.cs")]
-[LinkDescription("https://www.thebalanceffxiv.com/img/jobs/rdm/rdm_ew_opener.png")]
-public sealed class RDM_Default : RDM_Base
-{
- public override string GameVersion => "6.31";
-
- public override string RotationName => "Standard";
-
- public bool CanStartMeleeCombo
- {
- get
- {
- if (Player.HasStatus(true, StatusID.Manafication, StatusID.Embolden) ||
- BlackMana == 100 || WhiteMana == 100) return true;
-
- //ħԪû£ҪСħԪ
- if (BlackMana == WhiteMana) return false;
-
- else if (WhiteMana < BlackMana)
- {
- if (Player.HasStatus(true, StatusID.VerstoneReady)) return false;
- }
- else
- {
- if (Player.HasStatus(true, StatusID.VerfireReady)) return false;
- }
-
- if (Player.HasStatus(true, Vercure.StatusProvide)) return false;
-
- //Waiting for embolden.
- if (Embolden.EnoughLevel && Embolden.WillHaveOneChargeGCD(5)) return false;
-
- return true;
- }
- }
-
- protected override IRotationConfigSet CreateConfiguration()
- {
- return base.CreateConfiguration()
- .SetBool("UseVercure", true, "Use Vercure for Dualcast");
- }
-
- protected override IAction CountDownAction(float remainTime)
- {
- if (remainTime < Verthunder.CastTime + Service.Config.CountDownAhead
- && Verthunder.CanUse(out var act)) return act;
-
- //Remove Swift
- StatusHelper.StatusOff(StatusID.DualCast);
- StatusHelper.StatusOff(StatusID.Acceleration);
- StatusHelper.StatusOff(StatusID.SwiftCast);
-
- return base.CountDownAction(remainTime);
- }
-
- protected override bool GeneralGCD(out IAction act)
- {
- act = null;
- if (ManaStacks == 3) return false;
-
- if (!Verthunder2.CanUse(out _))
- {
- if (Verfire.CanUse(out act)) return true;
- if (Verstone.CanUse(out act)) return true;
- }
-
- if (Scatter.CanUse(out act)) return true;
- if (WhiteMana < BlackMana)
- {
- if (Veraero2.CanUse(out act) && BlackMana - WhiteMana != 5) return true;
- if (Veraero.CanUse(out act) && BlackMana - WhiteMana != 6) return true;
- }
- if (Verthunder2.CanUse(out act)) return true;
- if (Verthunder.CanUse(out act)) return true;
-
- if (Jolt.CanUse(out act)) return true;
-
- if (Configs.GetBool("UseVercure") && Vercure.CanUse(out act)) return true;
-
- return false;
- }
-
- protected override bool EmergencyGCD(out IAction act)
- {
- if (ManaStacks == 3)
- {
- if (BlackMana > WhiteMana)
- {
- if (Verholy.CanUse(out act, CanUseOption.MustUse)) return true;
- }
- if (Verflare.CanUse(out act, CanUseOption.MustUse)) return true;
- }
-
- if (Resolution.CanUse(out act, CanUseOption.MustUse)) return true;
- if (Scorch.CanUse(out act, CanUseOption.MustUse)) return true;
-
-
- if (IsLastGCD(true, Moulinet) && Moulinet.CanUse(out act, CanUseOption.MustUse)) return true;
- if (Zwerchhau.CanUse(out act)) return true;
- if (Redoublement.CanUse(out act)) return true;
-
- if (!CanStartMeleeCombo) return false;
-
- if (Moulinet.CanUse(out act))
- {
- if (BlackMana >= 60 && WhiteMana >= 60) return true;
- }
- else
- {
- if (BlackMana >= 50 && WhiteMana >= 50 && Riposte.CanUse(out act)) return true;
- }
- if (ManaStacks > 0 && Riposte.CanUse(out act)) return true;
-
- return false;
- }
-
- protected override bool EmergencyAbility(byte abilityRemain, IAction nextGCD, out IAction act)
- {
- act = null;
- if (CombatElapsedLess(4)) return false;
-
- if (InBurst && Embolden.CanUse(out act, CanUseOption.MustUse)) return true;
-
- //Use Manafication after embolden.
- if ((Player.HasStatus(true, StatusID.Embolden) || IsLastAbility(ActionID.Embolden))
- && Manafication.CanUse(out act)) return true;
-
- act = null;
- return false;
- }
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- //Swift
- if (ManaStacks == 0 && (BlackMana < 50 || WhiteMana < 50)
- && (CombatElapsedLess(4) || !Manafication.EnoughLevel || !Manafication.WillHaveOneChargeGCD(0, 1)))
- {
- if (!Player.HasStatus(true, StatusID.VerfireReady, StatusID.VerstoneReady))
- {
- if (Swiftcast.CanUse(out act)) return true;
- if (InCombat && Acceleration.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
- }
- }
-
- if (InBurst && UseBurstMedicine(out act)) return true;
-
- //Attack abilities.
- if (ContreSixte.CanUse(out act, CanUseOption.MustUse)) return true;
- if (Fleche.CanUse(out act)) return true;
-
- if (Engagement.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
- if (CorpsACorps.CanUse(out act, CanUseOption.MustUse) && !IsMoving) return true;
-
- return false;
- }
-}
-
diff --git a/RotationSolver.Default/Magical/SMN_Default.cs b/RotationSolver.Default/Magical/SMN_Default.cs
deleted file mode 100644
index cb7ea38c6..000000000
--- a/RotationSolver.Default/Magical/SMN_Default.cs
+++ /dev/null
@@ -1,170 +0,0 @@
-namespace RotationSolver.Default.Magical;
-
-[BetaRotation]
-[RotationDesc(ActionID.SearingLight)]
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Magical/SMN_Default.cs")]
-[LinkDescription("https://www.thebalanceffxiv.com/img/jobs/smn/6.png")]
-public sealed class SMN_Default : SMN_Base
-{
- public override string GameVersion => "6.38";
-
- public override string RotationName => "General purpose";
-
- public override string Description => "Beta for testing...";
-
- protected override IRotationConfigSet CreateConfiguration()
- {
- return base.CreateConfiguration()
- .SetCombo("addSwiftcast", 0, "Use Swiftcast", "No", "Wind", "Fire", "All")
- .SetCombo("SummonOrder", 0, "Order", "Soil-Wind-Fire", "Soil-Fire-Wind", "Wind-Soil-Fire")
- .SetBool("addCrimsonCyclone", true, "Auto CrimsonCyclon");
- }
-
- protected override bool CanHealSingleSpell => false;
-
- [RotationDesc(ActionID.CrimsonCyclone)]
- protected override bool MoveForwardGCD(out IAction act)
- {
- //火神突进
- if (CrimsonCyclone.CanUse(out act, CanUseOption.MustUse)) return true;
- return base.MoveForwardGCD(out act);
- }
-
- protected override bool GeneralGCD(out IAction act)
- {
- //宝石兽召唤
- if (SummonCarbuncle.CanUse(out act)) return true;
-
- //风神读条
- if (Slipstream.CanUse(out act, CanUseOption.MustUse)) return true;
- //火神冲锋
- if (CrimsonStrike.CanUse(out act, CanUseOption.MustUse)) return true;
-
- //AOE
- if (PreciousBrilliance.CanUse(out act)) return true;
- //单体
- if (Gemshine.CanUse(out act)) return true;
-
- if (!IsMoving && Configs.GetBool("addCrimsonCyclone") && CrimsonCyclone.CanUse(out act, CanUseOption.MustUse)) return true;
-
- //龙神不死鸟
- if ((Player.HasStatus(false, StatusID.SearingLight) || SearingLight.IsCoolingDown) && SummonBahamut.CanUse(out act)) return true;
- if (!SummonBahamut.EnoughLevel && HasHostilesInRange && AetherCharge.CanUse(out act)) return true;
-
- //毁4
- if (IsMoving && (Player.HasStatus(true, StatusID.GarudasFavor) || InIfrit)
- && !Player.HasStatus(true, StatusID.SwiftCast) && !InBahamut && !InPhoenix
- && RuinIV.CanUse(out act, CanUseOption.MustUse)) return true;
-
- //召唤蛮神
- switch (Configs.GetCombo("SummonOrder"))
- {
- default:
- //土
- if (SummonTopaz.CanUse(out act)) return true;
- //风
- if (SummonEmerald.CanUse(out act)) return true;
- //火
- if (SummonRuby.CanUse(out act)) return true;
- break;
-
- case 1:
- //土
- if (SummonTopaz.CanUse(out act)) return true;
- //火
- if (SummonRuby.CanUse(out act)) return true;
- //风
- if (SummonEmerald.CanUse(out act)) return true;
- break;
-
- case 2:
- //风
- if (SummonEmerald.CanUse(out act)) return true;
- //土
- if (SummonTopaz.CanUse(out act)) return true;
- //火
- if (SummonRuby.CanUse(out act)) return true;
- break;
- }
- if (SummonTimerRemaining == 0 && AttunmentTimerRemaining == 0 &&
- !Player.HasStatus(true, StatusID.SwiftCast) && !InBahamut && !InPhoenix &&
- RuinIV.CanUse(out act, CanUseOption.MustUse)) return true;
- //迸裂三灾
- if (Outburst.CanUse(out act)) return true;
-
- //毁123
- if (Ruin.CanUse(out act)) return true;
- return false;
- }
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- if (InBurst && !Player.HasStatus(false, StatusID.SearingLight))
- {
- //灼热之光
- if (SearingLight.CanUse(out act)) return true;
- }
-
- //龙神不死鸟迸发
- if ((InBahamut && SummonBahamut.ElapsedOneChargeAfterGCD(3) || InPhoenix || IsTargetBoss && IsTargetDying) && EnkindleBahamut.CanUse(out act, CanUseOption.MustUse)) return true;
- //死星核爆
- if ((SummonBahamut.ElapsedOneChargeAfterGCD(3) || IsTargetBoss && IsTargetDying) && DeathFlare.CanUse(out act, CanUseOption.MustUse)) return true;
- //苏生之炎
- if (Rekindle.CanUse(out act, CanUseOption.MustUse)) return true;
- //山崩
- if (MountainBuster.CanUse(out act, CanUseOption.MustUse)) return true;
-
- //痛苦核爆
- if ((Player.HasStatus(false, StatusID.SearingLight) && InBahamut && (SummonBahamut.ElapsedOneChargeAfterGCD(3) || !EnergyDrain.IsCoolingDown) ||
- !SearingLight.EnoughLevel || IsTargetBoss && IsTargetDying) && PainFlare.CanUse(out act)) return true;
- //溃烂爆发
- if ((Player.HasStatus(false, StatusID.SearingLight) && InBahamut && (SummonBahamut.ElapsedOneChargeAfterGCD(3) || !EnergyDrain.IsCoolingDown) ||
- !SearingLight.EnoughLevel || IsTargetBoss && IsTargetDying) && Fester.CanUse(out act)) return true;
-
- //能量抽取
- if (EnergySiphon.CanUse(out act)) return true;
- //能量吸收
- if (EnergyDrain.CanUse(out act)) return true;
-
- return false;
- }
- protected override bool EmergencyAbility(byte abilitiesRemaining, IAction nextGCD, out IAction act)
- {
- //即刻进循环
- switch (Configs.GetCombo("addSwiftcast"))
- {
- default:
- break;
- case 1:
- if (nextGCD.IsTheSameTo(true, Slipstream) || Attunement == 0 && Player.HasStatus(true, StatusID.GarudasFavor))
- {
- if (Swiftcast.CanUse(out act, CanUseOption.MustUse)) return true;
- }
- break;
- case 2:
- if (InIfrit && (nextGCD.IsTheSameTo(true, Gemshine, PreciousBrilliance) || IsMoving))
- {
- if (Swiftcast.CanUse(out act, CanUseOption.MustUse)) return true;
- }
- break;
-
- case 3:
- if (nextGCD.IsTheSameTo(true, Slipstream) || Attunement == 0 && Player.HasStatus(true, StatusID.GarudasFavor) ||
- InIfrit && (nextGCD.IsTheSameTo(true, Gemshine, PreciousBrilliance) || IsMoving))
- {
- if (Swiftcast.CanUse(out act, CanUseOption.MustUse)) return true;
- }
- break;
- }
- return base.EmergencyAbility(abilitiesRemaining, nextGCD, out act);
- }
-
- protected override IAction CountDownAction(float remainTime)
- {
- if (remainTime <= 30 && SummonCarbuncle.CanUse(out _)) return SummonCarbuncle;
- //1.5s预读毁3
- if (remainTime <= Ruin.CastTime + Service.Config.CountDownAhead
- && Ruin.CanUse(out _)) return Ruin;
- return base.CountDownAction(remainTime);
- }
-}
diff --git a/RotationSolver.Default/Magical/SMN_Old.cs b/RotationSolver.Default/Magical/SMN_Old.cs
deleted file mode 100644
index 3c96e2fc7..000000000
--- a/RotationSolver.Default/Magical/SMN_Old.cs
+++ /dev/null
@@ -1,167 +0,0 @@
-namespace RotationSolver.Default.Magical;
-
-[RotationDesc(ActionID.SearingLight)]
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Magical/SMN_Old.cs")]
-
-public sealed class SMN_Old : SMN_Base
-{
- public override string GameVersion => "6.28";
-
- public override string RotationName => "Old";
-
- protected override IRotationConfigSet CreateConfiguration()
- {
- return base.CreateConfiguration()
- .SetCombo("addSwiftcast", 0, "Use Swiftcast", "No", "Wind", "Fire", "All")
- .SetCombo("SummonOrder", 0, "Order", "Soil-Wind-Fire", "Soil-Fire-Wind", "Wind-Soil-Fire")
- .SetBool("addCrimsonCyclone", true, "Auto CrimsonCyclon");
- }
-
- protected override bool CanHealSingleSpell => false;
-
- [RotationDesc(ActionID.CrimsonCyclone)]
- protected override bool MoveForwardGCD(out IAction act)
- {
- //火神突进
- if (CrimsonCyclone.CanUse(out act, CanUseOption.MustUse)) return true;
- return base.MoveForwardGCD(out act);
- }
-
- protected override bool GeneralGCD(out IAction act)
- {
- //宝石兽召唤
- if (SummonCarbuncle.CanUse(out act)) return true;
-
- //风神读条
- if (Slipstream.CanUse(out act, CanUseOption.MustUse)) return true;
- //火神冲锋
- if (CrimsonStrike.CanUse(out act, CanUseOption.MustUse)) return true;
-
- //AOE
- if (PreciousBrilliance.CanUse(out act)) return true;
- //单体
- if (Gemshine.CanUse(out act)) return true;
-
- if (!IsMoving && Configs.GetBool("addCrimsonCyclone") && CrimsonCyclone.CanUse(out act, CanUseOption.MustUse)) return true;
-
- //龙神不死鸟
- if ((Player.HasStatus(false, StatusID.SearingLight) || SearingLight.IsCoolingDown) && SummonBahamut.CanUse(out act)) return true;
- if (!SummonBahamut.EnoughLevel && HasHostilesInRange && AetherCharge.CanUse(out act)) return true;
-
- //毁4
- if (IsMoving && (Player.HasStatus(true, StatusID.GarudasFavor) || InIfrit)
- && !Player.HasStatus(true, StatusID.SwiftCast) && !InBahamut && !InPhoenix
- && RuinIV.CanUse(out act, CanUseOption.MustUse)) return true;
-
- //召唤蛮神
- switch (Configs.GetCombo("SummonOrder"))
- {
- default:
- //土
- if (SummonTopaz.CanUse(out act)) return true;
- //风
- if (SummonEmerald.CanUse(out act)) return true;
- //火
- if (SummonRuby.CanUse(out act)) return true;
- break;
-
- case 1:
- //土
- if (SummonTopaz.CanUse(out act)) return true;
- //火
- if (SummonRuby.CanUse(out act)) return true;
- //风
- if (SummonEmerald.CanUse(out act)) return true;
- break;
-
- case 2:
- //风
- if (SummonEmerald.CanUse(out act)) return true;
- //土
- if (SummonTopaz.CanUse(out act)) return true;
- //火
- if (SummonRuby.CanUse(out act)) return true;
- break;
- }
- if (SummonTimerRemaining == 0 && AttunmentTimerRemaining == 0 &&
- !Player.HasStatus(true, StatusID.SwiftCast) && !InBahamut && !InPhoenix &&
- RuinIV.CanUse(out act, CanUseOption.MustUse)) return true;
- //迸裂三灾
- if (Outburst.CanUse(out act)) return true;
-
- //毁123
- if (Ruin.CanUse(out act)) return true;
- return false;
- }
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- if (InBurst && !Player.HasStatus(false, StatusID.SearingLight))
- {
- //灼热之光
- if (SearingLight.CanUse(out act)) return true;
- }
-
- //龙神不死鸟迸发
- if ((InBahamut && SummonBahamut.ElapsedOneChargeAfterGCD(3) || InPhoenix || IsTargetBoss && IsTargetDying) && EnkindleBahamut.CanUse(out act, CanUseOption.MustUse)) return true;
- //死星核爆
- if ((SummonBahamut.ElapsedOneChargeAfterGCD(3) || IsTargetBoss && IsTargetDying) && DeathFlare.CanUse(out act, CanUseOption.MustUse)) return true;
- //苏生之炎
- if (Rekindle.CanUse(out act, CanUseOption.MustUse)) return true;
- //山崩
- if (MountainBuster.CanUse(out act, CanUseOption.MustUse)) return true;
-
- //痛苦核爆
- if ((Player.HasStatus(false, StatusID.SearingLight) && InBahamut && (SummonBahamut.ElapsedOneChargeAfterGCD(3) || !EnergyDrain.IsCoolingDown) ||
- !SearingLight.EnoughLevel || IsTargetBoss && IsTargetDying) && PainFlare.CanUse(out act)) return true;
- //溃烂爆发
- if ((Player.HasStatus(false, StatusID.SearingLight) && InBahamut && (SummonBahamut.ElapsedOneChargeAfterGCD(3) || !EnergyDrain.IsCoolingDown) ||
- !SearingLight.EnoughLevel || IsTargetBoss && IsTargetDying) && Fester.CanUse(out act)) return true;
-
- //能量抽取
- if (EnergySiphon.CanUse(out act)) return true;
- //能量吸收
- if (EnergyDrain.CanUse(out act)) return true;
-
- return false;
- }
- protected override bool EmergencyAbility(byte abilitiesRemaining, IAction nextGCD, out IAction act)
- {
- //即刻进循环
- switch (Configs.GetCombo("addSwiftcast"))
- {
- default:
- break;
- case 1:
- if (nextGCD.IsTheSameTo(true, Slipstream) || Attunement == 0 && Player.HasStatus(true, StatusID.GarudasFavor))
- {
- if (Swiftcast.CanUse(out act, CanUseOption.MustUse)) return true;
- }
- break;
- case 2:
- if (InIfrit && (nextGCD.IsTheSameTo(true, Gemshine, PreciousBrilliance) || IsMoving))
- {
- if (Swiftcast.CanUse(out act, CanUseOption.MustUse)) return true;
- }
- break;
-
- case 3:
- if (nextGCD.IsTheSameTo(true, Slipstream) || Attunement == 0 && Player.HasStatus(true, StatusID.GarudasFavor) ||
- InIfrit && (nextGCD.IsTheSameTo(true, Gemshine, PreciousBrilliance) || IsMoving))
- {
- if (Swiftcast.CanUse(out act, CanUseOption.MustUse)) return true;
- }
- break;
- }
- return base.EmergencyAbility(abilitiesRemaining, nextGCD, out act);
- }
-
- protected override IAction CountDownAction(float remainTime)
- {
- if (remainTime <= 30 && SummonCarbuncle.CanUse(out _)) return SummonCarbuncle;
- //1.5s预读毁3
- if (remainTime <= Ruin.CastTime + Service.Config.CountDownAhead
- && Ruin.CanUse(out _)) return Ruin;
- return base.CountDownAction(remainTime);
- }
-}
diff --git a/RotationSolver.Default/Melee/DRG_Default.cs b/RotationSolver.Default/Melee/DRG_Default.cs
deleted file mode 100644
index 86674694e..000000000
--- a/RotationSolver.Default/Melee/DRG_Default.cs
+++ /dev/null
@@ -1,141 +0,0 @@
-namespace RotationSolver.Default.Melee;
-
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Melee/DRG_Default.cs")]
-public sealed class DRG_Default : DRG_Base
-{
- public override string GameVersion => "6.18";
-
- public override string RotationName => "Default";
-
- protected override IRotationConfigSet CreateConfiguration()
- {
- return base.CreateConfiguration().SetBool("DRG_ShouldDelay", true, "Delay the dragon?")
- .SetBool("DRG_Opener", false, "Opener in lv.88")
- .SetBool("DRG_SafeMove", true, "Moving save");
- }
-
- [RotationDesc(ActionID.SpineShatterDive, ActionID.DragonFireDive)]
- protected override bool MoveForwardAbility(byte abilitiesRemaining, out IAction act, CanUseOption option = CanUseOption.None)
- {
- if (abilitiesRemaining > 1)
- {
-
- if (SpineShatterDive.CanUse(out act, CanUseOption.EmptyOrSkipCombo | option)) return true;
- if (DragonFireDive.CanUse(out act, CanUseOption.MustUse | CanUseOption.EmptyOrSkipCombo | option)) return true;
- }
-
- act = null;
- return false;
- }
- protected override bool EmergencyAbility(byte abilityRemain, IAction nextGCD, out IAction act)
- {
- if (nextGCD.IsTheSameTo(true, FullThrust, CoerthanTorment)
- || Player.HasStatus(true, StatusID.LanceCharge) && nextGCD.IsTheSameTo(false, FangandClaw))
- {
- //
- if (abilityRemain == 1 && LifeSurge.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
- }
-
- return base.EmergencyAbility(abilityRemain, nextGCD, out act);
- }
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- if (InBurst)
- {
- //ǹ
- if (LanceCharge.CanUse(out act, CanUseOption.MustUse))
- {
- if (abilitiesRemaining == 1 && !Player.HasStatus(true, StatusID.PowerSurge)) return true;
- if (Player.HasStatus(true, StatusID.PowerSurge)) return true;
- }
-
- //
- if (DragonSight.CanUse(out act, CanUseOption.MustUse)) return true;
-
- //ս
- if (BattleLitany.CanUse(out act, CanUseOption.MustUse)) return true;
- }
-
- //֮
- if (Nastrond.CanUse(out act, CanUseOption.MustUse)) return true;
-
- //dz
- if (StarDiver.CanUse(out act, CanUseOption.MustUse)) return true;
-
- //
- if (HighJump.EnoughLevel)
- {
- if (HighJump.CanUse(out act)) return true;
- }
- else
- {
- if (Jump.CanUse(out act)) return true;
- }
-
- //ԽѪ
- if (Geirskogul.CanUse(out act, CanUseOption.MustUse)) return true;
-
- //
- if (SpineShatterDive.CanUse(out act, CanUseOption.EmptyOrSkipCombo))
- {
- if (Player.HasStatus(true, StatusID.LanceCharge) && LanceCharge.ElapsedOneChargeAfterGCD(3)) return true;
- }
- if (Player.HasStatus(true, StatusID.PowerSurge) && SpineShatterDive.CurrentCharges != 1 && SpineShatterDive.CanUse(out act)) return true;
-
- //
- if (MirageDive.CanUse(out act)) return true;
-
- //׳
- if (DragonFireDive.CanUse(out act, CanUseOption.MustUse))
- {
- if (Player.HasStatus(true, StatusID.LanceCharge) && LanceCharge.ElapsedOneChargeAfterGCD(3)) return true;
- }
-
- //㾦
- if (WyrmwindThrust.CanUse(out act, CanUseOption.MustUse)) return true;
-
- return false;
- }
-
- protected override bool GeneralGCD(out IAction act)
- {
- #region Ⱥ
- if (CoerthanTorment.CanUse(out act)) return true;
- if (SonicThrust.CanUse(out act)) return true;
- if (DoomSpike.CanUse(out act)) return true;
-
- #endregion
-
- #region
- if (Configs.GetBool("ShouldDelay"))
- {
- if (WheelingThrust.CanUse(out act)) return true;
- if (FangandClaw.CanUse(out act)) return true;
- }
- else
- {
- if (FangandClaw.CanUse(out act)) return true;
- if (WheelingThrust.CanUse(out act)) return true;
- }
-
- if (FullThrust.CanUse(out act)) return true;
- if (ChaosThrust.CanUse(out act)) return true;
-
- //ǷҪBuff
- if (Player.WillStatusEndGCD(5, 0, true, StatusID.PowerSurge))
- {
- if (Disembowel.CanUse(out act)) return true;
- }
-
- if (VorpalThrust.CanUse(out act)) return true;
- if (TrueThrust.CanUse(out act)) return true;
-
- if (SpecialType == SpecialCommandType.MoveForward && MoveForwardAbility(1, out act)) return true;
- if (PiercingTalon.CanUse(out act)) return true;
-
- return false;
-
- #endregion
- }
-}
diff --git a/RotationSolver.Default/Melee/MNK_Default.cs b/RotationSolver.Default/Melee/MNK_Default.cs
deleted file mode 100644
index 119ba90f3..000000000
--- a/RotationSolver.Default/Melee/MNK_Default.cs
+++ /dev/null
@@ -1,209 +0,0 @@
-namespace RotationSolver.Default.Melee;
-
-[RotationDesc(ActionID.RiddleOfFire)]
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Melee/MNK_Default.cs")]
-[LinkDescription("https://i.imgur.com/C5lQhpe.png")]
-public sealed class MNK_Default : MNK_Base
-{
- public override string GameVersion => "6.35";
-
- public override string RotationName => "Lunar Solar";
-
- protected override IRotationConfigSet CreateConfiguration()
- {
- return base.CreateConfiguration().SetBool("AutoFormShift", true, "Auto use FormShift");
- }
-
- protected override IAction CountDownAction(float remainTime)
- {
- if (remainTime < 0.2)
- {
- if (Thunderclap.CanUse(out var act, CanUseOption.MustUse | CanUseOption.EmptyOrSkipCombo)) return act;
- if (Thunderclap.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return act;
- }
- if (remainTime < 15)
- {
- if (Chakra < 5 && Meditation.CanUse(out var act)) return act;
- if (FormShift.CanUse(out act)) return act;
- }
-
- return base.CountDownAction(remainTime);
- }
-
- private static bool OpoOpoForm(out IAction act)
- {
- if (ArmOfTheDestroyer.CanUse(out act)) return true;
- if (DragonKick.CanUse(out act)) return true;
- if (BootShine.CanUse(out act)) return true;
- return false;
- }
-
- private static bool UseLunarPerfectBalance => (HasSolar || Player.HasStatus(false, StatusID.PerfectBalance))
- && (!Player.WillStatusEndGCD(0, 0, false, StatusID.RiddleOfFire) || Player.HasStatus(false, StatusID.RiddleOfFire) || RiddleOfFire.WillHaveOneChargeGCD(2)) && PerfectBalance.WillHaveOneChargeGCD(3);
-
- private static bool RaptorForm(out IAction act)
- {
- if (FourPointFury.CanUse(out act)) return true;
- if ((Player.WillStatusEndGCD(3, 0, true, StatusID.DisciplinedFist)
- || Player.WillStatusEndGCD(7, 0, true, StatusID.DisciplinedFist)
- && UseLunarPerfectBalance) && TwinSnakes.CanUse(out act)) return true;
- if (TrueStrike.CanUse(out act)) return true;
- return false;
- }
-
- private static bool CoerlForm(out IAction act)
- {
- if (RockBreaker.CanUse(out act)) return true;
- if (UseLunarPerfectBalance && Demolish.CanUse(out act, CanUseOption.MustUse)
- && (Demolish.Target?.WillStatusEndGCD(7, 0, true, StatusID.Demolish) ?? false)) return true;
- if (Demolish.CanUse(out act)) return true;
- if (SnapPunch.CanUse(out act)) return true;
- return false;
- }
-
- protected override bool GeneralGCD(out IAction act)
- {
- if (PerfectBalanceActions(out act)) return true;
-
-
- if (Player.HasStatus(true, StatusID.CoerlForm))
- {
- if (CoerlForm(out act)) return true;
- }
- if (Player.HasStatus(true, StatusID.RiddleOfFire)
- && !RiddleOfFire.ElapsedAfterGCD(2) && (PerfectBalance.ElapsedAfter(60) || !PerfectBalance.IsCoolingDown))
- {
- if (OpoOpoForm(out act)) return true;
- }
- if (Player.HasStatus(true, StatusID.RaptorForm))
- {
- if (RaptorForm(out act)) return true;
- }
- if (OpoOpoForm(out act)) return true;
-
- if (SpecialType == SpecialCommandType.MoveForward && MoveForwardAbility(1, out act)) return true;
- if (Chakra < 5 && Meditation.CanUse(out act)) return true;
- if (Configs.GetBool("AutoFormShift") && FormShift.CanUse(out act)) return true;
-
- return false;
- }
-
- static bool PerfectBalanceActions(out IAction act)
- {
- if (!BeastChakras.Contains(BeastChakra.NONE))
- {
- if (HasSolar && HasLunar)
- {
- if (PhantomRush.CanUse(out act, CanUseOption.MustUse)) return true;
- if (TornadoKick.CanUse(out act, CanUseOption.MustUse)) return true;
- }
- if (BeastChakras.Contains(BeastChakra.RAPTOR))
- {
- if (RisingPhoenix.CanUse(out act, CanUseOption.MustUse)) return true;
- if (FlintStrike.CanUse(out act, CanUseOption.MustUse)) return true;
- }
- else
- {
- if (ElixirField.CanUse(out act, CanUseOption.MustUse)) return true;
- }
- }
- else if (Player.HasStatus(true, StatusID.PerfectBalance) && ElixirField.EnoughLevel)
- {
- //Sometimes, no choice
- if (HasSolar || BeastChakras.Count(c => c == BeastChakra.OPOOPO) > 1)
- {
- if (LunarNadi(out act)) return true;
- }
- else if (BeastChakras.Contains(BeastChakra.COEURL) || BeastChakras.Contains(BeastChakra.RAPTOR))
- {
- if (SolarNadi(out act)) return true;
- }
-
- //Add status when solar.
- if (Player.WillStatusEndGCD(3, 0, true, StatusID.DisciplinedFist)
- || Target.WillStatusEndGCD(3, 0, true, StatusID.Demolish))
- {
- if (SolarNadi(out act)) return true;
- }
- if (LunarNadi(out act)) return true;
- }
-
- act = null;
- return false;
- }
-
- static bool LunarNadi(out IAction act)
- {
- if (OpoOpoForm(out act)) return true;
- return false;
- }
-
- static bool SolarNadi(out IAction act)
- {
- //Emergency usage of status.
- if (!BeastChakras.Contains(BeastChakra.RAPTOR)
- && HasLunar
- && Player.WillStatusEndGCD(1, 0, true, StatusID.DisciplinedFist))
- {
- if (RaptorForm(out act)) return true;
- }
- if (!BeastChakras.Contains(BeastChakra.COEURL)
- && Target.WillStatusEndGCD(1, 0, true, StatusID.Demolish))
- {
- if (CoerlForm(out act)) return true;
- }
-
- if (!BeastChakras.Contains(BeastChakra.OPOOPO))
- {
- if (OpoOpoForm(out act)) return true;
- }
- if (HasLunar && !BeastChakras.Contains(BeastChakra.RAPTOR))
- {
- if (RaptorForm(out act)) return true;
- }
- if (!BeastChakras.Contains(BeastChakra.COEURL))
- {
- if (CoerlForm(out act)) return true;
- }
- if (!BeastChakras.Contains(BeastChakra.RAPTOR))
- {
- if (RaptorForm(out act)) return true;
- }
-
- return CoerlForm(out act);
- }
-
- protected override bool EmergencyAbility(byte abilitiesRemaining, IAction nextGCD, out IAction act)
- {
- if (abilitiesRemaining == 1 && InCombat)
- {
- if (UseBurstMedicine(out act)) return true;
- if (InBurst && !CombatElapsedLessGCD(2) && RiddleOfFire.CanUse(out act)) return true;
- }
- return base.EmergencyAbility(abilitiesRemaining, nextGCD, out act);
- }
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- act = null;
-
- if (CombatElapsedLessGCD(3)) return false;
-
- if (BeastChakras.Contains(BeastChakra.NONE) && Player.HasStatus(true, StatusID.RaptorForm)
- && (!RiddleOfFire.EnoughLevel || Player.HasStatus(false, StatusID.RiddleOfFire) && !Player.WillStatusEndGCD(3, 0, false, StatusID.RiddleOfFire)
- || RiddleOfFire.WillHaveOneChargeGCD(1) && (PerfectBalance.ElapsedAfter(60) || !PerfectBalance.IsCoolingDown)))
- {
- if (PerfectBalance.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
- }
-
- if (Brotherhood.CanUse(out act)) return true;
-
- if (HowlingFist.CanUse(out act)) return true;
- if (SteelPeak.CanUse(out act)) return true;
- if (HowlingFist.CanUse(out act, CanUseOption.MustUse)) return true;
-
- if (RiddleOfWind.CanUse(out act)) return true;
-
- return false;
- }
-}
diff --git a/RotationSolver.Default/Melee/MNK_Old.cs b/RotationSolver.Default/Melee/MNK_Old.cs
deleted file mode 100644
index a4bd90daf..000000000
--- a/RotationSolver.Default/Melee/MNK_Old.cs
+++ /dev/null
@@ -1,149 +0,0 @@
-namespace RotationSolver.Old.Melee;
-
-[RotationDesc(ActionID.RiddleOfFire)]
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Melee/MNK_Old.cs")]
-public sealed class MNK_Old : MNK_Base
-{
- public override string GameVersion => "6.0";
-
- public override string RotationName => "Old";
-
- protected override IRotationConfigSet CreateConfiguration()
- {
- return base.CreateConfiguration().SetBool("AutoFormShift", true, "Auto use FormShift");
- }
-
- private bool OpoOpoForm(out IAction act)
- {
- if (ArmOfTheDestroyer.CanUse(out act)) return true;
- if (DragonKick.CanUse(out act)) return true;
- if (BootShine.CanUse(out act)) return true;
- return false;
- }
-
- private bool RaptorForm(out IAction act)
- {
- if (FourPointFury.CanUse(out act)) return true;
-
- if (Player.WillStatusEndGCD(3, 0, true, StatusID.DisciplinedFist) && TwinSnakes.CanUse(out act)) return true;
-
- if (TrueStrike.CanUse(out act)) return true;
- return false;
- }
-
- private bool CoerlForm(out IAction act)
- {
- if (RockBreaker.CanUse(out act)) return true;
- if (Demolish.CanUse(out act)) return true;
- if (SnapPunch.CanUse(out act)) return true;
- return false;
- }
-
- private bool LunarNadi(out IAction act)
- {
- if (OpoOpoForm(out act)) return true;
- return false;
- }
-
- private bool SolarNadi(out IAction act)
- {
- if (!BeastChakras.Contains(BeastChakra.RAPTOR))
- {
- if (RaptorForm(out act)) return true;
- }
- else if (!BeastChakras.Contains(BeastChakra.OPOOPO))
- {
- if (OpoOpoForm(out act)) return true;
- }
- else
- {
- if (CoerlForm(out act)) return true;
- }
-
- return false;
- }
-
- protected override bool GeneralGCD(out IAction act)
- {
- //满了的话,放三个大招
- if (!BeastChakras.Contains(BeastChakra.NONE))
- {
- if (HasSolar && HasLunar)
- {
- if (PhantomRush.CanUse(out act, CanUseOption.MustUse)) return true;
- if (TornadoKick.CanUse(out act, CanUseOption.MustUse)) return true;
- }
- if (BeastChakras.Contains(BeastChakra.RAPTOR))
- {
- if (RisingPhoenix.CanUse(out act, CanUseOption.MustUse)) return true;
- if (FlintStrike.CanUse(out act, CanUseOption.MustUse)) return true;
- }
- else
- {
- if (ElixirField.CanUse(out act, CanUseOption.MustUse)) return true;
- }
- }
- //有震脚就阴阳
- else if (Player.HasStatus(true, StatusID.PerfectBalance))
- {
- if (HasSolar && LunarNadi(out act)) return true;
- if (SolarNadi(out act)) return true;
- }
-
- if (Player.HasStatus(true, StatusID.CoerlForm))
- {
- if (CoerlForm(out act)) return true;
- }
- else if (Player.HasStatus(true, StatusID.RaptorForm))
- {
- if (RaptorForm(out act)) return true;
- }
- if (OpoOpoForm(out act)) return true;
-
- if (SpecialType == SpecialCommandType.MoveForward && MoveForwardAbility(1, out act)) return true;
- if (Chakra < 5 && Meditation.CanUse(out act)) return true;
- if (Configs.GetBool("AutoFormShift") && FormShift.CanUse(out act)) return true;
-
- return false;
- }
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- if (InBurst)
- {
- if (RiddleOfFire.CanUse(out act)) return true;
- if (Brotherhood.CanUse(out act)) return true;
- }
-
- //震脚
- if (BeastChakras.Contains(BeastChakra.NONE))
- {
- //有阳斗气
- if (HasSolar)
- {
- //两种Buff都在6s以上
- var dis = Player.WillStatusEndGCD(3, 0, true, StatusID.DisciplinedFist);
-
- Demolish.CanUse(out _);
- var demo = Demolish.Target.WillStatusEndGCD(3, 0, true, StatusID.Demolish);
-
- if (!dis && (!demo || !PerfectBalance.IsCoolingDown))
- {
- if (PerfectBalance.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
- }
- }
- else
- {
- if (PerfectBalance.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
- }
- }
-
- if (RiddleOfWind.CanUse(out act)) return true;
-
- if (HowlingFist.CanUse(out act)) return true;
- if (SteelPeak.CanUse(out act)) return true;
- if (HowlingFist.CanUse(out act, CanUseOption.MustUse)) return true;
-
- return false;
- }
-}
diff --git a/RotationSolver.Default/Melee/NIN_Default.cs b/RotationSolver.Default/Melee/NIN_Default.cs
deleted file mode 100644
index 3f0e39bcb..000000000
--- a/RotationSolver.Default/Melee/NIN_Default.cs
+++ /dev/null
@@ -1,364 +0,0 @@
-namespace RotationSolver.Default.Melee;
-
-[RotationDesc(ActionID.Mug)]
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Melee/NIN_Default.cs")]
-[LinkDescription("https://www.thebalanceffxiv.com/img/jobs/nin/earlymug3.png")]
-[LinkDescription("https://www.thebalanceffxiv.com/img/jobs/nin/nininfographicwindows.png")]
-[LinkDescription("https://docs.google.com/spreadsheets/u/0/d/1BZZrqWMRrugCeiBICEgjCz2vRNXt_lRTxPnSQr24Em0/htmlview#",
- "Under the “Planner (With sample section)”")]
-public sealed class NIN_Default : NIN_Base
-{
- public override string GameVersion => "6.35";
-
- public override string RotationName => "Standard";
-
- private static INinAction _ninActionAim = null;
- private static bool InTrickAttack => TrickAttack.IsCoolingDown && !TrickAttack.ElapsedAfter(17);
- private static bool InMug => Mug.IsCoolingDown && !Mug.ElapsedAfter(19);
- private static bool NoNinjutsu => AdjustId(ActionID.Ninjutsu) is ActionID.Ninjutsu or ActionID.RabbitMedium;
-
- protected override IRotationConfigSet CreateConfiguration()
- {
- return base.CreateConfiguration()
- .SetBool("UseHide", true, "Use hide")
- .SetBool("AutoUnhide", true, "Auto Unhide.");
- }
-
- protected override IAction CountDownAction(float remainTime)
- {
- if (remainTime > 10) ClearNinjutsu();
-
- var realInHuton = (InHuton || IsLastAction(false, Huton));
- if (realInHuton && _ninActionAim == Huton) ClearNinjutsu();
-
- if (DoNinjutsu(out var act))
- {
- if (act == Suiton && remainTime > Service.Config.CountDownAhead) return null;
- return act;
- }
-
- else if (remainTime < 5)
- {
- SetNinjutsu(Suiton);
- }
- else if (remainTime < 10)
- {
- if (_ninActionAim == null && Ten.IsCoolingDown && Hide.CanUse(out act)) return act;
- if (!realInHuton)
- {
- SetNinjutsu(Huton);
- }
- }
- return base.CountDownAction(remainTime);
- }
-
- #region Ninjutsu
- private static void SetNinjutsu(INinAction act)
- {
- if (act == null || AdjustId(ActionID.Ninjutsu) == ActionID.RabbitMedium) return;
- if (_ninActionAim != null && IsLastAction(false, Ten, Jin, Chi, FumaShurikenTen, FumaShurikenJin)) return;
- if(_ninActionAim != act)
- {
- _ninActionAim = act;
- }
- }
- private static void ClearNinjutsu()
- {
- if (_ninActionAim != null)
- {
- _ninActionAim = null;
- }
- }
-
- private bool ChoiceNinjutsu(out IAction act)
- {
- act = null;
- if (AdjustId(ActionID.Ninjutsu) != ActionID.Ninjutsu) return false;
- if (_ninActionAim != null && WeaponRemain < 0.2) return false;
-
- //Kassatsu
- if (Player.HasStatus(true, StatusID.Kassatsu))
- {
- if (GokaMekkyaku.CanUse(out _))
- {
- SetNinjutsu(GokaMekkyaku);
- return false;
- }
- if (HyoshoRanryu.CanUse(out _))
- {
- SetNinjutsu(HyoshoRanryu);
- return false;
- }
-
- if (Katon.CanUse(out _))
- {
- SetNinjutsu(Katon);
- return false;
- }
-
- if (Raiton.CanUse(out _))
- {
- SetNinjutsu(Raiton);
- return false;
- }
- }
- else
- {
- //Buff
- if (Huraijin.CanUse(out act)) return true;
- if (InHuton && _ninActionAim?.ID == Huton.ID)
- {
- ClearNinjutsu();
- return false;
- }
- if (Ten.CanUse(out _, CanUseOption.EmptyOrSkipCombo)
- && (!InCombat || !Huraijin.EnoughLevel) && Huton.CanUse(out _)
- && !IsLastAction(false, Huton))
- {
- SetNinjutsu(Huton);
- return false;
- }
-
- //Aoe
- if (Katon.CanUse(out _))
- {
- if (!Player.HasStatus(true, StatusID.Doton) && !IsMoving && !TenChiJin.WillHaveOneCharge(10))
- SetNinjutsu(Doton);
- else SetNinjutsu(Katon);
- return false;
- }
-
- //Vulnerable
- if (InBurst && TrickAttack.WillHaveOneCharge(18) && Suiton.CanUse(out _))
- {
- SetNinjutsu(Suiton);
- return false;
- }
-
- //Single
- if (Ten.CanUse(out _, InTrickAttack && !Player.HasStatus(false, StatusID.RaijuReady) ? CanUseOption.EmptyOrSkipCombo : CanUseOption.None))
- {
- if (Raiton.CanUse(out _))
- {
- SetNinjutsu(Raiton);
- return false;
- }
-
- if (!Chi.EnoughLevel && FumaShuriken.CanUse(out _))
- {
- SetNinjutsu(FumaShuriken);
- return false;
- }
- }
- }
-
- if (IsLastAction(false, DotonChi, SuitonJin,
- RabbitMedium, FumaShuriken, Katon, Raiton,
- Hyoton, Huton, Doton, Suiton, GokaMekkyaku, HyoshoRanryu))
- {
- ClearNinjutsu();
- }
- return false;
- }
-
- private bool DoNinjutsu(out IAction act)
- {
- act = null;
-
- //TenChiJin
- if (Player.HasStatus(true, StatusID.TenChiJin))
- {
- uint tenId = AdjustId(Ten.ID);
- uint chiId = AdjustId(Chi.ID);
- uint jinId = AdjustId(Jin.ID);
-
- //第一个
- if (tenId == FumaShurikenTen.ID)
- {
- //AOE
- if (Katon.CanUse(out _))
- {
- if (FumaShurikenJin.CanUse(out act)) return true;
- }
- //Single
- if (FumaShurikenTen.CanUse(out act)) return true;
- }
-
- //第二击杀AOE
- else if (tenId == KatonTen.ID)
- {
- if (KatonTen.CanUse(out act, CanUseOption.MustUse)) return true;
- }
- //其他几击
- else if (chiId == RaitonChi.ID)
- {
- if (RaitonChi.CanUse(out act, CanUseOption.MustUse)) return true;
- }
- else if (chiId == DotonChi.ID)
- {
- if (DotonChi.CanUse(out act, CanUseOption.MustUse)) return true;
- }
- else if (jinId == SuitonJin.ID)
- {
- if (SuitonJin.CanUse(out act, CanUseOption.MustUse)) return true;
- }
- }
-
- //Keep Kassatsu in Burst.
- if (Player.HasStatus(false, StatusID.Kassatsu) && !InTrickAttack) return false;
- if (_ninActionAim == null) return false;
-
- var id = AdjustId(ActionID.Ninjutsu);
-
- //First
- if (id == ActionID.Ninjutsu)
- {
- //Can't use.
- if (!Player.HasStatus(true, StatusID.Kassatsu, StatusID.TenChiJin)
- && !Ten.CanUse(out _, CanUseOption.EmptyOrSkipCombo))
- {
- return false;
- }
- act = _ninActionAim.Ninjutsu[0];
- return true;
- }
- //Failed
- else if ((uint)id == RabbitMedium.ID)
- {
- ClearNinjutsu();
- act = null;
- return false;
- }
- //Finished
- else if ((uint)id == _ninActionAim.ID)
- {
- if (_ninActionAim.CanUse(out act, CanUseOption.MustUse)) return true;
- if (_ninActionAim.ID == Doton.ID && !InCombat)
- {
- act = _ninActionAim;
- return true;
- }
- }
- //Second
- else if ((uint)id == FumaShuriken.ID)
- {
- if (_ninActionAim.Ninjutsu.Length > 1)
- {
- act = _ninActionAim.Ninjutsu[1];
- return true;
- }
- }
- //Third
- else if ((uint)id == Katon.ID || (uint)id == Raiton.ID || (uint)id == Hyoton.ID)
- {
- if (_ninActionAim.Ninjutsu.Length > 2)
- {
- act = _ninActionAim.Ninjutsu[2];
- return true;
- }
- }
- return false;
- }
- #endregion
-
- protected override bool GeneralGCD(out IAction act)
- {
- var hasRaijuReady = Player.HasStatus(true, StatusID.RaijuReady);
-
- if ((InTrickAttack || InMug) && NoNinjutsu && !hasRaijuReady
- && PhantomKamaitachi.CanUse(out act)) return true;
-
- if (ChoiceNinjutsu(out act)) return true;
- if ((!InCombat || !CombatElapsedLess(9)) && DoNinjutsu(out act)) return true;
-
- //No Ninjutsu
- if (NoNinjutsu)
- {
- if (!CombatElapsedLess(10) && FleetingRaiju.CanUse(out act)) return true;
- if (hasRaijuReady) return false;
-
- if (Huraijin.CanUse(out act)) return true;
-
- //AOE
- if (HakkeMujinsatsu.CanUse(out act)) return true;
- if (DeathBlossom.CanUse(out act)) return true;
-
- //Single
- if (ArmorCrush.CanUse(out act)) return true;
- if (AeolianEdge.CanUse(out act)) return true;
- if (GustSlash.CanUse(out act)) return true;
- if (SpinningEdge.CanUse(out act)) return true;
-
- //Range
- if (SpecialType == SpecialCommandType.MoveForward && MoveForwardAbility(1, out act)) return true;
- if (ThrowingDagger.CanUse(out act)) return true;
- }
-
- if (Configs.GetBool("AutoUnhide"))
- {
- StatusHelper.StatusOff(StatusID.Hidden);
- }
- if (!InCombat && _ninActionAim == null && Configs.GetBool("UseHide")
- && Ten.IsCoolingDown && Hide.CanUse(out act)) return true;
-
- act = null;
- return false;
- }
-
- [RotationDesc(ActionID.ForkedRaiju)]
- protected override bool MoveForwardGCD(out IAction act)
- {
- if (ForkedRaiju.CanUse(out act)) return true;
- return base.MoveForwardGCD(out act);
- }
-
- protected override bool EmergencyAbility(byte abilitiesRemaining, IAction nextGCD, out IAction act)
- {
- if (!NoNinjutsu || !InCombat) return base.EmergencyAbility(abilitiesRemaining, nextGCD, out act);
-
- if (Kassatsu.CanUse(out act)) return true;
- if (UseBurstMedicine(out act)) return true;
-
- if (InBurst && !CombatElapsedLess(5) && Mug.CanUse(out act)) return true;
-
- //Use Suiton
- if (!CombatElapsedLess(6))
- {
- if (TrickAttack.CanUse(out act)) return true;
- if (TrickAttack.IsCoolingDown && !TrickAttack.WillHaveOneCharge(19)
- && Meisui.CanUse(out act)) return true;
- }
-
- return base.EmergencyAbility(abilitiesRemaining, nextGCD, out act);
- }
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- act = null;
- if (!InCombat || AdjustId(2260) != 2260) return false;
-
- if (!IsMoving && InTrickAttack && !Ten.ElapsedAfter(30) && TenChiJin.CanUse(out act)) return true;
-
- if (!CombatElapsedLess(5) && Bunshin.CanUse(out act)) return true;
-
- if (InTrickAttack)
- {
- if (!DreamWithinADream.EnoughLevel)
- {
- if (Assassinate.CanUse(out act)) return true;
- }
- else
- {
- if (DreamWithinADream.CanUse(out act)) return true;
- }
- }
-
- if ((!InMug || InTrickAttack)
- && (!Bunshin.WillHaveOneCharge(10) || Player.HasStatus(false, StatusID.PhantomKamaitachiReady) || Mug.WillHaveOneCharge(2)))
- {
- if (HellfrogMedium.CanUse(out act)) return true;
- if (Bhavacakra.CanUse(out act)) return true;
- }
- return false;
- }
-}
diff --git a/RotationSolver.Default/Melee/NIN_Old.cs b/RotationSolver.Default/Melee/NIN_Old.cs
deleted file mode 100644
index 89268800f..000000000
--- a/RotationSolver.Default/Melee/NIN_Old.cs
+++ /dev/null
@@ -1,317 +0,0 @@
-namespace RotationSolver.Old.Melee;
-
-[RotationDesc(ActionID.Mug)]
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Melee/NIN_Old.cs")]
-public sealed class NIN_Old : NIN_Base
-{
- public override string GameVersion => "6.0";
-
- public override string RotationName => "Old";
-
- private static INinAction _ninActionAim = null;
-
- protected override IRotationConfigSet CreateConfiguration()
- {
- return base.CreateConfiguration()
- .SetBool("UseHide", true, "Use hide")
- .SetBool("AutoUnhide", true, "Auto Unhide.");
- }
-
- private static void SetNinjustus(INinAction act)
- {
- if (_ninActionAim != null && IsLastAction(false, Ten, Jin, Chi, FumaShurikenTen, FumaShurikenJin)) return;
- _ninActionAim = act;
- }
-
- private bool ChoiceNinjutsu(out IAction act)
- {
- act = null;
- if (AdjustId(2260) != 2260) return false;
-
- //在GCD快转完的时候再判断是否调整非空忍术
- if (_ninActionAim != null && WeaponRemain < 0.2) return false;
-
- //有生杀予夺
- if (Player.HasStatus(true, StatusID.Kassatsu))
- {
- if (GokaMekkyaku.CanUse(out _))
- {
- SetNinjustus(GokaMekkyaku);
- return false;
- }
- if (HyoshoRanryu.CanUse(out _))
- {
- SetNinjustus(HyoshoRanryu);
- return false;
- }
-
- if (Katon.CanUse(out _))
- {
- SetNinjustus(Katon);
- return false;
- }
-
- if (Raiton.CanUse(out _))
- {
- SetNinjustus(Raiton);
- return false;
- }
- }
- else
- {
- bool empty = Ten.CanUse(out _, CanUseOption.MustUse);
- bool haveDoton = Player.HasStatus(true, StatusID.Doton);
-
- //加状态
- if (Huraijin.CanUse(out act)) return true;
-
- if (InHuton && _ninActionAim?.ID == Huton.ID)
- {
- ClearNinjutsu();
- return false;
- }
-
- if (empty && (!InCombat || !Huraijin.EnoughLevel) && Huton.CanUse(out _))
- {
- SetNinjustus(Huton);
- return false;
- }
-
- if (GeneralNinjutsu(empty, haveDoton)) return false;
- }
- return false;
- }
-
- private bool GeneralNinjutsu(bool empty, bool haveDoton)
- {
- //清空忍术
- if (empty)
- {
- if (Katon.CanUse(out _))
- {
- if (!haveDoton && !IsMoving && TenChiJin.WillHaveOneChargeGCD(0, 1)) _ninActionAim = Doton;
- else SetNinjustus(Katon);
- return true;
- }
- //背刺
- if (InBurst && TrickAttack.WillHaveOneChargeGCD(1, 1) && Suiton.CanUse(out _))
- {
- SetNinjustus(Suiton);
- }
- }
- //常规单体忍术
- if (Ten.CanUse(out _) && (!TenChiJin.EnoughLevel || TenChiJin.IsCoolingDown))
- {
- if (Raiton.CanUse(out _))
- {
- SetNinjustus(Raiton);
- return true;
- }
-
- if (!Chi.EnoughLevel && FumaShuriken.CanUse(out _))
- {
- SetNinjustus(FumaShuriken);
- return true;
- }
- }
- return false;
- }
-
- private static void ClearNinjutsu()
- {
- _ninActionAim = null;
- }
-
- private bool DoNinjutsu(out IAction act)
- {
- act = null;
-
- //有天地人
- if (Player.HasStatus(true, StatusID.TenChiJin))
- {
- uint tenId = AdjustId(Ten.ID);
- uint chiId = AdjustId(Chi.ID);
- uint jinId = AdjustId(Jin.ID);
-
- //第一个
- if (tenId == FumaShurikenTen.ID)
- {
- //AOE
- if (Katon.CanUse(out _))
- {
- if (FumaShurikenJin.CanUse(out act)) return true;
- }
- //Single
- if (FumaShurikenTen.CanUse(out act)) return true;
- }
-
- //第二击杀AOE
- else if (tenId == KatonTen.ID)
- {
- if (KatonTen.CanUse(out act, CanUseOption.MustUse)) return true;
- }
- //其他几击
- else if (chiId == RaitonChi.ID)
- {
- if (RaitonChi.CanUse(out act, CanUseOption.MustUse)) return true;
- }
- else if (chiId == DotonChi.ID)
- {
- if (DotonChi.CanUse(out act, CanUseOption.MustUse)) return true;
- }
- else if (jinId == SuitonJin.ID)
- {
- if (SuitonJin.CanUse(out act, CanUseOption.MustUse)) return true;
- }
- }
-
- if (_ninActionAim == null) return false;
-
- uint id = AdjustId(2260);
-
- //没开始,释放第一个
- if (id == 2260)
- {
- //重置
- if (!Player.HasStatus(true, StatusID.Kassatsu, StatusID.TenChiJin)
- && !Ten.CanUse(out _, CanUseOption.MustUse))
- {
- return false;
- }
- act = _ninActionAim.Ninjutsu[0];
- return true;
- }
- //失败了
- else if (id == RabbitMedium.ID)
- {
- ClearNinjutsu();
- act = null;
- return false;
- }
- //结束了
- else if (id == _ninActionAim.ID)
- {
- if (_ninActionAim.CanUse(out act, CanUseOption.MustUse)) return true;
- if (_ninActionAim.ID == Doton.ID && !InCombat)
- {
- act = _ninActionAim;
- return true;
- }
- }
- //释放第二个
- else if (id == FumaShuriken.ID)
- {
- if (_ninActionAim.Ninjutsu.Length > 1)
- {
- act = _ninActionAim.Ninjutsu[1];
- return true;
- }
- }
- //释放第三个
- else if (id == Katon.ID || id == Raiton.ID || id == Hyoton.ID)
- {
- if (_ninActionAim.Ninjutsu.Length > 2)
- {
- act = _ninActionAim.Ninjutsu[2];
- return true;
- }
- }
- //ClearNinjutsu();
- return false;
- }
-
- protected override bool GeneralGCD(out IAction act)
- {
- if (IsLastAction(false, DotonChi, SuitonJin,
- RabbitMedium, FumaShuriken, Katon, Raiton,
- Hyoton, Huton, Doton, Suiton, GokaMekkyaku, HyoshoRanryu))
- {
- ClearNinjutsu();
- }
- if (ChoiceNinjutsu(out act)) return true;
- if (DoNinjutsu(out act)) return true;
-
- //用真北取消隐匿
- if (Configs.GetBool("AutoUnhide"))
- {
- StatusHelper.StatusOff(StatusID.Hidden);
- }
- //用隐匿恢复忍术数量
- if (!InCombat && _ninActionAim == null && Configs.GetBool("UseHide")
- && Ten.IsCoolingDown && Hide.CanUse(out act)) return true;
-
- var replace = AdjustId(2260);
- //无忍术或者忍术中途停了
- if (_ninActionAim == null || replace != 2260 && replace != _ninActionAim.ID)
- {
- //大招
- if (FleetingRaiju.CanUse(out act)) return true;
- if (ForkedRaiju.CanUse(out act))
- {
- if (ForkedRaiju.Target.DistanceToPlayer() < 2)
- {
- return true;
- }
- }
-
- if (PhantomKamaitachi.CanUse(out act)) return true;
-
- if (Huraijin.CanUse(out act)) return true;
-
- //AOE
- if (HakkeMujinsatsu.CanUse(out act)) return true;
- if (DeathBlossom.CanUse(out act)) return true;
-
- //Single
- if (ArmorCrush.CanUse(out act)) return true;
- if (AeolianEdge.CanUse(out act)) return true;
- if (GustSlash.CanUse(out act)) return true;
- if (SpinningEdge.CanUse(out act)) return true;
-
- //飞刀
- if (SpecialType == SpecialCommandType.MoveForward && MoveForwardAbility(1, out act)) return true;
- if (ThrowingDagger.CanUse(out act)) return true;
- }
-
- act = null;
- return false;
- }
-
- [RotationDesc(ActionID.ForkedRaiju)]
- protected override bool MoveForwardGCD(out IAction act)
- {
- if (ForkedRaiju.CanUse(out act)) return true;
- return base.MoveForwardGCD(out act);
- }
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- act = null;
- if (!InCombat || AdjustId(2260) != 2260) return false;
-
- //夺取
- if (InBurst && Mug.CanUse(out act)) return true;
-
- //解决Buff
- if (TrickAttack.CanUse(out act)) return true;
- if (Meisui.CanUse(out act)) return true;
-
- if (!IsMoving && TenChiJin.CanUse(out act)) return true;
- if (Kassatsu.CanUse(out act)) return true;
- if (UseBurstMedicine(out act)) return true;
-
- if (Bunshin.CanUse(out act)) return true;
- if (HellfrogMedium.CanUse(out act)) return true;
- if (Bhavacakra.CanUse(out act)) return true;
-
- if (!DreamWithinADream.EnoughLevel)
- {
- if (Assassinate.CanUse(out act)) return true;
- }
- else
- {
- if (DreamWithinADream.CanUse(out act)) return true;
- }
- return false;
- }
-}
diff --git a/RotationSolver.Default/Melee/RPR_Default.cs b/RotationSolver.Default/Melee/RPR_Default.cs
deleted file mode 100644
index 55c3d06ec..000000000
--- a/RotationSolver.Default/Melee/RPR_Default.cs
+++ /dev/null
@@ -1,172 +0,0 @@
-namespace RotationSolver.Default.Melee;
-
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Melee/RPR_Default.cs")]
-public sealed class RPR_Default : RPR_Base
-{
- public override string GameVersion => "6.28";
-
- public override string RotationName => "Default";
-
- protected override IRotationConfigSet CreateConfiguration()
- {
- return base.CreateConfiguration().SetBool("EnshroudPooling", false, "Enshroud Pooling");
- }
-
- protected override IAction CountDownAction(float remainTime)
- {
- //倒数收获月
- if (remainTime <= 30 && SoulSow.CanUse(out _)) return SoulSow;
- //提前2s勾刃
- if (remainTime <= Harpe.CastTime + Service.Config.CountDownAhead
- && Harpe.CanUse(out _)) return Harpe;
- return base.CountDownAction(remainTime);
- }
-
- protected override bool GeneralGCD(out IAction act)
- {
- //非战斗收获月
- if (SoulSow.CanUse(out act)) return true;
-
- //上Debuff
- if (WhorlOfDeath.CanUse(out act)) return true;
- if (ShadowOfDeath.CanUse(out act)) return true;
-
- //补蓝
- if (SoulReaver)
- {
- if (Guillotine.CanUse(out act)) return true;
- if (Player.HasStatus(true, StatusID.EnhancedGibbet))
- {
- if (Gibbet.CanUse(out act)) return true;
- }
- else
- {
- if (Gallows.CanUse(out act)) return true;
- }
- }
-
- //夜游魂变身状态
- if (Enshrouded)
- {
- //补DoT
- if (ShadowOfDeath.CanUse(out act)) return true;
-
- if (LemureShroud > 1)
- {
- if (Configs.GetBool("EnshroudPooling") && PlentifulHarvest.EnoughLevel && ArcaneCircle.WillHaveOneCharge(9) &&
- (LemureShroud == 4 && Target.WillStatusEnd(30, true, StatusID.DeathsDesign) || LemureShroud == 3 && Target.WillStatusEnd(50, true, StatusID.DeathsDesign))) //双附体窗口期
- {
- if (ShadowOfDeath.CanUse(out act, CanUseOption.MustUse)) return true;
- }
-
- //夜游魂衣-虚无/交错收割 阴冷收割
- if (GrimReaping.CanUse(out act)) return true;
- if (Player.HasStatus(true, StatusID.EnhancedCrossReaping) || !Player.HasStatus(true, StatusID.EnhancedVoidReaping))
- {
- if (CrossReaping.CanUse(out act)) return true;
- }
- else
- {
- if (VoidReaping.CanUse(out act)) return true;
- }
- }
- if (LemureShroud == 1)
- {
- if (Communio.EnoughLevel)
- {
- if (!IsMoving && Communio.CanUse(out act, CanUseOption.MustUse))
- {
- return true;
- }
- //跑机制来不及读条?补个buff混一下
- else
- {
- if (ShadowOfDeath.CanUse(out act, IsMoving ? CanUseOption.MustUse : CanUseOption.None)) return true;
- }
- }
- else
- {
- //夜游魂衣-虚无/交错收割 阴冷收割
- if (GrimReaping.CanUse(out act)) return true;
- if (Player.HasStatus(true, StatusID.EnhancedCrossReaping) || !Player.HasStatus(true, StatusID.EnhancedVoidReaping))
- {
- if (CrossReaping.CanUse(out act)) return true;
- }
- else
- {
- if (VoidReaping.CanUse(out act)) return true;
- }
- }
- }
- }
-
- //大丰收
- if (PlentifulHarvest.CanUse(out act, CanUseOption.MustUse)) return true;
-
- //灵魂钐割
- if (SoulScythe.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
- //灵魂切割
- if (SoulSlice.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
-
- //群体二连
- if (NightmareScythe.CanUse(out act)) return true;
- if (SpinningScythe.CanUse(out act)) return true;
-
- //单体三连
- if (InfernalSlice.CanUse(out act)) return true;
- if (WaxingSlice.CanUse(out act)) return true;
- if (Slice.CanUse(out act)) return true;
-
- //摸不到怪 先花掉收获月
- if (InCombat && HarvestMoon.CanUse(out act, CanUseOption.MustUse)) return true;
- if (Harpe.CanUse(out act)) return true;
-
- return false;
- }
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- if (InBurst)
- {
- //神秘环
- if (Target.HasStatus(true, StatusID.DeathsDesign) && ArcaneCircle.CanUse(out act)) return true;
-
- if (IsTargetBoss && IsTargetDying || //资源倾泻
- !Configs.GetBool("EnshroudPooling") && Shroud >= 50 ||//未开启双附体
- Configs.GetBool("EnshroudPooling") && Shroud >= 50 &&
- (!PlentifulHarvest.EnoughLevel || //等级不足以双附体
- Player.HasStatus(true, StatusID.ArcaneCircle) || //在神秘环期间附体
- ArcaneCircle.WillHaveOneCharge(8) || //双附体起手
- !Player.HasStatus(true, StatusID.ArcaneCircle) && ArcaneCircle.WillHaveOneCharge(65) && !ArcaneCircle.WillHaveOneCharge(50) || //奇数分钟不用攒附体
- !Player.HasStatus(true, StatusID.ArcaneCircle) && Shroud >= 90)) //攒蓝条为双附体
- {
- //夜游魂衣
- if (Enshroud.CanUse(out act)) return true;
- }
- }
- if (Enshrouded)
- {
- //夜游魂衣-夜游魂切割 夜游魂钐割
- if (LemuresScythe.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
- if (LemuresSlice.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
- }
-
- //暴食
- //大丰收期间延后暴食
- if (PlentifulHarvest.EnoughLevel && !Player.HasStatus(true, StatusID.ImmortalSacrifice) && !Player.HasStatus(true, StatusID.BloodSownCircle) || !PlentifulHarvest.EnoughLevel)
- {
- if (Gluttony.CanUse(out act, CanUseOption.MustUse)) return true;
- }
-
- if (!Player.HasStatus(true, StatusID.BloodSownCircle) && !Player.HasStatus(true, StatusID.ImmortalSacrifice) && (Gluttony.EnoughLevel && !Gluttony.WillHaveOneChargeGCD(4) || !Gluttony.EnoughLevel || Soul == 100))
- {
- //AOE
- if (GrimSwathe.CanUse(out act)) return true;
- //单体
- if (BloodStalk.CanUse(out act)) return true;
- }
-
- act = null;
- return false;
- }
-}
\ No newline at end of file
diff --git a/RotationSolver.Default/Melee/SAM_Default.cs b/RotationSolver.Default/Melee/SAM_Default.cs
deleted file mode 100644
index 5a6f683f7..000000000
--- a/RotationSolver.Default/Melee/SAM_Default.cs
+++ /dev/null
@@ -1,128 +0,0 @@
-namespace RotationSolver.Default.Melee;
-
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Melee/SAM_Default.cs")]
-public sealed class SAM_Default : SAM_Base
-{
- public override string GameVersion => "6.28";
-
- public override string RotationName => "Default";
-
- protected override IRotationConfigSet CreateConfiguration()
- {
- return base.CreateConfiguration()
- .SetFloat("addKenki", 50, "use Kenki above.", min: 0, max: 85, speed: 5);
- }
-
- ///
- /// 明镜止水
- ///
- private static bool haveMeikyoShisui => Player.HasStatus(true, StatusID.MeikyoShisui);
-
- protected override bool GeneralGCD(out IAction act)
- {
- //奥义回返
- if (KaeshiNamikiri.CanUse(out act, CanUseOption.MustUse)) return true;
-
- //燕回返
- if (KaeshiGoken.CanUse(out act, CanUseOption.MustUse | CanUseOption.EmptyOrSkipCombo)) return true;
- if (KaeshiSetsugekka.CanUse(out act, CanUseOption.MustUse | CanUseOption.EmptyOrSkipCombo)) return true;
-
- //奥义斩浪
- if ((!IsTargetBoss || Target.HasStatus(true, StatusID.Higanbana)) && HaveMoon && HaveFlower
- && OgiNamikiri.CanUse(out act, CanUseOption.MustUse)) return true;
-
- //处理居合术
- if (SenCount == 1 && IsTargetBoss && !IsTargetDying)
- {
- if (HaveMoon && HaveFlower && Higanbana.CanUse(out act)) return true;
- }
- if (SenCount == 2)
- {
- if (TenkaGoken.CanUse(out act, !MidareSetsugekka.EnoughLevel ? CanUseOption.MustUse : CanUseOption.None)) return true;
- }
- if (SenCount == 3)
- {
- if (MidareSetsugekka.CanUse(out act)) return true;
- }
-
- //连击2
- if ((!HaveMoon || MoonTime < FlowerTime || !Oka.EnoughLevel) && Mangetsu.CanUse(out act, haveMeikyoShisui && !HasGetsu ? CanUseOption.EmptyOrSkipCombo : CanUseOption.None)) return true;
- if ((!HaveFlower || FlowerTime < MoonTime) && Oka.CanUse(out act, haveMeikyoShisui && !HasKa ? CanUseOption.EmptyOrSkipCombo : CanUseOption.None)) return true;
- if (!HasSetsu && Yukikaze.CanUse(out act, haveMeikyoShisui && HasGetsu && HasKa && !HasSetsu ? CanUseOption.EmptyOrSkipCombo : CanUseOption.None)) return true;
-
- //连击3
- if (Gekko.CanUse(out act, haveMeikyoShisui && !HasGetsu ? CanUseOption.EmptyOrSkipCombo : CanUseOption.None)) return true;
- if (Kasha.CanUse(out act, haveMeikyoShisui && !HasKa ? CanUseOption.EmptyOrSkipCombo : CanUseOption.None)) return true;
-
- //连击2
- if ((!HaveMoon || MoonTime < FlowerTime || !Shifu.EnoughLevel) && Jinpu.CanUse(out act)) return true;
- if ((!HaveFlower || FlowerTime < MoonTime) && Shifu.CanUse(out act)) return true;
-
- if (!haveMeikyoShisui)
- {
- //连击1
- if (Fuko.CanUse(out act)) return true;
- if (!Fuko.EnoughLevel && Fuga.CanUse(out act)) return true;
- if (Hakaze.CanUse(out act)) return true;
-
- //燕飞
- if (Enpi.CanUse(out act)) return true;
- }
-
- act = null;
- return false;
- }
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- //意气冲天
- if (Kenki <= 50 && Ikishoten.CanUse(out act)) return true;
-
- //叶隐
- if (Target.HasStatus(true, StatusID.Higanbana) && Target.WillStatusEnd(32, true, StatusID.Higanbana) && !Target.WillStatusEnd(28, true, StatusID.Higanbana) && SenCount == 1 && IsLastAction(true, Yukikaze) && !haveMeikyoShisui)
- {
- if (Hagakure.CanUse(out act)) return true;
- }
-
- //闪影、红莲
- if(HaveMoon && HaveFlower)
- {
- if (HissatsuGuren.CanUse(out act, !HissatsuSenei.EnoughLevel ? CanUseOption.MustUse : CanUseOption.None)) return true;
- if (HissatsuSenei.CanUse(out act)) return true;
- }
-
- //照破、无明照破
- if (Shoha2.CanUse(out act)) return true;
- if (Shoha.CanUse(out act)) return true;
-
- //震天、九天
- if (Kenki >= 50 && Ikishoten.WillHaveOneCharge(10) || Kenki >= Configs.GetFloat("addKenki") || IsTargetBoss && IsTargetDying)
- {
- if (HissatsuKyuten.CanUse(out act)) return true;
- if (HissatsuShinten.CanUse(out act)) return true;
- }
-
- act = null;
- return false;
- }
- protected override bool EmergencyAbility(byte abilitiesRemaining, IAction nextGCD, out IAction act)
- {
- //明镜止水
- if (HasHostilesInRange && IsLastGCD(true, Yukikaze, Mangetsu, Oka) &&
- (!IsTargetBoss || Target.HasStatus(true, StatusID.Higanbana) && !Target.WillStatusEnd(40, true, StatusID.Higanbana) || !HaveMoon && !HaveFlower || IsTargetBoss && IsTargetDying))
- {
- if (MeikyoShisui.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
- }
- return base.EmergencyAbility(abilitiesRemaining, nextGCD, out act);
- }
-
-
- protected override IAction CountDownAction(float remainTime)
- {
- //开局使用明镜
- if (remainTime <= 5 && MeikyoShisui.CanUse(out _)) return MeikyoShisui;
- //真北防止boss面向没到位
- if (remainTime <= 2 && TrueNorth.CanUse(out _)) return TrueNorth;
- return base.CountDownAction(remainTime);
- }
-}
\ No newline at end of file
diff --git a/RotationSolver.Default/Ranged/BRD_Default.cs b/RotationSolver.Default/Ranged/BRD_Default.cs
deleted file mode 100644
index 586c3f289..000000000
--- a/RotationSolver.Default/Ranged/BRD_Default.cs
+++ /dev/null
@@ -1,206 +0,0 @@
-namespace RotationSolver.Default.Ranged;
-
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Ranged/BRD_Default.cs")]
-public sealed class BRD_Default : BRD_Base
-{
- public override string GameVersion => "6.28";
-
- public override string RotationName => "Default";
-
- protected override IRotationConfigSet CreateConfiguration() => base.CreateConfiguration()
- .SetBool("BindWAND", false, "Use Raging Strikes on WAND")
- .SetCombo("FirstSong", 0, "First Song", "WAND", "MAGE", "ARMY")
- .SetFloat("WANDTime", 43, "WAND Time", min: 0, max: 45, speed: 1)
- .SetFloat("MAGETime", 34, "MAGE Time", min: 0, max: 45, speed: 1)
- .SetFloat("ARMYTime", 43, "ARMY Time", min: 0, max: 45, speed: 1);
-
- public override string Description => "Please make sure that the three song times add up to 120 seconds!";
-
- private bool BindWAND => Configs.GetBool("BindWAND") && WanderersMinuet.EnoughLevel;
- private int FirstSong => Configs.GetCombo("FirstSong");
- private float WANDRemainTime => 45 - Configs.GetFloat("WANDTime");
- private float MAGERemainTime => 45 - Configs.GetFloat("MAGETime");
- private float ARMYRemainTime => 45 - Configs.GetFloat("ARMYTime");
-
- protected override bool GeneralGCD(out IAction act)
- {
- //伶牙俐齿
- if (IronJaws.CanUse(out act)) return true;
- if (IronJaws.CanUse(out act, CanUseOption.MustUse) && IronJaws.Target.WillStatusEnd(30, true, IronJaws.TargetStatus))
- {
- if (Player.HasStatus(true, StatusID.RagingStrikes) && Player.WillStatusEndGCD(1, 0, true, StatusID.RagingStrikes)) return true;
- }
-
- //放大招!
- if (CanUseApexArrow(out act)) return true;
- //爆破箭
- if (BlastArrow.CanUse(out act, CanUseOption.MustUse))
- {
- if (!Player.HasStatus(true, StatusID.RagingStrikes)) return true;
- if (Player.HasStatus(true, StatusID.RagingStrikes) && Barrage.IsCoolingDown) return true;
- }
-
- //群体GCD
- if (ShadowBite.CanUse(out act)) return true;
- if (QuickNock.CanUse(out act)) return true;
-
- //上毒
- if (WindBite.CanUse(out act)) return true;
- if (VenomousBite.CanUse(out act)) return true;
-
- //直线射击
- if (StraitShoot.CanUse(out act)) return true;
-
- //强力射击
- if (HeavyShoot.CanUse(out act)) return true;
-
- return false;
- }
-
- protected override bool EmergencyAbility(byte abilitiesRemaining, IAction nextGCD, out IAction act)
- {
- //如果接下来要上毒或者要直线射击,那算了。
- if (nextGCD.IsTheSameTo(true, StraitShoot, VenomousBite, WindBite, IronJaws))
- {
- return base.EmergencyAbility(abilitiesRemaining, nextGCD, out act);
- }
- else if ((!RagingStrikes.EnoughLevel || Player.HasStatus(true, StatusID.RagingStrikes)) && (!BattleVoice.EnoughLevel || Player.HasStatus(true, StatusID.BattleVoice)))
- {
- if ((EmpyrealArrow.IsCoolingDown && !EmpyrealArrow.WillHaveOneChargeGCD(1) || !EmpyrealArrow.EnoughLevel) && Repertoire != 3)
- {
- //纷乱箭
- if (!Player.HasStatus(true, StatusID.StraightShotReady) && Barrage.CanUse(out act)) return true;
- }
- }
-
- return base.EmergencyAbility(abilitiesRemaining, nextGCD, out act);
- }
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- act = null;
-
- if (Song == Song.NONE)
- {
- if (FirstSong == 0 && WanderersMinuet.CanUse(out act)) return true;
- if (FirstSong == 1 && MagesBallad.CanUse(out act)) return true;
- if (FirstSong == 2 && ArmysPaeon.CanUse(out act)) return true;
- if (WanderersMinuet.CanUse(out act)) return true;
- if (MagesBallad.CanUse(out act)) return true;
- if (ArmysPaeon.CanUse(out act)) return true;
- }
-
- if (InBurst && Song != Song.NONE && MagesBallad.EnoughLevel)
- {
- //猛者强击
- if (RagingStrikes.CanUse(out act))
- {
- if (BindWAND && Song == Song.WANDERER && WanderersMinuet.EnoughLevel) return true;
- if (!BindWAND) return true;
- }
-
- //光明神的最终乐章
- if (RadiantFinale.CanUse(out act, CanUseOption.MustUse))
- {
- if (Player.HasStatus(true, StatusID.RagingStrikes) && RagingStrikes.ElapsedOneChargeAfterGCD(1)) return true;
- }
-
- //战斗之声
- if (BattleVoice.CanUse(out act, CanUseOption.MustUse))
- {
- if (IsLastAction(true, RadiantFinale)) return true;
-
- if (Player.HasStatus(true, StatusID.RagingStrikes) && RagingStrikes.ElapsedOneChargeAfterGCD(1)) return true;
- }
- }
-
- if (RadiantFinale.EnoughLevel && RadiantFinale.IsCoolingDown && BattleVoice.EnoughLevel && !BattleVoice.IsCoolingDown) return false;
-
- //放浪神的小步舞曲
- if (WanderersMinuet.CanUse(out act))
- {
- if (SongEndAfter(ARMYRemainTime) && (Song != Song.NONE || Player.HasStatus(true, StatusID.ArmyEthos)) && abilitiesRemaining == 1) return true;
- }
-
- //九天连箭
- if (Song != Song.NONE && EmpyrealArrow.CanUse(out act)) return true;
-
- //完美音调
- if (PitchPerfect.CanUse(out act))
- {
- if (SongEndAfter(3) && Repertoire > 0) return true;
-
- if (Repertoire == 3) return true;
-
- if (Repertoire == 2 && EmpyrealArrow.WillHaveOneChargeGCD(1) && abilitiesRemaining == 1) return true;
-
- if (Repertoire == 2 && EmpyrealArrow.WillHaveOneChargeGCD() && abilitiesRemaining == 2) return true;
- }
-
- //贤者的叙事谣
- if (MagesBallad.CanUse(out act))
- {
- if (Song == Song.WANDERER && SongEndAfter(WANDRemainTime) && Repertoire == 0) return true;
- if (Song == Song.ARMY && SongEndAfterGCD(2) && WanderersMinuet.IsCoolingDown) return true;
- }
-
-
- //军神的赞美歌
- if (ArmysPaeon.CanUse(out act))
- {
- if (WanderersMinuet.EnoughLevel && SongEndAfter(MAGERemainTime) && Song == Song.MAGE) return true;
- if (WanderersMinuet.EnoughLevel && SongEndAfter(2) && MagesBallad.IsCoolingDown && Song == Song.WANDERER) return true;
- if (!WanderersMinuet.EnoughLevel && SongEndAfter(2)) return true;
- }
-
- //测风诱导箭
- if (Sidewinder.CanUse(out act))
- {
- if (Player.HasStatus(true, StatusID.BattleVoice) && (Player.HasStatus(true, StatusID.RadiantFinale) || !RadiantFinale.EnoughLevel)) return true;
-
- if (!BattleVoice.WillHaveOneCharge(10) && !RadiantFinale.WillHaveOneCharge(10)) return true;
-
- if (RagingStrikes.IsCoolingDown && !Player.HasStatus(true, StatusID.RagingStrikes)) return true;
- }
-
- //看看现在有没有开猛者强击和战斗之声
- bool empty = Player.HasStatus(true, StatusID.RagingStrikes) && (Player.HasStatus(true, StatusID.BattleVoice) || !BattleVoice.EnoughLevel) || Song == Song.MAGE;
-
- if (EmpyrealArrow.IsCoolingDown || !EmpyrealArrow.WillHaveOneChargeGCD() || Repertoire != 3 || !EmpyrealArrow.EnoughLevel)
- {
- //死亡剑雨
- if (RainOfDeath.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
-
- //失血箭
- if (Bloodletter.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
- }
-
- return false;
- }
-
- private bool CanUseApexArrow(out IAction act)
- {
- //放大招!
- if (!ApexArrow.CanUse(out act, CanUseOption.MustUse)) return false;
-
- //aoe期间
- if (QuickNock.CanUse(out _) && SoulVoice == 100) return true;
-
- //快爆发了,攒着等爆发
- if (SoulVoice == 100 && BattleVoice.WillHaveOneCharge(25)) return false;
-
- //爆发快过了,如果手里还有绝峰箭,就把绝峰箭打出去
- if (SoulVoice >= 80 && Player.HasStatus(true, StatusID.RagingStrikes) && Player.WillStatusEnd(10, false, StatusID.RagingStrikes)) return true;
-
- //爆发期绝峰箭
- if (SoulVoice == 100 && Player.HasStatus(true, StatusID.RagingStrikes) && Player.HasStatus(true, StatusID.BattleVoice)) return true;
-
- //贤者歌期间
- if (Song == Song.MAGE && SoulVoice >= 80 && SongEndAfter(22) && SongEndAfter(18)) return true;
-
- //能量之声等于100
- if (!Player.HasStatus(true, StatusID.RagingStrikes) && SoulVoice == 100) return true;
-
- return false;
- }
-}
diff --git a/RotationSolver.Default/Ranged/DNC_Default.cs b/RotationSolver.Default/Ranged/DNC_Default.cs
deleted file mode 100644
index 685a44949..000000000
--- a/RotationSolver.Default/Ranged/DNC_Default.cs
+++ /dev/null
@@ -1,193 +0,0 @@
-namespace RotationSolver.Default.Ranged;
-
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Ranged/DNC_Default.cs")]
-public sealed class DNC_Default : DNC_Base
-{
- public override string GameVersion => "6.28";
-
- public override string RotationName => "Default";
-
- protected override IAction CountDownAction(float remainTime)
- {
- if (remainTime <= 15)
- {
- if (StandardStep.CanUse(out var act, CanUseOption.MustUse)) return act;
- if (ExecuteStepGCD(out act)) return act;
- }
- return base.CountDownAction(remainTime);
- }
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- act = null;
- //״ֹ̬ʹ
- if (IsDancing) return false;
-
- //֮̽
- if (Devilment.CanUse(out act))
- {
- if (InBurst && !TechnicalStep.EnoughLevel) return true;
-
- if (Player.HasStatus(true, StatusID.TechnicalFinish)) return true;
- }
-
- //Ӧ
- if (UseClosedPosition(out act)) return true;
-
- //ٻ
- if (Flourish.CanUse(out act)) return true;
-
- //衤
- if (FanDance3.CanUse(out act, CanUseOption.MustUse)) return true;
-
- if (Player.HasStatus(true, StatusID.Devilment) || Feathers > 3 || !TechnicalStep.EnoughLevel)
- {
- //衤
- if (FanDance2.CanUse(out act)) return true;
- //衤
- if (FanDance.CanUse(out act)) return true;
- }
-
- //衤
- if (FanDance4.CanUse(out act, CanUseOption.MustUse))
- {
- if (TechnicalStep.EnoughLevel && TechnicalStep.IsCoolingDown && TechnicalStep.WillHaveOneChargeGCD()) return false;
- return true;
- }
-
- return false;
- }
-
- protected override bool GeneralGCD(out IAction act)
- {
- //
- if (!InCombat && !Player.HasStatus(true, StatusID.ClosedPosition1) && ClosedPosition.CanUse(out act)) return true;
-
- //貽
- if (FinishStepGCD(out act)) return true;
-
- //ִ貽
- if (ExecuteStepGCD(out act)) return true;
-
- //貽
- if (InBurst && InCombat && TechnicalStep.CanUse(out act, CanUseOption.MustUse)) return true;
-
- //GCD
- if (AttackGCD(out act, Player.HasStatus(true, StatusID.Devilment))) return true;
-
- return false;
- }
-
- ///
- /// GCD
- ///
- ///
- ///
- ///
- bool AttackGCD(out IAction act, bool breaking)
- {
- act = null;
- //״ֹ̬ʹ
- if (IsDancing) return false;
-
- //
- if ((breaking || Esprit >= 85) && SaberDance.CanUse(out act, CanUseOption.MustUse)) return true;
-
- //
- if (Tillana.CanUse(out act, CanUseOption.MustUse)) return true;
-
- //
- if (StarFallDance.CanUse(out act, CanUseOption.MustUse)) return true;
-
- //ʹñ貽
- if (UseStandardStep(out act)) return true;
-
- //AOE
- if (BloodShower.CanUse(out act)) return true;
- if (FountainFall.CanUse(out act)) return true;
- //
- if (RisingWindmill.CanUse(out act)) return true;
- if (ReverseCascade.CanUse(out act)) return true;
-
- //AOE
- if (BladeShower.CanUse(out act)) return true;
- if (Windmill.CanUse(out act)) return true;
- //
- if (Fountain.CanUse(out act)) return true;
- if (Cascade.CanUse(out act)) return true;
-
- return false;
- }
-
- ///
- /// ʹñ貽
- ///
- ///
- ///
- private bool UseStandardStep(out IAction act)
- {
- if (!StandardStep.CanUse(out act, CanUseOption.MustUse)) return false;
- if (Player.WillStatusEndGCD(2, 0, true, StatusID.StandardFinish)) return true;
-
- //ȼ̫,ֱ˻ɶ
- if (Level - Target.Level > 10) return false;
-
- //Χûе˲
- if (!HasHostilesInRange) return false;
-
- //貽״̬Ϳȴʱͷ
- if (TechnicalStep.EnoughLevel && (Player.HasStatus(true, StatusID.TechnicalFinish) || TechnicalStep.IsCoolingDown && TechnicalStep.WillHaveOneCharge(5))) return false;
-
- return true;
- }
-
- ///
- /// Ӧ
- ///
- ///
- ///
- private bool UseClosedPosition(out IAction act)
- {
- if (!ClosedPosition.CanUse(out act)) return false;
-
- //Ӧ
- if (InCombat && Player.HasStatus(true, StatusID.ClosedPosition1))
- {
- foreach (var friend in PartyMembers)
- {
- if (friend.HasStatus(true, StatusID.ClosedPosition2))
- {
- if (ClosedPosition.Target != friend) return true;
- break;
- }
- }
- }
- //else if (ClosedPosition.ShouldUse(out act)) return true;
-
- act = null;
- return false;
- }
-
- private static bool FinishStepGCD(out IAction act)
- {
- act = null;
- if (!IsDancing) return false;
-
- //貽
- if (Player.HasStatus(true, StatusID.StandardStep) && (Player.WillStatusEnd(1, true, StatusID.StandardStep) || CompletedSteps == 2 && Player.WillStatusEnd(1, true, StatusID.StandardFinish))
- || StandardFinish.CanUse(out _, CanUseOption.MustUse))
- {
- act = StandardStep;
- return true;
- }
-
- //貽
- if (Player.HasStatus(true, StatusID.TechnicalStep) && Player.WillStatusEnd(1, true, StatusID.TechnicalStep) || TechnicalFinish.CanUse(out _, CanUseOption.MustUse))
- {
- act = TechnicalStep;
- return true;
- }
-
- return false;
- }
-}
diff --git a/RotationSolver.Default/Ranged/MCH_Default.cs b/RotationSolver.Default/Ranged/MCH_Default.cs
deleted file mode 100644
index 187e54d3b..000000000
--- a/RotationSolver.Default/Ranged/MCH_Default.cs
+++ /dev/null
@@ -1,154 +0,0 @@
-namespace RotationSolver.Default.Ranged;
-
-[BetaRotation]
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Ranged/MCH_Default.cs")]
-[LinkDescription("https://cdn.discordapp.com/attachments/277968251789639680/1086348727691780226/mch_rotation.png")]
-[RotationDesc(ActionID.Wildfire)]
-public sealed class MCH_Default : MCH_Base
-{
- public override string GameVersion => "6.38";
-
- public override string RotationName => "General Purpose";
-
- protected override IAction CountDownAction(float remainTime)
- {
- if (remainTime < Service.Config.CountDownAhead)
- {
- if (AirAnchor.CanUse(out var act1)) return act1;
- else if(!AirAnchor.EnoughLevel && HotShot.CanUse(out act1)) return act1;
- }
- if (remainTime < 2 && UseBurstMedicine(out var act)) return act;
- if (remainTime < 5 && Reassemble.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return act;
- return base.CountDownAction(remainTime);
- }
-
- protected override bool GeneralGCD(out IAction act)
- {
- //Overheated
- if (AutoCrossbow.CanUse(out act)) return true;
- if (HeatBlast.CanUse(out act)) return true;
-
- //Long Cds
- if (BioBlaster.CanUse(out act)) return true;
- if (!SpreadShot.CanUse(out _))
- {
- if (AirAnchor.CanUse(out act)) return true;
- else if (!AirAnchor.EnoughLevel && HotShot.CanUse(out act)) return true;
-
-
- if (Drill.CanUse(out act)) return true;
- }
-
- if (!CombatElapsedLessGCD(4) && ChainSaw.CanUse(out act, CanUseOption.MustUse)) return true;
-
- //Aoe
- if (ChainSaw.CanUse(out act)) return true;
- if (SpreadShot.CanUse(out act)) return true;
-
- //Single
- if (CleanShot.CanUse(out act)) return true;
- if (SlugShot.CanUse(out act)) return true;
- if (SplitShot.CanUse(out act)) return true;
-
- return false;
- }
-
- protected override bool EmergencyAbility(byte abilitiesRemaining, IAction nextGCD, out IAction act)
- {
- if (Ricochet.CanUse(out act, CanUseOption.MustUse)) return true;
- if (GaussRound.CanUse(out act, CanUseOption.MustUse)) return true;
-
- if (!Drill.EnoughLevel && nextGCD.IsTheSameTo(true, CleanShot)
- || nextGCD.IsTheSameTo(false, AirAnchor, Drill, ChainSaw))
- {
- if (Reassemble.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
- }
- return base.EmergencyAbility(abilitiesRemaining, nextGCD, out act);
- }
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- if (InBurst)
- {
- if (UseBurstMedicine(out act)) return true;
- if ((IsLastAbility(false, Hypercharge) || Heat >= 50)
- && !CombatElapsedLess(12)
- && Wildfire.CanUse(out act)) return true;
- }
-
- if (!CombatElapsedLess(12) && CanUseHypercharge(out act)) return true;
- if (CanUseRookAutoturret(out act)) return true;
-
- if (BarrelStabilizer.CanUse(out act)) return true;
-
- if (CombatElapsedLess(10)) return false;
-
- var option = CanUseOption.MustUse | CanUseOption.EmptyOrSkipCombo;
- if (GaussRound.CurrentCharges <= Ricochet.CurrentCharges)
- {
- if (Ricochet.CanUse(out act, option)) return true;
- }
- if (GaussRound.CanUse(out act, option)) return true;
-
- return false;
- }
-
- private static bool AirAnchorBlockTime(float time)
- {
- if (AirAnchor.EnoughLevel)
- {
- return AirAnchor.IsCoolingDown && AirAnchor.WillHaveOneCharge(time);
- }
- else
- {
- return HotShot.IsCoolingDown && HotShot.WillHaveOneCharge(time);
- }
- }
-
- private bool CanUseRookAutoturret(out IAction act)
- {
- act = null;
- if (AirAnchor.EnoughLevel)
- {
- if (!AirAnchor.IsCoolingDown || AirAnchor.ElapsedAfter(10)) return false;
- }
- else
- {
- if (!HotShot.IsCoolingDown || HotShot.ElapsedAfter(10)) return false;
- }
-
- return RookAutoturret.CanUse(out act);
- }
-
- const float REST_TIME = 6f;
- private static bool CanUseHypercharge(out IAction act)
- {
- act = null;
-
- if(BarrelStabilizer.IsCoolingDown && BarrelStabilizer.WillHaveOneChargeGCD(8))
- {
- if (AirAnchorBlockTime(8)) return false;
- }
- else
- {
- if (AirAnchorBlockTime(12)) return false;
- }
-
- //Check recast.
- if (!SpreadShot.CanUse(out _))
- {
- if (AirAnchor.EnoughLevel)
- {
- if (AirAnchor.WillHaveOneCharge(REST_TIME)) return false;
- }
- else
- {
- if (HotShot.EnoughLevel && HotShot.WillHaveOneCharge(REST_TIME)) return false;
- }
- }
- if (Drill.EnoughLevel && Drill.WillHaveOneCharge(REST_TIME)) return false;
- if (ChainSaw.EnoughLevel && ChainSaw.WillHaveOneCharge(REST_TIME)) return false;
-
- return Hypercharge.CanUse(out act);
- }
-}
diff --git a/RotationSolver.Default/Ranged/MCH_Old.cs b/RotationSolver.Default/Ranged/MCH_Old.cs
deleted file mode 100644
index 07f21da1c..000000000
--- a/RotationSolver.Default/Ranged/MCH_Old.cs
+++ /dev/null
@@ -1,229 +0,0 @@
-namespace RotationSolver.Old.Ranged;
-
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Ranged/MCH_Old.cs")]
-public sealed class MCH_Old : MCH_Base
-{
- public override string GameVersion => "6.28";
-
- public override string RotationName => "Old";
-
-
- ///
- /// 4人本小怪快死了
- ///
- private static bool isDyingNotBoss => !Target.IsBoss() && IsTargetDying && PartyMembers.Count() is > 1 and <= 4;
-
- protected override IRotationConfigSet CreateConfiguration()
- {
- return base.CreateConfiguration()
- .SetBool("MCH_Opener", true, "Basic Opener")
- .SetBool("MCH_Automaton", true, "Care for Automation")
- .SetBool("MCH_Reassemble", true, "Ressamble for ChainSaw")
- .SetBool("DelayHypercharge", false, "Use Hypercharge late");
- }
-
- protected override bool GeneralGCD(out IAction act)
- {
- //不在战斗中时重置起手
- if (!InCombat)
- {
- //开场前整备,空气锚和钻头必须冷却好
- if (AirAnchor.EnoughLevel && (!AirAnchor.IsCoolingDown || !Drill.IsCoolingDown) && Reassemble.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
- }
-
- //群体常规GCD
- //AOE,毒菌冲击
- if (BioBlaster.CanUse(out act)) return true;
- if (ChainSaw.CanUse(out act)) return true;
- if (IsOverheated && AutoCrossbow.CanUse(out act)) return true;
- if (SpreadShot.CanUse(out act)) return true;
-
- if (!IsOverheated || IsOverheated && OverheatedEndAfterGCD())
- {
- //单体,四个牛逼的技能。先空气锚再钻头
- if (AirAnchor.CanUse(out act)) return true;
- else if (!AirAnchor.EnoughLevel && HotShot.CanUse(out act)) return true;
- if (Drill.CanUse(out act)) return true;
- if (ChainSaw.CanUse(out act, CanUseOption.MustUse))
- {
- if (Player.HasStatus(true, StatusID.Reassemble)) return true;
- if (!Configs.GetBool("MCH_Opener") || Wildfire.IsCoolingDown) return true;
- if (AirAnchor.IsCoolingDown && AirAnchor.ElapsedOneChargeAfterGCD(4) && Drill.IsCoolingDown && Drill.ElapsedOneChargeAfterGCD(3)) return true;
- if (AirAnchor.IsCoolingDown && AirAnchor.ElapsedOneChargeAfterGCD(3) && Drill.IsCoolingDown && Drill.ElapsedOneChargeAfterGCD(4)) return true;
- }
- }
-
- //过热状态
- if (IsOverheated && HeatBlast.CanUse(out act)) return true;
-
- //单体常规GCD
- if (CleanShot.CanUse(out act)) return true;
- if (SlugShot.CanUse(out act)) return true;
- if (SplitShot.CanUse(out act)) return true;
-
- return false;
- }
-
- protected override IAction CountDownAction(float remainTime)
- {
- //提前5秒整备
- if (remainTime <= 5 && Reassemble.CanUse(out _, CanUseOption.EmptyOrSkipCombo)) return Reassemble;
- return base.CountDownAction(remainTime);
- }
- protected override bool EmergencyAbility(byte abilitiesRemaining, IAction nextGCD, out IAction act)
- {
- //等级小于钻头时,绑定狙击弹
- if (!Drill.EnoughLevel && nextGCD.IsTheSameTo(true, CleanShot))
- {
- if (Reassemble.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
- }
- //等级小于90时,整备不再留层数
- if ((!ChainSaw.EnoughLevel || !Configs.GetBool("MCH_Reassemble"))
- && nextGCD.IsTheSameTo(false, AirAnchor, Drill))
- {
- if (Reassemble.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
- }
- //整备优先链锯
- if (Configs.GetBool("MCH_Reassemble") && nextGCD.IsTheSameTo(true, ChainSaw))
- {
- if (Reassemble.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
- }
- //如果接下来要搞三大金刚了,整备吧!
- if (ChainSaw.EnoughLevel && nextGCD.IsTheSameTo(true, AirAnchor, Drill))
- {
- if (Reassemble.CanUse(out act)) return true;
- }
- //起手在链锯前释放野火
- if (nextGCD.IsTheSameTo(true, ChainSaw) && !IsLastGCD(true, HeatBlast))
- {
- if (InBurst && Configs.GetBool("MCH_Opener") && Wildfire.CanUse(out act)) return true;
- }
- return base.EmergencyAbility(abilitiesRemaining, nextGCD, out act);
- }
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- //野火
- if (InBurst && CanUseWildfire(out act)) return true;
-
- //车式浮空炮塔
- if (CanUseRookAutoturret(out act)) return true;
-
- //起手虹吸弹、弹射
- if (Ricochet.CurrentCharges == Ricochet.MaxCharges && Ricochet.CanUse(out act, CanUseOption.MustUse | CanUseOption.EmptyOrSkipCombo)) return true;
- if (GaussRound.CurrentCharges == GaussRound.MaxCharges && GaussRound.CanUse(out act, CanUseOption.MustUse | CanUseOption.EmptyOrSkipCombo)) return true;
-
- //枪管加热
- if (BarrelStabilizer.CanUse(out act)) return true;
-
- //超荷
- if (CanUseHypercharge(out act) && (Configs.GetBool("MCH_Opener") && abilitiesRemaining == 1 || !Configs.GetBool("MCH_Opener"))) return true;
-
- if (GaussRound.CurrentCharges <= Ricochet.CurrentCharges)
- {
- //弹射
- if (Ricochet.CanUse(out act, CanUseOption.MustUse | CanUseOption.EmptyOrSkipCombo)) return true;
- }
- //虹吸弹
- if (GaussRound.CanUse(out act, CanUseOption.MustUse | CanUseOption.EmptyOrSkipCombo)) return true;
-
- act = null!;
- return false;
- }
-
- ///
- /// 判断能否使用野火
- ///
- ///
- ///
- private bool CanUseWildfire(out IAction act)
- {
- if (!Wildfire.CanUse(out act)) return false;
-
- if (Heat < 50 && !IsOverheated) return false;
-
- //小怪和AOE期间不打野火
- if (SpreadShot.CanUse(out _) || PartyMembers.Count() is > 1 and <= 4 && !Target.IsBoss()) return false;
-
- //在过热时
- if (IsLastAction(true, Hypercharge)) return true;
-
- if (ChainSaw.EnoughLevel && !ChainSaw.IsCoolingDown) return false;
-
- if (Hypercharge.IsCoolingDown) return false;
-
- //当上一个技能是钻头,空气锚,热冲击时不释放野火
- if (IsLastGCD(true, Drill, HeatBlast, AirAnchor)) return false;
-
- return true;
- }
-
- ///
- /// 判断能否使用超荷
- ///
- ///
- ///
- private bool CanUseHypercharge(out IAction act)
- {
- if (!Hypercharge.CanUse(out act) || Player.HasStatus(true, StatusID.Reassemble)) return false;
-
- //有野火buff必须释放超荷
- if (Player.HasStatus(true, StatusID.Wildfire)) return true;
-
- //4人本小怪快死了不释放
- //if (isDyingNotBoss) return false;
-
- //在三大金刚还剩8秒冷却好时不释放超荷
- if (Drill.EnoughLevel && Drill.WillHaveOneChargeGCD(3)) return false;
- if (AirAnchor.EnoughLevel && AirAnchor.WillHaveOneCharge(3)) return false;
- if (ChainSaw.EnoughLevel && (ChainSaw.IsCoolingDown && ChainSaw.WillHaveOneCharge(3) || !ChainSaw.IsCoolingDown) && Configs.GetBool("MCH_Opener")) return false;
-
- //小怪AOE和4人本超荷判断
- if (SpreadShot.CanUse(out _))
- {
- if (!AutoCrossbow.EnoughLevel) return false;
- return true;
- }
-
- //等级低于野火
- if (!Wildfire.EnoughLevel) return true;
-
- //野火前攒热量
- if (!Wildfire.WillHaveOneChargeGCD(5) && Wildfire.WillHaveOneChargeGCD(18))
- {
- //如果期间热量溢出超过5,就释放一次超荷
- if (IsLastGCD((ActionID)Drill.ID) && Heat >= 85) return true;
- return false;
- }
- else return true;
- }
-
- ///
- /// 判断能否使用机器人
- ///
- ///
- ///
- private bool CanUseRookAutoturret(out IAction act)
- {
- if (!RookAutoturret.CanUse(out act, CanUseOption.MustUse)) return false;
-
- //4人本小怪快死了不释放
- if (isDyingNotBoss) return false;
-
- //如果上一个技能是野火不释放
- if (IsLastAction((ActionID)Wildfire.ID)) return false;
-
- //电量等于100,强制释放
- if (Battery == 100 && ChainSaw.EnoughLevel && !ChainSaw.WillHaveOneCharge(13)) return true;
-
- //小怪,AOE,不吃团辅判断
- if (!Configs.GetBool("MCH_Automaton") || !Target.IsBoss() && !IsMoving || Level < Wildfire.ID) return true;
- if (SpreadShot.CanUse(out _) && !Target.IsBoss() && IsMoving) return false;
-
- //机器人吃团辅判断
- if (AirAnchor.IsCoolingDown && AirAnchor.WillHaveOneChargeGCD() && Battery > 80) return true;
- if (ChainSaw.WillHaveOneCharge(4) || ChainSaw.IsCoolingDown && !ChainSaw.ElapsedOneChargeAfterGCD(3) && Battery <= 60) return true;
-
- return false;
- }
-}
diff --git a/RotationSolver.Default/RotationSolver.Default.csproj b/RotationSolver.Default/RotationSolver.Default.csproj
deleted file mode 100644
index 638f44adf..000000000
--- a/RotationSolver.Default/RotationSolver.Default.csproj
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/RotationSolver.Default/Tank/DRK_Default.cs b/RotationSolver.Default/Tank/DRK_Default.cs
deleted file mode 100644
index 1af03b800..000000000
--- a/RotationSolver.Default/Tank/DRK_Default.cs
+++ /dev/null
@@ -1,196 +0,0 @@
-namespace RotationSolver.Balance.Tank;
-
-
-[RotationDesc(ActionID.BloodWeapon, ActionID.Delirium)]
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Tank/DRK_Balance.cs")]
-[LinkDescription("https://www.thebalanceffxiv.com/img/jobs/drk/drk_standard_6.2_v1.png")]
-public sealed class DRK_Default : DRK_Base
-{
- public override string GameVersion => "6.38";
-
- public override string RotationName => "Balance";
-
- public override string Description => "Special thanks to Nore for fixing the rotation.";
-
- protected override bool CanHealSingleAbility => false;
-
- private static bool InTwoMinBurst => BloodWeapon.IsCoolingDown && Delirium.IsCoolingDown
- && LivingShadow.IsCoolingDown && !LivingShadow.ElapsedAfter(20);
-
- private static bool CombatLess => CombatElapsedLess(3);
-
- private bool CheckDarkSide
- {
- get
- {
- if (DarkSideEndAfterGCD(3)) return true;
-
- if (CombatLess) return false;
-
- if ((InTwoMinBurst && SaltedEarth.IsCoolingDown && ShadowBringer.CurrentCharges==0 && CarveandSpit.IsCoolingDown) || HasDarkArts) return true;
-
- if (Configs.GetBool("TheBlackestNight") && Player.CurrentMp < 6000) return false;
-
- return Player.CurrentMp >= 8500;
- }
- }
-
- private bool UseBlood
- {
- get
- {
- if (!Delirium.EnoughLevel) return true;
-
- if (Player.HasStatus(true, StatusID.Delirium) && Player.StatusStack(true, StatusID.BloodWeapon) < 2) return true;
-
- if (BloodWeapon.WillHaveOneChargeGCD(1) || Blood >= 90 && !Player.HasStatus(true, StatusID.Delirium)) return true;
-
- return false;
- }
- }
-
- protected override IRotationConfigSet CreateConfiguration()
- => base.CreateConfiguration()
- .SetBool("TheBlackestNight", true, "Keep 3000 MP");
-
- protected override IAction CountDownAction(float remainTime)
- {
- //Provoke when has Shield.
- if(remainTime <= Service.Config.CountDownAhead)
- {
- if (HasTankStance)
- {
- if (Provoke.CanUse(out var act1)) return act1;
- }
- else
- {
- if (Unmend.CanUse(out var act1)) return act1;
- }
- }
- if (remainTime <= 2 && UseBurstMedicine(out var act)) return act;
- if (remainTime <= 3 && TheBlackestNight.CanUse(out act)) return act;
- if (remainTime <= 4 && BloodWeapon.CanUse(out act)) return act;
- return base.CountDownAction(remainTime);
- }
-
- [RotationDesc(ActionID.TheBlackestNight)]
- protected override bool HealSingleAbility(byte abilitiesRemaining, out IAction act)
- {
- if (TheBlackestNight.CanUse(out act)) return true;
-
- return false;
- }
-
- [RotationDesc(ActionID.DarkMissionary, ActionID.Reprisal)]
- protected override bool DefenseAreaAbility(byte abilitiesRemaining, out IAction act)
- {
- if (DarkMissionary.CanUse(out act)) return true;
- if (Reprisal.CanUse(out act, CanUseOption.MustUse)) return true;
-
- return false;
- }
-
- [RotationDesc(ActionID.TheBlackestNight, ActionID.Oblation, ActionID.ShadowWall, ActionID.Rampart, ActionID.DarkMind, ActionID.Reprisal)]
- protected override bool DefenseSingleAbility(byte abilitiesRemaining, out IAction act)
- {
- act = null;
-
- if (Player.HasStatus(true, StatusID.TheBlackestNight)) return false;
-
- if (abilitiesRemaining == 1)
- {
- //10
- if (Oblation.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
-
- if (Reprisal.CanUse(out act, CanUseOption.MustUse)) return true;
-
- if (TheBlackestNight.CanUse(out act)) return true;
- }
- else
- {
- //30
- if ((!Rampart.IsCoolingDown || Rampart.ElapsedAfter(60)) && (ShadowWall.CanUse(out act))) return true;
-
- //20
- if ((ShadowWall.IsCoolingDown && ShadowWall.ElapsedAfter(60)) && (Rampart.CanUse(out act))) return true;
- if (DarkMind.CanUse(out act)) return true;
- }
-
- return false;
- }
-
- protected override bool GeneralGCD(out IAction act)
- {
- if (IsMoving && HasHostilesInRange && BloodWeapon.CanUse(out act)) return true;
-
- //Use Blood
- if (UseBlood)
- {
- if (Quietus.CanUse(out act)) return true;
- if (BloodSpiller.CanUse(out act)) return true;
- }
-
- //AOE
- if (StalwartSoul.CanUse(out act)) return true;
- if (Unleash.CanUse(out act)) return true;
-
- //单体
- if (Souleater.CanUse(out act)) return true;
- if (SyphonStrike.CanUse(out act)) return true;
- if (HardSlash.CanUse(out act)) return true;
-
- if (SpecialType == SpecialCommandType.MoveForward && MoveForwardAbility(1, out act)) return true;
- if (Unmend.CanUse(out act)) return true;
-
- return false;
- }
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- if (CheckDarkSide)
- {
- if (FloodOfDarkness.CanUse(out act)) return true;
- if (EdgeOfDarkness.CanUse(out act)) return true;
- }
-
- if (InBurst)
- {
- if (UseBurstMedicine(out act)) return true;
- if (BloodWeapon.CanUse(out act)) return true;
- if (Delirium.CanUse(out act)) return true;
- if (LivingShadow.CanUse(out act, CanUseOption.MustUse)) return true;
- }
-
- if (CombatLess)
- {
- act = null;
- return false;
- }
-
- if (!IsMoving && SaltedEarth.CanUse(out act, CanUseOption.MustUse)) return true;
-
- if (InTwoMinBurst)
- {
- if (ShadowBringer.CanUse(out act, CanUseOption.MustUse)) return true;
- }
-
- if (AbyssalDrain.CanUse(out act)) return true;
- if (CarveandSpit.CanUse(out act)) return true;
-
- if (InTwoMinBurst)
- {
- if (ShadowBringer.CanUse(out act, CanUseOption.MustUse | CanUseOption.EmptyOrSkipCombo)) return true;
-
- if (Plunge.CanUse(out act, CanUseOption.MustUse) && !IsMoving) return true;
- }
-
- if (SaltandDarkness.CanUse(out act)) return true;
-
- if (InTwoMinBurst)
- {
- if (Plunge.CanUse(out act, CanUseOption.MustUse | CanUseOption.EmptyOrSkipCombo) && !IsMoving) return true;
- }
-
- return false;
- }
-}
\ No newline at end of file
diff --git a/RotationSolver.Default/Tank/GNB_Default.cs b/RotationSolver.Default/Tank/GNB_Default.cs
deleted file mode 100644
index 6bbd48dca..000000000
--- a/RotationSolver.Default/Tank/GNB_Default.cs
+++ /dev/null
@@ -1,274 +0,0 @@
-namespace RotationSolver.Default.Tank;
-
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Tank/GNB_Default.cs")]
-public sealed class GNB_Default : GNB_Base
-{
- public override string GameVersion => "6.18";
-
- public override string RotationName => "Default";
-
- protected override bool CanHealSingleSpell => false;
-
- protected override bool CanHealAreaSpell => false;
-
- protected override bool GeneralGCD(out IAction act)
- {
- //
- if (CanUseDoubleDown(out act)) return true;
-
- //֮ AOE
- if (FatedCircle.CanUse(out act)) return true;
-
- //AOE
- if (DemonSlaughter.CanUse(out act)) return true;
- if (DemonSlice.CanUse(out act)) return true;
-
- //
- if (CanUseGnashingFang(out act)) return true;
-
- //
- if (CanUseSonicBreak(out act)) return true;
-
- //
- if (WickedTalon.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
- if (SavageClaw.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
-
- //
- if (CanUseBurstStrike(out act)) return true;
-
- if (SolidBarrel.CanUse(out act)) return true;
- if (BrutalShell.CanUse(out act)) return true;
- if (KeenEdge.CanUse(out act)) return true;
-
- if (SpecialType == SpecialCommandType.MoveForward && MoveForwardAbility(1, out act)) return true;
-
- if (LightningShot.CanUse(out act)) return true;
-
- return false;
- }
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- //,Ŀǰֻ4GCDֵж
- if (InBurst && abilitiesRemaining == 1 && CanUseNoMercy(out act)) return true;
-
- //Σ
- if (DangerZone.CanUse(out act))
- {
- if (!IsFullParty && !DangerZone.IsTargetBoss) return true;
-
- //ȼС,
- if (!GnashingFang.EnoughLevel && (Player.HasStatus(true, StatusID.NoMercy) || !NoMercy.WillHaveOneCharge(15))) return true;
-
- //,֮
- if (Player.HasStatus(true, StatusID.NoMercy) && GnashingFang.IsCoolingDown) return true;
-
- //DZ
- if (!Player.HasStatus(true, StatusID.NoMercy) && !GnashingFang.WillHaveOneCharge(20)) return true;
- }
-
- //γ岨
- if (CanUseBowShock(out act)) return true;
-
- //
- if (JugularRip.CanUse(out act)) return true;
- if (AbdomenTear.CanUse(out act)) return true;
- if (EyeGouge.CanUse(out act)) return true;
- if (Hypervelocity.CanUse(out act)) return true;
-
- //Ѫ
- if (GnashingFang.IsCoolingDown && BloodFest.CanUse(out act)) return true;
-
- //㹥,ַն
- if (Player.HasStatus(true, StatusID.NoMercy) && RoughDivide.CanUse(out act, CanUseOption.MustUse)) return true;
-
- act = null;
- return false;
- }
-
- [RotationDesc(ActionID.HeartOfLight, ActionID.Reprisal)]
- protected override bool DefenseAreaAbility(byte abilitiesRemaining, out IAction act)
- {
- if (HeartOfLight.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
- if (Reprisal.CanUse(out act, CanUseOption.MustUse)) return true;
- return false;
- }
-
- [RotationDesc(ActionID.HeartOfStone, ActionID.Nebula, ActionID.Rampart, ActionID.Camouflage, ActionID.Reprisal)]
- protected override bool DefenseSingleAbility(byte abilitiesRemaining, out IAction act)
- {
- if (abilitiesRemaining == 1)
- {
- //10
- if (Camouflage.CanUse(out act)) return true;
-
- //10
- if (HeartOfStone.CanUse(out act)) return true;
- }
- else
- {
- //30
- if (Nebula.CanUse(out act)) return true;
-
- //20
- if (Rampart.CanUse(out act)) return true;
- }
-
- if (Reprisal.CanUse(out act)) return true;
-
- act = null;
- return false;
- }
-
- [RotationDesc(ActionID.Aurora)]
- protected override bool HealSingleAbility(byte abilitiesRemaining, out IAction act)
- {
- if (Aurora.CanUse(out act, CanUseOption.EmptyOrSkipCombo) && abilitiesRemaining == 1) return true;
- return false;
- }
-
- private bool CanUseNoMercy(out IAction act)
- {
- if (!NoMercy.CanUse(out act)) return false;
-
- if (!IsFullParty && !IsTargetBoss && !IsMoving && DemonSlice.CanUse(out _)) return true;
-
- //ȼڱж
- if (!BurstStrike.EnoughLevel) return true;
-
- if (BurstStrike.EnoughLevel)
- {
- //4GCDж
- if (IsLastGCD((ActionID)KeenEdge.ID) && Ammo == 1 && !GnashingFang.IsCoolingDown && !BloodFest.IsCoolingDown) return true;
-
- //3
- else if (Ammo == (Level >= 88 ? 3 : 2)) return true;
-
- //2
- else if (Ammo == 2 && GnashingFang.IsCoolingDown) return true;
- }
-
- act = null;
- return false;
- }
-
- private bool CanUseGnashingFang(out IAction act)
- {
- //ж
- if (GnashingFang.CanUse(out act))
- {
- //4˱ʹ
- if (DemonSlice.CanUse(out _)) return false;
-
- //3
- if (Ammo == (Level >= 88 ? 3 : 2) && (Player.HasStatus(true, StatusID.NoMercy) || !NoMercy.WillHaveOneCharge(55))) return true;
-
- //
- if (Ammo > 0 && !NoMercy.WillHaveOneCharge(17) && NoMercy.WillHaveOneCharge(35)) return true;
-
- //3ҽӵ,ǰǰ
- if (Ammo == 3 && IsLastGCD((ActionID)BrutalShell.ID) && NoMercy.WillHaveOneCharge(3)) return true;
-
- //1Ѫȴ
- if (Ammo == 1 && !NoMercy.WillHaveOneCharge(55) && BloodFest.WillHaveOneCharge(5)) return true;
-
- //4GCDж
- if (Ammo == 1 && !NoMercy.WillHaveOneCharge(55) && (!BloodFest.IsCoolingDown && BloodFest.EnoughLevel || !BloodFest.EnoughLevel)) return true;
- }
- return false;
- }
-
- ///
- ///
- ///
- ///
- ///
- private bool CanUseSonicBreak(out IAction act)
- {
- //ж
- if (SonicBreak.CanUse(out act))
- {
- //4˱вʹ
- if (DemonSlice.CanUse(out _)) return false;
-
- //if (!IsFullParty && !SonicBreak.IsTargetBoss) return false;
-
- if (!GnashingFang.EnoughLevel && Player.HasStatus(true, StatusID.NoMercy)) return true;
-
- //ʹ
- if (GnashingFang.IsCoolingDown && Player.HasStatus(true, StatusID.NoMercy)) return true;
-
- //ж
- if (!DoubleDown.EnoughLevel && Player.HasStatus(true, StatusID.ReadyToRip)
- && GnashingFang.IsCoolingDown) return true;
-
- }
- return false;
- }
-
- ///
- ///
- ///
- ///
- ///
- private bool CanUseDoubleDown(out IAction act)
- {
- //ж
- if (DoubleDown.CanUse(out act, CanUseOption.MustUse))
- {
- //4˱
- if (DemonSlice.CanUse(out _) && Player.HasStatus(true, StatusID.NoMercy)) return true;
-
- //ƺʹñ
- if (SonicBreak.IsCoolingDown && Player.HasStatus(true, StatusID.NoMercy)) return true;
-
- //2ж,ǰʹñ
- if (Player.HasStatus(true, StatusID.NoMercy) && !NoMercy.WillHaveOneCharge(55) && BloodFest.WillHaveOneCharge(5)) return true;
-
- }
- return false;
- }
-
- ///
- ///
- ///
- ///
- ///
- private bool CanUseBurstStrike(out IAction act)
- {
- if (BurstStrike.CanUse(out act))
- {
- //4˱AOEʱʹ
- if (DemonSlice.CanUse(out _)) return false;
-
- //ʣ0.5ȴ,ͷű,ҪΪٲܻͬʹӺ̫жһ
- if (SonicBreak.IsCoolingDown && SonicBreak.WillHaveOneCharge(0.5f) && GnashingFang.EnoughLevel) return false;
-
- //бж
- if (Player.HasStatus(true, StatusID.NoMercy) &&
- AmmoComboStep == 0 &&
- !GnashingFang.WillHaveOneCharge(1)) return true;
- if (Level < 88 && Ammo == 2) return true;
- //ֹ
- if (IsLastGCD((ActionID)BrutalShell.ID) &&
- (Ammo == (Level >= 88 ? 3 : 2) ||
- BloodFest.WillHaveOneCharge(6) && Ammo <= 2 && !NoMercy.WillHaveOneCharge(10) && BloodFest.EnoughLevel)) return true;
-
- }
- return false;
- }
-
- private bool CanUseBowShock(out IAction act)
- {
- if (BowShock.CanUse(out act, CanUseOption.MustUse))
- {
- if (DemonSlice.CanUse(out _) && !IsFullParty) return true;
-
- if (!SonicBreak.EnoughLevel && Player.HasStatus(true, StatusID.NoMercy)) return true;
-
- //,ȴ
- if (Player.HasStatus(true, StatusID.NoMercy) && SonicBreak.IsCoolingDown) return true;
- }
- return false;
- }
-}
\ No newline at end of file
diff --git a/RotationSolver.Default/Tank/PLD_Default.cs b/RotationSolver.Default/Tank/PLD_Default.cs
deleted file mode 100644
index 43553b628..000000000
--- a/RotationSolver.Default/Tank/PLD_Default.cs
+++ /dev/null
@@ -1,148 +0,0 @@
-
-namespace RotationSolver.Default.Tank;
-
-[LinkDescription("https://xiv.sleepyshiba.com/pld/img/63-60stentative2.png")]
-[RotationDesc("The whole rotation's burst\nis base on:")]
-[RotationDesc(ActionID.FightOrFlight)]
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Tank/PLD_Default.cs")]
-public class PLD_Default : PLD_Base
-{
- public override string GameVersion => "6.31";
- public override string RotationName => "Tentative v1.2";
-
- public override string Description => "Please work well!";
-
- protected override IRotationConfigSet CreateConfiguration()
- {
- return base.CreateConfiguration()
- .SetBool("UseDivineVeilPre", false, "DivineVeilPre in 15 seconds counting down.")
- .SetBool("UseHolyWhenAway", true, "Use HolyCircle or HolySpirit when far from enemies");
- }
-
- protected override IAction CountDownAction(float remainTime)
- {
- if (remainTime < HolySpirit.CastTime + Service.Config.CountDownAhead
- && HolySpirit.CanUse(out var act)) return act;
-
- if (remainTime < 15 && Configs.GetBool("UseDivineVeilPre")
- && DivineVeil.CanUse(out act)) return act;
-
- return base.CountDownAction(remainTime);
- }
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- act = null;
-
- if (abilitiesRemaining == 1 && InCombat)
- {
- if (UseBurstMedicine(out act)) return true;
- if (InBurst && !CombatElapsedLess(5) && FightOrFlight.CanUse(out act)) return true;
- }
- if (CombatElapsedLess(8)) return false;
-
- if (CircleOfScorn.CanUse(out act, CanUseOption.MustUse)) return true;
- if (Expiacion.CanUse(out act, CanUseOption.MustUse)) return true;
- if (SpiritsWithin.CanUse(out act, CanUseOption.MustUse)) return true;
-
- if (Player.WillStatusEndGCD(6, 0, true, StatusID.FightOrFlight)
- && Requiescat.CanUse(out act, CanUseOption.MustUse)) return true;
-
- var option = CanUseOption.MustUse;
- if(HasFightOrFlight) option |= CanUseOption.EmptyOrSkipCombo;
- if (!IsMoving && Intervene.CanUse(out act, option)) return true;
-
- if (HasTankStance && OathGauge == 100 && UseOath(out act)) return true;
-
- return false;
- }
-
- protected override bool GeneralGCD(out IAction act)
- {
- if (Player.HasStatus(true, StatusID.Requiescat))
- {
- if (Confiteor.CanUse(out act, CanUseOption.MustUse))
- {
- if (Player.HasStatus(true, StatusID.ConfiteorReady)) return true;
- if (Confiteor.ID != Confiteor.AdjustedID) return true;
- }
- if (HolyCircle.CanUse(out act)) return true;
- if (HolySpirit.CanUse(out act)) return true;
- }
-
- //AOE
- if (HasDivineMight && HolyCircle.CanUse(out act)) return true;
- if (Prominence.CanUse(out act)) return true;
- if (TotalEclipse.CanUse(out act)) return true;
-
- //Single
- if (!CombatElapsedLess(8) && HasFightOrFlight && GoringBlade.CanUse(out act)) return true; // Dot
- if (!FightOrFlight.WillHaveOneChargeGCD(2))
- {
- if (!FightOrFlight.WillHaveOneChargeGCD(6) &&
- HasDivineMight && HolySpirit.CanUse(out act)) return true;
- if (RageOfHalone.CanUse(out act)) return true;
- if (Atonement.CanUse(out act)) return true;
- }
- //123
- if (RageOfHalone.CanUse(out act)) return true;
- if (RiotBlade.CanUse(out act)) return true;
- if (FastBlade.CanUse(out act)) return true;
-
- //Range
- if (Configs.GetBool("UseHolyWhenAway"))
- {
- if (HolyCircle.CanUse(out act)) return true;
- if (HolySpirit.CanUse(out act)) return true;
- }
- if (ShieldLob.CanUse(out act)) return true;
-
- return false;
- }
-
- [RotationDesc(ActionID.Reprisal, ActionID.DivineVeil)]
- protected override bool DefenseAreaAbility(byte abilitiesRemaining, out IAction act)
- {
- if (Reprisal.CanUse(out act, CanUseOption.MustUse)) return true;
- if (DivineVeil.CanUse(out act)) return true;
- return false;
- }
-
- [RotationDesc(ActionID.PassageOfArms)]
- protected override bool HealAreaAbility(byte abilitiesRemaining, out IAction act)
- {
- if (PassageOfArms.CanUse(out act)) return true;
- return base.HealAreaAbility(abilitiesRemaining, out act);
- }
-
- [RotationDesc(ActionID.Sentinel, ActionID.Rampart, ActionID.Bulwark, ActionID.Sheltron, ActionID.Reprisal)]
- protected override bool DefenseSingleAbility(byte abilitiesRemaining, out IAction act)
- {
- if (abilitiesRemaining == 1)
- {
- //10
- if (Bulwark.CanUse(out act)) return true;
- if (UseOath(out act)) return true;
- }
- else
- {
- //30
- if (Sentinel.CanUse(out act)) return true;
-
- //20
- if (Rampart.CanUse(out act)) return true;
- }
-
- if (Reprisal.CanUse(out act)) return true;
-
- return false;
- }
-
- private static bool UseOath(out IAction act)
- {
- if (Sheltron.CanUse(out act)) return true;
- if (Intervention.CanUse(out act)) return true;
-
- return false;
- }
-}
diff --git a/RotationSolver.Default/Tank/WAR_Default.cs b/RotationSolver.Default/Tank/WAR_Default.cs
deleted file mode 100644
index 1ea20fe3a..000000000
--- a/RotationSolver.Default/Tank/WAR_Default.cs
+++ /dev/null
@@ -1,134 +0,0 @@
-namespace RotationSolver.Default.Tank;
-
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Tank/WAR_Default.cs")]
-[LinkDescription("https://cdn.discordapp.com/attachments/277962807813865472/963548326433796116/unknown.png")]
-public sealed class WAR_Default : WAR_Base
-{
- public override string GameVersion => "6.35";
-
- public override string RotationName => "All-Around";
-
- private static bool InBurstStatus => !Player.WillStatusEndGCD(0, 0, false, StatusID.InnerStrength);
-
- protected override IAction CountDownAction(float remainTime)
- {
- if (remainTime <= Service.Config.CountDownAhead)
- {
- if (HasTankStance)
- {
- if (Provoke.CanUse(out var act1)) return act1;
- }
- else
- {
- if (Tomahawk.CanUse(out var act1)) return act1;
- }
- }
- return base.CountDownAction(remainTime);
- }
-
- protected override bool GeneralGCD(out IAction act)
- {
- if(!Player.WillStatusEndGCD(3, 0, true, StatusID.SurgingTempest))
- {
- if (!IsMoving && InBurstStatus && PrimalRend.CanUse(out act, CanUseOption.MustUse))
- {
- if (PrimalRend.Target.DistanceToPlayer() < 1) return true;
- }
- if (InBurstStatus || !Player.HasStatus(false, StatusID.NascentChaos) || BeastGauge > 80)
- {
- if (SteelCyclone.CanUse(out act)) return true;
- if (InnerBeast.CanUse(out act)) return true;
- }
- }
-
- if (MythrilTempest.CanUse(out act)) return true;
- if (Overpower.CanUse(out act)) return true;
-
- if (StormsEye.CanUse(out act)) return true;
- if (StormsPath.CanUse(out act)) return true;
- if (Maim.CanUse(out act)) return true;
- if (HeavySwing.CanUse(out act)) return true;
-
- if (SpecialType == SpecialCommandType.MoveForward && MoveForwardAbility(1, out act)) return true;
- if (Tomahawk.CanUse(out act)) return true;
-
- return false;
- }
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- if (Infuriate.CanUse(out act, gcdCountForAbility: 3)) return true;
-
- if (CombatElapsedLessGCD(1)) return false;
-
- if (abilitiesRemaining == 1)
- {
- if (UseBurstMedicine(out act)) return true;
- if (Player.HasStatus(false, StatusID.SurgingTempest)
- && !Player.WillStatusEndGCD(6, 0, true, StatusID.SurgingTempest)
- || !MythrilTempest.EnoughLevel)
- {
- if (Berserk.CanUse(out act)) return true;
- }
- }
-
- if (InBurstStatus)
- {
- if (Infuriate.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
- }
-
- if (CombatElapsedLessGCD(4)) return false;
-
- if (Orogeny.CanUse(out act)) return true;
- if (Upheaval.CanUse(out act)) return true;
-
- var option = CanUseOption.MustUse;
- if (InBurstStatus) option |= CanUseOption.EmptyOrSkipCombo;
- if (Onslaught.CanUse(out act, option) && !IsMoving) return true;
-
- return false;
- }
-
- protected override bool GeneralAbility(byte abilitiesRemaining, out IAction act)
- {
- //Auto healing
- if (Player.GetHealthRatio() < 0.6f)
- {
- if (ThrillOfBattle.CanUse(out act)) return true;
- if (Equilibrium.CanUse(out act)) return true;
- }
-
- if (!HasTankStance && NascentFlash.CanUse(out act)) return true;
-
- return base.GeneralAbility(abilitiesRemaining, out act);
- }
-
- [RotationDesc(ActionID.RawIntuition, ActionID.Vengeance, ActionID.Rampart, ActionID.RawIntuition, ActionID.Reprisal)]
- protected override bool DefenseSingleAbility(byte abilitiesRemaining, out IAction act)
- {
- if (abilitiesRemaining == 1)
- {
- //10
- if (RawIntuition.CanUse(out act)) return true;
- }
- else
- {
- //30
- if (Vengeance.CanUse(out act)) return true;
-
- //20
- if (Rampart.CanUse(out act)) return true;
- }
- if (Reprisal.CanUse(out act)) return true;
-
- return false;
- }
-
- [RotationDesc(ActionID.ShakeItOff, ActionID.Reprisal)]
- protected override bool DefenseAreaAbility(byte abilitiesRemaining, out IAction act)
- {
- if (ShakeItOff.CanUse(out act, CanUseOption.MustUse)) return true;
- if (Reprisal.CanUse(out act, CanUseOption.MustUse)) return true;
- return false;
- }
-}
diff --git a/RotationSolver.Default/Tank/WAR_Old.cs b/RotationSolver.Default/Tank/WAR_Old.cs
deleted file mode 100644
index 81ece9d63..000000000
--- a/RotationSolver.Default/Tank/WAR_Old.cs
+++ /dev/null
@@ -1,96 +0,0 @@
-namespace RotationSolver.Old.Tank;
-
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Tank/WAR_Old.cs")]
-public sealed class WAR_Old : WAR_Base
-{
- public override string GameVersion => "6.0";
-
- public override string RotationName => "Old";
-
- [RotationDesc(ActionID.ShakeItOff, ActionID.Reprisal)]
- protected override bool DefenseAreaAbility(byte abilitiesRemaining, out IAction act)
- {
- if (ShakeItOff.CanUse(out act, CanUseOption.MustUse)) return true;
- if (Reprisal.CanUse(out act, CanUseOption.MustUse)) return true;
- return false;
- }
-
- protected override bool GeneralGCD(out IAction act)
- {
- //㹥
- if (PrimalRend.CanUse(out act, CanUseOption.MustUse) && !IsMoving)
- {
- if (PrimalRend.Target.DistanceToPlayer() < 1) return true;
- }
-
- if (SteelCyclone.CanUse(out act)) return true;
- if (!Player.WillStatusEndGCD(3, 0, true, StatusID.SurgingTempest))
- {
- if (InnerBeast.CanUse(out act)) return true;
- }
-
- if (MythrilTempest.CanUse(out act)) return true;
- if (Overpower.CanUse(out act)) return true;
-
- if (StormsEye.CanUse(out act)) return true;
- if (StormsPath.CanUse(out act)) return true;
- if (Maim.CanUse(out act)) return true;
- if (HeavySwing.CanUse(out act)) return true;
-
- if (SpecialType == SpecialCommandType.MoveForward && MoveForwardAbility(1, out act)) return true;
-
- if (Tomahawk.CanUse(out act)) return true;
-
- return false;
- }
-
- [RotationDesc(ActionID.RawIntuition, ActionID.Vengeance, ActionID.Rampart, ActionID.RawIntuition, ActionID.Reprisal)]
- protected override bool DefenseSingleAbility(byte abilitiesRemaining, out IAction act)
- {
- if (abilitiesRemaining == 2)
- {
- if (HostileTargets.Count() > 1)
- {
- //10
- if (RawIntuition.CanUse(out act)) return true;
- }
-
- //30
- if (Vengeance.CanUse(out act)) return true;
-
- //20
- if (Rampart.CanUse(out act)) return true;
-
- //10
- if (RawIntuition.CanUse(out act)) return true;
- }
- if (Reprisal.CanUse(out act)) return true;
-
- return false;
- }
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- if (!Player.WillStatusEndGCD(3, 0, true, StatusID.SurgingTempest) || !MythrilTempest.EnoughLevel)
- {
- if (Berserk.CanUse(out act)) return true;
- }
-
- if (Player.GetHealthRatio() < 0.6f)
- {
- if (ThrillOfBattle.CanUse(out act)) return true;
- if (Equilibrium.CanUse(out act)) return true;
- }
-
- if (!HasTankStance && NascentFlash.CanUse(out act)) return true;
-
- if (Infuriate.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true;
-
- if (Orogeny.CanUse(out act)) return true;
- if (Upheaval.CanUse(out act)) return true;
-
- if (Onslaught.CanUse(out act, CanUseOption.MustUse) && !IsMoving) return true;
-
- return false;
- }
-}
diff --git a/RotationSolver.Extra/AssemblyInfo.cs b/RotationSolver.Extra/AssemblyInfo.cs
deleted file mode 100644
index 0496e7b42..000000000
--- a/RotationSolver.Extra/AssemblyInfo.cs
+++ /dev/null
@@ -1 +0,0 @@
-[assembly: AuthorHash("Ig4lHXUohMZNIeheUtAtRg==")]
\ No newline at end of file
diff --git a/RotationSolver.Extra/Magical/BLU_Extra.cs b/RotationSolver.Extra/Magical/BLU_Extra.cs
deleted file mode 100644
index 989c4e0c7..000000000
--- a/RotationSolver.Extra/Magical/BLU_Extra.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-namespace RotationSolver.Extra.Magical;
-
-[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Extra/Magical/BLU_Extra.cs")]
-public sealed class BLU_Extra : BLU_Base
-{
- public override string GameVersion => "6.3";
-
- public override string RotationName => "Extra";
-
- public override string Description => "This is a simplified version for me (ArchiTed) using, \nwhich doesn't contain all actions.";
-
- protected override bool AttackAbility(byte abilitiesRemaining, out IAction act)
- {
- act = null;
- return false;
- }
-
- protected override bool GeneralGCD(out IAction act)
- {
- if (ChocoMeteor.CanUse(out act)) return true;
- if (DrillCannons.CanUse(out act)) return true;
-
-
- if (TripleTrident.OnSlot && TripleTrident.RightType && TripleTrident.WillHaveOneChargeGCD(OnSlotCount(Whistle, Tingle), 0))
- {
- if ((TripleTrident.CanUse(out _, CanUseOption.MustUse) || !HasHostilesInRange) && Whistle.CanUse(out act)) return true;
-
- if (!Player.HasStatus(true, StatusID.Tingling)
- && Tingle.CanUse(out act, CanUseOption.MustUse)) return true;
- if (OffGuard.CanUse(out act)) return true;
-
- if (TripleTrident.CanUse(out act, CanUseOption.MustUse)) return true;
- }
- if (ChocoMeteor.CanUse(out act, DataCenter.HasCompanion ? CanUseOption.MustUse : CanUseOption.None)) return true;
-
- if (SonicBoom.CanUse(out act)) return true;
- if (DrillCannons.CanUse(out act, CanUseOption.MustUse)) return true;
-
- return false;
- }
-}
diff --git a/RotationSolver.Extra/RotationSolver.Extra.csproj b/RotationSolver.Extra/RotationSolver.Extra.csproj
deleted file mode 100644
index 7bfc5f4c2..000000000
--- a/RotationSolver.Extra/RotationSolver.Extra.csproj
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/RotationSolver.sln b/RotationSolver.sln
index ad6974605..430d1dd9b 100644
--- a/RotationSolver.sln
+++ b/RotationSolver.sln
@@ -13,24 +13,16 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
Resources\whiteList.json = Resources\whiteList.json
EndProjectSection
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RotationSolver.Default", "RotationSolver.Default\RotationSolver.Default.csproj", "{CC7BE595-27DE-4206-AE11-8184E7FCF0CD}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RotationSolver.Basic", "RotationSolver.Basic\RotationSolver.Basic.csproj", "{140CC27C-0923-4183-9C30-26A7BDEBE606}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RotationSolver", "RotationSolver\RotationSolver.csproj", "{99EA3D95-33DC-424F-A9E6-FE6064F11592}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RotationSolver.Extra", "RotationSolver.Extra\RotationSolver.Extra.csproj", "{09783AAB-C25E-4DF7-9693-0D47DC6108F2}"
-EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {CC7BE595-27DE-4206-AE11-8184E7FCF0CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {CC7BE595-27DE-4206-AE11-8184E7FCF0CD}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {CC7BE595-27DE-4206-AE11-8184E7FCF0CD}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {CC7BE595-27DE-4206-AE11-8184E7FCF0CD}.Release|Any CPU.Build.0 = Release|Any CPU
{140CC27C-0923-4183-9C30-26A7BDEBE606}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{140CC27C-0923-4183-9C30-26A7BDEBE606}.Debug|Any CPU.Build.0 = Debug|Any CPU
{140CC27C-0923-4183-9C30-26A7BDEBE606}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -39,10 +31,6 @@ Global
{99EA3D95-33DC-424F-A9E6-FE6064F11592}.Debug|Any CPU.Build.0 = Debug|Any CPU
{99EA3D95-33DC-424F-A9E6-FE6064F11592}.Release|Any CPU.ActiveCfg = Release|Any CPU
{99EA3D95-33DC-424F-A9E6-FE6064F11592}.Release|Any CPU.Build.0 = Release|Any CPU
- {09783AAB-C25E-4DF7-9693-0D47DC6108F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {09783AAB-C25E-4DF7-9693-0D47DC6108F2}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {09783AAB-C25E-4DF7-9693-0D47DC6108F2}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {09783AAB-C25E-4DF7-9693-0D47DC6108F2}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/RotationSolver/RotationSolver.csproj b/RotationSolver/RotationSolver.csproj
index a97271f42..b5508ea8b 100644
--- a/RotationSolver/RotationSolver.csproj
+++ b/RotationSolver/RotationSolver.csproj
@@ -11,7 +11,6 @@
-