packages feed

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 }