Ropes breaking and shit
This commit is contained in:
@@ -31,6 +31,10 @@ namespace Minigames.DivingForPictures
|
||||
[Tooltip("Additional points per depth unit")]
|
||||
[SerializeField] private int depthMultiplier = 10;
|
||||
|
||||
[Header("Rope Damage System")]
|
||||
[Tooltip("Ropes that will break one by one as player takes damage")]
|
||||
[SerializeField] private RopeBreaker[] playerRopes;
|
||||
|
||||
// Private state variables
|
||||
private int playerScore = 0;
|
||||
private float currentSpawnProbability;
|
||||
@@ -46,6 +50,12 @@ namespace Minigames.DivingForPictures
|
||||
public event Action<Monster> OnMonsterSpawned;
|
||||
public event Action<Monster, int> OnPictureTaken;
|
||||
public event Action<float> OnSpawnProbabilityChanged;
|
||||
public event Action OnGameOver;
|
||||
public event Action<int> OnRopeBroken; // Passes remaining ropes count
|
||||
|
||||
// Private state variables for rope system
|
||||
private int currentRopeIndex = 0;
|
||||
private bool isGameOver = false;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
@@ -64,6 +74,18 @@ namespace Minigames.DivingForPictures
|
||||
{
|
||||
Debug.LogWarning("No TrenchTileSpawner found in scene. Monster spawning won't work.");
|
||||
}
|
||||
|
||||
// Subscribe to player damage events
|
||||
PlayerCollisionBehavior.OnDamageTaken += OnPlayerDamageTaken;
|
||||
|
||||
// Validate rope references
|
||||
ValidateRopeReferences();
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
// Unsubscribe from events when the manager is destroyed
|
||||
PlayerCollisionBehavior.OnDamageTaken -= OnPlayerDamageTaken;
|
||||
}
|
||||
|
||||
private void Update()
|
||||
@@ -176,6 +198,127 @@ namespace Minigames.DivingForPictures
|
||||
monster.OnMonsterDespawned -= OnMonsterDespawned;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Called when the player takes damage from any collision
|
||||
/// </summary>
|
||||
private void OnPlayerDamageTaken()
|
||||
{
|
||||
if (isGameOver) return;
|
||||
|
||||
// Break the next rope in sequence
|
||||
BreakNextRope();
|
||||
|
||||
// Check if all ropes are broken
|
||||
if (currentRopeIndex >= playerRopes.Length)
|
||||
{
|
||||
TriggerGameOver();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Notify listeners about rope break and remaining ropes
|
||||
int remainingRopes = playerRopes.Length - currentRopeIndex;
|
||||
OnRopeBroken?.Invoke(remainingRopes);
|
||||
|
||||
Debug.Log($"[DivingGameManager] Rope broken! {remainingRopes} ropes remaining.");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Breaks the next available rope in the sequence
|
||||
/// </summary>
|
||||
private void BreakNextRope()
|
||||
{
|
||||
if (currentRopeIndex < playerRopes.Length)
|
||||
{
|
||||
RopeBreaker ropeToBreak = playerRopes[currentRopeIndex];
|
||||
|
||||
if (ropeToBreak != null)
|
||||
{
|
||||
// Let the RopeBreaker component handle the breaking, effects, and sounds
|
||||
ropeToBreak.BreakRope();
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning($"[DivingGameManager] Rope at index {currentRopeIndex} is null!");
|
||||
}
|
||||
|
||||
// Move to the next rope regardless if current was null
|
||||
currentRopeIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Manually break a rope (for testing or external events)
|
||||
/// </summary>
|
||||
public void ForceBreakRope()
|
||||
{
|
||||
if (!isGameOver)
|
||||
{
|
||||
OnPlayerDamageTaken();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Triggers game over state when all ropes are broken
|
||||
/// </summary>
|
||||
private void TriggerGameOver()
|
||||
{
|
||||
if (isGameOver) return;
|
||||
|
||||
isGameOver = true;
|
||||
Debug.Log("[DivingGameManager] Game Over! All ropes broken.");
|
||||
|
||||
// Fire game over event
|
||||
OnGameOver?.Invoke();
|
||||
|
||||
// Call the existing end game method
|
||||
EndGame();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Validates rope references and logs warnings if any are missing
|
||||
/// </summary>
|
||||
private void ValidateRopeReferences()
|
||||
{
|
||||
if (playerRopes == null || playerRopes.Length == 0)
|
||||
{
|
||||
Debug.LogWarning("[DivingGameManager] No ropes assigned to break! Damage system won't work properly.");
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < playerRopes.Length; i++)
|
||||
{
|
||||
if (playerRopes[i] == null)
|
||||
{
|
||||
Debug.LogWarning($"[DivingGameManager] Rope at index {i} is null!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Resets the rope system for a new game
|
||||
/// </summary>
|
||||
public void ResetRopeSystem()
|
||||
{
|
||||
// Reset rope state
|
||||
currentRopeIndex = 0;
|
||||
isGameOver = false;
|
||||
|
||||
// Restore all broken ropes
|
||||
if (playerRopes != null)
|
||||
{
|
||||
foreach (var rope in playerRopes)
|
||||
{
|
||||
if (rope != null)
|
||||
{
|
||||
rope.RestoreRope();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Debug.Log("[DivingGameManager] Rope system reset.");
|
||||
}
|
||||
|
||||
// Call this when the game ends
|
||||
public void EndGame()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user