379 lines
8.2 KiB
C
379 lines
8.2 KiB
C
/*
|
|
* menu_en_jeu.c
|
|
*
|
|
* Created on: 9 mai 2016
|
|
* Author: nathan
|
|
*/
|
|
|
|
#include "menu_en_jeu.h"
|
|
|
|
#include "affichage_menu.h"
|
|
#include "affichage_plateau.h"
|
|
#include "menu.h"
|
|
#include "sub_menu.h"
|
|
#include "sauvegarde.h"
|
|
|
|
|
|
void random_char_9 (char* s)
|
|
{
|
|
for (int i = 0; i < 8; ++i)
|
|
s[i] = 'A' + rand() % 26;
|
|
s[9]= '\0';
|
|
}
|
|
|
|
bool d_menu_mouse (plateau_t p, SDL_MouseMotionEvent motion)
|
|
{
|
|
if (p->menu.x < motion.x && motion.x < p->menu.x + p->menu.w && p->menu.y < motion.y && motion.y < p->menu.y + p->menu.h)
|
|
{
|
|
Menu_button (p, 1);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
int menu_hist (plateau_t p)
|
|
{
|
|
char* entries [7] = {"Case", "", "", "Retour", ">", "<", ""};//{"Case", "Joueur 1", " 6 - 4 ", "Retour", ">", "<", " Coup 4 "};
|
|
entries [1] = malloc (sizeof (char) * 9);
|
|
entries [2] = malloc (sizeof (char) * 8);
|
|
entries [6] = malloc (sizeof (char) * 9);
|
|
int cur = p->nb_coups - 1;
|
|
sprintf (entries [1], "Joueur %d", PLAYER(cur%2));
|
|
sprintf (entries [2], " %2d - %2d ", p->hist[cur] / NBSIDE + 1, p->hist[cur] % NBSIDE + 1);
|
|
sprintf (entries [6], " Coup %3d ", cur);
|
|
menu_t m = init_menu (p->window, entries);
|
|
m->nb_entries = 7;
|
|
Affiche_menu(m);
|
|
int retour;
|
|
bool end = false;
|
|
|
|
while (!end)
|
|
{
|
|
SDL_Event event;
|
|
SDL_WaitEvent (&event);
|
|
if (event.type == SDL_QUIT)
|
|
exit (0);
|
|
if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE)
|
|
retour = M_DOWN;
|
|
else
|
|
retour = evenement_menu(p->window, m, event, 0);
|
|
switch (retour)
|
|
{
|
|
case M_UP:
|
|
break;
|
|
case M7_UP:
|
|
if (cur <= 0)
|
|
cur = p->nb_coups - 1;
|
|
else
|
|
--cur;
|
|
sprintf (entries [1], "Joueur %d", PLAYER(cur%2));
|
|
sprintf (entries [2], " %2d - %2d ", p->hist[cur] / NBSIDE + 1, p->hist[cur] % NBSIDE + 1);
|
|
sprintf (entries [6], " Coup %3d ", cur);
|
|
Affiche_menu (m);
|
|
break;
|
|
case M_LEFT :
|
|
break;
|
|
case M_RIGHT :
|
|
if (cur >= p->nb_coups - 1)
|
|
cur = 0;
|
|
else
|
|
++cur;
|
|
sprintf (entries [1], "Joueur %d", PLAYER(cur%2));
|
|
sprintf (entries [2], " %2d - %2d ", p->hist[cur] / NBSIDE + 1, p->hist[cur] % NBSIDE + 1);
|
|
sprintf (entries [6], " Coup %3d ", cur);
|
|
Affiche_menu (m);
|
|
break;
|
|
case M_DOWN :
|
|
end = true;
|
|
break;
|
|
case M7_DOWN :
|
|
break;
|
|
case M_MID :
|
|
break;
|
|
}
|
|
}
|
|
free_menu(m);
|
|
free (entries[1]);
|
|
free (entries[2]);
|
|
free (entries[6]);
|
|
return retour;
|
|
}
|
|
|
|
int menu_save (plateau_t p)
|
|
{
|
|
char* entries [5] = {"<", "Save", "", "Retour", ">"};
|
|
entries [2] = malloc (sizeof (char) * 12);
|
|
int cur = 0;
|
|
strcpy (entries [2], "_\0");
|
|
menu_t m = init_menu (p->window, entries);
|
|
Affiche_menu(m);
|
|
int retour;
|
|
bool end = false;
|
|
|
|
while (!end)
|
|
{
|
|
SDL_Event event;
|
|
SDL_WaitEvent (&event);
|
|
if (event.type == SDL_QUIT || (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE))
|
|
{
|
|
retour = M_DOWN;
|
|
}
|
|
else if (event.type == SDL_KEYDOWN && SDLK_a <= event.key.keysym.sym && event.key.keysym.sym <= SDLK_z && cur < 8)
|
|
{
|
|
Uint8* keyboard = SDL_GetKeyState(NULL);
|
|
if ((keyboard [SDLK_RSHIFT] || keyboard [SDLK_LSHIFT]) ^ keyboard [SDLK_CAPSLOCK])
|
|
entries [2] [cur] = event.key.keysym.sym - 'a' + 'A';
|
|
else
|
|
entries [2] [cur] = event.key.keysym.sym;
|
|
++cur;
|
|
if (cur == 8)
|
|
entries [2] [cur] = '\0';
|
|
else
|
|
{
|
|
entries [2] [cur] = '_';
|
|
entries [2] [cur + 1] = '\0';
|
|
}
|
|
vec2 c = m->cur;
|
|
m->cur.x = 1;
|
|
m->cur.x = 1;
|
|
Affiche_entry (m, 0);
|
|
m->cur = c;
|
|
}
|
|
else if (event.type == SDL_KEYDOWN && SDLK_KP0 <= event.key.keysym.sym && event.key.keysym.sym <= SDLK_KP9 && cur < 8)
|
|
{
|
|
entries [2] [cur] = event.key.keysym.sym - SDLK_KP0 + '0';
|
|
++cur;
|
|
if (cur == 8)
|
|
entries [2] [cur] = '\0';
|
|
else
|
|
{
|
|
entries [2] [cur] = '_';
|
|
entries [2] [cur + 1] = '\0';
|
|
}
|
|
vec2 c = m->cur;
|
|
m->cur.x = 1;
|
|
m->cur.x = 1;
|
|
Affiche_entry (m, 0);
|
|
m->cur = c;
|
|
}
|
|
else if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_BACKSPACE && cur > 0)
|
|
{
|
|
entries [2] [cur] = '\0';
|
|
--cur;
|
|
entries [2] [cur] = '_';
|
|
vec2 c = m->cur;
|
|
m->cur.x = 1;
|
|
m->cur.x = 1;
|
|
Affiche_entry (m, 0);
|
|
m->cur = c;
|
|
}
|
|
else
|
|
retour = evenement_menu(p->window, m, event, 0);
|
|
|
|
switch (retour)
|
|
{
|
|
case M_UP:
|
|
if (0 < cur && strlen (entries [2]) < 9)
|
|
{
|
|
end = true;
|
|
char** liste;
|
|
int nb = listeSauvegarde (&liste);
|
|
for (int i = 0; i < nb && end; ++i)
|
|
if (!strcmp (entries [2], liste [i]))
|
|
{
|
|
strcpy (entries [2], "existe déjà");
|
|
cur = 1;
|
|
vec2 c = m->cur;
|
|
m->cur.x = 1;
|
|
m->cur.x = 1;
|
|
Affiche_entry (m, 0);
|
|
m->cur = c;
|
|
end = 0;
|
|
}
|
|
free_liste (liste, nb);
|
|
if (end)
|
|
{
|
|
entries [2] [cur] = '\0';
|
|
sauvegarde (entries [2], p->hist, p->ia);
|
|
}
|
|
}
|
|
break;
|
|
case M_LEFT :
|
|
{
|
|
random_char_9 (entries [2]);
|
|
cur = 8;
|
|
vec2 c = m->cur;
|
|
m->cur.x = 1;
|
|
m->cur.x = 1;
|
|
Affiche_entry (m, 0);
|
|
m->cur = c;
|
|
break;
|
|
}
|
|
case M_RIGHT :
|
|
{
|
|
random_char_9 (entries [2]);
|
|
cur = 8;
|
|
vec2 c = m->cur;
|
|
m->cur.x = 1;
|
|
m->cur.x = 1;
|
|
Affiche_entry (m, 0);
|
|
m->cur = c;
|
|
break;
|
|
}
|
|
case M_DOWN :
|
|
end = true;
|
|
break;
|
|
case M_MID :
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
free_menu(m);
|
|
free (entries [2]);
|
|
return retour;
|
|
}
|
|
|
|
int menu_en_jeu_part2 (plateau_t p)
|
|
{
|
|
char* entries [5] = {"<", "Music", "HEX", "Quitter", " Son "};
|
|
menu_t m = init_menu (p->window, entries);
|
|
Affiche_menu(m);
|
|
int retour;
|
|
bool end = false;
|
|
|
|
while (!end)
|
|
{
|
|
SDL_Event event;
|
|
SDL_WaitEvent (&event);
|
|
if (event.type == SDL_QUIT)
|
|
exit (0);
|
|
if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE)
|
|
retour = M_DOWN;
|
|
else
|
|
retour = evenement_menu(p->window, m, event, 0);
|
|
switch (retour)
|
|
{
|
|
case M_UP:
|
|
menu_music (p->window, NULL);
|
|
m->cur.x = 1;
|
|
m->cur.y = 1;
|
|
Affiche_menu(m);
|
|
break;
|
|
case M_LEFT :
|
|
end = true;
|
|
break;
|
|
case M_RIGHT :
|
|
menu_son (p->window, NULL);
|
|
m->cur.x = 1;
|
|
m->cur.y = 1;
|
|
Affiche_menu(m);
|
|
break;
|
|
case M_DOWN :
|
|
end = true;
|
|
break;
|
|
case M_MID :
|
|
end = true;
|
|
break;
|
|
}
|
|
}
|
|
free_menu(m);
|
|
return retour;
|
|
}
|
|
|
|
int menu_en_jeu_part1 (plateau_t p)
|
|
{
|
|
SDL_Surface* save = SDL_CreateRGBSurface (SDL_HWSURFACE, p->window->w, p->window->h, p->window->format->BitsPerPixel, 0, 0, 0, 0);
|
|
SDL_BlitSurface (p->window, NULL, save, NULL);
|
|
vec2 resize = {p->window->w, p->window->h};
|
|
char* entries [7] = {"Hist", "Save", "HEX", "Quitter", ">", "Cancel", "Retour"};
|
|
menu_t m = init_menu (p->window, entries);
|
|
m->nb_entries = 7;
|
|
Affiche_menu(m);
|
|
int retour;
|
|
bool end = false;
|
|
|
|
while (!end)
|
|
{
|
|
SDL_Event event;
|
|
SDL_WaitEvent (&event);
|
|
if (event.type == SDL_QUIT)
|
|
exit (0);
|
|
if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE)
|
|
retour = M_DOWN;
|
|
else
|
|
retour = evenement_menu(p->window, m, event, 0);
|
|
if (retour == M_UP || retour == M_RIGHT)
|
|
{
|
|
if (resize.x == p->window->w && resize.y == p->window->h)
|
|
SDL_BlitSurface (save, NULL, p->window, NULL);
|
|
else
|
|
SDL_FillRect (p->window, NULL, SDL_MapRGB(p->window->format, 0, 0, 0));
|
|
}
|
|
switch (retour)
|
|
{
|
|
case M_UP:
|
|
menu_save (p);
|
|
m->cur.x = 1;
|
|
m->cur.y = 1;
|
|
Affiche_menu(m);
|
|
break;
|
|
case M_LEFT :
|
|
if (p->nb_coups > 0)
|
|
{
|
|
menu_hist (p);
|
|
m->cur.x = 1;
|
|
m->cur.y = 1;
|
|
Affiche_menu(m);
|
|
}
|
|
break;
|
|
case M_RIGHT :
|
|
end = true;
|
|
break;
|
|
case M_DOWN :
|
|
end = true;
|
|
break;
|
|
case M_MID :
|
|
break;
|
|
case M7_DOWN :
|
|
end = true;
|
|
break;
|
|
case M7_UP :
|
|
annuler (p);
|
|
break;
|
|
}
|
|
}
|
|
free_menu(m);
|
|
return retour;
|
|
}
|
|
|
|
int menu_en_jeu (plateau_t p)
|
|
{
|
|
|
|
SDL_Surface* save = SDL_CreateRGBSurface (SDL_HWSURFACE, p->window->w, p->window->h, p->window->format->BitsPerPixel, 0, 0, 0, 0);
|
|
SDL_BlitSurface (p->window, NULL, save, NULL);
|
|
SDL_Surface* ombre = SDL_CreateRGBSurface (SDL_HWSURFACE, p->window->w, p->window->h, p->window->format->BitsPerPixel, 0, 0, 0, 0);
|
|
SDL_FillRect (ombre, NULL, SDL_MapRGB (p->window->format, 0, 0, 0));
|
|
SDL_SetAlpha (ombre, SDL_SRCALPHA, 175);
|
|
SDL_BlitSurface (ombre, NULL, p->window, NULL);
|
|
SDL_FreeSurface (ombre);
|
|
|
|
int retour = M_LEFT;
|
|
do
|
|
{
|
|
if (retour == M_LEFT)
|
|
retour = menu_en_jeu_part1(p);
|
|
else if (retour == M_RIGHT)
|
|
retour = menu_en_jeu_part2(p);
|
|
} while (retour != M_MID && retour != M_DOWN && retour != M7_DOWN);
|
|
|
|
SDL_BlitSurface (save, NULL, p->window, NULL);
|
|
SDL_FreeSurface (save);
|
|
SDL_Event e;
|
|
do
|
|
{
|
|
SDL_WaitEvent (&e);
|
|
} while (e.type != SDL_MOUSEBUTTONUP && e.type != SDL_KEYUP);
|
|
return retour;
|
|
}
|