Night.png);">
Apprendre


Vous êtes
nouveau sur
Oniromancie?

Visite guidée
du site


Découvrir
RPG Maker

RM 95
RM 2000/2003
RM XP
RM VX/VX Ace
RM MV/MZ

Apprendre
RPG Maker

Tutoriels
Guides
Making-of

Dans le
Forum

Section Entraide

Tutos: Checklist de la composition (...) / Sorties: Dread Mac Farlane - episode 8 / Sorties: Dread Mac Farlane - episode 7 / Jeux: Ce qui vit Dessous / News: Quoi de neuf sur Oniromancie (...) / Chat

Bienvenue
visiteur !




publicité RPG Maker!

Statistiques

Liste des
membres


Contact

Mentions légales

356 connectés actuellement

29371413 visiteurs
depuis l'ouverture

1007857 visiteurs
aujourd'hui



Barre de séparation

Partenaires

Indiexpo

Akademiya RPG Maker

Blog Alioune Fall

Fairy Tail Constellations

Guelnika & E-magination

RPG Maker Détente

Eclipso

Leo-Games

Tous nos partenaires

Devenir
partenaire



[RGSS] Modifier les formules de combat

Comprendre et modifier les formules de combats dans les scripts de base.

Ecrit par bodomdeneige le 03/11/2011


❤ 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 :

Portion de code : Tout sélectionner

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 :

Portion de code : Tout sélectionner

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 :

Portion de code : Tout sélectionner

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 :

Portion de code : Tout sélectionner

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 :

Portion de code : Tout sélectionner

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 :

Portion de code : Tout sélectionner

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 :

Portion de code : Tout sélectionner

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 :

Portion de code : Tout sélectionner

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 :

Portion de code : Tout sélectionner

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 :

Portion de code : Tout sélectionner

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 :

Portion de code : Tout sélectionner

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 :

Portion de code : Tout sélectionner

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 :

Portion de code : Tout sélectionner

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 :

Portion de code : Tout sélectionner

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 :

Portion de code : Tout sélectionner

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.





Tata Monos - posté le 03/11/2011 à 09:00:15 (28 messages postés)

❤ 0

Compte Non utilisé

Citation:

Vous entendez dire Monos qu'il est impossible dfe configurer son système de combat aux petits oignons sous rpg maker XP ?


Non mais oh ! :ange2
Sympa ce truc. Je vais me pencher sur ça. :D


Lelnard solune - posté le 03/11/2011 à 17:04:09 (22 messages postés)

❤ 0

Imaginer un jeu, c'est bien ... le finir, c'est mieux ...

Perso, j'ai juste survolé mais a se que j'en ai compris, on peut sans doute faire de bonne chose ... Mais franchement je vois pas en quoi XP a des problème d'équilibrage de combat... Bon a part quand on met une bonne force d'attaque a un boss et que quand il tire sa plus puissante attaque, il nous fait du 22 000 de dégat mais bon ...:doute2

Pour que votre rpg reste dans les mémoires = http://www.rpg-maker.fr/tutoriels-460-ce-qui-fait-quun-rpg-reste-emblematique-ou-pas-.html ; La réalité, c'est quand la gravité à raisons des gros boobs, le manga, c'est quand les gros boobs ont raisons de la gravité ...


harmfull01 - posté le 09/03/2013 à 16:36:09 (1 messages postés)

❤ 0

Salut j'aimerai modifier les dégâts aléatoire dans le script vers la ligne 69/70 , j'ai beau titiller les chiffres rien ne change ou presque pas , ce que j'aimerai c'est que les dégats varie de plus ou moins 50 % environ , pour 200 de dégats le minimum serait 50 et le max 300 par exemple .
:feu

Ne supprimez plus mon profil :'(

Suite à de nombreux abus, le post en invités a été désactivé. Veuillez vous inscrire si vous souhaitez participer à la conversation.

Haut de page

Merci de ne pas reproduire le contenu de ce site sans autorisation.
Contacter l'équipe - Mentions légales

Plan du site

Communauté: Accueil | Forum | Chat | Commentaires | News | Flash-news | Screen de la semaine | Sorties | Tests | Gaming-Live | Interviews | Galerie | OST | Blogs | Recherche
Apprendre: Visite guidée | RPG Maker 95 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker MV | Tutoriels | Guides | Making-of
Télécharger: Programmes | Scripts/Plugins | Ressources graphiques / sonores | Packs de ressources | Midis | Eléments séparés | Sprites
Jeux: Au hasard | Notre sélection | Sélection des membres | Tous les jeux | Jeux complets | Le cimetière | RPG Maker 95 | RPG Maker 2000 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker VX Ace | RPG Maker MV | Autres | Proposer
Ressources RPG Maker 2000/2003: Chipsets | Charsets | Panoramas | Backdrops | Facesets | Battle anims | Battle charsets | Monstres | Systems | Templates
Ressources RPG Maker XP: Tilesets | Autotiles | Characters | Battlers | Window skins | Icônes | Transitions | Fogs | Templates
Ressources RPG Maker VX: Tilesets | Charsets | Facesets | Systèmes
Ressources RPG Maker MV: Tilesets | Characters | Faces | Systèmes | Title | Battlebacks | Animations | SV/Ennemis
Archives: Palmarès | L'Annuaire | Livre d'or | Le Wiki | Divers