Bibi/src/game.c
2021-06-04 16:45:48 +02:00

1182 lines
34 KiB
C

/*
* game.c
*
* Created on: 15 mars 2010
* Author: reveille
*/
#include <assert.h>
#include <time.h>
#include "../include/game.h"
#include "../include/game_time.h"
#include "../include/misc.h"
#include "../include/player.h"
#include "../include/bomb.h"
#include "../include/monsters.h"
#include "../include/flamme.h"
static struct s_game the_game;
#ifdef SOUND_FMOD_ACTIVATED
static FSOUND_SAMPLE *bomb_explose;
#elif defined(SOUND_SDL_ACTIVATED)
static Mix_Chunk *bomb_explose;
#endif //SOUND_FMOD_ACTIVATED
t_game game_new(int nb_joueur, int niveau, int mode, int kill_bomb) {
game_time_init();
FILE *level;
if (mode==1){
if (nb_joueur==1)
level=fopen(SRC_LEVELS_1_PLAYER,"r");
else
level=fopen(SRC_LEVELS_2_PLAYERS,"r");
}
else{
level=fopen(SRC_LEVELS_EDITOR,"r");
}
the_game.map = map_load_dynamic(level,niveau,nb_joueur);
the_game.player1 = player_init(2,1,1,1);
player_from_map(the_game.player1, the_game.map);
the_game.player2 = NULL;
if (nb_joueur==2){
the_game.player2 = player_init(2,1,1,2);
player2_from_map(the_game.player2, the_game.map);
}
the_game.kill_bomb=kill_bomb;
the_game.list_bombs=NULL;
the_game.nb_joueur=nb_joueur;
the_game.list_flammes=NULL;
the_game.list_monsters=NULL;
#ifdef SOUND_FMOD_ACTIVATED
bomb_explose = FSOUND_Sample_Load(FSOUND_FREE, "audio/bomb.wav", 0, 0, 0);
#elif defined(SOUND_SDL_ACTIVATED)
bomb_explose = Mix_LoadWAV("audio/bomb.wav");
#endif //SOUND_FMOD_ACTIVATED
return &the_game;
}
void game_free(t_game game) {
assert(game);
t_bomb temp_bomb= game->list_bombs;
t_monster temp_monster= game->list_monsters;
t_flamme temp_flamme= game->list_flammes;
player_free(game->player1);
if (game->nb_joueur == 2)
player_free(game->player2);
map_free(game->map);
while(temp_bomb != NULL)
{
t_bomb tmp=temp_bomb;
temp_bomb = get_next_bomb(temp_bomb);
bomb_free(tmp);
}
while(temp_monster != NULL)
{
t_monster tmp=temp_monster;
temp_monster = get_next_monster(temp_monster);
monster_free(tmp);
}
while(temp_flamme != NULL)
{
t_flamme tmp=temp_flamme;
temp_flamme = get_next_flamme(temp_flamme);
free(tmp);
}
#ifdef SOUND_FMOD_ACTIVATED
FSOUND_Sample_Free(bomb_explose);
#elif defined(SOUND_SDL_ACTIVATED)
Mix_FreeChunk(bomb_explose);
#endif //SOUND_FMOD_ACTIVATED
}
t_player game_get_player1(t_game game) {
assert(game);
return game->player1;
}
t_player game_get_player2(t_game game) {
assert(game);
return game->player2;
}
void game_init_bomb(t_game game, int x, int y, int portee, int joueur) {
assert(game);
game->list_bombs=bomb_init(game->list_bombs, x, y, portee, joueur);
}
t_map game_the_map(t_game game) {
assert(game);
return game->map;
}
//
//void generate_bonus(t_game game, int x, int y){
// t_map map = game_the_map(game);
// int random1=rand() % 100;
// int random2=rand() % 100;
// int probacumulee_inf=0;
// int probacumulee_sup=PROBA_BONUS_BOMB_RANGE * PROBA_BONUS_BOMB_RANGE_INC / 100;
// if (random1 < PROBA_BONUS){
// if (probacumulee_inf <= random2 && random2 <= probacumulee_sup)
// map_set_cell_type(map, x, y, CELL_BONUS | (BONUS_BOMB_RANGE_INC << 4));
//
// else{
// probacumulee_inf=probacumulee_sup;
// probacumulee_sup += PROBA_BONUS_BOMB_RANGE * PROBA_BONUS_BOMB_RANGE_DEC / 100;
// if (probacumulee_inf <= random2 && random2 <= probacumulee_sup)
// map_set_cell_type(map, x, y, CELL_BONUS | (BONUS_BOMB_RANGE_DEC << 4));
// else{
// probacumulee_inf=probacumulee_sup;
// probacumulee_sup += PROBA_BONUS_BOMB_NB * PROBA_BONUS_BOMB_NB_INC / 100;
// if (probacumulee_inf <= random2 && random2 <= probacumulee_sup)
// map_set_cell_type(map, x, y, CELL_BONUS | (BONUS_BOMB_NB_INC << 4));
// else{
// probacumulee_inf=probacumulee_sup;
// probacumulee_sup += PROBA_BONUS_BOMB_NB * PROBA_BONUS_BOMB_NB_DEC / 100;
// if (probacumulee_inf <= random2 && random2 <= probacumulee_sup)
// map_set_cell_type(map, x, y, CELL_BONUS | (BONUS_BOMB_NB_DEC << 4));
// else {
// probacumulee_inf=probacumulee_sup;
// probacumulee_sup += PROBA_BONUS_LIFE_INC;
// if (probacumulee_inf <= random2 && random2 <= probacumulee_sup)
// map_set_cell_type(map, x, y, CELL_BONUS | (BONUS_LIFE_INC << 4));
// else {
// map_set_cell_type(map,x,y,CELL_MONSTER);
// t_monster temp=game->list_monsters;
// game->list_monsters=monster_init(temp,x,y,1);
// }
// }
// }
// }
// }
// }
// else map_set_cell_type(map,x,y,CELL_EMPTY);
//}
t_bonus_type return_bonus(){
int random1=rand() % 100;
int random2=rand() % 100;
int probacumulee_inf=0;
int probacumulee_sup=PROBA_BONUS_BOMB_RANGE * PROBA_BONUS_BOMB_RANGE_INC / 100;
if (random1 < PROBA_BONUS){
if (probacumulee_inf <= random2 && random2 <= probacumulee_sup)
return BONUS_BOMB_RANGE_INC;
else{
probacumulee_inf=probacumulee_sup;
probacumulee_sup += PROBA_BONUS_BOMB_RANGE * PROBA_BONUS_BOMB_RANGE_DEC / 100;
if (probacumulee_inf <= random2 && random2 <= probacumulee_sup)
return BONUS_BOMB_RANGE_DEC;
else{
probacumulee_inf=probacumulee_sup;
probacumulee_sup += PROBA_BONUS_BOMB_NB * PROBA_BONUS_BOMB_NB_INC / 100;
if (probacumulee_inf <= random2 && random2 <= probacumulee_sup)
return BONUS_BOMB_NB_INC;
else{
probacumulee_inf=probacumulee_sup;
probacumulee_sup += PROBA_BONUS_BOMB_NB * PROBA_BONUS_BOMB_NB_DEC / 100;
if (probacumulee_inf <= random2 && random2 <= probacumulee_sup)
return BONUS_BOMB_NB_DEC;
else {
probacumulee_inf=probacumulee_sup;
probacumulee_sup += PROBA_BONUS_LIFE_INC;
if (probacumulee_inf <= random2 && random2 <= probacumulee_sup)
return BONUS_LIFE_INC;
else {
return BONUS_MONSTER;
}
}
}
}
}
}
else{
return NO_BONUS;
}
}
//Bombs management
void bombs_management (t_game game, int all_bombs){
t_bomb aux=game->list_bombs;
t_player player1 = game->player1;
t_player player2 = game->player2;
if (aux!=NULL){
t_bomb aux2=get_next_bomb(aux);
while(aux2 != NULL){
int current_time = bomb_get_current_time(aux2);
int next_time = -- current_time;
if (next_time>=0){
if (all_bombs==1){
bomb_set_current_time(aux2, next_time);
}
aux=get_next_bomb(aux);
aux2=get_next_bomb(aux);
}
else{
#ifdef SOUND_FMOD_ACTIVATED
FSOUND_PlaySound(FSOUND_FREE, bomb_explose);
#elif defined(SOUND_SDL_ACTIVATED)
Mix_PlayChannel(-1,bomb_explose,0);
#endif //SOUND_FMOD_ACTIVATED
int xb=bomb_get_x(aux2);
int yb=bomb_get_y(aux2);
int xp1=player_get_x(player1);
int yp1=player_get_y(player1);
int xp2;
int yp2;
int portee=bomb_get_portee(aux2);
if ( xb==xp1 && yb==yp1){
player_decrease_lives(player1);
}
if ( game->nb_joueur==2){
xp2=player_get_x(player2);
yp2=player_get_y(player2);
if (xb==xp2 && yb==yp2){
player_decrease_lives(player2);
}
}
set_next_bomb(aux,(get_next_bomb(aux2)));
int joueur=bomb_get_joueur(aux2);
free(aux2);
aux2=get_next_bomb(aux);
map_set_cell_type(game->map, xb, yb, CELL_FLAMME);
game->list_flammes = flamme_init(game->list_flammes, xb ,yb, portee, CENTER);
t_flamme temp = game->list_flammes;
while (get_next_flamme(temp)!=NULL){
temp=get_next_flamme(temp);
}
flamme_continue(temp,game);
int bm,b;
switch (joueur) {
case 1:
bm= player_get_nb_bomb_max(player1);
b =player_get_nb_bomb(player1);
if (b <bm)
player_increase_nb_bomb(player1);
break;
case 2:
bm= player_get_nb_bomb_max(player2);
b =player_get_nb_bomb(player2);
if (b <bm)
player_increase_nb_bomb(player2);
break;
}
}
}
if (game->list_bombs!=NULL){
aux=game->list_bombs;
int current_time = bomb_get_current_time(aux);
int next_time = -- current_time;
int joueur=bomb_get_joueur(aux);
if (next_time>=0){
if (all_bombs==1){
bomb_set_current_time(aux, next_time);
}
}
else {
#ifdef SOUND_FMOD_ACTIVATED
FSOUND_PlaySound(FSOUND_FREE, bomb_explose);
#elif defined(SOUND_SDL_ACTIVATED)
Mix_PlayChannel(-1,bomb_explose,0);
#endif //SOUND_FMOD_ACTIVATED
int xb=bomb_get_x(aux);
int yb=bomb_get_y(aux);
int xp1=player_get_x(player1);
int yp1=player_get_y(player1);
int xp2;
int yp2;
int portee=bomb_get_portee(aux);
if ( xb==xp1 && yb==yp1){
player_decrease_lives(player1);
}
if ( game->nb_joueur==2){
xp2=player_get_x(player2);
yp2=player_get_y(player2);
if (xb==xp2 && yb==yp2){
player_decrease_lives(player2);
}
}
game->list_bombs=get_next_bomb(aux);
free(aux);
map_set_cell_type(game->map, xb, yb, CELL_FLAMME);
game->list_flammes = flamme_init(game->list_flammes, xb ,yb, portee, CENTER);
t_flamme temp = game->list_flammes;
while (get_next_flamme(temp)!=NULL){
temp=get_next_flamme(temp);
}
flamme_continue(temp,game);
int bm,b;
switch (joueur) {
case 1:
bm= player_get_nb_bomb_max(player1);
b =player_get_nb_bomb(player1);
if (b <bm)
player_increase_nb_bomb(player1);
break;
case 2:
bm= player_get_nb_bomb_max(player2);
b =player_get_nb_bomb(player2);
if (b <bm)
player_increase_nb_bomb(player2);
break;
}
}
}
}
}
void flamme_management(t_game game) {
t_flamme aux=game->list_flammes;
t_map map=game->map;
if(aux != NULL){
t_flamme aux2=get_next_flamme(aux);
while(aux2 != NULL){
if (flamme_get_current_time(aux2) > 0){
flamme_decrease_current_time(aux2);
aux=get_next_flamme(aux);
aux2=get_next_flamme(aux);
}
else{
if (map_get_cell_type(game->map, flamme_get_x(aux2), flamme_get_y(aux2))!=CELL_MONSTER){
switch ((map_get_cell_type(game->map, flamme_get_x(aux2), flamme_get_y(aux2)) & 0xf0) >> 4) {
case BONUS_BOMB_RANGE_INC:
map_set_cell_type(map, flamme_get_x(aux2), flamme_get_y(aux2), CELL_BONUS | (BONUS_BOMB_RANGE_INC << 4));
break;
case BONUS_BOMB_RANGE_DEC:
map_set_cell_type(map, flamme_get_x(aux2), flamme_get_y(aux2), CELL_BONUS | (BONUS_BOMB_RANGE_DEC << 4));
break;
case BONUS_BOMB_NB_INC:
map_set_cell_type(map, flamme_get_x(aux2), flamme_get_y(aux2), CELL_BONUS | (BONUS_BOMB_NB_INC << 4));
break;
case BONUS_BOMB_NB_DEC:
map_set_cell_type(map, flamme_get_x(aux2), flamme_get_y(aux2), CELL_BONUS | (BONUS_BOMB_NB_DEC << 4));
break;
case BONUS_MONSTER:
map_set_cell_type(map,flamme_get_x(aux2), flamme_get_y(aux2), CELL_MONSTER);
t_monster temp=game->list_monsters;
game->list_monsters=monster_init(temp,flamme_get_x(aux2), flamme_get_y(aux2),1);
break;
case BONUS_LIFE_INC:
map_set_cell_type(map, flamme_get_x(aux2), flamme_get_y(aux2), CELL_BONUS | (BONUS_LIFE_INC << 4));
break;
case NO_BONUS:
map_set_cell_type(map, flamme_get_x(aux2), flamme_get_y(aux2), CELL_EMPTY);
break;
default:
map_set_cell_type(map, flamme_get_x(aux2), flamme_get_y(aux2), CELL_EMPTY);
break;
}
}
set_next_flamme(aux,(get_next_flamme(aux2)));
free(aux2);
aux2=get_next_flamme(aux);
}
}
aux=game->list_flammes;
if (flamme_get_current_time(aux) > 0){
flamme_decrease_current_time(aux);
}
else{
if (map_get_cell_type(game->map, flamme_get_x(aux), flamme_get_y(aux))!=CELL_MONSTER){
switch ((map_get_cell_type(game->map, flamme_get_x(aux), flamme_get_y(aux)) & 0xf0) >> 4) {
case BONUS_BOMB_RANGE_INC:
map_set_cell_type(map, flamme_get_x(aux), flamme_get_y(aux), CELL_BONUS | (BONUS_BOMB_RANGE_INC << 4));
break;
case BONUS_BOMB_RANGE_DEC:
map_set_cell_type(map, flamme_get_x(aux), flamme_get_y(aux), CELL_BONUS | (BONUS_BOMB_RANGE_DEC << 4));
break;
case BONUS_BOMB_NB_INC:
map_set_cell_type(map, flamme_get_x(aux), flamme_get_y(aux), CELL_BONUS | (BONUS_BOMB_NB_INC << 4));
break;
case BONUS_BOMB_NB_DEC:
map_set_cell_type(map, flamme_get_x(aux), flamme_get_y(aux), CELL_BONUS | (BONUS_BOMB_NB_DEC << 4));
break;
case BONUS_MONSTER:
map_set_cell_type(map,flamme_get_x(aux), flamme_get_y(aux), CELL_MONSTER);
t_monster temp=game->list_monsters;
game->list_monsters=monster_init(temp,flamme_get_x(aux), flamme_get_y(aux),1);
break;
case BONUS_LIFE_INC:
map_set_cell_type(map, flamme_get_x(aux), flamme_get_y(aux), CELL_BONUS | (BONUS_LIFE_INC << 4));
break;
case NO_BONUS:
map_set_cell_type(map, flamme_get_x(aux), flamme_get_y(aux), CELL_EMPTY);
break;
default:
map_set_cell_type(map, flamme_get_x(aux), flamme_get_y(aux), CELL_EMPTY);
break;
}
}
game->list_flammes=get_next_flamme(aux);
free(aux);
}
}
}
void flamme_continue(t_flamme flamme, t_game game) {
int x1=flamme_get_x(flamme);
int y1=flamme_get_y(flamme);
int portee=flamme_get_portee(flamme);
if (portee > 0){
switch (flamme_get_type(flamme)){
case CENTER:
flamme_check_right(x1,y1,portee,game);
flamme_check_left(x1,y1,portee,game);
flamme_check_up(x1,y1,portee,game);
flamme_check_down(x1,y1,portee,game);
break;
case HRZRIGHT:
flamme_check_right(x1,y1,portee,game);
break;
case HRZLEFT:
flamme_check_left(x1,y1,portee,game);
break;
case VERTUP:
flamme_check_up(x1,y1,portee,game);
break;
case VERTDOWN:
flamme_check_down(x1,y1,portee,game);
break;
case M_BAS:
flamme_check_down(x1,y1,portee,game);
break;
case M_HAUT:
flamme_check_up(x1,y1,portee,game);
break;
case M_GAUCHE:
flamme_check_left(x1,y1,portee,game);
break;
case M_DROITE:
flamme_check_right(x1,y1,portee,game);
break;
default:
break;
}
}
}
void flamme_check_right(int x, int y, int portee, t_game game){
t_map map=game->map;
int xp1=player_get_x(game->player1);
int yp1=player_get_y(game->player1);
int xp2=-1;
int yp2=-1;
if ( game->nb_joueur==2){
xp2=player_get_x(game->player2);
yp2=player_get_y(game->player2);
}
if (map_is_inside(map, x + 1, y)){
switch ((map_get_cell_type(map, x + 1, y)) & 0x0f ) {
case CELL_BOX:
switch ((map_get_cell_type(map, x + 1, y) & 0xf0) >> 4) {
case BONUS_BOMB_RANGE_INC:
map_set_cell_type(map, x + 1, y, CELL_FLAMME | (BONUS_BOMB_RANGE_INC << 4));
break;
case BONUS_BOMB_RANGE_DEC:
map_set_cell_type(map, x + 1, y, CELL_FLAMME | (BONUS_BOMB_RANGE_DEC << 4));
break;
case BONUS_BOMB_NB_INC:
map_set_cell_type(map, x + 1, y, CELL_FLAMME | (BONUS_BOMB_NB_INC << 4));
break;
case BONUS_BOMB_NB_DEC:
map_set_cell_type(map, x + 1, y, CELL_FLAMME | (BONUS_BOMB_NB_DEC << 4));
break;
case BONUS_MONSTER:
map_set_cell_type(map, x + 1, y, CELL_FLAMME | (BONUS_MONSTER << 4));
break;
case BONUS_LIFE_INC:
map_set_cell_type(map, x + 1, y, CELL_FLAMME | (BONUS_LIFE_INC << 4));
break;
case NO_BONUS:
map_set_cell_type(map, x + 1, y, CELL_FLAMME | (NO_BONUS<< 4));
break;
default:
break;
}
game->list_flammes=flamme_init(game->list_flammes, x + 1, y, portee - 1, DROITE);
break;
case CELL_EMPTY:
if (portee == 1){
game->list_flammes= flamme_init(game->list_flammes, x + 1, y, portee - 1, DROITE);
map_set_cell_type(map, x + 1, y, CELL_FLAMME);
}
else{
map_set_cell_type(map, x + 1, y, CELL_FLAMME);
game->list_flammes = flamme_init(game->list_flammes, x + 1, y, portee - 1, HRZRIGHT);
t_flamme temp = game->list_flammes;
while (get_next_flamme(temp)!=NULL){
temp=get_next_flamme(temp);}
flamme_continue(temp,game);
}
break;
case CELL_FLAMME:
if (portee == 1){
game->list_flammes= flamme_init(game->list_flammes, x + 1, y, portee - 1, DROITE);
map_set_cell_type(map, x + 1, y, CELL_FLAMME);
}
else{
map_set_cell_type(map, x + 1, y, CELL_FLAMME);
game->list_flammes = flamme_init(game->list_flammes, x + 1, y, portee - 1, HRZRIGHT);
t_flamme temp = game->list_flammes;
while (get_next_flamme(temp)!=NULL){
temp=get_next_flamme(temp);}
flamme_continue(temp,game);
}
break;
case CELL_BONUS:
game->list_flammes= flamme_init(game->list_flammes, x + 1, y, portee - 1, DROITE);
map_set_cell_type(map, x + 1, y, CELL_FLAMME);
break;
case CELL_MONSTER:
game->list_monsters=kill_monster(game->list_monsters,x+1,y);
game->list_flammes= flamme_init(game->list_flammes, x + 1, y, portee - 1, DROITE);
map_set_cell_type(map, x + 1, y, CELL_FLAMME);
break;
case CELL_PLAYER:
game->list_flammes= flamme_init(game->list_flammes, x + 1, y, portee - 1, DROITE);
if ( game->nb_joueur==1){
player_decrease_lives(game->player1);
}
else{
if (xp1==x+1 && yp1==y) {
player_decrease_lives(game->player1);
}
if (xp2==x+1 && yp2==y) {
player_decrease_lives(game->player2);
}
}
break;
case CELL_PLAYER_2:
player_decrease_lives(game->player2);
break;
case CELL_BOMB:
if (game->kill_bomb==0){
if(player_get_x(game->player1)==x+1 && player_get_y(game->player1)==y)
player_decrease_lives(game->player1);
if(game->nb_joueur==2){
if(player_get_x(game->player2)==x+1 && player_get_y(game->player2)==y)
player_decrease_lives(game->player2);
}
}
else
kill_bomb(game, x+1, y);
break;
default:
break;
}
}
}
void flamme_check_left(int x, int y, int portee, t_game game){
t_map map=game->map;
int xp1=player_get_x(game->player1);
int yp1=player_get_y(game->player1);
int xp2=-1;
int yp2=-1;
if ( game->nb_joueur==2){
xp2=player_get_x(game->player2);
yp2=player_get_y(game->player2);
}
if (map_is_inside(map, x - 1, y)){
switch ((map_get_cell_type(map, x - 1, y)) & 0x0f) { //Gere le cas vers la droite
// peut etre erreur avec le map is inside
case CELL_BOX:
switch ((map_get_cell_type(map, x - 1, y) & 0xf0) >> 4) {
case BONUS_BOMB_RANGE_INC:
map_set_cell_type(map, x - 1, y, CELL_FLAMME | (BONUS_BOMB_RANGE_INC << 4));
break;
case BONUS_BOMB_RANGE_DEC:
map_set_cell_type(map, x - 1, y, CELL_FLAMME | (BONUS_BOMB_RANGE_DEC << 4));
break;
case BONUS_BOMB_NB_INC:
map_set_cell_type(map, x - 1, y, CELL_FLAMME | (BONUS_BOMB_NB_INC << 4));
break;
case BONUS_BOMB_NB_DEC:
map_set_cell_type(map, x - 1, y, CELL_FLAMME | (BONUS_BOMB_NB_DEC << 4));
break;
case BONUS_MONSTER:
map_set_cell_type(map, x - 1, y, CELL_FLAMME | (BONUS_MONSTER << 4));
break;
case BONUS_LIFE_INC:
map_set_cell_type(map, x - 1, y, CELL_FLAMME | (BONUS_LIFE_INC << 4));
break;
case NO_BONUS:
map_set_cell_type(map, x - 1, y, CELL_FLAMME | (NO_BONUS<< 4));
break;
default:
break;
}
game->list_flammes=flamme_init(game->list_flammes, x - 1, y, portee - 1, GAUCHE);
break;
case CELL_EMPTY:
if (portee == 1){
game->list_flammes= flamme_init(game->list_flammes, x - 1, y, portee - 1, GAUCHE);
map_set_cell_type(map, x - 1, y, CELL_FLAMME);
}
else {
map_set_cell_type(map, x - 1, y, CELL_FLAMME);
game->list_flammes = flamme_init(game->list_flammes, x - 1, y, portee - 1, HRZLEFT);
t_flamme temp = game->list_flammes;
while (get_next_flamme(temp)!=NULL){
temp=get_next_flamme(temp);}
flamme_continue(temp,game);
}
break;
case CELL_FLAMME:
if (portee == 1){
game->list_flammes= flamme_init(game->list_flammes, x - 1, y, portee - 1, GAUCHE);
map_set_cell_type(map, x - 1, y, CELL_FLAMME);
}
else {
map_set_cell_type(map, x - 1, y, CELL_FLAMME);
game->list_flammes = flamme_init(game->list_flammes, x - 1, y, portee - 1, HRZLEFT);
t_flamme temp = game->list_flammes;
while (get_next_flamme(temp)!=NULL){
temp=get_next_flamme(temp);}
flamme_continue(temp,game);
}
break;
case CELL_BONUS:
game->list_flammes= flamme_init(game->list_flammes, x - 1, y, portee - 1, GAUCHE);
map_set_cell_type(map, x - 1, y, CELL_FLAMME);
break;
case CELL_MONSTER:
game->list_monsters=kill_monster(game->list_monsters,x-1,y);
game->list_flammes= flamme_init(game->list_flammes, x - 1, y, portee - 1, GAUCHE);
map_set_cell_type(map, x - 1, y, CELL_FLAMME);
break;
case CELL_PLAYER:
game->list_flammes= flamme_init(game->list_flammes, x - 1, y, portee - 1, GAUCHE);
if ( game->nb_joueur==1){
player_decrease_lives(game->player1);
}
else{
if (xp1==x-1 && yp1==y) {
player_decrease_lives(game->player1);
}
if (xp2==x-1 && yp2==y) {
player_decrease_lives(game->player2);
}
}
break;
case CELL_PLAYER_2:
player_decrease_lives(game->player2);
break;
case CELL_BOMB:
if (game->kill_bomb==0){
if(player_get_x(game->player1)==x-1 && player_get_y(game->player1)==y)
player_decrease_lives(game->player1);
if(game->nb_joueur==2){
if(player_get_x(game->player2)==x-1 && player_get_y(game->player2)==y)
player_decrease_lives(game->player2);
}
}
else
kill_bomb(game, x-1, y);
break;
default:
break;
}
}
}
void flamme_check_up(int x, int y, int portee, t_game game){
t_map map=game->map;
int xp1=player_get_x(game->player1);
int yp1=player_get_y(game->player1);
int xp2=-1;
int yp2=-1;
if ( game->nb_joueur==2){
xp2=player_get_x(game->player2);
yp2=player_get_y(game->player2);
}
if (map_is_inside(map, x, y - 1)){
switch ((map_get_cell_type(map, x, y - 1)) & 0x0f) {
case CELL_BOX:
switch ((map_get_cell_type(map, x, y-1) & 0xf0) >> 4) {
case BONUS_BOMB_RANGE_INC:
map_set_cell_type(map, x, y-1, CELL_FLAMME | (BONUS_BOMB_RANGE_INC << 4));
break;
case BONUS_BOMB_RANGE_DEC:
map_set_cell_type(map, x, y-1, CELL_FLAMME | (BONUS_BOMB_RANGE_DEC << 4));
break;
case BONUS_BOMB_NB_INC:
map_set_cell_type(map, x, y-1, CELL_FLAMME | (BONUS_BOMB_NB_INC << 4));
break;
case BONUS_BOMB_NB_DEC:
map_set_cell_type(map, x, y-1, CELL_FLAMME | (BONUS_BOMB_NB_DEC << 4));
break;
case BONUS_MONSTER:
map_set_cell_type(map, x, y-1, CELL_FLAMME | (BONUS_MONSTER << 4));
break;
case BONUS_LIFE_INC:
map_set_cell_type(map, x, y-1, CELL_FLAMME | (BONUS_LIFE_INC << 4));
break;
case NO_BONUS:
map_set_cell_type(map, x, y-1, CELL_FLAMME | (NO_BONUS<< 4));
break;
default:
break;
}
game->list_flammes=flamme_init(game->list_flammes, x, y - 1, portee - 1, HAUT);
break;
case CELL_EMPTY:
if (portee == 1){
map_set_cell_type(map, x, y - 1, CELL_FLAMME);
game->list_flammes= flamme_init(game->list_flammes, x, y - 1, portee - 1, HAUT);
}
else{
map_set_cell_type(map, x, y - 1, CELL_FLAMME);
game->list_flammes = flamme_init(game->list_flammes, x, y - 1, portee - 1, VERTUP);
t_flamme temp = game->list_flammes;
while (get_next_flamme(temp)!=NULL){
temp=get_next_flamme(temp);}
flamme_continue(temp,game);
}
break;
case CELL_FLAMME:
if (portee == 1){
map_set_cell_type(map, x, y - 1, CELL_FLAMME);
game->list_flammes= flamme_init(game->list_flammes, x, y - 1, portee - 1, HAUT);
}
else{
map_set_cell_type(map, x, y - 1, CELL_FLAMME);
game->list_flammes = flamme_init(game->list_flammes, x, y - 1, portee - 1, VERTUP);
t_flamme temp = game->list_flammes;
while (get_next_flamme(temp)!=NULL){
temp=get_next_flamme(temp);}
flamme_continue(temp,game);
}
break;
case CELL_BONUS:
map_set_cell_type(map, x, y - 1, CELL_FLAMME);
game->list_flammes= flamme_init(game->list_flammes, x, y - 1, portee - 1, HAUT);
break;
case CELL_MONSTER:
game->list_monsters=kill_monster(game->list_monsters,x,y-1);
map_set_cell_type(map, x, y - 1, CELL_FLAMME);
game->list_flammes= flamme_init(game->list_flammes, x, y - 1, portee - 1, HAUT);
break;
case CELL_PLAYER:
game->list_flammes= flamme_init(game->list_flammes, x, y - 1, portee - 1, HAUT);
if ( game->nb_joueur==1){
player_decrease_lives(game->player1);
}
else{
if (xp1==x && yp1==y-1) {
player_decrease_lives(game->player1);
}
if (xp2==x && yp2==y-1) {
player_decrease_lives(game->player2);
}
}
break;
case CELL_PLAYER_2:
player_decrease_lives(game->player2);
break;
case CELL_BOMB:
if (game->kill_bomb==0){
if(player_get_x(game->player1)==x && player_get_y(game->player1)==y-1)
player_decrease_lives(game->player1);
if(game->nb_joueur==2){
if(player_get_x(game->player2)==x && player_get_y(game->player2)==y-1)
player_decrease_lives(game->player2);
}
}
else
kill_bomb(game, x, y-1);
break;
default:
break;
}
}
}
void flamme_check_down (int x, int y, int portee, t_game game){
t_map map=game->map;
int xp1=player_get_x(game->player1);
int yp1=player_get_y(game->player1);
int xp2=-1;
int yp2=-1;
if ( game->nb_joueur==2){
xp2=player_get_x(game->player2);
yp2=player_get_y(game->player2);
}
if (map_is_inside(map, x, y + 1)){
switch ((map_get_cell_type(map, x, y + 1)) & 0x0f) {
case CELL_BOX:
switch ((map_get_cell_type(map, x, y+1) & 0xf0) >> 4) {
case BONUS_BOMB_RANGE_INC:
map_set_cell_type(map, x, y+1, CELL_FLAMME | (BONUS_BOMB_RANGE_INC << 4));
break;
case BONUS_BOMB_RANGE_DEC:
map_set_cell_type(map, x, y+1, CELL_FLAMME | (BONUS_BOMB_RANGE_DEC << 4));
break;
case BONUS_BOMB_NB_INC:
map_set_cell_type(map, x, y+1, CELL_FLAMME | (BONUS_BOMB_NB_INC << 4));
break;
case BONUS_BOMB_NB_DEC:
map_set_cell_type(map, x, y+1, CELL_FLAMME | (BONUS_BOMB_NB_DEC << 4));
break;
case BONUS_MONSTER:
map_set_cell_type(map, x, y+1, CELL_FLAMME | (BONUS_MONSTER << 4));
break;
case BONUS_LIFE_INC:
map_set_cell_type(map, x, y+1, CELL_FLAMME | (BONUS_LIFE_INC << 4));
break;
case NO_BONUS:
map_set_cell_type(map, x, y+1, CELL_FLAMME | (NO_BONUS<< 4));
break;
default:
break;
}
game->list_flammes=flamme_init(game->list_flammes, x, y + 1, portee - 1, BAS);
break;
case CELL_EMPTY:
if (portee == 1){
map_set_cell_type(map, x, y + 1, CELL_FLAMME);
game->list_flammes= flamme_init(game->list_flammes, x, y + 1, portee - 1, BAS);
}
else{
map_set_cell_type(map, x, y + 1, CELL_FLAMME);
game->list_flammes = flamme_init(game->list_flammes, x, y + 1, portee - 1, VERTDOWN);
t_flamme temp = game->list_flammes;
while (get_next_flamme(temp)!=NULL){
temp=get_next_flamme(temp);}
flamme_continue(temp,game);
}
break;
case CELL_FLAMME:
if (portee == 1){
map_set_cell_type(map, x, y + 1, CELL_FLAMME);
game->list_flammes= flamme_init(game->list_flammes, x, y + 1, portee - 1, BAS);
}
else{
map_set_cell_type(map, x, y + 1, CELL_FLAMME);
game->list_flammes = flamme_init(game->list_flammes, x, y + 1, portee - 1, VERTDOWN);
t_flamme temp = game->list_flammes;
while (get_next_flamme(temp)!=NULL){
temp=get_next_flamme(temp);}
flamme_continue(temp,game);
}
break;
case CELL_BONUS:
map_set_cell_type(map, x, y + 1, CELL_FLAMME);
game->list_flammes=flamme_init(game->list_flammes, x, y + 1, portee - 1, BAS);
break;
case CELL_MONSTER:
game->list_monsters=kill_monster(game->list_monsters,x,y+1);
map_set_cell_type(map, x, y + 1, CELL_FLAMME);
game->list_flammes=flamme_init(game->list_flammes, x, y + 1, portee - 1, BAS);
break;
case CELL_PLAYER:
game->list_flammes=flamme_init(game->list_flammes, x, y + 1, portee - 1, BAS);
if ( game->nb_joueur==1){
player_decrease_lives(game->player1);
}
else{
if (xp1==x && yp1==y+1) {
player_decrease_lives(game->player1);
}
if (xp2==x && yp2==y+1) {
player_decrease_lives(game->player2);
}
}
break;
case CELL_PLAYER_2:
player_decrease_lives(game->player2);
break;
case CELL_BOMB:
if (game->kill_bomb==0){
if(player_get_x(game->player1)==x && player_get_y(game->player1)==y+1)
player_decrease_lives(game->player1);
if(game->nb_joueur==2){
if(player_get_x(game->player2)==x && player_get_y(game->player2)==y+1)
player_decrease_lives(game->player2);
}
}
else
kill_bomb(game, x, y+1);
break;
default:
break;
}
}
}
void monsters_management(t_game game, int nb_joueur) {
t_monster temp=game->list_monsters;
t_map map = game_the_map(game);
if (game->list_monsters!=NULL){
while(temp != NULL){
int random1=rand() % 5;
int x= monster_get_x(temp);
int y= monster_get_y(temp);
int portee=monster_portee(temp);
switch (random1) {
case 0:
monster_set_current_way(temp, UP);
monster_move(temp,map,game->player1,game->player2, nb_joueur);
break;
case 1:
monster_set_current_way(temp, RIGHT);
monster_move(temp,map,game->player1,game->player2, nb_joueur);
break;
case 2:
monster_set_current_way(temp, DOWN);
monster_move(temp,map,game->player1,game->player2, nb_joueur);
break;
case 3:
monster_set_current_way(temp, LEFT);
monster_move(temp,map,game->player1,game->player2, nb_joueur);
break;
case 4:
switch (monster_get_current_way(temp)) {
case UP:
game->list_flammes = flamme_init(game->list_flammes, x, y,portee, M_HAUT);
t_flamme aux = game->list_flammes;
while (get_next_flamme(aux)!=NULL){
aux=get_next_flamme(aux);}
flamme_continue(aux,game);
map_set_cell_type(map, x, y, CELL_MONSTER);
break;
case DOWN:
game->list_flammes = flamme_init(game->list_flammes, x, y,portee, M_BAS);
t_flamme aux2 = game->list_flammes;
while (get_next_flamme(aux2)!=NULL){
aux2=get_next_flamme(aux2);}
flamme_continue(aux2,game);
map_set_cell_type(map, x, y, CELL_MONSTER);
break;
case RIGHT:
game->list_flammes = flamme_init(game->list_flammes, x, y,portee, M_DROITE);
t_flamme aux3 = game->list_flammes;
while (get_next_flamme(aux3)!=NULL){
aux3=get_next_flamme(aux3);}
flamme_continue(aux3,game);
map_set_cell_type(map, x, y, CELL_MONSTER);
break;
case LEFT:
game->list_flammes = flamme_init(game->list_flammes, x, y,portee, M_GAUCHE);
t_flamme aux4 = game->list_flammes;
while (get_next_flamme(aux4)!=NULL){
aux4=get_next_flamme(aux4);}
flamme_continue(aux4,game);
map_set_cell_type(map, x, y, CELL_MONSTER);
break;
}
}
temp=get_next_monster(temp);
}
}
}
t_monster kill_monster(t_monster list_monsters, int x, int y) {
if(list_monsters == NULL)
return NULL;
else{
if ( monster_get_x(list_monsters) == x && monster_get_y(list_monsters) == y){
t_monster tmp = get_next_monster(list_monsters);
free(list_monsters);
return tmp;
}
else
{
t_monster temp=list_monsters;
while ( (monster_get_x(get_next_monster(temp)) != x || monster_get_y(get_next_monster(temp)) != y) && get_next_monster(temp)!=NULL){
temp = get_next_monster(temp);
}
if(get_next_monster(temp)!=NULL){
t_monster tmp=get_next_monster(get_next_monster(temp));
free(get_next_monster(temp));
set_next_monster(temp,tmp);
}
return list_monsters;
}
}
}
void kill_bomb(t_game game, int x, int y) {
t_bomb list_bombs=game->list_bombs;
if(list_bombs != NULL){
t_player player1 = game->player1;
t_player player2 = game->player2;
int xp1=player_get_x(player1);
int yp1=player_get_y(player1);
int xp2;
int yp2;
if ( x==xp1 && y==yp1){
player_decrease_lives(player1);
}
if ( game->nb_joueur==2){
xp2=player_get_x(player2);
yp2=player_get_y(player2);
if (x==xp2 && y==yp2){
player_decrease_lives(player2);
}
}
if ( bomb_get_x(list_bombs) == x && bomb_get_y(list_bombs) == y){
bomb_set_current_time(list_bombs, 0);
// bombs_management(game,0);
}
else
{
t_bomb temp=list_bombs;
while ( bomb_get_x(get_next_bomb(temp)) != x || bomb_get_y(get_next_bomb(temp)) != y){
temp = get_next_bomb(temp);
}
temp = get_next_bomb(temp);
bomb_set_current_time(temp, 0);
// bombs_management(game,0);
}
}
}
void game_display(t_game game, SDL_Surface *screen) {
assert(game);
SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 153, 204, 204));
t_bomb temp_bomb= game->list_bombs;
t_monster temp_monster= game->list_monsters;
t_flamme temp_flamme= game->list_flammes;
int lives_player1 = player_get_lives(game->player1);
int bombs_player1 = player_get_nb_bomb(game->player1);
int range_player1 = player_portee_bomb(game->player1);
int lives_player2 = 0;
int bombs_player2 = 0;
int range_player2 = 0;
if (game->nb_joueur == 2){
lives_player2 = player_get_lives(game->player2);
bombs_player2 = player_get_nb_bomb(game->player2);
range_player2 = player_portee_bomb(game->player2);
}
map_display(game->map, lives_player1, bombs_player1, range_player1, lives_player2, bombs_player2, range_player2, screen);
while(temp_bomb != NULL)
{
t_bomb tmp=temp_bomb;
temp_bomb = get_next_bomb(temp_bomb);
bomb_display(tmp,screen);
}
while(temp_monster != NULL)
{
t_monster tmp=temp_monster;
temp_monster = get_next_monster(temp_monster);
monster_display(tmp,screen);
}
player_display(game->player1, screen);
if (game->nb_joueur == 2)
player_display(game->player2, screen);
while(temp_flamme != NULL)
{
t_flamme tmp=temp_flamme;
temp_flamme = get_next_flamme(temp_flamme);
flamme_display(tmp,screen);
}
/** Flip screen */
#ifdef HW_SCREEN_RESIZE
SDL_FillRect(hw_screen, NULL, 0x000000);
flip_NNOptimized_AllowOutOfScreen(screen, hw_screen,
HW_SCREEN_WIDTH,
MIN(screen->h*HW_SCREEN_WIDTH/screen->w, HW_SCREEN_HEIGHT));
SDL_Flip(hw_screen);
#else //HW_SCREEN_RESIZE
SDL_Flip(screen);
#endif //HW_SCREEN_RESIZE
}