❤ 0 Améliorer les rencontres aléatoires sur RPG Maker (toutes versions)
Pour ceux qui seraient complètement perdus :
Par rencontre aléatoire, je désigne spécifiquement les monstres non visibles rencontrés sur la carte, selon l'ancien modèle utilisé sur les jeux SNES (Final Fantasy, Dragon Quest...). En sont exclus tous systèmes de rencontres avec le monstre visible sur la carte, que j'appellerai ici rencontre déterminée.
Pourquoi ?
Ce tutoriel a pour objectif d'améliorer le rythme de jeu en calibrant mieux la fréquence des combats selon le type de jeu. Il s'agit également de pallier ici à un des défauts de programmation de RPG Maker, qui utilise une formule de rencontre peu adaptée (la rencontre s'exécute selon un chiffre aléatoire entre un pas et le nombre de pas, ce qui résulte souvent en une rencontre tous les 1-5 pas).
A noter que ce tuto a été réalisé à l'aide de mon propre ressenti en jouant aux jeux du forum, ainsi que des formules que j'ai pu trouver, et ne représente donc en rien une vérité absolue, applicable sur tous les RPG.
1/ Quelques conseils théoriques pour mieux adapter son Gameplay au joueur
Avant de démarrer avec les données techniques, petit arrêt sur la façon d'envisager les combats pour son jeu. Pour cela, quelques questions s'imposent :
- Quelle difficulté pour mon jeu ?
Généralement, dans l'esprit d'un maker, combat difficile rime avec combat long. Que nenni ! Un combat long est juste long, surtout si il survient trop régulièrement. En faisant cela sur toute la durée du jeu, celui-ci va juste manquer de rythme, et donc paraître ennuyeux au joueur. Dans les faits, un combat de boss est long car il doit être marquant et le groupe a souvent sa stratégie propre, là où les monstres du dimanche doivent être courts, pour ne pas casser le rythme du jeu. Ainsi, avec des héros au niveau et avec les équipements adaptés, et sauf cas particuliers, un groupe adverse ne devrait pas prendre plus de deux tours à vaincre.
Ce critère dépend également de la vitesse d'un tour, et des possibilités en combat (défilement automatique, possibilité de répéter un tour, etc).
- Est-ce que je mets à disposition du joueur un mode de difficulté ?
Ce paramètre peut influer sur la fréquence des rencontres, et permet une expérience de jeu plus agréable pour un joueur occasionnel ou plus corsée pour un expérimenté.
- Est-ce qu'il existe un moyen de modifier la fréquence des rencontres ?
Certains jeux proposent des objets, équipements ou techniques qui suppriment ou diminuent/augmentent la fréquence des rencontres, et qui autorisent donc le développeur à être moins précis sur les taux de rencontres. C'est par exemple le cas avec le mode Discrétion dans Aëdemphia, ou pour partir sur un nom plus connu, les Repousses ou le talent Lumiattirance dans Pokémon.
- Est-ce que j'utilise un système de transport rapide ?
La téléportation ou les transports en commun permettent d'éviter les rencontres, ce qui permet de rendre les rencontres fréquentes plus supportables. De plus, les systèmes de téléportation se marient bien avec les quêtes annexes, surtout si celles-ci convient à revisiter d'anciens lieux. Dans ce cas, des rencontres fréquentes (au moins pour les lieux des quêtes) sont beaucoup plus acceptables car une fois la zone validée, le joueur n'aura finalement pas à la retraverser.
- Quelle est la vitesse de marche de mon héros ?
La question peut paraître assez stupide, mais elle se pose pour un logiciel comme XP, où la vitesse de base du héros est plus basse (couplée à l'absence de système natif de course). Les rencontres un peu plus fréquentes sont généralement mieux tolérées si la vitesse de marche du héros est considérée comme satisfaisante.
- Cette zone nécessite-t-elle des rencontres fréquentes ?
Toutes les zones d'un jeu ne se ressemblent pas. Il peut donc être bénéfique de jouer sur les fréquences de rencontres aux moments opportuns : rares sur des zones calmes (voyage sur la mappemonde ou dans une cave, lors d'une infiltration discrète...), fréquentes sur des zones dangeureuses (en pleine bataille ou en territoire ennemi, ou conditionnées par une action du joueur...).
- Est-ce que vos groupes sont intéressants pour le joueur ?
Cela ne touche pas directement le taux de rencontre, mais il sera beaucoup plus sympa pour le joueur de traverser une zone s'il se rend compte que les monstres peuvent lâcher des objets, que s'il ne s'agit que de coquilles vides. A titre d'exemple, Laxius Power 1 propose des rencontres aléatoires relativement fréquentes en partie parce que les monstres donnent régulièrement des objets. Cependant, pour des trésors, les groupes concernés sont moins fréquents, ce qui crée un mini objectif pour le joueur, parfois lié à des quêtes spécifiques.
Après avoir réfléchi sur le gameplay de son jeu, on peut donc aborder la partie pratique.
2/ Utiliser le système de rencontres de base de RM en événement
Il est possible de déclencher les rencontres sans créer un événement commun très long ou complexe. Pour cela, il vous suffit de configurer vos maps avec vos groupes de monstres comme d'habitude, à la différence que le taux de rencontre ("Set Encounter Rate") doit être mis à 0.
L'événement commun/événement prend ici le relais. La question est plus de savoir si vous préférez configurer vos rencontres par map (individuellement) ou de manière globale.
Dans les deux cas, il vous faudra créer un décompte de pas :
Je n'expliquerai pas le principe de fonctionnement ici, plusieurs tutoriels sur le sujet existant déjà (ici et ici).
Quelques points à ne pas oublier cependant :
- l'événement doit être en processus parallèle. La condition est recommandée, même si optionnelle (vous pouvez très bien la laisser tourner à vide). Elle permet notamment de supprimer les rencontres aléatoires dans des zones ou des monstres sont présents, par exemple lors de séquences scénaristiques.
- votre événement doit toujours remettre à 0 le nombre de pas avant la boucle, ou après le combat. Il est également recommandé de remettre ce compteur à 0 lors du passage d'une map de monstres à une zone pacifique, les taux de rencontres pouvant différer d'une zone à l'autre.
Les avantages de ce système, argumentés par Ephy :
Citation: C'est hyper pratique parce qu'en plus de permettre de gérer facilement les groupes de monstre rencontrés, ça laisse la possibilité de le gérer par zones (avec les zones de maps) ou par ID de terrain.
Et comme le nombre de pas nécessaire est géré en variable, on peut facilement le modifier si on utilise ou équipe un objet. |
3/ Changer les formules de rencontre de RM XP et suivants
L'événement commun a ceci de pratique qu'il est entièrement modulable. Cependant, pour RPG Maker XP et ses suiveurs, il est tout à fait possible de modifier la gestion des rencontres en modifiant le script approprié.
Comme pour toute implémentation de script, il est fortement conseillé de ne pas modifier le script de base mais d'en créer un nouveau, en appelant la méthode principale (Game_Player ou autre). Deux exemples sont données selon le langage du programme (RGSS1-2-3 et C#).
RPG Maker XP, VX et Ace
Voici déjà les formules en question, telles quelles dans les scripts de base :
Spoiler (cliquez pour afficher) XP : dans le script Game_Player, ligne 81
1
2
3
4
5
6
7
8
9
10
| #--------------------------------------------------------------------------
# * Make Encounter Count
#--------------------------------------------------------------------------
def make_encounter_count
# Image of two dice rolling
if $game_map.map_id != 0
n = $game_map.encounter_step
@encounter_count = rand(n) + rand(n) + 1
end
end |
VX : dans Game_Player, ligne 192
1
2
3
4
5
6
7
8
9
| #--------------------------------------------------------------------------
# * Make Encounter Count
#--------------------------------------------------------------------------
def make_encounter_count
if $game_map.map_id != 0
n = $game_map.encounter_step
@encounter_count = rand(n) + rand(n) + 1 # As if rolling 2 dice
end
end |
VX Ace : dans Game_Player, ligne 193
1
2
3
4
5
6
7
8
9
| class Game_Player < Game_Character
#--------------------------------------------------------------------------
# * Create Encounter Count
#--------------------------------------------------------------------------
def make_encounter_count
n = $game_map.encounter_step
@encounter_count = rand(n) + rand(n) + 1
end
end |
Pour ces trois versions de RPG Maker, les formules en RGSS sont assez proches, si on excepte l'emplacement dans Game_Party pour XP, et la suppression de la ligne "if $game_map.map_id != 0" pour VX Ace (qui vérifie que l'ID de la map est différent de 0).
Il existe plusieurs méthodes remplaçant la ligne @encounter_count = rand(n) + rand(n) + 1 qui permettent de modifier la manière dont est calculé le taux de rencontre.
1
| @encounter_count = rand(n) + rand(n) + 1 + $game_variables[x] |
Rajoute le montant de la variable à l'id x au taux de calcul, ce qui augmente de x pas le taux de rencontre.
1
| @encounter_count = [rand(n) + rand(n) + 1, $game_variables[x]].max |
La valeur de x est à changer par le nombre de pas minimum souhaité.
1
| @encounter_count = n + rand($game_variables[x]) + rand($game_variables[x]) - $game_variables[x] |
Une formule de variance : si le nombre de pas dans les propriétés est défini à 30 et que la variable x (variance) est de 10, le taux de rencontre sera entre 20 et 40 pas.
Un exemple de ce que ça donnerait en snippet (script autonome du core de base, à placer au-dessus de Main et en-dessous de Material si existant, recommandé) :
1
2
3
4
5
6
7
8
| class Game_Player
def make_encounter_count
if $game_map.map_id != 0 # pour XP et VX.
n = $game_map.encounter_step
@encounter_count = [rand(n) + rand(n) + 1, $game_variables[x]].max # la formule modifiée.
end #condition
end #méthode
end #classe |
RPG Maker MV et MZ
Les formules en question :
Spoiler (cliquez pour afficher) MV : dans le fichier rpg_objects rangé dans les plugins, ligne XXX :
1
2
3
4
| Game_Player.prototype.makeEncounterCount = function() {
var n = $gameMap.encounterStep();
this._encounterCount = Math.randomInt(n) + Math.randomInt(n) + 1;
}; |
La formule est la même que pour les précédents RM, seul le vocabulaire change.
MZ : toujours dans rpg_object :
1
2
3
4
| Game_Player.prototype.makeEncounterCount = function() {
const n = $gameMap.encounterStep();
this._encounterCount = Math.randomInt(n) + Math.randomInt(n) + 1;
}; |
Les formules sont là encore sensiblement les mêmes, si ce n'est que le terme var devient const.
Pour les deux premières formules qui suivent, il ne s'agit que de retranscriptions des formules précédentes, avec les termes pour MV (il suffit de remplacer var par const si vous êtes sur MZ).
Pour rajouter la valeur de la variable à l'id x au nombre de pas :
1
| this._encounterCount = Math.randomInt(n) + Math.randomInt(n) + 1 + $gameVariables.value(x) |
Pour avoir un nombre de pas minimum :
1
| this._encounterCount = Math.randomInt(n) + Math.randomInt(n) + 1, $gameVariables.value(x)].max |
La valeur de x est à changer par le nombre de pas minimum souhaité.
Pour modifier la variance (valeur de dispersion), la formule change un peu :
1
2
3
4
5
6
| Game_Player.prototype.makeEncounterCount = function() {
var n = $gameMap.encounterStep();
var s = Math.round(n * 0.2);
var r = Math.randomInt(s * 2);
this._encounterCount = n - s + r;
}; |
La partie à modifier est 0.2. La valeur doit se trouver entre 0 et 1 et renvoie à des pourcentages (0.2 = 20%). Plus elle est élevée, plus la variance l'est.
Exemple : pour un taux de rencontre à 30 pas, une variance à 0.5 (50%] signifie que la rencontre pourra s'effectuer entre 15 et 45 pas.
Il existe un ajout pour MV et MZ, qui rajoute 50% au résultat de nombre de pas :
1
2
3
4
5
6
7
8
9
10
| Game_Player.prototype.encounterProgressValue = function() {
let value = $gameMap.isBush(this.x, this.y) ? 2 : 1;
if ($gameParty.hasEncounterHalf()) {
value *= 0.5;
}
if (this.isInShip()) {
value *= 0.5;
}
return value;
}; |
Ce que ça donnerait en snippet (script autonome du core de base, recommandé) :
1
2
3
4
| Game_Player.prototype.makeEncounterCount = function() { // Appel de la classe Game_Player, suivie de la méthode makeEncounterCount à modifier
var n = $gameMap.encounterStep(); // var pour MV ; const pour MZ
this._encounterCount = [Math.randomInt(n) + Math.randomInt(n) + 1, $gameVariables.value(x)].max // la formule changée.
} |
Ecrit le 7 octobre 2020.
Sources :
- "Adjusting Random Encounter Rate", topic, RPG Maker Web, initié le 24 octobre 2013 [consulté le 14 août 2020], https://forums.rpgmakerweb.com/index.php?threads/adjusting-random-encounter-rate.19293/.
- "Encounter Rate Formula", topic, RPG Maker Web, initié le 6 novembre 2019 [consulté le 14 août 2020], https://forums.rpgmakerweb.com/index.php?threads/encounter-rate-formula.114936/.
- "Encounter Rating Steps", topic, RPG Maker Web, initié le 10 mai 2019 [consulté le 14 août 2020], https://forums.rpgmakerweb.com/index.php?threads/encounter-rating-steps.108844/
- JumbocactuarX27, "Variable Encounters and Random Encounter Formula", script, RPG Maker Web, initié le 8 novembre 2015 [consulté le 14 août 2020], https://forums.rpgmakerweb.com/index.php?threads/wigglelib-variable-encounters-random-encounter-formula.49773/
Liens utiles :
- Tiroflan, "Contrôle du nombre de pas en rencontres aléatoires", script, VX La Communauté, écrit le 14 août 2012 [consulté le 14 août 2020], https://www.rpgmakervx-fr.com/t12837-vx-vxace-controle-du-nombre-de-pas-en-rencontres-aleatoires.
|