using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Verse; using RimWorld; using rjw; using Milk; using UnityEngine; namespace CRIALactation { public class CompInduceLactation : ThingComp { private readonly int OneDayInTicks = 60000; private int TicksSinceLastMassage = -60000; private float InductionCompletionPercent = 0f; public bool isActive = false; public bool CanMassage = true; public int lastHumanLactationIngestedTick = 0; public override void CompTick() { base.CompTick(); Pawn p = this.parent as Pawn; if (!p.IsHashIntervalTick(100)) { return; } if (LactationUtility.IsLactating(p)) { InductionCompletionPercent = 0.8f; isActive = false; return; } if (!isActive) { return; } if(TicksSinceLastMassage + OneDayInTicks / Props.TimesMassagedADay < GenTicks.TicksGame) { CanMassage = true; } if(InductionCompletionPercent >= 1) { string main = p.Name.ToStringShort + "'s breasts have been stimulated enough to induce lactation! They can now begin producing milk for their colony's consumption."; var letter = LetterMaker.MakeLetter(p.Name.ToStringShort + " induced lactation", main, LetterDefOf.PositiveEvent); Find.LetterStack.ReceiveLetter(letter); LactationUtility.StartLactating(p, true); isActive = false; InductionCompletionPercent = 0.80f; //start at 80% in case they ever lose lactating again } } public void MassageBreasts() { InductionCompletionPercent += (float)1 / (Props.DaysToLactating * (Props.TimesMassagedADay + Rand.Value)); TicksSinceLastMassage = GenTicks.TicksGame; CanMassage = false; } public CompProperties_InduceLactation Props { get { return (CompProperties_InduceLactation)props; } } public override IEnumerable CompFloatMenuOptions(Pawn pawn) { if (pawn != this.parent as Pawn && !((this.parent as Pawn).IsSlaveOfColony || (this.parent as Pawn).IsPrisonerOfColony)) yield break; if (LactationUtility.IsLactating(pawn)) yield break; if(LactationUtility.HasMilkableBreasts(this.parent as Pawn)) { if(isActive) { //stop trying to induce lactation yield return new FloatMenuOption("Undesignate induce lactation", () => { isActive = false; }); } else { //induce lactation yield return new FloatMenuOption("Designate induce lactation", () => { isActive = true; }); } } else { yield return new FloatMenuOption("Designate induce lactation (no milkable breasts)", null); } yield break; } public override void PostExposeData() { base.PostExposeData(); Scribe_Values.Look(ref this.InductionCompletionPercent, "InductionCompletionPercent", 0f); Scribe_Values.Look(ref this.TicksSinceLastMassage, "TicksSinceLastMassage", -60000); Scribe_Values.Look(ref this.lastHumanLactationIngestedTick, "lastHumanLactationIngestedTick", 0); Scribe_Values.Look(ref this.isActive, "IsActive", false); Scribe_Values.Look(ref this.CanMassage, "CanMassage", false); } public override string CompInspectStringExtra() { if (!isActive) return null; string result = "Induce lactation completion: " + InductionCompletionPercent.ToStringPercent(); if(CanMassage) { result += "\nReady to massage."; } return result; } } }