Skip to content
Snippets Groups Projects
logique.c 8.78 KiB
/**
 * \file logique.c
 * \brief Module des fonctions gérant la logique du jeu
 * \author Guillaume Vautrin
 * \version 1.0
 * \date 23 Sept 2020
 */

#include "logique.h"

void init_data(world_t * world){ //faux
    
    //Etat de début de partie
    world->gameover = 0;
    world->compteur_plats = 0;
    world->score = 0;
    world->attente = 0;

    //Initialise le sprite du joueur en haut à gauche de l'écran, en état 0
    //init_sprite(&world->joueur, SCREEN_WIDTH*0.1, SCREEN_HEIGHT*0.1, SIZE_JOUEUR, SIZE_JOUEUR, SIZE_JOUEUR/2, 0);

    //Charge la carte
    world->level = init_map();
    world-> map = world->level;

    
    /*
    init_sprite(&world->ship, SCREEN_WIDTH/2, SCREEN_HEIGHT-SHIP_SIZE, SHIP_SIZE, SHIP_SIZE, MOVING_STEP);
    init_enemies(world);
    //init_sprite(&world->ennemy, SCREEN_WIDTH/2, SCREEN_HEIGHT-SCREEN_HEIGHT+SHIP_SIZE, SHIP_SIZE, SHIP_SIZE, ENNEMY_SPEED);
    init_sprite(&world->missile, (SCREEN_WIDTH+ SHIP_SIZE)/2, SCREEN_HEIGHT-(SHIP_SIZE+MISSILE_SIZE), MISSILE_SIZE, MISSILE_SIZE, MISSILE_SPEED);
    set_invisible(&world->missile);
    */
    
}

void init_sprite(sprite_t *sprite, char nom, int x, int y, int w, int h, int v, int state){ //faux 
    //La fonction initialise tous les composants d'un sprite
    sprite->x = x;
    sprite->y = y;
    sprite->w = w;
    sprite->h = h;
    sprite->v = v;
    sprite->etat = state;
    sprite->is_visible = 0;
    sprite->nom = nom;
}

int aleatoire (int a, int b){
    // Fonction générant une valeur aléatoire entre a (inclu) et b (exclu)
    return rand()%(b-a)+a;
}

void set_bas (sprite_t *sprite){
    // Sprite va vers le bas
    sprite->etat = 0;
}

void set_haut (sprite_t *sprite){
    // Sprite va vers le haut
    sprite->etat = 1;
}

void set_droite (sprite_t *sprite){
    // Sprite va vers la droite
    sprite->etat = 2;
}

void set_gauche (sprite_t *sprite){
    // Sprite va vers la gauche
    sprite->etat = 3;
}

int return_state (sprite_t *sprite){
    //Retourne l'état du sprite
    return sprite->etat;
}

void set_visible (sprite_t *sprite){
    // Permet de rendre visible un sprite
    sprite->is_visible=0;
}

void set_invisible (sprite_t *sprite){
    // Permet de rendre invisible un sprite
    sprite->is_visible=1;
}

int estFini(world_t *world){
    //Défini si le jeu est terminé
    return world->gameover;
}

void limites_externes (sprite_t *sprite, world_t *world){
    //Défini les limites selon les murs
    if (sprite->x > (SCREEN_WIDTH*0.9)){
        //mur droite
        sprite->x = (SCREEN_WIDTH*0.9) - sprite->w/2;
    }

    if (sprite->x < (SCREEN_WIDTH*0.1)){
        //mur gauche
        sprite->x = (SCREEN_WIDTH*0.1);
    }

    if (sprite->y > (SCREEN_HEIGHT*0.9)){
        //mur bas
        sprite->y = (SCREEN_HEIGHT*0.9) - sprite->w/2;
    }

    if (sprite->y < (SCREEN_HEIGHT*0.1)){
        //mur haut
        sprite->y = (SCREEN_HEIGHT*0.1);
    }

}

void reset_sprite_on_map (sprite_t *sprite, world_t *world){
    //On efface la position du joueur sur map
    for (int i=0; i<SCREEN_HEIGHT; i++){
        for (int j=0; j<SCREEN_WIDTH; j++){
            if (world->map[i][j]== sprite->nom){
                world->map[i][j] = ' ';
            }
        }
    }
}

void place_sprite_on_map (sprite_t *sprite, world_t *world){
    //on écrit la position du joueur sur la map
    for (int i=sprite->y;  i < sprite->y + sprite->h ; i++){
        for (int j = sprite->x ; j < sprite->x + sprite->w ; j++){
            world->map[i][j]= sprite->nom;
        }
    }
}

void deplace_sprite (sprite_t *sprite, world_t *world){
    //permet de déplacer le sprite et de corriger les données de map de manière cohérente
    reset_sprite_on_map(sprite, world);
    int compteur;

    switch (return_state(sprite)){
        case 0:
        //déplace vers le bas
            sprite->y += sprite->v;
            if (world->map[sprite->y + SIZE_JOUEUR][sprite->x] != ' ' || world->map[sprite->y + SIZE_JOUEUR][sprite->x + SIZE_JOUEUR] != ' '){
                //Compter le nombre d'espace avant d'arriver au bloc, et placer le joueur contre le bloc interdit
                for (int y= sprite->y; y<SIZE_JOUEUR; y++){
                    if (world->map[y][sprite->x] == ' '){
                        compteur++;
                    }
                }
                sprite->x -= compteur;
            }
            break;
        case 1:
            //déplace vers le haut
            sprite->y -= sprite->v;
            if (world->map[sprite->y][sprite->x] != ' ' || world->map[sprite->y][sprite->x + SIZE_JOUEUR] != ' '){
                //Compter le nombre d'espace avant d'arriver au bloc, et placer le joueur contre le bloc interdit
                for (int y= sprite->y; y<SIZE_JOUEUR; y++){
                    if (world->map[y][sprite->x] != ' '){
                        compteur++;
                    }
                }
                sprite->x += compteur;
            }
            break;
        case 2:
            //déplace vers la droite
            sprite->x += sprite->v;
            if (world->map[sprite->y][sprite->x + SIZE_JOUEUR] != ' ' || world->map[sprite->y + SIZE_JOUEUR][sprite->x + SIZE_JOUEUR] != ' '){
            //Compter le nombre d'espace avant d'arriver au bloc, et placer le joueur contre le bloc interdit
            for (int x= sprite->x; x<SIZE_JOUEUR; x++){
                if (world->map[sprite->y][x] == ' '){
                    compteur++;
                }
            }
            sprite->x -= compteur;
            }
            break;
        case 3:
        //déplace vers la gauche
        sprite->x -= sprite->v;
        if (world->map[sprite->y][sprite->x] != ' ' || world->map[sprite->y + SIZE_JOUEUR][sprite->x] != ' '){
            //Compter le nombre d'espace avant d'arriver au bloc, et placer le joueur contre le bloc interdit
            for (int x= sprite->x; x<SIZE_JOUEUR; x++){
                if (world->map[sprite->y][x] != ' '){
                    compteur++;
                }
            }
            sprite->x += compteur;
        }
        break;
    }
        
    limites_externes(sprite, world);
    place_sprite_on_map(sprite, world);


}

void gestion_events(SDL_Event *event, world_t *world){

    SDL_PollEvent(event);
    switch(event->type){
        case SDL_QUIT:
            world->gameover = 1; break;
        case SDL_KEYDOWN:
            switch(event->key.keysym.sym){
                case SDLK_ESCAPE:
                    world->gameover = 1; break;
                //Déplacement du joueur
                case SDLK_z:
                    set_haut(&world->joueur);
                    break;
                case SDLK_s:
                    set_bas(&world->joueur);
                    break;
                case SDLK_d:
                    set_droite(&world->joueur);
                    break;
                case SDLK_q:
                    set_gauche(&world->joueur);
                    break;
                //case SDLK_SPACE:
                
            }
    }
}

char** init_map (){
    const char* nomFichier = "Ressources/map.txt";
    int hauteur = SCREEN_HEIGHT;
    int largeur = SCREEN_WIDTH;
    char** tab = allouer_tab_2D(hauteur, largeur);
    for (int i=0; i<hauteur; i++){
        for (int j=0; j<largeur; j++){
            tab[i][j] = ' '; //Rempli les zones accessibles avec un espaces

            //Limites extérieures du terrain remplis avec 'X'
            if (j<= largeur*0.1 || j>= largeur*0.9 || i<= hauteur*0.1 || i>= hauteur*0.9){
                tab[i][j] = 'X';
            }

            // Zone de déplacement interdit au joueurs; zones de travail:
            if((j>largeur*0.1 && j<largeur*0.2 && i>hauteur*0.1 && i<hauteur*0.6) || (j>largeur*0.1 && j<=largeur*0.5 && i>hauteur*0.1 && i<hauteur*0.2 ) || (j>largeur*0.5 && j<largeur*0.6 && i>hauteur*0.1 && i<hauteur*0.4)){
                tab[i][j] = 'P';
            }

            //Emplacement du frigo
            if (j>largeur*0.1 && j<largeur*0.4 && i>hauteur*0.7 && i<hauteur*0.9){
                tab[i][j] = 'F';
            }

            //Emplacement des fourneaux
            if (j>largeur*0.8 && j<largeur*0.9 && i>hauteur*0.1 && i<hauteur*0.4){
                tab[i][j] = 'f';
            }

            //Emplacement du lavabo
            if (j>largeur*0.5 && j<largeur*0.8 && i>hauteur*0.8 && i<hauteur*0.9){
                tab[i][j] = 'L';
            }
            //Zone d'envoi
            if (j>=largeur*0.9 && j<largeur && i>hauteur*0.5 && i<hauteur*0.7){
                tab[i][j] = 'e';
            }

            //Poubelle
            if (j>largeur*0.8 && j<largeur*0.9 && i>hauteur*0.8 && i<hauteur*0.9){
                tab[i][j] = 't';
            }
        }
    }
    genere_fichier(nomFichier, tab, hauteur, largeur);
    return tab;
}
    void update_data (world_t *world){
        const char *nomSave = "Ressouces/save.txt";



        genere_fichier(nomSave, world->map, SCREEN_HEIGHT, SCREEN_WIDTH);
}