RPG Maker XP Converter - Extração e conversão de dados
Autor: João Neto | Publicado: 2014-06-15T20:01:00-03:00

Salve Pessoas!

Assim como foi dito neste post&nbsp;estou trabalhando numa ferramenta que vai aproveitar dados e recursos do RPG Maker XP, que roda apenas em Windows, para ser executado em várias plataformas como Android, IOS, Web, Linux e Mac.



Resolvi ir escrevendo sobre os passos e dificuldades, pois pretendo que esta seja uma ferramenta aberta para uso, nada de "código fonte para estudos e blablabla" de coisas que não funcionam ou dão um trampo maluco pra funcionar, aqui a coisa vai funcionar como o próprio LibGDX, é pegar, executar e ser feliz! :D

Aqueles que já leram materiais meus tanto sobre RPG Maker, Game Maker ou LibGDX sabem que eu tento deixar a coisa o mais explicada possível, pra que qualquer um também se aventure a fazer. Vamos começar então:



A etapa principal deste projeto maluco é bem mais a conversão dos dados que estão no banco de dados e nos mapas do RPG Maker para um formato que possa ser lido depois por outras ferramentas. Bem, o que temos de mais atual para isso é o JSON, que na minha opinião supera o XML por um motivo simples: Tamanho e estrutura. Ainda sim, usar um pouco de XML para a transformação não faz mal nenhum.



Mas o que foi preciso fazer?



A primeira coisa era entender o comportamento dos objetos do RPG Maker XP, ou seja, quais são, se possuem listas, outros objetos internos, etc. Para isso, nada melhor que uma mãozinha da própria Enterbrain. Para quem já mexeu com o RPG Maker XP em Inglês, sabe que o Help Oficial possui essa informação, no nó Game Library -&gt; RPGXP Data Structure. Lá, todos os objetos internos do Banco de dados como Actors, Classes, Events, Maps, etc estão descritos de forma clara. Para facilitar sua vida, está AQUI o download do Help em Inglês do RPG Maker XP para estudo/verificação/morte de curiosidade ou algo assim. :D



Sabendo essas informações, o que precisei fazer foi um script em Ruby que transformasse os objetos internos do database em JSON / XML em arquivos .json ou .xml. para matar um pouco da curiosidade, olha como é simples gravar um arquivo texto usando RGSS:


def write_file(nomeArquivo, conteudo)
&nbsp; &nbsp; f = File.open(nomeArquivo, "w")
&nbsp; &nbsp; f.write(conteudo)
&nbsp; &nbsp; f.close
end


No mais, para cada tipos de objetos (Actors, Classes, etc) eu criei um método e na sequencia, extraio o dado criado para um arquivo. Veja por exemplo o método que cria o script de Actors:

&nbsp; def export_actors_JSON
&nbsp; &nbsp; saida = '"actors":['
&nbsp; &nbsp; v = "";
&nbsp; &nbsp; $data_actors.each{ |actor|
&nbsp; &nbsp; &nbsp; if actor != nil then
&nbsp; &nbsp; &nbsp; &nbsp; #character_hue
&nbsp; &nbsp; &nbsp; &nbsp; #battler_hue
&nbsp; &nbsp; &nbsp; &nbsp; saida += v + '{"id":' &nbsp;+ actor.id.to_s +
&nbsp; &nbsp; &nbsp; &nbsp; ',"name":"' &nbsp; &nbsp; &nbsp; + actor.name +
&nbsp; &nbsp; &nbsp; &nbsp; '","class_id":' &nbsp; + actor.class_id.to_s +
&nbsp; &nbsp; &nbsp; &nbsp; ',"char_name":"' &nbsp;+ actor.character_name +
&nbsp; &nbsp; &nbsp; &nbsp; '","batt_name":"' + actor.battler_name +
&nbsp; &nbsp; &nbsp; &nbsp; '","exp_basis":' &nbsp;+ actor.exp_basis.to_s +
&nbsp; &nbsp; &nbsp; &nbsp; ',"char_hue":' &nbsp; &nbsp;+ actor.character_hue.to_s +
&nbsp; &nbsp; &nbsp; &nbsp; ',"batt_hue":' &nbsp; &nbsp;+ actor.battler_hue.to_s +
&nbsp; &nbsp; &nbsp; &nbsp; ',"exp_inflat":' &nbsp;+ actor.exp_inflation.to_s +
&nbsp; &nbsp; &nbsp; &nbsp; ',"lvl_ini":' &nbsp; &nbsp; + actor.initial_level.to_s +
&nbsp; &nbsp; &nbsp; &nbsp; ',"lvl_fim":' &nbsp; &nbsp; + actor.final_level.to_s +
&nbsp; &nbsp; &nbsp; &nbsp; ',"wn_id":' &nbsp; + actor.weapon_id.to_s +
&nbsp; &nbsp; &nbsp; &nbsp; ',"wn_fix":' &nbsp;+ (actor.weapon_fix ? '1' : '0') +
&nbsp; &nbsp; &nbsp; &nbsp; ',"a1_id":' &nbsp; + actor.armor1_id.to_s +
&nbsp; &nbsp; &nbsp; &nbsp; ',"a1_fix":' &nbsp;+ (actor.armor1_fix ? '1' : '0') +
&nbsp; &nbsp; &nbsp; &nbsp; ',"a2_id":' &nbsp; + actor.armor2_id.to_s +
&nbsp; &nbsp; &nbsp; &nbsp; ',"a2_fix":' &nbsp;+ (actor.armor2_fix ? '1' : '0') +
&nbsp; &nbsp; &nbsp; &nbsp; ',"a3_id":' &nbsp; + actor.armor3_id.to_s +
&nbsp; &nbsp; &nbsp; &nbsp; ',"a3_fix":' &nbsp;+ (actor.armor3_fix ? '1' : '0') +
&nbsp; &nbsp; &nbsp; &nbsp; ',"a4_id":' &nbsp; + actor.armor4_id.to_s +
&nbsp; &nbsp; &nbsp; &nbsp; ',"a4_fix":' &nbsp;+ (actor.armor4_fix ? '1' : '0') +
&nbsp; &nbsp; &nbsp; &nbsp; ',"parameters":['
&nbsp; &nbsp; &nbsp; &nbsp; temp = ""
&nbsp; &nbsp; &nbsp; &nbsp; v1 = ""
&nbsp; &nbsp; &nbsp; &nbsp; for i in 0...6
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; temp += v1 + '{"type":' + i.to_s +
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ',"values":['
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; v2 = ""
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for j in 1..99
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; temp += v2 + '{"vl":' + actor.parameters[i, j].to_s +
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ',"lvl":' + j.to_s + '}'
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; v2 = ","
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; temp += ']}'
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; v1 = ","
&nbsp; &nbsp; &nbsp; &nbsp; end
&nbsp; &nbsp; &nbsp; &nbsp; saida += temp
&nbsp; &nbsp; &nbsp; &nbsp; saida += ']}'
&nbsp; &nbsp; &nbsp; &nbsp; v = ",";
&nbsp; &nbsp; &nbsp; end
&nbsp; &nbsp; }
&nbsp; &nbsp; return saida + "]"
&nbsp; end

Como a minha intenção é apenas demonstrar como estou fazendo, não vou postar todo o código. Mas uma coisa é certa: No final, para o Maker que for usar a ferramenta, ele só precisará inserir um script que será disponibilizado por mim em seu projeto e toda a mágica acontecerá.

Por enquanto é isso amigos. Na próxima prometo falar já sobre a conversão dos Mapas de RPG Maker XP para o Tiled, uma das ferramentas suportadas pelo LibGDX para criação de mapas baseados em Tiles. Até lá!
E como eu digo sempre : Be Brave, Be Bold, Create !!
Até a próxima !