Aller au contenu


Question De Débutant.


  • Veuillez vous connecter pour répondre
4 réponses à ce sujet

#1 Aesahethr

Aesahethr

Posté 26 septembre 2009 - 19:19

Bonjour. J'ai décidé de me lancer dans le modding, et après avoir créé un mod d'équilibrage, je me suis aperçu qu'il ne fonctionnerai pas bien sans un script pour la désinstallation (et l'installation en cours de partie) à cause d'effet passif modifiés qui ne sont pas remplacés par leur version normale à la désinstallation (bien que j'ai fait deux sorts différents et n'ait pas touché à celui d'origine)

donc je décide de faire un joli système avec interrupteur ou anneau je verrai et boîte de dialogue pour l'installation/désinstallation du mod. Sauf qu'évidemment, j'y connais strictement rien moi en script, le seul script que j'ai jamais fait c'est ceux de l'éditeur de war 3, mais c'est de la triche parce qu'en dehors de certaines fonctions, tout peut être fait en GUI, une interface simplifiée qui permet de ne taper aucune ligne de code (en gros faut juste comprendre le franglais pour l'utiliser quoi xD)

Donc paf, go wiwiki, téléchargement du guide pour les nuls (merci pour la vf, je comprend la vo mais ça reste quand même un peu plus laborieux quand on est pas parfaitement billingue) et je commence leur tutorial. Voici l'état de mon script dans le tutorial:

Begin AA_mon_premier_script

Short variable_de_controle
Short bouton
Float timer

If (MenuMode == 1)
		return
endif

If ( OnActivate == 1 )
		If ( variable_de_controle == 0 )
				MessageBox "Sans voix, cela crie. Sans ailes, cela vole. Sans dents, cela mord.
 Sans bouche, cela murmure. Qu'est-ce donc ?", "Chauve-souris", "Vieille femme", "Vent", "Spectre"
				Set variable_de_controle to 1
		Elseif variable_de_controle > 1
				Activate
		endif
endif

If (variable_de_controle == 1)
		Set bouton to GetButtonPressed
		if (bouton == -1)
				return
		elseif (bouton == 2)
				MessageBox "Réponse juste"
				set variable_de_controle to 2
		else
				MessageBox "Réponse erronée"
				Player->AddSpell "AA_Fleaufroid"
				set variable_de_controle to -1
		endif
elseif (variable_de_controle == 2)
		Activate
		Set variable_de_controle to 3
elseif (variable_de_controle == -1)
		Set timer to (timer + GetSecondsPassed)
		if timer > 8
				Player->RemoveSpell, "AA_Fleaufroid"
				set variable_de_controle to -2
		endif
endif

end

(j'ai mis le texte de la message box sur deux ligne mais dans le script il n'est que sur une ligne)
Bon déjà il marche parfaitement (ouais !!! je sais suivre des instructions xD) mais c'est justement ça qui m'embête.

dans le tutorial on commence par créer la boite de dialogue. On change la valeur de la variable "variable_de_controle" (la seule qui existe à ce moment) de 0 à 1 pour que la boîte de dialogue ne soit pas exécutée à chaque frame. De même dans la seconde partie cette valeur passe de 2 à 3 pour que cette-même seconde partie ne soit pas rééxécutée à chaque frame.
Et c'est là que ça m'embête, sans cette valeur, l'"activate" fonctionnait à chaque frame (et on pouvait plus quitter le coffre). Mais une fois que le script s'est joué, la variable restera à 3 à tout jamais. Donc dans la toute première partie du script on aura toujours variable_de_controle > 1 vrai. Si le script est effectivement joué à chaque frame, pourquoi cet activate là n'est pas joué à chaque frame et ne me coince pas lui aussi sur l'ouverture du coffre ? Qu'est ce que j'ai mal compris dans cette affaire ?

#2 elendell

elendell

    Mécano Dell'Arte


Posté 26 septembre 2009 - 20:30

Bonjour Aesahethr,

Et bienvenue parmi les fous modeurs.

 Aesahethr, le 26.09.2009 à 20:18, dit :

sans cette valeur, l'"activate" fonctionnait à chaque frame (et on pouvait plus quitter le coffre). Mais une fois que le script s'est joué, la variable restera à 3 à tout jamais. Donc dans la toute première partie du script on aura toujours variable_de_controle > 1 vrai. Si le script est effectivement joué à chaque frame, pourquoi cet activate là n'est pas joué à chaque frame et ne me coince pas lui aussi sur l'ouverture du coffre ? Qu'est ce que j'ai mal compris dans cette affaire ?

L'activate en question est soumis à 2 conditions. La plus évidente est :

Elseif variable_de_controle > 1
	   Activate
endif
Mais ce bloc est lui-même à l'intérieur d'un autre bloc conditionnel : "If ( OnActivate == 1 )".

Dans le déroulement de la frame, le jeu regarde d'abord si la première condition est vraie. Comme "OnActivate" est à 0, il ne s'occupe pas de tout ce qui est à l'intérieur et qui est donc soumis à "If ( OnActivate == 1 )".

Ce qui a dû t'échapper est le fonctionnement de "OnActivate". Comme indiqué page 58 du MSfD8 :

MSfD8 dit :

"OnActivate" se réinitialise par lui-même dès que la fonction est appelée.
Ce qui veut dire qu'elle repasse automatiquement à 0 pour la frame suivante (et même, dès la fin du bloc).

Si par contre tu avais fait comme ci-dessous, l'activate se ferait à chaque frame (sauf à la première) car il ne serait plus soumis à la véracité de "OnActivate" :

If ( OnActivate == 1 )
		If ( variable_de_controle == 0 )
				MessageBox "Sans voix, cela crie. Sans ailes, cela vole. Sans dents, cela mord......"
				Set variable_de_controle to 1
		endif
endif

if variable_de_controle > 1
	  Activate
endif

;....
Set variable_de_controle to 3
;....


#3 Aesahethr

Aesahethr

Posté 26 septembre 2009 - 20:43

D'accord, j'avais juste complètement oublié la euh... fonction de cette fonction (je m'embrouille tout seul, c'est pas une fonction hein ? plutôt une sorte de variable qui n'a pas besoin qu'on l'aide ?) xD. Je pensais que ce qui empêchait la réactivation c'était le changement de valeur de ma variable mais pas seulement en fait.

Merci beaucoup, j'aurais du mieux relire le début ^^. Pfiou j'ai pas encore l'habitude de penser à tout en même temps, faudra que je m'y fasse ^^. En tout cas elle a l'air super utile, celle là faut que je m'en souvienne.

Modifié par Aesahethr, 26 septembre 2009 - 20:49.


#4 elendell

elendell

    Mécano Dell'Arte


Posté 27 septembre 2009 - 00:27

 Aesahethr, le 26.09.2009 à 21:42, dit :

D'accord, j'avais juste complètement oublié la euh... fonction de cette fonction (je m'embrouille tout seul, c'est pas une fonction hein ? plutôt une sorte de variable qui n'a pas besoin qu'on l'aide ?)
J'allais te dire "Rassure-toi...." mais en fait, ce n'est guère rassurant !  :huhu:

Enfin, sache qu'il est normal d'être embrouillé au début car les différences ne sont pas très claires. Pour une fonction comme "activate" par exemple, c'est clair. Elle donne un ordre, c'est une fonction. Pour d'autres (comme "OnActivate"), je sais que ce sont des fonctions car je l'ai lu mais je serais incapable d'expliquer pourquoi.

On pourrait penser que "OnActivate" serait en fait une simplification de l'écriture de "GetOnActivate" (qui n'existe pas). "Get" donne un ordre puisqu'il veut dire "indique-moi", ce qui expliquerait qu'il s'agit d'une fonction ("indique-moi si l'objet a été activé"). Sauf que "OnPCEquip" qui devrait être du même type que "OnActivate" n'est pas une fonction mais une variable. De plus, c'est une variable qu'il faut systématiquement déclarer dans son script.

J'ai ensuite pensé qu'une différence pouvait être dans le fait qu'une variable était susceptible d'avoir d'autres valeurs que 0 ou 1, puisqu'il s'agit en quelque sorte d'un stockage de mémoire. "Day" par exemple est une variable déclarée par le jeu qui prend différentes valeurs. Mais certaines fonctions peuvent aussi prendre des valeurs supérieures à 1 suivant le cas.

De plus, il y a des variables qu'il faut déclarer, d'autres qui le sont déjà par le jeu, des fonctions qui se remettent toutes seules à 0, d'autres qu'il faut soi-même remettre à 0, des variables dont la valeur est positionnée par le jeu, d'autres qui s'utilisent comme simples drapeaux (flags), certaines qu'il faut utiliser à la place d'une autre dans certains cas, d'autres qui fonctionnent avec certains types d'objets et pas avec d'autres, etc, etc.

Mon principal conseil est donc : MSfD, MSfD, MSfD, MSfD, MSfD, MSfD, MSfD...

Apprends de suite à bien l'utiliser et chaque fois que tu veux utiliser une fonction ou une variable du jeu, prends le temps de lire tout ce qui en est dit. Crois-moi, ça te fera gagner beaucoup de temps. Ce n'est pas la seule source d'infos et il contient quelques erreurs (j'en ai d'ailleurs signalé quelques-unes dans "Les scripts me crispent") mais dans l'ensemble, le MSfD est très fiable et très bien détaillé.

#5 Aesahethr

Aesahethr

Posté 27 septembre 2009 - 20:02

Je l'ai parcouru, et honnêtement pour un noobie de chez noobie qui n'a jamais scripté en aucun langage de sa vie c'est quand même franchement bien fait. Mais ça fait quand même assez peur tout ça ^^

Effectivement en relisant il s'agit bien d'une fonction (honte à moi) mais j'ai bien l'impression qu'il n'y a en fait rien à comprendre ici, et que ces différences onpcequip onactivate et autre sont de simples incohérences qu'il va falloir connaître par coeur ou presque en plus (tant qu'à faire ^^).

Enfin, en tout cas merci pour ta réponse et tes encouragement qui m'aideront à persévérer dans la voix du script !!!




1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)