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); }
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); }
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); }
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); }
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); }
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); }
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; }
public Bulletin_Human(TravelingIncidentCaravan travelingIncidentCaravan) { Caravan = travelingIncidentCaravan; }
public Bulletin_Animal(TravelingIncidentCaravan travelingIncidentCaravan) { Caravan = travelingIncidentCaravan; }