{-# LANGUAGE TemplateHaskell #-} module Gen where import Control.Monad.State(modify) import Data.Word import Data.Bits import Data.Binary import FVector import DeriveMod import Utils type Skill = Float type Tactic = FRange -> FRange data PlayerSkills = PlayerSkills { shootingskill :: Skill , passingskill :: Skill , speedskill :: Skill , controlskill :: Skill } deriving (Show, Read) $(deriveMods ''PlayerSkills) instance Binary Gen.PlayerSkills where put (PlayerSkills a b c d) = put a >> put b >> put c >> put d get = get >>= \a -> get >>= \b -> get >>= \c -> get >>= \d -> return (PlayerSkills a b c d) data PlPosition = Goalkeeper | Defender | Midfielder | Attacker deriving (Eq, Show, Read) instance Binary Gen.PlPosition where put Goalkeeper = putWord8 0 put Defender = putWord8 1 put Midfielder = putWord8 2 put Attacker = putWord8 3 get = do tag_ <- getWord8 case tag_ of 0 -> return Goalkeeper 1 -> return Defender 2 -> return Midfielder 3 -> return Attacker _ -> fail "no parse" isGoalkeeper p = genplpos p == Goalkeeper isDefender p = genplpos p == Defender isMidfielder p = genplpos p == Midfielder isAttacker p = genplpos p == Attacker data GenPlayer = GenPlayer { plnumber :: Int , plname :: String , genplpos :: PlPosition , plskills :: PlayerSkills } deriving (Show, Read) instance Binary Gen.GenPlayer where put (GenPlayer a b c d) = put a >> put b >> put c >> put d get = get >>= \a -> get >>= \b -> get >>= \c -> get >>= \d -> return (GenPlayer a b c d) type Color = (Word8, Word8, Word8) data GenFormation = GenFormation { tactics :: [Tactic] , playerorder :: (Int, Int, Int) } plPosToTactic :: [Int] -> Gen.Tactic plPosToTactic ps = \b -> plpoint (ballrectangle b) ps ballrectangle :: (Float, Float) -> Int ballrectangle (bx, by) = y * 5 + x where x = clamp 0 4 $ floor $ (1 - bx) * 5 y = clamp 0 6 $ floor $ by * 7 plpoint :: Int -> [Int] -> FRange plpoint br ts = let pn = ts !! (min 34 br) xp = pn `shiftR` 4 yp = pn .&. 0x0F x = 1 - fromIntegral xp * (1/15) y = fromIntegral yp * (1/16) in (x, y) simpleFormationToGenFormation :: SimpleFormation -> GenFormation simpleFormationToGenFormation st = let ds = simpleorder st ts = map plPosToTactic (simpletactics st) in GenFormation ts ds data SimpleFormation = SimpleFormation { simpletactics :: [[Int]] , simpleorder :: (Int, Int, Int) } deriving (Show, Read) instance Binary Gen.SimpleFormation where put (SimpleFormation a b) = put a >> put b get = get >>= \a -> get >>= \b -> return (SimpleFormation a b) data Kit = Kit { kittype :: Int , kitfirstcolor :: Color , kitsecondcolor :: Color , kitshortcolor :: Color , kitsockscolor :: Color } deriving (Show, Read) instance Binary Gen.Kit where put (Kit a b c d e) = put a >> put b >> put c >> put d >> put e get = get >>= \a -> get >>= \b -> get >>= \c -> get >>= \d -> get >>= \e -> return (Kit a b c d e) data GenTeam = GenTeam { teamnation :: Int , genteamname :: String , teamtactics :: (Int, Int, Int) , teamdivision :: Int , primarykit :: Kit , teamplayers :: [GenPlayer] } deriving (Show, Read) instance Binary Gen.GenTeam where put (GenTeam a b c d e f) = put a >> put b >> put c >> put d >> put e >> put f get = get >>= \a -> get >>= \b -> get >>= \c -> get >>= \d -> get >>= \e -> get >>= \f -> return (GenTeam a b c d e f) grey, white, black, orange, red, blue, brown, lightblue, green, yellow :: Color grey = (128, 128, 128) white = (255, 255, 255) black = (0, 0, 0) orange = (255, 127, 0) red = (255, 0, 0) blue = (0, 0, 255) brown = (150, 75, 0) lightblue = (173, 216, 230) green = (0, 255, 0) yellow = (255, 255, 0) allColors = [grey, white, black, orange, red, blue, brown, lightblue, green, yellow]