public static Bulletin Create(TravelingIncidentCaravan caravan)
        {
            InterceptedIncident incident = caravan.incident;

            if (incident is InterceptedIncident_HumanCrowd)
            {
                return(new Bulletin_Human(caravan));
            }
            if (incident is InterceptedIncident_AnimalHerd)
            {
                return(new Bulletin_Animal(caravan));
            }
            if (incident is InterceptedIncident_SkyFaller)
            {
                return(new Bulletin_SkyFaller(caravan));
            }
            if (incident is InterceptedIncident_Infestation)
            {
                return(new Bulletin_Infestation(caravan));
            }
            if (incident is InterceptedIncident_SolarFlare)
            {
                return(new Bulletin_Flare(caravan));
            }
            return(null);
        }
 public static void RebuffDemandAndSmiteThePlayer(TravelingIncidentCaravan caravan, Pawn pawn)
 {
     if (!(caravan.incident is InterceptedIncident_HumanCrowd_RaidEnemy incident))
     {
         return;
     }
     caravan.Communicable = false;
     if (incident.raidGoalType == RaidGoalType.Rescue)
     {
         RaidingGoal_Rescue goal = incident.goal as RaidingGoal_Rescue;
         foreach (var p in goal.Prisoners)
         {
             p.guilt.lastGuiltyTick = Find.TickManager.TicksGame;
             ExecutionUtility.DoExecutionByCut(pawn, p);
         }
     }
     incident.goal = new RaidingGoal_Smite();
     if (pawn.skills.GetSkill(SkillDefOf.Social).Level < 5)
     {
         incident.CombatMoral = -1;
     }
     else if (pawn.skills.GetSkill(SkillDefOf.Social).Level < 10)
     {
         incident.CombatMoral = 0;
     }
     else
     {
         incident.CombatMoral = 1;
     }
 }
        public static DiaNode FriendlyNode()
        {
            TravelingIncidentCaravan caravan = DialogUtilities.tempCaravan;
            Pawn pawn = DialogUtilities.tempPawn;

            if (!(caravan.incident is InterceptedIncident_HumanCrowd_Neutral incident))
            {
                return(null);
            }

            DiaNode diaNode = new DiaNode("PES_Friendly_Greeting".Translate(caravan.CaravanTitle, pawn.Name.ToStringShort) + "\n");

            DiaNode diaNodeLeaving = new DiaNode("PES_Friendly_Dismissed".Translate());

            diaNodeLeaving.options.Add(DialogUtilities.NormalDisconnectOption());

            DiaOption option = new DiaOption("PES_Friendly_Dismiss".Translate() + "\n");

            option.link   = diaNodeLeaving;
            option.action = () => { caravan.Dismiss(); };

            diaNode.options.Add(option);
            diaNode.options.Add(DialogUtilities.NormalDisconnectOption());

            return(diaNode);
        }
 public static float ApproxTileNumBetweenCaravanTarget(TravelingIncidentCaravan caravan)
 {
     //TODO: Is this a little costly???
     return(Find.WorldGrid.ApproxDistanceInTiles(caravan.Tile, caravan.incident.parms.target.Tile));
     //Vector3 TargetCenter = Find.WorldGrid.GetTileCenter(caravan.incident.parms.target.Tile);
     //return Find.WorldGrid.ApproxDistanceInTiles(GenMath.SphericalDistance(caravan.curPos.normalized, TargetCenter.normalized));
 }
        public static DiaNode ContactCoolDownNode()
        {
            TravelingIncidentCaravan caravan = DialogUtilities.tempCaravan;
            Pawn pawn = DialogUtilities.tempPawn;

            DiaNode diaNode = new DiaNode("PES_TryContact_CoolDown".Translate(GenDate.ToStringTicksToPeriod(caravan.broadcastMessageCoolDownTick)));

            diaNode.options.Add(DialogUtilities.CurtOption("PES_Disconnect", null, null, true));
            return(diaNode);
        }
 public static void DoSparkWithBulletin(TravelingIncidentCaravan caravan)
 {
     foreach (var b in BulletinCache)
     {
         if (b.Caravan == caravan)
         {
             b.BeginSpark(3);
             return;
         }
     }
 }
        public static DiaNode RebuffNode()
        {
            TravelingIncidentCaravan caravan = DialogUtilities.tempCaravan;
            Pawn pawn = DialogUtilities.tempPawn;
            InterceptedIncident_HumanCrowd_RaidEnemy incident = caravan.incident as InterceptedIncident_HumanCrowd_RaidEnemy;

            if (incident == null)
            {
                return(null);
            }
            if (incident.raidGoalType == RaidGoalType.Smite)
            {
                return(null);
            }
            StringBuilder sb = new StringBuilder("PES_RaidNeg_Rebuff_Confirmation".Translate());

            sb.AppendLine();
            if (incident.raidGoalType == RaidGoalType.Rescue)
            {
                Log.Message(incident.raidGoalType.ToString());
                sb.AppendLine("PES_RaidNeg_Rebuff_Confirmation_Rescue".Translate());
                RaidingGoal_Rescue goal = incident.goal as RaidingGoal_Rescue;
                foreach (var p in goal.Prisoners)
                {
                    sb.AppendLine("    " + p.Name.ToStringShort);
                }
            }
            sb.AppendLine();
            sb.Append(@"<i>");
            sb.Append("PES_RaidNeg_Rebuff_Explanation".Translate(pawn.Name.ToStringShort));
            sb.Append(@"</i>");
            DiaNode diaNode = new DiaNode(sb.ToString());

            void rebuffAction()
            {
                RaidingGoalUtility.RebuffDemandAndSmiteThePlayer(caravan, pawn);
            }

            DiaOption option = new DiaOption("PES_SimpleConfirm".Translate());

            option.action      = rebuffAction;
            option.resolveTree = true;
            //if (pawn.story.WorkTagIsDisabled(WorkTags.Violent))	//Lt. Bob: 1.1 - Replaced with below
            if (pawn.WorkTagIsDisabled(WorkTags.Violent))                       //Lt. Bob: 1.1
            {
                option.Disable("PES_RaidNeg_Rebuff_Rescue_Fail".Translate());
            }
            diaNode.options.Add(option);
            diaNode.options.Add(DialogUtilities.CurtOption("PES_Cancel", null, null, true));
            return(diaNode);
        }
예제 #8
0
        public static void Make(string label, string text, LetterDef def, TravelingIncidentCaravan caravan)
        {
            var lclass = def.letterClass;

            def.letterClass = typeof(SparkUILetter);
            ChoiceLetter Letter = LetterMaker.MakeLetter(label, text, def);

            def.letterClass = lclass;
            if (Letter is SparkUILetter sLetter)
            {
                sLetter.caravan = caravan;
            }
            Find.LetterStack.ReceiveLetter(Letter);
        }
        public static bool DitectionOddsOfCaravan(TravelingIncidentCaravan caravan, out float odds)
        {
            int targetTile        = caravan.incident.parms.target.Tile;
            int remainingTiles    = Mathf.CeilToInt(ApproxTileNumBetweenCaravanTarget(caravan));
            int curDetectionRange = GetDetectionRangeOfMap(targetTile);
            int curVisionRange    = GetVisionRangeOfMap(targetTile);

            if (remainingTiles > curDetectionRange || curDetectionRange == curVisionRange)
            {
                odds = 0;
                return(false);
            }
            float C = curDetectionRange - curVisionRange;
            float y = remainingTiles - curVisionRange;

            odds  = (C - y) / C;
            odds *= PES_Settings.DetectionCoefficient;
            return(true);
        }
        public static DiaNode PrologueNode()
        {
            TravelingIncidentCaravan caravan = DialogUtilities.tempCaravan;
            Pawn pawn = DialogUtilities.tempPawn;

            if (!(caravan.incident is InterceptedIncident_HumanCrowd incident))
            {
                return(null);
            }
            if (caravan.broadcastMessageCoolDownTick > 0)
            {
                return(ContactCoolDownNode());
            }

            string prologue;
            string key;

            if (incident.IntelLevel == IncidentIntelLevel.Unknown)
            {
                key = "PES_TryContactPrologue_Unknown";
            }
            else if (incident.IntelLevel == IncidentIntelLevel.Danger)
            {
                key = "PES_TryContactPrologue_Hostile";
            }
            else
            {
                key = "PES_TryContactPrologue_Neutral";
            }
            prologue = key.Translate(caravan.CaravanTitle, pawn.Name.ToStringShort);

            DiaNode   dianode = new DiaNode(prologue);
            DiaOption option;

            option      = new DiaOption("PES_ConfirmChoice".Translate());
            option.link = BroadCastMessageChoiceNode();
            dianode.options.Add(option);

            dianode.options.Add(DialogUtilities.NormalCancelOption());

            return(dianode);
        }
예제 #11
0
 public static void BeginCaravanDialog(Pawn pawn, TravelingIncidentCaravan caravan)
 {
     tempCaravan = caravan;
     tempPawn    = pawn;
     if (!caravan.CommunicationEstablished)
     {
         OpenDialog(DialogMaker_TryToContact.PrologueNode());
     }
     else
     {
         if (caravan.incident.IntelLevel == Interceptor.IncidentIntelLevel.Danger)
         {
             OpenDialog(DialogMaker_RaidNegotiation.PrologueNode());
         }
         else if (caravan.incident.IntelLevel == Interceptor.IncidentIntelLevel.Neutral)
         {
             OpenDialog(DialogMaker_Friendly.FriendlyNode());
         }
     }
 }
        public static bool TryConfirmCaravanWithinVision(TravelingIncidentCaravan caravan)
        {
            int targetTile     = caravan.incident.parms.target.Tile;
            int remainingTiles = Mathf.CeilToInt(ApproxTileNumBetweenCaravanTarget(caravan));
            int visionRange    = GetVisionRangeOfMap(targetTile);

            if (visionRange == 0)
            {
                return(false); //if the colony has no vision, then dont do it at all
            }
            if (remainingTiles <= visionRange)
            {
                if (PES_Settings.DebugModeOn)
                {
                    Log.Message("Caravan enter vision range");
                }
                return(true);
            }
            return(false);
        }
        public static bool TryDetectIncidentCaravanDetail(TravelingIncidentCaravan caravan)
        {
            float odds = 0;

            if (!DitectionOddsOfCaravan(caravan, out odds))
            {
                return(false);
            }
            odds *= 2;
            odds  = Mathf.Clamp(odds, 0.2f, 0.95f);
            if (new FloatRange(0f, 1f).RandomInRange <= odds)
            {
                if (PES_Settings.DebugModeOn)
                {
                    if (!PES_Settings.DifficultDetect)                      //Lt.Bob - DifficultDetect
                    {
                        Log.Message("Try Detect Detail with odds " + odds + " : Success", false);
                    }
                    else
                    {
                        Log.Message("Try Detect Detail (Difficult) with odds " + odds + " : Success", false);
                    }
                }
                return(true);
            }
            if (PES_Settings.DebugModeOn)
            {
                if (!PES_Settings.DifficultDetect)                  //Lt.Bob - DifficultDetect
                {
                    Log.Message("Try Detect Detail with odds " + odds + " : Fail", false);
                }
                else
                {
                    Log.Message("Try Detect Detail (Difficult) with odds " + odds + " : Fail", false);
                }
            }
            return(false);
        }
        public static bool TryDetectIncidentCaravan(TravelingIncidentCaravan caravan)
        {
            float odds = 0;

            if (!DitectionOddsOfCaravan(caravan, out odds))
            {
                return(false);
            }
            odds = Mathf.Clamp(odds, 0.1f, 0.8f);
            if (new FloatRange(0f, 1f).RandomInRange <= odds)
            {
                if (PES_Settings.DebugModeOn)
                {
                    Log.Message("Try Detect with odds " + odds + " : Success");
                }
                return(true);
            }
            if (PES_Settings.DebugModeOn)
            {
                Log.Message("Try Detect with odds " + odds + " : Fail");
            }
            return(false);
        }
예제 #15
0
        public static DiaNode DelayNode()
        {
            TravelingIncidentCaravan caravan = DialogUtilities.tempCaravan;
            Pawn pawn = DialogUtilities.tempPawn;
            InterceptedIncident_HumanCrowd_RaidEnemy incident = caravan.incident as InterceptedIncident_HumanCrowd_RaidEnemy;

            if (incident == null)
            {
                return(null);
            }
            if (incident.raidGoalType == RaidGoalType.Smite)
            {
                return(null);
            }

            DiaNode delaySuccessNode()
            {
                DiaNode diaNode = new DiaNode("PES_RaidNeg_Delay_Success".Translate(caravan.CaravanTitle));

                diaNode.options.Add(DialogUtilities.CurtOption("PES_Reassuring", null, () => {
                    caravan.StageForThreeHours();
                    DialogUtilities.NegotiatorLearnSocial(true);
                }, true));
                return(diaNode);
            }

            DiaNode delayFailNode()
            {
                DiaNode diaNode = new DiaNode("PES_RaidNeg_Delay_Fail".Translate());

                diaNode.options.Add(DialogUtilities.CurtOption("PES_DAMNIT", null, () => {
                    caravan.ApplyDelayCoolDown();
                    DialogUtilities.NegotiatorLearnSocial(false);
                }, true));
                return(diaNode);
            }

            DiaNode delaySmiteNode()
            {
                DiaNode diaNode = new DiaNode("PES_RaidNeg_Delay_Smite".Translate());

                diaNode.options.Add(DialogUtilities.CurtOption("PES_DAMNIT", null, () =>
                {
                    caravan.Communicable = false;
                    incident.goal        = new RaidingGoal_Smite();
                    DialogUtilities.NegotiatorLearnSocial(false);
                }, true));
                return(diaNode);
            }

            DiaNode   delayNode = new DiaNode("PES_RaidNeg_Delay_Intro".Translate());
            DiaOption option;

            //Persuasion
            float         successOdds = Mathf.Clamp01(PES_Settings.BaseDelayPersuasionChance * pawn.NegotiatePowerFactor());
            StringBuilder sb          = new StringBuilder(string.Format("[{0}]: {1}\n", "PES_Persuade_noun".Translate(), "PES_RaidNeg_Delay_Persuasion".Translate()));

            sb.AppendLine(OddsIndicator(successOdds, "PES_RaidNeg_Delay_Success_Name"));
            option        = new DiaOption(sb.ToString());
            option.action = DialogUtilities.ResolveActionByOdds(successOdds, null, delaySuccessNode(), null, delayFailNode());
            delayNode.options.Add(option);

            //Intimidation
            successOdds = Mathf.Clamp01(PES_Settings.BaseDelayIntimidationSuccessChance * pawn.NegotiatePowerFactor());
            float  smiteOdds        = Mathf.Clamp01(PES_Settings.BaseDelayIntimidationSmiteChance * pawn.NegotiatePowerFactorNeg());
            string intimidationText = ("PES_RaidNeg_Delay_Intimidation_" + incident.raidGoalType.ToString()).Translate();

            sb = new StringBuilder(string.Format("[{0}]: {1}\n", "PES_intimidate_noun".Translate(), intimidationText));
            sb.AppendLine(OddsIndicator(successOdds, "PES_RaidNeg_Delay_Success_Name", smiteOdds, "PES_RaidNeg_Delay_Smite_Name"));
            option        = new DiaOption(sb.ToString());
            option.action = DialogUtilities.ResolveActionByOdds(successOdds, null, delaySuccessNode(), smiteOdds, null, delaySmiteNode(), null, delayFailNode());
            delayNode.options.Add(option);

            //Beguilement
            if (pawn.skills.GetSkill(SkillDefOf.Social).Level >= 15)
            {
                successOdds = Mathf.Clamp01(PES_Settings.BaseDelayBeguilementChance * pawn.NegotiatePowerFactor());
                string beguilementText = ("PES_RaidNeg_Delay_Beguilement_" + incident.raidGoalType.ToString()).Translate();
                sb = new StringBuilder(string.Format("[{0}]: {1}\n", "PES_beguile_noun".Translate(), beguilementText));
                sb.AppendLine(OddsIndicator(successOdds, "PES_RaidNeg_Delay_Success_Name"));
                option        = new DiaOption(sb.ToString());
                option.action = DialogUtilities.ResolveActionByOdds(successOdds, null, delaySuccessNode(), null, delayFailNode());
                delayNode.options.Add(option);
            }

            delayNode.options.Add(DialogUtilities.CurtOption("PES_Cancel", null, null, true));

            return(delayNode);
        }
예제 #16
0
        public static DiaNode RemedyDetail(Action successAction)
        {
            TravelingIncidentCaravan caravan = DialogUtilities.tempCaravan;
            Pawn pawn = DialogUtilities.tempPawn;
            InterceptedIncident_HumanCrowd_RaidEnemy incident = caravan.incident as InterceptedIncident_HumanCrowd_RaidEnemy;
            RaidingGoal goal = incident.goal;

            if (incident == null)
            {
                return(null);
            }
            if (incident.raidGoalType == RaidGoalType.Smite)
            {
                return(null);
            }

            DiaNode RemedySuccessNode()
            {
                DiaNode diaNode = new DiaNode("PES_RaidNeg_Sub_success".Translate());

                diaNode.options.Add(DialogUtilities.CurtOption("PES_Reassuring", null, () =>
                {
                    successAction();
                    caravan.ApplyNegotiationCoolDown();
                    DialogUtilities.NegotiatorLearnSocial(true);
                }, true));
                return(diaNode);
            }

            DiaNode RemedyFailNode()
            {
                DiaNode diaNode = new DiaNode("PES_RaidNeg_Sub_Fail".Translate());

                diaNode.options.Add(DialogUtilities.CurtOption("PES_ASHAME", null, () => {
                    caravan.ApplyNegotiationCoolDown();
                    DialogUtilities.NegotiatorLearnSocial(false);
                }, true));
                return(diaNode);
            }

            DiaNode RemedySmiteNode()
            {
                DiaNode diaNode = new DiaNode("PES_raidNeg_NegDeeper_Bargain_Smite".Translate());

                diaNode.options.Add(DialogUtilities.CurtOption("PES_DAMNIT", null, () =>
                {
                    caravan.Communicable = false;
                    incident.goal        = new RaidingGoal_Smite();
                    caravan.ApplyNegotiationCoolDown();
                    DialogUtilities.NegotiatorLearnSocial(false);
                }, true));
                return(diaNode);
            }

            DiaNode   remedyNode = new DiaNode("PES_RaidNeg_Sub_Intro".Translate());
            DiaOption option;

            //Persuasion
            float         successOdds = Mathf.Clamp01(PES_Settings.BaseRemedyPersuasionChance * pawn.NegotiatePowerFactor());
            StringBuilder sb          = new StringBuilder(string.Format("[{0}]: {1}\n", "PES_Persuade_noun".Translate(), goal.RemedyPersuasionStr));

            sb.AppendLine(OddsIndicator(successOdds, "PES_raidNeg_NegDeeper_Bargain_Success_Name"));
            option        = new DiaOption(sb.ToString());
            option.action = DialogUtilities.ResolveActionByOdds(successOdds, null, RemedySuccessNode(), null, RemedyFailNode());
            remedyNode.options.Add(option);

            //Intimidation
            successOdds = Mathf.Clamp01(PES_Settings.BaseRemedyIntimidationSuccessChance * pawn.NegotiatePowerFactor());
            float smiteOdds = Mathf.Clamp01(PES_Settings.BaseRemedyIntimidationSmiteChance * pawn.NegotiatePowerFactorNeg());

            sb = new StringBuilder(string.Format("[{0}]: {1}\n", "PES_intimidate_noun".Translate(), goal.RemedyIntimidationStr));
            sb.AppendLine(OddsIndicator(successOdds, "PES_raidNeg_NegDeeper_Bargain_Success_Name", smiteOdds, "PES_RaidNeg_Negdeeper_Bargain_Smite_Name"));
            option        = new DiaOption(sb.ToString());
            option.action = DialogUtilities.ResolveActionByOdds(successOdds, null, RemedySuccessNode(), smiteOdds, null, RemedySmiteNode(), null, RemedyFailNode());
            remedyNode.options.Add(option);

            //Beguilement
            if (pawn.skills.GetSkill(SkillDefOf.Social).Level >= 15)
            {
                successOdds = Mathf.Clamp01(PES_Settings.BaseRemedyBeguilementChance * pawn.NegotiatePowerFactor());
                sb          = new StringBuilder(string.Format("[{0}]: {1}\n", "PES_beguile_noun".Translate(), goal.RemedyBeguilementStr));
                sb.AppendLine(OddsIndicator(successOdds, "PES_raidNeg_NegDeeper_Bargain_Success_Name"));
                option        = new DiaOption(sb.ToString());
                option.action = DialogUtilities.ResolveActionByOdds(successOdds, null, RemedySuccessNode(), null, RemedyFailNode());
                remedyNode.options.Add(option);
            }

            remedyNode.options.Add(DialogUtilities.CurtOption("PES_Cancel", null, null, true));

            return(remedyNode);
        }
예제 #17
0
        public static DiaNode NegotiateDeepNode()
        {
            TravelingIncidentCaravan caravan = DialogUtilities.tempCaravan;
            Pawn pawn = DialogUtilities.tempPawn;
            InterceptedIncident_HumanCrowd_RaidEnemy incident = caravan.incident as InterceptedIncident_HumanCrowd_RaidEnemy;
            RaidingGoal goal = incident.goal;

            if (incident == null)
            {
                return(null);
            }
            if (incident.raidGoalType == RaidGoalType.Smite)
            {
                return(null);
            }

            DiaNode       diaNode = new DiaNode("PES_RaidNeg_NegDeeper_Prolog".Translate());
            DiaOption     option;
            StringBuilder sb;
            string        failReason;

            //surrender
            option = new DiaOption("PES_RaidNeg_NegDeeper_Surrender".Translate() + "\n");
            if (!goal.IsAchievable(out failReason))
            {
                option.disabled       = true;
                option.disabledReason = failReason;
            }
            else
            {
                DiaNode surrenderConfirmation()
                {
                    DiaNode cnode = new DiaNode("PES_RaidNeg_NegDeeper_Surrender_Comfirmation".Translate());

                    cnode.options.Add(DialogUtilities.CurtOption("PES_SimpleConfirm", null, () => { goal.Achieve(); }, true));
                    cnode.options.Add(DialogUtilities.CurtOption("PES_Cancel", null, null, true));
                    return(cnode);
                }

                option.link = surrenderConfirmation();
            }
            diaNode.options.Add(option);

            //bargain
            option = new DiaOption("PES_RaidNeg_NegDeeper_Bargain".Translate() + "\n");
            if (!goal.CanBargain(out failReason))
            {
                option.disabled       = true;
                option.disabledReason = failReason;
            }
            else if (caravan.negotiateCoolDownTick > 0)
            {
                option.Disable("PES_RaidNeg_NegCoolDown".Translate(GenDate.ToStringTicksToPeriod(caravan.negotiateCoolDownTick)));
            }
            else
            {
                DiaNode BargainNode()
                {
                    DiaNode bNode = new DiaNode("PES_RaidNeg_NegDeeper_Bargain_Intro".Translate());

                    foreach (var x in goal.BargainChoices())
                    {
                        bNode.options.Add(x);
                    }
                    bNode.options.Add(DialogUtilities.CurtOption("PES_Cancel", null, null, true));
                    return(bNode);
                }

                option.link = BargainNode();
            }
            diaNode.options.Add(option);

            //Remedy
            option = new DiaOption("PES_RaidNeg_NegDeeper_Remedy".Translate());
            if (caravan.negotiateCoolDownTick > 0)
            {
                option.Disable("PES_RaidNeg_NegCoolDown".Translate(GenDate.ToStringTicksToPeriod(caravan.negotiateCoolDownTick)));
            }
            else
            {
                DiaNode RemedyNode()
                {
                    DiaNode   rNode = new DiaNode("PES_RaidNeg_Sub_Intro".Translate());
                    DiaOption rOption;

                    if (incident.raidGoalType != RaidGoalType.Rescue)
                    {
                        rOption = new DiaOption("PES_RaidNeg_Sub_Rescue".Translate());
                        if (!RaidingGoal_Rescue.IsAvailableToIncident(incident, out failReason))
                        {
                            rOption.Disable(failReason);
                        }
                        rOption.link = RemedyDetail(() => { (new RaidingGoal_Rescue()).ApplyToIncident(incident); });
                        rNode.options.Add(rOption);
                    }

                    if (incident.raidGoalType != RaidGoalType.Extortion)
                    {
                        rOption      = new DiaOption("PES_RaidNeg_Sub_Extortion".Translate());
                        rOption.link = RemedyDetail(() => { (new RaidingGoal_Extortion()).ApplyToIncident(incident); });
                        rNode.options.Add(rOption);
                        rNode.options.Add(DialogUtilities.CurtOption("PES_Cancel", null, null, true));
                    }
                    rNode.options.Add(DialogUtilities.CurtOption("PES_Cancel", null, null, true));
                    return(rNode);
                }

                option.link = RemedyNode();
            }
            diaNode.options.Add(option);

            diaNode.options.Add(DialogUtilities.CurtOption("PES_Cancel", null, null, true));

            return(diaNode);
        }
예제 #18
0
        public static DiaNode PrologueNode()
        {
            TravelingIncidentCaravan caravan = DialogUtilities.tempCaravan;
            Pawn pawn = DialogUtilities.tempPawn;
            InterceptedIncident_HumanCrowd_RaidEnemy incident = caravan.incident as InterceptedIncident_HumanCrowd_RaidEnemy;
            RaidingGoal goal = incident.goal;

            if (incident == null)
            {
                return(null);
            }
            if (incident.raidGoalType == RaidGoalType.Smite)
            {
                return(null);
            }

            if (incident.SourceFaction == Faction.OfMechanoids)
            {
                return(DialogMaker_TryToContact.MechanoidAnswers());
            }

            StringBuilder sb = new StringBuilder("PES_RaidNeg_Proglog".Translate(caravan.CaravanTitle, incident.SourceFaction));

            sb.AppendLine();
            sb.AppendLine();

            bool polite = false;

            if (incident.raidGoalType == RaidGoalType.Rescue)
            {
                if (new FloatRange(0f, 1f).RandomInRange < 0.5f)
                {
                    polite = true;
                }
            }
            if (incident.raidGoalType == RaidGoalType.Extortion)
            {
                if (new FloatRange(0f, 1f).RandomInRange < 0.2f)
                {
                    polite = true;
                }
            }

            if (polite)
            {
                sb.Append("PES_RaidNeg_Attitude_Polite".Translate());
            }
            else
            {
                sb.Append("PES_RaidNeg_Attitude_Rude".Translate());
            }
            sb.AppendLine(goal.GoalExpStr);
            sb.AppendLine();

            if (polite)
            {
                sb.AppendLine("PES_RaidNeg_DemandSurrender_Polite".Translate());
            }
            else
            {
                sb.AppendLine("PES_RaidNeg_DemandSurrender_rude".Translate());
            }

            DiaNode diaNode = new DiaNode(sb.ToString());

            DiaOption option;

            string rebuffStr = "PES_RaidNeg_Rebuff_Head".Translate() + ("PES_RaidNeg_Rebuff_" + incident.raidGoalType.ToString()).Translate() + "\n";

            option      = new DiaOption(rebuffStr);
            option.link = RebuffNode();
            diaNode.options.Add(option);

            option      = new DiaOption("PES_RaidNeg_NegDeeper".Translate() + "\n");
            option.link = NegotiateDeepNode();

            diaNode.options.Add(option);

            option      = new DiaOption("PES_RaidNeg_Delay".Translate() + "\n");
            option.link = DelayNode();
            if (caravan.stageRemainingTick > 0)
            {
                option.Disable("PES_RaidNeg_Delay_Staging".Translate(GenDate.ToStringTicksToPeriod(caravan.stageRemainingTick)));
            }
            else if (caravan.StagedBefore)
            {
                option.Disable("PES_RaidNeg_Delay_DoneBefore".Translate());
            }
            else if (caravan.delayCoolDownTick > 0)
            {
                option.Disable("PES_RaidNeg_Delay_CoolDown".Translate(GenDate.ToStringTicksToPeriod(caravan.delayCoolDownTick)));
            }
            diaNode.options.Add(option);

            diaNode.options.Add(DialogUtilities.CurtOption("PES_Cancel", null, null, true));
            return(diaNode);
        }
 public Bulletin_Flare(TravelingIncidentCaravan travelingIncidentCaravan)
 {
     Caravan       = travelingIncidentCaravan;
     simpleCaravan = travelingIncidentCaravan as TravelingIncidentCaravan_Simple;
 }
        public static DiaNode BroadCastMessageChoiceNode()
        {
            TravelingIncidentCaravan caravan = DialogUtilities.tempCaravan;
            Pawn pawn = DialogUtilities.tempPawn;

            if (!(caravan.incident is InterceptedIncident_HumanCrowd incident))
            {
                return(null);
            }

            string intro;

            if (incident.faction_revealed && incident.SourceFaction == Faction.OfMechanoids)
            {
                intro = "PES_BroadCastMessage_Mechanoid".Translate();
            }
            else
            {
                intro = "PES_BroadCastMessage".Translate(pawn.Name.ToStringShort);
            }

            DiaNode   diaNode = new DiaNode(intro);
            DiaOption option;

            //Mechanoid
            if (incident.faction_revealed && incident.SourceFaction == Faction.OfMechanoids)
            {
                option = new DiaOption("PES_TryContactPrologue_Mechanoid".Translate())
                {
                    link = MechanoidAnswers()
                };
                diaNode.options.Add(option);
            }
            else
            {
                string key;
                void CommEstablishAction()
                {
                    caravan.EstablishCommunication(); caravan.ApplyBroadCastCoolDown(); DialogUtilities.NegotiatorLearnSocial(true);
                }

                void LeaveAction()
                {
                    caravan.Dismiss(); caravan.ApplyBroadCastCoolDown(); DialogUtilities.NegotiatorLearnSocial(true);
                }

                void LeaveActionBad()
                {
                    caravan.Dismiss(); caravan.ApplyBroadCastCoolDown(); DialogUtilities.NegotiatorLearnSocial(false);
                }

                void FailAction()
                {
                    caravan.ApplyBroadCastCoolDown(); DialogUtilities.NegotiatorLearnSocial(false);
                }

                float MessageOdds = incident.SourceFaction == Faction.OfMechanoids ? 0f : DialogUtilities.MessageReceiveChance;

                #region Persuasion
                StringBuilder sb = new StringBuilder(string.Format(@"<b>[{0}]</b>  ", "PES_Persuade_noun".Translate().CapitalizeFirst()));

                //Odds
                float friendlyOdds = Mathf.Clamp01(PES_Settings.BasePersuadeChance_Friendly * pawn.NegotiatePowerFactor());
                float hostileOdds  = Mathf.Clamp01(PES_Settings.BasePersuadeChance_Hostile * pawn.NegotiatePowerFactor());

                //Choices
                if (incident.IntelLevel == IncidentIntelLevel.Unknown)
                {
                    key = "PES_TryContact_Persuasion_Unknown";
                    sb.AppendLine(string.Format(@"<i>{0}</i>", key.Translate(pawn.Name.ToStringShort, Faction.OfPlayer.Name)));
                    sb.AppendLine(OddsIndicator(1, friendlyOdds, "PES_TryOutcome_Positive"));
                    sb.AppendLine(OddsIndicator(2, hostileOdds, "PES_TryOutcome_Positive"));
                }
                else if (incident.IntelLevel == IncidentIntelLevel.Danger)
                {
                    key = "PES_TryContact_Persuasion_Hostile";
                    sb.AppendLine(string.Format(@"<i>{0}</i>", key.Translate(pawn.Name.ToStringShort, Faction.OfPlayer.Name)));
                    sb.AppendLine(OddsIndicator(0, hostileOdds, "PES_TryOutcome_Positive"));
                }
                else
                {
                    key = "PES_TryContact_Persuasion_Neutral";
                    sb.AppendLine(string.Format(@"<i>{0}</i>", key.Translate(pawn.Name.ToStringShort, Faction.OfPlayer.Name)));
                    sb.AppendLine(OddsIndicator(0, friendlyOdds, "PES_TryOutcome_Positive"));
                }

                //Action
                option = new DiaOption(sb.ToString());
                if (incident.IsHostileToPlayer)
                {
                    option.action = DialogUtilities.ResolveActionByOdds(hostileOdds * MessageOdds, CommEstablishAction, PersuasionSuccessNode(), FailAction, ContactFailNode());
                }
                else
                {
                    option.action = DialogUtilities.ResolveActionByOdds(friendlyOdds * MessageOdds, CommEstablishAction, PersuasionSuccessNode(), FailAction, ContactFailNode());
                }
                diaNode.options.Add(option);
                #endregion

                #region intimidation
                float friendlyContactOdds = Mathf.Clamp01(PES_Settings.BaseIntimidationContactChance_Friendly * pawn.NegotiatePowerFactor());
                float friendlyFleeOdds    = Mathf.Clamp01(PES_Settings.BaseIntimidationFrightenChance_Friendly * pawn.NegotiatePowerFactorNeg());
                float EnemyContactOdds    = Mathf.Clamp01(PES_Settings.BaseIntimidationContactChance_Hostile * pawn.NegotiatePowerFactor());
                float EnemyFleeOdds       = Mathf.Clamp01(PES_Settings.BaseIntimidationFrightenChance_Hostile * pawn.NegotiatePowerFactor());

                sb = new StringBuilder(string.Format(@"<b>[{0}]</b>  ", "PES_intimidate_noun".Translate()).CapitalizeFirst());
                sb.AppendLine(string.Format(@"<i>{0}</i>", "PES_TryContact_Intimidation_have_mortar".Translate()));
                if (incident.IntelLevel == IncidentIntelLevel.Unknown)
                {
                    sb.AppendLine(OddsIndicator(1, friendlyContactOdds, "PES_TryOutcome_Positive", friendlyFleeOdds, "PES_TryOutcome_Scared"));
                    sb.AppendLine(OddsIndicator(2, EnemyContactOdds, "PES_TryOutcome_Positive", EnemyFleeOdds, "PES_TryOutcome_Scared"));
                }
                else if (incident.IntelLevel == IncidentIntelLevel.Danger)
                {
                    sb.AppendLine(OddsIndicator(0, EnemyContactOdds, "PES_TryOutcome_Positive", EnemyFleeOdds, "PES_TryOutcome_Scared"));
                }
                else
                {
                    sb.AppendLine(OddsIndicator(0, friendlyContactOdds, "PES_TryOutcome_Positive", friendlyFleeOdds, "PES_TryOutcome_Scared"));
                }
                option = new DiaOption(sb.ToString());
                if (!incident.IsHostileToPlayer)
                {
                    option.action = DialogUtilities.ResolveActionByOdds(friendlyContactOdds * MessageOdds, CommEstablishAction, PersuasionSuccessNode(), friendlyFleeOdds * MessageOdds, LeaveActionBad, IntimidationSuccessNode(), FailAction, ContactFailNode());
                }
                else
                {
                    option.action = DialogUtilities.ResolveActionByOdds(EnemyContactOdds * MessageOdds, CommEstablishAction, PersuasionSuccessNode(), EnemyFleeOdds * MessageOdds, LeaveAction, IntimidationSuccessNode(), FailAction, ContactFailNode());
                }
                diaNode.options.Add(option);
                #endregion

                #region Beguilement
                if (incident.IntelLevel != IncidentIntelLevel.Neutral && pawn.skills.GetSkill(SkillDefOf.Social).Level >= 15)
                {
                    friendlyFleeOdds = Mathf.Clamp01(PES_Settings.BaseBeguilementFrightenChance_Friendly * pawn.NegotiatePowerFactor());
                    EnemyContactOdds = Mathf.Clamp01(PES_Settings.BaseBeguilementContactChance_Hostile * pawn.NegotiatePowerFactor());
                    float EnemyLeaveOdds = Mathf.Clamp01(PES_Settings.BaseBeguilementFrightenChance_Hostile * pawn.NegotiatePowerFactor());

                    sb = new StringBuilder(string.Format(@"<b>[{0}]</b>  ", "PES_beguile_noun".Translate().CapitalizeFirst()));
                    if (incident.faction_revealed)
                    {
                        sb.AppendLine(string.Format(@"<i>{0}</i>", "PES_TryContact_Beguilement_FactionConfirmed".Translate(pawn.Name.ToStringShort, incident.SourceFaction.Name, Faction.OfPlayer.Name)));
                        sb.AppendLine(OddsIndicator(0, EnemyContactOdds, "PES_TryOutcome_Positive", EnemyLeaveOdds, "PES_TryOutcome_Leave"));
                    }
                    else
                    {
                        sb.AppendLine(string.Format(@"<i>{0}</i>", "PES_TryContact_Beguilement".Translate(pawn.Name.ToStringShort, Faction.OfPlayer.Name)));
                        if (incident.IntelLevel == IncidentIntelLevel.Danger)
                        {
                            sb.AppendLine(OddsIndicator(0, EnemyContactOdds, "PES_TryOutcome_Positive", EnemyLeaveOdds, "PES_TryOutcome_Scared"));
                        }
                        else
                        {
                            sb.AppendLine(OddsIndicator(1, friendlyFleeOdds, "PES_TryOutcome_Scared"));
                            sb.AppendLine(OddsIndicator(2, EnemyContactOdds, "PES_TryOutcome_Positive", EnemyLeaveOdds, "PES_TryOutcome_Scared"));
                        }
                    }
                    option = new DiaOption(sb.ToString());
                    if (incident.IsHostileToPlayer)
                    {
                        option.action = DialogUtilities.ResolveActionByOdds(EnemyLeaveOdds * MessageOdds, LeaveAction, BeguilementSuccessNode(incident.faction_revealed), EnemyContactOdds * MessageOdds, CommEstablishAction, PersuasionSuccessNode(), FailAction, ContactFailNode());
                    }
                    else
                    {
                        option.action = DialogUtilities.ResolveActionByOdds(friendlyFleeOdds * MessageOdds, LeaveAction, BeguilementSuccessNode(incident.faction_revealed), FailAction, ContactFailNode());
                    }
                    diaNode.options.Add(option);
                }
                #endregion
            }

            diaNode.options.Add(DialogUtilities.NormalCancelOption());
            return(diaNode);
        }
 public Bulletin_Infestation(TravelingIncidentCaravan travelingIncidentCaravan)
 {
     Caravan       = travelingIncidentCaravan;
     simpleCaravan = travelingIncidentCaravan as TravelingIncidentCaravan_Simple;
 }
예제 #22
0
 public Bulletin_Human(TravelingIncidentCaravan travelingIncidentCaravan)
 {
     Caravan = travelingIncidentCaravan;
 }
 public Bulletin_Animal(TravelingIncidentCaravan travelingIncidentCaravan)
 {
     Caravan = travelingIncidentCaravan;
 }