/* base/shipmodel.cc This file is part of the Osirion project and is distributed under the terms and conditions of the GNU General Public License version 2 */ #include #include "auxiliary/functions.h" #include "base/shipmodel.h" #include "sys/sys.h" namespace game { // the ship model registry ShipModel::Registry ShipModel::registry; ShipModel::ShipModel(const unsigned int type_id) { //default specifications shipmodel_acceleration = 1.0f; // thruster acceleration in game untits/second^2 shipmodel_maxspeed = 3.0f; // maximum thruster speed in game units/second shipmodel_turnspeed = 45.0f; // 45 degrees per second shipmodel_price = 0; // the ship is for free by default shipmodel_maxcargo = 0; shipmodel_jumpdrive = false; shipmodel_type_id = type_id; } ShipModel::~ShipModel() {} // clear the ship model registry void ShipModel::clear() { for (iterator smit = registry.begin(); smit != registry.end(); smit++) { delete(*smit).second; } registry.clear(); } void ShipModel::print() { con_print << "label: ^B" << label() << " ^Nname: ^B" << name() << std::endl; con_print << " price: ^B" << price() << std::endl; con_print << " acceleration: ^B" << acceleration() << std::endl; con_print << " turnspeed: ^B" << turnspeed() << std::endl; con_print << " max speed: ^B" << maxspeed() << std::endl; con_print << " cargo: ^B" << maxcargo() << std::endl; } void ShipModel::generate_info() { for (iterator it = registry.begin(); it != registry.end(); it++) { ShipModel *shipmodel = (*it).second; core::Info *info = new core::Info("ship/" + shipmodel->label()); info->clear_text(); info->set_name(shipmodel->name()); info->set_modelname(shipmodel->modelname()); // info text form ships.ini for (core::Info::Text::iterator tit = shipmodel->shipmodel_infotext.begin(); tit != shipmodel->shipmodel_infotext.end(); tit++) { info->add_text((*tit)); } info->add_text(""); info->add_text("^BSpecifications:^N"); std::stringstream str; str << "price: ^B" << shipmodel->price() << " ^Ncredits"; info->add_text(str.str()); str.str(""); str << "cargo hold: ^B" << 0.1f * shipmodel->maxcargo() << " ^Nmetric tonnes"; info->add_text(str.str()); str.str(""); str << "top speed: ^B" << 100.0f * shipmodel->maxspeed() << " ^Nmps"; info->add_text(str.str()); str.str(""); str << "response: ^B" << shipmodel->turnspeed() << " ^Ndps"; info->add_text(str.str()); str.str(""); str << "acceleration: ^B" << shipmodel->acceleration() << " ^Nstandard"; info->add_text(str.str()); str.str(""); if (shipmodel->shipmodel_jumpdrive) { str << "hyperspace jump drive capable"; info->add_text(str.str()); str.str(""); } } } void ShipModel::list() { for (iterator smit = registry.begin(); smit != registry.end(); smit++) { con_print << std::setw(24) << (*smit).second->label() << " ^B" << (*smit).second->name() << "\n"; } con_print << registry.size() << " registered ship models\n"; } ShipModel *ShipModel::find(ShipModel *shipmodel) { for (iterator smit = registry.begin(); smit != registry.end(); smit++) { if ((*smit).second == shipmodel) return shipmodel; } return 0; } ShipModel *ShipModel::find(const std::string label) { if (!label.size()) return 0; std::map::iterator it = registry.find(label); if (it == registry.end()) return 0; else return (*it).second; } ShipModel *ShipModel::search(const std::string searchname) { if (!searchname.size()) return 0; std::string strsearchkey(aux::lowercase(searchname)); if (strsearchkey.size() < 3) { return 0; } std::string label; std::string name; for (iterator smit = registry.begin(); smit != registry.end(); smit++) { ShipModel *shipmodel = (*smit).second; label.assign(shipmodel->label()); if (label.size() && (label.find(strsearchkey) != std::string::npos)) { return shipmodel; } name.assign(aux::lowercase(shipmodel->name())); if (name.size() && (name.find(strsearchkey) != std::string::npos)) { return shipmodel; } } return 0; } // add a ship model void ShipModel::add(ShipModel *shipmodel) { ShipModel *m = find(shipmodel->label()); if (m) { con_warn << "Duplicate ship model " << shipmodel->label() << "!\n"; delete m; } registry[shipmodel->label()] = shipmodel; } }