Faz algum tempo que não posto aqui atualizações do projeto, mas acho que só posto aqui quando encontro algum problema. Pelo menos dessa vez tenho uma solução! Definitivamente não deve ser a melhor do mundo, mas funciona. O problema da vez era definir qual e quando deve ser sumonado um novo herói no mapa. O problema de onde está ao menos encaminhado. O problema em si é bastante simples de ser entendido: O jogador pode construir algumas estruturas e essas estruturas atraem diferentes classes de heróis. Exemplificando... um mago é mais atraído por uma livraria, enquanto uma forja atrai mais um espadachim. Agora saber quando e se um mago ou um espadachim deve ser summonado no mapa é outros quinhentos...
Primeiro vamos focar no problema de quando summonar um herói e depois no qual. Tentei dar uma lida sobre jogos de simulação de parques temáticos e como eles resolvem o problema de definir quando um visitante chega ao parque. A conclusão é que, bem, eles não resolvem do jeito que esperava. Em Sim Theme Park o que acontece é que um ônibus chega ao parque, despeja todos os visitantes que vão para a bilheteria. Lá na bilheteria o visitante define se vai ou não entrar no seu parque. Portanto, os visitantes chegam em algo equivalente as waves de um tower defense deixados por ônibus na porta do parque. Eu quero algo mais individualista já que pretendo ter menos agentes do que em Sim Theme Park, então a ideia de wave fica, mas apenas um herói por vez é sumonado.
|
Visitantes chegando no parque em Sim Theme Park |
A pergunta de quando um herói deve chegar ainda não foi respondida, mas tinha alguns requisitos para me guiar. Um dos requisitos era que quanto maior o tempo sem nenhum herói sumonado, maior a probabilidade de um herói ser sumonado. Outro requisito é que cidades grandes, portanto com muitas construções, atraem uma quantidade maior de heróis. Então comecei modelando no papel como uma função exponencial a probabilidade de um herói ser sumonado ao longo do tempo. Sim, você vai precisar lembrar de funções que você aprendeu no Ensino Médio pra entender como implementei isso, mas eu vou facilitar sua vida com imagenzinhas de gráficos plotados no
WolframAlpha.
Foi definida que existiria essa exponencial que indicaria qual é a probabilidade de um herói ser sumonado ao longo do tempo, então bastaria sortear um número e verificar se o valor é menor que o da exponencial naquele instante.Tá, então vamos sortear um número de 0 até quanto? Eu precisava definir um limiar para ser o valor máximo do sorteio e detalhe esse limiar também teria que se adaptar a atratividade total da cidade, senão os heróis seriam sumonados toda hora sem parar depois de certo valor de atratividade. Então nosso gráfico que estava apenas com uma função exponencial qualquer, agora também tinha uma função constante e ficou parecido com essa aqui:
|
Aqui temos uma função exponencial e uma constante considerando atratividade |
Então resumindo: a cada X segundos é sorteado um valor entre 0 e um valor definido pela atratividade total da cidade. Se esse valor for menor que o resultado da função exponencial, usando como entrada o tempo desde a ultima vez que um herói foi sumonado e a atratividade total da cidade, então um herói deve ser sumonado. Os parâmetros e como essa constante é definida é algo que vou deixar pra depois, por se tratar de balanceamento. No fim das contas eu preciso primeiro definir quanto custa uma nova estrutura pra depois balancear isso. Temos então quando um herói deve ser sumonado, mas não quem é esse herói. Agora abandonamos temporariamente a matemática e vamos um pouco para programação na Unity 5.
Para determinar quem é o herói que vai ser sumonado temos que determinar o que a cidade atrai. Para determinar o quanto a cidade é atrativa para um determinada classe de herói é preciso saber o quanto cada estrutura individualmente atrai. Todas as estruturas "construíveis" tem um componente chamado PlaceableBuilding, dentro desse componente existe uma estrutura chamada Hero Atractiviness. Essa estrutura é um dicionário que relaciona para classe de herói um valor de atratividade. O legal dessa estrutura é que posso mais pra frente se necessário balancear para cada classe individualmente. Já mostrei que aprendi como fazer dicionários serializaveis legais assim
nesse link. Não consigo expressar o quanto estou adorando brincar com esses dicionários serializaveis.
|
Componente Placeable Building atualmente, provavelmente teremos outras classes de heróis |
Depois de criar esse dicionário fica fácil pra verificar o quanto a cidade é atrativa pra cada classe de herói. Tenho uma classe que mantêm o valor da atratividade individual e total atualizada. Defino uma faixa de valor para cada classe proporcional a atratividade individual da classe, sorteio um valor e boom! Temos a classe de herói selecionada. Agora o próximo passo é a criação da personalidade desse herói. Isso vou deixar para uma próxima postagem já que quero abordar isso com bastante cuidado. Feito isso é só sumonar esse herói em uma das possíveis localizações.
Então o que temos essa semana é isso, sei que é bastante simples depois que se entende como foi feito, mas foi uma parte bastante interessante de se idealizar. Provavelmente, ambas as abordagens não são as melhores, mas resolvem e as implementei assim. Em alguma próxima postagem trago a personalização de cada herói.
Autor:
Pâmela de Assis Beltrani
É Bacharel em Ciência da Computação pela PUCPR e Mestre pela UFPR. Também é especialista em Desenvolvimento de Jogos Digitais pela PUCPR.
0 comentários:
Postar um comentário