Intro::Intro(Graphics::Renderer *r, int width, int height) : Cutscene(r, width, height) { using Graphics::Light; m_background.reset(new Background::Container(r, UNIVERSE_SEED)); m_ambientColor = Color(0); const Color one = Color::WHITE; const Color two = Color(77, 77, 204, 0); m_lights.push_back(Light(Graphics::Light::LIGHT_DIRECTIONAL, vector3f(0.f, 0.3f, 1.f), one, one)); m_lights.push_back(Light(Graphics::Light::LIGHT_DIRECTIONAL, vector3f(0.f, -1.f, 0.f), two, Color::BLACK)); SceneGraph::ModelSkin skin; skin.SetDecal("pioneer"); skin.SetLabel(Lang::PIONEER); for (std::vector<ShipType::Id>::const_iterator i = ShipType::player_ships.begin(); i != ShipType::player_ships.end(); ++i) { SceneGraph::Model *model = Pi::FindModel(ShipType::types[*i].modelName)->MakeInstance(); skin.SetRandomColors(Pi::rng); skin.Apply(model); model->SetThrust(vector3f(0.f, 0.f, -0.6f), vector3f(0.f)); m_models.push_back(model); } PiRngWrapper rng; std::random_shuffle(m_models.begin(), m_models.end(), rng); m_state = STATE_SELECT; m_modelIndex = 0; }
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("pioneer"); if (model->SupportsPatterns()) { skin.SetRandomColors(rand); skin.Apply(model); model->SetPattern(rand.Int32(0, model->GetNumPatterns())); } else { skin.Apply(model); } }
// 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(); }
//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())); } }