Lendo várias outras perguntas e respostas sobre o uso de um sistema baseado em componentes para definir itens, quero usar um para os itens e feitiços em um jogo da Web escrito em PHP. Estou apenas preso na implementação.
Vou usar um esquema de banco de dados sugerido nesta série (a parte 5 descreve o esquema);
http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/
Isso significa que terei uma tabela de itens com propriedades genéricas, uma tabela listando todos os componentes de um item e, finalmente, registros em cada tabela de componente usada para compor o item.
Supondo que eu possa selecionar os dois primeiros juntos em uma única consulta, ainda vou fazer N consultas para cada tipo de componente. Eu estou bem com isso, porque posso armazenar em cache os dados no memcache e verificá-los primeiro antes de fazer qualquer consulta. Precisarei criar os itens em todas as solicitações em que eles são usados, para que a implementação precise estar do lado do lean, mesmo se forem extraídos do memcache.
Mas é aí que me sinto confiante em implementar um sistema de componentes para meus itens terminar. Eu acho que precisaria trazer atributos e comportamentos para o contêiner de cada componente que ele usa. Só não sei como fazer isso de maneira eficaz e não acabarei escrevendo muito código especializado para lidar com cada componente.
Por exemplo, um AttackComponent pode precisar saber como filtrar alvos dentro de um contexto de batalha e também talvez fornecer um comportamento de ataque. Esse mesmo item também pode ter um UsableComponent que permite que o item seja usado e aplique algum efeito em um conjunto diferente de destinos filtrados de maneira diferente no mesmo contexto de batalha. Então, nem todas as partes de um item são partes ativas, um AttributeBonusComponent pode precisar ativar apenas quando o item estiver em um estado equipado ou ao exibir a página de detalhes do item.
Por fim, como devo reunir todos os componentes no contêiner para que, quando eu uso um item como arma, obtenho a lista correta de alvos? Sabe quando uma arma também pode ser usada como item? Ou para aplicar os bônus que o item fornece a um objeto de personagem?
Sinto como se tivesse ido longe demais na toca do coelho e não consigo entender a solução simples à minha frente. (Se aquilo fizer algum sentido.)
Da mesma forma, se eu implementasse a melhor resposta daqui, sinto que teria muitas das mesmas perguntas.
Como modelar vários "usos" (por exemplo, arma) para inventário / objeto / itens utilizáveis (por exemplo, katana) em um banco de dados relacional