- Instruções para compilar e executar:
- Sobre o jogo:
- Recursos implementados;
- Recursos do c++ usados;
- Recursos de bibliotecas externas usados.
- Instale o
Make
, no caso doWindows
, use esse aqui (que é o compatível); - Em algumas máquinas
Linux
pode ser necessário instalar o sfml, mas nós utilizamos a biblioteca já compilada noUbuntu
para não precisar instalar osfml
nele; - Instale o
OpenAl
, disponível aqui:- No
Ubuntu
talvez não precise, mas, por garantia, basta instalar o pacotelibopenal-dev
executando o comando:sudo apt install libopenal-dev
- No
- Dentro da raiz do projeto, execute
make dev
e irá compilar e executar o jogo.
make
- irá compilar tanto o jogo como os testes;make test
- irá compilar e executar os testes;make dev
- irá compilar e executar o jogo;make run
- irá executar o jogo (se compilado);make compile
- irá compilar o jogo;make clean
- irá limpar o_build
;make valgrind
- irá compilar e executar o jogo usando ovalgrind
(fica bem mais lento e precisa ter ovalgrind
instalado).
Defenda sua base para sobreviver e passar por hordas inteiras de inimigos que querem sua cabeça nesse jogo produzido como projeto da disciplina de Linguagem de Programação
ofertada na UFRN
.
Deixamos um vídeo pronto mostrado como é o jogo. Clique aqui ou na imagem para acessá-lo.
Antonio Henrique Barbosa Lima
;Arthur Queiroz Pires de Farias
;Lucas Marcel Silva de Brito
;Pedro Paulo Galvão Galindo de Oliveira
.
Exceto pela música, sons e fontes, todos os assets
utilizados no jogo foram feitos por nós. Quanto ao restante do material, agradecemos:
- Pixeloid: pelas fontes;
- Jdsherbert: por alguns sons;
- Shapeforms: pela música e por alguns sons.
Esperamos não ter esquecido ninguém. Deixamos as licenças dentro do repositório.
Proteja sua base, saia para coletar munição e vida quando necessário, junte moedas derrotando inimigos e faça a melhor sequência de melhorias que conseguir; evite atirar em direção à própria base quando estiver fora dela, pois suas balas também causarão dano a ela; evite o máximo de dano que puder fora da base e saiba tirar proveito das suas sentinelas.
Botão direito do mouse
: andar;Q
/Botão esquerdo do mouse
: atirar;R
: recarregar;Esc
: pausar.
Observação: podem ser compradas mais de uma vez na mesma oferta, mas o preço aumenta.
- Cura imediatamente
25%
de vida; - Repara imediatamente
25%
da base; - Restaura imediatamente
25%
da munição.
- Aumenta a vida em:
+10
/+10
/+20
/+30
/+40
/+40
pontos.
- Aumenta a vida da base em:
+10
/+10
/+20
/+30
/+40
/+40
/+50
pontos.
- Aumenta a munição do pente em:
+2
/+2
/+2
/+2
balas.
- Aumenta a munição em:
+2
/+2
/+4
/+4
/+6
/+6
balas.
- Aumenta a velocidade de disparo em:
+10%
/+20%
/+30%
/+40%
.
- O reparo da base fica:
+10%
/+15%
/+20%
/+25%
/+30%
/+35%
/+40%
/+45%
/+50%
rápido.
- A recuperação de vida fica:
+10%
/+15%
/+20%
/+25%
/+30%
/+35%
/+40%
rápida.
- Aumenta a velocidade de disparo das sentinelas em:
+20%
/+20%
/+30%
/+40%
.
- Ganha
20%
de chance de não consumir bala do pente (inclui sentinelas); - Disparos contra à própria base não causam mais dano;
- Balas ricocheteadas causam dano aos inimigos.
Vida
: o jogador, a base e os inimigos começam com100
pontos de vida que são destruídos/mortos quando a vida chega 0;Munição
: o jogador tem uma quantidade limitada de munição no pente. Quando a munição do pente acaba ele pode recarregar apertandoR
e usando a munição armazenada na base, que também é limitada. Enquanto recarregar ele não pode atirar;Movimentação
: o jogador pode se movimentar definindo um destino clicando com obotão direito do mouse
. Os inimigos por padrão seguem o jogador quando ele está fora da base, quando ele está dentro eles priorizam atacar a base;Desbravador (pathfinding)
: as torres localizadas no vértices da base são consideradas obstáculos para a movimentação do jogador, assim como a base é considerada um obstáculo para os inimigos;Base
: a base é uma área segura para o jogador, os muros dela refletem as balas vindas de fora, mas sem deixar de tomar dano. O jogador pode sair e entrar livremente dela e nenhum inimigo pode entrar nela. As torres da base recebem dano reduzido;Disparo
: o jogador pode disparar uma bala na direção do mouse ao custo de sua munição apertando/segurando a teclaQ
ou obotão esquerdo do mouse
. Os inimigos também disparam, mas não possuem limite de munição;Otimização
: balas fora do mapa são destruídas e as páginas de texturas só são carregadas uma única vez;Sentinelas
: a base acompanha um total de 4 sentinelas que atacam os inimigos que se aproximam delas automaticamente. Elas são extremamente lentas e consomem a munição do jogador que não está no pente da arma dele, mas causam bastante dano e podem receber melhorias na loja;Hordas
: o jogo é dividido 15 hordas, cada uma mais difícil que a anterior. O jogador vence o jogo se sobreviver a todas elas. Durante uma horda uma quantidade fixa de inimigos surgem nas borda do mapa aleatoriamente, quando todos são derrotados a horda termina;Reparo da base
: o jogador repara a base automaticamente enquanto estiver dentro dela, mas é uma ação lenta. Se ele estiver em movimento a velocidade do reparo é diminuída;Espólios
: ao derrotar um inimigo, ele tem chance de deixa cair um kits devida
oumunição
. Os kits somem após um tempo;Loja
: no final de cada horda o jogador pode comprar melhorias e/ou benefícios usando moedas. O jogador recebe uma quantidade de moedas quando derrota um inimigo e que pode variar um pouco;Pausa
: o jogo pode ser pausado apertandoEsc
. Um menu aparecerá dando algumas opções, entre elas a de fechar o jogo;Resoluções
: no menu de pausa há um botão de opções que leva a um menu de configuração de resolução. Há três resoluções configuradas e a opção de tela cheia.
vector
:- O
vector
, uma implementação daTAD sequência
, é usado nolist.hpp
para armazenar um template de uma lista de ponteiros.
- O
map
:- O
map
, uma implementação daTAD dicionário
, é usado noshop.hpp
para armazenar as informações dos itens da loja através dos seus nomes.
- O
stack
:- O
stack
, uma implementação daTAD sequência
, é usado nopathfinder.hpp
para traçar os pontos de destino.
- O
cmath
:- As funções
sinf
,cosf
,atan2
efmod
são utilizadas nomath.cpp
para implementar funções comoGame::Math::pointInRadius
eGame::Math::pointDirection
, responsáveis por relacionar ângulos e pontos.
- As funções
iomanip
;sstream
;functional
:- Fornece recursos para passar funções como parâmetros ou atributos, útil em alguns casos. Usamos principalmente para construir os itens da loja do jogo sem precisar usar muita herança no
items.cpp
.
- Fornece recursos para passar funções como parâmetros ou atributos, útil em alguns casos. Usamos principalmente para construir os itens da loja do jogo sem precisar usar muita herança no
locale
ecodecvt
:- Usadas para utilizarmos textos armazenados no formato de UTF-8.
stdexcept
:- Usada para adicionar erros customizados.
time.h
:- Usada para gerar uma
seed
emlocal.cpp
a ser usada nosrand
.
- Usada para gerar uma
SFML
- recursos da gráficos e sonoros doSFML
;gtest
egmock
- bibliotecas dogoogletest
usadas nostests
.