TagGen 0.3.1: Instalador para Windows

Aproveitei que fui obrigado a usar Windows hoje aqui na federal e resolvi fazer o bendito instalador pra versão 0.3.1 do TagGen.

Dois screenshots:

No screenshot acima, o desenho do humanóide representa a altura e peso de forma visual. Mais acima note a representação da idade do personagem acompanhada de informações históricas do mundo de Tagmar. Perceba também os botões com ícones de dado vermelho, eles provocam o sorteio aleatório dos valores de altura, idade e peso.

Este é o diálogo de escolha da região de origem do personagem. Claramente ripado do TagMap. Você irá notar que ele precisa melhorar um bocado.

Faça o download do instalador para Windows, e esteja avisado que ainda é software Alfa. Relatos de bugs, comentários e sugestões são bem-vindos.

TagGen, Gerador de Personagens para Tagmar 2 (ponto 2)

Há muito tempo atrás foi criado o primeiro RPG nacional, chamado Tagmar, e ele gerou uma horda de nerds matadores de orcos de fim de semana. Como já falei sobre no post do TagMap, vou pular as apresentações, mas digo que uma coisa que sempre fez falta em Tagmar foi uma Tabela (ou Escudo) de Mestre, uma que não fez falta, mas só porque naquela época não tinha dessas coisas, foi um gerador de personagens, e foi isso que resolvi fazer pro Tagmar 2 (ponto 2).

Antes de começar a falar sobre a aplicação, aviso que a versão que estou disponibilizando é Alfa, ou seja, não é Beta, ou seja, ainda não serve para ser usada no dia a dia, se prestando mais a uma avaliação inicial por parte de intrépidos testadores, curiosos e possíveis colaboradores. Agora enfio um screenshot:


Tela principal de TagGen

Batizei a criança com o criativo nome de TagGen (Tag de Tagmar e Gen de gerador :P), e a idéia é não só facilitar a criação dos personagens pra começar logo a bendita partida, mas também guardar dados da história e evolução do personagem, mais ainda: também deve ser possível “exportar” personagens e enviá-los para outros jogadores, imprimir a ficha, etc (veja a página do Roadmap para mais “etc”). Uma coisa que gostaria de fazer é um processo de criação alternativo, no estilo daqueles quizzes “Quem é você em…”, que são um tipo de teste de personalidade que indicam quem você é num determinado contexto (livro, filme, anime, e por aí vai). Daí o sujeito apenas com a idéia do tipo de personagem que quer interpretar pode pular toda a parte numérica e de escolha de habilidades, magias, equipamento, etc.

Novamente sobre facilidade, note que no screenshot acima o polígono representa os atributos do personagem e o jogador os define arrastando as bolinhas com o mouse. Essa parte foi um pouco inspirada em Ragnarök Online, e é particularmente útil pois a distribuição de pontos de atributos inclui uns cálculos cabulosos (mas não a ponto de serem assustadores), e creio que a parte mecânica-matemática fica bem melhor com a máquina.


Criando um novo personagem

A tela acima mostra o começo da criação do personagem: raça e profissão são escolhidos primeiro, pois essa decisão restringe todas as outras possibilidades. Determinadas raças não combinam com algumas profissões, e para mostrar isso de forma natural, as profissões proibidas desaparecem da lista ao escolher uma raça que possua restrições. Essa e outras características você pode ver no screencast que deixei lá no Google Video, ou na versão de melhor definição no formato Ogg/Theora.

Experimentando

Bom mesmo é instalar o TagGen, na seção de downloads do site temos:

Como aconteceu no primeiro release do TagMap, não tive tempo de fazer um instalador pro Windows, como essa versão é muito Alfa, não entro em detalhes, deixando por conta de quem for tentar executar, adiantando que você precisará de Python, GTK+ e PyGTK, nessa ordem, mas eu recomendo fortemente o PyGTK All-in-One Installer.

Técnica da Coisa

Como se viu acima PyGTK foi usado para interface; para os dados de raças, magias e habilidades, foi usado o banco de dados SQLite, que já vem embutido em Python, e é uma das coisas mais porretas que já se viu na Fenda do Biquíni; o widget de definição de atributos foi feito usando Cairo (que faz parte do GTK+), mas isso eu já expliquei num post anterior.

Dificuldades e Como Ajudar

Qualquer problema, idéia ou sugestão registrem uma ocorrência lá na seção Issues, lá na página do projeto, que é destinada pra questões envolvendo o software. É bem fácil preencher um novo item de problema/sugestão, mas caso se sinta intimidado, pode mandar emails ou comentários. Infelizmente estou com pouco tempo livre ultimamente, e é aí que retorno pode ser de grande valia pois vai ajudar a me orientar nos pequenos espaços de tempo livre que aparecerem.

Uma coisa que atrapalhava muito no TagMap era a coleta de dados e sua subseqüente inserção. Na época não convoquei ninguém pra ajudar, mas também a coisa ficou parada, embora a falta de tempo e o fato da aplicação ser mais uma curiosidade do que uma utilidade falaram mais alto.

TagGen sofre de uma dificultade parecida, pois inserir as magias, habilidades e itens no banco da aplicação podem demandar um tempo razoável. Se você quiser ajudar com a inserção de dados (e outras coisas), deixei uma página explicativa no site: ComoAjudar.

Formatos de Arquivo Amigáveis

Uma coisa que tentei em TagMap foi fazer um script para extrair os dados das localizações direto do arquivo do Livro de Ambientação, pego do fórum (acho que era um fórum, faz um tempo já) de Tagmar 2. O arquivo era um .doc do Word, que é um formato fechado, por isso abri no OpenOffice.org e salvei como .odt, formato aberto que por dentro é XML, daí fiz algo como o descrito num post anterior, me baseando na estrutura de títulos (“Título 1”, “Título 2”, etc) consegui resultados razoáveis. Às vezes, porém, a pessoa (ou pessoas) que editou o arquivo usava texto comum para títulos, mudando apenas o tamanho da fonte, que é diferente de um título “real” apesar da semelhança, e isso quebrava a estrutura do documento e melava o script. Mesmo assim vou tentar novamente essa abordagem, mas certamente vou precisar de revisores. 😉

Se você estiver lendo e for contribuidor direto do projeto Tagmar 2 (me considero contribuidor esporádico com 2 graus de indireção), eu sugeriria o uso do OpenOffice.org (ou BrOffice.org aqui no Brasil) e do formato .odt para os livros de Tagmar 2, pois estaria mais de acordo com a natureza de liberdade que em primeiro lugar possibilitou a existência do projeto. Perceba que não é só pela questão filosófica, que é bem forte, mas tenha em mente, como deixei claro no parágrafo anterior, coisas abertas (formatos, códigos) são mais amigáveis para quem quer inventar algo novo. Se alinhando melhor com tecnologias de software livre e padrões abertos o projeto Tagmar 2 pode atrair a atenção de desenvolvedores, podendo surgir coisas como, um exemplo que me ocorre agora, um sistema web de edição de coleções (magias, itens, criaturas), para posterior geração de arquivos que necessitariam de poucas alterações de diagramação para lançamento. Esses dados organizados podem servir para alimentar outras idéias e por aí vai. Contudo, sendo realista, não estou sugerindo que abandonem um sistema de produção que está funcionando, e muito bem, haja vista a qualidade do material. Proponho somente que algumas melhorias são possíveis, digamos colocar os arquivos “fonte”, os documentos, sob um controle de versão, e/ou ter um sistema de controle de bugs para melhor rastrear defeitos nos livros. Verdade que não freqüento muito os fórums do projeto e posso estar chovendo no molhado, mas não faz mal deixar o recado.

Novamente quero parabenizar o povo do projeto Tagmar 2, valendo mencionar o pessoal da arte, que manteve (na minha opinião) o clima das ilustrações do primeiro Tagmar; e também o Marcelo Rodrigues que tem guiado muito bem esse barco.

Nota para mim mesmo: lembre de colocar uma nota sobre a licença do conteúdo usado no TagGen, conforme esse post.

Cairo + Vala

Resolvi gastar 1 das minhas 5 horas de sono diárias para dar uma mexida no binding Vala pra biblioteca de gráficos vetoriais Cairo.

Minha idéia era portar algo pronto em outra linguagem, então peguei um exemplo interessante do binding Python PyCairo. Com as anotações do PyCairo informando quais tipos eram passados como parâmetro, ficou mais fácil que mastigar água de cabeça pra baixo. Em alguns momentos eu só acrescentei ponto-e-vírgula ao fim das linhas de código Python.

Cairo Vala Demo
Cairo desenhando sobre uma Gtk.DrawingArea
(Dublin ao fundo)

Faz um bom tempo que estou no regime Python & C, e estava perdendo o traquejo de como programar numa linguagem orientada a objetos com tipagem estática, por isso Vala está sendo algo bastante útil, além de divertido.

Uma das coisas que eu não estava sabendo fazer era passar um array de double como parâmetro para esta função da classe Context do módulo Cairo:

public void set_dash (double[] dashes, int num_dashes, double offset);

A solução:

ctx.set_dash (new double[] {SIZE / 4.0, SIZE / 4.0}, 2, 0);

E a forma a qual eu estava (mal 😉 ) acostumado em Python:

ctx.set_dash([SIZE/4.0, SIZE/4.0], 0)

Coloquei como exemplo na wiki do Vala, e o arquivo pode ser baixado aqui: cairo-demo.vala.

II ENSL

Como disse antes, fui no II ENSL em Aracaju. O evento foi muito legal, e embora eu tenha ficado com febre do sábado até chegar em casa na segunda, pude aproveitar bastante. O gentil pessoal do IV Fórum GNOME me deu uma camisa do GNOME (brigado Izabel :), me deixando bem feliz (“Alegria de nerd é ganhar camiseta”, já dizia a Priscila aqui do INdT), em troca tive de dar uma entrevista surpresa. Mico! Pelo menos a febre cedeu pelo tempo de apresentar minha palestra sobre o Glade, e mais a palestra do Kenneth sobre o Eréseva – ele não pôde ir, perdeu, perdeu :P.

Vou deixar mais detalhes sobre o evento nas mãos da peixebeta. Mas tenho de falar da hospitalidade viking de Marden, Sandro & cia, que nos (== a comitiva do Debian-PE) recebeu na casa deles. Nunca tinha viajado pra tão longe e não sabia que seria tão bem-vindo. Vocês foram demais. 🙂

Despedida dos Vikings de Aracaju
Essa foto resume o espírito da viagem

As viagens de ida e volta também foram interessantes. Na ida, um pneu estourado no meio do nada de meia-noite, os caminhões quer passavam a toda pareciam naves espaciais. Na volta andamos na balsa do São Francisco. Rio bonito da gota! Outra vez eu volto lá pra nadar. E depois horas e horas de cana-de-açúcar pra lá, cana-de-açúcar pra cá. Não acabava nunca! Luciano ficou no volante por 12h (só a volta) comigo febril do lado cantando junto com o CD Player. Não sei como ele e o povo atrás do carro agüentaram.

Coloquei os slides no slide share: Mantendo a Sanidade com o Glade

Pacote Debian do Vala

Hoje Alberto Ruiz (que parece assustadoramente com um amigo meu; alô Icaro!) fez um binding Vala pro GtkMozEmbed, daí me empolguei e fiz um pacote Debian do bicho. Estava num Ubuntu Gutsy e não testei em nenhuma outra máquina, então só garanto funcionar do Gutsy pra cima (dica: precisa libglib maior igual a 2.12.9).

Download: vala_0.1.2-1_i386.deb

Se quiser experimentar uns códigos (com um esclarecedor Makefile), veja o post anterior sobre Vala.

Já criei um binding pro Hildon que deve deixar os manos do INdT felizes, só falta arrumar uma coisa e outra e mando o patch.

Vala para Mobile with Lasers, digo, com Figuras

O mesmo que falei antes, agora com figuras! (Porque sem figuras fica chato.)

O primeiro diagrama mostra um cenário com Mono sendo usado como plataforma de desenvolvimento para portáteis, o diagrama seguinte mostra o equivalente em Vala.

Mono foi escolhido como exemplo por Vala ser fortemente inspirada em sua sintaxe, e também por uma discussão na lista mobile-devel do GNOME, onde alguém pergunta o motivo de Mono não estar sendo considerado e dentre as resposta está uma de Jeff Waugh que diz: “Mono is a can of worms that no one really wanted to open”. (Leia o resto pra não tirar conclusões precipitadas.)

Não estou aqui desconsiderando os módulos/bibliotecas e outras coisas que vem junto com o Mono, esta é um comparação um tanto grosseira.

Mono_for_mobile
Mono: menos passos para compilação, mais peso no runtime.

Vala_for_Mobile
Vala: mais passos para compilação, mas o runtime nem precisou saber…

Vala para Mobile

Como você já deve saber, o sistema de tipos e orientação a objetos de GTK+ é baseado na GLib. E como você já deve saber, botar pra funcionar orientação a objetos em C é um troço bem engenhoso, mas muito doido e cansativo. Daí que boa parte dos programas em GTK+ é escrita em linguagens de alto nível usando bindings (PyGTK, GTK#, gtkmm, java-gnome).

Os bindings são muito úteis, mas para um programa feito em PyGTK funcionar, é necessário ter instalados em seu sistema GTK+, Python e PyGTK. Num sistema Linux regular tudo isso já está lá e ninguém percebe. Já numa máquina Windows pode ser um pouco demais pedir pra o usuário instalar esses mondrongos antes do seu programa de 800kb. O problema no desktop não é falta espaço em disco ou memória, e sim evitar importunar o usuário com a instalação de dependências que ele não precisa saber que existem. (Tem gente trabalhando nesse último problema.)

Mas o que me motivou a escrever esse post foram os sistemas móveis. Já temos uma certa quantidade de plataformas móveis baseadas em GTK+ (e GStreamer, e outras GLib-coisas): Maemo, OpenMoko, OLPC. Bindings para linguagens de alto nível estão normalmente disponíveis e sua instalação costuma ser transparente para o usuário. Só não é transparente para os recursos limitados do dispositivo portátil, mas pedir aos desenvolvedores que usem GLib-C[1] certamente não vai te tornar um cara mais popular.

Vala

Vala é uma linguagem com sintaxe próxima de C#, com algumas adaptações para se encaixar melhor no sistema de tipos do GObject. Pelo menos é isso que diz no site. Já a wikipedia diz o seguinte:

Vala (valá-), meaning “enclosure” in Vedic Sanskrit, is an Asura of the Rigveda and the Atharvaveda, the brother of Vrtra.
(…)
Historically, it has the same origin as the Vrtra myth, being derived from the same root, and from the same root also as Varuna, *val-/var- (PIE *wel-) “to cover, to enclose” (perhaps cognate to veil).

Wikipedia: Vala (Vedic)

Antes de você começar a pensar que se trata de mais um binding pra GTK+, vou esclarecer que a saída gerada pelo compilador Vala é nada menos que código GLib-C, que pode ser compilado normalmente pelo GCC para binários nativos, linkando diretamente com bibliotecas baseadas na glib. Vala é algo que, fazendo uma analogia ao asura do mito védico, cobre/envolve o código GLib-C, ocultando sua complexidade. A ligação Vala-C é feita por um arquivo .vapi, que, como cansei de dizer, só é necessário em tempo de compilação.

Voltando ao cenário dos dispositivos móveis, com Vala o desenvolvedor tem o conforto equivalente a um binding de alto nível, e o portátil não tem de pagar o preço por isso. Abstração sem overhead!

Instalando

Pegue a versão mais recente em http://live.gnome.org/Vala/Release e compile da maneira usual. Além das ferramentas de praxe, Bison e Flex precisam estar instalados (no Debian/Ubuntu são os pacotes bison e flex).

Comparação

Vejamos um código bem simples em Vala, apenas uma classe que herda de um GObject e acrescenta um campo de texto.

// example.vala
using GLib;
public class MyObject : Object
{
protected string text { get; set; }
public MyObject () {
text = "";
}
}

Para gerar o código C (.h e .c), chame: valac example.vala

Os get e set da linha abaixo

protected string text { get; set; }

dão origem a

char* my_object_get_text (MyObject* self)
{
g_return_val_if_fail (IS_MY_OBJECT (self), NULL);

return self->priv->_text;
}

void my_object_set_text (MyObject* self, const char* value)
{
g_return_if_fail (IS_MY_OBJECT (self));

char* __temp2 = NULL;
const char* __temp1 = NULL;
self->priv->_text = (__temp2 = (__temp1 = value, (__temp1 == NULL ? NULL : g_strdup (__temp1))), (self->priv->_text = (g_free (self->priv->_text), NULL)), __temp2);
}

Mais Código

Como este blog honra as calças que veste, os seguintes códigos de exemplo (junto com um Makefile) podem ser encontrados no svn do google:

Minha intenção é gerar os bindings pra algumas coisas interessantes como tapioca-glib e hildon. Pode levar um tempo, mas assim que estiver pronto posto algo.

[1] GLib-C é a forma como Steven Hendrickx se refere a código C escrito no estilo orientado a objetos da GLib em seu texto Glib-C: C as an alternative Object Oriented Environment.