🤔 Para Refletir :
"Não force a criatividade, liberte a sua mente e a criatividade virá."
- Frank

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
170
Bravecoins
284
Á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

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, baus 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:
(O tutorial será escrito em breve)

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] = Variable [0019:Map0020-Switches]
@> Call Event: [Var_to_Switches]

Evento comum -> Var_to_Switches (em modo Call Event):
Coffeescript:
@> Control Switches: [0011..0017] = OFF
@> Control Variables: [0006:SplitVariable] = Variable [0005:Get-MapVar]
@> Control Variables: [0006:SplitVariable] /= 1000000
@> Conditional Branch: Variable [0006:SplitVariable] == 1
  @> Control Switches: [0011:MapSwitch[1]] = ON
  @>
 : Branch End
@> Control Variables: [0006:SplitVariable] = Variable [0005:Get-MapVar]
@> Control Variables: [0006:SplitVariable] %= 1000000
@> Control Variables: [0006:SplitVariable] /= 100000
@> Conditional Branch: Variable [0006:SplitVariable] == 1
  @> Control Switches: [0012:MapSwitch[2]] = ON
  @>
 : Branch End
@> Control Variables: [0006:SplitVariable] = Variable [0005:Get-MapVar]
@> Control Variables: [0006:SplitVariable] %= 100000
@> Control Variables: [0006:SplitVariable] /= 10000
@> Conditional Branch: Variable [0006:SplitVariable] == 1
  @> Control Switches: [0013:MapSwitch[3]] = ON
  @>
 : Branch End
@> Control Variables: [0006:SplitVariable] = Variable [0005:Get-MapVar]
@> Control Variables: [0006:SplitVariable] %= 10000
@> Control Variables: [0006:SplitVariable] /= 1000
@> Conditional Branch: Variable [0006:SplitVariable] == 1
  @> Control Switches: [0014:MapSwitch[4]] = ON
  @>
 : Branch End
@> Control Variables: [0006:SplitVariable] = Variable [0005:Get-MapVar]
@> Control Variables: [0006:SplitVariable] %= 1000
@> Control Variables: [0006:SplitVariable] /= 100
@> Conditional Branch: Variable [0006:SplitVariable] == 1
  @> Control Switches: [0015:MapSwitch[5]] = ON
  @>
 : Branch End
@> Control Variables: [0006:SplitVariable] = Variable [0005:Get-MapVar]
@> Control Variables: [0006:SplitVariable] %= 100
@> Control Variables: [0006:SplitVariable] /= 10
@> Conditional Branch: Variable [0006:SplitVariable] == 1
  @> Control Switches: [0016:MapSwitch[6]] = ON
  @>
 : Branch End
@> Control Variables: [0006:SplitVariable] = Variable [0005:Get-MapVar]
@> Control Variables: [0006:SplitVariable] %= 10
@> Conditional Branch: Variable [0006:SplitVariable] == 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]
@> Control Variables: [XXXX:Variable reserved for a map] = Variable [0006:Operate-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
 
Ú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 variavel para Switches aconteça primeiro uma única vez e depois a conversão das Switches de volta para a variavel seja constante.
Ao invés de usar Loop eu usei LABEL para não repetir a primeira parte, e sempre voltar para a 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 Variables: [0005:Get-MapVar] = Variable [XXXX:Variavel vinculada ao mapa]
@> Call Event: [Var_to_Switches]
@> Label: 1
@> Call Event: [Switches_to_Var]
@> Control Variables: [XXXX:Variable reserved for a map] = Variable [0006]
@> Wait: 0.1 seconds
@> Jump to Label: 1

Exemplo:
Example.png
 
Voltar
Topo Inferior