/** * @brief Updates the missions in the spaceport bar. * @param wid Window to update the outfits in. * @param str Unused. */ static void bar_update( unsigned int wid, char* str ) { (void) str; int pos; int w, h, iw, ih, bw, bh, dh; /* Get dimensions. */ bar_getDim( wid, &w, &h, &iw, &ih, &bw, &bh ); dh = gl_printHeightRaw( &gl_smallFont, w - iw - 60, land_planet->bar_description ); /* Get array. */ pos = toolkit_getImageArrayPos( wid, "iarMissions" ); /* See if is news. */ if (pos==0) { /* News selected. */ if (!widget_exists(wid, "cstNews")) { /* Destroy portrait. */ if (widget_exists(wid, "imgPortrait")) { window_destroyWidget(wid, "imgPortrait"); } /* Disable button. */ window_disableButton( wid, "btnApproach" ); /* Clear text. */ window_modifyText( wid, "txtPortrait", NULL ); window_modifyText( wid, "txtMission", NULL ); /* Create news. */ news_widget( wid, iw + 60, -40 - (40 + dh), w - iw - 100, h - 40 - (dh+20) - 40 - bh - 20 ); } return; } /* Shift to ignore news now. */ pos--; /* Destroy news widget if needed. */ if (widget_exists(wid, "cstNews")) { window_destroyWidget( wid, "cstNews" ); } /* Create widgets if needed. */ if (!widget_exists(wid, "imgPortrait")) { window_addImage( wid, iw + 40 + (w-iw-60-PORTRAIT_WIDTH)/2, -(40 + dh + 40 + gl_defFont.h + 20 + PORTRAIT_HEIGHT), 0, 0, "imgPortrait", NULL, 1 ); } /* Enable button. */ window_enableButton( wid, "btnApproach" ); /* Set portrait. */ window_modifyText( wid, "txtPortrait", npc_getName( pos ) ); window_modifyImage( wid, "imgPortrait", npc_getTexture( pos ), 0, 0 ); /* Set mission description. */ window_modifyText( wid, "txtMission", npc_getDesc( pos )); }
/** * @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 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 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 main menu (titlescreen). */ void menu_main (void) { int offset_logo, offset_wdw, freespace; unsigned int bwid, wid; glTexture *tex; /* Play load music. */ music_choose("load"); /* Load background and friends. */ tex = gl_newImage( "gfx/NAEV.png", 0 ); main_naevLogo = tex; nebu_prep( 300., 0. ); /* Needed for nebula to not spaz out */ /* Calculate Logo and window offset. */ freespace = SCREEN_H - tex->sh - MAIN_HEIGHT; if (freespace < 0) { /* Not enough freespace, this can get ugly. */ offset_logo = SCREEN_W - tex->sh; offset_wdw = 0; } else { /* We'll want a maximum seperation of 30 between logo and text. */ if (freespace/3 > 25) { freespace -= 25; offset_logo = -25; offset_wdw = -25 - tex->sh - 25; } /* Otherwise space evenly. */ else { offset_logo = -freespace/3; offset_wdw = freespace/3; } } /* create background image window */ bwid = window_create( "BG", -1, -1, SCREEN_W, SCREEN_H ); window_onClose( bwid, menu_main_cleanBG ); window_addRect( bwid, 0, 0, SCREEN_W, SCREEN_H, "rctBG", &cBlack, 0 ); window_addCust( bwid, 0, 0, SCREEN_W, SCREEN_H, "cstBG", 0, menu_main_nebu, NULL, &menu_main_lasttick ); window_addImage( bwid, (SCREEN_W-tex->sw)/2., offset_logo, "imgLogo", tex, 0 ); window_addText( bwid, 0., 10, SCREEN_W, 30., 1, "txtBG", NULL, &cWhite, naev_version(1) ); /* create menu window */ wid = window_create( "Main Menu", -1, offset_wdw, MAIN_WIDTH, MAIN_HEIGHT ); window_addButton( wid, 20, 20 + (BUTTON_HEIGHT+20)*4, BUTTON_WIDTH, BUTTON_HEIGHT, "btnLoad", "Load Game", menu_main_load ); window_addButton( wid, 20, 20 + (BUTTON_HEIGHT+20)*3, BUTTON_WIDTH, BUTTON_HEIGHT, "btnNew", "New Game", menu_main_new ); window_addButton( wid, 20, 20 + (BUTTON_HEIGHT+20)*2, BUTTON_WIDTH, BUTTON_HEIGHT, "btnOptions", "Options", menu_options_button ); window_addButton( wid, 20, 20 + (BUTTON_HEIGHT+20), BUTTON_WIDTH, BUTTON_HEIGHT, "btnCredits", "Credits", menu_main_credits ); window_addButton( wid, 20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnExit", "Exit", menu_exit ); /* Make the background window a parent of the menu. */ window_setParent( bwid, wid ); /* Reset timer. */ menu_main_lasttick = SDL_GetTicks(); menu_Open(MENU_MAIN); }
/** * @brief Opens the outfit exchange center window. */ void outfits_open( unsigned int wid ) { int i; Outfit **outfits; char **soutfits; glTexture **toutfits; int noutfits; int w, h; int iw, ih; int bw, bh; glColour *bg, blend; const glColour *c; char **slottype; const char *slotname; /* Get dimensions. */ outfits_getSize( wid, &w, &h, &iw, &ih, &bw, &bh ); /* will allow buying from keyboard */ window_setAccept( wid, outfits_buy ); /* buttons */ window_addButton( wid, -20, 20, bw, bh, "btnCloseOutfits", "Takeoff", land_buttonTakeoff ); window_addButton( wid, -40-bw, 20, bw, bh, "btnSellOutfit", "Sell", outfits_sell ); window_addButton( wid, -60-bw*2, 20, bw, bh, "btnBuyOutfit", "Buy", outfits_buy ); /* fancy 128x128 image */ window_addRect( wid, 19 + iw + 20, -50, 128, 129, "rctImage", &cBlack, 0 ); window_addImage( wid, 20 + iw + 20, -50-128, 0, 0, "imgOutfit", NULL, 1 ); /* cust draws the modifier */ window_addCust( wid, -40-bw, 60+2*bh, bw, bh, "cstMod", 0, outfits_renderMod, NULL, NULL ); /* the descriptive text */ window_addText( wid, 20 + iw + 20 + 128 + 20, -60, 320, 160, 0, "txtOutfitName", &gl_defFont, &cBlack, NULL ); window_addText( wid, 20 + iw + 20 + 128 + 20, -60 - gl_defFont.h - 20, 320, 160, 0, "txtDescShort", &gl_smallFont, &cBlack, NULL ); window_addText( wid, 20 + iw + 20, -60-128-10, 60, 160, 0, "txtSDesc", &gl_smallFont, &cDConsole, "Owned:\n" "\n" "Slot:\n" "Size:\n" "Mass:\n" "\n" "Price:\n" "Money:\n" "License:\n" ); window_addText( wid, 20 + iw + 20 + 60, -60-128-10, 250, 160, 0, "txtDDesc", &gl_smallFont, &cBlack, NULL ); window_addText( wid, 20 + iw + 20, -60-128-10-160, w-(iw+80), 180, 0, "txtDescription", &gl_smallFont, NULL, NULL ); /* set up the outfits to buy/sell */ outfits = tech_getOutfit( land_planet->tech, &noutfits ); if (noutfits <= 0) { /* No outfits */ soutfits = malloc(sizeof(char*)); soutfits[0] = strdup("None"); toutfits = malloc(sizeof(glTexture*)); toutfits[0] = NULL; noutfits = 1; bg = NULL; slottype = NULL; } else { /* Create the outfit arrays. */ soutfits = malloc(sizeof(char*)*noutfits); toutfits = malloc(sizeof(glTexture*)*noutfits); bg = malloc(sizeof(glColour)*noutfits); slottype = malloc(sizeof(char*)*noutfits ); for (i=0; i<noutfits; i++) { soutfits[i] = strdup(outfits[i]->name); toutfits[i] = outfits[i]->gfx_store; /* Background colour. */ c = outfit_slotSizeColour( &outfits[i]->slot ); if (c == NULL) c = &cBlack; col_blend( &blend, c, &cGrey70, 0.4 ); memcpy( &bg[i], &blend, sizeof(glColour) ); /* Get slot name. */ slotname = outfit_slotName(outfits[i]); if ((strcmp(slotname,"NA") != 0) && (strcmp(slotname,"NULL") != 0)) { slottype[i] = malloc( 2 ); slottype[i][0] = outfit_slotName(outfits[i])[0]; slottype[i][1] = '\0'; } else slottype[i] = NULL; } free(outfits); } window_addImageArray( wid, 20, 20, iw, ih, "iarOutfits", 64, 64, toutfits, soutfits, noutfits, outfits_update, outfits_rmouse ); /* write the outfits stuff */ outfits_update( wid, NULL ); outfits_updateQuantities( wid ); toolkit_setImageArraySlotType( wid, "iarOutfits", slottype ); toolkit_setImageArrayBackground( wid, "iarOutfits", bg ); }
/** * @brief Opens the map window. */ void map_open (void) { unsigned int wid; StarSystem *cur; int w, h, x, y, rw; /* Not under manual control. */ if (pilot_isFlag( player.p, PILOT_MANUAL_CONTROL )) return; /* Destroy window if exists. */ wid = window_get(MAP_WDWNAME); if (wid > 0) { window_destroy( wid ); return; } /* set position to focus on current system */ map_xpos = cur_system->pos.x; map_ypos = cur_system->pos.y; /* mark systems as needed */ mission_sysMark(); /* Attempt to select current map if none is selected */ if (map_selected == -1) map_selectCur(); /* get the selected system. */ cur = system_getIndex( map_selected ); /* Set up window size. */ w = MAX(600, SCREEN_W - 100); h = MAX(540, SCREEN_H - 100); /* create the window. */ wid = window_create( MAP_WDWNAME, -1, -1, w, h ); window_setCancel( wid, window_close ); window_handleKeys( wid, map_keyHandler ); /* * SIDE TEXT * * $System * * Faction: * $Faction (or Multiple) * * Status: * $Status * * Planets: * $Planet1, $Planet2, ... * * Services: * $Services * * ... * [Autonav] * [ Find ] * [ Close ] */ x = -70; /* Right column X offset. */ y = -20; rw = ABS(x) + 60; /* Right column indented width maximum. */ /* System Name */ window_addText( wid, -90 + 80, y, 160, 20, 1, "txtSysname", &gl_defFont, &cDConsole, cur->name ); y -= 10; /* Faction image */ window_addImage( wid, -90 + 32, y - 32, 0, 0, "imgFaction", NULL, 0 ); y -= 64 + 10; /* Faction */ window_addText( wid, x, y, 90, 20, 0, "txtSFaction", &gl_smallFont, &cDConsole, "Faction:" ); window_addText( wid, x + 50, y-gl_smallFont.h-5, rw, 100, 0, "txtFaction", &gl_smallFont, &cBlack, NULL ); y -= 2 * gl_smallFont.h + 5 + 15; /* Standing */ window_addText( wid, x, y, 90, 20, 0, "txtSStanding", &gl_smallFont, &cDConsole, "Standing:" ); window_addText( wid, x + 50, y-gl_smallFont.h-5, rw, 100, 0, "txtStanding", &gl_smallFont, &cBlack, NULL ); y -= 2 * gl_smallFont.h + 5 + 15; /* Presence. */ window_addText( wid, x, y, 90, 20, 0, "txtSPresence", &gl_smallFont, &cDConsole, "Presence:" ); window_addText( wid, x + 50, y-gl_smallFont.h-5, rw, 100, 0, "txtPresence", &gl_smallFont, &cBlack, NULL ); y -= 2 * gl_smallFont.h + 5 + 15; /* Planets */ window_addText( wid, x, y, 90, 20, 0, "txtSPlanets", &gl_smallFont, &cDConsole, "Planets:" ); window_addText( wid, x + 50, y-gl_smallFont.h-5, rw, 150, 0, "txtPlanets", &gl_smallFont, &cBlack, NULL ); y -= 2 * gl_smallFont.h + 5 + 15; /* Services */ window_addText( wid, x, y, 90, 20, 0, "txtSServices", &gl_smallFont, &cDConsole, "Services:" ); window_addText( wid, x + 50, y-gl_smallFont.h-5, rw, 100, 0, "txtServices", &gl_smallFont, &cBlack, NULL ); y -= 2 * gl_smallFont.h + 5 + 15; /* Close button */ window_addButton( wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnClose", "Close", window_close ); /* Find button */ window_addButton( wid, -20 - (BUTTON_WIDTH+20), 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnFind", "Find", map_inputFind ); /* Autonav button */ window_addButton( wid, -20 - 2*(BUTTON_WIDTH+20), 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnAutonav", "Autonav", player_autonavStartWindow ); /* * Bottom stuff * * [+] [-] Nebula, Interference */ /* Zoom buttons */ window_addButton( wid, 40, 20, 30, 30, "btnZoomIn", "+", map_buttonZoom ); window_addButton( wid, 80, 20, 30, 30, "btnZoomOut", "-", map_buttonZoom ); /* Situation text */ window_addText( wid, 140, 10, w - 80 - 30 - 30, 30, 0, "txtSystemStatus", &gl_smallFont, &cBlack, NULL ); /* * The map itself. */ map_show( wid, 20, -40, w-200, h-100, 1. ); /* Reset zoom. */ map_update( wid ); /* * Disable Autonav button if player lacks fuel. */ if ((player.p->fuel < HYPERSPACE_FUEL) || pilot_isFlag( player.p, PILOT_NOJUMP)) window_disableButton( wid, "btnAutonav" ); }
/** * @brief Opens the map window. */ void map_open (void) { unsigned int wid; StarSystem *cur; int w,h; /* Destroy window if exists. */ wid = window_get(MAP_WDWNAME); if (wid > 0) { window_destroy( wid ); return; } /* set position to focus on current system */ map_xpos = cur_system->pos.x; map_ypos = cur_system->pos.y; /* mark systems as needed */ mission_sysMark(); /* Attempt to select current map if none is selected */ if (map_selected == -1) map_selectCur(); /* get the selected system. */ cur = system_getIndex( map_selected ); /* Set up window size. */ w = MAX(600, SCREEN_W - 100); h = MAX(540, SCREEN_H - 100); /* create the window. */ wid = window_create( MAP_WDWNAME, -1, -1, w, h ); window_setCancel( wid, window_close ); /* * SIDE TEXT * * $System * * Faction: * $Faction (or Multiple) * * Status: * $Status * * Planets: * $Planet1, $Planet2, ... * * Services: * $Services * * ... * * [Close] */ /* System Name */ window_addText( wid, -20, -20, 100, 20, 1, "txtSysname", &gl_defFont, &cDConsole, cur->name ); /* Faction */ window_addImage( wid, -20-64, -60-64, "imgFaction", NULL, 0 ); window_addText( wid, -20, -60, 90, 20, 0, "txtSFaction", &gl_smallFont, &cDConsole, "Faction:" ); window_addText( wid, -20, -60-gl_smallFont.h-5, 80, 100, 0, "txtFaction", &gl_smallFont, &cBlack, NULL ); /* Standing */ window_addText( wid, -20, -100, 90, 20, 0, "txtSStanding", &gl_smallFont, &cDConsole, "Standing:" ); window_addText( wid, -20, -100-gl_smallFont.h-5, 80, 100, 0, "txtStanding", &gl_smallFont, &cBlack, NULL ); /* Security. */ window_addText( wid, -20, -140, 90, 20, 0, "txtSSecurity", &gl_smallFont, &cDConsole, "Security:" ); window_addText( wid, -20, -140-gl_smallFont.h-5, 80, 100, 0, "txtSecurity", &gl_smallFont, &cBlack, NULL ); /* Planets */ window_addText( wid, -20, -180, 90, 20, 0, "txtSPlanets", &gl_smallFont, &cDConsole, "Planets:" ); window_addText( wid, -20, -180-gl_smallFont.h-5, 80, 100, 0, "txtPlanets", &gl_smallFont, &cBlack, NULL ); /* Services */ window_addText( wid, -20, -220, 90, 20, 0, "txtSServices", &gl_smallFont, &cDConsole, "Services:" ); window_addText( wid, -20, -220-gl_smallFont.h-5, 80, 100, 0, "txtServices", &gl_smallFont, &cBlack, NULL ); /* Close button */ window_addButton( wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, "btnClose", "Close", window_close ); /* * Bottom stuff * * [+] [-] Nebula, Asteroids, Interference */ /* Zoom buttons */ window_addButton( wid, 40, 20, 30, 30, "btnZoomIn", "+", map_buttonZoom ); window_addButton( wid, 80, 20, 30, 30, "btnZoomOut", "-", map_buttonZoom ); /* Situation text */ window_addText( wid, 140, 10, w - 80 - 30 - 30, 30, 0, "txtSystemStatus", &gl_smallFont, &cBlack, NULL ); /* * The map itself. */ map_show( wid, 20, -40, w-150, h-100, 1. ); /* Reset zoom. */ map_update( wid ); }
/** * @brief Opens the main menu (titlescreen). */ void menu_main (void) { int offset_logo, offset_wdw, freespace; unsigned int bwid, wid; glTexture *tex; int h, y; if (menu_isOpen(MENU_MAIN)) { WARN( _("Menu main is already open.") ); return; } /* Clean up GUI - must be done before using SCREEN_W or SCREEN_H. */ gui_cleanup(); player_soundStop(); /* Stop sound. */ /* Play load music. */ music_choose("load"); /* Load background and friends. */ tex = gl_newImage( GFX_PATH"Naev.png", 0 ); main_naevLogo = tex; menu_main_bkg_system(); /* Set dimensions */ y = 20 + (BUTTON_HEIGHT+20)*5; h = y + 80; if (conf.devmode) { h += BUTTON_HEIGHT + 20; y += BUTTON_HEIGHT + 20; } /* Calculate Logo and window offset. */ freespace = SCREEN_H - tex->sh - h; if (freespace < 0) { /* Not enough freespace, this can get ugly. */ offset_logo = SCREEN_W - tex->sh; offset_wdw = 0; } /* Otherwise space evenly. */ else { offset_logo = -freespace/4; offset_wdw = freespace/2; } /* create background image window */ bwid = window_create( "BG", -1, -1, -1, -1 ); window_onClose( bwid, menu_main_cleanBG ); window_setBorder( bwid, 0 ); window_addImage( bwid, (SCREEN_W-tex->sw)/2., offset_logo, 0, 0, "imgLogo", tex, 0 ); window_addText( bwid, 0, 10, SCREEN_W, 30., 1, "txtBG", NULL, &cWhite, naev_version(1) ); /* create menu window */ wid = window_create( "Main Menu", -1, offset_wdw, MAIN_WIDTH, h ); window_setCancel( wid, main_menu_promptClose ); /* Buttons. */ window_addButtonKey( wid, 20, y, BUTTON_WIDTH, BUTTON_HEIGHT, "btnLoad", _("Load Game"), menu_main_load, SDLK_l ); y -= BUTTON_HEIGHT+20; window_addButtonKey( wid, 20, y, BUTTON_WIDTH, BUTTON_HEIGHT, "btnNew", _("New Game"), menu_main_new, SDLK_n ); y -= BUTTON_HEIGHT+20; window_addButtonKey( wid, 20, y, BUTTON_WIDTH, BUTTON_HEIGHT, "btnTutorial", _("Tutorial"), menu_main_tutorial, SDLK_t ); y -= BUTTON_HEIGHT+20; if (conf.devmode) { window_addButtonKey( wid, 20, y, BUTTON_WIDTH, BUTTON_HEIGHT, "btnEditor", _("Editors"), menu_editors_open, SDLK_e ); y -= BUTTON_HEIGHT+20; } window_addButtonKey( wid, 20, y, BUTTON_WIDTH, BUTTON_HEIGHT, "btnOptions", _("Options"), menu_options_button, SDLK_o ); y -= BUTTON_HEIGHT+20; window_addButtonKey( wid, 20, y, BUTTON_WIDTH, BUTTON_HEIGHT, "btnCredits", _("Credits"), menu_main_credits, SDLK_c ); y -= BUTTON_HEIGHT+20; window_addButtonKey( wid, 20, y, BUTTON_WIDTH, BUTTON_HEIGHT, "btnExit", _("Exit"), menu_exit, SDLK_x ); /* Disable load button if there are no saves. */ if (!save_hasSave()) window_disableButton( wid, "btnLoad" ); /* Make the background window a child of the menu. */ window_setParent( bwid, wid ); unpause_game(); menu_Open(MENU_MAIN); }