23-09-2019, 06:21 PM
Salutations,
Dans le RPG de Dracca, je vais avoir besoin de stocker l'inventaire de mes personnages. Un dragon peut, par exemple, porter 1 Sacoche avec 6 emplacements, 1 objet occupant 1 emplacement. Ensuite, suivant le type de l'objet, des actions sont possibles. Par exemple, un bout de viande, ça peut se manger. Ou ça peut éventuellement se faire cuire et devenir un bout de viande cuite.
Mais ça, c'est chiant. Au sens où c'est pas drôle car c'est hyper-bateau, utilisé partout, et non-combinable.
J'ai donc eu une autre idée: et si je créais des "propriétés", de différentes natures, que j'associe à mes objets que porte mes dragons? Je suis donc parti sur le modèle suivant:
Il s'agirait donc d'avoir des objets (items) qui peuvent être emboités les uns dans les autres (id_parent_item) et se trouver quelque part (id_slot, c'est à dire l'emplacement [lieu] où l'objet se trouve). Ils peuvent enfin être portés directement par un personnage (id_character).
De plus, chaque item aura alors zéro, une ou plusieurs propriétés: contenir 1 à N objets (liquides ou solide?), être cuit, ramener un personnage à la vie, redonner des PVs, etc.
En terme de données, cela pourrait faire le case suivant:
Signifiant que l'objet "Sacoche" est directement porté par le personnage d'ID 2 (Colmarr). Cette sacoche "peut contenir" (c'est la définir de ma propriété d'ID 1) jusqu'à 6 objets. Les "Transtal de Vie" (type spécial de cristal) peuvent chacun "ramener un personnage à la vie" (c'est la définition de ma propriété d'ID 2). L'eau pure est contenue dans le flacon (et n'a pas de propriété pour le moment; le flacon non plus).
Enfin, les transtals et le flacon sont tous dans la sacoche du personnage.
Je pense qu'un tel modèle devrait me permettre de combiner les propriétés des objets, et d'avoir un pannel de possibilités hyper-large. Mais sait-on jamais: voyez-vous des écueils à ce genre d'approche? Est-ce que vous l'avez déjà tenté? Si vous avez fait un RPG, comment avez-vous géré l'inventaire et les "propriétés" (effets, ou équivalent) des objets?
Dans le RPG de Dracca, je vais avoir besoin de stocker l'inventaire de mes personnages. Un dragon peut, par exemple, porter 1 Sacoche avec 6 emplacements, 1 objet occupant 1 emplacement. Ensuite, suivant le type de l'objet, des actions sont possibles. Par exemple, un bout de viande, ça peut se manger. Ou ça peut éventuellement se faire cuire et devenir un bout de viande cuite.
Mais ça, c'est chiant. Au sens où c'est pas drôle car c'est hyper-bateau, utilisé partout, et non-combinable.
J'ai donc eu une autre idée: et si je créais des "propriétés", de différentes natures, que j'associe à mes objets que porte mes dragons? Je suis donc parti sur le modèle suivant:
CREATE TABLE `item` (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
-- non null character: the character wears the object
-- non-null spot: the object is at the specified place (spot)
-- non-null parent: the object is inside the parent object
-- Only 1 fields out of the 3 must be non-null, others must be NULL
id_character INT UNSIGNED NULL,
id_spot INT UNSIGNED NULL,
id_parent_item INT UNSIGNED NULL,
-- The item name (in this user's language)
label VARCHAR(200) NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT
FOREIGN KEY (id_character) REFERENCES owncharacter (id)
-- @todo Restrict because I would have to drop the inventory when deleting the character (I might do that with a CASCADE maybe?)
ON UPDATE CASCADE ON DELETE RESTRICT,
CONSTRAINT
FOREIGN KEY (id_spot) REFERENCES spot (id)
ON UPDATE CASCADE ON DELETE RESTRICT,
CONSTRAINT
FOREIGN KEY (id_parent_item) REFERENCES item (id)
-- @todo I don't know how to behave when deleting the parent of an object
ON UPDATE CASCADE ON DELETE RESTRICT
)
ENGINE = InnoDB
COLLATE = 'utf8mb4_general_ci'
;
CREATE TABLE `item_property` (
id_item INT UNSIGNED NOT NULL,
id_property SMALLINT UNSIGNED NOT NULL,
uint INT UNSIGNED NULL DEFAULT NULL,
shortstring VARCHAR(16) NULL DEFAULT NULL,
PRIMARY KEY (`id_item`, `id_property`),
CONSTRAINT
FOREIGN KEY (id_item) REFERENCES item (id)
ON UPDATE CASCADE ON DELETE CASCADE
)
ENGINE = InnoDB
COLLATE = 'utf8mb4_general_ci'
;
Il s'agirait donc d'avoir des objets (items) qui peuvent être emboités les uns dans les autres (id_parent_item) et se trouver quelque part (id_slot, c'est à dire l'emplacement [lieu] où l'objet se trouve). Ils peuvent enfin être portés directement par un personnage (id_character).
De plus, chaque item aura alors zéro, une ou plusieurs propriétés: contenir 1 à N objets (liquides ou solide?), être cuit, ramener un personnage à la vie, redonner des PVs, etc.
En terme de données, cela pourrait faire le case suivant:
Code :
* item:
id id_character id_spot id_parent_item label
1 3 2 \N Sacoche
2 3 2 1 Transtal de Vie
3 3 2 1 Transtal de Vie
4 3 2 1 Transtal de Vie
5 3 2 1 Flacon
6 3 2 5 Eau pure
* item_property:
id_item id_property uint shortstring
1 1 6 \N
2 2 \N \N
3 2 \N \N
4 2 \N \N
Signifiant que l'objet "Sacoche" est directement porté par le personnage d'ID 2 (Colmarr). Cette sacoche "peut contenir" (c'est la définir de ma propriété d'ID 1) jusqu'à 6 objets. Les "Transtal de Vie" (type spécial de cristal) peuvent chacun "ramener un personnage à la vie" (c'est la définition de ma propriété d'ID 2). L'eau pure est contenue dans le flacon (et n'a pas de propriété pour le moment; le flacon non plus).
Enfin, les transtals et le flacon sont tous dans la sacoche du personnage.
Je pense qu'un tel modèle devrait me permettre de combiner les propriétés des objets, et d'avoir un pannel de possibilités hyper-large. Mais sait-on jamais: voyez-vous des écueils à ce genre d'approche? Est-ce que vous l'avez déjà tenté? Si vous avez fait un RPG, comment avez-vous géré l'inventaire et les "propriétés" (effets, ou équivalent) des objets?