Two Sided Coin
A downloadable game
1. INTRODUÇÃO
Entre os diversos gêneros de jogos dentro do mercado, o gênero de Estratégia ainda reside entre os mais vendidos. De acordo com a SteamDB (2024), Civilization VI alcançou mais de 12 milhões de vendas e até hoje é o jogo de estratégia mais jogado dentro da Steam.
Os jogos táticos, são uma subcategoria de gênero de jogo dentro dos jogos de estratégia. Costumam ser jogados em turnos, sendo mais lentos e dando mais chance para os jogadores pensarem em estratégias para vencer os desafios. (ROGERS, 2014). Dentro dessa categoria, os jogadores costumam ter menos unidades para manusear, formando combates mais localizados. (ARRIVABENE, 2019).
Os jogos táticos costumam ter a movimentação a base de Grids, que são coordenadas as quais os personagens devem passar por cima. Para que as unidades dentro do jogo achem os caminhos, o A*(A-Star) é utilizado como ferramenta para encontrar caminhos de forma otimizada a base de valores aplicados no caminho, o node inicial contará o custo para se locomover e escolherá o caminho mais otimizado. (RUSSEL, 2016).
1.1 Objetivos
Desenvolver um protótipo de jogo tático isométrico com três mapas que variam de dificuldade e terreno. Dois times, com três unidades únicas e com diferentes custos e atributos, se enfrentam.
- Criar um sistema de coordenadas para as unidades se localizarem no mapa;
- Estudar e aplicar o sistema de procura A*, para que as unidades encontrem o melhor caminho;
- Criar três variações de unidades;
- Balancear as unidades com base em custo, para que os jogadores tenham estratégias únicas;
- Criar uma árvore de decisões para que as unidades não jogáveis criem um desafio e realizem jogadas coerentes.
1.2 Procedimentos Metodológicos
Para esse projeto, será feita uma pesquisa exploratória, que se dá por pesquisas que visam aumentar o entendimento sobre o problema, com o intuito de torná-lo mais claro. O foco principal dessa investigação é o desenvolvimento de ideias ou a obtenção de novas percepções. Por esse motivo, o planejamento é flexível, permitindo a exploração de diversos aspectos relacionados ao tema estudado (Gil, 2002).
Assim, também será utilizada a metodologia Diamante Duplo especificamente para o desenvolvimento do projeto, que de acordo com o Conselho de Designer do Reino Unido (2024) é um modelo visual que delineia o processo de design e inovação. Essa metodologia oferece uma estrutura clara para compreender as diferentes etapas envolvidas em qualquer projeto criativo, independentemente das técnicas ou recursos específicos utilizados.
Além disso, para o desenvolvimento do projeto serão utilizadas as ferramentas Kanban e SCRUM, o primeiro é uma ferramenta de gestão visual que usa cartões e colunas coloridas para controlar o fluxo de trabalho, e o segundo é uma ferramenta de gestão ágil que ajuda a organização da equipe a trabalhar em conjunto para atingir um objetivo específico (FERREIRA, 2023).
1.2.1 Metodologia do Projeto
A metodologia Diamante Duplo consiste em 4 etapas do processo: descobrir, definir, gerar ideias e entrega.
De acordo com o Conselho de Designer do Reino Unido (2024), a fase inicial do processo promove empatia e compreensão aprofundada do problema em questão. Ela requer o envolvimento direto com aqueles afetados pelo problema para obter uma compreensão profunda de suas necessidades e perspectivas. Na segunda parte do primeiro processo do Diamante Duplo, as descobertas feitas durante a fase inicial de exploração podem levar a uma redefinição do problema, oferecendo uma nova perspectiva sobre os desafios a serem enfrentados.
Já o segundo Diamante começa com o fomento da criatividade e da colaboração, incentivando os indivíduos a explorar soluções diversas para o problema bem definido, buscando inspiração em fontes externas e trabalhando em conjunto com uma variedade de partes interessadas. Finalizando o segundo Diamante, tem a fase de implementação que envolve experimentar várias soluções em uma escala menor, eliminando aquelas que se revelam ineficazes e refinando as que demonstram potencial.
2. CONCEITO
O jogo o qual os desenvolvedores trabalharam durante o semestre será um jogo de Estratégia Tático. De acordo com o autor Scott (2014) o gênero de estratégia tem como base o planejamento de forma sistemática para resolver os problemas. A estratégia tática costuma ser mais lenta, feita em turnos os quais dão ao jogador um tempo maior para pensar.
Neste conceito, o jogo será baseado em partidas isoladas. Cada batalha será realizada em um mapa com uma dificuldade baseada em pontuação. Cada unidade terá uma pontuação que definirá os atributos desta unidade. As batalhas serão curtas e com unidades limitadas.
O jogador ganhará uma quantidade de pontos baseado na dificuldade que escolheu, em seguida comprará as unidades utilizando esses pontos para decidir a estratégia que achar mais adequada.
2.1 Mecânicas
Combate baseado em turnos. Cada turno, o usuário poderá escolher quais unidades mover e ou atacar. Os turnos não terão tempo, dando a possibilidade de pensar nas ações. Movimentação em uma coordenada que forma uma grade. A movimentação terá um custo baseado na distância ou na especificação da grade.
Os atributos serão os recursos de cada unidade, a vida é o que manterá a unidade no combate, armadura reduz o dano causado a unidade, velocidade mostra quantas casas ele poderá se mover e dano quantos pontos de dano causara a unidade selecionada. Todas as unidades terão um custo de compra, que será definido baseado nos atributos dela. O jogador poderá comprar as unidades no começo da partida.
2.2 Personagens Não Jogáveis
Dentro do escopo de produção deste projeto existem três unidades não jogáveis. Os atributos são divididos em Velocidade, Armadura, Vida e Dano. Cada uma terá um comportamento diferente.
Unidade básica de combate:
- Unidade com os atributos baixos, será barato e terá mais deles em campo. Seu comportamento é caminhar até o jogador e tentar encostar nele para danificar. Cada turno que estiver adjacente ao jogador, danificará a unidade jogável.
Unidade pesada de combate:
- Unidade com armadura, terá movimento baixo, sendo bem difícil de alcançar o jogador. Seu comportamento será ficar na linha de visão do jogador e impedir as outras unidades de serem atingidas.
Unidade de tiro a distância:
- Unidade com pouca vida, movimentação regular, parecida com a unidade básica de combate. Seu comportamento é manter a distância do jogador e disparando de longe.
2.3 Telas e Interfaces
O design da interface será algo simples, poucas coisas na tela apenas informações importantes do personagem. Na base da tela terão a imagem da unidade selecionada, para saber qual personagem o jogador moverá, ao lado da imagem os atributos fixos como dano e armadura. A vida e a movimentação serão dispostas em barras que serão os atributos variáveis.
E ao lado esquerdo, uma aba a qual descreve informações básicas da unidade e custo. Como é visto na figura 2.
3. DESIGN TÉCNICO
Nesta sessão, serão abordados os aspectos técnicos do projeto a fim de esclarecer as principais características lógicas que contribuem para o funcionamento do jogo. Os recursos envolvem desde especificações técnicas, que formam o alicerce do projeto, até as estratégias de implementação de inteligências artificiais e algoritmos de comportamento.
3.1 Motor de Jogo
O jogo será desenvolvido utilizando a Godot Engine, um motor open-source, ideal para o desenvolvimento de jogos 2D e 3D. A escolha da Godot se deve à sua flexibilidade, facilidade de uso e à possibilidade de exportação para múltiplas plataformas.
A filosofia de design da Godot, segunda a própria documentação da engine, valoriza a criação de um ambiente de desenvolvimento intuitivo, com um sistema de nodes que facilita a organização e implementação de recursos. Dentro desse sistema existe a característica de herança, que acaba se tornando um dos principais mecanismos na montagem de um jogo.
3.2 Descrição dos Scripts
Os scripts serão escritos em GDScript, a linguagem nativa da Godot, que é semelhante ao Python e otimizada para o desenvolvimento de jogos. Abaixo estão algumas classes principais e suas descrições:
- Init.gd:
- Classe base: Node
- Variáveis:
- viewport_size (Vector2): Armazena o tamanho da viewport do jogo.
- window_mode (inteiro): Determina o estado da janela do jogo.
- window (Window): Variável que representa a janela do jogo.
- Keymap.gd
- MapGenerator.gd:
- Turn_controller.gd
- Classe base: Node
- Variáveis:
- _current_turn (inteiro): Define de quem será a vez de jogar.
- _factions (Enumerador): Armazena quais são os participantes e quantos existem. Além disso, atribui um index para cada um.
- Métodos:
- change_turn() -> Inteiro: Troca o turno e retorna o index do próximo a jogar.
- Action_manager.gd:
- Classe_base: Node
- Variáveis:
- _action_points (inteiro): Define a pontuação de ações que o personagem pode utilizar.
- _action_amout (inteiro): Define quantas ações o personagem pode fazer.
- Métodos:
- _spend_points() -> Sem retorno: Atualiza a quantidade de pontos, subtraindo os que foram gastos
- _reset_points() -> Redefine a quantidade de pontos de ação.
- Pathfinding.gd:
- Classe_base: Node
- Variáveis:
- astar (AStar): Responsável pela navegação nas células que compõem o cenário.
- _path (Array): Armazena todos os tiles que serão percorridos.
- target (Vector2): Armazena a posição final (alvo)
- unit (CharacterBody3D): Guarda a instância da unidade selecionada.
- Métodos:
- _delete_tile() -> Sem retorno: Deleta o tile anterior (que já foi utilizado).
- _calculate_path() -> Calcula o menor caminho possível até o alvo.
- _reset_target() -> Sem retorno: Remove o alvo após ele ser alcançado.
- Unit.gd (Abstrata):
- Classe_base: CharacterBody3D
- Variáveis:
- health (float): Determina o valor da vida do personagem
- max_health (float): Indica qual o valor máximo que a vida da unidade pode chegar.
- action_points (int): Armazena o máximo de pontos de ação que a unidade possui.
- armor (float): Define o valor de armadura do personagem.
- speed (CharacterBody3D): Determina o alcance do movimento do personagem.
- cost (int): Representa o custo que a unidade possui ao ser posicionada no mapa.
- faction (int): Recebe a facção que a unidade pertence por meio de enumeradores.
- Métodos:
- _take_damage(dano) -> Sem retorno: Recebe o dano que vem como parâmetro e calcula o decréscimo da vida da unidade.
- attack() -> Sem retorno: Função vazia. Serve para ser sobrescrita por outras classes que herdam esta.
- _selected() -> Sem retorno: Reconhece quando a unidade é clicada/selecionada.
- _placed() -> Sem retorno: Define o personagem como posicionado.
- _buy() -> Sem retorno: Desconta do dinheiro do jogador o custo da unidade.
- _die() -> Sem retorno: Responsável por lidar com os eventos que acontecem quando a unidade morre.
- MatchController.gd:
- Classe_base: Node
- Variáveis:
- units (Array): Armazena todas as unidades do mapa.
- map (Array): Armazena todos os tiles utilizados pelo mapa.
- Métodos:
- _verify_units() -> Sem retorno: Verifica se ainda existe alguma unidade de ambas as facções. Caso alguma não possua mais unidades, encerra a partida.
- _end_match() -> Termina a partida.
- ia.gd:
- Classe_base: Resource
- Variáveis:
- action_queue (Array): Armazena as decisões que a inteligência escolher.
- current_action(int): Reconhece qual a ação atual por meio de enumeradores.
- change_action (bool): Verifica se é possível trocar de ação.
- unit (CharacterBody3D): Guarda a instância da unidade que faz o uso desta classe.
- Métodos:
- _perform_action() -> Sem retorno: Efetua a ação atual.
- _end_turn() -> Sem retorno: Finaliza o turno quando não houver mais ações.
- _set_target() -> Sem retorno: Define um alvo para atacar.
- _move() -> Sem retorno: Verifica se pode se mover e chama as funções de pathfinding.
- _set_priorities() -> Sem retorno: Define quais as prioridades da unidade com base em sua classe (quais inimigos ela prefere atacar, se deve priorizar o reposicionamento, etc).
3.3 Inteligência Artificial
A Inteligência Artificial será implementada para os personagens não jogáveis utilizando um sistema de árvore de decisões e algoritmos de busca A* para o pathfinding. Essas unidades seguirão comportamentos específicos com base na situação do jogo.
- Unidade Básica: Usará uma lógica simples para avançar e atacar.
- Unidade Pesada: Focará em bloquear unidades inimigas e proteger aliados.
- Unidade de tiro: Manterá distância e disparará quando possível.
4. CONSIDERAÇÕES FINAIS
O desenvolvimento deste jogo trouxe diversos desafios, principalmente na implementação da movimentação em um grid 3d utilizando o A* de forma otimizada. Os obstáculos e outras unidades presentes no mapa foram a maior dificuldade, para que elas não atravessem outra unidade dentro do campo.
A Godot trouxe um Gridmap nativo dentro de seu motor que facilitou a produção e atribuição de valores dentro do mapa criado. Abrindo a possibilidade para que os mapas sejam feitos a mão pelo designer de mapas considerando um equilíbrio para ambos os lados.
O balanceamento, tanto das unidades quanto dos elementos do mapa para que ele crie um desfio equalitário para todos os lados do combate foram testados diversas vezes considerando que a aleatoriedade dos acertos e dano é um ponto importante da mecânica do jogo. A incerteza adiciona a necessidade de estratégia para vencer a partida.
REFERÊNCIAS
ARRIVABENE, Rafael Mariano Caetano. Introdução didática ao Game Design [Recurso eletrônico]/ Porto Alegre: SAGAH 2019
CONSELHO DE DESIGNER DO REINO UNIDO. The Double Diamond. Disponível em: https://www.designcouncil.org.uk/our-resources/the-double-diamond/. Acesso em: 09 out. 2024.
FERREIRA, Maik Souza. Ferramentas ágeis no desenvolvimento de projetos por engenheiros químicos: uma revisão sobre lean, scrum e kanban. 2023. 32 f. TCC (Graduação) - Curso de Engenharia Química, Universidade Federal de Uberlândia, Uberlândia, 2023. Disponível em: https://repositorio.ufu.br/bitstream/123456789/37802/1/FerramentasAgeisDesenvolvimento.pdf. Acesso em: 09 out. 2024.
GIL, Antonio Carlos. Como elaborar projetos de pesquisa. 4. ed. São Paulo: Atlas, 2002. Disponível em: https://files.cercomp.ufg.br/weby/up/150/o/Anexo_C1_como_elaborar_projeto_de_pesquisa_-_antonio_carlos_gil.pdf. Acesso em: 09 out. 2024.
GODOT. Filosofia da Godot Engine, documentação oficial. Disponível em: https://docs.godotengine.org/en/stable/getting_started/introduction/godot_design_philosophy.html. Acesso em: 09 out. 2024.
ROGERS, Scott. Level Up!: Guide to Great Video Game Design. 2. ed. Indianapolis: Wiley, 2014.
SILVA, Stela Soares; ANGELO, Ana Carolina Maia. Contribuição da Engenharia de Produção para a Transformação Digital da Indústria Brasileira. In: XLII ENCONTRO NACIONAL DE ENGENHARIA DE PRODUÇÃO, 42., 2022, Foz do Iguaçu. Anais [...] . Foz do Iguaçu: Enegep, 2022. p. 1-14. Disponível em: https://www.abepro.org.br/biblioteca/TN_ST_387_1915_44994.pdf. Acesso em: 09 out. 2022.
STEAMDB. Charts - Total Player Count for Game: XCOM: Enemy Unknown. Disponível em: https://steamdb.info/app/200510/charts/#1y. Acesso em: 8 out. 2024.
STEAMDB. Charts - Total Player Count for Game: Civilization VI. Disponível em: https://steamdb.info/app/289070/charts/. Acesso em: 8 out. 2024.
GRUPO
Danniel Lopes Chagas;
Luiz Augusto Pardo da Silva;
Nicole Lewandowski;
Vinícius Jung.
Instruções
Clique com o botão direito na unidade para selecionar
Clique com o esquerdo na area verde para caminhar
Apos selecionar, aperte 1 para começar o modo de tiro
Clique nos inimigos após apertar um para disparar
Published | 18 days ago |
Status | In development |
Author | NecroBirb |
Genre | Strategy |
Tags | Tactical RPG |
Download
Install instructions
Extract the file
Execute
Leave a comment
Log in with itch.io to leave a comment.