mirror of
https://github.com/vegapnk/RJW-Genes.git
synced 2024-08-15 00:23:31 +00:00
Resolve Merge conflicts
This commit is contained in:
commit
bf5617ffe0
35 changed files with 641 additions and 123 deletions
|
@ -0,0 +1,59 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Verse;
|
||||
using RimWorld;
|
||||
using Verse.AI;
|
||||
using rjw;
|
||||
|
||||
namespace RJW_Genes
|
||||
{
|
||||
//Summary//
|
||||
//Returns invalid if a pawn is not naked
|
||||
//Summary//
|
||||
public class CompAbilityEffect_CasterIsNaked : CompAbilityEffect_WithDest
|
||||
{
|
||||
private new CompProperties_CasterIsNaked Props
|
||||
{
|
||||
get
|
||||
{
|
||||
return (CompProperties_CasterIsNaked)this.props;
|
||||
}
|
||||
}
|
||||
|
||||
public override bool GizmoDisabled(out string reason)
|
||||
{
|
||||
Pawn pawn = this.CasterPawn;
|
||||
if (pawn != null)
|
||||
{
|
||||
//Copied from ThoughtWorker_NudistNude.CurrentStateInternal
|
||||
List<Apparel> wornApparel = pawn.apparel.WornApparel;
|
||||
for (int i = 0; i < wornApparel.Count; i++)
|
||||
{
|
||||
Apparel apparel = wornApparel[i];
|
||||
if (apparel.def.apparel.countsAsClothingForNudity)
|
||||
{
|
||||
for (int j = 0; j < apparel.def.apparel.bodyPartGroups.Count; j++)
|
||||
{
|
||||
if (apparel.def.apparel.bodyPartGroups[j] == BodyPartGroupDefOf.Torso)
|
||||
{
|
||||
reason = pawn.Name + " is not naked";
|
||||
return true;
|
||||
}
|
||||
if (apparel.def.apparel.bodyPartGroups[j] == BodyPartGroupDefOf.Legs)
|
||||
{
|
||||
reason = pawn.Name + " is not naked";
|
||||
return true;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
reason = null;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Verse;
|
||||
using RimWorld;
|
||||
|
||||
namespace RJW_Genes
|
||||
{
|
||||
public class CompProperties_CasterIsNaked : CompProperties_EffectWithDest
|
||||
{
|
||||
public CompProperties_CasterIsNaked()
|
||||
{
|
||||
this.compClass = typeof(CompAbilityEffect_CasterIsNaked);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -24,6 +24,11 @@ namespace RJW_Genes
|
|||
{
|
||||
return false;
|
||||
}
|
||||
if (!RJW_GenesSettings.rjw_genes_sexdemon_visit_incubi && !RJW_GenesSettings.rjw_genes_sexdemon_visit_succubi)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach (Pawn pawn in map.mapPawns.FreeColonistsAndPrisonersSpawned)
|
||||
{
|
||||
if (pawn.jobs.curDriver.asleep && xxx.need_some_sex(pawn) > 1f)
|
||||
|
@ -38,46 +43,68 @@ namespace RJW_Genes
|
|||
protected override bool TryExecuteWorker(IncidentParms parms)
|
||||
{
|
||||
Map map = (Map)parms.target;
|
||||
Pawn victim = ValidVictims(map).RandomElement();
|
||||
if (victim == null)
|
||||
List < Pawn > victims = ValidVictims(map).ToList();
|
||||
if(victims.NullOrEmpty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
IntVec3 loc = victim.Position;
|
||||
Faction faction;
|
||||
if (!this.TryFindFormerFaction(out faction))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
//Spawn succubus at pawn
|
||||
Pawn succubus = PawnGenerator.GeneratePawn(new PawnGenerationRequest(PawnKindDef.Named("rjw_genes_succubus"), faction, PawnGenerationContext.NonPlayer, -1,
|
||||
false, false, false, true, false, 1f, false, true, false, true, true, false, false, false, false, 0f, 0f, null, 1f, null, null,
|
||||
null, null, null, null, null, null, null, null, null, null, false, false, false, false, null, null, null, null, null, 0f,
|
||||
DevelopmentalStage.Adult, null, null, null, false));
|
||||
succubus.SetFaction(null, null);
|
||||
GenSpawn.Spawn(succubus, loc, map, WipeMode.Vanish);
|
||||
|
||||
//Set succubus behaviour
|
||||
List<Pawn> list = new List<Pawn> {succubus};
|
||||
LordMaker.MakeNewLord(parms.faction, this.CreateLordJob(parms, succubus, victim), map, list);
|
||||
|
||||
//Make succubus rape victim.
|
||||
if (RJWSettings.rape_enabled)
|
||||
int pawn_amount = RJW_GenesSettings.rjw_genes_sexdemon_visit_groups ? Rand.Range(1, victims.Count) : 1;
|
||||
List<Pawn> new_sexdemons = new List<Pawn>();
|
||||
for (int i = 0; i < pawn_amount; i++)
|
||||
{
|
||||
succubus.pather.StopDead();
|
||||
succubus.jobs.StopAll();
|
||||
Job newJob = JobMaker.MakeJob(xxx.RapeRandom, victim);
|
||||
succubus.jobs.StartJob(newJob, JobCondition.InterruptForced, null, false, true, null, null, false, false, null, false, true);
|
||||
}
|
||||
Pawn victim = victims.RandomElement();
|
||||
IntVec3 loc = victim.Position;
|
||||
|
||||
//Broken for now
|
||||
//Sends letter
|
||||
//string value = succubus.DevelopmentalStage.Child() ? "FeralChild".Translate().ToString() : succubus.KindLabel;
|
||||
//TaggedString value2 = succubus.DevelopmentalStage.Child() ? "Child".Translate() : "Person".Translate();
|
||||
//TaggedString baseLetterLabel = this.def.letterLabel.Formatted(value).CapitalizeFirst();
|
||||
//TaggedString baseLetterText = this.def.letterText.Formatted(succubus.NameShortColored, value2, succubus.Named("PAWN")).AdjustedFor(succubus, "PAWN", true).CapitalizeFirst();
|
||||
//PawnRelationUtility.TryAppendRelationsWithColonistsInfo(ref baseLetterText, ref baseLetterLabel, succubus);
|
||||
PawnKindDef pawnKindDef;
|
||||
Gender gender;
|
||||
if (victim.gender == Gender.Male || !RJW_GenesSettings.rjw_genes_sexdemon_visit_incubi)
|
||||
{
|
||||
|
||||
}
|
||||
if ((Rand.Bool && RJW_GenesSettings.rjw_genes_sexdemon_visit_succubi) || !RJW_GenesSettings.rjw_genes_sexdemon_visit_incubi)
|
||||
{
|
||||
pawnKindDef = PawnKindDef.Named("rjw_genes_succubus");
|
||||
gender = Gender.Female;
|
||||
}
|
||||
else
|
||||
{
|
||||
pawnKindDef = PawnKindDef.Named("rjw_genes_incubus");
|
||||
gender = Gender.Male;
|
||||
}
|
||||
|
||||
//Spawn succubus at pawn
|
||||
Pawn sexdemon = PawnGenerator.GeneratePawn(new PawnGenerationRequest(pawnKindDef, faction, PawnGenerationContext.NonPlayer, -1,
|
||||
false, false, false, true, false, 1f, false, true, false, true, true, false, false, false, false, 0f, 0f, null, 1f, null, null,
|
||||
null, null, null, null, null, gender, null, null, null, null, false, false, false, false, null, null, null, null, null, 0f,
|
||||
DevelopmentalStage.Adult, null, null, null, false));
|
||||
sexdemon.SetFaction(null, null);
|
||||
GenSpawn.Spawn(sexdemon, loc, map, WipeMode.Vanish);
|
||||
List<Pawn> sexdemons = new List<Pawn> { sexdemon };
|
||||
new_sexdemons.Add(sexdemon);
|
||||
|
||||
|
||||
LordMaker.MakeNewLord(Faction.OfPlayer, this.CreateLordJob(parms, sexdemon, victim), map, sexdemons);
|
||||
|
||||
//Make succubus rape victim.
|
||||
if (RJWSettings.rape_enabled)
|
||||
{
|
||||
//follow rjw rules
|
||||
if (SexAppraiser.would_fuck(sexdemon,victim) > 0f)
|
||||
{
|
||||
sexdemon.pather.StopDead();
|
||||
sexdemon.jobs.StopAll();
|
||||
Job newJob = JobMaker.MakeJob(xxx.RapeRandom, victim);
|
||||
sexdemon.jobs.StartJob(newJob, JobCondition.InterruptForced, null, false, true, null, null, false, false, null, false, true);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Find.LetterStack.ReceiveLetter("rjw_genes_sexdemon_visit_incident_label".Translate(), "rjw_genes_sexdemon_visit_incident_description".Translate(), LetterDefOf.PositiveEvent, new_sexdemons, null, null, null, null);
|
||||
//base.SendStandardLetter(baseLetterLabel, baseLetterText, this.def.letterDef, parms, succubus, Array.Empty<NamedArgument>());
|
||||
|
||||
return true;
|
||||
|
|
|
@ -7,6 +7,7 @@ using Verse;
|
|||
using Verse.AI;
|
||||
using Verse.AI.Group;
|
||||
using RimWorld;
|
||||
using rjw;
|
||||
namespace RJW_Genes
|
||||
{
|
||||
//Based on LordJob_VisitColony
|
||||
|
@ -52,8 +53,7 @@ namespace RJW_Genes
|
|||
tickLimit = Rand.Range(60000, 180000); //~1-3 days
|
||||
}
|
||||
transition1.AddTrigger(new Trigger_TicksPassed(tickLimit));
|
||||
|
||||
transition1.AddPreAction(new TransitionAction_Message("SuccubusLeaving".Translate(), null, 1f));
|
||||
transition1.AddPreAction(new TransitionAction_Custom(new Action(this.SuccubiLeave))); //Join or leave colony
|
||||
stateGraph.AddTransition(transition1);
|
||||
|
||||
//If they become hostile
|
||||
|
@ -84,7 +84,26 @@ namespace RJW_Genes
|
|||
Scribe_Values.Look<int?>(ref this.durationTicks, "durationTicks", null, false);
|
||||
Scribe_References.Look<Pawn>(ref this.target, "target", false);
|
||||
}
|
||||
|
||||
public void SuccubiLeave()
|
||||
{
|
||||
foreach (Pawn pawn in this.lord.ownedPawns)
|
||||
{
|
||||
if(colonyJoiners.Contains(pawn))
|
||||
{
|
||||
RecruitUtility.Recruit(pawn, Faction.OfPlayer);
|
||||
Find.LetterStack.ReceiveLetter("Guest Joins", string.Format("{0} enjoys it here and has decided to stay", xxx.get_pawnname(pawn)), LetterDefOf.PositiveEvent, pawn, null, null, null, null);
|
||||
}
|
||||
else
|
||||
{
|
||||
Messages.Message("SuccubusLeaving".Translate(xxx.get_pawnname(pawn)), pawn, MessageTypeDefOf.NeutralEvent, true);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public Pawn target;
|
||||
private int? durationTicks;
|
||||
public List<Pawn> colonyJoiners = new List<Pawn>();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -49,6 +49,7 @@ namespace RJW_Genes
|
|||
if (this.Pawn.genes.HasGene(GeneDefOf.rjw_genes_cum_eater)
|
||||
|| this.Pawn.genes.HasGene(GeneDefOf.rjw_genes_vaginal_absorber) || this.Pawn.genes.HasGene(GeneDefOf.rjw_genes_anal_absorber) || this.Pawn.genes.HasGene(GeneDefOf.rjw_genes_drainer))
|
||||
{
|
||||
//TODO: use mentalstatedef instead of mentalbreakdef
|
||||
MentalBreakDef randomrape = GeneDefOf.rjw_genes_lifeforce_randomrape;
|
||||
if (ModsConfig.BiotechActive &&
|
||||
this.Pawn.Spawned && !this.Pawn.InMentalState && !this.Pawn.Downed &&
|
||||
|
|
|
@ -34,8 +34,9 @@ namespace RJW_Genes
|
|||
toil.socialMode = RandomSocialMode.Off;
|
||||
yield return toil;
|
||||
yield return this.InteractToil();
|
||||
Toil toil1 = Toils_General.Wait(600, TargetIndex.A);
|
||||
Toil toil1 = Toils_General.Wait(300, TargetIndex.A);
|
||||
toil1.socialMode = RandomSocialMode.Off;
|
||||
yield return toil1;
|
||||
yield break;
|
||||
}
|
||||
private Toil InteractToil()
|
||||
|
|
|
@ -41,7 +41,6 @@ namespace RJW_Genes
|
|||
yield break;
|
||||
}
|
||||
|
||||
// Token: 0x06000420 RID: 1056 RVA: 0x00024190 File Offset: 0x00022390
|
||||
private Toil MakeSexToil()
|
||||
{
|
||||
Toil toil = new Toil();
|
||||
|
|
|
@ -14,7 +14,7 @@ namespace RJW_Genes
|
|||
protected override Job TryGiveJob(Pawn pawn)
|
||||
{
|
||||
Pawn target = pawn.mindState.duty.focus.Pawn;
|
||||
if (pawn.CanReach(target, PathEndMode.InteractionCell, Danger.Deadly))
|
||||
if (pawn.CanReach(target, PathEndMode.InteractionCell, Danger.Deadly) && !target.jobs.curDriver.asleep)
|
||||
{
|
||||
return JobMaker.MakeJob(JobDefOf.rjw_genes_flirt, target);
|
||||
}
|
||||
|
|
|
@ -4,9 +4,12 @@ using System.Linq;
|
|||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using rjw;
|
||||
using RJWSexperience;
|
||||
using RimWorld;
|
||||
using Verse;
|
||||
using Verse.AI;
|
||||
using Verse.AI.Group;
|
||||
using UnityEngine;
|
||||
namespace RJW_Genes
|
||||
{
|
||||
public class JobGiver_TryQuickieWith : ThinkNode_JobGiver
|
||||
|
@ -20,13 +23,29 @@ namespace RJW_Genes
|
|||
//can reserve eachother
|
||||
if (pawn.CanReserveAndReach(target, PathEndMode.InteractionCell, Danger.Some) && target.CanReserve(pawn, 1, 0, null, false))
|
||||
{
|
||||
//target is not busy
|
||||
//Dont interrupt player
|
||||
if (!(((jobs != null) ? jobs.curJob : null) != null && jobs.curJob.playerForced))
|
||||
{
|
||||
float willingness = TargetWillingness(pawn, target);
|
||||
if (Rand.Chance(willingness))
|
||||
{
|
||||
return JobMaker.MakeJob(xxx.quick_sex, target);
|
||||
Job newJob =JobMaker.MakeJob(xxx.quick_sex, target);
|
||||
|
||||
//Pawn joins faction when lordJob ends instead of leaving
|
||||
//in the future determine the chance of this another way
|
||||
if (Rand.Chance(JoinChance(pawn, target)))
|
||||
{
|
||||
Lord lord = pawn.GetLord();
|
||||
LordJob_SuccubusVisit lordJob = lord == null? null : lord.LordJob as LordJob_SuccubusVisit;
|
||||
if (lordJob != null)
|
||||
{
|
||||
if (!lordJob.colonyJoiners.Contains(pawn))
|
||||
{
|
||||
lordJob.colonyJoiners.Add(pawn);
|
||||
}
|
||||
}
|
||||
}
|
||||
return newJob;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -40,7 +59,7 @@ namespace RJW_Genes
|
|||
{
|
||||
if (RJWSettings.DebugLogJoinInBed) //change this when we have our own settigns
|
||||
{
|
||||
ModLog.Message(string.Format(" find_pawn_to_fuck({0}): lover has important job ({1}), skipping", pawn_name, target.jobs.curJob.def));
|
||||
//ModLog.Message(string.Format(" find_pawn_to_fuck({0}): lover has important job ({1}), skipping", pawn_name, target.jobs.curJob.def));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -80,7 +99,7 @@ namespace RJW_Genes
|
|||
{
|
||||
ModLog.Message(" find_partner(" + pawn_name + "): I interested in banging but that's cheating");
|
||||
}
|
||||
//Succubus has a small chance to seduce even if target is in relationship, maybe setting like succubus can homewreck
|
||||
//Succubus has a small chance to seduce even if target is in relationship
|
||||
willingness *= 0.1f;
|
||||
}
|
||||
else
|
||||
|
@ -95,5 +114,75 @@ namespace RJW_Genes
|
|||
}
|
||||
return willingness;
|
||||
}
|
||||
|
||||
public static float JoinChance(Pawn pawn ,Pawn target)
|
||||
{
|
||||
|
||||
float chance = 0.1f;
|
||||
|
||||
//Sex satisfaction, how good the target is at sex
|
||||
chance *= xxx.get_sex_satisfaction(target);
|
||||
|
||||
//Succubus mood
|
||||
if (pawn.needs != null && pawn.needs.mood != null)
|
||||
{
|
||||
chance *= pawn.needs.mood.CurLevelPercentage + 0.5f;
|
||||
}
|
||||
|
||||
//Size of genitals
|
||||
bool size_matters = true; //To be placed in modsettings
|
||||
if (size_matters)
|
||||
{
|
||||
//The larger the penis to greater the chance
|
||||
if (RelationsUtility.AttractedToGender(pawn, Gender.Male))
|
||||
{
|
||||
chance *= GetGenitalSize(target, true) + 0.5f;
|
||||
}
|
||||
|
||||
//The tighter the vagine the greater the chance, a size above 1 is considered as 1
|
||||
if (RelationsUtility.AttractedToGender(pawn, Gender.Female))
|
||||
{
|
||||
chance *= 1f - Mathf.Min(GetGenitalSize(target, false),1f) + 0.5f;
|
||||
}
|
||||
}
|
||||
|
||||
//Sex ability from sexperience
|
||||
if (ModsConfig.IsActive("rjw.sexperience"))
|
||||
{
|
||||
chance *= RJWSexperience.PawnExtensions.GetSexStat(pawn);
|
||||
}
|
||||
return Mathf.Max(chance,0f);
|
||||
}
|
||||
|
||||
//Gets the size of the largest penis or the tightest vagina
|
||||
public static float GetGenitalSize(Pawn pawn, bool penis_else_vagina)
|
||||
{
|
||||
List<Hediff> genitals = rjw.PawnExtensions.GetGenitalsList(pawn);
|
||||
if(!genitals.NullOrEmpty())
|
||||
{
|
||||
if (penis_else_vagina)
|
||||
{
|
||||
List<Hediff> penises = genitals.Where(genital => Genital_Helper.is_penis(genital)).ToList();
|
||||
{
|
||||
if (!penises.NullOrEmpty())
|
||||
{
|
||||
return penises.Max(genital => genital.Severity);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
List<Hediff> vaginas = genitals.Where(genital => Genital_Helper.is_vagina(genital)).ToList();
|
||||
{
|
||||
if (!vaginas.NullOrEmpty())
|
||||
{
|
||||
return vaginas.Min(genital => genital.Severity);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0f;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -61,10 +61,8 @@ namespace RJW_Genes
|
|||
return AlertReport.CulpritsAre(this.Targets);
|
||||
}
|
||||
|
||||
// Token: 0x04004B5C RID: 19292
|
||||
private List<GlobalTargetInfo> targets = new List<GlobalTargetInfo>();
|
||||
|
||||
// Token: 0x04004B5D RID: 19293
|
||||
private List<string> targetLabels = new List<string>();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue