using System; using System.Collections.Generic; using UnityEngine; namespace DepthsOfGreed.HandbookUI { public enum BuildFailure { None, OutsideRegion, Overlap, WallLimit, InteriorLimit, TypeLimit, Cooldown, Energy, Entrails, InvalidType, PathBlocked } public readonly struct BuildCheck { public readonly BuildFailure failure; public readonly string message; public bool Allowed => failure == BuildFailure.None; public BuildCheck(BuildFailure code, string text = null) { failure = code; message = text; } } public readonly struct BuildRequest { public readonly HandbookTowerEntry type; public readonly Vector3 position; public readonly float rotationDegrees; public BuildRequest(HandbookTowerEntry entry, Vector3 point, float angle = 0) { type = entry; position = point; rotationDegrees = angle; } } public sealed class BuiltObjectSnapshot { public long instanceId; public HandbookTowerEntry type; public Vector3 position; public float rotationDegrees; public GameObject instance; public int upgradeLevel; public float expiresAt; } // Implement on a MonoBehaviour and assign HandbookController.gameplayBackend. public interface IHandbookGameplay { event Action StateChanged; int Energy { get; } int Entrails { get; } int WallCount { get; } int WallLimit { get; } IReadOnlyList BuiltObjects { get; } BuildCheck CheckAvailability(HandbookTowerEntry type); BuildCheck CheckBuild(BuildRequest request); BuildCheck ExecuteBuild(BuildRequest request); BuildCheck CheckUpgrade(long instanceId); BuildCheck ExecuteUpgrade(long instanceId); float GetCooldownRemaining(HandbookTowerEntry type); } }