From 6642448809868ce3827a3fda67266b44c1bfacda Mon Sep 17 00:00:00 2001 From: LTS-FFXIV <127939494+LTS-FFXIV@users.noreply.github.com> Date: Thu, 23 May 2024 08:10:42 -0500 Subject: [PATCH] The Jade Stoa and Hells Kier first passes --- .../Stormblood/Trial/T05Yojimbo/T05Yojimbo.cs | 2 +- .../Stormblood/Trial/T07Byakko/T07Byakko.cs | 54 ++++++++++++++++++- .../Trial/T07Byakko/T07ByakkoEnums.cs | 18 ++++--- .../Trial/T07Byakko/T07ByakkoStates.cs | 15 +++++- .../Stormblood/Trial/T08Suzaku/T08Suzaku.cs | 35 +++++++++++- .../Trial/T08Suzaku/T08SuzakuEnums.cs | 36 +++++++------ .../Trial/T08Suzaku/T08SuzakuStates.cs | 15 +++++- 7 files changed, 145 insertions(+), 30 deletions(-) diff --git a/BossMod/Modules/Stormblood/Trial/T05Yojimbo/T05Yojimbo.cs b/BossMod/Modules/Stormblood/Trial/T05Yojimbo/T05Yojimbo.cs index a80b2b6704..352f480fc4 100644 --- a/BossMod/Modules/Stormblood/Trial/T05Yojimbo/T05Yojimbo.cs +++ b/BossMod/Modules/Stormblood/Trial/T05Yojimbo/T05Yojimbo.cs @@ -1,4 +1,4 @@ namespace BossMod.Stormblood.Trial.T05Yojimbo; -[ModuleInfo(BossModuleInfo.Maturity.WIP, Contributors = "The Combat Reborn Team", GroupType = BossModuleInfo.GroupType.CFC, GroupID = 262, NameID = 6089)] +[ModuleInfo(BossModuleInfo.Maturity.WIP, Contributors = "The Combat Reborn Team", GroupType = BossModuleInfo.GroupType.CFC, GroupID = 595, NameID = 6089)] public class T05Yojimbo(WorldState ws, Actor primary) : BossModule(ws, primary, new(100, 100), new ArenaBoundsSquare(20)); diff --git a/BossMod/Modules/Stormblood/Trial/T07Byakko/T07Byakko.cs b/BossMod/Modules/Stormblood/Trial/T07Byakko/T07Byakko.cs index c5b81b7a65..8a42c31e9a 100644 --- a/BossMod/Modules/Stormblood/Trial/T07Byakko/T07Byakko.cs +++ b/BossMod/Modules/Stormblood/Trial/T07Byakko/T07Byakko.cs @@ -1,4 +1,56 @@ namespace BossMod.Stormblood.Trial.T07Byakko; -[ModuleInfo(BossModuleInfo.Maturity.WIP, Contributors = "The Combat Reborn Team", GroupType = BossModuleInfo.GroupType.CFC, GroupID = 243, NameID = 6221)] +class StormPulse(BossModule module) : Components.RaidwideCast(module, ActionID.MakeSpell(AID.StormPulse)); +class HeavenlyStrike(BossModule module) : Components.SingleTargetCast(module, ActionID.MakeSpell(AID.HeavenlyStrike)); +class HeavenlyStrikeSpread(BossModule module) : Components.SpreadFromCastTargets(module, ActionID.MakeSpell(AID.HeavenlyStrike), 3); +class SweepTheLeg1(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.SweepTheLeg1), new AOEShapeCone(28.5f, 135.Degrees())); +class SweepTheLeg3(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.SweepTheLeg3), new AOEShapeDonut(5, 30)); +class TheRoarOfThunder(BossModule module) : Components.RaidwideCast(module, ActionID.MakeSpell(AID.TheRoarOfThunder)); +class ImperialGuard(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.ImperialGuard), new AOEShapeRect(44.75f, 2.5f)); +class FireAndLightning1(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.FireAndLightning1), new AOEShapeRect(50, 10)); +class FireAndLightning2(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.FireAndLightning2), new AOEShapeRect(50, 10)); +//class Aratama1(BossModule module) : Components.LocationTargetedAOEs(module, ActionID.MakeSpell(AID.Aratama1), 4); +class DistantClap(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.DistantClap), new AOEShapeDonut(5, 30)); + +class HighestStakes(BossModule module) : Components.StackWithIcon(module, (uint)IconID.Stackmarker, ActionID.MakeSpell(AID.HighestStakes2), 6, 5, 7); + +class AratamaForce(BossModule module) : Components.GenericAOEs(module) +{ + private readonly IReadOnlyList _bubbles = module.Enemies(OID.AratamaForce); + + private static readonly AOEShapeCircle _shape = new(2); + + public override IEnumerable ActiveAOEs(int slot, Actor actor) => _bubbles.Where(actor => !actor.IsDead).Select(b => new AOEInstance(_shape, b.Position)); +} + +class HundredfoldHavoc(BossModule module) : Components.Exaflare(module, 5) +{ + public override void OnCastStarted(Actor caster, ActorCastInfo spell) + { + if ((AID)spell.Action.ID is AID.HundredfoldHavocFirst) + { + Lines.Add(new() { Next = spell.LocXZ, Advance = 5 * caster.Rotation.ToDirection(), NextExplosion = spell.NPCFinishAt, TimeToMove = 1, ExplosionsLeft = 10, MaxShownExplosions = 2 }); + } + } + + public override void OnEventCast(Actor caster, ActorCastEvent spell) + { + if ((AID)spell.Action.ID is AID.HundredfoldHavocFirst or AID.HundredfoldHavocRest) + { + ++NumCasts; + int index = Lines.FindIndex(item => item.Next.AlmostEqual(spell.TargetXZ, 1)); + if (index == -1) + { + ReportError($"Failed to find entry for {caster.InstanceID:X}"); + return; + } + + AdvanceLine(Lines[index], spell.TargetXZ); + if (Lines[index].ExplosionsLeft == 0) + Lines.RemoveAt(index); + } + } +} + +[ModuleInfo(BossModuleInfo.Maturity.WIP, Contributors = "The Combat Reborn Team", GroupType = BossModuleInfo.GroupType.CFC, GroupID = 290, NameID = 6221)] public class T07Byakko(WorldState ws, Actor primary) : BossModule(ws, primary, new(0, 0), new ArenaBoundsCircle(20)); diff --git a/BossMod/Modules/Stormblood/Trial/T07Byakko/T07ByakkoEnums.cs b/BossMod/Modules/Stormblood/Trial/T07Byakko/T07ByakkoEnums.cs index 5d89becdb5..45b10d4026 100644 --- a/BossMod/Modules/Stormblood/Trial/T07Byakko/T07ByakkoEnums.cs +++ b/BossMod/Modules/Stormblood/Trial/T07Byakko/T07ByakkoEnums.cs @@ -16,6 +16,8 @@ public enum AID : uint AutoAttack = 872, // Boss->player, no cast, single-target MobAutoAttack = 870, // Hakutei1->player, no cast, single-target + DanceOfTheIncomplete = 9681, // Boss->self, no cast, single-target + AnswerOnHigh = 10212, // Boss->self, no cast, single-target Aratama1 = 10793, // Helper->location, 2.5s cast, range 4 circle @@ -26,20 +28,20 @@ public enum AID : uint Bombogenesis2 = 10811, // Helper->self, no cast, range 6 circle Clutch = 10209, // Boss->player, no cast, single-target - DanceOfTheIncomplete = 9681, // Boss->self, no cast, single-target + DistantClap = 10800, // Boss->self, 5.0s cast, range ?-25 donut FellSwoop = 10829, // Helper->self, no cast, range 100 circle FireAndLightning1 = 10796, // Boss->self, 4.0s cast, range 50+R width 20 rect FireAndLightning2 = 10801, // Hakutei1->self, 4.0s cast, range 50+R width 20 rect - HeavenlyStrike = 10797, // Boss->player, 4.0s cast, range 3 circle + HeavenlyStrike = 10797, // Boss->player, 4.0s cast, range 3 circle // Tankbuster HighestStakes1 = 10210, // Boss->location, 5.0s cast, single-target HighestStakes2 = 10806, // Helper->location, no cast, range 6 circle - HundredfoldHavoc1 = 10808, // Helper->self, 5.0s cast, range 5 circle - HundredfoldHavoc2 = 10809, // Helper->self, no cast, range 5 circle + HundredfoldHavocFirst = 10808, // Helper->self, 5.0s cast, range 5 circle + HundredfoldHavocRest = 10809, // Helper->self, no cast, range 5 circle ImperialGuard = 10819, // Hakutei2->self, 3.0s cast, range 40+R width 5 rect @@ -47,7 +49,7 @@ public enum AID : uint StateOfShock2 = 10208, // Boss->player, 4.0s cast, single-target SteelClaw = 10802, // Hakutei1->self, no cast, range 13+R ?-degree cone - StormPulse = 10799, // Boss->self, 4.0s cast, range 100 circle + StormPulse = 10799, // Boss->self, 4.0s cast, range 100 circle // Raidwide SweepTheLeg1 = 10798, // Boss->self, 4.0s cast, range 24+R 270-degree cone SweepTheLeg2 = 10821, // Boss->self, no cast, single-target @@ -83,7 +85,7 @@ public enum SID : uint public enum IconID : uint { - Icon62 = 62, // Helper - Icon87 = 87, // player - Icon101 = 101, // player + Stackmarker = 62, // Helper + Burn = 87, // player + Spreadmarker = 101, // player } diff --git a/BossMod/Modules/Stormblood/Trial/T07Byakko/T07ByakkoStates.cs b/BossMod/Modules/Stormblood/Trial/T07Byakko/T07ByakkoStates.cs index af8790240e..f2e33fa731 100644 --- a/BossMod/Modules/Stormblood/Trial/T07Byakko/T07ByakkoStates.cs +++ b/BossMod/Modules/Stormblood/Trial/T07Byakko/T07ByakkoStates.cs @@ -4,6 +4,19 @@ class T07ByakkoStates : StateMachineBuilder { public T07ByakkoStates(BossModule module) : base(module) { - TrivialPhase(); + TrivialPhase() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + //.ActivateOnEnter() stack marker not being removed properly + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + //.ActivateOnEnter() just not appearing, unsure why + .ActivateOnEnter(); } } diff --git a/BossMod/Modules/Stormblood/Trial/T08Suzaku/T08Suzaku.cs b/BossMod/Modules/Stormblood/Trial/T08Suzaku/T08Suzaku.cs index faa6701270..04fb071477 100644 --- a/BossMod/Modules/Stormblood/Trial/T08Suzaku/T08Suzaku.cs +++ b/BossMod/Modules/Stormblood/Trial/T08Suzaku/T08Suzaku.cs @@ -1,4 +1,35 @@ namespace BossMod.Stormblood.Trial.T08Suzaku; -[ModuleInfo(BossModuleInfo.Maturity.WIP, Contributors = "The Combat Reborn Team", GroupType = BossModuleInfo.GroupType.CFC, GroupID = 243, NameID = 6221)] -public class T08Suzaku(WorldState ws, Actor primary) : BossModule(ws, primary, new(100, 100), new ArenaBoundsCircle(20)); \ No newline at end of file +class ScarletFever(BossModule module) : BossComponent(module) +{ + public override void OnCastFinished(Actor caster, ActorCastInfo spell) + { + if ((AID)spell.Action.ID == AID.ScarletFever) + Module.Arena.Bounds = T08Suzaku.phase2Arena; + } +} + +class ScreamsOfTheDamned(BossModule module) : Components.RaidwideCast(module, ActionID.MakeSpell(AID.ScreamsOfTheDamned)); +class SouthronStar(BossModule module) : Components.RaidwideCast(module, ActionID.MakeSpell(AID.SouthronStar)); +class AshesToAshes(BossModule module) : Components.RaidwideCast(module, ActionID.MakeSpell(AID.AshesToAshes)); +class ScarletFeverAOE(BossModule module) : Components.RaidwideCast(module, ActionID.MakeSpell(AID.ScarletFever)); + +class RuthlessRefrain(BossModule module) : Components.KnockbackFromCastTarget(module, ActionID.MakeSpell(AID.RuthlessRefrain), 8); +class Cremate(BossModule module) : Components.SingleTargetCast(module, ActionID.MakeSpell(AID.Cremate)); +class PhantomFlurryTankbuster(BossModule module) : Components.SingleTargetCast(module, ActionID.MakeSpell(AID.PhantomFlurryTankbuster)); +class PhantomFlurryAOE(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.PhantomFlurryAOE), new AOEShapeCone(41, 90.Degrees())); +class FleetingSummer(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.FleetingSummer), new AOEShapeCone(40, 45.Degrees())); +class Hotspot(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.Hotspot), new AOEShapeCone(21, 60.Degrees())); +class Swoop(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.Swoop), new AOEShapeRect(55, 3)); +class WellOfFlame(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.WellOfFlame), new AOEShapeRect(41, 10)); + +[ModuleInfo(BossModuleInfo.Maturity.WIP, Contributors = "The Combat Reborn Team", GroupType = BossModuleInfo.GroupType.CFC, GroupID = 596, NameID = 6221)] +public class T08Suzaku(WorldState ws, Actor primary) : BossModule(ws, primary, arena.Center, arena) +{ + private static readonly List union = [new Circle(new(100, 100), 20)]; + public static readonly ArenaBounds arena = new ArenaBoundsComplex(union); + + private static readonly List union2 = [new Circle(new(100, 100), 20)]; + private static readonly List difference2 = [new Circle(new(100, 100), 4)]; + public static readonly ArenaBounds phase2Arena = new ArenaBoundsComplex(union2, difference2); +} diff --git a/BossMod/Modules/Stormblood/Trial/T08Suzaku/T08SuzakuEnums.cs b/BossMod/Modules/Stormblood/Trial/T08Suzaku/T08SuzakuEnums.cs index 9c49fd411e..dfc7a0b969 100644 --- a/BossMod/Modules/Stormblood/Trial/T08Suzaku/T08SuzakuEnums.cs +++ b/BossMod/Modules/Stormblood/Trial/T08Suzaku/T08SuzakuEnums.cs @@ -23,28 +23,32 @@ public enum AID : uint ScarletLadyAuto = 14065, // ScarletLady->player, no cast, single-target AutoAttack2 = 12863, // Boss->player, no cast, single-target - AshesToAshes = 12831, // ScarletLady->self, 3.0s cast, range 40 circle - Burn = 12861, // Helper->self, no cast, range 4 circle - Cremate = 12832, // Boss->player, 3.0s cast, single-target - EternalFlame = 12834, // Boss->self, 3.0s cast, range 80 circle - FleetingSummer = 12835, // Boss->self, 3.0s cast, range 40 90-degree cone - Hotspot = 12856, // Helper->self, 0.9s cast, range 21 ?-degree cone - IncandescentInterlude = 12860, // Boss->self, 4.0s cast, single-target + ScreamsOfTheDamned = 12833, // Boss->self, 3.0s cast, range 40 circle // Raidwide + SouthronStar = 12852, // Boss->self, 4.0s cast, range 41 circle // Raidwide + AshesToAshes = 12831, // ScarletLady->self, 3.0s cast, range 40 circle // Raidwide + ScarletFever = 12844, // Helper->self, 7.0s cast, range 41 circle // Raidwide + + RuthlessRefrain = 12848, // Boss->self, 4.0s cast, range 41 circle // Knockback + + Cremate = 12832, // Boss->player, 3.0s cast, single-target // Tankbuster - PhantomFlurry1 = 12849, // Boss->self, 4.0s cast, single-target - PhantomFlurry2 = 12850, // Helper->players, no cast, single-target - PhantomFlurry3 = 12851, // Helper->self, 6.0s cast, range 41 180-degree cone + PhantomFlurryVisual = 12849, // Boss->self, 4.0s cast, single-target + PhantomFlurryTankbuster = 12850, // Helper->players, no cast, single-target // Tankbuster + PhantomFlurryAOE = 12851, // Helper->self, 6.0s cast, range 41 180-degree cone + IncandescentInterlude = 12860, // Boss->self, 4.0s cast, single-target // Towers + Rekindle = 12853, // Helper->player, no cast, range 6 circle // Spread + + EternalFlame = 12834, // Boss->self, 3.0s cast, range 80 circle // summons ScarletLady PhoenixDown = 12836, // Boss->self, 3.0s cast, single-target - Rekindle = 12853, // Helper->player, no cast, range 6 circle - RuthlessRefrain = 12848, // Boss->self, 4.0s cast, range 41 circle - ScarletFever = 12844, // Helper->self, 7.0s cast, range 41 circle + + Burn = 12861, // Helper->self, no cast, range 4 circle + FleetingSummer = 12835, // Boss->self, 3.0s cast, range 40 90-degree cone + Hotspot = 12856, // Helper->self, 0.9s cast, range 21 ?-degree cone ScarletHymn1 = 12840, // RapturousEcho->player, no cast, single-target ScarletHymn2 = 12855, // Boss->self, no cast, single-target - ScreamsOfTheDamned = 12833, // Boss->self, 3.0s cast, range 40 circle - SouthronStar = 12852, // Boss->self, 4.0s cast, range 41 circle Swoop = 12859, // Suzaku1->self, 3.0s cast, range 55 width 6 rect UnknownSpell = 12846, // Boss->location, no cast, single-target @@ -76,7 +80,7 @@ public enum SID : uint public enum IconID : uint { Icon381 = 381, // player - Icon139 = 139, // player + Spreadmarker = 139, // player } public enum TetherID : uint diff --git a/BossMod/Modules/Stormblood/Trial/T08Suzaku/T08SuzakuStates.cs b/BossMod/Modules/Stormblood/Trial/T08Suzaku/T08SuzakuStates.cs index 3263a11307..51c48acbb5 100644 --- a/BossMod/Modules/Stormblood/Trial/T08Suzaku/T08SuzakuStates.cs +++ b/BossMod/Modules/Stormblood/Trial/T08Suzaku/T08SuzakuStates.cs @@ -4,6 +4,19 @@ class T08SuzakuStates : StateMachineBuilder { public T08SuzakuStates(BossModule module) : base(module) { - TrivialPhase(); + TrivialPhase() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter(); } }