A modular game engine and ECS for Haskell. An ECS is a modern approach to organizing your application state as a database, providing patterns for data-oriented design and parallel processing.
Aztecs: An Empirical Entity Component System (ECS) for Haskell [Draft]
- High-performance: Components are stored by their unique sets in archetypes
- Dynamic components: Scripts and remote interfaces can create runtime-specified components
- Type-safe DSL: Queries use
Applicative
syntax for compile-time gurantees - Modular design: Aztecs can be extended for a variety of use cases
newtype Position = Position Int deriving (Show)
newtype Velocity = Velocity Int deriving (Show)
setup ::
( MonadEntities m,
MonadAccess Position m,
MonadAccess Velocity m
) =>
m ()
setup = do
e <- spawn
A.insert e $ Position 0
A.insert e $ Velocity 1
move ::
( MonadEntities m,
MonadSystem (ComponentRef (PrimState m) Position) m,
MonadSystem (ComponentRef (PrimState m) Velocity) m,
MonadIO m,
PrimMonad m
) =>
m ()
move = do
q <- runQuery $ (,,) <$> entities <*> query <*> query
mapM_ go q
where
go (e, pRef, vRef) = do
Velocity v <- readComponentRef vRef
Position p <- readComponentRef pRef
writeComponentRef pRef (Position $ p + v)
p' <- readComponentRef pRef
liftIO $ print (e, p')
main :: IO ()
main = do
(((_, ps), vs), es) <- runEntitiesT (runAccessT (runAccessT setup S.empty) S.empty) emptyEntityCounter
vs' <- S.thaw vs
ps' <- S.thaw ps
_ <- runEntitiesT (runSystemT (runSystemT move vs') ps') es
return ()
Aztecs' approach to type-safety is inspired by Bevy, but with direct archetype-based storage similar to Flecs.