Skip to content

aztecs-hs/aztecs

Repository files navigation

Aztecs

Discord License Package CI status

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]

Examples

Features

  • 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 ()

Inspiration

Aztecs' approach to type-safety is inspired by Bevy, but with direct archetype-based storage similar to Flecs.

About

A modular game engine and ECS for Haskell

Topics

Resources

License

Stars

Watchers

Forks

Sponsor this project

 

Packages

No packages published

Contributors 2

  •  
  •