packages feed

gore-and-ash-demo-1.0.0.0: src/client/Game/Bullet.hs

{-# OPTIONS_GHC -fno-warn-orphans #-}
module Game.Bullet(
    module ReExport
  , bulletActor
  ) where

import Control.Wire 
import Prelude hiding (id, (.))

import Game.Bullet.Data as ReExport
import Game.Core 
import Game.Data 

import Game.GoreAndAsh
import Game.GoreAndAsh.Sync 
import Game.GoreAndAsh.Actor
import Game.GoreAndAsh.Network 

import Graphics.Bullet

instance RemoteActor BulletId Bullet where
  type RemoteActorState BulletId = Bullet
  type RemoteActorId Bullet = BulletId

bulletActor :: Peer -> BulletId -> AppActor BulletId Game Bullet 
bulletActor peer i = makeFixedActor i $ stateWire initalBullet mainController
  where
  initalBullet = Bullet {
      bulletId = i
    , bulletPos = 0
    , bulletVel = 0
    , bulletOwner = fromCounter (-1)
    }

  mainController :: AppWire (Game, Bullet) Bullet
  mainController = proc (g, b) -> do
    liftGameMonad3 renderBullet -< (bulletPos b, bulletVel b, gameCamera g)
    forceNF . clientSync bulletSync peer i -< b

  bulletSync :: FullSync AppMonad BulletId Bullet
  bulletSync = Bullet 
    <$> pure i 
    <*> serverSide 0 bulletPos 
    <*> serverSide 1 bulletVel 
    <*> serverSide 2 bulletOwner