{-# LANGUAGE OverloadedStrings, DeriveGeneric #-}
|
|
module JSONDeser(readInput) where
|
|
|
|
import qualified Data.Set as Set
|
|
import Data.Maybe
|
|
import qualified Data.ByteString.Lazy as BS
|
|
import Data.Aeson
|
|
import GHC.Generics
|
|
import qualified Datatypes as DT
|
|
import LCG
|
|
|
|
|
|
data Cell = Cell { x :: Int, y :: Int}
|
|
deriving (Show, Generic)
|
|
|
|
data Unit = Unit { members :: [Cell], pivot :: Cell}
|
|
deriving (Show, Generic)
|
|
|
|
data Input = Input { id :: Int,
|
|
units :: [Unit],
|
|
width :: Int,
|
|
height :: Int,
|
|
filled :: [Cell],
|
|
sourceLength :: Int,
|
|
sourceSeeds :: [Int]
|
|
}
|
|
deriving (Show, Generic)
|
|
|
|
|
|
instance FromJSON Cell
|
|
instance ToJSON Cell
|
|
|
|
instance FromJSON Unit
|
|
instance ToJSON Unit
|
|
|
|
instance FromJSON Input
|
|
instance ToJSON Input
|
|
|
|
readInput :: BS.ByteString -> (Int,[(Int,DT.Game)])
|
|
readInput str = newGame (readInputInternal str)
|
|
|
|
readInputInternal :: BS.ByteString -> Input
|
|
readInputInternal str = if isJust result
|
|
then fromJust result
|
|
else error "Error during JSON parsing"
|
|
where
|
|
result = (decode str :: Maybe Input)
|
|
|
|
|
|
newGame :: Input -> (Int,[(Int,DT.Game)])
|
|
newGame input = (JSONDeser.id input, zip (sourceSeeds input) (map gameFromSeed (sourceSeeds input)))
|
|
where
|
|
gameFromSeed seed = DT.Game board (seedUnits seed input) (Set.empty :: Set.Set Int) 0 0
|
|
board = DT.Board w h filledel
|
|
w = width input
|
|
h = height input
|
|
filledel = Set.fromList (map cellConvVM (filled input))
|
|
|
|
seedUnits :: Int -> Input -> [DT.Unit]
|
|
seedUnits s input = map (\x -> uinput !! x ) unit_index
|
|
where
|
|
unit_index = lcg s (length (units input)) (sourceLength input)
|
|
uinput = map unitConvVM (units input)
|
|
|
|
cellConvVM :: Cell -> DT.Cell
|
|
cellConvVM (Cell x y) = (x,y)
|
|
|
|
unitConvVM :: Unit -> DT.Unit
|
|
unitConvVM unit = DT.Unit setcell (cellConvVM (pivot unit))
|
|
where
|
|
setcell = Set.fromList (map cellConvVM (members unit))
|
|
|