/** * @brief Generates the weapons list. */ static void weapons_genList( unsigned int wid ) { const char *str; char **buf; int i; int w, h; /* Get the dimensions. */ window_dimWindow( wid, &w, &h ); /* Destroy widget if needed. */ if (widget_exists( wid, "lstWeapSets" )) window_destroyWidget( wid, "lstWeapSets" ); /* List */ buf = malloc( sizeof(char*) * PILOT_WEAPON_SETS ); for (i=0; i<PILOT_WEAPON_SETS; i++) { str = pilot_weapSetName( info_eq_weaps.selected, i ); if (str == NULL) { buf[i] = malloc( sizeof(char) * PATH_MAX ); snprintf( buf[i], PATH_MAX, "Weapon Set %d", (i+1)%10 ); } else { buf[i] = strdup( str ); } } window_addList( wid, 20+180+20, -40, w - (20+180+20+20), 160, "lstWeapSets", buf, PILOT_WEAPON_SETS, 0, weapons_update ); /* Update. */ weapons_update( wid, 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 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 Creates the current mission list for the mission menu. * @param first 1 if it's the first time run. */ static void mission_menu_genList( unsigned int wid, int first ) { int i,j; char** misn_names; int w, h; if (!first) window_destroyWidget( wid, "lstMission" ); /* Get the dimensions. */ window_dimWindow( wid, &w, &h ); /* list */ misn_names = malloc(sizeof(char*) * MISSION_MAX); j = 0; for (i=0; i<MISSION_MAX; i++) if (player_missions[i].id != 0) misn_names[j++] = (player_missions[i].title!=NULL) ? strdup(player_missions[i].title) : NULL; if (j==0) { /* no missions */ misn_names[0] = strdup("No Missions"); j = 1; } window_addList( wid, 20, -40, 300, h-340, "lstMission", misn_names, j, 0, mission_menu_update ); }
/** * @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 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 Resizes the main menu and its background. * * This is a one-off function that ensures the main menu's appearance * is consistent regardless of window resizing. */ void menu_main_resize (void) { int w, h, bgw, bgh, tw, th; int offset_logo, offset_wdw, freespace; int menu_id, bg_id; Widget *wgt; if (!menu_isOpen(MENU_MAIN)) return; menu_id = window_get("Main Menu"); bg_id = window_get("BG"); window_dimWindow( menu_id, &w, &h ); window_dimWindow( bg_id, &bgw, &bgh ); freespace = SCREEN_H - main_naevLogo->sh - h; if (freespace < 0) { offset_logo = SCREEN_H - main_naevLogo->sh; offset_wdw = 0; } else { offset_logo = -freespace/4; offset_wdw = freespace/2; } window_moveWidget( bg_id, "imgLogo", (bgw - main_naevLogo->sw)/2., offset_logo ); window_dimWidget( bg_id, "txtBG", &tw, &th ); if (tw > SCREEN_W) { /* RIP abstractions. X must be set manually because window_moveWidget * transforms negative coordinates. */ wgt = window_getwgt( bg_id, "txtBG" ); if (wgt) wgt->x = (SCREEN_W - tw) / 2; } else window_moveWidget( bg_id, "txtBG", (SCREEN_W - tw)/2, 10. ); window_move( menu_id, -1, offset_wdw ); }
/** * @brief Opens the mission computer window. */ static void misn_open( unsigned int wid ) { int w, h; int y; /* Mark as generated. */ land_tabGenerate(LAND_WINDOW_MISSION); /* Get window dimensions. */ window_dimWindow( wid, &w, &h ); /* Set window functions. */ window_onClose( wid, misn_close ); /* buttons */ window_addButtonKey( wid, -20, 20, LAND_BUTTON_WIDTH,LAND_BUTTON_HEIGHT, "btnCloseMission", "Take Off", land_buttonTakeoff, SDLK_t ); window_addButtonKey( wid, -20, 40+LAND_BUTTON_HEIGHT, LAND_BUTTON_WIDTH,LAND_BUTTON_HEIGHT, "btnAcceptMission", "Accept Mission", misn_accept, SDLK_a ); /* 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); /* Set default keyboard focuse to the list */ window_setFocus( wid , "lstMission" ); }
/** * @brief Gets the dimensions of the spaceport bar window. */ static void bar_getDim( int wid, int *w, int *h, int *iw, int *ih, int *bw, int *bh ) { /* Get window dimensions. */ window_dimWindow( wid, w, h ); /* Calculate dimensions of portraits. */ *iw = 300 + (*w - 800); *ih = *h - 60; /* Calculate button dimensions. */ *bw = (*w - *iw - 80)/2; *bh = LAND_BUTTON_HEIGHT; }
/** * @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 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 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 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_addButtonKey( wid, -20, 20, LAND_BUTTON_WIDTH, LAND_BUTTON_HEIGHT, "btnTakeoff", "Take Off", land_buttonTakeoff, SDLK_t ); /* Add "no refueling" notice if needed. */ if (!planet_hasService(land_planet, PLANET_SERVICE_REFUEL)) { window_addText( land_windows[0], -20, 20 + (LAND_BUTTON_HEIGHT + 20) + 20, 200, gl_defFont.h, 1, "txtRefuel", &gl_defFont, &cBlack, "No refueling services." ); } }
/** * @brief Gets the size of the outfits window. */ static void outfits_getSize( unsigned int wid, int *w, int *h, int *iw, int *ih, int *bw, int *bh ) { /* Get window dimensions. */ window_dimWindow( wid, w, h ); /* Calculate image array dimensions. */ if (iw != NULL) *iw = 310 + (*w-800); if (ih != NULL) *ih = *h - 60; /* Calculate button dimensions. */ if (bw != NULL) *bw = (*w - (iw!=NULL?*iw:0) - 100) / 3; if (bh != NULL) *bh = LAND_BUTTON_HEIGHT; }
/** * @brief Gets the keybind menu dimensions. */ static void menuKeybinds_getDim( unsigned int wid, int *w, int *h, int *lw, int *lh, int *bw, int *bh ) { /* Get window dimensions. */ window_dimWindow( wid, w, h ); /* Get button dimensions. */ if (bw != NULL) *bw = BUTTON_WIDTH; if (bh != NULL) *bh = BUTTON_HEIGHT; /* Get list dimensions. */ if (lw != NULL) *lw = *w - 2*BUTTON_WIDTH - 80; if (lh != NULL) *lh = *h - 60; }
/** * @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 Generates the mission list. * @param wid Window to generate the mission list for. * @param first Is it the first time generated? */ static void misn_genList( unsigned int wid, int first ) { int i,j; char** misn_names, *focused; int w,h; /* Save focus. */ focused = strdup(window_getFocus(wid)); if (!first) window_destroyWidget( wid, "lstMission" ); /* Get window dimensions. */ window_dimWindow( wid, &w, &h ); /* list */ j = 1; /* make sure we don't accidentally free the memory twice. */ misn_names = NULL; if (mission_ncomputer > 0) { /* there are missions */ misn_names = malloc(sizeof(char*) * mission_ncomputer); j = 0; for (i=0; i<mission_ncomputer; i++) if (mission_computer[i].title != NULL) misn_names[j++] = strdup(mission_computer[i].title); } if ((misn_names==NULL) || (mission_ncomputer==0) || (j==0)) { /* no missions. */ if (j==0) free(misn_names); misn_names = malloc(sizeof(char*)); misn_names[0] = strdup("No Missions"); j = 1; } window_addList( wid, 20, -40, w/2 - 30, h/2 - 35, "lstMission", misn_names, j, 0, misn_update ); /* Restore focus. */ window_setFocus( wid, focused ); free(focused); /* duplicateed the save focus functionaility from the bar */ }
/** * @brief Generates the cargo list. */ static void cargo_genList( unsigned int wid ) { char **buf; int nbuf; int i; int w, h; /* Get the dimensions. */ window_dimWindow( wid, &w, &h ); /* Destroy widget if needed. */ if (widget_exists( wid, "lstCargo" )) window_destroyWidget( wid, "lstCargo" ); /* List */ if (player.p->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.p->ncommodities); for (i=0; i<player.p->ncommodities; i++) { buf[i] = malloc(sizeof(char)*128); snprintf(buf[i],128, "%s%s %d", player.p->commodities[i].commodity->name, (player.p->commodities[i].id != 0) ? "*" : "", player.p->commodities[i].quantity); } nbuf = player.p->ncommodities; } window_addList( wid, 20, -40, w - 40, h - BUTTON_HEIGHT - 80, "lstCargo", buf, nbuf, 0, cargo_update ); cargo_update(wid, NULL); }
/** * @brief Gets the size of the outfits window. */ static void outfits_getSize( unsigned int wid, int *w, int *h, int *iw, int *ih, int *bw, int *bh ) { int padding; /* Get window dimensions. */ window_dimWindow( wid, w, h ); /* Calculate image array dimensions. */ if (iw != NULL) *iw = 310 + (*w-800); if (ih != NULL) *ih = *h - 60; /* Left padding + per-button padding * nbuttons */ padding = 40 + 20 * 4; /* Calculate button dimensions. */ if (bw != NULL) *bw = (*w - (iw!=NULL?*iw:0) - padding) / 4; if (bh != NULL) *bh = LAND_BUTTON_HEIGHT; }
/** * @brief Generates the weapons list. */ static void weapons_genList( unsigned int wid ) { const char *str; char **buf, tbuf[256]; int i, n; int w, h; /* Get the dimensions. */ window_dimWindow( wid, &w, &h ); /* Destroy widget if needed. */ if (widget_exists( wid, "lstWeapSets" )) { window_destroyWidget( wid, "lstWeapSets" ); n = toolkit_getListPos( wid, "lstWeapSets" ); } else n = -1; /* List */ buf = malloc( sizeof(char*) * PILOT_WEAPON_SETS ); for (i=0; i<PILOT_WEAPON_SETS; i++) { str = pilot_weapSetName( info_eq_weaps.selected, i ); if (str == NULL) snprintf( tbuf, sizeof(tbuf), "%d - ??", (i+1)%10 ); else snprintf( tbuf, sizeof(tbuf), "%d - %s", (i+1)%10, str ); buf[i] = strdup( tbuf ); } window_addList( wid, 20+180+20, -40, w - (20+180+20+20), 160, "lstWeapSets", buf, PILOT_WEAPON_SETS, 0, weapons_update ); /* Restore position. */ if (n >= 0) toolkit_setListPos( wid, "lstWeapSets", n ); }
/** * @brief Generates the mission list. * @param wid Window to generate the mission list for. * @param first Is it the first time generated? */ static void misn_genList( unsigned int wid, int first ) { int i,j; char** misn_names; int w,h; if (!first) window_destroyWidget( wid, "lstMission" ); /* Get window dimensions. */ window_dimWindow( wid, &w, &h ); /* list */ j = 1; /* make sure we don't accidentally free the memory twice. */ misn_names = NULL; if (mission_ncomputer > 0) { /* there are missions */ misn_names = malloc(sizeof(char*) * mission_ncomputer); j = 0; for (i=0; i<mission_ncomputer; i++) if (mission_computer[i].title != NULL) misn_names[j++] = strdup(mission_computer[i].title); } if ((misn_names==NULL) || (mission_ncomputer==0) || (j==0)) { /* no missions. */ if (j==0) free(misn_names); misn_names = malloc(sizeof(char*)); misn_names[0] = strdup("No Missions"); j = 1; } window_addList( wid, 20, -40, w/2 - 30, h/2 - 35, "lstMission", misn_names, j, 0, misn_update ); /* Update the list. */ misn_update( wid, NULL ); }
/** * @brief Opens the audio settings menu. */ static void opt_audio( unsigned int wid ) { (void) wid; int i, j; int cw; int w, h, y, x, l; char buf[32], **s; const char *str; /* Get size. */ window_dimWindow( wid, &w, &h ); /* Close button */ window_addButton( wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnClose", "Close", opt_close ); window_addButton( wid, -20 - 1*(BUTTON_WIDTH+20), 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnApply", "Apply", opt_audioSave ); window_addButton( wid, -20 - 2*(BUTTON_WIDTH+20), 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnDefaults", "Defaults", opt_audioDefaults ); /* General options. */ cw = (w-60)/2; x = 20; y = -60; window_addText( wid, x+20, y, cw, 20, 0, "txtSGeneral", NULL, &cDConsole, "General" ); y -= 30; window_addCheckbox( wid, x, y, cw, 20, "chkNosound", "Disable all sound/music", NULL, conf.nosound ); y -= 30; str = "Backends"; l = gl_printWidthRaw( NULL, str ); window_addText( wid, x, y, l, 40, 0, "txtSBackends", NULL, NULL, str ); l += 10; i = 0; j = 0; s = malloc(sizeof(char*)*2); #if USE_OPENAL if (strcmp(conf.sound_backend,"openal")==0) j = i; s[i++] = strdup("openal"); #endif /* USE_OPENAL */ #if USE_SDLMIX if (strcmp(conf.sound_backend,"sdlmix")==0) j = i; s[i++] = strdup("sdlmix"); #endif /* USE_SDLMIX */ if (i==0) s[i++] = strdup("none"); window_addList( wid, x+l, y, cw-(x+l), 40, "lstSound", s, i, j, NULL ); y -= 50; /* OpenAL options. */ window_addText( wid, x+20, y, cw, 20, 0, "txtSOpenal", NULL, &cDConsole, "OpenAL" ); y -= 30; window_addCheckbox( wid, x, y, cw, 20, "chkEFX", "EFX (More CPU)", NULL, conf.al_efx ); y -= 20; /* Sound levels. */ x = 20 + cw + 20; y = -60; window_addText( wid, x+20, y, 100, 20, 0, "txtSVolume", NULL, &cDConsole, "Volume Levels" ); y -= 30; /* Sound fader. */ opt_audioLevelStr( buf, sizeof(buf), 0, sound_getVolume() ); window_addText( wid, x, y, cw, 20, 1, "txtSound", NULL, NULL, buf ); y -= 20; window_addFader( wid, x, y, cw, 20, "fadSound", 0., 1., sound_getVolume(), opt_setAudioLevel ); window_faderScrollDone( wid, "fadSound", opt_beep ); y -= 40; /* Music fader. */ opt_audioLevelStr( buf, sizeof(buf), 1, music_getVolume() ); window_addText( wid, x, y, cw, 20, 1, "txtMusic", NULL, NULL, buf ); y -= 20; window_addFader( wid, x, y, cw, 20, "fadMusic", 0., 1., music_getVolume(), opt_setAudioLevel ); y -= 20; /* Restart text. */ window_addText( wid, 20, 10, 3*(BUTTON_WIDTH + 20), 30, 0, "txtRestart", &gl_smallFont, &cBlack, NULL ); }
/** * @brief Opens the gameplay menu. */ static void opt_gameplay( unsigned int wid ) { (void) wid; char buf[PATH_MAX]; const char *path; int cw; int w, h, y, x, by, l; char *s; /* Get size. */ window_dimWindow( wid, &w, &h ); /* Close button */ window_addButton( wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnClose", "Close", opt_close ); window_addButton( wid, -20 - 1*(BUTTON_WIDTH+20), 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnApply", "Apply", opt_gameplaySave ); window_addButton( wid, -20 - 2*(BUTTON_WIDTH+20), 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnDefaults", "Defaults", opt_gameplayDefaults ); /* Information. */ cw = (w-40); x = 20; y = -60; window_addText( wid, x, y, cw, 20, 1, "txtVersion", NULL, NULL, naev_version(1) ); y -= 20; #ifdef GIT_COMMIT window_addText( wid, x, y, cw, 20, 1, "txtCommit", NULL, NULL, "Commit: "GIT_COMMIT ); #endif /* GIT_COMMIT */ y -= 20; path = ndata_getPath(); if (path == NULL) snprintf( buf, sizeof(buf), "not using ndata" ); else snprintf( buf, sizeof(buf), "ndata: %s", path); window_addText( wid, x, y, cw, 20, 1, "txtNdata", NULL, NULL, buf ); y -= 40; by = y; /* Compiletime stuff. */ cw = (w-60)/2; y = by; x = 20; window_addText( wid, x+20, y, cw, 20, 0, "txtCompile", NULL, &cDConsole, "Compilation Flags" ); y -= 30; window_addText( wid, x, y, cw, h+y-20, 0, "txtFlags", NULL, NULL, "" #ifdef DEBUGGING #ifdef DEBUG_PARANOID "Debug Paranoid\n" #else /* DEBUG_PARANOID */ "Debug\n" #endif /* DEBUG_PARANOID */ #endif /* DEBUGGING */ #if defined(LINUX) "Linux\n" #elif defined(FREEBSD) "FreeBSD\n" #elif defined(MACOSX) "Mac OS X\n" #elif defined(WIN32) "Windows\n" #else "Unknown OS\n" #endif #ifdef USE_OPENAL "With OpenAL\n" #endif /* USE_OPENAL */ #ifdef USE_SDLMIX "With SDL_mixer\n" #endif #ifdef HAVE_LUAJIT "Using Lua JIT\n" #endif #ifdef NDATA_DEF "ndata: "NDATA_DEF"\n" #endif /* NDATA_DEF */ #ifdef PREFSDIR_DEF "preference directory: "PREFSDIR_DEF"\n" #endif /* PREFSDIR_DEF */ ); /* Options. */ y = by; x += cw; /* Autonav abort. */ x = 20 + cw + 20; window_addText( wid, x+65, y, 150, 150, 0, "txtAAutonav", NULL, &cDConsole, "Abort Autonav At:" ); y -= 20; /* Autonav abort fader. */ opt_getAutonavAbortStr( buf, sizeof(buf) ); window_addText( wid, x, y, cw, 20, 1, "txtAutonav", NULL, NULL, buf ); y -= 20; window_addFader( wid, x, y, cw, 20, "fadAutonav", 0., 1., conf.autonav_abort, opt_setAutonavAbort ); y -= 40; window_addText( wid, x+20, y, cw, 20, 0, "txtSettings", NULL, &cDConsole, "Settings" ); y -= 25; window_addCheckbox( wid, x, y, cw, 20, "chkZoomManual", "Enable manual zoom control", NULL, conf.zoom_manual ); y -= 25; window_addCheckbox( wid, x, y, cw, 20, "chkAfterburn", "Enable double-tap afterburn", NULL, conf.afterburn_sens ); y -= 25; window_addCheckbox( wid, x, y, cw, 20, "chkMouseThrust", "Enable mouse-flying thrust control", NULL, conf.mouse_thrust ); y -= 25; window_addCheckbox( wid, x, y, cw, 20, "chkCompress", "Enable savegame compression", NULL, conf.save_compress ); y -= 30; s = "Visible Messages"; l = gl_printWidthRaw( NULL, s ); window_addText( wid, -100, y, l, 20, 1, "txtSMSG", NULL, &cBlack, s ); window_addInput( wid, -50, y, 40, 20, "inpMSG", 4, 1, NULL ); y -= 30; s = "Max Time Compression Factor"; l = gl_printWidthRaw( NULL, s ); window_addText( wid, -100, y, l, 20, 1, "txtTMax", NULL, &cBlack, s ); window_addInput( wid, -50, y, 40, 20, "inpTMax", 4, 1, NULL ); y -= 30; /* Restart text. */ window_addText( wid, 20, 10, 3*(BUTTON_WIDTH + 20), 30, 0, "txtRestart", &gl_smallFont, &cBlack, NULL ); /* Update. */ opt_gameplayUpdate( wid, NULL ); }
/** * @brief Initializes the video window. */ static void opt_video( unsigned int wid ) { (void) wid; int i, j, nres, res_def; char buf[16]; int cw; int w, h, y, x, l; SDL_Rect** modes; char **res; const char *s; /* Get size. */ window_dimWindow( wid, &w, &h ); /* Close button */ window_addButton( wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnClose", "Close", opt_close ); window_addButton( wid, -20 - 1*(BUTTON_WIDTH+20), 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnApply", "Apply", opt_videoSave ); window_addButton( wid, -20 - 2*(BUTTON_WIDTH+20), 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnDefaults", "Defaults", opt_videoDefaults ); /* Resolution bits. */ cw = (w-60)/2; x = 20; y = -60; window_addText( wid, x+20, y, 100, 20, 0, "txtSRes", NULL, &cDConsole, "Resolution" ); y -= 40; window_addInput( wid, x, y, 100, 20, "inpRes", 16, 1, NULL ); snprintf( buf, sizeof(buf), "%dx%d", conf.width, conf.height ); window_setInput( wid, "inpRes", buf ); window_setInputFilter( wid, "inpRes", "abcdefghijklmnopqrstuvwyzABCDEFGHIJKLMNOPQRSTUVWXYZ[]{}()-=*/\\'\"~<>!@#$%^&|_`" ); window_addCheckbox( wid, x+20+100, y, 100, 20, "chkFullscreen", "Fullscreen", NULL, conf.fullscreen ); y -= 30; modes = SDL_ListModes( NULL, SDL_OPENGL | SDL_FULLSCREEN ); j = 1; for (i=0; modes[i]; i++) { if ((modes[i]->w == conf.width) && (modes[i]->h == conf.height)) j = 0; } res = malloc( sizeof(char*) * (i+j) ); nres = 0; if (j) { res[0] = malloc(16); snprintf( res[0], 16, "%dx%d", conf.width, conf.height ); res_def = 0; nres = 1; } for (i=0; modes[i]; i++) { res[ nres ] = malloc(16); snprintf( res[ nres ], 16, "%dx%d", modes[i]->w, modes[i]->h ); if ((modes[i]->w == conf.width) && (modes[i]->h == conf.height)) res_def = i; nres++; } window_addList( wid, x, y, 140, 100, "lstRes", res, nres, -1, opt_videoRes ); y -= 150; /* FPS stuff. */ window_addText( wid, x+20, y, 100, 20, 0, "txtFPSTitle", NULL, &cDConsole, "FPS Control" ); y -= 30; s = "FPS Limit"; l = gl_printWidthRaw( NULL, s ); window_addText( wid, x, y, l, 20, 1, "txtSFPS", NULL, &cBlack, s ); window_addInput( wid, x+l+20, y, 40, 20, "inpFPS", 4, 1, NULL ); toolkit_setListPos( wid, "lstRes", res_def); window_setInputFilter( wid, "inpFPS", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ[]{}()-=*/\\'\"~<>!@#$%^&|_`" ); y -= 30; window_addCheckbox( wid, x, y, cw, 20, "chkFPS", "Show FPS", NULL, conf.fps_show ); y -= 40; /* OpenGL options. */ x = 20+cw+20; y = -60; window_addText( wid, x+20, y, 100, 20, 0, "txtSGL", NULL, &cDConsole, "OpenGL" ); y -= 30; window_addCheckbox( wid, x, y, cw, 20, "chkVSync", "Vertical Sync", NULL, conf.vsync ); y -= 20; window_addCheckbox( wid, x, y, cw, 20, "chkVBO", "Vertex Buffer Objects*", NULL, conf.vbo ); y -= 20; window_addCheckbox( wid, x, y, cw, 20, "chkMipmaps", "Mipmaps*", NULL, conf.mipmaps ); y -= 20; window_addCheckbox( wid, x, y, cw, 20, "chkInterpolate", "Interpolation*", NULL, conf.interpolate ); y -= 20; window_addCheckbox( wid, x, y, cw, 20, "chkNPOT", "NPOT Textures*", NULL, conf.npot ); y -= 30; window_addText( wid, x, y, cw, 20, 1, "txtSCompat", NULL, &cBlack, "*Disable for compatibility." ); y -= 40; /* Features. */ window_addText( wid, x+20, y, 100, 20, 0, "txtSFeatures", NULL, &cDConsole, "Features" ); y -= 30; window_addCheckbox( wid, x, y, cw, 20, "chkEngineGlow", "Engine Glow (More RAM)", NULL, conf.engineglow ); y -= 20; /* Restart text. */ window_addText( wid, 20, 10, 3*(BUTTON_WIDTH + 20), 30, 0, "txtRestart", &gl_smallFont, &cBlack, NULL ); }
/** * @brief Opens the shipyard window. */ void shipyard_open( unsigned int wid ) { int i; Ship **ships; char **sships; glTexture **tships; int nships; int w, h; int iw, ih; int bw, bh, padding, off; int th; int y; const char *buf; /* Mark as generated. */ land_tabGenerate(LAND_WINDOW_SHIPYARD); /* Init vars. */ shipyard_selected = NULL; /* Get window dimensions. */ window_dimWindow( wid, &w, &h ); /* Calculate image array dimensions. */ iw = 310 + (w-800); ih = h - 60; /* Left padding + per-button padding * nbuttons */ padding = 40 + 20 * 4; /* Calculate button dimensions. */ bw = (w - iw - padding) / 4; bh = LAND_BUTTON_HEIGHT; /* buttons */ window_addButtonKey( wid, off = -20, 20, bw, bh, "btnCloseShipyard", "Take Off", land_buttonTakeoff, SDLK_t ); window_addButtonKey( wid, off -= 20+bw, 20, bw, bh, "btnTradeShip", "Trade-In", shipyard_trade, SDLK_r ); window_addButtonKey( wid, off -= 20+bw, 20, bw, bh, "btnBuyShip", "Buy", shipyard_buy, SDLK_b ); window_addButtonKey( wid, off -= 20+bw, 20, bw, bh, "btnFindShips", "Find Ships", shipyard_find, SDLK_f ); /* target gfx */ window_addRect( wid, -41, -50, SHIP_TARGET_W, SHIP_TARGET_H, "rctTarget", &cBlack, 0 ); window_addImage( wid, -40, -50, SHIP_TARGET_W, SHIP_TARGET_H, "imgTarget", NULL, 1 ); /* slot types */ window_addCust( wid, -20, -160, 148, 70, "cstSlots", 0., shipyard_renderSlots, NULL, NULL ); /* stat text */ window_addText( wid, -40, -240, 128, 200, 0, "txtStats", &gl_smallFont, &cBlack, NULL ); /* text */ buf = "Model:\n" "Class:\n" "Fabricator:\n" "Crew:\n" "\n" "CPU:\n" "Mass:\n" "Thrust:\n" "Speed:\n" "Turn:\n" "\n" "Absorption:\n" "Shield:\n" "Armour:\n" "Energy:\n" "Cargo Space:\n" "Fuel:\n" "Fuel Use:\n" "Price:\n" "Money:\n" "License:\n"; th = gl_printHeightRaw( &gl_smallFont, 100, buf ); y = -55; window_addText( wid, 40+iw+20, y, 100, th, 0, "txtSDesc", &gl_smallFont, &cDConsole, buf ); window_addText( wid, 40+iw+20+100, y, w-(40+iw+20+100)-20, th, 0, "txtDDesc", &gl_smallFont, &cBlack, NULL ); y -= th; window_addText( wid, 20+iw+40, y, w-(20+iw+40) - 180, 185, 0, "txtDescription", &gl_smallFont, NULL, NULL ); /* set up the ships to buy/sell */ ships = tech_getShip( land_planet->tech, &nships ); if (nships <= 0) { sships = malloc(sizeof(char*)); sships[0] = strdup("None"); tships = malloc(sizeof(glTexture*)); tships[0] = NULL; nships = 1; } else { sships = malloc(sizeof(char*)*nships); tships = malloc(sizeof(glTexture*)*nships); for (i=0; i<nships; i++) { sships[i] = strdup(ships[i]->name); tships[i] = ships[i]->gfx_store; } free(ships); } window_addImageArray( wid, 20, 20, iw, ih, "iarShipyard", 64./96.*128., 64., tships, sships, nships, shipyard_update, shipyard_rmouse ); /* write the shipyard stuff */ shipyard_update(wid, NULL); /* Set default keyboard focuse to the list */ window_setFocus( wid , "iarShipyard" ); }
/** * @brief Opens the gameplay menu. */ static void opt_gameplay( unsigned int wid ) { (void) wid; char buf[PATH_MAX]; const char *path; int cw; int w, h, y, x, by, l; char *s; /* Get size. */ window_dimWindow( wid, &w, &h ); /* Close button */ window_addButton( wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnClose", "Close", opt_close ); window_addButton( wid, -20 - 1*(BUTTON_WIDTH+20), 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnApply", "Apply", opt_gameplaySave ); window_addButton( wid, -20 - 2*(BUTTON_WIDTH+20), 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnDefaults", "Defaults", opt_gameplayDefaults ); /* Information. */ cw = (w-40); x = 20; y = -60; window_addText( wid, x, y, cw, 20, 1, "txtVersion", NULL, NULL, naev_version(1) ); y -= 20; #ifdef GIT_COMMIT window_addText( wid, x, y, cw, 20, 1, "txtCommit", NULL, NULL, "Commit: "GIT_COMMIT ); #endif /* GIT_COMMIT */ y -= 20; path = ndata_getPath(); if (path == NULL) snprintf( buf, sizeof(buf), "not using ndata" ); else snprintf( buf, sizeof(buf), "ndata: %s", path); window_addText( wid, x, y, cw, 20, 1, "txtNdata", NULL, NULL, buf ); y -= 50; by = y; /* Compiletime stuff. */ cw = (w-60)/2; y = by; x = 20; window_addText( wid, x+20, y, cw, 20, 0, "txtCompile", NULL, &cDConsole, "Compilation Flags" ); y -= 30; window_addText( wid, x, y, cw, h+y-20, 0, "txtFlags", NULL, NULL, "" #ifdef DEBUGGING #ifdef DEBUG_PARANOID "Debug Paranoid\n" #else /* DEBUG_PARANOID */ "Debug\n" #endif /* DEBUG_PARANOID */ #endif /* DEBUGGING */ #if defined(LINUX) "Linux\n" #elif defined(FREEBSD) "FreeBSD\n" #elif defined(MACOSX) "Mac OS X\n" #elif defined(WIN32) "Windows\n" #else "Unknown OS\n" #endif #ifdef USE_OPENAL "With OpenAL\n" #endif /* USE_OPENAL */ #ifdef USE_SDLMIX "With SDL_mixer\n" #endif #ifdef NDATA_DEF "ndata: "NDATA_DEF"\n" #endif /* NDATA_DEF */ ); /* Options. */ y = by; x += cw; window_addText( wid, x+20, y, cw, 20, 0, "txtSettings", NULL, &cDConsole, "Settings" ); y -= 30; window_addCheckbox( wid, x, y, cw, 20, "chkAfterburn", "Enable doubletap afterburn", NULL, conf.afterburn_sens ); y -= 20; window_addCheckbox( wid, x, y, cw, 20, "chkCompress", "Enable savegame compression", NULL, conf.save_compress ); y -= 50; s = "Visible messages"; l = gl_printWidthRaw( NULL, s ); window_addText( wid, x, y, l, 20, 1, "txtSMSG", NULL, &cBlack, s ); window_addInput( wid, x+l+20, y, 40, 20, "inpMSG", 4, 1 ); y -= 20; /* Restart text. */ window_addText( wid, -20, 20+BUTTON_HEIGHT+20, 3*(BUTTON_WIDTH + 20), 30, 1, "txtRestart", &gl_smallFont, &cBlack, NULL ); /* Update. */ opt_gameplayUpdate( wid, NULL ); }
/** * @brief Gets the window standings window dimensions. */ static void info_getDim( unsigned int wid, int *w, int *h, int *lw ) { /* Get the dimensions. */ window_dimWindow( wid, w, h ); *lw = *w-60-BUTTON_WIDTH-120; }