| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src/shared')
| -rw-r--r-- | src/shared/shr_roll.erl | 77 | 
1 files changed, 76 insertions, 1 deletions
| diff --git a/src/shared/shr_roll.erl b/src/shared/shr_roll.erl index 8e688c7..7c9e1c5 100644 --- a/src/shared/shr_roll.erl +++ b/src/shared/shr_roll.erl @@ -11,7 +11,9 @@  (     [        percentage/0, -      between/2 +      between/2, +      percentage_with_luck/2, +      conflict_with_luck/3     ]  ). @@ -30,3 +32,76 @@ between (Min, Max) ->  -spec percentage () -> 0..100.  percentage () ->     between(0, 100). + +-spec percentage_with_luck +   ( +      non_neg_integer(), +      integer() +   ) +   -> {0..100, boolean(), integer()}. +percentage_with_luck (Target, Luck) -> +   BaseRoll = percentage(), +   ModedRoll = max(0, min((BaseRoll - Luck), 100)), +   IsSuccess = (ModedRoll =< Target), + +   NewLuck = +      case {IsSuccess, (Target > 50)} of +         {true, true} -> +            % Succeeded, was likely to succeed. +            % Only pay what was used. +            MissingPoints = max(0, (BaseRoll - Target)), +            (Luck - MissingPoints); + +         {true, false} -> +            % Succeeded, was unlikely to succeed. +            % Pay a lot! +            MissingPoints = (55 - Target), +            (Luck - MissingPoints); + +         {false, true} -> +            % Failure due to bad roll. +            % Was likely to succeed, you get a lot! +            OwedPoints = (Target - 45), +            (Luck + OwedPoints); + +         _ -> Luck +      end, + +   {ModedRoll, IsSuccess, NewLuck}. + +-spec conflict_with_luck +   ( +      non_neg_integer(), +      integer(), +      integer() +   ) +   -> {0..100, boolean(), integer(), integer()}. +conflict_with_luck (Target, LuckA, LuckB) -> +   BaseRoll = percentage(), +   ModedRoll = max(0, min((BaseRoll - (LuckA - LuckB)), 100)), +   IsSuccess = (ModedRoll =< Target), + +   {NewLuckA, NewLuckB} = +      case {IsSuccess, (Target > 50)} of +         {true, true} -> +            % Succeeded, was likely to succeed. +            % Only pay what was used. +            MissingPoints = max(0, (BaseRoll - Target)), +            {(LuckA - MissingPoints), LuckB}; + +         {true, false} -> +            % Succeeded, was unlikely to succeed. +            % Pay a lot! +            MissingPoints = (55 - Target), +            {(LuckA - MissingPoints), (LuckB + MissingPoints)}; + +         {false, true} -> +            % Failure due to bad roll. +            % Was likely to succeed, you get a lot! +            OwedPoints = (Target - 45), +            {(LuckA + OwedPoints), (LuckB - OwedPoints)}; + +         _ -> {LuckA, LuckB} +      end, + +   {ModedRoll, IsSuccess, NewLuckA, NewLuckB}. | 


