Salvar 24 Switches em um variável

DevRPG2k DevRPG2k
estão participando dessa conversa. 0 membros e 1 visitante (1 bot) estão vendo.

DevRPG2k Membro
Salvar 24 Switches em um variável
Para ajudar na criação de sistemas como as Dungeons de Zelda

Qui, 13 de agosto de 2026, 19:33:59 - Última modificação: Sex, 14 de agosto de 2026, 19:53:35 por DevRPG2k

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:

[ Salvar 7 Switches em uma variável ]

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:

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:

  1. Uma DEMO da versão para Rm2k3 1.12a que permite até 24 Switches
  2. Uma DEMO para Rm2k que permite até 20 Switches e pode ser usado em versões antigas do Rm2k3
  3. Um aplicativo HTML que você pode gerar os valores decimais para usar a variável Input.Decimal:

Então, com isso podemos usar valores decimais direto para ligar e desligar as Switches como que quisermos sem precisar criar vários eventos:

  1. 8388607 ativará os primeiros 23 interruptores se for Rm2k3
  2. -8388608 ativará apenas o interruptor 24
  3. 524287 ativará os primeiros 19 interruptores se for Rm2k
  4. -524288 ativará apenas o interruptor 20 se for Rm2k
  5. -524288 ativará os interruptor 20, 21, 23 se for Rm2k3
  6. -1 ativará todos os 24 interruptores se for Rm2k3 (8388607 - 8388608)
  7. Este anterior ativará todos os 20 interruptores se for Rm2k (524287 - 524288)
  8. 5592405 ativará apenas interruptores com ID com valor ímpar (Rm2k3)
  9. 349525 ativará apenas interruptores com ID com valor ímpar (Rm2k)
  10. -5592406 ativará apenas interruptores com ID com valor par
  11. -349526 ativará apenas interruptores com ID com valor par
  12. 0 vai desligar tudo
  13. (Reservado para incluir mais exemplos)

Um exemplo usando ligando todas as Switches com ID par:




VIDEO: SISTEMA FUNCIONANDO




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:

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 máximo que equivale a 23 primeiras Switches, neste caso 8388607 e somando mais 1 para pular a Switch[1], já que ela vai ser verificada à parte depois:

var dec=-5592406; // Valor DECIMAL para teste
if(dec < 0){
sw[24]=true;
dec+=8388608; // 524288 se for Rm2k
}

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:

if(dec%2==1){
sw[1]=true
}

Do Switch[2] até o penúltimo que é a Switch[23] poderá ser feito com um Loop já que a formula é a mesma sempre retirando do DECIMAL o resultado da anterior:

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:


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:

// 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:

// 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:

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:

Com isso em mãos agora é só analisar a DEMO correspondente à sua versão do editor e recriar o sistema em base das suas Switches

Criado por Dante, inspirado na versão de 2007 da RPG Menace - A Ameaça RPG, feito com Rails 8.1.3.1, Ruby 4.0.5 e 💛.