First we have to define the new menu, add m_maplist after m_gameoptions
in the enum {...}
now we define the menu voids:
void M_Menu_MapList_f (void);
void M_MapList_Draw (void);
void M_MapList_Key (int key);
so at first we have defined all new menus
now an copy&past code add it after "void M_GameOptions_Key (int key)":
Code: Select all
//=============================================================================
/* MAPLIST MENU */
#include <sys/dirent.h>
#define MAX_FILE_LIST 15
int initState = 1;
int numFiles = 0;
int minFile = 0;
int maxFile = MAX_FILE_LIST;
struct dirent **nombres;
char listaFiles[MAX_FILE_LIST][256];
char nombreFile[MAX_FILE_LIST];
int arrowY = 35;
int posArrow = 0;
int numFileList = 0;
int lastArrowY = 0;
void DeleteArray (char listaFiles[MAX_FILE_LIST][256], int numFileList) {
int i;
for (i = 0; i < numFileList; i++)
strcpy(listaFiles[i], "0");
}
void FileNames (char listaFiles[MAX_FILE_LIST][256], int numFileList) {
int y = 35;
int i;
for(i = 0; i < numFileList; i++) {
M_Print (74, y, listaFiles[i]);
y += 8;
}
}
int isFile(const struct dirent *nombre) {
int isFile = 0;
char *extension = strrchr(nombre->d_name, '.');
if (strcmp(extension, ".bsp") == 0)
isFile = 1;
return isFile;
}
void M_Menu_MapList_f (void)
{
key_dest = key_menu;
m_state = m_maplist;
m_entersound = true;
if(initState) {
numFiles = scandir(va("%s/maps", GAMENAME), &nombres, isFile, alphasort);
if (numFiles < MAX_FILE_LIST) {
maxFile = numFiles;
numFileList = numFiles;
} else
numFileList = MAX_FILE_LIST;
DeleteArray(listaFiles, numFileList);
int x = 0;
int i;
for (i = minFile; i < maxFile; i++){
strcpy(listaFiles[x], nombres[i]->d_name);
x++;
}
initState = 0;
}
}
void M_MapList_Draw (void)
{
qpic_t *p;
int x;
M_DrawTransPic (16, 4, Draw_CachePic ("gfx/qplaque.lmp") );
p = Draw_CachePic ("gfx/p_multi.lmp");
M_DrawPic ( (320-p->width)/2, 4, p);
M_DrawTextBox (56, 27, 23, 15);
if (!numFileList) {
M_PrintWhite (104, 59, "Empty Map list");
return;
} else
FileNames(listaFiles, numFileList);
M_DrawCharacter (64, arrowY, 12 + ((int)(realtime * 4) & 1));
}
void M_MapList_Key (int key)
{
switch (key)
{
case K_ESCAPE:
M_Menu_GameOptions_f ();
break;
case K_UPARROW:
S_LocalSound ("misc/menu1.wav");
arrowY -= 8;
posArrow--;
if (posArrow < 0) {
if (minFile != 0) {
minFile--;
maxFile--;
DeleteArray(listaFiles, numFileList);
int x = 0;
int i;
for (i = minFile; i < maxFile; i++) {
strcpy(listaFiles[x], nombres[i]->d_name);
x++;
}
}
arrowY = 35;
posArrow = 0;
}
break;
case K_DOWNARROW:
S_LocalSound ("misc/menu1.wav");
lastArrowY = arrowY;
arrowY += 8;
if (posArrow > numFileList-2) {
if(maxFile+1 <= numFiles) {
minFile++;
maxFile++;
DeleteArray(listaFiles, numFileList);
int x = 0;
int i;
for (i = minFile; i < maxFile; i++) {
strcpy(listaFiles[x], nombres[i]->d_name);
x++;
}
}
arrowY = lastArrowY;
} else
posArrow++;
break;
case K_ENTER:
S_LocalSound ("misc/menu2.wav");
strcpy(nombreFile, listaFiles[posArrow]);
COM_StripExtension (nombreFile, nombreFile);
COM_StripExtension (nombreFile, nombreFile);
Cbuf_AddText (va("map %s\n", nombreFile));
break;
}
}
"M_Init" add:
Cmd_AddCommand ("menu_maplist", M_Menu_MapList_f);
"M_Draw"
case m_maplist:
M_MapList_Draw ();
break;
"M_Keydown" add:
case m_maplist:
M_MapList_Key (key);
return;
now we have an working Custom maplist.