MCPcopy Create free account
hub / github.com/OpenXcom/OpenXcom / increaseByValue

Method increaseByValue

src/Basescape/PurchaseState.cpp:470–531  ·  view source on GitHub ↗

* Increases the quantity of the selected item to buy by "change". * @param change How much we want to add. */

Source from the content-addressed store, hash-verified

468 * @param change How much we want to add.
469 */
470void PurchaseState::increaseByValue(int change)
471{
472 if (0 >= change) return;
473 if (_total + getPrice() > _game->getSavedGame()->getFunds())
474 {
475 _timerInc->stop();
476 _game->pushState(new ErrorMessageState(_game, "STR_NOT_ENOUGH_MONEY", _palette, Palette::blockOffset(15)+1, "BACK13.SCR", 0));
477 }
478 else if (_sel <= 2 && _pQty + 1 > _base->getAvailableQuarters() - _base->getUsedQuarters())
479 {
480 _timerInc->stop();
481 _game->pushState(new ErrorMessageState(_game, "STR_NOT_ENOUGH_LIVING_SPACE", _palette, Palette::blockOffset(15)+1, "BACK13.SCR", 0));
482 }
483 else if (_sel >= 3 && _sel < 3 + _crafts.size() && _cQty + 1 > _base->getAvailableHangars() - _base->getUsedHangars())
484 {
485 _timerInc->stop();
486 _game->pushState(new ErrorMessageState(_game, "STR_NO_FREE_HANGARS_FOR_PURCHASE", _palette, Palette::blockOffset(15)+1, "BACK13.SCR", 0));
487 }
488 else if (_sel >= 3 + _crafts.size()
489 && _iQty + _game->getRuleset()->getItem(_items[_sel - 3 - _crafts.size()])->getSize() > _base->getAvailableStores() - _base->getUsedStores())
490 {
491 _timerInc->stop();
492 _game->pushState(new ErrorMessageState(_game, "STR_NOT_ENOUGH_STORE_SPACE", _palette, Palette::blockOffset(15)+1, "BACK13.SCR", 0));
493 }
494 else
495 {
496 int maxByMoney = (_game->getSavedGame()->getFunds() - _total) / getPrice();
497 change = std::min(maxByMoney, change);
498 if (_sel <= 2)
499 {
500 // Personnel count
501 int maxByQuarters = _base->getAvailableQuarters() - _base->getUsedQuarters() - _pQty;
502 change = std::min(maxByQuarters, change);
503 _pQty += change;
504 }
505 else if (_sel >= 3 && _sel < 3 + _crafts.size())
506 {
507 // Craft count
508 int maxByHangars = _base->getAvailableHangars() - _base->getUsedHangars() - _cQty;
509 change = std::min(maxByHangars, change);
510 _cQty += change;
511 }
512 else
513 {
514 RuleItem *rule = _game->getRuleset()->getItem(_items[_sel - 3 - _crafts.size()]);
515
516 // Item count
517 double storesNeededPerItem = rule->getSize();
518 double freeStores = _base->getAvailableStores() - _base->getUsedStores() - _iQty;
519 double maxByStores = DBL_MAX;
520 if (!AreSame(storesNeededPerItem, 0.0))
521 {
522 maxByStores = (freeStores + 0.05) / storesNeededPerItem;
523 }
524 change = std::min((int)maxByStores, change);
525 _iQty += change * storesNeededPerItem;
526 }
527 _qtys[_sel] += change;

Callers

nothing calls this directly

Calls 14

AreSameFunction · 0.85
getFundsMethod · 0.80
getSavedGameMethod · 0.80
pushStateMethod · 0.80
getAvailableQuartersMethod · 0.80
getUsedQuartersMethod · 0.80
getAvailableHangarsMethod · 0.80
getUsedHangarsMethod · 0.80
getAvailableStoresMethod · 0.80
getUsedStoresMethod · 0.80
stopMethod · 0.45
getSizeMethod · 0.45

Tested by

no test coverage detected