implemented 'pool' roll macro

This commit is contained in:
Valerie Wolfe 2024-04-01 21:41:04 -04:00
parent 3c3b6b859c
commit a0286194b2
3 changed files with 69 additions and 5 deletions

View file

@ -13,14 +13,13 @@ namespace Dungeoneer {
public static Dictionary<string, Command> RollMacros = new Dictionary<string, Command> { public static Dictionary<string, Command> RollMacros = new Dictionary<string, Command> {
// TODO: disadvantage ( roll twice and take lowest ) // TODO: disadvantage ( roll twice and take lowest )
// TODO: pool ( any of NdX > D => success ) { "pool", (Command)Dungeoneer.RollMacro.Pool }
}; };
public static void Main() { public static void Main() {
Console.WriteLine("Starting"); Console.WriteLine("Starting");
Scripting.Run("roll.py"); Scripting.Run("scripts/repl.py");
Scripting.Run("repl.py");
} }
} }

View file

@ -5,13 +5,50 @@ using Dungeoneer.Lexing;
namespace Dungeoneer { namespace Dungeoneer {
public class RollResult {
public dynamic Value { get; private set; }
private RollResult() { Value = null; }
public RollResult(string expression) {
Value = Scripting.Expr($"eval('{expression}')");
}
internal static class Style {
internal const string Default = "\x1b[1m";
internal const string BoolTrue = "\x1b[32;1m";
internal const string BoolFalse = "\x1b[31;1m";
}
public override string ToString() {
string style;
switch(Value) {
case bool boolValue:
style = boolValue ? Style.BoolTrue : Style.BoolFalse;
break;
default:
style = Style.Default;
break;
}
return $"{style}{Value}{Format.Reset}";
}
public static RollResult Wrap(dynamic value) {
var output = new RollResult();
output.Value = value;
return output;
}
}
public class RollExpression { public class RollExpression {
private IList<string> Parts; private IList<string> Parts;
public string Print { get; private set; } public string Print { get; private set; }
public string Expression { get; private set; } public string Expression { get; private set; }
public dynamic Result { public RollResult Result {
get { get {
try { return Scripting.Expr($"eval('{Expression}')"); } try { return new RollResult(Expression); }
catch { return null; } catch { return null; }
} }
} }
@ -40,5 +77,33 @@ namespace Dungeoneer {
} }
public static class RollMacro {
public static void Pool(IList<string> args) {
DiceToken? dice = null;
int? dc = null;
for(int i = 1; i < args.Count; i++) {
string arg = args[i];
var dieCheck = DiceToken.Match(arg);
if(dieCheck.Success)
dice = new DiceToken(dieCheck);
else
dc = int.Parse(arg);
}
var rolls = dice.Result;
bool success = false;
foreach(var roll in rolls)
if(roll > dc.Value) {
success = true;
break;
}
var result = RollResult.Wrap(success);
Console.WriteLine($"{dice.Format()}\n => {result}");
}
}
} }