YAG et LUA :-) 19
Forums > Créativité
Hello,
Vu la demande, j'ai beaucoup bossé et ça a avancé beaucoup plus vite que prévu
Il est donc désormais possible d'utiliser LUA pour personnaliser Yag !!
Pour le moment les feuilles de perso et les dés.
Les pions viendront plus tard.
Vous trouverez une description au format PDF de mon ébauche d'API sur la nouvelle page du site yag.
Et bien sûr la vidéo de présentation.
C'est juste un premier pas, mais il est chouette comme tout^^
+
Cedric
Hé hé, merci, j'ai vraiment pas chomé récemment
C'est un début, c'est la première fois que je fais ce genre de chose, mais ça a l'air prometteur, et en tout cas c'est super fun et intéressant à faire, tout nouveau domaine pour moi, j'apprends une tonne de choses. Je suis en vacances et absent la semaine prochaine, mais à part ça je pense que ça va évoluer vite
Pour le d10, par défaut le 0 vaut 0 dans Yag, mais il y a déjà dans le panneau des dés une option pour le faire passer à 10 (le d10 est customizable nativement), et du coup il explosera comme les autres
Merci^^
Cedric
- Sauriak
Hello Fufu
Merci !
En un mot, il est désormais possible de parler avec Yag en utilisant un langage assez simple et standard (LUA).
On peut le faire en passant par des fonctions que je dois préparer (en jargon on parle d'API: Application Programming Interface, un ensemble de fonctions permettant de s'interfacer avec un langage ou un soft).
Ca permet de customiser le comportement de Yag, d'automatiser des choses, et surtout ça donne la main au joueurs, donc c'est effectivement une nouveauté très importante.
Pour l'instant ma librairie de fonctions est encore assez légère, mais elle fonctionne, c'est ce que je montre dans la vidéo
+
Cedric
Bon, l'intégration du LUA dans Yag c'est carrément top
J'ai bricolé un petit peu cet après-m pour émuler un système perso que je galère comme un fou à intégrer dans Fantasy Grounds... Sans rentrer dans les détails, il s'agit d'effectuer des jets de d20 sous une compétence mais au-dessus d'une difficulté. Et en une après-m j'ai quelque chose de fonctionnel !!
Le test se décompose comme suit :
- My_RollDiceButton affiche le type de test (Test de Combat) ainsi que les deux valeurs à prendre en compte (difficulté-compétence)
- My_RollDiceCallback a été allégé (je n'ai qu'un test et je n'ai pas besoin des autres infos). Avec de simples conditions, je compare le test aux scores et affiche s'il s'agit d'un échec, d'une victoire ou d'un équilibre (score = compétence).
Franchement, c'est génial : c'est l'accessibilité des macros de Roll20 couplée à des possibilités proches de celles de Fantasy Grounds -> le meilleur des deux mondes !
J'ai aussi testé les feuilles de perso avec calculs de certains champs. Simple et efficace. J'adore
- YagCed
Bon, j'essaie de me familiariser avec la partie LUA de Yag pour développer différents rulesets/fiches de perso, et il y a une petite feature que j'aimerais intégrer mais je ne sais pas si c'est faisable (je n'ai pas encore trouvé comment).
Cela concerne les PV. Pour modifier le maxhp, on indique le calcul à effectuer dans l'Update de la feuille de perso. Je me demandais s'il était possible de passer par un jet de dé (1d au niveau 1, 2d niveau 2 etc). A première vue, la valeur maxhp est forcément un nombre (je ne peux pas indiquer "maxhp = 1d8" par exemple).
J'ai donc créé un champ DDV (dé de vie) sur ma feuille de perso. Je lui donne une valeur de (niveau) d8 pour qu'il me retourne le jet de dé correspondant.
Dans la fonction Callbacks je peux isoler mon jet :
if id == "DDV" then maxhp = lib.DiceResultTotal(dr1) end
Mon souci, c'est que si le maxhp est modifié il n'est pas mis à jour (il n'y a pas d'update de la feuille de perso). Est-ce qu'il est possible de mettre à jour la feuille de perso dans le RollDiceCallback ?
- YagCed
Hello,
La v0.8.1.0 est en ligne:
- le comportement des dés a été entièrement sorti du c++ et est donc complètement modifiable en LUA, on fait ce qu'on veut sans restriction.
- l'API s'étend un peu et donne désormais la possibilité de modifier directement les pions dans le jeu. Pour le moment juste la vie, l'initiative et la participation au tour.
La petite vidéo de présentation.
Je vais être absent et déconnecté toute la semaine (vacances loin de chez moi), donc je serai sourd muet pendant 10 jours, je me remets au boulot à mon retour
Bonne semaine à tous
- YagCed
Salut Kyin
Oui, le champ mxhp est un entier et pas une formule, donc il faut faire autrement.
- tu n'es pas obligé d'utiliser les dés de Yag, pour ce genre de chose où le suspens n'est pas insoutenable, tu peux utiliser un nombre random dans LUA pour avoir ton résultat tout de suite et renseigner le champ sans passer par les dés Yag.
- sinon, tu peux lancer les dés avec RollDice et récupérer le résultat dans la Callback. Mais il faut bien sûr que la Callback sache qu'il s'agit de ce jet particulier. Avec la 0.8.0 je t'aurais dit de passer par le champ "secret" des lignes des feuilles de perso, mais la nouvelle version de l'API en 0.8.1.0 facilite la chose: la fonction RollDice te propose maintenant 2 champs supplémentaires, un entier ui et une string us, qui te permettent d'envoyer des infos à la Callback pour identifier ton jet.
Donc tu peux par exemple désormais lancer: yag.RollDice(1d8, "", 5, ""), et dans ta Callback utiliser le ui==5 pour mettre à jour le mxpHP de la cs avec le résultat du dé.
J'espère que c'est clair, sinon tu me dis, et s'il y a besoin de faire évoluer l'API, on fera
Pour info je suis absent toute la semaine prochaine, je répondrai dès mon retour
+
Cedric
Oh j'ai oublié un truc très important: pour identifier les pions, j'ai du ajouter une variable (l'identifiant), qui doit être sauvegardée.
Donc la structure des sauvegardes est modifiée, et donc les anciennes sauvegardes peuvent déconner avec la nouvelle version, donc il est plus propre de supprimer vos sauvegardes et les refaire.
Il est suffisant de supprimer les binaires uniquement, les sauvegardes en csv n'auront pas de pb, donc vous conservez vos feuilles de perso.
Désolé, j'essaye de le faire le moins souvent possible, mais là pas le choix, LUA est une révolution dans Yag, donc les choses changent beaucoup et rapidement...
Si c'est bloquant pour vous et que vous avez absolument besoin de vos sauvegardes, j'ai laissé la version 0.8.0.1 sur la branche "previous" sur steam.
Désolé et merci pour votre compréhension
- SmirnovV5312
Sacré boulot bravo!! une question, si je veux jouer à Savage World sous yag est ce que dans le même ligne je peux mettre deux dés different et qu'il me garde les dés qui ont fait 4+ et relance ce qui explose à 6?
Salut SmirnovV et merci
Pour les dés différents, (si je comprends correctement, car je ne connais pas savage world), il suffit d'écrire: 1d6+1d6. Yag considèrera qu'il s'agit de 2 formules et appliquera des couleurs différentes (alors qu'en écrivant 2d6 les 2 dés auront forcément la même couleur).
N'oublie pas de choisir ta séquence de couleurs dans l'interface (si tu veux que le premier dé soit blanc et le 2ème noir par exemple).
Pour les relances, dans le module par défaut j'ai scripté le faire de garder les n meilleurs, et les relances explosives, mais pas le fait de garder les dés >4. Donc faire ce que tu veux est possible, mais il faut que tu modifies un peu le script pour faire ce qui t'intéresse.
Je t'aurais bien proposé de te le faire, mais plus le temps de coder ce soir malheureusement, demain je prends le train juste après le boulot donc tout doit être préparé ce soir pour la semaine^^
Si tu n'aimes pas scripter et si c'est pas trop pressé, je te fais ça la semaine prochaine quand je reviens^^
+
Cedric
- YagCed
SmirnovV,
J'ai craqué j'ai jeté un oeil rapidos, vite fait, si tu remplaces la fonction GetResultsToKeep par la suivante ça semble
faire le boulot:
function default.GetResultsToKeep(r, hl, ni)
-- on crée une table avec les valeurs >= ni
local ts = {}
i = 1
for k,v in pairs(r) do
if (v.value >= ni) then
ts[i] = k
i = i + 1
end
end
return ts
end
Tu peux l'utiliser avec une formule du genre: 1d6h4e6 + 1d6h4e6 pour lancer 2 dés différents (en choisissant 2 couleurs différentes dans l'interface), explosifs sur 6, et en gardant les résultats >=4.
J'ai fait ça vite, testé 5 minutes, il faudra peut être ajuster mais c'est une bonne base, la logique de la fonction est simple. On doit pouvoir faire beaucoup plus simple en simplifiant le script plus en profondeur ailleurs (ta condition est très simple), mais j'ai juste changé la fonction qui est là pour ça sans rien toucher d'autre: c'est grossier, mais rapide, facile, et le changement est aisé de ton coté: juste remplacer une fonction.
Attention à ne pas travailler directement sur le module "default", il est écrasé/restauré à chaque redémarrage de Yag. Crée une copie pour ne pas perdre tes modifs à chaque démarrage
+
Cedric
- SmirnovV5312
Supert!!! Merci, je test ça
Mais je pensais plus à par exemple 1d8 et 1D6 jetés en même temps (de d4 à d12 en fait).
SmirnovV5312
Salut Smirnov,
Tu as plusieurs solutions pour ça :
- la plus simple, tu utilises les deux formules avec le e suivi du score max du dé (ex : 1d8e8 dans la première case, 1d6e6 dans la seconde)
- pour simuler le dé joker de sawo sans avoir à remplir systématiquement cette deuxième case (en partant du principe qu'il s'agit toujours d'un d6 explosif supplémentaire) tu indiques dans MyRollDiceButton que f2 est égal à 1d6e6
- SmirnovV5312
Hello !
J'ai essayé de reprendre les types de macro/jets de dés utilisés assez régulièrement. Je me suis inspiré de plusieurs listes déjà existantes... mais si vous voyez des choses qui semblent manquer n'hésitez pas à les ajouter (l'idée c'est que Ced pioche dedans pour les implémenter dans Yag).
Nom | Formule | Exemple | Explications |
Jet standard | [x]d[y]+[z] | 1d20+3 | La base. |
Jet explosif | [x]d[y]e[z] | 1d6e6 | Les dés indiqués (ici 1d6) sont lancés et ceux qui affichent un résultat égal ou supérieur à ce qui se trouve derrière le e (ici 6) sont relancés et les résultats sont additionnés. Il est à noter que le dé peut exploser sur un score qui n'est pas le maximum sur le dé (1d6e5 relancera les d6 qui affichent 5 ou 6). |
Jet à succès (roll over) | [x]d[y]o[z] | 8d6o4 | (proposition) Les dés indiqués (ici 8d6) sont lancés et ceux qui affichent un résultat égal ou supérieur à ce qui se trouve derrière le o (ici 4) comptent comme un succès. Le résultat final indique le nombre de succès obtenus (et non la somme des scores des dés). |
Jet à succès (roll under) | [x]d[y]u[z] | 3d20u12 | (proposition) Les dés indiqués (ici 3d20) sont lancés et ceux qui affichent un résultat égal ou inférieur à ce qui se trouve derrière le u (ici 12) comptent comme un succès. Le résultat final indique le nombre de succès obtenus (et non la somme des scores des dés). |
Roll & Keep | [x]d[y]k[z] | 4d10k2 | (proposition) Les dés indiqués (ici 4d10) sont lancés et seuls les [z] (ici 2) meilleurs dés sont additionnés. |
A voir aussi comment ces différents dés pourraient être mixés (les d10 du Roll & Keep sont censés exploser par exemple).
- YagCed
Salut Kyin
Une partie de ta table existe déjà:
- les dés explosifs
- les roll&keep mais avec des lettres différentes du k standard: h pour garder le plus haut (h=highiest), l (L minuscule) pour garder le plus petit (l=lowest).
On peut déjà écrire une formule du type: 5d8h3e7 pour lancer 5d8, garder les 3 meilleurs, et relancer les 7+.
Tout est fait en LUA dans le module "default", donc libre à chacun de modifier ou tout refaire.
Pour rappel, tout ce que Yag fait aujourd'hui, c'est isoler les formules de la forme ndx (5d4) ou les constantes (bonus) pour les lancer donner les résultats dans la fonction RollDiceCallback. Pour le reste, il renvoie la formule telle quelle, et on peut donc faire ce qu'on veut, ajouter les lettres ou le langage qu'on veut.
Les lettre h, l et e existantes sont codées en LUA dans le module "default".
Je pourrais ajouter les o et u pour les jets à succès, mais si j'ai bien compris, parfois il faut donner la somme des dés, parfois leur nombre, donc impossible de faire un module générique, il faudra implémenter ça dans les modules/templates/rulesets au cas par cas.
J'imagine qu'à terme, il faudra créer (si elle ne se crée pas toute seule) une librairie, ou un ensemble de templates pour chaque type de jets de dés et leurs résultats. Le langage et le comptage dépendent des règles de chaque jeu.
Et puis on peut aller plus loin en proposant chaque type standard dans une liste déroulante et automatiser le bon module en fonction, faire une interface mignonne pour que ça soit confortable, etc. Tout ça se fera naturellement si la librairire prend forme et grossit.
Idem si un jour on a des vrais rulesets, mais un pas à la fois^^
A suivre
+
Cedric
Hello,
La v0.8.2.1 est en ligne (vidéo dans la thread Yag).
La nouvelle version s'accompagne d'une gestion un peu différente de LUA, qui est désormais expliquée dans une vidéo tuto dédiée.
+
Cedric
- SmirnovV5312