Skip to content
Snippets Groups Projects
Commit 4bf741ec authored by Marie Brunet-Carteaux's avatar Marie Brunet-Carteaux
Browse files
parents 614952ed 26cef1fe
No related branches found
No related tags found
No related merge requests found
Pipeline #
Fichier decrivant le deroulement de la procedure d'aquisition des classes
I) Chargement du fichier XML - Definition des noeuds
Le fichier contient 5 classes
II) Chargement des classes
1) Memoire allouee avec succes
La memoire allouee fait 80 octets
Chargement de la classe numero 1
Id : C_MAGE
Nom : Mage
PV : 100
PM : 150
MV : 2
DESC : Le feu, ça brûle
Insertion de la classe 1 dans le tableau
Chargement de la classe numero 2
Id : C_WAR
Nom : Guerrier
PV : 200
PM : 150
MV : 2
DESC : Aime beaucoup le street art
Insertion de la classe 2 dans le tableau
Chargement de la classe numero 3
Id : C_HEAL
Nom : Guerrisseur
PV : 100
PM : 150
MV : 2
DESC : Heal est des notres
Insertion de la classe 3 dans le tableau
Chargement de la classe numero 4
Id : C_ROGUE
Nom : Voleur
PV : 100
PM : 150
MV : 2
DESC : 60 minutes, ça vaut l'heure
Insertion de la classe 4 dans le tableau
Chargement de la classe numero 5
Id : C_ARCHER
Nom : Archer
PV : 100
PM : 150
MV : 2
DESC : Gérard, de son prénom
Insertion de la classe 5 dans le tableau
#include <stdlib.h> #include <stdlib.h>
#include <SDL/SDL.h> #include <SDL/SDL.h>
#include "structures.h"
#define LARGEUR_CARTE 16 #include "partie.h"
#define HAUTEUR_CARTE 10 #include "joueur.h"
#define LARGEUR_CASE 53 #include "joueurList.h"
#define HAUTEUR_CASE 71 #include "personnage.h"
#define NB_PERSO 1 #include "case.h"
#include "deplacements.h"
#include "SDL.h"
#include "controleurSDL.h"
/*! /*!
* \file SDL.c * \file SDL.c
* \brief Fichier contenant le code des fonctions liees l'affichage par la SDL. * \brief Fichier contenant le code des fonctions liees l'affichage par la SDL.
*/ */
int main_SDL() int main_SDL()
{ {
int i; int i,j;
int j;
SDL_Event event;
SDL_Surface* ecran=NULL; SDL_Surface* ecran=NULL;
SDL_Event event;
SDL_Surface* perso[NB_PERSO]={NULL}; SDL_Surface* perso[NB_PERSO]={NULL};
SDL_Surface* Case=NULL; SDL_Surface* Case=NULL;
SDL_Rect Position_Case[LARGEUR_CARTE*HAUTEUR_CARTE]; SDL_Rect Position_Case[LARGEUR_CARTE*HAUTEUR_CARTE];
...@@ -29,15 +32,15 @@ int main_SDL() ...@@ -29,15 +32,15 @@ int main_SDL()
printf( "Unable to init SDL: %s\n", SDL_GetError() ); printf( "Unable to init SDL: %s\n", SDL_GetError() );
return 1; return 1;
} }
ecran = SDL_SetVideoMode(LARGEUR_CARTE*(LARGEUR_CASE+1), HAUTEUR_CARTE*(HAUTEUR_CASE+2), 32, SDL_HWSURFACE|SDL_DOUBLEBUF); ecran = SDL_SetVideoMode(LARGEUR_CARTE*(LARGEUR_CASE+1), HAUTEUR_CARTE*(HAUTEUR_CASE+2), 32, SDL_HWSURFACE|SDL_DOUBLEBUF);
if (ecran == NULL) // Si l'ouverture a chou, on le note et on arrte if (ecran == NULL) // Si l'ouverture a chou, on le note et on arrte
{ {
fprintf(stderr, "Impossible de charger le mode vido : %s\n", SDL_GetError()); fprintf(stderr, "Impossible de charger le mode vido : %s\n", SDL_GetError());
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
SDL_WM_SetCaption("Elder Internal Ignition",NULL);
SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0)); SDL_WM_SetCaption("Elder Internal Ignition",NULL);
perso[0] = SDL_LoadBMP("../resources/personnage.bmp"); perso[0] = SDL_LoadBMP("../resources/personnage.bmp");
if (!perso[0]) if (!perso[0])
...@@ -58,19 +61,21 @@ int main_SDL() ...@@ -58,19 +61,21 @@ int main_SDL()
{ {
for(j=0;j<HAUTEUR_CARTE;j++) for(j=0;j<HAUTEUR_CARTE;j++)
{ {
Position_Case[i*HAUTEUR_CARTE+j].x=LARGEUR_CASE*i; Position_Case[j*LARGEUR_CARTE+i].x=LARGEUR_CASE*i;
Position_Case[i*HAUTEUR_CARTE+j].y=HAUTEUR_CASE*j; Position_Case[j*LARGEUR_CARTE+i].y=HAUTEUR_CASE*j;
} }
} }
for(i=1;i<LARGEUR_CARTE;i+=2) for(i=1;i<LARGEUR_CARTE;i+=2)
{ {
for(j=0;j<HAUTEUR_CARTE;j++) for(j=0;j<HAUTEUR_CARTE;j++)
{ {
Position_Case[i*HAUTEUR_CARTE+j].x=LARGEUR_CASE*i; Position_Case[j*LARGEUR_CARTE+i].x=LARGEUR_CASE*i;
Position_Case[i*HAUTEUR_CARTE+j].y=HAUTEUR_CASE*j+(HAUTEUR_CASE/2); Position_Case[j*LARGEUR_CARTE+i].y=HAUTEUR_CASE*j+(HAUTEUR_CASE/2);
} }
} }
Position_Perso[0]=Position_Case[0];
init_controleur(Position_Case);
while(quitter==0) while(quitter==0)
{ {
SDL_WaitEvent(&event); SDL_WaitEvent(&event);
...@@ -79,36 +84,11 @@ int main_SDL() ...@@ -79,36 +84,11 @@ int main_SDL()
case SDL_QUIT: /* Si c'est un vnement de type "Quitter" */ case SDL_QUIT: /* Si c'est un vnement de type "Quitter" */
quitter=1; quitter=1;
break; break;
case SDL_MOUSEBUTTONDOWN:
deplacement_personnage(0,event.button.x,event.button.y);
break;
case SDL_KEYDOWN:/* Si c'est un vnement de type "touche presse" */ case SDL_KEYDOWN:/* Si c'est un vnement de type "touche presse" */
switch(event.key.keysym.sym){ switch(event.key.keysym.sym){
case SDLK_KP7:
if(Position_Perso[0].y>0&&Position_Perso[0].x>0)
{Position_Perso[0].y-=HAUTEUR_CASE/2;
Position_Perso[0].x-=LARGEUR_CASE;}
break;
case SDLK_KP8:
if(Position_Perso[0].y>0)
Position_Perso[0].y-=HAUTEUR_CASE;
break;
case SDLK_KP9:
if((Position_Perso[0].y>0)&&(Position_Perso[0].x<LARGEUR_CASE*(LARGEUR_CARTE-1)))
{Position_Perso[0].y-=HAUTEUR_CASE/2;
Position_Perso[0].x+=LARGEUR_CASE;}
break;
case SDLK_KP1:
if(Position_Perso[0].y<HAUTEUR_CASE*(HAUTEUR_CARTE-1)&&Position_Perso[0].x>0)
{Position_Perso[0].y+=HAUTEUR_CASE/2;
Position_Perso[0].x-=LARGEUR_CASE;}
break;
case SDLK_KP2:
if(Position_Perso[0].y<HAUTEUR_CASE*(HAUTEUR_CARTE-1))
Position_Perso[0].y+=HAUTEUR_CASE;
break;
case SDLK_KP3:
if(Position_Perso[0].y<HAUTEUR_CASE*(HAUTEUR_CARTE-1)&&Position_Perso[0].x<LARGEUR_CASE*(LARGEUR_CARTE-1))
{Position_Perso[0].y+=HAUTEUR_CASE/2;
Position_Perso[0].x+=LARGEUR_CASE;}
break;
case SDLK_ESCAPE: case SDLK_ESCAPE:
quitter=1; quitter=1;
break; break;
...@@ -117,6 +97,8 @@ int main_SDL() ...@@ -117,6 +97,8 @@ int main_SDL()
} }
break; break;
} }
Position_Perso[0].x=get_position_perso_x(0);
Position_Perso[0].y=get_position_perso_y(0);
SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0)); SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));
for(i=0;i<LARGEUR_CARTE*HAUTEUR_CARTE;i++) for(i=0;i<LARGEUR_CARTE*HAUTEUR_CARTE;i++)
{ {
...@@ -133,188 +115,3 @@ int main_SDL() ...@@ -133,188 +115,3 @@ int main_SDL()
} }
int main_Open_Classrooms ()
{
int i;
SDL_Event event;
int continuer=0;
SDL_Surface* ecran=NULL;
SDL_Surface* rectangle=NULL;
SDL_Surface* image=NULL;
SDL_Rect position_image;
SDL_Rect position[256];
for(i=0;i<256;i++)
{
position[i].x=0;
position[i].y=i;
}
SDL_Surface* degrade[256]={NULL};
// initialize SDL video
if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
printf( "Unable to init SDL: %s\n", SDL_GetError() );
return 1;
}
// create a new window
ecran = SDL_SetVideoMode(800, 256, 16,SDL_HWSURFACE|SDL_DOUBLEBUF);
if (ecran == NULL) // Si l'ouverture a chou, on le note et on arrte
{
fprintf(stderr, "Impossible de charger le mode vido : %s\n", SDL_GetError());
exit(EXIT_FAILURE);
}
SDL_WM_SetCaption("fenetre de test",NULL);
SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,200,89,3));
SDL_Flip(ecran);
while(continuer==0)
{
SDL_WaitEvent(&event);
switch(event.type) /* Test du type d'vnement */
{
case SDL_QUIT: /* Si c'est un vnement de type "Quitter" */
SDL_Quit();
exit(0);
break;
case SDL_KEYDOWN:
continuer=1;
break;
}
}
continuer=0;
rectangle = SDL_CreateRGBSurface(SDL_HWSURFACE,400,256,16,0,0,0,0);
SDL_FillRect(rectangle,NULL,SDL_MapRGB(ecran->format,0,127,255));
SDL_BlitSurface(rectangle,NULL,ecran,&position[0]);
SDL_Flip(ecran);
while(continuer==0)
{
SDL_WaitEvent(&event);
switch(event.type) /* Test du type d'vnement */
{
case SDL_QUIT: /* Si c'est un vnement de type "Quitter" */
SDL_FreeSurface(rectangle);
SDL_Quit();
exit(0);
break;
case SDL_KEYDOWN:
continuer=1;
break;
}
}
continuer=0;
for(i=0;i<256;i++)
{
degrade[i]=SDL_CreateRGBSurface(SDL_HWSURFACE,800,1,16,0,0,0,0);
SDL_FillRect(degrade[i],NULL,SDL_MapRGB(ecran->format,i,i,i));
}
for(i=0;i<256;i++)
{
SDL_BlitSurface(degrade[i],NULL,ecran,&position[i]);
}
SDL_Flip(ecran);
while(continuer==0)
{
SDL_WaitEvent(&event);
switch(event.type) /* Test du type d'vnement */
{
case SDL_QUIT: /* Si c'est un vnement de type "Quitter" */
for(i=0;i<256;i++)
{
SDL_FreeSurface(degrade[i]);
}
SDL_FreeSurface(rectangle);
SDL_Quit();
exit(0);
break;
case SDL_KEYDOWN:
continuer=1;
break;
}
}
continuer=0;
for(i=0;i<256;i++)
{
SDL_FreeSurface(degrade[i]);
}
SDL_FreeSurface(rectangle);
// load an image
image = SDL_LoadBMP("montagnes1.bmp");
if (!image)
{
printf("Unable to load bitmap: %s\n", SDL_GetError());
return 1;
}
SDL_BlitSurface(image,NULL,ecran,&position[0]);
SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,120,250,120));
position_image=position[0];
SDL_Flip(ecran);
SDL_EnableKeyRepeat(10, 10);
while(1)
{
SDL_WaitEvent(&event);
switch(event.type) /* Test du type d'vnement */
{
case SDL_QUIT: /* Si c'est un vnement de type "Quitter" */
SDL_FreeSurface(image);
SDL_Quit();
exit(0);
break;
case SDL_MOUSEBUTTONDOWN:
position_image.x=event.button.x;
position_image.y=event.button.y;
break;
case SDL_KEYDOWN:/* Si c'est un vnement de type "touche presse" */
switch(event.key.keysym.sym){
case SDLK_UP:
if(position_image.y>0)
position_image.y--;
break;
case SDLK_DOWN:
if(position_image.y<256)
position_image.y++;
break;
case SDLK_LEFT:
if(position_image.x>0)
position_image.x--;
break;
case SDLK_RIGHT:
if(position_image.x<800)
position_image.x++;
break;
case SDLK_ESCAPE:
SDL_FreeSurface(image);
SDL_Quit();
exit(0);
break;
default:
;
}
break;
}
SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,120,250,120));
SDL_BlitSurface(image,NULL,ecran,&position_image);
SDL_Flip(ecran);
}
return 0;
}
/*! /*!
* \file AffichageConsole.h * \file SDL.h
* \brief Fichier contenant les signatures des fonctions liees a l'affichage par SDL. * \brief Fichier contenant les signatures des fonctions liees a l'affichage par SDL.
*/ */
...@@ -7,7 +7,13 @@ ...@@ -7,7 +7,13 @@
#ifndef SDL_H_INCLUDED #ifndef SDL_H_INCLUDED
#define SDL_H_INCLUDED #define SDL_H_INCLUDED
#define LARGEUR_CARTE 16
#define HAUTEUR_CARTE 10
#define LARGEUR_CASE 53
#define HAUTEUR_CASE 71
#define NB_PERSO 1
int main_SDL(); int main_SDL();
int main_Open_Classrooms ();
#endif #endif
Fichier decrivant le deroulement de la procedure d'aquisition des Terrains
I) Chargement du fichier Terrains XML - Definition des noeuds
Le fichier contient 4 terrains
II) Chargement des terrains
1) Memoire allouee avec succes
La memoire allouee fait 64 octets
Chargement du terrain numero 1
Id : G_PLAIN
Nom : Plaine
FR : 1
FRS : 1
PDR : 1
DESC : Plaine de bon sens
Insertion du terrain 1 dans le tableau
Chargement du terrain numero 2
Id : G_RIVER
Nom : Riviere
FR : 0
FRS : 1
PDR : 1
DESC : River, arrete de river
Insertion du terrain 2 dans le tableau
Chargement du terrain numero 3
Id : G_FOREST
Nom : Foret
FR : 1
FRS : 1
PDR : 2
DESC : Le frère de Fopart
Insertion du terrain 3 dans le tableau
Chargement du terrain numero 4
Id : G_MOUNT
Nom : Montagne
FR : 0
FRS : 0
PDR : 0
DESC : Montagne est plus haut que tontagne
Insertion du terrain 4 dans le tableau
#ifndef AFFICHAGE_H_INCLUDED
#define AFFICHAGE_H_INCLUDED
#endif // AFFICHAGE_H_INCLUDED
...@@ -75,6 +75,7 @@ int init_carte(Carte* c,unsigned short int largeur, unsigned short int hauteur){ ...@@ -75,6 +75,7 @@ int init_carte(Carte* c,unsigned short int largeur, unsigned short int hauteur){
* \param Les coordonnees a tester * \param Les coordonnees a tester
* \return Un pointeur vers la Case qui possede les coordonnees en entree, NULL s'il n'y a pas de Case avec ces coordonnees. * \return Un pointeur vers la Case qui possede les coordonnees en entree, NULL s'il n'y a pas de Case avec ces coordonnees.
*/ */
/*
Case * trouverCase(Carte * c, int x, int y){ Case * trouverCase(Carte * c, int x, int y){
if((x<0)||(x>=LARG_MAX_CARTE)){ if((x<0)||(x>=LARG_MAX_CARTE)){
return NULL; return NULL;
...@@ -85,4 +86,4 @@ Case * trouverCase(Carte * c, int x, int y){ ...@@ -85,4 +86,4 @@ Case * trouverCase(Carte * c, int x, int y){
else{ else{
return c[(x*LARG_MAX_CARTE)+y]; return c[(x*LARG_MAX_CARTE)+y];
} }
} } */
...@@ -36,7 +36,7 @@ Terrain* get_terrain(Case *c); ...@@ -36,7 +36,7 @@ Terrain* get_terrain(Case *c);
int init_carte(Carte* c,unsigned short int largeur, unsigned short int hauteur); int init_carte(Carte* c,unsigned short int largeur, unsigned short int hauteur);
Case * trouverCase(Carte * c, int x, int y); /*Case * trouverCase(Carte * c, int x, int y);*/
#endif #endif
......
#include <stdlib.h>
#include <SDL/SDL.h>
#include "structures.h"
#include "partie.h"
#include "joueur.h"
#include "joueurList.h"
#include "personnage.h"
#include "case.h"
#include "deplacements.h"
#include "SDL.h"
#include "controleurSDL.h"
/*!
* \file controleurSDL.c
* \brief Fichier contenant le code des fonctions du controleur pour l'affichage avec SDL
*/
Carte Carte_actuelle;
Personnage ListePersos[NB_PERSO];
void init_controleur(SDL_Rect Position_Case[])
{
int i;
for(i=0;i<LARGEUR_CARTE*HAUTEUR_CARTE;i++)
{
init_case(&Carte_actuelle[i],Position_Case[i].x,Position_Case[i].y,NULL);
}
init_personnage(&ListePersos[0],NULL,&Carte_actuelle[0]);
}
int x_case_cliquee(int x_pixel, int y_pixel)
{
return x_pixel/LARGEUR_CASE;
}
int y_case_cliquee(int x_pixel, int y_pixel)
{
int i, x_case, y_case;
x_case = x_pixel/LARGEUR_CASE;
y_case = y_pixel/HAUTEUR_CASE;
for(i=1;i<LARGEUR_CARTE;i+=2)
{
if(x_case==i)
{
y_case=(y_pixel-HAUTEUR_CASE/2)/HAUTEUR_CASE;
}
}
return y_case;
}
Case * trouverCase(Carte c, int x, int y)
{
if((x<0)||(x>=LARGEUR_CARTE)){
return NULL;
}
else if((y<0)||(y>=HAUTEUR_CARTE)){
return NULL;
}
else{
return &c[(y*LARGEUR_CARTE)+x];
}
}
void deplacement_personnage(int num, int x, int y)
{
if(x<LARGEUR_CARTE*LARGEUR_CASE&&y<HAUTEUR_CARTE*HAUTEUR_CASE)
{
Case* case_cliquee = trouverCase(Carte_actuelle,x_case_cliquee(x,y),y_case_cliquee(x,y));
Personnage* perso = &ListePersos[num];
if (case_a_cote(perso,case_cliquee,HAUTEUR_CASE,LARGEUR_CASE)==vrai)
{
deplacer_personnage(perso, case_cliquee);
}
}
}
Case* get_case_perso(int num)
{
Personnage* perso = &ListePersos[num];
return getPosition(perso);
}
int get_position_perso_x(int num)
{
Case* case_perso = get_case_perso(num);
return get_x(case_perso);
}
int get_position_perso_y(int num)
{
Case* case_perso = get_case_perso(num);
return get_y(case_perso);
}
/*!
* \file controleurSDL.h
* \brief Fichier contenant les signatures des fonctions du controleur pour l'affichage avec SDL.
*/
#ifndef CONTROLEUR_SDL_H_INCLUDED
#define CONTROLEUR_SDL_H_INCLUDED
int y_case_cliquee(int x_pixel, int y_pixel);
int x_case_cliquee(int x_pixel, int y_pixel);
Case * trouverCase(Carte c, int x, int y);
void deplacement_personnage(int num, int x, int y);
Case* get_case_perso(int num);
int get_position_perso_x(int num);
int get_position_perso_y(int num);
void init_controleur();
#endif
...@@ -10,18 +10,18 @@ ...@@ -10,18 +10,18 @@
* \brief Fichier contenant le code des fonctions liees aux déplacements des personnages. * \brief Fichier contenant le code des fonctions liees aux déplacements des personnages.
*/ */
boolean case_a_cote(Personnage * perso, Case * destination){ /* vérifie que la case hexagonale "destination" est contigue à la case du personnage */ boolean case_a_cote(Personnage * perso, Case * destination,int hauteur_case , int largeur_case){ /* vérifie que la case hexagonale "destination" est contigue à la case du personnage */
Case *depart = getPosition(perso); Case *depart = getPosition(perso);
if (get_x(depart)>get_x(destination)+1||get_x(depart)<get_x(destination)-1||get_y(depart)>get_y(destination)+1||get_y(depart)>get_y(destination)-1){ if (get_x(depart)>get_x(destination)+largeur_case||get_x(depart)<get_x(destination)-largeur_case||get_y(depart)>get_y(destination)+hauteur_case||get_y(depart)<get_y(destination)-hauteur_case){
return faux; return faux;
} }
if (get_y(depart)==get_y(destination)+1&&get_x(depart)!=get_x(destination)){ if (get_y(depart)==get_y(destination)+hauteur_case&&get_x(depart)!=get_x(destination)){
return faux; return faux;
} }
return vrai; return vrai;
} }
int deplacement_unitaire(Personnage *perso,Case * destination){ /*déplace un personnage sur une case située à côté de la sienne, si cela est possible */ int deplacement_unitaire(Personnage *perso,Case * destination, int hauteur_case , int largeur_case){ /*déplace un personnage sur une case située à côté de la sienne, si cela est possible */
if (est_occupee(destination)){ if (est_occupee(destination)){
printf("déplacement impossible : case déjà occupée par un personnage"); printf("déplacement impossible : case déjà occupée par un personnage");
return 1; return 1;
...@@ -30,7 +30,7 @@ int deplacement_unitaire(Personnage *perso,Case * destination){ /*d ...@@ -30,7 +30,7 @@ int deplacement_unitaire(Personnage *perso,Case * destination){ /*d
printf("déplacement impossible : case infranchissable"); printf("déplacement impossible : case infranchissable");
return 1; return 1;
} }
if (case_a_cote(perso,destination)==vrai){ if (case_a_cote(perso,destination, hauteur_case, largeur_case)==vrai){
return deplacer_personnage(perso, destination); return deplacer_personnage(perso, destination);
} }
printf("déplacement impossible : case non contigue"); printf("déplacement impossible : case non contigue");
......
...@@ -6,9 +6,9 @@ ...@@ -6,9 +6,9 @@
#ifndef DEPLACEMENTS_H_INCLUDED #ifndef DEPLACEMENTS_H_INCLUDED
#define DEPLACEMENTS_H_INCLUDED #define DEPLACEMENTS_H_INCLUDED
boolean case_a_cote(Personnage *perso,Case *destination); boolean case_a_cote(Personnage *perso,Case *destination,int hauteur_case, int largeur_case);
int deplacement_unitaire(Personnage *perso,Case *destination); int deplacement_unitaire(Personnage *perso,Case * destination, int hauteur_case , int largeur_case);
#endif #endif
...@@ -67,7 +67,7 @@ int main() ...@@ -67,7 +67,7 @@ int main()
init_jeu("../resources/Init_jeu.xml"); init_jeu("../resources/Init_jeu.xml");
main_SDL(); main_SDL();
......
...@@ -12,9 +12,11 @@ ...@@ -12,9 +12,11 @@
Personnage* init_personnage(Personnage *perso, Classe *c, Case *casedepart){ Personnage* init_personnage(Personnage *perso, Classe *c, Case *casedepart){
perso->classe=c; perso->classe=c;
perso->points_deplacement=c->points_deplacement_max; if(c!=NULL){
perso->PV=c->PV_max; perso->points_deplacement=c->points_deplacement_max;
perso->mana=c->mana_max; perso->PV=c->PV_max;
perso->mana=c->mana_max;
}
perso->position=casedepart; perso->position=casedepart;
marquer_occupee(casedepart); marquer_occupee(casedepart);
return perso; return perso;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment