Skip to content

Commit

Permalink
Merge pull request #39 from CarnifexOptimus/_slave_lotsofchanges
Browse files Browse the repository at this point in the history
Changes to Alliance Raids, Masked Carnivale stage 28/29
  • Loading branch information
CarnifexOptimus authored Apr 13, 2024
2 parents 22e1bd6 + 54826d7 commit cef2205
Show file tree
Hide file tree
Showing 1,111 changed files with 14,963 additions and 24,825 deletions.
144 changes: 39 additions & 105 deletions BossMod/BossModule/AOEShapes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public abstract class AOEShape

public bool Check(WPos position, Actor? origin)
{
return origin != null ? Check(position, origin.Position, origin.Rotation) : false;
return origin != null && Check(position, origin.Position, origin.Rotation);
}

public void Draw(MiniArena arena, Actor? origin, uint color = ArenaColor.AOE)
Expand All @@ -26,18 +26,11 @@ public void Outline(MiniArena arena, Actor? origin, uint color = ArenaColor.Dang
}
}

public class AOEShapeCone : AOEShape
public class AOEShapeCone(float radius, Angle halfAngle, Angle directionOffset = new()) : AOEShape
{
public float Radius;
public Angle DirectionOffset;
public Angle HalfAngle;

public AOEShapeCone(float radius, Angle halfAngle, Angle directionOffset = new())
{
Radius = radius;
DirectionOffset = directionOffset;
HalfAngle = halfAngle;
}
public float Radius = radius;
public Angle DirectionOffset = directionOffset;
public Angle HalfAngle = halfAngle;

public override string ToString() => $"Cone: r={Radius:f3}, angle={HalfAngle * 2}, off={DirectionOffset}";
public override bool Check(WPos position, WPos origin, Angle rotation) => position.InCircleCone(origin, Radius, rotation + DirectionOffset, HalfAngle);
Expand All @@ -52,14 +45,9 @@ public override IEnumerable<IEnumerable<WPos>> Contour(WPos origin, Angle rotati
public override Func<WPos, float> Distance(WPos origin, Angle rotation) => ShapeDistance.Cone(origin, Radius, rotation + DirectionOffset, HalfAngle);
}

public class AOEShapeCircle : AOEShape
public class AOEShapeCircle(float radius) : AOEShape
{
public float Radius;

public AOEShapeCircle(float radius)
{
Radius = radius;
}
public float Radius = radius;

public override string ToString() => $"Circle: r={Radius:f3}";
public override bool Check(WPos position, WPos origin, Angle rotation = new()) => position.InCircle(origin, Radius);
Expand All @@ -72,16 +60,10 @@ public override IEnumerable<IEnumerable<WPos>> Contour(WPos origin, Angle rotati
public override Func<WPos, float> Distance(WPos origin, Angle rotation) => ShapeDistance.Circle(origin, Radius);
}

public class AOEShapeDonut : AOEShape
public class AOEShapeDonut(float innerRadius, float outerRadius) : AOEShape
{
public float InnerRadius;
public float OuterRadius;

public AOEShapeDonut(float innerRadius, float outerRadius)
{
InnerRadius = innerRadius;
OuterRadius = outerRadius;
}
public float InnerRadius = innerRadius;
public float OuterRadius = outerRadius;

public override string ToString() => $"Donut: r={InnerRadius:f3}-{OuterRadius:f3}";
public override bool Check(WPos position, WPos origin, Angle rotation = new()) => position.InDonut(origin, InnerRadius, OuterRadius);
Expand All @@ -99,20 +81,12 @@ public override IEnumerable<IEnumerable<WPos>> Contour(WPos origin, Angle rotati
public override Func<WPos, float> Distance(WPos origin, Angle rotation) => ShapeDistance.Donut(origin, InnerRadius, OuterRadius);
}

public class AOEShapeDonutSector : AOEShape
public class AOEShapeDonutSector(float innerRadius, float outerRadius, Angle halfAngle, Angle directionOffset = new()) : AOEShape
{
public float InnerRadius;
public float OuterRadius;
public Angle DirectionOffset;
public Angle HalfAngle;

public AOEShapeDonutSector(float innerRadius, float outerRadius, Angle halfAngle, Angle directionOffset = new())
{
InnerRadius = innerRadius;
OuterRadius = outerRadius;
DirectionOffset = directionOffset;
HalfAngle = halfAngle;
}
public float InnerRadius = innerRadius;
public float OuterRadius = outerRadius;
public Angle DirectionOffset = directionOffset;
public Angle HalfAngle = halfAngle;

public override string ToString() => $"Donut sector: r={InnerRadius:f3}-{OuterRadius:f3}, angle={HalfAngle * 2}, off={DirectionOffset}";
public override bool Check(WPos position, WPos origin, Angle rotation) => position.InDonutCone(origin, InnerRadius, OuterRadius, rotation + DirectionOffset, HalfAngle);
Expand All @@ -127,20 +101,12 @@ public override IEnumerable<IEnumerable<WPos>> Contour(WPos origin, Angle rotati
public override Func<WPos, float> Distance(WPos origin, Angle rotation) => ShapeDistance.DonutSector(origin, InnerRadius, OuterRadius, rotation + DirectionOffset, HalfAngle);
}

public class AOEShapeRect : AOEShape
public class AOEShapeRect(float lengthFront, float halfWidth, float lengthBack = 0, Angle directionOffset = new()) : AOEShape
{
public float LengthFront;
public float LengthBack;
public float HalfWidth;
public Angle DirectionOffset;

public AOEShapeRect(float lengthFront, float halfWidth, float lengthBack = 0, Angle directionOffset = new())
{
LengthFront = lengthFront;
LengthBack = lengthBack;
HalfWidth = halfWidth;
DirectionOffset = directionOffset;
}
public float LengthFront = lengthFront;
public float LengthBack = lengthBack;
public float HalfWidth = halfWidth;
public Angle DirectionOffset = directionOffset;

public override string ToString() => $"Rect: l={LengthFront:f3}+{LengthBack:f3}, w={HalfWidth * 2}, off={DirectionOffset}";
public override bool Check(WPos position, WPos origin, Angle rotation) => position.InRect(origin, rotation + DirectionOffset, LengthFront, LengthBack, HalfWidth);
Expand Down Expand Up @@ -178,18 +144,11 @@ public void SetEndPointFromCastLocation(Actor caster)
}
}

public class AOEShapeCross : AOEShape
public class AOEShapeCross(float length, float halfWidth, Angle directionOffset = new()) : AOEShape
{
public float Length;
public float HalfWidth;
public Angle DirectionOffset;

public AOEShapeCross(float length, float halfWidth, Angle directionOffset = new())
{
Length = length;
HalfWidth = halfWidth;
DirectionOffset = directionOffset;
}
public float Length = length;
public float HalfWidth = halfWidth;
public Angle DirectionOffset = directionOffset;

public override string ToString() => $"Cross: l={Length:f3}, w={HalfWidth * 2}, off={DirectionOffset}";
public override bool Check(WPos position, WPos origin, Angle rotation) => position.InRect(origin, rotation + DirectionOffset, Length, Length, HalfWidth) || position.InRect(origin, rotation + DirectionOffset, HalfWidth, HalfWidth, Length);
Expand All @@ -199,7 +158,7 @@ public override void Outline(MiniArena arena, WPos origin, Angle rotation, uint
{
foreach (var p in ContourPoints(origin, rotation))
arena.PathLineTo(p);
arena.PathStroke(true, color);
MiniArena.PathStroke(true, color);
}

public override IEnumerable<IEnumerable<WPos>> Contour(WPos origin, Angle rotation, float offset, float maxError)
Expand Down Expand Up @@ -232,60 +191,35 @@ private IEnumerable<WPos> ContourPoints(WPos origin, Angle rotation, float offse
}
}

// TODO: revise and reconsider, not convinced it needs to be here, and it's not well implemented
public class AOEShapeTriangle : AOEShape
// for equilateral triangles that have an origin point similar to circles
public class AOEShapeEquilateralTriangle(float sideLength, Angle directionOffset = new()) : AOEShape
{
public float SideLength;
public Angle DirectionOffset;

public AOEShapeTriangle(float sideLength, Angle directionOffset = new())
{
SideLength = sideLength;
DirectionOffset = directionOffset;
}
public float SideLength = sideLength;
public Angle DirectionOffset = directionOffset;

public override bool Check(WPos position, WPos origin, Angle rotation)
{
var vertices = CalculateVertices(origin, rotation + DirectionOffset);
return position.InTri(vertices.p1, vertices.p2, vertices.p3);
var (p1, p2, p3) = Helpers.CalculateEquilateralTriangleVertices(origin, rotation + DirectionOffset, SideLength);
return position.InTri(p1, p2, p3);
}

public override void Draw(MiniArena arena, WPos origin, Angle rotation, uint color = ArenaColor.AOE)
{
var vertices = CalculateVertices(origin, rotation + DirectionOffset);
arena.AddTriangleFilled(vertices.p1, vertices.p2, vertices.p3, color);
var (p1, p2, p3) = Helpers.CalculateEquilateralTriangleVertices(origin, rotation + DirectionOffset, SideLength);
var clippedVertices = arena.Bounds.ClipAndTriangulate([p1, p2, p3]);
arena.Zone(clippedVertices, color);
}

public override void Outline(MiniArena arena, WPos origin, Angle rotation, uint color = ArenaColor.Danger)
{
var vertices = CalculateVertices(origin, rotation + DirectionOffset);
arena.AddTriangle(vertices.p1, vertices.p2, vertices.p3, color);
var (p1, p2, p3) = Helpers.CalculateEquilateralTriangleVertices(origin, rotation + DirectionOffset, SideLength);
arena.AddTriangle(p1, p2, p3, color);
}

public override IEnumerable<IEnumerable<WPos>> Contour(WPos origin, Angle rotation, float offset = 0, float maxError = 1)
{
var vertices = CalculateVertices(origin, rotation + DirectionOffset, offset);
return new List<IEnumerable<WPos>> { new[] { vertices.p1, vertices.p2, vertices.p3 } };
var (p1, p2, p3) = Helpers.CalculateEquilateralTriangleVertices(origin, rotation + DirectionOffset, offset);
return [[p1, p2, p3]];
}

public override Func<WPos, float> Distance(WPos origin, Angle rotation)
{
// Implementing an exact distance calculation for a triangle shape might be complex and is beyond the scope of this basic implementation.
return p => (p - origin).Length(); // Simplified placeholder
}

private (WPos p1, WPos p2, WPos p3) CalculateVertices(WPos origin, Angle rotation, float offset = 0)
{
// Calculate vertex positions for an equilateral triangle with origin as one vertex
var sideOffset = (SideLength + offset) / 2;
var height = MathF.Sqrt(3) / 2 * (SideLength + offset);
var direction = rotation.ToDirection();
var ortho = direction.OrthoR();

var p1 = origin; // The origin is one of the vertices
var p2 = origin + direction * height - ortho * sideOffset;
var p3 = origin + direction * height + ortho * sideOffset;

return (p1, p2, p3);
}
public override Func<WPos, float> Distance(WPos origin, Angle rotation) => ShapeDistance.EquilateralTriangle(origin, rotation, SideLength, true);
}
Loading

0 comments on commit cef2205

Please sign in to comment.