[Résolu] Slide show

Répondre
Partager Rechercher
Citation :
Publié par Magic Cat
Rhhha c'est beau le rêve

Ma scripteaseuse préféré je te rappelle que le setanimtexture c'est du local t'arrivera jamais à faire synchroniser la fin d'un défilement avec le début d'un autre, c'est comme mélanger du physic et du targetomega.

Mais t'inquiètes chuis dans la place
Je sens que les dernières fonctions qui viennent d'arriver vont me servir
Mais non je rêve pas: j'ai testé IW et ça marche avec un fondu au noir il faut dire. Et ma petite astuce maison pour éviter le lag de chargement texture.
Mais bon la solution de best permet d'éviter de se cogner les gif.
Désolé pour la polémique...

J'ai continué ma réflexion transitionnelle et j'ai ajouté deux modes : Dark (passage par un assombrissement jusqu'au noir) et Fast (changement instantané). Au passage j'ai corrigé quelques bugs et optimisé un peu le code. Voici le résultat :

Code PHP:

//----------------------------------------------------------------------------------
//
//                              Transition V1.1
//
//                                Bestmomo Lagan
//
//----------------------------------------------------------------------------------
//
// Nouveautés V1.1 => Mise en place modes Dark et Fast et optimisation code
//
//----------------------------------------------------------------------------------
//
//----------------------------------------------------------------------------------
//                              LIBRARY FUNCTIONS
//----------------------------------------------------------------------------------

// -- Génération d'un entier aléatoire --
// @ param [integer] Valeur maximale
// @ return [integer] entier aléatoire
integer randInt(integer n) {return (integer)llFrand(1);}

//---------------------------------------------------------------
//                        MENU FUNCTIONS
//---------------------------------------------------------------

// -- Initialisation menu --
// @ param [key]     clé de l'avatar
// @ param [string] texte pour le menu
// @ param 
[list] noms des boutons
// @ param [integer] type de menu
InitMenu(key idstring texte, list boutonsinteger typemenu) {
    
// Mise en route du timer
    
if(iMode == MODE_OFFllSetTimerEvent(TIMEOUT);
    
llResetTime();
    
// Enregistrement des paramètres
    
lBoutonsMenu boutons;
    
iCanalMenu GetRandomChannel();
    
sTexteMenu texte;
    
iIndexMenu 0;
    
iBusy TRUE;
    
iTypeMenu typemenu;
    
kAvaMenu id;
    
// Mise en place et enregistrement de l'écoute
    
iEcouteMenu llListen(iCanalMenu""id"");
    
// Envoi du menu
    
GestMenu();
}

// -- Gestion de l'index des boutons du menu --
// @ param [string] bouton de déplacement
GestIndexBoutons(string browse) {
    
// Nombre de boutons
    
integer n llGetListLength(lBoutonsMenu);
    
// Navigation simple pour deux pages
    
if(23) {
        if(
iIndexMenuiIndexMenu 0;
        else 
iIndexMenu 11;}
    
// Navigation riche pour plus de deux pages
    
else {
        if(
browse == NEXT) {
            
iIndexMenu += 10;
            if(
iIndexMenu >= niIndexMenu 0;}
        else {
            
iIndexMenu -= 10;
            if(
iIndexMenu 0iIndexMenu 10;}
    }
    
// Mise en route du timer
    
if(iMode == MODE_OFFllSetTimerEvent(TIMEOUT);
    
llResetTime();
    
// Envoi du menu
    
GestMenu();
}

//    -- Gestion menu --
GestMenu() {
    
// Liste globale des boutons
    
list lBoutons lBoutonsMenu;
    
// Nombre total de boutons
    
integer n llGetListLength(lBoutonsMenu);
    
// Si plusieurs pages
    
if(12) {
        
// Que 2 pages -> navigation simple
        
if(23) {
            
// Deuxième page
            
if(iIndexMenu)
                
lBoutons = [PREVIOUS] + llList2List(lBoutonsMenuiIndexMenu, -1);
            
// Première page
            
else
                
lBoutons llList2List(lBoutonsMenu01) + [NEXT] + llList2List(lBoutonsMenu210);}
        
// Plus de 2 pages -> navigation riche
        
else {
            list 
= [PREVIOUSllList2String(lBoutonsMenuiIndexMenu), NEXT];
            
// Première page ou page intermédiaire
            
if(iIndexMenu 10)
                
lBoutons llList2List(lBoutonsMenuiIndexMenu 1iIndexMenu 9);
            
// Dernière page
            
else {
                if(
iIndexMenu n)
                    
lBoutons llList2List(lBoutonsMenuiIndexMenu 1, -1);
                else 
lBoutons l;}
        }
    }
    
// Envoi du menu
    
llDialog(kAvaMenusTexteMenulBoutonsiCanalMenu);
}

// -- Suppression d'un menu --
CancelMenu() {
    
// On teste s'il y a quelque chose à arrêter
    
if(iEcouteMenu) {
        
// Arrêt de l'écoute du canal
        
llListenRemove(iEcouteMenu);
        
iEcouteMenu 0;
        
// Libération du menu
        
iBusy FALSE;
        
// On arrête le timer
        
if(iMode == MODE_OFFllSetTimerEvent(.0);}
}

// -- Fin du délai d'écoute des menu --
FinMenu() {
    
// On prévient l'avatar
    
llInstantMessage(kAvaMenu"Time out for dialog.");
    
// On supprime le menu
    
CancelMenu();
}

// -- Fonction qui génère un canal au hasard (négatif) --
// @ return [integer] retourne le canal
integer GetRandomChannel() {
    return ~(integer)
llFrand((float)DEBUG_CHANNEL);
}


//----------------------------------------------------------------------------------
//                        LIBRARY VARIABLES
//----------------------------------------------------------------------------------

//----------------------------------------------
//                  MENUS
//----------------------------------------------
string    PREVIOUS        "<<<";    // Bouton pour page arrière
string    NEXT            ">>>";    // Bouton pour page avant
float    TIMEOUT            60.0;        // Délai pour réponse au menu

integer    iCanalMenu;                    // Canaux du Chat
integer    iEcouteMenu;                // Handle de l'écoute
integer    iIndexMenu;                    // Index de position dans les boutons
integer    iTypeMenu;                    // Type de menu
integer    iBusy;                        // Menu occupé
string  sTexteMenu;                    // Texte pour le menu
list    lBoutonsMenu;                // Boutons du menu
key        kAvaMenu;                    // Clé de l'avatar


//----------------------------------------------------------------------------------
//                               SCRIPT FUNCTIONS
//----------------------------------------------------------------------------------

//----------------------------------------------
//                  MENUS
//----------------------------------------------

// -- Création du menu général --
// @ param [key] clé de l'avatar
Menu_Main(key id) {
    list 
MENU_MAIN;
    
// Bouton marche/arrêt
    
if(iMode != MODE_OFF+= "Off";
    if(
iMode != MODE_DARK_SHOW && iMode != MODE_DARK_TRANS)
        
+= "Dark";
    if(
iMode != MODE_FUSION_SHOW && iMode != MODE_FUSION_TRANS)
        
+= "Fusion";
    if(
iMode != MODE_FAST_SHOW)
        
+= "Fast";
    
// Affichage du menu
    
InitMenu(id"\nSelect an option"lTYPE_MENU_MAIN);
}

// -- Menu Settings --
Menu_Settings(key id) {
    list 
MENU_SETTINGS;
    
// Mode Random ou Order
    
if(iRandom+= "Order";
    else 
+= "Random";
    
// Access si owner
    
if(id == llGetOwner()) += "Access";
    
// Affichage du menu
    
InitMenu(id"\nSelect an option"lTYPE_MENU_SETTINGS);
}

// -- Menu d'accès --
Menu_Access(key id) {
    
integer i llListFindList(ACCESS, [sAccess]);
    
InitMenu(id"\nAccess is now " sAccess "\n\nSelect another access",
        [
"Back","Exit"] + llDeleteSubList(ACCESSii), TYPE_MENU_ACCESS);
}

// -- Menu Time --
// @ param [key] clé de l'avatar
// @ param [float] valeur actuelle de a durée
// @ param [string] message
// @ param [integer] type de menu
Menu_Time(key idfloat valuestring messageinteger type_menu) {
    
// Représentation string de la valeur de la durée
    
string s = (string)((integer)value) + "s";
    
// Ajustement du menu
    
integer i llListFindList(MENU_TIME, [s]);
    list 
llDeleteSubList(MENU_TIMEii);
    
// Affichage du menu
    
InitMenu(idmessage + (string)((integer)value) + " seconds"ltype_menu);
}

//----------------------------------------------
//                  AUTRES
//----------------------------------------------

// -- Test des droits d'accès --
// @ param [key] clé de l'avatar
// @ return [interger] TRUE ou FALSE
integer TestAccess(key id) {
    if(
sAccess == "Owner" && llGetOwner() == id) return TRUE;
    else if(
sAccess == "Group" && llSameGroup(id)) return TRUE;
    else if(
sAccess == "All") return TRUE;
    else return 
FALSE;
}

// -- Test présence au moins 3 images --
// @ return [integer] TRUE ou FALSE
integer Test_3_Images() {
    
integer i llGetInventoryNumber(INVENTORY_TEXTURE) > 2;
    if(
i) return TRUE;
    else {
        
llSay(0"Sorry i need at least 3 textures to work !");
        return 
FALSE;
    }
}

// -- Mise en place d'une texture --
// @ param [integer] numéro primitive
// @ param [integer] face primitive
// @ param [integer] index texture
Place_Texture(integer priminteger faceinteger idTexture) {
    
llSetLinkTexture(primllGetInventoryName(INVENTORY_TEXTUREidTexture), face);
}

// -- Mise en place initiale --
Init() {
    if(
Test_3_Images()) {
        
// Fonctionnement aléatoire
        
if(iRandom) {
            
integer i;
            
integer n llGetInventoryNumber(INVENTORY_TEXTURE) - 1;
            
integer p randInt(n);
            
// Index aléatoires
            
for(; 2; ++i) {
                while(~
llListFindList(lTextures, [p])) randInt(n);
                
lTextures += p;
            }
        }
        
// Fonctionnement ordonné
        
else {
            
lTextures = [0,1,2];
            
iIndex 2;
        }
        
// Mise en place des textures
        
Place_Texture(PRIM_ECRANFACE_ECRANllList2Integer(lTextures0));
        
Place_Texture(PRIM_BASEFACE_BASEllList2Integer(lTextures1));
        
Place_Texture(PRIM_ECRANFACE_PRELOADllList2Integer(lTextures2));
        
// Reset global au cas où
        
llSetLinkAlpha(PRIM_ECRAN1.0FACE_ECRAN);
        
llSetLinkColor(PRIM_ECRAN, <1.01.01.0>, FACE_ECRAN);
    }
}

// --  Mise en route --
// @ param [integer] mode de fonctionnement
// @ param [integer] TRUE si timer nécessaire
Go(integer modeinteger time) {
    if(
Test_3_Images()) {
        
iMode mode;
        
iRequest CHANGE_NULL;
        
// Mise en marche du timer
        
if(timellSetTimerEvent(fTimeShow);
        
// Reset global au cas où
        
llSetLinkAlpha(PRIM_ECRAN1.0FACE_ECRAN);
        
llSetLinkColor(PRIM_ECRAN, <1.01.01.0>, FACE_ECRAN);
    }
}

// -- Initialisation de la transition pour modes Fusion et dark --
// @ param [integer] Mode de fonctionnement
Init_Change(integer    mode) {
    
// Demande d'arrêt ?
    
if(!Test_Request()) {
        
// Changement du mode
        
iMode mode;
        
// Calcul du pas
        
fPas fTempsBase fTimeTrans;
        
// Spécificités du mode Dark
        
if(iMode == MODE_DARK_TRANS) {
            
fPas *= 2.0;
            
iSens TRUE;}
        
// Initialisation
        
fValeur 1.0;
        
// Réglage timer
        
llSetTimerEvent(fTempsBase);}
}

// -- Changement d'image --
Change() {
    
// Mode Fusion
    
if(iMode == MODE_FUSION_TRANS) {
        
// Diminution de l'alpha de l'écran
        
fValeur -= fPas;
        if(
fValeur >= .0)
            
llSetLinkAlpha(PRIM_ECRANfValeurFACE_ECRAN);
        else {
            
// Réglage du timer
            
llSetTimerEvent(fTimeShow);
            
// Mise en place image sur l'écran
            
Place_Texture(PRIM_ECRANFACE_ECRANllList2Integer(lTextures1));
            
// Petit délai de chargement
            
llSleep(.2);
            
// Affichage de l'écran
            
llSetLinkAlpha(PRIM_ECRAN1.0FACE_ECRAN);
            
// Chargement des textures
            
Charge_Textures();
            
// Changement du mode
            
if(!Test_Request())
                
iMode MODE_FUSION_SHOW;
        }
    }
    
// Mode Dark
    
else if(iMode == MODE_DARK_TRANS) {
        
// Premier sens (noircissement)
        
if(iSens) {
            
fValeur -= fPas;
            if(
fValeur >= .0)
                
llSetLinkColor(PRIM_ECRAN, <fValeurfValeurfValeur>, FACE_ECRAN);
            else {
                
// Changement sens
                
iSens FALSE;
                
// Mise en place image sur l'écran
                
Place_Texture(PRIM_ECRANFACE_ECRANllList2Integer(lTextures1));
                
// Chargement des textures
                
Charge_Textures();
            }
        }
        
// Sens retour (éclaircissement)
        
else {
            
fValeur += fPas;
            if(
fValeur <= 1.0)
                
llSetLinkColor(PRIM_ECRAN, <fValeurfValeurfValeur>, FACE_ECRAN);
            else {
                
// Réglage du timer
                
llSetTimerEvent(fTimeShow);
                
// Changement du mode
                
if(!Test_Request())
                    
iMode MODE_DARK_SHOW;
            }
        }
    }
    
// Mode Fast
    
else if(iMode == MODE_FAST_SHOW) {
        if(!
Test_Request()) {
            
// Réglage du timer
            
llSetTimerEvent(fTimeShow);
            
// Mise en place image sur l'écran
            
Place_Texture(PRIM_ECRANFACE_ECRANllList2Integer(lTextures1));
            
// Chargement des textures
            
Charge_Textures();
        }
    }
}

// -- Chargement des textures --
Charge_Textures() {
    
// Nombre de textures
    
integer n llGetInventoryNumber(INVENTORY_TEXTURE) - 1;
    
// Mise en place image sur la base cachée
    
Place_Texture(PRIM_BASEFACE_BASEllList2Integer(lTextures2));
    
// Mise à jour de la liste des textures
    
lTextures llListReplaceList(lTexturesllList2List(lTextures12), 01);
    
lTextures llDeleteSubList(lTextures22);
    
// Fonctionnement aléatoire
    
if(iRandom) {
        
integer p randInt(n);
        while(~
llListFindList(lTextures, [p])) randInt(n);
        
lTextures += p;
        
Place_Texture(PRIM_ECRANFACE_PRELOADp);
    }
    
// Fonctionnement ordonné
    
else {
        if(++
iIndex niIndex 0;
        
lTextures += iIndex;
        
Place_Texture(PRIM_ECRANFACE_PRELOADiIndex);
    }
}

// -- Test de changement --
// @ return [integer] Test positif
integer Test_Request() {
    if(
iRequest == CHANGE_NULL) return FALSE;
    else if(
iRequest == CHANGE_FUSIONGo(MODE_FUSION_SHOWTRUE);
    else if(
iRequest == CHANGE_DARKGo(MODE_DARK_SHOWTRUE);
    else if(
iRequest == CHANGE_FASTGo(MODE_FAST_SHOWTRUE);
    else if(
iRequest == CHANGE_OFFOff();
    return 
TRUE;
}

// -- Test de mode --
// @ param [integer] Mode de fonctionnement
// @ return [integer] Test positif
integer Test_Mode(integer mode) {
    if(
iMode == MODE_OFF) {
        
Go(modeTRUE);
        return 
FALSE;}
    else if(
iMode == MODE_FUSION_SHOW || iMode == MODE_FAST_SHOW ||  iMode == MODE_DARK_SHOW) {
        
Go(modeFALSE);
        return 
FALSE;}
    return 
TRUE;
}

// --  Arrêt --
Off() {
    
iMode MODE_OFF;
    
// Arrêt du timer
    
if(iEcouteMenullSetTimerEvent(TIMEOUT);
    else 
llSetTimerEvent(.0);
    
// Message
    
llWhisper(0"mode is now Off");
}

//--------------------------------------------------------------------------------------
//                           VARIABLES GLOBALES
//--------------------------------------------------------------------------------------

//----------------------------------------------
//                  PARAMETRES
//----------------------------------------------
string        VERSION            "1.1";
integer        PRIM_BASE        1;        // Numéro de la primitive de base
integer        PRIM_ECRAN        2;        // Numéro de la prim "écran"
integer        FACE_BASE        0;        // Numéro de la face de base
integer        FACE_ECRAN        0;        // Numéro de la face "écran"
integer        FACE_PRELOAD    5;        // Numéro de la face de pré-chargement

//----------------------------------------------
//                  MENU
//----------------------------------------------
list     MENU_MAIN         = ["Exit","Settings"];
list    
MENU_SETTINGS    = ["Back","Exit","Time Show","Time Trans"];
list     
MENU_TIME        = ["Back","Exit","2s","5s","10s","20s","30s","40s","50s","60s","120s","240s"];
list    
ACCESS          = ["Owner","Group","All"];

//----------------------------------------------
//                  VALEURS
//----------------------------------------------
integer        TYPE_MENU_MAIN         0;
integer        TYPE_MENU_ACCESS    1;
integer        TYPE_MENU_SETTINGS    2;
integer        TYPE_MENU_TIMESHOW    3;
integer        TYPE_MENU_TIMETRANS    4;

integer        MODE_OFF            0;
integer        MODE_FUSION_SHOW    1;
integer        MODE_FUSION_TRANS    2;
integer        MODE_DARK_SHOW        3;
integer        MODE_DARK_TRANS        4;
integer        MODE_FAST_SHOW        5;

integer        CHANGE_NULL            0;
integer        CHANGE_OFF            1;
integer        CHANGE_FUSION        2;
integer        CHANGE_DARK            3;
integer        CHANGE_FAST            4;

//----------------------------------------------
//                  AUTRES
//----------------------------------------------
integer        iMode;                    // Mode de fonctionnement
integer        iRandom;                // Mode Random
integer        iIndex;                    // Index en mode ordonné
integer        iSens;                    // Sens de modification pour mode Dark
integer        iRequest;                // Demande de changement
string        sAccess     "Owner";    // Accès
float        fTimeShow    5.0;        // Durée de présence image
float        fTimeTrans    2.0;        // Durée de transition
float        fTempsBase    .02;        // Temps de base
float        fPas;                    // Pas de changement
float        fValeur;                // Valeur actuelle
list        lTextures;                // Liste des index des 3 textures

//--------------------------------------------------------------------------------------
//        STATE default
//--------------------------------------------------------------------------------------
default
{
    
state_entry() {
        
// Message
        
llWhisper(0"Transition V"VERSION " ready");
        
// Initialisation
        
Init();
    }

    
changed(integer change)    {
        if(
change CHANGED_INVENTORYInit();
    }

    
touch_start(integer total_number)
    {
        
key k llDetectedKey(0);
        if(
TestAccess(k) == FALSE)
            
llInstantMessage(k"Sorry no access for you.");
        else {
            if(
iBusy && != kAvaMenu)
                
llInstantMessage(k"Sorry but the menu is busy.");
            else
                
Menu_Main(k);
        }
    }

    
listen(integer channelstring namekey idstring message) {
        
// Test de changement de page pour navigation
        
if(llListFindList([PREVIOUS,NEXT], [message]) != -1)
            
GestIndexBoutons(message);
        
// Reset du menu
        
CancelMenu();
        
// Sortie directe
        
if(message == "Exit") return;
        else {
            
// Gestion menu général
            
if(iTypeMenu == TYPE_MENU_MAIN)
            {
                if(
message == "Fusion") {
                    if(
Test_Mode(MODE_FUSION_SHOW))
                        
iRequest CHANGE_FUSION;
                    
llWhisper(0"mode is now Fusion");}
                else if(
message == "Dark") {
                    if(
Test_Mode(MODE_DARK_SHOW))
                        
iRequest CHANGE_DARK;
                    
llWhisper(0"mode is now Dark");}
                else if(
message == "Fast") {
                    if(
Test_Mode(MODE_FAST_SHOW))
                        
iRequest CHANGE_FAST;
                    
llWhisper(0"mode is now Fast");}
                else if(
message == "Off")
                    
iRequest CHANGE_OFF;
                else if(
message == "Settings")
                    
Menu_Settings(id);
            }
            
// Gestion du menu Settings
            
else if(iTypeMenu == TYPE_MENU_SETTINGS) {
                if(
message == "Back")
                    
Menu_Main(id);
                else if(
message == "Access")
                    
Menu_Access(id);
                else if(
message == "Random") {
                    
iRandom TRUE;
                    
Menu_Settings(id);}
                else if(
message == "Order") {
                    
iRandom FALSE;
                    
Menu_Settings(id);}
                else if(
message == "Time Show")
                    
Menu_Time(idfTimeShow"\nSelect a time for show\n\nTime is now ",
                    
TYPE_MENU_TIMESHOW);
                else if(
message == "Time Trans")
                    
Menu_Time(idfTimeTrans"\nSelect a time for transition\n\nTime is now ",
                    
TYPE_MENU_TIMETRANS);
            }
            
// Gestion menu Access
            
else if(iTypeMenu == TYPE_MENU_ACCESS) {
                if(
message != "Back")
                    
sAccess message;
                
Menu_Settings(id);
            }
            
// Gestion menus Time
            
else {
                if(
message != "Back") {
                    if(
iTypeMenu == TYPE_MENU_TIMESHOW)
                        
fTimeShow = (float)message;
                    else if(
iTypeMenu == TYPE_MENU_TIMETRANS)
                        
fTimeTrans = (float)message;}
                
Menu_Settings(id);
            }
        }
    }

    
timer()    {
        if(
iEcouteMenu && llGetTime() > TIMEOUTFinMenu();
        if(
iMode == MODE_FUSION_SHOWInit_Change(MODE_FUSION_TRANS);
        else if(
iMode == MODE_DARK_SHOWInit_Change(MODE_DARK_TRANS);
        else if(
iMode == MODE_FAST_SHOW || iMode == MODE_FUSION_TRANS || iMode == MODE_DARK_TRANSChange();
    }

Si vous trouvez des bugs dites le.

Je songe à d'autres modes de transition. Il est dommage de ne pas encore disposer des nouvelles fonctions de transformation rapide sinon je verrais bien des effacements progressifs par balayage et autres fantaisies.
Citation :
Publié par Elenia Boucher
bon apparemment ça ne marche pas Best: je met dans un cube, je met 3 textures, j'ai bien accès au menu, je choisi ma transition et rien ne s'affiche.
Je rappelle qu'il faut partir de deux primitives liées et mettre le script que j'ai posté précédemment pour créer le panneau de visualisation
Citation :
Publié par Elenia Boucher
ah. Tu sais bien que je suis un peu blonde sur les bords. Et même très pour mon avatar. Faut m'expliquer longtemps: jusqu'a ce que mon unique neurone daigne envoyer un message à lui-même.
Si toutes les blondes savaient scripter comme toi je commencerais à les considérer différemment
J'ai ajouté une transition qui nécessite la version 1.38 du serveur.

Code PHP:

//----------------------------------------------------------------------------------
//
//                              Transition V1.2
//
//                             Bestmomo Lagan
//
//----------------------------------------------------------------------------------
//
// Nouveautés V1.1 => Mise en place modes Dark et Fast et optimisation code
// Nouveautés V1.2 => Mise en place mode Swap
//
//----------------------------------------------------------------------------------
//
//----------------------------------------------------------------------------------
//                              LIBRARY FUNCTIONS
//----------------------------------------------------------------------------------

// -- Génération d'un entier aléatoire --
// @ param [integer] Valeur maximale
// @ return [integer] entier aléatoire
integer randInt(integer n) {return (integer)llFrand(1);}

// -- Passage de glogal à local --
// @ param [vector] Position globale
// @ return [vector] Position locale
vector Global2Local(vector position) {
    return (
position llGetRootPosition()) / llGetRootRotation();}

//---------------------------------------------------------------
//                        MENU FUNCTIONS
//---------------------------------------------------------------

// -- Initialisation menu --
// @ param [key]     clé de l'avatar
// @ param [string] texte pour le menu
// @ param 
[list] noms des boutons
// @ param [integer] type de menu
InitMenu(key idstring texte, list boutonsinteger typemenu) {
    
// Mise en route du timer
    
if(iMode == MODE_OFFllSetTimerEvent(TIMEOUT);
    
llResetTime();
    
// Enregistrement des paramètres
    
lBoutonsMenu boutons;
    
iCanalMenu GetRandomChannel();
    
sTexteMenu texte;
    
iIndexMenu 0;
    
iBusy TRUE;
    
iTypeMenu typemenu;
    
kAvaMenu id;
    
// Mise en place et enregistrement de l'écoute
    
iEcouteMenu llListen(iCanalMenu""id"");
    
// Envoi du menu
    
GestMenu();
}

// -- Gestion de l'index des boutons du menu --
// @ param [string] bouton de déplacement
GestIndexBoutons(string browse) {
    
// Nombre de boutons
    
integer n llGetListLength(lBoutonsMenu);
    
// Navigation simple pour deux pages
    
if(iIndexMenuiIndexMenu 0;
    else 
iIndexMenu 11;
    
// Mise en route du timer
    
if(iMode == MODE_OFFllSetTimerEvent(TIMEOUT);
    
llResetTime();
    
// Envoi du menu
    
GestMenu();
}

//    -- Gestion menu --
GestMenu() {
    
// Liste globale des boutons
    
list lBoutons lBoutonsMenu;
    
// Nombre total de boutons
    
integer n llGetListLength(lBoutonsMenu);
    
// Si plusieurs pages
    
if(12) {
        
// Que 2 pages -> navigation simple
        // Deuxième page
        
if(iIndexMenu)
            
lBoutons = [PREVIOUS] + llList2List(lBoutonsMenuiIndexMenu, -1);
        
// Première page
        
else
            
lBoutons llList2List(lBoutonsMenu01) + [NEXT] + llList2List(lBoutonsMenu210);}
    
// Envoi du menu
    
llDialog(kAvaMenusTexteMenulBoutonsiCanalMenu);
}

// -- Suppression d'un menu --
CancelMenu() {
    
// On teste s'il y a quelque chose à arrêter
    
if(iEcouteMenu) {
        
// Arrêt de l'écoute du canal
        
llListenRemove(iEcouteMenu);
        
iEcouteMenu 0;
        
// Libération du menu
        
iBusy FALSE;
        
// On arrête le timer
        
if(iMode == MODE_OFFllSetTimerEvent(.0);}
}

// -- Fin du délai d'écoute des menu --
FinMenu() {
    
// On prévient l'avatar
    
llInstantMessage(kAvaMenu"Time out for dialog.");
    
// On supprime le menu
    
CancelMenu();
}

// -- Fonction qui génère un canal au hasard (négatif) --
// @ return [integer] retourne le canal
integer GetRandomChannel() {
    return ~(integer)
llFrand((float)DEBUG_CHANNEL);
}


//----------------------------------------------------------------------------------
//                        LIBRARY VARIABLES
//----------------------------------------------------------------------------------

//----------------------------------------------
//                  MENUS
//----------------------------------------------
string    PREVIOUS        "<<<";    // Bouton pour page arrière
string    NEXT            ">>>";    // Bouton pour page avant
float    TIMEOUT            60.0;        // Délai pour réponse au menu

integer    iCanalMenu;                    // Canaux du Chat
integer    iEcouteMenu;                // Handle de l'écoute
integer    iIndexMenu;                    // Index de position dans les boutons
integer    iTypeMenu;                    // Type de menu
integer    iBusy;                        // Menu occupé
string  sTexteMenu;                    // Texte pour le menu
list    lBoutonsMenu;                // Boutons du menu
key        kAvaMenu;                    // Clé de l'avatar


//----------------------------------------------------------------------------------
//                               SCRIPT FUNCTIONS
//----------------------------------------------------------------------------------

//----------------------------------------------
//                  MENUS
//----------------------------------------------

// -- Création du menu général --
// @ param [key] clé de l'avatar
Menu_Main(key id) {
    list 
MENU_MAIN;
    
// Bouton marche/arrêt
    
if(iMode != MODE_OFF+= "Off";
    
// Modes
    
if(iMode != MODE_DARK_SHOW && iMode != MODE_DARK_TRANS)
        
+= "Dark";
    if(
iMode != MODE_FUSION_SHOW && iMode != MODE_FUSION_TRANS)
        
+= "Fusion";
    if(
iMode != MODE_SWAP_SHOW && iMode != MODE_SWAP_TRANS)
        
+= "Swap";
    if(
iMode != MODE_FAST_SHOW)
        
+= "Fast";
    
// Affichage du menu
    
InitMenu(id"\nSelect an option"lTYPE_MENU_MAIN);
}

// -- Menu Settings --
Menu_Settings(key id) {
    list 
MENU_SETTINGS;
    
// Mode Random ou Order
    
if(iRandom+= "Order";
    else 
+= "Random";
    
// Access si owner
    
if(id == llGetOwner()) += "Access";
    
// Affichage du menu
    
InitMenu(id"\nSelect an option"lTYPE_MENU_SETTINGS);
}

// -- Menu d'accès --
Menu_Access(key id) {
    
integer i llListFindList(ACCESS, [sAccess]);
    
InitMenu(id"\nAccess is now " sAccess "\n\nSelect another access",
        [
"Back","Exit"] + llDeleteSubList(ACCESSii), TYPE_MENU_ACCESS);
}

// -- Menu Time --
// @ param [key] clé de l'avatar
// @ param [float] valeur actuelle de a durée
// @ param [string] message
// @ param [integer] type de menu
Menu_Time(key idfloat valuestring messageinteger type_menu) {
    
// Représentation string de la valeur de la durée
    
string s = (string)((integer)value) + "s";
    
// Ajustement du menu
    
integer i llListFindList(MENU_TIME, [s]);
    list 
llDeleteSubList(MENU_TIMEii);
    
// Affichage du menu
    
InitMenu(idmessage + (string)((integer)value) + " seconds"ltype_menu);
}

//----------------------------------------------
//                  AUTRES
//----------------------------------------------

// -- Test des droits d'accès --
// @ param [key] clé de l'avatar
// @ return [interger] TRUE ou FALSE
integer TestAccess(key id) {
    if(
sAccess == "Owner" && llGetOwner() == id) return TRUE;
    else if(
sAccess == "Group" && llSameGroup(id)) return TRUE;
    else if(
sAccess == "All") return TRUE;
    else return 
FALSE;
}

// -- Test présence au moins 3 images --
// @ return [integer] TRUE ou FALSE
integer Test_3_Images() {
    
integer i llGetInventoryNumber(INVENTORY_TEXTURE) > 2;
    if(
i) return TRUE;
    else {
        
llSay(0"Sorry i need at least 3 textures to work !");
        return 
FALSE;
    }
}

// -- Mise en place d'une texture --
// @ param [integer] numéro primitive
// @ param [integer] face primitive
// @ param [integer] index texture
Place_Texture(integer priminteger faceinteger idTexture) {
    
llSetLinkTexture(primllGetInventoryName(INVENTORY_TEXTUREidTexture), face);
}

// -- Mise en place initiale --
Init() {
    if(
Test_3_Images()) {
        
// Fonctionnement ordonné
        
lTextures = [0,1,2];
        
iIndex 2;
        
// Mise en place des textures
        
Place_Texture(PRIM_ECRANFACE_ECRANllList2Integer(lTextures0));
        
Place_Texture(PRIM_BASEFACE_BASEllList2Integer(lTextures1));
        
Place_Texture(PRIM_ECRANFACE_PRELOADllList2Integer(lTextures2));
        
// Reset global au cas où
        
llSetLinkAlpha(PRIM_ECRAN1.0FACE_ECRAN);
        
llSetLinkColor(PRIM_ECRAN, <1.01.01.0>, FACE_ECRAN);}
}

// --  Mise en route --
// @ param [integer] mode de fonctionnement
// @ param [integer] TRUE si timer nécessaire
Go(integer modeinteger time) {
    if(
Test_3_Images()) {
        
iMode mode;
        
iRequest CHANGE_NULL;
        
// Mise en marche du timer
        
if(timellSetTimerEvent(fTimeShow);
        
// Reset global au cas où
        
llSetLinkAlpha(PRIM_ECRAN1.0FACE_ECRAN);
        
llSetLinkColor(PRIM_ECRAN, <1.01.01.0>, FACE_ECRAN);
    }
}

// -- Initialisation de la transition pour modes Fusion et dark --
// @ param [integer] Mode de fonctionnement
Init_Change(integer    mode) {
    
// Demande d'arrêt ?
    
if(!Test_Request()) {
        
// Changement du mode
        
iMode mode;
        
// Calcul du pas
        
fPas fTempsBase fTimeTrans;
        
// Spécificités du mode Dark
        
if(iMode == MODE_DARK_TRANS) {
            
fPas *= 2.0;
            
iSens TRUE;}
        
// Initialisation
        
fValeur 1.0;
        
// Réglage timer
        
llSetTimerEvent(fTempsBase);}
}

// -- Changement d'image --
Change() {
    
// Mode Fusion
    
if(iMode == MODE_FUSION_TRANS) {
        
// Diminution de l'alpha de l'écran
        
fValeur -= fPas;
        if(
fValeur >= .0)
            
llSetLinkAlpha(PRIM_ECRANfValeurFACE_ECRAN);
        else {
            
// Réglage du timer
            
llSetTimerEvent(fTimeShow);
            
// Mise en place image sur l'écran
            
Place_Texture(PRIM_ECRANFACE_ECRANllList2Integer(lTextures1));
            
// Petit délai de chargement
            
llSleep(.2);
            
// Affichage de l'écran
            
llSetLinkAlpha(PRIM_ECRAN1.0FACE_ECRAN);
            
// Chargement des textures
            
Charge_Textures();
            
// Changement du mode
            
if(!Test_Request())
                
iMode MODE_FUSION_SHOW;
        }
    }
    
// Mode Swap
    
if(iMode == MODE_SWAP_TRANS) {
        
// Diminution de la largeur et déplacement de l'écran
        
fValeur -= fPas;
        if(
fValeur .0) {
            
float fLargeur vEcran_size.fValeur;
            
vector vSize = <fLargeurvEcran_size.yvEcran_size.z>;
            
vector vPos = <vEcran_pos.+ (vEcran_size.fLargeur) / 2.0vEcran_pos.yvEcran_pos.z>;
            
llSetLinkPrimitiveParamsFast(PRIM_ECRAN, [PRIM_SIZEvSize,
                
PRIM_POSITIONvPos,
                
PRIM_TEXTUREFACE_ECRANllGetInventoryName(INVENTORY_TEXTUREllList2Integer(lTextures0)),
                <
fValeur1.0.0>, <(fValeur 1.0) / 2.0.0.0>, .0]);
        }
        else  {
            
// Réglage du timer
            
llSetTimerEvent(fTimeShow);
            
// Effacement de l'écran
            
llSetLinkAlpha(PRIM_ECRAN.0FACE_ECRAN);
            
// Redimensionnement de l'écran et affichage
            
llSetLinkPrimitiveParamsFast(PRIM_ECRAN, [PRIM_SIZEvEcran_size,
                
PRIM_POSITIONvEcran_pos,
                
PRIM_TEXTUREFACE_ECRANllGetInventoryName(INVENTORY_TEXTUREllList2Integer(lTextures1)),
                <
1.01.0.0>, <1.0.0.0>, .0]);
            
// Petit délai
            
llSleep(1.0);
            
// Affichage de l'écran
            
llSetLinkAlpha(PRIM_ECRAN1.0FACE_ECRAN);
            
// Chargement des textures
            
Charge_Textures();
            
// Changement du mode
            
if(!Test_Request())
                
iMode MODE_SWAP_SHOW;
        }
    }
    
// Mode Dark
    
else if(iMode == MODE_DARK_TRANS) {
        
// Premier sens (noircissement)
        
if(iSens) {
            
fValeur -= fPas;
            if(
fValeur >= .0)
                
llSetLinkColor(PRIM_ECRAN, <fValeurfValeurfValeur>, FACE_ECRAN);
            else {
                
// Changement sens
                
iSens FALSE;
                
// Mise en place image sur l'écran
                
Place_Texture(PRIM_ECRANFACE_ECRANllList2Integer(lTextures1));
                
// Chargement des textures
                
Charge_Textures();
            }
        }
        
// Sens retour (éclaircissement)
        
else {
            
fValeur += fPas;
            if(
fValeur <= 1.0)
                
llSetLinkColor(PRIM_ECRAN, <fValeurfValeurfValeur>, FACE_ECRAN);
            else {
                
// Réglage du timer
                
llSetTimerEvent(fTimeShow);
                
// Changement du mode
                
if(!Test_Request())
                    
iMode MODE_DARK_SHOW;
            }
        }
    }
    
// Mode Fast
    
else if(iMode == MODE_FAST_SHOW) {
        if(!
Test_Request()) {
            
// Réglage du timer
            
llSetTimerEvent(fTimeShow);
            
// Mise en place image sur l'écran
            
Place_Texture(PRIM_ECRANFACE_ECRANllList2Integer(lTextures1));
            
// Chargement des textures
            
Charge_Textures();
        }
    }
}

// -- Chargement des textures --
Charge_Textures() {
    
// Nombre de textures
    
integer n llGetInventoryNumber(INVENTORY_TEXTURE) - 1;
    
// Mise en place image sur la base cachée
    
Place_Texture(PRIM_BASEFACE_BASEllList2Integer(lTextures2));
    
// Mise à jour de la liste des textures
    
lTextures llListReplaceList(lTexturesllList2List(lTextures12), 01);
    
lTextures llDeleteSubList(lTextures22);
    
// Fonctionnement aléatoire
    
if(iRandom) {
        
integer p randInt(n);
        while(~
llListFindList(lTextures, [p])) randInt(n);
        
lTextures += p;
        
Place_Texture(PRIM_ECRANFACE_PRELOADp);
    }
    
// Fonctionnement ordonné
    
else {
        if(++
iIndex niIndex 0;
        
lTextures += iIndex;
        
Place_Texture(PRIM_ECRANFACE_PRELOADiIndex);
    }
}

// -- Test de changement --
// @ return [integer] Test positif
integer Test_Request() {
    if(
iRequest == CHANGE_NULL) return FALSE;
    else if(
iRequest == CHANGE_FUSIONGo(MODE_FUSION_SHOWTRUE);
    else if(
iRequest == CHANGE_DARKGo(MODE_DARK_SHOWTRUE);
    else if(
iRequest == CHANGE_SWAPGo(MODE_SWAP_SHOWTRUE);
    else if(
iRequest == CHANGE_FASTGo(MODE_FAST_SHOWTRUE);
    else if(
iRequest == CHANGE_OFFOff();
    return 
TRUE;
}

// -- Test de mode --
// @ param [integer] Mode de fonctionnement
// @ return [integer] Test positif
integer Test_Mode(integer mode) {
    if(
iMode == MODE_OFF) {
        
Go(modeTRUE);
        return 
FALSE;}
    else if(
iMode == MODE_FUSION_SHOW || iMode == MODE_FAST_SHOW
        
||  iMode == MODE_DARK_SHOW ||  iMode == MODE_SWAP_SHOW) {
            
Go(modeFALSE);
            return 
FALSE;}
    return 
TRUE;
}

// --  Arrêt --
Off() {
    
iMode MODE_OFF;
    
// Arrêt du timer
    
if(iEcouteMenullSetTimerEvent(TIMEOUT);
    else 
llSetTimerEvent(.0);
    
// Message
    
llWhisper(0"mode is now Off");
}

//--------------------------------------------------------------------------------------
//                           VARIABLES GLOBALES
//--------------------------------------------------------------------------------------

//----------------------------------------------
//                  PARAMETRES
//----------------------------------------------
string        VERSION            "1.2";
integer        PRIM_BASE        1;        // Numéro de la primitive de base
integer        PRIM_ECRAN        2;        // Numéro de la prim "écran"
integer        FACE_BASE        0;        // Numéro de la face de base
integer        FACE_ECRAN        0;        // Numéro de la face "écran"
integer        FACE_PRELOAD    5;        // Numéro de la face de pré-chargement

//----------------------------------------------
//                  MENU
//----------------------------------------------
list     MENU_MAIN         = ["Exit","Settings"];
list    
MENU_SETTINGS    = ["Back","Exit","Time Show","Time Trans"];
list     
MENU_TIME        = ["Back","Exit","2s","5s","10s","20s","30s","40s","50s","60s","120s","240s"];
list    
ACCESS          = ["Owner","Group","All"];

//----------------------------------------------
//                  VALEURS
//----------------------------------------------
integer        TYPE_MENU_MAIN         0;
integer        TYPE_MENU_ACCESS    1;
integer        TYPE_MENU_SETTINGS    2;
integer        TYPE_MENU_TIMESHOW    3;
integer        TYPE_MENU_TIMETRANS    4;

integer        MODE_OFF            0;
integer        MODE_FUSION_SHOW    1;
integer        MODE_FUSION_TRANS    2;
integer        MODE_DARK_SHOW        3;
integer        MODE_DARK_TRANS        4;
integer        MODE_FAST_SHOW        5;
integer        MODE_SWAP_SHOW        6;
integer        MODE_SWAP_TRANS        7;

integer        CHANGE_NULL            0;
integer        CHANGE_OFF            1;
integer        CHANGE_FUSION        2;
integer        CHANGE_DARK            3;
integer        CHANGE_FAST            4;
integer        CHANGE_SWAP            5;

//----------------------------------------------
//                  AUTRES
//----------------------------------------------
integer        iMode;                    // Mode de fonctionnement
integer        iRandom;                // Mode Random
integer        iIndex;                    // Index en mode ordonné
integer        iSens;                    // Sens de modification pour mode Dark
integer        iRequest;                // Demande de changement
string        sAccess     "Owner";    // Accès
float        fTimeShow    5.0;        // Durée de présence image
float        fTimeTrans    2.0;        // Durée de transition
float        fTempsBase    .02;        // Temps de base
float        fPas;                    // Pas de changement
float        fValeur;                // Valeur actuelle
vector      vEcran_size;            // Dimension de l'écran
vector      vEcran_pos;             // Position de l'écran;
list        lTextures;                // Liste des index des 3 textures

//--------------------------------------------------------------------------------------
//        STATE default
//--------------------------------------------------------------------------------------
default
{
    
state_entry() {
        
// Message
        
llWhisper(0"Transition V"VERSION " ready");
        
// Valeurs de départ pour swap
        
list llGetLinkPrimitiveParams(PRIM_ECRAN, [PRIM_SIZEPRIM_POSITION]);
        
vEcran_size llList2Vector(l0);
        
vEcran_pos Global2Local(llList2Vector(l1));
        
// Initialisation
        
Init();
    }

    
changed(integer change)    {
        if(
change CHANGED_INVENTORYInit();
    }

    
touch_start(integer total_number)
    {
        
key k llDetectedKey(0);
        if(
TestAccess(k) == FALSE)
            
llInstantMessage(k"Sorry no access for you.");
        else {
            if(
iBusy && != kAvaMenu)
                
llInstantMessage(k"Sorry but the menu is busy.");
            else
                
Menu_Main(k);
        }
    }

    
listen(integer channelstring namekey idstring message) {
        
// Test de changement de page pour navigation
        
if(llListFindList([PREVIOUS,NEXT], [message]) != -1)
            
GestIndexBoutons(message);
        
// Reset du menu
        
CancelMenu();
        
// Sortie directe
        
if(message == "Exit") return;
        else {
            
// Gestion menu général
            
if(iTypeMenu == TYPE_MENU_MAIN)
            {
                if(
message == "Fusion") {
                    if(
Test_Mode(MODE_FUSION_SHOW))
                        
iRequest CHANGE_FUSION;
                    
llWhisper(0"mode is now Fusion");}
                else if(
message == "Dark") {
                    if(
Test_Mode(MODE_DARK_SHOW))
                        
iRequest CHANGE_DARK;
                    
llWhisper(0"mode is now Dark");}
                else if(
message == "Fast") {
                    if(
Test_Mode(MODE_FAST_SHOW))
                        
iRequest CHANGE_FAST;
                    
llWhisper(0"mode is now Fast");}
                else if(
message == "Swap") {
                    if(
Test_Mode(MODE_SWAP_SHOW))
                        
iRequest CHANGE_SWAP;
                    
llWhisper(0"mode is now Swap");}
                else if(
message == "Off")
                    
iRequest CHANGE_OFF;
                else if(
message == "Settings")
                    
Menu_Settings(id);
            }
            
// Gestion du menu Settings
            
else if(iTypeMenu == TYPE_MENU_SETTINGS) {
                if(
message == "Back")
                    
Menu_Main(id);
                else if(
message == "Access")
                    
Menu_Access(id);
                else if(
message == "Random") {
                    
iRandom TRUE;
                    
Menu_Settings(id);}
                else if(
message == "Order") {
                    
iRandom FALSE;
                    
Menu_Settings(id);}
                else if(
message == "Time Show")
                    
Menu_Time(idfTimeShow"\nSelect a time for show\n\nTime is now ",
                    
TYPE_MENU_TIMESHOW);
                else if(
message == "Time Trans")
                    
Menu_Time(idfTimeTrans"\nSelect a time for transition\n\nTime is now ",
                    
TYPE_MENU_TIMETRANS);
            }
            
// Gestion menu Access
            
else if(iTypeMenu == TYPE_MENU_ACCESS) {
                if(
message != "Back")
                    
sAccess message;
                
Menu_Settings(id);
            }
            
// Gestion menus Time
            
else {
                if(
message != "Back") {
                    if(
iTypeMenu == TYPE_MENU_TIMESHOW)
                        
fTimeShow = (float)message;
                    else if(
iTypeMenu == TYPE_MENU_TIMETRANS)
                        
fTimeTrans = (float)message;}
                
Menu_Settings(id);
            }
        }
    }

    
timer()    {
        if(
iEcouteMenu && llGetTime() > TIMEOUTFinMenu();
        if(
iMode == MODE_FUSION_SHOWInit_Change(MODE_FUSION_TRANS);
        else if(
iMode == MODE_DARK_SHOWInit_Change(MODE_DARK_TRANS);
        else if(
iMode == MODE_SWAP_SHOWInit_Change(MODE_SWAP_TRANS);
        else if(
iMode == MODE_FAST_SHOW || iMode == MODE_FUSION_TRANS
            
|| iMode == MODE_DARK_TRANS || iMode == MODE_SWAP_TRANSChange();
    }

Ma préférée est quand même la fusion :

J'ai ajouté la glissade en diagonale et j'ai aussi intégré la construction de l'écran pour m'éviter de répondre encore à ce sujet .

Donc maintenant il y a tout dans un seul script. Posez deux boites que vous liez et glissez le script et vos textures (au moins trois) dedans. c'est tout

Je rappelle que le code est pour la version 1.38 des serveurs, mais je pense qu'ils y sont maintenant presque tous.

Si vous avez des idées de transitions je suis preneur.

Code PHP:

//----------------------------------------------------------------------------------
//
//                              Transition V1.3
//
//                                Bestmomo Lagan
//
//----------------------------------------------------------------------------------
//
// Nouveautés V1.1 => Mise en place modes Dark et Fast et optimisation code
// Nouveautés V1.2 => Mise en place mode Swap horizontal
// Nouveautés V1.3 => Mise en place mode Swap diagonal et intégration du code de construction
//
//----------------------------------------------------------------------------------
//
//----------------------------------------------------------------------------------
//                              LIBRARY FUNCTIONS
//----------------------------------------------------------------------------------

// -- Génération d'un entier aléatoire --
// @ param [integer] Valeur maximale
// @ return [integer] entier aléatoire
integer randInt(integer n) {return (integer)llFrand(1);}

// -- Passage de glogal à local --
// @ param [vector] Position globale
// @ return [vector] Position locale
vector Global2Local(vector position) {
    return (
position llGetRootPosition()) / llGetRootRotation();}

//---------------------------------------------------------------
//                        MENU FUNCTIONS
//---------------------------------------------------------------

// -- Initialisation menu --
// @ param [key]     clé de l'avatar
// @ param [string] texte pour le menu
// @ param 
[list] noms des boutons
// @ param [integer] type de menu
InitMenu(key idstring texte, list boutonsinteger typemenu) {
    
// Mise en route du timer
    
if(iMode == MODE_OFFllSetTimerEvent(TIMEOUT);
    
llResetTime();
    
// Enregistrement des paramètres
    
lBoutonsMenu boutons;
    
iCanalMenu GetRandomChannel();
    
sTexteMenu texte;
    
iIndexMenu 0;
    
iBusy TRUE;
    
iTypeMenu typemenu;
    
kAvaMenu id;
    
// Mise en place et enregistrement de l'écoute
    
iEcouteMenu llListen(iCanalMenu""id"");
    
// Envoi du menu
    
GestMenu();
}

// -- Gestion de l'index des boutons du menu --
// @ param [string] bouton de déplacement
GestIndexBoutons(string browse) {
    
// Nombre de boutons
    
integer n llGetListLength(lBoutonsMenu);
    
// Navigation simple pour deux pages
    
if(iIndexMenuiIndexMenu 0;
    else 
iIndexMenu 11;
    
// Mise en route du timer
    
if(iMode == MODE_OFFllSetTimerEvent(TIMEOUT);
    
llResetTime();
    
// Envoi du menu
    
GestMenu();
}

//    -- Gestion menu --
GestMenu() {
    
// Liste globale des boutons
    
list lBoutons lBoutonsMenu;
    
// Nombre total de boutons
    
integer n llGetListLength(lBoutonsMenu);
    
// Si plusieurs pages
    
if(12) {
        
// Que 2 pages -> navigation simple
        // Deuxième page
        
if(iIndexMenu)
            
lBoutons = [PREVIOUS] + llList2List(lBoutonsMenuiIndexMenu, -1);
        
// Première page
        
else
            
lBoutons llList2List(lBoutonsMenu01) + [NEXT] + llList2List(lBoutonsMenu210);}
    
// Envoi du menu
    
llDialog(kAvaMenusTexteMenulBoutonsiCanalMenu);
}

// -- Suppression d'un menu --
CancelMenu() {
    
// On teste s'il y a quelque chose à arrêter
    
if(iEcouteMenu) {
        
// Arrêt de l'écoute du canal
        
llListenRemove(iEcouteMenu);
        
iEcouteMenu 0;
        
// Libération du menu
        
iBusy FALSE;
        
// On arrête le timer
        
if(iMode == MODE_OFFllSetTimerEvent(.0);}
}

// -- Fin du délai d'écoute des menu --
FinMenu() {
    
// On prévient l'avatar
    
llInstantMessage(kAvaMenu"Time out for dialog.");
    
// On supprime le menu
    
CancelMenu();
}

// -- Fonction qui génère un canal au hasard (négatif) --
// @ return [integer] retourne le canal
integer GetRandomChannel() {
    return ~(integer)
llFrand((float)DEBUG_CHANNEL);
}


//----------------------------------------------------------------------------------
//                        LIBRARY VARIABLES
//----------------------------------------------------------------------------------

//----------------------------------------------
//                  MENUS
//----------------------------------------------
string    PREVIOUS        "<<<";    // Bouton pour page arrière
string    NEXT            ">>>";    // Bouton pour page avant
float    TIMEOUT            60.0;        // Délai pour réponse au menu

integer    iCanalMenu;                    // Canaux du Chat
integer    iEcouteMenu;                // Handle de l'écoute
integer    iIndexMenu;                    // Index de position dans les boutons
integer    iTypeMenu;                    // Type de menu
integer    iBusy;                        // Menu occupé
string  sTexteMenu;                    // Texte pour le menu
list    lBoutonsMenu;                // Boutons du menu
key        kAvaMenu;                    // Clé de l'avatar


//----------------------------------------------------------------------------------
//                               SCRIPT FUNCTIONS
//----------------------------------------------------------------------------------

//----------------------------------------------
//                  MENUS
//----------------------------------------------

// -- Création du menu général --
// @ param [key] clé de l'avatar
Menu_Main(key id) {
    list 
MENU_MAIN;
    
// Bouton marche/arrêt
    
if(iMode != MODE_OFF+= "Off";
    
// Modes
    
if(iMode != MODE_DARK_SHOW && iMode != MODE_DARK_TRANS)
        
+= "Dark";
    if(
iMode != MODE_FUSION_SHOW && iMode != MODE_FUSION_TRANS)
        
+= "Fusion";
    if(
iMode != MODE_SWAPH_SHOW && iMode != MODE_SWAPH_TRANS)
        
+= "Swap H";
    if(
iMode != MODE_SWAPD_SHOW && iMode != MODE_SWAPD_TRANS)
        
+= "Swap D";
    if(
iMode != MODE_FAST_SHOW)
        
+= "Fast";
    
// Affichage du menu
    
InitMenu(id"\nSelect an option"lTYPE_MENU_MAIN);
}

// -- Menu Settings --
Menu_Settings(key id) {
    list 
MENU_SETTINGS;
    
// Mode Random ou Order
    
if(iRandom+= "Order";
    else 
+= "Random";
    
// Access si owner
    
if(id == llGetOwner()) += "Access";
    
// Affichage du menu
    
InitMenu(id"\nSelect an option"lTYPE_MENU_SETTINGS);
}

// -- Menu d'accès --
Menu_Access(key id) {
    
integer i llListFindList(ACCESS, [sAccess]);
    
InitMenu(id"\nAccess is now " sAccess "\n\nSelect another access",
        [
"Back","Exit"] + llDeleteSubList(ACCESSii), TYPE_MENU_ACCESS);
}

// -- Menu Time --
// @ param [key] clé de l'avatar
// @ param [float] valeur actuelle de a durée
// @ param [string] message
// @ param [integer] type de menu
Menu_Time(key idfloat valuestring messageinteger type_menu) {
    
// Représentation string de la valeur de la durée
    
string s = (string)((integer)value) + "s";
    
// Ajustement du menu
    
integer i llListFindList(MENU_TIME, [s]);
    list 
llDeleteSubList(MENU_TIMEii);
    
// Affichage du menu
    
InitMenu(idmessage + (string)((integer)value) + " seconds"ltype_menu);
}

//----------------------------------------------
//                  AUTRES
//----------------------------------------------

// -- Construction de l'écran --
// @ return [interger] TRUE ou FALSE
integer Build() {
    
// Test présence 2 primtives
    
if(llGetNumberOfPrims() == 2) {
        
llSetPrimitiveParams([PRIM_COLORALL_SIDES, <.4,.4,.4>, 1.0,
            
PRIM_COLOR0, <1.0,1.0,1.0>, 1.0,
            
PRIM_TEXTUREALL_SIDES"819d87ad-913d-37a7-1edf-d269f3bbb624", <8.9,.8,0.0>, <0.0,0.0,0.0>,0.0,
            
PRIM_TEXTURE0"819d87ad-913d-37a7-1edf-d269f3bbb624", <1.0,1.0,.0>, <0.0,0.0,0.0>,0.0,
            
PRIM_FULLBRIGHT0TRUE,
            
PRIM_ROTATIONllEuler2Rot(<270.00180.0> * DEG_TO_RAD),
            
PRIM_SIZE, <2.0,1.5,.06812>,
            
PRIM_TYPEPRIM_TYPE_BOX0, <0.01.00.0>, 0.0, <0.00.00.0>, <.9.90.0>, <0.00.00.0>]);
        
llSetLinkPrimitiveParams(2,[PRIM_COLORALL_SIDES, <.4,.4,.4>, 1.0,
            
PRIM_COLOR0, <1.0,1.0,1.0>, 1.0,
            
PRIM_TEXTUREALL_SIDES"819d87ad-913d-37a7-1edf-d269f3bbb624", <8.9,.8,0.0>, <0.0,0.0,0.0>,0.0,
            
PRIM_TEXTURE0"819d87ad-913d-37a7-1edf-d269f3bbb624", <1.0,1.0,.0>, <0.0,0.0,0.0>,0.0,
            
PRIM_FULLBRIGHT0TRUE,
            
PRIM_POSITION, <.0,.0,.002>,
            
PRIM_ROTATIONllEuler2Rot(<270.00180.0> * DEG_TO_RAD),
            
PRIM_SIZE, <1.8,1.35,.06812>,
            
PRIM_TYPEPRIM_TYPE_BOX0, <0.01.00.0>, 0.0, <0.00.00.0>, <1.01.00.0>, <0.00.00.0>]);
        return 
TRUE;}
    else {
        
llOwnerSay("I cant build screen ! I need 2 linked prims to work !");
        return 
FALSE;
    }
}

// -- Test des droits d'accès --
// @ param [key] clé de l'avatar
// @ return [interger] TRUE ou FALSE
integer TestAccess(key id) {
    if(
sAccess == "Owner" && llGetOwner() == id) return TRUE;
    else if(
sAccess == "Group" && llSameGroup(id)) return TRUE;
    else if(
sAccess == "All") return TRUE;
    else return 
FALSE;
}

// -- Test présence au moins 3 images --
// @ return [integer] TRUE ou FALSE
integer Test_3_Images() {
    
integer i llGetInventoryNumber(INVENTORY_TEXTURE) > 2;
    if(
i) return TRUE;
    else {
        
llSay(0"Sorry i need at least 3 textures to work !");
        return 
FALSE;
    }
}

// -- Mise en place d'une texture --
// @ param [integer] numéro primitive
// @ param [integer] face primitive
// @ param [integer] index texture
Place_Texture(integer priminteger faceinteger idTexture) {
    
llSetLinkTexture(primllGetInventoryName(INVENTORY_TEXTUREidTexture), face);
}

// -- Mise en place initiale --
Init() {
    if(
Test_3_Images()) {
        
// Fonctionnement ordonné
        
lTextures = [0,1,2];
        
iIndex 2;
        
// Mise en place des textures
        
Place_Texture(PRIM_ECRANFACE_ECRANllList2Integer(lTextures0));
        
Place_Texture(PRIM_BASEFACE_BASEllList2Integer(lTextures1));
        
Place_Texture(PRIM_ECRANFACE_PRELOADllList2Integer(lTextures2));
        
// Reset global au cas où
        
llSetLinkAlpha(PRIM_ECRAN1.0FACE_ECRAN);
        
llSetLinkColor(PRIM_ECRAN, <1.01.01.0>, FACE_ECRAN);}
}

// --  Mise en route --
// @ param [integer] mode de fonctionnement
// @ param [integer] TRUE si timer nécessaire
Go(integer modeinteger time) {
    if(
Test_3_Images()) {
        
iMode mode;
        
iRequest CHANGE_NULL;
        
// Mise en marche du timer
        
if(timellSetTimerEvent(fTimeShow);
        
// Reset global au cas où
        
llSetLinkAlpha(PRIM_ECRAN1.0FACE_ECRAN);
        
llSetLinkColor(PRIM_ECRAN, <1.01.01.0>, FACE_ECRAN);
    }
}

// -- Initialisation de la transition pour modes Fusion, Dark et Swap --
// @ param [integer] Mode de fonctionnement
Init_Change(integer    mode) {
    
// Demande d'arrêt ?
    
if(!Test_Request()) {
        
// Changement du mode
        
iMode mode;
        
// Calcul du pas
        
fPas fTempsBase fTimeTrans;
        
// Spécificités du mode Dark
        
if(iMode == MODE_DARK_TRANS) {
            
fPas *= 2.0;
            
iSens TRUE;}
        
// Initialisation
        
fValeur 1.0;
        
// Réglage timer
        
llSetTimerEvent(fTempsBase);}
}

// -- Changement d'image --
Change() {
    
// Mode Fusion
    
if(iMode == MODE_FUSION_TRANS) {
        
// Diminution de l'alpha de l'écran
        
fValeur -= fPas;
        if(
fValeur >= .0)
            
llSetLinkAlpha(PRIM_ECRANfValeurFACE_ECRAN);
        else {
            
// Réglage du timer
            
llSetTimerEvent(fTimeShow);
            
// Mise en place image sur l'écran
            
Place_Texture(PRIM_ECRANFACE_ECRANllList2Integer(lTextures1));
            
// Petit délai de chargement
            
llSleep(.2);
            
// Affichage de l'écran
            
llSetLinkAlpha(PRIM_ECRAN1.0FACE_ECRAN);
            
// Chargement des textures
            
Charge_Textures();
            
// Changement du mode
            
if(!Test_Request())
                
iMode MODE_FUSION_SHOW;
        }
    }
    
// Mode Swap H
    
if(iMode == MODE_SWAPH_TRANS) {
        
// Diminution de la largeur et déplacement de l'écran
        
fValeur -= fPas;
        if(
fValeur .0) {
            
float fLargeur vEcran_size.fValeur;
            
vector vSize = <fLargeurvEcran_size.yvEcran_size.z>;
            
vector vPos = <vEcran_pos.+ (vEcran_size.fLargeur) / 2.0vEcran_pos.yvEcran_pos.z>;
            
float fDecalage = (fValeur 1.0) / 2.0;
            
llSetLinkPrimitiveParamsFast(PRIM_ECRAN, [
                
PRIM_SIZEvSize,
                
PRIM_POSITIONvPos,
                
PRIM_TEXTUREFACE_ECRANllGetInventoryName(INVENTORY_TEXTUREllList2Integer(lTextures0)),
                <
fValeur1.0.0>, <fDecalage.0.0>, .0]);
        }
        else {
            
Reset_Ecran();
            
// Changement du mode
            
if(!Test_Request()) iMode MODE_SWAPH_SHOW;}
    }
    
// Mode Swap D
    
if(iMode == MODE_SWAPD_TRANS) {
        
// Diminution largeur et hauteur et déplacement de l'écran
        
fValeur -= fPas;
        if(
fValeur .0) {
            
float fLargeur vEcran_size.fValeur;
            
float fHauteur vEcran_size.fValeur;
            
vector vSize = <fLargeurfHauteurvEcran_size.z>;
            
vector vPos = <vEcran_pos.+ (vEcran_size.fLargeur) / 2.0,
                
vEcran_pos.+ (vEcran_size.fHauteur) / 2.0,
                
vEcran_pos.z>;
            
float fDecalage = (fValeur 1.0) / 2.0;
            
llSetLinkPrimitiveParamsFast(PRIM_ECRAN, [
                
PRIM_SIZEvSize,
                
PRIM_POSITIONvPos,
                
PRIM_TEXTUREFACE_ECRANllGetInventoryName(INVENTORY_TEXTUREllList2Integer(lTextures0)),
                <
fValeurfValeur.0>, <fDecalagefDecalage.0>, .0]);
        }
        else {
            
Reset_Ecran();
            
// Changement du mode
            
if(!Test_Request()) iMode MODE_SWAPD_SHOW;}
    }
    
// Mode Dark
    
else if(iMode == MODE_DARK_TRANS) {
        
// Premier sens (noircissement)
        
if(iSens) {
            
fValeur -= fPas;
            if(
fValeur >= .0)
                
llSetLinkColor(PRIM_ECRAN, <fValeurfValeurfValeur>, FACE_ECRAN);
            else {
                
// Changement sens
                
iSens FALSE;
                
// Mise en place image sur l'écran
                
Place_Texture(PRIM_ECRANFACE_ECRANllList2Integer(lTextures1));
                
// Chargement des textures
                
Charge_Textures();
            }
        }
        
// Sens retour (éclaircissement)
        
else {
            
fValeur += fPas;
            if(
fValeur <= 1.0)
                
llSetLinkColor(PRIM_ECRAN, <fValeurfValeurfValeur>, FACE_ECRAN);
            else {
                
// Réglage du timer
                
llSetTimerEvent(fTimeShow);
                
// Changement du mode
                
if(!Test_Request())
                    
iMode MODE_DARK_SHOW;
            }
        }
    }
    
// Mode Fast
    
else if(iMode == MODE_FAST_SHOW) {
        if(!
Test_Request()) {
            
// Réglage du timer
            
llSetTimerEvent(fTimeShow);
            
// Mise en place image sur l'écran
            
Place_Texture(PRIM_ECRANFACE_ECRANllList2Integer(lTextures1));
            
// Chargement des textures
            
Charge_Textures();
        }
    }
}

// -- Reset écran pour mode Swap --
Reset_Ecran() {
    
// Réglage du timer
    
llSetTimerEvent(fTimeShow);
    
// Effacement de l'écran
    
llSetLinkAlpha(PRIM_ECRAN.0FACE_ECRAN);
    
// Redimensionnement de l'écran et affichage
    
llSetLinkPrimitiveParamsFast(PRIM_ECRAN, [PRIM_SIZEvEcran_size,
        
PRIM_POSITIONvEcran_pos,
        
PRIM_TEXTUREFACE_ECRANllGetInventoryName(INVENTORY_TEXTUREllList2Integer(lTextures1)),
        <
1.01.0.0>, <1.0.0.0>, .0]);
    
// Petit délai
    
llSleep(1.0);
    
// Affichage de l'écran
    
llSetLinkAlpha(PRIM_ECRAN1.0FACE_ECRAN);
    
// Chargement des textures
    
Charge_Textures();
}

// -- Chargement des textures --
Charge_Textures() {
    
// Nombre de textures
    
integer n llGetInventoryNumber(INVENTORY_TEXTURE) - 1;
    
// Mise en place image sur la base cachée
    
Place_Texture(PRIM_BASEFACE_BASEllList2Integer(lTextures2));
    
// Mise à jour de la liste des textures
    
lTextures llListReplaceList(lTexturesllList2List(lTextures12), 01);
    
lTextures llDeleteSubList(lTextures22);
    
// Fonctionnement aléatoire
    
if(iRandom) {
        
integer p randInt(n);
        while(~
llListFindList(lTextures, [p])) randInt(n);
        
lTextures += p;
        
Place_Texture(PRIM_ECRANFACE_PRELOADp);
    }
    
// Fonctionnement ordonné
    
else {
        if(++
iIndex niIndex 0;
        
lTextures += iIndex;
        
Place_Texture(PRIM_ECRANFACE_PRELOADiIndex);
    }
}

// -- Test de changement --
// @ return [integer] Test positif
integer Test_Request() {
    if(
iRequest == CHANGE_NULL) return FALSE;
    else if(
iRequest == CHANGE_FUSIONGo(MODE_FUSION_SHOWTRUE);
    else if(
iRequest == CHANGE_DARKGo(MODE_DARK_SHOWTRUE);
    else if(
iRequest == CHANGE_SWAPHGo(MODE_SWAPH_SHOWTRUE);
    else if(
iRequest == CHANGE_SWAPDGo(MODE_SWAPD_SHOWTRUE);
    else if(
iRequest == CHANGE_FASTGo(MODE_FAST_SHOWTRUE);
    else if(
iRequest == CHANGE_OFFOff();
    return 
TRUE;
}

// -- Test de mode --
// @ param [integer] Mode de fonctionnement
// @ return [integer] Test positif
integer Test_Mode(integer mode) {
    if(
iMode == MODE_OFF) {
        
Go(modeTRUE);
        return 
FALSE;}
    else if(
iMode == MODE_FUSION_SHOW || iMode == MODE_FAST_SHOW
        
||  iMode == MODE_DARK_SHOW ||  iMode == MODE_SWAPH_SHOW
        
||  iMode == MODE_SWAPD_SHOW) {
            
Go(modeFALSE);
            return 
FALSE;}
    return 
TRUE;
}

// --  Arrêt --
Off() {
    
iMode MODE_OFF;
    
// Arrêt du timer
    
if(iEcouteMenullSetTimerEvent(TIMEOUT);
    else 
llSetTimerEvent(.0);
    
// Message
    
llWhisper(0"mode is now Off");
}

//--------------------------------------------------------------------------------------
//                           VARIABLES GLOBALES
//--------------------------------------------------------------------------------------

//----------------------------------------------
//                  PARAMETRES
//----------------------------------------------
string        VERSION            "1.3";
integer        PRIM_BASE        1;        // Numéro de la primitive de base
integer        PRIM_ECRAN        2;        // Numéro de la prim "écran"
integer        FACE_BASE        0;        // Numéro de la face de base
integer        FACE_ECRAN        0;        // Numéro de la face "écran"
integer        FACE_PRELOAD    5;        // Numéro de la face de pré-chargement

//----------------------------------------------
//                  MENU
//----------------------------------------------
list     MENU_MAIN         = ["Exit","Settings"];
list    
MENU_SETTINGS    = ["Back","Exit","Time Show","Time Trans"];
list     
MENU_TIME        = ["Back","Exit","2s","5s","10s","20s","30s","40s","50s","60s","120s","240s"];
list    
ACCESS          = ["Owner","Group","All"];

//----------------------------------------------
//                  VALEURS
//----------------------------------------------
integer        TYPE_MENU_MAIN         0;
integer        TYPE_MENU_ACCESS    1;
integer        TYPE_MENU_SETTINGS    2;
integer        TYPE_MENU_TIMESHOW    3;
integer        TYPE_MENU_TIMETRANS    4;

integer        MODE_OFF            0;
integer        MODE_FUSION_SHOW    1;
integer        MODE_FUSION_TRANS    2;
integer        MODE_DARK_SHOW        3;
integer        MODE_DARK_TRANS        4;
integer        MODE_FAST_SHOW        5;
integer        MODE_SWAPH_SHOW        6;
integer        MODE_SWAPH_TRANS    7;
integer        MODE_SWAPD_SHOW        8;
integer        MODE_SWAPD_TRANS    9;

integer        CHANGE_NULL            0;
integer        CHANGE_OFF            1;
integer        CHANGE_FUSION        2;
integer        CHANGE_DARK            3;
integer        CHANGE_FAST            4;
integer        CHANGE_SWAPH        5;
integer        CHANGE_SWAPD        6;

//----------------------------------------------
//                  AUTRES
//----------------------------------------------
integer        iMode;                    // Mode de fonctionnement
integer        iRandom;                // Mode Random
integer        iIndex;                    // Index en mode ordonné
integer        iSens;                    // Sens de modification pour mode Dark
integer        iRequest;                // Demande de changement
string        sAccess     "Owner";    // Accès
float        fTimeShow    5.0;        // Durée de présence image
float        fTimeTrans    2.0;        // Durée de transition
float        fTempsBase    .02;        // Temps de base
float        fPas;                    // Pas de changement
float        fValeur;                // Valeur actuelle
vector      vEcran_size;            // Dimension de l'écran
vector      vEcran_pos;             // Position de l'écran;
list        lTextures;                // Liste des index des 3 textures

//--------------------------------------------------------------------------------------
//        STATE default
//--------------------------------------------------------------------------------------
default
{
    
state_entry() {
        if(
Build()) {
            
// Message
            
llWhisper(0"Transition V"VERSION " ready.");
            
// Valeurs de départ pour swap
            
list llGetLinkPrimitiveParams(PRIM_ECRAN, [PRIM_SIZEPRIM_POSITION]);
            
vEcran_size llList2Vector(l0);
            
vEcran_pos Global2Local(llList2Vector(l1));
            
// Initialisation
            
Init();}
    }

    
changed(integer change)    {
        if(
change CHANGED_INVENTORYInit();
    }

    
touch_start(integer total_number)
    {
        
key k llDetectedKey(0);
        if(
TestAccess(k) == FALSE)
            
llInstantMessage(k"Sorry no access for you.");
        else {
            if(
iBusy && != kAvaMenu)
                
llInstantMessage(k"Sorry but the menu is busy.");
            else
                
Menu_Main(k);
        }
    }

    
listen(integer channelstring namekey idstring message) {
        
// Test de changement de page pour navigation
        
if(llListFindList([PREVIOUS,NEXT], [message]) != -1)
            
GestIndexBoutons(message);
        
// Reset du menu
        
CancelMenu();
        
// Sortie directe
        
if(message == "Exit") return;
        else {
            
// Gestion menu général
            
if(iTypeMenu == TYPE_MENU_MAIN)
            {
                if(
message == "Fusion") {
                    if(
Test_Mode(MODE_FUSION_SHOW))
                        
iRequest CHANGE_FUSION;
                    
llWhisper(0"mode is now Fusion");}
                else if(
message == "Dark") {
                    if(
Test_Mode(MODE_DARK_SHOW))
                        
iRequest CHANGE_DARK;
                    
llWhisper(0"mode is now Dark");}
                else if(
message == "Fast") {
                    if(
Test_Mode(MODE_FAST_SHOW))
                        
iRequest CHANGE_FAST;
                    
llWhisper(0"mode is now Fast");}
                else if(
message == "Swap H") {
                    if(
Test_Mode(MODE_SWAPH_SHOW))
                        
iRequest CHANGE_SWAPH;
                    
llWhisper(0"mode is now Swap H");}
                else if(
message == "Swap D") {
                    if(
Test_Mode(MODE_SWAPD_SHOW))
                        
iRequest CHANGE_SWAPD;
                    
llWhisper(0"mode is now Swap D");}
                else if(
message == "Off")
                    
iRequest CHANGE_OFF;
                else if(
message == "Settings")
                    
Menu_Settings(id);
            }
            
// Gestion du menu Settings
            
else if(iTypeMenu == TYPE_MENU_SETTINGS) {
                if(
message == "Back")
                    
Menu_Main(id);
                else if(
message == "Access")
                    
Menu_Access(id);
                else if(
message == "Random") {
                    
iRandom TRUE;
                    
Menu_Settings(id);}
                else if(
message == "Order") {
                    
iRandom FALSE;
                    
Menu_Settings(id);}
                else if(
message == "Time Show")
                    
Menu_Time(idfTimeShow"\nSelect a time for show\n\nTime is now ",
                    
TYPE_MENU_TIMESHOW);
                else if(
message == "Time Trans")
                    
Menu_Time(idfTimeTrans"\nSelect a time for transition\n\nTime is now ",
                    
TYPE_MENU_TIMETRANS);
            }
            
// Gestion menu Access
            
else if(iTypeMenu == TYPE_MENU_ACCESS) {
                if(
message != "Back")
                    
sAccess message;
                
Menu_Settings(id);
            }
            
// Gestion menus Time
            
else {
                if(
message != "Back") {
                    if(
iTypeMenu == TYPE_MENU_TIMESHOW)
                        
fTimeShow = (float)message;
                    else if(
iTypeMenu == TYPE_MENU_TIMETRANS)
                        
fTimeTrans = (float)message;}
                
Menu_Settings(id);
            }
        }
    }

    
timer()    {
        if(
iEcouteMenu && llGetTime() > TIMEOUTFinMenu();
        if(
iMode == MODE_FUSION_SHOWInit_Change(MODE_FUSION_TRANS);
        else if(
iMode == MODE_DARK_SHOWInit_Change(MODE_DARK_TRANS);
        else if(
iMode == MODE_SWAPH_SHOWInit_Change(MODE_SWAPH_TRANS);
        else if(
iMode == MODE_SWAPD_SHOWInit_Change(MODE_SWAPD_TRANS);
        else if(
iMode == MODE_FAST_SHOW || iMode == MODE_FUSION_TRANS
            
|| iMode == MODE_DARK_TRANS || iMode == MODE_SWAPH_TRANS
            
|| iMode == MODE_SWAPD_TRANSChange();
    }

Encore deux transitions ! Circle et Grow et j'ai aussi prévu le mode Random qui permet de générer aléatoirement les transitions. Je suis toujours preneur pour les idées de transition

Code PHP:

//----------------------------------------------------------------------------------
//
//                              Transition V1.4
//
//                                Bestmomo Lagan
//
//----------------------------------------------------------------------------------
//
// Nouveautés V1.1 => Mise en place modes Dark et Fast et optimisation code
// Nouveautés V1.2 => Mise en place mode Swap horizontal
// Nouveautés V1.3 => Mise en place mode Swap diagonal et intégration du code de construction
// Nouveautés V1.4 => Mise en place modes Circle, Grow et Random
//
//----------------------------------------------------------------------------------
//
//----------------------------------------------------------------------------------
//                              LIBRARY FUNCTIONS
//----------------------------------------------------------------------------------

// -- Génération d'un entier aléatoire --
// @ param [integer] Valeur maximale
// @ return [integer] entier aléatoire
integer RandInt(integer n) {return (integer)llFrand(1);
}
// -- Création d'un entier aléatoire --
// @ param [integer] Valeur mini
// @ param [integer] Valeur maxi
// @ return [integer] Valeur aléatoire
integer RandIntBetween(integer mininteger max) {
    return 
min RandInt(max min);
}
// -- Passage de glogal à local --
// @ param [vector] Position globale
// @ return [vector] Position locale
vector Global2Local(vector position) {
    return (
position llGetRootPosition()) / llGetRootRotation();}

//---------------------------------------------------------------
//                        MENU FUNCTIONS
//---------------------------------------------------------------

// -- Initialisation menu --
// @ param [key]     clé de l'avatar
// @ param [string] texte pour le menu
// @ param 
[list] noms des boutons
// @ param [integer] type de menu
InitMenu(key idstring texte, list boutonsinteger typemenu) {
    
// Mise en route du timer
    
if(iMode == MODE_OFFllSetTimerEvent(TIMEOUT);
    
llResetTime();
    
// Enregistrement des paramètres
    
lBoutonsMenu boutons;
    
iCanalMenu GetRandomChannel();
    
sTexteMenu texte;
    
iIndexMenu 0;
    
iBusy TRUE;
    
iTypeMenu typemenu;
    
kAvaMenu id;
    
// Mise en place et enregistrement de l'écoute
    
iEcouteMenu llListen(iCanalMenu""id"");
    
// Envoi du menu
    
GestMenu();
}

// -- Gestion de l'index des boutons du menu --
// @ param [string] bouton de déplacement
GestIndexBoutons(string browse) {
    
// Nombre de boutons
    
integer n llGetListLength(lBoutonsMenu);
    
// Navigation simple pour deux pages
    
if(iIndexMenuiIndexMenu 0;
    else 
iIndexMenu 11;
    
// Mise en route du timer
    
if(iMode == MODE_OFFllSetTimerEvent(TIMEOUT);
    
llResetTime();
    
// Envoi du menu
    
GestMenu();
}

//    -- Gestion menu --
GestMenu() {
    
// Liste globale des boutons
    
list lBoutons lBoutonsMenu;
    
// Nombre total de boutons
    
integer n llGetListLength(lBoutonsMenu);
    
// Si plusieurs pages
    
if(12) {
        
// Que 2 pages -> navigation simple
        // Deuxième page
        
if(iIndexMenu)
            
lBoutons = [PREVIOUS] + llList2List(lBoutonsMenuiIndexMenu, -1);
        
// Première page
        
else
            
lBoutons llList2List(lBoutonsMenu01) + [NEXT] + llList2List(lBoutonsMenu210);}
    
// Envoi du menu
    
llDialog(kAvaMenusTexteMenulBoutonsiCanalMenu);
}

// -- Suppression d'un menu --
CancelMenu() {
    
// On teste s'il y a quelque chose à arrêter
    
if(iEcouteMenu) {
        
// Arrêt de l'écoute du canal
        
llListenRemove(iEcouteMenu);
        
iEcouteMenu 0;
        
// Libération du menu
        
iBusy FALSE;
        
// On arrête le timer
        
if(iMode == MODE_OFFllSetTimerEvent(.0);}
}

// -- Fin du délai d'écoute des menu --
FinMenu() {
    
// On prévient l'avatar
    
llInstantMessage(kAvaMenu"Time out for dialog.");
    
// On supprime le menu
    
CancelMenu();
}

// -- Fonction qui génère un canal au hasard (négatif) --
// @ return [integer] retourne le canal
integer GetRandomChannel() {
    return ~(integer)
llFrand((float)DEBUG_CHANNEL);
}


//----------------------------------------------------------------------------------
//                        LIBRARY VARIABLES
//----------------------------------------------------------------------------------

//----------------------------------------------
//                  MENUS
//----------------------------------------------
string    PREVIOUS        "<<<";    // Bouton pour page arrière
string    NEXT            ">>>";    // Bouton pour page avant
float    TIMEOUT            60.0;        // Délai pour réponse au menu

integer    iCanalMenu;                    // Canaux du Chat
integer    iEcouteMenu;                // Handle de l'écoute
integer    iIndexMenu;                    // Index de position dans les boutons
integer    iTypeMenu;                    // Type de menu
integer    iBusy;                        // Menu occupé
string  sTexteMenu;                    // Texte pour le menu
list    lBoutonsMenu;                // Boutons du menu
key        kAvaMenu;                    // Clé de l'avatar

//----------------------------------------------------------------------------------
//                               SCRIPT FUNCTIONS
//----------------------------------------------------------------------------------

//----------------------------------------------
//                  MENUS
//----------------------------------------------

// -- Création du menu général --
// @ param [key] clé de l'avatar
Menu_Main(key id) {
    list 
MENU_MAIN;
    
// Bouton marche/arrêt
    
if(iMode != MODE_OFF+= "Off";
    
// Modes
    
if(iMode != MODE_DARK_SHOW && iMode != MODE_DARK_TRANS)
        
+= "Dark";
    if(
iMode != MODE_FUSION_SHOW && iMode != MODE_FUSION_TRANS)
        
+= "Fusion";
    if(
iMode != MODE_SWAPH_SHOW && iMode != MODE_SWAPH_TRANS)
        
+= "Swap H";
    if(
iMode != MODE_SWAPD_SHOW && iMode != MODE_SWAPD_TRANS)
        
+= "Swap D";
    if(
iMode != MODE_CIRCLE_SHOW && iMode != MODE_CIRCLE_TRANS)
        
+= "Circle";
    if(
iMode != MODE_GROW_SHOW && iMode != MODE_GROW_TRANS)
        
+= "Grow";
    if(
iMode != MODE_FAST_SHOW)
        
+= "Fast";
    if(!
iRandomShow)
        
+= "Random";
    
// Affichage du menu
    
InitMenu(id"\nSelect an option"lTYPE_MENU_MAIN);
}

// -- Menu Settings --
Menu_Settings(key id) {
    list 
MENU_SETTINGS;
    
// Mode Random ou Order
    
if(iRandom+= "Order";
    else 
+= "Random";
    
// Access si owner
    
if(id == llGetOwner()) += "Access";
    
// Affichage du menu
    
InitMenu(id"\nSelect an option"lTYPE_MENU_SETTINGS);
}

// -- Menu d'accès --
Menu_Access(key id) {
    
integer i llListFindList(ACCESS, [sAccess]);
    
InitMenu(id"\nAccess is now " sAccess "\n\nSelect another access",
        [
"Back","Exit"] + llDeleteSubList(ACCESSii), TYPE_MENU_ACCESS);
}

// -- Menu Time --
// @ param [key] clé de l'avatar
// @ param [float] valeur actuelle de a durée
// @ param [string] message
// @ param [integer] type de menu
Menu_Time(key idfloat valuestring messageinteger type_menu) {
    
// Représentation string de la valeur de la durée
    
string s = (string)((integer)value) + "s";
    
// Ajustement du menu
    
integer i llListFindList(MENU_TIME, [s]);
    list 
llDeleteSubList(MENU_TIMEii);
    
// Affichage du menu
    
InitMenu(idmessage + (string)((integer)value) + " seconds"ltype_menu);
}

//----------------------------------------------
//                  AUTRES
//----------------------------------------------

// -- Construction de l'écran --
// @ return [interger] TRUE ou FALSE
integer Build() {
    
// Test présence 2 primtives
    
if(llGetNumberOfPrims() == 2) {
        
llSetPrimitiveParams([PRIM_COLORALL_SIDES, <.4,.4,.4>, 1.0,
            
PRIM_TYPEPRIM_TYPE_BOX0, <.01.00.0>, 0.0, <0.00.00.0>, <1.01.00.0>, <0.00.00.0>,
            
PRIM_COLOR0, <1.0,1.0,1.0>, 1.0,
            
PRIM_TEXTUREALL_SIDES"819d87ad-913d-37a7-1edf-d269f3bbb624", <8.9,.8,0.0>, <0.0,0.0,0.0>,0.0,
            
PRIM_TEXTURE0"819d87ad-913d-37a7-1edf-d269f3bbb624", <1.0,1.0,.0>, <0.0,0.0,0.0>,0.0,
            
PRIM_FULLBRIGHT0TRUE,
            
PRIM_ROTATIONllEuler2Rot(<270.00180.0> * DEG_TO_RAD),
            
PRIM_SIZE, <2.0,1.5,.06812>,
            
PRIM_TYPEPRIM_TYPE_BOX0, <0.01.00.0>, 0.0, <0.00.00.0>, <.9.90.0>, <0.00.00.0>]);
        
llSetLinkPrimitiveParams(2,[PRIM_COLORALL_SIDES, <.4,.4,.4>, 1.0,
            
PRIM_TYPEPRIM_TYPE_BOX0, <.01.00.0>, 0.0, <0.00.00.0>, <1.01.00.0>, <0.00.00.0>,
            
PRIM_COLOR0, <1.0,1.0,1.0>, 1.0,
            
PRIM_TEXTUREALL_SIDES"819d87ad-913d-37a7-1edf-d269f3bbb624", <8.9,.8,0.0>, <0.0,0.0,0.0>,0.0,
            
PRIM_TEXTURE0"819d87ad-913d-37a7-1edf-d269f3bbb624", <1.0,1.0,.0>, <0.0,0.0,0.0>,0.0,
            
PRIM_FULLBRIGHT0TRUE,
            
PRIM_POSITION, <.0,.0,.002>,
            
PRIM_ROTATIONllEuler2Rot(<270.00180.0> * DEG_TO_RAD),
            
PRIM_SIZE, <1.8,1.35,.06812>,
            
PRIM_TYPEPRIM_TYPE_BOX0, <0.01.00.0>, 0.0, <0.00.00.0>, <1.01.00.0>, <0.00.00.0>]);
        return 
TRUE;}
    else {
        
llOwnerSay("I cant build screen ! I need 2 linked prims to work !");
        return 
FALSE;
    }
}

// -- Test des droits d'accès --
// @ param [key] clé de l'avatar
// @ return [interger] TRUE ou FALSE
integer TestAccess(key id) {
    if(
sAccess == "Owner" && llGetOwner() == id) return TRUE;
    else if(
sAccess == "Group" && llSameGroup(id)) return TRUE;
    else if(
sAccess == "All") return TRUE;
    else return 
FALSE;
}

// -- Test présence au moins 3 images --
// @ return [integer] TRUE ou FALSE
integer Test_3_Images() {
    
integer i llGetInventoryNumber(INVENTORY_TEXTURE) > 2;
    if(
i) return TRUE;
    else {
        
llSay(0"Sorry i need at least 3 textures to work !");
        return 
FALSE;
    }
}

// -- Mise en place d'une texture --
// @ param [integer] numéro primitive
// @ param [integer] face primitive
// @ param [integer] index texture
Place_Texture(integer priminteger faceinteger idTexture) {
    
llSetLinkTexture(primllGetInventoryName(INVENTORY_TEXTUREidTexture), face);
}

// -- Mise en place initiale --
Init() {
    if(
Test_3_Images()) {
        
// Fonctionnement ordonné
        
lTextures = [0,1,2];
        
iIndex 2;
        
// Mise en place des textures
        
Place_Texture(PRIM_ECRANFACE_ECRANllList2Integer(lTextures0));
        
Place_Texture(PRIM_BASEFACE_BASEllList2Integer(lTextures1));
        
Place_Texture(PRIM_ECRANFACE_PRELOADllList2Integer(lTextures2));
        
// Reset global au cas où
        
llSetLinkAlpha(PRIM_ECRAN1.0FACE_ECRAN);
        
llSetLinkColor(PRIM_ECRAN, <1.01.01.0>, FACE_ECRAN);}
}

// --  Mise en route --
// @ param [integer] mode de fonctionnement
// @ param [integer] TRUE si timer nécessaire
Go(integer modeinteger time) {
    if(
Test_3_Images()) {
        
iMode mode;
        
iRequest CHANGE_NULL;
        
// Mise en marche du timer
        
if(timellSetTimerEvent(fTimeShow);}
}

// -- Initialisation de la transition --
// @ param [integer] Mode de fonctionnement
Init_Change(integer    mode) {
    
// Changement du mode
    
iMode mode;
    
// Calcul du pas
    
fPas fTempsBase fTimeTrans;
    
// Spécificités du mode Dark
    
if(iMode == MODE_DARK_TRANS) {
        
fPas *= 2.0;
        
iSens TRUE;}
    
// Initialisation
    
if(iMode == MODE_CIRCLE_TRANS || iMode == MODE_GROW_TRANS)
        
fValeur .0;
    else
        
fValeur 1.0;
    
// Réglage timer
    
llSetTimerEvent(fTempsBase);
}

// -- Changement d'image --
Change() {
    
// Mode Fusion
    
if(iMode == MODE_FUSION_TRANS) {
        
// Diminution de l'alpha de l'écran
        
fValeur -= fPas;
        if(
fValeur >= .0)
            
llSetLinkAlpha(PRIM_ECRANfValeurFACE_ECRAN);
        else {
            
// Réglage du timer
            
llSetTimerEvent(fTimeShow);
            
// Mise en place image sur l'écran
            
Place_Texture(PRIM_ECRANFACE_ECRANllList2Integer(lTextures1));
            
// Petit délai de chargement
            
llSleep(.2);
            
// Affichage de l'écran
            
llSetLinkAlpha(PRIM_ECRAN1.0FACE_ECRAN);
            
// Chargement des textures
            
Charge_Textures();
            
// Changement du mode
            
if(!Test_Request())
                
iMode MODE_FUSION_SHOW;
        }
    }
    
// Mode Swap H
    
if(iMode == MODE_SWAPH_TRANS) {
        
// Diminution de la largeur et déplacement de l'écran
        
fValeur -= fPas;
        if(
fValeur .0) {
            
float fLargeur vEcran_size.fValeur;
            
vector vSize = <fLargeurvEcran_size.yvEcran_size.z>;
            
vector vPos = <vEcran_pos.+ (vEcran_size.fLargeur) / 2.0vEcran_pos.yvEcran_pos.z>;
            
float fDecalage = (fValeur 1.0) / 2.0;
            
llSetLinkPrimitiveParamsFast(PRIM_ECRAN, [
                
PRIM_SIZEvSize,
                
PRIM_POSITIONvPos,
                
PRIM_TEXTUREFACE_ECRANllGetInventoryName(INVENTORY_TEXTUREllList2Integer(lTextures0)),
                <
fValeur1.0.0>, <fDecalage.0.0>, .0]);
        }
        else {
            
Reset_Ecran();
            
// Changement du mode
            
if(!Test_Request()) iMode MODE_SWAPH_SHOW;}
    }
    
// Mode Swap D
    
if(iMode == MODE_SWAPD_TRANS) {
        
// Diminution largeur et hauteur et déplacement de l'écran
        
fValeur -= fPas;
        if(
fValeur .0) {
            
float fLargeur vEcran_size.fValeur;
            
float fHauteur vEcran_size.fValeur;
            
vector vSize = <fLargeurfHauteurvEcran_size.z>;
            
vector vPos = <vEcran_pos.+ (vEcran_size.fLargeur) / 2.0,
                
vEcran_pos.+ (vEcran_size.fHauteur) / 2.0,
                
vEcran_pos.z>;
            
float fDecalage = (fValeur 1.0) / 2.0;
            
llSetLinkPrimitiveParamsFast(PRIM_ECRAN, [
                
PRIM_SIZEvSize,
                
PRIM_POSITIONvPos,
                
PRIM_TEXTUREFACE_ECRANllGetInventoryName(INVENTORY_TEXTUREllList2Integer(lTextures0)),
                <
fValeurfValeur.0>, <fDecalagefDecalage.0>, .0]);
        }
        else {
            
Reset_Ecran();
            
// Changement du mode
            
if(!Test_Request()) iMode MODE_SWAPD_SHOW;}
    }
    
// Mode Circle
    
if(iMode == MODE_CIRCLE_TRANS) {
        
fValeur += fPas;
        if(
fValeur 1.0) {
            
llSetLinkPrimitiveParamsFast(PRIM_ECRAN, [
                
PRIM_TYPEPRIM_TYPE_BOX0, <fValeur1.00.0>, 0.0, <0.00.00.0>, <1.01.00.0>, <0.00.00.0>]);
        }
        else {
            
Reset_Ecran();
            
// Changement du mode
            
if(!Test_Request()) iMode MODE_CIRCLE_SHOW;}
    }
    
// Mode Grow
    
if(iMode == MODE_GROW_TRANS) {
        
fValeur += fPas;
        if(
fValeur <= .95) {
            
llSetLinkPrimitiveParamsFast(PRIM_ECRAN, [
                
PRIM_TYPEPRIM_TYPE_BOX0, <.01.00.0>, fValeur, <0.00.00.0>, <1.01.00.0>, <0.00.00.0>]);
        }
        else {
            
Reset_Ecran();
            
// Changement du mode
            
if(!Test_Request()) iMode MODE_GROW_SHOW;}
    }
    
// Mode Dark
    
else if(iMode == MODE_DARK_TRANS) {
        
// Premier sens (noircissement)
        
if(iSens) {
            
fValeur -= fPas;
            if(
fValeur >= .0)
                
llSetLinkColor(PRIM_ECRAN, <fValeurfValeurfValeur>, FACE_ECRAN);
            else {
                
// Changement sens
                
iSens FALSE;
                
// Mise en place image sur l'écran
                
Place_Texture(PRIM_ECRANFACE_ECRANllList2Integer(lTextures1));
                
// Chargement des textures
                
Charge_Textures();
            }
        }
        
// Sens retour (éclaircissement)
        
else {
            
fValeur += fPas;
            if(
fValeur <= 1.0)
                
llSetLinkColor(PRIM_ECRAN, <fValeurfValeurfValeur>, FACE_ECRAN);
            else {
                
// Réglage du timer
                
llSetTimerEvent(fTimeShow);
                
// Changement du mode
                
if(!Test_Request())
                    
iMode MODE_DARK_SHOW;
            }
        }
    }
    
// Mode Fast
    
else if(iMode == MODE_FAST_SHOW) {
        if(!
Test_Request()) {
            
// Réglage du timer
            
llSetTimerEvent(fTimeShow);
            
// Mise en place image sur l'écran
            
Place_Texture(PRIM_ECRANFACE_ECRANllList2Integer(lTextures1));
            
// Chargement des textures
            
Charge_Textures();
        }
    }
}

// -- Reset écran pour modes Swap, Circle et Grow --
Reset_Ecran() {
    
// Réglage du timer
    
llSetTimerEvent(fTimeShow);
    
// Effacement de l'écran
    
llSetLinkAlpha(PRIM_ECRAN.0FACE_ECRAN);
    
// Redimensionnement et intégrité de l'écran et affichage
    
llSetLinkPrimitiveParamsFast(PRIM_ECRAN, [PRIM_SIZEvEcran_size,
        
PRIM_POSITIONvEcran_pos,
        
PRIM_TYPEPRIM_TYPE_BOX0, <.01.00.0>, 0.0, <0.00.00.0>, <1.01.00.0>, <0.00.00.0>,
        
PRIM_TEXTUREFACE_ECRANllGetInventoryName(INVENTORY_TEXTUREllList2Integer(lTextures1)),
        <
1.01.0.0>, <1.0.0.0>, .0]);
    
// Petit délai
    
llSleep(1.0);
    
// Affichage de l'écran
    
llSetLinkAlpha(PRIM_ECRAN1.0FACE_ECRAN);
    
// Chargement des textures
    
Charge_Textures();
}

// -- Chargement des textures --
Charge_Textures() {
    
// Nombre de textures
    
integer n llGetInventoryNumber(INVENTORY_TEXTURE) - 1;
    
// Mise en place image sur la face cachée
    
Place_Texture(PRIM_BASEFACE_BASEllList2Integer(lTextures2));
    
// Mise à jour de la liste des textures
    
lTextures llListReplaceList(lTexturesllList2List(lTextures12), 01);
    
lTextures llDeleteSubList(lTextures22);
    
// Fonctionnement aléatoire
    
if(iRandom) {
        
integer p RandInt(n);
        while(~
llListFindList(lTextures, [p])) RandInt(n);
        
lTextures += p;
        
Place_Texture(PRIM_ECRANFACE_PRELOADp);
    }
    
// Fonctionnement ordonné
    
else {
        if(++
iIndex niIndex 0;
        
lTextures += iIndex;
        
Place_Texture(PRIM_ECRANFACE_PRELOADiIndex);
    }
}

// -- Test de changement --
// @ return [integer] Test positif
integer Test_Request() {
    
// Pas de demande de changement
    
if(iRequest == CHANGE_NULL) {
        
// Mode random
        
if(iRandomShow) {
            
Create_Random();
            return 
TRUE;}
        return 
FALSE;}
    
// Demande de changement
    
else if(iRequest == CHANGE_FUSIONGo(MODE_FUSION_SHOWTRUE);
    else if(
iRequest == CHANGE_DARKGo(MODE_DARK_SHOWTRUE);
    else if(
iRequest == CHANGE_SWAPHGo(MODE_SWAPH_SHOWTRUE);
    else if(
iRequest == CHANGE_SWAPDGo(MODE_SWAPD_SHOWTRUE);
    else if(
iRequest == CHANGE_FASTGo(MODE_FAST_SHOWTRUE);
    else if(
iRequest == CHANGE_CIRCLEGo(MODE_CIRCLE_SHOWTRUE);
    else if(
iRequest == CHANGE_GROWGo(MODE_GROW_SHOWTRUE);
    else if(
iRequest == CHANGE_OFFOff();
    
iRandomShow FALSE;
    return 
TRUE;
}

// -- Génération de random mode --
Create_Random() {Go(RandIntBetween(MODE_FUSION_SHOWMODE_GROW_SHOW), TRUE);}

// -- Test de mode --
// @ param [integer] Mode de fonctionnement
// @ return [integer] Test positif
integer Test_Mode(integer mode) {
    
// Mode arrêt
    
if(iMode == MODE_OFF) {
        
Go(modeTRUE);
        return 
FALSE;}
    
// Mode Show
    
else if(iMode 99) {
        
Go(modeFALSE);
        return 
FALSE;}
    return 
TRUE;
}

// --  Arrêt --
Off() {
    
iMode MODE_OFF;
    
// Arrêt du timer
    
if(iEcouteMenullSetTimerEvent(TIMEOUT);
    else 
llSetTimerEvent(.0);
    
// Message
    
llWhisper(0"mode is now Off");
}

//--------------------------------------------------------------------------------------
//                           VARIABLES GLOBALES
//--------------------------------------------------------------------------------------

//----------------------------------------------
//                  PARAMETRES
//----------------------------------------------
string        VERSION            "1.4";
integer        PRIM_BASE        1;        // Numéro de la primitive de base
integer        PRIM_ECRAN        2;        // Numéro de la prim "écran"
integer        FACE_BASE        0;        // Numéro de la face de base
integer        FACE_ECRAN        0;        // Numéro de la face "écran"
integer        FACE_PRELOAD    5;        // Numéro de la face de pré-chargement

//----------------------------------------------
//                  MENUS
//----------------------------------------------
list     MENU_MAIN         = ["Exit","Settings"];
list    
MENU_SETTINGS    = ["Back","Exit","Time Show","Time Trans"];
list     
MENU_TIME        = ["Back","Exit","2s","5s","10s","20s","30s","40s","50s","60s","120s","240s"];
list    
ACCESS          = ["Owner","Group","All"];

//----------------------------------------------
//                  VALEURS
//----------------------------------------------
integer        TYPE_MENU_MAIN         0;
integer        TYPE_MENU_ACCESS    1;
integer        TYPE_MENU_SETTINGS    2;
integer        TYPE_MENU_TIMESHOW    3;
integer        TYPE_MENU_TIMETRANS    4;

integer        MODE_OFF            0;
integer        MODE_FUSION_TRANS    1;
integer        MODE_DARK_TRANS        2;
integer        MODE_SWAPH_TRANS    3;
integer        MODE_SWAPD_TRANS    4;
integer        MODE_CIRCLE_TRANS    5;
integer        MODE_GROW_TRANS        6;
integer        MODE_RANDOM            7;

integer        MODE_FUSION_SHOW    100;
integer        MODE_DARK_SHOW        101;
integer        MODE_FAST_SHOW        102;
integer        MODE_SWAPH_SHOW        103;
integer        MODE_SWAPD_SHOW        104;
integer        MODE_CIRCLE_SHOW    105;
integer        MODE_GROW_SHOW        106;

integer        CHANGE_NULL            0;
integer        CHANGE_OFF            1;
integer        CHANGE_FUSION        2;
integer        CHANGE_DARK            3;
integer        CHANGE_FAST            4;
integer        CHANGE_SWAPH        5;
integer        CHANGE_SWAPD        6;
integer        CHANGE_CIRCLE        7;
integer        CHANGE_GROW            8;

//----------------------------------------------
//                  AUTRES
//----------------------------------------------
integer        iMode;                    // Mode de fonctionnement
integer        iRandom;                // Mode Random
integer        iIndex;                    // Index en mode ordonné
integer        iSens;                    // Sens de modification pour mode Dark
integer        iRequest;                // Demande de changement
integer     iRandomShow;            // Mode Random de visualisation
string        sAccess     "Owner";    // Accès
float        fTimeShow    5.0;        // Durée de présence image
float        fTimeTrans    2.0;        // Durée de transition
float        fTempsBase    .02;        // Temps de base
float        fPas;                    // Pas de changement
float        fValeur;                // Valeur actuelle
vector      vEcran_size;            // Dimension de l'écran
vector      vEcran_pos;             // Position de l'écran;
list        lTextures;                // Liste des index des 3 textures

//--------------------------------------------------------------------------------------
//        STATE default
//--------------------------------------------------------------------------------------
default
{
    
state_entry() {
        if(
Build()) {
            
// Message
            
llWhisper(0"Transition V"VERSION " ready.");
            
// Valeurs de départ pour swap
            
list llGetLinkPrimitiveParams(PRIM_ECRAN, [PRIM_SIZEPRIM_POSITION]);
            
vEcran_size llList2Vector(l0);
            
vEcran_pos Global2Local(llList2Vector(l1));
            
// Initialisation
            
Init();}
    }

    
changed(integer change)    {
        if(
change CHANGED_INVENTORYInit();
    }

    
touch_start(integer total_number)
    {
        
key k llDetectedKey(0);
        if(
TestAccess(k) == FALSE)
            
llInstantMessage(k"Sorry no access for you.");
        else {
            if(
iBusy && != kAvaMenu)
                
llInstantMessage(k"Sorry but the menu is busy.");
            else
                
Menu_Main(k);
        }
    }

    
listen(integer channelstring namekey idstring message) {
        
// Test de changement de page pour navigation
        
if(llListFindList([PREVIOUS,NEXT], [message]) != -1)
            
GestIndexBoutons(message);
        
// Reset du menu
        
CancelMenu();
        
// Sortie directe
        
if(message == "Exit") return;
        else {
            
// Gestion menu général
            
if(iTypeMenu == TYPE_MENU_MAIN) {
                if(
message == "Fusion") {
                    if(
Test_Mode(MODE_FUSION_SHOW))
                        
iRequest CHANGE_FUSION;
                    
llWhisper(0"mode is now Fusion");}
                else if(
message == "Dark") {
                    if(
Test_Mode(MODE_DARK_SHOW))
                        
iRequest CHANGE_DARK;
                    
llWhisper(0"mode is now Dark");}
                else if(
message == "Fast") {
                    if(
Test_Mode(MODE_FAST_SHOW))
                        
iRequest CHANGE_FAST;
                    
llWhisper(0"mode is now Fast");}
                else if(
message == "Swap H") {
                    if(
Test_Mode(MODE_SWAPH_SHOW))
                        
iRequest CHANGE_SWAPH;
                    
llWhisper(0"mode is now Swap H");}
                else if(
message == "Swap D") {
                    if(
Test_Mode(MODE_SWAPD_SHOW))
                        
iRequest CHANGE_SWAPD;
                    
llWhisper(0"mode is now Swap D");}
                else if(
message == "Circle") {
                    if(
Test_Mode(MODE_CIRCLE_SHOW))
                        
iRequest CHANGE_CIRCLE;
                    
llWhisper(0"mode is now Circle");}
                else if(
message == "Grow") {
                    if(
Test_Mode(MODE_GROW_SHOW))
                        
iRequest CHANGE_GROW;
                    
llWhisper(0"mode is now Grow");}
                else if(
message == "Random") {
                    
iRandomShow TRUE;
                    if(
iMode == MODE_OFF)Create_Random();
                    
llWhisper(0"mode is now Random");}
                else if(
message == "Off")
                    
iRequest CHANGE_OFF;
                else if(
message == "Settings")
                    
Menu_Settings(id);
            }
            
// Gestion du menu Settings
            
else if(iTypeMenu == TYPE_MENU_SETTINGS) {
                if(
message == "Back")
                    
Menu_Main(id);
                else if(
message == "Access")
                    
Menu_Access(id);
                else if(
message == "Random") {
                    
iRandom TRUE;
                    
Menu_Settings(id);}
                else if(
message == "Order") {
                    
iRandom FALSE;
                    
Menu_Settings(id);}
                else if(
message == "Time Show")
                    
Menu_Time(idfTimeShow"\nSelect a time for show\n\nTime is now ",
                    
TYPE_MENU_TIMESHOW);
                else if(
message == "Time Trans")
                    
Menu_Time(idfTimeTrans"\nSelect a time for transition\n\nTime is now ",
                    
TYPE_MENU_TIMETRANS);
            }
            
// Gestion menu Access
            
else if(iTypeMenu == TYPE_MENU_ACCESS) {
                if(
message != "Back")
                    
sAccess message;
                
Menu_Settings(id);
            }
            
// Gestion menus Time
            
else {
                if(
message != "Back") {
                    if(
iTypeMenu == TYPE_MENU_TIMESHOW)
                        
fTimeShow = (float)message;
                    else if(
iTypeMenu == TYPE_MENU_TIMETRANS)
                        
fTimeTrans = (float)message;}
                
Menu_Settings(id);
            }
        }
    }

    
timer()    {
        if(
iEcouteMenu && llGetTime() > TIMEOUTFinMenu();
        if(
iMode == MODE_FUSION_SHOWInit_Change(MODE_FUSION_TRANS);
        else if(
iMode == MODE_DARK_SHOWInit_Change(MODE_DARK_TRANS);
        else if(
iMode == MODE_SWAPH_SHOWInit_Change(MODE_SWAPH_TRANS);
        else if(
iMode == MODE_SWAPD_SHOWInit_Change(MODE_SWAPD_TRANS);
        else if(
iMode == MODE_CIRCLE_SHOWInit_Change(MODE_CIRCLE_TRANS);
        else if(
iMode == MODE_GROW_SHOWInit_Change(MODE_GROW_TRANS);
        else if(
iMode == MODE_FAST_SHOW || iMode == MODE_FUSION_TRANS
            
|| iMode == MODE_DARK_TRANS || iMode == MODE_SWAPH_TRANS
            
|| iMode == MODE_CIRCLE_TRANS || iMode == MODE_GROW_TRANS
            
|| iMode == MODE_SWAPD_TRANSChange();
    }

Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés