/** * @brief Opens the keybindings menu. */ static void opt_keybinds( unsigned int wid ) { int w, h, lw, bw, bh; /* Get dimensions. */ menuKeybinds_getDim( wid, &w, &h, &lw, NULL, &bw, &bh ); /* Close button. */ window_addButton( wid, -20, 20, bw, bh, "btnClose", "Close", opt_close ); /* Set button. */ window_addButton( wid, -20 - bw - 20, 20, bw, bh, "btnSet", "Set Key", opt_setKey ); /* Restore deafaults button. */ window_addButton( wid, -20, 20+bh+20, bw, bh, "btnDefaults", "Defaults", opt_keyDefaults ); /* Text stuff. */ window_addText( wid, 20+lw+20, -40, w-(20+lw+20), 30, 1, "txtName", NULL, &cDConsole, NULL ); window_addText( wid, 20+lw+20, -90, w-(20+lw+20), h-70-60-bh, 0, "txtDesc", &gl_smallFont, NULL, NULL ); /* Generate the list. */ menuKeybinds_genList( wid ); }
/** * @brief Player death menu, appears when player got creamed. */ void menu_death (void) { unsigned int wid; wid = window_create( "Death", -1, -1, DEATH_WIDTH, DEATH_HEIGHT ); /* Propose the player to continue if the samegame exist, if not, propose to restart */ char path[PATH_MAX]; snprintf(path, PATH_MAX, "%ssaves/%s.ns", nfile_basePath(), player_name); if (nfile_fileExists(path)) window_addButton( wid, 20, 20 + BUTTON_HEIGHT*2 + 20*2, BUTTON_WIDTH, BUTTON_HEIGHT, "btnContinue", "Continue", menu_death_continue ); else window_addButton( wid, 20, 20 + BUTTON_HEIGHT*2 + 20*2, BUTTON_WIDTH, BUTTON_HEIGHT, "btnRestart", "Restart", menu_death_restart ); window_addButton( wid, 20, 20 + (BUTTON_HEIGHT+20), BUTTON_WIDTH, BUTTON_HEIGHT, "btnMain", "Main Menu", menu_death_main ); window_addButton( wid, 20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnExit", "Exit Game", menu_exit ); menu_Open(MENU_DEATH); /* Makes it all look cooler since everything still goes on. */ unpause_game(); }
/** * @brief Shows the player's active missions. * * @param parent Unused. * @param str Unused. */ static void info_openMissions( unsigned int wid ) { int w, h; /* Get the dimensions. */ window_dimWindow( wid, &w, &h ); /* buttons */ window_addButton( wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "closeMissions", "Close", info_close ); window_addButton( wid, -20, 40 + BUTTON_HEIGHT, BUTTON_WIDTH, BUTTON_HEIGHT, "btnAbortMission", "Abort", mission_menu_abort ); /* text */ window_addText( wid, 300+40, -60, 200, 40, 0, "txtSReward", &gl_smallFont, &cDConsole, "Reward:" ); window_addText( wid, 300+100, -60, 140, 40, 0, "txtReward", &gl_smallFont, &cBlack, NULL ); window_addText( wid, 300+40, -100, w - (300+40+40), h - BUTTON_HEIGHT - 120, 0, "txtDesc", &gl_smallFont, &cBlack, NULL ); /* Put a map. */ map_show( wid, 20, 20, 300, 260, 0.75 ); /* list */ mission_menu_genList(wid ,1); }
/** * @brief Opens the small ingame menu. */ void menu_small (void) { unsigned int wid; /* Check if menu should be openable. */ if ((player == NULL) || player_isFlag(PLAYER_DESTROYED) || pilot_isFlag(player,PILOT_DEAD) || comm_isOpen() || dialogue_isOpen() || /* Shouldn't open over dialogues. */ (menu_isOpen(MENU_MAIN) || menu_isOpen(MENU_SMALL) || menu_isOpen(MENU_DEATH) )) return; wid = window_create( "Menu", -1, -1, MENU_WIDTH, MENU_HEIGHT ); window_setCancel( wid, menu_small_close ); window_addButton( wid, 20, 20 + BUTTON_HEIGHT*2 + 20*2, BUTTON_WIDTH, BUTTON_HEIGHT, "btnResume", "Resume", menu_small_close ); window_addButton( wid, 20, 20 + BUTTON_HEIGHT + 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnOptions", "Options", menu_options_button ); window_addButton( wid, 20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnExit", "Exit", menu_small_exit ); menu_Open(MENU_SMALL); }
/** * @brief Opens the local market window. */ static void commodity_exchange_open( unsigned int wid ) { int i, ngoods; char **goods; int w, h; /* Get window dimensions. */ window_dimWindow( wid, &w, &h ); /* buttons */ window_addButton( wid, -20, 20, LAND_BUTTON_WIDTH, LAND_BUTTON_HEIGHT, "btnCommodityClose", "Takeoff", land_buttonTakeoff ); window_addButton( wid, -40-((LAND_BUTTON_WIDTH-20)/2), 20*2 + LAND_BUTTON_HEIGHT, (LAND_BUTTON_WIDTH-20)/2, LAND_BUTTON_HEIGHT, "btnCommodityBuy", "Buy", commodity_buy ); window_addButton( wid, -20, 20*2 + LAND_BUTTON_HEIGHT, (LAND_BUTTON_WIDTH-20)/2, LAND_BUTTON_HEIGHT, "btnCommoditySell", "Sell", commodity_sell ); /* cust draws the modifier */ window_addCust( wid, -40-((LAND_BUTTON_WIDTH-20)/2), 60+ 2*LAND_BUTTON_HEIGHT, (LAND_BUTTON_WIDTH-20)/2, LAND_BUTTON_HEIGHT, "cstMod", 0, commodity_renderMod, NULL, NULL ); /* text */ window_addText( wid, -20, -40, LAND_BUTTON_WIDTH, 60, 0, "txtSInfo", &gl_smallFont, &cDConsole, "You have:\n" "Market price:\n" "\n" "Free Space:\n" ); window_addText( wid, -20, -40, LAND_BUTTON_WIDTH/2, 60, 0, "txtDInfo", &gl_smallFont, &cBlack, NULL ); window_addText( wid, -40, -120, LAND_BUTTON_WIDTH-20, h-140-LAND_BUTTON_HEIGHT, 0, "txtDesc", &gl_smallFont, &cBlack, NULL ); /* goods list */ if (land_planet->ncommodities > 0) { goods = malloc(sizeof(char*) * land_planet->ncommodities); for (i=0; i<land_planet->ncommodities; i++) goods[i] = strdup(land_planet->commodities[i]->name); ngoods = land_planet->ncommodities; } else { goods = malloc( sizeof(char*) ); goods[0] = strdup("None"); ngoods = 1; } window_addList( wid, 20, -40, w-LAND_BUTTON_WIDTH-60, h-80-LAND_BUTTON_HEIGHT, "lstGoods", goods, ngoods, 0, commodity_update ); /* update */ commodity_update(wid, NULL); }
/** * @brief Opens the communication dialogue with a pilot. * * @param pilot Pilot to communicate with. * @return 0 on success. */ int comm_openPilot( unsigned int pilot ) { const char *msg; unsigned int wid; /* Get the pilot. */ comm_pilot = pilot_get( pilot ); if (comm_pilot == NULL) return -1; /* Must not be disabled. */ if (pilot_isFlag(comm_pilot, PILOT_DISABLED)) { player_message("%s does not respond.", comm_pilot->name); return 0; } /* Check to see if pilot wants to communicate. */ msg = comm_getString( "comm_no" ); if (msg != NULL) { player_message( msg ); return 0; } /* Set up for the comm_get* functions. */ ai_setPilot( comm_pilot ); /* Create the generic comm window. */ wid = comm_open( ship_loadCommGFX( comm_pilot->ship ), comm_pilot->faction, pilot_isHostile(comm_pilot) ? -1 : pilot_isFriendly(comm_pilot) ? 1 : 0, pilot_isFlag(comm_pilot, PILOT_BRIBED), comm_pilot->name ); /* Add special buttons. */ window_addButton( wid, -20, 20 + BUTTON_HEIGHT + 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnGreet", "Greet", NULL ); if (!pilot_isFlag(comm_pilot, PILOT_BRIBED) && /* Not already bribed. */ ((faction_getPlayer( comm_pilot->faction ) < 0) || /* Hostile. */ pilot_isHostile(comm_pilot))) window_addButton( wid, -20, 20 + 2*BUTTON_HEIGHT + 40, BUTTON_WIDTH, BUTTON_HEIGHT, "btnBribe", "Bribe", comm_bribePilot ); else window_addButton( wid, -20, 20 + 2*BUTTON_HEIGHT + 40, BUTTON_WIDTH, BUTTON_HEIGHT, "btnRequest", "Refuel", comm_requestFuel ); /* Run hooks if needed. */ pilot_runHook( comm_pilot, PILOT_HOOK_HAIL ); return 0; }
/** * @brief Opens the options menu. */ void menu_options (void) { unsigned int wid; wid = window_create( "Options", -1, -1, OPTIONS_WIDTH, OPTIONS_HEIGHT ); window_addButton( wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnClose", "Close", menu_options_close ); window_addButton( wid, -20 - (BUTTON_WIDTH+20), 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnKeybinds", "Keybindings", menu_options_keybinds ); window_addButton( wid, -20 - 2 * (BUTTON_WIDTH+20), 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnAudio", "Audio", menu_options_audio ); menu_Open(MENU_OPTIONS); }
/** * @brief Player death menu, appears when player got creamed. */ void menu_death (void) { unsigned int wid; wid = window_create( "Death", -1, -1, DEATH_WIDTH, DEATH_HEIGHT ); window_addButton( wid, 20, 20 + (BUTTON_HEIGHT+20), BUTTON_WIDTH, BUTTON_HEIGHT, "btnMain", "Main Menu", menu_death_main ); window_addButton( wid, 20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnExit", "Exit Game", (void(*)(unsigned int, char*)) exit_game ); menu_Open(MENU_DEATH); /* Makes it all look cooler since everything still goes on. */ unpause_game(); }
/** * @brief Allows the player to set a different GUI. * * @param wid Window id. * @param name of widget. */ static void info_setGui( unsigned int wid, char* str ) { (void)str; int i; char **guis; int nguis; char **gui_copy; /* Get the available GUIs. */ guis = player_guiList( &nguis ); /* In case there are none. */ if (guis == NULL) { WARN("No GUI available."); dialogue_alert( "There are no GUI available, this means something went wrong somewhere. Inform the Naev maintainer." ); return; } /* window */ wid = window_create( "Select GUI", -1, -1, SETGUI_WIDTH, SETGUI_HEIGHT ); window_setCancel( wid, setgui_close ); /* Copy GUI. */ gui_copy = malloc( sizeof(char*) * nguis ); for (i=0; i<nguis; i++) gui_copy[i] = strdup( guis[i] ); /* List */ window_addList( wid, 20, -50, SETGUI_WIDTH-BUTTON_WIDTH/2 - 60, SETGUI_HEIGHT-110, "lstGUI", gui_copy, nguis, 0, NULL ); toolkit_setList( wid, "lstGUI", gui_pick() ); /* buttons */ window_addButton( wid, -20, 20, BUTTON_WIDTH/2, BUTTON_HEIGHT, "btnBack", "Cancel", setgui_close ); window_addButton( wid, -20, 30 + BUTTON_HEIGHT, BUTTON_WIDTH/2, BUTTON_HEIGHT, "btnLoad", "Load", setgui_load ); /* Checkboxes */ window_addCheckbox( wid, 20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "chkOverride", "Override GUI", info_toggleGuiOverride, player.guiOverride ); info_toggleGuiOverride( wid, "chkOverride" ); /* default action */ window_setAccept( wid, setgui_load ); }
/** * @brief Opens the audio settings menu. */ void opt_menuAudio (void) { unsigned int wid; /* Create the window. */ wid = window_create( "Audio", -1, -1, AUDIO_WIDTH, AUDIO_HEIGHT ); /* Sound fader. */ if (!sound_disabled) { window_addFader( wid, 20, -40, 160, 20, "fadSound", 0., 1., sound_getVolume(), opt_setSFXLevel ); window_addText( wid, 200, -40, AUDIO_WIDTH-220, 20, 1, "txtSound", NULL, NULL, "Sound Volume" ); } else window_addText( wid, 200, -40, AUDIO_WIDTH-220, 20, 1, "txtSound", NULL, NULL, "Sound Disabled" ); /* Music fader. */ if (!music_disabled) { window_addFader( wid, 20, -80, 160, 20, "fadMusic", 0., 1., music_getVolume(), opt_setMusicLevel ); window_addText( wid, 200, -80, AUDIO_WIDTH-220, 20, 1, "txtMusic", NULL, NULL, "Music Volume" ); } else window_addText( wid, 200, -80, AUDIO_WIDTH-220, 20, 1, "txtMusic", NULL, NULL, "Music Disabled" ); /* Close button */ window_addButton( wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnClose", "Close", window_close ); }
/** * @brief Opens the console. */ void cli_open (void) { unsigned int wid; /* Lazy loading. */ if (cli_state == NULL) if (cli_init()) return; /* Must not be already open. */ if (window_exists( "Lua Console" )) return; /* Create the window. */ wid = window_create( "Lua Console", -1, -1, cli_width, cli_height ); /* Window settings. */ window_setAccept( wid, cli_input ); window_setCancel( wid, window_close ); window_handleKeys( wid, cli_keyhandler ); /* Input box. */ window_addInput( wid, 20, 20, cli_width-60-BUTTON_WIDTH, BUTTON_HEIGHT, "inpInput", LINE_LENGTH, 1 ); /* Buttons. */ window_addButton( wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnClose", "Close", window_close ); /* Custom console widget. */ window_addCust( wid, 20, -40, cli_width-40, cli_height-80-BUTTON_HEIGHT, "cstConsole", 0, cli_render, NULL ); }
/** * @brief Opens the weapons window. */ static void info_openWeapons( unsigned int wid ) { int w, h; /* Get the dimensions. */ window_dimWindow( wid, &w, &h ); /* Buttons */ window_addButton( wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "closeCargo", "Close", info_close ); /* Checkboxes. */ window_addCheckbox( wid, 220, 20+2*(BUTTON_HEIGHT+20)-40, 250, BUTTON_HEIGHT, "chkAutoweap", "Automatically handle weapons", weapons_autoweap, player.p->autoweap ); window_addCheckbox( wid, 220, 20+2*(BUTTON_HEIGHT+20)-10, 300, BUTTON_HEIGHT, "chkFire", "Enable instant mode (only for weapons)", weapons_fire, (pilot_weapSetTypeCheck( player.p, info_eq_weaps.weapons )==WEAPSET_TYPE_WEAPON) ); window_addCheckbox( wid, 220, 20+2*(BUTTON_HEIGHT+20)+20, 300, BUTTON_HEIGHT, "chkInrange", "Only shoot weapons that are in range", weapons_inrange, pilot_weapSetInrangeCheck( player.p, info_eq_weaps.weapons ) ); /* Custom widget. */ equipment_slotWidget( wid, 20, -40, 180, h-60, &info_eq_weaps ); info_eq_weaps.selected = player.p; info_eq_weaps.canmodify = 0; /* Custom widget for legend. */ window_addCust( wid, 220, -220, w-200-60, 100, "cstLegend", 0, weapons_renderLegend, NULL, NULL ); /* List. */ weapons_genList( wid ); }
/** * @brief Opens the licenses menu. */ static void info_licenses_menu( unsigned int parent, char* str ) { (void) str; unsigned int wid; char **licenses; int nlicenses; int i; char **buf; /* Create window */ wid = window_create( "Licenses", -1, -1, LICENSES_WIDTH, LICENSES_HEIGHT ); window_setParent( wid, parent ); /* List. */ buf = player_getLicenses( &nlicenses ); licenses = malloc(sizeof(char*)*nlicenses); for (i=0; i<nlicenses; i++) licenses[i] = strdup(buf[i]); window_addList( wid, 20, -40, LICENSES_WIDTH-40, LICENSES_HEIGHT-80-BUTTON_HEIGHT, "lstLicenses", licenses, nlicenses, 0, NULL ); /* Buttons */ window_addButton( wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "closeLicenses", "Close", window_close ); }
/** * @brief Checks if should add the refuel button and does if needed. */ void land_checkAddRefuel (void) { char buf[ECON_CRED_STRLEN], cred[ECON_CRED_STRLEN]; unsigned int w; /* Check to see if fuel conditions are met. */ if (!planet_hasService(land_planet, PLANET_SERVICE_REFUEL)) { if (!widget_exists( land_windows[0], "txtRefuel" )) window_addText( land_windows[0], -20, 20 + (LAND_BUTTON_HEIGHT + 20) + 20, 200, gl_defFont.h, 1, "txtRefuel", &gl_defFont, &cBlack, "No refueling services." ); return; } /* Full fuel. */ if (player.p->fuel >= player.p->fuel_max) { if (widget_exists( land_windows[0], "btnRefuel" )) window_destroyWidget( land_windows[0], "btnRefuel" ); if (widget_exists( land_windows[0], "txtRefuel" )) window_destroyWidget( land_windows[0], "txtRefuel" ); return; } /* Autorefuel. */ if (conf.autorefuel) { spaceport_refuel( land_windows[0], "btnRefuel" ); w = land_getWid( LAND_WINDOW_EQUIPMENT ); if (w > 0) equipment_updateShips( w, NULL ); /* Must update counter. */ if (player.p->fuel >= player.p->fuel_max) return; } /* Just enable button if it exists. */ if (widget_exists( land_windows[0], "btnRefuel" )) { window_enableButton( land_windows[0], "btnRefuel"); credits2str( cred, player.p->credits, 2 ); snprintf( buf, sizeof(buf), "Credits: %s", cred ); window_modifyText( land_windows[0], "txtRefuel", buf ); } /* Else create it. */ else { /* Refuel button. */ credits2str( cred, refuel_price(), 2 ); snprintf( buf, sizeof(buf), "Refuel %s", cred ); window_addButton( land_windows[0], -20, 20 + (LAND_BUTTON_HEIGHT + 20), LAND_BUTTON_WIDTH,LAND_BUTTON_HEIGHT, "btnRefuel", buf, spaceport_refuel ); /* Player credits. */ credits2str( cred, player.p->credits, 2 ); snprintf( buf, sizeof(buf), "Credits: %s", cred ); window_addText( land_windows[0], -20, 20 + 2*(LAND_BUTTON_HEIGHT + 20), LAND_BUTTON_WIDTH, gl_smallFont.h, 1, "txtRefuel", &gl_smallFont, &cBlack, buf ); } /* Make sure player can click it. */ if (!player_hasCredits( refuel_price() )) window_disableButton( land_windows[0], "btnRefuel" ); }
/** * @brief Displays an alert popup with only an ok button and a message. * * @param fmt Printf style message to display. */ void dialogue_alert( const char *fmt, ... ) { char msg[512]; va_list ap; unsigned int wdw; int h, done; if (fmt == NULL) return; else { /* get the message */ va_start(ap, fmt); vsnprintf(msg, 512, fmt, ap); va_end(ap); } h = gl_printHeightRaw( &gl_smallFont, 260, msg ); /* create the window */ wdw = window_create( "Warning", -1, -1, 300, 90 + h ); window_setData( wdw, &done ); window_addText( wdw, 20, -30, 260, h, 0, "txtAlert", &gl_smallFont, &cBlack, msg ); window_addButton( wdw, 135, 20, 50, 30, "btnOK", "OK", dialogue_close ); dialogue_open++; toolkit_loop( &done ); }
/** * @brief Opens the mission computer window. */ static void misn_open( unsigned int wid ) { int w, h; int y; /* Get window dimensions. */ window_dimWindow( wid, &w, &h ); /* Set window functions. */ window_onClose( wid, misn_close ); /* buttons */ window_addButton( wid, -20, 20, LAND_BUTTON_WIDTH,LAND_BUTTON_HEIGHT, "btnCloseMission", "Takeoff", land_buttonTakeoff ); window_addButton( wid, -20, 40+LAND_BUTTON_HEIGHT, LAND_BUTTON_WIDTH,LAND_BUTTON_HEIGHT, "btnAcceptMission", "Accept Mission", misn_accept ); /* text */ y = -60; window_addText( wid, w/2 + 10, y, w/2 - 30, 40, 0, "txtSDate", NULL, &cDConsole, "Date:\n" "Free Space:"); window_addText( wid, w/2 + 110, y, w/2 - 90, 40, 0, "txtDate", NULL, &cBlack, NULL ); y -= 2 * gl_defFont.h + 50; window_addText( wid, w/2 + 10, y, w/2 - 30, 20, 0, "txtSReward", &gl_smallFont, &cDConsole, "Reward:" ); window_addText( wid, w/2 + 70, y, w/2 - 90, 20, 0, "txtReward", &gl_smallFont, &cBlack, NULL ); y -= 20; window_addText( wid, w/2 + 10, y, w/2 - 30, h/2-90, 0, "txtDesc", &gl_smallFont, &cBlack, NULL ); /* map */ map_show( wid, 20, 20, w/2 - 30, h/2 - 35, 0.75 ); misn_genList(wid, 1); }
/** * @brief Opens the main info window. */ static void info_openMain( unsigned int wid ) { char str[128], **buf, creds[ECON_CRED_STRLEN]; char **licenses; int nlicenses; int i; char *nt; int w, h; /* Get the dimensions. */ window_dimWindow( wid, &w, &h ); /* pilot generics */ nt = ntime_pretty( ntime_get(), 2 ); window_addText( wid, 40, 20, 120, h-80, 0, "txtDPilot", &gl_smallFont, &cDConsole, "Pilot:\n" "Date:\n" "Combat Rating:\n" "\n" "Money:\n" "Ship:\n" "Fuel:" ); credits2str( creds, player.p->credits, 2 ); snprintf( str, 128, "%s\n" "%s\n" "%s\n" "\n" "%s Credits\n" "%s\n" "%.0f (%d Jumps)", player.name, nt, player_rating(), creds, player.p->name, player.p->fuel, pilot_getJumps(player.p) ); window_addText( wid, 140, 20, 200, h-80, 0, "txtPilot", &gl_smallFont, &cBlack, str ); free(nt); /* menu */ window_addButton( wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnClose", "Close", info_close ); /* List. */ buf = player_getLicenses( &nlicenses ); licenses = malloc(sizeof(char*)*nlicenses); for (i=0; i<nlicenses; i++) licenses[i] = strdup(buf[i]); window_addText( wid, -20, -40, w-80-200-40, 20, 1, "txtList", NULL, &cDConsole, "Licenses" ); window_addList( wid, -20, -70, w-80-200-40, h-110-BUTTON_HEIGHT, "lstLicenses", licenses, nlicenses, 0, NULL ); }
/** * @brief Opens the load game menu. */ void load_game_menu (void) { unsigned int wid; char **files; int nfiles, i, len; /* window */ wid = window_create( "Load Game", -1, -1, LOAD_WIDTH, LOAD_HEIGHT ); window_setCancel( wid, load_menu_close ); /* load the saves */ files = nfile_readDir( &nfiles, "%ssaves", nfile_basePath() ); for (i=0; i<nfiles; i++) { len = strlen(files[i]); /* no save extension */ if ((len < 5) || strcmp(&files[i][len-3],".ns")) { free(files[i]); memmove( &files[i], &files[i+1], sizeof(char*) * (nfiles-i-1) ); nfiles--; i--; } else /* remove the extension */ files[i][len-3] = '\0'; } /* case there are no files */ if (files == NULL) { files = malloc(sizeof(char*)); files[0] = strdup("None"); nfiles = 1; } window_addList( wid, 20, -50, LOAD_WIDTH-BUTTON_WIDTH-50, LOAD_HEIGHT-110, "lstSaves", files, nfiles, 0, NULL ); /* buttons */ window_addButton( wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnBack", "Back", load_menu_close ); window_addButton( wid, -20, 30 + BUTTON_HEIGHT, BUTTON_WIDTH, BUTTON_HEIGHT, "btnLoad", "Load", load_menu_load ); window_addButton( wid, 20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnDelete", "Del", load_menu_delete ); /* default action */ window_setAccept( wid, load_menu_load ); }
/** * @brief Creates a dialogue that allows the player to write a message. * * You must free the result if it's not null. * * @param title Title of the dialogue window. * @param min Minimum length of the message (must be non-zero). * @param max Maximum length of the message (must be non-zero). * @param msg Message to be displayed. * @return The message the player typed or NULL if it was cancelled. */ char* dialogue_inputRaw( const char* title, int min, int max, const char *msg ) { char *input; int h, done; /* get text height */ h = gl_printHeightRaw( &gl_smallFont, 200, msg ); /* create window */ input_dialogue.input_wid = window_create( title, -1, -1, 240, h+140 ); window_setData( input_dialogue.input_wid, &done ); window_setAccept( input_dialogue.input_wid, dialogue_inputClose ); window_setCancel( input_dialogue.input_wid, dialogue_cancel ); /* text */ window_addText( input_dialogue.input_wid, 30, -30, 200, h, 0, "txtInput", &gl_smallFont, &cDConsole, msg ); /* input */ window_addInput( input_dialogue.input_wid, 20, -50-h, 200, 20, "inpInput", max, 1, NULL ); window_setInputFilter( input_dialogue.input_wid, "inpInput", "/" ); /* Remove illegal stuff. */ /* button */ window_addButton( input_dialogue.input_wid, -20, 20, 80, 30, "btnClose", "Done", dialogue_inputClose ); /* tricky secondary loop */ dialogue_open++; done = 0; input = NULL; while ((done >= 0) && (!input || ((int)strlen(input) < min))) { /* must be longer than min */ if (input) { dialogue_alert( "Input must be at least %d character%s long!", min, (min==1) ? "s" : "" ); free(input); input = NULL; } if (toolkit_loop( &done ) != 0) /* error in loop -> quit */ return NULL; /* save the input */ if (done < 0) input = NULL; else input = strdup( window_getInput( input_dialogue.input_wid, "inpInput" ) ); } /* cleanup */ if (input != NULL) { window_destroy( input_dialogue.input_wid ); dialogue_open--; } input_dialogue.input_wid = 0; /* return the result */ return input; }
/** * @brief Shows the player his cargo. * * @param str Unused. */ static void info_cargo_menu( unsigned int parent, char* str ) { (void) str; unsigned int wid; char **buf; int nbuf; int i; /* Create the window */ wid = window_create( "Cargo", -1, -1, CARGO_WIDTH, CARGO_HEIGHT ); window_setParent( wid, parent ); /* Buttons */ window_addButton( wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "closeCargo", "Back", window_close ); window_addButton( wid, -40 - BUTTON_WIDTH, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnJettisonCargo", "Jettison", cargo_jettison ); window_disableButton( wid, "btnJettisonCargo" ); /* List */ if (player->ncommodities==0) { /* No cargo */ buf = malloc(sizeof(char*)); buf[0] = strdup("None"); nbuf = 1; } else { /* List the player's cargo */ buf = malloc(sizeof(char*)*player->ncommodities); for (i=0; i<player->ncommodities; i++) { buf[i] = malloc(sizeof(char)*128); snprintf(buf[i],128, "%s%s %d", player->commodities[i].commodity->name, (player->commodities[i].id != 0) ? "*" : "", player->commodities[i].quantity); } nbuf = player->ncommodities; } window_addList( wid, 20, -40, CARGO_WIDTH - 40, CARGO_HEIGHT - BUTTON_HEIGHT - 80, "lstCargo", buf, nbuf, 0, cargo_update ); cargo_update(wid, NULL); }
/** * @brief Shows the player his cargo. * * @param str Unused. */ static void info_openCargo( unsigned int wid ) { int w, h; /* Get the dimensions. */ window_dimWindow( wid, &w, &h ); /* Buttons */ window_addButton( wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "closeCargo", "Close", info_close ); window_addButton( wid, -40 - BUTTON_WIDTH, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnJettisonCargo", "Jettison", cargo_jettison ); window_disableButton( wid, "btnJettisonCargo" ); /* Generate the list. */ cargo_genList( wid ); }
/** * @brief Opens the console. */ void cli_open (void) { unsigned int wid; /* Lazy loading. */ if (cli_state == NULL) if (cli_init()) return; /* Make sure main menu isn't open. */ if (menu_isOpen(MENU_MAIN)) return; /* Must not be already open. */ if (window_exists( "Lua Console" )) return; /* Put a friendly message at first. */ if (cli_firstOpen) { char buf[256]; cli_addMessage( "" ); cli_addMessage( "\egWelcome to the Lua console!" ); nsnprintf( buf, sizeof(buf), "\eg "APPNAME" v%s", naev_version(0) ); cli_addMessage( buf ); cli_addMessage( "" ); cli_firstOpen = 0; } /* Create the window. */ wid = window_create( "Lua Console", -1, -1, CLI_WIDTH, CLI_HEIGHT ); /* Window settings. */ window_setAccept( wid, cli_input ); window_setCancel( wid, window_close ); window_handleKeys( wid, cli_keyhandler ); /* Input box. */ window_addInput( wid, 20, 20, CLI_WIDTH-60-BUTTON_WIDTH, BUTTON_HEIGHT, "inpInput", LINE_LENGTH, 1, cli_font ); /* Buttons. */ window_addButton( wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnClose", "Close", window_close ); /* Custom console widget. */ window_addCust( wid, 20, -40, CLI_WIDTH-40, CLI_HEIGHT-80-BUTTON_HEIGHT, "cstConsole", 0, cli_render, NULL, NULL ); /* Cache current height in case the window is resized. */ cli_height = CLI_HEIGHT; }
/** * @brief Opens the spaceport bar window. */ static void bar_open( unsigned int wid ) { int w, h, iw, ih, bw, bh, dh, th; /* Set window functions. */ window_onClose( wid, bar_close ); /* Get dimensions. */ bar_getDim( wid, &w, &h, &iw, &ih, &bw, &bh ); dh = gl_printHeightRaw( &gl_smallFont, w - iw - 60, land_planet->bar_description ); /* Buttons */ window_addButton( wid, -20, 20, bw, bh, "btnCloseBar", "Takeoff", land_buttonTakeoff ); window_addButton( wid, -20 - bw - 20, 20, bw, bh, "btnApproach", "Approach", bar_approach ); /* Bar description. */ window_addText( wid, iw + 40, -40, w - iw - 60, dh, 0, "txtDescription", &gl_smallFont, &cBlack, land_planet->bar_description ); /* Add portrait text. */ th = -40 - dh - 40; window_addText( wid, iw + 40, th, w - iw - 60, gl_defFont.h, 1, "txtPortrait", &gl_defFont, &cDConsole, NULL ); /* Add mission description text. */ th -= 20 + PORTRAIT_HEIGHT + 20 + 20; window_addText( wid, iw + 60, th, w - iw - 100, h + th - (2*bh+60), 0, "txtMission", &gl_smallFont, &cBlack, NULL ); /* Generate the mission list. */ bar_genList( wid ); }
/** * @brief Rebinds a key. */ static void opt_setKey( unsigned int wid, char *str ) { (void) wid; (void) str; unsigned int new_wid; int w, h; /* Reset key. */ opt_lastKeyPress = 0; /* Create new window. */ w = 20 + 2*(BUTTON_WIDTH + 20); h = 20 + BUTTON_HEIGHT + 20 + 20 + 80 + 40; new_wid = window_create( "Set Keybinding", -1, -1, w, h ); window_handleEvents( new_wid, opt_setKeyEvent ); window_setParent( new_wid, wid ); /* Set text. */ window_addText( new_wid, 20, -40, w-40, 60, 0, "txtInfo", &gl_smallFont, &cBlack, "To use a modifier key hit that key twice in a row, otherwise it " "will register as a modifier. To set with any modifier click the checkbox." ); /* Create button to cancel. */ window_addButton( new_wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnCancel", "Cancel", window_close ); /* Button to unset. */ window_addButton( new_wid, 20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnUnset", "Unset", opt_unsetKey ); /* Checkbox to set any modifier. */ window_addCheckbox( new_wid, -20, 20 + BUTTON_HEIGHT + 20, w-40, 20, "chkAny", "Set any modifier", NULL, 0 ); }
/** * @brief Add a choice to the dialog. * * @param caption Caption to use for the dialogue (for sizing). * @param msg Message to display (for sizing). * @param *opt The value of the option. */ void dialogue_addChoice( const char *caption, const char *msg, const char *opt) { int w,h; if (choice_nopts < 1) return; dialogue_getSize( caption, msg, &w, &h ); /* buttons. Add one for each option in the menu. */ window_addButton( choice_wid, w/2-125, choice_nopts*40, 250, 30, (char *) opt, (char *) opt, dialogue_choiceClose ); choice_nopts --; }
/** * @brief Shows the player what outfits he has. * * @param str Unused. */ static void info_openShip( unsigned int wid ) { int w, h; /* Get the dimensions. */ window_dimWindow( wid, &w, &h ); /* Buttons */ window_addButton( wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "closeOutfits", _("Close"), info_close ); /* Text. */ window_addText( wid, 40, -60, 100, h-60, 0, "txtSDesc", &gl_smallFont, &cDConsole, _("Name:\n" "Model:\n" "Class:\n" "Crew:\n" "\n" "Total CPU:\n" "Mass:\n" "Jump Time:\n" "Thrust:\n" "Speed:\n" "Turn:\n" "\n" "Absorption:\n" "Shield:\n" "Armour:\n" "Energy:\n" "Cargo Space:\n" "Fuel:\n" "\n" "Stats:\n") ); window_addText( wid, 140, -60, w-300., h-60, 0, "txtDDesc", &gl_smallFont, &cBlack, NULL ); /* Custom widget. */ equipment_slotWidget( wid, -20, -40, 180, h-60, &info_eq ); info_eq.selected = player.p; info_eq.canmodify = 0; /* Update ship. */ ship_update( wid ); }
/** * @brief Creates the main tab. * * @param wid Window to create main tab. */ static void land_createMainTab( unsigned int wid ) { glTexture *logo; int offset; int w,h; /* Get window dimensions. */ window_dimWindow( wid, &w, &h ); /* * Faction logo. */ offset = 20; if (land_planet->faction != -1) { logo = faction_logoSmall(land_planet->faction); if (logo != NULL) { window_addImage( wid, 440 + (w-460-logo->w)/2, -20, 0, 0, "imgFaction", logo, 0 ); offset = 84; } } /* * Pretty display. */ window_addImage( wid, 20, -40, 0, 0, "imgPlanet", gfx_exterior, 1 ); window_addText( wid, 440, -20-offset, w-460, h-20-offset-60-LAND_BUTTON_HEIGHT*2, 0, "txtPlanetDesc", &gl_smallFont, &cBlack, land_planet->description); /* * buttons */ /* first column */ window_addButton( wid, -20, 20, LAND_BUTTON_WIDTH, LAND_BUTTON_HEIGHT, "btnTakeoff", "Takeoff", land_buttonTakeoff ); /* * Checkboxes. */ window_addCheckbox( wid, -20, 20 + 2*(LAND_BUTTON_HEIGHT + 20) + 40, 175, 20, "chkRefuel", "Automatic Refuel", land_toggleRefuel, conf.autorefuel ); land_toggleRefuel( wid, "chkRefuel" ); }
/** * @brief Opens a dialogue window with an ok button, a fixed message and an image. * * @param caption Window title. * @param msg Message to display. * @param width Width of the image. Negative uses image width. * @param height Height of the image. Negative uses image height. */ void dialogue_msgImgRaw( const char* caption, const char *msg, const char *img, int width, int height ) { int w, h, img_width, img_height; glFont* font; unsigned int msg_wid; int done; glTexture *gfx; char buf[PATH_MAX]; /* Get the desired texture */ /* IMPORTANT : texture must not be freed here, it will be freed when the widget closes */ nsnprintf( buf, sizeof(buf), "%s%s", GFX_PATH, img ); gfx = gl_newImage( buf, 0 ); /* Find the popup's dimensions from text and image */ img_width = (width < 0) ? gfx->w : width; img_height = (height < 0) ? gfx->h : height; font = dialogue_getSize( caption, msg, &w, &h ); if (h < img_width) { h = img_width; } /* Create the window */ msg_wid = window_create( caption, -1, -1, img_width + w, 110 + h ); window_setData( msg_wid, &done ); /* Add the text box */ window_addText( msg_wid, img_width+40, -40, w-40, h, 0, "txtMsg", font, &cBlack, msg ); /* Add a placeholder rectangle for the image */ window_addRect( msg_wid, 20, -40, img_width, img_height, "rctGFX", &cGrey10, 1 ); /* Actually add the texture in the rectangle */ window_addImage( msg_wid, 20, -40, img_width, img_height, "ImgGFX", gfx, 0 ); /* Add the OK button */ window_addButton( msg_wid, (img_width+w -50)/2, 20, 50, 30, "btnOK", "OK", dialogue_close ); dialogue_open++; toolkit_loop( &done ); }
/** * @brief Displays the player's standings. */ static void info_openStandings( unsigned int wid ) { int i; int n, m; char **str; int w, h, lw; /* Get dimensions. */ info_getDim( wid, &w, &h, &lw ); /* On close. */ window_onClose( wid, standings_close ); /* Buttons */ window_addButton( wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "closeMissions", "Close", info_close ); /* Graphics. */ window_addImage( wid, 0, 0, 0, 0, "imgLogo", NULL, 0 ); /* Text. */ window_addText( wid, lw+40, 0, (w-(lw+60)), 20, 1, "txtName", &gl_defFont, &cDConsole, NULL ); window_addText( wid, lw+40, 0, (w-(lw+60)), 20, 1, "txtStanding", &gl_smallFont, &cBlack, NULL ); /* Gets the faction standings. */ info_factions = faction_getAll( &n ); str = malloc( sizeof(char*) * n ); /* Create list. */ for (i=0; i<n; i++) { str[i] = malloc( 256 ); m = round( faction_getPlayer( info_factions[i] ) ); snprintf( str[i], 256, "%s [ %+d%% ]", faction_name( info_factions[i] ), m ); } /* Display list. */ window_addList( wid, 20, -40, lw, h-60, "lstStandings", str, n, 0, standings_update ); standings_update( wid , NULL ); }
/** * @brief Opens a dialogue window with an ok button and a fixed message. * * @param caption Window title. * @param msg Message to display. */ void dialogue_msgRaw( const char* caption, const char *msg ) { int w,h; glFont* font; unsigned int msg_wid; int done; font = dialogue_getSize( caption, msg, &w, &h ); /* create the window */ msg_wid = window_create( caption, -1, -1, w, 110 + h ); window_setData( msg_wid, &done ); window_addText( msg_wid, 20, -40, w-40, h, 0, "txtMsg", font, &cBlack, msg ); window_addButton( msg_wid, (w-50)/2, 20, 50, 30, "btnOK", "OK", dialogue_close ); dialogue_open++; toolkit_loop( &done ); }