Meu jogo usa uma estrutura de componente de entidade e usa scripts para definir entidades (isso não define diretamente o comportamento, falarei mais sobre isso no final). Os scripts definem os componentes reais a serem usados para criar cada entidade. Ele usa uma linguagem de script simples que eu criei. Aqui está uma versão simplificada de um dos meus scripts:
ENTITY:"Goblin"
{
description="It's currently their age."
commonname="goblin"
pluralCommonName="goblins"
childname="gob'in"
pluralChildName="gob'ins"
active=Nocturnal
tags=Mobile
baseAttributes="OrganicMobileCreature"
[Model]{
meshname="Goblin"
texturename="GoblinTexture"
}
[Motion]{
maxvelocity=0.01:0.015
locomotion=Walk,Swim
}
[Skills]{
ALL=0.01:0.05,Mine=8.3:8.8,PlaceCube=8.3:8.8
}
[Inventory]{
maxItems=2
Allow=ALL
Disallow=NONE
}
}
Muito disso é auto-descritivo, mas aqui estão alguns destaques:
- A primeira seção descreve as informações comuns para a entidade. Isso inclui uma descrição e nomes de exibição para vários aspectos da entidade.
- A
baseAttributes
tag faz referência a outro arquivo de script que define componentes comuns que não quero redefinir várias vezes. Ele contém componentes como position
, liferequirements
e assim por diante. Se qualquer componente for definido aqui novamente, esse componente substituirá o comum.
- Cada
[NAME] { }
conjunto define um novo componente que será adicionado a essas entidades.
- Esta descrição não é apenas para uma única entidade , é para todos os goblins criados. Você verá que alguns dos valores têm intervalos (ou seja
0.01:0.015
), quando um novo duende é criado, ele é criado com um componente que possui um valor aleatório nesse intervalo. Portanto, cada duende terá habilidades ligeiramente diferentes e velocidades ligeiramente diferentes. Essa configuração define que todos os goblins começarão com habilidades realmente boas na colocação de cubos e mineração, o que é realmente apenas para meus próprios fins de teste. Mas como tenho certeza de que você pode adivinhar, é muito fácil alterar os valores para o que eu quiser.
Essa coisa toda envolve a criação de um analisador personalizado, algum tipo de estrutura para conter as definições de entidade (eu chamo de Lexicon!) E uma fábrica para obter essas definições de entidade e gerar novas entidades. Para mim, esse sistema ainda está em seus estágios iniciais, mas está saindo muito, muito bem. É um sistema bastante poderoso para definir rapidamente entidades e permite que você crie qualquer entidade desejada usando os componentes que você criou. Se você não estiver confortável em criar seu próprio analisador, acho que o XML funcionará bem. Eu converti o meu de um analisador recursivo de pushback que escrevi para uma linguagem de programação um pouco inventada.
Como você pode ver, isso define a entidade. Mencionei que ele não define diretamente o comportamento. No entanto, pode facilmente definir coisas como inimigos odiados e quão agressivamente reagir a esses inimigos. Isso seria tão simples quanto definir qualquer componente que você usa para controlar esse comportamento. Minhas entidades também possuem um componente de inteligência (não mostrado) que define coisas como:
- Como o caminho encontra (movimento simples da linha de visão, A * simples, A * preditivo, etc.)
- Quão agressivos / defensivos eles são. As entidades podem ter zonas domésticas que serão defendidas, mas talvez não sejam agressivas fora dessas zonas.
- Sensibilização tecnológica (portas abertas, uso de gadgets, evitar armadilhas, etc.)
- E mais...
Por mais que o seu seja definido, é o seu sistema que direcionará os dados nesse componente, o que, por sua vez, afeta o comportamento de suas entidades.