update no har

This commit is contained in:
Platinum 2020-07-20 14:00:03 -07:00
commit 1b13aa267c
13 changed files with 2698 additions and 37 deletions

Binary file not shown.

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,377 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<!--
<Rimworld_Animations.AnimationDef>
<defName>Missionary</defName>
<label>missionary</label>
<sounds>true</sounds>
<sexTypes>
<li>Vaginal</li>
<li>Anal</li>
</sexTypes>
<actors>
<li>
<defNames>
<li>Human</li>
</defNames>
<isFucked>true</isFucked>
<bodyTypeOffset>
<Thin>(0.1, 0.1)</Thin>
</bodyTypeOffset>
</li>
<li>
<defNames>
<li>Human</li>
</defNames>
<isFucking>true</isFucking>
<initiator>true</initiator>
<bodyTypeOffset>
<Hulk>(0, 0.2)</Hulk>
</bodyTypeOffset>
</li>
</actors>
<animationStages>
<li>
<stageName>Slow_Insert</stageName>
<isLooping>false</isLooping>
<playTimeTicks>181</playTimeTicks>
<stageIndex>0</stageIndex>
<animationClips>
<li Class="Rimworld_Animations.PawnAnimationClip">
<keyframes>
<li>
<tickDuration>120</tickDuration>
<bodyAngle>-82.7437439</bodyAngle>
<headAngle>-77.76135</headAngle>
<genitalAngle>0</genitalAngle>
<bodyOffsetZ>0.00123929977</bodyOffsetZ>
<bodyOffsetX>-0.288235933</bodyOffsetX>
<headBob>0</headBob>
<bodyFacing>1</bodyFacing>
<headFacing>1</headFacing>
</li>
<li>
<tickDuration>60</tickDuration>
<bodyAngle>-82.7437439</bodyAngle>
<headAngle>-85.3898849</headAngle>
<genitalAngle>0</genitalAngle>
<bodyOffsetZ>0.0254950486</bodyOffsetZ>
<bodyOffsetX>-0.30147323</bodyOffsetX>
<headBob>0</headBob>
<bodyFacing>1</bodyFacing>
<headFacing>1</headFacing>
</li>
<li>
<tickDuration>1</tickDuration>
<bodyAngle>-82.7437439</bodyAngle>
<headAngle>-77.78256</headAngle>
<genitalAngle>0</genitalAngle>
<bodyOffsetZ>0.0254950486</bodyOffsetZ>
<bodyOffsetX>-0.30147323</bodyOffsetX>
<headBob>0</headBob>
<bodyFacing>1</bodyFacing>
<headFacing>1</headFacing>
</li>
</keyframes>
</li>
<li Class="Rimworld_Animations.PawnAnimationClip">
<layer>LayingPawn</layer>
<keyframes>
<li>
<tickDuration>120</tickDuration>
<bodyAngle>-8.415361</bodyAngle>
<headAngle>-24.7466831</headAngle>
<genitalAngle>0</genitalAngle>
<bodyOffsetZ>0.275328381</bodyOffsetZ>
<bodyOffsetX>0.5114879</bodyOffsetX>
<headBob>0</headBob>
<bodyFacing>3</bodyFacing>
<headFacing>3</headFacing>
</li>
<li>
<tickDuration>60</tickDuration>
<bodyAngle>11.5036926</bodyAngle>
<headAngle>-10.2523956</headAngle>
<genitalAngle>0</genitalAngle>
<bodyOffsetZ>0.226816757</bodyOffsetZ>
<bodyOffsetX>0.3989886</bodyOffsetX>
<headBob>0</headBob>
<bodyFacing>3</bodyFacing>
<headFacing>3</headFacing>
<soundEffect>Slimy</soundEffect>
</li>
<li>
<tickDuration>1</tickDuration>
<bodyAngle>3.36438</bodyAngle>
<headAngle>-18.3917084</headAngle>
<genitalAngle>0</genitalAngle>
<bodyOffsetZ>0.233432038</bodyOffsetZ>
<bodyOffsetX>0.4034014</bodyOffsetX>
<headBob>0</headBob>
<bodyFacing>3</bodyFacing>
<headFacing>3</headFacing>
</li>
</keyframes>
</li>
</animationClips>
</li>
<li>
<stageName>Breathing</stageName>
<isLooping>true</isLooping>
<playTimeTicks>182</playTimeTicks>
<stageIndex>0</stageIndex>
<animationClips>
<li Class="Rimworld_Animations.PawnAnimationClip">
<keyframes>
<li>
<tickDuration>45</tickDuration>
<bodyAngle>-82.7437439</bodyAngle>
<headAngle>-77.78256</headAngle>
<genitalAngle>0</genitalAngle>
<bodyOffsetZ>0.0254950486</bodyOffsetZ>
<bodyOffsetX>-0.30147323</bodyOffsetX>
<headBob>0</headBob>
<bodyFacing>1</bodyFacing>
<headFacing>1</headFacing>
</li>
<li>
<tickDuration>45</tickDuration>
<bodyAngle>-82.7437439</bodyAngle>
<headAngle>-77.78256</headAngle>
<genitalAngle>0</genitalAngle>
<bodyOffsetZ>0.0254950486</bodyOffsetZ>
<bodyOffsetX>-0.33147323</bodyOffsetX>
<headBob>-0.03</headBob>
<bodyFacing>1</bodyFacing>
<headFacing>1</headFacing>
</li>
<li>
<tickDuration>1</tickDuration>
<bodyAngle>-82.7437439</bodyAngle>
<headAngle>-77.78256</headAngle>
<genitalAngle>0</genitalAngle>
<bodyOffsetZ>0.0254950486</bodyOffsetZ>
<bodyOffsetX>-0.30147323</bodyOffsetX>
<headBob>0</headBob>
<bodyFacing>1</bodyFacing>
<headFacing>1</headFacing>
</li>
</keyframes>
</li>
<li Class="Rimworld_Animations.PawnAnimationClip">
<layer>LayingPawn</layer>
<keyframes>
<li>
<tickDuration>45</tickDuration>
<bodyAngle>3.36438</bodyAngle>
<headAngle>-18.3917084</headAngle>
<genitalAngle>0</genitalAngle>
<bodyOffsetZ>0.233432038</bodyOffsetZ>
<bodyOffsetX>0.4034014</bodyOffsetX>
<headBob>0</headBob>
<bodyFacing>3</bodyFacing>
<headFacing>3</headFacing>
</li>
<li>
<tickDuration>45</tickDuration>
<bodyAngle>3.36438</bodyAngle>
<headAngle>-18.3917084</headAngle>
<genitalAngle>0</genitalAngle>
<bodyOffsetZ>0.273432038</bodyOffsetZ>
<bodyOffsetX>0.4034014</bodyOffsetX>
<headBob>-0.03</headBob>
<bodyFacing>3</bodyFacing>
<headFacing>3</headFacing>
</li>
<li>
<tickDuration>1</tickDuration>
<bodyAngle>3.36438</bodyAngle>
<headAngle>-18.3917084</headAngle>
<genitalAngle>0</genitalAngle>
<bodyOffsetZ>0.233432038</bodyOffsetZ>
<bodyOffsetX>0.4034014</bodyOffsetX>
<headBob>0</headBob>
<bodyFacing>3</bodyFacing>
<headFacing>3</headFacing>
</li>
</keyframes>
</li>
</animationClips>
</li>
<li>
<stageName>Slow_Fuck_Start</stageName>
<isLooping>true</isLooping>
<playTimeTicks></playTimeTicks>
<stageIndex>0</stageIndex>
<animationClips>
<li Class="Rimworld_Animations.PawnAnimationClip">
<keyframes>
<li>
<tickDuration>60</tickDuration>
<bodyAngle>-82.7437439</bodyAngle>
<headAngle>-77.78256</headAngle>
<genitalAngle>0</genitalAngle>
<bodyOffsetZ>0.0254950486</bodyOffsetZ>
<bodyOffsetX>-0.30147323</bodyOffsetX>
<headBob>0</headBob>
<bodyFacing>1</bodyFacing>
<headFacing>1</headFacing>
</li>
<li>
<tickDuration>1</tickDuration>
<bodyAngle>-82.7437439</bodyAngle>
<headAngle>-72.1512451</headAngle>
<genitalAngle>0</genitalAngle>
<bodyOffsetZ>0.025494989</bodyOffsetZ>
<bodyOffsetX>-0.29485938</bodyOffsetX>
<headBob>0</headBob>
<bodyFacing>1</bodyFacing>
<headFacing>1</headFacing>
</li>
</keyframes>
</li>
<li Class="Rimworld_Animations.PawnAnimationClip">
<layer>LayingPawn</layer>
<keyframes>
<li>
<tickDuration>60</tickDuration>
<bodyAngle>3.36438</bodyAngle>
<headAngle>-18.3917084</headAngle>
<genitalAngle>0</genitalAngle>
<bodyOffsetZ>0.233432038</bodyOffsetZ>
<bodyOffsetX>0.4034014</bodyOffsetX>
<headBob>0</headBob>
<bodyFacing>3</bodyFacing>
<headFacing>3</headFacing>
</li>
<li>
<tickDuration>1</tickDuration>
<bodyAngle>-5.439103</bodyAngle>
<headAngle>-18.591362</headAngle>
<genitalAngle>0</genitalAngle>
<bodyOffsetZ>0.253895342</bodyOffsetZ>
<bodyOffsetX>0.5181109</bodyOffsetX>
<headBob>0</headBob>
<bodyFacing>3</bodyFacing>
<headFacing>3</headFacing>
</li>
</keyframes>
</li>
</animationClips>
</li>
<li>
<stageName>Slow_Fuck</stageName>
<isLooping>true</isLooping>
<playTimeTicks>1212</playTimeTicks>
<stageIndex>0</stageIndex>
<animationClips>
<li Class="Rimworld_Animations.PawnAnimationClip">
<keyframes>
<li>
<tickDuration>30</tickDuration>
<bodyAngle>-82.7437439</bodyAngle>
<headAngle>-72.1512451</headAngle>
<genitalAngle>0</genitalAngle>
<bodyOffsetZ>0.025494989</bodyOffsetZ>
<bodyOffsetX>-0.29485938</bodyOffsetX>
<headBob>0</headBob>
<bodyFacing>1</bodyFacing>
<headFacing>1</headFacing>
</li>
<li>
<tickDuration>5</tickDuration>
<bodyAngle>-82.7437439</bodyAngle>
<headAngle>-67.51352</headAngle>
<genitalAngle>0</genitalAngle>
<bodyOffsetZ>0.025494989</bodyOffsetZ>
<bodyOffsetX>-0.279417485</bodyOffsetX>
<headBob>0</headBob>
<bodyFacing>1</bodyFacing>
<headFacing>1</headFacing>
</li>
<li>
<tickDuration>60</tickDuration>
<bodyAngle>-82.7437439</bodyAngle>
<headAngle>-67.51352</headAngle>
<genitalAngle>0</genitalAngle>
<bodyOffsetZ>0.025494989</bodyOffsetZ>
<bodyOffsetX>-0.339417485</bodyOffsetX>
<headBob>0</headBob>
<bodyFacing>1</bodyFacing>
<headFacing>1</headFacing>
</li>
<li>
<tickDuration>1</tickDuration>
<bodyAngle>-82.7437439</bodyAngle>
<headAngle>-72.1512451</headAngle>
<genitalAngle>0</genitalAngle>
<bodyOffsetZ>0.025494989</bodyOffsetZ>
<bodyOffsetX>-0.29485938</bodyOffsetX>
<headBob>0</headBob>
<bodyFacing>1</bodyFacing>
<headFacing>1</headFacing>
</li>
</keyframes>
</li>
<li Class="Rimworld_Animations.PawnAnimationClip">
<layer>LayingPawn</layer>
<keyframes>
<li>
<tickDuration>30</tickDuration>
<bodyAngle>-5.439103</bodyAngle>
<headAngle>-18.591362</headAngle>
<genitalAngle>0</genitalAngle>
<bodyOffsetZ>0.253895342</bodyOffsetZ>
<bodyOffsetX>0.5181109</bodyOffsetX>
<headBob>0</headBob>
<bodyFacing>3</bodyFacing>
<headFacing>3</headFacing>
</li>
<li>
<tickDuration>5</tickDuration>
<bodyAngle>12.3350525</bodyAngle>
<headAngle>-14.779211</headAngle>
<genitalAngle>0</genitalAngle>
<bodyOffsetZ>0.2605105</bodyOffsetZ>
<bodyOffsetX>0.449729085</bodyOffsetX>
<headBob>0</headBob>
<bodyFacing>3</bodyFacing>
<headFacing>3</headFacing>
<soundEffect>Fuck</soundEffect>
</li>
<li>
<tickDuration>60</tickDuration>
<bodyAngle>12.3350525</bodyAngle>
<headAngle>-14.779211</headAngle>
<genitalAngle>0</genitalAngle>
<bodyOffsetZ>0.2605105</bodyOffsetZ>
<bodyOffsetX>0.389729085</bodyOffsetX>
<headBob>0</headBob>
<bodyFacing>3</bodyFacing>
<headFacing>3</headFacing>
</li>
<li>
<tickDuration>1</tickDuration>
<bodyAngle>-5.439103</bodyAngle>
<headAngle>-18.591362</headAngle>
<genitalAngle>0</genitalAngle>
<bodyOffsetZ>0.253895342</bodyOffsetZ>
<bodyOffsetX>0.5181109</bodyOffsetX>
<headBob>0</headBob>
<bodyFacing>3</bodyFacing>
<headFacing>3</headFacing>
</li>
</keyframes>
</li>
</animationClips>
</li>
</animationStages>
</Rimworld_Animations.AnimationDef>
-->
</Defs>

View file

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<!--
<Rimworld_Animations.AnimationDef>
<defName></defName>
<label></label>
<sounds>true</sounds>
<sexTypes>
<li>Anal</li>
<li>Vaginal</li>
</sexTypes>
<actors>
<li>
<defNames>
<li>Human</li>
</defNames>
<isFucked>true</isFucked>
</li>
<li>
<defNames>
</defNames>
<bodyDefTypes>
<li>QuadrupedAnimalWithHooves</li>
<li>QuadrupedAnimalWithPawsAndTail</li>
</bodyDefTypes>
<isFucking>true</isFucking>
<initiator>true</initiator>
</li>
</actors>
<animationStages>
<li>
<stageName></stageName>
<isLooping></isLooping>
<playTimeTicks></playTimeTicks>
<stageIndex>0</stageIndex>
<animationClips>
<li Class="Rimworld_Animations.PawnAnimationClip">
<layer>LayingPawn</layer>
<keyframes></keyframes>
</li>
<li Class="Rimworld_Animations.PawnAnimationClip">
<keyframes></keyframes>
</li>
</animationClips>
</li>
</animationStages>
</Rimworld_Animations.AnimationDef>
-->
</Defs>

View file

@ -188,8 +188,8 @@
</li> </li>
</grains> </grains>
<volumeRange> <volumeRange>
<min>15</min> <min>45</min>
<max>25</max> <max>75</max>
</volumeRange> </volumeRange>
<pitchRange> <pitchRange>
<min>1.4</min> <min>1.4</min>
@ -197,7 +197,7 @@
</pitchRange> </pitchRange>
<distRange> <distRange>
<min>0</min> <min>0</min>
<max>25</max> <max>100</max>
</distRange> </distRange>
<repeatMode>NeverTwice</repeatMode> <repeatMode>NeverTwice</repeatMode>
<sustainLoop>false</sustainLoop> <sustainLoop>false</sustainLoop>

View file

@ -110,6 +110,7 @@
<Content Include="Defs\AnimationDefs\Animations_Masturbate.xml" /> <Content Include="Defs\AnimationDefs\Animations_Masturbate.xml" />
<Content Include="Defs\AnimationDefs\Animations_Multi.xml" /> <Content Include="Defs\AnimationDefs\Animations_Multi.xml" />
<Content Include="Defs\AnimationDefs\Animations_vanilla.xml" /> <Content Include="Defs\AnimationDefs\Animations_vanilla.xml" />
<Content Include="Defs\AnimationDefs\Animations_Vanilla2.xml" />
<Content Include="Defs\JobDefs\Jobs_SexForAnim.xml" /> <Content Include="Defs\JobDefs\Jobs_SexForAnim.xml" />
<Content Include="Defs\MainTabDefs\MainButtonDef.xml" /> <Content Include="Defs\MainTabDefs\MainButtonDef.xml" />
<Content Include="Defs\SoundDefs\Sounds_Sex.xml" /> <Content Include="Defs\SoundDefs\Sounds_Sex.xml" />

View file

@ -17,6 +17,7 @@ namespace Rimworld_Animations {
public bool isFucking = false; public bool isFucking = false;
public bool isFucked = false; public bool isFucked = false;
public bool controlGenitalAngle = false; public bool controlGenitalAngle = false;
public List<BodyDef> bodyDefTypes = new List<BodyDef>();
public BodyTypeOffset bodyTypeOffset = new BodyTypeOffset(); public BodyTypeOffset bodyTypeOffset = new BodyTypeOffset();
public Vector3 offset = new Vector2(0, 0); public Vector3 offset = new Vector2(0, 0);

View file

@ -14,28 +14,36 @@ namespace Rimworld_Animations {
Note: always make the list in this order: Note: always make the list in this order:
Female pawns, animal female pawns, male pawns, animal male pawns Female pawns, animal female pawns, male pawns, animal male pawns
*/ */
public static AnimationDef tryFindAnimation(ref List<Pawn> participants, rjw.xxx.rjwSextype sexType = 0) { public static AnimationDef tryFindAnimation(ref List<Pawn> participants, rjw.xxx.rjwSextype sexType = 0, rjw.SexProps sexProps = null) {
//aggressors last //aggressors last
participants = participants.OrderBy(p => p.jobs.curDriver is rjw.JobDriver_SexBaseInitiator).ToList(); participants = participants.OrderBy(p => p.jobs.curDriver is rjw.JobDriver_SexBaseInitiator).ToList();
//fucked first, fucking second participants = participants.OrderBy(p => p == sexProps.Giver).ToList();
participants = participants.OrderByDescending(p => rjw.GenderHelper.GetSex(p) == rjw.GenderHelper.Sex.futa).ToList();
//pawns that can fuck last
participants = participants.OrderBy(p => rjw.xxx.can_fuck(p)).ToList(); participants = participants.OrderBy(p => rjw.xxx.can_fuck(p)).ToList();
if(rjw.RJWPreferenceSettings.Malesex == rjw.RJWPreferenceSettings.AllowedSex.Nohomo) {
participants = participants.OrderBy(x => rjw.xxx.is_male(x)).ToList();
}
List<Pawn> localParticipants = new List<Pawn>(participants); List<Pawn> localParticipants = new List<Pawn>(participants);
IEnumerable<AnimationDef> options = DefDatabase<AnimationDef>.AllDefs.Where((AnimationDef x) => { IEnumerable<AnimationDef> options = DefDatabase<AnimationDef>.AllDefs.Where((AnimationDef x) => {
if (x.actors.Count != localParticipants.Count) { if (x.actors.Count != localParticipants.Count) {
return false; return false;
} }
for (int i = 0; i < x.actors.Count; i++) { for (int i = 0; i < x.actors.Count; i++) {
if((x.actors[i].blacklistedRaces != null) && x.actors[i].blacklistedRaces.Contains(localParticipants[i].def.defName)) { if (rjw.RJWPreferenceSettings.Malesex == rjw.RJWPreferenceSettings.AllowedSex.Nohomo) {
if (rjw.xxx.is_male(localParticipants[i]) && x.actors[i].isFucked) {
return false;
}
}
if ((x.actors[i].blacklistedRaces != null) && x.actors[i].blacklistedRaces.Contains(localParticipants[i].def.defName)) {
if (rjw.RJWSettings.DevMode) { if (rjw.RJWSettings.DevMode) {
Log.Message(x.defName.ToStringSafe() + " not selected -- " + localParticipants[i].def.defName.ToStringSafe() + " " + localParticipants[i].Name.ToStringSafe() + " is blacklisted"); Log.Message(x.defName.ToStringSafe() + " not selected -- " + localParticipants[i].def.defName.ToStringSafe() + " " + localParticipants[i].Name.ToStringSafe() + " is blacklisted");
} }
@ -51,7 +59,8 @@ namespace Rimworld_Animations {
return false; return false;
} }
} else { }
else if (!x.actors[i].bodyDefTypes.Contains(localParticipants[i].RaceProps.body)) {
if (!x.actors[i].defNames.Contains(localParticipants[i].def.defName)) { if (!x.actors[i].defNames.Contains(localParticipants[i].def.defName)) {
@ -66,22 +75,103 @@ namespace Rimworld_Animations {
return false; return false;
} }
} }
//genitals checking
if(x.actors[i].requiredGenitals != null) {
if (x.actors[i].requiredGenitals.Contains("Vagina")) {
if(x.actors[i].requiredGenitals != null && x.actors[i].requiredGenitals.Contains("Vagina")) { if (!rjw.Genital_Helper.has_vagina(localParticipants[i])) {
Log.Message(x.defName.ToStringSafe() + " not selected -- " + localParticipants[i].def.defName.ToStringSafe() + " " + localParticipants[i].Name.ToStringSafe() + " doesn't have vagina");
return false;
}
if (!rjw.Genital_Helper.has_vagina(localParticipants[i])) { }
Log.Message(x.defName.ToStringSafe() + " not selected -- " + localParticipants[i].def.defName.ToStringSafe() + " " + localParticipants[i].Name.ToStringSafe() + " doesn't have vagina");
return false;
}
if (x.actors[i].requiredGenitals.Contains("Penis")) {
if (!(rjw.Genital_Helper.has_multipenis(localParticipants[i]) || rjw.Genital_Helper.has_penis_infertile(localParticipants[i]) || rjw.Genital_Helper.has_penis_fertile(localParticipants[i]))) {
Log.Message(x.defName.ToStringSafe() + " not selected -- " + localParticipants[i].def.defName.ToStringSafe() + " " + localParticipants[i].Name.ToStringSafe() + " doesn't have penis");
return false;
}
}
if (x.actors[i].requiredGenitals.Contains("Mouth")) {
if (!rjw.Genital_Helper.has_mouth(localParticipants[i])) {
Log.Message(x.defName.ToStringSafe() + " not selected -- " + localParticipants[i].def.defName.ToStringSafe() + " " + localParticipants[i].Name.ToStringSafe() + " doesn't have mouth");
return false;
}
}
if (x.actors[i].requiredGenitals.Contains("Anus")) {
if (!rjw.Genital_Helper.has_anus(localParticipants[i])) {
Log.Message(x.defName.ToStringSafe() + " not selected -- " + localParticipants[i].def.defName.ToStringSafe() + " " + localParticipants[i].Name.ToStringSafe() + " doesn't have anus");
return false;
}
}
if(x.actors[i].requiredGenitals.Contains("Breasts")) {
if (!rjw.Genital_Helper.can_do_breastjob(localParticipants[i])) {
Log.Message(x.defName.ToStringSafe() + " not selected -- " + localParticipants[i].def.defName.ToStringSafe() + " " + localParticipants[i].Name.ToStringSafe() + " doesn't have breasts");
return false;
}
}
if (x.actors[i].requiredGenitals.Contains("NoVagina")) {
if (rjw.Genital_Helper.has_vagina(localParticipants[i])) {
Log.Message(x.defName.ToStringSafe() + " not selected -- " + localParticipants[i].def.defName.ToStringSafe() + " " + localParticipants[i].Name.ToStringSafe() + " has vagina");
return false;
}
}
if (x.actors[i].requiredGenitals.Contains("NoPenis")) {
if ((rjw.Genital_Helper.has_multipenis(localParticipants[i]) || rjw.Genital_Helper.has_penis_infertile(localParticipants[i]) || rjw.Genital_Helper.has_penis_fertile(localParticipants[i]))) {
Log.Message(x.defName.ToStringSafe() + " not selected -- " + localParticipants[i].def.defName.ToStringSafe() + " " + localParticipants[i].Name.ToStringSafe() + " has penis");
return false;
}
}
if (x.actors[i].requiredGenitals.Contains("NoMouth")) {
if (rjw.Genital_Helper.has_mouth(localParticipants[i])) {
Log.Message(x.defName.ToStringSafe() + " not selected -- " + localParticipants[i].def.defName.ToStringSafe() + " " + localParticipants[i].Name.ToStringSafe() + " has mouth");
return false;
}
}
if (x.actors[i].requiredGenitals.Contains("NoAnus")) {
if (rjw.Genital_Helper.has_anus(localParticipants[i])) {
Log.Message(x.defName.ToStringSafe() + " not selected -- " + localParticipants[i].def.defName.ToStringSafe() + " " + localParticipants[i].Name.ToStringSafe() + " has anus");
return false;
}
}
if (x.actors[i].requiredGenitals.Contains("NoBreasts")) {
if (rjw.Genital_Helper.can_do_breastjob(localParticipants[i])) {
Log.Message(x.defName.ToStringSafe() + " not selected -- " + localParticipants[i].def.defName.ToStringSafe() + " " + localParticipants[i].Name.ToStringSafe() + " has breasts");
return false;
}
}
} }
//TESTING ANIMATIONS ONLY REMEMBER TO COMMENT OUT BEFORE PUSH //TESTING ANIMATIONS ONLY REMEMBER TO COMMENT OUT BEFORE PUSH
/* /*
if (x.defName != "Doggystyle") if (x.defName != "Cunnilingus")
return false; return false;
*/ */
if (x.actors[i].isFucking && !rjw.xxx.can_fuck(localParticipants[i])) { if (x.actors[i].isFucking && !rjw.xxx.can_fuck(localParticipants[i])) {
Log.Message(x.defName.ToStringSafe() + " not selected -- " + localParticipants[i].def.defName.ToStringSafe() + " " + localParticipants[i].Name.ToStringSafe() + " can't fuck"); Log.Message(x.defName.ToStringSafe() + " not selected -- " + localParticipants[i].def.defName.ToStringSafe() + " " + localParticipants[i].Name.ToStringSafe() + " can't fuck");
@ -102,7 +192,15 @@ namespace Rimworld_Animations {
//if the animation not for initiators, but an initiator is playing it //if the animation not for initiators, but an initiator is playing it
if (x.actors[i].initiator && !(localParticipants[i].jobs.curDriver is rjw.JobDriver_SexBaseInitiator)) { if(sexProps != null) {
if(x.actors[i].initiator && localParticipants[i] == sexProps.Reciever) {
initiatorsAlignWithSexType = false;
}
}
else if (x.actors[i].initiator && !(localParticipants[i].jobs.curDriver is rjw.JobDriver_SexBaseInitiator)) {
initiatorsAlignWithSexType = false; initiatorsAlignWithSexType = false;
} }
} }
@ -114,7 +212,15 @@ namespace Rimworld_Animations {
//if the animation not for initiators, but an initiator is playing it //if the animation not for initiators, but an initiator is playing it
if (x.actors[i].initiator && !(localParticipants[i].jobs.curDriver is rjw.JobDriver_SexBaseInitiator)) { if (sexProps != null) {
if (x.actors[i].initiator && localParticipants[i] == sexProps.Giver) {
initiatorsAlignWithSexType = false;
}
}
else if (x.actors[i].initiator && !(localParticipants[i].jobs.curDriver is rjw.JobDriver_SexBaseInitiator)) {
initiatorsAlignWithSexType = false; initiatorsAlignWithSexType = false;
} }
} }

View file

@ -38,13 +38,15 @@ namespace Rimworld_Animations {
private bool mirror = false, quiver = false, shiver = false; private bool mirror = false, quiver = false, shiver = false;
private int actor; private int actor;
private int lastDrawFrame = -1;
private int animTicks = 0, stageTicks = 0, clipTicks = 0; private int animTicks = 0, stageTicks = 0, clipTicks = 0;
private int curStage = 0; private int curStage = 0;
private float clipPercent = 0; private float clipPercent = 0;
public Vector3 anchor, deltaPos, headBob; public Vector3 anchor = Vector3.zero, deltaPos = Vector3.zero, headBob = Vector3.zero;
public float bodyAngle, headAngle, genitalAngle; public float bodyAngle = 0, headAngle = 0, genitalAngle = 0;
public Rot4 headFacing, bodyFacing; public Rot4 headFacing = Rot4.North, bodyFacing = Rot4.North;
public bool controlGenitalAngle = false; public bool controlGenitalAngle = false;
@ -102,8 +104,6 @@ namespace Rimworld_Animations {
} }
public void StartAnimation(AnimationDef anim, int actor, bool mirror = false, bool shiver = false, bool fastAnimForQuickie = false) { public void StartAnimation(AnimationDef anim, int actor, bool mirror = false, bool shiver = false, bool fastAnimForQuickie = false) {
isAnimating = true;
AlienRaceOffset raceOffset = anim?.actors[actor]?.raceOffsets?.Find(x => x.defName == pawn.def.defName); AlienRaceOffset raceOffset = anim?.actors[actor]?.raceOffsets?.Find(x => x.defName == pawn.def.defName);
if (raceOffset != null) { if (raceOffset != null) {
@ -151,9 +151,12 @@ namespace Rimworld_Animations {
controlGenitalAngle = anim.actors[actor].controlGenitalAngle; controlGenitalAngle = anim.actors[actor].controlGenitalAngle;
isAnimating = true;
//tick once for initialization //tick once for initialization
tickAnim(); tickAnim();
} }
public override void CompTick() { public override void CompTick() {
@ -259,6 +262,10 @@ namespace Rimworld_Animations {
public void calculateDrawValues() { public void calculateDrawValues() {
/*if(Find.TickManager.TickRateMultiplier > 1 && (lastDrawFrame + 1 >= RealTime.frameCount || RealTime.deltaTime < 0.05f)) {
return;
}*/
deltaPos = new Vector3(clip.BodyOffsetX.Evaluate(clipPercent) * (mirror ? -1 : 1), clip.layer.AltitudeFor(), clip.BodyOffsetZ.Evaluate(clipPercent)); deltaPos = new Vector3(clip.BodyOffsetX.Evaluate(clipPercent) * (mirror ? -1 : 1), clip.layer.AltitudeFor(), clip.BodyOffsetZ.Evaluate(clipPercent));
if (AnimationSettings.offsets != null && AnimationSettings.offsets.ContainsKey(CurrentAnimation.defName + pawn.def.defName + ActorIndex)) { if (AnimationSettings.offsets != null && AnimationSettings.offsets.ContainsKey(CurrentAnimation.defName + pawn.def.defName + ActorIndex)) {
@ -307,6 +314,8 @@ namespace Rimworld_Animations {
} }
headBob = new Vector3(0, 0, clip.HeadBob.Evaluate(clipPercent)); headBob = new Vector3(0, 0, clip.HeadBob.Evaluate(clipPercent));
lastDrawFrame = RealTime.frameCount;
} }
public Vector3 getPawnHeadPosition() { public Vector3 getPawnHeadPosition() {

View file

@ -79,9 +79,9 @@ namespace Rimworld_Animations {
Vector2 bodyOffset = (portrait ? offset?.portraitBodyTypes ?? offset?.bodyTypes : offset?.bodyTypes)?.FirstOrDefault(predicate: to => to.bodyType == pawn.story.bodyType) Vector2 bodyOffset = (portrait ? offset?.portraitBodyTypes ?? offset?.bodyTypes : offset?.bodyTypes)?.FirstOrDefault(predicate: to => to.bodyType == pawn.story.bodyType)
?.offset ?? Vector2.zero; ?.offset ?? Vector2.zero;
Vector2 crownOffset = (portrait ? offset?.portraitCrownTypes ?? offset?.crownTypes : offset?.crownTypes)?.FirstOrDefault(predicate: to => to.crownType == alienComp.crownType) Vector2 crownOffset = (portrait ? offset?.portraitCrownTypes ?? offset?.crownTypes : offset?.crownTypes)?.FirstOrDefault(predicate: to => to.crownType == alienComp.crownType)
?.offset ?? Vector2.zero; ?.offset ?? Vector2.zero;
//Defaults for tails //Defaults for tails
//south 0.42f, -0.3f, -0.22f //south 0.42f, -0.3f, -0.22f
@ -130,7 +130,7 @@ namespace Rimworld_Animations {
else { else {
Quaternion addonRotation = quat; Quaternion addonRotation = quat;
if (AnimationSettings.controlGenitalRotation && pawnAnimator.controlGenitalAngle && ba.hediffGraphics[0] != null && (ba.hediffGraphics[0].path.Contains("Penis") || ba.hediffGraphics[0].path.Contains("penis"))) { if (AnimationSettings.controlGenitalRotation && pawnAnimator.controlGenitalAngle && ba.hediffGraphics[0]?.path != null && (ba.hediffGraphics[0].path.Contains("Penis") || ba.hediffGraphics[0].path.Contains("penis"))) {
addonRotation = Quaternion.AngleAxis(angle: pawnAnimator.genitalAngle, axis: Vector3.up); addonRotation = Quaternion.AngleAxis(angle: pawnAnimator.genitalAngle, axis: Vector3.up);
} }

View file

@ -23,8 +23,7 @@ namespace Rimworld_Animations {
} }
if(__instance is JobDriver_JoinInBed) { if(__instance is JobDriver_JoinInBed) {
Log.Warning("Tried to start wrong JobDriver with Rimworld-Animations installed. If you see this warning soon after installing this mod, it's fine and animated sex will start soon. If you see this a long time after installing, that's a problem."); Log.Warning("Playing regular RJW joininbed jobdriver, if it animates properly ignore this warning");
return;
} }
Pawn pawn = __instance.pawn; Pawn pawn = __instance.pawn;
@ -55,15 +54,15 @@ namespace Rimworld_Animations {
bool quickie = (__instance is JobDriver_SexQuick) && AnimationSettings.fastAnimForQuickie; bool quickie = (__instance is JobDriver_SexQuick) && AnimationSettings.fastAnimForQuickie;
if (bed != null) { if (bed != null) {
RerollAnimations(Target, __instance.duration, bed as Thing, __instance.sexType, quickie); RerollAnimations(Target, __instance.duration, bed as Thing, __instance.sexType, quickie, sexProps: __instance.Sexprops);
} }
else { else {
RerollAnimations(Target, __instance.duration, sexType: __instance.sexType, fastAnimForQuickie: quickie); RerollAnimations(Target, __instance.duration, sexType: __instance.sexType, fastAnimForQuickie: quickie, sexProps: __instance.Sexprops);
} }
} }
} }
public static void RerollAnimations(Pawn pawn, int duration, Thing bed = null, xxx.rjwSextype sexType = xxx.rjwSextype.None, bool fastAnimForQuickie = false) { public static void RerollAnimations(Pawn pawn, int duration, Thing bed = null, xxx.rjwSextype sexType = xxx.rjwSextype.None, bool fastAnimForQuickie = false, rjw.SexProps sexProps = null) {
if(pawn == null || !(pawn.jobs?.curDriver is JobDriver_SexBaseReciever)) { if(pawn == null || !(pawn.jobs?.curDriver is JobDriver_SexBaseReciever)) {
Log.Message("Error: Tried to reroll animations when pawn isn't sexing"); Log.Message("Error: Tried to reroll animations when pawn isn't sexing");
@ -76,7 +75,7 @@ namespace Rimworld_Animations {
pawnsToAnimate = pawnsToAnimate.Append(pawn).ToList(); pawnsToAnimate = pawnsToAnimate.Append(pawn).ToList();
} }
AnimationDef anim = AnimationUtility.tryFindAnimation(ref pawnsToAnimate, sexType); AnimationDef anim = AnimationUtility.tryFindAnimation(ref pawnsToAnimate, sexType, sexProps);
if (anim != null) { if (anim != null) {

View file

@ -25,9 +25,11 @@ namespace Rimworld_Animations {
if (pawn.IsHashIntervalTick(__instance.ticks_between_thrusts)) { if (pawn.IsHashIntervalTick(__instance.ticks_between_thrusts)) {
__instance.Animate(pawn, (Thing)pawn2); __instance.ChangePsyfocus(pawn, pawn2);
if (!AnimationSettings.soundOverride || !pawn.TryGetComp<CompBodyAnimator>().isAnimating) { __instance.Animate(pawn, pawn2);
if (!AnimationSettings.soundOverride || pawn.TryGetComp<CompBodyAnimator>() == null || !pawn.TryGetComp<CompBodyAnimator>().isAnimating) {
__instance.PlaySexSound(); __instance.PlaySexSound();
} }