Estou desenvolvendo um RPG e estou no ponto em que preciso começar a construir um banco de dados inimigo. Existem alguns desafios associados a isso e a algumas soluções que venho considerando.
Aqui está o que eu preciso fazer no meu banco de dados inimigo:
Eu tenho duas classes inimigas principais das quais preciso representar dados:
Uma classe inimiga base que inclui o seguinte:
Base Stats
Status Resistance Table
Elemental Resistance Table
Steal Table
Drop Table
Level
Unique ID
Base XP
AI Hook
Name
Display Name
E uma classe derivada que adiciona a capacidade de adicionar equipamentos, adicionando os seguintes campos:
Main Weapon
Secondary Weapon/Equipment
Armor
Accessories
Posso adicionar campos ou classes adicionais no futuro, se fizer sentido. Eu considerei dois formatos possíveis para inimigos de banco de dados.
Arquivos XML
Eu basicamente faria assim:
<?xml version="1.0" encoding="utf-8"?>
<Enemies>
<Enemy name="Red Dragon" type="BaseEnemy" level="56" displayname="Red Dragon">
<Stats HP="55000" MP="2500" SP="2500" Strength="212" Vitality="125" Magic="200" Spirit="162" Skill="111" Speed="109" Evasion="100" MgEvasion="100" Accuracy="100" Luck="55"/>
<StatusResistances>
<Resistance name="Sleep" value="100" />
<Resistance name="Stop" value="100" />
</StatusResistances>
<ElementResistances>
<Resistance name="Fire" value="75" />
</ElementResistances>
<LootTable>
<Item name="Elixir" rate="0.03" count="1"/>
</LootTable>
<DropTable>
<Item name="Elixir" rate="0.03" count="1"/>
</DropTable>
<AIScript value="BasicBehaviour.py" />
<BaseXP value="4800"/>
</Enemy>
<Enemy name="Gaverick 1" type="HumanoidEnemy" level="33" displayname="Gaverick">
<!--Same Stuff as above here-->
<Equipment>
<Weapon name="Dark Eclipse"/>
<Armor name="Terra Defense"/>
<Accessory name="Ribbon"/>
</Equipment>
</Enemy>
</Enemies>
Vantagens:
- Fácil de estender se precisar adicionar / reorganizar parâmetros
- fácil de atribuir valores padrão
- Eu já tenho um analisador XML (pugixml) incluído para arquivos de configuração, mapas lado a lado e descrição de recursos
Desvantagens:
- potencialmente lento (meu banco de dados provavelmente atingirá várias centenas de inimigos)
- não pode procurar inimigos arbitrários, provavelmente precisará manter todos os inimigos na memória.
- Isso significa que eu preciso reiniciar o jogo para carregar dados alterados do inimigo também
SQLite
Para isso, eu basicamente faria uma tabela com colunas representando todos os dados necessários e deixaria os campos desnecessários vazios
Vantagens
- A consulta arbitrária pode manter os dados inimigos desnecessários fora da memória
- Sente-se mais estruturado
- Tamanho de arquivo menor
Desvantagens
- Mais difícil estender / reorganizar pedidos de parâmetros
- Sobrecarga desnecessária para campos não utilizados
- Será necessário escrever um wrapper de interface de banco de dados para sqlite
Com isso em mente, fiquei curioso em obter alguma experiência externa sobre o que outras pessoas fizeram. Eu posso estar pensando sobre isso totalmente errado e, se assim for, sugira uma alternativa para as duas possibilidades que tenho aqui.
Além disso, qualquer sugestão sobre como melhorar uma dessas possibilidades seria apreciada. Realmente, eu só quero saber se estou no caminho certo.
Estou aberto a usar qualquer biblioteca gratuita e já estou incorporando o impulso
fonte
Não estou convencido de que você precise de duas aulas para isso; um único deve ser suficiente. Você poderia facilmente modelar isso com composição e não com herança ; técnicas modernas de design de software estão se afastando de hierarquias profundas de classe, porque tendem a ser frágeis e difíceis de manter. Embora sua hierarquia proposta não seja muito profunda, ela é desnecessária (que é o primeiro passo em direção a "profunda"). Sua classe derivada adiciona apenas propriedades que poderiam facilmente permanecer na classe base, mas deixadas em branco.
Isso não apenas permitirá iterar e ajustar melhor o comportamento e as propriedades de seus inimigos individuais posteriormente, como também permite que seu código seja mais simples, pois você lida com apenas uma única API pública e seu processamento.
Desses dois, eu escolheria XML. Em geral, você pode querer olhar para o JSON . Eu não acho que o uso de um banco de dados relacional real aqui seja garantido. Consulte esta pergunta para uma discussão sobre o porquê: a versão curta é complexa e menos direta para acessar ou editar e, como você não precisa das vantagens de um banco de dados relacional, é melhor seguir algo semelhante.
XML e JSON têm a enorme vantagem de serem trivialmente legíveis e editáveis por humanos, sem a necessidade de ferramentas especializadas, o que pode realmente ajudar a aumentar o tempo de iteração. O XML permite que você use o XSLT para transformar em massa seus dados, caso você mude drasticamente o esquema ou precise fazer algum outro tipo de migração em larga escala.
Especificamente para suas três "vantagens" no SQLite:
fonte
Aqui está outra maneira de analisar, criar uma estrutura de dados, preenchê-la com seus valores de monstro e salvar a estrutura de dados em um arquivo binário e colocá-la em um arquivo pak como:
Em seguida, carregue o pak na memória, analise os arquivos npcdat e analise os dados neles, mediante solicitação. É mais rápido que XML e SQLLite e ocupa muito menos espaço.
fonte
A única vantagem do SQLite em que consigo pensar é na redução de duplicação, ou seja, se cair na parte de vantagem "Sensação mais estruturada".
Mas você pode consultar XML com XPath, se desejar. Mas acho que para centenas (e até milhares) o armazenamento de todos os dados na memória não é crítico. Com essa quantidade de tamanho de dados do arquivo db ou XML, não é crítico.
Eu voto em XML.
fonte