InfoPanel::InfoPanel(PlayerInfo &player, bool showFlagship) : player(player), shipIt(player.Ships().begin()), showShip(showFlagship), canEdit(player.GetPlanet()) { SetInterruptible(false); if(showFlagship) while(shipIt != player.Ships().end() && shipIt->get() != player.Flagship()) ++shipIt; UpdateInfo(); }
InfoPanel::InfoPanel(PlayerInfo &player) : player(player), shipIt(player.Ships().begin()), showShip(false), canEdit(player.GetPlanet()) { SetInterruptible(false); UpdateInfo(); }
// Check if this action can be completed right now. It cannot be completed // if it takes away money or outfits that the player does not have. bool MissionAction::CanBeDone(const PlayerInfo &player) const { if(player.Accounts().Credits() < -payment) return false; const Ship *flagship = player.Flagship(); for(const auto &it : gifts) { if(it.second > 0) continue; // The outfit can be taken from the player's cargo or from the flagship. int available = player.Cargo().Get(it.first); for(const auto &ship : player.Ships()) available += ship->Cargo().Get(it.first); if(flagship) available += flagship->OutfitCount(it.first); // If the gift "count" is 0, that means to check that the player has at // least one of these items. if(available < -it.second + !it.second) return false; } return true; }
ShipInfoPanel::ShipInfoPanel(PlayerInfo &player, int index) : player(player), shipIt(player.Ships().begin()), canEdit(player.GetPlanet()) { SetInterruptible(false); // If a valid ship index was given, show that ship. if(static_cast<unsigned>(index) < player.Ships().size()) shipIt += index; else if(player.Flagship()) { // Find the player's flagship. It may not be first in the list, if the // first item in the list cannot be a flagship. while(shipIt != player.Ships().end() && shipIt->get() != player.Flagship()) ++shipIt; } UpdateInfo(); }
bool Mission::CanComplete(const PlayerInfo &player) const { if(player.GetPlanet() != destination || !waypoints.empty()) return false; if(!toComplete.Test(player.Conditions())) return false; auto it = actions.find(COMPLETE); if(it != actions.end() && !it->second.CanBeDone(player)) return false; for(const NPC &npc : npcs) if(!npc.HasSucceeded(player.GetSystem())) return false; // If any of the cargo for this mission is being carried by a ship that is // not in this system, the mission cannot be completed right now. for(const auto &ship : player.Ships()) if(ship->GetSystem() != player.GetSystem() && ship->Cargo().Get(this)) return false; return true; }
// Check to see if the player has done anything they should be fined for. string Politics::Fine(PlayerInfo &player, const Government *gov, int scan, const Ship *target, double security) { // Do nothing if you have already been fined today, or if you evade // detection. auto it = fined.find(gov); if(it != fined.end() || Random::Real() > security || !gov->GetFineFraction()) return ""; string reason; int64_t maxFine = 0; for(const shared_ptr<Ship> &ship : player.Ships()) { // Check if the ship evades being scanned due to interference plating. if(Random::Real() > 1. / (1. + ship->Attributes().Get("scan interference"))) continue; if(target && target != &*ship) continue; if(ship->GetSystem() != player.GetSystem()) continue; if(!scan || (scan & ShipEvent::SCAN_CARGO)) { int64_t fine = ship->Cargo().IllegalCargoFine(); if((fine > maxFine && maxFine >= 0) || fine < 0) { maxFine = fine; reason = "carrying illegal cargo."; } } if(!scan || (scan & ShipEvent::SCAN_OUTFITS)) { for(const auto &it : ship->Outfits()) if(it.second) { int64_t fine = it.first->Get("illegal"); if((fine > maxFine && maxFine >= 0) || fine < 0) { maxFine = fine; reason = "having illegal outfits installed on your ship."; } } } } if(maxFine < 0) { gov->Offend(ShipEvent::ATROCITY); if(!scan) reason = "atrocity"; else reason = "After scanning your ship, the " + gov->GetName() + " captain hails you with a grim expression on his face. He says, \"You are guilty of " + reason + " The penalty for your actions is death. Goodbye.\""; } else if(maxFine > 0) { // Scale the fine based on how lenient this government is. maxFine = maxFine * gov->GetFineFraction() + .5; reason = "The " + gov->GetName() + " fines you " + Format::Number(maxFine) + " credits for " + reason; player.Accounts().AddFine(maxFine); fined.insert(gov); } return reason; }
void AI::UpdateKeys(PlayerInfo &player, bool isActive) { shift = (SDL_GetModState() & KMOD_SHIFT); Command oldHeld = keyHeld; keyHeld.ReadKeyboard(); keyDown = keyHeld.AndNot(oldHeld); if(keyHeld.Has(AutopilotCancelKeys())) keyStuck.Clear(); if(keyStuck.Has(Command::JUMP) && !player.HasTravelPlan()) keyStuck.Clear(Command::JUMP); const Ship *flagship = player.Flagship(); if(!isActive || !flagship || flagship->IsDestroyed()) return; // Only toggle the "cloak" command if one of your ships has a cloaking device. if(keyDown.Has(Command::CLOAK)) for(const auto &it : player.Ships()) if(it->Attributes().Get("cloak")) { isCloaking = !isCloaking; Messages::Add(isCloaking ? "Engaging cloaking device." : "Disengaging cloaking device."); break; } // Toggle your secondary weapon. if(keyDown.Has(Command::SELECT)) player.SelectNext(); // The commands below here only apply if you have escorts or fighters. if(player.Ships().size() < 2) return; // Only toggle the "deploy" command if one of your ships has fighter bays. if(keyDown.Has(Command::DEPLOY)) for(const auto &it : player.Ships()) if(it->HasBays()) { isLaunching = !isLaunching; Messages::Add(isLaunching ? "Deploying fighters" : "Recalling fighters."); break; } shared_ptr<Ship> target = flagship->GetTargetShip(); if(keyDown.Has(Command::FIGHT) && target) { sharedTarget = target; holdPosition = false; moveToMe = false; Messages::Add("All your ships are focusing their fire on \"" + target->Name() + "\"."); } if(keyDown.Has(Command::HOLD)) { sharedTarget.reset(); holdPosition = !holdPosition; moveToMe = false; Messages::Add(holdPosition ? "Your fleet is holding position." : "Your fleet is no longer holding position."); } if(keyDown.Has(Command::GATHER)) { sharedTarget.reset(); holdPosition = false; moveToMe = !moveToMe; Messages::Add(moveToMe ? "Your fleet is gathering around your flagship." : "Your fleet is no longer gathering around your flagship."); } if(sharedTarget.lock() && sharedTarget.lock()->IsDisabled()) sharedTarget.reset(); }