{-|
Module      : Labs2025
Description : Tipos de dados do jogo.

Módulo com os tipos de dados que vão ser utilizados para modelar as tarefas do trabalho prático de LI1/LP1 em 2025/26.
-}

-- | 
module Labs2025
    ( module Labs2025
    , module Tarefa0_geral
    ) where

import Tarefa0_geral

-- | Um tipo de terreno do mapa.
data Terreno
    -- | Terreno vazio.
    = Ar
    -- | Terreno que afoga minhocas.
    | Agua
    -- | Terreno opaco e destrutivel.
    | Terra
    -- | Terreno opaco e indestrutivel.
    | Pedra
    deriving (Terreno -> Terreno -> Bool
(Terreno -> Terreno -> Bool)
-> (Terreno -> Terreno -> Bool) -> Eq Terreno
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Terreno -> Terreno -> Bool
== :: Terreno -> Terreno -> Bool
$c/= :: Terreno -> Terreno -> Bool
/= :: Terreno -> Terreno -> Bool
Eq,Eq Terreno
Eq Terreno =>
(Terreno -> Terreno -> Ordering)
-> (Terreno -> Terreno -> Bool)
-> (Terreno -> Terreno -> Bool)
-> (Terreno -> Terreno -> Bool)
-> (Terreno -> Terreno -> Bool)
-> (Terreno -> Terreno -> Terreno)
-> (Terreno -> Terreno -> Terreno)
-> Ord Terreno
Terreno -> Terreno -> Bool
Terreno -> Terreno -> Ordering
Terreno -> Terreno -> Terreno
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Terreno -> Terreno -> Ordering
compare :: Terreno -> Terreno -> Ordering
$c< :: Terreno -> Terreno -> Bool
< :: Terreno -> Terreno -> Bool
$c<= :: Terreno -> Terreno -> Bool
<= :: Terreno -> Terreno -> Bool
$c> :: Terreno -> Terreno -> Bool
> :: Terreno -> Terreno -> Bool
$c>= :: Terreno -> Terreno -> Bool
>= :: Terreno -> Terreno -> Bool
$cmax :: Terreno -> Terreno -> Terreno
max :: Terreno -> Terreno -> Terreno
$cmin :: Terreno -> Terreno -> Terreno
min :: Terreno -> Terreno -> Terreno
Ord,Int -> Terreno -> ShowS
[Terreno] -> ShowS
Terreno -> String
(Int -> Terreno -> ShowS)
-> (Terreno -> String) -> ([Terreno] -> ShowS) -> Show Terreno
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Terreno -> ShowS
showsPrec :: Int -> Terreno -> ShowS
$cshow :: Terreno -> String
show :: Terreno -> String
$cshowList :: [Terreno] -> ShowS
showList :: [Terreno] -> ShowS
Show,ReadPrec [Terreno]
ReadPrec Terreno
Int -> ReadS Terreno
ReadS [Terreno]
(Int -> ReadS Terreno)
-> ReadS [Terreno]
-> ReadPrec Terreno
-> ReadPrec [Terreno]
-> Read Terreno
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Terreno
readsPrec :: Int -> ReadS Terreno
$creadList :: ReadS [Terreno]
readList :: ReadS [Terreno]
$creadPrec :: ReadPrec Terreno
readPrec :: ReadPrec Terreno
$creadListPrec :: ReadPrec [Terreno]
readListPrec :: ReadPrec [Terreno]
Read,Int -> Terreno
Terreno -> Int
Terreno -> [Terreno]
Terreno -> Terreno
Terreno -> Terreno -> [Terreno]
Terreno -> Terreno -> Terreno -> [Terreno]
(Terreno -> Terreno)
-> (Terreno -> Terreno)
-> (Int -> Terreno)
-> (Terreno -> Int)
-> (Terreno -> [Terreno])
-> (Terreno -> Terreno -> [Terreno])
-> (Terreno -> Terreno -> [Terreno])
-> (Terreno -> Terreno -> Terreno -> [Terreno])
-> Enum Terreno
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: Terreno -> Terreno
succ :: Terreno -> Terreno
$cpred :: Terreno -> Terreno
pred :: Terreno -> Terreno
$ctoEnum :: Int -> Terreno
toEnum :: Int -> Terreno
$cfromEnum :: Terreno -> Int
fromEnum :: Terreno -> Int
$cenumFrom :: Terreno -> [Terreno]
enumFrom :: Terreno -> [Terreno]
$cenumFromThen :: Terreno -> Terreno -> [Terreno]
enumFromThen :: Terreno -> Terreno -> [Terreno]
$cenumFromTo :: Terreno -> Terreno -> [Terreno]
enumFromTo :: Terreno -> Terreno -> [Terreno]
$cenumFromThenTo :: Terreno -> Terreno -> Terreno -> [Terreno]
enumFromThenTo :: Terreno -> Terreno -> Terreno -> [Terreno]
Enum)

-- | O mapa do jogo é uma matriz de terrenos.
type Mapa = Matriz Terreno

-- | Os diversos tipos de arma disponíveis para uma minhoca.
data TipoArma = Jetpack | Escavadora | Bazuca | Mina | Dinamite
    deriving (TipoArma -> TipoArma -> Bool
(TipoArma -> TipoArma -> Bool)
-> (TipoArma -> TipoArma -> Bool) -> Eq TipoArma
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TipoArma -> TipoArma -> Bool
== :: TipoArma -> TipoArma -> Bool
$c/= :: TipoArma -> TipoArma -> Bool
/= :: TipoArma -> TipoArma -> Bool
Eq,Eq TipoArma
Eq TipoArma =>
(TipoArma -> TipoArma -> Ordering)
-> (TipoArma -> TipoArma -> Bool)
-> (TipoArma -> TipoArma -> Bool)
-> (TipoArma -> TipoArma -> Bool)
-> (TipoArma -> TipoArma -> Bool)
-> (TipoArma -> TipoArma -> TipoArma)
-> (TipoArma -> TipoArma -> TipoArma)
-> Ord TipoArma
TipoArma -> TipoArma -> Bool
TipoArma -> TipoArma -> Ordering
TipoArma -> TipoArma -> TipoArma
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: TipoArma -> TipoArma -> Ordering
compare :: TipoArma -> TipoArma -> Ordering
$c< :: TipoArma -> TipoArma -> Bool
< :: TipoArma -> TipoArma -> Bool
$c<= :: TipoArma -> TipoArma -> Bool
<= :: TipoArma -> TipoArma -> Bool
$c> :: TipoArma -> TipoArma -> Bool
> :: TipoArma -> TipoArma -> Bool
$c>= :: TipoArma -> TipoArma -> Bool
>= :: TipoArma -> TipoArma -> Bool
$cmax :: TipoArma -> TipoArma -> TipoArma
max :: TipoArma -> TipoArma -> TipoArma
$cmin :: TipoArma -> TipoArma -> TipoArma
min :: TipoArma -> TipoArma -> TipoArma
Ord,Int -> TipoArma -> ShowS
[TipoArma] -> ShowS
TipoArma -> String
(Int -> TipoArma -> ShowS)
-> (TipoArma -> String) -> ([TipoArma] -> ShowS) -> Show TipoArma
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TipoArma -> ShowS
showsPrec :: Int -> TipoArma -> ShowS
$cshow :: TipoArma -> String
show :: TipoArma -> String
$cshowList :: [TipoArma] -> ShowS
showList :: [TipoArma] -> ShowS
Show,ReadPrec [TipoArma]
ReadPrec TipoArma
Int -> ReadS TipoArma
ReadS [TipoArma]
(Int -> ReadS TipoArma)
-> ReadS [TipoArma]
-> ReadPrec TipoArma
-> ReadPrec [TipoArma]
-> Read TipoArma
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS TipoArma
readsPrec :: Int -> ReadS TipoArma
$creadList :: ReadS [TipoArma]
readList :: ReadS [TipoArma]
$creadPrec :: ReadPrec TipoArma
readPrec :: ReadPrec TipoArma
$creadListPrec :: ReadPrec [TipoArma]
readListPrec :: ReadPrec [TipoArma]
Read,Int -> TipoArma
TipoArma -> Int
TipoArma -> [TipoArma]
TipoArma -> TipoArma
TipoArma -> TipoArma -> [TipoArma]
TipoArma -> TipoArma -> TipoArma -> [TipoArma]
(TipoArma -> TipoArma)
-> (TipoArma -> TipoArma)
-> (Int -> TipoArma)
-> (TipoArma -> Int)
-> (TipoArma -> [TipoArma])
-> (TipoArma -> TipoArma -> [TipoArma])
-> (TipoArma -> TipoArma -> [TipoArma])
-> (TipoArma -> TipoArma -> TipoArma -> [TipoArma])
-> Enum TipoArma
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: TipoArma -> TipoArma
succ :: TipoArma -> TipoArma
$cpred :: TipoArma -> TipoArma
pred :: TipoArma -> TipoArma
$ctoEnum :: Int -> TipoArma
toEnum :: Int -> TipoArma
$cfromEnum :: TipoArma -> Int
fromEnum :: TipoArma -> Int
$cenumFrom :: TipoArma -> [TipoArma]
enumFrom :: TipoArma -> [TipoArma]
$cenumFromThen :: TipoArma -> TipoArma -> [TipoArma]
enumFromThen :: TipoArma -> TipoArma -> [TipoArma]
$cenumFromTo :: TipoArma -> TipoArma -> [TipoArma]
enumFromTo :: TipoArma -> TipoArma -> [TipoArma]
$cenumFromThenTo :: TipoArma -> TipoArma -> TipoArma -> [TipoArma]
enumFromThenTo :: TipoArma -> TipoArma -> TipoArma -> [TipoArma]
Enum)

-- | O estado de saúde de uma minhoca.
data VidaMinhoca
    -- | Está viva com um número inteiros de pontos de vida.
    = Viva Int
    -- | Está morta.
    | Morta
    deriving (VidaMinhoca -> VidaMinhoca -> Bool
(VidaMinhoca -> VidaMinhoca -> Bool)
-> (VidaMinhoca -> VidaMinhoca -> Bool) -> Eq VidaMinhoca
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: VidaMinhoca -> VidaMinhoca -> Bool
== :: VidaMinhoca -> VidaMinhoca -> Bool
$c/= :: VidaMinhoca -> VidaMinhoca -> Bool
/= :: VidaMinhoca -> VidaMinhoca -> Bool
Eq,Eq VidaMinhoca
Eq VidaMinhoca =>
(VidaMinhoca -> VidaMinhoca -> Ordering)
-> (VidaMinhoca -> VidaMinhoca -> Bool)
-> (VidaMinhoca -> VidaMinhoca -> Bool)
-> (VidaMinhoca -> VidaMinhoca -> Bool)
-> (VidaMinhoca -> VidaMinhoca -> Bool)
-> (VidaMinhoca -> VidaMinhoca -> VidaMinhoca)
-> (VidaMinhoca -> VidaMinhoca -> VidaMinhoca)
-> Ord VidaMinhoca
VidaMinhoca -> VidaMinhoca -> Bool
VidaMinhoca -> VidaMinhoca -> Ordering
VidaMinhoca -> VidaMinhoca -> VidaMinhoca
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: VidaMinhoca -> VidaMinhoca -> Ordering
compare :: VidaMinhoca -> VidaMinhoca -> Ordering
$c< :: VidaMinhoca -> VidaMinhoca -> Bool
< :: VidaMinhoca -> VidaMinhoca -> Bool
$c<= :: VidaMinhoca -> VidaMinhoca -> Bool
<= :: VidaMinhoca -> VidaMinhoca -> Bool
$c> :: VidaMinhoca -> VidaMinhoca -> Bool
> :: VidaMinhoca -> VidaMinhoca -> Bool
$c>= :: VidaMinhoca -> VidaMinhoca -> Bool
>= :: VidaMinhoca -> VidaMinhoca -> Bool
$cmax :: VidaMinhoca -> VidaMinhoca -> VidaMinhoca
max :: VidaMinhoca -> VidaMinhoca -> VidaMinhoca
$cmin :: VidaMinhoca -> VidaMinhoca -> VidaMinhoca
min :: VidaMinhoca -> VidaMinhoca -> VidaMinhoca
Ord,Int -> VidaMinhoca -> ShowS
[VidaMinhoca] -> ShowS
VidaMinhoca -> String
(Int -> VidaMinhoca -> ShowS)
-> (VidaMinhoca -> String)
-> ([VidaMinhoca] -> ShowS)
-> Show VidaMinhoca
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> VidaMinhoca -> ShowS
showsPrec :: Int -> VidaMinhoca -> ShowS
$cshow :: VidaMinhoca -> String
show :: VidaMinhoca -> String
$cshowList :: [VidaMinhoca] -> ShowS
showList :: [VidaMinhoca] -> ShowS
Show,ReadPrec [VidaMinhoca]
ReadPrec VidaMinhoca
Int -> ReadS VidaMinhoca
ReadS [VidaMinhoca]
(Int -> ReadS VidaMinhoca)
-> ReadS [VidaMinhoca]
-> ReadPrec VidaMinhoca
-> ReadPrec [VidaMinhoca]
-> Read VidaMinhoca
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS VidaMinhoca
readsPrec :: Int -> ReadS VidaMinhoca
$creadList :: ReadS [VidaMinhoca]
readList :: ReadS [VidaMinhoca]
$creadPrec :: ReadPrec VidaMinhoca
readPrec :: ReadPrec VidaMinhoca
$creadListPrec :: ReadPrec [VidaMinhoca]
readListPrec :: ReadPrec [VidaMinhoca]
Read)

-- | O estado completo de uma minhoca.
data Minhoca = Minhoca
    -- | Uma posição no mapa. Opcional porque a minhoca pode ter saído do mapa.
    { Minhoca -> Maybe Posicao
posicaoMinhoca :: Maybe Posicao
    -- | O estado de saúde da minhoca.
    , Minhoca -> VidaMinhoca
vidaMinhoca :: VidaMinhoca
    -- | Munições de @Jetpack@.
    , Minhoca -> Int
jetpackMinhoca :: Int
    -- | Munições de @Escavadora@.
    , Minhoca -> Int
escavadoraMinhoca :: Int
    -- | Munições de @Bazuca@.
    , Minhoca -> Int
bazucaMinhoca :: Int
    -- | Munições de @Mina@.
    , Minhoca -> Int
minaMinhoca :: Int
    -- | Munições de @Dinamite@.
    , Minhoca -> Int
dinamiteMinhoca :: Int
    }
    deriving (Minhoca -> Minhoca -> Bool
(Minhoca -> Minhoca -> Bool)
-> (Minhoca -> Minhoca -> Bool) -> Eq Minhoca
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Minhoca -> Minhoca -> Bool
== :: Minhoca -> Minhoca -> Bool
$c/= :: Minhoca -> Minhoca -> Bool
/= :: Minhoca -> Minhoca -> Bool
Eq,Eq Minhoca
Eq Minhoca =>
(Minhoca -> Minhoca -> Ordering)
-> (Minhoca -> Minhoca -> Bool)
-> (Minhoca -> Minhoca -> Bool)
-> (Minhoca -> Minhoca -> Bool)
-> (Minhoca -> Minhoca -> Bool)
-> (Minhoca -> Minhoca -> Minhoca)
-> (Minhoca -> Minhoca -> Minhoca)
-> Ord Minhoca
Minhoca -> Minhoca -> Bool
Minhoca -> Minhoca -> Ordering
Minhoca -> Minhoca -> Minhoca
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Minhoca -> Minhoca -> Ordering
compare :: Minhoca -> Minhoca -> Ordering
$c< :: Minhoca -> Minhoca -> Bool
< :: Minhoca -> Minhoca -> Bool
$c<= :: Minhoca -> Minhoca -> Bool
<= :: Minhoca -> Minhoca -> Bool
$c> :: Minhoca -> Minhoca -> Bool
> :: Minhoca -> Minhoca -> Bool
$c>= :: Minhoca -> Minhoca -> Bool
>= :: Minhoca -> Minhoca -> Bool
$cmax :: Minhoca -> Minhoca -> Minhoca
max :: Minhoca -> Minhoca -> Minhoca
$cmin :: Minhoca -> Minhoca -> Minhoca
min :: Minhoca -> Minhoca -> Minhoca
Ord,Int -> Minhoca -> ShowS
[Minhoca] -> ShowS
Minhoca -> String
(Int -> Minhoca -> ShowS)
-> (Minhoca -> String) -> ([Minhoca] -> ShowS) -> Show Minhoca
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Minhoca -> ShowS
showsPrec :: Int -> Minhoca -> ShowS
$cshow :: Minhoca -> String
show :: Minhoca -> String
$cshowList :: [Minhoca] -> ShowS
showList :: [Minhoca] -> ShowS
Show,ReadPrec [Minhoca]
ReadPrec Minhoca
Int -> ReadS Minhoca
ReadS [Minhoca]
(Int -> ReadS Minhoca)
-> ReadS [Minhoca]
-> ReadPrec Minhoca
-> ReadPrec [Minhoca]
-> Read Minhoca
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Minhoca
readsPrec :: Int -> ReadS Minhoca
$creadList :: ReadS [Minhoca]
readList :: ReadS [Minhoca]
$creadPrec :: ReadPrec Minhoca
readPrec :: ReadPrec Minhoca
$creadListPrec :: ReadPrec [Minhoca]
readListPrec :: ReadPrec [Minhoca]
Read)

-- | Um tick é a unidade de tempo do jogo.
type Ticks = Int

-- | O índice de uma minhoca na lista de minhocas.
type NumMinhoca = Int

-- | O índice de um objeto na lista de objetos.
type NumObjeto = Int

-- | Um objeto colocado no mapa.
data Objeto
    -- | Um disparo de uma arma.
    = Disparo
        -- | A posição do disparo no mapa.
        { Objeto -> Posicao
posicaoDisparo :: Posicao
        -- | A direção do disparo.
        , Objeto -> Direcao
direcaoDisparo :: Direcao
        -- | O tipo de arma do disparo.
        , Objeto -> TipoArma
tipoDisparo :: TipoArma
        -- O tempo até o disparo explodir. Opcional porque nem todos os disparos de todas as armas têm um tempo pré-definido para explodir.
        , Objeto -> Maybe Int
tempoDisparo :: Maybe Ticks
        -- | A minhoca que efetuou o disparo.
        , Objeto -> Int
donoDisparo :: NumMinhoca
        }
    -- | Um barril de pólvora.
    | Barril
        -- | A posição do barril no mapa.
        { Objeto -> Posicao
posicaoBarril :: Posicao
        -- | Se o barril está prestes a exploder ou não.
        , Objeto -> Bool
explodeBarril :: Bool
        }
    deriving (Objeto -> Objeto -> Bool
(Objeto -> Objeto -> Bool)
-> (Objeto -> Objeto -> Bool) -> Eq Objeto
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Objeto -> Objeto -> Bool
== :: Objeto -> Objeto -> Bool
$c/= :: Objeto -> Objeto -> Bool
/= :: Objeto -> Objeto -> Bool
Eq,Eq Objeto
Eq Objeto =>
(Objeto -> Objeto -> Ordering)
-> (Objeto -> Objeto -> Bool)
-> (Objeto -> Objeto -> Bool)
-> (Objeto -> Objeto -> Bool)
-> (Objeto -> Objeto -> Bool)
-> (Objeto -> Objeto -> Objeto)
-> (Objeto -> Objeto -> Objeto)
-> Ord Objeto
Objeto -> Objeto -> Bool
Objeto -> Objeto -> Ordering
Objeto -> Objeto -> Objeto
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Objeto -> Objeto -> Ordering
compare :: Objeto -> Objeto -> Ordering
$c< :: Objeto -> Objeto -> Bool
< :: Objeto -> Objeto -> Bool
$c<= :: Objeto -> Objeto -> Bool
<= :: Objeto -> Objeto -> Bool
$c> :: Objeto -> Objeto -> Bool
> :: Objeto -> Objeto -> Bool
$c>= :: Objeto -> Objeto -> Bool
>= :: Objeto -> Objeto -> Bool
$cmax :: Objeto -> Objeto -> Objeto
max :: Objeto -> Objeto -> Objeto
$cmin :: Objeto -> Objeto -> Objeto
min :: Objeto -> Objeto -> Objeto
Ord,Int -> Objeto -> ShowS
[Objeto] -> ShowS
Objeto -> String
(Int -> Objeto -> ShowS)
-> (Objeto -> String) -> ([Objeto] -> ShowS) -> Show Objeto
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Objeto -> ShowS
showsPrec :: Int -> Objeto -> ShowS
$cshow :: Objeto -> String
show :: Objeto -> String
$cshowList :: [Objeto] -> ShowS
showList :: [Objeto] -> ShowS
Show,ReadPrec [Objeto]
ReadPrec Objeto
Int -> ReadS Objeto
ReadS [Objeto]
(Int -> ReadS Objeto)
-> ReadS [Objeto]
-> ReadPrec Objeto
-> ReadPrec [Objeto]
-> Read Objeto
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Objeto
readsPrec :: Int -> ReadS Objeto
$creadList :: ReadS [Objeto]
readList :: ReadS [Objeto]
$creadPrec :: ReadPrec Objeto
readPrec :: ReadPrec Objeto
$creadListPrec :: ReadPrec [Objeto]
readListPrec :: ReadPrec [Objeto]
Read)

-- | Estado do jogo.
data Estado = Estado
    -- | O mapa atual.
    { Estado -> Mapa
mapaEstado :: Mapa
    -- | Uma lista com os objetos presentes no mapa. Para as funções que vai desenvolver, deve considerar que a ordem dos elementos é irrelevante.
    , Estado -> [Objeto]
objetosEstado :: [Objeto]
    -- | Uma lista com as minhocas no jogo. A ordem dos elementos é relevante, no sentido cada minhoca vai ser identificada pelo seu índice na lista.
    , Estado -> [Minhoca]
minhocasEstado :: [Minhoca]
    }
    deriving (Estado -> Estado -> Bool
(Estado -> Estado -> Bool)
-> (Estado -> Estado -> Bool) -> Eq Estado
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Estado -> Estado -> Bool
== :: Estado -> Estado -> Bool
$c/= :: Estado -> Estado -> Bool
/= :: Estado -> Estado -> Bool
Eq,Eq Estado
Eq Estado =>
(Estado -> Estado -> Ordering)
-> (Estado -> Estado -> Bool)
-> (Estado -> Estado -> Bool)
-> (Estado -> Estado -> Bool)
-> (Estado -> Estado -> Bool)
-> (Estado -> Estado -> Estado)
-> (Estado -> Estado -> Estado)
-> Ord Estado
Estado -> Estado -> Bool
Estado -> Estado -> Ordering
Estado -> Estado -> Estado
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Estado -> Estado -> Ordering
compare :: Estado -> Estado -> Ordering
$c< :: Estado -> Estado -> Bool
< :: Estado -> Estado -> Bool
$c<= :: Estado -> Estado -> Bool
<= :: Estado -> Estado -> Bool
$c> :: Estado -> Estado -> Bool
> :: Estado -> Estado -> Bool
$c>= :: Estado -> Estado -> Bool
>= :: Estado -> Estado -> Bool
$cmax :: Estado -> Estado -> Estado
max :: Estado -> Estado -> Estado
$cmin :: Estado -> Estado -> Estado
min :: Estado -> Estado -> Estado
Ord,Int -> Estado -> ShowS
[Estado] -> ShowS
Estado -> String
(Int -> Estado -> ShowS)
-> (Estado -> String) -> ([Estado] -> ShowS) -> Show Estado
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Estado -> ShowS
showsPrec :: Int -> Estado -> ShowS
$cshow :: Estado -> String
show :: Estado -> String
$cshowList :: [Estado] -> ShowS
showList :: [Estado] -> ShowS
Show,ReadPrec [Estado]
ReadPrec Estado
Int -> ReadS Estado
ReadS [Estado]
(Int -> ReadS Estado)
-> ReadS [Estado]
-> ReadPrec Estado
-> ReadPrec [Estado]
-> Read Estado
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Estado
readsPrec :: Int -> ReadS Estado
$creadList :: ReadS [Estado]
readList :: ReadS [Estado]
$creadPrec :: ReadPrec Estado
readPrec :: ReadPrec Estado
$creadListPrec :: ReadPrec [Estado]
readListPrec :: ReadPrec [Estado]
Read)

-- | Uma jogada que uma minhoca pode efetuar.
data Jogada
    -- | Disparar uma arma numa dada direção.
    = Dispara TipoArma Direcao
    -- | Mover-se numa dada direção.
    | Move Direcao
    deriving (Jogada -> Jogada -> Bool
(Jogada -> Jogada -> Bool)
-> (Jogada -> Jogada -> Bool) -> Eq Jogada
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Jogada -> Jogada -> Bool
== :: Jogada -> Jogada -> Bool
$c/= :: Jogada -> Jogada -> Bool
/= :: Jogada -> Jogada -> Bool
Eq,Eq Jogada
Eq Jogada =>
(Jogada -> Jogada -> Ordering)
-> (Jogada -> Jogada -> Bool)
-> (Jogada -> Jogada -> Bool)
-> (Jogada -> Jogada -> Bool)
-> (Jogada -> Jogada -> Bool)
-> (Jogada -> Jogada -> Jogada)
-> (Jogada -> Jogada -> Jogada)
-> Ord Jogada
Jogada -> Jogada -> Bool
Jogada -> Jogada -> Ordering
Jogada -> Jogada -> Jogada
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Jogada -> Jogada -> Ordering
compare :: Jogada -> Jogada -> Ordering
$c< :: Jogada -> Jogada -> Bool
< :: Jogada -> Jogada -> Bool
$c<= :: Jogada -> Jogada -> Bool
<= :: Jogada -> Jogada -> Bool
$c> :: Jogada -> Jogada -> Bool
> :: Jogada -> Jogada -> Bool
$c>= :: Jogada -> Jogada -> Bool
>= :: Jogada -> Jogada -> Bool
$cmax :: Jogada -> Jogada -> Jogada
max :: Jogada -> Jogada -> Jogada
$cmin :: Jogada -> Jogada -> Jogada
min :: Jogada -> Jogada -> Jogada
Ord,Int -> Jogada -> ShowS
[Jogada] -> ShowS
Jogada -> String
(Int -> Jogada -> ShowS)
-> (Jogada -> String) -> ([Jogada] -> ShowS) -> Show Jogada
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Jogada -> ShowS
showsPrec :: Int -> Jogada -> ShowS
$cshow :: Jogada -> String
show :: Jogada -> String
$cshowList :: [Jogada] -> ShowS
showList :: [Jogada] -> ShowS
Show,ReadPrec [Jogada]
ReadPrec Jogada
Int -> ReadS Jogada
ReadS [Jogada]
(Int -> ReadS Jogada)
-> ReadS [Jogada]
-> ReadPrec Jogada
-> ReadPrec [Jogada]
-> Read Jogada
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Jogada
readsPrec :: Int -> ReadS Jogada
$creadList :: ReadS [Jogada]
readList :: ReadS [Jogada]
$creadPrec :: ReadPrec Jogada
readPrec :: ReadPrec Jogada
$creadListPrec :: ReadPrec [Jogada]
readListPrec :: ReadPrec [Jogada]
Read)