[WeiDU] Définition automatique des variables RGB dans les effets #51 et 52
Posté : sam. 19 sept. 2015, 23:48
Tous ceux qui ont utilisé les effets de coloration avec les effets 51 [Colour: Strong/Dark by RGB] et 52 [Colour: Very Bright by RGB] avec un tp2 ont dû se taper la saisie dans DLTCEP, puis un copie-coller de la variable du paramètre 1 dans leur tp2.
Pour rappel :
En utilisant la définition du paramètre 1 [0x0004 - 4 (dword) - Parameter 1], plutôt qu'utiliser la commande WRITE_LONG, je peux décomposer la variable en 4 WRITE_BYTE, dont la première
variable est égale à 0 et les trois suivantes aux variables Red, Green et Blue.
Ce qui me donne :
Et ça ne fonctionne pas !
Du coup, j'ai essayé de comprendre pourquoi et j'ai découvert de manière empirique un truc bizarre : c'est la variable blue qui pose problème.
Plus exactement, dès qu'elle est supérieure à 127, elle devient négative : -16777216 * GW_blue.
Problème, la commande
me renvoie tout de même une valeur positive.
Alors, j'ai bidouillé un truc qui fonctionne :
Que j'ai simplifié en :
Puis je lance :
Et ma créature bénéficie de l'effet de recoloration !
Le but du jeu étant d'utiliser un tableau de recoloration (opcode, red, green, blue, location => color) appelé si nécessaire par la créature. Une fois mes couleurs définies, si je veux un golem bleu électrique par exemple, je n'ai plus qu'à utiliser la variable color = electric_blue. Idem pour les autres créatures ou les autres couleurs.
Bref, ça marche très bien, mais comme j'ai horreur de ne pas comprendre, si l'un de vous a une explication, je suis preneur. ]8 [Colour: Change by RGB][/URL], 9 [Colour: Glow Pulse] et 50 [Colour: Glow by RGB (Brief)], et notamment pour définir le paramètre 2 :
Pour rappel :
J'ai voulu automatiser cette procédure en utilisant directement les valeurs RGB dans une fonction.IESDP a écrit : Alters the colour of the area specified by the 'Location and Speed' field, to the colour specified by the 'RGB colour' field.
The 'RGB Colour' field is handled as follows:
Second byte = Red (0-255)
Third byte = Green (0-255)
Fourth byte = Blue (0-255)
En utilisant la définition du paramètre 1 [0x0004 - 4 (dword) - Parameter 1], plutôt qu'utiliser la commande WRITE_LONG, je peux décomposer la variable en 4 WRITE_BYTE, dont la première
variable est égale à 0 et les trois suivantes aux variables Red, Green et Blue.
Ce qui me donne :
Code : Tout sélectionner
[color="#00FF00"]DEFINE_PATCH_FUNCTION[/color] ~[color="#EE82EE"]GW_DEF_RGB_COLOR[/color]~
[color="#00FF00"]INT_VAR [/color]GW_red = 0
GW_green = 0
GW_blue = 0
[color="#00FF00"]RET[/color] GW_color
[color="#0000FF"]BEGIN[/color]
[color="#FF0000"]SET[/color] GW_color = (256 * GW_red) + (65536 * GW_green) + (16777216 * GW_blue)
[color="#0000FF"]END[/color]
Du coup, j'ai essayé de comprendre pourquoi et j'ai découvert de manière empirique un truc bizarre : c'est la variable blue qui pose problème.
Plus exactement, dès qu'elle est supérieure à 127, elle devient négative : -16777216 * GW_blue.
Problème, la commande
Code : Tout sélectionner
[color="#FF0000"]SET[/color] GW_blue2 = (0 - GW_blue * 16777216)
Alors, j'ai bidouillé un truc qui fonctionne :
Code : Tout sélectionner
DEFINE_PATCH_FUNCTION ~GW_DEF_RGB_COLOR~
[color="#00FF00"]INT_VAR [/color]GW_red = 0
GW_green = 0
GW_blue = 0
[color="#00FF00"]RET[/color] GW_color
[color="#0000FF"]BEGIN[/color]
[color="#FF0000"]SET[/color] GW_blue2 = GW_blue * 16777216
[color="#FF0000"]PATCH_IF[/color] ([color="#EE82EE"]"%GW_blue%"[/color] > 127) [color="#0000FF"]BEGIN[/color]
[color="#FF0000"]SPRINT[/color] GW_blue2 [color="#FF0000"]EVAL[/color] [color="#EE82EE"]"%GW_blue2%"[/color]
[color="#0000FF"]END[/color]
[color="#FF0000"]PATCH_PRINT[/color][color="#EE82EE"] "TEST de CONTROLE de GW_DEF_RGB_COLOR pour blue = %GW_blue% ==> GW_blue2 = %GW_blue2%"[/color]
[color="#FF0000"]SET[/color] GW_color = (256 * GW_red) + (65536 * GW_green) + GW_blue2
[color="#FF0000"]PATCH_PRINT[/color] [color="#EE82EE"]"TEST de CONTROLE GW_DEF_RGB_COLOR - red = %GW_red% - green = %GW_green% - blue = %GW_blue% ==> color = %GW_color%"[/color]
[color="#0000FF"]END[/color]
Code : Tout sélectionner
[color="#00FF00"]DEFINE_PATCH_FUNCTION[/color] ~[color="#EE82EE"]GW_DEF_RGB_COLOR[/color]~
[color="#00FF00"]INT_VAR [/color]GW_red = 0
GW_green = 0
GW_blue = 0
[color="#00FF00"]RET[/color] GW_color
[color="#0000FF"]BEGIN[/color]
[color="#FF0000"]SET[/color] GW_blue2 = GW_blue * 16777216
[color="#FF0000"]SPRINT[/color] GW_blue2 [color="#FF0000"]EVAL[/color] [color="#EE82EE"]"%GW_blue2%"[/color]
[color="#FF0000"]SET[/color] GW_color = (256 * GW_red) + (65536 * GW_green) + GW_blue2
[color="#FF0000"]PATCH_PRINT[/color] [color="#EE82EE"]"TEST de CONTROLE de GW_DEF_RGB_COLOR - red = %GW_red% - green = %GW_green% - blue = %GW_blue% ==> color = %GW_color%"[/color]
[color="#0000FF"]END[/color]
Code : Tout sélectionner
[color="#0000FF"]LPF[/color] ~[color="#EE82EE"]ADD_CRE_EFFECT[/color]~ [color="#00FF00"]INT_VAR[/color] opcode = 51 target = 1 duration = 9 parameter1 = GW_color [color="#0000FF"]END[/color]
Le but du jeu étant d'utiliser un tableau de recoloration (opcode, red, green, blue, location => color) appelé si nécessaire par la créature. Une fois mes couleurs définies, si je veux un golem bleu électrique par exemple, je n'ai plus qu'à utiliser la variable color = electric_blue. Idem pour les autres créatures ou les autres couleurs.
Bref, ça marche très bien, mais comme j'ai horreur de ne pas comprendre, si l'un de vous a une explication, je suis preneur. ]8 [Colour: Change by RGB][/URL], 9 [Colour: Glow Pulse] et 50 [Colour: Glow by RGB (Brief)], et notamment pour définir le paramètre 2 :
IESDP a écrit : Location and speed :
The 'Location' field is handled as follows:
First byte = Location
Third byte = Speed (0-255)
A speed of 0 does not pulsate. A speed of 1 is fastest, and a speed of 255 is slowest.