module Types.Entity where

import Data.Ecstasy

import Linear (V2)

import Types.Direction
import Types.Map
import Types.NPCState
import Types.Animation
import Types.ObjType
import Types.ReachPoint

data Entity f = Entity
  { pos                :: Component f 'Field (V2 Double)
  , mmpos              :: Component f 'Field (V2 Double)
  , gridPos            :: Component f 'Field (V2 Int)
  , vel                :: Component f 'Field (V2 Double)
  , xyvel              :: Component f 'Field (V2 Double)
  , mmvel              :: Component f 'Field (V2 Double)
  , velFact            :: Component f 'Field Double
  , rot                :: Component f 'Field Direction
  , obstacle           :: Component f 'Field (Boundaries Double)
  , player             :: Component f 'Unique ()
  , npcMoveState       :: Component f 'Field NPCMoveState
  , npcWorkplace       :: Component f 'Field ReachPoint
  , npcActionState     :: Component f 'Field NPCActionState
  , npcStats           :: Component f 'Field NPCStats
  , anim               :: Component f 'Field AnimState
  , objAccess          :: Component f 'Field ((V2 Int), Direction)
  , objType            :: Component f 'Field ObjType
  , objState           :: Component f 'Field ObjState
  , objStateTime       :: Component f 'Field Double
  , objUsedBy          :: Component f 'Field Ent
  , objPlayerActivated :: Component f 'Field Bool
  , objSolved          :: Component f 'Field Bool
  }
  deriving (Generic)
