public static DiaNode FactionDialogFor(Pawn negotiator, Faction faction)
        {
            Map    map = negotiator.Map;
            Pawn   p;
            string text;

            if (faction.leader != null)
            {
                p    = faction.leader;
                text = faction.leader.Name.ToStringFull;
            }
            else
            {
                Log.Error("Faction " + faction + " has no leader.", false);
                p    = negotiator;
                text = faction.Name;
            }
            DiaNode diaNode;

            if (faction.PlayerRelationKind == FactionRelationKind.Hostile)
            {
                string key;
                if (!faction.def.permanentEnemy && "FactionGreetingHostileAppreciative".CanTranslate())
                {
                    key = "FactionGreetingHostileAppreciative";
                }
                else
                {
                    key = "FactionGreetingHostile";
                }
                diaNode = new DiaNode(key.Translate(text).AdjustedFor(p, "PAWN"));
            }
            else if (faction.PlayerRelationKind == FactionRelationKind.Neutral)
            {
                diaNode = new DiaNode("FactionGreetingWary".Translate(text, negotiator.LabelShort, negotiator.Named("NEGOTIATOR"), p.Named("LEADER")).AdjustedFor(p, "PAWN"));
            }
            else
            {
                diaNode = new DiaNode("FactionGreetingWarm".Translate(text, negotiator.LabelShort, negotiator.Named("NEGOTIATOR"), p.Named("LEADER")).AdjustedFor(p, "PAWN"));
            }
            if (map != null && map.IsPlayerHome)
            {
                diaNode.options.Add(ReinforcementDialogMakerRC.RequestFreeReinforcements(map, faction, negotiator));
                //If the faction is of a tech level that is industrial or higher...
                if (!(faction.def.techLevel < TechLevel.Spacer))
                {
                    diaNode.options.Add(ReinforcementDialogMakerRC.RequestQuickReactionReinforcements(map, faction, negotiator));
                    diaNode.options.Add(ReinforcementDialogMakerRC.RequestStrongQuickReactionReinforcements(map, faction, negotiator));
                }
            }
            DiaOption diaOption = new DiaOption("(" + "Disconnect".Translate() + ")")
            {
                resolveTree = true
            };

            diaNode.options.Add(diaOption);
            return(diaNode);
        }
 private static Func <DiaNode> ResetToRoot(Faction faction, Pawn negotiator)
 {
     return(() => ReinforcementDialogMakerRC.FactionDialogFor(negotiator, faction));
 }
        public static DiaOption RequestStrongQuickReactionReinforcements(Map map, Faction faction, Pawn negotiator)
        {
            int       silverToPay    = 900;
            int       goodWillNeeded = 25;
            string    text           = "RequestHeavyPaidMilitaryAidRH".Translate(silverToPay);
            DiaOption result;

            if (faction.PlayerRelationKind != FactionRelationKind.Ally && faction.PlayerGoodwill < goodWillNeeded)
            {
                DiaOption diaOption = new DiaOption(text);
                diaOption.Disable("NeedGoodwill".Translate(goodWillNeeded.ToString("F0")));
                result = diaOption;
            }
            else if (ReinforcementDialogMakerRC.AmountSendableSilver(map) < silverToPay)
            {
                DiaOption diaOption3 = new DiaOption(text);
                diaOption3.Disable("NeedSilverLaunchable".Translate(silverToPay.ToString()));
                result = diaOption3;
            }
            else if (!faction.def.allowedArrivalTemperatureRange.ExpandedBy(-4f).Includes(map.mapTemperature.SeasonalTemp))
            {
                DiaOption diaOption2 = new DiaOption(text);
                diaOption2.Disable("BadTemperature".Translate());
                result = diaOption2;
            }
            else
            {
                int num = faction.lastMilitaryAidRequestTick + 90000 - Find.TickManager.TicksGame;
                if (num > 0)
                {
                    DiaOption diaOption3 = new DiaOption(text);
                    diaOption3.Disable("WaitTime".Translate(num.ToStringTicksToPeriod()));
                    result = diaOption3;
                }
                else if (NeutralGroupIncidentUtility.AnyBlockingHostileLord(map, faction))
                {
                    DiaOption diaOption4 = new DiaOption(text);
                    diaOption4.Disable("HostileVisitorsPresent".Translate());
                    result = diaOption4;
                }
                else
                {
                    DiaOption             diaOption5 = new DiaOption(text);
                    IEnumerable <Faction> source     = (from x in map.attackTargetsCache.TargetsHostileToColony
                                                        where GenHostility.IsActiveThreatToPlayer(x)
                                                        select((Thing)x).Faction into x
                                                        where x != null && !x.HostileTo(faction)
                                                        select x).Distinct <Faction>();
                    if (source.Any <Faction>())
                    {
                        DiaNode diaNode = new DiaNode("MilitaryAidConfirmMutualEnemy".Translate(faction.Name, (from fa in source
                                                                                                               select fa.Name).ToCommaList(true)));
                        DiaOption diaOption6 = new DiaOption("CallConfirm".Translate())
                        {
                            action = delegate()
                            {
                                ReinforcementDialogMakerRC.CallForStrongAid(map, faction);
                            },
                            resolveTree = true
                        };
                        DiaOption diaOption7 = new DiaOption("CallCancel".Translate())
                        {
                            linkLateBind = ReinforcementDialogMakerRC.ResetToRoot(faction, negotiator)
                        };
                        diaNode.options.Add(diaOption6);
                        diaNode.options.Add(diaOption7);
                        diaOption5.link = diaNode;
                    }
                    else
                    {
                        diaOption5.action = delegate()
                        {
                            TradeUtility.LaunchThingsOfType(ThingDefOf.Silver, silverToPay, map, null);
                            ReinforcementDialogMakerRC.CallForStrongAid(map, faction);
                        };
                        diaOption5.resolveTree = true;
                    }
                    result = diaOption5;
                }
            }
            return(result);
        }
        public void OpenCommsWith(Pawn negotiator, Faction faction)
        {
            Dialog_Negotiation dialog_Negotiation = new Dialog_Negotiation(negotiator, faction, ReinforcementDialogMakerRC.FactionDialogFor(negotiator, faction), true);

            //dialog_Negotiation.soundAmbient = RCDefsOf.AmbientRequisitionRelayRH;
            SoundStarter.PlayOneShot(RCDefsOf.PickUpRequisitionRelayRH, SoundInfo.OnCamera());
            Find.WindowStack.Add(dialog_Negotiation);
        }