Work on what happens when creatures fall down chasms
This commit is contained in:
+18
-19
@@ -1,15 +1,13 @@
|
||||
module Dodge.Prop.Gib (
|
||||
addCrGibs,
|
||||
) where
|
||||
module Dodge.Prop.Gib (addCrGibs) where
|
||||
|
||||
import Dodge.WorldEvent.Cloud
|
||||
import Dodge.Creature.Shape
|
||||
import Color
|
||||
import Control.Monad
|
||||
import Data.Foldable
|
||||
import Data.List (zip4)
|
||||
import Dodge.Creature.Shape
|
||||
import Dodge.Damage
|
||||
import Dodge.Data.World
|
||||
import Dodge.WorldEvent.Cloud
|
||||
import Geometry
|
||||
import LensHelp
|
||||
import qualified Quaternion as Q
|
||||
@@ -18,16 +16,16 @@ import RandomHelp
|
||||
addCrGibs :: Creature -> World -> World
|
||||
addCrGibs cr = case damageDirection $ _crDamage cr of
|
||||
Nothing ->
|
||||
addGibAt 25 (_skinHead skin) cpos
|
||||
addGibAt 25 (_skinHead skin) cpos
|
||||
. addGibsAtDir pi 0 3 7 (_skinLower skin) cpos
|
||||
. addGibsAtDir pi 0 13 20 (_skinUpper skin) cpos
|
||||
. makeDustAt Flesh 50 (addZ 20 cpos)
|
||||
. makeDustAt Flesh 50 (addZ 20 cpos)
|
||||
. makeDustAt Flesh 50 (addZ 20 cpos)
|
||||
. makeDustAt Flesh 50 (addZ 20 cpos)
|
||||
Just d -> (testFloat +~ 1)
|
||||
. addGibsAtDir (pi/4) d 3 7 (_skinLower skin) cpos
|
||||
. addGibsAtDir (pi/4) d 13 20 (_skinUpper skin) cpos
|
||||
Just d ->
|
||||
addGibsAtDir (pi / 4) d 3 7 (_skinLower skin) cpos
|
||||
. addGibsAtDir (pi / 4) d 13 20 (_skinUpper skin) cpos
|
||||
. addGibAtDir d 25 (_skinHead skin) cpos
|
||||
. makeDustAt Flesh 50 (addZ 20 cpos)
|
||||
. makeDustAt Flesh 50 (addZ 20 cpos)
|
||||
@@ -48,11 +46,11 @@ addGibsAtDir spread dir minh maxh col p w =
|
||||
dirs = unitVectorAtAngle <$> (randsSpread (dir - spread, dir + spread) 4 & evalState $ _randGen w)
|
||||
vels = zipWith (*.*) speeds dirs
|
||||
zspeeds = replicateM 4 (state (randomR (-8, 8))) & evalState $ _randGen w
|
||||
quats :: [Q.Quaternion Float]
|
||||
quats = replicateM 4 (Q.vToQuat (V3 0 0 1) <$> randOnUnitSphere) & evalState $ _randGen w
|
||||
|
||||
addGib4 :: Point2 -> Color -> (Point2, Float, QFloat, Float) -> World -> World
|
||||
addGib4 p col (v, zs, q, h) = cWorld . lWorld . debris
|
||||
addGib4 p col (v, zs, q, h) =
|
||||
cWorld . lWorld . debris
|
||||
.:~ DebrisChunk
|
||||
{ _dbPos = p `v2z` h
|
||||
, _dbType = Gib 3 col
|
||||
@@ -60,7 +58,7 @@ addGib4 p col (v, zs, q, h) = cWorld . lWorld . debris
|
||||
, _dbRot = q
|
||||
, _dbSpin = Q.axisAngle (vNormal v `v2z` 0) (-0.1)
|
||||
}
|
||||
|
||||
|
||||
addGibAt :: Float -> Color -> Point2 -> World -> World
|
||||
addGibAt h col p w = addGibAtDir d h col p (w & randGen .~ newg)
|
||||
where
|
||||
@@ -78,10 +76,11 @@ addGibAtDir dir h col p w =
|
||||
zs <- state $ randomR (-4, 4)
|
||||
q <- Q.vToQuat (V3 0 0 1) <$> randOnUnitSphere
|
||||
let v = s *.* unitVectorAtAngle dir
|
||||
return $ DebrisChunk
|
||||
{ _dbPos = p `v2z` h
|
||||
, _dbType = Gib 3 col
|
||||
, _dbVel = v `v2z` zs
|
||||
, _dbRot = q
|
||||
, _dbSpin = Q.axisAngle (vNormal v `v2z` 0) (-0.1)
|
||||
}
|
||||
return $
|
||||
DebrisChunk
|
||||
{ _dbPos = p `v2z` h
|
||||
, _dbType = Gib 3 col
|
||||
, _dbVel = v `v2z` zs
|
||||
, _dbRot = q
|
||||
, _dbSpin = Q.axisAngle (vNormal v `v2z` 0) (-0.1)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user