52 lines
1.6 KiB
Haskell
52 lines
1.6 KiB
Haskell
module Dodge.WorldEvent.Cloud
|
|
where
|
|
|
|
import Dodge.Data
|
|
import Dodge.Base
|
|
--import Geometry
|
|
import Picture
|
|
--import qualified IntMapHelp as IM
|
|
|
|
import Control.Lens
|
|
|
|
makeCloudAt :: Float -> Int -> (Cloud -> Picture) -> Point2 -> World -> World
|
|
makeCloudAt rad t drawFunc p w = w & clouds %~ (theCloud :)
|
|
where
|
|
theCloud = Cloud
|
|
{ _clPos = p
|
|
, _clVel = (0,0)
|
|
, _clPict = drawFunc
|
|
, _clRad = rad
|
|
, _clTimer = t
|
|
, _clType = SmokeCloud
|
|
--, _clEffect = const id
|
|
}
|
|
|
|
drawCloudWith :: Float -> Float -> Color -> Cloud -> Picture
|
|
drawCloudWith radMult fadet col cl
|
|
= setLayer 2
|
|
. setDepth 25
|
|
$ circleSolidCol (withAlpha 0 col) (withAlpha a col) (radMult * _clRad cl)
|
|
where
|
|
a = min 1 $ fromIntegral (_clTimer cl) / fadet
|
|
|
|
makeThickSmokeAt :: Point2 -> World -> World
|
|
makeThickSmokeAt = makeCloudAt 3 50 (drawCloudWith 4 50 black)
|
|
|
|
makeThinSmokeAt :: Point2 -> World -> World
|
|
makeThinSmokeAt = makeCloudAt 5 400 (drawCloudWith 4 400 (withAlpha 0.05 black))
|
|
|
|
makeStartCloudAt :: Point2 -> World -> World
|
|
--makeSmokeCloudAt = makeCloudAt 10 200 (drawCloudWith 2 200 (greyN 0.5))
|
|
makeStartCloudAt = makeCloudAt 10 400 (drawCloudWith 2 800 white)
|
|
|
|
makeSmokeCloudAt :: Point2 -> World -> World
|
|
--makeSmokeCloudAt = makeCloudAt 10 200 (drawCloudWith 2 200 (greyN 0.5))
|
|
makeSmokeCloudAt = makeCloudAt 15 400 (drawCloudWith (4/3) 800 (greyN 0.5))
|
|
|
|
makeFlamerSmokeAt :: Float -> Point2 -> World -> World
|
|
makeFlamerSmokeAt x = makeCloudAt 6 200 (drawCloudWith 4 300 (greyN x))
|
|
|
|
spawnSmokeAtCursor :: World -> World
|
|
spawnSmokeAtCursor w = makeSmokeCloudAt (mouseWorldPos w) w
|