Skip to content

Commit

Permalink
some cleanups
Browse files Browse the repository at this point in the history
  • Loading branch information
CarnifexOptimus committed Feb 19, 2025
1 parent cefc5e4 commit e5b562d
Show file tree
Hide file tree
Showing 83 changed files with 1,937 additions and 1,409 deletions.
33 changes: 25 additions & 8 deletions BossMod/BossModule/BossModule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,24 +28,41 @@ public abstract class BossModule : IDisposable

public List<Actor> Enemies(uint oid)
{
var entry = RelevantEnemies.GetValueOrDefault(oid);
entry ??= RelevantEnemies[oid] = [.. WorldState.Actors.Where(actor => actor.OID == oid)];
if (!RelevantEnemies.TryGetValue(oid, out var entry))
{
entry = [];
foreach (var actor in WorldState.Actors.Actors.Values)
{
if (actor.OID == oid)
entry.Add(actor);
}
RelevantEnemies[oid] = entry;
}
return entry;
}

public List<Actor> Enemies(ReadOnlySpan<uint> enemies)
public List<Actor> Enemies(uint[] enemies)
{
List<Actor> relevantenemies = [];
List<Actor> relevantEnemies = [];
var len = enemies.Length;
for (var i = 0; i < len; ++i)
{
var enemy = enemies[i];
var entry = RelevantEnemies.GetValueOrDefault(enemy);
entry ??= RelevantEnemies[enemy] = [.. WorldState.Actors.Where(actor => actor.OID == enemy)];
relevantenemies.AddRange(entry);
if (!RelevantEnemies.TryGetValue(enemy, out var entry))
{
entry = [];
foreach (var actor in WorldState.Actors.Actors.Values)
{
if (actor.OID == enemy)
entry.Add(actor);
}
RelevantEnemies[enemy] = entry;
}
relevantEnemies.AddRange(entry);
}
return relevantenemies;
return relevantEnemies;
}

public List<Actor> Enemies<OID>(OID oid) where OID : Enum => Enemies((uint)(object)oid);

// component management: at most one component of any given type can be active at any time
Expand Down
6 changes: 3 additions & 3 deletions BossMod/Components/Gaze.cs
Original file line number Diff line number Diff line change
Expand Up @@ -105,12 +105,12 @@ public override void OnCastFinished(Actor caster, ActorCastInfo spell)
if (spell.Action == WatchedAction)
{
var count = Eyes.Count;
var id = caster.InstanceID;
for (var i = 0; i < count; ++i)
{
var eye = Eyes[i];
if (eye.ActorID == caster.InstanceID)
if (Eyes[i].ActorID == id)
{
Eyes.Remove(eye);
Eyes.RemoveAt(i);
break;
}
}
Expand Down
6 changes: 3 additions & 3 deletions BossMod/Components/GenericAOEs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -100,12 +100,12 @@ public override void OnCastFinished(Actor caster, ActorCastInfo spell)
if (spell.Action == WatchedAction)
{
var count = Casters.Count;
var id = caster.InstanceID;
for (var i = 0; i < count; ++i)
{
var aoe = Casters[i];
if (aoe.ActorID == caster.InstanceID)
if (Casters[i].ActorID == id)
{
Casters.Remove(aoe);
Casters.RemoveAt(i);
break;
}
}
Expand Down
17 changes: 13 additions & 4 deletions BossMod/Modules/Dawntrail/Alliance/A11Prishe/BanishStorm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,10 +76,19 @@ public override void OnEventCast(Actor caster, ActorCastEvent spell)
if (spell.Action.ID == (uint)AID.Banish)
{
++NumCasts;
var index = Lines.FindIndex(item => item.Next.AlmostEqual(caster.Position, 1f));
AdvanceLine(Lines[index], caster.Position);
if (Lines[index].ExplosionsLeft == 0)
Lines.RemoveAt(index);
var count = Lines.Count;
var pos = caster.Position;
for (var i = 0; i < count; ++i)
{
var line = Lines[i];
if (line.Next.AlmostEqual(pos, 1f))
{
AdvanceLine(line, pos);
if (line.ExplosionsLeft == 0)
Lines.RemoveAt(i);
break;
}
}
}
}
}
5 changes: 2 additions & 3 deletions BossMod/Modules/Dawntrail/Alliance/A12Fafnir/HurricaneWing.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,9 @@ public override void OnCastFinished(Actor caster, ActorCastInfo spell)
{
for (var i = 0; i < AOEs.Count; ++i)
{
var aoe = AOEs[i];
if (aoe.ActorID == caster.InstanceID)
if (AOEs[i].ActorID == caster.InstanceID)
{
AOEs.Remove(aoe);
AOEs.RemoveAt(i);
break;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ private void InitIfReady()
if (_rotation.Count == 3 && _increment != default)
{
for (var i = 0; i < 3; ++i)
Sequences.Add(new(_shape, Arena.Center, _rotation[i], _increment, _activation, 1.2f, 8));
Sequences.Add(new(_shape, WPos.ClampToGrid(Arena.Center), _rotation[i], _increment, _activation, 1.2f, 8));
_rotation.Clear();
_increment = default;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,9 @@ public override void OnCastFinished(Actor caster, ActorCastInfo spell)
var count = AOEs.Count;
for (var i = 0; i < count; ++i)
{
var aoe = AOEs[i];
if (aoe.ActorID == caster.InstanceID)
if (AOEs[i].ActorID == caster.InstanceID)
{
AOEs.Remove(aoe);
AOEs.RemoveAt(i);
break;
}
}
Expand Down
5 changes: 2 additions & 3 deletions BossMod/Modules/Dawntrail/Alliance/A14ShadowLord/Implosion.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,9 @@ public override void OnCastFinished(Actor caster, ActorCastInfo spell)
var count = _aoes.Count;
for (var i = 0; i < count; ++i)
{
var aoe = _aoes[i];
if (aoe.ActorID == caster.InstanceID)
if (_aoes[i].ActorID == caster.InstanceID)
{
_aoes.Remove(aoe);
_aoes.RemoveAt(i);
break;
}
}
Expand Down
45 changes: 29 additions & 16 deletions BossMod/Modules/Dawntrail/Alliance/A14ShadowLord/UmbraSmash.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ public override void AddAIHints(int slot, Actor actor, PartyRolesConfig.Assignme
var imminentAOEs = ImminentAOEs(linesCount);

// use only imminent aoes for hints
for (var i = 0; i < imminentAOEs.Length; ++i)
var len = imminentAOEs.Length;
for (var i = 0; i < len; ++i)
{
var aoe = imminentAOEs[i];
hints.AddForbiddenZone(Shape, aoe.Item1, aoe.Item3, aoe.Item2);
Expand All @@ -20,6 +21,9 @@ public override void AddAIHints(int slot, Actor actor, PartyRolesConfig.Assignme

public override void OnCastStarted(Actor caster, ActorCastInfo spell)
{
void AddLine(WPos origin, WDir direction, Angle offset)
=> Lines.Add(new() { Next = origin, Advance = 5f * direction, Rotation = spell.Rotation + offset, NextExplosion = Module.CastFinishAt(spell), TimeToMove = 2.3f, ExplosionsLeft = 6, MaxShownExplosions = 2 });

switch (spell.Action.ID)
{
case (uint)AID.UmbraSmashAOE1:
Expand All @@ -29,8 +33,8 @@ public override void OnCastStarted(Actor caster, ActorCastInfo spell)
case (uint)AID.UmbraSmashAOEClone:
var dir = spell.Rotation.ToDirection();
var origin = caster.Position + 30f * dir;
Lines.Add(new() { Next = origin, Advance = 5f * dir.OrthoL(), Rotation = spell.Rotation + 90f.Degrees(), NextExplosion = Module.CastFinishAt(spell), TimeToMove = 2.3f, ExplosionsLeft = 6, MaxShownExplosions = 2 });
Lines.Add(new() { Next = origin, Advance = 5f * dir.OrthoR(), Rotation = spell.Rotation - 90f.Degrees(), NextExplosion = Module.CastFinishAt(spell), TimeToMove = 2.3f, ExplosionsLeft = 6, MaxShownExplosions = 2 });
AddLine(origin, dir.OrthoL(), 90f.Degrees());
AddLine(origin, dir.OrthoR(), -90f.Degrees());
break;
}
}
Expand All @@ -46,26 +50,35 @@ public override void OnCastFinished(Actor caster, ActorCastInfo spell)
case (uint)AID.UmbraSmashAOEClone:
++NumCasts;
var origin = caster.Position + 30f * spell.Rotation.ToDirection();
foreach (var l in Lines.Where(l => l.Next.AlmostEqual(origin, 1f)))
var count = Lines.Count;
for (var i = 0; i < count; ++i)
{
l.Next = origin + l.Advance;
l.TimeToMove = 1;
l.NextExplosion = WorldState.FutureTime(l.TimeToMove);
--l.ExplosionsLeft;
var l = Lines[i];
if (l.Next.AlmostEqual(origin, 1f))
{
l.Next = origin + l.Advance;
l.TimeToMove = 1f;
l.NextExplosion = WorldState.FutureTime(l.TimeToMove);
--l.ExplosionsLeft;
}
}
break;
case (uint)AID.UmbraWave:
++NumCasts;
var index = Lines.FindIndex(item => item.Next.AlmostEqual(caster.Position, 1f));
if (index == -1)
var count2 = Lines.Count;
var pos = caster.Position;
for (var i = 0; i < count2; ++i)
{
ReportError($"Failed to find entry for {caster.InstanceID:X}");
return;
var line = Lines[i];
if (line.Next.AlmostEqual(pos, 1f))
{
AdvanceLine(line, pos);
if (line.ExplosionsLeft == 0)
Lines.RemoveAt(i);
return;
}
}

AdvanceLine(Lines[index], caster.Position);
if (Lines[index].ExplosionsLeft == 0)
Lines.RemoveAt(index);
ReportError($"Failed to find entry for {caster.InstanceID:X}");
break;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,11 @@ public override void OnEventCast(Actor caster, ActorCastEvent spell)
if (spell.Action.ID is (uint)AID.BreakBossAOE or (uint)AID.BreakEyeAOE)
{
var count = Eyes.Count;
var pos = caster.Position;
for (var i = 0; i < count; ++i)
{
var eye = Eyes[i];
if (eye.Position == caster.Position)
if (eye.Position == pos)
{
Eyes.Remove(eye);
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,12 +148,12 @@ public override void OnEventCast(Actor caster, ActorCastEvent spell)
{
++NumCasts;
var count = Towers.Count;
var pos = caster.Position;
for (var i = 0; i < count; ++i)
{
var tower = Towers[i];
if (tower.Position == caster.Position)
if (Towers[i].Position == pos)
{
Towers.Remove(tower);
Towers.RemoveAt(i);
break;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ public override IEnumerable<AOEInstance> ActiveAOEs(int slot, Actor actor)

public override void OnActorCreated(Actor actor)
{
void AddWhirlwind(ReadOnlySpan<WPos> pos)
void AddWhirlwind(WPos[] pos)
{
for (var i = 0; i < 3; ++i)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -250,9 +250,11 @@ public D052DeceiverStates(BossModule module) : base(module)
[ModuleInfo(BossModuleInfo.Maturity.Verified, Contributors = "The Combat Reborn Team (Malediktus, LTS)", GroupType = BossModuleInfo.GroupType.CFC, GroupID = 825, NameID = 12693, SortOrder = 3)]
public class D052Deceiver(WorldState ws, Actor primary) : BossModule(ws, primary, ArenaChanges.ArenaCenter, ArenaChanges.StartingBounds)
{
private static readonly uint[] adds = [(uint)OID.OrigenicsSentryG92, (uint)OID.OrigenicsSentryG91];

protected override void DrawEnemies(int pcSlot, Actor pc)
{
Arena.Actor(PrimaryActor);
Arena.Actors(Enemies([(uint)OID.OrigenicsSentryG92, (uint)OID.OrigenicsSentryG91]));
Arena.Actors(Enemies(adds));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -289,10 +289,11 @@ public class D053Ambrose(WorldState ws, Actor primary) : BossModule(ws, primary,
public static readonly WPos ArenaCenter = new(190f, default);
public static readonly ArenaBoundsRect StartingBounds = new(32.5f, 24f);
public static readonly ArenaBoundsRect DefaultBounds = new(15f, 19.5f);
private static readonly uint[] adds = [(uint)OID.Superfluity, (uint)OID.OrigenicsEyeborg];

protected override void DrawEnemies(int pcSlot, Actor pc)
{
Arena.Actor(PrimaryActor);
Arena.Actors(Enemies([(uint)OID.Superfluity, (uint)OID.OrigenicsEyeborg]));
Arena.Actors(Enemies(adds));
}
}
Loading

0 comments on commit e5b562d

Please sign in to comment.