|
Alors que je cherchais à mettre au point le système de craft ultime, j'ai eu une idée. D'abord, je vais expliquer les propriétés que je recherche ; ensuite, je vous proposerai un système qui vérifie ces propriétés.
Propriétés voulues D'abord, le mécanisme doit être suffisamment simple pour être implémenté facilement, compris rapidement par les joueurs, équilibrable sans prise de tête, mais avec de nombreuses implications. Un mécanisme de jeu qui ne vérifie pas ces propriétés n'est pas intéressant. Ensuite, les joueurs doivent pouvoir apprendre par eux-même comment crafter. Dans les MMO actuels, on va voir un PNJ, on donne des PO et voilà, on sait crafter une lance (par exemple). Ou alors on trouve un papier par terre avec une recette dessus. Tout ça est bien joli mais c'est un peu frustrant : le craft c'est la création d'objets nouveaux, et là on ne nous propose que de créer des objets bien définis. C'est un peu l'oeuf et la poule : à l'origine du monde, il y avait des PNJ ? Il y avait des recettes qui traînaient par terre ? Non ! Alors il doit bien y avoir eu des gens qui ont inventé des recettes. Et pourquoi le joueur n'aurait pas lui aussi cette possibilité ? Donc, je cherche un système de craft permettant au joueur de découvrir de nouvelles recettes par lui-même, ou de démonter un objet existant pour voir comment il est fait et en déduire la recette. Cependant, je souhaite aussi qu'il ne soit pas possible pour le joueur de simplement aller sur internet et voir une liste de recettes. Le but du jeu est de découvrir les recettes. Leur application est secondaire. Il est donc nécessaire que pour un objet et un joueur donné, la recette permettant de créer cet objet soit unique pour ce joueur. D'un point de vue roleplay, chaque personnage est unique et ne construit pas les objets de la même façon. Donc pour résumer : - un joueur doit pouvoir démonter une lance pour voir qu'elle est construite à partir d'un bâton et d'un silex disposés d'une certaine façon ; - un joueur doit pouvoir prendre un bout de bâton et un silex, les assembler d'une certaine façon et obtenir une lance ; - la disposition du silex et du bâton doit être différente pour chaque joueur. Des recettes uniques pour chaque joueur Le problème c'est qu'il ne faut pas non plus que le serveur doive, pour chaque nouveau joueur, créer autant de recettes uniques pour ce joueur qu'il y a d'objet en jeu. De même, pour chaque nouvel objet implémenté, il ne faut pas que le serveur stocke une nouvelle recette unique pour chaque joueur. Sinon, avec 10000 joueurs et 100 objets craftables, il faudrait stocker 1000000 recettes. Or, un serveur de MMO doit être le plus léger possible pour accueillir le plus de joueurs possibles. Et donc je propose d'utiliser un outil que nous apporte la cryptographie, en l'occurence : les fonctions de hash. http://en.wikipedia.org/wiki/Cryptog..._hash_function On choisit donc une fonction de hash cryptographique (celle que vous voulez) que l'on va appeler HASH. On a besoin d'une fonction F qui, étant donné un joueur J et un objet O, nous donne une recette F(J, O). Et il faut que cette fonction ne soit pas facilement inversible : étant donné F(J, O) et O, il ne faut pas pouvoir calculer J. Ca tombe bien, c'est exactement ce que font les fonctions de hash. Donc étant donné un numéro unique J pour le joueur, et un numéro unique O pour l'objet, on peut définir : F(J, O) = HASH(J xor O) On obtient un numéro H qui détermine la façon d'assembler les composants permettant d'obtenir O. Ces composants sont fixes (pour faire une lance, il faut un bâton et un silex, quelque soit le joueur) mais pas leur permutation. Si on imagine par exemple que le joueur doive placer le bâton et le silex sur une grille 3*3 (ou 3*4 pour un cube horadrim ![]() http://en.wikipedia.org/wiki/Permuta...g_permutations Concrètement, qu'est-ce que ça veut dire ? Pour le serveur c'est simple : il doit simplement stocker un numéro unique J pour chaque joueur et un numéro unique O pour chaque objet craftable. Le client doit être capable de calculer le numéro associé à la permutation choisie par le joueur, et le serveur doit déterminer si cette permutation est la bonne étant donné les composants utilisés. Le serveur doit aussi, quand le joueur démonte un objet, être capable de calculer la permutation associée à ce joueur pour lui en montrer une partie. Pour le joueur, c'est très intéressant. Imaginons que vous trouviez une lance. Vous aimeriez bien pouvoir en fabriquer d'autres. Alors vous démontez la lance. Le jeu vous montre alors un quadrillage 3*3 représentant la recette. Pour vous, le silex se trouve sur la case du milieu (mais pour un autre joueur, il pourrait être ailleur). Par contre, le bâton a été cassé dans l'opération, et vous ne savez pas où il est placé. Vous pouvez démonter une autre lance pour essayer de savoir, mais vous pouvez aussi essayer toutes les combinaisons. Après tout, une fois qu'on sait où est le silex, il n'y a plus que 8 placements possibles pour le bâton. Donc vous essayez un par un jusqu'à trouver la bonne combinaison, et ça y est : vous savez construire des lances. Améliorations On peut améliorer ce système de plusieurs façons. D'abord, tel que je l'ai présenté, les composants sont fixes ; mais on peut très bien imaginer un composant spécial (poudre magique...) pour certaines recettes. Je ne pense pas que ça soit très utile mais pourquoi pas. Ensuite, l'objet obtenu peut être plus ou moins aléatoire. La construction de l'objet peut rater de temps en temps, avec destruction de certains composants en cas d'échec (surtout si le joueur n'a pas utilisé la bonne combinaison). Le démontage des objets peut être plus ou moins difficile, et le joueur peut apprendre plus ou moins d'informations, et obtenir plus ou moins de composants. Le démontage peut nécessiter des outils. La construction aussi peut utiliser des outils : ça reviendrait à rajouter un composant (l'outil) qui ne serait pas consommé par la construction. Et bien sûr, tous ces mécanismes peuvent éventuellement être paramétrés par les compétences du personnage. Une autre amélioration possible concerne la difficulté des recettes. Dans une grille 3*3, un objet demandant un composant a une difficulté 9 (une chance sur 9 de le réussir si on place le composant au pif), un objet à 2 composants a une difficulté 8*9 = 72, etc. Bref, on n'a pas beaucoup de difficultés disponibles : seulement 9, 72, 504, 3024, 151205, 604820, 1814460 et 3628920. Mais on peut raffiner un peu ! Pour obtenir une difficulté D(O) pour un objet O, il suffit de ne pas simplement tester si le nombre C associé à la combinaison est égale à H (le hash), mais plutôt si : C = H mod D(O) Ainsi, on a une chance sur D(O) de trouver la bonne combinaison. Et c'est le développeur qui choisit D(O). Par exemple, pour une lance on peut décider qu'on a une chance sur D(LANCE) = 3 de faire une lance du premier coup en mélangeant un silex et un bâton. Mais pour une orbe de résurrection, on peut donner une difficulté plus élevée, par exemple 30. Précisions techniques Il reste un petit soucis, cependant : le démontage. Comment le serveur calcule-t-il une permutation C valide (c'est-à-dire vérifiant C = H mod D) ? Les fonctions de hashs n'étant pas inversibles (c'est le but) ce n'est pas possible instantanément. Cependant, le serveur connaît les numéros du joueur (J) et de l'objet (O), donc il peut tester toutes les combinaisons jusqu'à en trouver une qui marche. Ce qui veut dire qu'il doit tester en moyenne environ D combinaisons. Si on ne choisit pas des difficultés trop élevée, c'est raisonnable. A noter aussi qu'il y a une chance (très très faible) pour qu'il n'y ait aucune combinaison valide pour un J et un O donné. Cette chance diminue très largement si on diminue D. Raison de plus pour conserver D assez bas. Conclusion On a donc un système qui permet au joueur de découvrir des recettes par lui-même, en démontant les objets pour voir comment ils sont faits et/ou en essayant de les construire directement. Ca permet de renforcer le sentiment d'immersion, puisque le joueur a l'impression de pouvoir être à l'origine de nouvelles découvertes. Et pour éviter qu'un joueur puisse simplement trouver une liste de recettes sur internet, on utilise une fonction de hash cryptographique pour que chaque recette soit unique pour chaque joueur. |
![]() |
|
Aller à la page... |
Craft et cryptographie
Suivre Répondre |
|
Partager | Rechercher |
|
Au temps pour moi, j'avais compris qu'il était question du système d'assemblage proprement dit, merci de m'avoir éclairé !
![]() |
![]() |
|
Suivre Répondre |
Fil d'ariane
Connectés sur ce fil1 connecté (0 membre et 1 invité)
Afficher la liste détaillée des connectés
|