* Increases the quantity of the selected item to buy by "change". * @param change How much we want to add. */
| 468 | * @param change How much we want to add. |
| 469 | */ |
| 470 | void 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; |
nothing calls this directly
no test coverage detected