mischief-ecs
Safe HaskellNone
LanguageGHC2024

Mischief.ECS

Description

This library contains the ECS used by the Mischief Game Engine.

Synopsis

LLM Disclaimer

No LLM / AI was used in making Mischief. Now and forever.

What is Mischief?

Mischief has various meanings. It can be a group of rats. Or it can refer to being naughty and playful.

This Mischief, however, is an open-source ECS Game Engine! In other words...

Mischief :: Entity -> Component c => System ()

Mischief takes great inspiration from Bevy and Flecs, and was written in 100% Haskell, taking advantage of its great ergonomics and strong type system. It is a refreshing spin on the functional and data-driven paradigms.

Package

This package contains only mischief-ecs, the ECS at the core of Mischief. Other packages, such as mischief-input, mischief-assets, mischief-render are planned, but haven't yet been developed to the same level as the ECS itself.

Design Goals

These are the main design goals of Mischief:

  • Ergonomic and Accessible. Mischief's main purpose is to provide a very clean, intuitive, inherently opinionated, high-level API. This is the main way we differentiate ourselves from other ECS's. Learning to use Mischief should be a painless and intuitive process.
  • Functional and Data Driven. We strive to find a balance between functional programming and data-driven design. These are two concepts that don't interact very often, but that both stand at the core of Msichief.
  • Modular. Mischief is meant to be modular, allowing you to plug packages in and out, whether they are made by us or a third party.

Highlights

Here are some highlights of Mischief:

  • Highly Dynamic . Want to disable a system? Despawn it!
  • Fancy Queries. Complete with transitive queries and filters.
  • Quasi-Queries. Scripting language for writing queries.
  • Rich Systems. Monadic Systems? Yes please.
  • Book. Mischief has its very own book! See below.
  • Relationships. Bob Likes Charlie.
  • Events.
  • And much much more..

Performance

Performance-wise, Mischief still has a long way to go; there are many easy performance gains that we have just been too busy to implement, as we've been mostly focusing on ergonomics, modularity, and ease-of-use. This is a pretty strong Archetype ECS however, and it is possible to bring it to about the same asymptotic performance as Bevy or Flecs, although there will probably always be a layer of indirection (or 20) that makes it a bit slower, due to the high-level, boxed, nature of Haskell.

Learn You an ECS for Great Mischief!

In order to learn how to use Mischief, you can read through the official book:

  1. Startup Guide
  2. Coding a Dungeon Game
  3. App and Plugins
  4. Components
  5. Relationships
  6. Queries
  7. Systems
  8. Events and Messages

class Collectable v storage where Source #

Methods

collect :: v -> storage Source #

Instances

Instances details
EraseIntoStorage v storage => Collectable v storage Source # 
Instance details

Defined in Mischief.ECS.Collectable

Methods

collect :: v -> storage Source #

(Semigroup s, Collectable a0 s, Collectable a1 s) => Collectable (a0, a1) s Source # 
Instance details

Defined in Mischief.ECS.Collectable

Methods

collect :: (a0, a1) -> s Source #

(Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s) => Collectable (a0, a1, a2) s Source # 
Instance details

Defined in Mischief.ECS.Collectable

Methods

collect :: (a0, a1, a2) -> s Source #

(Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s, Collectable a3 s) => Collectable (a0, a1, a2, a3) s Source # 
Instance details

Defined in Mischief.ECS.Collectable

Methods

collect :: (a0, a1, a2, a3) -> s Source #

(Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s, Collectable a3 s, Collectable a4 s) => Collectable (a0, a1, a2, a3, a4) s Source # 
Instance details

Defined in Mischief.ECS.Collectable

Methods

collect :: (a0, a1, a2, a3, a4) -> s Source #

(Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s, Collectable a3 s, Collectable a4 s, Collectable a5 s) => Collectable (a0, a1, a2, a3, a4, a5) s Source # 
Instance details

Defined in Mischief.ECS.Collectable

Methods

collect :: (a0, a1, a2, a3, a4, a5) -> s Source #

(Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s, Collectable a3 s, Collectable a4 s, Collectable a5 s, Collectable a6 s) => Collectable (a0, a1, a2, a3, a4, a5, a6) s Source # 
Instance details

Defined in Mischief.ECS.Collectable

Methods

collect :: (a0, a1, a2, a3, a4, a5, a6) -> s Source #

(Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s, Collectable a3 s, Collectable a4 s, Collectable a5 s, Collectable a6 s, Collectable a7 s) => Collectable (a0, a1, a2, a3, a4, a5, a6, a7) s Source # 
Instance details

Defined in Mischief.ECS.Collectable

Methods

collect :: (a0, a1, a2, a3, a4, a5, a6, a7) -> s Source #

(Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s, Collectable a3 s, Collectable a4 s, Collectable a5 s, Collectable a6 s, Collectable a7 s, Collectable a8 s) => Collectable (a0, a1, a2, a3, a4, a5, a6, a7, a8) s Source # 
Instance details

Defined in Mischief.ECS.Collectable

Methods

collect :: (a0, a1, a2, a3, a4, a5, a6, a7, a8) -> s Source #

(Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s, Collectable a3 s, Collectable a4 s, Collectable a5 s, Collectable a6 s, Collectable a7 s, Collectable a8 s, Collectable a9 s) => Collectable (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) s Source # 
Instance details

Defined in Mischief.ECS.Collectable

Methods

collect :: (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) -> s Source #

(Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s, Collectable a3 s, Collectable a4 s, Collectable a5 s, Collectable a6 s, Collectable a7 s, Collectable a8 s, Collectable a9 s, Collectable a10 s) => Collectable (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) s Source # 
Instance details

Defined in Mischief.ECS.Collectable

Methods

collect :: (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) -> s Source #

(Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s, Collectable a3 s, Collectable a4 s, Collectable a5 s, Collectable a6 s, Collectable a7 s, Collectable a8 s, Collectable a9 s, Collectable a10 s, Collectable a11 s) => Collectable (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) s Source # 
Instance details

Defined in Mischief.ECS.Collectable

Methods

collect :: (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) -> s Source #

(Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s, Collectable a3 s, Collectable a4 s, Collectable a5 s, Collectable a6 s, Collectable a7 s, Collectable a8 s, Collectable a9 s, Collectable a10 s, Collectable a11 s, Collectable a12 s) => Collectable (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) s Source # 
Instance details

Defined in Mischief.ECS.Collectable

Methods

collect :: (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) -> s Source #

(Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s, Collectable a3 s, Collectable a4 s, Collectable a5 s, Collectable a6 s, Collectable a7 s, Collectable a8 s, Collectable a9 s, Collectable a10 s, Collectable a11 s, Collectable a12 s, Collectable a13 s) => Collectable (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) s Source # 
Instance details

Defined in Mischief.ECS.Collectable

Methods

collect :: (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) -> s Source #

(Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s, Collectable a3 s, Collectable a4 s, Collectable a5 s, Collectable a6 s, Collectable a7 s, Collectable a8 s, Collectable a9 s, Collectable a10 s, Collectable a11 s, Collectable a12 s, Collectable a13 s, Collectable a14 s) => Collectable (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) s Source # 
Instance details

Defined in Mischief.ECS.Collectable

Methods

collect :: (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) -> s Source #

class Semigroup s => EraseIntoStorage v s where Source #

Methods

erase :: v -> s Source #

Instances

Instances details
EraseIntoStorage QueryFilter QueryFilter Source # 
Instance details

Defined in Mischief.ECS.World.Query.QueryFilter

EraseIntoStorage () Plugins Source # 
Instance details

Defined in Mischief.ECS.App.Plugins

Methods

erase :: () -> Plugins Source #

Plugin p => EraseIntoStorage p Plugins Source # 
Instance details

Defined in Mischief.ECS.App.Plugins

Methods

erase :: p -> Plugins Source #

IntoQueryFilter q => EraseIntoStorage q QueryFilter Source # 
Instance details

Defined in Mischief.ECS.World.Query.QueryFilter

Methods

erase :: q -> QueryFilter Source #

EraseIntoStorage () (BundleData ErasedComponent) Source # 
Instance details

Defined in Mischief.ECS.Components

Component c => EraseIntoStorage c (BundleData ErasedComponent) Source # 
Instance details

Defined in Mischief.ECS.Components

(Component c, Eq c) => EraseIntoStorage c (BundleData ErasedComponentEq) Source # 
Instance details

Defined in Mischief.ECS.Components

EraseIntoStorage (BundleData ErasedComponent) (BundleData ErasedComponent) Source # 
Instance details

Defined in Mischief.ECS.Components

Component c => EraseIntoStorage (Rel c) (BundleData ErasedComponent) Source # 
Instance details

Defined in Mischief.ECS.Components

(Component c, Eq c) => EraseIntoStorage (Rel c) (BundleData ErasedComponentEq) Source # 
Instance details

Defined in Mischief.ECS.Components

EraseIntoStorage (System ()) [System ()] Source # 
Instance details

Defined in Mischief.ECS.World

Methods

erase :: System () -> [System ()] Source #

Component c => EraseIntoStorage (C c) FilterType Source # 
Instance details

Defined in Mischief.ECS.World.Query.QueryFilter

Methods

erase :: C c -> FilterType Source #

Component c => EraseIntoStorage (C c, c -> Bool) CheckFilterType Source # 
Instance details

Defined in Mischief.ECS.World.Query.QueryFilter

Methods

erase :: (C c, c -> Bool) -> CheckFilterType Source #

Component c => EraseIntoStorage (R c Entity, c -> Bool) CheckFilterType Source # 
Instance details

Defined in Mischief.ECS.World.Query.QueryFilter

Methods

erase :: (R c Entity, c -> Bool) -> CheckFilterType Source #

Component c => EraseIntoStorage (R c Any, c -> Bool) CheckFilterType Source # 
Instance details

Defined in Mischief.ECS.World.Query.QueryFilter

Methods

erase :: (R c Any, c -> Bool) -> CheckFilterType Source #

EraseIntoStorage (Hooks c) (Hooks c) Source # 
Instance details

Defined in Mischief.ECS.Hooks

Methods

erase :: Hooks c -> Hooks c Source #

Event (e c) => EraseIntoStorage (e c -> System ()) (Hooks c) Source # 
Instance details

Defined in Mischief.ECS.Hooks

Methods

erase :: (e c -> System ()) -> Hooks c Source #

Component c => EraseIntoStorage (R c Entity) FilterType Source # 
Instance details

Defined in Mischief.ECS.World.Query.QueryFilter

Methods

erase :: R c Entity -> FilterType Source #

Component c => EraseIntoStorage (R c Any) FilterType Source # 
Instance details

Defined in Mischief.ECS.World.Query.QueryFilter

Methods

erase :: R c Any -> FilterType Source #

class Typeable m => Message (m :: k) Source #

Message typeclass.

data TestTest Source #

Constructors

TestTest