2021-07-30 01:33:08 +00:00
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 override void CompTick ( )
{
base . CompTick ( ) ;
Pawn p = this . parent as Pawn ;
if ( ! p . IsHashIntervalTick ( 100 ) )
{
return ;
}
if ( LactationUtility . IsLactating ( p ) )
{
2021-08-02 18:55:46 +00:00
InductionCompletionPercent = 0.8f ;
2021-07-30 01:33:08 +00:00
isActive = false ;
return ;
}
2021-08-02 18:55:46 +00:00
if ( ! isActive )
{
return ;
}
2021-07-30 01:33:08 +00:00
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 ;
2021-08-02 18:55:46 +00:00
InductionCompletionPercent = 0.80f ; //start at 80% in case they ever lose lactating again
2021-07-30 01:33:08 +00:00
}
}
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 < FloatMenuOption > CompFloatMenuOptions ( Pawn pawn )
{
2021-08-01 23:17:04 +00:00
if ( pawn ! = this . parent as Pawn & & ! ( ( this . parent as Pawn ) . IsSlaveOfColony | | ( this . parent as Pawn ) . IsPrisonerOfColony ) ) yield break ;
2021-07-30 01:33:08 +00:00
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 < float > ( ref this . InductionCompletionPercent , "InductionCompletionPercent" , 0f ) ;
Scribe_Values . Look < int > ( ref this . TicksSinceLastMassage , "TicksSinceLastMassage" , - 60000 ) ;
Scribe_Values . Look < bool > ( ref this . isActive , "IsActive" , false ) ;
Scribe_Values . Look < bool > ( 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 ;
}
}
}