diff --git a/BossMod/Modules/Endwalker/Variant/V01SS/V011Geryon/V011Geryon.cs b/BossMod/Modules/Endwalker/Variant/V01SS/V011Geryon/V011Geryon.cs index e834f59420..b2b7acd9b6 100644 --- a/BossMod/Modules/Endwalker/Variant/V01SS/V011Geryon/V011Geryon.cs +++ b/BossMod/Modules/Endwalker/Variant/V01SS/V011Geryon/V011Geryon.cs @@ -13,6 +13,37 @@ class ColossalCharge2(BossModule module) : Components.ChargeAOEs(module, ActionI class ColossalSwing(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.ColossalSwing), new AOEShapeCone(60, 180.Degrees())); class SubterraneanShudder(BossModule module) : Components.RaidwideCast(module, ActionID.MakeSpell(AID.SubterraneanShudder)); +class RunawaySludge(BossModule module) : Components.LocationTargetedAOEs(module, ActionID.MakeSpell(AID.RunawaySludge), 9); + +class Shockwave(BossModule module) : Components.Knockback(module) +{ + private readonly List _sources = []; + private static readonly AOEShapeRect _shape = new(40, 40); + + public override IEnumerable Sources(int slot, Actor actor) => _sources; + + public override void OnCastStarted(Actor caster, ActorCastInfo spell) + { + if ((AID)spell.Action.ID is AID.Shockwave) + { + _sources.Clear(); + // knockback rect always happens through center, so create two sources with origin at center looking orthogonally + _sources.Add(new(Module.Bounds.Center, 15, spell.NPCFinishAt, _shape, spell.Rotation + 90.Degrees(), Kind.DirForward)); + _sources.Add(new(Module.Bounds.Center, 15, spell.NPCFinishAt, _shape, spell.Rotation - 90.Degrees(), Kind.DirForward)); + } + } + + public override void OnCastFinished(Actor caster, ActorCastInfo spell) + { + if ((AID)spell.Action.ID == AID.Shockwave) + { + _sources.Clear(); + ++NumCasts; + } + } + + public override bool DestinationUnsafe(int slot, Actor actor, WPos pos) => (Module.FindComponent()?.ActiveAOEs(slot, actor).Any(z => z.Shape.Check(pos, z.Origin, z.Rotation)) ?? false) || !Module.Bounds.Contains(pos); +} [ModuleInfo(BossModuleInfo.Maturity.WIP, Contributors = "CombatReborn Team", PrimaryActorOID = (uint)OID.Boss, GroupType = BossModuleInfo.GroupType.CFC, GroupID = 868, NameID = 11442)] public class V011Geryon(WorldState ws, Actor primary) : BossModule(ws, primary, new ArenaBoundsSquare(new(183, 176.99f), 19.5f)) @@ -26,11 +57,11 @@ protected override void DrawEnemies(int pcSlot, Actor pc) protected override void UpdateModule() { - if (Enemies(OID.Boss).Any(e => e.Position.AlmostEqual(new(-213, -100), 50))) - Arena.Bounds = new ArenaBoundsSquare(new(-213, 100), 19.5f); + if (Enemies(OID.Boss).Any(e => e.Position.AlmostEqual(new(-212, 124), 50))) + Arena.Bounds = new ArenaBoundsSquare(new(-213, 101), 19.5f); if (Enemies(OID.Boss).Any(e => e.Position.AlmostEqual(new(0, 0), 50))) Arena.Bounds = new ArenaBoundsSquare(new(0, 0), 19.5f); if (Enemies(OID.Boss).Any(e => e.Position.AlmostEqual(new(183, 176.99f), 50))) - Arena.Bounds = new ArenaBoundsSquare(new(183, 176.99f), 19.5f); //Note: the arena doesn't seem to be a perfect circle, but this seems good enough + Arena.Bounds = new ArenaBoundsSquare(new(183, 176.99f), 19.5f); } } \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Variant/V01SS/V011Geryon/V011GeryonEnums.cs b/BossMod/Modules/Endwalker/Variant/V01SS/V011Geryon/V011GeryonEnums.cs index 3aa6f4ef78..b75ce812c5 100644 --- a/BossMod/Modules/Endwalker/Variant/V01SS/V011Geryon/V011GeryonEnums.cs +++ b/BossMod/Modules/Endwalker/Variant/V01SS/V011Geryon/V011GeryonEnums.cs @@ -1,4 +1,6 @@ -namespace BossMod.Endwalker.Variant.V01SS.V011Geryon; +using BossMod.Endwalker.Alliance.A32Llymlaen; + +namespace BossMod.Endwalker.Variant.V01SS.V011Geryon; public enum OID : uint { @@ -36,6 +38,14 @@ public enum AID : uint RollingBoulder = 29914, // Helper->self, no cast, range 10 width 10 rect + //route 3 + RunawaySludge = 29910, // Helper->self, 5.0s cast, range 9 circle + Shockwave = 29902, // Boss->self, 5.0s cast, range 40 width 40 rect +} + +public enum SID : uint +{ + Sludge = 2948, // none->player, extra=0x0 route 3 } public enum IconID : uint @@ -43,4 +53,4 @@ public enum IconID : uint Icon_218 = 218, // player Icon_156 = 156, // Boss Icon_157 = 157, // Boss -} +} \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Variant/V01SS/V011Geryon/V011GeryonStates.cs b/BossMod/Modules/Endwalker/Variant/V01SS/V011Geryon/V011GeryonStates.cs index f94cef91bb..ea32e28131 100644 --- a/BossMod/Modules/Endwalker/Variant/V01SS/V011Geryon/V011GeryonStates.cs +++ b/BossMod/Modules/Endwalker/Variant/V01SS/V011Geryon/V011GeryonStates.cs @@ -14,6 +14,8 @@ public V011GeryonStates(BossModule module) : base(module) .ActivateOnEnter() .ActivateOnEnter() .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() .ActivateOnEnter(); } } \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Variant/V01SS/V012Silkie/V012PuffTracker.cs b/BossMod/Modules/Endwalker/Variant/V01SS/V012Silkie/V012PuffTracker.cs index 4a43c3deef..3b286dc936 100644 --- a/BossMod/Modules/Endwalker/Variant/V01SS/V012Silkie/V012PuffTracker.cs +++ b/BossMod/Modules/Endwalker/Variant/V01SS/V012Silkie/V012PuffTracker.cs @@ -4,13 +4,11 @@ class V012PuffTracker(BossModule module) : BossComponent(module) { public List BracingPuffs = new(); public List ChillingPuffs = new(); - public List FizzlingPuffs = new(); public override void DrawArenaForeground(int pcSlot, Actor pc) { Arena.Actors(BracingPuffs, 0xff80ff80, true); Arena.Actors(ChillingPuffs, 0xffff8040, true); - Arena.Actors(FizzlingPuffs, 0xff40c0c0, true); } public override void OnStatusGain(Actor actor, ActorStatus status) @@ -20,12 +18,10 @@ public override void OnStatusGain(Actor actor, ActorStatus status) case SID.BracingSudsPuff: BracingPuffs.Add(actor); ChillingPuffs.Remove(actor); - FizzlingPuffs.Remove(actor); break; case SID.ChillingSudsPuff: BracingPuffs.Remove(actor); ChillingPuffs.Add(actor); - FizzlingPuffs.Remove(actor); break; } } diff --git a/BossMod/Modules/Endwalker/Variant/V01SS/V012Silkie/V012Silkie.cs b/BossMod/Modules/Endwalker/Variant/V01SS/V012Silkie/V012Silkie.cs index 3e4d7778f7..319a8c2310 100644 --- a/BossMod/Modules/Endwalker/Variant/V01SS/V012Silkie/V012Silkie.cs +++ b/BossMod/Modules/Endwalker/Variant/V01SS/V012Silkie/V012Silkie.cs @@ -5,8 +5,8 @@ class TotalWash(BossModule module) : Components.RaidwideCast(module, ActionID.Ma class DustBlusterKnockback(BossModule module) : Components.KnockbackFromCastTarget(module, ActionID.MakeSpell(AID.DustBlusterKnockback), 16, shape: new AOEShapeCircle(60)); class WashOutKnockback(BossModule module) : Components.KnockbackFromCastTarget(module, ActionID.MakeSpell(AID.WashOutKnockback), 35, shape: new AOEShapeRect(60, 60), kind: Kind.DirForward); -class BracingDuster1(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.BracingDuster1), new AOEShapeDonut(3, 60)); -class BracingDuster2(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.BracingDuster2), new AOEShapeDonut(3, 60)); +class BracingDuster1(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.BracingDuster1), new AOEShapeDonut(5, 60)); +class BracingDuster2(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.BracingDuster2), new AOEShapeDonut(5, 60)); class ChillingDuster1(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.ChillingDuster1), new AOEShapeCross(60, 5)); class ChillingDuster2(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.ChillingDuster2), new AOEShapeCross(60, 5)); @@ -15,6 +15,9 @@ class TotalWash(BossModule module) : Components.RaidwideCast(module, ActionID.Ma class SlipperySoap(BossModule module) : Components.ChargeAOEs(module, ActionID.MakeSpell(AID.SlipperySoap), 5); class SpotRemover2(BossModule module) : Components.LocationTargetedAOEs(module, ActionID.MakeSpell(AID.SpotRemover2), 5); +class PuffAndTumble1(BossModule module) : Components.LocationTargetedAOEs(module, ActionID.MakeSpell(AID.PuffAndTumble1), 4); +class PuffAndTumble2(BossModule module) : Components.LocationTargetedAOEs(module, ActionID.MakeSpell(AID.PuffAndTumble2), 4); + class SqueakyCleanAOE1E(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.SqueakyCleanAOE1E), new AOEShapeCone(60, 45.Degrees())); class SqueakyCleanAOE2E(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.SqueakyCleanAOE2E), new AOEShapeCone(60, 45.Degrees())); class SqueakyCleanAOE3E(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.SqueakyCleanAOE3E), new AOEShapeCone(60, 112.5f.Degrees())); @@ -23,5 +26,33 @@ class SpotRemover2(BossModule module) : Components.LocationTargetedAOEs(module, class SqueakyCleanAOE2W(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.SqueakyCleanAOE2W), new AOEShapeCone(60, 45.Degrees())); class SqueakyCleanAOE3W(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.SqueakyCleanAOE3W), new AOEShapeCone(60, 112.5f.Degrees())); +class EasternEwers(BossModule module) : Components.Exaflare(module, 4) +{ + public override void OnCastStarted(Actor caster, ActorCastInfo spell) + { + if ((AID)spell.Action.ID is AID.BrimOver) + { + Lines.Add(new() { Next = caster.Position, Advance = new(0, 5.1f), NextExplosion = spell.NPCFinishAt, TimeToMove = 0.8f, ExplosionsLeft = 11, MaxShownExplosions = int.MaxValue }); + } + } + + public override void OnEventCast(Actor caster, ActorCastEvent spell) + { + if ((AID)spell.Action.ID is AID.BrimOver or AID.Rinse) + { + int index = Lines.FindIndex(item => Math.Abs(item.Next.X - caster.Position.X) < 1); + if (index == -1) + { + ReportError($"Failed to find entry for {caster.InstanceID:X}"); + return; + } + + AdvanceLine(Lines[index], caster.Position); + if (Lines[index].ExplosionsLeft == 0) + Lines.RemoveAt(index); + } + } +} + [ModuleInfo(BossModuleInfo.Maturity.WIP, Contributors = "CombatReborn Team", PrimaryActorOID = (uint)OID.Boss, GroupType = BossModuleInfo.GroupType.CFC, GroupID = 868, NameID = 11369)] public class V012Silkie(WorldState ws, Actor primary) : BossModule(ws, primary, new ArenaBoundsSquare(new(-335, -155), 20)); diff --git a/BossMod/Modules/Endwalker/Variant/V01SS/V012Silkie/V012SilkieEnums.cs b/BossMod/Modules/Endwalker/Variant/V01SS/V012Silkie/V012SilkieEnums.cs index 83f2e77272..898312958e 100644 --- a/BossMod/Modules/Endwalker/Variant/V01SS/V012Silkie/V012SilkieEnums.cs +++ b/BossMod/Modules/Endwalker/Variant/V01SS/V012Silkie/V012SilkieEnums.cs @@ -7,6 +7,7 @@ public enum OID : uint EasternEwer = 0x39F1, // R2.400, x5 SilkenPuff = 0x39F0, // R1.000, x15 Actor1e9230 = 0x1E9230, // R0.500, x0 (spawn during fight), EventObj type + Actor1eb76e = 0x1EB76E, // R0.500, x0 (spawn during fight), EventObj type // possibly route 3 brooms } public enum AID : uint @@ -37,7 +38,7 @@ public enum AID : uint SlipperySoap = 30522, // Boss->location, 5.0s cast, width 10 rect charge SpotRemover1 = 30530, // Boss->self, 3.5s cast, single-target - SpotRemover2 = 30531, // Helper->location, 3.5s cast, range 5 circle + SpotRemover2 = 30531, // Helper->location, 3.5s cast, range 5 circle// persistenet aoe SqueakyCleanE = 30509, // Boss->self, 4.5s cast, single-target SqueakyCleanAOE1E = 30511, // Helper->self, 6.0s cast, range 60 90-degree cone @@ -51,6 +52,18 @@ public enum AID : uint WashOut1 = 30533, // Boss->self, 8.0s cast, single-target WashOutKnockback = 30534, // Helper->self, 8.0s cast, range 60 width 60 rect + + //route 2 + EasternEwers = 30535, // Boss->self, 4.0s cast, single-target + BrimOver = 30536, // EasternEwer->self, 3.0s cast, range 4 circle + Rinse = 30537, // Helper->self, no cast, range 4 circle + + //route 4 + PuffAndTumbleRest = 30538, // SilkenPuff->location, 3.0s cast, single-target + PuffAndTumbleVisual = 30539, // SilkenPuff->location, no cast, single-target + PuffAndTumble1 = 30540, // Helper->location, 4.6s cast, range 4 circle + PuffAndTumble2 = 30656, // Helper->location, 1.6s cast, range 4 circle + } public enum SID : uint @@ -60,9 +73,11 @@ public enum SID : uint ChillingSudsBoss = 3298, // Boss->Boss, extra=0x0 BracingSudsPuff = 3305, // none->SilkenPuff, extra=0x0 ChillingSudsPuff = 3306, // none->SilkenPuff, extra=0x0 + Route2Ewer = 2397, // none->EasternEwer, extra=0x1EC + } public enum IconID : uint { - Icon_218 = 218, // player -} + Tankbuster = 218, // player +} \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Variant/V01SS/V012Silkie/V012SilkieStates.cs b/BossMod/Modules/Endwalker/Variant/V01SS/V012Silkie/V012SilkieStates.cs index b5156e2dde..fcf92b7b31 100644 --- a/BossMod/Modules/Endwalker/Variant/V01SS/V012Silkie/V012SilkieStates.cs +++ b/BossMod/Modules/Endwalker/Variant/V01SS/V012Silkie/V012SilkieStates.cs @@ -21,7 +21,10 @@ public V012SilkieStates(BossModule module) : base(module) .ActivateOnEnter() .ActivateOnEnter() .ActivateOnEnter() + .ActivateOnEnter() + .ActivateOnEnter() .ActivateOnEnter() + .ActivateOnEnter() .ActivateOnEnter(); } } \ No newline at end of file diff --git a/BossMod/Modules/Endwalker/Variant/V01SS/V013Gladiator/V013GladiatorEnums.cs b/BossMod/Modules/Endwalker/Variant/V01SS/V013Gladiator/V013GladiatorEnums.cs index 66c2d16ada..14c7e8e85e 100644 --- a/BossMod/Modules/Endwalker/Variant/V01SS/V013Gladiator/V013GladiatorEnums.cs +++ b/BossMod/Modules/Endwalker/Variant/V01SS/V013Gladiator/V013GladiatorEnums.cs @@ -70,5 +70,5 @@ public enum SID : uint public enum IconID : uint { - Icon_218 = 218, // player + Tankbuster = 218, // player } diff --git a/BossMod/Modules/Shadowbringers/Alliance/A25Compound2P/A25Compound2PEnums.cs b/BossMod/Modules/Shadowbringers/Alliance/A25Compound2P/A25Compound2PEnums.cs index c3937bac36..b5facd8d61 100644 --- a/BossMod/Modules/Shadowbringers/Alliance/A25Compound2P/A25Compound2PEnums.cs +++ b/BossMod/Modules/Shadowbringers/Alliance/A25Compound2P/A25Compound2PEnums.cs @@ -58,7 +58,7 @@ public enum SID : uint public enum IconID : uint { Icon_62 = 62, // player - Icon_218 = 218, // player + Tankbuster = 218, // player Icon_139 = 139, // player Icon_79 = 79, // player Icon_80 = 80, // player diff --git a/BossMod/Modules/Shadowbringers/Alliance/A31KnaveofHearts/A31KnaveofHeartsEnums.cs b/BossMod/Modules/Shadowbringers/Alliance/A31KnaveofHearts/A31KnaveofHeartsEnums.cs index 0beacd8507..371abe9184 100644 --- a/BossMod/Modules/Shadowbringers/Alliance/A31KnaveofHearts/A31KnaveofHeartsEnums.cs +++ b/BossMod/Modules/Shadowbringers/Alliance/A31KnaveofHearts/A31KnaveofHeartsEnums.cs @@ -61,7 +61,7 @@ public enum SID : uint public enum IconID : uint { - Icon_218 = 218, // player + Tankbuster = 218, // player Icon_279 = 279, // CopiedKnave Icon_278 = 278, // Boss Icon_169 = 169, // player diff --git a/BossMod/Modules/Shadowbringers/Alliance/A32HanselGretel/A32HanselGretelEnums.cs b/BossMod/Modules/Shadowbringers/Alliance/A32HanselGretel/A32HanselGretelEnums.cs index 9133f13fa7..0a55dca84c 100644 --- a/BossMod/Modules/Shadowbringers/Alliance/A32HanselGretel/A32HanselGretelEnums.cs +++ b/BossMod/Modules/Shadowbringers/Alliance/A32HanselGretel/A32HanselGretelEnums.cs @@ -89,7 +89,7 @@ public enum SID : uint public enum IconID : uint { - Icon_218 = 218, // player + Tankbuster = 218, // player Icon_96 = 96, // player Icon_62 = 62, // player } diff --git a/BossMod/Modules/Shadowbringers/Alliance/A33RedGirlP1/A33RedGirlP1Enums.cs b/BossMod/Modules/Shadowbringers/Alliance/A33RedGirlP1/A33RedGirlP1Enums.cs index b34afe52dd..8bf71740b7 100644 --- a/BossMod/Modules/Shadowbringers/Alliance/A33RedGirlP1/A33RedGirlP1Enums.cs +++ b/BossMod/Modules/Shadowbringers/Alliance/A33RedGirlP1/A33RedGirlP1Enums.cs @@ -70,7 +70,7 @@ public enum IconID : uint Icon_262 = 262, // player Icon_263 = 263, // player Icon_264 = 264, // player - Icon_218 = 218, // player + Tankbuster = 218, // player Icon_167 = 167, // RedGirl1 Icon_168 = 168, // RedGirl1 } diff --git a/BossMod/Modules/Shadowbringers/Alliance/A34RedGirlP2/A34RedGirlP2Enums.cs b/BossMod/Modules/Shadowbringers/Alliance/A34RedGirlP2/A34RedGirlP2Enums.cs index 3e53dfa181..aefc8329b1 100644 --- a/BossMod/Modules/Shadowbringers/Alliance/A34RedGirlP2/A34RedGirlP2Enums.cs +++ b/BossMod/Modules/Shadowbringers/Alliance/A34RedGirlP2/A34RedGirlP2Enums.cs @@ -73,7 +73,7 @@ public enum IconID : uint Icon_263 = 263, // player Icon_168 = 168, // RedGirl2 Icon_167 = 167, // RedGirl2 - Icon_218 = 218, // player + Tankbuster = 218, // player } public enum TetherID : uint diff --git a/BossMod/Modules/Stormblood/Alliance/A23Construct7/A23Construct7Enums.cs b/BossMod/Modules/Stormblood/Alliance/A23Construct7/A23Construct7Enums.cs index 02faee3125..48a3a755af 100644 --- a/BossMod/Modules/Stormblood/Alliance/A23Construct7/A23Construct7Enums.cs +++ b/BossMod/Modules/Stormblood/Alliance/A23Construct7/A23Construct7Enums.cs @@ -92,5 +92,5 @@ public enum IconID : uint Icon_136 = 136, // player Icon_137 = 137, // player Icon_138 = 138, // player - Icon_218 = 218, // player + Tankbuster = 218, // player }