/** * @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 Makes sure it's sane to buy a ship, trading the old one in simultaneously. * @param shipname Ship being bought. */ int shipyard_canTrade( char* shipname ) { int failure = 0; Ship* ship; ship = ship_get( shipname ); credits_t price; price = ship_buyPrice( ship ); /* Must have the necessary license, enough credits, and be able to swap ships. */ if (!player_hasLicense(ship->license)) { land_errDialogueBuild( "You lack the %s.", ship->license ); failure = 1; } if (!player_hasCredits( price - player_shipPrice(player.p->name))) { credits_t creditdifference = price - (player_shipPrice(player.p->name) + player.p->credits); char buf[ECON_CRED_STRLEN]; credits2str( buf, creditdifference, 2 ); land_errDialogueBuild( "You need %s more credits.", buf); failure = 1; } if (!can_swap( shipname )) failure = 1; return !failure; }
/** * @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 Makes sure it's sane to buy a ship. * @param shipname Ship being bought. */ int shipyard_canBuy ( char *shipname ) { Ship* ship; ship = ship_get( shipname ); int failure = 0; /* Must have enough credits and the necessary license. */ if (!player_hasLicense(ship->license)) { land_errDialogueBuild( "You lack the %s.", ship->license ); failure = 1; } if (!player_hasCredits( ship->price )) { char buf[ECON_CRED_STRLEN]; credits2str( buf, ship->price - player.p->credits, 2 ); land_errDialogueBuild( "You need %s more credits.", buf); failure = 1; } return !failure; }
/** * @brief Buys the selected commodity. * @param wid Window buying from. * @param str Unused. */ static void commodity_buy( unsigned int wid, char* str ) { (void)str; char *comname; Commodity *com; unsigned int q; credits_t price; HookParam hparam[3]; /* Get selected. */ q = commodity_getMod(); comname = toolkit_getList( wid, "lstGoods" ); com = commodity_get( comname ); price = planet_commodityPrice( land_planet, com ); price *= q; /* Check stuff. */ if (!player_hasCredits( price )) { dialogue_alert( "Insufficient credits!" ); return; } else if (pilot_cargoFree(player.p) <= 0) { dialogue_alert( "Insufficient free space!" ); return; } /* Make the buy. */ q = pilot_cargoAdd( player.p, com, q ); player_modCredits( -price ); land_checkAddRefuel(); commodity_update(wid, NULL); /* Run hooks. */ hparam[0].type = HOOK_PARAM_STRING; hparam[0].u.str = comname; hparam[1].type = HOOK_PARAM_NUMBER; hparam[1].u.num = q; hparam[2].type = HOOK_PARAM_SENTINEL; hooks_runParam( "comm_buy", hparam ); if (land_takeoff) takeoff(1); }
/** * @brief Makes sure it's sane to buy a ship. * @param shipname Ship being bought. */ int shipyard_canBuy ( char *shipname, Planet *planet ) { Ship* ship; ship = ship_get( shipname ); int failure = 0; credits_t price; price = ship_buyPrice(ship); /* Must have enough credits and the necessary license. */ if ((!player_hasLicense(ship->license)) && ((planet == NULL) || (!planet_isBlackMarket(planet)))) { land_errDialogueBuild( "You lack the %s.", ship->license ); failure = 1; } if (!player_hasCredits( price )) { char buf[ECON_CRED_STRLEN]; credits2str( buf, price - player.p->credits, 2 ); land_errDialogueBuild( "You need %s more credits.", buf); failure = 1; } return !failure; }
static int commodity_canBuy( char *name ) { int failure; unsigned int q, price; Commodity *com; char buf[ECON_CRED_STRLEN]; failure = 0; q = commodity_getMod(); com = commodity_get( name ); price = planet_commodityPrice( land_planet, com ) * q; if (!player_hasCredits( price )) { credits2str( buf, price - player.p->credits, 2 ); land_errDialogueBuild("You need %s more credits.", buf ); failure = 1; } if (pilot_cargoFree(player.p) <= 0) { land_errDialogueBuild("No cargo space available!"); failure = 1; } return !failure; }