Colocar/Remover Heróis no Grupo
Autor: Dr.XGB
Plataforma: RPG Maker 2000 e RPG Maker 2003
Dificuldade: Intermediário
E aí, pessoal?
Neste tópico você vai aprender como manipular o grupo de heróis no seu jogo de uma forma bem básica e objetiva, podendo recolocar a ordem dos heróis e acrescentar heróis quando o grupo está cheio.
Acredito que este tutorial ajude aqueles membros que desejam programar em seu projeto uma equipe com mais de quatro heróis, sendo que o programa permite até 4, tendo um outro grupo com os demais heróis que no caso não lutariam, ao menos que fossem colocados naquele grupo mais tarde.
Espero que você possam usar este tutorial para fins de estudos e que possa ampliar mais ainda o conhecimento na programação de eventos neste motor.
Etapa 1: Formando os grupos
Ao iniciar o jogo, devemos desenvolver um pequeno sistema onde vamos colocar as Id's dos heróis em variáveis para facilitar a nossa organização. A primeira Variável chamada Party Size será onde vamos indexar todos os heróis mostrando quantos heróis possuem no seu grupo. No momento em que o jogo é iniciado, você vai colocar esta variável para 1, indicando que o jogo começará com apenas um herói. Em seguida, use a terceira variável [0007: Hero1] e coloque o valor de acordo com a Id do herói no Database que vai começar o jogo. Por exemplo: de acordo com o Database padrão, Alex possui a Id 1 por ser o primeiro da lista, Brian seria o 2, Carol o 3, etc.
Caso o seu jogo comece com 2 heróis, a variável [0001: Party Size] deve ser mudada para 2, ou caso tenha 3, o valor será 3; ou até mesmo selecionando Others e Party Size na janela de determinar a variável que já vai retornar o número de herói contidos no grupo, porém desta maneira ele irá determinar apenas de 1 até 4. Mesmo que o grupo tenha 5 heróis de acordo com o nosso sistema de slots, ele terá o valor 4, que é o limite de heróis num grupo padrão do RPG Maker 2000/2003. Por isso devemos determinar estes valores manualmente.
Não podemos esquecer de atribuir os valores para as variáveis que representariam os slots dos heróis. Por exemplo, se você tem 3 heróis no grupo, você vai determinar as variáveis [0007: Hero1], [0008: Hero2] e [0009: Hero3] de acordo com a Id de cada um deles.
Agora quando entrar mais heróis no grupo, teremos que usar um esquema diferente do que usar apenas o Change Party..., primeiro vamos ver quantos herói tem no grupo, aumentamos este limite e colocaremos o valor do novo herói em algum slot disponível usando ponteiros referentes à mesma variável [0001: Party Size]. Depois de encontrar o slot disponível e dar o valor ao mesmo, vamos colocar o mesmo valor para [0002: Temp Hero] que é a variável que vai acrescentar o herói ao grupo com a função Change Party... caso tenha menos que 4 heróis no grupo, senão ele apenas ocupará o Slot dado pela variável.
A lógica funciona da seguinte maneira:
Consideramos que cada slot vazio nas variáveis tenham o valor de 0, já que a Id do primeiro herói é 1. Um grupo com 3 herói significa que temos 3 slots com valores maiores que 0. Grupo de 2 heróis tem 2 slots disponíveis; 4 heróis temos 4 slots; 6 heróis temos 6 slots ocupados por heróis e assim vai.
Para deixar a programação mais organizada, preferi deixar esta ação para um Evento Comum para não ter que colocar esta lógica em todos os eventos sempre que algum personagem entra no seu grupo. Também vou usar mais uma variável [0003: Party Pointer] para poder levar o ponteiro para os slots. Então teremos a lógica no evento comum:
<> Variable Ch. [0003: Party Pointer] Set, 7 <> Variable Ch. [0003: Party Pointer] +, Var. V[0001]val. <> Variable Ch. [V[0003]] Set, v[0002] // Próximo slot disponível <> Variable Ch. [0001: Party Size] +, 1 // Aumentou o grupo de heróis <> FORK Optn: [0001: Part Size] - 4less <> Change Hero's Party: V[0002] -> Add <> : END Case <>
Para quem não entendeu porque eu determinei o valor de [0003: Party Pointer] para 7 e depois somei pelo valor de [0001: Party Size], é o seguinte: atribuí aquele valor porque o 7, como você pode ver na lista de variáveis no início do tópico, representa a Id da variável que representa o primeiro slot do grupo [0007: Hero1]. Daí então a soma pelo tamanho do grupo é para indicar o slot que está vazio (com o valor 0 neste caso). Se o grupo tem 2 heróis, ele vai calcular 7+2 = 9. Logo teremos [0009: Hero3] como slot vazio. Com 4 heróis, 7+4 = 11, então o próximo slot é [0011: Hero5]. Seguido então da soma de [0001: Party Size] para +1 indicando que o grupo aumentou.
Agora vou usar, como exemplo, a maneira que vamos utilizar para acrescentar o Brian no grupo (no caso o segundo herói da lista padrão). Usaremos a variável [0002: Temp Hero] para determinar a Id do novo herói ao grupo e chamar o evento comum que nós criamos logo acima:
<> Variable Ch. [0002: Temp Hero] Set, 2 // Id do Brian = 2 <> Call Event: Add Hero // Chamar o Evento comum que criamos <>
Etapa 2: Removendo herói do grupo
Esta etapa serve para lembrar que na hora de retirar o herói do gupo não é o reveso de quando você adiciona. Até porque se você simplesmente tirar o herói, ou seja, mudando o valor do slot para 0, vai fica um buraco no grupo, deixando o seu grupo muito bagunçado. Vamos aprende também a não apenas tirar o herói, mas também a organizar o grupo preenchendo o slot vazio.
Usando as duas últimas variáveis da lista [0020: Temp Party] e [0021: Temp Pointer], podemos utilizar para buscar nos slots a Id do herói que você deseja remover. Para isso usamos um ciclo onde v[20] vai buscar o slot e v[21] retornará o valor deste slot. Daí quando este slot coincide com a Id que você procura, você simplesmente, usando ponteiros, colocará o valor 0 naquele slot encontrado. Além disso, podemos aproveitar [0003: Party Pointer] para determinar a quantidade máxima de slots ou colocar o valor que você quer. Por exemplo na minha demo, o grupo tem 8 slots. Então o ciclo será realizado 8 vezes, mas você pode alterar este limite de acordo com o máximo de slots que você vai usar em seu projeto.
Este também pode ser criado em um outro Evento comum. Antes dele ser chamado, declaramos a variável [0002: Temp Hero] para selecionar o herói que você deseja remover.
<> [0020:Temp Party] Set 7 <> CYCLE <> Variable Ch.: [0021: Temp Pointer] Set, Var. [V[0020]]val. <> FORK Optn: Varbl[0021: Temp Pointer] - V[0002] Equivl. <> Variable Ch.: [V[0020]] Set, 0 <> Change Hero's Party: V[0002] -> Remove <> BREAK Cycle <> :END Case <> FORK Optn: Varbl[0020: Temp Party] - 8 <> BREAK Cycle <> :END Case <> Variable Ch.: [0020: Temp Party] +, 1 <> : END Cycle <> Call Event: Line Up Party <> Variable Ch.: [0001: Party Size] -, 1 <>
Lembrando mais uma vez que começamos o ciclo com 7 devido à Id do primeiro Slot do grupo. Agora vamos aplicar este código removendo o Brian do grupo:
<> Variable Ch.: [0002: Temp Hero] Set, 2 <> Call Event: Remove Hero <>
No final do código, podemos notar que tem um Call Event chamado Line Up Party. Este evento é o que vai organizar os slots não permitindo que tenha um espaço vazio entre os outros heróis. A lógica é quase a mesma para remover, porém vamos precisar de uma switch que será acionado quando encontrar um slot com o valor 0, recolocando os valores que estão no próximo slot fazendo com que eles pulem para o slot que foi encontrado vazio.
<> [0020:Temp Party] Set 7 <> CYCLE <> Variable Ch.: [0021: Temp Pointer] Set, Var. [V[0020]]val. <> FORK Optn: Switch [0001: Replace Party] - ON <> Variable Ch.: [0020: Temp Party] -, 1 <> Variable Ch.: [V[0020]] Set, Var. [0017]val. <> Variable Ch.: [0020: Temp Party] +, 1 <> :END Case <> FORK Optn: Varbl[0021: Temp Pointer] - 0 <> Change Switch: [0001: Replace Party] - On Set <> :END Case <> FORK Optn: Varbl[0020: Temp Party] - 8 <> BREAK Cycle <> :END Case <> Variable Ch.: [0020: Temp Party] +, 1 <> : END Cycle <> Change Switch: [0001: Replace Party] - OFF Set <>
Extra: Organizando o Grupo
Agora é o momento que vamos organizar o grupo, definir quem vai lutar ou não, quem será o líder do grupo. Baseando-se na adição e remoção do herói no grupo, vamos criar um menu básico para realizar esta forma de organização. Podemos fazer isso de duas maneiras válidas: usando pictures ou criando um menu num outro mapa feito justamente para organizar a equipe. Se você usar o menu em outro mapa, você pode usar as variáveis [0004: Menu Map], [0005: Menu X] e [0006: Menu Y] para guardar as coordenadas do herói antes de passar para o outro mapa com o comando Memorize Place.... Concluindo o menu, chame o comando Go to Memorized Place.... Caso tenha dúvidas em como fazer um menu, veja na demonstração, onde eu usei o menu em outro mapa.
Clique aqui para baixar a Demonstração
Então é isso. Se estiver com alguma dúvida é só postar aqui, ou então para comentar alguma coisa aqui.
Espero que você possam aproveitar bastante deste material que preparei aqui pra vocês.
Até mais!