Console.Write("Hello World!");
Olá pessoal, como vão? Há exatamente um mês eu iniciei o desenvolvimento de um sistema de batalhas ao estilo Yu Gi Oh, mais precisadamente seguindo as regras e design do game para PS1: Yu-Gi-Oh Forbidden Memories.
O sistema foi iniciado com a adição de cartas num banco de dados SQLite, e dentro do Unity a única coisa que ele fazia era instanciar essas cartas do banco para a cena, contendo as informações de cada carta como: pontos de ataque, pontos de defesa, nome da carta, e a imagem dela que era renderizada na Unity através do componente SpriteRenderer.
O vídeo do início da proposta pode ser visualizado logo abaixo:
[youtube]https://www.youtube.com/watch?v=lbERV7Jm2MQ[/youtube]
Porém, com o passar das semanas, o sistema foi ganhando forma e hoje conta com diversas classes para gerenciar cada aspecto do projeto.
No final das contas, o sistema está assim atualmente (24/07/19):
[youtube]https://www.youtube.com/watch?v=c9ieTwi3y9A[/youtube]
>> Banco de dados:
- Sistema de leitura e acesso ao banco de dados para criar os decks de cartas (maiores informações no primeiro vídeo acima);
- Graças à flexibilidade do SQLite, é possível construir de forma simples e direta os decks de cada jogador, basta adicionar à tabela de 'Jogadores' um novo registro de jogador, e ir adicionando ou removendo as cartas registradas no banco de dados para cada jogador, assim é possível criar diversos decks diferentes, com as cartas que desejar!
>> Deck Manager:
Classe responsável por gerenciar tudo o que for associado aos decks dos jogadores:
- Gerenciamento dos decks através de pilhas(stacks);
- Adição de informações das cartas do banco de dados para as pilhas de decks;
- Gerenciamento da quantidade de cartas no deck;
- Embaralhamento do deck ao iniciar a partida através do algoritmo: Fisher-Yates Shuffle.
>> Draw Manager:
Classe responsável por manipular o sistema de Draw (compra) de cartas do jogo.
Essa classe é parcial e foi dividida em duas:
- Draw Manager Amount:
Responsável por gerenciar quantas cartas deverão ser instanciadas do deck para a mão dos jogadores, possibilitando instanciar as cinco cartas iniciais, quanto qualquer quantidade subsequente, como por exemplo, ao se utilizar de alguma carta com efeito similar ao Pot Of Greed.
Basta apenas passar como argumento da função de Draw da classe, a quantidade de cartas que deseja instanciar, que o sistema fará automaticamente a compra dessas cartas.
Também responsável por verificar se o jogador possui cartas suficientes para comprar, e caso não, encerra a jogada fazendo com que o jogador que não tenha mais cartas para comprar, perca.
Por ser uma classe pequena, posso mostrá-la aqui de ante-mão:
Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace YuGiOhManager{
public static partial class DrawManager{
private const float timeToAnimation = 0.3F;
public static IEnumerator DrawCards(int amount, bool isMainPlayer = true){
var currentDeck = isMainPlayer ? DeckManager.deck : DeckManager.deckAI;
for (int i = 0; i < amount; i++) {
if (currentDeck.Count > 0) {
yield return new WaitForSeconds (timeToAnimation);
InstantiateInScene (isMainPlayer);
} else {
DialogueUI.ShowDialogue ((isMainPlayer ? "Player 1" : "Player 2") + " doesn't have enough card to draw. Lose!");
GameManager.gameOver = true;
yield break;
}
}
}
}
}
- Draw Manager Instance:
Essa classe é responsável por instanciar de fato as cartas na cena, carregando as informações fornecidas do banco de dados.
São muitos processos como: Verificar se a carta a ser instanciada é uma carta do main player ou do bot, passar as informações do banco de dados para os prefabs das cartas, gerenciar o local da mão que essa carta será instanciada, e etc.
>> Hand Manager:
Essa classe fica ao encargo de gerenciar tudo o que diz respeito às cartas na mão do jogador.
- Função que retorna qual "mão" está sendo avaliada (cartas na mão do main player ou do bot);
- Função de Sort Hand (reorganizar as cartas na mão, assim que uma carta é escolhida para ser jogada no campo);
- Função que remove a carta da mão e coloca no tabuleiro, assim que a carta é escolhida.
Essa classe também é muito importante para o sistema de Inteligência Artificial escolher qual carta ela irá jogar de sua mão para o campo.
>> Board Manager:
Nesta classe estão as funções responsáveis por manipular as cartas que estão em campo (no tabuleiro).
- Verificar se o campo está vazio;
- Verificar se o campo está cheio;
- Verificar qual melhor local para colocar a carta em campo;
- Retorna qual campo está sendo analisado (de qual jogador);
- Sistema de Replace Card (substituição). Quando o campo está cheio, deve-se substituir uma carta já existente no tabuleiro por uma selecionada da mão.
>> Battle Manager:
Essa classe tem a responsabilidade de gerenciar tudo o que for relacionado ao sistema de batalha.
- Define as cartas que estão batalhando;
- Define quem está atacando e quem está sendo atacado;
- Verifica quem perdeu ou ganhou a batalha;
- Desconta os pontos de vida do perdedor;
- Verifica possíveis empates;
- Chama a classe de animação de batalha;
- Destrói do campo a carta perdedora da batalha;
- Sistema de atacar pontos de vida diretamente.
>> Battle Animation Manager:
A classe "Battle Manager", como dito acima, é responsável por gerenciar a batalha do jogo, mas a parte do feedback visual dessa batalha fica à cargo da classe: "Battle Animation Manager". Então essa classe é responsável por ativar as animações na cena de acordo com o tipo da batalha.
Quem atacou ganhou da carta atacada? Quem atacou perdeu da carta atacada? Foi empate? Não houve nada? Ataque direto aos pontos de vida? Todas essas animações são gerenciadas através de uma enumeração de ações, de acordo com a batalha que ocorreu e as cartas envolvidas na mesma.
É através dessa classe também que são mostrados os pontos de vidas descontados na tela.
>> Change Turn Manager:
Essa classe faz o papel de gerenciar de quem é a vez, e de encerrar a mesma, quando algum jogador solicitar, chamando os eventos necessários para "reiniciar" a vez do próximo jogador.
Também é responsável por chamar a classe da Inteligência Artificial para que ela possa jogar, caso esteja na vez dela.
>> State Manager:
Aqui não se trata de uma classe em específico, mas sim de um escopo do namespace "YuGiOh System", para armazenar as enumerações que serão utilizadas em todas as classes do sistema, como as enumerações das fases do turno (Draw Phase, Main Phase, Battle Phase, End Phase), o estado atual da carta (OnHand, OnBoard), enumerações dos estados das batalhas (já citados anteriormente), delegados para gerenciar eventos do sistema, e etc.
>> UI Manager:
Essa classe gerencia as informações que serão visualizadas na UI da Unity, como as imagens da carta selecionada, seus pontos e nome.
Seu evento de mostrar essas informações na UI é disparado através de uma outra classe chamada "Mouse Manager" que é um componente do prefab das cartas, que detecta se o cursor do mouse está sobre a carta, assim, caso esteja, as informações daquela carta são mostradas em cada componente da UI, como os de Image e Text.
>> Game Manager:
Essa classe é algo mais generalizada, que visa armazenar informações globais do jogo e não de algo específico como as classes Managers anteriores.
- Armazena os pontos de vida dos jogadores;
- Os turnos dos jogadores;
- Se é o primeiro turno ou não;
- A fase atual;
- Se é game over;
- Se alguma animação de batalha está sendo executada;
- Se a caixa de diálogos está ativada;
- Armazena as cartas atuais que estão sendo selecionadas para alguma ação.
>> Outras classes:
Além dessas classes que gerenciam o sistema, há outras classes mais específicas, como a classe que ativa as caixas de diálogos, o sistema de animações das compras de cartas, as ações de cada carta na mão (Set Up, Set Down e Cancel), as ações das cartas no tabuleiro (Battle, Change Mode, Cancel), inicialização das informações da partida, Mouse Manager, superclasse responsável por receber as informações do banco de dados, e etc.
>> Inteligência Artificial (I.A)
Como o projeto não é online, se fez necessário a inserção de um sistema de I.A básico para jogar contra o jogador principal.
Essa I.A foi muito inspirada no bot dos primeiros oponentes do já citado Yu-Gi-Oh Forbidden Memories do PS1, ou seja, com uma tática ofensiva, tendo a prioridade em atacar seus pontos de vida e destruir as suas cartas, apesar de ela possuir algumas cartas defensivas em seu deck.
A I.A foi dividida em dois scripts: Um que decide qual é a melhor carta para selecionar na mão e jogar no tabuleiro, de acordo com diversos fatores influenciáveis em suas decisões, tais como: A carta que desejo selecionar é capaz de vencer de alguma carta no campo do oponente? Existe alguma carta no MEU campo que já dá conta do recado? É melhor eu me defender? Descarto a carta mais fraca da mão? Ataco os pontos de vida diretamente? e etc.
O outro script é responsável por fazer a I.A decidir qual a sua melhor ação com suas cartas já em campo, como: Vai batalhar? Se sim, contra qual carta do oponente? Vai só se defender? Mudar a posição de batalha de alguma carta? E assim por diante...
No final de vários e vários testes, apesar de uma I.A básica, ela atende bem as expectativas, procurando sempre fazer a melhor jogada que a traga mais benefícios.
>> O que pretendo implementar no futuro?
O sistema está completo com tudo que planejei desde a sua concepção, mas isso não irá me impedir de implementar novos recursos posteriormente.
Alguns que tenho em mente são:
- Adição de cartas do tipo "Spell" e "Trap";
- Deck Viewer, ou seja, um visualizador para as cartas do seu deck;
- Mais inimigos, com decks diferentes, ou seja, vai surgir a necessidade de criar um sistema de seleção de personagens.
>> Onde o sistema vai ser disponibilizado?
Download 64 BITS da versão demonstrativa:
https://mega.nz/#!lawUGSJa!9UtT2OEqbuTisNxzZMaoJY-DshpNBUXDFm1VVNch9To
ATUALIZAÇÕES - 03/12
E aí pessoal, como vão? Depois de muitos meses sem mexer no projeto, hoje finalmente eu pude dar aquela atualizada que eu mais gostaria de dar (agora com PC novo é só alegria). Confira abaixo as novidades:
1. Seleção de Personagens:
Com a seleção de personagens agora é possível jogar contra outros oponentes além daquele de testes! Isso significa que você terá mais possibilidades de jogadores para desafiar, decks diferentes e cartas novas!!
O sistema te possibilita criar decks diferentes para cada jogador, dessa forma, você pode ter vários oponentes diferentes para duelar contra, pois a AI é genérica e vai saber lidar com qualquer deck que ela tiver disponível.
Os personagens adicionados na versão DEMO foram:
Screenshot da seleção de personagens:
2. Mais opções de ações:
Além de setar suas cartas para cima ou para baixo e cancelar a ação na DrawPhase, o jogador também pode agora ler a descrição da carta selecionada e o mais legal de tudo: Descartar a carta também!
Com o sistema de descarte é possível eliminar cartas da sua mão que você julgue "inúteis" e na próxima vez que você comprar, você ganhará novas cartas referente à quantidade de cartas descartas. Por exemplo: Se descartar 3 cartas, na próxima rodada você comprará novas 3 cartas.
Esse sistema é similar do que já temos no Yu-Gi-Oh Forbbiden Memories, mas nesse caso o jogador descarta as cartas fundido elas erradamente de propósito.
Para abrir a janela das novas opções, clique na carta com o lado direito do mouse!
Screenshot das novas opções:
3. Cartas de Spells!!
Essa sem dúvidas era a notícia que eu mais gostaria de anunciar para vocês! Agora o sistema conta com cartas mágicas (spells) para serem jogadas e terem seus efeitos ativados, mudando totalmente o rumo da partida!
Todo o sistema já está pronto pra receber as spells (adição ao board, ativação do seu respectivo efeito, prefab da carta e etc).
Para testes eu já criei duas spells: Raigeki e Dark Hole e elas já estão com seus efeitos criados e funcionando ingame!!
Por enquanto apenas o player principal pode ativar spells, pois para a AI ainda preciso fazer um algoritmo para ela "pensar" qual o melhor momento para ativar a spell na partida, mas em breve estarei fazendo isso.
Screenshots da spell no jogo:
Dark Hole ativado:
O que tem por vir:
Mas as novidades não param por aí! Ainda pretendo melhorar algumas decisões da AI para deixar ela mais precisa, adicionar outras cartas spells além dessas duas, colocar a possibilidade de cartas Traps e Fields, fazer um sistema de Deck Viewer e possibilitar a AI de jogar cartas mágicas e descartar cartas da mão.
Em breve mais atualizações e links para download.