/** * Shows the Select Armor window. * @param action Pointer to an action. */ void CraftArmorState::lstSoldiersClick(Action *action) { Soldier *s = _base->getSoldiers()->at(_lstSoldiers->getSelectedRow()); if (!(s->getCraft() && s->getCraft()->getStatus() == "STR_OUT")) { if (action->getDetails()->button.button == SDL_BUTTON_LEFT) { _game->pushState(new SoldierArmorState(_base, _lstSoldiers->getSelectedRow())); } else { if (_game->getSavedGame()->getMonthsPassed() != -1) { SavedGame *_save; _save = _game->getSavedGame(); Armor *a = _game->getRuleset()->getArmor(_save->getLastSelectedArmor()); if (_base->getItems()->getItem(a->getStoreItem()) > 0 || a->getStoreItem() == "STR_NONE") { if (s->getArmor()->getStoreItem() != "STR_NONE") { _base->getItems()->addItem(s->getArmor()->getStoreItem()); } if (a->getStoreItem() != "STR_NONE") { _base->getItems()->removeItem(a->getStoreItem()); } s->setArmor(a); _lstSoldiers->setCellText(_lstSoldiers->getSelectedRow(), 2, tr(a->getType())); } } } } }
/** * Shows the Select Armor window. * @param action Pointer to an action. */ void CraftArmorState::lstSoldiersClick(Action *action) { Soldier *s = _base->getSoldiers()->at(_lstSoldiers->getSelectedRow()); if (!(s->getCraft() && s->getCraft()->getStatus() == "STR_OUT")) { if (action->getDetails()->button.button == SDL_BUTTON_LEFT) { _game->pushState(new SoldierArmorState(_base, _lstSoldiers->getSelectedRow())); } else if (action->getDetails()->button.button == SDL_BUTTON_RIGHT) { SavedGame *save; save = _game->getSavedGame(); Armor *a = _game->getMod()->getArmor(save->getLastSelectedArmor()); if (a && (a->getUnits().empty() || std::find(a->getUnits().begin(), a->getUnits().end(), s->getRules()->getType()) != a->getUnits().end())) { if (save->getMonthsPassed() != -1) { if (_base->getStorageItems()->getItem(a->getStoreItem()) > 0 || a->getStoreItem() == Armor::NONE) { if (s->getArmor()->getStoreItem() != Armor::NONE) { _base->getStorageItems()->addItem(s->getArmor()->getStoreItem()); } if (a->getStoreItem() != Armor::NONE) { _base->getStorageItems()->removeItem(a->getStoreItem()); } s->setArmor(a); _lstSoldiers->setCellText(_lstSoldiers->getSelectedRow(), 2, tr(a->getType())); } } else { s->setArmor(a); _lstSoldiers->setCellText(_lstSoldiers->getSelectedRow(), 2, tr(a->getType())); } } } } }
/** * Initializes all the elements in the Soldier Armor window. * @param game Pointer to the core game. * @param base Pointer to the base to get info from. * @param soldier ID of the selected soldier. */ SoldierArmorState::SoldierArmorState(Game *game, Base *base, size_t soldier) : State(game), _base(base), _soldier(soldier) { _screen = false; // Create objects _window = new Window(this, 192, 120, 64, 40, POPUP_BOTH); _btnCancel = new TextButton(140, 16, 90, 136); _txtTitle = new Text(182, 9, 69, 48); _txtSoldier = new Text(182, 9, 69, 56); _txtType = new Text(90, 9, 80, 72); _txtQuantity = new Text(70, 9, 177, 72); _lstArmor = new TextList(160, 48, 73, 88); // Set palette _game->setPalette(_game->getResourcePack()->getPalette("BACKPALS.DAT")->getColors(Palette::blockOffset(4)), Palette::backPos, 16); add(_window); add(_btnCancel); add(_txtTitle); add(_txtSoldier); add(_txtType); add(_txtQuantity); add(_lstArmor); centerAllSurfaces(); // Set up objects _window->setColor(Palette::blockOffset(13)+10); _window->setBackground(_game->getResourcePack()->getSurface("BACK14.SCR")); _btnCancel->setColor(Palette::blockOffset(13)+5); _btnCancel->setText(_game->getLanguage()->getString("STR_CANCEL_UC")); _btnCancel->onMouseClick((ActionHandler)&SoldierArmorState::btnCancelClick); _btnCancel->onKeyboardPress((ActionHandler)&SoldierArmorState::btnCancelClick, (SDLKey)Options::getInt("keyCancel")); _txtTitle->setColor(Palette::blockOffset(13)+5); _txtTitle->setAlign(ALIGN_CENTER); _txtTitle->setText(_game->getLanguage()->getString("STR_SELECT_ARMOR_FOR")); _txtSoldier->setColor(Palette::blockOffset(13)+5); _txtSoldier->setAlign(ALIGN_CENTER); Soldier *s = _base->getSoldiers()->at(_soldier); _txtSoldier->setText(s->getName()); _txtType->setColor(Palette::blockOffset(13)+5); _txtType->setText(_game->getLanguage()->getString("STR_TYPE")); _txtQuantity->setColor(Palette::blockOffset(13)+5); _txtQuantity->setText(_game->getLanguage()->getString("STR_QUANTITY_UC")); _lstArmor->setColor(Palette::blockOffset(13)); _lstArmor->setArrowColor(Palette::blockOffset(13)+5); _lstArmor->setColumns(2, 112, 41); _lstArmor->setSelectable(true); _lstArmor->setBackground(_window); _lstArmor->setMargin(8); const std::vector<std::string> &armors = _game->getRuleset()->getArmorsList(); for (std::vector<std::string>::const_iterator i = armors.begin(); i != armors.end(); ++i) { Armor *a = _game->getRuleset()->getArmor(*i); if (_base->getItems()->getItem(a->getStoreItem()) > 0) { _armors.push_back(a); std::wstringstream ss; ss << _base->getItems()->getItem(a->getStoreItem()); _lstArmor->addRow(2, _game->getLanguage()->getString(a->getType()).c_str(), ss.str().c_str()); } else if (a->getStoreItem() == "STR_NONE") { _armors.push_back(a); _lstArmor->addRow(1, _game->getLanguage()->getString(a->getType()).c_str()); } } _lstArmor->onMouseClick((ActionHandler)&SoldierArmorState::lstArmorClick); }
/** * Initializes all the elements in the Soldier Armor window. * @param game Pointer to the core game. * @param base Pointer to the base to get info from. * @param soldier ID of the selected soldier. */ SoldierArmorState::SoldierArmorState(Base *base, size_t soldier) : _base(base), _soldier(soldier) { _screen = false; // Create objects _window = new Window(this, 192, 120, 64, 40, POPUP_BOTH); _btnCancel = new TextButton(140, 16, 90, 136); _txtTitle = new Text(182, 16, 69, 48); _txtType = new Text(90, 9, 80, 72); _txtQuantity = new Text(70, 9, 177, 72); _lstArmor = new TextList(160, 40, 73, 88); // Set palette setPalette("PAL_BASESCAPE", _game->getRuleset()->getInterface("soldierArmor")->getElement("palette")->color); add(_window, "window", "soldierArmor"); add(_btnCancel, "button", "soldierArmor"); add(_txtTitle, "text", "soldierArmor"); add(_txtType, "text", "soldierArmor"); add(_txtQuantity, "text", "soldierArmor"); add(_lstArmor, "list", "soldierArmor"); centerAllSurfaces(); // Set up objects _window->setBackground(_game->getResourcePack()->getSurface("BACK14.SCR")); _btnCancel->setText(tr("STR_CANCEL_UC")); _btnCancel->onMouseClick((ActionHandler)&SoldierArmorState::btnCancelClick); _btnCancel->onKeyboardPress((ActionHandler)&SoldierArmorState::btnCancelClick, Options::keyCancel); Soldier *s = _base->getSoldiers()->at(_soldier); _txtTitle->setAlign(ALIGN_CENTER); _txtTitle->setText(tr("STR_SELECT_ARMOR_FOR_SOLDIER").arg(s->getName())); _txtType->setText(tr("STR_TYPE")); _txtQuantity->setText(tr("STR_QUANTITY_UC")); _lstArmor->setColumns(2, 112, 41); _lstArmor->setSelectable(true); _lstArmor->setBackground(_window); _lstArmor->setMargin(8); const std::vector<std::string> &armors = _game->getRuleset()->getArmorsList(); for (std::vector<std::string>::const_iterator i = armors.begin(); i != armors.end(); ++i) { Armor *a = _game->getRuleset()->getArmor(*i); if (_base->getItems()->getItem(a->getStoreItem()) > 0) { _armors.push_back(a); std::wostringstream ss; if (_game->getSavedGame()->getMonthsPassed() > -1) { ss << _base->getItems()->getItem(a->getStoreItem()); } else { ss << "-"; } _lstArmor->addRow(2, tr(a->getType()).c_str(), ss.str().c_str()); } else if (a->getStoreItem() == "STR_NONE") { _armors.push_back(a); _lstArmor->addRow(1, tr(a->getType()).c_str()); } } _lstArmor->onMouseClick((ActionHandler)&SoldierArmorState::lstArmorClick); }
/** * Initializes all the elements in the Sell/Sack screen. * @param game Pointer to the core game. * @param base Pointer to the base to get info from. * @param origin Game section that originated this state. */ SellState::SellState(Base *base, OptionsOrigin origin) : _base(base), _sel(0), _total(0), _spaceChange(0), _origin(origin) { bool overfull = Options::storageLimitsEnforced && _base->storesOverfull(); // Create objects _window = new Window(this, 320, 200, 0, 0); _btnOk = new TextButton(overfull? 288:148, 16, overfull? 16:8, 176); _btnCancel = new TextButton(148, 16, 164, 176); _txtTitle = new Text(310, 17, 5, 8); _txtSales = new Text(150, 9, 10, 24); _txtFunds = new Text(150, 9, 160, 24); _txtSpaceUsed = new Text(150, 9, 160, 34); _txtQuantity = new Text(54, 9, 136, 44); _txtSell = new Text(96, 9, 190, 44); _txtValue = new Text(40, 9, 270, 44); _cbxCategory = new ComboBox(this, 120, 16, 10, 36); _lstItems = new TextList(287, 120, 8, 54); // Set palette setInterface("sellMenu"); _ammoColor = _game->getMod()->getInterface("sellMenu")->getElement("ammoColor")->color; add(_window, "window", "sellMenu"); add(_btnOk, "button", "sellMenu"); add(_btnCancel, "button", "sellMenu"); add(_txtTitle, "text", "sellMenu"); add(_txtSales, "text", "sellMenu"); add(_txtFunds, "text", "sellMenu"); add(_txtSpaceUsed, "text", "sellMenu"); add(_txtQuantity, "text", "sellMenu"); add(_txtSell, "text", "sellMenu"); add(_txtValue, "text", "sellMenu"); add(_lstItems, "list", "sellMenu"); add(_cbxCategory, "text", "sellMenu"); centerAllSurfaces(); // Set up objects _window->setBackground(_game->getMod()->getSurface("BACK13.SCR")); _btnOk->setText(tr("STR_SELL_SACK")); _btnOk->onMouseClick((ActionHandler)&SellState::btnOkClick); _btnOk->onKeyboardPress((ActionHandler)&SellState::btnOkClick, Options::keyOk); _btnCancel->setText(tr("STR_CANCEL")); _btnCancel->onMouseClick((ActionHandler)&SellState::btnCancelClick); _btnCancel->onKeyboardPress((ActionHandler)&SellState::btnCancelClick, Options::keyCancel); if (overfull) { _btnCancel->setVisible(false); _btnOk->setVisible(false); } _txtTitle->setBig(); _txtTitle->setAlign(ALIGN_CENTER); _txtTitle->setText(tr("STR_SELL_ITEMS_SACK_PERSONNEL")); _txtSales->setText(tr("STR_VALUE_OF_SALES").arg(Unicode::formatFunding(_total))); _txtFunds->setText(tr("STR_FUNDS").arg(Unicode::formatFunding(_game->getSavedGame()->getFunds()))); _txtSpaceUsed->setVisible(Options::storageLimitsEnforced); std::ostringstream ss; ss << _base->getUsedStores() << ":" << _base->getAvailableStores(); _txtSpaceUsed->setText(ss.str()); _txtSpaceUsed->setText(tr("STR_SPACE_USED").arg(ss.str())); _txtQuantity->setText(tr("STR_QUANTITY_UC")); _txtSell->setText(tr("STR_SELL_SACK")); _txtValue->setText(tr("STR_VALUE")); _lstItems->setArrowColumn(182, ARROW_VERTICAL); _lstItems->setColumns(4, 156, 54, 24, 53); _lstItems->setSelectable(true); _lstItems->setBackground(_window); _lstItems->setMargin(2); _lstItems->onLeftArrowPress((ActionHandler)&SellState::lstItemsLeftArrowPress); _lstItems->onLeftArrowRelease((ActionHandler)&SellState::lstItemsLeftArrowRelease); _lstItems->onLeftArrowClick((ActionHandler)&SellState::lstItemsLeftArrowClick); _lstItems->onRightArrowPress((ActionHandler)&SellState::lstItemsRightArrowPress); _lstItems->onRightArrowRelease((ActionHandler)&SellState::lstItemsRightArrowRelease); _lstItems->onRightArrowClick((ActionHandler)&SellState::lstItemsRightArrowClick); _lstItems->onMousePress((ActionHandler)&SellState::lstItemsMousePress); _cats.push_back("STR_ALL_ITEMS"); const std::vector<std::string> &cw = _game->getMod()->getCraftWeaponsList(); for (std::vector<std::string>::const_iterator i = cw.begin(); i != cw.end(); ++i) { RuleCraftWeapon *rule = _game->getMod()->getCraftWeapon(*i); _craftWeapons.insert(rule->getLauncherItem()); _craftWeapons.insert(rule->getClipItem()); } const std::vector<std::string> &ar = _game->getMod()->getArmorsList(); for (std::vector<std::string>::const_iterator i = ar.begin(); i != ar.end(); ++i) { Armor *rule = _game->getMod()->getArmor(*i); _armors.insert(rule->getStoreItem()); } for (std::vector<Soldier*>::iterator i = _base->getSoldiers()->begin(); i != _base->getSoldiers()->end(); ++i) { if ((*i)->getCraft() == 0) { TransferRow row = { TRANSFER_SOLDIER, (*i), (*i)->getName(true), 0, 1, 0, 0 }; _items.push_back(row); std::string cat = getCategory(_items.size() - 1); if (std::find(_cats.begin(), _cats.end(), cat) == _cats.end()) { _cats.push_back(cat); } } } for (std::vector<Craft*>::iterator i = _base->getCrafts()->begin(); i != _base->getCrafts()->end(); ++i) { if ((*i)->getStatus() != "STR_OUT") { TransferRow row = { TRANSFER_CRAFT, (*i), (*i)->getName(_game->getLanguage()), (*i)->getRules()->getSellCost(), 1, 0, 0 }; _items.push_back(row); std::string cat = getCategory(_items.size() - 1); if (std::find(_cats.begin(), _cats.end(), cat) == _cats.end()) { _cats.push_back(cat); } } } if (_base->getAvailableScientists() > 0) { TransferRow row = { TRANSFER_SCIENTIST, 0, tr("STR_SCIENTIST"), 0, _base->getAvailableScientists(), 0, 0 }; _items.push_back(row); std::string cat = getCategory(_items.size() - 1); if (std::find(_cats.begin(), _cats.end(), cat) == _cats.end()) { _cats.push_back(cat); } } if (_base->getAvailableEngineers() > 0) { TransferRow row = { TRANSFER_ENGINEER, 0, tr("STR_ENGINEER"), 0, _base->getAvailableEngineers(), 0, 0 }; _items.push_back(row); std::string cat = getCategory(_items.size() - 1); if (std::find(_cats.begin(), _cats.end(), cat) == _cats.end()) { _cats.push_back(cat); } } const std::vector<std::string> &items = _game->getMod()->getItemsList(); for (std::vector<std::string>::const_iterator i = items.begin(); i != items.end(); ++i) { int qty = _base->getStorageItems()->getItem(*i); if (Options::storageLimitsEnforced && _origin == OPT_BATTLESCAPE) { for (std::vector<Transfer*>::iterator j = _base->getTransfers()->begin(); j != _base->getTransfers()->end(); ++j) { if ((*j)->getItems() == *i) { qty += (*j)->getQuantity(); } } for (std::vector<Craft*>::iterator j = _base->getCrafts()->begin(); j != _base->getCrafts()->end(); ++j) { qty += (*j)->getItems()->getItem(*i); } } RuleItem *rule = _game->getMod()->getItem(*i, true); if (qty > 0 && (Options::canSellLiveAliens || !rule->isAlien())) { TransferRow row = { TRANSFER_ITEM, rule, tr(*i), rule->getSellCost(), qty, 0, 0 }; _items.push_back(row); std::string cat = getCategory(_items.size() - 1); if (std::find(_cats.begin(), _cats.end(), cat) == _cats.end()) { _cats.push_back(cat); } } } _cbxCategory->setOptions(_cats, true); _cbxCategory->onChange((ActionHandler)&SellState::cbxCategoryChange); updateList(); _timerInc = new Timer(250); _timerInc->onTimer((StateHandler)&SellState::increase); _timerDec = new Timer(250); _timerDec->onTimer((StateHandler)&SellState::decrease); }