Began creating the listbox widget. It's still just a structure.
[xuni.git] / game.c
blobec9e081e09bf4440ca9679e01df2d5989a0fbb77
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 void game_perform_click(int id, enum loop_mode_t *mode,
10 enum game_mode_t *gmode, struct smode_t *smode);
11 static void set_game_widget_sel(int xp, int yp, int click,
12 struct game_data_t *data, struct smode_t *smode, struct theme_t *theme);
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.widget[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], 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], 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) {
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 set_game_widget_sel(event->button.x, event->button.y, 1, data, smode,
71 theme);
72 break;
73 case SDL_MOUSEBUTTONUP:
74 if(smode->sel.p.widget
75 && in_sdl_rect(event->button.x, event->button.y,
76 &smode->sel.p.widget->pos)) {
78 game_perform_click(smode->sel.p.id, mode, &data->mode, smode);
80 smode->sel.wasin = 1;
81 smode->sel.clickin = 0;
82 /*repaint = 1;*/
84 if(smode->sel.p.widget
85 && widget_can_be_active(smode->sel.p.widget->type)) {
87 smode->active = smode->sel.p;
88 enable_unicode(smode->active.widget->type);
91 else {
92 /*repaint =*/ set_game_widget_sel(event->button.x, event->button.y,
93 0, data, smode, theme);
94 smode->active.widget = 0;
95 smode->active.id = 0;
96 if(SDL_EnableUNICODE(-1)) SDL_EnableUNICODE(0);
99 break;
100 case SDL_MOUSEMOTION:
101 set_game_widget_sel(event->button.x, event->button.y,
102 smode->sel.clickin, data, smode, theme);
103 break;
104 case SDL_QUIT:
105 *mode = MODE_MENU;
106 break;
107 case SDL_VIDEORESIZE:
108 resize_game_images(data, smode, font);
109 break;
110 default:
111 break;
115 void paint_game(SDL_Surface *screen, struct game_data_t *data,
116 struct smode_t *smode, struct font_t *font, struct theme_t *theme) {
118 size_t x;
120 SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0));
122 /*blit_surface(screen, data->text.menu,
123 (smode->width - data->text.menu->w) / 2, smode->height / 10);*/
125 paint_widget_array(screen, smode, theme, data->gui.widget,
126 sizeof(data->gui.widget)/sizeof(*data->gui.widget));
128 if(data->mode == GMODE_MENU) {
129 for(x = 0; x < sizeof(data->gui.menu.widget)
130 / sizeof(*data->gui.menu.widget); x ++) {
132 paint_widget(screen, smode, theme, &data->gui.menu.widget[x]); /* !!! */
136 paint_menu_fps(screen, font);
138 SDL_UpdateRect(screen, 0, 0, 0, 0);
141 static void set_game_widget_sel(int xp, int yp, int click,
142 struct game_data_t *data, struct smode_t *smode, struct theme_t *theme) {
144 if(set_widget_sel(&smode->sel, xp, yp, click, 0, data->gui.widget,
145 sizeof(data->gui.widget) / sizeof(*data->gui.widget))) {
147 return;
150 if(data->mode == GMODE_MENU) {
151 if(set_widget_sel(&smode->sel, xp, yp, click, 100,
152 data->gui.menu.widget, sizeof(data->gui.menu.widget)
153 / sizeof(*data->gui.menu.widget))) {
155 return;
160 static void game_perform_click(int id, enum loop_mode_t *mode,
161 enum game_mode_t *gmode, struct smode_t *smode) {
163 switch(id) {
164 case 0:
165 *gmode = GMODE_MENU;
166 clear_smode(smode);
167 break;
168 case 100:
169 *gmode = GMODE_NORMAL;
170 clear_smode(smode);
171 break;
172 case 101:
173 *mode = MODE_MENU;
174 break;
175 default:
176 break;
180 static void free_resize_game(struct game_data_t *data) {
181 free_widget_array(data->gui.widget,
182 sizeof(data->gui.widget)/sizeof(*data->gui.widget));
184 free_widget_array(data->gui.menu.widget,
185 sizeof(data->gui.menu.widget)/sizeof(*data->gui.menu.widget));
188 void free_game(struct game_data_t *data) {
189 free_resize_game(data);