59 lines
1.9 KiB
Haskell
59 lines
1.9 KiB
Haskell
{- |
|
|
Drawing of creatures.
|
|
Takes into account damage etc. -}
|
|
module Dodge.Creature.Picture
|
|
( basicCrPict
|
|
, circLine
|
|
) where
|
|
import Dodge.Data
|
|
import Dodge.Creature.State.Data
|
|
import Dodge.Picture.Layer
|
|
import Picture
|
|
import Geometry
|
|
|
|
import Control.Lens
|
|
import Data.List
|
|
import qualified Data.IntMap.Strict as IM
|
|
basicCrPict
|
|
:: Color -- ^ Creature color
|
|
-> Creature
|
|
-> Picture
|
|
basicCrPict col cr = pictures [ onLayer CrLayer . piercingMod $ bluntScale naked , drawEquipment cr]
|
|
where
|
|
cdir = _crDir cr
|
|
naked
|
|
| strikeMelee = color white $ circleSolid $ _crRad cr
|
|
| pdam > 200 = color red $ circleSolid $ _crRad cr
|
|
| pdam > 99 = color white $ circleSolid $ _crRad cr
|
|
| otherwise = pictures [color col' $ circleSolid $ _crRad cr, circLine $ _crRad cr]
|
|
pastDams = _crPastDamage $ _crState cr
|
|
pdam = sum $ concatMap (map _dmAmount) $ pastDams
|
|
col' = light . light . light $ light col
|
|
bluntDam :: Maybe Point2
|
|
bluntDam = find isBluntDam (concat pastDams) >>= (\dm -> (-.-) <$> dm ^? dmFrom <*> dm ^? dmTo)
|
|
bluntScale = case fmap argV bluntDam of
|
|
Just a -> rotate (a + cdir) . scale 0.8 1.2 . rotate (negate $ cdir + a)
|
|
_ -> id
|
|
isBluntDam (Blunt {}) = True
|
|
isBluntDam _ = False
|
|
piercingDam = find isPiercingDam (concat pastDams) >>= (\dm -> (-.-) <$> dm ^? dmFrom <*> dm ^? dmTo)
|
|
isPiercingDam (Piercing {}) = True
|
|
isPiercingDam _ = False
|
|
piercingMod = case fmap argV piercingDam of
|
|
Just a -> rotate (a + cdir) . scale 0.8 1.2 . rotate (negate $ cdir + a)
|
|
_ -> id
|
|
strikeMelee = case _crMeleeCooldown cr of
|
|
Nothing -> False
|
|
Just x -> x > 5
|
|
|
|
drawEquipment
|
|
:: Creature
|
|
-> Picture
|
|
drawEquipment cr = pictures $ map f $ IM.toList (_crInv cr)
|
|
where
|
|
f (i,it) = case it ^? itEquipPict of
|
|
Just g -> g cr i
|
|
_ -> blank
|
|
|
|
circLine x = line [(0,0),(x,0)]
|