Skip to content
Snippets Groups Projects
logique.h 9.23 KiB
/**
 * \file logique.h
 * \brief Entête du module logique.c
 * \author Erwan FINEL et Guillaume Vautrin
 * \version 1.0
 * \date 2 Avril 2020
 */

#ifndef LOGIQUE_H
#define LOGIQUE_H

#include <SDL2/SDL.h>
#include <SDL2/SDL_ttf.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "constantes.h"
#include "math.h"
#include "gestion_fichiers.h"
#include <string.h>


/**
 * \brief Representation d'un sprite
 */
struct sprite_s{
    char nom; /*!<  char du sprite utilisé sur map*/
    int v; /*!< vitesse du sprite*/
    int etat; /*!< état du sprite; permet de varier son apparence */
    int is_visible; /*!<  Gère la visibilité d'un sprite; 1 si visible, 0 sinon */
    SDL_Rect rect; /*!<  structure de position du sprite*/
    int cuisson; /*!< Etat de la cuisson*/
};

/**
 * \brief Type qui correspond au sprite
 */

typedef struct sprite_s sprite_t;


/**
 * \brief Representation des stocks, du menu commandé par le client, et du score.
 */
struct stock_s{
    sprite_t stock_tomate[QTE_STOCK]; /*!<  stock de tomates*/
    sprite_t stock_pain[2];  /*!< stock de pains*/
    sprite_t stock_steak[QTE_STOCK];  /*!<  stock de steaks*/
    sprite_t stock_salade[QTE_STOCK];  /*!<  stock de salade*/
    sprite_t stock_fromage[QTE_STOCK];  /*!<  stock de fromage*/
    sprite_t stock_cornichon[QTE_STOCK];  /*!<  stock de cornichon*/
    int score;  /*!<  Score actuel*/
    char commande[5]; /*!< tableau correspondant à un plat à faire*/
};
/**
 * \brief Type qui correspond au menu et aux stocks
 */
typedef struct stock_s stock_t;

struct world_s{
    int gameover; /*!< Champ indiquant si l'on est à la fin du jeu */
    sprite_t joueur; /*!< Sprite du joueur */
    sprite_t four; /*!< Sprite du four */
    sprite_t frigo; /*< Sprite du frigo */
    sprite_t lavabo; /*< Sprite du lavabo */
    sprite_t envoi; /*< Sprite de la zone d'envoi */
    sprite_t poubelle; /*< Sprite de la poubelle */
    sprite_t comptoire[NB_COMPT_1]; /*< Tableau de sprite de comptoir */
    sprite_t en_cuisine[INGREDIENT_DISPO]; /*< Tableau d'ingrédients */
    stock_t etat_stocks;  /*!< Structure gérant les stocks et le score*/
    int compteur_plats; /*!< Nombre d'ennemis étant sorti de l'écran */
    int attente; /*!< Compte le nombre de tours avant la fin de la partie*/
    char** map; /*!< tableau de caractère correspondant à l'état de la map actuel */
};

/**
 * \brief Type qui correspond aux données du monde
 */
typedef struct world_s world_t;

/**
 * \brief La fonction initialise un sprite
 * \param sprite pointeur vers le sprite à initialiser
 * \param nom charactère représentant le sprite sur la map
 * \param x gestion de la localisation sur l'axe des abscisses
 * \param y gestion de la localisation sur l'axe des ordonnés
 * \param w largeur du sprite
 * \param h hauteur du sprite
 * \param v vitesse du sprite
 * \param state état du sprite
 */
void init_sprite(sprite_t *sprite, char nom, int x, int y, int w, int h, int v, int state);

/**
 * @brief Initialise un ingrédient et son sprite
 * 
 * @param ingre pointeur vers le sprite d'un ingrédient à initialiser
 * @param nom Caractère représentant l'ingredient sur la map
 * @param x Localisation sur l'axe des abscisses
 * @param y Localisation sur l'axe des ordonnées
 * @param w Largeur
 * @param h Hauteur
 * @param v Vitesse
 * @param state Etat du sprite
 */
void init_ingre (sprite_t* ingre, char nom, int x, int y, int w, int h, int v, int state);

/**
 * @brief Initialise les stocks et l'état de complétion des burgers
 * 
 * @param stocks Etat des stocks
 * @param world Données du monde
 */
void init_stocks(stock_t* stocks, sprite_t* zone_stockage);

/**
 * @brief Initialise le tableau de commande
 * @param stocks 
 */
void init_commande(stock_t *stocks);

/**
 * @brief Génère les sprites rendu disponible selon le bon de commande actuel
 * @param world Données du monde du jeu
 * @param stocks Données des ingrédients en stock / commande / score
 */
void init_ingredient_cuisine(world_t * world, stock_t *stocks);

/**
 * @brief Affiche certains éléments d'un sprite
 * @param sprite 
 */
void print_sprite (sprite_t *sprite);

/**
 * @brief Génération d'une valeur aléatoire entre a (inclus) et b (exclu)
 * @param a valeur minimal
 * @param b valeur maximal exclu
 * @return int 
 */
int aleatoire (int a, int b);

/**
 * @brief Fonction initialisant un unique sprite (meuble)
 * 
 * @param sprite Sprite à initialiser
 * @param nom Caractère du sprite sur la carte
 * @param largeur 
 * @param hauteur 
 * @param map Carte du jeu, sous forme de tableau de caractère
 */
void build_sprite_unique (sprite_t *sprite, char nom, int largeur, int hauteur, char** map);

/**
 * @brief Initialise plusieurs sprites du même type
 * 
 * @param sprite Sprite à initialiser
 * @param nomSprite Caractère permettant d'identifier les instances du sprite sur la carte
 * @param largeur 
 * @param hauteur 
 * @param compt nombre de sprite dans le tableau
 * @param map Carte du jeu sous forme de tableau de caractères
 */
void build_sprites_tab (sprite_t *sprite, char nomSprite, int largeur, int hauteur, int* compt, char** map);

/**
 * @brief retourne le SDL_Rect d'un sprite
 * 
 * @param sprite 
 * @return SDL_Rect 
 */
SDL_Rect get_rect (sprite_t *sprite);


/**
 * @brief récupère la valeur de la cuisson
 * 
 * @param ingre 
 * @return int état de la cuisson
 */
int get_cuisson (sprite_t *ingre);

/**
 * @brief Modifie la valeur de la cuisson
 * 
 * @param ingre 
 * @param cuisson 
 */
void set_cuisson(sprite_t *ingre, int cuisson);

/**
 * @brief signale que l'ingrédient est posée
 * 
 * @param ingredient 
 */
void set_posee (sprite_t* ingredient);

/**
 * @brief Signale que l'ingrédient est portée
 * 
 * @param ingredient 
 */
void set_portable (sprite_t* ingredient);

/**
 * @brief Ajoute à la position du sprite les valeurs indiquées
 * 
 * @param sprite 
 * @param x_move valeur à ajouter sur l'axe des abscisses
 * @param y_move valeur à ajouter sur l'axe des ordonnées
 */
void modif_position (sprite_t *sprite, int x_move, int y_move);

/**
 * \brief Vérifie si deux sprites sont en collisions
 * \param spr1 Sprite
 * \param spr2 Sprite
 * \param SDL_bool 0 si faux, 1 si vrai
 */
SDL_bool has_collided (sprite_t* spr1, sprite_t* spr2);


/**
 * \brief Vérifie si deux sprites sont en collisions
 * \param spr_move Sprite capable de se déplacer
 * \param spr_fixed Sprite immobile
 */
void handle_collision (sprite_t* spr_move, sprite_t* spr_fixed);

/**
 * @brief Déplace un ingrédient tant que le joueur le porte
 * 
 * @param joueur 
 * @param ingredient 
 */
void handle_deplacement_ingredient (sprite_t* joueur, sprite_t* ingredient);

/**
 * @brief donne le score actuelle de la partie
 * 
 * @param stocks 
 * @return int 
 */
int get_score(stock_t* stocks);

/**
 * \brief Gère les collisions du jeu
 * \param world Données du monde
 */
void limites_internes (world_t* world);

/**
 * \brief la fonction permet de rendre visible un sprite
 * \param sprite Les données d'un sprite
 */
void set_visible (sprite_t *sprite);

/**
 * \brief la fonction permet de rendre invisible un sprite
 * \param sprite Les données d'un sprite
 */
void set_invisible (sprite_t *sprite);

/**
 * @brief Sprite visible ou non
 * 
 * @param sprite 
 * @return int : 1 = visible, 0 = false
 */
int est_visible (sprite_t *sprite);

/**
 * \brief La fonction initialise les données du monde du jeu
 * \param world les données du monde
 */
void init_data(world_t * world);

/**
 * \brief retourne la valeur de fin de jeu (si 0: jeu continue)
 * \param world les données du monde
 * \return la valeur de fin de jeu (si 0: jeu continue)
 */
int estFini(world_t *world);

/**
 * \brief Gère les évenements en fonctions des entrées du joueur
 * \param event données des évenements
 * \param world les données du monde
 */
void gestion_events(SDL_Event *event, world_t *world);

/**
 * @brief Génère la map de départ du jeu
 * 
 * @return tableau correspondant au contenu de base de la map
 */
char** init_map ();


/**
 * @brief Indique que le sprite face le bas
 * 
 * @param sprite 
 */
void set_bas (sprite_t *sprite);

/**
 * @brief Indique que le sprite face le haut
 * 
 * @param sprite 
 */
void set_haut (sprite_t *sprite);

/**
 * @brief Indique que le sprite face vers la droite
 * 
 * @param sprite 
 */
void set_droite (sprite_t *sprite);

/**
 * @brief Indique que le sprite face vers la gauche
 * 
 * @param sprite 
 */
void set_gauche (sprite_t *sprite);

/**
 * @brief Retourne l'état du sprite
 * 
 * @param sprite 
 * @return int valeur de l'état actuel du sprite
 */
int return_state (sprite_t *sprite);

/**
 * @brief gestions des limites des murs 
 * 
 * @param sprite sprite pour lequel on test les limites
 * @param world données du monde
 */
void limites_externes (sprite_t *sprite);

/**
 * @brief Retire le sprite de la map - avant maj d'un déplacement
 * 
 * @param sprite sprite
 * @param world données du monde
 */
void reset_sprite_on_map (sprite_t *sprite, world_t *world);


/**
 * @brief Place le sprite sur la map - avant maj d'un déplacement
 * 
 * @param sprite 
 * @param world 
 */
void place_sprite_on_map (sprite_t *sprite, world_t *world);

/**
 * @brief Mets à jour les données du monde en fonction des évolutions et des limites du jeu
 * 
 * @param world Données du monde
 */
void update_data (world_t *world);

#endif