Add rolemaster situational roll modifier backend
This commit is contained in:
@@ -62,6 +62,24 @@ public sealed class ServiceRolemasterRollTests
|
||||
Assert.Equal(73, die.SignedContribution);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RollSkill_RolemasterStandardSingleDie_AppliesSituationalModifier()
|
||||
{
|
||||
using var harness = ServiceTestSupport.CreateHarness(73);
|
||||
var service = harness.Service;
|
||||
|
||||
service.Register("gm-percentile-bonus", "Password123", "GM");
|
||||
var session = ServiceTestSupport.GetValue(service.Login("gm-percentile-bonus", "Password123")).SessionToken;
|
||||
var campaign = ServiceTestSupport.GetValue(service.CreateCampaign(session, "Rolemaster", "rolemaster"));
|
||||
var character = ServiceTestSupport.GetValue(service.CreateCharacter(session, "Hero", campaign.Id));
|
||||
var skill = ServiceTestSupport.GetValue(service.CreateSkill(session, character.Id, "Perception", "d100-15", 0, false));
|
||||
|
||||
var roll = ServiceTestSupport.GetValue(service.RollSkill(session, skill.Id, "public", 20));
|
||||
|
||||
Assert.Equal(78, roll.Result);
|
||||
Assert.Equal("73-15+20=78", roll.Breakdown);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RollSkill_RolemasterOpenEndedHigh_RecursesAndBuildsReadableLogSummary()
|
||||
{
|
||||
@@ -213,6 +231,28 @@ public sealed class ServiceRolemasterRollTests
|
||||
});
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RollSkill_RolemasterAutoRetry_UsesSituationalModifierInBothAttempts()
|
||||
{
|
||||
using var harness = ServiceTestSupport.CreateHarness(8, 42);
|
||||
var service = harness.Service;
|
||||
|
||||
service.Register("gm-retry-situational", "Password123", "GM");
|
||||
var session = ServiceTestSupport.GetValue(service.Login("gm-retry-situational", "Password123")).SessionToken;
|
||||
var campaign = ServiceTestSupport.GetValue(service.CreateCampaign(session, "Rolemaster Retry", "rolemaster"));
|
||||
var character = ServiceTestSupport.GetValue(service.CreateCharacter(session, "Hero", campaign.Id));
|
||||
var skill = ServiceTestSupport.GetValue(service.CreateSkill(session, character.Id, "Observation", "d100!+50", 0, false, null, 5, true));
|
||||
|
||||
var roll = ServiceTestSupport.GetValue(service.RollSkill(session, skill.Id, "public", 20));
|
||||
var logEntry = Assert.Single(ServiceTestSupport.GetValue(service.GetCampaignLogPage(session, campaign.Id, limit: 5)).Entries);
|
||||
|
||||
Assert.Equal(117, roll.Result);
|
||||
Assert.Equal("8+50+20=78; retry(+5): 42+50+20=112; final=117", roll.Breakdown);
|
||||
Assert.Equal("8 | open-ended | retry +5", logEntry.SummaryText);
|
||||
Assert.Equal(["rs5"], Assert.IsType<string[]>(logEntry.EventBadges));
|
||||
Assert.All(roll.Dice, die => Assert.True(die.Attempt is 1 or 2));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RollSkill_RolemasterAutoRetryPlusTen_UsesRetryResultAndMarksAttempts()
|
||||
{
|
||||
@@ -256,4 +296,22 @@ public sealed class ServiceRolemasterRollTests
|
||||
Assert.Null(logEntry.EventBadges);
|
||||
Assert.All(roll.Dice, die => Assert.Null(die.Attempt));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RollSkill_SituationalModifier_IsRejectedForNonRolemasterCampaigns()
|
||||
{
|
||||
using var harness = ServiceTestSupport.CreateHarness(12);
|
||||
var service = harness.Service;
|
||||
|
||||
service.Register("gm-non-rolemaster-modifier", "Password123", "GM");
|
||||
var session = ServiceTestSupport.GetValue(service.Login("gm-non-rolemaster-modifier", "Password123")).SessionToken;
|
||||
var campaign = ServiceTestSupport.GetValue(service.CreateCampaign(session, "DnD", "dnd5e"));
|
||||
var character = ServiceTestSupport.GetValue(service.CreateCharacter(session, "Hero", campaign.Id));
|
||||
var skill = ServiceTestSupport.GetValue(service.CreateSkill(session, character.Id, "Attack", "1d20+5", 0, false));
|
||||
|
||||
var roll = service.RollSkill(session, skill.Id, "public", 20);
|
||||
|
||||
Assert.False(roll.Succeeded);
|
||||
Assert.Equal("invalid_situational_modifier", roll.Error!.Code);
|
||||
}
|
||||
}
|
||||
@@ -18,8 +18,11 @@ public sealed class ServiceRollHelperTests
|
||||
{
|
||||
Assert.Equal("4+5+2=11", RollBreakdownFormatter.BuildBreakdown([4, 5], 2, 11));
|
||||
Assert.Equal("0=0", RollBreakdownFormatter.BuildBreakdown([], 0, 0));
|
||||
Assert.Equal("4+5+2+7=18", RollBreakdownFormatter.BuildRolemasterModifierBreakdown([4, 5], 2, 7, 18));
|
||||
Assert.Equal("97+96+45+85=323", RollBreakdownFormatter.BuildRolemasterOpenEndedBreakdown(97, [96, 45], false, 85, 323));
|
||||
Assert.Equal("8+50+20=78", RollBreakdownFormatter.BuildRolemasterOpenEndedBreakdown(8, [], false, 50, 78, 20));
|
||||
Assert.Equal("(05) -97 -100 -12 +85 = -124", RollBreakdownFormatter.BuildRolemasterOpenEndedBreakdown(5, [97, 100, 12], true, 85, -124));
|
||||
Assert.Equal("(05) -97 -100 -12 +85 +20 = -104", RollBreakdownFormatter.BuildRolemasterOpenEndedBreakdown(5, [97, 100, 12], true, 85, -104, 20));
|
||||
Assert.Equal("66+10=76; retry(+5): 42+10=52; final=57", RollBreakdownFormatter.BuildRolemasterRetryBreakdown("66+10=76", 5, "42+10=52", 57));
|
||||
Assert.Equal("05", RollBreakdownFormatter.FormatRolemasterTriggerRoll(5));
|
||||
}
|
||||
|
||||
@@ -142,7 +142,7 @@ public sealed class WorkspaceQueryServiceTests
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
|
||||
public ServiceResult<RollResult> RollSkill(string sessionToken, Guid skillId, string visibility)
|
||||
public ServiceResult<RollResult> RollSkill(string sessionToken, Guid skillId, string visibility, int situationalModifier = 0)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user