packages feed

layers-game-0.3: src/GameData/Entity.hs

{-# LANGUAGE FlexibleInstances #-}

module GameData.Entity where
#include "Utils.cpp"
import qualified Data.List as L
import qualified Gamgine.Math.BoxTree as BT
import qualified Gamgine.Math.Box as B
import qualified Gamgine.Math.Vect as V
import qualified FileData.Data2 as FD
import qualified GameData.Animation as A
IMPORT_LENS_AS_LE

-- | for classification of a box inside the box tree
data Position = Top | Bottom | Left | Right | Center | Whatever deriving (Show, Eq)

-- | the bound of an entity
type Bound = BT.BoxTree Position

-- | the scope of the entity
data Scope = LevelScope         -- ^ entity is part of all layers
           | ActiveLayerScope   -- ^ entity is part of the currently active layer
           | InactiveLayerScope -- ^ entity is part of a currently inactive layer
           deriving (Show, Eq)

-- | in which direction the player is moving
data Movement = ToTheLeft | ToTheRight | AtRest deriving (Show, Eq)

-- | the position of a platform
type PositionOrAnimation = Either V.Vect A.Animation

-- | the game entites
data Entity = Player {playerId         :: Int,
                      playerInitialPos :: V.Vect,
                      playerPosition   :: V.Vect,
                      playerVelocity   :: V.Vect,
                      playerOnBottom   :: Bool,
                      playerBound      :: Bound,
                      playerWalkCycle  :: (Int, Double)}

            | Enemy {enemyId        :: Int,
                     enemyPosition  :: PositionOrAnimation,
                     enemyBound     :: B.Box,
                     enemyWalkCycle :: (Int, Double),
                     enemyLiving    :: Bool}

            | Star {starId        :: Int,
                    starPosition  :: V.Vect,
                    starBound     :: B.Box,
                    starCollected :: Bool}

            | Platform {platformId       :: Int,
                        platformPosition :: PositionOrAnimation,
                        platformBound    :: B.Box}

            deriving Show

LENS(playerId)
LENS(playerInitialPos)
LENS(playerPosition)
LENS(playerVelocity)
LENS(playerOnBottom)
LENS(playerBound)
LENS(playerWalkCycle)

LENS(enemyId)
LENS(enemyPosition)
LENS(enemyBound)
LENS(enemyWalkCycle)
LENS(enemyLiving)

LENS(starId)
LENS(starPosition)
LENS(starBound)
LENS(starCollected)

LENS(platformId)
LENS(platformPosition)
LENS(platformBound)


class ApplyToEntity a where
   eMap    :: (Entity -> Entity) -> a -> a
   eFilter :: (Entity -> Bool)   -> a -> a


instance ApplyToEntity [Entity] where
   eMap    f es = L.map f es
   eFilter p es = L.filter p es


isPlayer :: Entity -> Bool
isPlayer Player {} = True
isPlayer _         = False

isEnemy :: Entity -> Bool
isEnemy Enemy {} = True
isEnemy _        = False

isStar :: Entity -> Bool
isStar Star {} = True
isStar _       = False

isPlatform :: Entity -> Bool
isPlatform Platform {} = True
isPlatform _           = False