Made all files which use gui_t (which is every source and header file) include gui...
[xuni.git] / game.c
blob2db109639d00d06b46365b2db3d14c723a7a4c53
1 #include "SDL_image.h"
2 #include "SDL_rotozoom.h"
3 #include "game.h"
4 #include "graphics.h"
5 #include "gui.h"
6 #include "loop.h"
7 #include "menu.h"
8 #include "xuni.h"
10 static void game_perform_click(int id, enum loop_mode_t *mode,
11 enum game_mode_t *gmode, struct smode_t *smode, struct gui_t *gui);
12 static void set_game_widget_sel(int xp, int yp, int click,
13 struct game_data_t *data, struct smode_t *smode, struct theme_t *theme,
14 struct gui_t *gui);
15 static void free_resize_game(struct game_data_t *data);
17 void init_game(struct game_data_t *data, struct smode_t *smode,
18 struct font_t *font) {
20 data->mode = GMODE_NORMAL;
22 data->loaded = 0;
23 resize_game_images(data, smode, font);
24 data->loaded = 1;
27 void resize_game_images(struct game_data_t *data, struct smode_t *smode,
28 struct font_t *font) {
30 if(data->loaded) free_resize_game(data);
32 data->gui.lastid = (size_t)-1;
34 init_button(&data->gui.widget[0], 0, font->sans, "Menu",
35 smode->width - smode->width / 8, 0,
36 smode->width / 8, smode->height / 15);
38 init_button(&data->gui.menu.widget[0], 100, 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.widget[1], 101, 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(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, struct gui_t *gui) {
60 switch(event->type) {
61 case SDL_KEYUP:
62 switch(event->key.keysym.sym) {
63 case SDLK_ESCAPE:
64 *mode = MODE_MENU;
65 break;
66 default: break;
68 break;
69 case SDL_MOUSEBUTTONDOWN:
70 if(event->button.button != 1) break;
72 set_game_widget_sel(event->button.x, event->button.y, 1, data, smode,
73 theme, gui);
74 break;
75 case SDL_MOUSEBUTTONUP:
76 if(event->button.button != 1) break;
78 #if !1 /* this is from menu.c */
79 if(gui->sel.p.widget
80 && in_sdl_rect(event->button.x, event->button.y,
81 &gui->sel.p.widget->pos)) {
83 game_perform_click(gui->sel.p.id, mode, &data->mode, smode, gui);
85 gui->sel.wasin = 1;
86 gui->sel.clickin = 0;
87 /*repaint = 1;*/
89 else {
90 set_game_widget_sel(event->button.x, event->button.y,
91 0, data, smode, theme, gui);
94 #else /* from options.c */
95 if(gui->sel.p.widget
96 && in_sdl_rect(event->button.x, event->button.y,
97 &gui->sel.p.widget->pos)) {
99 game_perform_click(gui->sel.p.widget->id, mode, &data->mode,
100 smode, gui);
102 gui->sel.wasin = 1;
103 gui->sel.clickin = 0;
104 /*repaint = 1;*/
106 if(gui->sel.p.widget
107 && widget_can_be_active(gui->sel.p.widget->type)) {
109 gui->active = gui->sel.p;
110 enable_unicode(gui->active.widget->type);
113 else {
114 /*repaint =*/ set_game_widget_sel(event->button.x, event->button.y,
115 0, data, smode, theme, gui);
117 if(gui->active.widget) {
118 clear_active(&gui->active);
121 #endif
123 break;
124 case SDL_MOUSEMOTION:
125 set_game_widget_sel(event->button.x, event->button.y,
126 gui->sel.clickin, data, smode, theme, gui);
127 break;
128 case SDL_QUIT:
129 *mode = MODE_MENU;
130 break;
131 case SDL_VIDEORESIZE:
132 resize_game_images(data, smode, font);
133 break;
134 default:
135 break;
139 void paint_game(struct game_data_t *data, struct smode_t *smode,
140 struct font_t *font, struct theme_t *theme, struct gui_t *gui) {
142 size_t x;
144 SDL_FillRect(smode->screen, NULL,
145 SDL_MapRGB(smode->screen->format, 0, 0, 0));
147 /*blit_surface(screen, data->text.menu,
148 (smode->width - data->text.menu->w) / 2, smode->height / 10);*/
150 paint_widget_array(smode, font, theme, gui, data->gui.widget,
151 sizeof(data->gui.widget)/sizeof(*data->gui.widget));
153 if(data->mode == GMODE_MENU) {
154 for(x = 0; x < sizeof(data->gui.menu.widget)
155 / sizeof(*data->gui.menu.widget); x ++) {
157 paint_widget(smode, font, theme, gui, &data->gui.menu.widget[x]); /* !!! allow clicking? have a "enabled" member? */
161 paint_menu_fps(smode->screen, font);
163 SDL_UpdateRect(smode->screen, 0, 0, 0, 0);
166 static void set_game_widget_sel(int xp, int yp, int click,
167 struct game_data_t *data, struct smode_t *smode, struct theme_t *theme,
168 struct gui_t *gui) {
170 if(set_widget_sel_repaint(&gui->sel, xp, yp, click, 0, data->gui.widget,
171 sizeof(data->gui.widget) / sizeof(*data->gui.widget))) {
173 return;
176 if(data->mode == GMODE_MENU) {
177 if(set_widget_sel_repaint(&gui->sel, xp, yp, click, 100,
178 data->gui.menu.widget, sizeof(data->gui.menu.widget)
179 / sizeof(*data->gui.menu.widget))) {
181 return;
186 static void game_perform_click(int id, enum loop_mode_t *mode,
187 enum game_mode_t *gmode, struct smode_t *smode, struct gui_t *gui) {
189 switch(id) {
190 case 0:
191 *gmode = GMODE_MENU;
192 clear_gui(gui);
193 break;
194 case 100:
195 *gmode = GMODE_NORMAL;
196 clear_gui(gui);
197 break;
198 case 101:
199 *mode = MODE_MENU;
200 break;
201 default:
202 break;
206 static void free_resize_game(struct game_data_t *data) {
207 free_widget_array(data->gui.widget,
208 sizeof(data->gui.widget)/sizeof(*data->gui.widget));
210 free_widget_array(data->gui.menu.widget,
211 sizeof(data->gui.menu.widget)/sizeof(*data->gui.menu.widget));
214 void free_game(struct game_data_t *data) {
215 free_resize_game(data);