diff --git a/Defs/AnimationDefs/AnimationDefs.rar b/Defs/AnimationDefs/AnimationDefs.rar
new file mode 100644
index 0000000..e7bf2a1
Binary files /dev/null and b/Defs/AnimationDefs/AnimationDefs.rar differ
diff --git a/Defs/AnimationDefs/Animations_Beast.xml b/Defs/AnimationDefs/Animations_Beast.xml
index 73365cc..8cda024 100644
--- a/Defs/AnimationDefs/Animations_Beast.xml
+++ b/Defs/AnimationDefs/Animations_Beast.xml
@@ -20,7 +20,9 @@
Wolf_Timber
Wolf_Arctic
Whitefox
-
+ Warg
+ Husky
+ LabradorRetriever
AEXP_WelshTerrier
AEXP_Rottweiler
@@ -34,6 +36,10 @@
AEXP_CatMaineCoon
AEXP_CatSphynx
+
+ QuadrupedAnimalWithHooves
+ QuadrupedAnimalWithPawsAndTail
+
true
true
@@ -1140,5 +1146,1023 @@
+
+ Horse_Cowgirl
+
+ true
+
+ Anal
+ Vaginal
+
+
+
+
+ Human
+
+ true
+ true
+
+ (0, 0.2)
+
+
+
+
+ Horse
+
+
+ QuadrupedAnimalWithHooves
+
+ true
+
+
+
+
+
+
+ Insertion
+ false
+ 0
+
+
+
+
+ 180
+ -24.337
+ -37.1218948
+ 0
+ 0.698042035
+ -0.20718734
+ 0
+ 3
+ 3
+
+
+ 70
+ -2.54239845
+ 7.31265259
+ 0
+ 0.606091142
+ -0.045959726
+ 0
+ 3
+ 3
+ Slimy
+
+
+ 60
+ -4.84361649
+ -23.6405125
+ 0
+ 0.650456548
+ -0.0570534021
+ 0
+ 3
+ 3
+ Slimy
+
+
+ 1
+ -35.01766
+ -26.3706665
+ 0
+ 0.455286169
+ -0.3646413
+ 0
+ 3
+ 3
+ Slimy
+
+
+
+
+ LayingPawn
+
+
+ 250
+ 177.083145
+ 0
+ 0
+ -0.256229281
+ -0.362511069
+ 0
+ 1
+ 0
+
+
+
+ 60
+ 177.981537
+ 0
+ 0
+ -0.24524799
+ -0.358849227
+ 0
+ 1
+ 0
+
+
+ 1
+ 179.6811
+ 0
+ 0
+ -0.267210543
+ -0.3991253
+ 0
+ 1
+ 0
+
+
+
+
+
+
+
+ SlowFuck
+ true
+ 1300
+ 0
+
+
+
+
+ 80
+ -35.01766
+ -26.3706665
+ 0
+ 0.455286169
+ -0.3646413
+ 0
+ 3
+ 3
+
+
+ 49
+ -49.8178673
+ -35.7418823
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 3
+ Slimy
+
+
+ 1
+ -35.01766
+ -26.3706665
+ 0
+ 0.455286169
+ -0.3646413
+ 0
+ 3
+ 3
+ Fuck
+
+
+
+
+ LayingPawn
+
+
+ 80
+ 179.6811
+ 0
+ 0
+ -0.267210543
+ -0.3991253
+ 0
+ 1
+ 0
+
+
+ 49
+ 177.981537
+ 0
+ 0
+ -0.24524799
+ -0.358849227
+ 0
+ 1
+ 0
+
+
+ 1
+ 179.6811
+ 0
+ 0
+ -0.267210543
+ -0.3991253
+ 0
+ 1
+ 0
+
+
+
+
+
+
+
+ Transition
+ false
+ 0
+
+
+
+
+ 50
+ -35.01766
+ -26.3706665
+ 0
+ 0.455286169
+ -0.3646413
+ 0
+ 3
+ 3
+ Fuck
+
+
+
+ 15
+ -49.8178673
+ -35.7418823
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 3
+ Slimy
+
+
+
+ 80
+ -49.8178673
+ -8.273987
+ 0
+ 0.506531835
+ -0.55575326
+ 0
+ 3
+ 3
+
+
+
+ 1
+ -49.8178673
+ -14.1647339
+ 0
+ 0.48456946
+ -0.489136577
+ 0
+ 3
+ 3
+
+
+
+
+ LayingPawn
+
+
+ 50
+ 179.6811
+ 0
+ 0
+ -0.267210543
+ -0.3991253
+ 0
+ 1
+ 0
+
+
+
+ 15
+ 177.981537
+ 0
+ 0
+ -0.24524799
+ -0.358849227
+ 0
+ 1
+ 0
+
+
+
+ 80
+ 175.467651
+ 0
+ 0
+ -0.2123042
+ -0.5309518
+ 0
+ 1
+ 0
+ Fuck
+
+
+
+ 1
+ 177.981537
+ 0
+ 0
+ -0.24524799
+ -0.358849227
+ 0
+ 1
+ 0
+
+
+
+
+
+
+
+ FastFuck
+ true
+ 1260
+ 0
+
+
+
+
+
+ 10
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 3
+ Slimy
+
+
+ 24
+ -49.8178673
+ -8.273987
+ 0
+ 0.506531835
+ -0.55575326
+ 0
+ 3
+ 3
+
+
+ 1
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 3
+ Slimy
+
+
+
+ 10
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 3
+ Slimy
+
+
+ 24
+ -49.8178673
+ -8.273987
+ 0
+ 0.506531835
+ -0.55575326
+ 0
+ 3
+ 3
+
+
+ 1
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 3
+ Slimy
+
+
+
+ 10
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 2
+ Slimy
+
+
+ 24
+ -49.8178673
+ -8.273987
+ 0
+ 0.506531835
+ -0.55575326
+ 0
+ 3
+ 2
+
+
+ 1
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 2
+ Slimy
+
+
+
+ 10
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 2
+ Slimy
+
+
+ 24
+ -49.8178673
+ -8.273987
+ 0
+ 0.506531835
+ -0.55575326
+ 0
+ 3
+ 2
+
+
+ 1
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 2
+ Slimy
+
+
+
+ 10
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 2
+ Slimy
+
+
+ 24
+ -49.8178673
+ -8.273987
+ 0
+ 0.506531835
+ -0.55575326
+ 0
+ 3
+ 2
+
+
+ 1
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 2
+ Slimy
+
+
+
+ 10
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 2
+ Slimy
+
+
+ 24
+ -49.8178673
+ -8.273987
+ 0
+ 0.506531835
+ -0.55575326
+ 0
+ 3
+ 2
+
+
+ 1
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 2
+ Slimy
+
+
+
+ 10
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 2
+ Slimy
+
+
+ 24
+ -49.8178673
+ -8.273987
+ 0
+ 0.506531835
+ -0.55575326
+ 0
+ 3
+ 2
+
+
+ 1
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 2
+ Slimy
+
+
+
+ 10
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 2
+ Slimy
+
+
+ 24
+ -49.8178673
+ -8.273987
+ 0
+ 0.506531835
+ -0.55575326
+ 0
+ 3
+ 2
+
+
+ 1
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 2
+ Slimy
+
+
+
+ 10
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 3
+ Slimy
+
+
+ 24
+ -49.8178673
+ -8.273987
+ 0
+ 0.506531835
+ -0.55575326
+ 0
+ 3
+ 3
+
+
+ 1
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 3
+ Slimy
+
+
+
+ 10
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 3
+ Slimy
+
+
+ 24
+ -49.8178673
+ -8.273987
+ 0
+ 0.506531835
+ -0.55575326
+ 0
+ 3
+ 3
+
+
+ 1
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 3
+ Slimy
+
+
+
+ 10
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 3
+ Slimy
+
+
+ 24
+ -49.8178673
+ -8.273987
+ 0
+ 0.506531835
+ -0.55575326
+ 0
+ 3
+ 3
+
+
+ 1
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 3
+ Slimy
+
+
+
+ 10
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 3
+ Slimy
+
+
+ 24
+ -49.8178673
+ -8.273987
+ 0
+ 0.506531835
+ -0.55575326
+ 0
+ 3
+ 3
+
+
+ 1
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 3
+ Slimy
+
+
+
+
+ LayingPawn
+
+
+
+ 10
+ 177.981537
+ 0
+ 0
+ -0.24524799
+ -0.358849227
+ 0
+ 1
+ 0
+
+
+ 24
+ 175.467651
+ 0
+ 0
+ -0.2123042
+ -0.5309518
+ 0
+ 1
+ 0
+ Fuck
+
+
+ 1
+ 177.981537
+ 0
+ 0
+ -0.24524799
+ -0.358849227
+ 0
+ 1
+ 0
+
+
+
+
+
+
+
+ FasterFuck
+ true
+ 418
+ 0
+
+
+
+
+
+ 10
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 3
+
+
+ 8
+ -49.8178673
+ -8.273987
+ 0
+ 0.506531835
+ -0.55575326
+ 0
+ 3
+ 3
+
+
+ 1
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 3
+ Slimy
+
+
+
+
+ LayingPawn
+
+
+ 10
+ 177.981537
+ 0
+ 0
+ -0.24524799
+ -0.358849227
+ 0
+ 1
+ 0
+
+
+ 8
+ 175.467651
+ 0
+ 0
+ -0.2123042
+ -0.5309518
+ 0
+ 1
+ 0
+ Fuck
+
+
+ 1
+ 177.981537
+ 0
+ 0
+ -0.24524799
+ -0.358849227
+ 0
+ 1
+ 0
+
+
+
+
+
+
+
+ Cum
+ True
+ 318
+ 0
+
+
+
+
+
+ 10
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 3
+
+
+
+ true
+ 80
+ -49.8178673
+ -8.273987
+ 0
+ 0.506531835
+ -0.55575326
+ 0
+ 3
+ 3
+ Cum
+
+
+ 25
+ -49.8178673
+ 2.654541
+ 0
+ 0.5175133
+ -0.547725141
+ 0
+ 3
+ 3
+
+
+ 1
+ -49.8178673
+ -14.1647339
+ 0
+ 0.484569454
+ -0.489136577
+ 0
+ 3
+ 3
+
+
+
+
+
+ LayingPawn
+
+
+
+ 10
+ 177.981537
+ 0
+ 0
+ -0.24524799
+ -0.358849227
+ 0
+ 1
+ 0
+
+
+ 80
+ 175.467651
+ 0
+ 0
+ -0.2123042
+ -0.5309518
+ 0
+ 1
+ 0
+
+
+ 25
+ 173.81427
+ 0
+ 0
+ -0.197662517
+ -0.545600235
+ 0
+ 1
+ 0
+
+
+ 1
+ 177.981537
+ 0
+ 0
+ -0.24524799
+ -0.358849227
+ 0
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
diff --git a/Defs/AnimationDefs/Animations_Lesbian.xml b/Defs/AnimationDefs/Animations_Lesbian.xml
index 975903f..e8da71b 100644
--- a/Defs/AnimationDefs/Animations_Lesbian.xml
+++ b/Defs/AnimationDefs/Animations_Lesbian.xml
@@ -671,5 +671,1093 @@
+
+ Cunnilingus
+
+ true
+
+ Oral
+ Fingering
+
+
+
+
+ Human
+
+ true
+
+ Vagina
+
+
+ (-0.2, 0.1)
+
+
+
+
+ Human
+
+ true
+
+ (-0.1, 0.15)
+
+
+
+
+
+
+
+ Initial
+ False
+ 0
+
+
+
+
+ 60
+ -81.06536
+ -56.4483032
+ 0
+ -0.0624052179
+ -0.437134951
+ 0
+ 1
+ 1
+
+
+ 1
+ -87.3645554
+ -69.70276
+ 0
+ -0.0692383763
+ -0.440020353
+ 0
+ 1
+ 1
+
+
+
+
+ LayingPawn
+
+
+ 60
+ -27.578373
+ 0.2816162
+ 0
+ 0.102704488
+ 0.50675
+ 0
+ 3
+ 3
+
+
+ 1
+ -47.9400826
+ -21.93164
+ 0
+ -0.04209958
+ 0.467844343
+ -0.1
+ 3
+ 3
+ Slimy
+
+
+
+
+
+
+
+
+ Slow
+ True
+ 1497
+ 0
+
+
+
+
+ 98
+ -87.3645554
+ -69.70276
+ 0
+ -0.0692383763
+ -0.440020353
+ 0
+ 1
+ 1
+
+
+ 40
+ -87.26528
+ -65.901825
+ 0
+ -0.0737426062
+ -0.432820916
+ 0
+ 1
+ 1
+
+
+ 1
+ -87.3645554
+ -69.70276
+ 0
+ -0.0692383763
+ -0.440020353
+ 0
+ 1
+ 1
+
+
+
+ 98
+ -87.3645554
+ -69.70276
+ 0
+ -0.0692383763
+ -0.440020353
+ 0
+ 1
+ 1
+
+
+ 40
+ -87.26528
+ -65.901825
+ 0
+ -0.0737426062
+ -0.432820916
+ 0
+ 1
+ 1
+
+
+ 1
+ -87.3645554
+ -69.70276
+ 0
+ -0.0692383763
+ -0.440020353
+ 0
+ 1
+ 1
+
+
+
+ 60
+ -87.3645554
+ -69.70276
+ 0
+ -0.0692383763
+ -0.440020353
+ 0
+ 1
+ 1
+
+
+ 120
+ -86.52611
+ -68.86432
+ 0
+ -0.05432228
+ -0.439906
+ 0
+ 1
+ 1
+
+
+ 40
+ -88.36286
+ -84.3309
+ 0
+ -0.06637782
+ -0.440140843
+ 0
+ 1
+ 1
+
+
+ 1
+ -87.3645554
+ -69.70276
+ 0
+ -0.0692383763
+ -0.440020353
+ 0
+ 1
+ 1
+
+
+
+
+ LayingPawn
+
+
+ 80
+ -47.9400826
+ -21.93164
+ 0
+ -0.04209958
+ 0.467844343
+ -0.1
+ 3
+ 3
+
+
+ 18
+ -41.1054764
+ -10.1737061
+ 0
+ 0.04582855
+ 0.462155169
+ 0
+ 3
+ 3
+
+
+ 40
+ -38.1903877
+ -31.6517334
+ 0
+ 0.0384018831
+ 0.4874894
+ 0
+ 3
+ 3
+
+
+ 1
+ -47.9400826
+ -21.93164
+ 0
+ -0.04209958
+ 0.467844343
+ -0.1
+ 3
+ 3
+ Slimy
+
+
+
+ 80
+ -47.9400826
+ -21.93164
+ 0
+ -0.04209958
+ 0.467844343
+ -0.1
+ 3
+ 3
+
+
+ 18
+ -41.1054764
+ -10.1737061
+ 0
+ 0.04582855
+ 0.462155169
+ 0
+ 3
+ 3
+
+
+ 40
+ -38.1903877
+ -31.6517334
+ 0
+ 0.0384018831
+ 0.4874894
+ 0
+ 3
+ 3
+
+
+ 1
+ -47.9400826
+ -21.93164
+ 0
+ -0.04209958
+ 0.467844343
+ -0.1
+ 3
+ 3
+ Slimy
+
+
+
+ 60
+ -47.9400826
+ -21.93164
+ 0
+ -0.04209958
+ 0.467844343
+ -0.1
+ 3
+ 3
+ Slimy
+
+
+ 40
+ -45.2595444
+ -13.57782
+ 0
+ 0.009577712
+ 0.4726282
+ 0
+ 3
+ 3
+ Slimy
+
+
+ 20
+ -45.2595444
+ -24.2278748
+ 0
+ 0.0315402448
+ 0.415024319
+ 0
+ 3
+ 3
+
+
+
+ 40
+ -45.2595444
+ -13.57782
+ 0
+ 0.009577712
+ 0.4726282
+ 0
+ 3
+ 3
+ Slimy
+
+
+ 20
+ -45.2595444
+ -24.2278748
+ 0
+ 0.0315402448
+ 0.415024319
+ 0
+ 3
+ 3
+
+
+
+ 40
+ -45.2595444
+ -13.57782
+ 0
+ 0.009577712
+ 0.4726282
+ 0
+ 3
+ 3
+ Slimy
+
+
+ 1
+ -47.9400826
+ -21.93164
+ 0
+ -0.04209958
+ 0.467844343
+ -0.1
+ 3
+ 3
+ Slimy
+
+
+
+
+
+
+
+
+ Transition
+ False
+ 0
+
+
+
+
+ 40
+ -87.3645554
+ -69.70276
+ 0
+ -0.06923838
+ -0.440020353
+ 0
+ 1
+ 1
+
+
+ 30
+ -97.90959
+ -69.72717
+ 0
+ -0.0259781852
+ -0.445601642
+ 0
+ 1
+ 1
+
+
+ 1
+ -87.3645554
+ -69.70276
+ 0
+ -0.06923838
+ -0.440020353
+ 0
+ 1
+ 1
+
+
+
+
+ LayingPawn
+
+
+ 40
+ -47.9400826
+ -21.93164
+ 0
+ -0.04209958
+ 0.467844343
+ -0.1
+ 3
+ 3
+ Slimy
+
+
+ 30
+ -35.8792953
+ -9.312592
+ 0
+ 0.03684573
+ 0.4285702
+ 0
+ 3
+ 3
+ Slimy
+
+
+ 1
+ -47.9400826
+ -21.93164
+ 0
+ -0.04209958
+ 0.467844343
+ 0
+ 3
+ 3
+ Slimy
+
+
+
+
+
+
+
+ Fast
+ True
+ 710
+ 0
+
+
+
+
+ 40
+ -87.3645554
+ -69.70276
+ 0
+ -0.06923838
+ -0.440020353
+ 0
+ 1
+ 1
+
+
+ 30
+ -97.90959
+ -69.72717
+ 0
+ -0.0259781852
+ -0.445601642
+ 0
+ 1
+ 1
+
+
+ 1
+ -87.3645554
+ -69.70276
+ 0
+ -0.06923838
+ -0.440020353
+ 0
+ 1
+ 1
+
+
+
+ 40
+ -87.3645554
+ -69.70276
+ 0
+ -0.06923838
+ -0.440020353
+ 0
+ 1
+ 1
+
+
+ 30
+ -97.90959
+ -69.72717
+ 0
+ -0.0259781852
+ -0.445601642
+ 0
+ 1
+ 1
+
+
+ 1
+ -87.3645554
+ -69.70276
+ 0
+ -0.06923838
+ -0.440020353
+ 0
+ 1
+ 1
+
+
+
+ 40
+ -87.3645554
+ -79.70276
+ 0
+ -0.06923838
+ -0.440020353
+ 0
+ 1
+ 2
+
+
+ 30
+ -97.90959
+ -79.72717
+ 0
+ -0.0259781852
+ -0.445601642
+ 0
+ 1
+ 2
+
+
+ 1
+ -87.3645554
+ -79.70276
+ 0
+ -0.06923838
+ -0.440020353
+ 0
+ 1
+ 2
+
+
+
+ 40
+ -87.3645554
+ -79.70276
+ 0
+ -0.06923838
+ -0.440020353
+ 0
+ 1
+ 2
+
+
+ 30
+ -97.90959
+ -79.72717
+ 0
+ -0.0259781852
+ -0.445601642
+ 0
+ 1
+ 2
+
+
+ 1
+ -87.3645554
+ -79.70276
+ 0
+ -0.06923838
+ -0.440020353
+ 0
+ 1
+ 2
+
+
+
+ 40
+ -87.3645554
+ -79.70276
+ 0
+ -0.06923838
+ -0.440020353
+ 0
+ 1
+ 2
+
+
+ 30
+ -97.90959
+ -79.72717
+ 0
+ -0.0259781852
+ -0.445601642
+ 0
+ 1
+ 2
+
+
+ 1
+ -87.3645554
+ -79.70276
+ 0
+ -0.06923838
+ -0.440020353
+ 0
+ 1
+ 2
+
+
+
+ 40
+ -87.3645554
+ -69.70276
+ 0
+ -0.06923838
+ -0.440020353
+ 0
+ 1
+ 1
+
+
+ 30
+ -97.90959
+ -69.72717
+ 0
+ -0.0259781852
+ -0.445601642
+ 0
+ 1
+ 1
+
+
+ 1
+ -87.3645554
+ -69.70276
+ 0
+ -0.06923838
+ -0.440020353
+ 0
+ 1
+ 1
+
+
+
+
+ LayingPawn
+
+
+ 40
+ -47.9400826
+ -21.93164
+ 0
+ -0.04209958
+ 0.467844343
+ 0
+ 3
+ 3
+ Slimy
+
+
+ 30
+ -35.8792953
+ -3.312592
+ 0
+ 0.03684573
+ 0.4285702
+ 0
+ 3
+ 3
+ Slimy
+
+
+ 1
+ -47.9400826
+ -21.93164
+ 0
+ -0.04209958
+ 0.467844343
+ 0
+ 3
+ 3
+ Slimy
+
+
+
+
+
+
+ Faster
+ True
+ 360
+ 0
+
+
+
+
+ 20
+ -87.3645554
+ -69.70276
+ 0
+ -0.06923838
+ -0.440020353
+ 0
+ 1
+ 1
+
+
+ 15
+ -97.90959
+ -69.72717
+ 0
+ -0.0259781852
+ -0.445601642
+ 0
+ 1
+ 1
+
+
+ 1
+ -87.3645554
+ -69.70276
+ 0
+ -0.06923838
+ -0.440020353
+ 0
+ 1
+ 1
+
+
+
+
+ LayingPawn
+
+
+ 20
+ -47.9400826
+ -21.93164
+ 0
+ -0.04209958
+ 0.467844343
+ 0
+ 3
+ 3
+ Slimy
+
+
+ 15
+ -35.8792953
+ -9.312592
+ 0
+ 0.03684573
+ 0.4285702
+ 0
+ 3
+ 3
+ Slimy
+
+
+ 1
+ -47.9400826
+ -21.93164
+ 0
+ -0.04209958
+ 0.467844343
+ 0
+ 3
+ 3
+ Slimy
+
+
+
+
+
+
+ Cum
+ True
+ 639
+ 0
+
+
+
+
+ 20
+ -87.3645554
+ -69.70276
+ 0
+ -0.06923838
+ -0.440020353
+ 0
+ 1
+ 1
+
+
+ 15
+ -97.90959
+ -69.72717
+ 0
+ -0.0259781852
+ -0.445601642
+ 0
+ 1
+ 1
+
+
+ 1
+ -87.3645554
+ -69.70276
+ 0
+ -0.06923838
+ -0.440020353
+ 0
+ 1
+ 1
+
+
+
+ 20
+ -87.3645554
+ -69.70276
+ 0
+ -0.06923838
+ -0.440020353
+ 0
+ 1
+ 1
+
+
+ 15
+ -97.90959
+ -69.72717
+ 0
+ -0.0259781852
+ -0.445601642
+ 0
+ 1
+ 1
+
+
+ 1
+ -87.3645554
+ -69.70276
+ 0
+ -0.06923838
+ -0.440020353
+ 0
+ 1
+ 1
+
+
+
+ 20
+ -87.3645554
+ -69.70276
+ 0
+ -0.06923838
+ -0.440020353
+ 0
+ 1
+ 1
+
+
+ True
+ 80
+ -97.90959
+ -69.72717
+ 0
+ -0.0259781852
+ -0.445601642
+ 0
+ 1
+ 1
+ Cum
+
+
+ 40
+ -99.80413
+ -94.4023743
+ 0
+ -0.01950606
+ -0.447728932
+ 0
+ 1
+ 1
+
+
+ 1
+ -87.3645554
+ -69.70276
+ 0
+ -0.06923838
+ -0.440020353
+ 0
+ 1
+ 1
+
+
+
+
+ LayingPawn
+
+
+
+ 20
+ -47.9400826
+ -21.93164
+ 0
+ -0.04209958
+ 0.467844343
+ 0
+ 3
+ 3
+ Slimy
+
+
+ 15
+ -35.8792953
+ -9.312592
+ 0
+ 0.03684573
+ 0.4285702
+ 0
+ 3
+ 3
+ Slimy
+
+
+ 1
+ -47.9400826
+ -21.93164
+ 0
+ -0.04209958
+ 0.467844343
+ 0
+ 3
+ 3
+ Slimy
+
+
+
+ 20
+ -47.9400826
+ -21.93164
+ 0
+ -0.04209958
+ 0.467844343
+ 0
+ 3
+ 3
+ Slimy
+
+
+ 15
+ -35.8792953
+ -9.312592
+ 0
+ 0.03684573
+ 0.4285702
+ 0
+ 3
+ 3
+ Slimy
+
+
+ 1
+ -47.9400826
+ -21.93164
+ 0
+ -0.04209958
+ 0.467844343
+ 0
+ 3
+ 3
+ Slimy
+
+
+
+ 20
+ -47.9400826
+ -21.93164
+ 0
+ -0.04209958
+ 0.467844343
+ 0
+ 3
+ 3
+ Slimy
+
+
+ 80
+ -35.8792953
+ -9.312592
+ 0
+ 0.03684573
+ 0.4285702
+ 0
+ 3
+ 3
+
+
+ 40
+ -38.5277061
+ -1.13140869
+ 0
+ 0.0376501828
+ 0.42935127
+ 0
+ 3
+ 3
+
+
+ 1
+ -47.9400826
+ -21.93164
+ 0
+ -0.04209958
+ 0.467844343
+ 0
+ 3
+ 3
+ Slimy
+
+
+
+
+
+
+
+
+
diff --git a/Defs/AnimationDefs/Animations_Vanilla2.xml b/Defs/AnimationDefs/Animations_Vanilla2.xml
new file mode 100644
index 0000000..fcab1a9
--- /dev/null
+++ b/Defs/AnimationDefs/Animations_Vanilla2.xml
@@ -0,0 +1,377 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Defs/AnimationDefs/TemplateAnimation.xml b/Defs/AnimationDefs/TemplateAnimation.xml
new file mode 100644
index 0000000..0305903
--- /dev/null
+++ b/Defs/AnimationDefs/TemplateAnimation.xml
@@ -0,0 +1,54 @@
+
+
+
+
diff --git a/Defs/SoundDefs/Sounds_Sex.xml b/Defs/SoundDefs/Sounds_Sex.xml
index 574e2a1..7d3500c 100644
--- a/Defs/SoundDefs/Sounds_Sex.xml
+++ b/Defs/SoundDefs/Sounds_Sex.xml
@@ -188,8 +188,8 @@
- 15
- 25
+ 45
+ 75
1.4
@@ -197,7 +197,7 @@
0
- 25
+ 100
NeverTwice
false
diff --git a/Rimworld-Animations.csproj b/Rimworld-Animations.csproj
index f6cf1ee..3ef1546 100644
--- a/Rimworld-Animations.csproj
+++ b/Rimworld-Animations.csproj
@@ -110,6 +110,7 @@
+
diff --git a/Source/Actors/Actor.cs b/Source/Actors/Actor.cs
index 450c3d9..55e4f79 100644
--- a/Source/Actors/Actor.cs
+++ b/Source/Actors/Actor.cs
@@ -17,6 +17,7 @@ namespace Rimworld_Animations {
public bool isFucking = false;
public bool isFucked = false;
public bool controlGenitalAngle = false;
+ public List bodyDefTypes = new List();
public BodyTypeOffset bodyTypeOffset = new BodyTypeOffset();
public Vector3 offset = new Vector2(0, 0);
diff --git a/Source/AnimationUtility.cs b/Source/AnimationUtility.cs
index ef3bc6b..3022b65 100644
--- a/Source/AnimationUtility.cs
+++ b/Source/AnimationUtility.cs
@@ -14,28 +14,36 @@ namespace Rimworld_Animations {
Note: always make the list in this order:
Female pawns, animal female pawns, male pawns, animal male pawns
*/
- public static AnimationDef tryFindAnimation(ref List participants, rjw.xxx.rjwSextype sexType = 0) {
+ public static AnimationDef tryFindAnimation(ref List participants, rjw.xxx.rjwSextype sexType = 0, rjw.SexProps sexProps = null) {
//aggressors last
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();
- if(rjw.RJWPreferenceSettings.Malesex == rjw.RJWPreferenceSettings.AllowedSex.Nohomo) {
- participants = participants.OrderBy(x => rjw.xxx.is_male(x)).ToList();
- }
List localParticipants = new List(participants);
IEnumerable options = DefDatabase.AllDefs.Where((AnimationDef x) => {
+
if (x.actors.Count != localParticipants.Count) {
return false;
}
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) {
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;
}
- } else {
+ }
+ else if (!x.actors[i].bodyDefTypes.Contains(localParticipants[i].RaceProps.body)) {
if (!x.actors[i].defNames.Contains(localParticipants[i].def.defName)) {
@@ -66,22 +75,103 @@ namespace Rimworld_Animations {
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
/*
- if (x.defName != "Doggystyle")
+ if (x.defName != "Cunnilingus")
return false;
*/
-
+
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");
@@ -102,7 +192,15 @@ namespace Rimworld_Animations {
//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;
}
}
@@ -114,7 +212,15 @@ namespace Rimworld_Animations {
//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;
}
}
diff --git a/Source/Comps/CompBodyAnimator.cs b/Source/Comps/CompBodyAnimator.cs
index fb84d77..33bd110 100644
--- a/Source/Comps/CompBodyAnimator.cs
+++ b/Source/Comps/CompBodyAnimator.cs
@@ -38,13 +38,15 @@ namespace Rimworld_Animations {
private bool mirror = false, quiver = false, shiver = false;
private int actor;
+ private int lastDrawFrame = -1;
+
private int animTicks = 0, stageTicks = 0, clipTicks = 0;
private int curStage = 0;
private float clipPercent = 0;
- public Vector3 anchor, deltaPos, headBob;
- public float bodyAngle, headAngle, genitalAngle;
- public Rot4 headFacing, bodyFacing;
+ public Vector3 anchor = Vector3.zero, deltaPos = Vector3.zero, headBob = Vector3.zero;
+ public float bodyAngle = 0, headAngle = 0, genitalAngle = 0;
+ public Rot4 headFacing = Rot4.North, bodyFacing = Rot4.North;
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) {
- isAnimating = true;
-
AlienRaceOffset raceOffset = anim?.actors[actor]?.raceOffsets?.Find(x => x.defName == pawn.def.defName);
if (raceOffset != null) {
@@ -151,9 +151,12 @@ namespace Rimworld_Animations {
controlGenitalAngle = anim.actors[actor].controlGenitalAngle;
+ isAnimating = true;
//tick once for initialization
tickAnim();
+
+
}
public override void CompTick() {
@@ -259,6 +262,10 @@ namespace Rimworld_Animations {
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));
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));
+ lastDrawFrame = RealTime.frameCount;
+
}
public Vector3 getPawnHeadPosition() {
diff --git a/Source/Patches/HarmonyPatch_AlienRace.cs b/Source/Patches/HarmonyPatch_AlienRace.cs
index 8399413..d5f2d37 100644
--- a/Source/Patches/HarmonyPatch_AlienRace.cs
+++ b/Source/Patches/HarmonyPatch_AlienRace.cs
@@ -79,9 +79,9 @@ namespace Rimworld_Animations {
Vector2 bodyOffset = (portrait ? offset?.portraitBodyTypes ?? offset?.bodyTypes : offset?.bodyTypes)?.FirstOrDefault(predicate: to => to.bodyType == pawn.story.bodyType)
- ?.offset ?? Vector2.zero;
- Vector2 crownOffset = (portrait ? offset?.portraitCrownTypes ?? offset?.crownTypes : offset?.crownTypes)?.FirstOrDefault(predicate: to => to.crownType == alienComp.crownType)
- ?.offset ?? Vector2.zero;
+ ?.offset ?? Vector2.zero;
+ Vector2 crownOffset = (portrait ? offset?.portraitCrownTypes ?? offset?.crownTypes : offset?.crownTypes)?.FirstOrDefault(predicate: to => to.crownType == alienComp.crownType)
+ ?.offset ?? Vector2.zero;
//Defaults for tails
//south 0.42f, -0.3f, -0.22f
@@ -130,7 +130,7 @@ namespace Rimworld_Animations {
else {
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);
}
diff --git a/Source/Patches/rjwPatches/HarmonyPatch_JobDriver_SexBaseInitiator.cs b/Source/Patches/rjwPatches/HarmonyPatch_JobDriver_SexBaseInitiator.cs
index b297ff8..916855b 100644
--- a/Source/Patches/rjwPatches/HarmonyPatch_JobDriver_SexBaseInitiator.cs
+++ b/Source/Patches/rjwPatches/HarmonyPatch_JobDriver_SexBaseInitiator.cs
@@ -23,8 +23,7 @@ namespace Rimworld_Animations {
}
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.");
- return;
+ Log.Warning("Playing regular RJW joininbed jobdriver, if it animates properly ignore this warning");
}
Pawn pawn = __instance.pawn;
@@ -55,15 +54,15 @@ namespace Rimworld_Animations {
bool quickie = (__instance is JobDriver_SexQuick) && AnimationSettings.fastAnimForQuickie;
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 {
- 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)) {
Log.Message("Error: Tried to reroll animations when pawn isn't sexing");
@@ -76,7 +75,7 @@ namespace Rimworld_Animations {
pawnsToAnimate = pawnsToAnimate.Append(pawn).ToList();
}
- AnimationDef anim = AnimationUtility.tryFindAnimation(ref pawnsToAnimate, sexType);
+ AnimationDef anim = AnimationUtility.tryFindAnimation(ref pawnsToAnimate, sexType, sexProps);
if (anim != null) {
diff --git a/Source/Patches/rjwPatches/HarmonyPatch_SexTick.cs b/Source/Patches/rjwPatches/HarmonyPatch_SexTick.cs
index 5fd7486..c645d18 100644
--- a/Source/Patches/rjwPatches/HarmonyPatch_SexTick.cs
+++ b/Source/Patches/rjwPatches/HarmonyPatch_SexTick.cs
@@ -25,9 +25,11 @@ namespace Rimworld_Animations {
if (pawn.IsHashIntervalTick(__instance.ticks_between_thrusts)) {
- __instance.Animate(pawn, (Thing)pawn2);
+ __instance.ChangePsyfocus(pawn, pawn2);
- if (!AnimationSettings.soundOverride || !pawn.TryGetComp().isAnimating) {
+ __instance.Animate(pawn, pawn2);
+
+ if (!AnimationSettings.soundOverride || pawn.TryGetComp() == null || !pawn.TryGetComp().isAnimating) {
__instance.PlaySexSound();
}