[Add] Game Loop Playable

This commit is contained in:
2026-03-28 12:53:34 +07:00
parent 78ad76120f
commit f2173d2c73
20 changed files with 1433 additions and 122 deletions
@@ -53,7 +53,7 @@ namespace YachtDice.Tests
}
[Test]
public void StartNewRun_EntersShopWithConfigQuota()
public void StartNewRun_StartsFirstStageWithoutShop()
{
var categories = CreateFixedCatalog(100, 100, 100);
var service = CreateService(categories);
@@ -62,8 +62,10 @@ namespace YachtDice.Tests
Assert.AreEqual(30, service.State.BaseQuota);
Assert.AreEqual(1, service.State.BetIndex);
Assert.AreEqual(RunPhase.Shop, service.State.Phase);
Assert.AreEqual(RunPhase.StageStart, service.State.Phase);
Assert.AreEqual(0, service.State.StoredRolls);
Assert.AreEqual(0, _currencyBank.Balance);
Assert.IsFalse(service.State.IsShopAvailable);
}
[Test]
@@ -73,7 +75,6 @@ namespace YachtDice.Tests
var service = CreateService(categories);
service.StartNewRun();
service.CompleteShop();
service.TryBeginRoll();
service.NotifyRollResolved(_emptyDice);
@@ -84,6 +85,41 @@ namespace YachtDice.Tests
Assert.AreEqual(2, service.State.StoredRolls);
Assert.AreEqual(2, service.State.StageNumber);
Assert.AreEqual(RunPhase.StageStart, service.State.Phase);
Assert.IsTrue(service.State.IsShopAvailable);
}
[Test]
public void CategoryCanBeScored_WithZeroResultAfterFirstRoll()
{
var categories = CreateFixedCatalog(0, 100, 100);
var service = CreateService(categories);
service.StartNewRun();
service.TryBeginRoll();
service.NotifyRollResolved(_emptyDice);
Assert.IsTrue(service.CanScoreCategory(_emptyDice, categories.All[0]));
Assert.IsTrue(service.TryScoreCategoryAsync(_emptyDice, categories.All[0]).GetAwaiter().GetResult());
Assert.AreEqual(30, service.State.CurrentStageTarget);
Assert.AreEqual(1, service.State.StageNumber);
Assert.AreEqual(RunPhase.StageStart, service.State.Phase);
}
[Test]
public void TargetDecreasesByRecordedScore_AndStageContinues()
{
var categories = CreateFixedCatalog(5, 100, 100);
var service = CreateService(categories);
service.StartNewRun();
service.TryBeginRoll();
service.NotifyRollResolved(_emptyDice);
Assert.IsTrue(service.TryScoreCategoryAsync(_emptyDice, categories.All[0]).GetAwaiter().GetResult());
Assert.AreEqual(25, service.State.CurrentStageTarget);
Assert.AreEqual(1, service.State.StageNumber);
Assert.AreEqual(RunPhase.StageStart, service.State.Phase);
}
[Test]
@@ -93,7 +129,6 @@ namespace YachtDice.Tests
var service = CreateService(categories);
service.StartNewRun();
service.CompleteShop();
service.TryBeginRoll();
service.NotifyRollResolved(_emptyDice);
service.TryScoreCategoryAsync(_emptyDice, categories.All[0]).GetAwaiter().GetResult();
@@ -117,8 +152,6 @@ namespace YachtDice.Tests
var service = CreateService(categories);
service.StartNewRun();
service.CompleteShop();
ClearStageInOneRoll(service, categories.All[0]);
ClearStageInOneRoll(service, categories.All[1]);
ClearStageInOneRoll(service, categories.All[2]);
@@ -126,9 +159,10 @@ namespace YachtDice.Tests
Assert.AreEqual(135, _currencyBank.Balance);
Assert.AreEqual(60, service.State.BaseQuota);
Assert.AreEqual(2, service.State.BetIndex);
Assert.AreEqual(RunPhase.Shop, service.State.Phase);
Assert.AreEqual(RunPhase.StageStart, service.State.Phase);
Assert.AreEqual(6, service.State.StoredRolls);
Assert.AreEqual(0, _scoringSystem.CategoriesFilledCount);
Assert.IsTrue(service.State.IsShopAvailable);
}
[Test]
@@ -138,37 +172,56 @@ namespace YachtDice.Tests
var service = CreateService(categories);
service.StartNewRun();
service.CompleteShop();
Assert.IsTrue(service.TryBeginRoll());
service.NotifyRollResolved(_emptyDice);
for (var i = 0; i < 3; i++)
{
Assert.IsTrue(service.TryBeginRoll());
service.NotifyRollResolved(_emptyDice);
}
Assert.IsTrue(service.State.IsFailed);
Assert.AreEqual(RunPhase.RunFailed, service.State.Phase);
Assert.IsFalse(service.State.IsFailed);
Assert.AreEqual(RunPhase.CategorySelection, service.State.Phase);
}
[Test]
public void Shop_ReopensOnlyAtStartOfNextBet()
public void ShopUnlocksAfterFirstClear_AndClosesAfterFirstRoll()
{
var categories = CreateFixedCatalog(100, 100, 100, 100);
var service = CreateService(categories);
service.StartNewRun();
Assert.AreEqual(RunPhase.Shop, service.State.Phase);
Assert.IsFalse(service.State.IsShopAvailable);
service.CompleteShop();
ClearStageInOneRoll(service, categories.All[0]);
Assert.IsTrue(service.State.IsShopAvailable);
Assert.AreEqual(RunPhase.StageStart, service.State.Phase);
ClearStageInOneRoll(service, categories.All[1]);
Assert.AreEqual(RunPhase.StageStart, service.State.Phase);
Assert.IsTrue(service.TryBeginRoll());
Assert.IsFalse(service.State.IsShopAvailable);
service.NotifyRollResolved(_emptyDice);
Assert.IsTrue(service.TryScoreCategoryAsync(_emptyDice, categories.All[1]).GetAwaiter().GetResult());
Assert.IsTrue(service.State.IsShopAvailable);
ClearStageInOneRoll(service, categories.All[2]);
Assert.AreEqual(RunPhase.Shop, service.State.Phase);
Assert.AreEqual(RunPhase.StageStart, service.State.Phase);
Assert.AreEqual(2, service.State.BetIndex);
Assert.IsTrue(service.State.IsShopAvailable);
}
[Test]
public void CanBeginRoll_BecomesFalse_WhenNoRollsOrStoredRollsRemain()
{
var categories = CreateFixedCatalog(100, 100, 100, 100);
var service = CreateService(categories);
service.StartNewRun();
Assert.IsTrue(service.TryBeginRoll());
service.NotifyRollResolved(_emptyDice);
Assert.IsTrue(service.TryBeginRoll());
service.NotifyRollResolved(_emptyDice);
Assert.IsTrue(service.TryBeginRoll());
service.NotifyRollResolved(_emptyDice);
Assert.IsFalse(service.CanBeginRoll());
Assert.AreEqual(RunPhase.CategorySelection, service.State.Phase);
}
private RunLoopService CreateService(CategoryCatalog catalog)