DIGITAL CONCEPTS CHAT 3D
Note des utilisateurs: / 34
MauvaisTrès bien 

Les Nouvelles Salles de Chat 3DNous avons le plaisir de vous annoncer que les Nouvelles Salles de Chat vous permettent maintenant de réaliser des mondes virtuels en 3 dimensions avec Webcam et Micro. Vous trouverez dans cette section toutes les informations nécessaires pour réaliser votre propre monde 3D.

L. Style de salle "3D"

Pour créer une salle 3D, vous devez créer un fichier WORLD.TXT décrivant tous les objets de votre monde. Ce fichier doit être placé dans le répertoire du serveur de chat. Si vous changez votre fichier, vous devez arrêter et redémarrer le serveur de chat.

Voici un exemple de fichier :

world.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
; world.txt
 
; sol
.1    -32768  32767   0
.2     32767  32767   0
.3     32767 -32768   0
.4    -32768 -32768   0
/ 1 2 3 4  {sable1}
 
; mur
.5    -300   -400   512
.6     200   -400   512
.7     200   -400     0
.8    -300   -400     0
/ 5 6 7 8 {welcom} bt

L'exemple ci-dessus décrit 2 choses :

. des coordonnées en 3 dimensions (x,y,z)
. des polygones habillés par une texture d'image

Pour créer votre fichier WORLD.TXT, vous avez 2 solutions :

a) utiliser un logiciel d'édition 3D (voir au chapitre M ci-dessous).

b) créer votre fichier world.txt à la main. Pour cela, prenez une feuille de papier et commencez par dessiner une carte vue d'en haut de votre monde (comme une photo satellite).

Dessinez des points sur la carte, numérotez-les (en commençant à 1), puis reliez-les par des lignes.

Exemple: un sol carré qui couvre toute la carte.

Exemple: Sol carré
       ^
       |
       |     1                  2
       |     .------------------.
       |     |                  |
+32767 |     |                  |
       |     |                  |
       |     |                  |
   à   |     |                  |
       |     |                  |
       |     4                  3
-32768 |     .------------------.
       |
  y:   |
       .-------------------------->
           x :   -32768   à   +32767

Votre carte a des coordonnées qui vont de -32768 à +32767.
Les 4 points ci-dessus ont donc les (x,y) suivants :

point 1 :  (-32768, +32767)
point 2 :  (+32767, +32767)
point 3 :  (+32767, -32768)
point 4 :  (-32768, -32768)

La 3ème coordonnée (z) indique l'altitude à laquelle se trouve le point.
Sur le chat, le sol se trouve à l'altitude 0.

Pour définir 4 points au niveau du sol, nous aurons donc :

Exemple: Sol
1
2
3
4
5
; sol
.1    -32768  32767   0
.2     32767  32767   0
.3     32767 -32768   0
.4    -32768 -32768   0

Nous devons maintenant relier les 4 points et choisir une texture d'image pour la colorier; cela se fait par la commande suivante :

/ 1 2 3 4 {sable1}

La texture doit être définie dans chatserv.ini comme pour une icone image.

Remarque:
l'ordre des points (1,2,3,4) est important !
En effet, les points doivent être énumérés dans l'ordre des aiguilles d'une horloge pour que la texture soit visible à l'avant.
Si vous voulez définir un plafond de manière analogue au sol mais à une hauteur Z de 512, vous devez définir les points dans l'ordre inverse (12,11,10,9), sinon votre plafond restera invisible et ne sera visible que pour les oiseaux !

Exemple: Plafond
1
2
3
4
5
6
7
; plafond
.9    -32768  32767   512
.10    32767  32767   512
.11    32767 -32768   512
.12   -32768 -32768   512
 
/ 12 11 10 9  {plafon}

Une autre solution pour ne pas être embêté avec l'ordre des points (si toutefois vous souhaitez utiliser la même texture des 2 côtés) c'est de mettre l'option b (both) qui a l'effet de rendre la texture visible des 2 côtés.

Exemple:
/ 12 11 10 9 {plafon}  b

Vous pouvez définir des sols et des plafonds; ils sont toujours plats, donc tous leurs points ont le même z.

Vous pouvez aussi définir des murs verticaux de manière analogue :

Exemple: Mur
1
2
3
4
5
6
7
; mur
.5      -300   -400   512
.6       200   -400   512
.7       200   -400     0
.8      -300   -400     0
 
/ 5 6 7 8 {welcom} bt

Pour un mur classique, on voit 2 points avec un Z de 0 (le bas du mur) et 2 autre points avec un Z de 512 (le haut du mur).
Ici, le mur va de (-300,-400) jusque (200,-400); on remarque que le Y ne change pas, c'est donc un mur qui va du nord au sud sur la carte.

Voici la liste des limitations du moteur 3D et quelques explications complémentaires:

Limitations des Points
Les coordonnées (X,Y,Z) varient de -32768 à +32767.

La coordonnée (Z) indique l'altitude (le sol est à 0, l'oeil du chatteur à 141, et un acteur (chatteur) peut passer dans un couloir au plafond à 282).

Limitations des Polygones
Dans la définition d'un polygone tel que :

/ 1 2 3 4 {sable1}

le nombre de points doit être compris entre 3 (triangle) et 8 (octogone);

exemple: 
/ 1 2 3 {triang}

Le polygone formé en reliant les points dans l'ordre doit être:

Plat (tous les points doivent se situer sur un même plan),
et convexe (aucun angle interne ne doit dépasser 180 degrés)
Si ces règles ne sont pas respectées, le résultat obtenu aura un défaut ! (à noter qu'un triangle est, par nature, toujours plat et convexe)

Le polygone doit être horizontal (sol, plafond) ou vertical (mur);
d'autres formes (par exemple un toit penché) sont possibles, elles ralentissent cependant le chat si elles ont une surface importante.

Les points d'un polygone doivent être énumérés dans l'ordre des aiguilles d'une horloge pour que la texture soit visible à l'avant.

Limitations des Textures
les dimensions maximales d'une image texture sont de 2048 x 2048, la taille de fichier image (jpg, gif, bmp, pcx, png) définie dans chatserv.ini est limitée à 127K. Les GIFs animées et les PNG semi-transparentes sont supportés.

Les options suivantes existent :

Option b (BOTH) : la texture est visible des 2 côtés (devant et derrière), peu importe l'ordre des points.
Option t (TRANSPARENT) : la couleur noire de la texture est utilisée comme couleur transparente.
Option n (NO COLLISION) : les personnages peuvent traverser le polygone.
Option s (STRETCH) : la texture est étirée sur toute la surface du polygone.
Option d (DOUBLE) : la texture est appliquée en double-précision (les points sont plus fins). Ne fonctionne pas avec STRETCH.

exemple: 
/ 1 2 3 4  {sable1}  btns

Options pour objets 3D seulement:

Option M (MERGE) : fusionne plusieurs textures sur un objet presque plat (pas compatible avec option STRETCH). Il faut spécifier l'option M sur toutes les textures que vous voulez fusionner. La première texture avec M est la texture de base sur laquelle la texture sera appliquée normalement. Sur les textures suivantes avec M et de même nom de texture, les textures seront appliquées avec l'orientation et le décalage de la texture de base, ce qui peut étirer la texture en cas de pente importante.

Option V (VELOCITY) : permet de faire défiler la texture sur l'objet à une certaine vitesse avec la commande object_texture_velocity.

Si vous n'avez pas utilisé l'option 's' et que la surface du polygone est plus grande que la texture, alors la texture sera répétée plusieurs fois pour couvrir l'entiereté de la surface du polygone; mais attention, le moteur 3D impose dans ce cas que les dimensions de la texture soient des puissances de 2 (par exemple 128 x 256) sinon le moteur 3D rajoutera un fond blanc (ou transparent si option t) pour remplir le trou.

Celà veut dire que seules les dimensions 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 ou 2048 sont possibles.

Plusieurs textures (jusqu'à 3) peuvent être spécifiées, elles alternent alors irrégulièrement avec une vitesse de 0.5 sec.

Exemple: 
/ 1 2 3 4  {sable1} {sable2} {sable3}  bt

 Comment changer son personnage ?

Un personnage entrant en salle apparait en (0,0,0) avec une direction 0 (regardant au nord). L'oeil est à (0,0,141).

Par défaut, vous vous promenez dans le monde 3D avec une boîte munie à l'avant d'un écran webcam.
Chaque chatteur peut également créer son propre personnage 3D composé de plusieurs polygones en créant un fichier actor.txt dans le répertoire du chat; Si vous changez le fichier, vous devez arrêter et redémarrer le chat.

Exemple: Actor (Personnage / Avatar).
1
2
3
4
5
6
7
8
9
10
11
12
; actor.txt
 
.1      159      0    119
.2     -160      0    119
.3     -160      0   -141
.4      159      0   -141
.5        0   -106   -141
.6        0   -106    -13
 
/  1 2 3 4  {webcam} {soleil} {toquer} b
/  5 3 2 6  {floor1} b
/  4 5 6 1  {floor1} b

Votre personnage dispose d'un espace (X,Y) de -160 à +160 et (Z) de -141 à +141 que vous pouvez remplir avec des polygones; dans l'exemple ci-dessus, on a définit 6 points et 3 polygones; l'espace(X,Y,Z) de l'actor n'est pas limité pour le bot.

La texture {webcam} est spéciale : c'est une texture qui ne doit pas être définie dans chat.ini car elle est créée dynamiquement et remplie avec l'image webcam du chatteur; l'option t (transparent) rend toute couleur noire transparente.

Dans le 1er polygone, on a spécifié 3 textures : la 1ère {webcam} est celle qui s'affiche par défaut, la 2ème {soleil} est celle qui s'affiche quand le chatteur se met en tasse, la 3ème {toquer} est celle qui s'affiche quand le chatteur prend son toc;

Le propriétaire de salle peut aussi modifier le personnage par défaut en plaçant un fichier actor.txt dans le répertoire du serveur. Il peut également placer des fichiers différents par genre de chatteur : actor.m.txt, actor.f.txt et actor.c.txt

Si tous les deux (chat client et serveur) ont placé un fichier actor, alors le chat a priorité sur le serveur.

La fonction script
b = actor_customized (session_key); 
permet de tester si un chatteur a changé son actor. Cette fonction renvoie 1 si le chatteur a changé son actor, ou 0 si c'est un actor par défaut ou choisi par le serveur. Cela permet au bot de ne pas attacher d'objets aux actors customisés par le client. Une petite note technique : la fonction actor_customized donne une erreur si on l'appelle en réponse à une action 128, il faut utiliser l'action 228 (arrivée en salle d'un actor) à la place.

Comment déplacer son personnage (bot) à l'aide d'un script

Les commandes suivantes ont été ajoutées au langage script pour supporter le monde 3D:

Les fonctions suivantes :

bot_x(), bot_y() et bot_z()

permettent de connaitre la position x, y et z de votre bot.

Exemple: 
if (bot_x() > 30000)    // on arrive en fin de terrain là !

La fonction :

bot_dir()

permet de connaitre la direction de votre bot, de 0 à 359 :
  0  = nord (vers le haut de la carte) 
 90  = est (vers la droite) 
180  = sud (vers le bas) 
270  = ouest (vers la gauche)
 

Les procédures:

turn (dir);  avec dir entre -360 et +360  permet de changer la direction de votre bot 
move (pas);  avec pas entre -65535 et +65535  permet d'avancer ou reculer le bot 
lift (altitude);  avec altitude entre -32768 .. +32767  permet de changer l'altitude du bot 

Ces procédure vous permettent de faire avancer le bot tout seul.

Les procédures:

teleport (session_key, x, y, z, dir);  avec dir entre -360 et +360  permet au bot de déplacer un joueur 
teleport (session_key, x, y, z, dir, port);  port = port du serveur  permet au bot de téléporter un joueur dans une autre salle sur le même PC ou routeur 
teleport (session_key, x, y, z, dir, port, ip$);  ip$ = adresse ip ou nom DNS  permet au bot de téléporter un joueur dans une autre salle 
set_gravity (session_key, gravity);  avec gravity entre -255 et +255 (-10=s'envole, 0=flotte en l'air, 10=tombe normalement) permet au bot de modifier l'attraction du sol 
give_ammo (session_key, ammo);  avec ammo entre -100 et +100  permet au bot de donner/enlever des munitions 
give_health (session_key, health);  avec health entre -100 et +100  permet au bot de donner/enlever des points de vie 

Ces procédure permettent à un bot avec toc de faire bouger un joueur, de lui donner des munitions ou des points de vie.

En outre, cliquer sur un actor génère une action 912 contenant dans line$ le session_key du chatter cliqué, en 10 chiffres.

Vous pouvez créer une procédure event_3D qui sera appelée chaque fois qu'un chatteur change de position; cela permet par exemple au bot de suivre un chatteur, de se placer devant lui, éventuellement de le toquer s'il se positionne là où il ne peut pas;

Exemple:

Exemple procédure: Kick
1
2
3
4
5
proc event_3D (session_key, x, y, z, dir)
{
  if (x > 16000)
  kick (session_key, "interdit d'aller là !");
}

Finalement, voici un exemple de script.txt qui fait avancer le personnage:

Exemple: Déplacer un personnage
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var dir;
 
proc timer ()
{
  if (dir == 0)
    turn (0);
  else
    turn (180);
 
  move (10);
 
  if (bot_y() > 30000)
    dir = 1;
  else if (bot_y() < -30000)
    dir = 0;
 
  set_timer (1);
}

Comment créer des objets 3D ?

Le bot peut créer des objets 3D que vous pouvez faire bouger et réagir quand un chatteur clique dessus. Un chatteur peut se placer sur un objet : si l'objet se déplace, le chatteur se déplacera avec. Un objet peut servir d'obstacle (mur, grille, cage) car le chatteur ne peut pas passer à travers (sauf si option n).

Pour créer un objet 3D, vous devez placer dans le répertoire du bot un fichier OBJECTS.TXT qui contiendra la définition de tous vos objets. Ici on a créé un oiseau et une porte:

Exemple: Objets
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# OBJECTS.TXT
 
[oiseau]              ; plan horizontal
.1 -141 307 0
.2  141 307 0
.3  141   0 0
.4 -141   0 0
/ 1 2 3 4 {bird01} btn
 
[porte1]              ; plan vertical
.1 -276 0 512
.2  276 0 512
.3  276 0   0
.4 -276 0   0
/ 1 2 3 4 {wood01} b

Pour permettre une rotation correcte, vos objets doivent être centrés en (0,0,0) et orientés au nord.
Les coordonnées (X,Y,Z) sont limitées entre -32768 et +32767.

Pour faire apparaitre et bouger vos objets, vous devez écrire un script tel que celui-ci et le placer dans le répertoire du bot:

Exemple: Script oiseau
1
2
3
4
5
6
7
8
// script.txt : exemple script pour objet 3D oiseau
 
proc timer ()
{
 object_shape (1, "oiseau");
 object_move (1, 0,     0, 12000);                     // position initiale
 object_move (1, 0, 10000, 12000, 0, 0, 0, 10000, 1);  // position finale
}

Les commandes script suivantes sont définies pour les objets 3D :

object_shape (nr, "oiseau");
object_shape (nr, "oiseau", "OBJECTS.TXT");

Choisit la forme "oiseau" (voir OBJECTS.TXT) pour l'objet numéro nr.
nr indique le numéro d'objet vous pouvez choisir entre 0 et 65535, vous pouvez donc créer jusqu'à 65536 objets (par script et par bot).
un objet peut changer de forme autant de fois que souhaité.
si on ne spécifie pas de fichier, c'est OBJECTS.TXT par défaut.
 
object_move (nr, x, y[, z[, direction[, hauteur[, transversal [, durée[, répéter]]]]]]);

Positionne un objet en coordonnée (x,y,z) avec une orientation (direction, hauteur, transversal).
les crochets indiquent que la plupart des paramètres sont optionnels, donc par exemple pour modifier uniquement le (X,Y) de l'objet numéro 1 vous pouvez écrire simplement: object_move (1, 100, 200);
direction : direction (angle 0 à 360, 0 = au nord).
hauteur : lever le nez (angle 0 à 360, 0 = normal).
transversal : pencher la tête (angle 0 à 360, 0 = normal).

durée : temps que prendra le mouvement de l'objet vers sa nouvelle position, en 1/1000 de secondes (0 = immédiat, 1000 = 1 seconde, 600000 = 600 secondes).
répéter : (0 = ne pas répéter le mouvement, 1 = quand l'objet est arrivé à sa nouvelle position, le faire revenir au début et répéter le mouvement).
Des valeurs -18000 à +18000 sont autorisées pour direction, hauteur et transversal afin de pouvoir faire plusieurs "tours" de 360 degrés au cours du déplacement de l'objet.
 
object_face_actor (nr, option); 

Oriente automatiquement l'objet afin qu'il s'affiche toujours face au chatteur !
C'est très utile si vous avez un objet 'plat' du genre 'attaquant doom' ou 'boule de feu' qui doivent toujours faire face au joueur pour ne pas qu'on voie qu'ils n'ont pas d'épaisseur.
Chaque chatteur verra donc l'objet dans une orientation différente.
option
1 = orienter toujours l'angle direction face au chatteur,
2 = orienter toujours l'angle direction et l'angle hauteur face au chatteur,
0 = désactiver l'orientation automatique.

 
object_face_to (nr, x, y [, z]);

Oriente l'objet pour qu'il 'regarde' le point (x,y,z).
Cette manière d'orienter l'objet est plus simple que de calculer les angles dans la commande object_move.
Cette commande désactive aussi l'orientation automatique (voir object_face_actor).
Si on ne spécifie que les coordonnées x et y, uniquement l'angle 'direction' est changé, si on spécifie aussi la coordonnée z l'angle hauteur est modifié aussi.
 
object_clickable (nr, option);

Rend l'objet 'cliquable', c'est-à-dire que si un chatteur clique dessus avec la souris un évènement (action 915) sera envoyée au script qui a créé l'objet.
Cette action contiendra dans line$ le numéro de l'objet, en 1 à 6 chiffres.
option :
1 = rend l'objet cliquable,
0 = ne rend plus l'objet cliquable
 
object_soap (nr, gliss);

Rend l'objet glissant, c'est-à-dire que s'il est penché et qu'un chatteur est dessus, le chatteur va glisser et risque de tomber de l'objet.
gliss : 0 à 255 :
0 = pas de glisse (le chatteur colle à l'objet),
10 = glisse normale,
255 = forte glisse.

la force de glisse dépend aussi de la gravité (voir set_gravity)
 
object_scale (nr, scale_x, scale_y, scale_z);

Agrandit ou rétrécit l'objet.
scale : entre 1 et 65536 :
128 = taille moitié,
256 = taille normale,
512 = taille double.

 
object_texture_velocity (nr, velocity_u, velocity_v);

Permet de faire défiler les textures ayant l'option V sur l'objet à une certaine vitesse
velocity_u, velocity_v : entre -2047 et +2047 en pixels par seconde

 
object_skybox (nr, on_off);

Crée un objet de type skybox dont la position est automatiquement centrée sur les coordonnées de chaque actor, ce qui permet de créer un objet cube avec un décor à distance infinie.
on_off : 0 = objet normal, 1 = objet skybox

 
object_attach_actor (nr, session_key, mode);

Permet d'attacher un objet à un actor. L'objet va alors suivre tous les mouvements de l'actor.
'mode' peut avoir les valeurs suivantes :
0 = détacher (redevient un objet normal)
1 = attacher à l'écran (seul le chatteur ayant la session_key voit l'objet)
2 = attacher à l'actor (tous les chatteurs voyent l'objet sauf celui qui a la session_key)
3 = 1 & 2 combinés.
 
object_attach_object (nr_objet_enfant, nr_objet_parent);

Permet d'attacher un objet (enfant) à un autre object (parent). L'objet (enfant) va alors suivre tous les mouvements de l'objet (parent).
Cela permet de réaliser des objets en plusieurs parties qui peuvent chacune effectuer des déplacements, rotations et scaling tout en restant attaché (tronc, bras, main, doigt).
attention: le numéro de l'objet enfant doit être plus grand que le numéro de l'objet parent.
 
object_delete (nr);

Efface l'objet (il va donc disparaitre).
 
object_sound (nr, "{son001}" [,distance]);
object_sound (nr, "son.wav" [,distance]);
object_sound (nr, "son.wav");

Permet à l'objet nr d'émettre un son. Le paramètre 'distance' permet de spécifier une distance en points. Les chatteurs éloignés de plus de 'distance' points de l'objet n'entendront pas le son.

Comment définir un arrière-plan ?

Il y a 3 manières de définir un arrière-plan au monde 3D :

Le paramètre suivant de chatserv.ini permet de choisir une couleur de fond :

[3D]
sky_color = 102,190,253

La commande script suivante permet de modifier la couleur de fond dynamiquement :

set_sky_color (r,g,b);  // change la couleur du ciel en 3D

 Créer une skybox : une skybox est un grand cube entourant le monde 3D et qui permet de spécifier des images en décor de fond.

Créez un object 3D en forme de cube (-32768 à 32767 par côté),
multipliez sa taille par deux avec object_scale afin d'obtenir un grand cube de 131072 de côté,
centrez-le sur chaque actor avec la commande object_skybox pour que l'acteur reste toujours au centre du cube.

Autres Options
On peut figer les textures GIF animées dans votre chat client, par :

# chat.ini
[3D]
animated-gifs = no  ; geler les GIFs animés dans les textures 3D.

 M. Logiciel d'édition 3D

Pour créer votre fichier world.txt automatiquement :

1) cliquer ici pour télécharger l'éditeur 3D (version 22). Attention: cliquez sur Enregistrer et pas sur Exécuter ! Téléchargez le logiciel sur votre disque dur, ensuite copiez-le dans le répertoire du serveur de chat (normalement c:\chatserv) et enfin démarrez-le en cliquant dessus.

2) commencez par dessiner un sol (car sinon votre personnage risque de sombrer dans les profondeurs bleues). Pour cela, cliquez sur "Texture" pour choisir une texture, ensuite cliquez sur "Mode" pour choisir le mode 'SOL', puis cliquez sur la carte pour dessiner un grand rectangle autour du signe violet et du triangle rouge (le triangle rouge indique votre position de départ). Si vous vous trompez, appuyez sur la touche Escape (Echap) pour annuler le dernier point cliqué. Pour fermer votre rectangle, recliquez sur le 1er point de départ. Votre rectangle devrait alors se colorer en bleu.

3) vous voyez un petit cercle bleu au centre de la carte. Si vous cliquez dessus, cela va sélectionner votre sol et afficher divers attributs changeables (hauteur du sol, texture, options T=Transparent, B=Both, N=No_Collision, S=Stretch). Un bouton 'Effacer' permet aussi d'effacer le sol.

4) pour dessiner des murs, choisissez une texture (bouton Texture), ensuite choisissez le mode 'MUR', cliquez ensuite dans la carte pour dessiner un ou plusieurs murs d'une pièce dans le sens des aiguilles d'une montre ! (en effet, chaque mur a 2 côtés et chaque côté a sa texture et sa hauteur). Pour commencer un nouveau mur, cliquez sur la touche Escape (Echap). Pour effacer un mur, cliquez sur son cercle vert pour le sélecter puis sur le bouton 'Effacer'. Vous pouvez aussi changer sa texture ou sa hauteur.

5) le mode PLAFOND sert à créer un plafond de la même manière que le sol. Pour les points du plafond, il est recommendé de prendre des points existants de mur ou de sol, car sinon les points resteront invisibles (pour les afficher, vous devrez changer les altitudes minimum et maximum sur l'indicateur en haut à gauche afin que le minimum soit égal à la hauteur du plafond).

6) le mode EDITION sert à déplacer des points ou changer des attributs sans rien créer de nouveau. Un message "Error: angle < 180°" apparait si vous créez un sol ou plafond comportant un angle supérieur à 180°, ce qui est interdit; déplacez alors le point pour faire disparaitre le message.

7) pour créer un 2ème étage, changez en haut à gauche les altitudes maximum à 33792 puis minimum à 33280. Vous ne verrez alors que les objets compris entre ces 2 limites. De manière similaire, on peut créer un escalier.

8) cliquez et déplacer la souris sur la fenêtre en haut à droite pour naviguer dans votre nouveau monde; tout objet créé ou option changée va y apparaitre en direct. Si vous changez votre altitude minimum (indicateur en haut à gauche), votre personnage va aller à cette altitude.

9) cliquez sur la croix en haut à droite pour sortir de l'éditeur, ce qui va automatiquement sauver votre monde dans un fichier world.txt

Pas de support dans les commentaires, le forum est là pour ça ...

Written by :
djphil
 
Commentaires (0)Add Comment
Ecrivez un commentaire
 
 
Réduire l'éditeur | Agrandir l'éditeur
 

busy