Skip to content

Commit

Permalink
Merge pull request #29 from FFXIV-CombatReborn/slave_thaleia
Browse files Browse the repository at this point in the history
Thaleia Llymlaen update
  • Loading branch information
CarnifexOptimus authored Apr 4, 2024
2 parents b994af8 + 49f6462 commit c3c8462
Show file tree
Hide file tree
Showing 16 changed files with 360 additions and 228 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,7 @@ public enum OID : uint
Boss = 0x4010, // R3.450, x6
Triton = 0x4011, // R1.950, x2
DivineSprite = 0x4012, // R1.600, x3
WaterSprite = 0x4085, // R0.800, x5
UnknownEnemy = 0x400E, // R0.500, x1
UnknownActor1 = 0x1E8FB8, // R2.000, x2, EventObj type
UnknownActor2 = 0x1E8F2F, // R0.500, x1, EventObj type
WaterSprite = 0x4085, // R0.800, x5
};

public enum AID : uint
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public override void OnEventEnvControl(BossModule module, byte index, uint state

public override void OnEventCast(BossModule module, Actor caster, ActorCastEvent spell)
{
if ((AID)spell.Action.ID is AID.RheognosisCrashExaflare)
if ((AID)spell.Action.ID == AID.RheognosisCrashExaflare)
{
++NumCasts;
int index = Lines.FindIndex(item => item.Next.AlmostEqual(caster.Position, 1));
Expand Down
60 changes: 48 additions & 12 deletions BossMod/Modules/Endwalker/Alliance/A32Llymlaen/A32Llymlaen.cs
Original file line number Diff line number Diff line change
@@ -1,32 +1,68 @@
namespace BossMod.Endwalker.Alliance.A32Llymlaen;

class StormwhorlLocAOE : Components.LocationTargetedAOEs
class Godsbane : Components.RaidwideCast
{
public StormwhorlLocAOE() : base(ActionID.MakeSpell(AID.StormwhorlLocAOE), 6) { }
public Godsbane() : base(ActionID.MakeSpell(AID.Godsbane), "Raidwide + DoT") { }
}
class MaelstromLocAOE : Components.LocationTargetedAOEs

class Tempest : Components.RaidwideCast
{
public Tempest() : base(ActionID.MakeSpell(AID.Tempest)) { }
}

class RightStrait : Components.SelfTargetedAOEs
{
public RightStrait() : base(ActionID.MakeSpell(AID.RightStraitCone), new AOEShapeCone(60, 90.Degrees())) { }
}

class LeftStrait : Components.SelfTargetedAOEs
{
public LeftStrait() : base(ActionID.MakeSpell(AID.LeftStraitCone), new AOEShapeCone(60, 90.Degrees())) { }
}

class Stormwhorl : Components.LocationTargetedAOEs
{
public Stormwhorl() : base(ActionID.MakeSpell(AID.Stormwhorl), 6) { }
}

class Maelstrom : Components.LocationTargetedAOEs
{
public Maelstrom() : base(ActionID.MakeSpell(AID.Maelstrom), 6) { }
}

class WindRose : Components.SelfTargetedAOEs
{
public WindRose() : base(ActionID.MakeSpell(AID.WindRose), new AOEShapeCircle(12)) { }
}

class SeafoamSpiral : Components.SelfTargetedAOEs
{
public SeafoamSpiral() : base(ActionID.MakeSpell(AID.SeafoamSpiral), new AOEShapeDonut(6, 70)) { }
}

class DeepDive1: Components.StackWithCastTargets
{
public MaelstromLocAOE() : base(ActionID.MakeSpell(AID.MaelstromLocAOE), 6) { }
public DeepDive1() : base(ActionID.MakeSpell(AID.DeepDiveStack1), 6) { }
}

class WindRoseAOE : Components.SelfTargetedAOEs
class DeepDive2: Components.StackWithCastTargets
{
public WindRoseAOE() : base(ActionID.MakeSpell(AID.WindRoseAOE), new AOEShapeCircle(12)) { }
public DeepDive2() : base(ActionID.MakeSpell(AID.DeepDiveStack2), 6) { }
}

class SurgingWaveAOE : Components.SelfTargetedAOEs
class HardWater1: Components.StackWithCastTargets
{
public SurgingWaveAOE() : base(ActionID.MakeSpell(AID.SurgingWaveAOE), new AOEShapeCircle(6)) { }
public HardWater1() : base(ActionID.MakeSpell(AID.HardWaterStack1), 6) { }
}

class LandingAOE : Components.SelfTargetedAOEs
class HardWater2: Components.StackWithCastTargets
{
public LandingAOE() : base(ActionID.MakeSpell(AID.LandingAOE), new AOEShapeCircle(18), 4) { }
public HardWater2() : base(ActionID.MakeSpell(AID.HardWaterStack2), 6) { }
}

class SeafoamSpiralDonut : Components.SelfTargetedAOEs
class Stormwinds : Components.SpreadFromCastTargets
{
public SeafoamSpiralDonut() : base(ActionID.MakeSpell(AID.SeafoamSpiralDonut), new AOEShapeDonut(6, 70)) { }
public Stormwinds() : base(ActionID.MakeSpell(AID.StormwindsSpread), 6) { }
}

[ModuleInfo(GroupType = BossModuleInfo.GroupType.CFC, GroupID = 962, NameID = 11299)]
Expand Down
101 changes: 40 additions & 61 deletions BossMod/Modules/Endwalker/Alliance/A32Llymlaen/A32LlymlaenEnum.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,96 +8,75 @@ public enum OID : uint
Perykos = 0x4026, // R6.300, x1
SeaFoam = 0x4029, // R1.500, spawn during fight
Trident = 0x4025, // R3.000, spawn during fight
OschonsAvatar = 0x406E, // R8.000, spawn during fight
Unknown = 0x400E, // R0.500, x1
};

public enum AID : uint
{
AutoAttack = 871, // Llymlaen->player, no cast, single-target

TempestRaidwide = 34827, // Llymlaen->self, 5.0s cast, range 100 circle
ShockwaveRaidwide = 34836, // LlymlaenHelper->self, 10.2s cast, range 100 circle
LandingRaidwide = 34843, // Trident->self, no cast, range 80 circle
GodsbaneRaidwide = 35948, // LlymlaenHelper->self, 7.0s cast, range 100 circle
Tempest = 34827, // Llymlaen->self, 5.0s cast, range 100 circle
Landing = 34843, // Trident->self, no cast, range 80 circle, 6x raidwide when tridents spawn
Godsbane = 35948, // LlymlaenHelper->self, 7.0s cast, range 100 circle

SeafoamSpiralDonut = 34829, // Llymlaen->self, 6.0s cast, range 6-70 donut
SeafoamSpiral = 34829, // Llymlaen->self, 6.0s cast, range 6-70 donut

WindRoseAOE = 34828, // Llymlaen->self, 6.0s cast, range 12 circle
WindRose = 34828, // Llymlaen->self, 6.0s cast, range 12 circle

DireStraitAltVisual = 34825, // Llymlaen->location, no cast, single-target
DireStraitAltRectAOE1 = 36045, // LlymlaenHelper->self, 2.5s cast, range 40 width 80 rect
DireStraitAltRectAOE2 = 36046, // LlymlaenHelper->self, 4.5s cast, range 40 width 80 rect
DireStraitsVisual = 34825, // Llymlaen->location, no cast, single-target
DireStraitsVisual2 = 36043, // Llymlaen->self, no cast, single-target
DireStraitsVisual3 = 36044, // Llymlaen->self, no cast, single-target
DireStraitsVisual4 = 36047, // Llymlaen->self, no cast, single-target

DireStraitsVisual = 36044, // Llymlaen->self, no cast, single-target
DireStraitTelegraph1 = 36045, // LlymlaenHelper->self, 2.5s cast, range 40 width 80 rect
DireStraitTelegraph2 = 36046, // LlymlaenHelper->self, 4.5s cast, range 40 width 80 rect
DireStraitsRectAOE1 = 34831, // LlymlaenHelper->self, 7.5s cast, range 40 width 80 rect
DireStraitsRectAOE2 = 34832, // LlymlaenHelper->self, 9.3s cast, range 40 width 80 rect
DireStraits4 = 36043, // Llymlaen->self, no cast, single-target

NavigatorsTridentVisual1 = 34859, // Llymlaen->self, no cast, single-target
NavigatorsTridentVisual2 = 34830, // Llymlaen->self, 6.5s cast, single-target
NavigatorsTridentVisual3 = 36048, // Llymlaen->self, no cast, single-target
NavigatorsTridentRectAOE = 34833, // LlymlaenHelper->self, 7.0s cast, range 60 width 60 rect, knockback 20 left/right, depending on playeer position
NavigatorsTridentRectAOE = 34833, // LlymlaenHelper->self, 7.0s cast, range 60 width 60 rect, damage fall off rectangle, knockback 20 left/right, depending on player position

SurgingWaveKnockback = 34834, // Llymlaen->location, 9.0s cast, single-target // Knockback
SurgingWaveAOE = 34835, // LlymlaenHelper->self, 10.0s cast, range 6 circle // CircleAOE
SphereShatter = 34861, // SeaFoam->player, no cast, single-target // Sphere pop
SurgingWaveVisual = 34834, // Llymlaen->location, 9.0s cast, single-target
SurgingWaveAOE = 34835, // LlymlaenHelper->self, 10.0s cast, range 6 circle, instant kill
Shockwave = 34836, // LlymlaenHelper->self, 10.2s cast, range 100 circle, knockback 68, away from source
SphereShatter = 34861, // SeaFoam->player, no cast, single-target

FrothingSeaRectAOE = 34826, // LlymlaenHelper->self, no cast, range 25 width 100 rect // RectAOE
FrothingSeaRectAOE = 34826, // LlymlaenHelper->self, no cast, range 25 width 100 rect, knockback 15, dir forward

// one these are cast after Llymlaen shoves everyone back after parting the water
RightStraitCone = 34898, // Llymlaen->self, 6.0s cast, range 60 180-degree cone // ConeCleaves
LeftStraitCone = 34897, // Llymlaen->self, 6.0s cast, range 60 180-degree cone // ConeCleaves
RightStraitCone = 34898, // Llymlaen->self, 6.0s cast, range 60 180-degree cone
LeftStraitCone = 34897, // Llymlaen->self, 6.0s cast, range 60 180-degree cone

DeepDiveStack1 = 34841, // Llymlaen->players, 5.0s cast, range 6 circle // Stack
DeepDiveStack2 = 34868, // Llymlaen->players, 9.0s cast, range 6 circle // Stack
HardWaterStack1 = 34869, // Perykos->players, 5.0s cast, range 6 circle // Stack
HardWaterStack2 = 34870, // Thalaos->players, 7.0s cast, range 6 circle // Stack
DeepDiveStack1 = 34841, // Llymlaen->players, 5.0s cast, range 6 circle, Stack
DeepDiveStack2 = 34868, // Llymlaen->players, 9.0s cast, range 6 circle, Stack
HardWaterStack1 = 34869, // Perykos->players, 5.0s cast, range 6 circle, Stack
HardWaterStack2 = 34870, // Thalaos->players, 7.0s cast, range 6 circle, Stack
StormwindsSpread = 34847, // LlymlaenHelper->players, 5.0s cast, range 6 circle, spread

TorrentialTridents = 34842, // Llymlaen->self, 4.0s cast, single-target
LandingAOE = 34844, // Trident->self, 6.0s cast, range 18 circle // CircleAOE
LandingCircle = 34844, // Trident->self, 6.0s cast, range 18 circle
StormySeas = 34845, // Llymlaen->self, no cast, single-target
StormwhorlLocAOE = 34846, // LlymlaenHelper->location, 4.0s cast, range 6 circle // LocationAOE
StormwindsSpread = 34847, // LlymlaenHelper->players, 5.0s cast, range 6 circle // Spread
Stormwhorl = 34846, // LlymlaenHelper->location, 4.0s cast, range 6 circle

DenizensOfTheDeep = 34848, // Llymlaen->self, 4.0s cast, single-target // Summons adds
DenizensOfTheDeep = 34848, // Llymlaen->self, 4.0s cast, single-target, summons adds

SerpentsTideRectAOE1 = 34855, // Perykos->self, no cast, range 80 width 20 rect // RectAOE
SerpentsTideRectAOE2 = 34857, // Thalaos->self, no cast, range 80 width 20 rect // RectAOE
SerpentsTideRectAOE3 = 34854, // Perykos->self, no cast, range 80 width 20 rect // RectAOE
SerpentsTideRectAOE4 = 34856, // Thalaos->self, no cast, range 80 width 20 rect // RectAOE
SerpentsTideRectAOE5 = 34853, // LlymlaenHelper->self, 8.0s cast, range 80 width 20 rect // RectAOE
SerpentsTideRectAOE6 = 34838, // LlymlaenHelper->self, 1.0s cast, range 80 width 10 rect // RectAOE // This one does not fully cover the section of the arena, this is intentional to allow a safespot if youre willing to use antiknock
SerpentsTideRectAOE1 = 34855, // Perykos->self, no cast, range 80 width 20 rect
SerpentsTideRectAOE2 = 34857, // Thalaos->self, no cast, range 80 width 20 rect
SerpentsTideRectAOE3 = 34854, // Perykos->self, no cast, range 80 width 20 rect
SerpentsTideRectAOE4 = 34856, // Thalaos->self, no cast, range 80 width 20 rect
SerpentsTideVisual = 34853, // LlymlaenHelper->self, 8.0s cast, range 80 width 20 rect

MaelstromLocAOE = 34858, // LlymlaenHelper->location, 4.0s cast, range 6 circle // LocationAOE
Maelstrom = 34858, // LlymlaenHelper->location, 4.0s cast, range 6 circle
Godsbane1 = 34852, // LlymlaenHelper->self, 2.0s cast, single-target
Godsbane2 = 34849, // Llymlaen->self, 5.0s cast, single-target
Godsbane3 = 34850, // Perykos->self, 5.0s cast, single-target
Godsbane4 = 34851, // Thalaos->self, 5.0s cast, single-target

_Ability6_ = 36047, // Llymlaen->self, no cast, single-target
ToTheLast1 = 34837, // Llymlaen->self, 5.0s cast, single-target
ToTheLast2 = 34839, // Llymlaen->self, no cast, single-target
ToTheLastRectAOE = 34840, // LlymlaenHelper->self, 6.0s cast, range 80 width 10 rect // RectAOE

ToTheLastVisual = 34837, // Llymlaen->self, 5.0s cast, single-target
ToTheLastVisual2 = 34839, // Llymlaen->self, no cast, single-target
ToTheLastTelegraph = 34838, // LlymlaenHelper->self, 1.0s cast, range 80 width 10 rect
ToTheLastAOE = 34840, // LlymlaenHelper->self, 6.0s cast, range 80 width 10 rect
//these only happen if a player uses the blowkiss emote on Llymlaen, stun+heavy dmg, not our fault if people do that
BlowkissPunishment = 34874, // Llymlaen->player, no cast, single-target, knockback 10 away from source + down for the count
NavigatorsDagger = 34875, // Llymlaen->player, no cast, single-target, damage after /blowkiss emote
};

public enum SID : uint
{
SeafoamStatus = 2234, // none->SeaFoam, extra=0x14
DownForTheCount = 783, // LlymlaenHelper->player, extra=0xEC7
Liftoff = 3262, // SeaFoam->player, extra=0x0
WindResistanceDownII = 2096, // LlymlaenHelper->player, extra=0x0
Dropsy1 = 3777, // none->player, extra=0x0
Dropsy2 = 3778, // none->player, extra=0x0
Dropsy3 = 2087, // LlymlaenHelper->player, extra=0x0
};

public enum IconID : uint
{
DiveStack = 161, // player
StormwindBait = 139, // player
HardWaterStack = 305, // player
};
NavigatorsDagger = 34875, // Llymlaen->player, no cast, single-target
};
68 changes: 36 additions & 32 deletions BossMod/Modules/Endwalker/Alliance/A32Llymlaen/A32LlymlaenStates.cs
Original file line number Diff line number Diff line change
@@ -1,34 +1,38 @@
namespace BossMod.Endwalker.Alliance.A32Llymlaen
namespace BossMod.Endwalker.Alliance.A32Llymlaen;

class A32LlymlaenStates : StateMachineBuilder
{
class A32LlymlaenStates : StateMachineBuilder
{
public A32LlymlaenStates(BossModule module) : base(module)
{
TrivialPhase()
.ActivateOnEnter<WindRoseAOE>()
.ActivateOnEnter<SurgingWaveAOE>()
.ActivateOnEnter<LandingAOE>()
.ActivateOnEnter<StormwhorlLocAOE>()
.ActivateOnEnter<StormwindsSpread>()
.ActivateOnEnter<MaelstromLocAOE>()
.ActivateOnEnter<NavigatorsTridentRectAOE>()
.ActivateOnEnter<NavigatorsTridentKnockback>()
.ActivateOnEnter<RightStraitCone>()
.ActivateOnEnter<LeftStraitCone>()
.ActivateOnEnter<SeafoamSpiralDonut>()
.ActivateOnEnter<DireStraits>()
.ActivateOnEnter<FrothingSeaRectAOE>()
.ActivateOnEnter<SerpentsTideRectAOE1>()
.ActivateOnEnter<SerpentsTideRectAOE2>()
.ActivateOnEnter<SerpentsTideRectAOE3>()
.ActivateOnEnter<SerpentsTideRectAOE4>()
.ActivateOnEnter<SerpentsTideRectAOE5>()
.ActivateOnEnter<SerpentsTideRectAOE6>()
.ActivateOnEnter<ToTheLastRectAOE>()
.ActivateOnEnter<DeepDiveStack>()
.ActivateOnEnter<HardWaterStack>()
.ActivateOnEnter<SphereShatter>()
.ActivateOnEnter<SurgingWaveKnockback>();
}
public A32LlymlaenStates(BossModule module) : base(module)
{
TrivialPhase()
.ActivateOnEnter<Godsbane>()
.ActivateOnEnter<Tempest>()
.ActivateOnEnter<SurgingWave>()
.ActivateOnEnter<SurgingWave>()
.ActivateOnEnter<WindRose>()
.ActivateOnEnter<SurgingWave>()
.ActivateOnEnter<TorrentialTridents>()
.ActivateOnEnter<Tridents>()
.ActivateOnEnter<Stormwhorl>()
.ActivateOnEnter<Stormwinds>()
.ActivateOnEnter<Maelstrom>()
.ActivateOnEnter<NavigatorsTridentRectAOE>()
.ActivateOnEnter<NavigatorsTridentKnockback>()
.ActivateOnEnter<NavigatorsTridentRaidwide>()
.ActivateOnEnter<RightStrait>()
.ActivateOnEnter<LeftStrait>()
.ActivateOnEnter<SeafoamSpiral>()
.ActivateOnEnter<DireStraits>()
.ActivateOnEnter<FrothingSea>()
.ActivateOnEnter<SerpentsTide>()
.ActivateOnEnter<ToTheLast>()
.ActivateOnEnter<DeepDive1>()
.ActivateOnEnter<DeepDive2>()
.ActivateOnEnter<HardWater1>()
.ActivateOnEnter<HardWater2>()
.ActivateOnEnter<SeaFoam>()
.ActivateOnEnter<Shockwave>()
.ActivateOnEnter<ShockwaveRaidwide>()
.ActivateOnEnter<SurgingWavesArenaChange>();
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,32 @@

class DireStraits : Components.GenericAOEs
{
private static readonly AOEShapeRect rect = new(80, 40);
private readonly List<AOEInstance> _aoes = [];

private static readonly AOEShapeRect _shape = new(80, 40);

public override IEnumerable<AOEInstance> ActiveAOEs(BossModule module, int slot, Actor actor) => _aoes.Take(1);
public override IEnumerable<AOEInstance> ActiveAOEs(BossModule module, int slot, Actor actor)
{
if (_aoes.Count == 2)
{
yield return new(_aoes[0].Shape, _aoes[0].Origin, _aoes[0].Rotation, _aoes[0].Activation, ArenaColor.Danger);
yield return new(_aoes[1].Shape, _aoes[1].Origin, _aoes[1].Rotation, _aoes[1].Activation, risky: false);
}
if (_aoes.Count == 1)
yield return new(_aoes[0].Shape, _aoes[0].Origin, _aoes[0].Rotation, _aoes[0].Activation, ArenaColor.Danger);
}

public override void OnCastStarted(BossModule module, Actor caster, ActorCastInfo spell)
{
if ((AID)spell.Action.ID is AID.DireStraitAltRectAOE1 or AID.DireStraitsRectAOE1)
_aoes.Add(new(_shape, caster.Position, spell.Rotation, spell.NPCFinishAt.AddSeconds(9.2f)));
if ((AID)spell.Action.ID == AID.DireStraitTelegraph1)
{
_aoes.Add(new(rect, module.Bounds.Center, spell.Rotation, spell.NPCFinishAt.AddSeconds(5)));
_aoes.Add(new(rect, module.Bounds.Center, spell.Rotation + 180.Degrees(), spell.NPCFinishAt.AddSeconds(6.7f)));
}
}

public override void OnCastFinished(BossModule module, Actor caster, ActorCastInfo spell)
{
if ((AID)spell.Action.ID is AID.DireStraitAltRectAOE2 or AID.DireStraitsRectAOE2)
{
_aoes.Clear();
++NumCasts;
}
if (_aoes.Count > 0 && (AID)spell.Action.ID is AID.DireStraitsRectAOE1 or AID.DireStraitsRectAOE2)
_aoes.RemoveAt(0);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
namespace BossMod.Endwalker.Alliance.A32Llymlaen;

public class FrothingSea : Components.Exaflare
{
private static readonly Angle _rot1 = 90.Degrees();
private static readonly Angle _rot2 = -90.Degrees();
public FrothingSea() : base(new AOEShapeRect(6, 20, 80)) { }

public override void OnEventEnvControl(BossModule module, byte index, uint state)
{
var _activation = module.WorldState.CurrentTime.AddSeconds(0.15f);
if (state == 0x00800040 && index == 0x49)
Lines.Add(new() { Next = new(-80, -900), Advance = 2.2f * _rot1.ToDirection(), NextExplosion = _activation, TimeToMove = 0.9f, ExplosionsLeft = 13, MaxShownExplosions = 2, Rotation = _rot1 });
if (state == 0x08000400 && index == 0x49)
Lines.Add(new() { Next = new(80, -900), Advance = 2.2f * _rot2.ToDirection(), NextExplosion = _activation, TimeToMove = 0.9f, ExplosionsLeft = 13, MaxShownExplosions = 2, Rotation = _rot2 });
}

public override void OnEventCast(BossModule module, Actor caster, ActorCastEvent spell)
{
if (Lines.Count > 0 && (AID)spell.Action.ID == AID.FrothingSeaRectAOE)
{
++NumCasts;
AdvanceLine(module, Lines[0], Lines[0].Next + 2.2f * Lines[0].Rotation.ToDirection());
if (Lines[0].ExplosionsLeft == 0)
Lines.RemoveAt(0);
}
}
}
Loading

0 comments on commit c3c8462

Please sign in to comment.