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); }
public static void GenerateBodyType_Postfix(Pawn pawn) { CompIndividuality comp = pawn.TryGetComp <CompIndividuality>(); if (pawn != null && comp != null) { pawn.BroadcastCompSignal("bodyTypeSelected"); } }
public static void GenerateTraits_Postfix(Pawn pawn) { CompIndividuality comp = pawn.TryGetComp <CompIndividuality>(); if (pawn != null && comp != null) { pawn.BroadcastCompSignal("traitsGenerated"); } }
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; } } }
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); } } } } } }
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)); } }
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)); } }
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); }
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; } }
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; } } } } }