/** * @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 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 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 Adds the "Buy Local Map" button if needed. */ void land_checkAddMap (void) { char buf[ECON_CRED_STRLEN], cred[ECON_CRED_STRLEN]; Outfit *o; /* Maps are only offered if the planet provides fuel. */ if (!planet_hasService(land_planet, PLANET_SERVICE_REFUEL)) return; o = outfit_get( LOCAL_MAP_NAME ); if (o == NULL) { WARN("Outfit '%s' does not exist!", LOCAL_MAP_NAME); return; } /* Just enable button if it exists. */ if (widget_exists( land_windows[0], "btnMap" )) window_enableButton( land_windows[0], "btnMap"); /* Else create it. */ else { /* Refuel button. */ credits2str( cred, o->price, 2 ); nsnprintf( buf, sizeof(buf), "Buy Local Map (%s)", cred ); window_addButtonKey( land_windows[0], -20, 20 + (LAND_BUTTON_HEIGHT + 20), LAND_BUTTON_WIDTH,LAND_BUTTON_HEIGHT, "btnMap", buf, spaceport_buyMap, SDLK_b ); } /* Make sure player can click it. */ if (!outfit_canBuy(LOCAL_MAP_NAME, land_planet)) window_disableButtonSoft( land_windows[0], "btnMap" ); }
/** * @brief Generates the mission list for the bar. * * @param wid Window to create mission list for. */ static int bar_genList( unsigned int wid ) { glTexture **portraits; char **names, *focused; int w, h, iw, ih, bw, bh; int n; /* Get dimensions. */ bar_getDim( wid, &w, &h, &iw, &ih, &bw, &bh ); /* Save focus. */ focused = strdup(window_getFocus(wid)); /* Destroy widget if already exists. */ if (widget_exists( wid, "iarMissions" )) window_destroyWidget( wid, "iarMissions" ); /* We sort just in case. */ npc_sort(); /* Set up missions. */ if (mission_portrait == NULL) mission_portrait = gl_newImage( PORTRAIT_GFX_PATH"news.png", 0 ); n = npc_getArraySize(); if (n <= 0) { n = 1; portraits = malloc(sizeof(glTexture*)); portraits[0] = mission_portrait; names = malloc(sizeof(char*)); names[0] = strdup("News"); } else { n = n+1; portraits = malloc( sizeof(glTexture*) * n ); portraits[0] = mission_portrait; npc_getTextureArray( &portraits[1], n-1 ); names = malloc( sizeof(char*) * n ); names[0] = strdup("News"); npc_getNameArray( &names[1], n-1 ); } window_addImageArray( wid, 20, -40, iw, ih, "iarMissions", 100, 75, portraits, names, n, bar_update, NULL ); /* write the outfits stuff */ bar_update( wid, NULL ); /* Restore focus. */ window_setFocus( wid, focused ); free(focused); return 0; }
/** * @brief Refuels the player. * @param wid Land window. * @param str Unused. */ static void spaceport_refuel( unsigned int wid, char *str ) { (void)str; credits_t price; price = refuel_price(); if (!player_hasCredits( price )) { /* player is out of money after landing */ dialogue_alert("You seem to not have enough credits to refuel your ship." ); return; } player_modCredits( -price ); player.p->fuel = player.p->fuel_max; if (widget_exists( land_windows[0], "btnRefuel" )) { window_destroyWidget( wid, "btnRefuel" ); window_destroyWidget( wid, "txtRefuel" ); } }
/** * @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 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 ); }