Este blog esta em reforma no momento.

Retomando os estudos Lua-Alchemy e Orientação à Objeto


Animado com o avanço do Molehill e retomando os testes com Inteligência Artificial fui rever o sistema e checar os updates do Lua-Alchemy.

Seguindo a orientação do pessoal do grupo de debates sobre Lua eu passei a usar uma biblioteca chamada LOOP para fazer a implementação de classes em Lua.

Escrevendo roteiro e pensando em I.A.


Eu aqui pensando reversamente: o personagem, a ação e oque precisaria em forma de código.
Lembra um pouco aquela dos “ditos populares em php”. Mas em fim.

Sou Aracne, não lembro qual nome usei no passado antes de ser esta forma que me conheço agora. Não importa mais.

class CAracne (Char)
CAracne.passado = nil
CAracne.nome = “Aracne”
CAracne.idade = “?”

Aracne = CAracne.new()

Escuro, húmido e gostoso. O sol lá fora não me incomoda, estou feliz na sombra. Ouço os pássaros e os insetos da floresta. Apenas a harmonia escura a sombra. O cheiro do musgo, da casca da árvore e da flor, o cheiro do que me serviu de alimento.... a harmonia me afasta a solidão.

Aracne:attachSensor( Vista:new() )
Aracne:attachSensor( Audio:new() )
Aracne:attachSensor( Olfato:new() )
-- regula parãmetros para o personagem
Aracne.olfato.dist = 5
Aracne.audio.dist = 30 -- 30 metros

-- procura sombra, as áreas de sombra já estão demarcadas
-- no terreno. Escrita como função genérica para ser reaproveitada
-- por outros personagens.
function Char:procuraSombra( )
    local pos = self.phys.position
    local initialDist = 50
    sombra = nil
    for el in mapa:getElementByGroup(“sombra”)
        if el:dist( self ) < initialDist then
            initialDist = el:dist(self)
            sombra = el
        end
    end
    return sombra
end

Mas... que som é este? Se esgueira, é pesado, não é rato, nem coelho. Alguém talves? Comida para mais meses ou um sonho que me despertou?
É cheiro de homem... não tem algo a mais nele me incomodando. É cheiro de fêmea. Humpf, apenas comida.
Está chegando perto,  mais perto, quase perto, perto, AGORA!

function CAracne:main()
    if self.repouso then
        if self.audio:proximidade() or self.visao:proximidade() or self.olfato:proximidade() then
            self.epouso = false
        end
    else
        if self.primeiroAtaque then
            self.animation.set(“camuflagem”)
            local dist, char = minimo( {self.audio.alvo(), self.visao.alvo(), self.olfato.alvo() } )
            if dist <= self.distanciaDeBote then self.bote( char ) end
        else
            self.cacar()
    end
    self.continueAcao() --executa a ação escolhida ou continua a ação corrente que pode ser uma acao de parado, ou movimento
end

Preparando testes de I.A. em cenários complexos

O projeto do Lua-Alchemy é realmente impressionante. Pena que eu não tenho muito como contribuir com a equipe de desenvolvimento, a não ser oferecendo meu "case".

O modelo final do sistema de I.A. não irá fugir disto: Evento In/Out
A API do Lua-Alchemy ainda não parece estar 100% mas eles disponibilizaram uma biblioteca pré-compilada que fascilitou muuuuito meu trabalho. Com base no que já existe na API eu criei este modelo de conversa cliente/servidor:
--[[
Seletor de opcoes
  @param message  - lua_String -> Mensagem a ser exibida
  @param function - lua_String -> Função de retorno
  @param ...      - lua_String -> Lista de opções
]]--
Seletor.show("Escolha uma opcao abaixo", "escolhaFeita", "Lagartixa", "Amendoim", "Mingau", "Assembleia", "Porcelana")


function escolhaFeita( opt )
   print( "Voce escolheu " .. opt .. " apartir da AS3/Flex" )
end
Seletor é criado na propria AS3 do Flex:


lua = new LuaAlchemy();
lua.setGlobal("Seletor", new Seletor() );
lua.setGlobal("Mensagem", new Mensagem() );


Para os que chegaran agira e os que se esqueceram, estou usando esse porte de Lua para AS3 para os testes sem precisar desenvolver tudo em C++.
Outro detalhe é que este projeto aparte se encontra hospedado no GITHub.

E pra quem pensa em usar Lua-Alchemy esta não é a melhor abordagem, os desenvolvedores implementaram a API do Flex e Flash completa. Mas meu intúito é ter o menor código relacionao ao AS3 dentro da Lua, o objetivo final é o host com C++.

O próximo passo é criar um pequeno grafico na tela com os personagens interativos. Cada qual com sua maquina de estados, e quando se clicar em cada um Lua vai cruzar os dados com a maquina de estado maior (Cibele).
O modelo básico ja esta concluido. Pelo que espero o sistema de classes irá resolver 90% da interação, e poderei "codar" funções próprias pra cada personagem se necessário.

Percebo agora o quanto dá pra fazer o sistema dinâmico, Lua esta respondendo bem (ao menos nos testes do Lua-Alchemy) ao doString, isto quer dizer que vou ser capas de expandir o código em tempo de execução apartir das ações ocorridas. Até aqui a idéia de usar um banco de dados no lugar de simples arquivo serializado esta se mostrando bem mais funcional, pois irei poder guardar pedaços de código separados e carrega-los apenas quando necessário.

Pode parecer uma coisa inutil à primeira vista, cada bloco de memória que Lua levanta quando precisa mede uns 64Kb mais ou menos, pode parecer ridículo quando se pensa em sistemas atuais que exigem 2GB de RAM no mínimo pra se jogar jogos, mas para outros dispositivos? Pode ser que eu nem chegue a implementar issu tudo, mesmo sendo fácil pra cassete com essas técnologias, mas a funcionalidade esta ai.

if Cibele.iventario.dinheiro < 300 then
  Mensagem.show( "Você não pode comprar esta beringela" )
end

Progressos outubro 2009

Um bocado de coisas agora, vamos por partes.

 Agora fasso parte da equipe do RPG Vale, um blog voltado à produção de games e rpg do Vale do Paraiba - SP. Então espero que minhas aventuras de game-maker ajudem no site.


Comecei a detalhar a vegetação. Ainda estou com uns problemas de render do material transparente. E um gigantesco problema, que eu ja havia previsto des-de antes do inicio do projeto: Flora Brasileira.
Cheguei até a pensar em usar um sistema de particulas estático para derar folhas nas arvores, que serão inumeras. Bom, isto foi um dos motivos da escolha de OGRE.

Arvore ainda com Amiente Oclusion.

Tree-from-curves, o script do Blender inserido durante a produção de Big Buck Bunny é realmente uma excelente ferramenta. O resultado fica bastante natural.

Agora algo a se pensar:

Hora de pensar em inserir algum tipo de frame-skip no thread principal. Não há necessidade de rodar o jogo a mais de 60 fps.

Mais Personagens under-construction

Leviatã, um demônio marinho. O começo do estudo de personagens gigantes.
Ele ainda é um modelo low-poly, e será um dos obstáculos para "Lindomar - O Sub-Zero brasileiro".

Porquê Leviatã e não Kutulu?
Kutulu é com certeza o ícone preferêncial, todo fã de Metallica conhece e faz parte da cultura metaleira. Mas o demônio criado por H. P. Lovecraft é muito cheio de tentáculos e reêntrancias pra ser apenas um quadjuvante.


Essa é a base do Sábio Nerd das Montanhas, ainda lhe falta deixar mais magrinho e o sobretudo e óculos.


XMind, tem um excelente pacote de recursos mesmo em sua versão Free.
Eu precisava de uma boa ferramente, e um editor de Mind-Map vem bem a acalhar, sendo uma IDE para você jogar idéias, deve se tornar um excelente ambiente de produção dos dialogos.

Feed-Back
Estes dias tive uma experiência interesante, fui achado por um grupo de alunos de Sistemas de Informação me achou e pedirão ajuda com um modelo. Um modelo até simples, mas como sempre o professor superestimou os alunos.
O curioso foi a palavra chave que eles usaram pra me encontrar... "guarda-chuva".
Curioso, bom, são coisas a se pensar, geralmente o jogo de palavras que um usuario comum usa é bem diferente do nosso que estamos acostumados com um jargão técnico se embrenhando no português coloquial.

Religando os sistemas

Há tempo não posta aqui. Coisas como a chegada do meu iPod, a volta ao serviço indo de zero a 100, e uma gripe monstruosamente fenomenal me atrapalharam bastante.
Entre as coisas que pude fazer estão uma pequena caça à ajuda na PDJ, que motivou alguns membros, é bom ver que tem-se cooperação dos outros: ver o forum. Até anexei o RSS do DominuZ à meu sidebar.
Mexi, com um pouco mais de calma, na Firefox, acrescentei um corte a mais nas pernas para deixar a curva mais suave. E acho que irei por mais vértices também na região do joelho. Estas medidas realmente mostraram-se necessárias. Apósrigar a personagem não obtive um efeito muito bom como no desenho de esboço.
Também baixei uma versão de testes do Blender 2.50. Nossa, muito linda! Dá gosto olhar pra essa tela, a única coisa chata é que ficou um arzinho de 3D Max quando as paletas de ferramentas somem da tela obrigando agente a dar scroll . O novo sistema de janelas e eventos reescrito permitiu a junção de ferramentas com funcionalidades idênticas, economizando atalho pra cabeça do pessoal.
Pena que não dá pra começar a usar ela no projeto. Mas fica aqui a imagem da nova e bonitona tela.
Bom, com a alteração na malha da FireFox vou ter que reorganizar o UV-Map.

Também fiz a transferência do projeto filho de Inteligência Artificial do jogo para o GitHub. Ainda não sei se extingo a página do Google Code, afinal o Google Code é uma referência muuuto maior que o GitHub. Mas o GitHub alem de ser simplezinho de usar tem uma aparência melhor de rede de relacionamento.
Matei a saudade de fazer hot-sites, fazendo um pro projeto. Bom, acabou-se que um site que era pra ser feito em 2 horas levou umas 12! Mas também não me contive e fui colocando cada vez mais e mais embelezamentos, como a ilustração do "guerreiro selenita" (esse nome saiu direto dos livros de Julio Verne) e do Feed RSS que usa aceleração 3D do Player10 do Flash.
O projeto usara Adobe Alchemy para rodar Lua dentro da AVM, assim devo ter um ambiente de testes próximo ao definitivo ^_^ ow tecnolgia!!!!

Outras coisas ambiciosas, que surgiram do nada:
O estudo do iPod, OGRE ja tem um "port" pra iPhone, mas ainda não consegui fazer funcionar. Bom, esse aparelinho foi um bom investimento (espero).
E a criação de uma classe para manipular a curva de Bézier. Infelizmente a OGRE tem apenas "pretensão de suporte" à Bézier que o pessoal esta estudando. Enquanto não sai a versão bombada, achei alguns algoritimos mais humanamente compreensiveis na web e estou tentando aplicar. Assim espero obter um movimento mais suave principalmente na classe Camera.

Marketing Viral, Vida Virtual, morte magnética...

Bom, enquanto ouço The Slander do Night Wish o café faz efeito o vento frio da janela se torna cálido. É um titulo curioso, enquanto dedicava minha imaginação à ideias macabras e assustadoras, ao ponto de não me deixarem dormir à noite (dois coelhos mortos-vivos trepando é uma cena que ninguém merece) dedicava meus poderes de lógica à criar a famosa vida-virtual!

Comecei a pensar em termos de marketing, e resolvi aplicar. A nova onda do momento é o famoso twitter, que começa a aparecer no Brasil. Para quem conhece, deve estar familiarizado com suas inutilidades, ou empolgado com suas possibilidades.
Hoje em dia o tiwwer é outra maneira de se conseguir ser ouvido. Trata-se de um mecanismo de mensagens curtas, alguns chamão de micro-blog. Na Franca ele tem tanta força que as pessoas chegaram a criar uma conta para seus filhos ainda na barriga da mãe! Usando uma cinta com sensores e um bluethoot o sistema twittava toda vez que o feto dava um chute! Sim, incrédulo, hoje em dia você não precisa perder tempo com coisas triviais, como "nascer", você já esta "on-line"!!!

Tecnicamente falando, criei uma conta no twitter para Cibele, e ando convidando uns amigos, pra conhece-la. Na esperança que mais gente goste dela e a adicione.
Eu não irei falar em momento algum que Cibele é uma personagem, a ideia é deixar as pessoas pensarem que é uma adolescente louca, e irem na dela.

Com certeza a melhor linguagem para esse projeto. Tendo em vista suas especificações e a proximidade com linguagem natural e os bons casos de uso.
Eu também posso ir aprimorando minha capacidade de escrever textos, que ultimamente anda tão destreinada quanto à de desenhar. E de quebra elaborar um perfil verbal mais refinado pra Cibele. Outra necessidade que vi é a de estudar mais oque as menininhas andam falando, pois eu tenho meus vicíos de linguagem, e Cibele deve ter os dela, compátivel com a faixa etária.
Em uma primeira instância montei um script em ruby para postar automaticamente.
Tudo que ele faz é mandar mensagens em intervalos aleatórios. Durante o processo de postagem fui refinando o sistema. Agora ele alem de enviar, guarda log de eventos, e eu posso configurar o intervalo de postagem sem mexer no código. Em seguida irei preparar o sistema para que algumas das configurações possam ser feitas remotamente!
Cloud Computing, um belo termo, o script roda local em minha maquina, mas decidi usar o Google Docs para escrever as entradas no Twitter. Assim onde quer que eu esteja posso atualizar a história!
Outra novidade, o controle de versão. Até então não usava isso em meus projetos pessoais. Mas surgio uma solução interessante no trampo, que resolvi testar aqui. Ainda apanhando pra aprender. GIT, o sistema desenvolvido por Linuz Talwards (criador do Linux), é muito bom. Diferente do SVN ele pode ser usado localmente.
Mas para deixar a coisa mais legal, criei um repositório no site GitHub, esse site é quase um twitter de coders, já que cada update ele manda por rss, posso ter seguidores e etc. Outra vantagem do GIT, se caso eu precise viajar e não possa deixar o computador ligado, basta pedir a um amigo fazer clone do projeto, e passar os arquivos de config para ele. Pronto!

Em uma segunda etapa, estou desenvolvendo o sistema de I.A. do jogo. Bom, o sistema é em Lua, mas da mesma forma que chamo o ruby eu chamo a Lua pelo ruby. No momento o que mais rápido deve sair é a percepção de clima. Sim, se esta de noite, Cibele deve "mimir", ou no máximo acordar pra fazer um pipi (sim, ela vai postar issu, sei que muitos vão achar pouco feminino... mas dane-se, a intenção é um twitter bem "newbie"). Então desenvolvi em Lua a classe clima. Estou remexendo no meu projeto no Google Code, faz séculos que aquilo esta lá... e até hoje a Sangria não me deu uma mão com a tradução pro inglês ~_~. Vou acabar largando aquilo.
Estou mudando a temática JSON de respostas do sistema. Achei uma alternativa mais elegante. A classe clima agora responde coisas como:
~$ lua
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
> require("globals")
> require("terreno/clima")
> clima = Clima()
> print( clima )
São 0 e 0 da manhã, o tempo esta normal com temperatura normal (23°)
Acho que se eu fizer um retorno desses, com separações de TABs devo ter um resultado minimamente interessante pra futuras expansões da I.A. em linguagem natural.
As respostas aos eventos aleatórios do clima viriam de estruturas de array, como:
["Nossa ta frio hj:("],
["Vou ver oque acho pro almoço",
["Uhmm! Cogumelos!",
"Amoras rsrsrs! Nossa o pé tava cheiinho hj!",
"Porra! O galo me bicou! Tomá banho! Ele
nem cuida dos filhote, vai regulá ovo"]],
["Acho que vi um vulto!",
"Caraio! Vi a coisa de novo! To cumedo",
"Ai!!! Ele ta la fora"],
["Caraca, que dor de cabeça!
Nunca mais misturo vodika com absinto"]
Mas por hora fazendo a personagem dormir, e reagir ao clima estaria bom. Se tiver chovendo posso sair da linha de tempo das postagens para um conjunto de frases especifico ou mesmo outra linha de tempo!

Terceira etapa chutar o páu da barraca com bastante força. Alguém já ouviu falar em Eliza Bot? Outra coisa que me deparei, e achei aplicações praticas aqui, descrita em Janeiro de 1966 por Joseph Weizenbaum, esse programa usa algumas artimanhas da língua para fingir uma conversação.
http://www.masswerk.at/elizabot/
É limitada essa versão em JavaScript, no entanto existem exemplares mais robustos... infelizmente escritos em Pearl (ecah).
A vantagem.... Cibele poderá dár algumas respostas automaticamente ao povo que quizer falar com ela! Isso tanto é bom, nesse projeto como no jogo em si!

Sei que invariavelmente toda a I.A. dos NPCs do jogo serão baseadas em maquinas de estado.
O quão complexas eu ainda so posso chutar.
Tipo, o Padre da cidade tem um sistema de contagem, se a bruxinha não inspirar ser boazinha (ou se praticar roubos ou outros atos pra conseguir dinheiro e ele ficar sabendo) irá regular água-benta. Isso se resolve com flags, contadores e códigos extras para classes (meta-códigos poderiam ser perfeitos, mas já que apenas o conceito ja me deixa enrolado, vamos deixar pra lá).

Quanto às criaturas mortas....
Estou fechando os sculpts dos zumbis. Vou mais tarde tentar implementar paralax-mapping nos modeles, oque me permitira criar modelagens mais realistas ainda do que essa. Mas ando tendo algum problema em compilar os sources, a OGRE sempre reporta erro! Não sei se é alguma configuração que não percebi que tinha que ter ou bug na versão mesmo.
Mas está ai meu zumbizinho:

Off-topics:
Obs.: Alguns que assinaram meu rss devem ter notado que apaguei o ultimo post, pois é, nunca mais faço rascunho aqui. Dei um enter onde não devia e o malebento publicou.

Blender 2.49... prévia pro sonhado 2.50 que surgira um dia iluminando nossos monitores com suas dadivas maravilhosas... mas por enquanto so posso dizer CASSETA!!!
http://wiki.blender.org/index.php/User:Theeth/etch-a-ton
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.49/Projection_Paint

Problemas e soluções:
Pra quem tem o mesmo problema de rodar o ruby no Ubunto ou Debian, é so digitar "ruby source download" no google e em seguida clicar onde ta escrito "stable version" ou "stable qualqueroisa". Baixe descompacte (tudo com botão direito, n perca tempo tutoriais de terminal.
Desistale tudo de ruby, menu de sistema/administração/Synaphtic -> procure por ruby e mande desinstalar TUDO.
Depois p sofrimento de todos, abra o terminal e navegue para a pasta que você descompactou o ruby (cd nomeda_pasta ) e digite em sequencia os comandos:
./configure
make
sudo make install
(entre com sua senha)
Agora va no google baixe o "rubygens source", novamente jogue em qualquer lugar entre na pasta pelo pronpt de comando (shell) e digite:
sudo ruby setup.rb
Pronto, mais um mini tutorial resolvido!

Quanto ao cron so aceita caminhos absolutos, tipo n podia colocar o comando:
ruby /home/eu/programacao/...bla3.../script.sh
o certo é
/etc/bin/ruby1.8 ruby /home/eu/programacao/...bla3.../script.sh
vai entender!?