Grid/DungeonRPGProfile.cs
using Sandbox;
using static Sandbox.Tonemapping;

namespace SWB.Visuals.Profiles;

/// <summary>
/// Keskiaikainen dungeon / RPG -valaistus.
/// Lämmin, kontrastinen, varjoja korostava.
/// </summary>
public sealed class DungeonRPGProfile : CinematicProfile
{
    // Filmimäinen mutta ei futuristinen
    public override TonemappingMode Tonemap => TonemappingMode.ACES;

    // Bloom vain soihtuihin / tuliefekteihin
    public override bool EnableBloom => true;
    public override float BloomThreshold => 0.85f;

    protected override void ApplyLighting()
    {
        var cam = Scene.Camera;
        if (cam == null)
            return;

        // ─────────────────────────────
        // KEY – "soihtu / kynttilä"
        // Lämmin päävalo sivusta
        // ─────────────────────────────
        var keyGO = GetOrCreateLight("KeyLight");
        var key = keyGO.Components.GetOrCreate<DirectionalLight>();

        key.LightColor = new Color(1.0f, 0.78f, 0.55f); // lämmin tuli
        key.Shadows = true;

        keyGO.Transform.Rotation =
            Rotation.LookAt(new Vector3(-0.6f, -0.4f, -1.0f));

        // ─────────────────────────────
        // FILL – heikko hajavalo kiviseinistä
        // ─────────────────────────────
        var fillGO = GetOrCreateLight("FillLight");
        var fill = fillGO.Components.GetOrCreate<PointLight>();

        fill.LightColor = new Color(0.35f, 0.38f, 0.45f); // kylmä kivi
        fill.Radius = 1200f;
        fill.Shadows = false;

        fillGO.Transform.Position =
            cam.Transform.Position +
            cam.Transform.Rotation.Right * 200f +
            cam.Transform.Rotation.Up * 150f;

        // ─────────────────────────────
        // ACCENT – takavalo / soihtu takana
        // Antaa siluetin ja "luolasyvyyden"
        // ─────────────────────────────
        var accentGO = GetOrCreateLight("AccentLight");
        var accent = accentGO.Components.GetOrCreate<SpotLight>();

        accent.LightColor = new Color(1.0f, 0.65f, 0.35f); // oranssi tuli
        accent.Radius = 700f;
        accent.ConeInner = 18f;
        accent.ConeOuter = 30f;
        accent.Shadows = false;

        accentGO.Transform.Position =
            cam.Transform.Position -
            cam.Transform.Rotation.Forward * 250f +
            cam.Transform.Rotation.Up * 120f;

        accentGO.Transform.Rotation = cam.Transform.Rotation;
    }
}