1 /* $Id: mapmenu.c,v 1.27 2006-07-30 11:44:58 stpohle Exp $ */
2 /* map/tileset selection menu */
3 
4 #include "bomberclone.h"
5 #include "menu.h"
6 
7 /* launch the map options menu */
8 void
mapmenu()9 mapmenu ()
10 {
11     int menuselect = 0;
12     char *mapname = NULL,
13         pathname[LEN_PATHFILENAME];
14     _charlist maptypes[] = {
15         {"selected file", NULL},
16         {"random file", NULL},
17         {"autogenerated", NULL},
18         {"more random", NULL}
19     }, tiletypes[] = {
20         {
21         "random"}, {
22         "selected"}
23     }, tunneltypes[] = {
24         {
25         "normal"}, {
26         "tunnel"}, {
27     "random"},}, *selmt = NULL, *selts = NULL, *seltt = NULL;
28     char mname[100];
29 	_menu *menu;
30 
31     charlist_fillarraypointer (maptypes, 4);
32     charlist_fillarraypointer (tiletypes, 2);
33     charlist_fillarraypointer (tunneltypes, 3);
34 
35     while (menuselect != -1 && bman.state != GS_quit) {
36         menu = menu_new ("Map Options", 420, 400);
37         switch (map.map_selection) {
38         case (MAPS_select):    // Selected Map
39             selmt = charlist_findtext (maptypes, "selected file");
40             if (map.map[0] == 0)
41                 sprintf (mname, "< undefined >");
42             else
43                 sprintf (mname, "%s", getfilename (map.map));
44             menu_create_label (menu, "Selected Map:", 20, 160, 0, COLOR_brown);
45             menu_create_button (menu, mname, 10, 180, 170, 2);
46             break;
47         case (MAPS_randmap):   // Random Map
48             selmt = charlist_findtext (maptypes, "random file");
49             break;
50         case (MAPS_randgen):   // Random Generated Map
51             selmt = charlist_findtext (maptypes, "autogenerated");
52             d_printf ("autogen\n");
53             menu_create_entry (menu, "X Size:", 20, 160, 120, &map.size.x, MAX_FIELDSIZE_X, MENU_entryint16, 2);
54             menu_create_entry (menu, "Y Size:", 20, 180, 120, &map.size.y, MAX_FIELDSIZE_Y, MENU_entryint16, 3);
55             break;
56         case (MAPS_morerand): // More Random
57             selmt = charlist_findtext (maptypes, "more random");
58             d_printf ("more random\n");
59             menu_create_entry (menu, "X Size:", 20, 160, 120, &map.size.x, MAX_FIELDSIZE_X, MENU_entryint16, 2);
60             menu_create_entry (menu, "Y Size:", 20, 180, 120, &map.size.y, MAX_FIELDSIZE_Y, MENU_entryint16, 3);
61             break;
62         }
63         if (map.random_tileset)
64 			selts = &tiletypes[0];
65 		else
66 			selts = &tiletypes[1];
67         if (map.tileset[0] == 0)
68             sprintf (mname, "< undefined >");
69         else
70             sprintf (mname, "%s", map.tileset);
71         menu_create_label (menu, "Selected Tileset:", 250, 140, 0, COLOR_brown);
72         menu_create_button (menu, mname, 250, 160, 170, 5);
73 
74         switch (map.type) {
75         case (MAPT_normal):
76             seltt = charlist_findtext (tunneltypes, "normal");
77             break;
78         case (MAPT_tunnel):
79             seltt = charlist_findtext (tunneltypes, "tunnel");
80             break;
81         default:
82             seltt = charlist_findtext (tunneltypes, "random");
83             break;
84         }
85 
86         menu_create_label (menu, "Map Type:", 10, 50, 1, COLOR_brown);
87         menu_create_label (menu, "Tileset:", 250, 50, 1, COLOR_brown);
88         menu_create_label (menu, "Items:", 220, 200, 1, COLOR_brown);
89         menu_create_list (menu, "mt", 10, 85, 170, 60, maptypes, &selmt, 1);
90         menu_create_list (menu, "ts", 250, 85, 170, 40, tiletypes, &selts, 4);
91         menu_create_list (menu, "tt", 10, 220, 100, 60, tunneltypes, &seltt, 6);
92 
93         menu_create_entry (menu, "Bombs:", 140, 240, 110, &map.bombs, 100, MENU_entryint32, 7);
94         menu_create_entry (menu, "Fire: ", 140, 260, 110, &map.fire, 100, MENU_entryint32, 8);
95         menu_create_entry (menu, "Shoes:", 140, 280, 110, &map.shoes, 100, MENU_entryint32, 9);
96         menu_create_entry (menu, "Mixed:", 140, 300, 110, &map.mixed, 100, MENU_entryint32, 10);
97         menu_create_entry (menu, "Death:", 140, 320, 110, &map.death, 100, MENU_entryint32, 11);
98 
99         menu_create_entry (menu, "Trigger:", 280, 240, 120, &map.sp_trigger, 30, MENU_entryint32, 12);
100         menu_create_entry (menu, "Push:   ", 280, 260, 120, &map.sp_push, 30, MENU_entryint32, 13);
101         menu_create_entry (menu, "Row:    ", 280, 280, 120, &map.sp_row, 30, MENU_entryint32, 14);
102         menu_create_entry (menu, "Kick:   ", 280, 300, 120, &map.sp_kick, 30, MENU_entryint32, 15);
103 
104         menu_create_button (menu, "Game Options", -1, 350, 150, 16);
105 
106 		menu_create_button (menu, "Ok", -1, 380, 150, 0);
107 
108         menuselect = menu_loop (menu);
109         menu_delete (menu);
110         switch (menuselect) {
111         case (0):
112             menuselect = -1;
113             break;
114         case (2):              // Select Map
115             sprintf (pathname, "%s/maps", bman.datapath);
116             mapname = menu_dir_select ("Select Map", pathname, DF_file);
117             if (mapname == NULL) {
118                 map.map[0] = 0;
119                 map.map_selection = 2;
120             }
121             else
122                 sprintf (map.map, "%s/maps/%s", bman.datapath, mapname);
123             break;
124 
125         case (5):              // Selected Tileset
126             sprintf (pathname, "%s/tileset", bman.datapath);
127             mapname = menu_dir_select ("Select Tileset", pathname, DF_dir);
128             if (mapname == NULL) {
129                 map.tileset[0] = 0;
130                 map.random_tileset = 1;
131             }
132             else
133                 strcpy (map.tileset, mapname);
134             break;
135 
136 		case (16): /* Game Settings */
137 			mapgamesetting ();
138 			break;
139         }
140 
141 		/* map type */
142         map.type = seltt - &tunneltypes[0];
143         if (map.type == 2)
144             map.type = -1;
145         d_printf ("Tunnel:%d\n", map.type);
146 
147 		/* tileset mode and map mode */
148 		map.random_tileset = 1-(selts - &tiletypes[0]);
149         map.map_selection = selmt - &maptypes[0];
150     }
151     map.size.x = map.size.x | 1;
152     if (map.size.x < MIN_FIELDSIZE_X)
153         map.size.x = MIN_FIELDSIZE_X;
154     if (map.size.x > MAX_FIELDSIZE_X)
155         map.size.x = MAX_FIELDSIZE_X;
156     map.size.y = map.size.y | 1;
157     if (map.size.y < MIN_FIELDSIZE_Y)
158         map.size.y = MIN_FIELDSIZE_Y;
159     if (map.size.y > MAX_FIELDSIZE_Y)
160         map.size.y = MAX_FIELDSIZE_Y;
161 
162 	config_write ();
163 	if (GT_MP_PTPM)  net_send_servermode ();
164 }
165 
166 
167 /*
168 	Draw an info Screen about the mapsetting which are currently used
169 */
170 #define WIN_X 500
171 #define WIN_Y 350
172 void
mapinfo()173 mapinfo ()
174 {
175     _keybinput ki;
176     SDL_Event event;
177     int x,
178       y,
179       eventstate,
180       done = 0;
181     char text[255];
182 
183 // draw_menubox (WIN_X, WIN_Y);
184 
185     x = gfx.res.x / 2;
186     y = gfx.res.y / 2 - WIN_Y / 2;
187 
188     sprintf (text, "Map Settings");
189 // font_setcolor (128,128,0,1);
190 // font_draw (x - (font[1].size.x * strlen (text) / 2), y, text, 1);
191 // font_setcolor (255,255,0,1);
192 // font_draw (1 + x - (font[1].size.x * strlen (text) / 2),1 + y, text, 1);
193     y = y + 2 + (font[1].size.y << 1);
194 
195     /* MapSize */
196     sprintf (text, "Fieldsize: %d,%d", map.size.x, map.size.y);
197 // font_setcolor (128,128,128,0);
198 // font_draw (x - (font[0].size.x * strlen (text) / 2), y, text, 0);
199 // font_setcolor (255,255,255,0);
200 // font_draw (1 + x - (font[0].size.x * strlen (text) / 2),1 + y, text, 0);
201     y = y + 2 + font[0].size.y;
202 
203     /* Tileset */
204     if (map.random_tileset)
205         sprintf (text, "Random Tileset");
206     else
207         sprintf (text, "Tileset: %s", map.tileset);
208 // font_setcolor (128,128,128,0);
209 // font_draw (2 + x - (WIN_X / 2), y, text, 0);
210 // font_setcolor (255,255,255,0);
211 // font_draw (3 + x - (WIN_X / 2) ,1 + y, text, 0);
212 
213     /* Mapselection */
214     if (map.map_selection == 0)
215         sprintf (text, "Selected Map: %s", map.map);
216     else if (map.map_selection == 1)
217         sprintf (text, "Random Map");
218     else
219         sprintf (text, "Random Generated Map");
220 // font_setcolor (128,128,128,0);
221 // font_draw (x , y, text, 0);
222 // font_setcolor (255,255,255,0);
223 // font_draw (1 + x, 1 + y, text, 0);
224     y = y + 2 + (font[0].size.y << 1);
225 
226     /* Bomb Powerups */
227     sprintf (text, "Bomb Powerup: %d", map.bombs);
228 // font_setcolor (128,128,128,0);
229 // font_draw (2 + x - (WIN_X / 2), y, text, 0);
230 // font_setcolor (255,255,255,0);
231 // font_draw (3 + x - (WIN_X / 2) ,1 + y, text, 0);
232 
233     /* Trigger */
234     sprintf (text, "Trigger Specials: %d", map.sp_trigger);
235 // font_setcolor (128,128,128,0);
236 // font_draw (x , y, text, 0);
237 // font_setcolor (255,255,255,0);
238 // font_draw (1 + x, 1 + y, text, 0);
239     y = y + 2 + font[0].size.y;
240 
241     /* Fire Powerups */
242     sprintf (text, "Fire Powerup: %d", map.fire);
243 // font_setcolor (128,128,128,0);
244 // font_draw (2 + x - (WIN_X / 2), y, text, 0);
245 // font_setcolor (255,255,255,0);
246 // font_draw (3 + x - (WIN_X / 2) ,1 + y, text, 0);
247 
248     /* Push */
249     sprintf (text, "Push Specials: %d", map.sp_push);
250 // font_setcolor (128,128,128,0);
251 // font_draw (x , y, text, 0);
252 // font_setcolor (255,255,255,0);
253 // font_draw (1 + x, 1 + y, text, 0);
254     y = y + 2 + font[0].size.y;
255 
256     /* Shoe Powerups */
257     sprintf (text, "Shoe Powerup: %d", map.shoes);
258 // font_setcolor (128,128,128,0);
259 // font_draw (2 + x - (WIN_X / 2), y, text, 0);
260 // font_setcolor (255,255,255,0);
261 // font_draw (3 + x - (WIN_X / 2) ,1 + y, text, 0);
262 
263     /* Row */
264     sprintf (text, "Row Specials: %d", map.sp_row);
265 // font_setcolor (128,128,128,0);
266 // font_draw (x , y, text, 0);
267 // font_setcolor (255,255,255,0);
268 // font_draw (1 + x, 1 + y, text, 0);
269     y = y + 2 + font[0].size.y;
270 
271 
272     /* Mixed Powerups */
273     sprintf (text, "Mixed Powerup: %d", map.mixed);
274 // font_setcolor (128,128,128,0);
275 // font_draw (2 + x - (WIN_X / 2), y, text, 0);
276 // font_setcolor (255,255,255,0);
277 // font_draw (3 + x - (WIN_X / 2) ,1 + y, text, 0);
278 
279     /* Special FREE
280        sprintf (text, "Push Specials: %d", map.sp_push);
281        font_setcolor (128,128,128,0);
282        font_draw (x , y, text, 0);
283        font_setcolor (255,255,255,0);
284        font_draw (1 + x, 1 + y, text, 0); */
285     y = y + 2 + font[0].size.y;
286 
287     /* Death Powerups */
288     sprintf (text, "Death Powerup: %d", map.death);
289 // font_setcolor (128,128,128,0);
290 // font_draw (2 + x - (WIN_X / 2), y, text, 0);
291 // font_setcolor (255,255,255,0);
292 // font_draw (3 + x - (WIN_X / 2) ,1 + y, text, 0);
293 
294     /* Special FREE
295        sprintf (text, "Row Specials: %d", map.sp_row);
296        font_setcolor (128,128,128,0);
297        font_draw (x , y, text, 0);
298        font_setcolor (255,255,255,0);
299        font_draw (1 + x, 1 + y, text, 0); */
300     y = y + 2 + font[0].size.y;
301 
302     SDL_Flip (gfx.screen);
303     keybinput_new (&ki, KEYBI_text, 10);
304 
305     while (!done && bman.state == GS_wait) {
306         if (GT_MP && bman.sock != -1) {
307             network_loop ();
308             eventstate = s_fetchevent (&event);
309         }
310         else
311             eventstate = SDL_WaitEvent (&event);
312 
313         if (eventstate != 0)
314             switch (event.type) {
315             case (SDL_QUIT):
316                 bman.state = GS_quit;
317                 done = 1;
318                 break;
319             }
320 
321         done = keybinput_loop (&ki, &event);
322     }
323 }
324 
325 #undef WIN_X
326 #undef WIN_Y
327 
328 
329 /* change start settings for the game */
mapgamesetting()330 void mapgamesetting () {
331     int menuselect = 0;
332 	_charlist gametype [] = {
333 		{"Bomberman", NULL},
334         {"Deathmatch", NULL},
335 		{"Teammode", NULL}
336 	};
337 	_charlist *gametype_sel = &gametype[bman.gametype];
338 	_menu *menu;
339 
340 	charlist_fillarraypointer (gametype, 3);
341 
342     while (menuselect != -1 && bman.state != GS_quit) {
343         menu = menu_new ("Game Options", 420, 400);
344 
345 		menu_create_label (menu, "Start Values", 25, 50, 0, COLOR_brown);
346 		menu_create_entry (menu, "Bombs:", 25, 80, 150, &bman.start_bombs, MAX_BOMBS, MENU_entryint32, 1);
347 		menu_create_entry (menu, "Speed:", 25,110, 150, &bman.start_speed, MAX_SPEED, MENU_entryfloat, 2);
348 		menu_create_entry (menu, "Range:", 25,140, 150, &bman.start_range, MAX_RANGE, MENU_entryint32, 3);
349 
350 		menu_create_label (menu, "Other Values", 200, 50, 0, COLOR_brown);
351         menu_create_entry (menu, "Gametime:", 200, 80, 150, &bman.init_timeout, 1200, MENU_entryint32, 4);
352 
353 		menu_create_label (menu, "Game Parameter", 25, 180, 1, COLOR_brown);
354         menu_create_entry (menu, "Bomb Time:", 25, 220, 200, &bman.bomb_tickingtime, 1200, MENU_entryfloat, 5);
355 		menu_create_label (menu, "Gametype", 25, 250, 0, COLOR_brown);
356 		menu_create_list (menu, "GameType", 25, 280, 150, 60, gametype, &gametype_sel, 6);
357 		menu_create_bool (menu, "Drop Items", 200, 280, 150, &bman.dropitemsondeath, 7);
358 
359         menu_create_button (menu, "Ok", -1, 380, 150, 0);
360         menuselect = menu_loop (menu);
361 		menu_delete (menu);
362 
363 		if (menuselect == 0) {
364 			bman.gametype = gametype_sel- &gametype[0];
365 			menuselect = -1;
366 		}
367     }
368 };
369