🤔 Para Refletir :
"Não force a criatividade, liberte a sua mente e a criatividade virá."
- Frank

Lógica de um sistema de Tactics

DWoonD Masculino

Novato
Membro
Membro
Juntou-se
12 de Julho de 2015
Postagens
11
Bravecoins
0
Área
Programação
Fala galera beleza?

Estou criando esse tópico porque eu quero fazer um games de batalha no estilo final fantasy e gostaria de contar com a ajuda de vocês para poder abstrair melhor esses conceitos e poder transformar isso em código e de forma escalável.

Como eu sei que isso é um sistema super complexo e que tem um milhão de coisas a se pensar, eu quero ir por partes nisso, e acredito que consigo ir fazendo cada coisa independentemente de outra, e para iniciar eu queria saber como poderia criar o mapa em si, os tiles e fazer isso gerar um campo, ou espaço maior, para poder colocar os personagens. Depois poderíamos aprimorar esse cenário fazendo ele com geração de terrenos diferentes, e colocando sprites etc, mas por hora o básico.

E lembre-se pessoal eu quero a lógica de como poderíamos construir isso usando programação de preferencia Javascript para web, nada de sistemas prontos e talz.
 
A alguns anos atrás eu iniciei um tópico assim, mas no caso eu já tinha definido tudo o que queria. Acho que falta informação aí amigo, afinal "Lógica de sistema tactics" é um assunto extremamente vasto.
O que você tem pronto?
E não entendi essa dos mapas, não é só criar um mapa no padrão do maker?? Procure aulas de mapeamento no RPG Maker ou explique melhor sua dúvida.

Se você é um iniciante, então sinto muito, você tem um loooonnnngo caminho pela frente até chegar ao ponto de criar algo assim, sendo que até hoje ninguém das américas conseguiu criar nenhum sistema do tipo tático. O único que presta mais ou menos é o Tomoaky SRPG para RMVX, mesmo assim tem erros demais que acabam tornando-o não viável. Infelizmente não tem este script para MV e de acordo a experiência com as outras engines vai demorar, mas não tanto quanto antigamente devido a rapidez com que o povo se adaptou ao Javascript.

A lógica é mover personagens num mapa limitado, sendo que cada personagem possui seu alcance de movimento diferenciado dos outros, alcance de ataque também diferente. A dificuldade fica por conta de duas coisas: O Pathfind que é o sistema que irá mover de forma inteligente os personagens e o sistema de inteligência artificial para fazer escolhas baseadas na estratégia do mapa em si. Eu criei um sistema tático em 2013 totalmente por eventos, mas infelizmente a inteligencia não ficou lá essas coisas, está 100% jogável e é o sistema do jogo Maker Zone.

Eu estarei aqui para desenvolver isso junto com você, daqui a alguns meses também vou fazer um projeto tático e para isso vou tentar criar este sistema.
 
Eu realmente recomendo começar com algo menor; tentar começar com algo desse porte é meio frustrante e tal. Mas entendo também a empolgação de já querer fazer exatamente aquilo que realmente tem vontade.



De qualquer forma, vamos lá... abstraindo a maneira de implementação de um sistema Tactics típico, independente da engine.

Você vai precisar ter, ao menos:

  • Um tipo de entidade que representarão os personagens na batalha, tanto os personagens do jogador quanto os inimigos. Usando a nomenclatura do RM, vamos chamar essa entidade de "Battlers", e mais especificamente vamos chamar os personagens do jogador de "Actors" e os inimigos de "Enemies". Essa entidade Battler precisará possuir todos os dados necessários sobre as unidades: atributos, informações de sprite, etc.
  • Uma array ou outro tipo de lista com os Battlers presentes na batalha.
  • Um tipo de entidade de "ação", que seria usada para criar ataques, skills, itens, etc. Cada battler teria sua lista de ações válidas.
  • Um tipo de entidade que represente os tiles do mapa. Esse tipo de entidade precisa de atributos como o tipo de terreno, a altura do tile, e qualquer outro tipo de informação sobre tile.
  • Uma array (ou outra forma de conjunto, claro) de Tiles, oordenada de forma a montar o mapa a partir dela.
  • Algumas informações extras da iniciação da batalha em si, como a zona do mapa em que se pode iniciar unidades, tiles iniciais dos inimigos, objetivo de batalha, efeito de derrota, etc.

Ok... tudo isso são só os pré-requisitos específicos aqui, sem falar no básico para uma engine funcional (uma forma de mover entre cenas, um window manager, um input manager, etc, etc). Assumindo que já temos tudo isso:

  1. Assim que a Scene de batalha começa, precisamos ler a array de tiles e desenhar eles na tela a partir disso. Cada instância da entidade Tile vai dizer o tipo de terreno e a altura do tile, então desenhamos de maneira apropriada baseando nisso.
  2. Colocamos os inimigos em seus tiles iniciais e desenhamos seus sprites neles.
  3. Damos um highlight nos tiles válidos para deploy inicial das unidades do player, e abrimos a janela de Prompt para o jogador selecionar cada unidade e selecionar o tile onde ela irá ficar. Esse processo fica em loop até todas unidades terem sido selecionadas; após isso uma caixa de confirmação aparece para que o jogador inicie a batalha.
  4. Dentro da batalha, temos um loop de rounds. Cada round vai ter um turno do jogador e um turno dos inimigos. No turno do jogador, pegamos a array com os Battlers da party, organizamos por ordem de iniciativa, e para cada um deles damos um prompt de janela para o jogador dar input nos comandos.
  5. Um comando de "Move", por exemplo, precisaria calcular baseado na velocidade da unidade, e nos modificadores daquela unidade para os diferentes tipos de tile (e alturas), quais tiles são alcançáveis para essa unidade nesse turno, e dar highlight neles e deixa-los selecionáveis para movimento. Se a ação de movimento for então realizada, precisa ser aplicada a animação no sprite, com um pathing até o tile desejado, e atualizas as coordenadas nos atributos do battler.
  6. Similarmente, ao selecionar uma ação como "Attack" ou outras skills, o jogo precisaria calcular o range baseado nos atributos da Action e no mapa ao redor, e então deixar o jogador escolher qual tile dentro desse range pretende executar a ação. No caso da ação ser executada, precisa então executar as animações de sprite e calcular os efeitos, como danos, chances de status, etc - e depois calcular qualquer efeito colateral disso (se alguém ficou com 0 de HP, precisa ser removido do combate, ou se alguem tem counter-attack, precisa efetuar, etc).
  7. Após todos battlers do jogador agirem, o jogo passaria para o turno dos inimigos. Cada inimigo precisaria ter alguma forma programada para decidir qual ação tomar, ou talvez poderia ser usada uma AI geral básica para todos (algo extremamente básico seria: ande em direção a um oponente mais próximo até entrar em range para atacar, ataque se já estiver em range). Tudo aqui funcionaria mais ou menos igual ao turno do jogador, com a diferença que não haveria janelas de input (ao invés disso seriam decididos pela AI).
  8. Os rounds se repetiram em loop assim até que as condições de fim de batalha sejam preenchidas, checadas a cada fim de ação.
 
Ludovic comentou:
A alguns anos atrás eu iniciei um tópico assim, mas no caso eu já tinha definido tudo o que queria. Acho que falta informação aí amigo, afinal "Lógica de sistema tactics" é um assunto extremamente vasto.
O que você tem pronto?
E não entendi essa dos mapas, não é só criar um mapa no padrão do maker?? Procure aulas de mapeamento no RPG Maker ou explique melhor sua dúvida.

Se você é um iniciante, então sinto muito, você tem um loooonnnngo caminho pela frente até chegar ao ponto de criar algo assim, sendo que até hoje ninguém das américas conseguiu criar nenhum sistema do tipo tático. O único que presta mais ou menos é o Tomoaky SRPG para RMVX, mesmo assim tem erros demais que acabam tornando-o não viável. Infelizmente não tem este script para MV e de acordo a experiência com as outras engines vai demorar, mas não tanto quanto antigamente devido a rapidez com que o povo se adaptou ao Javascript.

A lógica é mover personagens num mapa limitado, sendo que cada personagem possui seu alcance de movimento diferenciado dos outros, alcance de ataque também diferente. A dificuldade fica por conta de duas coisas: O Pathfind que é o sistema que irá mover de forma inteligente os personagens e o sistema de inteligência artificial para fazer escolhas baseadas na estratégia do mapa em si. Eu criei um sistema tático em 2013 totalmente por eventos, mas infelizmente a inteligencia não ficou lá essas coisas, está 100% jogável e é o sistema do jogo Maker Zone.

Eu estarei aqui para desenvolver isso junto com você, daqui a alguns meses também vou fazer um projeto tático e para isso vou tentar criar este sistema.

Então ludovic, o que quis dizer com mapa foi de gerar um mapa quadradinho e talz, e a primeira vista eu não tinha intenção de fazer isso com MV em si, queria abstrair principalmente os conceitos como a Ellye fez para poder fazer isso em qualquer linguagem ou com qualquer engine. Sou bem novato sim nos makers e engines por isso estava querendo abstrair para tentar fazer isso para web, para rodar em browser, primeiramente em 2D bem chapado e depois talvez com SVG ou Canvas e dar alguma beleza ao todo.

Por isso falei em mapa, para começar com ele, pois acho que seria um bom inicio, saber ver as classes para criar o mapa depois algo para gerar ele, e gerar os terrenos de forma aleatória e talz, etc.

Espero que continue sim, ajudando e quem sabe podemos trazer isso sim para o MV e como você é mais experiente quando começar o seu deixe saber mais sobre e talz, pois para eu começar a fazer isso para o rpg maker eu vou ter que entender todos os esquemas (como os nomes Actors, Scene etc) e por hora nem sei onde encontrar isso.

Mas obrigado por tudo, espero ter esclarecido mais, e não fui tão específico pois acho que cada coisa pode funcionar em separado certo? tipo ter algo que gere o mapa, depois ter algo que cuide dos personagens, depois ter algo que cuide das habilidades etc.

Ellye comentou:
Eu realmente recomendo começar com algo menor; tentar começar com algo desse porte é meio frustrante e tal. Mas entendo também a empolgação de já querer fazer exatamente aquilo que realmente tem vontade.



De qualquer forma, vamos lá... abstraindo a maneira de implementação de um sistema Tactics típico, independente da engine.

Você vai precisar ter, ao menos:

  • Um tipo de entidade que representarão os personagens na batalha, tanto os personagens do jogador quanto os inimigos. Usando a nomenclatura do RM, vamos chamar essa entidade de "Battlers", e mais especificamente vamos chamar os personagens do jogador de "Actors" e os inimigos de "Enemies". Essa entidade Battler precisará possuir todos os dados necessários sobre as unidades: atributos, informações de sprite, etc.
  • Uma array ou outro tipo de lista com os Battlers presentes na batalha.
  • Um tipo de entidade de "ação", que seria usada para criar ataques, skills, itens, etc. Cada battler teria sua lista de ações válidas.
  • Um tipo de entidade que represente os tiles do mapa. Esse tipo de entidade precisa de atributos como o tipo de terreno, a altura do tile, e qualquer outro tipo de informação sobre tile.
  • Uma array (ou outra forma de conjunto, claro) de Tiles, oordenada de forma a montar o mapa a partir dela.
  • Algumas informações extras da iniciação da batalha em si, como a zona do mapa em que se pode iniciar unidades, tiles iniciais dos inimigos, objetivo de batalha, efeito de derrota, etc.

Ok... tudo isso são só os pré-requisitos específicos aqui, sem falar no básico para uma engine funcional (uma forma de mover entre cenas, um window manager, um input manager, etc, etc). Assumindo que já temos tudo isso:

  1. Assim que a Scene de batalha começa, precisamos ler a array de tiles e desenhar eles na tela a partir disso. Cada instância da entidade Tile vai dizer o tipo de terreno e a altura do tile, então desenhamos de maneira apropriada baseando nisso.
  2. Colocamos os inimigos em seus tiles iniciais e desenhamos seus sprites neles.
  3. Damos um highlight nos tiles válidos para deploy inicial das unidades do player, e abrimos a janela de Prompt para o jogador selecionar cada unidade e selecionar o tile onde ela irá ficar. Esse processo fica em loop até todas unidades terem sido selecionadas; após isso uma caixa de confirmação aparece para que o jogador inicie a batalha.
  4. Dentro da batalha, temos um loop de rounds. Cada round vai ter um turno do jogador e um turno dos inimigos. No turno do jogador, pegamos a array com os Battlers da party, organizamos por ordem de iniciativa, e para cada um deles damos um prompt de janela para o jogador dar input nos comandos.
  5. Um comando de "Move", por exemplo, precisaria calcular baseado na velocidade da unidade, e nos modificadores daquela unidade para os diferentes tipos de tile (e alturas), quais tiles são alcançáveis para essa unidade nesse turno, e dar highlight neles e deixa-los selecionáveis para movimento. Se a ação de movimento for então realizada, precisa ser aplicada a animação no sprite, com um pathing até o tile desejado, e atualizas as coordenadas nos atributos do battler.
  6. Similarmente, ao selecionar uma ação como "Attack" ou outras skills, o jogo precisaria calcular o range baseado nos atributos da Action e no mapa ao redor, e então deixar o jogador escolher qual tile dentro desse range pretende executar a ação. No caso da ação ser executada, precisa então executar as animações de sprite e calcular os efeitos, como danos, chances de status, etc - e depois calcular qualquer efeito colateral disso (se alguém ficou com 0 de HP, precisa ser removido do combate, ou se alguem tem counter-attack, precisa efetuar, etc).
  7. Após todos battlers do jogador agirem, o jogo passaria para o turno dos inimigos. Cada inimigo precisaria ter alguma forma programada para decidir qual ação tomar, ou talvez poderia ser usada uma AI geral básica para todos (algo extremamente básico seria: ande em direção a um oponente mais próximo até entrar em range para atacar, ataque se já estiver em range). Tudo aqui funcionaria mais ou menos igual ao turno do jogador, com a diferença que não haveria janelas de input (ao invés disso seriam decididos pela AI).
  8. Os rounds se repetiram em loop assim até que as condições de fim de batalha sejam preenchidas, checadas a cada fim de ação.


Ellye quando você diz entidade posso presumir que esteja falando em classe OO certo?
Agradeço muito a visão geral que você deu de tudo, eu vou ver por essas semanas e tentar desenvolver essa classe que faça o mapa, gere os tiles, tipo de terrenos e exiba isso nem que for com id ou números por hora e ai quando eu tiver isso no browser eu volto aki e ai podemos continuar pensando e abstraindo mais.

Obrigado pessoal

PS: Acho que vou criar isso tudo no Github também ai quando tiver o repositório eu aviso aqui também
 
Oi amigo, o sistema que irei criar provavelmente vai demorar bastante, porque iniciarei agora um projeto de Jogo de Monstros comercial. Só depois eu irei criar um tático comercial que será um sequel desse inicial.

Como eu disse, a dificuldade estará na movimentação por range (alcances) diferentes e a inteligência artificial.
Adquirir qualquer informação como dados, atributos de batalha, nome, etc..., isso é fácil com o uso de variáveis. Sim, isso é extremamente simples.
Eu recomendo duas coisas antes de partir para algo mais complicado, procurar tutoriais sobre variáveis e switches e criar um projetinho inicial para ter experiência com algumas coisas mais básicas, porque realmente, o universo tático é complicado.

Eu estarei por aqui disponível para o que precisar e eu conseguir ajudar. Vamos levar essa idéia adiante
 
DWoonD comentou:
Ellye quando você diz entidade posso presumir que esteja falando em classe OO certo?
Agradeço muito a visão geral que você deu de tudo, eu vou ver por essas semanas e tentar desenvolver essa classe que faça o mapa, gere os tiles, tipo de terrenos e exiba isso nem que for com id ou números por hora e ai quando eu tiver isso no browser eu volto aki e ai podemos continuar pensando e abstraindo mais.

Obrigado pessoal

PS: Acho que vou criar isso tudo no Github também ai quando tiver o repositório eu aviso aqui também
Sim, entidades no caso podem ser classes em OO.

Se for fazer fora do RPG Maker, recomendo bastante dar uma olhada no conceito de Entity-Component System. É a maneira mais funcional para lidar com programação de jogos.
 
Cuidado com games de browser porque não combinam em nada com RPG Tático, uma vez que é algo demorado e precisa salvar. O mais indicado seria usar o MV e programar para PC com suporte a android também. Até mesmo porque se você conseguir programar para fora do RPG Maker então vai ser muito mais fácil no RPG Maker porque é uma engine poderosa que já te dá basicamente tudo o que precisa dos dados que vc tanto quer.
Mas claro tudo é possivel, no caso de fazer um game de browser com salvamento, vai ter que fazer site com recursos de cadastro e banco de dados, essas coisas, aí já vai muito além de só criar um jogo.
 
Ludovic comentou:
Mas claro tudo é possivel, no caso de fazer um game de browser com salvamento, vai ter que fazer site com recursos de cadastro e banco de dados, essas coisas, aí já vai muito além de só criar um jogo.
Embora convenhamos que, comparado como resto do trabalho envolvido, essa parte é o de menos.

E o resto do código em si é independente de rodar Web ou desktop.
 
Ellye comentou:
Ludovic comentou:
Mas claro tudo é possivel, no caso de fazer um game de browser com salvamento, vai ter que fazer site com recursos de cadastro e banco de dados, essas coisas, aí já vai muito além de só criar um jogo.
Embora convenhamos que, comparado como resto do trabalho envolvido, essa parte é o de menos.

E o resto do código em si é independente de rodar Web ou desktop.

Exatamente isso que eu iria dizer, que essa é a parte mais simples para mim kkkk

Vou dar uma analisada na documentação do Maker e tentar ir abstraindo no browser e trazendo para o maker para ir implementando, por hora agradeço muito pessoal.

Vou tentar fazer código essa semana e na outra e ai trago para ca para talvez tirar dúvidas ou dar prosseguimento ^^
 
Ellye comentou:
Ludovic comentou:
Mas claro tudo é possivel, no caso de fazer um game de browser com salvamento, vai ter que fazer site com recursos de cadastro e banco de dados, essas coisas, aí já vai muito além de só criar um jogo.
Embora convenhamos que, comparado como resto do trabalho envolvido, essa parte é o de menos.

E o resto do código em si é independente de rodar Web ou desktop.

Pra criar um game sem uso do rpg maker vc vai ter que aprender uma linguagem de programação orientada a objetos e etc. E vai ter o dobro do tempo e trabalho para também aprender a trabalhar com web design, PHP, MySQl e outras coisas. Não é uma parte simples comparada com o resto do projeto. É basicamente como se eu fosse me formar pra médio pra atuar num consultório mas pra isso eu também iria me formar em engenharia civil pra construir o consultório antes.
 
Ludovic comentou:
Pra criar um game sem uso do rpg maker vc vai ter que aprender uma linguagem de programação orientada a objetos e etc. E vai ter o dobro do tempo e trabalho para também aprender a trabalhar com web design, PHP, MySQl e outras coisas. Não é uma parte simples comparada com o resto do projeto. É basicamente como se eu fosse me formar pra médio pra atuar num consultório mas pra isso eu também iria me formar em engenharia civil pra construir o consultório antes.
É que acho que ele já não está considerando usar RPG Maker desde o começo, acho que a intenção dele é realmente aprender como fazer do zero e tal.

E com isso que eu estava comparando: depois de dominar programação no nível que você consegue fazer uma engine de jogo funcional com sistemas relativamente complexos, montar uma arquiteturazinha de site e serializar os saves num database ao invés de local file é o de menos.

Não acho que sua comparação tem muito a ver, você diz como se programar para web fosse algo muito diferente de programar desktop. Mas na pratica, se você domina um, é só questão de aprender as poucas diferenças, coisa de minutos, para conseguir fazer o outro. Não é aprender algo completamente novo do zero e etc.



Alias, para quem quiser um pouquinho mais de perto como criar uma engine de jogo, mas sem chegar ao ponto de literalmente ter que fazer tudo do zero, eu recomendo tentar criar algo com o defunto XNA ou com o vivo MonoGame.
 
Falo por experiência mesmo, porque conheço grandes scripters que fazem coisas maravilhosas como o Raizen por exemplo, mas pra fazer algo online aí já não serve. E é uma diferença bem grande entre orientada a objetos e acesso de database php etc... EM 2009 tínhamos um jogo chamado Pokemon World Online, para programar tudo era fácil, seguir os calculos, colocar os players todos no mesmo mapa sem lag mas na hora da comunicação de dados, do gerenciamento das contas era um sofrimento, tínhamos que esperar o programador oficial dos EUA que levava semanas pra responder. Bom mas o assunto do topico nem é esse, to encerrando por aqui. Quem quer mesmo, e se dedica pode fazer até muito mais que o que está proposto aqui, então acho melhor começar a estudar essas liguagens de agora.

 
Ludovic comentou:
Falo por experiência mesmo, porque conheço grandes scripters que fazem coisas maravilhosas como o Raizen por exemplo, mas pra fazer algo online aí já não serve. E é uma diferença bem grande entre orientada a objetos e acesso de database php etc...
Também falo por experiência, trabalho com as duas áreas minha vida inteira. E você tá confundindo como se "orientado a objeto" e "web" fossem coisas exclusivas. Não são; recomendo arquiteturas OO para qualquer projeto decente web também.

EM 2009 tínhamos um jogo chamado Pokemon World Online, para programar tudo era fácil, seguir os calculos, colocar os players todos no mesmo mapa sem lag mas na hora da comunicação de dados, do gerenciamento das contas era um sofrimento, tínhamos que esperar o programador oficial dos EUA que levava semanas pra responder.
Mas agora acho que entendi a maior diferença entre o que eu e você estamos falando aqui. Quando eu digo sobre fazer para web ser simples, eu não estou falando sobre multiplayer. Simplesmente sobre a pessoa jogar diretamente no navegador o save game ficar no servidor, mas sem interação direta com outros jogadores.

Multiplayer, especialmente em tempo real, é outra história que realmente joga a complexidade lá pra cima.
 
Ludovic quando falei que é simples para mim porque eu já trabalho criando sites, em php, acessando banco de dados e etc, eu estou começando a estudar orientação objeto e também javascript justamente para isso, mas obrigado, sei que sempre é um carminho arduo tudo, mas como você disse, com dedicação podemos sim ir mais longe, estou terminando um projeto esse fds semana que vem espero trazer mais coisas, obrigado galera
 
Fala pessoal
Espero que ainda estejam animados rs,

Bom vamos aos progressos, acho que demorei um pouco mais do que queria, mas pelo menos consegui fazer algo, estou em no básico ainda, pois como te falei tem bastante coisa acontecendo na vida e isso é algo que mesmo quando não estou codificando eu estou pensando.

Como comecei a trabalhar e lá é um pouco restrito a fazer coisas de fora, então meio que me atrasou um pouco, mas vamos aos progressos.

Código:
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>JS</title>
	<style>

	div:hover {
		background: rgba(255,255,255,.5);
	}
	
	div {
		cursor: pointer;
	}

	.agua {
		background: blue;
	}
	
	.campo {
		background: green;
	}
	
	.terra {
		background: brown;
	}
	
	</style>
</head>
<body style="margin:0;">
	<script>
		var terrenos = ['campo', 'terra', 'agua']

		function mapGenerator (x,y,z,a){
			for(i=0; i<z;i++){
				for(j=0; j<a;j++){
					rand = terrenos[Math.floor(Math.random() * terrenos.length)];
					document.write('<div class="'+rand+'" style="width: '+y+'px; height: '+x+'px; border:1px solid #333; display:inline-block; margin:0;">'+rand+'</div>');
				}
				document.write('
');
			}
		}

		mapGenerator(100,100,7,14);
	</script>
</body>
</html>

Bom aqui o que está acontecendo é, eu consigo definir o tamanho do square que eu crio (atualmente está sendo numa div. e Também a quantidade na horizontal e na vertical, consigo também pré-criar um mini gerador de tipos de terrenos e meio que exiir isso.

Primeiro gostaria de saber o que acham do código se tem algo a melhorar ou se estou fazendo de uma forma totalmente errada, acho que o próximo passo eu vou criar os terrenos em objetos ou functions mesmo para depois tentar resgatar algum valor desses terrenos, e depois colocar um 'player' no mapa ^^

Bom é isso espero que comentem e me digam o que acham
 
Voltar
Topo Inferior