[Tutoriel] Avancé - Système de Bonus de Set

Vous trouverez ici les tutoriels et l'entraide sur les outils et techniques de modding spécifiques à Oblivion.
Avatar du membre
vaykadji
Confrère
Messages : 323

Avancé - Système de Bonus de Set

Message par vaykadji »

Bonjour à tou(te)s,

Prélude

Aujourd'hui nous allons voir comment créer un système (simple) de bonus de set.
Ce système, utilisé notamment dans World of Warcraft, permet d'obtenir des bonus magiques si l'on possède plusieurs pièces d'un même set d'armure.

Ex: J'ai le torse en fer, et les jambières d'acier. Je n'ai aucun bonus. Par contre, si je trouve un torse en acier, j'aurai alors 2 pièces en acier, et je gagnerai +1 en force (uniquement lorsque les jambieres d'acier et le torse d'acier seront équipés).


Introduction


Pour créer ce genre de choses sur Oblivion, il faut utiliser un script object et des sorts "capacité". Le script permettra d'ajouter les sorts (le +1 force de l'exemple) au joueur.


Pour créer ce mod, j'ai utilisé un set de 4 pièces : Armure complète (style arène), casque, bouclier et épée.

-Lorsqu'on équipe qu'un seul item, on n'a aucun bonus.
-Lorsqu'on équipe l'armure et le casque, on obtient un "bouclier de 10%" (Appelé Aura de Protection).
-Lorsqu'on équipe l'épée et le bouclier, on obtient une "réflexion de dégats de 10%" (Appelé Aura de Vindicte).
-Lorsqu'on équipe les 4 pièces, on obtient les 2 bonus séparés, et en prime +5 dans chaque caractéristique: agilité-force-intell-etc. (C'est l'Illumination Divine).


Très bien, alors comment faire ça, techniquement ?


La partie technique !



1) Il faut avoir créé ses 4 items.


J'ai appelé mes 4 items ici aaPaladinArmor, aaPaladinHelm, aaPaladinShield et aaPaladinSword.

2) Il faut avoir créé les sorts à ajouter au joueur.


-Il faut que ça soit des sorts de type "Capacité" !
J'ai appellé les 3 sorts (auras) : aaPaladinArmorSpell (quand on a 2 pièces d'armure), aaPaladinWeaponSpell (quand on a boubou+épée) et aaPaladinBonusSpell (quand on a les 4).

3) On peut commencer le script :


- On va commencer par le début, c'est à dire vérifier si le joueur a les objets équipés, et sauvegarder la réponse dans une variable.
- Je commence en MenuMode, le script ne tournera que pendant le menu. Pourquoi pas plutôt un GameMode ? Parce qu'alors à chaque changement d'armure, il faut ouvrir et refermer le menu, ce qui n'est pas pratique.

Code : Tout sélectionner

;Un joli petit nom pour notre script
scn aaPaladinBonusSetScript

;Je déclare les variables qui serviront à savoir si le joueur a équipé un objet, et lequel.
Short Epee
Short Bouclier
Short Armure
Short Heaume

Begin MenuMode

;je vérifie ce qui est équipé

	If (player.getequipped aaPaladinArmor == 1)
		Set Armure to 1
	else
		Set Armure to 0
	endif

	if (player.getequipped aaPaladinHelm == 1)
		Set Heaume to 1
	else
		Set Heaume to 0
	endif

	if (player.getequipped aaPaladinShield == 1)
		Set Bouclier to 1
	else
		Set Bouclier to 0
	endif

	if (player.getequipped aaPaladinSword == 1)
		Set Epee to 1
	else 
		Set Epee to 0
	endif

Voilà, nos 4 variables sont remplies, on sait maintenant quels objets a équipé le joueur.
On va maintenant appliquer les auras (via le addspell). Je rajoute des compteurs (Compteur, Compteurbis, Compteurtris) pour être sur de ne pas appliquer l'aura sans arrêt (ne pas oublier de les déclarer au début du script!), et j'en profite aussi pour mettre un petit message personnalisé, à la place de l'affreux : "sort xxx ajouté à la liste du joueur". Les 2 messages blancs sont là, je le rappelle, afin de ne pas afficher ce message affreux.
Vous remarquerez aussi que j'en ai profité pour sournoisement jouer un son lors de l'aura 4 pièces (c'est un choix, ce n'est absolument pas obligatoire).

-Je vérifie à chaque fois si l'aura n'est pas déjà présente
-Penchons nous sur le premier if, l'aura de protection. Si l'aura n'est pas déjà appliquée (compteur = 0), que le heaume et l'armure sont équipées (heaume = 1 et armure = 1), et si l'épée ou le bouclier n'est pas équipé (epee = 0 ou bouclier = 0), j'applique l'aura.
Pourquoi vérifier si l'épée ou le bouclier n'est PAS équipé ? Parce que de cette façon, on peut prévoir de ne pas mettre l'aura protect si l'aura 4 pièces est active.
-Vous remarquez qu'à chaque IF, je réinistialise complètement les sorts et les compteurs. De cette manière, à chaque fois que le joueur touche à une piece d'armure du set, tout le calcul se refait. C'est plus propre.

Code : Tout sélectionner

;J'applique les auras
	;aura de protection
	if (Heaume == 1) && (Armure == 1) && (Compteur == 0) && ((Epee == 0) || (Bouclier == 0))
		Message "Bonus 2 pièces : Aura de Protection"
		Message " "
		Message " "
		;on ajoute l'aura de protection et on met le compteur à 1
		player.addspell aaPaladinArmorSpell
		Set Compteur to 1
		;on réinitialise ensuite tous les autres compteurs/auras
		Set Compteurbis to 0
		Set Compteurtris to 0
		player.removespell aaPaladinWeaponSpell
		player.removespell aaPaladinBonusSpell
	endif

	if (Compteur ==1) && ((Armure == 0) || (Heaume == 0))
		;on réinitialise tout lorsqu'on enlève l'aura de protection
		Set Compteur to 0
		Set Compteurbis to 0
		Set Compteurtris to 0
		player.removespell aaPaladinArmorSpell
		player.removespell aaPaladinWeaponSpell
		player.removespell aaPaladinBonusSpell
	endif

	;aura de vindicte
	if (Epee == 1) && (Bouclier == 1) && (Compteurbis == 0) && ((Armure == 0) || (Heaume == 0))
		Message "Bonus 2 pièces : Aura de Vindicte"
		Message " "
		Message " "
		player.addspell aaPaladinWeaponSpell
		Set Compteurbis to 1
		Set Compteur to 0
		Set Compteurtris to 0
		player.removespell aaPaladinArmorSpell
		player.removespell aaPaladinBonusSpell
	endif

	if (Compteurbis == 1) && ((Epee == 0) || (Bouclier == 0))
		Set Compteur to 0
		Set Compteurbis to 0
		Set Compteurtris to 0
		player.removespell aaPaladinArmorSpell
		player.removespell aaPaladinWeaponSpell
		player.removespell aaPaladinBonusSpell
	endif

	;aura bonus 4 pieces
	if (Armure == 1) && (Bouclier == 1) && (Epee == 1) && (Heaume == 1) && (Compteurtris == 0)
		Playsound aaNemesisSound
		Message "Bonus 4 pièces : Illumination Divine"
		Message " "
		Message " "
		player.addspell aaPaladinWeaponSpell
		player.addspell aaPaladinArmorSpell
		player.addspell aaPaladinBonusSpell
		Set Compteurtris to 1
		Set Compteur to 0
		Set Compteurbis to 0
	endif

	if (Compteurtris == 1) && ((Armure == 0) || (Bouclier == 0) || (Epee == 0) || (Heaume == 0))
		player.removespell aaPaladinWeaponSpell
		player.removespell aaPaladinArmorSpell
		player.removespell aaPaladinBonusSpell
		Set Compteurtris to 0
		Set Compteur to 0
		Set Compteurbis to 0
	endif

Et voilà ! Vous avez créé un script de bonus de set d'armure assez simple. Le système fonctionne aussi si vous voulez plus de détails, par exemple non plus 2 par 2, mais carrément pièce par pièce. Je vous laisse vous débrouiller pour ça.

J'ai ajouté un petit quelque chose, parce que nous savons tous que peu de gens lisent les readme... Rien de tel qu'un petit MessageBox pour rappeller au joueur lambda que la pièce d'armure qu'il tient en main peut faire partie d'un Set.
Je vais donc rajouter un petit compteur pour être sur que le message n'apparaisse pas à chaque fois qu'il équipe l'objet, et oublier le bloc MenuMode pour lui préférer un bon vieil OnEquip.

Code : Tout sélectionner

;on oublie pas de déclarer son compteur
Short DoOnce

Begin OnEquip
	if (DoOnce == 0)
		MessageBox "En vous en équipant, vous sentez que ce métal n'est pas comme les autres. Pour profiter pleinement de ses pouvoirs, il faut que le set complet soit réuni."
		Set DoOnce to 1
	endif
End
Voilà qui devient de plus en plus intéressant. J'ai arrêté le script à ce stade. Il me convient parfaitement.

On remet bien tout dans l'ordre, on vérifie d'un coup d'oeil s'il n'y a pas de bourdes :

Code : Tout sélectionner

scn aaPaladinBonusSetScript

Short DoOnce
Short Epee
Short Bouclier
Short Armure
Short Heaume
Short Compteur
Short Compteurbis
Short Compteurtris

Begin MenuMode

;vérifie ce qui est équipé

	If (player.getequipped aaPaladinArmor == 1)
		Set Armure to 1
	else
		Set Armure to 0
	endif

	if (player.getequipped aaPaladinHelm == 1)
		Set Heaume to 1
	else
		Set Heaume to 0
	endif

	if (player.getequipped aaPaladinShield == 1)
		Set Bouclier to 1
	else
		Set Bouclier to 0
	endif

	if (player.getequipped aaPaladinSword == 1)
		Set Epee to 1
	else 
		Set Epee to 0
	endif

;Pose les auras
	;aura protect
	if (Heaume == 1) && (Armure == 1) && (Compteur == 0) && ((Epee == 0) || (Bouclier == 0))
		Message "Bonus 2 pièces : Aura de Protection"
		Message " "
		Message " "
		player.addspell aaPaladinArmorSpell
		Set Compteur to 1
		Set Compteurbis to 0
		Set Compteurtris to 0
		player.removespell aaPaladinWeaponSpell
		player.removespell aaPaladinBonusSpell
	endif

	if (Compteur ==1) && ((Armure == 0) || (Heaume == 0))
		Set Compteur to 0
		Set Compteurbis to 0
		Set Compteurtris to 0
		player.removespell aaPaladinArmorSpell
		player.removespell aaPaladinWeaponSpell
		player.removespell aaPaladinBonusSpell
	endif

	;aura vindicte
	if (Epee == 1) && (Bouclier == 1) && (Compteurbis == 0) && ((Armure == 0) || (Heaume == 0))
		Message "Bonus 2 pièces : Aura de Vindicte"
		Message " "
		Message " "
		player.addspell aaPaladinWeaponSpell
		Set Compteurbis to 1
		Set Compteur to 0
		Set Compteurtris to 0
		player.removespell aaPaladinArmorSpell
		player.removespell aaPaladinBonusSpell
	endif

	if (Compteurbis == 1) && ((Epee == 0) || (Bouclier == 0))
		Set Compteur to 0
		Set Compteurbis to 0
		Set Compteurtris to 0
		player.removespell aaPaladinArmorSpell
		player.removespell aaPaladinWeaponSpell
		player.removespell aaPaladinBonusSpell
	endif

	;aura bonus 4 pieces
	if (Armure == 1) && (Bouclier == 1) && (Epee == 1) && (Heaume == 1) && (Compteurtris == 0)
		Playsound aaNemesisSound
		Message "Bonus 4 pièces : Illumination Divine"
		Message " "
		Message " "
		player.addspell aaPaladinWeaponSpell
		player.addspell aaPaladinArmorSpell
		player.addspell aaPaladinBonusSpell
		Set Compteurtris to 1
		Set Compteur to 0
		Set Compteurbis to 0
	endif

	if (Compteurtris == 1) && ((Armure == 0) || (Bouclier == 0) || (Epee == 0) || (Heaume == 0))
		player.removespell aaPaladinWeaponSpell
		player.removespell aaPaladinArmorSpell
		player.removespell aaPaladinBonusSpell
		Set Compteurtris to 0
		Set Compteur to 0
		Set Compteurbis to 0
	endif
End

;Message prévenant du bonus de set
Begin OnEquip
	if (Doonce == 0)
		MessageBox "En vous en équipant, vous sentez que ce métal n'est pas comme les autres. Pour profiter pleinement de ses pouvoirs, il faut que le set complet soit réuni."
		Set Doonce to 1
	endif
End
Voilà, là le script est FINI ! :classe: Il faut maintenant l'attacher à chaque pièce du set.

Je place donc mon script aaPaladinBonusSetScript sur aaPaladinArmor, aaPaladinHelm, aaPaladinShield et aaPaladinSword.


Je sauvegarde mon esp, et je vais voir en jeu ce que ça donne :pensif:


Si ça marche pas, vous avez du faire une erreur quelque part. Je peux vous assurer que mon script est fonctionnel :D

Et si ça marche ^^ Alors je n'ai qu'à vous dire BRAVO !


A la prochaine,

Vaykadji



PS: Et pensez à moi dans vos crédits si ce tuto vous a aidé.
Modifié en dernier par vaykadji le 08 juil. 2010, 18:08, modifié 1 fois.
Aussi connu sous le nom de Bjorn le Barbu, a touché au scripts/textures/packageAI/Landscape editing. Retraité aujourd'hui, peut-être à bientôt pour TESO ou TESVI ?
Avatar du membre
Shadow she-wolf
Confrère
Messages : 830
Contact :

Re: Tuto - Avancé - Système de Bonus de Set

Message par Shadow she-wolf »

Hum...je n'ai que rapidement survolé, mais j'ai deux petites questions.
La première est, pourquoi tout appliquer sur les armures ? Pourquoi ne pas faire un script de quête ?

Si je demande cela, c'est qu'on a au maximum, quatre pièces d'armures, qui exécutent le même script exactement, et que ce script est indépendant de la pièce d'amure en question.
Donc, pourquoi ne pas déménager le bloc GameMode dans un script de quête, il ne sera exécuté qu'une unique fois au lieu de quatre fois. On laisse bien entendu le bloc OnEquip sur les armures.
Surtout que ça ne risque pas de provoquer des redondances ? Car, que je sache, chaque pièce d'amure à ses propres variables, et donc théoriquement, on va se retrouver avec quatre bonus en simmultanné non ?


L'autre point, c'est au niveau de ce morceau:

Code : Tout sélectionner

   if (Aurabonus == 1) && (Auraone == 0) || (Auratwo == 0)
      Player.RemoveSpell aaPaladinBonusSpell
      Set Aurabonus to 0
      Set Count to 0
   endif
Je n'ai pas l'impression que ces tests soient corrects, enfin, je peux me tromper, c'est peut-être volontaire.

Car, le ET est prioritaire sur le OU (ET = "*" et le OU = "+" d'ailleurs, ce n'est pas pour rien).
Car, si j'ai bien compris, la présence du "Aurabonus" est un verrou dans cette situation là.
Or, si on a "Auratwo" à 0, le verrou devient inutile, et le code reste toujours éxécuté.
Donc, je ferais ceci plutôt:

Code : Tout sélectionner

if (Aurabonus == 1) && ((Auraone == 0) || (Auratwo == 0))
Avatar du membre
vaykadji
Confrère
Messages : 323

Re: Tuto - Avancé - Système de Bonus de Set

Message par vaykadji »

Pour le premier truc, c'est pas bête de faire un script de quête. Je vais modifier ça. Mais pour l'information, il n'y a aucune redondance, il s'exécute parfaitement bien.

Pour le 2ème, j'ai lu ceci en fait :

The OR checkbox is used to determine how a Condition Item is evaluated with the ones that follow it. Consecutive ORs are treated like a single block when evaluating and have order preference over AND. For example, the condition items ( A AND B OR C AND D ) are evaluated as ( A AND ( B OR C ) AND D ) and not ( ( A AND B ) OR ( C AND D ) ).

Donc si je prends A AND B OR C, il le comprend comme A AND (B OR C), ce qui est parfaitement normal pour mon script :mrgreen:



Par contre, j'ai un gros souci dans un contexte différent, je viens de le découvrir en me prenant la tête avec les OU et AND ^^ Je vais essayer un autre truc, et en script de quête :)
Aussi connu sous le nom de Bjorn le Barbu, a touché au scripts/textures/packageAI/Landscape editing. Retraité aujourd'hui, peut-être à bientôt pour TESO ou TESVI ?
Avatar du membre
Shadow she-wolf
Confrère
Messages : 830
Contact :

Re: Tuto - Avancé - Système de Bonus de Set

Message par Shadow she-wolf »

vaykadji a écrit : The OR checkbox is used to determine how a Condition Item is evaluated with the ones that follow it. Consecutive ORs are treated like a single block when evaluating and have order preference over AND. For example, the condition items ( A AND B OR C AND D ) are evaluated as ( A AND ( B OR C ) AND D ) and not ( ( A AND B ) OR ( C AND D ) ).

Donc si je prends A AND B OR C, il le comprend comme A AND (B OR C), ce qui est parfaitement normal pour mon script :mrgreen:
"OR checkbox" ?

Ce n'est pas la case de conditions dans les dialogues et autres packages IA ? :)

J'avais remarqué ce comportement pour eux oui.

Mais pour le script pur, j'ai toujours suivit la logique booléenne classique, comme dans tout langage de programmation, à tord peut-être...


EDIT: Wah.
A tord manifestement.
Même pour les script, ils ont tout inversé. :shock:
Enfin, d'après ce que raconte le wiki...
Avatar du membre
vaykadji
Confrère
Messages : 323

Re: Tuto - Avancé - Système de Bonus de Set

Message par vaykadji »

C'est ce qui m'a choqué aussi^^ Et apparemment le wiki a raison. Mais la logique booléenne fonctionne aussi :)

Par contre j'ai un problème...
Tu connais un bloc qui s'exécuterait aussi pendant le menu? Je vais essayer le MenuMode, on verra, le problème c'est que ça ne sera plus un GameMode. J'ai réécrit le script à cause de mon problème, et c'est plus propre mnt, malheureusement le problème persiste : si on a les bonus 4 pieces, et qu'on retire une piece, le bonus 2 piece ne s'active pas. Il faut pour l'activer : retirer les 4 pieces, sortir du menu, et rééquiper les 3 pieces... C'est chiant :)
► Afficher le texte
Aussi connu sous le nom de Bjorn le Barbu, a touché au scripts/textures/packageAI/Landscape editing. Retraité aujourd'hui, peut-être à bientôt pour TESO ou TESVI ?
Avatar du membre
Shadow she-wolf
Confrère
Messages : 830
Contact :

Re: Tuto - Avancé - Système de Bonus de Set

Message par Shadow she-wolf »

Non, c'est MenuMode, ou GameMode, je ne connais pas de mode qui fasse les deux en même temps...

Pour ton script, c'est en fait, dû à la structure du script.
Je m'explique:
Tu as les bonus quatre pièces.
Puis, on enlève, mettons l'épée.
Rien ne se passe tant que l'on reste dans l'inventaire.
Puis, on va en jeu, là, le script relit depuis le début, passe la variable épée à 0.
Alors:

Code : Tout sélectionner

if (Heaume == 1) && (Armure == 1) && (Compteur == 0) && ((Epee == 0) || (Bouclier == 0))
Devient vrai.
Donc il ajoute le second bonus, sauf que:

Code : Tout sélectionner

if (Compteurtris == 1) && ((Armure == 0) || (Bouclier == 0) || (Epee == 0) || (Heaume == 0))
Est vrai aussi, et donc...il retire les bonus.

A première vue, cela semble être un problème de priorité, il faudrait plutôt mettre le bonus quatre pièces avant les bonus deux pièces.
Je crois que, ça devrait régler ton problème...
Avatar du membre
vaykadji
Confrère
Messages : 323

Re: Tuto - Avancé - Système de Bonus de Set

Message par vaykadji »

Merci, j'ai trouvé le problème pendant que tu rédigeais :) Je réinitialise les compteurs et les sorts à chaque changement. De cette façon, plus aucun conflit.
► Afficher le texte
J'ai mit un MenuMode, c'est bien plus pratique, au moins ça se passe en temps réel :mrgreen:
Et je ne mets finalement pas un quest script, ça marche très bien comme ça. J'ai essayé toutes les combinaisons (enfin je crois), et ça fonctionne. Je vais donc laisser comme ça. Pour le questscript il faudrait que je démarre une fake quest que le joueur ne verrait jamais, c'est un peu lourd je trouve. Là les 4 scripts tournent en même temps, mais sans aucun conflit.
Merci du coup de main, je vais éditer le tuto, et remplacer par le nouveau script, qui me semble beaucoup plus propre (ne serait-ce qu'à regarder).
Aussi connu sous le nom de Bjorn le Barbu, a touché au scripts/textures/packageAI/Landscape editing. Retraité aujourd'hui, peut-être à bientôt pour TESO ou TESVI ?
Avatar du membre
beeratwork
Légende de la Confrérie
Légende de la Confrérie
Messages : 1881

Re: Tuto - Avancé - Système de Bonus de Set

Message par beeratwork »

Bon, tuto ajouté à l'index http://www.confrerie-des-traducteurs.fr ... 141&t=3190

Si une armure doit retirer des bonus en fonction, par exemple, de la vie du joueur :
Moi, pour l'armure de l'exalté, je fais de l'ajout/retrait de bonus en live, donc je dois utiliser un game mode. Dans ce bloc, je vérifie si le joueur est équippé ou non, si oui, en fonction de son niveau de santé (je suis dans la bonne fourchette ?) je retire ou j'ajoute un bonus spécifique à la pièce d'armure.
par contre je vais de ce pas ajouter un bloc "Begin OnDrop" pour retirer les sorts si le joueur range l'armure dans une armoire...

Si une pièce nécessite que l'ensemble soit équipé :
Simplement un script spécifique à cette pièce. Mon casque fait apparaître un démon lorsqu'on s'en équipe et qu'il manque une pièce : je passe aussi par un bloc game mode. En fait, si j'utilisais menu mode, dès que le joueur mes le casque, le démon est téléporté, oui mais voilà, le joueur s'était trompé ou change de casque ! Ce serait un peu chiant quand même... donc je vérifie si on en est équipé en game mode, surtout qu'en fonction du niveau de snaté, le démon peut aussi apparaître, et en plus, gentil ou méchant !

Un ensemble d'armure spécifique à un mod ?
Pour mes armures de vampire, je pensais utiliser ça pour donner un écran total au joueur, et de passer par un script de quête qui serve à stocker des variables signalant que tel ou tel slot est équipé... j'en suis arrivé à 40 variables pour le thème vampirique (type d'arme, slot lourd/léger...) J'ai donc opté pour une solution sans problème : pas de script.
Je suggère d'utiliser ça pour des armures uniques, pas des objets qu'on trouve dans la première boutique venue ou sur les méchants démons de l'enfer.

Script de quête ou d'objet ?
Pour un effet spécifique intervenant lorsqu'on s'équipe de l'objet, un script d'objet avec un bloc "OnEquip" devrait suffire, mais on peut aussi utiliser le "MenuMode si on veut. Evidement, le bloc OnUnequip doit aussi être utilisé dans ce cas.
Pour un effet résultant de l'association de tous les éléments, c'est plus simple de gérer tout depuis un seul script de quête, deplus, on peut également en profiter pour mettre le code concernant la quête, par exemple
Avatar du membre
Shadaoe
Confrère
Messages : 2807
Contact :

Re: Tuto - Avancé - Système de Bonus de Set

Message par Shadaoe »

Si je me souviens bien l'armure du croisé de KOTN utilise un système de set non ? Bon ça fait tellement longtemps que je peux me tromper ^^
Si c'est vrai par contre, faudrait regarder comment ça se passe là-dedans
You start out stealing songs, then you're robbing liquor stores, and selling crack and running over schoolkids with your car!
Avatar du membre
Shadow she-wolf
Confrère
Messages : 830
Contact :

Re: Tuto - Avancé - Système de Bonus de Set

Message par Shadow she-wolf »

Il ne correspond pas du tout à ce que veut faire Vaykadji.
Dans KOTN, le bonus n'apparait que si on porte toutes les pièces, sinon, il disparait. En plus, chaque pièce d'armure est enchantée directement.
C'est tout, et vachement plus simple à réaliser. :)
Répondre

Retourner vers « Modder Oblivion »