using AppleHills.Core.Settings; using Common.Input; using UnityEngine; namespace Minigames.Airplane.Settings { /// /// Settings for the airplane minigame. /// Create via Assets > Create > AppleHills > Settings > Airplane /// [CreateAssetMenu(fileName = "AirplaneSettings", menuName = "AppleHills/Settings/Airplane", order = 9)] public class AirplaneSettings : BaseSettings, IAirplaneSettings { [Header("=== AIRPLANE TYPES ===")] [Header("Jet Plane")] [SerializeField] private Data.AirplaneTypeConfig jetPlaneConfig = new Data.AirplaneTypeConfig { displayName = "Jet Plane", abilityType = Data.AirplaneAbilityType.Jet }; [SerializeField] private Data.JetAbilityConfig jetAbilityConfig = new Data.JetAbilityConfig(); [Header("Bobbing Plane")] [SerializeField] private Data.AirplaneTypeConfig bobbingPlaneConfig = new Data.AirplaneTypeConfig { displayName = "Bobbing Plane", abilityType = Data.AirplaneAbilityType.Bobbing }; [SerializeField] private Data.BobbingAbilityConfig bobbingAbilityConfig = new Data.BobbingAbilityConfig(); [Header("Drop Plane")] [SerializeField] private Data.AirplaneTypeConfig dropPlaneConfig = new Data.AirplaneTypeConfig { displayName = "Drop Plane", abilityType = Data.AirplaneAbilityType.Drop }; [SerializeField] private Data.DropAbilityConfig dropAbilityConfig = new Data.DropAbilityConfig(); [Header("Default Selection")] [Tooltip("Which airplane type is selected by default")] [SerializeField] private Data.AirplaneAbilityType defaultAirplaneType = Data.AirplaneAbilityType.Jet; [Header("=== SLINGSHOT ===")] [SerializeField] private SlingshotConfig slingshotSettings = new SlingshotConfig { maxDragDistance = 5f, baseLaunchForce = 20f, minForceMultiplier = 0.1f, maxForceMultiplier = 1f, trajectoryPoints = 20, trajectoryTimeStep = 0.1f, trajectoryLockDuration = 0f, // No locking for airplane autoRegisterInput = true // Direct registration }; [Header("Flight Settings")] [Tooltip("Mass of the airplane")] [SerializeField] private float airplaneMass = 1f; [Tooltip("Maximum flight time before timeout (seconds)")] [SerializeField] private float maxFlightTime = 10f; [Header("Timing")] [Tooltip("Duration of intro sequence (seconds)")] [SerializeField] private float introDuration = 1f; [Tooltip("Duration of person introduction (seconds)")] [SerializeField] private float personIntroDuration = 1f; [Tooltip("Duration of result evaluation (seconds)")] [SerializeField] private float evaluationDuration = 1f; [Header("Spawn System")] [Tooltip("Transform marker in scene where dynamic spawning begins (uses X position). If null, uses fallback distance.")] [SerializeField] private Transform dynamicSpawnThresholdMarker; [Tooltip("Minimum random distance for target spawn")] [SerializeField] private float targetMinDistance = 30f; [Tooltip("Maximum random distance for target spawn")] [SerializeField] private float targetMaxDistance = 50f; [Tooltip("Minimum distance between spawned objects (units)")] [SerializeField] private float objectSpawnMinDistance = 5f; [Tooltip("Maximum distance between spawned objects (units)")] [SerializeField] private float objectSpawnMaxDistance = 20f; [Tooltip("Ratio of positive to negative objects (0 = all negative, 1 = all positive)")] [Range(0f, 1f)] [SerializeField] private float positiveNegativeRatio = 0.5f; [Tooltip("Distance ahead of plane to spawn objects")] [SerializeField] private float spawnDistanceAhead = 15f; [Tooltip("Distance interval for ground tile spawning")] [SerializeField] private float groundSpawnInterval = 5f; [Header("Ground Snapping")] [Tooltip("Layer for ground detection (objects will snap to this)")] [Layer] [SerializeField] private int groundLayer = 0; // Default layer [Tooltip("Maximum distance to raycast for ground")] [SerializeField] private float maxGroundRaycastDistance = 50f; [Tooltip("Default Y offset for objects if no ground found")] [SerializeField] private float defaultObjectYOffset = 0f; [Header("Debug")] [Tooltip("Show debug logs in console")] [SerializeField] private bool showDebugLogs; #region IAirplaneSettings Implementation public Data.AirplaneTypeConfig GetAirplaneConfig(Data.AirplaneAbilityType type) { return type switch { Data.AirplaneAbilityType.Jet => jetPlaneConfig, Data.AirplaneAbilityType.Bobbing => bobbingPlaneConfig, Data.AirplaneAbilityType.Drop => dropPlaneConfig, _ => jetPlaneConfig // Fallback to jet }; } public Data.JetAbilityConfig JetAbilityConfig => jetAbilityConfig; public Data.BobbingAbilityConfig BobbingAbilityConfig => bobbingAbilityConfig; public Data.DropAbilityConfig DropAbilityConfig => dropAbilityConfig; public Data.AirplaneAbilityType DefaultAirplaneType => defaultAirplaneType; public SlingshotConfig SlingshotSettings => slingshotSettings; public float AirplaneMass => airplaneMass; public float MaxFlightTime => maxFlightTime; public float IntroDuration => introDuration; public float PersonIntroDuration => personIntroDuration; public float EvaluationDuration => evaluationDuration; public float TargetMinDistance => targetMinDistance; public float TargetMaxDistance => targetMaxDistance; public float ObjectSpawnMinDistance => objectSpawnMinDistance; public float ObjectSpawnMaxDistance => objectSpawnMaxDistance; public float PositiveNegativeRatio => positiveNegativeRatio; public float SpawnDistanceAhead => spawnDistanceAhead; public float GroundSpawnInterval => groundSpawnInterval; public int GroundLayer => groundLayer; public float MaxGroundRaycastDistance => maxGroundRaycastDistance; public float DefaultObjectYOffset => defaultObjectYOffset; public bool ShowDebugLogs => showDebugLogs; #endregion } }