void GameEvent::Apply(PlayerInfo &player) { // Serialize the current reputation with other governments. player.SetReputationConditions(); // Apply this event's ConditionSet to the player's conditions. conditionsToApply.Apply(player.Conditions()); // Apply (and store a record of applying) this event's other general // changes (e.g. updating an outfitter's inventory). player.AddChanges(changes); // Update the current reputation with other governments (e.g. this // event's ConditionSet may have altered some reputations). player.CheckReputationConditions(); for(const System *system : systemsToUnvisit) player.Unvisit(system); for(const Planet *planet : planetsToUnvisit) player.Unvisit(planet); // Perform visits after unvisits, as "unvisit <system>" // will unvisit any planets in that system. for(const System *system : systemsToVisit) player.Visit(system); for(const Planet *planet : planetsToVisit) player.Visit(planet); }
void MissionAction::Do(PlayerInfo &player, UI *ui, const System *destination) const { bool isOffer = (trigger == "offer"); if(!conversation.IsEmpty() && ui) { ConversationPanel *panel = new ConversationPanel(player, conversation, destination); if(isOffer) panel->SetCallback(&player, &PlayerInfo::MissionCallback); ui->Push(panel); } else if(!dialogText.empty() && ui) { map<string, string> subs; subs["<first>"] = player.FirstName(); subs["<last>"] = player.LastName(); if(player.Flagship()) subs["<ship>"] = player.Flagship()->Name(); string text = Format::Replace(dialogText, subs); if(isOffer) ui->Push(new Dialog(text, player, destination)); else ui->Push(new Dialog(text)); } else if(isOffer && ui) player.MissionCallback(Conversation::ACCEPT); // If multiple outfits are being transferred, first remove them before // adding any new ones. for(const auto &it : gifts) if(it.second < 0) DoGift(player, it.first, it.second, ui); for(const auto &it : gifts) if(it.second > 0) DoGift(player, it.first, it.second, ui); if(payment) player.Accounts().AddCredits(payment); for(const auto &it : events) player.AddEvent(*GameData::Events().Get(it.first), player.GetDate() + it.second); if(!fail.empty()) { // Failing missions invalidates iterators into the player's mission list, // but does not immediately delete those missions. So, the safe way to // iterate over all missions is to make a copy of the list before we // begin to remove items from it. vector<const Mission *> failedMissions; for(const Mission &mission : player.Missions()) if(fail.count(mission.Identifier())) failedMissions.push_back(&mission); for(const Mission *mission : failedMissions) player.RemoveMission(Mission::FAIL, *mission, ui); } // Check if applying the conditions changes the player's reputations. player.SetReputationConditions(); conditions.Apply(player.Conditions()); player.CheckReputationConditions(); }