A resposta de Gregory Weir é a minha favorita para estruturar as instâncias de itens para desempenhar várias funções.
Para carregar de um arquivo:
Primeiro, use o YAML. YAML é uma linguagem de descrição de dados abrangente; ele pode ser analisado com relativa rapidez, lido e editado por humanos, suporta dados binários e existem bibliotecas para a maioria das linguagens de programação, incluindo Java. Isso resolve o "como faço para obter dados de arquivos em objetos?"
Segundo, use o padrão flyweight . A maioria dos dados que você lê desses arquivos é estática. Não vai mudar por exemplo ("machado causa 1d10 de dano básico e quebra madeira, mas não pedra" - isso é verdade para todos os cinco eixos que um jogador possui). O que você realmente lê dos arquivos YAML são essas definições platônicas, e suas instâncias de itens individuais têm referências não proprietárias (e constantes) a elas, juntamente com dados por instância como "Quantos balanços antes de eu quebrar?", "O jogador deu me um nome personalizado? "e assim por diante.
Ao compartilhar os dados entre instâncias em um único objeto, você preserva muita memória e facilita a atualização de itens sem o estado persistente do jogo (salve jogos ou banco de dados de jogadores).
Portanto, sua estrutura de classes se parece com:
- item de classe - uma instância por item
- Possui uma instância de arma
- Instância de ferramenta Owns-a
- Tem um nome personalizado etc.
- classe Arma - (até) uma instância por item
- Is-a ItemComponent
- Refere-se a WeaponDef
- Possui um nível de encantamento bônus, etc.
- classe Ferramenta - (até) uma instância por item
- Is-a ItemComponent
- Refere-se a ToolDef
- Possui durabilidade, etc.
- classe WeaponDef - Uma instância por tipo de arma
- Leia de um arquivo, os campos devem ser constantes.
- Tem uma quantidade de dano base, 1 ou 2 mãos, etc.
- classe ToolDef - Uma instância por tipo de ferramenta
- Leia de um arquivo, os campos devem ser constantes.
- Possui durabilidade básica, materiais que podem quebrar, etc.