void HailPanel::Draw() const { DrawBackdrop(); Information interfaceInfo; interfaceInfo.SetString("header", header); if(ship) { bool isEnemy = ship->GetGovernment()->IsEnemy(); if(isEnemy) { interfaceInfo.SetCondition("can bribe"); interfaceInfo.SetCondition("cannot assist"); } else interfaceInfo.SetCondition("can assist"); } else { if(!planet->CanLand()) interfaceInfo.SetCondition("can bribe"); else interfaceInfo.SetCondition("cannot bribe"); interfaceInfo.SetCondition("can dominate"); } const Interface *interface = GameData::Interfaces().Get("hail panel"); interface->Draw(interfaceInfo); // Draw the sprite, rotated, scaled, and swizzled as necessary. int swizzle = ship ? ship->GetGovernment()->GetSwizzle() : 0; uint32_t tex = sprite->Texture(); float pos[2] = {-170.f, -10.f}; double zoom = min(1., 200. / max(sprite->Width(), sprite->Height())); Point uw = unit * (sprite->Width() * zoom); Point uh = unit * (sprite->Height() * zoom); float tr[4] = { static_cast<float>(-uw.Y()), static_cast<float>(uw.X()), static_cast<float>(-uh.X()), static_cast<float>(-uh.Y())}; SpriteShader::Bind(); SpriteShader::Add(tex, tex, pos, tr, swizzle); SpriteShader::Unbind(); // Draw the current message. WrappedText wrap; wrap.SetAlignment(WrappedText::JUSTIFIED); wrap.SetWrapWidth(330); wrap.SetFont(FontSet::Get(14)); wrap.Wrap(message); wrap.Draw(Point(-50., -50.), *GameData::Colors().Get("medium")); }
void MapDetailPanel::DrawInfo() const { Color dimColor(.1, 0.); Color closeColor(.6, .6); Color farColor(.3, .3); Point uiPoint(Screen::Left() + 100., Screen::Top() + 45.); // System sprite goes from 0 to 90. const Sprite *systemSprite = SpriteSet::Get("ui/map system"); SpriteShader::Draw(systemSprite, uiPoint); const Font &font = FontSet::Get(14); string systemName = player.KnowsName(selectedSystem) ? selectedSystem->Name() : "Unexplored System"; font.Draw(systemName, uiPoint + Point(-90., -7.), closeColor); governmentY = uiPoint.Y() + 10.; string gov = player.HasVisited(selectedSystem) ? selectedSystem->GetGovernment()->GetName() : "Unknown Government"; font.Draw(gov, uiPoint + Point(-90., 13.), (commodity == SHOW_GOVERNMENT) ? closeColor : farColor); if(commodity == SHOW_GOVERNMENT) PointerShader::Draw(uiPoint + Point(-90., 20.), Point(1., 0.), 10., 10., 0., closeColor); uiPoint.Y() += 115.; planetY.clear(); if(player.HasVisited(selectedSystem)) { set<const Planet *> shown; const Sprite *planetSprite = SpriteSet::Get("ui/map planet"); for(const StellarObject &object : selectedSystem->Objects()) if(object.GetPlanet()) { // Allow the same "planet" to appear multiple times in one system. auto it = shown.find(object.GetPlanet()); if(it != shown.end()) continue; shown.insert(object.GetPlanet()); SpriteShader::Draw(planetSprite, uiPoint); planetY[object.GetPlanet()] = uiPoint.Y() - 60; font.Draw(object.Name(), uiPoint + Point(-70., -52.), object.GetPlanet() == selectedPlanet ? closeColor : farColor); font.Draw("Space Port", uiPoint + Point(-60., -32.), object.GetPlanet()->HasSpaceport() ? closeColor : dimColor); font.Draw("Shipyard", uiPoint + Point(-60., -12.), object.GetPlanet()->HasShipyard() ? closeColor : dimColor); if(commodity == SHOW_SHIPYARD) PointerShader::Draw(uiPoint + Point(-60., -5.), Point(1., 0.), 10., 10., 0., closeColor); font.Draw("Outfitter", uiPoint + Point(-60., 8.), object.GetPlanet()->HasOutfitter() ? closeColor : dimColor); if(commodity == SHOW_OUTFITTER) PointerShader::Draw(uiPoint + Point(-60., 15.), Point(1., 0.), 10., 10., 0., closeColor); bool hasVisited = player.HasVisited(object.GetPlanet()); font.Draw(hasVisited ? "(has been visited)" : "(not yet visited)", uiPoint + Point(-70., 28.), farColor); if(commodity == SHOW_VISITED) PointerShader::Draw(uiPoint + Point(-70., 35.), Point(1., 0.), 10., 10., 0., closeColor); uiPoint.Y() += 130.; } } uiPoint.Y() += 45.; tradeY = uiPoint.Y() - 95.; // Trade sprite goes from 310 to 540. const Sprite *tradeSprite = SpriteSet::Get("ui/map trade"); SpriteShader::Draw(tradeSprite, uiPoint); uiPoint.X() -= 90.; uiPoint.Y() -= 97.; for(const Trade::Commodity &commodity : GameData::Commodities()) { bool isSelected = false; if(static_cast<unsigned>(this->commodity) < GameData::Commodities().size()) isSelected = (&commodity == &GameData::Commodities()[this->commodity]); Color &color = isSelected ? closeColor : farColor; font.Draw(commodity.name, uiPoint, color); string price; bool hasVisited = player.HasVisited(selectedSystem); if(hasVisited && selectedSystem->IsInhabited()) { int value = selectedSystem->Trade(commodity.name); int localValue = (player.GetSystem() ? player.GetSystem()->Trade(commodity.name) : 0); if(!player.GetSystem() || player.GetSystem() == selectedSystem || !value || !localValue) price = to_string(value); else { value -= localValue; price += "("; if(value > 0) price += '+'; price += to_string(value); price += ")"; } } else price = (hasVisited ? "n/a" : "?"); Point pos = uiPoint + Point(140. - font.Width(price), 0.); font.Draw(price, pos, color); if(isSelected) PointerShader::Draw(uiPoint + Point(0., 7.), Point(1., 0.), 10., 10., 0., color); uiPoint.Y() += 20.; } if(selectedPlanet && !selectedPlanet->Description().empty() && player.HasVisited(selectedPlanet)) { const Sprite *panelSprite = SpriteSet::Get("ui/description panel"); Point pos(Screen::Right() - .5 * panelSprite->Width(), Screen::Top() + .5 * panelSprite->Height()); SpriteShader::Draw(panelSprite, pos); WrappedText text; text.SetFont(FontSet::Get(14)); text.SetAlignment(WrappedText::JUSTIFIED); text.SetWrapWidth(480); text.Wrap(selectedPlanet->Description()); text.Draw(Point(Screen::Right() - 500, Screen::Top() + 20), closeColor); } // Draw the buttons. Information info; info.SetCondition("is ports"); if(ZoomIsMax()) info.SetCondition("max zoom"); if(ZoomIsMin()) info.SetCondition("min zoom"); const Interface *interface = GameData::Interfaces().Get("map buttons"); interface->Draw(info, Point(-250., 0.)); }