Bibi/src/main.c

1225 lines
34 KiB
C
Raw Blame History

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
#include <stdlib.h> // rand(), srand()
#include <time.h> // time()
#include <SDL.h>
#include <SDL_image.h>
#include "../include/constant.h"
#include "../include/game.h"
#include "../include/game_time.h"
#include "../include/editeur.h"
#include "../include/niveau.h"
//printf("File: %s, func: %s, l.%d \n",__FILE__, __func__, __LINE__);
#ifdef SOUND_FMOD_ACTIVATED
#include <FMOD/fmod.h>
#elif defined(SOUND_SDL_ACTIVATED)
#include <SDL/SDL_mixer.h>
#endif //SOUND_SDL_ACTIVATED
bool audio_init_ok = false;
#ifdef HW_SCREEN_RESIZE
SDL_Surface *hw_screen = NULL;
#endif //HW_SCREEN_RESIZE
SDL_Surface *screen=NULL;
//##################################################### input_update ####################################################################
//Gere les entrees clavier lors de la phase de jeu.
int input_update(t_game game, int nb_joueur) {
SDL_Event event;
t_player player1 = game_get_player1(game);
t_player player2 = NULL;
if (nb_joueur == 2)
player2 = game_get_player2(game);
t_map map = game_the_map(game);
int x, y;
// Loop through all pending events and process only the latest one
while (SDL_PollEvent(&event)){
switch (event.type) {
case SDL_QUIT:
return 2;
case SDL_KEYDOWN:
switch (event.key.keysym.sym) {
case SDLK_ESCAPE:
#ifdef FUNKEY
case SDLK_q:
#endif //FUNKEY
return 2;
case SDLK_UP:
#ifdef FUNKEY
case SDLK_u:
#endif //FUNKEY
player_set_current_way(player1, UP);
player_move(player1, map);
if (player_win(player1)==1){
return 1;
}
break;
case SDLK_DOWN:
#ifdef FUNKEY
case SDLK_d:
#endif //FUNKEY
player_set_current_way(player1, DOWN);
player_move(player1, map);
if (player_win(player1)==1){
return 1;
}
break;
case SDLK_RIGHT:
#ifdef FUNKEY
case SDLK_r:
#endif //FUNKEY
player_set_current_way(player1, RIGHT);
player_move(player1, map);
if (player_win(player1)==1){
return 1;
}
break;
case SDLK_LEFT:
#ifdef FUNKEY
case SDLK_l:
#endif //FUNKEY
player_set_current_way(player1, LEFT);
player_move(player1, map);
if (player_win(player1)==1){
return 1;
}
break;
case SDLK_v:
#ifdef FUNKEY
case SDLK_x:
case SDLK_y:
#endif //FUNKEY
game->viewport_mode = !game->viewport_mode;
game->must_clear_screen = true;
//printf("Changed viewport mode to: %d\n", game->viewport_mode);
break;
//sert <20> poser une bombe pour le joueur 1
case SDLK_END: //cette touche sert pour les ordinateurs portables qui n'ont pas forc<72>ment la touce 0 <20> c<>t<EFBFBD> des fl<66>ches directionnelles)
case SDLK_KP0:
#ifdef FUNKEY
case SDLK_a:
case SDLK_b:
#endif //FUNKEY
x= player_get_x(player1);
y= player_get_y(player1);
if (player_get_nb_bomb(player1)>0 && map_get_cell_type(map,x,y)!=CELL_BOMB){
int portee=player_portee_bomb(player1);
game_init_bomb(game,x,y,portee,1);
map_set_cell_type(map, x, y, CELL_BOMB);
player_decrease_nb_bomb(player1);
}
break;
#ifndef FUNKEY
// touches du joueur 2:
case SDLK_e:
if (nb_joueur == 2){
player_set_current_way(player2, UP);
player_move(player2, map);
if (player_win(player2)==1){
return 1;
}}
break;
case SDLK_d:
if (nb_joueur == 2){
player_set_current_way(player2, DOWN);
player_move(player2, map);
if (player_win(player2)==1){
return 1;
}}
break;
case SDLK_f:
if (nb_joueur == 2){
player_set_current_way(player2, RIGHT);
player_move(player2, map);
if (player_win(player2)==1){
return 1;
}}
break;
case SDLK_s:
if (nb_joueur == 2){
player_set_current_way(player2, LEFT);
player_move(player2, map);
if (player_win(player2)==1){
return 1;
}
}
break;
case SDLK_SPACE: //sert <20> poser une bombe pour le joueur 2
if (nb_joueur == 2){
x= player_get_x(player2);
y= player_get_y(player2);
if (player_get_nb_bomb(player2)>0 && map_get_cell_type(map,x,y)!=CELL_BOMB){
int portee=player_portee_bomb(player2);
game_init_bomb(game,x,y,portee,2);
map_set_cell_type(map, x, y, CELL_BOMB);
player_decrease_nb_bomb(player2);
}
}
break;
#endif // not defined (FUNKEY)
default: break;
}
break;
}
}
return 0;
}
//##################################################### Main_game ####################################################################
//Fonction principale une fois qu'une partie est lancee, gere l'actualisation du jeu.
//Cette fonction retourne un entier qui est le niveau <20> jouer ensuite (sert pour le mode 1 joueur)
int main_game(int nb_joueur, int niveau, int mode, int kill_bomb, int game_over) {
//nb_joueur indique le nombre de joueurs
//niveau indique le niveau <20> charger
//mode indique si on est en mode jeu principal (dans ce cas mode=1) ou en mode "jouer aux niveaux <20>dit<69>s" (mode=2)
//kill_bomb indique si les bombes peuvent ou non s'exploser entre elles (non=0, oui(par d<>fault)=1)
//game_over indique combien de fois le joueur peut mourrir avant de faire game over. (3,2,1 ou 0)
srand(time(NULL));
SDL_Surface *menu = NULL;
SDL_Event event;
SDL_Rect positionMenu;
positionMenu.x = 0;
positionMenu.y = 0;
t_game game = game_new(nb_joueur,niveau,mode, kill_bomb); //on lance le jeu
#ifdef HW_SCREEN_RESIZE
SDL_FillRect(hw_screen, NULL, 0x000000);
if(screen != NULL) SDL_FreeSurface(screen);
screen = SDL_CreateRGBSurface(SDL_SWSURFACE, SIZE_BLOC * map_get_width(game_the_map(game)),
SIZE_BLOC * map_get_height(game_the_map(game)), WINDOW_BPP,
0, 0, 0, 0);
#else
screen = SDL_SetVideoMode(SIZE_BLOC * map_get_width(game_the_map(game)),
SIZE_BLOC * map_get_height(game_the_map(game)), WINDOW_BPP,
SDL_HWSURFACE);
if (screen == NULL) {
error("Can't set video mode: %s\n", SDL_GetError());
exit(1);
}
#endif //HW_SCREEN_RESIZE
game_display(game, screen);
int done = 0; //variable qui indique quand doit s'arr<72>ter la boucle du jeu, elle peut prendre les valeurs 2,1, ou 0.
// La boucle s'arr<72>te pour les valeurs 2 et 1.
int k=1, l=1, m=1, n=1;
t_player player1 = game_get_player1(game);
t_player player2=NULL;
if (nb_joueur == 2)
player2 = game_get_player2(game);
//SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_INTERVAL, SDL_DEFAULT_REPEAT_INTERVAL);
if (nb_joueur==1){
// boucle principale d'un jeu <20> 1 joueur:
while (done==0 && player_get_dead(player1)!=0) {
game_time_update();
if(player_get_lives(player1)!=0){
done = input_update(game, nb_joueur);
bombs_management(game,0);
if (k==BOMBS_SPEED){
k=1;
bombs_management(game,1); //Le management des bombes en jeu se fait tous les "BOMBS_SPEED"
// Le pam<61>tre 1 de cette fonction indique qu'elle doit g<>rer toutes les bombes en jeu
}
else k++;
if (l==MONSTER_SPEED){
l=1;
monsters_management(game,1); //Le management des monstres en jeu se fait tous les "MONSTER_SPEED"
// Le pam<61>tre 1 de cette fonction indique le nombre de joueurs
}
else l++;
}
else if (player_get_lives(player1)==0){
if (m==ANIMATION_SPEED){
m=1;
player_die(player1); // Quand le joueur meurt, le jeu s'arr<72>te et une animation se lance.
}
else m++;
}
flamme_management(game); // le management des flammes se fait toutes les actualisatons du jeu.
game_display(game, screen);
}
}
else if (nb_joueur==2){
// boucle principale d'un jeu <20> 2 joueurs:
while (done==0 && player_get_dead(player1)!=0 && player_get_dead(player2)!=0) {
game_time_update();
if( player_get_lives(player1)!=0 && player_get_lives(player2)!=0){
done = input_update(game,nb_joueur);
bombs_management(game,0);
if (k==BOMBS_SPEED){
k=1;
bombs_management(game,1);
}
else k++;
if (l==MONSTER_SPEED){
l=1;
monsters_management(game, 2);
}
else l++;
}
else{
if (player_get_lives(player1)==0){
if (m==ANIMATION_SPEED){
m=1;
player_die(player1);
}
else m++;
}
if (player_get_lives(player2)==0){
if (n==ANIMATION_SPEED){
n=1;
player_die(player2);
}
else n++;
}
}
flamme_management(game);
game_display(game, screen);
}
}
/** Free game assets */
game_free(game);
int boucle=0; //cette variable autorise ou non l'affichage de messages comme "vous avez gagn<67>", "game over", ...
if (nb_joueur==1 && player_win(player1)==1){
menu = IMG_Load("sprite/you_win.png");
boucle=1;
}
if (nb_joueur==1 && player_get_dead(player1)==0 && mode!=2){
switch (game_over){
case 3:
menu = IMG_Load("sprite/you_die_3.png");
break;
case 2:
menu = IMG_Load("sprite/you_die_2.png");
break;
case 1:
menu = IMG_Load("sprite/you_die_1.png");
break;
case 0:
menu = IMG_Load("sprite/game_over.png");
break;
}
boucle=1;
}
else if (nb_joueur==2){
if(player_get_dead(player1)==0 && player_get_dead(player2)==0){
menu = IMG_Load("sprite/egalite.png");
boucle=1;}
else if (player_get_dead(player1)==0){
menu = IMG_Load("sprite/p_2_win.png");
boucle=1;
}
else if (player_get_dead(player2)==0){
menu = IMG_Load("sprite/p_1_win.png");
boucle=1;
}
else if(player_win(player1)){
menu = IMG_Load("sprite/p_1_win.png");
boucle=1;
}
else if(player_win(player2)){
menu = IMG_Load("sprite/p_2_win.png");
boucle=1;
}
}
bool continu = false;
if (boucle==1 && menu != NULL){
/** Display Menu */
#ifdef HW_SCREEN_RESIZE
SDL_FillRect(hw_screen, NULL, 0x000000);
if(screen != NULL) SDL_FreeSurface(screen);
screen = SDL_CreateRGBSurface(SDL_SWSURFACE, 480,480, WINDOW_BPP, 0, 0, 0, 0);
#else //HW_SCREEN_RESIZE
screen = SDL_SetVideoMode(480,480, WINDOW_BPP,SDL_HWSURFACE);
if (screen == NULL) {
error("Can't set video mode: %s\n", SDL_GetError());
exit(1);
}
#endif //HW_SCREEN_RESIZE
SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0));
SDL_BlitSurface(menu, NULL, screen, &positionMenu);
SDL_FreeSurface(menu);
#ifdef HW_SCREEN_RESIZE
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
/** Wait for key press */
while (!continu)
{
SDL_Delay(150); // For debounce
SDL_WaitEvent(&event);
switch(event.type)
{
case SDL_QUIT:
case SDLK_q:
continu = true;
break;
case SDL_KEYDOWN:
switch(event.key.keysym.sym){
case SDLK_ESCAPE:
case SDLK_KP_ENTER:
case SDLK_RETURN:
case SDLK_a:
case SDLK_b:
continu = true;
default: break;
}
break;
}
}
}
if (nb_joueur==1 && player_win(player1)==1){
return niveau; //permet de passer au niveau suivant
}
else if(game_over==0){
game_over=NB_DECES;
return 0; // s'il y a game over la valeur retourn<72>e est 0 afin de reprendre le jeu depuis le niveau 1
}
else if(done==2){
return -1; // la valeur -1 sert <20> indiquer que l'utilisateur a appuy<75> sur <20>chap ou quitter
// elle informe qu'il faudra rejouer le niveau sans d<>cr<63>menter la variable game_over
// (donc le nombre de d<>c<EFBFBD>s autoris<69>s avant d'avoir un game over)
}
else {
return niveau-1; // lorsque le joueur meurt, informe qu'il faut
//rejouer le niveau pr<70>c<EFBFBD>dent et d<>cr<63>menter la variable game_over
}
}
//##################################################### Main ####################################################################
//Fonction principale du jeu
int main_menu_and_game() {
SDL_Surface *menu = NULL;
SDL_Event event;
SDL_Rect positionMenu;
if (SDL_Init(SDL_INIT_EVERYTHING) == -1) {
error("Can't init SDL: %s\n", SDL_GetError());
}
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
#ifdef FUNKEY
SDL_ShowCursor(SDL_DISABLE);
#endif //FUNKEY
/** Init Video */
#ifdef HW_SCREEN_RESIZE
hw_screen = SDL_SetVideoMode(HW_SCREEN_WIDTH,HW_SCREEN_HEIGHT, WINDOW_BPP, SDL_HWSURFACE|SDL_DOUBLEBUF);
if (hw_screen == NULL) {
error("Can't set video mode: %s\n", SDL_GetError());
}
if(screen != NULL) SDL_FreeSurface(screen);
screen = SDL_CreateRGBSurface(SDL_SWSURFACE, 700,500, WINDOW_BPP, 0, 0, 0, 0);
#else //HW_SCREEN_RESIZE
screen = SDL_SetVideoMode(700,500, WINDOW_BPP,SDL_HWSURFACE);
if (screen == NULL) {
error("Can't set video mode: %s\n", SDL_GetError());
}
#endif //HW_SCREEN_RESIZE
SDL_WM_SetIcon(IMG_Load(IMG_PLAYER_DOWN), NULL);
SDL_WM_SetCaption("[PG110] Projet 2010", NULL);
/** Load audio */
#ifdef SOUND_FMOD_ACTIVATED
FMUSIC_MODULE *musique_menu_p;
FMUSIC_MODULE *musique_editeur;
FMUSIC_MODULE *musique_2_p;
FMUSIC_MODULE *musique_1_p;
FMUSIC_MODULE *musique_p_e;
if(!FSOUND_Init(11025, 32, 0)){
printf("Cannot init audio with FSOUND_Init\n");
}
else{
audio_init_ok = true;
musique_menu_p = FMUSIC_LoadSong("audio/mm2titl2.mid");
musique_editeur = FMUSIC_LoadSong("audio/mm2crash.mid");
musique_2_p = FMUSIC_LoadSong("audio/mm2wy1.mid");
musique_1_p = FMUSIC_LoadSong("audio/mix_1_p.mid");
musique_p_e = FMUSIC_LoadSong("audio/mm2flash.mid");
FMUSIC_SetMasterVolume(musique_menu_p, 130);
FMUSIC_SetMasterVolume(musique_p_e, 130);
FMUSIC_SetMasterVolume(musique_editeur, 130);
FMUSIC_SetMasterVolume(musique_2_p, 130);
FMUSIC_SetMasterVolume(musique_1_p, 130);
}
#elif defined(SOUND_SDL_ACTIVATED)
// Setup audio mode
Mix_Music *musique_menu_p = NULL;
Mix_Music *musique_editeur = NULL;
Mix_Music *musique_2_p = NULL;
Mix_Music *musique_1_p = NULL;
Mix_Music *musique_p_e = NULL;
//if(Mix_OpenAudio(22050, AUDIO_S16SYS, 2, 640)==-1){
//if(Mix_OpenAudio(44100, AUDIO_S16, 1, 4096) < 0){
if(Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024)==-1){
printf("Mix_OpenAudio: %s\n", Mix_GetError());
//exit(2);
}
else{
audio_init_ok = true;
//Mix_Volume(1,MIX_MAX_VOLUME);
const char *music_file;
music_file = "audio/mm2titl2.ogg";
musique_menu_p = Mix_LoadMUS(music_file);
if(musique_menu_p == NULL){
printf("Mix_LoadMUS(\"%s\"): %s\n", Mix_GetError(), music_file);
}
music_file = "audio/mm2crash.ogg";
musique_editeur = Mix_LoadMUS(music_file);
if(musique_editeur == NULL){
printf("Mix_LoadMUS(\"%s\"): %s\n", Mix_GetError(), music_file);
}
music_file = "audio/mm2wy1.ogg";
musique_2_p = Mix_LoadMUS(music_file);
if(musique_2_p == NULL){
printf("Mix_LoadMUS(\"%s\"): %s\n", Mix_GetError(), music_file);
}
music_file = "audio/mix_1_p.ogg";
musique_1_p = Mix_LoadMUS(music_file);
if(musique_1_p == NULL){
printf("Mix_LoadMUS(\"%s\"): %s\n", Mix_GetError(), music_file);
}
music_file = "audio/mm2flash.ogg";
musique_p_e = Mix_LoadMUS(music_file);
if(musique_p_e == NULL){
printf("Mix_LoadMUS(\"%s\"): %s\n", Mix_GetError(), music_file);
}
}
#endif //SOUND_SDL_ACTIVATED
/** Init vars for graphics and game */
menu = IMG_Load("sprite/menu_1_p.png");
positionMenu.x = 0;
positionMenu.y = 0;
bool done = false; //variable de la boucle principale du bomberman (false: le jeu continu, true: le jeu s'arr<72>te)
int niveau_reussi=0, ancien_niveau=1, choix_entrer_dans_niveau, choix_entrer_niveau_2p=1, choix_niveau=1,
choix_ancien_niveau, choix_option, nb_joueurs, sure, kill_bomb=1;
//niveau_reussi sert pour le mode 1 joueur <20> indiquer <20> quel niveau se trouve le joueur
//ancien_niveau informe <20> quel niveau se trouvait le joueur avant de lancer main_game
//choix_entrer_dans_niveau=0 si le joueur accepte de rentrer dans le niveau indiqu<71>, 1 sinon.
//choix_entrer_niveau_2p permet de choisir lequel des 6 niveaux disponibles en 2 joueurs l'utilisateur choisi.
//choix_niveau sert <20> la m<>me chose que choix_entrer_niveau_2p mais pour l'<27>diteur et le mode "jouer aux jeux <20>dit<69>s"
//idem pour choix_option sauf que c'est pour le mode option (1:jouer son, 2: arr<72>ter son, 3: les bombes s'explosent
//entres elles, 4: les bombes ne s'explosent pas entre elles)
//choix_ancien_niveau sert (en deux joueurs et en mode "jouer aux jeux <20>dit<69>s) <20> replacer automatiquement
//le curseur sur le niveau qui vien d'<27>tre jou<6F>.
//sure=1 si l'utilisateur est s<>r de quitter, 0 sinon.
//kill_bomb=0 si les bombes ne s'explosent pas entre elles, 1 sinon.
//audio sert pour le son (voir version Windows)
int choix_actuel=1; //indique la position du curseur dans le menu principal (1: jeu 1 joueur, 2: jeu 2 joueurs,
//3:editeur, 4:jouer aux niveaux edit<69>s, 5: options, 6: quitter)
int game_over=NB_DECES;
int resize=0; //Si resize=1 on remet l'<27>cran <20> la taille 700*500
bool menu_change = true;
int play_music=1;
int audio=1;
int prev_time_ms = 0;
while (!done)
{
if (play_music==1){
if(audio_init_ok && audio==1){
#ifdef SOUND_FMOD_ACTIVATED
FMUSIC_PlaySong(musique_menu_p);
#elif defined(SOUND_SDL_ACTIVATED)
if(Mix_PlayMusic(musique_menu_p, -1) < 0){
printf("Error in File: %s, func: %s, l.%d - Cannot play music!\n",
__FILE__, __func__, __LINE__);
}
#endif //SOUND_SDL_ACTIVATED
}
play_music=0;
}
//SDL_WaitEvent(&event);
event.type = 0; // somehow we need to reset here the last event, or it keep being "a"
while (SDL_PollEvent(&event));
switch(event.type)
{
case SDL_QUIT:
#ifdef SOUND_FMOD_ACTIVATED
//FMUSIC_StopSong(musique_menu_p);
#elif defined(SOUND_SDL_ACTIVATED)
Mix_HaltMusic();
#endif //SOUND_SDL_ACTIVATED
done = 1;
break;
case SDL_KEYDOWN:
switch(event.key.keysym.sym){
case SDLK_ESCAPE: // Veut arr<72>ter le jeu
case SDLK_q: // Veut arr<72>ter le jeu
#ifdef SOUND_FMOD_ACTIVATED
//FMUSIC_StopSong(musique_menu_p);
#elif defined(SOUND_SDL_ACTIVATED)
Mix_HaltMusic();
#endif //SOUND_SDL_ACTIVATED
done = 1;
break;
case SDLK_UP:
case SDLK_u:
switch(choix_actuel){
case 1:
menu = IMG_Load("sprite/menu_q.png");
choix_actuel=6;
break;
case 2:
menu = IMG_Load("sprite/menu_1_p.png");
choix_actuel=1;
break;
case 3:
menu = IMG_Load("sprite/menu_2_p.png");
choix_actuel=2;
break;
case 4:
menu = IMG_Load("sprite/menu_e.png");
choix_actuel=3;
break;
case 5:
menu = IMG_Load("sprite/menu_j_e.png");
choix_actuel=4;
break;
case 6:
menu = IMG_Load("sprite/menu_o.png");
choix_actuel=5;
break;
}
menu_change = true;
break;
case SDLK_DOWN:
case SDLK_d:
switch(choix_actuel){
case 1:
menu = IMG_Load("sprite/menu_2_p.png");
choix_actuel=2;
break;
case 2:
menu = IMG_Load("sprite/menu_e.png");
choix_actuel=3;
break;
case 3:
menu = IMG_Load("sprite/menu_j_e.png");
choix_actuel=4;
break;
case 4:
menu = IMG_Load("sprite/menu_o.png");
choix_actuel=5;
break;
case 5:
menu = IMG_Load("sprite/menu_q.png");
choix_actuel=6;
break;
case 6:
menu = IMG_Load("sprite/menu_1_p.png");
choix_actuel=1;
break;
}
menu_change = true;
break;
case SDLK_RETURN:
case SDLK_KP_ENTER:
case SDLK_a:
switch(choix_actuel){
case 1: //on rentre dans le mode 1 joueur.
if(audio_init_ok && audio==1){
#ifdef SOUND_FMOD_ACTIVATED
FMUSIC_StopSong(musique_menu_p);
FMUSIC_PlaySong(musique_1_p);
#elif defined(SOUND_SDL_ACTIVATED)
Mix_HaltMusic();
if(Mix_PlayMusic(musique_1_p, -1) < 0){
printf("Error in File: %s, func: %s, l.%d - Cannot play music!\n",
__FILE__, __func__, __LINE__);
}
#endif //SOUND_SDL_ACTIVATED
}
while (niveau_reussi<10){ //En effet il n'y a que 10 niveaux dans ce jeu
if(game_over<0){
niveau_reussi=0; //apr<70>s game over le joueur repart du niveau 1;
game_over=NB_DECES;
}
choix_entrer_dans_niveau = niveau_1_joueur(screen,niveau_reussi+1);
if (choix_entrer_dans_niveau==0){
ancien_niveau=niveau_reussi;
niveau_reussi=main_game(1,niveau_reussi+1,1, kill_bomb, game_over); // le jeu se lance,
//le r<>sultat retourn<72> est stock<63> dans la variable niveau_reussi.
if(ancien_niveau==niveau_reussi && ancien_niveau!=0){
game_over--; //on regarde si le joueur est mort, dans ce cas on d<>cr<63>mente game_over.
}
else if(niveau_reussi==-1){ //si l'utilisateur a fait <20>chap ou quitter durant la partie.
niveau_reussi=ancien_niveau;
}
if (niveau_reussi>=10){ //si l'utilisateur <20> gagn<67> le mode 1 joueur
choix_entrer_dans_niveau=niveau_1_joueur(screen,0);
niveau_reussi=0;
game_over=NB_DECES;
// FMUSIC_StopSong(musique_1_p);
// play_music=1;
break;
}
}
else{
if(are_you_sure(screen)==1){ //si l'utilisateur veut quitter le mode 1 joueur
play_music=1;
if(audio_init_ok && audio==1){
#ifdef SOUND_FMOD_ACTIVATED
FMUSIC_StopSong(musique_1_p);
#elif defined(SOUND_SDL_ACTIVATED)
Mix_HaltMusic();
#endif //SOUND_SDL_ACTIVATED
}
break;
}
}
}
resize=1;
break;
case 2:
if(audio_init_ok && audio==1){
#ifdef SOUND_FMOD_ACTIVATED
FMUSIC_StopSong(musique_menu_p);
FMUSIC_PlaySong(musique_2_p);
#elif defined(SOUND_SDL_ACTIVATED)
Mix_HaltMusic();
if(Mix_PlayMusic(musique_2_p, -1) < 0){
printf("Error in File: %s, func: %s, l.%d - Cannot play music!\n",
__FILE__, __func__, __LINE__);
}
#endif //SOUND_SDL_ACTIVATED
}
sure=2;
choix_entrer_niveau_2p=1;
choix_ancien_niveau=choix_entrer_niveau_2p;
while (sure!=1){
if (choix_entrer_niveau_2p!=0)
choix_ancien_niveau=choix_entrer_niveau_2p;
choix_entrer_niveau_2p=niveau_2_joueur(screen,choix_ancien_niveau);
if(choix_entrer_niveau_2p==0)
sure=are_you_sure(screen);
else
main_game(2,choix_entrer_niveau_2p,1, kill_bomb, game_over);
}
play_music=1;
if(audio_init_ok && audio==1){
#ifdef SOUND_FMOD_ACTIVATED
FMUSIC_StopSong(musique_2_p);
#elif defined(SOUND_SDL_ACTIVATED)
Mix_HaltMusic();
#endif //SOUND_SDL_ACTIVATED
}
resize=1;
break;
case 3:
if(audio_init_ok && audio==1){
#ifdef SOUND_FMOD_ACTIVATED
FMUSIC_StopSong(musique_menu_p);
FMUSIC_PlaySong(musique_editeur);
#elif defined(SOUND_SDL_ACTIVATED)
Mix_HaltMusic();
if(Mix_PlayMusic(musique_editeur, -1) < 0){
printf("Error in File: %s, func: %s, l.%d - Cannot play music!\n",
__FILE__, __func__, __LINE__);
}
#endif //SOUND_SDL_ACTIVATED
}
sure=2;
choix_niveau=1;
choix_ancien_niveau=choix_niveau;
while (sure!=1){
if (choix_niveau!=0)
choix_ancien_niveau=choix_niveau;
choix_niveau=niveau_2_joueur(screen,choix_ancien_niveau);
if(choix_niveau==0)
sure=are_you_sure(screen);
else if (niveau_1_joueur(screen,-1)==0)
editeur(screen,choix_niveau);
}
play_music=1;
if(audio_init_ok && audio==1){
#ifdef SOUND_FMOD_ACTIVATED
FMUSIC_StopSong(musique_editeur);
#elif defined(SOUND_SDL_ACTIVATED)
Mix_HaltMusic();
#endif //SOUND_SDL_ACTIVATED
}
resize=1;
break;
case 4:
if(audio_init_ok && audio==1){
#ifdef SOUND_FMOD_ACTIVATED
FMUSIC_StopSong(musique_menu_p);
FMUSIC_PlaySong(musique_p_e);
#elif defined(SOUND_SDL_ACTIVATED)
Mix_HaltMusic();
if(Mix_PlayMusic(musique_p_e, -1) < 0){
printf("Error in File: %s, func: %s, l.%d - Cannot play music!\n",
__FILE__, __func__, __LINE__);
}
#endif //SOUND_SDL_ACTIVATED
}
sure=2;
choix_niveau=1;
choix_ancien_niveau=choix_niveau;
while (sure!=1){
if (choix_niveau!=0){
choix_ancien_niveau=choix_niveau;
}
choix_niveau=niveau_2_joueur(screen,choix_ancien_niveau);
if(choix_niveau==0){
sure=are_you_sure(screen);
}
else{
nb_joueurs=choix_nb_joueurs(screen);
if(nb_joueurs!=0 ){
main_game(nb_joueurs,choix_niveau,2, kill_bomb, game_over);
}
}
}
play_music=1;
if(audio_init_ok && audio==1){
#ifdef SOUND_FMOD_ACTIVATED
FMUSIC_StopSong(musique_p_e);
#elif defined(SOUND_SDL_ACTIVATED)
Mix_HaltMusic();
#endif //SOUND_SDL_ACTIVATED
}
resize=1;
break;
case 5:
choix_option=options(screen);
switch(choix_option){
case 0:
break;
case 1:
if(audio_init_ok){
#ifdef SOUND_FMOD_ACTIVATED
FMUSIC_PlaySong(musique_menu_p);
#elif defined(SOUND_SDL_ACTIVATED)
if(Mix_PlayMusic(musique_menu_p, -1) < 0){
printf("Error in File: %s, func: %s, l.%d - Cannot play music!\n",
__FILE__, __func__, __LINE__);
}
#endif //SOUND_SDL_ACTIVATED
}
audio=1;
break;
case 2:
if(audio_init_ok){
#ifdef SOUND_FMOD_ACTIVATED
FMUSIC_StopSong(musique_menu_p);
#elif defined(SOUND_SDL_ACTIVATED)
Mix_HaltMusic();
#endif //SOUND_SDL_ACTIVATED
}
audio=0;
break;
case 3:
kill_bomb=1;
break;
case 4:
kill_bomb=0;
break;
default: break;
}
resize=1;
break;
case 6:
if(are_you_sure(screen)==1){
if(audio_init_ok && audio==1){
#ifdef SOUND_FMOD_ACTIVATED
FMUSIC_StopSong(musique_menu_p);
#elif defined(SOUND_SDL_ACTIVATED)
Mix_HaltMusic();
#endif //SOUND_FMOD_ACTIVATED
}
done=1;
resize=1;
break;
}
else{
resize=1;
}
break;
default:
break;
}
break;
default:
break;
}
break;
default:
break;
}
/** Reset main menu screen */
if (resize==1){
#ifdef HW_SCREEN_RESIZE
SDL_FillRect(hw_screen, NULL, 0x000000);
if(screen != NULL) SDL_FreeSurface(screen);
screen = SDL_CreateRGBSurface(SDL_SWSURFACE, 700,500, WINDOW_BPP, 0, 0, 0, 0);
#else //HW_SCREEN_RESIZE
screen = SDL_SetVideoMode(700,500, WINDOW_BPP,SDL_HWSURFACE);
if (screen == NULL) {
error("Can't set video mode: %s\n", SDL_GetError());
exit(1);
}
#endif //HW_SCREEN_RESIZE
}
// Effacement de l'<27>cran
if(menu_change || resize){
//SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0));
SDL_BlitSurface(menu, NULL, screen, &positionMenu);
menu_change = false;
}
resize=0;
#ifdef HW_SCREEN_RESIZE
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
/** FPS handling */
#define FPS_MENU 30
int cur_time_ms = SDL_GetTicks();
int wait_time_ms = 1000/FPS_MENU - (cur_time_ms-prev_time_ms);
if(wait_time_ms > 0){
SDL_Delay(wait_time_ms);
}
prev_time_ms = SDL_GetTicks();
}
if(audio_init_ok){
#ifdef SOUND_FMOD_ACTIVATED
FMUSIC_FreeSong(musique_menu_p);
FMUSIC_FreeSong(musique_2_p);
FMUSIC_FreeSong(musique_1_p);
FMUSIC_FreeSong(musique_p_e);
FMUSIC_FreeSong(musique_editeur);
#elif defined(SOUND_SDL_ACTIVATED)
Mix_FreeMusic(musique_menu_p);
Mix_FreeMusic(musique_2_p);
Mix_FreeMusic(musique_1_p);
Mix_FreeMusic(musique_p_e);
Mix_FreeMusic(musique_editeur);
Mix_CloseAudio();
#endif //SOUND_SDL_ACTIVATED
}
if(menu != NULL) SDL_FreeSurface(menu);
SDL_Quit();
return EXIT_SUCCESS;
}
int main_game_no_menu() {
if (SDL_Init(SDL_INIT_EVERYTHING) == -1) {
error("Can't init SDL: %s\n", SDL_GetError());
}
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
#ifdef FUNKEY
SDL_ShowCursor(SDL_DISABLE);
#endif //FUNKEY
/** Init Video */
#ifdef HW_SCREEN_RESIZE
hw_screen = SDL_SetVideoMode(HW_SCREEN_WIDTH,HW_SCREEN_HEIGHT, WINDOW_BPP, SDL_HWSURFACE|SDL_DOUBLEBUF);
if (hw_screen == NULL) {
error("Can't set video mode: %s\n", SDL_GetError());
}
if(screen != NULL) SDL_FreeSurface(screen);
screen = SDL_CreateRGBSurface(SDL_SWSURFACE, 700,500, WINDOW_BPP, 0, 0, 0, 0);
#else //HW_SCREEN_RESIZE
screen = SDL_SetVideoMode(700,500, WINDOW_BPP,SDL_HWSURFACE);
if (screen == NULL) {
error("Can't set video mode: %s\n", SDL_GetError());
}
#endif //HW_SCREEN_RESIZE
SDL_WM_SetIcon(IMG_Load(IMG_PLAYER_DOWN), NULL);
SDL_WM_SetCaption("[PG110] Projet 2010", NULL);
/** Load audio */
#ifdef SOUND_FMOD_ACTIVATED
FMUSIC_MODULE *musique_menu_p;
FMUSIC_MODULE *musique_editeur;
FMUSIC_MODULE *musique_2_p;
FMUSIC_MODULE *musique_1_p;
FMUSIC_MODULE *musique_p_e;
if(!FSOUND_Init(11025, 32, 0)){
printf("Cannot init audio with FSOUND_Init\n");
}
else{
audio_init_ok = true;
musique_menu_p = FMUSIC_LoadSong("audio/mm2titl2.mid");
musique_editeur = FMUSIC_LoadSong("audio/mm2crash.mid");
musique_2_p = FMUSIC_LoadSong("audio/mm2wy1.mid");
musique_1_p = FMUSIC_LoadSong("audio/mix_1_p.mid");
musique_p_e = FMUSIC_LoadSong("audio/mm2flash.mid");
FMUSIC_SetMasterVolume(musique_menu_p, 130);
FMUSIC_SetMasterVolume(musique_p_e, 130);
FMUSIC_SetMasterVolume(musique_editeur, 130);
FMUSIC_SetMasterVolume(musique_2_p, 130);
FMUSIC_SetMasterVolume(musique_1_p, 130);
}
#elif defined(SOUND_SDL_ACTIVATED)
// Setup audio mode
Mix_Music *musique_menu_p = NULL;
Mix_Music *musique_editeur = NULL;
Mix_Music *musique_2_p = NULL;
Mix_Music *musique_1_p = NULL;
Mix_Music *musique_p_e = NULL;
//if(Mix_OpenAudio(22050, AUDIO_S16SYS, 2, 640)==-1){
//if(Mix_OpenAudio(44100, AUDIO_S16, 1, 4096) < 0){
if(Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024)==-1){
printf("Mix_OpenAudio: %s\n", Mix_GetError());
//exit(2);
}
else{
audio_init_ok = true;
//Mix_Volume(1,MIX_MAX_VOLUME);
const char *music_file;
music_file = "audio/mm2titl2.ogg";
musique_menu_p = Mix_LoadMUS(music_file);
if(musique_menu_p == NULL){
printf("Mix_LoadMUS(\"%s\"): %s\n", Mix_GetError(), music_file);
}
music_file = "audio/mm2crash.ogg";
musique_editeur = Mix_LoadMUS(music_file);
if(musique_editeur == NULL){
printf("Mix_LoadMUS(\"%s\"): %s\n", Mix_GetError(), music_file);
}
music_file = "audio/mm2wy1.ogg";
musique_2_p = Mix_LoadMUS(music_file);
if(musique_2_p == NULL){
printf("Mix_LoadMUS(\"%s\"): %s\n", Mix_GetError(), music_file);
}
music_file = "audio/mix_1_p.ogg";
musique_1_p = Mix_LoadMUS(music_file);
if(musique_1_p == NULL){
printf("Mix_LoadMUS(\"%s\"): %s\n", Mix_GetError(), music_file);
}
music_file = "audio/mm2flash.ogg";
musique_p_e = Mix_LoadMUS(music_file);
if(musique_p_e == NULL){
printf("Mix_LoadMUS(\"%s\"): %s\n", Mix_GetError(), music_file);
}
}
#endif //SOUND_SDL_ACTIVATED
if(audio_init_ok){
#ifdef SOUND_FMOD_ACTIVATED
FMUSIC_StopSong(musique_menu_p);
FMUSIC_PlaySong(musique_1_p);
#elif defined(SOUND_SDL_ACTIVATED)
Mix_HaltMusic();
if(Mix_PlayMusic(musique_1_p, -1) < 0){
printf("Error in File: %s, func: %s, l.%d - Cannot play music!\n",
__FILE__, __func__, __LINE__);
}
#endif //SOUND_SDL_ACTIVATED
}
/** 1 player Game */
int niveau_reussi=0, ancien_niveau=1, choix_entrer_dans_niveau, kill_bomb=1;
int game_over=NB_DECES;
while (niveau_reussi<10){ //En effet il n'y a que 10 niveaux dans ce jeu
if(game_over<0){
niveau_reussi=0; //apr<70>s game over le joueur repart du niveau 1;
game_over=NB_DECES;
}
choix_entrer_dans_niveau = niveau_1_joueur(screen,niveau_reussi+1);
if (choix_entrer_dans_niveau==0){
ancien_niveau=niveau_reussi;
niveau_reussi=main_game(1,niveau_reussi+1,1, kill_bomb, game_over); // le jeu se lance,
//le r<>sultat retourn<72> est stock<63> dans la variable niveau_reussi.
if(ancien_niveau==niveau_reussi && ancien_niveau!=0){
game_over--; //on regarde si le joueur est mort, dans ce cas on d<>cr<63>mente game_over.
}
else if(niveau_reussi==-1){ //si l'utilisateur a fait <20>chap ou quitter durant la partie.
niveau_reussi=ancien_niveau;
}
if (niveau_reussi>=10){ //si l'utilisateur <20> gagn<67> le mode 1 joueur
choix_entrer_dans_niveau=niveau_1_joueur(screen,0);
niveau_reussi=0;
game_over=NB_DECES;
// FMUSIC_StopSong(musique_1_p);
// play_music=1;
break;
}
}
else{
if(are_you_sure(screen)==1){ //si l'utilisateur veut quitter le mode 1 joueur
if(audio_init_ok){
#ifdef SOUND_FMOD_ACTIVATED
FMUSIC_StopSong(musique_1_p);
#elif defined(SOUND_SDL_ACTIVATED)
Mix_HaltMusic();
#endif //SOUND_SDL_ACTIVATED
}
break;
}
}
}
if(audio_init_ok){
#ifdef SOUND_FMOD_ACTIVATED
FMUSIC_FreeSong(musique_menu_p);
FMUSIC_FreeSong(musique_2_p);
FMUSIC_FreeSong(musique_1_p);
FMUSIC_FreeSong(musique_p_e);
FMUSIC_FreeSong(musique_editeur);
#elif defined(SOUND_SDL_ACTIVATED)
Mix_FreeMusic(musique_menu_p);
Mix_FreeMusic(musique_2_p);
Mix_FreeMusic(musique_1_p);
Mix_FreeMusic(musique_p_e);
Mix_FreeMusic(musique_editeur);
Mix_CloseAudio();
#endif //SOUND_SDL_ACTIVATED
}
SDL_Quit();
return EXIT_SUCCESS;
}
int main(int argc, char *argv[]) {
#ifdef BYPASS_MENU
return main_game_no_menu();
#else
return main_menu_and_game();
#endif
}