diff options
author | Griffin Smith <root@gws.fyi> | 2020-05-11T00·26-0400 |
---|---|---|
committer | Griffin Smith <root@gws.fyi> | 2020-05-11T00·26-0400 |
commit | ce3730ba3a5831e590dd9cc037649eb49e2f0804 (patch) | |
tree | 80af1801baedcc8543521ddfed048fb0fc304ee8 | |
parent | b64dd08c6ec5f68539c6b4159b10d960e8e96bc3 (diff) |
Small chance of hurting self when punching
When attacking monsters with bare fists, there is a small chance (8%, right now) of causing 1 point of self-damage
-rw-r--r-- | src/Xanthous/App.hs | 9 | ||||
-rw-r--r-- | src/Xanthous/Random.hs | 15 | ||||
-rw-r--r-- | src/Xanthous/messages.yaml | 3 |
3 files changed, 26 insertions, 1 deletions
diff --git a/src/Xanthous/App.hs b/src/Xanthous/App.hs index 24073c51097a..ea1405e463fe 100644 --- a/src/Xanthous/App.hs +++ b/src/Xanthous/App.hs @@ -548,9 +548,16 @@ attackAt pos = msg <- uses character getAttackMessage message msg msgParams entities . ix creatureID . positioned .= SomeEntity creature' + + whenM (uses character $ isNothing . weapon) + $ whenM (chance (0.08 :: Float)) $ do + say_ ["combat", "fistSelfDamage"] + character %= Character.damage 1 + stepGame -- TODO + weapon chr = chr ^? inventory . wielded . wieldedItems . wieldableItem getAttackMessage chr = - case chr ^? inventory . wielded . wieldedItems . wieldableItem of + case weapon chr of Just wi -> fromMaybe (Messages.lookup ["combat", "hit", "generic"]) $ wi ^. attackMessage diff --git a/src/Xanthous/Random.hs b/src/Xanthous/Random.hs index 3cb0b068d3d7..41c80ab73c4c 100644 --- a/src/Xanthous/Random.hs +++ b/src/Xanthous/Random.hs @@ -9,6 +9,7 @@ module Xanthous.Random , evenlyWeighted , weightedBy , subRand + , chance ) where -------------------------------------------------------------------------------- import Xanthous.Prelude @@ -85,3 +86,17 @@ instance (Num w, Ord w, Distribution Uniform w, Excludable w) => Choose (Weighte subRand :: MonadRandom m => Rand StdGen a -> m a subRand sub = evalRand sub . mkStdGen <$> getRandom + +-- | Has a @n@ chance of returning 'True' +-- +-- eg, chance 0.5 will return 'True' half the time +chance + :: (Num w, Ord w, Distribution Uniform w, Excludable w, MonadRandom m) + => w + -> m Bool +chance n = choose $ weightedBy (bool 1 (n * 2)) bools + +-------------------------------------------------------------------------------- + +bools :: NonEmpty Bool +bools = True :| [False] diff --git a/src/Xanthous/messages.yaml b/src/Xanthous/messages.yaml index ed592e26507e..40426423783c 100644 --- a/src/Xanthous/messages.yaml +++ b/src/Xanthous/messages.yaml @@ -57,6 +57,9 @@ character: combat: nothingToAttack: There's nothing to attack there. menu: Which creature would you like to attack? + fistSelfDamage: + - You hit so hard with your fists you hurt yourself! + - The punch leaves your knuckles bloody! hit: fists: - You punch the {{creature.creatureType.name}} with your bare fists! It hurts. A lot. |