First go at bird pooper controller

This commit is contained in:
Michal Pikulski
2025-11-20 01:29:30 +01:00
parent 97921c3727
commit 635b74db0a
18 changed files with 905 additions and 104 deletions

View File

@@ -171,6 +171,7 @@ namespace Core
var minigameSettings = SettingsProvider.Instance.LoadSettingsSynchronous<DivingMinigameSettings>();
var cardSystemSettings = SettingsProvider.Instance.LoadSettingsSynchronous<CardSystemSettings>();
var sortingGameSettings = SettingsProvider.Instance.LoadSettingsSynchronous<CardSortingSettings>();
var birdPooperSettings = SettingsProvider.Instance.LoadSettingsSynchronous<BirdPooperSettings>();
// Register settings with service locator
if (playerSettings != null)
@@ -222,9 +223,19 @@ namespace Core
{
Debug.LogError("Failed to load CardSystemSettings");
}
if (birdPooperSettings != null)
{
ServiceLocator.Register<IBirdPooperSettings>(birdPooperSettings);
Logging.Debug("BirdPooperSettings registered successfully");
}
else
{
Debug.LogError("Failed to load BirdPooperSettings");
}
// Log success
_settingsLoaded = playerSettings != null && interactionSettings != null && minigameSettings != null && cardSystemSettings != null;
_settingsLoaded = playerSettings != null && interactionSettings != null && minigameSettings != null && cardSystemSettings != null && birdPooperSettings != null;
if (_settingsLoaded)
{
Logging.Debug("All settings loaded and registered with ServiceLocator");

View File

@@ -0,0 +1,89 @@
using AppleHills.Core.Settings;
using UnityEngine;
namespace Core.Settings
{
[CreateAssetMenu(fileName = "BirdPooperSettings", menuName = "AppleHills/Settings/BirdPooper", order = 5)]
public class BirdPooperSettings : BaseSettings, IBirdPooperSettings
{
[Header("Player Controller")]
[Tooltip("Gravity acceleration in units/s²")]
[SerializeField] private float gravity = 20f;
[Tooltip("Upward velocity applied on flap in units/s")]
[SerializeField] private float flapForce = 8f;
[Tooltip("Maximum fall speed (terminal velocity) in units/s")]
[SerializeField] private float maxFallSpeed = 15f;
[Tooltip("Minimum Y boundary")]
[SerializeField] private float minY = -5f;
[Tooltip("Maximum Y boundary")]
[SerializeField] private float maxY = 5f;
[Header("Rotation")]
[Tooltip("Maximum rotation angle in degrees (positive = up, negative = down)")]
[SerializeField] private float maxRotationAngle = 30f;
[Tooltip("Speed of rotation interpolation (higher = snappier)")]
[SerializeField] private float rotationSpeed = 8f;
[Header("Obstacles")]
[Tooltip("Obstacle scroll speed in units/s")]
[SerializeField] private float obstacleMoveSpeed = 5f;
[Tooltip("Time between obstacle spawns in seconds")]
[SerializeField] private float obstacleSpawnInterval = 2f;
[Tooltip("X position where obstacles spawn (off-screen right)")]
[SerializeField] private float obstacleSpawnXPosition = 12f;
[Tooltip("X position where obstacles are destroyed (off-screen left)")]
[SerializeField] private float obstacleDestroyXPosition = -12f;
[Tooltip("Minimum Y position for obstacle spawns")]
[SerializeField] private float obstacleMinSpawnY = -3f;
[Tooltip("Maximum Y position for obstacle spawns")]
[SerializeField] private float obstacleMaxSpawnY = 3f;
[Header("Poop Projectile")]
[Tooltip("Poop fall speed in units/s")]
[SerializeField] private float poopFallSpeed = 10f;
[Tooltip("Y position where poop is destroyed (off-screen bottom)")]
[SerializeField] private float poopDestroyYPosition = -10f;
// Interface implementation
public float Gravity => gravity;
public float FlapForce => flapForce;
public float MaxFallSpeed => maxFallSpeed;
public float MinY => minY;
public float MaxY => maxY;
public float MaxRotationAngle => maxRotationAngle;
public float RotationSpeed => rotationSpeed;
public float ObstacleMoveSpeed => obstacleMoveSpeed;
public float ObstacleSpawnInterval => obstacleSpawnInterval;
public float ObstacleSpawnXPosition => obstacleSpawnXPosition;
public float ObstacleDestroyXPosition => obstacleDestroyXPosition;
public float ObstacleMinSpawnY => obstacleMinSpawnY;
public float ObstacleMaxSpawnY => obstacleMaxSpawnY;
public float PoopFallSpeed => poopFallSpeed;
public float PoopDestroyYPosition => poopDestroyYPosition;
public override void OnValidate()
{
base.OnValidate();
// Validation logic
gravity = Mathf.Max(0f, gravity);
flapForce = Mathf.Max(0f, flapForce);
maxFallSpeed = Mathf.Max(0f, maxFallSpeed);
maxRotationAngle = Mathf.Clamp(maxRotationAngle, 0f, 90f);
rotationSpeed = Mathf.Max(0.1f, rotationSpeed);
obstacleSpawnInterval = Mathf.Max(0.1f, obstacleSpawnInterval);
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: e7d3f5b948b3454681fa573071bee978
timeCreated: 1763596494

View File

@@ -0,0 +1,33 @@
namespace Core.Settings
{
/// <summary>
/// Settings interface for Bird Pooper minigame.
/// Accessed via GameManager.GetSettingsObject<IBirdPooperSettings>()
/// </summary>
public interface IBirdPooperSettings
{
// Player Controller
float Gravity { get; }
float FlapForce { get; }
float MaxFallSpeed { get; }
float MinY { get; }
float MaxY { get; }
// Rotation
float MaxRotationAngle { get; }
float RotationSpeed { get; }
// Obstacles
float ObstacleMoveSpeed { get; }
float ObstacleSpawnInterval { get; }
float ObstacleSpawnXPosition { get; }
float ObstacleDestroyXPosition { get; }
float ObstacleMinSpawnY { get; }
float ObstacleMaxSpawnY { get; }
// Poop Projectile
float PoopFallSpeed { get; }
float PoopDestroyYPosition { get; }
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 66509e37e0a549a79de6fe3fa710fd63
timeCreated: 1763596482