Commit e1ba205b authored by Pierre MARQUE's avatar Pierre MARQUE

Tout fonctionne :reste réglages de difficultés et d'apparence

parent 99b6ce2a
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
* This example has been created using raylib 1.0 (www.raylib.com) * This example has been created using raylib 1.0 (www.raylib.com)
* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
* *
* Copyright (c) 2013-2020 Ramon Santamaria (@raysan5) * Copyright (c) 2013-2020 Ramon Santamaria (@raysan5
* *
********************************************************************************************/ ********************************************************************************************/
#include "raylib.h" #include "raylib.h"
...@@ -32,10 +32,10 @@ ...@@ -32,10 +32,10 @@
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------
#define NUMBER_MAX_OF_PARATROOPERS 150 #define NUMBER_MAX_OF_PARATROOPERS 150
#define NUMBER_OF_AIRCRAFTS 50 #define NUMBER_OF_AIRCRAFTS 10
#define NUMBER_OF_BULLETS 50 #define NUMBER_OF_BULLETS 25
#define NUMBER_OF_BOMBSHELLS 50 #define NUMBER_OF_BOMBSHELLS 25
#define TROOPERS_PER_PLANE 15 #define TROOPERS_PER_PLANE 5
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
...@@ -44,13 +44,20 @@ ...@@ -44,13 +44,20 @@
const int screenWidth = 1200; const int screenWidth = 1200;
const int screenHeight = 550; const int screenHeight = 550;
double shoot_rate;
static bool gameOver = false; static bool gameOver = false;
static bool pause = false; static bool pause = false;
static int score = 0; static int score = 0;
const float bulletSpeed = 10.; const float bulletSpeed = 10;
const float bombshellSpeed = 7.5; const float bombshellSpeed = 6;
float hypothenuse1;
float hypothenuse2;
double shoot_rate;
double tempsAAC;
double tempsAPC;
AntiParaCanon antiParaCanon; AntiParaCanon antiParaCanon;
AntiAircraftCanon antiAircraftCanon; AntiAircraftCanon antiAircraftCanon;
...@@ -58,10 +65,10 @@ Paratrooper paraInitial; ...@@ -58,10 +65,10 @@ Paratrooper paraInitial;
Bombshell bombshellInit; Bombshell bombshellInit;
Bullet bulletInit; Bullet bulletInit;
Aircraft aircraft[NUMBER_OF_AIRCRAFTS]; Aircraft aircraft[NUMBER_OF_AIRCRAFTS] ;
Bullet bullet[NUMBER_OF_BULLETS]; Bullet bullet[NUMBER_OF_BULLETS] ;
Bombshell bombshells[NUMBER_OF_BOMBSHELLS]; Bombshell bombshells[NUMBER_OF_BOMBSHELLS] ;
Paratrooper paratrooper[NUMBER_MAX_OF_PARATROOPERS]; Paratrooper paratrooper[NUMBER_MAX_OF_PARATROOPERS] ;
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// Program main entry point // Program main entry point
...@@ -73,32 +80,26 @@ int main(void) ...@@ -73,32 +80,26 @@ int main(void)
//-------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------
InitWindow(screenWidth, screenHeight, "raylib [core] example - basic window"); InitWindow(screenWidth, screenHeight, "Air defense");
InitGame(); InitGame();
SetTargetFPS(60); // Set our game to run at 60 frames-per-second SetTargetFPS(60); // Set our game to run at 60 frames-per-second
//-------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------
// Main game loop // Main game loop
while (!WindowShouldClose()) // Detect window close button or ESC key while (!WindowShouldClose()) // Detect window close button or ESC key
{ {
// Update // Update
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// TODO: Update your variables here // TODO: Update your variables here
// void UpdateGame(); UpdateGame();
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Draw // Draw
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
BeginDrawing(); DrawGame();
ClearBackground(SKYBLUE);
DrawText("Congrats! You created your first window!", 190, 200, 20, SKYBLUE);
EndDrawing();
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
} }
// De-Initialization // De-Initialization
//-------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------
//UnloadGame(); //UnloadGame();
...@@ -108,99 +109,51 @@ int main(void) ...@@ -108,99 +109,51 @@ int main(void)
return 0; return 0;
} }
void InitGame(void){ //-----------------------------------------------------------------------------------------
// Module Functions Definition
//-----------------------------------------------------------------------------------------
void InitGame(void)
{
//Initialize paratroopers //Initialize paratroopers
paraInitial.speed.y = -2;
paraInitial.speed.x = 0;
paraInitial.color = RED;
paraInitial.life = 2;
paraInitial.hitbox.width = 10;
paraInitial.hitbox.height = 10;
paraInitial.droped = false;
for (int k=0; k < NUMBER_MAX_OF_PARATROOPERS; k++){ for (int k=0; k < NUMBER_MAX_OF_PARATROOPERS; k++){
paratrooper[k] = paraInitial; paratrooper[k] = InitializeParatrooper();
} }
//Initialize aircrafts //Initialize aircrafts
for (int i = 0; i < NUMBER_OF_AIRCRAFTS; i++) for (int i = 0; i < NUMBER_OF_AIRCRAFTS; i++)
{ {
aircraft[i].hitbox.width = 10; aircraft[i] = InitializeAircraft();
aircraft[i].hitbox.height = GetRandomValue(30,50);
aircraft[i].numberOfParatroopers = GetRandomValue(0,TROOPERS_PER_PLANE);
if (aircraft[i].hitbox.height<41)
{
aircraft[i].hitbox.height = 30;
}
else
{
aircraft[i].hitbox.height = 50;
}
aircraft[i].hitbox.y = GetRandomValue(screenHeight/3, screenHeight - aircraft[i].hitbox.height);
if (GetRandomValue(0,1))
{
aircraft[i].position.x = -GetRandomValue(0,1000);
aircraft[i].speed.x = 5;
aircraft[i].xFirstToJump = GetRandomValue(10,screenHeight/2);
}
else
{
aircraft[i].speed.x = -5;
aircraft[i].position.x = -GetRandomValue(0,1000);
aircraft[i].xFirstToJump = GetRandomValue(screenHeight/2,screenHeight-10);
}
aircraft[i].xLastTrooperDrop = aircraft[i].xFirstToJump;
aircraft[i].speed.x = 5;
aircraft[i].speed.y = 0;
aircraft[i].color = BLACK;
} }
//Initialize bombshells and bullets //Initialize bombshells and bullets
bombshellInit.radius = 5;
bombshellInit.damageDone = 2;
bombshellInit.sin = 0;
bombshellInit.cos = 0;
bombshellInit.ammoShot = false;
bombshellInit.position.x = screenHeight;
bombshellInit.position.y = 0;
bombshellInit.speed.x = 0;
bombshellInit.speed.y = 0;
bombshellInit.color = RED;
for (int j =0; j< NUMBER_OF_BOMBSHELLS;j++){ for (int j =0; j< NUMBER_OF_BOMBSHELLS;j++){
bombshells[j] = bombshellInit; bombshells[j] = InitializeBombshell();
} }
bulletInit.radius = 1;
bulletInit.damageDone = 2;
bulletInit.sin = 0;
bulletInit.cos = 0;
bulletInit.ammoShot = false;
bulletInit.position.x = 0;
bulletInit.position.y = 0;
bulletInit.speed.x = 0;
bulletInit.speed.y = 0;
bulletInit.color = RED;
for (int j =0; j< NUMBER_OF_BULLETS; j++){ for (int j =0; j< NUMBER_OF_BULLETS; j++){
bullet[j] = bulletInit; bullet[j] = InitializeBullet();
} }
//Initialize canons //Initialize canons
antiParaCanon.sin = 0.; antiParaCanon.sin = 0.;
antiParaCanon.cos = 0.; antiParaCanon.cos = 0.;
antiParaCanon.position.x = 0.; antiParaCanon.position.x = screenWidth/4;
antiParaCanon.position.y = 0.; antiParaCanon.position.y = screenHeight;
antiParaCanon.aimingPosition.x = 0.; antiParaCanon.aimingPosition.x = 0.;
antiParaCanon.aimingPosition.y = 0.; antiParaCanon.aimingPosition.y = 0.;
antiAircraftCanon.sin = 0.; antiAircraftCanon.sin = 0.;
antiAircraftCanon.cos = 0.; antiAircraftCanon.cos = 0.;
antiAircraftCanon.position.x = screenWidth; antiAircraftCanon.position.x = screenWidth*(0.75);
antiAircraftCanon.position.y = 0.; antiAircraftCanon.position.y = screenHeight;
antiAircraftCanon.aimingPosition.x = 0.; antiAircraftCanon.aimingPosition.x = 0.;
antiAircraftCanon.aimingPosition.y = 0.; antiAircraftCanon.aimingPosition.y = 0.;
} }
void UpdateGame(void){ void UpdateGame(void)
{
if (!gameOver) if (!gameOver)
{ {
if (!pause) if (!pause)
...@@ -212,16 +165,31 @@ void UpdateGame(void){ ...@@ -212,16 +165,31 @@ void UpdateGame(void){
{ {
if(paratrooper[i].droped) if(paratrooper[i].droped)
{ {
paratrooper[i].position.x += paratrooper[i].speed.x; paratrooper[i].hitbox.x += paratrooper[i].speed.x;
paratrooper[i].position.y += paratrooper[i].speed.y; paratrooper[i].hitbox.y += paratrooper[i].speed.y;
}
if (IsRectangleOut(paratrooper[i].hitbox))
{
paratrooper[i] = InitializeParatrooper();
} }
} }
//Planes //Planes
for(int j = 0; j<NUMBER_OF_AIRCRAFTS; j++) for(int j = 0; j<NUMBER_OF_AIRCRAFTS; j++)
{ {
aircraft[j].position.x += aircraft[j].speed.x; aircraft[j].hitbox.x += aircraft[j].speed.x;
aircraft[j].position.y += aircraft[j].speed.y; aircraft[j].hitbox.y += aircraft[j].speed.y;
if (IsRectangleOut(aircraft[j].hitbox))
{
if (aircraft[j].speed.x>0 && aircraft[j].hitbox.x>screenWidth)
{
aircraft[j] = InitializeAircraft();
}
else if(aircraft[j].speed.x<0 && aircraft[j].hitbox.x<0)
{
aircraft[j] = InitializeAircraft();
}
}
} }
//Bullets //Bullets
...@@ -232,22 +200,57 @@ void UpdateGame(void){ ...@@ -232,22 +200,57 @@ void UpdateGame(void){
bullet[k].position.x += bullet[k].speed.x; bullet[k].position.x += bullet[k].speed.x;
bullet[k].position.y += bullet[k].speed.y; bullet[k].position.y += bullet[k].speed.y;
} }
if(IsCircleOut(bullet[k].position,bullet[k].radius))
{
bullet[k] = InitializeBullet();
}
}
//Bombshells
for(int k = 0; k<NUMBER_OF_BOMBSHELLS; k++)
{
if (bombshells[k].ammoShot)
{
bombshells[k].position.x += bombshells[k].speed.x;
bombshells[k].position.y += bombshells[k].speed.y;
}
if (IsCircleOut(bombshells[k].position,bombshells[k].radius))
{
bombshells[k] = InitializeBombshell();
}
} }
//Defining where the canons are shooting //Defining where the canons are shooting
float hypothenuse = sqrt(powf(GetMousePosition().x,2) + powf(GetMousePosition().y,2)); hypothenuse1 = sqrt(powf(GetMousePosition().x - antiAircraftCanon.position.x,2) + powf(GetMousePosition().y - antiAircraftCanon.position.y,2));
hypothenuse2 = sqrt(powf(GetMousePosition().x - antiParaCanon.position.x,2) + powf(GetMousePosition().y - antiParaCanon.position.y,2));
antiParaCanon.aimingPosition = GetMousePosition(); antiParaCanon.aimingPosition = GetMousePosition();
antiParaCanon.sin = (antiParaCanon.aimingPosition.y - antiParaCanon.position.y)/hypothenuse; antiParaCanon.sin = (antiParaCanon.aimingPosition.y - antiParaCanon.position.y)/hypothenuse2;
antiParaCanon.cos = (antiParaCanon.aimingPosition.x - antiParaCanon.position.x)/hypothenuse; antiParaCanon.cos = (antiParaCanon.aimingPosition.x - antiParaCanon.position.x)/hypothenuse2;
antiAircraftCanon.aimingPosition = GetMousePosition(); antiAircraftCanon.aimingPosition = GetMousePosition();
antiAircraftCanon.sin = (antiAircraftCanon.aimingPosition.y - antiAircraftCanon.position.y)/hypothenuse; antiAircraftCanon.sin = (antiAircraftCanon.aimingPosition.y - antiAircraftCanon.position.y)/hypothenuse1;
antiAircraftCanon.cos = (antiAircraftCanon.aimingPosition.x - antiAircraftCanon.position.x)/hypothenuse; antiAircraftCanon.cos = (antiAircraftCanon.aimingPosition.x - antiAircraftCanon.position.x)/hypothenuse1;
//Shooting //Shooting
//anti-aircrafts canon ((double) tempsAAC/CLOCKS_PER_SEC))<(shoot_rate)
if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON))
{
for (int i = 0; i<NUMBER_OF_BOMBSHELLS; i++)
{
if (!bombshells[i].ammoShot)
{
bombshells[i].ammoShot = true;
bombshells[i].position.x = antiAircraftCanon.position.x;
bombshells[i].position.y = antiAircraftCanon.position.y;
bombshells[i].speed.x = bombshellSpeed*antiAircraftCanon.cos;
bombshells[i].speed.y = bombshellSpeed*antiAircraftCanon.sin;
break;
}
}
}
// anti-Paratroopers canon // anti-Paratroopers canon
if (IsMouseButtonPressed(MOUSE_RIGHT_BUTTON)) if (IsMouseButtonPressed(MOUSE_RIGHT_BUTTON) )
{ {
for (int i = 0; i<NUMBER_OF_BULLETS; i++) for (int i = 0; i<NUMBER_OF_BULLETS; i++)
{ {
...@@ -262,24 +265,235 @@ void UpdateGame(void){ ...@@ -262,24 +265,235 @@ void UpdateGame(void){
} }
} }
} }
//anti-aircrafts canon //Destructions
if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) //Paratroopers
for (int i = 0; i<NUMBER_MAX_OF_PARATROOPERS; i++)
{ {
for (int i = 0; i<NUMBER_OF_BOMBSHELLS; i++) if(paratrooper[i].droped)
{ {
if (!bullet[i].ammoShot) for (int j = 0; j<NUMBER_OF_BULLETS; j++)
{ {
bombshells[i].ammoShot = true; if(CheckCollisionCircleRec(bullet[j].position, bullet[j].radius, paratrooper[i].hitbox))
bombshells[i].position.x = antiAircraftCanon.position.x; {
bombshells[i].position.y = antiAircraftCanon.position.y; bullet[j].ammoShot = false;
bombshells[i].speed.x = bulletSpeed*antiAircraftCanon.cos; paratrooper[i].life--;
bombshells[i].speed.y = bulletSpeed*antiAircraftCanon.sin; //Kill paras
break; if(paratrooper[i].life == 0)
{
paratrooper[i] = InitializeParatrooper();
}
}
}
}
}
//Planes
for (int i = 0; i<NUMBER_OF_AIRCRAFTS; i++)
{
if((aircraft[i].hitbox.x > 0) && (aircraft[i].hitbox.x < screenWidth))
{
for (int j = 0; j<NUMBER_OF_BOMBSHELLS; j++)
{
if(CheckCollisionCircleRec(bombshells[j].position, bombshells[j].radius, aircraft[i].hitbox))
{
bombshells[j].ammoShot = false;
aircraft[i].life = aircraft[i].life - 1;
//Kill aircrafts
if(aircraft[i].life == 0){
aircraft[i] = InitializeAircraft();
}
}
} }
//Dropping paratroopers
if (aircraft[i].speed.x>0)
{
if (aircraft[i].hitbox.x > aircraft[i].xFirstToJump)
{
for(int j = 0; j<NUMBER_MAX_OF_PARATROOPERS; j++)
{
if ((!paratrooper[j].droped) && (aircraft[i].hitbox.x > aircraft[i].xFirstToJump + 50) && (aircraft[i].numberOfParatroopers > -1))
{
paratrooper[j].droped = true;
paratrooper[j].hitbox.x = aircraft[i].hitbox.x;
paratrooper[j].hitbox.y = aircraft[i].hitbox.y;
aircraft[i].numberOfParatroopers--;
aircraft[i].xFirstToJump = aircraft[i].hitbox.x;
}
}
}
}
else
{
if (aircraft[i].hitbox.x < aircraft[i].xFirstToJump)
{
for(int j = 0; j<NUMBER_MAX_OF_PARATROOPERS; j++)
{
if ((!paratrooper[j].droped) && (aircraft[i].hitbox.x < aircraft[i].xFirstToJump - 50) && (aircraft[i].numberOfParatroopers > -1))
{
paratrooper[j].droped = true;
paratrooper[j].hitbox.x = aircraft[i].hitbox.x;
paratrooper[j].hitbox.y = aircraft[i].hitbox.y;
aircraft[i].numberOfParatroopers--;
aircraft[i].xFirstToJump = aircraft[i].hitbox.x;
}
}
}
}
}
}
}
}
}
void DrawGame(void)
{
BeginDrawing();
ClearBackground(SKYBLUE);
if (!gameOver)
{
//Draw planes
for (int i = 0; i<NUMBER_OF_AIRCRAFTS; i++)
{
DrawRectangleRec(aircraft[i].hitbox, aircraft[i].color);
}
//Draw paratroopers
for (int i = 0; i<NUMBER_MAX_OF_PARATROOPERS; i++)
{
if (paratrooper[i].droped)
{
DrawRectangleRec(paratrooper[i].hitbox, paratrooper[i].color);
}
}
//Draw bullets
for (int i = 0; i<NUMBER_OF_BULLETS; i++)
{
if (bullet[i].ammoShot)
{
DrawCircleV(bullet[i].position, bullet[i].radius, bullet[i].color);
} }
} }
//Draw bombshells
for (int i = 0; i<NUMBER_OF_BOMBSHELLS; i++)
{
if (bombshells[i].ammoShot)
{
DrawCircleV(bombshells[i].position, bombshells[i].radius,bombshells[i].color);
}
}
//Draw viewfinder
DrawCircleV(GetMousePosition(),5, RED);
} }
EndDrawing();
}
//------------------------------------------------------------------------------------
// Other Functions
//------------------------------------------------------------------------------------
//Initialization functions------------------------------------------------------------
Aircraft InitializeAircraft(void)
{
Aircraft aircraft;
aircraft.life = 2;
aircraft.hitbox.width = GetRandomValue(30,50);
aircraft.hitbox.height = 5;
aircraft.numberOfParatroopers = GetRandomValue(0,TROOPERS_PER_PLANE);
if (aircraft.hitbox.width<41)
{
aircraft.hitbox.width = 30;
}
else
{
aircraft.hitbox.width = 50;
}
aircraft.hitbox.y = GetRandomValue(0 + aircraft.hitbox.height, screenHeight/2);
if (GetRandomValue(0,1)==0)
{
aircraft.hitbox.x = -GetRandomValue(0,300);
aircraft.speed.x = 0.5+ 0.5*((float) GetRandomValue(0,1));
aircraft.xFirstToJump = GetRandomValue(10,screenWidth/2);
}
else
{
aircraft.speed.x = -(0.5+ 0.5*((float) GetRandomValue(0,1)));
aircraft.hitbox.x = GetRandomValue(screenWidth,screenWidth+300);
aircraft.xFirstToJump = GetRandomValue(screenWidth/2,screenWidth-10);
}
aircraft.speed.y = 0;
aircraft.color = GRAY;
return aircraft;
}
Bombshell InitializeBombshell(void)
{
Bombshell bombshellInit;
bombshellInit.radius = 7;
bombshellInit.sin = 0;
bombshellInit.cos = 0;
bombshellInit.ammoShot = false;
bombshellInit.position.x = screenHeight;
bombshellInit.position.y = 0;
bombshellInit.speed.x = 0;
bombshellInit.speed.y = 0;
bombshellInit.color = RED;
return bombshellInit;
}
Bullet InitializeBullet(void)
{
Bullet bulletInit;
bulletInit.radius = 3;
bulletInit.sin = 0;
bulletInit.cos = 0;
bulletInit.ammoShot = false;
bulletInit.position.x = 0;
bulletInit.position.y = screenWidth;
bulletInit.speed.x = 0;
bulletInit.speed.y = 0;
bulletInit.color = RED;
return bulletInit;
}
Paratrooper InitializeParatrooper(void)
{
Paratrooper paraInitial;
paraInitial.speed.y = 0.7;
paraInitial.speed.x = 0;
paraInitial.color = RED;
paraInitial.life = 2;
paraInitial.hitbox.width = 10;
paraInitial.hitbox.height = 10;
paraInitial.droped = false;
return paraInitial;
}
//Game Functions-------------------------------------------------------------------------
bool IsRectangleOut(Rectangle rec)
{
if(rec.x<0 || rec.x>screenWidth)
{
return true;
} }
if(rec.y<0 || rec.y>screenHeight)
{
return true;
}
return false;
} }
void DrawGame(void){} bool IsCircleOut(Vector2 center, float radius)
{
if(center.x + radius<0 || center.x - radius >screenWidth)
{
return true;
}
if(center.y + radius < 0 || center.y - radius>screenHeight)
{
return true;
}
return false;
}
No preview for this file type
...@@ -8,7 +8,6 @@ typedef struct Paratrooper ...@@ -8,7 +8,6 @@ typedef struct Paratrooper
int life; int life;
bool droped; bool droped;
Rectangle hitbox; Rectangle hitbox;
Vector2 position;
Vector2 speed; Vector2 speed;
Color color; // yellow or red Color color; // yellow or red
}Paratrooper; }Paratrooper;
...@@ -17,10 +16,8 @@ typedef struct Aircraft ...@@ -17,10 +16,8 @@ typedef struct Aircraft
{ {
int life; int life;
float xFirstToJump; float xFirstToJump;
float xLastTrooperDrop;
int numberOfParatroopers; int numberOfParatroopers;
Rectangle hitbox; Rectangle hitbox;
Vector2 position;
Vector2 speed; Vector2 speed;
Color color; //black Color color; //black
}Aircraft; }Aircraft;
...@@ -28,7 +25,6 @@ typedef struct Aircraft ...@@ -28,7 +25,6 @@ typedef struct Aircraft
typedef struct Bombshell typedef struct Bombshell
{ {
float radius; float radius;
int damageDone;
float sin; float sin;
float cos; float cos;
bool ammoShot; bool ammoShot;
...@@ -67,12 +63,24 @@ typedef struct AntiParaCanon ...@@ -67,12 +63,24 @@ typedef struct AntiParaCanon
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
// Module Functions Declaration (local) // Module Functions Declaration
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------
static void InitGame(void); // Initialize game static void InitGame(void); // Initialize game
static void UpdateGame(); // Update game (one frame) static void UpdateGame(); // Update game (one frame)
static void DrawGame(void); // Draw game (one frame) static void DrawGame(void); // Draw game (one frame)
static void UnloadGame(void); // Unload game static void UnloadGame(void); // Unload game
void IsParaAlive(void); //------------------------------------------------------------------------------------
// Other Functions
//------------------------------------------------------------------------------------
//Initialization functions------------------------------------------------------------
Aircraft InitializeAircraft(void);
Bombshell InitializeBombshell(void);
Bullet InitializeBullet(void);
Paratrooper InitializeParatrooper(void);
//Game functions----------------------------------------------------------------------
bool IsRectangleOut(Rectangle rec);
bool IsCircleOut(Vector2 center, float radius);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment