/// <summary> /// Transfers this package to a target empire. /// </summary> /// <param name="target"></param> public void Transfer(Empire target) { var errors = Errors.ToArray(); if (errors.Any()) { throw new Exception("Attempting to transfer an invalid package (" + this + "): " + errors.First()); } foreach (var c in TreatyClauses) { Galaxy.Current.GetReferrable(c).IsInEffect = true; } foreach (var p in Planets) { p.Colony.Owner = target; } foreach (var v in Vehicles) { v.Owner = target; } Owner.StoredResources -= Resources; target.StoredResources += Resources; foreach (var kvp in Technology) { if (target.ResearchedTechnologies[kvp.Key] < kvp.Value) { // research the tech and reset progress to next level target.ResearchedTechnologies[kvp.Key] = kvp.Value; var progress = target.ResearchProgress.SingleOrDefault(p => p.Item == kvp.Key); if (progress != null) { progress.Value = 0; } } } foreach (var sys in StarCharts) { foreach (var kvp in Owner.Memory) { // copy memory of system and everything in it if (kvp.Value == sys || kvp.Value is ISpaceObject && ((ISpaceObject)kvp.Value).StarSystem == sys) { var copy = kvp.Value.CopyAndAssignNewID(); target.Memory.Add(kvp.Key, copy); } } } foreach (var emp in CommunicationChannels) { target.EncounteredEmpires.Add(emp); // not two way, you'll have to gift your own comms channels to the target to let them talk to you! } // TODO - get max treaty clause happiness change and only apply that? if (TreatyClauses.OfType <AllianceClause>().Any()) { var cs = TreatyClauses.OfType <AllianceClause>(); if (cs.Any(c => c.AllianceLevel >= AllianceLevel.DefensivePact)) { Recipient.TriggerHappinessChange(hm => hm.TreatyMilitaryAlliance); } else if (cs.Any(c => c.AllianceLevel >= AllianceLevel.NonAggression)) { Recipient.TriggerHappinessChange(hm => hm.TreatyNonAggression); } else if (cs.Any(c => c.AllianceLevel >= AllianceLevel.NeutralZone)) { Recipient.TriggerHappinessChange(hm => hm.TreatyNonIntercourse); } } if (TreatyClauses.OfType <CooperativeResearchClause>().Any()) { Recipient.TriggerHappinessChange(hm => hm.TreatyTradeAndResearch); } if (TreatyClauses.OfType <FreeTradeClause>().Any()) { Recipient.TriggerHappinessChange(hm => hm.TreatyTrade); } if (TreatyClauses.OfType <TributeClause>().Any()) { Recipient.TriggerHappinessChange(hm => hm.TreatyProtectorateDominant); Owner.TriggerHappinessChange(hm => hm.TreatyProtectorateSubordinate); } if (TreatyClauses.OfType <ShareAbilityClause>().Any() || TreatyClauses.OfType <ShareCombatLogsClause>().Any() || TreatyClauses.OfType <ShareDesignsClause>().Any() || TreatyClauses.OfType <ShareVisionClause>().Any()) { Recipient.TriggerHappinessChange(hm => hm.TreatyPartnership); } }
public override string ToString() { var items = new List <string>(); if (TreatyClauses.Any()) { if (TreatyClauses.Count == 1) { items.Add(TreatyClauses.Single().ToString()); } else { items.Add(TreatyClauses.Count + " treaty clauses"); } } if (Planets.Any()) { if (Planets.Count == 1) { items.Add(Planets.Single().ToString()); } else { items.Add(Planets.Count + " planets"); } } if (Vehicles.Any()) { if (Vehicles.Count == 1) { items.Add(Vehicles.Single().ToString()); } else { items.Add(Vehicles.Count + " vehicles"); } } if (Resources.Any(kvp => kvp.Value != 0)) { items.Add(Resources.ToString()); } if (Technology.Any()) { if (Technology.Count == 1) { var kvp = Technology.Single(); items.Add(kvp.Key + " to level " + kvp.Value); } else { items.Add(Technology.Count + " technologies"); } } if (StarCharts.Any()) { if (StarCharts.Count == 1) { items.Add("the star chart for " + StarCharts.Single().ToString()); } else { items.Add(StarCharts.Count + " star charts"); } } if (CommunicationChannels.Any()) { if (CommunicationChannels.Count == 1) { items.Add("comm channels to " + CommunicationChannels.Single().ToString()); } else { items.Add(CommunicationChannels.Count + " comm channels"); } } if (!items.Any()) { return("nothing"); } return(string.Join(", ", items.ToArray())); }