Skip to content
Snippets Groups Projects
player.c 2.75 KiB
/**
 * @file player.c
 * @author Efe ERKEN (efe.erken@etu.unistra.fr)
 * @brief Fichier source contenant la fonction pour traiter le mouvement du joueur
 * @version 0.1
 * @date 2022-11-14
 *
 * @copyright Copyright (c) 2022
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include "player.h"
#include "grid.h"

/**
 * @brief Fonction qui bouge le joueur dans la direction voulue dans le niveau
 *
 * @param [in,out] G Pointeur sur la structure du niveau pour lire les cases de celui-ci et les modifier
 * @param [in] D Une direction entre le haut, le bas, la gauche et la droite
 *
 * @pre @a G doit être non @c NULL et pointer sur la structure allouée
 * @post Modification de la structure pointée par @a G
 *
 * Cette fonction prend en paramètre deux arguments tels qu'un pointeur vers la structure
 * du niveau de jeu et une direction. Elle bouge le joueur dans la direction donnée si possible
 * en mettant à jour les cases du niveau dans la structure. Si dans la direction voulue, il n'y a
 * pas de mur ou de boite, alors elle change la case dans cette direction par un joueur ou une
 * superposition de joueur et d'objectif si la case cible est un objectif
 * et elle change la case où était le joueur auparavant par du vide ou un objectif si la case est
 * une superposition de joueur et d'objectif avant.
 */
void move_player(grid* G, enum Direction D) {
    int target_row = G->player.y, target_column = G->player.x;
    switch (D) {
        case LEFT:
            target_column--;
            break;
        case BOTTOM:
            target_row++;
            break;
        case TOP:
            target_row--;
            break;
        case RIGHT:
            target_column++;
    }
    enum CaseType target = G->game_grid[target_row][target_column];
    enum CaseType player = G->game_grid[G->player.y][G->player.x];
    if (target == WALL || target == BOX) {
        return;
    } else if (target == GOAL) {
        if (player == PLAYER) {
            G->game_grid[target_row][target_column] = PLAYER_GOAL;
            G->game_grid[G->player.y][G->player.x] = NONE;
        } else if (player == PLAYER_GOAL) {
            G->game_grid[target_row][target_column] = PLAYER_GOAL;
            G->game_grid[G->player.y][G->player.x] = GOAL;
        }
    } else if (target == NONE) {
        if (player == PLAYER) {
            G->game_grid[target_row][target_column] = PLAYER;
            G->game_grid[G->player.y][G->player.x] = NONE;
        } else if (player == PLAYER_GOAL) {
            G->game_grid[target_row][target_column] = PLAYER;
            G->game_grid[G->player.y][G->player.x] = GOAL;
        }
    } else {
        fprintf(stderr, "Error this level map has features unmanaged by the game\n");
        exit(-1);
    }
    G->player.x = target_column;
    G->player.y = target_row;
}