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
This commit is contained in:
Griffin Smith 2020-05-10 20:26:44 -04:00
parent b64dd08c6e
commit ce3730ba3a
3 changed files with 26 additions and 1 deletions

View file

@ -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

View file

@ -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]

View file

@ -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.