Cet article date de 2013 ! Retrouvez une version mise à jour ici.
Récemment, je me suis refait l'intégrale des Harry Potter en film, et j'ai adoré (une petite sorcière de 11 ans vit toujours en moi !). N'empêche, mon regard d'adulte n'a pas pu s'empêcher de remarquer que le système de magie ne semble pas très cohérent. Les films font plein de choix esthétiques, pertinents par rapport au support filmique, mais qui se contredisent les uns les autres.
Bien sûr, on ne regarde pas Harry Potter par logique pure, et ce n'est pas gênant si le système de magie n'est pas rigoureusement cohérent.
N'empêche, je me suis souvent dit que, si la magie existait, ça ressemblerait à de la programmation. Il y aurait un certain nombre de formules, certaines très connues et très utilisées, d'autres plus spécifiques et plus rares. Lancer un sort demanderait une bonne connaissance de la magie et - pour un sort complexe - pas mal de temps et de logique pour être élaboré.
D'ailleurs il y a de nombreuses similitudes entre un programmeur et un sorcier. Les deux ont mauvaise réputation (souvent par ignorance), on ne voit pas leur travail quand il est bien fait, et on les envoie au bûcher quand ils font une erreur !
Je profite donc de cet article pour vous expliquer comment fonctionne la programmation... ou plutôt, la magie !
Et si vous avez un jour rêvé d'entrer à Poudlard, vous allez comprendre pourquoi la programmation est quelque chose de fabuleux.
Invocation de golems
Tout comme il existe plusieurs formes de magie (la magie naturelle, la magie blanche, la magie noire, la nécromancie, etc...), il existe aussi plusieurs formes de programmation.
L'ActionScript 3, le langage utilisé par Flash, est une forme de magie plutôt facile à aborder mais qui n'est pas extrêmement puissante. Entendons-nous bien : vous pouvez faire des choses très poussées avec, mais ce n'est pas avec ça que vous deviendrez le Seigneur des Ténèbres !
L'ActionScript 3 appartient à une famille de magie que l'on appelle la Programmation Orientée Objet. Il s'agit d'une magie d'invocation et d'enchantement. Le principe est simple : au lieu de lancer directement les sorts, vous allez invoquer des objets et créatures enchantés qui, eux, vont agir à votre place.
La formule magique qui permettrait d'invoquer une fée appelée Navi est la suivante :
On peut invoquer tout ce qu'on veut (des loups, des arbres, des citrons...), mais il faut bien sûr, à l'avance, préparer un modèle de l'objet ou de la créature qu'on veut invoquer. Ces "objets" sont donc un peu comme des golems : des êtres artificiels créés à partir de glaise, et qui obéissent à leur créateur.
Enchantement de niveau simple
La magie d'enchantement est une magie à deux temps.
Dans un premier temps, nous allons enchanter notre objet ou créature ainsi créé, c'est-à-dire que nous allons définir ses caractéristiques (c'est ce qu'on appelle des variables : taille, vitesse, puissance de tir, points de vie, agressivité, etc)...
...et lui apprendre des comportements (c'est ce qu'on appelle les fonctions : se déplacer, attaquer, soigner, etc).
Ensuite seulement, une fois que ces comportements sont appris, on peut demander à notre créature de les exécuter à la demande ("Vole !") ou à des moments précis ("Si tu es face à un trou, vole par-dessus"). Certains sorciers sont capables de créer leurs propres sorts, eh bien voilà, nous aussi.
Pour construire notre jeu, j'ai donc invoqué un certain nombre de créatures, que j'ai enchantées pour qu'elles aient un comportement bien précis ! Voici un petit exemple (non exhaustif) des objets et créatures que l'on trouve dans le prototype actuel de "Rose in the Woods" :
Chacun de ces parchemins, qui comprend toutes les propriétés et tout le comportement d'un élément de jeu, est appelé une classe.
Chacun de ces parchemins, qui comprend toutes les propriétés et tout le comportement d'un élément de jeu, est appelé une classe.
Enchantement de familles
Là où la Programmation Orientée Objet devient fort intéressante, c'est qu'elle permet de définir des familles d'objets qui ont des caractéristiques en commun.
Par exemple, dans notre jeu, nous allons rencontrer un certain nombre d'alliés, les lubiens, qui ont chacun un pouvoir spécial. Je vais donc devoir créer chacun de ces lubiens :
Mais vous remarquerez qu'Akita et ADJ se ressemblent beaucoup, bien qu'ils aient des pouvoirs différents (attaqueBavure() et régénérationHéros()). Après tout, ils ont tous les deux les mêmes caractéristiques (portée, puissance, pointsDeVie, etc...) qui prendront des valeurs différentes, et les mêmes comportements (détecterCible, affecterVie...) à l'exception de leur pouvoir.
Pour éviter de devoir recoder la même chose pour chacun d'entre eux, je vais donc définir qu'ils appartiennent à la même famille : la famille des lubiens. Tous les lubiens hériteront des caractéristiques et des comportements de leur famille, mais chacun aura aussi ses caractéristiques et ses comportements propres !
Et c'est ainsi que je vais pouvoir créer un grand nombre de lubiens différents en relativement peu de temps !
Nouveau prototype !
D'ailleurs, si je vous en parle, c'est que j'ai commencé. Vous pouvez tester le nouveau prototype dans lequel Akita et ADJ viendront vous aider à survivre aux assauts des loups !
Les pouvoirs d'Akita et d'ADJ ne sont pas très visibles actuellement, mais ils fonctionnent :
- Akita attaque les ennemis qui s'approchent d'elle à coups de 0.5 points de vie ;
- ADJ redonne 3 points de vie au héros si celui-ci s'approche de lui (ne peut pas dépasser 50).
Alors ? Magique, vous ne trouvez pas ?
Et comme j'ai codé ça vite en rentrant du week-end, allez-y, signalez-moi les nouveaux bugs !
RépondreSupprimerEn rejouant j'ai eu un beug :
SupprimerAkita est morte (R.I.P akita )
et je vois encore des tirs d'Akita apparaître
Qu'est ce que je peut prendre cher !
SupprimerJuste pour dire que c'est vachement différent de jouer avec ce prototype que ce qu'on avait l'habitude de tester !
Et je trouves que la c'est trop facile !
Je met Akita au centre, je me met (ou plutôt, je met ADJ) au dessus d'Akita, je me met au dessus d'ADJ et je ne fait que tirer !
La grande partie des ennemis passent par au dessus et je les ai facilement, et si ils passent en bas, c'est pas pour attaquer les tours donc ils n'ont même pas le temps de me toucher avec les projectiles d'Akita ! screen
Alors vivement une combinaison de tours moins agressive et de nouveaux ennemis ! Plus résistants, qui attaque plus les tours que le joueur !, plus rapide !
Bien vu Elfy, merci !
SupprimerEffectivement, j'ai le même bug. Les tirs d'Akita continuent quand elle meure et blessent toujours les ennemis
SupprimerDéjà bravo, ça avance vachement bien ! Et puis le logo du titre est super réussi !
SupprimerAprès moi aussi, j'ai eu le même bug, mes tirs continuent même une fois morte.
J'ai le meme bug que les autres: Akita continue de tirer apres qu'elle soit morte. D'ailleurs, ADJ continue de me donner les 3 points de vie meme quand il est mort. En gros, les pouvoirs sont toujours actifs meme quand le perso est mort.
SupprimerMais sinon ce prototype est trop beau et trop bien.
"D'ailleurs, ADJ continue de me donner les 3 points de vie meme quand il est mort."
SupprimerEn effet ce bug doit être corrigé IMPERATIVEMENT ! Sinon on risque de croire que le jeu vante les mérites du cannibalisme ! (Si t'as pas de vie, prends un ami !)
Oh mais c'est bien le cannibalisme!! ^^
SupprimerJe viens d'avoir un gros bug Lou!!
SupprimerJe jouais normalement et tout a coup le FPS est passé a 7.5~8 FPS et ça laguait dure!! Je n'ai rien fait j'ai continué a jouer et le FPS est passé a 4!!! Je me suis alors rendu compte que 2 loups s'étaient bloqués contre la tente en haut a gauche. Quand je dis bloqué, je veux dire qu'ils ne bougeaient pas. Je suis alors allé les tuer et le FPS est redevenu normal.
Je pense que c'est ça le bug,(en plus de ce déjà communiqués plus haut), mais je ne sais pas pourquoi ça a fait laguer le jeu.
Voila bon courage Lou pour comprendre ce qui s'est passé! ^^
Et si cela se reproduit, je te le dirais
Petit bug graphique : J'arrive à faire passer le personnage sous l'image de adj et akita quand je suis en dessous d'eux. J'ai l'impression que ça arrive quand on aborde leur case par le coin.
Supprimerimage
Je me fais attaquer par des monstres invisibles, j'ai le bug d'Akita que les autres ont (elle est morte mais continue à tirer) et ADJ ne soigne plus au bout d'un moment.
SupprimerArf.
(Sinon, best article ever. Faire une comparaison avec HP rend la chose effectivement beaucoup plus intéressante!)
Je répète que, dans la majorité des cas, ça ne sert à rien de me rapporter des bugs sans faire de screenshot !
SupprimerHeuceh : sans screenshot de ton écran de jeu, je vais avoir du mal à comprendre ce qui s'est produit. Si ça se reproduit, fais un screenshot !!!
Le Troll : peu probable que ça aie quelque chose à voir avec le coin, mais je sais de quelle partie du code le bug vient. Je vais aller voir ça.
Trystan :
- "Je me fais attaquer par des monstres invisibles" : précise / fais un screenshot. Est-ce que ça veut dire que tu continues à perdre de la vie après la mort d'un ennemi ? Es-tu à l'endroit où cet ennemi est mort ?
- "ADJ ne soigne plus au bout d'un moment" : attention, le pouvoir d'ADJ ne fonctionne que si tu as moins de 50 points de vie. Combien de points de vie avais-tu quand ADJ ne soignait plus ? Fais un screenshot !!!
moi, c'est super, po de bug !
SupprimerJ'ai eu moi aussi le bug du personnage qui continue dans une direction (le bas) alors que j'ai relâché la touche.
SupprimerDans le cadre de débug, la touche bas était bien indiquée comme enfoncée.
Pas de screenshot, désolée (il n'y avait pas de lubiens sur le terrain et quelques loups me poursuivaient).
Des fois, j'ai des flèches directionnelles qui restent activées. Pour les débloquer il faut les presser et tirer.
SupprimerLa validation du positionnement des lubiens est bugué : si on clique sur leurs têtes (ou une partie du sprite hors de la case sur laquelle ils se trouvent) ça ne les placent pas. Alors qu'intuitivement ça devrait être le cas.
PETIT RAPPORT DE DEBUG
SupprimerLes pouvoirs des lubiens sont toujours actifs même quand le perso est mort. (plein de gens)
Corrigé, c'est juste que j'avais oublié de désactiver la fonction de tir ou de soin à la mort du lubien.
Les ennemis se bloquent et les FPS descendent très bas. (Heuceh)
Corrigé. C'était tout bête, mais j'ai mis du temps à trouver. Lorsqu'un ennemi ne trouvait pas le chemin jusqu'à sa cible, il se rabattait sur un lubien. Or, s'il n'y a plus aucun lubien sur le terrain, bug.
J'arrive à faire passer le personnage sous l'image de adj et akita quand je suis en dessous d'eux. (Le Troll)
Corrigé. Le point 0 des lubiens n'était pas positionné au même endroit que celui du héros, donc des fois ça faisait des choses bizarres.
(Vous verrez tout ça dans la prochaine version.)
PETIT RAPPORT DE DEBUG (suite)
Supprimerdes flèches directionnelles qui restent activées (Flash Six / aiRSoL)
Corrigé. Ce problème survient si vous cliquez en-dehors de l'espace de jeu en jouant. Les touches ne sont alors plus captées par le jeu et, si vous relâchez la touche de direction pendant ce temps-là, Flash ne le sait pas.
La validation du positionnement des lubiens est bugué (aiRSoL)
Corrigé. J'ai agrandi la zone cliquable pour qu'elle soit un peu plus grande que la silhouette du lubien.
Voilà, je crois que tout est fixé (vous verrez ça dans la prochaine version). Autre chose ?
Pourtant Lou il me semble que les lubiens étaient toujours vivants et ils se bloquaient quand meme. Mais bon c'est de ma faute je n'ai pas fait de screenshot! --'
SupprimerJ'ai réussi a reproduire le bug du lubien bloqué et j'ai fait un screenshot. Mais je ne sais pas comment te l'envoyer --'
SupprimerEt dans mon bug, les lubiens sont toujours vivants.
Héberge ton image sur http://www.hostingpics.net/ et donne-moi le lien.
SupprimerJe suis mort avant de prendre des screens. :S
Supprimer"Je me fais attaquer par des monstres invisibles" : Je continue à perdre de la vie comme si je me faisais attaquer par un monstre invisible, c'est-à-dire que quand je bouge, je ne perd plus de vie, mais après un moment passé immobile, je perd de la vie. Le tout se passe partout sur le terrain.
"ADJ ne soigne plus au bout d'un moment" : Bien sûr. Ce que je veux dire, c'est que je ne gagne plus de vie malgré un manque de vie (par exemple 40pdv/50pdv).
Bizarre bizarre...
SupprimerJe n'ai pas pus récupérer de screenshot mais à un moment la tourelle d'Akita qui était sensée être morte continuait de tirer malgré tout... (elle était invisible cependant, on ne voyait que les balles partir).
SupprimerCe bug a déjà été signalé plein de fois, et corrigé.
SupprimerD'ailleurs, en parlant du nouveau prototype, il sera bientôt disponible j'imagine. ^^
SupprimerDemain, je pense.
SupprimerComme j'ai écrit un article lundi et un autre mardi, j'ai besoin d'un peu de temps pour préparer le suivant.
Ok bon courage alors ^^
Supprimerhttp://hpics.li/19a8f97
SupprimerVoila Lou le fameux bug. J'ai fait exprès de laisser les loups arriver. Donc en haut a gauche, il y a un loup coincé vers la gauche contre la tente. Voila
Bonne chance
Trouvé et corrigé !
SupprimerCe bug survenait en fait quand le chemin entre l'ennemi et son objectif est particulièrement tortueux. J'ai augmenté la limite des tests qu'il a le droit de faire avant de considérer qu'il est perdu.
À ok.
SupprimerMême si j'ai pas trop compris comment tu as résolu le problème, j'ai compris pourquoi ce fichu bug était là. ^^
Je trouve que la hitbox des ennemis est trop grande en haut : je peux les toucher en tirant sur le nombre au dessus de leur tête.
SupprimerEt je pense que ça serait mieux si les ennemis se dirigeaient vers la cible la plus proche que ce soit héro ou lubiens. Parce qu'ils essayent tout le temps de faire le tour des lubiens pour venir me toucher.
Sinon à un moment j'ai eu (mais j'arriverai pas à le reproduire) une bullet qui a touché un ennemi en même temps qu'elle a touché la tente en haut à droite, ce qui la fait rebondir et toucher l'ennemi une deuxième fois. La suppression de la bullet aurait du être prioritaire sur le rebond (après c'est peut-être mes yeux qui m'ont joué un tour et il n'a été touché qu'une seule fois, mais je pense qu'il faudrait vérifier).
@Heuceh : il y avait un chemin très long, donc beaucoup de tests lancés en même temps pour connaitre le meilleur chemin jusqu'au héro. Et qui dit beaucoup de tests lancés en même temps dit beaucoup de calculs... Suffisamment pour que ton ordinateur rame et que ça fasse baisser le nombre de FPS.
La tente est en haut à gauche pas à droite -_-'
SupprimerMerci aiRSoL pour cette explication. Apres je ne connais rien a la programmation mais il me semble que Lou expliquait autre chose. Dites moi si je me trompe (surement). --'
SupprimerNon Heuceh, tu ne te trompes pas :)
SupprimerPour éviter que l'ordinateur fasse trop de calculs et baisse le nombre de FPS, j'ai placé une limite au-delà de laquelle l'ennemi considère que sa cible est trop loin et qu'il vaut mieux viser une cible proche de lui. Or cette limite était un peu trop basse et, dans certaines situations, l'ordinateur ne trouvait aucune cible à sa portée. D'où un gros bug.
Merci pour tes retours aiRSoL, c'est très pertinent :)
Aaaaaah ok : )
SupprimerMais alors pourquoi quand je me rapprochais du loup il restait quand même coincé? C'est parce qu'il n'arrivait plus a calculer?
Une fois que le programme d'un loup avait buggué, il s'arrêtait et n'essayait plus de recalculer un autre chemin.
SupprimerMerci Lou pour toutes ces explications. Tout paraît plus clair ^^
SupprimerDésolé de poser autant de questions (parfois inutiles). Et merci de prendre le temps d'y répondre. ^^
Oh, mais je suis ravie que, pour une fois, les gens s'intéressent à la programmation et essayent de la comprendre. Pose autant de questions que tu voudras !
SupprimerMais c'est trop bien en fait la programmation!!! On peut apprivoiser un dragon, un djinn ou même se prendre pour un sorcier! C'est super Lou. Tu rends ludique et simple la programmation, j'adore!!
RépondreSupprimerSuper bravo lou ;)
RépondreSupprimerTon article est très clair, tout simple et facile à comprendre ! Maintenant je sais comment expliquer aux autres ce que je fais de mes journée ;) de la magie :p (en même temps des lignes de code qui font un logiciel c'est toujours un peu magique ;) ).
RépondreSupprimerEt à l'école des sorciers de la programmation, il ne faut pas oublier qu'il y a aussi des sorcières !!
Bien sûr, d'ailleurs c'est bien une sorcière qui vous fait la visite guidée ;)
SupprimerOn n'oublie pas les sorcières quand il y a Hermione Granger :p
Supprimerje trouves que... les monstres n'ont pas assez d'obstacles; il viennent trop facilement vers nous mais j'imagine qu'avec tout les lubiens et leurs pouvoirs se sera plus difficile! Et je n'ai pas compris, quel rôle à Rose ?
RépondreSupprimer( il est chouette le logo )
Rose n'apparaît pas dans le jeu : le but est de la retrouver dans la forêt. Si tu n'as pas bien compris le jeu, va lire la page "Participez" qui résume notre avancée actuelle.
SupprimerNous n'avons fait aucun travail sur les obstacles à l'heure actuele. Le niveau actuel est un niveau-test fait par HadH, pour vérifier la cohérence graphique. C'est donc normal que ça te paraisse trop facile ou trop difficile, puisque ce n'est pas réglé.
D'accord , merci :)
Supprimerwaah *-*
RépondreSupprimerc'set super ! dommage qu'on puisse jouer qu'avec 2 lubiens !(pour l'instant, hein)
sinon le logo est simple mais super (c'est qui qui l'a fait ?)
Tu devrais lire la discussion, il y a des choses intéressantes dedans.
SupprimerJ'ai testé le jeux, c'est vraiment extra. :)
RépondreSupprimerSeulement, je ne sais si c'est voulu, mais on peut passer sur les lubiens lorsqu'on arrive d'en bas, mais on est "bloquer" au dessus" d'eux.
(je m'excuse je m'exprime très mal! D:)
Je n'ai pas trouver ça aussi simple qu'ADJ car je trouve les ennemis très rapide, et il est très facile de se faire "aggro"!
Sinon en passant j'ai lu la proposition des pouvoirs et je valide. :)
Et je donne tous mes accords et tous mes droits d'auteurs pour le jeux! :D Gratuit ou payant, je lui souhaite de réussir!
Heu du coup je ne sais pas si le lien est fait mais Flem=Decibel.^^
SupprimerSi ne t'inquiete pas. Et puis on te reconnais grace a ton image de profil ^^
Supprimer:)
SupprimerD'ailleurs, pour le pouvoir, pour être honnête je n'ai pas lu les pouvoirs de tout le monde (paf!), mais je pense que quelqu'un qui ralentirai les ENNEMIS, plus que les TIRS ennemis, ce serait pas mal. :3
Donc je valide et me contredis deux minutes plus tard. Je m'aime.
Désolé. :/
Expliquer la programmation en utilisant la magie, c'est extra!! J'ai presque tout compris^^
RépondreSupprimerD'ailleurs à part les bugs cités plus haut par Elfy et Heuceh, je n'ai rien à signaler dans ce nouveau prototype, les ennemis ne courent plus sur place ou le font moins souvent et moins longtemps. Par contre vu que les lubiens bloquent les tirs je ne peux pas sauver ADJ et il meure rapidement (sorry sorry) mais bon ça fait parti du jeu...
(Et se faire l'intégrale de Harry Potter y'a que ça de vrai! =D)
Héhé... C'est bon de sentir notre rôle dans un jeu comme ça. Je donne des petits soins au héros^^, le joueur tiens a me protégé parce que je suis fragile, (ça me rappelle quand j'étais un heal dans les donjons sur Wow ^^)
SupprimerAvec tout les Lubiens, il y a de quoi s'amuser !
"J'ai presque tout compris^^" : et qu'est-ce que tu n'as pas compris ?
SupprimerEn fait je confondais "variable" et "fonction", du coup j'avais du mal à saisir cette phrase: Tous les lubiens hériteront des caractéristiques de leur famille, mais chacun aura aussi ses caractéristiques propres...
SupprimerEn l'occurence dans la phrase que tu cites, peu importe qu'il s'agisse de variable ou de fonction.
SupprimerVariable = propriété (taille, poids, puissance...)
Fonction = comportement (courir, voler, attaquer...)
Du coup, les lubiens ont à la fois en commun des variables (ils ont tous des points de vie par exemple) et des fonctions (ils meurent tous quand ils n'ont plus de vie).
D'où l'intérêt de les faire appartenir à une seule famille pour regrouper tout ça !
Géniale l'initiation à la magie du code ! Bravo, Lou ! Je suis mauvais chasseur de bugs mais je suis d'accord avec Jeanne Comets, il est très chouette le titre. Chouette ?!! Ce serait pas plus marrant avec de vrais bons gros yeux de chouette ?
RépondreSupprimerRemarque ça serait drôle, ça ferait aussi référence à la forêt, en plus la forme du W s'y prête bien (même si ce serait plutôt un hibou), il suffirait de rajouter un petit losange entre les deux "o" pour signifier le bec en gardant les mêmes yeux:
SupprimerLogo hibou
En plus ça ferait un petit clin d'oeil à Ulule au passage.. non :D?
C'est très rigolo avec le bec ! Je me demande par contre si ça ne focalise pas un peu trop l'attention sur ce détail, empêchant de voir la globalité du texte.
SupprimerDes avis ?
J'aime beaucoup !
SupprimerPersonnellement, j'aime beaucoup mais je ne vois que ça
SupprimerAprès c'est peut-être parce que j'ai trop vu le logo sans que mes yeux se focalisent autant sur le bec
Je trouve aussi que ça rend le titre difficile à lire.
SupprimerPar contre j'aime beaucoup le logo, beau travail Apollodoros!
C'est super beau comme ça ! Au niveau de la lisibilité, moi je trouve que ça va, j'ai demandé à quelques personnes ce qu'elles lisaient et elles ont toutes eu bon. Après c'est vrai qu'on se focalise pas mal sur le hibou mais bon.
Supprimerj'aime beaucoup la proposition de Chouf' !
SupprimerPersonnellement, j'aime beaucoup ce logo avec la chouette ! Ça donne une ambiance nocturne sympathique :) Et je ne le.trouve pas si envahissant ...
SupprimerJ'ai tout compris. C'est très bien expliqué ! Merci et bravo Lou !
RépondreSupprimerEt chouette logo (je l'avais déjà vu, mais il fallait que je le dise) !
Super article ! Ca donne envie d'essayer ! *.*
RépondreSupprimerhaaa ! Harry Pother !
RépondreSupprimerTu sais quoi, je me suis dis la même chose à plusieurs reprise sur la magie !
C'est pas si mal la programation en fait (surtout vu avec Hermione ! Haha)
Tiens, on a la même vision de la programmation (ça date de 2009 ^^").
RépondreSupprimerSinon, je sais pas si ça a été proposé quelque part, pourquoi n'y aurait-il pas 2 types d'obstacles :
- les obstacles bas qui bloquent les mouvement mais pas les projectiles (et éventuellement les ennemis volants)
- les obstacles haut qui bloquent tout
Ca ne me paraît pas très dur de changer le code existant pour le permettre (vu l'aperçu qu'on a eu du code jusqu'à présent), et ça serait plus naturel (rebondir sur les pierres, c'est un peu bizarre).
Après, ça rend possible les "barricades", mais ça peut être intéressant aussi de jouer avec ça dans le level design.
Les grands esprits se rencontrent...
SupprimerNon seulement sur la sorcellerie, mais aussi parce que j'ai déjà programmé les obstacles hauts et bas dont tu parles (c'est pour la prochaine version mais chuuuut...)
En tout cas ce jeu montre très bien la solidarité entre les lubiens, j'avais envide de défendre mes petites tours :3
RépondreSupprimer