Trash maze MVP (#79)

Co-authored-by: Michal Pikulski <michal@foolhardyhorizons.com>
Co-authored-by: Michal Pikulski <michal.a.pikulski@gmail.com>
Reviewed-on: #79
This commit is contained in:
2025-12-10 11:14:10 +00:00
parent 4f8c8ff563
commit 082ce98f79
58 changed files with 4624 additions and 1502 deletions

View File

@@ -182,7 +182,7 @@ namespace Core
// Register settings with service locator
if (playerSettings != null)
{
ServiceLocator.Register<IPlayerFollowerSettings>(playerSettings);
ServiceLocator.Register<IPlayerMovementConfigs>(playerSettings);
Logging.Debug("PlayerFollowerSettings registered successfully");
}
else

View File

@@ -3,37 +3,79 @@
namespace AppleHills.Core.Settings
{
/// <summary>
/// Settings related to player and follower behavior
/// Settings related to player and follower behavior.
/// Implements IPlayerMovementConfigs to provide separate configurations for different movement contexts.
/// </summary>
[CreateAssetMenu(fileName = "PlayerFollowerSettings", menuName = "AppleHills/Settings/Player & Follower", order = 1)]
public class PlayerFollowerSettings : BaseSettings, IPlayerFollowerSettings
public class PlayerFollowerSettings : BaseSettings, IPlayerMovementConfigs
{
[Header("Default Player Movement (Overworld)")]
[SerializeField] private PlayerMovementSettingsData defaultPlayerMovement = new PlayerMovementSettingsData();
[Header("Trash Maze - Pulver Movement")]
[SerializeField] private PlayerMovementSettingsData trashMazeMovement = new PlayerMovementSettingsData();
[Header("Follower Settings")]
[SerializeField] private FollowerSettingsData followerMovement = new FollowerSettingsData();
// IPlayerMovementConfigs implementation
public IPlayerMovementSettings DefaultPlayerMovement => defaultPlayerMovement;
public IPlayerMovementSettings TrashMazeMovement => trashMazeMovement;
public IFollowerSettings FollowerMovement => followerMovement;
public override void OnValidate()
{
base.OnValidate();
defaultPlayerMovement?.Validate();
trashMazeMovement?.Validate();
followerMovement?.Validate();
}
}
/// <summary>
/// Serializable data for player movement settings
/// </summary>
[System.Serializable]
public class PlayerMovementSettingsData : IPlayerMovementSettings
{
[Header("Player Settings")]
[SerializeField] private float moveSpeed = 5f;
[SerializeField] private float moveAcceleration = 10000f;
[SerializeField] private float maxAcceleration = 10000f;
[SerializeField] private float stopDistance = 0.1f;
[SerializeField] private bool useRigidbody = true;
[SerializeField] private HoldMovementMode defaultHoldMovementMode = HoldMovementMode.Pathfinding;
[Header("Follower Settings")]
public float MoveSpeed => moveSpeed;
public float MaxAcceleration => maxAcceleration;
public float StopDistance => stopDistance;
public bool UseRigidbody => useRigidbody;
public HoldMovementMode DefaultHoldMovementMode => defaultHoldMovementMode;
public void Validate()
{
moveSpeed = Mathf.Max(0.1f, moveSpeed);
maxAcceleration = Mathf.Max(0.1f, maxAcceleration);
stopDistance = Mathf.Max(0.01f, stopDistance);
}
}
/// <summary>
/// Serializable data for follower settings
/// </summary>
[System.Serializable]
public class FollowerSettingsData : IFollowerSettings
{
[SerializeField] private float followDistance = 1.5f;
[SerializeField] private float manualMoveSmooth = 8f;
[SerializeField] private float thresholdFar = 2.5f;
[SerializeField] private float thresholdNear = 0.5f;
[SerializeField] private float stopThreshold = 0.1f;
[Header("Backend Settings")]
[Tooltip("Technical parameters, not for design tuning")]
[SerializeField] private float followUpdateInterval = 0.1f;
[SerializeField] private float followerSpeedMultiplier = 1.2f;
[SerializeField] private float heldIconDisplayHeight = 2.0f;
[Header("Trash Maze Vision")]
[SerializeField] private float trashMazeVisionRadius = 8f;
// IPlayerFollowerSettings implementation
public float MoveSpeed => moveSpeed;
public float MaxAcceleration => moveAcceleration;
public float StopDistance => stopDistance;
public bool UseRigidbody => useRigidbody;
public HoldMovementMode DefaultHoldMovementMode => defaultHoldMovementMode;
public float FollowDistance => followDistance;
public float ManualMoveSmooth => manualMoveSmooth;
public float ThresholdFar => thresholdFar;
@@ -42,14 +84,19 @@ namespace AppleHills.Core.Settings
public float FollowUpdateInterval => followUpdateInterval;
public float FollowerSpeedMultiplier => followerSpeedMultiplier;
public float HeldIconDisplayHeight => heldIconDisplayHeight;
public override void OnValidate()
public float TrashMazeVisionRadius => trashMazeVisionRadius;
public void Validate()
{
base.OnValidate();
// Validate values
moveSpeed = Mathf.Max(0.1f, moveSpeed);
followDistance = Mathf.Max(0.1f, followDistance);
manualMoveSmooth = Mathf.Max(0.1f, manualMoveSmooth);
thresholdFar = Mathf.Max(0.1f, thresholdFar);
thresholdNear = Mathf.Max(0.01f, thresholdNear);
stopThreshold = Mathf.Max(0.01f, stopThreshold);
followUpdateInterval = Mathf.Max(0.01f, followUpdateInterval);
followerSpeedMultiplier = Mathf.Max(0.1f, followerSpeedMultiplier);
heldIconDisplayHeight = Mathf.Max(0f, heldIconDisplayHeight);
trashMazeVisionRadius = Mathf.Max(1f, trashMazeVisionRadius);
}
}
}

View File

@@ -14,18 +14,33 @@ namespace AppleHills.Core.Settings
}
/// <summary>
/// Interface for player and follower settings
/// Interface for player movement settings (used by all player controllers)
/// </summary>
public interface IPlayerFollowerSettings
public interface IPlayerMovementSettings
{
// Player settings
float MoveSpeed { get; }
float MaxAcceleration { get; } // Added new property for player acceleration
float MaxAcceleration { get; }
float StopDistance { get; }
bool UseRigidbody { get; }
HoldMovementMode DefaultHoldMovementMode { get; }
// Follower settings
}
/// <summary>
/// Container interface that holds multiple player movement configurations.
/// Allows different controllers to use the same base settings interface with different values.
/// </summary>
public interface IPlayerMovementConfigs
{
IPlayerMovementSettings DefaultPlayerMovement { get; }
IPlayerMovementSettings TrashMazeMovement { get; }
IFollowerSettings FollowerMovement { get; }
}
/// <summary>
/// Interface for follower-specific settings (completely separate from player movement)
/// </summary>
public interface IFollowerSettings
{
float FollowDistance { get; }
float ManualMoveSmooth { get; }
float ThresholdFar { get; }
@@ -34,6 +49,7 @@ namespace AppleHills.Core.Settings
float FollowUpdateInterval { get; }
float FollowerSpeedMultiplier { get; }
float HeldIconDisplayHeight { get; }
float TrashMazeVisionRadius { get; }
}
/// <summary>