mirror of
https://github.com/vegapnk/RJW-Genes.git
synced 2024-08-15 00:23:31 +00:00
succubi are back
This commit is contained in:
parent
701168f642
commit
0617ea4995
124 changed files with 3894 additions and 12 deletions
|
@ -0,0 +1,90 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using RimWorld;
|
||||
using Verse;
|
||||
using Verse.AI;
|
||||
using rjw;
|
||||
|
||||
namespace RJW_Genes
|
||||
{
|
||||
public class JobDriver_CastAbilityAfterSex : JobDriver_SexBaseInitiator
|
||||
{
|
||||
//Summary//
|
||||
//Similar to jobdriver rape, but it cast an ability after sex and tries to limit what kind of sexinteractions are allowed.
|
||||
protected override IEnumerable<Toil> MakeNewToils()
|
||||
{
|
||||
base.setup_ticks();
|
||||
//this.FailOnDespawnedOrNull(TargetIndex.A);
|
||||
//this.FailOnCannotTouch(TargetIndex.B, PathEndMode.OnCell);
|
||||
this.FailOnDespawnedNullOrForbidden(this.iTarget);
|
||||
//this.FailOn(() => !target.health.capacities.CanBeAwake);
|
||||
JobDef PartnerJob = xxx.gettin_raped;
|
||||
yield return Toils_Goto.Goto(TargetIndex.A, PathEndMode.OnCell);
|
||||
yield return new Toil
|
||||
{
|
||||
defaultCompleteMode = ToilCompleteMode.Instant,
|
||||
socialMode = RandomSocialMode.Off,
|
||||
initAction = delegate ()
|
||||
{
|
||||
Job newJob = JobMaker.MakeJob(PartnerJob, this.pawn, this.Partner);
|
||||
this.Partner.jobs.StartJob(newJob, JobCondition.InterruptForced, null, false, true, null, null, false, false, null, false, true);
|
||||
}
|
||||
};
|
||||
Toil toil = new Toil();
|
||||
toil.defaultCompleteMode = ToilCompleteMode.Never;
|
||||
toil.socialMode = RandomSocialMode.Off;
|
||||
toil.defaultDuration = this.duration;
|
||||
toil.handlingFacing = true;
|
||||
toil.FailOn(() => this.Partner.CurJob.def != PartnerJob);
|
||||
toil.initAction = delegate ()
|
||||
{
|
||||
this.Partner.pather.StopDead();
|
||||
this.Partner.jobs.curDriver.asleep = false;
|
||||
|
||||
//Tries to find CompProperties_SexInteractionRequirements and if it finds it it will try and generate sexprops based on the sexpropsrequirements.
|
||||
foreach (AbilityComp comp in this.job.ability.comps)
|
||||
{
|
||||
if (comp.props is CompProperties_SexInteractionRequirements)
|
||||
{
|
||||
CompProperties_SexInteractionRequirements sexpropsreq = comp.props as CompProperties_SexInteractionRequirements;
|
||||
this.Sexprops = CustomSexInteraction_Helper.GenerateSexProps(this.pawn, this.Partner, sexpropsreq);
|
||||
}
|
||||
}
|
||||
this.Start();
|
||||
this.Sexprops.usedCondom = (CondomUtility.TryUseCondom(this.pawn) || CondomUtility.TryUseCondom(this.Partner));
|
||||
};
|
||||
toil.AddPreTickAction(delegate
|
||||
{
|
||||
if (this.pawn.IsHashIntervalTick(this.ticks_between_hearts))
|
||||
{
|
||||
this.ThrowMetaIconF(this.pawn.Position, this.pawn.Map, FleckDefOf.Heart);
|
||||
}
|
||||
this.SexTick(this.pawn, this.Partner, true, true);
|
||||
SexUtility.reduce_rest(this.Partner, 1f);
|
||||
SexUtility.reduce_rest(this.pawn, 1f);
|
||||
if (this.ticks_left <= 0)
|
||||
{
|
||||
this.ReadyForNextToil();
|
||||
}
|
||||
});
|
||||
toil.AddFinishAction(delegate
|
||||
{
|
||||
this.End();
|
||||
});
|
||||
yield return toil;
|
||||
yield return new Toil
|
||||
{
|
||||
initAction = delegate ()
|
||||
{
|
||||
SexUtility.ProcessSex(this.Sexprops);
|
||||
},
|
||||
defaultCompleteMode = ToilCompleteMode.Instant
|
||||
};
|
||||
yield return Toils_Combat.CastVerb(TargetIndex.A, TargetIndex.B, false);
|
||||
yield break;
|
||||
}
|
||||
}
|
||||
}
|
57
Source/Genes/Life_Force/JobDrivers/JobDriver_Flirt.cs
Normal file
57
Source/Genes/Life_Force/JobDrivers/JobDriver_Flirt.cs
Normal file
|
@ -0,0 +1,57 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Verse;
|
||||
using Verse.AI;
|
||||
using RimWorld;
|
||||
using rjw;
|
||||
namespace RJW_Genes
|
||||
{
|
||||
public class JobDriver_Flirt : JobDriver
|
||||
{
|
||||
private Pawn Target
|
||||
{
|
||||
get
|
||||
{
|
||||
return (Pawn)((Thing)this.pawn.CurJob.GetTarget(TargetIndex.A));
|
||||
}
|
||||
}
|
||||
public override bool TryMakePreToilReservations(bool errorOnFailed)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
//Some wait toils to induce delay
|
||||
protected override IEnumerable<Toil> MakeNewToils()
|
||||
{
|
||||
this.FailOnDespawnedOrNull(TargetIndex.A);
|
||||
yield return Toils_Interpersonal.GotoInteractablePosition(TargetIndex.A);
|
||||
yield return Toils_General.Wait(300, TargetIndex.A);
|
||||
yield return Toils_Interpersonal.WaitToBeAbleToInteract(this.pawn);
|
||||
Toil toil = Toils_Interpersonal.GotoInteractablePosition(TargetIndex.A);
|
||||
toil.socialMode = RandomSocialMode.Off;
|
||||
yield return toil;
|
||||
yield return this.InteractToil();
|
||||
Toil toil1 = Toils_General.Wait(300, TargetIndex.A);
|
||||
toil1.socialMode = RandomSocialMode.Off;
|
||||
yield return toil1;
|
||||
yield break;
|
||||
}
|
||||
private Toil InteractToil()
|
||||
{
|
||||
return Toils_General.Do(delegate
|
||||
{
|
||||
if (this.pawn.interactions.TryInteractWith(this.Target, ThoughtDefOf.rjw_genes_flirt))
|
||||
{
|
||||
Need_Sex need_Sex = this.Target.needs.TryGetNeed<Need_Sex>();
|
||||
need_Sex.CurLevel += -0.01f;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private const TargetIndex TargetInd = TargetIndex.A;
|
||||
}
|
||||
}
|
||||
|
55
Source/Genes/Life_Force/JobDrivers/JobDriver_Seduced.cs
Normal file
55
Source/Genes/Life_Force/JobDrivers/JobDriver_Seduced.cs
Normal file
|
@ -0,0 +1,55 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using RimWorld;
|
||||
using Verse;
|
||||
using Verse.AI;
|
||||
using rjw;
|
||||
using rjw.Modules.Interactions.Enums;
|
||||
using rjw.Modules.Interactions.Helpers;
|
||||
using rjw.Modules.Interactions.Objects;
|
||||
using rjw.Modules.Interactions.Contexts;
|
||||
using rjw.Modules.Interactions.Implementation;
|
||||
|
||||
namespace RJW_Genes
|
||||
{
|
||||
public class JobDriver_Seduced : JobDriver
|
||||
{
|
||||
//Summary//
|
||||
//Makes a pawn move to seducing pawn and then tries to rape them.
|
||||
protected override IEnumerable<Toil> MakeNewToils()
|
||||
{
|
||||
|
||||
this.FailOnDespawnedNullOrForbidden(TargetIndex.A);
|
||||
this.FailOn(() => !this.pawn.CanReserve(TargetA, xxx.max_rapists_per_prisoner, 0, null, false));
|
||||
this.FailOn(() => this.pawn.IsFighting());
|
||||
this.FailOn(() => this.pawn.Drafted);
|
||||
|
||||
Pawn partner = this.job.GetTarget(TargetIndex.A).Pawn;
|
||||
yield return Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.Touch);
|
||||
yield return new Toil
|
||||
{
|
||||
defaultCompleteMode = ToilCompleteMode.Instant,
|
||||
socialMode = RandomSocialMode.Off,
|
||||
initAction = delegate ()
|
||||
{
|
||||
if(partner != null)
|
||||
{
|
||||
partner.drafter.Drafted = false;
|
||||
this.pawn.needs.mood.thoughts.memories.TryGainMemory(ThoughtDefOf.rjw_genes_seduced, partner, null);
|
||||
Job newJob = JobMaker.MakeJob(JobDefOf.sex_on_spot, pawn);
|
||||
partner.jobs.StartJob(newJob, JobCondition.InterruptForced, null, false, true, null, null, false, false, null, false, true);
|
||||
}
|
||||
}
|
||||
};
|
||||
yield break;
|
||||
}
|
||||
|
||||
public override bool TryMakePreToilReservations(bool errorOnFailed)
|
||||
{
|
||||
return this.pawn.Reserve(TargetA, this.job, xxx.max_rapists_per_prisoner, 0, null, errorOnFailed);
|
||||
}
|
||||
}
|
||||
}
|
108
Source/Genes/Life_Force/JobDrivers/JobDriver_SexOnSpot.cs
Normal file
108
Source/Genes/Life_Force/JobDrivers/JobDriver_SexOnSpot.cs
Normal file
|
@ -0,0 +1,108 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using RimWorld;
|
||||
using Verse;
|
||||
using Verse.AI;
|
||||
using rjw;
|
||||
using rjw.Modules.Interactions.Enums;
|
||||
using rjw.Modules.Interactions.Helpers;
|
||||
using rjw.Modules.Interactions.Objects;
|
||||
using rjw.Modules.Interactions.Contexts;
|
||||
using rjw.Modules.Interactions.Implementation;
|
||||
|
||||
namespace RJW_Genes
|
||||
{
|
||||
public class JobDriver_SexOnSpot : JobDriver_SexBaseInitiator
|
||||
{
|
||||
protected override IEnumerable<Toil> MakeNewToils()
|
||||
{
|
||||
if (RJWSettings.DebugRape)
|
||||
{
|
||||
ModLog.Message(base.GetType().ToString() + "::MakeNewToils() called");
|
||||
}
|
||||
base.setup_ticks();
|
||||
JobDef PartnerJob = JobDefOf.sex_on_spot_reciever;
|
||||
this.FailOnDespawnedNullOrForbidden(this.iTarget);
|
||||
this.FailOn(() => !this.pawn.CanReserve(this.Partner, xxx.max_rapists_per_prisoner, 0, null, false));
|
||||
this.FailOn(() => this.pawn.IsFighting());
|
||||
this.FailOn(() => this.Partner.IsFighting());
|
||||
this.FailOn(() => this.pawn.Drafted);
|
||||
yield return Toils_Goto.GotoThing(this.iTarget, PathEndMode.Touch);
|
||||
if (this.pawn.HostileTo(this.Partner))
|
||||
{
|
||||
Partner.health.AddHediff(xxx.submitting);
|
||||
}
|
||||
yield return Toils_Goto.GotoThing(this.iTarget, PathEndMode.OnCell);
|
||||
//Give thought malus to partner (I was seduced into having sex against my will)
|
||||
yield return new Toil
|
||||
{
|
||||
defaultCompleteMode = ToilCompleteMode.Instant,
|
||||
socialMode = RandomSocialMode.Off,
|
||||
initAction = delegate ()
|
||||
{
|
||||
if (!(this.Partner.jobs.curDriver is JobDriver_SexOnSpotReciever))
|
||||
{
|
||||
Job newJob = JobMaker.MakeJob(PartnerJob, this.pawn);
|
||||
Building_Bed building_Bed = null;
|
||||
if (this.Partner.GetPosture() == PawnPosture.LayingInBed)
|
||||
{
|
||||
building_Bed = this.Partner.CurrentBed();
|
||||
}
|
||||
this.Partner.jobs.StartJob(newJob, JobCondition.InterruptForced, null, false, true, null, null, false, false, null, false, true);
|
||||
if (building_Bed != null)
|
||||
{
|
||||
JobDriver_SexOnSpotReciever jobDriver_SexOnSpotReciever = this.Partner.jobs.curDriver as JobDriver_SexOnSpotReciever;
|
||||
if (jobDriver_SexOnSpotReciever == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
jobDriver_SexOnSpotReciever.Set_bed(building_Bed);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
Toil toil = new Toil();
|
||||
toil.defaultCompleteMode = ToilCompleteMode.Never;
|
||||
toil.defaultDuration = this.duration;
|
||||
toil.handlingFacing = true;
|
||||
toil.FailOn(() => this.Partner.CurJob.def != PartnerJob);
|
||||
toil.initAction = delegate ()
|
||||
{
|
||||
this.Partner.pather.StopDead();
|
||||
this.Partner.jobs.curDriver.asleep = false;
|
||||
this.Start();
|
||||
};
|
||||
toil.tickAction = delegate ()
|
||||
{
|
||||
if (this.pawn.IsHashIntervalTick(this.ticks_between_hearts))
|
||||
{
|
||||
this.ThrowMetaIconF(this.pawn.Position, this.pawn.Map, FleckDefOf.Heart);
|
||||
}
|
||||
this.SexTick(this.pawn, this.Partner, true, true);
|
||||
SexUtility.reduce_rest(this.Partner, 1f);
|
||||
SexUtility.reduce_rest(this.pawn, 2f);
|
||||
if (this.ticks_left <= 0)
|
||||
{
|
||||
this.ReadyForNextToil();
|
||||
}
|
||||
};
|
||||
toil.AddFinishAction(delegate
|
||||
{
|
||||
this.End();
|
||||
});
|
||||
yield return toil;
|
||||
yield return new Toil
|
||||
{
|
||||
initAction = delegate ()
|
||||
{
|
||||
SexUtility.ProcessSex(this.Sexprops);
|
||||
},
|
||||
defaultCompleteMode = ToilCompleteMode.Instant
|
||||
};
|
||||
yield break;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,80 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using RimWorld;
|
||||
using Verse;
|
||||
using Verse.AI;
|
||||
using rjw;
|
||||
using rjw.Modules.Interactions.Enums;
|
||||
using rjw.Modules.Interactions.Helpers;
|
||||
using rjw.Modules.Interactions.Objects;
|
||||
using rjw.Modules.Interactions.Contexts;
|
||||
using rjw.Modules.Interactions.Implementation;
|
||||
|
||||
namespace RJW_Genes
|
||||
{
|
||||
//Modified JobDriver_SexBaseRecieverLoved from rjw
|
||||
public class JobDriver_SexOnSpotReciever : JobDriver_SexBaseReciever
|
||||
{
|
||||
protected override IEnumerable<Toil> MakeNewToils()
|
||||
{
|
||||
base.setup_ticks();
|
||||
this.parteners.Add(base.Partner);
|
||||
if (this.pawn.relations.OpinionOf(base.Partner) < 0)
|
||||
{
|
||||
this.ticks_between_hearts += 50;
|
||||
}
|
||||
else if (this.pawn.relations.OpinionOf(base.Partner) > 60)
|
||||
{
|
||||
this.ticks_between_hearts -= 25;
|
||||
}
|
||||
this.FailOnDespawnedOrNull(this.iTarget);
|
||||
this.FailOn(() => !base.Partner.health.capacities.CanBeAwake);
|
||||
this.FailOn(() => this.pawn.Drafted);
|
||||
this.FailOn(() => base.Partner.Drafted);
|
||||
yield return Toils_Reserve.Reserve(this.iTarget, 1, 0, null);
|
||||
Toil toil2 = this.MakeSexToil();
|
||||
toil2.handlingFacing = false;
|
||||
yield return toil2;
|
||||
yield break;
|
||||
}
|
||||
|
||||
private Toil MakeSexToil()
|
||||
{
|
||||
Toil toil = new Toil();
|
||||
toil.defaultCompleteMode = ToilCompleteMode.Never;
|
||||
toil.socialMode = RandomSocialMode.Off;
|
||||
toil.handlingFacing = true;
|
||||
toil.tickAction = delegate ()
|
||||
{
|
||||
if (this.pawn.IsHashIntervalTick(this.ticks_between_hearts))
|
||||
{
|
||||
base.ThrowMetaIconF(this.pawn.Position, this.pawn.Map, FleckDefOf.Heart);
|
||||
}
|
||||
};
|
||||
toil.AddEndCondition(delegate
|
||||
{
|
||||
if (this.parteners.Count <= 0)
|
||||
{
|
||||
return JobCondition.Succeeded;
|
||||
}
|
||||
return JobCondition.Ongoing;
|
||||
});
|
||||
toil.AddFinishAction(delegate
|
||||
{
|
||||
|
||||
GlobalTextureAtlasManager.TryMarkPawnFrameSetDirty(this.pawn);
|
||||
Hediff submitting = this.pawn.health.hediffSet.GetFirstHediffOfDef(xxx.submitting);
|
||||
if (submitting != null)
|
||||
{
|
||||
this.pawn.health.RemoveHediff(submitting);
|
||||
this.pawn.stances.stunner.StunFor(60, this.pawn, true, true);
|
||||
}
|
||||
});
|
||||
toil.socialMode = RandomSocialMode.Off;
|
||||
return toil;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue