Skip to content

Commit

Permalink
Silhdan Subterrene improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
LTS-FFXIV committed May 2, 2024
1 parent bc49dfc commit f894e1d
Show file tree
Hide file tree
Showing 7 changed files with 194 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ public enum AID : uint
RunawayRunoff = 29911, // Helper->self, 9.0s cast, range 60 circle
Gigantomill = 29898, // Boss->self, 8.0s cast, range 72 width 10 cross

RollingBoulder = 29914, // Helper->self, no cast, range 10 width 10 rect

}

public enum IconID : uint
Expand Down
156 changes: 143 additions & 13 deletions BossMod/Modules/Endwalker/Variant/V01SS/V013Gladiator/V013Gladiator.cs
Original file line number Diff line number Diff line change
@@ -1,30 +1,160 @@
using System.Linq;

namespace BossMod.Endwalker.Variant.V01SS.V013Gladiator;

class SunderedRemains(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.SunderedRemains), new AOEShapeCircle(10));

class RingOfMight1Out(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.RingOfMight1Out), new AOEShapeCircle(8));
class RingOfMight2Out(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.RingOfMight2Out), new AOEShapeCircle(13));
class RingOfMight3Out(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.RingOfMight3Out), new AOEShapeCircle(18));
class RingOfMight1In(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.RingOfMight1In), new AOEShapeDonut(8, 30));
class RingOfMight2In(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.RingOfMight2In), new AOEShapeDonut(13, 30));
class RingOfMight3In(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.RingOfMight3In), new AOEShapeDonut(18, 30));

class RackAndRuin(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.RackAndRuin), new AOEShapeRect(40, 2.5f), 8);
class FlashOfSteel1(BossModule module) : Components.RaidwideCast(module, ActionID.MakeSpell(AID.FlashOfSteel1), "Raidwide");
class FlashOfSteel2(BossModule module) : Components.RaidwideCast(module, ActionID.MakeSpell(AID.FlashOfSteel2), "Raidwide");
class MightySmite(BossModule module) : Components.SingleTargetCast(module, ActionID.MakeSpell(AID.MightySmite), "Tankbuster");

class RushOfMightFront(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.RushOfMightFront), new AOEShapeCone(60, 90.Degrees()));
class RushOfMightBack(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.RushOfMightBack), new AOEShapeCone(60, 90.Degrees()));
//class RushOfMight1(BossModule module) : Components.LocationTargetedAOEs(module, ActionID.MakeSpell(AID.RushOfMight1), new AOEShapeCone(40, 180.Degrees()));
//class RushOfMight2(BossModule module) : Components.LocationTargetedAOEs(module, ActionID.MakeSpell(AID.RushOfMight2), new AOEShapeCone(40, 180.Degrees()));
//class RushOfMight3(BossModule module) : Components.LocationTargetedAOEs(module, ActionID.MakeSpell(AID.RushOfMight3), new AOEShapeCone(40, 180.Degrees()));

class BitingWindBad(BossModule module) : Components.LocationTargetedAOEs(module, ActionID.MakeSpell(AID.BitingWindBad), 4);

class ShatteringSteel(BossModule module) : Components.RaidwideCast(module, ActionID.MakeSpell(AID.ShatteringSteel), "Get in bigger Whirlwind to dodge");
class ViperPoisonPatterns(BossModule module) : Components.PersistentVoidzoneAtCastTarget(module, 6, ActionID.MakeSpell(AID.BitingWindBad), m => m.Enemies(OID.WhirlwindBad).Where(z => z.EventState != 7), 0);

class RingOfMight1(BossModule module) : Components.GenericAOEs(module, ActionID.MakeSpell(AID.RingOfMightVisual))
{
private List<Actor> _castersRingOfMightOut = new();
private List<Actor> _castersRingOfMightIn = new();

private static readonly AOEShape _shapeRingOfMightOut = new AOEShapeCircle(13);
private static readonly AOEShape _shapeRingOfMightIn = new AOEShapeDonut(13, 30);

public override IEnumerable<AOEInstance> ActiveAOEs(int slot, Actor actor)
{
if (_castersRingOfMightOut.Count > 0)
return _castersRingOfMightOut.Select(c => new AOEInstance(_shapeRingOfMightOut, c.Position, c.CastInfo!.Rotation, c.CastInfo!.NPCFinishAt));
else
return _castersRingOfMightIn.Select(c => new AOEInstance(_shapeRingOfMightIn, c.Position, c.CastInfo!.Rotation, c.CastInfo!.NPCFinishAt));
}

public override void OnCastStarted(Actor caster, ActorCastInfo spell)
{
CastersForSpell(spell.Action)?.Add(caster);
}

public override void OnCastFinished(Actor caster, ActorCastInfo spell)
{
CastersForSpell(spell.Action)?.Remove(caster);
}

private List<Actor>? CastersForSpell(ActionID spell) => (AID)spell.ID switch
{
AID.RingOfMight1Out => _castersRingOfMightOut,
AID.RingOfMight1In => _castersRingOfMightIn,
_ => null
};
}

class RingOfMight2(BossModule module) : Components.GenericAOEs(module, ActionID.MakeSpell(AID.RingOfMightVisual))
{
private List<Actor> _castersRingOfMightOut = new();
private List<Actor> _castersRingOfMightIn = new();

private static readonly AOEShape _shapeRingOfMightOut = new AOEShapeCircle(18);
private static readonly AOEShape _shapeRingOfMightIn = new AOEShapeDonut(18, 30);

public override IEnumerable<AOEInstance> ActiveAOEs(int slot, Actor actor)
{
if (_castersRingOfMightOut.Count > 0)
return _castersRingOfMightOut.Select(c => new AOEInstance(_shapeRingOfMightOut, c.Position, c.CastInfo!.Rotation, c.CastInfo!.NPCFinishAt));
else
return _castersRingOfMightIn.Select(c => new AOEInstance(_shapeRingOfMightIn, c.Position, c.CastInfo!.Rotation, c.CastInfo!.NPCFinishAt));
}

public override void OnCastStarted(Actor caster, ActorCastInfo spell)
{
CastersForSpell(spell.Action)?.Add(caster);
}

public override void OnCastFinished(Actor caster, ActorCastInfo spell)
{
CastersForSpell(spell.Action)?.Remove(caster);
}

private List<Actor>? CastersForSpell(ActionID spell) => (AID)spell.ID switch
{
AID.RingOfMight2Out => _castersRingOfMightOut,
AID.RingOfMight2In => _castersRingOfMightIn,
_ => null
};
}

class RingOfMight3(BossModule module) : Components.GenericAOEs(module, ActionID.MakeSpell(AID.RingOfMightVisual))
{
private List<Actor> _castersRingOfMightOut = new();
private List<Actor> _castersRingOfMightIn = new();

private static readonly AOEShape _shapeRingOfMightOut = new AOEShapeCircle(8);
private static readonly AOEShape _shapeRingOfMightIn = new AOEShapeDonut(8, 30);

public override IEnumerable<AOEInstance> ActiveAOEs(int slot, Actor actor)
{
if (_castersRingOfMightOut.Count > 0)
return _castersRingOfMightOut.Select(c => new AOEInstance(_shapeRingOfMightOut, c.Position, c.CastInfo!.Rotation, c.CastInfo!.NPCFinishAt));
else
return _castersRingOfMightIn.Select(c => new AOEInstance(_shapeRingOfMightIn, c.Position, c.CastInfo!.Rotation, c.CastInfo!.NPCFinishAt));
}

public override void OnCastStarted(Actor caster, ActorCastInfo spell)
{
CastersForSpell(spell.Action)?.Add(caster);
}

public override void OnCastFinished(Actor caster, ActorCastInfo spell)
{
CastersForSpell(spell.Action)?.Remove(caster);
}

private List<Actor>? CastersForSpell(ActionID spell) => (AID)spell.ID switch
{
AID.RingOfMight3Out => _castersRingOfMightOut,
AID.RingOfMight3In => _castersRingOfMightIn,
_ => null
};
}

class RushOfMight(BossModule module) : Components.GenericAOEs(module, ActionID.MakeSpell(AID.RingOfMightVisual))
{
private List<Actor> _castersRushOfMightFront = new();
private List<Actor> _castersRushOfMightBack = new();

private static readonly AOEShape _shapeRushOfMightFront = new AOEShapeCone(60, 90.Degrees());
private static readonly AOEShape _shapeRushOfMightBack = new AOEShapeCone(60, 90.Degrees());

public override IEnumerable<AOEInstance> ActiveAOEs(int slot, Actor actor)
{
if (_castersRushOfMightFront.Count > 0)
return _castersRushOfMightFront.Select(c => new AOEInstance(_shapeRushOfMightFront, c.Position, c.CastInfo!.Rotation, c.CastInfo!.NPCFinishAt));
else
return _castersRushOfMightBack.Select(c => new AOEInstance(_shapeRushOfMightBack, c.Position, c.CastInfo!.Rotation, c.CastInfo!.NPCFinishAt));
}

public override void OnCastStarted(Actor caster, ActorCastInfo spell)
{
CastersForSpell(spell.Action)?.Add(caster);
}

public override void OnCastFinished(Actor caster, ActorCastInfo spell)
{
CastersForSpell(spell.Action)?.Remove(caster);
}

private List<Actor>? CastersForSpell(ActionID spell) => (AID)spell.ID switch
{
AID.RushOfMightFront => _castersRushOfMightFront,
AID.RushOfMightBack => _castersRushOfMightBack,
_ => null
};
}

class FlashOfSteelMeteor(BossModule module) : Components.CastLineOfSightAOE(module, ActionID.MakeSpell(AID.FlashOfSteelMeteor), 60, false)
{
public override IEnumerable<Actor> BlockerActors() => Module.Enemies(OID.AntiqueBoulder).Where(a => !a.IsDead);
}

class SculptorsPassion(BossModule module) : Components.GenericWildCharge(module, 4, ActionID.MakeSpell(AID.SculptorsPassion))
{
public override void OnEventCast(Actor caster, ActorCastEvent spell)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ public enum OID : uint
Regret = 0x39A1, // R1.000, x0 (spawn during fight)
WhirlwindSafe = 0x39A2, // R2.000, x0 (spawn during fight)
WhirlwindBad = 0x3AEC, // R1.330, x0 (spawn during fight)
AntiqueBoulder = 0x39A3, // R1.800, x0 (spawn during fight)
}

public enum AID : uint
Expand All @@ -33,6 +34,11 @@ public enum AID : uint
RingOfMight2In = 30275, // Helper->self, 12.0s cast, range 13-30 donut
RingOfMight3In = 30276, // Helper->self, 12.0s cast, range 18-30 donut

FlashOfSteelMeteor = 30287, // Boss->self, 5.0s cast, range 60 circle

Landing = 30288, // AntiqueBoulder->self, 7.0s cast, range 50 circle


RushOfMight1 = 30266, // Boss->location, 10.0s cast, range 25 width 3 rect aoe
RushOfMight2 = 30267, // Boss->location, 10.0s cast, range 25 width 3 rect aoe
RushOfMight3 = 30268, // Boss->location, 10.0s cast, range 25 width 3 rect aoe
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,14 @@ public V013GladiatorStates(BossModule module) : base(module)
TrivialPhase()
.ActivateOnEnter<SunderedRemains>()
.ActivateOnEnter<BitingWindBad>()
.ActivateOnEnter<RingOfMight1Out>()
.ActivateOnEnter<RingOfMight2Out>()
.ActivateOnEnter<RingOfMight3Out>()
.ActivateOnEnter<RingOfMight1In>()
.ActivateOnEnter<RingOfMight2In>()
.ActivateOnEnter<RingOfMight3In>()
.ActivateOnEnter<RingOfMight1>()
.ActivateOnEnter<RingOfMight2>()
.ActivateOnEnter<RingOfMight3>()
.ActivateOnEnter<RushOfMight>()
.ActivateOnEnter<FlashOfSteelMeteor>()
.ActivateOnEnter<RackAndRuin>()
.ActivateOnEnter<FlashOfSteel1>()
.ActivateOnEnter<FlashOfSteel2>()
.ActivateOnEnter<RushOfMightFront>()
.ActivateOnEnter<RushOfMightBack>()
//.ActivateOnEnter<RushOfMight1>()
//.ActivateOnEnter<RushOfMight2>()
//.ActivateOnEnter<RushOfMight3>()
.ActivateOnEnter<SculptorsPassion>()
.ActivateOnEnter<MightySmite>();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
class Burn(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.Burn), new AOEShapeCircle(12));
class PureFire2(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.PureFire2), new AOEShapeCircle(6));


class CastShadowFirst(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.CastShadowFirst), new AOEShapeCone(50, 45.Degrees()));
class CastShadowNext(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.CastShadowNext), new AOEShapeCone(50, 45.Degrees()));

Expand All @@ -13,5 +12,39 @@

class ShowOfStrength(BossModule module) : Components.RaidwideCast(module, ActionID.MakeSpell(AID.ShowOfStrength));

class CastShadow(BossModule module) : Components.GenericAOEs(module, ActionID.MakeSpell(AID.CastShadow))
{
private List<Actor> _castersShadowFirst = new();
private List<Actor> _castersShadowNext = new();

private static readonly AOEShape _shapeShadowFirst = new AOEShapeCone(50, 45.Degrees());
private static readonly AOEShape _shapeShadowNext = new AOEShapeCone(50, 45.Degrees());

public override IEnumerable<AOEInstance> ActiveAOEs(int slot, Actor actor)
{
if (_castersShadowFirst.Count > 0)
return _castersShadowFirst.Select(c => new AOEInstance(_shapeShadowFirst, c.Position, c.CastInfo!.Rotation, c.CastInfo!.NPCFinishAt));
else
return _castersShadowNext.Select(c => new AOEInstance(_shapeShadowNext, c.Position, c.CastInfo!.Rotation, c.CastInfo!.NPCFinishAt));
}

public override void OnCastStarted(Actor caster, ActorCastInfo spell)
{
CastersForSpell(spell.Action)?.Add(caster);
}

public override void OnCastFinished(Actor caster, ActorCastInfo spell)
{
CastersForSpell(spell.Action)?.Remove(caster);
}

private List<Actor>? CastersForSpell(ActionID spell) => (AID)spell.ID switch
{
AID.CastShadowFirst => _castersShadowFirst,
AID.CastShadowNext => _castersShadowNext,
_ => null
};
}

[ModuleInfo(BossModuleInfo.Maturity.WIP, Contributors = "CombatReborn Team", PrimaryActorOID = (uint)OID.Boss, GroupType = BossModuleInfo.GroupType.CFC, GroupID = 868, NameID = 11394)]
public class V014ZelessGah(WorldState ws, Actor primary) : BossModule(ws, primary, new ArenaBoundsRect(new(289, -105), 15, 20));
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public enum AID : uint
AutoAttack = 6499, // Boss->player, no cast, single-target
Burn = 29839, // BallOfFire->self, 1.5s cast, range 12 circle

CastShadow1 = 29850, // Boss->self, 4.8s cast, single-target
CastShadow = 29850, // Boss->self, 4.8s cast, single-target
CastShadowFirst = 29851, // Helper->self, 5.5s cast, range 65 ?-degree cone
CastShadowNext = 29853, // Helper->self, 7.5s cast, range 65 ?-degree cone

Expand All @@ -26,6 +26,8 @@ public enum AID : uint
FiresteelFracture = 29868, // Boss->self/player, 5.0s cast, range 40 ?-degree cone
InfernBrand = 29841, // Boss->self, 4.0s cast, single-target

BlazingBenifice = 29861, // 39B1->self, 1.5s cast, range 100 width 10 rect

InfernGale1 = 29858, // Boss->self, 4.0s cast, single-target
InfernGale2 = 29859, // Helper->player, no cast, single-target

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@ public V014ZelessGahStates(BossModule module) : base(module)
TrivialPhase()
.ActivateOnEnter<Burn>()
.ActivateOnEnter<PureFire2>()
.ActivateOnEnter<CastShadowFirst>()
.ActivateOnEnter<CastShadowNext>()
.ActivateOnEnter<CastShadow>()
.ActivateOnEnter<FiresteelFracture>()
.ActivateOnEnter<InfernGaleKnockback>()
.ActivateOnEnter<ShowOfStrength>();
Expand Down

0 comments on commit f894e1d

Please sign in to comment.