Working MVP
This commit is contained in:
171
Assets/Scripts/Minigames/FortFight/UI/AmmunitionPanel.cs
Normal file
171
Assets/Scripts/Minigames/FortFight/UI/AmmunitionPanel.cs
Normal file
@@ -0,0 +1,171 @@
|
||||
using Core;
|
||||
using Core.Lifecycle;
|
||||
using Minigames.FortFight.Core;
|
||||
using Minigames.FortFight.Data;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Minigames.FortFight.UI
|
||||
{
|
||||
/// <summary>
|
||||
/// Manages ammunition UI panel for a specific player.
|
||||
/// Shows/hides based on turn state and initializes buttons with player context.
|
||||
/// </summary>
|
||||
public class AmmunitionPanel : ManagedBehaviour
|
||||
{
|
||||
#region Inspector References
|
||||
|
||||
[Header("Player Configuration")]
|
||||
[Tooltip("Which player this panel belongs to (0 = Player 1, 1 = Player 2)")]
|
||||
[SerializeField] private int playerIndex = 0;
|
||||
|
||||
[Header("References")]
|
||||
[Tooltip("Ammunition manager (shared between both players)")]
|
||||
[SerializeField] private AmmunitionManager ammunitionManager;
|
||||
|
||||
[Tooltip("This player's slingshot controller")]
|
||||
[SerializeField] private SlingshotController slingshotController;
|
||||
|
||||
[Tooltip("Turn manager to subscribe to turn events")]
|
||||
[SerializeField] private TurnManager turnManager;
|
||||
|
||||
[Header("UI")]
|
||||
[Tooltip("Array of ammo buttons in this panel")]
|
||||
[SerializeField] private AmmoButton[] ammoButtons;
|
||||
|
||||
[Tooltip("Root GameObject to show/hide entire panel")]
|
||||
[SerializeField] private GameObject panelRoot;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Initialization
|
||||
|
||||
internal override void OnManagedAwake()
|
||||
{
|
||||
base.OnManagedAwake();
|
||||
|
||||
// Validate references
|
||||
if (ammunitionManager == null)
|
||||
{
|
||||
Logging.Error($"[AmmunitionPanel] Player {playerIndex}: Ammunition manager not assigned!");
|
||||
}
|
||||
|
||||
if (slingshotController == null)
|
||||
{
|
||||
Logging.Error($"[AmmunitionPanel] Player {playerIndex}: Slingshot controller not assigned!");
|
||||
}
|
||||
|
||||
if (turnManager == null)
|
||||
{
|
||||
Logging.Error($"[AmmunitionPanel] Player {playerIndex}: Turn manager not assigned!");
|
||||
}
|
||||
|
||||
if (ammoButtons == null || ammoButtons.Length == 0)
|
||||
{
|
||||
Logging.Warning($"[AmmunitionPanel] Player {playerIndex}: No ammo buttons assigned!");
|
||||
}
|
||||
|
||||
// Use assigned panelRoot or fall back to this GameObject
|
||||
if (panelRoot == null)
|
||||
{
|
||||
panelRoot = gameObject;
|
||||
}
|
||||
}
|
||||
|
||||
internal override void OnManagedStart()
|
||||
{
|
||||
base.OnManagedStart();
|
||||
|
||||
// Initialize ammo buttons with player context
|
||||
InitializeButtons();
|
||||
|
||||
// Subscribe to turn events
|
||||
if (turnManager != null)
|
||||
{
|
||||
turnManager.OnTurnStarted += HandleTurnStarted;
|
||||
}
|
||||
|
||||
// Start hidden
|
||||
SetPanelVisibility(false);
|
||||
}
|
||||
|
||||
internal override void OnManagedDestroy()
|
||||
{
|
||||
base.OnManagedDestroy();
|
||||
|
||||
// Unsubscribe from events
|
||||
if (turnManager != null)
|
||||
{
|
||||
turnManager.OnTurnStarted -= HandleTurnStarted;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initialize all ammo buttons with player-specific configuration
|
||||
/// </summary>
|
||||
private void InitializeButtons()
|
||||
{
|
||||
if (ammunitionManager == null || slingshotController == null || ammoButtons == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Get available projectile types from settings
|
||||
var availableTypes = ammunitionManager.GetAvailableProjectileTypes();
|
||||
var settings = GameManager.GetSettingsObject<AppleHills.Core.Settings.IFortFightSettings>();
|
||||
|
||||
if (settings == null)
|
||||
{
|
||||
Logging.Error($"[AmmunitionPanel] Player {playerIndex}: Could not get FortFightSettings!");
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < ammoButtons.Length && i < availableTypes.Count; i++)
|
||||
{
|
||||
if (ammoButtons[i] != null)
|
||||
{
|
||||
var config = settings.GetProjectileConfig(availableTypes[i]);
|
||||
if (config != null)
|
||||
{
|
||||
ammoButtons[i].Initialize(config, ammunitionManager, slingshotController, playerIndex);
|
||||
Logging.Debug($"[AmmunitionPanel] Player {playerIndex}: Initialized button for {config.displayName}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Turn Events
|
||||
|
||||
/// <summary>
|
||||
/// Called when any player's turn starts - show/hide panel accordingly
|
||||
/// </summary>
|
||||
private void HandleTurnStarted(PlayerData player, TurnState turnState)
|
||||
{
|
||||
// Only show panel when it's this player's turn (not during transitions)
|
||||
bool shouldShow = player.PlayerIndex == playerIndex &&
|
||||
(turnState == TurnState.PlayerOneTurn || turnState == TurnState.PlayerTwoTurn);
|
||||
|
||||
SetPanelVisibility(shouldShow);
|
||||
|
||||
if (shouldShow)
|
||||
{
|
||||
Logging.Debug($"[AmmunitionPanel] Showing panel for Player {playerIndex}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Show or hide the entire panel
|
||||
/// </summary>
|
||||
private void SetPanelVisibility(bool visible)
|
||||
{
|
||||
if (panelRoot != null)
|
||||
{
|
||||
panelRoot.SetActive(visible);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user