Skip to content

Commit

Permalink
Merge manuel du timer
Browse files Browse the repository at this point in the history
  • Loading branch information
Pyrodaz committed May 25, 2024
1 parent 42f153f commit 46147b9
Show file tree
Hide file tree
Showing 11 changed files with 87 additions and 31 deletions.
5 changes: 3 additions & 2 deletions CosmicYonder.h
Original file line number Diff line number Diff line change
Expand Up @@ -205,15 +205,16 @@ void desapparition_ennemi(Ennemi* ennemi, Salle* salle,Joueur* joueur, WINDOW* w
void perte_vie_ennemi(Ennemi* ennemi, Joueur* joueur);

//OBJETS
//Crée un objet
//Crée et fait apparaitre un objet dans une salle en fonction des objets spéciaux apparus,des salles restantes et des portes non ouvertes
Objet apparition_objet(Salle* salle, int* objets_speciaux_apparus, int sallesrest, int portesNonOuvertes);
//permet de recuperer un objet
void recup_objet(Joueur* joueur, Salle* salle, Objet* objet, int* nb_obj_inv, int* nb_obj_spe_inv);
//fait disparaitre un objet quand le joueur le ramasse
void desapparition_objet(Objet* objet, Salle* salle, Joueur* joueur, WINDOW* win);

//HUD
HUD * hudJeu(int x, int y, int hauteur, int largeur, Joueur * joueur);
//Fait apparaitre l'interface graphique pour les informations du joueur et de la partie
HUD * hudJeu(int x, int y, int hauteur, int largeur, Joueur * joueur,int minuteur);

// SAUVEGARDE
void saveGame(Partie partie);
Expand Down
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
CC=gcc
CFLAGS=-W -Wall -ggdb -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -std=gnu11
LDFLAGS=-lncursesw -fsanitize=address
LDFLAGS=-lncursesw
EXEC=jeu

all: jeu
Expand Down
36 changes: 24 additions & 12 deletions ennemi.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
//ce fichier contient les fonctions nécessaires au fonctionnement des ennemis

Ennemi initEnnemi(int x, int y, int pv, int att, int def){
/* Initialise les stats et la position de l'ennemi à sa création*/
if(pv<1){
pv=1;
}
Expand All @@ -12,8 +13,8 @@ Ennemi initEnnemi(int x, int y, int pv, int att, int def){
def=1;
}
Ennemi ennemi;
ennemi.xRelatif = x;
ennemi.yRelatif = y;
ennemi.xRelatif = x; //abscisse relative par rapport à l'origine de la salle
ennemi.yRelatif = y; //ordonnée relative par rapport à l'origine de la salle
ennemi.pv = pv;
ennemi.att = att;
ennemi.def = def;
Expand All @@ -27,14 +28,16 @@ void ennemietat(Ennemi* ennemi,Salle* salle, Joueur* joueur, WINDOW* win){
if(salle==NULL){
exit(2);
}
ennemi->xGlobal=salle->x+ennemi->xRelatif;
ennemi->yGlobal=salle->y+ennemi->yRelatif;
ennemi->xGlobal=salle->x+ennemi->xRelatif; //abscisse du point d'apparition du monstre
ennemi->yGlobal=salle->y+ennemi->yRelatif; //ordonnée du point d'apparition du monstre
if(ennemi->pv<=0){
desapparition_ennemi(ennemi,salle,joueur, win);
}
}

void ennemimv(Ennemi* ennemi,Salle* salle, Joueur* joueur, WINDOW* mainwin){
/* Fonction qui gère les déplacements de l'ennemi par rapport à sa position par
rapport au joueur*/
if(ennemi==NULL){
exit(3);
}
Expand All @@ -51,50 +54,59 @@ void ennemimv(Ennemi* ennemi,Salle* salle, Joueur* joueur, WINDOW* mainwin){
/*ces conditions permettent a l'ennemi de se deplacer
compare la position de l'ennemi et du joueur et modifie la position de l'ennemi afin qu'il se rapproche du joueur*/

if(ennemi->xGlobal>joueur->x){
mouv = mvwinch(mainwin, ennemi->yGlobal, ennemi->xGlobal-1);
if(ennemi->xGlobal>joueur->x){ //ennemi en bas du joueur
mouv = mvwinch(mainwin, ennemi->yGlobal, ennemi->xGlobal-1); //mouvement vers le haut
//L'ennemi se déplace si la case d'arrivée du mouv est un objet ou du vide
if(mouv==' '||mouv==*BOUTEILLE_O2_CHR || mouv==*BANDAGE_CHR ||mouv==*CLE_CHR
||mouv==*GENERATEUR_CHR || mouv==*REACTEUR_CHR ||mouv==*PC_CHR){
ennemi->xRelatif--;
}
else if(mouv=='o'){
//Sinon si la case d'arrivée est le joueur, le joueur perd des pvs et le monstre reste à sa place.
perte_vie_joueur(joueur, ennemi);
}
}
else if(ennemi->xGlobal<joueur->x){
mouv = mvwinch(mainwin, ennemi->yGlobal, ennemi->xGlobal+1);
else if(ennemi->xGlobal<joueur->x){ //ennemi en haut du joueur
mouv = mvwinch(mainwin, ennemi->yGlobal, ennemi->xGlobal+1); //mouv vers le bas
//L'ennemi se déplace si la case d'arrivée du mouv est un objet ou du vide
if(mouv==' '||mouv==*BOUTEILLE_O2_CHR || mouv==*BANDAGE_CHR ||mouv==*CLE_CHR
||mouv==*GENERATEUR_CHR || mouv==*REACTEUR_CHR ||mouv==*PC_CHR){
ennemi->xRelatif++;
}
else if(mouv=='o'){
//Sinon si la case d'arrivée est le joueur, le joueur perd des pvs et le monstre reste à sa place.
perte_vie_joueur(joueur, ennemi);
}
}
else if(ennemi->yGlobal>joueur->y){
mouv = mvwinch(mainwin, ennemi->yGlobal-1, ennemi->xGlobal);
else if(ennemi->yGlobal>joueur->y){ //ennemi à droite du joueur
mouv = mvwinch(mainwin, ennemi->yGlobal-1, ennemi->xGlobal); //mouv vers la gauche
//L'ennemi se déplace si la case d'arrivée du mouv est un objet ou du vide
if(mouv==' '||mouv==*BOUTEILLE_O2_CHR || mouv==*BANDAGE_CHR ||mouv==*CLE_CHR
||mouv==*GENERATEUR_CHR || mouv==*REACTEUR_CHR ||mouv==*PC_CHR){
ennemi->yRelatif--;
}
else if(mouv=='o'){
//Sinon si la case d'arrivée est le joueur, le joueur perd des pvs et le monstre reste à sa place.
perte_vie_joueur(joueur, ennemi);
}
}
else if(ennemi->yGlobal<joueur->y){
mouv = mvwinch(mainwin, ennemi->yGlobal+1, ennemi->xGlobal);
else if(ennemi->yGlobal<joueur->y){ //ennemi à gauche du joueur
mouv = mvwinch(mainwin, ennemi->yGlobal+1, ennemi->xGlobal); //mouv vers la droite
//L'ennemi se déplace si la case d'arrivée du mouv est un objet ou du vide
if(mouv==' '||mouv==*BOUTEILLE_O2_CHR || mouv==*BANDAGE_CHR ||mouv==*CLE_CHR
||mouv==*GENERATEUR_CHR || mouv==*REACTEUR_CHR ||mouv==*PC_CHR){
ennemi->yRelatif++;
}
else if(mouv=='o'){
//Sinon si la case d'arrivée est le joueur, le joueur perd des pvs et le monstre reste à sa place.
perte_vie_joueur(joueur, ennemi);
}

}
}

void afficheEnnemi(Ennemi* ennemi, WINDOW* mainwin){
/* Affiche l'ennemi sur l'écran de ncurses*/
if(ennemi==NULL){
exit(7);
}
Expand Down
2 changes: 1 addition & 1 deletion graine.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ int creation_graine(EntreeTexte * graineEntree){
/* L'utilisateur rentre un entier qui crée la graine qui sert à générer le donjon de manière procédurale.
Si l'entrée est incorrecte ou nulle, la graine est choisie aléatoirement.*/

int graine = -1;
int graine = -1; //Initialisation graine
int verif_int = 0; //Sert à vérifier que la graine est bien un entier.
srand(time(NULL));

Expand Down
12 changes: 10 additions & 2 deletions interactions.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ void interactions(int touche, Joueur* joueur, Salle ** carte, int salles_existan
Les conditions verifient que le caractere d a cote est un espace ou une porte, pour les collisions
si l'espace est libre, l'ensemble des salles est deplace dans la direction opposee a la fleche pressee*/
case KEY_UP:
mouv = mvwinch(mainwin, joueur->y-1, joueur->x); //Le mouvement est vers le bas
mouv = mvwinch(mainwin, joueur->y-1, joueur->x); //Le mouvement est vers le haut
//Si la case est un objet ou une porte ou est vide le carte se déplace relativement au joueur selon le sens opposé de mouv
if(mouv==' '||mouv==*BOUTEILLE_O2_CHR || mouv==*BANDAGE_CHR ||mouv==*CLE_CHR
||mouv==*GENERATEUR_CHR || mouv==*REACTEUR_CHR ||mouv==*PC_CHR){
for(int i = 0; i < salles_existantes; i++) {
Expand All @@ -31,6 +32,7 @@ void interactions(int touche, Joueur* joueur, Salle ** carte, int salles_existan
}
}
else{
//Sinon si la case à l'arrivée du mouv est un ennemi : l'ennemi perd des pvs et le joueur reste à sa place
for(int i = 0; i < salles_existantes; i++) {
if(carte[i]->ennemi!=NULL && carte[i]->ennemi->xGlobal == joueur->x && carte[i]->ennemi->yGlobal == joueur->y-1){
perte_vie_ennemi(carte[i]->ennemi, joueur);
Expand All @@ -39,7 +41,8 @@ void interactions(int touche, Joueur* joueur, Salle ** carte, int salles_existan
}
break;
case KEY_DOWN:
mouv = mvwinch(mainwin, joueur->y+1, joueur->x); //Le mouvement est vers le haut
mouv = mvwinch(mainwin, joueur->y+1, joueur->x); //Le mouvement est vers le bas
//Si la case est un objet ou une porte ou est vide le carte se déplace relativement au joueur selon le sens opposé de mouv
if(mouv==' '||mouv==*BOUTEILLE_O2_CHR || mouv==*BANDAGE_CHR ||mouv==*CLE_CHR
||mouv==*GENERATEUR_CHR || mouv==*REACTEUR_CHR ||mouv==*PC_CHR){
for(int i = 0; i < salles_existantes; i++) {
Expand All @@ -53,6 +56,7 @@ void interactions(int touche, Joueur* joueur, Salle ** carte, int salles_existan
}
}
else{
//Sinon si la case à l'arrivée du mouv est un ennemi : l'ennemi perd des pvs et le joueur reste à sa place
for(int i = 0; i < salles_existantes; i++) {
if(carte[i]->ennemi!=NULL && carte[i]->ennemi->xGlobal == joueur->x && carte[i]->ennemi->yGlobal == joueur->y+1){
perte_vie_ennemi(carte[i]->ennemi, joueur);
Expand All @@ -62,6 +66,7 @@ void interactions(int touche, Joueur* joueur, Salle ** carte, int salles_existan
break;
case KEY_LEFT:
mouv = mvwinch(mainwin, joueur->y, joueur->x-1); //Le mouvement est à gauche
//Si la case est un objet ou une porte ou est vide le carte se déplace relativement au joueur selon le sens opposé de mouv
if(mouv==' '||mouv==*BOUTEILLE_O2_CHR || mouv==*BANDAGE_CHR ||mouv==*CLE_CHR
||mouv==*GENERATEUR_CHR || mouv==*REACTEUR_CHR ||mouv==*PC_CHR){
for(int i = 0; i < salles_existantes; i++) {
Expand All @@ -75,6 +80,7 @@ void interactions(int touche, Joueur* joueur, Salle ** carte, int salles_existan
}
}
else{
//Sinon si la case à l'arrivée du mouv est un ennemi : l'ennemi perd des pvs et le joueur reste à sa place
for(int i = 0; i < salles_existantes; i++) {
if(carte[i]->ennemi!=NULL && carte[i]->ennemi->xGlobal == joueur->x-1 && carte[i]->ennemi->yGlobal == joueur->y){
perte_vie_ennemi(carte[i]->ennemi, joueur);
Expand All @@ -84,6 +90,7 @@ void interactions(int touche, Joueur* joueur, Salle ** carte, int salles_existan
break;
case KEY_RIGHT:
mouv = mvwinch(mainwin, joueur->y, joueur->x+1); //Le mouvement est à droite
//Si la case est un objet ou une porte ou est vide le carte se déplace relativement au joueur selon le sens opposé de mouv
if(mouv==' '||mouv==*BOUTEILLE_O2_CHR || mouv==*BANDAGE_CHR ||mouv==*CLE_CHR
||mouv==*GENERATEUR_CHR || mouv==*REACTEUR_CHR ||mouv==*PC_CHR){
for(int i = 0; i < salles_existantes; i++) {
Expand All @@ -97,6 +104,7 @@ void interactions(int touche, Joueur* joueur, Salle ** carte, int salles_existan
}
}
else{
//Sinon si la case à l'arrivée du mouv est un ennemi : l'ennemi perd des pvs et le joueur reste à sa place
for(int i = 0; i < salles_existantes; i++) {
if(carte[i]->ennemi!=NULL && carte[i]->ennemi->xGlobal == joueur->x+1 && carte[i]->ennemi->yGlobal == joueur->y){
perte_vie_ennemi(carte[i]->ennemi, joueur);
Expand Down
3 changes: 2 additions & 1 deletion joueur.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ void maj_niveau(Joueur* joueur){
}

void perte_vie_joueur(Joueur* joueur, Ennemi* ennemi){
/* Le joueur perd de la vie quand un ennemi est sur sa case en fonction de la défense du joueur et de l'attaque de l'ennemi */
/* Le joueur perd de la vie quand un ennemi est sur sa case en fonction
de la défense du joueur et de l'attaque de l'ennemi */
if(joueur==NULL){
exit(3);
}
Expand Down
19 changes: 16 additions & 3 deletions main.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
#include <ncurses.h>

Partie * creerPartie() {
/* Fonction servant à créer la sauvegarde de la partie en allouant les différents
éléments nécessaires pour la restaurer*/
Partie * partie = NULL;
partie = malloc(sizeof(Partie));
if(partie == NULL) {
Expand Down Expand Up @@ -46,7 +48,8 @@ int main()
int etatJeu = 1; // permet de quitter le jeu si besoin
int hauteur, longueur;
int nsalles = MAX_SALLES;
int minuteur = MINUTEUR;
int minuteur = MINUTEUR; //minuteur en secondes. Si celui-ci atteint 0 le jeu est perdu
int decr_minuteur = 0; //Variable servant à convertir les tours de boucles en une seconde pour décrémenter le minuteur
Partie * partie = creerPartie();

getmaxyx(stdscr,hauteur,longueur); //recupere la taille du terminal
Expand Down Expand Up @@ -132,7 +135,7 @@ int main()
break;
}

HUD * hud = hudJeu(0, hauteur - hauteur/6, hauteur / 6, longueur, partie->joueur);
HUD * hud = hudJeu(0, hauteur - hauteur/6, hauteur / 6, longueur, partie->joueur, minuteur);
Texte * resTxt = respawnTexte(longueur/2 - longueur/5, hauteur/2 - hauteur/5, longueur);

//init ennemi
Expand Down Expand Up @@ -222,7 +225,7 @@ int main()
}
}
mvwaddch(mainwin,partie->joueur->y,partie->joueur->x, 'o'); //deplace le joueur a la nouvelle position
renduHUD(mainwin, hud);
renduHUD(mainwin, hud, minuteur);

wrefresh(mainwin);
touche = wgetch(mainwin);
Expand All @@ -234,6 +237,16 @@ int main()
}
partie->mvEnnemic++;
napms(1000 / IMAGES_PAR_SECONDE);
/*decr_ minuteur ajuste le minuteur pour
qu'il retire bien 1 seconde par seconde en jeu en comptant les images par secondes*/
decr_minuteur++;
if(decr_minuteur >= IMAGES_PAR_SECONDE){
decr_minuteur = 0;
minuteur--;
}
if(minuteur <= 0){
etatJeu = 0;
}
}

saveGame(*partie);
Expand Down
2 changes: 2 additions & 0 deletions salles.c
Original file line number Diff line number Diff line change
Expand Up @@ -531,6 +531,8 @@ void libereSalle(Salle * salle) {
}

int compteurPortesNonOuvertes(Salle ** carte, int salles_existantes){
/* Compte le nombre de portes non ouvertes sur la carte (sert à
forcer l'apparition des objets à récupérer s'ils ne sont pas apparus)*/
int compteur = 0;
for(int i=0; i<salles_existantes;i++){
for(int j=0; j<carte[i]->nportes;j++){
Expand Down
31 changes: 25 additions & 6 deletions ui/hud.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
#include "../json/json.h"


HUD * hudJeu(int x, int y, int hauteur, int largeur, Joueur * joueur) {
HUD * hudJeu(int x, int y, int hauteur, int largeur, Joueur * joueur, int minuteur) {
HUD * hud = NULL;

StatusBar * pv = NULL;
Expand All @@ -24,15 +24,14 @@ HUD * hudJeu(int x, int y, int hauteur, int largeur, Joueur * joueur) {
Texte * nameText = NULL;
Texte * attText = NULL;
Texte * defText = NULL;
Texte * minuteurTexte = NULL;

char ** atkStr = NULL;
char ** defStr = NULL;
char ** nivStr = NULL;
char ** xpStr = NULL;
char ** pvStr = NULL;



char ** minuteurStr = NULL;

char ** nameStr = NULL;

Expand Down Expand Up @@ -92,11 +91,22 @@ HUD * hudJeu(int x, int y, int hauteur, int largeur, Joueur * joueur) {
exit(1);
}

minuteurStr = malloc(sizeof(char*));
if(minuteurStr == NULL){
logMessage(ERROR, "Erreur d'allocation de mémoire pour le minuteur");
exit(1);

}
minuteurStr[0] = malloc(sizeof(char) * 10);
if(minuteurStr[0] == NULL){
logMessage(ERROR, "Erreur d'allocation de mémoire pour le minuteur");
exit(1);
}

*nivStr = strcpy(*nivStr, "Niveau : ");
*xpStr = strcpy(*xpStr, "XP : ");
*pvStr = strcpy(*pvStr, "PV : ");


nameStr = malloc(sizeof(char*));
if(nameStr == NULL){
logMessage(ERROR, "Erreur d'allocation de mémoire pour le nom du joueur");
Expand All @@ -111,6 +121,7 @@ HUD * hudJeu(int x, int y, int hauteur, int largeur, Joueur * joueur) {
sprintf(*nameStr, "Nom : %s", joueur->nom);
sprintf(*atkStr, "Attaque : %d", joueur->att);
sprintf(*defStr, "Défense : %d", joueur->def);
sprintf(*minuteurStr, "Minuteur : %d", minuteur);

pv = malloc(sizeof(StatusBar));
if(pv == NULL){
Expand Down Expand Up @@ -158,6 +169,12 @@ HUD * hudJeu(int x, int y, int hauteur, int largeur, Joueur * joueur) {
logMessage(ERROR, "Erreur d'allocation de mémoire pour le texte de la défense");
exit(1);
}
minuteurTexte = malloc(sizeof(Texte));
if(minuteurTexte == NULL){
logMessage(ERROR, "Erreur d'allocation de mémoire pour le texte du minuteur");
exit(1);

}

pv = creerStatusBar(x + 11, y + hauteur/2, 10, 2, joueur->pv/10);
xp = creerStatusBar(x + 11, y + hauteur/2 + 1, 10, 3, joueur->xp/10);
Expand All @@ -169,15 +186,17 @@ HUD * hudJeu(int x, int y, int hauteur, int largeur, Joueur * joueur) {
nameText = creerTexte(x + 1, y + hauteur/2 - 2, nameStr, 1, 7);
attText = creerTexte(x + largeur/3 - 10, y + hauteur/2, atkStr, 1, 7);
defText = creerTexte(x + largeur/3 - 10, y + hauteur/2 + 1, defStr, 1, 7);
minuteurTexte = creerTexte(x + largeur/3 - 10,y+hauteur/2 + 2,minuteurStr,1,7);

hud = creerHUD(x, y, hauteur, largeur, 1, 6, 3);
hud = creerHUD(x, y, hauteur, largeur, 1, 7, 3);

hud->textWidgets[0] = pvText;
hud->textWidgets[1] = xpText;
hud->textWidgets[2] = nivText;
hud->textWidgets[3] = nameText;
hud->textWidgets[4] = attText;
hud->textWidgets[5] = defText;
hud->textWidgets[6] = minuteurTexte;

hud->statBarWidgets[0] = pv;
hud->statBarWidgets[1] = xp;
Expand Down
4 changes: 2 additions & 2 deletions ui/ui.c
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,7 @@ HUD * creerHUD(int x, int y, int hauteur, int largeur, int outlineColor, int nbT
return hud;
}

void renduHUD(WINDOW * win, HUD * hud) {
void renduHUD(WINDOW * win, HUD * hud, int minuteur) {
// nettoyage de la zone
for(int i = 0; i < hud->hauteur; i++) {
for(int j = 0; j < hud->largeur; j++) {
Expand All @@ -302,7 +302,7 @@ void renduHUD(WINDOW * win, HUD * hud) {
mvwaddch(win, hud->y + hud->hauteur - 1, hud->x + hud->largeur - 1, ACS_LRCORNER);
wattroff(win, COLOR_PAIR(hud->outlineColor));


sprintf(hud->textWidgets[6]->texte[0], "Minuteur : %d", minuteur);

for(int i = 0; i < hud->nbText; i++) {
renduTexte(win, *hud->textWidgets[i]);
Expand Down
Loading

0 comments on commit 46147b9

Please sign in to comment.