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

[MV] Sistema de Afinidade entre personagens

Iniciado por PauloHPBender, 27/06/2020 às 23:04

27/06/2020 às 23:04 Última edição: 28/06/2020 às 01:46 por Gabriel
Boa noite, colegas desenvolvedores!

Estou aqui quebrando a cabeça sobre como criar um sistema de afinidade entre os personagens do meu jogo.
Minha ideia é a seguinte: Ao término de cada combate, os personagens no grupo ativo ganham 1 ponto de afinidade entre si.

Meu projeto tem 8 personagens jogáveis, vamos chamá-los de "Paulo","Lucas","Marcelo","Douglas","Fernando","Marcos","Ivan" e "Júnior".
Para criar esse sistema, eu estava pensando em proceder da seguinte maneira:

Crio uma variável de Afinidade entre cada dupla possível de personagens:
- Afinidade_PauloLucas
- Afinidade_PauloMarcelo
- Afinidade_PauloDouglas
- Afinidade_PauloFernando

Ao término do combate, um evento comum ocorre (ainda não sei como fazer essa parte), checando todas as duplas possíveis:
"Paulo está no grupo? Lucas está no grupo? Se sim para ambos, aumenta Afinidade_PauloLucas em +1"

Com esses valores de Afinidade em mãos, eu posso ajustar diálogos que ocorrem entre os personagens na base, e também posso fazer states especiais (cujo efeito pode ser baseado no valor da variável), mas essa segunda parte vai requerer algum plugin mais profundo, talvez o do Yanfly, se eu conseguir vender meu rim.

Algum dos senhores tem ideias e dicas de como eu deveria proceder? minha lógica parece correta?
"A diferença entre um mestre e um aprendiz é que o mestre já falhou mais vezes que o aprendiz já tentou"

Veja se é possível criar um 'banco de dados' no MV. Por exemplo, os atores variam de 1 a 8. Então, você precisa de 8 variáveis de afinidade. Além disso, uma variável extra que irá funcionar como um contador (que varia de 1 a 8).

Lógica:
            Se Personagem[Contador] está na party,
            Afinidade[Contador] += 1.

Assim, se um dos heróis estiver na party, irá aumentar a variável de afinidade daquele herói. O que eu pretendo sugerir é que vc não precisa criar todas as combinações de duplas, basta adicionar valor à variável do herói que estiver na party e depois comparar esse valor.
Unique Destiny | um novo conceito de RPG Maker 2000!

Oi cara, obrigado pela resposta rápida!

Entendi sua lógica, e ela parece válida, mas admito que ainda não tenho experiência coms os scripts e o formato do banco de dados do MV.
"A diferença entre um mestre e um aprendiz é que o mestre já falhou mais vezes que o aprendiz já tentou"

27/06/2020 às 23:50 #3 Última edição: 27/06/2020 às 23:53 por Raizen
Entendi aonde quer chegar.
É possível por eventos? Sim, porém se você tem 8 personagens, você vai ter 56 afinidades diferentes, não concorda?
Acho esse trabalho bem trabalhoso por eventos apenas.

Sei que também aprender a programar se está travado apenas nisso, pode não ser o caminho que quer seguir, acho que dá para ter um meio termo pra ti.

Posso por exemplo adicionar esses atributos para todos os personagens que você tem, então sei lá, quer aumentar a afinidade do personagem um do db, ficaria algo tipo $gameActors.actor(id).addAffinity(id2, valor) sendo id2 a afinidade de quem você quer adicionar.
pra buscar $gameActors.actor(id).getAffinity(id2) ai você monta as condições do jeito que quiser.

Ah, acabei fazendo isso haha, não testei, mas deve estar certo, ou quase. Então o resto você montaria a partir daqui.

Só adicionar como plugin novo que você pode usar esses comandos que coloquei ai em cima. Ai a lógica é por conta de você haha, em como usar isso.
(function() {
	var Game_Actor_setup = Game_Actor.prototype.setup;
	Game_Actor.prototype.setup = function(actorId) {
		Game_Actor_setup.call(this, actorId);
		this.affinityActors = new Array();
	};
	Game_Actor.prototype.addAffinity = function(actorId, value) {
		this.affinityActors[actorId] |= 0;
		this.affinityActors[actorId] += value;
	};
	Game_Actor.prototype.getAffinity = function(actorId) {
		return this.affinityActors[actorId];
	};

})();


Era mais ou menos isso que queria não?

28/06/2020 às 00:01 #4 Última edição: 28/06/2020 às 00:05 por PauloHPBender
Citação de: Raizen online 27/06/2020 às 23:50
Entendi aonde quer chegar.
É possível por eventos? Sim, porém se você tem 8 personagens, você vai ter 56 afinidades diferentes, não concorda?
Acho esse trabalho bem trabalhoso por eventos apenas.

Sei que também aprender a programar se está travado apenas nisso, pode não ser o caminho que quer seguir, acho que dá para ter um meio termo pra ti.

Posso por exemplo adicionar esses atributos para todos os personagens que você tem, então sei lá, quer aumentar a afinidade do personagem um do db, ficaria algo tipo $gameActors.actor(id).addAffinity(id2, valor) sendo id2 a afinidade de quem você quer adicionar.
pra buscar $gameActors.actor(id).getAffinity(id2) ai você monta as condições do jeito que quiser.

Ah, acabei fazendo isso haha, não testei, mas deve estar certo, ou quase. Então o resto você montaria a partir daqui.

Só adicionar como plugin novo que você pode usar esses comandos que coloquei ai em cima. Ai a lógica é por conta de você haha, em como usar isso.
(function() {
	var Game_Actor_setup = Game_Actor.prototype.setup;
	Game_Actor.prototype.setup = function(actorId) {
		Game_Actor_setup.call(this, actorId);
		this.affinityActors = new Array();
	};
	Game_Actor.prototype.addAffinity = function(actorId, value) {
		this.affinityActors[actorId] |= 0;
		this.affinityActors[actorId] += value;
	};
	Game_Actor.prototype.getAffinity = function(actorId) {
		return this.affinityActors[actorId];
	};

})();


Era mais ou menos isso que queria não?

Eram bem isso, Raizen, muito obrigado pela colaboração! Como cada variável é para uma dupla, e não para um indivíduo (ou seja, a existência da afinidade Paulo x Lucas invalida a existência da afinidade Lucas x Paulo), acabei não precisando de tantas assim no database.

Meus desafios agora são:
- Ser capaz de chamar o evento comum que ajusta as afinidades ao término dos combates
- Conseguir criar states passivos cujo poder é baseado na afinidade PersonagemA_PersonagemB e que consiga "puxar" o atributo do personagem B para gerar um bônus ao personagem A

Acho que essas duas questões são solucionáveis com plugins de states e de passivas, vou dar uma pesquisada.

PS.: Eu fico embasbacado com a velocidade que você conseguiu fazer um script desses, ainda não entendo nada da estrutura de javascript para saber o que exatamente está sendo feito aí, meus parabéns!
"A diferença entre um mestre e um aprendiz é que o mestre já falhou mais vezes que o aprendiz já tentou"

Tomei a liberdade de editar o código que o Raizen postou logo acima. Adicionei o processo para automatizar a distribuição de afinidade após o fim das batalhas. Em tese deve estar funcionando tudo corretamente, substitua o código antigo por esse e faça os testes aí. Se der algum problema só avisar. o)

(function() {
	var Game_Actor_setup = Game_Actor.prototype.setup;
	Game_Actor.prototype.setup = function(actorId) {
		Game_Actor_setup.call(this, actorId);
		this.affinityActors = new Array();
	};
	Game_Actor.prototype.addAffinity = function(actorId, value) {
		this.affinityActors[actorId] |= 0;
		this.affinityActors[actorId] += value;
	};
	Game_Actor.prototype.getAffinity = function(actorId) {
		return this.affinityActors[actorId];
	};

	var Game_Actor_performVictory = Game_Actor.prototype.performVictory;
	Game_Actor.prototype.performVictory = function() {
		Game_Actor_performVictory.call(this);
		$gameParty.battleMembers().forEach( actor => {
			if (actor._actorId != this._actorId) this.addAffinity(actor._actorId, 1);
		})
	}

})();


O princípio para acessar as afinidades permanece o mesmo através de $gameActors.actor(id).getAffinity(id2) e você ainda pode ajustar os valores de afinidade manualmente com $gameActors.actor(id).addAffinity(id2, valor).

Tirando essa etapa do caminho o resto você deve conseguir fazer facilmente através de eventos.


Muito obrigado, Gabriel! Testei aqui, funcionou perfeitamente! Como esse é um sistema implícito, não haverá a necessidade de eu buscar métodos de mostrar os valores das afinidades; elas serão indicadas por linhas de diálogo e pelos states de fortalecimento que os personagens darão uns aos outros.

Àqueles com o poder para isso, o tópico já pede ser marcado como solucionado, obrigado a todos!
"A diferença entre um mestre e um aprendiz é que o mestre já falhou mais vezes que o aprendiz já tentou"