{-|
Module      : Database
Description : Tipos de Dados utilizados para o jogo. 
Copyright   : Bárbara Dias de Sena, 2020
License     : GPL-3
Maintainer  : babi.dias.sena@hotmail.com
Stability   : experimental
Portability : GHC

Contém todos os tipos de dados que compõem o jogo.
-}

module Database where

import Graphics.Gloss


-- | Tamanho do lado de um bloco de peça.
tam :: Float
tam :: Float
tam = 20


-- | Limites do jogo.
limiteX, limiteY :: Float
limiteX :: Float
limiteX = 140
limiteY :: Float
limiteY = 280


-- | Uma coordenada (x, y).
type Coord = (Float, Float)


-- | Tipo da peça baseado no Tetraminó.
data Tetramino = I | L | J | T | O | Z | S
  deriving (Tetramino -> Tetramino -> Bool
(Tetramino -> Tetramino -> Bool)
-> (Tetramino -> Tetramino -> Bool) -> Eq Tetramino
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Tetramino -> Tetramino -> Bool
$c/= :: Tetramino -> Tetramino -> Bool
== :: Tetramino -> Tetramino -> Bool
$c== :: Tetramino -> Tetramino -> Bool
Eq, Int -> Tetramino
Tetramino -> Int
Tetramino -> [Tetramino]
Tetramino -> Tetramino
Tetramino -> Tetramino -> [Tetramino]
Tetramino -> Tetramino -> Tetramino -> [Tetramino]
(Tetramino -> Tetramino)
-> (Tetramino -> Tetramino)
-> (Int -> Tetramino)
-> (Tetramino -> Int)
-> (Tetramino -> [Tetramino])
-> (Tetramino -> Tetramino -> [Tetramino])
-> (Tetramino -> Tetramino -> [Tetramino])
-> (Tetramino -> Tetramino -> Tetramino -> [Tetramino])
-> Enum Tetramino
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: Tetramino -> Tetramino -> Tetramino -> [Tetramino]
$cenumFromThenTo :: Tetramino -> Tetramino -> Tetramino -> [Tetramino]
enumFromTo :: Tetramino -> Tetramino -> [Tetramino]
$cenumFromTo :: Tetramino -> Tetramino -> [Tetramino]
enumFromThen :: Tetramino -> Tetramino -> [Tetramino]
$cenumFromThen :: Tetramino -> Tetramino -> [Tetramino]
enumFrom :: Tetramino -> [Tetramino]
$cenumFrom :: Tetramino -> [Tetramino]
fromEnum :: Tetramino -> Int
$cfromEnum :: Tetramino -> Int
toEnum :: Int -> Tetramino
$ctoEnum :: Int -> Tetramino
pred :: Tetramino -> Tetramino
$cpred :: Tetramino -> Tetramino
succ :: Tetramino -> Tetramino
$csucc :: Tetramino -> Tetramino
Enum)


-- | Cada peça é composta por um tipo (Tetraminó), uma cor, um foco e os blocos que a compõem.
data Peca = Peca { Peca -> Tetramino
tipo       :: Tetramino
                 , Peca -> Color
cor        :: Color
                 , Peca -> Coord
foco       :: Coord
                 , Peca -> [Coord]
blocosPeca :: [Coord] }
  deriving Peca -> Peca -> Bool
(Peca -> Peca -> Bool) -> (Peca -> Peca -> Bool) -> Eq Peca
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Peca -> Peca -> Bool
$c/= :: Peca -> Peca -> Bool
== :: Peca -> Peca -> Bool
$c== :: Peca -> Peca -> Bool
Eq


-- | Um mundo é composto por seus blocos, uma peça ativa, uma lista de próximas peças,
-- pontuação do jogo, um timer para aplicar a gravidade na peça, 
-- a quantidade de fileiras que foram completas na jogada, e uma flag de fim de jogo.
data Mundo = Mundo { Mundo -> [(Coord, Color)]
blocosPintados    :: [(Coord, Color)]
                   , Mundo -> Peca
pecaAtual         :: Peca
                   , Mundo -> [Tetramino]
proxPecas         :: [Tetramino]
                   , Mundo -> Int
pontuacao         :: Int
                   , Mundo -> Int
timer             :: Int
                   , Mundo -> Int
fileirasCompletas :: Int
                   , Mundo -> Bool
gameOver          :: Bool }
  deriving Mundo -> Mundo -> Bool
(Mundo -> Mundo -> Bool) -> (Mundo -> Mundo -> Bool) -> Eq Mundo
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Mundo -> Mundo -> Bool
$c/= :: Mundo -> Mundo -> Bool
== :: Mundo -> Mundo -> Bool
$c== :: Mundo -> Mundo -> Bool
Eq


-- | A direção do movimento pode ser para esquerda, para direita, 
-- para baixo ou rotação da peça.
data Direcao = Dir | Esq | Baixo | Rotaciona


-- | Cria uma peça nova de acordo com o tipo.
criaPeca :: Tetramino -> Peca
criaPeca :: Tetramino -> Peca
criaPeca t :: Tetramino
t = 
  case Tetramino
t of
    I -> Tetramino -> Color -> Coord -> [Coord] -> Peca
Peca Tetramino
I Color
cyan   Coord
f [(Float
x, Float
yFloat -> Float -> Float
forall a. Num a => a -> a -> a
-Float
tam), Coord
f, (Float
x, Float
yFloat -> Float -> Float
forall a. Num a => a -> a -> a
+Float
tam), (Float
x,   Float
yFloat -> Float -> Float
forall a. Num a => a -> a -> a
+2Float -> Float -> Float
forall a. Num a => a -> a -> a
*Float
tam)]
    L -> Tetramino -> Color -> Coord -> [Coord] -> Peca
Peca Tetramino
L Color
orange Coord
f [(Float
x, Float
yFloat -> Float -> Float
forall a. Num a => a -> a -> a
+Float
tam), Coord
f, (Float
x, Float
yFloat -> Float -> Float
forall a. Num a => a -> a -> a
-Float
tam), (Float
xFloat -> Float -> Float
forall a. Num a => a -> a -> a
+Float
tam, Float
yFloat -> Float -> Float
forall a. Num a => a -> a -> a
-Float
tam)]
    J -> Tetramino -> Color -> Coord -> [Coord] -> Peca
Peca Tetramino
J Color
blue   Coord
f [(Float
x, Float
yFloat -> Float -> Float
forall a. Num a => a -> a -> a
+Float
tam), Coord
f, (Float
x, Float
yFloat -> Float -> Float
forall a. Num a => a -> a -> a
-Float
tam), (Float
xFloat -> Float -> Float
forall a. Num a => a -> a -> a
-Float
tam, Float
yFloat -> Float -> Float
forall a. Num a => a -> a -> a
-Float
tam)]
    T -> Tetramino -> Color -> Coord -> [Coord] -> Peca
Peca Tetramino
T Color
violet Coord
f [(Float
xFloat -> Float -> Float
forall a. Num a => a -> a -> a
-Float
tam, Float
y), Coord
f, (Float
x, Float
yFloat -> Float -> Float
forall a. Num a => a -> a -> a
+Float
tam), (Float
xFloat -> Float -> Float
forall a. Num a => a -> a -> a
+Float
tam, Float
y    )]
    O -> Tetramino -> Color -> Coord -> [Coord] -> Peca
Peca Tetramino
O Color
yellow Coord
f [(Float
xFloat -> Float -> Float
forall a. Num a => a -> a -> a
-Float
tam, Float
y), Coord
f, (Float
x, Float
yFloat -> Float -> Float
forall a. Num a => a -> a -> a
-Float
tam), (Float
xFloat -> Float -> Float
forall a. Num a => a -> a -> a
-Float
tam, Float
yFloat -> Float -> Float
forall a. Num a => a -> a -> a
-Float
tam)]
    Z -> Tetramino -> Color -> Coord -> [Coord] -> Peca
Peca Tetramino
Z Color
red    Coord
f [(Float
xFloat -> Float -> Float
forall a. Num a => a -> a -> a
-Float
tam, Float
y), Coord
f, (Float
x, Float
yFloat -> Float -> Float
forall a. Num a => a -> a -> a
-Float
tam), (Float
xFloat -> Float -> Float
forall a. Num a => a -> a -> a
+Float
tam, Float
yFloat -> Float -> Float
forall a. Num a => a -> a -> a
-Float
tam)]
    S -> Tetramino -> Color -> Coord -> [Coord] -> Peca
Peca Tetramino
S Color
green  Coord
f [(Float
xFloat -> Float -> Float
forall a. Num a => a -> a -> a
+Float
tam, Float
y), Coord
f, (Float
x, Float
yFloat -> Float -> Float
forall a. Num a => a -> a -> a
-Float
tam), (Float
xFloat -> Float -> Float
forall a. Num a => a -> a -> a
-Float
tam, Float
yFloat -> Float -> Float
forall a. Num a => a -> a -> a
-Float
tam)]
    where f :: Coord
f@(x :: Float
x, y :: Float
y) = (0, Float
y')
          y' :: Float
y' = if Tetramino
t Tetramino -> Tetramino -> Bool
forall a. Eq a => a -> a -> Bool
== Tetramino
T
                  then 300
                  else 320