/** * @brief Update storage, the market, and the player's credits * @note Don't update capacity here because we can sell items directly from aircraft (already removed from storage). */ static void BS_ProcessCraftItemSale (const objDef_t* craftitem, const int numItems) { if (craftitem) { BS_AddItemToMarket(craftitem, numItems); CP_UpdateCredits(ccs.credits + BS_GetItemSellingPrice(craftitem) * numItems); } }
/** * @brief Sells the given UGV with all the equipment. * @param robot The employee record of the UGV to sell * @return @c true if the ugv could get sold, @c false otherwise * @todo Implement this correctly once we have UGV */ bool BS_SellUGV (Employee* robot) { const objDef_t* ugvWeapon; const ugv_t* ugv; base_t* base; if (!robot) cgi->Com_Error(ERR_DROP, "Selling nullptr UGV!"); if (!robot->getUGV()) cgi->Com_Error(ERR_DROP, "Selling invalid UGV with UCN: %i", robot->chr.ucn); ugv = robot->getUGV(); base = robot->baseHired; /* Check if we have a weapon for this ugv in the market to sell it. */ ugvWeapon = INVSH_GetItemByID(ugv->weapon); if (!ugvWeapon) cgi->Com_Error(ERR_DROP, "BS_BuyItem_f: Could not get wepaon '%s' for ugv/tank '%s'.", ugv->weapon, ugv->id); if (!robot->unhire()) { /** @todo message - Couldn't fire employee. */ Com_DPrintf(DEBUG_CLIENT, "Couldn't sell/fire robot/ugv.\n"); return false; } BS_AddItemToMarket(ugvWeapon, 1); CP_UpdateCredits(ccs.credits + ugv->price); B_AddToStorage(base, ugvWeapon, -1); return true; }
/** * @brief Sell one item of a given type. * @sa BS_BuyItem_f * @sa BS_SellAircraft_f * @sa BS_BuyAircraft_f */ static void BS_SellItem_f (void) { int num; base_t *base = B_GetCurrentSelectedBase(); if (Cmd_Argc() < 2) { Com_Printf("Usage: %s <num>\n", Cmd_Argv(0)); return; } if (!base) return; if (buyCat == FILTER_AIRCRAFT) { Com_DPrintf(DEBUG_CLIENT, "BS_SellItem_f: Redirects to BS_SellAircraft_f\n"); BS_SellAircraft_f(); return; } num = atoi(Cmd_Argv(1)); if (num < 0 || num >= buyList.length) return; UI_ExecuteConfunc("buy_selectitem %i", num + buyList.scroll); { const objDef_t *item = BS_GetObjectDefition(&buyList.l[num + buyList.scroll]); /* don't sell more items than we have */ const int numItems = min(B_ItemInBase(item, base), BS_GetBuySellFactor()); /* Normal item (or equipment for UGVs/Robots if buyCategory==BUY_HEAVY) */ assert(item); currentSelectedMenuEntry = item; INV_ItemDescription(item); /* don't sell more items than we have */ if (numItems) { /* reinit the menu */ B_UpdateStorageAndCapacity(base, item, -numItems, qfalse); BS_AddItemToMarket(item, numItems); BS_BuyType(base); CP_UpdateCredits(ccs.credits + BS_GetItemSellingPrice(item) * numItems); BS_UpdateItem(base, num); } } }
/** * @brief Sells items from the market * @param[in] od pointer to the item (Object Definition record) * @param[out] base Base to sell at * @param[in ] count Number of items to sell * @return @c true if the ugv could get sold, @c false otherwise */ bool BS_SellItem (const objDef_t* od, base_t* base, int count) { if (!od) cgi->Com_Error(ERR_DROP, "BS_SellItem: Called on nullptr objDef!"); if (count <= 0) return false; if (!BS_IsOnMarket(od)) return false; if (base) { if (B_ItemInBase(od, base) < count) return false; B_AddToStorage(base, od, -count); } BS_AddItemToMarket(od, count); CP_UpdateCredits(ccs.credits + BS_GetItemSellingPrice(od) * count); return true; }
/** * @brief make number of items change every day. * @sa CP_CampaignRun * @sa daily called * @note This function makes items number on market slowly reach the asymptotic number of items defined in equipment.ufo * If an item has just been researched, it's not available on market until RESEARCH_LIMIT_DELAY days is reached. */ void CP_CampaignRunMarket (campaign_t* campaign) { int i; const float TYPICAL_TIME = 10.f; /**< Number of days to reach the asymptotic number of items */ const int RESEARCH_LIMIT_DELAY = 30; /**< Numbers of days after end of research to wait in order to have * items added on market */ market_t* market = BS_GetMarket(); assert(campaign->marketDef); assert(campaign->asymptoticMarketDef); for (i = 0; i < cgi->csi->numODs; i++) { const objDef_t* od = INVSH_GetItemByIDX(i); const technology_t* tech = RS_GetTechForItem(od); int asymptoticNumber; if (RS_IsResearched_ptr(tech) && (campaign->marketDef->numItems[i] != 0 || ccs.date.day > tech->researchedDate.day + RESEARCH_LIMIT_DELAY)) { /* if items are researched for more than RESEARCH_LIMIT_DELAY or was on the initial market, * there number tend to the value defined in equipment.ufo. * This value is the asymptotic value if it is not 0, or initial value else */ asymptoticNumber = campaign->asymptoticMarketDef->numItems[i] ? campaign->asymptoticMarketDef->numItems[i] : campaign->marketDef->numItems[i]; } else { /* items that have just been researched don't appear on market, but they can disappear */ asymptoticNumber = 0; } /* Store the evolution of the market in currentEvolution */ market->currentEvolutionItems[i] += (asymptoticNumber - market->numItems[i]) / TYPICAL_TIME; /* Check if new items appeared or disappeared on market */ if (fabs(market->currentEvolutionItems[i]) >= 1.0f) { const int num = (int)(market->currentEvolutionItems[i]); if (num >= 0) BS_AddItemToMarket(od, num); else BS_RemoveItemFromMarket(od, -num); market->currentEvolutionItems[i] -= num; } } for (i = 0; i < AIRCRAFTTYPE_MAX; i++) { const humanAircraftType_t type = (humanAircraftType_t)i; const char* aircraftID = cgi->Com_DropShipTypeToShortName(type); const aircraft_t* aircraft = AIR_GetAircraft(aircraftID); const technology_t* tech = aircraft->tech; int asymptoticNumber; if (RS_IsResearched_ptr(tech) && (campaign->marketDef->numAircraft[i] != 0 || ccs.date.day > tech->researchedDate.day + RESEARCH_LIMIT_DELAY)) { /* if aircraft is researched for more than RESEARCH_LIMIT_DELAY or was on the initial market, * there number tend to the value defined in equipment.ufo. * This value is the asymptotic value if it is not 0, or initial value else */ asymptoticNumber = campaign->asymptoticMarketDef->numAircraft[i] ? campaign->asymptoticMarketDef->numAircraft[i] : campaign->marketDef->numAircraft[i]; } else { /* items that have just been researched don't appear on market, but they can disappear */ asymptoticNumber = 0; } /* Store the evolution of the market in currentEvolution */ market->currentEvolutionAircraft[i] += (asymptoticNumber - market->numAircraft[i]) / TYPICAL_TIME; /* Check if new items appeared or disappeared on market */ if (fabs(market->currentEvolutionAircraft[i]) >= 1.0f) { const int num = (int)(market->currentEvolutionAircraft[i]); if (num >= 0) BS_AddAircraftToMarket(aircraft, num); else BS_RemoveAircraftFromMarket(aircraft, -num); market->currentEvolutionAircraft[i] -= num; } } }