Bonjour,
Me voilà de retour avec un tout nouveau tutorial consacrer au modification du Wormpot (je ne sais pas si je devais le metre ici, je n'ai trouvé aucun autre endroit
).
Dans ce tutorial, nous allons apprendre à :
- Modifier un dès choix du Wormpot,
- Effectuer des actions sur l'inventaire des équipes en jeu,
- Effectuer des actions sur le tweak.xml (Vitesse des worms, Jetpack...) ou sur le WeapTwk.xml (propriétés des armes...),
- Effectuer des actions sur les noms ou les habits des worms,
- Débuter dans le codage du Lua.
Bon alors commençons :
I. Débuter le Lua :Je sais que ce n'est pas la partie la plus amusante mais il faut connaitre un peu de code avant de se lancer dans les modification.
Pour commencer, vous devez savoir que le Lua est un codage qui
ressemble beaucoup aux autre, si vous connaissez déjà le C, le C++,
l'actionscript ou même le python, vous aurrez moins de mal à comprendre
le Lua car beaucoup de fonctions se ressemblent.
1. Les Variables :
Déjà, les variables, ce sont les bases nécéssaire pour modifier les fonctions du wormpot.
[ i ] Les variables sont des valeur (nombres ou mots) qui sont assignées à des mots ou à des lettres.
Ils en existes plusieur types mais pour ce qui nous intéresses, je vais en regrouper certaines :
Il y a les
variables numériques :
- Code:
-
Vari = 12
Comme son nom l'indique, cette variable sert à contenir des nombres.
Il y a les
variables textuels appellés aussi
strings :
- Code:
-
Vari = "mon texte"
Cette variable permet de mémoriser du texte.
Il y a les
Booléans :
- Code:
-
Vari = true
Les booléans peuvent contenir 2 valeur :
true ou
false qui correspondent en français à
Vrai ou
Faux.
Voilà pour ce qui est les variables, vous n'aurrez besoin de rien d'autre les concérnant pour le Wormpot.
2. Les Conditions :Les conditions sont les moyens d'éffectuer des actions en fonction d'autres actions.
Il y a la condition
if ... then ... end :
- Code:
-
if Vari == 5 then
Option = true
end
On peut voir que la fonction s'étend sur plusieur lignes. Pour traduire cette fonction, on peut dire que
"Si Vari est strictement égale à 5, la valeur de Option sera true." Je pense que celà est facilement compréensible.
[ i ] on voit qu'il y a 2 = entre Vari et 5, c'est pour définir que les 2 = soit reconnu en tant qu'opérateur et non qu'il servent à définir une valeur a Vari. Il en existe plusieur :
- Code:
-
Vari == 5 : Vari est strictement égale à 5
Vari > 5 : Vari est strictement supérieur à 5
Vari >= 5 : Vari est supérieur ou égale à 5
Vari < 5 : Vari est strictement inférieur à 5
Vari <= 5 : Vari est inférieur ou égale à 5
Vari ~= 5 : Vari est différent de 5
Il y a la condition
else et
else if :
- Code:
-
if Vari == 5 then
Option = true
else if Option == false then
Vari = 0;
else
Vari = -1
end
On devine facilement : else = sinon, autrement dit Si la première condition (Vari == 5) n'est pas respecté, on regarde si la deuxième (Option == false) est respecté et si elle ne l'est pas, on assigne -1 à Vari.
3. Les Boucles :Cette partie est moins importante si vous ne voulez modifier que le Wormpot mais elle peut-être utile pour les autres script.
Les boucles sont les fonction qui permettent de répéter une action plusieur fois :
- Code:
-
while Vari != 5 do
Vari = Vari + 1
end
Signifi
"Tant que Vari n'est pas égale à 5, Vari sera égale à Vari + 1 (il augmentera de 1 à chaque fois que la boucle recommencera)." Je resterais assez bref sur cette partie car elle n'est pas spécialement nécéssaire.
II. Votre 1er slot :Le but de cette première partie de modification sera créer un slot Moonwalk (les worms marcheront à l'envers
).
1. Introduction :Pour commencer, entrez dans le dossier script du dossier data de worms 4 et ouvrez le fichier Wormpot.lua.
[ i ] Vous pouvez déjà remarquer que la plupart des fonction présenté avant sont visible.
2. Décryptage :Allez jusqu'aux lignes
- Code:
-
if Wormpot.DoubleDamage == true then
SetData("DoubleDamage",1)
end
Ici, il y a des fonction que l'on connait et d'autre que l'on connait moins pour le moment
.
if Wormpot.DoubleDamage == true then
...
endLà, on reconnait tout
: le if ... then ... end, on voit aussi un Booléan Wormpot.DoubleDamage qu'on peut déduire comme l'activité du slot Dégat Doublé.
SetData("DoubleDamage",1)Ici, on reconnait moins, on peut pensé à une fonction mais pas sùr.
DoubleDamage est en faite une variable externe du fichier lua, elle se trouve dans un autre fichier qui n'est pas lua et la différence avec une variable normale, c'est que l'on ne peut pas la définir en "DoubleDamage = 1", mais on doit la définir en mettant SetData("DoubleDamage",1).
[ i ] Grace à cette technique, vous pouvez modifier toutes les variables du tweak.xml par le WormPot.
3. Création du Solt :Nous y voilà donc, la création de votre premier slot en homage au "roi de la pop" récement décédé : le mod
Moonwalk Worms.
[ i ] A SAVOIR : vous connaissez certainement la variable de tweak.xml, "Worm.Walk.Speed" Elle défini à la base la vitesse des worms, mais ici le but va être de la rendre négative de façon à faire reculer le worms.Rendu à ce point, vous avez toutes les cartes en mains pour pouvoir créer votre slot Moonwalk (Attention, par "créer" j'entend bien "remplacer un slot éxistant", il est malheureusement impossible d'ajouté un nouveau slot à l'heure actuelle), Je vous laisse donc faire votre slot avant de passer à la correction
...
DRIIIING !!! Je ramasse les copie
, Alors voyont la correction sans plus attendre :
- Spoiler:
Voilà le code
- Code:
-
if Wormpot.DoubleDamage == true then
SetData("Worms.Walk.Speed",-0.0062)
end
J'éspère que cette partie vous aura été utile et que vos pack de wormpot vont bientôt voir le jour
.
III. Création d'un "Slot avancé" :Le but de cette partie est de savoir créer un slot avancé se nommant "Armes sans gravité"
.
1. Introduction :Avant de commencer, je vais vous éxpliquer plus en détails ce que nous allons faire.
Je suppose que vous vous êtes déjà poser la question "Worms 4 fonctionne avec du xml et du lua, pourquoi Team17 n'a pas utilisé un seul codage à la place des 2 ?" Eh bien c'est tout simplement parceque ces 2 codages ont des fonctions très différentes :
Le xml est en faite un grand regroupement de variables (bah oui, quand vous tweaker, vous changer ces valeurs de façon à ce que le jeu éfféctue une autre action en lisant ce fichier), il peut y avoir des variables numérique, des variable de texte, des booléans (true/false)... Et des variables contenant d'autres variables !!! Eh oui, c'est plus pratique pour le tri
[ i ] Attend, où est-ce que tu voix des variables contenant d'autres variable toi ?Dans le fichier xml le plus connu du forum, j'ai nommé le
Weaptwk.xml.
Vous ne voyez toujours pas ? Ah tout de même, les variables tels que "kweaponbazooka" ! Eh oui, toutes les variables d'armes contienent une cinquantaine de variables, que ce soit "scale" ou "DamageRadius", ce sont des variables dans une autre variables.
Le nom de ces variables contenant d'autre variables est (un mot qui va sans doute vous rappeller des choses)
Container.
Le lua lui est un language différent car (dans le cas présent) il éfféctue
des actions en fonction d'autres action. par exemple
"Si une roue du wormpot est sur dégat doublé, Alors tous les dégats du jeu seront multipliés par 2", je simplifie là, mais c'est dans le principe.
Pourquoi je vous ai expliquer ça ? tout simplement parce que nous allons nous attaquer à la modification d'arme par le wormpot.
[ i ] Et alors ? Il suffirait de mètre SetData("kWeaponBazooka.Scale", 10) non ?Eh bien non justement, les container, ça ne se modifie pas comme n'importe quel variable
.
2. Décryptage :Je ne vais pas tourner autour du pot, nous allons faire comme si nous ne connaissions rien
:
Allons voir vers la fin du document ceci :
- Code:
-
function SetWeaponWind(ContainerName, IsAffectedByWind)
local ContainerLock, Container = EditContainer(ContainerName)
Container.IsAffectedByWind = IsAffectedByWind
CloseContainer(ContainerLock)
end
Hum... nous pouvons remarqué que nous avons ici une fonction.
[ i ] Qu'est-ce que c'est que ça ?Alors une fonction, c'est ce qui nous permet de répéter un action plusieur fois.
Par exemple :
- Code:
-
function SetMaxAltitudeNull()
SetData("JetPack.MaxAltitude", 0);
end
Pour mêtre l'altitude du jetpack à 0 par exemple, et pour l'utiliser :
- Code:
-
if ... then
SetMaxAltitudeNull();
end
Tout simplement, et voilà vous avez une fonction
.
[ i ] Bah oui mais c'est inutile, les valeurs ne change jamais.Oh que si, les valeurs peuvent changer grace à ce que l'on peut appeller un "Système de variable interne" aux fonction (Oui c'est barbare mais ça marche
). Il s'agit en fait de variable créer pour la fonction et qui ne sont utilisé uniquement DANS la fonction.
Par exemple :
- Code:
-
function SetMaxAltitude(AltitudeVariable)
SetData("Jetpack.MaxAltitude", AltitudeVariable);
end
Et on l'utilise de la même manière dans notre code :
- Code:
-
if ... then
SetMaxAltitude(0)
end
Tout simplement ^^
/!\ Une fonction est toujours défini à l'extèrieur "d'autres fonctions".Revenons à notre code maintenant
- Code:
-
function SetWeaponWind(ContainerName, IsAffectedByWind)
local ContainerLock, Container = EditContainer(ContainerName)
Container.IsAffectedByWind = IsAffectedByWind
CloseContainer(ContainerLock)
end
On voit donc qu'il s'agit d'une fonction avec 2 variables, ContainerName et IsAffectedByWind.
Maintenant, regardons la 1ère ligne de cette fonction :
- Code:
-
local ContainerLock, Container = EditContainer(ContainerName)
On peut en déduire que ici, on "ouvre" un Container pour l'éditer. Ce n'est pas hyper évident à comprendre mais on admettera que cette ligne sert à ouvrir le container "ContainerName" (qui est le nom du container défini par notre fonction
) afin d'en éditer les valeurs.
Et comme tout ce que l'on ouvre, on doit le fermer, on doit alors voir dans la fonction :
- Code:
-
CloseContainer(ContainerLock)
Qui sert donc à fermer le container portant la variable "ContainerLock"
Ca va ? vous comprenez à peu prés ?
Si vous ne comprenez pas vraiment comment marche ce système de container, ce n'est pas grave, il vous suffit juste d'admettre que celà marche
.
Ensuite, pendant que notre container est ouvert on voit ceci :
- Code:
-
Container.IsAffectedByWind = IsAffectedByWind
Que voit-on ici ? on voit que l'on défini une variable. On voit aussi que la valeur de cette variable est le second argument de notre fonction
.
/!\ La valeur "Container.IsAffectedByWind" ne contient pas le second argument, il s'agit d'une variable à part entière et non pas un valeur tel que "Container.0" (si le second argument est égale à 0 par exemple)Donc en somme, si on traduit la fonction dans son intrégalité gràce à cet exemple :
- Code:
-
SetWeaponWind(kWeaponGrenade, true)
Il se passera ceci :
- La fonction ouvre le container "kWeaponGrendade",
- Elle défini la variable <IsAffectedByWind> par true,
- Elle ferme le container précédement ouvert.
Le résultat dans le jeu,
la grenade sera affécté par le vent.[ i ] Okay j'ai compris, mais à quoi sa sert de metre tout cela dans une fonction ?Alors, je vais vous expliquer la différence par un exemple :
Code SANS fonction :
- Code:
-
...
local ContainerLock, Container = EditContainer(kWeaponGrenade)
Container.IsAffectedByWind = true
CloseContainer(ContainerLock)
...
Code AVEC fonction :
- Code:
-
...
SetWeaponWind(kWeaponGrenade, true)
...
Compris ? =)
[ i ] Ouais, pour 2 lignes en moins franchement...Okay okay, un autre exemple :
Code AVEC fonction :
- Code:
-
...
SetWeaponWind(kWeaponArmeDeEasytwk, true)
SetWeaponWind(kWeaponArmeDeTweakMan, true)
SetWeaponWind(kWeaponArmeDeDamageMagnitude, true)
SetWeaponWind(kWeaponArmeDeKilburn, true)
SetWeaponWind(kWeaponArmeDeMaycne, true)
...
Maintenant, imaginez la taille du code SANS fonction...
Vous voyez donc l'utilité des fonction =)
3. Création d'un slot "Armes Sans Gravite" :Bon maintenant, je vais vous donner un petit exercice à faire
Vous allez me créer (remplacer) un slot qui aura pour propriété de suprimer la gravite de la plupart des armes (n'allez pas me retirer la gravité de l'attaque aérienne !).
Vous avez à présent toutes les cartes en mains pour réussir cet éxercice mais je vais tout de même vous donner 2 indices si jamais vous avez du mal :
1er Indice :
- Spoiler:
La Balise gérant la gravité des armes est <IsAffectByGravity>.
2nd Indice :
- Spoiler:
Vous devez créer une fonction pour pouvoir l'appliquer à toutes les armes que vous voulez affecter
.
Vous avez réussi ? non ? alors voici la correction :
- Spoiler:
Voici le code à mêtre comme fonction à la fin du document :
- Code:
-
function SetWeaponGravity(ContainerName, IsAffectedByGravity)
local ContainerLock, Container = EditContainer(ContainerName)
Container.IsAffectedByWind = IsAffectedByGravity
CloseContainer(ContainerLock)
end
Et Voici le code de votre slot :
- Code:
-
if ([...] == true) then
SetWeaponGravity(kWeaponBazooka, true)
SetWeaponGravity(kWeaponGrenade, true)
SetWeaponGravity(kWeaponHolyHandGrenade, true)
[...]
end
Et voilà, ce laborieux tutorial se termine enfin, j'éspère qu'il sera utile et je verais bientot des pack de wormpot sur le forum =)
EDIT Maycne: Passage en Post-it.