Example #1
0
        /// <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);
            }
        }
Example #2
0
        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()));
        }