Game/HollowRun.cs
namespace Monolith;

public enum HollowKind
{
	None,
	/// <summary>No Drones. Everything has to be shot by hand.</summary>
	Handmade,
	/// <summary>No Demolition charges at all. The whole ability is off the table.</summary>
	Unarmed,
	/// <summary>Upgrades cost triple. The run is about routing, not spending.</summary>
	Austere,
}

public sealed class HollowDef
{
	public HollowKind Kind;
	public string Name;
	public string Rule;
}

/// <summary>
/// Opt-in restricted runs. They pay Cores and nothing else, so they are pure prestige
/// progression and never sit on the critical path.
///
/// Cookie Clicker's Born Again run works because the restriction changes what you *think*
/// about, not merely how long you wait. Each of these removes a system outright rather than
/// scaling a number, for the same reason.
/// </summary>
public static class HollowRuns
{
	public static readonly HollowDef[] All =
	{
		new()
		{
			Kind = HollowKind.Handmade,
			Name = "Handmade",
			Rule = "Drones do nothing. Every cube is one you shot.",
		},
		new()
		{
			Kind = HollowKind.Unarmed,
			Name = "Unarmed",
			Rule = "No demolition charges. No bores, no active reloads.",
		},
		new()
		{
			Kind = HollowKind.Austere,
			Name = "Austere",
			Rule = "Upgrades cost triple.",
		},
	};

	public static HollowDef Get( HollowKind kind ) => All.FirstOrDefault( h => h.Kind == kind );

	/// <summary>Cost multiplier applied to every upgrade under the active restriction.</summary>
	public static double CostMultiplier( HollowKind kind )
		=> kind == HollowKind.Austere ? 3.0 : 1.0;

	public static bool DronesDisabled( HollowKind kind ) => kind == HollowKind.Handmade;
	public static bool DemolitionDisabled( HollowKind kind ) => kind == HollowKind.Unarmed;
}