Ir para conteúdo
Entre para seguir isso  
Manoel R

PyOt - Como fazer seu primeiro monstro.

Recommended Posts

Manoel R    1
Manoel R

images?q=tbn:ANd9GcRdWaD-zBR8HMAcWksOsuAkwxP8S-mV7nJp_qwaATWUFKazVCbwwFo6qKPN

 

Pyot

 

Como fazer um monstro.

 

Por: Manoel Ribeiro.

 

 

Introdução:

 

 

Olá pessoal, sou conhecido de poucos do fórum, e pretendo passar um pouco do conhecimento que estou obtendo sobre o PyOt pra vocês, já que acho que é um projeto anos-luz a frente do TFS.

 

A intenção é fazer alguns tutoriais básicos de criações de scripts para o mesmo, já que ainda não existe (em PT-BR ao menos).

 

Qualquer dúvida, sugestão ou erro, favor fazer um comentário que dentro do possível estarei sanando.

 

Também estou disponível por PM, só não estarei disponibilizando o Skype por enquanto porque preciso me organizar melhor pra atender por lá, já que nele as coisas acontecem bem mais rápido.

 

Vamos lá?

 

 

Pequeno pré-requisito

 

 

O que seria esse pequeno pré-requisito?

 

Bem, quando falamos em Python é preciso vim a cabeça que é uma linguagem de script assim como Lua, só que com uma particularidade bem interessante, ela já é orientada a objetos, ou seja, não precisamos de nenhuma gambiarra com setmetatables() e coisas do tipo como já é necessário em Lua.

 

E o OOP no caso do PyOt entrou como grande ajuda na criação dos seus scripts já que os códigos tem tendência a serem menores, mais intuitivos e mais organizados sem a necessidade de ter XML para registrar eventos, scripts e outras coisas, ou então no caso dos monstros como veremos abaixo, não tem necessidade de tags e mais tags que chegam a dar dor de cabeça.

 

Então, como já devem estar imaginando, o pré-requisito é entender o mínimo de orientação a objetos.

 

Mas como meu objetivo é ajudá-los e não complicar a vida de vocês, explanarei sobre o que é necessário saber de OOP para a criação de monstros com uma maneira bem básica (coloca básica nisso) então não se pode achar que sabe OOP se entender isso, recomendo que procure estudar se quer mesmo entender orientação a objetos.

 

Agora uma pequena prova do que eu estava falando sobre o PyOt ser anos-luz melhor que o TFS:

 

Veja agora um Demon no TFS (98 linhas):

 

 

 

<?xml version="1.0" encoding="UTF-8"?>
<monster name="Demon" nameDescription="a demon" race="fire" experience="6000" speed="280" manacost="0">
   <health now="8200" max="8200"/>
   <look type="35" corpse="5995"/>
   <targetchange interval="5000" chance="8"/>
   <strategy attack="100" defense="0"/>
   <flags>
       <flag summonable="0"/>
       <flag attackable="1"/>
       <flag hostile="1"/>
       <flag illusionable="0"/>
       <flag convinceable="0"/>
       <flag pushable="0"/>
       <flag canpushitems="1"/>
       <flag canpushcreatures="1"/>
       <flag targetdistance="1"/>
       <flag staticattack="40"/>
       <flag runonhealth="0"/>
   </flags>
   <attacks>
       <attack name="melee" interval="2000" skill="70" attack="130"/>
       <attack name="manadrain" interval="3000" chance="13" range="7" min="-80" max="-300"/>
       <attack name="fire" interval="2000" chance="14" range="7" radius="7" target="1" min="-160" max="-350">
           <attribute key="shootEffect" value="fire"/>
           <attribute key="areaEffect" value="firearea"/>
       </attack>
       <attack name="firefield" interval="1000" chance="15" range="7" radius="1" target="1">
           <attribute key="shootEffect" value="fire"/>
       </attack>
       <attack name="energy" interval="3000" chance="30" length="8" spread="0" min="-220" max="-460">
           <attribute key="areaEffect" value="energy"/>
       </attack>
   </attacks>
   <defenses armor="50" defense="55">
       <defense name="healing" interval="1000" chance="15" min="90" max="200">
           <attribute key="areaEffect" value="blueshimmer"/>
       </defense>
       <defense name="speed" interval="1000" chance="15" speedchange="200" duration="20000">
           <attribute key="areaEffect" value="redshimmer"/>
       </defense>
   </defenses>
   <elements>
       <element physicalPercent="30"/>
       <element deathPercent="30"/>
       <element energyPercent="50"/>
       <element earthpercent="40"/>
       <element icePercent="-12"/>
       <element holyPercent="-12"/>
   </elements>
   <immunities>
       <immunity fire="1"/>
       <immunity down="1"/>
       <immunity lifedrain="1"/>
       <immunity paralyze="1"/>
       <immunity invisible="1"/>
   </immunities>
   <summons maxSummons="2">
       <summon name="fire elemental" interval="2000" chance="10" max="2"/>
   </summons>
   <voices interval="5000" chance="10">
       <voice sentence="Your soul will be mine!"/>
       <voice sentence="MUHAHAHAHA!"/>
       <voice sentence="CHAMEK ATH UTHUL ARAK!"/>
       <voice sentence="I SMELL FEEEEAAAAAR!"/>
       <voice sentence="Your resistance is futile!"/>
   </voices>
   <loot>
       <item id="2148" countmax="100" chance="100000"/><!-- gold coin -->
       <item id="2148" countmax="99" chance="100000"/><!-- gold coin -->
       <item id="2152" chance="50000"/><!-- platinum coin -->
       <item id="2795" countmax="5" chance="20000"/><!-- fire mushroom -->
       <item id="8473" countmax="3" chance="20000"/><!-- ultimate health potion -->
       <item id="7590" countmax="3" chance="14285"/><!-- great mana potion -->
       <item id="2387" chance="14285"/><!-- double axe -->
       <item id="2149" chance="10000"/><!-- small emerald -->
       <item id="7368" countmax="5" chance="5263"/><!-- assassin star -->
       <item id="2432" chance="3703"/><!-- fire axe -->
       <item id="2151" chance="3571"/><!-- talon -->
       <item id="2176" chance="2854"/><!-- orb -->
       <item id="2393" chance="2000"/><!-- giant sword -->
       <item id="2418" chance="1428"/><!-- golden sickle -->
       <item id="2165" chance="1333"/><!-- stealth ring -->
       <item id="2462" chance="1204"/><!-- devil helmet -->
       <item id="1982" chance="1190"/><!-- purple tome -->
       <item id="2179" chance="1010"/><!-- gold ring -->
       <item id="2171" chance="813"/><!-- platinum amulet -->
       <item id="2396" chance="666"/><!-- ice rapier -->
       <item id="2520" chance="649"/><!-- demon shield -->
       <item id="2214" chance="473"/><!-- ring of healing -->
       <item id="5954" chance="467"/><!-- demon horn -->
       <item id="2470" chance="413"/><!-- golden legs -->
       <item id="2514" chance="389"/><!-- mastermind shield -->
       <item id="2164" chance="170"/><!-- might ring -->
       <item id="2472" chance="91"/><!-- magic plate armor -->
       <item id="7393" chance="78"/><!-- demon trophy -->
       <item id="7382" chance="60"/><!-- demonrage sword -->
   </loot>
</monster>

 

 

 

E agora um Demon no PyOt (36 linhas):

 

 

 

demon = genMonster(_("Demon"), (35, 5995), "a demon")
demon.setHealth(8200)
demon.bloodType("blood")
demon.setDefense(armor=48, fire=0, earth=0.6, energy=0.5, ice=1.12, holy=1.12, death=0.8, physical=0.75, drown=1)
demon.setExperience(6000)
demon.setSpeed(280)
demon.setBehavior(summonable=0, hostile=1, illusionable=0, convinceable=0, pushable=0, pushItems=1, pushCreatures=1, targetDistance=1, runOnHealth=0)
demon.walkAround(energy=0, fire=0, poison=0)
demon.setImmunity(paralyze=1, invisible=1, lifedrain=1, drunk=1)
demon.summon("Fire Elemental", 10)
demon.maxSummons(2)
demon.voices("Your soul will be mine!", "CHAMEK ATH UTHUL ARAK!", "I SMELL FEEEEAAAAAR!", "Your resistance is futile!", "MUHAHAHA")
demon.loot( (2148, 100, 200), ("platinum coin", 70.25), ("fire axe", 4.0), ("fire mushroom", 69.75, 6), ("double axe", 19.5), ("gold ring", 1.25), ("great mana potion", 30.0, 3), ("platinum amulet", 0.75), ("small emerald", 10.25), ("orb", 3.0), ("assassin star", 15.25, 5), ("talon", 3.25), ("golden sickle", 1.5), ("stealth ring", 1.5), ("ultimate health potion", 40.0, 3), ("ice rapier", 0.5), ("giant sword", 1.75), ("demon shield", 0.75), ("devil helmet", 1.25), ("ring of healing", 0.5), ("demon horn", 0.5), ("mastermind shield", 0.5), ("purple tome", 1.25), ("golden legs", 0.5), ("might ring", 0.25), ("demonrage sword", 0.0025), ("magic plate armor", 0.0025), (7393, 0.0025) )

dgfb = spell.Spell("demon geb")
dgfb.area(AREA_BEAM7)
dgfb.element(LIFEDRAIN)
dgfb.effects(area=EFFECT_ENERGYAREA) #wrong effect

des = spell.Spell("demon estrike", target=TARGET_TARGETONLY)
des.area(AREA_WAVE1)
des.range(1)
des.element(ENERGY)
des.effects(area=EFFECT_ENERGYAREA, shoot=ANIMATION_ENERGY) #wrong effect

dmd = spell.Spell("demon manadrain", target=TARGET_TARGETONLY)
dmd.area(AREA_WAVE1)
dmd.targetEffect(callback=spell.mana(1, 1, 0, 120))

demon.regMelee(520)
demon.regTargetSpell("Hells Core", 150, 250, check=chance(9)) #
demon.regTargetSpell("demon geb", 300, 460, check=chance(9)) #
demon.regTargetSpell("demon estrike", 210, 300, check=chance(9)) #
demon.regTargetSpell("demon manadrain", 0, 120, check=chance(9)) #
demon.regSelfSpell("Light Healing", 1, 250, check=chance(9)) #
demon.regTargetSpell(2301, 1, 1, check=chance(9)) #use rune id

 

 

 

 

Acho que a diferença é tão gritante que qualquer um concorda que o TFS é feito de maneira absurdamente tosca.

 

Agora vamos para a prometida explanação.

 

OOP super básico

 

Beleza, o básico do básico que é necessário entender é que na criação de um monstro estamos lidando com classes e objetos (recomendo altamente aprender isso).

 

E o que eles são?

 

"Podemos dizer que classes são grupos com características inicialmente iguais. Exemplo, na vida real, temos as classes "Humano", "Pássaro", "Inseto", etc. Cada classe tem seus membros, que são os objetos, suas características, que são os atributos, e suas ações, que são os métodos."

Luck Oake.

 

Ou seja, a classe é monstro, e o objeto é o Demon.

 

 

Tendo em mente isso, podemos reparar uma coisa no código do Demon:

 

demon.setHealth(8200)

 

E o que seria isso?

 

Bem, podemos reparar que na frente da função setHealth() temos o prefixo demon. e isso nos diz o que exatamente?

 

Que essa função está alterando um atributo do objeto demon, fácil, não é mesmo?

 

Com isso concluimos que: Na frente de qualquer função na hora de criar o monstro vem o nome do nosso objeto.

 

Gravem isso, ok?

 

 

Criando seu primeiro monstro

 

 

Agora que temos em mente o básico do OOP de que precisamos, podemos finalmente criar um monstro! (Vou usar o código do Demon como base)

 

genMonster()

 

No começo do código poderemos reparar a seguinte função: genMonster() mas pra que ela serve?

 

Ela serve para determinarmos o monstro e o objeto com qual vamos lidar ao longo do código, veja como ela é usada nele:

 

demon = genMonster(_("Demon"), (35, 5995), "a demon")

 

Mas o que é cada coisa nessa linha?

 

Isso é simples, veja:

 

demon = objeto. (Estamos definindo o objeto que vem como prefixo nas funções)

genMonster = função. (Função responsavel por criar o monstro)

"Demon" = nome do monstro. (O nome do monstro, lembre-se: Por ser string precisa de aspas "")

35 = id do outfit. (Auto-explicativo)

5995 = id do corpo do monstro morto. (Auto-explicativo)

"a demon" = string que aparece ao dar look no monstro (Nesse caso apareceria: It's a demon ou - ou algo do tipo- sacou?)

 

Agora que já sabemos realizar esse primeiro passo, vamos avançar.

setHealth()

 

demon.setHealth(8200)

 

O que essa linha nos diz?

 

Nos diz que estamos utilizando a função setHealth() para determinar o HP do nosso monstro - em números, claro -ficando 8200

 

Podemos ver que já nessa linha temos o prefixo demon. na frente seguindo a lógica: objeto.função()

 

Agora que já sabemos determinar o HP do monstro vamos ao próximo passo.

bloodType()

 

demon.bloodType("blood")

 

O que essa linha nos diz?

 

Que através da função bloodType() estamos colocando tipo do sangue do nosso monstro para ser blood aquele vermelho.

 

Bem fácil até agora não é? Mas o próximo passo fica interessante.

 

setDefense()

 

demon.setDefense(armor=48, fire=0, earth=0.6, energy=0.5, ice=1.12, holy=1.12, death=0.8, physical=0.75, drown=1)

 

O que essa linha nos diz?

 

Podemos perceber que com a função setDefense() estamos determinando as fraquesas e resistências do nosso monstro em relação aos elementos e outras coisas.

 

Esquema de formulação:

 

Sempre que você queira que seu monstro seja imune a algo, você precisa colocar o valor igual a 0 o Demon é imune a fogo, então o fire está igualado a 0 na função.

 

Ex: fire = 0

 

Sempre que quiser determinar que o monstro é forte contra algo você precisa elevar o valor daquilo, Demon é fraco contra ice, então o ice está igualado a 1.12 na função.

 

Ex: ice = 5.0

 

Sempre que quiser que o monstro seja forte contra algo você deve aproximar o número a zero, fazendo com que fique pequeno a sua vontade, Demon é forte contra energy então o valor de energy está igualado a 0.5 na função.

Ex: energy = 0.1

 

Beleza, passado essa parte vamos ao próximo passo.

setExperience()

 

demon.setExperience(6000)

 

O que essa linha nos diz?

 

Que estamos definindo a experiência ganha ao matar o monstro com a função setExperience() ficando 6000

 

Vamos para próximo passo.

setSpeed()

 

demon.setSpeed(280)

 

O que essa linha nos diz?

 

Que estamos definindo a velocidade do monstro com a função setSpeed() ficando 280

 

Vamos para o próximo passo.

 

setBehavior()

 

demon.setBehavior(summonable=0, hostile=1, illusionable=0, convinceable=0, pushable=0, pushItems=1, pushCreatures=1, targetDistance=1, runOnHealth=0)

 

O que essa linha nos diz?

 

Nessa linha com a função setBehavior() estamos determinando o comportamento do nosso monstro e se ele é conjuravel, convencível e etc.

 

Significados:

 

summonable = se o monstro é conjurável - 1 para sim e 0 para não.

hostile = se o monstro é hostil - 1 para sim e 0 para não.

illusionable = se você consegue se transformar no monstro - 1 para sim e 0 para não.

convinceable = se você consegue convencer o monstro - 1 para sim e 0 para não.

pushable = se você consegue empurrar o monstro - 1 para sim e 0 para não.

pushItems = se o monstro consegue puxar ou empurrar items - 1 para sim e 0 para não.

pushCreatures = se o monstro consegue puxar ou empurrar criaturas - 1 para sim e 0 para não.

targetDistance = se o monstro consegue atacar a distância - 1 para sim e 0 para não.

runOnHealth = com qual quantidade de HP o monstro vai tentar fugir - 0 para não fugir e 0+ para fugir.

 

Agora vamos ao próximo passo.

walkAround()

 

demon.walkAround(energy=0, fire=0, poison=0)

 

O que essa linha nos diz?

 

Que estamos definindo com a função walkAround() se o nosso monstro vai passar por cima de fields ou simplesmente andar em volta deles

 

Lógica:

 

A lógica é como na linha anterior, 1 para sim e 0 para não, em cada tipo de field.

 

Vamos para o próximo passo.

setImmunity()

 

demon.setImmunity(paralyze=1, invisible=1, lifedrain=1, drunk=1)

 

O que essa linha nos diz?

 

Que estamos definindo com a função setImmunity() se o nosso monstro é imune a invisibilidade, paralização, drenagem de vida e tontura.

Lógica:

 

A mesma do passo anterior, 1 para sim e 0 para não.

 

Vamos para o próximo passo.

 

voices()

 

demon.voices("Your soul will be mine!", "CHAMEK ATH UTHUL ARAK!", "I SMELL FEEEEAAAAAR!", "Your resistance is futile!", "MUHAHAHA")

 

O que essa linha nos diz?

 

Que estamos determinando através da função voices() as falas do nosso monstro

 

Lógica:

 

A lógica é simples, como estamos lidando com strings é necessário que todas estejam dentro de aspas "" e separadas por vírgulas ,

 

Ex:

 

objeto.voices("Otserv Brasil", "O seu portal para o mundo Otserv")

 

Isso faria com que o nosso monstro falasse aleatoriamente uma das duas strings.

 

Vamos para o próximo passo.

loot()

 

demon.loot( (2148, 100, 200), ("platinum coin", 70.25), ("fire axe", 4.0), ("fire mushroom", 69.75, 6), ("double axe", 19.5), ("gold ring", 1.25), ("great mana potion", 30.0, 3), ("platinum amulet", 0.75), ("small emerald", 10.25), ("orb", 3.0), ("assassin star", 15.25, 5), ("talon", 3.25), ("golden sickle", 1.5), ("stealth ring", 1.5), ("ultimate health potion", 40.0, 3), ("ice rapier", 0.5), ("giant sword", 1.75), ("demon shield", 0.75), ("devil helmet", 1.25), ("ring of healing", 0.5), ("demon horn", 0.5), ("mastermind shield", 0.5), ("purple tome", 1.25), ("golden legs", 0.5), ("might ring", 0.25), ("demonrage sword", 0.0025), ("magic plate armor", 0.0025), (7393, 0.0025) )

 

O que essa linha nos diz?

 

Que estamos configurando através da função loot() o loot do nosso monstro

 

Lógica:

 

A lógica é bem simples, nome do item ou id, chance e quantitade.

 

Ex:

 

objeto.loot(("magic plate armor", 0.0025), ("fire mushroom", 69.75, 6))

 

Podemos perceber que temos dois itens, a MPA que está com uma chance bem pequena de loot, e um fire mushroom que está com uma chance grande podendo cair até 6 deles.

 

Agora encerramos aqui as características corporais do nosso monstro, restando apenas dois tópicos para serem tratados: spells e summon.

 

O summon eu irei explicar logo mais aqui abaixo, mas a criação de spells para monstro não se difere da de um player, por isso deixarei a criação de spells para um outro tutorial, ensinando nesse só como relizar a configuração das spells.

 

Vamos lá.

 

 

Criando summon para seu monstro

 

 

Se você conseguiu chegar aqui, não vai ter dificuldade nenhuma em colocar um summon para seu monstro, já que o mesmo requere duas linhas de código bem básicas.

 

summon()

 

demon.summon("Fire Elemental", 10)

 

O que essa linha nos diz?

 

Definimos aqui através da função summon() o nome da criatura que o nosso monstro pode invocar.

 

Próximo passo.

maxSummons()

 

demon.maxSummons(2)

 

O que essa linha nos diz?

 

Definimos aqui através da função maxSummons() o número máximo de invocação do nosso monstro.

 

 

Definindo o ataque e configurando a magia do monstro

 

 

Essa é a parte final do meu humilde tutorial de criação de monstros, e para fechar todo o processo de criação, vamos agora determinar o ataque corpo-a-corpo do monstro e configurar as suas magias.

regMelee()

 

demon.regMelee(520)

 

O que essa linha nos diz?

 

Estamos determinando através da função regMelee() o dano máximo corpo-a-corpo que nosso mostro pode infligir.

 

regTargetSpell()

 

demon.regTargetSpell("Hells Core", 150, 250, check=chance(9))

 

O que essa linha nos diz?

 

Estamos configurando nossa magia através da função regTargetSpell()

Lógica:

 

A lógica é simples primeiro vem o nome da magia, depois o dano minimo e o máximo, depois a chance da magia ser lançada.

Ex:

 

objeto.regTartgetSpell("Exori", 500, 5000, check=chance(5))

 

Ou seja, o monstro lançaria a magia Exori dando o dano entre 500 e 5000 com uma chance de 5 de lançar a magia.

 

 

 

Conclusão

 

 

Bom pessoal, isso é tudo que tenho a ensinar a vocês sobre criação de monstros no PyOt, espero que tudo tenha ficado claro, e explicado da melhor forma possivel, qualquer dúvida ou sugestão como dito anteriormente podem mandar por PM ou falar aqui no tópico mesmo.

 

Espero um feedback positivo da parte de vocês para que eu faça outros tutoriais de PyOt, pois já tenho algumas coisas em mente, e deixando claro aqui no tópico que esse tutorial é:

 

EXCLUSIVO PARA A OTBR.

 

Agradecimentos

 

 

Luck Oake - Meu professor de OOP.

 

LordFire - Sempre disponível para tirar minhas dúvidas sobre o PyOT.

 

Gostaria de deixar meu sinceros agradecimentos aos dois, pois além de amigos, em vários momentos também se tornam meus mentores.

 

 

Grande Abraço a todos,

 

Até o próximo tutorial.

Editado por Manoel R
Falha no engano.

Compartilhar este post


Link para o post
Convidado Avuenja   
Convidado Avuenja

Simplesmente foda! Bom ver que já temos alguém mexendo com o PyOT! Ainda mais na parte de scripts .py!

 

Ótimo Manoel... Merece fixo hein!

Compartilhar este post


Link para o post
Lordfire    110
Lordfire

Esse tutorial ficou muito bom! Puta que vontade de fazer um também.

Compartilhar este post


Link para o post
Startix    9
Startix

Faz tempo que eu não via um tutorial tão bem formatado e tão útil. Parabéns e obrigado por contribuir!

Compartilhar este post


Link para o post
constantine    33
constantine

Simplesmente foda! Muito bom em ver a iniciativa, continue assim.

Compartilhar este post


Link para o post
Oneshot    24
Oneshot

Gostei bastante do tutorial, só fico triste de vocês desmerecerem a linguagem Lua, sim, reconheço que Python é bem melhor em questão de processamento, mas falar que a função "setmetatable" é uma gambiarra em Lua, é mentira. Ela simplesmente constrói um objeto baseado em uma classe com seus atributos, que antes era uma tabela normal, vira uma meta-tabela. No final, é a mesma coisa feita em PHP, quando você chama uma classe com o new

 

Mas legal, gostei do tutorial, espero que o PyOt seja uma nova vertente.

Compartilhar este post


Link para o post
Manoel R    1
Manoel R

Foi mal Garou, a intenção não foi desmerecer tanto Lua, até porque é uma das minhas linguagens favoritas, o que eu quis dizer é que comparado as outras linguagens já orientadas a objeto, como o Python em questão, fica realmente a desejar muitas coisas, dando esse aspecto de "gambiarra" já que é uma simulação.

 

E nem teria como desmerecer Lua em OOP num fórum de Otserver com um simples tópico, pois é só ver os sistemas que você e o Skyen já desenvolveram utilizando a mesma. (Até estou esperando a att do seu sistema em OOP)

 

Obrigado pelo elogio, estou caprichando num próximo tutorial de spells tentando não deixar passar nada, pois nesse eu vacilei em alguns aspectos, pra ser sincero, e estou tentando lançar ele o mais rápido possível, torcendo pra conseguir esse final de semana.

 

Abraços.

Compartilhar este post


Link para o post
abcdefghj    0
abcdefghj

pergunta meio OFF mas relacionada também:

Como que ficou o PyOT? ainda em alpha? Não achei em nenhum lugar pra fazer o download e dar uma olhada. tava querendo começar um projeto diferente, e por mais que eu goste de lua, novos desafios sempre são bem vindos, além do fato de que a fluidez do python é visivelmente melhor e eu já ter um conhecimento básico da linguagem (sintaxe e essas coisas) graças ao TA.

Compartilhar este post


Link para o post
Manoel R    1
Manoel R

O projeto pode ser encontrado pra download aqui.

 

Ainda está em atualização sim, mas já da pra abrir um servidor tranquilamente, e se o seu projeto for alternativo, talvez nem faça diferença o que falta, vale ressaltar que uma das coisas que falta é o suporte pra AAC.

 

Abraços

Editado por Manoel R

Compartilhar este post


Link para o post
SOCER    0
SOCER

O Pyot é realmente muito bom e acompanho ele desde seu desenvolvimento, o Stian fez um ótimo trabalho, mas ainda é cedo para o pessoal pensar em "usar-lo" em um projeto. O máximo de proveito que usar-lo pode trazer, é encontrar falhas e aprender sobre python, ele está no começo de sua vida ainda, se o projeto continuar firme e forte, talvez daqui alguns anos ele esteja estável para uso, mas no momento, ainda falta muito caminho pela frente!

Compartilhar este post


Link para o post
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  
  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×