@Poison_xtreamlua : Merci pour le lien ;-)
Cela pourra sans doute me servir dans le cadre d'un actuel projet de jeu (petit) qui pourrait s'apparenter à un RPG au tour par tour.
Si cela peut t'aider, voici plus ou moins la démarche, encore non validée ^^, que j'ai adopté pour mon levelling.
1. Choix du système de levelling
La première chose fut de savoir si je voulais faire un système de levelling global, chaque nouveau level faisant progresser globalement toutes les compétences de mes persos, ou bien un "levelling by doing", ce que j'ai choisi, où chaque compétence ne s'améliorant que si elle est utilisée. Chaque compétence a un compteur d'XP qui lui est propre, ainsi que des franchissements de levels qui lui sont propres. Une compétence C1 peut être par exemple au level 5 tandis qu'une autre compétence C2 peut être restée au level 1. Pour les attributs non levellables par l'action, typiquement les HP, le levelling se fera en additionnant l'XP de chaque compétence levellable (eg. dans le cas précédent, C1 et C2). C'est ce que j'appellerai par la suite l'expérience globale.
A noter que je ne suis pas un expert, donc il doit il y avoir sans doute d'autres variantes, mais je pense que c'est grosso modo les deux principales approches.
2. Courbe d'expérience globale
Il a fallu ensuite que je définisse la courbe d'expérience globale. Ca n'a pas l'air aussi compliqué que cela n'y paraît.
En faisant des recherches, je suis tombé sur l'approche indiquée ici : http://gamedev.stackexchange.com/que...p-requirements
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #include <cmath>
#include <iostream>
int main(void)
{
int levels = 20;
int xp_for_first_level = 60;
int xp_for_last_level = 10000;
double B = log((double)xp_for_last_level / xp_for_first_level) / (levels - 1);
double A = (double)xp_for_first_level / (exp(B) - 1.0);
for (int i = 1; i <= levels; i++)
{
int old_xp = round(A * exp(B * (i - 1)));
int new_xp = round(A * exp(B * i));
std::cout << i << " " << (new_xp - old_xp) << std::endl;
}
} |
C'est ce qui m'a semblé à la fois simple et pertinent sans rentrer dans des considérations trop "fine tuning". Comme j'avais la flemme d'installer un compilo C++, ça fait un bail que je n'y ai plus touché, j'ai utilisé un compilateur en ligne : http://www.compileonline.com/compile_cpp_online.php
Ce qu'il faut pour faire tourner l'algo, c'est surtout définir le nombre de levels, l'XP à accumuler pour le premier level et l'XP à accumuler pour le dernier level.
A mon avis, je pense que les valeurs de ces trois paramètres sont assez arbitraires et sans véritable importance. Cela sert surtout à fixer un cadre.
Il va sans dire que plus l'échelle est large (autrement dit plus la différence entre l'XP du 1er level et l'XP du dernier level est grande) et plus l'échelle est fine (autrement dit plus le nombre de levels est important), et plus on peut jouer sur des détails, mais bon, c'est avant tout une question de goût à mon avis.
Dans le cadre de mon projet de jeu, j'ai fixé le nombre de levels à 20, l'XP pour le level 1 à 60, et l'XP pour le level 20 à 10.000.
J'ai donc les relations suivantes :
(2.1) Levels = 20
(2.2) Level 1 = 60 XP
(2.3) Level 20 = 10000 XP
3. Rôles des combats
Dans mon jeu, à priori seuls les combats permettront de gagner de l'XP. A partir de ce postulat, j'ai défini qu'il serait nécessaire de réaliser environ 5 combats pour que mon personnage atteigne le premier level.
J'ai donc posé la relation : (3.1) Level 1 = 5 Combats
D'après la relation (2.2), j'ai : (3.2) Combat = 12 XP = 60 XP / 5 Combats
Comme de plus, j'ai adopté un système de levelling by doing, j'ai du estimé une proportion possible d'utilisation de chaque compétence. Pour simplifier mon discours, je dirai que mon perso a deux compétences, C1 et C2.
J'ai estimé que la compétence C1 pourrait être utilisée 75% du temps pendant un combat.
Tandis que la compétence C2 pourrait être utilisée 50% du temps pendant un combat.
Là, certains remarqueront que 75% + 50% > 100%, mais je me place pour chacune de ces compétences, dans la situation où un joueur voudrait maximiser l'une des compétences. Pour la compétence C1, les contraintes du jeu font qu'il ne pourrait pas l'utiliser au delà de 75% sous peine d'adopter une stratégie perdante et donc de mourir pendant un combat. Idem pour la compétence C2, un joueur qui voudrait maximiser celle-ci ne pourrait pas l'utiliser plus de 50% du temps sous peine de devoir recommencer une nouvelle partie.
Je pose donc les relations de "probabilité" p(C1) et p(C2) :
(3.3) p(C1) = 75%
(3.4) p(C2) = 50%
D'après la relation (3.2), j'obtiens une XP possible par combat pour C1 et C2 :
(3.5) C1 = 9 XP / Combat = 75% * 12 XP
(3.6) C2 = 6 XP / Combat = 50% * 12 XP
Tout ceci me permet de déduire l'XP à accumuler pour C1 (resp. C2) afin d'atteindre le level 1 :
(3.7) Level 1 (C1) = 45 XP = 9 XP * 5 Combats
(3.8) Level 1 (C2) = 30 XP = 6 XP * 5 Combats
4. Courbes d'expérience spécifiques
D'après le paragraphe précédent, j'ai obtenu l'XP nécessaire pour atteindre le level 1 concernant les compétences C1 et C2. Il me faut maintenant l'XP pour atteindre le dernier niveau, à savoir le level 20.
J'utilise pour cela la basique règle de trois ce qui me donne :
(4.1) Level 20 (C1) = 7500 XP = 10000 XP * 75%
(4.2) Level 20 (C2) = 5000 XP = 10000 XP * 50%
Ensuite, en reprenant l'algo décrit dans le paragraphe (2), en conservant le nombre total de levels, mais en modifiant les XP du level 1 et du level 20 comme décrit précédemment, j'obtiens ainsi les courbes d'expérience de C1 et C2 qui régiront le franchissement des levels pour ces deux compétences.
5. Calibrer la puissance des attaques
On entre dans la partie qui me semble la plus difficile à formaliser : comment calibrer la puissance des attaques ?
Je me suis pour ma part contenté de garder à l'esprit le nombre de tours par combat que je souhaitais, 5 tours au début, puis crescendo de façon à ce que les gains en XP espérés collent avec les courbes d'expérience.
Toujours en fonction de la durée moyenne des combats, j'essaierai d'ajuster en parallèle la puissance des attaques les plus puissantes de mon perso en regard de la puissance des ennemis qu'il sera amené à rencontrer.
Si j'ai d'autres idées au fil de mon projet, j'essaierai de les poster
Sur ce, bon courage !
Partager