Princess Lemming: Difference between revisions

From air
Jump to navigation Jump to search
No edit summary
 
(81 intermediate revisions by 2 users not shown)
Line 1: Line 1:
[[Image:RicommingsLogo.png|thumb|right|200px|Logo]]
[[File:RicommingsLogo.png|200px|thumb|right|Logo]]


* Encadrants: Eric GASCARD
* Encadrants: Eric GASCARD (tuteur), Michaël PERIN
* Elèves RICM3: Patrick PEREA (chef de projet)
* Elèves RICM3: Patrick PEREA (chef de projet),Rama CODAZZI,El Hadji Malick FALL,Tianmao LAN,Ombeline ROSSI,Ye XIA
Rama CODAZZI
EL Hadji Malick FALL

Tianmao LAN

Ombeline ROSSI

Ye XIA




Line 20: Line 12:


==Description (Contrat)==
==Description (Contrat)==
[[Image:RicommingsCapture.png|thumb|right|400px|Map]]
[[File:RicommingsCapture.png|400px|thumb|right|Map]]


Ricommings est un jeu vidéo de réflexion dans lequel l’utilisateur doit mener de petits pingouins appelés Ricommings, jusqu’à la sortie. Il dispose pour cela d’un panel d’actions à leur faire réaliser, afin qu’ils interagissent avec leur environnement. Celui-ci est truffé de situation à première vue inextricables.
Ricommings est un jeu vidéo de réflexion dans lequel l’utilisateur doit mener de petits pingouins appelés Ricommings, jusqu’à la sortie. Il dispose pour cela d’un panel d’actions à leur faire réaliser, afin qu’ils interagissent avec leur environnement. Celui-ci est truffé de situation à première vue inextricables.
Dans le jeu de base, le niveau est réussi lorsqu’un certain pourcentage de Ricommings atteint la sortie. Cet objectif est inscrit en bas de l’écran. Un timer indique également le temps restant pour réussir le niveau.
Dans le jeu de base, le niveau est réussi lorsqu’un certain pourcentage de Ricommings atteint la sortie. Cet objectif est inscrit en bas de l’écran. Un timer indique également le temps restant pour réussir le niveau.
Dans le second mode, seul le dernier Ricomming, un pingouin femelle, doit atteindre la sortie. Ses prédécesseurs ne sont destinés qu'à lui ouvrir la voie.
Dans le second mode, seul le dernier Ricomming, un pingouin femelle, doit atteindre la sortie. Ses prédécesseurs ne sont destinés qu'à lui ouvrir la voie.

Voici le contrat de base qui a été fixé :
. Jeu de base = Lemmings
. Gestion du temps : Timer, Accélération, Pause
. Explosion des pingouins restants (nuke)
. 2 modes de jeu :
- Lemmings de base (sauver un certains pourcentage de Lemmings)
- sauver une princesse (qui ne sait que marcher)
. Sauvegarde/Reprise d'une partie

En extension :
. Objets actifs : pièges,monstres,portes


==Architecture==
==Architecture==

[[File:Archi.jpeg|400px|thumb|center]]


==Manuel Utilisateur==
==Manuel Utilisateur==
Line 37: Line 43:
Un timer indique dans quelle durée il faut réussir l’objectif défini. Si le temps imparti est écoulé, le jeu s’arrête.
Un timer indique dans quelle durée il faut réussir l’objectif défini. Si le temps imparti est écoulé, le jeu s’arrête.
En plus des boutons d’action des Ricommings, l’utilisateur dispose de plusieurs autres fonctionnalités :
En plus des boutons d’action des Ricommings, l’utilisateur dispose de plusieurs autres fonctionnalités :

[[File:boutons.png|300px|thumb|center]]


'''2- Dans le second mode'''
'''2- Dans le second mode'''
Line 44: Line 52:
'''II- Installation'''
'''II- Installation'''


Ricommings nécessite d’avoir OCaml et la Machine Virtuelle Java (JVM) en version 1.7. Ensuite, il faut extraire le fichier '''.zip'''. Vous obtiendrez alors un dossier nommé « Ricommings » contenant un script d'exécution qu’il suffira juste de lancer ('''init.bat''' sous Windows ou '''init.sh''' sous Linux). Ce dossier contient également le fichier de configuration '''input.ml''' qui respecte toute la syntaxe du langage d’entrée du jeu mais qui reste éditable sous certaines conditions formelles à respecter cependant :
Ricommings nécessite d’avoir OCaml et la Machine Virtuelle Java (JVM) en version 1.7. Ensuite, il faut extraire le fichier '''.zip'''. Vous obtiendrez alors un dossier nommé « Ricommings » contenant un script d'exécution qu’il suffira juste de lancer ('''Launcher.bat''' sous Windows ou '''Launcher.sh''' sous Linux). Ce dossier contient également le fichier de configuration '''input.ml''' qui respecte toute la syntaxe du langage d’entrée du jeu mais qui reste éditable sous certaines conditions formelles à respecter cependant :
Vous ne devez en aucun cas définir une action différente de celles spécifiées ci-dessus :
Vous ne devez en aucun cas définir une action différente de celles spécifiées ci-dessus :
'''angel,bash,bashEnd,bridging,climb,climbing,die,digging,explose,fall,falling,float,floating,gone,leave,leave,list,miningfloat,floating,gone,leave,mining,turnback,turnBack_blocker,walk,walkAC, walking'''.
'''angel,bash,bashEnd,bridging,climb,climbing,die,digging,explose,fall,falling,float,floating,gone,leave,leave,list,miningfloat,floating,gone,leave,mining,turnback,turnBack_blocker,walk,walkAC, walking'''.
Line 64: Line 72:


● Choisir un niveau correspondant à une map
● Choisir un niveau correspondant à une map

[[File:interface.png|300px|thumb|center]]

Une fois le niveau démarré, l’utilisateur a le choix entre diverses actions à faire réaliser aux Ricommings :

[[File:icones.jpeg|300px|thumb|center]]

Chaque bouton représentant une action est surmonté d’un compteur. Celui-ci indique le nombre de fois que cette action peut être assignée.

Les Ricommings arrivent dans le niveau par une entrée [[File:entrance.gif|50px]] et le quittent par une sortie telle que celle-ci : [[File:exit.gif|50px]].

Les messages respectifs '''« YOU WIN ! »''' et '''« YOU LOOSE ! »''' indiquent si vous avez gagné ou perdu le jeu.

S’ils quittent l’écran, ils meurent aspirés par le vide intersidéral. La scrollbar en bas de l’écran permet de parcourir le niveau.


==Manuel Développeur==
==Manuel Développeur==
'''INTRODUCTION'''

Ce manuel donne toutes les informations nécessaires à la compréhension du jeu Ricommings telles que les conventions de codage utilisées. Le jeu Ricommings reprend les mêmes principes que le jeu Lemmings mais avec des spécificités particulières.
L’utilisateur remplit des données dans un fichier Caml afin de définir tous les paramètres requis dans le jeu, notamment les comportements des Ricommings . L’évolution de ceux-ci se fera à partir d’algorithmes implémentés en Java. La partie pourra être visualisée par l’utilisateur via une interface graphique.
L’architecture globale de notre programme est décrite par le graphe suivant :

[[File:schema_archi.png|250px|thumb|center]]


'''PARTIE 1'''

'''1- Structure du fichier Ocaml'''

Le fichier Ocaml input.ml est destiné à être rempli par l’utilisateur qui doit respecter la grammaire de ce langage et les types tels qu’ils ont été définis. Ces types sont invariables. Le non-respect de ceux-ci entraîne une erreur d'exécution lors de la génération du fichier XML par le fichier parser.ml.
Voici la structure des types à respecter :

'''2- Ecriture du fichier XML'''

Pour générer le fichier XML, un parser n’est pas nécessaire (pas de manipulation de flux), ni une redéfinition de type sous forme de token. Il suffit juste de faire un appel à la fonction ecriretout qui permet d’écrire dans le fichier XML toutes les informations qui ont été saisies par l’utilisateur dans les structures prédéfinies.
Il faut cependant veiller à ne pas oublier ces deux instructions :
1. open String;;
Cette instruction permet de faire un appel au module String qui fournit des fonctions pour manipuler les chaînes de caractères dont la fonction 'length' qui permet de calculer la taille des chaînes données en entrée par l’utilisateur.
2. let canalsorti = open_out "Parser.xml";;
Cette ligne indique le fichier XML à créer ou à écraser s'il existe déjà.
La fonction ecriretout comporte trois sous-fonctions majeures :
→ ecriretoutmode permet de dérouler la liste des modes contenant chacune d’elles la map correspondante ainsi que le nombre de lemmings et leurs caractéristiques
→ ecriretoutcomportement qui décrit la liste des comportements à qui sont associés chacun un et un seul automate
Ces fonctions utilisent elles-mêmes des fonctions intermédiaires qui sont adaptées à d’éventuelles modifications (par exemple ajout de nouveaux attributs).
Lorsque les types ont été respectés par l’utilisateur, le fichier XML est généré sans problème comme cela est visible dans l’exemple suivant :

[[File:captureXML.png|250px|thumb|center]]

Dans le cas contraire, un message d’erreur est généré pour indiquer le bon type à utiliser.


'''PARTIE 2'''

'''1- Architecture du logiciel'''

Le logiciel est basé sur une architecture MVC (Modèle-Vue-Contrôleur). Il est découpé de la façon suivante :

[[File:MVC.png|250px|thumb|center]]


Le modèle assure la gestion des événements et le fonctionnement des automates.
Le contrôleur déclenche les événements et informe des changements au modèle.
La vue gère l’affichage du jeu.

'''2- Organisation du code'''

Le code est découpé en plusieurs paquets:

[[File:packaging.png|250px|thumb|center]]

'''→ Interface'''

Le package Interface comprend l’ensemble des classes nécessaires à l’affichage de l’interface graphique et le passage de fenêtre en fenêtres. La classe Menu regroupe tous les boutons que l’utilisateur peut utiliser depuis le menu principal. La classe JavaClip s’occupe de la musique qui tourne dans notre jeu. Enfin, la classe MainWin est classe s’occupant de la fenêtre de jeu. Cette même classe est utilisée que ce soit pour le mode FACILE ou DIFFICILE.

'''→ Model'''

Le package Model Comprend toutes les classes nécessaires à l’animation des personnages et la mise à jour de la map. Ainsi la classe D_Lemming s’occuper des données relatives aux lemmings (position, attribut climber ou floater etc), la classe G_Lemming s’occupe de l’affichage d’un lemming, c’est-à-dire de l’animation des sprites etc.
De la même façon, la classe D_Background s’occupe des données relatives à l’image de fond, comme le tableau de booléens (pour indiquer le sol ou murs sur la map, 0 pour indiquer le vide), ainsi que des méthodes permettant de déterminer si un lemming donné est en présence d’un mur, dans le vide etc. La classe G_Background contient toutes les méthodes permettant de mettre à jour l’affichage de la map comme G_Remove(). Cette méthode permet de peindre par-dessus la map lorsqu’un lemming effectue une action telle que digger, miner etc...

'''→ Interpréteur'''
Ce paquet gère le fichier XML donné en entrée. La classe Parser récupère tous les nœuds et attributs du fichier XML. Ainsi, les objets automates entre-autres sont créés à partir de celui-ci.

'''→ StateMachine'''

Il regroupe toutes les classes relatives au fonctionnement de l’automate et les structures qui permettent de l’implémenter :
*'''StateMachine''' qui représente l’automate
*'''StateMachineList''' qui est une liste d’automates
*'''Etat''' qui est l’association d’un id, d’un nom et d’une image
*'''EtatList''' qui gère une liste d’états
*'''Transition''' assure la création des transitions de l’automate à partir d’un état de départ, d’un état d’arrivée, d’une condition et d’une liste d’actions, ainsi que leur gestion.
*'''TransitionList''' régit une liste de transition
*'''Action''' qui est une classe abstraite dont hérite toutes les autres classes qui gèrent les actions que les Lemmings peuvent effectuer
*'''ActionList''' implémente une liste d’actions

'''→ Serializing'''

Ce package ne comprend que la classe Sauvegarde qui contient deux méthodes gérant l’enregistrement des parties : save pour la sauvegarde et load pour le chargement.

'''3- Hiérarchie des classes'''

L’organisation des classes se présente comme suit :

[[File:orga_classes.png|250px|thumb|center]]

Nous avons défini 6 classes permettant d’implémenter l’automate qui vient d’être présenté. Les états, transitions et actions sont récupérés à partir du XML.
Un automate est composé d’un Etat courant, d’une liste d’Etat et d’une liste de transitions. Nous avons implémenté la liste des états par une ArrayList d’objets de la classe Etat, et la liste des transitions par une ArrayList d’objets de la classe Transition.
Les états de l’automate sont par exemple, Walker, Floater, Climber etc…Un état est représenté par son identifiant qui est un int, son nom qui un String, et le nom du sprite correspondant. Par exemple pour l’état Walker, on aura l’image walker.gif.
Une transition est composée d’un état de départ, d’un état d’arrivée et d’une condition qui est un String, et d’une liste d’Actions.


La classe '''Automate''' contient une méthode '''step()''' qui récupère toutes les transitions correspondant à l’état courant de l’automate et, pour chaque transition vérifie si les conditions sont réunies pour exécuter cette transition. Cette méthode est appelée pour chaque lemming depuis la boucle principale du jeu. En fonction de la transition exécutée la méthode '''step()''' exécute les actions correspondantes à la transition en appelant la méthode '''run()''' et met à jour l’état courant de l’automate.

[[File:actions.png|250px|thumb|center]]


==Liens & Ressources==
==Liens & Ressources==
Téléchargement du jeu :
[[Media:Ricommings.zip]]

Latest revision as of 13:25, 14 July 2013

Logo
  • Encadrants: Eric GASCARD (tuteur), Michaël PERIN
  • Elèves RICM3: Patrick PEREA (chef de projet),Rama CODAZZI,El Hadji Malick FALL,Tianmao LAN,Ombeline ROSSI,Ye XIA


Description (Contrat)

Map

Ricommings est un jeu vidéo de réflexion dans lequel l’utilisateur doit mener de petits pingouins appelés Ricommings, jusqu’à la sortie. Il dispose pour cela d’un panel d’actions à leur faire réaliser, afin qu’ils interagissent avec leur environnement. Celui-ci est truffé de situation à première vue inextricables. Dans le jeu de base, le niveau est réussi lorsqu’un certain pourcentage de Ricommings atteint la sortie. Cet objectif est inscrit en bas de l’écran. Un timer indique également le temps restant pour réussir le niveau. Dans le second mode, seul le dernier Ricomming, un pingouin femelle, doit atteindre la sortie. Ses prédécesseurs ne sont destinés qu'à lui ouvrir la voie.

Voici le contrat de base qui a été fixé :

  . Jeu de base = Lemmings
  . Gestion du temps : Timer, Accélération, Pause
  . Explosion des pingouins restants (nuke)
  . 2 modes de jeu : 
     - Lemmings de base (sauver un certains pourcentage de Lemmings) 
     - sauver une princesse (qui ne sait que marcher)
  . Sauvegarde/Reprise d'une partie

En extension :

  . Objets actifs : pièges,monstres,portes

Architecture

Archi.jpeg

Manuel Utilisateur

I- Fonctionnalités et détails

1- Dans les deux modes

Les Ricommings, lors de leur arrivée dans le niveau, se déplacent systématiquement vers la droite. Face à un mur, ils opèrent un demi-tour. Lorsqu’ils rencontrent du vide, ils chutent ; et meurent en rencontrant le sol s’ils tombaient à une trop grande vitesse. Nous rappelons que la chute accélère au fur et à mesure que le temps s’écoule. Un timer indique dans quelle durée il faut réussir l’objectif défini. Si le temps imparti est écoulé, le jeu s’arrête. En plus des boutons d’action des Ricommings, l’utilisateur dispose de plusieurs autres fonctionnalités :

Boutons.png

2- Dans le second mode

Les Ricommings doivent assurer ici la sécurité de la Ricomming, qui n’est pas capable d’interagir avec le niveau et ne fait que suivre ses congénères masculins. Ces derniers doivent tout faire pour qu’elle arrive saine et sauve à la porte.

II- Installation

Ricommings nécessite d’avoir OCaml et la Machine Virtuelle Java (JVM) en version 1.7. Ensuite, il faut extraire le fichier .zip. Vous obtiendrez alors un dossier nommé « Ricommings » contenant un script d'exécution qu’il suffira juste de lancer (Launcher.bat sous Windows ou Launcher.sh sous Linux). Ce dossier contient également le fichier de configuration input.ml qui respecte toute la syntaxe du langage d’entrée du jeu mais qui reste éditable sous certaines conditions formelles à respecter cependant : Vous ne devez en aucun cas définir une action différente de celles spécifiées ci-dessus : angel,bash,bashEnd,bridging,climb,climbing,die,digging,explose,fall,falling,float,floating,gone,leave,leave,list,miningfloat,floating,gone,leave,mining,turnback,turnBack_blocker,walk,walkAC, walking.

Il en est de même pour les conditions que sont : hole,out of map,wall,exit,ground,wall + could climb,wall + could bash,blocker,ground+fast,could float,emptiness,cannot climb,climb,angel,bomb,bridge,get to ground,get to top,ground + fast,end,no wall.

En ce qui concerne les id des états, ils doivent obligatoirement compris dans l’intervalle [0;11]. Les modes du jeu sont facile ou difficile et les natures des Lemmings bon ou princesse. Pour le reste des éléments, il vous convient de les définir comme bon vous le semble tant qu’ils restent cohérents.


III- Utiliser le jeu

Le menu présente plusieurs options :

● Charger une sauvegarde

● Choisir le mode de jeu

● Choisir un niveau correspondant à une map

Interface.png

Une fois le niveau démarré, l’utilisateur a le choix entre diverses actions à faire réaliser aux Ricommings :

Icones.jpeg

Chaque bouton représentant une action est surmonté d’un compteur. Celui-ci indique le nombre de fois que cette action peut être assignée.

Les Ricommings arrivent dans le niveau par une entrée Entrance.gif et le quittent par une sortie telle que celle-ci : Exit.gif.

Les messages respectifs « YOU WIN ! » et «  YOU LOOSE ! » indiquent si vous avez gagné ou perdu le jeu.

S’ils quittent l’écran, ils meurent aspirés par le vide intersidéral. La scrollbar en bas de l’écran permet de parcourir le niveau.

Manuel Développeur

INTRODUCTION

Ce manuel donne toutes les informations nécessaires à la compréhension du jeu Ricommings telles que les conventions de codage utilisées. Le jeu Ricommings reprend les mêmes principes que le jeu Lemmings mais avec des spécificités particulières.

L’utilisateur remplit des données dans un fichier Caml afin de définir tous les paramètres requis dans le jeu, notamment les comportements des Ricommings . L’évolution de ceux-ci se fera à partir d’algorithmes implémentés en Java. La partie pourra être visualisée par l’utilisateur via une interface graphique.

L’architecture globale de notre programme est décrite par le graphe suivant :

Schema archi.png


PARTIE 1

1- Structure du fichier Ocaml

Le fichier Ocaml input.ml est destiné à être rempli par l’utilisateur qui doit respecter la grammaire de ce langage et les types tels qu’ils ont été définis. Ces types sont invariables. Le non-respect de ceux-ci entraîne une erreur d'exécution lors de la génération du fichier XML par le fichier parser.ml.

Voici la structure des types à respecter :

2- Ecriture du fichier XML

Pour générer le fichier XML, un parser n’est pas nécessaire (pas de manipulation de flux), ni une redéfinition de type sous forme de token. Il suffit juste de faire un appel à la fonction ecriretout qui permet d’écrire dans le fichier XML toutes les informations qui ont été saisies par l’utilisateur dans les structures prédéfinies.

Il faut cependant veiller à ne pas oublier ces deux instructions :

1. open String;; Cette instruction permet de faire un appel au module String qui fournit des fonctions pour manipuler les chaînes de caractères dont la fonction 'length' qui permet de calculer la taille des chaînes données en entrée par l’utilisateur.

2. let canalsorti = open_out "Parser.xml";; Cette ligne indique le fichier XML à créer ou à écraser s'il existe déjà.

La fonction ecriretout comporte trois sous-fonctions majeures :

→ ecriretoutmode permet de dérouler la liste des modes contenant chacune d’elles la map correspondante ainsi que le nombre de lemmings et leurs caractéristiques

→ ecriretoutcomportement qui décrit la liste des comportements à qui sont associés chacun un et un seul automate

Ces fonctions utilisent elles-mêmes des fonctions intermédiaires qui sont adaptées à d’éventuelles modifications (par exemple ajout de nouveaux attributs). Lorsque les types ont été respectés par l’utilisateur, le fichier XML est généré sans problème comme cela est visible dans l’exemple suivant :

CaptureXML.png

Dans le cas contraire, un message d’erreur est généré pour indiquer le bon type à utiliser.


PARTIE 2

1- Architecture du logiciel

Le logiciel est basé sur une architecture MVC (Modèle-Vue-Contrôleur). Il est découpé de la façon suivante :

MVC.png


Le modèle assure la gestion des événements et le fonctionnement des automates. Le contrôleur déclenche les événements et informe des changements au modèle. La vue gère l’affichage du jeu.

2- Organisation du code

Le code est découpé en plusieurs paquets:

Packaging.png

→ Interface

Le package Interface comprend l’ensemble des classes nécessaires à l’affichage de l’interface graphique et le passage de fenêtre en fenêtres. La classe Menu regroupe tous les boutons que l’utilisateur peut utiliser depuis le menu principal. La classe JavaClip s’occupe de la musique qui tourne dans notre jeu. Enfin, la classe MainWin est classe s’occupant de la fenêtre de jeu. Cette même classe est utilisée que ce soit pour le mode FACILE ou DIFFICILE.

→ Model

Le package Model Comprend toutes les classes nécessaires à l’animation des personnages et la mise à jour de la map. Ainsi la classe D_Lemming s’occuper des données relatives aux lemmings (position, attribut climber ou floater etc), la classe G_Lemming s’occupe de l’affichage d’un lemming, c’est-à-dire de l’animation des sprites etc. De la même façon, la classe D_Background s’occupe des données relatives à l’image de fond, comme le tableau de booléens (pour indiquer le sol ou murs sur la map, 0 pour indiquer le vide), ainsi que des méthodes permettant de déterminer si un lemming donné est en présence d’un mur, dans le vide etc. La classe G_Background contient toutes les méthodes permettant de mettre à jour l’affichage de la map comme G_Remove(). Cette méthode permet de peindre par-dessus la map lorsqu’un lemming effectue une action telle que digger, miner etc...

→ Interpréteur Ce paquet gère le fichier XML donné en entrée. La classe Parser récupère tous les nœuds et attributs du fichier XML. Ainsi, les objets automates entre-autres sont créés à partir de celui-ci.

→ StateMachine

Il regroupe toutes les classes relatives au fonctionnement de l’automate et les structures qui permettent de l’implémenter :

  • StateMachine qui représente l’automate
  • StateMachineList qui est une liste d’automates
  • Etat qui est l’association d’un id, d’un nom et d’une image
  • EtatList qui gère une liste d’états
  • Transition assure la création des transitions de l’automate à partir d’un état de départ, d’un état d’arrivée, d’une condition et d’une liste d’actions, ainsi que leur gestion.
  • TransitionList régit une liste de transition
  • Action qui est une classe abstraite dont hérite toutes les autres classes qui gèrent les actions que les Lemmings peuvent effectuer
  • ActionList implémente une liste d’actions

→ Serializing

Ce package ne comprend que la classe Sauvegarde qui contient deux méthodes gérant l’enregistrement des parties : save pour la sauvegarde et load pour le chargement.

3- Hiérarchie des classes

L’organisation des classes se présente comme suit :

Orga classes.png

Nous avons défini 6 classes permettant d’implémenter l’automate qui vient d’être présenté. Les états, transitions et actions sont récupérés à partir du XML.

Un automate est composé d’un Etat courant, d’une liste d’Etat et d’une liste de transitions. Nous avons implémenté la liste des états par une ArrayList d’objets de la classe Etat, et la liste des transitions par une ArrayList d’objets de la classe Transition. Les états de l’automate sont par exemple, Walker, Floater, Climber etc…Un état est représenté par son identifiant qui est un int, son nom qui un String, et le nom du sprite correspondant. Par exemple pour l’état Walker, on aura l’image walker.gif. Une transition est composée d’un état de départ, d’un état d’arrivée et d’une condition qui est un String, et d’une liste d’Actions.


La classe Automate contient une méthode step() qui récupère toutes les transitions correspondant à l’état courant de l’automate et, pour chaque transition vérifie si les conditions sont réunies pour exécuter cette transition. Cette méthode est appelée pour chaque lemming depuis la boucle principale du jeu. En fonction de la transition exécutée la méthode step() exécute les actions correspondantes à la transition en appelant la méthode run() et met à jour l’état courant de l’automate.

Actions.png

Liens & Ressources

Téléchargement du jeu : Media:Ricommings.zip