{-|
Module      : Tarefa0_2026
Description : Funções auxiliares do jogo.
Copyright   : ALUNO_1_NOME <ALUNO_1_NUMERO@alunos.uminho.pt>
              ALUNO_2_NOME <ALUNO_2_NUMERO@alunos.uminho.pt>

Módulo que define funções auxiliares específicas do modelo de jogo, úteis na realização do
projeto de LI1\/LP1 em 2026\/27.
-}
module Tarefa0_2026 where

import Labs2026

-- * Mapa

-- | Devolve o bloco numa dada posição do mapa.
--
-- __NB:__ Devolve @Nothing@ sempre que a posição não pertence ao mapa. Isso /inclui posições com
-- coordenadas negativas/ — que ocorrem naturalmente, por exemplo ao tentar subir a partir da
-- linha 0 ou ao calcular o raio de uma explosão à superfície.
--
-- >>> blocoEm (0,0) [[Ar],[Terra]]
-- Just Ar
-- >>> blocoEm (-1,0) [[Ar],[Terra]]
-- Nothing
blocoEm :: Posicao -> Mapa -> Maybe Bloco
blocoEm :: Posicao -> Mapa -> Maybe Bloco
blocoEm = Posicao -> Mapa -> Maybe Bloco
forall a. HasCallStack => a
undefined

-- | Substitui o bloco numa dada posição do mapa.
--
-- __NB:__ Devolve o próprio mapa se a posição não pertencer ao mapa.
atualizaBloco :: Posicao -> Bloco -> Mapa -> Mapa
atualizaBloco :: Posicao -> Bloco -> Mapa -> Mapa
atualizaBloco = Posicao -> Bloco -> Mapa -> Mapa
forall a. HasCallStack => a
undefined

-- | Verifica se um bloco é escavável, ou seja, se tem 'durezaBloco'.
--
-- __NB:__ 'Ar' e 'Rocha' não são escaváveis.
eBlocoEscavavel :: Bloco -> Bool
eBlocoEscavavel :: Bloco -> Bool
eBlocoEscavavel = Bloco -> Bool
forall a. HasCallStack => a
undefined

-- * Escavadora

-- | Aplica uma transformação à escavadora do jogo.
atualizaEscavadora :: (Escavadora -> Escavadora) -> Jogo -> Jogo
atualizaEscavadora :: (Escavadora -> Escavadora) -> Jogo -> Jogo
atualizaEscavadora = (Escavadora -> Escavadora) -> Jogo -> Jogo
forall a. HasCallStack => a
undefined

-- | Verifica se a escavadora está apoiada, ou seja, se /não/ está suspensa no ar.
--
-- A escavadora está apoiada se o bloco imediatamente abaixo existir e não for 'Ar', ou se estiver
-- na última linha do mapa. Só se escava quando se está apoiado.
apoiado :: Jogo -> Bool
apoiado :: Jogo -> Bool
apoiado = Jogo -> Bool
forall a. HasCallStack => a
undefined

-- | Peso total dos minérios transportados pela escavadora.
--
-- O peso limita a carga: ver 'capacidadeEscavadora'.
pesoCarga :: Escavadora -> Peso
pesoCarga :: Escavadora -> Peso
pesoCarga = Escavadora -> Peso
forall a. HasCallStack => a
undefined

-- | Valor total dos minérios transportados pela escavadora, ou seja, quanto rende 'Vende'.
valorCarga :: Escavadora -> Creditos
valorCarga :: Escavadora -> Peso
valorCarga = Escavadora -> Peso
forall a. HasCallStack => a
undefined

-- | A escavadora perde vida, sem nunca ficar com vida negativa. É o que acontece com a 'Lava', com
-- as explosões e com as quedas.
sofreDano :: Int -> Escavadora -> Escavadora
sofreDano :: Peso -> Escavadora -> Escavadora
sofreDano = Peso -> Escavadora -> Escavadora
forall a. HasCallStack => a
undefined

-- * Edifícios

-- | Devolve o tipo de edifício numa dada posição, se lá existir algum.
--
-- __NB:__ Se houver mais do que um edifício na mesma posição — o que a Tarefa 1 não permite —
-- devolve o primeiro da lista.
edificioEm :: Posicao -> Jogo -> Maybe TipoEdificio
edificioEm :: Posicao -> Jogo -> Maybe TipoEdificio
edificioEm = Posicao -> Jogo -> Maybe TipoEdificio
forall a. HasCallStack => a
undefined