Skip to content

Commit

Permalink
Merge pull request #500 from FFXIV-CombatReborn/mergeWIP
Browse files Browse the repository at this point in the history
Airavata module
  • Loading branch information
CarnifexOptimus authored Dec 15, 2024
2 parents e88712b + 8f66b2b commit ee20873
Show file tree
Hide file tree
Showing 3 changed files with 148 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace BossMod.Stormblood.TreasureHunt;

public abstract class FinalRoomArena(WorldState ws, Actor primary) : BossModule(ws, primary, arena.Center, arena)
{
private static readonly WPos center = new(0, -420);
private static readonly ArenaBoundsComplex arena = new([new Polygon(center, 19.51f * CosPI.Pi8th, 8, 22.5f.Degrees()), new Rectangle(center, 27.66f, 5.5f),
new Rectangle(new(0, -440), 5.5f, 7.5f)], [new Rectangle(new(0, -400), 20, 3.35f)]);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
namespace BossMod.Stormblood.TreasureHunt.HiddenCalansOfUznair.Airavata;

public enum OID : uint
{
Boss = 0x1FCC, // R4.75
CanalAnila = 0x1F10, // R1.92
CanalAnala = 0x1F0C, // R1.6
CanalLightningHomunculus = 0x1F13, // R1.6
CanalWindHomunculus = 0x1F11, // R1.6
CanalFireHomunculus = 0x1F0D, // R1.6
CanalIceHomunculus = 0x1F0F, // R1.6
GoldenApa = 0x1FEC, // R3.12
GoldenDhara = 0x1FEB, // R1.95

CanalQueen = 0x1FD1, // R0.840, x0 (spawn during fight)
CanalEgg = 0x1FCE, // R0.840, x0 (spawn during fight)
CanalTomato = 0x1FD0, // R0.840, x0 (spawn during fight)
CanalGarlic = 0x1FCF, // R0.840, x0 (spawn during fight)
CanalOnion = 0x1FCD, // R0.840, x0 (spawn during fight)

NamazuStickywhisker = 0x2063, // R0.54
Abharamu = 0x2064, // R3.42
Helper = 0x233C
}

public enum AID : uint
{
AutoAttack1 = 870, // CanalAnala->player, no cast, single-target
AutoAttack2 = 872, // Boss/Abharamu/GoldenDhara->player, no cast, single-target

SpinBoss = 9892, // Boss->self, 3.5s cast, range 20 120-degree cone
HurlBoss = 9891, // Boss->location, 3.0s cast, range 6 circle
Buffet = 9893, // Boss->player, 3.0s cast, single-target, tankbuster
BarbarousScream = 9894, // Boss->self, 3.0s cast, range 14 circle

Blizzard = 967, // CanalIceHomunculus->player, 1.0s cast, single-target
Fire = 966, // CanalFireHomunculus->player, 1.0s cast, single-target
Aero = 969, // CanalWindHomunculus/CanalAnila->player, 1.0s cast, single-target
Thunder = 968, // CanalLightningHomunculus->player, 1.0s cast, single-target
Water = 971, // GoldenApa->player, 1.0s cast, single-target
RingOfFire = 8629, // CanalAnala->location, 3.0s cast, range 5 circle
DoubleSmash = 618, // GoldenDhara->self, 3.0s cast, range 6+R 120-degree cone
Abacinate = 8628, // CanalAnala->players, no cast, single-target
AncientAero = 8727, // CanalAnila->self, 3.0s cast, range 12+R width 4 rect
StraightPunch = 8659, // GoldenDhara->player, no cast, single-target
StoneII = 8660, // GoldenDhara->player, 4.0s cast, single-target

AbharamuActivate = 9636, // Abharamu->self, no cast, single-target
Spin = 8599, // Abharamu->self, no cast, range 6+R 120-degree cone
RaucousScritch = 8598, // Abharamu->self, 2.5s cast, range 5+R 120-degree cone
Hurl = 5352, // Abharamu->location, 3.0s cast, range 6 circle

PungentPirouette = 6450, // 1FCF->self, 3.5s cast, range 6+R circle
PluckAndPrune = 6449, // 1FCE->self, 3.5s cast, range 6+R circle
HeirloomScream = 6451, // 1FD0->self, 3.5s cast, range 6+R circle
Pollen = 6452, // 1FD1->self, 3.5s cast, range 6+R circle
TearyTwirl = 6448, // 1FCD->self, 3.5s cast, range 6+R circle

Telega = 9630 // Mandragoras/Abharamu/NamazuStickywhisker->self, no cast, single-target, bonus adds disappear
}

abstract class Hurl(BossModule module, AID aid) : Components.LocationTargetedAOEs(module, ActionID.MakeSpell(aid), 6);
class HurlBoss(BossModule module) : Hurl(module, AID.HurlBoss);
class HurlBonusAdd(BossModule module) : Hurl(module, AID.Hurl);

class SpinBoss(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.SpinBoss), new AOEShapeCone(20, 60.Degrees()));
class BarbarousScream(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.BarbarousScream), new AOEShapeCircle(14));
class Buffet(BossModule module) : Components.SingleTargetCast(module, ActionID.MakeSpell(AID.Buffet));

class DoubleSmash(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.DoubleSmash), new AOEShapeCone(7.95f, 60.Degrees()));
class AncientAero(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.AncientAero), new AOEShapeRect(13.6f, 2));
class RingOfFire(BossModule module) : Components.LocationTargetedAOEs(module, ActionID.MakeSpell(AID.RingOfFire), 5);
class StoneII(BossModule module) : Components.SingleTargetCast(module, ActionID.MakeSpell(AID.StoneII));

class RaucousScritch(BossModule module) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(AID.RaucousScritch), new AOEShapeCone(8.42f, 30.Degrees()));
class Spin(BossModule module) : Components.Cleave(module, ActionID.MakeSpell(AID.Spin), new AOEShapeCone(9.42f, 60.Degrees()), (uint)OID.Abharamu);

abstract class Mandragoras(BossModule module, AID aid) : Components.SelfTargetedAOEs(module, ActionID.MakeSpell(aid), new AOEShapeCircle(6.84f));
class PluckAndPrune(BossModule module) : Mandragoras(module, AID.PluckAndPrune);
class TearyTwirl(BossModule module) : Mandragoras(module, AID.TearyTwirl);
class HeirloomScream(BossModule module) : Mandragoras(module, AID.HeirloomScream);
class PungentPirouette(BossModule module) : Mandragoras(module, AID.PungentPirouette);
class Pollen(BossModule module) : Mandragoras(module, AID.Pollen);

class AiravataStates : StateMachineBuilder
{
public AiravataStates(BossModule module) : base(module)
{
TrivialPhase()
.ActivateOnEnter<HurlBoss>()
.ActivateOnEnter<SpinBoss>()
.ActivateOnEnter<BarbarousScream>()
.ActivateOnEnter<Buffet>()
.ActivateOnEnter<HurlBonusAdd>()
.ActivateOnEnter<RaucousScritch>()
.ActivateOnEnter<Spin>()
.ActivateOnEnter<PluckAndPrune>()
.ActivateOnEnter<TearyTwirl>()
.ActivateOnEnter<HeirloomScream>()
.ActivateOnEnter<PungentPirouette>()
.ActivateOnEnter<Pollen>()
.Raw.Update = () => module.Enemies(Airavata.All).All(x => x.IsDeadOrDestroyed);
}
}

[ModuleInfo(BossModuleInfo.Maturity.Verified, Contributors = "The Combat Reborn Team (Malediktus)", GroupType = BossModuleInfo.GroupType.CFC, GroupID = 276, NameID = 6853)]
public class Airavata(WorldState ws, Actor primary) : FinalRoomArena(ws, primary)
{
private static readonly uint[] bonusAdds = [(uint)OID.CanalEgg, (uint)OID.CanalGarlic, (uint)OID.CanalOnion, (uint)OID.CanalTomato,
(uint)OID.CanalQueen, (uint)OID.Abharamu, (uint)OID.NamazuStickywhisker];
public static readonly uint[] All = [(uint)OID.Boss, (uint)OID.CanalLightningHomunculus, (uint)OID.CanalIceHomunculus, (uint)OID.CanalFireHomunculus, (uint)OID.CanalWindHomunculus,
(uint)OID.CanalAnala, (uint)OID.CanalAnila, (uint)OID.GoldenApa, (uint)OID.GoldenDhara, .. bonusAdds];

protected override void DrawEnemies(int pcSlot, Actor pc)
{
Arena.Actors(Enemies(All));
Arena.Actors(Enemies(bonusAdds), Colors.Vulnerable);
}

protected override void CalculateModuleAIHints(int slot, Actor actor, PartyRolesConfig.Assignment assignment, AIHints hints)
{
for (var i = 0; i < hints.PotentialTargets.Count; ++i)
{
var e = hints.PotentialTargets[i];
e.Priority = (OID)e.Actor.OID switch
{
OID.CanalOnion => 7,
OID.CanalEgg => 6,
OID.CanalGarlic => 5,
OID.CanalTomato => 4,
OID.CanalQueen or OID.NamazuStickywhisker => 3,
OID.Abharamu => 2,
OID.CanalFireHomunculus or OID.CanalIceHomunculus or OID.CanalWindHomunculus or OID.CanalLightningHomunculus or OID.CanalAnala or OID.CanalAnila or
OID.GoldenApa or OID.GoldenDhara => 2,
_ => 0
};
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,8 @@ public CanalIcebeastStates(BossModule module) : base(module)
}

[ModuleInfo(BossModuleInfo.Maturity.Verified, Contributors = "Malediktus", GroupType = BossModuleInfo.GroupType.CFC, GroupID = 268, NameID = 6650)]
public class CanalIcebeast(WorldState ws, Actor primary) : BossModule(ws, primary, arena.Center, arena)
public class CanalIcebeast(WorldState ws, Actor primary) : FinalRoomArena(ws, primary)
{
private static readonly WPos center = new(0, -420);
private static readonly ArenaBoundsComplex arena = new([new Polygon(center, 19.51f * CosPI.Pi8th, 8, 22.5f.Degrees()), new Rectangle(center, 27.66f, 5.5f),
new Rectangle(new(0, -440), 5.5f, 7.5f)], [new Rectangle(new(0, -400), 20, 3.35f)]);
private static readonly uint[] trash = [(uint)OID.CanalVindthurs, (uint)OID.CanalIceHomunculus];
public static readonly uint[] All = [(uint)OID.Boss, (uint)OID.Abharamu, .. trash];

Expand Down

0 comments on commit ee20873

Please sign in to comment.