Skip to content

Commit

Permalink
Merge pull request #71 from FFXIV-CombatReborn/V01SS-second-path
Browse files Browse the repository at this point in the history
The Sil'dihn Subterrane fully enumerated and mostly finished
  • Loading branch information
LTS-FFXIV authored May 2, 2024
2 parents a79c278 + 5f5ca36 commit 8305cad
Show file tree
Hide file tree
Showing 14 changed files with 109 additions and 21 deletions.
37 changes: 34 additions & 3 deletions BossMod/Modules/Endwalker/Variant/V01SS/V011Geryon/V011Geryon.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<Source> _sources = [];
private static readonly AOEShapeRect _shape = new(40, 40);

public override IEnumerable<Source> 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<RunawaySludge>()?.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))
Expand All @@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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
{
Expand Down Expand Up @@ -36,11 +38,19 @@ 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
{
Icon_218 = 218, // player
Icon_156 = 156, // Boss
Icon_157 = 157, // Boss
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ public V011GeryonStates(BossModule module) : base(module)
.ActivateOnEnter<ColossalSwing>()
.ActivateOnEnter<ExplosionAOE>()
.ActivateOnEnter<ExplosionDonut>()
.ActivateOnEnter<Shockwave>()
.ActivateOnEnter<RunawaySludge>()
.ActivateOnEnter<ColossalStrike>();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,11 @@ class V012PuffTracker(BossModule module) : BossComponent(module)
{
public List<Actor> BracingPuffs = new();
public List<Actor> ChillingPuffs = new();
public List<Actor> 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)
Expand All @@ -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;
}
}
Expand Down
35 changes: 33 additions & 2 deletions BossMod/Modules/Endwalker/Variant/V01SS/V012Silkie/V012Silkie.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand All @@ -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()));
Expand All @@ -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));
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@ public V012SilkieStates(BossModule module) : base(module)
.ActivateOnEnter<SqueakyCleanAOE2W>()
.ActivateOnEnter<SqueakyCleanAOE3W>()
.ActivateOnEnter<V012PuffTracker>()
.ActivateOnEnter<PuffAndTumble1>()
.ActivateOnEnter<PuffAndTumble2>()
.ActivateOnEnter<CarpetBeater>()
.ActivateOnEnter<EasternEwers>()
.ActivateOnEnter<TotalWash>();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -70,5 +70,5 @@ public enum SID : uint

public enum IconID : uint
{
Icon_218 = 218, // player
Tankbuster = 218, // player
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

0 comments on commit 8305cad

Please sign in to comment.