/* $Id: menu.c,v 1.1.1.1 2006/03/17 19:56:12 zicodxx Exp $ */ /* THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE. COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. */ /* * * Inferno main menu. * */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include "menu.h" #include "inferno.h" #include "game.h" #include "gr.h" #include "key.h" #include "iff.h" #include "u_mem.h" #include "error.h" #include "bm.h" #include "screens.h" #include "mono.h" #include "joy.h" #include "vecmat.h" #include "effects.h" #include "slew.h" #include "gamemine.h" #include "gamesave.h" #include "palette.h" #include "args.h" #include "newdemo.h" #include "timer.h" #include "sounds.h" #include "gameseq.h" #include "text.h" #include "gamefont.h" #include "newmenu.h" #ifdef NETWORK # include "network.h" # include "netdrv.h" # include "multi.h" #endif #include "scores.h" #include "joydefs.h" #include "playsave.h" #include "kconfig.h" #include "titles.h" #include "credits.h" #include "texmap.h" #include "polyobj.h" #include "state.h" #include "mission.h" #include "songs.h" #include "config.h" #include "movie.h" #include "gamepal.h" #include "gauges.h" #include "powerup.h" #include "strutil.h" #include "reorder.h" #ifdef EDITOR #include "editor/editor.h" #endif //char *menu_difficulty_text[] = { "Trainee", "Rookie", "Fighter", "Hotshot", "Insane" }; //char *menu_detail_text[] = { "Lowest", "Low", "Medium", "High", "Highest", "", "Custom..." }; #define MENU_NEW_GAME 0 #define MENU_GAME 1 #define MENU_EDITOR 2 #define MENU_VIEW_SCORES 3 #define MENU_QUIT 4 #define MENU_LOAD_GAME 5 #define MENU_SAVE_GAME 6 #define MENU_DEMO_PLAY 8 #define MENU_LOAD_LEVEL 9 #define MENU_START_IPX_NETGAME 10 #define MENU_JOIN_IPX_NETGAME 11 #define MENU_CONFIG 13 #define MENU_REJOIN_NETGAME 14 #define MENU_DIFFICULTY 15 #define MENU_HELP 19 #define MENU_NEW_PLAYER 20 #define MENU_MULTIPLAYER 21 #define MENU_SHOW_CREDITS 23 #define MENU_ORDER_INFO 24 #define MENU_PLAY_SONG 25 //#define MENU_START_TCP_NETGAME 26 // TCP/IP support was planned in Descent II, //#define MENU_JOIN_TCP_NETGAME 27 // but never realized. #define MENU_START_APPLETALK_NETGAME 28 #define MENU_JOIN_APPLETALK_NETGAME 29 #define MENU_START_UDP_NETGAME 30 // UDP/IP support copied from d1x #define MENU_JOIN_UDP_NETGAME 31 #define MENU_START_KALI_NETGAME 32 // Kali support copied from d1x #define MENU_JOIN_KALI_NETGAME 33 //ADD_ITEM("Start netgame...", MENU_START_NETGAME, -1 ); //ADD_ITEM("Send net message...", MENU_SEND_NET_MESSAGE, -1 ); #define ADD_ITEM(t,value,key) do { m[num_options].type=NM_TYPE_MENU; m[num_options].text=t; menu_choice[num_options]=value;num_options++; } while (0) //unused - extern int last_joy_time; //last time the joystick was used #ifndef NDEBUG extern int Speedtest_on; #else #define Speedtest_on 0 #endif void do_sound_menu(); void do_toggles_menu(); int Player_default_difficulty; // Last difficulty level chosen by the player int Auto_leveling_on = 1; int Guided_in_big_window = 0; int EscortHotKeys=1; // Function Prototypes added after LINTING void do_option(int select); void do_detail_level_menu_custom(void); void do_new_game_menu(void); #ifdef NETWORK void do_multi_player_menu(void); void do_ip_manual_join_menu(); int UDPConnectManual(char *addr); #endif //NETWORK extern void newmenu_close(); //returns the number of demo files on the disk int newdemo_count_demos(); // ------------------------------------------------------------------------ void autodemo_menu_check(int nitems, newmenu_item * items, int *last_key, int citem ) { int curtime; nitems = nitems; items=items; citem = citem; // Don't allow them to hit ESC in the main menu. if (*last_key==KEY_ESC) *last_key = 0; curtime = timer_get_approx_seconds(); if ( keyd_time_when_last_pressed+i2f(25) < curtime || GameArg.SysAutoDemo ) { int n_demos; n_demos = newdemo_count_demos(); try_again:; if (((d_rand() % (n_demos+1)) == 0) && !GameArg.SysAutoDemo) { #ifndef SHAREWARE #ifdef OGL Screen_mode = -1; #endif PlayMovie("intro.mve",0); songs_play_song(SONG_TITLE,1); *last_key = -3; //exit menu to force redraw even if not going to game mode. -3 tells menu system not to restore set_screen_mode(SCREEN_MENU); #endif // end of ifndef shareware } else { WIN(HideCursorW()); if (curtime < 0) curtime = 0; keyd_time_when_last_pressed = curtime; // Reset timer so that disk won't thrash if no demos. newdemo_start_playback(NULL); // Randomly pick a file if (Newdemo_state == ND_STATE_PLAYBACK) { Function_mode = FMODE_GAME; *last_key = -3; //exit menu to get into game mode. -3 tells menu system not to restore } else goto try_again; //keep trying until we get a demo that works } } } static int main_menu_choice = 0; // ----------------------------------------------------------------------------- // Create the main menu. void create_main_menu(newmenu_item *m, int *menu_choice, int *callers_num_options) { int num_options; gr_update(); #ifndef DEMO_ONLY num_options = 0; set_screen_mode (SCREEN_MENU); ADD_ITEM(TXT_NEW_GAME,MENU_NEW_GAME,KEY_N); ADD_ITEM(TXT_LOAD_GAME,MENU_LOAD_GAME,KEY_L); #ifdef NETWORK ADD_ITEM(TXT_MULTIPLAYER_,MENU_MULTIPLAYER,-1); #endif ADD_ITEM(TXT_OPTIONS_, MENU_CONFIG, -1 ); ADD_ITEM(TXT_CHANGE_PILOTS,MENU_NEW_PLAYER,unused); ADD_ITEM(TXT_VIEW_DEMO,MENU_DEMO_PLAY,0); ADD_ITEM(TXT_VIEW_SCORES,MENU_VIEW_SCORES,KEY_V); if (cfexist("orderd2.pcx")) /* SHAREWARE */ ADD_ITEM(TXT_ORDERING_INFO,MENU_ORDER_INFO,-1); ADD_ITEM(TXT_CREDITS,MENU_SHOW_CREDITS,-1); #endif ADD_ITEM(TXT_QUIT,MENU_QUIT,KEY_Q); #ifndef RELEASE if (!(Game_mode & GM_MULTI )) { //m[num_options].type=NM_TYPE_TEXT; //m[num_options++].text=" Debug options:"; ADD_ITEM(" Load level...",MENU_LOAD_LEVEL ,KEY_N); #ifdef EDITOR ADD_ITEM(" Editor", MENU_EDITOR, KEY_E); #endif } //ADD_ITEM( " Play song", MENU_PLAY_SONG, -1 ); #endif *callers_num_options = num_options; } //returns number of item chosen int DoMenu() { int menu_choice[25]; newmenu_item m[25]; int num_options = 0; if ( Players[Player_num].callsign[0]==0 ) { RegisterPlayer(); return 0; } load_palette(MENU_PALETTE,0,1); //get correct palette do { create_main_menu(m, menu_choice, &num_options); // may have to change, eg, maybe selected pilot and no save games. keyd_time_when_last_pressed = timer_get_fixed_seconds(); // .. 20 seconds from now! if (main_menu_choice < 0 ) main_menu_choice = 0; main_menu_choice = newmenu_do2( "", NULL, num_options, m, autodemo_menu_check, main_menu_choice, Menu_pcx_name); if ( main_menu_choice > -1 ) do_option(menu_choice[main_menu_choice]); } while( Function_mode==FMODE_MENU ); // if (main_menu_choice != -2) // do_auto_demo = 0; // No more auto demos if ( Function_mode==FMODE_GAME ) gr_palette_fade_out( gr_palette, 32, 0 ); return main_menu_choice; } extern void show_order_form(void); // John didn't want this in inferno.h so I just externed it. //returns flag, true means quit menu void do_option ( int select) { switch (select) { case MENU_NEW_GAME: do_new_game_menu(); break; case MENU_GAME: break; case MENU_DEMO_PLAY: { char demo_file[16]; if (newmenu_get_filename(TXT_SELECT_DEMO, ".dem", demo_file, 1)) newdemo_start_playback(demo_file); break; } case MENU_LOAD_GAME: state_restore_all(0, 0, NULL); break; #ifdef EDITOR case MENU_EDITOR: Function_mode = FMODE_EDITOR; init_cockpit(); break; #endif case MENU_VIEW_SCORES: gr_palette_fade_out( gr_palette,32,0 ); scores_view(-1); break; #if 1 //def SHAREWARE case MENU_ORDER_INFO: show_order_form(); break; #endif case MENU_QUIT: #ifdef EDITOR if (! SafetyCheck()) break; #endif gr_palette_fade_out( gr_palette,32,0); Function_mode = FMODE_EXIT; break; case MENU_NEW_PLAYER: RegisterPlayer(); //1 == allow escape out of menu break; #ifndef RELEASE case MENU_PLAY_SONG: { int i; char * m[MAX_NUM_SONGS]; for (i=0;i -1 ) { songs_play_song( i, 0 ); } } break; case MENU_LOAD_LEVEL: if (Current_mission || select_mission(0, "Load Level\n\nSelect mission")) { newmenu_item m; char text[10]=""; int new_level_num; m.type=NM_TYPE_INPUT; m.text_len = 10; m.text = text; newmenu_do( NULL, "Enter level to load", 1, &m, NULL ); new_level_num = atoi(m.text); if (new_level_num!=0 && new_level_num>=Last_secret_level && new_level_num<=Last_level) { gr_palette_fade_out( gr_palette, 32, 0 ); StartNewGame(new_level_num); } } break; #endif //ifndef RELEASE #ifdef NETWORK case MENU_START_IPX_NETGAME: case MENU_JOIN_IPX_NETGAME: case MENU_START_KALI_NETGAME: case MENU_JOIN_KALI_NETGAME: switch (select & ~0x1) { case MENU_START_IPX_NETGAME: NetDrvSet(NETPROTO_IPX); break; case MENU_START_KALI_NETGAME: NetDrvSet(NETPROTO_KALINIX); break; default: Int3(); } if ((select & 0x1) == 0) // MENU_START_*_NETGAME network_start_game(); else // MENU_JOIN_*_NETGAME network_join_game(); break; case MENU_START_UDP_NETGAME: NetDrvSet(NETPROTO_UDP); network_start_game(); break; case MENU_JOIN_UDP_NETGAME: NetDrvSet(NETPROTO_UDP); do_ip_manual_join_menu(); break; case MENU_MULTIPLAYER: do_multi_player_menu(); break; #endif //NETWORK case MENU_CONFIG: do_options_menu(); break; case MENU_SHOW_CREDITS: gr_palette_fade_out( gr_palette,32,0); songs_stop_all(); credits_show(NULL); break; default: Error("Unknown option %d in do_option",select); break; } } int do_difficulty_menu() { int s; newmenu_item m[5]; m[0].type=NM_TYPE_MENU; m[0].text=MENU_DIFFICULTY_TEXT(0); m[1].type=NM_TYPE_MENU; m[1].text=MENU_DIFFICULTY_TEXT(1); m[2].type=NM_TYPE_MENU; m[2].text=MENU_DIFFICULTY_TEXT(2); m[3].type=NM_TYPE_MENU; m[3].text=MENU_DIFFICULTY_TEXT(3); m[4].type=NM_TYPE_MENU; m[4].text=MENU_DIFFICULTY_TEXT(4); s = newmenu_do1( NULL, TXT_DIFFICULTY_LEVEL, NDL, m, NULL, Difficulty_level); if (s > -1 ) { if (s != Difficulty_level) { Player_default_difficulty = s; write_player_file(); } Difficulty_level = s; mprintf((0, "%s %s %i\n", TXT_DIFFICULTY_LEVEL, TXT_SET_TO, Difficulty_level)); return 1; } return 0; } int Max_debris_objects, Max_objects_onscreen_detailed; int Max_linear_depth_objects; sbyte Object_complexity=2, Object_detail=2; sbyte Wall_detail=2, Wall_render_depth=2, Debris_amount=2, SoundChannels = 2; sbyte Render_depths[NUM_DETAIL_LEVELS-1] = { 6, 9, 12, 15, 50}; sbyte Max_perspective_depths[NUM_DETAIL_LEVELS-1] = { 1, 2, 3, 5, 8}; sbyte Max_linear_depths[NUM_DETAIL_LEVELS-1] = { 3, 5, 7, 10, 50}; sbyte Max_linear_depths_objects[NUM_DETAIL_LEVELS-1] = { 1, 2, 3, 7, 20}; sbyte Max_debris_objects_list[NUM_DETAIL_LEVELS-1] = { 2, 4, 7, 10, 15}; sbyte Max_objects_onscreen_detailed_list[NUM_DETAIL_LEVELS-1] = { 2, 4, 7, 10, 15}; sbyte Smts_list[NUM_DETAIL_LEVELS-1] = { 2, 4, 8, 16, 50}; // threshold for models to go to lower detail model, gets multiplied by obj->size sbyte Max_sound_channels[NUM_DETAIL_LEVELS-1] = { 2, 4, 8, 12, 16}; // ----------------------------------------------------------------------------- // Set detail level based stuff. // Note: Highest detail level (detail_level == NUM_DETAIL_LEVELS-1) is custom detail level. void set_detail_level_parameters(int detail_level) { Assert((detail_level >= 0) && (detail_level < NUM_DETAIL_LEVELS)); if (detail_level < NUM_DETAIL_LEVELS-1) { Render_depth = Render_depths[detail_level]; Max_perspective_depth = Max_perspective_depths[detail_level]; Max_linear_depth = Max_linear_depths[detail_level]; Max_linear_depth_objects = Max_linear_depths_objects[detail_level]; Max_debris_objects = Max_debris_objects_list[detail_level]; Max_objects_onscreen_detailed = Max_objects_onscreen_detailed_list[detail_level]; Simple_model_threshhold_scale = Smts_list[detail_level]; digi_set_max_channels( Max_sound_channels[ detail_level ] ); // Set custom menu defaults. Object_complexity = detail_level; Wall_render_depth = detail_level; Object_detail = detail_level; Wall_detail = detail_level; Debris_amount = detail_level; SoundChannels = detail_level; } } // ----------------------------------------------------------------------------- void do_detail_level_menu(void) { int s; newmenu_item m[7]; m[0].type=NM_TYPE_MENU; m[0].text=MENU_DETAIL_TEXT(0); m[1].type=NM_TYPE_MENU; m[1].text=MENU_DETAIL_TEXT(1); m[2].type=NM_TYPE_MENU; m[2].text=MENU_DETAIL_TEXT(2); m[3].type=NM_TYPE_MENU; m[3].text=MENU_DETAIL_TEXT(3); m[4].type=NM_TYPE_MENU; m[4].text=MENU_DETAIL_TEXT(4); m[5].type=NM_TYPE_TEXT; m[5].text=""; m[6].type=NM_TYPE_MENU; m[6].text=MENU_DETAIL_TEXT(5); s = newmenu_do1( NULL, TXT_DETAIL_LEVEL , NDL+2, m, NULL, Detail_level); if (s > -1 ) { switch (s) { case 0: case 1: case 2: case 3: case 4: Detail_level = s; mprintf((0, "Detail level set to %i\n", Detail_level)); set_detail_level_parameters(Detail_level); break; case 6: Detail_level = 5; do_detail_level_menu_custom(); break; } } } // ----------------------------------------------------------------------------- void do_detail_level_menu_custom_menuset(int nitems, newmenu_item * items, int *last_key, int citem ) { nitems = nitems; *last_key = *last_key; citem = citem; Object_complexity = items[0].value; Object_detail = items[1].value; Wall_detail = items[2].value; Wall_render_depth = items[3].value; Debris_amount = items[4].value; SoundChannels = items[5].value; } void set_custom_detail_vars(void) { Render_depth = Render_depths[Wall_render_depth]; Max_perspective_depth = Max_perspective_depths[Wall_detail]; Max_linear_depth = Max_linear_depths[Wall_detail]; Max_debris_objects = Max_debris_objects_list[Debris_amount]; Max_objects_onscreen_detailed = Max_objects_onscreen_detailed_list[Object_complexity]; Simple_model_threshhold_scale = Smts_list[Object_complexity]; Max_linear_depth_objects = Max_linear_depths_objects[Object_detail]; digi_set_max_channels( Max_sound_channels[ SoundChannels ] ); } #define DL_MAX 10 // ----------------------------------------------------------------------------- void do_detail_level_menu_custom(void) { int count; int s=0; newmenu_item m[DL_MAX]; do { count = 0; m[count].type = NM_TYPE_SLIDER; m[count].text = TXT_OBJ_COMPLEXITY; m[count].value = Object_complexity; m[count].min_value = 0; m[count++].max_value = NDL-1; m[count].type = NM_TYPE_SLIDER; m[count].text = TXT_OBJ_DETAIL; m[count].value = Object_detail; m[count].min_value = 0; m[count++].max_value = NDL-1; m[count].type = NM_TYPE_SLIDER; m[count].text = TXT_WALL_DETAIL; m[count].value = Wall_detail; m[count].min_value = 0; m[count++].max_value = NDL-1; m[count].type = NM_TYPE_SLIDER; m[count].text = TXT_WALL_RENDER_DEPTH; m[count].value = Wall_render_depth; m[count].min_value = 0; m[count++].max_value = NDL-1; m[count].type = NM_TYPE_SLIDER; m[count].text= TXT_DEBRIS_AMOUNT; m[count].value = Debris_amount; m[count].min_value = 0; m[count++].max_value = NDL-1; m[count].type = NM_TYPE_SLIDER; m[count].text= TXT_SOUND_CHANNELS; m[count].value = SoundChannels; m[count].min_value = 0; m[count++].max_value = NDL-1; m[count].type = NM_TYPE_TEXT; m[count++].text= TXT_LO_HI; Assert(count < DL_MAX); s = newmenu_do1( NULL, TXT_DETAIL_CUSTOM, count, m, do_detail_level_menu_custom_menuset, s); } while (s > -1); set_custom_detail_vars(); } void do_new_game_menu() { int new_level_num,player_highest_level; if (!select_mission(0, "New Game\n\nSelect mission")) return; new_level_num = 1; player_highest_level = get_highest_level(); if (player_highest_level > Last_level) player_highest_level = Last_level; if (player_highest_level > 1) { newmenu_item m[4]; char info_text[80]; char num_text[10]; int choice; int n_items; try_again: sprintf(info_text,"%s %d",TXT_START_ANY_LEVEL, player_highest_level); m[0].type=NM_TYPE_TEXT; m[0].text = info_text; m[1].type=NM_TYPE_INPUT; m[1].text_len = 10; m[1].text = num_text; n_items = 2; strcpy(num_text,"1"); choice = newmenu_do( NULL, TXT_SELECT_START_LEV, n_items, m, NULL ); if (choice==-1 || m[1].text[0]==0) return; new_level_num = atoi(m[1].text); if (!(new_level_num>0 && new_level_num<=player_highest_level)) { m[0].text = TXT_ENTER_TO_CONT; nm_messagebox( NULL, 1, TXT_OK, TXT_INVALID_LEVEL); goto try_again; } } Difficulty_level = Player_default_difficulty; if (!do_difficulty_menu()) return; gr_palette_fade_out( gr_palette, 32, 0 ); StartNewGame(new_level_num); } extern void GameLoop(int, int ); void options_menuset(int nitems, newmenu_item * items, int *last_key, int citem ) { if ( citem==4) { gr_palette_set_gamma(items[4].value); } nitems++; //kill warning last_key++; //kill warning } // added on 9/20/98 by Victor Rachels to attempt to add screen res change ingame // Changed on 3/24/99 by Owen Evans to make it work =) void change_res_poll() { } void change_res() { newmenu_item m[12]; u_int32_t modes[12]; int i = 0, mc = 0, num_presets = 0; char customres[16]; int fullscreenc; u_int32_t screen_mode = 0; int screen_width = 0; int screen_height = 0; SDL_Rect **sdlmode = SDL_ListModes(NULL, SDL_FULLSCREEN|SDL_HWSURFACE); m[mc].type = NM_TYPE_RADIO; m[mc].text = "320x200"; m[mc].value = (Game_screen_mode == SM(320,200)); m[mc].group = 0; modes[mc] = SM(320,200); mc++; m[mc].type = NM_TYPE_RADIO; m[mc].text = "640x480"; m[mc].value = (Game_screen_mode == SM(640,480)); m[mc].group = 0; modes[mc] = SM(640,480); mc++; m[mc].type = NM_TYPE_RADIO; m[mc].text = "320x400"; m[mc].value = (Game_screen_mode == SM(320,400)); m[mc].group = 0; modes[mc] = SM(320,400); mc++; m[mc].type = NM_TYPE_RADIO; m[mc].text = "640x400"; m[mc].value = (Game_screen_mode == SM(640,400)); m[mc].group = 0; modes[mc] = SM(640,400); mc++; m[mc].type = NM_TYPE_RADIO; m[mc].text = "800x600"; m[mc].value = (Game_screen_mode == SM(800,600)); m[mc].group = 0; modes[mc] = SM(800,600); mc++; m[mc].type = NM_TYPE_RADIO; m[mc].text = "1024x768"; m[mc].value = (Game_screen_mode == SM(1024,768)); m[mc].group = 0; modes[mc] = SM(1024,768); mc++; m[mc].type = NM_TYPE_RADIO; m[mc].text = "1280x1024"; m[mc].value = (Game_screen_mode == SM(1280,1024)); m[mc].group = 0; modes[mc] = SM(1280,1024); mc++; m[mc].type = NM_TYPE_RADIO; m[mc].text = "1600x1200"; m[mc].value = (Game_screen_mode == SM(1600,1200)); m[mc].group = 0; modes[mc] = SM(1600,1200); mc++; // ZICO - added res num_presets = mc; m[mc].value=0; // make sure we count and reach the right selection for (i = 0; i < 8; i++) if (m[mc].value) break; m[mc].type = NM_TYPE_RADIO; m[mc].text = "custom:"; m[mc].value = (i == mc); m[mc].group = 0; modes[mc] = 0; mc++; sprintf(customres, "%ix%i", SM_W(Game_screen_mode), SM_H(Game_screen_mode)); m[mc].type = NM_TYPE_INPUT; m[mc].text = customres; m[mc].text_len = 11; modes[mc] = 0; mc++; fullscreenc = mc; m[mc].type = NM_TYPE_CHECK; m[mc].text = "Fullscreen"; m[mc].value = gr_check_fullscreen(); mc++; i = newmenu_do1( NULL, "Screen Resolution", mc, m, &change_res_poll, 0 ); if (m[fullscreenc].value != gr_check_fullscreen()) { gr_toggle_fullscreen(); Game_screen_mode = -1; } for (i = 0; (m[i].value == 0) && (i < num_presets); i++); if (modes[i]==0) { char *h = strchr(customres, 'x'); if (!h) return; screen_mode = SM(atoi(customres), atoi(h+1)); } else { screen_mode = modes[i]; } screen_width = SM_W(screen_mode); screen_height = SM_H(screen_mode); if (Game_screen_mode == screen_mode) return; if (screen_width > sdlmode[0]->w || screen_height > sdlmode[0]->h) { if (!nm_messagebox( TXT_WARNING, 2, "NO", "YES", "Could not verify selected\nscreen resolution.\nThe game may crash.\nDo you really want to proceed?" )) return; } if (screen_width < 320 || screen_height < 200) { nm_messagebox( TXT_WARNING, 1, "OK", "Entered resolution is too small.\nReverting ..." ); return; } newmenu_close(); Game_screen_mode = screen_mode; set_screen_mode(SCREEN_MENU); game_init_render_buffers(screen_width, screen_height, VR_NONE, 0); } //End changed section (OE) void do_options_menu() { newmenu_item m[11]; int i = 0; do { m[ 0].type = NM_TYPE_MENU; m[ 0].text="Sound effects & music..."; m[ 1].type = NM_TYPE_TEXT; m[ 1].text=""; #if defined(MACINTOSH) && defined(APPLE_DEMO) m[ 2].type = NM_TYPE_TEXT; m[ 2].text=""; #else m[ 2].type = NM_TYPE_MENU; m[ 2].text=TXT_CONTROLS_; #endif m[ 3].type = NM_TYPE_TEXT; m[ 3].text=""; m[ 4].type = NM_TYPE_SLIDER; m[ 4].text = TXT_BRIGHTNESS; m[ 4].value = gr_palette_get_gamma(); m[ 4].min_value = 0; m[ 4].max_value = 16; m[ 5].type = NM_TYPE_MENU; m[ 5].text=TXT_DETAIL_LEVELS; m[ 6].type = NM_TYPE_MENU; m[ 6].text="Screen resolution..."; m[ 7].type = NM_TYPE_TEXT; m[ 7].text=""; m[ 8].type = NM_TYPE_MENU; m[ 8].text="Primary autoselect ordering..."; m[ 9].type = NM_TYPE_MENU; m[ 9].text="Secondary autoselect ordering..."; m[10].type = NM_TYPE_MENU; m[10].text="Toggles..."; i = newmenu_do1( NULL, TXT_OPTIONS, sizeof(m)/sizeof(*m), m, options_menuset, i ); switch(i) { case 0: do_sound_menu(); break; case 2: joydefs_config(); break; case 5: do_detail_level_menu(); break; case 6: change_res(); break; case 8: ReorderPrimary(); break; case 9: ReorderSecondary(); break; case 10: do_toggles_menu(); break; } } while( i>-1 ); write_player_file(); } void set_redbook_volume(int volume); void sound_menuset(int nitems, newmenu_item * items, int *last_key, int citem ) { nitems=nitems; *last_key = *last_key; if ( Config_digi_volume != items[0].value ) { Config_digi_volume = items[0].value; digi_set_digi_volume( (Config_digi_volume*32768)/8 ); digi_play_sample_once( SOUND_DROP_BOMB, F1_0 ); } if (GameArg.SndEnableRedbook) { if (Config_redbook_volume != items[1].value ) { Config_redbook_volume = items[1].value; set_redbook_volume(Config_redbook_volume); } } else { if (Config_midi_volume != items[1].value ) { Config_midi_volume = items[1].value; digi_set_midi_volume( (Config_midi_volume*128)/8 ); } } citem++; //kill warning } void do_sound_menu() { newmenu_item m[4]; int i = 0; do { m[ 0].type = NM_TYPE_SLIDER; m[ 0].text=TXT_FX_VOLUME; m[0].value=Config_digi_volume;m[0].min_value=0; m[0].max_value=8; m[ 1].type = NM_TYPE_SLIDER; m[ 1].text=(GameArg.SndEnableRedbook?"CD music volume":"MIDI music volume"); m[1].value=(GameArg.SndEnableRedbook?Config_redbook_volume:Config_midi_volume);m[1].min_value=0; m[1].max_value=8; m[ 2].type = NM_TYPE_TEXT; m[ 2].text=""; m[ 3].type = NM_TYPE_CHECK; m[ 3].text=TXT_REVERSE_STEREO; m[3].value=Config_channels_reversed; i = newmenu_do1( NULL, "Sound Effects & Music", sizeof(m)/sizeof(*m), m, sound_menuset, i ); Config_channels_reversed = m[3].value; } while( i>-1 ); } #define ADD_CHECK(n,txt,v) do { m[n].type=NM_TYPE_CHECK; m[n].text=txt; m[n].value=v;} while (0) void do_toggles_menu() { #define N_TOGGLE_ITEMS 6 newmenu_item m[N_TOGGLE_ITEMS]; int i = 0; do { #if defined(MACINTOSH) && defined(USE_ISP) if (ISpEnabled()) { m[0].type = NM_TYPE_TEXT; m[0].text = ""; } else { ADD_CHECK(0, "Ship auto-leveling", Auto_leveling_on); } #else ADD_CHECK(0, "Ship auto-leveling", Auto_leveling_on); #endif ADD_CHECK(1, "Show reticle", Reticle_on); ADD_CHECK(2, "Missile view", Missile_view_enabled); ADD_CHECK(3, "Headlight on when picked up", Headlight_active_default ); ADD_CHECK(4, "Show guided missile in main display", Guided_in_big_window ); ADD_CHECK(5, "Escort robot hot keys",EscortHotKeys); i = newmenu_do1( NULL, "Toggles", N_TOGGLE_ITEMS, m, NULL, i ); Auto_leveling_on = m[0].value; Reticle_on = m[1].value; Missile_view_enabled = m[2].value; Headlight_active_default = m[3].value; Guided_in_big_window = m[4].value; EscortHotKeys = m[5].value; } while( i>-1 ); } #ifdef NETWORK void do_multi_player_menu() { int menu_choice[9]; newmenu_item m[9]; int choice = 0, num_options = 0; int old_game_mode; do { old_game_mode = Game_mode; num_options = 0; #ifdef NATIVE_IPX ADD_ITEM("Start IPX Netgame", MENU_START_IPX_NETGAME, -1); ADD_ITEM("Join IPX Netgame\n", MENU_JOIN_IPX_NETGAME, -1); #endif //NATIVE_IPX ADD_ITEM("Start UDP/IP Netgame", MENU_START_UDP_NETGAME, -1); ADD_ITEM("Join UDP/IP Netgame\n", MENU_JOIN_UDP_NETGAME, -1); #ifdef KALINIX ADD_ITEM("Start Kali Netgame", MENU_START_KALI_NETGAME, -1); ADD_ITEM("Join Kali Netgame", MENU_JOIN_KALI_NETGAME, -1); #endif // KALINIX choice = newmenu_do1( NULL, TXT_MULTIPLAYER, num_options, m, NULL, choice ); if ( choice > -1 ) do_option(menu_choice[choice]); if (old_game_mode != Game_mode) break; // leave menu } while( choice > -1 ); } void do_ip_manual_join_menu() { int menu_choice[3]; newmenu_item m[3]; int choice = 0, num_options = 0, j = 0; int old_game_mode; char buf[128]=""; if (GameArg.MplIpHostAddr) { sprintf(buf,"%s",GameArg.MplIpHostAddr); for (j=0; buf[j] != '\0'; j++) { switch (buf[j]) { case ' ': buf[j] = '\0'; } } } do { old_game_mode = Game_mode; num_options = 0; m[num_options].type = NM_TYPE_INPUT; m[num_options].text=buf; m[num_options].text_len=128;menu_choice[num_options]=-1; num_options++; choice = newmenu_do1( NULL, "ENTER IP OR HOSTNAME", num_options, m, NULL, choice ); if ( choice > -1 ){ UDPConnectManual(buf); } if (old_game_mode != Game_mode) break; // leave menu } while( choice > -1 ); } #endif // NETWORK