Created free_button_array() and it is now called from everywhere.
[xuni.git] / game.c
blob1647957a4c7729e29579ba1a8575cc777cb27b1f
1 #include "SDL_image.h"
2 #include "SDL_rotozoom.h"
3 #include "game.h"
4 #include "graphics.h"
5 #include "loop.h"
6 #include "menu.h"
7 #include "xuni.h"
9 static size_t game_handle_click(int xp, int yp, struct game_data_t *data,
10 struct smode_t *smode, struct theme_t *theme);
11 static void game_perform_click(int id, enum loop_mode_t *mode,
12 enum game_mode_t *gmode);
13 static void free_resize_game(struct game_data_t *data);
15 void init_game(struct game_data_t *data, struct smode_t *smode,
16 struct font_t *font) {
18 data->mode = GMODE_NORMAL;
20 data->loaded = 0;
21 resize_game_images(data, smode, font);
22 data->loaded = 1;
25 void resize_game_images(struct game_data_t *data, struct smode_t *smode,
26 struct font_t *font) {
28 /*const SDL_Color white = {255, 255, 255, 0};*/
30 if(data->loaded) free_resize_game(data);
32 data->gui.lastid = (size_t)-1;
34 init_button(&data->gui.button[0], font->sans, "Menu",
35 smode->width - smode->width / 8, 0,
36 smode->width / 8, smode->height / 15);
38 init_button(&data->gui.menu.button[0], font->sans, "Return to game",
39 (smode->width - smode->width / 3) / 2,
40 smode->height / 8 /*+ smode->height / 15 * 0*/,
41 smode->width / 3, smode->height / 15);
42 init_button(&data->gui.menu.button[1], font->sans, "Exit to main menu",
43 (smode->width - smode->width / 3) / 2,
44 smode->height / 8 + smode->height / 15 * 1.3,
45 smode->width / 3, smode->height / 15);
47 /*data->text.menu = TTF_RenderText_Blended(font->sans, "Menu", white);*/
50 void start_game(struct game_data_t *data) {
51 set_caption("Explore the Universe");
53 data->mode = GMODE_NORMAL;
56 void game_event(SDL_Surface *screen, enum loop_mode_t *mode, SDL_Event *event,
57 struct game_data_t *data, struct smode_t *smode, struct font_t *font,
58 struct theme_t *theme) {
60 size_t t;
62 switch(event->type) {
63 case SDL_KEYUP:
64 switch(event->key.keysym.sym) {
65 case SDLK_ESCAPE:
66 *mode = MODE_MENU;
67 break;
68 default: break;
70 break;
71 case SDL_MOUSEBUTTONDOWN:
72 /*repaint = */ game_handle_click(event->button.x, event->button.y, data, smode,
73 theme);
74 break;
75 case SDL_MOUSEBUTTONUP:
76 if(smode->button.button & SDL_BUTTON_LEFT
77 && event->button.button == SDL_BUTTON_LEFT) {
79 t = game_handle_click(smode->button.xp, smode->button.yp, data,
80 smode, theme);
81 if(t != (size_t)-1 && t == game_handle_click(event->button.x,
82 event->button.y, data, smode, theme)) {
84 game_perform_click(t, mode, &data->mode);
85 /*repaint = 1;*/
89 smode->button.button = 0;
90 break;
91 case SDL_MOUSEMOTION:
92 t = game_handle_click(event->motion.x, event->motion.y, data,
93 smode, theme);
94 if(data->gui.lastid != t) {
95 data->gui.lastid = t;
96 /*repaint = 1;*/
98 break;
99 case SDL_QUIT:
100 *mode = MODE_MENU;
101 break;
102 case SDL_VIDEORESIZE:
103 resize_game_images(data, smode, font);
104 break;
105 default:
106 break;
110 void paint_game(SDL_Surface *screen, struct game_data_t *data,
111 struct smode_t *smode, struct font_t *font, struct theme_t *theme) {
113 size_t x;
115 SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0));
117 /*blit_surface(screen, data->text.menu,
118 (smode->width - data->text.menu->w) / 2, smode->height / 10);*/
120 paint_button_array(screen, smode, theme, data->gui.button,
121 sizeof(data->gui.button)/sizeof(*data->gui.button));
123 if(data->mode == GMODE_MENU) {
124 for(x = 0; x < sizeof(data->gui.menu.button)
125 / sizeof(*data->gui.menu.button); x ++) {
127 paint_button(screen, smode, theme, &data->gui.menu.button[x]);
131 paint_menu_fps(screen, font);
133 SDL_UpdateRect(screen, 0, 0, 0, 0);
136 static size_t game_handle_click(int xp, int yp, struct game_data_t *data,
137 struct smode_t *smode, struct theme_t *theme) {
139 size_t x;
141 x = handle_button_click(xp, yp, 0, data->gui.button,
142 sizeof(data->gui.button) / sizeof(*data->gui.button));
143 if(x != (size_t)-1) return x;
145 if(data->mode == GMODE_MENU) {
146 x = handle_button_click(xp, yp, 100, data->gui.menu.button,
147 sizeof(data->gui.menu.button) / sizeof(*data->gui.menu.button));
148 if(x != (size_t)-1) return x;
151 return (size_t)-1;
154 static void game_perform_click(int id, enum loop_mode_t *mode,
155 enum game_mode_t *gmode) {
157 switch(id) {
158 case 0:
159 *gmode = GMODE_MENU;
160 break;
161 case 100:
162 *gmode = GMODE_NORMAL;
163 break;
164 case 101:
165 *mode = MODE_MENU;
166 break;
167 default:
168 break;
172 static void free_resize_game(struct game_data_t *data) {
173 free_button_array(data->gui.button,
174 sizeof(data->gui.button)/sizeof(*data->gui.button));
176 free_button_array(data->gui.menu.button,
177 sizeof(data->gui.menu.button)/sizeof(*data->gui.menu.button));
180 void free_game(struct game_data_t *data) {
181 free_resize_game(data);