void PlanetPanel::Draw() { if(player.IsDead()) return; const Ship *flagship = player.Flagship(); Information info; info.SetSprite("land", planet.Landscape()); bool hasAccess = planet.CanUseServices(); bool hasShip = false; for(const auto &it : player.Ships()) if(it->GetSystem() == player.GetSystem() && !it->IsDisabled()) { hasShip = true; break; } if(flagship && flagship->CanBeFlagship()) info.SetCondition("has ship"); if(planet.IsInhabited() && hasAccess) info.SetCondition("has bank"); if(flagship && planet.IsInhabited() && hasAccess) info.SetCondition("is inhabited"); if(flagship && planet.HasSpaceport() && hasAccess) info.SetCondition("has spaceport"); if(planet.HasShipyard() && hasAccess) info.SetCondition("has shipyard"); if(hasShip && planet.HasOutfitter() && hasAccess) info.SetCondition("has outfitter"); ui.Draw(info, this); if(!selectedPanel) text.Draw(Point(-300., 80.), *GameData::Colors().Get("bright")); }
void MenuPanel::Draw() const { glClear(GL_COLOR_BUFFER_BIT); GameData::Background().Draw(Point(), Point()); Information info; if(player.IsLoaded() && !player.IsDead()) { info.SetCondition("pilot loaded"); info.SetString("pilot", player.FirstName() + " " + player.LastName()); if(player.Flagship()) { const Ship &flagship = *player.Flagship(); info.SetSprite("ship sprite", flagship.GetSprite()); info.SetString("ship", flagship.Name()); } if(player.GetSystem()) info.SetString("system", player.GetSystem()->Name()); if(player.GetPlanet()) info.SetString("planet", player.GetPlanet()->Name()); info.SetString("credits", Format::Number(player.Accounts().Credits())); info.SetString("date", player.GetDate().ToString()); } else if(player.IsLoaded()) { info.SetCondition("no pilot loaded"); info.SetString("pilot", player.FirstName() + " " + player.LastName()); info.SetString("ship", "You have died."); } else { info.SetCondition("no pilot loaded"); info.SetString("pilot", "No Pilot Loaded"); } const Interface *menu = GameData::Interfaces().Get("main menu"); menu->Draw(info); if(progress == 60) alpha -= .02f; if(alpha > 0.f) { Angle da(6.); Angle a(0.); for(int i = 0; i < progress; ++i) { Color color(.5 * alpha, 0.f); PointerShader::Draw(Point(), a.Unit(), 8., 20., 140. * alpha, color); a += da; } } const Font &font = FontSet::Get(14); int y = 120 - scroll / scrollSpeed; for(const string &line : credits) { float fade = 1.f; if(y < -145) fade = max(0.f, (y + 165) / 20.f); else if(y > 95) fade = max(0.f, (115 - y) / 20.f); if(fade) { Color color(((line.empty() || line[0] == ' ') ? .2 : .4) * fade, 0.); font.Draw(line, Point(-470., y), color); } y += 20; } }
void LoadPanel::Draw() const { glClear(GL_COLOR_BUFFER_BIT); GameData::Background().Draw(Point(), Point()); Information info; if(loadedInfo.IsLoaded()) { info.SetString("pilot", loadedInfo.Name()); if(loadedInfo.ShipSprite()) { info.SetSprite("ship sprite", loadedInfo.ShipSprite()); info.SetString("ship", loadedInfo.ShipName()); } if(!loadedInfo.GetSystem().empty()) info.SetString("system", loadedInfo.GetSystem()); if(!loadedInfo.GetPlanet().empty()) info.SetString("planet", loadedInfo.GetPlanet()); info.SetString("credits", loadedInfo.Credits()); info.SetString("date", loadedInfo.GetDate()); } else info.SetString("pilot", "No Pilot Loaded"); if(!selectedPilot.empty()) info.SetCondition("pilot selected"); if(selectedFile.find('~') != string::npos) info.SetCondition("snapshot selected"); if(loadedInfo.IsLoaded()) info.SetCondition("pilot loaded"); const Interface *menu = GameData::Interfaces().Get("load menu"); menu->Draw(info); const Font &font = FontSet::Get(14); // The list has space for 14 entries. Alpha should be 100% for Y = -157 to // 103, and fade to 0 at 10 pixels beyond that. Point point(-470., -157. - sideScroll); for(const auto &it : files) { double alpha = min(1., max(0., min(.1 * (113. - point.Y()), .1 * (point.Y() - -167.)))); if(it.first == selectedPilot) FillShader::Fill(point + Point(110., 7.), Point(230., 20.), Color(.1 * alpha, 0.)); font.Draw(it.first, point, Color(.5 * alpha, 0.)); point += Point(0., 20.); } if(!selectedPilot.empty() && files.find(selectedPilot) != files.end()) { point = Point(-110., -157. - centerScroll); for(const string &file : files.find(selectedPilot)->second) { double alpha = min(1., max(0., min(.1 * (113. - point.Y()), .1 * (point.Y() - -167.)))); if(file == selectedFile) FillShader::Fill(point + Point(110., 7.), Point(230., 20.), Color(.1 * alpha, 0.)); size_t pos = file.find('~') + 1; string name = file.substr(pos, file.size() - 4 - pos); font.Draw(name, point, Color(.5 * alpha, 0.)); point += Point(0., 20.); } } }
void LoadPanel::Draw() { glClear(GL_COLOR_BUFFER_BIT); GameData::Background().Draw(Point(), Point()); const Font &font = FontSet::Get(14); Information info; if(loadedInfo.IsLoaded()) { info.SetString("pilot", font.TruncateMiddle(loadedInfo.Name(), 165)); if(loadedInfo.ShipSprite()) { info.SetSprite("ship sprite", loadedInfo.ShipSprite()); info.SetString("ship", font.TruncateMiddle(loadedInfo.ShipName(), 165)); } if(!loadedInfo.GetSystem().empty()) info.SetString("system", loadedInfo.GetSystem()); if(!loadedInfo.GetPlanet().empty()) info.SetString("planet", loadedInfo.GetPlanet()); info.SetString("credits", loadedInfo.Credits()); info.SetString("date", loadedInfo.GetDate()); } else info.SetString("pilot", "No Pilot Loaded"); if(!selectedPilot.empty()) info.SetCondition("pilot selected"); if(!player.IsDead() && player.IsLoaded() && !selectedPilot.empty()) info.SetCondition("pilot alive"); if(selectedFile.find('~') != string::npos) info.SetCondition("snapshot selected"); if(loadedInfo.IsLoaded()) info.SetCondition("pilot loaded"); GameData::Interfaces().Get("menu background")->Draw(info, this); GameData::Interfaces().Get("load menu")->Draw(info, this); GameData::Interfaces().Get("menu player info")->Draw(info, this); // The list has space for 14 entries. Alpha should be 100% for Y = -157 to // 103, and fade to 0 at 10 pixels beyond that. Point point(-470., -157. - sideScroll); for(const auto &it : files) { Rectangle zone(point + Point(110., 7.), Point(230., 20.)); bool isHighlighted = (it.first == selectedPilot || (hasHover && zone.Contains(hoverPoint))); double alpha = min(1., max(0., min(.1 * (113. - point.Y()), .1 * (point.Y() - -167.)))); if(it.first == selectedPilot) FillShader::Fill(zone.Center(), zone.Dimensions(), Color(.1 * alpha, 0.)); string name = font.Truncate(it.first, 220); font.Draw(name, point, Color((isHighlighted ? .7 : .5) * alpha, 0.)); point += Point(0., 20.); } // The hover count "decays" over time if not hovering over a saved game. if(hoverCount) --hoverCount; string hoverText; if(!selectedPilot.empty() && files.count(selectedPilot)) { point = Point(-110., -157. - centerScroll); for(const auto &it : files.find(selectedPilot)->second) { const string &file = it.first; Rectangle zone(point + Point(110., 7.), Point(230., 20.)); double alpha = min(1., max(0., min(.1 * (113. - point.Y()), .1 * (point.Y() - -167.)))); bool isHovering = (alpha && hasHover && zone.Contains(hoverPoint)); bool isHighlighted = (file == selectedFile || isHovering); if(isHovering) { hoverCount = min(HOVER_TIME, hoverCount + 2); if(hoverCount == HOVER_TIME) hoverText = TimestampString(it.second); } if(file == selectedFile) FillShader::Fill(zone.Center(), zone.Dimensions(), Color(.1 * alpha, 0.)); size_t pos = file.find('~') + 1; string name = font.Truncate(file.substr(pos, file.size() - 4 - pos), 220); font.Draw(name, point, Color((isHighlighted ? .7 : .5) * alpha, 0.)); point += Point(0., 20.); } } if(!hoverText.empty()) { Point boxSize(font.Width(hoverText) + 20., 30.); FillShader::Fill(hoverPoint + .5 * boxSize, boxSize, *GameData::Colors().Get("tooltip background")); font.Draw(hoverText, hoverPoint + Point(10., 10.), *GameData::Colors().Get("medium")); } }