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 @@ -