Adding big batch of structural code provided by Claude to start designing levels

This commit is contained in:
Matt F 2026-04-27 22:55:23 -07:00
parent 0ed4df8bc9
commit a4e28bc93f
26 changed files with 1951 additions and 0 deletions

View file

@ -0,0 +1,68 @@
using UnityEngine;
using TD.Core;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace TD.Levels
{
/// <summary>
/// Authoring volume that defines a player's owned territory. Tiles covered by a
/// PlayerZoneVolume are <see cref="PlacementState.Buildable"/> in the baked grid (unless
/// covered by an Invalid-validity volume — Invalid wins).
/// </summary>
/// <remarks>
/// A single player's zone may consist of multiple PlayerZoneVolume instances with the same
/// <see cref="owner"/>; the bake unions their tile coverage. This supports L-shapes and other
/// non-rectangular zone footprints.
/// </remarks>
public class PlayerZoneVolume : VolumeBase
{
[Tooltip("Which player owns this zone.")]
public PlayerSlot owner = PlayerSlot.Player1;
[Tooltip("Whether tiles in this volume are buildable. Defaults to Allowed.")]
public PlacementValidity placementValidity = PlacementValidity.Allowed;
// Per-volume gizmo Y level (see gizmo design summary). Player zones draw lowest so
// overlapping spawners/leak exits/goals stack on top of them.
private const float FillYLevel = 0.02f;
protected override bool GetAlwaysShowToggle(LevelAuthoring authoring)
{
return authoring.alwaysShowPlayerZones;
}
// Selection-only by default. Always-on path runs from OnDrawGizmos when the toggle is set.
private void OnDrawGizmosSelected()
{
DrawGizmosCore();
}
private void OnDrawGizmos()
{
if (ShouldDrawAlwaysOn())
{
DrawGizmosCore();
}
}
private void DrawGizmosCore()
{
Color baseColor = PlayerColors.Get(owner);
DrawTileCoverageFill(baseColor, alpha: 0.35f, yLevel: FillYLevel);
DrawRectangularOutline(baseColor, yLevel: FillYLevel);
#if UNITY_EDITOR
// Label centered on the volume's bounds, identifying which player owns this build area.
var col = Collider;
if (col != null)
{
Vector3 labelPos = new Vector3(col.bounds.center.x, FillYLevel + 0.1f, col.bounds.center.z);
Handles.Label(labelPos, $"{FormatPlayerName(owner)} Build Area");
}
#endif
}
}
}