{-| Module : AfterEffect.MineExplosion Description : Visual and audio after-effect from a mine explosion Copyright : (c) Christopher Howard, 2016 License : GPL-3 Maintainer : ch.howard@zoho.com -} module AfterEffect.MineExplosion where import Prelude (Maybe(..), (-), (+), return, (<), (<=)) import Data.WrapAround ( WP, WM ) import Graphics.Gloss.Data.Picture ( Picture(Blank, Color, Scale, Text) ) import Graphics.Gloss.Data.Color ( white ) import Sound.ALUT ( Source, stop ) import Data.Maybe ( isNothing, fromMaybe, fromJust ) import Animation import Updating import qualified Moving as M ( Locatable(..) ) import ResourceTracker import Common data MineExplosion = MineExplosion { center :: WP , timeRemaining :: Time , sndSrc :: Maybe Source , wmap :: WM , rt :: RT , animClock :: Time } new a b c = MineExplosion { center = c , timeRemaining = 3 , sndSrc = Nothing , wmap = b , rt = a , animClock = 0 } instance Animation MineExplosion where image s t = if animClock s < 0.1 then fromMaybe (Color white (Scale 0.10 0.10 (Text "boom!"))) (getImage (rt s) "mine-explosion.bmp") else Blank instance M.Locatable MineExplosion where center = center instance Transient MineExplosion where expired' s = if timeRemaining s <= 0 then Just [] else Nothing instance InternallyUpdating MineExplosion where preUpdate s t = s { timeRemaining = timeRemaining s - t } postUpdate s t = s { animClock = animClock s + t } instance Audible MineExplosion where processAudio s a = procOneTimeSnd s sndSrc a rt "explosion.wav" 0.5 wmap (\x y -> x { sndSrc = y }) terminateAudio s = if isNothing (sndSrc s) then return s else do stop [fromJust (sndSrc s)] return s