quinta-feira, 26 de junho de 2008

Combate!!!!!

Mais algumas imagens de como está ficando.























A #@#$& do lobo não anda! >.<

Um pouco de mimimi...

Ando meio sem tempo. Tive aula durante o ultimo final de semana inteiro, literalmente. É o lado ruim de ser nerd.

Essa última semana eu tentei entrar em um grupo para montar um modulo básico para servir de template para outros builders. Como sempre, apareceram um monte de gente disposta a judar, cada pessoa com uma idéia diferente (Sempre diferentes das minhas idéias) e uma meia dúzia com seus mimimis de sempre.

Minha idéia era fazer um template de PW básico com scripts principais ja configurados e mapas já feitos. Assim cada pessoa que quisesse montar seu servidor poderia pegar essa base e apenas adicionar mais coisas.

Também queria focar em mapas maiores e com menos detalhes (Apenas uma pequena parte do mapa mais trabalhado apenas para as SS dos jogadores), pois sempre prefiro ter um load maior do que ficar fazendo load a cada 3 monstros.

Independente do que saia la no grupo (Os chorões vivem dizendo que ja tem isso ou aquilo pronto mas nunca deram o link pra baixar) eu vou continuar meu projeto solo. Minha idéia é a seguinte:

Criar um mapa inicial onde seja possível jogar do lvl 1 ao 4.

Colocar algumas quests nela para ajudar no desenvolvimento do personagem.

Ajustar os scripts básicos (Morte, Banco de Dados, Respawn e loot);

E só.

Tendo isso funcional, minha próxima meta será disponibilizar o módulo e encontrar alguém para hostear o jogo e testar, pois estou sem internet em casa e a internet depende de aumento de salário.

Tendo os scripts básicos funcionando, será mais fácil adicionar mais mapas, monstros e quests (Apesar de que os diálogos são igualmente cansativos de se fazer. São divertidos no começo, mas se tornam cansativos depois de milhares de linhas escritas e outras milhares ainda por escrever).

O importante, é conseguir criar esse mapa inicial e disponibiliza-lo pra comunidade, pois assim, mesmo que eu não tenha mais tempo, outras pessoas podem continuar de onde parei e não fazer como as dezenas de projetos que começaram e nunca sairam do papel, pois seus idelizadores resolveram viver suas vidas e não disponibilizaram o que ja tinham feito.

Então antes de disponibilizar o módulo, eu preciso ter as seguintes implementações:

- 1 Mapa inicial. [Vila dos Tropeiros quase pronta. Ainda faltam mais algumas implementações, terminar as laterais e consertar a ponte]

- 3 Interiores de casas (Taverna, Celeiro e uma casa de NPC). [Nada]

- 1 Dungeon (Dungeon das aranhas gigantes). [Nada]

- Script de Respawn. [Quase pronto. Falta apenas fazer a @#$&# do monstro andar depois do respawn]

- Script de Loot. [Pronto, mas falta bolar um jeito de limitar sem bloquear por completo a habilidade de pickpocket]

- Script de banco de dados. [Ja instalei o NWNX4 e o MySQL, mas agora falta fazer as implementações para salvar no banco]

- Script de morte. [É o que mais existe. Provavelmente usarei o sistema do Defiance IV e dicionarei mais coisas no futuro, como o sistema de Fuge Death do HCR2]

- Criaturas. [Dois Blueprints prontos: Cão Selvagem e Aranhas Marrons. Precisarei de mais uma variação das aranhas e um boss]

sexta-feira, 13 de junho de 2008

Meu primeiro Script (Precisa de melhoria. Muita melhoria)

Como prometido. Aqui esta meu primeiro script. Esta funcionando perfeitamente como eu era meu objetivo inicial, mas agora quero adicionar a capacidade de diminuir a chance de drop de item a medida que a diferença de level entre o jogador e a criatura for maior.

Em todo caso aí está:

//:: sh_calculardrop
/*
Calcule the loot of creature. You can change the drop rate creating and modifing a
variable called sh_iDropRate in the item variable of type float that can be between
0.00 to 100.00 that represent the chance drop of the item (More is better) and create
a variable named sh_mDropRate in the in the module set of type float tha can be any
positive number. If sh_iDropRate don't exists, I use 0 instead (No chance to drop), if
sh_mDropRate don't exists, I use 1 instead (No modification).
*/
//:://////////////////////////////////////////////////
//:: Copyright (c) 2008 SubHeaven World
//:: Created By: SubHeaven
//:: Created On: 06/12/2008
//:://////////////////////////////////////////////////

void CalcularDrop(object oCriatura)
{
//Vejo se a criatura é válida e se não é um jogador
if (oCriatura != OBJECT_INVALID && !GetIsPC(oCriatura))
{

//Recupero o modificador de chance de drop do modulo
float lfGlobalRate = GetLocalFloat(GetModule(), "sh_mDropRate");

//Pego o primeiro item do inventário da criatura
object oItem = GetFirstItemInInventory(oCriatura);

//Faço um loop no inventário da criatura
while (oItem != OBJECT_INVALID)
{
//Pego a chance de drop do item
float lfItemRate = GetLocalFloat(oItem, "sh_iDropRate");

//Calculo um numero aleatorio de 0 a 10000
float lfChance = IntToFloat(Random(10000)) / 100;


//Verifico se a chance de drop do item está dentro dos
//valores permitidos (entre 0 e 100%)
//Se não eu ajusto para um valor padrão
if (lfItemRate > 100.0)
{
lfItemRate = 100.0;
}
else if (lfItemRate < 0.0)
{
lfItemRate = 0.0;
}

//Aqui eu verifico se o valor aleatorio que consegui
//anteriormente é maior que a chance de drop do item
//contando com o ajuste do modulo
if ((lfItemRate * lfGlobalRate) < lfChance)
DestroyObject(oItem);

//Esse aqui são apenas algumas linhas de debug
//Ele mostram os valores aletorios conseguidos
//e as chances de drop de cada item
string sMensagem = "(" + FloatToString(lfChance) + ") DC = " + FloatToString(lfItemRate * lfGlobalRate);
SendMessageToPC(GetFirstPC(), sMensagem);
SendMessageToAllDMs(sMensagem);
PrintString(sMensagem);

//Terminado com um item eu parto pro próximo item
//do inventário
oItem = GetNextItemInInventory(oCriatura);
}
}
}

quarta-feira, 11 de junho de 2008

Eu e minhas férias

Oláá terráqueos!!!

Pois é. Pensei que já estaria em semi-férias essa semana, mas férias da faculdade mesmo só depois que os alunos que ficaram de 3ª VA (Uma éspécie de "recuperação") fizerem as provas deles. Antes disso vou ter que labutar por cada minuto extra.

Mas em todo caso, ontem comecei a juntar alguns scripts que peguei na Vault. Um dos que primeiro testei foi o script Dave's Simple Respawn. Apenas dois scripts, um para o evento OnDeath da criatura e outro para o evento OnRespawn. Criei a variável Global como indicado no readme e o respawn funcionou que é uma maravilha, porém o monstro não me atacava e nem andava depois do respawn. O problema de atacar foi fácil de resolver. Eu vi que os outros BluePrints de monstros já prontos ja tinham vários eventos setados neles (Todos os slots preenchidos), então apenas exportei o kit de script de um dos BluePrints (Para fazer isso basta clicar no BluePrint e olhar na aba Preferencias, la em cima, em um menu textual vão ter duas opções: Export e Import), renomeei para sh_Hostile, importei no BluePrint da criatura que criei, mudei os eventos OnDeath e OnRespawn para continuar usando os do Dave e mantive o resto. Agora meu Cao Selvagem ataca quando vc chega perto dele, mas ainda não anda (T_T), de acordo com o Readme dos scripts, ele cria uma cópia do monstro que está no BluePrint, logo, a tag é a mesma do BluePrint.

Essa tag é fundamental para criatura conseguir andar pelos locais programados pelo builder, enquanto quando eu criava uma criatura com a tag vt_lobo1 e criava os WayPoints wp_vt_lobo1_0x ele funcionava da primeira vez, depois da primeira morte, o script criava outro lobo, mas com a tag do bluePrint (Que é apenas lobo1). Aí bagunçava tudo.

Mudei o script dele para criar uma criatura com a mesma tag da anterior. Usei a função GetTag(OBJECT_SELF) mas ele parece ter criado um logo com a mesma tag do meu mapa (?!?!). Enfim, isso ainda está pendente para quando tiver mais tempo.

Outra mudança nos scripts foi a criação do meu próprio script para drops estilo WOW ou Ragnarock. Você cria seu um item, informa a chance de drop, joga o item no inventário do blueprint da criatura e pronto. Quando a criatura for criada, meus script calcula quais daqueles itens estão disponíves ou não. Esse funcionou legal, preciso criar uma variavel em cada item chamado sh_iDropRate do tipo float e com valor de 0 a 100 e uma variável global chamada sh_mDropRate que serve como multiplicador da chance de drop. Amanhã eu trago o script e posto aqui.

terça-feira, 10 de junho de 2008

Trabalhando no meu PW

Bom... Finalmente acabaram as provas e os trabalhos da faculdade e terei mais tempo para brincar no ToolSet e tentar programar um pouco do meu jogo.

Como todo fã de MMORPG, eu estou querendo montar um PW (Persistent World). Como não cheguei a programar muita coisa no NWN 1, terei que aprender tudo do zero agora no 2.

Resolvi começar com uma típica fazenda, a Vila dos Tropeiros. Provavelmente ela será o StartPoint dos humanos (Pretendo colocar um StartPoint diferente para cada raça do jogo, como no WOW).

Segue algumas imagens de como ela está ficando:
















BlogBlogs.Com.Br