Change-Id: I6c6847fac56f0a9a1a2209792e00a3aec5e672b9 Reviewed-on: https://cl.tvl.fyi/c/depot/+/10809 Autosubmit: aspen <root@gws.fyi> Reviewed-by: sterni <sternenseemann@systemli.org> Tested-by: BuildkiteCI Reviewed-by: lukegb <lukegb@tvl.fyi>
71 lines
1.7 KiB
Haskell
71 lines
1.7 KiB
Haskell
--------------------------------------------------------------------------------
|
||
module Xanthous.Physics
|
||
( throwDistance
|
||
, bluntThrowDamage
|
||
) where
|
||
--------------------------------------------------------------------------------
|
||
import Xanthous.Prelude
|
||
import Xanthous.Data
|
||
( Meters
|
||
, (:**:)(..)
|
||
, Square
|
||
, Grams
|
||
, (|*|)
|
||
, (|/|)
|
||
, Hitpoints
|
||
, Per (..)
|
||
, squared
|
||
, Uno(..), (|+|)
|
||
)
|
||
--------------------------------------------------------------------------------
|
||
|
||
-- university shotputter can put a 16 lb shot about 14 meters
|
||
-- ≈ 7.25 kg 14 meters
|
||
-- 14m = x / (7.25kg × y + z)²
|
||
-- 14m = x / (7250g × y + z)²
|
||
--
|
||
-- we don't want to scale down too much:
|
||
--
|
||
-- 10 kg 10 meters
|
||
-- = 10000 g 10 meters
|
||
--
|
||
-- 15 kg w meters
|
||
-- = 15000 g w meters
|
||
--
|
||
-- 14m = x / (7250g × y + z)²
|
||
-- 10m = x / (10000g × y + z)²
|
||
-- wm = x / (15000g × y + z)²
|
||
--
|
||
-- w≈0.527301 ∧ y≈0.000212178 sqrt(x) ∧ z≈1.80555 sqrt(x) ∧ 22824.1 sqrt(x)!=0
|
||
--
|
||
-- x = 101500
|
||
-- y = 0.0675979
|
||
-- z = 575.231
|
||
--
|
||
|
||
-- TODO make this dynamic
|
||
strength :: Meters :**: Square Grams
|
||
strength = Times 10150000
|
||
|
||
yCoeff :: Uno Double
|
||
yCoeff = Uno 0.0675979
|
||
|
||
zCoeff :: Uno Double
|
||
zCoeff = Uno 575.231
|
||
|
||
-- | Calculate the maximum distance an object with the given weight can be
|
||
-- thrown
|
||
throwDistance
|
||
:: Grams -- ^ Weight of the object
|
||
-> Meters -- ^ Max distance thrown
|
||
throwDistance weight = strength |/| squared (weight |*| yCoeff |+| zCoeff)
|
||
|
||
-- | Returns the damage dealt by a blunt object with the given weight when
|
||
-- thrown
|
||
bluntThrowDamage
|
||
:: Grams
|
||
-> Hitpoints
|
||
bluntThrowDamage weight = throwDamageRatio |*| weight
|
||
where
|
||
throwDamageRatio :: Hitpoints `Per` Grams
|
||
throwDamageRatio = Rate $ 1 / 5000
|