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
);
95 if(smode
->active
.widget
) {
96 clear_active(&smode
->active
);
101 case SDL_MOUSEMOTION
:
102 set_game_widget_sel(event
->button
.x
, event
->button
.y
,
103 smode
->sel
.clickin
, data
, smode
, theme
);
108 case SDL_VIDEORESIZE
:
109 resize_game_images(data
, smode
, font
);
116 void paint_game(struct game_data_t
*data
, struct smode_t
*smode
,
117 struct font_t
*font
, struct theme_t
*theme
) {
121 SDL_FillRect(smode
->screen
, NULL
,
122 SDL_MapRGB(smode
->screen
->format
, 0, 0, 0));
124 /*blit_surface(screen, data->text.menu,
125 (smode->width - data->text.menu->w) / 2, smode->height / 10);*/
127 paint_widget_array(smode
, font
, theme
, data
->gui
.widget
,
128 sizeof(data
->gui
.widget
)/sizeof(*data
->gui
.widget
));
130 if(data
->mode
== GMODE_MENU
) {
131 for(x
= 0; x
< sizeof(data
->gui
.menu
.widget
)
132 / sizeof(*data
->gui
.menu
.widget
); x
++) {
134 paint_widget(smode
, font
, theme
, &data
->gui
.menu
.widget
[x
]); /* !!! allow clicking? have a "enabled" member? */
138 paint_menu_fps(smode
->screen
, font
);
140 SDL_UpdateRect(smode
->screen
, 0, 0, 0, 0);
143 static void set_game_widget_sel(int xp
, int yp
, int click
,
144 struct game_data_t
*data
, struct smode_t
*smode
, struct theme_t
*theme
) {
146 if(set_widget_sel(&smode
->sel
, xp
, yp
, click
, 0, data
->gui
.widget
,
147 sizeof(data
->gui
.widget
) / sizeof(*data
->gui
.widget
))) {
152 if(data
->mode
== GMODE_MENU
) {
153 if(set_widget_sel(&smode
->sel
, xp
, yp
, click
, 100,
154 data
->gui
.menu
.widget
, sizeof(data
->gui
.menu
.widget
)
155 / sizeof(*data
->gui
.menu
.widget
))) {
162 static void game_perform_click(int id
, enum loop_mode_t
*mode
,
163 enum game_mode_t
*gmode
, struct smode_t
*smode
) {
171 *gmode
= GMODE_NORMAL
;
182 static void free_resize_game(struct game_data_t
*data
) {
183 free_widget_array(data
->gui
.widget
,
184 sizeof(data
->gui
.widget
)/sizeof(*data
->gui
.widget
));
186 free_widget_array(data
->gui
.menu
.widget
,
187 sizeof(data
->gui
.menu
.widget
)/sizeof(*data
->gui
.menu
.widget
));
190 void free_game(struct game_data_t
*data
) {
191 free_resize_game(data
);