/** * Moves all the items to the base on right-click. * @param action Pointer to an action. */ void CraftEquipmentState::lstEquipmentLeftArrowClick(Action *action) { if (action->getDetails()->button.button == SDL_BUTTON_RIGHT) { Craft *c = _base->getCrafts()->at(_craft); RuleItem *item = _game->getRuleset()->getItem(_items[_sel]); int cQty = 0; if (item->isFixed()) { cQty = c->getVehicleCount(_items[_sel]); if (cQty > 0) { while (cQty > 0) { RuleItem *ammo = _game->getRuleset()->getItem(item->getCompatibleAmmo()->front()); for (std::vector<Vehicle*>::iterator i = c->getVehicles()->begin(); i != c->getVehicles()->end(); ++i) { if ((*i)->getRules() == item) { _base->getItems()->addItem(ammo->getType(), (*i)->getAmmo()); delete (*i); c->getVehicles()->erase(i); break; } } _base->getItems()->addItem(_items[_sel]); cQty = c->getVehicleCount(_items[_sel]); } updateQuantity(); } } else { cQty = c->getItems()->getItem(_items[_sel]); if (cQty > 0) { _base->getItems()->addItem(_items[_sel], cQty); c->getItems()->removeItem(_items[_sel], cQty); updateQuantity(); } } } }
/** * Moves the selected item to the craft. */ void CraftEquipmentState::moveRight() { Craft *c = _base->getCrafts()->at(_craft); if (_base->getItems()->getItem(_items[_sel]) > 0) { _base->getItems()->removeItem(_items[_sel]); c->getItems()->addItem(_items[_sel]); updateQuantity(); } }
/** * Moves the selected item to the base. */ void CraftEquipmentState::moveLeft() { Craft *c = _base->getCrafts()->at(_craft); RuleItem *item = _game->getRuleset()->getItem(_items[_sel]); int cQty = 0; if (item->isFixed()) { cQty = c->getVehicleCount(_items[_sel]); } else { cQty = c->getItems()->getItem(_items[_sel]); } if (cQty > 0) { RuleItem *item = _game->getRuleset()->getItem(_items[_sel]); // Convert vehicle to item if (item->isFixed()) { RuleItem *ammo = _game->getRuleset()->getItem(item->getCompatibleAmmo()->front()); for (std::vector<Vehicle*>::iterator i = c->getVehicles()->begin(); i != c->getVehicles()->end(); ++i) { if ((*i)->getRules() == item) { _base->getItems()->addItem(ammo->getType(), (*i)->getAmmo()); delete (*i); c->getVehicles()->erase(i); break; } } _base->getItems()->addItem(_items[_sel]); } else { _base->getItems()->addItem(_items[_sel]); c->getItems()->removeItem(_items[_sel]); } updateQuantity(); } }
/** * Updates the displayed quantities of the * selected item on the list. */ void CraftEquipmentState::updateQuantity() { Craft *c = _base->getCrafts()->at(_craft); RuleItem *item = _game->getRuleset()->getItem(_items[_sel]); int cQty = 0; if (item->isFixed()) { cQty = c->getVehicleCount(_items[_sel]); } else { cQty = c->getItems()->getItem(_items[_sel]); } std::wstringstream ss, ss2; if (_game->getSavedGame()->getMonthsPassed() > -1) { ss << _base->getItems()->getItem(_items[_sel]); } else { ss << "-"; } ss2 << cQty; Uint8 color; if (cQty == 0) { RuleItem *rule = _game->getRuleset()->getItem(_items[_sel]); if (rule->getBattleType() == BT_AMMO) { color = Palette::blockOffset(15)+6; } else { color = Palette::blockOffset(13)+10; } } else { color = Palette::blockOffset(13); } _lstEquipment->setRowColor(_sel, color); _lstEquipment->setCellText(_sel, 1, ss.str()); _lstEquipment->setCellText(_sel, 2, ss2.str()); std::wstringstream ss3; ss3 << tr("STR_SPACE_AVAILABLE") << L'\x01' << c->getSpaceAvailable(); _txtAvailable->setText(ss3.str()); std::wstringstream ss4; ss4 << tr("STR_SPACE_USED") << L'\x01' << c->getSpaceUsed(); _txtUsed->setText(ss4.str()); }
/** * Updates the displayed quantities of the * selected item on the list. */ void CraftEquipmentState::updateQuantity() { Craft *c = _base->getCrafts()->at(_craft); RuleItem *item = _game->getMod()->getItem(_items[_sel]); int cQty = 0; if (item->isFixed()) { cQty = c->getVehicleCount(_items[_sel]); } else { cQty = c->getItems()->getItem(_items[_sel]); } std::wostringstream ss, ss2; if (_game->getSavedGame()->getMonthsPassed() > -1) { ss << _base->getStorageItems()->getItem(_items[_sel]); } else { ss << "-"; } ss2 << cQty; Uint8 color; if (cQty == 0) { RuleItem *rule = _game->getMod()->getItem(_items[_sel]); if (rule->getBattleType() == BT_AMMO) { color = _ammoColor; } else { color = _lstEquipment->getColor(); } } else { color = _lstEquipment->getSecondaryColor(); } _lstEquipment->setRowColor(_sel, color); _lstEquipment->setCellText(_sel, 1, ss.str()); _lstEquipment->setCellText(_sel, 2, ss2.str()); _txtAvailable->setText(tr("STR_SPACE_AVAILABLE").arg(c->getSpaceAvailable())); _txtUsed->setText(tr("STR_SPACE_USED").arg(c->getSpaceUsed())); }
/** * Moves all the items (as much as possible) to the craft on right-click. * @param action Pointer to an action. */ void CraftEquipmentState::lstEquipmentRightArrowClick(Action *action) { if (action->getDetails()->button.button == SDL_BUTTON_RIGHT) { Craft *c = _base->getCrafts()->at(_craft); RuleItem *item = _game->getRuleset()->getItem(_items[_sel]); int bqty = _base->getItems()->getItem(_items[_sel]); if (bqty > 0) { // Do we need to convert item to vehicle? if (item->isFixed()) { // Check if there's enough room int room = std::min(c->getRules()->getVehicles() - c->getNumVehicles(), c->getSpaceAvailable() / 4); if (room > 0) { RuleItem *ammo = _game->getRuleset()->getItem(item->getCompatibleAmmo()->front()); int baqty = _base->getItems()->getItem(ammo->getType()); int vehiclesCount = std::min(std::min(bqty, room), baqty); if (vehiclesCount > 0) { int newAmmoPerVehicle = std::min(baqty / vehiclesCount, ammo->getClipSize());; int remainder = baqty - (vehiclesCount * newAmmoPerVehicle); if (ammo->getClipSize() == newAmmoPerVehicle) remainder = 0; int newAmmo; for (int i=0; i < vehiclesCount; ++i) { newAmmo = newAmmoPerVehicle; if (i<remainder) ++newAmmo; c->getVehicles()->push_back(new Vehicle(item, newAmmo)); _base->getItems()->removeItem(ammo->getType(), newAmmo); _base->getItems()->removeItem(_items[_sel]); } } } } else { _base->getItems()->removeItem(_items[_sel],bqty); c->getItems()->addItem(_items[_sel],bqty); } updateQuantity(); } } }
/** * Moves the selected item to the craft. */ void CraftEquipmentState::moveRight() { Craft *c = _base->getCrafts()->at(_craft); RuleItem *item = _game->getRuleset()->getItem(_items[_sel]); if (_base->getItems()->getItem(_items[_sel]) > 0) { // Convert item to vehicle if (item->isFixed()) { // Check if there's enough room if (c->getNumVehicles() < c->getRules()->getVehicles() && c->getSpaceAvailable() >= 4) { RuleItem *ammo = _game->getRuleset()->getItem(item->getCompatibleAmmo()->front()); int qty = _base->getItems()->getItem(ammo->getType()); if (qty == 0) { std::wstringstream ss; ss << _game->getLanguage()->getString("STR_NOT_ENOUGH"); ss << _game->getLanguage()->getString(ammo->getType()); ss << _game->getLanguage()->getString("STR_TO_ARM_HWP"); _game->pushState(new ErrorMessageState(_game, ss.str(), Palette::blockOffset(15)+1, "BACK04.SCR", 2)); _timerRight->stop(); } else { int newAmmo = std::min(qty, ammo->getClipSize()); c->getVehicles()->push_back(new Vehicle(item, newAmmo)); _base->getItems()->removeItem(ammo->getType(), newAmmo); _base->getItems()->removeItem(_items[_sel]); } } } else { _base->getItems()->removeItem(_items[_sel]); c->getItems()->addItem(_items[_sel]); } updateQuantity(); } }
/** * Initializes all the elements in the Craft Equipment screen. * @param game Pointer to the core game. * @param base Pointer to the base to get info from. * @param craft ID of the selected craft. */ CraftEquipmentState::CraftEquipmentState(Game *game, Base *base, size_t craft) : State(game), _sel(0), _base(base), _craft(craft) { bool allowChangeListValuesByMouseWheel=Options::getBool("allowChangeListValuesByMouseWheel"); _changeValueByMouseWheel = Options::getInt("changeValueByMouseWheel"); // Create objects _window = new Window(this, 320, 200, 0, 0); _btnOk = new TextButton(288, 16, 16, 176); _txtTitle = new Text(300, 16, 16, 7); _txtItem = new Text(144, 9, 16, 32); _txtStores = new Text(150, 9, 160, 32); _txtAvailable = new Text(110, 9, 16, 24); _txtUsed = new Text(110, 9, 130, 24); _txtCrew = new Text(71, 9, 244, 24); _lstEquipment = new TextList(288, 128, 8, 40); // Set palette _game->setPalette(_game->getResourcePack()->getPalette("BACKPALS.DAT")->getColors(Palette::blockOffset(2)), Palette::backPos, 16); add(_window); add(_btnOk); add(_txtTitle); add(_txtItem); add(_txtStores); add(_txtAvailable); add(_txtUsed); add(_txtCrew); add(_lstEquipment); // Set up objects _window->setColor(Palette::blockOffset(15)+1); _window->setBackground(_game->getResourcePack()->getSurface("BACK04.SCR")); _btnOk->setColor(Palette::blockOffset(15)+1); _btnOk->setText(_game->getLanguage()->getString("STR_OK")); _btnOk->onMouseClick((ActionHandler)&CraftEquipmentState::btnOkClick); _txtTitle->setColor(Palette::blockOffset(15)+1); _txtTitle->setBig(); Craft *c = _base->getCrafts()->at(_craft); _txtTitle->setText(tr("STR_EQUIPMENT_FOR_craftname").arg(c->getName(_game->getLanguage()))); _txtItem->setColor(Palette::blockOffset(15)+1); _txtItem->setText(_game->getLanguage()->getString("STR_ITEM")); _txtStores->setColor(Palette::blockOffset(15)+1); _txtStores->setText(_game->getLanguage()->getString("STR_STORES")); _txtAvailable->setColor(Palette::blockOffset(15)+1); _txtAvailable->setSecondaryColor(Palette::blockOffset(13)); std::wstringstream ss; ss << _game->getLanguage()->getString("STR_SPACE_AVAILABLE") << L'\x01'<< c->getSpaceAvailable(); _txtAvailable->setText(ss.str()); _txtUsed->setColor(Palette::blockOffset(15)+1); _txtUsed->setSecondaryColor(Palette::blockOffset(13)); std::wstringstream ss2; ss2 << _game->getLanguage()->getString("STR_SPACE_USED") << L'\x01'<< c->getSpaceUsed(); _txtUsed->setText(ss2.str()); _txtCrew->setColor(Palette::blockOffset(15)+1); _txtCrew->setSecondaryColor(Palette::blockOffset(13)); std::wstringstream ss3; ss3 << _game->getLanguage()->getString("STR_SOLDIERS_UC") << ">" << L'\x01'<< c->getNumSoldiers(); _txtCrew->setText(ss3.str()); _lstEquipment->setColor(Palette::blockOffset(13)+10); _lstEquipment->setArrowColor(Palette::blockOffset(15)+1); _lstEquipment->setArrowColumn(203, ARROW_HORIZONTAL); _lstEquipment->setColumns(3, 154, 85, 41); _lstEquipment->setSelectable(true); _lstEquipment->setBackground(_window); _lstEquipment->setMargin(8); if (allowChangeListValuesByMouseWheel) _lstEquipment->setAllowScrollOnArrowButtons(false); _lstEquipment->onLeftArrowPress((ActionHandler)&CraftEquipmentState::lstEquipmentLeftArrowPress); _lstEquipment->onLeftArrowRelease((ActionHandler)&CraftEquipmentState::lstEquipmentLeftArrowRelease); _lstEquipment->onLeftArrowClick((ActionHandler)&CraftEquipmentState::lstEquipmentLeftArrowClick); _lstEquipment->onRightArrowPress((ActionHandler)&CraftEquipmentState::lstEquipmentRightArrowPress); _lstEquipment->onRightArrowRelease((ActionHandler)&CraftEquipmentState::lstEquipmentRightArrowRelease); _lstEquipment->onRightArrowClick((ActionHandler)&CraftEquipmentState::lstEquipmentRightArrowClick); if (allowChangeListValuesByMouseWheel) _lstEquipment->onMousePress((ActionHandler)&CraftEquipmentState::lstEquipmentMousePress); int row = 0; const std::vector<std::string> &items = _game->getRuleset()->getItemsList(); for (std::vector<std::string>::const_iterator i = items.begin(); i != items.end(); ++i) { // CHEAP HACK TO HIDE HWP AMMO if ((*i).substr(0, 8) == "STR_HWP_") continue; RuleItem *rule = _game->getRuleset()->getItem(*i); int cQty = 0; if (rule->isFixed()) { cQty = c->getVehicleCount(*i); } else { cQty = c->getItems()->getItem(*i); } if (rule->getBigSprite() > -1 && rule->getBattleType() != BT_NONE && rule->getBattleType() != BT_CORPSE && _game->getSavedGame()->isResearched(rule->getRequirements()) && (_base->getItems()->getItem(*i) > 0 || cQty > 0)) { _items.push_back(*i); std::wstringstream ss, ss2; ss << _base->getItems()->getItem(*i); ss2 << cQty; std::wstring s = _game->getLanguage()->getString(*i); if (rule->getBattleType() == BT_AMMO) { s.insert(0, L" "); } _lstEquipment->addRow(3, s.c_str(), ss.str().c_str(), ss2.str().c_str()); Uint8 color; if (cQty == 0) { if (rule->getBattleType() == BT_AMMO) { color = Palette::blockOffset(15)+6; } else { color = Palette::blockOffset(13)+10; } } else { color = Palette::blockOffset(13); } _lstEquipment->setRowColor(row, color); ++row; } } _timerLeft = new Timer(50); _timerLeft->onTimer((StateHandler)&CraftEquipmentState::moveLeft); _timerRight = new Timer(50); _timerRight->onTimer((StateHandler)&CraftEquipmentState::moveRight); }
/** * Moves the given number of items (selected) to the craft. */ void CraftEquipmentState::moveRight(int change) { Craft *c = _base->getCrafts()->at(_craft); RuleItem *item = _game->getRuleset()->getItem(_items[_sel]); int bqty = _base->getItems()->getItem(_items[_sel]); if (0 >= change || 0 >= bqty) return; change = std::min(bqty, change); // Do we need to convert item to vehicle? if (item->isFixed()) { // Check if there's enough room int room = std::min(c->getRules()->getVehicles() - c->getNumVehicles(), c->getSpaceAvailable() / 4); if (room > 0) { change = std::min(room, change); if(item->getClipSize() != -1) { // We want to redistribute all the available ammo among the vehicles, // so first we note the total number of vehicles we want in the craft int oldVehiclesCount = c->getVehicleCount(_items[_sel]); int newVehiclesCount = oldVehiclesCount + change; // ...and we move back all of this vehicle-type to the base. if (0 < oldVehiclesCount) moveLeft(INT_MAX); // And now let's see if we can add the total number of vehicles. RuleItem *ammo = _game->getRuleset()->getItem(item->getCompatibleAmmo()->front()); int baqty = _base->getItems()->getItem(ammo->getType()); // Ammo Quantity for this vehicle-type on the base int canBeAdded = std::min(newVehiclesCount, baqty); if (canBeAdded > 0) { int newAmmoPerVehicle = std::min(baqty / canBeAdded, ammo->getClipSize());; int remainder = 0; if (ammo->getClipSize() > newAmmoPerVehicle) remainder = baqty - (canBeAdded * newAmmoPerVehicle); int newAmmo; for (int i=0; i < canBeAdded; ++i) { newAmmo = newAmmoPerVehicle; if (i<remainder) ++newAmmo; c->getVehicles()->push_back(new Vehicle(item, newAmmo)); _base->getItems()->removeItem(ammo->getType(), newAmmo); _base->getItems()->removeItem(_items[_sel]); } } if (oldVehiclesCount >= canBeAdded) { // So we haven't managed to increase the count of vehicles because of the ammo _timerRight->stop(); LocalizedText msg(tr("STR_NOT_ENOUGH_ammotype_TO_ARM_HWP").arg(tr(ammo->getType()))); _game->pushState(new ErrorMessageState(_game, msg, Palette::blockOffset(15)+1, "BACK04.SCR", 2)); } } else for (int i=0; i < change; ++i) { c->getVehicles()->push_back(new Vehicle(item, 255)); _base->getItems()->removeItem(_items[_sel]); } } } else { _base->getItems()->removeItem(_items[_sel],change); c->getItems()->addItem(_items[_sel],change); } updateQuantity(); }
/** * Sells the selected items. * @param action Pointer to an action. */ void SellState::btnOkClick(Action *action) { _game->getSavedGame()->setFunds(_game->getSavedGame()->getFunds() + _total); for (unsigned int i = 0; i < _qtys.size(); ++i) { if (_qtys[i] > 0) { // Sell soldiers if (i < _soldiers.size()) { for (std::vector<Soldier*>::iterator s = _base->getSoldiers()->begin(); s != _base->getSoldiers()->end(); ++s) { if (*s == _soldiers[i]) { _base->getSoldiers()->erase(s); break; } } delete _soldiers[i]; } // Sell crafts else if (i >= _soldiers.size() && i < _soldiers.size() + _crafts.size()) { Craft *craft = _crafts[i - _soldiers.size()]; // Remove weapons from craft for (std::vector<CraftWeapon*>::iterator w = craft->getWeapons()->begin(); w != craft->getWeapons()->end(); ++w) { if ((*w) != 0) { _base->getItems()->addItem((*w)->getRules()->getLauncherItem()); _base->getItems()->addItem((*w)->getRules()->getClipItem(), (int)floor((double)(*w)->getAmmo() / (*w)->getRules()->getRearmRate())); } } // Remove items from craft for (std::map<std::string, int>::iterator it = craft->getItems()->getContents()->begin(); it != craft->getItems()->getContents()->end(); ++it) { _base->getItems()->addItem(it->first, it->second); } // Remove soldiers from craft for (std::vector<Soldier*>::iterator s = _base->getSoldiers()->begin(); s != _base->getSoldiers()->end(); ++s) { if ((*s)->getCraft() == craft) { (*s)->setCraft(0); } } // Remove craft for (std::vector<Craft*>::iterator c = _base->getCrafts()->begin(); c != _base->getCrafts()->end(); ++c) { if (*c == craft) { _base->getCrafts()->erase(c); break; } } delete craft; } // Sell scientists else if (_base->getAvailableScientists() > 0 && i == _soldiers.size() + _crafts.size()) { _base->setScientists(_base->getScientists() - _qtys[i]); } // Sell engineers else if (_base->getAvailableEngineers() > 0 && i == _soldiers.size() + _crafts.size() + _sOffset) { _base->setEngineers(_base->getEngineers() - _qtys[i]); } // Sell items else { _base->getItems()->removeItem(_items[i - _soldiers.size() - _crafts.size() - _sOffset - _eOffset], _qtys[i]); } } } _game->popState(); }
/** * Sells the selected items. * @param action Pointer to an action. */ void SellState::btnOkClick(Action *) { _game->getSavedGame()->setFunds(_game->getSavedGame()->getFunds() + _total); for (size_t i = 0; i < _qtys.size(); ++i) { if (_qtys[i] > 0) { switch (getType(i)) { case SELL_SOLDIER: for (std::vector<Soldier*>::iterator s = _base->getSoldiers()->begin(); s != _base->getSoldiers()->end(); ++s) { if (*s == _soldiers[i]) { if ((*s)->getArmor()->getStoreItem() != "STR_NONE") { _base->getItems()->addItem((*s)->getArmor()->getStoreItem()); } _base->getSoldiers()->erase(s); break; } } delete _soldiers[i]; break; case SELL_CRAFT: { Craft *craft = _crafts[getCraftIndex(i)]; // Remove weapons from craft for (std::vector<CraftWeapon*>::iterator w = craft->getWeapons()->begin(); w != craft->getWeapons()->end(); ++w) { if ((*w) != 0) { _base->getItems()->addItem((*w)->getRules()->getLauncherItem()); _base->getItems()->addItem((*w)->getRules()->getClipItem(), (*w)->getClipsLoaded(_game->getRuleset())); } } // Remove items from craft for (std::map<std::string, int>::iterator it = craft->getItems()->getContents()->begin(); it != craft->getItems()->getContents()->end(); ++it) { _base->getItems()->addItem(it->first, it->second); } // Remove vehicles from craft for (std::vector<Vehicle*>::iterator v = craft->getVehicles()->begin(); v != craft->getVehicles()->end(); ++v) { _base->getItems()->addItem((*v)->getRules()->getType()); _base->getItems()->addItem((*v)->getRules()->getCompatibleAmmo()->front(), (*v)->getAmmo()); } // Remove soldiers from craft for (std::vector<Soldier*>::iterator s = _base->getSoldiers()->begin(); s != _base->getSoldiers()->end(); ++s) { if ((*s)->getCraft() == craft) { (*s)->setCraft(0); } } // Clear Hangar for (std::vector<BaseFacility*>::iterator f = _base->getFacilities()->begin(); f != _base->getFacilities()->end(); ++f) { if ((*f)->getCraft() == craft) { (*f)->setCraft(0); break; } } // Remove craft for (std::vector<Craft*>::iterator c = _base->getCrafts()->begin(); c != _base->getCrafts()->end(); ++c) { if (*c == craft) { _base->getCrafts()->erase(c); break; } } delete craft; } break; case SELL_SCIENTIST: _base->setScientists(_base->getScientists() - _qtys[i]); break; case SELL_ENGINEER: _base->setEngineers(_base->getEngineers() - _qtys[i]); break; case SELL_ITEM: if (_base->getItems()->getItem(_items[getItemIndex(i)]) < _qtys[i]) { const std::string itemName = _items[getItemIndex(i)]; int toRemove = _qtys[i] - _base->getItems()->getItem(itemName); // remove all of said items from base _base->getItems()->removeItem(itemName, INT_MAX); // if we still need to remove any, remove them from the crafts first, and keep a running tally for (std::vector<Craft*>::iterator j = _base->getCrafts()->begin(); j != _base->getCrafts()->end() && toRemove; ++j) { if ((*j)->getItems()->getItem(itemName) < toRemove) { toRemove -= (*j)->getItems()->getItem(itemName); (*j)->getItems()->removeItem(itemName, INT_MAX); } else { (*j)->getItems()->removeItem(itemName, toRemove); toRemove = 0; } } // if there are STILL any left to remove, take them from the transfers, and if necessary, delete it. for (std::vector<Transfer*>::iterator j = _base->getTransfers()->begin(); j != _base->getTransfers()->end() && toRemove;) { if ((*j)->getItems() == itemName) { if ((*j)->getQuantity() <= toRemove) { toRemove -= (*j)->getQuantity(); delete *j; j = _base->getTransfers()->erase(j); } else { (*j)->setItems((*j)->getItems(), (*j)->getQuantity() - toRemove); toRemove = 0; } } else { ++j; } } } else { _base->getItems()->removeItem(_items[getItemIndex(i)], _qtys[i]); } } } } _game->popState(); }
/** * Initializes all the elements in the Craft Equipment screen. * @param game Pointer to the core game. * @param base Pointer to the base to get info from. * @param craft ID of the selected craft. */ CraftEquipmentState::CraftEquipmentState(Game *game, Base *base, unsigned int craft) : State(game), _sel(0), _base(base), _craft(craft) { // Create objects _window = new Window(this, 320, 200, 0, 0); _btnOk = new TextButton(288, 16, 16, 176); _txtTitle = new Text(300, 16, 16, 7); _txtItem = new Text(144, 9, 16, 32); _txtStores = new Text(150, 9, 160, 32); _txtAvailable = new Text(110, 9, 16, 24); _txtUsed = new Text(110, 9, 130, 24); _lstEquipment = new TextList(288, 128, 8, 40); // Set palette _game->setPalette(_game->getResourcePack()->getPalette("BACKPALS.DAT")->getColors(Palette::blockOffset(2)), Palette::backPos, 16); add(_window); add(_btnOk); add(_txtTitle); add(_txtItem); add(_txtStores); add(_txtAvailable); add(_txtUsed); add(_lstEquipment); // Set up objects _window->setColor(Palette::blockOffset(15)+1); _window->setBackground(_game->getResourcePack()->getSurface("BACK04.SCR")); _btnOk->setColor(Palette::blockOffset(15)+1); _btnOk->setText(_game->getLanguage()->getString("STR_OK")); _btnOk->onMouseClick((ActionHandler)&CraftEquipmentState::btnOkClick); _txtTitle->setColor(Palette::blockOffset(15)+1); _txtTitle->setBig(); Craft *c = _base->getCrafts()->at(_craft); std::wstring s; s = _game->getLanguage()->getString("STR_EQUIPMENT_FOR") + c->getName(_game->getLanguage()); _txtTitle->setText(s); _txtItem->setColor(Palette::blockOffset(15)+1); _txtItem->setText(_game->getLanguage()->getString("STR_ITEM")); _txtStores->setColor(Palette::blockOffset(15)+1); _txtStores->setText(_game->getLanguage()->getString("STR_STORES")); _txtAvailable->setColor(Palette::blockOffset(15)+1); _txtAvailable->setSecondaryColor(Palette::blockOffset(13)); std::wstringstream ss; ss << _game->getLanguage()->getString("STR_SPACE_AVAILABLE") << L'\x01'<< c->getRules()->getSoldiers() - c->getNumSoldiers(); _txtAvailable->setText(ss.str()); _txtUsed->setColor(Palette::blockOffset(15)+1); _txtUsed->setSecondaryColor(Palette::blockOffset(13)); std::wstringstream ss2; ss2 << _game->getLanguage()->getString("STR_SPACE_USED") << L'\x01'<< c->getNumSoldiers(); _txtUsed->setText(ss2.str()); _lstEquipment->setColor(Palette::blockOffset(13)+10); _lstEquipment->setArrowColor(Palette::blockOffset(15)+1); _lstEquipment->setArrowColumn(203, ARROW_HORIZONTAL); _lstEquipment->setColumns(3, 154, 85, 41); _lstEquipment->setSelectable(true); _lstEquipment->setBackground(_window); _lstEquipment->setMargin(8); _lstEquipment->onLeftArrowPress((ActionHandler)&CraftEquipmentState::lstEquipmentLeftArrowPress); _lstEquipment->onLeftArrowRelease((ActionHandler)&CraftEquipmentState::lstEquipmentLeftArrowRelease); _lstEquipment->onRightArrowPress((ActionHandler)&CraftEquipmentState::lstEquipmentRightArrowPress); _lstEquipment->onRightArrowRelease((ActionHandler)&CraftEquipmentState::lstEquipmentRightArrowRelease); _items.push_back("STR_PISTOL"); _items.push_back("STR_PISTOL_CLIP"); _items.push_back("STR_RIFLE"); _items.push_back("STR_RIFLE_CLIP"); _items.push_back("STR_HEAVY_CANNON"); _items.push_back("STR_HC_AP_AMMO"); _items.push_back("STR_HC_HE_AMMO"); _items.push_back("STR_HC_I_AMMO"); _items.push_back("STR_AUTO_CANNON"); _items.push_back("STR_AC_AP_AMMO"); _items.push_back("STR_AC_HE_AMMO"); _items.push_back("STR_AC_I_AMMO"); _items.push_back("STR_ROCKET_LAUNCHER"); _items.push_back("STR_SMALL_ROCKET"); _items.push_back("STR_LARGE_ROCKET"); _items.push_back("STR_INCENDIARY_ROCKET"); _items.push_back("STR_GRENADE"); _items.push_back("STR_SMOKE_GRENADE"); _items.push_back("STR_ELECTRO_FLARE"); int row = 0; for (std::vector<std::string>::iterator i = _items.begin(); i != _items.end();) { if (_base->getItems()->getItem(*i) == 0 && c->getItems()->getItem(*i) == 0) { i = _items.erase(i); } else { std::wstringstream ss, ss2; ss << _base->getItems()->getItem(*i); ss2 << c->getItems()->getItem(*i); RuleItem *rule = _game->getRuleset()->getItem(*i); std::wstring s = _game->getLanguage()->getString(*i); if (rule->getBattleType() == BT_AMMO) { s.insert(0, L" "); } _lstEquipment->addRow(3, s.c_str(), ss.str().c_str(), ss2.str().c_str()); Uint8 color; if (c->getItems()->getItem(*i) == 0) { if (rule->getBattleType() == BT_AMMO) { color = Palette::blockOffset(15)+6; } else { color = Palette::blockOffset(13)+10; } } else { color = Palette::blockOffset(13); } _lstEquipment->setRowColor(row, color); ++i; row++; } } _timerLeft = new Timer(50); _timerLeft->onTimer((StateHandler)&CraftEquipmentState::moveLeft); _timerRight = new Timer(50); _timerRight->onTimer((StateHandler)&CraftEquipmentState::moveRight); }
/** * Initializes all the elements in the Craft Equipment screen. * @param game Pointer to the core game. * @param base Pointer to the base to get info from. * @param craft ID of the selected craft. */ CraftEquipmentState::CraftEquipmentState(Base *base, size_t craft) : _sel(0), _craft(craft), _base(base), _totalItems(0), _ammoColor(0) { Craft *c = _base->getCrafts()->at(_craft); bool craftHasACrew = c->getNumSoldiers() > 0; bool isNewBattle = _game->getSavedGame()->getMonthsPassed() == -1; // Create objects _window = new Window(this, 320, 200, 0, 0); _btnOk = new TextButton((craftHasACrew || isNewBattle)? 148:288, 16, (craftHasACrew || isNewBattle)? 164:16, 176); _btnClear = new TextButton(148, 16, 8, 176); _btnInventory = new TextButton(148, 16, 8, 176); _txtTitle = new Text(300, 17, 16, 7); _txtItem = new Text(144, 9, 16, 32); _txtStores = new Text(150, 9, 160, 32); _txtAvailable = new Text(110, 9, 16, 24); _txtUsed = new Text(110, 9, 130, 24); _txtCrew = new Text(71, 9, 244, 24); _lstEquipment = new TextList(288, 128, 8, 40); // Set palette setInterface("craftEquipment"); _ammoColor = _game->getMod()->getInterface("craftEquipment")->getElement("ammoColor")->color; add(_window, "window", "craftEquipment"); add(_btnOk, "button", "craftEquipment"); add(_btnClear, "button", "craftEquipment"); add(_btnInventory, "button", "craftEquipment"); add(_txtTitle, "text", "craftEquipment"); add(_txtItem, "text", "craftEquipment"); add(_txtStores, "text", "craftEquipment"); add(_txtAvailable, "text", "craftEquipment"); add(_txtUsed, "text", "craftEquipment"); add(_txtCrew, "text", "craftEquipment"); add(_lstEquipment, "list", "craftEquipment"); centerAllSurfaces(); // Set up objects _window->setBackground(_game->getMod()->getSurface("BACK04.SCR")); _btnOk->setText(tr("STR_OK")); _btnOk->onMouseClick((ActionHandler)&CraftEquipmentState::btnOkClick); _btnOk->onKeyboardPress((ActionHandler)&CraftEquipmentState::btnOkClick, Options::keyCancel); _btnClear->setText(tr("STR_UNLOAD_CRAFT")); _btnClear->onMouseClick((ActionHandler)&CraftEquipmentState::btnClearClick); _btnClear->setVisible(isNewBattle); _btnInventory->setText(tr("STR_INVENTORY")); _btnInventory->onMouseClick((ActionHandler)&CraftEquipmentState::btnInventoryClick); _btnInventory->setVisible(craftHasACrew && !isNewBattle); _txtTitle->setBig(); _txtTitle->setText(tr("STR_EQUIPMENT_FOR_CRAFT").arg(c->getName(_game->getLanguage()))); _txtItem->setText(tr("STR_ITEM")); _txtStores->setText(tr("STR_STORES")); _txtAvailable->setText(tr("STR_SPACE_AVAILABLE").arg(c->getSpaceAvailable())); _txtUsed->setText(tr("STR_SPACE_USED").arg(c->getSpaceUsed())); std::wostringstream ss3; ss3 << tr("STR_SOLDIERS_UC") << ">" << L'\x01'<< c->getNumSoldiers(); _txtCrew->setText(ss3.str()); _lstEquipment->setArrowColumn(203, ARROW_HORIZONTAL); _lstEquipment->setColumns(3, 156, 83, 41); _lstEquipment->setSelectable(true); _lstEquipment->setBackground(_window); _lstEquipment->setMargin(8); _lstEquipment->onLeftArrowPress((ActionHandler)&CraftEquipmentState::lstEquipmentLeftArrowPress); _lstEquipment->onLeftArrowRelease((ActionHandler)&CraftEquipmentState::lstEquipmentLeftArrowRelease); _lstEquipment->onLeftArrowClick((ActionHandler)&CraftEquipmentState::lstEquipmentLeftArrowClick); _lstEquipment->onRightArrowPress((ActionHandler)&CraftEquipmentState::lstEquipmentRightArrowPress); _lstEquipment->onRightArrowRelease((ActionHandler)&CraftEquipmentState::lstEquipmentRightArrowRelease); _lstEquipment->onRightArrowClick((ActionHandler)&CraftEquipmentState::lstEquipmentRightArrowClick); _lstEquipment->onMousePress((ActionHandler)&CraftEquipmentState::lstEquipmentMousePress); int row = 0; const std::vector<std::string> &items = _game->getMod()->getItemsList(); for (std::vector<std::string>::const_iterator i = items.begin(); i != items.end(); ++i) { RuleItem *rule = _game->getMod()->getItem(*i); int cQty = 0; if (rule->isFixed()) { cQty = c->getVehicleCount(*i); } else { cQty = c->getItems()->getItem(*i); _totalItems += cQty; } if (rule->getBigSprite() > -1 && rule->getBattleType() != BT_NONE && rule->getBattleType() != BT_CORPSE && _game->getSavedGame()->isResearched(rule->getRequirements()) && (_base->getStorageItems()->getItem(*i) > 0 || cQty > 0)) { _items.push_back(*i); std::wostringstream ss, ss2; if (_game->getSavedGame()->getMonthsPassed() > -1) { ss << _base->getStorageItems()->getItem(*i); } else { ss << "-"; } ss2 << cQty; std::wstring s = tr(*i); if (rule->getBattleType() == BT_AMMO) { s.insert(0, L" "); } _lstEquipment->addRow(3, s.c_str(), ss.str().c_str(), ss2.str().c_str()); Uint8 color; if (cQty == 0) { if (rule->getBattleType() == BT_AMMO) { color = _ammoColor; } else { color = _lstEquipment->getColor(); } } else { color = _lstEquipment->getSecondaryColor(); } _lstEquipment->setRowColor(row, color); ++row; } } _timerLeft = new Timer(250); _timerLeft->onTimer((StateHandler)&CraftEquipmentState::moveLeft); _timerRight = new Timer(250); _timerRight->onTimer((StateHandler)&CraftEquipmentState::moveRight); }
/** * Moves the given number of items (selected) to the craft. * @param change Item difference. */ void CraftEquipmentState::moveRightByValue(int change) { Craft *c = _base->getCrafts()->at(_craft); RuleItem *item = _game->getMod()->getItem(_items[_sel]); int bqty = _base->getStorageItems()->getItem(_items[_sel]); if (_game->getSavedGame()->getMonthsPassed() == -1) { if (change == INT_MAX) { change = 10; } bqty = change; } if (0 >= change || 0 >= bqty) return; change = std::min(bqty, change); // Do we need to convert item to vehicle? if (item->isFixed()) { int size = 4; if (_game->getMod()->getUnit(item->getType())) { size = _game->getMod()->getArmor(_game->getMod()->getUnit(item->getType())->getArmor())->getSize(); size *= size; } // Check if there's enough room int room = std::min(c->getRules()->getVehicles() - c->getNumVehicles(), c->getSpaceAvailable() / size); if (room > 0) { change = std::min(room, change); if (!item->getCompatibleAmmo()->empty()) { // And now let's see if we can add the total number of vehicles. RuleItem *ammo = _game->getMod()->getItem(item->getCompatibleAmmo()->front()); int ammoPerVehicle, clipSize; if (ammo->getClipSize() > 0 && item->getClipSize() > 0) { clipSize = item->getClipSize(); ammoPerVehicle = clipSize / ammo->getClipSize(); } else { clipSize = ammo->getClipSize(); ammoPerVehicle = clipSize; } int baseQty = _base->getStorageItems()->getItem(ammo->getType()) / ammoPerVehicle; if (_game->getSavedGame()->getMonthsPassed() == -1) baseQty = 1; int canBeAdded = std::min(change, baseQty); if (canBeAdded > 0) { for (int i=0; i < canBeAdded; ++i) { if (_game->getSavedGame()->getMonthsPassed() != -1) { _base->getStorageItems()->removeItem(ammo->getType(), ammoPerVehicle); _base->getStorageItems()->removeItem(_items[_sel]); } c->getVehicles()->push_back(new Vehicle(item, clipSize, size)); } } else { // So we haven't managed to increase the count of vehicles because of the ammo _timerRight->stop(); LocalizedText msg(tr("STR_NOT_ENOUGH_AMMO_TO_ARM_HWP").arg(tr(ammo->getType()))); _game->pushState(new ErrorMessageState(msg, _palette, _game->getMod()->getInterface("craftEquipment")->getElement("errorMessage")->color, "BACK04.SCR", _game->getMod()->getInterface("craftEquipment")->getElement("errorPalette")->color)); } } else for (int i=0; i < change; ++i) { c->getVehicles()->push_back(new Vehicle(item, item->getClipSize(), size)); if (_game->getSavedGame()->getMonthsPassed() != -1) { _base->getStorageItems()->removeItem(_items[_sel]); } } } } else { if (c->getRules()->getMaxItems() > 0 && _totalItems + change > c->getRules()->getMaxItems()) { _timerRight->stop(); LocalizedText msg(tr("STR_NO_MORE_EQUIPMENT_ALLOWED", c->getRules()->getMaxItems())); _game->pushState(new ErrorMessageState(msg, _palette, _game->getMod()->getInterface("craftEquipment")->getElement("errorMessage")->color, "BACK04.SCR", _game->getMod()->getInterface("craftEquipment")->getElement("errorPalette")->color)); change = c->getRules()->getMaxItems() - _totalItems; } c->getItems()->addItem(_items[_sel],change); _totalItems += change; if (_game->getSavedGame()->getMonthsPassed() > -1) { _base->getStorageItems()->removeItem(_items[_sel],change); } } updateQuantity(); }
/** * Moves the given number of items (selected) to the base. * @param change Item difference. */ void CraftEquipmentState::moveLeftByValue(int change) { Craft *c = _base->getCrafts()->at(_craft); RuleItem *item = _game->getMod()->getItem(_items[_sel]); int cQty = 0; if (item->isFixed()) cQty = c->getVehicleCount(_items[_sel]); else cQty = c->getItems()->getItem(_items[_sel]); if (change <= 0 || cQty <= 0) return; change = std::min(cQty, change); // Convert vehicle to item if (item->isFixed()) { if (!item->getCompatibleAmmo()->empty()) { // First we remove all vehicles because we want to redistribute the ammo RuleItem *ammo = _game->getMod()->getItem(item->getCompatibleAmmo()->front()); for (std::vector<Vehicle*>::iterator i = c->getVehicles()->begin(); i != c->getVehicles()->end(); ) { if ((*i)->getRules() == item) { _base->getStorageItems()->addItem(ammo->getType(), (*i)->getAmmo()); delete (*i); i = c->getVehicles()->erase(i); } else ++i; } if (_game->getSavedGame()->getMonthsPassed() != -1) { _base->getStorageItems()->addItem(_items[_sel], cQty); } // And now reAdd the count we want to keep in the craft (and redistribute the ammo among them) if (cQty > change) moveRightByValue(cQty - change); } else { if (_game->getSavedGame()->getMonthsPassed() != -1) { _base->getStorageItems()->addItem(_items[_sel], change); } for (std::vector<Vehicle*>::iterator i = c->getVehicles()->begin(); i != c->getVehicles()->end(); ) { if ((*i)->getRules() == item) { delete (*i); i = c->getVehicles()->erase(i); if (0 >= --change) break; } else ++i; } } } else { c->getItems()->removeItem(_items[_sel], change); _totalItems -= change; if (_game->getSavedGame()->getMonthsPassed() > -1) { _base->getStorageItems()->addItem(_items[_sel], change); } } updateQuantity(); }