2 #include "SDL_rotozoom.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
;
21 resize_game_images(data
, smode
, font
);
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
) {
62 switch(event
->key
.keysym
.sym
) {
69 case SDL_MOUSEBUTTONDOWN
:
70 set_game_widget_sel(event
->button
.x
, event
->button
.y
, 1, data
, smode
,
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
);
81 smode
->sel
.clickin
= 0;
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
);
92 /*repaint =*/ set_game_widget_sel(event
->button
.x
, event
->button
.y
,
93 0, data
, smode
, theme
);
94 smode
->active
.widget
= 0;
96 if(SDL_EnableUNICODE(-1)) SDL_EnableUNICODE(0);
100 case SDL_MOUSEMOTION
:
101 set_game_widget_sel(event
->button
.x
, event
->button
.y
,
102 smode
->sel
.clickin
, data
, smode
, theme
);
107 case SDL_VIDEORESIZE
:
108 resize_game_images(data
, smode
, font
);
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
) {
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
))) {
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
))) {
160 static void game_perform_click(int id
, enum loop_mode_t
*mode
,
161 enum game_mode_t
*gmode
, struct smode_t
*smode
) {
169 *gmode
= GMODE_NORMAL
;
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
);