edge-0.8: Projectile/Mine.hs
module Projectile.Mine ( Mine(..)
, new
) where
import Combat
import Animation
import Updating
import Graphics.Gloss.Data.Picture
import Graphics.Gloss.Data.Color
import Data.WrapAround
import qualified Moving as M
import ResourceTracker
import Data.Maybe
import qualified AfterEffect.MineExplosion as MineExplosion
import AfterEffect
detRadius = 100.0
punch = 1.0
data Mine =
Mine { center :: WrapPoint
, impacted :: Bool
, clock :: Double
, resourceTracker :: ResourceTracker
, wrapMap :: WrapMap
}
-- angle is radians
new :: ResourceTracker -> WrapMap -> WrapPoint -> Mine
new rt wmap center' =
Mine { center = center'
, impacted = False
, clock = 0.0
, resourceTracker = rt
, wrapMap = wmap
}
instance Animation Mine where
image self _ =
-- assumes t >= 0
let t = clock self in
let adjt = let a = t * 0.1 in
let b = fromIntegral (truncate a) in
let c = a - b in
c * 10.0 in
c adjt
where c x | x <= 0.1 = plit
| x > 5 && x <= 5.1 = plit
| otherwise = p
p = fromMaybe
(Scale 0.20 0.20
(Color white
(Text "Error! Missing image!")))
(getImage rt "mine.bmp")
plit = fromMaybe
(Scale 0.20 0.20
(Color white
(Text "Error! Missing image!")))
(getImage rt "mine-lit.bmp")
rt = resourceTracker self
-- image self t = let r = fromInteger (ceiling (clock self)) - clock self in
-- Color (c r)
-- (Rotate 45.0
-- (Circle 2.0))
-- where c x | x < 0.10 = red
-- | x < 0.20 = yellow
-- | x < 0.30 = red
-- | x < 0.40 = yellow
-- | x < 0.50 = red
-- | x < 0.60 = yellow
-- | x < 0.70 = red
-- | x < 0.80 = yellow
-- | x < 0.90 = red
-- | otherwise = yellow
instance M.Colliding Mine where
collisionRadius _ = detRadius
instance M.Moving Mine where
velocity _ = (0.0, 0.0)
instance M.Locatable Mine where
center self = Projectile.Mine.center self
instance SimpleTransient Mine where
expired self = impacted self
instance InternallyUpdating Mine where
preUpdate self t = self { clock = clock self + t }
postUpdate self _ = self
instance Damaging Mine where
damageEnergy _ = punch
instance Transient Mine where
expired' self = if impacted self
then Just [mE]
else Nothing
where mE = AfterEffect $ MineExplosion.new rt wmap center'
rt = resourceTracker self
wmap = wrapMap self
center' = center self
instance Damageable Mine where
inflictDamage self d = self { impacted = d > 0 }