コード例 #1
0
        public static float IncestOpinionOffsetFor(Pawn other, Pawn pawn)
        {
            float num = 0f;
            List <DirectPawnRelation> directRelations = other.relations.DirectRelations;

            for (int i = 0; i < directRelations.Count; i++)
            {
                if (LovePartnerRelationUtility.IsLovePartnerRelation(directRelations[i].def))
                {
                    if (directRelations[i].otherPawn != pawn)
                    {
                        if (!directRelations[i].otherPawn.Dead)
                        {
                            foreach (PawnRelationDef current in other.GetRelations(directRelations[i].otherPawn))
                            {
                                float incestOpinionOffset = current.incestOpinionOffset;
                                if (incestOpinionOffset < num)
                                {
                                    num = incestOpinionOffset;
                                }
                            }
                        }
                    }
                }
            }
            return(num);
        }
コード例 #2
0
        public static Pawn GetPartnerInMyBed(Pawn pawn)
        {
            Building_Bed building_Bed = pawn.CurrentBed();

            if (building_Bed == null)
            {
                return(null);
            }
            if (building_Bed.SleepingSlotsCount <= 1)
            {
                return(null);
            }
            if (!LovePartnerRelationUtility.HasAnyLovePartner(pawn))
            {
                return(null);
            }
            foreach (Pawn current in building_Bed.CurOccupants)
            {
                if (current != pawn)
                {
                    if (LovePartnerRelationUtility.LovePartnerRelationExists(pawn, current))
                    {
                        return(current);
                    }
                }
            }
            return(null);
        }
コード例 #3
0
        private static float GetGenerationChanceAgeGapFactor(Pawn p1, Pawn p2, bool ex)
        {
            float num = Mathf.Abs(p1.ageTracker.AgeBiologicalYearsFloat - p2.ageTracker.AgeBiologicalYearsFloat);

            if (ex)
            {
                float num2 = LovePartnerRelationUtility.MinPossibleAgeGapAtMinAgeToGenerateAsLovers(p1, p2);
                if (num2 >= 0f)
                {
                    num = Mathf.Min(num, num2);
                }
                float num3 = LovePartnerRelationUtility.MinPossibleAgeGapAtMinAgeToGenerateAsLovers(p2, p1);
                if (num3 >= 0f)
                {
                    num = Mathf.Min(num, num3);
                }
            }
            if (num > 40f)
            {
                return(0f);
            }
            float value = GenMath.LerpDouble(0f, 20f, 1f, 0.001f, num);

            return(Mathf.Clamp(value, 0.001f, 1f));
        }
コード例 #4
0
        public static Pawn GetMostDislikedNonPartnerBedOwner(Pawn p)
        {
            Building_Bed ownedBed = p.ownership.OwnedBed;

            if (ownedBed == null)
            {
                return(null);
            }
            Pawn pawn = null;
            int  num  = 0;

            for (int i = 0; i < ownedBed.owners.Count; i++)
            {
                if (ownedBed.owners[i] != p)
                {
                    if (!LovePartnerRelationUtility.LovePartnerRelationExists(p, ownedBed.owners[i]))
                    {
                        int num2 = p.relations.OpinionOf(ownedBed.owners[i]);
                        if (pawn == null || num2 < num)
                        {
                            pawn = ownedBed.owners[i];
                            num  = num2;
                        }
                    }
                }
            }
            return(pawn);
        }
コード例 #5
0
        public static DirectPawnRelation ExistingMostLikedLovePartnerRel(Pawn p, bool allowDead)
        {
            if (!p.RaceProps.IsFlesh)
            {
                return(null);
            }
            DirectPawnRelation directPawnRelation = null;
            int num = -2147483648;
            List <DirectPawnRelation> directRelations = p.relations.DirectRelations;

            for (int i = 0; i < directRelations.Count; i++)
            {
                if (allowDead || !directRelations[i].otherPawn.Dead)
                {
                    if (LovePartnerRelationUtility.IsLovePartnerRelation(directRelations[i].def))
                    {
                        int num2 = p.relations.OpinionOf(directRelations[i].otherPawn);
                        if (directPawnRelation == null || num2 > num)
                        {
                            directPawnRelation = directRelations[i];
                            num = num2;
                        }
                    }
                }
            }
            return(directPawnRelation);
        }
        protected override ThoughtState CurrentStateInternal(Pawn p)
        {
            DirectPawnRelation directPawnRelation = LovePartnerRelationUtility.ExistingMostLikedLovePartnerRel(p, false);
            ThoughtState       result;

            if (directPawnRelation == null)
            {
                result = false;
            }
            else if (!directPawnRelation.otherPawn.IsColonist || directPawnRelation.otherPawn.IsWorldPawn() || !directPawnRelation.otherPawn.relations.everSeenByPlayer)
            {
                result = false;
            }
            else if (p.ownership.OwnedBed != null && p.ownership.OwnedBed == directPawnRelation.otherPawn.ownership.OwnedBed)
            {
                result = false;
            }
            else if (p.relations.OpinionOf(directPawnRelation.otherPawn) <= 0)
            {
                result = false;
            }
            else
            {
                result = true;
            }
            return(result);
        }
コード例 #7
0
 public static void Married(Pawn firstPawn, Pawn secondPawn)
 {
     LovePartnerRelationUtility.ChangeSpouseRelationsToExSpouse(firstPawn);
     LovePartnerRelationUtility.ChangeSpouseRelationsToExSpouse(secondPawn);
     firstPawn.relations.RemoveDirectRelation(PawnRelationDefOf.Fiance, secondPawn);
     firstPawn.relations.TryRemoveDirectRelation(PawnRelationDefOf.ExSpouse, secondPawn);
     firstPawn.relations.AddDirectRelation(PawnRelationDefOf.Spouse, secondPawn);
     AddNewlyMarriedThoughts(firstPawn, secondPawn);
     AddNewlyMarriedThoughts(secondPawn, firstPawn);
     if (firstPawn.needs.mood != null)
     {
         firstPawn.needs.mood.thoughts.memories.RemoveMemoriesOfDefWhereOtherPawnIs(ThoughtDefOf.DivorcedMe, secondPawn);
     }
     if (secondPawn.needs.mood != null)
     {
         secondPawn.needs.mood.thoughts.memories.RemoveMemoriesOfDefWhereOtherPawnIs(ThoughtDefOf.DivorcedMe, firstPawn);
     }
     if (firstPawn.relations.nextMarriageNameChange != secondPawn.relations.nextMarriageNameChange)
     {
         Log.Warning("Marriage name change is different on marrying pawns. This is weird, but not harmful.");
     }
     SpouseRelationUtility.ChangeNameAfterMarriage(firstPawn, secondPawn, firstPawn.relations.nextMarriageNameChange);
     LovePartnerRelationUtility.TryToShareBed(firstPawn, secondPawn);
     TaleRecorder.RecordTale(TaleDefOf.Marriage, firstPawn, secondPawn);
 }
コード例 #8
0
 public override void CreateRelation(Pawn generated, Pawn other, ref PawnGenerationRequest request)
 {
     generated.relations.AddDirectRelation(PawnRelationDefOf.Spouse, other);
     LovePartnerRelationUtility.TryToShareChildrenForGeneratedLovePartner(generated, other, request, 1f);
     SpouseRelationUtility.ResolveNameForSpouseOnGeneration(ref request, generated);
     ResolveMySkinColor(ref request, generated, other);
 }
コード例 #9
0
        public static float LovePartnerRelationGenerationChance(Pawn generated, Pawn other, PawnGenerationRequest request, bool ex)
        {
            if (generated.ageTracker.AgeBiologicalYearsFloat < 14f)
            {
                return(0f);
            }
            if (other.ageTracker.AgeBiologicalYearsFloat < 14f)
            {
                return(0f);
            }
            if (generated.gender == other.gender && (!other.story.traits.HasTrait(TraitDefOf.Gay) || !request.AllowGay))
            {
                return(0f);
            }
            if (generated.gender != other.gender && other.story.traits.HasTrait(TraitDefOf.Gay))
            {
                return(0f);
            }
            float num = 1f;

            if (ex)
            {
                int num2 = 0;
                List <DirectPawnRelation> directRelations = other.relations.DirectRelations;
                for (int i = 0; i < directRelations.Count; i++)
                {
                    if (LovePartnerRelationUtility.IsExLovePartnerRelation(directRelations[i].def))
                    {
                        num2++;
                    }
                }
                num = Mathf.Pow(0.2f, (float)num2);
            }
            else if (LovePartnerRelationUtility.HasAnyLovePartner(other))
            {
                return(0f);
            }
            float num3 = (generated.gender != other.gender) ? 1f : 0.01f;
            float generationChanceAgeFactor    = LovePartnerRelationUtility.GetGenerationChanceAgeFactor(generated);
            float generationChanceAgeFactor2   = LovePartnerRelationUtility.GetGenerationChanceAgeFactor(other);
            float generationChanceAgeGapFactor = LovePartnerRelationUtility.GetGenerationChanceAgeGapFactor(generated, other, ex);
            float num4 = 1f;

            if (generated.GetRelations(other).Any((PawnRelationDef x) => x.familyByBloodRelation))
            {
                num4 = 0.01f;
            }
            float num5;

            if (request.FixedMelanin != null)
            {
                num5 = ChildRelationUtility.GetMelaninSimilarityFactor(request.FixedMelanin.Value, other.story.melanin);
            }
            else
            {
                num5 = PawnSkinColors.GetMelaninCommonalityFactor(other.story.melanin);
            }
            return(num * generationChanceAgeFactor * generationChanceAgeFactor2 * generationChanceAgeGapFactor * num3 * num5 * num4);
        }
コード例 #10
0
        public override float GenerationChance(Pawn generated, Pawn other, PawnGenerationRequest request)
        {
            float num = 1f;

            num *= this.GetOldAgeFactor(generated);
            num *= this.GetOldAgeFactor(other);
            return(LovePartnerRelationUtility.LovePartnerRelationGenerationChance(generated, other, request, false) * base.BaseGenerationChanceFactor(generated, other, request) * num);
        }
コード例 #11
0
 public static void TryToShareBed(Pawn first, Pawn second)
 {
     if (LovePartnerRelationUtility.TryToShareBed_Int(first, second))
     {
         return;
     }
     LovePartnerRelationUtility.TryToShareBed_Int(second, first);
 }
コード例 #12
0
 protected override ThoughtState CurrentStateInternal(Pawn p)
 {
     if (!p.RaceProps.Humanlike)
     {
         return(false);
     }
     return(LovePartnerRelationUtility.GetMostDislikedNonPartnerBedOwner(p) != null);
 }
コード例 #13
0
        public static Building_Bed FindBedFor(Pawn sleeper, Pawn traveler, bool sleeperWillBePrisoner, bool checkSocialProperness, bool ignoreOtherReservations = false)
        {
            if (HealthAIUtility.ShouldSeekMedicalRest(sleeper))
            {
                if (sleeper.InBed() && sleeper.CurrentBed().Medical&& IsValidBedFor(sleeper.CurrentBed(), sleeper, traveler, sleeperWillBePrisoner, checkSocialProperness, allowMedBedEvenIfSetToNoCare: false, ignoreOtherReservations))
                {
                    return(sleeper.CurrentBed());
                }
                for (int i = 0; i < bedDefsBestToWorst_Medical.Count; i++)
                {
                    ThingDef thingDef = bedDefsBestToWorst_Medical[i];
                    if (!CanUseBedEver(sleeper, thingDef))
                    {
                        continue;
                    }
                    for (int j = 0; j < 2; j++)
                    {
                        Danger       maxDanger2   = ((j == 0) ? Danger.None : Danger.Deadly);
                        Building_Bed building_Bed = (Building_Bed)GenClosest.ClosestThingReachable(sleeper.Position, sleeper.Map, ThingRequest.ForDef(thingDef), PathEndMode.OnCell, TraverseParms.For(traveler), 9999f, (Thing b) => ((Building_Bed)b).Medical && (int)b.Position.GetDangerFor(sleeper, sleeper.Map) <= (int)maxDanger2 && IsValidBedFor(b, sleeper, traveler, sleeperWillBePrisoner, checkSocialProperness, allowMedBedEvenIfSetToNoCare: false, ignoreOtherReservations));
                        if (building_Bed != null)
                        {
                            return(building_Bed);
                        }
                    }
                }
            }
            if (sleeper.ownership != null && sleeper.ownership.OwnedBed != null && IsValidBedFor(sleeper.ownership.OwnedBed, sleeper, traveler, sleeperWillBePrisoner, checkSocialProperness, allowMedBedEvenIfSetToNoCare: false, ignoreOtherReservations))
            {
                return(sleeper.ownership.OwnedBed);
            }
            DirectPawnRelation directPawnRelation = LovePartnerRelationUtility.ExistingMostLikedLovePartnerRel(sleeper, allowDead: false);

            if (directPawnRelation != null)
            {
                Building_Bed ownedBed = directPawnRelation.otherPawn.ownership.OwnedBed;
                if (ownedBed != null && IsValidBedFor(ownedBed, sleeper, traveler, sleeperWillBePrisoner, checkSocialProperness, allowMedBedEvenIfSetToNoCare: false, ignoreOtherReservations))
                {
                    return(ownedBed);
                }
            }
            for (int k = 0; k < 2; k++)
            {
                Danger maxDanger = ((k == 0) ? Danger.None : Danger.Deadly);
                for (int l = 0; l < bedDefsBestToWorst_RestEffectiveness.Count; l++)
                {
                    ThingDef thingDef2 = bedDefsBestToWorst_RestEffectiveness[l];
                    if (CanUseBedEver(sleeper, thingDef2))
                    {
                        Building_Bed building_Bed2 = (Building_Bed)GenClosest.ClosestThingReachable(sleeper.Position, sleeper.Map, ThingRequest.ForDef(thingDef2), PathEndMode.OnCell, TraverseParms.For(traveler), 9999f, (Thing b) => !((Building_Bed)b).Medical && (int)b.Position.GetDangerFor(sleeper, sleeper.Map) <= (int)maxDanger && IsValidBedFor(b, sleeper, traveler, sleeperWillBePrisoner, checkSocialProperness, allowMedBedEvenIfSetToNoCare: false, ignoreOtherReservations));
                        if (building_Bed2 != null)
                        {
                            return(building_Bed2);
                        }
                    }
                }
            }
            return(null);
        }
コード例 #14
0
		public static Pawn ExistingMostLikedLovePartner(Pawn p, bool allowDead)
		{
			DirectPawnRelation directPawnRelation = LovePartnerRelationUtility.ExistingMostLikedLovePartnerRel(p, allowDead);
			if (directPawnRelation != null)
			{
				return directPawnRelation.otherPawn;
			}
			return null;
		}
コード例 #15
0
        public override float RandomSelectionWeight(Pawn initiator, Pawn recipient)
        {
            if (LovePartnerRelationUtility.LovePartnerRelationExists(initiator, recipient))
            {
                return(0f);
            }
            float num = initiator.relations.SecondaryRomanceChanceFactor(recipient);

            if (num < 0.25f)
            {
                return(0f);
            }
            int num2 = initiator.relations.OpinionOf(recipient);

            if (num2 < 5)
            {
                return(0f);
            }
            if (recipient.relations.OpinionOf(initiator) < 5)
            {
                return(0f);
            }
            float num3 = 1f;
            Pawn  pawn = LovePartnerRelationUtility.ExistingMostLikedLovePartner(initiator, false);

            if (pawn != null)
            {
                float value = (float)initiator.relations.OpinionOf(pawn);
                num3 = Mathf.InverseLerp(50f, -50f, value);
            }
            float num4 = (!initiator.story.traits.HasTrait(TraitDefOf.Gay)) ? ((initiator.gender != Gender.Female) ? 1f : 0.15f) : 1f;
            float num5 = Mathf.InverseLerp(0.25f, 1f, num);
            float num6 = Mathf.InverseLerp(5f, 100f, (float)num2);
            float num7;

            if (initiator.gender == recipient.gender)
            {
                if (initiator.story.traits.HasTrait(TraitDefOf.Gay) && recipient.story.traits.HasTrait(TraitDefOf.Gay))
                {
                    num7 = 1f;
                }
                else
                {
                    num7 = 0.15f;
                }
            }
            else if (!initiator.story.traits.HasTrait(TraitDefOf.Gay) && !recipient.story.traits.HasTrait(TraitDefOf.Gay))
            {
                num7 = 1f;
            }
            else
            {
                num7 = 0.15f;
            }
            return(1.15f * num4 * num5 * num6 * num3 * num7);
        }
コード例 #16
0
 public override void Interacted(Pawn initiator, Pawn recipient, List <RulePackDef> extraSentencePacks, out string letterText, out string letterLabel, out LetterDef letterDef)
 {
     if (Rand.Value < this.SuccessChance(initiator, recipient))
     {
         List <Pawn> list;
         this.BreakLoverAndFianceRelations(initiator, out list);
         List <Pawn> list2;
         this.BreakLoverAndFianceRelations(recipient, out list2);
         for (int i = 0; i < list.Count; i++)
         {
             this.TryAddCheaterThought(list[i], initiator);
         }
         for (int j = 0; j < list2.Count; j++)
         {
             this.TryAddCheaterThought(list2[j], recipient);
         }
         initiator.relations.TryRemoveDirectRelation(PawnRelationDefOf.ExLover, recipient);
         initiator.relations.AddDirectRelation(PawnRelationDefOf.Lover, recipient);
         TaleRecorder.RecordTale(TaleDefOf.BecameLover, new object[]
         {
             initiator,
             recipient
         });
         initiator.needs.mood.thoughts.memories.RemoveMemoriesOfDefWhereOtherPawnIs(ThoughtDefOf.BrokeUpWithMe, recipient);
         recipient.needs.mood.thoughts.memories.RemoveMemoriesOfDefWhereOtherPawnIs(ThoughtDefOf.BrokeUpWithMe, initiator);
         initiator.needs.mood.thoughts.memories.RemoveMemoriesOfDefWhereOtherPawnIs(ThoughtDefOf.FailedRomanceAttemptOnMe, recipient);
         initiator.needs.mood.thoughts.memories.RemoveMemoriesOfDefWhereOtherPawnIs(ThoughtDefOf.FailedRomanceAttemptOnMeLowOpinionMood, recipient);
         recipient.needs.mood.thoughts.memories.RemoveMemoriesOfDefWhereOtherPawnIs(ThoughtDefOf.FailedRomanceAttemptOnMe, initiator);
         recipient.needs.mood.thoughts.memories.RemoveMemoriesOfDefWhereOtherPawnIs(ThoughtDefOf.FailedRomanceAttemptOnMeLowOpinionMood, initiator);
         if (PawnUtility.ShouldSendNotificationAbout(initiator) || PawnUtility.ShouldSendNotificationAbout(recipient))
         {
             this.GetNewLoversLetter(initiator, recipient, list, list2, out letterText, out letterLabel, out letterDef);
         }
         else
         {
             letterText  = null;
             letterLabel = null;
             letterDef   = null;
         }
         extraSentencePacks.Add(RulePackDefOf.Sentence_RomanceAttemptAccepted);
         LovePartnerRelationUtility.TryToShareBed(initiator, recipient);
     }
     else
     {
         initiator.needs.mood.thoughts.memories.TryGainMemory(ThoughtDefOf.RebuffedMyRomanceAttempt, recipient);
         recipient.needs.mood.thoughts.memories.TryGainMemory(ThoughtDefOf.FailedRomanceAttemptOnMe, initiator);
         if (recipient.relations.OpinionOf(initiator) <= 0)
         {
             recipient.needs.mood.thoughts.memories.TryGainMemory(ThoughtDefOf.FailedRomanceAttemptOnMeLowOpinionMood, initiator);
         }
         extraSentencePacks.Add(RulePackDefOf.Sentence_RomanceAttemptRejected);
         letterText  = null;
         letterLabel = null;
         letterDef   = null;
     }
 }
コード例 #17
0
ファイル: RestUtility.cs プロジェクト: sachdevs/RW-Decompile
 private static bool IsAnyOwnerLovePartnerOf(Building_Bed bed, Pawn sleeper)
 {
     for (int i = 0; i < bed.owners.Count; i++)
     {
         if (LovePartnerRelationUtility.LovePartnerRelationExists(sleeper, bed.owners[i]))
         {
             return(true);
         }
     }
     return(false);
 }
コード例 #18
0
 public override void CreateRelation(Pawn generated, Pawn other, ref PawnGenerationRequest request)
 {
     if (generated.gender == Gender.Male)
     {
         other.SetFather(generated);
         ResolveMyName(ref request, other, other.GetMother());
         ResolveMySkinColor(ref request, other, other.GetMother());
         if (other.GetMother() != null)
         {
             if (other.GetMother().story.traits.HasTrait(TraitDefOf.Gay))
             {
                 generated.relations.AddDirectRelation(PawnRelationDefOf.ExLover, other.GetMother());
             }
             else if (Rand.Value < 0.85f && !LovePartnerRelationUtility.HasAnyLovePartner(other.GetMother()))
             {
                 generated.relations.AddDirectRelation(PawnRelationDefOf.Spouse, other.GetMother());
                 if (request.FixedLastName == null && Rand.Value < 0.8f)
                 {
                     request.SetFixedLastName(((NameTriple)other.GetMother().Name).Last);
                 }
             }
             else
             {
                 LovePartnerRelationUtility.GiveRandomExLoverOrExSpouseRelation(generated, other.GetMother());
             }
         }
     }
     else if (generated.gender == Gender.Female)
     {
         other.SetMother(generated);
         ResolveMyName(ref request, other, other.GetFather());
         ResolveMySkinColor(ref request, other, other.GetFather());
         if (other.GetFather() != null)
         {
             if (other.GetFather().story.traits.HasTrait(TraitDefOf.Gay))
             {
                 generated.relations.AddDirectRelation(PawnRelationDefOf.ExLover, other.GetFather());
             }
             else if (Rand.Value < 0.85f && !LovePartnerRelationUtility.HasAnyLovePartner(other.GetFather()))
             {
                 generated.relations.AddDirectRelation(PawnRelationDefOf.Spouse, other.GetFather());
                 if (request.FixedLastName == null && Rand.Value < 0.8f)
                 {
                     request.SetFixedLastName(((NameTriple)other.GetFather().Name).Last);
                 }
             }
             else
             {
                 LovePartnerRelationUtility.GiveRandomExLoverOrExSpouseRelation(generated, other.GetFather());
             }
         }
     }
 }
コード例 #19
0
        // Token: 0x0600001E RID: 30 RVA: 0x000027A0 File Offset: 0x000009A0
        public virtual void Interacted(Pawn initiator, Pawn recipient, List <RulePackDef> extraSentencePacks)
        {
            bool flag = Rand.Value < this.SuccessChance(initiator, recipient);

            if (flag)
            {
                List <Pawn> list;
                this.BreakLoverAndFianceRelations(initiator, out list);
                List <Pawn> list2;
                this.BreakLoverAndFianceRelations(recipient, out list2);
                for (int i = 0; i < list.Count; i++)
                {
                    this.TryAddCheaterThought(list[i], initiator);
                }
                for (int j = 0; j < list2.Count; j++)
                {
                    this.TryAddCheaterThought(list2[j], recipient);
                }
                initiator.relations.TryRemoveDirectRelation(PawnRelationDefOf.ExLover, recipient);
                initiator.relations.AddDirectRelation(PawnRelationDefOf.Lover, recipient);
                TaleRecorder.RecordTale(TaleDefOf.BecameLover, new object[]
                {
                    initiator,
                    recipient
                });
                initiator.needs.mood.thoughts.memories.RemoveMemoriesOfDefWhereOtherPawnIs(ThoughtDefOf.BrokeUpWithMe, recipient);
                recipient.needs.mood.thoughts.memories.RemoveMemoriesOfDefWhereOtherPawnIs(ThoughtDefOf.BrokeUpWithMe, initiator);
                initiator.needs.mood.thoughts.memories.RemoveMemoriesOfDefWhereOtherPawnIs(ThoughtDefOf.FailedRomanceAttemptOnMe, recipient);
                initiator.needs.mood.thoughts.memories.RemoveMemoriesOfDefWhereOtherPawnIs(ThoughtDefOf.FailedRomanceAttemptOnMeLowOpinionMood, recipient);
                recipient.needs.mood.thoughts.memories.RemoveMemoriesOfDefWhereOtherPawnIs(ThoughtDefOf.FailedRomanceAttemptOnMe, initiator);
                recipient.needs.mood.thoughts.memories.RemoveMemoriesOfDefWhereOtherPawnIs(ThoughtDefOf.FailedRomanceAttemptOnMeLowOpinionMood, initiator);
                bool flag2 = initiator.IsColonist || recipient.IsColonist;
                if (flag2)
                {
                    this.SendNewLoversLetter(initiator, recipient, list, list2);
                }
                extraSentencePacks.Add(RulePackDefOf.Sentence_RomanceAttemptAccepted);
                LovePartnerRelationUtility.TryToShareBed(initiator, recipient);
            }
            else
            {
                initiator.needs.mood.thoughts.memories.TryGainMemory(ThoughtDefOf.RebuffedMyRomanceAttempt, recipient);
                recipient.needs.mood.thoughts.memories.TryGainMemory(ThoughtDefOf.FailedRomanceAttemptOnMe, initiator);
                bool flag3 = recipient.relations.OpinionOf(initiator) <= 0;
                if (flag3)
                {
                    recipient.needs.mood.thoughts.memories.TryGainMemory(ThoughtDefOf.FailedRomanceAttemptOnMeLowOpinionMood, initiator);
                }
                extraSentencePacks.Add(RulePackDefOf.Sentence_RomanceAttemptRejected);
            }
        }
コード例 #20
0
 public static void Married(Pawn firstPawn, Pawn secondPawn)
 {
     LovePartnerRelationUtility.ChangeSpouseRelationsToExSpouse(firstPawn);
     LovePartnerRelationUtility.ChangeSpouseRelationsToExSpouse(secondPawn);
     firstPawn.relations.RemoveDirectRelation(PawnRelationDefOf.Fiance, secondPawn);
     firstPawn.relations.TryRemoveDirectRelation(PawnRelationDefOf.ExSpouse, secondPawn);
     firstPawn.relations.AddDirectRelation(PawnRelationDefOf.Spouse, secondPawn);
     AddNewlyMarriedThoughts(firstPawn, secondPawn);
     AddNewlyMarriedThoughts(secondPawn, firstPawn);
     firstPawn.needs.mood.thoughts.memories.RemoveMemoriesOfDefWhereOtherPawnIs(ThoughtDefOf.DivorcedMe, secondPawn);
     secondPawn.needs.mood.thoughts.memories.RemoveMemoriesOfDefWhereOtherPawnIs(ThoughtDefOf.DivorcedMe, firstPawn);
     LovePartnerRelationUtility.TryToShareBed(firstPawn, secondPawn);
     TaleRecorder.RecordTale(TaleDefOf.Marriage, firstPawn, secondPawn);
 }
コード例 #21
0
        protected override ThoughtState CurrentStateInternal(Pawn p)
        {
            DirectPawnRelation directPawnRelation = LovePartnerRelationUtility.ExistingMostLikedLovePartnerRel(p, allowDead: false);

            if (directPawnRelation == null)
            {
                return(false);
            }
            if (!directPawnRelation.otherPawn.IsColonist || directPawnRelation.otherPawn.IsWorldPawn() || !directPawnRelation.otherPawn.relations.everSeenByPlayer)
            {
                return(false);
            }
            return(p.relations.OpinionOf(directPawnRelation.otherPawn) != 0);
        }
コード例 #22
0
        public static float GetLovinMtbHours(Pawn pawn, Pawn partner)
        {
            float result;

            if (pawn.Dead || partner.Dead)
            {
                result = -1f;
            }
            else if (DebugSettings.alwaysDoLovin)
            {
                result = 0.1f;
            }
            else if (pawn.needs.food.Starving || partner.needs.food.Starving)
            {
                result = -1f;
            }
            else if (pawn.health.hediffSet.BleedRateTotal > 0f || partner.health.hediffSet.BleedRateTotal > 0f)
            {
                result = -1f;
            }
            else
            {
                float num = LovePartnerRelationUtility.LovinMtbSinglePawnFactor(pawn);
                if (num <= 0f)
                {
                    result = -1f;
                }
                else
                {
                    float num2 = LovePartnerRelationUtility.LovinMtbSinglePawnFactor(partner);
                    if (num2 <= 0f)
                    {
                        result = -1f;
                    }
                    else
                    {
                        float num3 = 12f;
                        num3  *= num;
                        num3  *= num2;
                        num3  /= Mathf.Max(pawn.relations.SecondaryLovinChanceFactor(partner), 0.1f);
                        num3  /= Mathf.Max(partner.relations.SecondaryLovinChanceFactor(pawn), 0.1f);
                        num3  *= GenMath.LerpDouble(-100f, 100f, 1.3f, 0.7f, (float)pawn.relations.OpinionOf(partner));
                        num3  *= GenMath.LerpDouble(-100f, 100f, 1.3f, 0.7f, (float)partner.relations.OpinionOf(pawn));
                        result = num3;
                    }
                }
            }
            return(result);
        }
コード例 #23
0
        public override float RandomSelectionWeight(Pawn initiator, Pawn recipient)
        {
            if (!LovePartnerRelationUtility.LovePartnerRelationExists(initiator, recipient))
            {
                return(0f);
            }
            float num  = Mathf.InverseLerp(100f, -100f, initiator.relations.OpinionOf(recipient));
            float num2 = 1f;

            if (initiator.relations.DirectRelationExists(PawnRelationDefOf.Spouse, recipient))
            {
                num2 = 0.4f;
            }
            return(0.02f * num * num2);
        }
コード例 #24
0
 protected override ThoughtState CurrentSocialStateInternal(Pawn pawn, Pawn other)
 {
     if (!other.RaceProps.Humanlike)
     {
         return(false);
     }
     if (!RelationsUtility.PawnsKnowEachOther(pawn, other))
     {
         return(false);
     }
     if (LovePartnerRelationUtility.IncestOpinionOffsetFor(other, pawn) == 0f)
     {
         return(false);
     }
     return(true);
 }
コード例 #25
0
        public override void CreateRelation(Pawn generated, Pawn other, ref PawnGenerationRequest request)
        {
            bool flag  = other.GetMother() != null;
            bool flag2 = other.GetFather() != null;
            bool flag3 = Rand.Value < 0.85f;

            if (flag && LovePartnerRelationUtility.HasAnyLovePartner(other.GetMother()))
            {
                flag3 = false;
            }
            if (flag2 && LovePartnerRelationUtility.HasAnyLovePartner(other.GetFather()))
            {
                flag3 = false;
            }
            if (!flag)
            {
                Pawn newMother = PawnRelationWorker_Sibling.GenerateParent(generated, other, Gender.Female, request, flag3);
                other.SetMother(newMother);
            }
            generated.SetMother(other.GetMother());
            if (!flag2)
            {
                Pawn newFather = PawnRelationWorker_Sibling.GenerateParent(generated, other, Gender.Male, request, flag3);
                other.SetFather(newFather);
            }
            generated.SetFather(other.GetFather());
            if (!flag || !flag2)
            {
                bool flag4 = other.GetMother().story.traits.HasTrait(TraitDefOf.Gay) || other.GetFather().story.traits.HasTrait(TraitDefOf.Gay);
                if (flag4)
                {
                    other.GetFather().relations.AddDirectRelation(PawnRelationDefOf.ExLover, other.GetMother());
                }
                else if (flag3)
                {
                    other.GetFather().relations.AddDirectRelation(PawnRelationDefOf.Spouse, other.GetMother());
                }
                else
                {
                    LovePartnerRelationUtility.GiveRandomExLoverOrExSpouseRelation(other.GetFather(), other.GetMother());
                }
            }
            PawnRelationWorker_Sibling.ResolveMyName(ref request, generated);
            PawnRelationWorker_Sibling.ResolveMySkinColor(ref request, generated);
        }
コード例 #26
0
 public static void Married(Pawn firstPawn, Pawn secondPawn)
 {
     LovePartnerRelationUtility.ChangeSpouseRelationsToExSpouse(firstPawn);
     LovePartnerRelationUtility.ChangeSpouseRelationsToExSpouse(secondPawn);
     firstPawn.relations.RemoveDirectRelation(PawnRelationDefOf.Fiance, secondPawn);
     firstPawn.relations.TryRemoveDirectRelation(PawnRelationDefOf.ExSpouse, secondPawn);
     firstPawn.relations.AddDirectRelation(PawnRelationDefOf.Spouse, secondPawn);
     MarriageCeremonyUtility.AddNewlyMarriedThoughts(firstPawn, secondPawn);
     MarriageCeremonyUtility.AddNewlyMarriedThoughts(secondPawn, firstPawn);
     firstPawn.needs.mood.thoughts.RemoveSocialThoughts(ThoughtDefOf.DivorcedMe, secondPawn);
     secondPawn.needs.mood.thoughts.RemoveSocialThoughts(ThoughtDefOf.DivorcedMe, firstPawn);
     LovePartnerRelationUtility.TryToShareBed(firstPawn, secondPawn);
     TaleRecorder.RecordTale(TaleDefOf.Marriage, new object[]
     {
         firstPawn,
         secondPawn
     });
 }
コード例 #27
0
        public override float RandomSelectionWeight(Pawn initiator, Pawn recipient)
        {
            if (TutorSystem.TutorialMode)
            {
                return(0f);
            }
            if (LovePartnerRelationUtility.LovePartnerRelationExists(initiator, recipient))
            {
                return(0f);
            }
            float num = initiator.relations.SecondaryRomanceChanceFactor(recipient);

            if (num < 0.15f)
            {
                return(0f);
            }
            int num2 = initiator.relations.OpinionOf(recipient);

            if (num2 < 5)
            {
                return(0f);
            }
            if (recipient.relations.OpinionOf(initiator) < 5)
            {
                return(0f);
            }
            float num3 = 1f;
            Pawn  pawn = LovePartnerRelationUtility.ExistingMostLikedLovePartner(initiator, allowDead: false);

            if (pawn != null)
            {
                float value = initiator.relations.OpinionOf(pawn);
                num3 = Mathf.InverseLerp(50f, -50f, value);
            }
            float num4 = (initiator.story.traits.HasTrait(TraitDefOf.Gay) ? 1f : ((initiator.gender == Gender.Female) ? 0.15f : 1f));
            float num5 = Mathf.InverseLerp(0.15f, 1f, num);
            float num6 = Mathf.InverseLerp(5f, 100f, num2);
            float num7 = ((initiator.gender == recipient.gender) ? ((!initiator.story.traits.HasTrait(TraitDefOf.Gay) || !recipient.story.traits.HasTrait(TraitDefOf.Gay)) ? 0.15f : 1f) : ((initiator.story.traits.HasTrait(TraitDefOf.Gay) || recipient.story.traits.HasTrait(TraitDefOf.Gay)) ? 0.15f : 1f));

            return(1.15f * num4 * num5 * num6 * num3 * num7);
        }
コード例 #28
0
 protected override Job TryGiveJob(Pawn pawn)
 {
     if (Find.TickManager.TicksGame < pawn.mindState.canLovinTick)
     {
         return(null);
     }
     if (pawn.CurrentBed() != null && !pawn.CurrentBed().Medical&& pawn.health.capacities.CanBeAwake)
     {
         Pawn partnerInMyBed = LovePartnerRelationUtility.GetPartnerInMyBed(pawn);
         if (partnerInMyBed != null && partnerInMyBed.health.capacities.CanBeAwake && Find.TickManager.TicksGame >= partnerInMyBed.mindState.canLovinTick)
         {
             if (pawn.CanReserve(partnerInMyBed, 1, -1, null, false) && partnerInMyBed.CanReserve(pawn, 1, -1, null, false))
             {
                 return(new Job(JobDefOf.Lovin, partnerInMyBed, pawn.CurrentBed()));
             }
             return(null);
         }
         return(null);
     }
     return(null);
 }
コード例 #29
0
        public override float RandomSelectionWeight(Pawn initiator, Pawn recipient)
        {
            if (!LovePartnerRelationUtility.LovePartnerRelationExists(initiator, recipient))
            {
                return(0f);
            }
            float num  = Mathf.InverseLerp(100f, -100f, initiator.relations.OpinionOf(recipient));
            float num2 = 1f;

            if (initiator.relations.DirectRelationExists(PawnRelationDefOf.Spouse, recipient))
            {
                num2 = 0.4f;
            }
            float            num3             = 1f;
            HediffWithTarget hediffWithTarget = (HediffWithTarget)initiator.health.hediffSet.GetFirstHediffOfDef(HediffDefOf.PsychicLove);

            if (hediffWithTarget != null && hediffWithTarget.target == recipient)
            {
                num3 = 0.1f;
            }
            return(0.02f * num * num2 * num3);
        }
コード例 #30
0
        protected override Job TryGiveJob(Pawn pawn)
        {
            if (Find.TickManager.TicksGame < pawn.mindState.canLovinTick)
            {
                return(null);
            }
            if (pawn.CurrentBed() == null || pawn.CurrentBed().Medical || !pawn.health.capacities.CanBeAwake)
            {
                return(null);
            }
            Pawn partnerInMyBed = LovePartnerRelationUtility.GetPartnerInMyBed(pawn);

            if (partnerInMyBed == null || !partnerInMyBed.health.capacities.CanBeAwake || Find.TickManager.TicksGame < partnerInMyBed.mindState.canLovinTick)
            {
                return(null);
            }
            if (!pawn.CanReserve(partnerInMyBed) || !partnerInMyBed.CanReserve(pawn))
            {
                return(null);
            }
            return(JobMaker.MakeJob(JobDefOf.Lovin, partnerInMyBed, pawn.CurrentBed()));
        }