O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Sistema de Yu-Gi-Oh! -Vídeo NOVO [20/12/19]

Iniciado por MayLeone, 27/06/2019 às 01:11

27/06/2019 às 01:11 Última edição: 20/12/2019 às 20:17 por MayLeone

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:



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):



>> 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:

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?
Build do projeto para testar e código fonte, Clique aqui!




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:



  • Shade (O jogador padrão de AI do primeiro teste
  • Rex Raptor e seu deck de zumbi + dinossauros
  • Weevil Underwood e seu deck de insetos
  • Mai Valentine e seu deck de Harpias e Fadas
  • Bandit Keith e seu deck de feras
  • Yami Bakura e seu deck defensivo e dark
  • Pegasus e seu deck apelativo xD
  • Isis Ishtar e seu deck de água
  • Seto Kaiba e seu deck dragão (sim, tem o Blue Eyes)
  • Heishin e seu deck imbatível (não dá pra ganhar dele, que sacanagem né)

Screenshoot da seleção de personagens:
Spoiler
[close]




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!  :money:
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!

Screenshoot das novas opções:
Spoiler
[close]




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!!  :wow: :wow:
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.

Screenshoots da spell no jogo:

Spoiler
[close]

Dark Hole ativado:
Spoiler
[close]




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. 

Opa bom te ver na ativa May!  :wow:
Vou ficar no aguardo para destrinchar o código quando subir  :malvado:
Pelo vídeo parece que está legal a conexão com o SQL, tem pretensões maiores com isso? Tipo fazer um yu-gi-oh online ou algo do tipo?

Oi Raizen, saudades. :3
Fazer um online seria muito melhor porque daí eu evitaria fazer uma AI, mas eu acho que por enquanto ele fica no offline mesmo, daí sim, se eu concluir tudo certinho posso pensar em passar ele pro Photon.

É sempre legal ver sistemas e tutoriais sobre jogos do estilo tcg (trading card game), principalmente do yugi oh... se surgir a oportunidade de criar um tutorial sobre alguns sistemas desse projeto, acredito que muitas pessoas vão gostar...

Sistema interessantíssimo May!
Deixo aqui meu feedback positivo pro seu futuro tutorial. Me inscrevi no Canal também!
Abçs!

Vamos coloca-la pra trabalhar  :*-*:

Eu também tenho interesse em um jogo de cartas no meu futuro game de rpg, mesmo que seja em outra engine da pra pegar a teoria da mecânica e usar  :popcorn:

Citação de: razier online 28/06/2019 às 17:10
É sempre legal ver sistemas e tutoriais sobre jogos do estilo tcg (trading card game), principalmente do yugi oh... se surgir a oportunidade de criar um tutorial sobre alguns sistemas desse projeto, acredito que muitas pessoas vão gostar...

Eu realmente estava em dúvida se faria o tutorial ou não, pelo visto o pessoal realmente quer, então eu talvez faça hein?
Por enquanto estou no processo de desenvolvimento, mas assim que terminar, inicio uma série de tutoriais.

Citação de: Yxin online 28/06/2019 às 17:38
Sistema interessantíssimo May!
Deixo aqui meu feedback positivo pro seu futuro tutorial. Me inscrevi no Canal também!
Abçs!

Obrigada por se inscrever! Espero que goste do conteúdo de lá!  :blink:

Citação de: hategum rpg online 28/06/2019 às 21:19
Vamos coloca-la pra trabalhar  :*-*:

Eu também tenho interesse em um jogo de cartas no meu futuro game de rpg, mesmo que seja em outra engine da pra pegar a teoria da mecânica e usar  :popcorn:

Exatamente! Mesmo não sendo para RPG Maker, o que importa é a lógica empregada, então apesar dos códigos serem em C# alguém pode converter a lógica para o JavaScript do MV, inclusive como esse maker usa o JS, o SQLite pode ser substituído pelo JSON, apesar de que deve existir por aí uma DLL que integre o MV com SQLite, talvez.





Updates:

Já terminei o sistema de draw.


- A AI também compra 5 cartas iniciais, porém viradas para baixo;
- Refatoração de código que permite o gerenciamento de qualquer deck no jogo (independente se for da AI ou do main player);
- Animação quando as cartas são compradas;
- Animação quando passa o mouse sobre a carta;
- Query dinâmica dentro do DB para reconhecer o deck do jogador que deve ser lido;
- Sistema de Shuffle deck com base do algoritmo Fisher–Yates shuffle

Por conta da refatoração, o gerenciamento do deck que vai ser comprado está dinâmico, ele reconhece quando é o deck da AI ou do main player, retornando a list de cartas correspondente e posicionando as instâncias das mesmas no devido local na cena, dependendo do jogador corrente. Para isso, basta chamar a função de Draw e apenas passar como argumento um valor booleano (se false é AI, se true é o main player), apesar de que não há necessidade de passar true para a função, pois a mesma já entende de que quando não há argumentos, trata-se do main player por default.

Outra vantagem aqui é que o sistema de draw não se limita apenas ao draw inicial de 5 cartas, mas de qualquer momento (as jogadas subsequentes) e também quando se necessitar comprar mais de uma carta de uma vez (caso a pessoa implemente o sistema de fusão do Forbidden Memories ou o efeito de uma carta de compra como Pot of Greed). Basta passar como argumento da função a quantidade de cartas que quer comprar, que o sistema já faz as compras de acordo com a quantidade necessária.

Bem, tudo isso para o Draw de cartas, agora poderei iniciar a programação do comportamento delas (colocar para cima ou para baixo, defesa ou ataque e etc.)

Aguardem por mais atualizações.
:ok:

Atualização:



Adição de background;
Draw pra AI;
Sistema de ações das cartas: set up, down, change mode, battle e cancel;
Sistema de reorganizar cartas na mão quando joga uma carta ao campo;
Animação quando passa o mouse na carta;
Animação quando compra carta;
Refatoração do código;
Adição de novas cartas no banco de dados;
Shuffle(embaralhador de cartas) com algoritmo Swap Shuffle

Caramba, não havia visto esse. Ficou muito suave, os menus e a movimentação das cartas haha. Diria que idêntico ao Forbiden Memories. Planeja usar em alguma coisa ou é apenas para estudo?

Curti pakas, deu até saudade do ps1 agora.
Seria bacana colocar nas opções a tecla/botão para apertar, assim não tendo que levar o mouse sempre para os comandos.

Fico no aguardo de mais novidades. :)

2010 ~ 2016 / 2024

Citação de: Corvo online 13/07/2019 às 07:05
Caramba, não havia visto esse. Ficou muito suave, os menus e a movimentação das cartas haha. Diria que idêntico ao Forbiden Memories. Planeja usar em alguma coisa ou é apenas para estudo?

Oi, Corvo! Primeiramente obrigada pelo comentário!
Bem, por enquanto estou usando o sistema como estudo (e posso dizer que evoluí muito com ele ahah) mas assim que concluído e lapidado, pretendo usar esse sistema para criar um tutorial de como desenvolver um YuGiOh em C#, então está servindo pra bastante coisa. xD

Citação de: Victor Sena online 13/07/2019 às 14:49
Curti pakas, deu até saudade do ps1 agora.
Seria bacana colocar nas opções a tecla/botão para apertar, assim não tendo que levar o mouse sempre para os comandos.

Fico no aguardo de mais novidades. :)

Olá, Victor, tudo bem?
Obrigada pela sugestão sobre os botões, estarei anotando para uma futura implementação.  :ok:




Update de hoje:

Fiz a ação de substituir cartas (Replace) quando o tabuleiro está com cinco cartas (cheio).
É bem simples: Se o seu tabuleiro estiver cheio, o sistema vai esperar até que você escolha alguma carta que já está em campo para ser substituída, então ao fazer isso, a carta antiga sai do tabuleiro e é mandada ao graveyard (por enquanto é só destruída da cena, mesmo) e a nova carta vai para o campo na posição da carta destruída.

Testei aqui fazendo com que o player inicialmente compre 7 cartas (só pra ver como que fica) e não ativei a Main Phase quando se coloca a carta em campo, dessa forma, ficamos na Draw Phase e eu posso colocar cartas a vontade no tabuleiro, e assim que ele fica cheio e eu tento colocar mais uma carta em campo, o sistema pede pra fazer a substituição, então está tudo funcionando corretamente como esperado.  :tacerto:

Opa agora está tomando forma!

Eu tinha comentado antes, mas sempre é bom deixar o meu incentivo no fórum também! Parabéns pelo trabalho e claro boa sorte!
Gostei bastante do que já tem até aqui, isso dá um trabalho... haha. FIco no aguardo para atualizações!  :wow:

Citação de: Raizen online 16/07/2019 às 23:54
Opa agora está tomando forma!

Eu tinha comentado antes, mas sempre é bom deixar o meu incentivo no fórum também! Parabéns pelo trabalho e claro boa sorte!
Gostei bastante do que já tem até aqui, isso dá um trabalho... haha. FIco no aguardo para atualizações!  :wow:

Oi Raizen! Sempre bom te ver nos meus tópicos.  :lol:
Sim, já tem umas coisinhas, agora criei praticamente o sistema de batalha todo (só falta uns diálogos ou animações para o feedback visual) mas tá pronto.
O sistema está ficando tão complexo que tive que usar interfaces para padronizar as ações de cartas, já que agora com a AI, ela também fará jogadas e consequentemente ações com as cartas.
Também simulei uma AI provisória para ela jogar cartas da mão no campo (uhuhuh chega a ser bizarro ver o bot jogando sozinho, mesmo se foi só pra testar a Battle Phase) mas o legal é que o sistema sempre foi planejado pensando na AI e com isso quase que não tive que fazer modificações no código fonte das ações (obrigada POO).

Eu tenho algumas perguntas sobre o sistema;

Citar
Também simulei uma AI provisória para ela jogar cartas da mão no campo (uhuhuh chega a ser bizarro ver o bot jogando sozinho, mesmo se foi só pra testar a Battle Phase) mas o legal é que o sistema sempre foi planejado pensando na AI e com isso quase que não tive que fazer modificações no código fonte das ações (obrigada POO).

Com esta essa AI? o bot tem alguma estratégia de vitória? ou as coisas acontecem aleatoriamente?
Tem cemitério na tela? Eu não sei as regras, tem limite de cartas pra colocar em tela?


@HATEGUM RPG:
Olá, tudo bem? Vou responder cada uma das perguntas, obrigada por perguntar:

1. Com esta essa AI?
R: Por enquanto não chamaria de AI, no presente momento ela só joga cartas aleatórias da mão e passa a vez, mas eu fiz assim só para testar o sistema de batalhas e ter cartas da AI no campo para poder atacar.

2. o bot tem alguma estratégia de vitória?
R: Sim. Na verdade planejei uma AI ofensiva que prioriza atacar e destruir as cartas do oponente, assim como as AIs iniciais do Forbidden Memories.
Por ser uma AI mais simples (porque vai se tratar de um tutorial e eu ainda não quero me aprofundar muito) ela não vai usar um peso de decisões, na árvore de decisões ela realmente vai dar preferência por atacar a carta do oponente em modo de ataque, e depois em modo de defesa. Caso não consiga em ambos os casos, se defende. Vai ser basicamente isso.

ou as coisas acontecem aleatoriamente?
R: Sim e não. Para dar uma aleatoriedade, a AI não pensará tanto qual a carta que vai jogar da mão para o campo, então essa parte vai ser randômica mesmo. Porém, como eu disse na resposta acima, ela terá um grau de decisão se ataca ou defende.
No caso de o tabuleiro dela estar cheio e ela ter de escolher uma carta para substituir, ela terá um critério de pensamento que será descartar a carta com menor ataque E menor defesa.

Tem cemitério na tela?
R: Não. Assim como no Forbidden Memories (que é meu modelo de design) não há informações das cartas destruídas na tela, nem acesso a elas. Mas claro, isso pode ser facilmente implementado se a pessoa quiser.

Eu não sei as regras, tem limite de cartas pra colocar em tela?
R: Acho que acabei respondendo essa dúvida anteriormente. Sim, tem limite de cartas no campo, caso tenha 5 cartas você precisará substituir uma carta que está em campo e colocar a nova.
No caso da mão deve-se ter sempre 5 cartas, igual ao Forbidden Memories.