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 BoardingPanel::Draw() const { DrawBackdrop(); // Draw the list of plunder. Color opaque(.1, 1.); Color back = *GameData::Colors().Get("faint"); Color dim = *GameData::Colors().Get("dim"); Color medium = *GameData::Colors().Get("medium"); Color bright = *GameData::Colors().Get("bright"); FillShader::Fill(Point(-155., -60.), Point(360., 250.), opaque); int index = (scroll - 10) / 20; int y = -170 - scroll + 20 * index; int endY = 60; const Font &font = FontSet::Get(14); double fontOff = .5 * (20 - font.Height()); int freeSpace = you->Cargo().Free(); for( ; y < endY && static_cast<unsigned>(index) < plunder.size(); y += 20, ++index) { const Plunder &item = plunder[index]; bool isSelected = (index == selected); if(isSelected) FillShader::Fill(Point(-155., y + 10.), Point(360., 20.), back); const Color &color = item.CanTake(freeSpace) ? isSelected ? bright : medium : dim; Point pos(-320., y + fontOff); font.Draw(item.Name(), pos, color); Point valuePos(pos.X() + 260. - font.Width(item.Value()), pos.Y()); font.Draw(item.Value(), valuePos, color); Point sizePos(pos.X() + 330. - font.Width(item.Size()), pos.Y()); font.Draw(item.Size(), sizePos, color); } Information info; if(CanExit()) info.SetCondition("can exit"); if(CanTake()) info.SetCondition("can take"); if(CanCapture()) info.SetCondition("can capture"); if(CanAttack() && you->Crew() > 1) info.SetCondition("can attack"); if(CanAttack()) info.SetCondition("can defend"); // This should always be true, but double check. int crew = 0; if(you) { const Ship &ship = *you; crew = ship.Crew(); info.SetString("cargo space", to_string(freeSpace)); info.SetString("your crew", to_string(crew)); info.SetString("your attack", Round(attackOdds.AttackerPower(crew))); info.SetString("your defense", Round(defenseOdds.DefenderPower(crew))); } int vCrew = victim->Crew(); info.SetString("enemy crew", to_string(vCrew)); info.SetString("enemy attack", Round(defenseOdds.AttackerPower(vCrew))); info.SetString("enemy defense", Round(attackOdds.DefenderPower(vCrew))); info.SetString("attack odds", Round(100. * attackOdds.Odds(crew, vCrew)) + "%"); info.SetString("attack casualties", Round(attackOdds.AttackerCasualties(crew, vCrew))); info.SetString("defense odds", Round(100. * (1. - defenseOdds.Odds(vCrew, crew))) + "%"); info.SetString("defense casualties", Round(defenseOdds.DefenderCasualties(vCrew, crew))); const Interface *interface = GameData::Interfaces().Get("boarding"); interface->Draw(info); Point messagePos(50., 55.); for(const string &message : messages) { font.Draw(message, messagePos, bright); messagePos.Y() += 20.; } }
void HiringPanel::Draw() const { if(!player.Flagship()) return; const Ship &flagship = *player.Flagship(); // Draw a line in the same place as the trading and bank panels. FillShader::Fill(Point(-60., 95.), Point(480., 1.), *GameData::Colors().Get("medium")); const Interface *interface = GameData::Interfaces().Get("hiring"); Information info; int flagshipBunks = flagship.Attributes().Get("bunks"); int flagshipRequired = flagship.RequiredCrew(); int flagshipExtra = flagship.Crew() - flagshipRequired; int flagshipUnused = flagshipBunks - flagship.Crew(); info.SetString("flagship bunks", to_string(static_cast<int>(flagshipBunks))); info.SetString("flagship required", to_string(static_cast<int>(flagshipRequired))); info.SetString("flagship extra", to_string(static_cast<int>(flagshipExtra))); info.SetString("flagship unused", to_string(static_cast<int>(flagshipUnused))); // Sum up the statistics for all your ships. int fleetBunks = 0; int fleetRequired = 0; for(const shared_ptr<Ship> &ship : player.Ships()) if(!ship->IsParked()) { fleetBunks += static_cast<int>(ship->Attributes().Get("bunks")); fleetRequired += ship->RequiredCrew(); } int passengers = player.Cargo().Passengers(); int fleetUnused = fleetBunks - fleetRequired - flagshipExtra; info.SetString("fleet bunks", to_string(static_cast<int>(fleetBunks))); info.SetString("fleet required", to_string(static_cast<int>(fleetRequired))); info.SetString("fleet unused", to_string(static_cast<int>(fleetUnused))); info.SetString("passengers", to_string(static_cast<int>(passengers))); static const int DAILY_SALARY = 100; int salary = DAILY_SALARY * (fleetRequired - 1); int extraSalary = DAILY_SALARY * flagshipExtra; info.SetString("salary required", to_string(static_cast<int>(salary))); info.SetString("salary extra", to_string(static_cast<int>(extraSalary))); int modifier = Modifier(); if(modifier > 1) info.SetString("modifier", "x " + to_string(modifier)); maxFire = max(flagshipExtra, 0); maxHire = min(flagshipUnused, fleetUnused - passengers); if(maxHire) info.SetCondition("can hire"); if(maxFire) info.SetCondition("can fire"); interface->Draw(info); }
// Draw the panel. void BoardingPanel::Draw() const { // Draw a translucent black scrim over everything beneath this panel. DrawBackdrop(); // Draw the list of plunder. Color opaque(.1, 1.); Color back = *GameData::Colors().Get("faint"); Color dim = *GameData::Colors().Get("dim"); Color medium = *GameData::Colors().Get("medium"); Color bright = *GameData::Colors().Get("bright"); FillShader::Fill(Point(-155., -60.), Point(360., 250.), opaque); int index = (scroll - 10) / 20; int y = -170 - scroll + 20 * index; int endY = 60; const Font &font = FontSet::Get(14); // Y offset to center the text in a 20-pixel high row. double fontOff = .5 * (20 - font.Height()); int freeSpace = you->Cargo().Free(); for( ; y < endY && static_cast<unsigned>(index) < plunder.size(); y += 20, ++index) { const Plunder &item = plunder[index]; // Check if this is the selected row. bool isSelected = (index == selected); if(isSelected) FillShader::Fill(Point(-155., y + 10.), Point(360., 20.), back); // Color the item based on whether you have space for it. const Color &color = item.CanTake(freeSpace) ? isSelected ? bright : medium : dim; Point pos(-320., y + fontOff); font.Draw(item.Name(), pos, color); Point valuePos(pos.X() + 260. - font.Width(item.Value()), pos.Y()); font.Draw(item.Value(), valuePos, color); Point sizePos(pos.X() + 330. - font.Width(item.Size()), pos.Y()); font.Draw(item.Size(), sizePos, color); } // Set which buttons are active. Information info; if(CanExit()) info.SetCondition("can exit"); if(CanTake()) info.SetCondition("can take"); if(CanCapture()) info.SetCondition("can capture"); if(CanAttack() && (you->Crew() > 1 || !victim->RequiredCrew())) info.SetCondition("can attack"); if(CanAttack()) info.SetCondition("can defend"); // This should always be true, but double check. int crew = 0; if(you) { crew = you->Crew(); info.SetString("cargo space", to_string(freeSpace)); info.SetString("your crew", to_string(crew)); info.SetString("your attack", Round(attackOdds.AttackerPower(crew))); info.SetString("your defense", Round(defenseOdds.DefenderPower(crew))); } if(victim->IsCapturable()) { int vCrew = victim->Crew(); info.SetString("enemy crew", to_string(vCrew)); info.SetString("enemy attack", Round(defenseOdds.AttackerPower(vCrew))); info.SetString("enemy defense", Round(attackOdds.DefenderPower(vCrew))); info.SetString("attack odds", Round(100. * attackOdds.Odds(crew, vCrew)) + "%"); info.SetString("attack casualties", Round(attackOdds.AttackerCasualties(crew, vCrew))); info.SetString("defense odds", Round(100. * (1. - defenseOdds.Odds(vCrew, crew))) + "%"); info.SetString("defense casualties", Round(defenseOdds.DefenderCasualties(vCrew, crew))); } const Interface *interface = GameData::Interfaces().Get("boarding"); interface->Draw(info); // Draw the status messages from hand to hand combat. Point messagePos(50., 55.); for(const string &message : messages) { font.Draw(message, messagePos, bright); messagePos.Y() += 20.; } }