Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Vows Of Virtue, Deeds of Cruelty ShB solo duty #349

Merged
merged 6 commits into from
May 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 69 additions & 0 deletions BossMod/Modules/Shadowbringers/Quest/ASleepDisturbed.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
namespace BossMod.Shadowbringers.Quest.ASleepDistubed;

public enum OID : uint
{
Uimet = 0x2D3F, // R0.500, x?
Cymet = 0x2D40, // R0.500, x?
Almet = 0x2D3E, // R0.500, x?
Yshtola = 0x2D3D, // R0.500, x?
BossHelper = 0x233C, // R0.500, x?, 523 type
Boss = 0x2D3C, // R7.500, x?
ThornHuaca = 0x2D42, // R1.600, x?, Voidgate helper?
Voidgate = 0x2D44, // R1.000, x?
CubusHuaca = 0x2D43, // R2.250, x?, adds
}

public enum AID : uint
{
TheTouchOfShadowCast = 19616, // Boss->self, 4.0s cast, single-target
TheTouchOfShadow = 19617, // BossHelper->self, 4.0s cast, range 70 circle
TheMarrowOfFlameCast = 19612, // Boss->self, 8.0s cast, ???
TheMarrowOfFlame = 19613, // BossHelper->player/Cymet/Uimet/Almet/Yshtola, 8.0s cast, range 8 circle
TheGraceOfCalamityCast = 19614, // Boss->self, 5.0s cast, single-target
TheGraceOfCalamity = 19615, // BossHelper->Yshtola, 5.0s cast, range 6 circle
Summon = 19622, // Boss->self, 3.0s cast, single-target
TimeAfar = 19619, // Boss->self, 3.0s cast, single-target
AetherialPull = 19620, // Voidgate->player/Cymet, no cast, single-target
LimbsOfLead = 19621, // Voidgate->player/Cymet, no cast, single-target
BurningBeam = 19623, // ThornHuaca->Cymet/Yshtola/Almet/Uimet, no cast, range 40 width 4 rect
BurningBeam2 = 19624, // ThornHuaca->player/Yshtola/Almet/Uimet, no cast, range 40 width 4 rect
TheSoundOfHeat = 19618, // Boss->self, 4.0s cast, range 60 60-degree cone
TheDeceitOfPainCast = 19628, // Boss->self, 5.0s cast, ???
TheDeceitOfPain = 19629, // BossHelper->location, 5.0s cast, range 14 circle
Animate = 19630, // Boss->self, 5.0s cast, single-target
TheBalmOfDisgraceCast = 19626, // Boss->self, 4.0s cast, ???
TheBalmOfDisgrace = 19627, // BossHelper->self, 4.0s cast, range 12 circle
}

public enum TetherID : uint
{
NPCBaitAway = 1, // ThornHuaca->player/Cymet/Yshtola/Almet/Uimet
BaitAway = 84, // ThornHuaca->Cymet/player
}

class TouchOfShadow(BossModule module) : Components.RaidwideCast(module, ActionID.MakeSpell(AID.TheTouchOfShadow));
class MarrowOfFlame(BossModule module) : Components.SpreadFromCastTargets(module, ActionID.MakeSpell(AID.TheMarrowOfFlame), 8);
class GraceOfCalamity(BossModule module) : Components.StackWithCastTargets(module, ActionID.MakeSpell(AID.TheGraceOfCalamity), 6);
class BurningBeamNPC(BossModule module) : Components.BaitAwayTethers(module, new AOEShapeRect(40, 2), (uint)TetherID.NPCBaitAway);
class BurningBeamPlayer(BossModule module) : Components.BaitAwayTethers(module, new AOEShapeRect(40, 2), (uint)TetherID.BaitAway);
class SoundOfHeat(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.TheSoundOfHeat), new AOEShapeCone(60, 30.Degrees()));
class DeceitOfPain(BossModule module) : Components.LocationTargetedAOEs(module, ActionID.MakeSpell(AID.TheDeceitOfPain), 14);
class BalmOfDisgrace(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.TheBalmOfDisgrace), new AOEShapeCircle(12));
class ASleepDisturbedStates : StateMachineBuilder
{
public ASleepDisturbedStates(BossModule module) : base(module)
{
TrivialPhase()
.ActivateOnEnter<TouchOfShadow>()
.ActivateOnEnter<MarrowOfFlame>()
.ActivateOnEnter<GraceOfCalamity>()
.ActivateOnEnter<BurningBeamNPC>()
.ActivateOnEnter<BurningBeamPlayer>()
.ActivateOnEnter<SoundOfHeat>()
.ActivateOnEnter<DeceitOfPain>()
.ActivateOnEnter<BalmOfDisgrace>();
}
}

[ModuleInfo(BossModuleInfo.Maturity.Contributed, Contributors = "croizat", GroupType = BossModuleInfo.GroupType.Quest, GroupID = 69301, NameID = 9296)]
public class ASleepDisturbed(WorldState ws, Actor primary) : BossModule(ws, primary, new(100, 100), new ArenaBoundsSquare(20));
94 changes: 94 additions & 0 deletions BossMod/Modules/Shadowbringers/Quest/VowsOfVitrueDeedsOfCruelty.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
namespace BossMod.Shadowbringers.Quest.VowsOfVitrueDeedsOfCruelty;

public enum OID : uint
{
Boss = 0x2C85, // R6.000, x1
TerminusEstVisual = 0x2C98, // R1.000, x3
BossHelper = 0x233C, // R0.500, x15, 523 type
SigniferPraetorianus = 0x2C9A, // R0.500, x0 (spawn during fight), the adds on the catwalk that just rain down Fire II
LembusPraetorianus = 0x2C99, // R2.400, x0 (spawn during fight), two large magitek ships
MagitekBit = 0x2C9C, // R0.600, x0 (spawn during fight)
}

public enum AID : uint
{
LoadData = 18786, // Boss->self, 3.0s cast, single-target
AutoAttack = 870, // Boss/LembusPraetorianus->player, no cast, single-target
MagitekRayRightArm = 18783, // Boss->self, 3.2s cast, range 45+R width 8 rect
MagitekRayLeftArm = 18784, // Boss->self, 3.2s cast, range 45+R width 8 rect
SystemError = 18785, // Boss->self, 1.0s cast, single-target
AngrySalamander = 18787, // Boss->self, 3.0s cast, range 40+R width 6 rect
FireII = 18959, // SigniferPraetorianus->location, 3.0s cast, range 5 circle
TerminusEstBossCast = 18788, // Boss->self, 3.0s cast, single-target
TerminusEstLocationHelper = 18889, // BossHelper->self, 4.0s cast, range 3 circle
TerminusEstVisual = 18789, // TerminusEstVisual->self, 1.0s cast, range 40+R width 4 rect
HorridRoar = 18779, // 2CC5->location, 2.0s cast, range 6 circle, this is your own attack. It spawns an aoe at the location of any enemy it initally hits
GarleanFire = 4007, // LembusPraetorianus->location, 3.0s cast, range 5 circle
MagitekBit = 18790, // Boss->self, no cast, single-target
MetalCutterCast = 18793, // Boss->self, 6.0s cast, single-target
MetalCutter = 18794, // BossHelper->self, 6.0s cast, range 30+R 20-degree cone
AtomicRayCast = 18795, // Boss->self, 6.0s cast, single-target
AtomicRay = 18796, // BossHelper->location, 6.0s cast, range 10 circle
MagitekRayBit = 18791, // MagitekBit->self, 6.0s cast, range 50+R width 2 rect
SelfDetonate = 18792, // MagitekBit->self, 7.0s cast, range 40+R circle, enrage if bits are not killed before cast
}

class MagitekRayRightArm(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.MagitekRayRightArm), new AOEShapeRect(45, 4));
class MagitekRayLeftArm(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.MagitekRayLeftArm), new AOEShapeRect(45, 4));
class AngrySalamander(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.AngrySalamander), new AOEShapeRect(40, 3));
class TerminusEstRects(BossModule module) : Components.GenericAOEs(module)
{
private readonly List<AOEInstance> _aoes = [];
private static readonly AOEShapeRect _shape = new(40, 2);
public override IEnumerable<AOEInstance> ActiveAOEs(int slot, Actor actor) => _aoes;

public override void OnCastStarted(Actor caster, ActorCastInfo spell)
{
if ((AID)spell.Action.ID == AID.TerminusEstLocationHelper)
{
_aoes.AddRange(
[
new(_shape, caster.Position, spell.Rotation, spell.NPCFinishAt),
new(_shape, caster.Position, spell.Rotation - 90.Degrees(), spell.NPCFinishAt),
new(_shape, caster.Position, spell.Rotation + 90.Degrees(), spell.NPCFinishAt)
]);
}
}

public override void OnEventCast(Actor caster, ActorCastEvent spell)
{
if ((AID)spell.Action.ID == AID.TerminusEstVisual)
{
_aoes.Clear();
++NumCasts;
}
}
}
class TerminusEstCircle(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.TerminusEstLocationHelper), new AOEShapeCircle(3));
class FireII(BossModule module) : Components.LocationTargetedAOEs(module, ActionID.MakeSpell(AID.FireII), 5);
class GarleanFire(BossModule module) : Components.LocationTargetedAOEs(module, ActionID.MakeSpell(AID.GarleanFire), 5);
class MetalCutter(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.MetalCutter), new AOEShapeCone(30, 10.Degrees()));
class MagitekRayBits(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.MagitekRayBit), new AOEShapeRect(50, 1));
class AtomicRay(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.AtomicRay), new AOEShapeCircle(10));
class SelfDetonate(BossModule module) : Components.CastHint(module, ActionID.MakeSpell(AID.SelfDetonate), "Enrage if bits are not killed before cast");
class VowsOfVirtueDeedsOfCrueltyStates : StateMachineBuilder
{
public VowsOfVirtueDeedsOfCrueltyStates(BossModule module) : base(module)
{
TrivialPhase()
.ActivateOnEnter<MagitekRayRightArm>()
.ActivateOnEnter<MagitekRayLeftArm>()
.ActivateOnEnter<AngrySalamander>()
.ActivateOnEnter<TerminusEstCircle>()
.ActivateOnEnter<TerminusEstRects>()
.ActivateOnEnter<FireII>()
.ActivateOnEnter<GarleanFire>()
.ActivateOnEnter<MetalCutter>()
.ActivateOnEnter<MagitekRayBits>()
.ActivateOnEnter<AtomicRay>()
.ActivateOnEnter<SelfDetonate>();
}
}

[ModuleInfo(BossModuleInfo.Maturity.Contributed, Contributors = "croizat", GroupType = BossModuleInfo.GroupType.Quest, GroupID = 69218, NameID = 9189)]
public class VowsOfVirtueDeedsOfCruelty(WorldState ws, Actor primary) : BossModule(ws, primary, new(240, 230), new ArenaBoundsSquare(20));
Loading