{-# OPTIONS_HADDOCK hide #-}

{-# LANGUAGE NoImplicitPrelude #-}

module Imj.Game.Hamazed.World.Number(
    getColliding
  , computeActualLaserShot
  , destroyedNumbersAnimations
  ) where

import           Imj.Prelude

import           Data.Char( intToDigit )

import           Imj.Game.Hamazed.Loop.Event
import           Imj.GameItem.Weapon.Laser
import           Imj.Geo.Continuous
import           Imj.Geo.Discrete
import           Imj.Graphics.Animation

getColliding :: Coords Pos -> [Number] -> [Number]
getColliding pos =
  filter (\(Number (PosSpeed pos' _) _) -> pos == pos')

destroyedNumbersAnimations :: Either SystemTime KeyTime
                           -> Direction -- ^ 'Direction' of the laser shot
                           -> World -- ^ the 'World' the 'Number's live in
                           -> [Number]
                           -> [Animation]
destroyedNumbersAnimations keyTime dir world =
  let laserSpeed = speed2vec $ coordsForDirection dir
  in concatMap (destroyedNumberAnimations keyTime laserSpeed world)

destroyedNumberAnimations :: Either SystemTime KeyTime
                          -> Vec2 Vel
                          -> World
                          -> Number
                          -> [Animation]
destroyedNumberAnimations k laserSpeed world (Number (PosSpeed pos _) n) =
  let char = intToDigit n
      envFunc = environmentInteraction world WorldFrame
  in catMaybes ([animatedPolygon n pos envFunc (Speed 1) k char])
     ++ fragmentsFreeFallThenExplode (scalarProd 0.8 laserSpeed) pos envFunc (Speed 2) k char