Skip to content

Commit

Permalink
Merge pull request #32 from FFXIV-CombatReborn/slave_thaleia
Browse files Browse the repository at this point in the history
Thaleia Oschon + Trash Pack 2&3
  • Loading branch information
CarnifexOptimus authored Apr 5, 2024
2 parents bd53596 + 678fdd6 commit 09e2026
Show file tree
Hide file tree
Showing 43 changed files with 789 additions and 551 deletions.
12 changes: 12 additions & 0 deletions BossMod/Modules/Endwalker/Alliance/A30TrashPack1/A30TrashPack1.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,16 @@ class PelagicCleaver2 : Components.SelfTargetedAOEs
public PelagicCleaver2() : base(ActionID.MakeSpell(AID.PelagicCleaver2), new AOEShapeCone(40, 30.Degrees())) { }
}

class PelagicCleaver1Hint : Components.CastInterruptHint
{
public PelagicCleaver1Hint() : base(ActionID.MakeSpell(AID.PelagicCleaver1)) { }
}

class PelagicCleaver2Hint : Components.CastInterruptHint
{
public PelagicCleaver2Hint() : base(ActionID.MakeSpell(AID.PelagicCleaver2)) { }
}

class WaterFlood : Components.SelfTargetedAOEs
{
public WaterFlood() : base(ActionID.MakeSpell(AID.WaterFlood), new AOEShapeCircle(6)) { }
Expand All @@ -33,6 +43,8 @@ public A30TrashPack1States(BossModule module) : base(module)
.ActivateOnEnter<WaterIII>()
.ActivateOnEnter<PelagicCleaver1>()
.ActivateOnEnter<PelagicCleaver2>()
.ActivateOnEnter<PelagicCleaver1Hint>()
.ActivateOnEnter<PelagicCleaver2Hint>()
.ActivateOnEnter<WaterFlood>()
.ActivateOnEnter<DivineFlood>()
.Raw.Update = () => module.Enemies(OID.Boss).All(e => e.IsDestroyed) && module.Enemies(OID.Triton).All(e => e.IsDead) && module.Enemies(OID.WaterSprite).All(e => e.IsDead) && module.Enemies(OID.WaterSprite).All(e => e.IsDead);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public enum AID : uint
PelagicCleaver2 = 35852, // Triton->self, 5.0s cast, range 40 60-degree cone
Water = 35469, // Water Sprite/Divine Sprite->player, no cast, single-target
WaterFlood = 35442, // Water Sprite->self, 3.0s cast, range 6 circle
WaterBurst = 35443, // Water Sprite->self, no cast, range 40 circle
WaterBurst = 35443, // Water Sprite->self, no cast, range 40 circle, raidwide when Water Sprite dies
DivineFlood = 35440, // Divine Sprite->self, 3.0s cast, range 6 circle
DivineBurst = 35441, // Divine Sprite->self, no cast, range 40 circle
DivineBurst = 35441, // Divine Sprite->self, no cast, range 40 circle, raidwide when Divine Sprite dies
};
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@ public enum OID : uint
{
Boss = 0x404C, // R9.496, x1
ThaliakClone = 0x404D, // R9.496, x1
ThaliakHelper = 0x233C, // R0.500, x44, 523 type
WindWreathedPortal = 0x1EB91D, // R0.500, x1, EventObj type
HieroglyphikaIndicator = 0x40AA, // R0.500, x1 // Rotation Indicator
UnknownActor = 0x400E, // R0.500, x1
Helper = 0x233C, // R0.500, x44, 523 type
};

public enum AID : uint
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public A31ThaliakStates(BossModule module) : base(module)
.ActivateOnEnter<RightBank2>()
.ActivateOnEnter<RheognosisKnockback>()
.ActivateOnEnter<RheognosisCrash>()
.ActivateOnEnter<Rheognosis>()
.ActivateOnEnter<TetraTriangles>();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class Hieroglyphika : Components.GenericAOEs

public override IEnumerable<AOEInstance> ActiveAOEs(BossModule module, int slot, Actor actor) => _aoes.Take(14);

private static WPos RotateAroundOrigin(float rotatebydegrees, WPos origin, WPos caster)
private static WPos RotateAroundOrigin(float rotatebydegrees, WPos origin, WPos caster) //TODO: consider moving to utils for future use
{
float x = MathF.Cos(rotatebydegrees * RadianConversion) * (caster.X - origin.X) - MathF.Sin(rotatebydegrees * RadianConversion) * (caster.Z - origin.Z);
float z = MathF.Sin(rotatebydegrees * RadianConversion) * (caster.X - origin.X) + MathF.Cos(rotatebydegrees * RadianConversion) * (caster.Z - origin.Z);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,29 @@
namespace BossMod.Endwalker.Alliance.A31Thaliak;


class Rheognosis : Components.RaidwideCast
{
public Rheognosis() : base(ActionID.MakeSpell(AID.RheognosisKnockback), "Raidwide + Knockback") { }
}

class RheognosisKnockback : Components.Knockback
{
private Source? _knockback;

public override IEnumerable<Source> Sources(BossModule module, int slot, Actor actor) => Utils.ZeroOrOne(_knockback);
public override void OnCastStarted(BossModule module, Actor caster, ActorCastInfo spell)
{
if ((AID)spell.Action.ID is AID.Rheognosis or AID.RheognosisPetrine)
_knockback = new(module.Bounds.Center, 25, module.WorldState.CurrentTime.AddSeconds(20.2f), Direction: spell.Rotation + 180.Degrees(), Kind: Kind.DirForward);
}

public override void OnCastFinished(BossModule module, Actor caster, ActorCastInfo spell)
{
if ((AID)spell.Action.ID == AID.RheognosisKnockback)
_knockback = null;
}
}

public class RheognosisCrash : Components.Exaflare
{
private static readonly Angle _rot1 = 90.Degrees();
Expand Down Expand Up @@ -26,7 +51,7 @@ public override void OnEventEnvControl(BossModule module, byte index, uint state

public override void OnEventCast(BossModule module, Actor caster, ActorCastEvent spell)
{
if ((AID)spell.Action.ID == AID.RheognosisCrashExaflare)
if (Lines.Count > 0 && (AID)spell.Action.ID == AID.RheognosisCrashExaflare)
{
++NumCasts;
int index = Lines.FindIndex(item => item.Next.AlmostEqual(caster.Position, 1));
Expand All @@ -35,4 +60,4 @@ public override void OnEventCast(BossModule module, Actor caster, ActorCastEvent
Lines.RemoveAt(index);
}
}
}
}

This file was deleted.

96 changes: 48 additions & 48 deletions BossMod/Modules/Endwalker/Alliance/A31Thaliak/ThaliakTetraktys.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public override void OnEventEnvControl(BossModule module, byte index, uint state

class TetraTriangles : Components.GenericAOEs
{
private readonly List<(WPos source, AOEShape shape, Angle direction, DateTime activation)> _casters = [];
private readonly List<AOEInstance> _aoes = [];
private static readonly AOEShapeTriangle tri = new(16);
private static readonly AOEShapeTriangle triBig = new(32);
private static readonly AOEShapeRect rect = new(30, 8);
Expand All @@ -30,9 +30,9 @@ class TetraTriangles : Components.GenericAOEs

public override IEnumerable<AOEInstance> ActiveAOEs(BossModule module, int slot, Actor actor)
{
foreach (var c in _casters)
if (_casters.Count > 0)
yield return new(c.shape, c.source, c.direction, c.activation);
foreach (var c in _aoes)
if (_aoes.Count > 0)
yield return new(c.Shape, c.Origin, c.Rotation, c.Activation);
}

public override void OnEventEnvControl(BossModule module, byte index, uint state)
Expand All @@ -43,85 +43,85 @@ public override void OnEventEnvControl(BossModule module, byte index, uint state
{
if (index == 0x07) //07, 0A, 0D always activate together
{
_casters.Add((new WPos(-929, 948.5f), tri, _rot1, _activation));
_casters.Add((new WPos(-953, 962.356f), tri, _rot2, _activation));
_casters.Add((new WPos(-945, 948.5f), tri, _rot2, _activation));
_aoes.Add(new(tri, new WPos(-929, 948.5f), _rot1, _activation));
_aoes.Add(new(tri, new WPos(-953, 962.356f), _rot2, _activation));
_aoes.Add(new(tri, new WPos(-945, 948.5f), _rot2, _activation));
}
if (index == 0x05) //05, 08, 0B always activate together
{
_casters.Add((new WPos(-945, 948.5f), tri, _rot1, _activation));
_casters.Add((new WPos(-937, 934.644f), tri, _rot1, _activation));
_casters.Add((new WPos(-945, 921), tri, _rot1, _activation));
_aoes.Add(new(tri, new WPos(-945, 948.5f), _rot1, _activation));
_aoes.Add(new(tri, new WPos(-937, 934.644f), _rot1, _activation));
_aoes.Add(new(tri, new WPos(-945, 921), _rot1, _activation));
}
if (index == 0x06) //06, 09, 0C always activate together
{
_casters.Add((new WPos(-937, 962.356f), tri, _rot3, _activation));
_casters.Add((new WPos(-961, 948.5f), tri, _rot1, _activation));
_casters.Add((new WPos(-953, 934.644f), tri, _rot1, _activation));
_aoes.Add(new(tri, new WPos(-937, 962.356f), _rot3, _activation));
_aoes.Add(new(tri, new WPos(-961, 948.5f), _rot1, _activation));
_aoes.Add(new(tri, new WPos(-953, 934.644f), _rot1, _activation));
}
if (index == 0x0E)
_casters.Add((new WPos(-945, 921), triBig, _rot1, _activation));
_aoes.Add(new(triBig, new WPos(-945, 921), _rot1, _activation));
if (index == 0x0F)
_casters.Add((new WPos(-953, 934.644f), triBig, _rot1, _activation));
_aoes.Add(new(triBig, new WPos(-953, 934.644f), _rot1, _activation));
if (index == 0x10)
_casters.Add((new WPos(-937, 934.644f), triBig, _rot1, _activation));
_aoes.Add(new(triBig, new WPos(-937, 934.644f), _rot1, _activation));
if (index == 0x13 && TutorialDone) //pair 13+15 always happen together after tutorial
{
_casters.Add((new WPos(-961, 948.7f), tri, _rot1, _activation2));
_casters.Add((new WPos(-937, 962.356f), tri, _rot6, _activation2));
_casters.Add((new WPos(-933, 955.428f), rect, _rot4, _activation2));
_casters.Add((new WPos(-941, 955.428f), rect, _rot5, _activation2));
_casters.Add((new WPos(-937, 948.5f), rect, _rot2, _activation2));
_casters.Add((new WPos(-957, 955.428f), rect, _rot7, _activation2));
_aoes.Add(new(tri, new WPos(-961, 948.7f), _rot1, _activation2));
_aoes.Add(new(tri, new WPos(-937, 962.356f), _rot6, _activation2));
_aoes.Add(new(rect, new WPos(-933, 955.428f), _rot4, _activation2));
_aoes.Add(new(rect, new WPos(-941, 955.428f), _rot5, _activation2));
_aoes.Add(new(rect, new WPos(-937, 948.5f), _rot2, _activation2));
_aoes.Add(new(rect, new WPos(-957, 955.428f), _rot7, _activation2));
}
if (index == 0x12 && TutorialDone) //pair 12+16 always happen together after tutorial
{
_casters.Add((new WPos(-945, 948.5f), tri, _rot2, _activation2));
_casters.Add((new WPos(-929, 948.7f), tri, _rot1, _activation2));
_casters.Add((new WPos(-933, 955.428f), rect, _rot8, _activation2));
_casters.Add((new WPos(-941.173f, 941.828f), rect, _rot9, _activation2));
_casters.Add((new WPos(-948.827f, 941.828f), rect, _rot5, _activation2));
_casters.Add((new WPos(-945, 935), rect, _rot2, _activation2));
_aoes.Add(new(tri, new WPos(-945, 948.5f), _rot2, _activation2));
_aoes.Add(new(tri, new WPos(-929, 948.7f), _rot1, _activation2));
_aoes.Add(new(rect, new WPos(-933, 955.428f), _rot8, _activation2));
_aoes.Add(new(rect, new WPos(-941.173f, 941.828f), _rot9, _activation2));
_aoes.Add(new(rect, new WPos(-948.827f, 941.828f), _rot5, _activation2));
_aoes.Add(new(rect, new WPos(-945, 935), _rot2, _activation2));
}
if (index == 0x11 && TutorialDone) //pair 11+14 always happen together after tutorial
{
_casters.Add((new WPos(-945, 921), tri, _rot1, _activation2));
_casters.Add((new WPos(-953, 962.356f), tri, _rot2, _activation2));
_casters.Add((new WPos(-945, 934.8f), rect, _rot1, _activation2));
_casters.Add((new WPos(-953, 948.5f), rect, _rot2, _activation2));
_casters.Add((new WPos(-957, 955.428f), rect, _rot5, _activation2));
_casters.Add((new WPos(-949, 955.428f), rect, _rot4, _activation2));
_aoes.Add(new(tri, new WPos(-945, 921), _rot1, _activation2));
_aoes.Add(new(tri, new WPos(-953, 962.356f), _rot2, _activation2));
_aoes.Add(new(rect, new WPos(-945, 934.8f), _rot1, _activation2));
_aoes.Add(new(rect, new WPos(-953, 948.5f), _rot2, _activation2));
_aoes.Add(new(rect, new WPos(-957, 955.428f), _rot5, _activation2));
_aoes.Add(new(rect, new WPos(-949, 955.428f), _rot4, _activation2));
}
if (index == 0x14 && !TutorialDone)
{
_casters.Add((new WPos(-953, 962.356f), tri, _rot2, _activation));
_casters.Add((new WPos(-949, 955.428f), rect, _rot4, _activation));
_casters.Add((new WPos(-957, 955.428f), rect, _rot5, _activation));
_casters.Add((new WPos(-953, 948.5f), rect, _rot2, _activation));
_aoes.Add(new(tri, new WPos(-953, 962.356f), _rot2, _activation));
_aoes.Add(new(rect, new WPos(-949, 955.428f), _rot4, _activation));
_aoes.Add(new(rect, new WPos(-957, 955.428f), _rot5, _activation));
_aoes.Add(new(rect, new WPos(-953, 948.5f), _rot2, _activation));
TutorialDone = true;
}
if (index == 0x15 && !TutorialDone)
{
_casters.Add((new WPos(-937, 962.356f), tri, _rot6, _activation));
_casters.Add((new WPos(-937, 948.5f), rect, _rot2, _activation));
_casters.Add((new WPos(-933, 955.428f), rect, _rot4, _activation));
_casters.Add((new WPos(-941, 955.428f), rect, _rot5, _activation));
_aoes.Add(new(tri, new WPos(-937, 962.356f), _rot6, _activation));
_aoes.Add(new(rect, new WPos(-937, 948.5f), _rot2, _activation));
_aoes.Add(new(rect, new WPos(-933, 955.428f), _rot4, _activation));
_aoes.Add(new(rect, new WPos(-941, 955.428f), _rot5, _activation));
TutorialDone = true;
}
if (index == 0x12 && !TutorialDone)
{
_casters.Add((new WPos(-945, 948.5f), tri, _rot2, _activation));
_casters.Add((new WPos(-945, 935), rect, _rot2, _activation));
_casters.Add((new WPos(-948.827f, 941.828f), rect, _rot5, _activation));
_casters.Add((new WPos(-941.173f, 941.828f), rect, _rot9, _activation));
_aoes.Add(new(tri, new WPos(-945, 948.5f), _rot2, _activation));
_aoes.Add(new(rect, new WPos(-945, 935), _rot2, _activation));
_aoes.Add(new(rect, new WPos(-948.827f, 941.828f), _rot5, _activation));
_aoes.Add(new(rect, new WPos(-941.173f, 941.828f), _rot9, _activation));
TutorialDone = true;
}
}
}

public override void OnEventCast(BossModule module, Actor caster, ActorCastEvent spell)
{
if (_casters.Count > 0 && (AID)spell.Action.ID is AID.TetraBlueTriangles or AID.TetraGreenTriangles or AID.TetraktuosKosmosTri or AID.TetraktuosKosmosRect)
_casters.RemoveAt(0);
if (_aoes.Count > 0 && (AID)spell.Action.ID is AID.TetraBlueTriangles or AID.TetraGreenTriangles or AID.TetraktuosKosmosTri or AID.TetraktuosKosmosRect)
_aoes.RemoveAt(0);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
public enum OID : uint
{
Boss = 0x4024, // R7.000, x1
LlymlaenHelper = 0x233C, // R0.500, x25, 523 type
Helper = 0x233C, // R0.500, x25, 523 type
Thalaos = 0x4027, // R6.300, x1
Perykos = 0x4026, // R6.300, x1
SeaFoam = 0x4029, // R1.500, spawn during fight
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,6 @@ public override void OnCastFinished(BossModule module, Actor caster, ActorCastIn
++NumCasts;
}
}

public override bool DestinationUnsafe(BossModule module, int slot, Actor actor, WPos pos) => module.FindComponent<SerpentsTide>()?.ActiveAOEs(module, slot, actor).Any(z => z.Shape.Check(pos, z.Origin, z.Rotation)) ?? false || !module.Bounds.Contains(pos);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ class SurgingWavesArenaChange : BossComponent
{
public enum Arena { Normal, ExtendWest, ExtendEast }
public Arena Shape { get; private set; }
private bool Shockwave;

public override void OnEventEnvControl(BossModule module, byte index, uint state)
{
Expand All @@ -13,15 +14,25 @@ public override void OnEventEnvControl(BossModule module, byte index, uint state
Shape = Arena.Normal;
}
if (state == 0x00800040 && index == 0x49)
{
module.Arena.Bounds = new ArenaBoundsRect(new(-30.5f, -900), 49.5f, 10);
Shape = Arena.ExtendWest;
}
if (state == 0x08000400 && index == 0x49)
{
module.Arena.Bounds = new ArenaBoundsRect(new(30.5f, -900), 49.5f, 10);
Shape = Arena.ExtendEast;
}
}
public override void Update(BossModule module)
{

if (Shockwave && Shape == Arena.Normal)
Shockwave = false;
if (Shockwave && Shape == Arena.ExtendWest)
module.Arena.Bounds = new ArenaBoundsRect(new(-40, -900), 40, 10);
if (Shockwave && Shape == Arena.ExtendEast)
module.Arena.Bounds = new ArenaBoundsRect(new(40, -900), 40, 10);
}

public override void OnCastStarted(BossModule module, Actor caster, ActorCastInfo spell)
{
if ((AID)spell.Action.ID == AID.Shockwave)
Shockwave = true;
}

public override void DrawArenaForeground(BossModule module, int pcSlot, Actor pc, MiniArena arena)
Expand Down
Loading

0 comments on commit 09e2026

Please sign in to comment.