Split select_filename into [existing] RegisterPlayer and select_demo for better clarity
This commit is contained in:
parent
d5cf0dd85b
commit
09f7bd6d57
|
@ -5,6 +5,7 @@ D1X-Rebirth Changelog
|
|||
main/game.c, main/gameseq.c, main/inferno.c, main/inferno.h, main/menu.c, main/newdemo.c: Create the main event loop and use it for the game and main menu
|
||||
main/scores.c: Make the scores menu into a window
|
||||
d1x-rebirth.xcodeproj/project.pbxproj, include/3d.h, main/aistruct.h, main/game.h, main/gamefont.h, main/gameseq.h, main/inferno.h, main/laser.h, main/polyobj.h, main/robot.h: Move MAX_SUBMODELS from inferno.h to polyobj.h, fixing #include loop by removing some (mainly object.h) and instead using explicit 'struct' declarations; compile net_ipx.c for Mac SDL Video build
|
||||
main/gameseq.c, main/gameseq.h, main/menu.c, main/menu.h: Split select_filename into [existing] RegisterPlayer and select_demo for better clarity
|
||||
|
||||
20100206
|
||||
--------
|
||||
|
|
|
@ -539,73 +539,6 @@ void create_player_appearance_effect(object *player_obj)
|
|||
// New Game sequencing functions
|
||||
//
|
||||
|
||||
//pairs of chars describing ranges
|
||||
char playername_allowed_chars[] = "azAZ09__--";
|
||||
|
||||
int MakeNewPlayerFile(int allow_abort)
|
||||
{
|
||||
int x;
|
||||
char filename[14];
|
||||
newmenu_item m;
|
||||
char text[CALLSIGN_LEN+9]="";
|
||||
|
||||
strncpy(text, Players[Player_num].callsign,CALLSIGN_LEN);
|
||||
|
||||
try_again:
|
||||
m.type=NM_TYPE_INPUT; m.text_len = CALLSIGN_LEN; m.text = text;
|
||||
|
||||
Newmenu_allowed_chars = playername_allowed_chars;
|
||||
x = newmenu_do( NULL, TXT_ENTER_PILOT_NAME, 1, &m, NULL, NULL );
|
||||
Newmenu_allowed_chars = NULL;
|
||||
|
||||
if ( x < 0 ) {
|
||||
if ( allow_abort ) return 0;
|
||||
goto try_again;
|
||||
}
|
||||
|
||||
if (text[0]==0) //null string
|
||||
goto try_again;
|
||||
|
||||
strlwr(text);
|
||||
|
||||
sprintf( filename, GameArg.SysUsePlayersDir? "Players/%s.plr" : "%s.plr", text );
|
||||
|
||||
if (PHYSFS_exists(filename))
|
||||
{
|
||||
nm_messagebox(NULL, 1, TXT_OK, "%s '%s' %s", TXT_PLAYER, text, TXT_ALREADY_EXISTS );
|
||||
goto try_again;
|
||||
}
|
||||
|
||||
if ( !new_player_config() )
|
||||
goto try_again; // They hit Esc during New player config
|
||||
|
||||
strncpy(Players[Player_num].callsign, text, CALLSIGN_LEN);
|
||||
strlwr(Players[Player_num].callsign);
|
||||
|
||||
write_player_file();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//Inputs the player's name, without putting up the background screen
|
||||
int RegisterPlayer()
|
||||
{
|
||||
int allow_abort_flag = 1;
|
||||
|
||||
if ( Players[Player_num].callsign[0] == 0 )
|
||||
{
|
||||
// Read the last player's name from config file, not lastplr.txt
|
||||
strncpy( Players[Player_num].callsign, GameCfg.LastPlayer, CALLSIGN_LEN );
|
||||
|
||||
if (GameCfg.LastPlayer[0]==0)
|
||||
allow_abort_flag = 0;
|
||||
}
|
||||
|
||||
select_filename(TXT_SELECT_PILOT, ".plr", allow_abort_flag);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
extern int descent_critical_error;
|
||||
|
||||
//get level filename. level numbers start at 1. Secret levels are -1,-2,-3
|
||||
|
|
|
@ -57,13 +57,6 @@ extern int Player_highest_level;
|
|||
// New game sequencing functions
|
||||
//
|
||||
|
||||
// called once at program startup to get the player's name
|
||||
int RegisterPlayer();
|
||||
int MakeNewPlayerFile(int allow_abort);
|
||||
|
||||
// Inputs the player's name, without putting up the background screen
|
||||
void RegisterPlayerSub(int allow_abort_flag);
|
||||
|
||||
// starts a new game on the given level
|
||||
void StartNewGame(int start_level);
|
||||
|
||||
|
|
401
main/menu.c
401
main/menu.c
|
@ -122,6 +122,222 @@ extern void newmenu_close();
|
|||
extern void ReorderPrimary();
|
||||
extern void ReorderSecondary();
|
||||
|
||||
//pairs of chars describing ranges
|
||||
char playername_allowed_chars[] = "azAZ09__--";
|
||||
|
||||
int MakeNewPlayerFile(int allow_abort)
|
||||
{
|
||||
int x;
|
||||
char filename[14];
|
||||
newmenu_item m;
|
||||
char text[CALLSIGN_LEN+9]="";
|
||||
|
||||
strncpy(text, Players[Player_num].callsign,CALLSIGN_LEN);
|
||||
|
||||
try_again:
|
||||
m.type=NM_TYPE_INPUT; m.text_len = CALLSIGN_LEN; m.text = text;
|
||||
|
||||
Newmenu_allowed_chars = playername_allowed_chars;
|
||||
x = newmenu_do( NULL, TXT_ENTER_PILOT_NAME, 1, &m, NULL, NULL );
|
||||
Newmenu_allowed_chars = NULL;
|
||||
|
||||
if ( x < 0 ) {
|
||||
if ( allow_abort ) return 0;
|
||||
goto try_again;
|
||||
}
|
||||
|
||||
if (text[0]==0) //null string
|
||||
goto try_again;
|
||||
|
||||
strlwr(text);
|
||||
|
||||
sprintf( filename, GameArg.SysUsePlayersDir? "Players/%s.plr" : "%s.plr", text );
|
||||
|
||||
if (PHYSFS_exists(filename))
|
||||
{
|
||||
nm_messagebox(NULL, 1, TXT_OK, "%s '%s' %s", TXT_PLAYER, text, TXT_ALREADY_EXISTS );
|
||||
goto try_again;
|
||||
}
|
||||
|
||||
if ( !new_player_config() )
|
||||
goto try_again; // They hit Esc during New player config
|
||||
|
||||
strncpy(Players[Player_num].callsign, text, CALLSIGN_LEN);
|
||||
strlwr(Players[Player_num].callsign);
|
||||
|
||||
write_player_file();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void delete_player_saved_games(char * name);
|
||||
|
||||
int player_menu_keycommand( listbox *lb, d_event *event )
|
||||
{
|
||||
char **items = listbox_get_items(lb);
|
||||
int citem = listbox_get_citem(lb);
|
||||
|
||||
switch (((d_event_keycommand *)event)->keycode)
|
||||
{
|
||||
case KEY_CTRLED+KEY_D:
|
||||
if (citem > 0)
|
||||
{
|
||||
int x = 1;
|
||||
x = nm_messagebox( NULL, 2, TXT_YES, TXT_NO, "%s %s?", TXT_DELETE_PILOT, items[citem]+((items[citem][0]=='$')?1:0) );
|
||||
if (x==0) {
|
||||
char * p;
|
||||
char plxfile[PATH_MAX], efffile[PATH_MAX];
|
||||
int ret;
|
||||
char name[PATH_MAX];
|
||||
|
||||
p = items[citem] + strlen(items[citem]);
|
||||
*p = '.';
|
||||
|
||||
strcpy(name, GameArg.SysUsePlayersDir ? "Players/" : "");
|
||||
strcat(name, items[citem]);
|
||||
|
||||
ret = !PHYSFS_delete(name);
|
||||
*p = 0;
|
||||
|
||||
if (!ret)
|
||||
{
|
||||
delete_player_saved_games( items[citem] );
|
||||
// delete PLX file
|
||||
sprintf(plxfile, GameArg.SysUsePlayersDir? "Players/%.8s.plx" : "%.8s.plx", items[citem]);
|
||||
if (cfexist(plxfile))
|
||||
PHYSFS_delete(plxfile);
|
||||
// delete EFF file
|
||||
sprintf(efffile, GameArg.SysUsePlayersDir? "Players/%.8s.eff" : "%.8s.eff", items[citem]);
|
||||
if (cfexist(efffile))
|
||||
PHYSFS_delete(efffile);
|
||||
}
|
||||
|
||||
if (ret)
|
||||
nm_messagebox( NULL, 1, TXT_OK, "%s %s %s", TXT_COULDNT, TXT_DELETE_PILOT, items[citem]+((items[citem][0]=='$')?1:0) );
|
||||
else
|
||||
listbox_delete_item(lb, citem);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int player_menu_handler( listbox *lb, d_event *event, char **list )
|
||||
{
|
||||
char **items = listbox_get_items(lb);
|
||||
int citem = listbox_get_citem(lb);
|
||||
|
||||
switch (event->type)
|
||||
{
|
||||
case EVENT_KEY_COMMAND:
|
||||
return player_menu_keycommand(lb, event);
|
||||
break;
|
||||
|
||||
case EVENT_NEWMENU_SELECTED:
|
||||
if (citem < 0)
|
||||
return 0; // shouldn't happen
|
||||
else if (citem == 0)
|
||||
{
|
||||
// They selected 'create new pilot'
|
||||
return !MakeNewPlayerFile(1);
|
||||
}
|
||||
else
|
||||
{
|
||||
strncpy(Players[Player_num].callsign,items[citem] + ((items[citem][0]=='$')?1:0), CALLSIGN_LEN);
|
||||
strlwr(Players[Player_num].callsign);
|
||||
}
|
||||
break;
|
||||
|
||||
case EVENT_WINDOW_CLOSE:
|
||||
if (read_player_file() != EZERO)
|
||||
return 1; // abort close!
|
||||
|
||||
WriteConfigFile(); // Update lastplr
|
||||
|
||||
PHYSFS_freeList(list);
|
||||
d_free(items);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fname_sort_func(char **e0, char **e1);
|
||||
|
||||
//Inputs the player's name, without putting up the background screen
|
||||
int RegisterPlayer()
|
||||
{
|
||||
char **m;
|
||||
char **f;
|
||||
char **list;
|
||||
char *types[] = { ".plr", NULL };
|
||||
int i = 0, NumItems;
|
||||
int citem = 0;
|
||||
int allow_abort_flag = 1;
|
||||
|
||||
if ( Players[Player_num].callsign[0] == 0 )
|
||||
{
|
||||
// Read the last player's name from config file, not lastplr.txt
|
||||
strncpy( Players[Player_num].callsign, GameCfg.LastPlayer, CALLSIGN_LEN );
|
||||
|
||||
if (GameCfg.LastPlayer[0]==0)
|
||||
allow_abort_flag = 0;
|
||||
}
|
||||
|
||||
list = PHYSFSX_findFiles(GameArg.SysUsePlayersDir ? "Players/" : "", types);
|
||||
if (!list)
|
||||
return 0; // memory error
|
||||
if (!*list)
|
||||
{
|
||||
MakeNewPlayerFile(0); // make a new player without showing listbox
|
||||
PHYSFS_freeList(list);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
for (NumItems = 0; list[NumItems] != NULL; NumItems++) {}
|
||||
NumItems++; // for TXT_CREATE_NEW
|
||||
|
||||
MALLOC(m, char *, NumItems);
|
||||
if (m == NULL)
|
||||
{
|
||||
PHYSFS_freeList(list);
|
||||
return 0;
|
||||
}
|
||||
|
||||
m[i++] = TXT_CREATE_NEW;
|
||||
|
||||
for (f = list; *f != NULL; f++)
|
||||
{
|
||||
char *p;
|
||||
|
||||
m[i++] = *f;
|
||||
p = strchr(*f, '.');
|
||||
if (p)
|
||||
*p = '\0'; // chop the .plr
|
||||
if ((p - *f) > 8)
|
||||
*f[8] = 0; // sorry guys, can only have up to eight chars for the player name
|
||||
}
|
||||
|
||||
// Sort by name, except the <Create New Player> string
|
||||
qsort(&m[1], NumItems - 1, sizeof(char *), (int (*)( const void *, const void * ))fname_sort_func);
|
||||
|
||||
for ( i=0; i<NumItems; i++ )
|
||||
if (!stricmp(Players[Player_num].callsign, m[i]) )
|
||||
citem = i;
|
||||
|
||||
newmenu_listbox1(TXT_SELECT_PILOT, NumItems, m, allow_abort_flag, citem, (int (*)(listbox *, d_event *, void *))player_menu_handler, list);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int main_menu_handler(newmenu *menu, d_event *event, int *menu_choice )
|
||||
{
|
||||
int curtime;
|
||||
|
@ -255,7 +471,7 @@ void do_option ( int select)
|
|||
case MENU_GAME:
|
||||
break;
|
||||
case MENU_DEMO_PLAY:
|
||||
select_filename(TXT_SELECT_DEMO, ".dem", 1);
|
||||
select_demo();
|
||||
break;
|
||||
case MENU_LOAD_GAME:
|
||||
state_restore_all(0);
|
||||
|
@ -402,19 +618,7 @@ int fname_sort_func(char **e0, char **e1)
|
|||
return stricmp(*e0, *e1);
|
||||
}
|
||||
|
||||
enum file_mode
|
||||
{
|
||||
FILE_PLAYER_MODE = 1,
|
||||
FILE_DEMO_MODE
|
||||
};
|
||||
|
||||
typedef struct file_list
|
||||
{
|
||||
enum file_mode mode;
|
||||
char **list; // just to free it in below callback
|
||||
} file_list;
|
||||
|
||||
int filename_menu_keycommand( listbox *lb, d_event *event, file_list *l )
|
||||
int demo_menu_keycommand( listbox *lb, d_event *event )
|
||||
{
|
||||
char **items = listbox_get_items(lb);
|
||||
int citem = listbox_get_citem(lb);
|
||||
|
@ -422,48 +626,22 @@ int filename_menu_keycommand( listbox *lb, d_event *event, file_list *l )
|
|||
switch (((d_event_keycommand *)event)->keycode)
|
||||
{
|
||||
case KEY_CTRLED+KEY_D:
|
||||
if ( ((l->mode == FILE_PLAYER_MODE)&&(citem>0)) || ((l->mode == FILE_DEMO_MODE)&&(citem>=0)) )
|
||||
if (citem >= 0)
|
||||
{
|
||||
int x = 1;
|
||||
if (l->mode == FILE_PLAYER_MODE)
|
||||
x = nm_messagebox( NULL, 2, TXT_YES, TXT_NO, "%s %s?", TXT_DELETE_PILOT, items[citem]+(((l->mode == FILE_PLAYER_MODE) && items[citem][0]=='$')?1:0) );
|
||||
else if (l->mode == FILE_DEMO_MODE)
|
||||
x = nm_messagebox( NULL, 2, TXT_YES, TXT_NO, "%s %s?", TXT_DELETE_DEMO, items[citem]+(((l->mode == FILE_DEMO_MODE) && items[citem][0]=='$')?1:0) );
|
||||
if (x==0) {
|
||||
char * p;
|
||||
char plxfile[PATH_MAX], efffile[PATH_MAX];
|
||||
x = nm_messagebox( NULL, 2, TXT_YES, TXT_NO, "%s %s?", TXT_DELETE_DEMO, items[citem]+((items[citem][0]=='$')?1:0) );
|
||||
if (x==0)
|
||||
{
|
||||
int ret;
|
||||
char name[PATH_MAX];
|
||||
|
||||
p = items[citem] + strlen(items[citem]);
|
||||
if (l->mode == FILE_PLAYER_MODE)
|
||||
*p = '.';
|
||||
|
||||
strcpy(name, (l->mode == FILE_DEMO_MODE) ? DEMO_DIR : (((l->mode == FILE_PLAYER_MODE) && GameArg.SysUsePlayersDir) ? "Players/" : ""));
|
||||
strcpy(name, DEMO_DIR);
|
||||
strcat(name,items[citem]);
|
||||
|
||||
ret = !PHYSFS_delete(name);
|
||||
if (l->mode == FILE_PLAYER_MODE)
|
||||
*p = 0;
|
||||
|
||||
if ((!ret) && (l->mode == FILE_PLAYER_MODE)) {
|
||||
delete_player_saved_games( items[citem] );
|
||||
// delete PLX file
|
||||
sprintf(plxfile, GameArg.SysUsePlayersDir? "Players/%.8s.plx" : "%.8s.plx", items[citem]);
|
||||
if (cfexist(plxfile))
|
||||
PHYSFS_delete(plxfile);
|
||||
// delete EFF file
|
||||
sprintf(efffile, GameArg.SysUsePlayersDir? "Players/%.8s.eff" : "%.8s.eff", items[citem]);
|
||||
if (cfexist(efffile))
|
||||
PHYSFS_delete(efffile);
|
||||
}
|
||||
|
||||
if (ret) {
|
||||
if (l->mode == FILE_PLAYER_MODE)
|
||||
nm_messagebox( NULL, 1, TXT_OK, "%s %s %s", TXT_COULDNT, TXT_DELETE_PILOT, items[citem]+(((l->mode == FILE_PLAYER_MODE) && items[citem][0]=='$')?1:0) );
|
||||
else if (l->mode == FILE_DEMO_MODE)
|
||||
nm_messagebox( NULL, 1, TXT_OK, "%s %s %s", TXT_COULDNT, TXT_DELETE_DEMO, items[citem]+(((l->mode == FILE_DEMO_MODE) && items[citem][0]=='$')?1:0) );
|
||||
}
|
||||
if (ret)
|
||||
nm_messagebox( NULL, 1, TXT_OK, "%s %s %s", TXT_COULDNT, TXT_DELETE_DEMO, items[citem]+((items[citem][0]=='$')?1:0) );
|
||||
else
|
||||
listbox_delete_item(lb, citem);
|
||||
}
|
||||
|
@ -473,19 +651,18 @@ int filename_menu_keycommand( listbox *lb, d_event *event, file_list *l )
|
|||
break;
|
||||
|
||||
case KEY_CTRLED+KEY_C:
|
||||
if (l->mode == FILE_DEMO_MODE)
|
||||
{
|
||||
int x = 1;
|
||||
char bakname[PATH_MAX];
|
||||
|
||||
// Get backup name
|
||||
change_filename_extension(bakname, items[citem]+(((l->mode == FILE_DEMO_MODE) && items[citem][0]=='$')?1:0), DEMO_BACKUP_EXT);
|
||||
change_filename_extension(bakname, items[citem]+((items[citem][0]=='$')?1:0), DEMO_BACKUP_EXT);
|
||||
x = nm_messagebox( NULL, 2, TXT_YES, TXT_NO, "Are you sure you want to\n"
|
||||
"swap the endianness of\n"
|
||||
"%s? If the file is\n"
|
||||
"already endian native, D1X\n"
|
||||
"will likely crash. A backup\n"
|
||||
"%s will be created", items[citem]+(((l->mode == FILE_DEMO_MODE) && items[citem][0]=='$')?1:0), bakname );
|
||||
"%s will be created", items[citem]+((items[citem][0]=='$')?1:0), bakname );
|
||||
if (!x)
|
||||
newdemo_swap_endian(items[citem]);
|
||||
|
||||
|
@ -497,55 +674,29 @@ int filename_menu_keycommand( listbox *lb, d_event *event, file_list *l )
|
|||
return 0;
|
||||
}
|
||||
|
||||
int filename_menu_handler( listbox *lb, d_event *event, file_list *l )
|
||||
int demo_menu_handler( listbox *lb, d_event *event, void *userdata )
|
||||
{
|
||||
char **items = listbox_get_items(lb);
|
||||
int citem = listbox_get_citem(lb);
|
||||
|
||||
userdata = userdata;
|
||||
|
||||
switch (event->type)
|
||||
{
|
||||
case EVENT_KEY_COMMAND:
|
||||
return filename_menu_keycommand(lb, event, l);
|
||||
return demo_menu_keycommand(lb, event);
|
||||
break;
|
||||
|
||||
case EVENT_NEWMENU_SELECTED:
|
||||
if (citem < 0)
|
||||
return 0; // shouldn't happen
|
||||
|
||||
switch (l->mode)
|
||||
{
|
||||
case FILE_PLAYER_MODE:
|
||||
if (citem == 0)
|
||||
{
|
||||
// They selected 'create new pilot'
|
||||
return !MakeNewPlayerFile(1);
|
||||
}
|
||||
else
|
||||
{
|
||||
strncpy(Players[Player_num].callsign,items[citem] + ((items[citem][0]=='$')?1:0), CALLSIGN_LEN);
|
||||
strlwr(Players[Player_num].callsign);
|
||||
}
|
||||
break;
|
||||
|
||||
case FILE_DEMO_MODE:
|
||||
newdemo_start_playback(items[citem]);
|
||||
// return 1; // later - when the listbox uses the main loop
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case EVENT_WINDOW_CLOSE:
|
||||
if (l->mode == FILE_PLAYER_MODE)
|
||||
{
|
||||
if (read_player_file() != EZERO)
|
||||
return 1; // abort close!
|
||||
|
||||
WriteConfigFile(); // Update lastplr
|
||||
}
|
||||
|
||||
PHYSFS_freeList(l->list);
|
||||
d_free(items);
|
||||
d_free(l);
|
||||
PHYSFS_freeList(items);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -555,92 +706,28 @@ int filename_menu_handler( listbox *lb, d_event *event, file_list *l )
|
|||
return 0;
|
||||
}
|
||||
|
||||
int select_filename(char *title, char *type, int allow_abort_flag)
|
||||
int select_demo(void)
|
||||
{
|
||||
char **m;
|
||||
char **f;
|
||||
file_list *l;
|
||||
char *types[] = { type, NULL };
|
||||
int i = 0, NumItems;
|
||||
int citem = 0;
|
||||
char **list;
|
||||
char *types[] = { ".dem", NULL };
|
||||
int NumItems;
|
||||
|
||||
MALLOC(l, file_list, 1);
|
||||
if (!l)
|
||||
return 0;
|
||||
|
||||
l->mode = 0;
|
||||
if (!stricmp(type, ".plr"))
|
||||
l->mode = FILE_PLAYER_MODE;
|
||||
else if (!stricmp(type, ".dem"))
|
||||
l->mode = FILE_DEMO_MODE;
|
||||
|
||||
l->list = PHYSFSX_findFiles((l->mode == FILE_DEMO_MODE) ? DEMO_DIR : (((l->mode == FILE_PLAYER_MODE) && GameArg.SysUsePlayersDir) ? "Players/" : ""), types);
|
||||
if (!l->list)
|
||||
{
|
||||
d_free(l);
|
||||
list = PHYSFSX_findFiles(DEMO_DIR, types);
|
||||
if (!list)
|
||||
return 0; // memory error
|
||||
}
|
||||
if ( !*l->list && (l->mode == FILE_DEMO_MODE) && (citem > -1) )
|
||||
if ( !*list )
|
||||
{
|
||||
nm_messagebox( NULL, 1, TXT_OK, "%s %s\n%s", TXT_NO_DEMO_FILES, TXT_USE_F5, TXT_TO_CREATE_ONE);
|
||||
PHYSFS_freeList(l->list);
|
||||
d_free(l);
|
||||
return 0;
|
||||
}
|
||||
else if ( !*l->list && (l->mode == FILE_PLAYER_MODE) ) {
|
||||
MakeNewPlayerFile(allow_abort_flag); // make a new player without showing listbox
|
||||
PHYSFS_freeList(l->list);
|
||||
d_free(l);
|
||||
return 0;
|
||||
}
|
||||
else if ( !*l->list ) {
|
||||
nm_messagebox(NULL, 1, "Ok", "%s\n '%s' %s", TXT_NO_FILES_MATCHING, type, TXT_WERE_FOUND);
|
||||
PHYSFS_freeList(l->list);
|
||||
d_free(l);
|
||||
return 0;
|
||||
} // else create a player file
|
||||
|
||||
|
||||
for (NumItems = 0; l->list[NumItems] != NULL; NumItems++) {}
|
||||
if (l->mode == FILE_PLAYER_MODE)
|
||||
NumItems++;
|
||||
|
||||
MALLOC(m, char *, NumItems);
|
||||
if (m == NULL)
|
||||
{
|
||||
PHYSFS_freeList(l->list);
|
||||
d_free(l);
|
||||
PHYSFS_freeList(list);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (l->mode == FILE_PLAYER_MODE)
|
||||
m[i++] = TXT_CREATE_NEW;
|
||||
for (NumItems = 0; list[NumItems] != NULL; NumItems++) {}
|
||||
|
||||
for (f = l->list; *f != NULL; f++)
|
||||
{
|
||||
m[i++] = *f;
|
||||
// Sort by name
|
||||
qsort(list, NumItems, sizeof(char *), (int (*)( const void *, const void * ))fname_sort_func);
|
||||
|
||||
if (l->mode == FILE_PLAYER_MODE)
|
||||
{
|
||||
char *p;
|
||||
|
||||
p = strchr(*f, '.');
|
||||
if (p)
|
||||
*p = '\0'; // chop the .plr
|
||||
if ((p - *f) > 8)
|
||||
*f[8] = 0; // sorry guys, can only have up to eight chars for the player name
|
||||
}
|
||||
}
|
||||
|
||||
// Sort by name, except the <Create New Player> string if applicable
|
||||
qsort(&m[l->mode == FILE_PLAYER_MODE ? 1 : 0], NumItems - (l->mode == FILE_PLAYER_MODE), sizeof(char *), (int (*)( const void *, const void * ))fname_sort_func);
|
||||
|
||||
if (l->mode == FILE_PLAYER_MODE)
|
||||
for ( i=0; i<NumItems; i++ )
|
||||
if (!stricmp(Players[Player_num].callsign, m[i]) )
|
||||
citem = i;
|
||||
|
||||
newmenu_listbox1(title, NumItems, m, allow_abort_flag, citem, (int (*)(listbox *, d_event *, void *))filename_menu_handler, l);
|
||||
newmenu_listbox1(TXT_SELECT_DEMO, NumItems, list, 1, 0, demo_menu_handler, NULL);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -20,10 +20,13 @@ COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
|
|||
#ifndef _MENU_H
|
||||
#define _MENU_H
|
||||
|
||||
// called once at program startup to get the player's name
|
||||
extern int RegisterPlayer();
|
||||
|
||||
// returns number of item chosen
|
||||
extern int DoMenu();
|
||||
extern void do_options_menu();
|
||||
extern int select_filename(char *title, char *type, int allow_abort_flag);
|
||||
extern int select_demo(void);
|
||||
#define Menu_pcx_name (((SWIDTH>=640&&SHEIGHT>=480) && cfexist("menuh.pcx"))?"menuh.pcx":"menu.pcx")
|
||||
#define STARS_BACKGROUND (((SWIDTH>=640&&SHEIGHT>=480) && cfexist("starsb.pcx"))?"starsb.pcx":"stars.pcx")
|
||||
|
||||
|
|
Loading…
Reference in a new issue