11-08-2013, 12:46 PM
(Modification du message : 11-08-2013, 11:07 PM par Sephi-Chan.)
Bonjour,
J'avance bien sur Seelies ces derniers temps et une question s'est récemment posée : la façon dont stocker une quantité de ressources.
J'ai plusieurs types de ressources (environ une dizaine), disons pour l'exemple : l'herbe, les feuilles, le bois et la pierre.
Et j'ai de nombreux usages de ces ressources :
Mine de rien, ça fait pas mal d'usage (et j'en ai potentiellement d'autres qui ne sont pas encore définitifs) et il y a plus d'une façon de stocker ça.
Un système très souple mais un peu complexe
L'idée serait d'utiliser une table de relation (resource_type_thing), qui associe une quantité d'un type de ressource à n'importe quoi (un convoi, un type de bête, c'est polymorphe).
Pour ça, 5 colonnes :
Au niveau de mes tables :
Un système simple mais rigide
L'autre approche est de stocker dans chaque table une colonne pour chaque ressource et chaque usage. Si j'ajoute une ressource dans le jeu, c'est un peu chiant.
Ainsi, dans ma table
Un système simple et flexible
Une autre approche consiste à stocker dans une colonne dédié du contenu sérialisé (via le type JSON ou Hash de PostgreSQL). Ainsi, dans la colonne
Voilà, qu'en pensez-vous ?
Dans les 3 cas mon API côté application sera la même. Donc je n'ai qu'à prendre la meilleure pour mon cas.
J'avance bien sur Seelies ces derniers temps et une question s'est récemment posée : la façon dont stocker une quantité de ressources.
J'ai plusieurs types de ressources (environ une dizaine), disons pour l'exemple : l'herbe, les feuilles, le bois et la pierre.
Et j'ai de nombreux usages de ces ressources :
- Pour chaque parcelle, un type de ressource produit, sa quantité maximale, sa quantité actuelle et son facteur de régénération (exemple : la parcelle P produit une ressource R, il y a 100/120 unités dans la parcelle, avec une régénération de 2 unités par heure) ;
- Pour chaque territoire, la quantité stockée pour chaque type de ressource (exemple : il y a 200 unités de bois et 40 unités de pierre sur le territoire T) ;
- Pour chaque type de bête, sa capacité de récolte d'une bête pour chaque type de ressource (exemple : la fourmi peut ramasser 20 unités d'herbe par heure et 12 unités de feuille, le scarabée 6 unités de pierre par heure) ;
- Pour chaque espèce de bête, sa consommation pour chaque type de ressource (exemple : la fourmi consomme 4 unités d'herbe ou 2 unités de feuille (qui en plus la soignent) par heure) ;
- Pour chaque convoi, la quantité portée portée pour chaque type de ressource ;
- Pour chaque territoire, la quantité réclamée comme "taxe" pour chaque type de ressource (et ce pour chaque "règle de contrôle à la frontière", on peut en avoir pour les alliés ou pour les ennemis) ;
- Pour chaque territoire, la quantité de ressource qu'on est prêt à donner pour chaque type de bête qui spawn sur une parcelle voisine afin de la capturer (un système d'enchères avec les autres territoires voisin) ;
Mine de rien, ça fait pas mal d'usage (et j'en ai potentiellement d'autres qui ne sont pas encore définitifs) et il y a plus d'une façon de stocker ça.
Un système très souple mais un peu complexe
L'idée serait d'utiliser une table de relation (resource_type_thing), qui associe une quantité d'un type de ressource à n'importe quoi (un convoi, un type de bête, c'est polymorphe).
Pour ça, 5 colonnes :
resource_type_id
: le type de ressource dont on représente une quantité ;
quantity
: la quantité a proprement parler ;
thing_type
: le type de chose à laquelle on attache cette quantité (convoi, territoire, type de bête) ;
thing_id
: l'id de la chose à laquelle on attache cette quantité (convoi 42, territoire 66) ;
usage
: quand l'élément auquel on attache la quantité de ressource a plusieurs usage d'un même type de ressource, on le différencie grâce à ça. Par exemple, un type de bête a une consommation et une capacité de récolte.
Au niveau de mes tables :
fields
(qui fait le lien entre une zone de la carte et une partie) : resource_type_id, quantity, maximum_quantity et regeneration.
ownerships
(qui fait le lien entre un territoire de la carte, une partie et une équipe) : plusieursresource_type_things
.
beast_types
: pour la capacité de récolte, plusieursresource_type_things
(avec un usage harvesting) ; pour la consommation, plusieursresource_type_things
(avec un usage consumption).
convoys
(convoi) : plusieursresource_type_things
.
territory_tax_rules
(qui fait le lien entre un ownership, une équipe et une condition de collecte de taxe de passage) : plusieursresource_type_things
.
beast_type_capture_rules
(qui fait le lien entre un ownership, une équipe et un type de bête) : plusieursresource_type_things
.
Un système simple mais rigide
L'autre approche est de stocker dans chaque table une colonne pour chaque ressource et chaque usage. Si j'ajoute une ressource dans le jeu, c'est un peu chiant.
Ainsi, dans ma table
beast_types
(qui a plusieurs usages), j'aurais des colonnes consumption_resource_type_1_quantity
, consumption_resource_type_2_quantity
, harvesting_resource_type_1_quantity
.Un système simple et flexible
Une autre approche consiste à stocker dans une colonne dédié du contenu sérialisé (via le type JSON ou Hash de PostgreSQL). Ainsi, dans la colonne
resources
de ma table beast_types
(toujours avec ses usages mulitples), j'aurais quelque chose comme :
{
consumption: {
"resource_type_1" : 40,
"resource_type_2" : 90
},
harvesting: {
"resource_type_1" : 30
}
}
Voilà, qu'en pensez-vous ?
- La solution 1 me semble bien complexe pour le besoin. Elle pourrait également être assez coûteuse en ressources.
- La solution 2 est vraiment basique mais très fonctionnelle et efficace. Elle n'a que le côté pénible de réclamer un changement dans plusieurs table du schéma en cas d'ajout de ressources.
- Enfin, la solution 3 est flexible et efficace et je ne sais pas trop ce qui lui manque.
Dans les 3 cas mon API côté application sera la même. Donc je n'ai qu'à prendre la meilleure pour mon cas.