MiniGames/Assets/Scripts/ClawGrab/ClawScoreManager.cs

147 lines
4.8 KiB
C#

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
public class ClawScoreManager : MonoBehaviour
{
public static ClawScoreManager Instance;
// at the top with other events
public event Action<int> OnScoreChanged; // passes TOTAL score
// expose total score
public int CurrentScore => score;
[Header("Scoring")]
public int wolfPoints = 100;
public int goldenWolfJackpot = 1000;
public int starPoints = 50;
public int comboBonus = 300;
public int starSuperBonus = 500;
[Header("Multipliers")]
public float crystalNextGrabMultiplier = 2f;
private bool crystalPrimed = false;
[Header("Timers & Effects")]
public float addTimeSeconds = 5f; // Sand Dial
public float slowDuration = 5f; // Clock
public float turboDuration = 5f; // Turbo
public float freezeDuration = 2f; // Freeze
public float bombDisableSeconds = 3f; // Bomb
public float shockJamSeconds = 2f; // Shock
// Events others can subscribe to
public event Action<int> OnScoreAdded;
public event Action<float> OnTimeAdded;
public event Action<float> OnPlatformSlow; // pass duration
public event Action<float> OnPlatformTurbo; // pass duration
public event Action<float> OnPlatformFreeze; // pass duration
public event Action<float> OnClawDisabled; // pass duration
public event Action<float> OnClawJam; // pass duration
public event Action<ClawBubbleType[]> OnComboAchieved;
private int score = 0;
private readonly Queue<ClawBubbleType> comboQueue = new Queue<ClawBubbleType>();
private readonly Queue<ClawBubbleType> starQueue = new Queue<ClawBubbleType>();
void Awake() { Instance = this; }
public void EvaluateBubble(ClawBubbleType type)
{
Debug.Log("EvaluateBubble: "+type.ToString());
int points = 0;
switch (type)
{
case ClawBubbleType.Wolf:
points += wolfPoints;
EnqueueCombo(type, comboQueue, 3, () =>
{
AddScore(comboBonus);
OnComboAchieved?.Invoke(new[] { ClawBubbleType.Wolf, ClawBubbleType.Wolf, ClawBubbleType.Wolf });
});
break;
case ClawBubbleType.GoldenWolf:
points += goldenWolfJackpot;
break;
case ClawBubbleType.Star:
points += starPoints;
EnqueueCombo(ClawBubbleType.Star, starQueue, 3, () =>
{
AddScore(starSuperBonus);
OnComboAchieved?.Invoke(new[] { ClawBubbleType.Star, ClawBubbleType.Star, ClawBubbleType.Star });
});
break;
case ClawBubbleType.Crystal:
// primes next-grab multiplier
crystalPrimed = true;
break;
case ClawBubbleType.Time:
OnTimeAdded?.Invoke(addTimeSeconds);
Debug.Log("TimeAdded Function");
break;
case ClawBubbleType.Freeze:
OnPlatformFreeze?.Invoke(freezeDuration);
break;
case ClawBubbleType.Turbo:
OnPlatformTurbo?.Invoke(turboDuration);
break;
case ClawBubbleType.Bomb:
OnClawDisabled?.Invoke(bombDisableSeconds);
OnPlatformTurbo?.Invoke(turboDuration);
break;
case ClawBubbleType.Shock:
OnClawJam?.Invoke(shockJamSeconds);
break;
}
// Apply crystal multiplier if primed (and we actually scored)
if (crystalPrimed && points > 0)
{
points = Mathf.RoundToInt(points * crystalNextGrabMultiplier);
crystalPrimed = false;
}
if (points > 0) AddScore(points);
// Tell spawner to introduce new targets
if (ClawBubbleSpawner.Instance)
ClawBubbleSpawner.Instance.NotifyBubbleGrabbed(type);
}
private void AddScore(int amount)
{
score += amount;
OnScoreAdded?.Invoke(amount); // delta (already in your code)
OnScoreChanged?.Invoke(score); // total (new)
// TODO: update UI here if you have a reference
}
private void EnqueueCombo(ClawBubbleType t, Queue<ClawBubbleType> q, int target, Action onCombo)
{
q.Enqueue(t);
while (q.Count > target) q.Dequeue();
if (q.Count == target)
{
// check if all same
var arr = q.ToArray();
bool allSame = true;
for (int i = 1; i < arr.Length; i++)
if (arr[i] != arr[0]) { allSame = false; break; }
if (allSame) onCombo?.Invoke();
}
}
}