quakec/source/menu/menu_maps.qc
2024-11-10 09:56:17 -06:00

186 lines
5.7 KiB
C++

// Since these are built on-the-fly, do not populate here
string menu_maps_buttons[13];
float menu_maps_init;
//
// Menu_Maps_Init()
// Array lookup optimization that stores
// the array index of Stock NZ:P maps
// from the user_maps struct.
//
void() Menu_Maps_Init =
{
menu_maps_init = true;
user_maps_page = 0;
for(int i = 0; i < stock_maps.length; i++) {
for(int j = 0; j < user_maps_count; j++) {
if (user_maps[j].map_name == stock_maps[i].bsp_name)
stock_maps[i].array_index = j;
}
}
};
void() Menu_Maps_NextPage =
{
Menu_PlaySound(MENU_SND_ENTER);
user_maps_page++;
}
void() Menu_Maps_PrevPage =
{
Menu_PlaySound(MENU_SND_ENTER);
user_maps_page--;
}
void(string bsp_name) Menu_Maps_LoadMap =
{
localcmd(sprintf("map %s\n", bsp_name));
current_menu = MENU_MAIN;
};
string(string prev_id) Menu_Maps_GetNextButton =
{
if (prev_id == "")
return menu_maps_buttons[0];
string ret = menu_maps_buttons[0];
for(float i = 0; i < menu_maps_buttons.length; i++) {
if (menu_maps_buttons[i] == prev_id) {
if (i + 1 >= menu_maps_buttons.length)
break;
ret = menu_maps_buttons[i + 1];
break;
}
}
if (ret == "")
return menu_maps_buttons[0];
return ret;
};
string(string next_id) Menu_Maps_GetPreviousButton =
{
// Get the last populated entry.
string last_populated_entry = "";
for(float j = menu_maps_buttons.length - 1; j > 0; j--) {
if (menu_maps_buttons[j] != "") {
last_populated_entry = menu_maps_buttons[j];
break;
}
}
if (next_id == "")
return last_populated_entry;
string ret = last_populated_entry;
for(float i = menu_maps_buttons.length - 1; i > 0; i--) {
if (menu_maps_buttons[i] == next_id) {
if (i - 1 < 0)
break;
ret = menu_maps_buttons[i - 1];
break;
}
}
return ret;
};
void() Menu_Maps =
{
if (!menu_maps_init)
Menu_Maps_Init();
Menu_DrawBackground();
string back_string = "";
float back_menudest = 0;
switch(menu_map_mode) {
case MAP_SOLOSTOCK: Menu_DrawTitle("SELECT MAP: SOLO"); back_string = "Return to Main Menu."; back_menudest = MENU_MAIN; break;
case MAP_SOLOUSER: Menu_DrawTitle("USER MAPS: SOLO"); back_string = "Return to Stock Map selection."; back_menudest = MENU_SOLO; break;
case MAP_COOPSTOCK: Menu_DrawTitle("SELECT MAP: COOP"); back_string = "Return to Create Game Menu."; back_menudest = MENU_COOPCREATE; break;
case MAP_COOPUSER: Menu_DrawTitle("USER MAPS: COOP"); back_string = "Return to Stock Map selection."; back_menudest = MENU_COOPSTOCK; break;
default: break;
}
Menu_DrawMapPanel();
int i;
// Reset map button registry
for(int h = 0; h < 13; h++) {
menu_maps_buttons[h] = "";
}
// Stock Maps
if (menu_map_mode == MAP_SOLOSTOCK || menu_map_mode == MAP_COOPSTOCK) {
for(i = 0; i < stock_maps.length; i++) {
// Build the map strings
menu_maps_buttons[i] = sprintf("map_%s", stock_maps[i].bsp_name);
Menu_MapButton(i + 1, sprintf("map_%s", stock_maps[i].bsp_name), stock_maps[i].bsp_name, -1) ? Menu_Maps_LoadMap(stock_maps[i].bsp_name) : 0;
}
Menu_DrawDivider(i + 1.25);
if (menu_map_mode == MAP_SOLOSTOCK) {
Menu_Button(i + 1.5, "map_nzpusermaps", "USER MAPS", "View User-Created Maps.") ? current_menu = MENU_SOLOUSER : 0;
} else if (menu_map_mode == MAP_COOPSTOCK) {
Menu_Button(i + 1.5, "map_nzpusermaps", "USER MAPS", "View User-Created Maps.") ? current_menu = MENU_COOPUSER : 0;
}
// Usermaps and back button registry
menu_maps_buttons[i] = "map_nzpusermaps";
menu_maps_buttons[i + 1] = "map_back";
} else {
// calculate the amount of usermaps we can display on this page.
int maps_on_page = 10; // default to 10, all that will fit on the UI.
int maps_start_position = (user_maps_page * 10);
// Not all 10 slots can be filled..
if (maps_on_page > user_maps_count - maps_start_position)
maps_on_page = user_maps_count - maps_start_position;
for (i = maps_start_position; i < maps_on_page + maps_start_position; i++) {
int menu_position = (i + 1) - (user_maps_page * 10);
string bsp_name = user_maps[i].map_name;
// Build the map strings
menu_maps_buttons[menu_position - 1] = sprintf("map_%s", bsp_name);
Menu_MapButton(menu_position, sprintf("map_%s", bsp_name), bsp_name, i) ? localcmd(sprintf("map %s\n", bsp_name)) : 0;
}
int current_registry_position = ((i + 1) - (user_maps_page * 10)) - 1;
Menu_DrawDivider(11.25);
if (maps_on_page + maps_start_position < user_maps_count) {
menu_maps_buttons[current_registry_position] = "map_usernext";
current_registry_position++;
Menu_Button(-3, "map_usernext", "NEXT PAGE", "Advance to next User Map page.") ? Menu_Maps_NextPage() : 0;
} else {
Menu_GreyButton(-3, "NEXT PAGE");
}
if (user_maps_page != 0) {
menu_maps_buttons[current_registry_position] = "map_userprev";
current_registry_position++;
Menu_Button(-2, "map_userprev", "PREVIOUS PAGE", "Return to last User Map page.") ? Menu_Maps_PrevPage() : 0;
} else {
Menu_GreyButton(-2, "PREVIOUS PAGE");
}
menu_maps_buttons[current_registry_position] = "map_back";
}
Menu_Button(-1, "map_back", "BACK", back_string) ? current_menu = back_menudest : 0;
sui_pop_frame();
};