RMEx
RMEx

Community

Le Deal du moment :
Display One Piece Card Game Japon OP-08 – Two ...
Voir le deal

Vous n'êtes pas connecté. Connectez-vous ou enregistrez-vous

exploiter la formule custom

Voir le sujet précédent Voir le sujet suivant Aller en bas  Message [Page 1 sur 1]

Ulis

Ulis
Exploiter la formule custom par Fomar0153, autorisation obtenue par MP

Ce tutoriel peut aussi être trouvé sur son blog à l'adresse http://cobbtocs.co.uk/wp/?p=271 ( à vérifier si maintenance)

aussi présent sur https://forums.rpgmakerweb.com/index.php?threads/how-to-make-the-most-of-custom-formulae-part-1.1143/

et sur https://www.rpgmakercentral.com/topic/2340-how-to-make-the-most-of-custom-formulae-part-1/ (merci kvk )

----------

Plus tôt aujourd'hui sur le salon irc de rpg maker, la conversation en est venue au script que quelqu'un désirait pour son jeu incluant ceci :
plats préférés - Je peux spécifier le plat préféré de chaque acteur et quand l'objet est utilisé sur lui, ça lui soigne plus de vie ou quelque chose comme ça.

Bref, j'ai très vite réalisé qu'un script n'était pas nécessaire pour implémenter cette fonction. RPG Maker Ace prouve une fois de plus combien il est versatile parce que cette fonction peut être implémentée dans un seul champ de texte.
En particulier, celui-ci :

exploiter la formule custom  1375383812-ss00272

note de Ulis : on remarquera qu'il y a un choix du type d'effet en haut à gauche. Dans la suite des exemple, ce choix est adapté, d'où les dommages ET les soins qui apparaissent avec un signe positif dans les formules. Lors de vos créations de formules, pensez à adapter le type. A vérifier si la version lite accepte l'ajout de script dans ce champ-là ...

Ce champ de formule à lui tout seul a un immense potentiel ! J'offre deux solutions à ce problème :

Code:
if b.id == 1; 500; else; 100; end;
Code:
b.id == 1 ? 500 : 100

Regardons en premier ce qu'elles font exactement. Les deux vérifient une condition énoncée, à savoir

Code:
b.id == 1
Pour le champ de formule en général, "a" se réfère à l'attaquant ou l'utilisateur et "b" se réfère au défenseur ou le destinataire, qui peuvent être ou ne pas être le même acteur.

Quoiqu'il en soit, ce que nous vérifions est que le destinataire a une ID égale à 1. Notez que cet exemple concerne un objet qui ne devrait être utilisable que sur les membres de l'équipe et par conséquent, "b" sera toujours un acteur. Ainsi dans l'essentiel, on vérifie que la personne sur qui l'objet est utilisé est le premier de la base de données (par défaut : Eric).


Maintenant, regardons le reste de ces lignes :

Code:
if b.id == 1; 500; else; 100; end;
Si vous avez fait un peu de programmation avant ça, vous reconnaîtrez là une déclaration standard de "if". Si la présence de points virgules vous déroute, eh bien je vous dirais juste qu'ils sont un moyen d'insérer une nouvelle ligne. Si nous n'avions pas été restreints à une seule ligne, nous aurions pu l'écrire comme ceci :

Code:
if b.id == 1

500

else

100

end
Donc ce que ceci signifie est que quand l'ID du personnage est égale à 1, soigner 500 PV sinon soigner 100 PV. L'autre version donne le même résultat mais peut être un petit peu moins claire si vous n'êtes pas excessivement familier avec le ruby.

Code:
b.id == 1 ? 500 : 100
Il y a toujours la condition, cela vérifie toujours si l'objet est utilisé sur Eric mais le reste du code, peut-on dire, a été condensé. Celà en effet se réduit à :

Code:
condition ? true : false
Les deux dernières choses que je veux dire avant de continuer sont en premier que pour des situations bien plus compliquées, il vaudra probablement mieux prendre le chemin de "if" et la dernière chose est que bien que le champ de formules soit plutôt puissant, vous devez savoir qu'il est limité à une certaine longueur (soyons déjà heureux d'utiliser a et b pour attaquant et défenseur) et que s'il y a une erreur dans votre formule, la compétence va échouer de manière répétée plutôt que de crasher le jeu.

Voilà qui conclut la partie explication de ce tutoriel. Je trouve personnellement qu'avoir beaucoup d'exemples à partir desquels travailler est bien utile donc la section suivante sera une section de problèmes et solutions, en espérant que l'un d'entre eux sera assez proche de ce que vous espérez réussir pour pouvoir l'adapter.
--

Scenario : la moitié de votre équipe sont des semi-humains ou robots et ont besoin d'objets de soin différents du reste de l'équipe.

Il y a des solutions très créatives à ce problème mais pour le bien de ce tutoriel, je veux que ça reste simple. Ainsi la solution que j'offre est simplement de vérifier à nouveau les ID.

Code:
(b.id==1 or b.id==3 or b.id==4) ? 500 : 0
Deux choses sur lesquelles j'aimerais attirer votre attention. J'ai omis les espaces sur les deux côtés de == parce que quand on est attentif aux espaces c'est du gâchis de caractères. L'autre particularité est les "or", ils agissent comme vous vous y attendriez mais soyez prudents quand vous les utilisez car il y a un peu plus que ça.
--


Scenario : Le plat préféré d'un personnage est le sandwich au beurre de cacahuètes mais un autre personnage est allergique aux cacahuètes.

Donc la façon dont je vais implémenter ça est que Eric aura un bonus de 100 de vie quand il mangera le sandwich mais Nathalie aura le statut poison infligé si elle en mange un.

Code:
if b.id==1;200;elsif b.id==2;b.add_state(2);0;else;100;end;
Alors c'était un peu plus compliqué cette fois donc j'ai pris le chemin du "if". "elsif" est un moyen de vérifier une autre condition si la première n'a pas été remplie. Pour le dire en mots,
si Eric, gagner 200 PV ; si Nathalie, ajouter le statut numéro 2 (poison) sinon, rendre 100 PV.

note de Ulis : exemple en version condensée avec un elsif. Je ne crois pas que le 0; soit obligatoire à remplir pour la compétence mais je n'ai pas testé sans.


--


Scenario : vous avez une compétence tonnerre qui inflige plus de dommages quand on se trouve en extérieur, ce que vous contrôlez avec un interrupteur.

C'est juste un exemple d'interrupteur.

Code:
$game_switches[x] ? 500 + a.mat * 4 - b.mdf * 2 :  200 + a.mat * 4 - b.mdf * 2
note de Ulis : version sans "if" cette fois mais vérifiant l'état de l'interrupteur selon la forme donnée plus haut
condition ? true : false.
Sans RMEx, il ne sera pas possible de mieux condenser cette formule. Avec RMEx, le to_i permet de gérer les deux éventualités d'un coup :
200+300*S[x].to_i +a.mat * 4 - b.mdf * 2

J'ai aussi inclus dedans un exemple de comment inclure la formule par défaut pour que vous puissiez voir comment l'incorporer.
--

Scenario : J'ai une compétence dont je veux contrôler la puissance au moyen d'une variable.

Très facile. Voici comment rendre 10 fois la valeur de la variable.

Code:
$game_variables[x] * 10
note de Ulis : ou encore v[x]*10 (à vérifier)
--

Scenario : J'ai un parieur et je veux qu'il utilise une compétence avec des dés, c'est à dire : il lance deux dés à six faces, la compétence fait 100 fois la somme des nombres sur les faces. Ça fait le double du résultat normal si le lancer donne un double et 10 000 s'il fait double-un.

Il y a beaucoup de choses dans cette formule alors nous la regarderons de près. Nous utiliserons la méthode "if" et ensuite nous utiliserons la méthode rand(x) qui donne un chiffre entre 0 et x-1, ce qui signifie que nous devrons lui ajouter 1 pour simuler un vrai dé. Il va aussi nous falloir créer des variables locales, j'utiliserai c et d (NE PAS UTILISER a et b).


Code:

c=1+rand(6);d=1+rand(6);if c==1 and d==1;10000;elsif c==d;c*400;else;(c+d)*100;end;
note de Ulis : le 400 s'explique ainsi :
cx2 (car on compte la somme de c et d dans un cas où ils sont égaux)
x 2 (encore car on a dit qu'on obtenait le double dans le cas d'un double)
x 100 (résultat normal).
On notera l'ordre dans lequel sont vérifiées les conditions, de la plus à la moins restrictive.

Ce n'est pas parfait, j'aimerais bien savoir ce qu'a donné le lancer plutôt que de juste voir les dommages. Pas d'inquiétude, la solution à ce nouveau problème sera montrée dans le prochain tutoriel.
--

Scenario : Nous voulons une compétence comme "White Wind" (un mouvement de final fantasy qui restaure autant de PV que la cible en a).

Plus facile pour une fois, on veut les PV de la cible (b)

Code:
b.hp
Les autres paramètres qu'on peut utiliser :

hp, mp, tp, mhp (Maximum Hit Points), mmp (Maximum Magic Points), atk, def, mat (Magic ATtack power), mdf, agi, luk

note de Ulis : c'est directement la valeur, avec le type "soin de PV"
--

Scenario : Et pour Demi ?

Demi était un mouvement qui prenait [à l'adversaire] un quart de votre [l'auteur dit votre mais en réalité c'est *sa*] santé du moment.

Code:
b.hp / 4
note de Ulis : directement l'effet,  en dégâts aux PV.
--

Scenario : Je veux une compétence qui utilise le statut de quelqu'un d'autre, c'est à dire, ma princesse dirige son garde.

C'est plus facile que vous le pensez, tant qu'il s'agit d'un personnage en particulier :


Code:
$game_actors[1].atk * 4 - b.def * 2

note de Ulis :  : La formule est celle de base mais utilise la valeur d'attaque d'Eric !
-------------


Sur le sujet et sur son blog, l'auteur se propose à vous créer et à expliquer les skills que vous demanderez !
Les premiers commentaires soulignent que v[n] est utilisable dans ce champ.

Avec RME, on peut utiliser les V[] dans ce champ. On peut aussi utiliser les interrupteurs et même les combiner :


Code:
V[1]+S[1].to_i*V[2]*100

Soit en français :
effet avec une valeur de base qui est la valeur dans la variable 1 puis si le premier interrupteur est activé, y ajouter 100 fois la valeur dans la variable 2 (sinon, rien en plus).

Ne pas oublier le .to_i après l'interrupteur pour passer de true à 1 et de false à 0, autrement la compétence apparaît mais ne produit aucun dommage, il n'y aura pas de message d'erreur dans le cas de la compétence.



Dernière édition par Ulis le Mer 9 Mai - 13:30, édité 10 fois

Ergo

Ergo
Superbe article ! Merci. Je n'osais pas y toucher !

Voir le sujet précédent Voir le sujet suivant Revenir en haut  Message [Page 1 sur 1]

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