// Fill the list of starships on sale. Ships that // can't fit atmo shields are only available in // atmosphereless environments void SpaceStation::UpdateShipyard() { bool atmospheric = false; if (IsGroundStation()) { Body *planet = GetFrame()->GetBody(); atmospheric = planet->GetSystemBody()->HasAtmosphere(); } const std::vector<ShipType::Id> &ships = atmospheric ? ShipType::playable_atmospheric_ships : ShipType::player_ships; unsigned int toAdd = 0, toRemove = 0; if (m_shipsOnSale.size() == 0) // fill shipyard toAdd = Pi::rng.Int32(20); else if (Pi::rng.Int32(2)) // add one toAdd = 1; else if(m_shipsOnSale.size() > 0) // remove one toRemove = 1; else // nothing happens return; for (; toAdd > 0; toAdd--) { ShipType::Id id = ships[Pi::rng.Int32(ships.size())]; std::string regId = Ship::MakeRandomLabel(); SceneGraph::ModelSkin skin; skin.SetRandomColors(Pi::rng); skin.SetPattern(Pi::rng.Int32(0, Pi::FindModel(id)->GetNumPatterns())); skin.SetLabel(regId); ShipOnSale sos(id, regId, skin); m_shipsOnSale.push_back(sos); } for (; toRemove > 0; toRemove--) { int pos = Pi::rng.Int32(m_shipsOnSale.size()); m_shipsOnSale.erase(m_shipsOnSale.begin() + pos); } onShipsForSaleChanged.emit(); }
void SpaceStation::InitStation() { m_adjacentCity = 0; for(int i=0; i<NUM_STATIC_SLOTS; i++) m_staticSlot[i] = false; Random rand(m_sbody->GetSeed()); const bool ground = m_sbody->GetType() == SystemBody::TYPE_STARPORT_ORBITAL ? false : true; m_type = SpaceStationType::RandomStationType(rand, ground); if(m_shipDocking.empty()) { m_shipDocking.reserve(m_type->NumDockingPorts()); for (unsigned int i=0; i<m_type->NumDockingPorts(); i++) { m_shipDocking.push_back(shipDocking_t()); } // only (re)set these if we've not come from the ::Load method m_doorAnimationStep = m_doorAnimationState = 0.0; } assert(m_shipDocking.size() == m_type->NumDockingPorts()); // This SpaceStation's bay ports are an instance of... m_ports = m_type->Ports(); SetStatic(ground); // orbital stations are dynamic now // XXX hack. if we loaded a game then ModelBody::Load already restored the // model and we shouldn't overwrite it if (!GetModel()) SetModel(m_type->ModelName().c_str()); SceneGraph::Model *model = GetModel(); m_navLights.reset(new NavLights(model, 2.2f)); m_navLights->SetEnabled(true); if (ground) SetClipRadius(CITY_ON_PLANET_RADIUS); // overrides setmodel m_doorAnimation = model->FindAnimation("doors"); SceneGraph::ModelSkin skin; skin.SetDecal("scout"); skin.SetRandomColors(rand); skin.Apply(model); if (model->SupportsPatterns()) { model->SetPattern(rand.Int32(0, model->GetNumPatterns()-1)); } }
static bool _modelskin_deserializer(const char *pos, const char **next) { const char *end; Uint32 serlen = strtoul(pos, const_cast<char**>(&end), 0); if (pos == end) return false; pos = end+1; // skip newline std::string buf(pos, serlen); const char *bufp = buf.c_str(); Serializer::Reader rd(ByteRange(bufp, bufp + buf.size())); SceneGraph::ModelSkin skin; skin.Load(rd); LuaObject<SceneGraph::ModelSkin>::PushToLua(skin); *next = pos + serlen; return true; }
void CargoBody::Init() { m_hitpoints = 1.0f; SetLabel(Equip::types[m_type].name); SetMassDistributionFromModel(); std::vector<Color> colors; //metallic blue-orangeish color scheme colors.push_back(Color(255, 198, 64)); colors.push_back(Color(0, 222, 255)); colors.push_back(Color(255, 255, 255)); SceneGraph::ModelSkin skin; skin.SetColors(colors); skin.SetDecal("pioneer"); skin.Apply(GetModel()); GetModel()->SetColors(colors); Properties().Set("type", EnumStrings::GetString("EquipType", m_type)); }
void CargoBody::Init() { m_hitpoints = 1.0f; SetLabel(ScopedTable(m_cargo).CallMethod<std::string>("GetName")); SetMassDistributionFromModel(); m_hasSelfdestruct = true; std::vector<Color> colors; //metallic blue-orangeish color scheme colors.push_back(Color(255, 198, 64)); colors.push_back(Color(0, 222, 255)); colors.push_back(Color(255, 255, 255)); SceneGraph::ModelSkin skin; skin.SetColors(colors); skin.SetDecal("pioneer"); skin.Apply(GetModel()); GetModel()->SetColors(colors); Properties().Set("type", ScopedTable(m_cargo).CallMethod<std::string>("GetName")); }
void SpaceStation::Load(Serializer::Reader &rd, Space *space) { ModelBody::Load(rd, space); MarketAgent::Load(rd); int num = rd.Int32(); if (num > Equip::TYPE_MAX) throw SavedGameCorruptException(); for (int i=0; i<Equip::TYPE_MAX; i++) { m_equipmentStock[i] = 0; } for (int i=0; i<num; i++) { m_equipmentStock[i] = static_cast<Equip::Type>(rd.Int32()); } // load shityard int numShipsForSale = rd.Int32(); for (int i=0; i<numShipsForSale; i++) { ShipType::Id id(rd.String()); std::string regId(rd.String()); SceneGraph::ModelSkin skin; skin.Load(rd); ShipOnSale sos(id, regId, skin); m_shipsOnSale.push_back(sos); } for (int i=0; i<MAX_DOCKING_PORTS; i++) { m_shipDocking[i].shipIndex = rd.Int32(); m_shipDocking[i].stage = rd.Int32(); m_shipDocking[i].stagePos = rd.Float(); m_shipDocking[i].fromPos = rd.Vector3d(); m_shipDocking[i].fromRot = rd.RdQuaternionf(); } m_dockingLock = rd.Bool(); m_bbCreated = rd.Bool(); m_lastUpdatedShipyard = rd.Double(); m_sbody = space->GetSystemBodyByIndex(rd.Int32()); m_numPoliceDocked = rd.Int32(); InitStation(); m_navLights->Load(rd); }
//static void CityOnPlanet::SetCityModelPatterns(const SystemPath &path) { Uint32 _init[5] = { path.systemIndex, Uint32(path.sectorX), Uint32(path.sectorY), Uint32(path.sectorZ), UNIVERSE_SEED }; Random rand(_init, 5); typedef std::set<SceneGraph::Model*, ModelNameComparator> ModelSet; typedef ModelSet::iterator TSetIter; ModelSet modelSet; { for (unsigned int j=0; j < s_buildingList.numBuildings; j++) { SceneGraph::Model *m = s_buildingList.buildings[j].resolvedModel; modelSet.insert(m); } } SceneGraph::ModelSkin skin; for (TSetIter it=modelSet.begin(), itEnd=modelSet.end(); it!=itEnd; ++it) { SceneGraph::Model *m = (*it); if (!m->SupportsPatterns()) continue; skin.SetRandomColors(rand); skin.Apply(m); m->SetPattern(rand.Int32(0, m->GetNumPatterns())); } }
void SpaceStation::Load(Serializer::Reader &rd, Space *space) { ModelBody::Load(rd, space); MarketAgent::Load(rd); int num = rd.Int32(); if (num > Equip::TYPE_MAX) throw SavedGameCorruptException(); for (int i=0; i<Equip::TYPE_MAX; i++) { m_equipmentStock[i] = 0; } for (int i=0; i<num; i++) { m_equipmentStock[i] = static_cast<Equip::Type>(rd.Int32()); } // load shityard int numShipsForSale = rd.Int32(); for (int i=0; i<numShipsForSale; i++) { ShipType::Id id(rd.String()); std::string regId(rd.String()); SceneGraph::ModelSkin skin; skin.Load(rd); ShipOnSale sos(id, regId, skin); m_shipsOnSale.push_back(sos); } const int32_t numShipDocking = rd.Int32(); m_shipDocking.reserve(numShipDocking); for (int i=0; i<numShipDocking; i++) { m_shipDocking.push_back(shipDocking_t()); shipDocking_t &sd = m_shipDocking.back(); sd.shipIndex = rd.Int32(); sd.stage = rd.Int32(); sd.stagePos = rd.Float(); sd.fromPos = rd.Vector3d(); sd.fromRot = rd.RdQuaternionf(); } // retrieve each of the bay groupings const int32_t numBays = rd.Int32(); mBayGroups.reserve(numBays); for (int32_t i=0; i<numBays; i++) { mBayGroups.push_back(SpaceStationType::SBayGroup()); SpaceStationType::SBayGroup &bay = mBayGroups.back(); bay.minShipSize = rd.Int32(); bay.maxShipSize = rd.Int32(); bay.inUse = rd.Bool(); const int32_t numBayIds = rd.Int32(); bay.bayIDs.reserve(numBayIds); for (int32_t j=0; j<numBayIds; j++) { const int32_t ID = rd.Int32(); bay.bayIDs.push_back(ID); } } m_bbCreated = rd.Bool(); m_lastUpdatedShipyard = rd.Double(); m_sbody = space->GetSystemBodyByIndex(rd.Int32()); m_numPoliceDocked = rd.Int32(); m_doorAnimationStep = rd.Double(); m_doorAnimationState = rd.Double(); InitStation(); m_navLights->Load(rd); }