❤ 0 Vous entendez dire Monos qu'il est impossible de configurer son système de combat aux petits oignons sous RPG Maker XP ? Vous vous dites que vos combattants ne touchent pas suffisamment ? Que la force n'influe pas autant que vous l'espériez ? Ce tutoriel est fait pour vous.
Pour commencer, ouvrez votre éditeur de script en appuyant sur F11 et sélectionnez le script Game_Battler_3.
Nous allons commencer par voir les attaques de base, puis les compétences.
Les attaques normales
Ligne 46, vous verrez ceci :
1
| hit_result = (rand(100) < attacker.hit) |
attacker.hit est lié au statut de l'attaquant. Sans statut particulier, la valeur sera égale à 100. S'il a un statut qui diminue ses chances de toucher (aveugle dans Final Fantasy), dans ce cas l'attacker.hit sera diminué.
Si vous voulez créer un statut qui diminue l'attacker.hit, dans ce cas, allez dans la partie Statut de la base de données et créer un statut qui change la Précision %.
Une valeur entre 0 et 99 est tirée. Si cette valeur est inférieure à l'attacker.hit, alors l'attaquant a réussi son premier jet.
Si l'attaquant réussit ce premier jet, il y a un deuxième jet pour savoir si l'adversaire esquive ou non.
Rendez-vous à la ligne 73. vous devriez voir ceci :
1
2
3
4
| eva = 8 * self.agi / attacker.dex + self.eva
hit = self.damage < 0 ? 100 : 100 - eva
hit = self.cant_evade? ? 100 : hit
hit_result = (rand(100) < hit) |
self.agi correpond à l'agilité du défenseur
attacker.dex à la dextérité de l'attaquant
self.eva correspond à l'esquive du défenseur (s'il a un statut qui augmente l'esquive, cf le champ texte esquive dans l'onglet statut de la base de données).
eva correspond aux chances d'esquive du défenseur.
Ses chances d'esquive correspondent à 8 multiplié par l'agilité du défenseur divisé par la dextérité de l'attaquant. A cela on ajoute l'esquive du défenseur.
Ensuite on tire un jet entre 0 et 99 et s'il est inférieur à 100 - les chances d'esquive du défenseur, alors ce dernier esquive !
Si vous voulez que les attaques touchent plus souvent, dans ce cas, je vous conseille de changer le 8 de la première ligne par 5.
Comme ci dessus, vous pouvez également modifier toute la formule si ça vous chante. A vous de voir !
Après ces deux jets, si l'attaquant a réussi à porter son coup, on va calculer les dégâts qu'il fait.
Rendez-vous à la ligne 50 du script :
1
2
| atk = [attacker.atk - self.pdef / 2, 0].max
self.damage = atk * (20 + attacker.str) / 20 |
attacker.atk correspond à l'attaque des armes de l'attaquant
self.pdef correspond à la défense de l'armure du défenseur
attacker.str correspond à la force de l'attaquant
Un premier jet est effectué sans prendre en compte la force.
Cette valeur d'attaque est égale à la valeur d'attaque de l'arme de l'attaquant auquel on retranche la valeur de défense de l'armure du défenseur divisée par deux.
Les dégâts effectifs seront égaux à la valeur d'attaque multpiliée par (20 + la force de l'attaquant) divisée par 20.
En gros si vous voulez que la force influe plus, je vous invite à changer le 20 ajouté à la force de l'attaquant ou rajouter un multiplicatif sur l'attacker.str.
Si vous voulez que les dégâts de l'arme influent plus, faites un multiplicatif sur l'attacker.atk
On va ensuite prendre en compte la réistance de la cible à l'élément lié à l'arme.
Quand vous configurez un héros ou un combattant, vous pouvez leur attribuer une lettre entre A et F qui vont le rendre plus ou moins vulnérable à un élément.
Rendez-vous ligne 53 :
1
2
| self.damage *= elements_correct(attacker.element_set)
self.damage /= 100 |
Le attacker.element_set correspond à l'élément auquel l'arme est liée (si vous en avez mis une).
Au final, on va avoir le calcul suivant :
A:200%, B:150%, C:100%, D:50%, E:0%, F:-100%
Donc en gros, si l'attaque devait faire 150 de dégâts, et que la cible a un résistance A à l'élément de l'arme, alors l'attaque va faire 150 * 200 / 100 = 300 de dégâts
En ligne 69/70 vous avez ceci :
1
2
| amp = [self.damage.abs * 15 / 100, 1].max
self.damage += rand(amp+1) + rand(amp+1) - amp |
Ceci permet de mettre de l'aléatoire dans vos dégâts.
Vous savez maintenant si l'attaquant a touché et combien de dégâts il a fait. On va maintenant voir s'il fait un coup critique ou non.
Rendez-vous à la ligne 58 du script :
1
2
3
4
| if rand(100) < 4 * attacker.dex / self.agi
self.damage *= 2
self.critical = true
end |
attacker.dex correspond à la dextérité de l'attaquant
self.agi correspond à l'agilité du défenseur
Cette section permet de calculer vos chances de coup critiques et les dégats que vous ferez.
En gros la formule est la suivante. On va tirer une valeur au hasard entre 0 et 99. Si la dextérité de l'attaquant multipliée par 4 et divisée par l'agilité du défenseur est supèrieur à la valeur, alors vous ferez double dégâts.
En d'autres termes, si la dextérité de l'attaquant est égale à l'agilité du défenseur, alors vous aurez 4% de chances de faire un coup critique.
Si vous voulez augmenter les chances de coup critique, soit vous modifiez la formule, soit simplement vous mettez plus que 4 dans le multiplicateur. VOus pouvez également augmenter les dégâts en cas de coup critique en modifiant le 2 après self.damage.
Enfin il est possible que le défenseur ait choisi de se défendre.
Rendez-vous ligne 63 :
1
2
3
| if self.guarding?
self.damage /= 2
end |
Si le défenseur se défend, les dégâts seront divisés par deux. A vous de modifier ce deux si vous voulez que le fait de se défendre influe plus ou moins sur les dégâts.
Compétences
Pour commencer, sachez qu'il n'y a aucun calcul de coup critique sur les compétences.
Dans la base de données, vous devriez voir les champs suivants pour une compétence :
- Taux d'effet
- Précision
- Variance
- Attaque
- Esquive
- Déf Physique
- Def Magique
- Force
- Dextérité
- Agilité
- Intelligence
Tous ces éléments auront un impact dans la formule finale.
On va commencer par vérifier que la compétence va bien toucher le défenseur. Quand on parle de défenseur, cela peut vouloir également dire la cible alliée pour les sorts positifs.
Rendez-vous ligne 119 :
1
2
3
4
5
| hit = skill.hit
if skill.atk_f > 0
hit *= user.hit / 100
end
hit_result = (rand(100) < hit) |
skill.hit correspond au champ Précision de la compétence.
skill.atk_f correspond au champ force de la compétence.
user.hit est lié au statut de l'attaquant. Sans statut particulier, la valeur sera égale à 100. S'il a un statut qui diminue ses chances de toucher (aveugle dans Final Fantasy), dans ce cas l'attacher.hit sera diminué.
Si vous voulez créer un statut qui diminue l'attacker hit, dans ce cas, allez dans la partie Statut de la base de données et créer un statut qui change la Précision %.
Une valeur entre 0 et 99 est tirée. Si cette valeur est inférieure à l'user.hit multipliée par skill.hit / 100, alors l'attaquant a réussi son premier jet.
Notez bien que l'user.hit n'intervient que si le champ Attaque de la compétence a une valeur supérieure à zéro ! Si ce n'est pas le cas, alors le jet sera simplement de savoir si la valeur entre 0 et 99 est inférieure à la Précision de la compétence
Si l'attaquant réussit ce premier jet, il y a un deuxième jet pour savoir si l'adversaire esquive ou non.
Rendez-vous ligne 158 :
1
2
3
4
| eva = 8 * self.agi / user.dex + self.eva
hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
hit = self.cant_evade? ? 100 : hit
hit_result = (rand(100) < hit) |
self.agi correpond à l'agilité du défenseur
user.dex à la dextérité de l'attaquant
self.eva correspond à l'esquive du défenseur (s'il a un statut qui augmente l'esquive, cf le champ texte esquive dans l'onglet statut de la base de données)
skill.eva_f correspond au champ esquive de la compétence.
eva correspond aux chances d'equive du défenseur.
Ses chances d'esquive correspondent à 8 multiplié par l'agilité du défenseur divisé par la dextérité de l'attaquant. A cela on ajoute l'esquive du défenseur.
Ensuite on tire un jet entre 0 et 99 et s'il est inférieur à 100 - (les chances d'esquive du défenseur * l'esquive de la compétence / 100), alors ce dernier esquive !
Après ces deux jets, si l'attaquant a réussi à lancer sa compétence et touche le défenseur, on va calculer les dégâts qu'il fait.
Rendez-vous ligne 128 :
1
2
3
4
5
6
| power = skill.power + user.atk * skill.atk_f / 100
if power > 0
power -= self.pdef * skill.pdef_f / 200
power -= self.mdef * skill.mdef_f / 200
power = [power, 0].max
end |
skill.power correspond au champ Taux d'effet de la compétence
user.atk correspond à l'attaque de l'arme de l'attaquant
skill.atk correspond au champ attaque de la compétence
self.pdef correspond à la défense physique de l'armure du défenseur
skill.pdef_f correspond au champ Déf Physique de la compétence
self.mdef correspond à la défense magique de l'armure du défenseur
skill.mdef_f correspond au champ Défense magique de la compétence
La puissance du sort sera donc égale à :
Taux d'effet + (attaque de l'arme de l'attaquant * attaque de la compétence / 100) - (défense physique du défenseur * défense physique de la compétence / 200) - (défenseur magique du défenseur * défense magique de la compétence / 200)
Les if power > 0 et power = [power, 0].max servent à ne pas soigner le défenseur si celui ci était amené à avoir une très grosse résistance qui vous donnerait une puissance négative.
Si vous ne voulez pas modifier la formule mais que vous trouver qu'un des éléments n'est pas assez pris en compte, je vous conseille de jouer sur les quotients 100 et 200.
Vous pouvez également voir que si vous mettez 0 dans les champs attaque et défense physique des compétences, ces derniers ne seront pas du tout pris en compte et la puissance du sort ne sera calculée qu'en fonction du taux d'effet et de la défense magique du défenseur.
Les dégâts seront calculés en fonction de cette puissance du sort et d'un autre calcul : l'effet du sort.
Rendez-vous ligne 135 :
1
2
3
4
5
| rate = 20
rate += (user.str * skill.str_f / 100)
rate += (user.dex * skill.dex_f / 100)
rate += (user.agi * skill.agi_f / 100)
rate += (user.int * skill.int_f / 100) |
user.Str correspond à la force de l'attaquant
skill.str_f correspond au champ force de la compétence
user.dex correspond à la dextérité de l'attaquant
skill.dex_f correspond au champ dextérité de la compétence
user.agi correspond à l'agilité de l'attaquant
skill.agi_f correspond au champ agilité de la compétence
user.int correspond à l'intelligence de l'attaquant
skill.int_f correspond au champ intelligence de la compétence
rate correspond à l'effet du sort.
On a donc la formule suivante :
effet du sort = 20 + (force attaquant * force du sort / 100) + (dextérité attaquant * dextérité du sort / 100) + (agilité attaquant * agilité du sort / 100) + (intelligence attaquant * intelligence du sort / 100)
Vous pouvez donc aisément changer les dégâts en jouant sur les dénominateurs 100 ou sur le 20. La puissance du sort et l'effet du sort vont ainsi déterminer les dégâts faits par la compétences.
Rendez-vous ligne 141 :
1
| self.damage = power * rate / 20 |
On a donc dégâts = puissance du sort * effet du sort / 20
On va ensuite prendre en compte la résistance de la cible à l'élément lié à la compétence.
Quand vous configurez un héros ou un combattant, vous pouvez leur attribuer une lettre entre A et F qui vont le rendre plus ou moins vulnérable à un élément.
Rendez-vous ligne 143 :
1
2
| self.damage *= elements_correct(skill.element_set)
self.damage /= 100 |
Le skill.element_set correspond à l'élément auquel la compétence est liée.
Au final, on va avoir le calcul suivant :
A:200%, B:150%, C:100%, D:50%, E:0%, F:-100%
Donc en gros, si le sort devait faire 150 de dégâts, et que la cible a un résistance A à l'élément de la compétence, alors le sort va faire 150 * 200 / 100 = 300 de dégâts
Il y a ensuite une part d'alétoire calculée en fonction de la variance du sort.
Rendez-vous ligne 153 :
1
2
3
4
| if skill.variance > 0 and self.damage.abs > 0
amp = [self.damage.abs * skill.variance / 100, 1].max
self.damage += rand(amp+1) + rand(amp+1) - amp
end |
L'amplification est calculée par la valeur absolue des dégâts * la variance du sort / 100
On va ensuite rajouter aux dégâts une valeure aléatoire entre 0 et l'amplification + une valeur aléatoire entre 0 et l'amplification - l'amplification.
Pour finir, si la cible est en train de se défendre, les dégâts seronts divisés par deux.
Rendez-vous ligne 148 :
1
2
3
| if self.guarding?
self.damage /= 2
end |
Pour accroître ou réduire l'efficacité de la défense, jouez sur ce 2.
Conclusion
Voilà, j'espère que vous n'avez pas trop mal à la tête. On verra les objets dans un prochain tutoriel ou alors en commentaire de ce tutoriel.
Amusez-vous bien à nous créer des CBS équilibrés qui prouveront à tata monos qu'il a tort quand il dit que le système de combat de base de RPG Maker XP est pourri et pas paramétrable.
Mis à jour le 8 novembre 2020.
|