summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornsensfel <SpamShield0@noot-noot.org>2019-01-28 19:03:19 +0100
committernsensfel <SpamShield0@noot-noot.org>2019-01-28 19:03:19 +0100
commitdc988b5aa72204954b2034615d644c703b35d294 (patch)
tree8605e35192f542b960270f9ee35b879584fda8a8 /src/shared/shr_roll.erl
parent04212005d8f4e078548738256add0f6c12138946 (diff)
Adding the luck mechanic...
Diffstat (limited to 'src/shared/shr_roll.erl')
-rw-r--r--src/shared/shr_roll.erl77
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}.