Stockage de l'inventaire d'un RPG... et des propriétés des objets!
#1
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:


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?
Répondre
#2
Bon au final, cela donne ce résultat à l'affichage... et je le trouve diaboliquement lourd (cf PJ). Surtout que là, les objets n'ont qu'une propriété, mais s'ils en avaient 3 ou 4... :/

Je vais essayer de voir ce que ça donne en virant les textes, histoire de compacter un peu les choses, et en mettant le nom de l'objet en title de l'image.
L'idée serait alors qu'au clic, j'ouvre une frame avec le détail de l'objet, dont les propriétés.

PS: toujours aussi contre-intuitif le fait de devoir "uploader" la PJ séparément du message 2

PPS: Ah, ok, elles sont en rade... Faudra que je regarde en rentrant (si j'y pense [et si Sephi ne l'a pas fait entre temps...! : )]) Du coup, ce message ne va pas beaucoup vous parler... :/
Répondre
#3
j avais y a longtemps (jquery demarrait juste) développer un systeme similaire :

le personnage a des conteneurs (ane, sac, coffre, bourse ...) dans lesquels il peut stocker des "items" (ou des piles d'item genre 78 bois) et des conteneurs dans lesquels [recursif] ...

par un drag & drop on déplaçait les items (ou les conteneurs)
l'idée que j'avais (mais pas encore implémenté) était de pouvoir "cacher" des trucs : si tu cherches a voler un personnage tu fouilles dans son sac => tu ne sais pas trop ce qu'il y a et tu "explores". A l inverse tu te proteges des voleurs en cachants des trucs dans des conteneurs aux propriétés particulières (genre délai pour ouvrir un truc, etc..)

bref sur le papier super idée (ou pas) en réalité, rien que le drag en drop rendait la gestion chiante alors si tu rajoutes un tas de truc
dessus

pour moi les infos supplémentaires, code couleur (genre encadré rouge = propriété de feu) et survol (ou clic qui affiche la fiche, rime riche)
[WIP]projet Rivages
[WIP]projet Arthur (comme si ça suffisait pas d'un...)
Répondre
#4
Si c'est juste pour avoir un inventaire arborescent je vois pas spécialement l'intérêt par rapport à un inventaire "plat" classique. Après si l'interface est bien faite et qu'on perd pas en ergonomie, pourquoi pas mais bon.

Par contre si les propriétés des objets affectent les objets parents, ça peut donner un système de craft sympa :
Code :
- dague
  - poignée en fer [équipement main]
  - lame courte en fer [dégâts 1-3]
Code :
- épée
  - pommeau en argent
    - rubis [enchantable]
      - magie du feu [+2 dégâts de feu]  
  - poignée en acier [équipement main]
    - revêtement en cuir [+2 pour éviter d'être désarmé]
  - garde en acier [+1 défense]
  - lame longue en acier [dégâts 3-7]
    - runes de protection gravées [+1 résistance à la magie]
Répondre
#5
Oui, c'est le concept (au détail près qu'un dragon n'aura pas de main, jusqu'à temps que j'étende à d'autres types de personnage). Un exemple plus spécifique serait donc (entre [] les propriétés):

Code :
- collier [peut être porté autour du cou]
  - chaine en or [charisme +2, résistance de l'objet -2 (= peut se casser facilement), poids 1kg (=affecte le vol); peut être porté autour du cou]
    - Choc thermique [résistance + 1]
  - fermoir en papier mâché [résistance - 5; poids 0]
  - support en argent []
    - Skial noir (cristal) [explose à la lumière occasionnant -10PV de dégats; poids 100g]
      - Rune ancestrale gravée [double l'effet du cristal]
  - enchantement [double la résistance de l'objet]

Ce qui impliquerait qu'il me faudra sûrement rajouter, en plus des propriétés de chaque "objet" de cette arborescence, des "propriétés virtuelles", calculées en tenant compte des propriétés de tous les sous-objets. Cela permettrait de savoir que, dans le cas présent, ce collier: [explose à la lumière occasionnant -20PV de dégats; résistance -3; poids 1.1kg, peut être porté autour du cou; charisme +2]
Il faudrait peut-être aussi distinguer les "objets" des "traitements" (enchantements, runes, et autres trucs non matériels)... A voir, je peux garder tout ça dans la même structure, et juste considérer que cela n'a pas de sens d'avoir l'objet "rune gravée" sans un objet "parent"... et qu'il n'est pas possible de poser "rune gravée" sur "enchantement" (graver un enchantement, ce serait étrange 2 )

PS: Voilà ce que cela donne pour l'instant, n'affichant que les item portés par le joueur (ici, une sacoche) et ce qu'elles peuvent éventuellement contenir (un collier apparaitrait donc s'il est porté au cou, mais comme il ne "contient" rien, il n'y aurait rien en dessous de l'icône dudit collier). Les "cubes" sont l'icone des items qui n'ont pas encore d'icone : ) En hover (title), j'affiche le nom de l'item. Au clic, je ferai en sorte d'ouvrir une frame avec le détail de l'objet, et les actions qu'on pourrait faire dessus.

[Image: inventory-1.jpg]
Répondre




Utilisateur(s) parcourant ce sujet : 1 visiteur(s)