Skip to content

Commit

Permalink
ajout recup et despawn objet
Browse files Browse the repository at this point in the history
l objet disparait quand le joueur est dessus et appui sur e. la fonction de recup ne fonctionne pas encore
  • Loading branch information
LeTaitre committed May 25, 2024
1 parent f217876 commit 42f153f
Show file tree
Hide file tree
Showing 5 changed files with 137 additions and 20 deletions.
45 changes: 34 additions & 11 deletions CosmicYonder.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ typedef struct {
}Objet;

typedef struct{
Objet obTab[INV_TAILLE]; //l'inventaire est un tableau d'objets (a definir)
Objet obTab[INV_TAILLE]; //l'inventaire est un tableau d'objets
}Inventaire;

typedef struct{
Expand Down Expand Up @@ -144,11 +144,17 @@ typedef struct {
int mvEnnemic;
int objets_speciaux_apparus;
int salles_existantes;
int nb_obj_inv;
int nb_obj_spe_inv;
Salle ** carte;
}Partie;

//Fonctions

//GRAINE
int creation_graine(EntreeTexte * graineEntree); //Crée la graine de génération du jeu.

//SALLES
//Cette fonction permet de creer une salle a partir de dimensions fixees a l'aide de creerSalleProced
Salle * creerSalle(int taille_horizontale, int taille_verticale, int x, int y, int nportes,
int entree, int posEntree, WINDOW* win, int* sallesrest, int* objets_speciaux_apparus,int portesNonOuvertes);
Expand All @@ -161,14 +167,28 @@ void dessineSalles(WINDOW * win, Salle ** salle, int salles_existantes);
void dessineSalle(WINDOW * win, Salle * salle);
//libere l'emplacement memoire de la salle
void libereSalle(Salle * salle);

//PORTES
//fonction constructeur de la porte
Porte initPorte(int dir,int v,int h);
// Ouverture de porte
void ouvrirPorte(Salle ** carte, int indexSalleAct,int indexNouvSalle, int indexPorte, int dir);
//Compte les portes non ouvertes
int compteurPortesNonOuvertes(Salle ** carte, int salles_existantes);

//JOUEUR
//initialise la structure joueur
void initJoueur(Joueur* joueur);
//cette fonction gere les interactions du joueur avec le jeu, comme les mouvements ou les combats
void interactions(int touche, Joueur* joueur, Salle ** carte, int salles_existantes, WINDOW* mainwin);
void interactions(int touche, Joueur* joueur, Salle ** carte, int salles_existantes, WINDOW* mainwin, int* nb_obj_inv, int* nb_obj_spe_inv);
//Gère mise à jour du niveau du joueur en fonction de son expérience
void maj_niveau(Joueur* joueur);
//Gère la perte de vie du joueur
void perte_vie_joueur(Joueur* joueur, Ennemi* ennemi);
//fait reapparaitre le joueur en cas de mort
void reapparition_joueur(Joueur* joueur, Salle** carte, int salles_existantes);

//ENNEMIS
//initialise un ennemi à l'aide d'attributs passés en paramètre
Ennemi initEnnemi(int x, int y, int pv, int att, int def);
//calcule la position globale de l'ennemi
Expand All @@ -179,20 +199,23 @@ void ennemimv(Ennemi* ennemi,Salle* salle,Joueur* joueur, WINDOW* mainwin);
void afficheEnnemi(Ennemi* ennemi, WINDOW* mainwin);
//spawn ennemi
Ennemi* apparition_ennemi(Salle* salle);
void desapparition_ennemi(Ennemi* ennemi, Salle* salle,Joueur* joueur, WINDOW* win); //fait despawn l'ennemi quand il meurt
int creation_graine(EntreeTexte * graineEntree); //Crée la graine de génération du jeu.
//fait despawn l'ennemi quand il meurt
void desapparition_ennemi(Ennemi* ennemi, Salle* salle,Joueur* joueur, WINDOW* win);
//gere la perte de vie de l'ennemi
void perte_vie_ennemi(Ennemi* ennemi, Joueur* joueur);

void maj_niveau(Joueur* joueur); //Gère mise à jour du niveau du joueur en fonction de son expérience
void perte_vie_joueur(Joueur* joueur, Ennemi* ennemi); //Gère la perte de vie du joueur
void perte_vie_ennemi(Ennemi* ennemi, Joueur* joueur); //gere la perte de vie de l'ennemi
void reapparition_joueur(Joueur* joueur, Salle** carte, int salles_existantes); //fait reapparaitre le joueur en cas de mort
Objet creation_objet(Salle* salle, int* objets_speciaux_apparus); //Crée un objet
//OBJETS
//Crée un objet
Objet apparition_objet(Salle* salle, int* objets_speciaux_apparus, int sallesrest, int portesNonOuvertes);
int compteurPortesNonOuvertes(Salle ** carte, int salles_existantes); //Compte les portes non ouvertes
//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);

// SAUVEGARDE
// SAUVEGARDE
void saveGame(Partie partie);
Partie * loadGame();

Expand Down
42 changes: 39 additions & 3 deletions interactions.c
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#include "CosmicYonder.h"
#include "logger.h"

void interactions(int touche, Joueur* joueur, Salle ** carte, int salles_existantes, WINDOW* mainwin){
void interactions(int touche, Joueur* joueur, Salle ** carte, int salles_existantes, WINDOW* mainwin, int* nb_obj_inv, int* nb_obj_spe_inv){
if (joueur == NULL){
exit(1);
}
Expand All @@ -22,6 +22,12 @@ void interactions(int touche, Joueur* joueur, Salle ** carte, int salles_existan
||mouv==*GENERATEUR_CHR || mouv==*REACTEUR_CHR ||mouv==*PC_CHR){
for(int i = 0; i < salles_existantes; i++) {
carte[i]->y++;
//modifie la position des objets de la salle
for(int j=0;j<3;j++){
if(&(carte[i]->objets[j])!=NULL){
carte[i]->objets[j].y++;
}
}
}
}
else{
Expand All @@ -38,7 +44,12 @@ void interactions(int touche, Joueur* joueur, Salle ** carte, int salles_existan
||mouv==*GENERATEUR_CHR || mouv==*REACTEUR_CHR ||mouv==*PC_CHR){
for(int i = 0; i < salles_existantes; i++) {
carte[i]->y--;

//modifie la position des objets de la salle
for(int j=0;j<3;j++){
if(&(carte[i]->objets[j])!=NULL){
carte[i]->objets[j].y--;
}
}
}
}
else{
Expand All @@ -55,6 +66,12 @@ void interactions(int touche, Joueur* joueur, Salle ** carte, int salles_existan
||mouv==*GENERATEUR_CHR || mouv==*REACTEUR_CHR ||mouv==*PC_CHR){
for(int i = 0; i < salles_existantes; i++) {
carte[i]->x++;
//modifie la position des objets de la salle
for(int j=0;j<3;j++){
if(&(carte[i]->objets[j])!=NULL){
carte[i]->objets[j].x++;
}
}
}
}
else{
Expand All @@ -70,7 +87,13 @@ void interactions(int touche, Joueur* joueur, Salle ** carte, int salles_existan
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++) {
carte[i]->x--;
carte[i]->x--;
//modifie la position des objets de la salle
for(int j=0;j<3;j++){
if(&(carte[i]->objets[j])!=NULL){
carte[i]->objets[j].x--;
}
}
}
}
else{
Expand All @@ -81,6 +104,19 @@ void interactions(int touche, Joueur* joueur, Salle ** carte, int salles_existan
}
}
break;
case 'e':
//parcours chaque objet de la carte et appelle la fonction recup_objet si l objet existe
for(int i=0;i < salles_existantes; i++){
for(int j=0;j<3;j++){
if(&(carte[i]->objets[j])!=NULL){
if(carte[i]->objets[j].x == joueur->x && carte[i]->objets[j].y == joueur->y){
recup_objet(joueur,carte[i],&(carte[i]->objets[j]),nb_obj_inv,nb_obj_spe_inv);
desapparition_objet(&(carte[i]->objets[j]), carte[i], joueur, mainwin);
}
}
}
}
break;
default:
break;
}
Expand Down
13 changes: 9 additions & 4 deletions main.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ Partie * creerPartie() {
partie->salles_existantes = 0; //compteur de salles existantes
partie->objets_speciaux_apparus = 0; //Compteur des objets à récupérer pour gagner apparus
partie->portesNonOuvertes = 0;//Compte les portes non ouvertes sur la carte
partie->nb_obj_inv = 0;
partie->nb_obj_spe_inv = 0;
partie->mvEnnemic = 0;
return partie;
}
Expand All @@ -43,7 +45,7 @@ int main()
initCouleur();
int etatJeu = 1; // permet de quitter le jeu si besoin
int hauteur, longueur;
int nsalles = MAX_SALLES; //bug constante a regler
int nsalles = MAX_SALLES;
int minuteur = MINUTEUR;
Partie * partie = creerPartie();

Expand Down Expand Up @@ -200,15 +202,18 @@ int main()
}
}
partie->portesNonOuvertes = compteurPortesNonOuvertes(partie->carte, partie->salles_existantes);
interactions(touche, partie->joueur,partie->carte, partie->salles_existantes, mainwin);
for(int i=0; i<partie->salles_existantes; i++){
if(partie->carte[i]->ennemi_existant==1){
interactions(touche, partie->joueur,partie->carte, partie->salles_existantes, mainwin,&(partie->nb_obj_inv), &(partie->nb_obj_spe_inv));

for(int i=0; i<partie->salles_existantes; i++){ //boucle qui parcourt toutes les salles existantes
//condition verifie si l ennemi associe a la salle existe puis actualise son etat et le deplace en fonction du compteur
if(partie->carte[i]->ennemi_existant==1){
ennemietat(partie->carte[i]->ennemi,partie->carte[i],partie->joueur,mainwin);
if(partie->mvEnnemic>40){
ennemimv(partie->carte[i]->ennemi,partie->carte[i],partie->joueur,mainwin);
}
}
}

werase(mainwin);
dessineSalles(mainwin, partie->carte, partie->salles_existantes);
for(int i=0; i<partie->salles_existantes; i++){
Expand Down
56 changes: 55 additions & 1 deletion objet.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Objet apparition_objet(Salle* salle, int* objets_speciaux_apparus, int sallesres
exit(2);
}

int x,y; //Coordonnées absolues de l'objet
int x,y; //Coordonnées relatives de l'objet
Objet objet;

//Initialisation objet
Expand Down Expand Up @@ -66,3 +66,57 @@ Objet apparition_objet(Salle* salle, int* objets_speciaux_apparus, int sallesres
return objet;
}

void recup_objet(Joueur* joueur, Salle* salle, Objet* objet, int* nb_obj_inv, int* nb_obj_spe_inv){

if(joueur == NULL || salle == NULL || nb_obj_inv == NULL || nb_obj_spe_inv == NULL || objet==NULL){
exit(1);
}

/*if (*nb_obj_inv + *nb_obj_spe_inv >= 10) {
return;
}
if (objet->id >= 11) {
if (*nb_obj_spe_inv >= 3) {
return;
}
joueur->xp += 20;
} else {
if (*nb_obj_inv+4 >= INV_TAILLE) {
return;
}
joueur->xp += 20;
}
if(objet->id<11 && *nb_obj_inv+4 < INV_TAILLE ){
joueur->xp += 20;
joueur->inventaire[*nb_obj_inv+4] = objet;
salle->disp[objet->y-salle->y][objet->x-salle->x] = VIDE;
(*nb_obj_inv)++;
} else if(*nb_obj_spe_inv<4){
joueur->xp += 20;
//joueur->inventaire[*nb_obj_spe_inv] = objet;
//salle->disp[objet->y-salle->y][objet->x-salle->x] = VIDE;
(*nb_obj_spe_inv)++;
} */
}

void desapparition_objet(Objet* objet, Salle* salle, Joueur* joueur, WINDOW* win){
/*libere le pointeur sur l'ennemi et assigne l'attribut ennemi_existant a 0*/
if(objet==NULL){
exit(13);
}
if(win==NULL){
exit(14);
}
int x = objet->x-salle->x;
int y = objet->y-salle->y;
salle->disp[y][x] = VIDE;
objet->x=-1;
objet->y=-1;
objet->id=0;
}
1 change: 0 additions & 1 deletion salles.c
Original file line number Diff line number Diff line change
Expand Up @@ -370,7 +370,6 @@ int entree, int posEntree, WINDOW* win, int* sallesrest, int* objets_speciaux_ap
}
}
//ALLOCATION ENNEMI
//int ennemi_existant = 0; //ennemi existant dans la salle à sa création soit 0
//Il peut y avoir jusqu'à 1 ennemi par salle
/* Le pourcentage de chance d'apparition d'ennemi diminue en fonction du nombre
d'objets dans la salle (60% si 0, 30% si 1, 20% si 2)*/
Expand Down

0 comments on commit 42f153f

Please sign in to comment.