[All of these changes were wrought on the Dell.]
[xuni.git] / game.c
blobdcadf9901cbf63cb4a2ef31e5811ade06c66aebc
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);
95 if(smode->active.widget) {
96 clear_active(&smode->active);
100 break;
101 case SDL_MOUSEMOTION:
102 set_game_widget_sel(event->button.x, event->button.y,
103 smode->sel.clickin, data, smode, theme);
104 break;
105 case SDL_QUIT:
106 *mode = MODE_MENU;
107 break;
108 case SDL_VIDEORESIZE:
109 resize_game_images(data, smode, font);
110 break;
111 default:
112 break;
116 void paint_game(struct game_data_t *data, struct smode_t *smode,
117 struct font_t *font, struct theme_t *theme) {
119 size_t x;
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))) {
149 return;
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))) {
157 return;
162 static void game_perform_click(int id, enum loop_mode_t *mode,
163 enum game_mode_t *gmode, struct smode_t *smode) {
165 switch(id) {
166 case 0:
167 *gmode = GMODE_MENU;
168 clear_smode(smode);
169 break;
170 case 100:
171 *gmode = GMODE_NORMAL;
172 clear_smode(smode);
173 break;
174 case 101:
175 *mode = MODE_MENU;
176 break;
177 default:
178 break;
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);