/* $Id: mapmenu.c,v 1.14 2003/12/26 02:20:10 stpohle Exp $ */ /* map/tileset selection menu */ #include "bomberclone.h" #include "menu.h" /* launch the map options menu */ void mapmenu () { int menuselect = 0; char *mapname = NULL, pathname[LEN_PATHFILENAME]; _charlist maptypes[] = { {"selected file", NULL}, {"random file", NULL}, {"autogenerated", NULL} }, tiletypes[] = { { "random"}, { "selected"} }, tunneltypes[] = { { "normal"}, { "tunnel"}, { "random"},}, *selmt = NULL, *selts = NULL, *seltt = NULL; char mname[100]; charlist_fillarraypointer (maptypes, 3); charlist_fillarraypointer (tiletypes, 2); charlist_fillarraypointer (tunneltypes, 3); while (menuselect != -1 && bman.state != GS_quit) { menu_new ("Map Options", 420, 400); // map.map_selection=MAPS_select; switch (map.map_selection) { case (MAPS_select): // Selected Map selmt = charlist_findtext (maptypes, "selected file"); if (map.map[0] == 0) sprintf (mname, "< undefined >"); else sprintf (mname, "%s", getfilename (map.map)); menu_create_label ("Selected Map:", 20, 160, 0); menu_create_button (mname, 10, 180, 170, 2); break; case (MAPS_randmap): // Random Map selmt = charlist_findtext (maptypes, "random file"); break; case (MAPS_randgen): // Random Generated Map selmt = charlist_findtext (maptypes, "autogenerated"); d_printf ("autogen\n"); menu_create_entry ("X Size:", 20, 160, 120, &map.size.x, MAX_FIELDSIZE_X, MENU_entryint, 2); menu_create_entry ("Y Size:", 20, 180, 120, &map.size.y, MAX_FIELDSIZE_Y, MENU_entryint, 3); break; } if (map.random_tileset) { selts = charlist_findtext (tiletypes, "selected"); if (map.tileset[0] == 0) sprintf (mname, "< undefined >"); else sprintf (mname, "%s", map.tileset); menu_create_label ("Selected Tileset:", 250, 140, 0); menu_create_button (mname, 250, 160, 170, 5); } else { selts = charlist_findtext (tiletypes, "random"); }; switch (map.type) { case (MAPT_normal): seltt = charlist_findtext (tunneltypes, "normal"); break; case (MAPT_tunnel): seltt = charlist_findtext (tunneltypes, "tunnel"); break; default: seltt = charlist_findtext (tunneltypes, "random"); break; } menu_create_label ("Map Type:", 10, 50, 1); menu_create_label ("Tileset:", 250, 50, 1); menu_create_label ("Items:", 220, 200, 1); menu_create_list ("mt", 10, 85, 170, 60, maptypes, &selmt, 1); menu_create_list ("ts", 250, 85, 170, 40, tiletypes, &selts, 4); menu_create_list ("tt", 10, 220, 100, 60, tunneltypes, &seltt, 6); menu_create_entry ("Bombs:", 140, 240, 110, &map.bombs, 100, MENU_entryint, 7); menu_create_entry ("Fire: ", 140, 260, 110, &map.fire, 100, MENU_entryint, 8); menu_create_entry ("Shoes:", 140, 280, 110, &map.shoes, 100, MENU_entryint, 9); menu_create_entry ("Mixed:", 140, 300, 110, &map.mixed, 100, MENU_entryint, 10); menu_create_entry ("Death:", 140, 320, 110, &map.death, 100, MENU_entryint, 11); menu_create_entry ("Trigger:", 280, 240, 120, &map.sp_trigger, 30, MENU_entryint, 12); menu_create_entry ("Push: ", 280, 260, 120, &map.sp_push, 30, MENU_entryint, 13); menu_create_entry ("Row: ", 280, 280, 120, &map.sp_row, 30, MENU_entryint, 14); menu_create_entry ("Game Timeout:", -1, 350, 180, &bman.init_timeout, 900, MENU_entryint, 15); menu_create_button ("Ok", -1, 380, 150, 0); menuselect = menu_loop (); menu_delete (); switch (menuselect) { case (0): menuselect = -1; break; case (1): // Select map.map_selection = selmt - &maptypes[0]; break; case (2): // Select Map sprintf (pathname, "%s/maps", bman.datapath); // mapname = menu_dir_select ("Select Map", pathname, DF_file); if (mapname == NULL) { map.map[0] = 0; map.map_selection = 2; } else { FILE *fmap; sprintf (map.map, "%s/maps/%s", bman.datapath, mapname); if ((fmap = fopen (map.map, "r"))) map_load (fmap); } break; case (4): // Random Tileset map.random_tileset = selts - &tiletypes[0]; d_printf ("Tile:%d\n", map.random_tileset); break; case (5): // Selected Tileset sprintf (pathname, "%s/tileset", bman.datapath); // mapname = menu_dir_select ("Select Tileset", pathname, DF_dir); if (mapname == NULL) { map.tileset[0] = 0; map.random_tileset = 1; } else strcpy (map.tileset, mapname); break; case (6): // Random Tileset map.type = seltt - &tunneltypes[0]; if (map.type == 2) map.type = -1; d_printf ("Tunnel:%d\n", map.type); break; } } map.size.x = map.size.x | 1; if (map.size.x < MIN_FIELDSIZE_X) map.size.x = MIN_FIELDSIZE_X; if (map.size.x > MAX_FIELDSIZE_X) map.size.x = MAX_FIELDSIZE_X; map.size.y = map.size.y | 1; if (map.size.y < MIN_FIELDSIZE_Y) map.size.y = MIN_FIELDSIZE_Y; if (map.size.y > MAX_FIELDSIZE_Y) map.size.y = MAX_FIELDSIZE_Y; } /* Draw an info Screen about the mapsetting which are currently used */ #define WIN_X 500 #define WIN_Y 350 void mapinfo () { _keybinput ki; SDL_Event event; int x, y, eventstate, done = 0; char text[255]; // draw_menubox (WIN_X, WIN_Y); x = gfx.res.x / 2; y = gfx.res.y / 2 - WIN_Y / 2; sprintf (text, "Map Settings"); // font_setcolor (128,128,0,1); // font_draw (x - (font[1].size.x * strlen (text) / 2), y, text, 1); // font_setcolor (255,255,0,1); // font_draw (1 + x - (font[1].size.x * strlen (text) / 2),1 + y, text, 1); y = y + 2 + (font[1].size.y << 1); /* MapSize */ sprintf (text, "Fieldsize: %d,%d", map.size.x, map.size.y); // font_setcolor (128,128,128,0); // font_draw (x - (font[0].size.x * strlen (text) / 2), y, text, 0); // font_setcolor (255,255,255,0); // font_draw (1 + x - (font[0].size.x * strlen (text) / 2),1 + y, text, 0); y = y + 2 + font[0].size.y; /* Tileset */ if (map.random_tileset) sprintf (text, "Random Tileset"); else sprintf (text, "Tileset: %s", map.tileset); // font_setcolor (128,128,128,0); // font_draw (2 + x - (WIN_X / 2), y, text, 0); // font_setcolor (255,255,255,0); // font_draw (3 + x - (WIN_X / 2) ,1 + y, text, 0); /* Mapselection */ if (map.map_selection == 0) sprintf (text, "Selected Map: %s", map.map); else if (map.map_selection == 1) sprintf (text, "Random Map"); else sprintf (text, "Random Generated Map"); // font_setcolor (128,128,128,0); // font_draw (x , y, text, 0); // font_setcolor (255,255,255,0); // font_draw (1 + x, 1 + y, text, 0); y = y + 2 + (font[0].size.y << 1); /* Bomb Powerups */ sprintf (text, "Bomb Powerup: %d", map.bombs); // font_setcolor (128,128,128,0); // font_draw (2 + x - (WIN_X / 2), y, text, 0); // font_setcolor (255,255,255,0); // font_draw (3 + x - (WIN_X / 2) ,1 + y, text, 0); /* Trigger */ sprintf (text, "Trigger Specials: %d", map.sp_trigger); // font_setcolor (128,128,128,0); // font_draw (x , y, text, 0); // font_setcolor (255,255,255,0); // font_draw (1 + x, 1 + y, text, 0); y = y + 2 + font[0].size.y; /* Fire Powerups */ sprintf (text, "Fire Powerup: %d", map.fire); // font_setcolor (128,128,128,0); // font_draw (2 + x - (WIN_X / 2), y, text, 0); // font_setcolor (255,255,255,0); // font_draw (3 + x - (WIN_X / 2) ,1 + y, text, 0); /* Push */ sprintf (text, "Push Specials: %d", map.sp_push); // font_setcolor (128,128,128,0); // font_draw (x , y, text, 0); // font_setcolor (255,255,255,0); // font_draw (1 + x, 1 + y, text, 0); y = y + 2 + font[0].size.y; /* Shoe Powerups */ sprintf (text, "Shoe Powerup: %d", map.shoes); // font_setcolor (128,128,128,0); // font_draw (2 + x - (WIN_X / 2), y, text, 0); // font_setcolor (255,255,255,0); // font_draw (3 + x - (WIN_X / 2) ,1 + y, text, 0); /* Row */ sprintf (text, "Row Specials: %d", map.sp_row); // font_setcolor (128,128,128,0); // font_draw (x , y, text, 0); // font_setcolor (255,255,255,0); // font_draw (1 + x, 1 + y, text, 0); y = y + 2 + font[0].size.y; /* Mixed Powerups */ sprintf (text, "Mixed Powerup: %d", map.mixed); // font_setcolor (128,128,128,0); // font_draw (2 + x - (WIN_X / 2), y, text, 0); // font_setcolor (255,255,255,0); // font_draw (3 + x - (WIN_X / 2) ,1 + y, text, 0); /* Special FREE sprintf (text, "Push Specials: %d", map.sp_push); font_setcolor (128,128,128,0); font_draw (x , y, text, 0); font_setcolor (255,255,255,0); font_draw (1 + x, 1 + y, text, 0); */ y = y + 2 + font[0].size.y; /* Death Powerups */ sprintf (text, "Death Powerup: %d", map.death); // font_setcolor (128,128,128,0); // font_draw (2 + x - (WIN_X / 2), y, text, 0); // font_setcolor (255,255,255,0); // font_draw (3 + x - (WIN_X / 2) ,1 + y, text, 0); /* Special FREE sprintf (text, "Row Specials: %d", map.sp_row); font_setcolor (128,128,128,0); font_draw (x , y, text, 0); font_setcolor (255,255,255,0); font_draw (1 + x, 1 + y, text, 0); */ y = y + 2 + font[0].size.y; SDL_Flip (gfx.screen); keybinput_new (&ki, KEYBI_text, 10); while (!done && bman.state == GS_wait) { if (GT_MP && bman.sock != -1) { network_loop (); eventstate = SDL_PollEvent (&event); } else eventstate = SDL_WaitEvent (&event); if (eventstate != 0) switch (event.type) { case (SDL_QUIT): bman.state = GS_quit; done = 1; break; } done = keybinput_loop (&ki, &event); } } #undef WIN_X #undef WIN_Y