[Fix] ScoringSystem
This commit is contained in:
@@ -5,6 +5,7 @@ using UnityEngine;
|
|||||||
using VContainer;
|
using VContainer;
|
||||||
using YachtDice.Categories;
|
using YachtDice.Categories;
|
||||||
using YachtDice.Dice;
|
using YachtDice.Dice;
|
||||||
|
using YachtDice.Economy;
|
||||||
using YachtDice.Events;
|
using YachtDice.Events;
|
||||||
using YachtDice.Modifiers.Core;
|
using YachtDice.Modifiers.Core;
|
||||||
using YachtDice.Modifiers.Runtime;
|
using YachtDice.Modifiers.Runtime;
|
||||||
@@ -23,13 +24,19 @@ namespace YachtDice.Scoring
|
|||||||
private GameEventBus _eventBus;
|
private GameEventBus _eventBus;
|
||||||
private ModifierRegistry _modifierRegistry;
|
private ModifierRegistry _modifierRegistry;
|
||||||
private CategoryCatalog _catalog;
|
private CategoryCatalog _catalog;
|
||||||
|
private CurrencyBank _currencyBank;
|
||||||
|
|
||||||
[Inject]
|
[Inject]
|
||||||
public void Construct(GameEventBus eventBus, ModifierRegistry modifierRegistry, CategoryCatalog catalog)
|
public void Construct(
|
||||||
|
GameEventBus eventBus,
|
||||||
|
ModifierRegistry modifierRegistry,
|
||||||
|
CategoryCatalog catalog,
|
||||||
|
CurrencyBank currencyBank)
|
||||||
{
|
{
|
||||||
this._eventBus = eventBus;
|
this._eventBus = eventBus;
|
||||||
this._modifierRegistry = modifierRegistry;
|
this._modifierRegistry = modifierRegistry;
|
||||||
this._catalog = catalog;
|
this._catalog = catalog;
|
||||||
|
this._currencyBank = currencyBank;
|
||||||
}
|
}
|
||||||
|
|
||||||
public CategoryCatalog Catalog => _catalog;
|
public CategoryCatalog Catalog => _catalog;
|
||||||
@@ -109,6 +116,9 @@ namespace YachtDice.Scoring
|
|||||||
_scorecard[category] = finalScore;
|
_scorecard[category] = finalScore;
|
||||||
_usedCategories.Add(category);
|
_usedCategories.Add(category);
|
||||||
|
|
||||||
|
if (context.CurrencyDelta != 0 && _currencyBank != null)
|
||||||
|
_currencyBank.Add(context.CurrencyDelta);
|
||||||
|
|
||||||
OnCategoryScored?.Invoke(category, finalScore);
|
OnCategoryScored?.Invoke(category, finalScore);
|
||||||
OnCategoryConfirmed?.Invoke(category, result);
|
OnCategoryConfirmed?.Invoke(category, result);
|
||||||
|
|
||||||
@@ -147,6 +157,9 @@ namespace YachtDice.Scoring
|
|||||||
_scorecard[category] = finalScore;
|
_scorecard[category] = finalScore;
|
||||||
_usedCategories.Add(category);
|
_usedCategories.Add(category);
|
||||||
|
|
||||||
|
if (context != null && context.CurrencyDelta != 0 && _currencyBank != null)
|
||||||
|
_currencyBank.Add(context.CurrencyDelta);
|
||||||
|
|
||||||
OnCategoryScored?.Invoke(category, finalScore);
|
OnCategoryScored?.Invoke(category, finalScore);
|
||||||
OnCategoryConfirmed?.Invoke(category, result);
|
OnCategoryConfirmed?.Invoke(category, result);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,123 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using UnityEngine;
|
||||||
|
using YachtDice.Categories;
|
||||||
|
using YachtDice.Dice;
|
||||||
|
using YachtDice.Economy;
|
||||||
|
using YachtDice.Events;
|
||||||
|
using YachtDice.Modifiers.Core;
|
||||||
|
using YachtDice.Modifiers.Definition;
|
||||||
|
using YachtDice.Modifiers.Effects;
|
||||||
|
using YachtDice.Modifiers.Pipeline;
|
||||||
|
using YachtDice.Modifiers.Runtime;
|
||||||
|
using YachtDice.Scoring;
|
||||||
|
|
||||||
|
namespace YachtDice.Tests
|
||||||
|
{
|
||||||
|
public class ScoringCurrencyIntegrationTests
|
||||||
|
{
|
||||||
|
private readonly List<Object> _createdAssets = new();
|
||||||
|
|
||||||
|
private CategoryDefinition _onesCategory;
|
||||||
|
private CategoryCatalog _catalog;
|
||||||
|
private DiceDefinition _standardDice;
|
||||||
|
private ModifierRegistry _registry;
|
||||||
|
private GameEventBus _eventBus;
|
||||||
|
private CurrencyBank _currencyBank;
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
public void SetUp()
|
||||||
|
{
|
||||||
|
_standardDice = DiceDefinition.CreateForTest<StandardDice>("d6", "d6");
|
||||||
|
_onesCategory = SumOfValueCategory.CreateForTest("ones", "Единицы", 1);
|
||||||
|
_catalog = CategoryCatalog.CreateForTest(new List<CategoryDefinition> { _onesCategory });
|
||||||
|
|
||||||
|
_createdAssets.Add(_standardDice);
|
||||||
|
_createdAssets.Add(_onesCategory);
|
||||||
|
_createdAssets.Add(_catalog);
|
||||||
|
|
||||||
|
_registry = new ModifierRegistry(5);
|
||||||
|
var pipeline = new ModifierPipeline(_registry)
|
||||||
|
{
|
||||||
|
TracingEnabled = false,
|
||||||
|
};
|
||||||
|
_eventBus = new GameEventBus(pipeline);
|
||||||
|
|
||||||
|
var bankGo = new GameObject("CurrencyBank");
|
||||||
|
_currencyBank = bankGo.AddComponent<CurrencyBank>();
|
||||||
|
_currencyBank.SetBalance(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
[TearDown]
|
||||||
|
public void TearDown()
|
||||||
|
{
|
||||||
|
foreach (var scoring in Object.FindObjectsByType<ScoringSystem>(FindObjectsSortMode.None))
|
||||||
|
Object.DestroyImmediate(scoring.gameObject);
|
||||||
|
|
||||||
|
foreach (var bank in Object.FindObjectsByType<CurrencyBank>(FindObjectsSortMode.None))
|
||||||
|
Object.DestroyImmediate(bank.gameObject);
|
||||||
|
|
||||||
|
for (var i = 0; i < _createdAssets.Count; i++)
|
||||||
|
{
|
||||||
|
if (_createdAssets[i] != null)
|
||||||
|
Object.DestroyImmediate(_createdAssets[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
_createdAssets.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void ScoreCategory_WithCurrencyModifier_AddsCurrencyAndFiresBalanceChanged()
|
||||||
|
{
|
||||||
|
var system = CreateScoringSystem();
|
||||||
|
RegisterCurrencyModifier("bonus-money", 25);
|
||||||
|
|
||||||
|
var balanceChanged = false;
|
||||||
|
var newBalance = 0;
|
||||||
|
_currencyBank.OnBalanceChanged += value =>
|
||||||
|
{
|
||||||
|
balanceChanged = true;
|
||||||
|
newBalance = value;
|
||||||
|
};
|
||||||
|
|
||||||
|
system.ScoreCategory(CreateDice(1, 1, 2, 3, 4), _onesCategory);
|
||||||
|
|
||||||
|
Assert.AreEqual(125, _currencyBank.Balance);
|
||||||
|
Assert.IsTrue(balanceChanged);
|
||||||
|
Assert.AreEqual(125, newBalance);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ScoringSystem CreateScoringSystem()
|
||||||
|
{
|
||||||
|
var go = new GameObject("ScoringSystem");
|
||||||
|
var system = go.AddComponent<ScoringSystem>();
|
||||||
|
system.Construct(_eventBus, _registry, _catalog, _currencyBank);
|
||||||
|
return system;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IReadOnlyList<IDice> CreateDice(params int[] values)
|
||||||
|
{
|
||||||
|
var dice = new DiceInstance[values.Length];
|
||||||
|
for (var i = 0; i < values.Length; i++)
|
||||||
|
dice[i] = new DiceInstance(_standardDice, values[i]);
|
||||||
|
return dice;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RegisterCurrencyModifier(string id, int amount)
|
||||||
|
{
|
||||||
|
var effect = AddCurrencyEffect.CreateForTest(amount, ModifierPhase.SideEffect);
|
||||||
|
var behavior = ModifierBehavior.CreateForTest(
|
||||||
|
TriggerType.OnCategoryScored,
|
||||||
|
null,
|
||||||
|
new List<Effect> { effect });
|
||||||
|
var definition = ModifierDefinition.CreateForTest(id, new List<ModifierBehavior> { behavior });
|
||||||
|
|
||||||
|
_createdAssets.Add(effect);
|
||||||
|
_createdAssets.Add(behavior);
|
||||||
|
_createdAssets.Add(definition);
|
||||||
|
|
||||||
|
var instance = _registry.Add(definition);
|
||||||
|
_registry.TryActivate(instance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b3d6ef3d50944f1da5dcf1276f8a277d
|
||||||
Reference in New Issue
Block a user