Vous n'êtes pas connecté.
Forum : Logiciels, patchs et modding Page : 1
Auteur Message
Quid?
image du rang
Jeune Cloud


Posté le 08 mai 2020 à 06:44 | Sujet : Tutorial FF7: Proud clod et l'ai de combat
Bonjour,

Tentative de mise en page de la partie 1, ce que j'ai écris de plus cohérent en tout cas. Davantage pour les non familiers de Proud Clod, mais si les familers veulent éclaircir des choses que j'aurais oublié ou autre, je vous en prie.

Partie 2 sur l'ia est en route, demain je pense, et devrait être mieux à suivre que cette tentative sur l'outil lui-même.

Ok, essayons de faire un tutorial Proud Clod, et un tutorial de battle ai.
Cette fois, j'utilise quelques screenshots pour me dispenser de descriptions inutiles et trop longues, du moins j'espère.
(Ouais, en relisant aprés coup les screens ne servent pas à grand chose en fait... Mais je les ai pris alors bon)

Partie 1, Proud clod

Pour commencer, l'outil Proud Clod, de NFITC1, est là:
http://forums.qhimm.com/index.php?topic=8481.0

Bon j'assume que vous comprenez au moins un minimum d'anglais, vous en aurez besoin de toute façon, et que je n'ai pas à vous refaire le descriptif général de l'outil.
Résumons simplement que les données des ennemis de FF7, ainsi que leurs ia, sont stockées et traitées dans le fichier scene.bin, lui même dans le dossier battle de votre installation de FF7.
Ce va de soi, mais conservez toujours un backup propre et non modifiée de votre scene.bin original...

Soyons plutôt pratique. Quand vous ouvrez votre scene.bin avec Proud Clod, vous verrez ça d'abord:
https://i.imgur.com/RKUrsYq.png
Image

La scene 0 est inutilisée par le jeu vanilla, alors sautons jusqu'à la scène 8, qui est un exemple comme un autre:
https://i.imgur.com/gFZ10pT.png
Image

La liste que vous voyez dans le rectangle à gauche, wheelie, drift turn, ect, sont les attaques des ennemis enregistrés dans la scene 8.
A droite du rectangle, vous voyez les attributs de l'attaque selectionnée, ici, Wheelie. A mon humble avis, je ne vais pas tout vous décrire, quand je trouve que l'outil le fait assez bien lui même, comparez simplement différentes attaques et vous verrez.
Pour la suite du tutorial et en particulier pour la partie 2, les ia, je vous dirai seulement de garder la fenêtre "Attack ID" dans un coin de votre tête, mais on va revenir sur tout ça de toute façon.

Pour l'instant, intéressez vous aux menus en haut, plus particulièrement "scene data management" et "enemy management". Ignorez Edit enemy ai pour l'instant, jetez plutôt un oeil à Enemy stats.
En dehors de ce que vous devriez comprendre facilement, je vais me citer sur quelque chose dont j'ai déja parlé dans mon tutorial sur les models, au sujet de la case ModelID et des lettres rouges à côté:

"4, Vous savez quoi, un exemple un peu plus complet pour débuter le processus sera plus parlant. Disons que je veuille commencer un nouveau model avec l'ennemie neige/snow pour base.
La première chose à faire est de chercher snow/neige dans proud clod, l'outil de modding des ennemis. Je la trouve dans la scene 171, et je regarde ses stats dans ennemy stats.
En haut au milieu, je vois ça:
Model ID 00D2 ICDA

Oui, ICDA est bien le nom de son fichier d'animations, et le jeu cherche ce fichier en fonction du nom du model, ainsi que de son code hexadécimal qui vont de pair."

Donc, si on prend le devil ride de la scene 8, on sait que CUDA est le fichier d'animation du devil ride model, et que son model entier va des fichiers CUAA à CUDA.
C'est important si vous comptez injecter un nouvel ennemi avec un nouveau model dans le scene.bin.

Jetons maintenant un oeil au menu "scene data management", et ouvrez animations\formations.
https://i.imgur.com/mZiKiS3.png
Image

Déja, vous pouvez voir quelles attaques sont assignées à qui. ATTENTION.
N'allez pas vous imaginer que vous pouvez assigner les attaques de n'importe quel ennemi à un autre. Sur, rien ne vous arrête d'essayer, mais ça ne marchera pas comme vous l'espérez en jeu.

Les ennemis, comme les personnages jouables d'ailleurs, ont tous leurs propres animations qui font parties de leurs battle models. Donner une attaque ou similaire à un model qui n'a pas les animations prévues pour, ça ne va pas marcher par magie.
Je tente de vous guider un peu plus loin sur le sujet, mais avant allons dans l'onglet formation.

Il y'a quatre formations par scene, et chacune correspond à un combat possible.
Je cite Acro sur le sujet... Ou non, je vous renvoie directement au thread, vous n'avez qu'à lire les deux premiers posts pour comprendre, normalement:
https://ff7.fr/forum/index.php?page=post&ids=430448&pg=0

Et je précise que la liste discutée dans ce thread est depuis disponible, là:
https://ff7.fr/forum/index.php?page=post&ids=432668

Ensuite,
Background est le décor dans lequel le combat a lieu.
Flags, je ne m'en sers jamais, je ne suis pas sur.

Escape counter, plus le nombre est bas, plus la fuite est facile. Vous pouvez monter jusqu'à 0009 ou 000A pour rendre la fuite impossible, comme le font les boss du jeu.

Next battle, une case intéréssante, vous voyez les combats de l'ascensceur shinra ou les formes d'Hojo? Ils utilisent cette case pour aller d'un combat au suivant sans revenir à l'écran de terrain.
Et vous pouvez faire de même, que ce soit avec des combats vanilla ou des nouveaux combats de votre cru.

Les cases Next arenas suivent un shéma similaire, mais uniquement pour l'arène du Gold Saucer.

Type, devrait être assez descriptif dans l'ensemble, et vous avez la liste du lien plus haut.

Init camera, camera X, Z, ect... Je copie les valeurs d'autres combats qui correspondent à ce que je cherche le plus souvent. Les options preview, qui pour certains permettent d'orienter les vues du combat, ont tendances à me jouer des tours.

Tableau en bas,
enemy id, c'est l'id hexa de l'ennemi, à l'évidence. Vous vous souvenez du modelID dans ennemy stats? C'est la même valeur.

X, j'oublie toujours si c'est le positionement horizontal ou vertical de l'ennemi.

Y, c'est le positionnement par rapport au sol, dans la plupart des cas ce sera 0000, mais si vous voulez un ennemi flottant, genre fantôme ou Gi, vous devrez augmenter la valeur.

Z, voir X, j'oublie toujours lequel est lequel.
Pour les trois valeurs X,Y,Z, la plupart du temps je fais comme avec les caméras et je copie les valeurs d'autres combats, mais il m'arrive de faire des ajustements, même si des fois ça prend deux ou trois tests pour bien situer.

Row, théoriquement c'est le rang sur lequel l'ennemi se tient, et il subira moins de dommage physique sur l'arrière rang si la valeur Cover est active, mais vous devez bien le positioner avec la valeur X ou Z aussi.
Cover, ce que j'ai dis avec Row.

BattleFlags, ok, une colone bien particulière celle ci. Dans presque tous les cas, vous n'avez pas à vous en soucier, elle est à "FFFFFF", et vous pouvez l'y laisser.
Par contre, les pyramides de Reno l'utilisent pour être invisibles et intouchables quand elles ne sont pas actives. Je crois qu'un ou deux autres combats utilisent cette colonne, mais je n'en sais pas beaucoup plus.

Bon je crois que vous avez une vue de départ à ce stade si vous êtes concentrés, avant de passer à la partie 2, on va faire quelque chose pour que je puisse vous préciser quelques points qui me semblent essentiels.

Annulez le menu formation, et allez à la scene 50, juste pour un exemple. Dans ennemy management, faites copy Chocobo 015D, puis pour ne pas vous embrouiller au début, allez vers une scene totalement vide, 250 par exemple.
Une fois dans une scene vide, faites "paste into position 0", et vous devriez voir que le chocobo 15D s'est copié dans cette scene, avec ses attaques.

Mais il y'a un bug possible dans Proud Clod quand vous copiez les attaques d'un ennemi avec tout le reste. Les valeurs des attaques et autres peuvent être détraqués dans votre copie tout en un.

Pour être surs que vous n'aurez pas ce bug, revenez à la scene 50, et copier manuellement, une à une les attaques du chocobo vers votre nouvelle scene... Ecrasez avec celles qui se sont copiées automatiquement.

C'est rasoir je sais, mais ça ne concerne que les attaques. Une fois que c'est fait, pour aller vers un autre point essentiel, commencez par "create changes patch dans le menu "file".
Donnez un nom à votre fichier prc et enregistrez le. Qu'est ce que c'est et pourquoi? C'est une pure sauvegarde de vos changements, et seulement d'eux.

Une fois que vous avez votre prc, vous pouvez quitter proud clod sans faire "create scene.bin" pour l'instant, puis le relancer, toujours aussi non modifié qu'avant. Ensuite, vous faites "apply changes patch", et vous appliquez votre prc, qui va réinjecter vos modifications précédentes. Essayez.
C'est trés utile, à la fois pour une éventuelle future compatibilité avec d'autres scene.bin moddés, et pour sauvegardez bien des choses entre différents prc, car vous pouvez en faire autant que vous voulez.

Ensuite, sauvegardez avec "create scene.bin". Ne zappez jamais quand l'outil vous demande de comparer avec le Kernel.bin. Dites toujours oui. Si le résultat est, "appear to be correct", tout va bien.

MAIS, si ce n'est pas le cas et si proud clod vous demande si vous voulez faire une correction, vous avez deux options:
1, vous dites oui, et l'outil corrigera automatiquement le problème. Dans le Kernel.bin. Ce qui vous gênera peut être pour une question de peut être compatibilité avec d'autres mods, ou parce que vous n'aimez pas ne pas savoir ce qui s'est passé.

Ce qui nous amène à l'option 2. Travail manuel.
2, D'abord, voilà ce qui s'est passé. Je suis désolé, cette partie risque de prendre quelques lignes de plus mais tant pis.

A partir d'un certain nombre d'ennemis supplémentaires casés dans des scenes avec de la place, un nombre que j'ai oublié et que je ne retrouve pas dans mes notes, mais qui n'est pas si élevé, le Kernel.Bin, pour une raison ou une autre a besoin d'une modification.

Dans le Kernel, que vous allez ouvrir avec Wall Market, un autre outil de NFITC:
http://forums.qhimm.com/index.php?topic=7928.0
Vous allez naviguer dans le menu initial data, puis l'onglet "scene look-up".
Si votre Kernel est inchangé, voilà ce que vous devriez voir sur la table:
0 12 18 25 33 39 45 53
61 73 81 90 98 105 114 122
131 139 148 157 165 171 178 185
193 201 210 217 222 227 232 237
245 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255

Si vous avez atteint un point où Proud Clod a corrigé les tables une fois, voilà ce que vous devriez voir:
0 12 18 25 33 39 45 53
61 73 81 90 98 105 114 122
131 139 148 157 165 171 178 185
193 201 210 217 222 227 232 237
245 254 255 255 255 255 255 255
255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255

Un infime changement, le quatrième nombre de la deuxième colonne s'est changé en 254, au lieu de 255.

Si ça se produit une troisième fois, le même nombre devrait alors être 251.
Donc, vous pouvez faire ce petit changement manuellement, laissez proud clod le faire d'abord pour comparer les tables, recharger un backup pur de votre Kernel, changer le nombre, et créer un "changes patch WM", qui est l'équivalent du prc pour le wall market.
A vous de voir.

Allez, je crois qu'il faut passer aux ia, ou je ne vais jamais y arriver.

[Ce message a été édité par son auteur pour la dernière fois le 08 mai 2020 à 15:36]
622 messages
Voir le profilLien du message Aller en haut de page
Quid?
image du rang
Jeune Cloud


Posté le 08 mai 2020 à 06:46 | Sujet : Tutorial FF7: Proud clod et l'ai de combat
Partie 2, battle ai\ia

On va décortiquer une ia que j'ai faite, c'est plus facile pour moi d'expliquer dessus.

Listes et liens utiles déplacées en fin de post, ça me parait plus clair.

Soyons directement pratique pour cette deuxième partie, je pense que c'est mieux pour comprendre.
Revenons un instant sur les attaques et les ennemis d'une scene, une légère extension de la partie 1 mais qui nous sera utile pour l'ia. Voici un screen de la scene concernée ici:
Image

Choco et Mog font partie du même combat.
Vous pouvez voir qu'en dehors d'attaques que vous pouvez trouver dans Proud Clod, j'ai aussi ajouté l'invocation choco\mog, puisque ces deux là font partie d'une version obsolète d'un combat spécial, que vous verrez un jour en jeu, espérons le. (ou que quelqu'un le verra)
Pour ajouter cette attaque, j'ai été la chercher dans wall market, comme sur ce screenshot:
Image

Et je l'ai copié manuellement dans proud clod.
L'attaque Mog attack est en fait l'attaque skewer de GI spector, simplement renommée, car j'ai utilisé le GI model comme base d'animations pour faire le model de cette version du mog.
J'oubliais de vous dire, voici comment sont assignées les attaques de Mog dans cette version:
Image

O5 est l'animation "cast spell" qui va avec le model, et O3 est son animation d'attaque physique. Je vous le disais dans la partie 1, tous les models n'ont pas les mêmes animations, et certains en ont plus ou moins, selon les différents mouvements qui ont été prévus pour eux.
Tous n'ont pas d'animation "cast spell" par exemple, encore moins ceux qui ont des animations de fuites, ect... Soyez prévoyants, et étudiez bien les capacités d'animations d'un ennemi avant de vous décider à l'utiliser.


Allez, l'ia.
Si vous cliquez sur le menu "edit ennemy ai", vous risquez de voir quelque chose comme ça:
Image

Commençons avec le trés simple Choco, qui est surtout là pour le décor dans cet exemple, mais qui a des commandes intéréssantes à démontrer:
(Je prend mes notes de modding en anglais, et je n'ai pas traduis ce que j'appelle mes notes bruts, dans lesquelles je puise pour ce qui suit)
L'introduction-pre battle de Choco:

opcodes Arguments
12 2060
10 402C
80
60 01
90
12 2060
10 4023
80
60 00
90
12 0000
02 2080
02 4120
80
60 01E3
40
90
73

Ne criez pas, restez concentrés. L'ai de FF7 fonctionne en chaines d'opcodes et d'arguments, mais une fois que vous commencerez à les déchiffrer, ça ira mieux.
En apparté, il me semble que tout le moteur de FF7 fonctionne de cette façon, seulement, pour les field scripts il y'a le grand Makou Reactor fait par le génial Myst6re, qui nous évite d'avoir à regarder ces opcodes en face...

Déchiffrons donc:

opcodes Arguments
12 2060 = (self/Choco)
10 402C = (Flag:NoDeathAnimation)
80 = (Mask)
60 01 = (Enable NoDeathAnimation)
90 = (Store)

C'est la première chaine d'opcodes, et outre les notations à droite, concrètement elle signifie:
Self.NoDeathAnimation
Ceci empêche ce chocobo-ci de disparaitre une fois que son death counter s'active, à noter que cette chaine pourrait aussi bien être dans le dit death counter, mais c'était déja fourni avec la copie du chocobo vanilla et je l'ai gardé là.
Enfin, sachez que vous pouvez trouvez des définitions en plus de mes annotations parfois (souvent) prises sur le tas, dans les listes et liens en fin de tuto.

Chaine suivante:
12 2060 = (self/Choco)
10 4023 = (Flag:Targetable)
80 = (Mask)
60 00 = (Disable TargetableFlag)
90 = (Store)

Elle reproduit la même logique que Self.NoDeathAnimation, sauf que cette fois c'est pour désactiver la possibilité de cibler l'animal, par l'équipe joueur, les ennemis, et même les invocations et materia tout.
Donc cela se traduit par: Self.NotTargetable

Dernière chaine de ce premier exemple:

12 0000 = (create local variable that will define Ally)
02 2080 = (AllyMask)
02 4120 = (EnemyID)
80 = (Mask)
60 01E3 = (Choose AllyID)
40 = (Equal== If condition checked, condition check, hard to define in practical words but yet mandatory)
90 = (Store)
73 = (End)

Celle là définit le mog comme allié du chocobo, le code hexa 01E3 est l'id du mog.
Vous n'êtes pas obligés d'avoir ça dans toutes vos configurations de combat avec plus d'un ennemi, mais vous le serez si vous voulez coordonner certaines réactions, les faire se soigner entre eux, se couvrir, ou davantage encore.

Et je vous invite à la page du wiki listé plus bas sur les variables, mais en gros vous pouvez choisir entre 0000 et 003F pour créer ce genre de variables. Assurez vous seulement que l'ennemi n'utilise pas déja l'adresse que vous choisirez:
Range Usage
0x0000 - 0x03FF Random Access Variables. No initial value or significance to battle.

Oh, et 73 signale la fin d'un script mais on en reparlera.

On passe au main script de Choco, trés trés simple:

opcodes Arguments
12 2060 = (self/Choco)
11 4080 = (IdleAnimID)
80 = (Mask)
60 00 = (choose AnimID)
90 = (Store)
73 = (End)

Set Self.IdleAnimID 00, c'est ce que ça veut dire. Dans cette chaine, l'argument 00 est choisi pour être l'id d'animation idle du model de Choco, simplement.
En vérité, je ne pense même pas que cette chaine soit nécéssaire dans ce combat, car 00 est déja l'anim idle par default, et Choco n'est rien censé faire d'autre. La chaine serait nécéssaire seulement si je voulais une autre animation à la place de l'idle par défault.

J'ai seulement cette habitude de placer quelque chose dans le main script, même si ce n'est pas utile, comme ça, Choco dans ce cas reste tranquille et ne cherche rien d'autre à faire. Mais je crois que ce serait déja le cas sans.
Ce restait une commande à démontrer, alors je la met avec le reste du tuto.

Fini pour Choco, on ne touche pas à son death counter, il est impossible à cibler rappelez vous, donc dans cet exemple ce n'est pas utile.

Au tour de Mog, plus compliqué.
Son pre-battle:
opcodes Arguments
93 Mog “Kupo!”
12 0000 = (create local variable that will define Ally)
02 2080 = (AllyMask)
02 4120 = (EnemyID)
80 = (Mask)
60 015D = (Choose AllyID)
40 = (Equal==)
90 = (Store)
73 = (End)


93 Mog “Kupo!”
93 est une ligne\string de combat, simplement. Print Message [Mog "Kupo!"]
Placé ici, le mog dira Mog “Kupo!” une fois au début du combat.

Attention, ça a l'air trés cool comme ça, et il n'y a pas si longtemps j'avais des ambitions de développer d'avantage l'aspect dialogues and cie pendant les combats...
Mais il y'a un gros problème. Placer de nouveaux 93 dans les ai provoquent des foutues "exceptions non gérées", et la seule façon de contourner ça est de copier des 93 existants dans d'autres ai.

Ce qui est Laborieux et capriceux. Soyez prudents avec cet opcode, c'est le meilleur conseil que je peux vous donner.

Quand à la seule et unqiue chaine qui suit, vous la reconnaissez peut être, c'est la même que celle de Choco pour définir le Mog comme allié, sauf que là c'est Choco qui est définit comme l'allié du Mog.

Les choses sérieuses, le main ai du Mog:
Code :

opcodes Arguments
02 2060 = (self\Mog)
03 4160 = (Hp)
80 = (Mask)
61 07D0 = (HEXADECIMAL 2000)
42 = (>=)
40 = (Equal== If condition checked, condition check, hard to define in practical words but yet mandatory)
71 0050 = (if Mog doesn't have >= 2000hp then Jump to second hp condition check)
72 0012 = (if Mog has >= 2000hp then Jump to 1/2 Chance attacks)
81 = (Random Word)
60 02 = (1/2 Chance)
34 = (modulo)
60 00 = (if random mod == 0)
71 002E = (if random mod != 0 then Jump to demi2 magic check)
72 001E = (if random mod == 0 then Jump to mog attack)
12 2070 = (target Mask)
02 20A0 = (target all opponents if used with a possible multiple targets command, or one random opponent otherwise)
90 = (Store)
60 20 = (call command)
61 021B = (mog attack command)
92 = (command execution)
72 00F5 = (Jump to pop, then to end)
02 2060 = (self\Mog)
03 4140 = (Mp)
80 = (Mask)
60 2B = (demi2 command)
86 = (MP cost)
42 = (>=)
40 = (Equal== If condition checked, condition check, hard to define in practical words but yet mandatory)
71 0097 = (if Mog doesn't have >= mp for demi2, then Jump to ???? magic check)
72 0040 = (if Mog has >= mp for demi2, then Jump to demi2 attack)
12 2070 = (target Mask)
02 20A0 = (target all opponents if used with a possible multiple targets command, or one random opponent otherwise)
82 = (Random bit) \\ nécéssary here to force the cast on one opponent only
90 = (Store)
60 20 = (command execution)
60 2B = (demi2 command)
92 = (command execution)
72 00F5 = (Jump to pop, then to end)
02 2060 = (self\Mog)
03 4160 = (HP)
80 = (Mask)
61 01F4 = (HEXADECIMAL for 500)
45 = (<)
40 = (Equal== If condition checked, condition check, hard to define in practical words but yet mandatory)
71 00D9 = (if Mog has between 500 and 1999 hp, then Jump to 1\4 attacks)
72 0062 = (if Mog has < than 500hp, then Jump to 1\3 attacks)
81 = (Random Word)
60 03 = (1/3 Chance)
34 = (modulo)
60 00 = (if random mod == 0)
71 006E = (if random mod != 0 then Jump to 60 01)
72 0076 = (if random mod == 0 then Jump to White wind magic check)
60 01 = (if random mod == 1)
71 00B8 = (if random mod != 1 then Jump to choco mog magic check)
72 0097 = (if random mod == 1 then Jump to ???? magic check)
02 2060 = (self\Mog)
03 4140 = (Mp)
80 = (Mask)
60 4B = (White wind command)
86 = (MP cost)
42 = (>=)
40 = (Equal== If condition checked, condition check, hard to define in practical words but yet mandatory)
71 0097 = (if Mog doesn't have >= mp for White wind, then Jump to ???? magic check)
72 0088 = (if Mog has >= mp for White wind, then Jump to white wind attack)
12 2070 = (target Mask)
02 2060 = (Target self\Mog)
90 = (Store)
60 20 = (call command)
60 4B = (White wind command)
92 = (command execution)
72 00F5 = (Jump to pop, then to end)
02 2060 = (self\Mog)
03 4140 = (Mp)
80 = (Mask)
60 58 = (???? command)
86 = (MP cost)
42 = (>=)
40 = (Equal== If condition checked, condition check, hard to define in practical words but yet mandatory)
71 001E = (if Mog doesn't have >= mp for ????, then Jump to mog attack)
72 00A9 = (if Mog has >= mp for ????, then Jump to ???? attack)
12 2070 = (target Mask)
02 20A0 = (target all opponents if used with a possible multiple targets command, or one random opponent otherwise)
90 = (Store)
60 20 = (call command)
60 58 = (???? command)
92 = (command execution)
72 00F5 = (Jump to pop, then to end)
02 2060 = (self\Mog)
03 4140 = (Mp)
80 = (Mask)
60 38 = (Choco mog command)
86 = (MP cost)
42 = (>=)
40 = (Equal== If condition checked, condition check, hard to define in practical words but yet mandatory)
71 0097 = (if Mog doesn't have >= mp for choco mog, then Jump to ???? magic check)
72 00CA = (if Mog has >= mp for choco mog, then Jump to choco mog attack)
12 2070 = (target Mask)
02 20A0 = (target all opponents if used with a possible multiple targets command, or one random opponent otherwise)
90 = (Store)
60 20 = (call command)
60 38 = (choco mog summon command)
92 = (command execution)
72 00F5 = (Jump to pop, then to end)
81 = (Random Word)
60 04 = (1/4 Chance)
34 = (modulo)
60 00 = (if random mod == 0)
71 00E5 = (if random mod != 0 then Jump to 60 01)
72 001E = (if random mod == 0 then Jump to mog attack)
60 01 = (if random mod == 1)
71 00ED = (if random mod != 1 then Jump to 60 02)
72 002E = (if random mod == 1 then Jump to demi2 magic check)
60 02 = (if random mod == 2)
71 00B8 = (if random mod != 2 then Jump to choco mog magic)
72 0097 = (if random mod == 2 then Jump to "????" magic check)
91 = (Pop)
73 = (End)

Hm, j'avais prévu un résumé en quelques lignes de codes d'abord mais je me rend compte qu'il peut tromper un débutant du fait de son aspect 'résumé'.
Donc je le supprime et je passe directement au décorticage.

Première chaine:
Code :

02 2060 = (self\Mog)
03 4160 = (Hp)
80 = (Mask)
61 07D0 = (HEXADECIMAL 2000)
42 = (>=)
40 = (Equal== If condition checked, condition check, hard to define in practical words but yet mandatory)
71 0050 = (if Mog doesn't have >= 2000hp then Jump to second hp condition check)
72 0012 = (if Mog has >= 2000hp then Jump to 1/2 Chance attacks)


En plus des annotations, ça veut dire en gros:
If ((Mog HP >= 2000) Then
Mais passé la condition elle même, l'important est dans les deux derniers opcodes, 71 et 72.
Vous pouvez lire dans les annotations à droite comment ils se traduisent, placés dans cette chaine.

71 veut basiquement dire: if false Then jump to
72 est un Jump 'absolu', c'est à dire que le script sautera toujours à son adresse désigné dans l'argument.
Sauf si un Jump 71 est placé avant lui, car si la condition est false, le script sautera à l'adresse désignée par le 71 avant d'atteindre le 72, qui donc dans ce placement peut agir en guise de 'if true'.

Si je vous dis ça, c'est parce qu'il existe un Jump 70. Lisez donc sa définition dans les listes en fin de tuto plus tard, mais voilà mon conseil:
Ignorez le, évitez le, à moins d'être surs de vous. Si vous travaillez une ai existante et que les 70 semblent remplir leur rôle, laissez les comme tels, mais sinon:
Préférez un 72 précédé d'un 71 pour vos propres codes.

Ici, le 71 va sauter à l'adresse 0050, qui est le début d'une autre chaine que nous allons voir plus bas, si le mog a moins de 2000hp.
Et si il a 2000 hp ou plus, le 72 va sauter une ligne plus bas, là:

Seconde Chaine:
81 = (Random Word)
60 02 = (1/2 Chance)
34 = (modulo)

Appelez ça le setup pour une simple alternance random entre deux attaques.
1/2 Chance to do x or y.

Troisième chaine:
Code :

60 00 = (if random mod == 0)
71 002E = (if random mod != 0 then Jump to demi2 magic check)
72 001E = (if random mod == 0 then Jump to mog attack)


60 00, dans ce contexte signifie ce qui est écrit à sa droite.
Et si la valeur random n'est pas égale à 0, le script va choisir l'attaque demi2, en commençant par vérifier que l'animal a assez de mp en stock, ce que nous allons voir trés vite.
Si la valeur random est 0, le script va choisir l'attaque physique mog attack.
Qui est juste en dessous

Quatrième chaine:
Code :

12 2070 = (target Mask)
02 20A0 = (target all opponents if used with a possible multiple targets command, or one random opponent otherwise)
90 = (Store)
60 20 = (call command)
61 021B = (mog attack command)
92 = (command execution)
72 00F5 = (Jump to pop, then to end)


C'est l'attaque Mog attack. Vous allez vite vous habituer à voir ces lignes si vous faites beaucoup d'ia, mais quelques points que je me dispenserai de répéter ensuite:
02 20AO cible les opposants comme décrit dans son annotation.
02 2060 cible le propriétaire du script, comme on va le faire dans la commande White wind un peu plus bas.
02 2080 cible les alliés du propriétaire du script.
Tout ça est dans les listes en fin de tuto, mais c'est assez simple alors je le répéte ici.

60 20 dans ce contexte est en gros call command oui, je m'arrête dessus parce que j'ai lu qu'on ne peut appeler que des commandes réservés aux ennemis avec l'argument 20.
Maintenant, j'ai peut être mal compris, mais vous allez le voir j'utilise aussi l'argument 20 pour appeler des commandes jouables comme demi2, white wind et choco\mog, et ça marche trés bien.
Je n'ai pas encore eu à utiliser un autre argument pour appeler une commande quelle qu'elle soit. Faites moi signe si vous savez quelque chose contre lequel je n'ai pas trébuché.

61 021B, c'est l'attack ID du mog attack, poussée avec un opcode 61 parce que la dite ID requiert plus de deux lettres pour être entrée. Rappelez vous, quand vous poussez une valeur de 2 lettres, l'opcode 60 suffit. Quand c'est 3 ou 4, il faut un 61.

Enfin, arrêtons nous sur le jump, qui va sauter vers la commande 91 (Pop), l'avant dernière ligne du script. Si ce n'était pas une attack avec des chances random, on pourrait se passer du 91 et sauter directement au 73, puis le script reprendrait au début.
Le 91 reset en quelque sorte le ou les randoms mods d'un script, en générant une nouvelle valeur à chaque fois.

Cinquième chaine:
Code :

02 2060 = (self\Mog)
03 4140 = (Mp)
80 = (Mask)
60 2B = (demi2 command)
86 = (MP cost)
42 = (>=)
40 = (Equal== If condition checked, condition check, hard to define in practical words but yet mandatory)
71 0097 = (if Mog doesn't have >= mp for demi2, then Jump to ???? magic check)
72 0040 = (if Mog has >= mp for demi2, then Jump to demi2 attack)


Une nouvelle condition, cette fois pour les mp du mog par rapport au cout de demi2:
If (Mog MP >= demi2 cost) Then
Avec le jump 71 pour faire office de 'if false'.

Sixième chaine:
Code :
 
12 2070 = (target Mask)
02 20A0 = (target all opponents if used with a possible multiple targets command, or one random opponent otherwise)
82 = (Random bit) \\ nécéssary here to force the cast on one opponent only
90 = (Store)
60 20 = (command execution)
60 2B = (demi2 command)
92 = (command execution)


L'attaque demi2, vous remarquerez que son attack id est ici poussée par un opcode 60.
Ah, et notez aussi le 82, juste avant le Store 90. Sans ce random bit, le sort visera l'équipe entière et non un seul opposant.

A partir d'ici, tentons d'accélérer car ça commence à faire bien long.

Septième et huitième chaines:
Code :

02 2060 = (self\Mog)
03 4160 = (HP)
80 = (Mask)
61 01F4 = (HEXADECIMAL for 500)
45 = (<)
40 = (Equal== If condition checked, condition check, hard to define in practical words but yet mandatory)
71 00D9 = (if Mog has between 500 and 1999 hp, then Jump to 1\4 attacks)
72 0062 = (if Mog has < than 500hp, then Jump to 1\3 attacks)
81 = (Random Word)
60 03 = (1/3 Chance)
34 = (modulo)

Nouvelle condition, if mog hp < 500
Et nouveau générateur random, cette fois pour trois attaques.

Neuvième chaine:
Code :

60 00 = (if random mod == 0)
71 006E = (if random mod != 0 then Jump to 60 01)
72 0076 = (if random mod == 0 then Jump to White wind magic check)
60 01 = (if random mod == 1)
71 00B8 = (if random mod != 1 then Jump to choco mog magic check)
72 0097 = (if random mod == 1 then Jump to ???? magic check)


Dernier arrêt important. Ici c'est un peu moins simple et plus intéréssant car on jongle avec plus de deux attaques.
Si la valeur est à zéro, le script saute directement au white wind magic mp check.
Le 71 par contre DOIT sauter à l'adresse du prochain check, 60 01, if random mod == 1!
Qui suivra la même logique pour déterminer entre choco mog et ????.

Finalement, ici c'est réglé pour équivaloir à une chance sur 3 par attaque. Mais si vous augmentiez les probabilités, comme ça dans la huitième chaine:
60 10 = (1/16 Chance)
34 = (modulo)

Cela équivaudrait à donner 14\16 chance à l'attaque choco\mog. N'oubliez pas que proud clod 'pense' en hexadécimal, et que 10 = 16.

Les chaines 10, 11 et 12 sont les attaques white wind, ???? et choco\mog avec leur mp check respectifs, sur lesquels je n'ai rien de plus à dire d'instructif, donc sautons enfin à la fin:

Code :

81 = (Random Word)
60 04 = (1/4 Chance)
34 = (modulo)
60 00 = (if random mod == 0)
71 00E5 = (if random mod != 0 then Jump to 60 01)
72 001E = (if random mod == 0 then Jump to mog attack)
60 01 = (if random mod == 1)
71 00ED = (if random mod != 1 then Jump to 60 02)
72 002E = (if random mod == 1 then Jump to demi2 magic check)
60 02 = (if random mod == 2)
71 00B8 = (if random mod != 2 then Jump to choco mog magic)
72 0097 = (if random mod == 2 then Jump to "????" magic check)
91 = (Pop)
73 = (End)


Que dire? Peut être, si vous n'avez pas fais attention avant, que ce dernier générateur random pour cette fois quatres attaques se déclenchent quand le mog a entre 500 et 2000 hp, selon la logique du script.

Tour rapide du death counter script du mog, pour une dernière commande qui peut être utile:
opcodes Arguments
12 2060 = self\Mog
10 402C = NoDeathAnimation Flag
80
60 01 = enable NoDeathAnimation Flag
90
12 0000 = ally variable
10 4024 = MainScriptActive Flag
80
60 00 = disable mainscriptactive Flag
90
73

La première chaine est la même qui activait le flag NoDeathAnimation chez Choco.
Et la seconde désactive Choco une fois les hp de mog tombé à 0, sinon le combat ne peut pas finir vu que le chocobo était 'un élément de décor'.
Ce genre de tour peut servir croyez moi.


Bon ben, je pourrais vous donner quelques exemples de davantage de commandes, mais ça fait déja un bien long tutorial, et vous avez maintenant vos méninges armés d'une meilleure compréhension, j'espère, ainsi que les listes qui suivent, et les scripts vanilla dans lesquels fouiller...


Annexe

Lien vers une database qui vous servira:
https://wiki.ffrtt.ru/index.php?title=FF7/Battle/Battle_Scenes/Battle_Script

Ennemy mechanics de Terrence Ferguson:
https://gamefaqs.gamespot.com/ps/197341-final-fantasy-vii/faqs/31903

Lien vers une liste des backgrounds(décors de combats), avec leur nom de models, ce à quoi ils correspondent, et leur nombre hexa dans proud clod:
https://mega.nz/file/aZFC2azZ#TwalzmlViUudarnyfnsVGZ5f6CnaBye9EQ8aPqucJa0

Et une liste compilée quelque part dont je ne retrouve plus le lien, je suis presque sur de l'avoir copié d'un post de Sega Chief cela dit:
Texte caché : cliquez sur le cadre pour l'afficher


[Ce message a été édité par son auteur pour la dernière fois le 13 mai 2020 à 01:07]
622 messages
Voir le profilLien du message Aller en haut de page
mexico
image du rang
Hard Modder


Posté le 08 mai 2020 à 08:38 | Sujet : Tutorial FF7: Proud clod et l'ai de combat
C'est très bien, faudrait juste que tes images soient apparentes, c'est plus agréable pour la lecture. Et non, elles ne sont pas inutiles. Au contraire, elles permettent au lecteur de ne jamais se perdre dans tes explications.
14177 messages
Voir le profilLien du message Aller en haut de page
Quid?
image du rang
Jeune Cloud


Posté le 08 mai 2020 à 15:43 | Sujet : Tutorial FF7: Proud clod et l'ai de combat
Ah, j'ai enfin découvert la fonction img... Faut avouer, ça rend un peu mieux, mais du coup je me dis que je n'ai peut être pas pris assez de screens.

Je vais en reprendre un ou deux tout à l'heure, quand je finirai la partie 2. (D'un autre côté, la personne censée s'échiner à comprendre est aussi censée avoir son propre proud clod sous les yeux, il faut dire)
622 messages
Voir le profilLien du message Aller en haut de page
mexico
image du rang
Hard Modder


Posté le 08 mai 2020 à 15:45 | Sujet : Tutorial FF7: Proud clod et l'ai de combat
Oui mais c'est plus simple à suivre quand même, c'est pas comme si Proud Clod était super limpide.
14177 messages
Voir le profilLien du message Aller en haut de page
Quid?
image du rang
Jeune Cloud


Posté le 09 mai 2020 à 01:14 | Sujet : Tutorial FF7: Proud clod et l'ai de combat
Et voilà, partie 2 postée, m'a l'air lisible. J'ai l'impression d'avoir oublié un ou deux points peut être. Faut que j'arrête d'écrire des tutorials, c'est dur.

C'est quand même beaucoup mieux que de chercher des infos disséminées et d'étudier les scripts vanilla avec pas grand chose comme référence aprés tout.
622 messages
Voir le profilLien du message Aller en haut de page
mexico
image du rang
Hard Modder


Posté le 09 mai 2020 à 09:00 | Sujet : Tutorial FF7: Proud clod et l'ai de combat
Bah franchement bravo et merci pour l'effort, c'est du beau boulot !
14177 messages
Voir le profilLien du message Aller en haut de page
Quid?
image du rang
Jeune Cloud


Posté le 09 mai 2020 à 18:40 | Sujet : Tutorial FF7: Proud clod et l'ai de combat
Merci à toi. J'espère que quelqu'un s'en servira et ne galèrera pas tant que le vieux quid pour s'initier à l'ai.

J'ai la flemme de traduire en anglais, ce qui boosterais sans doute les chances que quelqu'un s'en serve mais pour l'instant mes tutos vont rester une exclusivité française, je traduirai peut être quand j'aurai fini mon mod.
622 messages
Voir le profilLien du message Aller en haut de page
mexico
image du rang
Hard Modder


Posté le 09 mai 2020 à 19:23 | Sujet : Tutorial FF7: Proud clod et l'ai de combat
Par contre, message pour Acro ou Jeff, ce serait pas mal d'épingler ces deux tutos d'autant que les deux post-it sur ce forum sont complètement obsolètes. ^^
14177 messages
Voir le profilLien du message Aller en haut de page
Quid?
image du rang
Jeune Cloud


Posté le 13 mai 2020 à 01:14 | Sujet : Tutorial FF7: Proud clod et l'ai de combat
J'en ai eu marre de chercher manuellement quel background\décor de combat est quoi, surtout maintenant que je me suis mis à bricoler les dits décors dans Kimera, j'ai fais ma propre liste pour aller plus vite, et ajoutée à l'annexe.

En téléchargement pour ne pas gonfler davantage le tuto.
622 messages
Voir le profilLien du message Aller en haut de page
Guix
image du rang
Jeune Cloud


Posté le 17 juin 2021 à 06:14 | Sujet : Tutorial FF7: Proud clod et l'ai de combat
mexico a dit :
Pour les combats, il faut utiliser Proud Clod mais autant te le dire tout de suite : c'est une belle merde bien buggée, tu vas galérer !
Bon bah - plus d'un an après - je confirme, c'est galère et c'est buggué.

Dès que je veux modifier la moindre valeur dans l'AI, je me tape une exception non gérée, et apparemment c'est un problème qui n'a jamais été pleinement réglé si j'ai bien compris.

J'ai juste pu bricoler 2 ou 3 conneries pour l'instant :

Image
503 messages
Voir le profilLien du message Aller en haut de page
mexico
image du rang
Hard Modder


Posté le 17 juin 2021 à 06:20 | Sujet : Tutorial FF7: Proud clod et l'ai de combat
C'est déjà pas mal mais ça fait long un an juste pour ça.
14177 messages
Voir le profilLien du message Aller en haut de page
Guix
image du rang
Jeune Cloud


Posté le 17 juin 2021 à 07:36 | Sujet : Tutorial FF7: Proud clod et l'ai de combat
mexico a dit :
C'est déjà pas mal mais ça fait long un an juste pour ça.
J'ai pris une année sabbatique, j'avais plus de 200 jours à poser !
503 messages
Voir le profilLien du message Aller en haut de page
Quid?
image du rang
Jeune Cloud


Posté le 04 juillet 2022 à 19:33 | Sujet : Tutorial FF7: Proud clod et l'ai de combat
Salut, comment ça va?
Je repassais par ici la semaine dernière aprés avoir essayé FF2, donc naturellement mes souvenirs de FF7 modding se sont remis au travail, innarrêtables aprés avoir relu mes propres tutos.

Et depuis j'ai ressorti tout ce qui me restait de backups non corrompus pour m'y remettre, par pur plaisir avant tout parce que modder c'est fun.

Guix a dit :

Dès que je veux modifier la moindre valeur dans l'AI, je me tape une exception non gérée, et apparemment c'est un problème qui n'a jamais été pleinement réglé si j'ai bien compris.


(Au cas où tu n'aurais pas résolu ces premiers soucis depuis)

Oui et non, ce dépend de la fonction de l'opcode, il y'en a quelques uns trés pénibles avec les exceptions non gérées mais ce ne sont pas les plus utilisés.

A mon avis tu as dû faire des doubles clicks trop rapides, ce qui provoque de ces 'exceptions non gérés' dans les champs ai, ou essayer de valider tes changements par un autre click alors qu'il faut appuyer sur entrer.
Et pour séléctionner un champ, il faut un seul click qui surligne d'abord(en bleu), puis un deuxième pas trop rapide sur le même champ.

Je reconnais que c'est une galère quand même, il faut de la patience pour se faire aux 'délicatesses' de cette princesse de proud clod.
622 messages
Voir le profilLien du message Aller en haut de page
Acro
image du rang
Administrateur


Posté le 04 juillet 2022 à 20:03 | Sujet : Tutorial FF7: Proud clod et l'ai de combat
Aaah, toujours un plaisir de te revoir dans le coin !
J’espère toujours que tu puisses aller au bout de ton projet !

  Patch de retraduction de Final Fantasy VII, Néo-Midgar (inclus dans le pack SYW)

57928 messages
Voir le profilLien du message Aller en haut de page
Quid?
image du rang
Jeune Cloud


Posté le 05 juillet 2022 à 00:17 | Sujet : Tutorial FF7: Proud clod et l'ai de combat
On va essayer, Acro, on va essayer.
Si je peux recréer mes combats et modèles perdus, et tranquillement depuis quelques jours ça commence à se refaire...

Content de te revoir aussi.
622 messages
Voir le profilLien du message Aller en haut de page
Acro
image du rang
Administrateur


Posté le 05 juillet 2022 à 00:24 | Sujet : Tutorial FF7: Proud clod et l'ai de combat


Courage ! Le travail est toujours mieux fait quand il est refait.

  Patch de retraduction de Final Fantasy VII, Néo-Midgar (inclus dans le pack SYW)

57928 messages
Voir le profilLien du message Aller en haut de page
Page : 1
Qui est en ligne ?Lecteur audio
1 utilisateur en ligne dans les 5 dernières minutes
Utilisateur connecté : yuyu
Anniversaire de megahell (38 ans)
Lecteur désactivé (à activer dans le profil)
Jeux entre forumeurs
Le Tarot des Anciens



Inscrits : Yui, yuyu, RJ, Acro
Skull King



Inscrits : Acro, yuyu, RJ
Interrupted by Hanabi



SpeciNames



Inscrits : Orthello
Le Démineur de MSN