예제 #1
0
        public static bool CompAbilityEffect_WordOfLove_Prefix2(ref bool __result, CompAbilityEffect_WordOfLove __instance, LocalTargetInfo target, bool throwMessages)
        {
            Pawn pawn = target.Pawn;
            CompIndividuality comp = pawn.TryGetComp <CompIndividuality>();

            if (pawn != null)
            {
                if (comp.sexuality == CompIndividuality.Sexuality.Asexual)
                {
                    if (throwMessages)
                    {
                        Messages.Message("AbilityCantApplyOnAsexual".Translate(pawn), pawn, MessageTypeDefOf.RejectInput, false);
                    }
                    __result = false;
                    return(false);
                }
                if (!AbilityUtility.ValidateNoMentalState(pawn, throwMessages))
                {
                    __result = false;
                    return(false);
                }
            }
            __result = true;
            return(false);
        }
예제 #2
0
        public static void GenerateBodyType_Postfix(Pawn pawn)
        {
            CompIndividuality comp = pawn.TryGetComp <CompIndividuality>();

            if (pawn != null && comp != null)
            {
                pawn.BroadcastCompSignal("bodyTypeSelected");
            }
        }
예제 #3
0
        public static void GenerateTraits_Postfix(Pawn pawn)
        {
            CompIndividuality comp = pawn.TryGetComp <CompIndividuality>();

            if (pawn != null && comp != null)
            {
                pawn.BroadcastCompSignal("traitsGenerated");
            }
        }
예제 #4
0
 public static void SecondaryRomanceChanceFactor_Postfix(ref float __result, Pawn ___pawn, Pawn otherPawn)
 {
     if (!SyrIndividuality.RomanceDisabled && ___pawn != null && otherPawn != null)
     {
         CompIndividuality compOther = otherPawn.TryGetComp <CompIndividuality>();
         CompIndividuality comp      = ___pawn.TryGetComp <CompIndividuality>();
         if (comp != null && compOther != null && compOther.sexuality == CompIndividuality.Sexuality.Asexual && comp.sexuality == CompIndividuality.Sexuality.Asexual)
         {
             __result = 2.0f;
         }
     }
 }
예제 #5
0
        public void ReplaceVanillaTraits()
        {
            if (parent is Pawn pawn)
            {
                CompIndividuality comp = pawn.TryGetComp <CompIndividuality>();
                if (comp != null && pawn?.story?.traits != null && (pawn.story.traits.HasTrait(TraitDefOf.Gay) || pawn.story.traits.HasTrait(TraitDefOf.Bisexual) || pawn.story.traits.HasTrait(TraitDefOf.Asexual) || pawn.story.traits.HasTrait(TraitDefOf.PsychicSensitivity)))
                {
                    if (pawn.story.traits.HasTrait(TraitDefOf.Gay))
                    {
                        comp.sexuality = Sexuality.Gay;
                    }
                    else if (pawn.story.traits.HasTrait(TraitDefOf.Bisexual))
                    {
                        comp.sexuality = Sexuality.Bisexual;
                    }
                    else if (pawn.story.traits.HasTrait(TraitDefOf.Asexual))
                    {
                        comp.sexuality = Sexuality.Asexual;
                    }
                    if (pawn.story.traits.HasTrait(TraitDefOf.PsychicSensitivity))
                    {
                        switch (pawn.story.traits.GetTrait(TraitDefOf.PsychicSensitivity).Degree)
                        {
                        case -2: comp.PsychicFactor = -1f; break;

                        case -1: comp.PsychicFactor = -0.4f; break;

                        case 1: comp.PsychicFactor = 0.4f; break;

                        case 2: comp.PsychicFactor = 0.8f; break;
                        }
                    }
                    if (!SyrIndividuality.RomanceDisabled)
                    {
                        pawn.story.traits.allTraits.RemoveAll(t => t.def == TraitDefOf.Bisexual || t.def == TraitDefOf.Asexual || t.def == TraitDefOf.Gay || t.def == TraitDefOf.PsychicSensitivity);
                        IEnumerable <TraitDef> allTraitDefs   = DefDatabase <TraitDef> .AllDefsListForReading;
                        Func <TraitDef, float> weightSelector = (TraitDef tr) => tr.GetGenderSpecificCommonality(pawn.gender);
                        TraitDef newTraitDef = allTraitDefs.RandomElementByWeight(weightSelector);
                        if (!pawn.story.traits.HasTrait(newTraitDef) && (pawn.Faction == null || Faction.OfPlayerSilentFail == null || !pawn.Faction.HostileTo(Faction.OfPlayer) || newTraitDef.allowOnHostileSpawn) &&
                            !pawn.story.traits.allTraits.Any((Trait tr) => newTraitDef.ConflictsWith(tr)) && (newTraitDef.requiredWorkTypes == null ||
                                                                                                              !pawn.OneOfWorkTypesIsDisabled(newTraitDef.requiredWorkTypes)) && !pawn.WorkTagIsDisabled(newTraitDef.requiredWorkTags))
                        {
                            int degree = PawnGenerator.RandomTraitDegree(newTraitDef);
                            if (pawn.story.childhood == null || !pawn.story.childhood.DisallowsTrait(newTraitDef, degree) && (pawn.story.adulthood == null || !pawn.story.adulthood.DisallowsTrait(newTraitDef, degree)))
                            {
                                Trait trait = new Trait(newTraitDef, degree, false);
                                pawn.story.traits.GainTrait(trait);
                            }
                        }
                    }
                }
            }
        }
예제 #6
0
        public override float GetValueUnfinalized(StatRequest req, bool applyPostProcess = true)
        {
            CompIndividuality comp = req.Thing.TryGetComp <CompIndividuality>();

            if (comp != null)
            {
                return(base.GetValueUnfinalized(req, applyPostProcess) + req.Thing.TryGetComp <CompIndividuality>().BodyWeight);
            }
            else
            {
                return(base.GetValueUnfinalized(req, applyPostProcess));
            }
        }
예제 #7
0
        public override string GetExplanationUnfinalized(StatRequest req, ToStringNumberSense numberSense)
        {
            StringBuilder     stringBuilder = new StringBuilder();
            CompIndividuality comp          = req.Thing.TryGetComp <CompIndividuality>();

            if (comp != null)
            {
                stringBuilder.AppendLine("BodyWeightOffset".Translate() + ": " + stat.ValueToString(comp.BodyWeight));
                return(base.GetExplanationUnfinalized(req, numberSense) + "\n" + stringBuilder.ToString().TrimEndNewlines());
            }
            else
            {
                return(base.GetExplanationUnfinalized(req, numberSense));
            }
        }
예제 #8
0
        public static bool CompAbilityEffect_WordOfLove_Prefix(ref bool __result, CompAbilityEffect_WordOfLove __instance, LocalTargetInfo target, LocalTargetInfo ___selectedTarget)
        {
            Pawn pawn              = ___selectedTarget.Pawn;
            Pawn pawn2             = target.Pawn;
            CompIndividuality comp = pawn.TryGetComp <CompIndividuality>();

            if (pawn == pawn2)
            {
                __result = false;
                return(false);
            }
            if (pawn != null && pawn2 != null && comp.sexuality != CompIndividuality.Sexuality.Bisexual)
            {
                if ((pawn.gender == pawn2.gender && comp.sexuality == CompIndividuality.Sexuality.Straight) || (pawn.gender != pawn2.gender && comp.sexuality == CompIndividuality.Sexuality.Gay))
                {
                    Messages.Message("AbilityCantApplyWrongAttractionGender".Translate(pawn, pawn2), pawn, MessageTypeDefOf.RejectInput, false);
                    __result = false;
                    return(false);
                }
            }
            __result = true;
            return(false);
        }
예제 #9
0
 public static void SecondaryLovinChanceFactor_Postfix(ref float __result, Pawn ___pawn, Pawn otherPawn, Pawn_RelationsTracker __instance)
 {
     if (!SyrIndividuality.RomanceDisabled)
     {
         CompIndividuality comp         = ___pawn.TryGetComp <CompIndividuality>();
         float             genderFactor = 1f;
         if (___pawn == otherPawn)
         {
             __result = 0f;
         }
         if (comp != null && ___pawn.gender != otherPawn.gender)
         {
             if (comp.sexuality == CompIndividuality.Sexuality.Straight)
             {
                 genderFactor = 1.0f;
             }
             else if (comp.sexuality == CompIndividuality.Sexuality.Bisexual)
             {
                 genderFactor = 0.75f;
             }
             else if (comp.sexuality == CompIndividuality.Sexuality.Gay)
             {
                 genderFactor = 0.1f;
             }
             else if (comp.sexuality == CompIndividuality.Sexuality.Asexual)
             {
                 genderFactor = 0f;
             }
         }
         else if (comp != null && ___pawn.gender == otherPawn.gender)
         {
             if (comp.sexuality == CompIndividuality.Sexuality.Gay)
             {
                 genderFactor = 1.0f;
             }
             else if (comp.sexuality == CompIndividuality.Sexuality.Bisexual)
             {
                 genderFactor = 0.75f;
             }
             else if (comp.sexuality == CompIndividuality.Sexuality.Straight)
             {
                 genderFactor = 0.1f;
             }
             else if (comp.sexuality == CompIndividuality.Sexuality.Asexual)
             {
                 genderFactor = 0f;
             }
         }
         float agePawn      = ___pawn.ageTracker.AgeBiologicalYearsFloat;
         float ageOtherPawn = otherPawn.ageTracker.AgeBiologicalYearsFloat;
         float ageFactor    = 1f;
         if (___pawn.gender == Gender.Male)
         {
             float min   = agePawn - 30f;
             float lower = agePawn - 10f;
             float upper = agePawn + 5f;
             float max   = agePawn + 15f;
             ageFactor = GenMath.FlatHill(0.2f, min, lower, upper, max, 0.2f, ageOtherPawn);
         }
         else if (___pawn.gender == Gender.Female)
         {
             float min2   = agePawn - 20f;
             float lower2 = agePawn - 10f;
             float upper2 = agePawn + 10f;
             float max2   = agePawn + 30f;
             ageFactor = GenMath.FlatHill(0.2f, min2, lower2, upper2, max2, 0.2f, ageOtherPawn);
         }
         float healthFactor = 1f;
         healthFactor *= Mathf.Lerp(0.2f, 1f, otherPawn.health.capacities.GetLevel(PawnCapacityDefOf.Talking));
         float beauty = 0;
         if (otherPawn.RaceProps.Humanlike)
         {
             beauty = otherPawn.GetStatValue(StatDefOf.PawnBeauty, true);
         }
         float beautyFactor = 1f;
         beautyFactor = beautyCurve.Evaluate(beauty);
         float youthFactorPawn      = Mathf.InverseLerp(16f, 18f, agePawn);
         float youthFactorOtherPawn = Mathf.InverseLerp(16f, 18f, ageOtherPawn);
         __result = genderFactor * ageFactor * healthFactor * beautyFactor * youthFactorPawn * youthFactorOtherPawn;
     }
 }
예제 #10
0
        private static float RandomSelectionWeight_Method(Pawn initiator, Pawn recipient)
        {
            CompIndividuality compOther = recipient.TryGetComp <CompIndividuality>();
            CompIndividuality comp      = initiator.TryGetComp <CompIndividuality>();

            if (LovePartnerRelationUtility.LovePartnerRelationExists(initiator, recipient))
            {
                return(0f);
            }
            float attractiveness = initiator.relations.SecondaryRomanceChanceFactor(recipient);

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

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

            if (pawn != null)
            {
                float opinionOfSpouse = initiator.relations.OpinionOf(pawn);
                existingLovePartnerFactor = Mathf.InverseLerp(50f, -50f, opinionOfSpouse);
            }
            float romanceFactor;

            if (compOther != null)
            {
                romanceFactor = compOther.RomanceFactor * 2f;
            }
            else
            {
                romanceFactor = 1f;
            }
            float attractivenessFactor = Mathf.InverseLerp(0.15f, 1f, attractiveness);
            float opinionFactor        = Mathf.InverseLerp(5f, 100f, opinionOfOther);
            float genderFactor         = 1f;

            if (initiator.gender != recipient.gender && compOther != null && comp != null)
            {
                if (compOther.sexuality == CompIndividuality.Sexuality.Straight)
                {
                    genderFactor = 1.0f;
                }
                else if (compOther.sexuality == CompIndividuality.Sexuality.Bisexual)
                {
                    genderFactor = 0.75f;
                }
                else if (compOther.sexuality == CompIndividuality.Sexuality.Gay)
                {
                    genderFactor = 0.1f;
                }
                else if (compOther.sexuality == CompIndividuality.Sexuality.Asexual && comp.sexuality == CompIndividuality.Sexuality.Asexual)
                {
                    genderFactor = 1.0f;
                }
            }
            if (initiator.gender == recipient.gender && compOther != null && comp != null)
            {
                if (compOther.sexuality == CompIndividuality.Sexuality.Gay)
                {
                    genderFactor = 1.0f;
                }
                else if (compOther.sexuality == CompIndividuality.Sexuality.Bisexual)
                {
                    genderFactor = 0.75f;
                }
                else if (compOther.sexuality == CompIndividuality.Sexuality.Straight)
                {
                    genderFactor = 0.1f;
                }
                else if (compOther.sexuality == CompIndividuality.Sexuality.Asexual && comp.sexuality == CompIndividuality.Sexuality.Asexual)
                {
                    genderFactor = 0.5f;
                }
            }
            return(1.15f * romanceFactor * attractivenessFactor * opinionFactor * existingLovePartnerFactor * genderFactor);
        }
        public static void DrawIndividualityCard(Rect rect, Pawn pawn)
        {
            CompIndividuality comp = pawn.TryGetComp <CompIndividuality>();

            if (pawn != null && comp != null)
            {
                Rect iconRect = new Rect(0f, 10f, 40f, 40f);
                Widgets.ThingIcon(iconRect, pawn, 1f);
                Text.Font = GameFont.Medium;
                Rect nameRect = new Rect(56f, 0f, rect.width, 30f);
                Widgets.Label(nameRect, pawn.Name.ToStringShort);
                Text.Font = GameFont.Tiny;
                float num       = nameRect.y + nameRect.height;
                Rect  titleRect = new Rect(56f, num, rect.width, 24f);
                Widgets.Label(titleRect, "IndividualityWindow".Translate());
                Text.Font = GameFont.Small;
                num      += titleRect.height + 17f;
                if (!SyrIndividuality.RomanceDisabled)
                {
                    Rect rect2 = new Rect(0f, num, rect.width - 10f, 24f);
                    Widgets.Label(new Rect(10f, num, rect.width, 24f), "SexualityPawn".Translate() + ": " + comp.sexuality);
                    TipSignal SexualityPawnTooltip = "SexualityPawnTooltip".Translate();
                    TooltipHandler.TipRegion(rect2, SexualityPawnTooltip);
                    Widgets.DrawHighlightIfMouseover(rect2);
                    num += rect2.height + 2f;
                    Rect rect3 = new Rect(0f, num, rect.width - 10f, 24f);
                    Widgets.Label(new Rect(10f, num, rect.width, 24f), "RomanceFactor".Translate() + ": " + (comp.RomanceFactor * 2).ToStringByStyle(ToStringStyle.PercentZero));
                    TipSignal RomanceFactorTooltip = "RomanceFactorTooltip".Translate();
                    TooltipHandler.TipRegion(rect3, RomanceFactorTooltip);
                    Widgets.DrawHighlightIfMouseover(rect3);
                    num += rect3.height + 2f;
                    if (editMode)
                    {
                        if (ScrolledDown(rect2, true) || LeftClicked(rect2))
                        {
                            SoundDefOf.DragSlider.PlayOneShotOnCamera(null);
                            comp.sexuality += 1;
                            if (comp.sexuality > CompIndividuality.Sexuality.Asexual)
                            {
                                comp.sexuality = CompIndividuality.Sexuality.Straight;
                            }
                        }
                        else if (ScrolledUp(rect2, true) || RightClicked(rect2))
                        {
                            SoundDefOf.DragSlider.PlayOneShotOnCamera(null);
                            comp.sexuality -= 1;
                            if (comp.sexuality < CompIndividuality.Sexuality.Straight)
                            {
                                comp.sexuality = CompIndividuality.Sexuality.Asexual;
                            }
                        }
                        else if (ScrolledDown(rect3, true) || LeftClicked(rect3))
                        {
                            SoundDefOf.DragSlider.PlayOneShotOnCamera(null);
                            comp.RomanceFactor += 0.1f;
                            if (comp.RomanceFactor > 1.05f)
                            {
                                comp.RomanceFactor = 0.1f;
                            }
                        }
                        else if (ScrolledUp(rect3, true) || RightClicked(rect3))
                        {
                            SoundDefOf.DragSlider.PlayOneShotOnCamera(null);
                            comp.RomanceFactor -= 0.1f;
                            if (comp.RomanceFactor < 0.05f)
                            {
                                comp.RomanceFactor = 1f;
                            }
                        }
                    }
                }
                Rect rect4 = new Rect(0f, num, rect.width - 10f, 24f);
                Widgets.Label(new Rect(10f, num, rect.width, 24f), "PsychicFactor".Translate() + ": " + comp.PsychicFactor.ToStringByStyle(ToStringStyle.PercentZero, ToStringNumberSense.Offset));
                TipSignal PsychicFactorTooltip = "PsychicFactorTooltip".Translate();
                TooltipHandler.TipRegion(rect4, PsychicFactorTooltip);
                Widgets.DrawHighlightIfMouseover(rect4);
                num += rect4.height + 2f;
                Rect rect5 = new Rect(0f, num, rect.width - 10f, 24f);
                Widgets.Label(new Rect(10f, num, rect.width, 24f), "BodyWeight".Translate() + ": " + (comp.BodyWeight + pawn.def.statBases.Find(s => s.stat == StatDefOf.Mass).value *pawn.BodySize + " kg (" + pawn.story.bodyType + ")"));
                TipSignal BodyWeightTooltip = "BodyWeightTooltip".Translate();
                TooltipHandler.TipRegion(rect5, BodyWeightTooltip);
                Widgets.DrawHighlightIfMouseover(rect5);
                num += rect5.height + 7f;
                Rect editModeTooltip = new Rect(10f, num, rect.width, 24f);
                if (editMode)
                {
                    GUI.color = Color.red;
                    Text.Font = GameFont.Tiny;
                    Widgets.Label(editModeTooltip, "SyrIndividuality_EditModeTooltip".Translate());
                    GUI.color = Color.white;
                    Text.Font = GameFont.Small;
                }
                num += editModeTooltip.height + 13f;
                Rect checkBoxRect = new Rect(rect.width / 2 - 90f, num, 180f, 40f);
                bool leftClick    = Event.current.type == EventType.KeyDown && Event.current.keyCode == KeyCode.Mouse0;
                bool rightClick   = Event.current.type == EventType.KeyDown && Event.current.keyCode == KeyCode.Mouse1;
                if (!editMode)
                {
                    if (Widgets.ButtonText(checkBoxRect, "SyrIndividuality_EditModeOn".Translate()))
                    {
                        SoundDefOf.Tick_High.PlayOneShotOnCamera(null);
                        editMode = true;
                    }
                }
                else
                {
                    if (Widgets.ButtonText(checkBoxRect, "SyrIndividuality_EditModeOff".Translate()))
                    {
                        SoundDefOf.Tick_Low.PlayOneShotOnCamera(null);
                        editMode = false;
                    }
                    if (ScrolledDown(rect4, true) || LeftClicked(rect4))
                    {
                        SoundDefOf.DragSlider.PlayOneShotOnCamera(null);
                        comp.PsychicFactor += 0.2f;
                        if (comp.PsychicFactor > 1f)
                        {
                            comp.PsychicFactor = -1f;
                        }
                    }
                    else if (ScrolledUp(rect4, true) || RightClicked(rect4))
                    {
                        SoundDefOf.DragSlider.PlayOneShotOnCamera(null);
                        comp.PsychicFactor -= 0.2f;
                        if (comp.PsychicFactor < -1f)
                        {
                            comp.PsychicFactor = 1f;
                        }
                    }
                    else if (ScrolledDown(rect5, true) || LeftClicked(rect5))
                    {
                        SoundDefOf.DragSlider.PlayOneShotOnCamera(null);
                        comp.BodyWeight += 10;
                        if (comp.BodyWeight > 40)
                        {
                            comp.BodyWeight = -20;
                        }
                    }
                    else if (ScrolledUp(rect5, true) || RightClicked(rect5))
                    {
                        SoundDefOf.DragSlider.PlayOneShotOnCamera(null);
                        comp.BodyWeight -= 10;
                        if (comp.BodyWeight < -20)
                        {
                            comp.BodyWeight = 40;
                        }
                    }
                }
            }
        }