Skip to content

Commit

Permalink
Merge pull request #349 from Jaksuhn/vowsofvirtue
Browse files Browse the repository at this point in the history
Vows Of Virtue, Deeds of Cruelty ShB solo duty
  • Loading branch information
awgil authored May 5, 2024
2 parents cdcd56f + 7da201d commit 83eda14
Show file tree
Hide file tree
Showing 2 changed files with 163 additions and 0 deletions.
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));

0 comments on commit 83eda14

Please sign in to comment.