Connexion automatique

Pas encore membre ? Inscrivez-vous ici !
Vous avez oublié votre mot de passe ? On vous aide ici

AccueilPage d'accueilFAQRechercherS'enregistrerConnexion

Sélecteur de thème :


Partagez | .
Formules de dégats

Hermoni
Garde du Trésor

Garde du Trésor
avatar

Nombre de messages : 845
Localisation : Quelque part entre la cuisine et le clavier.
Capacités : bon
Distinction : aucune
Date d'inscription : 07/09/2015

MessageSujet: Formules de dégats   Dim 20 Aoû 2017 - 9:11

Note : Le post d'origine est ici : Post originel
Je n'en ai fait que la traduction en français en premier lieu (pas littérale, j'ai adapté à une compréhension en français et rajouté quelques notes), en second lieu je propose quelques formules qui pourrait en intéresser quelques uns.
Si vous avez des idées de formules ou des remarques à faire, n'hésitez pas.


Formules de dégâts RPG Maker MV

Vous vous demandez probablement comment faire qu'une compétence fasse plus de dégâts contre des ennemis avec un statut particulier, ou soigner plus si un joueur a un statut ou faire exactement la moitié des points de vie de l'ennemi en dégât (type Demi des FF).
Et bien tout ça peut être fait avec les formules de dégâts personnalisées.




Les bases :

Type - Ce que touchera la formule (HP ou MP), et comment (Dégats, Récup, Drain).
Aucun - Rien, la formule ne fera ni heal, ni dégât.
HP Dommages - Les HP seront endommagés.
MP Dommages - Les MP seront endommagés.
Récupération HP - Les HP seront restaurés.
Récupération MP - Les MP seront restaurés.
HP Drain - Endommage les HP ennemis et restaure autant de point en HP à l'attaquant.
MP Drain - Endommage les MP ennemis et restaure autant de point en MP à l'attaquant.

Note pour les drains : Les HP ou MP restaurés sont plafonnés par ceux de l'adversaire. Si votre attaque fait 200 de dégâts, mais que l'adversaire n'en a plus que 150, les dégâts et les HP récupérés seront de 150.
Cette limitation peut être contournée autrement (voir 2eme partie du post).

Elément - L'élément utilisé par la formule. Attaque normale - signifie que l'élément sera le même que l'arme utilisée.

Variance - Comment fluctue les dégats. Exemple : Si la formule dit que la compétence fera 100 de dégâts et que la variance est de 20%, les dégâts effectifs seront entre 80 et 120.

Critique - Règle si la compétence peut être critique ou non. Un coup critique fera 300% des dégâts.

Et maintenant la partie fun - les formules !
Ca décide de combien l'ennemi sera endommagé ou l'allié soigné. Ou bien l'ennemi soigné si vous avez envie d'une compétence qui soigne l'ennemi mais ça, ça vous regarde, la cible n'étant pas définie dans cette partie.

Analysons une compétence basique dans RPG Maker MV - Feu
100 + a.mat * 2 - b.mdf * 2

Que signifient a et b ?
a - l'attaquant
b - le défenseur
Donc, si l'acteur Marsha lance le sort Feu sur un Slime. a c'est Marsha et b le Slime.

La formule donne donc qu'on prend le double de l'attaque magique de Marsha (a.mat*2), on y soustrait le double de la défense magique du Slime (b.mdf*2) et on y ajoute 100 (la base du dégât).
Exemple : Marsha a 100 mat, et le Slime 20 mdf. Si on prend la formule cela donne : 100 + 100*2 - 20*2.
Après calcul, le dégât que fera cette compétence sera de 260, sans variance.
Avec une variance de 10%, les dégâts seraient entre 234 et 286.

Seul le dernier nombre de la formule fera du dégât (ou du soin). Si vous avez plusieurs lignes dans la formule. (le point-virgule ; indique la fin d'une ligne)
Exemple : a.atk; a.atk*2
Seul a.atk*2 sera utilisé pour le calcul des dégâts.

Y a t-il d'autres lettre que a et b pour la formule ?
Oui. Il y a les variables. Elles sont utilisés comme ceci : v[ID]
ID - index de la variable.
Donc vous pouvez avoir une compétence qui devient plus forte en fonction de la valeur d'une variable.

Exemple : v[10] * 2 - b.def * 3

Peut-on rendre une formule encore plus complexe, exemple si une variable est au delà de 100, faire des dégâts bonus ?
Oui, dans ce cas nous utilisons une instruction conditionnelle "if else" (en français le fameux "si alors sinon" qu'on nous rabâche en cours d'algo)
A quoi ça ressemble :

Code :
if (condition)
{
formule1;
}
else
{
formule2;
}

Mais comment on l'écrit dans la formule ?
Il n'y a qu'une seule ligne !
Il faut juste écrire tout ensemble~

if (condition) { formule1; } else { formule2; }
Exemple:

if (v[10] > 100) { a.atk*4 - b.def*2 } else { a.atk*2 - b.def*2 }

Ce qui peut être écrit de manière plus courte si vous utilisez qu'une ligne de formule.

if (condition)
formule1;
else
formule2;
Exemple :

if (v[10] > 100) a.atk*4 - b.def*2; else a.atk*2 - b.def*2;

Et ça peut être encore plus raccourci ::

condition? formule1 : formule2;
Exemple :

v[10] > 100 ? a.atk*4 - b.def*2 : a.atk*2 - b.def*2;

Symboles mathématiques :

> supérieur à
< inférieur à
>= supérieur ou égal à
<= inférieur ou égal à
=== égal à
&& et (and)
|| ou (or)
!== différent
! n'est pas (not)

Exemples:

v[10] > 100 ? 1000 : 100; (Si la variable 10 est supérieure à 100, 1000 dégâts seront fait, sinon seulement 100 dégâts)
v[10] < 100 ? 1000 : 100; (Si la variable 10 est inférieure à 100, 1000 dégâts seront fait, sinon seulement 100 dégâts)
v[10] >== 100 ? 1000 : 100; (Si la variable 10 est supérieur ou égale à 100, 1000 dégâts seront fait, sinon seulement 100 dégâts)
v[10] <== 100 ? 1000 : 100; (Si la variable 10 est  inférieure ou égale à 100, 1000 dégâts seront fait, sinon seulement 100 dégâts)
v[10] === 100 ? 1000: 100; (Si la variable 10 est égale à 100, 1000 dégâts seront fait, sinon seulement 100 dégâts)
v[10] > 50 && v[11] >== 25 ? 1000 : 100; (Si la variable 10 est supérieure à 50 ET la variable 11 est supérieure à 25, 1000 dégâts seront fait, sinon seulement 100 dégâts)
v[10] > 50 || v[11] > 50 ? 1000 : 100; (Si la variable 10 est supérieure à 50 OU la variable 11 est supérieure à 50, 1000 dégâts seront fait, sinon seulement 100 dégâts)
v[10] !== 100 ? 1000 : 100; (Si la variable 10 est différente de 100, 1000 dégâts seront fait, sinon seulement 100 dégâts)

Quels paramètres sont utilisables pour a et b?

Voici une liste de paramètres utilisables :

Actuels: (Nombres entiers, exemple : 900, 999, 11)

level - le niveau actuel de l'acteur (Seulement pour les acteurs)
hp - les HP actuels
mp - les MP actuels
tp - les TP actuels

Paramètres: (Nombres entiers, exemple : 1337, 7331, 156)

mhp - HP max
mmp - MP max
atk - attaque
def - défense
mat - attaque magique
mdf - défense magique
agi - agilité
luk - chance

Ex-Paramètres: (Nombres décimaux servant de pourcentages, exemple. 1.0, 0.5, 0.75, 2.44 correspondent à 100%, 50%, 75%, 244%)

hit - Taux de toucher
eva - Taux d'évasion
cri - Taux de critique
cev - Taux d'évasion critique
mev - Taux d'évasionmagique
mrf - Taux de réflexion magique
cnt - Taux de contre-attaque
hrg - Taux de régénération de HP
mrg - Taux de régénération de MP
trg - Taux de régénération de TP

Sp-Paramètres: (Nombres décimaux servant de pourcentages, exemple. 1.0, 0.5, 0.75, 2.44 correspondent à 100%, 50%, 75%, 244%)

tgr - Taux cible
grd - Taux d'effet de garde
rec - Taux d'effet de récupération
pha - Pharmacologie
mcr - Taux de coût en MP
tcr - Taux de charge de TP
pdr - Taux de dégâts physiques
mdr - Taux de dégâts magiques
fdr - Taux de dégât de sol
exr - Taux d'expérience

Comment modifier les HP/MP/TP?

gainHp(X) - restaure "X" HP
gainMp(X) - restaure "X" MP
gainTp(X) - restaure "X" TP

setHp(X) - change les HP à X
setMp(X) - change les MP à X
setTp(X) - change les TP à X

clearTp() - change les TP à 0

Exemples:
a.setHp(a.mhp) - Change les HP de l'attaquant en ses HP max
a.setHp(a.hp + 100) - Change les HP de l'attaquant à ses HP actuels + 100

Et qu'en est-il des modifications de formule en fonction des statuts ?

On a tout ça :

isStateAffected(stateId) - vérifie si le combattant est affecté par l'état
Exemple : b.isStateAffected(10) ? 10000 : 1;

isDeathStateAffected() - vérifie si le combattant est affecté par l'état de mort
Exemple : b.isDeathStateAffected() ? 10000 : 1;

resetStateCounts(stateId) - réinitialise les compteurs de l'état (s'il dure 10 tours de base et que ça fait 6 tours qu'il était actif, il passe de 4 tours restant à 10)
if (b.isStateAffected(10)) b.resetStateCounts(10); 100

updateStateTurns() - fait passer un tour à tous les compteurs d'état du combattant
b.updateStateTurns(); 100

addState(stateId) - ajoute l'état au combattant
if (!b.isStateAffected(10)) b.addState(10); 100

isStateAddable(stateId) - vérifie si l'état peut être ajouté au combattant
c=100; if (b.isStateAddable(10)) b.addState(10); else c=4000; c

removeState(stateId) - retire l'état du combattant
if (a.isStateAffected(10)) a.removeState(10); 0



Et pour les buffs et debuff ? Peut-on buff ou debuff un combattant

Oui !
addBuff(paramId, turns) - ajoute le buff d'un paramètre au combattant
a.addBuff(0, 3); b.def*10

addDebuff(paramId, turns) - ajoute le debuff d'un paramètre au combattant
b.addDebuff(2, 10); 9999

removeBuff(paramId) - retire un buff ou debuff d'un combattant
removeAllBuffs() - retire tous les buff et debuff d'un combattant

Index des paramètres (paramId)

0 - HP max
1 - MP max
2 - Attaque
3 - Defense
4 - Attaque magique
5 - Défense magique
6 - Agilité
7 - Chance

Autres actions sur les combattants

die() - tue le combattant
b.die(); 0

revive() - fait revivre le combattant
a.revive(); 1000

paramBase(paramId) - obtient la base du paramètre
a.paramBase(3)*10 - b.def*2

paramPlus(paramId) - obtient le bonus au paramètre
a.paramPlus(3)*2 - b.def*2

paramMax(paramId) - obtient le lax du paramètre
b.paramMax(0)

elementRate(elementId) - vérifie le taux d'élément du combattant (nombre décimal représentant un pourcentage)
b.elementRate(10) >== 0.5 ? 10000 : a.mat*4;

isStateResist(stateId) - vérifie si le combattant résiste à l'état
c=0; b.isStateResist(10) ? c+=2000 : b.addState(10); c

isSkillTypeSealed(stypeId) - vérifie si le type de compétence du combattant est verrouillée
isSkillSealed(skillId) - vérifie si la compétence du combattant est verrouillée
isEquipTypeSealed(etypeId) -vérifie si le type d'équipement du combattant est verrouillé
isDualWield() - vérifie si le combattant est ambidextre
isGuard() - vérifie si le combattant est en garde
recoverAll() - retires tous les états, remet tous les HP et MP

hpRate() - vérifie le taux de HP du combattant
mpRate() - vérifie le taux de MP du combattant
tpRate() - vérifie le taux de TP du combattant
b.hpRate() < 0.5 ? b.hp-1 : 100;

isActor() - vérifie si le combattant est un acteur
isEnemy() - vérifie si le combattant est un ennemi
escape() - fuit le combat
b.escape() - fait fuir l'ennemi

consumeItem(item) - consomme un objet
a.consumeItem($dataItems[15]); 100



Pour les acteurs uniquement :

currentExp() - L'Exp actuelle
currentLevelExp() - L'Exp actuelle du niveau
nextLevelExp() - L'Exp pour le prochain niveau
nextRequiredExp() - L'Exp manquante pour le prochain niveau
maxLevel() - Niveau max de l'acteur
isMaxlevel() - Vérifie si l'acteur est au niveau max (renvoi true/false)
hasWeapon() - Vérifie si l'acteur tient une arme (renvoi true/false)
hasArmor() - Vérifie si l'acteur porte une pièce d'armure (renvoi true/false)
clearEquipments() - Retire tout l'équipement de l'acteur
isClass(gameClass) - Vérifie la classe de l'acteur (gameClass - $dataClasses[ID])
hasNoWeapons() - Vérifie si l'acteur a aucune arme (renvoi true/false)
levelUp() - Monte le niveau de l'acteur
levelDown() - Baisse le niveau de l'acteur
gainExp(exp) - Donne de l'expérience à l'acteur
learnSkill(skillId) - Enseigne une compétence à l'acteur
forgetSkill(skillId) - Fait oublier une compétence à l'acteur
isLearnedSkill(skillId) - Vérifie si la compétence est connue de l'acteur
actorId() - Retourne l'index de l'acteur


Pour les ennemis uniquement :
enemyId() - Retourne l'index de l'ennemi

A propos des "Math"? Peut-on utiliser des formules mathématiques ?

Biensur.

Math.random() - Retourne un nombre aléatoire entre 0 et 1 (0 <= n < 1)
Math.min(numbers) - Retourne le nombre minimum dans la liste
Exemple : Math.min(10, 50, 40, 200) - Retourne 10

Math.max(numbers) - Retourne le nombre maximum de la liste
E.g. Math.max(10, 50, 40, 200) - Retourne 200

Math.round(number) -Arrondit à l'entier le plus proche
Math.ceil(number) - Arrondit à l'entier supérieur
Math.floor(number) - Arrondit à l'entier inférieur

Math.rand() retourne un nombre entre 0 et 1, mais pouvons nous obtenir un nombre entre 1 et 100 ? Ou 5 et 200 ?

Pas de problème :

Math.floor(Math.random()*100)+1
Ca retournera un nombre entre 1 et 100. Si on ajoutait pas 1 à la fin ça nous retournerait un nombre entre 0 et 99.

Ca fait beaucoup de texte, peut-on simplifier encore ?

Heureusement, il y a une méthode dans rpg_core.js qui ajoute Math.randomInt(max);
Donc on peut écrire simplement :
Math.randomInt(100)+1
 
Hermoni
Garde du Trésor

Garde du Trésor
avatar

Nombre de messages : 845
Localisation : Quelque part entre la cuisine et le clavier.
Capacités : bon
Distinction : aucune
Date d'inscription : 07/09/2015

MessageSujet: Re: Formules de dégats   Dim 20 Aoû 2017 - 9:12

Note : Les formules seront réglées en fonction d'une formule de base que vous définirez. Par exemple, celle de base dans MV pour une compétence physique est : "a.atk*4-b.def*2".
Vous pouvez changer celle ci comme vous le souhaitez bien évidement, et je vais noter dans la suite celle ci "FormuleBase" par soucis pratique de faciliter la lecture et la compréhension de la suite vu que personne n'utilise la même base de calcul.
Formules de base dans MV :
Dégâts physiques : a.atk*4-b.def*2
Dégâts magiques : 100+a.mat*2-b.mdf*2
Soins : 200+a.mat



Exemples de formules applicables :

Plus haut je notais que le drain de base n'est pas spécialement plaisant à cause du plafond existant. Même si RP parlant c'est logique de ne pas pouvoir drainer plus de vie que la cible n'en a, pour un soucis de gameplay on peut y préférer gagner constamment un % des dégâts effectués.

Drain de vie de 10% :

dmg = FormuleBase; a.gainHp(Math.ceil(0.1*dmg)); dmg


On enregistre dans la variable "dmg" la formule de dégats. On ajoute ensuite grace à "gainHp" ces dégats.
Voulant 10% on multiplie "dmg" par 0.1. Suite à cette modification on est forcé d'arrondir ce chiffre avant de l'ajouter. J'ai choisi arbitrairement d'arrondir à l'entier supérieur, mais vous pouvez choisir d'arrondir en dessous ou au plus proche.


Dégâts en fonction des TP, utilisant tous les TP disponibles :

dmg = FormuleBase*2*(a.tp/100) ; a.clearTp(); dmg


On commence par calculer les dégats qui seront les dégâts de base, multipliés par deux fois le % de TP possédé. On enregistre le tout dans la variable "dmg", puis on met les TP a 0 pour enfin faire les dégâts à la dernière ligne.
PS : On aurait pu utiliser aussi a.tpRate() au lieu de a.tp/100

Attaque Kamikaze (10% de rester en vie si plus de 90% de vie):

a.hpRate() > 0.9 && Math.randomInt(100) <10 ? a.setHp(Math.ceil(a.hp-a.mhp*0.9)) : a.die() ;FormuleBase*3


C'est une attaque qui tue automatiquement l'utilisateur. Mais il a 10% de chance de survivre s'il avait plus de 90% de sa vie au moment de l'utilisation. Il en sortira alors très affaiblit mais en vie.

a.hpRate() > 0.9 - Vérifie le taux de vie de l'attaquant
Math.randomInt(100) <10 - Génère un nombre aléatoire entre 0 et 99, puis vérifie s'il est entre 0 et 9 (pour ceux que ça dérange de compter entre 0 et 99 et pas entre 1 et 100, on peut écrire "Math.randomInt(100)+ <11" ou "Math.randomInt(100)+ <==10")

On vérifie que les deux sont valides via "&&" (ET).

Si les deux conditions sont vérifiés, les HP de l'utilisateur tombent a 10% : a.setHp(Math.ceil(a.hp-a.mhp*0.9))
Sinon, l'utilisateur meurt : a.die()
Et enfin, le calcul de dégât est triplé. Car bon, une attaque de ce genre se doit d'être puissante. N'est ce pas ?

Pour une attaque Kamikaze qui suicide l'utilisateur quoi qu'il arrive, la formule sera simplement :

a.die() ;FormuleBase*3

Modification de la résurrection :

b.mhp / 10 + FormuleBase

De base, la résurrection ramène la cible a 10% de sa vie.
Avec cette fonction, la cible est ramenée a 10% plus un bonus de vie fonction de la puissance de l'utilisateur.
 
Kingdommangas
Garde du Roi

Garde du Roi
avatar
https://www.youtube.com/channel/UCqGFuGrzm7jim1o5QJ4lKvg En ligne

Nombre de messages : 998
Localisation : Ma tête
Capacités : moyen
Distinction : Débrouillarde notoire é_è [Mist']
Ou celle qui partageait plus vite que son ombre [Gel']
Poisson 2017 [Amal]
Grâce à elle, tout le forum appelle Yamashi "Mamashi" [Yama]
Entraide d'Or
Règne dans l'ombre de la commu'
Youtubeuse beauté reconvertie dans le gaming [Amal']
Date d'inscription : 05/05/2015

MessageSujet: Re: Formules de dégats   Dim 20 Aoû 2017 - 11:26

Oh nice, moi qui calle justement sur ce genre de chose ^^
 
Ashala
Grand Homme

Grand Homme
avatar

Nombre de messages : 471
Age : 26
Localisation : L'Antre-Deux-Mondes.
Capacités : moyen
Distinction : aucune
Date d'inscription : 09/06/2016

MessageSujet: Re: Formules de dégats   Dim 20 Aoû 2017 - 18:43

Ca fait quelques jours que je me référais justement à CE post en anglais xD
Merci d'en avoir fait une traduction Hermoni, il est très utile !
 
no0ony
Staffieux retraité

Staffieux retraité
avatar
En ligne

Nombre de messages : 1949
Age : 27
Localisation : Vosges (88)
Capacités : très bon
Distinction : aucune
Date d'inscription : 14/04/2013

MessageSujet: Re: Formules de dégats   Dim 20 Aoû 2017 - 19:46

Une question simple : Est ce viable aussi avec ACE ?
Si non, existe t-il ce genre de tuto/explication pour ce dernier ?
Si oui, c'est juste parfait, merci Hermoni, j'avais toujours un peut de mal à comprendre ces formules.
 
Ashala
Grand Homme

Grand Homme
avatar

Nombre de messages : 471
Age : 26
Localisation : L'Antre-Deux-Mondes.
Capacités : moyen
Distinction : aucune
Date d'inscription : 09/06/2016

MessageSujet: Re: Formules de dégats   Dim 20 Aoû 2017 - 20:26

Il me semble que la plupart des commandes ne fonctionnent pas pour Ace, et je n'ai jamais trouvé leur équivalent. Les isQuelqueChose par exemple, c'est typique du javascript.
 
Gelarto
Gelato Della Mamma

Gelato Della Mamma
avatar

Nombre de messages : 2795
Age : 22
Capacités : moyen
Avertissements : 1 avertissement
Distinction : Grand bêta-testeur de la communauté Curse
Personne avec du goût
Je ne suis pas une glace italienne, bordel de merde! [Gel']
Mon plus grand fan [Yama']
Mon ptit bichon [encore Yama']
Jeau-Paul II[Mist']
Saint-Gelato Le Frais [Mist']
Écrivain du dimanche [Amal']
FF IV Fanatic [LaCommu']
Collectionneur de distinctions de merde [Yama]
ModoGel [Un staffieux mais lequel?]
RNGel 2.0 [Zeal']
Date d'inscription : 31/07/2012

MessageSujet: Re: Formules de dégats   Dim 20 Aoû 2017 - 21:04

Il existe quelque chose de similaire sur Ace, voici deux liens pour t'aider :
- http://cobbtocs.co.uk/wp/?p=271
- http://www.rpgmakercentral.com/topic/8986-skill-ideas-you-can-do-with-custom-formula/

Merci Hermoni pour ce petit tuto ! + 5pts.

_________________
 
no0ony
Staffieux retraité

Staffieux retraité
avatar
En ligne

Nombre de messages : 1949
Age : 27
Localisation : Vosges (88)
Capacités : très bon
Distinction : aucune
Date d'inscription : 14/04/2013

MessageSujet: Re: Formules de dégats   Dim 20 Aoû 2017 - 21:10

Merci Gel.
 
Hermoni
Garde du Trésor

Garde du Trésor
avatar

Nombre de messages : 845
Localisation : Quelque part entre la cuisine et le clavier.
Capacités : bon
Distinction : aucune
Date d'inscription : 07/09/2015

MessageSujet: Re: Formules de dégats   Dim 20 Aoû 2017 - 22:51

Yep, ya trop de différence entre ace et MV pour simplement faire un copier coller.
Et ça fait un moment que j'y pensais, car ça m'étonnait que ça soit pas encore là^^
 
Contenu sponsorisé




MessageSujet: Re: Formules de dégats   

 

   Page 1 sur 1
 Sujets similaires
-
» Formules de dégats épeïste
» Les renégats de Malalagoule (GI chaotisée)
» Gestion des dégats
» Venez montrer vos dégats !
» 3 jeudis, 3 domaines, 3 formules, 3 dégustations!

 Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum