Skip to content

Commit

Permalink
Merge pull request #448 from FFXIV-CombatReborn/mergeWIP
Browse files Browse the repository at this point in the history
Yuweyawata Field Station trash modules
  • Loading branch information
CarnifexOptimus authored Nov 20, 2024
2 parents 98bcdec + 7c0da74 commit ad1d3ca
Show file tree
Hide file tree
Showing 9 changed files with 515 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ public D091LindblumZaghnalStates(BossModule module) : base(module)
}
}

[ModuleInfo(BossModuleInfo.Maturity.Verified, Contributors = "The Combat Reborn Team (Malediktus)", GroupType = BossModuleInfo.GroupType.CFC, GroupID = 1008, NameID = 13623)]
[ModuleInfo(BossModuleInfo.Maturity.Verified, Contributors = "The Combat Reborn Team (Malediktus)", GroupType = BossModuleInfo.GroupType.CFC, GroupID = 1008, NameID = 13623, SortOrder = 3)]
public class D091LindblumZaghnal(WorldState ws, Actor primary) : BossModule(ws, primary, arena.Center, arena)
{
private static readonly ArenaBoundsComplex arena = new([new Polygon(new(73, 277), 19.5f * CosPI.Pi40th, 40)], [new Rectangle(new(72, 297), 20, 1.1f),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,34 @@ class DarkSouls(BossModule module) : Components.SingleTargetCast(module, ActionI
class TelltaleTears(BossModule module) : Components.SpreadFromCastTargets(module, ActionID.MakeSpell(AID.TelltaleTears), 5);
class SoulDouse(BossModule module) : Components.StackWithCastTargets(module, ActionID.MakeSpell(AID.SoulDouse), 6, 4, 4);
class LostHope(BossModule module) : Components.CastHint(module, ActionID.MakeSpell(AID.LostHope), "Apply temporary misdirection");
class Necrohazard(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.Necrohazard), new AOEShapeCircle(18));
class Necrohazard(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.Necrohazard), new AOEShapeCircle(18))
{
// AI cannot handle temporary misdirection at the moment. to enable AI to clear it on tanks at least, we press invuln
public override void AddAIHints(int slot, Actor actor, PartyRolesConfig.Assignment assignment, AIHints hints)
{
if (AI.AIManager.Instance?.Beh == null || Casters.Count == 0 || actor.Role != Role.Tank)
return;
var isDelayDeltaLow = (Module.CastFinishAt(Casters[0].CastInfo) - WorldState.CurrentTime).TotalSeconds < 5;
if (isDelayDeltaLow)
{
switch (actor.Class)
{
case Class.PLD:
hints.ActionsToExecute.Push(ActionID.MakeSpell(PLD.AID.HallowedGround), actor, ActionQueue.Priority.High);
break;
case Class.WAR:
hints.ActionsToExecute.Push(ActionID.MakeSpell(WAR.AID.Holmgang), actor, ActionQueue.Priority.High);
break;
case Class.GNB:
hints.ActionsToExecute.Push(ActionID.MakeSpell(GNB.AID.Superbolide), actor, ActionQueue.Priority.High);
break;
case Class.DRK:
hints.ActionsToExecute.Push(ActionID.MakeSpell(DRK.AID.LivingDead), actor, ActionQueue.Priority.High);
break;
}
}
}
}

class DarkII(BossModule module) : Components.GenericAOEs(module)
{
Expand Down Expand Up @@ -136,7 +163,7 @@ public D092OverseerKanilokkaStates(BossModule module) : base(module)
}
}

[ModuleInfo(BossModuleInfo.Maturity.Verified, Contributors = "The Combat Reborn Team (Malediktus)", GroupType = BossModuleInfo.GroupType.CFC, GroupID = 1008, NameID = 13634)]
[ModuleInfo(BossModuleInfo.Maturity.Verified, Contributors = "The Combat Reborn Team (Malediktus)", GroupType = BossModuleInfo.GroupType.CFC, GroupID = 1008, NameID = 13634, SortOrder = 6)]
public class D092OverseerKanilokka(WorldState ws, Actor primary) : BossModule(ws, primary, StartingBounds.Center, StartingBounds)
{
private const int Edges = 60;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ public D093LunipyatiStates(BossModule module) : base(module)
}
}

[ModuleInfo(BossModuleInfo.Maturity.Verified, Contributors = "The Combat Reborn Team (Malediktus)", GroupType = BossModuleInfo.GroupType.CFC, GroupID = 1008, NameID = 13610)]
[ModuleInfo(BossModuleInfo.Maturity.Verified, Contributors = "The Combat Reborn Team (Malediktus)", GroupType = BossModuleInfo.GroupType.CFC, GroupID = 1008, NameID = 13610, SortOrder = 9)]
public class D093Lunipyati(WorldState ws, Actor primary) : BossModule(ws, primary, startingBounds.Center, startingBounds)
{
private const int Edges = 60;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
namespace BossMod.Dawntrail.Dungeon.D09YuweyawataFieldStation.D90ForestBat;

public enum OID : uint
{
Boss = 0x4612, // R3.9
ForestWoolback = 0x4613, // R2.0
Electrogolem1 = 0x46A3, // R1.9
Electrogolem2 = 0x4610 // R1.9
}

public enum AID : uint
{
AutoAttack = 872, // Electrogolem1/Electrogolem2/Boss/ForestWoolback->player, no cast, single-target

SweepingGouge = 40668, // ForestWoolback->self, 4.0s cast, range 9 90-degree cone
LineVoltage = 40665 // Electrogolem2->self, 4.0s cast, range 14 width 4 rect
}

class FlashFlood(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.SweepingGouge), new AOEShapeCone(9, 45.Degrees()));
class LineVoltage(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.LineVoltage), new AOEShapeRect(14, 2));

class D90ForestBatStates : StateMachineBuilder
{
public D90ForestBatStates(BossModule module) : base(module)
{
TrivialPhase()
.ActivateOnEnter<FlashFlood>()
.ActivateOnEnter<LineVoltage>()
.Raw.Update = () => Module.WorldState.Actors.Where(x => x.IsTargetable && !x.IsAlly && x.Position.AlmostEqual(Module.Arena.Center, Module.Bounds.Radius))
.All(x => x.IsDeadOrDestroyed);
}
}

[ModuleInfo(BossModuleInfo.Maturity.Verified, Contributors = "The Combat Reborn Team (Malediktus)", GroupType = BossModuleInfo.GroupType.CFC, GroupID = 1008, NameID = 13572, SortOrder = 1)]
public class D90ForestBat(WorldState ws, Actor primary) : BossModule(ws, primary, arena.Center, arena)
{
private static readonly WPos[] vertices = [new(-16.78f, 468.11f), new(-15.92f, 468.13f), new(-17.46f, 472.46f), new(-17.41f, 473.1f), new(-16.79f, 476),
new(-16.78f, 476.7f), new(-16.99f, 480.51f), new(-16.28f, 481.71f), new(-15.96f, 482.38f), new(-15.41f, 484.5f),
new(-14.62f, 485.59f), new(-15.45f, 489.94f), new(-15.64f, 491.93f), new(-15.5f, 492.57f), new(-14.27f, 495.23f),
new(-15.25f, 499.73f), new(-15.07f, 500.34f), new(-14.03f, 502.83f), new(-13.72f, 503.46f), new(-13.59f, 504.16f),
new(-13.56f, 504.76f), new(-13.13f, 505.23f), new(-12.93f, 505.9f), new(-12.98f, 506.55f), new(-13.1f, 507.21f),
new(-13.1f, 507.86f), new(-12.72f, 508.35f), new(-12.23f, 508.79f), new(-11.83f, 509.39f), new(-11.74f, 510.76f),
new(-11.57f, 511.3f), new(-9.78f, 512.11f), new(-9.29f, 512.61f), new(-8.97f, 513.94f), new(-8.73f, 514.4f),
new(-8.1f, 514.62f), new(-7.5f, 514.98f), new(-2.5f, 523.65f), new(-0.46f, 526.68f), new(-0.4f, 527.36f),
new(-0.55f, 529.27f), new(-0.11f, 529.71f), new(0.44f, 530.08f), new(0.92f, 530.59f), new(0.77f, 531.83f),
new(0.8f, 532.42f), new(1.24f, 532.75f), new(1.57f, 533.15f), new(1.41f, 533.73f), new(1.72f, 534.24f),
new(2.47f, 535.31f), new(2.96f, 535.5f), new(3.3f, 536.05f), new(3.81f, 537.22f), new(3.92f, 537.73f),
new(4.13f, 538.24f), new(4.38f, 540.04f), new(4.57f, 540.5f), new(4.99f, 540.88f), new(5.58f, 541.04f),
new(6.15f, 541.37f), new(6.5f, 541.95f), new(6.7f, 542.61f), new(6.69f, 543.97f), new(6.53f, 544.46f),
new(6.24f, 544.88f), new(5.94f, 545.46f), new(6.08f, 546.13f), new(-5.58f, 549.09f), new(-5.95f, 548.52f),
new(-6.09f, 548.04f), new(-5.81f, 547.38f), new(-5.51f, 546.81f), new(-5.9f, 544.73f), new(-6.12f, 544.2f),
new(-6.6f, 543.74f), new(-7.01f, 543.23f), new(-9.39f, 535.91f), new(-9.67f, 535.37f), new(-11.09f, 533.73f),
new(-12.19f, 532.98f), new(-12.5f, 532.57f), new(-13.03f, 531.69f), new(-13.82f, 529.99f), new(-14.15f, 529.48f),
new(-14.76f, 529.21f), new(-15.34f, 528.8f), new(-15.44f, 528.12f), new(-15.65f, 527.53f), new(-17.44f, 525.26f),
new(-19.31f, 524.56f), new(-19.82f, 524.1f), new(-20.06f, 523.64f), new(-20.27f, 523.17f), new(-20.81f, 522.13f),
new(-20.39f, 520.89f), new(-20.23f, 520.27f), new(-20.33f, 519.61f), new(-20.73f, 518.48f), new(-21.08f, 518.06f),
new(-23.41f, 516.94f), new(-24.69f, 516.68f), new(-26.66f, 514.18f), new(-27.84f, 513.33f), new(-28.71f, 510.84f),
new(-30.02f, 508.71f), new(-31.64f, 506.54f), new(-32.65f, 504.3f), new(-32.95f, 503.7f), new(-33.03f, 501.75f),
new(-33.23f, 501.14f), new(-33.55f, 500.48f), new(-33.77f, 499.15f), new(-33.97f, 498.58f), new(-34.59f, 498.22f),
new(-34.41f, 497.09f), new(-34.39f, 496.42f), new(-34.5f, 495.92f), new(-34.47f, 495.25f), new(-34.4f, 494.64f),
new(-34.61f, 493.95f), new(-34.71f, 493.27f), new(-34.7f, 492.6f), new(-34.85f, 491.29f), new(-35.6f, 489.36f),
new(-35.43f, 488.71f), new(-35.31f, 488.11f), new(-35.47f, 486.77f), new(-35.28f, 483.61f), new(-35.49f, 483.01f),
new(-35.64f, 482.3f), new(-35.43f, 481.68f), new(-35.42f, 479.49f), new(-34.93f, 471.44f), new(-34.95f, 470.74f),
new(-34.79f, 470.06f), new(-34.9f, 469.45f), new(-35.73f, 468.5f), new(-16.78f, 468.11f)];
private static readonly ArenaBoundsComplex arena = new([new PolygonCustom(vertices)]);

protected override bool CheckPull() => WorldState.Actors.Any(x => x.InCombat && x.Position.AlmostEqual(Arena.Center, Bounds.Radius));

protected override void DrawEnemies(int pcSlot, Actor pc)
{
Arena.Actors(WorldState.Actors.Where(x => !x.IsAlly && x.Position.AlmostEqual(Arena.Center, Bounds.Radius)));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
namespace BossMod.Dawntrail.Dungeon.D09YuweyawataFieldStation.D90ForestWoolback;

public enum OID : uint
{
Boss = 0x46A4, // R3.9
ForestAxeBeak = 0x4611, // R3.0
ForestWoolback = 0x4613, // R3.9
Electrogolem = 0x46A3 // R1.9
}

public enum AID : uint
{
AutoAttack = 872, // Boss/ForestAxeBeak/Electrogolem/ForestWoolback->player, no cast, single-target

SweepingGouge = 40668, // ForestWoolback->self, 4.0s cast, range 9 90-degree cone
Thunderball = 40666 // ForestAxeBeak->location, 4.0s cast, range 8 circle
}

class SweepingGouge(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.SweepingGouge), new AOEShapeCone(9, 45.Degrees()));
class Thunderball(BossModule module) : Components.LocationTargetedAOEs(module, ActionID.MakeSpell(AID.Thunderball), 8);

class D90ForestWoolbackStates : StateMachineBuilder
{
public D90ForestWoolbackStates(BossModule module) : base(module)
{
TrivialPhase()
.ActivateOnEnter<Thunderball>()
.ActivateOnEnter<SweepingGouge>()
.Raw.Update = () => Module.WorldState.Actors.Where(x => x.IsTargetable && !x.IsAlly && x.Position.AlmostEqual(Module.Arena.Center, Module.Bounds.Radius))
.All(x => x.IsDeadOrDestroyed);
}
}

[ModuleInfo(BossModuleInfo.Maturity.Verified, Contributors = "The Combat Reborn Team (Malediktus)", GroupType = BossModuleInfo.GroupType.CFC, GroupID = 1008, NameID = 13573, SortOrder = 2)]
public class D90ForestWoolback(WorldState ws, Actor primary) : BossModule(ws, primary, arena.Center, arena)
{
private static readonly WPos[] vertices = [new(54.16f, 358.33f), new(54.83f, 358.64f), new(61.41f, 363.35f), new(61.86f, 363.88f), new(60.68f, 366.6f),
new(60.55f, 367.22f), new(61.05f, 370.44f), new(60.92f, 371.09f), new(57.05f, 372.87f), new(56.02f, 373.6f),
new(53.39f, 374.66f), new(52.86f, 374.6f), new(51.6f, 374.6f), new(50.96f, 374.71f), new(49.87f, 375.38f),
new(48.67f, 375.9f), new(48.16f, 376.32f), new(47.62f, 376.23f), new(47.11f, 376.19f), new(46.45f, 376.3f),
new(45.81f, 376.55f), new(45.31f, 376.87f), new(44.85f, 377.42f), new(41.43f, 377.76f), new(40.86f, 377.99f),
new(39.08f, 378.93f), new(38.03f, 378.94f), new(37.48f, 379.19f), new(36.27f, 380.01f), new(34.32f, 380.27f),
new(30.82f, 379.37f), new(30.15f, 379.33f), new(28.84f, 379.59f), new(28.11f, 380.68f), new(27.61f, 380.78f),
new(26.42f, 380.45f), new(25.74f, 380.36f), new(23.66f, 380.42f), new(20.02f, 382.33f), new(19.34f, 382.65f),
new(18.85f, 383.1f), new(18.8f, 383.73f), new(18.89f, 384.48f), new(18.51f, 384.85f), new(17.33f, 385.58f),
new(16.79f, 385.6f), new(16.27f, 385.55f), new(15.76f, 385.44f), new(14.3f, 385.06f), new(13.69f, 385.12f),
new(12.98f, 385.35f), new(10.88f, 384.37f), new(9.89f, 384.05f), new(9.17f, 383.93f), new(7.64f, 383.93f),
new(7, 384.04f), new(6.63f, 384.59f), new(6.12f, 384.77f), new(3.96f, 385.36f), new(3.35f, 385.63f),
new(1.11f, 387.2f), new(-0.84f, 389.29f), new(-1.15f, 389.76f), new(-1.03f, 390.39f), new(-0.51f, 392.3f),
new(-0.58f, 393.01f), new(-1.02f, 393.49f), new(-1.66f, 393.65f), new(-2.05f, 394.06f), new(-2.38f, 394.65f),
new(-2.73f, 395.04f), new(-3.31f, 395.3f), new(-3.83f, 395.78f), new(-4.34f, 395.9f), new(-6.25f, 396.19f),
new(-6.85f, 396.53f), new(-7.66f, 397.17f), new(-8.13f, 397.61f), new(-9.72f, 400.95f), new(-10.19f, 401.4f),
new(-10.29f, 402.65f), new(-10.99f, 403.66f), new(-11.01f, 404.36f), new(-11.48f, 404.84f), new(-11.7f, 405.3f),
new(-11.82f, 405.89f), new(-11.52f, 406.4f), new(-11.35f, 407.03f), new(-11.66f, 407.45f), new(-12.57f, 408.09f),
new(-12.72f, 408.79f), new(-12.72f, 409.9f), new(-12.49f, 410.52f), new(-12.48f, 411.64f), new(-12.21f, 412.26f),
new(-11.69f, 413.08f), new(-20.19f, 409.66f), new(-18.54f, 408.65f), new(-18.15f, 408.33f), new(-17.78f, 407.78f),
new(-17.86f, 406.47f), new(-18.1f, 405.93f), new(-18.7f, 405.63f), new(-18.82f, 404.97f), new(-18.51f, 404.35f),
new(-18.13f, 403.83f), new(-17.67f, 403.4f), new(-17.34f, 402.93f), new(-17.5f, 402.25f), new(-17.73f, 401.6f),
new(-18.74f, 400.93f), new(-18.74f, 400.27f), new(-16.92f, 396.29f), new(-16.52f, 395.78f), new(-15.57f, 395.3f),
new(-15.12f, 394.82f), new(-14.39f, 393.66f), new(-14.18f, 393.09f), new(-13.88f, 391.81f), new(-13.54f, 391.24f),
new(-13.2f, 390.87f), new(-12.81f, 390.54f), new(-12.33f, 390.28f), new(-10.04f, 389.31f), new(-7.87f, 388.01f),
new(-6.39f, 386.62f), new(-5.98f, 386.09f), new(-4.88f, 384.42f), new(-4.86f, 383.85f), new(-4.39f, 383.45f),
new(-1.42f, 382.66f), new(-0.85f, 382.4f), new(0.92f, 380.16f), new(1.17f, 379.64f), new(1.52f, 378.41f),
new(1.95f, 377.9f), new(3.03f, 377.55f), new(3.63f, 377.29f), new(4, 376.7f), new(6.8f, 375.28f),
new(7.96f, 374.89f), new(8.5f, 374.58f), new(8.94f, 374.02f), new(9.52f, 373.64f), new(10.22f, 373.47f),
new(14.17f, 375.4f), new(14.78f, 375.26f), new(15.38f, 374.89f), new(16.06f, 374.91f), new(16.65f, 375.13f),
new(17.12f, 374.85f), new(17.39f, 374.18f), new(18.07f, 374.15f), new(18.64f, 374.01f), new(19.16f, 373.73f),
new(19.39f, 373.22f), new(19.38f, 372.55f), new(19.46f, 372.05f), new(19.82f, 371.53f), new(19.98f, 371.04f),
new(20, 370.33f), new(22.5f, 369.86f), new(23.47f, 368.93f), new(25.79f, 368.14f), new(26.35f, 367.81f),
new(26.73f, 367.47f), new(27.99f, 367.41f), new(28.48f, 367.03f), new(28.8f, 366.63f), new(30.08f, 366.56f),
new(30.59f, 366.17f), new(31.83f, 365.9f), new(32.32f, 365.46f), new(33.58f, 365.19f), new(34.04f, 364.75f),
new(34.63f, 364.45f), new(40.01f, 362.44f), new(41.31f, 362.27f), new(41.88f, 362.11f), new(42.4f, 361.7f),
new(42.98f, 361.41f), new(43.55f, 361.2f), new(44.23f, 361.17f), new(44.88f, 361.2f), new(46.74f, 360.92f),
new(51.35f, 360.61f), new(51.7f, 360.07f), new(51.99f, 359.46f), new(52.32f, 359.07f), new(52.99f, 358.92f),
new(53.49f, 358.63f), new(53.9f, 358.33f)];
private static readonly ArenaBoundsComplex arena = new([new PolygonCustom(vertices)]);

protected override bool CheckPull() => WorldState.Actors.Any(x => x.InCombat && x.Position.AlmostEqual(Arena.Center, Bounds.Radius));

protected override void DrawEnemies(int pcSlot, Actor pc)
{
Arena.Actors(WorldState.Actors.Where(x => !x.IsAlly && x.Position.AlmostEqual(Arena.Center, Bounds.Radius)));
}
}
Loading

0 comments on commit ad1d3ca

Please sign in to comment.