Tuto - INFO - Index des tutos de Beeratwork
Comme je fais des émules sur les armes qui évolue, je me suis dit que j'allais faire un tuto pour expliquer le principe d'évolution que j'utilise.
Voici comment faire
"SCRIPT - EVOLUTION D'UNE ARME A LA BEERATWORK"
Donc crédits svp
Pour faire "simple", je vais d'abord expliquer en quelque mots ce qui se passe et je vais commenter plus en détails quelques scripts de Sang Noir.
Les scripts sont de type objet. Je suppose que vous avez un minimum de connaissance en script et en création d'objet pour suivre ce tuto.
Dans le mod Sang Noir, le joueur tue un déserteur pour s'emparer de son épée. Lorsqu'il s'en empare pour la 1ère fois, un message apparait (script AARSangNoir00Script commentaires 00->02). S'il s'équipe de l'épée, il ne se passe rien, mais la seconde fois, un message apparaît (script AARSangNoir00Script commentaires 03->05). Si le joueur s'est équippé 3x de l'épée et qu'il a le niveau requis en destruction, on attend 15s de temps réel avant de passer au niveau suivant (script AARSangNoir00Script commentaires 06->14).
► Afficher le texte
Code : Tout sélectionner
ScriptName AARSangNoir00Script
; script sur objet
float timer
short catch
short take
short DoOnce
short level
short OnPlay0
short step
short OnHorse
; 00.Lorsque l'arme est ajoutée au joueur
Begin OnAdd player
; 01.Par exemple, on compte maximum 10x, ce qui permet de faire 10 actions à chaque fois que le joueur prend l'épée.
if (catch <= 10)
set catch to catch + 1
endif
; 02.Ce message ne sera affiché qu'une seule fois
if (catch == 1)
MessageBox "Que fait donc là cette vieille lame ébréchée ?"
; MessageBox "What do therefore this old blade chipped ?"
endif
End
; 03.Lorsque le joureur s'équipe de Sang Noir
Begin OnEquip player
; 04.On compte maximum 10x, ce qui permet de faire 10 actions à chaque fois que le joueur s'équipe de l'épée.
if (take <= 10)
set take to take + 1
endif
; 05.Ce message ne sera affiché qu'une seule fois
if (take == 2)
MessageBox "Vous décidez de regarder cette arme avec un peu plus d'attention, vos doigts effleurent une ancienne gravure : Sang Noir"
; MessageBox "You decide to watch this weapon with a little more attention, your fingers touch an old engraving: Dark Blood"
endif
End
; 06. En cours de jeu
Begin GameMode
; Evolution vers le niveau suivant
; 07. L'évolution ne sera effective que si le joueur s'est équippé au moins 3x de l'épée
if (take > 3)
; 08.On fait le compte du nombre de Sang Noir que le joueur possède (peut-être a-t'il triché ?). Si il n'a pas zéro épée, alors on peut évoluer s'il a le niveau requis en destruction.
set OnPlay0 to player.GetItemCount AARSangNoir00
if (OnPlay0 != 0)
if (player.GetBaseActorValue destruction >= 39 && level == 0)
set level to 1
endif
endif
; 09.Si le joueur a le niveau requis
if (level == 1)
; 10.On initialise un timer
if (step == 0)
set timer to 15
set step to 1
; 11.On décompte le temps
elseif (step == 1)
if (timer > 0)
set timer to timer - GetSecondsPassed
else
set step to 2
endif
; lorsque les 15s temps réel sont passée, on va pouvoir évoluer
elseif (step == 2)
; 12. Uniquement si le joueur n'a pas zéro épée
if (OnPlay0 != 0)
; 13.Si le joueur est à cheval, on initialise un timer sur 2s. Cela laisse le temps au joueur de descendre de cheval avant de lui ajouter l'épée.
if (player.IsRidingHorse == 1)
set OnHorse to 1
elseif (player.IsRidingHorse == 0)
; 14. Le joueur n'est pas à cheval donc on lui ajoute l'épée, et on affiche des messages vides pour ne pas voir "Sang Noir ajouté" apparâitre.
if (OnHorse == 0)
Message " "
Message " "
player.AddItem AARSangNoir01 1
set level to 2
SetStage AARSangNoirQuest00 1
elseif (OnHorse == 1)
set timer to 2
set OnHorse to 2
elseif (OnHorse == 2)
if (timer > 0)
set timer to timer - GetSecondsPassed
else
set OnHorse to 0
endif
endif
endif
endif
endif
endif
endif
End
Pourquoi est-ce que je fait compter (script AARSangNoir00Script commentaires 01 et 04) maximum 10x ? Parceque au début je ne savais pas combien de fois j'allais affiché des messages, et qu'il y a eu de nombreux changements (et oui, la version actuelle de Sang Noir est la 7 !). Cela évite aussi de continuer à compter lorsque ce n'est plus nécessaire. Oui mais il y a neuf comptes inutiles (script AARSangNoir00Script commentaire 01). Eh bien vous pouvez toujours optimiser votre script si vous voulez, mais le fait est que c'est bien le dernier niveau de l'épée, celui qui sera le plus utilisé par le joueur s'il joue bien, qui devrait être le "plus optimisé". Deplus, compter 9x en trop, c'est ridicule question vitesse, frame, Hz, FPS, tout ce que vous voulez. Vous n'entendrez pas une mouche péter pour si peu. L'important est de mettre un verrou pour ne pas faire des bouclages inutiles. C'est le minimum.
Ce script fonctionne sans OBSE. Alors pourquoi faut-il utiliser OBSE pour Sang Noir ? Uniquement pour le changement d'arme. Cela permet d'éviter de créer des instances de l'épée (des copies d'épée dans le jeu, par exemple, les 3 claymores de fer que vous avez rammassé sur les bandits sont 3 instances de l'objet claymore de fer). OBSE permet également de conserver les statistique de l'arme, voir de modifier... la puissance de frappe ! Mais ça, c'est une autre histoire pour un autre tuto...
Vous voulez de la complication, maintenant que je vous ai bien bourré la cervelle de sottises ? Pas de problème, c'est gratuit !
Au niveau 5, Sang Noir retire la forme du niveau 4 que vous aviez en main. Si vous aviez mis Sang Noir dans une armoire, elle n'aurait pas évolué dedans, mais bien dans vos mains (script AARSangNoir05Script commentaire 00). Il faut aussi penser à retirer tous les bonus et malus, qu'est-ce qui garanti qu'un sort ne serait pas resté actif aprèsun bug ou l'utilisation d'un coffre "à distance" (les coffres comme ceux ouvert par un sort) ? Evidement, si le joueur se débarrase de l'épe, il faut qu'il perde aussi les bonus (script AARSangNoir05Script commentaire 01). Après s'être équipé 3x, on initialise un stage de quête (script AARSangNoir05Script commentaire 02). Cela ne veut pas dire que l'on crée une entrée journal ! Pour cela, il faudrait qu'il y ait du texte au stage 25 de la quête AARSangNoirQuest00. Mais le stage 25, il vaut mieux le créer, lui. Mais c'est aussi pour un autre tuto. Ayant subit certains bugs, j'ai opté pour une détection en mode jeu du fait que le joueur est équipé ou non de l'épée (script AARSangNoir05Script commentaire 03). je ne dis pas que c'est la meilleure méthode, le plus évident serait d'utiliser les blocs OnEquip et OnUnEquip, mais ça fonctionne très bien comme ça. Vu que l'inventaire ne se rafraîchit pas tout seul, ce n'est pas très grave non plus concernant la disparition/apparition des bonus/malus. Lorsque le joueur s'équipe, on lui ajoute des bonus, puis tant qu'il est équipé, on vérifie son niveau de magie pour savoir si Sang Noir doit boire goulûment sa magie (script AARSangNoir05Script commentaire 04). Lorsque le joueur se déséquipe, on retire le bonus et le malus s'ils ont été ajouté (script AARSangNoir05Script commentaire 05). Avant que l'épée n'évolue, on affiche tout de suite une messagebox pour demander au joueur s'il veut Sang Noir à une ou à deux mains. C'est définitif. On ne joue pas au instances multiples, ici. Et n'oublions pas qu'il s'agit d'un script non OBSE à la base ! (script AARSangNoir05Script commentaires 06 et 07)
► Afficher le texte
Code : Tout sélectionner
ScriptName AARSangNoir05Script
; script sur objet
float timer
short SNchoice
short catch
short take
short Equiped
short DoOnce
short warning
short level
short OnPlay0
short nbrOld4
short WaitSelect
short step
short OnHorse
Begin OnAdd player
Message " "
Message " "
player.AddSpell AARSangNoirCapacity00
if (catch <= 10)
set catch to catch + 1
endif
; 00.Retirer les vieux bonus et malus ajouté par la forme antérieure, faire le compte des formes antérieures et les retirer de l'inventaire du joueur.
if (catch == 1)
Message " "
Message " "
player.RemoveSpell AARSangNoir04Effet00
Message " "
Message " "
player.RemoveSpell AARSangNoir04Effet01
Message " "
Message " "
player.RemoveSpell AARSangNoir04Effet02
set nbrOld4 to player.GetItemCount AARSangNoir04
if (nbrOld4 != 0)
Message " "
Message " "
player.RemoveItem AARSangNoir04 nbrOld4
endif
elseif (catch > 1)
Message "Le fil de Sang Noir chante sous vos doigts..."
; Message "The blade Dark Blood sings under your fingers..."
endif
End
; 01.Si le joueur sort l'épée de son inventaire, on affiche un message et on retire le bonus de l'épée courante
Begin OnDrop player
Message "Votre coeur se sépare avec peine de la lame noire"
; Message "Your heart separates penalty with the dark blade"
Message " "
Message " "
player.RemoveSpell AARSangNoirCapacity00
End
Begin OnEquip player
PlaySound AARSangNoirSoundVampireFeed00
if (take <= 10)
set take to take + 1
endif
if (take == 2)
MessageBox "Sang Noir vous révèle enfin son vrai visage ! Quelle arme terrifiante ! Mais quelle puissance !"
; MessageBox "Dark Blood you finally reveals his true face ! What terrifying weapon ! But what power !"
; 02. Au bout de 3x on "set" (je ne sais pas si le verbe "setter" existe, mais il s'agit d'argot de programmeur) un stage de quête
elseif (take == 3)
SetStage AARSangNoirQuest00 25
endif
End
Begin GameMode
; 03.le joueur est-il équipé ?
; Savoir si le joueur est équipé de l'arme
if (player.GetEquipped AARSangNoir05 == 1)
set Equiped to 1
elseif (player.GetEquipped AARSangNoir05 == 0)
set Equiped to 0
endif
; 04. On ajoute des bonus et on vérifie le niveau d magie du joueur pour retire un bonus et ajouter un malus.
; Si le joueur est équipé
if (Equiped == 1)
if (DoOnce == 0)
Message " "
Message " "
player.AddSpell AARSangNoir05Effet00
Message " "
Message " "
player.AddSpell AARSangNoir05Effet01
set DoOnce to 1
elseif (DoOnce == 1 && warning == 0)
if (player.GetActorValue Magicka <= 20)
Message " "
Message " "
player.AddSpell AARSangNoir05Effet02
Message " "
Message " "
player.RemoveSpell AARSangNoir05Effet01
set warning to 1
endif
endif
; Si le joueur n'est pas équipé
elseif (Equiped == 0)
; 05. On retire les bonus et les malus s'ils ont été ajouté.
if (DoOnce == 1)
Message " "
Message " "
player.RemoveSpell AARSangNoir05Effet00
if (warning == 0)
Message " "
Message " "
player.RemoveSpell AARSangNoir05Effet01
elseif (warning == 1)
Message " "
Message " "
player.RemoveSpell AARSangNoir05Effet02
set warning to 0
endif
set DoOnce to 0
endif
endif
; Evolution vers le niveau suivant
if (take > 3)
set OnPlay0 to player.GetItemCount AARSangNoir05
if (OnPlay0 != 0)
if (player.GetBaseActorValue destruction >= 89 && player.GetBaseActorValue intelligence >= 99 && WaitSelect == 0)
set WaitSelect to 1
endif
endif
if (WaitSelect == 1 && level == 0)
if (step == 0)
set timer to 5
set step to 1
elseif (step == 1)
if (timer > 0)
set timer to timer - GetSecondsPassed
else
set step to 2
endif
elseif (step == 2)
if (OnPlay0 != 0)
if (player.IsRidingHorse == 1)
set OnHorse to 1
elseif (player.IsRidingHorse == 0)
; 06. Avant d'évoluer, on affiche un message pour demander au joueur le port par défaut de l'arme.
if (OnHorse == 0)
MessageBox "Vous êtes plus puissant et Sang Noir le sent...Sang Noir sera plus efficace si vous la tenez à une ou deux main !","Une main","Deux mains"
; MessageBox "You are more powerful and Dark Blood know it...Dark Blood will be more effective if you hold it with a hand or two !","One hand","Two hands"
set step to 3
elseif (OnHorse == 1)
set timer to 2
set OnHorse to 2
elseif (OnHorse == 2)
if (timer > 0)
set timer to timer - GetSecondsPassed
else
set OnHorse to 0
endif
endif
endif
endif
; 07. Evolution selon le choix de la messagebox
elseif (step == 3)
set SNchoice to GetButtonPressed
set AARSangNoirGlobalHandPref to SNchoice
if (SNchoice == 0)
Message " "
Message " "
player.AddItem AARSangNoir06OneHand00 1
set level to 1
set WaitSelect to 2
elseif(SNchoice == 1)
Message " "
Message " "
player.AddItem AARSangNoir06TwoHand00 1
set level to 1
set WaitSelect to 2
endif
endif
endif
endif
End
Après le niveau 0 et un niveau intermédiaire, pourquoi ne pas voir le dernier niveau ? Toute la partie "évolution" a été retirée, mais pas le contrôle des stats et la gestion de la forme antérieure et des bonus/malus :
► Afficher le texte
Code : Tout sélectionner
ScriptName AARSangNoir07Script
; script sur objet
short catch
short Equiped
short DoOnce
short warning
short nbrOld6
Begin OnAdd player
Message " "
Message " "
player.AddSpell AARSangNoirCapacity00
Message " "
Message " "
player.AddSpell AARSangNoirCapacity01
Message " "
Message " "
player.AddSpell AARSangNoirCapacity02
if (catch <= 10)
set catch to catch + 1
endif
if (catch == 1)
Message " "
Message " "
player.RemoveSpell AARSangNoir06Effet00
Message " "
Message " "
player.RemoveSpell AARSangNoir06Effet01
Message " "
Message " "
player.RemoveSpell AARSangNoir06Effet02
Message " "
Message " "
player.AddSpell AARSangNoirCapacity02
; Si la préférence va à Sang Noir à une main
if (AARSangNoirGlobalHandPref == 0)
set nbrOld6 to player.GetItemCount AARSangNoir06OneHand00
else
set nbrOld6 to player.GetItemCount AARSangNoir06TwoHand00
endif
if (nbrOld6 != 0)
; Si la préférence va à Sang Noir à une main
if (AARSangNoirGlobalHandPref == 0)
Message " "
Message " "
player.RemoveItem AARSangNoir06OneHand00 nbrOld6
else
Message " "
Message " "
player.RemoveItem AARSangNoir06TwoHand00 nbrOld6
endif
endif
SetStage AARSangNoirQuest00 32
elseif (catch > 1)
Message "Le fil de Sang Noir chante sous vos doigts..."
; Message "The blade Dark Blood sings under your fingers..."
endif
End
Begin OnDrop player
Message "Votre coeur se sépare avec peine de la lame noire"
; Message "Your heart separates penalty with the dark blade"
Message " "
Message " "
player.RemoveSpell AARSangNoirCapacity00
Message " "
Message " "
player.RemoveSpell AARSangNoirCapacity01
Message " "
Message " "
player.RemoveSpell AARSangNoirCapacity02
End
Begin OnEquip player
PlaySound AARSangNoirSoundVampireFeed00
End
Begin OnUnEquip player
PlaySound AARSangNoirSoundFuryNymphe00
End
Begin GameMode
; Savoir si le joueur est équipé de l'arme
; Arme à une main
if (player.GetEquipped AARSangNoir07OneHand00 == 1 && player.GetEquipped AARSangNoir07TwoHand00 == 0)
set Equiped to 1
; Arme à deux mains
elseif (player.GetEquipped AARSangNoir07OneHand00 == 0 && player.GetEquipped AARSangNoir07TwoHand00 == 1)
set Equiped to 1
; Pas d'arme en main
elseif (player.GetEquipped AARSangNoir07OneHand00 == 0 && player.GetEquipped AARSangNoir07TwoHand00 == 0)
set Equiped to 0
endif
; Si le joueur est équipé
if (Equiped == 1)
if (DoOnce == 0)
Message " "
Message " "
player.AddSpell AARSangNoir07Effet00
Message " "
Message " "
player.AddSpell AARSangNoir07Effet01
set AARSangNoirGlobalHandEquiped to 2
set DoOnce to 1
elseif (DoOnce == 1 && warning == 0)
if (player.GetActorValue Magicka <= 20)
Message " "
Message " "
player.AddSpell AARSangNoir07Effet02
Message " "
Message " "
player.RemoveSpell AARSangNoir07Effet01
set warning to 1
endif
endif
; Si le joueur n'est pas équipé
elseif (Equiped == 0)
if (DoOnce == 1)
Message " "
Message " "
player.RemoveSpell AARSangNoir07Effet00
if (warning == 0)
Message " "
Message " "
player.RemoveSpell AARSangNoir07Effet01
elseif (warning == 1)
Message " "
Message " "
player.RemoveSpell AARSangNoir07Effet02
set warning to 0
endif
set AARSangNoirGlobalHandEquiped to 0
set DoOnce to 0
endif
endif
End