From 50be9ad273e9ebe47adc568b6cd5f12bdb9f1989 Mon Sep 17 00:00:00 2001 From: iisaev Date: Sat, 24 Oct 2026 10:01:15 +0200 Subject: [PATCH] Stat checks: check command with stat roll outcomes and its schema Co-Authored-By: Claude Opus 5.5 --- .gitattributes | 30 +++++++++ .gitignore | 37 +++++++++++ locale/en.properties | 17 ++++++ locale/es.properties | 17 ++++++ locale/ja.properties | 17 ++++++ locale/ko.properties | 17 ++++++ locale/ru.properties | 17 ++++++ locale/vi.properties | 17 ++++++ locale/zh.properties | 17 ++++++ manifest.json | 18 ++++++ mod.jpg | Bin 0 -> 74584 bytes schemas/stat_checks.json | 56 +++++++++++++++++ src/CheckCommandStrategy.cs | 95 +++++++++++++++++++++++++++++ src/DiceRoll.cs | 50 +++++++++++++++ src/StatCheck.cs | 53 ++++++++++++++++ tests/CheckCommandStrategyTests.cs | 56 +++++++++++++++++ tests/DiceRollTests.cs | 38 ++++++++++++ tests/StatCheckTests.cs | 37 +++++++++++ 18 files changed, 589 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 locale/en.properties create mode 100644 locale/es.properties create mode 100644 locale/ja.properties create mode 100644 locale/ko.properties create mode 100644 locale/ru.properties create mode 100644 locale/vi.properties create mode 100644 locale/zh.properties create mode 100644 manifest.json create mode 100644 mod.jpg create mode 100644 schemas/stat_checks.json create mode 100644 src/CheckCommandStrategy.cs create mode 100644 src/DiceRoll.cs create mode 100644 src/StatCheck.cs create mode 100644 tests/CheckCommandStrategyTests.cs create mode 100644 tests/DiceRollTests.cs create mode 100644 tests/StatCheckTests.cs diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..3030c1a --- /dev/null +++ b/.gitattributes @@ -0,0 +1,30 @@ +# Line endings: LF everywhere, on every OS, whatever core.autocrlf says. +* text=auto eol=lf + +# cmd.exe misreads labels and goto in LF batch files, so they stay CRLF. +*.bat text eol=crlf +*.cmd text eol=crlf + +# Binaries: never converted, never diffed as text. +*.png binary +*.jpg binary +*.jpeg binary +*.webp binary +*.svg text +*.ogg binary +*.wav binary +*.mp3 binary +*.ttf binary +*.otf binary +*.woff binary +*.woff2 binary +*.dll binary +*.so binary +*.dylib binary +*.pdb binary +*.exe binary +*.zip binary +*.pck binary +*.moc3 binary +*.res binary +*.scn binary diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c301ca8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +# Godot 4.x +.godot/ +.idea/ +sdk/ +bin/ +obj/ + +#ai +.omo/ +.opencode/ + +gen/ +obj/ +bin/ + +*.tres~ +*.tscn~ + +# GDScript LSP +.godot/ + +# Export +*.exe +*.dmg +*.apk +*.aab +*.pck +*.zip +*.log + +# OS +.DS_Store +Thumbs.db + +# Editor +*.import +*.godot.uid diff --git a/locale/en.properties b/locale/en.properties new file mode 100644 index 0000000..9e8c0a7 --- /dev/null +++ b/locale/en.properties @@ -0,0 +1,17 @@ +mod_stat_checks_name = Stat Checks +mod_stat_checks_desc = Stat checks in any scenario: “check cha 12 -> :success” rolls a stat plus dice against a difficulty, shows the outcome line and branches the story — talking a guard round in a novel, forcing a door in an RPG. The roll stays in dialog variables for lines of your own. Dice default to the game setting checks.dice, else d20; dice=none makes a plain threshold. +checks/line = [${check_stat}: ${check_total} vs ${check_dc}] ${check_result} +checks/success = Success +checks/failure = Failure +checks/schema/checks/check = Stat check +checks/schema/checks/check_desc = Stat + dice + bonus against a difficulty: a line with the outcome and a jump +checks/schema/checks/arrow_success = On success, go to +checks/schema/field/stat = Stat +checks/schema/field/difficulty = Difficulty +checks/schema/field/who = Who +checks/schema/field/dice = Dice +checks/schema/checks/dice_desc = d20, 2d6, none — without dice the check is a threshold +checks/schema/field/bonus = Bonus +checks/schema/field/else = Else label +checks/schema/field/quiet = Quiet +checks/schema/checks/quiet_desc = Do not show the roll line diff --git a/locale/es.properties b/locale/es.properties new file mode 100644 index 0000000..a661192 --- /dev/null +++ b/locale/es.properties @@ -0,0 +1,17 @@ +mod_stat_checks_name = Tiradas de característica +mod_stat_checks_desc = Tiradas de característica en cualquier escenario: «check cha 12 -> :éxito» tira una estadística más dados contra una dificultad, muestra la línea con el resultado y ramifica la historia: convencer a un guardia en una novela, forzar una puerta en un RPG. La tirada queda en variables del diálogo para tus propias líneas. Los dados por defecto son el ajuste checks.dice, si no d20; dice=none es un umbral simple. +checks/line = [${check_stat}: ${check_total} contra ${check_dc}] ${check_result} +checks/success = Éxito +checks/failure = Fallo +checks/schema/checks/check = Tirada de característica +checks/schema/checks/check_desc = Estadística + dados + bonificación contra una dificultad: una línea con el resultado y un salto +checks/schema/checks/arrow_success = Si hay éxito, ir a +checks/schema/field/stat = Estadística +checks/schema/field/difficulty = Dificultad +checks/schema/field/who = Quién +checks/schema/field/dice = Dados +checks/schema/checks/dice_desc = d20, 2d6, none: sin dados la tirada es un umbral +checks/schema/field/bonus = Bonificación +checks/schema/field/else = Etiqueta si no +checks/schema/field/quiet = Silencioso +checks/schema/checks/quiet_desc = No mostrar la línea de la tirada diff --git a/locale/ja.properties b/locale/ja.properties new file mode 100644 index 0000000..aaf9850 --- /dev/null +++ b/locale/ja.properties @@ -0,0 +1,17 @@ +mod_stat_checks_name = 能力値判定 +mod_stat_checks_desc = どのシナリオでも使える能力値判定:「check cha 12 -> :成功」はステータスとダイスを難易度と比べ、結果の行を出して物語を分岐させる——ノベルで門番を説得し、RPG で扉をこじ開ける。出目は会話変数に残り、自分の行で使える。ダイスの既定はゲーム設定 checks.dice、なければ d20。dice=none なら単純なしきい値。 +checks/line = [${check_stat}:${check_total} 対 ${check_dc}] ${check_result} +checks/success = 成功 +checks/failure = 失敗 +checks/schema/checks/check = 能力値判定 +checks/schema/checks/check_desc = ステータス + ダイス + ボーナス 対 難易度:結果の行とジャンプ +checks/schema/checks/arrow_success = 成功時のラベル +checks/schema/field/stat = ステータス +checks/schema/field/difficulty = 難易度 +checks/schema/field/who = 誰 +checks/schema/field/dice = ダイス +checks/schema/checks/dice_desc = d20、2d6、none——ダイスなしなら判定はしきい値 +checks/schema/field/bonus = ボーナス +checks/schema/field/else = それ以外のラベル +checks/schema/field/quiet = 結果を表示しない +checks/schema/checks/quiet_desc = ダイスの行を表示しない diff --git a/locale/ko.properties b/locale/ko.properties new file mode 100644 index 0000000..cdd02ef --- /dev/null +++ b/locale/ko.properties @@ -0,0 +1,17 @@ +mod_stat_checks_name = 능력치 판정 +mod_stat_checks_desc = 모든 시나리오에서 쓰는 능력치 판정: “check cha 12 -> :성공”은 능력치와 주사위를 난이도와 겨루고, 결과 줄을 보여 주며 이야기를 갈래로 나눕니다 — 노벨에서 경비병 설득, RPG에서 문 부수기. 굴림 결과는 대화 변수에 남아 직접 쓴 줄에 쓸 수 있습니다. 주사위 기본값은 게임 설정 checks.dice, 없으면 d20. dice=none은 단순 기준값. +checks/line = [${check_stat}: ${check_total} 대 ${check_dc}] ${check_result} +checks/success = 성공 +checks/failure = 실패 +checks/schema/checks/check = 능력치 판정 +checks/schema/checks/check_desc = 능력치 + 주사위 + 보너스 대 난이도: 결과 줄과 이동 +checks/schema/checks/arrow_success = 성공 시 이동 +checks/schema/field/stat = 능력치 +checks/schema/field/difficulty = 난이도 +checks/schema/field/who = 누구 +checks/schema/field/dice = 주사위 +checks/schema/checks/dice_desc = d20, 2d6, none — 주사위가 없으면 판정은 기준값 +checks/schema/field/bonus = 보너스 +checks/schema/field/else = 아니면 라벨 +checks/schema/field/quiet = 결과 숨김 +checks/schema/checks/quiet_desc = 굴림 줄을 표시하지 않음 diff --git a/locale/ru.properties b/locale/ru.properties new file mode 100644 index 0000000..6ac7ed9 --- /dev/null +++ b/locale/ru.properties @@ -0,0 +1,17 @@ +mod_stat_checks_name = Проверки характеристик +mod_stat_checks_desc = Проверки характеристик в любом сценарии: «check cha 12 -> :успех» бросает стат плюс кубики против сложности, показывает строку с исходом и ветвит историю — уговорить стражника в новелле, выбить дверь в RPG. Бросок остаётся в переменных диалога для своих строк. Кубики по умолчанию — настройка игры checks.dice, иначе d20; dice=none — простой порог. +checks/line = [${check_stat}: ${check_total} против ${check_dc}] ${check_result} +checks/success = Успех +checks/failure = Провал +checks/schema/checks/check = Проверка характеристики +checks/schema/checks/check_desc = Стат + кубики + бонус против сложности: строка с исходом и переход +checks/schema/checks/arrow_success = При успехе — метка +checks/schema/field/stat = Стат +checks/schema/field/difficulty = Сложность +checks/schema/field/who = Кто +checks/schema/field/dice = Кубики +checks/schema/checks/dice_desc = d20, 2d6, none — без кубиков проверка становится порогом +checks/schema/field/bonus = Бонус +checks/schema/field/else = Иначе — метка +checks/schema/field/quiet = Без строки исхода +checks/schema/checks/quiet_desc = Не показывать строку с броском diff --git a/locale/vi.properties b/locale/vi.properties new file mode 100644 index 0000000..6d114f9 --- /dev/null +++ b/locale/vi.properties @@ -0,0 +1,17 @@ +mod_stat_checks_name = Kiểm tra chỉ số +mod_stat_checks_desc = Kiểm tra chỉ số trong mọi kịch bản: «check cha 12 -> :thành_công» tung chỉ số cộng xúc xắc so với độ khó, hiện dòng kết quả và rẽ nhánh câu chuyện — thuyết phục lính gác trong tiểu thuyết, phá cửa trong RPG. Kết quả tung còn lại trong biến hội thoại cho dòng của riêng bạn. Xúc xắc mặc định theo cài đặt checks.dice, không thì d20; dice=none là ngưỡng đơn giản. +checks/line = [${check_stat}: ${check_total} so với ${check_dc}] ${check_result} +checks/success = Thành công +checks/failure = Thất bại +checks/schema/checks/check = Kiểm tra chỉ số +checks/schema/checks/check_desc = Chỉ số + xúc xắc + thưởng so với độ khó: một dòng kết quả và bước nhảy +checks/schema/checks/arrow_success = Khi thành công, đến +checks/schema/field/stat = Chỉ số +checks/schema/field/difficulty = Độ khó +checks/schema/field/who = Ai +checks/schema/field/dice = Xúc xắc +checks/schema/checks/dice_desc = d20, 2d6, none — không xúc xắc thì kiểm tra là ngưỡng +checks/schema/field/bonus = Thưởng +checks/schema/field/else = Nhãn nếu không +checks/schema/field/quiet = Không hiện kết quả +checks/schema/checks/quiet_desc = Không hiện dòng tung xúc xắc diff --git a/locale/zh.properties b/locale/zh.properties new file mode 100644 index 0000000..ff7c243 --- /dev/null +++ b/locale/zh.properties @@ -0,0 +1,17 @@ +mod_stat_checks_name = 属性检定 +mod_stat_checks_desc = 任何剧本中的属性检定:“check cha 12 -> :成功”用属性加骰子对抗难度,显示结果行并让故事分支——在小说里说服守卫,在 RPG 里撬开门。掷骰结果留在对话变量里,供你自己的台词使用。骰子默认取游戏设置 checks.dice,否则为 d20;dice=none 即简单门槛。 +checks/line = [${check_stat}:${check_total} 对 ${check_dc}] ${check_result} +checks/success = 成功 +checks/failure = 失败 +checks/schema/checks/check = 属性检定 +checks/schema/checks/check_desc = 属性 + 骰子 + 加成对抗难度:显示结果并跳转 +checks/schema/checks/arrow_success = 成功时跳转 +checks/schema/field/stat = 属性 +checks/schema/field/difficulty = 难度 +checks/schema/field/who = 谁 +checks/schema/field/dice = 骰子 +checks/schema/checks/dice_desc = d20、2d6、none——没有骰子时检定就是门槛 +checks/schema/field/bonus = 加成 +checks/schema/field/else = 否则跳转 +checks/schema/field/quiet = 不显示结果 +checks/schema/checks/quiet_desc = 不显示掷骰行 diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..766c1eb --- /dev/null +++ b/manifest.json @@ -0,0 +1,18 @@ +{ + "id": "stat_checks", + "name": "Stat Checks", + "version": "1.0.0", + "author": "ct", + "description": "Stat checks for any scenario: `check cha 12 [dice=d20] [bonus=2] [else=label] -> :success` rolls a stat plus dice against a difficulty, shows the outcome line and branches (a novel's persuasion, a tile RPG's locked door). The roll is left in dialog variables (check_total, check_roll, …) for ptext lines. Dice default to the game setting checks.dice, else d20; dice=none makes a plain threshold. The conditional jump `when` and option conditions live in dialog_base.", + "category": "gameplay", + "sources": [ + "src/**/*.cs" + ], + "test_sources": [ + "tests/*.cs" + ], + "depends": [ + "stats_base>=1", + "dialog_base>=1" + ] +} diff --git a/mod.jpg b/mod.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fd4078ea8edb55b4fcefc4cb9b37e6ccad0b666d GIT binary patch literal 74584 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 literal 0 HcmV?d00001 diff --git a/schemas/stat_checks.json b/schemas/stat_checks.json new file mode 100644 index 0000000..933f45f --- /dev/null +++ b/schemas/stat_checks.json @@ -0,0 +1,56 @@ +{ + "Commands": [ + { + "Id": "check", + "Name": "checks/schema/checks/check", + "Description": "checks/schema/checks/check_desc", + "Category": "flow", + "Arrow": "checks/schema/checks/arrow_success", + "Positional": [ + { + "Key": "stat", + "Type": "ref", + "Kind": "stat", + "Required": true, + "Name": "checks/schema/field/stat" + }, + { + "Key": "difficulty", + "Type": "int", + "Required": true, + "Name": "checks/schema/field/difficulty" + } + ], + "Params": [ + { + "Key": "who", + "Type": "who", + "Name": "checks/schema/field/who" + }, + { + "Key": "dice", + "Type": "text", + "Default": "d20", + "Name": "checks/schema/field/dice", + "Description": "checks/schema/checks/dice_desc" + }, + { + "Key": "bonus", + "Type": "int", + "Name": "checks/schema/field/bonus" + }, + { + "Key": "else", + "Type": "label", + "Name": "checks/schema/field/else" + }, + { + "Key": "quiet", + "Type": "bool", + "Name": "checks/schema/field/quiet", + "Description": "checks/schema/checks/quiet_desc" + } + ] + } + ] +} diff --git a/src/CheckCommandStrategy.cs b/src/CheckCommandStrategy.cs new file mode 100644 index 0000000..d20ef28 --- /dev/null +++ b/src/CheckCommandStrategy.cs @@ -0,0 +1,95 @@ +namespace Cthangover.Mods.StatChecks +{ + using System.Collections.Generic; + using System.Globalization; + using Cthangover.Core.Games; + using Cthangover.Core.Localization; + using Cthangover.Mods.Dialog; + using Cthangover.Mods.Dialog.Scenarios; + using Cthangover.Mods.Stats; + using Godot; + + /// + /// The DSL command of a stat check: + /// check cha 12 [who=player] [dice=d20] [bonus=2] [else=fail] [quiet=1] -> :success + /// rolls stat + dice + bonus against the difficulty, shows one line with the outcome + /// ("[Charisma 15 / 12] Success") unless quiet, and jumps to the arrow label on + /// success, to else on failure (or goes on with the next line). + /// + /// The same check serves a visual novel ("persuade the guard"), a tile RPG ("force the + /// rusty door") and any other game with stats: the command only knows the stats + /// facade. The dice default is the game's setting checks.dice, else d20; + /// dice=none makes it a plain threshold. After the line the dialog variables + /// check_value, check_roll, check_bonus, check_total, + /// check_dc, check_stat and check_result hold the roll for + /// ptext lines that want to tell it their own way. + /// + public class CheckCommandStrategy : IScenarioCommandStrategy, IScenarioCommandSpec + { + /// Default line when the game has no checks/line translation. + public const string DefaultLine = "[${check_stat} ${check_total} / ${check_dc}] ${check_result}"; + + /// + public string Command => "check"; + + /// + public int MinPositional => 2; + + /// + public int MaxPositional => 2; + + /// + public IReadOnlyList AllowedNamed => new[] { "who", "dice", "bonus", "else", "quiet" }; + + /// + public string JumpTargetNamedKey => "else"; + + /// + public void Execute(DialogQueue dlg, List positional, Dictionary named, string arrowTarget, ILocalizationProvider locale) + { + named.TryGetValue("who", out var who); + named.TryGetValue("dice", out var dice); + named.TryGetValue("bonus", out var bonus); + named.TryGetValue("else", out var otherwise); + var check = new StatCheck + { + Who = who, + Stat = positional.Count > 0 ? positional[0].ToLowerInvariant() : string.Empty, + Difficulty = Int(positional.Count > 1 ? positional[1] : null), + Dice = dice ?? DefaultDice(), + Bonus = Int(bonus), + }; + + dlg.Run(check.Perform); + dlg.Set("check_stat", () => StatName(check.Stat)); + dlg.Set("check_value", () => check.Value.ToString(CultureInfo.InvariantCulture)); + dlg.Set("check_roll", () => check.Roll.ToString(CultureInfo.InvariantCulture)); + dlg.Set("check_bonus", () => check.Bonus.ToString(CultureInfo.InvariantCulture)); + dlg.Set("check_total", () => check.Total.ToString(CultureInfo.InvariantCulture)); + dlg.Set("check_dc", () => check.Difficulty.ToString(CultureInfo.InvariantCulture)); + dlg.Set("check_result", () => Tr(check.Success ? "checks/success" : "checks/failure")); + if (!named.ContainsKey("quiet")) + dlg.PText(locale?.Get("checks/line") ?? DefaultLine); + dlg.IfGoTo(() => check.Success, Label(arrowTarget), Label(otherwise)); + } + + private static string DefaultDice() + { + var setting = ActiveGame.GetSetting("checks.dice"); + return string.IsNullOrWhiteSpace(setting) ? "d20" : setting; + } + + private static int Int(string text) + => int.TryParse(text?.Trim(), NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out var value) ? value : 0; + + private static string Label(string target) => string.IsNullOrWhiteSpace(target) ? null : target.Trim().TrimStart(':'); + + private static string StatName(string stat) + { + var key = StatsService.Definition(stat)?.Name; + return string.IsNullOrEmpty(key) ? stat : Tr(key); + } + + private static string Tr(string key) => TranslationServer.Translate(key).ToString(); + } +} diff --git a/src/DiceRoll.cs b/src/DiceRoll.cs new file mode 100644 index 0000000..50be2bb --- /dev/null +++ b/src/DiceRoll.cs @@ -0,0 +1,50 @@ +namespace Cthangover.Mods.StatChecks +{ + using System; + using System.Globalization; + + /// + /// Dice in tabletop notation: d20, 2d6, 1d100; none (or + /// empty, or 0) rolls nothing, which makes a check deterministic — a novel's + /// "you are brave enough, or you are not". A malformed text rolls nothing too, so a + /// typo never breaks a scene; the validator reports it. + /// + public static class DiceRoll + { + /// Whether is valid notation (or a "no dice" word). + public static bool IsValid(string dice) => TryParse(dice, out _, out _); + + /// Rolls : the sum of the faces, 0 for no dice. + public static int Roll(string dice, Random random = null) + { + if (!TryParse(dice, out var count, out var sides) || count == 0) + return 0; + var rng = random ?? Random.Shared; + var sum = 0; + for (var i = 0; i < count; i++) + sum += rng.Next(1, sides + 1); + return sum; + } + + /// Parses NdM; is 0 for "no dice". + public static bool TryParse(string dice, out int count, out int sides) + { + count = 0; + sides = 0; + var text = dice?.Trim().ToLowerInvariant(); + if (string.IsNullOrEmpty(text) || text is "none" or "0") + return true; + var d = text.IndexOf('d'); + if (d < 0) + return false; + var countText = text.Substring(0, d); + if (countText.Length == 0) + count = 1; + else if (!int.TryParse(countText, NumberStyles.None, CultureInfo.InvariantCulture, out count)) + return false; + if (!int.TryParse(text.Substring(d + 1), NumberStyles.None, CultureInfo.InvariantCulture, out sides)) + return false; + return count is >= 1 and <= 100 && sides >= 2; + } + } +} diff --git a/src/StatCheck.cs b/src/StatCheck.cs new file mode 100644 index 0000000..0353263 --- /dev/null +++ b/src/StatCheck.cs @@ -0,0 +1,53 @@ +namespace Cthangover.Mods.StatChecks +{ + using System; + using Cthangover.Mods.Stats; + + /// + /// One check of a check line: stat value + dice + bonus against a difficulty. + /// The line is parsed once and the check object lives in the dialog queue, so every + /// pass through the line (a goto loop, a replay) rolls again and the dialog + /// variables show the latest roll. + /// + public class StatCheck + { + /// Whose stat (a character id or player). + public string Who { get; init; } + + /// The stat id. + public string Stat { get; init; } + + /// The total needed to succeed. + public int Difficulty { get; init; } + + /// Dice notation (). + public string Dice { get; init; } + + /// A flat bonus (or malus) of this check only. + public int Bonus { get; init; } + + /// The stat value of the last roll. + public int Value { get; private set; } + + /// The dice of the last roll. + public int Roll { get; private set; } + + /// Value + dice + bonus of the last roll. + public int Total { get; private set; } + + /// Whether the last roll reached the difficulty. + public bool Success { get; private set; } + + /// Rolls the check now (reads the stat as it is at this moment). + public void Perform() => Perform(StatsService.Sheet(Who).Rounded(Stat), null); + + /// Rolls with a given stat value and dice generator (tests, previews). + public void Perform(int value, Random random) + { + Value = value; + Roll = DiceRoll.Roll(Dice, random); + Total = Value + Roll + Bonus; + Success = Total >= Difficulty; + } + } +} diff --git a/tests/CheckCommandStrategyTests.cs b/tests/CheckCommandStrategyTests.cs new file mode 100644 index 0000000..b61928d --- /dev/null +++ b/tests/CheckCommandStrategyTests.cs @@ -0,0 +1,56 @@ +namespace Cthangover.Mods.StatChecks.Tests +{ + using Cthangover.Core.Mods.Testing; + using Cthangover.Mods.Dialog; + using Cthangover.Mods.Dialog.Scenarios; + + /// + /// check lines in a real scenario text: the queue rolls when it reaches the line, + /// jumps to the arrow label on success and to else (or the next line) on failure, + /// and leaves the roll in dialog variables. + /// + public class CheckCommandStrategyTests + { + private static DialogRuntime Run(string scenario) + { + var dlg = ScenarioParser.Parse(scenario); + var runtime = new DialogRuntime(); + runtime.SetDialogQueueAndRun(null, dlg.Queue, null); + runtime.Run(); + return runtime; + } + + // A stat no mod defines reads 0 for anyone, so the outcomes below are fixed whatever packs are loaded. + private const string Nobody = "who=test_nobody_has_stats"; + + [ModTest("command/success_jumps_to_the_arrow")] + static void SuccessJumps(ModTestContext ctx) + { + var runtime = Run($"check test_undefined_stat 0 {Nobody} dice=none bonus=3 quiet=1 -> :ok\nset outcome failed\nend\n:ok\nset outcome passed\nend\n"); + + ModAssert.Equal("passed", runtime.GetVariable("outcome"), "jumped to :ok"); + ModAssert.Equal("3", runtime.GetVariable("check_total"), "0 + 0 + 3"); + ModAssert.Equal("0", runtime.GetVariable("check_dc"), "difficulty"); + } + + [ModTest("command/failure_falls_through_or_takes_else")] + static void FailureFallsThroughOrTakesElse(ModTestContext ctx) + { + var through = Run($"check test_undefined_stat 5 {Nobody} dice=none quiet=1 -> :ok\nset outcome failed\nend\n:ok\nset outcome passed\nend\n"); + ModAssert.Equal("failed", through.GetVariable("outcome"), "fell through to the next line"); + + var other = Run($"check test_undefined_stat 5 {Nobody} dice=none quiet=1 else=no -> :ok\nset outcome next\nend\n:ok\nset outcome passed\nend\n:no\nset outcome else\nend\n"); + ModAssert.Equal("else", other.GetVariable("outcome"), "jumped to else"); + } + + [ModTest("command/spec_for_the_validator")] + static void SpecForTheValidator(ModTestContext ctx) + { + var spec = new CheckCommandStrategy(); + ModAssert.Equal(2, spec.MinPositional, "stat and difficulty"); + ModAssert.Equal(2, spec.MaxPositional, "nothing more"); + ModAssert.Equal("else", spec.JumpTargetNamedKey, "else is a label"); + ModAssert.NotNull(ScenarioCommandStrategyFactory.Get("check"), "registered as a DSL command"); + } + } +} diff --git a/tests/DiceRollTests.cs b/tests/DiceRollTests.cs new file mode 100644 index 0000000..37f4540 --- /dev/null +++ b/tests/DiceRollTests.cs @@ -0,0 +1,38 @@ +namespace Cthangover.Mods.StatChecks.Tests +{ + using System; + using Cthangover.Core.Mods.Testing; + + /// Tabletop dice notation: valid forms roll within their range, "no dice" rolls 0, typos roll 0 and are invalid. + public class DiceRollTests + { + [ModTest("dice/notation")] + static void Notation(ModTestContext ctx) + { + ModAssert.True(DiceRoll.TryParse("2d6", out var count, out var sides) && count == 2 && sides == 6, "2d6"); + ModAssert.True(DiceRoll.TryParse("D20", out count, out sides) && count == 1 && sides == 20, "d20 in any case"); + ModAssert.True(DiceRoll.TryParse("none", out count, out _) && count == 0, "none"); + ModAssert.True(DiceRoll.TryParse("", out count, out _) && count == 0, "empty"); + foreach (var bad in new[] { "d1", "2x6", "-1d6", "d", "3d", "1000d6", "1.5d6" }) + ModAssert.False(DiceRoll.IsValid(bad), $"'{bad}' is not dice"); + } + + [ModTest("dice/rolls_stay_in_range")] + static void RollsStayInRange(ModTestContext ctx) + { + var random = new Random(3); + var seenLow = false; + var seenHigh = false; + for (var i = 0; i < 400; i++) + { + var roll = DiceRoll.Roll("2d6", random); + ModAssert.True(roll >= 2 && roll <= 12, $"2d6 gave {roll}"); + seenLow |= roll == 2; + seenHigh |= roll == 12; + } + ModAssert.True(seenLow && seenHigh, "both ends of 2d6 come up in 400 rolls"); + ModAssert.Equal(0, DiceRoll.Roll("none"), "no dice"); + ModAssert.Equal(0, DiceRoll.Roll("oops"), "a typo rolls nothing"); + } + } +} diff --git a/tests/StatCheckTests.cs b/tests/StatCheckTests.cs new file mode 100644 index 0000000..7464204 --- /dev/null +++ b/tests/StatCheckTests.cs @@ -0,0 +1,37 @@ +namespace Cthangover.Mods.StatChecks.Tests +{ + using System; + using Cthangover.Core.Mods.Testing; + + /// A check is value + dice + bonus against the difficulty; reaching it exactly succeeds. + public class StatCheckTests + { + [ModTest("check/total_and_threshold")] + static void TotalAndThreshold(ModTestContext ctx) + { + var check = new StatCheck { Stat = "cha", Difficulty = 12, Dice = "none", Bonus = 2 }; + + check.Perform(10, null); + ModAssert.Equal(12, check.Total, "10 + 0 + 2"); + ModAssert.True(check.Success, "reaching the difficulty exactly succeeds"); + + check.Perform(9, null); + ModAssert.False(check.Success, "one short fails"); + ModAssert.Equal(0, check.Roll, "no dice"); + } + + [ModTest("check/dice_add_to_the_total")] + static void DiceAddToTheTotal(ModTestContext ctx) + { + var check = new StatCheck { Stat = "str", Difficulty = 100, Dice = "1d6", Bonus = -1 }; + var random = new Random(11); + for (var i = 0; i < 50; i++) + { + check.Perform(5, random); + ModAssert.True(check.Roll is >= 1 and <= 6, $"1d6 gave {check.Roll}"); + ModAssert.Equal(5 + check.Roll - 1, check.Total, "value + roll + bonus"); + ModAssert.False(check.Success, "100 is out of reach"); + } + } + } +}