Skip to content

Commit

Permalink
Merge pull request #386 from FFXIV-CombatReborn/mergeWIP
Browse files Browse the repository at this point in the history
Heroes and Pretenders role quest
  • Loading branch information
CarnifexOptimus authored Oct 2, 2024
2 parents 1ab6193 + 81f18fa commit 5680072
Show file tree
Hide file tree
Showing 5 changed files with 109 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -180,8 +180,6 @@ public class AnAntidoteForAnarchy(WorldState ws, Actor primary) : BossModule(ws,

protected override void DrawEnemies(int pcSlot, Actor pc)
{
Arena.Actor(PrimaryActor);
Arena.Actors(Enemies(OID.LoashkanaTheLeal), Colors.Vulnerable);
Arena.Actors(Enemies(OID.KAModelMammet).Concat(Enemies(OID.KRModelMammet)).Concat(Enemies(OID.SuffocatingCloud)));
Arena.Actors(Enemies(OID.KAModelMammet).Concat(Enemies(OID.KRModelMammet)).Concat(Enemies(OID.SuffocatingCloud)).Concat([PrimaryActor]));
}
}
10 changes: 4 additions & 6 deletions BossMod/Modules/Dawntrail/Quest/RoleQuests/DreamsOfANewDay.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ public enum OID : uint
{
Boss = 0x4481, // R1.5
BossP2 = 0x44A1, // R1.5
LoazenikweTheShutEye = 0x447E, // R0.5
TentoawaTheWideEye = 0x447D, // R0.5
UnboundRavager1 = 0x4484, // R0.5
UnboundRavager2 = 0x4572, // R0.5
Expand Down Expand Up @@ -169,11 +168,10 @@ public class DreamsOfANewDay(WorldState ws, Actor primary) : BossModule(ws, prim

protected override void DrawEnemies(int pcSlot, Actor pc)
{
Arena.Actors(Enemies(OID.BossP2).Concat([PrimaryActor]));
Arena.Actors(Enemies(OID.LoazenikweTheShutEye).Concat(Enemies(OID.TentoawaTheWideEye)), Colors.Vulnerable);
Arena.Actors(Enemies(OID.UnboundRaider1).Concat(Enemies(OID.UnboundRaider2)).Concat(Enemies(OID.UnboundRaider3)).Concat(Enemies(OID.UnboundRaider4))
.Concat(Enemies(OID.UnboundRavager1)).Concat(Enemies(OID.UnboundRavager2)).Concat(Enemies(OID.UnboundRavager3)).Concat(Enemies(OID.UnboundRavager4))
.Concat(Enemies(OID.UnboundRavager5)).Concat(Enemies(OID.UnboundRavager6).Concat(Enemies(OID.UnboundRavager7))).Concat(Enemies(OID.UnboundRavager8)));
Arena.Actors(Enemies(OID.BossP2).Concat([PrimaryActor]).Concat(Enemies(OID.UnboundRaider1)).Concat(Enemies(OID.UnboundRaider2))
.Concat(Enemies(OID.UnboundRaider3)).Concat(Enemies(OID.UnboundRaider4)).Concat(Enemies(OID.UnboundRavager1)).Concat(Enemies(OID.UnboundRavager2))
.Concat(Enemies(OID.UnboundRavager3)).Concat(Enemies(OID.UnboundRavager4)).Concat(Enemies(OID.UnboundRavager5)).Concat(Enemies(OID.UnboundRavager6)
.Concat(Enemies(OID.UnboundRavager7))).Concat(Enemies(OID.UnboundRavager8)));
}

protected override bool CheckPull() => Raid.WithoutSlot().Any(x => x.InCombat);
Expand Down
97 changes: 97 additions & 0 deletions BossMod/Modules/Dawntrail/Quest/RoleQuests/HeroesAndPretenders.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
namespace BossMod.Dawntrail.Quest.RoleQuests.HeroesAndPretenders;

public enum OID : uint
{
Boss = 0x428A, // R1.500, x?
CultivatedOchu1 = 0x428E, // R1.92
CultivatedOchu2 = 0x448B, // R1.92
PerchOfTheApex = 0x428C, // R0.7
CultivatedMorbolSeedling = 0x4207, // R0.9
CultivatedMossFungus = 0x4208, // R1.32
Helper = 0x233C, // R0.5
}

public enum AID : uint
{
AutoAttack1 = 39521, // Boss->Tepeke, no cast, single-target
AutoAttack2 = 39539, // CultivatedMorbolSeedling/CultivatedMossFungus->Tepeke, no cast, single-target
AutoAttack3 = 39523, // CultivatedOchu1/CultivatedOchu2->Tepeke, no cast, single-target
Teleport = 37456, // Boss->location, no cast, single-target

PerchOfTheApex = 37457, // Boss->self, 3.0s cast, single-target
FledglingFury = 37458, // Helper->location, 4.0s cast, range 4 circle
UnboundArrow = 37459, // Boss->Tepeke, 5.0s cast, range 5 circle, tankbuster
AquaVitae1 = 37465, // Boss->self, 3.0s cast, single-target
AquaVitae2 = 37705, // Boss->self, no cast, single-target
ArtOfNature = 37461, // Boss->self, 3.0s cast, single-target

GoldDust = 37464, // CultivatedOchu1/CultivatedOchu2->Tepeke, 8.0s cast, range 8 circle, stack
AcidRainVisual = 37462, // CultivatedOchu1/CultivatedOchu2->self, 8.0s cast, single-target
AcidRain = 37463, // Helper->player/Tepeke, 8.0s cast, range 8 circle, spread
PromisedFall = 37466, // Helper->location, 6.0s cast, range 35 circle, damage fall off aoe
ForeseenFlurryFirst = 37467, // Helper->self, 7.0s cast, range 4 circle
ForeseenFlurryRest = 37468, // Helper->self, no cast, range 4 circle
PerchOfTheApexVisual1 = 37471, // PerchOfTheApex->self, no cast, single-target
PerchOfTheApexVisual2 = 37474, // PerchOfTheApex->self, no cast, single-target
ApexJudgment = 37472, // Helper->self, no cast, range 35 circle, raidwide
Visual = 37473, // Boss->self, no cast, single-target
}

class FledglingFury(BossModule module) : Components.LocationTargetedAOEs(module, ActionID.MakeSpell(AID.FledglingFury), 4);
class PromisedFall(BossModule module) : Components.LocationTargetedAOEs(module, ActionID.MakeSpell(AID.PromisedFall), 13);
class GoldDust(BossModule module) : Components.StackWithCastTargets(module, ActionID.MakeSpell(AID.GoldDust), 8, 2, 2);
class AcidRain(BossModule module) : Components.SpreadFromCastTargets(module, ActionID.MakeSpell(AID.AcidRain), 8);
class UnboundArrow(BossModule module) : Components.BaitAwayCast(module, ActionID.MakeSpell(AID.UnboundArrow), new AOEShapeCircle(5), true)
{
public override void AddGlobalHints(GlobalHints hints)
{
if (CurrentBaits.Count > 0)
hints.Add("Tankbuster cleave");
}
}

class ForeseenFlurry(BossModule module) : Components.Exaflare(module, 6)
{
public override void OnCastStarted(Actor caster, ActorCastInfo spell)
{
if ((AID)spell.Action.ID == AID.ForeseenFlurryFirst)
Lines.Add(new() { Next = caster.Position, Advance = 5 * spell.Rotation.ToDirection(), NextExplosion = Module.CastFinishAt(spell), TimeToMove = 1.1f, ExplosionsLeft = 8, MaxShownExplosions = 3 });
}

public override void OnEventCast(Actor caster, ActorCastEvent spell)
{
if ((AID)spell.Action.ID is AID.ForeseenFlurryFirst or AID.ForeseenFlurryRest)
{
var index = Lines.FindIndex(item => item.Next.AlmostEqual(caster.Position, 1));
AdvanceLine(Lines[index], caster.Position);
if (Lines[index].ExplosionsLeft == 0)
Lines.RemoveAt(index);
}
}
}

class HeroesAndPretendersStates : StateMachineBuilder
{
public HeroesAndPretendersStates(BossModule module) : base(module)
{
TrivialPhase()
.ActivateOnEnter<PromisedFall>()
.ActivateOnEnter<GoldDust>()
.ActivateOnEnter<AcidRain>()
.ActivateOnEnter<UnboundArrow>()
.ActivateOnEnter<FledglingFury>()
.ActivateOnEnter<ForeseenFlurry>();
}
}

[ModuleInfo(BossModuleInfo.Maturity.Verified, Contributors = "The Combat Reborn Team (Malediktus)", GroupType = BossModuleInfo.GroupType.Quest, GroupID = 70383, NameID = 13176, SortOrder = 1)]
public class HeroesAndPretenders(WorldState ws, Actor primary) : BossModule(ws, primary, arena.Center, arena)
{
private static readonly ArenaBoundsComplex arena = new([new Polygon(new(676, 41), 14.5f, 20)]);

protected override void DrawEnemies(int pcSlot, Actor pc)
{
Arena.Actors(Enemies(OID.PerchOfTheApex).Concat([PrimaryActor]).Concat(Enemies(OID.CultivatedMossFungus)).Concat(Enemies(OID.CultivatedMorbolSeedling))
.Concat(Enemies(OID.CultivatedOchu1)).Concat(Enemies(OID.CultivatedOchu2)));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,12 @@ public override void AddAIHints(int slot, Actor actor, PartyRolesConfig.Assignme
if (_aoe != null)
hints.AddForbiddenZone(ShapeDistance.InvertedRect(new(imminent ? 18.5f : actor.Position.X + 0.1f, 0), new(19, 0), 20));
}

public override void AddGlobalHints(GlobalHints hints)
{
if (imminent)
hints.Add("Go to the opposite side of the arena and work against getting sucked in!");
}
}

class D123MotherPorxieStates : StateMachineBuilder
Expand Down
2 changes: 1 addition & 1 deletion BossMod/Replay/Visualization/OpList.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class OpList(Replay replay, Replay.Encounter? enc, ModuleRegistry.Info? moduleIn
public static readonly HashSet<uint> BoringOIDs = [0x3E1A, 0x3E1B, 0x3E1C, 0x447E, 0x447D, 0x4480, 0x4583, 0x447F, 0x4584, 0x4570, 0x4256, 0x260E, 0x260B,
0x2630, 0x2611, 0x2610, 0x2617, 0x2608, 0x2613, 0x2618, 0x2609, 0x261A, 0x262F, 0x2609, 0x2614, 0x2664, 0x2668, 0x2619, 0x2631, 0x2632, 0x260A, 0x2616, 0x2667,
0x2E7F, 0x2F33, 0x2F32, 0x2F38, 0x2E80, 0x2E82, 0x2E81, 0x2F36, 0x2E7D, 0x2F35, 0x2EB0, 0x2F31, 0x2F37, 0x2E7C, 0x2E7B, 0x2EAE, 0x2F3A, 0x2F30, 0x2E7E, 0x2EAF,
];
0x428B ];
private readonly HashSet<ActionID> _filteredActions = [];
private readonly HashSet<uint> _filteredStatuses = [];
private readonly HashSet<uint> _filteredDirectorUpdateTypes = [];
Expand Down

0 comments on commit 5680072

Please sign in to comment.