❤ 0 Formules de dégâts custom avec le patch Maniacs
Prérequis :
Ce tutoriel n'est valable que pour la version Steam de RPG Maker 2003.
Le patch Maniacs est OBLIGATOIRE pour suivre ce tutoriel.
Vous pouvez trouver plus d'informations sur le patch ici.
Veillez à avoir activé le menu de variables avancées dans Option -> Use new 'Control Variables' pour plus de facilité dans les calculs.
Introduction
Ce tutoriel permet d'utiliser des formules de dommages customs pour les compétences.
Par exemple, de base il est impossible de faire la compétence Addition de Steiner dans FF9, avec ce tuto si. Une autre possibilité est de créer une attaque qui fait 200% des dégâts d'une attaque normal. J'expliquerai comment faire ces deux possibilités, mais libre à vous d'imaginer d'autres sorts, ou de copier des sorts d'autres jeux.
Ce tuto est conçu en partant du principe que le héros est le lanceur de sort, mais il est tout à fait possible de légèrement modifier le système pour faire en sorte que les monstres disposent de la même capacité.
Petit détail à savoir, toute la gestion en cas de coup critique, et l'adaptation des dommages en cas de faiblesse / résistance ne sont pas prises en compte dans ce tutoriel. Il est sûrement possible de les rajouter, mais ce n'est pas au programme pour l'instant.
Préparation
Pour commencer, on va préparer le terrain pour nos événements communs. Rendez-vous dans la base de données, onglet Common Events. Voici les noms que je leurs ai donnés, et le déclencheur (Trigger) :
_ BattleSyst_Target, None ;
_ BattleSyst_SoustrDamage, None ;
_ BattleSyst_PhysicDamage, None ;
_ BattleSyst_Start, Begin Battle.
Et on peut aussi préparer dès maintenant les variables principales de notre système : par exemple je vais choisir la variable 81 pour UserType, ma variable 82 sera UserIndex, la 83 ActionType, la 84 pour ActionIndex, 85 pour TargetType, et 86 pour TargetIndex.
Explication des différentes variables :
Spoiler (cliquez pour afficher) UserType correspond à la catégorie du lanceur de sort. 0 pour les héros et 1 pour les monstres.
UserIndex correspond à l'index dans l'équipe / groupe de monstre
ActionType correspond au type d'action :
0 pour les compétences "normales" ( Attaque, Défense, Fuite ... )
1 pour les compétences de la BDD
2 pas sûr mais je pense que c'est pour la transformation
3 pour les items
ActionIndex index de la capacité utilisée, dépend de ActionType :
Si ActionType = 0 :
0 : Normal Attack
1 : Continuous Attack
2 : Defend
3 : Watch
4 : Charge
5 : Self-Destruct
6 : Escape
7 : Nothing
Si ActionType = 1 : l'ID du skill utilisé
Si ActionType = 2 : l'ID du mob après transformation ?
Si ActionType = 3 : l'ID de l'objet utilisé
TargetType comme pour UserType mais pour la cible.
TargetIndex comme pour UserIndex mais pour la cible.
Pour mon exemple, j'ai créé un sort Soustraction d'ID 134 et de cible Single Enemy. Le reste n'a que peu d'importance.
On veut donc que lorsque je lance le sort, les dommages de calculs soient différents de ceux de base.
Enfin, dans l'onglet Troops de la BDD, vérifiez que le premier groupe contienne bien 8 monstres, au moins le temps de la mise en place du tutoriel.
Evénement commun : BattleSyst_Start
Dedans, rajoutez la commande Control Battle (4ème page), et dans Proccessing choisissez Targeting.
Dans Callback Event ID, cochez la seconde case Constant et choisissez l'event nommé BattleSyst_Target.
Choisissez une variable pour le UserType.
Spoiler (cliquez pour afficher)
Evénement commun : BattleSyst_Target
Dans ce second event, on va détecter quand est lancé le sort Soustraction. On rajoute donc une condition ActionType == 1, suivie d'une condition ActionIndex == 134, et à l'intérieur de ces deux conditions un ShowText("AZE") :
1
2
3
4
5
| Condition Variable 83-ActionType == 1
Condition Variable 84-ActionIndex == 134 # ID du skill
Show Text ("AZE")
Fin
Fin |
En lançant un combat à ce stade, et en utilisant la compétence Soustraction vous verrez la boîte de dialogue s'ouvrir pour afficher "AZE". C'est donc un bon début, le système détecte bien qu'on lance Soustraction.
Maintenant il faut calculer les dommages. Remplacez la commande ShowText par Call Event (3ème page), qui appellera l'event commun BattleSyst_SoustrDamage.
Spoiler (cliquez pour afficher)
Evénement commun : BattleSyst_SoustrDamage
C'est dans ce troisième event qu'on va calculer les dommages de la compétence Soustraction.
Pour cela, rien de plus simple : nous allons récupérer les PV Max et PV actuels du héros lanceur de sort, et les retirer à sa cible.
Je choisis donc les variables 95 et 96 qui seront respectivement les PV Max et les PV du lanceur de sort, et la variable 97 pour le résultat de la soustraction.
Ce que ça donne dans Control Variable :
Même principe pour la variable 96-HP, en remplaçant ***'s Maximum HP, par ***'s HP.¦/spoiler]
Et on utilise la variable 97-DamageCalc pour calculer la différence :
Maintenant, il faut retirer cette valeur aux PV de l'ennemi. Problème, il n'existe pas de commande pour le faire. Enfin, si, mais elle n'est pas accessible depuis les événements communs.
Direction donc l'onglet Troops de la BDD, dans la partie Battle Events rajoutez une commande Change Enemy HP. Laissez les arguments comme ça, puisqu'on va se contenter de couper coller la commande dans notre event commun.
Et voilà ! On peut maintenant changer les PV des ennemis depuis l'onglet Common Events ! (Cette astuce peut être reproduite pour toute les autres commandes exclusives à l'onglet Troops de la BDD.)
On va pouvoir commencer à modifier la commande Change Enemy HP.
Premièrement, cochez Decrease Variable, et Allow Knockout.
Dans la case Variable sélectionnez la variable 97-DamageCalc :
Problème, on ne peut pas choisir la cible par une variable.
On va donc rajouter une condition qui englobe la commande Change Enemy HP :
Condition : Variable 86-TargetIndex == 0
Puis copier coller la condition en changeant l'index dans la condition, et dans la commande de PV :
Si vous ne pouvez pas aller jusqu'au 8ème ennemi, rajoutez des ennemis dans le premier groupe de monstre le temps de faire la manip. Vous pouvez les enlever après.
Voilà, déjà si vous lancez un test, vous vous rendrez compte que lorsque vous lancez Soustraction, l'ennemi ciblé perd un nombre de PV égal à la différence entre les PV Max et les PV du lanceur.
Petit problème, un "MISS" apparaît quelques secondes après que les dégâts soient pris.
Cela s'explique facilement, le MISS vient du fait que la compétence soustraction ne fait aucun dommage de base, il affiche donc qu'elle échoue.
Il existe plusieurs méthodes pour empêcher le miss de popper :
- Faire que les dommages soient légèrement retardés pour s'afficher en même temps que le MISS, ce qui aura pour effet de le faire disparaître.
- Ajouter un statut "vide" qui sera infligé par la compétence.
L'avantage d'utiliser un statut, c'est de pouvoir faire des compétences n'infligeant pas de dégat.
Celle d'utiliser le délayage, c'est d'avoir un rendu plus proche du rendu de base. En effet, avec les statut les dommages popent légèrement plus tôt qu'un skill normal.
Pour la suite du tuto, je vais montrer les deux solutions, à vous de choisir laquelle vous voulez (les deux ont leurs avantages et défauts).
Option 1 : Statut NoDMG
Pour cette version, on va utiliser un statut vide que l'on nommera NoDMG, qui disparaitra à 100% de chance après 1 action, avec un Rating de 1, à un State Rate à 100% sur toutes les lettres, et qui montre l'animation de combat 1 :
La compétence 134 Soustraction doit infliger ce statut :
Relancez le test, et cette fois, le MISS n'apparaîtra pas. Par contre, le statut reste un tour après celui-là. Donc si vous reciblez le même ennemi, le jeu va vous dire qu'il est sous le status NoDMG.
Pour empêcher ça, il suffit de créer un nouvel event commun appelé BattleSyst_Update, avec un Trigger : Parrallel (Battle) et avec la même méthode que pour la commande Change Enemy HP, on va copier la commande Change Enemy State, la coller 8 fois dans BattleSyst_Update en changeant l'ID à chaque fois pour bien correspondre.
Problème, s'il y a moins de 8 ennemis, le jeu plante. Pour régler ça, on va rajouter une variable 98-EnemyMax, et utiliser Get Battle Info pour récuperer le nombre max d'ennemis :
Et après il faut entourer chaque commande Change Enemy State par une condition pour vérifier qu'il y ait bien assez de monstres :
Pour éviter le lag, vous pouvez rajouter une petit Wait(1) à la fin de cet event.
Voilà pour la première version.
Option 2 : Retarder les dommages
Pour cette version, on va simplement se contenter de décaler le calcul des dommages pour les faire quand le pop-up devrait apparaître, et ainsi le remplacer.
Petit problème, la fonction Wait(x) ne fonctionne pas directement dans ce cas, l'event ne reprend jamais après avoir attendu (Sûrement dû à un bug, mais bon, c'est peut être voulu dans le fonctionnement de RM).
Pour remédier à cela, on va créer un nouvel event commun appelé BattleSyst_Update, avec un Trigger : Parrallel ( Battle ). Dedans, on va juste mettre une condition Variable 97-DamageCalc >= 1, suivie d'un Wait(9) (à vous de voir sur le temps à mettre ça dépend de l'animation jouée), et de l'ensemble des conditions et Change Enemy HP qui sont à déplacer dans cet event.
Les deux events doivent donc ressembler à ça :
Dans l'event BattleSyst_Update, il faut absolument remettre la variable 97-DamageCalc = 0 juste avant le dernier Branch End, sinon les dommages se feront en boucle.
Et voilà pour la deuxième solution.
Comme dit plus haut, les deux solutions sont viables, et même combinables, selon le moment où vous voulez faire apparaître les dommages.
Evénement commun : BattleSyst_PhysicDamage
Dans cette dernière partie, on va voir comment faire un sort qui tape à 200% d'une attaque normale.
Pour l'exemple, je me servirai de la compétence Soustraction déjà faite, mais bien entendu, à vous de voir selon l'ID de votre compétence !
Pour cela, rendez-vous dans l'event BattleSyst_PhysicDamage , et rajoutez une nouvelle commande Control Variable pour récupérer la force (ATK) du lanceur :
(Je me ressers des variables 95 et 96, mais libre à vous d'utiliser de nouvelles variables)
Ainsi qu'une seconde pour la défense (DEF) de la cible :
La formule de base pour un coup est Lanceur.Atk/2 - Cible.Def/4, on va donc assigner cette opération à notre variable 97-DamageCalc :
A ce niveau, on a une compétence qui tape aussi fort que l'attaque normale. Pour rajouter des dommages, on va multiplier la variable 97-DamageCalc par une nouvelle variable 94-%Damage+, puis diviser par 100. Cette variable 94-%Damage+ va servir à savoir le pourcentage de frappe de la compétence.
Maintenant, on va rajouter un peu d'aléatoire, on va multiplier notre variable 97-DamageCalc par une valeur aléatoire entre 80 et 120 (histoire d'avoir +- 20% de dégât. Ce qui est sensé être la formule de base), puis la diviser par 100.
Voilà à quoi doit ressembler notre event :
Pour faire en sorte que l'attaque à 200% prenne en compte le fait que l'ennemi est en défense, il suffit de rajouter ces commandes à la fin de l'event BattleSyst_PhysicDamage :
Suivi de :
1
2
3
| Condition Variable 74-Defending >= 1
Variable 97-DamageCalc /= 4
Fin |
Au final ça doit ressembler à ça :
Pour prendre en compte si un ennemi est caché ou pas :
Avec la commande GetBattleInfo (exactement la même que celle que j'ai mise un tout petit peu au-dessus), et en englobant tout l'event BattleSyst_PhysicDamage et BattleSyst_SoustrDamage par la condition :
1
| Condition Variable 76-Encounted >= 1 |
Même si en vrai, dans l'état actuel du patch, les ennemis cachés foutent le dawa (la commande pour récupérer le nombre d'ennemis ne marche pas si le premier ennemi est caché).
Maintenant, dernière étape de cette partie, dans BattleSyst_Target, il faut rajouter :
1
2
3
4
5
6
| Condition Variable 83-ActionType == 1
Condition Variable 84-ActionIndex == 134 # ID du skill
Variable 94-%Damage+ = 200
Call Event : [BattleSyst_PhysicDamage]
Fin
Fin |
Conclusion
Et voilà la fin de ce tuto, maintenant vous savez comment faire des compétences particulières.
Voici d'autres exemples de compétences possibles grâce à ce système :
- Attaque qui multi hit (compatible seulement avec le système de délayage du pop des dommages), il suffit de calculer les dommages plusieurs fois et de les soustraire plusieurs fois.
- Attaque qui dépend de l'argent sur soi
- Attaque qui dépend du niveau
- Attaque qui dépend du nombre d'objets dans l'inventaire
- Attaque qui tape à 50% tous les ennemis sauf l'ennemi ciblé qui prend 100%
- Attaque qui tape tout le monde, alliés comme ennemis
Tous les exemples que j'ai mis sont pour des compétences avec dommages, mais en utilisant la base du système, on peut aussi détecter sur quel ennemi un sort Scan est lancé, et afficher ses PV et autres infos.
Voilà voilà, j'espère que ce tuto vous servira !
Ecrit le 25 mai 2020.
|