[Refactor] Final fix GameManager & GameController

This commit is contained in:
2026-03-04 07:20:42 +07:00
parent 3031d2e4c2
commit 3793686dcf
10 changed files with 47 additions and 81 deletions
+95
View File
@@ -0,0 +1,95 @@
using System;
using UnityEngine;
using VContainer;
using YachtDice.Categories;
using YachtDice.Scoring;
namespace YachtDice.Game
{
public class GameLoopController : MonoBehaviour
{
[Header("Settings")]
[SerializeField] private int maxRollsPerTurn = 3;
private DiceManager _diceManager;
private ScoringSystem _scoringSystem;
public int CurrentRoll { get; private set; }
public int CurrentTurn { get; private set; }
public int MaxRollsPerTurn => maxRollsPerTurn;
public bool CanRoll => CurrentRoll < maxRollsPerTurn && !_diceManager.IsAnyRolling;
public bool CanScore => CurrentRoll > 0 && !_diceManager.IsAnyRolling;
public bool IsGameOver => _scoringSystem.IsComplete;
public event Action<int> OnTurnStarted;
public event Action<int> OnRollComplete;
public event Action<CategoryDefinition, int> OnScored;
public event Action<int> OnGameOver;
[Inject]
public void Construct(DiceManager diceManager, ScoringSystem scoringSystem)
{
this._diceManager = diceManager;
this._scoringSystem = scoringSystem;
}
public void StartNewGame()
{
_scoringSystem.ResetScorecard();
CurrentTurn = 0;
StartNewTurn();
}
private void StartNewTurn()
{
CurrentTurn++;
CurrentRoll = 0;
_diceManager.UnlockAll();
OnTurnStarted?.Invoke(CurrentTurn);
}
public void Roll()
{
if (!CanRoll) return;
CurrentRoll++;
_diceManager.OnAllDiceSettled += HandleAllDiceSettled;
_diceManager.RollUnlocked();
}
private void HandleAllDiceSettled()
{
_diceManager.OnAllDiceSettled -= HandleAllDiceSettled;
OnRollComplete?.Invoke(CurrentRoll);
}
public void ToggleDiceLock(int index)
{
if (_diceManager.IsAnyRolling) return;
if (CurrentRoll == 0) return;
_diceManager.ToggleLock(index);
}
public void ScoreInCategory(CategoryDefinition category)
{
if (!CanScore) return;
if (_scoringSystem.IsCategoryUsed(category)) return;
var dice = _diceManager.GetDice();
var result = _scoringSystem.ScoreCategory(dice, category);
OnScored?.Invoke(category, result.FinalScore);
if (_scoringSystem.IsComplete)
{
var total = _scoringSystem.TotalScore;
OnGameOver?.Invoke(total);
}
else
{
StartNewTurn();
}
}
}
}