about summary refs log tree commit diff
path: root/users/aspen/xanthous/src/Xanthous/Physics.hs
blob: 37530cbbc21b40265fe502c814222b2ab5f871ed (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
--------------------------------------------------------------------------------
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