Elecbyte a sorti un nouveau trigger Cond dans sa RC6, qui semble un peu surprenant à première vue. En effet, il se présente et fonctionne globalement à l’identique du trigger IfElse, et semble donc redondant.

Pour rappel, le IfElse fonctionne ainsi : IfElse(exp_cond, exp_vrai, exp_faux) = exp_vrai si exp_cond est vrai, ou exp_faux sinon (ça ressemble donc assez à un « SI() » dans Excel ou Calc). Donc Cond fonctionne de la même façon. Par exemple :

value = IfElse(var(0)=1,4,-4)

et

value = Cond(var(0)=1,4,-4)

sont rigoureusement équivalent (si var(0) = 1, alors value prendra la valeur 4, et sinon, value prendra la valeur -4.

Il y a pourtant une subtile différence entre IfElse et Cond : avec un IfElse, quelque soit le résultat, toutes les expressions qui composent le IfElse sont lues et évaluées, même si elles ne sont pas utilisées (par exemple, si exp_cond est vrai, on n’a pas besoin de exp_faux, mais exp_faux sera quand même lu). En revanche, avec Cond, seules les expressions nécessaires sont lues et évaluées (donc dans le même cas, cette fois, exp_faux ne sera pas lu).

Quelle différence ? Dans un cas comme celui donné en exemple plus haut, aucun, c’est certain. Mais il existe certains cas où la différence peut être assez flagrante, notamment avec l’assignation de variable.

L’assignation de variable consiste à évaluer une expression ou une partie d’expression tout en attribuant la valeur de cette expression à une variable. Par exemple :

value = var(0):=5+RoundNo

Si RoundNo vaut 1, value vaudra 6, et var(0) aussi. Le signe « := » indique que l’expression située à droite du signe doit être attribuée à var(0) (comme le ferait un VarSet). En fait, si on décompose l’expression, on dit à Mugen que value doit prendre la valeur de var(0), qui doit elle-même prendre la valeur de 5+RoundNo.

Revenons à nos triggers Cond et IfElse, et imaginons le cas suivant :

value = IfElse(RoundNo>1,var(1):=RoundNo,var(1):=-RoundNo)

Ici, var(1) est censé prendre la valeur de value, à nouveau : si RoundNo>1, alors value retourne RoundNo, qui est attribué à var(1), et si RounNo n’est pas >1, alors value retourne -RoundNo, qui est attribué à var(1). Bref, var(1) est censé prendre la même valeur que value.

Du moins, en théorie. En pratique, comme toutes les expressions de IfElse sont lues et évaluées, var(1) vaudra toujours -RoundNo, quelle que soit la valeur de value. Pourquoi ? Parce que Mugen lit la chaîne dans son intégralité, et la dernière expression qu’il lit (de droite à gauche) est l’assignation de -RoundNo à var(1), et ce même si value vaut RoundNo, au final.

C’est là qu’intervient Cond. En remplaçant simplement IfElse par Cond, on change le comportement de Mugen :

value = IfElse(RoundNo>1,var(1):=RoundNo,var(1):=-RoundNo)

Ici, l’expression inutile n’étant pas lue, on est certain que var(1) correspondra bien à value (si value vaut RoundNo, alors var(1) = RoundNo, et si value vaut -RoundNo, alors var(1) = -RoundNo).

Une différence subtile, certes, mais qui peut avoir son importance dans certains cas.

Mais dans ce cas, pourquoi ne pas avoir simplement modifié le fonctionnement de IfElse ? Très probablement parce que certains créateurs ont du exploiter le comportement initial du IfElse, et donc si le IfElse venait à se comporter comme le Cond, les personnages de ces créateurs ne fonctionneraient plus comme prévus. C’est donc à des fins de rétro-compatibilité qu’Elecbyte a choisi d’ajouter un trigger légèrement différent du IfElse plutôt que de le modifier.

Laisser un commentaire

Vous devez être connecté pour laisser un commentaire. Connexion »