summaryrefslogtreecommitdiff |
diff options
author | nsensfel <SpamShield0@noot-noot.org> | 2019-01-28 19:03:19 +0100 |
---|---|---|
committer | nsensfel <SpamShield0@noot-noot.org> | 2019-01-28 19:03:19 +0100 |
commit | dc988b5aa72204954b2034615d644c703b35d294 (patch) | |
tree | 8605e35192f542b960270f9ee35b879584fda8a8 /src/shared/shr_roll.erl | |
parent | 04212005d8f4e078548738256add0f6c12138946 (diff) |
Adding the luck mechanic...
Diffstat (limited to 'src/shared/shr_roll.erl')
-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}. |