🤔 Para Refletir :
""Se a vida lhe der variáveis crie um evento dela.""
- riquecamarg0

Tutorial Salvar 24 Switches em uma variável para cada mapa para reutilizar

DevWithCoffee

Cidadão
Membro
Membro
Juntou-se
02 de Abril de 2019
Postagens
178
Bravecoins
357
Área
Programação
Motor de jogo
RPG Maker 2000
Imagine poder economizar varias Switches e controlar enviando apenas um número ao invés de vários comandos de liga ou desliga, esse sistema faz isso, e não se limita ao mapa em sim, as mesma variável pode ser usada para vários mapas como em uma Dungeon, basta inserir o valor de correspondente à ID da variável em cada mapa vinculado no enredo do seu jogo.

Essa tutorial é a versão da que ensina salvar 7 Switches em uma Variável, se você quiser acessar, aqui está o link:

E foi justamente por conta dessa tutorial que o CherryDT me de uma breve explicação de que poderia armazenar até 23 Switches em uma única variável, bastou tratar cada Switch como um binário para converte-los para um decimal, LEMBRANDO QUE RM2K3 NÃO TEM SUPORTE À SCRIPTS.
Foi neste momento que a minha cabeça explodiu, apesar de matemática não ser a minha área:
r/RPGMaker


E após vários testes usando Javascript eu entendi como aplicar o valor negativo para conseguir usar uma 24ª Switch, que foi subtraindo o resultado da soma de todas as Switches se estivessem ligados.



Download do exemplo: MEDIAFIRE
Senha para extração: rpgmaker

Neste download contém os seguintes itens:
  • Uma DEMO da versão para Rm2k3 1.12a que permite até 24 Switches
  • Uma DEMO para Rm2k que permite até 20 Switches e pode ser usado em versões antigas do Rm2k3
  • Um aplicativo HTML que você pode gerar os valores decimais para usar a variável Input.Decimal:
RPGMaker-24_Switches_to_1_Variable-APP.png

Então, com isso podemos usar valores decimais direto para ligar e desligar as Switches como que quisermos sem precisar criar vários eventos:
  • 8388607 ativará os primeiros 23 interruptores se for Rm2k3
  • -8388608 ativará apenas o interruptor 24
  • 524287 ativará os primeiros 19 interruptores se for Rm2k
  • -524288 ativará apenas o interruptor 20 se for Rm2k
  • -524288 ativará os interruptor 20, 21, 23 se for Rm2k3
  • -1 ativará todos os 24 interruptores se for Rm2k3 (8388607 - 8388608)
  • Este anterior ativará todos os 20 interruptores se for Rm2k (524287 - 524288)
  • 5592405 ativará apenas interruptores com ID com valor ímpar (Rm2k3)
  • 349525 ativará apenas interruptores com ID com valor ímpar (Rm2k)
  • -5592406 ativará apenas interruptores com ID com valor par
  • -349526 ativará apenas interruptores com ID com valor par
  • 0 vai desligar tudo
  • (Reservado para incluir mais exemplos)
Um exemplo usando ligando todas as Switches com ID par:
RPGMaker-24_Switches_to_1_Variable-Tutorial0.png







Aqui apenas para registro de como eu consegui criar cada etapa do sistema:
Como tornar estes valores em números binários já separando digito por digito?
Em Javascript bastaria usar o método String e separando cada digito em um Array para trabalhar.
Exemplo:
Javascript:
var bin=(8388607).toString(2) // Base 2
bin=bin.split("") // Para Array

Porém neste caso precisamos de matemática pra aplicar nos Eventos, então se o valor da DECIMAL for negativo significa que a ultima Switch foi gravada no estado ON (true/1) e já pode ser resolvida no começo verificando isso.
E para voltar o DECIMAL para positivo basta somar o valor total, neste caso 8388607 somando mais para pular a Switch[1], já que ela vai ser verificada à parte depois:
Javascript:
var dec=-5592406; // Valor DECIMAL para teste
if(dec < 0){
   sw[24]=true;
   dec+=8388608 // 524288 se for Rm2k
}
RPGMaker-24_Switches_to_1_Variable-Tutorial1.png


Agora para verificar se a Switch[1] está ligada é só verificar usando %2, já que é este o único que pode tornar o DECIMAL um valor ímpar:
Javascript:
if(dec%2==1){
   sw[1]=true
}
RPGMaker-24_Switches_to_1_Variable-Tutorial2.png


Do Switch[2] até o penultimo que é a Switch[23] poderá ser feito com um Loop já que a formula é a mesma sempre retirando do DECIMAL o resultado da anterior:
Javascript:
for(i=2;dec > 1;i++){
   dec=(dec-dec%2)/2;
   if(dec%2==1){
      sw[i]=true
   }
}
// Resultado
console.log(JSON.stringify(sw, false, 3))
E quando ele chegar em 0 ou menor o Loop será encerrado.

Converter essa parte para Eventos necessitará de mais variáveis para as operações que não mudam o valor da variável DECIMAL:
RPGMaker-24_Switches_to_1_Variable-Tutorial3.png




Então agora é necessário o processo inverso, juntar todas as Switches e tratando como se fosse um numero binário, o que poderá ser um pouco mais difícil.
Se fosse fazer com Javascript apenas juntaria todos em sequencia, as Switches ON serão 1 e as OFF serão 0, formando um valor binário como String e convertendo para DECIMAL com parseInt.
Exemplo:
Javascript:
// Retorna 8388607 (as 23 primeiras Switches)
parseInt("11111111111111111111111",2)

Mas no caso eu preciso que funcione nos Eventos, então criei isso em Javascript usando apenas matemática para testar mais facilmente antes de criar o Evento:
Javascript:
// Somente as Switches ímpares ligadas para fazer o teste
var sw={
   1:true, 2:false, 3:true, 4:false,
   5:true, 6:false, 7:true, 8:false,
   9:true,10:false,11:true,12:false,
   13:true,14:false,15:true,16:false,
   17:true,18:false,19:true,20:false,
   21:true,22:false,23:true,24:false
};

// Converter para DECIMAL
var dec=0;
for(bin=1;bin<25;bin++){
   if(sw[bin]){
      if(bin==24){
         dec-=2**(bin-1); // Negativa o valor DECIMAL se estiver ON
         break
      }
      dec+=2**(bin-1);
   }
}
// Resultado
console.log(dec);

Agora nessa etapa eu tive que usar Loop para fazer o calculo de potencia (2**expoente) já que essa operação não existe nos Eventos, os únicos que não necessitam são 1, 2 e 3 que só ocorrerão uma vez:
RPGMaker-24_Switches_to_1_Variable-Tutorial4.png


Claro que esse calculo poderia ser feito de outra maneira, usando LABEL, mas a ideia é que se cara Switch ativada tiver a sua operação separada ficará mais fácil para o desenvolvedor recriar esse mesmo sistemas para um conjunto próprio de Switches e ainda compreender como a conversão dos números é feita.

E por fim a que mais simples, mas que foi a parte mais complexa quando eu estava estudando pra desenvolver esse sistema, a ultima Switch:
RPGMaker-24_Switches_to_1_Variable-Tutorial5.png
 
Última edição:
Enfim, após consegui arrumar um tempo pra ajustar alguns detalhes eu inclui uma ferramenta para criação de valores decimais personalizados para ajudar o desenvolvedor à ligar e desligar várias Switches dentro de uma sequencia sem precisar criar vários comandos de evento.

Apesar de parecer meio inútil à principio por só economizar Switches do jogo, mas se você quiser facilitar a criação de sistemas alternativos que tem um mapa TEMPLATE, como jogos no estilo ABS em que os inimigos estão no mapa, jogos no estilo ARCADE, recolhimento de itens em puzzles, etc.

Imagine criar várias Dungeons como nos jogos da franquia Zelda, todos tem um numero próximo de portas, chaves e baús à serem abertos, então seria viável usar as mesmas Switches
 
Última edição:
Voltar
Topo Inferior