packages feed

gore-and-ash-demo-1.0.0.0: src/server/Game/Data.hs

{-# OPTIONS_GHC -fno-warn-orphans #-}
module Game.Data(
    Game(..)
  , GameMessage(..)
  , PlayerMap
  , PlayerPeerMap
  , BulletsMap
  -- | Helpers
  , isGameSpawnBullet
  , isGameDeleteBullet
  ) where

import Control.DeepSeq
import GHC.Generics (Generic)
import Prelude hiding (id, (.))
import qualified Data.HashMap.Strict as H 
import Linear 

import Game.Bullet.Data
import Game.Player.Data
import Game.Shared

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

type PlayerMap = H.HashMap PlayerId Player
type PlayerPeerMap = H.HashMap Peer PlayerId 
type BulletsMap = H.HashMap BulletId Bullet 

-- | Server local messages to game actor
data GameMessage = 
    -- | Spawn bullet at given pos with given velocity and owner
    GameSpawnBullet !(V2 Double) !(V2 Double) !PlayerId 
    -- | Deletes bullet with specified id
  | GameDeleteBullet !BulletId
  deriving (Generic, Show)

instance ActorMessage GameId where
  type ActorMessageType GameId = GameMessage 
  toCounter = unGameId
  fromCounter = GameId

instance NetworkMessage GameId where 
  type NetworkMessageType GameId = GameNetMessage

data Game = Game {
  gameId :: !GameId
, gamePlayers :: !PlayerMap
, gamePlayerPeers :: !PlayerPeerMap
, gameBullets :: !BulletsMap
, gameBulletColId :: !RemActorCollId 
, gamePlayerColId :: !RemActorCollId
} deriving (Generic)

instance NFData Game 

-- | Detect specific message
isGameSpawnBullet :: GameMessage -> Bool
isGameSpawnBullet m = case m of 
  GameSpawnBullet _ _ _ -> True
  _ -> False

-- | Detect specific message
isGameDeleteBullet :: GameMessage -> Bool
isGameDeleteBullet m = case m of 
  GameDeleteBullet _ -> True
  _ -> False