pooper_minigame (#62)

Co-authored-by: Michal Pikulski <michal.a.pikulski@gmail.com>
Reviewed-on: #62
This commit is contained in:
2025-11-20 15:16:57 +00:00
parent 6ebf46fe8b
commit 058af331e0
113 changed files with 9398 additions and 1930 deletions

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