Skip to content

Commit

Permalink
feat: sauvegarde menu et trucs
Browse files Browse the repository at this point in the history
  • Loading branch information
valerierx committed May 26, 2024
1 parent 0da33b1 commit 546fa33
Show file tree
Hide file tree
Showing 6 changed files with 198 additions and 38 deletions.
12 changes: 12 additions & 0 deletions .idea/discord.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 3 additions & 4 deletions CosmicYonder.h
Original file line number Diff line number Diff line change
Expand Up @@ -228,10 +228,9 @@ void renderInventaire(WINDOW * win, int y, int x, Inventaire inventaire, int nb_
void invBoucle(WINDOW *mainwin, int *touche, InvMenu *invMenu, Inventaire inventaire, int* minuteur, Joueur* joueur);

// SAUVEGARDE
void saveGame(Partie * partie);

Partie * loadGame();

void saveGame(Partie * partie, char * nomFichier);
Partie * loadGame(char * nomFichier);
int verifFichier(char * nomSauvegarde);
//JEU
Partie * creerPartie();
int condition_victoire(Partie* partie);
Expand Down
52 changes: 42 additions & 10 deletions main.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,15 @@ int main()
keypad(stdscr, true);
// initialisation des interfaces graphiques
int touche = -1;
int fichier_exists = 0;

while(etatJeu){

int etatPartie = 1; // permet de quitter la partie si besoin
int nsalles = MAX_SALLES;
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
int etatSauvegarde = 0; // effectue une sauvegarde si égal à 1
Partie * partie = creerPartie();


Expand All @@ -51,6 +53,8 @@ int main()
MiniMenu * pause = pauseMenu(longueur / 2, hauteur / 2, hauteur / 2, longueur / 2);
InvMenu * inventMenu = initInvMenu(longueur / 2, hauteur / 2, hauteur / 2, longueur / 2);
EntreeTexte * graineEntree = graineMenu(longueur / 2 - longueur/8, hauteur / 2 - hauteur / 8, hauteur / 3, longueur / 3);
EntreeTexte * nomEntree = nomMenu(longueur / 2 - longueur/8, hauteur / 2 - hauteur / 8, hauteur / 3, longueur / 3);
EntreeTexte * sauvegardeEntree = sauvegardeMenu(longueur / 2 - longueur/8, hauteur / 2 - hauteur / 8, hauteur / 3, longueur / 3);

renduFenetreMenu(mainwin, *menu, hauteur, longueur);

Expand All @@ -72,7 +76,7 @@ int main()
while(graineEntree->valide == 0) {
touche = wgetch(mainwin);
renduFenetreEntree(mainwin, graineEntree, longueur / 2 - longueur/8, hauteur / 2 - hauteur / 8, hauteur / 3, longueur / 3);
entreeTexte(graineEntree, touche);
entreeNum(graineEntree, touche);
wrefresh(mainwin);
napms(1000 / IMAGES_PAR_SECONDE);
}
Expand All @@ -90,15 +94,43 @@ int main()
initJoueur(partie->joueur);
partie->joueur->x = partie->carte[0]->x + partie->carte[0]->longueur/2;
partie->joueur->y = partie->carte[0]->y + partie->carte[0]->hauteur/2;
partie->joueur->nom = "Test";
break;
while(nomEntree->valide == 0) {
touche = wgetch(mainwin);
renduFenetreEntree(mainwin, nomEntree, longueur / 2 - longueur/8, hauteur / 2 - hauteur / 8, hauteur / 3, longueur / 3);
entreeTexte(nomEntree, touche);
wrefresh(mainwin);
napms(1000 / IMAGES_PAR_SECONDE);
}
partie->joueur->nom = malloc(strlen(nomEntree->buffer) + 1);
strcpy(partie->joueur->nom, nomEntree->buffer);

break;
case 1:
//CHARGER PARTIE
partie = loadGame();
wclear(mainwin);
do {
sauvegardeEntree->valide = 0;
while(sauvegardeEntree->valide == 0) {
touche = wgetch(mainwin);
renduFenetreEntree(mainwin, sauvegardeEntree, longueur / 2 - longueur/8, hauteur / 2 - hauteur / 8, hauteur / 3, longueur / 3);
entreeTexte(sauvegardeEntree, touche);
wrefresh(mainwin);
napms(1000 / IMAGES_PAR_SECONDE);
}
fichier_exists = verifFichier(sauvegardeEntree->buffer);
if(!fichier_exists) { // affiche erreur
for(int i = 0; i < longueur/2-1; i++) {
mvwaddch(mainwin, hauteur / 2, longueur / 2 - 8 + i, ' ');
}
wattron(mainwin, COLOR_PAIR(1));
mvwprintw(mainwin, hauteur / 2, longueur / 2 - 8, "%s.json inexistant", sauvegardeEntree->buffer);
wattroff(mainwin, COLOR_PAIR(1));
}

} while (!fichier_exists);
partie = loadGame(sauvegardeEntree->buffer);

break;
break;
case 2:
wclear(mainwin);
while(parametres->curseur !=3) {
Expand Down Expand Up @@ -230,7 +262,7 @@ int main()
si le joueur appuie sur echap, le jeu est mis en pause*/
touche = wgetch(mainwin);
if(touche == ESC) {
pauseBoucle(mainwin, &touche, pause, &etatJeu, &etatPartie);
pauseBoucle(mainwin, &touche, pause, &etatJeu, &etatPartie, &etatSauvegarde);
}
if(touche == 'i') {
invBoucle(mainwin, &touche, inventMenu, partie->joueur->inventaire,&minuteur,partie->joueur);
Expand All @@ -248,14 +280,14 @@ int main()
if(minuteur <= 0){
etatPartie = 0;
}

if(etatSauvegarde) {
//sauvegardeB
etatSauvegarde = 0;
}
}


/*
saveGame(partie);
logMessage(INFO, "fin du programme");
*/
free(partie->carte);
freeMenu(menu);
werase(mainwin);
Expand Down
61 changes: 57 additions & 4 deletions sauvegarde.c
Original file line number Diff line number Diff line change
Expand Up @@ -561,10 +561,17 @@ void freeJSONObject(JSONObject * obj) { // fonction récursive pour se débarass
free(obj);
}

void saveGame(Partie * partie) {
void saveGame(Partie * partie, char * nomFichier) {
char * chemin = malloc(sizeof(char) * strlen(nomFichier) + 6); // 5 pour le .json et le \0
if(chemin == NULL) {
logMessage(ERROR, "erreur malloc path saveGame");
exit(1);
}
chemin = strcpy(chemin, nomFichier);
chemin = strcat(chemin, ".json");
JSONObject * partieJSON = partieToJSONObj(partie);
char * serialized = serializeJSONObject(*partieJSON);
FILE * save = fopen("save.json", "w");
FILE * save = fopen(chemin, "w");
if(save == NULL) {
logMessage(ERROR, "erreur ouverture fichier save.json");
exit(1);
Expand All @@ -575,8 +582,15 @@ void saveGame(Partie * partie) {
freeJSONObject(partieJSON);
}

Partie * loadGame() {
FILE * save = fopen("save.json", "r");
Partie * loadGame(char * nomFichier) {
char * chemin = malloc(sizeof(char) * strlen(nomFichier) + 6); // 5 pour le .json et le \0
if(chemin == NULL) {
logMessage(ERROR, "erreur malloc path loadGame");
exit(1);
}
chemin = strcpy(chemin, nomFichier);
chemin = strcat(chemin, ".json");
FILE * save = fopen(chemin, "r");
if(save == NULL) {
logMessage(ERROR, "erreur ouverture fichier save.json");
exit(1);
Expand Down Expand Up @@ -613,3 +627,42 @@ Partie * loadGame() {
return partie;
}

int verifFichier(char * nomSauvegarde) {
// vérification si le fichier existe
char * chemin = malloc(sizeof(char) * strlen(nomSauvegarde) + 6); // 6 pour le .json et le \0
if(chemin == NULL) {
logMessage(ERROR, "erreur malloc path loadGame");
exit(1);
}
chemin = strcpy(chemin, nomSauvegarde);
chemin = strcat(chemin, ".json"); // ajout extension
if(access(chemin, F_OK) == 0) { // vérification de l'existence du fichier
free(chemin);
return 1;
} else {
free(chemin);
return 0;
}
}

void sauvegardeBoucle(WINDOW * mainwin, EntreeTexte * sauve, int x, int y, int hauteur, int longueur, int* touche) {
int fichier_exists = 1;
do {
while (!sauve->valide) { //Tant qu'on ne sélectionne rien le jeu est arrêté
wrefresh(mainwin);
*touche = wgetch(mainwin);
renduFenetreEntree(mainwin, sauve, x, y, hauteur, longueur);
entreeTexte(sauve, *touche);
}
fichier_exists = verifFichier(sauve->buffer);
if(!fichier_exists) { // affiche erreur
for(int i = 0; i < longueur/2-1; i++) {
mvwaddch(mainwin, hauteur / 2, longueur / 2 - 8 + i, ' ');
}
wattron(mainwin, COLOR_PAIR(1));
mvwprintw(mainwin, hauteur / 2, longueur / 2 - 8, "%s.json inexistant", sauve->buffer);
wattroff(mainwin, COLOR_PAIR(1));
}

} while (fichier_exists);
}
99 changes: 80 additions & 19 deletions ui/menu.c
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,7 @@ MiniMenu *pauseMenu(int x, int y, int hauteur, int largeur) {
Bouton *retour;
Bouton *quitter;
Bouton *reprendre;
Bouton *sauvegarder;

Texte *titre;
char **titreTexte = NULL;
Expand All @@ -190,15 +191,18 @@ MiniMenu *pauseMenu(int x, int y, int hauteur, int largeur) {

titre = creerTexte(largeur/2 + x/2 - 4, hauteur/2, titreTexte, 1, 6);
//Boutons du menu
reprendre = creerBouton(x - 5, y + 2, 5, 2, "Reprendre");
retour = creerBouton(x - 3, y + 4, 5, 2, "Retour au menu");
quitter = creerBouton(x - 3, y + 6, 5, 2, "Quitter");
reprendre = creerBouton(x - 5, y, 5, 2, "Reprendre");
sauvegarder = creerBouton(x - 5, y + 2, 5, 2, "Sauvegarder");
retour = creerBouton(x - 5, y + 4, 5, 2, "Retour au menu");
quitter = creerBouton(x - 5, y + 6, 5, 2, "Quitter");


pause = creerMessage(largeur / 2, hauteur / 2, hauteur, largeur, 6, titre, 3, NULL);
pause = creerMessage(largeur / 2, hauteur / 2, hauteur, largeur, 6, titre, 4, NULL);
//Assignation des boutons au menu
pause->boutons[0] = reprendre;
pause->boutons[1] = retour;
pause->boutons[2] = quitter;
pause->boutons[1] = sauvegarder;
pause->boutons[2] = retour;
pause->boutons[3] = quitter;

return pause;
}
Expand Down Expand Up @@ -265,8 +269,20 @@ InvMenu *initInvMenu(int x, int y, int hauteur, int largeur) {
return invMenu1;
}

MiniMenu * sauvegardeMenu(int x, int y, int hauteur, int largeur) {
EntreeTexte * sauvegardeMenu(int x, int y, int hauteur, int largeur) {
/* Menu de sauvegarde*/
//Initialisation
Texte * titre;
EntreeTexte *sauv;
char **titreTexte = NULL;
//Allocation mémoire texte + contenu des textes
titreTexte = (char **) malloc(sizeof(char) * 31);
titreTexte[0] = "Entrez le nom de la sauvegarde";

titre = creerTexte(largeur/2 + x - 20, y + hauteur/2 - 4, titreTexte, 1, 6);
//Création de l'interface texte pour entrer la graine
sauv = creerEntreeTexte(x - 10 + largeur/2, y + hauteur/2 + 2, 18, 4, titre);
return sauv;

}

Expand All @@ -287,23 +303,28 @@ EntreeTexte * graineMenu(int x, int y, int hauteur, int largeur) {
return graine;
}

EntreeTexte * sauvegardeEntree(int x, int y, int hauteur, int largeur) {
/* Sert à créer une sauvegarde*/
EntreeTexte * nomMenu(int x, int y, int hauteur, int largeur) {
/* Fonction servant à créer l'entrée du nom en fonction des dimensions du terminal*/
//Initialisation
Texte * titre;
EntreeTexte *sauvegarde;
EntreeTexte *nom;
char **titreTexte = NULL;
titreTexte = (char **) malloc(sizeof(char) * (43 + 34));
titreTexte[0] = "Nom de la sauvegarde";
titreTexte[1] = "";
//Allocation mémoire texte + contenu des textes
titreTexte = (char **) malloc(sizeof(char) * 34);
titreTexte[0] = "Spationaute #213";
titreTexte[1] = "Entrez votre nom";

titre = creerTexte(largeur/2 + x - 20, y + hauteur/2 - 4, titreTexte, 2, 6);

sauvegarde = creerEntreeTexte(x - 10 + largeur/2, y + hauteur/2 + 2, 18, 4, titre);
return sauvegarde;
//Création de l'interface texte pour entrer la graine
nom = creerEntreeTexte(x - 10 + largeur/2, y + hauteur/2 + 2, 18, 4, titre);
return nom;
}






void renduFenetreMenu(WINDOW *win, Menu menu, int thauteur, int tlargeur) {
/* Rendu de la fenetre du menu en fonction de la taille du terminal*/
wattron(win, COLOR_PAIR(5));
Expand Down Expand Up @@ -398,6 +419,38 @@ void entreeMenu(Menu *menu, int touche) {
}

void entreeTexte(EntreeTexte *entree, int touche) {
/* Fonction servant à savoir si une entrée est valide quand on l'execute*/
switch (touche) {
case ERR:
break;
case KEY_BACKSPACE:
if(strlen(entree->buffer) > 0) {
entree->buffer[entree->curseur - 1] = '\0';
entree->affichage[entree->curseur - 1] = '_';
entree->curseur--;
}
break;

case 10:
//L'entrée est valide
entree->valide = 1;
break;

default:
if((touche >= 'a' && touche <= 'z') || (touche >= 'A' && touche <= 'Z')) {
if (entree->taille > entree->curseur+1) {
entree->buffer[entree->curseur] = (char) touche;
entree->affichage[entree->curseur] = (char) touche;
entree->buffer[entree->curseur+1] = '\0';
entree->curseur++;
}
}
//Sinon il ne se passe rien
break;
}
}

void entreeNum(EntreeTexte *entree, int touche) {
/* Fonction servant à savoir si une entrée est valide quand on l'execute*/
switch (touche) {
case ERR:
Expand Down Expand Up @@ -463,7 +516,7 @@ void entreeMessage(MiniMenu *message, int touche) {
}
}

void pauseBoucle(WINDOW *mainwin, int *touche, MiniMenu *pause, int *jeuEtat, int*partieEtat) {
void pauseBoucle(WINDOW *mainwin, int *touche, MiniMenu *pause, int *jeuEtat, int*partieEtat, int *sauveEtat) {
/* Fonction qui fait une boucle infini tant qu'on a pas choisi une option
pour arrêter le jeu quand on fait pause*/
while (!pause->selEtat) { //Tant qu'on ne sélectionne rien le jeu est arrêté
Expand All @@ -477,19 +530,27 @@ void pauseBoucle(WINDOW *mainwin, int *touche, MiniMenu *pause, int *jeuEtat, in
pause->selEtat = 0;
pause->curseur = 0;
break;
case 1: // retour au menu
case 1: // sauvegarde
*sauveEtat = 1;
pause->selEtat = 0;
pause->curseur = 0;
break;

case 2: // retour au menu
pause->selEtat = 0;
pause->curseur = 0;
*partieEtat = 0;

break;
case 2: //quitter
case 3: //quitter
*jeuEtat = 0;
*partieEtat = 0;
break;
}
}



void entreeInv(InvMenu *invMenu, int* touche) {
/* Fonction gérant le sélecteur de l'inventaire en fonction des touches choisies
(bouton vers le bas pour aller au bouton du bas et idem pour le haut)*/
Expand Down
Loading

0 comments on commit 546fa33

Please sign in to comment.