You are on page 1of 5

[TUTO] Criaturas e Inteligncia Artificial

Hoey everybody. Sim, mais um tutorial desse cara a, que pelo jeito terminou com a namorada ou alguma outra coisa que o deixou bem entediado pra soltar um tutorial atrs do outro. Na verdade eu to sem acesso ao BYOND, ento vou gastar um pouco do meu rico tempinho ocioso pra ensinar vocs a fazerem alguma coisa decente, ento bora l. Se voc est fazendo um jogo de RPG, uma das maneiras mais comuns de se upar, ganhar itens ou realizar quests, fazer com que os players enfrentem criaturas espalhadas pelo mapa, em cavernas e etc. Em BYOND, esse recurso uma faca de dois gumes; apesar de trazer um resultado extremamente satisfatrio em termos de jogabilidade e de tornar o seu Server muito mais profissional, uma opo que demanda muitos recursos que o BYOND no possui, e por isso voc corre o risco de que seu jogo fique demasiadamente lento devido ao exagero de trfego gerado por muitas criaturas autnomas pelo mapa. claro que h vrios modos de se fazer isso, alguns deles bem simples e que demandam bem pouco, mas so muito sem sal. Ningum quer um jogo em que a criatura faz sempre a mesma coisa, aparece sempre no mesmo quadradinho e d sempre a mesma quantidade de dano, porque isso tira completamente o desafio da brincadeira. Por isso, importante nos preocupar com que conhecido rudimentarmente como Inteligncia Artificial, ou seja, a capacidade das criaturas de se movimentarem e agirem de maneiras variadas, dependendo de seu comportamento e do que a situao exige. basicamente isto o que este tutorial pretende demonstrar. Parte 1: Criando um Template Geralmente, todos os seres vivos de um jogo tm seus atributos e seu comportamento mensurados por uma srie de regras que se aplicam a todos eles. Por exemplo, todos eles tm fora, velocidade, vigor, pontos de experincia e por a em diante. Quais atributos voc vai usar dependem da maneira como voc escolhe conduzir seu jogo, no uma coisa que possa ser ensinada... O que sempre concordamos, no entanto, que a regra pra um deve valer pra todos. Portanto a dica : Use para suas criaturas as variveis que seus players usam para eles. Para isso, defina todas as variveis comuns em /mob, e assim todos os mobs do jogo as possuiro, evitando que voc tenha que reprogram-las para cada ramificao. Vamos considerar que, neste jogo imaginrio, todos os mobs foram definidos da seguinte maneira: mob/var +forca = 5 +defesa = 5 +velocidade = 5 +dinheiro = 0 +maxlife = 100 +life = 100 +exp = 0 Como essas variveis se relacionam, deve ser intuitivo: fora define o poder de um ataque, defesa define a resistncia a um ataque, velocidade define quo rpido o mob se movimentar, dinheiro o quanto ele possui em valor aquisitivo, maxlife a varivel que define o total de vida que o mob

possui e life indica quanto de vida o mob ainda tem disponvel, enquanto exp indica quanta experincia ele tem. Agora, temos de definir um chamado template para nossas criaturas. Um template uma estrutura bsica que mantm todas as informaes de elementos que tm funes e caractersticas em comum, mas que diferem no seu valor. Em suma, vamos construir um esqueleto de criatura, onde programaremos tudo o que acontecer com todas as criaturas do jogo, e depois criaremos ns filiados a ele para conter as informaes especficas de cada espcie. Se voc no entendeu, no se desespere. Ficar claro em breve. mob/Criatura +var ++spawnloc //varivel que nos servir para armazenar o local onde a criatura aparece ++spawntime //tempo que ele levar at respawnar ++behavior //qual o tipo de comportamento da criatura: agressivo, pacifico ou retaliador. Isto define trs variveis auxiliares que usaremos em nossa AI, que somadas s variveis de /mob, sero toda a informao de que nossas criaturas precisam. O template nos servir tambm para programar a proc da AI em si, que dever ser feita levando em considerao que uma rotina comum a diversas criaturas com variveis e comportamentos diferentes, e por isso deve ser programada dinamicamente. A forma como voc escolhe que suas criaturas ajam tambm vai de acordo com o seu gosto. Utilizarei como exemplo uma adaptao da AI que eu uso: mob/Criatura +proc ++TriggerAI() +++var/delay //varivel auxiliar para definir o delay de movimento da criatura +++delay = velocidade > 50 ? 2 : 5 //Velocidade maior que 50, delay de 2; entre 20 e 50, delay de 5 +++delay = velocidade < 20 ? 7 : 5 //Velocidade menor que 20, delay de 7; se no, delay de 5 +++switch(behavior) A primeira parte do cdigo foi para definir a velocidade de movimento da criatura, que comum a todos os comportamentos. O switch() acima vai dividir a AI em trs partes que definiro esses trs comportamentos, caso a criatura seja pacfica (no ataca nunca), agressiva (toma a iniciativa para atacar) ou retaliadora (ataca apenas se atacada). Vamos comear com a inteligncia no caso de criaturas pacficas: ++++if(pacifico) //Se a criatura for pacfica, ela fugir caso esteja em perigo +++++for(var/client/C in oview(8)) //isto faz com que procure apenas os jogadores no campo de viso, ignorando outras criaturas ++++++if(life < maxlife*0.7) //Se a criatura estiver com vida abaixo de 2/3 +++++++walk_away(src,C,5,delay) //ento ela fugir de qualquer jogador at estar 5 tiles longe ++++++else +++++++walk_rand(src,delay) //seno, anda randomicamente Alguns fatores desse cdigo tambm poderiam ser personalizados caso se desejasse, como por exemplo a porcentagem de vida que a criatura precisa ter para comear a fugir, ou ainda quantos tiles ela deve se distanciar do atacante, bastando apenas criar novas variveis para isso. Fica por sua conta.

Agora, vamos ao comportamento de criaturas agressivas: ++++if(agressivo) //Se a criatura for agressiva, ela atacar assim que vir algum +++++for(var/client/C in oview(8)) ++++++walk_to(src,C,1,delay) //Anda at o jogador para atac-lo ++++++if(get_dist(src,C)>=1) //Confere se a distncia entre eles suficiente para ataque +++++++Ataque(C) //rotina de ataque Eu escolhi fazer a rotina de ataque em separado,pois fica mais bem organizado e mais malevel apenas cham-la aqui. Alm do mais, eu posso fazer uma rotina s para criaturas e players. Vamos dar uma pausa no cdigo da TriggerAI() e ver como essa rotina de ataque: mob/proc +Ataque(var/mob/M) ++var/D = round(rand(75,125)*forca/100 rand(75,125)*M.defesa/100) ++D = D < 0 ? 0 : D //intertravamento para dano sempre maior ou igual a zero ++M.life -= D Acima, voc pode ver um clculo de dano simples, levando em conta os atributos de ambos os personagens e tambm um fator aleatrio. Em seguida, vamos aos tratamentos para ver se h mortes: ++oview(8) << [src] ataca [M] por [D] de dano! ++if(M.life <= 0) //ento o atacado morreu +++if(M.client) //se ele um jogador ++++world << [M] morreu! ++++M.Morte() //essa rotina eu no demonstrarei. Ela cuida da morte de players, e no pertinente ao tutorial. +++if(client && !M.client) //Se foi um jogador atacando o monstro, afinal, a rotina a mesma ++++view(8) << [src] matou [M]! ++++var/mob/Criatura/C = M O trecho acima importante, e merece ser explicado com cuidado. O que acontece que a seguir, precisaremos usar variveis e rotinas que pertencem somente ao template /mob/Criatura, e por isso, precisamos fazer este tipo de converso de /mob para /mob/Criatura. ++++dinheiro += M.dinheiro //adiciona ao player o quanto dinheiro a criatura carregava ++++exp += M.exp //adiciona ao player o quanto de experincia a criatura d. Uma rotina para isso seria boa ideia, para podermos analisar se o jogador sobe de nvel ou no, etc. ++++M.Respawn() //aqui chamamos a rotina para respawn da criatura. Tambm poderiam haver nessa rotina outros ifs, como por exemplo para checar se um jogador atacando outro, mas isso tambm est fora do escopo do tutorial. A rotina de Respawn ser exemplificada mais frente... por hora, voltemos ao TriggerAI(). Havamos terminado o cdigo para criaturas agressivas, ento ainda nos falta programar o comportamento das retaliadoras: ++++if(retaliador) //Se a criatura for retaliadora, ela atacar se atacada +++++for(var/client/C in oview(8)) //isto faz com que procure apenas os jogadores no campo de viso

++++++if(life < maxlife*0.99) //Se a criatura estiver com vida abaixo de 99% +++++++walk_to(src,C,1,delay) //Anda at o jogador para atac-lo +++++++if(get_dist(src,C)>=1) //Confere se a distncia entre eles suficiente para ataque ++++++++Ataque(C) //rotina de ataque ++++++else +++++++walk_rand(src,delay) //seno, anda randomicamente E isto define todos os comportamentos possveis para a nossa criatura. Mas ainda falta, para a rotina estar completa, fazer com que ela seja cclica; ou seja, que ela chame a si mesma assim que terminar. Para isso, usamos um spawn() pequeno, que poupe processamento mas no seja muito lacunar: +++spawn(5) .() //repete a rotina aps meio segundo Agora j temos a nossa AI programada, mas devemos inici-la para todas as criaturas. Como tambm h outros acertos desejveis a se fazer quando uma criatura inicia, vamos programar todos eles na procedure New() do nosso template de criaturas: mob/Criatura +New() ++spawnloc = loc //armazena o local em que ela criada ++dinheiro = rand(50,200)*dinheiro/100 //randomiza a quantidade de dinheiro que a criatura carrega ++TriggerAI() //Inicia a funo cclica de AI ++..() //Mantm as aes padro funcionando Muito bem, agora j temos a AI, o ataque, e a criao das criaturas de modo geral, todas prontas. Ainda nos falta programar o respawn, e as criaturas em si. Haha, pouca coisa, voc vai ver! Vamos funo de respawn: mob/Criatura +proc/Respawn() ++loc = locate(0,0,0) //tira a criatura do caminho ++spawn(spawntime) //aps o tempo estipulado para respawn +++new type(spawnloc) //cria uma nova criatura do tipo desta, no local que ela costumava aparecer +++del(src) //destri esta criatura Eu pessoalmente uso uma outra procedure baseada em world para esse respawn, de modo que eu possa deletar a criatura mais cedo, sem ter que lev-la ao void. Mas esse jeito mais simples de entender, e no to ruim assim. Parte 2: Definindo as criaturas Bem, terminamos o template. Esta a hora em que voc deve estar se perguntando Mas pra qu diabos serviu tudo isso? Veja o cdigo abaixo, e entenda: mob/Criatura +Troll

++icon = troll.dmi ++forca = 15 ++defesa = 10 ++velocidade = 15 ++dinheiro = 10 ++maxlife = 200 ++life = 200 ++exp = 20 ++spawntime = 200 ++behavior = agressivo Pronto, voc j tem uma criatura. Uma vez feito o template, o trabalho est todo acabado... Esse Troll tem 15 de fora, 10 de defesa, d 20 de experincia, pode dar de 5 a 20 de dinheiro e ataca quem ver pela frente. Poxa, mas voc s queria uma fadinha que no fizesse mal a ningum? Ento t: mob/Criatura +Fada ++icon = fada.dmi ++forca = 5 ++defesa = 15 ++velocidade = 25 ++dinheiro = 20 ++maxlife = 100 ++life = 100 ++exp = 5 ++spawntime = 150 ++behavior = pacifico E est pronto. Dessa maneira, voc pode criar praticamente a criatura que quiser, rapidamente. claro que ainda h muito o que implementar: voc pode faz-las usar skills, falarem, droparem itens quando derrotadas, criar novos comportamentos (como criaturas que permanecem paradas, ou escondidas, e at que ataquem de longe) e tudo isso programando uma nica vez usando o template de criatura. Um outro detalhe desse cdigo que ele extremamente enxuto. Eu no me preocupo, por exemplo, em movimentar criaturas quando os players no esto prximos a elas. Isso salva muito processamento, mas por outro lado, voc sempre encontra as criaturas no mesmo lugar. Em projetos grandes, voc s vezes tem que fazer concesses dessa natureza e no implementar tudo o que pode se quiser manter o jogo vivel... isso a escolha de cada um. isso pessoal, espero que tenham aproveitado. Qualquer dvida, comentrio ou sugesto, por favor comente no tpico correspondente na nossa comunidade no Orkut! See ya.

By Karibeto

You might also like