packages feed

mischief-ecs-0.2.0.0: examples/Startup.hs

module Main where

import Mischief.ECS

main :: IO ()
main = do
  app <- newApp
  addPlugin @MyPlugin app
  runApp app

data MyPlugin

instance Plugin MyPlugin where
  init = do
    systems (helloWorld, greetPeople, showLikes)
      & schedule @Update

    systems addPeople
      & schedule @Startup

    systems updateFlo
      & before (greetPeople, showLikes)
      & schedule @Update

    insertRes (Greeting "Hey")

helloWorld :: System ()
helloWorld = info "Hello World!"

data Person = Person deriving (Component)

addPeople :: System ()
addPeople = do
  kim <- spawn (Person, Name "Kimberly")
  nick <- spawn (Person, Name "Nicholas")
  flo <- spawn (Person, Name "Florian")

  insert (Rel Likes kim) flo
  insert (Rel Likes nick, Rel Likes flo) kim

greetPeople :: System ()
greetPeople = do
  Just greeting <- res @Greeting

  [q|Name / With Person|]
    & qinfo (\name -> [i|#{greeting} #{name}!|])
    & query_

updateFlo :: System ()
updateFlo = do
  [q|Name / With Person|]
    & qfilter (== Name "Florian")
    & qinsert (\_ -> Name "Florianne")
    & query_

data Greeting = Greeting String deriving (Component)

instance Show Greeting where
  show (Greeting a) = a

data Likes = Likes deriving (Component)

showLikes :: System ()
showLikes = do
  [q|Name, Likes -> (Name)|]
    & qinfo (\(name, likes) -> [i|#{name} likes #{likes}|])
    & query_