2 #include "SDL_rotozoom.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
,
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
;
23 resize_game_images(data
, smode
, font
);
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
) {
62 switch(event
->key
.keysym
.sym
) {
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
,
75 case SDL_MOUSEBUTTONUP
:
76 if(event
->button
.button
!= 1) break;
78 #if !1 /* this is from menu.c */
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
);
90 set_game_widget_sel(event
->button
.x
, event
->button
.y
,
91 0, data
, smode
, theme
, gui
);
94 #else /* from options.c */
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
,
103 gui
->sel
.clickin
= 0;
107 && widget_can_be_active(gui
->sel
.p
.widget
->type
)) {
109 gui
->active
= gui
->sel
.p
;
110 enable_unicode(gui
->active
.widget
->type
);
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
);
124 case SDL_MOUSEMOTION
:
125 set_game_widget_sel(event
->button
.x
, event
->button
.y
,
126 gui
->sel
.clickin
, data
, smode
, theme
, gui
);
131 case SDL_VIDEORESIZE
:
132 resize_game_images(data
, smode
, font
);
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
) {
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
,
170 if(set_widget_sel_repaint(&gui
->sel
, xp
, yp
, click
, 0, data
->gui
.widget
,
171 sizeof(data
->gui
.widget
) / sizeof(*data
->gui
.widget
))) {
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
))) {
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
) {
195 *gmode
= GMODE_NORMAL
;
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
);