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

Dúvida com script (Checar estado, checar habilidade, forçar ação)

Iniciado por RenatoCLeiva, 10/02/2019 às 12:22

Olá, pessoal! Eu de novo! Hehe

Uso o RPG Maker MV e há um tempo atrás pedi ajuda com uma mecânica de habilidades que eu estou tentando criar para o meu jogo. É como se fossem "follow-up skills", mas os scripts desse gênero ainda não supriram o que eu preciso...

Agora que entendo um pouquinho de lógica de programação (diferente do meu pedido anterior, quando eu não sabia nada hehe), acho que consigo deixar mais claro o que eu preciso que o script faça. Mas não consigo achar na internet os comandos certos para fazerem isso.  :T.T:

Como funcionam essas habilidades?

- Primeiro um usuário (que pode ser um aliado um inimigo!) realiza uma ação que causa um estado no alvo (novamente, pode ser um aliado ou um inimigo). Chamarei esse estado de Vulnerabilidade pra ajudar na explicação.

- Assim que realiza a ação, acontece uma checagem para ver quais personagens da equipe do usuário podem instantaneamente realizar uma ação no alvo com esse estado. Chamarei essa segunda ação de "Perseguição".

Por exemplo: se um Ator usou a primeira habilidade e causou esse estado (Vulnerabilidade) em um Inimigo, então a checagem é para ver se algum outro Ator possui a habilidade "Perseguição" para realizar a ação seguinte instantaneamente.

OU, se a habilidade foi usada por um Inimigo e causou Vulnerabilidade em um Ator, então a checagem é para ver se algum outro Inimigo possui a habilidade "Perseguição" para realizar a ação seguinte instantaneamente.

- Se houver alguém na equipe que tenha essa habilidade, ele é forçado a usá-la imediatamente no alvo com "Vulnerabilidade". 

Por exemplo, seguindo os exemplos anteriores: se um ator usou uma habilidade que causou "Vulnerabilidade" em um inimigo e houver algum outro ator (incluindo o usuário!) que possui a habilidade "Perseguição", esta ação é realizada imediatamente.

Mas, se um inimigo usa a habilidade que causa "Vulnerabilidade" em um Ator e se houver algum outro inimigo (incluindo o usuário!) que possui a habilidade "Perseguição", esta ação é realizada imediatamente.

Essa é a estrutura básica desse "sistema" (script) que eu estou tentando criar. Já consegui criar algo semelhante com eventos comuns, mas por esse método eu só consigo checar se atores específicos possuem a habilidade "Perseguição" (e como meu jogo tem MUITOS personagens, acaba sendo inviável criar uma checagem individual para cada ator - além de não conseguir colocar essa habilidade para ser executada por Inimigos).

Se eu conseguir descobrir os comandos para criar um script que faça o que está acima, já estarei super feliz!!! Haha

Mas, se possível, gostaria de tirar algumas outras dúvidas e fazer com que o script atenda a essas possibilidades também:

1- Uma habilidade que causa dano em grupo têm chances de causar "Vulnerabilidade" nos alvos.
   > Como fazer para que um personagem (inimigo ou ator) realize apenas uma "perseguição" em apenas um alvo caso mais de um personagem inimigo (ator ou inimigo) adquira o estado "Vulnerabilidade" (para que um mesmo personagem não realize a mesma ação em alvos diferentes)? (Porém, se houver outros personagem com a habilidade "Perseguição", cada um deles poderá usar sua habilidade em um dos alvos remanescentes)

2- Com o fim de ambas as ações (habilidade que causa "Vulnerabilidade" e habilidade "Perseguição") o estado "Vulnerabilidade é removido.
   > Sei que caso a habilidade "Perseguição" seja usada, é só acrescentar "Remover 'Vulnerabilidade'" nos efeitos da habilidade, mas e se a habilidade não for usada? Como faço para que o(s) alvo(s) percam o estado?

3- Mudança de sprite/posição.
   > Gostaria que alguns estados de vulnerabilidade causassem uma alteração física no personagem. Por exemplo: ao ser atingido por "Vulnerabilidade" o personagem ficasse caído no chão (chamaria esse estado de "queda" e usaria os sprites do personagem "morto") ou realizaria um salto na tela (chamaria esse estado de "Voo"). Como fazer isso?
    > Se no exemplo acima o personagem é atingido por "Voo", gostaria que a habilidade "Perseguição" fosse usada quando ele estivesse no "ar". Tem como fazer isso?

4- Combo ainda maior.
   > Gostaria de criar algumas habilidades de "Perseguição" que não só perseguissem o alvo, mas também o colocassem em um novo estado de "Vulnerabilidade", podendo acionar outra habilidade "Perseguição".
   Por exemplo:
   >> Personagem 1 usa uma habilidade que causa "Voo".
   >> Personagem 2 é forçado a usar uma habilidade que persegue "Voo" e causa "Queda" (nesse caso, Voo é removido e Queda é adicionado ao alvo).
   >> Personagem 3 é forçado a usar uma habilidade que persegue "Queda" (removendo "Queda").
 
Seria muito bom conseguir criar um script com todas essas funções, até para poder disponibilizar para outras pessoas que queiram utilizar esse sistema, mas realmente não encontro os comandos necessários.

Outro jeito que talvez supra as minhas necessidades é pelas "Action Sequences" do Yanfly, mas nesse caso também preciso de alguns comandos que eu desconheço.

OBS.: Tenho todos os plugins do Yanfly instalados.
Link para os plugins do Yanfly: http://yanfly.moe/yep/
Link para os plugins de Action Sequences:
http://yanfly.moe/2015/10/11/yep-4-action-sequence-pack-1/
http://yanfly.moe/2015/10/12/yep-5-action-sequence-pack-2/
http://yanfly.moe/2015/10/12/yep-6-action-sequence-pack-3/

Muito obrigado desde já, galera!  :ded:

Spoiler
Citação de: RenatoCLeiva online 10/02/2019 às 12:22
[...]
OBS.: Tenho todos os plugins do Yanfly instalados.
[...]

[close]

Se entendi bem, dá pra fazer tudo pelos campos de eventos das batalhas. Quanto menos código extra você inserir no jogo, melhor. Então vamos por partes:

1) Ao final de cada turno, verifique se os inimigos possuem o estado aplicado. Você pode verificar todos eles usando um ciclo. Como estrutura básica, temos isto:

Inimigo = 1
Personagem = 1

Início do Ciclo:
    Se (Inimigo) possui (Estado) aplicado:
        Se (Personagem) possui a habilidade (Perseguição):
            Realizar ação.
        Exceção:
            Personagem += 1
    Exceção:
        Inimigo += 1
    Se (Inimigo) é maior que (Número de Inimigos em Batalha):
        Fim do Ciclo
    Exceção:
        Continuar


Veja que realizamos a verificação em todos os inimigos e personagens, mas os atores ainda podem atacar mais de uma vez. Para corrigir isto, podemos ativar alguns switches que representam os ataques dos personagens:

Inimigo = 1
Personagem = 1

Início do Ciclo:
    Se (Inimigo) possui (Estado) aplicado:
        Se (Personagem) possui a habilidade (Perseguição):
            Se (Switch[ID do Personagem]) estiver (Desativado):
                Ativar Switch[ID do Personagem]
                Realizar ação.
            Exceção:
                Continuar
        Exceção:
            Personagem += 1
    Exceção:
        Inimigo += 1
    Se (Inimigo) é maior que (Número de Inimigos em Batalha):
        Fim do Ciclo
    Exceção:
        Continuar


E para remover o estado do inimigo basta incluir o comando no fim do ciclo que gera os ataques dos personagens:

Inimigo = 1
Personagem = 1

Início do Ciclo:
    Se (Inimigo) possui (Estado) aplicado:
        Se (Personagem) possui a habilidade (Perseguição):
            Se (Switch[ID do Personagem]) estiver (Desativado):
                Ativar Switch[ID do Personagem]
                Realizar ação.
            Exceção:
                Continuar
        Exceção:
            Personagem += 1
    Exceção:
        Remover (Estado) de (Inimigo)
        Inimigo += 1
    Se (Inimigo) é maior que (Número de Inimigos em Batalha):
        Fim do Ciclo
    Exceção:
        Continuar


Não sei se ficou claro, tentei deixar inteligível para quem não tem noção alguma de programação. Como você já começou, acho que não terá problemas. Mas qualquer dúvida é só dizer.

10/02/2019 às 13:30 #2 Última edição: 10/02/2019 às 13:46 por RenatoCLeiva
Citação de: Corvo online 10/02/2019 às 13:19
Spoiler

[close]

Se entendi bem, dá pra fazer tudo pelos campos de eventos das batalhas. Quanto menos código extra você inserir no jogo, melhor. Então vamos por partes:

1) Ao final de cada turno, verifique se os inimigos possuem o estado aplicado. Você pode verificar todos eles usando um ciclo. Como estrutura básica, temos isto:

Inimigo = 1
Personagem = 1

Início do Ciclo:
    Se (Inimigo) possui (Estado) aplicado:
        Se (Personagem) possui a habilidade (Perseguição):
            Realizar ação.
        Exceção:
            Personagem += 1
    Exceção:
        Inimigo += 1
    Se (Inimigo) é maior que (Número de Inimigos em Batalha):
        Fim do Ciclo
    Exceção:
        Continuar


Veja que realizamos a verificação em todos os inimigos e personagens, mas os atores ainda podem atacar mais de uma vez. Para corrigir isto, podemos ativar alguns switches que representam os ataques dos personagens:

Inimigo = 1
Personagem = 1

Início do Ciclo:
    Se (Inimigo) possui (Estado) aplicado:
        Se (Personagem) possui a habilidade (Perseguição):
            Se (Switch[ID do Personagem]) estiver (Desativado):
                Ativar Switch[ID do Personagem]
                Realizar ação.
            Exceção:
                Continuar
        Exceção:
            Personagem += 1
    Exceção:
        Inimigo += 1
    Se (Inimigo) é maior que (Número de Inimigos em Batalha):
        Fim do Ciclo
    Exceção:
        Continuar


E para remover o estado do inimigo basta incluir o comando no fim do ciclo que gera os ataques dos personagens:

Inimigo = 1
Personagem = 1

Início do Ciclo:
    Se (Inimigo) possui (Estado) aplicado:
        Se (Personagem) possui a habilidade (Perseguição):
            Se (Switch[ID do Personagem]) estiver (Desativado):
                Ativar Switch[ID do Personagem]
                Realizar ação.
            Exceção:
                Continuar
        Exceção:
            Personagem += 1
    Exceção:
        Remover (Estado) de (Inimigo)
        Inimigo += 1
    Se (Inimigo) é maior que (Número de Inimigos em Batalha):
        Fim do Ciclo
    Exceção:
        Continuar


Não sei se ficou claro, tentei deixar inteligível para quem não tem noção alguma de programação. Como você já começou, acho que não terá problemas. Mas qualquer dúvida é só dizer.

Kkkkkk A imagem define bem meu desespero kkkk (Mas, embora eu esteja com todos os plugins instalados, a maioria deles está desativado Hehe. Só ativo quando tenho certeza de que usarei algo dele  :XD:)


Então, essa estrutura funcionou pra mim como evento comum, o problema é que não sei como fazer o programa entender que eu quero essa lógica com base em "usuário", "equipe" e "alvo" (como se fosse uma fórmula de dano) ao invés de "Personagem" ou "inimigo" (por que no caso dos inimigos até dá pra fazer isso já que a programação de eventos usa o index dos inimigos, daí só preciso repetir o código 8 vezes , sendo uma para cada index. Mas quando se trata de personagens, ele exige que eu faça a checagem por ID, o que dá muito trabalho já que tenho mais de 100 personagens no meu jogo...). Se tivesse como identificar os Personagens (atores) por index como ocorre com os Inimigos, por mais que também desse trabalho, pelo menos seria mais viável já que seriam apenas oito checagens ao invés de +100...

Prints:
https://i.imgur.com/E2I3n3y.png
https://i.imgur.com/QT79B21.png
https://i.imgur.com/0VkQUXX.png
https://i.imgur.com/5kl80PR.png
https://i.imgur.com/U5XGkDd.png

E tem. Ignore todos os personagens que estão fora do grupo, use apenas estes:

◆ Control Variables:#0001 Character = Actor ID of the party member #1

$gameParty.members()[#0001 Character].forceAction(skillId, targetIndex);
BattleManager.forceAction($gameParty.members()[#0001 Character]);


O segundo comando força a ação de batalha, coloque-o dentro de um 'Chamar Script', pois a opção realmente faltou. Depois é só atualizar as avariáveis após o ataque.

10/02/2019 às 14:01 #4 Última edição: 10/02/2019 às 14:18 por RenatoCLeiva
Citação de: Corvo online 10/02/2019 às 13:44
E tem. Ignore todos os personagens que estão fora do grupo, use apenas estes:

◆ Control Variables:#0001 Character = Actor ID of the party member #1

$gameParty.members()[#0001 Character].forceAction(skillId, targetIndex);
BattleManager.forceAction($gameParty.members()[#0001 Character]);


O segundo comando força a ação de batalha, coloque-o dentro de um 'Chamar Script', pois a opção realmente faltou. Depois é só atualizar as avariáveis após o ataque.

Hmmm!!! Boa!!! Não sabia que dava pra fazer isso com variáveis...

Já deu pra clarear um pouco mais, só que agora dei uma bugada haha Parei aqui:

https://i.imgur.com/RFxIEx3.png