🤔 Para Refletir :
"Já experimentou mudar a fonte do jogo?"
- Delayzado

Tutorial Salvar 7 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
Thumb.png

Isso funciona semelhante à Self Switches que só veio à existir a partir do RMXP, porém ao invés de ser exclusivo para cada evento será exclusivo para o mapa em que o jogador estiver. A lógica da tutorial é usar uma única Variável do jogo para um número limitado de Switches do jogo.

Download: MEDIAFIRE
Password: rpgmaker

Se você preferir existe um sistema parecido que permite salvar até 24 Switches, porém é bem mais complexo:



Sobre o sistema apresentado nesse tópico:
Onde isso pode ser aplicado? A ideia principal deste sistema é reutilizar os mesmos interruptores para eventos simples em diferentes masmorras, como baús, portas e chefes. Imagine um jogo semelhante ao Zelda onde você precisa ir em várias Dungeons onde terão muitas portas, baús e obstáculos removíveis.

Mas também pode ser aplicado a jogos mais complexos, especialmente para ABS, que podem depender de muitos Switches no mapa, principalmente por conta de inimigos e baús.

Outra aplicação possível seria em menus personalizados, conhecidos como CMS (Sistema de Menu Customizado/Custom Menu System), quando você precisa aplicar diferentes funções aos submenus. Imagine que você tenha 4 submenus, cada um com de 1 a 7 opções importantes (no primeiro exemplo). Nesse caso, seriam necessárias apenas 4 variáveis para armazenar todas as escolhas do jogador.

Acredito que seja desnecessário explicar que isso é inviável em projetos feitos com outras edições do RPG Maker, já que todas elas conseguem realizar isso usando um script e armazenando os dados como um Array.



Você pode salvar 6 Switches em uma variável no Rm2k e 7 no Rm2k3 1.12a, cada dígito do número corresponderá a um Switch.
Exemplo:
@> Control Variables: [0007:Switches-Map0002] = 1001010
  • 0 Desliga
  • 1 ou mais Liga
Convert-1-Variable-to-Seven-Switches.png


No entanto, como os Eventos do RPG Maker funcionam apenas com operadores básicos e não conseguem separar os dígitos de um valor nativamente, precisei criar uma fórmula para cada dígito.
 
Última edição:
Como a maioria dos usuários que já utilizaram variáveis no RPG Maker sabe, por padrão os valores são apenas numéricos e não existe uma função nativa para separar os dígitos. splitEm JavaScript, fazer isso em Rm2k/3 requer matemática. Lembre-se de que as variáveis serão sempre do tipo Integer.
Vamos então tomar como exemplo um valor em que todos os 7 dígitos sejam maiores que 0:
1234567
Para obter o primeiro valor, basta dividir por 1,000,000Em uma calculadora ou alguma linguagem de programação, retornaria o valor fracionário:
1.234567
No entanto, como o mecanismo trata tudo como um número inteiro, ele retornará tudo o que vier antes do separador, que neste caso é 1.

O problema agora são os dígitos seguintes, que, se o mesmo método for usado, retornarão 12, 123, 1234...
Neste caso, vamos considerar o que vem depois do separador e só então realizar a divisão normalmente, mas agora pelo valor. 100,000:
(1234567%1000000)/100000

Agora você só precisa subtrair um zero do final de cada dígito, exceto quando chegar ao último dígito, onde dividir por 1 não faz sentido. Vamos imaginar isso em um pseudocódigo :
Código:
var mapvar '= RPG_Map.AssignedVariable()
switches[11] '= mapvar/1000000
switches[12] '= mapvar%1000000/100000
switches[13] '= mapvar%100000/10000
switches[14] '= mapvar%10000/1000
switches[15] '= mapvar%1000/100
switches[16] '= mapvar%100/10
switches[17] '= mapvar%10

Agora vamos refazer isso usando eventos no editor.

Método para transformar uma variável em 7 interruptores. Este evento deve ser chamado imediatamente após entrar no mapa:
Código:
@> Control Variables: [0005:Get-MapVar] = 15
@> Call Event: [Var_to_Switches]

Evento comum -> Var_to_Switches (em modo Call Event):
Coffeescript:
@> Control Switches: [0011..0017] = OFF
@> Control Variables: [0006:Operate-Var] = Variable ID [V[0005]]
@> Control Variables: [0006:Operate-Var] /= 1000000
@> Conditional Branch: Variable [0006:Operate-Var] == 1
  @> Control Switches: [0011:MapSwitch[1]] = ON
  @>
: Branch End
@> Control Variables: [0006:Operate-Var] = Variable ID [V[0005]]
@> Control Variables: [0006:Operate-Var] %= 1000000
@> Control Variables: [0006:Operate-Var] /= 100000
@> Conditional Branch: Variable [0006:Operate-Var] == 1
  @> Control Switches: [0012:MapSwitch[2]] = ON
  @>
: Branch End
@> Control Variables: [0006:Operate-Var] = Variable ID [V[0005]]
@> Control Variables: [0006:Operate-Var] %= 100000
@> Control Variables: [0006:Operate-Var] /= 10000
@> Conditional Branch: Variable [0006:Operate-Var] == 1
  @> Control Switches: [0013:MapSwitch[3]] = ON
  @>
: Branch End
@> Control Variables: [0006:Operate-Var] = Variable ID [V[0005]]
@> Control Variables: [0006:Operate-Var] %= 10000
@> Control Variables: [0006:Operate-Var] /= 1000
@> Conditional Branch: Variable [0006:Operate-Var] == 1
  @> Control Switches: [0014:MapSwitch[4]] = ON
  @>
: Branch End
@> Control Variables: [0006:Operate-Var] = Variable ID [V[0005]]
@> Control Variables: [0006:Operate-Var] %= 1000
@> Control Variables: [0006:Operate-Var] /= 100
@> Conditional Branch: Variable [0006:Operate-Var] == 1
  @> Control Switches: [0015:MapSwitch[5]] = ON
  @>
: Branch End
@> Control Variables: [0006:Operate-Var] = Variable ID [V[0005]]
@> Control Variables: [0006:Operate-Var] %= 100
@> Control Variables: [0006:Operate-Var] /= 10
@> Conditional Branch: Variable [0006:Operate-Var] == 1
  @> Control Switches: [0016:MapSwitch[6]] = ON
  @>
: Branch End
@> Control Variables: [0006:Operate-Var] = Variable ID [V[0005]]
@> Control Variables: [0006:Operate-Var] %= 10
@> Conditional Branch: Variable [0006:Operate-Var] == 1
  @> Control Switches: [0017:MapSwitch[7]] = ON
  @>
: Branch End
 
Última edição:
Para salvar as Switches na variável especificada, a abordagem ideal seria mantê-la no modo de Processo Paralelo:
Código:
@> Call Event: [Switches_to_Var]

Common Event -> Switches_to_Var (em modo Call Event):
Coffeescript:
@> Control Variables: [0006:Operate-Var] = 0
@> Conditional Branch: Switch [0011:MapSwitch[1]] is ON
  @> Control Variables: [0006:Operate-Var] += 1000000
  @>
: Branch End
@> Conditional Branch: Switch [0012:MapSwitch[2]] is ON
  @> Control Variables: [0006:Operate-Var] += 100000
  @>
: Branch End
@> Conditional Branch: Switch [0013:MapSwitch[3]] is ON
  @> Control Variables: [0006:Operate-Var] += 10000
  @>
: Branch End
@> Conditional Branch: Switch [0014:MapSwitch[4]] is ON
  @> Control Variables: [0006:Operate-Var] += 1000
  @>
: Branch End
@> Conditional Branch: Switch [0015:MapSwitch[5]] is ON
  @> Control Variables: [0006:Operate-Var] += 100
  @>
: Branch End
@> Conditional Branch: Switch [0016:MapSwitch[6]] is ON
  @> Control Variables: [0006:Operate-Var] += 10
@>
: Branch End
@> Conditional Branch: Switch [0017:MapSwitch[7]] is ON
  @> Control Variables: [0006:Operate-Var] += 1
  @>
: Branch End
@> Control Variables: Variable [V[0005]] = Variable [0006]
 
Última edição:
Agora, o melhor método para fazer com que ambos os eventos ocorram automaticamente é criar um evento de mapa que vincule uma variável ao mapa, onde a leitura da variável nos Switches acontece apenas uma vez, e a conversão dos Switches de volta para a variável é constante.
Em vez de usar Loop, usei LABEL para evitar a repetição da primeira parte e sempre retornar à segunda parte do evento.

Basta criar um evento de Parallel Process no mapa, no canto superior direito, ou incluí-lo em um evento existente de outro sistema:
Coffeescript:
@> Control @> Control Variables: [0005:Get-MapVar] = 15
@> Call Event: [Var_to_Switches]
@> Label: 1
@> Wait: 0.2 seconds
@> Call Event: [Switches_to_Var]
@> Jump to Label: 1

Exemplo:
Example.png
 
Última edição:
Voltar
Topo Inferior